From f16a7ff0b0be6f71e1bea401b29b17fe2d1b4e68 Mon Sep 17 00:00:00 2001 From: Seravy Date: Sun, 18 Feb 2018 15:32:14 +0100 Subject: [PATCH 001/901] incomplete --- .../src/main/java/forge/ai/AiController.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 65a73a93cda..464a05b9bed 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -703,6 +703,36 @@ public class AiController { if ("True".equals(card.getSVar("NonStackingEffect")) && isNonDisabledCardInPlay(card.getName())) { return AiPlayDecision.NeedsToPlayCriteriaNotMet; } + // Trying to play a card that has Buyback without a Buyback cost + if (card.hasKeyword("Buyback")) { // This line does not work? + if (!sa.isBuyBackAbility()) { + boolean wastebuybackallowed = false; + // About to lose game : allow + if (ComputerUtil.aiLifeInDanger(player, true, 0)) { + wastebuybackallowed = true; + } + int copies = 0; + // Have two copies : allow + for (Card hand : player.getCardsIn(ZoneType.Hand)) { + if (hand.getName().equals(card.getName())) { + copies++; + } + } + if (copies >= 2) { + wastebuybackallowed = true; + } + // Won't be able to afford buyback any time soon + /* if ( ComputerUtilMana.getAvailableManaEstimate(player) >= + sa. + + + ) { wastebuybackallowed = true; } */ + + // If Buyback cost includes sacrifice, life, discard + + if (!wastebuybackallowed) return AiPlayDecision.NeedsToPlayCriteriaNotMet; + } + } // add any other necessary logic to play a basic spell here return ComputerUtilCard.checkNeedsToPlayReqs(card, sa); } From 537259989f659d292b484097583c09fd5bdb2fd0 Mon Sep 17 00:00:00 2001 From: Seravy Date: Sun, 18 Feb 2018 16:47:29 +0100 Subject: [PATCH 002/901] AI will avoid wasting a BUYBACK card without paying the buyback cost when able --- .../src/main/java/forge/ai/AiController.java | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 464a05b9bed..7e9c6d31502 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -704,7 +704,9 @@ public class AiController { return AiPlayDecision.NeedsToPlayCriteriaNotMet; } // Trying to play a card that has Buyback without a Buyback cost - if (card.hasKeyword("Buyback")) { // This line does not work? + + if (card.hasStartOfKeyword("Buyback")) { + //if (card.getBuybackAbility()!=null) { if (!sa.isBuyBackAbility()) { boolean wastebuybackallowed = false; // About to lose game : allow @@ -722,13 +724,23 @@ public class AiController { wastebuybackallowed = true; } // Won't be able to afford buyback any time soon - /* if ( ComputerUtilMana.getAvailableManaEstimate(player) >= - sa. - - - ) { wastebuybackallowed = true; } */ - // If Buyback cost includes sacrifice, life, discard + int neededMana = 0; + for (SpellAbility sa2 : GameActionUtil.getOptionalCosts(sa)) { + if (sa2.isOptionalCostPaid(OptionalCost.Buyback)) { + neededMana = sa2.getPayCosts().getCostMana().getMana().getCMC(); + if (sa2.getPayCosts().hasSpecificCostType(CostPayLife.class) + || (sa2.getPayCosts().hasSpecificCostType(CostDiscard.class)) || + (sa2.getPayCosts().hasSpecificCostType(CostSacrifice.class)) + ) { + neededMana = 999; + } + } + } + int hasmana = ComputerUtilMana.getAvailableManaEstimate(player, false); + if (hasmana < neededMana - 1) { + wastebuybackallowed = true; + } if (!wastebuybackallowed) return AiPlayDecision.NeedsToPlayCriteriaNotMet; } From cbc0335d901972ac6e099536b363e3113dd60936 Mon Sep 17 00:00:00 2001 From: Seravy Date: Sun, 18 Feb 2018 18:43:23 +0100 Subject: [PATCH 003/901] Trying to get effective cost instead of original cost but doesn't seem to recognize Memory Crystal anyway. I guess it's not that important. --- forge-ai/src/main/java/forge/ai/AiController.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 7e9c6d31502..836bc320731 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -728,10 +728,12 @@ public class AiController { int neededMana = 0; for (SpellAbility sa2 : GameActionUtil.getOptionalCosts(sa)) { if (sa2.isOptionalCostPaid(OptionalCost.Buyback)) { - neededMana = sa2.getPayCosts().getCostMana().getMana().getCMC(); - if (sa2.getPayCosts().hasSpecificCostType(CostPayLife.class) - || (sa2.getPayCosts().hasSpecificCostType(CostDiscard.class)) || - (sa2.getPayCosts().hasSpecificCostType(CostSacrifice.class)) + Cost sac = sa2.getPayCosts(); + CostAdjustment.adjust(sac, sa2); // Does not recognize Memory Crystal anyway??? + neededMana = sac.getCostMana().getMana().getCMC(); + if (sac.hasSpecificCostType(CostPayLife.class) + || (sac.hasSpecificCostType(CostDiscard.class)) || + (sac.hasSpecificCostType(CostSacrifice.class)) ) { neededMana = 999; } From e3b4c59b9f7f51307a63c6064a40f8882c708dfb Mon Sep 17 00:00:00 2001 From: Seravy Date: Mon, 19 Feb 2018 12:50:15 +0000 Subject: [PATCH 004/901] Update AiController.java --- forge-ai/src/main/java/forge/ai/AiController.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 836bc320731..3e86c849cfb 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -733,8 +733,7 @@ public class AiController { neededMana = sac.getCostMana().getMana().getCMC(); if (sac.hasSpecificCostType(CostPayLife.class) || (sac.hasSpecificCostType(CostDiscard.class)) || - (sac.hasSpecificCostType(CostSacrifice.class)) - ) { + (sac.hasSpecificCostType(CostSacrifice.class))) { neededMana = 999; } } From d2b4519f496992815d319f894184710caa142847 Mon Sep 17 00:00:00 2001 From: Seravy Date: Mon, 19 Feb 2018 16:03:13 +0100 Subject: [PATCH 005/901] Create the world --- .../world/Tempest/challenges/Anarchy.dck | 25 ++++++++++++++ .../world/Tempest/challenges/Avenger.dck | 24 ++++++++++++++ .../world/Tempest/challenges/Capsize.dck | 21 ++++++++++++ .../quest/world/Tempest/challenges/Dragon.dck | 21 ++++++++++++ .../quest/world/Tempest/challenges/Equi.dck | 32 ++++++++++++++++++ .../world/Tempest/challenges/Humility.dck | 23 +++++++++++++ .../world/Tempest/challenges/Limited.dck | 21 ++++++++++++ .../quest/world/Tempest/challenges/Pit.dck | 25 ++++++++++++++ .../quest/world/Tempest/challenges/Portal.dck | 23 +++++++++++++ .../quest/world/Tempest/challenges/Power.dck | 31 +++++++++++++++++ .../quest/world/Tempest/challenges/Sliver.dck | 32 ++++++++++++++++++ .../world/Tempest/challenges/Traitors.dck | 21 ++++++++++++ .../quest/world/Tempest/duels/Awakening3.dck | 29 ++++++++++++++++ .../world/Tempest/duels/BottomlessPit2.dck | 25 ++++++++++++++ .../world/Tempest/duels/BottomlessPit3.dck | 26 +++++++++++++++ .../res/quest/world/Tempest/duels/Burn2.dck | 25 ++++++++++++++ .../res/quest/world/Tempest/duels/Burn4.dck | 24 ++++++++++++++ .../world/Tempest/duels/CalderaLake3.dck | 29 ++++++++++++++++ .../world/Tempest/duels/CloudSpirit2.dck | 25 ++++++++++++++ .../world/Tempest/duels/CrystalMedallion.dck | 28 ++++++++++++++++ .../quest/world/Tempest/duels/DarkDruids.dck | 30 +++++++++++++++++ .../res/quest/world/Tempest/duels/Dauthi2.dck | 27 +++++++++++++++ .../res/quest/world/Tempest/duels/Dauthi4.dck | 27 +++++++++++++++ .../quest/world/Tempest/duels/DreamOath3.dck | 30 +++++++++++++++++ .../quest/world/Tempest/duels/DruidRevolt.dck | 28 ++++++++++++++++ .../res/quest/world/Tempest/duels/EnKor2.dck | 25 ++++++++++++++ .../res/quest/world/Tempest/duels/Ertai2.dck | 24 ++++++++++++++ .../quest/world/Tempest/duels/Furnace4.dck | 26 +++++++++++++++ .../quest/world/Tempest/duels/GravePact2.dck | 29 ++++++++++++++++ .../world/Tempest/duels/HumbleKnights.dck | 23 +++++++++++++ .../res/quest/world/Tempest/duels/Mists4.dck | 28 ++++++++++++++++ .../res/quest/world/Tempest/duels/Nature.dck | 27 +++++++++++++++ .../res/quest/world/Tempest/duels/Nature2.dck | 26 +++++++++++++++ .../quest/world/Tempest/duels/Pandemonium.dck | 28 ++++++++++++++++ .../quest/world/Tempest/duels/Pursuit2.dck | 33 +++++++++++++++++++ .../res/quest/world/Tempest/duels/Rage.dck | 23 +++++++++++++ .../res/quest/world/Tempest/duels/Rage2.dck | 26 +++++++++++++++ .../quest/world/Tempest/duels/Seismic2.dck | 27 +++++++++++++++ .../res/quest/world/Tempest/duels/Selenia.dck | 29 ++++++++++++++++ .../quest/world/Tempest/duels/Selenia3.dck | 31 +++++++++++++++++ .../quest/world/Tempest/duels/SkySpirit.dck | 30 +++++++++++++++++ .../quest/world/Tempest/duels/Slivers2.dck | 33 +++++++++++++++++++ .../quest/world/Tempest/duels/Soltari2.dck | 25 ++++++++++++++ .../quest/world/Tempest/duels/Soltari3.dck | 23 +++++++++++++ .../res/quest/world/Tempest/duels/Spikes.dck | 24 ++++++++++++++ .../res/quest/world/Tempest/duels/Stompy2.dck | 25 ++++++++++++++ .../world/Tempest/duels/SurvivingForce3.dck | 29 ++++++++++++++++ .../quest/world/Tempest/duels/TimeLoop.dck | 28 ++++++++++++++++ .../world/Tempest/duels/TradewindRider3.dck | 25 ++++++++++++++ .../Tempest/duels/Unplayable/Dracoplasm.dck | 23 +++++++++++++ .../Tempest/duels/Unplayable/StaticOrb.dck | 17 ++++++++++ .../Tempest/duels/Unplayable/Vineyard.dck | 24 ++++++++++++++ .../quest/world/Tempest/duels/Volrath3.dck | 26 +++++++++++++++ .../world/Tempest/duels/WallofTears2.dck | 24 ++++++++++++++ .../world/Tempest/duels/WallofTears3.dck | 23 +++++++++++++ .../world/Tempest/duels/WhiteWeenie4.dck | 26 +++++++++++++++ forge-gui/res/quest/world/worlds.txt | 3 +- 57 files changed, 1464 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/quest/world/Tempest/challenges/Anarchy.dck create mode 100644 forge-gui/res/quest/world/Tempest/challenges/Avenger.dck create mode 100644 forge-gui/res/quest/world/Tempest/challenges/Capsize.dck create mode 100644 forge-gui/res/quest/world/Tempest/challenges/Dragon.dck create mode 100644 forge-gui/res/quest/world/Tempest/challenges/Equi.dck create mode 100644 forge-gui/res/quest/world/Tempest/challenges/Humility.dck create mode 100644 forge-gui/res/quest/world/Tempest/challenges/Limited.dck create mode 100644 forge-gui/res/quest/world/Tempest/challenges/Pit.dck create mode 100644 forge-gui/res/quest/world/Tempest/challenges/Portal.dck create mode 100644 forge-gui/res/quest/world/Tempest/challenges/Power.dck create mode 100644 forge-gui/res/quest/world/Tempest/challenges/Sliver.dck create mode 100644 forge-gui/res/quest/world/Tempest/challenges/Traitors.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/Awakening3.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/BottomlessPit2.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/BottomlessPit3.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/Burn2.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/Burn4.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/CalderaLake3.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/CloudSpirit2.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/CrystalMedallion.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/DarkDruids.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/Dauthi2.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/Dauthi4.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/DreamOath3.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/DruidRevolt.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/EnKor2.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/Ertai2.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/Furnace4.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/GravePact2.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/HumbleKnights.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/Mists4.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/Nature.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/Nature2.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/Pandemonium.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/Pursuit2.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/Rage.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/Rage2.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/Seismic2.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/Selenia.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/Selenia3.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/SkySpirit.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/Slivers2.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/Soltari2.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/Soltari3.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/Spikes.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/Stompy2.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/SurvivingForce3.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/TimeLoop.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/TradewindRider3.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/Unplayable/Dracoplasm.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/Unplayable/StaticOrb.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/Unplayable/Vineyard.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/Volrath3.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/WallofTears2.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/WallofTears3.dck create mode 100644 forge-gui/res/quest/world/Tempest/duels/WhiteWeenie4.dck diff --git a/forge-gui/res/quest/world/Tempest/challenges/Anarchy.dck b/forge-gui/res/quest/world/Tempest/challenges/Anarchy.dck new file mode 100644 index 00000000000..8725bc2f8a7 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/challenges/Anarchy.dck @@ -0,0 +1,25 @@ +[quest] +id=TempestQuest1 +OpponentName=Anarchist +AILife=50 +Repeat=true +Wins=10 +Card Reward=booster pack EXO +Credit Reward=200 +Ticket Reward=true +AIExtras=Mountain|Mountain|Mountain|Erratic Portal +HumanExtras= +[metadata] +Title=Anarchy! +Icon=Dungeon Crawling Red.jpg +Difficulty=hard +Description=Some people never want peace! +Deck Type=constructed +Name=Anarchy +[Main] +5 Aftershock|TMP +18 Anarchist|EXO +6 Erratic Portal|EXO +4 Flame Wave|STH +5 Rolling Thunder|TMP +22 Mountain|TMP \ No newline at end of file diff --git a/forge-gui/res/quest/world/Tempest/challenges/Avenger.dck b/forge-gui/res/quest/world/Tempest/challenges/Avenger.dck new file mode 100644 index 00000000000..2bd6fcc7d5c --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/challenges/Avenger.dck @@ -0,0 +1,24 @@ +[quest] +id=TempestQuest2 +OpponentName=Mad Hatter +AILife=50000 +Repeat=true +Wins=20 +Card Reward=booster pack TMP;chosen card rarity:R sets:TMP,STH,EXO +Credit Reward=500 +Ticket Reward=true +AIExtras=Swamp|Swamp|Swamp|Jet Medallion +HumanExtras=Avenging Angel|Plains|Plains|Pearl Medallion|Pearl Medallion|Pearl Medallion|Altar of Dementia +[metadata] +Title=Avenger +Icon=Dungeon Crawling Black.jpg +Difficulty=hard +Description=This evil being unleashed vicious rabbit monsters to destroy your favorite grasslands. You must return the favor! +Deck Type=constructed +Name=Avenger +[Main] +5 Dark Banishing|TMP +5 Death Stroke|STH +5 Diabolic Edict|TMP +25 Kezzerdrix|TMP +20 Swamp|TMP diff --git a/forge-gui/res/quest/world/Tempest/challenges/Capsize.dck b/forge-gui/res/quest/world/Tempest/challenges/Capsize.dck new file mode 100644 index 00000000000..84bc7073457 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/challenges/Capsize.dck @@ -0,0 +1,21 @@ +[quest] +id=TempestQuest7 +OpponentName=Capsize +AILife=20 +Repeat=true +Wins=10 +Card Reward=3 blue rares +Credit Reward=500 +AIExtras=Island|Island|Island|Island|Island|Island +HumanExtras= +[metadata] +Title=Capsized! +Icon=Dungeon Crawling Blue.jpg +Difficulty=medium +Description=Things just don't want to exist around here somehow... +Deck Type=constructed +Name=Capsize +[Main] +30 Capsize +22 Island +8 Fighting Drake \ No newline at end of file diff --git a/forge-gui/res/quest/world/Tempest/challenges/Dragon.dck b/forge-gui/res/quest/world/Tempest/challenges/Dragon.dck new file mode 100644 index 00000000000..c7271789ee3 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/challenges/Dragon.dck @@ -0,0 +1,21 @@ +[quest] +id=TempestQuest3 +OpponentName=Eldred Rathi Dragon +AILife=30 +Repeat=true +Wins=0 +Card Reward=tournament pack TMP +Ticket Reward=true +Credit Reward=200 +AIExtras=Mountain|Mountain|Mountain|Mountain|Mountain|Mountain +HumanExtras= +[metadata] +Title=Dragon Mountain +Icon=Dungeon Crawling Red.jpg +Difficulty=hard +Description=Dragons have been sighted here! +Deck Type=constructed +Name=Dragon +[Main] +40 Rathi Dragon|TMP +20 Mountain|TMP \ No newline at end of file diff --git a/forge-gui/res/quest/world/Tempest/challenges/Equi.dck b/forge-gui/res/quest/world/Tempest/challenges/Equi.dck new file mode 100644 index 00000000000..c018b35ba78 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/challenges/Equi.dck @@ -0,0 +1,32 @@ +[quest] +id=TempestQuest9 +OpponentName=Nature +AILife=20 +Repeat=true +Wins=0 +Card Reward=3 green rares;booster pack TMP +Credit Reward=500 +AIExtras=Forest|Forest|Forest|Forest +HumanExtras=Forest|Forest|Equilibrium +[metadata] +Title=Natural Equilibrium +Icon=Dungeon Crawling Green.jpg +Difficulty=medium +Description=Unnaturally excessive growth seems to happen around here, can you preserve the natural equilibrium of this world? +Deck Type=constructed +Name=Equi +[Main] +4 Apes of Rath|TMP +2 Carnassid|STH +4 Endangered Armodon|STH +4 Forest|TMP|1 +4 Forest|TMP|2 +12 Forest|TMP|3 +3 Forest|TMP|4 +2 Heartwood Treefolk|TMP +4 Primal Rage|STH +3 Rootbreaker Wurm|TMP +4 Skyshroud Troopers|STH +4 Spined Wurm|STH +8 Verdant Force|TMP +2 Overrun|TMP diff --git a/forge-gui/res/quest/world/Tempest/challenges/Humility.dck b/forge-gui/res/quest/world/Tempest/challenges/Humility.dck new file mode 100644 index 00000000000..8317c251934 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/challenges/Humility.dck @@ -0,0 +1,23 @@ +[quest] +id=TempestQuest10 +OpponentName=God of Thunder +AILife=60 +HumanLife=10 +Repeat=true +Wins=40 +Card Reward=3 red rares;booster pack STH +Credit Reward=700 +Ticket Reward=true +AIExtras=Humility +HumanExtras= +[metadata] +Title=God of Thunder +Icon=Dungeon Crawling Red.jpg +Difficulty=hard +Description=You are in front of the God of Thunder, show some respect! +Deck Type=constructed +Name=Humility +[Main] +25 Mountain +30 Lightning Blast +5 Lightning Elemental \ No newline at end of file diff --git a/forge-gui/res/quest/world/Tempest/challenges/Limited.dck b/forge-gui/res/quest/world/Tempest/challenges/Limited.dck new file mode 100644 index 00000000000..046a69d4d5c --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/challenges/Limited.dck @@ -0,0 +1,21 @@ +[quest] +id=TempestQuest11 +OpponentName=Evil Overlord +AILife=20 +Repeat=true +Wins=20 +Card Reward=duplicate card +Credit Reward=200 +AIExtras=Limited Resources|Plains|Plains|Plains|Swamp|Swamp|Swamp|Swamp +HumanExtras= +[metadata] +Title=Mine, Mine, Mine! +Icon=Dungeon Crawling White.jpg +Difficulty=Medium +Description=This guys seems to be too obsessed with controlling mana sources! +Deck Type=constructed +Name=Limited +[Main] +20 Manakin|TMP +20 Plains|TMP +20 Swamp|TMP diff --git a/forge-gui/res/quest/world/Tempest/challenges/Pit.dck b/forge-gui/res/quest/world/Tempest/challenges/Pit.dck new file mode 100644 index 00000000000..d2e1a68a33c --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/challenges/Pit.dck @@ -0,0 +1,25 @@ +[quest] +id=TempestQuest6 +OpponentName=Spirit of the Pit +AILife=400 +Repeat=true +Wins=60 +Card Reward=duplicate card;booster pack TMP;booster pack STH;booster pack EXO +Credit Reward=7777 +Ticket Reward=true +AIExtras=Bottomless Pit|Bottomless Pit|Bottomless Pit|Bottomless Pit|Bottomless Pit|Bottomless Pit|Bottomless Pit +HumanExtras= +[metadata] +Title=The Ancient Pit of Cursed Snake Tombs +Icon=Dungeon Crawling Colorless.jpg +Difficulty=very hard +Description=A regular snake pit would be bad enough... +Deck Type=constructed +Name=Pit +[Main] +25 Ancient Tomb|TMP +2 Coat of Arms|EXO +18 Coiled Tinviper|TMP +5 Cursed Scroll|TMP +4 Manakin|TMP +6 Sphere of Resistance|EXO diff --git a/forge-gui/res/quest/world/Tempest/challenges/Portal.dck b/forge-gui/res/quest/world/Tempest/challenges/Portal.dck new file mode 100644 index 00000000000..09cfae5e5ec --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/challenges/Portal.dck @@ -0,0 +1,23 @@ +[quest] +id=TempestQuest12 +OpponentName=Gatekeeper +AILife=20 +Repeat=true +Wins=0 +Card Reward=chosen card rarity:U sets:TMP,STH,EXO +Credit Reward=700 +Ticket Reward=true +AIExtras=Portcullis|Stronghold Taskmaster|Wall of Souls +HumanExtras= +[metadata] +Title=The Gatekeeper +Icon=Dungeon Crawling Black.jpg +Difficulty=medium +Description=Getting into this stronghold won't be easy! +Deck Type=constructed +Name=Portal +[Main] +26 Mountain|TMP +14 Rolling Thunder|TMP +5 Fanning The Flames|STH +5 Sudden Impact|TMP diff --git a/forge-gui/res/quest/world/Tempest/challenges/Power.dck b/forge-gui/res/quest/world/Tempest/challenges/Power.dck new file mode 100644 index 00000000000..2d2a896450e --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/challenges/Power.dck @@ -0,0 +1,31 @@ +[quest] +id=TempestQuest4 +OpponentName=God of Dreams +AILife=250 +Repeat=true +Wins=40 +Card Reward=duplicate card +Credit Reward=500 +Ticket Reward=true +AIExtras=Dream Halls +HumanExtras= +[metadata] +Title=Dreams of Infinite Power +Icon=Dungeon Crawling Blue.jpg +Difficulty=very hard +Description=When dreams come true too easily, it can become a problem! +Deck Type=constructed +Name=Power +[Main] +4 Benthic Behemoth|TMP +2 Flame Wave|STH +2 Living Death|TMP +3 Overrun|TMP +6 Rootbreaker Wurm|TMP +2 Selenia, Dark Angel|TMP +14 Sliver Queen|STH +6 Spike Hatcher|EXO +6 Time Warp|TMP +6 Verdant Force|TMP +6 Warrior Angel|STH +3 Lobotomy|TMP \ No newline at end of file diff --git a/forge-gui/res/quest/world/Tempest/challenges/Sliver.dck b/forge-gui/res/quest/world/Tempest/challenges/Sliver.dck new file mode 100644 index 00000000000..313b25f6955 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/challenges/Sliver.dck @@ -0,0 +1,32 @@ +[quest] +id=TempestQuest5 +OpponentName=Sliver Queen +AILife=20 +Repeat=true +Wins=0 +Card Reward=3 rares +Credit Reward=500 +AIExtras=Mountain|Island|Swamp|Forest|Plains +HumanExtras=Mountain|Island|Swamp|Forest|Plains +[metadata] +Title=Dragon Mountain +Icon=Dungeon Crawling Gold.jpg +Difficulty=medium +Description=The abundant sources of mana are causing a Sliver outbreak! +Deck Type=constructed +Name=Sliver +[Main] +2 Acidic Sliver|STH +3 Clot Sliver|TMP +4 Crystalline Sliver|STH +2 Heart Sliver|TMP +4 Heartstone|STH +2 Hibernation Sliver|STH +3 Horned Sliver|TMP +4 Muscle Sliver|TMP +24 Reflecting Pool|TMP +4 Sliver Queen|STH +2 Spined Sliver|STH +2 Talon Sliver|TMP +2 Victual Sliver|STH +2 Winged Sliver|TMP diff --git a/forge-gui/res/quest/world/Tempest/challenges/Traitors.dck b/forge-gui/res/quest/world/Tempest/challenges/Traitors.dck new file mode 100644 index 00000000000..ebde4814959 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/challenges/Traitors.dck @@ -0,0 +1,21 @@ +[quest] +id=TempestQuest8 +OpponentName=Crovax +AILife=20 +Repeat=true +Wins=0 +Card Reward=2 black rares +Credit Reward=300 +AIExtras=Swamp|Swamp|Swamp +HumanExtras=City of Traitors|City of Traitors +[metadata] +Title=Traitors! +Icon=Dungeon Crawling Black.jpg +Difficulty=medium +Description=There have been some traitors among your enemies, but the Grollubs are after them. You decide to help them out! +Deck Type=constructed +Name=Traitors +[Main] +38 Grollub|EXO +20 Swamp +2 Crovax the Cursed|STH diff --git a/forge-gui/res/quest/world/Tempest/duels/Awakening3.dck b/forge-gui/res/quest/world/Tempest/duels/Awakening3.dck new file mode 100644 index 00000000000..668b089dfed --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/Awakening3.dck @@ -0,0 +1,29 @@ +[duel] +[metadata] +Title=Awakening +Icon=Dungeon Crawling Blue.jpg +Difficulty=hard +Description=Blue - Green control +Deck Type=constructed +Name=Awakening3 +[Main] +4 Awakening|STH +4 Cloud Spirit|STH +2 Counterspell|TMP +3 Ertai, Wizard Adept|EXO +2 Forest|TMP|2 +2 Forest|TMP|3 +3 Forest|TMP|4 +3 Helm of Possession|TMP +2 Island|TMP|1 +2 Island|TMP|2 +1 Island|TMP|3 +3 Island|TMP|4 +4 Legacy's Allure|TMP +4 Mana Leak|STH +4 Reflecting Pool|TMP +3 Skyshroud Forest|TMP +2 Spike Weaver|EXO +4 Tradewind Rider|TMP +4 Wall of Blossoms|STH +4 Wall of Tears|STH diff --git a/forge-gui/res/quest/world/Tempest/duels/BottomlessPit2.dck b/forge-gui/res/quest/world/Tempest/duels/BottomlessPit2.dck new file mode 100644 index 00000000000..6a972c62cf8 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/BottomlessPit2.dck @@ -0,0 +1,25 @@ +[duel] +[metadata] +Title=Bottomless Pit +Icon=Dungeon Crawling Black.jpg +Difficulty=medium +Description=A deck built around having no cards in hand. +Deck Type=constructed +Name=BottomlessPit2 +[Main] +4 Bottomless Pit|STH +2 Bounty Hunter|TMP +2 Coffin Queen|TMP +4 Cursed Scroll|TMP +4 Dark Ritual|TMP +2 Dauthi Mindripper|TMP +2 Dungeon Shade|STH +4 Ensnaring Bridge|STH +4 Megrim|STH +4 Null Brooch|EXO +4 Scalding Tongs|TMP +6 Swamp|TMP|1 +3 Swamp|TMP|2 +4 Swamp|TMP|3 +7 Swamp|TMP|4 +4 Wasteland|TMP diff --git a/forge-gui/res/quest/world/Tempest/duels/BottomlessPit3.dck b/forge-gui/res/quest/world/Tempest/duels/BottomlessPit3.dck new file mode 100644 index 00000000000..9a4e9495a61 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/BottomlessPit3.dck @@ -0,0 +1,26 @@ +[duel] +[metadata] +Title=Bottomless Pit +Icon=Dungeon Crawling Black.jpg +Difficulty=hard +Description=A deck built around having no cards in hand. +Deck Type=constructed +Name=BottomlessPit3 +[Main] +4 Bottomless Pit|STH +2 Coffin Queen|TMP +4 Cursed Scroll|TMP +4 Dark Ritual|TMP +4 Ensnaring Bridge|STH +1 Lotus Petal|TMP +2 Manakin|TMP +1 Mox Diamond|STH +4 Null Brooch|EXO +2 Pit Imp|TMP +4 Scalding Tongs|TMP +6 Swamp|TMP|1 +1 Swamp|TMP|2 +4 Swamp|TMP|3 +9 Swamp|TMP|4 +4 Wall of Souls|STH +4 Wasteland|TMP diff --git a/forge-gui/res/quest/world/Tempest/duels/Burn2.dck b/forge-gui/res/quest/world/Tempest/duels/Burn2.dck new file mode 100644 index 00000000000..576c330ab50 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/Burn2.dck @@ -0,0 +1,25 @@ +[duel] +[metadata] +Title=Price of Progress +Icon=Dungeon Crawling Red.jpg +Difficulty=medium +Description=Red burn deck +Deck Type=constructed +Name=Burn2 +[Main] +2 Cursed Scroll|TMP +4 Ensnaring Bridge|STH +4 Fanning the Flames|STH +4 Fireslinger|TMP +4 Kindle|TMP +4 Lightning Blast|TMP +4 Mogg Fanatic|TMP +2 Mountain|TMP|1 +7 Mountain|TMP|2 +4 Mountain|TMP|3 +4 Mountain|TMP|4 +4 Price of Progress|EXO +4 Rolling Thunder|TMP +1 Seismic Assault|EXO +4 Sudden Impact|TMP +4 Wasteland|TMP diff --git a/forge-gui/res/quest/world/Tempest/duels/Burn4.dck b/forge-gui/res/quest/world/Tempest/duels/Burn4.dck new file mode 100644 index 00000000000..500775aff90 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/Burn4.dck @@ -0,0 +1,24 @@ +[duel] +[metadata] +Title=Price of Progress +Icon=Dungeon Crawling Red.jpg +Difficulty=very hard +Description=Red burn deck +Deck Type=constructed +Name=Burn4 +[Main] +4 Cursed Scroll|TMP +4 Ensnaring Bridge|STH +2 Shock|STH +4 Fireslinger|TMP +4 Kindle|TMP +4 Lightning Blast|TMP +4 Mogg Fanatic|TMP +4 Mountain|TMP|1 +7 Mountain|TMP|2 +6 Mountain|TMP|3 +5 Mountain|TMP|4 +4 Price of Progress|EXO +4 Rolling Thunder|TMP +4 Sudden Impact|TMP + diff --git a/forge-gui/res/quest/world/Tempest/duels/CalderaLake3.dck b/forge-gui/res/quest/world/Tempest/duels/CalderaLake3.dck new file mode 100644 index 00000000000..4f7697b12d6 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/CalderaLake3.dck @@ -0,0 +1,29 @@ +[duel] +[metadata] +Title=Caldera Lake +Icon=Dungeon Crawling Blue.jpg +Difficulty=hard +Description=Blue - Red Aggro-control. +Deck Type=constructed +Name=CalderaLake3 +[Main] +4 Caldera Lake|TMP +2 Capsize|TMP +4 Cloud Spirit|STH +4 Counterspell|TMP +3 Curiosity|EXO +2 Fanning the Flames|STH +3 Fireslinger|TMP +4 Island|TMP|2 +1 Island|TMP|3 +5 Island|TMP|4 +4 Kindle|TMP +4 Legacy's Allure|TMP +4 Lightning Blast|TMP +4 Mana Leak|STH +3 Mountain|TMP|1 +4 Mountain|TMP|2 +1 Mountain|TMP|3 +2 Mountain|TMP|4 +4 Propaganda|TMP +2 Wayward Soul|EXO diff --git a/forge-gui/res/quest/world/Tempest/duels/CloudSpirit2.dck b/forge-gui/res/quest/world/Tempest/duels/CloudSpirit2.dck new file mode 100644 index 00000000000..26734c438f1 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/CloudSpirit2.dck @@ -0,0 +1,25 @@ +[duel] +[metadata] +Title=Cloud Spirit +Icon=Dungeon Crawling Blue.jpg +Difficulty=medium +Description=Mono blue arrgo +Name=CloudSpirit2 +[Main] +4 Cloud Spirit|STH +3 Counterspell|TMP +3 Curiosity|EXO +4 Cursed Scroll|TMP +2 Equilibrium|EXO +2 Island|TMP|1 +7 Island|TMP|2 +3 Island|TMP|3 +6 Island|TMP|4 +4 Legacy's Allure|TMP +4 Propaganda|TMP +4 Spindrift Drake|STH +2 Thalakos Mistfolk|TMP +4 Thalakos Scout|EXO +2 Wall of Tears|STH +4 Wasteland|TMP +2 Wind Drake|TMP diff --git a/forge-gui/res/quest/world/Tempest/duels/CrystalMedallion.dck b/forge-gui/res/quest/world/Tempest/duels/CrystalMedallion.dck new file mode 100644 index 00000000000..33b3fa6b4bc --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/CrystalMedallion.dck @@ -0,0 +1,28 @@ +[duel] +[metadata] +Title=Mad Jeweler +Icon=Dungeon Crawling Blue.jpg +Difficulty=easy +Description=Blue-Red Buyback deck +Deck Type=constructed +Name=CrystalMedallion +[Main] +4 Capsize|TMP +4 Fanning the Flames|STH +3 Island|TMP|1 +3 Island|TMP|2 +4 Island|TMP|3 +2 Island|TMP|4 +4 Memory Crystal|EXO +3 Mountain|TMP|1 +6 Mountain|TMP|2 +2 Mountain|TMP|3 +4 Reflecting Pool|TMP +2 Ruby Medallion|TMP +2 Sapphire Medallion|TMP +2 Searing Touch|TMP +2 Shattering Pulse|EXO +3 Wall of Diffusion|TMP +2 Wall of Razors|STH +4 Wall of Tears|STH +4 Whispers of the Muse|TMP diff --git a/forge-gui/res/quest/world/Tempest/duels/DarkDruids.dck b/forge-gui/res/quest/world/Tempest/duels/DarkDruids.dck new file mode 100644 index 00000000000..73a0f1a5dee --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/DarkDruids.dck @@ -0,0 +1,30 @@ +[duel] +[metadata] +Title=The Dark Druids +Icon=Dungeon Crawling Black.jpg +Difficulty=easy +Description=Green-Black aggro Oath of Ghouls deck +Deck Type=constructed +Name=DarkDruids +[Main] +4 Avenging Druid|EXO +2 Carrionette|TMP +4 Dauthi Horror|TMP +4 Dauthi Slayer|TMP +3 Elvish Berserker|EXO +3 Forest|TMP|1 +2 Forest|TMP|2 +2 Forest|TMP|3 +5 Forest|TMP|4 +4 Hermit Druid|STH +4 Muscle Sliver|TMP +4 Oath of Ghouls|EXO +2 Overrun|TMP +2 Pit Spawn|EXO +1 Plaguebearer|EXO +2 Skyshroud War Beast|EXO +3 Swamp|TMP|1 +2 Swamp|TMP|2 +3 Swamp|TMP|3 +2 Trained Armodon|TMP +2 Verdant Force|TMP diff --git a/forge-gui/res/quest/world/Tempest/duels/Dauthi2.dck b/forge-gui/res/quest/world/Tempest/duels/Dauthi2.dck new file mode 100644 index 00000000000..d3ef18b59da --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/Dauthi2.dck @@ -0,0 +1,27 @@ +[duel] +[metadata] +Title=Dauthi Warlord +Icon=Dungeon Crawling Black.jpg +Difficulty=medium +Description=Dauthi deck +Deck Type=constructed +Name=Dauthi2 +[Main] +2 Coat of Arms|EXO +3 Death Stroke|STH +2 Extinction|TMP +3 Dark Banishing|TMP +2 Dauthi Cutthroat|EXO +4 Dauthi Horror|TMP +4 Dauthi Marauder|TMP +4 Dauthi Mercenary|TMP +4 Dauthi Slayer|TMP +4 Dauthi Warlord|EXO +2 Diabolic Edict|TMP +1 Swamp|TMP|1 +6 Swamp|TMP|2 +3 Swamp|TMP|3 +7 Swamp|TMP|4 +1 Volrath's Stronghold|STH +4 Wall of Souls|STH +4 Wasteland|TMP diff --git a/forge-gui/res/quest/world/Tempest/duels/Dauthi4.dck b/forge-gui/res/quest/world/Tempest/duels/Dauthi4.dck new file mode 100644 index 00000000000..baff6718053 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/Dauthi4.dck @@ -0,0 +1,27 @@ +[duel] +[metadata] +Title=Dauthi Warlord +Icon=Dungeon Crawling Black.jpg +Difficulty=very hard +Description=Dauthi deck +Deck Type=constructed +Name=Dauthi4 +[Main] +1 Coat of Arms|EXO +2 Death Stroke|STH +4 Cursed Scroll|TMP +1 Dark Banishing|TMP +2 Dauthi Cutthroat|EXO +4 Dauthi Horror|TMP +4 Dauthi Marauder|TMP +4 Dauthi Mercenary|TMP +4 Dauthi Slayer|TMP +4 Dauthi Warlord|EXO +4 Diabolic Edict|TMP +1 Swamp|TMP|1 +6 Swamp|TMP|2 +3 Swamp|TMP|3 +7 Swamp|TMP|4 +1 Volrath's Stronghold|STH +4 Wall of Souls|STH +4 Wasteland|TMP diff --git a/forge-gui/res/quest/world/Tempest/duels/DreamOath3.dck b/forge-gui/res/quest/world/Tempest/duels/DreamOath3.dck new file mode 100644 index 00000000000..93af35d6fab --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/DreamOath3.dck @@ -0,0 +1,30 @@ +[duel] +[metadata] +Title=Oath of Dreams +Icon=Dungeon Crawling Blue.jpg +Difficulty=hard +Description=Big creatures played for free +Deck Type=constructed +Name=DreamOath3 +[Main] +2 Benthic Behemoth|TMP +4 Counterspell|TMP +4 Dream Halls|STH +2 Forest|TMP|1 +2 Forest|TMP|2 +4 Forest|TMP|3 +2 Forest|TMP|4 +3 Reflecting Pool|TMP +3 Island|TMP|1 +2 Island|TMP|2 +1 Island|TMP|3 +4 Island|TMP|4 +2 Mana Leak|STH +4 Oath of Druids|EXO +2 Primal Rage|STH +4 Propaganda|TMP +3 Rootbreaker Wurm|TMP +4 Sliver Queen|STH +3 Spike Hatcher|EXO +3 Spike Weaver|EXO +2 Verdant Force|TMP diff --git a/forge-gui/res/quest/world/Tempest/duels/DruidRevolt.dck b/forge-gui/res/quest/world/Tempest/duels/DruidRevolt.dck new file mode 100644 index 00000000000..7e08de5cfad --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/DruidRevolt.dck @@ -0,0 +1,28 @@ +[duel] +[metadata] +Title=Druid Revolt! +Icon=Dungeon Crawling Green.jpg +Difficulty=easy +Description=Nature's Revolt deck +Deck Type=constructed +Name=DruidRevolt +[Main] +3 Avenging Druid|EXO +3 Burgeoning|STH +2 Dirtcowl Wurm|TMP +4 Evincar's Justice|TMP +4 Forest|TMP|1 +5 Forest|TMP|2 +3 Forest|TMP|3 +2 Forest|TMP|4 +4 Hermit Druid|STH +4 Horn of Greed|STH +4 Nature's Revolt|TMP +1 Overrun|TMP +3 Rampant Growth|TMP +3 Spidersilk Armor|MMQ +2 Reflecting Pool|TMP +3 Swamp|TMP|2 +5 Swamp|TMP|3 +2 Swamp|TMP|4 +3 Wall of Blossoms|STH \ No newline at end of file diff --git a/forge-gui/res/quest/world/Tempest/duels/EnKor2.dck b/forge-gui/res/quest/world/Tempest/duels/EnKor2.dck new file mode 100644 index 00000000000..eb76dab7598 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/EnKor2.dck @@ -0,0 +1,25 @@ +[duel] +[metadata] +Title=Warrior en-Kor +Icon=Dungeon Crawling White.jpg +Difficulty=medium +Description=White creature deck with many En-Kor creatures +Deck Type=constructed +Name=EnKor2 +[Main] +2 Disenchant|TMP +2 Flickering Ward|TMP +4 Knight of Dawn|TMP +4 Lancers en-Kor|STH +1 Nomads en-Kor|STH +1 Orim, Samite Healer|TMP +4 Paladin en-Vec|EXO +6 Plains|TMP|1 +5 Plains|TMP|2 +6 Plains|TMP|3 +7 Plains|TMP|4 +4 Soltari Champion|STH +2 Soltari Visionary|EXO +4 Spirit en-Kor|STH +4 Wall of Essence|STH +4 Warrior en-Kor|STH diff --git a/forge-gui/res/quest/world/Tempest/duels/Ertai2.dck b/forge-gui/res/quest/world/Tempest/duels/Ertai2.dck new file mode 100644 index 00000000000..250dd8f39f4 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/Ertai2.dck @@ -0,0 +1,24 @@ +[duel] +[metadata] +Title=Ertai, Wizard Adept +Icon=Dungeon Crawling Blue.jpg +Difficulty=medium +Description=Blue control/counter deck +Deck Type=constructed +Name=Ertai2 +[Main] +4 Counterspell|TMP +4 Dismiss|TMP +4 Ertai, Wizard Adept|EXO +4 Evacuation|STH +6 Island|TMP|1 +6 Island|TMP|2 +6 Island|TMP|3 +4 Island|TMP|4 +4 Legacy's Allure|TMP +4 Mana Leak|STH +2 Power Sink|TMP +4 Propaganda|TMP +4 Scrivener|EXO +2 Thumbscrews|TMP +2 Treasure Trove|EXO diff --git a/forge-gui/res/quest/world/Tempest/duels/Furnace4.dck b/forge-gui/res/quest/world/Tempest/duels/Furnace4.dck new file mode 100644 index 00000000000..1e037d710fc --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/Furnace4.dck @@ -0,0 +1,26 @@ +[duel] +[metadata] +Title=Furnace +Icon=Dungeon Crawling Red.jpg +Difficulty=very hard +Description=Red aggo deck with goblins, furnace, burn spells. +Deck Type=constructed +Profile=Reckless +Name=Furnace4 +[Main] +4 Canyon Wildcat|TMP +4 Furnace of Rath|TMP +4 Kindle|TMP +4 Mogg Fanatic|TMP +4 Mogg Flunkies|STH +4 Mogg Maniac|STH +2 Mogg Raider|TMP +2 Shock|STH +1 Mountain|TMP|1 +3 Mountain|TMP|2 +8 Mountain|TMP|3 +4 Mountain|TMP|4 +4 Price of Progress|EXO +4 Raging Goblin|EXO +4 Sudden Impact|TMP +4 Wasteland|TMP diff --git a/forge-gui/res/quest/world/Tempest/duels/GravePact2.dck b/forge-gui/res/quest/world/Tempest/duels/GravePact2.dck new file mode 100644 index 00000000000..1e424acf8e2 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/GravePact2.dck @@ -0,0 +1,29 @@ +[duel] +[metadata] +Title=GravePact +Icon=Dungeon Crawling Black.jpg +Difficulty=medium +Description=Black-White control +Deck Type=constructed +Name=GravePact2 +[Main] +3 Commander Greven il-Vec|TMP +4 Grave Pact|STH +4 Helm of Possession|TMP +4 Lab Rats|STH +4 Oath of Lieges|EXO +4 Pegasus Stampede|EXO +2 Plains|TMP|1 +1 Plains|TMP|2 +1 Plains|TMP|3 +5 Plains|TMP|4 +1 Selenia, Dark Angel|TMP +3 Soltari Visionary|EXO +4 Spirit Mirror|TMP +3 Staunch Defenders|TMP +1 Swamp|TMP|1 +3 Swamp|TMP|2 +2 Swamp|TMP|3 +3 Swamp|TMP|4 +4 Reflecting Pool|TMP +4 Wall of Essence|STH diff --git a/forge-gui/res/quest/world/Tempest/duels/HumbleKnights.dck b/forge-gui/res/quest/world/Tempest/duels/HumbleKnights.dck new file mode 100644 index 00000000000..d652945f164 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/HumbleKnights.dck @@ -0,0 +1,23 @@ +[duel] +[metadata] +Title=Humble Knights +Icon=Dungeon Crawling White.jpg +Difficulty=easy +Description=Humility deck +Deck Type=constructed +Name=HumbleKnights +[Main] +3 Bullwhip|STH +3 Gerrard's Battle Cry|TMP +3 Hero's Resolve|TMP +4 Humility|TMP +4 Orim's Prayer|TMP +4 Paladin en-Vec|EXO +4 Pegasus Stampede|EXO +7 Plains|TMP|1 +9 Plains|TMP|2 +4 Plains|TMP|3 +3 Plains|TMP|4 +4 Spirit Mirror|TMP +4 Winds of Rath|TMP +4 Youthful Knight|STH diff --git a/forge-gui/res/quest/world/Tempest/duels/Mists4.dck b/forge-gui/res/quest/world/Tempest/duels/Mists4.dck new file mode 100644 index 00000000000..55faf9e5de4 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/Mists4.dck @@ -0,0 +1,28 @@ +[duel] +[metadata] +Title=Soltari Mists +Icon=Dungeon Crawling Green.jpg +Difficulty=very hard +Description=Fog and shadow creatures. +Deck Type=constructed +Name=Mists4 +[Main] +2 Avenging Angel|TMP +4 Constant Mists|STH +3 Forest|TMP|1 +1 Forest|TMP|2 +7 Forest|TMP|3 +1 Forest|TMP|4 +2 Helm of Possession|TMP +4 Hermit Druid|STH +4 Oath of Lieges|EXO +4 Pegasus Stampede|EXO +5 Plains|TMP|1 +1 Plains|TMP|2 +1 Plains|TMP|3 +4 Plains|TMP|4 +3 Soltari Champion|STH +4 Soltari Trooper|TMP +4 Soltari Visionary|EXO +4 Spike Weaver|EXO +2 Verdant Force|TMP diff --git a/forge-gui/res/quest/world/Tempest/duels/Nature.dck b/forge-gui/res/quest/world/Tempest/duels/Nature.dck new file mode 100644 index 00000000000..034fc6444c2 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/Nature.dck @@ -0,0 +1,27 @@ +[duel] +[metadata] +Title=Nature's Diversity +Icon=Dungeon Crawling Green.jpg +Difficulty=easy +Description=Green creature deck with all sorts of creatures. +Deck Type=constructed +Name=Nature +[Main] +4 Apes of Rath|TMP +4 Charging Rhino|TMP +7 Forest|TMP|1 +4 Forest|TMP|2 +7 Forest|TMP|3 +5 Forest|TMP|4 +1 Horned Sliver|TMP +2 Mirri, Cat Warrior|EXO +3 Mongrel Pack|TMP +4 Muscle Sliver|TMP +1 Plated Rootwalla|EXO +2 Rabid Wolverines|EXO +2 Skyshroud Archer|STH +2 Skyshroud Elite|EXO +2 Spike Weaver|EXO +2 Spined Wurm|STH +4 Trained Armodon|TMP +4 Wall of Blossoms|STH diff --git a/forge-gui/res/quest/world/Tempest/duels/Nature2.dck b/forge-gui/res/quest/world/Tempest/duels/Nature2.dck new file mode 100644 index 00000000000..5f618b698f1 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/Nature2.dck @@ -0,0 +1,26 @@ +[duel] +[metadata] +Title=Nature's Diversity +Icon=Dungeon Crawling Green.jpg +Difficulty=medium +Description=Green creature deck with all sorts of creatures. +Deck Type=constructed +Name=Nature2 +[Main] +4 Apes of Rath|TMP +4 Charging Rhino|TMP +1 Constant Mists|STH +7 Forest|TMP|1 +4 Forest|TMP|2 +7 Forest|TMP|3 +5 Forest|TMP|4 +1 Horned Sliver|TMP +1 Mirri, Cat Warrior|EXO +3 Mongrel Pack|TMP +4 Muscle Sliver|TMP +3 Overrun|TMP +4 Skyshroud Elite|EXO +3 Spike Weaver|EXO +2 Spined Wurm|STH +4 Trained Armodon|TMP +3 Wall of Blossoms|STH diff --git a/forge-gui/res/quest/world/Tempest/duels/Pandemonium.dck b/forge-gui/res/quest/world/Tempest/duels/Pandemonium.dck new file mode 100644 index 00000000000..eae62690968 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/Pandemonium.dck @@ -0,0 +1,28 @@ +[duel] +[metadata] +Title=Pandemonium +Icon=Dungeon Crawling Red.jpg +Difficulty=easy +Description=Green-Red deck with Pandemonium +Deck Type=constructed +Name=Pandemonium +[Main] +4 Apes of Rath|TMP +4 Craven Giant|STH +3 Forest|TMP|1 +3 Forest|TMP|2 +1 Forest|TMP|3 +3 Forest|TMP|4 +3 Jackalope Herd|EXO +2 Mountain|TMP|1 +2 Mountain|TMP|2 +3 Mountain|TMP|3 +1 Mountain|TMP|4 +4 Pandemonium|EXO +4 Rampant Growth|TMP +3 Rathi Dragon|TMP +4 Segmented Wurm|TMP +4 Skyshroud Elf|TMP +4 Spined Wurm|STH +4 Wall of Razors|STH +4 Wild Wurm|TMP diff --git a/forge-gui/res/quest/world/Tempest/duels/Pursuit2.dck b/forge-gui/res/quest/world/Tempest/duels/Pursuit2.dck new file mode 100644 index 00000000000..a24b31d71b5 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/Pursuit2.dck @@ -0,0 +1,33 @@ +[duel] +[metadata] +Title=Pursuit of Knowledge +Icon=Dungeon Crawling White.jpg +Difficulty=medium +Description=Black-White control with Necrologia +Deck Type=constructed +Name=Pursuit2 +[Main] +3 Coffin Queen|TMP +2 Commander Greven il-Vec|TMP +4 Diabolic Edict|TMP +1 Disenchant|TMP +1 Erratic Portal|EXO +2 Grave Pact|STH +2 Helm of Possession|TMP +2 Mox Diamond|STH +4 Necrologia|EXO +1 Plains|TMP|2 +6 Plains|TMP|3 +1 Plains|TMP|4 +2 Pursuit of Knowledge|STH +1 Selenia, Dark Angel|TMP +2 Soul Warden|EXO +2 Spirit Mirror|TMP +4 Staunch Defenders|TMP +4 Reflecting Pool|TMP +4 Salt Flats|TMP +5 Swamp|TMP|2 +1 Swamp|TMP|3 +1 Swamp|TMP|4 +3 Wall of Essence|STH +2 Warrior Angel|STH diff --git a/forge-gui/res/quest/world/Tempest/duels/Rage.dck b/forge-gui/res/quest/world/Tempest/duels/Rage.dck new file mode 100644 index 00000000000..d15e5f2119a --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/Rage.dck @@ -0,0 +1,23 @@ +[duel] +[metadata] +Title=Rage of the Mountains +Icon=Dungeon Crawling Red.jpg +Difficulty=easy +Description=Red creature based aggo deck +Deck Type=constructed +Name=Rage +[Main] +4 Blood Frenzy|TMP +4 Canyon Wildcat|TMP +4 Fireslinger|TMP +4 Giant Strength|TMP +4 Jackal Pup|TMP +4 Maniacal Rage|EXO +4 Mogg Fanatic|TMP +4 Mogg Maniac|STH +5 Mountain|TMP|1 +5 Mountain|TMP|2 +6 Mountain|TMP|4 +4 Raging Goblin|EXO +4 Rathi Dragon|TMP +4 Wasteland|TMP diff --git a/forge-gui/res/quest/world/Tempest/duels/Rage2.dck b/forge-gui/res/quest/world/Tempest/duels/Rage2.dck new file mode 100644 index 00000000000..449b5186c11 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/Rage2.dck @@ -0,0 +1,26 @@ +[duel] +[metadata] +Profile=Reckless +Title=Rage of the Mountains +Icon=Dungeon Crawling Red.jpg +Difficulty=medium +Description=Red creature based aggo deck +Deck Type=constructed +Name=Rage2 +[Main] +2 Blood Frenzy|TMP +2 Canyon Wildcat|TMP +2 Fireslinger|TMP +2 Giant Strength|TMP +4 Jackal Pup|TMP +4 Maniacal Rage|EXO +4 Mogg Fanatic|TMP +4 Mogg Maniac|STH +5 Mountain|TMP|1 +5 Mountain|TMP|2 +6 Mountain|TMP|4 +4 Raging Goblin|EXO +4 Rathi Dragon|TMP +4 Wasteland|TMP +4 Cursed Scroll|TMP +4 Kindle|TMP \ No newline at end of file diff --git a/forge-gui/res/quest/world/Tempest/duels/Seismic2.dck b/forge-gui/res/quest/world/Tempest/duels/Seismic2.dck new file mode 100644 index 00000000000..61ac0a9eaa7 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/Seismic2.dck @@ -0,0 +1,27 @@ +[duel] +[metadata] +Title=Cartographer +Icon=Dungeon Crawling Blue.jpg +Difficulty=medium +Description=Red - Green deck based on discarding lands. +Deck Type=constructed +Name=Seismic2 +[Main] +3 Anarchist|EXO +4 Cartographer|EXO +4 Erratic Portal|EXO +3 Forest|TMP|1 +4 Forest|TMP|2 +1 Forest|TMP|3 +5 Forest|TMP|4 +4 Hermit Druid|STH +3 Mountain|TMP|1 +4 Mountain|TMP|2 +5 Mountain|TMP|3 +1 Mountain|TMP|4 +2 Mulch|STH +2 Ravenous Baboons|EXO +4 Rolling Thunder|TMP +4 Scorched Earth|TMP +3 Seismic Assault|EXO +4 Wall of Blossoms|STH diff --git a/forge-gui/res/quest/world/Tempest/duels/Selenia.dck b/forge-gui/res/quest/world/Tempest/duels/Selenia.dck new file mode 100644 index 00000000000..3f551331967 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/Selenia.dck @@ -0,0 +1,29 @@ +[duel] +[metadata] +Title=Selenia, Dark Angel +Icon=Dungeon Crawling Black.jpg +Difficulty=easy +Description=Black-white deck with Death Pits of Rath +Deck Type=constructed +Name=Selenia +[Main] +4 Death Pits of Rath|TMP +4 Disenchant|TMP +4 Evincar's Justice|TMP +4 Oath of Lieges|EXO +2 Orim's Prayer|TMP +4 Paladin en-Vec|EXO +2 Pit Spawn|EXO +5 Plains|TMP|1 +2 Plains|TMP|2 +1 Plains|TMP|3 +2 Plains|TMP|4 +2 Selenia, Dark Angel|TMP +4 Soltari Monk|TMP +2 Spirit Mirror|TMP +4 Reflecting Pool|TMP +2 Swamp|TMP|1 +2 Swamp|TMP|2 +3 Swamp|TMP|3 +3 Swamp|TMP|4 +4 Youthful Knight|STH diff --git a/forge-gui/res/quest/world/Tempest/duels/Selenia3.dck b/forge-gui/res/quest/world/Tempest/duels/Selenia3.dck new file mode 100644 index 00000000000..a3425523218 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/Selenia3.dck @@ -0,0 +1,31 @@ +[duel] +[metadata] +Profile=Cautious +Title=Selenia, Dark Angel +Icon=Dungeon Crawling Black.jpg +Difficulty=hard +Description=Black-white balanced deck with all sorts of cards. +Deck Type=constructed +Name=Selenia3 +[Main] +2 Coffin Queen|TMP +3 Diabolic Edict|TMP +3 Grave Pact|STH +4 Helm of Possession|TMP +1 Mox Diamond|STH +4 Paladin en-Vec|EXO +5 Plains|TMP|1 +1 Plains|TMP|3 +2 Plains|TMP|4 +4 Reflecting Pool|TMP +2 Recurring Nightmare|EXO +2 Selenia, Dark Angel|TMP +2 Soltari Monk|TMP +2 Soltari Priest|TMP +3 Soltari Visionary|EXO +4 Spirit Mirror|TMP +2 Swamp|TMP|1 +3 Swamp|TMP|3 +3 Swamp|TMP|4 +4 Youthful Knight|STH +4 Salt Flats|TMP \ No newline at end of file diff --git a/forge-gui/res/quest/world/Tempest/duels/SkySpirit.dck b/forge-gui/res/quest/world/Tempest/duels/SkySpirit.dck new file mode 100644 index 00000000000..456e0a0434a --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/SkySpirit.dck @@ -0,0 +1,30 @@ +[duel] +[metadata] +Title=Sky Spirit +Icon=Dungeon Crawling White.jpg +Difficulty=easy +Description=White-Blue control +Deck Type=constructed +Name=SkySpirit +[Main] +2 Capsize|TMP +1 Ertai, Wizard Adept|EXO +4 Island|TMP|1 +4 Island|TMP|2 +4 Island|TMP|4 +4 Legacy's Allure|TMP +4 Mana Leak|STH +2 Master Decoy|TMP +3 Paladin en-Vec|EXO +2 Reflecting Pool|TMP +3 Plains|TMP|1 +4 Plains|TMP|2 +1 Plains|TMP|3 +2 Plains|TMP|4 +1 Power Sink|TMP +4 Propaganda|TMP +4 Sky Spirit|TMP +3 Soltari Visionary|EXO +2 Spirit Mirror|TMP +2 Treasure Trove|EXO +4 Winds of Rath|TMP diff --git a/forge-gui/res/quest/world/Tempest/duels/Slivers2.dck b/forge-gui/res/quest/world/Tempest/duels/Slivers2.dck new file mode 100644 index 00000000000..292192313f9 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/Slivers2.dck @@ -0,0 +1,33 @@ +[duel] +[metadata] +Title=Sliver Queen +Icon=Dungeon Crawling Gold.jpg +Difficulty=medium +Description=Silver deck +Deck Type=constructed +Name=Slivers2 +[Main] +1 Cinder Marsh|TMP +2 Clot Sliver|TMP +1 Coat of Arms|EXO +3 Crystalline Sliver|STH +4 Forest|TMP|1 +4 Forest|TMP|2 +1 Heartstone|STH +4 Hermit Druid|STH +1 Horned Sliver|TMP +1 Island|TMP|1 +2 Lotus Petal|TMP +4 Mogg Hollows|TMP +1 Mountain|TMP|4 +4 Mox Diamond|STH +4 Muscle Sliver|TMP +1 Plains|TMP|2 +4 Rampant Growth|TMP +1 Rootwater Depths|TMP +4 Sliver Queen|STH +4 Spined Sliver|STH +1 Swamp|TMP|4 +4 Thalakos Lowlands|TMP +1 Victual Sliver|STH +3 Winged Sliver|TMP diff --git a/forge-gui/res/quest/world/Tempest/duels/Soltari2.dck b/forge-gui/res/quest/world/Tempest/duels/Soltari2.dck new file mode 100644 index 00000000000..d2dbb9f267d --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/Soltari2.dck @@ -0,0 +1,25 @@ +[duel] +[metadata] +Title=Soltari Champion +Icon=Dungeon Crawling White.jpg +Difficulty=medium +Description=Soltari deck +Deck Type=constructed +Name=Soltari2 +[Main] +3 Disenchant|TMP +2 Cursed Scroll|TMP +3 Gerrard's Battle Cry|TMP +5 Plains|TMP|1 +5 Plains|TMP|2 +5 Plains|TMP|3 +5 Plains|TMP|4 +4 Soltari Champion|STH +2 Soltari Crusader|TMP +4 Soltari Emissary|TMP +4 Soltari Foot Soldier|TMP +2 Soltari Lancer|TMP +4 Soltari Monk|TMP +4 Soltari Priest|TMP +4 Soltari Trooper|TMP +4 Soltari Visionary|EXO diff --git a/forge-gui/res/quest/world/Tempest/duels/Soltari3.dck b/forge-gui/res/quest/world/Tempest/duels/Soltari3.dck new file mode 100644 index 00000000000..a4b52e4205e --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/Soltari3.dck @@ -0,0 +1,23 @@ +[duel] +[metadata] +Title=Soltari Champion +Icon=Dungeon Crawling White.jpg +Difficulty=hard +Description=Soltari deck +Deck Type=constructed +Name=Soltari3 +[Main] +2 Disenchant|TMP +4 Cursed Scroll|TMP +3 Gerrard's Battle Cry|TMP +5 Plains|TMP|1 +6 Plains|TMP|2 +6 Plains|TMP|3 +6 Plains|TMP|4 +4 Soltari Champion|STH +4 Soltari Emissary|TMP +4 Soltari Foot Soldier|TMP +4 Soltari Monk|TMP +4 Soltari Priest|TMP +4 Soltari Trooper|TMP +4 Soltari Visionary|EXO diff --git a/forge-gui/res/quest/world/Tempest/duels/Spikes.dck b/forge-gui/res/quest/world/Tempest/duels/Spikes.dck new file mode 100644 index 00000000000..f49d7226543 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/Spikes.dck @@ -0,0 +1,24 @@ +[duel] +[metadata] +Title=Spike Colony +Icon=Dungeon Crawling Green.jpg +Difficulty=easy +Description=Spike deck +Deck Type=constructed +Name=Spikes +[Main] +2 Coat of Arms|EXO +9 Forest|TMP|1 +6 Forest|TMP|2 +5 Forest|TMP|3 +3 Forest|TMP|4 +4 Heartstone|STH +4 Hermit Druid|STH +4 Rampant Growth|TMP +4 Spike Colony|STH +4 Spike Feeder|STH +4 Spike Hatcher|EXO +1 Spike Rogue|EXO +4 Spike Soldier|STH +4 Spike Weaver|EXO +2 Spike Worker|STH diff --git a/forge-gui/res/quest/world/Tempest/duels/Stompy2.dck b/forge-gui/res/quest/world/Tempest/duels/Stompy2.dck new file mode 100644 index 00000000000..5af28a7a827 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/Stompy2.dck @@ -0,0 +1,25 @@ +[duel] +[metadata] +Title=Stompy +Icon=Dungeon Crawling Green.jpg +Difficulty=medium +Description=Green creature deck +Deck Type=constructed +Name=Stompy2 +[Main] +4 Cursed Scroll|TMP +4 Elven Rite|STH +3 Elvish Fury|TMP +7 Forest|TMP|1 +4 Forest|TMP|2 +3 Forest|TMP|3 +5 Forest|TMP|4 +3 Heartwood Dryad|TMP +1 Mirri, Cat Warrior|EXO +4 Muscle Sliver|TMP +3 Overrun|TMP +4 Rootwalla|TMP +3 Seeker of Skybreak|TMP +4 Skyshroud Elite|EXO +4 Trained Armodon|TMP +4 Wasteland|TMP diff --git a/forge-gui/res/quest/world/Tempest/duels/SurvivingForce3.dck b/forge-gui/res/quest/world/Tempest/duels/SurvivingForce3.dck new file mode 100644 index 00000000000..05f1f7af41d --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/SurvivingForce3.dck @@ -0,0 +1,29 @@ +[duel] +[metadata] +Title=The Surviving Force +Icon=Dungeon Crawling Green.jpg +Difficulty=hard +Description=Survival of Fittest deck +Deck Type=constructed +Name=SurvivingForce3 +[Main] +2 Forest|TMP|1 +3 Forest|TMP|2 +3 Forest|TMP|3 +3 Forest|TMP|4 +4 Hermit Druid|STH +4 Living Death|TMP +1 Mirri, Cat Warrior|EXO +2 Mongrel Pack|TMP +4 Pit Spawn|EXO +4 Recurring Nightmare|EXO +1 Spike Feeder|STH +4 Spike Weaver|EXO +4 Survival of the Fittest|EXO +3 Swamp|TMP|1 +1 Swamp|TMP|2 +5 Swamp|TMP|3 +2 Swamp|TMP|4 +4 Verdant Force|TMP +4 Wall of Blossoms|STH +2 Wood Elves|EXO diff --git a/forge-gui/res/quest/world/Tempest/duels/TimeLoop.dck b/forge-gui/res/quest/world/Tempest/duels/TimeLoop.dck new file mode 100644 index 00000000000..1a3ceadcceb --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/TimeLoop.dck @@ -0,0 +1,28 @@ +[duel] +[metadata] +Title=Time Loop +Icon=Dungeon Crawling Red.jpg +Difficulty=easy +Description=Blue-Red control +Deck Type=constructed +Name=TimeLoop +[Main] +4 Anarchist|EXO +2 Cloud Spirit|STH +4 Counterspell|TMP +4 Erratic Portal|EXO +1 Furnace Brood|EXO +4 Intuition|TMP +4 Island|TMP|1 +2 Island|TMP|2 +4 Island|TMP|3 +2 Island|TMP|4 +3 Lightning Blast|TMP +4 Mana Leak|STH +2 Mountain|TMP|1 +4 Mountain|TMP|2 +3 Mountain|TMP|3 +3 Mountain|TMP|4 +4 Propaganda|TMP +2 Thalakos Mistfolk|TMP +4 Time Warp|TMP diff --git a/forge-gui/res/quest/world/Tempest/duels/TradewindRider3.dck b/forge-gui/res/quest/world/Tempest/duels/TradewindRider3.dck new file mode 100644 index 00000000000..084f8b585a4 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/TradewindRider3.dck @@ -0,0 +1,25 @@ +[duel] +[metadata] +Title=Tradewind Rider +Icon=Dungeon Crawling Blue.jpg +Difficulty=hard +Description=Mono-blue creature deck +Deck Type=constructed +Name=TradewindRider3 +[Main] +4 Cloud Spirit|STH +4 Counterspell|TMP +4 Curiosity|EXO +9 Island|TMP|1 +4 Island|TMP|2 +2 Island|TMP|3 +3 Island|TMP|4 +4 Legacy's Allure|TMP +4 Rootwater Hunter|TMP +4 Thalakos Deceiver|STH +1 Thalakos Scout|EXO +4 Thalakos Seer|TMP +4 Time Warp|TMP +4 Tradewind Rider|TMP +4 Wasteland|TMP +1 Wayward Soul|EXO diff --git a/forge-gui/res/quest/world/Tempest/duels/Unplayable/Dracoplasm.dck b/forge-gui/res/quest/world/Tempest/duels/Unplayable/Dracoplasm.dck new file mode 100644 index 00000000000..a0ad85c3600 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/Unplayable/Dracoplasm.dck @@ -0,0 +1,23 @@ +[metadata] +Name=Dracoplasm +[Main] +4 Dracoplasm|TMP +2 Goblin Bombardment|TMP +4 Intuition|TMP +5 Island|TMP|1 +2 Island|TMP|2 +3 Island|TMP|3 +2 Mana Leak|STH +3 Mountain|TMP|1 +4 Mountain|TMP|2 +2 Mountain|TMP|3 +1 Mountain|TMP|4 +4 Propaganda|TMP +4 Reflecting Pool|TMP +4 Reins of Power|STH +2 Scroll Rack|TMP +4 Shard Phoenix|STH +2 Wall of Diffusion|TMP +4 Wall of Razors|STH +2 Wall of Tears|STH +2 Whispers of the Muse|TMP diff --git a/forge-gui/res/quest/world/Tempest/duels/Unplayable/StaticOrb.dck b/forge-gui/res/quest/world/Tempest/duels/Unplayable/StaticOrb.dck new file mode 100644 index 00000000000..dadb603a558 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/Unplayable/StaticOrb.dck @@ -0,0 +1,17 @@ +[metadata] +Name=StaticOrb +[Main] +4 Counterspell|TMP +8 Island|TMP|1 +2 Island|TMP|2 +5 Island|TMP|3 +6 Island|TMP|4 +4 Legacy's Allure|TMP +4 Mana Leak|STH +4 Mind Games|STH +4 Power Sink|TMP +4 Propaganda|TMP +4 Sapphire Medallion|TMP +3 Silver Wyvern|STH +4 Static Orb|TMP +4 Wall of Tears|STH diff --git a/forge-gui/res/quest/world/Tempest/duels/Unplayable/Vineyard.dck b/forge-gui/res/quest/world/Tempest/duels/Unplayable/Vineyard.dck new file mode 100644 index 00000000000..55c39fbf635 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/Unplayable/Vineyard.dck @@ -0,0 +1,24 @@ +[duel] +[metadata] +Title=Verdant Force +Icon=Dungeon Crawling Green.jpg +Difficulty=easy +Description=Green big creatures +Deck Type=constructed +Name=Vineyard +[Main] +4 Apes of Rath|TMP +2 Carnassid|STH +4 Eladamri's Vineyard|TMP +4 Endangered Armodon|STH +4 Forest|TMP|1 +4 Forest|TMP|2 +12 Forest|TMP|3 +3 Forest|TMP|4 +2 Heartwood Treefolk|TMP +4 Overgrowth|STH +2 Primal Rage|STH +3 Rootbreaker Wurm|TMP +4 Skyshroud Troopers|STH +4 Spined Wurm|STH +4 Verdant Force|TMP diff --git a/forge-gui/res/quest/world/Tempest/duels/Volrath3.dck b/forge-gui/res/quest/world/Tempest/duels/Volrath3.dck new file mode 100644 index 00000000000..0f10dcbb3b8 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/Volrath3.dck @@ -0,0 +1,26 @@ +[duel] +[metadata] +Title=Volrath +Icon=Dungeon Crawling Black.jpg +Difficulty=hard +Description=Mono Black control +Deck Type=constructed +Name=Volrath3 +[Main] +2 Bottle Gnomes|TMP +1 Brush with Death|STH +4 Coffin Queen|TMP +2 Dark Banishing|TMP +4 Dark Ritual|TMP +2 Dauthi Mindripper|TMP +3 Dauthi Slayer|TMP +3 Death Stroke|STH +4 Diabolic Edict|TMP +2 Dregs of Sorrow|TMP +2 Mox Diamond|STH +4 Necrologia|EXO +5 Swamp|TMP|2 +13 Swamp|TMP|3 +4 Swamp|TMP|4 +1 Volrath's Stronghold|STH +4 Wall of Souls|STH diff --git a/forge-gui/res/quest/world/Tempest/duels/WallofTears2.dck b/forge-gui/res/quest/world/Tempest/duels/WallofTears2.dck new file mode 100644 index 00000000000..b183b7814ec --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/WallofTears2.dck @@ -0,0 +1,24 @@ +[duel] +[metadata] +Title=Wall of Tears +Icon=Dungeon Crawling Blue.jpg +Difficulty=medium +Description=Mono blue control +Deck Type=constructed +Name=WallofTears2 +[Main] +4 Counterspell|TMP +4 Dismiss|TMP +2 Island|TMP|1 +5 Island|TMP|2 +8 Island|TMP|3 +8 Island|TMP|4 +2 Killer Whale|EXO +4 Mana Leak|STH +1 Mawcor|TMP +4 Power Sink|TMP +4 Propaganda|TMP +2 Treasure Trove|EXO +4 Wall of Tears|STH +4 Wayward Soul|EXO +4 Whispers of the Muse|TMP diff --git a/forge-gui/res/quest/world/Tempest/duels/WallofTears3.dck b/forge-gui/res/quest/world/Tempest/duels/WallofTears3.dck new file mode 100644 index 00000000000..9e95c3c874b --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/WallofTears3.dck @@ -0,0 +1,23 @@ +[duel] +[metadata] +Title=Wall of Tears +Icon=Dungeon Crawling Blue.jpg +Difficulty=hard +Description=Mono blue control +Deck Type=constructed +Name=WallofTears3 +[Main] +4 Counterspell|TMP +2 Island|TMP|1 +5 Island|TMP|2 +8 Island|TMP|3 +8 Island|TMP|4 +4 Silver Wyvern|STH +3 Ephemeron|EXO +4 Mana Leak|STH +4 Power Sink|TMP +4 Propaganda|TMP +2 Treasure Trove|EXO +4 Wall of Tears|STH +4 Wayward Soul|EXO +4 Whispers of the Muse|TMP diff --git a/forge-gui/res/quest/world/Tempest/duels/WhiteWeenie4.dck b/forge-gui/res/quest/world/Tempest/duels/WhiteWeenie4.dck new file mode 100644 index 00000000000..64db28fa0f0 --- /dev/null +++ b/forge-gui/res/quest/world/Tempest/duels/WhiteWeenie4.dck @@ -0,0 +1,26 @@ +[duel] +[metadata] +Title=Knight of Dawn +Icon=Dungeon Crawling White.jpg +Difficulty=very hard +Description=White weenie +Deck Type=constructed +Name=WhiteWeenie4 +[Main] +4 Cursed Scroll|TMP +1 Disenchant|TMP +3 Flickering Ward|TMP +1 Gerrard's Battle Cry|TMP +4 Knight of Dawn|TMP +1 Master Decoy|TMP +2 Paladin en-Vec|EXO +6 Plains|TMP|1 +5 Plains|TMP|2 +6 Plains|TMP|3 +6 Plains|TMP|4 +3 Soltari Champion|STH +4 Soltari Monk|TMP +4 Soltari Priest|TMP +4 Soltari Trooper|TMP +2 Soul Warden|EXO +4 Warrior en-Kor|STH diff --git a/forge-gui/res/quest/world/worlds.txt b/forge-gui/res/quest/world/worlds.txt index d71439419d0..1c068c0ff74 100644 --- a/forge-gui/res/quest/world/worlds.txt +++ b/forge-gui/res/quest/world/worlds.txt @@ -22,4 +22,5 @@ Name:The Three Kingdoms|Dir:1999-05 Portal Three Kingdoms|Sets:PTK Name:Theros|Dir:2014-05 Theros|Sets:THS, BNG, JOU Name:Urza's Block|Dir:Urza|Sets:USG, ULG, UDS|Banned:Gaea's Cradle;Memory Jar;Serra's Sanctum;Time Spiral;Tolarian Academy;Voltaic Key;Windfall Name:The Gates of Magic|Dir:Starter|Sets:POR, PO2, S99, S00, PTK -Name:Invasion|Dir:Invasion|Sets:INV, PLS, APC \ No newline at end of file +Name:Invasion|Dir:Invasion|Sets:INV, PLS, APC +Name:Tempest|Dir:Tempest|Sets:TMP, STH, EXO \ No newline at end of file From 8a71900e02cf33e5c0b6b312b18201763ace1dbf Mon Sep 17 00:00:00 2001 From: Seravy Date: Mon, 19 Feb 2018 16:44:40 +0100 Subject: [PATCH 006/901] Tested challenges --- forge-gui/res/quest/world/Tempest/challenges/Avenger.dck | 6 +++--- forge-gui/res/quest/world/Tempest/challenges/Pit.dck | 6 +++--- forge-gui/res/quest/world/Tempest/challenges/Portal.dck | 2 +- forge-gui/res/quest/world/Tempest/challenges/Sliver.dck | 2 +- forge-gui/res/quest/world/worlds.txt | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/forge-gui/res/quest/world/Tempest/challenges/Avenger.dck b/forge-gui/res/quest/world/Tempest/challenges/Avenger.dck index 2bd6fcc7d5c..6090f6556bd 100644 --- a/forge-gui/res/quest/world/Tempest/challenges/Avenger.dck +++ b/forge-gui/res/quest/world/Tempest/challenges/Avenger.dck @@ -4,15 +4,15 @@ OpponentName=Mad Hatter AILife=50000 Repeat=true Wins=20 -Card Reward=booster pack TMP;chosen card rarity:R sets:TMP,STH,EXO -Credit Reward=500 +Card Reward=tournament pack TMP;chosen card rarity:R sets:TMP,STH,EXO +Credit Reward=2500 Ticket Reward=true AIExtras=Swamp|Swamp|Swamp|Jet Medallion HumanExtras=Avenging Angel|Plains|Plains|Pearl Medallion|Pearl Medallion|Pearl Medallion|Altar of Dementia [metadata] Title=Avenger Icon=Dungeon Crawling Black.jpg -Difficulty=hard +Difficulty=very hard Description=This evil being unleashed vicious rabbit monsters to destroy your favorite grasslands. You must return the favor! Deck Type=constructed Name=Avenger diff --git a/forge-gui/res/quest/world/Tempest/challenges/Pit.dck b/forge-gui/res/quest/world/Tempest/challenges/Pit.dck index d2e1a68a33c..35f92ac3724 100644 --- a/forge-gui/res/quest/world/Tempest/challenges/Pit.dck +++ b/forge-gui/res/quest/world/Tempest/challenges/Pit.dck @@ -17,9 +17,9 @@ Description=A regular snake pit would be bad enough... Deck Type=constructed Name=Pit [Main] -25 Ancient Tomb|TMP -2 Coat of Arms|EXO +27 Ancient Tomb|TMP +1 Coat of Arms|EXO 18 Coiled Tinviper|TMP 5 Cursed Scroll|TMP 4 Manakin|TMP -6 Sphere of Resistance|EXO +5 Sphere of Resistance|EXO diff --git a/forge-gui/res/quest/world/Tempest/challenges/Portal.dck b/forge-gui/res/quest/world/Tempest/challenges/Portal.dck index 09cfae5e5ec..c849614d11e 100644 --- a/forge-gui/res/quest/world/Tempest/challenges/Portal.dck +++ b/forge-gui/res/quest/world/Tempest/challenges/Portal.dck @@ -4,7 +4,7 @@ OpponentName=Gatekeeper AILife=20 Repeat=true Wins=0 -Card Reward=chosen card rarity:U sets:TMP,STH,EXO +Card Reward=chosen card rarity:U sets:TMP,STH,EXO; Credit Reward=700 Ticket Reward=true AIExtras=Portcullis|Stronghold Taskmaster|Wall of Souls diff --git a/forge-gui/res/quest/world/Tempest/challenges/Sliver.dck b/forge-gui/res/quest/world/Tempest/challenges/Sliver.dck index 313b25f6955..702bc1ab11b 100644 --- a/forge-gui/res/quest/world/Tempest/challenges/Sliver.dck +++ b/forge-gui/res/quest/world/Tempest/challenges/Sliver.dck @@ -9,7 +9,7 @@ Credit Reward=500 AIExtras=Mountain|Island|Swamp|Forest|Plains HumanExtras=Mountain|Island|Swamp|Forest|Plains [metadata] -Title=Dragon Mountain +Title=Sliver Outbreak! Icon=Dungeon Crawling Gold.jpg Difficulty=medium Description=The abundant sources of mana are causing a Sliver outbreak! diff --git a/forge-gui/res/quest/world/worlds.txt b/forge-gui/res/quest/world/worlds.txt index 1c068c0ff74..0ae3917f54d 100644 --- a/forge-gui/res/quest/world/worlds.txt +++ b/forge-gui/res/quest/world/worlds.txt @@ -23,4 +23,4 @@ Name:Theros|Dir:2014-05 Theros|Sets:THS, BNG, JOU Name:Urza's Block|Dir:Urza|Sets:USG, ULG, UDS|Banned:Gaea's Cradle;Memory Jar;Serra's Sanctum;Time Spiral;Tolarian Academy;Voltaic Key;Windfall Name:The Gates of Magic|Dir:Starter|Sets:POR, PO2, S99, S00, PTK Name:Invasion|Dir:Invasion|Sets:INV, PLS, APC -Name:Tempest|Dir:Tempest|Sets:TMP, STH, EXO \ No newline at end of file +Name:Tempest|Dir:Tempest|Sets:TMP, STH, EXO From 3346cbf0c5dc05a74ec7eb130f27135281265ad5 Mon Sep 17 00:00:00 2001 From: Seravy Date: Mon, 19 Feb 2018 17:05:56 +0000 Subject: [PATCH 007/901] Update AiController.java --- forge-ai/src/main/java/forge/ai/AiController.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 3e86c849cfb..0a9f51bd98d 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -708,10 +708,10 @@ public class AiController { if (card.hasStartOfKeyword("Buyback")) { //if (card.getBuybackAbility()!=null) { if (!sa.isBuyBackAbility()) { - boolean wastebuybackallowed = false; + boolean wasteBuybackAllowed = false; // About to lose game : allow if (ComputerUtil.aiLifeInDanger(player, true, 0)) { - wastebuybackallowed = true; + wasteBuybackAllowed = true; } int copies = 0; // Have two copies : allow @@ -721,7 +721,7 @@ public class AiController { } } if (copies >= 2) { - wastebuybackallowed = true; + wasteBuybackAllowed = true; } // Won't be able to afford buyback any time soon // If Buyback cost includes sacrifice, life, discard @@ -740,10 +740,10 @@ public class AiController { } int hasmana = ComputerUtilMana.getAvailableManaEstimate(player, false); if (hasmana < neededMana - 1) { - wastebuybackallowed = true; + wasteBuybackAllowed = true; } - if (!wastebuybackallowed) return AiPlayDecision.NeedsToPlayCriteriaNotMet; + if (!wasteBuybackAllowed) return AiPlayDecision.NeedsToPlayCriteriaNotMet; } } // add any other necessary logic to play a basic spell here From b3c8901aa1a7aa488d6f38c30b6d08dd5c31b05c Mon Sep 17 00:00:00 2001 From: Seravy Date: Mon, 19 Feb 2018 17:08:09 +0000 Subject: [PATCH 008/901] Update AiController.java --- forge-ai/src/main/java/forge/ai/AiController.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 0a9f51bd98d..4cba38a474f 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -713,13 +713,8 @@ public class AiController { if (ComputerUtil.aiLifeInDanger(player, true, 0)) { wasteBuybackAllowed = true; } - int copies = 0; + int copies = CardLists.filter(player.getCardsIn(ZoneType.Hand), CardPredicates.nameEquals(card.getName())).size(); // Have two copies : allow - for (Card hand : player.getCardsIn(ZoneType.Hand)) { - if (hand.getName().equals(card.getName())) { - copies++; - } - } if (copies >= 2) { wasteBuybackAllowed = true; } From b54e8461b8948323d9fda2e617758d1163b1dfe0 Mon Sep 17 00:00:00 2001 From: Seravy Date: Mon, 19 Feb 2018 17:10:13 +0000 Subject: [PATCH 009/901] Update AiController.java --- forge-ai/src/main/java/forge/ai/AiController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 4cba38a474f..aece8718126 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -733,8 +733,8 @@ public class AiController { } } } - int hasmana = ComputerUtilMana.getAvailableManaEstimate(player, false); - if (hasmana < neededMana - 1) { + int hasMana = ComputerUtilMana.getAvailableManaEstimate(player, false); + if (hasMana < neededMana - 1) { wasteBuybackAllowed = true; } From e4fddafc104664b7548896ba08f4e9b0abb5c20d Mon Sep 17 00:00:00 2001 From: tehdiplomat Date: Tue, 28 Aug 2018 12:24:04 -0400 Subject: [PATCH 010/901] Fixing Mana types being inappropriately referenced in relation to Matrices --- .../src/main/java/forge/ai/ComputerUtilMana.java | 4 ++++ .../src/main/java/forge/card/MagicColor.java | 9 --------- .../src/main/java/forge/card/mana/ManaAtom.java | 5 ++++- .../java/forge/game/ability/AbilityUtils.java | 3 ++- .../java/forge/game/mana/ManaCostBeingPaid.java | 6 ++++-- .../src/main/java/forge/game/mana/ManaPool.java | 15 +++++++++------ 6 files changed, 23 insertions(+), 19 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java index 98df78bf24a..02ffc322634 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java @@ -913,6 +913,10 @@ public class ComputerUtilMana { // Make mana needed to avoid negative effect a mandatory cost for the AI for (String manaPart : card.getSVar("ManaNeededToAvoidNegativeEffect").split(",")) { // convert long color strings to short color strings + if (manaPart.isEmpty()) { + continue; + } + byte mask = ManaAtom.fromName(manaPart); // make mana mandatory for AI diff --git a/forge-core/src/main/java/forge/card/MagicColor.java b/forge-core/src/main/java/forge/card/MagicColor.java index bc452e19520..37e6294a056 100644 --- a/forge-core/src/main/java/forge/card/MagicColor.java +++ b/forge-core/src/main/java/forge/card/MagicColor.java @@ -103,15 +103,6 @@ public final class MagicColor { } } - public static int getIndexOfFirstColor(final byte color){ - for (int i = 0; i < NUMBER_OR_COLORS; i++) { - if ((color & WUBRG[i]) != 0) { - return i; - } - } - return -1; // colorless - } - /** * The Interface Color. */ diff --git a/forge-core/src/main/java/forge/card/mana/ManaAtom.java b/forge-core/src/main/java/forge/card/mana/ManaAtom.java index 1416139cda5..5a38b3a3310 100644 --- a/forge-core/src/main/java/forge/card/mana/ManaAtom.java +++ b/forge-core/src/main/java/forge/card/mana/ManaAtom.java @@ -14,6 +14,9 @@ public abstract class ManaAtom { public static final byte[] MANACOLORS = new byte[] { WHITE, BLUE, BLACK, RED, GREEN }; public static final byte[] MANATYPES = new byte[] { WHITE, BLUE, BLACK, RED, GREEN, COLORLESS }; + public static final byte ALL_MANA_COLORS = WHITE | BLUE | BLACK | RED | GREEN; + public static final byte ALL_MANA_TYPES = ALL_MANA_COLORS | COLORLESS; + public static final int GENERIC = 1 << 6; // Below here skip due to byte conversion shenanigans @@ -62,6 +65,6 @@ public abstract class ManaAtom { return i; } } - return -1; // colorless + return -1; // somehow the mana is not colored or colorless? } } \ No newline at end of file diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index ab4032c090a..46486599224 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -1655,7 +1655,8 @@ public class AbilityUtils { String convertTo = params.get(key); byte convertByte = 0; if ("All".equals(convertTo)) { - convertByte = ColorSet.ALL_COLORS.getColor(); + // IMPORTANT! We need to use Mana Color here not Card Color. + convertByte = ManaAtom.ALL_MANA_TYPES; } else { for (final String convertColor : convertTo.split(",")) { convertByte |= ManaAtom.fromName(convertColor); diff --git a/forge-game/src/main/java/forge/game/mana/ManaCostBeingPaid.java b/forge-game/src/main/java/forge/game/mana/ManaCostBeingPaid.java index f1f43259799..f5c381fb9ca 100644 --- a/forge-game/src/main/java/forge/game/mana/ManaCostBeingPaid.java +++ b/forge-game/src/main/java/forge/game/mana/ManaCostBeingPaid.java @@ -586,6 +586,7 @@ public class ManaCostBeingPaid { // Boolean addX used to add Xs into the returned value final StringBuilder sb = new StringBuilder(); + // TODO Prepend a line about paying with any type/color if available if (addX) { for (int i = 0; i < this.getXcounter(); i++) { sb.append("{X}"); @@ -595,10 +596,11 @@ public class ManaCostBeingPaid { int nGeneric = getGenericManaAmount(); List shards = new ArrayList(unpaidShards.keySet()); - if (pool != null) { //replace shards with generic mana if they can be paid with any color mana + // TODO Fix this. Should we really be changing Shards here? + if (false && pool != null) { //replace shards with generic mana if they can be paid with any color mana for (int i = 0; i < shards.size(); i++) { ManaCostShard shard = shards.get(i); - if (shard != ManaCostShard.GENERIC && pool.getPossibleColorUses(shard.getColorMask()) == MagicColor.ALL_COLORS) { + if (shard != ManaCostShard.GENERIC && pool.getPossibleColorUses(shard.getColorMask()) == ManaAtom.ALL_MANA_TYPES) { nGeneric += unpaidShards.get(shard).totalCount; shards.remove(i); i--; diff --git a/forge-game/src/main/java/forge/game/mana/ManaPool.java b/forge-game/src/main/java/forge/game/mana/ManaPool.java index 2d2de63d968..d76c2145973 100644 --- a/forge-game/src/main/java/forge/game/mana/ManaPool.java +++ b/forge-game/src/main/java/forge/game/mana/ManaPool.java @@ -22,7 +22,6 @@ import com.google.common.collect.Lists; import com.google.common.collect.Multimap; import forge.GameCommand; -import forge.card.ColorSet; import forge.card.MagicColor; import forge.card.mana.ManaAtom; import forge.card.mana.ManaCostShard; @@ -364,7 +363,7 @@ public class ManaPool implements Iterable { public void adjustColorReplacement(byte originalColor, byte replacementColor, boolean additive) { // Fix the index without hardcodes - int rowIdx = MagicColor.getIndexOfFirstColor(originalColor); + int rowIdx = ManaAtom.getIndexOfFirstManaType(originalColor); rowIdx = rowIdx < 0 ? identityMatrix.length - 1 : rowIdx; if (additive) { colorConversionMatrix[rowIdx] |= replacementColor; @@ -375,17 +374,19 @@ public class ManaPool implements Iterable { } public void restoreColorReplacements() { + // By default each color can only be paid by itself ( {G} -> {G}, {C} -> {C} for (int i = 0; i < colorConversionMatrix.length; i++) { colorConversionMatrix[i] = identityMatrix[i]; } + // By default all mana types are unrestricted for (int i = 0; i < colorRestrictionMatrix.length; i++) { - colorRestrictionMatrix[i] = ColorSet.ALL_COLORS.getColor(); + colorRestrictionMatrix[i] = ManaAtom.ALL_MANA_TYPES; } } public byte getPossibleColorUses(byte color) { // Take the current conversion value, AND with restrictions to get mana usage - int rowIdx = MagicColor.getIndexOfFirstColor(color); + int rowIdx = ManaAtom.getIndexOfFirstManaType(color); int matrixIdx = rowIdx < 0 ? identityMatrix.length - 1 : rowIdx; byte colorUse = colorConversionMatrix[matrixIdx]; @@ -394,14 +395,16 @@ public class ManaPool implements Iterable { } public boolean canPayForShardWithColor(ManaCostShard shard, byte color) { + // TODO Debug this for Paying Gonti, byte line = getPossibleColorUses(color); - for (int i = 0; i < MagicColor.NUMBER_OR_COLORS; i++) { - byte outColor = MagicColor.WUBRG[i]; + + for(byte outColor : ManaAtom.MANATYPES) { if ((line & outColor) != 0 && shard.canBePaidWithManaOfColor(outColor)) { return true; } } + // TODO The following may not be needed anymore? if (((color & (byte) ManaAtom.COLORLESS) != 0) && shard.canBePaidWithManaOfColor((byte) (byte)ManaAtom.COLORLESS)) { return true; } From 210896b64e5650f6bb97150ecc62c07e81e334d1 Mon Sep 17 00:00:00 2001 From: Chris H Date: Sun, 7 Oct 2018 22:07:53 -0400 Subject: [PATCH 011/901] Pull ManaConversion out to be reused for SpellAbilityStackInstance --- .../src/main/java/forge/game/GameAction.java | 3 +- .../java/forge/game/ability/AbilityUtils.java | 3 +- .../game/mana/IManaConversionMatrix.java | 11 +++++ .../game/mana/ManaConversionService.java | 36 ++++++++++++++++ .../main/java/forge/game/mana/ManaPool.java | 43 ++----------------- .../forge/player/HumanPlaySpellAbility.java | 25 +++++------ 6 files changed, 66 insertions(+), 55 deletions(-) create mode 100644 forge-game/src/main/java/forge/game/mana/IManaConversionMatrix.java create mode 100644 forge-game/src/main/java/forge/game/mana/ManaConversionService.java diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 12d19649791..1ba4cfb501e 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -29,6 +29,7 @@ import forge.game.ability.effects.AttachEffect; import forge.game.card.*; import forge.game.event.*; import forge.game.keyword.KeywordInterface; +import forge.game.mana.ManaConversionService; import forge.game.player.GameLossReason; import forge.game.player.Player; import forge.game.replacement.ReplacementEffect; @@ -786,7 +787,7 @@ public class GameAction { game.getReplacementHandler().cleanUpTemporaryReplacements(); for (final Player p : game.getPlayers()) { - p.getManaPool().restoreColorReplacements(); + new ManaConversionService(p.getManaPool()).restoreColorReplacements(); p.clearStaticAbilities(); } diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index 46486599224..639e8781377 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -18,6 +18,7 @@ import forge.game.ability.AbilityFactory.AbilityRecordType; import forge.game.card.*; import forge.game.cost.Cost; import forge.game.keyword.KeywordInterface; +import forge.game.mana.ManaConversionService; import forge.game.mana.ManaCostBeingPaid; import forge.game.player.Player; import forge.game.player.PlayerCollection; @@ -1663,7 +1664,7 @@ public class AbilityUtils { } } // AdjustColorReplacement has two different matrices handling final mana conversion under the covers - p.getManaPool().adjustColorReplacement(ManaAtom.fromName(c), convertByte, additive); + new ManaConversionService(p.getManaPool()).adjustColorReplacement(ManaAtom.fromName(c), convertByte, additive); } } } diff --git a/forge-game/src/main/java/forge/game/mana/IManaConversionMatrix.java b/forge-game/src/main/java/forge/game/mana/IManaConversionMatrix.java new file mode 100644 index 00000000000..0a047f766d7 --- /dev/null +++ b/forge-game/src/main/java/forge/game/mana/IManaConversionMatrix.java @@ -0,0 +1,11 @@ +package forge.game.mana; + +import forge.card.mana.ManaAtom; + +public interface IManaConversionMatrix { + // Conversion matrix ORs byte values to make mana more payable + // Restrictive matrix ANDs byte values to make mana less payable + byte[] colorConversionMatrix = new byte[ManaAtom.MANATYPES.length]; + byte[] colorRestrictionMatrix = new byte[ManaAtom.MANATYPES.length]; + +} diff --git a/forge-game/src/main/java/forge/game/mana/ManaConversionService.java b/forge-game/src/main/java/forge/game/mana/ManaConversionService.java new file mode 100644 index 00000000000..513d47cd5db --- /dev/null +++ b/forge-game/src/main/java/forge/game/mana/ManaConversionService.java @@ -0,0 +1,36 @@ +package forge.game.mana; + +import forge.card.mana.ManaAtom; + +public class ManaConversionService { + static byte[] identityMatrix = { ManaAtom.WHITE, ManaAtom.BLUE, ManaAtom.BLACK, ManaAtom.RED, ManaAtom.GREEN, ManaAtom.COLORLESS }; + + IManaConversionMatrix matrix; + + public ManaConversionService(IManaConversionMatrix mtrx) { + matrix = mtrx; + } + + public void adjustColorReplacement(byte originalColor, byte replacementColor, boolean additive) { + // Fix the index without hardcodes + int rowIdx = ManaAtom.getIndexOfFirstManaType(originalColor); + rowIdx = rowIdx < 0 ? identityMatrix.length - 1 : rowIdx; + if (additive) { + matrix.colorConversionMatrix[rowIdx] |= replacementColor; + } + else { + matrix.colorRestrictionMatrix[rowIdx] &= replacementColor; + } + } + + public void restoreColorReplacements() { + // By default each color can only be paid by itself ( {G} -> {G}, {C} -> {C} + for (int i = 0; i < matrix.colorConversionMatrix.length; i++) { + matrix.colorConversionMatrix[i] = identityMatrix[i]; + } + // By default all mana types are unrestricted + for (int i = 0; i < matrix.colorRestrictionMatrix.length; i++) { + matrix.colorRestrictionMatrix[i] = ManaAtom.ALL_MANA_TYPES; + } + } +} diff --git a/forge-game/src/main/java/forge/game/mana/ManaPool.java b/forge-game/src/main/java/forge/game/mana/ManaPool.java index d76c2145973..0b0c4f3924c 100644 --- a/forge-game/src/main/java/forge/game/mana/ManaPool.java +++ b/forge-game/src/main/java/forge/game/mana/ManaPool.java @@ -20,7 +20,6 @@ package forge.game.mana; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; - import forge.GameCommand; import forge.card.MagicColor; import forge.card.mana.ManaAtom; @@ -36,14 +35,9 @@ import forge.game.player.Player; import forge.game.spellability.AbilityManaPart; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; - import org.apache.commons.lang3.StringUtils; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; +import java.util.*; /** *

@@ -53,13 +47,13 @@ import java.util.List; * @author Forge * @version $Id$ */ -public class ManaPool implements Iterable { +public class ManaPool implements Iterable, IManaConversionMatrix { private final Player owner; private final Multimap floatingMana = ArrayListMultimap.create(); public ManaPool(final Player player) { owner = player; - restoreColorReplacements(); + new ManaConversionService(this).restoreColorReplacements(); } public final int getAmountOfColor(final byte color) { @@ -354,40 +348,11 @@ public class ManaPool implements Iterable { Player p = sa.getActivatingPlayer(); p.getGame().fireEvent(new GameEventZone(ZoneType.Battlefield, p, EventValueChangeType.ComplexUpdate, null)); } - - // Conversion matrix ORs byte values to make mana more payable - // Restrictive matrix ANDs byte values to make mana less payable - private final byte[] colorConversionMatrix = new byte[ManaAtom.MANATYPES.length]; - private final byte[] colorRestrictionMatrix = new byte[ManaAtom.MANATYPES.length]; - private static final byte[] identityMatrix = { ManaAtom.WHITE, ManaAtom.BLUE, ManaAtom.BLACK, ManaAtom.RED, ManaAtom.GREEN, ManaAtom.COLORLESS }; - - public void adjustColorReplacement(byte originalColor, byte replacementColor, boolean additive) { - // Fix the index without hardcodes - int rowIdx = ManaAtom.getIndexOfFirstManaType(originalColor); - rowIdx = rowIdx < 0 ? identityMatrix.length - 1 : rowIdx; - if (additive) { - colorConversionMatrix[rowIdx] |= replacementColor; - } - else { - colorRestrictionMatrix[rowIdx] &= replacementColor; - } - } - - public void restoreColorReplacements() { - // By default each color can only be paid by itself ( {G} -> {G}, {C} -> {C} - for (int i = 0; i < colorConversionMatrix.length; i++) { - colorConversionMatrix[i] = identityMatrix[i]; - } - // By default all mana types are unrestricted - for (int i = 0; i < colorRestrictionMatrix.length; i++) { - colorRestrictionMatrix[i] = ManaAtom.ALL_MANA_TYPES; - } - } public byte getPossibleColorUses(byte color) { // Take the current conversion value, AND with restrictions to get mana usage int rowIdx = ManaAtom.getIndexOfFirstManaType(color); - int matrixIdx = rowIdx < 0 ? identityMatrix.length - 1 : rowIdx; + int matrixIdx = rowIdx < 0 ? ManaConversionService.identityMatrix.length - 1 : rowIdx; byte colorUse = colorConversionMatrix[matrixIdx]; colorUse &= colorRestrictionMatrix[matrixIdx]; diff --git a/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java b/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java index e03c8d89251..02b4bf64ea8 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java +++ b/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java @@ -17,14 +17,8 @@ */ package forge.player; -import java.util.Collections; -import java.util.Map; - -import org.apache.commons.lang3.StringUtils; - import com.google.common.collect.Iterables; import com.google.common.collect.Maps; - import forge.card.CardStateName; import forge.card.CardType; import forge.card.MagicColor; @@ -38,16 +32,17 @@ import forge.game.cost.CostPart; import forge.game.cost.CostPartMana; import forge.game.cost.CostPayment; import forge.game.keyword.KeywordInterface; +import forge.game.mana.ManaConversionService; import forge.game.mana.ManaPool; import forge.game.player.Player; import forge.game.player.PlayerController; -import forge.game.spellability.AbilityActivated; -import forge.game.spellability.AbilitySub; -import forge.game.spellability.Spell; -import forge.game.spellability.SpellAbility; -import forge.game.spellability.TargetRestrictions; +import forge.game.spellability.*; import forge.game.zone.Zone; import forge.util.collect.FCollection; +import org.apache.commons.lang3.StringUtils; + +import java.util.Collections; +import java.util.Map; /** *

@@ -81,6 +76,7 @@ public class HumanPlaySpellAbility { final Card c = ability.getHostCard(); final CardPlayOption option = c.mayPlay(ability.getMayPlay()); + ManaConversionService service = new ManaConversionService(manapool); boolean manaTypeConversion = false; boolean manaColorConversion = false; @@ -169,11 +165,12 @@ public class HumanPlaySpellAbility { ability.getHostCard().unanimateBestow(); } } + if (manaTypeConversion || manaColorConversion || keywordColor) { - manapool.restoreColorReplacements(); + service.restoreColorReplacements(); } if (playerManaConversion) { - manapool.restoreColorReplacements(); + service.restoreColorReplacements(); human.decNumManaConversion(); } return false; @@ -196,7 +193,7 @@ public class HumanPlaySpellAbility { clearTargets(ability); } if (manaTypeConversion || manaColorConversion || keywordColor) { - manapool.restoreColorReplacements(); + service.restoreColorReplacements(); } } return true; From 62a11481abf6f48d5f2aa4ac7b9fead0a224a167 Mon Sep 17 00:00:00 2001 From: swordshine Date: Tue, 9 Oct 2018 14:42:58 +0800 Subject: [PATCH 012/901] - Fixed more cards --- forge-gui/res/cardsfolder/s/saheeli_the_gifted.txt | 4 ++-- forge-gui/res/cardsfolder/t/tuvasa_the_sunlit.txt | 2 +- .../res/cardsfolder/v/varchild_betrayer_of_kjeldor.txt | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/forge-gui/res/cardsfolder/s/saheeli_the_gifted.txt b/forge-gui/res/cardsfolder/s/saheeli_the_gifted.txt index acb0906840c..86f5b00299f 100644 --- a/forge-gui/res/cardsfolder/s/saheeli_the_gifted.txt +++ b/forge-gui/res/cardsfolder/s/saheeli_the_gifted.txt @@ -10,7 +10,7 @@ SVar:RemoveEffect:DB$ ChangeZone | Origin$ Command | Destination$ Exile SVar:X:Count$Valid Artifact.YouCtrl SVar:RemRandomDeck A:AB$ RepeatEach | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | RepeatSubAbility$ DBClone | RepeatCards$ Artifact.YouCtrl | AtEOT$ ExileCombat | AddSVars$ SneakAttackEOT | SpellDescription$ For each artifact you control, create a token that's a copy of it. Those tokens gain haste. Exile those tokens at the beginning of the next end step. -SVar:DBClone:DB$ CopyPermanent | Defined$ Remembered | Keywords$ Haste | AtEOT$ Exile | AddSVars$ SneakAttackEOT | AtEOT$ Exile +SVar:DBClone:DB$ CopyPermanent | Defined$ Remembered | Keywords$ Haste | AtEOT$ Exile | AddSVars$ SneakAttackEOT SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True K:CARDNAME can be your commander. -Oracle:[+1]: Create a 1/1 colorless Servo artifact creature token.\n[+1]: The next spell you cast this turn costs {1} less to cast for each artifact you control as you cast it.\n[-7]: For each artifact you control, create a token that's a copy of it. Those tokens gain haste. Exile those tokens at the beginning of the next end step.\nSaheeli, the Gifted can be your commander. \ No newline at end of file +Oracle:[+1]: Create a 1/1 colorless Servo artifact creature token.\n[+1]: The next spell you cast this turn costs {1} less to cast for each artifact you control as you cast it.\n[-7]: For each artifact you control, create a token that's a copy of it. Those tokens gain haste. Exile those tokens at the beginning of the next end step.\nSaheeli, the Gifted can be your commander. diff --git a/forge-gui/res/cardsfolder/t/tuvasa_the_sunlit.txt b/forge-gui/res/cardsfolder/t/tuvasa_the_sunlit.txt index 54e048fd514..49c79afd743 100644 --- a/forge-gui/res/cardsfolder/t/tuvasa_the_sunlit.txt +++ b/forge-gui/res/cardsfolder/t/tuvasa_the_sunlit.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Merfolk Shaman PT:1/1 S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | AddToughness$ X | Description$ CARDNAME gets +1/+1 for each enchantment you control. SVar:X:Count$Valid Enchantment.YouCtrl -T:Mode$ SpellCast | ValidCard$ Enchantment | ValidActivatingPlayer$ You | CheckSVar$ Y | SVarCompare$ EQ1 | References$ Y | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever you cast your first enchantment spell each turn, draw a card. +T:Mode$ SpellCast | ValidCard$ Enchantment | ValidActivatingPlayer$ You | CheckSVar$ Y | SVarCompare$ EQ1 | References$ Y | NoResolvingCheck$ True | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever you cast your first enchantment spell each turn, draw a card. SVar:Y:Count$ThisTurnCast_Enchantment.YouCtrl SVar:TrigDraw:DB$ Draw | NumCards$ 1 | Defined$ You SVar:BuffedBy:Enchantment diff --git a/forge-gui/res/cardsfolder/v/varchild_betrayer_of_kjeldor.txt b/forge-gui/res/cardsfolder/v/varchild_betrayer_of_kjeldor.txt index 667ecd11252..9c248f8890d 100644 --- a/forge-gui/res/cardsfolder/v/varchild_betrayer_of_kjeldor.txt +++ b/forge-gui/res/cardsfolder/v/varchild_betrayer_of_kjeldor.txt @@ -5,8 +5,8 @@ PT:3/3 T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigToken | TriggerDescription$ When CARDNAME deals combat damage to a player, that player creates that many 1/1 red Survivor creature tokens. SVar:TrigToken:DB$ Token | TokenOwner$ TriggeredTarget | TokenAmount$ X | References$ X | TokenName$ Survivor | TokenTypes$ Creature,Survivor | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 | TokenImage$ r 1 1 survivor C18 SVar:X:TriggerCount$DamageAmount -S:Mode$ Continuous | Affected$ Survivor | AddHiddenKeyword$ CantBlock Creature | Description$ Survivors can't block. -S:Mode$ CantAttack | ValidCard$ Creature.Survivor | Target$ You,Planeswalker.YouCtrl | Description$ Survivors your opponent control can't attack you or planeswalkers you control. +S:Mode$ Continuous | Affected$ Survivor.OppCtrl | AddHiddenKeyword$ CantBlock Creature | Description$ Survivors your opponents control can't block. +S:Mode$ CantAttack | ValidCard$ Creature.Survivor+OppCtrl | Target$ You,Planeswalker.YouCtrl | Description$ Survivors your opponents control can't attack you or planeswalkers you control. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigGainControl | TriggerDescription$ When CARDNAME leaves the battlefield, gain control of all Survivors. SVar:TrigGainControl:DB$ GainControl | AllValid$ Survivor | NewController$ You -Oracle:When Varchild, Betrayer of Kjeldor deals combat damage to a player, that player creates that many 1/1 red Survivor creature tokens.\nSurvivors your opponent control can't attack you or planeswalkers you control.\nWhen Varchild, Betrayer of Kjeldor leaves the battlefield, gain control of all Survivors. \ No newline at end of file +Oracle:When Varchild, Betrayer of Kjeldor deals combat damage to a player, that player creates that many 1/1 red Survivor creature tokens.\nSurvivors your opponents control can't block, and they can't attack you or a planeswalker you control.\nWhen Varchild, Betrayer of Kjeldor leaves the battlefield, gain control of all Survivors. From 09e46ee8bddbc47f1a9cd4452ab79402a62688a8 Mon Sep 17 00:00:00 2001 From: swordshine Date: Tue, 9 Oct 2018 15:55:06 +0800 Subject: [PATCH 013/901] - migrate Aminatou, the Fateshifter --- .../forge/game/ability/effects/ControlGainVariantEffect.java | 2 ++ .../cardsfolder/{upcoming => a}/aminatou_the_fateshifter.txt | 0 2 files changed, 2 insertions(+) rename forge-gui/res/cardsfolder/{upcoming => a}/aminatou_the_fateshifter.txt (100%) diff --git a/forge-game/src/main/java/forge/game/ability/effects/ControlGainVariantEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ControlGainVariantEffect.java index 48123229288..44c2deddebe 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ControlGainVariantEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ControlGainVariantEffect.java @@ -21,6 +21,8 @@ public class ControlGainVariantEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { // Aminatou, the Fateshifter (multiple players gain control of multiple permanents in an effect) + // Consider migrating cards with similar effects + // GainControl embedded in RepeatEach effects don't work well with timestamps final Card source = sa.getHostCard(); final Game game = source.getGame(); diff --git a/forge-gui/res/cardsfolder/upcoming/aminatou_the_fateshifter.txt b/forge-gui/res/cardsfolder/a/aminatou_the_fateshifter.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/aminatou_the_fateshifter.txt rename to forge-gui/res/cardsfolder/a/aminatou_the_fateshifter.txt From 962576b987cde9f5bee3cff7f71dc77b6103de99 Mon Sep 17 00:00:00 2001 From: swordshine Date: Tue, 9 Oct 2018 16:58:57 +0800 Subject: [PATCH 014/901] - Fixed Darkblade Agent's description --- forge-gui/res/cardsfolder/d/darkblade_agent.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/d/darkblade_agent.txt b/forge-gui/res/cardsfolder/d/darkblade_agent.txt index 0f933fee1e8..a3ce8c4a4ae 100644 --- a/forge-gui/res/cardsfolder/d/darkblade_agent.txt +++ b/forge-gui/res/cardsfolder/d/darkblade_agent.txt @@ -2,7 +2,7 @@ Name:Darkblade Agent ManaCost:1 U B Types:Creature Human Assassin PT:2/3 -S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Deathtouch | AddTrigger$ Trig1 | AddSVar$ TrigDraw | CheckSVar$ X | SVarCompare$ GE1 | Description$ As long as you've surveilled this turn, CARDNAME has deathtouch and and whenever Whenever this creature deals combat damage to a player, draw a card. +S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Deathtouch | AddTrigger$ Trig1 | AddSVar$ TrigDraw | CheckSVar$ X | SVarCompare$ GE1 | Description$ As long as you've surveilled this turn, CARDNAME has deathtouch and "Whenever this creature deals combat damage to a player, draw a card." SVar:Trig1:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDraw | TriggerDescription$ Whenever this creature deals combat damage to a player, draw a card. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 SVar:X:Count$YouSurveilThisTurn From e0f79a6d71934d9e41c5c8001d0b4f03ca8692b7 Mon Sep 17 00:00:00 2001 From: swordshine Date: Tue, 9 Oct 2018 17:58:16 +0800 Subject: [PATCH 015/901] - Fixed more cards --- forge-gui/res/cardsfolder/d/disinformation_campaign.txt | 2 +- forge-gui/res/cardsfolder/g/guild_summit.txt | 2 +- forge-gui/res/cardsfolder/r/ravenous_slime.txt | 2 +- forge-gui/res/cardsfolder/t/turntimber_sower.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/cardsfolder/d/disinformation_campaign.txt b/forge-gui/res/cardsfolder/d/disinformation_campaign.txt index 3af7a783fff..17be691d384 100644 --- a/forge-gui/res/cardsfolder/d/disinformation_campaign.txt +++ b/forge-gui/res/cardsfolder/d/disinformation_campaign.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, you draw a card and each opponent discards a card. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 | SubAbility$ DBDiscard SVar:DBDiscard:DB$ Discard | Defined$ Player.Opponent | NumCards$ 1 | Mode$ TgtChoose -T:Mode$ Surveil | ValidPlayer$ You | Execute$ TrigBounce | TriggerZones$ Battlefield | TriggerDescription$ Whenever you surveil, return Disinformation Campaign to its owner's hand. +T:Mode$ Surveil | ValidPlayer$ You | Execute$ TrigBounce | TriggerZones$ Battlefield | TriggerDescription$ Whenever you surveil, return CARDNAME to its owner's hand. SVar:TrigBounce:DB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Defined$ Self Oracle:When Disinformation Campaign enters the battlefield, you draw a card and each opponent discards a card.\nWhenever you surveil, return Disinformation Campaign to its owner's hand. diff --git a/forge-gui/res/cardsfolder/g/guild_summit.txt b/forge-gui/res/cardsfolder/g/guild_summit.txt index 8d3e5aefb68..24608dbed49 100644 --- a/forge-gui/res/cardsfolder/g/guild_summit.txt +++ b/forge-gui/res/cardsfolder/g/guild_summit.txt @@ -6,7 +6,7 @@ SVar:GuestList:DB$ ChooseCard | Defined$ You | MinAmount$ 0 | Amount$ X | Refere SVar:TrigTap:DB$ Tap | Defined$ Remembered | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ Y | SubAbility$ DBCleanup | References$ Y SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:X:Count$Valid Creature.YouCtrl +SVar:X:Count$Valid Gate.untapped+YouCtrl SVar:Y:Remembered$Amount T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Gate.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever a Gate enters the battlefield under your control, draw a card. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 diff --git a/forge-gui/res/cardsfolder/r/ravenous_slime.txt b/forge-gui/res/cardsfolder/r/ravenous_slime.txt index 39d9a888cb1..8714289faff 100644 --- a/forge-gui/res/cardsfolder/r/ravenous_slime.txt +++ b/forge-gui/res/cardsfolder/r/ravenous_slime.txt @@ -6,5 +6,5 @@ K:CantBeBlockedBy Creature.powerLE2 R:Event$ Moved | ActiveZones$ Battlefield | Origin$ Battlefield | Destination$ Graveyard | ValidLKI$ Creature.OppCtrl | ReplaceWith$ Exile | Description$ If a creature an opponent controls would die, instead exile it and put a number of +1/+1 counters equal to that creature's power on CARDNAME. SVar:Exile:DB$ ChangeZone | Defined$ ReplacedCard | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBPutCounter SVar:DBPutCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ X | References$ X | Defined$ Self -SVar:X:ReplacedCard$CardPower +SVar:X:ReplacedCardLKI$CardPower Oracle:Ravenous Slime can't be blocked by creatures with power 2 or less.\nIf a creature an opponent controls would die, instead exile it and put a number of +1/+1 counters equal to that creature's power on Ravenous Slime. diff --git a/forge-gui/res/cardsfolder/t/turntimber_sower.txt b/forge-gui/res/cardsfolder/t/turntimber_sower.txt index b8c871a0564..972f5da9136 100644 --- a/forge-gui/res/cardsfolder/t/turntimber_sower.txt +++ b/forge-gui/res/cardsfolder/t/turntimber_sower.txt @@ -2,7 +2,7 @@ Name:Turntimber Sower ManaCost:2 G Types:Creature Elf Druid PT:3/3 -T:Mode$ ChangesZone | ValidCard$ Land.YouOwn | Origin$ Any | Destination$ Graveyard | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ Whenever one or more land cards are put into your graveyard from anywhere, create a 0/1 green Plant creature token. +T:Mode$ ChangesZone | ValidCard$ Land.YouOwn | Origin$ Any | Destination$ Graveyard | Execute$ TrigToken | OncePerEffect$ True | TriggerZones$ Battlefield | TriggerDescription$ Whenever one or more land cards are put into your graveyard from anywhere, create a 0/1 green Plant creature token. SVar:TrigToken:DB$Token | TokenAmount$ 1 | TokenName$ Plant | TokenTypes$ Creature,Plant | TokenOwner$ You | TokenColors$ Green | TokenPower$ 0 | TokenToughness$ 1 | TokenImage$ g 0 1 plant c18 SVar:RemRandomDeck:True A:AB$ ChangeZone | Cost$ G Sac<3/Creature> | TgtPrompt$ Choose target land card in your graveyard | ValidTgts$ Land.YouCtrl | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target land card from your graveyard to your hand. From 5b295261d742e4572e0efdcd23b70100de191020 Mon Sep 17 00:00:00 2001 From: swordshine Date: Tue, 9 Oct 2018 20:51:00 +0800 Subject: [PATCH 016/901] - Commander Storm cards --- .../main/java/forge/game/card/CardFactoryUtil.java | 6 +++++- .../src/main/java/forge/game/player/Player.java | 8 ++++++++ .../src/main/java/forge/game/zone/MagicStack.java | 3 ++- forge-gui/res/cardsfolder/e/echo_storm.txt | 9 +++++++++ forge-gui/res/cardsfolder/e/empyrial_storm.txt | 8 ++++---- forge-gui/res/cardsfolder/f/fury_storm.txt | 8 ++++++++ forge-gui/res/cardsfolder/g/genesis_storm.txt | 8 ++++++++ forge-gui/res/cardsfolder/s/skull_storm.txt | 13 +++++++++++++ 8 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 forge-gui/res/cardsfolder/e/echo_storm.txt create mode 100644 forge-gui/res/cardsfolder/f/fury_storm.txt create mode 100644 forge-gui/res/cardsfolder/g/genesis_storm.txt create mode 100644 forge-gui/res/cardsfolder/s/skull_storm.txt diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 452f49d69ea..6f0b68c466f 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -842,7 +842,11 @@ public class CardFactoryUtil { // only used by Opal Palace, and it does add the trigger to the card return doXMath(cc.getCommanderCast(c), m, c); } - + + if (l[0].startsWith("TotalCommanderCastFromCommandZone")) { + return doXMath(cc.getTotalCommanderCast(), m, c); + } + if (l[0].startsWith("MostProminentCreatureType")) { String restriction = l[0].split(" ")[1]; CardCollection list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), restriction, cc, c); diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 56415c518bc..e4e5bfe45ce 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -2665,6 +2665,14 @@ public class Player extends GameEntity implements Comparable { commanderCast.put(commander, getCommanderCast(commander) + 1); } + public int getTotalCommanderCast() { + int result = 0; + for (Integer i : commanderCast.values()) { + result += i; + } + return result; + } + public boolean isPlayingExtraTurn() { return isPlayingExtraTrun; } diff --git a/forge-game/src/main/java/forge/game/zone/MagicStack.java b/forge-game/src/main/java/forge/game/zone/MagicStack.java index 357cbfd44de..53e8e676291 100644 --- a/forge-game/src/main/java/forge/game/zone/MagicStack.java +++ b/forge-game/src/main/java/forge/game/zone/MagicStack.java @@ -368,7 +368,8 @@ public class MagicStack /* extends MyObservable */ implements Iterable Date: Tue, 9 Oct 2018 23:10:31 +0800 Subject: [PATCH 017/901] - Updated more scripts --- .../src/main/java/forge/game/cost/CostAdjustment.java | 9 --------- forge-gui/res/cardsfolder/m/myth_unbound.txt | 6 +++--- forge-gui/res/cardsfolder/t/thirsting_axe.txt | 2 +- 3 files changed, 4 insertions(+), 13 deletions(-) diff --git a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java index 455949c58d5..1ad50114869 100644 --- a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java +++ b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java @@ -503,15 +503,6 @@ public class CostAdjustment { if (!sa.isSpell() || !((Spell) sa).isCastFaceDown()) { return false; } - } else if (type.equals("SelfMonstrosity")) { - if (!(sa instanceof AbilityActivated) || !sa.hasParam("Monstrosity") || sa.isTemporary()) { - // Nemesis of Mortals - return false; - } - } else if (type.equals("SelfIntrinsicAbility")) { - if (!(sa instanceof AbilityActivated) || sa.isReplacementAbility() || sa.isTemporary()) { - return false; - } } } if (params.containsKey("AffectedZone")) { diff --git a/forge-gui/res/cardsfolder/m/myth_unbound.txt b/forge-gui/res/cardsfolder/m/myth_unbound.txt index c304efb05e6..3855b57b5b0 100644 --- a/forge-gui/res/cardsfolder/m/myth_unbound.txt +++ b/forge-gui/res/cardsfolder/m/myth_unbound.txt @@ -1,9 +1,9 @@ Name:Myth Unbound ManaCost:2 G Types:Enchantment -S:Mode$ ReduceCost | ValidCard$ Card.IsCommander | Type$ Spell | Amount$ X | EffectZone$ Command | Description$ Your commander costs {1} less to cast for each time it's been cast from the command zone this game. -T:Mode$ ChangesZone | ValidCard$ Card.IsCommander+YouOwn | TriggerZones$ Command | Origin$ Any | Destination$ Command | Execute$ TrigDraw | TriggerDescription$ Whenever your commander is put into the command zone from anywhere, draw a card. +S:Mode$ ReduceCost | ValidCard$ Card.IsCommander+YouOwn | Type$ Spell | Amount$ AffectedX | Description$ Your commander costs {1} less to cast for each time it's been cast from the command zone this game. +T:Mode$ ChangesZoneAll | ValidCard$ Card.IsCommander+YouOwn | Origin$ Any | Destination$ Command | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever your commander is put into the command zone from anywhere, draw a card. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 -SVar:X:Count$CommanderCastFromCommandZone +SVar:AffectedX:Count$CommanderCastFromCommandZone SVar:RemRandomDeck:True Oracle:Your commander costs {1} less to cast for each time it's been cast from the command zone this game.\nWhenever your commander is put into the command zone from anywhere, draw a card. diff --git a/forge-gui/res/cardsfolder/t/thirsting_axe.txt b/forge-gui/res/cardsfolder/t/thirsting_axe.txt index a1b1326de42..cce75513ddd 100644 --- a/forge-gui/res/cardsfolder/t/thirsting_axe.txt +++ b/forge-gui/res/cardsfolder/t/thirsting_axe.txt @@ -3,7 +3,7 @@ ManaCost:3 Types:Artifact Equipment K:Equip:2 S:Mode$ Continuous | Affected$ Card.EquippedBy | AddPower$ 4 | Description$ Equipped creature gets +4/+0. -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | IsPresent$ Card.EquippedBy+notDealtCombatDamageThisTurn Creature | TriggerZone$ Battlefield | Execute$ SacrificeEquippee | TriggerDescription$ At the beginning of your end step, if equipped creature didn't deal combat damage to a creature this turn, sacrifice it. +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | IsPresent$ Card.EquippedBy+notDealtCombatDamageThisTurn Creature | TriggerZones$ Battlefield | Execute$ SacrificeEquippee | TriggerDescription$ At the beginning of your end step, if equipped creature didn't deal combat damage to a creature this turn, sacrifice it. SVar:SacrificeEquippee:DB$ SacrificeAll | Defined$ Equipped SVar:Picture:http://www.wizards.com/global/images/magic/general/thirsting_axe.jpg Oracle:Equipped creature gets +4/+0.\nAt the beginning of your end step, if equipped creature didn't deal combat damage to a creature this turn, sacrifice it.\nEquip {2} From 677ee26e91b1ce3d9dfaee0edb88c64db04dad3c Mon Sep 17 00:00:00 2001 From: "Jamin W. Collins" Date: Tue, 9 Oct 2018 17:35:49 -0600 Subject: [PATCH 018/901] fix Creeping Chill stack description Signed-off-by: Jamin W. Collins --- forge-gui/res/cardsfolder/c/creeping_chill.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/c/creeping_chill.txt b/forge-gui/res/cardsfolder/c/creeping_chill.txt index 48aaddf378e..8f9c247bf82 100644 --- a/forge-gui/res/cardsfolder/c/creeping_chill.txt +++ b/forge-gui/res/cardsfolder/c/creeping_chill.txt @@ -1,7 +1,7 @@ Name:Creeping Chill ManaCost:3 B Types:Sorcery -A:SP$ DamageAll | Cost$ 3 B | ValidPlayers$ Player.Opponent | NumDmg$ 3 | SubAbility$ DBGainLife | SpellDescription$ CARDNAME deals 3 damage to each opponent and you gain 3 life. +A:SP$ DamageAll | StackDescription$ CARDNAME deals 3 damage to each opponent and | Cost$ 3 B | ValidPlayers$ Player.Opponent | NumDmg$ 3 | SubAbility$ DBGainLife | SpellDescription$ CARDNAME deals 3 damage to each opponent and you gain 3 life. T:Mode$ ChangesZone | Origin$ Library | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigExile | OptionalDecider$ You | TriggerDescription$ When CARDNAME is put into your graveyard from your library, you may exile it. If you do, then a opponent and you gain 3 life. SVar:TrigExile:DB$ ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Exile | SubAbility$ DBDamage SVar:DBDamage:DB$ DealDamage | Defined$ Player.Opponent | NumDmg$ 3 | SubAbility$ DBGainLife From a559e05ce4afeb9e7a8cc0dfac1ff9d5454297a6 Mon Sep 17 00:00:00 2001 From: Chris H Date: Mon, 8 Oct 2018 23:35:53 -0400 Subject: [PATCH 019/901] Cross my fingers --- .../java/forge/ai/PlayerControllerAi.java | 3 +- .../src/main/java/forge/game/GameAction.java | 5 ++- .../java/forge/game/ability/AbilityUtils.java | 6 +-- .../java/forge/game/cost/CostPartMana.java | 8 +++- .../java/forge/game/cost/CostPayment.java | 9 +++- .../game/mana/IManaConversionMatrix.java | 11 ----- .../forge/game/mana/ManaConversionMatrix.java | 45 +++++++++++++++++++ .../game/mana/ManaConversionService.java | 36 --------------- .../main/java/forge/game/mana/ManaPool.java | 6 +-- .../forge/game/player/PlayerController.java | 9 +++- .../StaticAbilityContinuous.java | 3 +- .../util/PlayerControllerForTests.java | 3 +- .../input/InputPayManaOfCostPayment.java | 16 ++++++- .../src/main/java/forge/player/HumanPlay.java | 40 ++++++----------- .../forge/player/HumanPlaySpellAbility.java | 18 ++++---- .../forge/player/PlayerControllerHuman.java | 5 ++- 16 files changed, 122 insertions(+), 101 deletions(-) delete mode 100644 forge-game/src/main/java/forge/game/mana/IManaConversionMatrix.java create mode 100644 forge-game/src/main/java/forge/game/mana/ManaConversionMatrix.java delete mode 100644 forge-game/src/main/java/forge/game/mana/ManaConversionService.java diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index e230c7bd04c..9edb07ce59c 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -26,6 +26,7 @@ import forge.game.card.CardPredicates.Presets; import forge.game.combat.Combat; import forge.game.cost.*; import forge.game.mana.Mana; +import forge.game.mana.ManaConversionMatrix; import forge.game.mana.ManaCostBeingPaid; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; @@ -921,7 +922,7 @@ public class PlayerControllerAi extends PlayerController { } @Override - public boolean payManaCost(ManaCost toPay, CostPartMana costPartMana, SpellAbility sa, String prompt /* ai needs hints as well */, boolean isActivatedSa) { + public boolean payManaCost(ManaCost toPay, CostPartMana costPartMana, SpellAbility sa, String prompt /* ai needs hints as well */, ManaConversionMatrix matrix, boolean isActivatedSa) { // TODO Auto-generated method stub ManaCostBeingPaid cost = isActivatedSa ? ComputerUtilMana.calculateManaCost(sa, false, 0) : new ManaCostBeingPaid(toPay); return ComputerUtilMana.payManaCost(cost, sa, player); diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 1ba4cfb501e..076aa493db5 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -29,7 +29,6 @@ import forge.game.ability.effects.AttachEffect; import forge.game.card.*; import forge.game.event.*; import forge.game.keyword.KeywordInterface; -import forge.game.mana.ManaConversionService; import forge.game.player.GameLossReason; import forge.game.player.Player; import forge.game.replacement.ReplacementEffect; @@ -787,7 +786,9 @@ public class GameAction { game.getReplacementHandler().cleanUpTemporaryReplacements(); for (final Player p : game.getPlayers()) { - new ManaConversionService(p.getManaPool()).restoreColorReplacements(); + if (!game.getStack().isFrozen()) { + p.getManaPool().restoreColorReplacements(); + } p.clearStaticAbilities(); } diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index 639e8781377..7f5be63dfd4 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -18,7 +18,7 @@ import forge.game.ability.AbilityFactory.AbilityRecordType; import forge.game.card.*; import forge.game.cost.Cost; import forge.game.keyword.KeywordInterface; -import forge.game.mana.ManaConversionService; +import forge.game.mana.ManaConversionMatrix; import forge.game.mana.ManaCostBeingPaid; import forge.game.player.Player; import forge.game.player.PlayerCollection; @@ -1643,7 +1643,7 @@ public class AbilityUtils { return CardFactoryUtil.xCount(c, s2); } - public static final void applyManaColorConversion(final Player p, final Map params) { + public static final void applyManaColorConversion(ManaConversionMatrix matrix, final Map params) { String conversionType = params.get("ManaColorConversion"); // Choices are Additives(OR) or Restrictive(AND) @@ -1664,7 +1664,7 @@ public class AbilityUtils { } } // AdjustColorReplacement has two different matrices handling final mana conversion under the covers - new ManaConversionService(p.getManaPool()).adjustColorReplacement(ManaAtom.fromName(c), convertByte, additive); + matrix.adjustColorReplacement(ManaAtom.fromName(c), convertByte, additive); } } } diff --git a/forge-game/src/main/java/forge/game/cost/CostPartMana.java b/forge-game/src/main/java/forge/game/cost/CostPartMana.java index 81d94a288e2..1fd0b568131 100644 --- a/forge-game/src/main/java/forge/game/cost/CostPartMana.java +++ b/forge-game/src/main/java/forge/game/cost/CostPartMana.java @@ -19,7 +19,9 @@ package forge.game.cost; import forge.card.mana.ManaCost; import forge.card.mana.ManaCostShard; +import forge.game.mana.ManaConversionMatrix; import forge.game.player.Player; +import forge.game.spellability.AbilityActivated; import forge.game.spellability.SpellAbility; /** @@ -37,6 +39,9 @@ public class CostPartMana extends CostPart { private boolean isEnchantedCreatureCost = false; private final String restriction; + private ManaConversionMatrix cardMatrix = null; + public void setCardMatrix(ManaConversionMatrix mtrx) { cardMatrix = mtrx; } + public int paymentOrder() { return shouldPayLast() ? 200 : 0; } public boolean shouldPayLast() { @@ -147,8 +152,9 @@ public class CostPartMana extends CostPart { // TODO Auto-generated method stub sa.clearManaPaid(); + boolean isActivated = sa instanceof AbilityActivated; // decision not used here, the whole payment is interactive! - return payer.getController().payManaCost(this, sa, null, true); + return payer.getController().payManaCost(this, sa, null, cardMatrix, isActivated); } } diff --git a/forge-game/src/main/java/forge/game/cost/CostPayment.java b/forge-game/src/main/java/forge/game/cost/CostPayment.java index 9785a12a49b..ca002861212 100644 --- a/forge-game/src/main/java/forge/game/cost/CostPayment.java +++ b/forge-game/src/main/java/forge/game/cost/CostPayment.java @@ -21,6 +21,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import forge.game.Game; import forge.game.card.Card; +import forge.game.mana.ManaConversionMatrix; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; @@ -35,7 +36,7 @@ import java.util.Map; * @author Forge * @version $Id$ */ -public class CostPayment { +public class CostPayment extends ManaConversionMatrix { private final Cost cost; private Cost adjustedCost; private final SpellAbility ability; @@ -70,6 +71,7 @@ public class CostPayment { this.cost = cost; this.adjustedCost = cost; this.ability = abil; + restoreColorReplacements(); } /** @@ -137,6 +139,11 @@ public class CostPayment { PaymentDecision pd = part.accept(decisionMaker); + // RIght before we start paying as decided, we need to transfer the CostPayments matrix over? + if (part instanceof CostPartMana) { + ((CostPartMana)part).setCardMatrix(this); + } + if (pd == null || !part.payAsDecided(decisionMaker.getPlayer(), pd, ability)) { game.costPaymentStack.pop(); // cost is resolved return false; diff --git a/forge-game/src/main/java/forge/game/mana/IManaConversionMatrix.java b/forge-game/src/main/java/forge/game/mana/IManaConversionMatrix.java deleted file mode 100644 index 0a047f766d7..00000000000 --- a/forge-game/src/main/java/forge/game/mana/IManaConversionMatrix.java +++ /dev/null @@ -1,11 +0,0 @@ -package forge.game.mana; - -import forge.card.mana.ManaAtom; - -public interface IManaConversionMatrix { - // Conversion matrix ORs byte values to make mana more payable - // Restrictive matrix ANDs byte values to make mana less payable - byte[] colorConversionMatrix = new byte[ManaAtom.MANATYPES.length]; - byte[] colorRestrictionMatrix = new byte[ManaAtom.MANATYPES.length]; - -} diff --git a/forge-game/src/main/java/forge/game/mana/ManaConversionMatrix.java b/forge-game/src/main/java/forge/game/mana/ManaConversionMatrix.java new file mode 100644 index 00000000000..e8caf56d774 --- /dev/null +++ b/forge-game/src/main/java/forge/game/mana/ManaConversionMatrix.java @@ -0,0 +1,45 @@ +package forge.game.mana; + +import forge.card.mana.ManaAtom; + +public class ManaConversionMatrix { + static byte[] identityMatrix = { ManaAtom.WHITE, ManaAtom.BLUE, ManaAtom.BLACK, ManaAtom.RED, ManaAtom.GREEN, ManaAtom.COLORLESS }; + + // Conversion matrix ORs byte values to make mana more payable + // Restrictive matrix ANDs byte values to make mana less payable + byte[] colorConversionMatrix = new byte[ManaAtom.MANATYPES.length]; + byte[] colorRestrictionMatrix = new byte[ManaAtom.MANATYPES.length]; + + public void adjustColorReplacement(byte originalColor, byte replacementColor, boolean additive) { + // Fix the index without hardcodes + int rowIdx = ManaAtom.getIndexOfFirstManaType(originalColor); + rowIdx = rowIdx < 0 ? identityMatrix.length - 1 : rowIdx; + if (additive) { + colorConversionMatrix[rowIdx] |= replacementColor; + } + else { + colorRestrictionMatrix[rowIdx] &= replacementColor; + } + } + + public void applyCardMatrix(ManaConversionMatrix extraMatrix) { + for (int i = 0; i < colorConversionMatrix.length; i++) { + colorConversionMatrix[i] |= extraMatrix.colorConversionMatrix[i]; + } + + for (int i = 0; i < colorRestrictionMatrix.length; i++) { + colorRestrictionMatrix[i] &= extraMatrix.colorRestrictionMatrix[i]; + } + } + + public void restoreColorReplacements() { + // By default each color can only be paid by itself ( {G} -> {G}, {C} -> {C} + for (int i = 0; i < colorConversionMatrix.length; i++) { + colorConversionMatrix[i] = identityMatrix[i]; + } + // By default all mana types are unrestricted + for (int i = 0; i < colorRestrictionMatrix.length; i++) { + colorRestrictionMatrix[i] = ManaAtom.ALL_MANA_TYPES; + } + } +} \ No newline at end of file diff --git a/forge-game/src/main/java/forge/game/mana/ManaConversionService.java b/forge-game/src/main/java/forge/game/mana/ManaConversionService.java deleted file mode 100644 index 513d47cd5db..00000000000 --- a/forge-game/src/main/java/forge/game/mana/ManaConversionService.java +++ /dev/null @@ -1,36 +0,0 @@ -package forge.game.mana; - -import forge.card.mana.ManaAtom; - -public class ManaConversionService { - static byte[] identityMatrix = { ManaAtom.WHITE, ManaAtom.BLUE, ManaAtom.BLACK, ManaAtom.RED, ManaAtom.GREEN, ManaAtom.COLORLESS }; - - IManaConversionMatrix matrix; - - public ManaConversionService(IManaConversionMatrix mtrx) { - matrix = mtrx; - } - - public void adjustColorReplacement(byte originalColor, byte replacementColor, boolean additive) { - // Fix the index without hardcodes - int rowIdx = ManaAtom.getIndexOfFirstManaType(originalColor); - rowIdx = rowIdx < 0 ? identityMatrix.length - 1 : rowIdx; - if (additive) { - matrix.colorConversionMatrix[rowIdx] |= replacementColor; - } - else { - matrix.colorRestrictionMatrix[rowIdx] &= replacementColor; - } - } - - public void restoreColorReplacements() { - // By default each color can only be paid by itself ( {G} -> {G}, {C} -> {C} - for (int i = 0; i < matrix.colorConversionMatrix.length; i++) { - matrix.colorConversionMatrix[i] = identityMatrix[i]; - } - // By default all mana types are unrestricted - for (int i = 0; i < matrix.colorRestrictionMatrix.length; i++) { - matrix.colorRestrictionMatrix[i] = ManaAtom.ALL_MANA_TYPES; - } - } -} diff --git a/forge-game/src/main/java/forge/game/mana/ManaPool.java b/forge-game/src/main/java/forge/game/mana/ManaPool.java index 0b0c4f3924c..de59a57ef21 100644 --- a/forge-game/src/main/java/forge/game/mana/ManaPool.java +++ b/forge-game/src/main/java/forge/game/mana/ManaPool.java @@ -47,13 +47,13 @@ import java.util.*; * @author Forge * @version $Id$ */ -public class ManaPool implements Iterable, IManaConversionMatrix { +public class ManaPool extends ManaConversionMatrix implements Iterable { private final Player owner; private final Multimap floatingMana = ArrayListMultimap.create(); public ManaPool(final Player player) { owner = player; - new ManaConversionService(this).restoreColorReplacements(); + restoreColorReplacements(); } public final int getAmountOfColor(final byte color) { @@ -352,7 +352,7 @@ public class ManaPool implements Iterable, IManaConversionMatrix { public byte getPossibleColorUses(byte color) { // Take the current conversion value, AND with restrictions to get mana usage int rowIdx = ManaAtom.getIndexOfFirstManaType(color); - int matrixIdx = rowIdx < 0 ? ManaConversionService.identityMatrix.length - 1 : rowIdx; + int matrixIdx = rowIdx < 0 ? identityMatrix.length - 1 : rowIdx; byte colorUse = colorConversionMatrix[matrixIdx]; colorUse &= colorRestrictionMatrix[matrixIdx]; diff --git a/forge-game/src/main/java/forge/game/player/PlayerController.java b/forge-game/src/main/java/forge/game/player/PlayerController.java index adc6bd77754..f603e7656e4 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerController.java +++ b/forge-game/src/main/java/forge/game/player/PlayerController.java @@ -20,6 +20,7 @@ import forge.game.cost.Cost; import forge.game.cost.CostPart; import forge.game.cost.CostPartMana; import forge.game.mana.Mana; +import forge.game.mana.ManaConversionMatrix; import forge.game.replacement.ReplacementEffect; import forge.game.spellability.*; import forge.game.trigger.WrappedAbility; @@ -220,9 +221,13 @@ public abstract class PlayerController { public abstract void resetAtEndOfTurn(); // currently used by the AI to perform card memory cleanup public final boolean payManaCost(CostPartMana costPartMana, SpellAbility sa, String prompt, boolean isActivatedAbility) { - return payManaCost(costPartMana.getManaCostFor(sa), costPartMana, sa, prompt, isActivatedAbility); + return payManaCost(costPartMana, sa, prompt, null, isActivatedAbility); } - public abstract boolean payManaCost(ManaCost toPay, CostPartMana costPartMana, SpellAbility sa, String prompt, boolean isActivatedAbility); + + public final boolean payManaCost(CostPartMana costPartMana, SpellAbility sa, String prompt, ManaConversionMatrix matrix, boolean isActivatedAbility) { + return payManaCost(costPartMana.getManaCostFor(sa), costPartMana, sa, prompt, matrix, isActivatedAbility); + } + public abstract boolean payManaCost(ManaCost toPay, CostPartMana costPartMana, SpellAbility sa, String prompt, ManaConversionMatrix matrix, boolean isActivatedAbility); public abstract Map chooseCardsForConvokeOrImprovise(SpellAbility sa, ManaCost manaCost, CardCollectionView untappedCards, boolean improvise); diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java index 30cf2ca1749..63e71ca52a1 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java @@ -41,7 +41,6 @@ import forge.game.trigger.Trigger; import forge.game.trigger.TriggerHandler; import forge.game.zone.ZoneType; import forge.util.TextUtil; - import org.apache.commons.lang3.StringUtils; import java.util.*; @@ -481,7 +480,7 @@ public final class StaticAbilityContinuous { } if (params.containsKey("ManaColorConversion")) { - AbilityUtils.applyManaColorConversion(p, params); + AbilityUtils.applyManaColorConversion(p.getManaPool(), params); } } } diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java index 4b0afe447b1..80e3e033579 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java @@ -30,6 +30,7 @@ import forge.game.cost.Cost; import forge.game.cost.CostPart; import forge.game.cost.CostPartMana; import forge.game.mana.Mana; +import forge.game.mana.ManaConversionMatrix; import forge.game.mana.ManaCostBeingPaid; import forge.game.player.*; import forge.game.replacement.ReplacementEffect; @@ -591,7 +592,7 @@ public class PlayerControllerForTests extends PlayerController { } @Override - public boolean payManaCost(ManaCost toPay, CostPartMana costPartMana, SpellAbility sa, String prompt /* ai needs hints as well */, boolean isActivatedSa ) { + public boolean payManaCost(ManaCost toPay, CostPartMana costPartMana, SpellAbility sa, String prompt /* ai needs hints as well */, ManaConversionMatrix matrix, boolean isActivatedSa) { // TODO Auto-generated method stub ManaCostBeingPaid cost = new ManaCostBeingPaid(toPay); return ComputerUtilMana.payManaCost(cost, sa, player); diff --git a/forge-gui/src/main/java/forge/match/input/InputPayManaOfCostPayment.java b/forge-gui/src/main/java/forge/match/input/InputPayManaOfCostPayment.java index 1f3fba6da55..15da37980f1 100644 --- a/forge-gui/src/main/java/forge/match/input/InputPayManaOfCostPayment.java +++ b/forge-gui/src/main/java/forge/match/input/InputPayManaOfCostPayment.java @@ -1,6 +1,7 @@ package forge.match.input; import forge.game.card.Card; +import forge.game.mana.ManaConversionMatrix; import forge.game.mana.ManaCostBeingPaid; import forge.game.player.Player; import forge.game.spellability.SpellAbility; @@ -10,13 +11,16 @@ import forge.properties.ForgePreferences; import forge.util.ITriggerEvent; public class InputPayManaOfCostPayment extends InputPayMana { - public InputPayManaOfCostPayment(final PlayerControllerHuman controller, ManaCostBeingPaid cost, SpellAbility spellAbility, Player payer) { + public InputPayManaOfCostPayment(final PlayerControllerHuman controller, ManaCostBeingPaid cost, SpellAbility spellAbility, Player payer, ManaConversionMatrix matrix) { super(controller, spellAbility, payer); manaCost = cost; + extraMatrix = matrix; + applyMatrix(); } private static final long serialVersionUID = 3467312982164195091L; private int phyLifeToLose = 0; + private ManaConversionMatrix extraMatrix; @Override protected final void onPlayerSelected(Player selected, final ITriggerEvent triggerEvent) { @@ -47,6 +51,8 @@ public class InputPayManaOfCostPayment extends InputPayMana { final String displayMana = manaCost.toString(false, player.getManaPool()); final StringBuilder msg = new StringBuilder(); + applyMatrix(); + if (messagePrefix != null) { msg.append(messagePrefix).append("\n"); } @@ -71,4 +77,12 @@ public class InputPayManaOfCostPayment extends InputPayMana { return msg.toString(); } + + private void applyMatrix() { + if (extraMatrix == null) { + return; + } + + player.getManaPool().applyCardMatrix(extraMatrix); + } } diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index fd96df17d56..8e7b84f42e3 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -1,21 +1,8 @@ package forge.player; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import forge.game.cost.*; -import forge.game.spellability.LandAbility; -import forge.game.spellability.OptionalCostValue; -import forge.game.spellability.Spell; -import forge.util.TextUtil; -import org.apache.commons.lang3.StringUtils; - import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.common.collect.Maps; - import forge.FThreads; import forge.card.mana.ManaCost; import forge.game.Game; @@ -25,30 +12,31 @@ import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; import forge.game.ability.effects.CharmEffect; import forge.game.ability.effects.FlipCoinEffect; -import forge.game.card.Card; -import forge.game.card.CardCollection; -import forge.game.card.CardCollectionView; -import forge.game.card.CardDamageMap; -import forge.game.card.CardLists; -import forge.game.card.CardPredicates; +import forge.game.card.*; import forge.game.card.CardPredicates.Presets; -import forge.game.card.CardView; -import forge.game.card.CounterType; +import forge.game.cost.*; +import forge.game.mana.ManaConversionMatrix; import forge.game.mana.ManaCostBeingPaid; import forge.game.player.Player; import forge.game.player.PlayerController; import forge.game.player.PlayerView; -import forge.game.spellability.SpellAbility; -import forge.game.spellability.TargetRestrictions; +import forge.game.spellability.*; import forge.game.trigger.TriggerType; import forge.game.zone.ZoneType; import forge.match.input.InputPayMana; import forge.match.input.InputPayManaOfCostPayment; import forge.match.input.InputPayManaSimple; import forge.match.input.InputSelectCardsFromList; -import forge.util.collect.FCollectionView; import forge.util.Lang; +import forge.util.TextUtil; +import forge.util.collect.FCollectionView; import forge.util.gui.SGuiChoose; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; public class HumanPlay { @@ -814,7 +802,7 @@ public class HumanPlay { return !manaInputCancelled; } - public static boolean payManaCost(final PlayerControllerHuman controller, final ManaCost realCost, final CostPartMana mc, final SpellAbility ability, final Player activator, String prompt, boolean isActivatedSa) { + public static boolean payManaCost(final PlayerControllerHuman controller, final ManaCost realCost, final CostPartMana mc, final SpellAbility ability, final Player activator, String prompt, ManaConversionMatrix matrix, boolean isActivatedSa) { final Card source = ability.getHostCard(); ManaCostBeingPaid toPay = new ManaCostBeingPaid(realCost, mc.getRestiction()); @@ -879,7 +867,7 @@ public class HumanPlay { } if (!toPay.isPaid()) { // Input is somehow clearing out the offering card? - inpPayment = new InputPayManaOfCostPayment(controller, toPay, ability, activator); + inpPayment = new InputPayManaOfCostPayment(controller, toPay, ability, activator, matrix); inpPayment.setMessagePrefix(prompt); inpPayment.showAndWait(); if (!inpPayment.isPaid()) { diff --git a/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java b/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java index 02b4bf64ea8..c349a80de42 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java +++ b/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java @@ -32,7 +32,6 @@ import forge.game.cost.CostPart; import forge.game.cost.CostPartMana; import forge.game.cost.CostPayment; import forge.game.keyword.KeywordInterface; -import forge.game.mana.ManaConversionService; import forge.game.mana.ManaPool; import forge.game.player.Player; import forge.game.player.PlayerController; @@ -76,7 +75,6 @@ public class HumanPlaySpellAbility { final Card c = ability.getHostCard(); final CardPlayOption option = c.mayPlay(ability.getMayPlay()); - ManaConversionService service = new ManaConversionService(manapool); boolean manaTypeConversion = false; boolean manaColorConversion = false; @@ -118,13 +116,15 @@ public class HumanPlaySpellAbility { ability.resetPaidHash(); } + // TODO Apply this to the SAStackInstance instead of the Player if (manaTypeConversion) { - AbilityUtils.applyManaColorConversion(human, MagicColor.Constant.ANY_TYPE_CONVERSION); + AbilityUtils.applyManaColorConversion(payment, MagicColor.Constant.ANY_TYPE_CONVERSION); } else if (manaColorConversion) { - AbilityUtils.applyManaColorConversion(human, MagicColor.Constant.ANY_COLOR_CONVERSION); + AbilityUtils.applyManaColorConversion(payment, MagicColor.Constant.ANY_COLOR_CONVERSION); } + if (playerManaConversion) { - AbilityUtils.applyManaColorConversion(human, MagicColor.Constant.ANY_COLOR_CONVERSION); + AbilityUtils.applyManaColorConversion(manapool, MagicColor.Constant.ANY_COLOR_CONVERSION); human.incNumManaConversion(); } @@ -142,7 +142,7 @@ public class HumanPlaySpellAbility { } if (keywordColor) { - AbilityUtils.applyManaColorConversion(human, params); + AbilityUtils.applyManaColorConversion(payment, params); } } @@ -167,10 +167,10 @@ public class HumanPlaySpellAbility { } if (manaTypeConversion || manaColorConversion || keywordColor) { - service.restoreColorReplacements(); + manapool.restoreColorReplacements(); } if (playerManaConversion) { - service.restoreColorReplacements(); + manapool.restoreColorReplacements(); human.decNumManaConversion(); } return false; @@ -193,7 +193,7 @@ public class HumanPlaySpellAbility { clearTargets(ability); } if (manaTypeConversion || manaColorConversion || keywordColor) { - service.restoreColorReplacements(); + manapool.restoreColorReplacements(); } } return true; diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index e7d05e729a2..4f12d185493 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -31,6 +31,7 @@ import forge.game.cost.CostPart; import forge.game.cost.CostPartMana; import forge.game.keyword.Keyword; import forge.game.mana.Mana; +import forge.game.mana.ManaConversionMatrix; import forge.game.player.*; import forge.game.replacement.ReplacementEffect; import forge.game.replacement.ReplacementLayer; @@ -1745,8 +1746,8 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont @Override public boolean payManaCost(final ManaCost toPay, final CostPartMana costPartMana, final SpellAbility sa, - final String prompt, final boolean isActivatedSa) { - return HumanPlay.payManaCost(this, toPay, costPartMana, sa, player, prompt, isActivatedSa); + final String prompt, ManaConversionMatrix matrix, final boolean isActivatedSa) { + return HumanPlay.payManaCost(this, toPay, costPartMana, sa, player, prompt, matrix, isActivatedSa); } @Override From f7555d6d2a44cd8ddf00079c0db3d71e803761a4 Mon Sep 17 00:00:00 2001 From: swordshine Date: Wed, 10 Oct 2018 10:08:59 +0800 Subject: [PATCH 020/901] - Fixed Enchanter's Bane --- forge-gui/res/cardsfolder/e/enchanters_bane.txt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/e/enchanters_bane.txt b/forge-gui/res/cardsfolder/e/enchanters_bane.txt index 2033cd0b195..4ce6a84073c 100644 --- a/forge-gui/res/cardsfolder/e/enchanters_bane.txt +++ b/forge-gui/res/cardsfolder/e/enchanters_bane.txt @@ -1,7 +1,11 @@ Name:Enchanter's Bane ManaCost:1 R Types:Enchantment -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of your end step, target enchantment deals damage equal to its converted mana cost to its controller unless that player sacrifices it. -SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | NumDmg$ X | UnlessCost$ Sacrifice | UnlessPayer$ TargetedController | UnlessAI$ WhenPaid | References$ X -SVar:X:Targeted$CardManaCost +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigTarget | TriggerDescription$ At the beginning of your end step, target enchantment deals damage equal to its converted mana cost to its controller unless that player sacrifices it. +SVar:TrigTarget:DB$ Pump | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | IsCurse$ True | ImprintCards$ Targeted | SubAbility$ DBSac +SVar:DBSac:DB$ Sacrifice | Defined$ TargetedController | SacValid$ TargetedCard.Self | Optional$ True | RememberSacrificed$ True | SubAbility$ TrigDamage +SVar:TrigDamage:DB$ DealDamage | NumDmg$ X | Defined$ ImprintedController | DamageSource$ Imprinted | References$ X,Y | ConditionCheckSVar$ Y | ConditionSVarCompare$ EQ0 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True +SVar:Y:Remembered$Amount +SVar:X:Imprinted$CardManaCost Oracle:At the beginning of your end step, target enchantment deals damage equal to its converted mana cost to its controller unless that player sacrifices it. From 2dd4cc839ee80334bc448126134b13cf7f6244bb Mon Sep 17 00:00:00 2001 From: swordshine Date: Wed, 10 Oct 2018 12:21:12 +0800 Subject: [PATCH 021/901] Added Isolated Watchtower --- forge-gui/res/cardsfolder/t/tectonic_edge.txt | 3 ++- .../res/cardsfolder/upcoming/isolated_watchtower.txt | 9 +++++++++ forge-gui/res/cardsfolder/w/weathered_wayfarer.txt | 5 +++-- 3 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/isolated_watchtower.txt diff --git a/forge-gui/res/cardsfolder/t/tectonic_edge.txt b/forge-gui/res/cardsfolder/t/tectonic_edge.txt index 7e2c2ca78a9..d0a9c80fbfb 100644 --- a/forge-gui/res/cardsfolder/t/tectonic_edge.txt +++ b/forge-gui/res/cardsfolder/t/tectonic_edge.txt @@ -2,7 +2,8 @@ Name:Tectonic Edge ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. -A:AB$ Destroy | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target nonbasic land. | Cost$ 1 T Sac<1/CARDNAME> | IsPresent$ Land.OppCtrl | PresentCompare$ GE4 | AILogic$ LandForLand | SpellDescription$ Destroy target nonbasic land. Activate this ability only if an opponent controls four or more lands. +A:AB$ Destroy | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target nonbasic land. | Cost$ 1 T Sac<1/CARDNAME> | CheckSVar$ X | SVarCompare$ GE4 | References$ X | AILogic$ LandForLand | SpellDescription$ Destroy target nonbasic land. Activate this ability only if an opponent controls four or more lands. +SVar:X:PlayerCountOpponents$HighestValid Land.YouCtrl SVar:RemRandomDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/tectonic_edge.jpg Oracle:{T}: Add {C}.\n{1}, {T}, Sacrifice Tectonic Edge: Destroy target nonbasic land. Activate this ability only if an opponent controls four or more lands. diff --git a/forge-gui/res/cardsfolder/upcoming/isolated_watchtower.txt b/forge-gui/res/cardsfolder/upcoming/isolated_watchtower.txt new file mode 100644 index 00000000000..a4c4749c084 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/isolated_watchtower.txt @@ -0,0 +1,9 @@ +Name:Isolated Watchtower +ManaCost:no cost +Types:Land +A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. +A:AB$ Scry | Cost$ 2 T | ScryNum$ 1 | SubAbility$ DBReveal | CheckSVar$ X | SVarCompare$ GEY | References$ X,Y | SpellDescription$ Scry 1, then you may reveal the top card of your library. If a basic land card is revealed this way, put it onto the battlefield tapped. Activate this ability only if an opponent controls at least two more lands than you. +SVar:DBReveal:DB$ Dig | Optional$ True | DigNum$ 1 | Reveal$ True | ChangeValid$ Land.Basic | DestinationZone$ Battlefield | Tapped$ True | DestinationZone2$ Library | LibraryPosition2$ 0 +SVar:X:PlayerCountOpponents$HighestValid Land.YouCtrl +SVar:Y:Count$Valid Land.YouCtrl/Plus.2 +Oracle:{T}: Add {C}.\n{2}, {T}: Scry 1, then you may reveal the top card of your library. If a basic land card is revealed this way, put it onto the battlefield tapped. Activate this ability only if an opponent controls at least two more lands than you. diff --git a/forge-gui/res/cardsfolder/w/weathered_wayfarer.txt b/forge-gui/res/cardsfolder/w/weathered_wayfarer.txt index aee88cebe0f..4d06df624fc 100644 --- a/forge-gui/res/cardsfolder/w/weathered_wayfarer.txt +++ b/forge-gui/res/cardsfolder/w/weathered_wayfarer.txt @@ -2,7 +2,8 @@ Name:Weathered Wayfarer ManaCost:W Types:Creature Human Nomad Cleric PT:1/1 -A:AB$ ChangeZone | Cost$ W T | Origin$ Library | Destination$ Hand | ChangeType$ Land | ChangeNum$ 1 | IsPresent$ Land.OppCtrl | PresentCompare$ GTX | References$ X | SpellDescription$ Search your library for a land card, reveal it, put it into your hand, then shuffle your library. Activate this ability only if an opponent controls more lands than you. -SVar:X:Count$Valid Land.YouCtrl +A:AB$ ChangeZone | Cost$ W T | Origin$ Library | Destination$ Hand | ChangeType$ Land | ChangeNum$ 1 | CheckSVar$ X | SVarCompare$ GTY | References$ X,Y | SpellDescription$ Search your library for a land card, reveal it, put it into your hand, then shuffle your library. Activate this ability only if an opponent controls more lands than you. +SVar:X:PlayerCountOpponents$HighestValid Land.YouCtrl +SVar:Y:Count$Valid Land.YouCtrl SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83311.jpg Oracle:{W}, {T}: Search your library for a land card, reveal it, put it into your hand, then shuffle your library. Activate this ability only if an opponent controls more lands than you. From 5210ad0a2afb924b84adfb4ff2392e3ddea1d0e9 Mon Sep 17 00:00:00 2001 From: swordshine Date: Wed, 10 Oct 2018 12:27:08 +0800 Subject: [PATCH 022/901] Added Geode Golem --- forge-gui/res/cardsfolder/g/geode_golem .txt | 8 ++++++++ .../cardsfolder/{upcoming => i}/isolated_watchtower.txt | 0 2 files changed, 8 insertions(+) create mode 100644 forge-gui/res/cardsfolder/g/geode_golem .txt rename forge-gui/res/cardsfolder/{upcoming => i}/isolated_watchtower.txt (100%) diff --git a/forge-gui/res/cardsfolder/g/geode_golem .txt b/forge-gui/res/cardsfolder/g/geode_golem .txt new file mode 100644 index 00000000000..81410cd0ff4 --- /dev/null +++ b/forge-gui/res/cardsfolder/g/geode_golem .txt @@ -0,0 +1,8 @@ +Name:Geode Golem +ManaCost:5 +Types:Artifact Creature Golem +PT:5/3 +K:Trample +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigPlay | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may cast your commander from the command zone without paying its mana cost. (You still pay any additional costs.) +SVar:TrigPlay:DB$ Play | Valid$ Card.IsCommander+YouOwn | ValidZone$ Command | WithoutManaCost$ True | Optional$ True +Oracle:Trample\nWhenever Geode Golem deals combat damage to a player, you may cast your commander from the command zone without paying its mana cost. (You still pay any additional costs.) diff --git a/forge-gui/res/cardsfolder/upcoming/isolated_watchtower.txt b/forge-gui/res/cardsfolder/i/isolated_watchtower.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/isolated_watchtower.txt rename to forge-gui/res/cardsfolder/i/isolated_watchtower.txt From 5589b4a70bda13f6194e4363bac90368ba707f68 Mon Sep 17 00:00:00 2001 From: swordshine Date: Wed, 10 Oct 2018 18:43:07 +0800 Subject: [PATCH 023/901] - Added some cards --- .../java/forge/game/ability/effects/ManaEffect.java | 2 +- forge-gui/res/cardsfolder/a/azra_bladeseeker.txt | 8 ++++++++ forge-gui/res/cardsfolder/c/cheering_fanatic.txt | 10 ++++++++++ forge-gui/res/cardsfolder/s/sentinel_tower.txt | 7 +++++++ forge-gui/res/cardsfolder/s/stadium_vendors.txt | 9 +++++++++ forge-gui/res/cardsfolder/v/victory_chimes.txt | 2 +- 6 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 forge-gui/res/cardsfolder/a/azra_bladeseeker.txt create mode 100644 forge-gui/res/cardsfolder/c/cheering_fanatic.txt create mode 100644 forge-gui/res/cardsfolder/s/sentinel_tower.txt create mode 100644 forge-gui/res/cardsfolder/s/stadium_vendors.txt diff --git a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java index 5a1b9970375..7c598f302f0 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java @@ -121,7 +121,7 @@ public class ManaEffect extends SpellAbilityEffect { mask |= MagicColor.fromName(colorsNeeded.charAt(nChar)); } colorMenu = mask == 0 ? ColorSet.ALL_COLORS : ColorSet.fromMask(mask); - byte val = act.getController().chooseColor("Select Mana to Produce", sa, colorMenu); + byte val = p.getController().chooseColor("Select Mana to Produce", sa, colorMenu); if (0 == val) { throw new RuntimeException("ManaEffect::resolve() /*any mana*/ - " + act + " color mana choice is empty for " + card.getName()); } diff --git a/forge-gui/res/cardsfolder/a/azra_bladeseeker.txt b/forge-gui/res/cardsfolder/a/azra_bladeseeker.txt new file mode 100644 index 00000000000..e128d0ea276 --- /dev/null +++ b/forge-gui/res/cardsfolder/a/azra_bladeseeker.txt @@ -0,0 +1,8 @@ +Name:Azra Bladeseeker +ManaCost:2 R +Types:Creature Azra Warrior +PT:3/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExploration | TriggerDescription$ When CARDNAME enters the battlefield, each player on your team may discard a card, then each player who discarded a card this way draws a card. +SVar:TrigExploration:DB$ RepeatEach | RepeatPlayers$ Player.YourTeam | RepeatSubAbility$ DBDiscardToDraw +SVar:DBDiscardToDraw:DB$ Draw | Defined$ Player.IsRemembered | UnlessCost$ Discard<1/Card> | UnlessPayer$ Player.IsRemembered | UnlessSwitched$ True +Oracle:When Azra Bladeseeker enters the battlefield, each player on your team may discard a card, then each player who discarded a card this way draws a card. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/c/cheering_fanatic.txt b/forge-gui/res/cardsfolder/c/cheering_fanatic.txt new file mode 100644 index 00000000000..e3fc1779b3f --- /dev/null +++ b/forge-gui/res/cardsfolder/c/cheering_fanatic.txt @@ -0,0 +1,10 @@ +Name:Cheering Fanatic +ManaCost:1 R +Types:Creature Goblin +PT:2/2 +T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigNameCard | TriggerDescription$ Whenever CARDNAME attacks, choose a card name. Spells with the chosen name cost {1} less to cast this turn. +SVar:TrigNameCard:DB$ NameCard | Defined$ You | SubAbility$ DBEffect +SVar:DBEffect:DB$ Effect | StaticAbilities$ CFReduceCost +SVar:CFReduceCost:Mode$ ReduceCost | EffectZone$ Command | ValidCard$ Card.NamedCard | Type$ Spell | Amount$ 1 | Description$ Spells with the chosen name cost {1} less to cast this turn. +SVar:RemAIDeck:True +Oracle:Whenever Cheering Fanatic attacks, choose a card name. Spells with the chosen name cost {1} less to cast this turn. diff --git a/forge-gui/res/cardsfolder/s/sentinel_tower.txt b/forge-gui/res/cardsfolder/s/sentinel_tower.txt new file mode 100644 index 00000000000..50f305c32d6 --- /dev/null +++ b/forge-gui/res/cardsfolder/s/sentinel_tower.txt @@ -0,0 +1,7 @@ +Name:Sentinel Tower +ManaCost:4 +Types:Artifact +T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | Execute$ TrigDmg | TriggerZones$ Battlefield | TriggerDescription$ Whenever an instant or sorcery spell is cast during your turn, CARDNAME deals damage to any target equal to 1 plus the number of instant and sorcery spells cast before that spell this turn. +SVar:TrigDmg:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X +SVar:X:TriggerObjectsCurrentCastSpells$Valid Sorcery,Instant +Oracle:Whenever an instant or sorcery spell is cast during your turn, Sentinel Tower deals damage to any target equal to 1 plus the number of instant and sorcery spells cast before that spell this turn. diff --git a/forge-gui/res/cardsfolder/s/stadium_vendors.txt b/forge-gui/res/cardsfolder/s/stadium_vendors.txt new file mode 100644 index 00000000000..25c391bdac9 --- /dev/null +++ b/forge-gui/res/cardsfolder/s/stadium_vendors.txt @@ -0,0 +1,9 @@ +Name:Stadium Vendors +ManaCost:3 R +Types:Creature Goblin +PT:3/3 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChoosePlayer | TriggerDescription$ When CARDNAME enters the battlefield, choose a player. That player adds two mana of any one color they choose. +SVar:TrigChoosePlayer:DB$ ChoosePlayer | Defined$ You | Choices$ Player | ChoiceTitle$ Choose a player | AILogic$ Pump | SubAbility$ DBMana +SVar:DBMana:DB$ Mana | Produced$ Any | Defined$ ChosenPlayer | Amount$ 2 +Oracle:When Stadium Vendors enters the battlefield, choose a player. That player adds two mana of any one color they choose. diff --git a/forge-gui/res/cardsfolder/v/victory_chimes.txt b/forge-gui/res/cardsfolder/v/victory_chimes.txt index 308d832d7cb..f35a0eadea7 100644 --- a/forge-gui/res/cardsfolder/v/victory_chimes.txt +++ b/forge-gui/res/cardsfolder/v/victory_chimes.txt @@ -3,5 +3,5 @@ ManaCost:3 Types:Artifact K:CARDNAME untaps during each other player's untap step. A:AB$ ChoosePlayer | Cost$ T | Defined$ You | Choices$ Player | ChoiceTitle$ Choose an player | SubAbility$ DBMana | SpellDescription$ Choose a player. That player adds one mana of any color they choose. -SVar:DBMana:DB$ Mana | Produced$ Any | Defined$ ChosenPlayer +SVar:DBMana:DB$ Mana | Produced$ C | Defined$ ChosenPlayer Oracle:Untap Victory Chimes during each other player's untap step.\n{T}: A player of your choice adds {C}. From d76aa634c91b328a726aaea49e9179ebb65002ec Mon Sep 17 00:00:00 2001 From: Hanmac Date: Thu, 11 Oct 2018 08:09:48 +0200 Subject: [PATCH 024/901] CloneEffect: now with NewName and GainThisAbility --- .../main/java/forge/game/CardTraitBase.java | 2 +- .../game/ability/effects/CloneEffect.java | 20 +++++++++++++++++++ .../game/replacement/ReplacementHandler.java | 5 +++-- .../forge/game/spellability/SpellAbility.java | 20 +++++++++++++++++++ .../forge/game/trigger/WrappedAbility.java | 12 +++++------ 5 files changed, 50 insertions(+), 9 deletions(-) diff --git a/forge-game/src/main/java/forge/game/CardTraitBase.java b/forge-game/src/main/java/forge/game/CardTraitBase.java index 59c47275a5d..aacc1d389e1 100644 --- a/forge-game/src/main/java/forge/game/CardTraitBase.java +++ b/forge-game/src/main/java/forge/game/CardTraitBase.java @@ -62,7 +62,7 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView { * Keys that should not changed */ private static final ImmutableList noChangeKeys = ImmutableList.builder() - .add("TokenScript", "LegacyImage", "TokenImage").build(); + .add("TokenScript", "LegacyImage", "TokenImage", "NewName").build(); /** * Sets the temporary. * diff --git a/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java index aa0ab0f4215..0dccc07d374 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java @@ -113,6 +113,7 @@ public class CloneEffect extends SpellAbilityEffect { } final boolean keepName = sa.hasParam("KeepName"); + final String newName = sa.getParamOrDefault("NewName", null); final String originalName = tgtCard.getName(); final boolean copyingSelf = (tgtCard == cardToCopy); final boolean isTransformed = cardToCopy.getCurrentStateName() == CardStateName.Transformed || cardToCopy.getCurrentStateName() == CardStateName.Meld; @@ -157,9 +158,13 @@ public class CloneEffect extends SpellAbilityEffect { } // restore name if it should be unchanged + // this should only be used for Sakashima the Impostor Avatar if (keepName) { tgtCard.setName(originalName); } + if (newName != null) { + tgtCard.setName(newName); + } // If target is a flip card, also set characteristics of the flipped // state. @@ -168,6 +173,9 @@ public class CloneEffect extends SpellAbilityEffect { if (keepName) { flippedState.setName(originalName); } + if (newName != null) { + tgtCard.setName(newName); + } //keep the Clone card image for the cloned card flippedState.setImageKey(imageFileName); } @@ -350,6 +358,18 @@ public class CloneEffect extends SpellAbilityEffect { tgtCard.setBasePower(4); tgtCard.setBaseToughness(4); } + + if (sa.hasParam("GainThisAbility")) { + SpellAbility root = sa.getRootAbility(); + + if (root.isTrigger() && root.getTrigger() != null) { + tgtCard.addTrigger(root.getTrigger().copy(tgtCard, false)); + } else if (root.isReplacementAbility()) { + tgtCard.addReplacementEffect(root.getReplacementEffect().copy(tgtCard, false)); + } else { + tgtCard.addSpellAbility(root.copy(tgtCard, false)); + } + } } } diff --git a/forge-game/src/main/java/forge/game/replacement/ReplacementHandler.java b/forge-game/src/main/java/forge/game/replacement/ReplacementHandler.java index b1843c1850d..f08e0b660a7 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplacementHandler.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplacementHandler.java @@ -181,7 +181,7 @@ public class ReplacementHandler { final String effectAbString = host.getSVar(effectSVar); // TODO: the source of replacement effect should be the source of the original effect effectSA = AbilityFactory.getAbility(effectAbString, host); - effectSA.setTrigger(true); + //effectSA.setTrigger(true); SpellAbility tailend = effectSA; do { @@ -209,8 +209,9 @@ public class ReplacementHandler { if (replacementEffect.isIntrinsic()) { effectSA.setIntrinsic(true); effectSA.changeText(); - effectSA.setReplacementAbility(true); } + effectSA.setReplacementAbility(true); + effectSA.setReplacementEffect(replacementEffect); } // Decider gets to choose whether or not to apply the replacement. diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index 9eddd745b4a..3e866b91fb1 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -38,7 +38,9 @@ import forge.game.cost.CostRemoveCounter; import forge.game.keyword.Keyword; import forge.game.mana.Mana; import forge.game.player.Player; +import forge.game.replacement.ReplacementEffect; import forge.game.staticability.StaticAbility; +import forge.game.trigger.Trigger; import forge.game.trigger.TriggerType; import forge.game.trigger.WrappedAbility; import forge.util.Expressions; @@ -87,8 +89,10 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit private boolean basicSpell = true; private boolean trigger = false; + private Trigger triggerObj = null; private boolean optionalTrigger = false; private boolean replacementAbility = false; + private ReplacementEffect replacementEffect = null; private int sourceTrigger = -1; private List triggerRemembered = Lists.newArrayList(); @@ -913,6 +917,14 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit trigger = trigger0; } + public Trigger getTrigger() { + return triggerObj; + } + + public void setTrigger(final Trigger t) { + triggerObj = t; + } + public boolean isOptionalTrigger() { return optionalTrigger; } @@ -934,6 +946,14 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit replacementAbility = replacement; } + public ReplacementEffect getReplacementEffect() { + return replacementEffect; + } + + public void setReplacementEffect(final ReplacementEffect re) { + this.replacementEffect = re; + } + public boolean isMandatory() { return false; } diff --git a/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java b/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java index 927895756f3..b59580cd366 100644 --- a/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java +++ b/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java @@ -27,14 +27,13 @@ import com.google.common.collect.Lists; public class WrappedAbility extends Ability { private final SpellAbility sa; - private final Trigger regtrig; private final Player decider; boolean mandatory = false; public WrappedAbility(final Trigger regtrig0, final SpellAbility sa0, final Player decider0) { super(regtrig0.getHostCard(), ManaCost.ZERO, sa0.getView()); - regtrig = regtrig0; + setTrigger(regtrig0); sa = sa0; decider = decider0; sa.setDescription(this.getStackDescription()); @@ -49,10 +48,6 @@ public class WrappedAbility extends Ability { return true; } - public Trigger getTrigger() { - return regtrig; - } - public Player getDecider() { return decider; } @@ -218,6 +213,7 @@ public class WrappedAbility extends Ability { @Override public String getStackDescription() { + final Trigger regtrig = getTrigger(); final StringBuilder sb = new StringBuilder(regtrig.replaceAbilityText(regtrig.toString(true), this)); if (usesTargeting()) { sb.append(" (Targeting "); @@ -445,6 +441,7 @@ public class WrappedAbility extends Ability { @Override public void resolve() { final Game game = sa.getActivatingPlayer().getGame(); + final Trigger regtrig = getTrigger(); Map triggerParams = regtrig.getMapParams(); if (!(regtrig instanceof TriggerAlways) && !triggerParams.containsKey("NoResolvingCheck")) { @@ -476,6 +473,9 @@ public class WrappedAbility extends Ability { return; } + // set Trigger + sa.setTrigger(regtrig); + if (!triggerParams.containsKey("NoTimestampCheck")) { timestampCheck(); } From e665df8af276fcd8560595f0a20d3d873d20bcf8 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Thu, 11 Oct 2018 08:11:26 +0200 Subject: [PATCH 025/901] cards: update Cards with GainThisAbility --- forge-gui/res/cardsfolder/a/artisan_of_forms.txt | 3 +-- forge-gui/res/cardsfolder/c/cemetery_puca.txt | 3 +-- forge-gui/res/cardsfolder/c/cryptoplasm.txt | 3 +-- forge-gui/res/cardsfolder/d/dimir_doppelganger.txt | 3 +-- forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt | 7 +++---- forge-gui/res/cardsfolder/l/lazav_the_multifarious.txt | 3 +-- forge-gui/res/cardsfolder/m/mizzium_transreliquat.txt | 3 +-- forge-gui/res/cardsfolder/s/sakashima_the_impostor.txt | 4 ++-- forge-gui/res/cardsfolder/t/thespians_stage.txt | 3 +-- forge-gui/res/cardsfolder/u/unstable_shapeshifter.txt | 3 +-- forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt | 2 +- 11 files changed, 14 insertions(+), 23 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..dd18a306a46 100644 --- a/forge-gui/res/cardsfolder/a/artisan_of_forms.txt +++ b/forge-gui/res/cardsfolder/a/artisan_of_forms.txt @@ -3,8 +3,7 @@ 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. -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:TrigArtisanCopy:DB$ Clone | ValidTgts$ Creature | TgtPrompt$ Select target creature to copy | Optional$ True | GainThisAbility$ True 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. diff --git a/forge-gui/res/cardsfolder/c/cemetery_puca.txt b/forge-gui/res/cardsfolder/c/cemetery_puca.txt index 4d7ca05cb20..32881d40dc6 100644 --- a/forge-gui/res/cardsfolder/c/cemetery_puca.txt +++ b/forge-gui/res/cardsfolder/c/cemetery_puca.txt @@ -4,8 +4,7 @@ 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. -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:CemeteryPucaCopy:AB$ Clone | Cost$ 1 | Defined$ TriggeredCardLKICopy | GainThisAbility$ True 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. diff --git a/forge-gui/res/cardsfolder/c/cryptoplasm.txt b/forge-gui/res/cardsfolder/c/cryptoplasm.txt index 914174829f3..48335f9a6f7 100644 --- a/forge-gui/res/cardsfolder/c/cryptoplasm.txt +++ b/forge-gui/res/cardsfolder/c/cryptoplasm.txt @@ -4,8 +4,7 @@ Types:Creature Shapeshifter PT:2/2 # Make Svars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ CryptoplasmCopy | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may have CARDNAME become a copy of another target creature. If you do, CARDNAME gains this ability. -SVar:CryptoplasmCopy:DB$ Clone | ValidTgts$ Creature.Other | TgtPrompt$ Select another target creature to copy. | Optional$ True | AddTriggers$ CryptoplasmUpkeepTrig | AddSVars$ CryptoplasmCopy,CryptoplasmUpkeepTrig -SVar:CryptoplasmUpkeepTrig:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ CryptoplasmCopy | TriggerDescription$ At the beginning of your upkeep, you may have CARDNAME become a copy of another target creature. If you do, CARDNAME gains this ability. +SVar:CryptoplasmCopy:DB$ Clone | ValidTgts$ Creature.Other | TgtPrompt$ Select another target creature to copy. | Optional$ True | GainThisAbility$ True SVar:RemAIDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/cryptoplasm.jpg Oracle:At the beginning of your upkeep, you may have Cryptoplasm become a copy of another target creature. If you do, Cryptoplasm gains this ability. diff --git a/forge-gui/res/cardsfolder/d/dimir_doppelganger.txt b/forge-gui/res/cardsfolder/d/dimir_doppelganger.txt index c8b7f3799a0..f12f300c4ba 100644 --- a/forge-gui/res/cardsfolder/d/dimir_doppelganger.txt +++ b/forge-gui/res/cardsfolder/d/dimir_doppelganger.txt @@ -4,8 +4,7 @@ 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. -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:DDCopy:DB$ Clone | Defined$ Remembered | GainThisAbility$ True 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. diff --git a/forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt b/forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt index 547047a35a0..a0bc6751f89 100644 --- a/forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt +++ b/forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt @@ -3,9 +3,8 @@ 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. -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. +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 Lazav, Dimir Mastermind become a copy of that card, except its name is Lazav, Dimir Mastermind, it’s legendary in addition to its other types, and it has hexproof and this ability. +SVar:LazavCopy:DB$ Clone | Defined$ TriggeredCard | NewName$ Lazav, Dimir Mastermind | AddTypes$ Legendary | AddKeywords$ Hexproof | GainThisAbility$ True 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 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/l/lazav_the_multifarious.txt b/forge-gui/res/cardsfolder/l/lazav_the_multifarious.txt index e8f35ff5bfa..57ab5d3a9fa 100644 --- a/forge-gui/res/cardsfolder/l/lazav_the_multifarious.txt +++ b/forge-gui/res/cardsfolder/l/lazav_the_multifarious.txt @@ -4,7 +4,6 @@ Types:Legendary Creature Shapeshifter PT:1/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSurveil | TriggerDescription$ When CARDNAME enters the battlefield, scry 1. (To scry 1, look at the top card of your library. You may put that card into your graveyard.) SVar:TrigSurveil:DB$ Surveil | Amount$ 1 -A:AB$ Clone | Cost$ X | ValidTgts$ Creature.YouOwn | References$ X | TgtZone$ Graveyard | TgtPrompt$ Select target creature card in your graveyard | AddTypes$ Legendary | KeepName$ True | AddSVars$ X,LazavTrig | AddAbilities$ LazavTrig | SpellDescription$ CARDNAME becomes a copy of target creature card in your graveyard with converted mana cost X, except its name is CARDNAME, it's legendary in addition to it's other types, and it has this ability. -SVar:LazavTrig:AB$ Clone | Cost$ X | ValidTgts$ Creature.YouOwn | References$ X | TgtZone$ Graveyard | TgtPrompt$ Select target creature card in your graveyard | AddTypes$ Legendary | KeepName$ True | AddSVars$ X,LazavTrig | AddAbilities$ LazavTrig | SpellDescription$ CARDNAME becomes a copy of target creature card in your graveyard with converted mana cost X, except its name is CARDNAME, it's legendary in addition to it's other types, and it has this ability. +A:AB$ Clone | Cost$ X | ValidTgts$ Creature.YouOwn | References$ X | TgtZone$ Graveyard | TgtPrompt$ Select target creature card in your graveyard | AddTypes$ Legendary | NewName$ Lazav, the Multifarious | GainThisAbility$ True | SpellDescription$ CARDNAME becomes a copy of target creature card in your graveyard with converted mana cost X, except its name is CARDNAME, it's legendary in addition to it's other types, and it has this ability. SVar:X:Targeted$CardManaCost Oracle:When Lazav, the Multifarious enters the battlefield, surveil 1. (Look at the top card of your library. You may put that card into your graveyard.)\n{X}: Lazav, the Multifarious becomes a copy of target creature card in your graveyard with converted mana cost X, except its name is Lazav, the Multifarious, it's legendary in addition to its other types, and it has this ability. diff --git a/forge-gui/res/cardsfolder/m/mizzium_transreliquat.txt b/forge-gui/res/cardsfolder/m/mizzium_transreliquat.txt index 0888a589650..6799f7d0476 100644 --- a/forge-gui/res/cardsfolder/m/mizzium_transreliquat.txt +++ b/forge-gui/res/cardsfolder/m/mizzium_transreliquat.txt @@ -2,8 +2,7 @@ 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. | GainThisAbility$ True | SpellDescription$ CARDNAME becomes a copy of target artifact and gains 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. diff --git a/forge-gui/res/cardsfolder/s/sakashima_the_impostor.txt b/forge-gui/res/cardsfolder/s/sakashima_the_impostor.txt index db012d45c58..e9bdc7f16f1 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 | NewName$ Sakashima the Impostor | 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 Sakashima the Impostor, it’s legendary in addition to its other types, and it has “{2}{U}{U}: Return this creature 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 Sakashima the Impostor, it’s legendary in addition to its other types, and it has “{2}{U}{U}: Return this creature to its owner’s hand 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..2a2b3db4896 100644 --- a/forge-gui/res/cardsfolder/t/thespians_stage.txt +++ b/forge-gui/res/cardsfolder/t/thespians_stage.txt @@ -2,8 +2,7 @@ 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. | GainThisAbility$ True | SpellDescription$ CARDNAME becomes a copy of target land and gains 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. diff --git a/forge-gui/res/cardsfolder/u/unstable_shapeshifter.txt b/forge-gui/res/cardsfolder/u/unstable_shapeshifter.txt index af412f12b6b..f78b867c0e5 100644 --- a/forge-gui/res/cardsfolder/u/unstable_shapeshifter.txt +++ b/forge-gui/res/cardsfolder/u/unstable_shapeshifter.txt @@ -4,7 +4,6 @@ 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. -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:USCopy:DB$ Clone | Defined$ TriggeredCard | GainThisAbility$ True 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. diff --git a/forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt b/forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt index 2b6a6aba2b3..5412e1a6616 100644 --- a/forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt +++ b/forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt @@ -7,7 +7,7 @@ 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: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: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:VesDopCopy:DB$ Clone | ValidTgts$ Creature | TgtPrompt$ Select target creature to copy. | Optional$ True | Colors$ Blue | OverwriteColors$ True | GainThisAbility$ True | 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." From 3e4dfb3bc262b2bba356e805420976addd653d1d Mon Sep 17 00:00:00 2001 From: swordshine Date: Thu, 11 Oct 2018 16:41:41 +0800 Subject: [PATCH 026/901] - Updated Genesis Storm --- .../game/ability/effects/DigUntilEffect.java | 20 ++++++++++++------- forge-gui/res/cardsfolder/g/genesis_storm.txt | 2 +- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java index 5615f70b2de..46935002a90 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java @@ -105,6 +105,7 @@ public class DigUntilEffect extends SpellAbilityEffect { final ZoneType digSite = sa.hasParam("DigZone") ? ZoneType.smartValueOf(sa.getParam("DigZone")) : ZoneType.Library; boolean shuffle = sa.hasParam("Shuffle"); final boolean optional = sa.hasParam("Optional"); + final boolean optionalFound = sa.hasParam("OptionalFoundMove"); for (final Player p : getTargetPlayers(sa)) { if (p == null) { @@ -156,15 +157,20 @@ public class DigUntilEffect extends SpellAbilityEffect { final Iterator itr = found.iterator(); while (itr.hasNext()) { final Card c = itr.next(); - if (sa.hasParam("GainControl") && foundDest.equals(ZoneType.Battlefield)) { - c.setController(sa.getActivatingPlayer(), game.getNextTimestamp()); - game.getAction().moveTo(c.getController().getZone(foundDest), c, sa); - } else if (sa.hasParam("NoMoveFound") && foundDest.equals(ZoneType.Library)) { - //Don't do anything + if (optionalFound && !p.getController().confirmAction(sa, null, + "Do you want to put that card to " + foundDest.name() + "?")) { + continue; } else { - game.getAction().moveTo(foundDest, c, foundLibPos, sa); + if (sa.hasParam("GainControl") && foundDest.equals(ZoneType.Battlefield)) { + c.setController(sa.getActivatingPlayer(), game.getNextTimestamp()); + game.getAction().moveTo(c.getController().getZone(foundDest), c, sa); + } else if (sa.hasParam("NoMoveFound") && foundDest.equals(ZoneType.Library)) { + //Don't do anything + } else { + game.getAction().moveTo(foundDest, c, foundLibPos, sa); + } + revealed.remove(c); } - revealed.remove(c); } } diff --git a/forge-gui/res/cardsfolder/g/genesis_storm.txt b/forge-gui/res/cardsfolder/g/genesis_storm.txt index 46632f96e5e..ed19640f1f0 100644 --- a/forge-gui/res/cardsfolder/g/genesis_storm.txt +++ b/forge-gui/res/cardsfolder/g/genesis_storm.txt @@ -4,5 +4,5 @@ Types:Sorcery T:Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigCopy | TriggerDescription$ When you cast this spell, copy it for each time you've cast your commander from the command zone this game. SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ X | References$ X SVar:X:Count$TotalCommanderCastFromCommandZone -A:SP$ DigUntil | Cost$ 4 G G | Valid$ Permanent.nonland | ValidDescription$ nonland permanent | FoundDestination$ Battlefield | RevealedDestination$ Library | RevealedLibraryPosition$ -1 | RevealRandomOrder$ True | SpellDescription$ Reveal cards from the top of your library until you reveal a nonland permanent card. You may put that card onto the battlefield. Then put all cards revealed this way that weren't put onto the battlefield on the bottom of your library in a random order. +A:SP$ DigUntil | Cost$ 4 G G | Valid$ Permanent.nonland | ValidDescription$ nonland permanent | FoundDestination$ Battlefield | OptionalFoundMove$ True | RevealedDestination$ Library | RevealedLibraryPosition$ -1 | RevealRandomOrder$ True | SpellDescription$ Reveal cards from the top of your library until you reveal a nonland permanent card. You may put that card onto the battlefield. Then put all cards revealed this way that weren't put onto the battlefield on the bottom of your library in a random order. Oracle:When you cast this spell, copy it for each time you've cast your commander from the command zone this game. You may choose new targets for the copies.\nReveal cards from the top of your library until you reveal a nonland permanent card. You may put that card onto the battlefield. Then put all cards revealed this way that weren't put onto the battlefield on the bottom of your library in a random order. From 7fd775d5c75975f65d5b6eabe2b366131c5198ba Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 12 Oct 2018 08:50:41 +0300 Subject: [PATCH 027/901] - Added AI draft deck hints for Guilds of Ravnica. --- forge-gui/res/cardsfolder/a/arclight_phoenix.txt | 1 + forge-gui/res/cardsfolder/a/assure_assemble.txt | 3 ++- forge-gui/res/cardsfolder/a/attendant_of_vraska.txt | 1 + forge-gui/res/cardsfolder/a/aurelia_exemplar_of_justice.txt | 1 + forge-gui/res/cardsfolder/b/barging_sergeant.txt | 1 + forge-gui/res/cardsfolder/b/barrier_of_bones.txt | 1 + forge-gui/res/cardsfolder/b/beacon_bolt.txt | 1 + forge-gui/res/cardsfolder/b/beamsplitter_mage.txt | 1 + forge-gui/res/cardsfolder/b/blade_instructor.txt | 1 + forge-gui/res/cardsfolder/b/boros_challenger.txt | 1 + forge-gui/res/cardsfolder/c/chamber_sentry.txt | 1 + forge-gui/res/cardsfolder/c/charnel_troll.txt | 2 ++ forge-gui/res/cardsfolder/c/citywatch_sphinx.txt | 1 + forge-gui/res/cardsfolder/c/connive_concoct.txt | 1 + forge-gui/res/cardsfolder/c/crackling_drake.txt | 1 + forge-gui/res/cardsfolder/d/darkblade_agent.txt | 1 + forge-gui/res/cardsfolder/d/dazzling_lights.txt | 1 + forge-gui/res/cardsfolder/d/deadly_visit.txt | 1 + forge-gui/res/cardsfolder/d/dimir_informant.txt | 1 + forge-gui/res/cardsfolder/d/dimir_spybug.txt | 2 ++ forge-gui/res/cardsfolder/d/discovery_dispersal.txt | 1 + forge-gui/res/cardsfolder/d/disinformation_campaign.txt | 1 + forge-gui/res/cardsfolder/d/doom_whisperer.txt | 1 + forge-gui/res/cardsfolder/d/dream_eater.txt | 1 + forge-gui/res/cardsfolder/d/drowned_secrets.txt | 1 + forge-gui/res/cardsfolder/e/electrostatic_field.txt | 1 + forge-gui/res/cardsfolder/e/emmara_soul_of_the_accord.txt | 1 + forge-gui/res/cardsfolder/e/enhanced_surveillance.txt | 1 + forge-gui/res/cardsfolder/e/erratic_cyclops.txt | 1 + forge-gui/res/cardsfolder/f/find_finality.txt | 1 + forge-gui/res/cardsfolder/f/fire_urchin.txt | 1 + forge-gui/res/cardsfolder/f/fireminds_research.txt | 1 + forge-gui/res/cardsfolder/g/gird_for_battle.txt | 1 + forge-gui/res/cardsfolder/g/glowspore_shaman.txt | 1 + forge-gui/res/cardsfolder/g/goblin_banneret.txt | 1 + forge-gui/res/cardsfolder/g/golgari_raiders.txt | 1 + forge-gui/res/cardsfolder/g/gruesome_menagerie.txt | 1 + forge-gui/res/cardsfolder/g/guildmages_forum.txt | 1 + forge-gui/res/cardsfolder/h/haazda_marshal.txt | 1 + forge-gui/res/cardsfolder/h/hammer_dropper.txt | 1 + forge-gui/res/cardsfolder/h/house_guildmage.txt | 1 + forge-gui/res/cardsfolder/i/invert_invent.txt | 1 + forge-gui/res/cardsfolder/i/ironshell_beetle.txt | 1 + forge-gui/res/cardsfolder/i/izoni_thousand_eyed.txt | 1 + forge-gui/res/cardsfolder/k/knight_of_autumn.txt | 1 + forge-gui/res/cardsfolder/l/lazav_the_multifarious.txt | 1 + forge-gui/res/cardsfolder/l/league_guildmage.txt | 1 + forge-gui/res/cardsfolder/l/leapfrog.txt | 1 + forge-gui/res/cardsfolder/m/march_of_the_multitudes.txt | 1 + forge-gui/res/cardsfolder/m/mephitic_vapors.txt | 1 + forge-gui/res/cardsfolder/m/mission_briefing.txt | 1 + forge-gui/res/cardsfolder/m/murmuring_mystic.txt | 2 ++ forge-gui/res/cardsfolder/n/nightveil_sprite.txt | 1 + forge-gui/res/cardsfolder/n/niv_mizzet_parun.txt | 1 + forge-gui/res/cardsfolder/n/notion_rain.txt | 1 + forge-gui/res/cardsfolder/p/parhelion_patrol.txt | 1 + forge-gui/res/cardsfolder/p/pelt_collector.txt | 1 + forge-gui/res/cardsfolder/p/piston_fist_cyclops.txt | 1 + forge-gui/res/cardsfolder/p/price_of_fame.txt | 1 + forge-gui/res/cardsfolder/r/ral_izzet_viceroy.txt | 2 ++ forge-gui/res/cardsfolder/r/rals_staticaster.txt | 1 + forge-gui/res/cardsfolder/r/rampaging_monument.txt | 1 + forge-gui/res/cardsfolder/r/rhizome_lurcher.txt | 1 + forge-gui/res/cardsfolder/r/runaway_steam_kin.txt | 1 + forge-gui/res/cardsfolder/s/sinister_sabotage.txt | 1 + forge-gui/res/cardsfolder/s/smelt_ward_minotaur.txt | 2 +- forge-gui/res/cardsfolder/s/sprouting_renewal.txt | 1 + forge-gui/res/cardsfolder/s/sunhome_stalwart.txt | 1 + forge-gui/res/cardsfolder/t/tajic_legions_edge.txt | 1 + forge-gui/res/cardsfolder/t/thought_erasure.txt | 1 + forge-gui/res/cardsfolder/t/thoughtbound_phantasm.txt | 2 ++ forge-gui/res/cardsfolder/t/thousand_year_storm.txt | 1 + forge-gui/res/cardsfolder/t/trostani_discordant.txt | 1 + forge-gui/res/cardsfolder/t/truefire_captain.txt | 1 + forge-gui/res/cardsfolder/u/unexplained_disappearance.txt | 1 + forge-gui/res/cardsfolder/v/venerated_loxodon.txt | 1 + forge-gui/res/cardsfolder/v/vraska_regal_gorgon.txt | 1 + forge-gui/res/cardsfolder/w/wand_of_vertebrae.txt | 1 + forge-gui/res/cardsfolder/w/watcher_in_the_mist.txt | 1 + forge-gui/res/cardsfolder/w/wee_dragonauts.txt | 1 + forge-gui/res/cardsfolder/w/whisper_agent.txt | 1 + forge-gui/res/cardsfolder/w/whispering_snitch.txt | 1 + forge-gui/res/cardsfolder/w/wojek_bodyguard.txt | 1 + forge-gui/res/cardsfolder/w/worldsoul_colossus.txt | 1 + 84 files changed, 90 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/a/arclight_phoenix.txt b/forge-gui/res/cardsfolder/a/arclight_phoenix.txt index f5ea5df6ed9..026a1c61c69 100644 --- a/forge-gui/res/cardsfolder/a/arclight_phoenix.txt +++ b/forge-gui/res/cardsfolder/a/arclight_phoenix.txt @@ -7,4 +7,5 @@ K:Haste T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Graveyard | CheckSVar$ X | SVarCompare$ GE3 | Execute$ TrigReturn | OptionalDecider$ You | TriggerDescription$ At the beginning of combat on your turn, if you've cast three or more instant and sorcery spells this turn, you may return CARDNAME from your graveyard to the battlefield. SVar:TrigReturn:DB$ ChangeZone | Defined$ Self | Origin$ Graveyard | Destination$ Battlefield SVar:X:Count$ThisTurnCast_Instant.YouCtrl,Sorcery.YouCtrl +DeckNeeds:Type$Instant|Sorcery Oracle:Flying, Haste\nAt the beginning of combat on your turn, if you've cast three or more instant and sorcery spells this turn, you may return Arclight Phoenix from your graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/a/assure_assemble.txt b/forge-gui/res/cardsfolder/a/assure_assemble.txt index eb67e2204a3..092e54f9cc1 100644 --- a/forge-gui/res/cardsfolder/a/assure_assemble.txt +++ b/forge-gui/res/cardsfolder/a/assure_assemble.txt @@ -4,6 +4,7 @@ Types:Instant AlternateMode:Split A:SP$ PutCounter | Cost$ G/W G/W | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBPump | SpellDescription$ Put a +1/+1 counter on target creature. It gains indestructible until end of turn. SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ Indestructible +DeckHas:Ability$Counters & Ability$Token Oracle:Put a +1/+1 counter on target creature. It gains indestructible until end of turn. ALTERNATE @@ -12,5 +13,5 @@ Name:Assemble ManaCost:4 G W Types:Instant A:SP$ Token | Cost$ 4 G W | TokenAmount$ 3 | TokenScript$ wg_2_2_elf_knight_vigilance | SpellDescription$ Create three 2/2 green and white Elf Knight creature tokens with vigilance. -DeckHas:Ability$Token +DeckHas:Ability$Counters & Ability$Token Oracle:Create three 2/2 green and white Elf Knight creature tokens with vigilance. diff --git a/forge-gui/res/cardsfolder/a/attendant_of_vraska.txt b/forge-gui/res/cardsfolder/a/attendant_of_vraska.txt index d31ef72a28f..f02fdcd7d51 100644 --- a/forge-gui/res/cardsfolder/a/attendant_of_vraska.txt +++ b/forge-gui/res/cardsfolder/a/attendant_of_vraska.txt @@ -5,4 +5,5 @@ PT:3/3 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | IsPresent$ Planeswalker.Vraska+YouCtrl | Execute$ TrigGainLife | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, if you control a Vraska planeswalker, you gain life equal to CARDNAME's power. SVar:TrigGainLife:DB$GainLife | Defined$ You | LifeAmount$ X | References$ X SVar:X:TriggeredCard$CardPower +DeckNeeds:Type$Vraska Oracle:When Attendant of Vraska dies, if you control a Vraska planeswalker, you gain life equal to Attendant of Vraska's power. diff --git a/forge-gui/res/cardsfolder/a/aurelia_exemplar_of_justice.txt b/forge-gui/res/cardsfolder/a/aurelia_exemplar_of_justice.txt index 5920bd231d3..b2a20a416f1 100644 --- a/forge-gui/res/cardsfolder/a/aurelia_exemplar_of_justice.txt +++ b/forge-gui/res/cardsfolder/a/aurelia_exemplar_of_justice.txt @@ -9,4 +9,5 @@ SVar:DBPump:DB$ Pump | ValidTgts$ Creature.YouCtrl | NumAtt$ 2 | RememberTargets SVar:DBPump1:DB$Pump | Defined$ Remembered | KW$ Trample | ConditionDefined$ Remembered | ConditionPresent$ Card.Red | SubAbility$ DBPump2 SVar:DBPump2:DB$Pump | Defined$ Remembered | KW$ Vigilance | ConditionDefined$ Remembered | ConditionPresent$ Card.White | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +DeckHas:Ability$Counters Oracle:Flying\nMentor (Whenever this creature attacks, put a +1/+1 counter on target attacking creature with lesser power.)\nAt the beginning of combat on your turn, choose up to one target creature you control. Until end of turn, that creature gets +2/+0, gains trample if it's red, and gains vigilance if it's white. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/b/barging_sergeant.txt b/forge-gui/res/cardsfolder/b/barging_sergeant.txt index e0e24d93c6f..595eb1697f0 100644 --- a/forge-gui/res/cardsfolder/b/barging_sergeant.txt +++ b/forge-gui/res/cardsfolder/b/barging_sergeant.txt @@ -4,4 +4,5 @@ Types:Creature Minotaur Soldier PT:4/2 K:Haste K:Mentor +DeckHas:Ability$Counters Oracle:Haste\nMentor (Whenever this creature attacks, put a +1/+1 counter on target attacking creature with lesser power.) diff --git a/forge-gui/res/cardsfolder/b/barrier_of_bones.txt b/forge-gui/res/cardsfolder/b/barrier_of_bones.txt index 4c092100c9f..ae3c126b121 100644 --- a/forge-gui/res/cardsfolder/b/barrier_of_bones.txt +++ b/forge-gui/res/cardsfolder/b/barrier_of_bones.txt @@ -5,4 +5,5 @@ PT:0/3 K:Defender T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSurveil | TriggerDescription$ When CARDNAME enters the battlefield, surveil 1. (Look at the top card of your library. You may put that card into your graveyard.) SVar:TrigSurveil:DB$ Surveil | Amount$ 1 +DeckHas:Ability$Surveil & Ability$Graveyard Oracle:Defender\nWhen Barrier of Bones enters the battlefield, surveil 1. (Look at the top card of your library. You may put that card into your graveyard.) diff --git a/forge-gui/res/cardsfolder/b/beacon_bolt.txt b/forge-gui/res/cardsfolder/b/beacon_bolt.txt index 76ebddf053b..52b23157897 100644 --- a/forge-gui/res/cardsfolder/b/beacon_bolt.txt +++ b/forge-gui/res/cardsfolder/b/beacon_bolt.txt @@ -5,4 +5,5 @@ K:Jump-start A:SP$ DealDamage | Cost$ 1 U R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | References$ X,Y | SpellDescription$ CARDNAME deals damage to target creature equal to the total number of instant and sorcery cards you own in exile and in your graveyard. SVar:X:Count$ValidGraveyard Instant.YouOwn,Sorcery.YouOwn/Plus.Y SVar:Y:Count$ValidExile Instant.YouOwn,Sorcery.YouOwn +DeckHints:Type$Instant|Sorcery Oracle:Beacon Bolt deals damage to target creature equal to the total number of instant and sorcery cards you own in exile and in your graveyard.\nJump-start (You may cast this card from your graveyard by discarding a card in addition to paying its other costs. Then exile this card.) diff --git a/forge-gui/res/cardsfolder/b/beamsplitter_mage.txt b/forge-gui/res/cardsfolder/b/beamsplitter_mage.txt index 66f2bc8fe77..a83584e2a6c 100644 --- a/forge-gui/res/cardsfolder/b/beamsplitter_mage.txt +++ b/forge-gui/res/cardsfolder/b/beamsplitter_mage.txt @@ -4,4 +4,5 @@ Types:Creature Vedalken Wizard PT:2/2 T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | IsSingleTarget$ True | TargetsValid$ Card.Self | CanTargetOtherCondition$ Creature.YouCtrl | Execute$ TrigCopy | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast an instant or sorcery that targets only CARDNAME, if you control one or more other creatures that spell could target, choose one of those creatures. Copy that spell. The copy targets the chosen creature. SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Controller$ You | CopyForEachCanTarget$ Creature.YouCtrl | ChooseOnlyOne$ True +DeckHints:Ability$Instant|Sorcery Oracle:Whenever you cast an instant or sorcery spell that targets only Beamsplitter Mage, if you control one or more other creatures that spell could target, choose one of those creatures. Copy that spell. The copy targets the chosen creature. diff --git a/forge-gui/res/cardsfolder/b/blade_instructor.txt b/forge-gui/res/cardsfolder/b/blade_instructor.txt index a8969b6e857..dc0478e63b6 100644 --- a/forge-gui/res/cardsfolder/b/blade_instructor.txt +++ b/forge-gui/res/cardsfolder/b/blade_instructor.txt @@ -3,4 +3,5 @@ ManaCost:2 W Types:Creature Human Soldier PT:3/1 K:Mentor +DeckHas:Ability$Counters Oracle:Mentor (Whenever this creature attacks, put a +1/+1 counter on target attacking creature with lesser power.) diff --git a/forge-gui/res/cardsfolder/b/boros_challenger.txt b/forge-gui/res/cardsfolder/b/boros_challenger.txt index 5e2da20eaf6..4106f4ddc17 100644 --- a/forge-gui/res/cardsfolder/b/boros_challenger.txt +++ b/forge-gui/res/cardsfolder/b/boros_challenger.txt @@ -4,4 +4,5 @@ Types:Creature Human Soldier PT:2/3 K:Mentor A:AB$ Pump | Cost$ 2 R W | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. +DeckHas:Ability$Counters Oracle:Mentor (Whenever this creature attacks, put a +1/+1 counter on target attacking creature with lesser power.)\n{2}{R}{W}: Boros Challenger gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/c/chamber_sentry.txt b/forge-gui/res/cardsfolder/c/chamber_sentry.txt index 3816568e85d..cbaa7f301cb 100644 --- a/forge-gui/res/cardsfolder/c/chamber_sentry.txt +++ b/forge-gui/res/cardsfolder/c/chamber_sentry.txt @@ -8,4 +8,5 @@ A:AB$ DealDamage | Announce$ X | Cost$ X T SubCounter | ValidTgts$ Creat SVar:X:Count$xPaid A:AB$ ChangeZone | Cost$ W U B R G | Origin$ Graveyard | Destination$ Hand | ActivationZone$ Graveyard | SpellDescription$ Return CARDNAME from your graveyard to your hand. SVar:DiscardMe:1 +DeckHas:Ability$Counters Oracle:Chamber Sentry enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it.\n{X}, {T}, Remove X +1/+1 counters from Chamber Sentry: It deals X damage to any target.\n{W}{U}{B}{R}{G}: Return Chamber Sentry from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/c/charnel_troll.txt b/forge-gui/res/cardsfolder/c/charnel_troll.txt index 6ce2cf5f619..ab2e2318e6d 100644 --- a/forge-gui/res/cardsfolder/c/charnel_troll.txt +++ b/forge-gui/res/cardsfolder/c/charnel_troll.txt @@ -10,4 +10,6 @@ SVar:DBSac:DB$ Sacrifice | SacValid# Self | ConditionDefined$ Remembered | Condi SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True A:AB$ PutCounter | Cost$ B G Discard<1/Creature> | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on CARDNAME. SVar:RemRandomDeck:True +DeckNeeds:Ability$Graveyard +DeckHas:Ability$Counters Oracle:Trample\nAt the beginning of your upkeep, exile a creature card from your graveyard. If you do, put a +1/+1 counter on Charnel Troll. Otherwise sacrifice it.\n{B}{G}, Discard a creature card: Put a +1/+1 counter on Charnel Troll. diff --git a/forge-gui/res/cardsfolder/c/citywatch_sphinx.txt b/forge-gui/res/cardsfolder/c/citywatch_sphinx.txt index 1e759f40719..9f332935c10 100644 --- a/forge-gui/res/cardsfolder/c/citywatch_sphinx.txt +++ b/forge-gui/res/cardsfolder/c/citywatch_sphinx.txt @@ -5,4 +5,5 @@ PT:5/4 K:Flying T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigSurveil | TriggerDescription$ When CARDNAME dies, surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on the top of your library in any order.) SVar:TrigSurveil:DB$Surveil | Defined$ You | Amount$ 2 +DeckHas:Ability$Surveil & Ability$Graveyard Oracle:Flying\nWhen Citywatch Sphinx dies, surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on the top of your library in any order.) diff --git a/forge-gui/res/cardsfolder/c/connive_concoct.txt b/forge-gui/res/cardsfolder/c/connive_concoct.txt index 3bc243c7625..1e45b353c28 100644 --- a/forge-gui/res/cardsfolder/c/connive_concoct.txt +++ b/forge-gui/res/cardsfolder/c/connive_concoct.txt @@ -12,4 +12,5 @@ ManaCost:3 U B Types:Sorcery A:SP$ Surveil | Cost$ 3 U B | Amount$ 3 | SubAbility$ DBReturn | SpellDescription$ Surveil 3, then return a creature card from your graveyard to the battlefield. SVar:DBReturn:DB$ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature.YouCtrl | ChangeNum$ 1 | Hidden$ True +DeckHas:Ability$Surveil & Ability$Graveyard Oracle:Surveil 3, then return a creature card from your graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/c/crackling_drake.txt b/forge-gui/res/cardsfolder/c/crackling_drake.txt index a5a51fb25ad..9cdd75848e4 100644 --- a/forge-gui/res/cardsfolder/c/crackling_drake.txt +++ b/forge-gui/res/cardsfolder/c/crackling_drake.txt @@ -9,4 +9,5 @@ SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 SVar:GraveCount:Count$ValidGraveyard Instant.YouOwn,Sorcery.YouOwn SVar:ExileCount:Count$ValidExile Instant.YouOwn,Sorcery.YouOwn SVar:X:SVar$GraveCount/Plus.ExileCount +DeckNeeds:Type$Instant|Sorcery Oracle:Flying\nCrackling Drake's power is equal to the total number of instant and sorcery cards you own in exile and in your graveyard.\nWhen Crackling Drake enters the battlefield, draw a card. diff --git a/forge-gui/res/cardsfolder/d/darkblade_agent.txt b/forge-gui/res/cardsfolder/d/darkblade_agent.txt index a3ce8c4a4ae..d3a1b48e76e 100644 --- a/forge-gui/res/cardsfolder/d/darkblade_agent.txt +++ b/forge-gui/res/cardsfolder/d/darkblade_agent.txt @@ -6,4 +6,5 @@ S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Deathtouch | AddTrigger$ SVar:Trig1:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDraw | TriggerDescription$ Whenever this creature deals combat damage to a player, draw a card. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 SVar:X:Count$YouSurveilThisTurn +DeckHints:Ability$Surveil Oracle:As long as you've surveilled this turn, Darkblade Agent has deathtouch and "Whenever this creature deals combat damage to a player, draw a card." diff --git a/forge-gui/res/cardsfolder/d/dazzling_lights.txt b/forge-gui/res/cardsfolder/d/dazzling_lights.txt index 76b9fdb89d6..8745c904b1a 100644 --- a/forge-gui/res/cardsfolder/d/dazzling_lights.txt +++ b/forge-gui/res/cardsfolder/d/dazzling_lights.txt @@ -3,4 +3,5 @@ ManaCost:U Types:Instant A:SP$ Pump | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -3 | IsCurse$ True | Subability$ DBSurveil | SpellDescription$ Target creature gets -3/-0 until end of turn. Surveil 2. SVar:DBSurveil:DB$ Surveil | Defined$ You | Amount$ 2 +DeckHas:Ability$Surveil & Ability$Graveyard Oracle:Target creature gets -3/-0 until end of turn.\nSurveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on the top of your library in any order.) diff --git a/forge-gui/res/cardsfolder/d/deadly_visit.txt b/forge-gui/res/cardsfolder/d/deadly_visit.txt index 26792d9be3a..d211ef31cfb 100644 --- a/forge-gui/res/cardsfolder/d/deadly_visit.txt +++ b/forge-gui/res/cardsfolder/d/deadly_visit.txt @@ -3,4 +3,5 @@ ManaCost:3 B B Types:Sorcery A:SP$ Destroy | Cost$ 3 B B | ValidTgts$ Creature | TgtPrompt$ Select target creature | Subability$ DBSurveil | SpellDescription$ Destroy target creature. Surveil 2 (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) SVar:DBSurveil:DB$ Surveil | Amount$ 2 +DeckHas:Ability$Surveil & Ability$Graveyard Oracle:Destroy target creature.\nSurveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) diff --git a/forge-gui/res/cardsfolder/d/dimir_informant.txt b/forge-gui/res/cardsfolder/d/dimir_informant.txt index 5cb18e6f8a1..cd9104c4b42 100644 --- a/forge-gui/res/cardsfolder/d/dimir_informant.txt +++ b/forge-gui/res/cardsfolder/d/dimir_informant.txt @@ -4,4 +4,5 @@ Types:Creature Human Rogue PT:1/4 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSurveil | TriggerDescription$ When CARDNAME enters the battlefield, then surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on the top of your library in any order.) SVar:TrigSurveil:DB$Surveil | Defined$ You | Amount$ 2 +DeckHas:Ability$Surveil & Ability$Graveyard Oracle:When Dimir Informant enters the battlefield, surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on the top of your library in any order.) diff --git a/forge-gui/res/cardsfolder/d/dimir_spybug.txt b/forge-gui/res/cardsfolder/d/dimir_spybug.txt index a0ab2b0ff30..4880d824087 100644 --- a/forge-gui/res/cardsfolder/d/dimir_spybug.txt +++ b/forge-gui/res/cardsfolder/d/dimir_spybug.txt @@ -6,4 +6,6 @@ K:Flying K:Menace T:Mode$ Surveil | ValidPlayer$ You | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever you surveil, put a +1/+1 counter on CARDNAME. SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +DeckHints:Ability$Surveil +DeckHas:Ability$Counters Oracle:Flying\nMenace (This creature can't be blocked except by two or more creatures.)\nWhenever you surveil, put a +1/+1 counter on Dimir Spybug. diff --git a/forge-gui/res/cardsfolder/d/discovery_dispersal.txt b/forge-gui/res/cardsfolder/d/discovery_dispersal.txt index 43176fc47dd..bcf7d315b13 100644 --- a/forge-gui/res/cardsfolder/d/discovery_dispersal.txt +++ b/forge-gui/res/cardsfolder/d/discovery_dispersal.txt @@ -4,6 +4,7 @@ Types:Sorcery AlternateMode:Split A:SP$ Surveil | Cost$ 1 U/B | Amount$ 2 | SubAbility$ DBDraw | SpellDescription$ Surveil 2, then draw a card. SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 +DeckHas:Ability$Surveil & Ability$Graveyard Oracle:Surveil 2, then draw a card. (To surveil 2, look at the top two cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) ALTERNATE diff --git a/forge-gui/res/cardsfolder/d/disinformation_campaign.txt b/forge-gui/res/cardsfolder/d/disinformation_campaign.txt index 17be691d384..4f4cc7c1072 100644 --- a/forge-gui/res/cardsfolder/d/disinformation_campaign.txt +++ b/forge-gui/res/cardsfolder/d/disinformation_campaign.txt @@ -6,4 +6,5 @@ SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 | SubAbility$ DBDiscard SVar:DBDiscard:DB$ Discard | Defined$ Player.Opponent | NumCards$ 1 | Mode$ TgtChoose T:Mode$ Surveil | ValidPlayer$ You | Execute$ TrigBounce | TriggerZones$ Battlefield | TriggerDescription$ Whenever you surveil, return CARDNAME to its owner's hand. SVar:TrigBounce:DB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Defined$ Self +DeckHints:Ability$Surveil Oracle:When Disinformation Campaign enters the battlefield, you draw a card and each opponent discards a card.\nWhenever you surveil, return Disinformation Campaign to its owner's hand. diff --git a/forge-gui/res/cardsfolder/d/doom_whisperer.txt b/forge-gui/res/cardsfolder/d/doom_whisperer.txt index ea6bdf4f39a..469af683112 100644 --- a/forge-gui/res/cardsfolder/d/doom_whisperer.txt +++ b/forge-gui/res/cardsfolder/d/doom_whisperer.txt @@ -5,4 +5,5 @@ PT:6/6 K:Flying K:Trample A:AB$ Surveil | Cost$ PayLife<2> | Amount$ 2 | SpellDescription$ Surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on the top of your library in any order.) +DeckHas:Ability$Surveil & Ability$Graveyard Oracle:Flying, trample\nPay 2 life: Surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on the top of your library in any order.) diff --git a/forge-gui/res/cardsfolder/d/dream_eater.txt b/forge-gui/res/cardsfolder/d/dream_eater.txt index fddbdb90ac9..99a06b972ac 100644 --- a/forge-gui/res/cardsfolder/d/dream_eater.txt +++ b/forge-gui/res/cardsfolder/d/dream_eater.txt @@ -8,4 +8,5 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigSurveil:DB$ Surveil | Defined$ You | Amount$ 4 | SubAbility$ TrigImmediate SVar:TrigImmediate:DB$ ImmediateTrigger | Execute$ TrigBounce | OptionalDecider$ You | TriggerDescription$ When you do, you may return target nonland permanent an opponent controls to its owner's hand. SVar:TrigBounce:DB$ ChangeZone | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | Origin$ Battlefield | Destination$ Hand +DeckHas:Ability$Surveil & Ability$Graveyard Oracle:Flash\nFlying\nWhen Dream Eater enters the battlefield, surveil 4. When you do, you may return target nonland permanent an opponent controls to its owner's hand. (To surveil 4, look at the top four cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) diff --git a/forge-gui/res/cardsfolder/d/drowned_secrets.txt b/forge-gui/res/cardsfolder/d/drowned_secrets.txt index 2bf1b893bc0..55e3fdba195 100644 --- a/forge-gui/res/cardsfolder/d/drowned_secrets.txt +++ b/forge-gui/res/cardsfolder/d/drowned_secrets.txt @@ -4,4 +4,5 @@ Types:Enchantment T:Mode$ SpellCast | ValidCard$ Card.Blue | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigMill | TriggerDescription$ Whenever you cast a blue spell, target player puts the top two cards if their library into their graveyard. SVar:TrigMill:DB$Mill | NumCards$ 2 | ValidTgts$ Player | TgtPrompt$ Select target player SVar:BuffedBy:Card.Blue +DeckHas:Ability$Graveyard Oracle:Whenever you cast a blue spell, target player puts the top two cards if their library into their graveyard. diff --git a/forge-gui/res/cardsfolder/e/electrostatic_field.txt b/forge-gui/res/cardsfolder/e/electrostatic_field.txt index fbb8fdd3b2d..21044c85700 100644 --- a/forge-gui/res/cardsfolder/e/electrostatic_field.txt +++ b/forge-gui/res/cardsfolder/e/electrostatic_field.txt @@ -5,4 +5,5 @@ PT:0/4 K:Defender T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ When you cast an instant or sorcery spell, CARDNAME deals 1 damage to each opponent. SVar:TrigDealDamage:DB$ DealDamage | Defined$ Player.Opponent | NumDmg$ 1 +DeckHints:Type$Instant|Sorcery Oracle:Defender\nWhen you cast an instant or sorcery spell, Electrostatic Field deals 1 damage to each opponent. diff --git a/forge-gui/res/cardsfolder/e/emmara_soul_of_the_accord.txt b/forge-gui/res/cardsfolder/e/emmara_soul_of_the_accord.txt index 44da9af66e5..4c998fe93ce 100644 --- a/forge-gui/res/cardsfolder/e/emmara_soul_of_the_accord.txt +++ b/forge-gui/res/cardsfolder/e/emmara_soul_of_the_accord.txt @@ -4,4 +4,5 @@ Types:Legendary Creature Elf Cleric PT:2/2 T:Mode$ Taps | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME becomes tapped, create a 1/1 white Soldier creature token with lifelink. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_soldier_lifelink +DeckHas:Ability$Token Oracle:Whenever Emmara, Soul of the Accord becomes tapped, create a 1/1 white Soldier creature token with lifelink. diff --git a/forge-gui/res/cardsfolder/e/enhanced_surveillance.txt b/forge-gui/res/cardsfolder/e/enhanced_surveillance.txt index d8bb73b521c..e1f2f07462c 100644 --- a/forge-gui/res/cardsfolder/e/enhanced_surveillance.txt +++ b/forge-gui/res/cardsfolder/e/enhanced_surveillance.txt @@ -5,4 +5,5 @@ R:Event$ Surveil | ActiveZones$ Battlefield | ValidPlayer$ You | ReplaceWith$ Ad SVar:AddTwoMore:DB$ ReplaceEffect | VarName$ SurveilNum | VarValue$ X | References$ X SVar:X:ReplaceCount$SurveilNum/Plus.2 A:AB$ ChangeZoneAll | Cost$ Exile<1/CARDNAME> | ChangeType$ Card.YouOwn | Origin$ Graveyard | Destination$ Library | Shuffle$ True | SpellDescription$ Shuffle your graveyard into your library. +DeckNeeds:Ability$Surveil Oracle:You may look at an additional two cards each you surveil.\nExile Enhanced Surveillance: Shuffle your graveyard into your library. diff --git a/forge-gui/res/cardsfolder/e/erratic_cyclops.txt b/forge-gui/res/cardsfolder/e/erratic_cyclops.txt index 269664a5423..38c790f9854 100644 --- a/forge-gui/res/cardsfolder/e/erratic_cyclops.txt +++ b/forge-gui/res/cardsfolder/e/erratic_cyclops.txt @@ -7,4 +7,5 @@ T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | Tr SVar:TrigPump:DB$ Pump | NumAtt$ +X | References$ X SVar:X:TriggerCount$CastSACMC SVar:BuffedBy:Instant,Sorcery +DeckHints:Type$Instant|Sorcery Oracle:Trample\nWhenever you cast an instant or sorcery spell, Erratic Cyclops gets +X/+0 until end of turn, where X is that spell's converted mana cost. diff --git a/forge-gui/res/cardsfolder/f/find_finality.txt b/forge-gui/res/cardsfolder/f/find_finality.txt index 28a07e6d50f..2b85d2313fd 100644 --- a/forge-gui/res/cardsfolder/f/find_finality.txt +++ b/forge-gui/res/cardsfolder/f/find_finality.txt @@ -14,4 +14,5 @@ A:SP$ ChooseCard | Cost$ 4 B G | Defined$ You | Amount$ 1 | MinAmount$ 0 | Choic SVar:DBPutCounter:DB$ PutCounter | Defined$ ChosenCard | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ DBPumpAll SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature | NumAtt$ -4 | NumDef$ -4 | IsCurse$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True +DeckHas:Ability$Counters Oracle:You may put two +1/+1 counters on a creature you control. Then all creatures get -4/-4 until end of turn. diff --git a/forge-gui/res/cardsfolder/f/fire_urchin.txt b/forge-gui/res/cardsfolder/f/fire_urchin.txt index 4e4e22a9def..02cc79bb57e 100644 --- a/forge-gui/res/cardsfolder/f/fire_urchin.txt +++ b/forge-gui/res/cardsfolder/f/fire_urchin.txt @@ -6,4 +6,5 @@ K:Trample T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever you cast an instant or sorcery spell, CARDNAME gets +1/+0 until end of turn. SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ 1 SVar:BuffedBy:Instant,Sorcery +DeckHints:Type$Instant|Sorcery Oracle:Trample\nWhenever you cast an instant or sorcery spell, Fire Urchin gets +1/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/f/fireminds_research.txt b/forge-gui/res/cardsfolder/f/fireminds_research.txt index b2a23c01b04..fc7c35836ce 100644 --- a/forge-gui/res/cardsfolder/f/fireminds_research.txt +++ b/forge-gui/res/cardsfolder/f/fireminds_research.txt @@ -8,4 +8,5 @@ DeckHints:Type$Instant | Sorcery A:AB$ Draw | Cost$ 1 U SubCounter<2/CHARGE> | NumCards$ 1 | SpellDescription$ Draw a card. A:AB$ DealDamage | Cost$ 1 R SubCounter<5/CHARGE> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 5 | SpellDescription$ CARDNAME deals 5 damage to any target. SVar:RemRandomDeck:True +DeckNeeds:Type$Instant|Sorcery Oracle:Whenever you cast an instant or sorcery spell, put a charge counter on Firemind's Research.\n{1}{U}, Remove two charge counters from Firemind's Research: Draw a card.\n{1}{R}, Remove five charge counters from Firemind's Research: It deals 5 damage to any target. diff --git a/forge-gui/res/cardsfolder/g/gird_for_battle.txt b/forge-gui/res/cardsfolder/g/gird_for_battle.txt index 305c43656e3..0f10b839ce2 100644 --- a/forge-gui/res/cardsfolder/g/gird_for_battle.txt +++ b/forge-gui/res/cardsfolder/g/gird_for_battle.txt @@ -2,4 +2,5 @@ Name:Gird for Battle ManaCost:W Types:Sorcery A:SP$ PutCounter | Cost$ W | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 2 | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on each of up to two target creatures. +DeckHas:Ability$Counters Oracle:Put a +1/+1 counter on each of up to two target creatures. diff --git a/forge-gui/res/cardsfolder/g/glowspore_shaman.txt b/forge-gui/res/cardsfolder/g/glowspore_shaman.txt index 518b808f7c1..c5c3d74e1e7 100644 --- a/forge-gui/res/cardsfolder/g/glowspore_shaman.txt +++ b/forge-gui/res/cardsfolder/g/glowspore_shaman.txt @@ -5,4 +5,5 @@ PT:3/1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMill | TriggerDescription$ When CARDNAME enters the battlefield, put the top three cards of your library into your graveyard. You may put a land card from your graveyard on top of your library. SVar:TrigMill:DB$ Mill | NumCards$ 3 | Defined$ You | SubAbility$ DBChangeZone SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Library | OptionalDecider$ You | ChangeType$ Land.YouOwn | ChangeNum$ 1 | Hidden$ True | Optional$ True +DeckHas:Ability$Graveyard Oracle:When Glowspore Shaman enters the battlefield, put the top three cards of your library into your graveyard. You may put a land card from your graveyard on top of your library. diff --git a/forge-gui/res/cardsfolder/g/goblin_banneret.txt b/forge-gui/res/cardsfolder/g/goblin_banneret.txt index 5419f82bfbc..b1bcc1bccd3 100644 --- a/forge-gui/res/cardsfolder/g/goblin_banneret.txt +++ b/forge-gui/res/cardsfolder/g/goblin_banneret.txt @@ -4,4 +4,5 @@ Types:Creature Goblin Soldier PT:1/1 K:Mentor A:AB$ Pump | Cost$ 1 R | NumAtt$ +2 | SpellDescription$ CARDNAME gets +2/+0 until end of turn. +DeckHas:Ability$Counters Oracle:Mentor (Whenever this creature attacks, put a +1/+1 counter on target attacking creature with lesser power.)\n{1}{R}: Goblin Banneret gets +2/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/g/golgari_raiders.txt b/forge-gui/res/cardsfolder/g/golgari_raiders.txt index 2edb4dec836..68b269f346b 100644 --- a/forge-gui/res/cardsfolder/g/golgari_raiders.txt +++ b/forge-gui/res/cardsfolder/g/golgari_raiders.txt @@ -6,4 +6,5 @@ K:Haste K:etbCounter:P1P1:X:no Condition:Undergrowth - CARDNAME enters the battlefield with a +1/+1 counter on it for each creature card in your graveyard. SVar:X:Count$LastStateGraveyard Creature.YouCtrl SVar:NeedsToPlayVar:X GE3 +DeckHas:Ability$Counters Oracle:Haste\nUndergrowth — Golgari Raiders enters the battlefield with a +1/+1 counter on it for each creature card in your graveyard. diff --git a/forge-gui/res/cardsfolder/g/gruesome_menagerie.txt b/forge-gui/res/cardsfolder/g/gruesome_menagerie.txt index 46c3ea0f004..8a28cd52744 100644 --- a/forge-gui/res/cardsfolder/g/gruesome_menagerie.txt +++ b/forge-gui/res/cardsfolder/g/gruesome_menagerie.txt @@ -6,4 +6,5 @@ SVar:DBChoose2:DB$ ChooseCard | Defined$ You | Choices$ Creature.YouOwn+cmcEQ2 | SVar:DBChoose3:DB$ ChooseCard | Defined$ You | Choices$ Creature.YouOwn+cmcEQ3 | ChoiceZone$ Graveyard | Amount$ 1 | SubAbility$ DBReturn | RememberChosen$ True | SpellDescription$ Choose a creature card with converted mana cost 3 in your graveyard. SVar:DBReturn:DB$ ChangeZoneAll | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Card.IsRemembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:NeedsToPlay:Creature.YouCtrl+inZoneGraveyard+cmcLE3 Oracle:Choose a creature card with converted mana cost 1 in your graveyard, then do the same for creature cards with converted mana costs 2 and 3. Return those cards to the battlefield. diff --git a/forge-gui/res/cardsfolder/g/guildmages_forum.txt b/forge-gui/res/cardsfolder/g/guildmages_forum.txt index 1eb1bca9658..0dfcfc4b524 100644 --- a/forge-gui/res/cardsfolder/g/guildmages_forum.txt +++ b/forge-gui/res/cardsfolder/g/guildmages_forum.txt @@ -2,4 +2,5 @@ Name:Guildmages' Forum Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ 1 T | Produced$ Any | AddsCounters$ Card.Creature+MultiColor_P1P1_1 | SpellDescription$ Add one mana of any color. If that mana is spent on a multicolored creature spell, that creature enters the battlefield with an additional +1/+1 counter on it. +DeckHas:Ability$Counters Oracle:{T}: Add {C}.\n{1}, {T}: Add one mana of any color. If that mana is spent on a multicolored creature spell, that creature enters the battlefield with an additional +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/h/haazda_marshal.txt b/forge-gui/res/cardsfolder/h/haazda_marshal.txt index 5eb0f677523..62edb4876d3 100644 --- a/forge-gui/res/cardsfolder/h/haazda_marshal.txt +++ b/forge-gui/res/cardsfolder/h/haazda_marshal.txt @@ -5,4 +5,5 @@ PT:1/1 T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | CheckSVar$ AttackerTest | SVarCompare$ GE2 | NoResolvingCheck$ True | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME and at least two other creatures attack, create a 1/1 white Soldier creature token with lifelink. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_soldier_lifelink SVar:AttackerTest:Count$Valid Creature.attacking+Other +DeckHas:Ability$Token Oracle:Whenever Haazda Marshal and at least two other creatures attack, create a 1/1 white Soldier creature token with lifelink. diff --git a/forge-gui/res/cardsfolder/h/hammer_dropper.txt b/forge-gui/res/cardsfolder/h/hammer_dropper.txt index d0d0d0a3193..dd2b2f37495 100644 --- a/forge-gui/res/cardsfolder/h/hammer_dropper.txt +++ b/forge-gui/res/cardsfolder/h/hammer_dropper.txt @@ -3,4 +3,5 @@ ManaCost:2 R W Types:Creature Giant Soldier PT:5/2 K:Mentor +DeckHas:Ability$Counters Oracle:Mentor (Whenever this creature attacks, put a +1/+1 counter on target attacking creature with lesser power.) diff --git a/forge-gui/res/cardsfolder/h/house_guildmage.txt b/forge-gui/res/cardsfolder/h/house_guildmage.txt index 08847cc9e65..4a0c6f751c1 100644 --- a/forge-gui/res/cardsfolder/h/house_guildmage.txt +++ b/forge-gui/res/cardsfolder/h/house_guildmage.txt @@ -4,4 +4,5 @@ Types:Creature Human Wizard PT:2/2 A:AB$ Pump | Cost$ 1 U T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | IsCurse$ True | SpellDescription$ Target creature doesn't untap during its controller's next untap step. A:AB$ Surveil | Cost$ 2 B T | Amount$ 2 | SpellDescription$ Surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) +DeckHas:Ability$Surveil & Ability$Graveyard Oracle:{1}{U}, {T}: Target creature doesn't untap during its controller's next untap step.\n{2}{B}, {T}: Surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) diff --git a/forge-gui/res/cardsfolder/i/invert_invent.txt b/forge-gui/res/cardsfolder/i/invert_invent.txt index 9e5803db4e7..63f7d936e87 100644 --- a/forge-gui/res/cardsfolder/i/invert_invent.txt +++ b/forge-gui/res/cardsfolder/i/invert_invent.txt @@ -13,4 +13,5 @@ Types:Instant A:SP$ ChangeZone | Cost$ 4 U R | Origin$ Library | Destination$ Hand | ChangeType$ Instant | ChangeNum$ 1 | SubAbility$ DBChange | SpellDescription$ Search your library for and instant permanent and/or a sorcery card, reveal them, put them into your hand, then shuffle your library. SVar:DBChange:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Sorcery | ChangeNum$ 1 | Shuffle$ True SVar:RemRandomDeck:True +DeckHints:Type$Instant|Sorcery Oracle:Search your library for an instant card and/or a sorcery card, reveal them, put them into your hand, then shuffle your library. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/i/ironshell_beetle.txt b/forge-gui/res/cardsfolder/i/ironshell_beetle.txt index 39ad66852ba..6cde56e4cc5 100644 --- a/forge-gui/res/cardsfolder/i/ironshell_beetle.txt +++ b/forge-gui/res/cardsfolder/i/ironshell_beetle.txt @@ -4,5 +4,6 @@ Types:Creature Insect PT:1/1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPut | TriggerDescription$ When CARDNAME enters the battlefield, put a +1/+1 counter on target creature. SVar:TrigPut:DB$PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 +DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/ironshell_beetle.jpg Oracle:When Ironshell Beetle enters the battlefield, put a +1/+1 counter on target creature. diff --git a/forge-gui/res/cardsfolder/i/izoni_thousand_eyed.txt b/forge-gui/res/cardsfolder/i/izoni_thousand_eyed.txt index c5fd38febe0..caf403eb29a 100644 --- a/forge-gui/res/cardsfolder/i/izoni_thousand_eyed.txt +++ b/forge-gui/res/cardsfolder/i/izoni_thousand_eyed.txt @@ -7,4 +7,5 @@ SVar:TrigToken:DB$Token | TokenAmount$ X | TokenName$ Insect | TokenTypes$ Creat SVar:X:Count$TypeInYourYard.Creature A:AB$ GainLife | Cost$ B G Sac<1/Creature.Other/another creature> | Defined$ You | LifeAmount$ 1 | SubAbility$ DBDraw | SpellDescription$ You gain 1 life and draw a card. SVar:DBDraw:DB$ Draw | NumCards$ 1 +DeckHas:Ability$Token Oracle:Undergrowth — When Izoni, Thousand-Eyed enters the battlefield, create a 1/1 black and green Insect creature token for each creature card in your graveyard.\n{B}{G}, Sacrifice another creature: You gain 1 life and draw a card. diff --git a/forge-gui/res/cardsfolder/k/knight_of_autumn.txt b/forge-gui/res/cardsfolder/k/knight_of_autumn.txt index 907e199df3c..773ea6207c9 100644 --- a/forge-gui/res/cardsfolder/k/knight_of_autumn.txt +++ b/forge-gui/res/cardsfolder/k/knight_of_autumn.txt @@ -7,4 +7,5 @@ SVar:TrigCharm:DB$ Charm | Choices$ DBPump,DBDestroy,DBGainLife SVar:DBPump:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ 2 | SpellDescription$ Put two +1/+1 counters on CARDNAME. SVar:DBDestroy:DB$ Destroy | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy target artifact or enchantment. SVar:DBGainLife:DB$ GainLife | LifeAmount$ 4 | SpellDescription$ You gain 4 life. +DeckHas:Ability$Counters Oracle:When Knight of Autumn enters the battlefield, choose one —\n• Put two +1/+1 counters on Knight of Autumn.\n• Destroy target artifact or enchantment.\n• You gain 4 life. diff --git a/forge-gui/res/cardsfolder/l/lazav_the_multifarious.txt b/forge-gui/res/cardsfolder/l/lazav_the_multifarious.txt index 57ab5d3a9fa..374c88202d1 100644 --- a/forge-gui/res/cardsfolder/l/lazav_the_multifarious.txt +++ b/forge-gui/res/cardsfolder/l/lazav_the_multifarious.txt @@ -6,4 +6,5 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigSurveil:DB$ Surveil | Amount$ 1 A:AB$ Clone | Cost$ X | ValidTgts$ Creature.YouOwn | References$ X | TgtZone$ Graveyard | TgtPrompt$ Select target creature card in your graveyard | AddTypes$ Legendary | NewName$ Lazav, the Multifarious | GainThisAbility$ True | SpellDescription$ CARDNAME becomes a copy of target creature card in your graveyard with converted mana cost X, except its name is CARDNAME, it's legendary in addition to it's other types, and it has this ability. SVar:X:Targeted$CardManaCost +DeckHas:Ability$Surveil & Ability$Graveyard Oracle:When Lazav, the Multifarious enters the battlefield, surveil 1. (Look at the top card of your library. You may put that card into your graveyard.)\n{X}: Lazav, the Multifarious becomes a copy of target creature card in your graveyard with converted mana cost X, except its name is Lazav, the Multifarious, it's legendary in addition to its other types, and it has this ability. diff --git a/forge-gui/res/cardsfolder/l/league_guildmage.txt b/forge-gui/res/cardsfolder/l/league_guildmage.txt index 1c07ac501bf..c0cdc4c664c 100644 --- a/forge-gui/res/cardsfolder/l/league_guildmage.txt +++ b/forge-gui/res/cardsfolder/l/league_guildmage.txt @@ -5,4 +5,5 @@ PT:2/2 A:AB$ Draw | Cost$ 3 U T | NumCards$ 1 | SpellDescription$ Draw a card. A:AB$ CopySpellAbility | Cost$ X R T | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TargetType$ Spell | SpellDescription$ Copy target instant or sorcery spell you control with converted mana cost X. You may choose new targets for the copy. SVar:X:Targeted$CardManaCost +DeckHints:Type$Instant|Sorcery Oracle:{3}{U}, {T}: Draw a card.\n{X}{R}, {T}: Copy target instant or sorcery spell you control with converted mana cost X. You may choose new targets for the copy. diff --git a/forge-gui/res/cardsfolder/l/leapfrog.txt b/forge-gui/res/cardsfolder/l/leapfrog.txt index 7a7ada2f5a2..345db3634bb 100644 --- a/forge-gui/res/cardsfolder/l/leapfrog.txt +++ b/forge-gui/res/cardsfolder/l/leapfrog.txt @@ -4,4 +4,5 @@ Types:Creature Frog PT:3/1 S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Flying | CheckSVar$ X | SVarCompare$ GE1 | Description$ CARDNAME has flying as long as you've cast and instant or sorcery spell this turn. SVar:X:Count$ThisTurnCast_Instant.YouCtrl,Sorcery.YouCtrl +DeckHints:Type$Instant|Sorcery Oracle:Leapfrog has flying as long as you've cast and instant or sorcery spell this turn. diff --git a/forge-gui/res/cardsfolder/m/march_of_the_multitudes.txt b/forge-gui/res/cardsfolder/m/march_of_the_multitudes.txt index 693f71a3d99..c9a7aac646e 100644 --- a/forge-gui/res/cardsfolder/m/march_of_the_multitudes.txt +++ b/forge-gui/res/cardsfolder/m/march_of_the_multitudes.txt @@ -4,4 +4,5 @@ Types:Instant K:Convoke A:SP$ Token | Cost$ X G W W | TokenAmount$ X | References$ X | TokenScript$ w_1_1_soldier_lifelink | SpellDescription$ Create X 1/1 white Soldier creature tokens with lifelink. SVar:X:Count$xPaid +DeckHas:Ability$Token Oracle:Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of the creature's color.)\nCreate X 1/1 white Soldier creature tokens with lifelink. diff --git a/forge-gui/res/cardsfolder/m/mephitic_vapors.txt b/forge-gui/res/cardsfolder/m/mephitic_vapors.txt index 20328c8009e..eeca0cc0668 100644 --- a/forge-gui/res/cardsfolder/m/mephitic_vapors.txt +++ b/forge-gui/res/cardsfolder/m/mephitic_vapors.txt @@ -3,4 +3,5 @@ ManaCost:2 B Types:Sorcery A:SP$ PumpAll | Cost$ 2 B | ValidCards$ Creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | Subability$ DBSurveil | SpellDescription$ All creatures get -1/-1 until end of turn. SVar:DBSurveil:DB$ Surveil | Amount$ 2 +DeckHas:Ability$Surveil & Ability$Graveyard Oracle:All creatures get -1/-1 until end of turn.\nSurveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on the top of your library in any order.) diff --git a/forge-gui/res/cardsfolder/m/mission_briefing.txt b/forge-gui/res/cardsfolder/m/mission_briefing.txt index 8c0d5ca1156..3fc8640f76e 100644 --- a/forge-gui/res/cardsfolder/m/mission_briefing.txt +++ b/forge-gui/res/cardsfolder/m/mission_briefing.txt @@ -9,5 +9,6 @@ SVar:ReplaceGraveyard:Event$ Moved | ValidCard$ Card.IsRemembered | Origin$ Stac SVar:MoveExile:DB$ ChangeZone | Defined$ ReplacedCard | Origin$ Stack | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:RemAIDeck:True +DeckHas:Ability$Surveil & Ability$Graveyard SVar:Picture:http://www.wizards.com/global/images/magic/general/mission_briefing.jpg Oracle:Surveil 2, then choose an instant or sorcery card in your graveyard. You may cast that card this turn. If that card would be put into your graveyard this turn, exile it instead. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/m/murmuring_mystic.txt b/forge-gui/res/cardsfolder/m/murmuring_mystic.txt index e564cee9162..7947d0ef419 100644 --- a/forge-gui/res/cardsfolder/m/murmuring_mystic.txt +++ b/forge-gui/res/cardsfolder/m/murmuring_mystic.txt @@ -5,4 +5,6 @@ PT:1/5 T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you cast an instant or sorcery spell, create a 1/1 blue Bird Illusion creature token with flying. SVar:TrigToken:DB$Token | TokenAmount$ 1 | TokenScript$ u_1_1_bird_illusion_flying SVar:BuffedBy:Instant,Sorcery +DeckHints:Ability$Instant|Sorcery +DeckHas:Ability$Token Oracle:Whenever you cast an instant or sorcery spell, create a 1/1 blue Bird Illusion creature token with flying. diff --git a/forge-gui/res/cardsfolder/n/nightveil_sprite.txt b/forge-gui/res/cardsfolder/n/nightveil_sprite.txt index 82043a4765a..bd2c50afe9f 100644 --- a/forge-gui/res/cardsfolder/n/nightveil_sprite.txt +++ b/forge-gui/res/cardsfolder/n/nightveil_sprite.txt @@ -6,4 +6,5 @@ K:Flying T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigSurveil | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME attacks, surveil 1. (Look at the top card of your library. You may put that card into your graveyard.) SVar:TrigSurveil:DB$ Surveil | Amount$ 1 SVar:HasAttackEffect:TRUE +DeckHas:Ability$Surveil & Ability$Graveyard Oracle:Flying\nWhenever Nightveil Sprite attacks, surveil 1. (Look at the top card of your library. You may put that card into your graveyard.) diff --git a/forge-gui/res/cardsfolder/n/niv_mizzet_parun.txt b/forge-gui/res/cardsfolder/n/niv_mizzet_parun.txt index 5e02fcdb3b0..225b2a575c5 100644 --- a/forge-gui/res/cardsfolder/n/niv_mizzet_parun.txt +++ b/forge-gui/res/cardsfolder/n/niv_mizzet_parun.txt @@ -8,4 +8,5 @@ T:Mode$ Drawn | ValidCard$ Card.YouOwn | TriggerZones$ Battlefield | Execute$ Tr SVar:TrigDealDamage:DB$DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever a player casts an instant or sorcery spell, you draw a card. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 +DeckHints:Type$Instant|Sorcery Oracle:Niv-Mizzet, Parun can't be countered.\nFlying\nWhenever you draw a card, Niv-Mizzet, Parun deals 1 damage to any target.\nWhenever a player casts an instant or sorcery spell, you draw a card. diff --git a/forge-gui/res/cardsfolder/n/notion_rain.txt b/forge-gui/res/cardsfolder/n/notion_rain.txt index 2e49bc7cf74..c932c15d821 100644 --- a/forge-gui/res/cardsfolder/n/notion_rain.txt +++ b/forge-gui/res/cardsfolder/n/notion_rain.txt @@ -4,4 +4,5 @@ Types:Sorcery A:SP$ Surveil | Cost$ 1 U B | Amount$ 2 | SubAbility$ DBDraw | SpellDescription$ Surveil 2, then draw two cards. CARDNAME deals 2 damage to you. SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 2 | SubAbility$ DBDamage SVar:DBDamage:DB$ DealDamage | Defined$ You | NumDmg$ 2 +DeckHas:Ability$Surveil & Ability$Graveyard Oracle:Surveil 2, then draw two cards. Rain of Notions deals 2 damage to you. (To surveil 2, look at the top two cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/p/parhelion_patrol.txt b/forge-gui/res/cardsfolder/p/parhelion_patrol.txt index 35265bd259b..d4ed407ad8a 100644 --- a/forge-gui/res/cardsfolder/p/parhelion_patrol.txt +++ b/forge-gui/res/cardsfolder/p/parhelion_patrol.txt @@ -5,4 +5,5 @@ PT:2/3 K:Flying K:Vigilance K:Mentor +DeckHas:Ability$Counters Oracle:Flying, vigilance\nMentor (Whenever this creature attacks, put a +1/+1 counter on target attacking creature with lesser power.) diff --git a/forge-gui/res/cardsfolder/p/pelt_collector.txt b/forge-gui/res/cardsfolder/p/pelt_collector.txt index 1057ed08c4e..56e8b90ad45 100644 --- a/forge-gui/res/cardsfolder/p/pelt_collector.txt +++ b/forge-gui/res/cardsfolder/p/pelt_collector.txt @@ -7,4 +7,5 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creatu T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl+powerGTX+Other | References$ X | TriggerZones$ Battlefield | Secondary$ True | Execute$ TrigPutCounter | TriggerDescription$ Whenever another creature you control enters the battlefield or dies, if that creature's power is greater than CARDNAME's, put a +1/+1 counter on CARDNAME. SVar:X:Count$CardPower SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +DeckHas:Ability$Counters Oracle:Whenever another creature you control enters the battlefield or dies, if that creature's power is greater than Pelt Collector's, put a +1/+1 counter on Pelt Collector.\nAs long as Pelt Collector has three or more +1/+1 counters on it, it has trample. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/p/piston_fist_cyclops.txt b/forge-gui/res/cardsfolder/p/piston_fist_cyclops.txt index 6382caaec7c..c632d6cad7b 100644 --- a/forge-gui/res/cardsfolder/p/piston_fist_cyclops.txt +++ b/forge-gui/res/cardsfolder/p/piston_fist_cyclops.txt @@ -6,4 +6,5 @@ K:Defender S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ CARDNAME can attack as though it didn't have defender. | CheckSVar$ X | SVarCompare$ GE1 | Description$ As long as you've cast an instant or sorcery spell this turn, CARDNAME can attack as though it didn't have defender. SVar:X:Count$ThisTurnCast_Instant.YouOwn,Sorcery.YouOwn SVar:BuffedBy:Instant,Sorcery +DeckHints:Type$Instant|Sorcery Oracle:Defender\nAs long as you've cast an instant or sorcery spell this turn, Piston-Fist Cyclops can attack as though it didn't have defender. diff --git a/forge-gui/res/cardsfolder/p/price_of_fame.txt b/forge-gui/res/cardsfolder/p/price_of_fame.txt index 4383c468503..83fd2baf529 100644 --- a/forge-gui/res/cardsfolder/p/price_of_fame.txt +++ b/forge-gui/res/cardsfolder/p/price_of_fame.txt @@ -6,4 +6,5 @@ A:SP$ Destroy | Cost$ 3 B | ValidTgts$ Creature | SubAbility$ DBSurveil | TgtPro SVar:CostReduction:Count$Compare CheckTgt GE1.2.0 SVar:CheckTgt:Targeted$Valid Creature.Legendary SVar:DBSurveil:DB$ Surveil | Amount$ 2 +DeckHas:Ability$Surveil & Ability$Graveyard Oracle:This spell costs {2} less to cast if it targets a legendary creature.\nDestroy target creature.\nSurveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) diff --git a/forge-gui/res/cardsfolder/r/ral_izzet_viceroy.txt b/forge-gui/res/cardsfolder/r/ral_izzet_viceroy.txt index 82e83d9f78b..1383177de97 100644 --- a/forge-gui/res/cardsfolder/r/ral_izzet_viceroy.txt +++ b/forge-gui/res/cardsfolder/r/ral_izzet_viceroy.txt @@ -12,4 +12,6 @@ SVar:TrigSpellCast:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatin SVar:EffSpellCast:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 4 | SubAbility$ EffDraw SVar:EffDraw:DB$ Draw | Defined$ You | NumCards$ 2 SVar:BuffedBy:Instant,Sorcery +DeckHints:Type$Instant|Sorcery +DeckHas:Ability$Graveyard Oracle:[+1]: Look at the top two cards of your library. Put one of them into your hand and the other into your graveyard.\n[-3]: Ral, Izzet Viceroy deals damage to target creature equal to the total number of instant and sorcery cards you own in exile and in your graveyard.\n[-8]: You get an emblem with "Whenever you cast an instant or sorcery spell, this emblem deals 4 damage to any target and you draw two cards." diff --git a/forge-gui/res/cardsfolder/r/rals_staticaster.txt b/forge-gui/res/cardsfolder/r/rals_staticaster.txt index 10dee68d58c..1c179895b30 100644 --- a/forge-gui/res/cardsfolder/r/rals_staticaster.txt +++ b/forge-gui/res/cardsfolder/r/rals_staticaster.txt @@ -7,4 +7,5 @@ T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | IsPresent$ Planeswa SVar:TrigPump:DB$ Pump | NumAtt$ X | References$ X SVar:X:Count$InYourHand SVar:BuffedBy:Ral +DeckNeeds:Type$Ral Oracle:Trample (This creature can deal excess combat damage to the player or planeswalker it's attacking.)\nWhenever Ral's Staticaster attacks, if you control a Ral planeswalker, Ral's Staticaster gets +1/+0 for each card in your hand until end of turn. diff --git a/forge-gui/res/cardsfolder/r/rampaging_monument.txt b/forge-gui/res/cardsfolder/r/rampaging_monument.txt index 82bd021bbef..b5b7db7fb21 100644 --- a/forge-gui/res/cardsfolder/r/rampaging_monument.txt +++ b/forge-gui/res/cardsfolder/r/rampaging_monument.txt @@ -7,4 +7,5 @@ K:etbCounter:P1P1:3 T:Mode$ SpellCast | ValidCard$ Card.MultiColor | ValidActivatingPlayer$ You | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a multicolored spell, put a +1/+1 counter on CARDNAME. SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 SVar:BuffedBy:Card.MultiColor +DeckHas:Ability$Counters Oracle:Trample\nRampaging Monument enters the battlefield with three +1/+1 counters on it.\nWhenever you cast a multicolored spell, put a +1/+1 counter on Rampaging Monument. diff --git a/forge-gui/res/cardsfolder/r/rhizome_lurcher.txt b/forge-gui/res/cardsfolder/r/rhizome_lurcher.txt index cee27cca260..0d374e6d17c 100644 --- a/forge-gui/res/cardsfolder/r/rhizome_lurcher.txt +++ b/forge-gui/res/cardsfolder/r/rhizome_lurcher.txt @@ -5,4 +5,5 @@ PT:2/2 K:etbCounter:P1P1:X:no Condition:Undergrowth - CARDNAME enters the battlefield with a number of +1/+1 counters on it equal to the number of creature cards in your graveyard. SVar:X:Count$TypeInYourYard.Creature SVar:NeedsToPlayVar:X GE1 +DeckHas:Ability$Counters Oracle:Undergrowth — Rhizome Lurcher enters the battlefield with a number of +1/+1 counters on it equal to the number of creature cards in your graveyard. diff --git a/forge-gui/res/cardsfolder/r/runaway_steam_kin.txt b/forge-gui/res/cardsfolder/r/runaway_steam_kin.txt index f43e7afe1e2..5c70f04198e 100644 --- a/forge-gui/res/cardsfolder/r/runaway_steam_kin.txt +++ b/forge-gui/res/cardsfolder/r/runaway_steam_kin.txt @@ -5,4 +5,5 @@ PT:1/1 T:Mode$ SpellCast | ValidCard$ Card.Red | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Card.Self+counters_LE2_P1P1 | Execute$ TrigPutCounter | TriggerDescription$ Whenever you cast a red spell, if CARDNAME has fewer than three +1/+1 counters on it, put a +1/+1 counter on CARDNAME. SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 A:AB$ Mana | Cost$ SubCounter<3/P1P1> | Produced$ R | Amount$ 3 | SpellDescription$ Add {R}{R}{R}. +DeckHas:Ability$Counters Oracle:Whenever you cast a red spell, if Runaway Steam-Kin has fewer than three +1/+1 counters on it, put a +1/+1 counter on Runaway Steam-Kin.\nRemove three +1/+1 counters from Runaway Steam-Kin: Add {R}{R}{R}. diff --git a/forge-gui/res/cardsfolder/s/sinister_sabotage.txt b/forge-gui/res/cardsfolder/s/sinister_sabotage.txt index 5dcbd3c772a..26b0076b909 100644 --- a/forge-gui/res/cardsfolder/s/sinister_sabotage.txt +++ b/forge-gui/res/cardsfolder/s/sinister_sabotage.txt @@ -3,4 +3,5 @@ ManaCost:1 U U Types:Instant A:SP$ Counter | Cost$ 1 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | Subability$ DBSurveil | SpellDescription$ Counter target spell. Surveil 1 (Look at the top card of your library. You may put that card into your graveyard.) SVar:DBSurveil:DB$ Surveil | Amount$ 1 +DeckHas:Ability$Surveil & Ability$Graveyard Oracle:Counter target spell.\nSurveil 1. (Look at the top card of your library. You may put that card into your graveyard.) diff --git a/forge-gui/res/cardsfolder/s/smelt_ward_minotaur.txt b/forge-gui/res/cardsfolder/s/smelt_ward_minotaur.txt index 8c51a87d9a2..3c563b2f46a 100644 --- a/forge-gui/res/cardsfolder/s/smelt_ward_minotaur.txt +++ b/forge-gui/res/cardsfolder/s/smelt_ward_minotaur.txt @@ -5,5 +5,5 @@ PT:2/3 T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever you cast an instant or sorcery spell, target creature an opponent controls can't block this turn. SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | KW$ HIDDEN CARDNAME can't block. | IsCurse$ True SVar:BuffedBy:Instant,Sorcery -DeckHints:Type$Instant | Sorcery +DeckHints:Type$Instant|Sorcery Oracle:Whenever you cast an instant or sorcery spell, target creature an opponent controls can't block this turn. diff --git a/forge-gui/res/cardsfolder/s/sprouting_renewal.txt b/forge-gui/res/cardsfolder/s/sprouting_renewal.txt index 133ca46ab57..9f75927afbd 100644 --- a/forge-gui/res/cardsfolder/s/sprouting_renewal.txt +++ b/forge-gui/res/cardsfolder/s/sprouting_renewal.txt @@ -5,4 +5,5 @@ K:Convoke A:SP$ Charm | Cost$ 2 G | Choices$ DBToken,DBDestroy SVar:DBDestroy:DB$ Destroy | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy target artifact or enchantment. SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ wg_2_2_elf_knight_vigilance | SpellDescription$ Create a 2/2 green and white Elf Knight creature token with vigilance. +DeckHas:Ability$Token Oracle:Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nChoose one —\n• Create a 2/2 green and white Elf Knight creature token with vigilance.\n• Destroy target artifact or enchantment. diff --git a/forge-gui/res/cardsfolder/s/sunhome_stalwart.txt b/forge-gui/res/cardsfolder/s/sunhome_stalwart.txt index 108c54611cd..3619e11a263 100644 --- a/forge-gui/res/cardsfolder/s/sunhome_stalwart.txt +++ b/forge-gui/res/cardsfolder/s/sunhome_stalwart.txt @@ -4,4 +4,5 @@ Types:Creature Human Soldier PT:2/2 K:First Strike K:Mentor +DeckHas:Ability$Counters Oracle:First strike\nMentor (Whenever this creature attacks, put a +1/+1 counter on target attacking creature with lesser power.) diff --git a/forge-gui/res/cardsfolder/t/tajic_legions_edge.txt b/forge-gui/res/cardsfolder/t/tajic_legions_edge.txt index 4fd9fb0b3a4..dc2adc1103c 100644 --- a/forge-gui/res/cardsfolder/t/tajic_legions_edge.txt +++ b/forge-gui/res/cardsfolder/t/tajic_legions_edge.txt @@ -6,4 +6,5 @@ K:Haste K:Mentor R:Event$ DamageDone | ActiveZones$ Battlefield | Prevent$ True | ValidTarget$ Creature.Other+YouCtrl | IsCombat$ False | Description$ Prevent all noncombat damage that would be dealt to other creatures you control. A:AB$ Pump | Cost$ R W | Defined$ Self | KW$ First Strike | SpellDescription$ CARDNAME gains first strike until end of turn. +DeckHas:Ability$Counters Oracle:Haste\nMentor (Whenever this creature attacks, put a +1/+1 counter on target attacking creature with lesser power.)\nPrevent all noncombat damage that would be dealt to other creatures you control.\n{R}{W}: Tajic, Legion's Edge gains first strike until end of turn. diff --git a/forge-gui/res/cardsfolder/t/thought_erasure.txt b/forge-gui/res/cardsfolder/t/thought_erasure.txt index 02aab8b1c92..57bdc88fe1c 100644 --- a/forge-gui/res/cardsfolder/t/thought_erasure.txt +++ b/forge-gui/res/cardsfolder/t/thought_erasure.txt @@ -3,4 +3,5 @@ ManaCost:U B Types:Sorcery A:SP$ Discard | Cost$ U B | ValidTgts$ Opponent | DiscardValid$ Card.nonLand | NumCards$ 1 | Mode$ RevealYouChoose | Subability$ DBSurveil | SpellDescription$ Target opponent reveals their hand. You choose a nonland card from it. That player discards that card. Surveil 1 (Look at the top card of your library. You may put that card into your graveyard.) SVar:DBSurveil:DB$ Surveil | Amount$ 1 +DeckHas:Ability$Surveil & Ability$Graveyard Oracle:Target opponent reveals their hand. You choose a nonland card from it. That player discards that card.\nSurveil 1. (Look at the top card of your library. You may put it into your graveyard.) diff --git a/forge-gui/res/cardsfolder/t/thoughtbound_phantasm.txt b/forge-gui/res/cardsfolder/t/thoughtbound_phantasm.txt index 718268ba991..f2c53932858 100644 --- a/forge-gui/res/cardsfolder/t/thoughtbound_phantasm.txt +++ b/forge-gui/res/cardsfolder/t/thoughtbound_phantasm.txt @@ -6,4 +6,6 @@ K:Defender T:Mode$ Surveil | ValidPlayer$ You | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever you surveil, put a +1/+1 counter on CARDNAME SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 S:Mode$ Continuous | Affected$ Card.Self+counters_GE3_P1P1 | AddHiddenKeyword$ CARDNAME can attack as though it didn't have defender. | Description$ As long as CARDNAME has three or more +1/+1 counters on it, it can attack +DeckNeeds:Ability$Surveil +DeckHas:Ability$Counters Oracle:Defender\nWhenever you surveil, put a +1/+1 counter on Thoughtbound Phantasm.\nAs long as Thoughtbound Phantasm has three or more +1/+1 counters on it, it can attack as though it didn't have defender. diff --git a/forge-gui/res/cardsfolder/t/thousand_year_storm.txt b/forge-gui/res/cardsfolder/t/thousand_year_storm.txt index 2ca167294a7..e4425747b73 100644 --- a/forge-gui/res/cardsfolder/t/thousand_year_storm.txt +++ b/forge-gui/res/cardsfolder/t/thousand_year_storm.txt @@ -4,4 +4,5 @@ Types:Enchantment T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | Execute$ TrigCopy | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast an instant or sorcery spell, copy it for each other instant and sorcery spell you've cast before it this turn. You may choose new targets for the copies. SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ X | References$ X SVar:X:TriggerObjectsCurrentCastSpells$Valid Sorcery.YouCtrl,Instant.YouCtrl/Minus.1 +DeckHints:Type$Instant|Sorcery Oracle:Whenever you cast an instant or sorcery spell, copy it for each other instant and sorcery spell you've cast before it this turn. You may choose new targets for the copies. diff --git a/forge-gui/res/cardsfolder/t/trostani_discordant.txt b/forge-gui/res/cardsfolder/t/trostani_discordant.txt index 53c3ed895e4..a6c268ead08 100644 --- a/forge-gui/res/cardsfolder/t/trostani_discordant.txt +++ b/forge-gui/res/cardsfolder/t/trostani_discordant.txt @@ -8,4 +8,5 @@ SVar:TrigToken:DB$ Token | TokenAmount$ 2 | TokenScript$ w_1_1_soldier_lifelink T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigGainControl | TriggerDescription$ At the beginning of your end step, each player gains control of all creatures they own. SVar:TrigGainControl:DB$ RepeatEach | RepeatPlayers$ Player | AILogic$ GainControlOwns | RepeatSubAbility$ DBGainControl | SpellDescription$ Each player gains control of all creatures they own. SVar:DBGainControl:DB$ GainControl | AllValid$ Creature.RememberedPlayerOwn | NewController$ Player.IsRemembered +DeckHas:Ability$Token Oracle:Other creatures you control get +1/+1.\nWhen Trostani Discordant enters the battlefield, create two 1/1 white Soldier creature tokens with lifelink.\nAt the beginning of your end step, each player gains control of all creatures they own. diff --git a/forge-gui/res/cardsfolder/t/truefire_captain.txt b/forge-gui/res/cardsfolder/t/truefire_captain.txt index 9686427b472..3c254c3ef0f 100644 --- a/forge-gui/res/cardsfolder/t/truefire_captain.txt +++ b/forge-gui/res/cardsfolder/t/truefire_captain.txt @@ -7,4 +7,5 @@ T:Mode$ DamageDoneOnce | Execute$ TrigDamage | ValidTarget$ Card.Self | TriggerZ SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Player | TgtPrompt$ Select target player | NumDmg$ X | References$ X SVar:X:TriggerCount$DamageAmount SVar:HasCombatEffect:TRUE +DeckHas:Ability$Counters Oracle:Mentor (Whenever this creature attacks, put a +1/+1 counter on target attacking creature with lesser power.)\nWhenever Truefire Captain is dealt damage, it deals that much damage to target player. diff --git a/forge-gui/res/cardsfolder/u/unexplained_disappearance.txt b/forge-gui/res/cardsfolder/u/unexplained_disappearance.txt index 5f90caabb59..761e0b83aea 100644 --- a/forge-gui/res/cardsfolder/u/unexplained_disappearance.txt +++ b/forge-gui/res/cardsfolder/u/unexplained_disappearance.txt @@ -3,4 +3,5 @@ ManaCost:1 U Types:Instant A:SP$ ChangeZone | Cost$ 1 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | Subability$ DBSurveil | SpellDescription$ Return target creature to its owner's hand. Surveil 1 (Look at the top card of your library. You may put that card into your graveyard.) SVar:DBSurveil:DB$ Surveil | Amount$ 1 +DeckHas:Ability$Surveil & Ability$Graveyard Oracle:Return target creature to its owner's hand.\nSurveil 1. (Look at the top card of your library. You may put that card into your graveyard.) diff --git a/forge-gui/res/cardsfolder/v/venerated_loxodon.txt b/forge-gui/res/cardsfolder/v/venerated_loxodon.txt index f5add8bf2ce..09f861fd655 100644 --- a/forge-gui/res/cardsfolder/v/venerated_loxodon.txt +++ b/forge-gui/res/cardsfolder/v/venerated_loxodon.txt @@ -5,4 +5,5 @@ PT:4/4 K:Convoke T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPutCounterAll | TriggerDescription$ When CARDNAME enters the battlefield, put a +1/+1 counter on each creature that convoked it. SVar:TrigPutCounterAll:DB$ PutCounterAll | ValidCards$ Creature.convoked | CounterType$ P1P1 | CounterNum$ 1 +DeckHas:Ability$Counters Oracle:Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of the creature's color.)\nWhen Venerated Loxodon enters the battlefield, put a +1/+1 counter on each creature that convoked it. diff --git a/forge-gui/res/cardsfolder/v/vraska_regal_gorgon.txt b/forge-gui/res/cardsfolder/v/vraska_regal_gorgon.txt index af5df6d1ba6..97a352881c4 100644 --- a/forge-gui/res/cardsfolder/v/vraska_regal_gorgon.txt +++ b/forge-gui/res/cardsfolder/v/vraska_regal_gorgon.txt @@ -7,4 +7,5 @@ SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ Menace A:AB$ Destroy | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Destroy target creature. A:AB$ PutCounterAll | Cost$ SubCounter<10/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidCards$ Creature.YouCtrl | CounterType$ P1P1 | CounterNum$ X | Reference$ X | SpellDescription$ For each creature card in your graveyard, put a +1/+1 counter on each creature you control. SVar:X:Count$ValidGraveyard Creature.YouCtrl +DeckHas:Ability$Counters Oracle:[+2]: Put a +1/+1 counter on up to one target creature. That creature gains menace until end of turn.\n[-3]: Destroy target creature.\n[-10]: For each creature card in your graveyard, put a +1/+1 counter on each creature you control. diff --git a/forge-gui/res/cardsfolder/w/wand_of_vertebrae.txt b/forge-gui/res/cardsfolder/w/wand_of_vertebrae.txt index f110a982d8d..bea9f97917b 100644 --- a/forge-gui/res/cardsfolder/w/wand_of_vertebrae.txt +++ b/forge-gui/res/cardsfolder/w/wand_of_vertebrae.txt @@ -3,4 +3,5 @@ ManaCost:1 Types:Artifact A:AB$ Mill | Cost$ T | Defined$ You | NumCards$ 1 | SpellDescription$ Put the top card of your library into your graveyard. A:AB$ ChangeZone | Cost$ 2 T Exile<1/CARDNAME> | Origin$ Graveyard | Destination$ Library | TargetMin$ 0 | TargetMax$ 5 | Shuffle$ True | TgtPrompt$ Select target card in your graveyard | ValidTgts$ Card.YouCtrl | SpellDescription$ Shuffle up to five target cards from your graveyard into your library. +DeckHas:Ability$Graveyard Oracle:{T}: Put the top card of your library into your graveyard.\n{2}, {T}, Exile Wand of Vertebrae: Shuffle up to five target cards from your graveyard into your library. diff --git a/forge-gui/res/cardsfolder/w/watcher_in_the_mist.txt b/forge-gui/res/cardsfolder/w/watcher_in_the_mist.txt index ba3f6aa313e..e2caac36008 100644 --- a/forge-gui/res/cardsfolder/w/watcher_in_the_mist.txt +++ b/forge-gui/res/cardsfolder/w/watcher_in_the_mist.txt @@ -5,4 +5,5 @@ PT:3/4 K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSurveil | TriggerDescription$ When CARDNAME enters the battlefield, surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on the top of your library in any order.) SVar:TrigSurveil:DB$ Surveil | Defined$ You | Amount$ 2 +DeckHas:Ability$Surveil & Ability$Graveyard Oracle:Flying\nWhen Watcher in the Mist enters the battlefield, surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on the top of your library in any order.) diff --git a/forge-gui/res/cardsfolder/w/wee_dragonauts.txt b/forge-gui/res/cardsfolder/w/wee_dragonauts.txt index 029b30cf7d6..ca007c6b11c 100644 --- a/forge-gui/res/cardsfolder/w/wee_dragonauts.txt +++ b/forge-gui/res/cardsfolder/w/wee_dragonauts.txt @@ -6,5 +6,6 @@ K:Flying T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever you cast an instant or sorcery spell, CARDNAME gets +2/+0 until end of turn. SVar:TrigPump:DB$Pump | Defined$ Self | NumAtt$ 2 SVar:BuffedBy:Instant,Sorcery +DeckHints:Type$Instant|Sorcery SVar:Picture:http://www.wizards.com/global/images/magic/general/wee_dragonauts.jpg Oracle:Flying\nWhenever you cast an instant or sorcery spell, Wee Dragonauts gets +2/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/w/whisper_agent.txt b/forge-gui/res/cardsfolder/w/whisper_agent.txt index b681e45523c..8ed6266614a 100644 --- a/forge-gui/res/cardsfolder/w/whisper_agent.txt +++ b/forge-gui/res/cardsfolder/w/whisper_agent.txt @@ -5,4 +5,5 @@ PT:3/2 K:Flash T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSurveil | TriggerDescription$ When CARDNAME enters the battlefield, surveil 1. (Look at the top card of your library. You may put it into your graveyard.) SVar:TrigSurveil:DB$ Surveil | Amount$ 1 +DeckHas:Ability$Surveil & Ability$Graveyard Oracle:Flash\nWhen Whisper Agent enters the battlefield, surveil 1. (Look at the top card of your library. You may put it into your graveyard.) diff --git a/forge-gui/res/cardsfolder/w/whispering_snitch.txt b/forge-gui/res/cardsfolder/w/whispering_snitch.txt index d14a81ca909..3ae5c96b86e 100644 --- a/forge-gui/res/cardsfolder/w/whispering_snitch.txt +++ b/forge-gui/res/cardsfolder/w/whispering_snitch.txt @@ -5,5 +5,6 @@ PT:1/3 T:Mode$ Surveil | ValidPlayer$ You | TriggerZones$ Battlefield | OnlyFirst$ True | Execute$ TrigDamageAll | TriggerDescription$ Whenever you surveil for the first time each turn, CARDNAME deals 1 damage to each opponent and you gain 1 life. SVar:TrigDamageAll:DB$ DamageAll | ValidPlayers$ Player.Opponent | NumDmg$ 1 | SubAbility$ DBGainLife SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 +DeckNeeds:Ability$Surveil DeckHas:Ability$LifeGain Oracle:Whenever you surveil for the first time each turn, Whispering Snitch deals 1 damage to each opponent and you gain 1 life. diff --git a/forge-gui/res/cardsfolder/w/wojek_bodyguard.txt b/forge-gui/res/cardsfolder/w/wojek_bodyguard.txt index 99a850f5738..10290fc1976 100644 --- a/forge-gui/res/cardsfolder/w/wojek_bodyguard.txt +++ b/forge-gui/res/cardsfolder/w/wojek_bodyguard.txt @@ -4,4 +4,5 @@ Types:Creature Human Soldier PT:3/3 K:Mentor K:CARDNAME can't attack or block alone. +DeckHas:Ability$Counters Oracle:Mentor (Whenever this creature attacks, put a +1/+1 counter on target attacking creature with lesser power.)\nWojek Bodyguard can't attack or block alone. diff --git a/forge-gui/res/cardsfolder/w/worldsoul_colossus.txt b/forge-gui/res/cardsfolder/w/worldsoul_colossus.txt index 65cc976eb40..959f30246da 100644 --- a/forge-gui/res/cardsfolder/w/worldsoul_colossus.txt +++ b/forge-gui/res/cardsfolder/w/worldsoul_colossus.txt @@ -5,4 +5,5 @@ PT:0/0 K:Convoke K:etbCounter:P1P1:X SVar:X:Count$xPaid +DeckHas:Ability$Counters Oracle:Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nWorldsoul Colossus enters the battlefield with X +1/+1 counters on it. From 12583fe80a086517671c77f21bb2ac5a26f6081e Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 12 Oct 2018 09:01:55 +0300 Subject: [PATCH 028/901] - Removed a duplicate DeckHas in Assure // Assemble. --- forge-gui/res/cardsfolder/a/assure_assemble.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/a/assure_assemble.txt b/forge-gui/res/cardsfolder/a/assure_assemble.txt index 092e54f9cc1..255b81014fe 100644 --- a/forge-gui/res/cardsfolder/a/assure_assemble.txt +++ b/forge-gui/res/cardsfolder/a/assure_assemble.txt @@ -4,7 +4,6 @@ Types:Instant AlternateMode:Split A:SP$ PutCounter | Cost$ G/W G/W | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBPump | SpellDescription$ Put a +1/+1 counter on target creature. It gains indestructible until end of turn. SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ Indestructible -DeckHas:Ability$Counters & Ability$Token Oracle:Put a +1/+1 counter on target creature. It gains indestructible until end of turn. ALTERNATE From 7cac1ecad75d741c5f13ba22244d5047b47651fe Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 12 Oct 2018 11:03:25 +0300 Subject: [PATCH 029/901] - Ability$Instant... -> Type$Instant --- forge-gui/res/cardsfolder/b/beamsplitter_mage.txt | 2 +- forge-gui/res/cardsfolder/m/murmuring_mystic.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/b/beamsplitter_mage.txt b/forge-gui/res/cardsfolder/b/beamsplitter_mage.txt index a83584e2a6c..771b067a897 100644 --- a/forge-gui/res/cardsfolder/b/beamsplitter_mage.txt +++ b/forge-gui/res/cardsfolder/b/beamsplitter_mage.txt @@ -4,5 +4,5 @@ Types:Creature Vedalken Wizard PT:2/2 T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | IsSingleTarget$ True | TargetsValid$ Card.Self | CanTargetOtherCondition$ Creature.YouCtrl | Execute$ TrigCopy | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast an instant or sorcery that targets only CARDNAME, if you control one or more other creatures that spell could target, choose one of those creatures. Copy that spell. The copy targets the chosen creature. SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Controller$ You | CopyForEachCanTarget$ Creature.YouCtrl | ChooseOnlyOne$ True -DeckHints:Ability$Instant|Sorcery +DeckHints:Type$Instant|Sorcery Oracle:Whenever you cast an instant or sorcery spell that targets only Beamsplitter Mage, if you control one or more other creatures that spell could target, choose one of those creatures. Copy that spell. The copy targets the chosen creature. diff --git a/forge-gui/res/cardsfolder/m/murmuring_mystic.txt b/forge-gui/res/cardsfolder/m/murmuring_mystic.txt index 7947d0ef419..76f848425af 100644 --- a/forge-gui/res/cardsfolder/m/murmuring_mystic.txt +++ b/forge-gui/res/cardsfolder/m/murmuring_mystic.txt @@ -5,6 +5,6 @@ PT:1/5 T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you cast an instant or sorcery spell, create a 1/1 blue Bird Illusion creature token with flying. SVar:TrigToken:DB$Token | TokenAmount$ 1 | TokenScript$ u_1_1_bird_illusion_flying SVar:BuffedBy:Instant,Sorcery -DeckHints:Ability$Instant|Sorcery +DeckHints:Type$Instant|Sorcery DeckHas:Ability$Token Oracle:Whenever you cast an instant or sorcery spell, create a 1/1 blue Bird Illusion creature token with flying. From bf6a92663fad47ddf65d4ccaebf24aa26cfc1657 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 12 Oct 2018 12:32:40 +0300 Subject: [PATCH 030/901] - Added Ability$LifeGain hint to several cards. --- forge-gui/res/cardsfolder/d/dawn_of_hope.txt | 2 +- forge-gui/res/cardsfolder/e/emmara_soul_of_the_accord.txt | 2 +- forge-gui/res/cardsfolder/h/haazda_marshal.txt | 2 +- forge-gui/res/cardsfolder/h/hunted_witness.txt | 2 +- forge-gui/res/cardsfolder/i/izoni_thousand_eyed.txt | 2 +- forge-gui/res/cardsfolder/l/ledev_champion.txt | 2 +- forge-gui/res/cardsfolder/m/march_of_the_multitudes.txt | 2 +- forge-gui/res/cardsfolder/s/sworn_companions.txt | 2 +- forge-gui/res/cardsfolder/t/trostani_discordant.txt | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/forge-gui/res/cardsfolder/d/dawn_of_hope.txt b/forge-gui/res/cardsfolder/d/dawn_of_hope.txt index b53adb802e6..65c4c6d514d 100644 --- a/forge-gui/res/cardsfolder/d/dawn_of_hope.txt +++ b/forge-gui/res/cardsfolder/d/dawn_of_hope.txt @@ -4,5 +4,5 @@ Types:Enchantment T:Mode$ LifeGained | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever you gain life, you may pay {2}. If you do, draw a card. SVar:TrigDraw:AB$Draw | Cost$ 2 | Defined$ You | NumCards$ 1 A:AB$ Token | Cost$ 3 W | TokenAmount$ 1 | TokenScript$ w_1_1_soldier_lifelink | SpellDescription$ Create a 1/1 white Soldier creature token with lifelink. -DeckHas:Ability$Token +DeckHas:Ability$Token & Ability$LifeGain Oracle:Whenever you gain life, you may pay {2}. If you do, draw a card.\n{3}{W}: Create a 1/1 white Soldier creature token with lifelink. diff --git a/forge-gui/res/cardsfolder/e/emmara_soul_of_the_accord.txt b/forge-gui/res/cardsfolder/e/emmara_soul_of_the_accord.txt index 4c998fe93ce..dcb4c3710bb 100644 --- a/forge-gui/res/cardsfolder/e/emmara_soul_of_the_accord.txt +++ b/forge-gui/res/cardsfolder/e/emmara_soul_of_the_accord.txt @@ -4,5 +4,5 @@ Types:Legendary Creature Elf Cleric PT:2/2 T:Mode$ Taps | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME becomes tapped, create a 1/1 white Soldier creature token with lifelink. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_soldier_lifelink -DeckHas:Ability$Token +DeckHas:Ability$Token & Ability$LifeGain Oracle:Whenever Emmara, Soul of the Accord becomes tapped, create a 1/1 white Soldier creature token with lifelink. diff --git a/forge-gui/res/cardsfolder/h/haazda_marshal.txt b/forge-gui/res/cardsfolder/h/haazda_marshal.txt index 62edb4876d3..06e8c1bce95 100644 --- a/forge-gui/res/cardsfolder/h/haazda_marshal.txt +++ b/forge-gui/res/cardsfolder/h/haazda_marshal.txt @@ -5,5 +5,5 @@ PT:1/1 T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | CheckSVar$ AttackerTest | SVarCompare$ GE2 | NoResolvingCheck$ True | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME and at least two other creatures attack, create a 1/1 white Soldier creature token with lifelink. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_soldier_lifelink SVar:AttackerTest:Count$Valid Creature.attacking+Other -DeckHas:Ability$Token +DeckHas:Ability$Token & Ability$LifeGain Oracle:Whenever Haazda Marshal and at least two other creatures attack, create a 1/1 white Soldier creature token with lifelink. diff --git a/forge-gui/res/cardsfolder/h/hunted_witness.txt b/forge-gui/res/cardsfolder/h/hunted_witness.txt index 3f6aa70e840..39f16b0a11d 100644 --- a/forge-gui/res/cardsfolder/h/hunted_witness.txt +++ b/forge-gui/res/cardsfolder/h/hunted_witness.txt @@ -4,6 +4,6 @@ Types:Creature Human PT:1/1 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, create a 1/1 white Soldier creature token with lifelink. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_soldier_lifelink -DeckHas:Ability$Token +DeckHas:Ability$Token & Ability$LifeGain SVar:SacMe:1 Oracle:When Hunted Witness dies, create a 1/1 white Soldier creature token with lifelink. diff --git a/forge-gui/res/cardsfolder/i/izoni_thousand_eyed.txt b/forge-gui/res/cardsfolder/i/izoni_thousand_eyed.txt index caf403eb29a..4f92a03e2f1 100644 --- a/forge-gui/res/cardsfolder/i/izoni_thousand_eyed.txt +++ b/forge-gui/res/cardsfolder/i/izoni_thousand_eyed.txt @@ -7,5 +7,5 @@ SVar:TrigToken:DB$Token | TokenAmount$ X | TokenName$ Insect | TokenTypes$ Creat SVar:X:Count$TypeInYourYard.Creature A:AB$ GainLife | Cost$ B G Sac<1/Creature.Other/another creature> | Defined$ You | LifeAmount$ 1 | SubAbility$ DBDraw | SpellDescription$ You gain 1 life and draw a card. SVar:DBDraw:DB$ Draw | NumCards$ 1 -DeckHas:Ability$Token +DeckHas:Ability$Token & Ability$LifeGain Oracle:Undergrowth — When Izoni, Thousand-Eyed enters the battlefield, create a 1/1 black and green Insect creature token for each creature card in your graveyard.\n{B}{G}, Sacrifice another creature: You gain 1 life and draw a card. diff --git a/forge-gui/res/cardsfolder/l/ledev_champion.txt b/forge-gui/res/cardsfolder/l/ledev_champion.txt index 4f8e53d5f15..761277c4199 100644 --- a/forge-gui/res/cardsfolder/l/ledev_champion.txt +++ b/forge-gui/res/cardsfolder/l/ledev_champion.txt @@ -11,5 +11,5 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$Valid Creature.YouCtrl SVar:Y:Remembered$Amount A:AB$ Token | Cost$ 3 G W | TokenAmount$ 1 | TokenScript$ w_1_1_soldier_lifelink | SpellDescription$ Create a 1/1 white Soldier creature token with lifelink. -DeckHas:Ability$Token +DeckHas:Ability$Token & Ability$LifeGain Oracle:Whenever Ledev Champion attacks, you may tap any number of untapped creatures you control. Ledev Champion gets +1/+1 until end of turn for each creature tapped this way.\n{3}{G}{W}: Create a 1/1 white Soldier creature token with lifelink. diff --git a/forge-gui/res/cardsfolder/m/march_of_the_multitudes.txt b/forge-gui/res/cardsfolder/m/march_of_the_multitudes.txt index c9a7aac646e..9eefe598548 100644 --- a/forge-gui/res/cardsfolder/m/march_of_the_multitudes.txt +++ b/forge-gui/res/cardsfolder/m/march_of_the_multitudes.txt @@ -4,5 +4,5 @@ Types:Instant K:Convoke A:SP$ Token | Cost$ X G W W | TokenAmount$ X | References$ X | TokenScript$ w_1_1_soldier_lifelink | SpellDescription$ Create X 1/1 white Soldier creature tokens with lifelink. SVar:X:Count$xPaid -DeckHas:Ability$Token +DeckHas:Ability$Token & Ability$LifeGain Oracle:Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of the creature's color.)\nCreate X 1/1 white Soldier creature tokens with lifelink. diff --git a/forge-gui/res/cardsfolder/s/sworn_companions.txt b/forge-gui/res/cardsfolder/s/sworn_companions.txt index e2ed080c0a3..6504302ef29 100644 --- a/forge-gui/res/cardsfolder/s/sworn_companions.txt +++ b/forge-gui/res/cardsfolder/s/sworn_companions.txt @@ -2,5 +2,5 @@ Name:Sworn Companions ManaCost:2 W Types:Sorcery A:SP$ Token | Cost$ 2 W | TokenAmount$ 2 | TokenScript$ w_1_1_soldier_lifelink -DeckHas:Ability$Token +DeckHas:Ability$Token & Ability$LifeGain Oracle:Creature two 1/1 white Soldier creature tokens with lifelink. diff --git a/forge-gui/res/cardsfolder/t/trostani_discordant.txt b/forge-gui/res/cardsfolder/t/trostani_discordant.txt index a6c268ead08..f93ad01c605 100644 --- a/forge-gui/res/cardsfolder/t/trostani_discordant.txt +++ b/forge-gui/res/cardsfolder/t/trostani_discordant.txt @@ -8,5 +8,5 @@ SVar:TrigToken:DB$ Token | TokenAmount$ 2 | TokenScript$ w_1_1_soldier_lifelink T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigGainControl | TriggerDescription$ At the beginning of your end step, each player gains control of all creatures they own. SVar:TrigGainControl:DB$ RepeatEach | RepeatPlayers$ Player | AILogic$ GainControlOwns | RepeatSubAbility$ DBGainControl | SpellDescription$ Each player gains control of all creatures they own. SVar:DBGainControl:DB$ GainControl | AllValid$ Creature.RememberedPlayerOwn | NewController$ Player.IsRemembered -DeckHas:Ability$Token +DeckHas:Ability$Token & Ability$LifeGain Oracle:Other creatures you control get +1/+1.\nWhen Trostani Discordant enters the battlefield, create two 1/1 white Soldier creature tokens with lifelink.\nAt the beginning of your end step, each player gains control of all creatures they own. From 64116fb055d13df33a79210c476b62589f9a0a18 Mon Sep 17 00:00:00 2001 From: pfirpfel Date: Sat, 13 Oct 2018 05:04:50 +0000 Subject: [PATCH 031/901] Chaos draft --- .../item/generation/ChaosBoosterSupplier.java | 26 ++++++++++++ .../main/java/forge/limited/BoosterDraft.java | 40 +++++++++++++++++++ .../java/forge/limited/LimitedPoolType.java | 3 +- 3 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 forge-core/src/main/java/forge/item/generation/ChaosBoosterSupplier.java diff --git a/forge-core/src/main/java/forge/item/generation/ChaosBoosterSupplier.java b/forge-core/src/main/java/forge/item/generation/ChaosBoosterSupplier.java new file mode 100644 index 00000000000..a6dc60d6d83 --- /dev/null +++ b/forge-core/src/main/java/forge/item/generation/ChaosBoosterSupplier.java @@ -0,0 +1,26 @@ +package forge.item.generation; + +import forge.card.CardEdition; +import forge.item.BoosterPack; +import forge.item.PaperCard; + +import java.util.List; + +public class ChaosBoosterSupplier implements IUnOpenedProduct { + private List sets; + + public ChaosBoosterSupplier(List sets) { + this.sets = sets; + } + + @Override + public List get() { + if (sets.size() == 0) { + System.out.println("No chaos boosters left to supply."); + return null; + } + final CardEdition set = sets.remove(0); + final BoosterPack pack = new BoosterPack(set.getCode(), set.getBoosterTemplate()); + return pack.getCards(); + } +} diff --git a/forge-gui/src/main/java/forge/limited/BoosterDraft.java b/forge-gui/src/main/java/forge/limited/BoosterDraft.java index c2fcfe9e3c0..ef22d7b8e76 100644 --- a/forge-gui/src/main/java/forge/limited/BoosterDraft.java +++ b/forge-gui/src/main/java/forge/limited/BoosterDraft.java @@ -17,12 +17,17 @@ */ package forge.limited; +import com.google.common.base.Predicate; import com.google.common.base.Supplier; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; +import forge.StaticData; import forge.card.CardEdition; import forge.deck.CardPool; import forge.deck.Deck; import forge.item.PaperCard; import forge.item.SealedProduct; +import forge.item.generation.ChaosBoosterSupplier; import forge.item.generation.IUnOpenedProduct; import forge.item.generation.UnOpenedProduct; import forge.model.CardBlock; @@ -35,6 +40,7 @@ import forge.util.TextUtil; import forge.util.gui.SGuiChoose; import forge.util.gui.SOptionPane; import forge.util.storage.IStorage; +import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.ArrayUtils; import java.io.File; @@ -168,6 +174,40 @@ public class BoosterDraft implements IBoosterDraft { } break; + case Chaos: + final CardEdition.Collection allEditions = StaticData.instance().getEditions(); + final Iterable chaosDraftEditions = Iterables.filter(allEditions.getOrderedEditions(), new Predicate() { + @Override + public boolean apply(final CardEdition cardEdition) { + boolean isExpansion = cardEdition.getType().equals(CardEdition.Type.EXPANSION); + boolean isCoreSet = cardEdition.getType().equals(CardEdition.Type.CORE); + boolean isReprintSet = cardEdition.getType().equals(CardEdition.Type.REPRINT); + if (isExpansion || isCoreSet || isReprintSet) { + // Only allow sets with 15 cards in booster packs + if (cardEdition.hasBoosterTemplate()) { + final List> slots = cardEdition.getBoosterTemplate().getSlots(); + int boosterSize = 0; + for (Pair slot : slots) { + boosterSize += slot.getRight(); + } + return boosterSize == 15; + } + } + return false; + } + }); + + // Randomize order of sets + List shuffled = Lists.newArrayList(chaosDraftEditions); + Collections.shuffle(shuffled); + + final Supplier> ChaosDraftSupplier = new ChaosBoosterSupplier(shuffled); + + for (int i = 0; i < 3; i++) { + this.product.add(ChaosDraftSupplier); + } + break; + default: throw new NoSuchElementException("Draft for mode " + this.draftFormat + " has not been set up!"); } diff --git a/forge-gui/src/main/java/forge/limited/LimitedPoolType.java b/forge-gui/src/main/java/forge/limited/LimitedPoolType.java index 758d892a8fa..2f52015e1e8 100644 --- a/forge-gui/src/main/java/forge/limited/LimitedPoolType.java +++ b/forge-gui/src/main/java/forge/limited/LimitedPoolType.java @@ -4,7 +4,8 @@ public enum LimitedPoolType { Full("Full Cardpool"), Block("Block / Set"), FantasyBlock("Fantasy Block"), - Custom("Custom Cube"); + Custom("Custom Cube"), + Chaos("Chaos Draft"); private final String displayName; private LimitedPoolType(String name) { From 30831c734371bde118df08ff202f531d961e55f1 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 13 Oct 2018 08:10:06 +0300 Subject: [PATCH 032/901] - Increase the default memory size values for Android Maven project to allow it to compile with the growing code base. --- forge-gui-android/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui-android/pom.xml b/forge-gui-android/pom.xml index cff63a76f66..686f4a26ecc 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -5,8 +5,8 @@ yyyyMMdd-HHmm jar - -Xms128m - -Xmx1024m + -Xms1024m + -Xmx1536m 1.6.16.001 keystore alias From 9c863e53425d25f3a5a0dc3be510886512c5eba9 Mon Sep 17 00:00:00 2001 From: tehdiplomat Date: Sat, 13 Oct 2018 11:34:05 -0400 Subject: [PATCH 033/901] Updating release files --- forge-gui/release-files/ANNOUNCEMENTS.txt | 2 +- forge-gui/release-files/CHANGES.txt | 3 ++- forge-gui/release-files/ISSUES.txt | 6 +----- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/forge-gui/release-files/ANNOUNCEMENTS.txt b/forge-gui/release-files/ANNOUNCEMENTS.txt index 973e7e98943..554eaa194c4 100644 --- a/forge-gui/release-files/ANNOUNCEMENTS.txt +++ b/forge-gui/release-files/ANNOUNCEMENTS.txt @@ -1,5 +1,5 @@ #Add one announcement per line -M19 is here! Report your issues in the release thread, and we'll kick off a new release soon with fixes. +GRN is finished! Please let us know if you see any other bugs most especially for the newers cards. [b]Forge now requires Java 8 (or newer). You will not be able to start the game if you are not yet running Java 8.[/b] We have a Discord server for hanging out with Forge devs and other Forge fans. Feel free to [url=https://discord.gg/3v9JCVr]jump on in and say hi[/url]! Online Multiplayer is once again functional! \ No newline at end of file diff --git a/forge-gui/release-files/CHANGES.txt b/forge-gui/release-files/CHANGES.txt index 2040ced2470..d162b6af1d5 100644 --- a/forge-gui/release-files/CHANGES.txt +++ b/forge-gui/release-files/CHANGES.txt @@ -1,5 +1,5 @@ - Guilds of Ravnica - -Most of Guilds of Ravnica has been implemented and is available in this release. We're working hard on getting the last few cards added. +All of Guilds of Ravnica has been implemented and is available in this release. - Token Changes - Some work that streamlines tokens is going on under the hood. This may be the cause of missing/incorrect token images if you notice any, though we don't expect there to be any issues. @@ -9,4 +9,5 @@ Added Randomized Standard Quest World with LDA archetype generated decks as duel In this world as well as the random duel opponents, there are randomly generated challenges of varying difficulty and of 2 different types. One type pits your standard decks against modern, legacy or vintage opponents, the other gives the AI a standard deck, but with a headstart of one or more cards on the battlefield. - Bug fixes - +Gonti (and friends) should be fixed now. Let us know if you see anything wonky with mana pools. As always, this release of Forge features an assortment of bug fixes and improvements based on user feedback during the previous release run. diff --git a/forge-gui/release-files/ISSUES.txt b/forge-gui/release-files/ISSUES.txt index 00a6e947bd4..3755d9b8044 100644 --- a/forge-gui/release-files/ISSUES.txt +++ b/forge-gui/release-files/ISSUES.txt @@ -1,7 +1,3 @@ -Online multiplayer functionality has been restored, but is still a Work in Progress. We do have a dedicated developer actively working on the online multiplayer feature. - -"When you pay a cost" trigger for M19 cards don't work 100% correctly yet. We're still working on it. - -Other known issues are here: https://git.cardforge.org/core-developers/forge/issues +Known issues are here: https://git.cardforge.org/core-developers/forge/issues Feel free to report your own there if you have any. \ No newline at end of file From fc6017d073b73e556b3672865444170cff33aca2 Mon Sep 17 00:00:00 2001 From: tehdiplomat Date: Sat, 13 Oct 2018 11:36:40 -0400 Subject: [PATCH 034/901] Update GRN rankings --- forge-gui/res/draft/rankings.txt | 479 +++++++++++++++---------------- 1 file changed, 237 insertions(+), 242 deletions(-) diff --git a/forge-gui/res/draft/rankings.txt b/forge-gui/res/draft/rankings.txt index f5db72c1884..da3b4448a9d 100644 --- a/forge-gui/res/draft/rankings.txt +++ b/forge-gui/res/draft/rankings.txt @@ -3,256 +3,251 @@ #2|Aurelia, Exemplar of Justice|M|GRN #3|Light of the Legion|R|GRN #4|Dream Eater|M|GRN -#5|March of the Multitudes|M|GRN +#5|Izoni, Thousand-Eyed|R|GRN #6|Vraska, Golgari Queen|M|GRN -#7|Assassin's Trophy|R|GRN -#8|Underrealm Lich|M|GRN -#9|Niv-Mizzet, Parun|R|GRN -#10|Trostani Discordant|M|GRN +#7|Niv-Mizzet, Parun|R|GRN +#8|Assassin's Trophy|R|GRN +#9|Trostani Discordant|M|GRN +#10|Underrealm Lich|M|GRN #11|Status Statue|U|GRN -#12|Price of Fame|U|GRN -#13|Conclave Tribunal|U|GRN -#14|Izoni, Thousand-Eyed|R|GRN -#15|Lava Coil|U|GRN -#16|Dawn of Hope|R|GRN -#17|Legion Warboss|R|GRN -#18|Find|R|GRN -#19|Integrity Intervention|U|GRN -#20|Justice Strike|U|GRN -#21|Tajic, Legion's Edge|R|GRN -#22|Pelt Collector|R|GRN -#23|Ral, Izzet Viceroy|M|GRN -#24|Emmara, Soul of the Accord|R|GRN -#25|Swiftblade Vindicator|R|GRN -#26|Assure|R|GRN -#27|Chamber Sentry|R|GRN -#28|Bounty of Might|R|GRN -#29|Nightveil Predator|U|GRN -#30|Venerated Loxodon|R|GRN +#12|Find Finality|R|GRN +#13|March of the Multitudes|M|GRN +#14|Price of Fame|U|GRN +#15|Conclave Tribunal|U|GRN +#16|Nullhide Ferox|M|GRN +#17|Tajic, Legion's Edge|R|GRN +#18|Ral, Izzet Viceroy|M|GRN +#19|Lava Coil|U|GRN +#20|Integrity Intervention|U|GRN +#21|Dawn of Hope|R|GRN +#22|Legion Warboss|R|GRN +#23|Venerated Loxodon|R|GRN +#24|Justice Strike|U|GRN +#25|Pelt Collector|R|GRN +#26|Swiftblade Vindicator|R|GRN +#27|Assure Assemble|R|GRN +#28|Chamber Sentry|R|GRN +#29|Bounty of Might|R|GRN +#30|Nightveil Predator|U|GRN #31|Crackling Drake|U|GRN #32|Etrata, the Silencer|R|GRN -#33|Nullhide Ferox|M|GRN -#34|Golgari Findbroker|U|GRN -#35|Knight of Autumn|R|GRN -#36|Conclave Cavalier|U|GRN -#37|Thief of Sanity|R|GRN -#38|Response|R|GRN -#39|Deafening Clarion|R|GRN -#40|Truefire Captain|U|GRN -#41|Deadly Visit|C|GRN -#42|Midnight Reaper|R|GRN -#43|Lazav, the Multifarious|M|GRN -#44|Boros Challenger|U|GRN -#45|Ritual of Soot|R|GRN -#46|Rampaging Monument|U|GRN -#47|Luminous Bonds|C|GRN -#48|Chemister's Insight|U|GRN -#49|Artful Takedown|C|GRN -#50|Beast Whisperer|R|GRN -#51|Expansion|R|GRN -#52|Affectionate Indrik|U|GRN -#53|Connive|R|GRN -#54|Hatchery Spider|R|GRN -#55|Charnel Troll|R|GRN -#56|Rosemane Centaur|C|GRN -#57|Hypothesizzle|C|GRN -#58|Arclight Phoenix|M|GRN -#59|Swarm Guildmage|U|GRN -#60|House Guildmage|U|GRN -#61|League Guildmage|U|GRN -#62|Legion Guildmage|U|GRN -#63|Glowspore Shaman|U|GRN -#64|Wee Dragonauts|U|GRN -#65|Kraul Harpooner|U|GRN -#66|Gravitic Punch|C|GRN -#67|Dead Weight|C|GRN -#68|District Guide|U|GRN -#69|Command the Storm|C|GRN -#70|Inescapable Blaze|U|GRN -#71|Conclave Guildmage|U|GRN -#72|Ledev Champion|U|GRN -#73|Discovery|U|GRN -#74|Roc Charger|U|GRN -#75|Citywide Bust|R|GRN -#76|Plaguecrafter|U|GRN -#77|Camaraderie|R|GRN -#78|Hired Poisoner|C|GRN -#79|Capture Sphere|C|GRN -#80|Firemind's Research|R|GRN -#81|Quasiduplicate|R|GRN -#82|Arboretum Elemental|U|GRN -#83|Unexplained Disappearance|C|GRN -#84|Sunhome Stalwart|U|GRN -#85|Chromatic Lantern|R|GRN -#86|Goblin Cratermaker|U|GRN -#87|Notion Rain|C|GRN -#88|Invert|U|GRN +#33|Emmara, Soul of the Accord|R|GRN +#34|Beast Whisperer|R|GRN +#35|Golgari Findbroker|U|GRN +#36|Knight of Autumn|R|GRN +#37|Blood Operative|R|GRN +#38|Conclave Cavalier|U|GRN +#39|Thief of Sanity|R|GRN +#40|Charnel Troll|R|GRN +#41|Deafening Clarion|R|GRN +#42|Truefire Captain|U|GRN +#43|Connive Concoct|R|GRN +#44|Hatchery Spider|R|GRN +#45|Quasiduplicate|R|GRN +#46|Response Resurgence|R|GRN +#47|Arclight Phoenix|M|GRN +#48|Midnight Reaper|R|GRN +#49|Lazav, the Multifarious|M|GRN +#50|Ritual of Soot|R|GRN +#51|Boros Challenger|U|GRN +#52|Deadly Visit|C|GRN +#53|Roc Charger|U|GRN +#54|Rampaging Monument|U|GRN +#55|Luminous Bonds|C|GRN +#56|Artful Takedown|C|GRN +#57|Expansion Explosion|R|GRN +#58|Murmuring Mystic|U|GRN +#59|Nightveil Sprite|U|GRN +#60|Swarm Guildmage|U|GRN +#61|House Guildmage|U|GRN +#62|League Guildmage|U|GRN +#63|Legion Guildmage|U|GRN +#64|Glowspore Shaman|U|GRN +#65|Disinformation Campaign|U|GRN +#66|Wee Dragonauts|U|GRN +#67|Discovery Dispersal|U|GRN +#68|Kraul Harpooner|U|GRN +#69|Flower Flourish|U|GRN +#70|Dead Weight|C|GRN +#71|Rosemane Centaur|C|GRN +#72|Hypothesizzle|C|GRN +#73|District Guide|U|GRN +#74|Chemister's Insight|U|GRN +#75|Command the Storm|C|GRN +#76|Inescapable Blaze|U|GRN +#77|Invert Invent|U|GRN +#78|Conclave Guildmage|U|GRN +#79|Affectionate Indrik|U|GRN +#80|Dimir Spybug|U|GRN +#81|Citywide Bust|R|GRN +#82|Plaguecrafter|U|GRN +#83|Camaraderie|R|GRN +#84|Capture Sphere|C|GRN +#85|Firemind's Research|R|GRN +#86|Arboretum Elemental|U|GRN +#87|Sunhome Stalwart|U|GRN +#88|Goblin Cratermaker|U|GRN #89|Erratic Cyclops|R|GRN #90|Citywatch Sphinx|U|GRN #91|Skyknight Legionnaire|C|GRN #92|Watcher in the Mist|C|GRN -#93|Dimir Spybug|U|GRN -#94|Siege Wurm|C|GRN -#95|Risk Factor|R|GRN -#96|Flower|U|GRN -#97|Inspiring Unicorn|U|GRN -#98|Prey Upon|C|GRN -#99|Severed Strands|C|GRN -#100|Kraul Swarm|U|GRN -#101|Demotion|U|GRN -#102|Murmuring Mystic|U|GRN -#103|Healer's Hawk|C|GRN -#104|Direct Current|C|GRN -#105|Nightveil Sprite|U|GRN -#106|Darkblade Agent|C|GRN -#107|Blood Operative|R|GRN -#108|Swathcutter Giant|U|GRN -#109|Loxodon Restorer|C|GRN -#110|Sprouting Renewal|U|GRN -#111|Beacon Bolt|U|GRN -#112|Undercity Uprising|C|GRN -#113|Flight of Equenauts|U|GRN -#114|Experimental Frenzy|R|GRN -#115|Undercity Necrolisk|U|GRN -#116|Selective Snare|U|GRN -#117|Collar the Culprit|C|GRN -#118|Sacred Foundry|R|GRN -#119|Watery Grave|R|GRN -#120|Temple Garden|R|GRN -#121|Overgrown Tomb|R|GRN -#122|Steam Vents|R|GRN -#123|Dimir Informant|C|GRN -#124|Runaway Steam-Kin|R|GRN -#125|Ionize|R|GRN -#126|Garrison Sergeant|C|GRN -#127|Hunted Witness|C|GRN -#128|Disinformation Campaign|U|GRN -#129|Piston-Fist Cyclops|C|GRN -#130|Parhelion Patrol|C|GRN -#131|Join Shields|U|GRN -#132|Gird for Battle|U|GRN -#133|Gatekeeper Gargoyle|U|GRN -#134|Drowned Secrets|R|GRN -#135|Hellkite Whelp|U|GRN -#136|Spinal Centipede|C|GRN -#137|Burglar Rat|C|GRN -#138|Righteous Blow|C|GRN -#139|Golgari Guildgate|C|GRN -#140|Izzet Guildgate|C|GRN -#141|Selesnya Guildgate|C|GRN -#142|Dimir Guildgate|C|GRN -#143|Boros Guildgate|C|GRN -#144|Thought Erasure|U|GRN -#145|Necrotic Wound|U|GRN -#146|Guild Summit|U|GRN -#147|Whispering Snitch|U|GRN -#148|Vivid Revival|R|GRN -#149|Guildmages' Forum|R|GRN -#150|Molderhulk|U|GRN -#151|Gruesome Menagerie|R|GRN -#152|Centaur Peacemaker|C|GRN -#153|Thoughtbound Phantasm|U|GRN -#154|Ochran Assassin|U|GRN -#155|Circuitous Route|U|GRN -#156|Lotleth Giant|U|GRN -#157|Book Devourer|U|GRN -#158|Worldsoul Colossus|U|GRN -#159|Haazda Marshal|U|GRN -#160|Erstwhile Trooper|C|GRN -#161|Might of the Masses|U|GRN -#162|Wild Ceratok|C|GRN -#163|Ironshell Beetle|C|GRN -#164|Smelt-Ward Minotaur|U|GRN -#165|Cosmotronic Wave|C|GRN -#166|Douser of Lights|C|GRN -#167|Sworn Companions|C|GRN -#168|Intrusive Packbeast|C|GRN -#169|Sinister Sabotage|U|GRN -#170|Barging Sergeant|C|GRN -#171|Hammer Dropper|C|GRN -#172|Goblin Electromancer|C|GRN -#173|Sumala Woodshaper|C|GRN -#174|Bounty Agent|R|GRN -#175|Blade Instructor|C|GRN -#176|Gateway Plaza|C|GRN -#177|Disdainful Stroke|C|GRN -#178|Goblin Banneret|U|GRN -#179|Wojek Bodyguard|C|GRN -#180|Enhanced Surveillance|U|GRN -#181|Ledev Guardian|C|GRN -#182|Beamsplitter Mage|U|GRN -#183|Generous Stray|C|GRN -#184|Vernadi Shieldmate|C|GRN -#185|Pitiless Gorgon|C|GRN -#186|Vigorspore Wurm|C|GRN -#187|Pack's Favor|C|GRN -#188|Hitchclaw Recluse|C|GRN -#189|Sure Strike|C|GRN -#190|Rubblebelt Boar|C|GRN -#191|Ornery Goblin|C|GRN -#192|Fire Urchin|C|GRN -#193|Pilfering Imp|U|GRN -#194|Bartizan Bats|C|GRN -#195|Vedalken Mesmerist|C|GRN -#196|Muse Drake|C|GRN -#197|Leapfrog|C|GRN -#198|Skyline Scout|C|GRN -#199|Radical Idea|C|GRN -#200|Moodmark Painter|C|GRN -#201|Fresh-Faced Recruit|C|GRN -#202|Whisper Agent|C|GRN -#203|Golgari Raiders|U|GRN -#204|Mission Briefing|R|GRN -#205|Chance for Glory|M|GRN -#206|Kraul Foragers|C|GRN -#207|Rhizome Lurcher|C|GRN -#208|Electrostatic Field|U|GRN -#209|Street Riot|U|GRN -#210|Fearless Halberdier|C|GRN -#211|Veiled Shade|C|GRN -#212|Child of Night|C|GRN -#213|Wishcoin Crab|C|GRN -#214|Tenth District Guard|C|GRN -#215|Take Heart|C|GRN -#216|Devkarin Dissident|C|GRN -#217|Narcomoeba|R|GRN -#218|Sonic Assault|C|GRN -#219|Wary Okapi|C|GRN -#220|Izzet Locket|C|GRN -#221|Selesnya Locket|C|GRN -#222|Golgari Locket|C|GRN -#223|Dimir Locket|C|GRN -#224|Boros Locket|C|GRN -#225|Passwall Adept|C|GRN -#226|Omnispell Adept|R|GRN -#227|Wand of Vertebrae|U|GRN -#228|Divine Visitation|M|GRN -#229|Mnemonic Betrayal|M|GRN -#230|Urban Utopia|C|GRN -#231|Wall of Mist|C|GRN -#232|Dazzling Lights|C|GRN -#233|Candlelight Vigil|C|GRN -#234|Mausoleum Secrets|R|GRN -#235|Glaive of the Guildpact|U|GRN -#236|Maximize Velocity|C|GRN -#237|Goblin Locksmith|C|GRN -#238|Grappling Sundew|U|GRN -#239|Crushing Canopy|C|GRN -#240|Torch Courier|C|GRN -#241|Maximize Altitude|C|GRN -#242|Never Happened|C|GRN -#243|Thousand-Year Storm|M|GRN -#244|Silent Dart|U|GRN -#245|Portcullis Vine|C|GRN -#246|Mephitic Vapors|C|GRN -#247|Crush Contraband|U|GRN -#248|Barrier of Bones|C|GRN -#249|Devious Cover-Up|C|GRN -#250|Maniacal Rage|C|GRN -#251|Pause for Reflection|C|GRN -#252|Vicious Rumors|C|GRN -#253|Creeping Chill|U|GRN -#254|Unmoored Ego|R|GRN +#93|Siege Wurm|C|GRN +#94|Risk Factor|R|GRN +#95|Kraul Swarm|U|GRN +#96|Demotion|U|GRN +#97|Healer's Hawk|C|GRN +#98|Direct Current|C|GRN +#99|Unexplained Disappearance|C|GRN +#100|Whisper Agent|C|GRN +#101|Notion Rain|C|GRN +#102|Ledev Champion|U|GRN +#103|Beacon Bolt|U|GRN +#104|Flight of Equenauts|U|GRN +#105|Experimental Frenzy|R|GRN +#106|Inspiring Unicorn|U|GRN +#107|Prey Upon|C|GRN +#108|Severed Strands|C|GRN +#109|Hired Poisoner|C|GRN +#110|Selective Snare|U|GRN +#111|Sacred Foundry|R|GRN +#112|Watery Grave|R|GRN +#113|Temple Garden|R|GRN +#114|Overgrown Tomb|R|GRN +#115|Steam Vents|R|GRN +#116|Chromatic Lantern|R|GRN +#117|Runaway Steam-Kin|R|GRN +#118|Ionize|R|GRN +#119|Whispering Snitch|U|GRN +#120|Goblin Banneret|U|GRN +#121|Thoughtbound Phantasm|U|GRN +#122|Swathcutter Giant|U|GRN +#123|Hunted Witness|C|GRN +#124|Enhanced Surveillance|U|GRN +#125|Piston-Fist Cyclops|C|GRN +#126|Parhelion Patrol|C|GRN +#127|Gird for Battle|U|GRN +#128|Undercity Uprising|C|GRN +#129|Gatekeeper Gargoyle|U|GRN +#130|Hellkite Whelp|U|GRN +#131|Undercity Necrolisk|U|GRN +#132|Spinal Centipede|C|GRN +#133|Burglar Rat|C|GRN +#134|Collar the Culprit|C|GRN +#135|Thought Erasure|U|GRN +#136|Necrotic Wound|U|GRN +#137|Hammer Dropper|C|GRN +#138|Dimir Informant|C|GRN +#139|Guild Summit|U|GRN +#140|Vivid Revival|R|GRN +#141|Guildmages' Forum|R|GRN +#142|Molderhulk|U|GRN +#143|Gruesome Menagerie|R|GRN +#144|Centaur Peacemaker|C|GRN +#145|Darkblade Agent|C|GRN +#146|Wojek Bodyguard|C|GRN +#147|Ochran Assassin|U|GRN +#148|Circuitous Route|U|GRN +#149|Loxodon Restorer|C|GRN +#150|Haazda Marshal|U|GRN +#151|Rhizome Lurcher|C|GRN +#152|Might of the Masses|U|GRN +#153|Generous Stray|C|GRN +#154|Wild Ceratok|C|GRN +#155|Ironshell Beetle|C|GRN +#156|Smelt-Ward Minotaur|U|GRN +#157|Rubblebelt Boar|C|GRN +#158|Cosmotronic Wave|C|GRN +#159|Muse Drake|C|GRN +#160|Sworn Companions|C|GRN +#161|Skyline Scout|C|GRN +#162|Righteous Blow|C|GRN +#163|Intrusive Packbeast|C|GRN +#164|Sinister Sabotage|U|GRN +#165|Barging Sergeant|C|GRN +#166|Sonic Assault|C|GRN +#167|Goblin Electromancer|C|GRN +#168|Sumala Woodshaper|C|GRN +#169|Fresh-Faced Recruit|C|GRN +#170|Bounty Agent|R|GRN +#171|Blade Instructor|C|GRN +#172|Gateway Plaza|C|GRN +#173|Disdainful Stroke|C|GRN +#174|Mission Briefing|R|GRN +#175|Lotleth Giant|U|GRN +#176|Book Devourer|U|GRN +#177|Sprouting Renewal|U|GRN +#178|Worldsoul Colossus|U|GRN +#179|Beamsplitter Mage|U|GRN +#180|Vernadi Shieldmate|C|GRN +#181|Pitiless Gorgon|C|GRN +#182|Vigorspore Wurm|C|GRN +#183|Pack's Favor|C|GRN +#184|Hitchclaw Recluse|C|GRN +#185|Sure Strike|C|GRN +#186|Fire Urchin|C|GRN +#187|Pilfering Imp|U|GRN +#188|Douser of Lights|C|GRN +#189|Bartizan Bats|C|GRN +#190|Leapfrog|C|GRN +#191|Take Heart|C|GRN +#192|Devkarin Dissident|C|GRN +#193|Radical Idea|C|GRN +#194|Golgari Raiders|U|GRN +#195|Ledev Guardian|C|GRN +#196|Chance for Glory|M|GRN +#197|Kraul Foragers|C|GRN +#198|Erstwhile Trooper|C|GRN +#199|Street Riot|U|GRN +#200|Ornery Goblin|C|GRN +#201|Gravitic Punch|C|GRN +#202|Child of Night|C|GRN +#203|Dazzling Lights|C|GRN +#204|Tenth District Guard|C|GRN +#205|Moodmark Painter|C|GRN +#206|Izzet Locket|C|GRN +#207|Selesnya Locket|C|GRN +#208|Golgari Locket|C|GRN +#209|Dimir Locket|C|GRN +#210|Boros Locket|C|GRN +#211|Maximize Altitude|C|GRN +#212|Passwall Adept|C|GRN +#213|Garrison Sergeant|C|GRN +#214|Omnispell Adept|R|GRN +#215|Join Shields|U|GRN +#216|Mnemonic Betrayal|M|GRN +#217|Electrostatic Field|U|GRN +#218|Urban Utopia|C|GRN +#219|Portcullis Vine|C|GRN +#220|Fearless Halberdier|C|GRN +#221|Veiled Shade|C|GRN +#222|Vedalken Mesmerist|C|GRN +#223|Wary Okapi|C|GRN +#224|Mausoleum Secrets|R|GRN +#225|Glaive of the Guildpact|U|GRN +#226|Maximize Velocity|C|GRN +#227|Divine Visitation|M|GRN +#228|Devious Cover-Up|C|GRN +#229|Goblin Locksmith|C|GRN +#230|Drowned Secrets|R|GRN +#231|Grappling Sundew|U|GRN +#232|Crushing Canopy|C|GRN +#233|Maniacal Rage|C|GRN +#234|Mephitic Vapors|C|GRN +#235|Wishcoin Crab|C|GRN +#236|Wall of Mist|C|GRN +#237|Candlelight Vigil|C|GRN +#238|Narcomoeba|R|GRN +#239|Never Happened|C|GRN +#240|Thousand-Year Storm|M|GRN +#241|Silent Dart|U|GRN +#242|Torch Courier|C|GRN +#243|Barrier of Bones|C|GRN +#244|Crush Contraband|U|GRN +#245|Wand of Vertebrae|U|GRN +#246|Creeping Chill|U|GRN +#247|Pause for Reflection|C|GRN +#248|Vicious Rumors|C|GRN +#249|Unmoored Ego|R|GRN //Rank|Name|Rarity|Set #1|Chromium, the Mutable|M|M19 #2|Palladia-Mors, the Ruiner|M|M19 From 67c1c1ef1f8e652f6a299928e316cb06437052e8 Mon Sep 17 00:00:00 2001 From: Blacksmith Date: Sat, 13 Oct 2018 15:40:09 +0000 Subject: [PATCH 035/901] Update README.txt for release --- forge-gui/README.txt | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/forge-gui/README.txt b/forge-gui/README.txt index 9bfcd4e83ef..6d5adeec3c1 100644 --- a/forge-gui/README.txt +++ b/forge-gui/README.txt @@ -1,6 +1,6 @@ -Forge: 09/29/2018 ver 1.6.16 +Forge: 10/13/2018 ver 1.6.17 -18176 cards in total. +18204 cards in total. -------------- @@ -8,10 +8,10 @@ Release Notes: -------------- - New Cards - -Vigorspore Wurm; Vedalken Mesmerist; Vernadi Shieldmate; Vraska, Regal Gorgon; Vivid Revival; Vraska's Stoneglare; Vicious Rumors; Veiled Shade; Knight of Autumn; Kraul Foragers; Kraul Raider; Kraul Harpooner; Kraul Swarm; Tajic, Legion's Edge; Take Heart; Torch Courier; Truefire Captain; Thoughtbound Phantasm; Tenth District Guard; Thought Erasure; Trostani Discordant; Circuitous Route; Citywatch Sphinx; Citywide Bust; Conclave Tribunal; Collar the Culprit; Connive; Conclave Guildmage; Crackling Drake; Creeping Chill; Centaur Peacemaker; Camaraderie; Capture Sphere; Cosmotronic Wave; Chance for Glory; Command the Storm; Conclave Cavalier; Chamber Sentry; Crush Contraband; Chemister's Insight; Candlelight Vigil; Guildmages' Forum; Gateway Plaza; Golgari Raiders; Gatekeeper Gargoyle; Golgari Locket; Goblin Banneret; Grappling Sundew; Guild Summit; Garrison Sergeant; Gruesome Menagerie; Golgari Findbroker; Glowspore Shaman; Gird for Battle; Goblin Cratermaker; Glaive of the Guildpact; Generous Stray; Gravitic Punch; Goblin Locksmith; Worldsoul Colossus; Wary Okapi; Watcher in the Mist; Wand of Vertebrae; Wild Ceratok; Wojek Bodyguard; Wishcoin Crab; Whisper Agent; Whispering Snitch; Impervious Greatwurm; Izzet Locket; Ionize; Inescapable Blaze; Invert; Integrity; Inspiring Unicorn; Izoni, Thousand-Eyed; Intrusive Packbeast; Douser of Lights; Dawn of Hope; Demotion; Deafening Clarion; Dimir Spybug; Dimir Informant; Doom Whisperer; District Guide; Dream Eater; Divine Visitation; Deadly Visit; Dazzling Lights; Disinformation Campaign; Darkblade Agent; Drowned Secrets; Devkarin Dissident; Direct Current; Devious Cover-Up; Dimir Locket; Justice Strike; Join Shields; Attendant of Vraska; Assure; Affectionate Indrik; Artful Takedown; Assassin's Trophy; Arboretum Elemental; Aurelia, Exemplar of Justice; Arclight Phoenix; Pelt Collector; Precision Bolt; Passwall Adept; Pitiless Gorgon; Price of Fame; Pause for Reflection; Pack's Favor; Parhelion Patrol; Pilfering Imp; Portcullis Vine; Piston-Fist Cyclops; Ral, Caller of Storms; Rhizome Lurcher; Ral's Dispersal; Roc Charger; Ral's Staticaster; Rosemane Centaur; Ral, Izzet Viceroy; Radical Idea; Ritual of Soot; Risk Factor; Runaway Steam-Kin; Rampaging Monument; Response; Rubblebelt Boar; Light of the Legion; Ledev Champion; Lava Coil; Leapfrog; Lotleth Giant; Loxodon Restorer; Ledev Guardian; Legion Warboss; League Guildmage; Legion Guildmage; Heavenly Blademaster; Hired Poisoner; Haazda Marshal; Hatchery Spider; Hunted Witness; House Guildmage; Healer's Hawk; Hammer Dropper; Hypothesizzle; Hellkite Whelp; Niv-Mizzet, Parun; Never Happened; Notion Rain; Necrotic Wound; Nightveil Sprite; Najeela, the Blade-Blossom ; Nullhide Ferox; Nightveil Predator; Smelt-Ward Minotaur; Swarm Guildmage; Sumala Woodshaper; Sonic Assault; Spinal Centipede; Severed Strands; Sunhome Stalwart; Skyline Scout; Swathcutter Giant; Selesnya Locket; Swiftblade Vindicator; Sprouting Renewal; Status; Silent Dart; Sinister Sabotage; Sworn Companions; Street Riot; Blade Instructor; Book Devourer; Barrier of Bones; Blood Operative; Boros Challenger; Burglar Rat; Barging Sergeant; Bartizan Bats; Bounty Agent; Boros Locket; Beast Whisperer; Bounty of Might; Beacon Bolt; Expansion; Electrostatic Field; Etrata, the Silencer; Experimental Frenzy; Erstwhile Trooper; Emmara, Soul of the Accord; Enhanced Surveillance; Erratic Cyclops; Underrealm Lich; Unexplained Disappearance; Urban Utopia; Undercity Uprising; Undercity Necrolisk; Ornery Goblin; Omnispell Adept; Ochran Assassin; Find; Fire Urchin; Flight of Equenauts; Fearless Halberdier; Fresh-Faced Recruit; Firemind's Research; Flower; Molderhulk; Mausoleum Secrets; Moodmark Painter; Maximize Altitude; Murmuring Mystic; March of the Multitudes; Muse Drake; Mephitic Vapors; Maximize Velocity; Midnight Reaper; Quasiduplicate +Venerated Loxodon; Vraska, Golgari Queen; Thief of Sanity; Thousand-Year Storm; Treasure Nabber; Charnel Troll; Coveted Jewel; Cheering Fanatic; Genesis Storm; Geode Golem; Isolated Watchtower; Discovery; Azra Bladeseeker; Aminatou, the Fateshifter; Primordial Mist; Plaguecrafter; Lazav, the Multifarious; Nimbus Champion; Selective Snare; Stadium Vendors; Sentinel Tower; Skull Storm; Beamsplitter Mage; Echo Storm; Unmoored Ego; Fury Storm; Mission Briefing; Mnemonic Betrayal - Guilds of Ravnica - -Most of Guilds of Ravnica has been implemented and is available in this release. We're working hard on getting the last few cards added. +All of Guilds of Ravnica has been implemented and is available in this release. - Token Changes - Some work that streamlines tokens is going on under the hood. This may be the cause of missing/incorrect token images if you notice any, though we don't expect there to be any issues. @@ -21,17 +21,14 @@ Added Randomized Standard Quest World with LDA archetype generated decks as duel In this world as well as the random duel opponents, there are randomly generated challenges of varying difficulty and of 2 different types. One type pits your standard decks against modern, legacy or vintage opponents, the other gives the AI a standard deck, but with a headstart of one or more cards on the battlefield. - Bug fixes - +Gonti (and friends) should be fixed now. Let us know if you see anything wonky with mana pools. 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: ------------- -Online multiplayer functionality has been restored, but is still a Work in Progress. We do have a dedicated developer actively working on the online multiplayer feature. - -"When you pay a cost" trigger for M19 cards don't work 100% correctly yet. We're still working on it. - -Other known issues are here: https://git.cardforge.org/core-developers/forge/issues +Known issues are here: https://git.cardforge.org/core-developers/forge/issues Feel free to report your own there if you have any. From 34afe75fc0e8319d137519a37791dfbff7977b81 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 13 Oct 2018 18:40:48 +0300 Subject: [PATCH 036/901] - Fixed Drowned Secrets oracle text and description. --- forge-gui/res/cardsfolder/d/drowned_secrets.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/d/drowned_secrets.txt b/forge-gui/res/cardsfolder/d/drowned_secrets.txt index 55e3fdba195..d8e0e2153d0 100644 --- a/forge-gui/res/cardsfolder/d/drowned_secrets.txt +++ b/forge-gui/res/cardsfolder/d/drowned_secrets.txt @@ -1,8 +1,8 @@ Name:Drowned Secrets ManaCost:1 U Types:Enchantment -T:Mode$ SpellCast | ValidCard$ Card.Blue | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigMill | TriggerDescription$ Whenever you cast a blue spell, target player puts the top two cards if their library into their graveyard. +T:Mode$ SpellCast | ValidCard$ Card.Blue | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigMill | TriggerDescription$ Whenever you cast a blue spell, target player puts the top two cards of their library into their graveyard. SVar:TrigMill:DB$Mill | NumCards$ 2 | ValidTgts$ Player | TgtPrompt$ Select target player SVar:BuffedBy:Card.Blue DeckHas:Ability$Graveyard -Oracle:Whenever you cast a blue spell, target player puts the top two cards if their library into their graveyard. +Oracle:Whenever you cast a blue spell, target player puts the top two cards of their library into their graveyard. From e46b778c506658a946925da9e90ccbd515fa92af Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 13 Oct 2018 18:49:58 +0300 Subject: [PATCH 037/901] - Updating CHANGES.txt. --- forge-gui/release-files/CHANGES.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/forge-gui/release-files/CHANGES.txt b/forge-gui/release-files/CHANGES.txt index d162b6af1d5..5d89dc73c97 100644 --- a/forge-gui/release-files/CHANGES.txt +++ b/forge-gui/release-files/CHANGES.txt @@ -8,6 +8,9 @@ Some work that streamlines tokens is going on under the hood. This may be the ca Added Randomized Standard Quest World with LDA archetype generated decks as duels and standard card pool - this is designed so that there is always a quest world representing the current standard metagame - with a standard cardpool and decks generated using the LDA archetype based deck generation. To access this mode, select the "Random Standard" world in the world selection dropdown. In this world as well as the random duel opponents, there are randomly generated challenges of varying difficulty and of 2 different types. One type pits your standard decks against modern, legacy or vintage opponents, the other gives the AI a standard deck, but with a headstart of one or more cards on the battlefield. +- Chaos Draft - +Chaos Draft is now available in both desktop and mobile Forge, where each player starts with three boosters belonging to random sets from Magic: the Gathering history (only 15-card booster packs are used). To start a Chaos Draft, choose the appropriate menu item after starting a booster draft. + - Bug fixes - Gonti (and friends) should be fixed now. Let us know if you see anything wonky with mana pools. As always, this release of Forge features an assortment of bug fixes and improvements based on user feedback during the previous release run. From f462005d99a2ab3171eada73a8fc6cb5ce0b8a80 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 13 Oct 2018 19:48:05 +0300 Subject: [PATCH 038/901] - Minor mistype fix in SurveilEffect. --- .../src/main/java/forge/game/ability/effects/SurveilEffect.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/SurveilEffect.java b/forge-game/src/main/java/forge/game/ability/effects/SurveilEffect.java index 740ce564b33..f93f1765383 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/SurveilEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/SurveilEffect.java @@ -18,7 +18,7 @@ public class SurveilEffect extends SpellAbilityEffect { num = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("Amount"), sa); } - sb.append(" surveil (").append(num).append(")."); + sb.append(" surveils (").append(num).append(")."); return sb.toString(); } From 129fc85a51e5e557bfff2fd6c795691f8be53b4f Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 13 Oct 2018 20:13:25 +0300 Subject: [PATCH 039/901] - Fixed Sumala Woodshaper not revealing cards to the controller (the "look at" part of DB Dig). --- forge-gui/res/cardsfolder/s/sumala_woodshaper.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/s/sumala_woodshaper.txt b/forge-gui/res/cardsfolder/s/sumala_woodshaper.txt index 26db8431693..d398de4b996 100644 --- a/forge-gui/res/cardsfolder/s/sumala_woodshaper.txt +++ b/forge-gui/res/cardsfolder/s/sumala_woodshaper.txt @@ -3,5 +3,5 @@ ManaCost:2 G W Types:Creature Elf Druid PT:2/1 T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigDig | TriggerDescription$ When CARDNAME enters the battlefield, look at the top four cards of your library. You may reveal a creature or enchantment card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. -SVar:TrigDig:DB$ Dig | DigNum$ 4 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Creature,Enchantment | RestRandomOrder$ True +SVar:TrigDig:DB$ Dig | DigNum$ 4 | ChangeNum$ 1 | Optional$ True | ForceRevealToController$ True | ChangeValid$ Creature,Enchantment | RestRandomOrder$ True Oracle:When Sumala Woodshaper enters the battlefield, look at the top four cards of your library. You may reveal a creature or enchantment card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. From 59e2e776c482d9f9b7cefdbfa23b39227bf3782b Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 13 Oct 2018 21:02:47 +0300 Subject: [PATCH 040/901] - Temporarily revert a change in CostPartMana to avoid breaking Convoke, Improvise, and Delve. --- forge-game/src/main/java/forge/game/cost/CostPartMana.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/forge-game/src/main/java/forge/game/cost/CostPartMana.java b/forge-game/src/main/java/forge/game/cost/CostPartMana.java index 1fd0b568131..32f1ae41f7b 100644 --- a/forge-game/src/main/java/forge/game/cost/CostPartMana.java +++ b/forge-game/src/main/java/forge/game/cost/CostPartMana.java @@ -21,7 +21,6 @@ import forge.card.mana.ManaCost; import forge.card.mana.ManaCostShard; import forge.game.mana.ManaConversionMatrix; import forge.game.player.Player; -import forge.game.spellability.AbilityActivated; import forge.game.spellability.SpellAbility; /** @@ -152,9 +151,8 @@ public class CostPartMana extends CostPart { // TODO Auto-generated method stub sa.clearManaPaid(); - boolean isActivated = sa instanceof AbilityActivated; // decision not used here, the whole payment is interactive! - return payer.getController().payManaCost(this, sa, null, cardMatrix, isActivated); + return payer.getController().payManaCost(this, sa, null, cardMatrix, true); } } From 40893683b4ca1941f5278a7009af59f90ab83bc6 Mon Sep 17 00:00:00 2001 From: Sol Date: Sat, 13 Oct 2018 19:46:12 +0000 Subject: [PATCH 041/901] Update sworn_companions.txt --- forge-gui/res/cardsfolder/s/sworn_companions.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/s/sworn_companions.txt b/forge-gui/res/cardsfolder/s/sworn_companions.txt index 6504302ef29..e8b5d817986 100644 --- a/forge-gui/res/cardsfolder/s/sworn_companions.txt +++ b/forge-gui/res/cardsfolder/s/sworn_companions.txt @@ -1,6 +1,6 @@ Name:Sworn Companions ManaCost:2 W Types:Sorcery -A:SP$ Token | Cost$ 2 W | TokenAmount$ 2 | TokenScript$ w_1_1_soldier_lifelink +A:SP$ Token | Cost$ 2 W | TokenAmount$ 2 | TokenScript$ w_1_1_soldier_lifelink | SpellDescription$ Creature two 1/1 white Soldier creature tokens with lifelink. DeckHas:Ability$Token & Ability$LifeGain Oracle:Creature two 1/1 white Soldier creature tokens with lifelink. From f7a6c7080d4b58de0de972d9b673b08402546be0 Mon Sep 17 00:00:00 2001 From: Chris H Date: Sat, 13 Oct 2018 19:14:19 -0400 Subject: [PATCH 042/901] Improve flashback zone display --- forge-game/src/main/java/forge/game/zone/PlayerZone.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/zone/PlayerZone.java b/forge-game/src/main/java/forge/game/zone/PlayerZone.java index 0e9b48143b1..762ab38ae4b 100644 --- a/forge-game/src/main/java/forge/game/zone/PlayerZone.java +++ b/forge-game/src/main/java/forge/game/zone/PlayerZone.java @@ -63,6 +63,8 @@ public class PlayerZone extends Zone { return true; } + boolean graveyardCastable = c.hasKeyword(Keyword.FLASHBACK) || + c.hasKeyword(Keyword.RETRACE) || c.hasKeyword(Keyword.JUMP_START); for (final SpellAbility sa : c.getSpellAbilities()) { final ZoneType restrictZone = sa.getRestrictions().getZone(); @@ -76,7 +78,7 @@ public class PlayerZone extends Zone { } if (sa.isSpell() - && (c.hasKeyword(Keyword.FLASHBACK) && PlayerZone.this.is(ZoneType.Graveyard)) + && (graveyardCastable && PlayerZone.this.is(ZoneType.Graveyard)) && restrictZone.equals(ZoneType.Hand)) { return true; } From 92645d19d545a7d225cffc2bab6425f6ca0b4039 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 14 Oct 2018 08:57:06 +0300 Subject: [PATCH 043/901] - Underrealm Lich should not reveal a card going to hand. --- .../src/main/java/forge/game/ability/effects/DigEffect.java | 2 +- forge-gui/res/cardsfolder/u/underrealm_lich.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java index 365adf0855a..efa91cea1d2 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java @@ -286,7 +286,7 @@ public class DigEffect extends SpellAbilityEffect { } } - if (!changeValid.isEmpty() && !sa.hasParam("ExileFaceDown")) { + if (!changeValid.isEmpty() && !sa.hasParam("ExileFaceDown") && !sa.hasParam("NoReveal")) { game.getAction().reveal(movedCards, chooser, true, chooser + " picked " + (movedCards.size() == 1 ? "this card" : "these cards") + " from "); } diff --git a/forge-gui/res/cardsfolder/u/underrealm_lich.txt b/forge-gui/res/cardsfolder/u/underrealm_lich.txt index 5a4e13c31c1..31302c0e0b6 100644 --- a/forge-gui/res/cardsfolder/u/underrealm_lich.txt +++ b/forge-gui/res/cardsfolder/u/underrealm_lich.txt @@ -3,7 +3,7 @@ ManaCost:3 B G Types:Creature Zombie Elf Shaman PT:4/3 R:Event$ Draw | ActiveZones$ Battlefield | ValidPlayer$ You | ReplaceWith$ Dig | Description$ If you would draw a card, instead look at the top three cards of your library, then put one into your hand and the rest into your graveyard. -SVar:Dig:DB$Dig | DigNum$ 3 | ChangeNum$ 1 | ChangeValid$ Card | DestinationZone2$ Graveyard +SVar:Dig:DB$Dig | DigNum$ 3 | ChangeNum$ 1 | ChangeValid$ Card | DestinationZone2$ Graveyard | NoReveal$ True A:AB$ Pump | Cost$ PayLife<4> | Defined$ Self | KW$ Indestructible | SubAbility$ DBTap | SpellDescription$ CARDNAME gains indestructible until end of turn. Tap it. SVar:DBTap:DB$Tap | Defined$ Self Oracle:If you would draw a card, instead look at the top three cards of your library, then put one into your hand and the rest into your graveyard.\nPay 4 life: Underrealm Lich gains indestructible until end of turn. Tap it. From 2e23d1035df139a2cfbfe1022a479ed9849dd179 Mon Sep 17 00:00:00 2001 From: Sol Date: Sun, 14 Oct 2018 12:30:13 +0000 Subject: [PATCH 044/901] Update teferi_hero_of_dominaria.txt --- forge-gui/res/cardsfolder/t/teferi_hero_of_dominaria.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/t/teferi_hero_of_dominaria.txt b/forge-gui/res/cardsfolder/t/teferi_hero_of_dominaria.txt index 29919a6d2e4..6d914ba5f2e 100644 --- a/forge-gui/res/cardsfolder/t/teferi_hero_of_dominaria.txt +++ b/forge-gui/res/cardsfolder/t/teferi_hero_of_dominaria.txt @@ -4,7 +4,7 @@ Types:Legendary Planeswalker Teferi Loyalty:4 A:AB$ Draw | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | Defined$ You | NumCards$ 1 | SubAbility$ DelTrigUntap | SpellDescription$ Draw a card. At the beginning of the next end step, untap two lands. SVar:DelTrigUntap:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigUntap | TriggerDescription$ At the beginning of the next end step, untap two lands. -SVar:TrigUntap:DB$ Untap | UntapExactly$ True | UntapType$ Land | Amount$ 2 | Defined$ You +SVar:TrigUntap:DB$ Untap | UntapUpTo$ True | UntapType$ Land | Amount$ 2 | Defined$ You A:AB$ ChangeZone | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 2 | IsCurse$ True | SpellDescription$ Put target nonland permanent into its owner's library third from the top. A:AB$ Effect | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Ultimate$ True | Name$ Emblem - Teferi, Hero of Dominaria | Image$ emblem_teferi_hero_of_dominaria | Triggers$ TrigDraw | SVars$ EffSpellCast | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "Whenever you draw a card, exile target permanent an opponent controls." SVar:TrigDraw:Mode$ Drawn | ValidCard$ Card.YouCtrl | Execute$ EffSpellCast | TriggerDescription$ Whenever you draw a card, exile target permanent an opponent controls. From 0f2ebb9262829d58eafd3ca352f9a87efbcfdfdd Mon Sep 17 00:00:00 2001 From: Sol Date: Mon, 15 Oct 2018 02:02:07 +0000 Subject: [PATCH 045/901] Update forge-gui/res/cardsfolder/t/teferi_hero_of_dominaria.txt --- forge-gui/res/cardsfolder/t/teferi_hero_of_dominaria.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/t/teferi_hero_of_dominaria.txt b/forge-gui/res/cardsfolder/t/teferi_hero_of_dominaria.txt index 6d914ba5f2e..48f40466192 100644 --- a/forge-gui/res/cardsfolder/t/teferi_hero_of_dominaria.txt +++ b/forge-gui/res/cardsfolder/t/teferi_hero_of_dominaria.txt @@ -2,7 +2,7 @@ Name:Teferi, Hero of Dominaria ManaCost:3 W U Types:Legendary Planeswalker Teferi Loyalty:4 -A:AB$ Draw | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | Defined$ You | NumCards$ 1 | SubAbility$ DelTrigUntap | SpellDescription$ Draw a card. At the beginning of the next end step, untap two lands. +A:AB$ Draw | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | Defined$ You | NumCards$ 1 | SubAbility$ DelTrigUntap | SpellDescription$ Draw a card. At the beginning of the next end step, untap up to two lands. SVar:DelTrigUntap:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigUntap | TriggerDescription$ At the beginning of the next end step, untap two lands. SVar:TrigUntap:DB$ Untap | UntapUpTo$ True | UntapType$ Land | Amount$ 2 | Defined$ You A:AB$ ChangeZone | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 2 | IsCurse$ True | SpellDescription$ Put target nonland permanent into its owner's library third from the top. @@ -10,4 +10,4 @@ A:AB$ Effect | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Ultimate$ True SVar:TrigDraw:Mode$ Drawn | ValidCard$ Card.YouCtrl | Execute$ EffSpellCast | TriggerDescription$ Whenever you draw a card, exile target permanent an opponent controls. SVar:EffSpellCast:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.OppCtrl | TgtPrompt$ Select target permanent an opponent controls SVar:Picture:http://www.wizards.com/global/images/magic/general/teferi_hero_of_dominaria.jpg -Oracle:[+1]: Draw a card. At the beginning of the next end step, untap two lands.\n[-3]: Put target nonland permanent into its owner's library third from the top.\n[-8]: You get an emblem with "Whenever you draw a card, exile target permanent an opponent controls." +Oracle:[+1]: Draw a card. At the beginning of the next end step, untap up to two lands.\n[-3]: Put target nonland permanent into its owner's library third from the top.\n[-8]: You get an emblem with "Whenever you draw a card, exile target permanent an opponent controls." From c8566079599edc2537aaabf932e9753eb9d27a32 Mon Sep 17 00:00:00 2001 From: pfirpfel Date: Mon, 15 Oct 2018 13:25:43 +0200 Subject: [PATCH 046/901] Brawl GRN format update --- forge-gui/res/formats/Casual/Brawl.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/formats/Casual/Brawl.txt b/forge-gui/res/formats/Casual/Brawl.txt index 84972f54ee9..8a2125573a6 100644 --- a/forge-gui/res/formats/Casual/Brawl.txt +++ b/forge-gui/res/formats/Casual/Brawl.txt @@ -3,5 +3,5 @@ Name:Brawl Order:101 Type:Casual Subtype:Commander -Sets:KLD, AER, AKH, W17, HOU, XLN, RIX, DOM, M19 -Banned:Baral, Chief of Compliance;Smuggler's Copter;Sorcerous Spyglass \ No newline at end of file +Sets:XLN, RIX, DOM, M19, GRN +Banned:Sorcerous Spyglass \ No newline at end of file From 2604d339d141ea395d7097016039961d3576016c Mon Sep 17 00:00:00 2001 From: pfirpfel Date: Mon, 15 Oct 2018 13:32:19 +0200 Subject: [PATCH 047/901] Update standard ban list: remove cards that rotated --- forge-gui/res/formats/Sanctioned/Standard.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/formats/Sanctioned/Standard.txt b/forge-gui/res/formats/Sanctioned/Standard.txt index 2093082499f..7413d4d97d2 100644 --- a/forge-gui/res/formats/Sanctioned/Standard.txt +++ b/forge-gui/res/formats/Sanctioned/Standard.txt @@ -4,4 +4,4 @@ Order:101 Subtype:Standard Type:Sanctioned Sets:XLN, RIX, DOM, M19, GRN -Banned: Attune with Aether; Rogue Refiner; Rampaging Ferocidon; Ramunap Ruins; Smuggler's Copter; Aetherworks Marvel; Felidar Guardian +Banned: Rampaging Ferocidon From 107896054555a4f94acc1565be46e6bba2e6741e Mon Sep 17 00:00:00 2001 From: Blacksmith Date: Mon, 15 Oct 2018 15:40:05 +0000 Subject: [PATCH 048/901] Update README.txt for release --- forge-gui/README.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/forge-gui/README.txt b/forge-gui/README.txt index 6d5adeec3c1..ffd1f5926ba 100644 --- a/forge-gui/README.txt +++ b/forge-gui/README.txt @@ -1,4 +1,4 @@ -Forge: 10/13/2018 ver 1.6.17 +Forge: 10/15/2018 ver 1.6.17 18204 cards in total. @@ -20,6 +20,9 @@ Some work that streamlines tokens is going on under the hood. This may be the ca Added Randomized Standard Quest World with LDA archetype generated decks as duels and standard card pool - this is designed so that there is always a quest world representing the current standard metagame - with a standard cardpool and decks generated using the LDA archetype based deck generation. To access this mode, select the "Random Standard" world in the world selection dropdown. In this world as well as the random duel opponents, there are randomly generated challenges of varying difficulty and of 2 different types. One type pits your standard decks against modern, legacy or vintage opponents, the other gives the AI a standard deck, but with a headstart of one or more cards on the battlefield. +- Chaos Draft - +Chaos Draft is now available in both desktop and mobile Forge, where each player starts with three boosters belonging to random sets from Magic: the Gathering history (only 15-card booster packs are used). To start a Chaos Draft, choose the appropriate menu item after starting a booster draft. + - Bug fixes - Gonti (and friends) should be fixed now. Let us know if you see anything wonky with mana pools. As always, this release of Forge features an assortment of bug fixes and improvements based on user feedback during the previous release run. From 41287d30c9b8498bac4a89c955846af9d03b554d Mon Sep 17 00:00:00 2001 From: Blacksmith Date: Mon, 15 Oct 2018 15:42:12 +0000 Subject: [PATCH 049/901] [maven-release-plugin] prepare release forge-1.6.17 --- forge-ai/pom.xml | 5 +- forge-core/pom.xml | 5 +- forge-game/pom.xml | 5 +- forge-gui-android/pom.xml | 58 +++----- forge-gui-desktop/pom.xml | 273 ++++++++++++++--------------------- forge-gui-ios/pom.xml | 5 +- forge-gui-mobile-dev/pom.xml | 5 +- forge-gui-mobile/pom.xml | 5 +- forge-gui/pom.xml | 5 +- pom.xml | 13 +- 10 files changed, 150 insertions(+), 229 deletions(-) diff --git a/forge-ai/pom.xml b/forge-ai/pom.xml index 5c2e49733c3..a5ecbb4ea94 100644 --- a/forge-ai/pom.xml +++ b/forge-ai/pom.xml @@ -1,13 +1,12 @@ - + 4.0.0 forge forge - 1.6.17-SNAPSHOT + 1.6.17 forge-ai diff --git a/forge-core/pom.xml b/forge-core/pom.xml index 43ca41a1bbc..d4e40426300 100644 --- a/forge-core/pom.xml +++ b/forge-core/pom.xml @@ -1,13 +1,12 @@ - + 4.0.0 forge forge - 1.6.17-SNAPSHOT + 1.6.17 forge-core diff --git a/forge-game/pom.xml b/forge-game/pom.xml index e432898b34c..48d48cf71c1 100644 --- a/forge-game/pom.xml +++ b/forge-game/pom.xml @@ -1,13 +1,12 @@ - + 4.0.0 forge forge - 1.6.17-SNAPSHOT + 1.6.17 forge-game diff --git a/forge-gui-android/pom.xml b/forge-gui-android/pom.xml index 686f4a26ecc..ac43f1ac128 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -1,5 +1,4 @@ - + 4.0.0 @@ -20,7 +19,7 @@ forge forge - 1.6.17-SNAPSHOT + 1.6.17 forge-gui-android @@ -215,7 +214,7 @@ true true - + ${project.build.directory}/${project.build.finalName}.apk @@ -278,29 +277,22 @@ - - - - - - - + + + + + + + - - + + - - - - + + + + @@ -346,22 +338,16 @@ package - - + + - - + + - + - + diff --git a/forge-gui-desktop/pom.xml b/forge-gui-desktop/pom.xml index c0d6f955b9c..6946e02a7e8 100644 --- a/forge-gui-desktop/pom.xml +++ b/forge-gui-desktop/pom.xml @@ -1,11 +1,10 @@ - + 4.0.0 forge forge - 1.6.17-SNAPSHOT + 1.6.17 forge-gui-desktop @@ -275,46 +274,38 @@ - + - - - - - - - + + + + + + + - - + + - - + + - - - - - - - - - - + + + + + + + + + + - - - - + + + + @@ -437,53 +428,41 @@ - + - - - - - - - - - - + + + + + + + + + + - - + + - - + + - - - - - - - - - - + + + + + + + + + + - - - - + + + + @@ -561,61 +540,41 @@ pre-integration-test - + - - - - - - - + + + + + + + - - - - - @@ -695,54 +654,38 @@ pre-integration-test - + - - - - + + + + - - - - - diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index 75741f26559..f06901f867a 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -1,5 +1,4 @@ - + 4.0.0 @@ -13,7 +12,7 @@ forge forge - 1.6.17-SNAPSHOT + 1.6.17 forge-gui-ios diff --git a/forge-gui-mobile-dev/pom.xml b/forge-gui-mobile-dev/pom.xml index 4c6a43115c8..c644e2a87ba 100644 --- a/forge-gui-mobile-dev/pom.xml +++ b/forge-gui-mobile-dev/pom.xml @@ -1,11 +1,10 @@ - + 4.0.0 forge forge - 1.6.17-SNAPSHOT + 1.6.17 forge-gui-mobile-dev diff --git a/forge-gui-mobile/pom.xml b/forge-gui-mobile/pom.xml index 7880adfd083..452b69ed10d 100644 --- a/forge-gui-mobile/pom.xml +++ b/forge-gui-mobile/pom.xml @@ -1,11 +1,10 @@ - + 4.0.0 forge forge - 1.6.17-SNAPSHOT + 1.6.17 forge-gui-mobile diff --git a/forge-gui/pom.xml b/forge-gui/pom.xml index 3b9d8055d54..663f2a1831b 100644 --- a/forge-gui/pom.xml +++ b/forge-gui/pom.xml @@ -1,11 +1,10 @@ - + 4.0.0 forge forge - 1.6.17-SNAPSHOT + 1.6.17 forge-gui diff --git a/pom.xml b/pom.xml index 0c0da905a9d..5f95155e376 100644 --- a/pom.xml +++ b/pom.xml @@ -1,12 +1,11 @@ - + 4.0.0 forge forge pom Forge Parent - 1.6.17-SNAPSHOT + 1.6.17 Forge lets you play the card game Magic: The Gathering against a computer opponent using all of the rules. @@ -176,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.17 @@ -376,7 +375,7 @@ - + @@ -390,7 +389,7 @@ - + @@ -403,7 +402,7 @@ - + From 16e7d39870c9b8bd1de854461c4b607cc380d93c Mon Sep 17 00:00:00 2001 From: Blacksmith Date: Mon, 15 Oct 2018 15:42:16 +0000 Subject: [PATCH 050/901] [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 a5ecbb4ea94..b3b53fc120f 100644 --- a/forge-ai/pom.xml +++ b/forge-ai/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.17 + 1.6.18-SNAPSHOT forge-ai diff --git a/forge-core/pom.xml b/forge-core/pom.xml index d4e40426300..33171490943 100644 --- a/forge-core/pom.xml +++ b/forge-core/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.17 + 1.6.18-SNAPSHOT forge-core diff --git a/forge-game/pom.xml b/forge-game/pom.xml index 48d48cf71c1..c9659499c2d 100644 --- a/forge-game/pom.xml +++ b/forge-game/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.17 + 1.6.18-SNAPSHOT forge-game diff --git a/forge-gui-android/pom.xml b/forge-gui-android/pom.xml index ac43f1ac128..83e876ec6c9 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -19,7 +19,7 @@ forge forge - 1.6.17 + 1.6.18-SNAPSHOT forge-gui-android diff --git a/forge-gui-desktop/pom.xml b/forge-gui-desktop/pom.xml index 6946e02a7e8..6b78bad350c 100644 --- a/forge-gui-desktop/pom.xml +++ b/forge-gui-desktop/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.17 + 1.6.18-SNAPSHOT forge-gui-desktop diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index f06901f867a..c34c7688255 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -12,7 +12,7 @@ forge forge - 1.6.17 + 1.6.18-SNAPSHOT forge-gui-ios diff --git a/forge-gui-mobile-dev/pom.xml b/forge-gui-mobile-dev/pom.xml index c644e2a87ba..86c59d8ffe0 100644 --- a/forge-gui-mobile-dev/pom.xml +++ b/forge-gui-mobile-dev/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.17 + 1.6.18-SNAPSHOT forge-gui-mobile-dev diff --git a/forge-gui-mobile/pom.xml b/forge-gui-mobile/pom.xml index 452b69ed10d..cfaebbc7f52 100644 --- a/forge-gui-mobile/pom.xml +++ b/forge-gui-mobile/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.17 + 1.6.18-SNAPSHOT forge-gui-mobile diff --git a/forge-gui/pom.xml b/forge-gui/pom.xml index 663f2a1831b..1af393d28a6 100644 --- a/forge-gui/pom.xml +++ b/forge-gui/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.17 + 1.6.18-SNAPSHOT forge-gui diff --git a/pom.xml b/pom.xml index 5f95155e376..f5046bc50ec 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ forge pom Forge Parent - 1.6.17 + 1.6.18-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.17 + HEAD From 0d8721b651e8d9d0046d62336dea8d8b56a140a4 Mon Sep 17 00:00:00 2001 From: Blacksmith Date: Mon, 15 Oct 2018 15:47:03 +0000 Subject: [PATCH 051/901] Clear out release files in preparation for next release --- forge-gui/README.txt | 94 +---------------------------- forge-gui/release-files/CHANGES.txt | 14 ----- 2 files changed, 1 insertion(+), 107 deletions(-) diff --git a/forge-gui/README.txt b/forge-gui/README.txt index ffd1f5926ba..11b369846f2 100644 --- a/forge-gui/README.txt +++ b/forge-gui/README.txt @@ -1,93 +1 @@ -Forge: 10/15/2018 ver 1.6.17 - -18204 cards in total. - - --------------- -Release Notes: --------------- - -- New Cards - -Venerated Loxodon; Vraska, Golgari Queen; Thief of Sanity; Thousand-Year Storm; Treasure Nabber; Charnel Troll; Coveted Jewel; Cheering Fanatic; Genesis Storm; Geode Golem; Isolated Watchtower; Discovery; Azra Bladeseeker; Aminatou, the Fateshifter; Primordial Mist; Plaguecrafter; Lazav, the Multifarious; Nimbus Champion; Selective Snare; Stadium Vendors; Sentinel Tower; Skull Storm; Beamsplitter Mage; Echo Storm; Unmoored Ego; Fury Storm; Mission Briefing; Mnemonic Betrayal - -- Guilds of Ravnica - -All of Guilds of Ravnica has been implemented and is available in this release. - -- Token Changes - -Some work that streamlines tokens is going on under the hood. This may be the cause of missing/incorrect token images if you notice any, though we don't expect there to be any issues. - -- Random Quest World - -Added Randomized Standard Quest World with LDA archetype generated decks as duels and standard card pool - this is designed so that there is always a quest world representing the current standard metagame - with a standard cardpool and decks generated using the LDA archetype based deck generation. To access this mode, select the "Random Standard" world in the world selection dropdown. -In this world as well as the random duel opponents, there are randomly generated challenges of varying difficulty and of 2 different types. One type pits your standard decks against modern, legacy or vintage opponents, the other gives the AI a standard deck, but with a headstart of one or more cards on the battlefield. - -- Chaos Draft - -Chaos Draft is now available in both desktop and mobile Forge, where each player starts with three boosters belonging to random sets from Magic: the Gathering history (only 15-card booster packs are used). To start a Chaos Draft, choose the appropriate menu item after starting a booster draft. - -- Bug fixes - -Gonti (and friends) should be fixed now. Let us know if you see anything wonky with mana pools. -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 haven't been able to distribute the OS X Application version of Forge in sometime. We've recently automated our release tools, and will continue to look in the viability of creating this file now that things are autoamted. - - -- 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 -Austinio7116 -Churrufli -DrDev -excessum -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 - -(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 5d89dc73c97..05f0bf1829e 100644 --- a/forge-gui/release-files/CHANGES.txt +++ b/forge-gui/release-files/CHANGES.txt @@ -1,16 +1,2 @@ -- Guilds of Ravnica - -All of Guilds of Ravnica has been implemented and is available in this release. - -- Token Changes - -Some work that streamlines tokens is going on under the hood. This may be the cause of missing/incorrect token images if you notice any, though we don't expect there to be any issues. - -- Random Quest World - -Added Randomized Standard Quest World with LDA archetype generated decks as duels and standard card pool - this is designed so that there is always a quest world representing the current standard metagame - with a standard cardpool and decks generated using the LDA archetype based deck generation. To access this mode, select the "Random Standard" world in the world selection dropdown. -In this world as well as the random duel opponents, there are randomly generated challenges of varying difficulty and of 2 different types. One type pits your standard decks against modern, legacy or vintage opponents, the other gives the AI a standard deck, but with a headstart of one or more cards on the battlefield. - -- Chaos Draft - -Chaos Draft is now available in both desktop and mobile Forge, where each player starts with three boosters belonging to random sets from Magic: the Gathering history (only 15-card booster packs are used). To start a Chaos Draft, choose the appropriate menu item after starting a booster draft. - - Bug fixes - -Gonti (and friends) should be fixed now. Let us know if you see anything wonky with mana pools. As always, this release of Forge features an assortment of bug fixes and improvements based on user feedback during the previous release run. From 54832cf79fafa3ad975f84f3ad8775845501ab0f Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 15 Oct 2018 19:51:45 +0300 Subject: [PATCH 052/901] - Preparing Forge for Android publish 1.6.17.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 83e876ec6c9..6e925598a72 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -6,7 +6,7 @@ jar -Xms1024m -Xmx1536m - 1.6.16.001 + 1.6.17.001 keystore alias storepass diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index c34c7688255..3a5a9720a78 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -6,7 +6,7 @@ jar -Xms128m -Xmx2048m - 1.6.16.001 + 1.6.17.001 diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index 9c56811a115..ad9e7363cd6 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.16.001"; + public static final String CURRENT_VERSION = "1.6.17.001"; private static final ApplicationListener app = new Forge(); private static Clipboard clipboard; From ef24c5058c381fb163f50bbb8929cfd0a4081bd5 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Mon, 15 Oct 2018 22:05:13 +0200 Subject: [PATCH 053/901] Epic rework --- .../ability/effects/CopySpellAbilityEffect.java | 15 ++++++++++++++- .../java/forge/game/card/CardFactoryUtil.java | 4 ++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java index 6d7b25e97d0..26ca842301d 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java @@ -167,7 +167,20 @@ public class CopySpellAbilityEffect extends SpellAbilityEffect { "Select a spell to copy", ImmutableMap.of()); chosenSA.setActivatingPlayer(controller); for (int i = 0; i < amount; i++) { - copies.add(CardFactory.copySpellAbilityAndPossiblyHost(card, chosenSA.getHostCard(), chosenSA, true)); + SpellAbility copy = CardFactory.copySpellAbilityAndPossiblyHost( + card, chosenSA.getHostCard(), chosenSA, true); + + // extra case for Epic to remove the keyword and the last part of the SpellAbility + if (sa.hasParam("Epic")) { + copy.getHostCard().removeIntrinsicKeyword("Epic"); + SpellAbility sub = copy; + while (sub.getSubAbility() != null) { + sub = sub.getSubAbility(); + } + sub.getParent().setSubAbility(null); + } + + copies.add(copy); } } diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 6f0b68c466f..3d62dde6fbe 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -3759,14 +3759,14 @@ public class CardFactoryUtil { // Epic does modify existing SA, and does not add new one // Add the Epic effect as a subAbility - String dbStr = "DB$ Effect | Triggers$ EpicTrigger | SVars$ EpicCopy | StaticAbilities$ EpicCantBeCast | Duration$ Permanent | Unique$ True"; + String dbStr = "DB$ Effect | Triggers$ EpicTrigger | SVars$ EpicCopy | StaticAbilities$ EpicCantBeCast | Duration$ Permanent"; final AbilitySub newSA = (AbilitySub) AbilityFactory.getAbility(dbStr.toString(), card); card.setSVar("EpicCantBeCast", "Mode$ CantBeCast | ValidCard$ Card | Caster$ You | EffectZone$ Command | Description$ For the rest of the game, you can't cast spells."); card.setSVar("EpicTrigger", "Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ EpicCopy | TriggerDescription$ " + "At the beginning of each of your upkeeps, copy " + card.toString() + " except for its epic ability."); - card.setSVar("EpicCopy", "DB$ CopySpellAbility | Defined$ EffectSource"); + card.setSVar("EpicCopy", "DB$ CopySpellAbility | Defined$ EffectSource | Epic$ True"); final SpellAbility origSA = card.getFirstSpellAbility(); From 1b284e8f3f7ade0d0059d1e0e9cd36fd8ca1abda Mon Sep 17 00:00:00 2001 From: Sol Date: Tue, 16 Oct 2018 01:55:49 +0000 Subject: [PATCH 054/901] Update kraul_harpooner.txt not up to targeting --- forge-gui/res/cardsfolder/k/kraul_harpooner.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/k/kraul_harpooner.txt b/forge-gui/res/cardsfolder/k/kraul_harpooner.txt index 539450d9419..0fde4013fb2 100644 --- a/forge-gui/res/cardsfolder/k/kraul_harpooner.txt +++ b/forge-gui/res/cardsfolder/k/kraul_harpooner.txt @@ -5,6 +5,6 @@ PT:3/2 K:Reach T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, choose up to one target creature with flying you don't control. CARDNAME gets +X/+0 until end of turn, where X is the number of creature cards in your graveyard, then you may have CARDNAME fight that creature. SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ X | References$ X | SubAbility$ DBFight -SVar:DBFight:DB$ Fight | Defined$ Self | ValidTgts$ Creature.withFlying+YouDontCtrl | TgtPrompt$ Select target creature with flying you don't control +SVar:DBFight:DB$ Fight | Defined$ Self | ValidTgts$ Creature.withFlying+YouDontCtrl | TgtPrompt$ Select target creature with flying you don't control | TargetMin$ 0 | TargetMax$ 1 SVar:X:Count$TypeInYourYard.Creature Oracle:Reach\nUndergrowth — When Kraul Harpooner enters the battlefield, choose up to one target creature with flying you don't control. Kraul Harpooner gets +X/+0 until end of turn, where X is the number of creature cards in your graveyard, then you may have Kraul Harpooner fight that creature. From cd74d2a7bf7d85a43805f99ae622ab983e5d959b Mon Sep 17 00:00:00 2001 From: Chris H Date: Mon, 15 Oct 2018 22:18:23 -0400 Subject: [PATCH 055/901] Convert FullCost to PermanentCreature --- .../main/java/forge/game/card/CardFactoryUtil.java | 13 ------------- forge-gui/res/cardsfolder/c/caller_of_the_hunt.txt | 2 +- forge-gui/res/cardsfolder/h/headless_skaab.txt | 2 +- forge-gui/res/cardsfolder/i/imperiosaur.txt | 3 +-- forge-gui/res/cardsfolder/m/makeshift_mauler.txt | 2 +- forge-gui/res/cardsfolder/m/myr_superion.txt | 2 +- forge-gui/res/cardsfolder/r/relentless_skaabs.txt | 2 +- forge-gui/res/cardsfolder/s/skaab_goliath.txt | 2 +- forge-gui/res/cardsfolder/s/skaab_ruinator.txt | 2 +- forge-gui/res/cardsfolder/s/stitched_drake.txt | 2 +- 10 files changed, 9 insertions(+), 23 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 3d62dde6fbe..acbefc4d72d 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -2014,18 +2014,6 @@ public class CardFactoryUtil { inst.createTraits(card, true); } - // AddCost - if (card.hasSVar("FullCost")) { - String k[] = card.getSVar("FullCost").split(":"); - final SpellAbility sa1 = card.getFirstSpellAbility(); - if (sa1 != null && sa1.isSpell()) { - sa1.setPayCosts(new Cost(k[0], sa1.isAbility())); - if (k.length > 1) { - sa1.getMapParams().put("AILogic", k[1]); - } - } - } - // AltCost String altCost = card.getSVar("AltCost"); if (StringUtils.isNotBlank(altCost)) { @@ -2034,7 +2022,6 @@ public class CardFactoryUtil { card.addSpellAbility(makeAltCostAbility(card, altCost, sa1)); } } - } private static ReplacementEffect createETBReplacement(final Card card, ReplacementLayer layer, diff --git a/forge-gui/res/cardsfolder/c/caller_of_the_hunt.txt b/forge-gui/res/cardsfolder/c/caller_of_the_hunt.txt index e973b31e704..84849bc4d9d 100644 --- a/forge-gui/res/cardsfolder/c/caller_of_the_hunt.txt +++ b/forge-gui/res/cardsfolder/c/caller_of_the_hunt.txt @@ -2,8 +2,8 @@ Name:Caller of the Hunt ManaCost:2 G Types:Creature Human PT:*/* +A:SP$ PermanentCreature | Cost$ 2 G ChooseCreatureType<1> | AILogic$ MostProminentOnBattlefield S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ CARDNAME's power and toughness are each equal to the number of creatures of the chosen type on the battlefield. SVar:X:Count$Valid Creature.ChosenType -SVar:FullCost:2 G ChooseCreatureType<1>:MostProminentOnBattlefield SVar:Picture:http://www.wizards.com/global/images/magic/general/caller_of_the_hunt.jpg Oracle:As an additional cost to cast this spell, choose a creature type.\nCaller of the Hunt's power and toughness are each equal to the number of creatures of the chosen type on the battlefield. diff --git a/forge-gui/res/cardsfolder/h/headless_skaab.txt b/forge-gui/res/cardsfolder/h/headless_skaab.txt index 7d321382402..44f9e3cc5d1 100644 --- a/forge-gui/res/cardsfolder/h/headless_skaab.txt +++ b/forge-gui/res/cardsfolder/h/headless_skaab.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Creature Zombie Warrior PT:3/6 K:CARDNAME enters the battlefield tapped. -SVar:FullCost:2 U ExileFromGrave<1/Creature> +A:SP$ PermanentCreature | Cost$ 2 U ExileFromGrave<1/Creature> SVar:Picture:http://www.wizards.com/global/images/magic/general/headless_skaab.jpg Oracle:As an additional cost to cast Headless Skaab, exile a creature card from your graveyard.\nHeadless Skaab enters the battlefield tapped. diff --git a/forge-gui/res/cardsfolder/i/imperiosaur.txt b/forge-gui/res/cardsfolder/i/imperiosaur.txt index 1ac3fcee99d..53c761e7050 100644 --- a/forge-gui/res/cardsfolder/i/imperiosaur.txt +++ b/forge-gui/res/cardsfolder/i/imperiosaur.txt @@ -2,7 +2,6 @@ Name:Imperiosaur ManaCost:2 G G Types:Creature Dinosaur Text:Spend only mana produced by basic lands to cast CARDNAME. -PT:5/5 -SVar:FullCost:Mana<2 G G\Basic> +A:SP$ PermanentCreature | Cost$ Mana<2 G G\Basic> SVar:Picture:http://resources.wizards.com/magic/cards/fut/en-us/card130634.jpg Oracle:Spend only mana produced by basic lands to cast Imperiosaur. diff --git a/forge-gui/res/cardsfolder/m/makeshift_mauler.txt b/forge-gui/res/cardsfolder/m/makeshift_mauler.txt index 6e15a9ea94c..bf5f2173f5d 100644 --- a/forge-gui/res/cardsfolder/m/makeshift_mauler.txt +++ b/forge-gui/res/cardsfolder/m/makeshift_mauler.txt @@ -2,6 +2,6 @@ Name:Makeshift Mauler ManaCost:3 U Types:Creature Zombie Horror PT:4/5 -SVar:FullCost:3 U ExileFromGrave<1/Creature> +A:SP$ PermanentCreature | Cost$ 3 U ExileFromGrave<1/Creature> SVar:Picture:http://www.wizards.com/global/images/magic/general/makeshift_mauler.jpg Oracle:As an additional cost to cast Makeshift Mauler, exile a creature card from your graveyard. diff --git a/forge-gui/res/cardsfolder/m/myr_superion.txt b/forge-gui/res/cardsfolder/m/myr_superion.txt index 3d9a93a570d..b309044b89f 100644 --- a/forge-gui/res/cardsfolder/m/myr_superion.txt +++ b/forge-gui/res/cardsfolder/m/myr_superion.txt @@ -3,7 +3,7 @@ ManaCost:2 Types:Artifact Creature Myr PT:5/6 Text:Spend only mana produced by creatures to cast CARDNAME. -SVar:FullCost:Mana<2\Creature> +A:SP$ PermanentCreature | Cost$ Mana<2\Creature> SVar:RemRandomDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/myr_superion.jpg Oracle:Spend only mana produced by creatures to cast Myr Superion. diff --git a/forge-gui/res/cardsfolder/r/relentless_skaabs.txt b/forge-gui/res/cardsfolder/r/relentless_skaabs.txt index e487dab907b..6d0879aa058 100644 --- a/forge-gui/res/cardsfolder/r/relentless_skaabs.txt +++ b/forge-gui/res/cardsfolder/r/relentless_skaabs.txt @@ -3,6 +3,6 @@ ManaCost:3 U U Types:Creature Zombie PT:4/4 K:Undying -SVar:FullCost:3 U U ExileFromGrave<1/Creature> +A:SP$ PermanentCreature | Cost$ 3 U U ExileFromGrave<1/Creature> SVar:Picture:http://www.wizards.com/global/images/magic/general/relentless_skaabs.jpg Oracle:As an additional cost to cast Relentless Skaabs, exile a creature card from your graveyard.\nUndying (When this creature dies, if it had no +1/+1 counters on it, return it to the battlefield under its owner's control with a +1/+1 counter on it.) diff --git a/forge-gui/res/cardsfolder/s/skaab_goliath.txt b/forge-gui/res/cardsfolder/s/skaab_goliath.txt index 9b1f20a26f2..15f63a8a8e3 100644 --- a/forge-gui/res/cardsfolder/s/skaab_goliath.txt +++ b/forge-gui/res/cardsfolder/s/skaab_goliath.txt @@ -3,6 +3,6 @@ ManaCost:5 U Types:Creature Zombie Giant PT:6/9 K:Trample -SVar:FullCost:5 U ExileFromGrave<2/Creature> +A:SP$ PermanentCreature | Cost$ 5 U ExileFromGrave<2/Creature> SVar:Picture:http://www.wizards.com/global/images/magic/general/skaab_goliath.jpg Oracle:As an additional cost to cast Skaab Goliath, exile two creature cards from your graveyard.\nTrample diff --git a/forge-gui/res/cardsfolder/s/skaab_ruinator.txt b/forge-gui/res/cardsfolder/s/skaab_ruinator.txt index f13a8f42cae..38ab2d38e05 100644 --- a/forge-gui/res/cardsfolder/s/skaab_ruinator.txt +++ b/forge-gui/res/cardsfolder/s/skaab_ruinator.txt @@ -3,7 +3,7 @@ ManaCost:1 U U Types:Creature Zombie Horror PT:5/6 K:Flying -SVar:FullCost:1 U U ExileFromGrave<3/Creature> +A:SP$ PermanentCreature | Cost$ 1 U U ExileFromGrave<3/Creature> SVar:AltCost:Cost$ 1 U U ExileFromGrave<3/Creature.Other> | ActivationZone$ Graveyard | Description$ You may cast CARDNAME from your graveyard. SVar:Picture:http://www.wizards.com/global/images/magic/general/skaab_ruinator.jpg Oracle:As an additional cost to cast Skaab Ruinator, exile three creature cards from your graveyard.\nFlying\nYou may cast Skaab Ruinator from your graveyard. diff --git a/forge-gui/res/cardsfolder/s/stitched_drake.txt b/forge-gui/res/cardsfolder/s/stitched_drake.txt index a12f6807393..4330e399a22 100644 --- a/forge-gui/res/cardsfolder/s/stitched_drake.txt +++ b/forge-gui/res/cardsfolder/s/stitched_drake.txt @@ -3,6 +3,6 @@ ManaCost:1 U U Types:Creature Zombie Drake PT:3/4 K:Flying -SVar:FullCost:1 U U ExileFromGrave<1/Creature> +A:SP$ PermanentCreature | Cost$ 1 U U ExileFromGrave<1/Creature> SVar:Picture:http://www.wizards.com/global/images/magic/general/stitched_drake.jpg Oracle:As an additional cost to cast Stitched Drake, exile a creature card from your graveyard.\nFlying From 256bf8e43863781c26553a76e814817c144e011c Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 16 Oct 2018 08:19:10 +0300 Subject: [PATCH 056/901] - Added puzzle PS_GRN2. - Improved the implementation of puzzle PS_GRN1. --- forge-gui/res/puzzle/PS_GRN1.pzl | 4 ++-- forge-gui/res/puzzle/PS_GRN2.pzl | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 forge-gui/res/puzzle/PS_GRN2.pzl diff --git a/forge-gui/res/puzzle/PS_GRN1.pzl b/forge-gui/res/puzzle/PS_GRN1.pzl index 8a189e3af52..c0b3fd3668e 100644 --- a/forge-gui/res/puzzle/PS_GRN1.pzl +++ b/forge-gui/res/puzzle/PS_GRN1.pzl @@ -4,7 +4,7 @@ URL:https://i0.wp.com/www.possibilitystorm.com/wp-content/uploads/2018/10/083.-G Goal:Win Turns:1 Difficulty:Rare -Description:Win this turn. When this puzzle starts, you will be prompted to pay 2 life for Sacred Foundry, you should choose "No" (Sacred Foundry will be placed on the battlefield untapped regardless). +Description:Win this turn. [state] humanlife=20 ailife=5 @@ -12,5 +12,5 @@ turn=1 activeplayer=human activephase=MAIN1 humanhand=Heroic Reinforcements;Aurelia, Exemplar of Justice;Garna, the Bloodflame;Deafening Clarion;Vraska's Contempt -humanbattlefield=Blade Instructor;Goblin Banneret;Barging Sergeant;Angrath, the Flame-Chained|Counters:LOYALTY=5;Sacred Foundry;Sacred Foundry;Sacred Foundry;Sacred Foundry;Dragonskull Summit;Dragonskull Summit +humanbattlefield=Blade Instructor;Goblin Banneret;Barging Sergeant;Angrath, the Flame-Chained|Counters:LOYALTY=5;Sacred Foundry|Set:GRN|NoETBTrigs;Sacred Foundry|Set:GRN|NoETBTrigs;Sacred Foundry|Set:GRN|NoETBTrigs;Sacred Foundry|Set:GRN|NoETBTrigs;Dragonskull Summit;Dragonskull Summit aibattlefield=Josu Vess, Lich Knight;t:Zombie Knight,P:2,T:2,Cost:no cost,Color:B,Types:Creature-Zombie-Knight,Keywords:Menace,Image:b_2_2_zombie_knight_dom;t:Zombie Knight,P:2,T:2,Cost:no cost,Color:B,Types:Creature-Zombie-Knight,Keywords:Menace,Image:b_2_2_zombie_knight_dom;t:Zombie Knight,P:2,T:2,Cost:no cost,Color:B,Types:Creature-Zombie-Knight,Keywords:Menace,Image:b_2_2_zombie_knight_dom;t:Zombie Knight,P:2,T:2,Cost:no cost,Color:B,Types:Creature-Zombie-Knight,Keywords:Menace,Image:b_2_2_zombie_knight_dom;t:Zombie Knight,P:2,T:2,Cost:no cost,Color:B,Types:Creature-Zombie-Knight,Keywords:Menace,Image:b_2_2_zombie_knight_dom;t:Zombie Knight,P:2,T:2,Cost:no cost,Color:B,Types:Creature-Zombie-Knight,Keywords:Menace,Image:b_2_2_zombie_knight_dom;t:Zombie Knight,P:2,T:2,Cost:no cost,Color:B,Types:Creature-Zombie-Knight,Keywords:Menace,Image:b_2_2_zombie_knight_dom;t:Zombie Knight,P:2,T:2,Cost:no cost,Color:B,Types:Creature-Zombie-Knight,Keywords:Menace,Image:b_2_2_zombie_knight_dom diff --git a/forge-gui/res/puzzle/PS_GRN2.pzl b/forge-gui/res/puzzle/PS_GRN2.pzl new file mode 100644 index 00000000000..84bfbcde0d8 --- /dev/null +++ b/forge-gui/res/puzzle/PS_GRN2.pzl @@ -0,0 +1,17 @@ +[metadata] +Name:Possibility Storm - Guilds of Ravnica #02 +URL:https://i1.wp.com/www.possibilitystorm.com/wp-content/uploads/2018/10/084.-GRN2.jpg +Goal:Win +Turns:1 +Difficulty:Rare +Description:Win this turn. Assume you have no instant or sorcery spells left in your library. +[state] +humanlife=20 +ailife=12 +turn=1 +activeplayer=human +activephase=MAIN1 +humanhand=Arclight Phoenix;Sonic Assault;Invert // Invent;Response // Resurgence +humanlibrary=Plains|Set:GRN;Island|Set:GRN;Swamp|Set:GRN;Mountain|Set:GRN;Forest|Set:GRN +humanbattlefield=Runaway Steam-Kin|Counters:P1P1=1|Id:1;Tilonalli's Crown|Attaching:1;Rampaging Monument|Counters:P1P1=3;Sacred Foundry|Set:GRN|NoETBTrigs;Sacred Foundry|Set:GRN|NoETBTrigs;Steam Vents|Set:GRN|NoETBTrigs;Steam Vents|Set:GRN|NoETBTrigs;Izzet Guildgate|Set:GRN;Izzet Guildgate|Set:GRN +aibattlefield=Looming Altisaur;Territorial Allosaurus;Verdant Sun's Avatar;Polyraptor;Emissary of Sunrise|Id:2;Forebear's Blade|Attaching:2 From 6b6f85c28969ff3c81324e0cde242cc591c52d51 Mon Sep 17 00:00:00 2001 From: Chris H Date: Tue, 16 Oct 2018 23:04:21 -0400 Subject: [PATCH 057/901] Move RemoveDeck parsing to new form --- .../src/main/java/forge/card/CardRules.java | 19 +++--- .../main/java/forge/screens/home/VLobby.java | 58 ++++++------------- .../mtgdecksnet_convert.py | 2 +- .../mtgdecksnet_decksort.py | 2 +- .../mtgdecksnet_decksort_EDH.py | 2 +- forge-gui/tools/deckAiCompat.py | 2 +- 6 files changed, 33 insertions(+), 52 deletions(-) diff --git a/forge-core/src/main/java/forge/card/CardRules.java b/forge-core/src/main/java/forge/card/CardRules.java index 93f6e3e5f78..549f0cbe17a 100644 --- a/forge-core/src/main/java/forge/card/CardRules.java +++ b/forge-core/src/main/java/forge/card/CardRules.java @@ -352,9 +352,18 @@ public final class CardRules implements ICardCharacteristics { switch(key.charAt(0)) { case 'A': - if ("A".equals(key)) + if ("A".equals(key)) { this.faces[curFace].addAbility(value); - else if ("AlternateMode".equals(key)) { + } else if ("AI".equals(key)) { + colonPos = value.indexOf(':'); + String variable = colonPos > 0 ? value.substring(0, colonPos) : value; + value = colonPos > 0 ? value.substring(1+colonPos) : null; + + if ( "RemoveDeck".equals(variable) ) { + this.removedFromAIDecks = "All".equalsIgnoreCase(value); + this.removedFromRandomDecks = "Random".equalsIgnoreCase(value); + } + } else if ("AlternateMode".equals(key)) { //System.out.println(faces[curFace].getName()); this.altMode = CardSplitType.smartValueOf(value); } else if ("ALTERNATE".equals(key)) { @@ -447,11 +456,7 @@ public final class CardRules implements ICardCharacteristics { String variable = colonPos > 0 ? value.substring(0, colonPos) : value; value = colonPos > 0 ? value.substring(1+colonPos) : null; - if ( "RemAIDeck".equals(variable) ) { - this.removedFromAIDecks = "True".equalsIgnoreCase(value); - } else if ( "RemRandomDeck".equals(variable) ) { - this.removedFromRandomDecks = "True".equalsIgnoreCase(value); - } else if ( "Picture".equals(variable) ) { + if ( "Picture".equals(variable) ) { this.pictureUrl[this.curFace] = value; } else this.faces[curFace].addSVar(variable, value); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java b/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java index 0b5139827d2..dc4000f2c21 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java @@ -1,39 +1,11 @@ package forge.screens.home; -import java.awt.Font; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Vector; - -import javax.swing.JButton; -import javax.swing.JPanel; -import javax.swing.ListSelectionModel; -import javax.swing.ScrollPaneConstants; -import javax.swing.SwingConstants; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; - -import net.miginfocom.swing.MigLayout; - import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; - import forge.UiCommand; import forge.ai.AIOption; -import forge.deck.CardPool; -import forge.deck.Deck; -import forge.deck.DeckProxy; -import forge.deck.DeckSection; -import forge.deck.DeckType; -import forge.deck.DeckgenUtil; -import forge.deck.RandomDeckGenerator; +import forge.deck.*; import forge.deckchooser.FDeckChooser; import forge.game.GameType; import forge.game.card.CardView; @@ -48,20 +20,24 @@ import forge.model.FModel; import forge.net.event.UpdateLobbyPlayerEvent; import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; -import forge.toolbox.FCheckBox; -import forge.toolbox.FLabel; -import forge.toolbox.FList; -import forge.toolbox.FOptionPane; -import forge.toolbox.FPanel; -import forge.toolbox.FScrollPane; -import forge.toolbox.FScrollPanel; -import forge.toolbox.FSkin; +import forge.toolbox.*; import forge.toolbox.FSkin.SkinImage; -import forge.toolbox.FTextField; import forge.util.Aggregates; import forge.util.Lang; import forge.util.NameGenerator; import forge.util.gui.SOptionPane; +import net.miginfocom.swing.MigLayout; + +import javax.swing.*; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.util.*; +import java.util.List; /** * Lobby view. View of a number of players at the deck selection stage. @@ -1009,17 +985,17 @@ public class VLobby implements ILobbyView { return vgdAllAvatars; } - /** Return the Vanguard avatars not flagged RemAIDeck. */ + /** Return the Vanguard avatars not flagged RemoveDeck:All. */ public List getAllAiAvatars() { return vgdAllAiAvatars; } - /** Return the Vanguard avatars not flagged RemRandomDeck. */ + /** Return the Vanguard avatars not flagged RemoveDeck:Random. */ public List getNonRandomHumanAvatars() { return nonRandomHumanAvatars; } - /** Return the Vanguard avatars not flagged RemAIDeck or RemRandomDeck. */ + /** Return the Vanguard avatars not flagged RemoveDeck:All or RemoveDeck:Random. */ public List getNonRandomAiAvatars() { return nonRandomAiAvatars; } diff --git a/forge-gui/tools/DeckConversionTools/mtgdecksnet_convert.py b/forge-gui/tools/DeckConversionTools/mtgdecksnet_convert.py index 9056793d18b..f46f3cc9116 100644 --- a/forge-gui/tools/DeckConversionTools/mtgdecksnet_convert.py +++ b/forge-gui/tools/DeckConversionTools/mtgdecksnet_convert.py @@ -55,7 +55,7 @@ for root, dirs, files in os.walk(CARDSFOLDER): if line.lower().find("name:") != -1: cardnames.extend([line.split('\n')[0].split(':')[1]]) cardname = " // ".join(cardnames) - if cardtext.lower().find("remaideck") != -1: + if cardtext.lower().find("removedeck:all") != -1: cardlist[cardname] = 0 else: cardlist[cardname] = 1 diff --git a/forge-gui/tools/DeckConversionTools/mtgdecksnet_decksort.py b/forge-gui/tools/DeckConversionTools/mtgdecksnet_decksort.py index c059e32e100..e8957975c9e 100644 --- a/forge-gui/tools/DeckConversionTools/mtgdecksnet_decksort.py +++ b/forge-gui/tools/DeckConversionTools/mtgdecksnet_decksort.py @@ -59,7 +59,7 @@ for root, dirs, files in os.walk(CARDSFOLDER): if line.lower().find("name:") != -1: cardnames.extend([line.split('\n')[0].split(':')[1]]) cardname = " // ".join(cardnames) - if cardtext.lower().find("remaideck") != -1: + if cardtext.lower().find("removedeck:all") != -1: cardlist[cardname] = 0 else: cardlist[cardname] = 1 diff --git a/forge-gui/tools/DeckConversionTools/mtgdecksnet_decksort_EDH.py b/forge-gui/tools/DeckConversionTools/mtgdecksnet_decksort_EDH.py index bb31f64cc96..3427556b675 100644 --- a/forge-gui/tools/DeckConversionTools/mtgdecksnet_decksort_EDH.py +++ b/forge-gui/tools/DeckConversionTools/mtgdecksnet_decksort_EDH.py @@ -59,7 +59,7 @@ for root, dirs, files in os.walk(CARDSFOLDER): if line.lower().find("name:") != -1: cardnames.extend([line.split('\n')[0].split(':')[1]]) cardname = " // ".join(cardnames) - if cardtext.lower().find("remaideck") != -1: + if cardtext.lower().find("removedeck:all") != -1: cardlist[cardname] = 0 else: cardlist[cardname] = 1 diff --git a/forge-gui/tools/deckAiCompat.py b/forge-gui/tools/deckAiCompat.py index 6bfe7b7a471..70b57a32bb9 100644 --- a/forge-gui/tools/deckAiCompat.py +++ b/forge-gui/tools/deckAiCompat.py @@ -46,7 +46,7 @@ for root, dirs, files in os.walk("cardsfolder"): if line.lower().find("name:") != -1: cardnames.extend([line.split('\n')[0].split(':')[1]]) cardname = " // ".join(cardnames) - if cardtext.lower().find("remaideck") != -1: + if cardtext.lower().find("removedeck:all") != -1: cardlist[cardname] = 0 else: cardlist[cardname] = 1 From 789f61e27bd3fa1bcbeeaf5af4adaa926126ed2f Mon Sep 17 00:00:00 2001 From: Chris H Date: Tue, 16 Oct 2018 23:07:11 -0400 Subject: [PATCH 058/901] AI:RemoveDeck (A) --- forge-gui/res/cardsfolder/a/abandon_hope.txt | 2 +- forge-gui/res/cardsfolder/a/abandoned_sarcophagus.txt | 2 +- forge-gui/res/cardsfolder/a/abjure.txt | 2 +- forge-gui/res/cardsfolder/a/about_face.txt | 2 +- forge-gui/res/cardsfolder/a/absolute_grace.txt | 2 +- forge-gui/res/cardsfolder/a/absolute_law.txt | 2 +- forge-gui/res/cardsfolder/a/abunas_chant.txt | 2 +- forge-gui/res/cardsfolder/a/abundance.txt | 2 +- forge-gui/res/cardsfolder/a/abyssal_persecutor.txt | 2 +- forge-gui/res/cardsfolder/a/abzan_banner.txt | 2 +- forge-gui/res/cardsfolder/a/academy_raider.txt | 2 +- forge-gui/res/cardsfolder/a/academy_rector.txt | 2 +- forge-gui/res/cardsfolder/a/acid_rain.txt | 2 +- forge-gui/res/cardsfolder/a/acidic_dagger.txt | 2 +- forge-gui/res/cardsfolder/a/acidic_soil.txt | 2 +- forge-gui/res/cardsfolder/a/acolytes_reward.txt | 2 +- forge-gui/res/cardsfolder/a/acorn_catapult.txt | 2 +- forge-gui/res/cardsfolder/a/act_of_authority.txt | 2 +- forge-gui/res/cardsfolder/a/act_on_impulse.txt | 2 +- forge-gui/res/cardsfolder/a/active_volcano.txt | 2 +- forge-gui/res/cardsfolder/a/ad_nauseam.txt | 2 +- forge-gui/res/cardsfolder/a/adanto_vanguard.txt | 2 +- forge-gui/res/cardsfolder/a/adarkar_unicorn.txt | 4 ++-- forge-gui/res/cardsfolder/a/adarkar_windform.txt | 2 +- forge-gui/res/cardsfolder/a/adventurers_guildhouse.txt | 2 +- forge-gui/res/cardsfolder/a/advice_from_the_fae.txt | 2 +- forge-gui/res/cardsfolder/a/aeon_chronicler.txt | 2 +- forge-gui/res/cardsfolder/a/aether_barrier.txt | 2 +- forge-gui/res/cardsfolder/a/aether_charge.txt | 2 +- forge-gui/res/cardsfolder/a/aether_flash.txt | 2 +- forge-gui/res/cardsfolder/a/aether_rift.txt | 2 +- forge-gui/res/cardsfolder/a/aether_shockwave.txt | 2 +- forge-gui/res/cardsfolder/a/aether_snap.txt | 4 ++-- forge-gui/res/cardsfolder/a/aether_spellbomb.txt | 2 +- forge-gui/res/cardsfolder/a/aether_storm.txt | 2 +- forge-gui/res/cardsfolder/a/aether_tide.txt | 2 +- forge-gui/res/cardsfolder/a/aether_tradewinds.txt | 2 +- forge-gui/res/cardsfolder/a/aethermages_touch.txt | 2 +- forge-gui/res/cardsfolder/a/aetherplasm.txt | 2 +- forge-gui/res/cardsfolder/a/aethersnatch.txt | 2 +- forge-gui/res/cardsfolder/a/agent_of_erebos.txt | 2 +- forge-gui/res/cardsfolder/a/agent_of_shauku.txt | 2 +- forge-gui/res/cardsfolder/a/agent_of_stromgald.txt | 2 +- forge-gui/res/cardsfolder/a/aggression.txt | 2 +- forge-gui/res/cardsfolder/a/aggressive_mining.txt | 2 +- forge-gui/res/cardsfolder/a/airborne_aid.txt | 2 +- forge-gui/res/cardsfolder/a/airdrop_condor.txt | 2 +- forge-gui/res/cardsfolder/a/akiri_line_slinger.txt | 2 +- forge-gui/res/cardsfolder/a/akki_avalanchers.txt | 2 +- forge-gui/res/cardsfolder/a/akoum_flameseeker.txt | 2 +- forge-gui/res/cardsfolder/a/akromas_blessing.txt | 2 +- forge-gui/res/cardsfolder/a/al_abaras_carpet.txt | 2 +- forge-gui/res/cardsfolder/a/aladdins_lamp.txt | 4 ++-- forge-gui/res/cardsfolder/a/alchemists_apprentice.txt | 2 +- forge-gui/res/cardsfolder/a/alchemists_refuge.txt | 4 ++-- forge-gui/res/cardsfolder/a/alchors_tomb.txt | 4 ++-- forge-gui/res/cardsfolder/a/aleatory.txt | 2 +- forge-gui/res/cardsfolder/a/alexi_zephyr_mage.txt | 2 +- forge-gui/res/cardsfolder/a/aligned_hedron_network.txt | 2 +- forge-gui/res/cardsfolder/a/all_suns_dawn.txt | 2 +- forge-gui/res/cardsfolder/a/alliance_of_arms.txt | 2 +- forge-gui/res/cardsfolder/a/allied_strategies.txt | 2 +- forge-gui/res/cardsfolder/a/alluring_scent.txt | 2 +- forge-gui/res/cardsfolder/a/alluring_siren.txt | 2 +- forge-gui/res/cardsfolder/a/ally_encampment.txt | 2 +- forge-gui/res/cardsfolder/a/alpha_brawl.txt | 2 +- forge-gui/res/cardsfolder/a/alpha_kavu.txt | 2 +- forge-gui/res/cardsfolder/a/alpha_status.txt | 2 +- forge-gui/res/cardsfolder/a/altar_golem.txt | 2 +- forge-gui/res/cardsfolder/a/altar_of_dementia.txt | 2 +- forge-gui/res/cardsfolder/a/altar_of_the_lost.txt | 2 +- forge-gui/res/cardsfolder/a/alter_reality.txt | 4 ++-- forge-gui/res/cardsfolder/a/aluren.txt | 2 +- forge-gui/res/cardsfolder/a/amber_prison.txt | 2 +- forge-gui/res/cardsfolder/a/amoeboid_changeling.txt | 2 +- forge-gui/res/cardsfolder/a/amok.txt | 2 +- forge-gui/res/cardsfolder/a/amulet_of_quoz.txt | 4 ++-- forge-gui/res/cardsfolder/a/an_havva_township.txt | 2 +- forge-gui/res/cardsfolder/a/an_zerrin_ruins.txt | 2 +- forge-gui/res/cardsfolder/a/ana_sanctuary.txt | 2 +- forge-gui/res/cardsfolder/a/anaba_ancestor.txt | 2 +- forge-gui/res/cardsfolder/a/anarchy.txt | 2 +- forge-gui/res/cardsfolder/a/anavolver.txt | 2 +- forge-gui/res/cardsfolder/a/ancestors_prophet.txt | 2 +- forge-gui/res/cardsfolder/a/ancestral_knowledge.txt | 2 +- forge-gui/res/cardsfolder/a/ancestral_mask.txt | 2 +- forge-gui/res/cardsfolder/a/ancient_runes.txt | 2 +- forge-gui/res/cardsfolder/a/ancient_spring.txt | 2 +- forge-gui/res/cardsfolder/a/ancient_tomb.txt | 2 +- forge-gui/res/cardsfolder/a/angel_of_salvation.txt | 2 +- forge-gui/res/cardsfolder/a/angelic_accord.txt | 2 +- forge-gui/res/cardsfolder/a/angelic_favor.txt | 2 +- forge-gui/res/cardsfolder/a/angelic_field_marshal.txt | 2 +- forge-gui/res/cardsfolder/a/angelic_voices.txt | 2 +- forge-gui/res/cardsfolder/a/angels_feather.txt | 2 +- forge-gui/res/cardsfolder/a/angels_trumpet.txt | 4 ++-- forge-gui/res/cardsfolder/a/angraths_marauders.txt | 2 +- forge-gui/res/cardsfolder/a/angry_mob.txt | 2 +- forge-gui/res/cardsfolder/a/animal_boneyard.txt | 2 +- forge-gui/res/cardsfolder/a/animate_artifact.txt | 2 +- forge-gui/res/cardsfolder/a/animate_wall.txt | 2 +- forge-gui/res/cardsfolder/a/animation_module.txt | 2 +- forge-gui/res/cardsfolder/a/ankh_of_mishra.txt | 2 +- forge-gui/res/cardsfolder/a/antagonism.txt | 2 +- forge-gui/res/cardsfolder/a/anthroplasm.txt | 2 +- forge-gui/res/cardsfolder/a/anticipate.txt | 2 +- forge-gui/res/cardsfolder/a/anurid_brushhopper.txt | 2 +- forge-gui/res/cardsfolder/a/anvil_of_bogardan.txt | 2 +- forge-gui/res/cardsfolder/a/aphetto_alchemist.txt | 2 +- forge-gui/res/cardsfolder/a/aphetto_dredging.txt | 2 +- forge-gui/res/cardsfolder/a/aphetto_grifter.txt | 2 +- forge-gui/res/cardsfolder/a/apocalypse.txt | 2 +- forge-gui/res/cardsfolder/a/apocalypse_chime.txt | 2 +- forge-gui/res/cardsfolder/a/aquamoeba.txt | 2 +- forge-gui/res/cardsfolder/a/aquitects_will.txt | 4 ++-- forge-gui/res/cardsfolder/a/arcane_laboratory.txt | 2 +- forge-gui/res/cardsfolder/a/arcane_lighthouse.txt | 2 +- forge-gui/res/cardsfolder/a/arcane_melee.txt | 2 +- forge-gui/res/cardsfolder/a/arcane_spyglass.txt | 2 +- forge-gui/res/cardsfolder/a/arcbond.txt | 2 +- forge-gui/res/cardsfolder/a/arcbound_reclaimer.txt | 2 +- forge-gui/res/cardsfolder/a/arcbound_wanderer.txt | 2 +- forge-gui/res/cardsfolder/a/archangel_of_strife.txt | 2 +- forge-gui/res/cardsfolder/a/archdemon_of_unx.txt | 2 +- forge-gui/res/cardsfolder/a/architects_of_will.txt | 2 +- forge-gui/res/cardsfolder/a/archmage_ascension.txt | 2 +- forge-gui/res/cardsfolder/a/archon_of_valors_reach.txt | 4 ++-- forge-gui/res/cardsfolder/a/arctic_merfolk.txt | 2 +- forge-gui/res/cardsfolder/a/arcums_sleigh.txt | 4 ++-- forge-gui/res/cardsfolder/a/arcums_weathervane.txt | 2 +- forge-gui/res/cardsfolder/a/arcums_whistle.txt | 2 +- forge-gui/res/cardsfolder/a/arena.txt | 2 +- forge-gui/res/cardsfolder/a/arena_of_the_ancients.txt | 2 +- forge-gui/res/cardsfolder/a/arena_rector.txt | 2 +- forge-gui/res/cardsfolder/a/argent_mutation.txt | 2 +- forge-gui/res/cardsfolder/a/argothian_enchantress.txt | 2 +- .../cardsfolder/a/arguels_blood_fast_temple_of_aclazotz.txt | 2 +- forge-gui/res/cardsfolder/a/armageddon_clock.txt | 2 +- forge-gui/res/cardsfolder/a/armed_response.txt | 2 +- forge-gui/res/cardsfolder/a/armor_of_thorns.txt | 2 +- forge-gui/res/cardsfolder/a/arnjlots_ascent.txt | 2 +- forge-gui/res/cardsfolder/a/arsenal_thresher.txt | 2 +- forge-gui/res/cardsfolder/a/artifact_possession.txt | 2 +- forge-gui/res/cardsfolder/a/artificers_hex.txt | 2 +- forge-gui/res/cardsfolder/a/artificers_intuition.txt | 2 +- forge-gui/res/cardsfolder/a/artillerize.txt | 2 +- forge-gui/res/cardsfolder/a/artisan_of_forms.txt | 2 +- forge-gui/res/cardsfolder/a/arvad_the_cursed.txt | 2 +- forge-gui/res/cardsfolder/a/ashes_of_the_fallen.txt | 2 +- forge-gui/res/cardsfolder/a/ashling_the_pilgrim.txt | 2 +- forge-gui/res/cardsfolder/a/ashlings_prerogative.txt | 2 +- forge-gui/res/cardsfolder/a/ashnods_altar.txt | 2 +- forge-gui/res/cardsfolder/a/ashnods_cylix.txt | 2 +- forge-gui/res/cardsfolder/a/assault_suit.txt | 2 +- forge-gui/res/cardsfolder/a/assembly_hall.txt | 4 ++-- forge-gui/res/cardsfolder/a/astral_slide.txt | 2 +- forge-gui/res/cardsfolder/a/astrolabe.txt | 2 +- forge-gui/res/cardsfolder/a/atalya_samite_master.txt | 2 +- forge-gui/res/cardsfolder/a/atarka_monument.txt | 2 +- forge-gui/res/cardsfolder/a/attunement.txt | 2 +- forge-gui/res/cardsfolder/a/aura_barbs.txt | 4 ++-- forge-gui/res/cardsfolder/a/aura_finesse.txt | 2 +- forge-gui/res/cardsfolder/a/aura_flux.txt | 2 +- forge-gui/res/cardsfolder/a/aura_graft.txt | 2 +- forge-gui/res/cardsfolder/a/auratouched_mage.txt | 2 +- forge-gui/res/cardsfolder/a/auriok_siege_sled.txt | 2 +- forge-gui/res/cardsfolder/a/auriok_steelshaper.txt | 2 +- forge-gui/res/cardsfolder/a/auriok_transfixer.txt | 2 +- forge-gui/res/cardsfolder/a/auriok_windwalker.txt | 2 +- forge-gui/res/cardsfolder/a/aurora_eidolon.txt | 2 +- forge-gui/res/cardsfolder/a/aurora_griffin.txt | 2 +- forge-gui/res/cardsfolder/a/autumn_willow.txt | 2 +- forge-gui/res/cardsfolder/a/autumns_veil.txt | 4 ++-- forge-gui/res/cardsfolder/a/avacyn_guardian_angel.txt | 2 +- forge-gui/res/cardsfolder/a/avalanche.txt | 2 +- forge-gui/res/cardsfolder/a/avarice_totem.txt | 2 +- forge-gui/res/cardsfolder/a/aven_liberator.txt | 2 +- forge-gui/res/cardsfolder/a/aven_mimeomancer.txt | 2 +- forge-gui/res/cardsfolder/a/aven_shrine.txt | 2 +- forge-gui/res/cardsfolder/a/aven_windreader.txt | 2 +- forge-gui/res/cardsfolder/a/avenger_en_dal.txt | 2 +- forge-gui/res/cardsfolder/a/avizoa.txt | 2 +- forge-gui/res/cardsfolder/a/awakening.txt | 2 +- forge-gui/res/cardsfolder/a/awe_for_the_guilds.txt | 2 +- forge-gui/res/cardsfolder/a/axebane_guardian.txt | 2 +- forge-gui/res/cardsfolder/a/axis_of_mortality.txt | 2 +- forge-gui/res/cardsfolder/a/ayesha_tanaka.txt | 2 +- forge-gui/res/cardsfolder/a/aysen_abbey.txt | 2 +- forge-gui/res/cardsfolder/a/aysen_highway.txt | 2 +- forge-gui/res/cardsfolder/a/azami_lady_of_scrolls.txt | 2 +- forge-gui/res/cardsfolder/a/azorius_aethermage.txt | 2 +- forge-gui/res/cardsfolder/a/azorius_cluestone.txt | 2 +- forge-gui/res/cardsfolder/a/azorius_herald.txt | 2 +- forge-gui/res/cardsfolder/a/azorius_keyrune.txt | 2 +- forge-gui/res/cardsfolder/a/azorius_ploy.txt | 2 +- forge-gui/res/cardsfolder/a/azorius_signet.txt | 2 +- 196 files changed, 210 insertions(+), 210 deletions(-) diff --git a/forge-gui/res/cardsfolder/a/abandon_hope.txt b/forge-gui/res/cardsfolder/a/abandon_hope.txt index 15587932d56..95a38e5789e 100644 --- a/forge-gui/res/cardsfolder/a/abandon_hope.txt +++ b/forge-gui/res/cardsfolder/a/abandon_hope.txt @@ -3,6 +3,6 @@ ManaCost:X 1 B Types:Sorcery A:SP$ Discard | Cost$ X 1 B Discard | ValidTgts$ Opponent | Mode$ RevealYouChoose | NumCards$ X | References$ X | SpellDescription$ Look at target opponent's hand and choose X cards from it. That player discards those cards. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/abandon_hope.jpg Oracle:As an additional cost to cast this spell, discard X cards.\nLook at target opponent's hand and choose X cards from it. That player discards those cards. diff --git a/forge-gui/res/cardsfolder/a/abandoned_sarcophagus.txt b/forge-gui/res/cardsfolder/a/abandoned_sarcophagus.txt index 688ee603a64..1f7af65a670 100644 --- a/forge-gui/res/cardsfolder/a/abandoned_sarcophagus.txt +++ b/forge-gui/res/cardsfolder/a/abandoned_sarcophagus.txt @@ -5,6 +5,6 @@ S:Mode$ Continuous | Affected$ Card.nonLand+YouOwn+withCycling,Card.nonLand+YouO R:Event$ Moved | ValidCard$ Card.YouOwn+withCycling,Card.YouOwn+withTypeCycling | Destination$ Graveyard | NotCause$ Activated.Cycling | ReplaceWith$ Exile | ActiveZones$ Battlefield | Description$ If a card with cycling would be put into your graveyard from anywhere and it wasn't cycled, exile it instead. SVar:Exile:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Exile | Defined$ ReplacedCard #TODO: Add Ability$Cycling to Cycling cards for the purpose of this and other similar cards for deck hints -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/abandoned_sarcophagus.jpg Oracle:You may cast nonland cards with cycling from your graveyard.\nIf a card with cycling would be put into your graveyard from anywhere and it wasn't cycled, exile it instead. diff --git a/forge-gui/res/cardsfolder/a/abjure.txt b/forge-gui/res/cardsfolder/a/abjure.txt index 8c50a177c90..4c154b43d8a 100644 --- a/forge-gui/res/cardsfolder/a/abjure.txt +++ b/forge-gui/res/cardsfolder/a/abjure.txt @@ -3,6 +3,6 @@ ManaCost:U Types:Instant A:SP$ Counter | Cost$ U Sac<1/Permanent.Blue/blue permanent> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SpellDescription$ Counter target spell. SVar:NeedsToPlay:Permanent.Blue+cmcLE2+YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/abjure.jpg Oracle:As an additional cost to cast this spell, sacrifice a blue permanent.\nCounter target spell. diff --git a/forge-gui/res/cardsfolder/a/about_face.txt b/forge-gui/res/cardsfolder/a/about_face.txt index abd9a744ed4..34437abcb22 100644 --- a/forge-gui/res/cardsfolder/a/about_face.txt +++ b/forge-gui/res/cardsfolder/a/about_face.txt @@ -2,6 +2,6 @@ Name:About Face ManaCost:R Types:Instant A:SP$ Pump | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch target creature's power and toughness until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/about_face.jpg Oracle:Switch target creature's power and toughness until end of turn. diff --git a/forge-gui/res/cardsfolder/a/absolute_grace.txt b/forge-gui/res/cardsfolder/a/absolute_grace.txt index f47666d9f85..0bbc16b0368 100644 --- a/forge-gui/res/cardsfolder/a/absolute_grace.txt +++ b/forge-gui/res/cardsfolder/a/absolute_grace.txt @@ -3,6 +3,6 @@ ManaCost:1 W Types:Enchantment S:Mode$ Continuous | Affected$ Creature | AddKeyword$ Protection from black | Description$ All creatures have protection from black. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/absolute_grace.jpg Oracle:All creatures have protection from black. diff --git a/forge-gui/res/cardsfolder/a/absolute_law.txt b/forge-gui/res/cardsfolder/a/absolute_law.txt index 8843d758798..f8d33c51603 100644 --- a/forge-gui/res/cardsfolder/a/absolute_law.txt +++ b/forge-gui/res/cardsfolder/a/absolute_law.txt @@ -3,6 +3,6 @@ ManaCost:1 W Types:Enchantment S:Mode$ Continuous | Affected$ Creature | AddKeyword$ Protection from red | Description$ All creatures have protection from red. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/absolute_law.jpg Oracle:All creatures have protection from red. diff --git a/forge-gui/res/cardsfolder/a/abunas_chant.txt b/forge-gui/res/cardsfolder/a/abunas_chant.txt index 1384b509193..e31ecb7d145 100644 --- a/forge-gui/res/cardsfolder/a/abunas_chant.txt +++ b/forge-gui/res/cardsfolder/a/abunas_chant.txt @@ -5,6 +5,6 @@ K:Entwine:2 A:SP$ Charm | Cost$ 3 W | Choices$ DBGainLife,DBPreventDmg SVar:DBGainLife:DB$ GainLife | LifeAmount$ 5 | SpellDescription$ You gain 5 life. SVar:DBPreventDmg:DB$ PreventDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | Amount$ 5 | SpellDescription$ Prevent the next 5 damage that would be dealt to target creature this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/abunas_chant.jpg Oracle:Choose one —\n• You gain 5 life.\n• Prevent the next 5 damage that would be dealt to target creature this turn.\nEntwine {2} (Choose both if you pay the entwine cost.) diff --git a/forge-gui/res/cardsfolder/a/abundance.txt b/forge-gui/res/cardsfolder/a/abundance.txt index cdae21b177c..21fa438a1d2 100644 --- a/forge-gui/res/cardsfolder/a/abundance.txt +++ b/forge-gui/res/cardsfolder/a/abundance.txt @@ -5,7 +5,7 @@ R:Event$ Draw | ActiveZones$ Battlefield | ValidPlayer$ You | ReplaceWith$ Abund SVar:AbundantChoice:DB$ GenericChoice | Choices$ DigLand,DigNonland | Defined$ You SVar:DigLand:DB$ DigUntil | Valid$ Card.Land | ValidDescription$ land | FoundDestination$ Hand | RevealedDestination$ Library | RevealedLibraryPosition$ -1 | SpellDescription$ Land SVar:DigNonland:DB$ DigUntil | Valid$ Card.nonLand | ValidDescription$ nonland | FoundDestination$ Hand | RevealedDestination$ Library | RevealedLibraryPosition$ -1 | SpellDescription$ nonLand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/abundance.jpg Oracle:If you would draw a card, you may instead choose land or nonland and reveal cards from the top of your library until you reveal a card of the chosen kind. Put that card into your hand and put all other cards revealed this way on the bottom of your library in any order. diff --git a/forge-gui/res/cardsfolder/a/abyssal_persecutor.txt b/forge-gui/res/cardsfolder/a/abyssal_persecutor.txt index 282df348f45..69ac093728b 100644 --- a/forge-gui/res/cardsfolder/a/abyssal_persecutor.txt +++ b/forge-gui/res/cardsfolder/a/abyssal_persecutor.txt @@ -6,6 +6,6 @@ K:Flying K:Trample S:Mode$ Continuous | Affected$ You | AddKeyword$ You can't win the game. | Description$ You can't win the game. S:Mode$ Continuous | Affected$ Opponent | AddKeyword$ You can't lose the game. | Description$ Your opponents can't lose the game. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/abyssal_persecutor.jpg Oracle:Flying, trample\nYou can't win the game and your opponents can't lose the game. diff --git a/forge-gui/res/cardsfolder/a/abzan_banner.txt b/forge-gui/res/cardsfolder/a/abzan_banner.txt index d0a4ae27e34..007b08db3ca 100644 --- a/forge-gui/res/cardsfolder/a/abzan_banner.txt +++ b/forge-gui/res/cardsfolder/a/abzan_banner.txt @@ -5,7 +5,7 @@ A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. A:AB$ Draw | Cost$ W B G T Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$White|Black|Green SVar:Picture:http://www.wizards.com/global/images/magic/general/abzan_banner.jpg Oracle:{T}: Add {W}, {B}, or {G}.\n{W}{B}{G}, {T}, Sacrifice Abzan Banner: Draw a card. diff --git a/forge-gui/res/cardsfolder/a/academy_raider.txt b/forge-gui/res/cardsfolder/a/academy_raider.txt index 521331b1cfe..c5ff6b9568c 100644 --- a/forge-gui/res/cardsfolder/a/academy_raider.txt +++ b/forge-gui/res/cardsfolder/a/academy_raider.txt @@ -7,6 +7,6 @@ T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ Tri SVar:TrigDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/academy_raider.jpg Oracle:Intimidate (This creature can't be blocked except by artifact creatures and/or creatures that share a color with it.)\nWhenever Academy Raider deals combat damage to a player, you may discard a card. If you do, draw a card. diff --git a/forge-gui/res/cardsfolder/a/academy_rector.txt b/forge-gui/res/cardsfolder/a/academy_rector.txt index a75328b8353..3b0013da24c 100644 --- a/forge-gui/res/cardsfolder/a/academy_rector.txt +++ b/forge-gui/res/cardsfolder/a/academy_rector.txt @@ -6,7 +6,7 @@ T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ SVar:TrigExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | Defined$ TriggeredCard | SubAbility$ DBReturn SVar:DBReturn:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Enchantment.YouOwn | ChangeNum$ 1 SVar:SacMe:4 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Enchantment SVar:Picture:http://www.wizards.com/global/images/magic/general/academy_rector.jpg Oracle:When Academy Rector dies, you may exile it. If you do, search your library for an enchantment card, put that card onto the battlefield, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/a/acid_rain.txt b/forge-gui/res/cardsfolder/a/acid_rain.txt index 50426ad14e5..70b0ca57f7f 100644 --- a/forge-gui/res/cardsfolder/a/acid_rain.txt +++ b/forge-gui/res/cardsfolder/a/acid_rain.txt @@ -2,6 +2,6 @@ Name:Acid Rain ManaCost:3 U Types:Sorcery A:SP$ DestroyAll | Cost$ 3 U | ValidCards$ Forest | SpellDescription$ Destroy all Forests. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/acid_rain.jpg Oracle:Destroy all Forests. diff --git a/forge-gui/res/cardsfolder/a/acidic_dagger.txt b/forge-gui/res/cardsfolder/a/acidic_dagger.txt index a6e76e4293a..8e58817c2a8 100644 --- a/forge-gui/res/cardsfolder/a/acidic_dagger.txt +++ b/forge-gui/res/cardsfolder/a/acidic_dagger.txt @@ -7,6 +7,6 @@ SVar:TrigLeave:Mode$ ChangesZone | ValidCard$ Creature.IsRemembered | Origin$ Ba SVar:TrigDestroy:DB$ Destroy | Defined$ TriggeredTarget SVar:TrigSac:DB$ SacrificeAll | Defined$ Imprinted | SubAbility$ ExileEffect SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile | Static$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/acidic_dagger.jpg Oracle:{4}, {T}: Whenever target creature deals combat damage to a non-Wall creature this turn, destroy that non-Wall creature. When the targeted creature leaves the battlefield this turn, sacrifice Acidic Dagger. Activate this ability only before blockers are declared. diff --git a/forge-gui/res/cardsfolder/a/acidic_soil.txt b/forge-gui/res/cardsfolder/a/acidic_soil.txt index 0b0d6bd89c5..4cdd1a05c19 100644 --- a/forge-gui/res/cardsfolder/a/acidic_soil.txt +++ b/forge-gui/res/cardsfolder/a/acidic_soil.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ RepeatEach | Cost$ 2 R | RepeatPlayers$ Player | RepeatSubAbility$ DBDamage | DamageMap$ True | SpellDescription$ CARDNAME deals damage to each player equal to the number of lands they control. SVar:DBDamage:DB$ DealDamage | Defined$ Remembered | NumDmg$ X | References$ X SVar:X:Count$Valid Land.RememberedPlayerCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/acidic_soil.jpg Oracle:Acidic Soil deals damage to each player equal to the number of lands they control. diff --git a/forge-gui/res/cardsfolder/a/acolytes_reward.txt b/forge-gui/res/cardsfolder/a/acolytes_reward.txt index f80179a9254..9b1042489a4 100644 --- a/forge-gui/res/cardsfolder/a/acolytes_reward.txt +++ b/forge-gui/res/cardsfolder/a/acolytes_reward.txt @@ -5,6 +5,6 @@ A:SP$ Pump | Cost$ 1 W | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Se SVar:AcolytesPrevention:DB$ PreventDamage | ValidTgts$ Creature | TgtPrompt$ Select a creature to prevent damage to | Amount$ X | References$ X | PreventionSubAbility$ AcolytesRetribution | ShieldEffectTarget$ ParentTarget | StackDescription$ none SVar:AcolytesRetribution:DB$ DealDamage | Defined$ ShieldEffectTarget | NumDmg$ PreventedDamage | SpellDescription$ CARDNAME deals damage to target creature or player for each damage prevented this way. SVar:X:Count$Devotion.White -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/acolytes_reward.jpg Oracle:Prevent the next X damage that would be dealt to target creature this turn, where X is your devotion to white. If damage is prevented this way, Acolyte's Reward deals that much damage to any target. (Each {W} in the mana costs of permanents you control counts toward your devotion to white.) diff --git a/forge-gui/res/cardsfolder/a/acorn_catapult.txt b/forge-gui/res/cardsfolder/a/acorn_catapult.txt index 6e0a0fa14ab..ef2a6b60793 100644 --- a/forge-gui/res/cardsfolder/a/acorn_catapult.txt +++ b/forge-gui/res/cardsfolder/a/acorn_catapult.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ DealDamage | Cost$ 1 T | NumDmg$ 1 | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | SubAbility$ SquirrelTokenCtrl | SpellDescription$ CARDNAME deals 1 damage to any target. That permanent's controller or that player creates a 1/1 green Squirrel creature token. SVar:SquirrelTokenCtrl:DB$ Token | TokenAmount$ 1 | TokenName$ Squirrel | TokenTypes$ Creature,Squirrel | TokenOwner$ Targeted | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SubAbility$ SquirrelTokenPlayer | ConditionDefined$ Targeted | ConditionPresent$ Card.Creature | ConditionCompare$ EQ0 | TokenImage$ g_1_1_squirrel_ody SVar:SquirrelTokenPlayer:DB$ Token | TokenAmount$ 1 | TokenName$ Squirrel | TokenTypes$ Creature,Squirrel | TokenOwner$ TargetedController | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | ConditionDefined$ Targeted | ConditionPresent$ Card.Creature | ConditionCompare$ GE1 | TokenImage$ g_1_1_squirrel_ody -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/acorn_catapult.jpg Oracle:{1}, {T}: Acorn Catapult deals 1 damage to any target. That permanent's controller or that player creates a 1/1 green Squirrel creature token. diff --git a/forge-gui/res/cardsfolder/a/act_of_authority.txt b/forge-gui/res/cardsfolder/a/act_of_authority.txt index 9440abd0375..b960f2f7e26 100644 --- a/forge-gui/res/cardsfolder/a/act_of_authority.txt +++ b/forge-gui/res/cardsfolder/a/act_of_authority.txt @@ -8,6 +8,6 @@ SVar:TrigExile:DB$ ChangeZone | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Sel SVar:DBGainControl:DB$ GainControl | Defined$ Self | NewController$ RememberedController | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/act_of_authority.jpg Oracle:When Act of Authority enters the battlefield, you may exile target artifact or enchantment.\nAt the beginning of your upkeep, you may exile target artifact or enchantment. If you do, its controller gains control of Act of Authority. diff --git a/forge-gui/res/cardsfolder/a/act_on_impulse.txt b/forge-gui/res/cardsfolder/a/act_on_impulse.txt index 391905c91f8..71b20406465 100644 --- a/forge-gui/res/cardsfolder/a/act_on_impulse.txt +++ b/forge-gui/res/cardsfolder/a/act_on_impulse.txt @@ -5,6 +5,6 @@ A:SP$ Mill | Cost$ 2 R | Defined$ You | NumCards$ 3 | Destination$ Exile | Remem SVar:DBEffect:DB$Effect | RememberObjects$ RememberedCard | StaticAbilities$ Play | SubAbility$ DBCleanup | ForgetOnMoved$ Exile SVar:Play:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may play remembered card. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/act_on_impulse.jpg Oracle:Exile the top three cards of your library. Until end of turn, you may play cards exiled this way. (If you cast a spell this way, you still pay its costs. You can play a land this way only if you have an available land play remaining.) diff --git a/forge-gui/res/cardsfolder/a/active_volcano.txt b/forge-gui/res/cardsfolder/a/active_volcano.txt index abffe9b2db5..10e2e7d34f9 100644 --- a/forge-gui/res/cardsfolder/a/active_volcano.txt +++ b/forge-gui/res/cardsfolder/a/active_volcano.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Charm | Cost$ R | Choices$ DBDestroy,DBChangeZone SVar:DBDestroy:DB$ Destroy | ValidTgts$ Permanent.Blue | TgtPrompt$ Select target blue permanent | SpellDescription$ Destroy target blue permanent. SVar:DBChangeZone:DB$ ChangeZone | ValidTgts$ Island | TgtPrompt$ Select target Island | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target Island to its owner's hand. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/active_volcano.jpg Oracle:Choose one —\n• Destroy target blue permanent.\n• Return target Island to its owner's hand. diff --git a/forge-gui/res/cardsfolder/a/ad_nauseam.txt b/forge-gui/res/cardsfolder/a/ad_nauseam.txt index 12dea8a7ffc..74557373e9e 100644 --- a/forge-gui/res/cardsfolder/a/ad_nauseam.txt +++ b/forge-gui/res/cardsfolder/a/ad_nauseam.txt @@ -6,6 +6,6 @@ SVar:DBDig:DB$ Dig | DigNum$ 1 | Reveal$ True | ChangeNum$ All | ChangeValid$ Ca SVar:DBLose:DB$ LoseLife | LifeAmount$ X | SubAbility$ DBCleanup | References$ X SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ad_nauseam.jpg Oracle:Reveal the top card of your library and put that card into your hand. You lose life equal to its converted mana cost. You may repeat this process any number of times. diff --git a/forge-gui/res/cardsfolder/a/adanto_vanguard.txt b/forge-gui/res/cardsfolder/a/adanto_vanguard.txt index ab0bb320be9..1cb75d26350 100644 --- a/forge-gui/res/cardsfolder/a/adanto_vanguard.txt +++ b/forge-gui/res/cardsfolder/a/adanto_vanguard.txt @@ -4,6 +4,6 @@ Types:Creature Vampire Soldier PT:1/1 S:Mode$ Continuous | Affected$ Creature.Self+attacking | AddPower$ 2 | Description$ As long as CARDNAME is attacking, it gets +2/+0. A:AB$ Pump | Cost$ PayLife<4> | Defined$ Self | KW$ Indestructible | SpellDescription$ CARDNAME gains indestructible until end of turn. (Damage and effects that say "destroy" don't destroy it.) -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/adanto_vanguard.jpg Oracle:As long as Adanto Vanguard is attacking, it gets +2/+0.\nPay 4 life: Adanto Vanguard gains indestructible until end of turn. (Damage and effects that say "destroy" don't destroy it.) diff --git a/forge-gui/res/cardsfolder/a/adarkar_unicorn.txt b/forge-gui/res/cardsfolder/a/adarkar_unicorn.txt index 0b33df070b2..f2acf94ece6 100644 --- a/forge-gui/res/cardsfolder/a/adarkar_unicorn.txt +++ b/forge-gui/res/cardsfolder/a/adarkar_unicorn.txt @@ -4,7 +4,7 @@ Types:Creature Unicorn PT:2/2 A:AB$ Mana | Cost$ T | Produced$ C U | RestrictValid$ CumulativeUpkeep | SpellDescription$ Add {C}{U}. Spend this mana only to pay cumulative upkeep costs. A:AB$ Mana | Cost$ T | Produced$ U | RestrictValid$ CumulativeUpkeep | SpellDescription$ Add {U}. Spend this mana only to pay cumulative upkeep costs. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/adarkar_unicorn.jpg Oracle:{T}: Add {U} or {C}{U}. Spend this mana only to pay cumulative upkeep costs. diff --git a/forge-gui/res/cardsfolder/a/adarkar_windform.txt b/forge-gui/res/cardsfolder/a/adarkar_windform.txt index 4d0a265a524..2ee958a1f28 100644 --- a/forge-gui/res/cardsfolder/a/adarkar_windform.txt +++ b/forge-gui/res/cardsfolder/a/adarkar_windform.txt @@ -4,6 +4,6 @@ Types:Snow Creature Illusion PT:3/3 K:Flying A:AB$ Debuff | Cost$ 1 S | ValidTgts$ Creature | TgtPrompt$ Select target creature | Keywords$ Flying | SpellDescription$ Target creature loses flying until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/adarkar_windform.jpg Oracle:Flying\n{1}{S}: Target creature loses flying until end of turn. ({S} can be paid with one mana from a snow permanent.) diff --git a/forge-gui/res/cardsfolder/a/adventurers_guildhouse.txt b/forge-gui/res/cardsfolder/a/adventurers_guildhouse.txt index 3d63a664f1f..8e7b287f981 100644 --- a/forge-gui/res/cardsfolder/a/adventurers_guildhouse.txt +++ b/forge-gui/res/cardsfolder/a/adventurers_guildhouse.txt @@ -2,7 +2,7 @@ Name:Adventurers' Guildhouse ManaCost:no cost Types:Land S:Mode$ Continuous | Affected$ Creature.Green+Legendary | AddKeyword$ Bands with Other Legendary Creatures | Description$ Green legendary creatures you control have "bands with other legendary creatures." (Any legendary creatures can attack in a band as long as at least one has "bands with other legendary creatures." Bands are blocked as a group. If at least two legendary creatures you control, one of which has "bands with other legendary creatures," are blocking or being blocked by the same creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/adventurers_guildhouse.jpg Oracle:Green legendary creatures you control have "bands with other legendary creatures." (Any legendary creatures can attack in a band as long as at least one has "bands with other legendary creatures." Bands are blocked as a group. If at least two legendary creatures you control, one of which has "bands with other legendary creatures," are blocking or being blocked by the same creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/a/advice_from_the_fae.txt b/forge-gui/res/cardsfolder/a/advice_from_the_fae.txt index aad46150c52..8745ab9face 100644 --- a/forge-gui/res/cardsfolder/a/advice_from_the_fae.txt +++ b/forge-gui/res/cardsfolder/a/advice_from_the_fae.txt @@ -6,6 +6,6 @@ SVar:Dig2:DB$ Dig | DigNum$ 5 | ChangeNum$ 2 | ConditionCheckSVar$ X | Condition SVar:X:Count$Valid Creature.YouCtrl SVar:Y:PlayerCountOther$HighestValid Creature.YouCtrl DeckNeeds:Color$Blue -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/advice_from_the_fae.jpg Oracle:({2/U} can be paid with any two mana or with {U}. This card's converted mana cost is 6.)\nLook at the top five cards of your library. If you control more creatures than each other player, put two of those cards into your hand. Otherwise, put one of them into your hand. Then put the rest on the bottom of your library in any order. diff --git a/forge-gui/res/cardsfolder/a/aeon_chronicler.txt b/forge-gui/res/cardsfolder/a/aeon_chronicler.txt index 2869b1f7e9b..238869f94f6 100644 --- a/forge-gui/res/cardsfolder/a/aeon_chronicler.txt +++ b/forge-gui/res/cardsfolder/a/aeon_chronicler.txt @@ -9,6 +9,6 @@ T:Mode$ CounterRemoved | ValidCard$ Card.Self | TriggerZones$ Exile | CounterTyp SVar:TrigDraw:DB$ Draw | NumCards$ 1 | Defined$ You SVar:X:Count$xPaid SVar:Y:Count$InYourHand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/aeon_chronicler.jpg Oracle:Aeon Chronicler's power and toughness are each equal to the number of cards in your hand.\nSuspend X—{X}{3}{U}. X can't be 0. (Rather than cast this card from your hand, you may pay {X}{3}{U} and exile it with X time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.)\nWhenever a time counter is removed from Aeon Chronicler while it's exiled, draw a card. diff --git a/forge-gui/res/cardsfolder/a/aether_barrier.txt b/forge-gui/res/cardsfolder/a/aether_barrier.txt index a14a283b317..d3fdea30b36 100644 --- a/forge-gui/res/cardsfolder/a/aether_barrier.txt +++ b/forge-gui/res/cardsfolder/a/aether_barrier.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Enchantment T:Mode$ SpellCast | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ Whenever a player casts a creature spell, that player sacrifices a permanent unless they pay {1}. SVar:TrigSac:DB$ Sacrifice | UnlessCost$ 1 | UnlessPayer$ TriggeredActivator | Defined$ TriggeredActivator | SacValid$ Permanent -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/aether_barrier.jpg Oracle:Whenever a player casts a creature spell, that player sacrifices a permanent unless they pay {1}. diff --git a/forge-gui/res/cardsfolder/a/aether_charge.txt b/forge-gui/res/cardsfolder/a/aether_charge.txt index c5758e80a0a..c75129687f8 100644 --- a/forge-gui/res/cardsfolder/a/aether_charge.txt +++ b/forge-gui/res/cardsfolder/a/aether_charge.txt @@ -3,6 +3,6 @@ ManaCost:4 R Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Beast.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDealDamage | TriggerDescription$ Whenever a Beast enters the battlefield under your control, you may have it deal 4 damage to target opponent or planeswalker. SVar:TrigDealDamage:DB$DealDamage | DamageSource$ TriggeredCard | ValidTgts$ Opponent,Planeswalker | NumDmg$ 4 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/aether_charge.jpg Oracle:Whenever a Beast enters the battlefield under your control, you may have it deal 4 damage to target opponent or planeswalker. diff --git a/forge-gui/res/cardsfolder/a/aether_flash.txt b/forge-gui/res/cardsfolder/a/aether_flash.txt index a331c6bda14..ec66457e047 100644 --- a/forge-gui/res/cardsfolder/a/aether_flash.txt +++ b/forge-gui/res/cardsfolder/a/aether_flash.txt @@ -3,6 +3,6 @@ ManaCost:2 R R Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever a creature enters the battlefield, CARDNAME deals 2 damage to it. SVar:TrigDealDamage:DB$DealDamage | Defined$ TriggeredCardLKICopy | NumDmg$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/aether_flash.jpg Oracle:Whenever a creature enters the battlefield, Aether Flash deals 2 damage to it. diff --git a/forge-gui/res/cardsfolder/a/aether_rift.txt b/forge-gui/res/cardsfolder/a/aether_rift.txt index c08f9f772c0..e997bef5c91 100644 --- a/forge-gui/res/cardsfolder/a/aether_rift.txt +++ b/forge-gui/res/cardsfolder/a/aether_rift.txt @@ -5,6 +5,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigDiscard | Trigge SVar:TrigDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ Random | RememberDiscarded$ True | SubAbility$ DBReturn | SpellDescription$ Discard a card at random. If you discard a creature card this way, return it from your graveyard to the battlefield unless any player pays 5 life. SVar:DBReturn:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Graveyard | Destination$ Battlefield | ConditionDefined$ Remembered | ConditionPresent$ Card.Creature | ConditionCompare$ EQ1 | UnlessCost$ PayLife<5> | UnlessPayer$ Player | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/aether_rift.jpg Oracle:At the beginning of your upkeep, discard a card at random. If you discard a creature card this way, return it from your graveyard to the battlefield unless any player pays 5 life. diff --git a/forge-gui/res/cardsfolder/a/aether_shockwave.txt b/forge-gui/res/cardsfolder/a/aether_shockwave.txt index cc60ca2746a..db14e6810a5 100644 --- a/forge-gui/res/cardsfolder/a/aether_shockwave.txt +++ b/forge-gui/res/cardsfolder/a/aether_shockwave.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Charm | Cost$ 3 W | Choices$ DBTapAll,DBTapAll2 SVar:DBTapAll:DB$ TapAll | ValidCards$ Spirit | SpellDescription$ Tap all Spirits. SVar:DBTapAll2:DB$ TapAll | ValidCards$ Creature.nonSpirit | SpellDescription$ Tap all non-Spirit creatures. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/aether_shockwave.jpg Oracle:Choose one —\n• Tap all Spirits.\n• Tap all non-Spirit creatures. diff --git a/forge-gui/res/cardsfolder/a/aether_snap.txt b/forge-gui/res/cardsfolder/a/aether_snap.txt index c2a64698771..4479600f9d6 100644 --- a/forge-gui/res/cardsfolder/a/aether_snap.txt +++ b/forge-gui/res/cardsfolder/a/aether_snap.txt @@ -3,7 +3,7 @@ ManaCost:3 B B Types:Sorcery A:SP$ RemoveCounterAll | Cost$ 3 B B | ValidCards$ Permanent | AllCounterTypes$ True | StackDescription$ SpellDescription | SubAbility$ DBRemove | SpellDescription$ Remove all counters from all permanents and exile all tokens. SVar:DBRemove:DB$ ChangeZoneAll | ChangeType$ Card.token | Origin$ Battlefield | Destination$ Exile -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/aether_snap.jpg Oracle:Remove all counters from all permanents and exile all tokens. diff --git a/forge-gui/res/cardsfolder/a/aether_spellbomb.txt b/forge-gui/res/cardsfolder/a/aether_spellbomb.txt index f70a051e31c..4b9960f4012 100644 --- a/forge-gui/res/cardsfolder/a/aether_spellbomb.txt +++ b/forge-gui/res/cardsfolder/a/aether_spellbomb.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ ChangeZone | Cost$ U Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. A:AB$ Draw | Cost$ 1 Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Blue SVar:Picture:http://www.wizards.com/global/images/magic/general/aether_spellbomb.jpg Oracle:{U}, Sacrifice Aether Spellbomb: Return target creature to its owner's hand.\n{1}, Sacrifice Aether Spellbomb: Draw a card. diff --git a/forge-gui/res/cardsfolder/a/aether_storm.txt b/forge-gui/res/cardsfolder/a/aether_storm.txt index 7123a8545ff..be348fb280a 100644 --- a/forge-gui/res/cardsfolder/a/aether_storm.txt +++ b/forge-gui/res/cardsfolder/a/aether_storm.txt @@ -3,6 +3,6 @@ ManaCost:3 U Types:Enchantment S:Mode$ CantBeCast | ValidCard$ Creature | Description$ Creature spells can't be cast. A:AB$ Destroy | Cost$ PayLife<4> | Defined$ Self | NoReg$ True | AnyPlayer$ True | SpellDescription$ Destroy CARDNAME. It can't be regenerated. Any player may activate this ability. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/aether_storm.jpg Oracle:Creature spells can't be cast.\nPay 4 life: Destroy Aether Storm. It can't be regenerated. Any player may activate this ability. diff --git a/forge-gui/res/cardsfolder/a/aether_tide.txt b/forge-gui/res/cardsfolder/a/aether_tide.txt index f532c51de55..b1eafd68e87 100644 --- a/forge-gui/res/cardsfolder/a/aether_tide.txt +++ b/forge-gui/res/cardsfolder/a/aether_tide.txt @@ -5,6 +5,6 @@ A:SP$ ChangeZone | Cost$ X U Discard | TargetMin$ 0 | TargetMax$ Max # It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) SVar:X:Targeted$Amount SVar:MaxTgts:Count$Valid Creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/aether_tide.jpg Oracle:As an additional cost to cast this spell, discard X creature cards.\nReturn X target creatures to their owners' hands. diff --git a/forge-gui/res/cardsfolder/a/aether_tradewinds.txt b/forge-gui/res/cardsfolder/a/aether_tradewinds.txt index 6b5d01d8e44..62c4d6a812a 100644 --- a/forge-gui/res/cardsfolder/a/aether_tradewinds.txt +++ b/forge-gui/res/cardsfolder/a/aether_tradewinds.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Instant A:SP$ ChangeZone | Cost$ 2 U | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Permanent.YouCtrl | TgtPrompt$ Select target permanent you control | SubAbility$ DBChange | SpellDescription$ Return target permanent you control and target permanent you don't control to their owners' hands. SVar:DBChange:DB$ChangeZone | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Permanent.YouDontCtrl | TgtPrompt$ Select target permanent you don't control -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/aether_tradewinds.jpg Oracle:Return target permanent you control and target permanent you don't control to their owners' hands. diff --git a/forge-gui/res/cardsfolder/a/aethermages_touch.txt b/forge-gui/res/cardsfolder/a/aethermages_touch.txt index 56646f76551..19597d01fbd 100644 --- a/forge-gui/res/cardsfolder/a/aethermages_touch.txt +++ b/forge-gui/res/cardsfolder/a/aethermages_touch.txt @@ -6,6 +6,6 @@ SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Permanent$ True | Triggers$ T SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:TrigAethermage:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | ValidPlayer$ You | Execute$ BounceAethermage | TriggerDescription$ At the beginning of your end step, return CARDNAME to its owner's hand. SVar:BounceAethermage:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Hand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/aethermages_touch.jpg Oracle:Reveal the top four cards of your library. You may put a creature card from among them onto the battlefield. It gains "At the beginning of your end step, return this creature to its owner's hand." Then put the rest of the cards revealed this way on the bottom of your library in any order. diff --git a/forge-gui/res/cardsfolder/a/aetherplasm.txt b/forge-gui/res/cardsfolder/a/aetherplasm.txt index 75946db4662..3d0f9e56b6d 100644 --- a/forge-gui/res/cardsfolder/a/aetherplasm.txt +++ b/forge-gui/res/cardsfolder/a/aetherplasm.txt @@ -7,7 +7,7 @@ SVar:TrigBounce:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Defin SVar:DBChangeZone:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature | ChangeNum$ 1 | Blocking$ TriggeredAttacker | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:HasBlockEffect:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/aetherplasm.jpg Oracle:Whenever Aetherplasm blocks a creature, you may return Aetherplasm to its owner's hand. If you do, you may put a creature card from your hand onto the battlefield blocking that creature. diff --git a/forge-gui/res/cardsfolder/a/aethersnatch.txt b/forge-gui/res/cardsfolder/a/aethersnatch.txt index 063485fba9e..dca2b5e4d9d 100644 --- a/forge-gui/res/cardsfolder/a/aethersnatch.txt +++ b/forge-gui/res/cardsfolder/a/aethersnatch.txt @@ -3,6 +3,6 @@ ManaCost:4 U U Types:Instant A:SP$ ControlSpell | Cost$ 4 U U | ValidTgts$ Card | TargetType$ Spell | Mode$ Gain | SubAbility$ DBChooseTargets | SpellDescription$ Gain control of target spell. You may choose new targets for it. (If that spell becomes a permanent, it enters the battlefield under your control.) SVar:DBChooseTargets:DB$ ChangeTargets | Defined$ Targeted | Optional$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/aethersnatch.jpg Oracle:Gain control of target spell. You may choose new targets for it. (If that spell becomes a permanent, it enters the battlefield under your control.) diff --git a/forge-gui/res/cardsfolder/a/agent_of_erebos.txt b/forge-gui/res/cardsfolder/a/agent_of_erebos.txt index 6ecc1fad16c..e89234f9a76 100644 --- a/forge-gui/res/cardsfolder/a/agent_of_erebos.txt +++ b/forge-gui/res/cardsfolder/a/agent_of_erebos.txt @@ -5,6 +5,6 @@ PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ Constellation — Whenever CARDNAME or another enchantment enters the battlefield under your control, exile all cards from target player's graveyard. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigExile | Secondary$ True | TriggerDescription$ Constellation — Whenever CARDNAME or another enchantment enters the battlefield under your control, exile all cards from target player's graveyard. SVar:TrigExile:DB$ ChangeZoneAll | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Player | TgtPrompt$ Select target player | ChangeType$ Card -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/agent_of_erebos.jpg Oracle:Constellation — Whenever Agent of Erebos or another enchantment enters the battlefield under your control, exile all cards from target player's graveyard. diff --git a/forge-gui/res/cardsfolder/a/agent_of_shauku.txt b/forge-gui/res/cardsfolder/a/agent_of_shauku.txt index 849e2feb4c5..88e2509b99b 100644 --- a/forge-gui/res/cardsfolder/a/agent_of_shauku.txt +++ b/forge-gui/res/cardsfolder/a/agent_of_shauku.txt @@ -3,6 +3,6 @@ ManaCost:1 B Types:Creature Human Mercenary PT:1/1 A:AB$ Pump | Cost$ 1 B Sac<1/Land> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ 2 | SpellDescription$ Target creature gets +2/+0 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/agent_of_shauku.jpg Oracle:{1}{B}, Sacrifice a land: Target creature gets +2/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/a/agent_of_stromgald.txt b/forge-gui/res/cardsfolder/a/agent_of_stromgald.txt index 5c14b274661..6c26a4eeb7b 100644 --- a/forge-gui/res/cardsfolder/a/agent_of_stromgald.txt +++ b/forge-gui/res/cardsfolder/a/agent_of_stromgald.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Creature Human Knight PT:1/1 A:AB$ Mana | Cost$ R | Produced$ B | SpellDescription$ Add {B}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/agent_of_stromgald.jpg Oracle:{R}: Add {B}. diff --git a/forge-gui/res/cardsfolder/a/aggression.txt b/forge-gui/res/cardsfolder/a/aggression.txt index 17e1e16e5cc..fb7807dd0f6 100644 --- a/forge-gui/res/cardsfolder/a/aggression.txt +++ b/forge-gui/res/cardsfolder/a/aggression.txt @@ -6,6 +6,6 @@ A:SP$ Attach | Cost$ 2 R | ValidTgts$ Creature.nonWall | TgtPrompt$ Select targe S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ First Strike & Trample | Description$ Enchanted creature has first strike and trample. T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ EnchantedController | TriggerZones$ Battlefield | Execute$ TrigDestroy | IsPresent$ Card.EnchantedBy+notAttackedThisTurn | TriggerDescription$ At the beginning of the end step of enchanted creature's controller, destroy that creature if it didn't attack this turn. SVar:TrigDestroy:DB$ Destroy | Defined$ Enchanted -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/aggression.jpg Oracle:Enchant non-Wall creature\nEnchanted creature has first strike and trample.\nAt the beginning of the end step of enchanted creature's controller, destroy that creature if it didn't attack this turn. diff --git a/forge-gui/res/cardsfolder/a/aggressive_mining.txt b/forge-gui/res/cardsfolder/a/aggressive_mining.txt index f74ff1370ca..7f7bcf5a8c3 100644 --- a/forge-gui/res/cardsfolder/a/aggressive_mining.txt +++ b/forge-gui/res/cardsfolder/a/aggressive_mining.txt @@ -3,6 +3,6 @@ ManaCost:3 R Types:Enchantment S:Mode$ CantPlayLand | Player$ You | Description$ You can't play lands. A:AB$ Draw | Cost$ Sac<1/Land> | NumCards$ 2 | ActivationLimit$ 1 | SpellDescription$ Draw two cards. Activate this ability only once each turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/aggressive_mining.jpg Oracle:You can't play lands.\nSacrifice a land: Draw two cards. Activate this ability only once each turn. diff --git a/forge-gui/res/cardsfolder/a/airborne_aid.txt b/forge-gui/res/cardsfolder/a/airborne_aid.txt index ab4c5be40e1..2348573029b 100644 --- a/forge-gui/res/cardsfolder/a/airborne_aid.txt +++ b/forge-gui/res/cardsfolder/a/airborne_aid.txt @@ -3,6 +3,6 @@ ManaCost:3 U Types:Sorcery A:SP$ Draw | Cost$ 3 U | NumCards$ X | References$ X | SpellDescription$ Draw a card for each Bird on the battlefield. SVar:X:Count$TypeOnBattlefield.Bird -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/airborne_aid.jpg Oracle:Draw a card for each Bird on the battlefield. diff --git a/forge-gui/res/cardsfolder/a/airdrop_condor.txt b/forge-gui/res/cardsfolder/a/airdrop_condor.txt index 243e0471f2b..44d5a15c2e2 100644 --- a/forge-gui/res/cardsfolder/a/airdrop_condor.txt +++ b/forge-gui/res/cardsfolder/a/airdrop_condor.txt @@ -5,6 +5,6 @@ PT:2/2 K:Flying A:AB$ DealDamage | Cost$ 1 R Sac<1/Creature.Goblin/Goblin creature> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals damage equal to the sacrificed creature's power to any target. SVar:X:Sacrificed$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/airdrop_condor.jpg Oracle:Flying\n{1}{R}, Sacrifice a Goblin creature: Airdrop Condor deals damage equal to the sacrificed creature's power to any target. diff --git a/forge-gui/res/cardsfolder/a/akiri_line_slinger.txt b/forge-gui/res/cardsfolder/a/akiri_line_slinger.txt index a45f5838043..4aa351a52f0 100644 --- a/forge-gui/res/cardsfolder/a/akiri_line_slinger.txt +++ b/forge-gui/res/cardsfolder/a/akiri_line_slinger.txt @@ -8,6 +8,6 @@ S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | References$ X | Descrip SVar:X:Count$Valid Artifact.YouCtrl K:Partner SVar:BuffedBy:Artifact -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/akiri_line_slinger.jpg Oracle:First strike, vigilance\nAkiri, Line-Slinger gets +1/+0 for each artifact you control.\nPartner (You can have two commanders if both have partner.) diff --git a/forge-gui/res/cardsfolder/a/akki_avalanchers.txt b/forge-gui/res/cardsfolder/a/akki_avalanchers.txt index 0568588d903..9f9dae45921 100644 --- a/forge-gui/res/cardsfolder/a/akki_avalanchers.txt +++ b/forge-gui/res/cardsfolder/a/akki_avalanchers.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Creature Goblin Warrior PT:1/1 A:AB$ Pump | Cost$ Sac<1/Land> | NumAtt$ 2 | ActivationLimit$ 1 | SpellDescription$ CARDNAME gets +2/+0 until end of turn. Activate this ability only once each turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/akki_avalanchers.jpg Oracle:Sacrifice a land: Akki Avalanchers gets +2/+0 until end of turn. Activate this ability only once each turn. diff --git a/forge-gui/res/cardsfolder/a/akoum_flameseeker.txt b/forge-gui/res/cardsfolder/a/akoum_flameseeker.txt index ee2dca9607d..312bf1b3b54 100644 --- a/forge-gui/res/cardsfolder/a/akoum_flameseeker.txt +++ b/forge-gui/res/cardsfolder/a/akoum_flameseeker.txt @@ -5,7 +5,7 @@ PT:3/2 A:AB$ Discard | Cost$ T tapXType<1/Ally> | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBDraw | PrecostDesc$ Cohort — | SpellDescription$ Discard a card. If you do, draw a card. SVar:DBDraw:DB$ Draw | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHints:Type$Ally SVar:Picture:http://www.wizards.com/global/images/magic/general/akoum_flameseeker.jpg Oracle:Cohort — {T}, Tap an untapped Ally you control: Discard a card. If you do, draw a card. diff --git a/forge-gui/res/cardsfolder/a/akromas_blessing.txt b/forge-gui/res/cardsfolder/a/akromas_blessing.txt index 4d62ca70386..4f15fad6878 100644 --- a/forge-gui/res/cardsfolder/a/akromas_blessing.txt +++ b/forge-gui/res/cardsfolder/a/akromas_blessing.txt @@ -4,6 +4,6 @@ Types:Instant K:Cycling:W A:SP$ ChooseColor | Cost$ 2 W | Defined$ You | AILogic$ MostProminentAttackers | SubAbility$ DBProtection | SpellDescription$ Choose a color. Creatures you control gain protection from the chosen color until end of turn. SVar:DBProtection:DB$ ProtectionAll | ValidCards$ Creature.YouCtrl | Gains$ ChosenColor -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/akromas_blessing.jpg Oracle:Choose a color. Creatures you control gain protection from the chosen color until end of turn.\nCycling {W} ({W}, Discard this card: Draw a card.) diff --git a/forge-gui/res/cardsfolder/a/al_abaras_carpet.txt b/forge-gui/res/cardsfolder/a/al_abaras_carpet.txt index 57b2a579caf..8b6a075afb9 100644 --- a/forge-gui/res/cardsfolder/a/al_abaras_carpet.txt +++ b/forge-gui/res/cardsfolder/a/al_abaras_carpet.txt @@ -3,7 +3,7 @@ ManaCost:5 Types:Artifact A:AB$ Effect | Cost$ 5 T | Name$ Al-abara's Carpet Effect | ReplacementEffects$ RPrevent | SpellDescription$ Prevent all damage that would be dealt to you this turn by attacking creatures without flying. SVar:RPrevent:Event$ DamageDone | Prevent$ True | ActiveZones$ Command | ValidTarget$ Player | ValidSource$ Creature.attacking+withoutFlying | Description$ Prevent all damage that would be dealt to you this turn by attacking creatures without flying. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/al_abaras_carpet.jpg Oracle:{5}, {T}: Prevent all damage that would be dealt to you this turn by attacking creatures without flying. diff --git a/forge-gui/res/cardsfolder/a/aladdins_lamp.txt b/forge-gui/res/cardsfolder/a/aladdins_lamp.txt index 3030f813e88..0e8684e4288 100644 --- a/forge-gui/res/cardsfolder/a/aladdins_lamp.txt +++ b/forge-gui/res/cardsfolder/a/aladdins_lamp.txt @@ -10,7 +10,7 @@ SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ SVar:X:Count$xPaid SVar:DigNum:Number$0 SVar:AIPlayForSub:True -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/aladdins_lamp.jpg Oracle:{X}, {T}: The next time you would draw a card this turn, instead look at the top X cards of your library, put all but one of them on the bottom of your library in a random order, then draw a card. X can't be 0. diff --git a/forge-gui/res/cardsfolder/a/alchemists_apprentice.txt b/forge-gui/res/cardsfolder/a/alchemists_apprentice.txt index 081f1ccf414..79239e258b0 100644 --- a/forge-gui/res/cardsfolder/a/alchemists_apprentice.txt +++ b/forge-gui/res/cardsfolder/a/alchemists_apprentice.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Creature Human Wizard PT:1/1 A:AB$ Draw | Cost$ Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/alchemists_apprentice.jpg Oracle:Sacrifice Alchemist's Apprentice: Draw a card. diff --git a/forge-gui/res/cardsfolder/a/alchemists_refuge.txt b/forge-gui/res/cardsfolder/a/alchemists_refuge.txt index fda285fb8c8..f23682b7f12 100644 --- a/forge-gui/res/cardsfolder/a/alchemists_refuge.txt +++ b/forge-gui/res/cardsfolder/a/alchemists_refuge.txt @@ -5,7 +5,7 @@ A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Effect | Cost$ G U T | Name$ Refuge Effect | StaticAbilities$ QuickSpell | SpellDescription$ You may cast spells this turn as though they had flash. SVar:QuickSpell:Mode$ Continuous | EffectZone$ Command | Affected$ Card | WithFlash$ You | AffectedZone$ Exile,Graveyard,Hand,Library,Command | Description$ You may cast spells this turn as though they had flash. SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/alchemists_refuge.jpg Oracle:{T}: Add {C}.\n{G}{U}, {T}: You may cast spells this turn as though they had flash. diff --git a/forge-gui/res/cardsfolder/a/alchors_tomb.txt b/forge-gui/res/cardsfolder/a/alchors_tomb.txt index 0fb2131c885..8ad72006d8c 100644 --- a/forge-gui/res/cardsfolder/a/alchors_tomb.txt +++ b/forge-gui/res/cardsfolder/a/alchors_tomb.txt @@ -3,7 +3,7 @@ ManaCost:4 Types:Artifact A:AB$ ChooseColor | Cost$ 2 T | Defined$ You | SubAbility$ Animate | SpellDescription$ Target permanent you control becomes the color of your choice. (This effect lasts indefinitely.) SVar:Animate:DB$ Animate | ValidTgts$ Permanent.YouCtrl | TgtPrompt$ Select target permanent you control | Colors$ ChosenColor | OverwriteColors$ True | Permanent$ True -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/alchors_tomb.jpg Oracle:{2}, {T}: Target permanent you control becomes the color of your choice. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/a/aleatory.txt b/forge-gui/res/cardsfolder/a/aleatory.txt index 96e6ad3e7cf..1d52abbdbad 100644 --- a/forge-gui/res/cardsfolder/a/aleatory.txt +++ b/forge-gui/res/cardsfolder/a/aleatory.txt @@ -6,6 +6,6 @@ A:SP$ FlipACoin | Cost$ 1 R | ValidTgts$ Creature | TgtPrompt$ Select target cre SVar:AleatoryPump:DB$ Pump | Defined$ Targeted | NumAtt$ 1 | NumDef$ 1 | SubAbility$ DelTrigSlowtrip SVar:DelTrigSlowtrip:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ DrawSlowtrip | TriggerDescription$ Draw a card. SVar:DrawSlowtrip:DB$ Draw | NumCards$ 1 | Defined$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/aleatory.jpg Oracle:Cast this spell only during combat after blockers are declared.\nFlip a coin. If you win the flip, target creature gets +1/+1 until end of turn.\nDraw a card at the beginning of the next turn's upkeep. diff --git a/forge-gui/res/cardsfolder/a/alexi_zephyr_mage.txt b/forge-gui/res/cardsfolder/a/alexi_zephyr_mage.txt index c5705b9fecf..8cc9b6c4529 100644 --- a/forge-gui/res/cardsfolder/a/alexi_zephyr_mage.txt +++ b/forge-gui/res/cardsfolder/a/alexi_zephyr_mage.txt @@ -6,6 +6,6 @@ A:AB$ ChangeZone | Cost$ X U T Discard<2/Card> | Origin$ Battlefield | Destinati # It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) SVar:X:Targeted$Amount SVar:MaxTgts:Count$Valid Creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/alexi_zephyr_mage.jpg Oracle:{X}{U}, {T}, Discard two cards: Return X target creatures to their owners' hands. diff --git a/forge-gui/res/cardsfolder/a/aligned_hedron_network.txt b/forge-gui/res/cardsfolder/a/aligned_hedron_network.txt index 85b5de62696..5b5b116b981 100644 --- a/forge-gui/res/cardsfolder/a/aligned_hedron_network.txt +++ b/forge-gui/res/cardsfolder/a/aligned_hedron_network.txt @@ -13,6 +13,6 @@ SVar:NeedsToPlayVar:Z GE1 SVar:Z:SVar$Z1/Minus.Z2 SVar:Z1:Count$Valid Creature.OppCtrl+powerGE5+inZoneBattlefield SVar:Z2:Count$Valid Creature.YouCtrl+powerGE5+inZoneBattlefield -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/aligned_hedron_network.jpg Oracle:When Aligned Hedron Network enters the battlefield, exile all creatures with power 5 or greater until Aligned Hedron Network leaves the battlefield. (Those creatures return under their owners' control.) diff --git a/forge-gui/res/cardsfolder/a/all_suns_dawn.txt b/forge-gui/res/cardsfolder/a/all_suns_dawn.txt index 9e8bdc1d1ef..6d511ad2761 100644 --- a/forge-gui/res/cardsfolder/a/all_suns_dawn.txt +++ b/forge-gui/res/cardsfolder/a/all_suns_dawn.txt @@ -7,6 +7,6 @@ SVar:ReturnB:DB$ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ SVar:ReturnR:DB$ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target red card in your graveyard | ValidTgts$ Card.Red+YouCtrl |TargetMin$ 0 | TargetMax$ 1 | SubAbility$ ReturnG | SpellDescription$ Return target red card from your graveyard to your hand. SVar:ReturnG:DB$ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target green card in your graveyard | ValidTgts$ Card.Green+YouCtrl | TargetMin$ 0 | TargetMax$ 1 | SubAbility$ DBExile | SpellDescription$ Return target green card from your graveyard to your hand. SVar:DBExile:DB$ChangeZone | Origin$ Stack | Destination$ Exile -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/all_suns_dawn.jpg Oracle:For each color, return up to one target card of that color from your graveyard to your hand. Exile All Suns' Dawn. diff --git a/forge-gui/res/cardsfolder/a/alliance_of_arms.txt b/forge-gui/res/cardsfolder/a/alliance_of_arms.txt index be710d6f4bf..f5039266c68 100644 --- a/forge-gui/res/cardsfolder/a/alliance_of_arms.txt +++ b/forge-gui/res/cardsfolder/a/alliance_of_arms.txt @@ -8,6 +8,6 @@ SVar:DBToken:DB$ Token | TokenAmount$ JoinForcesAmount | TokenName$ Soldier | To SVar:DBReset:DB$ StoreSVar | SVar$ JoinForcesAmount | Type$ Number | Expression$ 0 | References$ JoinForcesAmount SVar:X:Count$ChosenNumber SVar:JoinForcesAmount:Number$0 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/alliance_of_arms.jpg Oracle:Join forces — Starting with you, each player may pay any amount of mana. Each player creates X 1/1 white Soldier creature tokens, where X is the total amount of mana paid this way. diff --git a/forge-gui/res/cardsfolder/a/allied_strategies.txt b/forge-gui/res/cardsfolder/a/allied_strategies.txt index 985c8823b02..e229205e51c 100644 --- a/forge-gui/res/cardsfolder/a/allied_strategies.txt +++ b/forge-gui/res/cardsfolder/a/allied_strategies.txt @@ -3,6 +3,6 @@ ManaCost:4 U Types:Sorcery A:SP$ Draw | Cost$ 4 U | NumCards$ X | ValidTgts$ Player | TgtPrompt$ Select target player | References$ X | SpellDescription$ Domain — Target player draws a card for each basic land type among lands they control. SVar:X:TargetedPlayer$DomainPlayer -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://resources.wizards.com/magic/cards/ps/en-us/card26383.jpg Oracle:Domain — Target player draws a card for each basic land type among lands they control. diff --git a/forge-gui/res/cardsfolder/a/alluring_scent.txt b/forge-gui/res/cardsfolder/a/alluring_scent.txt index 0939fa5afb1..05e47008931 100644 --- a/forge-gui/res/cardsfolder/a/alluring_scent.txt +++ b/forge-gui/res/cardsfolder/a/alluring_scent.txt @@ -2,6 +2,6 @@ Name:Alluring Scent ManaCost:1 G G Types:Sorcery A:SP$ Pump | Cost$ 1 G G | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN All creatures able to block CARDNAME do so. | SpellDescription$ All creatures able to block target creature this turn do so. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal/alluring_scent.jpg Oracle:All creatures able to block target creature this turn do so. diff --git a/forge-gui/res/cardsfolder/a/alluring_siren.txt b/forge-gui/res/cardsfolder/a/alluring_siren.txt index 15b7abcc3da..adb7204344e 100644 --- a/forge-gui/res/cardsfolder/a/alluring_siren.txt +++ b/forge-gui/res/cardsfolder/a/alluring_siren.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Creature Siren PT:1/1 A:AB$ MustAttack | Cost$ T | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls. | Defender$ You | ThisTurn$ True | SpellDescription$ Target creature an opponent controls attacks you this turn if able. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/alluring_siren.jpg Oracle:{T}: Target creature an opponent controls attacks you this turn if able. diff --git a/forge-gui/res/cardsfolder/a/ally_encampment.txt b/forge-gui/res/cardsfolder/a/ally_encampment.txt index fbf56ff4793..e54a5261014 100644 --- a/forge-gui/res/cardsfolder/a/ally_encampment.txt +++ b/forge-gui/res/cardsfolder/a/ally_encampment.txt @@ -4,7 +4,7 @@ Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ T | Produced$ Any | Amount$ 1 | RestrictValid$ Ally | SpellDescription$ Add one mana of any color. Spend this mana only to cast an Ally spell. A:AB$ ChangeZone | Cost$ 1 T Sac<1/CARDNAME> | ValidTgts$ Ally.YouCtrl | TgtPrompt$ Select target Ally you control | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target Ally you control to its owner's hand. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHas:Ability$Mana.Colorless DeckHints:Type$Ally SVar:Picture:http://www.wizards.com/global/images/magic/general/ally_encampment.jpg diff --git a/forge-gui/res/cardsfolder/a/alpha_brawl.txt b/forge-gui/res/cardsfolder/a/alpha_brawl.txt index 195030ae338..257eb8de773 100644 --- a/forge-gui/res/cardsfolder/a/alpha_brawl.txt +++ b/forge-gui/res/cardsfolder/a/alpha_brawl.txt @@ -8,6 +8,6 @@ SVar:SucksToBeAlpha:DB$ EachDamage | ValidCards$ Creature.OppCtrl+IsNotRemembere SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$CardPower SVar:Y:Remembered$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/alpha_brawl.jpg Oracle:Target creature an opponent controls deals damage equal to its power to each other creature that player controls, then each of those creatures deals damage equal to its power to that creature. diff --git a/forge-gui/res/cardsfolder/a/alpha_kavu.txt b/forge-gui/res/cardsfolder/a/alpha_kavu.txt index ecd08634508..88098939a8e 100644 --- a/forge-gui/res/cardsfolder/a/alpha_kavu.txt +++ b/forge-gui/res/cardsfolder/a/alpha_kavu.txt @@ -3,6 +3,6 @@ ManaCost:2 G Types:Creature Kavu PT:2/2 A:AB$ Pump | Cost$ 1 G | NumAtt$ -1 | NumDef$ +1 | ValidTgts$ Creature.Kavu | TgtPrompt$ Select target Kavu creature | SpellDescription$ Target Kavu creature gets -1/+1 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/alpha_kavu.jpg Oracle:{1}{G}: Target Kavu creature gets -1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/a/alpha_status.txt b/forge-gui/res/cardsfolder/a/alpha_status.txt index 2886f04a139..ce21c5d8478 100644 --- a/forge-gui/res/cardsfolder/a/alpha_status.txt +++ b/forge-gui/res/cardsfolder/a/alpha_status.txt @@ -6,6 +6,6 @@ A:SP$ Attach | Cost$ 2 G | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ AffectedX | AddToughness$ AffectedX | References$ AffectedX | EffectZone$ Battlefield | Description$ Enchanted creature gets +2/+2 for each other creature on the battlefield that shares a creature type with it. SVar:AffectedX:Count$Valid Creature.sharesCreatureTypeWith+Other/Times.2 SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/alpha_status.jpg Oracle:Enchant creature\nEnchanted creature gets +2/+2 for each other creature on the battlefield that shares a creature type with it. diff --git a/forge-gui/res/cardsfolder/a/altar_golem.txt b/forge-gui/res/cardsfolder/a/altar_golem.txt index f44977cb8be..cdabda619f4 100644 --- a/forge-gui/res/cardsfolder/a/altar_golem.txt +++ b/forge-gui/res/cardsfolder/a/altar_golem.txt @@ -8,7 +8,7 @@ S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ SVar:X:Count$Valid Creature A:AB$ Untap | Cost$ tapXType<5/Creature> | SpellDescription$ Untap CARDNAME. SVar:BuffedBy:Creature -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NoZeroToughnessAI:True SVar:Picture:http://www.wizards.com/global/images/magic/general/altar_golem.jpg Oracle:Trample\nAltar Golem's power and toughness are each equal to the number of creatures on the battlefield.\nAltar Golem doesn't untap during your untap step.\nTap five untapped creatures you control: Untap Altar Golem. diff --git a/forge-gui/res/cardsfolder/a/altar_of_dementia.txt b/forge-gui/res/cardsfolder/a/altar_of_dementia.txt index 809eda7d6b2..fe531020fd7 100644 --- a/forge-gui/res/cardsfolder/a/altar_of_dementia.txt +++ b/forge-gui/res/cardsfolder/a/altar_of_dementia.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ Mill | Cost$ Sac<1/Creature> | NumCards$ X | ValidTgts$ Player | TgtPrompt$ Choose a player | References$ X | SpellDescription$ Target player puts a number of cards equal to the sacrificed creature's power from the top of their library into their graveyard. SVar:X:Sacrificed$CardPower SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/altar_of_dementia.jpg Oracle:Sacrifice a creature: Target player puts a number of cards equal to the sacrificed creature's power from the top of their library into their graveyard. diff --git a/forge-gui/res/cardsfolder/a/altar_of_the_lost.txt b/forge-gui/res/cardsfolder/a/altar_of_the_lost.txt index ead6575f25a..ec133f347f0 100644 --- a/forge-gui/res/cardsfolder/a/altar_of_the_lost.txt +++ b/forge-gui/res/cardsfolder/a/altar_of_the_lost.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact K:CARDNAME enters the battlefield tapped. A:AB$ Mana | Cost$ T | Produced$ Combo Any | Amount$ 2 | RestrictValid$ Card.wasCastFromGraveyard+withFlashback | SpellDescription$ Add two mana in any combination of colors. Spend this mana only to cast spells with flashback from a graveyard. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/altar_of_the_lost.jpg Oracle:Altar of the Lost enters the battlefield tapped.\n{T}: Add two mana in any combination of colors. Spend this mana only to cast spells with flashback from a graveyard. diff --git a/forge-gui/res/cardsfolder/a/alter_reality.txt b/forge-gui/res/cardsfolder/a/alter_reality.txt index 309a7c02897..a92c3837097 100644 --- a/forge-gui/res/cardsfolder/a/alter_reality.txt +++ b/forge-gui/res/cardsfolder/a/alter_reality.txt @@ -3,7 +3,7 @@ ManaCost:1 U Types:Instant K:Flashback:1 U A:SP$ ChangeText | Cost$ 1 U | ValidTgts$ Card | TgtZone$ Stack,Battlefield | TgtPrompt$ Choose target spell or permanent | Permanent$ True | ChangeColorWord$ Choose Choose | SpellDescription$ Change the text of target spell or permanent by replacing all instances of one color word with another. (This effect lasts indefinitely.) -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/alter_reality.jpg Oracle:Change the text of target spell or permanent by replacing all instances of one color word with another. (This effect lasts indefinitely.)\nFlashback {1}{U} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/a/aluren.txt b/forge-gui/res/cardsfolder/a/aluren.txt index b9c72ae248d..f9cfc20e157 100644 --- a/forge-gui/res/cardsfolder/a/aluren.txt +++ b/forge-gui/res/cardsfolder/a/aluren.txt @@ -3,6 +3,6 @@ ManaCost:2 G G Types:Enchantment S:Mode$ Continuous | Affected$ Creature.cmcLE3+nonToken | MayPlay$ True | MayPlayCardOwner$ True | MayPlayWithoutManaCost$ True | MayPlayWithFlash$ True | MayPlayDontGrantZonePermissions$ True | AffectedZone$ Hand,Graveyard,Library,Exile | Description$ Any player may cast creature spells with converted mana cost 3 or less without paying their mana cost and as though they had flash. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/aluren.jpg Oracle:Any player may cast creature spells with converted mana cost 3 or less without paying their mana cost and as though they had flash. diff --git a/forge-gui/res/cardsfolder/a/amber_prison.txt b/forge-gui/res/cardsfolder/a/amber_prison.txt index 8570a045044..d4cbaae476f 100644 --- a/forge-gui/res/cardsfolder/a/amber_prison.txt +++ b/forge-gui/res/cardsfolder/a/amber_prison.txt @@ -6,6 +6,6 @@ A:AB$ Tap | Cost$ 4 T | ValidTgts$ Artifact,Creature,Land | TgtPrompt$ Select ta S:Mode$ Continuous | Affected$ Card.IsRemembered | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. T:Mode$ Untaps | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ ClearRemembered | Static$ True SVar:ClearRemembered:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/amber_prison.jpg Oracle:You may choose not to untap Amber Prison during your untap step.\n{4}, {T}: Tap target artifact, creature, or land. That permanent doesn't untap during its controller's untap step for as long as Amber Prison remains tapped. diff --git a/forge-gui/res/cardsfolder/a/amoeboid_changeling.txt b/forge-gui/res/cardsfolder/a/amoeboid_changeling.txt index 8efc90984c4..ccff951ec48 100644 --- a/forge-gui/res/cardsfolder/a/amoeboid_changeling.txt +++ b/forge-gui/res/cardsfolder/a/amoeboid_changeling.txt @@ -5,6 +5,6 @@ PT:1/1 K:Changeling A:AB$ Animate | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | Types$ AllCreatureTypes | SpellDescription$ Target creature gains all creature types until end of turn. A:AB$ Animate | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | Types$ Creature | RemoveCreatureTypes$ True | IsCurse$ True | SpellDescription$ Target creature loses all creature types until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/amoeboid_changeling.jpg Oracle:Changeling (This card is every creature type.)\n{T}: Target creature gains all creature types until end of turn.\n{T}: Target creature loses all creature types until end of turn. diff --git a/forge-gui/res/cardsfolder/a/amok.txt b/forge-gui/res/cardsfolder/a/amok.txt index 5d54d7e60e6..5db0ef8ab02 100644 --- a/forge-gui/res/cardsfolder/a/amok.txt +++ b/forge-gui/res/cardsfolder/a/amok.txt @@ -3,6 +3,6 @@ ManaCost:1 R Types:Enchantment A:AB$ PutCounter | Cost$ 1 Discard<1/Random> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/amok.jpg Oracle:{1}, Discard a card at random: Put a +1/+1 counter on target creature. diff --git a/forge-gui/res/cardsfolder/a/amulet_of_quoz.txt b/forge-gui/res/cardsfolder/a/amulet_of_quoz.txt index 7a3694a9d42..62438265e31 100644 --- a/forge-gui/res/cardsfolder/a/amulet_of_quoz.txt +++ b/forge-gui/res/cardsfolder/a/amulet_of_quoz.txt @@ -7,7 +7,7 @@ SVar:DBFlip:DB$ FlipACoin | Caller$ You | WinSubAbility$ OppLoseGame | LoseSubAb SVar:OppLoseGame:DB$ LosesGame | Defined$ Targeted SVar:YouLoseGame:DB$ LosesGame | Defined$ You SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/amulet_of_quoz.jpg Oracle:Remove Amulet of Quoz from your deck before playing if you're not playing for ante.\n{T}, Sacrifice Amulet of Quoz: Target opponent may ante the top card of their library. If they don't, you flip a coin. If you win the flip, that player loses the game. If you lose the flip, you lose the game. Activate this ability only during your upkeep. diff --git a/forge-gui/res/cardsfolder/a/an_havva_township.txt b/forge-gui/res/cardsfolder/a/an_havva_township.txt index 3e961c9194d..7ae8df3147c 100644 --- a/forge-gui/res/cardsfolder/a/an_havva_township.txt +++ b/forge-gui/res/cardsfolder/a/an_havva_township.txt @@ -5,6 +5,6 @@ A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ 1 T | Produced$ G | SpellDescription$ Add {G}. A:AB$ Mana | Cost$ 2 T | Produced$ W | SpellDescription$ Add {W}. A:AB$ Mana | Cost$ 2 T | Produced$ R | SpellDescription$ Add {R}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/an_havva_township.jpg Oracle:{T}: Add {C}.\n{1}, {T}: Add {G}.\n{2}, {T}: Add {R} or {W}. diff --git a/forge-gui/res/cardsfolder/a/an_zerrin_ruins.txt b/forge-gui/res/cardsfolder/a/an_zerrin_ruins.txt index d2e2516dc95..715b311ccf8 100644 --- a/forge-gui/res/cardsfolder/a/an_zerrin_ruins.txt +++ b/forge-gui/res/cardsfolder/a/an_zerrin_ruins.txt @@ -4,6 +4,6 @@ Types:Enchantment K:ETBReplacement:Other:ChooseCT SVar:ChooseCT:DB$ ChooseType | Defined$ You | Type$ Creature | AILogic$ MostProminentOppControls | SpellDescription$ As CARDNAME enters the battlefield, choose a creature type. S:Mode$ Continuous | Affected$ Creature.ChosenType | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Creatures of the chosen type don't untap during their controllers' untap steps. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/an_zerrin_ruins.jpg Oracle:As An-Zerrin Ruins enters the battlefield, choose a creature type.\nCreatures of the chosen type don't untap during their controllers' untap steps. diff --git a/forge-gui/res/cardsfolder/a/ana_sanctuary.txt b/forge-gui/res/cardsfolder/a/ana_sanctuary.txt index 18bfa06854f..203e9529b3c 100644 --- a/forge-gui/res/cardsfolder/a/ana_sanctuary.txt +++ b/forge-gui/res/cardsfolder/a/ana_sanctuary.txt @@ -7,6 +7,6 @@ SVar:DBPump:DB$ Pump | Defined$ Targeted | NumAtt$ 5 | NumDef$ 5 | ConditionChec SVar:Y:Count$Valid Permanent.Blue+YouCtrl/LimitMax.1 SVar:Z:Count$Valid Permanent.Black+YouCtrl/LimitMax.1 SVar:X:SVar$Y/Plus.Z -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ana_sanctuary.jpg Oracle:At the beginning of your upkeep, if you control a blue or black permanent, target creature gets +1/+1 until end of turn. If you control a blue permanent and a black permanent, that creature gets +5/+5 until end of turn instead. diff --git a/forge-gui/res/cardsfolder/a/anaba_ancestor.txt b/forge-gui/res/cardsfolder/a/anaba_ancestor.txt index 4b88c89b640..ae1da241231 100644 --- a/forge-gui/res/cardsfolder/a/anaba_ancestor.txt +++ b/forge-gui/res/cardsfolder/a/anaba_ancestor.txt @@ -3,6 +3,6 @@ ManaCost:1 R Types:Creature Minotaur Spirit PT:1/1 A:AB$ Pump | Cost$ T | NumAtt$ 1 | NumDef$ 1 | ValidTgts$ Creature.Minotaur+Other | TgtPrompt$ Select another target Minotaur creature | SpellDescription$ Another target Minotaur creature gets +1/+1 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/anaba_ancestor.jpg Oracle:{T}: Another target Minotaur creature gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/a/anarchy.txt b/forge-gui/res/cardsfolder/a/anarchy.txt index cf0bad626b5..7a3c76c6c5f 100644 --- a/forge-gui/res/cardsfolder/a/anarchy.txt +++ b/forge-gui/res/cardsfolder/a/anarchy.txt @@ -2,6 +2,6 @@ Name:Anarchy ManaCost:2 R R Types:Sorcery A:SP$ DestroyAll | Cost$ 2 R R | ValidCards$ Permanent.White | SpellDescription$ Destroy all white permanents. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/anarchy.jpg Oracle:Destroy all white permanents. diff --git a/forge-gui/res/cardsfolder/a/anavolver.txt b/forge-gui/res/cardsfolder/a/anavolver.txt index 838ec0bbf3a..222a902b199 100644 --- a/forge-gui/res/cardsfolder/a/anavolver.txt +++ b/forge-gui/res/cardsfolder/a/anavolver.txt @@ -10,7 +10,7 @@ SVar:VolverLaunch:DB$ Animate | Defined$ Self | Keywords$ Flying | Permanent$ Tr SVar:VolverPumped:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | ETB$ True | SubAbility$ VolverResilience | SpellDescription$ If CARDNAME was kicked with its {B} kicker, it enters the battlefield with a +1/+1 counter on it and with "Pay 3 life: Regenerate CARDNAME." SVar:VolverResilience:DB$ Animate | Defined$ Self | Abilities$ ABRegen | Permanent$ True SVar:ABRegen:AB$Regenerate | Cost$ PayLife<3> | SpellDescription$ Regenerate CARDNAME. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Blue|Black DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/anavolver.jpg diff --git a/forge-gui/res/cardsfolder/a/ancestors_prophet.txt b/forge-gui/res/cardsfolder/a/ancestors_prophet.txt index b046edef1b9..ddcdc3e422d 100644 --- a/forge-gui/res/cardsfolder/a/ancestors_prophet.txt +++ b/forge-gui/res/cardsfolder/a/ancestors_prophet.txt @@ -3,6 +3,6 @@ ManaCost:4 W Types:Creature Human Cleric PT:1/5 A:AB$ GainLife | Cost$ tapXType<5/Cleric> | LifeAmount$ 10 | SpellDescription$ You gain 10 life. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ancestors_prophet.jpg Oracle:Tap five untapped Clerics you control: You gain 10 life. diff --git a/forge-gui/res/cardsfolder/a/ancestral_knowledge.txt b/forge-gui/res/cardsfolder/a/ancestral_knowledge.txt index 6002c51363d..c8c5169c345 100644 --- a/forge-gui/res/cardsfolder/a/ancestral_knowledge.txt +++ b/forge-gui/res/cardsfolder/a/ancestral_knowledge.txt @@ -6,6 +6,6 @@ T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefi SVar:TrigDig:DB$ Dig | DigNum$ 10 | AnyNumber$ True | DestinationZone$ Exile | DestinationZone2$ Library | LibraryPosition2$ 0 T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Any | Execute$ TrigShuffle | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME leaves the battlefield, shuffle your library. SVar:TrigShuffle:DB$ Shuffle | Defined$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ancestral_knowledge.jpg Oracle:Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nWhen Ancestral Knowledge enters the battlefield, look at the top ten cards of your library, then exile any number of them and put the rest back on top of your library in any order.\nWhen Ancestral Knowledge leaves the battlefield, shuffle your library. diff --git a/forge-gui/res/cardsfolder/a/ancestral_mask.txt b/forge-gui/res/cardsfolder/a/ancestral_mask.txt index 6c081cc6205..40276525cb1 100644 --- a/forge-gui/res/cardsfolder/a/ancestral_mask.txt +++ b/forge-gui/res/cardsfolder/a/ancestral_mask.txt @@ -5,7 +5,7 @@ K:Enchant creature A:SP$ Attach | Cost$ 2 G | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ X | AddToughness$ X | Description$ Enchanted creature gets +2/+2 for each other enchantment on the battlefield. SVar:X:Count$Valid Enchantment.Other/Times.2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:BuffedBy:Enchantment SVar:Picture:http://www.wizards.com/global/images/magic/general/ancestral_mask.jpg Oracle:Enchant creature\nEnchanted creature gets +2/+2 for each other enchantment on the battlefield. diff --git a/forge-gui/res/cardsfolder/a/ancient_runes.txt b/forge-gui/res/cardsfolder/a/ancient_runes.txt index b1ca56a8c27..c14039fcac4 100644 --- a/forge-gui/res/cardsfolder/a/ancient_runes.txt +++ b/forge-gui/res/cardsfolder/a/ancient_runes.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each player's upkeep, CARDNAME deals damage to that player equal to the number of artifacts they control. SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredPlayer | NumDmg$ X | References$ X SVar:X:Count$Valid Artifact.ActivePlayerCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ancient_runes.jpg Oracle:At the beginning of each player's upkeep, Ancient Runes deals damage to that player equal to the number of artifacts they control. diff --git a/forge-gui/res/cardsfolder/a/ancient_spring.txt b/forge-gui/res/cardsfolder/a/ancient_spring.txt index 6921725a074..38f51e4d25e 100644 --- a/forge-gui/res/cardsfolder/a/ancient_spring.txt +++ b/forge-gui/res/cardsfolder/a/ancient_spring.txt @@ -4,6 +4,6 @@ Types:Land K:CARDNAME enters the battlefield tapped. A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ W B | SpellDescription$ Add {W}{B}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ancient_spring.jpg Oracle:Ancient Spring enters the battlefield tapped.\n{T}: Add {U}.\n{T}, Sacrifice Ancient Spring: Add {W}{B}. diff --git a/forge-gui/res/cardsfolder/a/ancient_tomb.txt b/forge-gui/res/cardsfolder/a/ancient_tomb.txt index a1e3911edc3..1924cfbfde6 100644 --- a/forge-gui/res/cardsfolder/a/ancient_tomb.txt +++ b/forge-gui/res/cardsfolder/a/ancient_tomb.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | Amount$ 2 | SubAbility$ DBPain | SpellDescription$ Add {C}{C}. CARDNAME deals 2 damage to you. SVar:DBPain:DB$ DealDamage | NumDmg$ 2 | Defined$ You -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ancient_tomb.jpg Oracle:{T}: Add {C}{C}. Ancient Tomb deals 2 damage to you. diff --git a/forge-gui/res/cardsfolder/a/angel_of_salvation.txt b/forge-gui/res/cardsfolder/a/angel_of_salvation.txt index 5f770aaa2e6..4ab3f0a62ee 100644 --- a/forge-gui/res/cardsfolder/a/angel_of_salvation.txt +++ b/forge-gui/res/cardsfolder/a/angel_of_salvation.txt @@ -7,7 +7,7 @@ K:Convoke K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ AngelicSalvation | TriggerDescription$ When CARDNAME enters the battlefield, prevent the next 5 damage that would be dealt this turn to any number of targets, divided as you choose. SVar:AngelicSalvation:DB$ PreventDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select targets to prevent damage to | Amount$ 5 | TargetMin$ 1 | TargetMax$ 5 | DividedAsYouChoose$ 5 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:AmbushAI:True SVar:Picture:http://www.wizards.com/global/images/magic/general/angel_of_salvation.jpg Oracle:Flash; convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nFlying\nWhen Angel of Salvation enters the battlefield, prevent the next 5 damage that would be dealt this turn to any number of targets, divided as you choose. diff --git a/forge-gui/res/cardsfolder/a/angelic_accord.txt b/forge-gui/res/cardsfolder/a/angelic_accord.txt index e0105f42b4a..4cbafd02821 100644 --- a/forge-gui/res/cardsfolder/a/angelic_accord.txt +++ b/forge-gui/res/cardsfolder/a/angelic_accord.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | CheckSVar$ YouLifeGained | SVarCompare$ GE4 | Execute$ TrigToken | TriggerDescription$ At the beginning of each end step, if you gained 4 or more life this turn, create a 4/4 white Angel creature token with flying. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenName$ Angel | TokenTypes$ Creature,Angel | TokenOwner$ You | TokenColors$ White | TokenPower$ 4 | TokenToughness$ 4 | TokenImage$ w 4 4 angel m14 | TokenKeywords$ Flying SVar:YouLifeGained:Count$LifeYouGainedThisTurn -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/angelic_accord.jpg Oracle:At the beginning of each end step, if you gained 4 or more life this turn, create a 4/4 white Angel creature token with flying. diff --git a/forge-gui/res/cardsfolder/a/angelic_favor.txt b/forge-gui/res/cardsfolder/a/angelic_favor.txt index 230f4b25814..87ee0873ad7 100644 --- a/forge-gui/res/cardsfolder/a/angelic_favor.txt +++ b/forge-gui/res/cardsfolder/a/angelic_favor.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Token | Cost$ 3 W | TokenAmount$ 1 | TokenName$ Angel | TokenTypes$ Creature,Angel | TokenOwner$ You | TokenColors$ White | TokenPower$ 4 | TokenToughness$ 4 | TokenKeywords$ Flying | TokenSVars$ AngelicFavorEOT | AtEOT$ Exile | ActivationPhases$ BeginCombat->EndCombat | SpellDescription$ Cast CARDNAME only during combat. Create a 4/4 white Angel creature token with flying. Exile it at the beginning of the next end step. SVar:AngelicFavorEOT:SVar:EndOfTurnLeavePlay:True SVar:AltCost:Cost$ tapXType<1/Creature> | IsPresent$ Plains.YouCtrl | Description$ If you control a Plains, you may tap an untapped creature you control rather than pay CARDNAME's mana cost. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/angelic_favor.jpg Oracle:If you control a Plains, you may tap an untapped creature you control rather than pay this spell's mana cost.\nCast this spell only during combat.\nCreate a 4/4 white Angel creature token with flying. Exile it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/a/angelic_field_marshal.txt b/forge-gui/res/cardsfolder/a/angelic_field_marshal.txt index f19f12ccc75..e1d6383d4bc 100644 --- a/forge-gui/res/cardsfolder/a/angelic_field_marshal.txt +++ b/forge-gui/res/cardsfolder/a/angelic_field_marshal.txt @@ -7,6 +7,6 @@ S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddKeyword$ Vigilance | CheckS S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 2 | AddToughness$ 2 | CheckSVar$ X | SVarCompare$ GE1 SVar:X:Count$Valid Card.IsCommander+YouOwn+YouCtrl SVar:BuffedBy:Card.IsCommander -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/angelic_field_marshal.jpg Oracle:Flying\nLieutenant — As long as you control your commander, Angelic Field Marshal gets +2/+2 and creatures you control have vigilance. diff --git a/forge-gui/res/cardsfolder/a/angelic_voices.txt b/forge-gui/res/cardsfolder/a/angelic_voices.txt index 9e4aa76d671..4e3d866ae71 100644 --- a/forge-gui/res/cardsfolder/a/angelic_voices.txt +++ b/forge-gui/res/cardsfolder/a/angelic_voices.txt @@ -4,6 +4,6 @@ Types:Enchantment S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddPower$ 1 | AddToughness$ 1 | CheckSVar$ X | SVarCompare$ EQ0 | Description$ Creatures you control get +1/+1 as long as you control no nonartifact, nonwhite creatures. SVar:X:Count$Valid Creature.nonWhite+nonArtifact+YouCtrl SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/angelic_voices.jpg Oracle:Creatures you control get +1/+1 as long as you control no nonartifact, nonwhite creatures. diff --git a/forge-gui/res/cardsfolder/a/angels_feather.txt b/forge-gui/res/cardsfolder/a/angels_feather.txt index 925b3ac12e5..83ff758d5f2 100644 --- a/forge-gui/res/cardsfolder/a/angels_feather.txt +++ b/forge-gui/res/cardsfolder/a/angels_feather.txt @@ -3,7 +3,7 @@ ManaCost:2 Types:Artifact T:Mode$ SpellCast | ValidCard$ Card.White | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever a player casts a white spell, you may gain 1 life. SVar:TrigGainLife:DB$GainLife | LifeAmount$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$white SVar:Picture:http://www.wizards.com/global/images/magic/general/angels_feather.jpg Oracle:Whenever a player casts a white spell, you may gain 1 life. diff --git a/forge-gui/res/cardsfolder/a/angels_trumpet.txt b/forge-gui/res/cardsfolder/a/angels_trumpet.txt index fbf99c0b5d3..4e4483321fe 100644 --- a/forge-gui/res/cardsfolder/a/angels_trumpet.txt +++ b/forge-gui/res/cardsfolder/a/angels_trumpet.txt @@ -7,7 +7,7 @@ SVar:TrigTapAll:DB$ TapAll | ValidCards$ Creature.untapped+notAttackedThisTurn+A SVar:DBDamage:DB$ DealDamage | Defined$ TriggeredPlayer | NumDmg$ AngelDamage | SubAbility$ DBCleanup | References$ AngelDamage SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:AngelDamage:Remembered$Amount -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/angels_trumpet.jpg Oracle:All creatures have vigilance.\nAt the beginning of each player's end step, tap all untapped creatures that player controls that didn't attack this turn. Angel's Trumpet deals damage to the player equal to the number of creatures tapped this way. diff --git a/forge-gui/res/cardsfolder/a/angraths_marauders.txt b/forge-gui/res/cardsfolder/a/angraths_marauders.txt index 3c26c8cf667..a4e1c0d5d12 100644 --- a/forge-gui/res/cardsfolder/a/angraths_marauders.txt +++ b/forge-gui/res/cardsfolder/a/angraths_marauders.txt @@ -6,6 +6,6 @@ R:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Card.YouCtrl,Emble SVar:DmgTwice:DB$ ReplaceEffect | VarName$ DamageAmount | VarValue$ X | References$ X SVar:X:ReplaceCount$DamageAmount/Twice SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://media.wizards.com/2017/xln/en_2S0d70qzYk.png Oracle:If a source you control would deal damage to a permanent or player, it deals double that damage to that permanent or player instead. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/a/angry_mob.txt b/forge-gui/res/cardsfolder/a/angry_mob.txt index 4e83aa6c05e..64633992e2a 100644 --- a/forge-gui/res/cardsfolder/a/angry_mob.txt +++ b/forge-gui/res/cardsfolder/a/angry_mob.txt @@ -6,6 +6,6 @@ K:Trample S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Condition$ PlayerTurn | Description$ As long as it's your turn, CARDNAME's power and toughness are each equal to 2 plus the number of Swamps your opponents control. As long as it's not your turn, CARDNAME's power and toughness are each 2. SVar:X:Count$Valid Swamp.OppCtrl/Plus.2 S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ 2 | SetToughness$ 2 | Condition$ NotPlayerTurn -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/angry_mob.jpg Oracle:Trample\nAs long as it's your turn, Angry Mob's power and toughness are each equal to 2 plus the number of Swamps your opponents control. As long as it's not your turn, Angry Mob's power and toughness are each 2. diff --git a/forge-gui/res/cardsfolder/a/animal_boneyard.txt b/forge-gui/res/cardsfolder/a/animal_boneyard.txt index 2c36338414b..a1238a97318 100644 --- a/forge-gui/res/cardsfolder/a/animal_boneyard.txt +++ b/forge-gui/res/cardsfolder/a/animal_boneyard.txt @@ -6,7 +6,7 @@ A:SP$ Attach | Cost$ 2 W | ValidTgts$ Land | AILogic$ Pump S:Mode$ Continuous | Affected$ Land.AttachedBy | AddAbility$ GainLife | AddSVar$ AnimalBoneyardX | Description$ Enchanted land has "{T}, Sacrifice a creature: You gain life equal to the sacrificed creature's toughness." SVar:GainLife:AB$GainLife | Cost$ T Sac<1/Creature> | LifeAmount$ AnimalBoneyardX | SpellDescription$ You gain life equal to the sacrificed creature's toughness. SVar:AnimalBoneyardX:Sacrificed$CardToughness -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingAttachEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/animal_boneyard.jpg Oracle:Enchant land\nEnchanted land has "{T}, Sacrifice a creature: You gain life equal to the sacrificed creature's toughness." diff --git a/forge-gui/res/cardsfolder/a/animate_artifact.txt b/forge-gui/res/cardsfolder/a/animate_artifact.txt index 0ea47e3a68d..dffb229150f 100644 --- a/forge-gui/res/cardsfolder/a/animate_artifact.txt +++ b/forge-gui/res/cardsfolder/a/animate_artifact.txt @@ -5,6 +5,6 @@ K:Enchant artifact A:SP$ Attach | Cost$ 3 U | ValidTgts$ Artifact | AITgts$ Card.nonCreature | AILogic$ Animate S:Mode$ Continuous | Affected$ Card.AttachedBy+nonCreature | SetPower$ AffectedX | SetToughness$ AffectedX | AddType$ Creature | Description$ As long as enchanted artifact isn't a creature, it's an artifact creature with power and toughness each equal to its converted mana cost. SVar:AffectedX:Count$CardManaCost -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/animate_artifact.jpg Oracle:Enchant artifact\nAs long as enchanted artifact isn't a creature, it's an artifact creature with power and toughness each equal to its converted mana cost. diff --git a/forge-gui/res/cardsfolder/a/animate_wall.txt b/forge-gui/res/cardsfolder/a/animate_wall.txt index 98fcc807834..a1238c824a6 100644 --- a/forge-gui/res/cardsfolder/a/animate_wall.txt +++ b/forge-gui/res/cardsfolder/a/animate_wall.txt @@ -4,6 +4,6 @@ Types:Enchantment Aura K:Enchant Wall A:SP$ Attach | Cost$ W | ValidTgts$ Wall | AILogic$ Pump S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddHiddenKeyword$ CARDNAME can attack as though it didn't have defender. | Description$ Enchanted Wall can attack as though it didn't have defender. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/animate_wall.jpg Oracle:Enchant Wall\nEnchanted Wall can attack as though it didn't have defender. diff --git a/forge-gui/res/cardsfolder/a/animation_module.txt b/forge-gui/res/cardsfolder/a/animation_module.txt index 6aeeff42267..6f01e85cc5e 100644 --- a/forge-gui/res/cardsfolder/a/animation_module.txt +++ b/forge-gui/res/cardsfolder/a/animation_module.txt @@ -5,6 +5,6 @@ T:Mode$ CounterAddedOnce | ValidCard$ Permanent.YouCtrl | TriggerZones$ Battlefi SVar:TrigToken:AB$ Token | Cost$ 1 | TokenAmount$ 1 | TokenName$ Servo | TokenTypes$ Artifact,Creature,Servo | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | TokenImage$ c 1 1 servo | TokenAltImages$ c_1_1_servo2,c_1_1_servo3 A:AB$ PutCounter | Cost$ 3 T | ValidTgts$ Permanent,Player | TgtPrompt$ Select target player or permanent | CounterType$ ExistingCounter | CounterNum$ 1 | AILogic$ AlwaysAtOppEOT | SpellDescription$ Choose a counter on target permanent or player. Give that permanent or player another counter of that kind. DeckHints:Ability$Counters -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/animation_module.jpg Oracle:Whenever one or more +1/+1 counters are put on a permanent you control, you may pay {1}. If you do, create a 1/1 colorless Servo artifact creature token.\n{3}, {T}: Choose a counter on target permanent or player. Give that permanent or player another counter of that kind. diff --git a/forge-gui/res/cardsfolder/a/ankh_of_mishra.txt b/forge-gui/res/cardsfolder/a/ankh_of_mishra.txt index b6fb8b48b98..dee53db055d 100644 --- a/forge-gui/res/cardsfolder/a/ankh_of_mishra.txt +++ b/forge-gui/res/cardsfolder/a/ankh_of_mishra.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a land enters the battlefield, CARDNAME deals 2 damage to that land's controller. SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredCardController | NumDmg$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ankh_of_mishra.jpg Oracle:Whenever a land enters the battlefield, Ankh of Mishra deals 2 damage to that land's controller. diff --git a/forge-gui/res/cardsfolder/a/antagonism.txt b/forge-gui/res/cardsfolder/a/antagonism.txt index ea6714b98b7..320746404e0 100644 --- a/forge-gui/res/cardsfolder/a/antagonism.txt +++ b/forge-gui/res/cardsfolder/a/antagonism.txt @@ -6,6 +6,6 @@ SVar:TeaseYou:DB$ DealDamage | Defined$ TriggeredPlayer | NumDmg$ 2 | ConditionC SVar:AntagonismX:TriggeredPlayer$DamageToOppsThisTurn SVar:Check:PlayerCountOpponents$DamageToOppsThisTurn SVar:NeedsToPlayVar:Check GE1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/antagonism.jpg Oracle:At the beginning of each player's end step, Antagonism deals 2 damage to that player unless one of their opponents was dealt damage this turn. diff --git a/forge-gui/res/cardsfolder/a/anthroplasm.txt b/forge-gui/res/cardsfolder/a/anthroplasm.txt index 45d06fb285c..6041e3c11df 100644 --- a/forge-gui/res/cardsfolder/a/anthroplasm.txt +++ b/forge-gui/res/cardsfolder/a/anthroplasm.txt @@ -7,6 +7,6 @@ A:AB$ RemoveCounter | Cost$ X T | CounterType$ P1P1 | CounterNum$ All | SpellDes SVar:DBPutCounter:DB$PutCounter | CounterType$ P1P1 | CounterNum$ X | References$ X SVar:X:Count$xPaid SVar:All:Count$CardCounters.P1P1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/anthroplasm.jpg Oracle:Anthroplasm enters the battlefield with two +1/+1 counters on it.\n{X}, {T}: Remove all +1/+1 counters from Anthroplasm and put X +1/+1 counters on it. diff --git a/forge-gui/res/cardsfolder/a/anticipate.txt b/forge-gui/res/cardsfolder/a/anticipate.txt index 89c17863a88..daadaf5edce 100644 --- a/forge-gui/res/cardsfolder/a/anticipate.txt +++ b/forge-gui/res/cardsfolder/a/anticipate.txt @@ -2,6 +2,6 @@ Name:Anticipate ManaCost:1 U Types:Instant A:SP$ Dig | Cost$ 1 U | DigNum$ 3 | ChangeNum$ 1 | SpellDescription$ Look at the top three cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/anticipate.jpg Oracle:Look at the top three cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order. diff --git a/forge-gui/res/cardsfolder/a/anurid_brushhopper.txt b/forge-gui/res/cardsfolder/a/anurid_brushhopper.txt index 64066866d0c..bb143f8090c 100644 --- a/forge-gui/res/cardsfolder/a/anurid_brushhopper.txt +++ b/forge-gui/res/cardsfolder/a/anurid_brushhopper.txt @@ -5,6 +5,6 @@ PT:3/4 A:AB$ ChangeZone | Cost$ Discard<2/Card> | Defined$ Self | Origin$ Battlefield | Destination$ Exile | SubAbility$ DelTrig | SpellDescription$ Exile CARDNAME. Return it to the battlefield under its owner's control at the beginning of the next end step. SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | TriggerDescription$ Return CARDNAME to the battlefield. SVar:TrigReturn:DB$ ChangeZone | Origin$ Exile | Destination$ Battlefield | Defined$ Self -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/anurid_brushhopper.jpg Oracle:Discard two cards: Exile Anurid Brushhopper. Return it to the battlefield under its owner's control at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/a/anvil_of_bogardan.txt b/forge-gui/res/cardsfolder/a/anvil_of_bogardan.txt index bbb4f57da46..a6763a2381d 100644 --- a/forge-gui/res/cardsfolder/a/anvil_of_bogardan.txt +++ b/forge-gui/res/cardsfolder/a/anvil_of_bogardan.txt @@ -5,6 +5,6 @@ S:Mode$ Continuous | Affected$ Player | SetMaxHandSize$ Unlimited | Description$ T:Mode$ Phase | Phase$ Draw | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ At the beginning of each player's draw step, that player draws an additional card, then discards a card. SVar:TrigDraw:DB$ Draw | NumCards$ 1 | Defined$ TriggeredPlayer | SubAbility$ DBDiscard SVar:DBDiscard:DB$ Discard | Defined$ TriggeredPlayer | NumCards$ 1 | Mode$ TgtChoose -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/anvil_of_bogardan.jpg Oracle:Players have no maximum hand size.\nAt the beginning of each player's draw step, that player draws an additional card, then discards a card. diff --git a/forge-gui/res/cardsfolder/a/aphetto_alchemist.txt b/forge-gui/res/cardsfolder/a/aphetto_alchemist.txt index 2121267a92e..a7ab724ab46 100644 --- a/forge-gui/res/cardsfolder/a/aphetto_alchemist.txt +++ b/forge-gui/res/cardsfolder/a/aphetto_alchemist.txt @@ -4,6 +4,6 @@ Types:Creature Human Wizard PT:1/2 K:Morph:U A:AB$ Untap | Cost$ T | ValidTgts$ Artifact,Creature | TgtPrompt$ Select target artifact or creature | SpellDescription$ Untap target artifact or creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/aphetto_alchemist.jpg Oracle:{T}: Untap target artifact or creature.\nMorph {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.) diff --git a/forge-gui/res/cardsfolder/a/aphetto_dredging.txt b/forge-gui/res/cardsfolder/a/aphetto_dredging.txt index 0a0b47f1a80..5fa54264fc4 100644 --- a/forge-gui/res/cardsfolder/a/aphetto_dredging.txt +++ b/forge-gui/res/cardsfolder/a/aphetto_dredging.txt @@ -2,6 +2,6 @@ Name:Aphetto Dredging ManaCost:3 B Types:Sorcery A:SP$ ChangeZone | Cost$ 3 B | AnnounceType$ CreatureType | ValidTgts$ Creature.YouCtrl+ChosenType | TargetMin$ 0 | TargetMax$ 3 | AILogic$ MostProminentInComputerGraveyard | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target creature card with the chosen type in your graveyard | SpellDescription$ Return up to three target creature cards of the creature type of your choice from your graveyard to your hand. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/aphetto_dredging.jpg Oracle:Return up to three target creature cards of the creature type of your choice from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/a/aphetto_grifter.txt b/forge-gui/res/cardsfolder/a/aphetto_grifter.txt index 27473874851..8200f9e3be2 100644 --- a/forge-gui/res/cardsfolder/a/aphetto_grifter.txt +++ b/forge-gui/res/cardsfolder/a/aphetto_grifter.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Creature Human Wizard PT:1/1 A:AB$ Tap | Cost$ tapXType<2/Wizard> | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | SpellDescription$ Tap target permanent. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/aphetto_grifter.jpg Oracle:Tap two untapped Wizards you control: Tap target permanent. diff --git a/forge-gui/res/cardsfolder/a/apocalypse.txt b/forge-gui/res/cardsfolder/a/apocalypse.txt index 72d316362fb..dad467d2d72 100644 --- a/forge-gui/res/cardsfolder/a/apocalypse.txt +++ b/forge-gui/res/cardsfolder/a/apocalypse.txt @@ -3,6 +3,6 @@ ManaCost:2 R R R Types:Sorcery A:SP$ ChangeZoneAll | Cost$ 2 R R R | ChangeType$ Permanent | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBDiscard | SpellDescription$ Exile all permanents. You discard your hand. SVar:DBDiscard:DB$ Discard | Mode$ Hand -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/apocalypse.jpg Oracle:Exile all permanents. You discard your hand. diff --git a/forge-gui/res/cardsfolder/a/apocalypse_chime.txt b/forge-gui/res/cardsfolder/a/apocalypse_chime.txt index f6b8fad525d..6c886485ebf 100644 --- a/forge-gui/res/cardsfolder/a/apocalypse_chime.txt +++ b/forge-gui/res/cardsfolder/a/apocalypse_chime.txt @@ -2,6 +2,6 @@ Name:Apocalypse Chime ManaCost:2 Types:Artifact A:AB$DestroyAll | Cost$ 2 T Sac<1/CARDNAME> | ValidCards$ Permanent.nonToken+setHML | NoRegen$ True | SpellDescription$ Destroy all nontoken permanents with a name originally printed in the Homelands expansion. They can't be regenerated. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/apocalypse_chime.jpg Oracle:{2}, {T}, Sacrifice Apocalypse Chime: Destroy all nontoken permanents with a name originally printed in the Homelands expansion. They can't be regenerated. diff --git a/forge-gui/res/cardsfolder/a/aquamoeba.txt b/forge-gui/res/cardsfolder/a/aquamoeba.txt index 43b05591896..3683b13fbe7 100644 --- a/forge-gui/res/cardsfolder/a/aquamoeba.txt +++ b/forge-gui/res/cardsfolder/a/aquamoeba.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Creature Elemental Beast PT:1/3 A:AB$ Pump | Cost$ Discard<1/Card> | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch CARDNAME's power and toughness until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/aquamoeba.jpg Oracle:Discard a card: Switch Aquamoeba's power and toughness until end of turn. diff --git a/forge-gui/res/cardsfolder/a/aquitects_will.txt b/forge-gui/res/cardsfolder/a/aquitects_will.txt index 3c3ac9f356b..1d0074cbc4c 100644 --- a/forge-gui/res/cardsfolder/a/aquitects_will.txt +++ b/forge-gui/res/cardsfolder/a/aquitects_will.txt @@ -5,7 +5,7 @@ A:SP$ PutCounter | Cost$ U | ValidTgts$ Land | TgtPrompt$ Select target land | R SVar:DBAnimate:DB$ Animate | Defined$ ParentTarget | staticAbilities$ AnimateIsland | Permanent$ True | SubAbility$ DBDraw SVar:AnimateIsland:Mode$ Continuous | EffectZone$ Battlefield | Affected$ Card.Self+counters_GE1_FLOOD | AddType$ Island SVar:DBDraw:DB$ Draw | NumCards$ 1 | ConditionPresent$ Merfolk.YouCtrl | ConditionCompare$ GE1 | ConditionDescription$ If you control a Merfolk, -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/aquitects_will.jpg Oracle:Put a flood counter on target land. That land is an Island in addition to its other types for as long as it has a flood counter on it. If you control a Merfolk, draw a card. diff --git a/forge-gui/res/cardsfolder/a/arcane_laboratory.txt b/forge-gui/res/cardsfolder/a/arcane_laboratory.txt index 3370eb206cc..978873cff31 100644 --- a/forge-gui/res/cardsfolder/a/arcane_laboratory.txt +++ b/forge-gui/res/cardsfolder/a/arcane_laboratory.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Enchantment S:Mode$ CantBeCast | ValidCard$ Card | Caster$ Player | NumLimitEachTurn$ 1 | Description$ Each player can't cast more than one spell each turn. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/arcane_laboratory.jpg Oracle:Each player can't cast more than one spell each turn. diff --git a/forge-gui/res/cardsfolder/a/arcane_lighthouse.txt b/forge-gui/res/cardsfolder/a/arcane_lighthouse.txt index 8f314aefae2..d9c5985f107 100644 --- a/forge-gui/res/cardsfolder/a/arcane_lighthouse.txt +++ b/forge-gui/res/cardsfolder/a/arcane_lighthouse.txt @@ -4,6 +4,6 @@ Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Effect | Cost$ 1 T | StaticAbilities$ STLoseAB | SpellDescription$ Until end of turn, creatures your opponents control lose hexproof and shroud and can't have hexproof or shroud. SVar:STLoseAB:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.OppCtrl | RemoveKeyword$ Hexproof & Shroud | AddHiddenKeyword$ CARDNAME can't have or gain Hexproof & CARDNAME can't have or gain Shroud | Description$ Until end of turn, creatures your opponents control lose hexproof and shroud and can't have hexproof or shroud. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/arcane_lighthouse.jpg Oracle:{T}: Add {C}.\n{1}, {T}: Until end of turn, creatures your opponents control lose hexproof and shroud and can't have hexproof or shroud. diff --git a/forge-gui/res/cardsfolder/a/arcane_melee.txt b/forge-gui/res/cardsfolder/a/arcane_melee.txt index 90190dcd66c..b2470bf38a9 100644 --- a/forge-gui/res/cardsfolder/a/arcane_melee.txt +++ b/forge-gui/res/cardsfolder/a/arcane_melee.txt @@ -2,6 +2,6 @@ Name:Arcane Melee ManaCost:4 U Types:Enchantment S:Mode$ ReduceCost | ValidCard$ Instant,Sorcery | Type$ Spell | Amount$ 2 | Description$ Instant and sorcery spells cost {2} less to cast. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/arcane_melee.jpg Oracle:Instant and sorcery spells cost {2} less to cast. diff --git a/forge-gui/res/cardsfolder/a/arcane_spyglass.txt b/forge-gui/res/cardsfolder/a/arcane_spyglass.txt index 9254991af42..87b2d265288 100644 --- a/forge-gui/res/cardsfolder/a/arcane_spyglass.txt +++ b/forge-gui/res/cardsfolder/a/arcane_spyglass.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ Draw | Cost$ 2 T Sac<1/Land> | NumCards$ 1 | SubAbility$ DBPutCounter | SpellDescription$ Draw a card and put a charge counter on CARDNAME. SVar:DBPutCounter:DB$PutCounter | Defined$ Self | CounterType$ CHARGE | CounterNum$ 1 A:AB$Draw | Cost$ SubCounter<3/CHARGE> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/arcane_spyglass.jpg Oracle:{2}, {T}, Sacrifice a land: Draw a card and put a charge counter on Arcane Spyglass.\nRemove three charge counters from Arcane Spyglass: Draw a card. diff --git a/forge-gui/res/cardsfolder/a/arcbond.txt b/forge-gui/res/cardsfolder/a/arcbond.txt index 69eb12352fd..4244b9e2909 100644 --- a/forge-gui/res/cardsfolder/a/arcbond.txt +++ b/forge-gui/res/cardsfolder/a/arcbond.txt @@ -7,6 +7,6 @@ SVar:DmgOther:DB$ DamageAll | ValidCards$ Creature.IsNotRemembered | ValidPlayer SVar:OutOfSight:Mode$ ChangesZone | TriggerZones$ Command | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.IsRemembered | Execute$ ExileSelf | Static$ True SVar:ExileSelf:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:X:TriggerCount$DamageAmount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/arcbond.jpg Oracle:Choose target creature. Whenever that creature is dealt damage this turn, it deals that much damage to each other creature and each player. diff --git a/forge-gui/res/cardsfolder/a/arcbound_reclaimer.txt b/forge-gui/res/cardsfolder/a/arcbound_reclaimer.txt index db77fbf2728..4e062a188f6 100644 --- a/forge-gui/res/cardsfolder/a/arcbound_reclaimer.txt +++ b/forge-gui/res/cardsfolder/a/arcbound_reclaimer.txt @@ -6,6 +6,6 @@ A:AB$ ChangeZone | Cost$ SubCounter<1/P1P1> | TgtPrompt$ Choose target artifact K:Modular:2 DeckHas:Ability$Counters SVar:BuffedBy:Artifact -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/arcbound_reclaimer.jpg Oracle:Remove a +1/+1 counter from Arcbound Reclaimer: Put target artifact card from your graveyard on top of your library.\nModular 2 (This enters the battlefield with two +1/+1 counters on it. When it dies, you may put its +1/+1 counters on target artifact creature.) diff --git a/forge-gui/res/cardsfolder/a/arcbound_wanderer.txt b/forge-gui/res/cardsfolder/a/arcbound_wanderer.txt index 01db8399880..43627ce7524 100644 --- a/forge-gui/res/cardsfolder/a/arcbound_wanderer.txt +++ b/forge-gui/res/cardsfolder/a/arcbound_wanderer.txt @@ -5,6 +5,6 @@ PT:0/0 K:Modular:Sunburst DeckHas:Ability$Counters DeckHints:Ability$Proliferate -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/arcbound_wanderer.jpg Oracle:Modular—Sunburst (This enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it. When it dies, you may put its +1/+1 counters on target artifact creature.) diff --git a/forge-gui/res/cardsfolder/a/archangel_of_strife.txt b/forge-gui/res/cardsfolder/a/archangel_of_strife.txt index bb295c3d84b..b3f1a4e17e0 100644 --- a/forge-gui/res/cardsfolder/a/archangel_of_strife.txt +++ b/forge-gui/res/cardsfolder/a/archangel_of_strife.txt @@ -10,6 +10,6 @@ SVar:WarChoice:DB$ Effect | Name$ Archangel War Effect | StaticAbilities$ WarPum SVar:PeaceChoice:DB$ Effect | Name$ Archangel Peace Effect | StaticAbilities$ PeacePump | SpellDescription$ Peace | EffectOwner$ Player.IsRemembered | Duration$ UntilHostLeavesPlay SVar:WarPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.YouCtrl | AddPower$ 3 | Description$ Creatures you control get +3/+0. SVar:PeacePump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.YouCtrl | AddToughness$ 3 | Description$ Creatures you control get +0/+3. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/archangel_of_strife.jpg Oracle:Flying\nAs Archangel of Strife enters the battlefield, each player chooses war or peace.\nCreatures controlled by players who chose war get +3/+0.\nCreatures controlled by players who chose peace get +0/+3. diff --git a/forge-gui/res/cardsfolder/a/archdemon_of_unx.txt b/forge-gui/res/cardsfolder/a/archdemon_of_unx.txt index b00d560890f..1146775b1b6 100644 --- a/forge-gui/res/cardsfolder/a/archdemon_of_unx.txt +++ b/forge-gui/res/cardsfolder/a/archdemon_of_unx.txt @@ -7,6 +7,6 @@ K:Trample T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ At the beginning of your upkeep, sacrifice a non-Zombie creature, then create a 2/2 black Zombie creature token. SVar:TrigSac:DB$ Sacrifice | Defined$ You | SacValid$ Creature.nonZombie | SacMessage$ non-Zombie Creature | SubAbility$ MakeToken SVar:MakeToken:DB$ Token | TokenName$ Zombie | TokenColors$ Black | TokenTypes$ Creature,Zombie | TokenPower$ 2 | TokenToughness$ 2 | TokenOwner$ You | TokenAmount$ 1 | TokenImage$ b 2 2 zombie ALA -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/archdemon_of_unx.jpg Oracle:Flying, trample\nAt the beginning of your upkeep, sacrifice a non-Zombie creature, then create a 2/2 black Zombie creature token. diff --git a/forge-gui/res/cardsfolder/a/architects_of_will.txt b/forge-gui/res/cardsfolder/a/architects_of_will.txt index 84562812ba0..7ff522fce1e 100644 --- a/forge-gui/res/cardsfolder/a/architects_of_will.txt +++ b/forge-gui/res/cardsfolder/a/architects_of_will.txt @@ -5,6 +5,6 @@ PT:3/3 K:Cycling:UB T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigRearrange | TriggerDescription$ When CARDNAME enters the battlefield, look at the top three cards of target player's library, then put them back in any order. SVar:TrigRearrange:DB$RearrangeTopOfLibrary | ValidTgts$ Player | TgtPrompt$ Choose target player. | NumCards$ 3 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/architects_of_will.jpg Oracle:When Architects of Will enters the battlefield, look at the top three cards of target player's library, then put them back in any order.\nCycling {U/B} ({U/B}, Discard this card: Draw a card.) diff --git a/forge-gui/res/cardsfolder/a/archmage_ascension.txt b/forge-gui/res/cardsfolder/a/archmage_ascension.txt index e55189f7be7..78062c35ba4 100644 --- a/forge-gui/res/cardsfolder/a/archmage_ascension.txt +++ b/forge-gui/res/cardsfolder/a/archmage_ascension.txt @@ -7,7 +7,7 @@ SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ QUEST | Counte SVar:Tutor:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ValidCard$ Card.YouOwn SVar:X:Count$YouDrewThisTurn #TODO: improve AI tutoring logic -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:MaxQuestEffect:6 SVar:Picture:http://www.wizards.com/global/images/magic/general/archmage_ascension.jpg Oracle:At the beginning of each end step, if you drew two or more cards this turn, you may put a quest counter on Archmage Ascension.\nAs long as Archmage Ascension has six or more quest counters on it, if you would draw a card, you may instead search your library for a card, put that card into your hand, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/a/archon_of_valors_reach.txt b/forge-gui/res/cardsfolder/a/archon_of_valors_reach.txt index 6cd4f46f2d3..62abf3d5f6b 100644 --- a/forge-gui/res/cardsfolder/a/archon_of_valors_reach.txt +++ b/forge-gui/res/cardsfolder/a/archon_of_valors_reach.txt @@ -8,6 +8,6 @@ K:Trample K:ETBReplacement:Other:ChooseT SVar:ChooseT:DB$ ChooseType | Type$ Card | ValidTypes$ Artifact,Enchantment,Instant,Sorcery,Planeswalker | SpellDescription$ As CARDNAME enters the battlefield, choose artifact, enchantment, instant, sorcery, or planeswalker. S:Mode$ CantBeCast | ValidCard$ Card.ChosenType | Description$ Players can't cast spells of the chosen type. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random Oracle:Flying, vigilance, trample\nAs Archon of Valor's Reach enters the battlefield, choose artifact, enchantment, instant, sorcery, or planeswalker.\nPlayers can't cast spells of the chosen type. diff --git a/forge-gui/res/cardsfolder/a/arctic_merfolk.txt b/forge-gui/res/cardsfolder/a/arctic_merfolk.txt index 3331642fc15..c5fb2a88b19 100644 --- a/forge-gui/res/cardsfolder/a/arctic_merfolk.txt +++ b/forge-gui/res/cardsfolder/a/arctic_merfolk.txt @@ -5,6 +5,6 @@ PT:1/1 K:Kicker:Return<1/Creature> K:etbCounter:P1P1:1:CheckSVar$ WasKicked:If CARDNAME was kicked, it enters the battlefield with a +1/+1 counter on it. SVar:WasKicked:Count$Kicked.1.0 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/arctic_merfolk.jpg Oracle:Kicker—Return a creature you control to its owner's hand. (You may return a creature you control to its owner's hand in addition to any other costs as you cast this spell.)\nIf Arctic Merfolk was kicked, it enters the battlefield with a +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/a/arcums_sleigh.txt b/forge-gui/res/cardsfolder/a/arcums_sleigh.txt index b95b7f0139a..4acaa233018 100644 --- a/forge-gui/res/cardsfolder/a/arcums_sleigh.txt +++ b/forge-gui/res/cardsfolder/a/arcums_sleigh.txt @@ -2,7 +2,7 @@ Name:Arcum's Sleigh ManaCost:1 Types:Artifact A:AB$ Pump | Cost$ 2 T | KW$ Vigilance | ValidTgts$ Creature | TgtPrompt$ Select target creature | IsPresent$ Land.Snow+DefenderCtrl | ActivationPhases$ BeginCombat->EndCombat | SpellDescription$ Target creature gains vigilance until end of turn. Activate this ability only during combat and only if defending player controls a snow land. -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/arcums_sleigh.jpg Oracle:{2}, {T}: Target creature gains vigilance until end of turn. Activate this ability only during combat and only if defending player controls a snow land. diff --git a/forge-gui/res/cardsfolder/a/arcums_weathervane.txt b/forge-gui/res/cardsfolder/a/arcums_weathervane.txt index 126533cfa6c..4288ebdb79e 100644 --- a/forge-gui/res/cardsfolder/a/arcums_weathervane.txt +++ b/forge-gui/res/cardsfolder/a/arcums_weathervane.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact A:AB$ Animate | Cost$ 2 T | ValidTgts$ Land.Snow | TgtPrompt$ Select target snow land | RemoveTypes$ Snow | Permanent$ True | SpellDescription$ Target snow land is no longer snow. A:AB$ Animate | Cost$ 2 T | ValidTgts$ Land.nonSnow | TgtPrompt$ Select target nonsnow land | Types$ Snow | Permanent$ True | SpellDescription$ Target nonsnow basic land becomes snow. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/arcums_weathervane.jpg Oracle:{2}, {T}: Target snow land is no longer snow.\n{2}, {T}: Target nonsnow basic land becomes snow. diff --git a/forge-gui/res/cardsfolder/a/arcums_whistle.txt b/forge-gui/res/cardsfolder/a/arcums_whistle.txt index d586cb22f9c..39b99afa1a2 100644 --- a/forge-gui/res/cardsfolder/a/arcums_whistle.txt +++ b/forge-gui/res/cardsfolder/a/arcums_whistle.txt @@ -5,6 +5,6 @@ A:AB$ Pump | Cost$ 3 T | ActivationPhases$ Upkeep->BeginCombat | ValidTgts$ Crea SVar:DestroyPacifist:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigDestroy | RememberObjects$ ParentTarget | TriggerDescription$ At the beginning of the end step, destroy that creature if it didn't attack this turn. SVar:TrigDestroy:DB$ Destroy | Defined$ DelayTriggerRemembered | ConditionDefined$ DelayTriggerRemembered | ConditionPresent$ Creature.notAttackedThisTurn | ConditionCompare$ GE1 SVar:X:Targeted$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/arcums_whistle.jpg Oracle:{3}, {T}: Choose target non-Wall creature the active player has controlled continuously since the beginning of the turn. That player may pay {X}, where X is that creature's converted mana cost. If they don't pay, the creature attacks this turn if able, and at the beginning of the next end step, destroy it if it didn't attack this turn. Activate this ability only before attackers are declared. diff --git a/forge-gui/res/cardsfolder/a/arena.txt b/forge-gui/res/cardsfolder/a/arena.txt index 316b1eddf4f..8972df98f89 100644 --- a/forge-gui/res/cardsfolder/a/arena.txt +++ b/forge-gui/res/cardsfolder/a/arena.txt @@ -5,6 +5,6 @@ A:AB$ Tap | Cost$ 3 T | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target c SVar:DBTap:DB$ Tap | TargetingPlayer$ Player.Opponent | TargetingPlayerControls$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature you control | SubAbility$ DBFight | AlwaysRemember$ True SVar:DBFight:DB$ Fight | Defined$ Remembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/arena.jpg Oracle:{3}, {T}: Tap target creature you control and target creature of an opponent's choice they control. Those creatures fight each other. (Each deals damage equal to its power to the other.) diff --git a/forge-gui/res/cardsfolder/a/arena_of_the_ancients.txt b/forge-gui/res/cardsfolder/a/arena_of_the_ancients.txt index 8170f9f98bf..997bb0bf7aa 100644 --- a/forge-gui/res/cardsfolder/a/arena_of_the_ancients.txt +++ b/forge-gui/res/cardsfolder/a/arena_of_the_ancients.txt @@ -5,6 +5,6 @@ S:Mode$ Continuous | Affected$ Creature.Legendary | AddHiddenKeyword$ CARDNAME d T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTapAll | TriggerDescription$ When CARDNAME enters the battlefield, tap all legendary creatures. SVar:TrigTapAll:DB$TapAll | ValidCards$ Creature.Legendary SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/arena_of_the_ancients.jpg Oracle:Legendary creatures don't untap during their controllers' untap steps.\nWhen Arena of the Ancients enters the battlefield, tap all legendary creatures. diff --git a/forge-gui/res/cardsfolder/a/arena_rector.txt b/forge-gui/res/cardsfolder/a/arena_rector.txt index 7033368ff34..7179ae4429b 100644 --- a/forge-gui/res/cardsfolder/a/arena_rector.txt +++ b/forge-gui/res/cardsfolder/a/arena_rector.txt @@ -6,6 +6,6 @@ T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ SVar:TrigExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | Defined$ TriggeredCard | SubAbility$ DBReturn SVar:DBReturn:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Planeswalker.YouOwn | ChangeNum$ 1 SVar:SacMe:4 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Planeswalker Oracle:When Arena Rector dies, you may exile it. If you do, search your library for a planeswalker card, put that card onto the battlefield, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/a/argent_mutation.txt b/forge-gui/res/cardsfolder/a/argent_mutation.txt index 550baae499a..aec8b317f80 100644 --- a/forge-gui/res/cardsfolder/a/argent_mutation.txt +++ b/forge-gui/res/cardsfolder/a/argent_mutation.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Instant A:SP$ Animate | Cost$ 2 U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Types$ Artifact | SubAbility$ DBDraw | SpellDescription$ Target permanent becomes an artifact in addition to its other types until end of turn. Draw a card. SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/argent_mutation.jpg Oracle:Target permanent becomes an artifact in addition to its other types until end of turn.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/a/argothian_enchantress.txt b/forge-gui/res/cardsfolder/a/argothian_enchantress.txt index 8366c752400..c5b3d3dea72 100644 --- a/forge-gui/res/cardsfolder/a/argothian_enchantress.txt +++ b/forge-gui/res/cardsfolder/a/argothian_enchantress.txt @@ -5,7 +5,7 @@ PT:0/1 K:Shroud T:Mode$ SpellCast | ValidCard$ Enchantment | ValidActivatingPlayer$ You | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast an enchantment spell, draw a card. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Enchantment SVar:Picture:http://www.wizards.com/global/images/magic/general/argothian_enchantress.jpg Oracle:Shroud (This creature can't be the target of spells or abilities.)\nWhenever you cast an enchantment spell, draw a card. diff --git a/forge-gui/res/cardsfolder/a/arguels_blood_fast_temple_of_aclazotz.txt b/forge-gui/res/cardsfolder/a/arguels_blood_fast_temple_of_aclazotz.txt index 5940c7af34b..9ff16ef3fbc 100644 --- a/forge-gui/res/cardsfolder/a/arguels_blood_fast_temple_of_aclazotz.txt +++ b/forge-gui/res/cardsfolder/a/arguels_blood_fast_temple_of_aclazotz.txt @@ -5,7 +5,7 @@ A:AB$ Draw | Cost$ 1 B PayLife<2> | NumCards$ 1 | SpellDescription$ Draw a card. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ DBTransform | LifeTotal$ You | LifeAmount$ LE5 | TriggerDescription$ At the beginning of your upkeep, if you have 5 or less life, you may transform CARDNAME. SVar:DBTransform:DB$ SetState | Defined$ Self | Mode$ Transform AlternateMode:DoubleFaced -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/arguels_blood_fast.jpg Oracle:{1}{B}, Pay 2 life: Draw a card.\nAt the beginning of your upkeep, if you have 5 or less life, you may transform Arguel's Blood Fast. diff --git a/forge-gui/res/cardsfolder/a/armageddon_clock.txt b/forge-gui/res/cardsfolder/a/armageddon_clock.txt index 16a7d1e968d..5ae083b0ebe 100644 --- a/forge-gui/res/cardsfolder/a/armageddon_clock.txt +++ b/forge-gui/res/cardsfolder/a/armageddon_clock.txt @@ -7,6 +7,6 @@ A:AB$ RemoveCounter | Cost$ 4 | CounterType$ DOOM | CounterNum$ 1 | ActivationPh SVar:TrigDealDamage:DB$DealDamage | Defined$ Player | NumDmg$ X | References$ X SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ DOOM | CounterNum$ 1 SVar:X:Count$CardCounters.DOOM -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/armageddon_clock.jpg Oracle:At the beginning of your upkeep, put a doom counter on Armageddon Clock.\nAt the beginning of your draw step, Armageddon Clock deals damage equal to the number of doom counters on it to each player.\n{4}: Remove a doom counter from Armageddon Clock. Any player may activate this ability but only during any upkeep step. diff --git a/forge-gui/res/cardsfolder/a/armed_response.txt b/forge-gui/res/cardsfolder/a/armed_response.txt index ebdece4e8f0..4a01878286e 100644 --- a/forge-gui/res/cardsfolder/a/armed_response.txt +++ b/forge-gui/res/cardsfolder/a/armed_response.txt @@ -3,6 +3,6 @@ ManaCost:2 W Types:Instant A:SP$ DealDamage | Cost$ 2 W | ValidTgts$ Creature.attacking | TgtPrompt$ Select target Creature | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals damage to target attacking creature equal to the number of Equipment you control. SVar:X:Count$Valid Equipment.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/armed_response.jpg Oracle:Armed Response deals damage to target attacking creature equal to the number of Equipment you control. diff --git a/forge-gui/res/cardsfolder/a/armor_of_thorns.txt b/forge-gui/res/cardsfolder/a/armor_of_thorns.txt index 4e05f46621a..b9d4936666a 100644 --- a/forge-gui/res/cardsfolder/a/armor_of_thorns.txt +++ b/forge-gui/res/cardsfolder/a/armor_of_thorns.txt @@ -5,6 +5,6 @@ K:MayFlashSac K:Enchant nonblack creature A:SP$ Attach | Cost$ 1 G | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 2 | AddToughness$ 2 | Description$ Enchanted creature gets +2/+2. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/armor_of_thorns.jpg Oracle:You may cast Armor of Thorns as though it had flash. If you cast it any time a sorcery couldn't have been cast, the controller of the permanent it becomes sacrifices it at the beginning of the next cleanup step.\nEnchant nonblack creature\nEnchanted creature gets +2/+2. diff --git a/forge-gui/res/cardsfolder/a/arnjlots_ascent.txt b/forge-gui/res/cardsfolder/a/arnjlots_ascent.txt index 18fd0dd3f5a..1cbe405439a 100644 --- a/forge-gui/res/cardsfolder/a/arnjlots_ascent.txt +++ b/forge-gui/res/cardsfolder/a/arnjlots_ascent.txt @@ -5,6 +5,6 @@ K:Cumulative upkeep:U A:AB$ Pump | Cost$ 1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying | SpellDescription$ Target creature gains flying until end of turn. SVar:NonStackingEffect:True SVar:NeedsToPlay:Creature.YouCtrl+withoutFlying -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/arnjlots_ascent.jpg Oracle:Cumulative upkeep {U} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\n{1}: Target creature gains flying until end of turn. diff --git a/forge-gui/res/cardsfolder/a/arsenal_thresher.txt b/forge-gui/res/cardsfolder/a/arsenal_thresher.txt index 0955dcced72..1ed3faebb83 100644 --- a/forge-gui/res/cardsfolder/a/arsenal_thresher.txt +++ b/forge-gui/res/cardsfolder/a/arsenal_thresher.txt @@ -7,6 +7,6 @@ SVar:DBReveal:DB$ Reveal | RevealValid$ Card.Artifact+YouCtrl | AnyNumber$ True SVar:DBPutCounters:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/arsenal_thresher.jpg Oracle:As Arsenal Thresher enters the battlefield, you may reveal any number of other artifact cards from your hand. Arsenal Thresher enters the battlefield with a +1/+1 counter on it for each card revealed this way. diff --git a/forge-gui/res/cardsfolder/a/artifact_possession.txt b/forge-gui/res/cardsfolder/a/artifact_possession.txt index eacfbd2e4e9..f7c4e014c8c 100644 --- a/forge-gui/res/cardsfolder/a/artifact_possession.txt +++ b/forge-gui/res/cardsfolder/a/artifact_possession.txt @@ -6,6 +6,6 @@ A:SP$ Attach | Cost$ 2 B | ValidTgts$ Artifact | AILogic$ Curse T:Mode$ Taps | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever enchanted artifact becomes tapped or a player activates an ability of enchanted artifact without {T} in its activation cost, CARDNAME deals 2 damage to that artifact's controller. T:Mode$ AbilityCast | NonTapCost$ True | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigDamage | Secondary$ True | TriggerDescription$ Whenever an artifact becomes tapped or a player activates an artifact's ability without {T} in its activation cost, CARDNAME deals 1 damage to that artifact's controller. SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredCardController | NumDmg$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/artifact_possession.jpg Oracle:Enchant artifact\nWhenever enchanted artifact becomes tapped or a player activates an ability of enchanted artifact without {T} in its activation cost, Artifact Possession deals 2 damage to that artifact's controller. diff --git a/forge-gui/res/cardsfolder/a/artificers_hex.txt b/forge-gui/res/cardsfolder/a/artificers_hex.txt index a2c3d9584e3..867a022fc3c 100644 --- a/forge-gui/res/cardsfolder/a/artificers_hex.txt +++ b/forge-gui/res/cardsfolder/a/artificers_hex.txt @@ -7,6 +7,6 @@ S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddSVar$ SVarDontEquip T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Card.EnchantedBy+AttachedTo Creature | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ At the beginning of your upkeep, if enchanted Equipment is attached to a creature, destroy that creature. SVar:TrigDestroy:DB$ Destroy | Defined$ Valid Card.EquippedByEnchanted SVar:SVarDontEquip:SVar:DontEquip:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/artificers_hex.jpg Oracle:Enchant Equipment\nAt the beginning of your upkeep, if enchanted Equipment is attached to a creature, destroy that creature. diff --git a/forge-gui/res/cardsfolder/a/artificers_intuition.txt b/forge-gui/res/cardsfolder/a/artificers_intuition.txt index 74cfc10d6f1..ff32dfd3025 100644 --- a/forge-gui/res/cardsfolder/a/artificers_intuition.txt +++ b/forge-gui/res/cardsfolder/a/artificers_intuition.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Enchantment A:AB$ ChangeZone | Cost$ U Discard<1/Artifact> | Origin$ Library | Destination$ Hand | ChangeType$ Artifact.cmcLE1 | ChangeNum$ 1 | SpellDescription$ Search your library for an artifact card with converted mana cost 1 or less, reveal that card, and put it into your hand. Then shuffle your library. SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/artificers_intuition.jpg Oracle:{U}, Discard an artifact card: Search your library for an artifact card with converted mana cost 1 or less, reveal that card, and put it into your hand. Then shuffle your library. diff --git a/forge-gui/res/cardsfolder/a/artillerize.txt b/forge-gui/res/cardsfolder/a/artillerize.txt index 8e42599fa7f..45732abb4c4 100644 --- a/forge-gui/res/cardsfolder/a/artillerize.txt +++ b/forge-gui/res/cardsfolder/a/artillerize.txt @@ -2,6 +2,6 @@ Name:Artillerize ManaCost:3 R Types:Instant A:SP$ DealDamage | Cost$ 3 R Sac<1/Artifact;Creature/artifact or creature> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 5 | SpellDescription$ CARDNAME deals 5 damage to any target. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/artillerize.jpg Oracle:As an additional cost to cast this spell, sacrifice an artifact or creature.\nArtillerize deals 5 damage to any target. diff --git a/forge-gui/res/cardsfolder/a/artisan_of_forms.txt b/forge-gui/res/cardsfolder/a/artisan_of_forms.txt index dd18a306a46..1263e6df041 100644 --- a/forge-gui/res/cardsfolder/a/artisan_of_forms.txt +++ b/forge-gui/res/cardsfolder/a/artisan_of_forms.txt @@ -4,6 +4,6 @@ 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. SVar:TrigArtisanCopy:DB$ Clone | ValidTgts$ Creature | TgtPrompt$ Select target creature to copy | Optional$ True | GainThisAbility$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All 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. diff --git a/forge-gui/res/cardsfolder/a/arvad_the_cursed.txt b/forge-gui/res/cardsfolder/a/arvad_the_cursed.txt index a62066548a1..05ba188a3ef 100644 --- a/forge-gui/res/cardsfolder/a/arvad_the_cursed.txt +++ b/forge-gui/res/cardsfolder/a/arvad_the_cursed.txt @@ -5,7 +5,7 @@ PT:3/3 K:Deathtouch K:Lifelink S:Mode$ Continuous | Affected$ Creature.Legendary+Other+YouCtrl | AddPower$ 2 | AddToughness$ 2 | Description$ Other legendary creatures you control get +2/+2. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:PlayMain1:TRUE DeckHints:Type$Legendary SVar:Picture:http://www.wizards.com/global/images/magic/general/arvad_the_cursed.jpg diff --git a/forge-gui/res/cardsfolder/a/ashes_of_the_fallen.txt b/forge-gui/res/cardsfolder/a/ashes_of_the_fallen.txt index 5c3c643cd33..17f383bed06 100644 --- a/forge-gui/res/cardsfolder/a/ashes_of_the_fallen.txt +++ b/forge-gui/res/cardsfolder/a/ashes_of_the_fallen.txt @@ -4,6 +4,6 @@ Types:Artifact K:ETBReplacement:Other:ChooseCT SVar:ChooseCT:DB$ ChooseType | Defined$ You | Type$ Creature | AILogic$ MostProminentInComputerDeck | SpellDescription$ As CARDNAME enters the battlefield, choose a creature type. S:Mode$ Continuous | Affected$ Creature.YouOwn | AffectedZone$ Graveyard | AddType$ ChosenType | Description$ Each creature card in your graveyard has the chosen creature type in addition to its other types. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ashes_of_the_fallen.jpg Oracle:As Ashes of the Fallen enters the battlefield, choose a creature type.\nEach creature card in your graveyard has the chosen creature type in addition to its other types. diff --git a/forge-gui/res/cardsfolder/a/ashling_the_pilgrim.txt b/forge-gui/res/cardsfolder/a/ashling_the_pilgrim.txt index 79a56066239..98f5b5d3863 100644 --- a/forge-gui/res/cardsfolder/a/ashling_the_pilgrim.txt +++ b/forge-gui/res/cardsfolder/a/ashling_the_pilgrim.txt @@ -12,6 +12,6 @@ SVar:X:Count$RememberedSize T:Mode$ Phase | Phase$ Cleanup | Execute$ TrigReset | Static$ True T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigReset | Static$ True SVar:TrigReset:DB$ StoreSVar | SVar$ AshlingNum | Type$ Number | Expression$ 0 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ashling_the_pilgrim.jpg Oracle:{1}{R}: Put a +1/+1 counter on Ashling the Pilgrim. If this is the third time this ability has resolved this turn, remove all +1/+1 counters from Ashling the Pilgrim, and it deals that much damage to each creature and each player. diff --git a/forge-gui/res/cardsfolder/a/ashlings_prerogative.txt b/forge-gui/res/cardsfolder/a/ashlings_prerogative.txt index 941f7ad7a20..acc6955dbd7 100644 --- a/forge-gui/res/cardsfolder/a/ashlings_prerogative.txt +++ b/forge-gui/res/cardsfolder/a/ashlings_prerogative.txt @@ -10,6 +10,6 @@ S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ Chosen:EVEN | Check S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ Chosen:ODD | CheckSVar$ X | SVarCompare$ EQ1 SVar:X:Count$ChosenNumber SVar:Y:Number$ChosenNumber/Plus.1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ashlings_prerogative.jpg Oracle:As Ashling's Prerogative enters the battlefield, choose odd or even. (Zero is even.)\nEach creature with converted mana cost of the chosen value has haste.\nEach creature without converted mana cost of the chosen value enters the battlefield tapped. diff --git a/forge-gui/res/cardsfolder/a/ashnods_altar.txt b/forge-gui/res/cardsfolder/a/ashnods_altar.txt index b40b1d27aed..ca2385633cd 100644 --- a/forge-gui/res/cardsfolder/a/ashnods_altar.txt +++ b/forge-gui/res/cardsfolder/a/ashnods_altar.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ Sac<1/Creature> | Produced$ C | Amount$ 2 | SpellDescription$ Add {C}{C}. SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ashnods_altar.jpg Oracle:Sacrifice a creature: Add {C}{C}. diff --git a/forge-gui/res/cardsfolder/a/ashnods_cylix.txt b/forge-gui/res/cardsfolder/a/ashnods_cylix.txt index 536fc6d0297..b999af4d0c9 100644 --- a/forge-gui/res/cardsfolder/a/ashnods_cylix.txt +++ b/forge-gui/res/cardsfolder/a/ashnods_cylix.txt @@ -2,6 +2,6 @@ Name:Ashnod's Cylix ManaCost:2 Types:Artifact A:AB$ Dig | Cost$ 3 T | ValidTgts$ Player | TgtPrompt$ Select target player | DigNum$ 3 | ChangeNum$ 1 | Choser$ Targeted | DestinationZone$ Library | LibraryPosition$ 0 | DestinationZone2$ Exile | SpellDescription$ Target player looks at the top three cards of their library, puts one of them back on top of their library, then exiles the rest. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ashnods_cylix.jpg Oracle:{3}, {T}: Target player looks at the top three cards of their library, puts one of them back on top of their library, then exiles the rest. diff --git a/forge-gui/res/cardsfolder/a/assault_suit.txt b/forge-gui/res/cardsfolder/a/assault_suit.txt index 01dbeb17386..a09974fd09a 100644 --- a/forge-gui/res/cardsfolder/a/assault_suit.txt +++ b/forge-gui/res/cardsfolder/a/assault_suit.txt @@ -8,6 +8,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | TriggerZones$ Battlefiel SVar:TrigGainControl:DB$ GainControl | Defined$ Equipped | NewController$ TriggeredPlayer | LoseControl$ EOT | RememberControlled$ True | SubAbility$ DBUntap SVar:DBUntap:DB$ Untap | Defined$ Equipped | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ GE1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/assault_suit.jpg Oracle:Equipped creature gets +2/+2, has haste, can't attack you or a planeswalker you control, and can't be sacrificed.\nAt the beginning of each opponent's upkeep, you may have that player gain control of equipped creature until end of turn. If you do, untap it.\nEquip {3} diff --git a/forge-gui/res/cardsfolder/a/assembly_hall.txt b/forge-gui/res/cardsfolder/a/assembly_hall.txt index b2adf07c033..4dd07611993 100644 --- a/forge-gui/res/cardsfolder/a/assembly_hall.txt +++ b/forge-gui/res/cardsfolder/a/assembly_hall.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ Reveal | Cost$ 4 T | Defined$ You | RevealValid$ Creature | RememberRevealed$ True | SubAbility$ DBChangeZone | SpellDescription$ Reveal a creature card in your hand. Search your library for a card with the same name as that card, reveal it, put it into your hand, then shuffle your library. SVar:DBChangeZone:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Remembered.sameName | ChangeNum$ 1 | SubAbility$ DBCleanup | StackDescription$ Search your library for a permanent card with the same name as the revealed creature and put it into your hand. Then shuffle your library. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/assembly_hall.jpg Oracle:{4}, {T}: Reveal a creature card in your hand. Search your library for a card with the same name as that card, reveal it, put it into your hand, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/a/astral_slide.txt b/forge-gui/res/cardsfolder/a/astral_slide.txt index 7495f12c32f..5b936f67ada 100644 --- a/forge-gui/res/cardsfolder/a/astral_slide.txt +++ b/forge-gui/res/cardsfolder/a/astral_slide.txt @@ -6,6 +6,6 @@ SVar:TrigExile:DB$ ChangeZone | ValidTgts$ Creature | TgtPrompt$ Select target c SVar:DelTrigEffect:DB$ DelayedTrigger | Mode$ Phase | Phase$ End Of Turn | Execute$ TrigReturn | RememberObjects$ Remembered | TriggerDescription$ Return the exiled card to the battlefield under its owner's control at the beginning of the next end step. | SubAbility$ DBCleanup | AILogic$ Always SVar:TrigReturn:DB$ ChangeZone | Defined$ DelayTriggerRemembered | Origin$ Exile | Destination$ Battlefield SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/astral_slide.jpg Oracle:Whenever a player cycles a card, you may exile target creature. If you do, return that card to the battlefield under its owner's control at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/a/astrolabe.txt b/forge-gui/res/cardsfolder/a/astrolabe.txt index bcef685f3cc..ecf0ac50136 100644 --- a/forge-gui/res/cardsfolder/a/astrolabe.txt +++ b/forge-gui/res/cardsfolder/a/astrolabe.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ Any | Amount$ 2 | SubAbility$ DelTrigSlowtrip | SpellDescription$ Add two mana of any one color. Draw a card at the beginning of the next turn's upkeep. SVar:DelTrigSlowtrip:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ DrawSlowtrip | TriggerDescription$ Draw a card at the beginning of the next turn's upkeep. SVar:DrawSlowtrip:DB$ Draw | NumCards$ 1 | Defined$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/astrolabe.jpg Oracle:{1}, {T}, Sacrifice Astrolabe: Add two mana of any one color. Draw a card at the beginning of the next turn's upkeep. diff --git a/forge-gui/res/cardsfolder/a/atalya_samite_master.txt b/forge-gui/res/cardsfolder/a/atalya_samite_master.txt index 6f9bb31568a..f192c256dfb 100644 --- a/forge-gui/res/cardsfolder/a/atalya_samite_master.txt +++ b/forge-gui/res/cardsfolder/a/atalya_samite_master.txt @@ -6,6 +6,6 @@ A:AB$ Charm | Cost$ X T | XColor$ W | Choices$ PreventDamage,GainLife | CharmNum SVar:PreventDamage:DB$ PreventDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | Amount$ X | References$ X | SpellDescription$ Prevent the next X damage that would be dealt to target creature or player this turn. SVar:GainLife:DB$ GainLife | LifeAmount$ X | Defined$ You | References$ X | SpellDescription$ You gain X life. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/atalya_samite_master.jpg Oracle:{X}, {T}: Choose one —\n• Prevent the next X damage that would be dealt to target creature this turn. Spend only white mana on X.\n• You gain X life. Spend only white mana on X. diff --git a/forge-gui/res/cardsfolder/a/atarka_monument.txt b/forge-gui/res/cardsfolder/a/atarka_monument.txt index 0945055b4a1..326f890eade 100644 --- a/forge-gui/res/cardsfolder/a/atarka_monument.txt +++ b/forge-gui/res/cardsfolder/a/atarka_monument.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. A:AB$ Animate | Cost$ 4 R G | Defined$ Self | Power$ 4 | Toughness$ 4 | Types$ Artifact,Creature,Dragon | Colors$ Red,Green | Keywords$ Flying | SpellDescription$ CARDNAME becomes a 4/4 red and green Dragon artifact creature with flying until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Red|Green SVar:Picture:http://www.wizards.com/global/images/magic/general/atarka_monument.jpg Oracle:{T}: Add {R} or {G}.\n{4}{R}{G}: Atarka Monument becomes a 4/4 red and green Dragon artifact creature with flying until end of turn. diff --git a/forge-gui/res/cardsfolder/a/attunement.txt b/forge-gui/res/cardsfolder/a/attunement.txt index b7b20a61688..fcac0d84206 100644 --- a/forge-gui/res/cardsfolder/a/attunement.txt +++ b/forge-gui/res/cardsfolder/a/attunement.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Enchantment A:AB$ Draw | Cost$ Return<1/CARDNAME> | NumCards$ 3 | SpellDescription$ Draw three cards, then discard four cards. | SubAbility$ DB SVar:DB:DB$ Discard | NumCards$ 4 | Mode$ TgtChoose -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/attunement.jpg Oracle:Return Attunement to its owner's hand: Draw three cards, then discard four cards. diff --git a/forge-gui/res/cardsfolder/a/aura_barbs.txt b/forge-gui/res/cardsfolder/a/aura_barbs.txt index 167c336c22f..2d101c2ba0c 100644 --- a/forge-gui/res/cardsfolder/a/aura_barbs.txt +++ b/forge-gui/res/cardsfolder/a/aura_barbs.txt @@ -3,7 +3,7 @@ ManaCost:2 R Types:Instant Arcane A:SP$ DealDamage | Cost$ 2 R | NumDmg$ 2 | DamageSource$ Valid Enchantment | Defined$ CardController | RelativeTarget$ True | SubAbility$ DBAuraDmg | StackDescription$ SpellDescription | SpellDescription$ Each enchantment deals 2 damage to its controller, then each Aura attached to a creature deals 2 damage to the creature it's attached to. SVar:DBAuraDmg:DB$ DealDamage | NumDmg$ 2 | DamageSource$ Valid Aura.AttachedTo Creature | Defined$ Enchanted | RelativeTarget$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/aura_barbs.jpg Oracle:Each enchantment deals 2 damage to its controller, then each Aura attached to a creature deals 2 damage to the creature it's attached to. diff --git a/forge-gui/res/cardsfolder/a/aura_finesse.txt b/forge-gui/res/cardsfolder/a/aura_finesse.txt index af23b802318..a070fa3a77e 100644 --- a/forge-gui/res/cardsfolder/a/aura_finesse.txt +++ b/forge-gui/res/cardsfolder/a/aura_finesse.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Pump | Cost$ U | ValidTgts$ Aura.YouCtrl | TgtPrompt$ Select target aura you control | SubAbility$ FinesseAttach | StackDescription$ None | SpellDescription$ Attach target Aura you control to target creature.Draw a card. SVar:FinesseAttach:DB$ Attach | Object$ ParentTarget | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | NumCards$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/aura_finesse.jpg Oracle:Attach target Aura you control to target creature.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/a/aura_flux.txt b/forge-gui/res/cardsfolder/a/aura_flux.txt index 77ccebf3ccc..21a4c8b4ebc 100644 --- a/forge-gui/res/cardsfolder/a/aura_flux.txt +++ b/forge-gui/res/cardsfolder/a/aura_flux.txt @@ -2,6 +2,6 @@ Name:Aura Flux ManaCost:2 U Types:Enchantment S:Mode$ Continuous | Affected$ Enchantment.Other | AddKeyword$ UpkeepCost:2 | Description$ Other enchantments have "At the beginning of your upkeep, sacrifice this enchantment unless you pay {2}." -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/aura_flux.jpg Oracle:Other enchantments have "At the beginning of your upkeep, sacrifice this enchantment unless you pay {2}." diff --git a/forge-gui/res/cardsfolder/a/aura_graft.txt b/forge-gui/res/cardsfolder/a/aura_graft.txt index f4728fe9e0a..43c5eee393b 100644 --- a/forge-gui/res/cardsfolder/a/aura_graft.txt +++ b/forge-gui/res/cardsfolder/a/aura_graft.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ GainControl | Cost$ 1 U | ValidTgts$ Aura.AttachedTo Permanent | TgtPrompt$ Select target Aura attached to a permanent | SubAbility$ ChooseNewHost | SpellDescription$ Gain control of target Aura that's attached to a permanent. Attach it to another permanent it can enchant. SVar:ChooseNewHost:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Permanent.CanBeEnchantedByTargeted+NotEnchantedByTargeted | ChoiceZone$ Battlefield | SubAbility$ ReEnchant | RememberChosen$ True | AILogic$ AtLeast1 | SVar:ReEnchant:DB$ Attach | Object$ ParentTarget | Defined$ Remembered -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/aura_graft.jpg Oracle:Gain control of target Aura that's attached to a permanent. Attach it to another permanent it can enchant. diff --git a/forge-gui/res/cardsfolder/a/auratouched_mage.txt b/forge-gui/res/cardsfolder/a/auratouched_mage.txt index 1842e7d36de..23deb88c70e 100644 --- a/forge-gui/res/cardsfolder/a/auratouched_mage.txt +++ b/forge-gui/res/cardsfolder/a/auratouched_mage.txt @@ -5,7 +5,7 @@ PT:3/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, search your library for an Aura card that could enchant it. If CARDNAME is still on the battlefield, put that Aura card onto the battlefield attached to it. Otherwise, reveal the Aura card and put it into your hand. Then shuffle your library. SVar:TrigChangeZone:DB$ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Aura.CanEnchantSource | AttachedTo$ Self | ConditionPresent$ Card.Self | SubAbility$ DBChangeZone SVar:DBChangeZone:DB$ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Aura.CanEnchantSource | ConditionPresent$ Card.Self | ConditionCompare$ LE0 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Aura SVar:Picture:http://www.wizards.com/global/images/magic/general/auratouched_mage.jpg Oracle:When Auratouched Mage enters the battlefield, search your library for an Aura card that could enchant it. If Auratouched Mage is still on the battlefield, put that Aura card onto the battlefield attached to it. Otherwise, reveal the Aura card and put it into your hand. Then shuffle your library. diff --git a/forge-gui/res/cardsfolder/a/auriok_siege_sled.txt b/forge-gui/res/cardsfolder/a/auriok_siege_sled.txt index c768edd27f6..8cd3d8b6d5b 100644 --- a/forge-gui/res/cardsfolder/a/auriok_siege_sled.txt +++ b/forge-gui/res/cardsfolder/a/auriok_siege_sled.txt @@ -4,6 +4,6 @@ Types:Artifact Creature Juggernaut PT:3/5 A:AB$ Pump | Cost$ 1 | ValidTgts$ Creature.Artifact | TgtPrompt$ Select target artifact creature that can't block this creature this turn | IsCurse$ True | KW$ HIDDEN CantBlockCardUIDSource | DefinedKW$ CardUIDSource | UntilHostLeavesPlayOrEOT$ True | StackDescription$ {c:Targeted} can't block CARDNAME this turn. | SpellDescription$ Target artifact creature can't block CARDNAME this turn. A:AB$ MustBlock | Cost$ 1 | ValidTgts$ Creature.Artifact | TgtPrompt$ Select target artifact creature to block this creature | SpellDescription$ Target artifact creature blocks CARDNAME this turn if able. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/auriok_siege_sled.jpg Oracle:{1}: Target artifact creature blocks Auriok Siege Sled this turn if able.\n{1}: Target artifact creature can't block Auriok Siege Sled this turn. diff --git a/forge-gui/res/cardsfolder/a/auriok_steelshaper.txt b/forge-gui/res/cardsfolder/a/auriok_steelshaper.txt index d0c6762411a..1122b97a48f 100644 --- a/forge-gui/res/cardsfolder/a/auriok_steelshaper.txt +++ b/forge-gui/res/cardsfolder/a/auriok_steelshaper.txt @@ -6,7 +6,7 @@ S:Mode$ ReduceCost | ValidCard$ Card | ValidSpell$ Activated.Equip | Activator$ S:Mode$ Continuous | Affected$ Creature.Soldier+YouCtrl,Creature.Knight+YouCtrl | AddPower$ 1 | AddToughness$ 1 | CheckSVar$ X | SVarCompare$ EQ1 | References$ X | Description$ As long as CARDNAME is equipped, each creature you control that's a Soldier or a Knight gets +1/+1. SVar:X:Count$Valid Card.Self+equipped SVar:EquipMe:Once -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Equipment SVar:Picture:http://www.wizards.com/global/images/magic/general/auriok_steelshaper.jpg Oracle:Equip costs you pay cost {1} less.\nAs long as Auriok Steelshaper is equipped, each creature you control that's a Soldier or a Knight gets +1/+1. diff --git a/forge-gui/res/cardsfolder/a/auriok_transfixer.txt b/forge-gui/res/cardsfolder/a/auriok_transfixer.txt index 5220108bdd1..abd8db41322 100644 --- a/forge-gui/res/cardsfolder/a/auriok_transfixer.txt +++ b/forge-gui/res/cardsfolder/a/auriok_transfixer.txt @@ -3,6 +3,6 @@ ManaCost:W Types:Creature Human Scout PT:1/1 A:AB$ Tap | Cost$ W T | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Tap target artifact. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/auriok_transfixer.jpg Oracle:{W}, {T}: Tap target artifact. diff --git a/forge-gui/res/cardsfolder/a/auriok_windwalker.txt b/forge-gui/res/cardsfolder/a/auriok_windwalker.txt index 320addebd7b..26ee6a2fc10 100644 --- a/forge-gui/res/cardsfolder/a/auriok_windwalker.txt +++ b/forge-gui/res/cardsfolder/a/auriok_windwalker.txt @@ -5,6 +5,6 @@ PT:2/3 K:Flying A:AB$ Pump | Cost$ T | ValidTgts$ Equipment.YouCtrl | TgtPrompt$ Select target equipment you control | SubAbility$ WindwalkerAttach | StackDescription$ None | SpellDescription$ Attach target Equipment you control to target creature you control. SVar:WindwalkerAttach:DB$ Attach | Object$ ParentTarget | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/auriok_windwalker.jpg Oracle:Flying\n{T}: Attach target Equipment you control to target creature you control. diff --git a/forge-gui/res/cardsfolder/a/aurora_eidolon.txt b/forge-gui/res/cardsfolder/a/aurora_eidolon.txt index 5eb749371b4..321eaf37823 100644 --- a/forge-gui/res/cardsfolder/a/aurora_eidolon.txt +++ b/forge-gui/res/cardsfolder/a/aurora_eidolon.txt @@ -5,6 +5,6 @@ PT:2/2 A:AB$ PreventDamage | Cost$ W Sac<1/CARDNAME> | ValidTgts$ Creature,Player,PlaneswalkerPlaneswalker | TgtPrompt$ Select any target | Amount$ 3 | SpellDescription$ Prevent the next 3 damage that would be dealt to any target this turn. T:Mode$ SpellCast | ValidCard$ Card.MultiColor | ValidActivatingPlayer$ You | TriggerZones$ Graveyard | OptionalDecider$ You | Execute$ TrigReturn | TriggerDescription$ Whenever you cast a multicolored spell, you may return CARDNAME from your graveyard to your hand. SVar:TrigReturn:DB$ChangeZone | Origin$ Graveyard | Destination$ Hand | Defined$ Self -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/aurora_eidolon.jpg Oracle:{W}, Sacrifice Aurora Eidolon: Prevent the next 3 damage that would be dealt to any target this turn.\nWhenever you cast a multicolored spell, you may return Aurora Eidolon from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/a/aurora_griffin.txt b/forge-gui/res/cardsfolder/a/aurora_griffin.txt index 86a972bde83..fea2f046e8c 100644 --- a/forge-gui/res/cardsfolder/a/aurora_griffin.txt +++ b/forge-gui/res/cardsfolder/a/aurora_griffin.txt @@ -4,6 +4,6 @@ Types:Creature Griffin PT:2/2 K:Flying A:AB$ Animate | Cost$ W | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Colors$ White | OverwriteColors$ True | SpellDescription$ Target permanent becomes white until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/aurora_griffin.jpg Oracle:Flying\n{W}: Target permanent becomes white until end of turn. diff --git a/forge-gui/res/cardsfolder/a/autumn_willow.txt b/forge-gui/res/cardsfolder/a/autumn_willow.txt index 36148a1b8ec..4ec308f4e5b 100644 --- a/forge-gui/res/cardsfolder/a/autumn_willow.txt +++ b/forge-gui/res/cardsfolder/a/autumn_willow.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Avatar PT:4/4 K:Shroud A:AB$ Pump | Cost$ G | ValidTgts$ Player | Defined$ Targeted | TgtPrompt$ Select target player to be able to target Autumn Willow | KW$ Can target CardUIDSource with spells and abilities as though it didn't have shroud. | DefinedKW$ CardUIDSource | StackDescription$ Until end of turn, {p:Targeted} can target CARDNAME as though it didn't have shroud. | SpellDescription$ Until end of turn, Autumn Willow can be the target of spells and abilities controlled by target player as though it didn't have shroud. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/autumn_willow.jpg Oracle:Shroud (This creature can't be the target of spells or abilities.)\n{G}: Until end of turn, Autumn Willow can be the target of spells and abilities controlled by target player as though it didn't have shroud. diff --git a/forge-gui/res/cardsfolder/a/autumns_veil.txt b/forge-gui/res/cardsfolder/a/autumns_veil.txt index 4fd77ce1d40..0a2f10bd3fe 100644 --- a/forge-gui/res/cardsfolder/a/autumns_veil.txt +++ b/forge-gui/res/cardsfolder/a/autumns_veil.txt @@ -4,7 +4,7 @@ Types:Instant A:SP$ Effect | Cost$ G | Name$ Autumn's Veil Effect | StaticAbilities$ AntiMagic,STCantBeTarget | SpellDescription$ Spells you control can't be countered by blue or black spells this turn, and creatures you control can't be the targets of blue or black spells this turn. SVar:AntiMagic:Mode$ Continuous | Affected$ Card.YouCtrl | AffectedZone$ Stack | EffectZone$ Command | AddHiddenKeyword$ CantBeCounteredBy:Spell.Blue,Spell.Black:CARDNAME can't be countered by blue or black spells. | Description$ Spells you control can't be countered by blue or black spells this turn. SVar:STCantBeTarget:Mode$ CantTarget | ValidCard$ Creature.YouCtrl | ValidSource$ Card.Blue,Card.Black | ValidSA$ Spell | EffectZone$ Command | Description$ Creatures you control can't be the targets of blue or black spells this turn. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/autumns_veil.jpg Oracle:Spells you control can't be countered by blue or black spells this turn, and creatures you control can't be the targets of blue or black spells this turn. diff --git a/forge-gui/res/cardsfolder/a/avacyn_guardian_angel.txt b/forge-gui/res/cardsfolder/a/avacyn_guardian_angel.txt index e050b02148d..62291e4dd49 100644 --- a/forge-gui/res/cardsfolder/a/avacyn_guardian_angel.txt +++ b/forge-gui/res/cardsfolder/a/avacyn_guardian_angel.txt @@ -10,6 +10,6 @@ SVar:RPreventCreature:Event$ DamageDone | Prevent$ True | ActiveZones$ Command | A:AB$ ChooseColor | Cost$ 5 W W | Defined$ You | SubAbility$ DBEffect2 | SpellDescription$ Prevent all damage that would be dealt to target player or planeswalker this turn by sources of the color of your choice. SVar:DBEffect2:DB$ Effect | ValidTgts$ Player,Planeswalker | Name$ Avacyn, Guardian Angel Effect 2 | ReplacementEffects$ RPreventPlayer | AILogic$ Fog | RememberObjects$ Targeted SVar:RPreventPlayer:Event$ DamageDone | Prevent$ True | ActiveZones$ Command | ValidTarget$ Player.IsRemembered,Planeswalker.IsRemembered | ValidSource$ Card.ChosenColor | Description$ Prevent all damage that would be dealt to target player or planeswalker this turn by sources of the color of your choice. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/avacyn_guardian_angel.jpg Oracle:Flying, vigilance\n{1}{W}: Prevent all damage that would be dealt to another target creature this turn by sources of the color of your choice.\n{5}{W}{W}: Prevent all damage that would be dealt to target player or planeswalker this turn by sources of the color of your choice. diff --git a/forge-gui/res/cardsfolder/a/avalanche.txt b/forge-gui/res/cardsfolder/a/avalanche.txt index cb96bc21da1..581e6cc901b 100644 --- a/forge-gui/res/cardsfolder/a/avalanche.txt +++ b/forge-gui/res/cardsfolder/a/avalanche.txt @@ -5,6 +5,6 @@ A:SP$ Destroy | Cost$ X 2 R R | TargetMin$ 0 | TargetMax$ MaxTgts | ValidTgts$ L # It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) SVar:X:Targeted$Amount SVar:MaxTgts:Count$Valid Land.Snow -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/avalanche.jpg Oracle:Destroy X target snow lands. diff --git a/forge-gui/res/cardsfolder/a/avarice_totem.txt b/forge-gui/res/cardsfolder/a/avarice_totem.txt index 8208255ab18..ba1290e1da9 100644 --- a/forge-gui/res/cardsfolder/a/avarice_totem.txt +++ b/forge-gui/res/cardsfolder/a/avarice_totem.txt @@ -2,6 +2,6 @@ Name:Avarice Totem ManaCost:1 Types:Artifact A:AB$ ExchangeControl | Cost$ 5 | Defined$ Self | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | SpellDescription$ Exchange control of CARDNAME and target nonland permanent. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/avarice_totem.jpg Oracle:{5}: Exchange control of Avarice Totem and target nonland permanent. diff --git a/forge-gui/res/cardsfolder/a/aven_liberator.txt b/forge-gui/res/cardsfolder/a/aven_liberator.txt index d36acf62c4c..8cfc7538b09 100644 --- a/forge-gui/res/cardsfolder/a/aven_liberator.txt +++ b/forge-gui/res/cardsfolder/a/aven_liberator.txt @@ -6,6 +6,6 @@ K:Flying K:Morph:3 W T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigProtect | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME is turned face up, target creature you control gains protection from the color of your choice until end of turn. SVar:TrigProtect:DB$ Protection | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | Gains$ Choice | Choices$ AnyColor -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/aven_liberator.jpg Oracle:Flying\nMorph {3}{W} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.)\nWhen Aven Liberator is turned face up, target creature you control gains protection from the color of your choice until end of turn. diff --git a/forge-gui/res/cardsfolder/a/aven_mimeomancer.txt b/forge-gui/res/cardsfolder/a/aven_mimeomancer.txt index df26c2e372d..c7ce95da56b 100644 --- a/forge-gui/res/cardsfolder/a/aven_mimeomancer.txt +++ b/forge-gui/res/cardsfolder/a/aven_mimeomancer.txt @@ -7,6 +7,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigPutCounter | Tri SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ FEATHER | CounterNum$ 1 | SubAbility$ DBAnimate SVar:DBAnimate:DB$ Animate | Defined$ Targeted | staticAbilities$ MimeomancerStatic | Permanent$ True SVar:MimeomancerStatic:Mode$ Continuous | Affected$ Card.Self+counters_GE1_FEATHER | SetPower$ 3 | SetToughness$ 1 | AddKeyword$ Flying | Description$ CARDNAME is 3/1 and has flying for as long as it has a feather counter on it. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/aven_mimeomancer.jpg Oracle:Flying\nAt the beginning of your upkeep, you may put a feather counter on target creature. If you do, that creature has base power and toughness 3/1 and has flying for as long as it has a feather counter on it. diff --git a/forge-gui/res/cardsfolder/a/aven_shrine.txt b/forge-gui/res/cardsfolder/a/aven_shrine.txt index c128c6aba64..6798bac21a9 100644 --- a/forge-gui/res/cardsfolder/a/aven_shrine.txt +++ b/forge-gui/res/cardsfolder/a/aven_shrine.txt @@ -6,6 +6,6 @@ SVar:TrigGainLifeRem:DB$ Pump | Defined$ TriggeredCard | PumpZone$ Stack | Remem SVar:DBGainLife:DB$ GainLife | Defined$ TriggeredActivator | LifeAmount$ X | References$ X | SubAbility$ DBCleanup SVar:X:Count$ValidGraveyard Card.sharesNameWith Remembered SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/aven_shrine.jpg Oracle:Whenever a player casts a spell, that player gains X life, where X is the number of cards in all graveyards with the same name as that spell. diff --git a/forge-gui/res/cardsfolder/a/aven_windreader.txt b/forge-gui/res/cardsfolder/a/aven_windreader.txt index 00bf0efe63f..28aa53076e5 100644 --- a/forge-gui/res/cardsfolder/a/aven_windreader.txt +++ b/forge-gui/res/cardsfolder/a/aven_windreader.txt @@ -4,6 +4,6 @@ Types:Creature Bird Soldier Wizard PT:3/3 K:Flying A:AB$ Dig | Cost$ 1 U | DigNum$ 1 | ValidTgts$ Player | TgtPrompt$ Select target player | Reveal$ True | NoMove$ True | SpellDescription$ Target player reveals the top card of their library. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/aven_windreader.jpg Oracle:Flying (This creature can't be blocked except by creatures with flying or reach.)\n{1}{U}: Target player reveals the top card of their library. diff --git a/forge-gui/res/cardsfolder/a/avenger_en_dal.txt b/forge-gui/res/cardsfolder/a/avenger_en_dal.txt index 8079d850874..73065193477 100644 --- a/forge-gui/res/cardsfolder/a/avenger_en_dal.txt +++ b/forge-gui/res/cardsfolder/a/avenger_en_dal.txt @@ -6,6 +6,6 @@ A:AB$ ChangeZone | Cost$ 2 W T Discard<1/Card> | ValidTgts$ Creature.attacking | SVar:DBGainLife:DB$ GainLife | Defined$ TargetedController | LifeAmount$ X | References$ X SVar:X:TargetedLKI$CardToughness SVar:AIPreference:DiscardCost$Card -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/avenger_en_dal.jpg Oracle:{2}{W}, {T}, Discard a card: Exile target attacking creature. Its controller gains life equal to its toughness. diff --git a/forge-gui/res/cardsfolder/a/avizoa.txt b/forge-gui/res/cardsfolder/a/avizoa.txt index 5be55988ee3..191214c4f87 100644 --- a/forge-gui/res/cardsfolder/a/avizoa.txt +++ b/forge-gui/res/cardsfolder/a/avizoa.txt @@ -5,6 +5,6 @@ PT:2/2 K:Flying A:AB$ Pump | Cost$ 0 | NumAtt$ 2 | NumDef$ 2 | ActivationLimit$ 1 | SubAbility$ DBSkipTurn | SpellDescription$ CARDNAME gets +2/+2 until end of turn. You skip your next untap step. Activate this ability only once each turn. SVar:DBSkipTurn:DB$ Pump | Defined$ You | KW$ Skip your next untap step. | Permanent$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/avizoa.jpg Oracle:Flying\n{0}: Avizoa gets +2/+2 until end of turn. You skip your next untap step. Activate this ability only once each turn. diff --git a/forge-gui/res/cardsfolder/a/awakening.txt b/forge-gui/res/cardsfolder/a/awakening.txt index 89ff19f084a..88c70dc1047 100644 --- a/forge-gui/res/cardsfolder/a/awakening.txt +++ b/forge-gui/res/cardsfolder/a/awakening.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | Execute$ TrigUntapAll | TriggerDescription$ At the beginning of each upkeep, untap all creatures and lands. SVar:TrigUntapAll:DB$UntapAll | ValidCards$ Creature,Land | SpellDescription$ untap all creatures and lands. SVar:UntapsEachTurn:Creature,Land -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/awakening.jpg Oracle:At the beginning of each upkeep, untap all creatures and lands. diff --git a/forge-gui/res/cardsfolder/a/awe_for_the_guilds.txt b/forge-gui/res/cardsfolder/a/awe_for_the_guilds.txt index baa03318cb4..80ad8bd3d50 100644 --- a/forge-gui/res/cardsfolder/a/awe_for_the_guilds.txt +++ b/forge-gui/res/cardsfolder/a/awe_for_the_guilds.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ Effect | Cost$ 2 R | Name$ Awe for the Guilds Effect | StaticAbilities$ KWPump | AILogic$ Evasion | SpellDescription$ Monocolored creatures can't block this turn. SVar:KWPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.MonoColor| AddHiddenKeyword$ CARDNAME can't block. | Description$ Monocolored creatures can't block this turn. SVar:PlayMain1:TRUE -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/awe_for_the_guilds.jpg Oracle:Monocolored creatures can't block this turn. diff --git a/forge-gui/res/cardsfolder/a/axebane_guardian.txt b/forge-gui/res/cardsfolder/a/axebane_guardian.txt index 423828c8dfd..de8905ecd6c 100644 --- a/forge-gui/res/cardsfolder/a/axebane_guardian.txt +++ b/forge-gui/res/cardsfolder/a/axebane_guardian.txt @@ -5,7 +5,7 @@ PT:0/3 K:Defender A:AB$ Mana | Cost$ T | Produced$ Combo Any | Amount$ X | References$ X | SpellDescription$ Add X mana in any combination of colors, where X is the number of creatures with defender you control. SVar:X:Count$Valid Creature.withDefender+YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Keyword$Defender SVar:Picture:http://www.wizards.com/global/images/magic/general/axebane_guardian.jpg Oracle:Defender\n{T}: Add X mana in any combination of colors, where X is the number of creatures with defender you control. diff --git a/forge-gui/res/cardsfolder/a/axis_of_mortality.txt b/forge-gui/res/cardsfolder/a/axis_of_mortality.txt index cc5a44379fe..412d00b6e44 100644 --- a/forge-gui/res/cardsfolder/a/axis_of_mortality.txt +++ b/forge-gui/res/cardsfolder/a/axis_of_mortality.txt @@ -3,6 +3,6 @@ ManaCost:4 W W Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ DBExchangeLife | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may have two target players exchange life totals. SVar:DBExchangeLife:DB$ ExchangeLife | ValidTgts$ Player | TargetMin$ 2 | TargetMax$ 2 | TgtPrompt$ Select target player | SpellDescription$ Two target players exchange life totals. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_conduit.jpg Oracle:At the beginning of your upkeep, you may have two target players exchange life totals. diff --git a/forge-gui/res/cardsfolder/a/ayesha_tanaka.txt b/forge-gui/res/cardsfolder/a/ayesha_tanaka.txt index 0336f40c762..a2375e67111 100644 --- a/forge-gui/res/cardsfolder/a/ayesha_tanaka.txt +++ b/forge-gui/res/cardsfolder/a/ayesha_tanaka.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Human Artificer PT:2/2 K:Banding A:AB$ Counter | Cost$ T | TargetType$ Activated | TgtPrompt$ Select target activated ability from an artifact source | ValidTgts$ Artifact | UnlessCost$ W | SpellDescription$ Counter target activated ability from an artifact source unless that ability's controller pays {W}. (Mana abilities can't be targeted.) -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ayesha_tanaka.jpg Oracle:Banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.)\n{T}: Counter target activated ability from an artifact source unless that ability's controller pays {W}. (Mana abilities can't be targeted.) diff --git a/forge-gui/res/cardsfolder/a/aysen_abbey.txt b/forge-gui/res/cardsfolder/a/aysen_abbey.txt index 0e9255da62e..fc14d905bfd 100644 --- a/forge-gui/res/cardsfolder/a/aysen_abbey.txt +++ b/forge-gui/res/cardsfolder/a/aysen_abbey.txt @@ -5,6 +5,6 @@ A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ 1 T | Produced$ W | SpellDescription$ Add {W}. A:AB$ Mana | Cost$ 2 T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Mana | Cost$ 2 T | Produced$ G | SpellDescription$ Add {G}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/aysen_abbey.jpg Oracle:{T}: Add {C}.\n{1}, {T}: Add {W}.\n{2}, {T}: Add {G} or {U}. diff --git a/forge-gui/res/cardsfolder/a/aysen_highway.txt b/forge-gui/res/cardsfolder/a/aysen_highway.txt index e751567b76c..bcf977880c9 100644 --- a/forge-gui/res/cardsfolder/a/aysen_highway.txt +++ b/forge-gui/res/cardsfolder/a/aysen_highway.txt @@ -3,6 +3,6 @@ ManaCost:3 W W W Types:Enchantment S:Mode$ Continuous | Affected$ Creature.White | AddKeyword$ Plainswalk | Description$ White creatures have plainswalk. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/aysen_highway.jpg Oracle:White creatures have plainswalk. (They can't be blocked as long as defending player controls a Plains.) diff --git a/forge-gui/res/cardsfolder/a/azami_lady_of_scrolls.txt b/forge-gui/res/cardsfolder/a/azami_lady_of_scrolls.txt index 8c26d77a63f..476b1766003 100644 --- a/forge-gui/res/cardsfolder/a/azami_lady_of_scrolls.txt +++ b/forge-gui/res/cardsfolder/a/azami_lady_of_scrolls.txt @@ -3,7 +3,7 @@ ManaCost:2 U U U Types:Legendary Creature Human Wizard PT:0/2 A:AB$ Draw | Cost$ tapXType<1/Wizard> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Wizard SVar:Picture:http://www.wizards.com/global/images/magic/general/azami_lady_of_scrolls.jpg Oracle:Tap an untapped Wizard you control: Draw a card. diff --git a/forge-gui/res/cardsfolder/a/azorius_aethermage.txt b/forge-gui/res/cardsfolder/a/azorius_aethermage.txt index e28e87c1bb1..b955cae5b30 100644 --- a/forge-gui/res/cardsfolder/a/azorius_aethermage.txt +++ b/forge-gui/res/cardsfolder/a/azorius_aethermage.txt @@ -5,6 +5,6 @@ PT:1/1 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Hand | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ Whenever a permanent is returned to your hand, you may pay {1}. If you do, draw a card. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Hand | ValidCard$ Card.YouOwn+Other | Execute$ TrigDraw | TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ Whenever a permanent is returned to your hand, you may pay {1}. If you do, draw a card. SVar:TrigDraw:AB$Draw | Cost$ 1 | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/azorius_aethermage.jpg Oracle:Whenever a permanent is returned to your hand, you may pay {1}. If you do, draw a card. diff --git a/forge-gui/res/cardsfolder/a/azorius_cluestone.txt b/forge-gui/res/cardsfolder/a/azorius_cluestone.txt index 2096d54118b..27a00d75a1f 100644 --- a/forge-gui/res/cardsfolder/a/azorius_cluestone.txt +++ b/forge-gui/res/cardsfolder/a/azorius_cluestone.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Draw | Cost$ W U T Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$White|Blue SVar:Picture:http://www.wizards.com/global/images/magic/general/azorius_cluestone.jpg Oracle:{T}: Add {W} or {U}.\n{W}{U}, {T}, Sacrifice Azorius Cluestone: Draw a card. diff --git a/forge-gui/res/cardsfolder/a/azorius_herald.txt b/forge-gui/res/cardsfolder/a/azorius_herald.txt index 23adbf13e7a..7f8112fb4c6 100644 --- a/forge-gui/res/cardsfolder/a/azorius_herald.txt +++ b/forge-gui/res/cardsfolder/a/azorius_herald.txt @@ -8,7 +8,7 @@ T:Mode$ ChangesZone | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ SVar:TrigGainLife:DB$GainLife | Defined$ You | LifeAmount$ 4 SVar:TrigSac:DB$Sacrifice | Defined$ Self SVar:ManaNeededToAvoidNegativeEffect:blue -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Blue SVar:Picture:http://www.wizards.com/global/images/magic/general/azorius_herald.jpg Oracle:Azorius Herald can't be blocked.\nWhen Azorius Herald enters the battlefield, you gain 4 life.\nWhen Azorius Herald enters the battlefield, sacrifice it unless {U} was spent to cast it. diff --git a/forge-gui/res/cardsfolder/a/azorius_keyrune.txt b/forge-gui/res/cardsfolder/a/azorius_keyrune.txt index 0cc330f4fb5..0ee18ab106f 100644 --- a/forge-gui/res/cardsfolder/a/azorius_keyrune.txt +++ b/forge-gui/res/cardsfolder/a/azorius_keyrune.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Animate | Cost$ W U | Defined$ Self | Power$ 2 | Toughness$ 2 | Types$ Artifact,Creature,Bird | Colors$ White,Blue | Keywords$ Flying | SpellDescription$ CARDNAME becomes a 2/2 white and blue Bird artifact creature with flying until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$White|Blue SVar:Picture:http://www.wizards.com/global/images/magic/general/azorius_keyrune.jpg Oracle:{T}: Add {W} or {U}.\n{W}{U}: Azorius Keyrune becomes a 2/2 white and blue Bird artifact creature with flying until end of turn. diff --git a/forge-gui/res/cardsfolder/a/azorius_ploy.txt b/forge-gui/res/cardsfolder/a/azorius_ploy.txt index 657e97fe6e4..6e15c218770 100644 --- a/forge-gui/res/cardsfolder/a/azorius_ploy.txt +++ b/forge-gui/res/cardsfolder/a/azorius_ploy.txt @@ -3,6 +3,6 @@ ManaCost:1 W W U Types:Instant A:SP$ Pump | Cost$ 1 W W U | ValidTgts$ Creature | TgtPrompt$ Select target creature whose combat damage will be prevented | KW$ Prevent all combat damage that would be dealt by CARDNAME. | SubAbility$ DBPump | SpellDescription$ Prevent all combat damage target creature would deal this turn. SVar:DBPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature that will have all damage dealt to it prevented | KW$ Prevent all combat damage that would be dealt to CARDNAME. | SpellDescription$ Prevent all combat damage that would be dealt to target creature this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/azorius_ploy.jpg Oracle:Prevent all combat damage target creature would deal this turn.\nPrevent all combat damage that would be dealt to target creature this turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/a/azorius_signet.txt b/forge-gui/res/cardsfolder/a/azorius_signet.txt index 535ed729264..8c73c394693 100644 --- a/forge-gui/res/cardsfolder/a/azorius_signet.txt +++ b/forge-gui/res/cardsfolder/a/azorius_signet.txt @@ -2,6 +2,6 @@ Name:Azorius Signet ManaCost:2 Types:Artifact A:AB$ Mana | Cost$ 1 T | Produced$ W U | SpellDescription$ Add {W}{U}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/azorius_signet.jpg Oracle:{1}, {T}: Add {W}{U}. From 25f7231e4983731fba9e3cc236050c0762df518a Mon Sep 17 00:00:00 2001 From: Hanmac Date: Wed, 17 Oct 2018 21:47:09 +0200 Subject: [PATCH 059/901] Necravolver fix --- forge-gui/res/cardsfolder/n/necravolver.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/n/necravolver.txt b/forge-gui/res/cardsfolder/n/necravolver.txt index a2075b1d36a..b51452cd08c 100644 --- a/forge-gui/res/cardsfolder/n/necravolver.txt +++ b/forge-gui/res/cardsfolder/n/necravolver.txt @@ -5,9 +5,9 @@ PT:2/2 K:Kicker:1 G:W K:ETBReplacement:Other:VolverStrength:Mandatory::Card.Self+kicked 1 K:ETBReplacement:Other:VolverPumped:Mandatory::Card.Self+kicked 2 -SVar:VolverPumped:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 2 | ETB$ True | SubAbility$ VolverStomp | SpellDescription$ If CARDNAME was kicked with its {1}{G} kicker, it enters the battlefield with two +1/+1 counters on it and with trample. +SVar:VolverStrength:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 2 | ETB$ True | SubAbility$ VolverStomp | SpellDescription$ If CARDNAME was kicked with its {1}{G} kicker, it enters the battlefield with two +1/+1 counters on it and with trample. SVar:VolverStomp:DB$ Animate | Defined$ Self | Keywords$ Trample | Permanent$ True -SVar:VolverPumped2:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | ETB$ True | SubAbility$ VolverLife | SpellDescription$ If CARDNAME was kicked with its {W} kicker, it enters the battlefield with a +1/+1 counter on it and with "Whenever CARDNAME deals damage, you gain that much life." +SVar:VolverPumped:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | ETB$ True | SubAbility$ VolverLife | SpellDescription$ If CARDNAME was kicked with its {W} kicker, it enters the battlefield with a +1/+1 counter on it and with "Whenever CARDNAME deals damage, you gain that much life." SVar:VolverLife:DB$ Animate | Defined$ Self | Triggers$ PseudoLifelink | sVars$ VolverTrigGain,VolverX | Permanent$ True SVar:PseudoLifelink:Mode$ DamageDealtOnce | ValidSource$ Card.Self | Execute$ VolverTrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage, you gain that much life. SVar:VolverTrigGain:DB$ GainLife | Defined$ You | LifeAmount$ VolverX | References$ VolverX From 92b0355a41bb41931d141b03a5a460ca368fae29 Mon Sep 17 00:00:00 2001 From: Chris H Date: Wed, 17 Oct 2018 20:57:21 -0400 Subject: [PATCH 060/901] AI:RemoveDeck (B-Z) --- forge-gui/res/cardsfolder/b/back_to_basics.txt | 2 +- forge-gui/res/cardsfolder/b/backslide.txt | 2 +- forge-gui/res/cardsfolder/b/bakis_curse.txt | 4 ++-- forge-gui/res/cardsfolder/b/baku_altar.txt | 2 +- forge-gui/res/cardsfolder/b/balance_of_power.txt | 2 +- forge-gui/res/cardsfolder/b/balancing_act.txt | 4 ++-- forge-gui/res/cardsfolder/b/balduvian_conjurer.txt | 2 +- forge-gui/res/cardsfolder/b/balduvian_frostwaker.txt | 2 +- forge-gui/res/cardsfolder/b/balduvian_shaman.txt | 4 ++-- forge-gui/res/cardsfolder/b/baleful_stare.txt | 2 +- forge-gui/res/cardsfolder/b/balm_of_restoration.txt | 2 +- forge-gui/res/cardsfolder/b/balshan_beguiler.txt | 2 +- forge-gui/res/cardsfolder/b/balthor_the_defiled.txt | 2 +- forge-gui/res/cardsfolder/b/bamboozle.txt | 2 +- forge-gui/res/cardsfolder/b/bane_of_progress.txt | 2 +- forge-gui/res/cardsfolder/b/bane_of_the_living.txt | 2 +- forge-gui/res/cardsfolder/b/banishing_knack.txt | 2 +- forge-gui/res/cardsfolder/b/banshee.txt | 2 +- forge-gui/res/cardsfolder/b/barbarian_guides.txt | 4 ++-- forge-gui/res/cardsfolder/b/barbarian_outcast.txt | 2 +- forge-gui/res/cardsfolder/b/barbed_sextant.txt | 2 +- forge-gui/res/cardsfolder/b/barbed_wire.txt | 2 +- forge-gui/res/cardsfolder/b/barrage_of_expendables.txt | 2 +- forge-gui/res/cardsfolder/b/barrage_ogre.txt | 2 +- forge-gui/res/cardsfolder/b/barrage_tyrant.txt | 2 +- forge-gui/res/cardsfolder/b/barrel_down_sokenzan.txt | 2 +- forge-gui/res/cardsfolder/b/barren_glory.txt | 2 +- forge-gui/res/cardsfolder/b/barrenton_medic.txt | 2 +- forge-gui/res/cardsfolder/b/barrin.txt | 2 +- forge-gui/res/cardsfolder/b/barrin_master_wizard.txt | 2 +- forge-gui/res/cardsfolder/b/barter_in_blood.txt | 2 +- forge-gui/res/cardsfolder/b/basal_sliver.txt | 2 +- forge-gui/res/cardsfolder/b/basal_thrull.txt | 2 +- forge-gui/res/cardsfolder/b/basalt_monolith.txt | 2 +- forge-gui/res/cardsfolder/b/bastion_mastodon.txt | 2 +- forge-gui/res/cardsfolder/b/bathe_in_light.txt | 2 +- forge-gui/res/cardsfolder/b/baton_of_courage.txt | 2 +- forge-gui/res/cardsfolder/b/baton_of_morale.txt | 2 +- forge-gui/res/cardsfolder/b/battering_ram.txt | 2 +- forge-gui/res/cardsfolder/b/battle_cry.txt | 2 +- forge-gui/res/cardsfolder/b/battle_of_wits.txt | 2 +- forge-gui/res/cardsfolder/b/battle_strain.txt | 2 +- forge-gui/res/cardsfolder/b/batwing_brume.txt | 2 +- forge-gui/res/cardsfolder/b/bazaar_of_baghdad.txt | 2 +- forge-gui/res/cardsfolder/b/bazaar_of_wonders.txt | 2 +- forge-gui/res/cardsfolder/b/bazaar_trader.txt | 2 +- forge-gui/res/cardsfolder/b/beacon_of_destiny.txt | 2 +- forge-gui/res/cardsfolder/b/beast_walkers.txt | 2 +- forge-gui/res/cardsfolder/b/beast_within.txt | 2 +- forge-gui/res/cardsfolder/b/bedlam.txt | 2 +- forge-gui/res/cardsfolder/b/behold_the_beyond.txt | 2 +- forge-gui/res/cardsfolder/b/belbes_armor.txt | 2 +- forge-gui/res/cardsfolder/b/benalish_hero.txt | 2 +- forge-gui/res/cardsfolder/b/benalish_infantry.txt | 2 +- forge-gui/res/cardsfolder/b/benalish_missionary.txt | 2 +- forge-gui/res/cardsfolder/b/bend_or_break.txt | 2 +- forge-gui/res/cardsfolder/b/benevolent_offering.txt | 4 ++-- forge-gui/res/cardsfolder/b/bereavement.txt | 2 +- forge-gui/res/cardsfolder/b/beseech_the_queen.txt | 2 +- forge-gui/res/cardsfolder/b/betrayal_of_flesh.txt | 2 +- forge-gui/res/cardsfolder/b/betrothed_of_fire.txt | 2 +- forge-gui/res/cardsfolder/b/bifurcate.txt | 4 ++-- forge-gui/res/cardsfolder/b/biomass_mutation.txt | 2 +- forge-gui/res/cardsfolder/b/biorhythm.txt | 2 +- forge-gui/res/cardsfolder/b/bioshift.txt | 2 +- forge-gui/res/cardsfolder/b/birchlore_rangers.txt | 2 +- forge-gui/res/cardsfolder/b/bite_of_the_black_rose.txt | 2 +- forge-gui/res/cardsfolder/b/black_carriage.txt | 2 +- forge-gui/res/cardsfolder/b/black_mana_battery.txt | 2 +- forge-gui/res/cardsfolder/b/black_scarab.txt | 2 +- forge-gui/res/cardsfolder/b/black_suns_zenith.txt | 2 +- forge-gui/res/cardsfolder/b/black_ward.txt | 2 +- forge-gui/res/cardsfolder/b/blade_of_selves.txt | 2 +- forge-gui/res/cardsfolder/b/bladed_sentinel.txt | 2 +- forge-gui/res/cardsfolder/b/blademane_baku.txt | 2 +- forge-gui/res/cardsfolder/b/blanket_of_night.txt | 2 +- forge-gui/res/cardsfolder/b/blast_of_genius.txt | 2 +- forge-gui/res/cardsfolder/b/blasting_station.txt | 2 +- forge-gui/res/cardsfolder/b/blaze_of_glory.txt | 2 +- forge-gui/res/cardsfolder/b/blazethorn_scarecrow.txt | 2 +- forge-gui/res/cardsfolder/b/blazing_shoal.txt | 2 +- forge-gui/res/cardsfolder/b/blessed_reincarnation.txt | 2 +- forge-gui/res/cardsfolder/b/blessing_of_leeches.txt | 2 +- forge-gui/res/cardsfolder/b/blind_fury.txt | 2 +- forge-gui/res/cardsfolder/b/blind_seer.txt | 2 +- forge-gui/res/cardsfolder/b/blind_spot_giant.txt | 2 +- forge-gui/res/cardsfolder/b/blinding_beam.txt | 2 +- forge-gui/res/cardsfolder/b/blinding_fog.txt | 2 +- forge-gui/res/cardsfolder/b/blinding_light.txt | 2 +- forge-gui/res/cardsfolder/b/blinding_souleater.txt | 2 +- forge-gui/res/cardsfolder/b/blinkmoth_infusion.txt | 4 ++-- forge-gui/res/cardsfolder/b/blinkmoth_urn.txt | 2 +- forge-gui/res/cardsfolder/b/blinkmoth_well.txt | 2 +- forge-gui/res/cardsfolder/b/blizzard.txt | 2 +- forge-gui/res/cardsfolder/b/blood_celebrant.txt | 2 +- forge-gui/res/cardsfolder/b/blood_clock.txt | 2 +- forge-gui/res/cardsfolder/b/blood_funnel.txt | 2 +- forge-gui/res/cardsfolder/b/blood_moon.txt | 2 +- forge-gui/res/cardsfolder/b/blood_oath.txt | 2 +- forge-gui/res/cardsfolder/b/blood_of_the_martyr.txt | 2 +- forge-gui/res/cardsfolder/b/blood_rites.txt | 2 +- forge-gui/res/cardsfolder/b/blood_sun.txt | 2 +- forge-gui/res/cardsfolder/b/blood_vassal.txt | 2 +- forge-gui/res/cardsfolder/b/bloodbond_march.txt | 2 +- forge-gui/res/cardsfolder/b/bloodcurdler.txt | 2 +- forge-gui/res/cardsfolder/b/bloodfire_infusion.txt | 2 +- forge-gui/res/cardsfolder/b/bloodfire_kavu.txt | 2 +- forge-gui/res/cardsfolder/b/bloodflow_connoisseur.txt | 2 +- forge-gui/res/cardsfolder/b/bloodline_shaman.txt | 2 +- forge-gui/res/cardsfolder/b/bloodscent.txt | 2 +- forge-gui/res/cardsfolder/b/bloodshot_cyclops.txt | 2 +- forge-gui/res/cardsfolder/b/bloodshot_trainee.txt | 2 +- forge-gui/res/cardsfolder/b/bloodstone_cameo.txt | 2 +- forge-gui/res/cardsfolder/b/bloodthorn_taunter.txt | 2 +- forge-gui/res/cardsfolder/b/bloom_tender.txt | 2 +- forge-gui/res/cardsfolder/b/blowfly_infestation.txt | 2 +- forge-gui/res/cardsfolder/b/bludgeon_brawl.txt | 2 +- forge-gui/res/cardsfolder/b/blue_elemental_blast.txt | 2 +- forge-gui/res/cardsfolder/b/blue_mana_battery.txt | 2 +- forge-gui/res/cardsfolder/b/blue_scarab.txt | 2 +- forge-gui/res/cardsfolder/b/blue_ward.txt | 2 +- forge-gui/res/cardsfolder/b/bog_elemental.txt | 2 +- forge-gui/res/cardsfolder/b/bog_glider.txt | 2 +- forge-gui/res/cardsfolder/b/bog_gnarr.txt | 2 +- forge-gui/res/cardsfolder/b/bog_initiate.txt | 2 +- forge-gui/res/cardsfolder/b/bog_witch.txt | 2 +- forge-gui/res/cardsfolder/b/boggart_arsonists.txt | 2 +- forge-gui/res/cardsfolder/b/boggart_birth_rite.txt | 2 +- forge-gui/res/cardsfolder/b/boggart_forager.txt | 2 +- forge-gui/res/cardsfolder/b/boggart_harbinger.txt | 2 +- forge-gui/res/cardsfolder/b/boggart_mob.txt | 2 +- forge-gui/res/cardsfolder/b/boggart_shenanigans.txt | 2 +- forge-gui/res/cardsfolder/b/boil.txt | 2 +- forge-gui/res/cardsfolder/b/boiling_blood.txt | 2 +- forge-gui/res/cardsfolder/b/boiling_seas.txt | 2 +- forge-gui/res/cardsfolder/b/bola_warrior.txt | 2 +- forge-gui/res/cardsfolder/b/bomat_courier.txt | 2 +- forge-gui/res/cardsfolder/b/bond_of_agony.txt | 2 +- forge-gui/res/cardsfolder/b/bonds_of_mortality.txt | 2 +- forge-gui/res/cardsfolder/b/bone_flute.txt | 2 +- forge-gui/res/cardsfolder/b/bone_shaman.txt | 2 +- forge-gui/res/cardsfolder/b/bone_splinters.txt | 2 +- forge-gui/res/cardsfolder/b/bonus_round.txt | 2 +- forge-gui/res/cardsfolder/b/booby_trap.txt | 2 +- forge-gui/res/cardsfolder/b/boonweaver_giant.txt | 2 +- forge-gui/res/cardsfolder/b/borderland_behemoth.txt | 2 +- forge-gui/res/cardsfolder/b/boreal_griffin.txt | 2 +- forge-gui/res/cardsfolder/b/boros_battleshaper.txt | 2 +- forge-gui/res/cardsfolder/b/boros_cluestone.txt | 2 +- forge-gui/res/cardsfolder/b/boros_fury_shield.txt | 2 +- forge-gui/res/cardsfolder/b/boros_keyrune.txt | 2 +- forge-gui/res/cardsfolder/b/boros_locket.txt | 2 +- forge-gui/res/cardsfolder/b/boros_signet.txt | 2 +- forge-gui/res/cardsfolder/b/borrowing_the_east_wind.txt | 2 +- forge-gui/res/cardsfolder/b/bosh_iron_golem.txt | 2 +- forge-gui/res/cardsfolder/b/bosh_iron_golem_avatar.txt | 2 +- forge-gui/res/cardsfolder/b/bosium_strip.txt | 2 +- forge-gui/res/cardsfolder/b/bottomless_pit.txt | 2 +- forge-gui/res/cardsfolder/b/bottomless_vault.txt | 2 +- forge-gui/res/cardsfolder/b/bounty_of_the_hunt.txt | 2 +- forge-gui/res/cardsfolder/b/brace_for_impact.txt | 2 +- forge-gui/res/cardsfolder/b/braid_of_fire.txt | 2 +- forge-gui/res/cardsfolder/b/braids_cabal_minion.txt | 2 +- forge-gui/res/cardsfolder/b/braids_conjurer_adept.txt | 2 +- forge-gui/res/cardsfolder/b/brain_pry.txt | 2 +- forge-gui/res/cardsfolder/b/brain_weevil.txt | 2 +- forge-gui/res/cardsfolder/b/bramblesnap.txt | 2 +- forge-gui/res/cardsfolder/b/brand.txt | 2 +- forge-gui/res/cardsfolder/b/brand_of_ill_omen.txt | 2 +- forge-gui/res/cardsfolder/b/brass_squire.txt | 2 +- forge-gui/res/cardsfolder/b/brass_talon_chimera.txt | 2 +- forge-gui/res/cardsfolder/b/brave_the_elements.txt | 2 +- forge-gui/res/cardsfolder/b/brawl.txt | 2 +- forge-gui/res/cardsfolder/b/break_open.txt | 2 +- forge-gui/res/cardsfolder/b/breaking_wave.txt | 2 +- forge-gui/res/cardsfolder/b/breakthrough.txt | 2 +- forge-gui/res/cardsfolder/b/breath_of_dreams.txt | 2 +- forge-gui/res/cardsfolder/b/breath_of_fury.txt | 2 +- forge-gui/res/cardsfolder/b/briarknit_kami.txt | 2 +- forge-gui/res/cardsfolder/b/bridge_from_below.txt | 2 +- forge-gui/res/cardsfolder/b/brightflame.txt | 2 +- forge-gui/res/cardsfolder/b/brightstone_ritual.txt | 2 +- forge-gui/res/cardsfolder/b/brilliant_spectrum.txt | 2 +- forge-gui/res/cardsfolder/b/brine_seer.txt | 2 +- forge-gui/res/cardsfolder/b/brine_shaman.txt | 2 +- forge-gui/res/cardsfolder/b/bring_to_light.txt | 2 +- forge-gui/res/cardsfolder/b/bringer_of_the_black_dawn.txt | 2 +- forge-gui/res/cardsfolder/b/broodstar.txt | 2 +- forge-gui/res/cardsfolder/b/browse.txt | 2 +- forge-gui/res/cardsfolder/b/brutal_deceiver.txt | 2 +- forge-gui/res/cardsfolder/b/brutal_expulsion.txt | 2 +- forge-gui/res/cardsfolder/b/brutalizer_exarch.txt | 2 +- forge-gui/res/cardsfolder/b/bubble_matrix.txt | 2 +- forge-gui/res/cardsfolder/b/bubbling_cauldron.txt | 2 +- forge-gui/res/cardsfolder/b/bubbling_muck.txt | 2 +- forge-gui/res/cardsfolder/b/bulwark.txt | 2 +- forge-gui/res/cardsfolder/b/burden_of_greed.txt | 2 +- forge-gui/res/cardsfolder/b/burden_of_guilt.txt | 2 +- forge-gui/res/cardsfolder/b/buried_alive.txt | 2 +- forge-gui/res/cardsfolder/b/burn_at_the_stake.txt | 2 +- forge-gui/res/cardsfolder/b/burning_cloak.txt | 2 +- forge-gui/res/cardsfolder/b/burning_earth.txt | 2 +- forge-gui/res/cardsfolder/b/burning_of_xinye.txt | 2 +- forge-gui/res/cardsfolder/b/burning_sands.txt | 2 +- forge-gui/res/cardsfolder/b/burning_tree_bloodscale.txt | 2 +- forge-gui/res/cardsfolder/b/burning_vengeance.txt | 2 +- forge-gui/res/cardsfolder/b/burning_wish.txt | 2 +- forge-gui/res/cardsfolder/b/burnout.txt | 2 +- forge-gui/res/cardsfolder/b/burnt_offering.txt | 2 +- forge-gui/res/cardsfolder/b/burr_grafter.txt | 2 +- forge-gui/res/cardsfolder/b/burrowing.txt | 2 +- forge-gui/res/cardsfolder/b/burst_of_energy.txt | 2 +- forge-gui/res/cardsfolder/b/burst_of_speed.txt | 2 +- forge-gui/res/cardsfolder/c/cabal_coffers.txt | 2 +- forge-gui/res/cardsfolder/c/cabal_interrogator.txt | 2 +- forge-gui/res/cardsfolder/c/cabal_patriarch.txt | 2 +- forge-gui/res/cardsfolder/c/cabal_ritual.txt | 2 +- forge-gui/res/cardsfolder/c/cabal_shrine.txt | 2 +- forge-gui/res/cardsfolder/c/cabal_therapy.txt | 2 +- forge-gui/res/cardsfolder/c/cache_raiders.txt | 2 +- forge-gui/res/cardsfolder/c/cadaverous_bloom.txt | 2 +- forge-gui/res/cardsfolder/c/cagemail.txt | 2 +- forge-gui/res/cardsfolder/c/calciform_pools.txt | 2 +- forge-gui/res/cardsfolder/c/calcite_snapper.txt | 2 +- forge-gui/res/cardsfolder/c/caldera_hellion.txt | 2 +- forge-gui/res/cardsfolder/c/call_for_blood.txt | 2 +- forge-gui/res/cardsfolder/c/call_the_gatewatch.txt | 2 +- forge-gui/res/cardsfolder/c/call_to_arms.txt | 2 +- forge-gui/res/cardsfolder/c/call_to_glory.txt | 2 +- forge-gui/res/cardsfolder/c/call_to_the_grave.txt | 2 +- forge-gui/res/cardsfolder/c/callous_deceiver.txt | 2 +- forge-gui/res/cardsfolder/c/callous_oppressor.txt | 2 +- forge-gui/res/cardsfolder/c/calming_licid.txt | 2 +- forge-gui/res/cardsfolder/c/calming_verse.txt | 2 +- forge-gui/res/cardsfolder/c/caltrops.txt | 2 +- forge-gui/res/cardsfolder/c/camel.txt | 2 +- forge-gui/res/cardsfolder/c/candelabra_of_tawnos.txt | 2 +- forge-gui/res/cardsfolder/c/cankerous_thirst.txt | 2 +- forge-gui/res/cardsfolder/c/cannibalize.txt | 2 +- forge-gui/res/cardsfolder/c/canopy_claws.txt | 2 +- forge-gui/res/cardsfolder/c/cantivore.txt | 2 +- forge-gui/res/cardsfolder/c/canyon_drake.txt | 2 +- forge-gui/res/cardsfolder/c/captain_of_the_mists.txt | 2 +- forge-gui/res/cardsfolder/c/captains_maneuver.txt | 2 +- forge-gui/res/cardsfolder/c/captivating_vampire.txt | 2 +- forge-gui/res/cardsfolder/c/caregiver.txt | 2 +- forge-gui/res/cardsfolder/c/carnage_altar.txt | 2 +- forge-gui/res/cardsfolder/c/carnival_of_souls.txt | 2 +- forge-gui/res/cardsfolder/c/carom.txt | 2 +- forge-gui/res/cardsfolder/c/carpet_of_flowers.txt | 4 ++-- forge-gui/res/cardsfolder/c/carrion.txt | 2 +- forge-gui/res/cardsfolder/c/carrion_rats.txt | 2 +- forge-gui/res/cardsfolder/c/cartel_aristocrat.txt | 2 +- forge-gui/res/cardsfolder/c/cascade_bluffs.txt | 2 +- forge-gui/res/cardsfolder/c/castle_sengir.txt | 2 +- forge-gui/res/cardsfolder/c/cataclysm.txt | 2 +- forge-gui/res/cardsfolder/c/cataclysmic_gearhulk.txt | 2 +- forge-gui/res/cardsfolder/c/catalyst_stone.txt | 2 +- forge-gui/res/cardsfolder/c/catapult_master.txt | 2 +- forge-gui/res/cardsfolder/c/cateran_brute.txt | 2 +- forge-gui/res/cardsfolder/c/cateran_enforcer.txt | 2 +- forge-gui/res/cardsfolder/c/cateran_kidnappers.txt | 2 +- forge-gui/res/cardsfolder/c/cateran_overlord.txt | 2 +- forge-gui/res/cardsfolder/c/cateran_persuader.txt | 2 +- forge-gui/res/cardsfolder/c/cateran_slaver.txt | 2 +- forge-gui/res/cardsfolder/c/cateran_summons.txt | 2 +- forge-gui/res/cardsfolder/c/cathedral_of_serra.txt | 2 +- forge-gui/res/cardsfolder/c/cauldron_of_souls.txt | 2 +- forge-gui/res/cardsfolder/c/caverns_of_despair.txt | 2 +- forge-gui/res/cardsfolder/c/celestial_convergence.txt | 4 ++-- forge-gui/res/cardsfolder/c/celestial_dawn.txt | 2 +- forge-gui/res/cardsfolder/c/celestial_kirin.txt | 4 ++-- forge-gui/res/cardsfolder/c/celestial_prism.txt | 2 +- forge-gui/res/cardsfolder/c/cemetery_puca.txt | 2 +- forge-gui/res/cardsfolder/c/centaur_garden.txt | 2 +- forge-gui/res/cardsfolder/c/centaur_vinecrasher.txt | 2 +- forge-gui/res/cardsfolder/c/cephalid_aristocrat.txt | 2 +- forge-gui/res/cardsfolder/c/cephalid_broker.txt | 2 +- forge-gui/res/cardsfolder/c/cephalid_coliseum.txt | 2 +- forge-gui/res/cardsfolder/c/cephalid_illusionist.txt | 2 +- forge-gui/res/cardsfolder/c/cephalid_inkshrouder.txt | 2 +- forge-gui/res/cardsfolder/c/cephalid_shrine.txt | 2 +- forge-gui/res/cardsfolder/c/cephalid_snitch.txt | 4 ++-- forge-gui/res/cardsfolder/c/cephalid_vandal.txt | 2 +- forge-gui/res/cardsfolder/c/cerebral_vortex.txt | 2 +- forge-gui/res/cardsfolder/c/cerulean_wisps.txt | 2 +- forge-gui/res/cardsfolder/c/ceta_disciple.txt | 2 +- forge-gui/res/cardsfolder/c/ceta_sanctuary.txt | 2 +- forge-gui/res/cardsfolder/c/cetavolver.txt | 2 +- forge-gui/res/cardsfolder/c/chain_of_acid.txt | 2 +- forge-gui/res/cardsfolder/c/chain_of_smog.txt | 2 +- forge-gui/res/cardsfolder/c/chain_stasis.txt | 2 +- forge-gui/res/cardsfolder/c/chains_of_mephistopheles.txt | 2 +- forge-gui/res/cardsfolder/c/chalice_of_the_void.txt | 2 +- forge-gui/res/cardsfolder/c/chamber_of_manipulation.txt | 2 +- forge-gui/res/cardsfolder/c/champion_of_stray_souls.txt | 2 +- forge-gui/res/cardsfolder/c/chance_encounter.txt | 2 +- forge-gui/res/cardsfolder/c/chandra_ablaze.txt | 2 +- forge-gui/res/cardsfolder/c/chandra_pyromaster.txt | 2 +- forge-gui/res/cardsfolder/c/changeling_berserker.txt | 2 +- forge-gui/res/cardsfolder/c/changeling_hero.txt | 2 +- forge-gui/res/cardsfolder/c/changeling_titan.txt | 2 +- forge-gui/res/cardsfolder/c/channel.txt | 2 +- forge-gui/res/cardsfolder/c/channel_the_suns.txt | 2 +- forge-gui/res/cardsfolder/c/chaos_harlequin.txt | 2 +- forge-gui/res/cardsfolder/c/chaos_lord.txt | 2 +- forge-gui/res/cardsfolder/c/chaos_moon.txt | 4 ++-- forge-gui/res/cardsfolder/c/chaoslace.txt | 4 ++-- forge-gui/res/cardsfolder/c/chaosphere.txt | 2 +- forge-gui/res/cardsfolder/c/charge_across_the_araba.txt | 2 +- forge-gui/res/cardsfolder/c/chariot_of_the_sun.txt | 2 +- forge-gui/res/cardsfolder/c/charm_peddler.txt | 2 +- forge-gui/res/cardsfolder/c/charnel_troll.txt | 2 +- forge-gui/res/cardsfolder/c/cheering_fanatic.txt | 2 +- forge-gui/res/cardsfolder/c/chief_engineer.txt | 2 +- forge-gui/res/cardsfolder/c/chill.txt | 2 +- forge-gui/res/cardsfolder/c/chill_haunting.txt | 2 +- forge-gui/res/cardsfolder/c/chill_of_foreboding.txt | 2 +- forge-gui/res/cardsfolder/c/chilling_shade.txt | 2 +- forge-gui/res/cardsfolder/c/chimeric_coils.txt | 2 +- forge-gui/res/cardsfolder/c/chimeric_idol.txt | 2 +- forge-gui/res/cardsfolder/c/chimeric_mass.txt | 2 +- forge-gui/res/cardsfolder/c/chimeric_staff.txt | 2 +- forge-gui/res/cardsfolder/c/choice_of_damnations.txt | 2 +- forge-gui/res/cardsfolder/c/choke.txt | 2 +- forge-gui/res/cardsfolder/c/chromatic_armor.txt | 2 +- forge-gui/res/cardsfolder/c/chromatic_sphere.txt | 2 +- forge-gui/res/cardsfolder/c/chromatic_star.txt | 2 +- forge-gui/res/cardsfolder/c/chromescale_drake.txt | 2 +- forge-gui/res/cardsfolder/c/chromeshell_crab.txt | 2 +- forge-gui/res/cardsfolder/c/chronatog.txt | 2 +- forge-gui/res/cardsfolder/c/chronatog_avatar.txt | 2 +- forge-gui/res/cardsfolder/c/cinder_seer.txt | 2 +- forge-gui/res/cardsfolder/c/cinderhaze_wretch.txt | 2 +- forge-gui/res/cardsfolder/c/circle_of_despair.txt | 2 +- forge-gui/res/cardsfolder/c/circle_of_protection_black.txt | 2 +- forge-gui/res/cardsfolder/c/circle_of_protection_blue.txt | 2 +- forge-gui/res/cardsfolder/c/circle_of_protection_green.txt | 2 +- forge-gui/res/cardsfolder/c/circle_of_protection_red.txt | 2 +- forge-gui/res/cardsfolder/c/circle_of_protection_shadow.txt | 2 +- forge-gui/res/cardsfolder/c/circle_of_protection_white.txt | 2 +- forge-gui/res/cardsfolder/c/circling_vultures.txt | 2 +- forge-gui/res/cardsfolder/c/circuitous_route.txt | 2 +- forge-gui/res/cardsfolder/c/citadel_of_pain.txt | 2 +- forge-gui/res/cardsfolder/c/citanul_flute.txt | 2 +- forge-gui/res/cardsfolder/c/city_in_a_bottle.txt | 4 ++-- forge-gui/res/cardsfolder/c/city_of_shadows.txt | 2 +- forge-gui/res/cardsfolder/c/city_of_solitude.txt | 2 +- forge-gui/res/cardsfolder/c/city_of_traitors.txt | 2 +- forge-gui/res/cardsfolder/c/civic_guildmage.txt | 2 +- .../res/cardsfolder/c/civilized_scholar_homicidal_brute.txt | 2 +- forge-gui/res/cardsfolder/c/clairvoyance.txt | 2 +- forge-gui/res/cardsfolder/c/clarion_ultimatum.txt | 2 +- forge-gui/res/cardsfolder/c/clash_of_realities.txt | 2 +- forge-gui/res/cardsfolder/c/claws_of_gix.txt | 2 +- forge-gui/res/cardsfolder/c/cleanse.txt | 2 +- forge-gui/res/cardsfolder/c/cleansing.txt | 2 +- forge-gui/res/cardsfolder/c/cleansing_beam.txt | 2 +- forge-gui/res/cardsfolder/c/clear_the_land.txt | 2 +- forge-gui/res/cardsfolder/c/cliffside_market.txt | 4 ++-- forge-gui/res/cardsfolder/c/cloak_of_confusion.txt | 2 +- forge-gui/res/cardsfolder/c/clock_of_omens.txt | 4 ++-- forge-gui/res/cardsfolder/c/clockspinning.txt | 2 +- forge-gui/res/cardsfolder/c/cloud_key.txt | 2 +- forge-gui/res/cardsfolder/c/cloudpost.txt | 2 +- forge-gui/res/cardsfolder/c/cloudstone_curio.txt | 2 +- forge-gui/res/cardsfolder/c/cloven_casting.txt | 2 +- forge-gui/res/cardsfolder/c/coal_golem.txt | 2 +- forge-gui/res/cardsfolder/c/coalhauler_swine.txt | 2 +- forge-gui/res/cardsfolder/c/coalition_victory.txt | 2 +- forge-gui/res/cardsfolder/c/coastal_wizard.txt | 2 +- forge-gui/res/cardsfolder/c/coat_of_arms.txt | 2 +- .../res/cardsfolder/c/coax_from_the_blind_eternities.txt | 2 +- forge-gui/res/cardsfolder/c/cocoon.txt | 2 +- forge-gui/res/cardsfolder/c/coffin_puppets.txt | 2 +- forge-gui/res/cardsfolder/c/coffin_purge.txt | 2 +- forge-gui/res/cardsfolder/c/cognivore.txt | 2 +- forge-gui/res/cardsfolder/c/cold_snap.txt | 2 +- forge-gui/res/cardsfolder/c/cold_storage.txt | 2 +- forge-gui/res/cardsfolder/c/colfenors_plans.txt | 2 +- forge-gui/res/cardsfolder/c/collapsing_borders.txt | 2 +- forge-gui/res/cardsfolder/c/collateral_damage.txt | 2 +- forge-gui/res/cardsfolder/c/collective_voyage.txt | 2 +- forge-gui/res/cardsfolder/c/combust.txt | 2 +- forge-gui/res/cardsfolder/c/command_beacon.txt | 4 ++-- forge-gui/res/cardsfolder/c/commandeer.txt | 2 +- forge-gui/res/cardsfolder/c/commanders_sphere.txt | 2 +- forge-gui/res/cardsfolder/c/common_cause.txt | 2 +- forge-gui/res/cardsfolder/c/commune_with_lava.txt | 2 +- forge-gui/res/cardsfolder/c/companion_of_the_trials.txt | 2 +- forge-gui/res/cardsfolder/c/complex_automaton.txt | 2 +- forge-gui/res/cardsfolder/c/composite_golem.txt | 2 +- forge-gui/res/cardsfolder/c/compost.txt | 2 +- forge-gui/res/cardsfolder/c/compulsion.txt | 2 +- forge-gui/res/cardsfolder/c/conclave_guildmage.txt | 2 +- forge-gui/res/cardsfolder/c/concordant_crossroads.txt | 2 +- forge-gui/res/cardsfolder/c/conduit_of_ruin.txt | 2 +- forge-gui/res/cardsfolder/c/confiscation_coup.txt | 2 +- forge-gui/res/cardsfolder/c/confusion_in_the_ranks.txt | 2 +- forge-gui/res/cardsfolder/c/conjured_currency.txt | 2 +- forge-gui/res/cardsfolder/c/conjurers_closet.txt | 2 +- forge-gui/res/cardsfolder/c/consecrate_land.txt | 2 +- forge-gui/res/cardsfolder/c/consign_to_dream.txt | 2 +- forge-gui/res/cardsfolder/c/conspiracy.txt | 4 ++-- forge-gui/res/cardsfolder/c/consulate_crackdown.txt | 2 +- forge-gui/res/cardsfolder/c/consult_the_necrosages.txt | 2 +- forge-gui/res/cardsfolder/c/consuming_ferocity.txt | 2 +- forge-gui/res/cardsfolder/c/contagion.txt | 2 +- forge-gui/res/cardsfolder/c/contamination.txt | 2 +- forge-gui/res/cardsfolder/c/contested_cliffs.txt | 2 +- forge-gui/res/cardsfolder/c/contingency_plan.txt | 2 +- forge-gui/res/cardsfolder/c/contract_from_below.txt | 4 ++-- forge-gui/res/cardsfolder/c/controlled_instincts.txt | 2 +- forge-gui/res/cardsfolder/c/conundrum_sphinx.txt | 2 +- forge-gui/res/cardsfolder/c/conversion.txt | 2 +- forge-gui/res/cardsfolder/c/convincing_mirage.txt | 2 +- forge-gui/res/cardsfolder/c/convulsing_licid.txt | 2 +- forge-gui/res/cardsfolder/c/cooperation.txt | 2 +- forge-gui/res/cardsfolder/c/coordinated_barrage.txt | 2 +- forge-gui/res/cardsfolder/c/copper_carapace.txt | 2 +- forge-gui/res/cardsfolder/c/copper_leaf_angel.txt | 2 +- forge-gui/res/cardsfolder/c/copper_tablet.txt | 2 +- forge-gui/res/cardsfolder/c/copperhoof_vorrac.txt | 2 +- forge-gui/res/cardsfolder/c/copy_enchantment.txt | 2 +- forge-gui/res/cardsfolder/c/coral_fighters.txt | 2 +- forge-gui/res/cardsfolder/c/coral_helm.txt | 2 +- forge-gui/res/cardsfolder/c/coral_net.txt | 2 +- forge-gui/res/cardsfolder/c/coral_reef.txt | 2 +- forge-gui/res/cardsfolder/c/coral_trickster.txt | 2 +- forge-gui/res/cardsfolder/c/coretapper.txt | 4 ++-- forge-gui/res/cardsfolder/c/cornered_market.txt | 2 +- forge-gui/res/cardsfolder/c/corpse_augur.txt | 2 +- forge-gui/res/cardsfolder/c/corpse_blockade.txt | 2 +- forge-gui/res/cardsfolder/c/corpse_connoisseur.txt | 2 +- forge-gui/res/cardsfolder/c/corpse_harvester.txt | 2 +- forge-gui/res/cardsfolder/c/corpse_lunge.txt | 2 +- forge-gui/res/cardsfolder/c/corpse_traders.txt | 2 +- forge-gui/res/cardsfolder/c/corpseweft.txt | 2 +- forge-gui/res/cardsfolder/c/corrupted_crossroads.txt | 2 +- forge-gui/res/cardsfolder/c/corrupted_grafstone.txt | 2 +- forge-gui/res/cardsfolder/c/corrupted_harvester.txt | 2 +- forge-gui/res/cardsfolder/c/corrupted_resolve.txt | 2 +- forge-gui/res/cardsfolder/c/corrupted_roots.txt | 2 +- forge-gui/res/cardsfolder/c/corrupting_licid.txt | 2 +- forge-gui/res/cardsfolder/c/cosmic_larva.txt | 2 +- forge-gui/res/cardsfolder/c/council_of_the_absolute.txt | 2 +- forge-gui/res/cardsfolder/c/court_hussar.txt | 2 +- forge-gui/res/cardsfolder/c/courtly_provocateur.txt | 2 +- forge-gui/res/cardsfolder/c/covetous_dragon.txt | 2 +- forge-gui/res/cardsfolder/c/cowardice.txt | 2 +- forge-gui/res/cardsfolder/c/crack_the_earth.txt | 2 +- forge-gui/res/cardsfolder/c/crackdown.txt | 2 +- forge-gui/res/cardsfolder/c/crackling_perimeter.txt | 2 +- forge-gui/res/cardsfolder/c/cradle_of_vitality.txt | 2 +- forge-gui/res/cardsfolder/c/crag_puca.txt | 2 +- forge-gui/res/cardsfolder/c/crag_saurian.txt | 2 +- forge-gui/res/cardsfolder/c/cranial_archive.txt | 2 +- forge-gui/res/cardsfolder/c/crater_elemental.txt | 2 +- forge-gui/res/cardsfolder/c/crawling_filth.txt | 2 +- forge-gui/res/cardsfolder/c/crawlspace.txt | 2 +- forge-gui/res/cardsfolder/c/crazed_armodon.txt | 2 +- forge-gui/res/cardsfolder/c/cream_of_the_crop.txt | 2 +- forge-gui/res/cardsfolder/c/credit_voucher.txt | 4 ++-- forge-gui/res/cardsfolder/c/creeping_renaissance.txt | 2 +- forge-gui/res/cardsfolder/c/crescendo_of_war.txt | 2 +- forge-gui/res/cardsfolder/c/crested_craghorn.txt | 2 +- forge-gui/res/cardsfolder/c/crevasse.txt | 2 +- forge-gui/res/cardsfolder/c/crook_of_condemnation.txt | 2 +- forge-gui/res/cardsfolder/c/crookclaw_transmuter.txt | 2 +- forge-gui/res/cardsfolder/c/crooked_scales.txt | 2 +- forge-gui/res/cardsfolder/c/crop_rotation.txt | 2 +- forge-gui/res/cardsfolder/c/crosiss_attendant.txt | 2 +- forge-gui/res/cardsfolder/c/crossbow_ambush.txt | 2 +- forge-gui/res/cardsfolder/c/crosswinds.txt | 2 +- forge-gui/res/cardsfolder/c/crovax_the_cursed.txt | 2 +- forge-gui/res/cardsfolder/c/crown_of_ascension.txt | 2 +- forge-gui/res/cardsfolder/c/crown_of_awe.txt | 2 +- forge-gui/res/cardsfolder/c/crown_of_convergence.txt | 2 +- forge-gui/res/cardsfolder/c/crown_of_doom.txt | 2 +- forge-gui/res/cardsfolder/c/crown_of_empires.txt | 2 +- forge-gui/res/cardsfolder/c/crown_of_fury.txt | 2 +- forge-gui/res/cardsfolder/c/crown_of_suspicion.txt | 2 +- forge-gui/res/cardsfolder/c/crown_of_the_ages.txt | 2 +- forge-gui/res/cardsfolder/c/crown_of_vigor.txt | 2 +- forge-gui/res/cardsfolder/c/crucible_of_fire.txt | 2 +- .../res/cardsfolder/c/crucible_of_the_spirit_dragon.txt | 2 +- forge-gui/res/cardsfolder/c/cruel_deceiver.txt | 2 +- forge-gui/res/cardsfolder/c/cruel_fate.txt | 2 +- forge-gui/res/cardsfolder/c/cruel_sadist.txt | 2 +- forge-gui/res/cardsfolder/c/crumbling_sanctuary.txt | 2 +- forge-gui/res/cardsfolder/c/crusading_knight.txt | 2 +- forge-gui/res/cardsfolder/c/crush_of_tentacles.txt | 2 +- forge-gui/res/cardsfolder/c/crush_underfoot.txt | 2 +- forge-gui/res/cardsfolder/c/crypt_creeper.txt | 2 +- forge-gui/res/cardsfolder/c/crypt_of_agadeem.txt | 2 +- forge-gui/res/cardsfolder/c/cryptbreaker.txt | 2 +- forge-gui/res/cardsfolder/c/cryptic_gateway.txt | 2 +- forge-gui/res/cardsfolder/c/cryptoplasm.txt | 2 +- forge-gui/res/cardsfolder/c/crystal_chimes.txt | 2 +- forge-gui/res/cardsfolder/c/crystal_quarry.txt | 2 +- forge-gui/res/cardsfolder/c/crystal_rod.txt | 2 +- forge-gui/res/cardsfolder/c/crystal_seer.txt | 2 +- forge-gui/res/cardsfolder/c/crystal_shard.txt | 2 +- forge-gui/res/cardsfolder/c/crystal_spray.txt | 4 ++-- forge-gui/res/cardsfolder/c/crystal_vein.txt | 2 +- forge-gui/res/cardsfolder/c/culling_dais.txt | 2 +- forge-gui/res/cardsfolder/c/culling_mark.txt | 2 +- forge-gui/res/cardsfolder/c/culling_scales.txt | 2 +- forge-gui/res/cardsfolder/c/culling_the_weak.txt | 4 ++-- forge-gui/res/cardsfolder/c/cultural_exchange.txt | 2 +- forge-gui/res/cardsfolder/c/cunning_giant.txt | 2 +- forge-gui/res/cardsfolder/c/cunning_wish.txt | 2 +- forge-gui/res/cardsfolder/c/cuombajj_witches.txt | 2 +- forge-gui/res/cardsfolder/c/curfew.txt | 2 +- forge-gui/res/cardsfolder/c/curse_artifact.txt | 2 +- forge-gui/res/cardsfolder/c/curse_of_chaos.txt | 2 +- forge-gui/res/cardsfolder/c/curse_of_echoes.txt | 2 +- forge-gui/res/cardsfolder/c/curse_of_marit_lage.txt | 2 +- forge-gui/res/cardsfolder/c/curse_of_the_swine.txt | 2 +- forge-gui/res/cardsfolder/c/curse_of_wizardry.txt | 2 +- forge-gui/res/cardsfolder/c/cursed_totem.txt | 2 +- forge-gui/res/cardsfolder/c/customs_depot.txt | 2 +- forge-gui/res/cardsfolder/c/cyclical_evolution.txt | 2 +- forge-gui/res/cardsfolder/c/cyclone.txt | 2 +- forge-gui/res/cardsfolder/c/cyclopean_tomb.txt | 4 ++-- forge-gui/res/cardsfolder/c/cytoplast_manipulator.txt | 2 +- forge-gui/res/cardsfolder/c/cytoshape.txt | 2 +- forge-gui/res/cardsfolder/d/dack_fayden.txt | 2 +- forge-gui/res/cardsfolder/d/daghatar_the_adamant.txt | 2 +- forge-gui/res/cardsfolder/d/dakkon_blackblade_avatar.txt | 2 +- forge-gui/res/cardsfolder/d/dakmor_salvage.txt | 2 +- forge-gui/res/cardsfolder/d/dakra_mystic.txt | 2 +- forge-gui/res/cardsfolder/d/damping_engine.txt | 4 ++-- forge-gui/res/cardsfolder/d/damping_field.txt | 2 +- forge-gui/res/cardsfolder/d/damping_matrix.txt | 2 +- forge-gui/res/cardsfolder/d/dance_of_the_skywise.txt | 2 +- forge-gui/res/cardsfolder/d/dangerous_wager.txt | 4 ++-- forge-gui/res/cardsfolder/d/daretti_scrap_savant.txt | 2 +- forge-gui/res/cardsfolder/d/darigaazs_attendant.txt | 2 +- forge-gui/res/cardsfolder/d/daring_thief.txt | 4 ++-- forge-gui/res/cardsfolder/d/dark_betrayal.txt | 2 +- forge-gui/res/cardsfolder/d/dark_deal.txt | 4 ++-- forge-gui/res/cardsfolder/d/dark_heart_of_the_wood.txt | 2 +- forge-gui/res/cardsfolder/d/dark_maze.txt | 2 +- forge-gui/res/cardsfolder/d/dark_petition.txt | 2 +- forge-gui/res/cardsfolder/d/dark_privilege.txt | 2 +- forge-gui/res/cardsfolder/d/dark_supplicant.txt | 4 ++-- forge-gui/res/cardsfolder/d/dark_temper.txt | 2 +- forge-gui/res/cardsfolder/d/dark_triumph.txt | 2 +- forge-gui/res/cardsfolder/d/dark_tutelage.txt | 2 +- forge-gui/res/cardsfolder/d/darkest_hour.txt | 2 +- forge-gui/res/cardsfolder/d/darkheart_sliver.txt | 2 +- forge-gui/res/cardsfolder/d/darkpact.txt | 4 ++-- forge-gui/res/cardsfolder/d/darksteel_forge.txt | 2 +- forge-gui/res/cardsfolder/d/darksteel_mutation.txt | 2 +- forge-gui/res/cardsfolder/d/darksteel_relic.txt | 2 +- forge-gui/res/cardsfolder/d/darkwater_catacombs.txt | 2 +- forge-gui/res/cardsfolder/d/darkwater_egg.txt | 4 ++-- forge-gui/res/cardsfolder/d/daughter_of_autumn.txt | 4 ++-- forge-gui/res/cardsfolder/d/dauntless_escort.txt | 2 +- forge-gui/res/cardsfolder/d/dawn_of_the_dead.txt | 2 +- forge-gui/res/cardsfolder/d/dawnfluke.txt | 2 +- forge-gui/res/cardsfolder/d/dawnglare_invoker.txt | 2 +- forge-gui/res/cardsfolder/d/dawnray_archer.txt | 2 +- forge-gui/res/cardsfolder/d/dawns_reflection.txt | 2 +- forge-gui/res/cardsfolder/d/day_of_destiny.txt | 2 +- forge-gui/res/cardsfolder/d/days_undoing.txt | 2 +- forge-gui/res/cardsfolder/d/dazzling_reflection.txt | 2 +- forge-gui/res/cardsfolder/d/dead_iron_sledge.txt | 2 +- forge-gui/res/cardsfolder/d/dead_reckoning.txt | 2 +- forge-gui/res/cardsfolder/d/dead_ringers.txt | 2 +- forge-gui/res/cardsfolder/d/deadapult.txt | 2 +- forge-gui/res/cardsfolder/d/deadfall.txt | 2 +- forge-gui/res/cardsfolder/d/deadly_tempest.txt | 2 +- forge-gui/res/cardsfolder/d/deadly_wanderings.txt | 2 +- forge-gui/res/cardsfolder/d/deadshot.txt | 2 +- forge-gui/res/cardsfolder/d/death_bomb.txt | 2 +- forge-gui/res/cardsfolder/d/death_cloud.txt | 2 +- forge-gui/res/cardsfolder/d/death_mask_duplicant.txt | 2 +- forge-gui/res/cardsfolder/d/death_match.txt | 2 +- forge-gui/res/cardsfolder/d/death_pit_offering.txt | 2 +- forge-gui/res/cardsfolder/d/death_pits_of_rath.txt | 2 +- forge-gui/res/cardsfolder/d/death_wish.txt | 2 +- forge-gui/res/cardsfolder/d/deathbringer_regent.txt | 2 +- forge-gui/res/cardsfolder/d/deathgrip.txt | 2 +- forge-gui/res/cardsfolder/d/deathknell_kami.txt | 2 +- forge-gui/res/cardsfolder/d/deathlace.txt | 4 ++-- forge-gui/res/cardsfolder/d/deathmark_prelate.txt | 2 +- forge-gui/res/cardsfolder/d/deaths_head_buzzard.txt | 2 +- forge-gui/res/cardsfolder/d/debt_of_loyalty.txt | 2 +- forge-gui/res/cardsfolder/d/decaying_soil.txt | 2 +- forge-gui/res/cardsfolder/d/deceiver_of_form.txt | 2 +- forge-gui/res/cardsfolder/d/declaration_of_naught.txt | 2 +- forge-gui/res/cardsfolder/d/decompose.txt | 2 +- forge-gui/res/cardsfolder/d/decomposition.txt | 2 +- forge-gui/res/cardsfolder/d/decree_of_annihilation.txt | 2 +- forge-gui/res/cardsfolder/d/decree_of_justice.txt | 2 +- forge-gui/res/cardsfolder/d/decree_of_pain.txt | 2 +- forge-gui/res/cardsfolder/d/decree_of_silence.txt | 2 +- forge-gui/res/cardsfolder/d/deep_slumber_titan.txt | 2 +- forge-gui/res/cardsfolder/d/deep_water.txt | 4 ++-- forge-gui/res/cardsfolder/d/deepfire_elemental.txt | 2 +- forge-gui/res/cardsfolder/d/deeproot_waters.txt | 2 +- forge-gui/res/cardsfolder/d/deepwood_elder.txt | 6 +++--- forge-gui/res/cardsfolder/d/defense_grid.txt | 2 +- forge-gui/res/cardsfolder/d/defensive_formation.txt | 2 +- forge-gui/res/cardsfolder/d/defensive_maneuvers.txt | 2 +- forge-gui/res/cardsfolder/d/defensive_stance.txt | 2 +- forge-gui/res/cardsfolder/d/defiant_stand.txt | 2 +- forge-gui/res/cardsfolder/d/deflection.txt | 2 +- forge-gui/res/cardsfolder/d/deftblade_elite.txt | 2 +- forge-gui/res/cardsfolder/d/dega_sanctuary.txt | 2 +- forge-gui/res/cardsfolder/d/degavolver.txt | 2 +- forge-gui/res/cardsfolder/d/deicide.txt | 2 +- forge-gui/res/cardsfolder/d/delaying_shield.txt | 2 +- forge-gui/res/cardsfolder/d/delifs_cone.txt | 2 +- forge-gui/res/cardsfolder/d/delifs_cube.txt | 2 +- forge-gui/res/cardsfolder/d/delirium_skeins.txt | 2 +- forge-gui/res/cardsfolder/d/dementia_sliver.txt | 4 ++-- forge-gui/res/cardsfolder/d/demon_of_wailing_agonies.txt | 2 +- forge-gui/res/cardsfolder/d/demonic_appetite.txt | 2 +- forge-gui/res/cardsfolder/d/demonic_attorney.txt | 4 ++-- forge-gui/res/cardsfolder/d/demonic_collusion.txt | 2 +- forge-gui/res/cardsfolder/d/demonic_consultation.txt | 2 +- forge-gui/res/cardsfolder/d/demonic_pact.txt | 2 +- forge-gui/res/cardsfolder/d/demonic_taskmaster.txt | 2 +- forge-gui/res/cardsfolder/d/demonic_tutor.txt | 2 +- forge-gui/res/cardsfolder/d/demonmail_hauberk.txt | 2 +- forge-gui/res/cardsfolder/d/demons_horn.txt | 2 +- forge-gui/res/cardsfolder/d/demoralize.txt | 2 +- forge-gui/res/cardsfolder/d/dense_canopy.txt | 2 +- forge-gui/res/cardsfolder/d/dense_foliage.txt | 2 +- forge-gui/res/cardsfolder/d/denying_wind.txt | 2 +- forge-gui/res/cardsfolder/d/deploy_the_gatewatch.txt | 2 +- forge-gui/res/cardsfolder/d/descendant_of_masumaro.txt | 2 +- forge-gui/res/cardsfolder/d/descendants_path.txt | 2 +- forge-gui/res/cardsfolder/d/descent_into_madness.txt | 4 ++-- forge-gui/res/cardsfolder/d/descent_of_the_dragons.txt | 2 +- forge-gui/res/cardsfolder/d/desecration_elemental.txt | 2 +- forge-gui/res/cardsfolder/d/deserters_quarters.txt | 2 +- forge-gui/res/cardsfolder/d/desolate_lighthouse.txt | 2 +- forge-gui/res/cardsfolder/d/desolation.txt | 4 ++-- forge-gui/res/cardsfolder/d/desolation_angel.txt | 2 +- forge-gui/res/cardsfolder/d/desolation_giant.txt | 4 ++-- forge-gui/res/cardsfolder/d/desperate_gambit.txt | 2 +- forge-gui/res/cardsfolder/d/desperate_research.txt | 4 ++-- forge-gui/res/cardsfolder/d/despotic_scepter.txt | 2 +- forge-gui/res/cardsfolder/d/destructive_flow.txt | 2 +- forge-gui/res/cardsfolder/d/destructive_force.txt | 2 +- forge-gui/res/cardsfolder/d/detainment_spell.txt | 2 +- forge-gui/res/cardsfolder/d/detection_tower.txt | 2 +- forge-gui/res/cardsfolder/d/detritivore.txt | 2 +- forge-gui/res/cardsfolder/d/devastating_dreams.txt | 2 +- forge-gui/res/cardsfolder/d/devastating_summons.txt | 2 +- forge-gui/res/cardsfolder/d/devoted_caretaker.txt | 2 +- forge-gui/res/cardsfolder/d/devoted_druid.txt | 2 +- forge-gui/res/cardsfolder/d/devouring_greed.txt | 4 ++-- forge-gui/res/cardsfolder/d/devouring_rage.txt | 4 ++-- forge-gui/res/cardsfolder/d/devouring_strossus.txt | 2 +- forge-gui/res/cardsfolder/d/diabolic_intent.txt | 2 +- forge-gui/res/cardsfolder/d/diabolic_revelation.txt | 2 +- forge-gui/res/cardsfolder/d/diabolic_tutor.txt | 2 +- forge-gui/res/cardsfolder/d/diabolic_vision.txt | 2 +- forge-gui/res/cardsfolder/d/diamond_faerie.txt | 2 +- forge-gui/res/cardsfolder/d/diamond_faerie_avatar.txt | 2 +- forge-gui/res/cardsfolder/d/diamond_valley.txt | 2 +- forge-gui/res/cardsfolder/d/dichotomancy.txt | 2 +- forge-gui/res/cardsfolder/d/dictate_of_the_twin_gods.txt | 2 +- forge-gui/res/cardsfolder/d/didgeridoo.txt | 2 +- forge-gui/res/cardsfolder/d/diminish.txt | 2 +- forge-gui/res/cardsfolder/d/diminishing_returns.txt | 2 +- forge-gui/res/cardsfolder/d/dimir_charm.txt | 2 +- forge-gui/res/cardsfolder/d/dimir_cluestone.txt | 2 +- forge-gui/res/cardsfolder/d/dimir_doppelganger.txt | 2 +- forge-gui/res/cardsfolder/d/dimir_keyrune.txt | 2 +- forge-gui/res/cardsfolder/d/dimir_locket.txt | 2 +- forge-gui/res/cardsfolder/d/dimir_machinations.txt | 2 +- forge-gui/res/cardsfolder/d/dimir_signet.txt | 2 +- forge-gui/res/cardsfolder/d/dingus_egg.txt | 2 +- forge-gui/res/cardsfolder/d/dingus_staff.txt | 2 +- forge-gui/res/cardsfolder/d/dire_wolves.txt | 2 +- forge-gui/res/cardsfolder/d/disallow.txt | 2 +- forge-gui/res/cardsfolder/d/disappearing_act.txt | 2 +- forge-gui/res/cardsfolder/d/disarm.txt | 2 +- forge-gui/res/cardsfolder/d/disaster_radius.txt | 2 +- forge-gui/res/cardsfolder/d/disciple_of_bolas.txt | 2 +- forge-gui/res/cardsfolder/d/disciple_of_griselbrand.txt | 2 +- forge-gui/res/cardsfolder/d/disciple_of_kangee.txt | 2 +- forge-gui/res/cardsfolder/d/discombobulate.txt | 2 +- forge-gui/res/cardsfolder/d/disharmony.txt | 2 +- forge-gui/res/cardsfolder/d/disorder.txt | 2 +- forge-gui/res/cardsfolder/d/dispatch.txt | 2 +- forge-gui/res/cardsfolder/d/dispersal_shield.txt | 2 +- forge-gui/res/cardsfolder/d/dispersing_orb.txt | 2 +- forge-gui/res/cardsfolder/d/displace.txt | 4 ++-- forge-gui/res/cardsfolder/d/display_of_dominance.txt | 2 +- forge-gui/res/cardsfolder/d/dispossess.txt | 2 +- forge-gui/res/cardsfolder/d/disrupting_shoal.txt | 2 +- forge-gui/res/cardsfolder/d/distant_melody.txt | 2 +- forge-gui/res/cardsfolder/d/distant_memories.txt | 2 +- forge-gui/res/cardsfolder/d/distorting_lens.txt | 4 ++-- forge-gui/res/cardsfolder/d/divebomber_griffin.txt | 2 +- forge-gui/res/cardsfolder/d/divergent_growth.txt | 2 +- forge-gui/res/cardsfolder/d/diversionary_tactics.txt | 2 +- forge-gui/res/cardsfolder/d/divert.txt | 2 +- forge-gui/res/cardsfolder/d/divine_intervention.txt | 4 ++-- forge-gui/res/cardsfolder/d/divine_light.txt | 2 +- forge-gui/res/cardsfolder/d/divine_presence.txt | 2 +- forge-gui/res/cardsfolder/d/divine_reckoning.txt | 2 +- forge-gui/res/cardsfolder/d/divining_witch.txt | 2 +- forge-gui/res/cardsfolder/d/dizzy_spell.txt | 4 ++-- forge-gui/res/cardsfolder/d/djinn_illuminatus.txt | 2 +- forge-gui/res/cardsfolder/d/djinn_of_infinite_deceits.txt | 2 +- forge-gui/res/cardsfolder/d/djinn_of_wishes.txt | 2 +- forge-gui/res/cardsfolder/d/dogpile.txt | 2 +- forge-gui/res/cardsfolder/d/dominarias_judgment.txt | 2 +- forge-gui/res/cardsfolder/d/dominate.txt | 2 +- forge-gui/res/cardsfolder/d/dominating_licid.txt | 2 +- forge-gui/res/cardsfolder/d/domineering_will.txt | 2 +- forge-gui/res/cardsfolder/d/donate.txt | 2 +- forge-gui/res/cardsfolder/d/doomgape.txt | 2 +- forge-gui/res/cardsfolder/d/doomsday.txt | 2 +- forge-gui/res/cardsfolder/d/door_of_destinies.txt | 2 +- forge-gui/res/cardsfolder/d/door_to_nothingness.txt | 2 +- forge-gui/res/cardsfolder/d/doubling_chant.txt | 2 +- forge-gui/res/cardsfolder/d/doubling_cube.txt | 2 +- forge-gui/res/cardsfolder/d/douse.txt | 2 +- forge-gui/res/cardsfolder/d/drafnas_restoration.txt | 4 ++-- forge-gui/res/cardsfolder/d/dragon_appeasement.txt | 2 +- forge-gui/res/cardsfolder/d/dragon_arch.txt | 2 +- forge-gui/res/cardsfolder/d/dragon_mask.txt | 2 +- forge-gui/res/cardsfolder/d/dragon_throne_of_tarkir.txt | 2 +- forge-gui/res/cardsfolder/d/dragonrage.txt | 2 +- forge-gui/res/cardsfolder/d/dragons_claw.txt | 2 +- forge-gui/res/cardsfolder/d/dragonshift.txt | 2 +- forge-gui/res/cardsfolder/d/dragonstorm.txt | 2 +- forge-gui/res/cardsfolder/d/drake_skull_cameo.txt | 2 +- forge-gui/res/cardsfolder/d/dralnu_lich_lord.txt | 2 +- forge-gui/res/cardsfolder/d/dralnus_crusade.txt | 2 +- forge-gui/res/cardsfolder/d/dralnus_pet.txt | 2 +- forge-gui/res/cardsfolder/d/dramatic_entrance.txt | 2 +- forge-gui/res/cardsfolder/d/dread_charge.txt | 2 +- forge-gui/res/cardsfolder/d/dread_of_night.txt | 2 +- forge-gui/res/cardsfolder/d/dreadship_reef.txt | 2 +- forge-gui/res/cardsfolder/d/dream_chisel.txt | 2 +- forge-gui/res/cardsfolder/d/dream_coat.txt | 2 +- forge-gui/res/cardsfolder/d/dream_halls.txt | 2 +- forge-gui/res/cardsfolder/d/dream_salvage.txt | 4 ++-- forge-gui/res/cardsfolder/d/dream_stalker.txt | 2 +- forge-gui/res/cardsfolder/d/dream_thrush.txt | 2 +- forge-gui/res/cardsfolder/d/dream_tides.txt | 2 +- forge-gui/res/cardsfolder/d/dreamborn_muse.txt | 2 +- forge-gui/res/cardsfolder/d/dreamcatcher.txt | 2 +- forge-gui/res/cardsfolder/d/dreams_grip.txt | 2 +- forge-gui/res/cardsfolder/d/dreams_of_the_dead.txt | 2 +- forge-gui/res/cardsfolder/d/dreamwinder.txt | 2 +- forge-gui/res/cardsfolder/d/dredge.txt | 2 +- forge-gui/res/cardsfolder/d/dregs_of_sorrow.txt | 2 +- forge-gui/res/cardsfolder/d/drift_of_the_dead.txt | 2 +- forge-gui/res/cardsfolder/d/dromar_the_banisher.txt | 2 +- forge-gui/res/cardsfolder/d/dromars_attendant.txt | 2 +- forge-gui/res/cardsfolder/d/dromoka_monument.txt | 2 +- forge-gui/res/cardsfolder/d/droning_bureaucrats.txt | 2 +- forge-gui/res/cardsfolder/d/drooling_ogre.txt | 2 +- forge-gui/res/cardsfolder/d/drop_of_honey.txt | 2 +- forge-gui/res/cardsfolder/d/drown_in_filth.txt | 2 +- forge-gui/res/cardsfolder/d/drowned.txt | 2 +- forge-gui/res/cardsfolder/d/drowned_rusalka.txt | 2 +- forge-gui/res/cardsfolder/d/dryads_caress.txt | 4 ++-- forge-gui/res/cardsfolder/d/dual_casting.txt | 2 +- forge-gui/res/cardsfolder/d/dualcaster_mage.txt | 2 +- forge-gui/res/cardsfolder/d/duct_crawler.txt | 2 +- forge-gui/res/cardsfolder/d/dueling_grounds.txt | 2 +- forge-gui/res/cardsfolder/d/dukhara_peafowl.txt | 2 +- forge-gui/res/cardsfolder/d/dulcet_sirens.txt | 2 +- forge-gui/res/cardsfolder/d/duplicity.txt | 4 ++-- forge-gui/res/cardsfolder/d/dust_of_moments.txt | 4 ++-- forge-gui/res/cardsfolder/d/dwarven_armorer.txt | 2 +- forge-gui/res/cardsfolder/d/dwarven_armory.txt | 2 +- forge-gui/res/cardsfolder/d/dwarven_hold.txt | 2 +- forge-gui/res/cardsfolder/d/dwarven_patrol.txt | 2 +- forge-gui/res/cardsfolder/d/dwarven_recruiter.txt | 2 +- forge-gui/res/cardsfolder/d/dwarven_ruins.txt | 2 +- forge-gui/res/cardsfolder/d/dwarven_sea_clan.txt | 4 ++-- forge-gui/res/cardsfolder/d/dwarven_shrine.txt | 2 +- forge-gui/res/cardsfolder/d/dwarven_song.txt | 4 ++-- forge-gui/res/cardsfolder/d/dwarven_thaumaturgist.txt | 2 +- forge-gui/res/cardsfolder/d/dwarven_weaponsmith.txt | 2 +- forge-gui/res/cardsfolder/d/dwell_on_the_past.txt | 2 +- forge-gui/res/cardsfolder/d/dystopia.txt | 2 +- forge-gui/res/cardsfolder/e/early_frost.txt | 2 +- forge-gui/res/cardsfolder/e/early_harvest.txt | 2 +- forge-gui/res/cardsfolder/e/earnest_fellowship.txt | 2 +- forge-gui/res/cardsfolder/e/earth_surge.txt | 2 +- forge-gui/res/cardsfolder/e/earthbrawn.txt | 2 +- forge-gui/res/cardsfolder/e/earthcraft.txt | 2 +- forge-gui/res/cardsfolder/e/earthlink.txt | 2 +- forge-gui/res/cardsfolder/e/earthshaker.txt | 2 +- forge-gui/res/cardsfolder/e/eastern_paladin.txt | 2 +- forge-gui/res/cardsfolder/e/eater_of_hope.txt | 4 ++-- forge-gui/res/cardsfolder/e/ebon_praetor.txt | 2 +- forge-gui/res/cardsfolder/e/ebon_stronghold.txt | 2 +- forge-gui/res/cardsfolder/e/ebonblade_reaper.txt | 2 +- forge-gui/res/cardsfolder/e/ebony_charm.txt | 2 +- forge-gui/res/cardsfolder/e/ebony_horse.txt | 2 +- forge-gui/res/cardsfolder/e/echo_mage.txt | 2 +- forge-gui/res/cardsfolder/e/echoing_calm.txt | 2 +- forge-gui/res/cardsfolder/e/echoing_decay.txt | 2 +- forge-gui/res/cardsfolder/e/echoing_ruin.txt | 2 +- forge-gui/res/cardsfolder/e/edge_of_autumn.txt | 2 +- forge-gui/res/cardsfolder/e/eerie_interlude.txt | 2 +- forge-gui/res/cardsfolder/e/eerie_procession.txt | 2 +- forge-gui/res/cardsfolder/e/eidolon_of_rhetoric.txt | 2 +- forge-gui/res/cardsfolder/e/eidolon_of_the_great_revel.txt | 2 +- forge-gui/res/cardsfolder/e/eiganjo_free_riders.txt | 2 +- forge-gui/res/cardsfolder/e/eight_and_a_half_tails.txt | 2 +- forge-gui/res/cardsfolder/e/eladamri.txt | 2 +- .../res/cardsfolder/e/eladamri_lord_of_leaves_avatar.txt | 2 +- forge-gui/res/cardsfolder/e/elder_druid.txt | 2 +- forge-gui/res/cardsfolder/e/elder_pine_of_jukai.txt | 2 +- forge-gui/res/cardsfolder/e/elder_spawn.txt | 2 +- forge-gui/res/cardsfolder/e/eldrazi_temple.txt | 2 +- forge-gui/res/cardsfolder/e/elemental_augury.txt | 2 +- forge-gui/res/cardsfolder/e/elephant_resurgence.txt | 2 +- forge-gui/res/cardsfolder/e/elfhame_sanctuary.txt | 2 +- forge-gui/res/cardsfolder/e/elite_arcanist.txt | 2 +- forge-gui/res/cardsfolder/e/elkin_lair.txt | 2 +- forge-gui/res/cardsfolder/e/elsewhere_flask.txt | 2 +- .../res/cardsfolder/e/elusive_tormentor_insidious_mist.txt | 2 +- forge-gui/res/cardsfolder/e/elven_palisade.txt | 2 +- forge-gui/res/cardsfolder/e/elvish_branchbender.txt | 2 +- forge-gui/res/cardsfolder/e/elvish_harbinger.txt | 2 +- forge-gui/res/cardsfolder/e/elvish_healer.txt | 2 +- forge-gui/res/cardsfolder/e/elvish_pathcutter.txt | 2 +- forge-gui/res/cardsfolder/e/elvish_promenade.txt | 2 +- forge-gui/res/cardsfolder/e/elvish_scout.txt | 2 +- forge-gui/res/cardsfolder/e/embalmed_brawler.txt | 2 +- forge-gui/res/cardsfolder/e/embalmers_tools.txt | 2 +- forge-gui/res/cardsfolder/e/embargo.txt | 2 +- forge-gui/res/cardsfolder/e/ember_gale.txt | 2 +- forge-gui/res/cardsfolder/e/emberwilde_caliph.txt | 2 +- forge-gui/res/cardsfolder/e/embolden.txt | 2 +- forge-gui/res/cardsfolder/e/emerald_charm.txt | 2 +- forge-gui/res/cardsfolder/e/emerald_medallion.txt | 2 +- forge-gui/res/cardsfolder/e/empty_city_ruse.txt | 2 +- forge-gui/res/cardsfolder/e/empty_the_catacombs.txt | 2 +- forge-gui/res/cardsfolder/e/emrakul_the_promised_end.txt | 2 +- forge-gui/res/cardsfolder/e/emrakuls_influence.txt | 2 +- forge-gui/res/cardsfolder/e/encase_in_ice.txt | 2 +- forge-gui/res/cardsfolder/e/enchanted_evening.txt | 2 +- forge-gui/res/cardsfolder/e/enchantresss_presence.txt | 2 +- forge-gui/res/cardsfolder/e/endangered_armodon.txt | 2 +- forge-gui/res/cardsfolder/e/endemic_plague.txt | 2 +- forge-gui/res/cardsfolder/e/endless_horizons.txt | 2 +- forge-gui/res/cardsfolder/e/endless_ranks_of_the_dead.txt | 2 +- forge-gui/res/cardsfolder/e/endless_swarm.txt | 2 +- forge-gui/res/cardsfolder/e/endless_whispers.txt | 4 ++-- forge-gui/res/cardsfolder/e/endure.txt | 2 +- forge-gui/res/cardsfolder/e/enduring_ideal.txt | 2 +- forge-gui/res/cardsfolder/e/enduring_renewal.txt | 4 ++-- forge-gui/res/cardsfolder/e/energy_arc.txt | 2 +- forge-gui/res/cardsfolder/e/energy_chamber.txt | 2 +- forge-gui/res/cardsfolder/e/energy_field.txt | 2 +- forge-gui/res/cardsfolder/e/energy_flux.txt | 2 +- forge-gui/res/cardsfolder/e/energy_storm.txt | 2 +- forge-gui/res/cardsfolder/e/energy_tap.txt | 2 +- forge-gui/res/cardsfolder/e/energy_vortex.txt | 2 +- forge-gui/res/cardsfolder/e/enervate.txt | 2 +- forge-gui/res/cardsfolder/e/engineered_explosives.txt | 2 +- forge-gui/res/cardsfolder/e/enigma_eidolon.txt | 2 +- forge-gui/res/cardsfolder/e/enlightened_tutor.txt | 2 +- forge-gui/res/cardsfolder/e/enraging_licid.txt | 2 +- forge-gui/res/cardsfolder/e/enslaved_horror.txt | 2 +- forge-gui/res/cardsfolder/e/ensnare.txt | 2 +- forge-gui/res/cardsfolder/e/ensnaring_bridge.txt | 2 +- forge-gui/res/cardsfolder/e/ensoul_artifact.txt | 2 +- forge-gui/res/cardsfolder/e/entangling_trap.txt | 2 +- forge-gui/res/cardsfolder/e/enter_the_infinite.txt | 2 +- forge-gui/res/cardsfolder/e/entrancing_melody.txt | 2 +- forge-gui/res/cardsfolder/e/entropic_eidolon.txt | 2 +- forge-gui/res/cardsfolder/e/eon_hub.txt | 2 +- forge-gui/res/cardsfolder/e/epic_experiment.txt | 2 +- forge-gui/res/cardsfolder/e/epic_struggle.txt | 2 +- forge-gui/res/cardsfolder/e/epiphany_storm.txt | 2 +- forge-gui/res/cardsfolder/e/equal_treatment.txt | 2 +- forge-gui/res/cardsfolder/e/erithizon.txt | 2 +- forge-gui/res/cardsfolder/e/errand_of_duty.txt | 2 +- forge-gui/res/cardsfolder/e/erratic_mutation.txt | 2 +- forge-gui/res/cardsfolder/e/ersatz_gnomes.txt | 4 ++-- forge-gui/res/cardsfolder/e/ertai_the_corrupted.txt | 2 +- forge-gui/res/cardsfolder/e/ertais_trickery.txt | 2 +- forge-gui/res/cardsfolder/e/escape_routes.txt | 2 +- forge-gui/res/cardsfolder/e/esper_sojourners.txt | 2 +- forge-gui/res/cardsfolder/e/esperzoa.txt | 2 +- forge-gui/res/cardsfolder/e/essence_bottle.txt | 2 +- forge-gui/res/cardsfolder/e/essence_flare.txt | 2 +- forge-gui/res/cardsfolder/e/essence_leak.txt | 2 +- forge-gui/res/cardsfolder/e/etched_oracle.txt | 2 +- forge-gui/res/cardsfolder/e/etched_oracle_avatar.txt | 2 +- forge-gui/res/cardsfolder/e/eternal_dominion.txt | 2 +- forge-gui/res/cardsfolder/e/ethereal_champion.txt | 2 +- forge-gui/res/cardsfolder/e/ethersworn_canonist.txt | 2 +- forge-gui/res/cardsfolder/e/etherwrought_page.txt | 2 +- forge-gui/res/cardsfolder/e/eunuchs_intrigues.txt | 2 +- forge-gui/res/cardsfolder/e/eureka.txt | 2 +- forge-gui/res/cardsfolder/e/evaporate.txt | 2 +- forge-gui/res/cardsfolder/e/everlasting_torment.txt | 2 +- forge-gui/res/cardsfolder/e/evermind.txt | 2 +- forge-gui/res/cardsfolder/e/evershrike.txt | 2 +- forge-gui/res/cardsfolder/e/evolution_charm.txt | 2 +- forge-gui/res/cardsfolder/e/evolution_vat.txt | 2 +- forge-gui/res/cardsfolder/e/evolutionary_leap.txt | 2 +- forge-gui/res/cardsfolder/e/exalted_dragon.txt | 2 +- forge-gui/res/cardsfolder/e/excavation.txt | 2 +- forge-gui/res/cardsfolder/e/excavator.txt | 4 ++-- forge-gui/res/cardsfolder/e/execute.txt | 2 +- forge-gui/res/cardsfolder/e/exert_influence.txt | 2 +- forge-gui/res/cardsfolder/e/exiled_doomsayer.txt | 2 +- forge-gui/res/cardsfolder/e/exotic_disease.txt | 2 +- forge-gui/res/cardsfolder/e/experiment_kraj.txt | 2 +- forge-gui/res/cardsfolder/e/extract.txt | 2 +- forge-gui/res/cardsfolder/e/extract_from_darkness.txt | 2 +- forge-gui/res/cardsfolder/e/extraplanar_lens.txt | 2 +- forge-gui/res/cardsfolder/e/extravagant_spirit.txt | 2 +- forge-gui/res/cardsfolder/e/eye_of_doom.txt | 2 +- forge-gui/res/cardsfolder/e/eye_of_ramos.txt | 2 +- forge-gui/res/cardsfolder/e/eye_of_singularity.txt | 2 +- forge-gui/res/cardsfolder/e/eye_of_the_storm.txt | 4 ++-- forge-gui/res/cardsfolder/e/eye_of_ugin.txt | 2 +- forge-gui/res/cardsfolder/e/eye_spy.txt | 2 +- forge-gui/res/cardsfolder/e/eyes_of_the_watcher.txt | 2 +- forge-gui/res/cardsfolder/e/eyes_of_the_wisent.txt | 2 +- forge-gui/res/cardsfolder/f/fabricate.txt | 2 +- forge-gui/res/cardsfolder/f/face_of_fear.txt | 2 +- forge-gui/res/cardsfolder/f/faces_of_the_past.txt | 2 +- forge-gui/res/cardsfolder/f/faerie_harbinger.txt | 2 +- forge-gui/res/cardsfolder/f/faerie_noble.txt | 2 +- forge-gui/res/cardsfolder/f/faith_healer.txt | 2 +- forge-gui/res/cardsfolder/f/faithless_looting.txt | 2 +- forge-gui/res/cardsfolder/f/faiths_shield.txt | 2 +- forge-gui/res/cardsfolder/f/falkenrath_torturer.txt | 2 +- forge-gui/res/cardsfolder/f/false_cure.txt | 2 +- forge-gui/res/cardsfolder/f/false_dawn.txt | 4 ++-- forge-gui/res/cardsfolder/f/false_memories.txt | 2 +- forge-gui/res/cardsfolder/f/false_peace.txt | 2 +- forge-gui/res/cardsfolder/f/false_prophet.txt | 2 +- forge-gui/res/cardsfolder/f/falter.txt | 2 +- forge-gui/res/cardsfolder/f/familiars_ruse.txt | 2 +- forge-gui/res/cardsfolder/f/famished_ghoul.txt | 2 +- forge-gui/res/cardsfolder/f/famished_paladin.txt | 2 +- forge-gui/res/cardsfolder/f/fanatical_devotion.txt | 2 +- forge-gui/res/cardsfolder/f/farrelite_priest.txt | 2 +- forge-gui/res/cardsfolder/f/farseek.txt | 2 +- forge-gui/res/cardsfolder/f/fascination.txt | 2 +- forge-gui/res/cardsfolder/f/fatal_attraction.txt | 2 +- forge-gui/res/cardsfolder/f/fatal_lore.txt | 2 +- forge-gui/res/cardsfolder/f/fatal_mutation.txt | 4 ++-- forge-gui/res/cardsfolder/f/fate_transfer.txt | 4 ++-- forge-gui/res/cardsfolder/f/fatestitcher.txt | 2 +- forge-gui/res/cardsfolder/f/fatigue.txt | 2 +- forge-gui/res/cardsfolder/f/fault_riders.txt | 2 +- forge-gui/res/cardsfolder/f/favor_of_the_mighty.txt | 2 +- forge-gui/res/cardsfolder/f/feast_of_blood.txt | 2 +- forge-gui/res/cardsfolder/f/feast_of_worms.txt | 2 +- forge-gui/res/cardsfolder/f/fecundity.txt | 2 +- forge-gui/res/cardsfolder/f/feed_the_pack.txt | 2 +- forge-gui/res/cardsfolder/f/feedback_bolt.txt | 2 +- forge-gui/res/cardsfolder/f/feeding_frenzy.txt | 2 +- forge-gui/res/cardsfolder/f/feint.txt | 2 +- forge-gui/res/cardsfolder/f/feldons_cane.txt | 4 ++-- forge-gui/res/cardsfolder/f/fell_the_mighty.txt | 2 +- forge-gui/res/cardsfolder/f/fend_off.txt | 2 +- forge-gui/res/cardsfolder/f/fendeep_summoner.txt | 2 +- forge-gui/res/cardsfolder/f/feral_contest.txt | 2 +- forge-gui/res/cardsfolder/f/feral_deceiver.txt | 2 +- forge-gui/res/cardsfolder/f/ferozs_ban.txt | 2 +- forge-gui/res/cardsfolder/f/fertile_ground.txt | 2 +- forge-gui/res/cardsfolder/f/fertile_imagination.txt | 2 +- forge-gui/res/cardsfolder/f/festercreep.txt | 2 +- forge-gui/res/cardsfolder/f/festival.txt | 2 +- forge-gui/res/cardsfolder/f/festival_of_the_guildpact.txt | 2 +- forge-gui/res/cardsfolder/f/fetid_heath.txt | 2 +- forge-gui/res/cardsfolder/f/fettergeist.txt | 2 +- forge-gui/res/cardsfolder/f/fiddlehead_kami.txt | 2 +- forge-gui/res/cardsfolder/f/field_of_dreams.txt | 2 +- forge-gui/res/cardsfolder/f/field_of_reality.txt | 2 +- forge-gui/res/cardsfolder/f/field_of_ruin.txt | 2 +- forge-gui/res/cardsfolder/f/fiend_of_the_shadows.txt | 2 +- forge-gui/res/cardsfolder/f/fiery_bombardment.txt | 2 +- forge-gui/res/cardsfolder/f/fiery_gambit.txt | 2 +- forge-gui/res/cardsfolder/f/fiery_justice.txt | 2 +- forge-gui/res/cardsfolder/f/fighting_chance.txt | 2 +- forge-gui/res/cardsfolder/f/final_fortune.txt | 2 +- forge-gui/res/cardsfolder/f/final_revels.txt | 2 +- forge-gui/res/cardsfolder/f/final_strike.txt | 2 +- forge-gui/res/cardsfolder/f/fire_and_brimstone.txt | 2 +- forge-gui/res/cardsfolder/f/fire_covenant.txt | 2 +- forge-gui/res/cardsfolder/f/fire_lit_thicket.txt | 2 +- forge-gui/res/cardsfolder/f/fire_sprites.txt | 2 +- forge-gui/res/cardsfolder/f/firecat_blitz.txt | 2 +- forge-gui/res/cardsfolder/f/firedrinker_satyr.txt | 2 +- forge-gui/res/cardsfolder/f/firefright_mage.txt | 2 +- forge-gui/res/cardsfolder/f/firehoof_cavalry.txt | 2 +- forge-gui/res/cardsfolder/f/fireminds_research.txt | 2 +- forge-gui/res/cardsfolder/f/firescreamer.txt | 2 +- forge-gui/res/cardsfolder/f/firespout.txt | 2 +- forge-gui/res/cardsfolder/f/firestorm.txt | 2 +- forge-gui/res/cardsfolder/f/fist_of_suns.txt | 2 +- forge-gui/res/cardsfolder/f/flailing_manticore.txt | 2 +- forge-gui/res/cardsfolder/f/flailing_ogre.txt | 2 +- forge-gui/res/cardsfolder/f/flailing_soldier.txt | 2 +- forge-gui/res/cardsfolder/f/flame_fusillade.txt | 2 +- forge-gui/res/cardsfolder/f/flame_kin_war_scout.txt | 2 +- forge-gui/res/cardsfolder/f/flamekin_harbinger.txt | 2 +- forge-gui/res/cardsfolder/f/flameshot.txt | 2 +- forge-gui/res/cardsfolder/f/flaring_pain.txt | 4 ++-- forge-gui/res/cardsfolder/f/flash.txt | 2 +- forge-gui/res/cardsfolder/f/flash_conscription.txt | 2 +- forge-gui/res/cardsfolder/f/flash_flood.txt | 2 +- forge-gui/res/cardsfolder/f/flash_of_defiance.txt | 4 ++-- forge-gui/res/cardsfolder/f/flash_of_insight.txt | 2 +- forge-gui/res/cardsfolder/f/flashfires.txt | 2 +- forge-gui/res/cardsfolder/f/flesh_reaver.txt | 2 +- forge-gui/res/cardsfolder/f/fleshgrafter.txt | 2 +- forge-gui/res/cardsfolder/f/flicker.txt | 2 +- forge-gui/res/cardsfolder/f/flickerform.txt | 2 +- forge-gui/res/cardsfolder/f/flickering_ward.txt | 2 +- forge-gui/res/cardsfolder/f/flight_spellbomb.txt | 2 +- forge-gui/res/cardsfolder/f/fling.txt | 2 +- forge-gui/res/cardsfolder/f/floating_shield.txt | 2 +- forge-gui/res/cardsfolder/f/floodbringer.txt | 2 +- forge-gui/res/cardsfolder/f/floodchaser.txt | 2 +- forge-gui/res/cardsfolder/f/flooded_grove.txt | 2 +- forge-gui/res/cardsfolder/f/flooded_shoreline.txt | 2 +- forge-gui/res/cardsfolder/f/flooded_woodlands.txt | 2 +- forge-gui/res/cardsfolder/f/floodtide_serpent.txt | 4 ++-- forge-gui/res/cardsfolder/f/floodwater_dam.txt | 2 +- forge-gui/res/cardsfolder/f/flourishing_defenses.txt | 2 +- forge-gui/res/cardsfolder/f/flow_of_ideas.txt | 2 +- forge-gui/res/cardsfolder/f/flowering_lumberknot.txt | 2 +- forge-gui/res/cardsfolder/f/flowstone_slide.txt | 2 +- forge-gui/res/cardsfolder/f/flowstone_surge.txt | 2 +- forge-gui/res/cardsfolder/f/fluctuator.txt | 2 +- forge-gui/res/cardsfolder/f/flurry_of_wings.txt | 2 +- forge-gui/res/cardsfolder/f/flux.txt | 4 ++-- forge-gui/res/cardsfolder/f/fluxcharger.txt | 2 +- forge-gui/res/cardsfolder/f/fodder_cannon.txt | 2 +- forge-gui/res/cardsfolder/f/fodder_launch.txt | 2 +- forge-gui/res/cardsfolder/f/fog_patch.txt | 2 +- forge-gui/res/cardsfolder/f/folk_medicine.txt | 2 +- forge-gui/res/cardsfolder/f/food_chain.txt | 2 +- forge-gui/res/cardsfolder/f/footbottom_feast.txt | 2 +- forge-gui/res/cardsfolder/f/footsteps_of_the_goryo.txt | 2 +- forge-gui/res/cardsfolder/f/forbid.txt | 2 +- forge-gui/res/cardsfolder/f/forbidden_alchemy.txt | 2 +- forge-gui/res/cardsfolder/f/forbidden_crypt.txt | 4 ++-- forge-gui/res/cardsfolder/f/forbidden_ritual.txt | 4 ++-- forge-gui/res/cardsfolder/f/force_of_savagery.txt | 2 +- forge-gui/res/cardsfolder/f/forced_fruition.txt | 2 +- forge-gui/res/cardsfolder/f/forced_march.txt | 2 +- forge-gui/res/cardsfolder/f/forerunner_of_the_heralds.txt | 2 +- forge-gui/res/cardsfolder/f/foreshadow.txt | 2 +- forge-gui/res/cardsfolder/f/foresight.txt | 4 ++-- forge-gui/res/cardsfolder/f/forethought_amulet.txt | 2 +- forge-gui/res/cardsfolder/f/forfend.txt | 2 +- forge-gui/res/cardsfolder/f/forge_armor.txt | 4 ++-- forge-gui/res/cardsfolder/f/forgotten_lore.txt | 2 +- forge-gui/res/cardsfolder/f/fork.txt | 2 +- forge-gui/res/cardsfolder/f/formation.txt | 2 +- forge-gui/res/cardsfolder/f/forsaken_city.txt | 2 +- forge-gui/res/cardsfolder/f/forsaken_wastes.txt | 2 +- forge-gui/res/cardsfolder/f/fortified_area.txt | 4 ++-- forge-gui/res/cardsfolder/f/fortitude.txt | 2 +- forge-gui/res/cardsfolder/f/fossil_find.txt | 2 +- forge-gui/res/cardsfolder/f/foul_presence.txt | 2 +- forge-gui/res/cardsfolder/f/foul_tongue_shriek.txt | 2 +- forge-gui/res/cardsfolder/f/fountain_of_cho.txt | 2 +- forge-gui/res/cardsfolder/f/foxfire.txt | 2 +- forge-gui/res/cardsfolder/f/fractured_loyalty.txt | 2 +- forge-gui/res/cardsfolder/f/fractured_powerstone.txt | 2 +- forge-gui/res/cardsfolder/f/frankensteins_monster.txt | 2 +- forge-gui/res/cardsfolder/f/frantic_salvage.txt | 4 ++-- forge-gui/res/cardsfolder/f/frantic_search.txt | 2 +- forge-gui/res/cardsfolder/f/freed_from_the_real.txt | 2 +- forge-gui/res/cardsfolder/f/frenetic_ogre.txt | 2 +- forge-gui/res/cardsfolder/f/frenetic_sliver.txt | 2 +- forge-gui/res/cardsfolder/f/fresh_meat.txt | 2 +- forge-gui/res/cardsfolder/f/freyalise_supplicant.txt | 4 ++-- forge-gui/res/cardsfolder/f/freyalises_charm.txt | 2 +- forge-gui/res/cardsfolder/f/freyalises_radiance.txt | 2 +- forge-gui/res/cardsfolder/f/freyalises_winds.txt | 2 +- forge-gui/res/cardsfolder/f/friendly_fire.txt | 2 +- forge-gui/res/cardsfolder/f/from_the_ashes.txt | 2 +- forge-gui/res/cardsfolder/f/frontline_strategist.txt | 2 +- forge-gui/res/cardsfolder/f/full_moons_rise.txt | 2 +- forge-gui/res/cardsfolder/f/funeral_pyre.txt | 2 +- forge-gui/res/cardsfolder/f/fungal_bloom.txt | 2 +- forge-gui/res/cardsfolder/f/fungal_plots.txt | 2 +- forge-gui/res/cardsfolder/f/fungal_reaches.txt | 2 +- forge-gui/res/cardsfolder/f/fungus_elemental.txt | 2 +- forge-gui/res/cardsfolder/f/furnace_brood.txt | 2 +- forge-gui/res/cardsfolder/f/furnace_celebration.txt | 2 +- forge-gui/res/cardsfolder/f/furnace_of_rath.txt | 2 +- forge-gui/res/cardsfolder/f/fury_charm.txt | 2 +- forge-gui/res/cardsfolder/f/fylamarid.txt | 2 +- forge-gui/res/cardsfolder/f/fyndhorn_pollen.txt | 2 +- forge-gui/res/cardsfolder/g/gabriel_angelfire.txt | 2 +- forge-gui/res/cardsfolder/g/gaeas_balance.txt | 2 +- forge-gui/res/cardsfolder/g/gaeas_blessing.txt | 2 +- forge-gui/res/cardsfolder/g/gaeas_liege.txt | 2 +- forge-gui/res/cardsfolder/g/gaeas_might.txt | 2 +- forge-gui/res/cardsfolder/g/gainsay.txt | 2 +- forge-gui/res/cardsfolder/g/gale_force.txt | 2 +- forge-gui/res/cardsfolder/g/galepowder_mage.txt | 2 +- forge-gui/res/cardsfolder/g/gallowbraid.txt | 2 +- forge-gui/res/cardsfolder/g/galvanic_key.txt | 2 +- forge-gui/res/cardsfolder/g/gamble.txt | 2 +- forge-gui/res/cardsfolder/g/game_of_chaos.txt | 2 +- forge-gui/res/cardsfolder/g/game_preserve.txt | 2 +- forge-gui/res/cardsfolder/g/gangrenous_goliath.txt | 2 +- forge-gui/res/cardsfolder/g/gargantuan_gorilla.txt | 2 +- forge-gui/res/cardsfolder/g/gargoyle_sentinel.txt | 2 +- forge-gui/res/cardsfolder/g/gate_smasher.txt | 2 +- forge-gui/res/cardsfolder/g/gate_to_phyrexia.txt | 2 +- forge-gui/res/cardsfolder/g/gate_to_the_aether.txt | 2 +- forge-gui/res/cardsfolder/g/gateway_shade.txt | 2 +- forge-gui/res/cardsfolder/g/gather_specimens.txt | 2 +- forge-gui/res/cardsfolder/g/gauntlet_of_might.txt | 2 +- forge-gui/res/cardsfolder/g/gauntlets_of_chaos.txt | 2 +- forge-gui/res/cardsfolder/g/gaze_of_granite.txt | 2 +- forge-gui/res/cardsfolder/g/gaze_of_pain.txt | 2 +- forge-gui/res/cardsfolder/g/gelid_shackles.txt | 2 +- forge-gui/res/cardsfolder/g/gem_of_becoming.txt | 2 +- forge-gui/res/cardsfolder/g/gemstone_caverns.txt | 2 +- forge-gui/res/cardsfolder/g/gemstone_mine.txt | 2 +- forge-gui/res/cardsfolder/g/generals_regalia.txt | 2 +- forge-gui/res/cardsfolder/g/generator_servant.txt | 2 +- forge-gui/res/cardsfolder/g/genesis_chamber.txt | 2 +- forge-gui/res/cardsfolder/g/geothermal_crevice.txt | 2 +- forge-gui/res/cardsfolder/g/ghave_guru_of_spores.txt | 2 +- forge-gui/res/cardsfolder/g/ghazban_ogre.txt | 2 +- forge-gui/res/cardsfolder/g/ghirapur_aether_grid.txt | 2 +- forge-gui/res/cardsfolder/g/ghost_quarter.txt | 2 +- forge-gui/res/cardsfolder/g/ghost_tactician.txt | 2 +- forge-gui/res/cardsfolder/g/ghostform.txt | 2 +- forge-gui/res/cardsfolder/g/ghostly_flicker.txt | 2 +- forge-gui/res/cardsfolder/g/ghostly_possession.txt | 2 +- forge-gui/res/cardsfolder/g/ghostly_touch.txt | 2 +- forge-gui/res/cardsfolder/g/ghosts_of_the_innocent.txt | 2 +- forge-gui/res/cardsfolder/g/ghostway.txt | 2 +- forge-gui/res/cardsfolder/g/ghoulcaller_gisa.txt | 2 +- forge-gui/res/cardsfolder/g/ghoulcallers_bell.txt | 2 +- forge-gui/res/cardsfolder/g/ghoulcallers_chant.txt | 2 +- forge-gui/res/cardsfolder/g/giant_caterpillar.txt | 2 +- forge-gui/res/cardsfolder/g/giant_harbinger.txt | 2 +- forge-gui/res/cardsfolder/g/giant_oyster.txt | 2 +- forge-gui/res/cardsfolder/g/giant_slug.txt | 2 +- forge-gui/res/cardsfolder/g/giant_trap_door_spider.txt | 2 +- forge-gui/res/cardsfolder/g/giants_ire.txt | 2 +- forge-gui/res/cardsfolder/g/gibbering_descent.txt | 2 +- forge-gui/res/cardsfolder/g/gideon_champion_of_justice.txt | 2 +- forge-gui/res/cardsfolder/g/gideon_jura.txt | 2 +- forge-gui/res/cardsfolder/g/gideons_defeat.txt | 2 +- forge-gui/res/cardsfolder/g/gideons_intervention.txt | 2 +- forge-gui/res/cardsfolder/g/gift_of_tusks.txt | 2 +- forge-gui/res/cardsfolder/g/gilded_light.txt | 2 +- forge-gui/res/cardsfolder/g/gilt_leaf_palace.txt | 2 +- forge-gui/res/cardsfolder/g/gitaxian_probe.txt | 2 +- forge-gui/res/cardsfolder/g/give_take.txt | 2 +- forge-gui/res/cardsfolder/g/glacial_chasm.txt | 2 +- forge-gui/res/cardsfolder/g/glacial_crasher.txt | 2 +- forge-gui/res/cardsfolder/g/glacial_crevasses.txt | 2 +- forge-gui/res/cardsfolder/g/glacial_plating.txt | 2 +- forge-gui/res/cardsfolder/g/glaciers.txt | 2 +- forge-gui/res/cardsfolder/g/glamerdye.txt | 4 ++-- forge-gui/res/cardsfolder/g/glare_of_subdual.txt | 2 +- forge-gui/res/cardsfolder/g/glarecaster.txt | 2 +- forge-gui/res/cardsfolder/g/glarewielder.txt | 2 +- forge-gui/res/cardsfolder/g/glasses_of_urza.txt | 2 +- forge-gui/res/cardsfolder/g/gleam_of_resistance.txt | 2 +- forge-gui/res/cardsfolder/g/glen_elendra.txt | 2 +- forge-gui/res/cardsfolder/g/glen_elendra_pranksters.txt | 2 +- forge-gui/res/cardsfolder/g/gliding_licid.txt | 2 +- forge-gui/res/cardsfolder/g/glimmervoid.txt | 2 +- forge-gui/res/cardsfolder/g/glimmervoid_basin.txt | 2 +- forge-gui/res/cardsfolder/g/glimpse_of_nature.txt | 2 +- forge-gui/res/cardsfolder/g/glimpse_the_future.txt | 2 +- forge-gui/res/cardsfolder/g/glint_hawk_idol.txt | 2 +- forge-gui/res/cardsfolder/g/glissa_sunseeker.txt | 2 +- forge-gui/res/cardsfolder/g/glittering_wish.txt | 2 +- forge-gui/res/cardsfolder/g/global_ruin.txt | 2 +- forge-gui/res/cardsfolder/g/gloom.txt | 2 +- forge-gui/res/cardsfolder/g/glorious_end.txt | 2 +- forge-gui/res/cardsfolder/g/glyph_of_destruction.txt | 4 ++-- forge-gui/res/cardsfolder/g/glyph_of_doom.txt | 4 ++-- forge-gui/res/cardsfolder/g/glyph_of_life.txt | 4 ++-- forge-gui/res/cardsfolder/g/gnathosaur.txt | 2 +- forge-gui/res/cardsfolder/g/goblin_archaeologist.txt | 2 +- forge-gui/res/cardsfolder/g/goblin_bangchuckers.txt | 2 +- forge-gui/res/cardsfolder/g/goblin_bombardment.txt | 2 +- forge-gui/res/cardsfolder/g/goblin_cadets.txt | 2 +- forge-gui/res/cardsfolder/g/goblin_cannon.txt | 2 +- forge-gui/res/cardsfolder/g/goblin_caves.txt | 2 +- forge-gui/res/cardsfolder/g/goblin_clearcutter.txt | 2 +- forge-gui/res/cardsfolder/g/goblin_diplomats.txt | 2 +- forge-gui/res/cardsfolder/g/goblin_dynamo.txt | 2 +- forge-gui/res/cardsfolder/g/goblin_flectomancer.txt | 2 +- forge-gui/res/cardsfolder/g/goblin_game.txt | 2 +- forge-gui/res/cardsfolder/g/goblin_grenade.txt | 2 +- forge-gui/res/cardsfolder/g/goblin_legionnaire.txt | 2 +- forge-gui/res/cardsfolder/g/goblin_lyre.txt | 2 +- forge-gui/res/cardsfolder/g/goblin_machinist.txt | 2 +- forge-gui/res/cardsfolder/g/goblin_psychopath.txt | 2 +- forge-gui/res/cardsfolder/g/goblin_pyromancer.txt | 2 +- forge-gui/res/cardsfolder/g/goblin_recruiter.txt | 4 ++-- forge-gui/res/cardsfolder/g/goblin_sappers.txt | 2 +- forge-gui/res/cardsfolder/g/goblin_shrine.txt | 2 +- forge-gui/res/cardsfolder/g/goblin_ski_patrol.txt | 2 +- forge-gui/res/cardsfolder/g/goblin_test_pilot.txt | 4 ++-- forge-gui/res/cardsfolder/g/goblin_war_cry.txt | 2 +- forge-gui/res/cardsfolder/g/goblin_war_strike.txt | 2 +- forge-gui/res/cardsfolder/g/goblin_warrens.txt | 2 +- forge-gui/res/cardsfolder/g/goblin_welder.txt | 4 ++-- forge-gui/res/cardsfolder/g/god_pharaohs_faithful.txt | 2 +- forge-gui/res/cardsfolder/g/godhunter_octopus.txt | 2 +- forge-gui/res/cardsfolder/g/godtoucher.txt | 4 ++-- forge-gui/res/cardsfolder/g/golden_wish.txt | 2 +- forge-gui/res/cardsfolder/g/golgari_cluestone.txt | 2 +- forge-gui/res/cardsfolder/g/golgari_keyrune.txt | 2 +- forge-gui/res/cardsfolder/g/golgari_locket.txt | 4 ++-- forge-gui/res/cardsfolder/g/golgari_signet.txt | 2 +- forge-gui/res/cardsfolder/g/golgothian_sylex.txt | 4 ++-- forge-gui/res/cardsfolder/g/gore_vassal.txt | 2 +- forge-gui/res/cardsfolder/g/goryos_vengeance.txt | 2 +- forge-gui/res/cardsfolder/g/gossamer_chains.txt | 2 +- forge-gui/res/cardsfolder/g/grab_the_reins.txt | 2 +- forge-gui/res/cardsfolder/g/graceful_antelope.txt | 2 +- forge-gui/res/cardsfolder/g/graceful_reprieve.txt | 2 +- forge-gui/res/cardsfolder/g/graf_mole.txt | 2 +- forge-gui/res/cardsfolder/g/grafdiggers_cage.txt | 2 +- forge-gui/res/cardsfolder/g/grafted_skullcap.txt | 2 +- forge-gui/res/cardsfolder/g/grand_architect.txt | 2 +- forge-gui/res/cardsfolder/g/grassland_crusader.txt | 2 +- forge-gui/res/cardsfolder/g/grave_consequences.txt | 2 +- forge-gui/res/cardsfolder/g/grave_peril.txt | 2 +- forge-gui/res/cardsfolder/g/grave_servitude.txt | 2 +- forge-gui/res/cardsfolder/g/gravebind.txt | 4 ++-- forge-gui/res/cardsfolder/g/graven_cairns.txt | 2 +- forge-gui/res/cardsfolder/g/gravepurge.txt | 2 +- forge-gui/res/cardsfolder/g/gravespawn_sovereign.txt | 2 +- forge-gui/res/cardsfolder/g/gravitational_shift.txt | 2 +- forge-gui/res/cardsfolder/g/gravity_sphere.txt | 2 +- forge-gui/res/cardsfolder/g/grazing_kelpie.txt | 2 +- forge-gui/res/cardsfolder/g/great_defender.txt | 2 +- forge-gui/res/cardsfolder/g/great_wall.txt | 2 +- forge-gui/res/cardsfolder/g/greater_good.txt | 2 +- .../res/cardsfolder/g/greater_realm_of_preservation.txt | 2 +- forge-gui/res/cardsfolder/g/greel_mind_raker.txt | 2 +- forge-gui/res/cardsfolder/g/green_mana_battery.txt | 2 +- forge-gui/res/cardsfolder/g/green_scarab.txt | 2 +- forge-gui/res/cardsfolder/g/green_ward.txt | 2 +- forge-gui/res/cardsfolder/g/greener_pastures.txt | 2 +- forge-gui/res/cardsfolder/g/greenhilt_trainee.txt | 2 +- forge-gui/res/cardsfolder/g/greenseeker.txt | 2 +- forge-gui/res/cardsfolder/g/gremlin_mine.txt | 2 +- forge-gui/res/cardsfolder/g/grenzo_dungeon_warden.txt | 2 +- forge-gui/res/cardsfolder/g/grenzos_rebuttal.txt | 2 +- forge-gui/res/cardsfolder/g/grid_monitor.txt | 2 +- forge-gui/res/cardsfolder/g/griffin_canyon.txt | 2 +- forge-gui/res/cardsfolder/g/griffin_rider.txt | 2 +- forge-gui/res/cardsfolder/g/grim_contest.txt | 2 +- forge-gui/res/cardsfolder/g/grim_feast.txt | 2 +- forge-gui/res/cardsfolder/g/grim_monolith.txt | 2 +- forge-gui/res/cardsfolder/g/grim_reminder.txt | 4 ++-- forge-gui/res/cardsfolder/g/grim_tutor.txt | 2 +- forge-gui/res/cardsfolder/g/grimgrin_corpse_born.txt | 2 +- forge-gui/res/cardsfolder/g/grimoire_of_the_dead.txt | 2 +- forge-gui/res/cardsfolder/g/grimoire_thief.txt | 4 ++-- forge-gui/res/cardsfolder/g/grinding_station.txt | 2 +- forge-gui/res/cardsfolder/g/grinning_ignus.txt | 2 +- forge-gui/res/cardsfolder/g/grinning_totem.txt | 2 +- forge-gui/res/cardsfolder/g/grip_of_chaos.txt | 2 +- forge-gui/res/cardsfolder/g/grixis_charm.txt | 2 +- forge-gui/res/cardsfolder/g/grixis_illusionist.txt | 2 +- forge-gui/res/cardsfolder/g/grollub.txt | 2 +- forge-gui/res/cardsfolder/g/ground_seal.txt | 2 +- forge-gui/res/cardsfolder/g/grozoth.txt | 2 +- forge-gui/res/cardsfolder/g/gruesome_slaughter.txt | 2 +- forge-gui/res/cardsfolder/g/gruul_cluestone.txt | 2 +- forge-gui/res/cardsfolder/g/gruul_keyrune.txt | 2 +- forge-gui/res/cardsfolder/g/gruul_scrapper.txt | 2 +- forge-gui/res/cardsfolder/g/gruul_signet.txt | 2 +- forge-gui/res/cardsfolder/g/guard_dogs.txt | 4 ++-- forge-gui/res/cardsfolder/g/guardian_angel.txt | 2 +- forge-gui/res/cardsfolder/g/guiding_spirit.txt | 2 +- forge-gui/res/cardsfolder/g/guild_feud.txt | 2 +- forge-gui/res/cardsfolder/g/gurzigost.txt | 2 +- forge-gui/res/cardsfolder/g/gusthas_scepter.txt | 2 +- forge-gui/res/cardsfolder/g/gutter_grime.txt | 2 +- forge-gui/res/cardsfolder/g/gutwrencher_oni.txt | 2 +- forge-gui/res/cardsfolder/h/haakon_stromgald_scourge.txt | 2 +- forge-gui/res/cardsfolder/h/hagra_diabolist.txt | 2 +- forge-gui/res/cardsfolder/h/hail_storm.txt | 2 +- forge-gui/res/cardsfolder/h/hall_of_gemstone.txt | 2 +- forge-gui/res/cardsfolder/h/hallow.txt | 2 +- forge-gui/res/cardsfolder/h/hallowed_ground.txt | 2 +- forge-gui/res/cardsfolder/h/hallowed_moonlight.txt | 2 +- forge-gui/res/cardsfolder/h/halls_of_mist.txt | 2 +- forge-gui/res/cardsfolder/h/hammer_mage.txt | 2 +- forge-gui/res/cardsfolder/h/hammerheim.txt | 2 +- forge-gui/res/cardsfolder/h/hana_kami.txt | 2 +- forge-gui/res/cardsfolder/h/hand_to_hand.txt | 2 +- forge-gui/res/cardsfolder/h/hankyu.txt | 2 +- forge-gui/res/cardsfolder/h/hannas_custody.txt | 2 +- forge-gui/res/cardsfolder/h/hapless_researcher.txt | 2 +- forge-gui/res/cardsfolder/h/harbinger_of_night.txt | 2 +- forge-gui/res/cardsfolder/h/hardened_scales.txt | 2 +- forge-gui/res/cardsfolder/h/harmless_offering.txt | 2 +- forge-gui/res/cardsfolder/h/harmonic_convergence.txt | 2 +- forge-gui/res/cardsfolder/h/harmony_of_nature.txt | 2 +- forge-gui/res/cardsfolder/h/harsh_deceiver.txt | 2 +- forge-gui/res/cardsfolder/h/harsh_judgment.txt | 2 +- forge-gui/res/cardsfolder/h/harsh_justice.txt | 2 +- forge-gui/res/cardsfolder/h/harsh_mercy.txt | 2 +- forge-gui/res/cardsfolder/h/harvest_mage.txt | 2 +- forge-gui/res/cardsfolder/h/harvest_pyre.txt | 2 +- forge-gui/res/cardsfolder/h/hasran_ogress.txt | 2 +- forge-gui/res/cardsfolder/h/hatching_plans.txt | 2 +- forge-gui/res/cardsfolder/h/hate_weaver.txt | 2 +- forge-gui/res/cardsfolder/h/hatred.txt | 2 +- forge-gui/res/cardsfolder/h/haunted_angel.txt | 2 +- forge-gui/res/cardsfolder/h/haunted_crossroads.txt | 2 +- forge-gui/res/cardsfolder/h/haunting_misery.txt | 2 +- forge-gui/res/cardsfolder/h/haven_of_the_spirit_dragon.txt | 2 +- forge-gui/res/cardsfolder/h/havengul_lich.txt | 2 +- forge-gui/res/cardsfolder/h/havengul_skaab.txt | 2 +- forge-gui/res/cardsfolder/h/havenwood_battleground.txt | 2 +- forge-gui/res/cardsfolder/h/havoc.txt | 2 +- forge-gui/res/cardsfolder/h/havoc_demon.txt | 2 +- forge-gui/res/cardsfolder/h/havoc_festival.txt | 2 +- forge-gui/res/cardsfolder/h/hazduhr_the_abbot.txt | 2 +- forge-gui/res/cardsfolder/h/hazy_homunculus.txt | 2 +- forge-gui/res/cardsfolder/h/he_who_hungers.txt | 2 +- forge-gui/res/cardsfolder/h/head_games.txt | 2 +- forge-gui/res/cardsfolder/h/healing_grace.txt | 2 +- forge-gui/res/cardsfolder/h/heap_doll.txt | 2 +- forge-gui/res/cardsfolder/h/heart_of_ramos.txt | 2 +- forge-gui/res/cardsfolder/h/heart_warden.txt | 2 +- forge-gui/res/cardsfolder/h/heartbeat_of_spring.txt | 2 +- forge-gui/res/cardsfolder/h/heartless_hidetsugu.txt | 2 +- forge-gui/res/cardsfolder/h/heartless_summoning.txt | 2 +- forge-gui/res/cardsfolder/h/heartwood_shard.txt | 2 +- forge-gui/res/cardsfolder/h/heat_of_battle.txt | 2 +- forge-gui/res/cardsfolder/h/heat_stroke.txt | 2 +- forge-gui/res/cardsfolder/h/heat_wave.txt | 2 +- forge-gui/res/cardsfolder/h/heaven_earth.txt | 2 +- forge-gui/res/cardsfolder/h/heavenly_blademaster.txt | 2 +- forge-gui/res/cardsfolder/h/heavens_gate.txt | 4 ++-- forge-gui/res/cardsfolder/h/hecatomb.txt | 2 +- forge-gui/res/cardsfolder/h/hedron_alignment.txt | 2 +- forge-gui/res/cardsfolder/h/heedless_one.txt | 2 +- forge-gui/res/cardsfolder/h/heidar_rimewind_master.txt | 2 +- forge-gui/res/cardsfolder/h/helionaut.txt | 2 +- forge-gui/res/cardsfolder/h/helix_pinnacle.txt | 2 +- forge-gui/res/cardsfolder/h/hell_bent_raider.txt | 2 +- forge-gui/res/cardsfolder/h/hellfire.txt | 2 +- forge-gui/res/cardsfolder/h/hellion_eruption.txt | 2 +- forge-gui/res/cardsfolder/h/hells_caretaker.txt | 2 +- forge-gui/res/cardsfolder/h/hells_caretaker_avatar.txt | 2 +- forge-gui/res/cardsfolder/h/helm_of_chatzuk.txt | 2 +- forge-gui/res/cardsfolder/h/helm_of_the_gods.txt | 2 +- forge-gui/res/cardsfolder/h/helvault.txt | 2 +- forge-gui/res/cardsfolder/h/hematite_talisman.txt | 2 +- forge-gui/res/cardsfolder/h/henchfiend_of_ukor.txt | 2 +- forge-gui/res/cardsfolder/h/henge_of_ramos.txt | 2 +- forge-gui/res/cardsfolder/h/heretics_punishment.txt | 4 ++-- forge-gui/res/cardsfolder/h/heritage_druid.txt | 2 +- forge-gui/res/cardsfolder/h/hermit_druid.txt | 2 +- forge-gui/res/cardsfolder/h/heroes_podium.txt | 2 +- forge-gui/res/cardsfolder/h/heroic_defiance.txt | 2 +- forge-gui/res/cardsfolder/h/heroism.txt | 4 ++-- forge-gui/res/cardsfolder/h/hesitation.txt | 2 +- forge-gui/res/cardsfolder/h/hex_parasite.txt | 2 +- forge-gui/res/cardsfolder/h/hibernation.txt | 2 +- forge-gui/res/cardsfolder/h/hickory_woodlot.txt | 2 +- forge-gui/res/cardsfolder/h/hidden_path.txt | 2 +- forge-gui/res/cardsfolder/h/hidden_retreat.txt | 2 +- forge-gui/res/cardsfolder/h/hidden_stag.txt | 2 +- forge-gui/res/cardsfolder/h/hidden_strings.txt | 2 +- forge-gui/res/cardsfolder/h/high_market.txt | 2 +- forge-gui/res/cardsfolder/h/high_seas.txt | 2 +- forge-gui/res/cardsfolder/h/high_tide.txt | 2 +- forge-gui/res/cardsfolder/h/highland_berserker.txt | 2 +- forge-gui/res/cardsfolder/h/hikari_twilight_guardian.txt | 2 +- forge-gui/res/cardsfolder/h/hint_of_insanity.txt | 2 +- forge-gui/res/cardsfolder/h/hisoka_minamo_sensei.txt | 2 +- forge-gui/res/cardsfolder/h/hisokas_defiance.txt | 2 +- forge-gui/res/cardsfolder/h/hisokas_guard.txt | 2 +- forge-gui/res/cardsfolder/h/hive_mind.txt | 2 +- forge-gui/res/cardsfolder/h/hivestone.txt | 2 +- forge-gui/res/cardsfolder/h/hivis_of_the_scale.txt | 2 +- forge-gui/res/cardsfolder/h/hokori_dust_drinker.txt | 2 +- forge-gui/res/cardsfolder/h/holistic_wisdom.txt | 2 +- forge-gui/res/cardsfolder/h/hollow_trees.txt | 2 +- forge-gui/res/cardsfolder/h/hollow_warrior.txt | 2 +- forge-gui/res/cardsfolder/h/hollowhenge_spirit.txt | 2 +- forge-gui/res/cardsfolder/h/holy_justiciar.txt | 2 +- forge-gui/res/cardsfolder/h/homarid_shaman.txt | 2 +- forge-gui/res/cardsfolder/h/homarid_spawning_bed.txt | 2 +- forge-gui/res/cardsfolder/h/homicidal_seclusion.txt | 2 +- forge-gui/res/cardsfolder/h/homing_sliver.txt | 2 +- forge-gui/res/cardsfolder/h/honor_worn_shaku.txt | 2 +- forge-gui/res/cardsfolder/h/horizon_seed.txt | 2 +- forge-gui/res/cardsfolder/h/horn_of_greed.txt | 2 +- forge-gui/res/cardsfolder/h/horn_of_plenty.txt | 2 +- forge-gui/res/cardsfolder/h/horn_of_ramos.txt | 2 +- forge-gui/res/cardsfolder/h/horror_of_horrors.txt | 2 +- forge-gui/res/cardsfolder/h/hour_of_eternity.txt | 2 +- forge-gui/res/cardsfolder/h/hour_of_need.txt | 2 +- forge-gui/res/cardsfolder/h/howlpack_resurgence.txt | 2 +- forge-gui/res/cardsfolder/h/howlpack_wolf.txt | 2 +- forge-gui/res/cardsfolder/h/howltooth_hollow.txt | 2 +- forge-gui/res/cardsfolder/h/hua_tuo_honored_physician.txt | 2 +- forge-gui/res/cardsfolder/h/huatli_dinosaur_knight.txt | 2 +- forge-gui/res/cardsfolder/h/hull_breach.txt | 2 +- forge-gui/res/cardsfolder/h/hum_of_the_radix.txt | 2 +- forge-gui/res/cardsfolder/h/humility.txt | 2 +- forge-gui/res/cardsfolder/h/hundred_talon_strike.txt | 2 +- forge-gui/res/cardsfolder/h/hunger_of_the_nim.txt | 2 +- forge-gui/res/cardsfolder/h/hunt_down.txt | 2 +- forge-gui/res/cardsfolder/h/hunters_ambush.txt | 2 +- forge-gui/res/cardsfolder/h/hunters_insight.txt | 2 +- forge-gui/res/cardsfolder/h/hunting_drake.txt | 2 +- forge-gui/res/cardsfolder/h/hurr_jackal.txt | 2 +- forge-gui/res/cardsfolder/h/hushwing_gryff.txt | 2 +- forge-gui/res/cardsfolder/h/hydroblast.txt | 2 +- forge-gui/res/cardsfolder/h/hydromorph_guardian.txt | 2 +- forge-gui/res/cardsfolder/h/hydromorph_gull.txt | 2 +- forge-gui/res/cardsfolder/h/hypergenesis.txt | 2 +- forge-gui/res/cardsfolder/h/hyperion_blacksmith.txt | 2 +- forge-gui/res/cardsfolder/h/hypnox.txt | 2 +- forge-gui/res/cardsfolder/h/hypochondria.txt | 2 +- .../res/cardsfolder/i/ib_halfheart_goblin_tactician.txt | 2 +- forge-gui/res/cardsfolder/i/icatian_crier.txt | 2 +- forge-gui/res/cardsfolder/i/icatian_infantry.txt | 2 +- forge-gui/res/cardsfolder/i/icatian_moneychanger.txt | 2 +- forge-gui/res/cardsfolder/i/icatian_phalanx.txt | 2 +- forge-gui/res/cardsfolder/i/icatian_skirmishers.txt | 2 +- forge-gui/res/cardsfolder/i/icatian_store.txt | 2 +- forge-gui/res/cardsfolder/i/ice_floe.txt | 2 +- forge-gui/res/cardsfolder/i/iceberg.txt | 2 +- forge-gui/res/cardsfolder/i/ichneumon_druid.txt | 2 +- forge-gui/res/cardsfolder/i/ichor_explosion.txt | 2 +- forge-gui/res/cardsfolder/i/ichor_wellspring.txt | 2 +- forge-gui/res/cardsfolder/i/ideas_unbound.txt | 2 +- forge-gui/res/cardsfolder/i/idyllic_tutor.txt | 2 +- forge-gui/res/cardsfolder/i/ignite_disorder.txt | 2 +- forge-gui/res/cardsfolder/i/ignition_team.txt | 2 +- forge-gui/res/cardsfolder/i/ignorant_bliss.txt | 2 +- forge-gui/res/cardsfolder/i/iizuka_the_ruthless.txt | 2 +- forge-gui/res/cardsfolder/i/ill_gotten_gains.txt | 2 +- forge-gui/res/cardsfolder/i/illness_in_the_ranks.txt | 2 +- forge-gui/res/cardsfolder/i/illuminated_folio.txt | 2 +- forge-gui/res/cardsfolder/i/illuminated_wings.txt | 2 +- forge-gui/res/cardsfolder/i/illusion_of_choice.txt | 2 +- forge-gui/res/cardsfolder/i/illusionists_gambit.txt | 2 +- forge-gui/res/cardsfolder/i/illusionists_stratagem.txt | 2 +- forge-gui/res/cardsfolder/i/illusions_of_grandeur.txt | 2 +- forge-gui/res/cardsfolder/i/illusory_demon.txt | 2 +- forge-gui/res/cardsfolder/i/imagecrafter.txt | 2 +- forge-gui/res/cardsfolder/i/imi_statue.txt | 2 +- forge-gui/res/cardsfolder/i/immortal_coil.txt | 2 +- forge-gui/res/cardsfolder/i/impatience.txt | 2 +- forge-gui/res/cardsfolder/i/impelled_giant.txt | 2 +- forge-gui/res/cardsfolder/i/impending_disaster.txt | 2 +- forge-gui/res/cardsfolder/i/imperial_seal.txt | 2 +- forge-gui/res/cardsfolder/i/implement_of_combustion.txt | 2 +- forge-gui/res/cardsfolder/i/implement_of_examination.txt | 2 +- forge-gui/res/cardsfolder/i/implement_of_ferocity.txt | 2 +- forge-gui/res/cardsfolder/i/implement_of_improvement.txt | 2 +- forge-gui/res/cardsfolder/i/implement_of_malice.txt | 2 +- forge-gui/res/cardsfolder/i/implements_of_sacrifice.txt | 2 +- forge-gui/res/cardsfolder/i/imprison.txt | 2 +- forge-gui/res/cardsfolder/i/impromptu_raid.txt | 2 +- forge-gui/res/cardsfolder/i/imps_mischief.txt | 2 +- forge-gui/res/cardsfolder/i/imps_taunt.txt | 2 +- forge-gui/res/cardsfolder/i/impulsive_maneuvers.txt | 2 +- forge-gui/res/cardsfolder/i/in_the_eye_of_chaos.txt | 2 +- forge-gui/res/cardsfolder/i/iname_death_aspect.txt | 2 +- forge-gui/res/cardsfolder/i/iname_life_aspect.txt | 2 +- forge-gui/res/cardsfolder/i/incandescent_soulstoke.txt | 2 +- forge-gui/res/cardsfolder/i/incite.txt | 2 +- forge-gui/res/cardsfolder/i/incite_hysteria.txt | 2 +- forge-gui/res/cardsfolder/i/incite_rebellion.txt | 2 +- forge-gui/res/cardsfolder/i/incite_war.txt | 2 +- forge-gui/res/cardsfolder/i/increasing_vengeance.txt | 2 +- forge-gui/res/cardsfolder/i/indestructible_aura.txt | 2 +- forge-gui/res/cardsfolder/i/index.txt | 2 +- forge-gui/res/cardsfolder/i/induce_despair.txt | 2 +- forge-gui/res/cardsfolder/i/induce_paranoia.txt | 2 +- forge-gui/res/cardsfolder/i/indulgent_aristocrat.txt | 2 +- forge-gui/res/cardsfolder/i/infernal_caretaker.txt | 2 +- forge-gui/res/cardsfolder/i/infernal_darkness.txt | 4 ++-- forge-gui/res/cardsfolder/i/infernal_genesis.txt | 2 +- forge-gui/res/cardsfolder/i/infernal_harvest.txt | 2 +- forge-gui/res/cardsfolder/i/infernal_offering.txt | 4 ++-- forge-gui/res/cardsfolder/i/infernal_plunge.txt | 2 +- forge-gui/res/cardsfolder/i/infernal_tribute.txt | 2 +- forge-gui/res/cardsfolder/i/infernal_tutor.txt | 2 +- forge-gui/res/cardsfolder/i/inferno_trap.txt | 2 +- forge-gui/res/cardsfolder/i/infinite_hourglass.txt | 2 +- forge-gui/res/cardsfolder/i/infinite_obliteration.txt | 2 +- forge-gui/res/cardsfolder/i/infuse_with_the_elements.txt | 2 +- forge-gui/res/cardsfolder/i/infused_arrows.txt | 2 +- forge-gui/res/cardsfolder/i/initiates_of_the_ebon_hand.txt | 2 +- forge-gui/res/cardsfolder/i/inkfathom_witch.txt | 2 +- forge-gui/res/cardsfolder/i/inner_sanctum.txt | 2 +- forge-gui/res/cardsfolder/i/inner_struggle.txt | 2 +- forge-gui/res/cardsfolder/i/innocence_kami.txt | 2 +- forge-gui/res/cardsfolder/i/innocent_blood.txt | 2 +- forge-gui/res/cardsfolder/i/inquisition.txt | 2 +- forge-gui/res/cardsfolder/i/inquisitors_snare.txt | 2 +- forge-gui/res/cardsfolder/i/inside_out.txt | 2 +- forge-gui/res/cardsfolder/i/insidious_dreams.txt | 2 +- forge-gui/res/cardsfolder/i/insight.txt | 2 +- forge-gui/res/cardsfolder/i/insist.txt | 2 +- forge-gui/res/cardsfolder/i/inspired_sprite.txt | 2 +- forge-gui/res/cardsfolder/i/inspiring_call.txt | 2 +- forge-gui/res/cardsfolder/i/instigator.txt | 2 +- forge-gui/res/cardsfolder/i/intangible_virtue.txt | 2 +- forge-gui/res/cardsfolder/i/intellectual_offering.txt | 4 ++-- forge-gui/res/cardsfolder/i/interdict.txt | 2 +- forge-gui/res/cardsfolder/i/intervention_pact.txt | 2 +- forge-gui/res/cardsfolder/i/intimidation_bolt.txt | 2 +- forge-gui/res/cardsfolder/i/into_the_fray.txt | 2 +- forge-gui/res/cardsfolder/i/into_the_north.txt | 2 +- forge-gui/res/cardsfolder/i/intruder_alarm.txt | 2 +- forge-gui/res/cardsfolder/i/invasion_plans.txt | 2 +- forge-gui/res/cardsfolder/i/invasive_species.txt | 2 +- forge-gui/res/cardsfolder/i/invert_invent.txt | 2 +- forge-gui/res/cardsfolder/i/invert_the_skies.txt | 2 +- forge-gui/res/cardsfolder/i/inverter_of_truth.txt | 2 +- forge-gui/res/cardsfolder/i/invigorating_boon.txt | 2 +- forge-gui/res/cardsfolder/i/ion_storm.txt | 4 ++-- forge-gui/res/cardsfolder/i/ire_of_kaminari.txt | 2 +- forge-gui/res/cardsfolder/i/irini_sengir.txt | 2 +- forge-gui/res/cardsfolder/i/iron_heart_chimera.txt | 2 +- forge-gui/res/cardsfolder/i/iron_star.txt | 2 +- forge-gui/res/cardsfolder/i/irradiate.txt | 2 +- forge-gui/res/cardsfolder/i/irresistible_prey.txt | 2 +- forge-gui/res/cardsfolder/i/irrigation_ditch.txt | 2 +- forge-gui/res/cardsfolder/i/ishi_ishi_akki_crackshot.txt | 2 +- forge-gui/res/cardsfolder/i/island_of_wak_wak.txt | 2 +- forge-gui/res/cardsfolder/i/island_sanctuary.txt | 2 +- forge-gui/res/cardsfolder/i/isochron_scepter.txt | 2 +- forge-gui/res/cardsfolder/i/ith_high_arcanist.txt | 2 +- forge-gui/res/cardsfolder/i/ivory_charm.txt | 2 +- forge-gui/res/cardsfolder/i/ivory_crane_netsuke.txt | 2 +- forge-gui/res/cardsfolder/i/ivory_cup.txt | 2 +- forge-gui/res/cardsfolder/i/ivory_gargoyle.txt | 2 +- forge-gui/res/cardsfolder/i/ivory_guardians.txt | 2 +- forge-gui/res/cardsfolder/i/ivy_seer.txt | 2 +- forge-gui/res/cardsfolder/i/ixidors_will.txt | 2 +- forge-gui/res/cardsfolder/i/izzet_chemister.txt | 2 +- forge-gui/res/cardsfolder/i/izzet_cluestone.txt | 2 +- forge-gui/res/cardsfolder/i/izzet_guildmage.txt | 2 +- forge-gui/res/cardsfolder/i/izzet_keyrune.txt | 2 +- forge-gui/res/cardsfolder/i/izzet_locket.txt | 2 +- forge-gui/res/cardsfolder/i/izzet_signet.txt | 2 +- forge-gui/res/cardsfolder/j/jace_the_living_guildpact.txt | 2 +- forge-gui/res/cardsfolder/j/jaces_archivist.txt | 2 +- forge-gui/res/cardsfolder/j/jaces_defeat.txt | 2 +- forge-gui/res/cardsfolder/j/jackalope_herd.txt | 2 +- forge-gui/res/cardsfolder/j/jade_idol.txt | 2 +- forge-gui/res/cardsfolder/j/jade_monolith.txt | 2 +- forge-gui/res/cardsfolder/j/jagged_scar_archers.txt | 2 +- forge-gui/res/cardsfolder/j/jalira_master_polymorphist.txt | 2 +- forge-gui/res/cardsfolder/j/jalum_tome.txt | 2 +- forge-gui/res/cardsfolder/j/jamuraan_lion.txt | 2 +- forge-gui/res/cardsfolder/j/jandors_ring.txt | 2 +- forge-gui/res/cardsfolder/j/jandors_saddlebags.txt | 2 +- forge-gui/res/cardsfolder/j/jangling_automaton.txt | 2 +- forge-gui/res/cardsfolder/j/jar_of_eyeballs.txt | 2 +- forge-gui/res/cardsfolder/j/jasmine_seer.txt | 2 +- forge-gui/res/cardsfolder/j/jeskai_banner.txt | 2 +- forge-gui/res/cardsfolder/j/jesters_cap.txt | 2 +- forge-gui/res/cardsfolder/j/jesters_mask.txt | 2 +- forge-gui/res/cardsfolder/j/jesters_scepter.txt | 2 +- forge-gui/res/cardsfolder/j/jet_medallion.txt | 2 +- forge-gui/res/cardsfolder/j/jeweled_amulet.txt | 2 +- forge-gui/res/cardsfolder/j/jeweled_bird.txt | 4 ++-- forge-gui/res/cardsfolder/j/jeweled_spirit.txt | 2 +- forge-gui/res/cardsfolder/j/jhoira_of_the_ghitu.txt | 2 +- forge-gui/res/cardsfolder/j/jinx.txt | 2 +- forge-gui/res/cardsfolder/j/jinxed_choker.txt | 2 +- forge-gui/res/cardsfolder/j/jinxed_idol.txt | 2 +- forge-gui/res/cardsfolder/j/jinxed_ring.txt | 2 +- forge-gui/res/cardsfolder/j/jodah_archmage_eternal.txt | 2 +- forge-gui/res/cardsfolder/j/johan.txt | 2 +- forge-gui/res/cardsfolder/j/jokulhaups.txt | 2 +- forge-gui/res/cardsfolder/j/jolt.txt | 2 +- forge-gui/res/cardsfolder/j/jolting_merfolk.txt | 2 +- forge-gui/res/cardsfolder/j/joraga_bard.txt | 2 +- forge-gui/res/cardsfolder/j/joraga_warcaller.txt | 2 +- forge-gui/res/cardsfolder/j/jorubai_murk_lurker.txt | 2 +- forge-gui/res/cardsfolder/j/journey_of_discovery.txt | 2 +- forge-gui/res/cardsfolder/j/jovial_evil.txt | 2 +- forge-gui/res/cardsfolder/j/judge_unworthy.txt | 2 +- forge-gui/res/cardsfolder/j/juju_bubble.txt | 2 +- forge-gui/res/cardsfolder/j/jund_charm.txt | 2 +- forge-gui/res/cardsfolder/j/juniper_order_advocate.txt | 2 +- forge-gui/res/cardsfolder/j/junk_golem.txt | 2 +- forge-gui/res/cardsfolder/j/junkyo_bell.txt | 2 +- forge-gui/res/cardsfolder/j/juntu_stakes.txt | 2 +- forge-gui/res/cardsfolder/j/justice.txt | 2 +- forge-gui/res/cardsfolder/j/juxtapose.txt | 2 +- forge-gui/res/cardsfolder/j/jwari_shapeshifter.txt | 2 +- forge-gui/res/cardsfolder/k/kaboom.txt | 2 +- forge-gui/res/cardsfolder/k/kaerveks_spite.txt | 2 +- forge-gui/res/cardsfolder/k/kagemaro_first_to_suffer.txt | 2 +- forge-gui/res/cardsfolder/k/kagemaros_clutch.txt | 2 +- forge-gui/res/cardsfolder/k/kaho_minamo_historian.txt | 2 +- forge-gui/res/cardsfolder/k/kaleidostone.txt | 2 +- forge-gui/res/cardsfolder/k/kamahls_summons.txt | 2 +- forge-gui/res/cardsfolder/k/kambal_consul_of_allocation.txt | 2 +- forge-gui/res/cardsfolder/k/kami_of_ancient_law.txt | 2 +- forge-gui/res/cardsfolder/k/kami_of_the_painted_road.txt | 2 +- forge-gui/res/cardsfolder/k/kami_of_the_waning_moon.txt | 2 +- forge-gui/res/cardsfolder/k/karma.txt | 2 +- forge-gui/res/cardsfolder/k/karn_silver_golem.txt | 2 +- forge-gui/res/cardsfolder/k/karns_touch.txt | 2 +- forge-gui/res/cardsfolder/k/karonas_zealot.txt | 2 +- forge-gui/res/cardsfolder/k/karplusan_giant.txt | 2 +- forge-gui/res/cardsfolder/k/karplusan_minotaur.txt | 2 +- forge-gui/res/cardsfolder/k/katabatic_winds.txt | 2 +- forge-gui/res/cardsfolder/k/kataki_wars_wage.txt | 2 +- forge-gui/res/cardsfolder/k/kavu_glider.txt | 2 +- forge-gui/res/cardsfolder/k/kavu_lair.txt | 2 +- forge-gui/res/cardsfolder/k/kavu_recluse.txt | 2 +- forge-gui/res/cardsfolder/k/kavu_scout.txt | 2 +- forge-gui/res/cardsfolder/k/kaya_ghost_assassin.txt | 2 +- forge-gui/res/cardsfolder/k/kazuuls_toll_collector.txt | 2 +- forge-gui/res/cardsfolder/k/kederekt_leviathan.txt | 2 +- forge-gui/res/cardsfolder/k/keeper_of_progenitus.txt | 2 +- forge-gui/res/cardsfolder/k/keldon_battlewagon.txt | 2 +- forge-gui/res/cardsfolder/k/keldon_necropolis.txt | 2 +- forge-gui/res/cardsfolder/k/kelsinko_ranger.txt | 2 +- forge-gui/res/cardsfolder/k/kheru_dreadmaw.txt | 2 +- forge-gui/res/cardsfolder/k/kheru_lich_lord.txt | 2 +- forge-gui/res/cardsfolder/k/kheru_spellsnatcher.txt | 2 +- forge-gui/res/cardsfolder/k/kiku_nights_flower.txt | 2 +- forge-gui/res/cardsfolder/k/kikus_shadow.txt | 2 +- forge-gui/res/cardsfolder/k/kill_suit_cultist.txt | 2 +- forge-gui/res/cardsfolder/k/kill_switch.txt | 4 ++-- forge-gui/res/cardsfolder/k/killing_glare.txt | 2 +- forge-gui/res/cardsfolder/k/killing_wave.txt | 2 +- forge-gui/res/cardsfolder/k/kindle_the_carnage.txt | 2 +- forge-gui/res/cardsfolder/k/kindred_summons.txt | 2 +- forge-gui/res/cardsfolder/k/king_crab.txt | 2 +- forge-gui/res/cardsfolder/k/king_suleiman.txt | 2 +- forge-gui/res/cardsfolder/k/kinsbaile_borderguard.txt | 2 +- forge-gui/res/cardsfolder/k/kioras_dismissal.txt | 2 +- forge-gui/res/cardsfolder/k/kioras_follower.txt | 2 +- forge-gui/res/cardsfolder/k/kiri_onna.txt | 2 +- forge-gui/res/cardsfolder/k/kithkin_armor.txt | 2 +- forge-gui/res/cardsfolder/k/kithkin_harbinger.txt | 2 +- forge-gui/res/cardsfolder/k/kithkin_mourncaller.txt | 2 +- forge-gui/res/cardsfolder/k/kithkin_zephyrnaut.txt | 2 +- .../k/kitsune_mystic_autumn_tail_kitsune_sage.txt | 4 ++-- forge-gui/res/cardsfolder/k/kitsune_palliator.txt | 2 +- forge-gui/res/cardsfolder/k/kjeldoran_escort.txt | 2 +- forge-gui/res/cardsfolder/k/kjeldoran_javelineer.txt | 2 +- forge-gui/res/cardsfolder/k/kjeldoran_knight.txt | 2 +- forge-gui/res/cardsfolder/k/kjeldoran_phalanx.txt | 2 +- forge-gui/res/cardsfolder/k/kjeldoran_pride.txt | 2 +- forge-gui/res/cardsfolder/k/kjeldoran_skycaptain.txt | 2 +- forge-gui/res/cardsfolder/k/kjeldoran_skyknight.txt | 2 +- forge-gui/res/cardsfolder/k/kjeldoran_warrior.txt | 2 +- forge-gui/res/cardsfolder/k/knacksaw_clique.txt | 2 +- forge-gui/res/cardsfolder/k/knight_of_the_mists.txt | 2 +- forge-gui/res/cardsfolder/k/knights_of_thorn.txt | 2 +- forge-gui/res/cardsfolder/k/knollspine_dragon.txt | 2 +- forge-gui/res/cardsfolder/k/knollspine_invocation.txt | 2 +- forge-gui/res/cardsfolder/k/knotvine_mystic.txt | 2 +- forge-gui/res/cardsfolder/k/knowledge_exploitation.txt | 2 +- forge-gui/res/cardsfolder/k/knowledge_vault.txt | 2 +- forge-gui/res/cardsfolder/k/kodama_of_the_center_tree.txt | 2 +- forge-gui/res/cardsfolder/k/kolaghan_monument.txt | 2 +- forge-gui/res/cardsfolder/k/kondas_banner.txt | 2 +- forge-gui/res/cardsfolder/k/kookus.txt | 2 +- forge-gui/res/cardsfolder/k/kor_chant.txt | 2 +- forge-gui/res/cardsfolder/k/kor_dirge.txt | 2 +- forge-gui/res/cardsfolder/k/kor_outfitter.txt | 2 +- forge-gui/res/cardsfolder/k/kormus_bell.txt | 2 +- forge-gui/res/cardsfolder/k/koskun_keep.txt | 2 +- forge-gui/res/cardsfolder/k/krakens_eye.txt | 2 +- forge-gui/res/cardsfolder/k/krark_clan_engineers.txt | 2 +- forge-gui/res/cardsfolder/k/krark_clan_ironworks.txt | 2 +- forge-gui/res/cardsfolder/k/krark_clan_ogre.txt | 2 +- forge-gui/res/cardsfolder/k/krark_clan_shaman.txt | 2 +- forge-gui/res/cardsfolder/k/krark_clan_stoker.txt | 2 +- forge-gui/res/cardsfolder/k/krarks_thumb.txt | 2 +- forge-gui/res/cardsfolder/k/krasis_incubation.txt | 2 +- forge-gui/res/cardsfolder/k/kris_mage.txt | 2 +- forge-gui/res/cardsfolder/k/krosan_archer.txt | 2 +- forge-gui/res/cardsfolder/k/krosan_reclamation.txt | 2 +- forge-gui/res/cardsfolder/k/krosan_restorer.txt | 2 +- forge-gui/res/cardsfolder/k/krovikan_elementalist.txt | 2 +- forge-gui/res/cardsfolder/k/krovikan_plague.txt | 2 +- forge-gui/res/cardsfolder/k/krovikan_sorcerer.txt | 2 +- forge-gui/res/cardsfolder/k/krovikan_whispers.txt | 2 +- forge-gui/res/cardsfolder/k/kry_shield.txt | 2 +- forge-gui/res/cardsfolder/k/kukemssa_serpent.txt | 2 +- forge-gui/res/cardsfolder/k/kuldotha_flamefiend.txt | 2 +- forge-gui/res/cardsfolder/k/kuldotha_forgemaster.txt | 2 +- forge-gui/res/cardsfolder/k/kuldotha_rebirth.txt | 2 +- forge-gui/res/cardsfolder/k/kumanos_blessing.txt | 2 +- forge-gui/res/cardsfolder/k/kyoki_sanitys_eclipse.txt | 2 +- forge-gui/res/cardsfolder/k/kyren_archive.txt | 2 +- forge-gui/res/cardsfolder/k/kyren_toy.txt | 2 +- forge-gui/res/cardsfolder/l/lady_evangela.txt | 2 +- forge-gui/res/cardsfolder/l/lady_sun.txt | 2 +- forge-gui/res/cardsfolder/l/lake_of_the_dead.txt | 2 +- forge-gui/res/cardsfolder/l/lammastide_weave.txt | 4 ++-- forge-gui/res/cardsfolder/l/lancers_en_kor.txt | 2 +- forge-gui/res/cardsfolder/l/lands_edge.txt | 2 +- forge-gui/res/cardsfolder/l/landslide.txt | 2 +- forge-gui/res/cardsfolder/l/lantern_of_insight.txt | 2 +- forge-gui/res/cardsfolder/l/lapis_lazuli_talisman.txt | 2 +- forge-gui/res/cardsfolder/l/laquatuss_creativity.txt | 2 +- forge-gui/res/cardsfolder/l/laquatuss_disdain.txt | 2 +- forge-gui/res/cardsfolder/l/lashwrithe.txt | 2 +- forge-gui/res/cardsfolder/l/last_chance.txt | 2 +- forge-gui/res/cardsfolder/l/last_ditch_effort.txt | 2 +- forge-gui/res/cardsfolder/l/last_laugh.txt | 2 +- forge-gui/res/cardsfolder/l/last_rites.txt | 2 +- forge-gui/res/cardsfolder/l/last_stand.txt | 2 +- forge-gui/res/cardsfolder/l/latulla_keldon_overseer.txt | 2 +- forge-gui/res/cardsfolder/l/launch_party.txt | 2 +- forge-gui/res/cardsfolder/l/lavacore_elemental.txt | 2 +- forge-gui/res/cardsfolder/l/lawbringer.txt | 2 +- forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt | 2 +- forge-gui/res/cardsfolder/l/lead_belly_chimera.txt | 2 +- forge-gui/res/cardsfolder/l/leaden_fists.txt | 2 +- forge-gui/res/cardsfolder/l/leaf_crowned_elder.txt | 2 +- forge-gui/res/cardsfolder/l/leave_no_trace.txt | 2 +- forge-gui/res/cardsfolder/l/leech_bonder.txt | 2 +- forge-gui/res/cardsfolder/l/leeches.txt | 4 ++-- forge-gui/res/cardsfolder/l/leeching_licid.txt | 2 +- forge-gui/res/cardsfolder/l/legacy_weapon.txt | 2 +- forge-gui/res/cardsfolder/l/legerdemain.txt | 2 +- forge-gui/res/cardsfolder/l/lens_of_clarity.txt | 4 ++-- forge-gui/res/cardsfolder/l/leonin_arbiter.txt | 2 +- forge-gui/res/cardsfolder/l/leonin_sun_standard.txt | 2 +- forge-gui/res/cardsfolder/l/leshracs_sigil.txt | 2 +- forge-gui/res/cardsfolder/l/lethal_vapors.txt | 2 +- forge-gui/res/cardsfolder/l/leveler.txt | 2 +- forge-gui/res/cardsfolder/l/leviathan.txt | 2 +- forge-gui/res/cardsfolder/l/ley_line.txt | 2 +- forge-gui/res/cardsfolder/l/leyline_of_lifeforce.txt | 2 +- forge-gui/res/cardsfolder/l/leyline_of_lightning.txt | 2 +- forge-gui/res/cardsfolder/l/leyline_of_punishment.txt | 2 +- forge-gui/res/cardsfolder/l/leyline_of_singularity.txt | 2 +- forge-gui/res/cardsfolder/l/leyline_of_the_meek.txt | 2 +- forge-gui/res/cardsfolder/l/leyline_of_the_void.txt | 2 +- forge-gui/res/cardsfolder/l/leyline_of_vitality.txt | 2 +- forge-gui/res/cardsfolder/l/liability.txt | 2 +- forge-gui/res/cardsfolder/l/liars_pendulum.txt | 2 +- forge-gui/res/cardsfolder/l/liberated_dwarf.txt | 2 +- forge-gui/res/cardsfolder/l/lich.txt | 2 +- forge-gui/res/cardsfolder/l/lichs_tomb.txt | 2 +- forge-gui/res/cardsfolder/l/liege_of_the_pit.txt | 2 +- forge-gui/res/cardsfolder/l/lieutenant_kirtar.txt | 2 +- forge-gui/res/cardsfolder/l/life_and_limb.txt | 2 +- forge-gui/res/cardsfolder/l/life_chisel.txt | 2 +- forge-gui/res/cardsfolder/l/life_matrix.txt | 2 +- forge-gui/res/cardsfolder/l/lifeblood.txt | 2 +- forge-gui/res/cardsfolder/l/lifecraft_awakening.txt | 2 +- forge-gui/res/cardsfolder/l/lifecrafters_bestiary.txt | 2 +- forge-gui/res/cardsfolder/l/lifeforce.txt | 2 +- forge-gui/res/cardsfolder/l/lifelace.txt | 4 ++-- forge-gui/res/cardsfolder/l/lifeline.txt | 2 +- forge-gui/res/cardsfolder/l/lifes_legacy.txt | 2 +- forge-gui/res/cardsfolder/l/lifespark_spellbomb.txt | 2 +- forge-gui/res/cardsfolder/l/lifespinner.txt | 2 +- forge-gui/res/cardsfolder/l/lifetap.txt | 2 +- forge-gui/res/cardsfolder/l/light_of_day.txt | 2 +- forge-gui/res/cardsfolder/l/light_of_sanction.txt | 2 +- forge-gui/res/cardsfolder/l/light_of_the_legion.txt | 2 +- forge-gui/res/cardsfolder/l/lightbringer.txt | 2 +- forge-gui/res/cardsfolder/l/lightning_dart.txt | 4 ++-- forge-gui/res/cardsfolder/l/lightning_rift.txt | 2 +- forge-gui/res/cardsfolder/l/lightning_storm.txt | 2 +- forge-gui/res/cardsfolder/l/lightning_volley.txt | 2 +- forge-gui/res/cardsfolder/l/lilianas_contract.txt | 2 +- forge-gui/res/cardsfolder/l/lilianas_defeat.txt | 2 +- forge-gui/res/cardsfolder/l/lilianas_indignation.txt | 2 +- forge-gui/res/cardsfolder/l/lim_duls_paladin.txt | 2 +- forge-gui/res/cardsfolder/l/lim_duls_vault.txt | 2 +- forge-gui/res/cardsfolder/l/limestone_golem.txt | 2 +- forge-gui/res/cardsfolder/l/limited_resources.txt | 4 ++-- forge-gui/res/cardsfolder/l/lin_sivvi_defiant_hero.txt | 2 +- forge-gui/res/cardsfolder/l/lions_eye_diamond.txt | 2 +- forge-gui/res/cardsfolder/l/liquid_fire.txt | 2 +- forge-gui/res/cardsfolder/l/liquimetal_coating.txt | 2 +- forge-gui/res/cardsfolder/l/lithatog.txt | 2 +- forge-gui/res/cardsfolder/l/living_death.txt | 2 +- forge-gui/res/cardsfolder/l/living_destiny.txt | 2 +- forge-gui/res/cardsfolder/l/living_end.txt | 2 +- forge-gui/res/cardsfolder/l/living_inferno.txt | 2 +- forge-gui/res/cardsfolder/l/living_lands.txt | 2 +- forge-gui/res/cardsfolder/l/living_lore.txt | 2 +- forge-gui/res/cardsfolder/l/living_plane.txt | 2 +- forge-gui/res/cardsfolder/l/living_wish.txt | 2 +- forge-gui/res/cardsfolder/l/llanowar_druid.txt | 2 +- forge-gui/res/cardsfolder/l/loam_dryad.txt | 2 +- forge-gui/res/cardsfolder/l/loathsome_catoblepas.txt | 4 ++-- forge-gui/res/cardsfolder/l/locket_of_yesterdays.txt | 2 +- forge-gui/res/cardsfolder/l/lodestone_bauble.txt | 2 +- forge-gui/res/cardsfolder/l/long_forgotten_gohei.txt | 2 +- forge-gui/res/cardsfolder/l/long_term_plans.txt | 2 +- forge-gui/res/cardsfolder/l/lord_of_the_pit.txt | 2 +- forge-gui/res/cardsfolder/l/lord_of_tresserhorn.txt | 2 +- forge-gui/res/cardsfolder/l/lost_auramancers.txt | 2 +- forge-gui/res/cardsfolder/l/lost_legacy.txt | 2 +- forge-gui/res/cardsfolder/l/lotus_blossom.txt | 2 +- forge-gui/res/cardsfolder/l/lotus_cobra.txt | 2 +- forge-gui/res/cardsfolder/l/lotus_petal.txt | 2 +- forge-gui/res/cardsfolder/l/lowland_oaf.txt | 2 +- forge-gui/res/cardsfolder/l/loxodon_peacekeeper.txt | 4 ++-- forge-gui/res/cardsfolder/l/loyal_drake.txt | 2 +- forge-gui/res/cardsfolder/l/loyal_unicorn.txt | 2 +- forge-gui/res/cardsfolder/l/lumengrid_augur.txt | 2 +- forge-gui/res/cardsfolder/l/luminesce.txt | 4 ++-- forge-gui/res/cardsfolder/l/lunar_avenger.txt | 2 +- forge-gui/res/cardsfolder/l/lupine_prototype.txt | 2 +- forge-gui/res/cardsfolder/l/lurking_arynx.txt | 2 +- forge-gui/res/cardsfolder/l/lurking_evil.txt | 2 +- forge-gui/res/cardsfolder/l/lush_growth.txt | 2 +- forge-gui/res/cardsfolder/l/lyzolda_the_blood_witch.txt | 2 +- forge-gui/res/cardsfolder/m/machinate.txt | 2 +- forge-gui/res/cardsfolder/m/mad_prophet.txt | 2 +- forge-gui/res/cardsfolder/m/madblind_mountain.txt | 2 +- forge-gui/res/cardsfolder/m/maddening_imp.txt | 4 ++-- forge-gui/res/cardsfolder/m/mage_il_vec.txt | 2 +- forge-gui/res/cardsfolder/m/mage_ring_network.txt | 2 +- forge-gui/res/cardsfolder/m/mageta_the_lion.txt | 2 +- forge-gui/res/cardsfolder/m/magewrights_stone.txt | 2 +- forge-gui/res/cardsfolder/m/magical_hack.txt | 4 ++-- forge-gui/res/cardsfolder/m/magister_of_worth.txt | 2 +- forge-gui/res/cardsfolder/m/magistrates_veto.txt | 2 +- forge-gui/res/cardsfolder/m/magma_burst.txt | 2 +- forge-gui/res/cardsfolder/m/magma_giant.txt | 2 +- forge-gui/res/cardsfolder/m/magma_vein.txt | 2 +- forge-gui/res/cardsfolder/m/magmasaur.txt | 2 +- forge-gui/res/cardsfolder/m/magmatic_chasm.txt | 2 +- forge-gui/res/cardsfolder/m/magmatic_core.txt | 2 +- forge-gui/res/cardsfolder/m/magmatic_insight.txt | 2 +- forge-gui/res/cardsfolder/m/magmaw.txt | 2 +- forge-gui/res/cardsfolder/m/magnetic_flux.txt | 2 +- forge-gui/res/cardsfolder/m/magnetic_mine.txt | 2 +- forge-gui/res/cardsfolder/m/magnetic_mountain.txt | 2 +- forge-gui/res/cardsfolder/m/magnetic_theft.txt | 2 +- forge-gui/res/cardsfolder/m/magnivore.txt | 2 +- forge-gui/res/cardsfolder/m/magosi_the_waterveil.txt | 2 +- forge-gui/res/cardsfolder/m/magus_of_the_abyss.txt | 2 +- forge-gui/res/cardsfolder/m/magus_of_the_arena.txt | 2 +- forge-gui/res/cardsfolder/m/magus_of_the_bazaar.txt | 2 +- forge-gui/res/cardsfolder/m/magus_of_the_candelabra.txt | 2 +- forge-gui/res/cardsfolder/m/magus_of_the_coffers.txt | 2 +- forge-gui/res/cardsfolder/m/magus_of_the_jar.txt | 2 +- forge-gui/res/cardsfolder/m/magus_of_the_library.txt | 2 +- forge-gui/res/cardsfolder/m/magus_of_the_moat.txt | 2 +- forge-gui/res/cardsfolder/m/magus_of_the_moon.txt | 2 +- forge-gui/res/cardsfolder/m/magus_of_the_scroll.txt | 2 +- forge-gui/res/cardsfolder/m/magus_of_the_tabernacle.txt | 2 +- forge-gui/res/cardsfolder/m/magus_of_the_unseen.txt | 2 +- forge-gui/res/cardsfolder/m/magus_of_the_wheel.txt | 2 +- forge-gui/res/cardsfolder/m/major_teroh.txt | 2 +- forge-gui/res/cardsfolder/m/makindi_shieldmate.txt | 2 +- forge-gui/res/cardsfolder/m/malachite_talisman.txt | 2 +- forge-gui/res/cardsfolder/m/malakir_bloodwitch.txt | 2 +- forge-gui/res/cardsfolder/m/malakir_soothsayer.txt | 2 +- forge-gui/res/cardsfolder/m/malevolent_awakening.txt | 2 +- forge-gui/res/cardsfolder/m/malicious_advice.txt | 2 +- forge-gui/res/cardsfolder/m/malicious_intent.txt | 2 +- forge-gui/res/cardsfolder/m/malignant_growth.txt | 2 +- forge-gui/res/cardsfolder/m/mana_breach.txt | 2 +- forge-gui/res/cardsfolder/m/mana_clash.txt | 2 +- forge-gui/res/cardsfolder/m/mana_crypt.txt | 2 +- forge-gui/res/cardsfolder/m/mana_cylix.txt | 2 +- forge-gui/res/cardsfolder/m/mana_echoes.txt | 2 +- forge-gui/res/cardsfolder/m/mana_maze.txt | 4 ++-- forge-gui/res/cardsfolder/m/mana_prism.txt | 2 +- forge-gui/res/cardsfolder/m/mana_seism.txt | 2 +- forge-gui/res/cardsfolder/m/mana_severance.txt | 2 +- forge-gui/res/cardsfolder/m/mana_short.txt | 2 +- forge-gui/res/cardsfolder/m/mana_vapors.txt | 2 +- forge-gui/res/cardsfolder/m/mana_vault.txt | 2 +- forge-gui/res/cardsfolder/m/mana_vortex.txt | 2 +- forge-gui/res/cardsfolder/m/manabarbs.txt | 2 +- forge-gui/res/cardsfolder/m/manabond.txt | 4 ++-- forge-gui/res/cardsfolder/m/manamorphose.txt | 2 +- forge-gui/res/cardsfolder/m/mangaras_equity.txt | 2 +- forge-gui/res/cardsfolder/m/mangaras_tome.txt | 4 ++-- forge-gui/res/cardsfolder/m/maniacal_rage.txt | 2 +- forge-gui/res/cardsfolder/m/manipulate_fate.txt | 2 +- forge-gui/res/cardsfolder/m/mannichi_the_fevered_dream.txt | 2 +- forge-gui/res/cardsfolder/m/manor_gargoyle.txt | 2 +- forge-gui/res/cardsfolder/m/maralen_of_the_mornsong.txt | 2 +- .../res/cardsfolder/m/maralen_of_the_mornsong_avatar.txt | 2 +- forge-gui/res/cardsfolder/m/marath_will_of_the_wild.txt | 2 +- forge-gui/res/cardsfolder/m/marauding_knight.txt | 2 +- forge-gui/res/cardsfolder/m/maraxus_of_keld.txt | 2 +- forge-gui/res/cardsfolder/m/marble_titan.txt | 2 +- forge-gui/res/cardsfolder/m/march_from_the_tomb.txt | 2 +- forge-gui/res/cardsfolder/m/march_of_the_drowned.txt | 2 +- forge-gui/res/cardsfolder/m/march_of_the_machines.txt | 2 +- forge-gui/res/cardsfolder/m/mardu_banner.txt | 2 +- forge-gui/res/cardsfolder/m/mardu_blazebringer.txt | 2 +- forge-gui/res/cardsfolder/m/mardu_hateblade.txt | 2 +- forge-gui/res/cardsfolder/m/marjhan.txt | 2 +- forge-gui/res/cardsfolder/m/mark_for_death.txt | 2 +- forge-gui/res/cardsfolder/m/mark_of_the_oni.txt | 2 +- forge-gui/res/cardsfolder/m/marker_beetles.txt | 2 +- forge-gui/res/cardsfolder/m/market_festival.txt | 2 +- forge-gui/res/cardsfolder/m/maro.txt | 2 +- forge-gui/res/cardsfolder/m/maro_avatar.txt | 2 +- forge-gui/res/cardsfolder/m/marrow_gnawer.txt | 2 +- forge-gui/res/cardsfolder/m/marsh_flitter.txt | 2 +- forge-gui/res/cardsfolder/m/marsh_lurker.txt | 2 +- forge-gui/res/cardsfolder/m/marshaling_the_troops.txt | 2 +- forge-gui/res/cardsfolder/m/marshals_anthem.txt | 2 +- forge-gui/res/cardsfolder/m/martyr_of_ashes.txt | 2 +- forge-gui/res/cardsfolder/m/martyr_of_bones.txt | 2 +- forge-gui/res/cardsfolder/m/martyr_of_frost.txt | 2 +- forge-gui/res/cardsfolder/m/martyr_of_sands.txt | 2 +- forge-gui/res/cardsfolder/m/martyr_of_spores.txt | 2 +- forge-gui/res/cardsfolder/m/martyred_rusalka.txt | 2 +- forge-gui/res/cardsfolder/m/martyrs_cause.txt | 2 +- forge-gui/res/cardsfolder/m/martyrs_cry.txt | 2 +- forge-gui/res/cardsfolder/m/martyrs_tomb.txt | 2 +- forge-gui/res/cardsfolder/m/mask_of_intolerance.txt | 2 +- forge-gui/res/cardsfolder/m/mask_of_the_mimic.txt | 2 +- forge-gui/res/cardsfolder/m/mass_appeal.txt | 2 +- forge-gui/res/cardsfolder/m/mass_hysteria.txt | 2 +- forge-gui/res/cardsfolder/m/mass_polymorph.txt | 2 +- forge-gui/res/cardsfolder/m/master_of_etherium.txt | 2 +- forge-gui/res/cardsfolder/m/master_of_the_veil.txt | 2 +- forge-gui/res/cardsfolder/m/master_transmuter.txt | 2 +- forge-gui/res/cardsfolder/m/master_warcraft.txt | 2 +- forge-gui/res/cardsfolder/m/masticore.txt | 2 +- forge-gui/res/cardsfolder/m/masumaro_first_to_live.txt | 2 +- forge-gui/res/cardsfolder/m/matca_rioters.txt | 2 +- forge-gui/res/cardsfolder/m/mausoleum_secrets.txt | 2 +- forge-gui/res/cardsfolder/m/mausoleum_wanderer.txt | 2 +- forge-gui/res/cardsfolder/m/mayael_the_anima.txt | 2 +- forge-gui/res/cardsfolder/m/maze_of_shadows.txt | 2 +- forge-gui/res/cardsfolder/m/mazes_end.txt | 2 +- forge-gui/res/cardsfolder/m/measure_of_wickedness.txt | 2 +- forge-gui/res/cardsfolder/m/meddle.txt | 2 +- forge-gui/res/cardsfolder/m/meddling_mage.txt | 2 +- forge-gui/res/cardsfolder/m/medicine_bag.txt | 2 +- forge-gui/res/cardsfolder/m/meekstone.txt | 2 +- forge-gui/res/cardsfolder/m/megatherium.txt | 2 +- forge-gui/res/cardsfolder/m/meishin_the_mind_cage.txt | 2 +- forge-gui/res/cardsfolder/m/melee.txt | 2 +- forge-gui/res/cardsfolder/m/meletis_charlatan.txt | 2 +- forge-gui/res/cardsfolder/m/meloku_the_clouded_mirror.txt | 2 +- forge-gui/res/cardsfolder/m/meltdown.txt | 2 +- forge-gui/res/cardsfolder/m/melting.txt | 2 +- forge-gui/res/cardsfolder/m/memnarch.txt | 2 +- forge-gui/res/cardsfolder/m/memoricide.txt | 2 +- forge-gui/res/cardsfolder/m/memory_crystal.txt | 2 +- forge-gui/res/cardsfolder/m/memory_jar.txt | 2 +- forge-gui/res/cardsfolder/m/memory_plunder.txt | 2 +- forge-gui/res/cardsfolder/m/memorys_journey.txt | 2 +- forge-gui/res/cardsfolder/m/mental_discipline.txt | 2 +- forge-gui/res/cardsfolder/m/mental_note.txt | 2 +- forge-gui/res/cardsfolder/m/mercadian_bazaar.txt | 2 +- forge-gui/res/cardsfolder/m/mercadian_lift.txt | 2 +- forge-gui/res/cardsfolder/m/mercadias_downfall.txt | 4 ++-- forge-gui/res/cardsfolder/m/merchant_scroll.txt | 2 +- forge-gui/res/cardsfolder/m/merciless_resolve.txt | 2 +- forge-gui/res/cardsfolder/m/merfolk_thaumaturgist.txt | 2 +- forge-gui/res/cardsfolder/m/merrow_commerce.txt | 2 +- forge-gui/res/cardsfolder/m/merrow_grimeblotter.txt | 2 +- forge-gui/res/cardsfolder/m/merrow_harbinger.txt | 2 +- forge-gui/res/cardsfolder/m/merrow_wavebreakers.txt | 2 +- forge-gui/res/cardsfolder/m/mesa_enchantress.txt | 2 +- forge-gui/res/cardsfolder/m/mesa_pegasus.txt | 2 +- forge-gui/res/cardsfolder/m/mesmeric_orb.txt | 2 +- forge-gui/res/cardsfolder/m/mesmeric_sliver.txt | 2 +- forge-gui/res/cardsfolder/m/mesmeric_trance.txt | 2 +- forge-gui/res/cardsfolder/m/metal_fatigue.txt | 2 +- forge-gui/res/cardsfolder/m/metalworker.txt | 4 ++-- forge-gui/res/cardsfolder/m/metamorphose.txt | 2 +- forge-gui/res/cardsfolder/m/metamorphosis.txt | 2 +- forge-gui/res/cardsfolder/m/metathran_aerostat.txt | 2 +- forge-gui/res/cardsfolder/m/metathran_transport.txt | 2 +- forge-gui/res/cardsfolder/m/metathran_zombie.txt | 2 +- forge-gui/res/cardsfolder/m/meteor_crater.txt | 2 +- forge-gui/res/cardsfolder/m/meteor_shower.txt | 2 +- forge-gui/res/cardsfolder/m/meteor_storm.txt | 2 +- forge-gui/res/cardsfolder/m/miasmic_mummy.txt | 2 +- forge-gui/res/cardsfolder/m/midnight_banshee.txt | 2 +- forge-gui/res/cardsfolder/m/midnight_ritual.txt | 2 +- forge-gui/res/cardsfolder/m/midsummer_revel.txt | 2 +- forge-gui/res/cardsfolder/m/might_makes_right.txt | 2 +- forge-gui/res/cardsfolder/m/might_of_alara.txt | 2 +- forge-gui/res/cardsfolder/m/might_of_the_nephilim.txt | 2 +- forge-gui/res/cardsfolder/m/might_weaver.txt | 2 +- forge-gui/res/cardsfolder/m/mightstone.txt | 2 +- forge-gui/res/cardsfolder/m/mighty_emergence.txt | 2 +- forge-gui/res/cardsfolder/m/mimic_vat.txt | 2 +- .../res/cardsfolder/m/minamo_school_at_waters_edge.txt | 2 +- forge-gui/res/cardsfolder/m/minamo_sightbender.txt | 2 +- forge-gui/res/cardsfolder/m/mind_bend.txt | 4 ++-- forge-gui/res/cardsfolder/m/mind_bomb.txt | 4 ++-- forge-gui/res/cardsfolder/m/mind_extraction.txt | 2 +- forge-gui/res/cardsfolder/m/mind_games.txt | 2 +- forge-gui/res/cardsfolder/m/mind_harness.txt | 2 +- forge-gui/res/cardsfolder/m/mind_maggots.txt | 2 +- forge-gui/res/cardsfolder/m/mind_over_matter.txt | 4 ++-- forge-gui/res/cardsfolder/m/mind_slash.txt | 2 +- forge-gui/res/cardsfolder/m/mind_swords.txt | 2 +- forge-gui/res/cardsfolder/m/mindblaze.txt | 4 ++-- forge-gui/res/cardsfolder/m/mindbreak_trap.txt | 2 +- forge-gui/res/cardsfolder/m/mindcrank.txt | 2 +- forge-gui/res/cardsfolder/m/mindlash_sliver.txt | 2 +- forge-gui/res/cardsfolder/m/mindreaver.txt | 4 ++-- forge-gui/res/cardsfolder/m/minds_aglow.txt | 2 +- forge-gui/res/cardsfolder/m/mindslaver.txt | 2 +- forge-gui/res/cardsfolder/m/mindstorm_crown.txt | 2 +- forge-gui/res/cardsfolder/m/minion_of_leshrac.txt | 2 +- forge-gui/res/cardsfolder/m/minion_of_the_wastes.txt | 2 +- forge-gui/res/cardsfolder/m/minions_murmurs.txt | 2 +- forge-gui/res/cardsfolder/m/minotaur_tactician.txt | 2 +- forge-gui/res/cardsfolder/m/mirage_mirror.txt | 2 +- forge-gui/res/cardsfolder/m/mire_kavu.txt | 2 +- forge-gui/res/cardsfolder/m/mire_shade.txt | 2 +- forge-gui/res/cardsfolder/m/miren_the_moaning_well.txt | 2 +- forge-gui/res/cardsfolder/m/mirozel.txt | 2 +- forge-gui/res/cardsfolder/m/mirri.txt | 2 +- forge-gui/res/cardsfolder/m/mirris_guile.txt | 2 +- forge-gui/res/cardsfolder/m/mirror_entity.txt | 2 +- forge-gui/res/cardsfolder/m/mirror_gallery.txt | 2 +- forge-gui/res/cardsfolder/m/mirror_of_fate.txt | 4 ++-- forge-gui/res/cardsfolder/m/mirror_of_the_forebears.txt | 2 +- forge-gui/res/cardsfolder/m/mirror_strike.txt | 2 +- forge-gui/res/cardsfolder/m/mirrorwood_treefolk.txt | 2 +- forge-gui/res/cardsfolder/m/mischievous_quanar.txt | 2 +- forge-gui/res/cardsfolder/m/misdirection.txt | 2 +- forge-gui/res/cardsfolder/m/mishras_bauble.txt | 2 +- forge-gui/res/cardsfolder/m/mishras_helix.txt | 2 +- forge-gui/res/cardsfolder/m/mishras_workshop.txt | 2 +- forge-gui/res/cardsfolder/m/misinformation.txt | 2 +- forge-gui/res/cardsfolder/m/mission_briefing.txt | 2 +- forge-gui/res/cardsfolder/m/mist_of_stagnation.txt | 2 +- forge-gui/res/cardsfolder/m/mistbind_clique.txt | 2 +- forge-gui/res/cardsfolder/m/mistform_dreamer.txt | 2 +- forge-gui/res/cardsfolder/m/mistform_mask.txt | 4 ++-- forge-gui/res/cardsfolder/m/mistform_mutant.txt | 2 +- forge-gui/res/cardsfolder/m/mistform_seaswift.txt | 2 +- forge-gui/res/cardsfolder/m/mistform_shrieker.txt | 2 +- forge-gui/res/cardsfolder/m/mistform_skyreaver.txt | 2 +- forge-gui/res/cardsfolder/m/mistform_sliver.txt | 2 +- forge-gui/res/cardsfolder/m/mistform_stalker.txt | 2 +- forge-gui/res/cardsfolder/m/mistform_wakecaster.txt | 2 +- forge-gui/res/cardsfolder/m/mistform_wall.txt | 2 +- forge-gui/res/cardsfolder/m/mistform_warchief.txt | 2 +- forge-gui/res/cardsfolder/m/mitotic_manipulation.txt | 2 +- forge-gui/res/cardsfolder/m/mizzium_transreliquat.txt | 2 +- forge-gui/res/cardsfolder/m/mizzixs_mastery.txt | 2 +- forge-gui/res/cardsfolder/m/mnemonic_nexus.txt | 2 +- forge-gui/res/cardsfolder/m/moat.txt | 2 +- forge-gui/res/cardsfolder/m/mogg_cannon.txt | 2 +- forge-gui/res/cardsfolder/m/mogg_raider.txt | 2 +- forge-gui/res/cardsfolder/m/mogg_squad.txt | 2 +- forge-gui/res/cardsfolder/m/moggcatcher.txt | 2 +- forge-gui/res/cardsfolder/m/mogiss_warhound.txt | 2 +- forge-gui/res/cardsfolder/m/molder_slug.txt | 2 +- forge-gui/res/cardsfolder/m/molten_firebird.txt | 2 +- forge-gui/res/cardsfolder/m/molten_slagheap.txt | 2 +- forge-gui/res/cardsfolder/m/molten_tail_masticore.txt | 2 +- forge-gui/res/cardsfolder/m/moment_of_silence.txt | 2 +- forge-gui/res/cardsfolder/m/momentous_fall.txt | 2 +- forge-gui/res/cardsfolder/m/monsoon.txt | 2 +- forge-gui/res/cardsfolder/m/moonbow_illusionist.txt | 2 +- forge-gui/res/cardsfolder/m/moonlace.txt | 4 ++-- forge-gui/res/cardsfolder/m/moonlight_bargain.txt | 2 +- forge-gui/res/cardsfolder/m/moonlight_geist.txt | 2 +- forge-gui/res/cardsfolder/m/moonlight_hunt.txt | 2 +- forge-gui/res/cardsfolder/m/moonlit_strider.txt | 2 +- forge-gui/res/cardsfolder/m/moonmist.txt | 2 +- forge-gui/res/cardsfolder/m/moonring_island.txt | 2 +- forge-gui/res/cardsfolder/m/moonring_mirror.txt | 2 +- forge-gui/res/cardsfolder/m/morality_shift.txt | 2 +- forge-gui/res/cardsfolder/m/moratorium_stone.txt | 2 +- forge-gui/res/cardsfolder/m/morgue_thrull.txt | 2 +- forge-gui/res/cardsfolder/m/morgue_toad.txt | 2 +- forge-gui/res/cardsfolder/m/morinfen.txt | 2 +- forge-gui/res/cardsfolder/m/morinfen_avatar.txt | 4 ++-- forge-gui/res/cardsfolder/m/moriok_replica.txt | 2 +- forge-gui/res/cardsfolder/m/morningtide.txt | 2 +- forge-gui/res/cardsfolder/m/mortarpod.txt | 2 +- forge-gui/res/cardsfolder/m/mortipede.txt | 2 +- forge-gui/res/cardsfolder/m/mortiphobia.txt | 2 +- forge-gui/res/cardsfolder/m/mortuary.txt | 2 +- forge-gui/res/cardsfolder/m/mossfire_egg.txt | 4 ++-- forge-gui/res/cardsfolder/m/mossfire_valley.txt | 2 +- forge-gui/res/cardsfolder/m/mountain_stronghold.txt | 2 +- forge-gui/res/cardsfolder/m/mountain_titan.txt | 2 +- forge-gui/res/cardsfolder/m/mournful_zombie.txt | 2 +- forge-gui/res/cardsfolder/m/mourning.txt | 2 +- forge-gui/res/cardsfolder/m/mouth_of_ronom.txt | 2 +- forge-gui/res/cardsfolder/m/mox_opal.txt | 2 +- forge-gui/res/cardsfolder/m/mudbutton_clanger.txt | 2 +- forge-gui/res/cardsfolder/m/mudhole.txt | 2 +- forge-gui/res/cardsfolder/m/mudslide.txt | 2 +- forge-gui/res/cardsfolder/m/multanis_presence.txt | 2 +- forge-gui/res/cardsfolder/m/murasa_pyromancer.txt | 2 +- forge-gui/res/cardsfolder/m/murderers_axe.txt | 2 +- forge-gui/res/cardsfolder/m/murderous_betrayal.txt | 2 +- forge-gui/res/cardsfolder/m/musician.txt | 2 +- forge-gui/res/cardsfolder/m/mwonvuli_beast_tracker.txt | 2 +- forge-gui/res/cardsfolder/m/mycosynth_fiend.txt | 2 +- forge-gui/res/cardsfolder/m/mycosynth_lattice.txt | 2 +- forge-gui/res/cardsfolder/m/myojin_of_lifes_web.txt | 2 +- forge-gui/res/cardsfolder/m/myojin_of_seeing_winds.txt | 2 +- forge-gui/res/cardsfolder/m/myr_landshaper.txt | 2 +- forge-gui/res/cardsfolder/m/myr_quadropod.txt | 2 +- forge-gui/res/cardsfolder/m/myr_reservoir.txt | 2 +- forge-gui/res/cardsfolder/m/myr_superion.txt | 2 +- forge-gui/res/cardsfolder/m/mystic_barrier.txt | 4 ++-- forge-gui/res/cardsfolder/m/mystic_compass.txt | 2 +- forge-gui/res/cardsfolder/m/mystic_confluence.txt | 2 +- forge-gui/res/cardsfolder/m/mystic_decree.txt | 2 +- forge-gui/res/cardsfolder/m/mystic_gate.txt | 2 +- forge-gui/res/cardsfolder/m/mystic_remora.txt | 2 +- forge-gui/res/cardsfolder/m/mystic_retrieval.txt | 2 +- forge-gui/res/cardsfolder/m/mystic_veil.txt | 2 +- forge-gui/res/cardsfolder/m/mystical_teachings.txt | 2 +- forge-gui/res/cardsfolder/m/mystical_tutor.txt | 2 +- forge-gui/res/cardsfolder/m/myth_unbound.txt | 2 +- forge-gui/res/cardsfolder/n/nacatl_hunt_pride.txt | 2 +- forge-gui/res/cardsfolder/n/nacre_talisman.txt | 2 +- forge-gui/res/cardsfolder/n/nagao_bound_by_honor.txt | 2 +- forge-gui/res/cardsfolder/n/nahiri_the_lithomancer.txt | 2 +- forge-gui/res/cardsfolder/n/nahiris_wrath.txt | 2 +- forge-gui/res/cardsfolder/n/naked_singularity.txt | 4 ++-- forge-gui/res/cardsfolder/n/nalathni_dragon.txt | 2 +- forge-gui/res/cardsfolder/n/nameless_one.txt | 2 +- forge-gui/res/cardsfolder/n/nameless_race.txt | 4 ++-- forge-gui/res/cardsfolder/n/nantuko_cultivator.txt | 2 +- forge-gui/res/cardsfolder/n/nantuko_mentor.txt | 2 +- forge-gui/res/cardsfolder/n/nantuko_monastery.txt | 2 +- forge-gui/res/cardsfolder/n/nantuko_shrine.txt | 2 +- forge-gui/res/cardsfolder/n/narcissism.txt | 2 +- forge-gui/res/cardsfolder/n/narnam_cobra.txt | 2 +- forge-gui/res/cardsfolder/n/natural_affinity.txt | 2 +- forge-gui/res/cardsfolder/n/natural_emergence.txt | 2 +- forge-gui/res/cardsfolder/n/natural_selection.txt | 2 +- forge-gui/res/cardsfolder/n/natures_blessing.txt | 2 +- forge-gui/res/cardsfolder/n/natures_chosen.txt | 2 +- forge-gui/res/cardsfolder/n/natures_cloak.txt | 2 +- forge-gui/res/cardsfolder/n/natures_revolt.txt | 2 +- forge-gui/res/cardsfolder/n/natures_ruin.txt | 2 +- forge-gui/res/cardsfolder/n/natures_wrath.txt | 2 +- forge-gui/res/cardsfolder/n/naya_soulbeast.txt | 2 +- forge-gui/res/cardsfolder/n/near_death_experience.txt | 2 +- forge-gui/res/cardsfolder/n/nebuchadnezzar.txt | 2 +- forge-gui/res/cardsfolder/n/necra_sanctuary.txt | 2 +- forge-gui/res/cardsfolder/n/necravolver.txt | 2 +- forge-gui/res/cardsfolder/n/necrogen_mists.txt | 2 +- forge-gui/res/cardsfolder/n/necrogen_spellbomb.txt | 2 +- forge-gui/res/cardsfolder/n/necrogenesis.txt | 2 +- forge-gui/res/cardsfolder/n/necromancers_stockpile.txt | 4 ++-- forge-gui/res/cardsfolder/n/necroplasm.txt | 2 +- forge-gui/res/cardsfolder/n/necropotence.txt | 2 +- forge-gui/res/cardsfolder/n/necropotence_avatar.txt | 2 +- forge-gui/res/cardsfolder/n/necrotic_plague.txt | 2 +- forge-gui/res/cardsfolder/n/nectar_faerie.txt | 2 +- forge-gui/res/cardsfolder/n/need_for_speed.txt | 2 +- forge-gui/res/cardsfolder/n/nefarious_lich.txt | 4 ++-- forge-gui/res/cardsfolder/n/nekrataal_avatar.txt | 2 +- forge-gui/res/cardsfolder/n/nemata_grove_guardian.txt | 2 +- forge-gui/res/cardsfolder/n/nether_void.txt | 2 +- forge-gui/res/cardsfolder/n/nettling_imp.txt | 2 +- forge-gui/res/cardsfolder/n/neurok_replica.txt | 2 +- forge-gui/res/cardsfolder/n/neurok_transmuter.txt | 2 +- forge-gui/res/cardsfolder/n/neverending_torment.txt | 2 +- forge-gui/res/cardsfolder/n/nevermore.txt | 2 +- forge-gui/res/cardsfolder/n/new_frontiers.txt | 2 +- forge-gui/res/cardsfolder/n/nezumi_bone_reader.txt | 2 +- forge-gui/res/cardsfolder/n/nezumi_shadow_watcher.txt | 2 +- forge-gui/res/cardsfolder/n/niblis_of_the_breath.txt | 2 +- forge-gui/res/cardsfolder/n/night_dealings.txt | 2 +- forge-gui/res/cardsfolder/n/night_of_souls_betrayal.txt | 2 +- forge-gui/res/cardsfolder/n/night_soil.txt | 2 +- forge-gui/res/cardsfolder/n/nightbirds_clutches.txt | 2 +- forge-gui/res/cardsfolder/n/nightcreep.txt | 2 +- forge-gui/res/cardsfolder/n/nightmare_lash.txt | 2 +- forge-gui/res/cardsfolder/n/nightscape_apprentice.txt | 2 +- forge-gui/res/cardsfolder/n/nightscape_master.txt | 2 +- forge-gui/res/cardsfolder/n/nightshade_assassin.txt | 2 +- forge-gui/res/cardsfolder/n/nightshade_schemers.txt | 2 +- forge-gui/res/cardsfolder/n/nightshade_seer.txt | 2 +- forge-gui/res/cardsfolder/n/nightsnare.txt | 2 +- forge-gui/res/cardsfolder/n/nihil_spellbomb.txt | 2 +- forge-gui/res/cardsfolder/n/nihilistic_glee.txt | 2 +- forge-gui/res/cardsfolder/n/nim_devourer.txt | 2 +- forge-gui/res/cardsfolder/n/nim_grotesque.txt | 2 +- forge-gui/res/cardsfolder/n/nim_lasher.txt | 2 +- forge-gui/res/cardsfolder/n/nim_replica.txt | 2 +- forge-gui/res/cardsfolder/n/nim_shambler.txt | 2 +- forge-gui/res/cardsfolder/n/nim_shrieker.txt | 2 +- forge-gui/res/cardsfolder/n/nin_the_pain_artist.txt | 2 +- forge-gui/res/cardsfolder/n/nine_ringed_bo.txt | 2 +- forge-gui/res/cardsfolder/n/nissa_revane.txt | 2 +- forge-gui/res/cardsfolder/n/nissas_defeat.txt | 2 +- forge-gui/res/cardsfolder/n/nissas_judgment.txt | 2 +- forge-gui/res/cardsfolder/n/niveous_wisps.txt | 2 +- forge-gui/res/cardsfolder/n/nivix_aerie_of_the_firemind.txt | 2 +- forge-gui/res/cardsfolder/n/nivmagus_elemental.txt | 2 +- forge-gui/res/cardsfolder/n/nix.txt | 2 +- forge-gui/res/cardsfolder/n/no_quarter.txt | 2 +- forge-gui/res/cardsfolder/n/noble_elephant.txt | 2 +- forge-gui/res/cardsfolder/n/noetic_scales.txt | 2 +- forge-gui/res/cardsfolder/n/nomad_stadium.txt | 2 +- forge-gui/res/cardsfolder/n/nomadic_elf.txt | 2 +- forge-gui/res/cardsfolder/n/nomads_en_kor.txt | 2 +- forge-gui/res/cardsfolder/n/norin_the_wary.txt | 2 +- forge-gui/res/cardsfolder/n/norritt.txt | 2 +- forge-gui/res/cardsfolder/n/north_star.txt | 2 +- forge-gui/res/cardsfolder/n/northern_paladin.txt | 2 +- forge-gui/res/cardsfolder/n/nostalgic_dreams.txt | 2 +- forge-gui/res/cardsfolder/n/nourishing_shoal.txt | 2 +- forge-gui/res/cardsfolder/n/nova_chaser.txt | 2 +- forge-gui/res/cardsfolder/n/nova_pentacle.txt | 4 ++-- forge-gui/res/cardsfolder/n/noxious_vapors.txt | 4 ++-- forge-gui/res/cardsfolder/n/null_brooch.txt | 2 +- forge-gui/res/cardsfolder/n/null_chamber.txt | 2 +- forge-gui/res/cardsfolder/n/null_profusion.txt | 2 +- forge-gui/res/cardsfolder/n/null_rod.txt | 2 +- forge-gui/res/cardsfolder/n/nullmage_advocate.txt | 2 +- forge-gui/res/cardsfolder/n/nullmage_shepherd.txt | 2 +- forge-gui/res/cardsfolder/n/nullstone_gargoyle.txt | 2 +- forge-gui/res/cardsfolder/n/numai_outcast.txt | 2 +- forge-gui/res/cardsfolder/n/nurturing_licid.txt | 2 +- forge-gui/res/cardsfolder/n/nyx_weaver.txt | 2 +- forge-gui/res/cardsfolder/o/oath_of_lim_dul.txt | 2 +- forge-gui/res/cardsfolder/o/oath_of_scholars.txt | 2 +- forge-gui/res/cardsfolder/o/oath_of_the_ancient_wood.txt | 2 +- forge-gui/res/cardsfolder/o/oathkeeper_takenos_daisho.txt | 2 +- .../res/cardsfolder/o/ob_nixilis_of_the_black_oath.txt | 2 +- forge-gui/res/cardsfolder/o/obelisk_of_urd.txt | 2 +- forge-gui/res/cardsfolder/o/oblivion_crown.txt | 2 +- forge-gui/res/cardsfolder/o/oblivion_stone.txt | 2 +- forge-gui/res/cardsfolder/o/oboro_breezecaller.txt | 2 +- forge-gui/res/cardsfolder/o/oboro_envoy.txt | 2 +- forge-gui/res/cardsfolder/o/obscuring_aether.txt | 2 +- forge-gui/res/cardsfolder/o/odric_master_tactician.txt | 2 +- forge-gui/res/cardsfolder/o/odunos_river_trawler.txt | 4 ++-- forge-gui/res/cardsfolder/o/offalsnout.txt | 2 +- forge-gui/res/cardsfolder/o/ogre_marauder.txt | 4 ++-- forge-gui/res/cardsfolder/o/ogre_recluse.txt | 2 +- forge-gui/res/cardsfolder/o/ogre_savant.txt | 2 +- forge-gui/res/cardsfolder/o/ojutai_monument.txt | 2 +- forge-gui/res/cardsfolder/o/omen.txt | 2 +- forge-gui/res/cardsfolder/o/omen_machine.txt | 2 +- forge-gui/res/cardsfolder/o/omen_of_fire.txt | 2 +- forge-gui/res/cardsfolder/o/omnath_locus_of_mana.txt | 2 +- forge-gui/res/cardsfolder/o/omnibian.txt | 2 +- forge-gui/res/cardsfolder/o/omniscience.txt | 2 +- forge-gui/res/cardsfolder/o/ondu_cleric.txt | 2 +- forge-gui/res/cardsfolder/o/one_with_nothing.txt | 2 +- forge-gui/res/cardsfolder/o/oni_of_wild_places.txt | 2 +- forge-gui/res/cardsfolder/o/oni_possession.txt | 2 +- forge-gui/res/cardsfolder/o/onyx_talisman.txt | 2 +- forge-gui/res/cardsfolder/o/ooze_flux.txt | 2 +- forge-gui/res/cardsfolder/o/opal_acrolith.txt | 2 +- forge-gui/res/cardsfolder/o/opal_eye_kondas_yojimbo.txt | 2 +- forge-gui/res/cardsfolder/o/opal_palace.txt | 4 ++-- forge-gui/res/cardsfolder/o/opalescence.txt | 2 +- forge-gui/res/cardsfolder/o/open_the_armory.txt | 2 +- forge-gui/res/cardsfolder/o/open_the_vaults.txt | 2 +- forge-gui/res/cardsfolder/o/ophidian.txt | 2 +- forge-gui/res/cardsfolder/o/opposition.txt | 2 +- forge-gui/res/cardsfolder/o/oppression.txt | 2 +- forge-gui/res/cardsfolder/o/oppressive_will.txt | 2 +- forge-gui/res/cardsfolder/o/oracle.txt | 2 +- forge-gui/res/cardsfolder/o/oracles_attendants.txt | 2 +- forge-gui/res/cardsfolder/o/oran_rief_recluse.txt | 2 +- forge-gui/res/cardsfolder/o/orb_of_dreams.txt | 2 +- forge-gui/res/cardsfolder/o/orbweaver_kumo.txt | 2 +- forge-gui/res/cardsfolder/o/orc_general.txt | 2 +- forge-gui/res/cardsfolder/o/orcish_artillery.txt | 2 +- forge-gui/res/cardsfolder/o/orcish_bloodpainter.txt | 2 +- forge-gui/res/cardsfolder/o/orcish_cannonade.txt | 2 +- forge-gui/res/cardsfolder/o/orcish_cannoneers.txt | 2 +- forge-gui/res/cardsfolder/o/orcish_farmer.txt | 2 +- forge-gui/res/cardsfolder/o/orcish_healer.txt | 2 +- forge-gui/res/cardsfolder/o/orcish_librarian.txt | 2 +- forge-gui/res/cardsfolder/o/orcish_lumberjack.txt | 2 +- forge-gui/res/cardsfolder/o/orcish_mechanics.txt | 2 +- forge-gui/res/cardsfolder/o/orcish_settlers.txt | 2 +- forge-gui/res/cardsfolder/o/orcish_vandal.txt | 2 +- forge-gui/res/cardsfolder/o/order_of_succession.txt | 2 +- forge-gui/res/cardsfolder/o/order_of_the_sacred_torch.txt | 2 +- forge-gui/res/cardsfolder/o/ordered_migration.txt | 2 +- forge-gui/res/cardsfolder/o/ordruun_commando.txt | 2 +- forge-gui/res/cardsfolder/o/ore_gorger.txt | 2 +- forge-gui/res/cardsfolder/o/oreskos_explorer.txt | 2 +- forge-gui/res/cardsfolder/o/oriss_samite_guardian.txt | 2 +- forge-gui/res/cardsfolder/o/ornate_kanzashi.txt | 2 +- forge-gui/res/cardsfolder/o/orochi_leafcaller.txt | 2 +- forge-gui/res/cardsfolder/o/orzhov_charm.txt | 2 +- forge-gui/res/cardsfolder/o/orzhov_cluestone.txt | 2 +- forge-gui/res/cardsfolder/o/orzhov_keyrune.txt | 2 +- forge-gui/res/cardsfolder/o/orzhov_pontiff.txt | 2 +- forge-gui/res/cardsfolder/o/orzhov_signet.txt | 2 +- forge-gui/res/cardsfolder/o/ostiary_thrull.txt | 2 +- forge-gui/res/cardsfolder/o/otherworld_atlas.txt | 2 +- forge-gui/res/cardsfolder/o/oubliette.txt | 2 +- forge-gui/res/cardsfolder/o/outbreak.txt | 2 +- forge-gui/res/cardsfolder/o/outmaneuver.txt | 2 +- forge-gui/res/cardsfolder/o/outrider_en_kor.txt | 2 +- forge-gui/res/cardsfolder/o/overabundance.txt | 2 +- forge-gui/res/cardsfolder/o/overblaze.txt | 4 ++-- forge-gui/res/cardsfolder/o/overburden.txt | 2 +- forge-gui/res/cardsfolder/o/overeager_apprentice.txt | 2 +- forge-gui/res/cardsfolder/o/overgrown_estate.txt | 2 +- forge-gui/res/cardsfolder/o/overgrowth.txt | 2 +- forge-gui/res/cardsfolder/o/overlaid_terrain.txt | 4 ++-- forge-gui/res/cardsfolder/o/overmaster.txt | 2 +- forge-gui/res/cardsfolder/o/overtaker.txt | 2 +- forge-gui/res/cardsfolder/o/overwhelm.txt | 2 +- forge-gui/res/cardsfolder/o/ovinomancer.txt | 2 +- forge-gui/res/cardsfolder/o/oxidda_daredevil.txt | 2 +- forge-gui/res/cardsfolder/o/oxidda_golem.txt | 2 +- forge-gui/res/cardsfolder/o/oyobi_who_split_the_heavens.txt | 2 +- forge-gui/res/cardsfolder/p/pack_hunt.txt | 4 ++-- forge-gui/res/cardsfolder/p/packs_disdain.txt | 2 +- forge-gui/res/cardsfolder/p/pact_of_negation.txt | 2 +- forge-gui/res/cardsfolder/p/pact_of_the_titan.txt | 2 +- forge-gui/res/cardsfolder/p/pain_kami.txt | 2 +- forge-gui/res/cardsfolder/p/painbringer.txt | 2 +- forge-gui/res/cardsfolder/p/painted_bluffs.txt | 2 +- forge-gui/res/cardsfolder/p/painwracker_oni.txt | 2 +- forge-gui/res/cardsfolder/p/pale_moon.txt | 4 ++-- forge-gui/res/cardsfolder/p/pale_wayfarer.txt | 2 +- forge-gui/res/cardsfolder/p/panacea.txt | 2 +- forge-gui/res/cardsfolder/p/pandemonium.txt | 2 +- forge-gui/res/cardsfolder/p/pangosaur.txt | 2 +- forge-gui/res/cardsfolder/p/panic_attack.txt | 2 +- forge-gui/res/cardsfolder/p/panic_spellbomb.txt | 2 +- forge-gui/res/cardsfolder/p/panoptic_mirror.txt | 2 +- forge-gui/res/cardsfolder/p/paradigm_shift.txt | 2 +- forge-gui/res/cardsfolder/p/paradox_haze.txt | 2 +- forge-gui/res/cardsfolder/p/parallax_dementia.txt | 2 +- forge-gui/res/cardsfolder/p/parallax_inhibitor.txt | 2 +- forge-gui/res/cardsfolder/p/parallax_tide.txt | 2 +- forge-gui/res/cardsfolder/p/parallax_wave.txt | 2 +- forge-gui/res/cardsfolder/p/parallectric_feedback.txt | 2 +- forge-gui/res/cardsfolder/p/parallel_evolution.txt | 2 +- forge-gui/res/cardsfolder/p/parallel_thoughts.txt | 4 ++-- forge-gui/res/cardsfolder/p/pardic_collaborator.txt | 2 +- forge-gui/res/cardsfolder/p/pardic_lancer.txt | 2 +- forge-gui/res/cardsfolder/p/pardic_miner.txt | 2 +- forge-gui/res/cardsfolder/p/pardic_swordsmith.txt | 2 +- forge-gui/res/cardsfolder/p/paroxysm.txt | 2 +- forge-gui/res/cardsfolder/p/part_the_veil.txt | 2 +- forge-gui/res/cardsfolder/p/part_water.txt | 4 ++-- forge-gui/res/cardsfolder/p/past_in_flames.txt | 2 +- forge-gui/res/cardsfolder/p/patagia_viper.txt | 2 +- forge-gui/res/cardsfolder/p/patriarchs_bidding.txt | 2 +- forge-gui/res/cardsfolder/p/patriarchs_desire.txt | 2 +- forge-gui/res/cardsfolder/p/patron_of_the_akki.txt | 2 +- forge-gui/res/cardsfolder/p/patron_of_the_kitsune.txt | 2 +- forge-gui/res/cardsfolder/p/patron_of_the_moon.txt | 2 +- forge-gui/res/cardsfolder/p/patron_of_the_nezumi.txt | 2 +- forge-gui/res/cardsfolder/p/patron_of_the_orochi.txt | 2 +- forge-gui/res/cardsfolder/p/patron_wizard.txt | 2 +- forge-gui/res/cardsfolder/p/peace_of_mind.txt | 2 +- forge-gui/res/cardsfolder/p/peacekeeper.txt | 2 +- forge-gui/res/cardsfolder/p/peak_eruption.txt | 2 +- forge-gui/res/cardsfolder/p/pearl_medallion.txt | 2 +- forge-gui/res/cardsfolder/p/peat_bog.txt | 4 ++-- forge-gui/res/cardsfolder/p/pedantic_learning.txt | 2 +- forge-gui/res/cardsfolder/p/peek.txt | 2 +- forge-gui/res/cardsfolder/p/peel_from_reality.txt | 2 +- forge-gui/res/cardsfolder/p/peer_pressure.txt | 4 ++-- forge-gui/res/cardsfolder/p/pegasus_refuge.txt | 2 +- forge-gui/res/cardsfolder/p/penance.txt | 2 +- forge-gui/res/cardsfolder/p/pendelhaven.txt | 2 +- forge-gui/res/cardsfolder/p/pendrell_mists.txt | 2 +- forge-gui/res/cardsfolder/p/peppersmoke.txt | 2 +- forge-gui/res/cardsfolder/p/peregrine_mask.txt | 2 +- forge-gui/res/cardsfolder/p/perilous_forays.txt | 2 +- forge-gui/res/cardsfolder/p/perilous_research.txt | 2 +- forge-gui/res/cardsfolder/p/perish.txt | 2 +- forge-gui/res/cardsfolder/p/pernicious_deed.txt | 2 +- forge-gui/res/cardsfolder/p/perpetual_timepiece.txt | 2 +- forge-gui/res/cardsfolder/p/perplexing_chimera.txt | 2 +- forge-gui/res/cardsfolder/p/personal_incarnation.txt | 2 +- forge-gui/res/cardsfolder/p/personal_tutor.txt | 2 +- forge-gui/res/cardsfolder/p/pestilence_rats.txt | 2 +- forge-gui/res/cardsfolder/p/petalmane_baku.txt | 2 +- forge-gui/res/cardsfolder/p/petals_of_insight.txt | 2 +- forge-gui/res/cardsfolder/p/petrahydrox.txt | 2 +- forge-gui/res/cardsfolder/p/petrified_field.txt | 2 +- forge-gui/res/cardsfolder/p/phantasmal_mount.txt | 4 ++-- forge-gui/res/cardsfolder/p/phantasmal_sphere.txt | 2 +- forge-gui/res/cardsfolder/p/phantasmal_terrain.txt | 2 +- forge-gui/res/cardsfolder/p/phantatog.txt | 2 +- forge-gui/res/cardsfolder/p/phelddagrif.txt | 2 +- forge-gui/res/cardsfolder/p/phosphorescent_feast.txt | 2 +- forge-gui/res/cardsfolder/p/phylactery_lich.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexian_altar.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexian_bloodstock.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexian_boon.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexian_colossus.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexian_debaser.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexian_delver.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexian_denouncer.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexian_devourer.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexian_dreadnought.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexian_etchings.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexian_furnace.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexian_gremlins.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexian_grimoire.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexian_ironfoot.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexian_negator.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexian_plaguelord.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexian_portal.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexian_processor.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexian_purge.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexian_reclamation.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexian_revoker.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexian_slayer.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexian_soulgorger.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexian_splicer.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexian_totem.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexian_tower.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexian_tribute.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexian_tyranny.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexian_vatmother.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexian_vault.txt | 2 +- forge-gui/res/cardsfolder/p/phyrexias_core.txt | 2 +- forge-gui/res/cardsfolder/p/piety.txt | 2 +- forge-gui/res/cardsfolder/p/piety_charm.txt | 2 +- forge-gui/res/cardsfolder/p/pikemen.txt | 2 +- forge-gui/res/cardsfolder/p/pilgrim_of_justice.txt | 2 +- forge-gui/res/cardsfolder/p/pilgrim_of_virtue.txt | 2 +- forge-gui/res/cardsfolder/p/pili_pala.txt | 2 +- forge-gui/res/cardsfolder/p/pillar_of_the_paruns.txt | 2 +- forge-gui/res/cardsfolder/p/pillar_tombs_of_aku.txt | 2 +- forge-gui/res/cardsfolder/p/pitchstone_wall.txt | 2 +- forge-gui/res/cardsfolder/p/pithing_needle.txt | 2 +- forge-gui/res/cardsfolder/p/plagiarize.txt | 2 +- forge-gui/res/cardsfolder/p/plague_boiler.txt | 2 +- forge-gui/res/cardsfolder/p/plague_dogs.txt | 2 +- forge-gui/res/cardsfolder/p/plague_rats.txt | 2 +- forge-gui/res/cardsfolder/p/plague_witch.txt | 2 +- forge-gui/res/cardsfolder/p/plagued_rusalka.txt | 2 +- forge-gui/res/cardsfolder/p/plaguemaw_beast.txt | 2 +- forge-gui/res/cardsfolder/p/planar_birth.txt | 2 +- forge-gui/res/cardsfolder/p/planar_chaos.txt | 2 +- forge-gui/res/cardsfolder/p/planar_collapse.txt | 2 +- forge-gui/res/cardsfolder/p/planar_despair.txt | 2 +- forge-gui/res/cardsfolder/p/planar_guide.txt | 2 +- forge-gui/res/cardsfolder/p/planar_overlay.txt | 4 ++-- forge-gui/res/cardsfolder/p/planar_void.txt | 2 +- forge-gui/res/cardsfolder/p/planeswalkers_fury.txt | 2 +- forge-gui/res/cardsfolder/p/plaxmanta.txt | 2 +- forge-gui/res/cardsfolder/p/plea_for_guidance.txt | 2 +- forge-gui/res/cardsfolder/p/plea_for_power.txt | 2 +- forge-gui/res/cardsfolder/p/plow_through_reito.txt | 2 +- forge-gui/res/cardsfolder/p/plunge_into_darkness.txt | 2 +- forge-gui/res/cardsfolder/p/political_trickery.txt | 2 +- forge-gui/res/cardsfolder/p/pollen_remedy.txt | 2 +- forge-gui/res/cardsfolder/p/polymorph.txt | 2 +- forge-gui/res/cardsfolder/p/polymorphists_jest.txt | 2 +- forge-gui/res/cardsfolder/p/polymorphous_rush.txt | 2 +- forge-gui/res/cardsfolder/p/ponder.txt | 2 +- forge-gui/res/cardsfolder/p/porphyry_nodes.txt | 2 +- forge-gui/res/cardsfolder/p/portal_mage.txt | 2 +- forge-gui/res/cardsfolder/p/portcullis.txt | 2 +- forge-gui/res/cardsfolder/p/portent.txt | 2 +- forge-gui/res/cardsfolder/p/possessed_portal.txt | 2 +- forge-gui/res/cardsfolder/p/postmortem_lunge.txt | 2 +- forge-gui/res/cardsfolder/p/powder_keg.txt | 2 +- forge-gui/res/cardsfolder/p/power_armor.txt | 2 +- forge-gui/res/cardsfolder/p/power_artifact.txt | 2 +- forge-gui/res/cardsfolder/p/power_surge.txt | 2 +- forge-gui/res/cardsfolder/p/powerleech.txt | 2 +- forge-gui/res/cardsfolder/p/powerstone_minefield.txt | 2 +- forge-gui/res/cardsfolder/p/pox.txt | 2 +- forge-gui/res/cardsfolder/p/praetors_grasp.txt | 2 +- forge-gui/res/cardsfolder/p/prakhata_pillar-bug.txt | 2 +- forge-gui/res/cardsfolder/p/precognition.txt | 2 +- forge-gui/res/cardsfolder/p/predict.txt | 2 +- forge-gui/res/cardsfolder/p/presence_of_the_master.txt | 2 +- forge-gui/res/cardsfolder/p/price_of_glory.txt | 2 +- forge-gui/res/cardsfolder/p/price_of_progress.txt | 2 +- forge-gui/res/cardsfolder/p/priest_of_yawgmoth.txt | 2 +- forge-gui/res/cardsfolder/p/primal_beyond.txt | 2 +- forge-gui/res/cardsfolder/p/primal_clay.txt | 2 +- forge-gui/res/cardsfolder/p/primal_cocoon.txt | 2 +- forge-gui/res/cardsfolder/p/primal_order.txt | 2 +- forge-gui/res/cardsfolder/p/primal_plasma.txt | 2 +- forge-gui/res/cardsfolder/p/primal_whisperer.txt | 2 +- forge-gui/res/cardsfolder/p/primordial_mist.txt | 2 +- forge-gui/res/cardsfolder/p/primordial_ooze.txt | 2 +- forge-gui/res/cardsfolder/p/prism_array.txt | 2 +- forge-gui/res/cardsfolder/p/prismatic_circle.txt | 2 +- forge-gui/res/cardsfolder/p/prismatic_lace.txt | 4 ++-- forge-gui/res/cardsfolder/p/prismatic_lens.txt | 2 +- forge-gui/res/cardsfolder/p/prismatic_omen.txt | 2 +- forge-gui/res/cardsfolder/p/prismatic_strands.txt | 2 +- forge-gui/res/cardsfolder/p/prismwake_merrow.txt | 2 +- forge-gui/res/cardsfolder/p/proclamation_of_rebirth.txt | 2 +- forge-gui/res/cardsfolder/p/profane_command.txt | 2 +- forge-gui/res/cardsfolder/p/profane_prayers.txt | 2 +- forge-gui/res/cardsfolder/p/profaner_of_the_dead.txt | 2 +- forge-gui/res/cardsfolder/p/prohibit.txt | 2 +- forge-gui/res/cardsfolder/p/promise_of_power.txt | 2 +- forge-gui/res/cardsfolder/p/prophetic_prism.txt | 2 +- forge-gui/res/cardsfolder/p/prophetic_ravings.txt | 2 +- forge-gui/res/cardsfolder/p/prosperity.txt | 2 +- forge-gui/res/cardsfolder/p/protective_sphere.txt | 4 ++-- forge-gui/res/cardsfolder/p/proteus_staff.txt | 4 ++-- forge-gui/res/cardsfolder/p/protomatter_powder.txt | 2 +- forge-gui/res/cardsfolder/p/prototype_portal.txt | 2 +- forge-gui/res/cardsfolder/p/provoke.txt | 2 +- forge-gui/res/cardsfolder/p/prowess_of_the_fair.txt | 2 +- forge-gui/res/cardsfolder/p/psionic_entity.txt | 2 +- forge-gui/res/cardsfolder/p/psychatog.txt | 2 +- forge-gui/res/cardsfolder/p/psychic_allergy.txt | 2 +- forge-gui/res/cardsfolder/p/psychic_intrusion.txt | 2 +- forge-gui/res/cardsfolder/p/psychic_possession.txt | 2 +- forge-gui/res/cardsfolder/p/psychic_puppetry.txt | 2 +- forge-gui/res/cardsfolder/p/psychic_spear.txt | 2 +- forge-gui/res/cardsfolder/p/psychic_surgery.txt | 2 +- forge-gui/res/cardsfolder/p/psychic_theft.txt | 2 +- forge-gui/res/cardsfolder/p/psychic_trance.txt | 4 ++-- forge-gui/res/cardsfolder/p/psychic_transfer.txt | 2 +- forge-gui/res/cardsfolder/p/psychic_vortex.txt | 2 +- forge-gui/res/cardsfolder/p/psychogenic_probe.txt | 2 +- forge-gui/res/cardsfolder/p/psychosis_crawler.txt | 2 +- forge-gui/res/cardsfolder/p/psychotic_episode.txt | 2 +- forge-gui/res/cardsfolder/p/psychotic_fury.txt | 2 +- forge-gui/res/cardsfolder/p/pteron_ghost.txt | 2 +- forge-gui/res/cardsfolder/p/pucas_mischief.txt | 2 +- forge-gui/res/cardsfolder/p/pull_from_eternity.txt | 2 +- forge-gui/res/cardsfolder/p/pulsating_illusion.txt | 2 +- forge-gui/res/cardsfolder/p/pulse_of_llanowar.txt | 2 +- forge-gui/res/cardsfolder/p/pulsemage_advocate.txt | 2 +- forge-gui/res/cardsfolder/p/puppet_strings.txt | 2 +- forge-gui/res/cardsfolder/p/puppeteer.txt | 2 +- forge-gui/res/cardsfolder/p/puppets_verdict.txt | 2 +- forge-gui/res/cardsfolder/p/pure_intentions.txt | 4 ++-- forge-gui/res/cardsfolder/p/purelace.txt | 4 ++-- forge-gui/res/cardsfolder/p/puresight_merrow.txt | 2 +- forge-gui/res/cardsfolder/p/purging_scythe.txt | 2 +- forge-gui/res/cardsfolder/p/purify_the_grave.txt | 2 +- forge-gui/res/cardsfolder/p/pursuit_of_knowledge.txt | 2 +- forge-gui/res/cardsfolder/p/putrefaction.txt | 2 +- forge-gui/res/cardsfolder/p/putrid_cyclops.txt | 2 +- forge-gui/res/cardsfolder/p/putrid_imp.txt | 2 +- forge-gui/res/cardsfolder/p/putrid_leech.txt | 2 +- forge-gui/res/cardsfolder/p/putrid_warrior.txt | 2 +- forge-gui/res/cardsfolder/p/pygmy_hippo.txt | 2 +- forge-gui/res/cardsfolder/p/pygmy_kavu.txt | 2 +- forge-gui/res/cardsfolder/p/pyric_salamander.txt | 2 +- forge-gui/res/cardsfolder/p/pyrite_spellbomb.txt | 2 +- forge-gui/res/cardsfolder/p/pyroblast.txt | 2 +- forge-gui/res/cardsfolder/p/pyroclast_consul.txt | 2 +- forge-gui/res/cardsfolder/p/pyroconvergence.txt | 2 +- forge-gui/res/cardsfolder/p/pyromancers_gauntlet.txt | 2 +- forge-gui/res/cardsfolder/p/pyromancers_swath.txt | 2 +- forge-gui/res/cardsfolder/p/pyromancy.txt | 2 +- forge-gui/res/cardsfolder/p/pyromania.txt | 2 +- forge-gui/res/cardsfolder/p/pyrostatic_pillar.txt | 2 +- forge-gui/res/cardsfolder/p/pyxis_of_pandemonium.txt | 2 +- forge-gui/res/cardsfolder/q/quagmire.txt | 2 +- forge-gui/res/cardsfolder/q/quagmire_druid.txt | 2 +- forge-gui/res/cardsfolder/q/quarum_trench_gnomes.txt | 4 ++-- forge-gui/res/cardsfolder/q/quest_for_ancient_secrets.txt | 2 +- forge-gui/res/cardsfolder/q/quest_for_pure_flame.txt | 2 +- forge-gui/res/cardsfolder/q/quest_for_the_holy_relic.txt | 2 +- forge-gui/res/cardsfolder/q/quest_for_the_nihil_stone.txt | 2 +- forge-gui/res/cardsfolder/q/questing_phelddagrif.txt | 2 +- forge-gui/res/cardsfolder/q/quickchange.txt | 4 ++-- forge-gui/res/cardsfolder/q/quicken.txt | 2 +- forge-gui/res/cardsfolder/q/quickening_licid.txt | 2 +- forge-gui/res/cardsfolder/q/quicksilver_dragon.txt | 2 +- forge-gui/res/cardsfolder/q/quicksilver_elemental.txt | 2 +- forge-gui/res/cardsfolder/q/quicksilver_fountain.txt | 2 +- forge-gui/res/cardsfolder/q/quiet_speculation.txt | 2 +- forge-gui/res/cardsfolder/q/quillmane_baku.txt | 2 +- forge-gui/res/cardsfolder/q/quillspike.txt | 2 +- forge-gui/res/cardsfolder/q/quirion_dryad.txt | 2 +- forge-gui/res/cardsfolder/q/quirion_ranger.txt | 2 +- forge-gui/res/cardsfolder/r/radiant_destiny.txt | 2 +- forge-gui/res/cardsfolder/r/radiant_essence.txt | 2 +- forge-gui/res/cardsfolder/r/radiant_flames.txt | 2 +- forge-gui/res/cardsfolder/r/radiant_kavu.txt | 2 +- forge-gui/res/cardsfolder/r/radiate.txt | 2 +- forge-gui/res/cardsfolder/r/ragamuffyn.txt | 2 +- forge-gui/res/cardsfolder/r/rage_extractor.txt | 2 +- forge-gui/res/cardsfolder/r/rage_weaver.txt | 2 +- forge-gui/res/cardsfolder/r/ragnar.txt | 2 +- forge-gui/res/cardsfolder/r/rain_of_daggers.txt | 2 +- forge-gui/res/cardsfolder/r/rain_of_filth.txt | 2 +- forge-gui/res/cardsfolder/r/rain_of_gore.txt | 2 +- forge-gui/res/cardsfolder/r/rain_of_rust.txt | 2 +- forge-gui/res/cardsfolder/r/rainbow_crow.txt | 2 +- forge-gui/res/cardsfolder/r/rainbow_vale.txt | 2 +- forge-gui/res/cardsfolder/r/raka_sanctuary.txt | 2 +- forge-gui/res/cardsfolder/r/rakalite.txt | 2 +- forge-gui/res/cardsfolder/r/rakavolver.txt | 2 +- forge-gui/res/cardsfolder/r/rakdos_augermage.txt | 2 +- forge-gui/res/cardsfolder/r/rakdos_charm.txt | 2 +- forge-gui/res/cardsfolder/r/rakdos_cluestone.txt | 2 +- forge-gui/res/cardsfolder/r/rakdos_keyrune.txt | 2 +- forge-gui/res/cardsfolder/r/rakdos_riteknife.txt | 2 +- forge-gui/res/cardsfolder/r/rakdos_signet.txt | 2 +- forge-gui/res/cardsfolder/r/rakdos_the_defiler.txt | 2 +- forge-gui/res/cardsfolder/r/raksha_golden_cub.txt | 2 +- forge-gui/res/cardsfolder/r/rally_the_ancestors.txt | 2 +- forge-gui/res/cardsfolder/r/rally_the_horde.txt | 2 +- forge-gui/res/cardsfolder/r/rally_the_righteous.txt | 2 +- forge-gui/res/cardsfolder/r/rally_the_troops.txt | 2 +- forge-gui/res/cardsfolder/r/ramosian_rally.txt | 2 +- forge-gui/res/cardsfolder/r/rampant_elephant.txt | 4 ++-- forge-gui/res/cardsfolder/r/rank_and_file.txt | 2 +- forge-gui/res/cardsfolder/r/ransack.txt | 2 +- forge-gui/res/cardsfolder/r/rapid_decay.txt | 2 +- forge-gui/res/cardsfolder/r/rapid_fire.txt | 2 +- forge-gui/res/cardsfolder/r/rashka_the_slayer.txt | 2 +- forge-gui/res/cardsfolder/r/rathi_assassin.txt | 2 +- forge-gui/res/cardsfolder/r/rathi_fiend.txt | 2 +- forge-gui/res/cardsfolder/r/rathi_intimidator.txt | 2 +- forge-gui/res/cardsfolder/r/raths_edge.txt | 2 +- forge-gui/res/cardsfolder/r/rats_feast.txt | 4 ++-- forge-gui/res/cardsfolder/r/rattleblaze_scarecrow.txt | 2 +- forge-gui/res/cardsfolder/r/raven_guild_initiate.txt | 2 +- forge-gui/res/cardsfolder/r/ravenous_trap.txt | 2 +- forge-gui/res/cardsfolder/r/ravenous_vampire.txt | 2 +- forge-gui/res/cardsfolder/r/raving_oni_slave.txt | 2 +- forge-gui/res/cardsfolder/r/raze.txt | 2 +- forge-gui/res/cardsfolder/r/razia_boros_archangel.txt | 2 +- forge-gui/res/cardsfolder/r/razias_purification.txt | 2 +- forge-gui/res/cardsfolder/r/razing_snidd.txt | 2 +- forge-gui/res/cardsfolder/r/razor_golem.txt | 2 +- forge-gui/res/cardsfolder/r/razor_pendulum.txt | 2 +- forge-gui/res/cardsfolder/r/razorjaw_oni.txt | 2 +- forge-gui/res/cardsfolder/r/razormane_masticore.txt | 2 +- forge-gui/res/cardsfolder/r/read_the_runes.txt | 2 +- forge-gui/res/cardsfolder/r/reality_anchor.txt | 2 +- forge-gui/res/cardsfolder/r/reality_ripple.txt | 2 +- forge-gui/res/cardsfolder/r/reality_spasm.txt | 2 +- forge-gui/res/cardsfolder/r/reality_twist.txt | 4 ++-- forge-gui/res/cardsfolder/r/realm_razer.txt | 2 +- forge-gui/res/cardsfolder/r/reap.txt | 2 +- forge-gui/res/cardsfolder/r/reaper_king.txt | 2 +- forge-gui/res/cardsfolder/r/reaping_the_rewards.txt | 2 +- forge-gui/res/cardsfolder/r/rebellion_of_the_flamekin.txt | 2 +- forge-gui/res/cardsfolder/r/reborn_hope.txt | 2 +- forge-gui/res/cardsfolder/r/rebound.txt | 2 +- forge-gui/res/cardsfolder/r/recall.txt | 2 +- forge-gui/res/cardsfolder/r/recantation.txt | 2 +- forge-gui/res/cardsfolder/r/reckless_abandon.txt | 2 +- forge-gui/res/cardsfolder/r/reckless_assault.txt | 2 +- forge-gui/res/cardsfolder/r/reckless_one.txt | 2 +- forge-gui/res/cardsfolder/r/reclamation.txt | 2 +- forge-gui/res/cardsfolder/r/reclusive_wight.txt | 2 +- forge-gui/res/cardsfolder/r/reconnaissance.txt | 2 +- forge-gui/res/cardsfolder/r/recurring_insight.txt | 2 +- forge-gui/res/cardsfolder/r/recycle.txt | 2 +- forge-gui/res/cardsfolder/r/red_elemental_blast.txt | 2 +- forge-gui/res/cardsfolder/r/red_mana_battery.txt | 2 +- forge-gui/res/cardsfolder/r/red_scarab.txt | 2 +- forge-gui/res/cardsfolder/r/red_ward.txt | 2 +- forge-gui/res/cardsfolder/r/redeem.txt | 2 +- forge-gui/res/cardsfolder/r/redirect.txt | 2 +- forge-gui/res/cardsfolder/r/reduce_to_dreams.txt | 2 +- forge-gui/res/cardsfolder/r/reef_shaman.txt | 2 +- forge-gui/res/cardsfolder/r/reflect_damage.txt | 2 +- forge-gui/res/cardsfolder/r/reflecting_mirror.txt | 2 +- forge-gui/res/cardsfolder/r/refuse_cooperate.txt | 2 +- forge-gui/res/cardsfolder/r/reign_of_chaos.txt | 2 +- forge-gui/res/cardsfolder/r/reign_of_terror.txt | 4 ++-- forge-gui/res/cardsfolder/r/reincarnation.txt | 2 +- forge-gui/res/cardsfolder/r/reins_of_power.txt | 2 +- forge-gui/res/cardsfolder/r/reins_of_the_vinesteed.txt | 4 ++-- forge-gui/res/cardsfolder/r/reiterate.txt | 2 +- forge-gui/res/cardsfolder/r/reito_lantern.txt | 2 +- forge-gui/res/cardsfolder/r/reiver_demon.txt | 2 +- forge-gui/res/cardsfolder/r/relic_barrier.txt | 2 +- forge-gui/res/cardsfolder/r/relic_bind.txt | 2 +- forge-gui/res/cardsfolder/r/relic_of_progenitus.txt | 2 +- forge-gui/res/cardsfolder/r/relic_putrescence.txt | 2 +- forge-gui/res/cardsfolder/r/relic_ward.txt | 2 +- forge-gui/res/cardsfolder/r/remedy.txt | 2 +- forge-gui/res/cardsfolder/r/reminisce.txt | 2 +- forge-gui/res/cardsfolder/r/remote_farm.txt | 2 +- forge-gui/res/cardsfolder/r/remove_enchantments.txt | 2 +- forge-gui/res/cardsfolder/r/rend_spirit.txt | 2 +- forge-gui/res/cardsfolder/r/rending_volley.txt | 2 +- forge-gui/res/cardsfolder/r/renewing_dawn.txt | 2 +- forge-gui/res/cardsfolder/r/renounce.txt | 2 +- forge-gui/res/cardsfolder/r/renowned_weaponsmith.txt | 2 +- forge-gui/res/cardsfolder/r/repel_intruders.txt | 2 +- forge-gui/res/cardsfolder/r/repel_the_abominable.txt | 2 +- forge-gui/res/cardsfolder/r/repentance.txt | 2 +- forge-gui/res/cardsfolder/r/repercussion.txt | 2 +- forge-gui/res/cardsfolder/r/repopulate.txt | 2 +- forge-gui/res/cardsfolder/r/reprocess.txt | 2 +- forge-gui/res/cardsfolder/r/reroute.txt | 2 +- forge-gui/res/cardsfolder/r/rescue_from_the_underworld.txt | 2 +- forge-gui/res/cardsfolder/r/research_development.txt | 2 +- forge-gui/res/cardsfolder/r/reset.txt | 2 +- forge-gui/res/cardsfolder/r/reshape.txt | 2 +- forge-gui/res/cardsfolder/r/resilient_wanderer.txt | 2 +- forge-gui/res/cardsfolder/r/resistance_fighter.txt | 2 +- forge-gui/res/cardsfolder/r/resounding_roar.txt | 2 +- forge-gui/res/cardsfolder/r/resounding_scream.txt | 2 +- forge-gui/res/cardsfolder/r/resounding_silence.txt | 2 +- forge-gui/res/cardsfolder/r/resplendent_mentor.txt | 2 +- forge-gui/res/cardsfolder/r/rest_in_peace.txt | 2 +- forge-gui/res/cardsfolder/r/restless_dreams.txt | 2 +- forge-gui/res/cardsfolder/r/restore.txt | 2 +- forge-gui/res/cardsfolder/r/restore_balance.txt | 2 +- forge-gui/res/cardsfolder/r/resuscitate.txt | 2 +- forge-gui/res/cardsfolder/r/retether.txt | 2 +- forge-gui/res/cardsfolder/r/retraced_image.txt | 4 ++-- forge-gui/res/cardsfolder/r/retract.txt | 2 +- forge-gui/res/cardsfolder/r/retraction_helix.txt | 2 +- forge-gui/res/cardsfolder/r/retribution_of_the_ancients.txt | 4 ++-- forge-gui/res/cardsfolder/r/return_of_the_nightstalkers.txt | 2 +- forge-gui/res/cardsfolder/r/revealing_wind.txt | 2 +- forge-gui/res/cardsfolder/r/revelation.txt | 4 ++-- forge-gui/res/cardsfolder/r/revenant.txt | 2 +- forge-gui/res/cardsfolder/r/revenant_patriarch.txt | 2 +- forge-gui/res/cardsfolder/r/reverberate.txt | 2 +- forge-gui/res/cardsfolder/r/reverberation.txt | 2 +- forge-gui/res/cardsfolder/r/reverent_mantra.txt | 2 +- forge-gui/res/cardsfolder/r/reverse_polarity.txt | 2 +- forge-gui/res/cardsfolder/r/reverse_the_sands.txt | 2 +- forge-gui/res/cardsfolder/r/rewards_of_diversity.txt | 2 +- forge-gui/res/cardsfolder/r/reweave.txt | 2 +- forge-gui/res/cardsfolder/r/rhox_meditant.txt | 2 +- forge-gui/res/cardsfolder/r/rhys_the_exiled.txt | 2 +- forge-gui/res/cardsfolder/r/rhystic_cave.txt | 2 +- forge-gui/res/cardsfolder/r/rhystic_circle.txt | 2 +- forge-gui/res/cardsfolder/r/rhystic_deluge.txt | 2 +- forge-gui/res/cardsfolder/r/rhystic_lightning.txt | 2 +- forge-gui/res/cardsfolder/r/rhystic_shield.txt | 2 +- forge-gui/res/cardsfolder/r/rhystic_tutor.txt | 2 +- forge-gui/res/cardsfolder/r/ribbons_of_night.txt | 2 +- forge-gui/res/cardsfolder/r/ribbons_of_the_reikai.txt | 2 +- forge-gui/res/cardsfolder/r/riddle_of_lightning.txt | 2 +- forge-gui/res/cardsfolder/r/riddlesmith.txt | 2 +- forge-gui/res/cardsfolder/r/rift_elemental.txt | 2 +- forge-gui/res/cardsfolder/r/righteous_aura.txt | 2 +- forge-gui/res/cardsfolder/r/righteous_indignation.txt | 2 +- forge-gui/res/cardsfolder/r/righteousness.txt | 2 +- forge-gui/res/cardsfolder/r/rimebound_dead.txt | 2 +- forge-gui/res/cardsfolder/r/rimefeather_owl.txt | 2 +- forge-gui/res/cardsfolder/r/rimehorn_aurochs.txt | 4 ++-- forge-gui/res/cardsfolder/r/rimescale_dragon.txt | 2 +- forge-gui/res/cardsfolder/r/rimewind_cryomancer.txt | 2 +- forge-gui/res/cardsfolder/r/rimewind_taskmage.txt | 4 ++-- forge-gui/res/cardsfolder/r/ring_of_evos_isle.txt | 2 +- forge-gui/res/cardsfolder/r/ring_of_gix.txt | 2 +- forge-gui/res/cardsfolder/r/ring_of_kalonia.txt | 2 +- forge-gui/res/cardsfolder/r/ring_of_maruf.txt | 4 ++-- forge-gui/res/cardsfolder/r/ring_of_thune.txt | 2 +- forge-gui/res/cardsfolder/r/ring_of_valkas.txt | 2 +- forge-gui/res/cardsfolder/r/ring_of_xathrid.txt | 2 +- forge-gui/res/cardsfolder/r/riot_control.txt | 2 +- forge-gui/res/cardsfolder/r/riptide.txt | 2 +- forge-gui/res/cardsfolder/r/riptide_chimera.txt | 2 +- forge-gui/res/cardsfolder/r/riptide_chronologist.txt | 2 +- forge-gui/res/cardsfolder/r/riptide_director.txt | 2 +- forge-gui/res/cardsfolder/r/riptide_laboratory.txt | 2 +- forge-gui/res/cardsfolder/r/riptide_mangler.txt | 2 +- forge-gui/res/cardsfolder/r/riptide_shapeshifter.txt | 2 +- forge-gui/res/cardsfolder/r/riptide_survivor.txt | 2 +- forge-gui/res/cardsfolder/r/rishadan_cutpurse.txt | 2 +- forge-gui/res/cardsfolder/r/rishadan_pawnshop.txt | 2 +- forge-gui/res/cardsfolder/r/rishadan_port.txt | 2 +- forge-gui/res/cardsfolder/r/rising_waters.txt | 2 +- forge-gui/res/cardsfolder/r/risky_move.txt | 2 +- forge-gui/res/cardsfolder/r/rite_of_belzenlok.txt | 2 +- forge-gui/res/cardsfolder/r/rite_of_ruin.txt | 2 +- forge-gui/res/cardsfolder/r/rite_of_the_raging_storm.txt | 2 +- forge-gui/res/cardsfolder/r/rite_of_undoing.txt | 2 +- forge-gui/res/cardsfolder/r/rites_of_initiation.txt | 2 +- forge-gui/res/cardsfolder/r/rites_of_refusal.txt | 2 +- forge-gui/res/cardsfolder/r/rites_of_spring.txt | 2 +- forge-gui/res/cardsfolder/r/riths_attendant.txt | 2 +- forge-gui/res/cardsfolder/r/ritual_of_subdual.txt | 4 ++-- forge-gui/res/cardsfolder/r/ritual_of_the_machine.txt | 2 +- forge-gui/res/cardsfolder/r/river_of_tears.txt | 2 +- forge-gui/res/cardsfolder/r/rivers_grasp.txt | 2 +- forge-gui/res/cardsfolder/r/roar_of_challenge.txt | 2 +- forge-gui/res/cardsfolder/r/roar_of_jukai.txt | 2 +- forge-gui/res/cardsfolder/r/roar_of_reclamation.txt | 2 +- forge-gui/res/cardsfolder/r/roar_of_the_crowd.txt | 2 +- forge-gui/res/cardsfolder/r/roar_of_the_kha.txt | 2 +- forge-gui/res/cardsfolder/r/roaring_primadox.txt | 2 +- forge-gui/res/cardsfolder/r/rock_hydra.txt | 2 +- forge-gui/res/cardsfolder/r/rocket_launcher.txt | 2 +- forge-gui/res/cardsfolder/r/rofelloss_gift.txt | 2 +- forge-gui/res/cardsfolder/r/rogue_skycaptain.txt | 4 ++-- forge-gui/res/cardsfolder/r/roiling_horror.txt | 2 +- forge-gui/res/cardsfolder/r/roiling_terrain.txt | 2 +- forge-gui/res/cardsfolder/r/roilmages_trick.txt | 2 +- forge-gui/res/cardsfolder/r/rollick_of_abandon.txt | 2 +- forge-gui/res/cardsfolder/r/rolling_spoil.txt | 2 +- forge-gui/res/cardsfolder/r/rolling_stones.txt | 2 +- forge-gui/res/cardsfolder/r/ronom_hulk.txt | 2 +- forge-gui/res/cardsfolder/r/ronom_serpent.txt | 2 +- forge-gui/res/cardsfolder/r/rooftop_storm.txt | 2 +- forge-gui/res/cardsfolder/r/root_cage.txt | 2 +- forge-gui/res/cardsfolder/r/root_greevil.txt | 2 +- forge-gui/res/cardsfolder/r/root_maze.txt | 2 +- forge-gui/res/cardsfolder/r/rootgrapple.txt | 2 +- forge-gui/res/cardsfolder/r/rootrunner.txt | 2 +- forge-gui/res/cardsfolder/r/roots_of_life.txt | 2 +- forge-gui/res/cardsfolder/r/rootwater_matriarch.txt | 2 +- forge-gui/res/cardsfolder/r/rootwater_mystic.txt | 2 +- forge-gui/res/cardsfolder/r/rotting_giant.txt | 2 +- forge-gui/res/cardsfolder/r/rouse.txt | 2 +- forge-gui/res/cardsfolder/r/royal_decree.txt | 2 +- forge-gui/res/cardsfolder/r/ruby_medallion.txt | 2 +- forge-gui/res/cardsfolder/r/rude_awakening.txt | 2 +- forge-gui/res/cardsfolder/r/rugged_prairie.txt | 2 +- forge-gui/res/cardsfolder/r/ruin_ghost.txt | 2 +- forge-gui/res/cardsfolder/r/ruins_of_trokair.txt | 2 +- forge-gui/res/cardsfolder/r/rule_of_law.txt | 2 +- forge-gui/res/cardsfolder/r/rumbling_aftershocks.txt | 2 +- forge-gui/res/cardsfolder/r/rumbling_crescendo.txt | 2 +- forge-gui/res/cardsfolder/r/rummaging_wizard.txt | 2 +- .../res/cardsfolder/r/rune_of_protection_artifacts.txt | 2 +- forge-gui/res/cardsfolder/r/rune_of_protection_black.txt | 2 +- forge-gui/res/cardsfolder/r/rune_of_protection_blue.txt | 2 +- forge-gui/res/cardsfolder/r/rune_of_protection_green.txt | 2 +- forge-gui/res/cardsfolder/r/rune_of_protection_lands.txt | 2 +- forge-gui/res/cardsfolder/r/rune_of_protection_red.txt | 2 +- forge-gui/res/cardsfolder/r/rune_of_protection_white.txt | 2 +- forge-gui/res/cardsfolder/r/runed_arch.txt | 2 +- forge-gui/res/cardsfolder/r/runed_halo.txt | 4 ++-- forge-gui/res/cardsfolder/r/runic_repetition.txt | 2 +- forge-gui/res/cardsfolder/r/rupture.txt | 2 +- forge-gui/res/cardsfolder/r/ruric_thar_the_unbowed.txt | 4 ++-- forge-gui/res/cardsfolder/r/rush_of_battle.txt | 2 +- forge-gui/res/cardsfolder/r/rush_of_knowledge.txt | 2 +- forge-gui/res/cardsfolder/r/rushwood_grove.txt | 2 +- forge-gui/res/cardsfolder/r/rushwood_herbalist.txt | 2 +- forge-gui/res/cardsfolder/r/rust.txt | 4 ++-- forge-gui/res/cardsfolder/r/rust_elemental.txt | 2 +- forge-gui/res/cardsfolder/r/rust_tick.txt | 2 +- forge-gui/res/cardsfolder/r/rusted_slasher.txt | 2 +- forge-gui/res/cardsfolder/r/ruthless_disposal.txt | 2 +- forge-gui/res/cardsfolder/r/ruthless_invasion.txt | 2 +- forge-gui/res/cardsfolder/s/sacellum_godspeaker.txt | 2 +- forge-gui/res/cardsfolder/s/sacred_ground.txt | 2 +- forge-gui/res/cardsfolder/s/sacred_guide.txt | 2 +- forge-gui/res/cardsfolder/s/sacred_mesa.txt | 2 +- forge-gui/res/cardsfolder/s/sacred_rites.txt | 2 +- forge-gui/res/cardsfolder/s/sacrifice.txt | 2 +- forge-gui/res/cardsfolder/s/safe_haven.txt | 2 +- forge-gui/res/cardsfolder/s/saffi_eriksdotter.txt | 2 +- .../s/sage_of_ancient_lore_werewolf_of_ancient_hunger.txt | 2 +- forge-gui/res/cardsfolder/s/sage_of_hours.txt | 2 +- forge-gui/res/cardsfolder/s/sage_of_lat_nam.txt | 2 +- forge-gui/res/cardsfolder/s/sages_dousing.txt | 2 +- forge-gui/res/cardsfolder/s/sages_of_the_anima.txt | 2 +- forge-gui/res/cardsfolder/s/saltcrusted_steppe.txt | 2 +- forge-gui/res/cardsfolder/s/salvage_scout.txt | 2 +- forge-gui/res/cardsfolder/s/salvage_scuttler.txt | 2 +- forge-gui/res/cardsfolder/s/salvaging_station.txt | 2 +- forge-gui/res/cardsfolder/s/samite_censer_bearer.txt | 2 +- forge-gui/res/cardsfolder/s/samite_elder.txt | 2 +- forge-gui/res/cardsfolder/s/samite_sanctuary.txt | 2 +- forge-gui/res/cardsfolder/s/sanctimony.txt | 2 +- forge-gui/res/cardsfolder/s/sanctum_guardian.txt | 2 +- forge-gui/res/cardsfolder/s/sanctum_prelate.txt | 2 +- forge-gui/res/cardsfolder/s/sand_silos.txt | 2 +- forge-gui/res/cardsfolder/s/sand_squid.txt | 2 +- forge-gui/res/cardsfolder/s/sandals_of_abdallah.txt | 4 ++-- forge-gui/res/cardsfolder/s/sands_of_time.txt | 2 +- forge-gui/res/cardsfolder/s/sandsower.txt | 2 +- forge-gui/res/cardsfolder/s/sandstone_deadfall.txt | 2 +- forge-gui/res/cardsfolder/s/sandstone_needle.txt | 4 ++-- forge-gui/res/cardsfolder/s/sandstorm_eidolon.txt | 2 +- forge-gui/res/cardsfolder/s/sanguimancy.txt | 2 +- forge-gui/res/cardsfolder/s/sanguine_bond.txt | 2 +- forge-gui/res/cardsfolder/s/sanguine_praetor.txt | 2 +- forge-gui/res/cardsfolder/s/sapphire_charm.txt | 2 +- forge-gui/res/cardsfolder/s/sapphire_medallion.txt | 2 +- forge-gui/res/cardsfolder/s/saprazzan_bailiff.txt | 2 +- forge-gui/res/cardsfolder/s/saprazzan_breaker.txt | 2 +- forge-gui/res/cardsfolder/s/saprazzan_cove.txt | 2 +- forge-gui/res/cardsfolder/s/saprazzan_outrigger.txt | 2 +- forge-gui/res/cardsfolder/s/saprazzan_skerry.txt | 4 ++-- forge-gui/res/cardsfolder/s/saproling_burst.txt | 2 +- forge-gui/res/cardsfolder/s/saproling_cluster.txt | 2 +- forge-gui/res/cardsfolder/s/saproling_infestation.txt | 2 +- forge-gui/res/cardsfolder/s/sarkhans_triumph.txt | 2 +- forge-gui/res/cardsfolder/s/satyr_enchanter.txt | 2 +- forge-gui/res/cardsfolder/s/satyr_piper.txt | 2 +- forge-gui/res/cardsfolder/s/savage_beating.txt | 2 +- forge-gui/res/cardsfolder/s/savage_firecat.txt | 2 +- forge-gui/res/cardsfolder/s/savage_offensive.txt | 2 +- forge-gui/res/cardsfolder/s/savage_summoning.txt | 2 +- forge-gui/res/cardsfolder/s/savra_queen_of_the_golgari.txt | 2 +- forge-gui/res/cardsfolder/s/sawtooth_loon.txt | 2 +- forge-gui/res/cardsfolder/s/scab_clan_giant.txt | 2 +- forge-gui/res/cardsfolder/s/scald.txt | 2 +- forge-gui/res/cardsfolder/s/scandalmonger.txt | 2 +- forge-gui/res/cardsfolder/s/scapegoat.txt | 2 +- forge-gui/res/cardsfolder/s/scapeshift.txt | 2 +- forge-gui/res/cardsfolder/s/scarab_of_the_unseen.txt | 4 ++-- forge-gui/res/cardsfolder/s/scarblade_elite.txt | 2 +- forge-gui/res/cardsfolder/s/scarecrow.txt | 2 +- forge-gui/res/cardsfolder/s/scarred_vinebreeder.txt | 2 +- forge-gui/res/cardsfolder/s/scarwood_bandits.txt | 2 +- forge-gui/res/cardsfolder/s/scavenger_grounds.txt | 2 +- forge-gui/res/cardsfolder/s/scent_of_brine.txt | 2 +- forge-gui/res/cardsfolder/s/scent_of_cinder.txt | 2 +- forge-gui/res/cardsfolder/s/scent_of_ivy.txt | 2 +- forge-gui/res/cardsfolder/s/scent_of_jasmine.txt | 2 +- forge-gui/res/cardsfolder/s/scent_of_nightshade.txt | 2 +- forge-gui/res/cardsfolder/s/scepter_of_empires.txt | 2 +- forge-gui/res/cardsfolder/s/school_of_the_unseen.txt | 2 +- forge-gui/res/cardsfolder/s/scion_of_oona.txt | 2 +- forge-gui/res/cardsfolder/s/scorched_earth.txt | 2 +- forge-gui/res/cardsfolder/s/scorched_ruins.txt | 2 +- forge-gui/res/cardsfolder/s/scorched_rusalka.txt | 2 +- forge-gui/res/cardsfolder/s/scourge_of_numai.txt | 2 +- forge-gui/res/cardsfolder/s/scourge_of_skola_vale.txt | 2 +- forge-gui/res/cardsfolder/s/scourglass.txt | 2 +- forge-gui/res/cardsfolder/s/scouting_trek.txt | 2 +- forge-gui/res/cardsfolder/s/scouts_warning.txt | 2 +- forge-gui/res/cardsfolder/s/scrambleverse.txt | 4 ++-- forge-gui/res/cardsfolder/s/scrap_mastery.txt | 2 +- forge-gui/res/cardsfolder/s/scrapyard_salvo.txt | 2 +- forge-gui/res/cardsfolder/s/scroll_of_avacyn.txt | 2 +- forge-gui/res/cardsfolder/s/scroll_of_griselbrand.txt | 2 +- forge-gui/res/cardsfolder/s/scroll_of_origins.txt | 2 +- forge-gui/res/cardsfolder/s/scroll_rack.txt | 2 +- forge-gui/res/cardsfolder/s/scrounging_bandar.txt | 2 +- forge-gui/res/cardsfolder/s/scryb_ranger.txt | 2 +- forge-gui/res/cardsfolder/s/scrying_glass.txt | 2 +- forge-gui/res/cardsfolder/s/scrying_sheets.txt | 4 ++-- forge-gui/res/cardsfolder/s/scuttling_death.txt | 2 +- forge-gui/res/cardsfolder/s/sea_kings_blessing.txt | 4 ++-- forge-gui/res/cardsfolder/s/sea_scryer.txt | 2 +- forge-gui/res/cardsfolder/s/sea_snidd.txt | 2 +- forge-gui/res/cardsfolder/s/seafarers_quay.txt | 2 +- forge-gui/res/cardsfolder/s/seahunter.txt | 2 +- forge-gui/res/cardsfolder/s/seal_of_the_guildpact.txt | 2 +- forge-gui/res/cardsfolder/s/sealed_fate.txt | 2 +- forge-gui/res/cardsfolder/s/seance.txt | 2 +- forge-gui/res/cardsfolder/s/search_for_survivors.txt | 2 +- forge-gui/res/cardsfolder/s/search_the_city.txt | 2 +- forge-gui/res/cardsfolder/s/search_warrant.txt | 2 +- forge-gui/res/cardsfolder/s/searing_meditation.txt | 2 +- forge-gui/res/cardsfolder/s/searing_rays.txt | 2 +- forge-gui/res/cardsfolder/s/searing_spear_askari.txt | 2 +- forge-gui/res/cardsfolder/s/seascape_aerialist.txt | 2 +- forge-gui/res/cardsfolder/s/seashell_cameo.txt | 2 +- forge-gui/res/cardsfolder/s/seaside_haven.txt | 2 +- forge-gui/res/cardsfolder/s/seasons_past.txt | 2 +- forge-gui/res/cardsfolder/s/second_harvest.txt | 2 +- forge-gui/res/cardsfolder/s/second_sight.txt | 2 +- forge-gui/res/cardsfolder/s/second_wind.txt | 2 +- forge-gui/res/cardsfolder/s/secret_plans.txt | 2 +- forge-gui/res/cardsfolder/s/secretkeeper.txt | 2 +- forge-gui/res/cardsfolder/s/secrets_of_the_dead.txt | 2 +- forge-gui/res/cardsfolder/s/sedge_sliver.txt | 2 +- forge-gui/res/cardsfolder/s/sedraxis_alchemist.txt | 2 +- forge-gui/res/cardsfolder/s/see_beyond.txt | 2 +- forge-gui/res/cardsfolder/s/seed_spark.txt | 2 +- forge-gui/res/cardsfolder/s/seedling_charm.txt | 2 +- forge-gui/res/cardsfolder/s/seeds_of_innocence.txt | 4 ++-- forge-gui/res/cardsfolder/s/seedtime.txt | 4 ++-- forge-gui/res/cardsfolder/s/seething_pathblazer.txt | 2 +- forge-gui/res/cardsfolder/s/segmented_wurm.txt | 2 +- forge-gui/res/cardsfolder/s/seismic_stomp.txt | 2 +- forge-gui/res/cardsfolder/s/selective_memory.txt | 2 +- forge-gui/res/cardsfolder/s/selesnya_cluestone.txt | 2 +- forge-gui/res/cardsfolder/s/selesnya_keyrune.txt | 2 +- forge-gui/res/cardsfolder/s/selesnya_locket.txt | 2 +- forge-gui/res/cardsfolder/s/selesnya_signet.txt | 2 +- forge-gui/res/cardsfolder/s/selfless_cathar.txt | 2 +- forge-gui/res/cardsfolder/s/selfless_exorcist.txt | 2 +- forge-gui/res/cardsfolder/s/selvala_explorer_returned.txt | 2 +- forge-gui/res/cardsfolder/s/semblance_anvil.txt | 2 +- forge-gui/res/cardsfolder/s/sengir_nosferatu.txt | 2 +- forge-gui/res/cardsfolder/s/sensation_gorger.txt | 2 +- forge-gui/res/cardsfolder/s/senseis_divining_top.txt | 2 +- forge-gui/res/cardsfolder/s/sentinel.txt | 2 +- forge-gui/res/cardsfolder/s/serendib_djinn.txt | 2 +- forge-gui/res/cardsfolder/s/serene_master.txt | 2 +- forge-gui/res/cardsfolder/s/serene_steward.txt | 2 +- forge-gui/res/cardsfolder/s/serene_sunset.txt | 2 +- forge-gui/res/cardsfolder/s/serenity.txt | 2 +- forge-gui/res/cardsfolder/s/serra_ascendant.txt | 2 +- forge-gui/res/cardsfolder/s/serra_aviary.txt | 2 +- forge-gui/res/cardsfolder/s/serras_boon.txt | 2 +- forge-gui/res/cardsfolder/s/serras_hymn.txt | 2 +- forge-gui/res/cardsfolder/s/serras_sanctum.txt | 2 +- forge-gui/res/cardsfolder/s/serum_powder.txt | 4 ++-- forge-gui/res/cardsfolder/s/serum_tank.txt | 2 +- forge-gui/res/cardsfolder/s/setessan_tactics.txt | 2 +- forge-gui/res/cardsfolder/s/sewerdreg.txt | 2 +- forge-gui/res/cardsfolder/s/sewers_of_estark.txt | 2 +- forge-gui/res/cardsfolder/s/shades_breath.txt | 2 +- forge-gui/res/cardsfolder/s/shadow_of_doubt.txt | 2 +- forge-gui/res/cardsfolder/s/shadowblood_egg.txt | 4 ++-- forge-gui/res/cardsfolder/s/shadowblood_ridge.txt | 2 +- forge-gui/res/cardsfolder/s/shadowstorm.txt | 2 +- forge-gui/res/cardsfolder/s/shaman_en_kor.txt | 2 +- forge-gui/res/cardsfolder/s/shambling_swarm.txt | 2 +- forge-gui/res/cardsfolder/s/shaper_parasite.txt | 2 +- forge-gui/res/cardsfolder/s/shapesharer.txt | 2 +- forge-gui/res/cardsfolder/s/shapeshifter.txt | 2 +- forge-gui/res/cardsfolder/s/shard_convergence.txt | 2 +- forge-gui/res/cardsfolder/s/shared_animosity.txt | 2 +- forge-gui/res/cardsfolder/s/shared_fate.txt | 4 ++-- forge-gui/res/cardsfolder/s/shared_trauma.txt | 4 ++-- forge-gui/res/cardsfolder/s/shared_triumph.txt | 2 +- forge-gui/res/cardsfolder/s/shattered_crypt.txt | 2 +- forge-gui/res/cardsfolder/s/shattered_perception.txt | 2 +- forge-gui/res/cardsfolder/s/shauku_endbringer.txt | 2 +- forge-gui/res/cardsfolder/s/shaukus_minion.txt | 2 +- forge-gui/res/cardsfolder/s/shelkin_brownie.txt | 2 +- forge-gui/res/cardsfolder/s/shell_of_the_last_kappa.txt | 2 +- forge-gui/res/cardsfolder/s/shelldock_isle.txt | 2 +- forge-gui/res/cardsfolder/s/sheltering_ancient.txt | 2 +- forge-gui/res/cardsfolder/s/sheltering_prayers.txt | 2 +- forge-gui/res/cardsfolder/s/shepherd_of_rot.txt | 2 +- forge-gui/res/cardsfolder/s/shield_bearer.txt | 2 +- forge-gui/res/cardsfolder/s/shield_dancer.txt | 2 +- forge-gui/res/cardsfolder/s/shield_wall.txt | 2 +- forge-gui/res/cardsfolder/s/shielded_by_faith.txt | 2 +- forge-gui/res/cardsfolder/s/shielded_passage.txt | 2 +- forge-gui/res/cardsfolder/s/shieldmage_advocate.txt | 2 +- forge-gui/res/cardsfolder/s/shieldmage_elder.txt | 2 +- forge-gui/res/cardsfolder/s/shields_of_velis_vel.txt | 2 +- forge-gui/res/cardsfolder/s/shifting_borders.txt | 2 +- forge-gui/res/cardsfolder/s/shifting_loyalties.txt | 4 ++-- forge-gui/res/cardsfolder/s/shifting_sky.txt | 2 +- forge-gui/res/cardsfolder/s/shifty_doppelganger.txt | 2 +- forge-gui/res/cardsfolder/s/shimatsu_the_bloodcloaked.txt | 4 ++-- forge-gui/res/cardsfolder/s/shimmer.txt | 2 +- forge-gui/res/cardsfolder/s/shimmering_grotto.txt | 2 +- forge-gui/res/cardsfolder/s/shimmering_mirage.txt | 2 +- forge-gui/res/cardsfolder/s/shinen_of_lifes_roar.txt | 2 +- forge-gui/res/cardsfolder/s/shisato_whispering_hunter.txt | 4 ++-- forge-gui/res/cardsfolder/s/shivan_emissary.txt | 2 +- forge-gui/res/cardsfolder/s/shoving_match.txt | 2 +- forge-gui/res/cardsfolder/s/showstopper.txt | 2 +- forge-gui/res/cardsfolder/s/shred_memory.txt | 2 +- forge-gui/res/cardsfolder/s/shrewd_negotiation.txt | 2 +- forge-gui/res/cardsfolder/s/shrieking_grotesque.txt | 2 +- forge-gui/res/cardsfolder/s/shrine_of_boundless_growth.txt | 2 +- forge-gui/res/cardsfolder/s/shrine_of_limitless_power.txt | 2 +- forge-gui/res/cardsfolder/s/shrine_of_piercing_vision.txt | 2 +- forge-gui/res/cardsfolder/s/shrine_of_the_forsaken_gods.txt | 2 +- forge-gui/res/cardsfolder/s/shriveling_rot.txt | 2 +- forge-gui/res/cardsfolder/s/shrouded_lore.txt | 2 +- forge-gui/res/cardsfolder/s/shunt.txt | 2 +- forge-gui/res/cardsfolder/s/shuriken.txt | 2 +- forge-gui/res/cardsfolder/s/sickening_dreams.txt | 2 +- forge-gui/res/cardsfolder/s/sickening_shoal.txt | 2 +- forge-gui/res/cardsfolder/s/sideswipe.txt | 4 ++-- forge-gui/res/cardsfolder/s/sight_of_the_scalelords.txt | 2 +- forge-gui/res/cardsfolder/s/sigil_tracer.txt | 2 +- forge-gui/res/cardsfolder/s/signal_the_clans.txt | 2 +- forge-gui/res/cardsfolder/s/silent_assassin.txt | 2 +- forge-gui/res/cardsfolder/s/silent_gravestone.txt | 2 +- forge-gui/res/cardsfolder/s/silumgar_monument.txt | 2 +- forge-gui/res/cardsfolder/s/silumgar_sorcerer.txt | 2 +- forge-gui/res/cardsfolder/s/silver_wyvern.txt | 2 +- forge-gui/res/cardsfolder/s/silverglade_pathfinder.txt | 2 +- forge-gui/res/cardsfolder/s/simic_basilisk.txt | 2 +- forge-gui/res/cardsfolder/s/simic_cluestone.txt | 2 +- forge-gui/res/cardsfolder/s/simic_guildmage.txt | 2 +- forge-gui/res/cardsfolder/s/simic_keyrune.txt | 2 +- forge-gui/res/cardsfolder/s/simic_manipulator.txt | 2 +- forge-gui/res/cardsfolder/s/simic_signet.txt | 2 +- forge-gui/res/cardsfolder/s/simplify.txt | 2 +- forge-gui/res/cardsfolder/s/simulacrum.txt | 2 +- forge-gui/res/cardsfolder/s/singing_tree.txt | 2 +- forge-gui/res/cardsfolder/s/sink_into_takenuma.txt | 2 +- forge-gui/res/cardsfolder/s/sins_of_the_past.txt | 2 +- forge-gui/res/cardsfolder/s/sire_of_the_storm.txt | 2 +- forge-gui/res/cardsfolder/s/siren_song_lyre.txt | 2 +- forge-gui/res/cardsfolder/s/sirens_call.txt | 4 ++-- forge-gui/res/cardsfolder/s/sirens_ruse.txt | 2 +- forge-gui/res/cardsfolder/s/sirocco.txt | 2 +- forge-gui/res/cardsfolder/s/sisay.txt | 2 +- forge-gui/res/cardsfolder/s/sisays_ingenuity.txt | 2 +- forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt | 4 ++-- forge-gui/res/cardsfolder/s/sivvis_ruse.txt | 2 +- forge-gui/res/cardsfolder/s/sivvis_valor.txt | 2 +- forge-gui/res/cardsfolder/s/skeletal_scrying.txt | 2 +- forge-gui/res/cardsfolder/s/skeleton_shard.txt | 2 +- forge-gui/res/cardsfolder/s/skinshifter.txt | 2 +- forge-gui/res/cardsfolder/s/skirge_familiar.txt | 2 +- forge-gui/res/cardsfolder/s/skirk_alarmist.txt | 2 +- forge-gui/res/cardsfolder/s/skirk_fire_marshal.txt | 2 +- forge-gui/res/cardsfolder/s/skirk_outrider.txt | 2 +- forge-gui/res/cardsfolder/s/skirk_volcanist.txt | 2 +- forge-gui/res/cardsfolder/s/skirsdag_flayer.txt | 2 +- forge-gui/res/cardsfolder/s/skittering_horror.txt | 2 +- forge-gui/res/cardsfolder/s/skittering_monstrosity.txt | 2 +- forge-gui/res/cardsfolder/s/skittering_skirge.txt | 2 +- forge-gui/res/cardsfolder/s/skittish_kavu.txt | 2 +- forge-gui/res/cardsfolder/s/skred.txt | 2 +- forge-gui/res/cardsfolder/s/skull_collector.txt | 2 +- forge-gui/res/cardsfolder/s/skullmane_baku.txt | 2 +- forge-gui/res/cardsfolder/s/skulltap.txt | 2 +- forge-gui/res/cardsfolder/s/sky_swallower.txt | 2 +- forge-gui/res/cardsfolder/s/skycloud_egg.txt | 4 ++-- forge-gui/res/cardsfolder/s/skycloud_expanse.txt | 2 +- forge-gui/res/cardsfolder/s/skyscribing.txt | 2 +- forge-gui/res/cardsfolder/s/skyship_plunderer.txt | 2 +- forge-gui/res/cardsfolder/s/skyshroud_blessing.txt | 2 +- forge-gui/res/cardsfolder/s/skyshroud_elf.txt | 2 +- forge-gui/res/cardsfolder/s/skyshroud_poacher.txt | 2 +- forge-gui/res/cardsfolder/s/skyshroud_vampire.txt | 2 +- forge-gui/res/cardsfolder/s/skyshroud_war_beast.txt | 2 +- forge-gui/res/cardsfolder/s/slab_hammer.txt | 2 +- forge-gui/res/cardsfolder/s/slag_fiend.txt | 2 +- forge-gui/res/cardsfolder/s/slate_of_ancestry.txt | 2 +- forge-gui/res/cardsfolder/s/slaughter_games.txt | 2 +- forge-gui/res/cardsfolder/s/slaughter_pact.txt | 2 +- forge-gui/res/cardsfolder/s/slaughter_the_strong.txt | 2 +- forge-gui/res/cardsfolder/s/slay.txt | 2 +- forge-gui/res/cardsfolder/s/sleeper_agent.txt | 2 +- forge-gui/res/cardsfolder/s/sleight_of_hand.txt | 2 +- forge-gui/res/cardsfolder/s/sleight_of_mind.txt | 4 ++-- forge-gui/res/cardsfolder/s/slimy_kavu.txt | 2 +- forge-gui/res/cardsfolder/s/slingbow_trap.txt | 2 +- forge-gui/res/cardsfolder/s/slingshot_goblin.txt | 2 +- forge-gui/res/cardsfolder/s/slinking_skirge.txt | 2 +- forge-gui/res/cardsfolder/s/sliversmith.txt | 2 +- forge-gui/res/cardsfolder/s/slobad_goblin_tinkerer.txt | 2 +- forge-gui/res/cardsfolder/s/slumbering_tora.txt | 4 ++-- forge-gui/res/cardsfolder/s/smallpox.txt | 2 +- forge-gui/res/cardsfolder/s/smite.txt | 2 +- forge-gui/res/cardsfolder/s/smoke.txt | 2 +- forge-gui/res/cardsfolder/s/smokebraider.txt | 2 +- forge-gui/res/cardsfolder/s/smokestack.txt | 2 +- forge-gui/res/cardsfolder/s/smothering_abomination.txt | 2 +- forge-gui/res/cardsfolder/s/snakeform.txt | 2 +- forge-gui/res/cardsfolder/s/sneak_attack.txt | 2 +- forge-gui/res/cardsfolder/s/snow_hound.txt | 2 +- forge-gui/res/cardsfolder/s/snowblind.txt | 2 +- forge-gui/res/cardsfolder/s/snowfall.txt | 4 ++-- forge-gui/res/cardsfolder/s/soilshaper.txt | 2 +- forge-gui/res/cardsfolder/s/sokenzan_renegade.txt | 2 +- forge-gui/res/cardsfolder/s/soldevi_adnate.txt | 2 +- forge-gui/res/cardsfolder/s/soldevi_digger.txt | 2 +- forge-gui/res/cardsfolder/s/soldevi_excavations.txt | 2 +- forge-gui/res/cardsfolder/s/soldevi_golem.txt | 2 +- forge-gui/res/cardsfolder/s/soldevi_machinist.txt | 2 +- forge-gui/res/cardsfolder/s/soldevi_sage.txt | 2 +- forge-gui/res/cardsfolder/s/soldier_replica.txt | 2 +- forge-gui/res/cardsfolder/s/solidarity.txt | 2 +- forge-gui/res/cardsfolder/s/solitary_confinement.txt | 2 +- forge-gui/res/cardsfolder/s/soltari_guerrillas.txt | 2 +- forge-gui/res/cardsfolder/s/song_of_blood.txt | 2 +- forge-gui/res/cardsfolder/s/song_of_serenity.txt | 2 +- forge-gui/res/cardsfolder/s/songs_of_the_damned.txt | 2 +- forge-gui/res/cardsfolder/s/soot_imp.txt | 2 +- forge-gui/res/cardsfolder/s/soothsaying.txt | 2 +- forge-gui/res/cardsfolder/s/sophic_centaur.txt | 2 +- forge-gui/res/cardsfolder/s/soramaro_first_to_dream.txt | 2 +- forge-gui/res/cardsfolder/s/soratami_cloud_chariot.txt | 2 +- forge-gui/res/cardsfolder/s/soratami_cloudskater.txt | 2 +- forge-gui/res/cardsfolder/s/soratami_mindsweeper.txt | 2 +- forge-gui/res/cardsfolder/s/soratami_mirror_guard.txt | 2 +- forge-gui/res/cardsfolder/s/soratami_mirror_mage.txt | 2 +- forge-gui/res/cardsfolder/s/soratami_rainshaper.txt | 2 +- forge-gui/res/cardsfolder/s/soratami_seer.txt | 2 +- forge-gui/res/cardsfolder/s/soraya_the_falconer.txt | 2 +- forge-gui/res/cardsfolder/s/sorcerous_sight.txt | 2 +- forge-gui/res/cardsfolder/s/sorcerous_spyglass.txt | 4 ++-- forge-gui/res/cardsfolder/s/soul_channeling.txt | 2 +- forge-gui/res/cardsfolder/s/soul_conduit.txt | 2 +- forge-gui/res/cardsfolder/s/soul_exchange.txt | 2 +- forge-gui/res/cardsfolder/s/soul_kiss.txt | 2 +- forge-gui/res/cardsfolder/s/soul_of_magma.txt | 2 +- forge-gui/res/cardsfolder/s/soul_rend.txt | 2 +- forge-gui/res/cardsfolder/s/soul_sculptor.txt | 2 +- .../res/cardsfolder/s/soul_seizer_ghastly_haunting.txt | 2 +- forge-gui/res/cardsfolder/s/soul_snuffers.txt | 2 +- forge-gui/res/cardsfolder/s/soul_strings.txt | 2 +- forge-gui/res/cardsfolder/s/soulblast.txt | 2 +- forge-gui/res/cardsfolder/s/soulbright_flamekin.txt | 2 +- forge-gui/res/cardsfolder/s/soulcatchers_aerie.txt | 2 +- forge-gui/res/cardsfolder/s/souldrinker.txt | 2 +- forge-gui/res/cardsfolder/s/soulgorger_orgg.txt | 2 +- forge-gui/res/cardsfolder/s/soulless_one.txt | 2 +- forge-gui/res/cardsfolder/s/souls_grace.txt | 2 +- forge-gui/res/cardsfolder/s/souls_might.txt | 2 +- forge-gui/res/cardsfolder/s/soultether_golem.txt | 2 +- forge-gui/res/cardsfolder/s/southern_paladin.txt | 2 +- forge-gui/res/cardsfolder/s/sovereigns_of_lost_alara.txt | 2 +- forge-gui/res/cardsfolder/s/spare_from_evil.txt | 2 +- forge-gui/res/cardsfolder/s/spark_of_creativity.txt | 2 +- forge-gui/res/cardsfolder/s/sparksmith.txt | 2 +- forge-gui/res/cardsfolder/s/sparkspitter.txt | 2 +- forge-gui/res/cardsfolder/s/spatial_binding.txt | 2 +- forge-gui/res/cardsfolder/s/spawnbinder_mage.txt | 2 +- forge-gui/res/cardsfolder/s/spawnbroker.txt | 2 +- forge-gui/res/cardsfolder/s/spawning_pit.txt | 2 +- forge-gui/res/cardsfolder/s/species_gorger.txt | 2 +- forge-gui/res/cardsfolder/s/spectral_searchlight.txt | 2 +- forge-gui/res/cardsfolder/s/spectral_shift.txt | 4 ++-- forge-gui/res/cardsfolder/s/spell_contortion.txt | 2 +- forge-gui/res/cardsfolder/s/spellbinder.txt | 2 +- forge-gui/res/cardsfolder/s/spellbook.txt | 2 +- forge-gui/res/cardsfolder/s/spellshift.txt | 2 +- forge-gui/res/cardsfolder/s/spellshock.txt | 2 +- forge-gui/res/cardsfolder/s/spelltwine.txt | 2 +- forge-gui/res/cardsfolder/s/spellweaver_helix.txt | 4 ++-- forge-gui/res/cardsfolder/s/spellweaver_volute.txt | 4 ++-- forge-gui/res/cardsfolder/s/sphere_of_duty.txt | 2 +- forge-gui/res/cardsfolder/s/sphere_of_grace.txt | 2 +- forge-gui/res/cardsfolder/s/sphere_of_law.txt | 2 +- forge-gui/res/cardsfolder/s/sphere_of_purity.txt | 2 +- forge-gui/res/cardsfolder/s/sphere_of_reason.txt | 2 +- forge-gui/res/cardsfolder/s/sphere_of_resistance.txt | 2 +- forge-gui/res/cardsfolder/s/sphere_of_truth.txt | 2 +- forge-gui/res/cardsfolder/s/sphinxs_decree.txt | 2 +- forge-gui/res/cardsfolder/s/spike_rogue.txt | 2 +- forge-gui/res/cardsfolder/s/spinal_parasite.txt | 4 ++-- forge-gui/res/cardsfolder/s/spinal_villain.txt | 2 +- forge-gui/res/cardsfolder/s/spincrusher.txt | 2 +- forge-gui/res/cardsfolder/s/spinning_darkness.txt | 2 +- forge-gui/res/cardsfolder/s/spire_owl.txt | 2 +- forge-gui/res/cardsfolder/s/spirit_en_kor.txt | 2 +- forge-gui/res/cardsfolder/s/spirit_flare.txt | 2 +- forge-gui/res/cardsfolder/s/spirit_of_resistance.txt | 2 +- forge-gui/res/cardsfolder/s/spirit_weaver.txt | 2 +- forge-gui/res/cardsfolder/s/spiritual_asylum.txt | 2 +- forge-gui/res/cardsfolder/s/spiritualize.txt | 2 +- forge-gui/res/cardsfolder/s/spiteflame_witch.txt | 2 +- forge-gui/res/cardsfolder/s/spiteful_bully.txt | 2 +- forge-gui/res/cardsfolder/s/spiteful_visions.txt | 2 +- forge-gui/res/cardsfolder/s/spitting_slug.txt | 2 +- forge-gui/res/cardsfolder/s/spitting_spider.txt | 2 +- forge-gui/res/cardsfolder/s/splintering_wind.txt | 2 +- forge-gui/res/cardsfolder/s/split_decision.txt | 2 +- forge-gui/res/cardsfolder/s/spoils_of_evil.txt | 2 +- forge-gui/res/cardsfolder/s/spoils_of_the_vault.txt | 4 ++-- forge-gui/res/cardsfolder/s/spoils_of_war.txt | 2 +- forge-gui/res/cardsfolder/s/spore_burst.txt | 2 +- forge-gui/res/cardsfolder/s/spreading_plague.txt | 2 +- forge-gui/res/cardsfolder/s/springjack_pasture.txt | 2 +- forge-gui/res/cardsfolder/s/springleaf_drum.txt | 2 +- forge-gui/res/cardsfolder/s/spurred_wolverine.txt | 4 ++-- forge-gui/res/cardsfolder/s/spy_network.txt | 2 +- forge-gui/res/cardsfolder/s/squall_line.txt | 2 +- forge-gui/res/cardsfolder/s/squallmonger.txt | 2 +- forge-gui/res/cardsfolder/s/squandered_resources.txt | 2 +- forge-gui/res/cardsfolder/s/squeaking_pie_grubfellows.txt | 2 +- forge-gui/res/cardsfolder/s/squealing_devil.txt | 2 +- forge-gui/res/cardsfolder/s/squee.txt | 2 +- forge-gui/res/cardsfolder/s/squees_revenge.txt | 2 +- forge-gui/res/cardsfolder/s/squeeze.txt | 2 +- forge-gui/res/cardsfolder/s/squirrel_wrangler.txt | 2 +- forge-gui/res/cardsfolder/s/sram_senior_edificer.txt | 2 +- forge-gui/res/cardsfolder/s/stabilizer.txt | 2 +- forge-gui/res/cardsfolder/s/staff_of_the_ages.txt | 2 +- forge-gui/res/cardsfolder/s/staff_of_the_death_magus.txt | 2 +- forge-gui/res/cardsfolder/s/staff_of_the_flame_magus.txt | 2 +- forge-gui/res/cardsfolder/s/staff_of_the_mind_magus.txt | 2 +- forge-gui/res/cardsfolder/s/staff_of_the_sun_magus.txt | 2 +- forge-gui/res/cardsfolder/s/staff_of_the_wild_magus.txt | 2 +- forge-gui/res/cardsfolder/s/stain_the_mind.txt | 4 ++-- forge-gui/res/cardsfolder/s/stalking_yeti.txt | 2 +- forge-gui/res/cardsfolder/s/stampeding_serow.txt | 2 +- forge-gui/res/cardsfolder/s/stampeding_wildebeests.txt | 2 +- forge-gui/res/cardsfolder/s/standardize.txt | 2 +- forge-gui/res/cardsfolder/s/standing_stones.txt | 2 +- forge-gui/res/cardsfolder/s/standstill.txt | 2 +- forge-gui/res/cardsfolder/s/starfield_of_nyx.txt | 2 +- forge-gui/res/cardsfolder/s/starke_of_rath.txt | 2 +- forge-gui/res/cardsfolder/s/starlight.txt | 2 +- forge-gui/res/cardsfolder/s/starlit_sanctum.txt | 2 +- forge-gui/res/cardsfolder/s/starved_rusalka.txt | 2 +- forge-gui/res/cardsfolder/s/stasis.txt | 2 +- forge-gui/res/cardsfolder/s/stasis_cell.txt | 2 +- forge-gui/res/cardsfolder/s/statecraft.txt | 2 +- forge-gui/res/cardsfolder/s/static_orb.txt | 4 ++-- forge-gui/res/cardsfolder/s/steadfastness.txt | 2 +- forge-gui/res/cardsfolder/s/steal_enchantment.txt | 2 +- forge-gui/res/cardsfolder/s/steamclaw.txt | 2 +- forge-gui/res/cardsfolder/s/steamcore_weird.txt | 2 +- forge-gui/res/cardsfolder/s/steel_golem.txt | 2 +- forge-gui/res/cardsfolder/s/steelclad_serpent.txt | 2 +- forge-gui/res/cardsfolder/s/steeling_stance.txt | 2 +- forge-gui/res/cardsfolder/s/steelshapers_gift.txt | 2 +- forge-gui/res/cardsfolder/s/steely_resolve.txt | 2 +- forge-gui/res/cardsfolder/s/stench_of_evil.txt | 2 +- forge-gui/res/cardsfolder/s/stenchskipper.txt | 2 +- forge-gui/res/cardsfolder/s/stensia_banquet.txt | 2 +- forge-gui/res/cardsfolder/s/sterling_grove.txt | 2 +- forge-gui/res/cardsfolder/s/stern_judge.txt | 2 +- forge-gui/res/cardsfolder/s/stifle.txt | 2 +- forge-gui/res/cardsfolder/s/stinging_licid.txt | 2 +- forge-gui/res/cardsfolder/s/stinkdrinker_bandit.txt | 2 +- forge-gui/res/cardsfolder/s/stinkdrinker_daredevil.txt | 2 +- forge-gui/res/cardsfolder/s/stir_the_pride.txt | 2 +- forge-gui/res/cardsfolder/s/stitchers_apprentice.txt | 2 +- forge-gui/res/cardsfolder/s/stoic_champion.txt | 2 +- forge-gui/res/cardsfolder/s/stomping_slabs.txt | 2 +- forge-gui/res/cardsfolder/s/stoneforge_masterwork.txt | 2 +- forge-gui/res/cardsfolder/s/stoneshaker_shaman.txt | 2 +- forge-gui/res/cardsfolder/s/stonewise_fortifier.txt | 2 +- forge-gui/res/cardsfolder/s/stony_silence.txt | 2 +- forge-gui/res/cardsfolder/s/stonybrook_angler.txt | 2 +- forge-gui/res/cardsfolder/s/storage_matrix.txt | 4 ++-- forge-gui/res/cardsfolder/s/storm_cauldron.txt | 2 +- forge-gui/res/cardsfolder/s/storm_world.txt | 2 +- forge-gui/res/cardsfolder/s/stormfront_riders.txt | 2 +- forge-gui/res/cardsfolder/s/stormscale_anarch.txt | 2 +- forge-gui/res/cardsfolder/s/stormscape_master.txt | 2 +- forge-gui/res/cardsfolder/s/stormsurge_kraken.txt | 2 +- forge-gui/res/cardsfolder/s/stormwatch_eagle.txt | 2 +- forge-gui/res/cardsfolder/s/strands_of_night.txt | 2 +- forge-gui/res/cardsfolder/s/strange_inversion.txt | 2 +- forge-gui/res/cardsfolder/s/stranglehold.txt | 2 +- forge-gui/res/cardsfolder/s/strata_scythe.txt | 2 +- forge-gui/res/cardsfolder/s/stratadon.txt | 2 +- forge-gui/res/cardsfolder/s/strategic_planning.txt | 2 +- forge-gui/res/cardsfolder/s/stream_of_consciousness.txt | 2 +- forge-gui/res/cardsfolder/s/street_sweeper.txt | 2 +- forge-gui/res/cardsfolder/s/strength_of_night.txt | 2 +- forge-gui/res/cardsfolder/s/strength_of_unity.txt | 2 +- forge-gui/res/cardsfolder/s/strionic_resonator.txt | 4 ++-- forge-gui/res/cardsfolder/s/strip_bare.txt | 2 +- forge-gui/res/cardsfolder/s/stromgald_cabal.txt | 2 +- forge-gui/res/cardsfolder/s/stromgald_spy.txt | 2 +- forge-gui/res/cardsfolder/s/strongarm_tactics.txt | 2 +- forge-gui/res/cardsfolder/s/strongarm_thug.txt | 2 +- forge-gui/res/cardsfolder/s/stronghold_assassin.txt | 2 +- forge-gui/res/cardsfolder/s/stronghold_discipline.txt | 2 +- forge-gui/res/cardsfolder/s/stronghold_gambit.txt | 2 +- forge-gui/res/cardsfolder/s/stronghold_machinist.txt | 2 +- forge-gui/res/cardsfolder/s/stronghold_rats.txt | 2 +- forge-gui/res/cardsfolder/s/stronghold_taskmaster.txt | 2 +- .../s/student_of_elements_tobita_master_of_winds.txt | 2 +- forge-gui/res/cardsfolder/s/stunning_reversal.txt | 4 ++-- forge-gui/res/cardsfolder/s/subdue.txt | 2 +- forge-gui/res/cardsfolder/s/subterranean_hangar.txt | 2 +- forge-gui/res/cardsfolder/s/subterranean_spirit.txt | 2 +- forge-gui/res/cardsfolder/s/sudden_demise.txt | 2 +- forge-gui/res/cardsfolder/s/sudden_disappearance.txt | 2 +- forge-gui/res/cardsfolder/s/sudden_reclamation.txt | 2 +- forge-gui/res/cardsfolder/s/sudden_spoiling.txt | 2 +- forge-gui/res/cardsfolder/s/suffer_the_past.txt | 2 +- forge-gui/res/cardsfolder/s/suffocation.txt | 2 +- forge-gui/res/cardsfolder/s/suicidal_charge.txt | 2 +- forge-gui/res/cardsfolder/s/suleimans_legacy.txt | 2 +- forge-gui/res/cardsfolder/s/sulfur_vent.txt | 2 +- forge-gui/res/cardsfolder/s/sulfuric_vapors.txt | 2 +- forge-gui/res/cardsfolder/s/sultai_ascendancy.txt | 2 +- forge-gui/res/cardsfolder/s/sultai_banner.txt | 2 +- forge-gui/res/cardsfolder/s/summary_dismissal.txt | 2 +- forge-gui/res/cardsfolder/s/summon_the_school.txt | 2 +- forge-gui/res/cardsfolder/s/summoners_egg.txt | 2 +- forge-gui/res/cardsfolder/s/summoners_pact.txt | 2 +- forge-gui/res/cardsfolder/s/summoning_station.txt | 2 +- forge-gui/res/cardsfolder/s/sunbeam_spellbomb.txt | 2 +- forge-gui/res/cardsfolder/s/sunblade_elf.txt | 2 +- forge-gui/res/cardsfolder/s/sunbond.txt | 2 +- forge-gui/res/cardsfolder/s/sundial_of_the_infinite.txt | 2 +- forge-gui/res/cardsfolder/s/sunflare_shaman.txt | 2 +- forge-gui/res/cardsfolder/s/sunforger.txt | 2 +- forge-gui/res/cardsfolder/s/sunglasses_of_urza.txt | 4 ++-- forge-gui/res/cardsfolder/s/sungrass_egg.txt | 4 ++-- forge-gui/res/cardsfolder/s/sungrass_prairie.txt | 2 +- forge-gui/res/cardsfolder/s/sunken_hope.txt | 2 +- forge-gui/res/cardsfolder/s/sunken_ruins.txt | 2 +- forge-gui/res/cardsfolder/s/sunrise_sovereign.txt | 2 +- forge-gui/res/cardsfolder/s/sunscape_apprentice.txt | 2 +- forge-gui/res/cardsfolder/s/sunscape_familiar.txt | 2 +- forge-gui/res/cardsfolder/s/sunscape_master.txt | 2 +- forge-gui/res/cardsfolder/s/sunscour.txt | 2 +- forge-gui/res/cardsfolder/s/sunstone.txt | 2 +- forge-gui/res/cardsfolder/s/suntouched_myr.txt | 2 +- forge-gui/res/cardsfolder/s/suppress.txt | 2 +- forge-gui/res/cardsfolder/s/suppression_field.txt | 2 +- forge-gui/res/cardsfolder/s/supreme_exemplar.txt | 2 +- forge-gui/res/cardsfolder/s/supreme_inquisitor.txt | 2 +- forge-gui/res/cardsfolder/s/surge_node.txt | 2 +- forge-gui/res/cardsfolder/s/surge_of_righteousness.txt | 2 +- forge-gui/res/cardsfolder/s/surge_of_strength.txt | 2 +- forge-gui/res/cardsfolder/s/surge_of_thoughtweft.txt | 2 +- forge-gui/res/cardsfolder/s/surprise_deployment.txt | 2 +- forge-gui/res/cardsfolder/s/surreal_memoir.txt | 2 +- forge-gui/res/cardsfolder/s/surveyors_scope.txt | 4 ++-- forge-gui/res/cardsfolder/s/survival_of_the_fittest.txt | 2 +- forge-gui/res/cardsfolder/s/survivor_of_the_unseen.txt | 2 +- forge-gui/res/cardsfolder/s/sustenance.txt | 2 +- forge-gui/res/cardsfolder/s/sutured_ghoul.txt | 2 +- forge-gui/res/cardsfolder/s/svogthos_the_restless_tomb.txt | 2 +- forge-gui/res/cardsfolder/s/svyelunite_temple.txt | 2 +- forge-gui/res/cardsfolder/s/swan_song.txt | 2 +- forge-gui/res/cardsfolder/s/sway_of_illusion.txt | 2 +- forge-gui/res/cardsfolder/s/sway_of_the_stars.txt | 2 +- forge-gui/res/cardsfolder/s/swerve.txt | 2 +- forge-gui/res/cardsfolder/s/swift_silence.txt | 2 +- forge-gui/res/cardsfolder/s/sword_of_the_ages.txt | 2 +- forge-gui/res/cardsfolder/s/sword_of_the_chosen.txt | 2 +- forge-gui/res/cardsfolder/s/sword_of_the_paruns.txt | 2 +- forge-gui/res/cardsfolder/s/sworn_defender.txt | 2 +- forge-gui/res/cardsfolder/s/sylvan_awakening.txt | 2 +- forge-gui/res/cardsfolder/s/sylvan_echoes.txt | 2 +- forge-gui/res/cardsfolder/s/sylvan_library.txt | 2 +- forge-gui/res/cardsfolder/s/sylvan_offering.txt | 4 ++-- forge-gui/res/cardsfolder/s/sylvan_paradise.txt | 4 ++-- forge-gui/res/cardsfolder/s/sylvan_safekeeper.txt | 2 +- forge-gui/res/cardsfolder/s/sylvan_yeti.txt | 2 +- forge-gui/res/cardsfolder/s/symbiotic_deployment.txt | 2 +- forge-gui/res/cardsfolder/s/synod_artificer.txt | 2 +- forge-gui/res/cardsfolder/s/synod_sanctum.txt | 2 +- forge-gui/res/cardsfolder/s/synthetic_destiny.txt | 2 +- forge-gui/res/cardsfolder/t/tahngarths_glare.txt | 2 +- forge-gui/res/cardsfolder/t/tahngarths_rage.txt | 2 +- forge-gui/res/cardsfolder/t/taigam_sidisis_hand.txt | 2 +- forge-gui/res/cardsfolder/t/taigams_scheming.txt | 2 +- forge-gui/res/cardsfolder/t/tainted_aether.txt | 4 ++-- forge-gui/res/cardsfolder/t/tainted_remedy.txt | 2 +- forge-gui/res/cardsfolder/t/tajuru_archer.txt | 2 +- forge-gui/res/cardsfolder/t/takara.txt | 2 +- forge-gui/res/cardsfolder/t/takenos_cavalry.txt | 2 +- forge-gui/res/cardsfolder/t/takklemaggot.txt | 4 ++-- forge-gui/res/cardsfolder/t/talaras_bane.txt | 2 +- forge-gui/res/cardsfolder/t/talon_of_pain.txt | 2 +- forge-gui/res/cardsfolder/t/tangle_angler.txt | 2 +- forge-gui/res/cardsfolder/t/tangle_wire.txt | 2 +- forge-gui/res/cardsfolder/t/tangleroot.txt | 2 +- forge-gui/res/cardsfolder/t/tar_pitcher.txt | 2 +- forge-gui/res/cardsfolder/t/tariff.txt | 2 +- forge-gui/res/cardsfolder/t/tattered_drake.txt | 2 +- forge-gui/res/cardsfolder/t/taunt.txt | 2 +- forge-gui/res/cardsfolder/t/taunting_challenge.txt | 2 +- forge-gui/res/cardsfolder/t/teardrop_kami.txt | 2 +- forge-gui/res/cardsfolder/t/tears_of_rage.txt | 2 +- forge-gui/res/cardsfolder/t/tectonic_break.txt | 2 +- forge-gui/res/cardsfolder/t/tectonic_edge.txt | 2 +- forge-gui/res/cardsfolder/t/tectonic_instability.txt | 2 +- forge-gui/res/cardsfolder/t/teetering_peaks.txt | 2 +- forge-gui/res/cardsfolder/t/teferis_care.txt | 2 +- forge-gui/res/cardsfolder/t/teferis_puzzle_box.txt | 2 +- forge-gui/res/cardsfolder/t/teferis_realm.txt | 2 +- forge-gui/res/cardsfolder/t/teferis_veil.txt | 2 +- forge-gui/res/cardsfolder/t/tek.txt | 2 +- forge-gui/res/cardsfolder/t/tel_jilad_stylus.txt | 4 ++-- forge-gui/res/cardsfolder/t/telekinetic_bonds.txt | 4 ++-- forge-gui/res/cardsfolder/t/telepathy.txt | 2 +- forge-gui/res/cardsfolder/t/teleport.txt | 2 +- forge-gui/res/cardsfolder/t/telimtors_edict.txt | 2 +- forge-gui/res/cardsfolder/t/telling_time.txt | 2 +- forge-gui/res/cardsfolder/t/temple_of_the_false_god.txt | 2 +- forge-gui/res/cardsfolder/t/temporal_aperture.txt | 2 +- forge-gui/res/cardsfolder/t/temporal_cascade.txt | 2 +- forge-gui/res/cardsfolder/t/temporal_distortion.txt | 2 +- forge-gui/res/cardsfolder/t/temporary_truce.txt | 2 +- forge-gui/res/cardsfolder/t/tempting_licid.txt | 2 +- forge-gui/res/cardsfolder/t/temur_banner.txt | 2 +- forge-gui/res/cardsfolder/t/tendrils_of_despair.txt | 2 +- forge-gui/res/cardsfolder/t/tenza_godos_maul.txt | 2 +- forge-gui/res/cardsfolder/t/teremko_griffin.txt | 2 +- forge-gui/res/cardsfolder/t/terra_eternal.txt | 2 +- forge-gui/res/cardsfolder/t/terraformer.txt | 2 +- forge-gui/res/cardsfolder/t/terrarion.txt | 2 +- forge-gui/res/cardsfolder/t/terravore.txt | 2 +- forge-gui/res/cardsfolder/t/terrifying_presence.txt | 2 +- forge-gui/res/cardsfolder/t/territorial_dispute.txt | 2 +- forge-gui/res/cardsfolder/t/test_of_endurance.txt | 2 +- forge-gui/res/cardsfolder/t/testament_of_faith.txt | 2 +- forge-gui/res/cardsfolder/t/tethered_griffin.txt | 2 +- forge-gui/res/cardsfolder/t/tezzeret_master_of_metal.txt | 2 +- forge-gui/res/cardsfolder/t/tezzeret_the_seeker.txt | 2 +- forge-gui/res/cardsfolder/t/tezzerets_touch.txt | 2 +- forge-gui/res/cardsfolder/t/thalakos_mistfolk.txt | 2 +- forge-gui/res/cardsfolder/t/thassas_ire.txt | 2 +- forge-gui/res/cardsfolder/t/thaumatog.txt | 2 +- forge-gui/res/cardsfolder/t/the_abyss.txt | 2 +- forge-gui/res/cardsfolder/t/the_chain_veil.txt | 4 ++-- forge-gui/res/cardsfolder/t/the_flame_of_keld.txt | 2 +- .../res/cardsfolder/t/the_tabernacle_at_pendrell_vale.txt | 2 +- forge-gui/res/cardsfolder/t/thelonite_druid.txt | 2 +- forge-gui/res/cardsfolder/t/thelonite_monk.txt | 2 +- forge-gui/res/cardsfolder/t/thelons_chant.txt | 2 +- forge-gui/res/cardsfolder/t/thelons_curse.txt | 2 +- forge-gui/res/cardsfolder/t/thermal_flux.txt | 2 +- forge-gui/res/cardsfolder/t/thermopod.txt | 2 +- forge-gui/res/cardsfolder/t/thespians_stage.txt | 2 +- forge-gui/res/cardsfolder/t/thief_of_blood.txt | 2 +- forge-gui/res/cardsfolder/t/thieves_auction.txt | 2 +- forge-gui/res/cardsfolder/t/thieves_fortune.txt | 2 +- forge-gui/res/cardsfolder/t/thing_from_the_deep.txt | 2 +- forge-gui/res/cardsfolder/t/think_tank.txt | 2 +- forge-gui/res/cardsfolder/t/thorn_of_amethyst.txt | 2 +- forge-gui/res/cardsfolder/t/thornscape_master.txt | 2 +- forge-gui/res/cardsfolder/t/thornwatch_scarecrow.txt | 2 +- forge-gui/res/cardsfolder/t/thought_courier.txt | 2 +- forge-gui/res/cardsfolder/t/thought_devourer.txt | 2 +- forge-gui/res/cardsfolder/t/thought_dissector.txt | 2 +- forge-gui/res/cardsfolder/t/thought_eater.txt | 2 +- forge-gui/res/cardsfolder/t/thought_gorger.txt | 2 +- forge-gui/res/cardsfolder/t/thought_hemorrhage.txt | 2 +- forge-gui/res/cardsfolder/t/thought_lash.txt | 4 ++-- forge-gui/res/cardsfolder/t/thought_nibbler.txt | 2 +- forge-gui/res/cardsfolder/t/thought_prison.txt | 4 ++-- forge-gui/res/cardsfolder/t/thoughtbound_primoc.txt | 2 +- forge-gui/res/cardsfolder/t/thoughtlace.txt | 4 ++-- forge-gui/res/cardsfolder/t/thoughtleech.txt | 2 +- forge-gui/res/cardsfolder/t/thoughtpicker_witch.txt | 2 +- forge-gui/res/cardsfolder/t/thoughts_of_ruin.txt | 2 +- forge-gui/res/cardsfolder/t/thran_forge.txt | 2 +- forge-gui/res/cardsfolder/t/thran_foundry.txt | 2 +- forge-gui/res/cardsfolder/t/thran_lens.txt | 2 +- forge-gui/res/cardsfolder/t/thran_turbine.txt | 2 +- forge-gui/res/cardsfolder/t/thran_weaponry.txt | 2 +- forge-gui/res/cardsfolder/t/three_dreams.txt | 2 +- forge-gui/res/cardsfolder/t/three_wishes.txt | 4 ++-- forge-gui/res/cardsfolder/t/throne_of_bone.txt | 2 +- forge-gui/res/cardsfolder/t/throne_of_empires.txt | 2 +- forge-gui/res/cardsfolder/t/throne_of_geth.txt | 2 +- forge-gui/res/cardsfolder/t/through_the_breach.txt | 2 +- forge-gui/res/cardsfolder/t/throwing_knife.txt | 2 +- forge-gui/res/cardsfolder/t/thrull_champion.txt | 2 +- forge-gui/res/cardsfolder/t/thrull_wizard.txt | 4 ++-- forge-gui/res/cardsfolder/t/thunder_of_hooves.txt | 2 +- forge-gui/res/cardsfolder/t/thunder_totem.txt | 2 +- forge-gui/res/cardsfolder/t/thundercloud_shaman.txt | 2 +- forge-gui/res/cardsfolder/t/thunderfoot_baloth.txt | 2 +- forge-gui/res/cardsfolder/t/thunderheads.txt | 2 +- forge-gui/res/cardsfolder/t/thunderscape_familiar.txt | 2 +- forge-gui/res/cardsfolder/t/thunderscape_master.txt | 2 +- forge-gui/res/cardsfolder/t/thwart.txt | 2 +- forge-gui/res/cardsfolder/t/tidal_bore.txt | 2 +- forge-gui/res/cardsfolder/t/tidal_control.txt | 4 ++-- forge-gui/res/cardsfolder/t/tidal_courier.txt | 2 +- forge-gui/res/cardsfolder/t/tidal_flats.txt | 2 +- forge-gui/res/cardsfolder/t/tidal_influence.txt | 2 +- forge-gui/res/cardsfolder/t/tidal_visionary.txt | 2 +- forge-gui/res/cardsfolder/t/tidal_warrior.txt | 2 +- forge-gui/res/cardsfolder/t/tidal_wave.txt | 2 +- forge-gui/res/cardsfolder/t/tide_drifter.txt | 2 +- forge-gui/res/cardsfolder/t/tide_of_war.txt | 2 +- forge-gui/res/cardsfolder/t/tideforce_elemental.txt | 2 +- forge-gui/res/cardsfolder/t/tideshaper_mystic.txt | 2 +- forge-gui/res/cardsfolder/t/tidewater_minion.txt | 2 +- forge-gui/res/cardsfolder/t/tigereye_cameo.txt | 2 +- forge-gui/res/cardsfolder/t/timber_wolves.txt | 2 +- forge-gui/res/cardsfolder/t/time_and_tide.txt | 2 +- forge-gui/res/cardsfolder/t/time_elemental.txt | 2 +- forge-gui/res/cardsfolder/t/time_of_need.txt | 2 +- forge-gui/res/cardsfolder/t/time_sieve.txt | 2 +- forge-gui/res/cardsfolder/t/time_stop.txt | 2 +- forge-gui/res/cardsfolder/t/time_vault.txt | 2 +- forge-gui/res/cardsfolder/t/timebender.txt | 2 +- forge-gui/res/cardsfolder/t/timecrafting.txt | 4 ++-- forge-gui/res/cardsfolder/t/timesifter.txt | 2 +- forge-gui/res/cardsfolder/t/timid_drake.txt | 2 +- forge-gui/res/cardsfolder/t/tin_street_hooligan.txt | 2 +- forge-gui/res/cardsfolder/t/tin_street_market.txt | 2 +- forge-gui/res/cardsfolder/t/tin_wing_chimera.txt | 2 +- forge-gui/res/cardsfolder/t/tinder_farm.txt | 2 +- forge-gui/res/cardsfolder/t/tinder_wall.txt | 2 +- forge-gui/res/cardsfolder/t/tinker.txt | 2 +- forge-gui/res/cardsfolder/t/titanias_song.txt | 2 +- forge-gui/res/cardsfolder/t/titans_presence.txt | 2 +- forge-gui/res/cardsfolder/t/tivadars_crusade.txt | 2 +- forge-gui/res/cardsfolder/t/toils_of_night_and_day.txt | 2 +- forge-gui/res/cardsfolder/t/tolaria.txt | 2 +- forge-gui/res/cardsfolder/t/tolaria_west.txt | 2 +- forge-gui/res/cardsfolder/t/tolarian_academy.txt | 2 +- forge-gui/res/cardsfolder/t/tolarian_winds.txt | 2 +- forge-gui/res/cardsfolder/t/tomb_of_urami.txt | 2 +- forge-gui/res/cardsfolder/t/tomb_robber.txt | 2 +- forge-gui/res/cardsfolder/t/tombfire.txt | 2 +- forge-gui/res/cardsfolder/t/tombstone_stairwell.txt | 2 +- forge-gui/res/cardsfolder/t/tomorrow_azamis_familiar.txt | 2 +- forge-gui/res/cardsfolder/t/tooth_and_claw.txt | 2 +- forge-gui/res/cardsfolder/t/tooth_of_ramos.txt | 2 +- forge-gui/res/cardsfolder/t/torchling.txt | 2 +- forge-gui/res/cardsfolder/t/tormods_crypt.txt | 2 +- forge-gui/res/cardsfolder/t/tornado.txt | 2 +- forge-gui/res/cardsfolder/t/torpid_moloch.txt | 2 +- forge-gui/res/cardsfolder/t/torpor_orb.txt | 2 +- forge-gui/res/cardsfolder/t/torrent_of_souls.txt | 2 +- forge-gui/res/cardsfolder/t/tortoise_formation.txt | 2 +- forge-gui/res/cardsfolder/t/torture_chamber.txt | 2 +- forge-gui/res/cardsfolder/t/tortured_existence.txt | 2 +- forge-gui/res/cardsfolder/t/total_war.txt | 4 ++-- forge-gui/res/cardsfolder/t/totem_guide_hartebeest.txt | 2 +- forge-gui/res/cardsfolder/t/touch_of_darkness.txt | 4 ++-- forge-gui/res/cardsfolder/t/touch_of_vitae.txt | 2 +- forge-gui/res/cardsfolder/t/touchstone.txt | 2 +- forge-gui/res/cardsfolder/t/tourachs_chant.txt | 2 +- forge-gui/res/cardsfolder/t/tourachs_gate.txt | 2 +- forge-gui/res/cardsfolder/t/tower_defense.txt | 2 +- forge-gui/res/cardsfolder/t/tower_of_coireall.txt | 2 +- forge-gui/res/cardsfolder/t/toxic_deluge.txt | 2 +- forge-gui/res/cardsfolder/t/toymaker.txt | 2 +- forge-gui/res/cardsfolder/t/trace_of_abundance.txt | 2 +- forge-gui/res/cardsfolder/t/trade_routes.txt | 2 +- forge-gui/res/cardsfolder/t/trading_post.txt | 2 +- forge-gui/res/cardsfolder/t/tragic_arrogance.txt | 2 +- forge-gui/res/cardsfolder/t/trail_of_mystery.txt | 2 +- forge-gui/res/cardsfolder/t/training_drone.txt | 2 +- forge-gui/res/cardsfolder/t/trait_doctoring.txt | 4 ++-- forge-gui/res/cardsfolder/t/tranquil_grove.txt | 2 +- forge-gui/res/cardsfolder/t/transcendence.txt | 2 +- forge-gui/res/cardsfolder/t/transluminant.txt | 4 ++-- forge-gui/res/cardsfolder/t/transmogrifying_licid.txt | 2 +- forge-gui/res/cardsfolder/t/transmutation.txt | 2 +- forge-gui/res/cardsfolder/t/transmute_artifact.txt | 2 +- forge-gui/res/cardsfolder/t/trapfinders_trick.txt | 2 +- forge-gui/res/cardsfolder/t/trapmakers_snare.txt | 2 +- forge-gui/res/cardsfolder/t/trash_for_treasure.txt | 2 +- forge-gui/res/cardsfolder/t/treacherous_link.txt | 2 +- forge-gui/res/cardsfolder/t/treacherous_pit_dweller.txt | 2 +- forge-gui/res/cardsfolder/t/treacherous_terrain.txt | 2 +- forge-gui/res/cardsfolder/t/treacherous_vampire.txt | 2 +- forge-gui/res/cardsfolder/t/treefolk_harbinger.txt | 2 +- forge-gui/res/cardsfolder/t/treefolk_healer.txt | 2 +- forge-gui/res/cardsfolder/t/treetop_defense.txt | 2 +- forge-gui/res/cardsfolder/t/tremble.txt | 2 +- forge-gui/res/cardsfolder/t/trench_gorger.txt | 2 +- forge-gui/res/cardsfolder/t/trenching_steed.txt | 2 +- forge-gui/res/cardsfolder/t/trevas_attendant.txt | 2 +- forge-gui/res/cardsfolder/t/trevas_charm.txt | 2 +- forge-gui/res/cardsfolder/t/triad_of_fates.txt | 2 +- forge-gui/res/cardsfolder/t/trial_error.txt | 2 +- forge-gui/res/cardsfolder/t/triangle_of_war.txt | 2 +- forge-gui/res/cardsfolder/t/triassic_egg.txt | 2 +- forge-gui/res/cardsfolder/t/tribal_unity.txt | 2 +- forge-gui/res/cardsfolder/t/trickbind.txt | 2 +- forge-gui/res/cardsfolder/t/trickery_charm.txt | 2 +- forge-gui/res/cardsfolder/t/trickster_mage.txt | 2 +- forge-gui/res/cardsfolder/t/trinisphere.txt | 2 +- forge-gui/res/cardsfolder/t/trip_wire.txt | 2 +- forge-gui/res/cardsfolder/t/triskaidekaphobia.txt | 2 +- forge-gui/res/cardsfolder/t/triton_tactics.txt | 2 +- forge-gui/res/cardsfolder/t/troll_horn_cameo.txt | 2 +- forge-gui/res/cardsfolder/t/tromp_the_domains.txt | 2 +- forge-gui/res/cardsfolder/t/tropical_storm.txt | 2 +- forge-gui/res/cardsfolder/t/troubled_healer.txt | 2 +- forge-gui/res/cardsfolder/t/truce.txt | 2 +- forge-gui/res/cardsfolder/t/trumpeting_armodon.txt | 2 +- forge-gui/res/cardsfolder/t/trusted_advisor.txt | 2 +- forge-gui/res/cardsfolder/t/tsabos_decree.txt | 2 +- forge-gui/res/cardsfolder/t/tsabos_web.txt | 2 +- forge-gui/res/cardsfolder/t/tsunami.txt | 2 +- forge-gui/res/cardsfolder/t/tumble_magnet.txt | 2 +- forge-gui/res/cardsfolder/t/tundra_kavu.txt | 2 +- forge-gui/res/cardsfolder/t/tunnel.txt | 2 +- forge-gui/res/cardsfolder/t/tunnel_vision.txt | 2 +- forge-gui/res/cardsfolder/t/turbulent_dreams.txt | 2 +- forge-gui/res/cardsfolder/t/turn_to_dust.txt | 2 +- forge-gui/res/cardsfolder/t/turn_to_frog.txt | 2 +- forge-gui/res/cardsfolder/t/turnabout.txt | 2 +- forge-gui/res/cardsfolder/t/turntimber_sower.txt | 2 +- forge-gui/res/cardsfolder/t/turtleshell_changeling.txt | 2 +- forge-gui/res/cardsfolder/t/twiddle.txt | 2 +- forge-gui/res/cardsfolder/t/twilight_mire.txt | 2 +- forge-gui/res/cardsfolder/t/twincast.txt | 2 +- forge-gui/res/cardsfolder/t/twinning_glass.txt | 2 +- forge-gui/res/cardsfolder/t/twist_allegiance.txt | 2 +- forge-gui/res/cardsfolder/t/twisted_image.txt | 2 +- forge-gui/res/cardsfolder/t/twitch.txt | 2 +- forge-gui/res/cardsfolder/t/typhoon.txt | 2 +- forge-gui/res/cardsfolder/t/tyrants_familiar.txt | 2 +- forge-gui/res/cardsfolder/u/ugins_nexus.txt | 2 +- forge-gui/res/cardsfolder/u/ulvenwald_tracker.txt | 2 +- forge-gui/res/cardsfolder/u/umbilicus.txt | 2 +- forge-gui/res/cardsfolder/u/unbender_tine.txt | 2 +- forge-gui/res/cardsfolder/u/unbreathing_horde.txt | 2 +- forge-gui/res/cardsfolder/u/uncage_the_menagerie.txt | 2 +- forge-gui/res/cardsfolder/u/unchecked_growth.txt | 2 +- forge-gui/res/cardsfolder/u/undead_warchief.txt | 2 +- forge-gui/res/cardsfolder/u/undergrowth.txt | 2 +- forge-gui/res/cardsfolder/u/undertow.txt | 2 +- forge-gui/res/cardsfolder/u/undying_beast.txt | 2 +- forge-gui/res/cardsfolder/u/undying_evil.txt | 2 +- forge-gui/res/cardsfolder/u/undying_flames.txt | 2 +- forge-gui/res/cardsfolder/u/unearthly_blizzard.txt | 2 +- forge-gui/res/cardsfolder/u/unerring_sling.txt | 2 +- forge-gui/res/cardsfolder/u/unfulfilled_desires.txt | 2 +- forge-gui/res/cardsfolder/u/unholy_citadel.txt | 2 +- forge-gui/res/cardsfolder/u/unholy_grotto.txt | 2 +- forge-gui/res/cardsfolder/u/unified_strike.txt | 2 +- forge-gui/res/cardsfolder/u/unifying_theory.txt | 2 +- forge-gui/res/cardsfolder/u/unknown_shores.txt | 2 +- forge-gui/res/cardsfolder/u/unlikely_alliance.txt | 2 +- forge-gui/res/cardsfolder/u/unmask.txt | 2 +- forge-gui/res/cardsfolder/u/unnatural_selection.txt | 2 +- forge-gui/res/cardsfolder/u/unnerving_assault.txt | 2 +- forge-gui/res/cardsfolder/u/unspeakable_symbol.txt | 2 +- forge-gui/res/cardsfolder/u/unstable_footing.txt | 2 +- forge-gui/res/cardsfolder/u/unstable_frontier.txt | 2 +- forge-gui/res/cardsfolder/u/unstoppable_ash.txt | 2 +- forge-gui/res/cardsfolder/u/untaidake_the_cloud_keeper.txt | 2 +- forge-gui/res/cardsfolder/u/unwinding_clock.txt | 2 +- forge-gui/res/cardsfolder/u/upwelling.txt | 2 +- forge-gui/res/cardsfolder/u/urborg.txt | 2 +- forge-gui/res/cardsfolder/u/urborg_panther.txt | 2 +- forge-gui/res/cardsfolder/u/urborg_shambler.txt | 2 +- forge-gui/res/cardsfolder/u/urborg_tomb_of_yawgmoth.txt | 2 +- forge-gui/res/cardsfolder/u/urzas_avenger.txt | 2 +- forge-gui/res/cardsfolder/u/urzas_bauble.txt | 2 +- forge-gui/res/cardsfolder/u/urzas_chalice.txt | 2 +- forge-gui/res/cardsfolder/u/urzas_engine.txt | 2 +- forge-gui/res/cardsfolder/u/urzas_incubator.txt | 2 +- forge-gui/res/cardsfolder/u/urzas_mine.txt | 2 +- forge-gui/res/cardsfolder/u/urzas_power_plant.txt | 2 +- forge-gui/res/cardsfolder/u/urzas_tower.txt | 2 +- forge-gui/res/cardsfolder/u/utopia_sprawl.txt | 2 +- forge-gui/res/cardsfolder/u/utopia_vow.txt | 2 +- forge-gui/res/cardsfolder/u/uyo_silent_prophet.txt | 2 +- forge-gui/res/cardsfolder/v/valakut_fireboar.txt | 2 +- forge-gui/res/cardsfolder/v/valleymaker.txt | 2 +- forge-gui/res/cardsfolder/v/valor_made_real.txt | 2 +- forge-gui/res/cardsfolder/v/vampire_lacerator.txt | 2 +- forge-gui/res/cardsfolder/v/vampire_warlord.txt | 2 +- forge-gui/res/cardsfolder/v/vampiric_fury.txt | 2 +- forge-gui/res/cardsfolder/v/vampiric_rites.txt | 2 +- forge-gui/res/cardsfolder/v/vampiric_tutor.txt | 2 +- forge-gui/res/cardsfolder/v/vampirism.txt | 2 +- forge-gui/res/cardsfolder/v/vanish_into_memory.txt | 2 +- forge-gui/res/cardsfolder/v/vanishing.txt | 2 +- forge-gui/res/cardsfolder/v/varchilds_crusader.txt | 2 +- forge-gui/res/cardsfolder/v/varchilds_war_riders.txt | 2 +- forge-gui/res/cardsfolder/v/vassals_duty.txt | 2 +- forge-gui/res/cardsfolder/v/vastwood_animist.txt | 2 +- forge-gui/res/cardsfolder/v/vaultbreaker.txt | 2 +- forge-gui/res/cardsfolder/v/vedalken_archmage.txt | 2 +- forge-gui/res/cardsfolder/v/vedalken_infuser.txt | 2 +- forge-gui/res/cardsfolder/v/vedalken_plotter.txt | 2 +- forge-gui/res/cardsfolder/v/vedalken_shackles.txt | 2 +- forge-gui/res/cardsfolder/v/veil_of_secrecy.txt | 2 +- forge-gui/res/cardsfolder/v/veiled_crocodile.txt | 2 +- forge-gui/res/cardsfolder/v/veilstone_amulet.txt | 2 +- forge-gui/res/cardsfolder/v/venarian_glimmer.txt | 2 +- forge-gui/res/cardsfolder/v/venerable_kumo.txt | 2 +- forge-gui/res/cardsfolder/v/venerated_teacher.txt | 2 +- forge-gui/res/cardsfolder/v/vengeful_archon.txt | 2 +- forge-gui/res/cardsfolder/v/vengeful_dreams.txt | 2 +- forge-gui/res/cardsfolder/v/venomous_breath.txt | 2 +- forge-gui/res/cardsfolder/v/venser_the_sojourner.txt | 2 +- forge-gui/res/cardsfolder/v/ventifact_bottle.txt | 2 +- forge-gui/res/cardsfolder/v/verdant_eidolon.txt | 2 +- forge-gui/res/cardsfolder/v/verdant_haven.txt | 2 +- forge-gui/res/cardsfolder/v/verdant_rebirth.txt | 2 +- forge-gui/res/cardsfolder/v/verdant_succession.txt | 2 +- forge-gui/res/cardsfolder/v/verdant_touch.txt | 2 +- forge-gui/res/cardsfolder/v/verduran_enchantress.txt | 2 +- forge-gui/res/cardsfolder/v/vermiculos.txt | 2 +- forge-gui/res/cardsfolder/v/vernal_bloom.txt | 2 +- forge-gui/res/cardsfolder/v/vernal_equinox.txt | 2 +- forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt | 2 +- forge-gui/res/cardsfolder/v/veterans_voice.txt | 2 +- forge-gui/res/cardsfolder/v/vexing_arcanix.txt | 2 +- forge-gui/res/cardsfolder/v/vexing_shusher.txt | 2 +- forge-gui/res/cardsfolder/v/vexing_sphinx.txt | 2 +- forge-gui/res/cardsfolder/v/viashino_sandswimmer.txt | 2 +- forge-gui/res/cardsfolder/v/viashino_skeleton.txt | 2 +- forge-gui/res/cardsfolder/v/vibrating_sphere.txt | 2 +- forge-gui/res/cardsfolder/v/vicious_betrayal.txt | 2 +- forge-gui/res/cardsfolder/v/vicious_shadows.txt | 2 +- forge-gui/res/cardsfolder/v/vigean_intuition.txt | 2 +- forge-gui/res/cardsfolder/v/vigilant_martyr.txt | 2 +- forge-gui/res/cardsfolder/v/vigilante_justice.txt | 2 +- forge-gui/res/cardsfolder/v/vigor_mortis.txt | 2 +- forge-gui/res/cardsfolder/v/vigorous_charge.txt | 2 +- forge-gui/res/cardsfolder/v/vile_consumption.txt | 2 +- forge-gui/res/cardsfolder/v/vindictive_lich.txt | 2 +- forge-gui/res/cardsfolder/v/vindictive_mob.txt | 2 +- forge-gui/res/cardsfolder/v/vine_snare.txt | 2 +- forge-gui/res/cardsfolder/v/viridian_acolyte.txt | 2 +- forge-gui/res/cardsfolder/v/viridian_harvest.txt | 2 +- forge-gui/res/cardsfolder/v/viridian_joiner.txt | 2 +- forge-gui/res/cardsfolder/v/viridian_lorebearers.txt | 2 +- forge-gui/res/cardsfolder/v/viridian_revel.txt | 2 +- forge-gui/res/cardsfolder/v/virtues_ruin.txt | 2 +- forge-gui/res/cardsfolder/v/virulent_plague.txt | 2 +- forge-gui/res/cardsfolder/v/viscera_seer.txt | 2 +- forge-gui/res/cardsfolder/v/vish_kal_blood_arbiter.txt | 2 +- forge-gui/res/cardsfolder/v/vision_charm.txt | 2 +- forge-gui/res/cardsfolder/v/visions.txt | 2 +- forge-gui/res/cardsfolder/v/vitalize.txt | 2 +- forge-gui/res/cardsfolder/v/vivisection.txt | 2 +- forge-gui/res/cardsfolder/v/vizier_of_the_anointed.txt | 2 +- forge-gui/res/cardsfolder/v/vizier_of_tumbling_sands.txt | 2 +- forge-gui/res/cardsfolder/v/vodalian_hypnotist.txt | 2 +- forge-gui/res/cardsfolder/v/vodalian_illusionist.txt | 2 +- forge-gui/res/cardsfolder/v/vodalian_mystic.txt | 4 ++-- forge-gui/res/cardsfolder/v/voice_of_the_woods.txt | 2 +- forge-gui/res/cardsfolder/v/voices_from_the_void.txt | 2 +- forge-gui/res/cardsfolder/v/void.txt | 2 +- forge-gui/res/cardsfolder/v/voidmage_apprentice.txt | 2 +- forge-gui/res/cardsfolder/v/voidmage_prodigy.txt | 2 +- forge-gui/res/cardsfolder/v/voidslime.txt | 2 +- forge-gui/res/cardsfolder/v/voidstone_gargoyle.txt | 2 +- forge-gui/res/cardsfolder/v/volcanic_eruption.txt | 2 +- forge-gui/res/cardsfolder/v/volcano_hellion.txt | 2 +- forge-gui/res/cardsfolder/v/volraths_dungeon.txt | 2 +- forge-gui/res/cardsfolder/v/volraths_gardens.txt | 2 +- forge-gui/res/cardsfolder/v/volraths_laboratory.txt | 2 +- forge-gui/res/cardsfolder/v/volraths_stronghold.txt | 2 +- forge-gui/res/cardsfolder/v/voltaic_key.txt | 2 +- forge-gui/res/cardsfolder/v/volunteer_reserves.txt | 2 +- forge-gui/res/cardsfolder/v/vona_butcher_of_magan.txt | 2 +- forge-gui/res/cardsfolder/v/vonas_hunger.txt | 2 +- forge-gui/res/cardsfolder/v/voodoo_doll.txt | 2 +- forge-gui/res/cardsfolder/v/vortex_elemental.txt | 2 +- forge-gui/res/cardsfolder/v/voyager_staff.txt | 2 +- forge-gui/res/cardsfolder/v/vulshok_war_boar.txt | 2 +- forge-gui/res/cardsfolder/w/waiting_in_the_weeds.txt | 2 +- forge-gui/res/cardsfolder/w/wake_of_destruction.txt | 2 +- forge-gui/res/cardsfolder/w/wake_the_dead.txt | 2 +- forge-gui/res/cardsfolder/w/walk_the_aeons.txt | 2 +- forge-gui/res/cardsfolder/w/walking_archive.txt | 2 +- forge-gui/res/cardsfolder/w/walking_desecration.txt | 2 +- forge-gui/res/cardsfolder/w/walking_sponge.txt | 2 +- forge-gui/res/cardsfolder/w/wall_of_limbs.txt | 4 ++-- forge-gui/res/cardsfolder/w/wall_of_shadows.txt | 2 +- forge-gui/res/cardsfolder/w/wall_of_shards.txt | 2 +- forge-gui/res/cardsfolder/w/wall_of_shields.txt | 2 +- forge-gui/res/cardsfolder/w/wall_of_vapor.txt | 2 +- forge-gui/res/cardsfolder/w/wall_of_vipers.txt | 2 +- forge-gui/res/cardsfolder/w/wallop.txt | 2 +- forge-gui/res/cardsfolder/w/wand_of_denial.txt | 2 +- forge-gui/res/cardsfolder/w/wand_of_the_elements.txt | 2 +- forge-gui/res/cardsfolder/w/wandering_eye.txt | 2 +- forge-gui/res/cardsfolder/w/wandering_goblins.txt | 2 +- forge-gui/res/cardsfolder/w/wandering_stream.txt | 2 +- forge-gui/res/cardsfolder/w/wanderwine_prophets.txt | 2 +- forge-gui/res/cardsfolder/w/war_barge.txt | 4 ++-- forge-gui/res/cardsfolder/w/war_cadence.txt | 2 +- forge-gui/res/cardsfolder/w/war_elephant.txt | 2 +- forge-gui/res/cardsfolder/w/war_falcon.txt | 2 +- forge-gui/res/cardsfolder/w/war_tax.txt | 2 +- forge-gui/res/cardsfolder/w/warbreak_trumpeter.txt | 2 +- forge-gui/res/cardsfolder/w/ward_of_lights.txt | 2 +- forge-gui/res/cardsfolder/w/ward_of_piety.txt | 2 +- forge-gui/res/cardsfolder/w/warmonger.txt | 2 +- forge-gui/res/cardsfolder/w/warmth.txt | 2 +- forge-gui/res/cardsfolder/w/warped_devotion.txt | 2 +- forge-gui/res/cardsfolder/w/warren_weirding.txt | 2 +- forge-gui/res/cardsfolder/w/warrior_en_kor.txt | 2 +- forge-gui/res/cardsfolder/w/warriors_lesson.txt | 2 +- forge-gui/res/cardsfolder/w/warriors_oath.txt | 2 +- forge-gui/res/cardsfolder/w/warriors_stand.txt | 2 +- forge-gui/res/cardsfolder/w/waste_not.txt | 2 +- forge-gui/res/cardsfolder/w/waterfront_bouncer.txt | 2 +- forge-gui/res/cardsfolder/w/waterspout_elemental.txt | 2 +- forge-gui/res/cardsfolder/w/waterspout_weavers.txt | 2 +- forge-gui/res/cardsfolder/w/wave_elemental.txt | 2 +- forge-gui/res/cardsfolder/w/wave_of_indifference.txt | 2 +- forge-gui/res/cardsfolder/w/wave_of_reckoning.txt | 4 ++-- forge-gui/res/cardsfolder/w/wave_of_terror.txt | 2 +- forge-gui/res/cardsfolder/w/wave_of_vitriol.txt | 2 +- forge-gui/res/cardsfolder/w/waxing_moon.txt | 2 +- forge-gui/res/cardsfolder/w/waxmane_baku.txt | 2 +- forge-gui/res/cardsfolder/w/wayfaring_giant.txt | 2 +- forge-gui/res/cardsfolder/w/waylay.txt | 2 +- forge-gui/res/cardsfolder/w/weakstone.txt | 2 +- forge-gui/res/cardsfolder/w/weaver_of_lies.txt | 2 +- forge-gui/res/cardsfolder/w/weight_of_spires.txt | 2 +- forge-gui/res/cardsfolder/w/weird_harvest.txt | 2 +- forge-gui/res/cardsfolder/w/welcome_to_the_fold.txt | 2 +- forge-gui/res/cardsfolder/w/weldfast_monitor.txt | 2 +- forge-gui/res/cardsfolder/w/well_laid_plans.txt | 2 +- forge-gui/res/cardsfolder/w/well_of_lost_dreams.txt | 2 +- forge-gui/res/cardsfolder/w/western_paladin.txt | 2 +- forge-gui/res/cardsfolder/w/wheel_of_sun_and_moon.txt | 2 +- forge-gui/res/cardsfolder/w/whelming_wave.txt | 2 +- forge-gui/res/cardsfolder/w/whetstone.txt | 2 +- forge-gui/res/cardsfolder/w/whetwheel.txt | 2 +- forge-gui/res/cardsfolder/w/whim_of_volrath.txt | 4 ++-- forge-gui/res/cardsfolder/w/whims_of_the_fates.txt | 4 ++-- forge-gui/res/cardsfolder/w/whip_vine.txt | 2 +- forge-gui/res/cardsfolder/w/whipgrass_entangler.txt | 2 +- forge-gui/res/cardsfolder/w/whipkeeper.txt | 2 +- forge-gui/res/cardsfolder/w/whiptail_moloch.txt | 2 +- forge-gui/res/cardsfolder/w/whirlpool_warrior.txt | 4 ++-- forge-gui/res/cardsfolder/w/whirlpool_whelm.txt | 2 +- forge-gui/res/cardsfolder/w/whispering_madness.txt | 4 ++-- forge-gui/res/cardsfolder/w/white_mana_battery.txt | 2 +- forge-gui/res/cardsfolder/w/white_scarab.txt | 2 +- forge-gui/res/cardsfolder/w/white_ward.txt | 2 +- forge-gui/res/cardsfolder/w/whiteout.txt | 4 ++-- forge-gui/res/cardsfolder/w/wicked_reward.txt | 2 +- forge-gui/res/cardsfolder/w/widespread_panic.txt | 2 +- forge-gui/res/cardsfolder/w/wild_dogs.txt | 2 +- forge-gui/res/cardsfolder/w/wild_evocation.txt | 2 +- forge-gui/res/cardsfolder/w/wild_growth.txt | 2 +- forge-gui/res/cardsfolder/w/wild_guess.txt | 2 +- forge-gui/res/cardsfolder/w/wild_mammoth.txt | 2 +- forge-gui/res/cardsfolder/w/wild_ricochet.txt | 2 +- forge-gui/res/cardsfolder/w/wilderness_hypnotist.txt | 2 +- forge-gui/res/cardsfolder/w/wildfire.txt | 2 +- forge-gui/res/cardsfolder/w/willbender.txt | 2 +- forge-gui/res/cardsfolder/w/windfall.txt | 2 +- forge-gui/res/cardsfolder/w/winding_canyons.txt | 2 +- forge-gui/res/cardsfolder/w/winding_constrictor.txt | 2 +- forge-gui/res/cardsfolder/w/winds_of_change.txt | 4 ++-- forge-gui/res/cardsfolder/w/wing_puncture.txt | 2 +- forge-gui/res/cardsfolder/w/wing_storm.txt | 2 +- forge-gui/res/cardsfolder/w/wings_of_velis_vel.txt | 2 +- forge-gui/res/cardsfolder/w/winnow.txt | 4 ++-- forge-gui/res/cardsfolder/w/winter_orb.txt | 2 +- forge-gui/res/cardsfolder/w/winter_sky.txt | 2 +- forge-gui/res/cardsfolder/w/wintermoon_mesa.txt | 2 +- forge-gui/res/cardsfolder/w/winters_chill.txt | 4 ++-- forge-gui/res/cardsfolder/w/winters_night.txt | 4 ++-- forge-gui/res/cardsfolder/w/wirewood_channeler.txt | 4 ++-- forge-gui/res/cardsfolder/w/wirewood_lodge.txt | 2 +- forge-gui/res/cardsfolder/w/wirewood_symbiote.txt | 2 +- forge-gui/res/cardsfolder/w/wishmonger.txt | 2 +- forge-gui/res/cardsfolder/w/wistful_thinking.txt | 2 +- forge-gui/res/cardsfolder/w/witch_engine.txt | 2 +- forge-gui/res/cardsfolder/w/withering_gaze.txt | 2 +- forge-gui/res/cardsfolder/w/withering_hex.txt | 2 +- forge-gui/res/cardsfolder/w/withering_wisps.txt | 2 +- forge-gui/res/cardsfolder/w/wizard_mentor.txt | 2 +- forge-gui/res/cardsfolder/w/wizard_replica.txt | 2 +- forge-gui/res/cardsfolder/w/wizards_school.txt | 4 ++-- forge-gui/res/cardsfolder/w/wizened_snitches.txt | 2 +- forge-gui/res/cardsfolder/w/wojek_apothecary.txt | 2 +- forge-gui/res/cardsfolder/w/wojek_embermage.txt | 2 +- forge-gui/res/cardsfolder/w/wojek_siren.txt | 2 +- forge-gui/res/cardsfolder/w/wolfcallers_howl.txt | 2 +- forge-gui/res/cardsfolder/w/wood_elemental.txt | 2 +- forge-gui/res/cardsfolder/w/wood_sage.txt | 2 +- forge-gui/res/cardsfolder/w/wooded_bastion.txt | 2 +- forge-gui/res/cardsfolder/w/wooden_sphere.txt | 2 +- forge-gui/res/cardsfolder/w/word_of_blasting.txt | 2 +- forge-gui/res/cardsfolder/w/words_of_war.txt | 2 +- forge-gui/res/cardsfolder/w/words_of_waste.txt | 2 +- forge-gui/res/cardsfolder/w/words_of_wilding.txt | 2 +- forge-gui/res/cardsfolder/w/words_of_wind.txt | 2 +- forge-gui/res/cardsfolder/w/words_of_worship.txt | 4 ++-- forge-gui/res/cardsfolder/w/world_queller.txt | 2 +- forge-gui/res/cardsfolder/w/worldgorger_dragon.txt | 2 +- forge-gui/res/cardsfolder/w/worldly_counsel.txt | 2 +- forge-gui/res/cardsfolder/w/worldpurge.txt | 2 +- forge-gui/res/cardsfolder/w/worldslayer.txt | 2 +- forge-gui/res/cardsfolder/w/wormfang_behemoth.txt | 2 +- forge-gui/res/cardsfolder/w/wormfang_crab.txt | 2 +- forge-gui/res/cardsfolder/w/wormfang_manta.txt | 2 +- forge-gui/res/cardsfolder/w/worms_of_the_earth.txt | 4 ++-- forge-gui/res/cardsfolder/w/worry_beads.txt | 2 +- forge-gui/res/cardsfolder/w/worst_fears.txt | 2 +- forge-gui/res/cardsfolder/w/worthy_cause.txt | 2 +- forge-gui/res/cardsfolder/w/wrack_with_madness.txt | 2 +- forge-gui/res/cardsfolder/w/wrath_of_marit_lage.txt | 2 +- forge-gui/res/cardsfolder/w/wrens_run_packmaster.txt | 2 +- forge-gui/res/cardsfolder/w/writ_of_passage.txt | 2 +- forge-gui/res/cardsfolder/w/wu_spy.txt | 2 +- forge-gui/res/cardsfolder/w/wurms_tooth.txt | 2 +- forge-gui/res/cardsfolder/x/xantcha.txt | 2 +- forge-gui/res/cardsfolder/x/xantid_swarm.txt | 2 +- forge-gui/res/cardsfolder/x/xathrid_demon.txt | 2 +- forge-gui/res/cardsfolder/x/xathrid_slyblade.txt | 2 +- forge-gui/res/cardsfolder/x/xenagos_the_reveler.txt | 2 +- forge-gui/res/cardsfolder/x/xenic_poltergeist.txt | 2 +- forge-gui/res/cardsfolder/x/xenograft.txt | 4 ++-- forge-gui/res/cardsfolder/y/yare.txt | 2 +- forge-gui/res/cardsfolder/y/yawgmoth_demon.txt | 2 +- forge-gui/res/cardsfolder/y/yawgmoths_agenda.txt | 2 +- forge-gui/res/cardsfolder/y/yawgmoths_bargain.txt | 2 +- forge-gui/res/cardsfolder/y/yawgmoths_edict.txt | 2 +- forge-gui/res/cardsfolder/z/zealous_inquisitor.txt | 2 +- forge-gui/res/cardsfolder/z/zedruu_the_greathearted.txt | 2 +- forge-gui/res/cardsfolder/z/zephyr_scribe.txt | 2 +- forge-gui/res/cardsfolder/z/zhalfirin_crusader.txt | 2 +- forge-gui/res/cardsfolder/z/zo_zu_the_punisher.txt | 2 +- forge-gui/res/cardsfolder/z/zombie_apocalypse.txt | 2 +- forge-gui/res/cardsfolder/z/zombie_boa.txt | 2 +- forge-gui/res/cardsfolder/z/zombie_infestation.txt | 2 +- forge-gui/res/cardsfolder/z/zombie_musher.txt | 2 +- forge-gui/res/cardsfolder/z/zombie_trailblazer.txt | 2 +- forge-gui/res/cardsfolder/z/zuran_enchanter.txt | 2 +- forge-gui/res/cardsfolder/z/zurs_weirding.txt | 2 +- 4006 files changed, 4250 insertions(+), 4250 deletions(-) diff --git a/forge-gui/res/cardsfolder/b/back_to_basics.txt b/forge-gui/res/cardsfolder/b/back_to_basics.txt index d16589f7db6..085512124a8 100644 --- a/forge-gui/res/cardsfolder/b/back_to_basics.txt +++ b/forge-gui/res/cardsfolder/b/back_to_basics.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Enchantment S:Mode$ Continuous | Affected$ Land.nonBasic | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Nonbasic lands don't untap during their controllers' untap steps. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/back_to_basics.jpg Oracle:Nonbasic lands don't untap during their controllers' untap steps. diff --git a/forge-gui/res/cardsfolder/b/backslide.txt b/forge-gui/res/cardsfolder/b/backslide.txt index 1485d9a3558..fda003438f9 100644 --- a/forge-gui/res/cardsfolder/b/backslide.txt +++ b/forge-gui/res/cardsfolder/b/backslide.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Instant A:SP$ SetState | Cost$ 1 U | ValidTgts$ Creature.faceUp+withMorph,Creature.faceUp+withMegamorph | TgtPrompt$ Select target creature with morph. | Mode$ TurnFace | SpellDescription$ Turn target creature with a morph ability face down. K:Cycling:U -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/backslide.jpg Oracle:Turn target creature with a morph ability face down.\nCycling {U} ({U}, Discard this card: Draw a card.) diff --git a/forge-gui/res/cardsfolder/b/bakis_curse.txt b/forge-gui/res/cardsfolder/b/bakis_curse.txt index 3b0ccb3c103..8c67779253c 100644 --- a/forge-gui/res/cardsfolder/b/bakis_curse.txt +++ b/forge-gui/res/cardsfolder/b/bakis_curse.txt @@ -4,7 +4,7 @@ Types:Sorcery A:SP$ RepeatEach | Cost$ 2 U U | RepeatCards$ Creature | Zone$ Battlefield | RepeatSubAbility$ DBDmg | DamageMap$ True | SpellDescription$ CARDNAME deals 2 damage to each creature for each Aura attached to that creature. SVar:DBDmg:DB$ DealDamage | Defined$ Remembered | NumDmg$ X | References$ X SVar:X:Count$Valid Aura.AttachedTo Creature.IsRemembered/Times.2 -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bakis_curse.jpg Oracle:Baki's Curse deals 2 damage to each creature for each Aura attached to that creature. diff --git a/forge-gui/res/cardsfolder/b/baku_altar.txt b/forge-gui/res/cardsfolder/b/baku_altar.txt index 5a20b75147d..245efa85b5e 100644 --- a/forge-gui/res/cardsfolder/b/baku_altar.txt +++ b/forge-gui/res/cardsfolder/b/baku_altar.txt @@ -4,7 +4,7 @@ Types:Artifact T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, you may put a ki counter on CARDNAME. A:AB$ Token | Cost$ 2 T SubCounter<1/KI> | TokenAmount$ 1 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | TokenOwner$ You | SpellDescription$ Create a 1/1 colorless Spirit creature token. SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ KI | CounterNum$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/baku_altar.jpg Oracle:Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Baku Altar.\n{2}, {T}, Remove a ki counter from Baku Altar: Create a 1/1 colorless Spirit creature token. diff --git a/forge-gui/res/cardsfolder/b/balance_of_power.txt b/forge-gui/res/cardsfolder/b/balance_of_power.txt index f4f16ab5a23..d965f141e5c 100644 --- a/forge-gui/res/cardsfolder/b/balance_of_power.txt +++ b/forge-gui/res/cardsfolder/b/balance_of_power.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ Draw | Cost$ 3 U U | NumCards$ Y | Defined$ You | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | ConditionCheckSVar$ Y | ConditionSVarCompare$ GE1 | References$ X,Y | SpellDescription$ If target opponent has more cards in hand than you, draw cards equal to the difference. SVar:X:Count$InYourHand SVar:Y:TargetedPlayer$CardsInHand/Minus.X -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/balance_of_power.jpg Oracle:If target opponent has more cards in hand than you, draw cards equal to the difference. diff --git a/forge-gui/res/cardsfolder/b/balancing_act.txt b/forge-gui/res/cardsfolder/b/balancing_act.txt index e35f4e4e6fb..5f704884ad5 100644 --- a/forge-gui/res/cardsfolder/b/balancing_act.txt +++ b/forge-gui/res/cardsfolder/b/balancing_act.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ Balance | Cost$ 2 W W | Valid$ Permanent | AILogic$ BalancePermanents | SubAbility$ BalanceHands | SpellDescription$ Each player chooses a number of permanents they control equal to the number of permanents controlled by the player who controls the fewest, then sacrifices the rest. Each player discards cards the same way. SVar:BalanceHands:DB$ Balance | Zone$ Hand SVar:Picture:http://www.wizards.com/global/images/magic/general/balancing_act.jpg -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random Oracle:Each player chooses a number of permanents they control equal to the number of permanents controlled by the player who controls the fewest, then sacrifices the rest. Each player discards cards the same way. diff --git a/forge-gui/res/cardsfolder/b/balduvian_conjurer.txt b/forge-gui/res/cardsfolder/b/balduvian_conjurer.txt index 606e0f52988..c47056c083a 100644 --- a/forge-gui/res/cardsfolder/b/balduvian_conjurer.txt +++ b/forge-gui/res/cardsfolder/b/balduvian_conjurer.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Creature Human Wizard PT:0/2 A:AB$ Animate | Cost$ T | ValidTgts$ Land.Snow | TgtPrompt$ Select target snow land | Power$ 2 | Toughness$ 2 | Types$ Creature | SpellDescription$ Target snow land becomes a 2/2 creature until end of turn. It's still a land. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/balduvian_conjurer.jpg Oracle:{T}: Target snow land becomes a 2/2 creature until end of turn. It's still a land. diff --git a/forge-gui/res/cardsfolder/b/balduvian_frostwaker.txt b/forge-gui/res/cardsfolder/b/balduvian_frostwaker.txt index 0c4549a0bf0..b36005eeb8d 100644 --- a/forge-gui/res/cardsfolder/b/balduvian_frostwaker.txt +++ b/forge-gui/res/cardsfolder/b/balduvian_frostwaker.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Creature Human Wizard PT:1/1 A:AB$ Animate | Cost$ U T | ValidTgts$ Land.Snow | TgtPrompt$ Select target snow land | Power$ 2 | Toughness$ 2 | Types$ Creature,Elemental | Colors$ Blue | Keywords$ Flying | Permanent$ True | AILogic$ EOT | SpellDescription$ Target snow land becomes a 2/2 blue Elemental creature with flying. It's still a land. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/balduvian_frostwaker.jpg Oracle:{U}, {T}: Target snow land becomes a 2/2 blue Elemental creature with flying. It's still a land. diff --git a/forge-gui/res/cardsfolder/b/balduvian_shaman.txt b/forge-gui/res/cardsfolder/b/balduvian_shaman.txt index 4688229a212..04b3526ab7c 100644 --- a/forge-gui/res/cardsfolder/b/balduvian_shaman.txt +++ b/forge-gui/res/cardsfolder/b/balduvian_shaman.txt @@ -4,7 +4,7 @@ Types:Creature Human Cleric Shaman PT:1/1 A:AB$ ChangeText | Cost$ T | ValidTgts$ Enchantment.YouCtrl+White+withoutCumulative upkeep | TgtPrompt$ Choose target white enchantment you control that doesn't have cumulative upkeep | ChangeColorWord$ Choose Choose | Permanent$ True | SubAbility$ DBCumUpkeep | SpellDescription$ Change the text of target white enchantment you control that doesn't have cumulative upkeep by replacing all instances of one color word with another. (For example, you may change "black creatures can't attack" to "blue creatures can't attack.") That enchantment gains "Cumulative upkeep 1." (At the beginning of its controller's upkeep, that player puts an age counter on it, then sacrifices it unless they pay its upkeep cost for each age counter on it.) SVar:DBCumUpkeep:DB$ Pump | Defined$ ParentTarget | KW$ Cumulative upkeep:1 | Permanent$ True -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/balduvian_shaman.jpg Oracle:{T}: Change the text of target white enchantment you control that doesn't have cumulative upkeep by replacing all instances of one color word with another. That enchantment gains "Cumulative upkeep {1}." (For example, you may change "black creatures can't attack" to "blue creatures can't attack." At the beginning of its controller's upkeep, that player puts an age counter on it, then sacrifices it unless they pay its upkeep cost for each age counter on it.) diff --git a/forge-gui/res/cardsfolder/b/baleful_stare.txt b/forge-gui/res/cardsfolder/b/baleful_stare.txt index aa54d59d8e4..58f6f12f8f1 100644 --- a/forge-gui/res/cardsfolder/b/baleful_stare.txt +++ b/forge-gui/res/cardsfolder/b/baleful_stare.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ RevealHand | Cost$ 2 U | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | SubAbility$ DBDraw | SpellDescription$ Target opponent reveals their hand. You draw a card for each Mountain and red card in it. SVar:DBDraw:DB$Draw | NumCards$ X | References$ X SVar:X:Count$ValidHand Mountain.TargetedPlayerCtrl,Card.TargetedPlayerCtrl+Red -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/baleful_stare.jpg Oracle:Target opponent reveals their hand. You draw a card for each Mountain and red card in it. diff --git a/forge-gui/res/cardsfolder/b/balm_of_restoration.txt b/forge-gui/res/cardsfolder/b/balm_of_restoration.txt index 66ceb1771f1..b6b3b2b9b4f 100644 --- a/forge-gui/res/cardsfolder/b/balm_of_restoration.txt +++ b/forge-gui/res/cardsfolder/b/balm_of_restoration.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ Charm | Cost$ 1 T Sac<1/CARDNAME> | Choices$ DBGainLife,DBPrevent | Defined$ You SVar:DBGainLife:DB$ GainLife | LifeAmount$ 2 | Defined$ You | SpellDescription$ You gain 2 life. SVar:DBPrevent:DB$ PreventDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | Amount$ 2 | SpellDescription$ Prevent the next 2 damage that would be dealt to any target this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/balm_of_restoration.jpg Oracle:{1}, {T}, Sacrifice Balm of Restoration: Choose one —\n• You gain 2 life.\n• Prevent the next 2 damage that would be dealt to any target this turn. diff --git a/forge-gui/res/cardsfolder/b/balshan_beguiler.txt b/forge-gui/res/cardsfolder/b/balshan_beguiler.txt index 6ae1c03d3af..0609e72923b 100644 --- a/forge-gui/res/cardsfolder/b/balshan_beguiler.txt +++ b/forge-gui/res/cardsfolder/b/balshan_beguiler.txt @@ -4,6 +4,6 @@ Types:Creature Human Wizard PT:1/1 T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ BalshanDig | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player reveals the top two cards of their library. You choose one of those cards and put it into their graveyard. SVar:BalshanDig:DB$ Dig | Defined$ TriggeredTarget | DigNum$ 2 | ChangeNum$ 1 | DestinationZone$ Graveyard | LibraryPosition2$ 0 | Reveal$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/balshan_beguiler.jpg Oracle:Whenever Balshan Beguiler deals combat damage to a player, that player reveals the top two cards of their library. You choose one of those cards and put it into their graveyard. diff --git a/forge-gui/res/cardsfolder/b/balthor_the_defiled.txt b/forge-gui/res/cardsfolder/b/balthor_the_defiled.txt index 81dfe76f381..284885ce28d 100644 --- a/forge-gui/res/cardsfolder/b/balthor_the_defiled.txt +++ b/forge-gui/res/cardsfolder/b/balthor_the_defiled.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Zombie Dwarf PT:2/2 S:Mode$ Continuous | Affected$ Creature.Minion | AddPower$ 1 | AddToughness$ 1 | Description$ Minion creatures get +1/+1. A:AB$ ChangeZoneAll | Cost$ B B B Exile<1/CARDNAME> | ChangeType$ Creature.Black,Creature.Red | Origin$ Graveyard | Destination$ Battlefield | SpellDescription$ Each player returns all black and all red creature cards from their graveyard to the battlefield. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/balthor_the_defiled.jpg Oracle:Minion creatures get +1/+1.\n{B}{B}{B}, Exile Balthor the Defiled: Each player returns all black and all red creature cards from their graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/b/bamboozle.txt b/forge-gui/res/cardsfolder/b/bamboozle.txt index bd8803f013c..e2f9ef8f901 100644 --- a/forge-gui/res/cardsfolder/b/bamboozle.txt +++ b/forge-gui/res/cardsfolder/b/bamboozle.txt @@ -2,6 +2,6 @@ Name:Bamboozle ManaCost:2 U Types:Sorcery A:SP$ Dig | Cost$ 2 U | ValidTgts$ Player | DigNum$ 4 | ChangeNum$ 2 | DestinationZone$ Graveyard | LibraryPosition2$ 0 | Reveal$ True | SpellDescription$ Target player reveals the top four cards of their library. You choose two of those cards and put them into their graveyard. Put the rest on top of their library in any order. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bamboozle.jpg Oracle:Target player reveals the top four cards of their library. You choose two of those cards and put them into their graveyard. Put the rest on top of their library in any order. diff --git a/forge-gui/res/cardsfolder/b/bane_of_progress.txt b/forge-gui/res/cardsfolder/b/bane_of_progress.txt index 0d44b10ba26..4ea38398a0b 100644 --- a/forge-gui/res/cardsfolder/b/bane_of_progress.txt +++ b/forge-gui/res/cardsfolder/b/bane_of_progress.txt @@ -9,6 +9,6 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount SVar:Y:Count$Valid Artifact.OppCtrl,Enchantment.OppCtrl SVar:NeedsToPlayVar:Y GE2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/bane_of_progress.jpg Oracle:When Bane of Progress enters the battlefield, destroy all artifacts and enchantments. Put a +1/+1 counter on Bane of Progress for each permanent destroyed this way. diff --git a/forge-gui/res/cardsfolder/b/bane_of_the_living.txt b/forge-gui/res/cardsfolder/b/bane_of_the_living.txt index 2a7397fc790..c94a13d6afa 100644 --- a/forge-gui/res/cardsfolder/b/bane_of_the_living.txt +++ b/forge-gui/res/cardsfolder/b/bane_of_the_living.txt @@ -6,6 +6,6 @@ K:Morph:X B B T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME is turned face up, all creatures get -X/-X until end of turn. SVar:TrigPumpAll:DB$PumpAll | ValidCards$ Creature | NumAtt$ -X | NumDef$ -X | References$ X SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bane_of_the_living.jpg Oracle:Morph {X}{B}{B} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.)\nWhen Bane of the Living is turned face up, all creatures get -X/-X until end of turn. diff --git a/forge-gui/res/cardsfolder/b/banishing_knack.txt b/forge-gui/res/cardsfolder/b/banishing_knack.txt index ead44d97191..3a95d92ed0b 100644 --- a/forge-gui/res/cardsfolder/b/banishing_knack.txt +++ b/forge-gui/res/cardsfolder/b/banishing_knack.txt @@ -3,6 +3,6 @@ ManaCost:U Types:Instant A:SP$ Animate | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Abilities$ ABChangeZone | SpellDescription$ Until end of turn, target creature gains "{T}: Return target nonland permanent to its owner's hand." SVar:ABChangeZone:AB$ ChangeZone | Cost$ T | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target nonland permanent to its owner's hand. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/banishing_knack.jpg Oracle:Until end of turn, target creature gains "{T}: Return target nonland permanent to its owner's hand." diff --git a/forge-gui/res/cardsfolder/b/banshee.txt b/forge-gui/res/cardsfolder/b/banshee.txt index 3217cc948dd..e9ef550f27a 100644 --- a/forge-gui/res/cardsfolder/b/banshee.txt +++ b/forge-gui/res/cardsfolder/b/banshee.txt @@ -7,6 +7,6 @@ SVar:DBDamage:DB$ DealDamage | Defined$ You | NumDmg$ HalfXUp | References$ Half SVar:X:Count$xPaid SVar:HalfXDown:Count$xPaid/HalfDown SVar:HalfXUp:Count$xPaid/HalfUp -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/banshee.jpg Oracle:{X}, {T}: Banshee deals half X damage, rounded down, to any target, and half X damage, rounded up, to you. diff --git a/forge-gui/res/cardsfolder/b/barbarian_guides.txt b/forge-gui/res/cardsfolder/b/barbarian_guides.txt index 11ba9a8c7cf..440f9b265c1 100644 --- a/forge-gui/res/cardsfolder/b/barbarian_guides.txt +++ b/forge-gui/res/cardsfolder/b/barbarian_guides.txt @@ -6,7 +6,7 @@ A:AB$ ChooseType | Cost$ 2 R T | Defined$ You | Type$ Land | SubAbility$ DBPump SVar:DBPump:DB$ Pump | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | KW$ Snow ChosenTypewalk | DefinedKW$ ChosenType | StackDescription$ None | SubAbility$ DBDelTrig SVar:DBDelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | RememberObjects$ ParentTarget | Execute$ TrigReturn | SpellDescription$ Return that creature to its owner's hand at the beginning of the next end step. SVar:TrigReturn:DB$ ChangeZone | Defined$ DelayTriggerRemembered | Origin$ Battlefield | Destination$ Hand -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/barbarian_guides.jpg Oracle:{2}{R}, {T}: Choose a land type. Target creature you control gains snow landwalk of the chosen type until end of turn. Return that creature to its owner's hand at the beginning of the next end step. (It can't be blocked as long as defending player controls a snow land of that type.) diff --git a/forge-gui/res/cardsfolder/b/barbarian_outcast.txt b/forge-gui/res/cardsfolder/b/barbarian_outcast.txt index 4a5e56c15e8..73d7006c3c1 100644 --- a/forge-gui/res/cardsfolder/b/barbarian_outcast.txt +++ b/forge-gui/res/cardsfolder/b/barbarian_outcast.txt @@ -5,7 +5,7 @@ PT:2/2 T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Swamp.YouCtrl | PresentCompare$ EQ0 | Execute$ TrigSac | TriggerDescription$ When you control no Swamps, sacrifice CARDNAME. SVar:TrigSac:DB$Sacrifice | Defined$ Self SVar:NeedsToPlay:Swamp.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black SVar:Picture:http://www.wizards.com/global/images/magic/general/barbarian_outcast.jpg Oracle:When you control no Swamps, sacrifice Barbarian Outcast. diff --git a/forge-gui/res/cardsfolder/b/barbed_sextant.txt b/forge-gui/res/cardsfolder/b/barbed_sextant.txt index 2b3c2d7ef9c..fa2d4eb9455 100644 --- a/forge-gui/res/cardsfolder/b/barbed_sextant.txt +++ b/forge-gui/res/cardsfolder/b/barbed_sextant.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ Any | SubAbility$ DelTrigSlowtrip | SpellDescription$ Add one mana of any color. Draw a card at the beginning of the next turn's upkeep. SVar:DelTrigSlowtrip:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ DrawSlowtrip | TriggerDescription$ Draw a card. SVar:DrawSlowtrip:DB$Draw | NumCards$ 1 | Defined$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/barbed_sextant.jpg Oracle:{1}, {T}, Sacrifice Barbed Sextant: Add one mana of any color. Draw a card at the beginning of the next turn's upkeep. diff --git a/forge-gui/res/cardsfolder/b/barbed_wire.txt b/forge-gui/res/cardsfolder/b/barbed_wire.txt index 9d06072fb38..341c3d39d60 100644 --- a/forge-gui/res/cardsfolder/b/barbed_wire.txt +++ b/forge-gui/res/cardsfolder/b/barbed_wire.txt @@ -7,6 +7,6 @@ A:AB$ Effect | Cost$ 2 | ImprintCards$ Self | Triggers$ OutOfSight | SVars$ Exil SVar:STPrevent:Mode$ PreventDamage | EffectZone$ Command | Amount$ 1 | Source$ Card.IsImprinted | Description$ Prevent the next 1 damage that would be dealt by CARDNAME this turn. SVar:OutOfSight:Mode$ ChangesZone | TriggerZones$ Command | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.IsImprinted | Execute$ ExileSelf | Static$ True SVar:ExileSelf:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/barbed_wire.jpg Oracle:At the beginning of each player's upkeep, Barbed Wire deals 1 damage to that player.\n{2}: Prevent the next 1 damage that would be dealt by Barbed Wire this turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/b/barrage_of_expendables.txt b/forge-gui/res/cardsfolder/b/barrage_of_expendables.txt index a10ba645b52..cfddf924d70 100644 --- a/forge-gui/res/cardsfolder/b/barrage_of_expendables.txt +++ b/forge-gui/res/cardsfolder/b/barrage_of_expendables.txt @@ -2,6 +2,6 @@ Name:Barrage of Expendables ManaCost:R Types:Enchantment A:AB$ DealDamage | Cost$ R Sac<1/Creature> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to any target. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/barrage_of_expendables.jpg Oracle:{R}, Sacrifice a creature: Barrage of Expendables deals 1 damage to any target. diff --git a/forge-gui/res/cardsfolder/b/barrage_ogre.txt b/forge-gui/res/cardsfolder/b/barrage_ogre.txt index 9c8b0f05f49..f4b0aae3881 100644 --- a/forge-gui/res/cardsfolder/b/barrage_ogre.txt +++ b/forge-gui/res/cardsfolder/b/barrage_ogre.txt @@ -4,6 +4,6 @@ Types:Creature Ogre Warrior PT:3/3 A:AB$ DealDamage | Cost$ T Sac<1/Artifact> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select target | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to any target. SVar:AIPreference:SacCost$Artifact.token+nonCreature,Artifact.token+powerLE1,Artifact.cmcEQ1,Artifact.cmcEQ2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/barrage_ogre.jpg Oracle:{T}, Sacrifice an artifact: Barrage Ogre deals 2 damage to any target. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/b/barrage_tyrant.txt b/forge-gui/res/cardsfolder/b/barrage_tyrant.txt index 594f74493e9..45f6ca58b39 100644 --- a/forge-gui/res/cardsfolder/b/barrage_tyrant.txt +++ b/forge-gui/res/cardsfolder/b/barrage_tyrant.txt @@ -5,7 +5,7 @@ PT:5/3 K:Devoid A:AB$ DealDamage | Cost$ 2 R Sac<1/Creature.Colorless+Other/another colorless creature> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals damage equal to the sacrificed creature's power to any target. SVar:X:Sacrificed$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHints:Color$Colorless & Keyword$Devoid SVar:Picture:http://www.wizards.com/global/images/magic/general/barrage_tyrant.jpg Oracle:Devoid (This card has no color.)\n{2}{R}, Sacrifice another colorless creature: Barrage Tyrant deals damage equal to the sacrificed creature's power to any target. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/b/barrel_down_sokenzan.txt b/forge-gui/res/cardsfolder/b/barrel_down_sokenzan.txt index 6cc7af72279..8f0e802394e 100644 --- a/forge-gui/res/cardsfolder/b/barrel_down_sokenzan.txt +++ b/forge-gui/res/cardsfolder/b/barrel_down_sokenzan.txt @@ -5,6 +5,6 @@ A:SP$ ChangeZone | Cost$ 2 R | Origin$ Battlefield | Destination$ Hand | ChangeT SVar:DBDamage:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ Y | References$ Y SVar:X:Count$Valid Mountain.YouCtrl SVar:Y:Remembered$Amount.Twice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/barrel_down_sokenzan.jpg Oracle:Sweep — Return any number of Mountains you control to their owner's hand. Barrel Down Sokenzan deals damage to target creature equal to twice the number of Mountains returned this way. diff --git a/forge-gui/res/cardsfolder/b/barren_glory.txt b/forge-gui/res/cardsfolder/b/barren_glory.txt index 02a6a487f74..4216691974b 100644 --- a/forge-gui/res/cardsfolder/b/barren_glory.txt +++ b/forge-gui/res/cardsfolder/b/barren_glory.txt @@ -3,6 +3,6 @@ ManaCost:4 W W Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Card.Other | PresentZone$ Battlefield | PresentPlayer$ You | PresentCompare$ EQ0 | IsPresent2$ Card | PresentZone2$ Hand | PresentPlayer2$ You | PresentCompare2$ EQ0 | Execute$ TrigWin | TriggerDescription$ At the beginning of your upkeep, if you control no permanents other than Barren Glory and have no cards in hand, you win the game. SVar:TrigWin:DB$WinsGame | Defined$ You -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/barren_glory.jpg Oracle:At the beginning of your upkeep, if you control no permanents other than Barren Glory and have no cards in hand, you win the game. diff --git a/forge-gui/res/cardsfolder/b/barrenton_medic.txt b/forge-gui/res/cardsfolder/b/barrenton_medic.txt index 5528c3d91f0..c4b0128c91a 100644 --- a/forge-gui/res/cardsfolder/b/barrenton_medic.txt +++ b/forge-gui/res/cardsfolder/b/barrenton_medic.txt @@ -4,6 +4,6 @@ Types:Creature Kithkin Cleric PT:0/4 A:AB$ PreventDamage | Cost$ T | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to any target this turn. A:AB$ Untap | Cost$ AddCounter<1/M1M1> | SpellDescription$ Untap CARDNAME. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/barrenton_medic.jpg Oracle:{T}: Prevent the next 1 damage that would be dealt to any target this turn.\nPut a -1/-1 counter on Barrenton Medic: Untap Barrenton Medic. diff --git a/forge-gui/res/cardsfolder/b/barrin.txt b/forge-gui/res/cardsfolder/b/barrin.txt index d843ea828bd..c9836c2cf34 100644 --- a/forge-gui/res/cardsfolder/b/barrin.txt +++ b/forge-gui/res/cardsfolder/b/barrin.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Vanguard HandLifeModifier:+0/+6 A:AB$ ChangeZone | ActivationZone$ Command | Cost$ Sac<1/Permanent> | ValidTgts$ Creature | TgtPrompt$ Select target Creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:https://downloads.cardforge.org/images/cards/VAN/Barrin.full.jpg Oracle:Hand +0, life +6\nSacrifice a permanent: Return target creature to its owner's hand. diff --git a/forge-gui/res/cardsfolder/b/barrin_master_wizard.txt b/forge-gui/res/cardsfolder/b/barrin_master_wizard.txt index bf65b59642e..1afa6c0fed9 100644 --- a/forge-gui/res/cardsfolder/b/barrin_master_wizard.txt +++ b/forge-gui/res/cardsfolder/b/barrin_master_wizard.txt @@ -3,6 +3,6 @@ ManaCost:1 U U Types:Legendary Creature Human Wizard PT:1/1 A:AB$ ChangeZone | Cost$ 2 Sac<1/Permanent> | ValidTgts$ Creature | TgtPrompt$ Select target Creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/barrin_master_wizard.jpg Oracle:{2}, Sacrifice a permanent: Return target creature to its owner's hand. diff --git a/forge-gui/res/cardsfolder/b/barter_in_blood.txt b/forge-gui/res/cardsfolder/b/barter_in_blood.txt index 320f321c5f5..3a1db59f236 100644 --- a/forge-gui/res/cardsfolder/b/barter_in_blood.txt +++ b/forge-gui/res/cardsfolder/b/barter_in_blood.txt @@ -2,6 +2,6 @@ Name:Barter in Blood ManaCost:2 B B Types:Sorcery A:SP$ Sacrifice | Cost$ 2 B B | Amount$ 2 | SacValid$ Creature | Defined$ Player | SpellDescription$ Each player sacrifices two creatures. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/barter_in_blood.jpg Oracle:Each player sacrifices two creatures. diff --git a/forge-gui/res/cardsfolder/b/basal_sliver.txt b/forge-gui/res/cardsfolder/b/basal_sliver.txt index 098c62f9313..f60299a08c1 100644 --- a/forge-gui/res/cardsfolder/b/basal_sliver.txt +++ b/forge-gui/res/cardsfolder/b/basal_sliver.txt @@ -4,6 +4,6 @@ Types:Creature Sliver PT:2/2 S:Mode$ Continuous | Affected$ Sliver | AddAbility$ Mana | Description$ All Slivers have "Sacrifice this permanent: Add {B}{B}." SVar:Mana:AB$Mana | Cost$ Sac<1/CARDNAME> | Produced$ B | Amount$ 2 | SpellDescription$ Add {B}{B}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/basal_sliver.jpg Oracle:All Slivers have "Sacrifice this permanent: Add {B}{B}." diff --git a/forge-gui/res/cardsfolder/b/basal_thrull.txt b/forge-gui/res/cardsfolder/b/basal_thrull.txt index 339c692193e..43cda373620 100644 --- a/forge-gui/res/cardsfolder/b/basal_thrull.txt +++ b/forge-gui/res/cardsfolder/b/basal_thrull.txt @@ -3,6 +3,6 @@ ManaCost:B B Types:Creature Thrull PT:1/2 A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ B | Amount$ 2 | SpellDescription$ Add {B}{B}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/basal_thrull.jpg Oracle:{T}, Sacrifice Basal Thrull: Add {B}{B}. diff --git a/forge-gui/res/cardsfolder/b/basalt_monolith.txt b/forge-gui/res/cardsfolder/b/basalt_monolith.txt index 72d53836867..c39850bf3d1 100644 --- a/forge-gui/res/cardsfolder/b/basalt_monolith.txt +++ b/forge-gui/res/cardsfolder/b/basalt_monolith.txt @@ -4,6 +4,6 @@ Types:Artifact K:CARDNAME doesn't untap during your untap step. A:AB$ Untap | Cost$ 3 | SpellDescription$ Untap CARDNAME. A:AB$ Mana | Cost$ T | Produced$ C | Amount$ 3 | SpellDescription$ Add {C}{C}{C}. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/basalt_monolith.jpg Oracle:Basalt Monolith doesn't untap during your untap step.\n{T}: Add {C}{C}{C}.\n{3}: Untap Basalt Monolith. diff --git a/forge-gui/res/cardsfolder/b/bastion_mastodon.txt b/forge-gui/res/cardsfolder/b/bastion_mastodon.txt index 4ea185ac0df..0c7f1999012 100644 --- a/forge-gui/res/cardsfolder/b/bastion_mastodon.txt +++ b/forge-gui/res/cardsfolder/b/bastion_mastodon.txt @@ -3,6 +3,6 @@ ManaCost:5 Types:Artifact Creature Elephant PT:4/5 A:AB$ Pump | Cost$ W | KW$ Vigilance | Defined$ Self | SpellDescription$ CARDNAME gains vigilance until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/bastion_mastodon.jpg Oracle:{W}: Bastion Mastodon gains vigilance until end of turn. diff --git a/forge-gui/res/cardsfolder/b/bathe_in_light.txt b/forge-gui/res/cardsfolder/b/bathe_in_light.txt index eb1e699b97c..737a2035053 100644 --- a/forge-gui/res/cardsfolder/b/bathe_in_light.txt +++ b/forge-gui/res/cardsfolder/b/bathe_in_light.txt @@ -2,6 +2,6 @@ Name:Bathe in Light ManaCost:1 W Types:Instant A:SP$Protection | Cost$ 1 W | ValidTgts$ Creature | TgtPrompt$ Choose target creature | Gains$ Choice | Choices$ AnyColor | Radiance$ True | SpellDescription$ Radiance — Choose a color. Target creature and each other creature that shares a color with it gain protection from the chosen color until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bathe_in_light.jpg Oracle:Radiance — Choose a color. Target creature and each other creature that shares a color with it gain protection from the chosen color until end of turn. diff --git a/forge-gui/res/cardsfolder/b/baton_of_courage.txt b/forge-gui/res/cardsfolder/b/baton_of_courage.txt index 638d73c9457..397fe4d6a70 100644 --- a/forge-gui/res/cardsfolder/b/baton_of_courage.txt +++ b/forge-gui/res/cardsfolder/b/baton_of_courage.txt @@ -4,7 +4,7 @@ Types:Artifact K:Flash K:Sunburst A:AB$ Pump | Cost$ SubCounter<1/CHARGE> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDef$ 1 | NumAtt$ 1 | SpellDescription$ Target creature gets +1/+1 until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NeedsToPlayVar:Z GE1 SVar:Z:Count$UniqueManaColorsProduced.ByUntappedSources DeckHints:Ability$Proliferate diff --git a/forge-gui/res/cardsfolder/b/baton_of_morale.txt b/forge-gui/res/cardsfolder/b/baton_of_morale.txt index 2517ef6e99b..f42e6e587db 100644 --- a/forge-gui/res/cardsfolder/b/baton_of_morale.txt +++ b/forge-gui/res/cardsfolder/b/baton_of_morale.txt @@ -2,6 +2,6 @@ Name:Baton of Morale ManaCost:2 Types:Artifact A:AB$ Pump | Cost$ 2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Banding | SpellDescription$ Target creature gains banding until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/baton_of_morale.jpg Oracle:{2}: Target creature gains banding until end of turn. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding a player controls are blocking or being blocked by a creature, that player divides that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/b/battering_ram.txt b/forge-gui/res/cardsfolder/b/battering_ram.txt index 3013fe1398e..24364d0589c 100644 --- a/forge-gui/res/cardsfolder/b/battering_ram.txt +++ b/forge-gui/res/cardsfolder/b/battering_ram.txt @@ -7,6 +7,6 @@ SVar:TrigBanding:DB$ Pump | Defined$ Self | KW$ Banding | UntilEndOfCombat$ True T:Mode$ AttackerBlockedByCreature | ValidCard$ Card.Self | ValidBlocker$ Creature.Wall | Execute$ DelayAttackTrig | TriggerDescription$ Whenever CARDNAME becomes blocked by a Wall, destroy that Wall at end of combat. SVar:DelayAttackTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigDestroyBlocker | RememberObjects$ TriggeredBlocker | TriggerDescription$ Destroy blocked creature at end of combat. SVar:TrigDestroyBlocker:DB$ Destroy | Defined$ DelayTriggerRemembered -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/battering_ram.jpg Oracle:At the beginning of combat on your turn, Battering Ram gains banding until end of combat. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's blocking.)\nWhenever Battering Ram becomes blocked by a Wall, destroy that Wall at end of combat. diff --git a/forge-gui/res/cardsfolder/b/battle_cry.txt b/forge-gui/res/cardsfolder/b/battle_cry.txt index b325d283a56..5b63e9170bf 100644 --- a/forge-gui/res/cardsfolder/b/battle_cry.txt +++ b/forge-gui/res/cardsfolder/b/battle_cry.txt @@ -5,6 +5,6 @@ A:SP$ UntapAll | Cost$ 2 W | ValidCards$ Creature.White+YouCtrl | SubAbility$ Ba SVar:Battlecry:DB$Effect | Name$ Battle Cry Effect | Triggers$ TrigBlocking | SVars$ Pump SVar:TrigBlocking:Mode$ AttackerBlocked | Execute$ Pump | TriggerDescription$ Whenever a creature blocks this turn, it gets +0/+1 until end of turn. SVar:Pump:DB$Pump | Defined$ TriggeredBlocker | NumDef$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/battle_cry.jpg Oracle:Untap all white creatures you control.\nWhenever a creature blocks this turn, it gets +0/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/b/battle_of_wits.txt b/forge-gui/res/cardsfolder/b/battle_of_wits.txt index 4bb6e59aaa9..a74bdad831e 100644 --- a/forge-gui/res/cardsfolder/b/battle_of_wits.txt +++ b/forge-gui/res/cardsfolder/b/battle_of_wits.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Card.YouCtrl | PresentZone$ Library | PresentCompare$ GE200 | Execute$ TrigWinGame | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, if you have 200 or more cards in your library, you win the game. SVar:TrigWinGame:DB$WinsGame | Defined$ You SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/battle_of_wits.jpg Oracle:At the beginning of your upkeep, if you have 200 or more cards in your library, you win the game. diff --git a/forge-gui/res/cardsfolder/b/battle_strain.txt b/forge-gui/res/cardsfolder/b/battle_strain.txt index 75933449f5e..a36f9144651 100644 --- a/forge-gui/res/cardsfolder/b/battle_strain.txt +++ b/forge-gui/res/cardsfolder/b/battle_strain.txt @@ -3,6 +3,6 @@ ManaCost:1 R Types:Enchantment T:Mode$ Blocks | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a creature blocks, CARDNAME deals 1 damage to that creature's controller. SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredBlockerController | NumDmg$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/battle_strain.jpg Oracle:Whenever a creature blocks, Battle Strain deals 1 damage to that creature's controller. diff --git a/forge-gui/res/cardsfolder/b/batwing_brume.txt b/forge-gui/res/cardsfolder/b/batwing_brume.txt index 3760b5e3fe8..3667067d2b2 100644 --- a/forge-gui/res/cardsfolder/b/batwing_brume.txt +++ b/forge-gui/res/cardsfolder/b/batwing_brume.txt @@ -5,6 +5,6 @@ A:SP$ Fog | Cost$ 1 WB | ConditionManaSpent$ W | SubAbility$ BatwingRepeat | Spe SVar:BatwingRepeat:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ BatwingLoseLife SVar:BatwingLoseLife:DB$ LoseLife | LifeAmount$ X | Defined$ Remembered | ConditionManaSpent$ B | References$ X SVar:X:PlayerCountRemembered$Valid Creature.YouCtrl+attacking -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/batwing_brume.jpg Oracle:Prevent all combat damage that would be dealt this turn if {W} was spent to cast Batwing Brume. Each player loses 1 life for each attacking creature they control if {B} was spent to cast Batwing Brume. (Do both if {W}{B} was spent.) diff --git a/forge-gui/res/cardsfolder/b/bazaar_of_baghdad.txt b/forge-gui/res/cardsfolder/b/bazaar_of_baghdad.txt index 9e1313e8f5b..686ca206b2f 100644 --- a/forge-gui/res/cardsfolder/b/bazaar_of_baghdad.txt +++ b/forge-gui/res/cardsfolder/b/bazaar_of_baghdad.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land A:AB$ Draw | Cost$ T | NumCards$ 2 | SpellDescription$ Draw two cards, then discard three cards. | SubAbility$ DBDiscard SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 3 | Mode$ TgtChoose -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bazaar_of_baghdad.jpg Oracle:{T}: Draw two cards, then discard three cards. diff --git a/forge-gui/res/cardsfolder/b/bazaar_of_wonders.txt b/forge-gui/res/cardsfolder/b/bazaar_of_wonders.txt index feb3cff85bc..e8e4369331f 100644 --- a/forge-gui/res/cardsfolder/b/bazaar_of_wonders.txt +++ b/forge-gui/res/cardsfolder/b/bazaar_of_wonders.txt @@ -9,6 +9,6 @@ SVar:DBCounterSamePermanent:DB$ Counter | Defined$ TriggeredSpellAbility | Condi SVar:SharesNameGrave:TriggeredCard$Valid Card.sharesNameWith Graveyard SVar:SharesNameBattlefield:TriggeredCard$Valid Card.sharesNameWith NonToken SVar:AICurseEffect:BazaarOfWonders -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/bazaar_of_wonders.jpg Oracle:When Bazaar of Wonders enters the battlefield, exile all cards from all graveyards.\nWhenever a player casts a spell, counter it if a card with the same name is in a graveyard or a nontoken permanent with the same name is on the battlefield. diff --git a/forge-gui/res/cardsfolder/b/bazaar_trader.txt b/forge-gui/res/cardsfolder/b/bazaar_trader.txt index e6111c56478..b12a3f2e44d 100644 --- a/forge-gui/res/cardsfolder/b/bazaar_trader.txt +++ b/forge-gui/res/cardsfolder/b/bazaar_trader.txt @@ -7,6 +7,6 @@ SVar:DBPumpRemember:DB$ Pump | RememberObjects$ Targeted | Static$ True | SubAbi SVar:DBPumpPermanent:DB$ Pump | ValidTgts$ Artifact.YouCtrl,Creature.YouCtrl,Land.YouCtrl | TgtPrompt$ Select target artifact, creature, or land you control | SubAbility$ DBGainControl | StackDescription$ None SVar:DBGainControl:DB$ GainControl | Defined$ Targeted | NewController$ Remembered | SubAbility$ DBForgetRemembered SVar:DBForgetRemembered:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bazaar_trader.jpg Oracle:{T}: Target player gains control of target artifact, creature, or land you control. diff --git a/forge-gui/res/cardsfolder/b/beacon_of_destiny.txt b/forge-gui/res/cardsfolder/b/beacon_of_destiny.txt index 6ed2b4df6bd..e8bb8fc2a2a 100644 --- a/forge-gui/res/cardsfolder/b/beacon_of_destiny.txt +++ b/forge-gui/res/cardsfolder/b/beacon_of_destiny.txt @@ -10,6 +10,6 @@ SVar:SelflessDmg:DB$ ReplaceEffect | VarName$ Affected | VarValue$ EffectSource SVar:OutOfSight:Mode$ ChangesZone | Origin$ Any | Destination$ Any | Defined$ ChosenCard | Execute$ ExileEffect | Static$ True SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile | Static$ True SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/beacon_of_destiny.jpg Oracle:{T}: The next time a source of your choice would deal damage to you this turn, that damage is dealt to Beacon of Destiny instead. diff --git a/forge-gui/res/cardsfolder/b/beast_walkers.txt b/forge-gui/res/cardsfolder/b/beast_walkers.txt index b1c83d3808d..fefe0bb1f4f 100644 --- a/forge-gui/res/cardsfolder/b/beast_walkers.txt +++ b/forge-gui/res/cardsfolder/b/beast_walkers.txt @@ -3,6 +3,6 @@ ManaCost:1 W W Types:Creature Human Beast Soldier PT:2/2 A:AB$ Pump | Cost$ G | Defined$ Self | KW$ Banding | SpellDescription$ CARDNAME gains banding until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/beast_walkers.jpg Oracle:{G}: Beast Walkers gains banding until end of turn. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/b/beast_within.txt b/forge-gui/res/cardsfolder/b/beast_within.txt index 6c372701c56..ec64dff73e6 100644 --- a/forge-gui/res/cardsfolder/b/beast_within.txt +++ b/forge-gui/res/cardsfolder/b/beast_within.txt @@ -3,6 +3,6 @@ ManaCost:2 G Types:Instant A:SP$ Destroy | Cost$ 2 G | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | AITgts$ Card.cmcGE4 | SubAbility$ DBToken | SpellDescription$ Destroy target permanent. Its controller creates a 3/3 green Beast creature token. SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenName$ Beast | TokenTypes$ Creature,Beast | TokenOwner$ TargetedController | TokenColors$ Green | TokenPower$ 3 | TokenToughness$ 3 | TokenImage$ g 3 3 beast NPH -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/beast_within.jpg Oracle:Destroy target permanent. Its controller creates a 3/3 green Beast creature token. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/b/bedlam.txt b/forge-gui/res/cardsfolder/b/bedlam.txt index ce3f794a83d..f077db591fd 100644 --- a/forge-gui/res/cardsfolder/b/bedlam.txt +++ b/forge-gui/res/cardsfolder/b/bedlam.txt @@ -3,6 +3,6 @@ ManaCost:2 R R Types:Enchantment S:Mode$ Continuous | Affected$ Creature | AddHiddenKeyword$ CARDNAME can't block. | Description$ Creatures can't block. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/bedlam.jpg Oracle:Creatures can't block. diff --git a/forge-gui/res/cardsfolder/b/behold_the_beyond.txt b/forge-gui/res/cardsfolder/b/behold_the_beyond.txt index 28313445fd2..0649410f04f 100644 --- a/forge-gui/res/cardsfolder/b/behold_the_beyond.txt +++ b/forge-gui/res/cardsfolder/b/behold_the_beyond.txt @@ -3,6 +3,6 @@ ManaCost:5 B B Types:Sorcery A:SP$ Discard | Cost$ 5 B B | Mode$ Hand | SubAbility$ DBSearch | SpellDescription$ Discard your hand. Search your library for three cards and put those cards into your hand. Then shuffle your library. SVar:DBSearch:DB$ ChangeZone | Origin$ Library | Destination$ Hand | Mandatory$ True | ChangeType$ Card | ChangeNum$ 3 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/behold_the_beyond.jpg Oracle:Discard your hand. Search your library for three cards and put those cards into your hand. Then shuffle your library. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/b/belbes_armor.txt b/forge-gui/res/cardsfolder/b/belbes_armor.txt index 88391c183ac..dd7f0c49604 100644 --- a/forge-gui/res/cardsfolder/b/belbes_armor.txt +++ b/forge-gui/res/cardsfolder/b/belbes_armor.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact A:AB$ Pump | Cost$ X T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -X | NumDef$ +X | References$ X | SpellDescription$ Target creature gets -X/+X until end of turn. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/belbes_armor.jpg Oracle:{X}, {T}: Target creature gets -X/+X until end of turn. diff --git a/forge-gui/res/cardsfolder/b/benalish_hero.txt b/forge-gui/res/cardsfolder/b/benalish_hero.txt index 1c9df38db6f..17c5919c09e 100644 --- a/forge-gui/res/cardsfolder/b/benalish_hero.txt +++ b/forge-gui/res/cardsfolder/b/benalish_hero.txt @@ -3,6 +3,6 @@ ManaCost:W Types:Creature Human Soldier PT:1/1 K:Banding -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/benalish_hero.jpg Oracle:Banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/b/benalish_infantry.txt b/forge-gui/res/cardsfolder/b/benalish_infantry.txt index 4c8e1e1dd26..8d08692694f 100644 --- a/forge-gui/res/cardsfolder/b/benalish_infantry.txt +++ b/forge-gui/res/cardsfolder/b/benalish_infantry.txt @@ -3,6 +3,6 @@ ManaCost:2 W Types:Creature Human Soldier PT:1/3 K:Banding -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/benalish_infantry.jpg Oracle:Banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/b/benalish_missionary.txt b/forge-gui/res/cardsfolder/b/benalish_missionary.txt index 7d7e9ae76dc..6dec54afd8f 100644 --- a/forge-gui/res/cardsfolder/b/benalish_missionary.txt +++ b/forge-gui/res/cardsfolder/b/benalish_missionary.txt @@ -3,6 +3,6 @@ ManaCost:W Types:Creature Human Cleric PT:1/1 A:AB$ Pump | Cost$ 1 W T | ValidTgts$ Creature.blocked | TgtPrompt$ Select target blocked creature | KW$ Prevent all combat damage that would be dealt by CARDNAME. | SpellDescription$ Prevent all combat damage that would be dealt by target blocked creature this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/benalish_missionary.jpg Oracle:{1}{W}, {T}: Prevent all combat damage that would be dealt by target blocked creature this turn. diff --git a/forge-gui/res/cardsfolder/b/bend_or_break.txt b/forge-gui/res/cardsfolder/b/bend_or_break.txt index b081ef61677..c0a3ca72499 100644 --- a/forge-gui/res/cardsfolder/b/bend_or_break.txt +++ b/forge-gui/res/cardsfolder/b/bend_or_break.txt @@ -7,6 +7,6 @@ SVar:DBTwoPiles:DB$ TwoPiles | Defined$ Remembered | Separator$ Remembered | Cho SVar:DBBreak:DB$ DestroyAll | ValidCards$ Land.IsRemembered SVar:DBBend:DB$ TapAll | ValidCards$ Land.IsRemembered SVar:DBCleanupChosen:DB$ Cleanup | ClearChosenPlayer$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bend_or_break.jpg Oracle:Each player separates all nontoken lands they control into two piles. For each player, one of their piles is chosen by one of their opponents of their choice. Destroy all lands in the chosen piles. Tap all lands in the other piles. diff --git a/forge-gui/res/cardsfolder/b/benevolent_offering.txt b/forge-gui/res/cardsfolder/b/benevolent_offering.txt index 3d8fdaa91cb..fa017bdcfeb 100644 --- a/forge-gui/res/cardsfolder/b/benevolent_offering.txt +++ b/forge-gui/res/cardsfolder/b/benevolent_offering.txt @@ -8,8 +8,8 @@ SVar:DBGainLifeYou:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X | SVar:DBGainLifeOpp:DB$ GainLife | Defined$ ChosenPlayer | LifeAmount$ Y | References$ Y SVar:X:Count$Valid Creature.YouCtrl/Twice SVar:Y:Count$Valid Creature.ChosenCtrl/Twice -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random DeckHas:Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/benevolent_offering.jpg Oracle:Choose an opponent. You and that player each create three 1/1 white Spirit creature tokens with flying.\nChoose an opponent. You gain 2 life for each creature you control and that player gains 2 life for each creature they control. diff --git a/forge-gui/res/cardsfolder/b/bereavement.txt b/forge-gui/res/cardsfolder/b/bereavement.txt index d954bcd7210..7e44ea59c1c 100644 --- a/forge-gui/res/cardsfolder/b/bereavement.txt +++ b/forge-gui/res/cardsfolder/b/bereavement.txt @@ -3,6 +3,6 @@ ManaCost:1 B Types:Enchantment T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Green | TriggerZones$ Battlefield | Execute$ BereavementDiscard | TriggerDescription$ Whenever a green creature dies, its controller discards a card. SVar:BereavementDiscard:DB$ Discard | Defined$ TriggeredCardController | Mode$ TgtChoose | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/bereavement.jpg Oracle:Whenever a green creature dies, its controller discards a card. diff --git a/forge-gui/res/cardsfolder/b/beseech_the_queen.txt b/forge-gui/res/cardsfolder/b/beseech_the_queen.txt index b4cc34041a8..3a0c9097a43 100644 --- a/forge-gui/res/cardsfolder/b/beseech_the_queen.txt +++ b/forge-gui/res/cardsfolder/b/beseech_the_queen.txt @@ -3,6 +3,6 @@ ManaCost:2/B 2/B 2/B Types:Sorcery A:SP$ ChangeZone | Cost$ 2/B 2/B 2/B | Origin$ Library | Destination$ Hand | ChangeType$ Card.cmcLEX | ChangeNum$ 1 | References$ X | SpellDescription$ Search your library for a card with converted mana cost less than or equal to the number of lands you control, reveal it, put it into your hand, then shuffle your library. SVar:X:Count$Valid Land.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/beseech_the_queen.jpg Oracle:Search your library for a card with converted mana cost less than or equal to the number of lands you control, reveal it, put it into your hand, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/b/betrayal_of_flesh.txt b/forge-gui/res/cardsfolder/b/betrayal_of_flesh.txt index 6bbf3deffee..0da4454b42d 100644 --- a/forge-gui/res/cardsfolder/b/betrayal_of_flesh.txt +++ b/forge-gui/res/cardsfolder/b/betrayal_of_flesh.txt @@ -5,6 +5,6 @@ K:Entwine:Sac<3/Land> A:SP$ Charm | Cost$ 5 B | Choices$ DBDestroy,DBChange | CharmNum$ 1 SVar:DBDestroy:DB$ Destroy | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Destroy target creature. SVar:DBChange:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SpellDescription$ Return target creature card from your graveyard to the battlefield. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/betrayal_of_flesh.jpg Oracle:Choose one —\n• Destroy target creature.\n• Return target creature card from your graveyard to the battlefield.\nEntwine—Sacrifice three lands. (Choose both if you pay the entwine cost.) diff --git a/forge-gui/res/cardsfolder/b/betrothed_of_fire.txt b/forge-gui/res/cardsfolder/b/betrothed_of_fire.txt index f04fc37d70d..dd59823c6cf 100644 --- a/forge-gui/res/cardsfolder/b/betrothed_of_fire.txt +++ b/forge-gui/res/cardsfolder/b/betrothed_of_fire.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ 1 R | ValidTgts$ Creature | AILogic$ Pump A:AB$ Pump | Cost$ Sac<1/Creature.untapped/untapped creature> | Defined$ Enchanted | NumAtt$ +2 | SpellDescription$ Enchanted creature get +2/+0 until end of turn. A:AB$ PumpAll | Cost$ Sac<1/Card.AttachedBy/enchanted creature> | ValidCards$ Creature.YouCtrl | NumAtt$ +2 | CostDesc$ Sacrifice enchanted creature: | SpellDescription$ Creatures you control get +2/+0 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/betrothed_of_fire.jpg Oracle:Enchant creature\nSacrifice an untapped creature: Enchanted creature gets +2/+0 until end of turn.\nSacrifice enchanted creature: Creatures you control get +2/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/b/bifurcate.txt b/forge-gui/res/cardsfolder/b/bifurcate.txt index 9ee2252036b..208dfa80e98 100644 --- a/forge-gui/res/cardsfolder/b/bifurcate.txt +++ b/forge-gui/res/cardsfolder/b/bifurcate.txt @@ -3,7 +3,7 @@ ManaCost:3 G Types:Sorcery A:SP$ Pump | Cost$ 3 G | ValidTgts$ Creature.nonToken | TgtPrompt$ Select target nontoken creature | Static$ True | StackDescription$ None | SubAbility$ DBChangeZone | SpellDescription$ Search your library for a permanent card with the same name as target nontoken creature and put that card onto the battlefield. Then shuffle your library. SVar:DBChangeZone:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Targeted.Permanent+sameName | ChangeNum$ 1 | StackDescription$ Search your library for a permanent card with the same name as target nontoken creature and put that card onto the battlefield. Then shuffle your library. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/bifurcate.jpg Oracle:Search your library for a permanent card with the same name as target nontoken creature and put that card onto the battlefield. Then shuffle your library. diff --git a/forge-gui/res/cardsfolder/b/biomass_mutation.txt b/forge-gui/res/cardsfolder/b/biomass_mutation.txt index 61adcace5b4..997aed0b2a4 100644 --- a/forge-gui/res/cardsfolder/b/biomass_mutation.txt +++ b/forge-gui/res/cardsfolder/b/biomass_mutation.txt @@ -3,6 +3,6 @@ ManaCost:X GU GU Types:Instant A:SP$ AnimateAll | Cost$ X GU GU | Power$ X | Toughness$ X | References$ X | ValidCards$ Creature.YouCtrl | SpellDescription$ Creatures you control become X/X until end of turn. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/biomass_mutation.jpg Oracle:Creatures you control have base power and toughness X/X until end of turn. diff --git a/forge-gui/res/cardsfolder/b/biorhythm.txt b/forge-gui/res/cardsfolder/b/biorhythm.txt index 23a29e4e2fa..3d7d4cfbe74 100644 --- a/forge-gui/res/cardsfolder/b/biorhythm.txt +++ b/forge-gui/res/cardsfolder/b/biorhythm.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ RepeatEach | Cost$ 6 G G | RepeatPlayers$ Player | RepeatSubAbility$ DBSetLife | SpellDescription$ Each player's life total becomes the number of creatures they control. SVar:DBSetLife:DB$ SetLife | Defined$ Player.IsRemembered | LifeAmount$ X | References$ X SVar:X:Count$Valid Creature.RememberedPlayerCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/biorhythm.jpg Oracle:Each player's life total becomes the number of creatures they control. diff --git a/forge-gui/res/cardsfolder/b/bioshift.txt b/forge-gui/res/cardsfolder/b/bioshift.txt index 2f080cf68f5..e907ce94a0c 100644 --- a/forge-gui/res/cardsfolder/b/bioshift.txt +++ b/forge-gui/res/cardsfolder/b/bioshift.txt @@ -5,7 +5,7 @@ A:SP$ Pump | Cost$ GU | ValidTgts$ Creature | TgtPrompt$ Select target creature SVar:DBChooseNum:DB$ ChooseNumber | Min$ 0 | Max$ X | References$ X | ListTitle$ Choose how many counters to move | SubAbility$ DBMove | StackDescription$ None SVar:DBMove:DB$ MoveCounter | Source$ Remembered | ValidTgts$ Creature | TgtPrompt$ Select another target creature with the same controller to get +1/+1 counter | TargetUnique$ True | TargetsWithSameController$ True | CounterType$ P1P1 | CounterNum$ Y | References$ Y | ConditionDefined$ Targeted | ConditionPresent$ Creature.sharesControllerWith Remembered | ConditionCompare$ EQ1 | SubAbility$ DBCleanup | StackDescription$ None SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Y:Count$ChosenNumber SVar:X:Count$TotalCounters_P1P1_Card.IsRemembered DeckHas:Ability$Counters diff --git a/forge-gui/res/cardsfolder/b/birchlore_rangers.txt b/forge-gui/res/cardsfolder/b/birchlore_rangers.txt index d188da726f7..c9aee87d440 100644 --- a/forge-gui/res/cardsfolder/b/birchlore_rangers.txt +++ b/forge-gui/res/cardsfolder/b/birchlore_rangers.txt @@ -4,6 +4,6 @@ Types:Creature Elf Druid PT:1/1 A:AB$ Mana | Cost$ tapXType<2/Elf> | Produced$ Any | SpellDescription$ Add one mana of any color. K:Morph:G -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/birchlore_rangers.jpg Oracle:Tap two untapped Elves you control: Add one mana of any color.\nMorph {G} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) diff --git a/forge-gui/res/cardsfolder/b/bite_of_the_black_rose.txt b/forge-gui/res/cardsfolder/b/bite_of_the_black_rose.txt index fbb80f36462..00705550cfb 100644 --- a/forge-gui/res/cardsfolder/b/bite_of_the_black_rose.txt +++ b/forge-gui/res/cardsfolder/b/bite_of_the_black_rose.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ Vote | Cost$ 3 B | Defined$ Player | VoteSickness$ DBPumpAll | VotePsychosis$ DBDiscard | Tied$ DBDiscard | VoteType$ Sickness,Psychosis | SpellDescription$ Will of the Council — Starting with you, each player votes for sickness or psychosis. If sickness gets more votes, creatures your opponents control get -2/-2 until end of turn. If psychosis gets more votes or the vote is tied, each opponent discards two cards. SVar:DBPumpAll:DB$ PumpAll | NumAtt$ -2 | NumDef$ -2 | ValidCards$ Creature.OppCtrl | IsCurse$ True SVar:DBDiscard:DB$ Discard | Defined$ Player.Opponent | NumCards$ 2 | Mode$ TgtChoose -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bite_of_the_black_rose.jpg Oracle:Will of the council — Starting with you, each player votes for sickness or psychosis. If sickness gets more votes, creatures your opponents control get -2/-2 until end of turn. If psychosis gets more votes or the vote is tied, each opponent discards two cards. diff --git a/forge-gui/res/cardsfolder/b/black_carriage.txt b/forge-gui/res/cardsfolder/b/black_carriage.txt index 1bcdda4c214..e8a47be63c8 100644 --- a/forge-gui/res/cardsfolder/b/black_carriage.txt +++ b/forge-gui/res/cardsfolder/b/black_carriage.txt @@ -5,6 +5,6 @@ PT:4/4 K:Trample K:CARDNAME doesn't untap during your untap step. A:AB$ Untap | Cost$ Sac<1/Creature> | ActivationPhases$ Upkeep | PlayerTurn$ True | SpellDescription$ Untap CARDNAME. Activate this ability only during your upkeep. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/black_carriage.jpg Oracle:Trample\nBlack Carriage doesn't untap during your untap step.\nSacrifice a creature: Untap Black Carriage. Activate this ability only during your upkeep. diff --git a/forge-gui/res/cardsfolder/b/black_mana_battery.txt b/forge-gui/res/cardsfolder/b/black_mana_battery.txt index c962cab0230..e4eb26d5990 100644 --- a/forge-gui/res/cardsfolder/b/black_mana_battery.txt +++ b/forge-gui/res/cardsfolder/b/black_mana_battery.txt @@ -6,6 +6,6 @@ A:AB$ Mana | Cost$ T SubCounter | References$ X,Y | Produced$ B | Amou SVar:Y:Number$1/Plus.ChosenX SVar:X:XChoice #ChosenX SVar created by Cost payment -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/black_mana_battery.jpg Oracle:{2}, {T}: Put a charge counter on Black Mana Battery.\n{T}, Remove any number of charge counters from Black Mana Battery: Add {B}, then add an additional {B} for each charge counter removed this way. diff --git a/forge-gui/res/cardsfolder/b/black_scarab.txt b/forge-gui/res/cardsfolder/b/black_scarab.txt index cb47e516e4c..cb598a27716 100644 --- a/forge-gui/res/cardsfolder/b/black_scarab.txt +++ b/forge-gui/res/cardsfolder/b/black_scarab.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ W | ValidTgts$ Creature | AILogic$ Pump S:Mode$ CantBlockBy | ValidAttacker$ Creature.EnchantedBy | ValidBlocker$ Creature.Black | Description$ Enchanted creature can't be blocked by black creatures. S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 2 | AddToughness$ 2 | IsPresent$ Permanent.Black+OppCtrl | Description$ Enchanted creature gets +2/+2 as long as an opponent controls a black permanent. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/black_scarab.jpg Oracle:Enchant creature\nEnchanted creature can't be blocked by black creatures.\nEnchanted creature gets +2/+2 as long as an opponent controls a black permanent. diff --git a/forge-gui/res/cardsfolder/b/black_suns_zenith.txt b/forge-gui/res/cardsfolder/b/black_suns_zenith.txt index 8667f63f455..e17219f258c 100644 --- a/forge-gui/res/cardsfolder/b/black_suns_zenith.txt +++ b/forge-gui/res/cardsfolder/b/black_suns_zenith.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ PutCounterAll | Cost$ X B B | ValidCards$ Creature | CounterType$ M1M1 | CounterNum$ X | SubAbility$ DBShuffle | IsCurse$ True | References$ X | SpellDescription$ Put X -1/-1 counters on each creature. Shuffle CARDNAME into its owner's library. SVar:X:Count$xPaid SVar:DBShuffle:DB$ChangeZone | Origin$ Stack | Destination$ Library | Shuffle$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/black_suns_zenith.jpg Oracle:Put X -1/-1 counters on each creature. Shuffle Black Sun's Zenith into its owner's library. diff --git a/forge-gui/res/cardsfolder/b/black_ward.txt b/forge-gui/res/cardsfolder/b/black_ward.txt index 545e8829254..494cc82adc1 100644 --- a/forge-gui/res/cardsfolder/b/black_ward.txt +++ b/forge-gui/res/cardsfolder/b/black_ward.txt @@ -4,6 +4,6 @@ Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ W | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Protection:Card.Black:Protection from black:Card.CardUID_HostCardUID | Description$ Enchanted creature has protection from black. This effect doesn't remove CARDNAME. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/black_ward.jpg Oracle:Enchant creature\nEnchanted creature has protection from black. This effect doesn't remove Black Ward. diff --git a/forge-gui/res/cardsfolder/b/blade_of_selves.txt b/forge-gui/res/cardsfolder/b/blade_of_selves.txt index 60df063e42f..454784e5bc4 100644 --- a/forge-gui/res/cardsfolder/b/blade_of_selves.txt +++ b/forge-gui/res/cardsfolder/b/blade_of_selves.txt @@ -3,7 +3,7 @@ ManaCost:2 Types:Artifact Equipment S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddKeyword$ Myriad | Description$ Equipped creature has myriad. (Whenever it attacks, for each opponent other than defending player, you may create a token that's a copy of that creature that's tapped and attacking that player or a planeswalker they control. Exile the tokens at end of combat.) K:Equip:4 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHas:Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/blade_of_selves.jpg Oracle:Equipped creature has myriad. (Whenever it attacks, for each opponent other than defending player, you may create a token that's a copy of that creature that's tapped and attacking that player or a planeswalker they control. Exile the tokens at end of combat.)\nEquip {4} diff --git a/forge-gui/res/cardsfolder/b/bladed_sentinel.txt b/forge-gui/res/cardsfolder/b/bladed_sentinel.txt index a0a9397e3e4..09916ad12ce 100644 --- a/forge-gui/res/cardsfolder/b/bladed_sentinel.txt +++ b/forge-gui/res/cardsfolder/b/bladed_sentinel.txt @@ -3,6 +3,6 @@ ManaCost:4 Types:Artifact Creature Construct PT:2/4 A:AB$ Pump | Cost$ W | KW$ Vigilance | Defined$ Self | SpellDescription$ CARDNAME gains vigilance until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/bladed_sentinel.jpg Oracle:{W}: Bladed Sentinel gains vigilance until end of turn. diff --git a/forge-gui/res/cardsfolder/b/blademane_baku.txt b/forge-gui/res/cardsfolder/b/blademane_baku.txt index d3e643ca8bc..40355bb533f 100644 --- a/forge-gui/res/cardsfolder/b/blademane_baku.txt +++ b/forge-gui/res/cardsfolder/b/blademane_baku.txt @@ -8,7 +8,7 @@ A:AB$ Pump | Cost$ 1 SubCounter | Defined$ Self | NumAtt$ +Y | References$ SVar:X:XChoice #ChosenX SVar created by Cost payment SVar:Y:SVar$ChosenX/Times.2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/blademane_baku.jpg Oracle:Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Blademane Baku.\n{1}, Remove X ki counters from Blademane Baku: For each counter removed, Blademane Baku gets +2/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/b/blanket_of_night.txt b/forge-gui/res/cardsfolder/b/blanket_of_night.txt index 369b2d0ead0..912bfa51339 100644 --- a/forge-gui/res/cardsfolder/b/blanket_of_night.txt +++ b/forge-gui/res/cardsfolder/b/blanket_of_night.txt @@ -2,6 +2,6 @@ Name:Blanket of Night ManaCost:1 B B Types:Enchantment S:Mode$ Continuous | Affected$ Land | AddType$ Swamp | Description$ Each land is a Swamp in addition to its other land types. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/blanket_of_night.jpg Oracle:Each land is a Swamp in addition to its other land types. diff --git a/forge-gui/res/cardsfolder/b/blast_of_genius.txt b/forge-gui/res/cardsfolder/b/blast_of_genius.txt index 5d7d4e5f217..f501b329f53 100644 --- a/forge-gui/res/cardsfolder/b/blast_of_genius.txt +++ b/forge-gui/res/cardsfolder/b/blast_of_genius.txt @@ -6,6 +6,6 @@ SVar:DBDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | Reme SVar:DBDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Choose any target | NumDmg$ X | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$CardManaCost -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/blast_of_genius.jpg Oracle:Choose any target. Draw three cards, then discard a card. Blast of Genius deals damage equal to the discarded card's converted mana cost to that permanent or player. diff --git a/forge-gui/res/cardsfolder/b/blasting_station.txt b/forge-gui/res/cardsfolder/b/blasting_station.txt index de8051ffd6b..65974fe4dbc 100644 --- a/forge-gui/res/cardsfolder/b/blasting_station.txt +++ b/forge-gui/res/cardsfolder/b/blasting_station.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ DealDamage | Cost$ T Sac<1/Creature> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to any target. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ Whenever a creature enters the battlefield, you may untap CARDNAME. SVar:TrigUntap:DB$Untap | Defined$ Self -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/blasting_station.jpg Oracle:{T}, Sacrifice a creature: Blasting Station deals 1 damage to any target.\nWhenever a creature enters the battlefield, you may untap Blasting Station. diff --git a/forge-gui/res/cardsfolder/b/blaze_of_glory.txt b/forge-gui/res/cardsfolder/b/blaze_of_glory.txt index a2af31cb833..4834b48c1dc 100644 --- a/forge-gui/res/cardsfolder/b/blaze_of_glory.txt +++ b/forge-gui/res/cardsfolder/b/blaze_of_glory.txt @@ -3,6 +3,6 @@ ManaCost:W Types:Instant A:SP$ Pump | Cost$ W | ValidTgts$ Creature.DefendingPlayerCtrl | TgtPrompt$ Select target creature defending player controls | KW$ HIDDEN CARDNAME can block any number of creatures. | SubAbility$ GoingDownInStyle | ActivationPhases$ BeginCombat->Declare Attackers | StackDescription$ {c:Targeted} can block any number of creatures this turn. It blocks each attacking creature this turn if able. | SpellDescription$ Cast CARDNAME only during combat before blockers are declared. Target creature defending player controls can block any number of creatures this turn. It blocks each attacking creature this turn if able. SVar:GoingDownInStyle:DB$ MustBlock | Defined$ ParentTarget | DefinedAttacker$ Valid Card.attacking | BlockAllDefined$ True | StackDescription$ None -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/blaze_of_glory.jpg Oracle:Cast this spell only during combat before blockers are declared.\nTarget creature defending player controls can block any number of creatures this turn. It blocks each attacking creature this turn if able. diff --git a/forge-gui/res/cardsfolder/b/blazethorn_scarecrow.txt b/forge-gui/res/cardsfolder/b/blazethorn_scarecrow.txt index 77d18f49587..0e5e7b29e42 100644 --- a/forge-gui/res/cardsfolder/b/blazethorn_scarecrow.txt +++ b/forge-gui/res/cardsfolder/b/blazethorn_scarecrow.txt @@ -7,7 +7,7 @@ S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Wither | CheckSVar$ Y | S SVar:X:Count$Valid Creature.Red+YouCtrl SVar:Y:Count$Valid Creature.Green+YouCtrl SVar:BuffedBy:Creature.Red,Creature.Green -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Red|Green SVar:Picture:http://www.wizards.com/global/images/magic/general/blazethorn_scarecrow.jpg Oracle:Blazethorn Scarecrow has haste as long as you control a red creature.\nBlazethorn Scarecrow has wither as long as you control a green creature. (It deals damage to creatures in the form of -1/-1 counters.) diff --git a/forge-gui/res/cardsfolder/b/blazing_shoal.txt b/forge-gui/res/cardsfolder/b/blazing_shoal.txt index 990580b30ba..1f6604f167f 100644 --- a/forge-gui/res/cardsfolder/b/blazing_shoal.txt +++ b/forge-gui/res/cardsfolder/b/blazing_shoal.txt @@ -5,6 +5,6 @@ A:SP$ Pump | Cost$ X R R | ValidTgts$ Creature | TgtPrompt$ Select target creatu A:SP$ Pump | Cost$ ExileFromHand<1/Card.Red> | CostDesc$ You may exile a red card from your hand rather than pay Blazing Shoal's mana cost. | ValidTgts$ Creature | NumAtt$ +Y | References$ Y | SpellDescription$ Target creature gets +X/+0 until end of turn, where X is the exiled card's converted mana cost. SVar:X:Count$xPaid SVar:Y:Exiled$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/blazing_shoal.jpg Oracle:You may exile a red card with converted mana cost X from your hand rather than pay this spell's mana cost.\nTarget creature gets +X/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/b/blessed_reincarnation.txt b/forge-gui/res/cardsfolder/b/blessed_reincarnation.txt index 80d349edf8d..588d377f3b4 100644 --- a/forge-gui/res/cardsfolder/b/blessed_reincarnation.txt +++ b/forge-gui/res/cardsfolder/b/blessed_reincarnation.txt @@ -4,6 +4,6 @@ Types:Instant K:Rebound A:SP$ ChangeZone | Cost$ 3 U | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBDig | SpellDescription$ Exile target creature an opponent controls. That player reveals cards from the top of their library until a creature card is revealed. The player puts that card onto the battlefield, then shuffles the rest into their library. SVar:DBDig:DB$ DigUntil | Defined$ TargetedController | Valid$ Creature | ValidDescription$ creature | FoundDestination$ Battlefield | RevealedDestination$ Library | Shuffle$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/blessed_reincarnation.jpg Oracle:Exile target creature an opponent controls. That player reveals cards from the top of their library until a creature card is revealed. The player puts that card onto the battlefield, then shuffles the rest into their library.\nRebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) diff --git a/forge-gui/res/cardsfolder/b/blessing_of_leeches.txt b/forge-gui/res/cardsfolder/b/blessing_of_leeches.txt index e396a146750..e1e295611d2 100644 --- a/forge-gui/res/cardsfolder/b/blessing_of_leeches.txt +++ b/forge-gui/res/cardsfolder/b/blessing_of_leeches.txt @@ -7,7 +7,7 @@ A:SP$ Attach | Cost$ 2 B | ValidTgts$ Creature | AILogic$ Pump A:AB$ Regenerate | Cost$ 0 | Defined$ Enchanted | SpellDescription$ Regenerate enchanted creature. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ At the beginning of your upkeep, you lose 1 life. SVar:TrigLoseLife:DB$LoseLife | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingAttachEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/blessing_of_leeches.jpg Oracle:Flash\nEnchant creature\nAt the beginning of your upkeep, you lose 1 life.\n{0}: Regenerate enchanted creature. diff --git a/forge-gui/res/cardsfolder/b/blind_fury.txt b/forge-gui/res/cardsfolder/b/blind_fury.txt index 83b0ed0126e..40660c33c81 100644 --- a/forge-gui/res/cardsfolder/b/blind_fury.txt +++ b/forge-gui/res/cardsfolder/b/blind_fury.txt @@ -7,6 +7,6 @@ SVar:FuryCombatEvent:Event$ DamageDone | ValidSource$ Creature | ValidTarget$ Cr SVar:DmgTwice:DB$ ReplaceEffect | VarName$ DamageAmount | VarValue$ X | References$ X SVar:X:ReplaceCount$DamageAmount/Twice SVar:PlayMain1:TRUE -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/blind_fury.jpg Oracle:All creatures lose trample until end of turn. If a creature would deal combat damage to a creature this turn, it deals double that damage to that creature instead. diff --git a/forge-gui/res/cardsfolder/b/blind_seer.txt b/forge-gui/res/cardsfolder/b/blind_seer.txt index b011fbfdc3f..d4cb70148ad 100644 --- a/forge-gui/res/cardsfolder/b/blind_seer.txt +++ b/forge-gui/res/cardsfolder/b/blind_seer.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Human Wizard PT:3/3 A:AB$ ChooseColor | Cost$ 1 U | Defined$ You | SubAbility$ Animate | SpellDescription$ Target spell or permanent becomes the color of your choice until end of turn. SVar:Animate:DB$ Animate | ValidTgts$ Card | TgtPrompt$ Select target spell or permanent to change the color of | TgtZone$ Stack,Battlefield | Colors$ ChosenColor | OverwriteColors$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/blind_seer.jpg Oracle:{1}{U}: Target spell or permanent becomes the color of your choice until end of turn. diff --git a/forge-gui/res/cardsfolder/b/blind_spot_giant.txt b/forge-gui/res/cardsfolder/b/blind_spot_giant.txt index 477b9a08d73..70fb5c91aa9 100644 --- a/forge-gui/res/cardsfolder/b/blind_spot_giant.txt +++ b/forge-gui/res/cardsfolder/b/blind_spot_giant.txt @@ -5,6 +5,6 @@ PT:4/3 S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ CARDNAME can't attack or block. | CheckSVar$ X | SVarCompare$ EQ0 | Description$ CARDNAME can't attack or block unless you control another Giant. SVar:X:Count$Valid Giant.Other+YouCtrl SVar:BuffedBy:Giant -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/blind_spot_giant.jpg Oracle:Blind-Spot Giant can't attack or block unless you control another Giant. diff --git a/forge-gui/res/cardsfolder/b/blinding_beam.txt b/forge-gui/res/cardsfolder/b/blinding_beam.txt index e93ed699dfe..cdb923e69c4 100644 --- a/forge-gui/res/cardsfolder/b/blinding_beam.txt +++ b/forge-gui/res/cardsfolder/b/blinding_beam.txt @@ -8,6 +8,6 @@ SVar:DBEffect:DB$ Effect | ValidTgts$ Player | TgtPrompt$ Select target player | SVar:DontUntap:Mode$ Continuous | ValidPlayer$ Player.IsRemembered | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature | AddHiddenKeyword$ This card doesn't untap. SVar:RestoreSight:Mode$ Phase | Phase$ Untap | ValidPlayer$ Player.IsRemembered | TriggerZones$ Command | Execute$ ExileEffect | Static$ True SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/blinding_beam.jpg Oracle:Choose one —\n• Tap two target creatures.\n• Creatures don't untap during target player's next untap step.\nEntwine {1} (Choose both if you pay the entwine cost.) diff --git a/forge-gui/res/cardsfolder/b/blinding_fog.txt b/forge-gui/res/cardsfolder/b/blinding_fog.txt index 57c623f906d..774743c50dd 100644 --- a/forge-gui/res/cardsfolder/b/blinding_fog.txt +++ b/forge-gui/res/cardsfolder/b/blinding_fog.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Effect | Cost$ 2 G | Name$ Blinding Fog Effect | ReplacementEffects$ RPrevent | SubAbility$ DBPumpAll | SpellDescription$ Prevent all damage that would be dealt to creatures this turn. Creatures you control gain hexproof until end of turn. (They can't be the targets of spells or abilities your opponents control.) SVar:RPrevent:Event$ DamageDone | Prevent$ True | ActiveZones$ Command | ValidTarget$ Creature | Description$ Prevent all damage that would be dealt to creatures this turn. SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Hexproof -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/blinding_fog.jpg Oracle:Prevent all damage that would be dealt to creatures this turn. Creatures you control gain hexproof until end of turn. (They can't be the targets of spells or abilities your opponents control.) diff --git a/forge-gui/res/cardsfolder/b/blinding_light.txt b/forge-gui/res/cardsfolder/b/blinding_light.txt index 23c8c33de3a..adc75c4cc4a 100644 --- a/forge-gui/res/cardsfolder/b/blinding_light.txt +++ b/forge-gui/res/cardsfolder/b/blinding_light.txt @@ -2,6 +2,6 @@ Name:Blinding Light ManaCost:2 W Types:Sorcery A:SP$ TapAll | Cost$ 2 W | ValidCards$ Creature.nonWhite | SpellDescription$ Tap all nonwhite creatures. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://resources.wizards.com/magic/cards/p3/en-us/card20388.jpg Oracle:Tap all nonwhite creatures. diff --git a/forge-gui/res/cardsfolder/b/blinding_souleater.txt b/forge-gui/res/cardsfolder/b/blinding_souleater.txt index 370baa83547..1528646a671 100644 --- a/forge-gui/res/cardsfolder/b/blinding_souleater.txt +++ b/forge-gui/res/cardsfolder/b/blinding_souleater.txt @@ -3,7 +3,7 @@ ManaCost:3 Types:Artifact Creature Cleric PT:1/3 A:AB$ Tap | Cost$ PW T | ValidTgts$ Creature | TgtPrompt$ Select target creature | AIPhyrexianPayment$ Never | SpellDescription$ Tap target creature. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$white SVar:NonCombatPriority:1 SVar:Picture:http://www.wizards.com/global/images/magic/general/blinding_souleater.jpg diff --git a/forge-gui/res/cardsfolder/b/blinkmoth_infusion.txt b/forge-gui/res/cardsfolder/b/blinkmoth_infusion.txt index f482fc6b8a5..5a12d02d694 100644 --- a/forge-gui/res/cardsfolder/b/blinkmoth_infusion.txt +++ b/forge-gui/res/cardsfolder/b/blinkmoth_infusion.txt @@ -4,7 +4,7 @@ Types:Instant A:SP$ UntapAll | Cost$ 12 U U | ValidCards$ Artifact | SpellDescription$ Untap all artifacts. S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) SVar:X:Count$Valid Artifact.YouCtrl -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/blinkmoth_infusion.jpg Oracle:Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.)\nUntap all artifacts. diff --git a/forge-gui/res/cardsfolder/b/blinkmoth_urn.txt b/forge-gui/res/cardsfolder/b/blinkmoth_urn.txt index 1a13743a491..cba3e33507a 100644 --- a/forge-gui/res/cardsfolder/b/blinkmoth_urn.txt +++ b/forge-gui/res/cardsfolder/b/blinkmoth_urn.txt @@ -4,6 +4,6 @@ Types:Artifact T:Mode$ Phase | Phase$ Main1 | PreCombatMain$ True | ValidPlayer$ Player | TriggerZones$ Battlefield | IsPresent$ Card.Self+untapped | Execute$ TrigGetMana | TriggerDescription$ At the beginning of each player's precombat main phase, if CARDNAME is untapped, that player adds {C} for each artifact they control. SVar:TrigGetMana:DB$ Mana | Produced$ C | Amount$ X | References$ X | Defined$ TriggeredPlayer SVar:X:Count$Valid Artifact.ActivePlayerCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/blinkmoth_urn.jpg Oracle:At the beginning of each player's precombat main phase, if Blinkmoth Urn is untapped, that player adds {C} for each artifact they control. diff --git a/forge-gui/res/cardsfolder/b/blinkmoth_well.txt b/forge-gui/res/cardsfolder/b/blinkmoth_well.txt index 5962efd160e..dc789d57f87 100644 --- a/forge-gui/res/cardsfolder/b/blinkmoth_well.txt +++ b/forge-gui/res/cardsfolder/b/blinkmoth_well.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Tap | Cost$ 2 T | ValidTgts$ Artifact.nonCreature | TgtPrompt$ Select target noncreature artifact | SpellDescription$ Tap target noncreature artifact. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/blinkmoth_well.jpg Oracle:{T}: Add {C}.\n{2}, {T}: Tap target noncreature artifact. diff --git a/forge-gui/res/cardsfolder/b/blizzard.txt b/forge-gui/res/cardsfolder/b/blizzard.txt index de5b4ad7cb8..51f0cf27a3e 100644 --- a/forge-gui/res/cardsfolder/b/blizzard.txt +++ b/forge-gui/res/cardsfolder/b/blizzard.txt @@ -5,6 +5,6 @@ K:Cumulative upkeep:2 S:Mode$ Continuous | Affected$ Creature.withFlying | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Creatures with flying don't untap during their controllers' untap steps. S:Mode$ CantBeCast | ValidCard$ Card.Self | EffectZone$ All | CheckSVar$ X | SVarCompare$ EQ0 | Description$ Cast CARDNAME only if you control a snow land. SVar:X:Count$Valid Snow.Land+YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/blizzard.jpg Oracle:Cast this spell only if you control a snow land.\nCumulative upkeep {2} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nCreatures with flying don't untap during their controllers' untap steps. diff --git a/forge-gui/res/cardsfolder/b/blood_celebrant.txt b/forge-gui/res/cardsfolder/b/blood_celebrant.txt index 48341969959..46aa1a65436 100644 --- a/forge-gui/res/cardsfolder/b/blood_celebrant.txt +++ b/forge-gui/res/cardsfolder/b/blood_celebrant.txt @@ -3,6 +3,6 @@ ManaCost:B Types:Creature Human Cleric PT:1/1 A:AB$ Mana | Cost$ B PayLife<1> | Produced$ Any | SpellDescription$ Add one mana of any color. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/blood_celebrant.jpg Oracle:{B}, Pay 1 life: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/b/blood_clock.txt b/forge-gui/res/cardsfolder/b/blood_clock.txt index 1f254d4b8e3..24780008840 100644 --- a/forge-gui/res/cardsfolder/b/blood_clock.txt +++ b/forge-gui/res/cardsfolder/b/blood_clock.txt @@ -3,6 +3,6 @@ ManaCost:4 Types:Artifact T:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | Execute$ TrigChangeZone | TriggerDescription$ At the beginning of each player's upkeep, that player returns a permanent they control to its owner's hand unless they pay 2 life. SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | ChangeType$ Permanent | DefinedPlayer$ TriggeredPlayer | ChangeNum$ 1 | Hidden$ True | Mandatory$ True | UnlessCost$ PayLife<2> | UnlessPayer$ TriggeredPlayer -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/blood_clock.jpg Oracle:At the beginning of each player's upkeep, that player returns a permanent they control to its owner's hand unless they pay 2 life. diff --git a/forge-gui/res/cardsfolder/b/blood_funnel.txt b/forge-gui/res/cardsfolder/b/blood_funnel.txt index c3571fccdc7..3273868225a 100644 --- a/forge-gui/res/cardsfolder/b/blood_funnel.txt +++ b/forge-gui/res/cardsfolder/b/blood_funnel.txt @@ -4,6 +4,6 @@ Types:Enchantment S:Mode$ ReduceCost | ValidCard$ Card.nonCreature | Type$ Spell | Activator$ You | Amount$ 2 | Description$ Noncreature spells you cast cost {2} less to cast. T:Mode$ SpellCast | ValidCard$ Card.nonCreature | ValidActivatingPlayer$ You | Execute$ TrigCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a noncreature spell, counter that spell unless you sacrifice a creature. SVar:TrigCounter:DB$ Counter | Defined$ TriggeredSpellAbility | UnlessCost$ Sac<1/Creature> | UnlessPayer$ You -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/blood_funnel.jpg Oracle:Noncreature spells you cast cost {2} less to cast.\nWhenever you cast a noncreature spell, counter that spell unless you sacrifice a creature. diff --git a/forge-gui/res/cardsfolder/b/blood_moon.txt b/forge-gui/res/cardsfolder/b/blood_moon.txt index 344f6a76c96..85732091147 100644 --- a/forge-gui/res/cardsfolder/b/blood_moon.txt +++ b/forge-gui/res/cardsfolder/b/blood_moon.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Enchantment S:Mode$ Continuous | Affected$ Land.nonBasic | AddType$ Mountain | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | Description$ Nonbasic lands are Mountains. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/blood_moon.jpg Oracle:Nonbasic lands are Mountains. diff --git a/forge-gui/res/cardsfolder/b/blood_oath.txt b/forge-gui/res/cardsfolder/b/blood_oath.txt index a4f92538a00..0dff981f40a 100644 --- a/forge-gui/res/cardsfolder/b/blood_oath.txt +++ b/forge-gui/res/cardsfolder/b/blood_oath.txt @@ -7,6 +7,6 @@ SVar:DBDamage:DB$ DealDamage | Defined$ Targeted | NumDmg$ X | References$ X,Y | SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:SVar$Y/Times.3 SVar:Y:Remembered$Valid Card.ChosenType -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/blood_oath.jpg Oracle:Choose a card type. Target opponent reveals their hand. Blood Oath deals 3 damage to that player for each card of the chosen type revealed this way. (Artifact, creature, enchantment, instant, land, planeswalker, sorcery, and tribal are card types.) diff --git a/forge-gui/res/cardsfolder/b/blood_of_the_martyr.txt b/forge-gui/res/cardsfolder/b/blood_of_the_martyr.txt index 614735a51a1..6d6aca31e4e 100644 --- a/forge-gui/res/cardsfolder/b/blood_of_the_martyr.txt +++ b/forge-gui/res/cardsfolder/b/blood_of_the_martyr.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Effect | Cost$ W W W | Name$ Blood of the Martyr Effect | ReplacementEffects$ MartyrDamage | SVars$ DmgYou | SpellDescription$ Until end of turn, if damage would be dealt to any creature, you may have that damage dealt to you instead. SVar:Damage:Event$ DamageDone | ValidTarget$ Creature | Optional$ True | OptionalDecider$ You | ReplaceWith$ DmgYou | Description$ Until end of turn, if damage would be dealt to any creature, you may have that damage dealt to you instead. SVar:DmgYou:DB$ ReplaceEffect | VarName$ Affected | VarValue$ You | VarType$ Player -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/blood_of_the_martyr.jpg Oracle:Until end of turn, if damage would be dealt to any creature, you may have that damage dealt to you instead. diff --git a/forge-gui/res/cardsfolder/b/blood_rites.txt b/forge-gui/res/cardsfolder/b/blood_rites.txt index a2ed5c39839..330b8aa5c7b 100644 --- a/forge-gui/res/cardsfolder/b/blood_rites.txt +++ b/forge-gui/res/cardsfolder/b/blood_rites.txt @@ -3,6 +3,6 @@ ManaCost:3 R R Types:Enchantment A:AB$ DealDamage | Cost$ 1 R Sac<1/Creature> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to any target. SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/blood_rites.jpg Oracle:{1}{R}, Sacrifice a creature: Blood Rites deals 2 damage to any target. diff --git a/forge-gui/res/cardsfolder/b/blood_sun.txt b/forge-gui/res/cardsfolder/b/blood_sun.txt index b2c0c40fa65..b5af29d80dd 100644 --- a/forge-gui/res/cardsfolder/b/blood_sun.txt +++ b/forge-gui/res/cardsfolder/b/blood_sun.txt @@ -5,6 +5,6 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 S:Mode$ Continuous | Affected$ Land | RemoveAllAbilities$ True | ExceptManaAbilities$ True | Description$ All lands lose all abilities except mana abilities. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/blood_sun.jpg Oracle:When Blood Sun enters the battlefield, draw a card.\nAll lands lose all abilities except mana abilities. diff --git a/forge-gui/res/cardsfolder/b/blood_vassal.txt b/forge-gui/res/cardsfolder/b/blood_vassal.txt index 8aecb32b34b..539a28a6cdc 100644 --- a/forge-gui/res/cardsfolder/b/blood_vassal.txt +++ b/forge-gui/res/cardsfolder/b/blood_vassal.txt @@ -3,6 +3,6 @@ ManaCost:2 B Types:Creature Thrull PT:2/2 A:AB$ Mana | Cost$ Sac<1/CARDNAME> | Produced$ B | Amount$ 2 | SpellDescription$ Add {B}{B}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/blood_vassal.jpg Oracle:Sacrifice Blood Vassal: Add {B}{B}. diff --git a/forge-gui/res/cardsfolder/b/bloodbond_march.txt b/forge-gui/res/cardsfolder/b/bloodbond_march.txt index 24d4c280367..84d416fc7ff 100644 --- a/forge-gui/res/cardsfolder/b/bloodbond_march.txt +++ b/forge-gui/res/cardsfolder/b/bloodbond_march.txt @@ -3,6 +3,6 @@ ManaCost:2 B G Types:Enchantment T:Mode$ SpellCast | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigReturn | TriggerDescription$ Whenever a player casts a creature spell, each player returns all cards with the same name as that spell from their graveyard to the battlefield. SVar:TrigReturn:DB$ ChangeZoneAll | ChangeType$ Triggered.sameName | Origin$ Graveyard | Destination$ Battlefield -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodbond_march.jpg Oracle:Whenever a player casts a creature spell, each player returns all cards with the same name as that spell from their graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/b/bloodcurdler.txt b/forge-gui/res/cardsfolder/b/bloodcurdler.txt index d56b2aa8407..33f0865d70c 100644 --- a/forge-gui/res/cardsfolder/b/bloodcurdler.txt +++ b/forge-gui/res/cardsfolder/b/bloodcurdler.txt @@ -8,6 +8,6 @@ SVar:CurdledMill:DB$ Mill | Defined$ You | NumCards$ 1 S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 1 | AddToughness$ 1 | AddTrigger$ EndScream | Condition$ Threshold | Description$ Threshold — As long as seven or more cards are in your graveyard, CARDNAME gets +1/+1 and has "At the beginning of your end step, exile two cards from your graveyard." SVar:EndScream:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ BloodExile | Secondary$ True | TriggerDescription$ At the beginning of your end step, exile two cards from your graveyard. SVar:BloodExile:DB$ ChangeZone | Hidden$ True | Mandatory$ True | ChangeType$ Card.YouCtrl | ChangeNum$ 2 | DefinedPlayer$ You | Origin$ Graveyard | Destination$ Exile -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodcurdler.jpg Oracle:Flying\nAt the beginning of your upkeep, put the top card of your library into your graveyard.\nThreshold — As long as seven or more cards are in your graveyard, Bloodcurdler gets +1/+1 and has "At the beginning of your end step, exile two cards from your graveyard." diff --git a/forge-gui/res/cardsfolder/b/bloodfire_infusion.txt b/forge-gui/res/cardsfolder/b/bloodfire_infusion.txt index 1d48e4d5b2f..a1d53d77d31 100644 --- a/forge-gui/res/cardsfolder/b/bloodfire_infusion.txt +++ b/forge-gui/res/cardsfolder/b/bloodfire_infusion.txt @@ -5,6 +5,6 @@ K:Enchant creature you control A:SP$ Attach | Cost$ 2 R | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | AILogic$ Pump A:AB$ DamageAll | Cost$ R Sac<1/Card.AttachedBy/enchanted creature> | ActivationZone$ Battlefield | ValidCards$ Creature | NumDmg$ X | ValidDescription$ each creature | References$ X | SpellDescription$ CARDNAME deals damage equal to the sacrificed creature's power to each creature. SVar:X:Sacrificed$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodfire_infusion.jpg Oracle:Enchant creature you control\n{R}, Sacrifice enchanted creature: Bloodfire Infusion deals damage equal to the sacrificed creature's power to each creature. diff --git a/forge-gui/res/cardsfolder/b/bloodfire_kavu.txt b/forge-gui/res/cardsfolder/b/bloodfire_kavu.txt index 1e94b0a62e2..c7709a7b9ef 100644 --- a/forge-gui/res/cardsfolder/b/bloodfire_kavu.txt +++ b/forge-gui/res/cardsfolder/b/bloodfire_kavu.txt @@ -3,6 +3,6 @@ ManaCost:2 R R Types:Creature Kavu PT:2/2 A:AB$ DamageAll | Cost$ R Sac<1/CARDNAME> | ValidCards$ Creature | NumDmg$ 2 | ValidDescription$ each creature. | SpellDescription$ CARDNAME deals 2 damage to each creature. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodfire_kavu.jpg Oracle:{R}, Sacrifice Bloodfire Kavu: Bloodfire Kavu deals 2 damage to each creature. diff --git a/forge-gui/res/cardsfolder/b/bloodflow_connoisseur.txt b/forge-gui/res/cardsfolder/b/bloodflow_connoisseur.txt index f5705b7c6f9..8291a350444 100644 --- a/forge-gui/res/cardsfolder/b/bloodflow_connoisseur.txt +++ b/forge-gui/res/cardsfolder/b/bloodflow_connoisseur.txt @@ -3,6 +3,6 @@ ManaCost:2 B Types:Creature Vampire PT:1/1 A:AB$ PutCounter | Cost$ Sac<1/Creature> | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on CARDNAME. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodflow_connoisseur.jpg Oracle:Sacrifice a creature: Put a +1/+1 counter on Bloodflow Connoisseur. diff --git a/forge-gui/res/cardsfolder/b/bloodline_shaman.txt b/forge-gui/res/cardsfolder/b/bloodline_shaman.txt index 17efda770a8..bda0447890c 100644 --- a/forge-gui/res/cardsfolder/b/bloodline_shaman.txt +++ b/forge-gui/res/cardsfolder/b/bloodline_shaman.txt @@ -4,6 +4,6 @@ Types:Creature Elf Wizard Shaman PT:1/1 A:AB$ ChooseType | Cost$ T | Defined$ You | Type$ Creature | AILogic$ MostProminentInComputerDeck | SubAbility$ ShamanDig | SpellDescription$ Choose a creature type. Reveal the top card of your library. If that card is a creature card of the chosen type, put it into your hand. Otherwise, put it into your graveyard. SVar:ShamanDig:DB$ Dig | DigNum$ 1 | Reveal$ True | ChangeNum$ All | ChangeValid$ Creature.ChosenType | DestinationZone$ Hand | DestinationZone2$ Graveyard -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodline_shaman.jpg Oracle:{T}: Choose a creature type. Reveal the top card of your library. If that card is a creature card of the chosen type, put it into your hand. Otherwise, put it into your graveyard. diff --git a/forge-gui/res/cardsfolder/b/bloodscent.txt b/forge-gui/res/cardsfolder/b/bloodscent.txt index 2f68e2bd33a..bf903e4b864 100644 --- a/forge-gui/res/cardsfolder/b/bloodscent.txt +++ b/forge-gui/res/cardsfolder/b/bloodscent.txt @@ -2,6 +2,6 @@ Name:Bloodscent ManaCost:3 G Types:Instant A:SP$ Pump | Cost$ 3 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN All creatures able to block CARDNAME do so. | SpellDescription$ All creatures able to block target creature this turn do so. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodscent.jpg Oracle:All creatures able to block target creature this turn do so. diff --git a/forge-gui/res/cardsfolder/b/bloodshot_cyclops.txt b/forge-gui/res/cardsfolder/b/bloodshot_cyclops.txt index a5126f81fb0..0837af459c8 100644 --- a/forge-gui/res/cardsfolder/b/bloodshot_cyclops.txt +++ b/forge-gui/res/cardsfolder/b/bloodshot_cyclops.txt @@ -4,6 +4,6 @@ Types:Creature Cyclops Giant PT:4/4 A:AB$ DealDamage | Cost$ T Sac<1/Creature> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals damage equal to the sacrificed creature's power to any target. SVar:X:Sacrificed$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodshot_cyclops.jpg Oracle:{T}, Sacrifice a creature: Bloodshot Cyclops deals damage equal to the sacrificed creature's power to any target. diff --git a/forge-gui/res/cardsfolder/b/bloodshot_trainee.txt b/forge-gui/res/cardsfolder/b/bloodshot_trainee.txt index 3f58c3297bf..c551caa1064 100644 --- a/forge-gui/res/cardsfolder/b/bloodshot_trainee.txt +++ b/forge-gui/res/cardsfolder/b/bloodshot_trainee.txt @@ -3,6 +3,6 @@ ManaCost:3 R Types:Creature Goblin Warrior PT:2/3 A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | IsPresent$ Card.powerGE4+Self | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target creature. Activate this ability only if CARDNAME's power is 4 or greater. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodshot_trainee.jpg Oracle:{T}: Bloodshot Trainee deals 4 damage to target creature. Activate this ability only if Bloodshot Trainee's power is 4 or greater. diff --git a/forge-gui/res/cardsfolder/b/bloodstone_cameo.txt b/forge-gui/res/cardsfolder/b/bloodstone_cameo.txt index f5f3707f5a5..84bdd365fbd 100644 --- a/forge-gui/res/cardsfolder/b/bloodstone_cameo.txt +++ b/forge-gui/res/cardsfolder/b/bloodstone_cameo.txt @@ -3,7 +3,7 @@ ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black|Red SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodstone_cameo.jpg Oracle:{T}: Add {B} or {R}. diff --git a/forge-gui/res/cardsfolder/b/bloodthorn_taunter.txt b/forge-gui/res/cardsfolder/b/bloodthorn_taunter.txt index df3be230525..ffc4d4190b9 100644 --- a/forge-gui/res/cardsfolder/b/bloodthorn_taunter.txt +++ b/forge-gui/res/cardsfolder/b/bloodthorn_taunter.txt @@ -4,6 +4,6 @@ Types:Creature Human Scout PT:1/1 K:Haste A:AB$ Pump | Cost$ T | ValidTgts$ Creature.powerGE5 | TgtPrompt$ Select target creature with power 5 or greater | KW$ Haste | SpellDescription$ Target creature with power 5 or greater gains haste until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodthorn_taunter.jpg Oracle:Haste\n{T}: Target creature with power 5 or greater gains haste until end of turn. diff --git a/forge-gui/res/cardsfolder/b/bloom_tender.txt b/forge-gui/res/cardsfolder/b/bloom_tender.txt index 7a7866bafb1..d86c56a4391 100644 --- a/forge-gui/res/cardsfolder/b/bloom_tender.txt +++ b/forge-gui/res/cardsfolder/b/bloom_tender.txt @@ -12,6 +12,6 @@ SVar:CheckU:Count$Valid Permanent.YouCtrl+Blue SVar:CheckB:Count$Valid Permanent.YouCtrl+Black SVar:CheckR:Count$Valid Permanent.YouCtrl+Red SVar:CheckG:Count$Valid Permanent.YouCtrl+Green -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bloom_tender.jpg Oracle:{T}: For each color among permanents you control, add one mana of that color. diff --git a/forge-gui/res/cardsfolder/b/blowfly_infestation.txt b/forge-gui/res/cardsfolder/b/blowfly_infestation.txt index c0248d69cca..61295cc0696 100644 --- a/forge-gui/res/cardsfolder/b/blowfly_infestation.txt +++ b/forge-gui/res/cardsfolder/b/blowfly_infestation.txt @@ -3,6 +3,6 @@ ManaCost:2 B Types:Enchantment T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.counters_GE1_M1M1 | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever a creature dies, if it had a -1/-1 counter on it, put a -1/-1 counter on target creature. SVar:TrigPutCounter:DB$PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ M1M1 | CounterNum$ 1 | IsCurse$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/blowfly_infestation.jpg Oracle:Whenever a creature dies, if it had a -1/-1 counter on it, put a -1/-1 counter on target creature. diff --git a/forge-gui/res/cardsfolder/b/bludgeon_brawl.txt b/forge-gui/res/cardsfolder/b/bludgeon_brawl.txt index 5e9fd09dc09..056bdeaf974 100644 --- a/forge-gui/res/cardsfolder/b/bludgeon_brawl.txt +++ b/forge-gui/res/cardsfolder/b/bludgeon_brawl.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Enchantment S:Mode$ Continuous | Affected$ Artifact.nonCreature+nonEquipment | AddKeyword$ Equip:ConvertedManaCost | AddType$ Equipment | RemoveArtifactTypes$ True | AddStaticAbility$ EquipPump | Description$ Each noncreature, non-Equipment artifact is an Equipment with equip X and "Equipped creature gets +X/+0," where X is that artifact's converted mana cost. SVar:EquipPump:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ ConvertedManaCost | Description$ Equipped creature gets +X/+0, where X is CARDNAME's converted mana cost. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/bludgeon_brawl.jpg Oracle:Each noncreature, non-Equipment artifact is an Equipment with equip {X} and "Equipped creature gets +X/+0," where X is that artifact's converted mana cost. diff --git a/forge-gui/res/cardsfolder/b/blue_elemental_blast.txt b/forge-gui/res/cardsfolder/b/blue_elemental_blast.txt index facd8e9adc3..3eebd67da80 100644 --- a/forge-gui/res/cardsfolder/b/blue_elemental_blast.txt +++ b/forge-gui/res/cardsfolder/b/blue_elemental_blast.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Charm | Cost$ U | Choices$ DBCounter,DBDestroy SVar:DBCounter:DB$ Counter | TargetType$ Spell | ValidTgts$ Card.Red | TgtPrompt$ Select target Red Spell | SpellDescription$ Counter target red spell. SVar:DBDestroy:DB$ Destroy | ValidTgts$ Permanent.Red | TgtPrompt$ Select target red permanent. | SpellDescription$ Destroy target red permanent. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/blue_elemental_blast.jpg Oracle:Choose one —\n• Counter target red spell.\n• Destroy target red permanent. diff --git a/forge-gui/res/cardsfolder/b/blue_mana_battery.txt b/forge-gui/res/cardsfolder/b/blue_mana_battery.txt index 7356528f814..d5a592473f8 100644 --- a/forge-gui/res/cardsfolder/b/blue_mana_battery.txt +++ b/forge-gui/res/cardsfolder/b/blue_mana_battery.txt @@ -6,6 +6,6 @@ A:AB$ Mana | Cost$ T SubCounter | Produced$ U | Amount$ Y | CostDesc$ SVar:Y:Number$1/Plus.ChosenX SVar:X:XChoice #ChosenX SVar created by Cost payment -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/blue_mana_battery.jpg Oracle:{2}, {T}: Put a charge counter on Blue Mana Battery.\n{T}, Remove any number of charge counters from Blue Mana Battery: Add {U}, then add an additional {U} for each charge counter removed this way. diff --git a/forge-gui/res/cardsfolder/b/blue_scarab.txt b/forge-gui/res/cardsfolder/b/blue_scarab.txt index 62c710bcc8b..9d83b2465bb 100644 --- a/forge-gui/res/cardsfolder/b/blue_scarab.txt +++ b/forge-gui/res/cardsfolder/b/blue_scarab.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ W | ValidTgts$ Creature | AILogic$ Pump S:Mode$ CantBlockBy | ValidAttacker$ Creature.EnchantedBy | ValidBlocker$ Creature.Blue | Description$ Enchanted creature can't be blocked by blue creatures. S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 2 | AddToughness$ 2 | IsPresent$ Permanent.Blue+OppCtrl | Description$ Enchanted creature gets +2/+2 as long as an opponent controls a blue permanent. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/blue_scarab.jpg Oracle:Enchant creature\nEnchanted creature can't be blocked by blue creatures.\nEnchanted creature gets +2/+2 as long as an opponent controls a blue permanent. diff --git a/forge-gui/res/cardsfolder/b/blue_ward.txt b/forge-gui/res/cardsfolder/b/blue_ward.txt index 26baa95f3de..aa55b70f80d 100644 --- a/forge-gui/res/cardsfolder/b/blue_ward.txt +++ b/forge-gui/res/cardsfolder/b/blue_ward.txt @@ -4,6 +4,6 @@ Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ W | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Protection:Card.Blue:Protection from blue:Card.CardUID_HostCardUID | Description$ Enchanted creature has protection from blue. This effect doesn't remove CARDNAME. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/blue_ward.jpg Oracle:Enchant creature\nEnchanted creature has protection from blue. This effect doesn't remove Blue Ward. diff --git a/forge-gui/res/cardsfolder/b/bog_elemental.txt b/forge-gui/res/cardsfolder/b/bog_elemental.txt index 8ef71c3016b..478adb5cfb1 100644 --- a/forge-gui/res/cardsfolder/b/bog_elemental.txt +++ b/forge-gui/res/cardsfolder/b/bog_elemental.txt @@ -4,6 +4,6 @@ Types:Creature Elemental PT:5/4 K:Protection from white K:UpkeepCost:Sac<1/Land> -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bog_elemental.jpg Oracle:Protection from white\nAt the beginning of your upkeep, sacrifice Bog Elemental unless you sacrifice a land. diff --git a/forge-gui/res/cardsfolder/b/bog_glider.txt b/forge-gui/res/cardsfolder/b/bog_glider.txt index 4c162306d78..86260a909b2 100644 --- a/forge-gui/res/cardsfolder/b/bog_glider.txt +++ b/forge-gui/res/cardsfolder/b/bog_glider.txt @@ -4,6 +4,6 @@ Types:Creature Human Mercenary PT:1/1 K:Flying A:AB$ ChangeZone | Cost$ T Sac<1/Land> | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Mercenary+cmcLE2 | ChangeNum$ 1 | SpellDescription$ Search your library for a Mercenary permanent card with converted mana cost 2 or less, put it onto the battlefield, then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/bog_glider.jpg Oracle:Flying\n{T}, Sacrifice a land: Search your library for a Mercenary permanent card with converted mana cost 2 or less, put it onto the battlefield, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/b/bog_gnarr.txt b/forge-gui/res/cardsfolder/b/bog_gnarr.txt index 2d3719ae218..0b698818f11 100644 --- a/forge-gui/res/cardsfolder/b/bog_gnarr.txt +++ b/forge-gui/res/cardsfolder/b/bog_gnarr.txt @@ -5,7 +5,7 @@ PT:2/2 T:Mode$ SpellCast | ValidCard$ Card.Black | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a player casts a black spell, CARDNAME gets +2/+2 until end of turn. SVar:TrigPump:DB$Pump | Defined$ Self | NumAtt$ 2 | NumDef$ 2 SVar:BuffedBy:Card.Black -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black DeckHints:Color$Black SVar:Picture:http://www.wizards.com/global/images/magic/general/bog_gnarr.jpg diff --git a/forge-gui/res/cardsfolder/b/bog_initiate.txt b/forge-gui/res/cardsfolder/b/bog_initiate.txt index e58c65c5aad..6fe39e3fada 100644 --- a/forge-gui/res/cardsfolder/b/bog_initiate.txt +++ b/forge-gui/res/cardsfolder/b/bog_initiate.txt @@ -3,6 +3,6 @@ ManaCost:1 B Types:Creature Human Wizard PT:1/1 A:AB$ Mana | Cost$ 1 | Produced$ B | SpellDescription$ Add {B}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bog_initiate.jpg Oracle:{1}: Add {B}. diff --git a/forge-gui/res/cardsfolder/b/bog_witch.txt b/forge-gui/res/cardsfolder/b/bog_witch.txt index 4848b2379c3..5e2f8f067d9 100644 --- a/forge-gui/res/cardsfolder/b/bog_witch.txt +++ b/forge-gui/res/cardsfolder/b/bog_witch.txt @@ -3,6 +3,6 @@ ManaCost:2 B Types:Creature Human Spellshaper PT:1/1 A:AB$ Mana | Cost$ B T Discard<1/Card> | Produced$ B | Amount$ 3 | SpellDescription$ Add {B}{B}{B}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bog_witch.jpg Oracle:{B}, {T}, Discard a card: Add {B}{B}{B}. diff --git a/forge-gui/res/cardsfolder/b/boggart_arsonists.txt b/forge-gui/res/cardsfolder/b/boggart_arsonists.txt index 5b82dcbd521..eafef177e02 100644 --- a/forge-gui/res/cardsfolder/b/boggart_arsonists.txt +++ b/forge-gui/res/cardsfolder/b/boggart_arsonists.txt @@ -4,6 +4,6 @@ Types:Creature Goblin Rogue PT:2/1 K:Plainswalk A:AB$ Destroy | Cost$ 2 R Sac<1/CARDNAME> | ValidTgts$ Scarecrow,Plains | TgtPrompt$ Select target Scarecrow or Plains | SpellDescription$ Destroy target Scarecrow or Plains. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/boggart_arsonists.jpg Oracle:Plainswalk (This creature can't be blocked as long as defending player controls a Plains.)\n{2}{R}, Sacrifice Boggart Arsonists: Destroy target Scarecrow or Plains. diff --git a/forge-gui/res/cardsfolder/b/boggart_birth_rite.txt b/forge-gui/res/cardsfolder/b/boggart_birth_rite.txt index 2b60722b4fc..0f50f067a2e 100644 --- a/forge-gui/res/cardsfolder/b/boggart_birth_rite.txt +++ b/forge-gui/res/cardsfolder/b/boggart_birth_rite.txt @@ -2,6 +2,6 @@ Name:Boggart Birth Rite ManaCost:B Types:Tribal Sorcery Goblin A:SP$ ChangeZone | Cost$ B | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target Goblin card in your graveyard | ValidTgts$ Goblin.YouCtrl | SpellDescription$ Return target Goblin card from your graveyard to your hand. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/boggart_birth_rite.jpg Oracle:Return target Goblin card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/b/boggart_forager.txt b/forge-gui/res/cardsfolder/b/boggart_forager.txt index 49fcbd9cdb9..91bb038d98b 100644 --- a/forge-gui/res/cardsfolder/b/boggart_forager.txt +++ b/forge-gui/res/cardsfolder/b/boggart_forager.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Creature Goblin Rogue PT:1/1 A:AB$ Shuffle | Cost$ R Sac<1/CARDNAME> | ValidTgts$ Player | TgtPrompt$ Select target player | SpellDescription$ Target player shuffles their library. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/boggart_forager.jpg Oracle:{R}, Sacrifice Boggart Forager: Target player shuffles their library. diff --git a/forge-gui/res/cardsfolder/b/boggart_harbinger.txt b/forge-gui/res/cardsfolder/b/boggart_harbinger.txt index 99b451dc427..47503d19f4e 100644 --- a/forge-gui/res/cardsfolder/b/boggart_harbinger.txt +++ b/forge-gui/res/cardsfolder/b/boggart_harbinger.txt @@ -4,6 +4,6 @@ Types:Creature Goblin Shaman PT:2/1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for a Goblin card, reveal it, then shuffle your library and put that card on top of it. SVar:TrigChange:DB$ ChangeZone | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Card.Goblin | ChangeNum$ 1 | ShuffleNonMandatory$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/boggart_harbinger.jpg Oracle:When Boggart Harbinger enters the battlefield, you may search your library for a Goblin card, reveal it, then shuffle your library and put that card on top of it. diff --git a/forge-gui/res/cardsfolder/b/boggart_mob.txt b/forge-gui/res/cardsfolder/b/boggart_mob.txt index 3410d10c32b..cdfc7bd0058 100644 --- a/forge-gui/res/cardsfolder/b/boggart_mob.txt +++ b/forge-gui/res/cardsfolder/b/boggart_mob.txt @@ -5,6 +5,6 @@ PT:5/5 K:Champion:Goblin T:Mode$ DamageDone | ValidSource$ Goblin.YouCtrl | TriggerZones$ Battlefield | ValidTarget$ Player | CombatDamage$ True | OptionalDecider$ You | Execute$ TrigToken | TriggerDescription$ Whenever a Goblin you control deals combat damage to a player, you may create a 1/1 black Goblin Rogue creature token. SVar:TrigToken:DB$Token | TokenAmount$ 1 | TokenName$ Goblin Rogue | TokenTypes$ Creature,Goblin,Rogue | TokenOwner$ You | TokenColors$ Black | TokenPower$ 1 | TokenToughness$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/boggart_mob.jpg Oracle:Champion a Goblin (When this enters the battlefield, sacrifice it unless you exile another Goblin you control. When this leaves the battlefield, that card returns to the battlefield.)\nWhenever a Goblin you control deals combat damage to a player, you may create a 1/1 black Goblin Rogue creature token. diff --git a/forge-gui/res/cardsfolder/b/boggart_shenanigans.txt b/forge-gui/res/cardsfolder/b/boggart_shenanigans.txt index 76ff7e2f576..b21c378f9dc 100644 --- a/forge-gui/res/cardsfolder/b/boggart_shenanigans.txt +++ b/forge-gui/res/cardsfolder/b/boggart_shenanigans.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Tribal Enchantment Goblin T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Goblin.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDamage | OptionalDecider$ You | TriggerDescription$ Whenever another Goblin you control is put into a graveyard from the battlefield, you may have CARDNAME deal 1 damage to target player or planeswalker. SVar:TrigDamage:DB$DealDamage | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker| NumDmg$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/boggart_shenanigans.jpg Oracle:Whenever another Goblin you control is put into a graveyard from the battlefield, you may have Boggart Shenanigans deal 1 damage to target player or planeswalker. diff --git a/forge-gui/res/cardsfolder/b/boil.txt b/forge-gui/res/cardsfolder/b/boil.txt index d58baf3598f..d412e09c510 100644 --- a/forge-gui/res/cardsfolder/b/boil.txt +++ b/forge-gui/res/cardsfolder/b/boil.txt @@ -2,6 +2,6 @@ Name:Boil ManaCost:3 R Types:Instant A:SP$ DestroyAll | Cost$ 3 R | ValidCards$ Island | SpellDescription$ Destroy all Islands. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://resources.wizards.com/magic/cards/7e/en-us/card25675.jpg Oracle:Destroy all Islands. diff --git a/forge-gui/res/cardsfolder/b/boiling_blood.txt b/forge-gui/res/cardsfolder/b/boiling_blood.txt index 48db8d3a77e..1f7ae2d6122 100644 --- a/forge-gui/res/cardsfolder/b/boiling_blood.txt +++ b/forge-gui/res/cardsfolder/b/boiling_blood.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Instant A:SP$ Pump | Cost$ 2 R | ValidTgts$ Creature | KW$ HIDDEN CARDNAME attacks each combat if able. | TgtPrompt$ Select target creature | SpellDescription$ Target creature attacks this turn if able. | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/boiling_blood.jpg Oracle:Target creature attacks this turn if able.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/b/boiling_seas.txt b/forge-gui/res/cardsfolder/b/boiling_seas.txt index 3c8f8ac4e8b..49a75195db6 100644 --- a/forge-gui/res/cardsfolder/b/boiling_seas.txt +++ b/forge-gui/res/cardsfolder/b/boiling_seas.txt @@ -2,6 +2,6 @@ Name:Boiling Seas ManaCost:3 R Types:Sorcery A:SP$ DestroyAll | Cost$ 3 R | ValidCards$ Island | SpellDescription$ Destroy all Islands. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/boiling_seas.jpg Oracle:Destroy all Islands. diff --git a/forge-gui/res/cardsfolder/b/bola_warrior.txt b/forge-gui/res/cardsfolder/b/bola_warrior.txt index c553b36c5bf..9278f7e1def 100644 --- a/forge-gui/res/cardsfolder/b/bola_warrior.txt +++ b/forge-gui/res/cardsfolder/b/bola_warrior.txt @@ -3,6 +3,6 @@ ManaCost:1 R Types:Creature Human Spellshaper Warrior PT:1/1 A:AB$ Pump | Cost$ R T Discard<1/Card> | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME can't block. | IsCurse$ True | SpellDescription$ Target creature can't block this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bola_warrior.jpg Oracle:{R}, {T}, Discard a card: Target creature can't block this turn. diff --git a/forge-gui/res/cardsfolder/b/bomat_courier.txt b/forge-gui/res/cardsfolder/b/bomat_courier.txt index a5e3a323eaf..682d8f7ae66 100644 --- a/forge-gui/res/cardsfolder/b/bomat_courier.txt +++ b/forge-gui/res/cardsfolder/b/bomat_courier.txt @@ -11,6 +11,6 @@ SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True DeckNeeds:Color$Red -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/bomat_courier.jpg Oracle:Haste\nWhenever Bomat Courier attacks, exile the top card of your library face down. (You can't look at it.)\n{R}, Discard your hand, Sacrifice Bomat Courier: Put all cards exiled with Bomat Courier into their owners' hands. diff --git a/forge-gui/res/cardsfolder/b/bond_of_agony.txt b/forge-gui/res/cardsfolder/b/bond_of_agony.txt index 1d3d1b05988..f8bad23a8e5 100644 --- a/forge-gui/res/cardsfolder/b/bond_of_agony.txt +++ b/forge-gui/res/cardsfolder/b/bond_of_agony.txt @@ -3,6 +3,6 @@ ManaCost:X B Types:Sorcery A:SP$ LoseLife | Cost$ X B PayLife | Defined$ Player.Other | LifeAmount$ X | References$ X | SpellDescription$ Each other player loses X life. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bond_of_agony.jpg Oracle:As an additional cost to cast this spell, pay X life.\nEach other player loses X life. diff --git a/forge-gui/res/cardsfolder/b/bonds_of_mortality.txt b/forge-gui/res/cardsfolder/b/bonds_of_mortality.txt index 90477f17647..8ef875270d7 100644 --- a/forge-gui/res/cardsfolder/b/bonds_of_mortality.txt +++ b/forge-gui/res/cardsfolder/b/bonds_of_mortality.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 SVar:STLoseAB:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.OppCtrl | RemoveKeyword$ Hexproof & Indestructible | Description$ Creatures your opponents control lose hexproof and indestructible until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bonds_of_mortality.jpg Oracle:When Bonds of Mortality enters the battlefield, draw a card.\n{G}: Creatures your opponents control lose hexproof and indestructible until end of turn. diff --git a/forge-gui/res/cardsfolder/b/bone_flute.txt b/forge-gui/res/cardsfolder/b/bone_flute.txt index f3fd04a593a..ac9b770cb79 100644 --- a/forge-gui/res/cardsfolder/b/bone_flute.txt +++ b/forge-gui/res/cardsfolder/b/bone_flute.txt @@ -2,6 +2,6 @@ Name:Bone Flute ManaCost:3 Types:Artifact A:AB$ PumpAll | Cost$ 2 T | ValidCards$ Creature | NumAtt$ -1 | SpellDescription$ All creatures get -1/-0 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bone_flute.jpg Oracle:{2}, {T}: All creatures get -1/-0 until end of turn. diff --git a/forge-gui/res/cardsfolder/b/bone_shaman.txt b/forge-gui/res/cardsfolder/b/bone_shaman.txt index 1e160729c45..e8fa4b50ef6 100644 --- a/forge-gui/res/cardsfolder/b/bone_shaman.txt +++ b/forge-gui/res/cardsfolder/b/bone_shaman.txt @@ -4,6 +4,6 @@ Types:Creature Giant Shaman PT:3/3 A:AB$ Animate | Cost$ B | Defined$ Self | staticAbilities$ BoneShamanStatic | StackDescription$ CARDNAME gains "Creatures dealt damage by CARDNAME this turn can't be regenerated this turn." | SpellDescription$ Until end of turn, CARDNAME gains "Creatures dealt damage by CARDNAME this turn can't be regenerated this turn." SVar:BoneShamanStatic:Mode$ Continuous | Affected$ Creature.DamagedBy | AddHiddenKeyword$ CARDNAME can't be regenerated. | Description$ Creatures dealt damage by CARDNAME this turn can't be regenerated this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bone_shaman.jpg Oracle:{B}: Until end of turn, Bone Shaman gains "Creatures dealt damage by Bone Shaman this turn can't be regenerated this turn." diff --git a/forge-gui/res/cardsfolder/b/bone_splinters.txt b/forge-gui/res/cardsfolder/b/bone_splinters.txt index 50a4c06b097..bc81b5a5ce1 100644 --- a/forge-gui/res/cardsfolder/b/bone_splinters.txt +++ b/forge-gui/res/cardsfolder/b/bone_splinters.txt @@ -2,6 +2,6 @@ Name:Bone Splinters ManaCost:B Types:Sorcery A:SP$ Destroy | Cost$ B Sac<1/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Destroy target creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bone_splinters.jpg Oracle:As an additional cost to cast this spell, sacrifice a creature.\nDestroy target creature. diff --git a/forge-gui/res/cardsfolder/b/bonus_round.txt b/forge-gui/res/cardsfolder/b/bonus_round.txt index 72f8e8d2a40..0cce52c3efd 100644 --- a/forge-gui/res/cardsfolder/b/bonus_round.txt +++ b/forge-gui/res/cardsfolder/b/bonus_round.txt @@ -5,6 +5,6 @@ A:SP$ Effect | Cost$ 1 R R | Name$ Bonus Round Effect | Triggers$ TrigSpellCast SVar:TrigSpellCast:Mode$ SpellCast | ValidCard$ Instant,Sorcery | TriggerZones$ Command | ValidActivatingPlayer$ Player | Execute$ TrigCopySpell | TriggerDescription$ Until end of turn, whenever a player casts an instant or sorcery spell, that player copies it and may choose new targets for the copy. SVar:TrigCopySpell:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | AILogic$ Always | Controller$ TriggeredCardController DeckNeeds:Type$Instant|Sorcery -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:PlayMain1:TRUE Oracle:Until end of turn, whenever a player casts an instant or sorcery spell, that player copies it and may choose new targets for the copy. diff --git a/forge-gui/res/cardsfolder/b/booby_trap.txt b/forge-gui/res/cardsfolder/b/booby_trap.txt index 0b764843f96..bc906e42237 100644 --- a/forge-gui/res/cardsfolder/b/booby_trap.txt +++ b/forge-gui/res/cardsfolder/b/booby_trap.txt @@ -12,6 +12,6 @@ T:Mode$ Drawn | ValidCard$ Card.NamedCard+OwnedBy Player.Chosen | TriggerZones$ SVar:TrapTriggered:DB$ SacrificeAll | ValidCards$ Card.Self | RememberSacrificed$ True | SubAbility$ Explosion SVar:Explosion:DB$ DealDamage | NumDmg$ 10 | Defined$ Player.Chosen | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | SubAbility$ DBCleanup | References$ X SVar:X:Remembered$Amount -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/booby_trap.jpg Oracle:As Booby Trap enters the battlefield, choose an opponent and a card name other than a basic land card name.\nThe chosen player reveals each card they draw.\nWhen the chosen player draws a card with the chosen name, sacrifice Booby Trap. If you do, Booby Trap deals 10 damage to that player. diff --git a/forge-gui/res/cardsfolder/b/boonweaver_giant.txt b/forge-gui/res/cardsfolder/b/boonweaver_giant.txt index eef6ba05591..b3269ca0e65 100644 --- a/forge-gui/res/cardsfolder/b/boonweaver_giant.txt +++ b/forge-gui/res/cardsfolder/b/boonweaver_giant.txt @@ -4,7 +4,7 @@ Types:Creature Giant Monk PT:4/4 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your graveyard, hand, and/or library for an Aura card and put it onto the battlefield attached to Boonweaver Giant. If you search your library this way, shuffle it. SVar:TrigSearch:DB$ ChangeZone | Hidden$ True | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard,Hand | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Battlefield | ChangeType$ Aura | AttachedTo$ Self | ShuffleNonMandatory$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Aura SVar:Picture:http://www.wizards.com/global/images/magic/general/boonweaver_giant.jpg Oracle:When Boonweaver Giant enters the battlefield, you may search your graveyard, hand, and/or library for an Aura card and put it onto the battlefield attached to Boonweaver Giant. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/b/borderland_behemoth.txt b/forge-gui/res/cardsfolder/b/borderland_behemoth.txt index 589f6a33a66..93f4da6b8c2 100644 --- a/forge-gui/res/cardsfolder/b/borderland_behemoth.txt +++ b/forge-gui/res/cardsfolder/b/borderland_behemoth.txt @@ -5,7 +5,7 @@ PT:4/4 K:Trample S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | AddToughness$ X | Description$ CARDNAME gets +4/+4 for each other Giant you control. SVar:X:Count$Valid Giant.Other+YouCtrl/Times.4 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:BuffedBy:Giant SVar:Picture:http://www.wizards.com/global/images/magic/general/borderland_behemoth.jpg Oracle:Trample\nBorderland Behemoth gets +4/+4 for each other Giant you control. diff --git a/forge-gui/res/cardsfolder/b/boreal_griffin.txt b/forge-gui/res/cardsfolder/b/boreal_griffin.txt index 8a932ada99c..3b82ce51238 100644 --- a/forge-gui/res/cardsfolder/b/boreal_griffin.txt +++ b/forge-gui/res/cardsfolder/b/boreal_griffin.txt @@ -5,6 +5,6 @@ PT:3/2 K:Flying A:AB$ Pump | Cost$ S | KW$ First Strike | Defined$ Self | SpellDescription$ CARDNAME gains first strike until end of turn. # AI can now use snow mana to pay for activated abilities. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/boreal_griffin.jpg Oracle:Flying\n{S}: Boreal Griffin gains first strike until end of turn. ({S} can be paid with one mana from a snow permanent.) diff --git a/forge-gui/res/cardsfolder/b/boros_battleshaper.txt b/forge-gui/res/cardsfolder/b/boros_battleshaper.txt index ec08c6b4e25..11649720c11 100644 --- a/forge-gui/res/cardsfolder/b/boros_battleshaper.txt +++ b/forge-gui/res/cardsfolder/b/boros_battleshaper.txt @@ -5,6 +5,6 @@ PT:5/5 T:Mode$ Phase | Phase$ BeginCombat | TriggerZones$ Battlefield | Execute$ TrigMustAttackBlock | TriggerDescription$ At the beginning of each combat, up to one target creature attacks or blocks this combat if able and up to one target creature can't attack or block this combat. SVar:TrigMustAttackBlock:DB$ Pump | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Choose target creature to attack or block if able | KW$ HIDDEN CARDNAME attacks each combat if able. & HIDDEN CARDNAME blocks each combat if able. | IsCurse$ True | UntilEndOfCombat$ True | SubAbility$ DBCantAttackBlock SVar:DBCantAttackBlock:DB$ Pump | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Choose target creature that cannot attack or block this combat | KW$ HIDDEN CARDNAME can't attack or block. | IsCurse$ True | UntilEndOfCombat$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/boros_battleshaper.jpg Oracle:At the beginning of each combat, up to one target creature attacks or blocks this combat if able and up to one target creature can't attack or block this combat. diff --git a/forge-gui/res/cardsfolder/b/boros_cluestone.txt b/forge-gui/res/cardsfolder/b/boros_cluestone.txt index 017afde860c..d200875099b 100644 --- a/forge-gui/res/cardsfolder/b/boros_cluestone.txt +++ b/forge-gui/res/cardsfolder/b/boros_cluestone.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. A:AB$ Draw | Cost$ R W T Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Red|White SVar:Picture:http://www.wizards.com/global/images/magic/general/boros_cluestone.jpg Oracle:{T}: Add {R} or {W}.\n{R}{W}, {T}, Sacrifice Boros Cluestone: Draw a card. diff --git a/forge-gui/res/cardsfolder/b/boros_fury_shield.txt b/forge-gui/res/cardsfolder/b/boros_fury_shield.txt index 0194e9bc37e..6d43a1a38e3 100644 --- a/forge-gui/res/cardsfolder/b/boros_fury_shield.txt +++ b/forge-gui/res/cardsfolder/b/boros_fury_shield.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Pump | Cost$ 2 W | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | IsCurse$ True | SubAbility$ DBDamage | KW$ Prevent all combat damage that would be dealt by CARDNAME. | SpellDescription$ Prevent all combat damage that would be dealt by target attacking or blocking creature this turn. If {R} was spent to cast CARDNAME, it deals damage to that creature's controller equal to the creature's power. SVar:DBDamage:DB$ DealDamage | Defined$ TargetedController | NumDmg$ X | ConditionManaSpent$ R | References$ X SVar:X:Targeted$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/boros_fury_shield.jpg Oracle:Prevent all combat damage that would be dealt by target attacking or blocking creature this turn. If {R} was spent to cast Boros Fury-Shield, it deals damage to that creature's controller equal to the creature's power. diff --git a/forge-gui/res/cardsfolder/b/boros_keyrune.txt b/forge-gui/res/cardsfolder/b/boros_keyrune.txt index 85d5efe76c4..e76c342d5a9 100644 --- a/forge-gui/res/cardsfolder/b/boros_keyrune.txt +++ b/forge-gui/res/cardsfolder/b/boros_keyrune.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. A:AB$ Animate | Cost$ R W | Defined$ Self | Power$ 1| Toughness$ 1 | Types$ Artifact,Creature,Soldier | Colors$ Red,White | Keywords$ Double Strike | SpellDescription$ CARDNAME becomes a 1/1 red and white Soldier artifact creature with double strike until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Red|White SVar:Picture:http://www.wizards.com/global/images/magic/general/boros_keyrune.jpg Oracle:{T}: Add {R} or {W}.\n{R}{W}: Boros Keyrune becomes a 1/1 red and white Soldier artifact creature with double strike until end of turn. (It deals both first-strike and regular combat damage.) diff --git a/forge-gui/res/cardsfolder/b/boros_locket.txt b/forge-gui/res/cardsfolder/b/boros_locket.txt index 1ad69592f48..9f735447d6f 100644 --- a/forge-gui/res/cardsfolder/b/boros_locket.txt +++ b/forge-gui/res/cardsfolder/b/boros_locket.txt @@ -3,7 +3,7 @@ ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$White | White A:AB$ Draw | Cost$ RW RW RW RW T Sac<1/CARDNAME> | NumCards$ 2 | SpellDescription$ Draw two cards. Oracle:{T}: Add {R} or {W}.\n{R/W}{R/W}{R/W}{R/W}, {T}, Sacrifice Boros Locket: Draw two cards. diff --git a/forge-gui/res/cardsfolder/b/boros_signet.txt b/forge-gui/res/cardsfolder/b/boros_signet.txt index 01b056ef7c1..d3fbe81b47c 100644 --- a/forge-gui/res/cardsfolder/b/boros_signet.txt +++ b/forge-gui/res/cardsfolder/b/boros_signet.txt @@ -2,6 +2,6 @@ Name:Boros Signet ManaCost:2 Types:Artifact A:AB$ Mana | Cost$ 1 T | Produced$ R W | SpellDescription$ Add {R}{W}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/boros_signet.jpg Oracle:{1}, {T}: Add {R}{W}. diff --git a/forge-gui/res/cardsfolder/b/borrowing_the_east_wind.txt b/forge-gui/res/cardsfolder/b/borrowing_the_east_wind.txt index ab4a613082a..972b6e3fb5a 100644 --- a/forge-gui/res/cardsfolder/b/borrowing_the_east_wind.txt +++ b/forge-gui/res/cardsfolder/b/borrowing_the_east_wind.txt @@ -3,6 +3,6 @@ ManaCost:X G G Types:Sorcery A:SP$ DamageAll | Cost$ X G G | ValidCards$ Creature.withHorsemanship | ValidPlayers$ Player | NumDmg$ X | ValidDescription$ each creature with horsemanship and each player. | References$ X | SpellDescription$ CARDNAME deals X damage to each creature with horsemanship and each player. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal_Three_Kingdoms/borrowing_the_east_wind.jpg Oracle:Borrowing the East Wind deals X damage to each creature with horsemanship and each player. diff --git a/forge-gui/res/cardsfolder/b/bosh_iron_golem.txt b/forge-gui/res/cardsfolder/b/bosh_iron_golem.txt index 04558ebdf0c..23caf195f5a 100644 --- a/forge-gui/res/cardsfolder/b/bosh_iron_golem.txt +++ b/forge-gui/res/cardsfolder/b/bosh_iron_golem.txt @@ -6,6 +6,6 @@ K:Trample A:AB$ DealDamage | Cost$ 3 R Sac<1/Artifact> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals damage equal to the sacrificed artifact's converted mana cost to any target. SVar:X:Sacrificed$CardManaCost DeckNeeds:Color$Red -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bosh_iron_golem.jpg Oracle:Trample\n{3}{R}, Sacrifice an artifact: Bosh, Iron Golem deals damage equal to the sacrificed artifact's converted mana cost to any target. diff --git a/forge-gui/res/cardsfolder/b/bosh_iron_golem_avatar.txt b/forge-gui/res/cardsfolder/b/bosh_iron_golem_avatar.txt index bd0307fe5dc..7d38377835f 100644 --- a/forge-gui/res/cardsfolder/b/bosh_iron_golem_avatar.txt +++ b/forge-gui/res/cardsfolder/b/bosh_iron_golem_avatar.txt @@ -5,5 +5,5 @@ HandLifeModifier:+0/-2 A:AB$ DealDamage | ActivationZone$ Command | Announce$ X | Cost$ X Sac<1/Artifact.cmcEQX/artifact with converted mana cost X> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals X damage to any target. SVar:X:Count$xPaid SVar:Picture:https://downloads.cardforge.org/images/cards/VAN/Bosh, Iron Golem Avatar.full.jpg -SVar:RemAIDeck:True +AI:RemoveDeck:All Oracle:Hand +0, life -2\n{X}, Sacrifice an artifact with converted mana cost X: Bosh, Iron Golem Avatar deals X damage to any target. diff --git a/forge-gui/res/cardsfolder/b/bosium_strip.txt b/forge-gui/res/cardsfolder/b/bosium_strip.txt index fc07fa5c43e..273c62dd72d 100644 --- a/forge-gui/res/cardsfolder/b/bosium_strip.txt +++ b/forge-gui/res/cardsfolder/b/bosium_strip.txt @@ -6,6 +6,6 @@ SVar:STBosiumStrip:Mode$ Continuous | Affected$ Card.TopGraveyard+Instant+YouCtr SVar:REBosiumStrip:Event$ Moved | ValidCard$ Card.CastSa Spell.MayPlaySource | Origin$ Stack | Destination$ Graveyard | ReplaceWith$ MoveExile SVar:MoveExile:DB$ ChangeZone | Defined$ ReplacedCard | Origin$ Stack | Destination$ Exile SVar:NeedsOrderedGraveyard:TRUE -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bosium_strip.jpg Oracle:{3}, {T}: Until end of turn, if the top card of your graveyard is an instant or sorcery card, you may cast that card. If a card cast this way would be put into a graveyard this turn, exile it instead. diff --git a/forge-gui/res/cardsfolder/b/bottomless_pit.txt b/forge-gui/res/cardsfolder/b/bottomless_pit.txt index 835933286c3..aa2be38c9be 100644 --- a/forge-gui/res/cardsfolder/b/bottomless_pit.txt +++ b/forge-gui/res/cardsfolder/b/bottomless_pit.txt @@ -3,6 +3,6 @@ ManaCost:1 B B Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ At the beginning of each player's upkeep, that player discards a card at random. SVar:TrigDiscard:DB$ Discard | Defined$ TriggeredPlayer | NumCards$ 1 | Mode$ Random -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/bottomless_pit.jpg Oracle:At the beginning of each player's upkeep, that player discards a card at random. diff --git a/forge-gui/res/cardsfolder/b/bottomless_vault.txt b/forge-gui/res/cardsfolder/b/bottomless_vault.txt index e17f0e3c158..79bbc6cadd8 100644 --- a/forge-gui/res/cardsfolder/b/bottomless_vault.txt +++ b/forge-gui/res/cardsfolder/b/bottomless_vault.txt @@ -8,6 +8,6 @@ SVar:TrigStore:DB$PutCounter | Defined$ Self | CounterType$ STORAGE | CounterNum A:AB$ Mana | Cost$ T SubCounter | Produced$ B | Amount$ ChosenX | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | References$ X | SpellDescription$ Add {B} for each storage counter removed this way. SVar:X:XChoice #ChosenX SVar created by Cost payment -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bottomless_vault.jpg Oracle:Bottomless Vault enters the battlefield tapped.\nYou may choose not to untap Bottomless Vault during your untap step.\nAt the beginning of your upkeep, if Bottomless Vault is tapped, put a storage counter on it.\n{T}, Remove any number of storage counters from Bottomless Vault: Add {B} for each storage counter removed this way. diff --git a/forge-gui/res/cardsfolder/b/bounty_of_the_hunt.txt b/forge-gui/res/cardsfolder/b/bounty_of_the_hunt.txt index 36b18385954..71845fb630c 100644 --- a/forge-gui/res/cardsfolder/b/bounty_of_the_hunt.txt +++ b/forge-gui/res/cardsfolder/b/bounty_of_the_hunt.txt @@ -7,6 +7,6 @@ SVar:DelayedRemoveCounters:DB$ DelayedTrigger | Mode$ Phase | Phase$ Cleanup | E SVar:TrigRemoveCounter:DB$ RemoveCounter | Defined$ Remembered | CounterType$ P1P1 | CounterNum$ Remembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True DeckHas:Ability$Counters -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bounty_of_the_hunt.jpg Oracle:You may exile a green card from your hand rather than pay this spell's mana cost.\nDistribute three +1/+1 counters among one, two, or three target creatures. For each +1/+1 counter you put on a creature this way, remove a +1/+1 counter from that creature at the beginning of the next cleanup step. diff --git a/forge-gui/res/cardsfolder/b/brace_for_impact.txt b/forge-gui/res/cardsfolder/b/brace_for_impact.txt index 0c6a0fe6a7c..0db301ea478 100644 --- a/forge-gui/res/cardsfolder/b/brace_for_impact.txt +++ b/forge-gui/res/cardsfolder/b/brace_for_impact.txt @@ -7,6 +7,6 @@ SVar:ImpactCounters:DB$ PutCounter | Defined$ ReplacedTarget | CounterType$ P1P1 SVar:X:ReplaceCount$DamageAmount SVar:EndTrackingEffect:Mode$ ChangesZone | ValidCard$ Card.IsRemembered | Origin$ Battlefield | Destination$ Any | Execute$ ExileEffect | Static$ True SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/brace_for_impact.jpg Oracle:Prevent all damage that would be dealt to target multicolored creature this turn. For each 1 damage prevented this way, put a +1/+1 counter on that creature. diff --git a/forge-gui/res/cardsfolder/b/braid_of_fire.txt b/forge-gui/res/cardsfolder/b/braid_of_fire.txt index d855cf605cf..8028b079ba9 100644 --- a/forge-gui/res/cardsfolder/b/braid_of_fire.txt +++ b/forge-gui/res/cardsfolder/b/braid_of_fire.txt @@ -3,6 +3,6 @@ ManaCost:1 R Types:Enchantment K:Cumulative upkeep:AddMana<1/R>:Add {R}. # The AI will use the upkeep mana for instants and stuff when able -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/braid_of_fire.jpg Oracle:Cumulative upkeep—Add {R}. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) diff --git a/forge-gui/res/cardsfolder/b/braids_cabal_minion.txt b/forge-gui/res/cardsfolder/b/braids_cabal_minion.txt index 1e14e25a488..87ba05accf6 100644 --- a/forge-gui/res/cardsfolder/b/braids_cabal_minion.txt +++ b/forge-gui/res/cardsfolder/b/braids_cabal_minion.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Human Minion PT:2/2 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ At the beginning of each player's upkeep, that player sacrifices an artifact, creature or land. SVar:TrigSac:DB$ Sacrifice | SacValid$ Creature,Artifact,Land | Defined$ TriggeredPlayer | SpellDescription$ Sacrifice an artifact, creature or land. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/braids_cabal_minion.jpg Oracle:At the beginning of each player's upkeep, that player sacrifices an artifact, creature, or land. diff --git a/forge-gui/res/cardsfolder/b/braids_conjurer_adept.txt b/forge-gui/res/cardsfolder/b/braids_conjurer_adept.txt index 237b54436cb..25927026d7b 100644 --- a/forge-gui/res/cardsfolder/b/braids_conjurer_adept.txt +++ b/forge-gui/res/cardsfolder/b/braids_conjurer_adept.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Human Wizard PT:2/2 T:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | Execute$ TrigChangeZone | TriggerDescription$ At the beginning of each player's upkeep, that player may put an artifact, creature, or land card from their hand onto the battlefield. SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature,Artifact,Land | DefinedPlayer$ TriggeredPlayer | ChangeNum$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/braids_conjurer_adept.jpg Oracle:At the beginning of each player's upkeep, that player may put an artifact, creature, or land card from their hand onto the battlefield. diff --git a/forge-gui/res/cardsfolder/b/brain_pry.txt b/forge-gui/res/cardsfolder/b/brain_pry.txt index 1844e00cbf9..0098c7e907d 100644 --- a/forge-gui/res/cardsfolder/b/brain_pry.txt +++ b/forge-gui/res/cardsfolder/b/brain_pry.txt @@ -6,6 +6,6 @@ SVar:RevealHand:DB$RevealHand | RememberRevealed$ True | ValidTgts$ Player | Tgt SVar:DBDiscard:DB$Discard | Defined$ Targeted | NumCards$ 1 | Mode$ TgtChoose | DiscardValid$ Card.NamedCard | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card.NamedCard | ConditionCompare$ EQ0 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/brain_pry.jpg Oracle:Choose a nonland card name. Target player reveals their hand. That player discards a card with that name. If they can't, you draw a card. diff --git a/forge-gui/res/cardsfolder/b/brain_weevil.txt b/forge-gui/res/cardsfolder/b/brain_weevil.txt index 652dfef61f6..c160702c8bf 100644 --- a/forge-gui/res/cardsfolder/b/brain_weevil.txt +++ b/forge-gui/res/cardsfolder/b/brain_weevil.txt @@ -4,6 +4,6 @@ Types:Creature Insect PT:1/1 K:Intimidate A:AB$ Discard | Cost$ Sac<1/CARDNAME> | ValidTgts$ Player | TgtPrompt$ Select target player | SorcerySpeed$ True | NumCards$ 2 | Mode$ TgtChoose | SpellDescription$ Target player discards two cards. Activate this ability only any time you could cast a sorcery. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/brain_weevil.jpg Oracle:Intimidate (This creature can't be blocked except by artifact creatures and/or creatures that share a color with it.)\nSacrifice Brain Weevil: Target player discards two cards. Activate this ability only any time you could cast a sorcery. diff --git a/forge-gui/res/cardsfolder/b/bramblesnap.txt b/forge-gui/res/cardsfolder/b/bramblesnap.txt index b0f32c9b71e..de0bc92bb2b 100644 --- a/forge-gui/res/cardsfolder/b/bramblesnap.txt +++ b/forge-gui/res/cardsfolder/b/bramblesnap.txt @@ -4,6 +4,6 @@ Types:Creature Elemental PT:1/1 K:Trample A:AB$ Pump | Cost$ tapXType<1/Creature> | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/bramblesnap.jpg Oracle:Trample\nTap an untapped creature you control: Bramblesnap gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/b/brand.txt b/forge-gui/res/cardsfolder/b/brand.txt index 4bdf4f16e61..323430fe668 100644 --- a/forge-gui/res/cardsfolder/b/brand.txt +++ b/forge-gui/res/cardsfolder/b/brand.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Instant A:SP$ GainControl | Cost$ R | AllValid$ Permanent.YouOwn | SpellDescription$ Gain control of all permanents you own. (This effect lasts indefinitely.) K:Cycling:2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/brand.jpg Oracle:Gain control of all permanents you own. (This effect lasts indefinitely.)\nCycling {2} ({2}, Discard this card: Draw a card.) diff --git a/forge-gui/res/cardsfolder/b/brand_of_ill_omen.txt b/forge-gui/res/cardsfolder/b/brand_of_ill_omen.txt index 072040ae361..ecacc7fc19e 100644 --- a/forge-gui/res/cardsfolder/b/brand_of_ill_omen.txt +++ b/forge-gui/res/cardsfolder/b/brand_of_ill_omen.txt @@ -4,6 +4,6 @@ Types:Enchantment Aura K:Cumulative upkeep:R A:SP$ Attach | Cost$ 3 R | ValidTgts$ Creature | AILogic$ Curse S:Mode$ CantBeCast | ValidCard$ Creature | Caster$ EnchantedController | Description$ Enchanted creature's controller can't cast creature spells. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/brand_of_ill_omen.jpg Oracle:Enchant creature\nCumulative upkeep {R} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nEnchanted creature's controller can't cast creature spells. diff --git a/forge-gui/res/cardsfolder/b/brass_squire.txt b/forge-gui/res/cardsfolder/b/brass_squire.txt index d9974b65d54..92d72cf79fb 100644 --- a/forge-gui/res/cardsfolder/b/brass_squire.txt +++ b/forge-gui/res/cardsfolder/b/brass_squire.txt @@ -4,6 +4,6 @@ Types:Artifact Creature Myr PT:1/3 A:AB$ Pump | Cost$ T | ValidTgts$ Equipment.YouCtrl | TgtPrompt$ Select target equipment you control | SubAbility$ BrassSquireAttach | StackDescription$ None | SpellDescription$ Attach target Equipment you control to target creature you control. SVar:BrassSquireAttach:DB$ Attach | Object$ ParentTarget | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/brass_squire.jpg Oracle:{T}: Attach target Equipment you control to target creature you control. diff --git a/forge-gui/res/cardsfolder/b/brass_talon_chimera.txt b/forge-gui/res/cardsfolder/b/brass_talon_chimera.txt index b1e646df1cb..6348975aef7 100644 --- a/forge-gui/res/cardsfolder/b/brass_talon_chimera.txt +++ b/forge-gui/res/cardsfolder/b/brass_talon_chimera.txt @@ -5,6 +5,6 @@ PT:2/2 K:First Strike A:AB$ PutCounter | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.Chimera | TgtPrompt$ Select target Chimera creature | CounterType$ P2P2 | CounterNum$ 1 | SubAbility$ DBPump | SpellDescription$ Put a +2/+2 counter on target Chimera creature. It gains first strike. (This effect lasts indefinitely.) SVar:DBPump:DB$Pump | KW$ First Strike | Defined$ Targeted | Permanent$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/brass_talon_chimera.jpg Oracle:First strike\nSacrifice Brass-Talon Chimera: Put a +2/+2 counter on target Chimera creature. It gains first strike. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/b/brave_the_elements.txt b/forge-gui/res/cardsfolder/b/brave_the_elements.txt index d5ac11d4e39..3dc5f24566c 100644 --- a/forge-gui/res/cardsfolder/b/brave_the_elements.txt +++ b/forge-gui/res/cardsfolder/b/brave_the_elements.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ ChooseColor | Cost$ W | Defined$ You | AILogic$ MostProminentAttackers | SubAbility$ DBProtection | SpellDescription$ Choose a color. White creatures you control gain protection from the chosen color until end of turn. SVar:DBProtection:DB$ ProtectionAll | ValidCards$ Creature.White+YouCtrl | Gains$ ChosenColor SVar:PlayMain1:TRUE -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/brave_the_elements.jpg Oracle:Choose a color. White creatures you control gain protection from the chosen color until end of turn. diff --git a/forge-gui/res/cardsfolder/b/brawl.txt b/forge-gui/res/cardsfolder/b/brawl.txt index db54140f215..9d8d409b00d 100644 --- a/forge-gui/res/cardsfolder/b/brawl.txt +++ b/forge-gui/res/cardsfolder/b/brawl.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ AnimateAll | Cost$ 3 R R | ValidCards$ Creature | Abilities$ ThrowPunch | sVars$ BrawlX | SpellDescription$ Until end of turn, all creatures gain "{T}: This creature deals damage equal to its power to target creature." SVar:ThrowPunch:AB$ DealDamage | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ BrawlX | References$ BrawlX | SpellDescription$ This creature deals damage equal to its power to target creature. SVar:BrawlX:Count$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/brawl.jpg Oracle:Until end of turn, all creatures gain "{T}: This creature deals damage equal to its power to target creature." diff --git a/forge-gui/res/cardsfolder/b/break_open.txt b/forge-gui/res/cardsfolder/b/break_open.txt index 3adc792f3d8..ac41dd6c27a 100644 --- a/forge-gui/res/cardsfolder/b/break_open.txt +++ b/forge-gui/res/cardsfolder/b/break_open.txt @@ -2,6 +2,6 @@ Name:Break Open ManaCost:1 R Types:Instant A:SP$ SetState | Cost$ 1 R | ValidTgts$ Creature.faceDown+OppCtrl | TgtPrompt$ Select target facedown creature you don't control. | Mode$ TurnFace | SpellDescription$ Turn target face-down creature an opponent controls face up. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/break_open.jpg Oracle:Turn target face-down creature an opponent controls face up. diff --git a/forge-gui/res/cardsfolder/b/breaking_wave.txt b/forge-gui/res/cardsfolder/b/breaking_wave.txt index bcc1f03e704..c614c404538 100644 --- a/forge-gui/res/cardsfolder/b/breaking_wave.txt +++ b/forge-gui/res/cardsfolder/b/breaking_wave.txt @@ -5,6 +5,6 @@ K:MayFlashCost:2 A:SP$ UntapAll | Cost$ 2 U U | ValidCards$ Creature.tapped | RememberUntapped$ True | SubAbility$ DBTap | SpellDescription$ Simultaneously untap all tapped creatures and tap all untapped creatures. SVar:DBTap:DB$ TapAll | ValidCards$ Creature.untapped+IsNotRemembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/breaking_wave.jpg Oracle:You may cast Breaking Wave as though it had flash if you pay {2} more to cast it. (You may cast it any time you could cast an instant.)\nSimultaneously untap all tapped creatures and tap all untapped creatures. diff --git a/forge-gui/res/cardsfolder/b/breakthrough.txt b/forge-gui/res/cardsfolder/b/breakthrough.txt index 9f25e860f70..c098c9da709 100644 --- a/forge-gui/res/cardsfolder/b/breakthrough.txt +++ b/forge-gui/res/cardsfolder/b/breakthrough.txt @@ -6,6 +6,6 @@ SVar:DBBreakthroughDiscard:DB$ Discard | Defined$ You | Mode$ TgtChoose | NumCar SVar:X:Count$xPaid SVar:BreakthroughY:Count$InYourHand SVar:BreakthroughZ:SVar$BreakthroughY/Minus.X -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/breakthrough.jpg Oracle:Draw four cards, then choose X cards in your hand and discard the rest. diff --git a/forge-gui/res/cardsfolder/b/breath_of_dreams.txt b/forge-gui/res/cardsfolder/b/breath_of_dreams.txt index d03367f66f1..ccef7f0e9a1 100644 --- a/forge-gui/res/cardsfolder/b/breath_of_dreams.txt +++ b/forge-gui/res/cardsfolder/b/breath_of_dreams.txt @@ -3,6 +3,6 @@ ManaCost:2 U U Types:Enchantment K:Cumulative upkeep:U S:Mode$ Continuous | Affected$ Creature.Green | AddKeyword$ Cumulative upkeep:1 | Description$ Green creatures have "Cumulative upkeep {1}." -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/breath_of_dreams.jpg Oracle:Cumulative upkeep {U} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nGreen creatures have "Cumulative upkeep {1}." diff --git a/forge-gui/res/cardsfolder/b/breath_of_fury.txt b/forge-gui/res/cardsfolder/b/breath_of_fury.txt index d6154ce1466..e5c3ed18d16 100644 --- a/forge-gui/res/cardsfolder/b/breath_of_fury.txt +++ b/forge-gui/res/cardsfolder/b/breath_of_fury.txt @@ -11,6 +11,6 @@ SVar:Cleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ CatchBreath SVar:CatchBreath:DB$ UntapAll | ValidCards$ Creature.YouCtrl | SubAbility$ TheFuryContinues SVar:TheFuryContinues:DB$ AddPhase | ExtraPhase$ BeginCombat | AfterPhase$ EndCombat SVar:WasSacced:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/breath_of_fury.jpg Oracle:Enchant creature you control\nWhen enchanted creature deals combat damage to a player, sacrifice it and attach Breath of Fury to a creature you control. If you do, untap all creatures you control and after this phase, there is an additional combat phase. diff --git a/forge-gui/res/cardsfolder/b/briarknit_kami.txt b/forge-gui/res/cardsfolder/b/briarknit_kami.txt index 735854e237c..06d2aac9a3c 100644 --- a/forge-gui/res/cardsfolder/b/briarknit_kami.txt +++ b/forge-gui/res/cardsfolder/b/briarknit_kami.txt @@ -5,6 +5,6 @@ PT:3/3 T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, put a +1/+1 counter on target creature. SVar:TrigPutCounter:DB$PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 SVar:BuffedBy:Arcane,Spirit -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/briarknit_kami.jpg Oracle:Whenever you cast a Spirit or Arcane spell, put a +1/+1 counter on target creature. diff --git a/forge-gui/res/cardsfolder/b/bridge_from_below.txt b/forge-gui/res/cardsfolder/b/bridge_from_below.txt index 1bbb543ad18..98fb16d5c00 100644 --- a/forge-gui/res/cardsfolder/b/bridge_from_below.txt +++ b/forge-gui/res/cardsfolder/b/bridge_from_below.txt @@ -6,7 +6,7 @@ T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenName$ Zombie | TokenTypes$ Creature,Zombie | TokenOwner$ You | TokenColors$ Black | TokenPower$ 2 | TokenToughness$ 2 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Graveyard | ValidCard$ Creature.OppOwn | Execute$ TrigChange | TriggerDescription$ When a creature is put into an opponent's graveyard from the battlefield, if CARDNAME is in your graveyard, exile CARDNAME. SVar:TrigChange:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:DiscardMe:5 SVar:SacMe:5 SVar:Picture:http://www.wizards.com/global/images/magic/general/bridge_from_below.jpg diff --git a/forge-gui/res/cardsfolder/b/brightflame.txt b/forge-gui/res/cardsfolder/b/brightflame.txt index 58ca5ef40ad..fce4da4995c 100644 --- a/forge-gui/res/cardsfolder/b/brightflame.txt +++ b/forge-gui/res/cardsfolder/b/brightflame.txt @@ -5,6 +5,6 @@ A:SP$DealDamage | Cost$ X R R W W | ValidTgts$ Creature | Radiance$ True | NumDm SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ Y | References$ Y SVar:X:Count$xPaid SVar:Y:Count$TotalDamageDoneByThisTurn -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/brightflame.jpg Oracle:Radiance — Brightflame deals X damage to target creature and each other creature that shares a color with it. You gain life equal to the damage dealt this way. diff --git a/forge-gui/res/cardsfolder/b/brightstone_ritual.txt b/forge-gui/res/cardsfolder/b/brightstone_ritual.txt index edda837721a..a1db9364abf 100644 --- a/forge-gui/res/cardsfolder/b/brightstone_ritual.txt +++ b/forge-gui/res/cardsfolder/b/brightstone_ritual.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Instant A:SP$ Mana | Cost$ R | Produced$ R | Amount$ X | References$ X | AILogic$ ManaRitual | AINoRecursiveCheck$ True | SpellDescription$ Add {R} for each Goblin on the battlefield. SVar:X:Count$TypeOnBattlefield.Goblin -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/brightstone_ritual.jpg Oracle:Add {R} for each Goblin on the battlefield. diff --git a/forge-gui/res/cardsfolder/b/brilliant_spectrum.txt b/forge-gui/res/cardsfolder/b/brilliant_spectrum.txt index 7cdc718b0eb..51cb253f871 100644 --- a/forge-gui/res/cardsfolder/b/brilliant_spectrum.txt +++ b/forge-gui/res/cardsfolder/b/brilliant_spectrum.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ Draw | Cost$ 3 U | NumCards$ X | References$ X | SpellDescription$ Converge — Draw X cards, where X is the number of colors of mana spent to cast Brilliant Spectrum. Then discard two cards. | SubAbility$ DBDiscard SVar:DBDiscard:DB$ Discard | Defined$ You | NumCards$ 2 | Mode$ TgtChoose SVar:X:Count$Converge -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/brilliant_spectrum.jpg Oracle:Converge — Draw X cards, where X is the number of colors of mana spent to cast Brilliant Spectrum. Then discard two cards. diff --git a/forge-gui/res/cardsfolder/b/brine_seer.txt b/forge-gui/res/cardsfolder/b/brine_seer.txt index dbac5cc9c3b..56a9d629b38 100644 --- a/forge-gui/res/cardsfolder/b/brine_seer.txt +++ b/forge-gui/res/cardsfolder/b/brine_seer.txt @@ -6,6 +6,6 @@ A:AB$ Reveal | Cost$ 2 U T | Defined$ You | RevealValid$ Card.Blue | AnyNumber$ SVar:DBCounter:DB$ Counter | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ X | SubAbility$ DBCleanup | References$ X SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/brine_seer.jpg Oracle:{2}{U}, {T}: Reveal any number of blue cards in your hand. Counter target spell unless its controller pays {1} for each card revealed this way. diff --git a/forge-gui/res/cardsfolder/b/brine_shaman.txt b/forge-gui/res/cardsfolder/b/brine_shaman.txt index bbb73d605e0..8a24fae2e5c 100644 --- a/forge-gui/res/cardsfolder/b/brine_shaman.txt +++ b/forge-gui/res/cardsfolder/b/brine_shaman.txt @@ -5,6 +5,6 @@ PT:1/1 A:AB$ Pump | Cost$ T Sac<1/Creature> | NumAtt$ +2 | NumDef$ +2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Target creature gets +2/+2 until end of turn. A:AB$ Counter | Cost$ 1 U U Sac<1/Creature> | TargetType$ Spell | ValidTgts$ Creature | TgtPrompt$ Select target Creature Spell | SpellDescription$ Counter target creature spell. SVar:AIPreference:SacCost$Creature.token -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/brine_shaman.jpg Oracle:{T}, Sacrifice a creature: Target creature gets +2/+2 until end of turn.\n{1}{U}{U}, Sacrifice a creature: Counter target creature spell. diff --git a/forge-gui/res/cardsfolder/b/bring_to_light.txt b/forge-gui/res/cardsfolder/b/bring_to_light.txt index 4cab948b98b..1837d0e8026 100644 --- a/forge-gui/res/cardsfolder/b/bring_to_light.txt +++ b/forge-gui/res/cardsfolder/b/bring_to_light.txt @@ -5,6 +5,6 @@ A:SP$ ChangeZone | Cost$ 3 G U | Origin$ Library | Destination$ Exile | ChangeTy SVar:DBPlay:DB$ Play | Defined$ Remembered | WithoutManaCost$ True | Optional$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$Converge -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bring_to_light.jpg Oracle:Converge — Search your library for a creature, instant, or sorcery card with converted mana cost less than or equal to the number of colors of mana spent to cast Bring to Light, exile that card, then shuffle your library. You may cast that card without paying its mana cost. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/b/bringer_of_the_black_dawn.txt b/forge-gui/res/cardsfolder/b/bringer_of_the_black_dawn.txt index 655d24e5233..c4541358baa 100644 --- a/forge-gui/res/cardsfolder/b/bringer_of_the_black_dawn.txt +++ b/forge-gui/res/cardsfolder/b/bringer_of_the_black_dawn.txt @@ -6,6 +6,6 @@ K:Trample SVar:AltCost:Cost$ W U B R G | Description$ You may pay {W}{U}{B}{R}{G} rather than pay CARDNAME's mana cost. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigChange | TriggerDescription$ At the beginning of your upkeep, you may pay 2 life. If you do, search your library for a card, then shuffle your library and put that card on top of it. SVar:TrigChange:AB$ChangeZone | Cost$ PayLife<2> | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Card | ChangeNum$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bringer_of_the_black_dawn.jpg Oracle:You may pay {W}{U}{B}{R}{G} rather than pay this spell's mana cost.\nTrample\nAt the beginning of your upkeep, you may pay 2 life. If you do, search your library for a card, then shuffle your library and put that card on top of it. diff --git a/forge-gui/res/cardsfolder/b/broodstar.txt b/forge-gui/res/cardsfolder/b/broodstar.txt index 3694b96752e..9ef32a9f6bc 100644 --- a/forge-gui/res/cardsfolder/b/broodstar.txt +++ b/forge-gui/res/cardsfolder/b/broodstar.txt @@ -7,6 +7,6 @@ S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) SVar:X:Count$Valid Artifact.YouCtrl SVar:NeedsToPlayVar:X GE3 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/broodstar.jpg Oracle:Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.)\nFlying\nBroodstar's power and toughness are each equal to the number of artifacts you control. diff --git a/forge-gui/res/cardsfolder/b/browse.txt b/forge-gui/res/cardsfolder/b/browse.txt index a9cf6f31aca..01c7c895c69 100644 --- a/forge-gui/res/cardsfolder/b/browse.txt +++ b/forge-gui/res/cardsfolder/b/browse.txt @@ -3,6 +3,6 @@ ManaCost:2 U U Types:Enchantment A:AB$ Dig | Cost$ 2 U U | DigNum$ 5 | ChangeNum$ 1 | DestinationZone2$ Exile | SpellDescription$ Look at the top five cards of your library, put one of them into your hand, and exile the rest. SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/browse.jpg Oracle:{2}{U}{U}: Look at the top five cards of your library, put one of them into your hand, and exile the rest. diff --git a/forge-gui/res/cardsfolder/b/brutal_deceiver.txt b/forge-gui/res/cardsfolder/b/brutal_deceiver.txt index 659a8214a3d..dcc24c3cac1 100644 --- a/forge-gui/res/cardsfolder/b/brutal_deceiver.txt +++ b/forge-gui/res/cardsfolder/b/brutal_deceiver.txt @@ -6,6 +6,6 @@ A:AB$ Dig | Cost$ 1 | DigNum$ 1 | DestinationZone$ Library | LibraryPosition$ 0 A:AB$ Dig | Cost$ 2 | DigNum$ 1 | ActivationLimit$ 1 | Reveal$ True | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | NoMove$ True | RememberRevealed$ True | SubAbility$ TrigPump | SpellDescription$ Reveal the top card of your library. If it's a land card, CARDNAME gets +1/+0 and gains first strike until end of turn. Activate this ability only once each turn. SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ 1 | KW$ First Strike | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | ConditionCompare$ GE1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/brutal_deceiver.jpg Oracle:{1}: Look at the top card of your library.\n{2}: Reveal the top card of your library. If it's a land card, Brutal Deceiver gets +1/+0 and gains first strike until end of turn. Activate this ability only once each turn. diff --git a/forge-gui/res/cardsfolder/b/brutal_expulsion.txt b/forge-gui/res/cardsfolder/b/brutal_expulsion.txt index 00fe9d5a6d9..9ad6cb5b431 100644 --- a/forge-gui/res/cardsfolder/b/brutal_expulsion.txt +++ b/forge-gui/res/cardsfolder/b/brutal_expulsion.txt @@ -4,6 +4,6 @@ Types:Instant K:Devoid A:SP$ Charm | Cost$ 2 U R | MinCharmNum$ 1 | CharmNum$ 2 | Choices$ DBReturn,DBDmg SVar:DBReturn:DB$ ChangeZone | ValidTgts$ Creature,Card.inZoneStack | TgtZone$ Stack,Battlefield | Origin$ Battlefield,Stack | Fizzle$ True | Destination$ Hand | SpellDescription$ Return target spell or creature to its owner's hand. -SVar:DBDmg:DB$ DealDamage | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker. | NumDmg$ 2 | ReplaceDyingDefined$ Targeted | SpellDescription$ CARDNAME deals 2 damage to target creature or planeswalker. If that permanent would be put into a graveyard this turn, exile it instead.SVar:RemAIDeck:True +SVar:DBDmg:DB$ DealDamage | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker. | NumDmg$ 2 | ReplaceDyingDefined$ Targeted | SpellDescription$ CARDNAME deals 2 damage to target creature or planeswalker. If that permanent would be put into a graveyard this turn, exile it instead.AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/brutal_expulsion.jpg Oracle:Devoid (This card has no color.)\nChoose one or both —\n• Return target spell or creature to its owner's hand.\n• Brutal Expulsion deals 2 damage to target creature or planeswalker. If that permanent would be put into a graveyard this turn, exile it instead. diff --git a/forge-gui/res/cardsfolder/b/brutalizer_exarch.txt b/forge-gui/res/cardsfolder/b/brutalizer_exarch.txt index 943eda4dd4d..086ce7f52f1 100644 --- a/forge-gui/res/cardsfolder/b/brutalizer_exarch.txt +++ b/forge-gui/res/cardsfolder/b/brutalizer_exarch.txt @@ -6,6 +6,6 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigCharm:DB$ Charm | Choices$ DBSearch,DBRemove SVar:DBSearch:DB$ ChangeZone | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Creature | ChangeNum$ 1 | SpellDescription$ Search your library for a creature card, reveal it, then shuffle your library and put that card on top of it. SVar:DBRemove:DB$ ChangeZone | ValidTgts$ Permanent.nonCreature | IsCurse$ True | TgtPrompt$ Select target noncreature permanent | Origin$ Battlefield | Destination$ Library | LibraryPosition$ -1 | SpellDescription$ Put target noncreature permanent on the bottom of its owner's library. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/brutalizer_exarch.jpg Oracle:When Brutalizer Exarch enters the battlefield, choose one —\n• Search your library for a creature card, reveal it, then shuffle your library and put that card on top of it.\n• Put target noncreature permanent on the bottom of its owner's library. diff --git a/forge-gui/res/cardsfolder/b/bubble_matrix.txt b/forge-gui/res/cardsfolder/b/bubble_matrix.txt index 36034b2785f..8bc7e15347e 100644 --- a/forge-gui/res/cardsfolder/b/bubble_matrix.txt +++ b/forge-gui/res/cardsfolder/b/bubble_matrix.txt @@ -3,6 +3,6 @@ ManaCost:4 Types:Artifact R:Event$ DamageDone | ActiveZones$ Battlefield | Prevent$ True | ValidTarget$ Creature | Description$ Prevent all damage that would be dealt to creatures. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/bubble_matrix.jpg Oracle:Prevent all damage that would be dealt to creatures. diff --git a/forge-gui/res/cardsfolder/b/bubbling_cauldron.txt b/forge-gui/res/cardsfolder/b/bubbling_cauldron.txt index b9f107cb60f..2959f3088ad 100644 --- a/forge-gui/res/cardsfolder/b/bubbling_cauldron.txt +++ b/forge-gui/res/cardsfolder/b/bubbling_cauldron.txt @@ -7,6 +7,6 @@ SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ AFLifeLost SVar:AFLifeLost:Number$0 DeckHints:Name$Bogbrew Witch DeckNeeds:Name$Festering Newt -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/bubbling_cauldron.jpg Oracle:{1}, {T}, Sacrifice a creature: You gain 4 life.\n{1}, {T}, Sacrifice a creature named Festering Newt: Each opponent loses 4 life. You gain life equal to the life lost this way. diff --git a/forge-gui/res/cardsfolder/b/bubbling_muck.txt b/forge-gui/res/cardsfolder/b/bubbling_muck.txt index 38e01ac8fbc..d1524e6402b 100644 --- a/forge-gui/res/cardsfolder/b/bubbling_muck.txt +++ b/forge-gui/res/cardsfolder/b/bubbling_muck.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ Effect | Cost$ B | Name$ Bubbling Muck Effect | Triggers$ SwampTrigger | SVars$ TrigMana | SpellDescription$ Until end of turn, whenever a player taps a Swamp for mana, that player adds an additional {B}. SVar:SwampTrigger:Mode$ TapsForMana | ValidCard$ Swamp | Execute$ TrigMana | Static$ True | TriggerDescription$ Whenever a player taps a Swamp for mana, that player adds an additional {B}. SVar:TrigMana:DB$ Mana | Produced$ B | Amount$ 1 | Defined$ TriggeredPlayer -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bubbling_muck.jpg Oracle:Until end of turn, whenever a player taps a Swamp for mana, that player adds an additional {B}. diff --git a/forge-gui/res/cardsfolder/b/bulwark.txt b/forge-gui/res/cardsfolder/b/bulwark.txt index 4b84135781c..bde1e0518ce 100644 --- a/forge-gui/res/cardsfolder/b/bulwark.txt +++ b/forge-gui/res/cardsfolder/b/bulwark.txt @@ -6,6 +6,6 @@ SVar:PsychicSlap:DB$ DealDamage | ValidTgts$ Opponent | NumDmg$ X SVar:A:Count$InYourHand SVar:B:Count$InOppHand SVar:X:SVar$A/Minus.B -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bulwark.jpg Oracle:At the beginning of your upkeep, Bulwark deals X damage to target opponent, where X is the number of cards in your hand minus the number of cards in that player's hand. diff --git a/forge-gui/res/cardsfolder/b/burden_of_greed.txt b/forge-gui/res/cardsfolder/b/burden_of_greed.txt index db4afe64071..b560ebe8ad7 100644 --- a/forge-gui/res/cardsfolder/b/burden_of_greed.txt +++ b/forge-gui/res/cardsfolder/b/burden_of_greed.txt @@ -3,6 +3,6 @@ ManaCost:3 B Types:Instant A:SP$ LoseLife | Cost$ 3 B | ValidTgts$ Player | TgtPrompt$ Select target player | LifeAmount$ X | References$ X | SpellDescription$ Target player loses 1 life for each tapped artifact they control. SVar:X:TargetedPlayer$Valid Artifact.tapped+YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/burden_of_greed.jpg Oracle:Target player loses 1 life for each tapped artifact they control. diff --git a/forge-gui/res/cardsfolder/b/burden_of_guilt.txt b/forge-gui/res/cardsfolder/b/burden_of_guilt.txt index f0e41246edf..ebf0abe0017 100644 --- a/forge-gui/res/cardsfolder/b/burden_of_guilt.txt +++ b/forge-gui/res/cardsfolder/b/burden_of_guilt.txt @@ -4,7 +4,7 @@ Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ W | ValidTgts$ Creature | AILogic$ KeepTapped A:AB$Tap | Cost$ 1 | Defined$ Enchanted | SpellDescription$ Tap enchanted creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingAttachEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/burden_of_guilt.jpg Oracle:Enchant creature\n{1}: Tap enchanted creature. diff --git a/forge-gui/res/cardsfolder/b/buried_alive.txt b/forge-gui/res/cardsfolder/b/buried_alive.txt index 9206c877801..862761effaa 100644 --- a/forge-gui/res/cardsfolder/b/buried_alive.txt +++ b/forge-gui/res/cardsfolder/b/buried_alive.txt @@ -2,6 +2,6 @@ Name:Buried Alive ManaCost:2 B Types:Sorcery A:SP$ ChangeZone | Cost$ 2 B | Origin$ Library | Destination$ Graveyard | ChangeType$ Creature | ChangeNum$ 3 | SpellDescription$ Search your library for up to three creature cards and put them into your graveyard. Then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/buried_alive.jpg Oracle:Search your library for up to three creature cards and put them into your graveyard. Then shuffle your library. diff --git a/forge-gui/res/cardsfolder/b/burn_at_the_stake.txt b/forge-gui/res/cardsfolder/b/burn_at_the_stake.txt index b87ccae91bc..efe562375df 100644 --- a/forge-gui/res/cardsfolder/b/burn_at_the_stake.txt +++ b/forge-gui/res/cardsfolder/b/burn_at_the_stake.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ DealDamage | Cost$ 2 R R R tapXType | CostDesc$ As an additional cost to cast CARDNAME, tap any number of untapped creatures you control. | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ BurnAtTheStakeDmg | References$ X,BurnAtTheStakeDmg | SpellDescription$ CARDNAME deals damage to any target equal to three times the number of creatures tapped this way. SVar:X:XChoice SVar:BurnAtTheStakeDmg:Number$3/Times.ChosenX -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/burn_at_the_stake.jpg Oracle:As an additional cost to cast this spell, tap any number of untapped creatures you control.\nBurn at the Stake deals damage to any target equal to three times the number of creatures tapped this way. diff --git a/forge-gui/res/cardsfolder/b/burning_cloak.txt b/forge-gui/res/cardsfolder/b/burning_cloak.txt index b0e139416b9..b0922244e20 100644 --- a/forge-gui/res/cardsfolder/b/burning_cloak.txt +++ b/forge-gui/res/cardsfolder/b/burning_cloak.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Sorcery A:SP$ Pump | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | SubAbility$ DBDealDamage | SpellDescription$ Target creature gets +2/+0 until end of turn. CARDNAME deals 2 damage to that creature. SVar:DBDealDamage:DB$DealDamage | Defined$ Targeted | NumDmg$ 2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://serv1.tcgimages.eu/img/cards/Portal/burning_cloak.jpg Oracle:Target creature gets +2/+0 until end of turn. Burning Cloak deals 2 damage to that creature. diff --git a/forge-gui/res/cardsfolder/b/burning_earth.txt b/forge-gui/res/cardsfolder/b/burning_earth.txt index dc805dda270..08fbe597e4e 100644 --- a/forge-gui/res/cardsfolder/b/burning_earth.txt +++ b/forge-gui/res/cardsfolder/b/burning_earth.txt @@ -3,6 +3,6 @@ ManaCost:3 R Types:Enchantment T:Mode$ TapsForMana | ValidCard$ Land.nonBasic | Execute$ TrigDmg | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player taps a nonbasic land for mana, CARDNAME deals 1 damage to that player. SVar:TrigDmg:DB$ DealDamage | Defined$ TriggeredCardController | NumDmg$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/burning_earth.jpg Oracle:Whenever a player taps a nonbasic land for mana, Burning Earth deals 1 damage to that player. diff --git a/forge-gui/res/cardsfolder/b/burning_of_xinye.txt b/forge-gui/res/cardsfolder/b/burning_of_xinye.txt index 98c1b006346..ba10f5059c0 100644 --- a/forge-gui/res/cardsfolder/b/burning_of_xinye.txt +++ b/forge-gui/res/cardsfolder/b/burning_of_xinye.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ Sacrifice | Defined$ You | Cost$ 4 R R | SacValid$ Land.withoutIndestructible | Amount$ 4 | SubAbility$ DBSac | Destroy$ True | SpellDescription$ You destroy four lands you control, then target opponent destroys four lands they control. Then CARDNAME deals 4 damage to each creature. SVar:DBSac:DB$ Sacrifice | ValidTgts$ Opponent | SacValid$ Land.withoutIndestructible | Amount$ 4 | Destroy$ True | SubAbility$ DBDamage SVar:DBDamage:DB$ DamageAll | NumDmg$ 4 | ValidCards$ Creature -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/burning_of_xinye.jpg Oracle:You destroy four lands you control, then target opponent destroys four lands they control. Then Burning of Xinye deals 4 damage to each creature. diff --git a/forge-gui/res/cardsfolder/b/burning_sands.txt b/forge-gui/res/cardsfolder/b/burning_sands.txt index 0c38de35d1d..2f28f92b51f 100644 --- a/forge-gui/res/cardsfolder/b/burning_sands.txt +++ b/forge-gui/res/cardsfolder/b/burning_sands.txt @@ -3,6 +3,6 @@ ManaCost:3 R R Types:Enchantment T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ Whenever a creature dies, that creature's controller sacrifices a land. SVar:TrigSac:DB$Sacrifice | SacValid$ Land | Defined$ TriggeredCardController -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/burning_sands.jpg Oracle:Whenever a creature dies, that creature's controller sacrifices a land. diff --git a/forge-gui/res/cardsfolder/b/burning_tree_bloodscale.txt b/forge-gui/res/cardsfolder/b/burning_tree_bloodscale.txt index bd809d96467..a952186bbd2 100644 --- a/forge-gui/res/cardsfolder/b/burning_tree_bloodscale.txt +++ b/forge-gui/res/cardsfolder/b/burning_tree_bloodscale.txt @@ -5,6 +5,6 @@ PT:2/2 K:Bloodthirst:1 A:AB$ Pump | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature that can't block this creature this turn | IsCurse$ True | KW$ HIDDEN CantBlockCardUIDSource | DefinedKW$ CardUIDSource | UntilHostLeavesPlayOrEOT$ True | StackDescription$ {c:Targeted} can't block CARDNAME this turn. | SpellDescription$ Target creature can't block CARDNAME this turn. A:AB$ MustBlock | Cost$ 2 G | ValidTgts$ Creature | TgtPrompt$ Select target creature that must block this creature this turn | SpellDescription$ Target creature blocks CARDNAME this turn if able. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/burning_tree_bloodscale.jpg Oracle:Bloodthirst 1 (If an opponent was dealt damage this turn, this creature enters the battlefield with a +1/+1 counter on it.)\n{2}{R}: Target creature can't block Burning-Tree Bloodscale this turn.\n{2}{G}: Target creature blocks Burning-Tree Bloodscale this turn if able. diff --git a/forge-gui/res/cardsfolder/b/burning_vengeance.txt b/forge-gui/res/cardsfolder/b/burning_vengeance.txt index 025f8287439..10878b057e2 100644 --- a/forge-gui/res/cardsfolder/b/burning_vengeance.txt +++ b/forge-gui/res/cardsfolder/b/burning_vengeance.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Enchantment T:Mode$ SpellCast | ValidCard$ Card.wasCastFromGraveyard | ValidActivatingPlayer$ You | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a spell from your graveyard, CARDNAME deals 2 damage to any target. SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/burning_vengeance.jpg Oracle:Whenever you cast a spell from your graveyard, Burning Vengeance deals 2 damage to any target. diff --git a/forge-gui/res/cardsfolder/b/burning_wish.txt b/forge-gui/res/cardsfolder/b/burning_wish.txt index a3cf9d7d94b..a6fe901792b 100644 --- a/forge-gui/res/cardsfolder/b/burning_wish.txt +++ b/forge-gui/res/cardsfolder/b/burning_wish.txt @@ -3,6 +3,6 @@ ManaCost:1 R Types:Sorcery A:SP$ ChangeZone | Cost$ 1 R | Origin$ Sideboard | Destination$ Hand | ChangeType$ Sorcery.YouOwn | ChangeNum$ 1 | SubAbility$ DBChange | SpellDescription$ You may choose a sorcery card you own from outside the game, reveal that card, and put it into your hand. Exile CARDNAME. SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/burning_wish.jpg Oracle:You may choose a sorcery card you own from outside the game, reveal that card, and put it into your hand. Exile Burning Wish. diff --git a/forge-gui/res/cardsfolder/b/burnout.txt b/forge-gui/res/cardsfolder/b/burnout.txt index 82bf126ff56..954dcc52ad6 100644 --- a/forge-gui/res/cardsfolder/b/burnout.txt +++ b/forge-gui/res/cardsfolder/b/burnout.txt @@ -5,6 +5,6 @@ A:SP$ Counter | Cost$ 1 R | TargetType$ Spell | TgtPrompt$ Select target spell | SVar:DelTrigSlowtrip:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ DrawSlowtrip | TriggerDescription$ Draw a card. SVar:DrawSlowtrip:DB$Draw | NumCards$ 1 | Defined$ You SVar:X:Targeted$Valid Card.Blue -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/burnout.jpg Oracle:Counter target instant spell if it's blue.\nDraw a card at the beginning of the next turn's upkeep. diff --git a/forge-gui/res/cardsfolder/b/burnt_offering.txt b/forge-gui/res/cardsfolder/b/burnt_offering.txt index 0e2f9b95305..d550bcd2d10 100644 --- a/forge-gui/res/cardsfolder/b/burnt_offering.txt +++ b/forge-gui/res/cardsfolder/b/burnt_offering.txt @@ -3,6 +3,6 @@ ManaCost:B Types:Instant A:SP$ Mana | Cost$ B Sac<1/Creature> | Produced$ Combo B R | Amount$ X | References$ X | SpellDescription$ Add X mana in any combination of {B} and/or {R}, where X is the sacrificed creature's converted mana cost. SVar:X:Sacrificed$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/burnt_offering.jpg Oracle:As an additional cost to cast Burnt Offering, sacrifice a creature.\nAdd X mana in any combination of {B} and/or {R}, where X is the sacrificed creature's converted mana cost. diff --git a/forge-gui/res/cardsfolder/b/burr_grafter.txt b/forge-gui/res/cardsfolder/b/burr_grafter.txt index 2941c576a1b..235abab272d 100644 --- a/forge-gui/res/cardsfolder/b/burr_grafter.txt +++ b/forge-gui/res/cardsfolder/b/burr_grafter.txt @@ -4,7 +4,7 @@ Types:Creature Spirit PT:2/2 A:AB$ Pump | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Target creature gets +2/+2 until end of turn. K:Soulshift:3 -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHints:Type$Spirit SVar:Picture:http://www.wizards.com/global/images/magic/general/burr_grafter.jpg Oracle:Sacrifice Burr Grafter: Target creature gets +2/+2 until end of turn.\nSoulshift 3 (When this creature dies, you may return target Spirit card with converted mana cost 3 or less from your graveyard to your hand.) diff --git a/forge-gui/res/cardsfolder/b/burrowing.txt b/forge-gui/res/cardsfolder/b/burrowing.txt index 5b27a970173..b3a381fe24d 100644 --- a/forge-gui/res/cardsfolder/b/burrowing.txt +++ b/forge-gui/res/cardsfolder/b/burrowing.txt @@ -4,6 +4,6 @@ Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ R | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Mountainwalk | Description$ Enchanted creature has mountainwalk. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/burrowing.jpg Oracle:Enchant creature\nEnchanted creature has mountainwalk. (It can't be blocked as long as defending player controls a Mountain.) diff --git a/forge-gui/res/cardsfolder/b/burst_of_energy.txt b/forge-gui/res/cardsfolder/b/burst_of_energy.txt index fa580fe1f8d..d09b8ff31f4 100644 --- a/forge-gui/res/cardsfolder/b/burst_of_energy.txt +++ b/forge-gui/res/cardsfolder/b/burst_of_energy.txt @@ -2,6 +2,6 @@ Name:Burst of Energy ManaCost:W Types:Instant A:SP$ Untap | Cost$ W | TgtPrompt$ Choose target permanent | ValidTgts$ Permanent | SpellDescription$ Untap target Permanent. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/burst_of_energy.jpg Oracle:Untap target permanent. diff --git a/forge-gui/res/cardsfolder/b/burst_of_speed.txt b/forge-gui/res/cardsfolder/b/burst_of_speed.txt index 04f6b77ecd2..09d3e903ec3 100644 --- a/forge-gui/res/cardsfolder/b/burst_of_speed.txt +++ b/forge-gui/res/cardsfolder/b/burst_of_speed.txt @@ -2,6 +2,6 @@ Name:Burst of Speed ManaCost:R Types:Sorcery A:SP$ PumpAll | Cost$ R | ValidCards$ Creature.YouCtrl | KW$ Haste | SpellDescription$ Creatures you control gain haste until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/burst_of_speed.jpg Oracle:Creatures you control gain haste until end of turn. (They can attack and {T} even if they just came under your control.) diff --git a/forge-gui/res/cardsfolder/c/cabal_coffers.txt b/forge-gui/res/cardsfolder/c/cabal_coffers.txt index 08043455f9c..31e0fdb70ec 100644 --- a/forge-gui/res/cardsfolder/c/cabal_coffers.txt +++ b/forge-gui/res/cardsfolder/c/cabal_coffers.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ 2 T | Produced$ B | Amount$ X | References$ X | SpellDescription$ Add {B} for each Swamp you control. SVar:X:Count$Valid Swamp.YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cabal_coffers.jpg Oracle:{2}, {T}: Add {B} for each Swamp you control. diff --git a/forge-gui/res/cardsfolder/c/cabal_interrogator.txt b/forge-gui/res/cardsfolder/c/cabal_interrogator.txt index 6aa6ec5a893..cc1a92df7a5 100644 --- a/forge-gui/res/cardsfolder/c/cabal_interrogator.txt +++ b/forge-gui/res/cardsfolder/c/cabal_interrogator.txt @@ -4,6 +4,6 @@ Types:Creature Zombie Wizard PT:1/1 A:AB$ Discard | Cost$ X B T | ValidTgts$ Player | NumCards$ 1 | RevealNumber$ X | Mode$ RevealYouChoose | DiscardValid$ Card | SorcerySpeed$ True | References$ X | SpellDescription$ Target player reveals X cards from their hand and you choose one of them. That player discards that card. Activate this ability only any time you could cast a sorcery. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cabal_interrogator.jpg Oracle:{X}{B}, {T}: Target player reveals X cards from their hand and you choose one of them. That player discards that card. Activate this ability only any time you could cast a sorcery. diff --git a/forge-gui/res/cardsfolder/c/cabal_patriarch.txt b/forge-gui/res/cardsfolder/c/cabal_patriarch.txt index b2c3c9f9527..ae5b5214bf2 100644 --- a/forge-gui/res/cardsfolder/c/cabal_patriarch.txt +++ b/forge-gui/res/cardsfolder/c/cabal_patriarch.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Human Wizard PT:5/5 A:AB$ Pump | Cost$ 2 B Sac<1/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -2 | NumDef$ -2 | IsCurse$ True | SpellDescription$ Target creature gets -2/-2 until end of turn. A:AB$ Pump | Cost$ 2 B ExileFromGrave<1/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -2 | NumDef$ -2 | IsCurse$ True | SpellDescription$ Target creature gets -2/-2 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cabal_patriarch.jpg Oracle:{2}{B}, Sacrifice a creature: Target creature gets -2/-2 until end of turn.\n{2}{B}, Exile a creature card from your graveyard: Target creature gets -2/-2 until end of turn. diff --git a/forge-gui/res/cardsfolder/c/cabal_ritual.txt b/forge-gui/res/cardsfolder/c/cabal_ritual.txt index f7cfcafde4e..536b45bb2c4 100644 --- a/forge-gui/res/cardsfolder/c/cabal_ritual.txt +++ b/forge-gui/res/cardsfolder/c/cabal_ritual.txt @@ -3,6 +3,6 @@ ManaCost:1 B Types:Instant A:SP$ Mana | Cost$ 1 B | Produced$ B | Amount$ X | References$ X | AILogic$ ManaRitual | AINoRecursiveCheck$ True | SpellDescription$ Add {B}{B}{B}. Threshold — Add {B}{B}{B}{B}{B} instead if seven or more cards are in your graveyard. SVar:X:Count$Threshold.5.3 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/cabal_ritual.jpg Oracle:Add {B}{B}{B}.\nThreshold — Add {B}{B}{B}{B}{B} instead if seven or more cards are in your graveyard. diff --git a/forge-gui/res/cardsfolder/c/cabal_shrine.txt b/forge-gui/res/cardsfolder/c/cabal_shrine.txt index add5bdbb94c..0313043a8a6 100644 --- a/forge-gui/res/cardsfolder/c/cabal_shrine.txt +++ b/forge-gui/res/cardsfolder/c/cabal_shrine.txt @@ -6,6 +6,6 @@ SVar:TrigDiscardRem:DB$ Pump | Defined$ TriggeredCard | PumpZone$ Stack | Rememb SVar:DBDiscard:DB$ Discard | Defined$ TriggeredActivator | NumCards$ X | References$ X | Mode$ TgtChoose | SubAbility$ DBCleanup SVar:X:Count$ValidGraveyard Card.sharesNameWith Remembered SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/cabal_shrine.jpg Oracle:Whenever a player casts a spell, that player discards X cards, where X is the number of cards in all graveyards with the same name as that spell. diff --git a/forge-gui/res/cardsfolder/c/cabal_therapy.txt b/forge-gui/res/cardsfolder/c/cabal_therapy.txt index ff6441c3620..283c002bcf8 100644 --- a/forge-gui/res/cardsfolder/c/cabal_therapy.txt +++ b/forge-gui/res/cardsfolder/c/cabal_therapy.txt @@ -4,6 +4,6 @@ Types:Sorcery K:Flashback:Sac<1/Creature> A:SP$ NameCard | Cost$ B | Defined$ You | ValidCards$ Card.nonLand | ValidDesc$ nonland | SubAbility$ DBDiscard | SpellDescription$ Choose a nonland card name. Target player reveals their hand and discards all cards with that name. SVar:DBDiscard:DB$ Discard | ValidTgts$ Player | TgtPrompt$ Select target player | Mode$ RevealDiscardAll | DiscardValid$ Card.NamedCard -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cabal_therapy.jpg Oracle:Choose a nonland card name. Target player reveals their hand and discards all cards with that name.\nFlashback—Sacrifice a creature. (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/c/cache_raiders.txt b/forge-gui/res/cardsfolder/c/cache_raiders.txt index 515c2d8c586..6e9fd2d5858 100644 --- a/forge-gui/res/cardsfolder/c/cache_raiders.txt +++ b/forge-gui/res/cardsfolder/c/cache_raiders.txt @@ -4,6 +4,6 @@ Types:Creature Merfolk Rogue PT:4/4 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigBounce | TriggerDescription$ At the beginning of your upkeep, return a permanent you control to its owner's hand. SVar:TrigBounce:DB$ChangeZone | Origin$ Battlefield | Destination$ Hand | ChangeType$ Permanent.YouCtrl | ChangeNum$ 1 | Mandatory$ True | Hidden$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cache_raiders.jpg Oracle:At the beginning of your upkeep, return a permanent you control to its owner's hand. diff --git a/forge-gui/res/cardsfolder/c/cadaverous_bloom.txt b/forge-gui/res/cardsfolder/c/cadaverous_bloom.txt index 185f97cbf4c..dd80274ae5c 100644 --- a/forge-gui/res/cardsfolder/c/cadaverous_bloom.txt +++ b/forge-gui/res/cardsfolder/c/cadaverous_bloom.txt @@ -4,6 +4,6 @@ Types:Enchantment A:AB$ Mana | Cost$ ExileFromHand<1/Card> | Produced$ B | Amount$ 2 | SpellDescription$ Add {B}{B}. A:AB$ Mana | Cost$ ExileFromHand<1/Card> | Produced$ G | Amount$ 2 | SpellDescription$ Add {G}{G}. SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cadaverous_bloom.jpg Oracle:Exile a card from your hand: Add {B}{B} or {G}{G}. diff --git a/forge-gui/res/cardsfolder/c/cagemail.txt b/forge-gui/res/cardsfolder/c/cagemail.txt index 2c0459beccd..3b51d943ba7 100644 --- a/forge-gui/res/cardsfolder/c/cagemail.txt +++ b/forge-gui/res/cardsfolder/c/cagemail.txt @@ -4,6 +4,6 @@ Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ 1 W | ValidTgts$ Creature | AILogic$ Curse S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 2 | AddToughness$ 2 | AddHiddenKeyword$ CARDNAME can't attack. | Description$ Enchanted creature gets +2/+2 and can't attack. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cagemail.jpg Oracle:Enchant creature\nEnchanted creature gets +2/+2 and can't attack. diff --git a/forge-gui/res/cardsfolder/c/calciform_pools.txt b/forge-gui/res/cardsfolder/c/calciform_pools.txt index b1ddb7562e2..eee726f6710 100644 --- a/forge-gui/res/cardsfolder/c/calciform_pools.txt +++ b/forge-gui/res/cardsfolder/c/calciform_pools.txt @@ -5,6 +5,6 @@ A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ PutCounter | Cost$ 1 T | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME. A:AB$ Mana | Cost$ 1 SubCounter | Produced$ Combo W U | Amount$ ChosenX | CostDesc$ {1}, Remove X storage counters from CARDNAME: | References$ X | SpellDescription$ Add X mana in any combination of {W} and/or {U}. SVar:X:XChoice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/calciform_pools.jpg Oracle:{T}: Add {C}.\n{1}, {T}: Put a storage counter on Calciform Pools.\n{1}, Remove X storage counters from Calciform Pools: Add X mana in any combination of {W} and/or {U}. diff --git a/forge-gui/res/cardsfolder/c/calcite_snapper.txt b/forge-gui/res/cardsfolder/c/calcite_snapper.txt index 36adfc8d06b..cc9a9a2bd38 100644 --- a/forge-gui/res/cardsfolder/c/calcite_snapper.txt +++ b/forge-gui/res/cardsfolder/c/calcite_snapper.txt @@ -5,6 +5,6 @@ PT:1/4 K:Shroud T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPump | TriggerDescription$ Landfall — Whenever a land enters the battlefield under your control, you may switch CARDNAME power and toughness until end of turn. SVar:TrigPump:DB$Pump | Defined$ Self | KW$ HIDDEN CARDNAME's power and toughness are switched -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/calcite_snapper.jpg Oracle:Shroud (This creature can't be the target of spells or abilities.)\nLandfall — Whenever a land enters the battlefield under your control, you may switch Calcite Snapper's power and toughness until end of turn. diff --git a/forge-gui/res/cardsfolder/c/caldera_hellion.txt b/forge-gui/res/cardsfolder/c/caldera_hellion.txt index 71431064e14..4d49b76f540 100644 --- a/forge-gui/res/cardsfolder/c/caldera_hellion.txt +++ b/forge-gui/res/cardsfolder/c/caldera_hellion.txt @@ -5,6 +5,6 @@ PT:3/3 K:Devour:1 T:Mode$ ChangesZone | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 3 damage to each creature. SVar:TrigDamage:DB$DamageAll | ValidCards$ Creature | ValidDescription$ each creature. | NumDmg$ 3 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/caldera_hellion.jpg Oracle:Devour 1 (As this enters the battlefield, you may sacrifice any number of creatures. This creature enters the battlefield with that many +1/+1 counters on it.)\nWhen Caldera Hellion enters the battlefield, it deals 3 damage to each creature. diff --git a/forge-gui/res/cardsfolder/c/call_for_blood.txt b/forge-gui/res/cardsfolder/c/call_for_blood.txt index d6c81454ce0..4d853f3db9e 100644 --- a/forge-gui/res/cardsfolder/c/call_for_blood.txt +++ b/forge-gui/res/cardsfolder/c/call_for_blood.txt @@ -3,6 +3,6 @@ ManaCost:4 B Types:Instant Arcane A:SP$ Pump | Cost$ 4 B Sac<1/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | IsCurse$ True | NumAtt$ -X | NumDef$ -X | References$ X | SpellDescription$ Target creature gets -X/-X until end of turn, where X is the sacrificed creature's power. SVar:X:Sacrificed$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/call_for_blood.jpg Oracle:As an additional cost to cast this spell, sacrifice a creature.\nTarget creature gets -X/-X until end of turn, where X is the sacrificed creature's power. diff --git a/forge-gui/res/cardsfolder/c/call_the_gatewatch.txt b/forge-gui/res/cardsfolder/c/call_the_gatewatch.txt index c719492bfaa..5ed67a7a2c8 100644 --- a/forge-gui/res/cardsfolder/c/call_the_gatewatch.txt +++ b/forge-gui/res/cardsfolder/c/call_the_gatewatch.txt @@ -2,6 +2,6 @@ Name:Call the Gatewatch ManaCost:2 W Types:Sorcery A:SP$ ChangeZone | Cost$ 2 W | Origin$ Library | Destination$ Hand | ChangeType$ Planeswalker | ChangeNum$ 1 | SpellDescription$ Search your library for a planeswalker card, reveal it, put it into your hand, then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/call_the_gatewatch.jpg Oracle:Search your library for a planeswalker card, reveal it, put it into your hand, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/c/call_to_arms.txt b/forge-gui/res/cardsfolder/c/call_to_arms.txt index 070a0c103a0..e5086dcf92d 100644 --- a/forge-gui/res/cardsfolder/c/call_to_arms.txt +++ b/forge-gui/res/cardsfolder/c/call_to_arms.txt @@ -9,6 +9,6 @@ SVar:Y:Count$SecondMostProminentColor Permanent.nonToken+ChosenCtrl S:Mode$ Continuous | Affected$ Creature.White | AddPower$ 1 | AddToughness$ 1 | CheckSVar$ X | SVarCompare$ GTY | Description$ White creatures get +1/+1 as long as the chosen color is the most common color among nontoken permanents the chosen player controls but isn't tied for most common. T:Mode$ Always | CheckSVar$ X | SVarCompare$ LEY | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ When the chosen color isn't the most common color among nontoken permanents the chosen player controls or is tied for most common, sacrifice CARDNAME. SVar:TrigSac:DB$ Sacrifice | SacValid$ Self -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/call_to_arms.jpg Oracle:As Call to Arms enters the battlefield, choose a color and an opponent.\nWhite creatures get +1/+1 as long as the chosen color is the most common color among nontoken permanents the chosen player controls but isn't tied for most common.\nWhen the chosen color isn't the most common color among nontoken permanents the chosen player controls or is tied for most common, sacrifice Call to Arms. diff --git a/forge-gui/res/cardsfolder/c/call_to_glory.txt b/forge-gui/res/cardsfolder/c/call_to_glory.txt index b6e7742bc45..8a51a45d283 100644 --- a/forge-gui/res/cardsfolder/c/call_to_glory.txt +++ b/forge-gui/res/cardsfolder/c/call_to_glory.txt @@ -3,7 +3,7 @@ ManaCost:1 W Types:Instant A:SP$ UntapAll | Cost$ 1 W | ValidCards$ Creature.YouCtrl | SpellDescription$ Untap all creatures you control. Samurai creatures you control get +1/+1 until end of turn. | SubAbility$ DBPumpYourSamurai SVar:DBPumpYourSamurai:DB$ PumpAll | ValidCards$ Creature.Samurai+YouCtrl | NumAtt$+1 | NumDef$ +1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Samurai SVar:Picture:http://www.wizards.com/global/images/magic/general/call_to_glory.jpg Oracle:Untap all creatures you control. Samurai creatures you control get +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/c/call_to_the_grave.txt b/forge-gui/res/cardsfolder/c/call_to_the_grave.txt index 978fb4d6c1c..b0574ffce4d 100644 --- a/forge-gui/res/cardsfolder/c/call_to_the_grave.txt +++ b/forge-gui/res/cardsfolder/c/call_to_the_grave.txt @@ -5,7 +5,7 @@ T:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | Execute$ TrigSac | T SVar:TrigSac:DB$ Sacrifice | SacValid$ Creature.nonZombie | Defined$ TriggeredPlayer T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | IsPresent$ Creature | PresentCompare$ EQ0 | Execute$ TrigSacSelf | TriggerDescription$ At the beginning of the end step, if no creatures are on the battlefield, sacrifice CARDNAME. SVar:TrigSacSelf:DB$ Sacrifice | Defined$ Self -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Zombie SVar:Picture:http://www.wizards.com/global/images/magic/general/call_to_the_grave.jpg Oracle:At the beginning of each player's upkeep, that player sacrifices a non-Zombie creature.\nAt the beginning of the end step, if no creatures are on the battlefield, sacrifice Call to the Grave. diff --git a/forge-gui/res/cardsfolder/c/callous_deceiver.txt b/forge-gui/res/cardsfolder/c/callous_deceiver.txt index 2db4944e768..23783e660af 100644 --- a/forge-gui/res/cardsfolder/c/callous_deceiver.txt +++ b/forge-gui/res/cardsfolder/c/callous_deceiver.txt @@ -6,6 +6,6 @@ A:AB$ Dig | Cost$ 1 | DigNum$ 1 | DestinationZone$ Library | LibraryPosition$ 0 A:AB$ Dig | Cost$ 2 | DigNum$ 1 | ActivationLimit$ 1 | Reveal$ True | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | NoMove$ True | RememberRevealed$ True | SubAbility$ TrigPump | SpellDescription$ Reveal the top card of your library. If it's a land card, CARDNAME gets +1/+0 and gains flying until end of turn. Activate this ability only once each turn. SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ 1 | KW$ Flying | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | ConditionCompare$ GE1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/callous_deceiver.jpg Oracle:{1}: Look at the top card of your library.\n{2}: Reveal the top card of your library. If it's a land card, Callous Deceiver gets +1/+0 and gains flying until end of turn. Activate this ability only once each turn. diff --git a/forge-gui/res/cardsfolder/c/callous_oppressor.txt b/forge-gui/res/cardsfolder/c/callous_oppressor.txt index a5a7baa65f6..56a86507fe1 100644 --- a/forge-gui/res/cardsfolder/c/callous_oppressor.txt +++ b/forge-gui/res/cardsfolder/c/callous_oppressor.txt @@ -7,6 +7,6 @@ K:ETBReplacement:Other:DBChooseOpp SVar:DBChooseOpp:DB$ ChoosePlayer | ChoiceTitle$ Choose an opponent | Choices$ Player.Opponent | AILogic$ Curse | SpellDescription$ As CARDNAME enters the battlefield, an opponent chooses a creature type. | SubAbility$ DBChooseType SVar:DBChooseType:DB$ ChooseType | Defined$ Player.Chosen | Type$ Creature | AILogic$ MostProminentComputerControls A:AB$ GainControl | Cost$ T | ValidTgts$ Creature.IsNotChosenType | TgtPrompt$ Select target creature that isn't of the chosen type | LoseControl$ Untap,LeavesPlay | SpellDescription$ Gain control of target creature that isn't of the chosen type for as long as CARDNAME remains tapped. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/callous_oppressor.jpg Oracle:You may choose not to untap Callous Oppressor during your untap step.\nAs Callous Oppressor enters the battlefield, an opponent chooses a creature type.\n{T}: Gain control of target creature that isn't of the chosen type for as long as Callous Oppressor remains tapped. diff --git a/forge-gui/res/cardsfolder/c/calming_licid.txt b/forge-gui/res/cardsfolder/c/calming_licid.txt index e6658df15bc..51ac547bb14 100644 --- a/forge-gui/res/cardsfolder/c/calming_licid.txt +++ b/forge-gui/res/cardsfolder/c/calming_licid.txt @@ -6,6 +6,6 @@ A:AB$ Animate | Cost$ W T | Defined$ Self | RemoveThisAbility$ True | Permanent$ SVar:DBAttach:DB$ Attach | ValidTgts$ Creature | AILogic$ Curse SVar:SPAttach:SP$ Attach | Cost$ 0 | ValidTgts$ Creature S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddHiddenKeyword$ CARDNAME can't attack. | Description$ Enchanted creature can't attack. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/calming_licid.jpg Oracle:{W}, {T}: Calming Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {W} to end this effect.\nEnchanted creature can't attack. diff --git a/forge-gui/res/cardsfolder/c/calming_verse.txt b/forge-gui/res/cardsfolder/c/calming_verse.txt index adc5d27628d..6503e6744dc 100644 --- a/forge-gui/res/cardsfolder/c/calming_verse.txt +++ b/forge-gui/res/cardsfolder/c/calming_verse.txt @@ -3,6 +3,6 @@ ManaCost:3 G Types:Sorcery A:SP$ DestroyAll | Cost$ 3 G | ValidCards$ Enchantment.YouDontCtrl | SubAbility$ DBDestroyAll | SpellDescription$ Destroy all enchantments you don't control. Then if you control an untapped land, destroy all enchantments you control. SVar:DBDestroyAll:DB$DestroyAll | ValidCards$ Enchantment.YouCtrl | ConditionPresent$ Land.untapped+YouCtrl | ConditionCompare$ GE1 | ConditionDescription$ If you control an untapped land, -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/calming_verse.jpg Oracle:Destroy all enchantments you don't control. Then if you control an untapped land, destroy all enchantments you control. diff --git a/forge-gui/res/cardsfolder/c/caltrops.txt b/forge-gui/res/cardsfolder/c/caltrops.txt index 54a95dcaaba..c49bcf1d18e 100644 --- a/forge-gui/res/cardsfolder/c/caltrops.txt +++ b/forge-gui/res/cardsfolder/c/caltrops.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact T:Mode$ Attacks | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a creature attacks, CARDNAME deals 1 damage to it. SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredAttackerLKICopy | NumDmg$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/caltrops.jpg Oracle:Whenever a creature attacks, Caltrops deals 1 damage to it. diff --git a/forge-gui/res/cardsfolder/c/camel.txt b/forge-gui/res/cardsfolder/c/camel.txt index f64b3d9314b..9674b65ff6e 100644 --- a/forge-gui/res/cardsfolder/c/camel.txt +++ b/forge-gui/res/cardsfolder/c/camel.txt @@ -4,6 +4,6 @@ Types:Creature Camel PT:0/1 K:Banding R:Event$ DamageDone | Prevent$ True | ValidSource$ Desert | ValidTarget$ Creature.Self+attacking,Creature.attackersBandedWith | Description$ As long as CARDNAME is attacking, prevent all damage Deserts would deal to Camel and to creatures banded with CARDNAME. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/camel.jpg Oracle:Banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.)\nAs long as Camel is attacking, prevent all damage Deserts would deal to Camel and to creatures banded with Camel. diff --git a/forge-gui/res/cardsfolder/c/candelabra_of_tawnos.txt b/forge-gui/res/cardsfolder/c/candelabra_of_tawnos.txt index f7947c2ecab..43e959593b8 100644 --- a/forge-gui/res/cardsfolder/c/candelabra_of_tawnos.txt +++ b/forge-gui/res/cardsfolder/c/candelabra_of_tawnos.txt @@ -5,6 +5,6 @@ A:AB$ Untap | Cost$ X T | TargetMin$ 0 | TargetMax$ MaxTgts | ValidTgts$ Land | # It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) SVar:X:Targeted$Amount SVar:MaxTgts:Count$Valid Land -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/candelabra_of_tawnos.jpg Oracle:{X}, {T}: Untap X target lands. diff --git a/forge-gui/res/cardsfolder/c/cankerous_thirst.txt b/forge-gui/res/cardsfolder/c/cankerous_thirst.txt index 5f285cb9fdb..a34f1c5d71a 100644 --- a/forge-gui/res/cardsfolder/c/cankerous_thirst.txt +++ b/forge-gui/res/cardsfolder/c/cankerous_thirst.txt @@ -4,7 +4,7 @@ Types:Instant A:SP$ Pump | Cost$ 3 BG | ValidTgts$ Creature | TgtPrompt$ Select target creature to get -3/-3 | Optional$ True | OptionQuestion$ Do you want TARGETS to get -3/-3? | NumAtt$ -3 | NumDef$ -3 | IsCurse$ True | ConditionManaSpent$ B | SubAbility$ GPaid | SpellDescription$ If {B} was spent to cast CARDNAME, you may have target creature get -3/-3 until end of turn. If G was spent to cast CARDNAME, you may have target creature get +3/+3 until end of turn. (Do both if {B}{G} was spent.) SVar:GPaid:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature to get +3/+3 | Optional$ True | OptionQuestion$ Do you want TARGETS to get +3/+3? | NumAtt$ 3 | NumDef$ 3 | ConditionManaSpent$ G SVar:ManaNeededToAvoidNegativeEffect:black -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black SVar:Picture:http://www.wizards.com/global/images/magic/general/cankerous_thirst.jpg Oracle:If {B} was spent to cast Cankerous Thirst, you may have target creature get -3/-3 until end of turn. If {G} was spent to cast Cankerous Thirst, you may have target creature get +3/+3 until end of turn. (Do both if {B}{G} was spent.) diff --git a/forge-gui/res/cardsfolder/c/cannibalize.txt b/forge-gui/res/cardsfolder/c/cannibalize.txt index cafe8ce7f05..8fda73f6eca 100644 --- a/forge-gui/res/cardsfolder/c/cannibalize.txt +++ b/forge-gui/res/cardsfolder/c/cannibalize.txt @@ -6,6 +6,6 @@ SVar:DBChoose:DB$ ChooseCard | Choices$ Card.IsRemembered | ForgetChosen$ True | SVar:ExileChosen:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBPutCounter | StackDescription$ None SVar:DBPutCounter:DB$ PutCounter | Defined$ Remembered | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ DBCleanup | StackDescription$ None SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cannibalize.jpg Oracle:Choose two target creatures controlled by the same player. Exile one of those creatures and put two +1/+1 counters on the other. diff --git a/forge-gui/res/cardsfolder/c/canopy_claws.txt b/forge-gui/res/cardsfolder/c/canopy_claws.txt index 7b3f6c62647..40f9bc370fd 100644 --- a/forge-gui/res/cardsfolder/c/canopy_claws.txt +++ b/forge-gui/res/cardsfolder/c/canopy_claws.txt @@ -3,6 +3,6 @@ ManaCost:G Types:Instant K:Flashback:G A:SP$ Debuff | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | Keywords$ Flying | SpellDescription$ Target creature loses flying until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/canopy_claws.jpg Oracle:Target creature loses flying until end of turn.\nFlashback {G} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/c/cantivore.txt b/forge-gui/res/cardsfolder/c/cantivore.txt index 93ab97668dc..6361c72dfd0 100644 --- a/forge-gui/res/cardsfolder/c/cantivore.txt +++ b/forge-gui/res/cardsfolder/c/cantivore.txt @@ -5,6 +5,6 @@ PT:*/* K:Vigilance S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ CARDNAME's power and toughness are each equal to the number of enchantment cards in all graveyards. SVar:X:Count$TypeInAllYards.Enchantment -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/cantivore.jpg Oracle:Vigilance\nCantivore's power and toughness are each equal to the number of enchantment cards in all graveyards. diff --git a/forge-gui/res/cardsfolder/c/canyon_drake.txt b/forge-gui/res/cardsfolder/c/canyon_drake.txt index 1b65b58f074..78ca576e47d 100644 --- a/forge-gui/res/cardsfolder/c/canyon_drake.txt +++ b/forge-gui/res/cardsfolder/c/canyon_drake.txt @@ -4,6 +4,6 @@ Types:Creature Drake PT:1/2 K:Flying A:AB$ Pump | Cost$ 1 Discard<1/Random> | NumAtt$ +2 | SpellDescription$ CARDNAME gets +2/+0 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/canyon_drake.jpg Oracle:Flying\n{1}, Discard a card at random: Canyon Drake gets +2/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/c/captain_of_the_mists.txt b/forge-gui/res/cardsfolder/c/captain_of_the_mists.txt index 4e4abba2d67..07645497a51 100644 --- a/forge-gui/res/cardsfolder/c/captain_of_the_mists.txt +++ b/forge-gui/res/cardsfolder/c/captain_of_the_mists.txt @@ -5,7 +5,7 @@ PT:2/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other+Human+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigUntap | TriggerDescription$ Whenever another Human enters the battlefield under your control, untap CARDNAME. SVar:TrigUntap:DB$ Untap | Defined$ Self A:AB$ TapOrUntap | Cost$ 1 U T | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | SpellDescription$ You may tap or untap target permanent. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonCombatPriority:7 SVar:Picture:http://www.wizards.com/global/images/magic/general/captain_of_the_mists.jpg Oracle:Whenever another Human enters the battlefield under your control, untap Captain of the Mists.\n{1}{U}, {T}: You may tap or untap target permanent. diff --git a/forge-gui/res/cardsfolder/c/captains_maneuver.txt b/forge-gui/res/cardsfolder/c/captains_maneuver.txt index d66b2188939..2a0b00e3323 100644 --- a/forge-gui/res/cardsfolder/c/captains_maneuver.txt +++ b/forge-gui/res/cardsfolder/c/captains_maneuver.txt @@ -14,6 +14,6 @@ SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True | ClearChosenPlayer$ True SVar:X:Count$xPaid #X Will get overwritten by Announce SVar:Y:Number$0 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/captains_maneuver.jpg Oracle:The next X damage that would be dealt to target creature, planeswalker, or player this turn is dealt to another target creature, planeswalker, or player instead. diff --git a/forge-gui/res/cardsfolder/c/captivating_vampire.txt b/forge-gui/res/cardsfolder/c/captivating_vampire.txt index 7039a2138fc..b27c02cbfff 100644 --- a/forge-gui/res/cardsfolder/c/captivating_vampire.txt +++ b/forge-gui/res/cardsfolder/c/captivating_vampire.txt @@ -5,6 +5,6 @@ PT:2/2 S:Mode$ Continuous | Affected$ Creature.Vampire+Other+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Other Vampire creatures you control get +1/+1. A:AB$ GainControl | Cost$ tapXType<5/Vampire> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ Animate | SpellDescription$ Gain control of target creature. It becomes a Vampire in addition to its other types. SVar:Animate:DB$Animate | Defined$ Targeted | Types$ Vampire | Permanent$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/captivating_vampire.jpg Oracle:Other Vampire creatures you control get +1/+1.\nTap five untapped Vampires you control: Gain control of target creature. It becomes a Vampire in addition to its other types. diff --git a/forge-gui/res/cardsfolder/c/caregiver.txt b/forge-gui/res/cardsfolder/c/caregiver.txt index ef6d1547d82..8640fe734d7 100644 --- a/forge-gui/res/cardsfolder/c/caregiver.txt +++ b/forge-gui/res/cardsfolder/c/caregiver.txt @@ -3,6 +3,6 @@ ManaCost:W Types:Creature Human Cleric PT:1/1 A:AB$ PreventDamage | Cost$ W Sac<1/Creature> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to any target this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/caregiver.jpg Oracle:{W}, Sacrifice a creature: Prevent the next 1 damage that would be dealt to any target this turn. diff --git a/forge-gui/res/cardsfolder/c/carnage_altar.txt b/forge-gui/res/cardsfolder/c/carnage_altar.txt index d1fa7692140..5444ed86512 100644 --- a/forge-gui/res/cardsfolder/c/carnage_altar.txt +++ b/forge-gui/res/cardsfolder/c/carnage_altar.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact A:AB$ Draw | Cost$ 3 Sac<1/Creature> | NumCards$ 1 | SpellDescription$ Draw a card. SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/carnage_altar.jpg Oracle:{3}, Sacrifice a creature: Draw a card. diff --git a/forge-gui/res/cardsfolder/c/carnival_of_souls.txt b/forge-gui/res/cardsfolder/c/carnival_of_souls.txt index 4e9bd758450..7e87408c93f 100644 --- a/forge-gui/res/cardsfolder/c/carnival_of_souls.txt +++ b/forge-gui/res/cardsfolder/c/carnival_of_souls.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever a creature enters the battlefield, you lose 1 life and add {B}. SVar:TrigLoseLife:DB$ LoseLife | Defined$ You | LifeAmount$ 1 | SubAbility$ DBMana SVar:DBMana:DB$Mana | Produced$ B -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/carnival_of_souls.jpg Oracle:Whenever a creature enters the battlefield, you lose 1 life and add {B}. diff --git a/forge-gui/res/cardsfolder/c/carom.txt b/forge-gui/res/cardsfolder/c/carom.txt index fbd3afa56f3..7b7cc513de3 100644 --- a/forge-gui/res/cardsfolder/c/carom.txt +++ b/forge-gui/res/cardsfolder/c/carom.txt @@ -8,6 +8,6 @@ SVar:CaromDmg:DB$ ReplaceSplitDamage | DamageTarget$ Imprinted SVar:OutOfSight:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Defined$ Imprinted | Execute$ ExileEffect | Static$ True SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBDraw:DB$ Draw | NumCards$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/carom.jpg Oracle:The next 1 damage that would be dealt to target creature this turn is dealt to another target creature instead.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/c/carpet_of_flowers.txt b/forge-gui/res/cardsfolder/c/carpet_of_flowers.txt index 191cf5de2ec..aa6e84e23f9 100644 --- a/forge-gui/res/cardsfolder/c/carpet_of_flowers.txt +++ b/forge-gui/res/cardsfolder/c/carpet_of_flowers.txt @@ -11,7 +11,7 @@ T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.S SVar:TrigReset:DB$ StoreSVar | SVar$ CarpetX | Type$ Number | Expression$ 0 SVar:NumManaMax:Count$Valid Island.RememberedPlayerCtrl SVar:CarpetX:Number$0 -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/carpet_of_flowers.jpg Oracle:At the beginning of each of your main phases, if you haven't added mana with this ability this turn, you may add X mana of any one color, where X is the number of Islands target opponent controls. diff --git a/forge-gui/res/cardsfolder/c/carrion.txt b/forge-gui/res/cardsfolder/c/carrion.txt index 4d8319f1539..fa937924c35 100644 --- a/forge-gui/res/cardsfolder/c/carrion.txt +++ b/forge-gui/res/cardsfolder/c/carrion.txt @@ -3,6 +3,6 @@ ManaCost:1 B B Types:Instant A:SP$ Token | Cost$ 1 B B Sac<1/Creature> | TokenName$ Insect | TokenColors$ Black | TokenTypes$ Creature,Insect | TokenPower$ 0 | TokenToughness$ 1 | TokenOwner$ You | TokenAmount$ X | References$ X | SpellDescription$ Create X 0/1 black Insect creature tokens, where X is the sacrificed creature's power. SVar:X:Sacrificed$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/carrion.jpg Oracle:As an additional cost to cast this spell, sacrifice a creature.\nCreate X 0/1 black Insect creature tokens, where X is the sacrificed creature's power. diff --git a/forge-gui/res/cardsfolder/c/carrion_rats.txt b/forge-gui/res/cardsfolder/c/carrion_rats.txt index 0e049ef7b4b..74c2242a637 100644 --- a/forge-gui/res/cardsfolder/c/carrion_rats.txt +++ b/forge-gui/res/cardsfolder/c/carrion_rats.txt @@ -5,6 +5,6 @@ PT:2/1 T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigNoCombatDamage | TriggerDescription$ Whenever CARDNAME attacks or blocks, any player may exile a card from their graveyard. If a player does, CARDNAME assigns no combat damage this turn. T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigNoCombatDamage | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or blocks, any player may exile a card from their graveyard. If a player does, CARDNAME assigns no combat damage this turn. SVar:TrigNoCombatDamage:DB$ Pump | Defined$ Self | KW$ HIDDEN CARDNAME assigns no combat damage | UnlessCost$ ExileFromGrave<1/Card> | UnlessPayer$ Player | UnlessSwitched$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/carrion_rats.jpg Oracle:Whenever Carrion Rats attacks or blocks, any player may exile a card from their graveyard. If a player does, Carrion Rats assigns no combat damage this turn. diff --git a/forge-gui/res/cardsfolder/c/cartel_aristocrat.txt b/forge-gui/res/cardsfolder/c/cartel_aristocrat.txt index 5b94cfeddb6..13747bfbfd8 100644 --- a/forge-gui/res/cardsfolder/c/cartel_aristocrat.txt +++ b/forge-gui/res/cardsfolder/c/cartel_aristocrat.txt @@ -3,6 +3,6 @@ ManaCost:W B Types:Creature Human Advisor PT:2/2 A:AB$ Protection | Cost$ Sac<1/Creature.Other/another creature> | Gains$ Choice | Choices$ AnyColor | SpellDescription$ CARDNAME gains protection from the color of your choice until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cartel_aristocrat.jpg Oracle:Sacrifice another creature: Cartel Aristocrat gains protection from the color of your choice until end of turn. diff --git a/forge-gui/res/cardsfolder/c/cascade_bluffs.txt b/forge-gui/res/cardsfolder/c/cascade_bluffs.txt index e26bfb2c516..9f91dc3f0c5 100644 --- a/forge-gui/res/cardsfolder/c/cascade_bluffs.txt +++ b/forge-gui/res/cardsfolder/c/cascade_bluffs.txt @@ -5,6 +5,6 @@ A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ UR T | Produced$ U | Amount$ 2 | SpellDescription$ Add {U}{U}. A:AB$ Mana | Cost$ UR T | Produced$ U R | SpellDescription$ Add {U}{R}. A:AB$ Mana | Cost$ UR T | Produced$ R | Amount$ 2 | SpellDescription$ Add {R}{R}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cascade_bluffs.jpg Oracle:{T}: Add {C}.\n{U/R}, {T}: Add {U}{U}, {U}{R}, or {R}{R}. diff --git a/forge-gui/res/cardsfolder/c/castle_sengir.txt b/forge-gui/res/cardsfolder/c/castle_sengir.txt index 6529591c94d..28ca8d9c9ec 100644 --- a/forge-gui/res/cardsfolder/c/castle_sengir.txt +++ b/forge-gui/res/cardsfolder/c/castle_sengir.txt @@ -5,6 +5,6 @@ A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ 1 T | Produced$ B | SpellDescription$ Add {B}. A:AB$ Mana | Cost$ 2 T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Mana | Cost$ 2 T | Produced$ R | SpellDescription$ Add {R}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/castle_sengir.jpg Oracle:{T}: Add {C}.\n{1}, {T}: Add {B}.\n{2}, {T}: Add {U} or {R}. diff --git a/forge-gui/res/cardsfolder/c/cataclysm.txt b/forge-gui/res/cardsfolder/c/cataclysm.txt index 9fc769f5458..50fae0df825 100644 --- a/forge-gui/res/cardsfolder/c/cataclysm.txt +++ b/forge-gui/res/cardsfolder/c/cataclysm.txt @@ -8,6 +8,6 @@ SVar:ChooseEnch:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Ench SVar:ChooseLand:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Land.RememberedPlayerCtrl | ChoiceTitle$ Choose a land to keep | RememberChosen$ True | Mandatory$ True SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Permanent.IsNotRemembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cataclysm.jpg Oracle:Each player chooses from among the permanents they control an artifact, a creature, an enchantment, and a land, then sacrifices the rest. diff --git a/forge-gui/res/cardsfolder/c/cataclysmic_gearhulk.txt b/forge-gui/res/cardsfolder/c/cataclysmic_gearhulk.txt index c5f5e70733d..6412c3fe5b0 100644 --- a/forge-gui/res/cardsfolder/c/cataclysmic_gearhulk.txt +++ b/forge-gui/res/cardsfolder/c/cataclysmic_gearhulk.txt @@ -11,6 +11,6 @@ SVar:ChooseEnch:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Ench SVar:ChoosePW:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Planeswalker.nonLand+RememberedPlayerCtrl | ChoiceTitle$ Choose a Planeswalker to keep | RememberChosen$ True | Mandatory$ True SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Permanent.nonLand+IsNotRemembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cataclysmic_gearhulk.jpg Oracle:Vigilance\nWhen Cataclysmic Gearhulk enters the battlefield, each player chooses an artifact, a creature, an enchantment, and a planeswalker from among the nonland permanents they control, then sacrifices the rest. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/c/catalyst_stone.txt b/forge-gui/res/cardsfolder/c/catalyst_stone.txt index c57a7330e1e..bb6cb3e32d2 100644 --- a/forge-gui/res/cardsfolder/c/catalyst_stone.txt +++ b/forge-gui/res/cardsfolder/c/catalyst_stone.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact S:Mode$ ReduceCost | ValidCard$ Card | ValidSpell$ Spell.Flashback | Activator$ You | Amount$ 2 | Description$ Flashback costs you pay cost up to {2} less. S:Mode$ RaiseCost | ValidCard$ Card | ValidSpell$ Spell.Flashback | Activator$ Opponent | Amount$ 2 | Description$ Flashback costs your opponents pay cost {2} more. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/catalyst_stone.jpg Oracle:Flashback costs you pay cost up to {2} less.\nFlashback costs your opponents pay cost {2} more. diff --git a/forge-gui/res/cardsfolder/c/catapult_master.txt b/forge-gui/res/cardsfolder/c/catapult_master.txt index b2e027b28b5..86c125637fe 100644 --- a/forge-gui/res/cardsfolder/c/catapult_master.txt +++ b/forge-gui/res/cardsfolder/c/catapult_master.txt @@ -3,6 +3,6 @@ ManaCost:3 W W Types:Creature Human Soldier PT:3/3 A:AB$ ChangeZone | Cost$ tapXType<5/Soldier> | ValidTgts$ Creature | TgtPrompt$ Select target Creature | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target creature. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/catapult_master.jpg Oracle:Tap five untapped Soldiers you control: Exile target creature. diff --git a/forge-gui/res/cardsfolder/c/cateran_brute.txt b/forge-gui/res/cardsfolder/c/cateran_brute.txt index 0c5ad952059..66196dbed00 100644 --- a/forge-gui/res/cardsfolder/c/cateran_brute.txt +++ b/forge-gui/res/cardsfolder/c/cateran_brute.txt @@ -3,6 +3,6 @@ ManaCost:2 B Types:Creature Horror Mercenary PT:2/2 A:AB$ ChangeZone | Cost$ 2 T | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Mercenary+cmcLE2 | ChangeNum$ 1 | SpellDescription$ Search your library for a Mercenary permanent card with converted mana cost 2 or less, put it onto the battlefield, then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/cateran_brute.jpg Oracle:{2}, {T}: Search your library for a Mercenary permanent card with converted mana cost 2 or less, put it onto the battlefield, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/c/cateran_enforcer.txt b/forge-gui/res/cardsfolder/c/cateran_enforcer.txt index 8655204b507..fffe9675d4a 100644 --- a/forge-gui/res/cardsfolder/c/cateran_enforcer.txt +++ b/forge-gui/res/cardsfolder/c/cateran_enforcer.txt @@ -4,6 +4,6 @@ Types:Creature Horror Mercenary PT:4/3 K:Fear A:AB$ ChangeZone | Cost$ 4 T | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Mercenary+cmcLE4 | ChangeNum$ 1 | SpellDescription$ Search your library for a Mercenary permanent card with converted mana cost 4 or less, put it onto the battlefield, then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/cateran_enforcer.jpg Oracle:Fear (This creature can't be blocked except by artifact creatures and/or black creatures.)\n{4}, {T}: Search your library for a Mercenary permanent card with converted mana cost 4 or less, put it onto the battlefield, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/c/cateran_kidnappers.txt b/forge-gui/res/cardsfolder/c/cateran_kidnappers.txt index 4803207d4f1..58759c1820a 100644 --- a/forge-gui/res/cardsfolder/c/cateran_kidnappers.txt +++ b/forge-gui/res/cardsfolder/c/cateran_kidnappers.txt @@ -3,6 +3,6 @@ ManaCost:2 B B Types:Creature Human Mercenary PT:4/2 A:AB$ ChangeZone | Cost$ 3 T | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Mercenary+cmcLE3 | ChangeNum$ 1 | SpellDescription$ Search your library for a Mercenary permanent card with converted mana cost 3 or less, put it onto the battlefield, then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/cateran_kidnappers.jpg Oracle:{3}, {T}: Search your library for a Mercenary permanent card with converted mana cost 3 or less, put it onto the battlefield, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/c/cateran_overlord.txt b/forge-gui/res/cardsfolder/c/cateran_overlord.txt index 78f5423a5b9..45d9327d1c1 100644 --- a/forge-gui/res/cardsfolder/c/cateran_overlord.txt +++ b/forge-gui/res/cardsfolder/c/cateran_overlord.txt @@ -4,6 +4,6 @@ Types:Creature Horror Mercenary PT:7/5 A:AB$ ChangeZone | Cost$ 6 T | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Mercenary+cmcLE6 | ChangeNum$ 1 | SpellDescription$ Search your library for a Mercenary permanent card with converted mana cost 6 or less, put it onto the battlefield, then shuffle your library. A:AB$ Regenerate | Cost$ Sac<1/Creature> | SpellDescription$ Regenerate CARDNAME. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/cateran_overlord.jpg Oracle:Sacrifice a creature: Regenerate Cateran Overlord.\n{6}, {T}: Search your library for a Mercenary permanent card with converted mana cost 6 or less, put it onto the battlefield, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/c/cateran_persuader.txt b/forge-gui/res/cardsfolder/c/cateran_persuader.txt index 440ca85f078..459d9c7d9d4 100644 --- a/forge-gui/res/cardsfolder/c/cateran_persuader.txt +++ b/forge-gui/res/cardsfolder/c/cateran_persuader.txt @@ -3,6 +3,6 @@ ManaCost:B B Types:Creature Human Mercenary PT:2/1 A:AB$ ChangeZone | Cost$ 1 T | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Mercenary+cmcLE1 | ChangeNum$ 1 | SpellDescription$ Search your library for a Mercenary permanent card with converted mana cost 1 or less, put it onto the battlefield, then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/cateran_persuader.jpg Oracle:{1}, {T}: Search your library for a Mercenary permanent card with converted mana cost 1 or less, put it onto the battlefield, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/c/cateran_slaver.txt b/forge-gui/res/cardsfolder/c/cateran_slaver.txt index 219c87ebb24..8ffdce7b38b 100644 --- a/forge-gui/res/cardsfolder/c/cateran_slaver.txt +++ b/forge-gui/res/cardsfolder/c/cateran_slaver.txt @@ -4,6 +4,6 @@ Types:Creature Horror Mercenary PT:5/5 K:Swampwalk A:AB$ ChangeZone | Cost$ 5 T | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Mercenary+cmcLE5 | ChangeNum$ 1 | SpellDescription$ Search your library for a Mercenary permanent card with converted mana cost 5 or less, put it onto the battlefield, then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/cateran_slaver.jpg Oracle:Swampwalk\n{5}, {T}: Search your library for a Mercenary permanent card with converted mana cost 5 or less, put it onto the battlefield, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/c/cateran_summons.txt b/forge-gui/res/cardsfolder/c/cateran_summons.txt index 42849ada5ea..3d309f6f8a6 100644 --- a/forge-gui/res/cardsfolder/c/cateran_summons.txt +++ b/forge-gui/res/cardsfolder/c/cateran_summons.txt @@ -2,6 +2,6 @@ Name:Cateran Summons ManaCost:B Types:Sorcery A:SP$ ChangeZone | Cost$ B | Origin$ Library | Destination$ Hand | ChangeType$ Mercenary | ChangeNum$ 1 | SpellDescription$ Search your library for a Mercenary card, reveal that card, and put it into your hand. Then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/cateran_summons.jpg Oracle:Search your library for a Mercenary card, reveal that card, and put it into your hand. Then shuffle your library. diff --git a/forge-gui/res/cardsfolder/c/cathedral_of_serra.txt b/forge-gui/res/cardsfolder/c/cathedral_of_serra.txt index d0a5584f50d..f4f9f9ee6a2 100644 --- a/forge-gui/res/cardsfolder/c/cathedral_of_serra.txt +++ b/forge-gui/res/cardsfolder/c/cathedral_of_serra.txt @@ -2,7 +2,7 @@ Name:Cathedral of Serra ManaCost:no cost Types:Land S:Mode$ Continuous | Affected$ Creature.White+Legendary | AddKeyword$ Bands with Other Legendary Creatures | Description$ White legendary creatures you control have "bands with other legendary creatures." (Any legendary creatures can attack in a band as long as at least one has "bands with other legendary creatures." Bands are blocked as a group. If at least two legendary creatures you control, one of which has "bands with other legendary creatures," are blocking or being blocked by the same creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/cathedral_of_serra.jpg Oracle:White legendary creatures you control have "bands with other legendary creatures." (Any legendary creatures can attack in a band as long as at least one has "bands with other legendary creatures." Bands are blocked as a group. If at least two legendary creatures you control, one of which has "bands with other legendary creatures," are blocking or being blocked by the same creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/c/cauldron_of_souls.txt b/forge-gui/res/cardsfolder/c/cauldron_of_souls.txt index 4eb0631e5ac..1dcf32ee122 100644 --- a/forge-gui/res/cardsfolder/c/cauldron_of_souls.txt +++ b/forge-gui/res/cardsfolder/c/cauldron_of_souls.txt @@ -3,6 +3,6 @@ ManaCost:5 Types:Artifact A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ X | TgtPrompt$ Select target creature | KW$ Persist | References$ X | SpellDescription$ Choose any number of target creatures. Each of those creatures gains persist until end of turn. SVar:X:Count$Valid Creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cauldron_of_souls.jpg Oracle:{T}: Choose any number of target creatures. Each of those creatures gains persist until end of turn. (When it dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.) diff --git a/forge-gui/res/cardsfolder/c/caverns_of_despair.txt b/forge-gui/res/cardsfolder/c/caverns_of_despair.txt index 504e9e4ea87..cdb10d09488 100644 --- a/forge-gui/res/cardsfolder/c/caverns_of_despair.txt +++ b/forge-gui/res/cardsfolder/c/caverns_of_despair.txt @@ -4,6 +4,6 @@ Types:World Enchantment K:No more than two creatures can attack each combat. S:Mode$ Continuous | GlobalRule$ No more than two creatures can block each combat. | Description$ No more than two creatures can block each combat. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/caverns_of_despair.jpg Oracle:No more than two creatures can attack each combat.\nNo more than two creatures can block each combat. diff --git a/forge-gui/res/cardsfolder/c/celestial_convergence.txt b/forge-gui/res/cardsfolder/c/celestial_convergence.txt index 6a8e00c95d9..9457d1ba7ba 100644 --- a/forge-gui/res/cardsfolder/c/celestial_convergence.txt +++ b/forge-gui/res/cardsfolder/c/celestial_convergence.txt @@ -9,6 +9,6 @@ SVar:GameIsADraw:DB$ GameDrawn | ConditionPresent$ Card.Self+counters_EQ0_OMEN | SVar:Picture:http://www.wizards.com/global/images/magic/general/celestial_convergence.jpg SVar:X:PlayerCountPlayers$HighestLifeTotal SVar:NumHighestLife:PlayerCountPlayers$TiedForHighestLife -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All Oracle:Celestial Convergence enters the battlefield with seven omen counters on it.\nAt the beginning of your upkeep, remove an omen counter from Celestial Convergence. If there are no omen counters on Celestial Convergence, the player with the highest life total wins the game. If two or more players are tied for highest life total, the game is a draw. diff --git a/forge-gui/res/cardsfolder/c/celestial_dawn.txt b/forge-gui/res/cardsfolder/c/celestial_dawn.txt index c3521f84c52..d11697c5860 100644 --- a/forge-gui/res/cardsfolder/c/celestial_dawn.txt +++ b/forge-gui/res/cardsfolder/c/celestial_dawn.txt @@ -7,6 +7,6 @@ S:Mode$ Continuous | Affected$ Card.YouCtrl+nonLand | SetColor$ White | Affected S:Mode$ Continuous | Affected$ You | ManaColorConversion$ Additive | WhiteConversion$ All | Description$ You may spend white mana as though it were mana of any color. S:Mode$ Continuous | Affected$ You | ManaColorConversion$ Restrictive | BlueConversion$ Colorless | BlackConversion$ Colorless | RedConversion$ Colorless | GreenConversion$ Colorless | ColorlessConversion$ Colorless | Description$ You may spend other mana only as though it were colorless mana. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/celestial_dawn.jpg Oracle:Lands you control are Plains.\nNonland permanents you control are white. The same is true for spells you control and nonland cards you own that aren't on the battlefield.\nYou may spend white mana as though it were mana of any color. You may spend other mana only as though it were colorless mana. diff --git a/forge-gui/res/cardsfolder/c/celestial_kirin.txt b/forge-gui/res/cardsfolder/c/celestial_kirin.txt index 6626954f97d..eaf03aea033 100644 --- a/forge-gui/res/cardsfolder/c/celestial_kirin.txt +++ b/forge-gui/res/cardsfolder/c/celestial_kirin.txt @@ -6,7 +6,7 @@ K:Flying T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDestroyAll | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, destroy all permanents with that spell's converted mana cost. SVar:TrigDestroyAll:DB$DestroyAll | ValidCards$ Permanent.cmcEQX | References$ X SVar:X:TriggerCount$CastSACMC -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/celestial_kirin.jpg Oracle:Flying\nWhenever you cast a Spirit or Arcane spell, destroy all permanents with that spell's converted mana cost. diff --git a/forge-gui/res/cardsfolder/c/celestial_prism.txt b/forge-gui/res/cardsfolder/c/celestial_prism.txt index 9f449cd5fe7..932d06b0f72 100644 --- a/forge-gui/res/cardsfolder/c/celestial_prism.txt +++ b/forge-gui/res/cardsfolder/c/celestial_prism.txt @@ -2,6 +2,6 @@ Name:Celestial Prism ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ 2 T | Produced$ Any | SpellDescription$ Add one mana of any color. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/celestial_prism.jpg Oracle:{2}, {T}: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/c/cemetery_puca.txt b/forge-gui/res/cardsfolder/c/cemetery_puca.txt index 32881d40dc6..6bc8c257d6a 100644 --- a/forge-gui/res/cardsfolder/c/cemetery_puca.txt +++ b/forge-gui/res/cardsfolder/c/cemetery_puca.txt @@ -5,6 +5,6 @@ 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. SVar:CemeteryPucaCopy:AB$ Clone | Cost$ 1 | Defined$ TriggeredCardLKICopy | GainThisAbility$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All 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. diff --git a/forge-gui/res/cardsfolder/c/centaur_garden.txt b/forge-gui/res/cardsfolder/c/centaur_garden.txt index 7c2c8e4c133..225b86d1063 100644 --- a/forge-gui/res/cardsfolder/c/centaur_garden.txt +++ b/forge-gui/res/cardsfolder/c/centaur_garden.txt @@ -4,6 +4,6 @@ Types:Land A:AB$ Mana | Cost$ T | Produced$ G | SubAbility$ DBPain | SpellDescription$ Add {G}. CARDNAME deals 1 damage to you. A:AB$ Pump | Cost$ G T Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ 3 | NumDef$ 3 | Activation$ Threshold | PrecostDesc$ Threshold — | SpellDescription$ Target creature gets +3/+3 until end of turn. Activate this ability only if seven or more cards are in your graveyard. SVar:DBPain:DB$ DealDamage | NumDmg$ 1 | Defined$ You -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/centaur_garden.jpg Oracle:{T}: Add {G}. Centaur Garden deals 1 damage to you.\nThreshold — {G}, {T}, Sacrifice Centaur Garden: Target creature gets +3/+3 until end of turn. Activate this ability only if seven or more cards are in your graveyard. diff --git a/forge-gui/res/cardsfolder/c/centaur_vinecrasher.txt b/forge-gui/res/cardsfolder/c/centaur_vinecrasher.txt index f83eff3c4e1..5db138958a5 100644 --- a/forge-gui/res/cardsfolder/c/centaur_vinecrasher.txt +++ b/forge-gui/res/cardsfolder/c/centaur_vinecrasher.txt @@ -7,6 +7,6 @@ K:etbCounter:P1P1:X:no Condition:CARDNAME enters the battlefield with a +1/+1 co T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | TriggerZones$ Graveyard | ValidCard$ Card.nonToken+Land | Execute$ TrigReturn | TriggerDescription$ Whenever a land card is put into a graveyard from anywhere, you may pay {G}{G}. If you do, return CARDNAME from your graveyard to your hand. SVar:TrigReturn:AB$ ChangeZone | Cost$ G G | Defined$ Self | Origin$ Graveyard | Destination$ Hand SVar:X:Count$LastStateGraveyard Land -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/centaur_vinecrasher.jpg Oracle:Trample\nCentaur Vinecrasher enters the battlefield with a number of +1/+1 counters on it equal to the number of land cards in all graveyards.\nWhenever a land card is put into a graveyard from anywhere, you may pay {G}{G}. If you do, return Centaur Vinecrasher from your graveyard to your hand. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/c/cephalid_aristocrat.txt b/forge-gui/res/cardsfolder/c/cephalid_aristocrat.txt index 61b060d5cf7..5fc8bfa0a5d 100644 --- a/forge-gui/res/cardsfolder/c/cephalid_aristocrat.txt +++ b/forge-gui/res/cardsfolder/c/cephalid_aristocrat.txt @@ -4,6 +4,6 @@ Types:Creature Cephalid PT:3/3 T:Mode$ BecomesTarget | ValidTarget$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigMill | TriggerDescription$ Whenever CARDNAME becomes the target of a spell or ability, put the top two cards of your library into your graveyard. SVar:TrigMill:DB$Mill | NumCards$ 2 | Defined$ You -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/cephalid_aristocrat.jpg Oracle:Whenever Cephalid Aristocrat becomes the target of a spell or ability, put the top two cards of your library into your graveyard. diff --git a/forge-gui/res/cardsfolder/c/cephalid_broker.txt b/forge-gui/res/cardsfolder/c/cephalid_broker.txt index d0be4a60da1..f658d55a8ca 100644 --- a/forge-gui/res/cardsfolder/c/cephalid_broker.txt +++ b/forge-gui/res/cardsfolder/c/cephalid_broker.txt @@ -4,6 +4,6 @@ Types:Creature Cephalid PT:2/2 A:AB$ Draw | Cost$ T | NumCards$ 2 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player draws two cards, then discards two cards. | SubAbility$ DBDiscard SVar:DBDiscard:DB$ Discard | Defined$ Targeted | NumCards$ 2 | Mode$ TgtChoose -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cephalid_broker.jpg Oracle:{T}: Target player draws two cards, then discards two cards. diff --git a/forge-gui/res/cardsfolder/c/cephalid_coliseum.txt b/forge-gui/res/cardsfolder/c/cephalid_coliseum.txt index 65e6698ad98..784f2608658 100644 --- a/forge-gui/res/cardsfolder/c/cephalid_coliseum.txt +++ b/forge-gui/res/cardsfolder/c/cephalid_coliseum.txt @@ -5,6 +5,6 @@ A:AB$ Mana | Cost$ T | Produced$ U | SubAbility$ DBPain | SpellDescription$ Add A:AB$ Draw | Cost$ U T Sac<1/CARDNAME> | ValidTgts$ Player | TgtPrompt$ Select target player | NumCards$ 3 | Activation$ Threshold | PrecostDesc$ Threshold — | SpellDescription$ Target player draws three cards, then discards three cards. Activate this ability only if seven or more cards are in your graveyard. | SubAbility$ DBDiscard SVar:DBDiscard:DB$ Discard | NumCards$ 3 | Mode$ TgtChoose | Defined$ Targeted SVar:DBPain:DB$ DealDamage | NumDmg$ 1 | Defined$ You -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/cephalid_coliseum.jpg Oracle:{T}: Add {U}. Cephalid Coliseum deals 1 damage to you.\nThreshold — {U}, {T}, Sacrifice Cephalid Coliseum: Target player draws three cards, then discards three cards. Activate this ability only if seven or more cards are in your graveyard. diff --git a/forge-gui/res/cardsfolder/c/cephalid_illusionist.txt b/forge-gui/res/cardsfolder/c/cephalid_illusionist.txt index aee89b942be..e07975cbacf 100644 --- a/forge-gui/res/cardsfolder/c/cephalid_illusionist.txt +++ b/forge-gui/res/cardsfolder/c/cephalid_illusionist.txt @@ -5,6 +5,6 @@ PT:1/1 T:Mode$ BecomesTarget | ValidTarget$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigMill | TriggerDescription$ Whenever CARDNAME becomes the target of a spell or ability, put the top three cards of your library into your graveyard. A:AB$ Pump | Cost$ 2 U T | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | KW$ Prevent all combat damage that would be dealt to and dealt by CARDNAME. | SpellDescription$ Prevent all combat damage that would be dealt to and dealt by target creature you control this turn. SVar:TrigMill:DB$Mill | NumCards$ 3 | Defined$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cephalid_illusionist.jpg Oracle:Whenever Cephalid Illusionist becomes the target of a spell or ability, put the top three cards of your library into your graveyard.\n{2}{U}, {T}: Prevent all combat damage that would be dealt to and dealt by target creature you control this turn. diff --git a/forge-gui/res/cardsfolder/c/cephalid_inkshrouder.txt b/forge-gui/res/cardsfolder/c/cephalid_inkshrouder.txt index 1b6388ac657..de261e0db1e 100644 --- a/forge-gui/res/cardsfolder/c/cephalid_inkshrouder.txt +++ b/forge-gui/res/cardsfolder/c/cephalid_inkshrouder.txt @@ -3,7 +3,7 @@ ManaCost:2 U Types:Creature Cephalid PT:2/1 A:AB$ Pump | Cost$ Discard<1/Card> | Defined$ Self | KW$ Shroud & HIDDEN Unblockable | SpellDescription$ CARDNAME gains shroud until end of turn and can't be blocked this turn. (A creature with shroud can't be the target of spells or abilities.) -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:AIPreference:DiscardCost$Card.cmcEQ1,Card.cmcEQ2 SVar:Picture:http://www.wizards.com/global/images/magic/general/cephalid_inkshrouder.jpg Oracle:Discard a card: Cephalid Inkshrouder gains shroud until end of turn and can't be blocked this turn. (A creature with shroud can't be the target of spells or abilities.) diff --git a/forge-gui/res/cardsfolder/c/cephalid_shrine.txt b/forge-gui/res/cardsfolder/c/cephalid_shrine.txt index d1c3f882a32..04e2320f6cf 100644 --- a/forge-gui/res/cardsfolder/c/cephalid_shrine.txt +++ b/forge-gui/res/cardsfolder/c/cephalid_shrine.txt @@ -6,6 +6,6 @@ SVar:TrigCounterRem:DB$ Pump | RememberObjects$ TriggeredCard | SubAbility$ DBCo SVar:DBCounter:DB$ Counter | Defined$ TriggeredSpellAbility | UnlessCost$ X | UnlessPayer$ TriggeredActivator | References$ X | SubAbility$ DBCleanup SVar:X:Count$ValidGraveyard Card.sharesNameWith Remembered SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/cephalid_shrine.jpg Oracle:Whenever a player casts a spell, counter that spell unless that player pays {X}, where X is the number of cards in all graveyards with the same name as the spell. diff --git a/forge-gui/res/cardsfolder/c/cephalid_snitch.txt b/forge-gui/res/cardsfolder/c/cephalid_snitch.txt index db8f3dad123..490df13950f 100644 --- a/forge-gui/res/cardsfolder/c/cephalid_snitch.txt +++ b/forge-gui/res/cardsfolder/c/cephalid_snitch.txt @@ -3,7 +3,7 @@ ManaCost:1 U Types:Creature Cephalid Wizard PT:1/1 A:AB$ Debuff | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | Keywords$ Protection from black | SpellDescription$ Target creature loses protection from black until end of turn. -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cephalid_snitch.jpg Oracle:Sacrifice Cephalid Snitch: Target creature loses protection from black until end of turn. diff --git a/forge-gui/res/cardsfolder/c/cephalid_vandal.txt b/forge-gui/res/cardsfolder/c/cephalid_vandal.txt index a751a53872f..0464cc2f7b4 100644 --- a/forge-gui/res/cardsfolder/c/cephalid_vandal.txt +++ b/forge-gui/res/cardsfolder/c/cephalid_vandal.txt @@ -6,6 +6,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ SHRED | CounterNum$ 1 | SubAbility$ DBMill SVar:DBMill:DB$ Mill | Defined$ You | NumCards$ X | References$ X SVar:X:Count$CardCounters.SHRED -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/cephalid_vandal.jpg Oracle:At the beginning of your upkeep, put a shred counter on Cephalid Vandal. Then put the top card of your library into your graveyard for each shred counter on Cephalid Vandal. diff --git a/forge-gui/res/cardsfolder/c/cerebral_vortex.txt b/forge-gui/res/cardsfolder/c/cerebral_vortex.txt index c213b47e8a4..e34238e561d 100644 --- a/forge-gui/res/cardsfolder/c/cerebral_vortex.txt +++ b/forge-gui/res/cardsfolder/c/cerebral_vortex.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Draw | Cost$ 1 U R | NumCards$ 2 | ValidTgts$ Player | TgtPrompt$ Choose a player | SubAbility$ DBDamage | SpellDescription$ Target player draws two cards, then CARDNAME deals damage to that player equal to the number of cards they've drawn this turn. SVar:DBDamage:DB$DealDamage | Defined$ Targeted | NumDmg$ X | References$ X SVar:X:TargetedPlayer$CardsDrawn -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cerebral_vortex.jpg Oracle:Target player draws two cards, then Cerebral Vortex deals damage to that player equal to the number of cards they've drawn this turn. diff --git a/forge-gui/res/cardsfolder/c/cerulean_wisps.txt b/forge-gui/res/cardsfolder/c/cerulean_wisps.txt index 19766bcfd12..f5de3e98a9f 100644 --- a/forge-gui/res/cardsfolder/c/cerulean_wisps.txt +++ b/forge-gui/res/cardsfolder/c/cerulean_wisps.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Animate | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Colors$ Blue | OverwriteColors$ True | SubAbility$ DBUntap | SpellDescription$ Target creature becomes blue until end of turn. Untap that creature. Draw a card. SVar:DBUntap:DB$Untap | Defined$ Targeted | SubAbility$ DBDraw SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cerulean_wisps.jpg Oracle:Target creature becomes blue until end of turn. Untap that creature.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/c/ceta_disciple.txt b/forge-gui/res/cardsfolder/c/ceta_disciple.txt index 3d7bf28b954..2847124cbba 100644 --- a/forge-gui/res/cardsfolder/c/ceta_disciple.txt +++ b/forge-gui/res/cardsfolder/c/ceta_disciple.txt @@ -4,6 +4,6 @@ Types:Creature Merfolk Wizard PT:1/1 A:AB$ Pump | Cost$ R T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | SpellDescription$ Target creature gets +2/+0 until end of turn. A:AB$ Mana | Cost$ G T | Produced$ Any | SpellDescription$ Add one mana of any color. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ceta_disciple.jpg Oracle:{R}, {T}: Target creature gets +2/+0 until end of turn.\n{G}, {T}: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/c/ceta_sanctuary.txt b/forge-gui/res/cardsfolder/c/ceta_sanctuary.txt index 4a33a44d9c6..d7557894c01 100644 --- a/forge-gui/res/cardsfolder/c/ceta_sanctuary.txt +++ b/forge-gui/res/cardsfolder/c/ceta_sanctuary.txt @@ -8,7 +8,7 @@ SVar:DBDiscard:DB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 SVar:Y:Count$Valid Permanent.Red+YouCtrl/LimitMax.1 SVar:Z:Count$Valid Permanent.Green+YouCtrl/LimitMax.1 SVar:X:SVar$Y/Plus.Z -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Color$Red|Green SVar:Picture:http://wizards.com/global/images/magic/general/ceta_sanctuary.jpg Oracle:At the beginning of your upkeep, if you control a red or green permanent, draw a card, then discard a card. If you control a red permanent and a green permanent, instead draw two cards, then discard a card. diff --git a/forge-gui/res/cardsfolder/c/cetavolver.txt b/forge-gui/res/cardsfolder/c/cetavolver.txt index d38439abd12..1b803909d78 100644 --- a/forge-gui/res/cardsfolder/c/cetavolver.txt +++ b/forge-gui/res/cardsfolder/c/cetavolver.txt @@ -9,7 +9,7 @@ SVar:VolverStrength:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | Counter SVar:VolverSpeed:DB$ Animate | Defined$ Self | Keywords$ First Strike | Permanent$ True SVar:VolverPumped:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | ETB$ True | SubAbility$ VolverStomp | SpellDescription$ If CARDNAME was kicked with its {G} kicker, it enters the battlefield with a +1/+1 counter on it and with trample. SVar:VolverStomp:DB$ Animate | Defined$ Self | Keywords$ Trample | Permanent$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Red|Green DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/cetavolver.jpg diff --git a/forge-gui/res/cardsfolder/c/chain_of_acid.txt b/forge-gui/res/cardsfolder/c/chain_of_acid.txt index a08996c6193..2a69c266dcd 100644 --- a/forge-gui/res/cardsfolder/c/chain_of_acid.txt +++ b/forge-gui/res/cardsfolder/c/chain_of_acid.txt @@ -3,6 +3,6 @@ ManaCost:3 G Types:Sorcery A:SP$ Destroy | Cost$ 3 G | ValidTgts$ Permanent.nonCreature | SubAbility$ DBCopy | SpellDescription$ Destroy target noncreature permanent. Then that permanent's controller may copy this spell and may choose a new target for that copy. SVar:DBCopy:DB$ CopySpellAbility | Defined$ Parent | Controller$ TargetedController | Optional$ True | AILogic$ ChainOfAcid | StackDescription$ None -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/chain_of_acid.jpg Oracle:Destroy target noncreature permanent. Then that permanent's controller may copy this spell and may choose a new target for that copy. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/c/chain_of_smog.txt b/forge-gui/res/cardsfolder/c/chain_of_smog.txt index 6bb92db574c..6b210fded18 100644 --- a/forge-gui/res/cardsfolder/c/chain_of_smog.txt +++ b/forge-gui/res/cardsfolder/c/chain_of_smog.txt @@ -3,6 +3,6 @@ ManaCost:1 B Types:Sorcery A:SP$ Discard | Cost$ 1 B | ValidTgts$ Player | NumCards$ 2 | Mode$ TgtChoose | SubAbility$ DBCopy | SpellDescription$ Target player discards two cards. That player may copy this spell and may choose a new target for that copy. SVar:DBCopy:DB$ CopySpellAbility | Defined$ Parent | Controller$ TargetedPlayer | Optional$ True | AILogic$ ChainOfSmog | StackDescription$ None -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/chain_of_smog.jpg Oracle:Target player discards two cards. That player may copy this spell and may choose a new target for that copy. diff --git a/forge-gui/res/cardsfolder/c/chain_stasis.txt b/forge-gui/res/cardsfolder/c/chain_stasis.txt index e0140aa7191..9a7571977e6 100644 --- a/forge-gui/res/cardsfolder/c/chain_stasis.txt +++ b/forge-gui/res/cardsfolder/c/chain_stasis.txt @@ -3,6 +3,6 @@ ManaCost:U Types:Instant A:SP$ TapOrUntap | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBCopy | SpellDescription$ You may tap or untap target creature. Then that creature's controller may pay {2}{U}. If the player does, they may copy this spell and may choose a new target for that copy. SVar:DBCopy:DB$ CopySpellAbility | Defined$ Parent | Controller$ TargetedController | UnlessPayer$ TargetedController | UnlessCost$ 2 U | UnlessSwitched$ True | StackDescription$ Then that creature's controller may pay {2}{U}. If the player does, they may copy this spell and may choose a new target for that copy. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/chain_stasis.jpg Oracle:You may tap or untap target creature. Then that creature's controller may pay {2}{U}. If the player does, they may copy this spell and may choose a new target for that copy. diff --git a/forge-gui/res/cardsfolder/c/chains_of_mephistopheles.txt b/forge-gui/res/cardsfolder/c/chains_of_mephistopheles.txt index 072d1b8e824..3bf36c406fe 100644 --- a/forge-gui/res/cardsfolder/c/chains_of_mephistopheles.txt +++ b/forge-gui/res/cardsfolder/c/chains_of_mephistopheles.txt @@ -6,6 +6,6 @@ SVar:DiscardOne:DB$ Discard | Defined$ ReplacedPlayer | Mandatory$ True | NumCar SVar:DBDraw:DB$ Draw | Defined$ ReplacedPlayer | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | NumCards$ 1 | SubAbility$ MillOne SVar:MillOne:DB$ Mill | NumCards$ 1 | Defined$ ReplacedPlayer | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ0 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/chains_of_mephistopheles.jpg Oracle:If a player would draw a card except the first one they draw in their draw step each turn, that player discards a card instead. If the player discards a card this way, they draw a card. If the player doesn't discard a card this way, they put the top card of their library into their graveyard. diff --git a/forge-gui/res/cardsfolder/c/chalice_of_the_void.txt b/forge-gui/res/cardsfolder/c/chalice_of_the_void.txt index 7eb92bb90bc..c04d10c122a 100644 --- a/forge-gui/res/cardsfolder/c/chalice_of_the_void.txt +++ b/forge-gui/res/cardsfolder/c/chalice_of_the_void.txt @@ -7,6 +7,6 @@ SVar:TrigCounter:DB$ Counter | Defined$ TriggeredSpellAbility SVar:X:Count$xPaid SVar:Y:Count$CardCounters.CHARGE SVar:AICurseEffect:ChaliceOfTheVoid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/chalice_of_the_void.jpg Oracle:Chalice of the Void enters the battlefield with X charge counters on it.\nWhenever a player casts a spell with converted mana cost equal to the number of charge counters on Chalice of the Void, counter that spell. diff --git a/forge-gui/res/cardsfolder/c/chamber_of_manipulation.txt b/forge-gui/res/cardsfolder/c/chamber_of_manipulation.txt index d7f03f5e0c1..d75d3090bf5 100644 --- a/forge-gui/res/cardsfolder/c/chamber_of_manipulation.txt +++ b/forge-gui/res/cardsfolder/c/chamber_of_manipulation.txt @@ -5,6 +5,6 @@ K:Enchant land A:SP$ Attach | Cost$ 2 U U | ValidTgts$ Land | AILogic$ Pump S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddAbility$ ChamberofManipulationTap | Description$ Enchanted land has "{T}, Discard a card: Gain control of target creature until end of turn." SVar:ChamberofManipulationTap:AB$ GainControl | Cost$ T Discard<1/Card> | ValidTgts$ Creature | LoseControl$ EOT | SpellDescription$ Gain control of target creature until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/chamber_of_manipulation.jpg Oracle:Enchant land\nEnchanted land has "{T}, Discard a card: Gain control of target creature until end of turn." diff --git a/forge-gui/res/cardsfolder/c/champion_of_stray_souls.txt b/forge-gui/res/cardsfolder/c/champion_of_stray_souls.txt index e1357eade76..aa96e9b59eb 100644 --- a/forge-gui/res/cardsfolder/c/champion_of_stray_souls.txt +++ b/forge-gui/res/cardsfolder/c/champion_of_stray_souls.txt @@ -6,6 +6,6 @@ A:AB$ ChangeZone | Cost$ 3 B B T Sac | Origin$ SVar:X:Targeted$Amount SVar:Y:Count$ValidGraveyard Creature.YouOwn A:AB$ ChangeZone | Cost$ 5 B B | Origin$ Graveyard | Destination$ Library | ActivationZone$ Graveyard | Defined$ Self | SpellDescription$ Put CARDNAME on top of your library from your graveyard. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/champion_of_stray_souls.jpg Oracle:{3}{B}{B}, {T}, Sacrifice X other creatures: Return X target creature cards from your graveyard to the battlefield.\n{5}{B}{B}: Put Champion of Stray Souls on top of your library from your graveyard. diff --git a/forge-gui/res/cardsfolder/c/chance_encounter.txt b/forge-gui/res/cardsfolder/c/chance_encounter.txt index 968fa805b56..6c6636db279 100644 --- a/forge-gui/res/cardsfolder/c/chance_encounter.txt +++ b/forge-gui/res/cardsfolder/c/chance_encounter.txt @@ -5,6 +5,6 @@ T:Mode$ FlippedCoin | ValidPlayer$ You | ValidResult$ Win | TriggerZones$ Battle SVar:TrigPutCounter:DB$ PutCounter | CounterType$ LUCK | CounterNum$ 1 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Card.Self+counters_GE10_LUCK | Execute$ TrigWin | TriggerDescription$ At the beginning of your upkeep, if CARDNAME has ten or more luck counters on it, you win the game. SVar:TrigWin:DB$ WinsGame | Defined$ You -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/chance_encounter.jpg Oracle:Whenever you win a coin flip, put a luck counter on Chance Encounter.\nAt the beginning of your upkeep, if Chance Encounter has ten or more luck counters on it, you win the game. diff --git a/forge-gui/res/cardsfolder/c/chandra_ablaze.txt b/forge-gui/res/cardsfolder/c/chandra_ablaze.txt index 2fac634b23b..59b21c8bf28 100644 --- a/forge-gui/res/cardsfolder/c/chandra_ablaze.txt +++ b/forge-gui/res/cardsfolder/c/chandra_ablaze.txt @@ -9,6 +9,6 @@ A:AB$ Discard | Cost$ SubCounter<2/LOYALTY> | Mode$ Hand | Defined$ Player | Pla SVar:DBChandraDraw:DB$ Draw | Defined$ Player | NumCards$ 3 A:AB$ Play | Cost$ SubCounter<7/LOYALTY> | Valid$ Instant.Red+YouCtrl,Sorcery.Red+YouCtrl | ValidZone$ Graveyard | WithoutManaCost$ True | Planeswalker$ True | Ultimate$ True | Amount$ ChandraX | Controller$ You | Optional$ True | References$ ChandraX | SpellDescription$ Cast any number of red instant and/or sorcery cards from your graveyard without paying their mana costs. SVar:ChandraX:Count$ValidGraveyard Instant.Red+YouOwn,Sorcery.Red+YouOwn -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/chandra_ablaze.jpg Oracle:[+1]: Discard a card. If a red card is discarded this way, Chandra Ablaze deals 4 damage to any target.\n[-2]: Each player discards their hand, then draws three cards.\n[-7]: Cast any number of red instant and/or sorcery cards from your graveyard without paying their mana costs. diff --git a/forge-gui/res/cardsfolder/c/chandra_pyromaster.txt b/forge-gui/res/cardsfolder/c/chandra_pyromaster.txt index 493d1919a15..ad23ebb7c7e 100644 --- a/forge-gui/res/cardsfolder/c/chandra_pyromaster.txt +++ b/forge-gui/res/cardsfolder/c/chandra_pyromaster.txt @@ -13,6 +13,6 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True A:AB$ Mill | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | Defined$ You | NumCards$ 10 | Destination$ Exile | RememberMilled$ True | SubAbility$ DBChoose | SpellDescription$ Exile the top ten cards of your library. Choose an instant or sorcery card exiled this way and copy it three times. You may cast the copies without paying their mana costs. SVar:DBChoose:DB$ ChooseCard | Choices$ Instant.IsRemembered,Sorcery.IsRemembered | ChoiceZone$ Exile | Defined$ You | SubAbility$ DBPlay SVar:DBPlay:DB$ Play | Defined$ ChosenCard | WithoutManaCost$ True | CopyCard$ True | Amount$ 3 | AllowRepeats$ True | Controller$ You | Optional$ True | SubAbility$ DBCleanup -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/chandra_pyromaster.jpg Oracle:+1: Chandra, Pyromaster deals 1 damage to target player or planeswalker and 1 damage to up to one target creature that player or that planeswalker's controller controls. That creature can't block this turn.\n0: Exile the top card of your library. You may play it this turn.\n−7: Exile the top ten cards of your library. Choose an instant or sorcery card exiled this way and copy it three times. You may cast the copies without paying their mana costs. diff --git a/forge-gui/res/cardsfolder/c/changeling_berserker.txt b/forge-gui/res/cardsfolder/c/changeling_berserker.txt index f28ec4f39ce..aa8a45e2447 100644 --- a/forge-gui/res/cardsfolder/c/changeling_berserker.txt +++ b/forge-gui/res/cardsfolder/c/changeling_berserker.txt @@ -5,6 +5,6 @@ PT:5/3 K:Changeling K:Haste K:Champion:Creature -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/changeling_berserker.jpg Oracle:Changeling (This card is every creature type.)\nHaste\nChampion a creature (When this enters the battlefield, sacrifice it unless you exile another creature you control. When this leaves the battlefield, that card returns to the battlefield.) diff --git a/forge-gui/res/cardsfolder/c/changeling_hero.txt b/forge-gui/res/cardsfolder/c/changeling_hero.txt index da4d0c23b62..497e87f9ec3 100644 --- a/forge-gui/res/cardsfolder/c/changeling_hero.txt +++ b/forge-gui/res/cardsfolder/c/changeling_hero.txt @@ -5,6 +5,6 @@ PT:4/4 K:Changeling K:Lifelink K:Champion:Creature -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/changeling_hero.jpg Oracle:Changeling (This card is every creature type.)\nChampion a creature (When this enters the battlefield, sacrifice it unless you exile another creature you control. When this leaves the battlefield, that card returns to the battlefield.)\nLifelink (Damage dealt by this creature also causes you to gain that much life.) diff --git a/forge-gui/res/cardsfolder/c/changeling_titan.txt b/forge-gui/res/cardsfolder/c/changeling_titan.txt index 8c9a1b2d6ef..4e8d3d67fee 100644 --- a/forge-gui/res/cardsfolder/c/changeling_titan.txt +++ b/forge-gui/res/cardsfolder/c/changeling_titan.txt @@ -4,6 +4,6 @@ Types:Creature Shapeshifter PT:7/7 K:Changeling K:Champion:Creature -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/changeling_titan.jpg Oracle:Changeling (This card is every creature type.)\nChampion a creature (When this enters the battlefield, sacrifice it unless you exile another creature you control. When this leaves the battlefield, that card returns to the battlefield.) diff --git a/forge-gui/res/cardsfolder/c/channel.txt b/forge-gui/res/cardsfolder/c/channel.txt index ef89727da19..38206b822af 100644 --- a/forge-gui/res/cardsfolder/c/channel.txt +++ b/forge-gui/res/cardsfolder/c/channel.txt @@ -5,6 +5,6 @@ A:SP$ Effect | Cost$ G G | Name$ Channel Effect | Abilities$ ABMana,ABMultiMana SVar:ABMana:AB$Mana | Cost$ PayLife<1> | ActivationZone$ Command | Produced$ C | Amount$ 1 | SpellDescription$ Add {C}. SVar:ABMultiMana:AB$Mana | Cost$ PayLife | ActivationZone$ Command | Produced$ C | Amount$ ChosenX | References$ X | SpellDescription$ Add {X}. SVar:X:XChoice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/channel.jpg Oracle:Until end of turn, any time you could activate a mana ability, you may pay 1 life. If you do, Add {C}. diff --git a/forge-gui/res/cardsfolder/c/channel_the_suns.txt b/forge-gui/res/cardsfolder/c/channel_the_suns.txt index b45e7d287b6..b39ac0c0a81 100644 --- a/forge-gui/res/cardsfolder/c/channel_the_suns.txt +++ b/forge-gui/res/cardsfolder/c/channel_the_suns.txt @@ -2,6 +2,6 @@ Name:Channel the Suns ManaCost:3 G Types:Sorcery A:SP$ Mana | Cost$ 3 G | Produced$ W U B R G | SpellDescription$ Add {W}{U}{B}{R}{G}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/channel_the_suns.jpg Oracle:Add {W}{U}{B}{R}{G}. diff --git a/forge-gui/res/cardsfolder/c/chaos_harlequin.txt b/forge-gui/res/cardsfolder/c/chaos_harlequin.txt index 406d97d2613..199f19180df 100644 --- a/forge-gui/res/cardsfolder/c/chaos_harlequin.txt +++ b/forge-gui/res/cardsfolder/c/chaos_harlequin.txt @@ -7,6 +7,6 @@ SVar:DBLand:DB$ Pump | Defined$ Self | NumAtt$ -4 | ConditionDefined$ Remembered SVar:DBNonLand:DB$ Pump | Defined$ Self | NumAtt$ +2 | ConditionDefined$ Remembered | ConditionPresent$ Land | ConditionCompare$ EQ0 | ConditionDescription$ Otherwise, | SubAbility$ DBCleanup | StackDescription$ None SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | StackDescription$ None # Note: This card is functioal, but it's Stack Description is horrendous. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/chaos_harlequin.jpg Oracle:{R}: Exile the top card of your library. If that card is a land card, Chaos Harlequin gets -4/-0 until end of turn. Otherwise, Chaos Harlequin gets +2/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/c/chaos_lord.txt b/forge-gui/res/cardsfolder/c/chaos_lord.txt index fd554675ca8..053bd792a40 100644 --- a/forge-gui/res/cardsfolder/c/chaos_lord.txt +++ b/forge-gui/res/cardsfolder/c/chaos_lord.txt @@ -7,6 +7,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E SVar:ChangeControl:DB$ GainControl | Defined$ Self | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | References$ X SVar:X:Count$Valid Permanent/Mod.2 S:Mode$ Continuous | Affected$ Card.Self+notEnteredBattlefieldThisTurn | AddHiddenKeyword$ CARDNAME can attack as though it had haste. | Description$ CARDNAME can attack as though it had haste unless it entered the battlefield this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/chaos_lord.jpg Oracle:First strike\nAt the beginning of your upkeep, target opponent gains control of Chaos Lord if the number of permanents is even.\nChaos Lord can attack as though it had haste unless it entered the battlefield this turn. diff --git a/forge-gui/res/cardsfolder/c/chaos_moon.txt b/forge-gui/res/cardsfolder/c/chaos_moon.txt index abd7369d0d8..40d9cca6867 100644 --- a/forge-gui/res/cardsfolder/c/chaos_moon.txt +++ b/forge-gui/res/cardsfolder/c/chaos_moon.txt @@ -11,7 +11,7 @@ SVar:RepCurse:Event$ ProduceMana | ActiveZones$ Command | ValidCard$ Mountain | SVar:ProduceColorless:R->1 & B->1 & U->1 & G->1 & W->1 SVar:STCurse:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.Red | AddPower$ -1 | AddToughness$ -1 SVar:X:Count$Valid Permanent -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/chaos_moon.jpg Oracle:At the beginning of each upkeep, count the number of permanents. If the number is odd, until end of turn, red creatures get +1/+1 and whenever a player taps a Mountain for mana, that player adds an additional {R}. If the number is even, until end of turn, red creatures get -1/-1 and if a player taps a Mountain for mana, that Mountain produces colorless mana instead of any other type. diff --git a/forge-gui/res/cardsfolder/c/chaoslace.txt b/forge-gui/res/cardsfolder/c/chaoslace.txt index 9a8e6f4ec7e..9cd8c931421 100644 --- a/forge-gui/res/cardsfolder/c/chaoslace.txt +++ b/forge-gui/res/cardsfolder/c/chaoslace.txt @@ -2,7 +2,7 @@ Name:Chaoslace ManaCost:R Types:Instant A:SP$ Animate | Cost$ R | Colors$ Red | OverwriteColors$ True | ValidTgts$ Card | TgtZone$ Stack,Battlefield | Permanent$ True | SpellDescription$ Target spell or permanent becomes red. (Mana symbols on that permanent remain unchanged.) -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/chaoslace.jpg Oracle:Target spell or permanent becomes red. (Its mana symbols remain unchanged.) diff --git a/forge-gui/res/cardsfolder/c/chaosphere.txt b/forge-gui/res/cardsfolder/c/chaosphere.txt index a60c02cb61f..9b7a469aa81 100644 --- a/forge-gui/res/cardsfolder/c/chaosphere.txt +++ b/forge-gui/res/cardsfolder/c/chaosphere.txt @@ -5,6 +5,6 @@ S:Mode$ Continuous | Affected$ Creature.withFlying | AddHiddenKeyword$ CARDNAME S:Mode$ Continuous | Affected$ Creature.withoutFlying | AddKeyword$ Reach | Description$ Creatures without flying have reach. (They can block creatures with flying.) SVar:NonStackingEffect:True SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/chaosphere.jpg Oracle:Creatures with flying can block only creatures with flying.\nCreatures without flying have reach. (They can block creatures with flying.) diff --git a/forge-gui/res/cardsfolder/c/charge_across_the_araba.txt b/forge-gui/res/cardsfolder/c/charge_across_the_araba.txt index d2bfb7c7a4a..0d91b39d24e 100644 --- a/forge-gui/res/cardsfolder/c/charge_across_the_araba.txt +++ b/forge-gui/res/cardsfolder/c/charge_across_the_araba.txt @@ -5,6 +5,6 @@ A:SP$ ChangeZone | Cost$ 4 W | Origin$ Battlefield | Destination$ Hand | ChangeT SVar:DBPump:DB$ PumpAll | ValidCards$ Creature.YouCtrl | NumAtt$ +Y | NumDef$ +Y | References$ Y SVar:X:Count$Valid Plains.YouCtrl SVar:Y:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/charge_across_the_araba.jpg Oracle:Sweep — Return any number of Plains you control to their owner's hand. Creatures you control get +1/+1 until end of turn for each Plains returned this way. diff --git a/forge-gui/res/cardsfolder/c/chariot_of_the_sun.txt b/forge-gui/res/cardsfolder/c/chariot_of_the_sun.txt index dc606dd1375..032a715a120 100644 --- a/forge-gui/res/cardsfolder/c/chariot_of_the_sun.txt +++ b/forge-gui/res/cardsfolder/c/chariot_of_the_sun.txt @@ -2,6 +2,6 @@ Name:Chariot of the Sun ManaCost:3 Types:Artifact A:AB$ Animate | Cost$ 2 T | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | Toughness$ 1 | Keywords$ Flying | SpellDescription$ Until end of turn, target creature you control gains flying and has base toughness 1. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/chariot_of_the_sun.jpg Oracle:{2}, {T}: Until end of turn, target creature you control gains flying and has base toughness 1. diff --git a/forge-gui/res/cardsfolder/c/charm_peddler.txt b/forge-gui/res/cardsfolder/c/charm_peddler.txt index c3bb7003a68..6775053c31e 100644 --- a/forge-gui/res/cardsfolder/c/charm_peddler.txt +++ b/forge-gui/res/cardsfolder/c/charm_peddler.txt @@ -7,6 +7,6 @@ SVar:DBEffect:DB$ Effect | ValidTgts$ Creature | TgtPrompt$ Select target creatu SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.IsRemembered | ValidTarget$ Card.IsImprinted | ReplaceWith$ ExileEffect | PreventionEffect$ True | Description$ The next time the chosen source deals damage to the targeted creature, prevent that damage. SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/charm_peddler.jpg Oracle:{W}, {T}, Discard a card: The next time a source of your choice would deal damage to target creature this turn, prevent that damage. diff --git a/forge-gui/res/cardsfolder/c/charnel_troll.txt b/forge-gui/res/cardsfolder/c/charnel_troll.txt index ab2e2318e6d..260ef6b81fd 100644 --- a/forge-gui/res/cardsfolder/c/charnel_troll.txt +++ b/forge-gui/res/cardsfolder/c/charnel_troll.txt @@ -9,7 +9,7 @@ SVar:DBPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | Condition SVar:DBSac:DB$ Sacrifice | SacValid# Self | ConditionDefined$ Remembered | ConditionPresent$ Card.Creature | ConditionCompare$ EQ0 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True A:AB$ PutCounter | Cost$ B G Discard<1/Creature> | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on CARDNAME. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Ability$Graveyard DeckHas:Ability$Counters Oracle:Trample\nAt the beginning of your upkeep, exile a creature card from your graveyard. If you do, put a +1/+1 counter on Charnel Troll. Otherwise sacrifice it.\n{B}{G}, Discard a creature card: Put a +1/+1 counter on Charnel Troll. diff --git a/forge-gui/res/cardsfolder/c/cheering_fanatic.txt b/forge-gui/res/cardsfolder/c/cheering_fanatic.txt index e3fc1779b3f..4d48fcf36aa 100644 --- a/forge-gui/res/cardsfolder/c/cheering_fanatic.txt +++ b/forge-gui/res/cardsfolder/c/cheering_fanatic.txt @@ -6,5 +6,5 @@ T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ Tr SVar:TrigNameCard:DB$ NameCard | Defined$ You | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | StaticAbilities$ CFReduceCost SVar:CFReduceCost:Mode$ ReduceCost | EffectZone$ Command | ValidCard$ Card.NamedCard | Type$ Spell | Amount$ 1 | Description$ Spells with the chosen name cost {1} less to cast this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All Oracle:Whenever Cheering Fanatic attacks, choose a card name. Spells with the chosen name cost {1} less to cast this turn. diff --git a/forge-gui/res/cardsfolder/c/chief_engineer.txt b/forge-gui/res/cardsfolder/c/chief_engineer.txt index 6b8cf725dc0..762cd44577f 100644 --- a/forge-gui/res/cardsfolder/c/chief_engineer.txt +++ b/forge-gui/res/cardsfolder/c/chief_engineer.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Creature Vedalken Artificer PT:1/3 S:Mode$ Continuous | Affected$ Card.Artifact+YouCtrl | AffectedZone$ Stack | AddKeyword$ Convoke | Description$ Artifact spells you cast have convoke. (Your creatures can help cast those spells. Each creature you tap while casting an artifact spell pays for {1} or one mana of that creature's color.) -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/chief_engineer.jpg Oracle:Artifact spells you cast have convoke. (Your creatures can help cast those spells. Each creature you tap while casting an artifact spell pays for {1} or one mana of that creature's color.) diff --git a/forge-gui/res/cardsfolder/c/chill.txt b/forge-gui/res/cardsfolder/c/chill.txt index b3034d828fe..e8185cd50a6 100644 --- a/forge-gui/res/cardsfolder/c/chill.txt +++ b/forge-gui/res/cardsfolder/c/chill.txt @@ -2,6 +2,6 @@ Name:Chill ManaCost:1 U Types:Enchantment S:Mode$ RaiseCost | ValidCard$ Card.Red | Type$ Spell | Amount$ 2 | Description$ Red spells cost {2} more to cast. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/chill.jpg Oracle:Red spells cost {2} more to cast. diff --git a/forge-gui/res/cardsfolder/c/chill_haunting.txt b/forge-gui/res/cardsfolder/c/chill_haunting.txt index 50793721bcf..09c966e213c 100644 --- a/forge-gui/res/cardsfolder/c/chill_haunting.txt +++ b/forge-gui/res/cardsfolder/c/chill_haunting.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Pump | Cost$ 1 B ExileFromGrave | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -ChosenX | NumDef$ -ChosenX | IsCurse$ True | References$ X | SpellDescription$ Target creature gets -X/-X until end of turn. SVar:X:XChoice #ChosenX SVar created by Cost payment -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/chill_haunting.jpg Oracle:As an additional cost to cast this spell, exile X creature cards from your graveyard.\nTarget creature gets -X/-X until end of turn. diff --git a/forge-gui/res/cardsfolder/c/chill_of_foreboding.txt b/forge-gui/res/cardsfolder/c/chill_of_foreboding.txt index c964c017eb5..04fafba9f55 100644 --- a/forge-gui/res/cardsfolder/c/chill_of_foreboding.txt +++ b/forge-gui/res/cardsfolder/c/chill_of_foreboding.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Sorcery K:Flashback:7 U A:SP$ Mill | Cost$ 2 U | NumCards$ 5 | Defined$ Player | SpellDescription$ Each player puts the top five cards of their library into their graveyard. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/chill_of_foreboding.jpg Oracle:Each player puts the top five cards of their library into their graveyard.\nFlashback {7}{U} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/c/chilling_shade.txt b/forge-gui/res/cardsfolder/c/chilling_shade.txt index 50f42017796..296763268a3 100644 --- a/forge-gui/res/cardsfolder/c/chilling_shade.txt +++ b/forge-gui/res/cardsfolder/c/chilling_shade.txt @@ -5,6 +5,6 @@ PT:1/1 K:Flying A:AB$ Pump | Cost$ S | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. # AI can now use snow mana to pay for activated abilities. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/chilling_shade.jpg Oracle:Flying\n{S}: Chilling Shade gets +1/+1 until end of turn. ({S} can be paid with one mana from a snow permanent.) diff --git a/forge-gui/res/cardsfolder/c/chimeric_coils.txt b/forge-gui/res/cardsfolder/c/chimeric_coils.txt index a924540d73f..9f050e31be0 100644 --- a/forge-gui/res/cardsfolder/c/chimeric_coils.txt +++ b/forge-gui/res/cardsfolder/c/chimeric_coils.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ Animate | Cost$ X 1 | Defined$ Self | Power$ X | Toughness$ X | Types$ Creature,Artifact,Construct | sVars$ ChimericCoilsEOT | AtEOT$ Sacrifice | Permanent$ True | References$ X | SpellDescription$ CARDNAME becomes an X/X Construct artifact creature. Sacrifice it at the beginning of the next end step. SVar:X:Count$xPaid SVar:ChimericCoilsEOT:SVar:EndOfTurnLeavePlay:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/chimeric_coils.jpg Oracle:{X}{1}: Chimeric Coils becomes an X/X Construct artifact creature. Sacrifice it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/c/chimeric_idol.txt b/forge-gui/res/cardsfolder/c/chimeric_idol.txt index dd62017447b..539da40d55c 100644 --- a/forge-gui/res/cardsfolder/c/chimeric_idol.txt +++ b/forge-gui/res/cardsfolder/c/chimeric_idol.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact A:AB$ TapAll | Cost$ 0 | ValidCards$ Land.YouCtrl | SubAbility$ DBAnimate | SpellDescription$ Tap all lands you control. CARDNAME becomes a 3/3 Turtle artifact creature until end of turn. SVar:DBAnimate:DB$ Animate | Defined$ Self | Power$ 3 | Toughness$ 3 | Types$ Creature,Artifact,Turtle -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/chimeric_idol.jpg Oracle:{0}: Tap all lands you control. Chimeric Idol becomes a 3/3 Turtle artifact creature until end of turn. diff --git a/forge-gui/res/cardsfolder/c/chimeric_mass.txt b/forge-gui/res/cardsfolder/c/chimeric_mass.txt index 22a8be45971..693b726c746 100644 --- a/forge-gui/res/cardsfolder/c/chimeric_mass.txt +++ b/forge-gui/res/cardsfolder/c/chimeric_mass.txt @@ -9,6 +9,6 @@ SVar:Static:Mode$ Continuous | EffectZone$ Battlefield | CharacteristicDefining$ SVar:Y:Count$CardCounters.CHARGE SVar:NeedsToPlayVar:Z GE4 SVar:Z:Count$Valid Land.YouCtrl+inZoneBattlefield+untapped -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/chimeric_mass.jpg Oracle:Chimeric Mass enters the battlefield with X charge counters on it.\n{1}: Until end of turn, Chimeric Mass becomes a Construct artifact creature with "This creature's power and toughness are each equal to the number of charge counters on it." diff --git a/forge-gui/res/cardsfolder/c/chimeric_staff.txt b/forge-gui/res/cardsfolder/c/chimeric_staff.txt index 97434143c75..10267f478fd 100644 --- a/forge-gui/res/cardsfolder/c/chimeric_staff.txt +++ b/forge-gui/res/cardsfolder/c/chimeric_staff.txt @@ -3,6 +3,6 @@ ManaCost:4 Types:Artifact A:AB$ Animate | Cost$ X | Defined$ Self | Power$ X | Toughness$ X | Types$ Creature,Artifact,Construct | References$ X | SpellDescription$ CARDNAME becomes an X/X Construct artifact creature until end of turn. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/chimeric_staff.jpg Oracle:{X}: Chimeric Staff becomes an X/X Construct artifact creature until end of turn. diff --git a/forge-gui/res/cardsfolder/c/choice_of_damnations.txt b/forge-gui/res/cardsfolder/c/choice_of_damnations.txt index 912885f7407..a45230e8ef8 100644 --- a/forge-gui/res/cardsfolder/c/choice_of_damnations.txt +++ b/forge-gui/res/cardsfolder/c/choice_of_damnations.txt @@ -9,6 +9,6 @@ SVar:X:Count$ChosenNumber SVar:Y:SVar$W/LimitMin.0 SVar:W:SVar$Z/Minus.X SVar:Z:Count$Valid Permanent.TargetedPlayerCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/choice_of_damnations.jpg Oracle:Target opponent chooses a number. You may have that player lose that much life. If you don't, that player sacrifices all but that many permanents. diff --git a/forge-gui/res/cardsfolder/c/choke.txt b/forge-gui/res/cardsfolder/c/choke.txt index 72c91aab895..4a1513583ee 100644 --- a/forge-gui/res/cardsfolder/c/choke.txt +++ b/forge-gui/res/cardsfolder/c/choke.txt @@ -3,6 +3,6 @@ ManaCost:2 G Types:Enchantment S:Mode$ Continuous | Affected$ Island | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Islands don't untap during their controllers' untap steps. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/choke.jpg Oracle:Islands don't untap during their controllers' untap steps. diff --git a/forge-gui/res/cardsfolder/c/chromatic_armor.txt b/forge-gui/res/cardsfolder/c/chromatic_armor.txt index f87ff94a72d..c02f62830cd 100644 --- a/forge-gui/res/cardsfolder/c/chromatic_armor.txt +++ b/forge-gui/res/cardsfolder/c/chromatic_armor.txt @@ -9,6 +9,6 @@ K:etbCounter:SLEIGHT:1 R:Event$ DamageDone | ActiveZones$ Battlefield | Prevent$ True | ValidTarget$ Creature.EnchantedBy | ValidSource$ Card.ChosenColor | Description$ Prevent all damage that would be dealt to enchanted creature by sources of the chosen color. A:AB$ PutCounter | Cost$ X | Defined$ Self | CounterType$ SLEIGHT | CounterNum$ 1 | SubAbility$ ChooseColor | References$ X | SpellDescription$ Put a sleight counter on CARDNAME and choose a color. X is the number of sleight counters on CARDNAME. SVar:X:Count$CardCounters.SLEIGHT -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/chromatic_armor.jpg Oracle:Enchant creature\nAs Chromatic Armor enters the battlefield, choose a color.\nChromatic Armor enters the battlefield with a sleight counter on it.\nPrevent all damage that would be dealt to enchanted creature by sources of the last chosen color.\n{X}: Put a sleight counter on Chromatic Armor and choose a color. X is the number of sleight counters on Chromatic Armor. diff --git a/forge-gui/res/cardsfolder/c/chromatic_sphere.txt b/forge-gui/res/cardsfolder/c/chromatic_sphere.txt index cc6c84eee84..3ef58bc89d7 100644 --- a/forge-gui/res/cardsfolder/c/chromatic_sphere.txt +++ b/forge-gui/res/cardsfolder/c/chromatic_sphere.txt @@ -3,6 +3,6 @@ ManaCost:1 Types:Artifact A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ Any | SubAbility$ DBDraw | SpellDescription$ Add one mana of any color. Draw a card. SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/chromatic_sphere.jpg Oracle:{1}, {T}, Sacrifice Chromatic Sphere: Add one mana of any color. Draw a card. diff --git a/forge-gui/res/cardsfolder/c/chromatic_star.txt b/forge-gui/res/cardsfolder/c/chromatic_star.txt index e7175e4ef18..141fe9f15cc 100644 --- a/forge-gui/res/cardsfolder/c/chromatic_star.txt +++ b/forge-gui/res/cardsfolder/c/chromatic_star.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ Any | SpellDescription$ Add one mana of any color. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, draw a card. SVar:TrigDraw:DB$Draw | Defined$ TriggeredCardController | NumCards$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:SacMe:1 SVar:Picture:http://www.wizards.com/global/images/magic/general/chromatic_star.jpg Oracle:{1}, {T}, Sacrifice Chromatic Star: Add one mana of any color.\nWhen Chromatic Star is put into a graveyard from the battlefield, draw a card. diff --git a/forge-gui/res/cardsfolder/c/chromescale_drake.txt b/forge-gui/res/cardsfolder/c/chromescale_drake.txt index e4f9e55406f..9fd89c65440 100644 --- a/forge-gui/res/cardsfolder/c/chromescale_drake.txt +++ b/forge-gui/res/cardsfolder/c/chromescale_drake.txt @@ -7,6 +7,6 @@ T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefi SVar:TrigDig:DB$Dig | DigNum$ 3 | Reveal$ True | ChangeNum$ All | ChangeValid$ Artifact | DestinationZone2$ Graveyard S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) SVar:X:Count$Valid Artifact.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/chromescale_drake.jpg Oracle:Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.)\nFlying\nWhen Chromescale Drake enters the battlefield, reveal the top three cards of your library. Put all artifact cards revealed this way into your hand and the rest into your graveyard. diff --git a/forge-gui/res/cardsfolder/c/chromeshell_crab.txt b/forge-gui/res/cardsfolder/c/chromeshell_crab.txt index cd668fb045d..c7f9b292636 100644 --- a/forge-gui/res/cardsfolder/c/chromeshell_crab.txt +++ b/forge-gui/res/cardsfolder/c/chromeshell_crab.txt @@ -6,6 +6,6 @@ K:Morph:4 U T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigFaceUp | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ When CARDNAME is turned face up, you may exchange control of target creature you control and target creature an opponent controls. SVar:TrigFaceUp:DB$ Pump | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Choose target creature you control | SubAbility$ CrabExchange SVar:CrabExchange:DB$ ExchangeControl | Defined$ ParentTarget | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls | SpellDescription$ Exchange control of target creature you control and target creature an opponent controls. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/chromeshell_crab.jpg Oracle:Morph {4}{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.)\nWhen Chromeshell Crab is turned face up, you may exchange control of target creature you control and target creature an opponent controls. diff --git a/forge-gui/res/cardsfolder/c/chronatog.txt b/forge-gui/res/cardsfolder/c/chronatog.txt index 9acc7abee5e..01fc0ded422 100644 --- a/forge-gui/res/cardsfolder/c/chronatog.txt +++ b/forge-gui/res/cardsfolder/c/chronatog.txt @@ -4,6 +4,6 @@ Types:Creature Atog PT:1/2 A:AB$ Pump | Cost$ 0 | NumAtt$ +3 | NumDef$ +3 | ActivationLimit$ 1 | SubAbility$ DBSkipTurn | SpellDescription$ CARDNAME gets +3/+3 until end of turn. You skip your next turn. Activate this ability only once each turn. SVar:DBSkipTurn:DB$ SkipTurn | NumTurns$ 1 | Defined$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/chronatog.jpg Oracle:{0}: Chronatog gets +3/+3 until end of turn. You skip your next turn. Activate this ability only once each turn. diff --git a/forge-gui/res/cardsfolder/c/chronatog_avatar.txt b/forge-gui/res/cardsfolder/c/chronatog_avatar.txt index 9118cb61238..ae680de61fa 100644 --- a/forge-gui/res/cardsfolder/c/chronatog_avatar.txt +++ b/forge-gui/res/cardsfolder/c/chronatog_avatar.txt @@ -5,6 +5,6 @@ HandLifeModifier:-1/+1 S:Mode$ Continuous | EffectZone$ Command | Affected$ You | SetMaxHandSize$ Unlimited | Description$ You have no maximum hand size. A:AB$ Draw | ActivationZone$ Command | Cost$ 0 | NumCards$ 3 | Defined$ You | ActivationLimit$ 1 | SubAbility$ DBSkipTurn | SpellDescription$ Draw three cards. You skip your next turn. Activate this ability only once each turn. SVar:DBSkipTurn:DB$ SkipTurn | NumTurns$ 1 | Defined$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:https://downloads.cardforge.org/images/cards/VAN/Chronatog Avatar.full.jpg Oracle:Hand -1, life +1\nYou have no maximum hand size.\n{0}: Draw three cards. You skip your next turn. Activate this ability only once each turn. diff --git a/forge-gui/res/cardsfolder/c/cinder_seer.txt b/forge-gui/res/cardsfolder/c/cinder_seer.txt index 5a4d7442bc5..e1bdba01ee7 100644 --- a/forge-gui/res/cardsfolder/c/cinder_seer.txt +++ b/forge-gui/res/cardsfolder/c/cinder_seer.txt @@ -6,6 +6,6 @@ A:AB$ Reveal | Cost$ 2 R T | Defined$ You | RevealValid$ Card.Red | AnyNumber$ T SVar:DBCinderDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | SubAbility$ DBCinderCleanup | References$ X SVar:X:Remembered$Amount SVar:DBCinderCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cinder_seer.jpg Oracle:{2}{R}, {T}: Reveal any number of red cards in your hand. Cinder Seer deals X damage to any target, where X is the number of cards revealed this way. diff --git a/forge-gui/res/cardsfolder/c/cinderhaze_wretch.txt b/forge-gui/res/cardsfolder/c/cinderhaze_wretch.txt index 1524f9c25c0..9af1e4e0210 100644 --- a/forge-gui/res/cardsfolder/c/cinderhaze_wretch.txt +++ b/forge-gui/res/cardsfolder/c/cinderhaze_wretch.txt @@ -4,6 +4,6 @@ Types:Creature Elemental Shaman PT:3/2 A:AB$ Discard | Cost$ T | ValidTgts$ Player | NumCards$ 1 | Mode$ TgtChoose | PlayerTurn$ True | SpellDescription$ Target player discards a card. Activate this ability only during your turn. A:AB$ Untap | Cost$ AddCounter<1/M1M1> | SpellDescription$ Untap CARDNAME. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cinderhaze_wretch.jpg Oracle:{T}: Target player discards a card. Activate this ability only during your turn.\nPut a -1/-1 counter on Cinderhaze Wretch: Untap Cinderhaze Wretch. diff --git a/forge-gui/res/cardsfolder/c/circle_of_despair.txt b/forge-gui/res/cardsfolder/c/circle_of_despair.txt index 6a40341eeb3..7e0d97ec37d 100644 --- a/forge-gui/res/cardsfolder/c/circle_of_despair.txt +++ b/forge-gui/res/cardsfolder/c/circle_of_despair.txt @@ -8,6 +8,6 @@ SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True SVar:NonStackingEffect:True SVar:AIPreference:SacCost$Creature.namedBrood of Cockroaches,Creature.token -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/circle_of_despair.jpg Oracle:{1}, Sacrifice a creature: The next time a source of your choice would deal damage to any target this turn, prevent that damage. diff --git a/forge-gui/res/cardsfolder/c/circle_of_protection_black.txt b/forge-gui/res/cardsfolder/c/circle_of_protection_black.txt index ed53732d241..24d55316f2b 100644 --- a/forge-gui/res/cardsfolder/c/circle_of_protection_black.txt +++ b/forge-gui/res/cardsfolder/c/circle_of_protection_black.txt @@ -7,6 +7,6 @@ SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.ChosenCard+Bla SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/circle_of_protection_black.jpg Oracle:{1}: The next time a black source of your choice would deal damage to you this turn, prevent that damage. diff --git a/forge-gui/res/cardsfolder/c/circle_of_protection_blue.txt b/forge-gui/res/cardsfolder/c/circle_of_protection_blue.txt index b812406aae2..4f29737e478 100644 --- a/forge-gui/res/cardsfolder/c/circle_of_protection_blue.txt +++ b/forge-gui/res/cardsfolder/c/circle_of_protection_blue.txt @@ -7,6 +7,6 @@ SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.ChosenCard+Blu SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/circle_of_protection_blue.jpg Oracle:{1}: The next time a blue source of your choice would deal damage to you this turn, prevent that damage. diff --git a/forge-gui/res/cardsfolder/c/circle_of_protection_green.txt b/forge-gui/res/cardsfolder/c/circle_of_protection_green.txt index 3634927a119..93056d22b27 100644 --- a/forge-gui/res/cardsfolder/c/circle_of_protection_green.txt +++ b/forge-gui/res/cardsfolder/c/circle_of_protection_green.txt @@ -7,6 +7,6 @@ SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.ChosenCard+Gre SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/circle_of_protection_green.jpg Oracle:{1}: The next time a green source of your choice would deal damage to you this turn, prevent that damage. diff --git a/forge-gui/res/cardsfolder/c/circle_of_protection_red.txt b/forge-gui/res/cardsfolder/c/circle_of_protection_red.txt index b54ecb46789..9ea827605ef 100644 --- a/forge-gui/res/cardsfolder/c/circle_of_protection_red.txt +++ b/forge-gui/res/cardsfolder/c/circle_of_protection_red.txt @@ -7,6 +7,6 @@ SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.ChosenCard+Red SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/circle_of_protection_red.jpg Oracle:{1}: The next time a red source of your choice would deal damage to you this turn, prevent that damage. diff --git a/forge-gui/res/cardsfolder/c/circle_of_protection_shadow.txt b/forge-gui/res/cardsfolder/c/circle_of_protection_shadow.txt index 523df4d8217..cb8d8b6498b 100644 --- a/forge-gui/res/cardsfolder/c/circle_of_protection_shadow.txt +++ b/forge-gui/res/cardsfolder/c/circle_of_protection_shadow.txt @@ -7,6 +7,6 @@ SVar:RPreventNextFromCreature:Event$ DamageDone | ValidSource$ Card.ChosenCard+w SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/circle_of_protection_shadow.jpg Oracle:{1}: The next time a creature of your choice with shadow would deal damage to you this turn, prevent that damage. diff --git a/forge-gui/res/cardsfolder/c/circle_of_protection_white.txt b/forge-gui/res/cardsfolder/c/circle_of_protection_white.txt index 6a590740244..0a0ab890f1d 100644 --- a/forge-gui/res/cardsfolder/c/circle_of_protection_white.txt +++ b/forge-gui/res/cardsfolder/c/circle_of_protection_white.txt @@ -7,6 +7,6 @@ SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.ChosenCard+Whi SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/circle_of_protection_white.jpg Oracle:{1}: The next time a white source of your choice would deal damage to you this turn, prevent that damage. diff --git a/forge-gui/res/cardsfolder/c/circling_vultures.txt b/forge-gui/res/cardsfolder/c/circling_vultures.txt index 611198e81ac..6505b846886 100644 --- a/forge-gui/res/cardsfolder/c/circling_vultures.txt +++ b/forge-gui/res/cardsfolder/c/circling_vultures.txt @@ -5,7 +5,7 @@ PT:3/2 K:Flying K:UpkeepCost:ExileFromGrave<1/Card.TopGraveyardCreature> A:ST$ Discard | Cost$ 0 | Mode$ Defined | DefinedCards$ Self | Optional$ True | DiscardMessage$ Do you want discard this card? | ActivationZone$ Hand | InstantSpeed$ True | SpellDescription$ You may discard CARDNAME any time you could cast an instant. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NeedsOrderedGraveyard:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/circling_vultures.jpg Oracle:Flying\nYou may discard Circling Vultures any time you could cast an instant.\nAt the beginning of your upkeep, sacrifice Circling Vultures unless you exile the top creature card of your graveyard. diff --git a/forge-gui/res/cardsfolder/c/circuitous_route.txt b/forge-gui/res/cardsfolder/c/circuitous_route.txt index 99113917ed7..7608504f4d5 100644 --- a/forge-gui/res/cardsfolder/c/circuitous_route.txt +++ b/forge-gui/res/cardsfolder/c/circuitous_route.txt @@ -2,5 +2,5 @@ Name:Circuitous Route ManaCost:3 G Types:Sorcery A:SP$ ChangeZone | Cost$ 3 G | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic,Card.Gate | ChangeNum$ 2 | Tapped$ True | SpellDescription$ Search your library for up to two basic land cards and/or Gate cards and put them onto the battlefield tapped, then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random Oracle:Search your library for up to two basic land cards and/or Gate cards and put them onto the battlefield tapped, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/c/citadel_of_pain.txt b/forge-gui/res/cardsfolder/c/citadel_of_pain.txt index 2790d51da5a..d5ed8f79b8d 100644 --- a/forge-gui/res/cardsfolder/c/citadel_of_pain.txt +++ b/forge-gui/res/cardsfolder/c/citadel_of_pain.txt @@ -6,6 +6,6 @@ SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredPlayer | NumDmg$ X | Referenc SVar:X:Count$Valid Land.untapped+ActivePlayerCtrl S:Mode$ Continuous | Affected$ Land | AddSVar$ AITap SVar:AITap:SVar:AITapDown:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/citadel_of_pain.jpg Oracle:At the beginning of each player's end step, Citadel of Pain deals X damage to that player, where X is the number of untapped lands they control. diff --git a/forge-gui/res/cardsfolder/c/citanul_flute.txt b/forge-gui/res/cardsfolder/c/citanul_flute.txt index 870104945e9..ced3eddbad0 100644 --- a/forge-gui/res/cardsfolder/c/citanul_flute.txt +++ b/forge-gui/res/cardsfolder/c/citanul_flute.txt @@ -3,6 +3,6 @@ ManaCost:5 Types:Artifact A:AB$ ChangeZone | Cost$ X T | Origin$ Library | Destination$ Hand | ChangeType$ Creature.cmcLEX | ChangeNum$ 1 | References$ X | SpellDescription$ Search your library for a creature card with converted mana cost X or less, reveal it, put it into your hand, then shuffle your library. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/citanul_flute.jpg Oracle:{X}, {T}: Search your library for a creature card with converted mana cost X or less, reveal it, put it into your hand, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/c/city_in_a_bottle.txt b/forge-gui/res/cardsfolder/c/city_in_a_bottle.txt index 0caf421c97a..732d873f1dc 100644 --- a/forge-gui/res/cardsfolder/c/city_in_a_bottle.txt +++ b/forge-gui/res/cardsfolder/c/city_in_a_bottle.txt @@ -5,8 +5,8 @@ T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Permanent.nontoken+setAR SVar:TrigSac:DB$ SacrificeAll | ValidCards$ Permanent.nontoken+setARN+Other S:Mode$ CantPlayLand | ValidCard$ Card.setARN | Description$ Players can't cast spells or play lands with a name originally printed in the Arabian Nights expansion. S:Mode$ CantBeCast | ValidCard$ Card.setARN -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/city_in_a_bottle.jpg Oracle:Whenever another nontoken permanent with a name originally printed in the Arabian Nights expansion is on the battlefield, its controller sacrifices it.\nPlayers can't cast spells or play lands with a name originally printed in the Arabian Nights expansion. diff --git a/forge-gui/res/cardsfolder/c/city_of_shadows.txt b/forge-gui/res/cardsfolder/c/city_of_shadows.txt index 4888c08bf0d..45c5fc32b61 100644 --- a/forge-gui/res/cardsfolder/c/city_of_shadows.txt +++ b/forge-gui/res/cardsfolder/c/city_of_shadows.txt @@ -4,6 +4,6 @@ Types:Land A:AB$ PutCounter | Cost$ T Exile<1/Creature> | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME. A:AB$ Mana | Cost$ T | Produced$ C | Amount$ X | References$ X | SpellDescription$ Add {C} for each storage counter on City of Shadows. SVar:X:Count$CardCounters.STORAGE -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/city_of_shadows.jpg Oracle:{T}, Exile a creature you control: Put a storage counter on City of Shadows.\n{T}: Add {C} for each storage counter on City of Shadows. diff --git a/forge-gui/res/cardsfolder/c/city_of_solitude.txt b/forge-gui/res/cardsfolder/c/city_of_solitude.txt index b47a9677d30..b238c7c8d4d 100644 --- a/forge-gui/res/cardsfolder/c/city_of_solitude.txt +++ b/forge-gui/res/cardsfolder/c/city_of_solitude.txt @@ -4,6 +4,6 @@ Types:Enchantment S:Mode$ CantBeCast | ValidCard$ Card | NonCasterTurn$ True | Description$ Players can cast spells and activate abilities only during their own turns. S:Mode$ CantBeActivated | ValidCard$ Card | NonActivatorTurn$ True SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://wizards.com/global/images/magic/general/city_of_solitude.jpg Oracle:Players can cast spells and activate abilities only during their own turns. diff --git a/forge-gui/res/cardsfolder/c/city_of_traitors.txt b/forge-gui/res/cardsfolder/c/city_of_traitors.txt index b83cd768e9b..d56c9039466 100644 --- a/forge-gui/res/cardsfolder/c/city_of_traitors.txt +++ b/forge-gui/res/cardsfolder/c/city_of_traitors.txt @@ -4,6 +4,6 @@ Types:Land T:Mode$ LandPlayed | ValidCard$ Land.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ When you play another land, sacrifice CARDNAME. SVar:TrigSac:DB$Sacrifice | Defined$ Self A:AB$ Mana | Cost$ T | Produced$ C | Amount$ 2 | SpellDescription$ Add {C}{C}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/city_of_traitors.jpg Oracle:When you play another land, sacrifice City of Traitors.\n{T}: Add {C}{C}. diff --git a/forge-gui/res/cardsfolder/c/civic_guildmage.txt b/forge-gui/res/cardsfolder/c/civic_guildmage.txt index 3e40b4a72e9..a4a7c971274 100644 --- a/forge-gui/res/cardsfolder/c/civic_guildmage.txt +++ b/forge-gui/res/cardsfolder/c/civic_guildmage.txt @@ -4,6 +4,6 @@ Types:Creature Human Wizard PT:1/1 A:AB$ Pump | Cost$ G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDef$ +1 | SpellDescription$ Target creature gets +0/+1 until end of turn. A:AB$ ChangeZone | Cost$ U T | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SpellDescription$ Put target creature you control on top of its owner's library. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/civic_guildmage.jpg Oracle:{G}, {T}: Target creature gets +0/+1 until end of turn.\n{U}, {T}: Put target creature you control on top of its owner's library. diff --git a/forge-gui/res/cardsfolder/c/civilized_scholar_homicidal_brute.txt b/forge-gui/res/cardsfolder/c/civilized_scholar_homicidal_brute.txt index f194ee7794a..5dc529defad 100644 --- a/forge-gui/res/cardsfolder/c/civilized_scholar_homicidal_brute.txt +++ b/forge-gui/res/cardsfolder/c/civilized_scholar_homicidal_brute.txt @@ -7,7 +7,7 @@ SVar:DBDiscard:DB$Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 | Remem SVar:DBTransform:DB$ SetState | Defined$ Self | ConditionDefined$ Remembered | ConditionPresent$ Card.Creature | ConditionCompare$ EQ1 | SubAbility$ DBUntap | Mode$ Transform SVar:DBUntap:DB$ Untap | Defined$ Self | ConditionDefined$ Remembered | ConditionPresent$ Card.Creature | ConditionCompare$ EQ1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All AlternateMode:DoubleFaced SVar:Picture:http://www.wizards.com/global/images/magic/general/civilized_scholar.jpg Oracle:{T}: Draw a card, then discard a card. If a creature card is discarded this way, untap Civilized Scholar, then transform it. diff --git a/forge-gui/res/cardsfolder/c/clairvoyance.txt b/forge-gui/res/cardsfolder/c/clairvoyance.txt index 4ef90ab70b2..fa69fff59c7 100644 --- a/forge-gui/res/cardsfolder/c/clairvoyance.txt +++ b/forge-gui/res/cardsfolder/c/clairvoyance.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ RevealHand | Cost$ U | ValidTgts$ Player | TgtPrompt$ Select target player | SubAbility$ DelTrigSlowtrip | SpellDescription$ Look at target player's hand. Draw a card at the beginning of next turn's upkeep. SVar:DelTrigSlowtrip:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ DrawSlowtrip | TriggerDescription$ Draw a card. SVar:DrawSlowtrip:DB$Draw | NumCards$ 1 | Defined$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/clairvoyance.jpg Oracle:Look at target player's hand.\nDraw a card at the beginning of the next turn's upkeep. diff --git a/forge-gui/res/cardsfolder/c/clarion_ultimatum.txt b/forge-gui/res/cardsfolder/c/clarion_ultimatum.txt index b9439f3217b..9078aad1bb8 100644 --- a/forge-gui/res/cardsfolder/c/clarion_ultimatum.txt +++ b/forge-gui/res/cardsfolder/c/clarion_ultimatum.txt @@ -6,6 +6,6 @@ SVar:DBSearch:DB$ RepeatEach | UseImprinted$ True | RepeatCards$ Permanent.IsRem SVar:DBClarion:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Card.sharesNameWith Imprinted | ChangeNum$ 1 | Tapped$ True | NoShuffle$ True SVar:DBShuffle:DB$ Shuffle | Defined$ You | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/clarion_ultimatum.jpg Oracle:Choose five permanents you control. For each of those permanents, you may search your library for a card with the same name as that permanent. Put those cards onto the battlefield tapped, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/c/clash_of_realities.txt b/forge-gui/res/cardsfolder/c/clash_of_realities.txt index 474d6ec896e..6f92df0555b 100644 --- a/forge-gui/res/cardsfolder/c/clash_of_realities.txt +++ b/forge-gui/res/cardsfolder/c/clash_of_realities.txt @@ -7,6 +7,6 @@ SVar:CoRSpiritETB:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | V SVar:CoRSpiritDmg:DB$DealDamage | ValidTgts$ Creature.nonSpirit | TgtPrompt$ Select target non-Spirit creature | NumDmg$ 3 SVar:CoRNonETB:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ TriggeredCardController | TriggerZones$ Battlefield | Execute$ CoRNonDmg | TriggerDescription$ When this permanent enters the battlefield, you may have it deal 3 damage to target Spirit creature. SVar:CoRNonDmg:DB$DealDamage | ValidTgts$ Creature.Spirit | TgtPrompt$ Select target Spirit creature | NumDmg$ 3 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/clash_of_realities.jpg Oracle:All Spirits have "When this permanent enters the battlefield, you may have it deal 3 damage to target non-Spirit creature."\nNon-Spirit creatures have "When this creature enters the battlefield, you may have it deal 3 damage to target Spirit creature." diff --git a/forge-gui/res/cardsfolder/c/claws_of_gix.txt b/forge-gui/res/cardsfolder/c/claws_of_gix.txt index 26c83424b6c..c5bea288870 100644 --- a/forge-gui/res/cardsfolder/c/claws_of_gix.txt +++ b/forge-gui/res/cardsfolder/c/claws_of_gix.txt @@ -3,6 +3,6 @@ ManaCost:0 Types:Artifact A:AB$ GainLife | Cost$ 1 Sac<1/Permanent> | LifeAmount$ 1 | SpellDescription$ You gain 1 life. SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/claws_of_gix.jpg Oracle:{1}, Sacrifice a permanent: You gain 1 life. diff --git a/forge-gui/res/cardsfolder/c/cleanse.txt b/forge-gui/res/cardsfolder/c/cleanse.txt index 1f3a7ac0f44..46865173d6f 100644 --- a/forge-gui/res/cardsfolder/c/cleanse.txt +++ b/forge-gui/res/cardsfolder/c/cleanse.txt @@ -2,6 +2,6 @@ Name:Cleanse ManaCost:2 W W Types:Sorcery A:SP$ DestroyAll | Cost$ 2 W W | ValidCards$ Creature.Black | SpellDescription$ Destroy all black creatures. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/cleanse.jpg Oracle:Destroy all black creatures. diff --git a/forge-gui/res/cardsfolder/c/cleansing.txt b/forge-gui/res/cardsfolder/c/cleansing.txt index d73aa67904e..40614da2f32 100644 --- a/forge-gui/res/cardsfolder/c/cleansing.txt +++ b/forge-gui/res/cardsfolder/c/cleansing.txt @@ -3,6 +3,6 @@ ManaCost:W W W Types:Sorcery A:SP$ RepeatEach | Cost$ W W W | RepeatSubAbility$ DBSac | RepeatCards$ Land | SpellDescription$ For each land, destroy that land unless any player pays 1 life. SVar:DBSac:DB$ Destroy | UnlessCost$ PayLife<1> | UnlessPayer$ Player | UnlessAI$ DefinedRememberedController | Defined$ Remembered | StackDescription$ Destroy {c:Remembered} -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cleansing.jpg Oracle:For each land, destroy that land unless any player pays 1 life. diff --git a/forge-gui/res/cardsfolder/c/cleansing_beam.txt b/forge-gui/res/cardsfolder/c/cleansing_beam.txt index 1d8d0a4b25e..e3b2089a649 100644 --- a/forge-gui/res/cardsfolder/c/cleansing_beam.txt +++ b/forge-gui/res/cardsfolder/c/cleansing_beam.txt @@ -2,6 +2,6 @@ Name:Cleansing Beam ManaCost:4 R Types:Instant A:SP$ DealDamage | Cost$ 4 R | ValidTgts$ Creature | Radiance$ True | TgtPrompt$ Select target creature | NumDmg$ 2 | SpellDescription$ Radiance — CARDNAME deals 2 damage to target creature and each other creature that shares a color with it. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cleansing_beam.jpg Oracle:Radiance — Cleansing Beam deals 2 damage to target creature and each other creature that shares a color with it. diff --git a/forge-gui/res/cardsfolder/c/clear_the_land.txt b/forge-gui/res/cardsfolder/c/clear_the_land.txt index 204f935b1ea..414e124eba3 100644 --- a/forge-gui/res/cardsfolder/c/clear_the_land.txt +++ b/forge-gui/res/cardsfolder/c/clear_the_land.txt @@ -2,6 +2,6 @@ Name:Clear the Land ManaCost:2 G Types:Sorcery A:SP$ Dig | Cost$ 2 G | DigNum$ 5 | Defined$ Player | Reveal$ True | ChangeNum$ All | ChangeValid$ Land | DestinationZone$ Battlefield | Tapped$ True | DestinationZone2$ Exile | SpellDescription$ Each player reveals the top five cards of their library, puts all land cards revealed this way onto the battlefield tapped, and exiles the rest. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/clear_the_land.jpg Oracle:Each player reveals the top five cards of their library, puts all land cards revealed this way onto the battlefield tapped, and exiles the rest. diff --git a/forge-gui/res/cardsfolder/c/cliffside_market.txt b/forge-gui/res/cardsfolder/c/cliffside_market.txt index b75d7c55bc2..83c36d15875 100644 --- a/forge-gui/res/cardsfolder/c/cliffside_market.txt +++ b/forge-gui/res/cardsfolder/c/cliffside_market.txt @@ -6,7 +6,7 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigLife | TriggerZo SVar:TrigLife:DB$ ExchangeLife | Optional$ True | ValidTgts$ Player | TgtPrompt$ Select target player to exchange life totals with T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, exchange control of two target permanents that share a card type. SVar:RolledChaos:DB$ ExchangeControl | ValidTgts$ Permanent | TgtPrompt$ Select target permanent card | TargetsWithSharedTypes$ Creature,Artifact,Enchantment,Planeswalker,Land | TargetUnique$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/cliffside_market.jpg Oracle:When you planeswalk to Cliffside Market or at the beginning of your upkeep, you may exchange life totals with target player.\nWhenever you roll {CHAOS}, exchange control of two target permanents that share a card type. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/c/cloak_of_confusion.txt b/forge-gui/res/cardsfolder/c/cloak_of_confusion.txt index b67d0b03552..e689224e076 100644 --- a/forge-gui/res/cardsfolder/c/cloak_of_confusion.txt +++ b/forge-gui/res/cardsfolder/c/cloak_of_confusion.txt @@ -7,6 +7,6 @@ S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddTrigger$ TrigPump | Add SVar:TrigPump:Mode$ AttackerUnblocked | ValidCard$ Card.Self | Execute$ CloakofConfusionPump | OptionalDecider$ You | TriggerDescription$ Whenever enchanted creature attacks and isn't blocked, you may have it assign no combat damage this turn. If you do, defending player discards a card at random. SVar:CloakofConfusionPump:DB$ Pump | Defined$ Self | KW$ Prevent all combat damage that would be dealt by CARDNAME. | SubAbility$ CloakofConfusionDiscard SVar:CloakofConfusionDiscard:DB$ Discard | Defined$ DefendingPlayer | Mode$ Random | NumCards$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cloak_of_confusion.jpg Oracle:Enchant creature you control\nWhenever enchanted creature attacks and isn't blocked, you may have it assign no combat damage this turn. If you do, defending player discards a card at random. diff --git a/forge-gui/res/cardsfolder/c/clock_of_omens.txt b/forge-gui/res/cardsfolder/c/clock_of_omens.txt index da4372af1a1..d3c3a613827 100644 --- a/forge-gui/res/cardsfolder/c/clock_of_omens.txt +++ b/forge-gui/res/cardsfolder/c/clock_of_omens.txt @@ -3,7 +3,7 @@ ManaCost:4 Types:Artifact A:AB$ Untap | Cost$ tapXType<2/Artifact> | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Untap target artifact. SVar:NonStackingEffect:True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/clock_of_omens.jpg Oracle:Tap two untapped artifacts you control: Untap target artifact. diff --git a/forge-gui/res/cardsfolder/c/clockspinning.txt b/forge-gui/res/cardsfolder/c/clockspinning.txt index 23535acbe88..5a9997acaaf 100644 --- a/forge-gui/res/cardsfolder/c/clockspinning.txt +++ b/forge-gui/res/cardsfolder/c/clockspinning.txt @@ -3,6 +3,6 @@ ManaCost:U Types:Instant K:Buyback:3 A:SP$ AddOrRemoveCounter | Cost$ U | CounterNum$ 1 | ValidTgts$ Permanent.inZoneBattlefield,Card.suspended | TgtZone$ Battlefield,Exile | AITgts$ Card.HasCounters | TgtPrompt$ Select target permanent or suspended card. | SpellDescription$ Choose a counter on target permanent or suspended card. Remove that counter from that permanent or card or put another of those counters on it. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/clockspinning.jpg Oracle:Buyback {3} (You may pay an additional {3} as you cast this spell. If you do, put this card into your hand as it resolves.)\nChoose a counter on target permanent or suspended card. Remove that counter from that permanent or card or put another of those counters on it. diff --git a/forge-gui/res/cardsfolder/c/cloud_key.txt b/forge-gui/res/cardsfolder/c/cloud_key.txt index 933022b9256..40e0b8d848a 100644 --- a/forge-gui/res/cardsfolder/c/cloud_key.txt +++ b/forge-gui/res/cardsfolder/c/cloud_key.txt @@ -4,6 +4,6 @@ Types:Artifact S:Mode$ ReduceCost | ValidCard$ Card.ChosenType | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Spells you cast of the chosen type cost {1} less to cast. K:ETBReplacement:Other:ChooseCT SVar:ChooseCT:DB$ ChooseType | Defined$ You | Type$ Card | ValidTypes$ Artifact,Creature,Enchantment,Instant,Sorcery | SpellDescription$ As CARDNAME enters the battlefield, choose artifact, creature, enchantment, instant, or sorcery. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cloud_key.jpg Oracle:As Cloud Key enters the battlefield, choose artifact, creature, enchantment, instant, or sorcery.\nSpells you cast of the chosen type cost {1} less to cast. diff --git a/forge-gui/res/cardsfolder/c/cloudpost.txt b/forge-gui/res/cardsfolder/c/cloudpost.txt index 63a74a672a7..2ae7eb9a86f 100644 --- a/forge-gui/res/cardsfolder/c/cloudpost.txt +++ b/forge-gui/res/cardsfolder/c/cloudpost.txt @@ -4,6 +4,6 @@ Types:Land Locus K:CARDNAME enters the battlefield tapped. A:AB$ Mana | Cost$ T | Produced$ C | Amount$ X | References$ X | SpellDescription$ Add {C} for each Locus on the battlefield. SVar:X:Count$Valid Locus -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/cloudpost.jpg Oracle:Cloudpost enters the battlefield tapped.\n{T}: Add {C} for each Locus on the battlefield. diff --git a/forge-gui/res/cardsfolder/c/cloudstone_curio.txt b/forge-gui/res/cardsfolder/c/cloudstone_curio.txt index 34c7ca03a3f..80652d517ed 100644 --- a/forge-gui/res/cardsfolder/c/cloudstone_curio.txt +++ b/forge-gui/res/cardsfolder/c/cloudstone_curio.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact T:Mode$ ChangesZone | ValidCard$ Permanent.YouCtrl+nonArtifact | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigBounce | TriggerDescription$ Whenever a nonartifact permanent enters the battlefield under your control, you may return another permanent you control that shares a permanent type with it to its owner's hand. SVar:TrigBounce:DB$ ChangeZone | DefinedPlayer$ TriggeredCardController | ChangeType$ Triggered.Other+sharesPermanentTypeWith | ChangeNum$ 1 | Origin$ Battlefield | Destination$ Hand | Hidden$ True | Optional$ You -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/cloudstone_curio.jpg Oracle:Whenever a nonartifact permanent enters the battlefield under your control, you may return another permanent you control that shares a permanent type with it to its owner's hand. diff --git a/forge-gui/res/cardsfolder/c/cloven_casting.txt b/forge-gui/res/cardsfolder/c/cloven_casting.txt index f1a4a9fe36b..ea70f2dfb54 100644 --- a/forge-gui/res/cardsfolder/c/cloven_casting.txt +++ b/forge-gui/res/cardsfolder/c/cloven_casting.txt @@ -3,6 +3,6 @@ ManaCost:5 U R Types:Enchantment T:Mode$ SpellCast | ValidCard$ Instant.MultiColor,Sorcery.MultiColor | ValidActivatingPlayer$ You | Execute$ TrigCopy | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a multicolored instant or sorcery spell, you may pay {1}. If you do, copy that spell. You may choose new targets for the copy. SVar:TrigCopy:AB$ CopySpellAbility | Cost$ 1 | Defined$ TriggeredSpellAbility -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/cloven_casting.jpg Oracle:Whenever you cast a multicolored instant or sorcery spell, you may pay {1}. If you do, copy that spell. You may choose new targets for the copy. diff --git a/forge-gui/res/cardsfolder/c/coal_golem.txt b/forge-gui/res/cardsfolder/c/coal_golem.txt index a7a30b90d80..2afd31700fb 100644 --- a/forge-gui/res/cardsfolder/c/coal_golem.txt +++ b/forge-gui/res/cardsfolder/c/coal_golem.txt @@ -3,6 +3,6 @@ ManaCost:5 Types:Artifact Creature Golem PT:3/3 A:AB$ Mana | Cost$ 3 Sac<1/CARDNAME> | Produced$ R | Amount$ 3 | SpellDescription$ Add {R}{R}{R}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/coal_golem.jpg Oracle:{3}, Sacrifice Coal Golem: Add {R}{R}{R}. diff --git a/forge-gui/res/cardsfolder/c/coalhauler_swine.txt b/forge-gui/res/cardsfolder/c/coalhauler_swine.txt index b82daa54206..19272f29572 100644 --- a/forge-gui/res/cardsfolder/c/coalhauler_swine.txt +++ b/forge-gui/res/cardsfolder/c/coalhauler_swine.txt @@ -5,6 +5,6 @@ PT:4/4 T:Mode$ DamageDoneOnce | Execute$ TrigDamage | ValidTarget$ Card.Self | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME is dealt damage, it deals that much damage to each player. SVar:TrigDamage:DB$ DealDamage | NumDmg$ X | Defined$ Player | References$ X SVar:X:TriggerCount$DamageAmount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/coalhauler_swine.jpg Oracle:Whenever Coalhauler Swine is dealt damage, it deals that much damage to each player. diff --git a/forge-gui/res/cardsfolder/c/coalition_victory.txt b/forge-gui/res/cardsfolder/c/coalition_victory.txt index fc91b97fbad..2e9d71d3316 100644 --- a/forge-gui/res/cardsfolder/c/coalition_victory.txt +++ b/forge-gui/res/cardsfolder/c/coalition_victory.txt @@ -5,6 +5,6 @@ A:SP$ WinsGame | Cost$ 3 W U B R G | Defined$ You | ConditionCheckSVar$ X | Cond SVar:Z:Count$ColoredCreatures SVar:Y:Count$Domain SVar:X:SVar$Y/Plus.Z -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/coalition_victory.jpg Oracle:You win the game if you control a land of each basic land type and a creature of each color. diff --git a/forge-gui/res/cardsfolder/c/coastal_wizard.txt b/forge-gui/res/cardsfolder/c/coastal_wizard.txt index 389ee8e092d..9326e97e38c 100644 --- a/forge-gui/res/cardsfolder/c/coastal_wizard.txt +++ b/forge-gui/res/cardsfolder/c/coastal_wizard.txt @@ -4,6 +4,6 @@ Types:Creature Human Wizard PT:1/1 A:AB$ ChangeZone | Cost$ T | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBChangeZone | PlayerTurn$ True | ActivationPhases$ Upkeep->BeginCombat | SpellDescription$ Return CARDNAME and another target creature to their owners' hands. Activate this ability only during your turn, before attackers are declared. SVar:DBChangeZone:DB$ ChangeZone | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/coastal_wizard.jpg Oracle:{T}: Return Coastal Wizard and another target creature to their owners' hands. Activate this ability only during your turn, before attackers are declared. diff --git a/forge-gui/res/cardsfolder/c/coat_of_arms.txt b/forge-gui/res/cardsfolder/c/coat_of_arms.txt index 9e67c3200ee..edc4e5c1af9 100644 --- a/forge-gui/res/cardsfolder/c/coat_of_arms.txt +++ b/forge-gui/res/cardsfolder/c/coat_of_arms.txt @@ -4,6 +4,6 @@ Types:Artifact S:Mode$ Continuous | Affected$ Creature | AddPower$ AffectedX | AddToughness$ AffectedX | EffectZone$ Battlefield | Description$ Each creature gets +1/+1 for each other creature on the battlefield that shares at least one creature type with it. SVar:AffectedX:Count$Valid Creature.sharesCreatureTypeWith+Other SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/coat_of_arms.jpg Oracle:Each creature gets +1/+1 for each other creature on the battlefield that shares at least one creature type with it. (For example, if two Goblin Warriors and a Goblin Shaman are on the battlefield, each gets +2/+2.) \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/c/coax_from_the_blind_eternities.txt b/forge-gui/res/cardsfolder/c/coax_from_the_blind_eternities.txt index 411f5ccd54d..a624eab00b3 100644 --- a/forge-gui/res/cardsfolder/c/coax_from_the_blind_eternities.txt +++ b/forge-gui/res/cardsfolder/c/coax_from_the_blind_eternities.txt @@ -2,6 +2,6 @@ Name:Coax from the Blind Eternities ManaCost:2 U Types:Sorcery A:SP$ ChangeZone | Cost$ 2 U | Origin$ Sideboard,Exile | Destination$ Hand | ChangeType$ Card.Eldrazi+YouOwn | ChangeNum$ 1 | SpellDescription$ You may choose an Eldrazi card you own from outside the game or in exile, reveal that card, and put it into your hand. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/coax_from_the_blind_eternities.jpg Oracle:You may choose an Eldrazi card you own from outside the game or in exile, reveal that card, and put it into your hand. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/c/cocoon.txt b/forge-gui/res/cardsfolder/c/cocoon.txt index d61ac601170..43c589798db 100644 --- a/forge-gui/res/cardsfolder/c/cocoon.txt +++ b/forge-gui/res/cardsfolder/c/cocoon.txt @@ -15,6 +15,6 @@ SVar:TrigPump:DB$ Pump | Defined$ Enchanted | KW$ Flying | Permanent$ True | Con SVar:TrigSac:DB$ Sacrifice | Defined$ Self | ConditionCheckSVar$ X | ConditionSVarCompare$ LE0 | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$RememberedSize -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/cocoon.jpg Oracle:Enchant creature you control\nWhen Cocoon enters the battlefield, tap enchanted creature and put three pupa counters on Cocoon.\nEnchanted creature doesn't untap during your untap step if Cocoon has a pupa counter on it.\nAt the beginning of your upkeep, remove a pupa counter from Cocoon. If you can't, sacrifice it, put a +1/+1 counter on enchanted creature, and that creature gains flying. diff --git a/forge-gui/res/cardsfolder/c/coffin_puppets.txt b/forge-gui/res/cardsfolder/c/coffin_puppets.txt index f70878afc43..163398b8ca9 100644 --- a/forge-gui/res/cardsfolder/c/coffin_puppets.txt +++ b/forge-gui/res/cardsfolder/c/coffin_puppets.txt @@ -3,6 +3,6 @@ ManaCost:3 B B Types:Creature Zombie PT:3/3 A:AB$ ChangeZone | Cost$ Sac<2/Land> | Origin$ Graveyard | Destination$ Battlefield | ActivationZone$ Graveyard | PlayerTurn$ True | ActivationPhases$ Upkeep | IsPresent$ Swamp.YouCtrl | SpellDescription$ Return CARDNAME from your graveyard to the battlefield. Activate this ability only during your upkeep and only if you control a Swamp. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/coffin_puppets.jpg Oracle:Sacrifice two lands: Return Coffin Puppets from your graveyard to the battlefield. Activate this ability only during your upkeep and only if you control a Swamp. diff --git a/forge-gui/res/cardsfolder/c/coffin_purge.txt b/forge-gui/res/cardsfolder/c/coffin_purge.txt index a65a64c8013..3dc0a2aaac6 100644 --- a/forge-gui/res/cardsfolder/c/coffin_purge.txt +++ b/forge-gui/res/cardsfolder/c/coffin_purge.txt @@ -3,6 +3,6 @@ ManaCost:B Types:Instant K:Flashback:B A:SP$ ChangeZone | Cost$ B | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SpellDescription$ Exile target card from a graveyard. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/coffin_purge.jpg Oracle:Exile target card from a graveyard.\nFlashback {B} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/c/cognivore.txt b/forge-gui/res/cardsfolder/c/cognivore.txt index b086d7e11ac..1af9214fb74 100644 --- a/forge-gui/res/cardsfolder/c/cognivore.txt +++ b/forge-gui/res/cardsfolder/c/cognivore.txt @@ -5,6 +5,6 @@ PT:*/* K:Flying S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ CARDNAME's power and toughness are each equal to the number of instant cards in all graveyards. SVar:X:Count$TypeInAllYards.Instant -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/cognivore.jpg Oracle:Flying\nCognivore's power and toughness are each equal to the number of instant cards in all graveyards. diff --git a/forge-gui/res/cardsfolder/c/cold_snap.txt b/forge-gui/res/cardsfolder/c/cold_snap.txt index 265f7140d74..710b6b88d2d 100644 --- a/forge-gui/res/cardsfolder/c/cold_snap.txt +++ b/forge-gui/res/cardsfolder/c/cold_snap.txt @@ -5,6 +5,6 @@ K:Cumulative upkeep:2 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each player's upkeep, CARDNAME deals damage to that player equal to the number of snow lands they control. SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredPlayer | NumDmg$ X | References$ X SVar:X:Count$Valid Land.Snow+ActivePlayerCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/cold_snap.jpg Oracle:Cumulative upkeep {2} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nAt the beginning of each player's upkeep, Cold Snap deals damage to that player equal to the number of snow lands they control. diff --git a/forge-gui/res/cardsfolder/c/cold_storage.txt b/forge-gui/res/cardsfolder/c/cold_storage.txt index e7a3dc1fc56..706870e99f0 100644 --- a/forge-gui/res/cardsfolder/c/cold_storage.txt +++ b/forge-gui/res/cardsfolder/c/cold_storage.txt @@ -8,6 +8,6 @@ SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cold_storage.jpg Oracle:{3}: Exile target creature you control.\nSacrifice Cold Storage: Return each creature card exiled with Cold Storage to the battlefield under your control. diff --git a/forge-gui/res/cardsfolder/c/colfenors_plans.txt b/forge-gui/res/cardsfolder/c/colfenors_plans.txt index 95776d2f46e..e6e6dafa39c 100644 --- a/forge-gui/res/cardsfolder/c/colfenors_plans.txt +++ b/forge-gui/res/cardsfolder/c/colfenors_plans.txt @@ -10,6 +10,6 @@ T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCar SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/colfenors_plans.jpg Oracle:When Colfenor's Plans enters the battlefield, exile the top seven cards of your library face down.\nYou may look at and play cards exiled with Colfenor's Plans.\nSkip your draw step.\nYou can't cast more than one spell each turn. diff --git a/forge-gui/res/cardsfolder/c/collapsing_borders.txt b/forge-gui/res/cardsfolder/c/collapsing_borders.txt index 3e88992fac0..832d57d7b88 100644 --- a/forge-gui/res/cardsfolder/c/collapsing_borders.txt +++ b/forge-gui/res/cardsfolder/c/collapsing_borders.txt @@ -5,6 +5,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ TrigGainLife | Tr SVar:TrigGainLife:DB$ GainLife | Defined$ TriggeredPlayer | LifeAmount$ DomainX | SubAbility$ DBDamage | References$ DomainX SVar:DBDamage:DB$ DealDamage | Defined$ TriggeredPlayer | NumDmg$ 3 SVar:DomainX:Count$DomainActivePlayer -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/collapsing_borders.jpg Oracle:Domain — At the beginning of each player's upkeep, that player gains 1 life for each basic land type among lands they control. Then Collapsing Borders deals 3 damage to them. diff --git a/forge-gui/res/cardsfolder/c/collateral_damage.txt b/forge-gui/res/cardsfolder/c/collateral_damage.txt index 277e5d60bb4..0b9ec1c46dc 100644 --- a/forge-gui/res/cardsfolder/c/collateral_damage.txt +++ b/forge-gui/res/cardsfolder/c/collateral_damage.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Instant A:SP$ DealDamage | Cost$ R Sac<1/Creature> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to any target. SVar:AIPreference:SacCost$Creature.token+powerLE2+toughnessLE2,Creature.powerLE1+toughnessLE2+cmcLE2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/collateral_damage.jpg Oracle:As an additional cost to cast this spell, sacrifice a creature.\nCollateral Damage deals 3 damage to any target. diff --git a/forge-gui/res/cardsfolder/c/collective_voyage.txt b/forge-gui/res/cardsfolder/c/collective_voyage.txt index 39b1b6f254f..0308e03457a 100644 --- a/forge-gui/res/cardsfolder/c/collective_voyage.txt +++ b/forge-gui/res/cardsfolder/c/collective_voyage.txt @@ -8,6 +8,6 @@ SVar:DBSearch:DB$ ChangeZone | DefinedPlayer$ Player | ChangeType$ Land.Basic | SVar:DBReset:DB$ StoreSVar | SVar$ JoinForcesAmount | Type$ Number | Expression$ 0 | References$ JoinForcesAmount SVar:X:Count$ChosenNumber SVar:JoinForcesAmount:Number$0 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/collective_voyage.jpg Oracle:Join forces — Starting with you, each player may pay any amount of mana. Each player searches their library for up to X basic land cards, where X is the total amount of mana paid this way, puts them onto the battlefield tapped, then shuffles their library. diff --git a/forge-gui/res/cardsfolder/c/combust.txt b/forge-gui/res/cardsfolder/c/combust.txt index 625506c93b1..479f3e0992b 100644 --- a/forge-gui/res/cardsfolder/c/combust.txt +++ b/forge-gui/res/cardsfolder/c/combust.txt @@ -3,6 +3,6 @@ ManaCost:1 R Types:Instant K:CARDNAME can't be countered. A:SP$ DealDamage | Cost$ 1 R | ValidTgts$ Creature.White,Creature.Blue | NumDmg$ 5 | NoPrevention$ True | TgtPrompt$ Select target white or blue creature. | SpellDescription$ CARDNAME deals 5 damage to target white or blue creature. The damage can't be prevented. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/combust.jpg Oracle:This spell can't be countered.\nCombust deals 5 damage to target white or blue creature. The damage can't be prevented. diff --git a/forge-gui/res/cardsfolder/c/command_beacon.txt b/forge-gui/res/cardsfolder/c/command_beacon.txt index 17418a3aa75..edf2da34416 100644 --- a/forge-gui/res/cardsfolder/c/command_beacon.txt +++ b/forge-gui/res/cardsfolder/c/command_beacon.txt @@ -3,7 +3,7 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ ChangeZoneAll | Cost$ T Sac<1/CARDNAME> | ChangeType$ Card.IsCommander+YouOwn | Origin$ Command | Destination$ Hand | SpellDescription$ Put your commander into your hand from the command zone. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/command_beacon.jpg Oracle:{T}: Add {C}.\n{T}, Sacrifice Command Beacon: Put your commander into your hand from the command zone. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/c/commandeer.txt b/forge-gui/res/cardsfolder/c/commandeer.txt index 81df52642c6..4cf31b27537 100644 --- a/forge-gui/res/cardsfolder/c/commandeer.txt +++ b/forge-gui/res/cardsfolder/c/commandeer.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ ControlSpell | Cost$ 5 U U | ValidTgts$ Card.nonCreature | TargetType$ Spell | Mode$ Gain | SubAbility$ DBChooseTargets | SpellDescription$ Gain control of target noncreature spell. You may choose new targets for it. (If that spell is an artifact, enchantment, or planeswalker, the permanent enters the battlefield under your control.) SVar:DBChooseTargets:DB$ ChangeTargets | Defined$ Targeted | Optional$ True SVar:AltCost:Cost$ ExileFromHand<2/Card.Blue> | Description$ You may exile two blue cards from your hand rather than pay CARDNAME's mana cost. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/commandeer.jpg Oracle:You may exile two blue cards from your hand rather than pay this spell's mana cost.\nGain control of target noncreature spell. You may choose new targets for it. (If that spell is an artifact, enchantment, or planeswalker, the permanent enters the battlefield under your control.) diff --git a/forge-gui/res/cardsfolder/c/commanders_sphere.txt b/forge-gui/res/cardsfolder/c/commanders_sphere.txt index 6970c428fe1..e091243e9ab 100644 --- a/forge-gui/res/cardsfolder/c/commanders_sphere.txt +++ b/forge-gui/res/cardsfolder/c/commanders_sphere.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ Combo ColorIdentity | SpellDescription$ Add one mana of any color in your commander's color identity. A:AB$ Draw | Cost$ Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/commanders_sphere.jpg Oracle:{T}: Add one mana of any color in your commander's color identity.\nSacrifice Commander's Sphere: Draw a card. diff --git a/forge-gui/res/cardsfolder/c/common_cause.txt b/forge-gui/res/cardsfolder/c/common_cause.txt index 158333f1dc6..730c035cf30 100644 --- a/forge-gui/res/cardsfolder/c/common_cause.txt +++ b/forge-gui/res/cardsfolder/c/common_cause.txt @@ -4,6 +4,6 @@ Types:Enchantment S:Mode$ Continuous | AffectedZone$ Battlefield | Affected$ Creature.nonArtifact | AddPower$ 2 | AddToughness$ 2 | CheckSVar$ X | SVarCompare$ EQY | References$ X,Y | Description$ Nonartifact creatures get +2/+2 as long as they all share a color. SVar:X:Count$Valid Creature.nonArtifact+SharesColorWith MostProminentColor SVar:Y:Count$Valid Creature.nonArtifact -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/common_cause.jpg Oracle:Nonartifact creatures get +2/+2 as long as they all share a color. diff --git a/forge-gui/res/cardsfolder/c/commune_with_lava.txt b/forge-gui/res/cardsfolder/c/commune_with_lava.txt index 1e92a30b3f8..bd62ab6daf3 100644 --- a/forge-gui/res/cardsfolder/c/commune_with_lava.txt +++ b/forge-gui/res/cardsfolder/c/commune_with_lava.txt @@ -6,6 +6,6 @@ SVar:DBMayBePlay:DB$ Effect | StaticAbilities$ STCommuned | Duration$ UntilTheEn SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:STCommuned:Mode$ Continuous | Affected$ Card.IsRemembered | EffectZone$ Command | AffectedZone$ Exile | MayPlay$ True | Description$ Until the end of your next turn, you may play those cards. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/commune_with_lava.jpg Oracle:Exile the top X cards of your library. Until the end of your next turn, you may play those cards. diff --git a/forge-gui/res/cardsfolder/c/companion_of_the_trials.txt b/forge-gui/res/cardsfolder/c/companion_of_the_trials.txt index 8fe55ee9e59..22847a6c48d 100644 --- a/forge-gui/res/cardsfolder/c/companion_of_the_trials.txt +++ b/forge-gui/res/cardsfolder/c/companion_of_the_trials.txt @@ -4,6 +4,6 @@ Types:Creature Bird Soldier PT:2/2 K:Flying A:AB$ Untap | Cost$ 1 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | IsPresent$ Planeswalker.Gideon+YouCtrl | SpellDescription$ Untap target creature. Activate this ability only if you control a Gideon planeswalker. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/companion_of_the_trials.jpg Oracle:Flying\n{1}{W}: Untap target creature. Activate this ability only if you control a Gideon planeswalker. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/c/complex_automaton.txt b/forge-gui/res/cardsfolder/c/complex_automaton.txt index ece14311fe5..17e31cf9dcf 100644 --- a/forge-gui/res/cardsfolder/c/complex_automaton.txt +++ b/forge-gui/res/cardsfolder/c/complex_automaton.txt @@ -4,6 +4,6 @@ Types:Artifact Creature Golem PT:4/4 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Permanent.YouCtrl | PresentCompare$ GE7 | TriggerZones$ Battlefield | Execute$ TrigBounce | TriggerDescription$ At the beginning of your upkeep, if you control seven or more permanents, return CARDNAME to its owner's hand. SVar:TrigBounce:DB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Defined$ Self -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/complex_automaton.jpg Oracle:At the beginning of your upkeep, if you control seven or more permanents, return Complex Automaton to its owner's hand. diff --git a/forge-gui/res/cardsfolder/c/composite_golem.txt b/forge-gui/res/cardsfolder/c/composite_golem.txt index 20dcce93418..247f7d64e28 100644 --- a/forge-gui/res/cardsfolder/c/composite_golem.txt +++ b/forge-gui/res/cardsfolder/c/composite_golem.txt @@ -3,6 +3,6 @@ ManaCost:6 Types:Artifact Creature Golem PT:4/4 A:AB$ Mana | Cost$ Sac<1/CARDNAME> | Produced$ W U B R G | SpellDescription$ Add {W}{U}{B}{R}{G}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/composite_golem.jpg Oracle:Sacrifice Composite Golem: Add {W}{U}{B}{R}{G}. diff --git a/forge-gui/res/cardsfolder/c/compost.txt b/forge-gui/res/cardsfolder/c/compost.txt index d5fcdee9b09..37e75f36fe8 100644 --- a/forge-gui/res/cardsfolder/c/compost.txt +++ b/forge-gui/res/cardsfolder/c/compost.txt @@ -3,6 +3,6 @@ ManaCost:1 G Types:Enchantment T:Mode$ ChangesZone | ValidCard$ Card.Black+nonToken+OppOwn | Origin$ Any | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigDraw | OptionalDecider$ You | TriggerDescription$ Whenever a black card is put into an opponent's graveyard from anywhere, you may draw a card. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/compost.jpg Oracle:Whenever a black card is put into an opponent's graveyard from anywhere, you may draw a card. diff --git a/forge-gui/res/cardsfolder/c/compulsion.txt b/forge-gui/res/cardsfolder/c/compulsion.txt index 51baa89fa0e..87684058c76 100644 --- a/forge-gui/res/cardsfolder/c/compulsion.txt +++ b/forge-gui/res/cardsfolder/c/compulsion.txt @@ -4,6 +4,6 @@ Types:Enchantment A:AB$ Draw | Cost$ 1 U Discard<1/Card> | NumCards$ 1 | SpellDescription$ Draw a card. A:AB$ Draw | Cost$ 1 U Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/compulsion.jpg Oracle:{1}{U}, Discard a card: Draw a card.\n{1}{U}, Sacrifice Compulsion: Draw a card. diff --git a/forge-gui/res/cardsfolder/c/conclave_guildmage.txt b/forge-gui/res/cardsfolder/c/conclave_guildmage.txt index 453c2b920aa..5d105834c68 100644 --- a/forge-gui/res/cardsfolder/c/conclave_guildmage.txt +++ b/forge-gui/res/cardsfolder/c/conclave_guildmage.txt @@ -4,5 +4,5 @@ Types:Creature Elf Cleric PT:2/2 A:AB$ PumpAll | Cost$ G T | ValidCards$ Creature.YouCtrl | KW$ Trample | SpellDescription$ Creatures you control gain trample until end of turn. A:AB$ Token | Cost$ 5 W T | TokenAmount$ 1 | TokenScript$ wg_2_2_elf_knight_vigilance | SpellDescription$ Create a 2/2 green and white Elf Knight creature token with vigilance. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random Oracle:{G}, {T}: Creatures you control gain trample until end of turn.\n{5}{W}, {T}: Create a 2/2 green and white Elf Knight creature token with vigilance. diff --git a/forge-gui/res/cardsfolder/c/concordant_crossroads.txt b/forge-gui/res/cardsfolder/c/concordant_crossroads.txt index 06a15580145..5c8339c3e58 100644 --- a/forge-gui/res/cardsfolder/c/concordant_crossroads.txt +++ b/forge-gui/res/cardsfolder/c/concordant_crossroads.txt @@ -5,6 +5,6 @@ S:Mode$ Continuous | Affected$ Creature | AddKeyword$ Haste | Description$ All c SVar:BuffedBy:Creature SVar:AntiBuffedBy:Creature SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/concordant_crossroads.jpg Oracle:All creatures have haste. diff --git a/forge-gui/res/cardsfolder/c/conduit_of_ruin.txt b/forge-gui/res/cardsfolder/c/conduit_of_ruin.txt index fbfb44bad4d..740aa091346 100644 --- a/forge-gui/res/cardsfolder/c/conduit_of_ruin.txt +++ b/forge-gui/res/cardsfolder/c/conduit_of_ruin.txt @@ -5,6 +5,6 @@ PT:5/5 T:Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When you cast CARDNAME, you may search your library for a colorless creature card with converted mana cost 7 or greater, reveal it, then shuffle your library and put that card on top of it. SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Creature.Colorless+cmcGE7 | ChangeNum$ 1 | ShuffleNonMandatory$ True S:Mode$ ReduceCost | EffectZone$ Battlefield | ValidCard$ Card.Creature | Activator$ You | Type$ Spell | OnlyFirstSpell$ True | Amount$ 2 | Description$ The first creature spell you cast each turn costs {2} less to cast. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/conduit_of_ruin.jpg Oracle:When you cast this spell, you may search your library for a colorless creature card with converted mana cost 7 or greater, reveal it, then shuffle your library and put that card on top of it.\nThe first creature spell you cast each turn costs {2} less to cast. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/c/confiscation_coup.txt b/forge-gui/res/cardsfolder/c/confiscation_coup.txt index 6fa3efd3002..974e53e9883 100644 --- a/forge-gui/res/cardsfolder/c/confiscation_coup.txt +++ b/forge-gui/res/cardsfolder/c/confiscation_coup.txt @@ -3,7 +3,7 @@ ManaCost:3 U U Types:Sorcery A:SP$ PutCounter | Cost$ 3 U U | Defined$ You | CounterType$ ENERGY | CounterNum$ 4 | SubAbility$ DBGainControl | SpellDescription$ Choose target artifact or creature. You get {E}{E}{E}{E} (four energy counters), then you may pay an amount of {E} equal to that permanent's converted mana cost. If you do, gain control of it. SVar:DBGainControl:DB$ GainControl | ValidTgts$ Artifact,Creature | TgtPrompt$ Select target artifact or creature | References$ X | UnlessCost$ PayEnergy | UnlessPayer$ You | UnlessSwitched$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:X:Targeted$CardManaCost SVar:Picture:http://www.wizards.com/global/images/magic/general/confiscation_coup.jpg Oracle:Choose target artifact or creature. You get {E}{E}{E}{E} (four energy counters), then you may pay an amount of {E} equal to that permanent's converted mana cost. If you do, gain control of it. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/c/confusion_in_the_ranks.txt b/forge-gui/res/cardsfolder/c/confusion_in_the_ranks.txt index 39156aeef2a..e6f94222468 100644 --- a/forge-gui/res/cardsfolder/c/confusion_in_the_ranks.txt +++ b/forge-gui/res/cardsfolder/c/confusion_in_the_ranks.txt @@ -3,6 +3,6 @@ ManaCost:3 R R Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Artifact,Creature,Enchantment | TriggerZones$ Battlefield | Execute$ TrigExchangeControl | TriggerDescription$ Whenever an artifact, creature, or enchantment enters the battlefield, its controller chooses target permanent another player controls that shares a card type with it. Exchange control of those permanents. SVar:TrigExchangeControl:DB$ ExchangeControl | Defined$ TriggeredCard | TargetingPlayer$ TriggeredCardController | TargetsWithDefinedController$ NonTriggeredCardController | ValidTgts$ Permanent | TargetsWithSharedCardType$ TriggeredCard -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/confusion_in_the_ranks.jpg Oracle:Whenever an artifact, creature, or enchantment enters the battlefield, its controller chooses target permanent another player controls that shares a card type with it. Exchange control of those permanents. diff --git a/forge-gui/res/cardsfolder/c/conjured_currency.txt b/forge-gui/res/cardsfolder/c/conjured_currency.txt index dca4479ad64..2967352ac2e 100644 --- a/forge-gui/res/cardsfolder/c/conjured_currency.txt +++ b/forge-gui/res/cardsfolder/c/conjured_currency.txt @@ -3,6 +3,6 @@ ManaCost:5 U Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | ValidPlayer$ You | Execute$ ExchangeCards | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may exchange control of CARDNAME and target permanent you neither own nor control. SVar:ExchangeCards:DB$ ExchangeControl | Defined$ Self | ValidTgts$ Permanent.YouDontCtrl+YouDontOwn | TgtPrompt$ Select target permanent you neither own nor control | SpellDescription$ Exchange control of CARDNAME and target permanent you neither own nor control. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/conjured_currency.jpg Oracle:At the beginning of your upkeep, you may exchange control of Conjured Currency and target permanent you neither own nor control. diff --git a/forge-gui/res/cardsfolder/c/conjurers_closet.txt b/forge-gui/res/cardsfolder/c/conjurers_closet.txt index faddeff2f86..fb966109ca2 100644 --- a/forge-gui/res/cardsfolder/c/conjurers_closet.txt +++ b/forge-gui/res/cardsfolder/c/conjurers_closet.txt @@ -6,6 +6,6 @@ SVar:ConjurerExile:DB$ ChangeZone | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Sel SVar:ConjurerReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ All | Destination$ Battlefield | GainControl$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True #TODO: Improve the AI to make it bounce its own locked creatures (e.g. Arrest'ed) to remove debuffs. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/conjurers_closet.jpg Oracle:At the beginning of your end step, you may exile target creature you control, then return that card to the battlefield under your control. diff --git a/forge-gui/res/cardsfolder/c/consecrate_land.txt b/forge-gui/res/cardsfolder/c/consecrate_land.txt index ec212729e6d..1bb3819858f 100644 --- a/forge-gui/res/cardsfolder/c/consecrate_land.txt +++ b/forge-gui/res/cardsfolder/c/consecrate_land.txt @@ -4,7 +4,7 @@ Types:Enchantment Aura K:Enchant land A:SP$ Attach | Cost$ W | ValidTgts$ Land | AILogic$ Pump S:Mode$ Continuous | Affected$ Land.EnchantedBy | AddHiddenKeyword$ CARDNAME can't be enchanted. | AddKeyword$ Indestructible | Description$ Enchanted land has indestructible and can't be enchanted by other Auras. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingAttachEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/consecrate_land.jpg Oracle:Enchant land\nEnchanted land has indestructible and can't be enchanted by other Auras. diff --git a/forge-gui/res/cardsfolder/c/consign_to_dream.txt b/forge-gui/res/cardsfolder/c/consign_to_dream.txt index d3f947b3fa6..5aac7586ed6 100644 --- a/forge-gui/res/cardsfolder/c/consign_to_dream.txt +++ b/forge-gui/res/cardsfolder/c/consign_to_dream.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Instant A:SP$ ChangeZone | Cost$ 2 U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBChangeZone | ConditionDefined$ Targeted | ConditionPresent$ Card.Green,Card.Red | ConditionCompare$ EQ0 | SpellDescription$ Return target permanent to its owner's hand. If that permanent is red or green, put it on top of its owner's library instead. SVar:DBChangeZone:DB$ ChangeZone | Defined$ Targeted | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | ConditionDefined$ Targeted | ConditionPresent$ Card.Green,Card.Red | ConditionCompare$ GE1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/consign_to_dream.jpg Oracle:Return target permanent to its owner's hand. If that permanent is red or green, put it on top of its owner's library instead. diff --git a/forge-gui/res/cardsfolder/c/conspiracy.txt b/forge-gui/res/cardsfolder/c/conspiracy.txt index 44991167760..2845adf859d 100644 --- a/forge-gui/res/cardsfolder/c/conspiracy.txt +++ b/forge-gui/res/cardsfolder/c/conspiracy.txt @@ -4,8 +4,8 @@ Types:Enchantment K:ETBReplacement:Other:ChooseCT SVar:ChooseCT:DB$ ChooseType | Defined$ You | Type$ Creature | SpellDescription$ As CARDNAME enters the battlefield, choose a creature type. | AILogic$ MostProminentInComputerDeck S:Mode$ Continuous | Affected$ Creature.YouCtrl | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library | AddType$ ChosenType | RemoveCreatureTypes$ True | Description$ Creatures you control are the chosen type. The same is true for creature spells you control and creature cards you own that aren't on the battlefield. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/conspiracy.jpg Oracle:As Conspiracy enters the battlefield, choose a creature type.\nCreatures you control are the chosen type. The same is true for creature spells you control and creature cards you own that aren't on the battlefield. diff --git a/forge-gui/res/cardsfolder/c/consulate_crackdown.txt b/forge-gui/res/cardsfolder/c/consulate_crackdown.txt index 00b1769d5c5..84024f2d44a 100644 --- a/forge-gui/res/cardsfolder/c/consulate_crackdown.txt +++ b/forge-gui/res/cardsfolder/c/consulate_crackdown.txt @@ -11,6 +11,6 @@ SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True SVar:PlayMain1:TRUE SVar:NeedsToPlayVar:Z GE2 SVar:Z:Count$Valid Artifact.OppCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/consulate_crackdown.jpg Oracle:When Consulate Crackdown enters the battlefield, exile all artifacts your opponents control until Consulate Crackdown leaves the battlefield. diff --git a/forge-gui/res/cardsfolder/c/consult_the_necrosages.txt b/forge-gui/res/cardsfolder/c/consult_the_necrosages.txt index 1f5df3dc18a..91501d957e1 100644 --- a/forge-gui/res/cardsfolder/c/consult_the_necrosages.txt +++ b/forge-gui/res/cardsfolder/c/consult_the_necrosages.txt @@ -5,6 +5,6 @@ A:SP$ Charm | Cost$ 1 U B | Choices$ DBDraw,DBDiscard SVar:DBDraw:DB$ Draw | ValidTgts$ Player | NumCards$ 2 | SpellDescription$ Target player draws two cards. SVar:DBDiscard:DB$ Discard | ValidTgts$ Player | NumCards$ 2 | Mode$ TgtChoose | SpellDescription$ Target player discards two cards. #TODO: The AI will pretty much always use this to draw cards or to deck the opponent, but not to force the opponent to discard cards. Might need some improvement. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/consult_the_necrosages.jpg Oracle:Choose one —\n• Target player draws two cards.\n• Target player discards two cards. diff --git a/forge-gui/res/cardsfolder/c/consuming_ferocity.txt b/forge-gui/res/cardsfolder/c/consuming_ferocity.txt index e730fbf60da..24b8f63775e 100644 --- a/forge-gui/res/cardsfolder/c/consuming_ferocity.txt +++ b/forge-gui/res/cardsfolder/c/consuming_ferocity.txt @@ -10,6 +10,6 @@ SVar:DBDmg:DB$ DealDamage | Defined$ TriggeredPlayer | DamageSource$ Enchanted | SVar:DBDes:DB$ Destroy | Defined$ Enchanted | NoRegen$ True | ConditionCheckSVar$ Y | ConditionSVarCompare$ GE3 SVar:Y:Count$TotalCounters_P1P0_Creature.EnchantedBy SVar:X:Enchanted$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/consuming_ferocity.jpg Oracle:Enchant non-Wall creature\nEnchanted creature gets +1/+0.\nAt the beginning of your upkeep, put a +1/+0 counter on enchanted creature. If that creature has three or more +1/+0 counters on it, it deals damage equal to its power to its controller, then destroy that creature and it can't be regenerated. diff --git a/forge-gui/res/cardsfolder/c/contagion.txt b/forge-gui/res/cardsfolder/c/contagion.txt index 320d8d10836..53ccfec418c 100644 --- a/forge-gui/res/cardsfolder/c/contagion.txt +++ b/forge-gui/res/cardsfolder/c/contagion.txt @@ -3,6 +3,6 @@ ManaCost:3 B B Types:Instant A:SP$ PutCounter | Cost$ 3 B B | ValidTgts$ Creature | TgtPrompt$ Select target creature to distribute counters to | CounterType$ M2M1 | CounterNum$ 2 | TargetMin$ 1 | TargetMax$ 2 | DividedAsYouChoose$ 2 | IsCurse$ True | SpellDescription$ Distribute two -2/-1 counters among one or two target creatures. SVar:AltCost:Cost$ PayLife<1> ExileFromHand<1/Card.Black> | Description$ You may pay 1 life and exile a black card from your hand rather than pay Contagion's mana cost. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/contagion.jpg Oracle:You may pay 1 life and exile a black card from your hand rather than pay this spell's mana cost.\nDistribute two -2/-1 counters among one or two target creatures. diff --git a/forge-gui/res/cardsfolder/c/contamination.txt b/forge-gui/res/cardsfolder/c/contamination.txt index d1f19a645fa..06d4eadc4b9 100644 --- a/forge-gui/res/cardsfolder/c/contamination.txt +++ b/forge-gui/res/cardsfolder/c/contamination.txt @@ -4,7 +4,7 @@ Types:Enchantment K:UpkeepCost:Sac<1/Creature> R:Event$ ProduceMana | ActiveZones$ Battlefield | ValidCard$ Land | ManaReplacement$ ProduceB | Description$ If a land is tapped for mana, it produces {B} instead of any other type and amount. SVar:ProduceB:Any->B -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/contamination.jpg Oracle:At the beginning of your upkeep, sacrifice Contamination unless you sacrifice a creature.\nIf a land is tapped for mana, it produces {B} instead of any other type and amount. diff --git a/forge-gui/res/cardsfolder/c/contested_cliffs.txt b/forge-gui/res/cardsfolder/c/contested_cliffs.txt index 6edad0a29b9..ccdb05e2331 100644 --- a/forge-gui/res/cardsfolder/c/contested_cliffs.txt +++ b/forge-gui/res/cardsfolder/c/contested_cliffs.txt @@ -4,6 +4,6 @@ Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Pump | Cost$ R G T | ValidTgts$ Creature.Beast+YouCtrl | TgtPrompt$ Choose target Beast creature you control | SubAbility$ FightForTheCliffs | StackDescription$ None | SpellDescription$ Target Beast creature you control fights target creature an opponent controls. (Each deals damage equal to its power to the other.) SVar:FightForTheCliffs:DB$ Fight | Defined$ ParentTarget | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/contested_cliffs.jpg Oracle:{T}: Add {C}.\n{R}{G}, {T}: Target Beast creature you control fights target creature an opponent controls. (Each deals damage equal to its power to the other.) diff --git a/forge-gui/res/cardsfolder/c/contingency_plan.txt b/forge-gui/res/cardsfolder/c/contingency_plan.txt index bea3d6cad22..11e32752829 100644 --- a/forge-gui/res/cardsfolder/c/contingency_plan.txt +++ b/forge-gui/res/cardsfolder/c/contingency_plan.txt @@ -2,6 +2,6 @@ Name:Contingency Plan ManaCost:1 U Types:Sorcery A:SP$ Dig | Cost$ 1 U | DigNum$ 5 | AnyNumber$ True | DestinationZone$ Graveyard | LibraryPosition2$ 0 | SpellDescription$ Look at the top five cards of your library. Put any number of them into your graveyard and the rest back on top of your library in any order. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/contingency_plan.jpg Oracle:Look at the top five cards of your library. Put any number of them into your graveyard and the rest back on top of your library in any order. diff --git a/forge-gui/res/cardsfolder/c/contract_from_below.txt b/forge-gui/res/cardsfolder/c/contract_from_below.txt index b906048225b..3e6b7eb8668 100644 --- a/forge-gui/res/cardsfolder/c/contract_from_below.txt +++ b/forge-gui/res/cardsfolder/c/contract_from_below.txt @@ -5,7 +5,7 @@ K:Remove CARDNAME from your deck before playing if you're not playing for ante. A:SP$ Discard | Cost$ B | Mode$ Hand | Defined$ You | SubAbility$ DBAnte | SpellDescription$ Discard your hand, ante the top card of your library, then draw seven cards. SVar:DBAnte:DB$ ChangeZone | Defined$ TopOfLibrary | Origin$ Library | Destination$ Ante | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 7 -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/contract_from_below.jpg Oracle:Remove Contract from Below from your deck before playing if you're not playing for ante.\nDiscard your hand, ante the top card of your library, then draw seven cards. diff --git a/forge-gui/res/cardsfolder/c/controlled_instincts.txt b/forge-gui/res/cardsfolder/c/controlled_instincts.txt index b8b00a8e940..776e9790488 100644 --- a/forge-gui/res/cardsfolder/c/controlled_instincts.txt +++ b/forge-gui/res/cardsfolder/c/controlled_instincts.txt @@ -4,6 +4,6 @@ Types:Enchantment Aura K:Enchant red or green creature A:SP$ Attach | Cost$ U | ValidTgts$ Creature.Green,Creature.Red | TgtPrompt$ Select target red or green creature | AILogic$ KeepTapped S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Enchanted creature doesn't untap during its controller's untap step. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/controlled_instincts.jpg Oracle:Enchant red or green creature\nEnchanted creature doesn't untap during its controller's untap step. diff --git a/forge-gui/res/cardsfolder/c/conundrum_sphinx.txt b/forge-gui/res/cardsfolder/c/conundrum_sphinx.txt index 3665621fc9c..e8580ab1662 100644 --- a/forge-gui/res/cardsfolder/c/conundrum_sphinx.txt +++ b/forge-gui/res/cardsfolder/c/conundrum_sphinx.txt @@ -8,6 +8,6 @@ SVar:EachName:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBName SVar:DBName:DB$ NameCard | Defined$ Player.IsRemembered | AILogic$ RandomInComputerDeck SVar:DBDigEach:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBDig SVar:DBDig:DB$ Dig | DigNum$ 1 | Defined$ Player.IsRemembered | ChangeNum$ All | ChangeValid$ Card.NamedByRememberedPlayer | Reveal$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/conundrum_sphinx.jpg Oracle:Flying\nWhenever Conundrum Sphinx attacks, each player chooses a card name. Then each player reveals the top card of their library. If the card a player revealed has the name they chose, that player puts it into their hand. If it doesn't, that player puts it on the bottom of their library. diff --git a/forge-gui/res/cardsfolder/c/conversion.txt b/forge-gui/res/cardsfolder/c/conversion.txt index 1ae932bceaf..8e094752971 100644 --- a/forge-gui/res/cardsfolder/c/conversion.txt +++ b/forge-gui/res/cardsfolder/c/conversion.txt @@ -3,6 +3,6 @@ ManaCost:2 W W Types:Enchantment K:UpkeepCost:W W S:Mode$ Continuous | Affected$ Mountain | AddType$ Plains | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | Description$ All Mountains are Plains. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/conversion.jpg Oracle:At the beginning of your upkeep, sacrifice Conversion unless you pay {W}{W}.\nAll Mountains are Plains. diff --git a/forge-gui/res/cardsfolder/c/convincing_mirage.txt b/forge-gui/res/cardsfolder/c/convincing_mirage.txt index 75f1c3a335e..419a053d23f 100644 --- a/forge-gui/res/cardsfolder/c/convincing_mirage.txt +++ b/forge-gui/res/cardsfolder/c/convincing_mirage.txt @@ -6,6 +6,6 @@ A:SP$ Attach | Cost$ 1 U | ValidTgts$ Land | AILogic$ ChangeType K:ETBReplacement:Other:DBChooseBasic SVar:DBChooseBasic:DB$ ChooseType | Type$ Basic Land | SpellDescription$ As CARDNAME enters the battlefield, choose a basic land type. S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddType$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | Description$ Enchanted land is the chosen type. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/convincing_mirage.jpg Oracle:Enchant land\nAs Convincing Mirage enters the battlefield, choose a basic land type.\nEnchanted land is the chosen type. diff --git a/forge-gui/res/cardsfolder/c/convulsing_licid.txt b/forge-gui/res/cardsfolder/c/convulsing_licid.txt index 9506bc828bc..eaf41cd513d 100644 --- a/forge-gui/res/cardsfolder/c/convulsing_licid.txt +++ b/forge-gui/res/cardsfolder/c/convulsing_licid.txt @@ -6,6 +6,6 @@ A:AB$ Animate | Cost$ R T | Defined$ Self | RemoveThisAbility$ True | Permanent$ SVar:DBAttach:DB$ Attach | ValidTgts$ Creature | AILogic$ Curse SVar:SPAttach:SP$ Attach | Cost$ 0 | ValidTgts$ Creature S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddHiddenKeyword$ CARDNAME can't block. | Description$ Enchanted creature can't block. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/convulsing_licid.jpg Oracle:{R}, {T}: Convulsing Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {R} to end this effect.\nEnchanted creature can't block. diff --git a/forge-gui/res/cardsfolder/c/cooperation.txt b/forge-gui/res/cardsfolder/c/cooperation.txt index 9b9ccc424d8..d7730a9c569 100644 --- a/forge-gui/res/cardsfolder/c/cooperation.txt +++ b/forge-gui/res/cardsfolder/c/cooperation.txt @@ -4,6 +4,6 @@ Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ 2 W | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Banding | Description$ Enchanted creature has banding. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cooperation.jpg Oracle:Enchant creature\nEnchanted creature has banding. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding a player controls are blocking or being blocked by a creature, that player divides that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/c/coordinated_barrage.txt b/forge-gui/res/cardsfolder/c/coordinated_barrage.txt index f532aab060b..fc1d8e023c2 100644 --- a/forge-gui/res/cardsfolder/c/coordinated_barrage.txt +++ b/forge-gui/res/cardsfolder/c/coordinated_barrage.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ ChooseType | Cost$ W | Defined$ You | Type$ Creature | SubAbility$ DBDealDamage | SpellDescription$ Choose a creature type. CARDNAME deals damage to target attacking or blocking creature equal to the number of permanents you control of the chosen type. SVar:DBDealDamage:DB$DealDamage | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ X | References$ X SVar:X:Count$Valid Permanent.ChosenType+YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/coordinated_barrage.jpg Oracle:Choose a creature type. Coordinated Barrage deals damage to target attacking or blocking creature equal to the number of permanents you control of the chosen type. diff --git a/forge-gui/res/cardsfolder/c/copper_carapace.txt b/forge-gui/res/cardsfolder/c/copper_carapace.txt index 4f2af214562..c63035a05d6 100644 --- a/forge-gui/res/cardsfolder/c/copper_carapace.txt +++ b/forge-gui/res/cardsfolder/c/copper_carapace.txt @@ -3,6 +3,6 @@ ManaCost:1 Types:Artifact Equipment K:Equip:3 S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddToughness$ 2 | AddHiddenKeyword$ CARDNAME can't block. | Description$ Equipped creature gets +2/+2 and can't block. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/copper_carapace.jpg Oracle:Equipped creature gets +2/+2 and can't block.\nEquip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/c/copper_leaf_angel.txt b/forge-gui/res/cardsfolder/c/copper_leaf_angel.txt index b156b776118..f8468f6b729 100644 --- a/forge-gui/res/cardsfolder/c/copper_leaf_angel.txt +++ b/forge-gui/res/cardsfolder/c/copper_leaf_angel.txt @@ -6,6 +6,6 @@ K:Flying A:AB$PutCounter | Cost$ T Sac | Defined$ Self | CounterType$ P1P1 | CounterNum$ ChosenX | References$ X | SpellDescription$ Put X +1/+1 counters on CARDNAME. SVar:X:XChoice #ChosenX SVar created by Cost payment -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/copper_leaf_angel.jpg Oracle:Flying\n{T}, Sacrifice X lands: Put X +1/+1 counters on Copper-Leaf Angel. diff --git a/forge-gui/res/cardsfolder/c/copper_tablet.txt b/forge-gui/res/cardsfolder/c/copper_tablet.txt index 4e5dcf61ef0..943cc01727a 100644 --- a/forge-gui/res/cardsfolder/c/copper_tablet.txt +++ b/forge-gui/res/cardsfolder/c/copper_tablet.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of each player's upkeep, CARDNAME deals 1 damage to that player. SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredPlayer | NumDmg$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/copper_tablet.jpg Oracle:At the beginning of each player's upkeep, Copper Tablet deals 1 damage to that player. diff --git a/forge-gui/res/cardsfolder/c/copperhoof_vorrac.txt b/forge-gui/res/cardsfolder/c/copperhoof_vorrac.txt index 3e46b6515d1..a011f948623 100644 --- a/forge-gui/res/cardsfolder/c/copperhoof_vorrac.txt +++ b/forge-gui/res/cardsfolder/c/copperhoof_vorrac.txt @@ -6,6 +6,6 @@ S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | AddToughness$ X | Descr SVar:X:Count$Valid Permanent.untapped+OppCtrl S:Mode$ Continuous | Affected$ Permanent.OppCtrl | AddSVar$ AITap SVar:AITap:SVar:AITapDown:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/copperhoof_vorrac.jpg Oracle:Copperhoof Vorrac gets +1/+1 for each untapped permanent your opponents control. diff --git a/forge-gui/res/cardsfolder/c/copy_enchantment.txt b/forge-gui/res/cardsfolder/c/copy_enchantment.txt index 50d5e2e4919..b5793f94ec3 100644 --- a/forge-gui/res/cardsfolder/c/copy_enchantment.txt +++ b/forge-gui/res/cardsfolder/c/copy_enchantment.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Enchantment K:ETBReplacement:Copy:DBCopy:Optional SVar:DBCopy:DB$ Clone | Choices$ Enchantment.Other | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any enchantment on the battlefield. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/copy_enchantment.jpg Oracle:You may have Copy Enchantment enter the battlefield as a copy of any enchantment on the battlefield. diff --git a/forge-gui/res/cardsfolder/c/coral_fighters.txt b/forge-gui/res/cardsfolder/c/coral_fighters.txt index dd95b86e515..ed5bda97282 100644 --- a/forge-gui/res/cardsfolder/c/coral_fighters.txt +++ b/forge-gui/res/cardsfolder/c/coral_fighters.txt @@ -4,6 +4,6 @@ Types:Creature Merfolk Soldier PT:1/1 T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDig | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, look at the top card of defending player's library. You may put that card on the bottom of that player's library. SVar:TrigDig:DB$ Dig | Defined$ DefendingPlayer | DigNum$ 1 | AnyNumber$ True | DestinationZone$ Library | LibraryPosition2$ 0 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/coral_fighters.jpg Oracle:Whenever Coral Fighters attacks and isn't blocked, look at the top card of defending player's library. You may put that card on the bottom of that player's library. diff --git a/forge-gui/res/cardsfolder/c/coral_helm.txt b/forge-gui/res/cardsfolder/c/coral_helm.txt index f8de3bc89cf..06895b2affa 100644 --- a/forge-gui/res/cardsfolder/c/coral_helm.txt +++ b/forge-gui/res/cardsfolder/c/coral_helm.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact A:AB$ Pump | Cost$ 3 Discard<1/Random> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Target creature gets +2/+2 until end of turn. SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/coral_helm.jpg Oracle:{3}, Discard a card at random: Target creature gets +2/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/c/coral_net.txt b/forge-gui/res/cardsfolder/c/coral_net.txt index 96f69508ca5..f36d3c93b7f 100644 --- a/forge-gui/res/cardsfolder/c/coral_net.txt +++ b/forge-gui/res/cardsfolder/c/coral_net.txt @@ -8,7 +8,7 @@ SVar:TrigCoralPhase:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ Tr SVar:TrigCoralDiscard:DB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 | Optional$ True | RememberDiscarded$ True | SubAbility$ DBCoralSacrifice SVar:DBCoralSacrifice:DB$ Sacrifice | Defined$ Self | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ0 | SubAbility$ DBCoralCleanup SVar:DBCoralCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingAttachEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/coral_net.jpg Oracle:Enchant green or white creature\nEnchanted creature has "At the beginning of your upkeep, sacrifice this creature unless you discard a card." diff --git a/forge-gui/res/cardsfolder/c/coral_reef.txt b/forge-gui/res/cardsfolder/c/coral_reef.txt index 8e5be570674..76cd9e5132d 100644 --- a/forge-gui/res/cardsfolder/c/coral_reef.txt +++ b/forge-gui/res/cardsfolder/c/coral_reef.txt @@ -5,6 +5,6 @@ K:etbCounter:POLYP:4 A:AB$ PutCounter | Cost$ Sac<1/Island> | CounterType$ POLYP | CounterNum$ 2 | SpellDescription$ Put two polyp counters on CARDNAME. A:AB$ PutCounter | Cost$ U tapXType<1/Creature.Blue> SubCounter<1/POLYP> | CounterType$ P0P1 | CounterNum$ 1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | CostDesc$ {U}, Tap an untapped blue creature you control, Remove a polyp counter from CARDNAME: | SpellDescription$ Put a +0/+1 counter on target creature. SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/coral_reef.jpg Oracle:Coral Reef enters the battlefield with four polyp counters on it.\nSacrifice an Island: Put two polyp counters on Coral Reef.\n{U}, Tap an untapped blue creature you control, Remove a polyp counter from Coral Reef: Put a +0/+1 counter on target creature. diff --git a/forge-gui/res/cardsfolder/c/coral_trickster.txt b/forge-gui/res/cardsfolder/c/coral_trickster.txt index 417202cb8fd..d2ed8628e6c 100644 --- a/forge-gui/res/cardsfolder/c/coral_trickster.txt +++ b/forge-gui/res/cardsfolder/c/coral_trickster.txt @@ -5,6 +5,6 @@ PT:2/1 K:Morph:U T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigTapOrUntap | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME is turned face up, you may tap or untap target permanent. SVar:TrigTapOrUntap:DB$TapOrUntap | ValidTgts$ Permanent | TgtPrompt$ Select target permanent -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/coral_trickster.jpg Oracle:Morph {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.)\nWhen Coral Trickster is turned face up, you may tap or untap target permanent. diff --git a/forge-gui/res/cardsfolder/c/coretapper.txt b/forge-gui/res/cardsfolder/c/coretapper.txt index cb6e2a8268a..f1e5db07865 100644 --- a/forge-gui/res/cardsfolder/c/coretapper.txt +++ b/forge-gui/res/cardsfolder/c/coretapper.txt @@ -4,7 +4,7 @@ Types:Artifact Creature Myr PT:1/1 A:AB$ PutCounter | Cost$ T | ValidTgts$ Artifact | TgtPrompt$ Select target Artifact | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on target artifact. A:AB$ PutCounter | Cost$ Sac<1/CARDNAME> | ValidTgts$ Artifact | TgtPrompt$ Select target Artifact | CounterType$ CHARGE | CounterNum$ 2 | SpellDescription$ Put two charge counters on target artifact. -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/coretapper.jpg Oracle:{T}: Put a charge counter on target artifact.\nSacrifice Coretapper: Put two charge counters on target artifact. diff --git a/forge-gui/res/cardsfolder/c/cornered_market.txt b/forge-gui/res/cardsfolder/c/cornered_market.txt index 6bc21b44b2d..c9cd7b8e82b 100644 --- a/forge-gui/res/cardsfolder/c/cornered_market.txt +++ b/forge-gui/res/cardsfolder/c/cornered_market.txt @@ -4,6 +4,6 @@ Types:Enchantment S:Mode$ CantPlayLand | ValidCard$ Land.nonBasic+sharesNameWith NonToken | Description$ Players can't play nonbasic lands with the same name as a nontoken permanent. S:Mode$ CantBeCast | ValidCard$ Card.sharesNameWith NonToken | Description$ Players can't cast spells with the same name as a nontoken permanent. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/cornered_market.jpg Oracle:Players can't cast spells with the same name as a nontoken permanent.\nPlayers can't play nonbasic lands with the same name as a nontoken permanent. diff --git a/forge-gui/res/cardsfolder/c/corpse_augur.txt b/forge-gui/res/cardsfolder/c/corpse_augur.txt index 461c2ba32ed..d96b6464933 100644 --- a/forge-gui/res/cardsfolder/c/corpse_augur.txt +++ b/forge-gui/res/cardsfolder/c/corpse_augur.txt @@ -6,6 +6,6 @@ T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ SVar:TrigDraw:DB$ Draw | Defined$ TriggeredCardController | ValidTgts$ Player | TgtPrompt$ Choose target player | NumCards$ X | SubAbility$ DBLoseLife | References$ X SVar:DBLoseLife:DB$ LoseLife | Defined$ TriggeredCardController | LifeAmount$ X | References$ X SVar:X:TargetedPlayer$ValidGraveyard Creature.YouOwn -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/corpse_augur.jpg Oracle:When Corpse Augur dies, you draw X cards and you lose X life, where X is the number of creature cards in target player's graveyard. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/c/corpse_blockade.txt b/forge-gui/res/cardsfolder/c/corpse_blockade.txt index 20bb475a8f1..028b4df41dd 100644 --- a/forge-gui/res/cardsfolder/c/corpse_blockade.txt +++ b/forge-gui/res/cardsfolder/c/corpse_blockade.txt @@ -4,6 +4,6 @@ Types:Creature Zombie PT:1/4 K:Defender A:AB$ Pump | Cost$ Sac<1/Creature.Other/another creature> | Defined$ Self | KW$ Deathtouch | SpellDescription$ CARDNAME gains deathtouch until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/corpse_blockade.jpg Oracle:Defender\nSacrifice another creature: Corpse Blockade gains deathtouch until end of turn. diff --git a/forge-gui/res/cardsfolder/c/corpse_connoisseur.txt b/forge-gui/res/cardsfolder/c/corpse_connoisseur.txt index b011723e912..8f395d92b63 100644 --- a/forge-gui/res/cardsfolder/c/corpse_connoisseur.txt +++ b/forge-gui/res/cardsfolder/c/corpse_connoisseur.txt @@ -5,6 +5,6 @@ PT:3/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for a creature card and put that card into your graveyard. If you do, shuffle your library. SVar:TrigChange:DB$ ChangeZone | Origin$ Library | Destination$ Graveyard | ChangeType$ Creature | ChangeNum$ 1 | ShuffleNonMandatory$ True K:Unearth:3 B -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/corpse_connoisseur.jpg Oracle:When Corpse Connoisseur enters the battlefield, you may search your library for a creature card and put that card into your graveyard. If you do, shuffle your library.\nUnearth {3}{B} ({3}{B}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/c/corpse_harvester.txt b/forge-gui/res/cardsfolder/c/corpse_harvester.txt index 7258927bfd1..9700918ae5e 100644 --- a/forge-gui/res/cardsfolder/c/corpse_harvester.txt +++ b/forge-gui/res/cardsfolder/c/corpse_harvester.txt @@ -4,6 +4,6 @@ Types:Creature Zombie Wizard PT:3/3 A:AB$ ChangeZone | Cost$ 1 B T Sac<1/Creature> | Origin$ Library | Destination$ Hand | ChangeType$ Zombie | ChangeNum$ 1 | SubAbility$ DBSwamp | SpellDescription$ Search your library for a Zombie card and a Swamp card, reveal them, put them into your hand, then shuffle your library. SVar:DBSwamp:DB$ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Swamp | ChangeNum$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/corpse_harvester.jpg Oracle:{1}{B}, {T}, Sacrifice a creature: Search your library for a Zombie card and a Swamp card, reveal them, put them into your hand, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/c/corpse_lunge.txt b/forge-gui/res/cardsfolder/c/corpse_lunge.txt index 05eda004e38..77c8c904d53 100644 --- a/forge-gui/res/cardsfolder/c/corpse_lunge.txt +++ b/forge-gui/res/cardsfolder/c/corpse_lunge.txt @@ -3,6 +3,6 @@ ManaCost:2 B Types:Instant A:SP$ DealDamage | Cost$ 2 B ExileFromGrave<1/Creature> | NumDmg$ X | ValidTgts$ Creature | TgtPrompt$ Select target creature | CostDesc$ As an additional cost to cast CARDNAME, exile a creature card from your graveyard. | References$ X | SpellDescription$ CARDNAME deals damage equal to the exiled card's power to target creature. SVar:X:Exiled$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/corpse_lunge.jpg Oracle:As an additional cost to cast this spell, exile a creature card from your graveyard.\nCorpse Lunge deals damage equal to the exiled card's power to target creature. diff --git a/forge-gui/res/cardsfolder/c/corpse_traders.txt b/forge-gui/res/cardsfolder/c/corpse_traders.txt index 0ea73ea42ef..f0cdc34ce02 100644 --- a/forge-gui/res/cardsfolder/c/corpse_traders.txt +++ b/forge-gui/res/cardsfolder/c/corpse_traders.txt @@ -3,6 +3,6 @@ ManaCost:3 B Types:Creature Human Rogue PT:3/3 A:AB$ Discard | Cost$ 2 B Sac<1/Creature> | ValidTgts$ Player | Mode$ RevealYouChoose | NumCards$ 1 | SorcerySpeed$ True | SpellDescription$ Target player reveals their hand. You choose a card from it. That player discards that card. Activate this ability only any time you could cast a sorcery. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/corpse_traders.jpg Oracle:{2}{B}, Sacrifice a creature: Target opponent reveals their hand. You choose a card from it. That player discards that card. Activate this ability only any time you could cast a sorcery. diff --git a/forge-gui/res/cardsfolder/c/corpseweft.txt b/forge-gui/res/cardsfolder/c/corpseweft.txt index d00067ca6c4..feab5274eb3 100644 --- a/forge-gui/res/cardsfolder/c/corpseweft.txt +++ b/forge-gui/res/cardsfolder/c/corpseweft.txt @@ -3,6 +3,6 @@ ManaCost:2 B Types:Enchantment A:AB$ Token | Announce$ X | XCantBe0$ True | Cost$ 1 B ExileFromGrave | TokenAmount$ 1 | TokenName$ Zombie Horror | TokenOwner$ You | TokenPower$ Y | TokenToughness$ Y | References$ Y | TokenTypes$ Creature,Zombie,Horror | TokenColors$ Black | TokenTapped$ True | TokenImage$ b x x zombie horror | SpellDescription$ Create a tapped X/X black Zombie Horror creature token, where X is twice the number of cards exiled this way. SVar:Y:ExiledCards$Amount.Twice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/corpseweft.jpg Oracle:{1}{B}, Exile one or more creature cards from your graveyard: Create a tapped X/X black Zombie Horror creature token, where X is twice the number of cards exiled this way. diff --git a/forge-gui/res/cardsfolder/c/corrupted_crossroads.txt b/forge-gui/res/cardsfolder/c/corrupted_crossroads.txt index 29070423738..7db38a077d6 100644 --- a/forge-gui/res/cardsfolder/c/corrupted_crossroads.txt +++ b/forge-gui/res/cardsfolder/c/corrupted_crossroads.txt @@ -3,7 +3,7 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ T PayLife<1> | Produced$ Any | Amount$ 1 | RestrictValid$ Card.withDevoid | SpellDescription$ Add one mana of any color. Spend this mana only to cast a spell with devoid. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHas:Ability$Mana.Colorless DeckNeeds:Keyword$Devoid SVar:Picture:http://www.wizards.com/global/images/magic/general/corrupted_crossroads.jpg diff --git a/forge-gui/res/cardsfolder/c/corrupted_grafstone.txt b/forge-gui/res/cardsfolder/c/corrupted_grafstone.txt index 9ea163debe5..3aff45cb8d8 100644 --- a/forge-gui/res/cardsfolder/c/corrupted_grafstone.txt +++ b/forge-gui/res/cardsfolder/c/corrupted_grafstone.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact K:CARDNAME enters the battlefield tapped. A:AB$ ManaReflected | Cost$ T | ColorOrType$ Color | Valid$ Defined.ValidGraveyard Card.YouOwn | ReflectProperty$ Is | SpellDescription$ Choose a color of a card in your graveyard. Add one mana of that color. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/corrupted_grafstone.jpg Oracle:Corrupted Grafstone enters the battlefield tapped.\n{T}: Choose a color of a card in your graveyard. Add one mana of that color. diff --git a/forge-gui/res/cardsfolder/c/corrupted_harvester.txt b/forge-gui/res/cardsfolder/c/corrupted_harvester.txt index a0f7f0e9f19..9618dd71424 100644 --- a/forge-gui/res/cardsfolder/c/corrupted_harvester.txt +++ b/forge-gui/res/cardsfolder/c/corrupted_harvester.txt @@ -4,6 +4,6 @@ Types:Creature Horror PT:6/3 A:AB$ Regenerate | Cost$ B Sac<1/Creature> | SpellDescription$ Regenerate CARDNAME. SVar:AIPreferences:SacCost$Creature.token,Creature.cmcLE5+powerLE3+toughnessLE4 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/corrupted_harvester.jpg Oracle:{B}, Sacrifice a creature: Regenerate Corrupted Harvester. diff --git a/forge-gui/res/cardsfolder/c/corrupted_resolve.txt b/forge-gui/res/cardsfolder/c/corrupted_resolve.txt index 5a48ea9e52b..69abf1c8025 100644 --- a/forge-gui/res/cardsfolder/c/corrupted_resolve.txt +++ b/forge-gui/res/cardsfolder/c/corrupted_resolve.txt @@ -4,7 +4,7 @@ Types:Instant A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | ValidTgts$ Card | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | References$ X | SpellDescription$ Counter target spell if its controller is poisoned. SVar:X:TargetedController$PoisonCounters SVar:NeedsToPlayVar:X GE1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Keyword$Infect SVar:Picture:http://www.wizards.com/global/images/magic/general/corrupted_resolve.jpg Oracle:Counter target spell if its controller is poisoned. diff --git a/forge-gui/res/cardsfolder/c/corrupted_roots.txt b/forge-gui/res/cardsfolder/c/corrupted_roots.txt index 3b9e5b04f0d..4665a02274c 100644 --- a/forge-gui/res/cardsfolder/c/corrupted_roots.txt +++ b/forge-gui/res/cardsfolder/c/corrupted_roots.txt @@ -5,6 +5,6 @@ K:Enchant land A:SP$ Attach | Cost$ B | ValidTgts$ Forest,Plains | TgtPrompt$ Select target Forest or Plains | AILogic$ Curse T:Mode$ Taps | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigLose | TriggerDescription$ Whenever enchanted land becomes tapped, its controller loses 2 life. SVar:TrigLose:DB$ LoseLife | Defined$ TriggeredCardController | LifeAmount$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/corrupted_roots.jpg Oracle:Enchant Forest or Plains\nWhenever enchanted land becomes tapped, its controller loses 2 life. diff --git a/forge-gui/res/cardsfolder/c/corrupting_licid.txt b/forge-gui/res/cardsfolder/c/corrupting_licid.txt index 0d9576a8e7a..7eb796b8153 100644 --- a/forge-gui/res/cardsfolder/c/corrupting_licid.txt +++ b/forge-gui/res/cardsfolder/c/corrupting_licid.txt @@ -6,6 +6,6 @@ A:AB$ Animate | Cost$ B T | Defined$ Self | RemoveThisAbility$ True | Permanent$ SVar:DBAttach:DB$ Attach | ValidTgts$ Creature | AILogic$ Pump SVar:SPAttach:SP$ Attach | Cost$ 0 | ValidTgts$ Creature S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Fear | Description$ Enchanted creature has fear. (It can't be blocked except by artifact creatures and/or black creatures.) -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/corrupting_licid.jpg Oracle:{B}, {T}: Corrupting Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {B} to end this effect.\nEnchanted creature has fear. (It can't be blocked except by artifact creatures and/or black creatures.) diff --git a/forge-gui/res/cardsfolder/c/cosmic_larva.txt b/forge-gui/res/cardsfolder/c/cosmic_larva.txt index c1192510138..d70f374d2d1 100644 --- a/forge-gui/res/cardsfolder/c/cosmic_larva.txt +++ b/forge-gui/res/cardsfolder/c/cosmic_larva.txt @@ -4,6 +4,6 @@ Types:Creature Beast PT:7/6 K:Trample K:UpkeepCost:Sac<2/Land> -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cosmic_larva.jpg Oracle:Trample\nAt the beginning of your upkeep, sacrifice Cosmic Larva unless you sacrifice two lands. diff --git a/forge-gui/res/cardsfolder/c/council_of_the_absolute.txt b/forge-gui/res/cardsfolder/c/council_of_the_absolute.txt index 33892ec28db..2228bf2fd6c 100644 --- a/forge-gui/res/cardsfolder/c/council_of_the_absolute.txt +++ b/forge-gui/res/cardsfolder/c/council_of_the_absolute.txt @@ -6,6 +6,6 @@ K:ETBReplacement:Other:DBNameCard SVar:DBNameCard:DB$ NameCard | Defined$ You | ValidCards$ Card.nonLand+nonCreature | ValidDesc$ Choose a noncreature, nonland card name. | SpellDescription$ As CARDNAME enters the battlefield, choose a noncreature, nonland card name. S:Mode$ CantBeCast | ValidCard$ Card.NamedCard | Caster$ Player.Opponent | Description$ Your opponents can't cast cards with the chosen name. S:Mode$ ReduceCost | ValidCard$ Card.NamedCard | Type$ Spell | Activator$ You | Amount$ 2 | Description$ Spells with the chosen name you cast cost {2} less to cast. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/council_of_the_absolute.jpg Oracle:As Council of the Absolute enters the battlefield, choose a noncreature, nonland card name.\nYour opponents can't cast spells with the chosen name.\nSpells with the chosen name you cast cost {2} less to cast. diff --git a/forge-gui/res/cardsfolder/c/court_hussar.txt b/forge-gui/res/cardsfolder/c/court_hussar.txt index 281eb492bc8..4261a5cb22e 100644 --- a/forge-gui/res/cardsfolder/c/court_hussar.txt +++ b/forge-gui/res/cardsfolder/c/court_hussar.txt @@ -8,7 +8,7 @@ T:Mode$ ChangesZone | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ SVar:TrigDig:DB$Dig | DigNum$ 3 | Defined$ You SVar:TrigSac:DB$Sacrifice | Defined$ Self SVar:ManaNeededToAvoidNegativeEffect:white -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$white SVar:Picture:http://www.wizards.com/global/images/magic/general/court_hussar.jpg Oracle:Vigilance\nWhen Court Hussar enters the battlefield, look at the top three cards of your library, then put one of them into your hand and the rest on the bottom of your library in any order.\nWhen Court Hussar enters the battlefield, sacrifice it unless {W} was spent to cast it. diff --git a/forge-gui/res/cardsfolder/c/courtly_provocateur.txt b/forge-gui/res/cardsfolder/c/courtly_provocateur.txt index 41a570b5ce2..e40efe634e9 100644 --- a/forge-gui/res/cardsfolder/c/courtly_provocateur.txt +++ b/forge-gui/res/cardsfolder/c/courtly_provocateur.txt @@ -4,6 +4,6 @@ Types:Creature Human Wizard PT:1/1 A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME attacks each combat if able. | IsCurse$ True | SpellDescription$ Target creature attacks this turn if able. A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME blocks each combat if able. | SpellDescription$ Target creature blocks this turn if able. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/courtly_provocateur.jpg Oracle:{T}: Target creature attacks this turn if able.\n{T}: Target creature blocks this turn if able. diff --git a/forge-gui/res/cardsfolder/c/covetous_dragon.txt b/forge-gui/res/cardsfolder/c/covetous_dragon.txt index 5add5780d2d..9af036086e2 100644 --- a/forge-gui/res/cardsfolder/c/covetous_dragon.txt +++ b/forge-gui/res/cardsfolder/c/covetous_dragon.txt @@ -6,6 +6,6 @@ K:Flying T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Artifact.YouCtrl | PresentCompare$ EQ0 | Execute$ TrigSac | TriggerDescription$ When you control no artifacts, sacrifice CARDNAME. SVar:TrigSac:DB$Sacrifice | Defined$ Self SVar:NeedsToPlay:Artifact.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/covetous_dragon.jpg Oracle:Flying\nWhen you control no artifacts, sacrifice Covetous Dragon. diff --git a/forge-gui/res/cardsfolder/c/cowardice.txt b/forge-gui/res/cardsfolder/c/cowardice.txt index 85569dea755..f9746b48ac8 100644 --- a/forge-gui/res/cardsfolder/c/cowardice.txt +++ b/forge-gui/res/cardsfolder/c/cowardice.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ BecomesTarget | ValidTarget$ Card.Creature+inZoneBattlefield | TriggerZones$ Battlefield | Execute$ TrigReturn | TriggerDescription$ Whenever a creature becomes the target of a spell or ability, return that creature to its owner's hand. (It won't be affected by the spell or ability.) SVar:TrigReturn:DB$ChangeZone | Defined$ TriggeredTarget | Origin$ Battlefield | Destination$ Hand SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/cowardice.jpg Oracle:Whenever a creature becomes the target of a spell or ability, return that creature to its owner's hand. (It won't be affected by the spell or ability.) diff --git a/forge-gui/res/cardsfolder/c/crack_the_earth.txt b/forge-gui/res/cardsfolder/c/crack_the_earth.txt index 7a72ff285a6..c388bc6e7d2 100644 --- a/forge-gui/res/cardsfolder/c/crack_the_earth.txt +++ b/forge-gui/res/cardsfolder/c/crack_the_earth.txt @@ -2,6 +2,6 @@ Name:Crack the Earth ManaCost:R Types:Sorcery Arcane A:SP$ Sacrifice | Cost$ R | SacValid$ Permanent | Defined$ Player | SpellDescription$ Each player sacrifices a permanent. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/crack_the_earth.jpg Oracle:Each player sacrifices a permanent. diff --git a/forge-gui/res/cardsfolder/c/crackdown.txt b/forge-gui/res/cardsfolder/c/crackdown.txt index 859f9db134d..517937371a0 100644 --- a/forge-gui/res/cardsfolder/c/crackdown.txt +++ b/forge-gui/res/cardsfolder/c/crackdown.txt @@ -3,6 +3,6 @@ ManaCost:2 W Types:Enchantment S:Mode$ Continuous | Affected$ Creature.powerGE3+nonWhite | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Nonwhite creatures with power 3 or greater don't untap during their controllers' untap steps. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/crackdown.jpg Oracle:Nonwhite creatures with power 3 or greater don't untap during their controllers' untap steps. diff --git a/forge-gui/res/cardsfolder/c/crackling_perimeter.txt b/forge-gui/res/cardsfolder/c/crackling_perimeter.txt index 89b28261853..88939dc676c 100644 --- a/forge-gui/res/cardsfolder/c/crackling_perimeter.txt +++ b/forge-gui/res/cardsfolder/c/crackling_perimeter.txt @@ -3,7 +3,7 @@ ManaCost:1 R Types:Enchantment A:AB$ DealDamage | Cost$ tapXType<1/Gate> | Defined$ Player.Opponent | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to each opponent. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Gate SVar:Picture:http://www.wizards.com/global/images/magic/general/crackling_perimeter.jpg Oracle:Tap an untapped Gate you control: Crackling Perimeter deals 1 damage to each opponent. diff --git a/forge-gui/res/cardsfolder/c/cradle_of_vitality.txt b/forge-gui/res/cardsfolder/c/cradle_of_vitality.txt index 86c0d6b8935..5cd4c8f76c9 100644 --- a/forge-gui/res/cardsfolder/c/cradle_of_vitality.txt +++ b/forge-gui/res/cardsfolder/c/cradle_of_vitality.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ LifeGained | ValidPlayer$ You | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever you gain life, you may pay {1}{W}. If you do, put a +1/+1 counter on target creature for each 1 life you gained. SVar:TrigPutCounter:AB$PutCounter | Cost$ 1 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ X | References$ X SVar:X:TriggerCount$LifeAmount -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/cradle_of_vitality.jpg Oracle:Whenever you gain life, you may pay {1}{W}. If you do, put a +1/+1 counter on target creature for each 1 life you gained. diff --git a/forge-gui/res/cardsfolder/c/crag_puca.txt b/forge-gui/res/cardsfolder/c/crag_puca.txt index 468bcde54ce..d47aee097ef 100644 --- a/forge-gui/res/cardsfolder/c/crag_puca.txt +++ b/forge-gui/res/cardsfolder/c/crag_puca.txt @@ -3,6 +3,6 @@ ManaCost:UR UR UR Types:Creature Shapeshifter PT:2/4 A:AB$ Pump | Cost$ UR | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch CARDNAME's power and toughness until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/crag_puca.jpg Oracle:{U/R}: Switch Crag Puca's power and toughness until end of turn. diff --git a/forge-gui/res/cardsfolder/c/crag_saurian.txt b/forge-gui/res/cardsfolder/c/crag_saurian.txt index 6fa05769ea0..81a4824ee25 100644 --- a/forge-gui/res/cardsfolder/c/crag_saurian.txt +++ b/forge-gui/res/cardsfolder/c/crag_saurian.txt @@ -4,6 +4,6 @@ Types:Creature Lizard PT:4/4 T:Mode$ DamageDone | ValidTarget$ Card.Self | Execute$ Traitor | TriggerZones$ Battlefield | TriggerDescription$ Whenever a source deals damage to CARDNAME, that source's controller gains control of CARDNAME. SVar:Traitor:DB$ GainControl | Defined$ Self | NewController$ TriggeredSourceController -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/crag_saurian.jpg Oracle:Whenever a source deals damage to Crag Saurian, that source's controller gains control of Crag Saurian. diff --git a/forge-gui/res/cardsfolder/c/cranial_archive.txt b/forge-gui/res/cardsfolder/c/cranial_archive.txt index 997cae72817..f21ae2e348a 100644 --- a/forge-gui/res/cardsfolder/c/cranial_archive.txt +++ b/forge-gui/res/cardsfolder/c/cranial_archive.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact A:AB$ ChangeZoneAll | Cost$ 2 Exile<1/CARDNAME> | ValidTgts$ Player | Origin$ Graveyard | Destination$ Library | Shuffle$ True | SubAbility$ DBDraw | SpellDescription$ Target player shuffles their graveyard into their library. Draw a card. SVar:DBDraw:DB$ Draw | NumCards$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cranial_archive.jpg Oracle:{2}, Exile Cranial Archive: Target player shuffles their graveyard into their library. Draw a card. diff --git a/forge-gui/res/cardsfolder/c/crater_elemental.txt b/forge-gui/res/cardsfolder/c/crater_elemental.txt index d42a2de92f4..fa66a2f481b 100644 --- a/forge-gui/res/cardsfolder/c/crater_elemental.txt +++ b/forge-gui/res/cardsfolder/c/crater_elemental.txt @@ -5,6 +5,6 @@ PT:0/6 A:AB$ DealDamage | Cost$ R T Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target creature. A:AB$ Animate | Cost$ 2 R | Defined$ Self | Power$ 8 | CheckSVar$ FormidableTest | SVarCompare$ GE8 | References$ FormidableTest | PrecostDesc$ Formidable — | SpellDescription$ CARDNAME has base power 8 until end of turn. Activate this ability only if creatures you control have total power 8 or greater. SVar:FormidableTest:Count$SumPower_Creature.YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/crater_elemental.jpg Oracle:{R}, {T}, Sacrifice Crater Elemental: It deals 4 damage to target creature.\nFormidable — {2}{R}: Crater Elemental has base power 8 until end of turn. Activate this ability only if creatures you control have total power 8 or greater. diff --git a/forge-gui/res/cardsfolder/c/crawling_filth.txt b/forge-gui/res/cardsfolder/c/crawling_filth.txt index ddc5dfab1a9..7b90501454e 100644 --- a/forge-gui/res/cardsfolder/c/crawling_filth.txt +++ b/forge-gui/res/cardsfolder/c/crawling_filth.txt @@ -4,7 +4,7 @@ Types:Creature Spirit PT:2/2 K:Fear K:Soulshift:5 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Spirit SVar:Picture:http://www.wizards.com/global/images/magic/general/crawling_filth.jpg Oracle:Fear (This creature can't be blocked except by artifact creatures and/or black creatures.)\nSoulshift 5 (When this creature dies, you may return target Spirit card with converted mana cost 5 or less from your graveyard to your hand.) diff --git a/forge-gui/res/cardsfolder/c/crawlspace.txt b/forge-gui/res/cardsfolder/c/crawlspace.txt index aa4a9fb88fd..733ee56fb4e 100644 --- a/forge-gui/res/cardsfolder/c/crawlspace.txt +++ b/forge-gui/res/cardsfolder/c/crawlspace.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact K:No more than two creatures can attack you each combat. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/crawlspace.jpg Oracle:No more than two creatures can attack you each combat. diff --git a/forge-gui/res/cardsfolder/c/crazed_armodon.txt b/forge-gui/res/cardsfolder/c/crazed_armodon.txt index 2cf7a973c79..24fe429f846 100644 --- a/forge-gui/res/cardsfolder/c/crazed_armodon.txt +++ b/forge-gui/res/cardsfolder/c/crazed_armodon.txt @@ -3,6 +3,6 @@ ManaCost:2 G G Types:Creature Elephant PT:3/3 A:AB$ Pump | Cost$ G | Defined$ Self | NumAtt$ +3 | KW$ Trample | ActivationLimit$ 1 | AtEOT$ Destroy | SpellDescription$ CARDNAME gets +3/+0 and gains trample until end of turn. Destroy Crazed Armodon at the beginning of the next end step. Activate this ability only once each turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/crazed_armodon.jpg Oracle:{G}: Crazed Armodon gets +3/+0 and gains trample until end of turn. Destroy Crazed Armodon at the beginning of the next end step. Activate this ability only once each turn. diff --git a/forge-gui/res/cardsfolder/c/cream_of_the_crop.txt b/forge-gui/res/cardsfolder/c/cream_of_the_crop.txt index fe37a299226..0613b5ab9cd 100644 --- a/forge-gui/res/cardsfolder/c/cream_of_the_crop.txt +++ b/forge-gui/res/cardsfolder/c/cream_of_the_crop.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDig | TriggerDescription$ Whenever a creature enters the battlefield under your control, you may look at the top X cards of your library, where X is that creature's power. If you do, put one of those cards on top of your library and the rest on the bottom of your library in any order. SVar:TrigDig:DB$Dig | DigNum$ X | ChangeNum$ 1 | DestinationZone$ Library | LibraryPosition$ 0 | References$ X SVar:X:TriggeredCard$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cream_of_the_crop.jpg Oracle:Whenever a creature enters the battlefield under your control, you may look at the top X cards of your library, where X is that creature's power. If you do, put one of those cards on top of your library and the rest on the bottom of your library in any order. diff --git a/forge-gui/res/cardsfolder/c/credit_voucher.txt b/forge-gui/res/cardsfolder/c/credit_voucher.txt index 3783967a827..6c0a4f77201 100644 --- a/forge-gui/res/cardsfolder/c/credit_voucher.txt +++ b/forge-gui/res/cardsfolder/c/credit_voucher.txt @@ -6,7 +6,7 @@ SVar:DBDraw:DB$ Draw | NumCards$ Y | References$ Y | SubAbility$ DBCleanup SVar:X:Count$InYourHand SVar:Y:Remembered$Amount SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/credit_voucher.jpg Oracle:{2}, {T}, Sacrifice Credit Voucher: Shuffle any number of cards from your hand into your library, then draw that many cards. diff --git a/forge-gui/res/cardsfolder/c/creeping_renaissance.txt b/forge-gui/res/cardsfolder/c/creeping_renaissance.txt index 6cd9b4239ba..e9e1f3896f4 100644 --- a/forge-gui/res/cardsfolder/c/creeping_renaissance.txt +++ b/forge-gui/res/cardsfolder/c/creeping_renaissance.txt @@ -4,6 +4,6 @@ Types:Sorcery K:Flashback:5 G G A:SP$ ChooseType | Cost$ 3 G G | Defined$ You | Type$ Card | InvalidTypes$ Instant,Sorcery,Tribal | SubAbility$ DBReturn | SpellDescription$ Choose a permanent type. Return all cards of the chosen type from your graveyard to your hand. SVar:DBReturn:DB$ ChangeZoneAll | Origin$ Graveyard | Destination$ Hand | ChangeType$ Card.ChosenType+YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/creeping_renaissance.jpg Oracle:Choose a permanent type. Return all cards of the chosen type from your graveyard to your hand.\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/c/crescendo_of_war.txt b/forge-gui/res/cardsfolder/c/crescendo_of_war.txt index 4de469a6a91..e14e50e3245 100644 --- a/forge-gui/res/cardsfolder/c/crescendo_of_war.txt +++ b/forge-gui/res/cardsfolder/c/crescendo_of_war.txt @@ -6,6 +6,6 @@ SVar:TrigStrife:DB$PutCounter | Defined$ Self | CounterType$ STRIFE | CounterNum S:Mode$ Continuous | Affected$ Creature.attacking | AddPower$ X | Description$ Attacking creatures get +1/+0 for each strife counter on CARDNAME. S:Mode$ Continuous | Affected$ Creature.blocking+YouCtrl | AddPower$ X | Description$ Blocking creatures you control get +1/+0 for each strife counter on CARDNAME. SVar:X:Count$CardCounters.STRIFE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/crescendo_of_war.jpg Oracle:At the beginning of each upkeep, put a strife counter on Crescendo of War.\nAttacking creatures get +1/+0 for each strife counter on Crescendo of War.\nBlocking creatures you control get +1/+0 for each strife counter on Crescendo of War. diff --git a/forge-gui/res/cardsfolder/c/crested_craghorn.txt b/forge-gui/res/cardsfolder/c/crested_craghorn.txt index 1a3b9cf2ad4..0c94e38aa14 100644 --- a/forge-gui/res/cardsfolder/c/crested_craghorn.txt +++ b/forge-gui/res/cardsfolder/c/crested_craghorn.txt @@ -4,6 +4,6 @@ Types:Creature Goat Beast PT:4/1 K:Haste K:Provoke -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/crested_craghorn.jpg Oracle:Haste\nProvoke (Whenever this creature attacks, you may have target creature defending player controls untap and block it if able.) diff --git a/forge-gui/res/cardsfolder/c/crevasse.txt b/forge-gui/res/cardsfolder/c/crevasse.txt index 1b918bacf2f..0522b02b80a 100644 --- a/forge-gui/res/cardsfolder/c/crevasse.txt +++ b/forge-gui/res/cardsfolder/c/crevasse.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Enchantment S:Mode$ Continuous | Affected$ Creature.withMountainwalk | AddHiddenKeyword$ May be blocked as though it doesn't have Mountainwalk. | Description$ Creatures with mountainwalk can be blocked as though they didn't have mountainwalk. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/crevasse.jpg Oracle:Creatures with mountainwalk can be blocked as though they didn't have mountainwalk. diff --git a/forge-gui/res/cardsfolder/c/crook_of_condemnation.txt b/forge-gui/res/cardsfolder/c/crook_of_condemnation.txt index d5f65aa4ce4..1ffe373e7c9 100644 --- a/forge-gui/res/cardsfolder/c/crook_of_condemnation.txt +++ b/forge-gui/res/cardsfolder/c/crook_of_condemnation.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact A:AB$ ChangeZone | Cost$ 1 T | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SpellDescription$ Exile target card from a graveyard. A:AB$ ChangeZoneAll | Cost$ 1 Exile<1/CARDNAME> | Origin$ Graveyard | Destination$ Exile | ChangeType$ Card | AILogic$ ExileGraveyards | SpellDescription$ Exile all cards from all graveyards. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/crook_of_condemnation.jpg Oracle:{1}, {T}: Exile target card from a graveyard.\n{1}, Exile Crook of Condemnation: Exile all cards from all graveyards. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/c/crookclaw_transmuter.txt b/forge-gui/res/cardsfolder/c/crookclaw_transmuter.txt index bfea8a1ba71..aa01a81c4c3 100644 --- a/forge-gui/res/cardsfolder/c/crookclaw_transmuter.txt +++ b/forge-gui/res/cardsfolder/c/crookclaw_transmuter.txt @@ -6,6 +6,6 @@ K:Flash K:Flying T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, switch target creature's power and toughness until end of turn. SVar:TrigPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME's power and toughness are switched -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/crookclaw_transmuter.jpg Oracle:Flash (You may cast this spell any time you could cast an instant.)\nFlying\nWhen Crookclaw Transmuter enters the battlefield, switch target creature's power and toughness until end of turn. diff --git a/forge-gui/res/cardsfolder/c/crooked_scales.txt b/forge-gui/res/cardsfolder/c/crooked_scales.txt index 983b622f6fe..fdd32c8b80e 100644 --- a/forge-gui/res/cardsfolder/c/crooked_scales.txt +++ b/forge-gui/res/cardsfolder/c/crooked_scales.txt @@ -8,6 +8,6 @@ SVar:DBFlip:DB$ FlipACoin | Caller$ You | WinSubAbility$ DestroyOpp | LoseSubAbi SVar:DestroyOpp:DB$ Destroy | Defined$ Remembered | SubAbility$ DBCleanup SVar:DestroyYours:DB$ Destroy | Defined$ Imprinted | UnlessCost$ 3 | UnlessPayer$ You | SubAbility$ DBCleanup | UnlessResolveSubs$ WhenNotPaid SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/crooked_scales.jpg Oracle:{4}, {T}: Flip a coin. If you win the flip, destroy target creature an opponent controls. If you lose the flip, destroy target creature you control unless you pay {3} and repeat this process. diff --git a/forge-gui/res/cardsfolder/c/crop_rotation.txt b/forge-gui/res/cardsfolder/c/crop_rotation.txt index 72fc4c866e3..8e2cc1d2709 100644 --- a/forge-gui/res/cardsfolder/c/crop_rotation.txt +++ b/forge-gui/res/cardsfolder/c/crop_rotation.txt @@ -2,6 +2,6 @@ Name:Crop Rotation ManaCost:G Types:Instant A:SP$ ChangeZone | Cost$ G Sac<1/Land> | Origin$ Library | Destination$ Battlefield | ChangeType$ Land | ChangeNum$ 1 | SpellDescription$ Search your library for a land card and put that card onto the battlefield. Then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/crop_rotation.jpg Oracle:As an additional cost to cast this spell, sacrifice a land.\nSearch your library for a land card and put that card onto the battlefield. Then shuffle your library. diff --git a/forge-gui/res/cardsfolder/c/crosiss_attendant.txt b/forge-gui/res/cardsfolder/c/crosiss_attendant.txt index d8a10127bb6..d7a27658400 100644 --- a/forge-gui/res/cardsfolder/c/crosiss_attendant.txt +++ b/forge-gui/res/cardsfolder/c/crosiss_attendant.txt @@ -3,6 +3,6 @@ ManaCost:5 Types:Artifact Creature Golem PT:3/3 A:AB$ Mana | Cost$ 1 Sac<1/CARDNAME> | Produced$ U B R | SpellDescription$ Add {U}{B}{R}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/crosiss_attendant.jpg Oracle:{1}, Sacrifice Crosis's Attendant: Add {U}{B}{R}. diff --git a/forge-gui/res/cardsfolder/c/crossbow_ambush.txt b/forge-gui/res/cardsfolder/c/crossbow_ambush.txt index 421d4a266ff..e2761741df0 100644 --- a/forge-gui/res/cardsfolder/c/crossbow_ambush.txt +++ b/forge-gui/res/cardsfolder/c/crossbow_ambush.txt @@ -2,6 +2,6 @@ Name:Crossbow Ambush ManaCost:G Types:Instant A:SP$ PumpAll | Cost$ G | ValidCards$ Creature.YouCtrl | KW$ Reach | SpellDescription$ Creatures you control gain reach until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/crossbow_ambush.jpg Oracle:Creatures you control gain reach until end of turn. (They can block creatures with flying.) diff --git a/forge-gui/res/cardsfolder/c/crosswinds.txt b/forge-gui/res/cardsfolder/c/crosswinds.txt index 314f43a8be2..b6ff12370fb 100644 --- a/forge-gui/res/cardsfolder/c/crosswinds.txt +++ b/forge-gui/res/cardsfolder/c/crosswinds.txt @@ -3,6 +3,6 @@ ManaCost:1 G Types:Enchantment S:Mode$ Continuous | Affected$ Creature.withFlying | AddPower$ -2 | Description$ Creatures with flying get -2/-0. SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/crosswinds.jpg Oracle:Creatures with flying get -2/-0. diff --git a/forge-gui/res/cardsfolder/c/crovax_the_cursed.txt b/forge-gui/res/cardsfolder/c/crovax_the_cursed.txt index c5af2dbb569..55a9678cc7c 100644 --- a/forge-gui/res/cardsfolder/c/crovax_the_cursed.txt +++ b/forge-gui/res/cardsfolder/c/crovax_the_cursed.txt @@ -9,6 +9,6 @@ SVar:TrigSacrifice:DB$ Sacrifice | Optional$ True | SacValid$ Creature | Amount$ SVar:DBPutCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ EQ1 | SubAbility$ DBSubCounter SVar:DBSubCounter:DB$ RemoveCounter | CounterType$ P1P1 | CounterNum$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ EQ0 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/crovax_the_cursed.jpg Oracle:Crovax the Cursed enters the battlefield with four +1/+1 counters on it.\nAt the beginning of your upkeep, you may sacrifice a creature. If you do, put a +1/+1 counter on Crovax. If you don't, remove a +1/+1 counter from Crovax.\n{B}: Crovax gains flying until end of turn. diff --git a/forge-gui/res/cardsfolder/c/crown_of_ascension.txt b/forge-gui/res/cardsfolder/c/crown_of_ascension.txt index f2c18c5554e..c09d56cefd0 100644 --- a/forge-gui/res/cardsfolder/c/crown_of_ascension.txt +++ b/forge-gui/res/cardsfolder/c/crown_of_ascension.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ 1 U | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Flying | Description$ Enchanted creature has flying. A:AB$ PumpAll | Cost$ Sac<1/CARDNAME> | ValidCards$ Creature.sharesCreatureTypeWith Enchanted | KW$ Flying | SpellDescription$ Enchanted creature and other creatures that share a creature type with it gain flying until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/crown_of_ascension.jpg Oracle:Enchant creature\nEnchanted creature has flying.\nSacrifice Crown of Ascension: Enchanted creature and other creatures that share a creature type with it gain flying until end of turn. diff --git a/forge-gui/res/cardsfolder/c/crown_of_awe.txt b/forge-gui/res/cardsfolder/c/crown_of_awe.txt index 777f7688cad..609fb778a84 100644 --- a/forge-gui/res/cardsfolder/c/crown_of_awe.txt +++ b/forge-gui/res/cardsfolder/c/crown_of_awe.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ 1 W | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Protection from black & Protection from red | Description$ Enchanted creature has protection from black and from red. A:AB$ PumpAll | Cost$ Sac<1/CARDNAME> | ValidCards$ Creature.sharesCreatureTypeWith Enchanted | KW$ Protection from black & Protection from red | SpellDescription$ Enchanted creature and other creatures that share a creature type with it gain protection from black and from red until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/crown_of_awe.jpg Oracle:Enchant creature\nEnchanted creature has protection from black and from red.\nSacrifice Crown of Awe: Enchanted creature and other creatures that share a creature type with it gain protection from black and from red until end of turn. diff --git a/forge-gui/res/cardsfolder/c/crown_of_convergence.txt b/forge-gui/res/cardsfolder/c/crown_of_convergence.txt index 58fd471d7b7..078425b3b8d 100644 --- a/forge-gui/res/cardsfolder/c/crown_of_convergence.txt +++ b/forge-gui/res/cardsfolder/c/crown_of_convergence.txt @@ -4,6 +4,6 @@ Types:Artifact S:Mode$ Continuous | Affected$ Card.TopLibrary+YouCtrl | AffectedZone$ Library | MayLookAt$ Player | Description$ Play with the top card of your library revealed. S:Mode$ Continuous | Affected$ Creature.SharesColorWith TopCardOfLibrary+YouCtrl | AddPower$ 1 | AddToughness$ 1 | TopCardOfLibraryIs$ Creature | Description$ As long as the top card of your library is a creature card, creatures you control that share a color with that card get +1/+1. A:AB$ Dig | Cost$ G W | LibraryPosition$ -1 | DigNum$ 1 | Reveal$ False | DestinationZone$ Library | SpellDescription$ Put the top card of your library on the bottom of your library -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/crown_of_convergence.jpg Oracle:Play with the top card of your library revealed.\nAs long as the top card of your library is a creature card, creatures you control that share a color with that card get +1/+1.\n{G}{W}: Put the top card of your library on the bottom of your library. diff --git a/forge-gui/res/cardsfolder/c/crown_of_doom.txt b/forge-gui/res/cardsfolder/c/crown_of_doom.txt index 3af89d2c518..326236c79c2 100644 --- a/forge-gui/res/cardsfolder/c/crown_of_doom.txt +++ b/forge-gui/res/cardsfolder/c/crown_of_doom.txt @@ -4,6 +4,6 @@ Types:Artifact T:Mode$ Attacks | ValidCard$ Creature | Attacked$ You,Planeswalker.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a creature attacks you or a planeswalker you control, it gets +2/+0 until end of turn. SVar:TrigPump:DB$ Pump | Defined$ TriggeredAttacker | NumAtt$ +2 A:AB$ GainControl | Cost$ 2 | Defined$ Self | ValidTgts$ Player.OtherThanSourceOwner | TgtPrompt$ Select target player other than the owner | PlayerTurn$ True | SpellDescription$ Target player other than CARDNAME's owner gains control of it. Activate this ability only during your turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/crown_of_doom.jpg Oracle:Whenever a creature attacks you or a planeswalker you control, it gets +2/+0 until end of turn.\n{2}: Target player other than Crown of Doom's owner gains control of it. Activate this ability only during your turn. diff --git a/forge-gui/res/cardsfolder/c/crown_of_empires.txt b/forge-gui/res/cardsfolder/c/crown_of_empires.txt index e5894b57fca..5ea49da31e7 100644 --- a/forge-gui/res/cardsfolder/c/crown_of_empires.txt +++ b/forge-gui/res/cardsfolder/c/crown_of_empires.txt @@ -3,7 +3,7 @@ ManaCost:2 Types:Artifact A:AB$ Tap | Cost$ 3 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | ConditionCheckSVar$ M12Complete | ConditionSVarCompare$ EQ0 | SubAbility$ DBControl | SpellDescription$ Tap target creature. Gain control of that creature instead if you control artifacts named Scepter of Empires and Throne of Empires. SVar:DBControl:DB$ GainControl | Defined$ Targeted | ConditionCheckSVar$ M12Complete -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Name$Scepter of Empires|Throne of Empires SVar:M12Complete:Count$Compare AllM12Empires GT0.1.0 SVar:AllM12Empires:SVar$X/Times.Y diff --git a/forge-gui/res/cardsfolder/c/crown_of_fury.txt b/forge-gui/res/cardsfolder/c/crown_of_fury.txt index 49965ad171e..7498e04c1e2 100644 --- a/forge-gui/res/cardsfolder/c/crown_of_fury.txt +++ b/forge-gui/res/cardsfolder/c/crown_of_fury.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ 1 R | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddKeyword$ First Strike | Description$ Enchanted creature gets +1/+0 and has first strike. A:AB$ PumpAll | Cost$ Sac<1/CARDNAME> | ValidCards$ Creature.sharesCreatureTypeWith Enchanted | NumAtt$ 1 | KW$ First Strike | SpellDescription$ Enchanted creature and other creatures that share a creature type with it get +1/+0 and gain first strike until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/crown_of_fury.jpg Oracle:Enchant creature\nEnchanted creature gets +1/+0 and has first strike.\nSacrifice Crown of Fury: Enchanted creature and other creatures that share a creature type with it get +1/+0 and gain first strike until end of turn. diff --git a/forge-gui/res/cardsfolder/c/crown_of_suspicion.txt b/forge-gui/res/cardsfolder/c/crown_of_suspicion.txt index 7f2ae970250..9e20530b62e 100644 --- a/forge-gui/res/cardsfolder/c/crown_of_suspicion.txt +++ b/forge-gui/res/cardsfolder/c/crown_of_suspicion.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ 1 B | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 2 | AddToughness$ -1 | Description$ Enchanted creature gets +2/-1. A:AB$ PumpAll | Cost$ Sac<1/CARDNAME> | ValidCards$ Creature.sharesCreatureTypeWith Enchanted | NumAtt$ 2 | NumDef$ -1 | SpellDescription$ Enchanted creature and other creatures that share a creature type with it get +2/-1 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/crown_of_suspicion.jpg Oracle:Enchant creature\nEnchanted creature gets +2/-1.\nSacrifice Crown of Suspicion: Enchanted creature and other creatures that share a creature type with it get +2/-1 until end of turn. diff --git a/forge-gui/res/cardsfolder/c/crown_of_the_ages.txt b/forge-gui/res/cardsfolder/c/crown_of_the_ages.txt index 2c78c0f8c8c..9bf39383b2e 100644 --- a/forge-gui/res/cardsfolder/c/crown_of_the_ages.txt +++ b/forge-gui/res/cardsfolder/c/crown_of_the_ages.txt @@ -5,6 +5,6 @@ A:AB$ Pump | Cost$ 4 T | Amount$ 1 | ValidTgts$ Aura.AttachedTo Creature | TgtPr SVar:ChooseNewHost:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Creature.NotEnchantedByTargeted | ChoiceZone$ Battlefield | SubAbility$ CrownAttach | RememberChosen$ True | AILogic$ AtLeast1 SVar:CrownAttach:DB$ Attach | Object$ ParentTarget | Defined$ Remembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/crown_of_the_ages.jpg Oracle:{4}, {T}: Attach target Aura attached to a creature to another creature. diff --git a/forge-gui/res/cardsfolder/c/crown_of_vigor.txt b/forge-gui/res/cardsfolder/c/crown_of_vigor.txt index 43480e70918..989a126245f 100644 --- a/forge-gui/res/cardsfolder/c/crown_of_vigor.txt +++ b/forge-gui/res/cardsfolder/c/crown_of_vigor.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ 1 G | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 1 | Description$ Enchanted creature gets +1/+1. A:AB$ PumpAll | Cost$ Sac<1/CARDNAME> | ValidCards$ Creature.sharesCreatureTypeWith Enchanted | NumAtt$ 1 | NumDef$ 1 | SpellDescription$ Enchanted creature and other creatures that share a creature type with it get +1/+1 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/crown_of_vigor.jpg Oracle:Enchant creature\nEnchanted creature gets +1/+1.\nSacrifice Crown of Vigor: Enchanted creature and other creatures that share a creature type with it get +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/c/crucible_of_fire.txt b/forge-gui/res/cardsfolder/c/crucible_of_fire.txt index 472371530b7..c6bbeb78382 100644 --- a/forge-gui/res/cardsfolder/c/crucible_of_fire.txt +++ b/forge-gui/res/cardsfolder/c/crucible_of_fire.txt @@ -2,7 +2,7 @@ Name:Crucible of Fire ManaCost:3 R Types:Enchantment S:Mode$ Continuous | Affected$ Creature.Dragon+YouCtrl | AddPower$ 3 | AddToughness$ 3 | Description$ Dragon creatures you control get +3/+3. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/crucible_of_fire.jpg Oracle:Dragon creatures you control get +3/+3. diff --git a/forge-gui/res/cardsfolder/c/crucible_of_the_spirit_dragon.txt b/forge-gui/res/cardsfolder/c/crucible_of_the_spirit_dragon.txt index 1bb2d0980a6..a8de4176598 100644 --- a/forge-gui/res/cardsfolder/c/crucible_of_the_spirit_dragon.txt +++ b/forge-gui/res/cardsfolder/c/crucible_of_the_spirit_dragon.txt @@ -5,6 +5,6 @@ A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ PutCounter | Cost$ 1 T | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME. A:AB$ Mana | Cost$ T SubCounter | Produced$ Combo W U B R G | Amount$ ChosenX | RestrictValid$ Card.Dragon,Activated.Dragon | CostDesc$ {T}, Remove X storage counters from CARDNAME: | References$ X | SpellDescription$ Add X mana in any combination of colors. Spend this mana only to cast Dragon spells or activate abilities of Dragons. SVar:X:XChoice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/crucible_of_the_spirit_dragon.jpg Oracle:{T}: Add {C}.\n{1}, {T}: Put a storage counter on Crucible of the Spirit Dragon.\n{T}, Remove X storage counters from Crucible of the Spirit Dragon: Add X mana in any combination of colors. Spend this mana only to cast Dragon spells or activate abilities of Dragons. diff --git a/forge-gui/res/cardsfolder/c/cruel_deceiver.txt b/forge-gui/res/cardsfolder/c/cruel_deceiver.txt index 8535117bcd7..4dcfabf1b8e 100644 --- a/forge-gui/res/cardsfolder/c/cruel_deceiver.txt +++ b/forge-gui/res/cardsfolder/c/cruel_deceiver.txt @@ -8,6 +8,6 @@ SVar:TrigAnimate:DB$ Animate | Defined$ Self | Triggers$ TrigDamage | sVars$ Tri SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:TrigDamage:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Whenever CARDNAME deals damage to a creature, destroy that creature. SVar:TrigDestroy:DB$ Destroy | Defined$ TriggeredTarget -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cruel_deceiver.jpg Oracle:{1}: Look at the top card of your library.\n{2}: Reveal the top card of your library. If it's a land card, Cruel Deceiver gains "Whenever Cruel Deceiver deals damage to a creature, destroy that creature" until end of turn. Activate this ability only once each turn. diff --git a/forge-gui/res/cardsfolder/c/cruel_fate.txt b/forge-gui/res/cardsfolder/c/cruel_fate.txt index f0f16e9ea6d..377710b10b5 100644 --- a/forge-gui/res/cardsfolder/c/cruel_fate.txt +++ b/forge-gui/res/cardsfolder/c/cruel_fate.txt @@ -2,6 +2,6 @@ Name:Cruel Fate ManaCost:4 U Types:Sorcery A:SP$ Dig | Cost$ 4 U | ValidTgts$ Opponent | DigNum$ 5 | ChangeNum$ 1 | DestinationZone$ Graveyard | LibraryPosition2$ 0 | SpellDescription$ Look at the top five cards of target opponent's library. Put one of those cards into that player's graveyard and the rest on top of their library in any order. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal/cruel_fate.jpg Oracle:Look at the top five cards of target opponent's library. Put one of those cards into that player's graveyard and the rest on top of their library in any order. diff --git a/forge-gui/res/cardsfolder/c/cruel_sadist.txt b/forge-gui/res/cardsfolder/c/cruel_sadist.txt index fc92ab36394..e2be0f28a8e 100644 --- a/forge-gui/res/cardsfolder/c/cruel_sadist.txt +++ b/forge-gui/res/cardsfolder/c/cruel_sadist.txt @@ -5,6 +5,6 @@ PT:1/1 A:AB$ PutCounter | Cost$ B T PayLife<1> | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on CARDNAME. A:AB$ DealDamage | Cost$ 2 B T SubCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ ChosenX | References$ X | SpellDescription$ CARDNAME deals X damage to target creature. SVar:X:XChoice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cruel_sadist.jpg Oracle:{B}, {T}, Pay 1 life: Put a +1/+1 counter on Cruel Sadist.\n{2}{B}, {T}, Remove X +1/+1 counters from Cruel Sadist: Cruel Sadist deals X damage to target creature. diff --git a/forge-gui/res/cardsfolder/c/crumbling_sanctuary.txt b/forge-gui/res/cardsfolder/c/crumbling_sanctuary.txt index 148a95459dc..5e7b7c75164 100644 --- a/forge-gui/res/cardsfolder/c/crumbling_sanctuary.txt +++ b/forge-gui/res/cardsfolder/c/crumbling_sanctuary.txt @@ -5,6 +5,6 @@ R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Player | ReplaceWi SVar:ExileTop:DB$ Mill | Defined$ ReplacedTarget | NumCards$ X | Destination$ Exile | References$ X SVar:X:ReplaceCount$DamageAmount SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/crumbling_sanctuary.jpg Oracle:If damage would be dealt to a player, that player exiles that many cards from the top of their library instead. diff --git a/forge-gui/res/cardsfolder/c/crusading_knight.txt b/forge-gui/res/cardsfolder/c/crusading_knight.txt index 88fba38dc32..25a469e1f1c 100644 --- a/forge-gui/res/cardsfolder/c/crusading_knight.txt +++ b/forge-gui/res/cardsfolder/c/crusading_knight.txt @@ -5,6 +5,6 @@ PT:2/2 K:Protection from black S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | AddToughness$ X | Description$ CARDNAME gets +1/+1 for each Swamp your opponents control. SVar:X:Count$Valid Swamp.OppCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/crusading_knight.jpg Oracle:Protection from black\nCrusading Knight gets +1/+1 for each Swamp your opponents control. diff --git a/forge-gui/res/cardsfolder/c/crush_of_tentacles.txt b/forge-gui/res/cardsfolder/c/crush_of_tentacles.txt index 11d5f1f340d..dae178afd4e 100644 --- a/forge-gui/res/cardsfolder/c/crush_of_tentacles.txt +++ b/forge-gui/res/cardsfolder/c/crush_of_tentacles.txt @@ -4,6 +4,6 @@ Types:Sorcery K:Surge:3 U U A:SP$ ChangeZoneAll | Cost$ 4 U U | ChangeType$ Permanent.nonLand | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return all nonland permanents to their owners' hands. If CARDNAME's surge cost was paid, create an 8/8 blue Octopus creature token. | SubAbility$ DBToken SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenName$ Octopus | TokenTypes$ Creature,Octopus | TokenOwner$ You | TokenColors$ Blue | TokenPower$ 8 | TokenToughness$ 8 | Condition$ Surge -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/crush_of_tentacles.jpg Oracle:Surge {3}{U}{U} (You may cast this spell for its surge cost if you or a teammate has cast another spell this turn.)\nReturn all nonland permanents to their owners' hands. If Crush of Tentacles's surge cost was paid, create an 8/8 blue Octopus creature token. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/c/crush_underfoot.txt b/forge-gui/res/cardsfolder/c/crush_underfoot.txt index 4146eecf647..5f5279d1f58 100644 --- a/forge-gui/res/cardsfolder/c/crush_underfoot.txt +++ b/forge-gui/res/cardsfolder/c/crush_underfoot.txt @@ -5,6 +5,6 @@ A:SP$ ChooseCard | Cost$ 1 R | Defined$ You | Amount$ 1 | Choices$ Creature.Gian SVar:DBDmg:DB$ DealDamage | NumDmg$ X | References$ X | DamageSource$ Remembered | ValidTgts$ Creature | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$CardPower -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/crush_underfoot.jpg Oracle:Choose a Giant creature you control. It deals damage equal to its power to target creature. diff --git a/forge-gui/res/cardsfolder/c/crypt_creeper.txt b/forge-gui/res/cardsfolder/c/crypt_creeper.txt index 83ab9eb0b79..0cf6a6f8131 100644 --- a/forge-gui/res/cardsfolder/c/crypt_creeper.txt +++ b/forge-gui/res/cardsfolder/c/crypt_creeper.txt @@ -3,6 +3,6 @@ ManaCost:1 B Types:Creature Zombie PT:2/1 A:AB$ ChangeZone | Cost$ Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SpellDescription$ Exile target card from a graveyard. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/crypt_creeper.jpg Oracle:Sacrifice Crypt Creeper: Exile target card from a graveyard. diff --git a/forge-gui/res/cardsfolder/c/crypt_of_agadeem.txt b/forge-gui/res/cardsfolder/c/crypt_of_agadeem.txt index 2df4db9adac..ac679369306 100644 --- a/forge-gui/res/cardsfolder/c/crypt_of_agadeem.txt +++ b/forge-gui/res/cardsfolder/c/crypt_of_agadeem.txt @@ -5,6 +5,6 @@ K:CARDNAME enters the battlefield tapped. A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. A:AB$ Mana | Cost$ 2 T | Produced$ B | Amount$ X | References$ X | SpellDescription$ Add {B} for each black creature card in your graveyard. SVar:X:Count$ValidGraveyard Creature.Black+YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/crypt_of_agadeem.jpg Oracle:Crypt of Agadeem enters the battlefield tapped.\n{T}: Add {B}.\n{2}, {T}: Add {B} for each black creature card in your graveyard. diff --git a/forge-gui/res/cardsfolder/c/cryptbreaker.txt b/forge-gui/res/cardsfolder/c/cryptbreaker.txt index 01438754801..c30202794b2 100644 --- a/forge-gui/res/cardsfolder/c/cryptbreaker.txt +++ b/forge-gui/res/cardsfolder/c/cryptbreaker.txt @@ -8,6 +8,6 @@ SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 1 SVar:AIPreference:DiscardCost$Card DeckNeeds:Type$Zombie DeckHas:Ability$Token -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/cryptbreaker.jpg Oracle:{1}{B}, {T}, Discard a card: Create a 2/2 black Zombie creature token.\nTap three untapped Zombies you control: You draw a card and you lose 1 life. diff --git a/forge-gui/res/cardsfolder/c/cryptic_gateway.txt b/forge-gui/res/cardsfolder/c/cryptic_gateway.txt index 1f06a7173b7..28ac9235215 100644 --- a/forge-gui/res/cardsfolder/c/cryptic_gateway.txt +++ b/forge-gui/res/cardsfolder/c/cryptic_gateway.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ ChangeZone | Cost$ tapXType<2/Creature> | RememberCostCards$ True | ChangeType$ Creature.sharesCreatureTypeWith AllRemembered | Origin$ Hand | Destination$ Battlefield | ChangeNum$ 1 | Optional$ True | SpellDescription$ You may put a creature card from your hand that shares a creature type with each creature tapped this way onto the battlefield. | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cryptic_gateway.jpg Oracle:Tap two untapped creatures you control: You may put a creature card from your hand that shares a creature type with each creature tapped this way onto the battlefield. diff --git a/forge-gui/res/cardsfolder/c/cryptoplasm.txt b/forge-gui/res/cardsfolder/c/cryptoplasm.txt index 48335f9a6f7..d5c52244cae 100644 --- a/forge-gui/res/cardsfolder/c/cryptoplasm.txt +++ b/forge-gui/res/cardsfolder/c/cryptoplasm.txt @@ -5,6 +5,6 @@ PT:2/2 # Make Svars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ CryptoplasmCopy | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may have CARDNAME become a copy of another target creature. If you do, CARDNAME gains this ability. SVar:CryptoplasmCopy:DB$ Clone | ValidTgts$ Creature.Other | TgtPrompt$ Select another target creature to copy. | Optional$ True | GainThisAbility$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cryptoplasm.jpg Oracle:At the beginning of your upkeep, you may have Cryptoplasm become a copy of another target creature. If you do, Cryptoplasm gains this ability. diff --git a/forge-gui/res/cardsfolder/c/crystal_chimes.txt b/forge-gui/res/cardsfolder/c/crystal_chimes.txt index 5368ffff88b..8c3f3622996 100644 --- a/forge-gui/res/cardsfolder/c/crystal_chimes.txt +++ b/forge-gui/res/cardsfolder/c/crystal_chimes.txt @@ -2,6 +2,6 @@ Name:Crystal Chimes ManaCost:3 Types:Artifact A:AB$ ChangeZoneAll | Cost$ 3 T Sac<1/CARDNAME> | ChangeType$ Enchantment.YouOwn | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return all enchantment cards from your graveyard to your hand. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/crystal_chimes.jpg Oracle:{3}, {T}, Sacrifice Crystal Chimes: Return all enchantment cards from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/c/crystal_quarry.txt b/forge-gui/res/cardsfolder/c/crystal_quarry.txt index 4c016a3b6ac..03f9fb1aa6b 100644 --- a/forge-gui/res/cardsfolder/c/crystal_quarry.txt +++ b/forge-gui/res/cardsfolder/c/crystal_quarry.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ 5 T | Produced$ W U B R G | SpellDescription$ Add {W}{U}{B}{R}{G}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/crystal_quarry.jpg Oracle:{T}: Add {C}.\n{5}, {T}: Add {W}{U}{B}{R}{G}. diff --git a/forge-gui/res/cardsfolder/c/crystal_rod.txt b/forge-gui/res/cardsfolder/c/crystal_rod.txt index 5929ae9b3c4..635f0ac1ad6 100644 --- a/forge-gui/res/cardsfolder/c/crystal_rod.txt +++ b/forge-gui/res/cardsfolder/c/crystal_rod.txt @@ -3,6 +3,6 @@ ManaCost:1 Types:Artifact T:Mode$ SpellCast | ValidCard$ Card.Blue | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever a player casts a blue spell, you may pay {1}. If you do, you gain 1 life. SVar:TrigGainLife:AB$GainLife | Cost$ 1 | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/crystal_rod.jpg Oracle:Whenever a player casts a blue spell, you may pay {1}. If you do, you gain 1 life. diff --git a/forge-gui/res/cardsfolder/c/crystal_seer.txt b/forge-gui/res/cardsfolder/c/crystal_seer.txt index 75e00bf20e8..256ea8438cf 100644 --- a/forge-gui/res/cardsfolder/c/crystal_seer.txt +++ b/forge-gui/res/cardsfolder/c/crystal_seer.txt @@ -5,6 +5,6 @@ PT:2/2 A:AB$ ChangeZone | Cost$ 4 U | Origin$ Battlefield | Destination$ Hand | Defined$ Self | SpellDescription$ Return CARDNAME to it's owner's hand. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigRearrange | TriggerDescription$ When CARDNAME enters the battlefield, look at the top four cards of your library, then put them back in any order. SVar:TrigRearrange:DB$ RearrangeTopOfLibrary | Defined$ You | NumCards$ 4 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/crystal_seer.jpg Oracle:When Crystal Seer enters the battlefield, look at the top four cards of your library, then put them back in any order.\n{4}{U}: Return Crystal Seer to its owner's hand. diff --git a/forge-gui/res/cardsfolder/c/crystal_shard.txt b/forge-gui/res/cardsfolder/c/crystal_shard.txt index 9f23b9f933d..2ecbae16704 100644 --- a/forge-gui/res/cardsfolder/c/crystal_shard.txt +++ b/forge-gui/res/cardsfolder/c/crystal_shard.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact A:AB$ ChangeZone | Cost$ 3 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | UnlessCost$ 1 | UnlessPayer$ TargetedController | SpellDescription$ Return target creature to its owner's hand unless its controller pays {1}. A:AB$ ChangeZone | Cost$ U T | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | UnlessCost$ 1 | UnlessPayer$ TargetedController | SpellDescription$ Return target creature to its owner's hand unless its controller pays {1}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/crystal_shard.jpg Oracle:{3}, {T} or {U}, {T}: Return target creature to its owner's hand unless its controller pays {1}. diff --git a/forge-gui/res/cardsfolder/c/crystal_spray.txt b/forge-gui/res/cardsfolder/c/crystal_spray.txt index 86ca56b239e..f447eb02f7c 100644 --- a/forge-gui/res/cardsfolder/c/crystal_spray.txt +++ b/forge-gui/res/cardsfolder/c/crystal_spray.txt @@ -5,7 +5,7 @@ A:SP$ GenericChoice | Cost$ 2 U | ValidTgts$ Card | TgtZone$ Stack,Battlefield | SVar:ChangeColor:DB$ ChangeText | Defined$ ParentTarget | ChangeColorWord$ Choose Choose | SubAbility$ DBDraw | SpellDescription$ Change color SVar:ChangeType:DB$ ChangeText | Defined$ ParentTarget | ChangeTypeWord$ ChooseBasicLandType ChooseBasicLandType | SubAbility$ DBDraw | SpellDescription$ Change type SVar:DBDraw:DB$ Draw | NumCards$ 1 -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/crystal_spray.jpg Oracle:Change the text of target spell or permanent by replacing all instances of one color word with another or one basic land type with another until end of turn.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/c/crystal_vein.txt b/forge-gui/res/cardsfolder/c/crystal_vein.txt index f91ea8209c0..450289ecc0a 100644 --- a/forge-gui/res/cardsfolder/c/crystal_vein.txt +++ b/forge-gui/res/cardsfolder/c/crystal_vein.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ C | Amount$ 2 | SpellDescription$ Add {C}{C}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/crystal_vein.jpg Oracle:{T}: Add {C}.\n{T}, Sacrifice Crystal Vein: Add {C}{C}. diff --git a/forge-gui/res/cardsfolder/c/culling_dais.txt b/forge-gui/res/cardsfolder/c/culling_dais.txt index 4977a9db523..cf55ce14936 100644 --- a/forge-gui/res/cardsfolder/c/culling_dais.txt +++ b/forge-gui/res/cardsfolder/c/culling_dais.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ PutCounter | Cost$ T Sac<1/Creature> | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. A:AB$ Draw | Cost$ 1 Sac<1/CARDNAME> | NumCards$ X | References$ X | SpellDescription$ Draw a card for each charge counter on Culling Dais. SVar:X:Count$CardCounters.CHARGE -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/culling_dais.jpg Oracle:{T}, Sacrifice a creature: Put a charge counter on Culling Dais.\n{1}, Sacrifice Culling Dais: Draw a card for each charge counter on Culling Dais. diff --git a/forge-gui/res/cardsfolder/c/culling_mark.txt b/forge-gui/res/cardsfolder/c/culling_mark.txt index 351bdadc00f..38f41db22e3 100644 --- a/forge-gui/res/cardsfolder/c/culling_mark.txt +++ b/forge-gui/res/cardsfolder/c/culling_mark.txt @@ -2,6 +2,6 @@ Name:Culling Mark ManaCost:2 G Types:Sorcery A:SP$ Pump | Cost$ 2 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME blocks each combat if able. | IsCurse$ True | SpellDescription$ Target creature blocks this turn if able. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/culling_mark.jpg Oracle:Target creature blocks this turn if able. diff --git a/forge-gui/res/cardsfolder/c/culling_scales.txt b/forge-gui/res/cardsfolder/c/culling_scales.txt index 4b87d303896..847721ac9f2 100644 --- a/forge-gui/res/cardsfolder/c/culling_scales.txt +++ b/forge-gui/res/cardsfolder/c/culling_scales.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ At the beginning of your upkeep, destroy target nonland permanent with the lowest converted mana cost. (If two or more permanents are tied for lowest cost, target any one of them.) SVar:TrigDestroy:DB$Destroy | ValidTgts$ Permanent.nonLand+lowestCMC | TgtPrompt$ Select target nonland permanent with the lowest converted mana cost. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/culling_scales.jpg Oracle:At the beginning of your upkeep, destroy target nonland permanent with the lowest converted mana cost. (If two or more permanents are tied for lowest cost, target any one of them.) diff --git a/forge-gui/res/cardsfolder/c/culling_the_weak.txt b/forge-gui/res/cardsfolder/c/culling_the_weak.txt index 3e552e300cd..0f4131e67b5 100644 --- a/forge-gui/res/cardsfolder/c/culling_the_weak.txt +++ b/forge-gui/res/cardsfolder/c/culling_the_weak.txt @@ -3,7 +3,7 @@ ManaCost:B Types:Instant A:SP$ Mana | Cost$ B Sac<1/Creature> | Produced$ B | Amount$ 4 | AILogic$ ManaRitual | AINoRecursiveCheck$ True | SpellDescription$ Add {B}{B}{B}{B}. SVar:AIPreference:SacCost$Creature.cmcLE2 -#TODO: Improve the mana ritual AI such that it does not "misfire" from time to time, and only then remove RemAIDeck here, because otherwise sometimes the AI will just sac the creature and not cast anything. -SVar:RemAIDeck:True +#TODO: Improve the mana ritual AI such that it does not "misfire" from time to time, and only then remove RemoveDeck here, because otherwise sometimes the AI will just sac the creature and not cast anything. +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/culling_the_weak.jpg Oracle:As an additional cost to cast Culling the Weak, sacrifice a creature.\nAdd {B}{B}{B}{B}. diff --git a/forge-gui/res/cardsfolder/c/cultural_exchange.txt b/forge-gui/res/cardsfolder/c/cultural_exchange.txt index 5652e578f98..39010befa4e 100644 --- a/forge-gui/res/cardsfolder/c/cultural_exchange.txt +++ b/forge-gui/res/cardsfolder/c/cultural_exchange.txt @@ -2,6 +2,6 @@ Name:Cultural Exchange ManaCost:4 U U Types:Sorcery A:SP$ ExchangeControlVariant | Cost$ 4 U U | ValidTgts$ Player | TargetMin$ 2 | TargetMax$ 2 | Zone$ Battlefield | Type$ Creature | SpellDescription$ Choose any number of creatures target player controls. Choose the same number of creatures another target player controls. Those players exchange control of those creatures. (This effect lasts indefinitely.) -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cultural_exchange.jpg Oracle:Choose any number of creatures target player controls. Choose the same number of creatures another target player controls. Those players exchange control of those creatures. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/c/cunning_giant.txt b/forge-gui/res/cardsfolder/c/cunning_giant.txt index 7357bb6b76a..f27f25a14c8 100644 --- a/forge-gui/res/cardsfolder/c/cunning_giant.txt +++ b/forge-gui/res/cardsfolder/c/cunning_giant.txt @@ -6,6 +6,6 @@ R:Event$ DamageDone | ValidTarget$ Player.attackedBySourceThisCombat | ValidSour R:Event$ DamageDone | ValidTarget$ Planeswalker.attackedBySourceThisCombat | ValidSource$ Card.Self+unblocked | IsCombat$ True | ReplaceWith$ ChooseVictim | Optional$ True | OptionalDecider$ You | Secondary$ True | Description$ If CARDNAME is unblocked, you may have it assign its combat damage to a creature defending player controls. SVar:ChooseVictim:DB$ ChooseCard | ChoiceZone$ Battlefield | Choices$ Creature.DefenderCtrl | Amount$ 1 | ChoiceTitle$ Choose a card to deal the damage to | SubAbility$ CunningDmg SVar:CunningDmg:DB$ ReplaceEffect | VarName$ Affected | VarValue$ ChosenCard | VarType$ Card -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cunning_giant.jpg Oracle:If Cunning Giant is unblocked, you may have it assign its combat damage to a creature defending player controls. diff --git a/forge-gui/res/cardsfolder/c/cunning_wish.txt b/forge-gui/res/cardsfolder/c/cunning_wish.txt index 5cb15a0c560..489db144b0e 100644 --- a/forge-gui/res/cardsfolder/c/cunning_wish.txt +++ b/forge-gui/res/cardsfolder/c/cunning_wish.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Instant A:SP$ ChangeZone | Cost$ 2 U | Origin$ Sideboard | Destination$ Hand | ChangeType$ Instant.YouOwn | ChangeNum$ 1 | SubAbility$ DBChange | SpellDescription$ You may choose an instant card you own from outside the game, reveal that card, and put it into your hand. Exile CARDNAME. SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/cunning_wish.jpg Oracle:You may choose an instant card you own from outside the game, reveal that card, and put it into your hand. Exile Cunning Wish. diff --git a/forge-gui/res/cardsfolder/c/cuombajj_witches.txt b/forge-gui/res/cardsfolder/c/cuombajj_witches.txt index 540a018c690..9592018a616 100644 --- a/forge-gui/res/cardsfolder/c/cuombajj_witches.txt +++ b/forge-gui/res/cardsfolder/c/cuombajj_witches.txt @@ -4,6 +4,6 @@ Types:Creature Human Wizard PT:1/3 A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | SubAbility$ DBDmg | SpellDescription$ CARDNAME deals 1 damage to any target and 1 damage to any target of an opponent's choice. SVar:DBDmg:DB$ DealDamage | TargetingPlayer$ Player.Opponent | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cuombajj_witches.jpg Oracle:{T}: Cuombajj Witches deals 1 damage to any target and 1 damage to any target of an opponent's choice. diff --git a/forge-gui/res/cardsfolder/c/curfew.txt b/forge-gui/res/cardsfolder/c/curfew.txt index d6a2550348d..9bdf78bb475 100644 --- a/forge-gui/res/cardsfolder/c/curfew.txt +++ b/forge-gui/res/cardsfolder/c/curfew.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ RepeatEach | Cost$ U | RepeatPlayers$ Player | RepeatSubAbility$ PlayChoose | SubAbility$ BounceAll | SpellDescription$ Each player returns a creature they control to its owner's hand. SVar:PlayChoose:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.RememberedPlayerCtrl | Amount$ 1 | Mandatory$ True | AILogic$ WorstCard | ChoiceTitle$ Choose a creature you control | RememberChosen$ True SVar:BounceAll:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Hand | ChangeType$ Creature.IsRemembered -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/curfew.jpg Oracle:Each player returns a creature they control to its owner's hand. diff --git a/forge-gui/res/cardsfolder/c/curse_artifact.txt b/forge-gui/res/cardsfolder/c/curse_artifact.txt index 6e40b899292..8044f271256 100644 --- a/forge-gui/res/cardsfolder/c/curse_artifact.txt +++ b/forge-gui/res/cardsfolder/c/curse_artifact.txt @@ -7,6 +7,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ EnchantedController | Execute$ Trig SVar:TrigCurseArtifactSacrifice:DB$ Sacrifice | Defined$ TriggeredPlayer | SacValid$ Artifact.EnchantedBy | Optional$ True | RememberSacrificed$ True | SubAbility$ DBCurseArtifactDamage SVar:DBCurseArtifactDamage:DB$ DealDamage | Defined$ TriggeredPlayer | NumDmg$ 2 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ0 | SubAbility$ DBCurseArtifactCleanup SVar:DBCurseArtifactCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/curse_artifact.jpg Oracle:Enchant artifact\nAt the beginning of the upkeep of enchanted artifact's controller, Curse Artifact deals 2 damage to that player unless they sacrifice that artifact. diff --git a/forge-gui/res/cardsfolder/c/curse_of_chaos.txt b/forge-gui/res/cardsfolder/c/curse_of_chaos.txt index b73fee62437..b60ecce39a3 100644 --- a/forge-gui/res/cardsfolder/c/curse_of_chaos.txt +++ b/forge-gui/res/cardsfolder/c/curse_of_chaos.txt @@ -7,6 +7,6 @@ T:Mode$ AttackersDeclared | Execute$ TrigDiscard | TriggerZones$ Battlefield | A SVar:TrigDiscard:DB$ Discard | Defined$ TriggeredAttackingPlayer | NumCards$ 1 | Mode$ TgtChoose | SubAbility$ DBDraw | RememberDiscarded$ True SVar:DBDraw:DB$ Draw | Defined$ TriggeredAttackingPlayer | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/curse_of_chaos.jpg Oracle:Enchant player\nWhenever a player attacks enchanted player with one or more creatures, that attacking player may discard a card. If the player does, they draw a card. diff --git a/forge-gui/res/cardsfolder/c/curse_of_echoes.txt b/forge-gui/res/cardsfolder/c/curse_of_echoes.txt index 71567499147..f88f4c50cbc 100644 --- a/forge-gui/res/cardsfolder/c/curse_of_echoes.txt +++ b/forge-gui/res/cardsfolder/c/curse_of_echoes.txt @@ -5,7 +5,7 @@ K:Enchant player A:SP$ Attach | Cost$ 4 U | ValidTgts$ Player | AILogic$ Curse T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ Player.EnchantedBy | Execute$ TrigCopy | TriggerZones$ Battlefield | OptionalDecider$ TriggeredCardOpponent | TriggerDescription$ Whenever enchanted player casts an instant or sorcery spell, each other player may copy that spell and may choose new targets for the copy they control. SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Controller$ TriggeredCardOpponent -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:RemMultiplayer:True SVar:Picture:http://www.wizards.com/global/images/magic/general/curse_of_echoes.jpg Oracle:Enchant player\nWhenever enchanted player casts an instant or sorcery spell, each other player may copy that spell and may choose new targets for the copy they control. diff --git a/forge-gui/res/cardsfolder/c/curse_of_marit_lage.txt b/forge-gui/res/cardsfolder/c/curse_of_marit_lage.txt index 1d94dae9479..fb73e587636 100644 --- a/forge-gui/res/cardsfolder/c/curse_of_marit_lage.txt +++ b/forge-gui/res/cardsfolder/c/curse_of_marit_lage.txt @@ -5,6 +5,6 @@ S:Mode$ Continuous | Affected$ Island | AddHiddenKeyword$ CARDNAME doesn't untap T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTapAll | TriggerDescription$ When CARDNAME enters the battlefield, tap all Islands. SVar:TrigTapAll:DB$ TapAll | ValidCards$ Island SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/curse_of_marit_lage.jpg Oracle:When Curse of Marit Lage enters the battlefield, tap all Islands.\nIslands don't untap during their controllers' untap steps. diff --git a/forge-gui/res/cardsfolder/c/curse_of_the_swine.txt b/forge-gui/res/cardsfolder/c/curse_of_the_swine.txt index a6f63a0d1d5..f6da85582f8 100644 --- a/forge-gui/res/cardsfolder/c/curse_of_the_swine.txt +++ b/forge-gui/res/cardsfolder/c/curse_of_the_swine.txt @@ -7,6 +7,6 @@ SVar:TokenBoar:DB$ Token | TokenAmount$ 1 | TokenName$ Boar | TokenTypes$ Creatu SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Targeted$Amount SVar:MaxTgts:Count$Valid Creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/curse_of_the_swine.jpg Oracle:Exile X target creatures. For each creature exiled this way, its controller creates a 2/2 green Boar creature token. diff --git a/forge-gui/res/cardsfolder/c/curse_of_wizardry.txt b/forge-gui/res/cardsfolder/c/curse_of_wizardry.txt index 7687d34594d..ca6c2d4ed11 100644 --- a/forge-gui/res/cardsfolder/c/curse_of_wizardry.txt +++ b/forge-gui/res/cardsfolder/c/curse_of_wizardry.txt @@ -5,6 +5,6 @@ K:ETBReplacement:Other:ChooseColor SVar:ChooseColor:DB$ ChooseColor | Defined$ You | SpellDescription$ As CARDNAME enters the battlefield, choose a color. | AILogic$ MostProminentInHumanDeck T:Mode$ SpellCast | ValidCard$ Card.ChosenColor | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever a player casts a spell of the chosen color, that player loses 1 life. SVar:TrigLoseLife:DB$LoseLife | Defined$ TriggeredActivator | LifeAmount$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/curse_of_wizardry.jpg Oracle:As Curse of Wizardry enters the battlefield, choose a color.\nWhenever a player casts a spell of the chosen color, that player loses 1 life. diff --git a/forge-gui/res/cardsfolder/c/cursed_totem.txt b/forge-gui/res/cardsfolder/c/cursed_totem.txt index 2c664472bb7..c3daa1c9241 100644 --- a/forge-gui/res/cardsfolder/c/cursed_totem.txt +++ b/forge-gui/res/cardsfolder/c/cursed_totem.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact S:Mode$ Continuous | Affected$ Creature | AddHiddenKeyword$ CARDNAME's activated abilities can't be activated. | Description$ Activated abilities of creatures can't be activated. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/cursed_totem.jpg Oracle:Activated abilities of creatures can't be activated. diff --git a/forge-gui/res/cardsfolder/c/customs_depot.txt b/forge-gui/res/cardsfolder/c/customs_depot.txt index 45bf5948c64..3da6063e5b9 100644 --- a/forge-gui/res/cardsfolder/c/customs_depot.txt +++ b/forge-gui/res/cardsfolder/c/customs_depot.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | Execute$ TrigLoot | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever you cast a creature spell, you may pay {1}. If you do, draw a card, then discard a card. SVar:TrigLoot:AB$Draw | Cost$ 1 | NumCards$ 1 | SubAbility$ DBDiscard SVar:DBDiscard:DB$Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/customs_depot.jpg Oracle:Whenever you cast a creature spell, you may pay {1}. If you do, draw a card, then discard a card. diff --git a/forge-gui/res/cardsfolder/c/cyclical_evolution.txt b/forge-gui/res/cardsfolder/c/cyclical_evolution.txt index 507e54444db..5ff5e29f3d8 100644 --- a/forge-gui/res/cardsfolder/c/cyclical_evolution.txt +++ b/forge-gui/res/cardsfolder/c/cyclical_evolution.txt @@ -6,6 +6,6 @@ A:SP$ Pump | Cost$ 3 G G | ValidTgts$ Creature | TgtPrompt$ Select target creatu SVar:DBChange:DB$ChangeZone | Origin$ Stack | Destination$ Exile | RememberChanged$ True | SubAbility$ DBPutCounter SVar:DBPutCounter:DB$PutCounter | Defined$ Remembered | CounterType$ TIME | CounterNum$ 3 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/cyclical_evolution.jpg Oracle:Target creature gets +3/+3 until end of turn. Exile Cyclical Evolution with three time counters on it.\nSuspend 3—{2}{G} (Rather than cast this card from your hand, you may pay {2}{G} and exile it with three time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.) diff --git a/forge-gui/res/cardsfolder/c/cyclone.txt b/forge-gui/res/cardsfolder/c/cyclone.txt index 15057374cd1..b6dc112c039 100644 --- a/forge-gui/res/cardsfolder/c/cyclone.txt +++ b/forge-gui/res/cardsfolder/c/cyclone.txt @@ -6,6 +6,6 @@ SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ WIND | Counter SVar:SacSelf:DB$ Sacrifice | Defined$ Card.Self | UnlessCost$ X | UnlessXColor$ G | UnlessPayer$ You | UnlessResolveSubs$ WhenPaid | SubAbility$ DBDamageAll | References$ X SVar:DBDamageAll:DB$ DamageAll | NumDmg$ X | ValidCards$ Creature | ValidPlayers$ Player | References$ X SVar:X:Count$CardCounters.WIND -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cyclone.jpg Oracle:At the beginning of your upkeep, put a wind counter on Cyclone, then sacrifice Cyclone unless you pay {G} for each wind counter on it. If you pay, Cyclone deals damage equal to the number of wind counters on it to each creature and each player. diff --git a/forge-gui/res/cardsfolder/c/cyclopean_tomb.txt b/forge-gui/res/cardsfolder/c/cyclopean_tomb.txt index ceed206a8b2..c935f0b025e 100644 --- a/forge-gui/res/cardsfolder/c/cyclopean_tomb.txt +++ b/forge-gui/res/cardsfolder/c/cyclopean_tomb.txt @@ -12,7 +12,7 @@ SVar:DBRemoveCounter:DB$ RemoveCounter | CounterType$ MIRE | CounterNum$ All | D SVar:DBForget:DB$ Pump | ForgetImprinted$ ChosenCard SVar:TrigForget:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | TriggerZones$ Command | ValidCard$ Card.IsImprinted | Static$ True | Execute$ PumpForget SVar:PumpForget:DB$ Pump | ForgetImprinted$ TriggeredCard -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/cyclopean_tomb.jpg Oracle:{2}, {T}: Put a mire counter on target non-Swamp land. That land is a Swamp for as long as it has a mire counter on it. Activate this ability only during your upkeep.\nWhen Cyclopean Tomb is put into a graveyard from the battlefield, at the beginning of each of your upkeeps for the rest of the game, remove all mire counters from a land that a mire counter was put onto with Cyclopean Tomb but that a mire counter has not been removed from with Cyclopean Tomb. diff --git a/forge-gui/res/cardsfolder/c/cytoplast_manipulator.txt b/forge-gui/res/cardsfolder/c/cytoplast_manipulator.txt index 5eb9500e16c..2e06eb73993 100644 --- a/forge-gui/res/cardsfolder/c/cytoplast_manipulator.txt +++ b/forge-gui/res/cardsfolder/c/cytoplast_manipulator.txt @@ -4,7 +4,7 @@ Types:Creature Human Wizard Mutant PT:0/0 K:Graft:2 A:AB$ GainControl | Cost$ U T | ValidTgts$ Creature.counters_GE1_P1P1 | TgtPrompt$ Select target creature with a +1/+1 counter | LoseControl$ LeavesPlay | SpellDescription$ Gain control of target creature with a +1/+1 counter on it for as long as CARDNAME remains on the battlefield. -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckNeeds:Ability$Counters DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/cytoplast_manipulator.jpg diff --git a/forge-gui/res/cardsfolder/c/cytoshape.txt b/forge-gui/res/cardsfolder/c/cytoshape.txt index bbba3887b7a..68b6a7f92d6 100644 --- a/forge-gui/res/cardsfolder/c/cytoshape.txt +++ b/forge-gui/res/cardsfolder/c/cytoshape.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ ChooseCard | Cost$ 1 G U | Defined$ You | Amount$ 1 | Choices$ Creature.nonLegendary | Mandatory$ True | SubAbility$ Pump4Tgt | RememberChosen$ True | AILogic$ Clone | SpellDescription$ Choose a nonlegendary creature on the battlefield. Target creature becomes a copy of that creature until end of turn. SVar:Pump4Tgt:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Choose target creature | AILogic$ Pump | SubAbility$ ShapeTgt | StackDescription$ None SVar:ShapeTgt:DB$ Clone | Defined$ Remembered | CloneTarget$ ParentTarget | Duration$ UntilEndOfTurn -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/cytoshape.jpg Oracle:Choose a nonlegendary creature on the battlefield. Target creature becomes a copy of that creature until end of turn. diff --git a/forge-gui/res/cardsfolder/d/dack_fayden.txt b/forge-gui/res/cardsfolder/d/dack_fayden.txt index 56c84a02f37..0dcc8facea0 100644 --- a/forge-gui/res/cardsfolder/d/dack_fayden.txt +++ b/forge-gui/res/cardsfolder/d/dack_fayden.txt @@ -8,6 +8,6 @@ A:AB$ GainControl | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | ValidTgts A:AB$ Effect | Cost$ SubCounter<6/LOYALTY> | Planeswalker$ True | Ultimate$ True | Name$ Emblem - Dack Fayden | Triggers$ TrigSpellCast | SVars$ EffSpellCast | Duration$ Permanent | AILogic$ Always | Stackable$ False | SpellDescription$ You get an emblem with "Whenever you cast a spell that targets one or more permanents, gain control of those permanents." SVar:TrigSpellCast:Mode$ SpellCast | ValidActivatingPlayer$ You | TargetsValid$ Permanent | Execute$ EffSpellCast | TriggerDescription$ Whenever you cast a spell that targets one or more permanents, gain control of those permanents. SVar:EffSpellCast:DB$ GainControl | Defined$ TriggeredSpellAbilityTargetingCards -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dack_fayden.jpg Oracle:[+1]: Target player draws two cards, then discards two cards.\n[-2]: Gain control of target artifact.\n[-6]: You get an emblem with "Whenever you cast a spell that targets one or more permanents, gain control of those permanents." diff --git a/forge-gui/res/cardsfolder/d/daghatar_the_adamant.txt b/forge-gui/res/cardsfolder/d/daghatar_the_adamant.txt index c44052179cd..d1b1cc4b7a3 100644 --- a/forge-gui/res/cardsfolder/d/daghatar_the_adamant.txt +++ b/forge-gui/res/cardsfolder/d/daghatar_the_adamant.txt @@ -6,6 +6,6 @@ K:Vigilance K:etbCounter:P1P1:4 A:AB$ Pump | Cost$ 1 BG BG | ValidTgts$ Creature | TgtPrompt$ Select target creature to remove a +1/+1 counter from | SubAbility$ DBMove | StackDescription$ None | SpellDescription$ Move a +1/+1 counter from target creature onto a second target creature. SVar:DBMove:DB$ MoveCounter | Source$ ParentTarget | ValidTgts$ Creature | TgtPrompt$ Select target creature to move a +1/+1 counter to | TargetUnique$ True | CounterType$ P1P1 | CounterNum$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/daghatar_the_adamant.jpg Oracle:Vigilance\nDaghatar the Adamant enters the battlefield with four +1/+1 counters on it.\n{1}{B/G}{B/G}: Move a +1/+1 counter from target creature onto a second target creature. diff --git a/forge-gui/res/cardsfolder/d/dakkon_blackblade_avatar.txt b/forge-gui/res/cardsfolder/d/dakkon_blackblade_avatar.txt index 1b1a25b353e..b1fc2dfda26 100644 --- a/forge-gui/res/cardsfolder/d/dakkon_blackblade_avatar.txt +++ b/forge-gui/res/cardsfolder/d/dakkon_blackblade_avatar.txt @@ -4,6 +4,6 @@ Types:Vanguard HandLifeModifier:+1/+0 S:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Hand | Affected$ Card.nonColorless+YouOwn | AddAbility$ STPlayLand | Description$ You may play any colored card from your hand as a copy of a basic land card chosen at random that can produce mana of one of the card's colors. SVar:STPlayLand:ST$ PlayLandVariant | Cost$ 0 | Clone$ BasicLand | SorcerySpeed$ True | ActivationZone$ Hand | SpellDescription$ Play CARDNAME from your hand as a copy of a basic land card chosen at random that can produce mana of one of CARDNAME's colors. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:https://downloads.cardforge.org/images/cards/VAN/Dakkon Blackblade Avatar.full.jpg Oracle:Hand +1, life +0\nYou may play any colored card from your hand as a copy of a basic land card chosen at random that can produce mana of one of the card's colors. diff --git a/forge-gui/res/cardsfolder/d/dakmor_salvage.txt b/forge-gui/res/cardsfolder/d/dakmor_salvage.txt index 9d0d7ad80e9..639b44cb41d 100644 --- a/forge-gui/res/cardsfolder/d/dakmor_salvage.txt +++ b/forge-gui/res/cardsfolder/d/dakmor_salvage.txt @@ -4,6 +4,6 @@ Types:Land K:CARDNAME enters the battlefield tapped. A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. K:Dredge:2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dakmor_salvage.jpg Oracle:Dakmor Salvage enters the battlefield tapped.\n{T}: Add {B}.\nDredge 2 (If you would draw a card, instead you may put exactly two cards from the top of your library into your graveyard. If you do, return this card from your graveyard to your hand. Otherwise, draw a card.) diff --git a/forge-gui/res/cardsfolder/d/dakra_mystic.txt b/forge-gui/res/cardsfolder/d/dakra_mystic.txt index 8c87c658b7f..3f62844d25c 100644 --- a/forge-gui/res/cardsfolder/d/dakra_mystic.txt +++ b/forge-gui/res/cardsfolder/d/dakra_mystic.txt @@ -6,6 +6,6 @@ A:AB$ Dig | Cost$ U T | DigNum$ 1 | Defined$ Player | Reveal$ True | NoMove$ Tru SVar:DBMill:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Graveyard | Optional$ True | Imprint$ True | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | Defined$ Player | NumCards$ 1 | ConditionDefined$ Imprinted | ConditionPresent$ Card | ConditionCompare$ EQ0 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dakra_mystic.jpg Oracle:{U}, {T}: Each player reveals the top card of their library. You may put the revealed cards into their owners' graveyards. If you don't, each player draws a card. diff --git a/forge-gui/res/cardsfolder/d/damping_engine.txt b/forge-gui/res/cardsfolder/d/damping_engine.txt index ad44bff3205..634f9e5615e 100644 --- a/forge-gui/res/cardsfolder/d/damping_engine.txt +++ b/forge-gui/res/cardsfolder/d/damping_engine.txt @@ -4,7 +4,7 @@ Types:Artifact S:Mode$ Continuous | Affected$ Player.withMostPermanentInPlay | AddStaticAbility$ STCantPlayLand & STCantCast | IgnoreEffectCost$ Sac<1/Permanent> | Description$ A player who controls more permanents than each other player can't play lands or cast artifact, creature, or enchantment spells. That player may sacrifice a permanent for that player to ignore this effect until end of turn. SVar:STCantPlayLand:Mode$ CantPlayLand | EffectZone$ Command | Player$ You | Description$ You can't play land cards. SVar:STCantCast:Mode$ CantBeCast | ValidCard$ Artifact,Creature,Enchantment | Caster$ You | EffectZone$ Command | Description$ You can't cast artifact, creature, or enchantment spells. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/damping_engine.jpg Oracle:A player who controls more permanents than each other player can't play lands or cast artifact, creature, or enchantment spells. That player may sacrifice a permanent for that player to ignore this effect until end of turn. diff --git a/forge-gui/res/cardsfolder/d/damping_field.txt b/forge-gui/res/cardsfolder/d/damping_field.txt index 9a21d118fc4..11cbd8d1656 100644 --- a/forge-gui/res/cardsfolder/d/damping_field.txt +++ b/forge-gui/res/cardsfolder/d/damping_field.txt @@ -3,6 +3,6 @@ ManaCost:2 W Types:Enchantment S:Mode$ Continuous | Affected$ Player | AddKeyword$ UntapAdjust:Artifact:1 | Description$ Players can't untap more than one artifact during their untap steps. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/damping_field.jpg Oracle:Players can't untap more than one artifact during their untap steps. diff --git a/forge-gui/res/cardsfolder/d/damping_matrix.txt b/forge-gui/res/cardsfolder/d/damping_matrix.txt index e06cd268595..fa63c25b8e4 100644 --- a/forge-gui/res/cardsfolder/d/damping_matrix.txt +++ b/forge-gui/res/cardsfolder/d/damping_matrix.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact S:Mode$ CantBeActivated | ValidCard$ Artifact,Creature | AffectedZone$ Battlefield | NonMana$ True | Description$ Activated abilities of artifacts and creatures can't be activated unless they're mana abilities. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/damping_matrix.jpg Oracle:Activated abilities of artifacts and creatures can't be activated unless they're mana abilities. diff --git a/forge-gui/res/cardsfolder/d/dance_of_the_skywise.txt b/forge-gui/res/cardsfolder/d/dance_of_the_skywise.txt index 5f41dd77584..8b8b3ffb0db 100644 --- a/forge-gui/res/cardsfolder/d/dance_of_the_skywise.txt +++ b/forge-gui/res/cardsfolder/d/dance_of_the_skywise.txt @@ -2,6 +2,6 @@ Name:Dance of the Skywise ManaCost:1 U Types:Instant A:SP$ Animate | Cost$ 1 U | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | Power$ 4 | Toughness$ 4 | Keywords$ Flying | RemoveAllAbilities$ True | Colors$ Blue | OverwriteColors$ True | Types$ Dragon,Illusion | RemoveCreatureTypes$ True | SpellDescription$ Until end of turn, target creature you control becomes a blue Dragon Illusion with base power and toughness 4/4, loses all abilities, and gains flying. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dance_of_the_skywise.jpg Oracle:Until end of turn, target creature you control becomes a blue Dragon Illusion with base power and toughness 4/4, loses all abilities, and gains flying. diff --git a/forge-gui/res/cardsfolder/d/dangerous_wager.txt b/forge-gui/res/cardsfolder/d/dangerous_wager.txt index 1826ac13baf..c6dd04e3be4 100644 --- a/forge-gui/res/cardsfolder/d/dangerous_wager.txt +++ b/forge-gui/res/cardsfolder/d/dangerous_wager.txt @@ -3,7 +3,7 @@ ManaCost:1 R Types:Instant A:SP$ Discard | Cost$ 1 R | Mode$ Hand | Defined$ You | SubAbility$ BetThat | SpellDescription$ Discard your hand, then draw two cards. SVar:BetThat:DB$ Draw | Defined$ You | NumCards$ 2 -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dangerous_wager.jpg Oracle:Discard your hand, then draw two cards. diff --git a/forge-gui/res/cardsfolder/d/daretti_scrap_savant.txt b/forge-gui/res/cardsfolder/d/daretti_scrap_savant.txt index 391a0b8b8c2..a38895f1424 100644 --- a/forge-gui/res/cardsfolder/d/daretti_scrap_savant.txt +++ b/forge-gui/res/cardsfolder/d/daretti_scrap_savant.txt @@ -13,6 +13,6 @@ A:AB$ Effect | Cost$ SubCounter<10/LOYALTY> | Planeswalker$ True | Ultimate$ Tru SVar:TrigChangesZone:Mode$ ChangesZone | ValidCard$ Artifact.YouOwn | Origin$ Battlefield | Destination$ Graveyard | Execute$ DelTrigReturn | TriggerZones$ Command | TriggerDescription$ Whenever an artifact is put into your graveyard from the battlefield, return that card to the battlefield at the beginning of the next end step. SVar:DelTrigReturn:DB$ DelayedTrigger | Mode$ Phase | Phase$ End Of Turn | Execute$ DBReturn | RememberObjects$ TriggeredCard | TriggerDescription$ Return that card to the battlefield at the beginning of the next end step. SVar:DBReturn:DB$ ChangeZone | Defined$ DelayTriggerRemembered | Origin$ Graveyard | Destination$ Battlefield -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/daretti_scrap_savant.jpg Oracle:[+2]: Discard up to two cards, then draw that many cards.\n[-2]: Sacrifice an artifact. If you do, return target artifact card from your graveyard to the battlefield.\n[-10]: You get an emblem with "Whenever an artifact is put into your graveyard from the battlefield, return that card to the battlefield at the beginning of the next end step."\nDaretti, Scrap Savant can be your commander. diff --git a/forge-gui/res/cardsfolder/d/darigaazs_attendant.txt b/forge-gui/res/cardsfolder/d/darigaazs_attendant.txt index dd28cc404d8..5fbdd960e35 100644 --- a/forge-gui/res/cardsfolder/d/darigaazs_attendant.txt +++ b/forge-gui/res/cardsfolder/d/darigaazs_attendant.txt @@ -3,6 +3,6 @@ ManaCost:5 Types:Artifact Creature Golem PT:3/3 A:AB$ Mana | Cost$ 1 Sac<1/CARDNAME> | Produced$ B R G | SpellDescription$ Add {B}{R}{G}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/darigaazs_attendant.jpg Oracle:{1}, Sacrifice Darigaaz's Attendant: Add {B}{R}{G}. diff --git a/forge-gui/res/cardsfolder/d/daring_thief.txt b/forge-gui/res/cardsfolder/d/daring_thief.txt index 047642bcd80..875fae5c210 100644 --- a/forge-gui/res/cardsfolder/d/daring_thief.txt +++ b/forge-gui/res/cardsfolder/d/daring_thief.txt @@ -5,7 +5,7 @@ PT:2/3 T:Mode$ Untaps | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigExchangeControl | OptionalDecider$ You | TriggerDescription$ Inspired — Whenever CARDNAME becomes untapped, you may exchange control of target nonland permanent you control and target permanent an opponent controls that shares a card type with it. SVar:TrigExchangeControl:DB$ Pump | ValidTgts$ Permanent.YouCtrl+nonLand | TgtPrompt$ Select target nonland permanent you control | SubAbility$ DBExchange SVar:DBExchange:DB$ ExchangeControl | Defined$ ParentTarget | ValidTgts$ Permanent.OppCtrl | TgtPrompt$ Select target permanent an opponent controls that shares a card type with it | TargetsWithSharedTypes$ Creature,Artifact,Enchantment,Planeswalker,Tribal -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/daring_thief.jpg Oracle:Inspired — Whenever Daring Thief becomes untapped, you may exchange control of target nonland permanent you control and target permanent an opponent controls that shares a card type with it. diff --git a/forge-gui/res/cardsfolder/d/dark_betrayal.txt b/forge-gui/res/cardsfolder/d/dark_betrayal.txt index 722390068ea..4dad10d2c29 100644 --- a/forge-gui/res/cardsfolder/d/dark_betrayal.txt +++ b/forge-gui/res/cardsfolder/d/dark_betrayal.txt @@ -2,6 +2,6 @@ Name:Dark Betrayal ManaCost:B Types:Instant A:SP$ Destroy | Cost$ B | ValidTgts$ Creature.Black | TgtPrompt$ Select target black creature | SpellDescription$ Destroy target black creature. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dark_betrayal.jpg Oracle:Destroy target black creature. diff --git a/forge-gui/res/cardsfolder/d/dark_deal.txt b/forge-gui/res/cardsfolder/d/dark_deal.txt index d06d0be208d..47121c4c2c0 100644 --- a/forge-gui/res/cardsfolder/d/dark_deal.txt +++ b/forge-gui/res/cardsfolder/d/dark_deal.txt @@ -7,8 +7,8 @@ SVar:DBDraw:DB$ Draw | NumCards$ X | Defined$ Player.IsRemembered | References$ SVar:CleanDrawn:DB$ Cleanup | ClearRemembered$ True # This calculation isn't considering the remembered player, only the remembered cards? SVar:X:Remembered$Amount.Minus.1 -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random DeckHas:Ability$Graveyard SVar:Picture:http://www.wizards.com/global/images/magic/general/dark_deal.jpg Oracle:Each player discards all the cards in their hand, then draws that many cards minus one. diff --git a/forge-gui/res/cardsfolder/d/dark_heart_of_the_wood.txt b/forge-gui/res/cardsfolder/d/dark_heart_of_the_wood.txt index 7af61117322..16bb1d36674 100644 --- a/forge-gui/res/cardsfolder/d/dark_heart_of_the_wood.txt +++ b/forge-gui/res/cardsfolder/d/dark_heart_of_the_wood.txt @@ -2,7 +2,7 @@ Name:Dark Heart of the Wood ManaCost:B G Types:Enchantment A:AB$ GainLife | Cost$ Sac<1/Forest> | LifeAmount$ 3 | SpellDescription$ You gain 3 life. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/dark_heart_of_the_wood.jpg Oracle:Sacrifice a Forest: You gain 3 life. diff --git a/forge-gui/res/cardsfolder/d/dark_maze.txt b/forge-gui/res/cardsfolder/d/dark_maze.txt index 0d03a67c92f..7da9cb1eb1f 100644 --- a/forge-gui/res/cardsfolder/d/dark_maze.txt +++ b/forge-gui/res/cardsfolder/d/dark_maze.txt @@ -4,6 +4,6 @@ Types:Creature Wall PT:4/5 K:Defender A:AB$ Pump | Cost$ 0 | KW$ HIDDEN CARDNAME can attack as though it didn't have defender. | AtEOT$ Exile | SpellDescription$ CARDNAME can attack this turn as though it didn't have defender. Exile it at the beginning of the next end step. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dark_maze.jpg Oracle:Defender (This creature can't attack.)\n{0}: Dark Maze can attack this turn as though it didn't have defender. Exile it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/d/dark_petition.txt b/forge-gui/res/cardsfolder/d/dark_petition.txt index c8e8dab79cf..43559e5a5b4 100644 --- a/forge-gui/res/cardsfolder/d/dark_petition.txt +++ b/forge-gui/res/cardsfolder/d/dark_petition.txt @@ -5,6 +5,6 @@ A:SP$ ChangeZone | Cost$ 3 B B | Origin$ Library | Destination$ Hand | ChangeTyp SVar:DBMana:DB$ Mana | ConditionCheckSVar$ X | ConditionSVarCompare$ GE2 | Produced$ B | Amount$ 3 SVar:X:Count$ValidGraveyard Instant.YouOwn,Sorcery.YouOwn #TODO: Improve the tutoring logic for the AI. Currently will generally look for the most expensive castable thing in the library (which can, of course, be used to advantage in properly constructed AI decks). -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dark_petition.jpg Oracle:Search your library for a card and put that card into your hand. Then shuffle your library.\nSpell mastery — If there are two or more instant and/or sorcery cards in your graveyard, add {B}{B}{B}. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/d/dark_privilege.txt b/forge-gui/res/cardsfolder/d/dark_privilege.txt index 7542bdca655..0625586f835 100644 --- a/forge-gui/res/cardsfolder/d/dark_privilege.txt +++ b/forge-gui/res/cardsfolder/d/dark_privilege.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ 1 B | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 1 | Description$ Enchanted creature gets +1/+1. A:AB$ Regenerate | Cost$ Sac<1/Creature> | Defined$ Enchanted | SpellDescription$ Regenerate enchanted creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dark_privilege.jpg Oracle:Enchant creature\nEnchanted creature gets +1/+1.\nSacrifice a creature: Regenerate enchanted creature. diff --git a/forge-gui/res/cardsfolder/d/dark_supplicant.txt b/forge-gui/res/cardsfolder/d/dark_supplicant.txt index db4e81f4d95..59df45b0ca8 100644 --- a/forge-gui/res/cardsfolder/d/dark_supplicant.txt +++ b/forge-gui/res/cardsfolder/d/dark_supplicant.txt @@ -3,8 +3,8 @@ ManaCost:B Types:Creature Human Cleric PT:1/1 A:AB$ ChangeZone | Cost$ T Sac<3/Cleric> | Hidden$ True | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard,Hand | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Battlefield | ChangeType$ Card.namedScion of Darkness | SpellDescription$ Search your graveyard, hand, and/or library for a card named Scion of Darkness and put it onto the battlefield. If you search your library this way, shuffle it. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random DeckNeeds:Name$Scion of Darkness SVar:Picture:http://www.wizards.com/global/images/magic/general/dark_supplicant.jpg Oracle:{T}, Sacrifice three Clerics: Search your graveyard, hand, and/or library for a card named Scion of Darkness and put it onto the battlefield. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/d/dark_temper.txt b/forge-gui/res/cardsfolder/d/dark_temper.txt index a5752caedb4..e6e7ac26491 100644 --- a/forge-gui/res/cardsfolder/d/dark_temper.txt +++ b/forge-gui/res/cardsfolder/d/dark_temper.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ DealDamage | Cost$ 2 R | ValidTgts$ Creature| TgtPrompt$ Creature | NumDmg$ 2 | SubAbility$ DBDestroy | ConditionPresent$ Permanent.Black+YouCtrl | ConditionCompare$ EQ0 | SpellDescription$ CARDNAME deals 2 damage to target creature. If you control a black permanent, destroy the creature instead. SVar:DBDestroy:DB$ Destroy | Defined$ Targeted | ConditionPresent$ Permanent.Black+YouCtrl | ConditionCompare$ GE1 | ConditionDescription$ If you control a black permanent, DeckHints:Color$Black -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dark_temper.jpg Oracle:Dark Temper deals 2 damage to target creature. If you control a black permanent, destroy the creature instead. diff --git a/forge-gui/res/cardsfolder/d/dark_triumph.txt b/forge-gui/res/cardsfolder/d/dark_triumph.txt index 005d1813fc5..aaf60999cc8 100644 --- a/forge-gui/res/cardsfolder/d/dark_triumph.txt +++ b/forge-gui/res/cardsfolder/d/dark_triumph.txt @@ -3,6 +3,6 @@ ManaCost:4 B Types:Instant A:SP$ PumpAll | Cost$ 4 B | ValidCards$ Creature.YouCtrl | NumAtt$ +2 | SpellDescription$ Creatures you control get +2/+0 until end of turn. A:SP$ PumpAll | Cost$ Sac<1/Creature> | ValidCards$ Creature.YouCtrl | NumAtt$ +2 | IsPresent$ Swamp.YouCtrl | CostDesc$ If you control a Swamp, you may sacrifice a creature | SpellDescription$ rather than pay CARDNAME's mana cost. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dark_triumph.jpg Oracle:If you control a Swamp, you may sacrifice a creature rather than pay Dark Triumph's mana cost.\nCreatures you control get +2/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/d/dark_tutelage.txt b/forge-gui/res/cardsfolder/d/dark_tutelage.txt index f78b584afe3..e507eca6372 100644 --- a/forge-gui/res/cardsfolder/d/dark_tutelage.txt +++ b/forge-gui/res/cardsfolder/d/dark_tutelage.txt @@ -6,6 +6,6 @@ SVar:TrigDig:DB$ Dig | DigNum$ 1 | Reveal$ True | ChangeNum$ All | ChangeValid$ SVar:DBLose:DB$LoseLife | LifeAmount$ X | SubAbility$ DBCleanup | References$ X SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True SVar:X:Remembered$CardManaCost -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dark_tutelage.jpg Oracle:At the beginning of your upkeep, reveal the top card of your library and put that card into your hand. You lose life equal to its converted mana cost. diff --git a/forge-gui/res/cardsfolder/d/darkest_hour.txt b/forge-gui/res/cardsfolder/d/darkest_hour.txt index 995704fc837..f8ed172dcd6 100644 --- a/forge-gui/res/cardsfolder/d/darkest_hour.txt +++ b/forge-gui/res/cardsfolder/d/darkest_hour.txt @@ -3,6 +3,6 @@ ManaCost:B Types:Enchantment S:Mode$ Continuous | Affected$ Creature | SetColor$ Black | Description$ All creatures are black. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/darkest_hour.jpg Oracle:All creatures are black. diff --git a/forge-gui/res/cardsfolder/d/darkheart_sliver.txt b/forge-gui/res/cardsfolder/d/darkheart_sliver.txt index 76db68b97a7..9889cf23a22 100644 --- a/forge-gui/res/cardsfolder/d/darkheart_sliver.txt +++ b/forge-gui/res/cardsfolder/d/darkheart_sliver.txt @@ -4,6 +4,6 @@ Types:Creature Sliver PT:2/2 S:Mode$ Continuous | Affected$ Sliver | AddAbility$ GainLife | Description$ All Slivers have "Sacrifice this permanent: You gain 3 life." SVar:GainLife:AB$GainLife | Cost$ Sac<1/CARDNAME> | LifeAmount$ 3 | Defined$ You | SpellDescription$ You gain 3 life. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/darkheart_sliver.jpg Oracle:All Slivers have "Sacrifice this permanent: You gain 3 life." diff --git a/forge-gui/res/cardsfolder/d/darkpact.txt b/forge-gui/res/cardsfolder/d/darkpact.txt index 2f23dad14d0..50d553fc64b 100644 --- a/forge-gui/res/cardsfolder/d/darkpact.txt +++ b/forge-gui/res/cardsfolder/d/darkpact.txt @@ -4,7 +4,7 @@ Types:Sorcery K:Remove CARDNAME from your deck before playing if you're not playing for ante. A:SP$ GainOwnership | Cost$ B B B | ValidTgts$ Card | TgtZone$ Ante | SubAbility$ ExchangeAnte | SpellDescription$ You own target card in the ante. Exchange that card with the top card of your library. | StackDescription$ You own target card ({c:Targeted}) in the ante. Exchange that card with the top card of your library. SVar:ExchangeAnte:DB$ ExchangeZone | Zone1$ Ante | Zone2$ Library | Object$ ParentTarget | ValidExchange$ Card.TopLibrary | Mandatory$ True | StackDescription$ -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/darkpact.jpg Oracle:Remove Darkpact from your deck before playing if you're not playing for ante.\nYou own target card in the ante. Exchange that card with the top card of your library. diff --git a/forge-gui/res/cardsfolder/d/darksteel_forge.txt b/forge-gui/res/cardsfolder/d/darksteel_forge.txt index 4cf9d0d7b4e..7dda5f0135a 100644 --- a/forge-gui/res/cardsfolder/d/darksteel_forge.txt +++ b/forge-gui/res/cardsfolder/d/darksteel_forge.txt @@ -3,6 +3,6 @@ ManaCost:9 Types:Artifact S:Mode$ Continuous | Affected$ Artifact.YouCtrl | AddKeyword$ Indestructible | Description$ Artifacts you control have indestructible. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/darksteel_forge.jpg Oracle:Artifacts you control have indestructible. (Effects that say "destroy" don't destroy them. Artifact creatures with indestructible can't be destroyed by damage.) diff --git a/forge-gui/res/cardsfolder/d/darksteel_mutation.txt b/forge-gui/res/cardsfolder/d/darksteel_mutation.txt index 828ae883c12..248ebe367cc 100644 --- a/forge-gui/res/cardsfolder/d/darksteel_mutation.txt +++ b/forge-gui/res/cardsfolder/d/darksteel_mutation.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ 1 W | ValidTgts$ Creature | AILogic$ Curse S:Mode$ Continuous | Affected$ Card.EnchantedBy | SetPower$ 0 | SetToughness$ 1 | AddType$ Artifact & Creature & Insect | RemoveCreatureTypes$ True | RemoveCardTypes$ True | RemoveAllAbilities$ True | AddKeyword$ Indestructible | Description$ Enchanted creature is an Insect artifact creature with base power and toughness 0/1 and has indestructible, and it loses all other abilities, card types, and creature types. SVar:NonStackingAttachEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/darksteel_mutation.jpg Oracle:Enchant creature\nEnchanted creature is an Insect artifact creature with base power and toughness 0/1 and has indestructible, and it loses all other abilities, card types, and creature types. diff --git a/forge-gui/res/cardsfolder/d/darksteel_relic.txt b/forge-gui/res/cardsfolder/d/darksteel_relic.txt index 6fdc9267bef..3341792cce4 100644 --- a/forge-gui/res/cardsfolder/d/darksteel_relic.txt +++ b/forge-gui/res/cardsfolder/d/darksteel_relic.txt @@ -2,6 +2,6 @@ Name:Darksteel Relic ManaCost:0 Types:Artifact K:Indestructible -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/darksteel_relic.jpg Oracle:Indestructible (Effects that say "destroy" don't destroy this artifact.) diff --git a/forge-gui/res/cardsfolder/d/darkwater_catacombs.txt b/forge-gui/res/cardsfolder/d/darkwater_catacombs.txt index d07ff8acb2f..0540ea087e1 100644 --- a/forge-gui/res/cardsfolder/d/darkwater_catacombs.txt +++ b/forge-gui/res/cardsfolder/d/darkwater_catacombs.txt @@ -2,6 +2,6 @@ Name:Darkwater Catacombs ManaCost:no cost Types:Land A:AB$ Mana | Cost$ 1 T | Produced$ U B | SpellDescription$ Add {U}{B}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/darkwater_catacombs.jpg Oracle:{1}, {T}: Add {U}{B}. diff --git a/forge-gui/res/cardsfolder/d/darkwater_egg.txt b/forge-gui/res/cardsfolder/d/darkwater_egg.txt index 982085c1c53..0b5ef4943c0 100644 --- a/forge-gui/res/cardsfolder/d/darkwater_egg.txt +++ b/forge-gui/res/cardsfolder/d/darkwater_egg.txt @@ -3,7 +3,7 @@ ManaCost:1 Types:Artifact A:AB$ Mana | Cost$ 2 T Sac<1/CARDNAME> | Produced$ U B | SubAbility$ DBDraw | SpellDescription$ Add {U}{B}. Draw a card. SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/darkwater_egg.jpg Oracle:{2}, {T}, Sacrifice Darkwater Egg: Add {U}{B}. Draw a card. diff --git a/forge-gui/res/cardsfolder/d/daughter_of_autumn.txt b/forge-gui/res/cardsfolder/d/daughter_of_autumn.txt index 1263e7febd7..892fba35b48 100644 --- a/forge-gui/res/cardsfolder/d/daughter_of_autumn.txt +++ b/forge-gui/res/cardsfolder/d/daughter_of_autumn.txt @@ -5,7 +5,7 @@ PT:2/4 A:AB$ Effect | Cost$ W | Name$ Daughter of Autumn's Effect | ValidTgts$ Creature.White | TgtPrompt$ Select target white creature to redirect damage from | ReplacementEffects$ DamageEvent | SVars$ DamageEventDmg | References$ DamageEvent,DamageEventDmg | Duration$ HostLeavesOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SpellDescription$ The next 1 damage that would be dealt to target white creature this turn is dealt to CARDNAME instead. SVar:DamageEvent:Event$ DamageDone | ValidTarget$ Creature.IsRemembered | ReplaceWith$ DamageEventDmg | DamageTarget$ EffectSource | Description$ The next 1 damage that would be dealt to target white creature this turn is dealt to EFFECTSOURCE instead. SVar:DamageEventDmg:DB$ ReplaceSplitDamage | DamageTarget$ EffectSource -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/daughter_of_autumn.jpg Oracle:{W}: The next 1 damage that would be dealt to target white creature this turn is dealt to Daughter of Autumn instead. diff --git a/forge-gui/res/cardsfolder/d/dauntless_escort.txt b/forge-gui/res/cardsfolder/d/dauntless_escort.txt index c7dce1efed6..0b68c558ba3 100644 --- a/forge-gui/res/cardsfolder/d/dauntless_escort.txt +++ b/forge-gui/res/cardsfolder/d/dauntless_escort.txt @@ -3,6 +3,6 @@ ManaCost:1 G W Types:Creature Rhino Soldier PT:3/3 A:AB$ PumpAll | Cost$ Sac<1/CARDNAME> | ValidCards$ Creature.YouCtrl | KW$ Indestructible | SpellDescription$ Creatures you control gain indestructible until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dauntless_escort.jpg Oracle:Sacrifice Dauntless Escort: Creatures you control gain indestructible until end of turn. diff --git a/forge-gui/res/cardsfolder/d/dawn_of_the_dead.txt b/forge-gui/res/cardsfolder/d/dawn_of_the_dead.txt index 205f9b05dd0..cdd5ea980b8 100644 --- a/forge-gui/res/cardsfolder/d/dawn_of_the_dead.txt +++ b/forge-gui/res/cardsfolder/d/dawn_of_the_dead.txt @@ -6,7 +6,7 @@ SVar:TrigLoseLife:DB$LoseLife | Defined$ You | LifeAmount$ 1 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigChange | TriggerDescription$ At the beginning of your upkeep, you may return target creature card from your graveyard to the battlefield. That creature gains haste until end of turn. Exile it at the beginning of the next end step. SVar:TrigChange:DB$ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | SubAbility$ DBPump SVar:DBPump:DB$ Animate | Keywords$ Haste | sVars$ SneakAttackEOT | Defined$ Targeted | AtEOT$ Exile -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True SVar:Picture:http://www.wizards.com/global/images/magic/general/dawn_of_the_dead.jpg Oracle:At the beginning of your upkeep, you lose 1 life.\nAt the beginning of your upkeep, you may return target creature card from your graveyard to the battlefield. That creature gains haste until end of turn. Exile it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/d/dawnfluke.txt b/forge-gui/res/cardsfolder/d/dawnfluke.txt index d2f7bd7b084..596e419ac2f 100644 --- a/forge-gui/res/cardsfolder/d/dawnfluke.txt +++ b/forge-gui/res/cardsfolder/d/dawnfluke.txt @@ -6,7 +6,7 @@ K:Flash K:Evoke:W T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPrevent | TriggerDescription$ When CARDNAME enters the battlefield, prevent the next 3 damage that would be dealt to any target this turn. SVar:TrigPrevent:DB$ PreventDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | Amount$ 3 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:AmbushAI:True SVar:Picture:http://www.wizards.com/global/images/magic/general/dawnfluke.jpg Oracle:Flash\nWhen Dawnfluke enters the battlefield, prevent the next 3 damage that would be dealt to any target this turn.\nEvoke {W} (You may cast this spell for its evoke cost. If you do, it's sacrificed when it enters the battlefield.) diff --git a/forge-gui/res/cardsfolder/d/dawnglare_invoker.txt b/forge-gui/res/cardsfolder/d/dawnglare_invoker.txt index e1d80b3d665..63590099bd3 100644 --- a/forge-gui/res/cardsfolder/d/dawnglare_invoker.txt +++ b/forge-gui/res/cardsfolder/d/dawnglare_invoker.txt @@ -4,6 +4,6 @@ Types:Creature Kor Wizard PT:2/1 K:Flying A:AB$ TapAll | Cost$ 8 | ValidTgts$ Player | TgtPrompt$ Select target player | ValidCards$ Creature | SpellDescription$ Tap all creatures target player controls. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dawnglare_invoker.jpg Oracle:Flying\n{8}: Tap all creatures target player controls. diff --git a/forge-gui/res/cardsfolder/d/dawnray_archer.txt b/forge-gui/res/cardsfolder/d/dawnray_archer.txt index 44b6a42b57a..fada9805060 100644 --- a/forge-gui/res/cardsfolder/d/dawnray_archer.txt +++ b/forge-gui/res/cardsfolder/d/dawnray_archer.txt @@ -4,7 +4,7 @@ Types:Creature Human Archer PT:1/1 K:Exalted A:AB$ DealDamage | Cost$ W T | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target attacking or blocking creature. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$white SVar:Picture:http://www.wizards.com/global/images/magic/general/dawnray_archer.jpg Oracle:Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.)\n{W}, {T}: Dawnray Archer deals 1 damage to target attacking or blocking creature. diff --git a/forge-gui/res/cardsfolder/d/dawns_reflection.txt b/forge-gui/res/cardsfolder/d/dawns_reflection.txt index e731d1bb252..e5b361853c1 100644 --- a/forge-gui/res/cardsfolder/d/dawns_reflection.txt +++ b/forge-gui/res/cardsfolder/d/dawns_reflection.txt @@ -5,6 +5,6 @@ K:Enchant Land A:SP$ Attach | Cost$ 3 G | ValidTgts$ Land | TgtPrompt$ Select target land | AILogic$ Pump T:Mode$ TapsForMana | ValidCard$ Card.EnchantedBy | TriggerZones$ Battlefield | Execute$ TrigMana | Static$ True | TriggerDescription$ Whenever enchanted land is tapped for mana, its controller adds an additional two mana in any combination of colors. SVar:TrigMana:DB$ Mana | Produced$ Combo Any | Amount$ 2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dawns_reflection.jpg Oracle:Enchant land\nWhenever enchanted land is tapped for mana, its controller adds an additional two mana in any combination of colors. diff --git a/forge-gui/res/cardsfolder/d/day_of_destiny.txt b/forge-gui/res/cardsfolder/d/day_of_destiny.txt index e81922b2478..c52df17f7b2 100644 --- a/forge-gui/res/cardsfolder/d/day_of_destiny.txt +++ b/forge-gui/res/cardsfolder/d/day_of_destiny.txt @@ -2,7 +2,7 @@ Name:Day of Destiny ManaCost:3 W Types:Legendary Enchantment S:Mode$ Continuous | Affected$ Creature.Legendary+YouCtrl | AddPower$ 2 | AddToughness$ 2 | Description$ Legendary creatures you control get +2/+2. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:PlayMain1:TRUE DeckHints:Type$Legendary SVar:Picture:http://www.wizards.com/global/images/magic/general/day_of_destiny.jpg diff --git a/forge-gui/res/cardsfolder/d/days_undoing.txt b/forge-gui/res/cardsfolder/d/days_undoing.txt index 3f1c71c32f9..bb1483079ba 100644 --- a/forge-gui/res/cardsfolder/d/days_undoing.txt +++ b/forge-gui/res/cardsfolder/d/days_undoing.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ ChangeZoneAll | Cost$ 2 U | ChangeType$ Card | Origin$ Hand,Graveyard | Destination$ Library | Shuffle$ True | Random$ True | SubAbility$ DBDraw | UseAllOriginZones$ True | SpellDescription$ Each player shuffles their graveyard and hand into their library, then draws seven cards. If it's your turn, end the turn. (Exile all spells and abilities on the stack, including this card. Discard down to your maximum hand size. Damage wears off, and "this turn" and "until end of turn" effects end.) SVar:DBDraw:DB$ Draw | NumCards$ 7 | Defined$ Player | SubAbility$ DBEnd SVar:DBEnd:DB$ EndTurn | ConditionPlayerTurn$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/days_undoing.jpg Oracle:Each player shuffles their graveyard and hand into their library, then draws seven cards. If it's your turn, end the turn. (Exile all spells and abilities on the stack, including this card. Discard down to your maximum hand size. Damage wears off, and "this turn" and "until end of turn" effects end.) \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/d/dazzling_reflection.txt b/forge-gui/res/cardsfolder/d/dazzling_reflection.txt index 849f93225ee..7a65fded79b 100644 --- a/forge-gui/res/cardsfolder/d/dazzling_reflection.txt +++ b/forge-gui/res/cardsfolder/d/dazzling_reflection.txt @@ -8,7 +8,7 @@ SVar:DBEffect:DB$ Effect | Name$ Dazzling Reflection Effect | ReplacementEffects SVar:Dazzle:Event$ DamageDone | ValidSource$ Card.IsImprinted | ReplaceWith$ ExileEffect | PreventionEffect$ True | Description$ The next time the targeted creature would deal damage this turn, prevent that damage. SVar:OutOfSight:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Creature.IsImprinted | Execute$ ExileEffect | Static$ True SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHas:Ability$LifeGain SVar:Picture:http://www.wizards.com/global/images/magic/general/dazzling_reflection.jpg Oracle:You gain life equal to target creature's power. The next time that creature would deal damage this turn, prevent that damage. diff --git a/forge-gui/res/cardsfolder/d/dead_iron_sledge.txt b/forge-gui/res/cardsfolder/d/dead_iron_sledge.txt index 97b0c929582..0c3a12c0514 100644 --- a/forge-gui/res/cardsfolder/d/dead_iron_sledge.txt +++ b/forge-gui/res/cardsfolder/d/dead_iron_sledge.txt @@ -6,7 +6,7 @@ T:Mode$ AttackerBlockedByCreature | ValidCard$ Creature | ValidBlocker$ Creature T:Mode$ AttackerBlockedByCreature | ValidCard$ Creature.AttachedBy | ValidBlocker$ Creature | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Whenever equipped creature blocks or becomes blocked by a creature, destroy both creatures. SVar:TrigDestroy:DB$Destroy | Defined$ TriggeredAttacker | SubAbility$ DBDestroy SVar:DBDestroy:DB$Destroy | Defined$ TriggeredBlocker -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingAttachEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/dead_iron_sledge.jpg Oracle:Whenever equipped creature blocks or becomes blocked by a creature, destroy both creatures.\nEquip {2} ({2}: Attach to target creature you control. Equip only as a sorcery. This card enters the battlefield unattached and stays on the battlefield if the creature leaves.) diff --git a/forge-gui/res/cardsfolder/d/dead_reckoning.txt b/forge-gui/res/cardsfolder/d/dead_reckoning.txt index 39d0946a43b..546a79ec099 100644 --- a/forge-gui/res/cardsfolder/d/dead_reckoning.txt +++ b/forge-gui/res/cardsfolder/d/dead_reckoning.txt @@ -6,6 +6,6 @@ SVar:DBDamage:DB$ DealDamage | NumDmg$ X | ValidTgts$ Creature | TgtPrompt$ Sele SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$CardPower SVar:Y:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dead_reckoning.jpg Oracle:You may put target creature card from your graveyard on top of your library. If you do, Dead Reckoning deals damage equal to that card's power to target creature. diff --git a/forge-gui/res/cardsfolder/d/dead_ringers.txt b/forge-gui/res/cardsfolder/d/dead_ringers.txt index 586c1f8da10..6c1e8b375c8 100644 --- a/forge-gui/res/cardsfolder/d/dead_ringers.txt +++ b/forge-gui/res/cardsfolder/d/dead_ringers.txt @@ -3,6 +3,6 @@ ManaCost:4 B Types:Sorcery A:SP$ Destroy | Cost$ 4 B | TargetMin$ 2 | TargetMax$ 2 | NoRegen$ True | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creatures | RememberOriginalTargets$ True | SubAbility$ DBCleanup | ConditionShareAllColors$ DirectRemembered | SpellDescription$ Destroy two target nonblack creatures unless either one is a color the other isn't. They can't be regenerated. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dead_ringers.jpg Oracle:Destroy two target nonblack creatures unless either one is a color the other isn't. They can't be regenerated. diff --git a/forge-gui/res/cardsfolder/d/deadapult.txt b/forge-gui/res/cardsfolder/d/deadapult.txt index 9963787fe32..98b6b1b0d9e 100644 --- a/forge-gui/res/cardsfolder/d/deadapult.txt +++ b/forge-gui/res/cardsfolder/d/deadapult.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Enchantment A:AB$ DealDamage | Cost$ R Sac<1/Zombie> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to any target. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/deadapult.jpg Oracle:{R}, Sacrifice a Zombie: Deadapult deals 2 damage to any target. diff --git a/forge-gui/res/cardsfolder/d/deadfall.txt b/forge-gui/res/cardsfolder/d/deadfall.txt index c5c2c9181d5..e5377b1cf47 100644 --- a/forge-gui/res/cardsfolder/d/deadfall.txt +++ b/forge-gui/res/cardsfolder/d/deadfall.txt @@ -3,6 +3,6 @@ ManaCost:2 G Types:Enchantment S:Mode$ Continuous | Affected$ Creature.withForestwalk | AddHiddenKeyword$ May be blocked as though it doesn't have Forestwalk. | Description$ Creatures with forestwalk can be blocked as though they didn't have forestwalk. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/deadfall.jpg Oracle:Creatures with forestwalk can be blocked as though they didn't have forestwalk. diff --git a/forge-gui/res/cardsfolder/d/deadly_tempest.txt b/forge-gui/res/cardsfolder/d/deadly_tempest.txt index 93f1ad29bea..9607b9e6a79 100644 --- a/forge-gui/res/cardsfolder/d/deadly_tempest.txt +++ b/forge-gui/res/cardsfolder/d/deadly_tempest.txt @@ -6,6 +6,6 @@ SVar:DBRepeat:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBLoseL SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ X | References$ X | Defined$ Player.IsRemembered SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:RememberedLKI$FilterControlledByRemembered_Number$1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/deadly_tempest.jpg Oracle:Destroy all creatures. Each player loses life equal to the number of creatures they controlled that were destroyed this way. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/d/deadly_wanderings.txt b/forge-gui/res/cardsfolder/d/deadly_wanderings.txt index 81f99a04b23..f91ac41fe44 100644 --- a/forge-gui/res/cardsfolder/d/deadly_wanderings.txt +++ b/forge-gui/res/cardsfolder/d/deadly_wanderings.txt @@ -3,7 +3,7 @@ ManaCost:3 B B Types:Enchantment S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddPower$ 2 | AddKeyword$ Deathtouch & Lifelink | CheckSVar$ X | SVarCompare$ EQ1 | Description$ As long as you control exactly one creature, that creature gets +2/+0 and has deathtouch and lifelink. SVar:X:Count$Valid Creature.YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/deadly_wanderings.jpg Oracle:As long as you control exactly one creature, that creature gets +2/+0 and has deathtouch and lifelink. diff --git a/forge-gui/res/cardsfolder/d/deadshot.txt b/forge-gui/res/cardsfolder/d/deadshot.txt index 84eafc14689..01b64caf65d 100644 --- a/forge-gui/res/cardsfolder/d/deadshot.txt +++ b/forge-gui/res/cardsfolder/d/deadshot.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ Tap | Cost$ 3 R | ValidTgts$ Creature | TgtPrompt$ Select target creature to tap | SubAbility$ DBDamage | SpellDescription$ Tap target creature. It deals damage equal to its power to another target creature. SVar:DBDamage:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select another target creature to be dealt damage | DamageSource$ ParentTarget | NumDmg$ X | TargetUnique$ True | References$ X SVar:X:ParentTargeted$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/deadshot.jpg Oracle:Tap target creature. It deals damage equal to its power to another target creature. diff --git a/forge-gui/res/cardsfolder/d/death_bomb.txt b/forge-gui/res/cardsfolder/d/death_bomb.txt index dcbbde18a67..0b6a0196ea2 100644 --- a/forge-gui/res/cardsfolder/d/death_bomb.txt +++ b/forge-gui/res/cardsfolder/d/death_bomb.txt @@ -3,6 +3,6 @@ ManaCost:3 B Types:Instant A:SP$ Destroy | Cost$ 3 B Sac<1/Creature> | ValidTgts$ Creature.nonBlack | NoRegen$ True | TgtPrompt$ Select target nonblack creature | SubAbility$ DBDrain | SpellDescription$ Destroy target nonblack creature. It can't be regenerated. Its controller loses 2 life. SVar:DBDrain:DB$LoseLife | Defined$ TargetedController | LifeAmount$ 2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/death_bomb.jpg Oracle:As an additional cost to cast Death Bomb, sacrifice a creature.\nDestroy target nonblack creature. It can't be regenerated. Its controller loses 2 life. diff --git a/forge-gui/res/cardsfolder/d/death_cloud.txt b/forge-gui/res/cardsfolder/d/death_cloud.txt index c7f78139fc2..3160cbd6acb 100644 --- a/forge-gui/res/cardsfolder/d/death_cloud.txt +++ b/forge-gui/res/cardsfolder/d/death_cloud.txt @@ -6,6 +6,6 @@ SVar:DBDiscard:DB$Discard | NumCards$ X | Mode$ TgtChoose | Defined$ Player | Su SVar:DBSacCreature:DB$Sacrifice | Amount$ X | SacValid$ Creature | Defined$ Player | SubAbility$ DBSacLand | References$ X SVar:DBSacLand:DB$Sacrifice | Amount$ X | SacValid$ Land | Defined$ Player | References$ X SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/death_cloud.jpg Oracle:Each player loses X life, discards X cards, sacrifices X creatures, then sacrifices X lands. diff --git a/forge-gui/res/cardsfolder/d/death_mask_duplicant.txt b/forge-gui/res/cardsfolder/d/death_mask_duplicant.txt index 2c5e5d56b07..ea93024741e 100644 --- a/forge-gui/res/cardsfolder/d/death_mask_duplicant.txt +++ b/forge-gui/res/cardsfolder/d/death_mask_duplicant.txt @@ -8,6 +8,6 @@ T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCar SVar:DBForget:DB$ Pump | ForgetImprinted$ TriggeredCard T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Any | Execute$ TrigForget | Static$ True SVar:TrigForget:DB$ Cleanup | ClearImprinted$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/death_mask_duplicant.jpg Oracle:Imprint — {1}: Exile target creature card from your graveyard.\nAs long as a card exiled with Death-Mask Duplicant has flying, Death-Mask Duplicant has flying. The same is true for fear, first strike, double strike, haste, landwalk, protection, and trample. diff --git a/forge-gui/res/cardsfolder/d/death_match.txt b/forge-gui/res/cardsfolder/d/death_match.txt index 92dc8306659..0ca35b89153 100644 --- a/forge-gui/res/cardsfolder/d/death_match.txt +++ b/forge-gui/res/cardsfolder/d/death_match.txt @@ -3,6 +3,6 @@ ManaCost:3 B Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigPump | OptionalDecider$ TriggeredCardController | TriggerDescription$ Whenever a creature enters the battlefield, that creature's controller may have target creature of their choice get -3/-3 until end of turn. SVar:TrigPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -3 | NumDef$ -3 | IsCurse$ True | TargetingPlayer$ TriggeredCardController -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/death_match.jpg Oracle:Whenever a creature enters the battlefield, that creature's controller may have target creature of their choice get -3/-3 until end of turn. diff --git a/forge-gui/res/cardsfolder/d/death_pit_offering.txt b/forge-gui/res/cardsfolder/d/death_pit_offering.txt index 9f549689a93..a2ab812bff8 100644 --- a/forge-gui/res/cardsfolder/d/death_pit_offering.txt +++ b/forge-gui/res/cardsfolder/d/death_pit_offering.txt @@ -4,6 +4,6 @@ Types:Enchantment S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddPower$ 2 | AddToughness$ 2 | Description$ Creatures you control get +2/+2. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME enters the battlefield, sacrifice all creatures you control. SVar:TrigSac:DB$ SacrificeAll | ValidCards$ Creature.YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/death_pit_offering.jpg Oracle:When Death Pit Offering enters the battlefield, sacrifice all creatures you control.\nCreatures you control get +2/+2. diff --git a/forge-gui/res/cardsfolder/d/death_pits_of_rath.txt b/forge-gui/res/cardsfolder/d/death_pits_of_rath.txt index a33bf0115ca..9eaa2b8f5c8 100644 --- a/forge-gui/res/cardsfolder/d/death_pits_of_rath.txt +++ b/forge-gui/res/cardsfolder/d/death_pits_of_rath.txt @@ -6,6 +6,6 @@ SVar:DeathDestroy:SVar:DestroyWhenDamaged:True T:Mode$ DamageDoneOnce | ValidTarget$ Creature | Execute$ TrigDestroy | TriggerZones$ Battlefield | TriggerDescription$ Whenever a creature is dealt damage, destroy it. It can't be regenerated. SVar:TrigDestroy:DB$ Destroy | Defined$ TriggeredTarget | NoRegen$ True SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/death_pits_of_rath.jpg Oracle:Whenever a creature is dealt damage, destroy it. It can't be regenerated. diff --git a/forge-gui/res/cardsfolder/d/death_wish.txt b/forge-gui/res/cardsfolder/d/death_wish.txt index 6755b5419f9..3cae9ac46a4 100644 --- a/forge-gui/res/cardsfolder/d/death_wish.txt +++ b/forge-gui/res/cardsfolder/d/death_wish.txt @@ -5,6 +5,6 @@ A:SP$ ChangeZone | Cost$ 1 B B | Origin$ Sideboard | Destination$ Hand | ChangeT SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ X | References$ X | SubAbility$ DBChange SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile SVar:X:Count$YourLifeTotal/HalfUp -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/death_wish.jpg Oracle:You may choose a card you own from outside the game and put it into your hand. You lose half your life, rounded up. Exile Death Wish. diff --git a/forge-gui/res/cardsfolder/d/deathbringer_regent.txt b/forge-gui/res/cardsfolder/d/deathbringer_regent.txt index 2167fab1374..c6e1858ea4d 100644 --- a/forge-gui/res/cardsfolder/d/deathbringer_regent.txt +++ b/forge-gui/res/cardsfolder/d/deathbringer_regent.txt @@ -6,6 +6,6 @@ K:Flying T:Mode$ ChangesZone | ValidCard$ Card.wasCastFromHand+Self | CheckSVar$ X | SVarCompare$ GE5 | Destination$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it from your hand and there are five or more other creatures on the battlefield, destroy all other creatures. SVar:TrigDestroy:DB$ DestroyAll | ValidCards$ Creature.Other SVar:X:Count$Valid Creature.Other -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/deathbringer_regent.jpg Oracle:Flying\nWhen Deathbringer Regent enters the battlefield, if you cast it from your hand and there are five or more other creatures on the battlefield, destroy all other creatures. diff --git a/forge-gui/res/cardsfolder/d/deathgrip.txt b/forge-gui/res/cardsfolder/d/deathgrip.txt index 06549f9543f..dd8290c4f56 100644 --- a/forge-gui/res/cardsfolder/d/deathgrip.txt +++ b/forge-gui/res/cardsfolder/d/deathgrip.txt @@ -3,6 +3,6 @@ ManaCost:B B Types:Enchantment A:AB$ Counter | Cost$ B B | TargetType$ Spell | TgtPrompt$ Select target Green Spell | ValidTgts$ Card.Green | SpellDescription$ Counter target green spell. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/deathgrip.jpg Oracle:{B}{B}: Counter target green spell. diff --git a/forge-gui/res/cardsfolder/d/deathknell_kami.txt b/forge-gui/res/cardsfolder/d/deathknell_kami.txt index 0132e218efc..118b418c2e2 100644 --- a/forge-gui/res/cardsfolder/d/deathknell_kami.txt +++ b/forge-gui/res/cardsfolder/d/deathknell_kami.txt @@ -5,6 +5,6 @@ PT:0/1 K:Flying K:Soulshift:1 A:AB$ Pump | Cost$ 2 | NumAtt$ +1 | NumDef$ +1 | AtEOT$ Sacrifice | SpellDescription$ CARDNAME gets +1/+1 until end of turn. Sacrifice it at the beginning of the next end step. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/deathknell_kami.jpg Oracle:Flying\n{2}: Deathknell Kami gets +1/+1 until end of turn. Sacrifice it at the beginning of the next end step.\nSoulshift 1 (When this creature dies, you may return target Spirit card with converted mana cost 1 or less from your graveyard to your hand.) diff --git a/forge-gui/res/cardsfolder/d/deathlace.txt b/forge-gui/res/cardsfolder/d/deathlace.txt index 411ffced085..4694f14af75 100644 --- a/forge-gui/res/cardsfolder/d/deathlace.txt +++ b/forge-gui/res/cardsfolder/d/deathlace.txt @@ -2,7 +2,7 @@ Name:Deathlace ManaCost:B Types:Instant A:SP$ Animate | Cost$ B | Colors$ Black | OverwriteColors$ True | ValidTgts$ Card | TgtZone$ Stack,Battlefield | Permanent$ True | SpellDescription$ Target spell or permanent becomes black. (Mana symbols on that permanent remain unchanged.) -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/deathlace.jpg Oracle:Target spell or permanent becomes black. (Mana symbols on that permanent remain unchanged.) diff --git a/forge-gui/res/cardsfolder/d/deathmark_prelate.txt b/forge-gui/res/cardsfolder/d/deathmark_prelate.txt index 4730171f6a2..8a5e7dc2f14 100644 --- a/forge-gui/res/cardsfolder/d/deathmark_prelate.txt +++ b/forge-gui/res/cardsfolder/d/deathmark_prelate.txt @@ -3,6 +3,6 @@ ManaCost:3 B Types:Creature Human Cleric PT:2/3 A:AB$ Destroy | Cost$ 2 B T Sac<1/Zombie> | ValidTgts$ Creature.nonZombie | TgtPrompt$ Select target non-Zombie creature | SorcerySpeed$ True | NoRegen$ True | SpellDescription$ Destroy target non-Zombie creature. It can't be regenerated. Activate this ability only any time you could cast a sorcery. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/deathmark_prelate.jpg Oracle:{2}{B}, {T}, Sacrifice a Zombie: Destroy target non-Zombie creature. It can't be regenerated. Activate this ability only any time you could cast a sorcery. diff --git a/forge-gui/res/cardsfolder/d/deaths_head_buzzard.txt b/forge-gui/res/cardsfolder/d/deaths_head_buzzard.txt index 6259aa33242..69050002ec5 100644 --- a/forge-gui/res/cardsfolder/d/deaths_head_buzzard.txt +++ b/forge-gui/res/cardsfolder/d/deaths_head_buzzard.txt @@ -5,6 +5,6 @@ PT:2/1 K:Flying T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigPumpAll | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, all creatures get -1/-1 until end of turn. SVar:TrigPumpAll:DB$PumpAll | ValidCards$ Creature | NumAtt$ -1 | NumDef$ -1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/deaths_head_buzzard.jpg Oracle:Flying\nWhen Death's-Head Buzzard dies, all creatures get -1/-1 until end of turn. diff --git a/forge-gui/res/cardsfolder/d/debt_of_loyalty.txt b/forge-gui/res/cardsfolder/d/debt_of_loyalty.txt index 617a42929ae..25821a5befd 100644 --- a/forge-gui/res/cardsfolder/d/debt_of_loyalty.txt +++ b/forge-gui/res/cardsfolder/d/debt_of_loyalty.txt @@ -3,6 +3,6 @@ ManaCost:1 W W Types:Instant A:SP$ Regenerate | Cost$ 1 W W | ValidTgts$ Creature | TgtPrompt$ Select target creature | RegenerationTrigger$ TrigGainControl | References$ TrigGainControl | SpellDescription$ Regenerate target creature. You gain control of that creature if it regenerates this way. SVar:TrigGainControl:ST$ GainControl | Cost$ 0 | Defined$ TriggeredCard | NewController$ You | SpellDescription$ Source controller gains control of CARDNAME if it regenerates this way. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/debt_of_loyalty.jpg Oracle:Regenerate target creature. You gain control of that creature if it regenerates this way. diff --git a/forge-gui/res/cardsfolder/d/decaying_soil.txt b/forge-gui/res/cardsfolder/d/decaying_soil.txt index 25b4f656616..f63c89a19ec 100644 --- a/forge-gui/res/cardsfolder/d/decaying_soil.txt +++ b/forge-gui/res/cardsfolder/d/decaying_soil.txt @@ -6,6 +6,6 @@ SVar:TrigExile:DB$ ChangeZone | Hidden$ True | Mandatory$ True | ChangeType$ Car S:Mode$ Continuous | Affected$ Card.Self | AddTrigger$ TrigDies | AddAbility$ TrigReturn | Condition$ Threshold | Description$ Threshold — As long as seven or more cards are in your graveyard, CARDNAME has "Whenever a nontoken creature is put into your graveyard from the battlefield, you may pay {1}. If you do, return that card to your hand." SVar:TrigDies:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.nonToken+YouOwn | Execute$ TrigReturn | TriggerZones$ Battlefield | TriggerDescription$ "Whenever a nontoken creature is put into your graveyard from the battlefield, you may pay {1}. If you do, return that card to your hand." SVar:TrigReturn:AB$ ChangeZone | Cost$ 1 | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Hand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/decaying_soil.jpg Oracle:At the beginning of your upkeep, exile a card from your graveyard.\nThreshold — As long as seven or more cards are in your graveyard, Decaying Soil has "Whenever a nontoken creature is put into your graveyard from the battlefield, you may pay {1}. If you do, return that card to your hand." diff --git a/forge-gui/res/cardsfolder/d/deceiver_of_form.txt b/forge-gui/res/cardsfolder/d/deceiver_of_form.txt index 79d6564a601..04e01c87a19 100644 --- a/forge-gui/res/cardsfolder/d/deceiver_of_form.txt +++ b/forge-gui/res/cardsfolder/d/deceiver_of_form.txt @@ -10,7 +10,7 @@ SVar:DBCopy:DB$ Clone | Defined$ Remembered | CloneTarget$ Imprinted | Duration$ SVar:DBNoop:DB$ Cleanup | SpellDescription$ Do nothing. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True | SpellDescription$ Do nothing. | SubAbility$ FakeScry SVar:FakeScry:DB$ Dig | DigNum$ 1 | AnyNumber$ True | DestinationZone$ Library | LibraryPosition2$ 0 -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckNeeds:Ability$Mana.Colorless SVar:Picture:http://www.wizards.com/global/images/magic/general/deceiver_of_form.jpg Oracle:At the beginning of combat on your turn, reveal the top card of your library. If a creature card is revealed this way, you may have creatures you control other than Deceiver of Form become copies of that card until end of turn. You may put that card on the bottom of your library. diff --git a/forge-gui/res/cardsfolder/d/declaration_of_naught.txt b/forge-gui/res/cardsfolder/d/declaration_of_naught.txt index c7a633470f3..9a6ac1a5530 100644 --- a/forge-gui/res/cardsfolder/d/declaration_of_naught.txt +++ b/forge-gui/res/cardsfolder/d/declaration_of_naught.txt @@ -4,6 +4,6 @@ Types:Enchantment K:ETBReplacement:Other:DBNameCard SVar:DBNameCard:DB$ NameCard | Defined$ You | SpellDescription$ As CARDNAME enters the battlefield, choose a card name. A:AB$ Counter | Cost$ U | TargetType$ Spell | TgtPrompt$ Select target spell with the chosen name. | ValidTgts$ Card.NamedCard | SpellDescription$ Counter target spell with the chosen name. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/declaration_of_naught.jpg Oracle:As Declaration of Naught enters the battlefield, choose a card name.\n{U}: Counter target spell with the chosen name. diff --git a/forge-gui/res/cardsfolder/d/decompose.txt b/forge-gui/res/cardsfolder/d/decompose.txt index 99121865fd4..d6fad503507 100644 --- a/forge-gui/res/cardsfolder/d/decompose.txt +++ b/forge-gui/res/cardsfolder/d/decompose.txt @@ -2,6 +2,6 @@ Name:Decompose ManaCost:1 B Types:Sorcery A:SP$ ChangeZone | Cost$ 1 B | TargetMin$ 0 | TargetMax$ 3 | TargetsFromSingleZone$ True | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SpellDescription$ Exile up to three target cards from a single graveyard. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/decompose.jpg Oracle:Exile up to three target cards from a single graveyard. diff --git a/forge-gui/res/cardsfolder/d/decomposition.txt b/forge-gui/res/cardsfolder/d/decomposition.txt index 11ed23815ce..6eddeeada12 100644 --- a/forge-gui/res/cardsfolder/d/decomposition.txt +++ b/forge-gui/res/cardsfolder/d/decomposition.txt @@ -6,6 +6,6 @@ A:SP$ Attach | Cost$ 1 G | ValidTgts$ Creature.Black | AILogic$ Curse S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Cumulative upkeep:PayLife<1>:Pay 1 life. | Description$ Enchanted creature has "Cumulative upkeep—Pay 1 life." (At the beginning of its controller's upkeep, that player puts an age counter on it, then sacrifices it unless they pay its upkeep cost for each age counter on it.) T:Mode$ ChangesZone | ValidCard$ Card.AttachedBy | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigLose | TriggerDescription$ When enchanted creature dies, its controller loses 2 life. SVar:TrigLose:DB$ LoseLife | Defined$ TriggeredCardController | LifeAmount$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/decomposition.jpg Oracle:Enchant black creature\nEnchanted creature has "Cumulative upkeep—Pay 1 life." (At the beginning of its controller's upkeep, that player puts an age counter on it, then sacrifices it unless they pay its upkeep cost for each age counter on it.)\nWhen enchanted creature dies, its controller loses 2 life. diff --git a/forge-gui/res/cardsfolder/d/decree_of_annihilation.txt b/forge-gui/res/cardsfolder/d/decree_of_annihilation.txt index 7e7a1480f9d..b5f6b91f13d 100644 --- a/forge-gui/res/cardsfolder/d/decree_of_annihilation.txt +++ b/forge-gui/res/cardsfolder/d/decree_of_annihilation.txt @@ -7,6 +7,6 @@ T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigDestroyAll | TriggerDescrip SVar:DBExileHand:DB$ChangeZoneAll | ChangeType$ Card | Origin$ Hand | Destination$ Exile | SubAbility$ DBExileGraveyard SVar:DBExileGraveyard:DB$ChangeZoneAll | ChangeType$ Card | Origin$ Graveyard | Destination$ Exile SVar:TrigDestroyAll:DB$DestroyAll | ValidCards$ Land | SpellDescription$ Destroy all lands. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/decree_of_annihilation.jpg Oracle:Exile all artifacts, creatures, and lands from the battlefield, all cards from all graveyards, and all cards from all hands.\nCycling {5}{R}{R} ({5}{R}{R}, Discard this card: Draw a card.)\nWhen you cycle Decree of Annihilation, destroy all lands. diff --git a/forge-gui/res/cardsfolder/d/decree_of_justice.txt b/forge-gui/res/cardsfolder/d/decree_of_justice.txt index 425ccf6869b..b111d7d9bd1 100644 --- a/forge-gui/res/cardsfolder/d/decree_of_justice.txt +++ b/forge-gui/res/cardsfolder/d/decree_of_justice.txt @@ -7,6 +7,6 @@ T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigToken | OptionalDecider$ Yo SVar:TrigToken:AB$ Token | Cost$ X | TokenAmount$ X | TokenName$ Soldier | TokenTypes$ Creature,Soldier | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | References$ X SVar:X:Count$xPaid SVar:PlayMain1:ALWAYS -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/decree_of_justice.jpg Oracle:Create X 4/4 white Angel creature tokens with flying.\nCycling {2}{W} ({2}{W}, Discard this card: Draw a card.)\nWhen you cycle Decree of Justice, you may pay {X}. If you do, create X 1/1 white Soldier creature tokens. diff --git a/forge-gui/res/cardsfolder/d/decree_of_pain.txt b/forge-gui/res/cardsfolder/d/decree_of_pain.txt index 6c0286a33c2..fe780236ce8 100644 --- a/forge-gui/res/cardsfolder/d/decree_of_pain.txt +++ b/forge-gui/res/cardsfolder/d/decree_of_pain.txt @@ -8,6 +8,6 @@ T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescriptio SVar:TrigPumpAll:DB$ PumpAll | NumAtt$ -2 | NumDef$ -2 | ValidCards$ Creature SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DecreeX:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/decree_of_pain.jpg Oracle:Destroy all creatures. They can't be regenerated. Draw a card for each creature destroyed this way.\nCycling {3}{B}{B} ({3}{B}{B}, Discard this card: Draw a card.)\nWhen you cycle Decree of Pain, all creatures get -2/-2 until end of turn. diff --git a/forge-gui/res/cardsfolder/d/decree_of_silence.txt b/forge-gui/res/cardsfolder/d/decree_of_silence.txt index 9c78b917f28..0ec6ab684c8 100644 --- a/forge-gui/res/cardsfolder/d/decree_of_silence.txt +++ b/forge-gui/res/cardsfolder/d/decree_of_silence.txt @@ -10,6 +10,6 @@ T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigCounter | OptionalDecider$ SVar:TrigCounter:DB$ Counter | TargetType$ Spell | ValidTgts$ Card SVar:DecreeX:Count$Valid Card.Self+counters_GE3_DEPLETION #TODO: The AI currently won't use cycling to counter the spell. That could be improved. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/decree_of_silence.jpg Oracle:Whenever an opponent casts a spell, counter that spell and put a depletion counter on Decree of Silence. If there are three or more depletion counters on Decree of Silence, sacrifice it.\nCycling {4}{U}{U} ({4}{U}{U}, Discard this card: Draw a card.)\nWhen you cycle Decree of Silence, you may counter target spell. diff --git a/forge-gui/res/cardsfolder/d/deep_slumber_titan.txt b/forge-gui/res/cardsfolder/d/deep_slumber_titan.txt index dede03ee4fa..c4c32fb2132 100644 --- a/forge-gui/res/cardsfolder/d/deep_slumber_titan.txt +++ b/forge-gui/res/cardsfolder/d/deep_slumber_titan.txt @@ -6,6 +6,6 @@ K:CARDNAME enters the battlefield tapped. K:CARDNAME doesn't untap during your untap step. T:Mode$ DamageDoneOnce | ValidTarget$ Card.Self | Execute$ TrigUntap | TriggerDescription$ Whenever CARDNAME is dealt damage, untap it. SVar:TrigUntap:DB$ Untap | Defined$ Self -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/deep_slumber_titan.jpg Oracle:Deep-Slumber Titan enters the battlefield tapped.\nDeep-Slumber Titan doesn't untap during your untap step.\nWhenever Deep-Slumber Titan is dealt damage, untap it. diff --git a/forge-gui/res/cardsfolder/d/deep_water.txt b/forge-gui/res/cardsfolder/d/deep_water.txt index b915f835d54..7aeeaa6a777 100644 --- a/forge-gui/res/cardsfolder/d/deep_water.txt +++ b/forge-gui/res/cardsfolder/d/deep_water.txt @@ -4,7 +4,7 @@ Types:Enchantment A:AB$ Effect | Cost$ U | ReplacementEffects$ ReplaceU | SVars$ ProduceU | SpellDescription$ Until end of turn, if you tap a land you control for mana, it produces {U} instead of any other type. SVar:ReplaceU:Event$ ProduceMana | ActiveZones$ Command | ValidCard$ Land.YouCtrl | ManaReplacement$ ProduceU | Description$ If you tap a land you control for mana, it produces U instead of any other type. SVar:ProduceU:C->U & B->U & R->U & G->U & W->U -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/deep_water.jpg Oracle:{U}: Until end of turn, if you tap a land you control for mana, it produces {U} instead of any other type. diff --git a/forge-gui/res/cardsfolder/d/deepfire_elemental.txt b/forge-gui/res/cardsfolder/d/deepfire_elemental.txt index 43991466cce..7810c0855fb 100644 --- a/forge-gui/res/cardsfolder/d/deepfire_elemental.txt +++ b/forge-gui/res/cardsfolder/d/deepfire_elemental.txt @@ -5,6 +5,6 @@ PT:4/4 A:AB$ Destroy | Cost$ X X 1 | ValidTgts$ Artifact,Creature | TgtPrompt$ Select target artifact or creature | References$ X | AILogic$ AtOpponentsCombatOrAfter | SpellDescription$ Destroy target artifact or creature with converted mana cost X. # It may seem wrong to not use X in the target, but since the Target is what defines X, it's redundant (and not supported by the code) SVar:X:Targeted$CardManaCost -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/deepfire_elemental.jpg Oracle:{X}{X}{1}: Destroy target artifact or creature with converted mana cost X. diff --git a/forge-gui/res/cardsfolder/d/deeproot_waters.txt b/forge-gui/res/cardsfolder/d/deeproot_waters.txt index 2077a6b561e..294392fa8f6 100644 --- a/forge-gui/res/cardsfolder/d/deeproot_waters.txt +++ b/forge-gui/res/cardsfolder/d/deeproot_waters.txt @@ -4,7 +4,7 @@ Types:Enchantment T:Mode$ SpellCast | ValidCard$ Merfolk | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you cast a Merfolk spell, create a 1/1 blue Merfolk creature token with hexproof. (A creature with hexproof can't be the target of spells or abilities your opponents control.) SVar:TrigToken:DB$ Token | TokenImage$ u 1 1 merfolk XLN | TokenAmount$ 1 | TokenName$ Merfolk | TokenTypes$ Creature,Merfolk | TokenOwner$ You | TokenColors$ Blue | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Hexproof DeckHas:Ability$Token -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Merfolk SVar:Picture:http://www.wizards.com/global/images/magic/general/deeproot_waters.jpg Oracle:Whenever you cast a Merfolk spell, create a 1/1 blue Merfolk creature token with hexproof. (A creature with hexproof can't be the target of spells or abilities your opponents control.) diff --git a/forge-gui/res/cardsfolder/d/deepwood_elder.txt b/forge-gui/res/cardsfolder/d/deepwood_elder.txt index cca7bb4a639..b4506f45d88 100644 --- a/forge-gui/res/cardsfolder/d/deepwood_elder.txt +++ b/forge-gui/res/cardsfolder/d/deepwood_elder.txt @@ -4,9 +4,9 @@ Types:Creature Dryad Spellshaper PT:2/2 A:AB$ Animate | Cost$ X G G T Discard<1/Card> | TargetMin$ 0 | TargetMax$ Maxtgt | ValidTgts$ Land | TgtPrompt$ Select target land to become forest | Types$ Forest | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | References$ MaxTgt | SpellDescription$ X target lands become Forests until end of turn. SVar:X:TargetedObjects$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Maxtgt:Count$Valid Land -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/deepwood_elder.jpg Oracle:{X}{G}{G}, {T}, Discard a card: X target lands become Forests until end of turn. diff --git a/forge-gui/res/cardsfolder/d/defense_grid.txt b/forge-gui/res/cardsfolder/d/defense_grid.txt index 81dfc3151cd..067725116f4 100644 --- a/forge-gui/res/cardsfolder/d/defense_grid.txt +++ b/forge-gui/res/cardsfolder/d/defense_grid.txt @@ -2,6 +2,6 @@ Name:Defense Grid ManaCost:2 Types:Artifact S:Mode$ RaiseCost | Activator$ Player | Type$ Spell | Amount$ 3 | NonActivatorTurn$ True | Description$ Each spell costs {3} more to cast except during its controller's turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/defense_grid.jpg Oracle:Each spell costs {3} more to cast except during its controller's turn. diff --git a/forge-gui/res/cardsfolder/d/defensive_formation.txt b/forge-gui/res/cardsfolder/d/defensive_formation.txt index 1d4ff333870..0c25dfa8ab7 100644 --- a/forge-gui/res/cardsfolder/d/defensive_formation.txt +++ b/forge-gui/res/cardsfolder/d/defensive_formation.txt @@ -3,6 +3,6 @@ ManaCost:W Types:Enchantment S:Mode$ Continuous | Affected$ You | AddKeyword$ You assign combat damage of each creature attacking you. | Description$ Rather than the attacking player, you assign the combat damage of each creature attacking you. You can divide that creature's combat damage as you choose among any of the creatures blocking it. SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/defensive_formation.jpg Oracle:Rather than the attacking player, you assign the combat damage of each creature attacking you. You can divide that creature's combat damage as you choose among any of the creatures blocking it. diff --git a/forge-gui/res/cardsfolder/d/defensive_maneuvers.txt b/forge-gui/res/cardsfolder/d/defensive_maneuvers.txt index d03bd9a12e4..08efc2de99a 100644 --- a/forge-gui/res/cardsfolder/d/defensive_maneuvers.txt +++ b/forge-gui/res/cardsfolder/d/defensive_maneuvers.txt @@ -3,6 +3,6 @@ ManaCost:3 W Types:Instant A:SP$ ChooseType | Cost$ 3 W | Defined$ You | Type$ Creature | AILogic$ MostProminentComputerControls | SubAbility$ DBPumpAll | SpellDescription$ Creatures of the creature type of your choice get +0/+4 until end of turn. SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.ChosenType | NumDef$ 4 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/defensive_maneuvers.jpg Oracle:Creatures of the creature type of your choice get +0/+4 until end of turn. diff --git a/forge-gui/res/cardsfolder/d/defensive_stance.txt b/forge-gui/res/cardsfolder/d/defensive_stance.txt index 2d114347e1f..090f805e357 100644 --- a/forge-gui/res/cardsfolder/d/defensive_stance.txt +++ b/forge-gui/res/cardsfolder/d/defensive_stance.txt @@ -4,6 +4,6 @@ Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ U | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ -1 | AddToughness$ 1 | Description$ Enchanted creature gets -1/+1. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/defensive_stance.jpg Oracle:Enchant creature\nEnchanted creature gets -1/+1. diff --git a/forge-gui/res/cardsfolder/d/defiant_stand.txt b/forge-gui/res/cardsfolder/d/defiant_stand.txt index 9d5dd317768..7b430cebf6a 100644 --- a/forge-gui/res/cardsfolder/d/defiant_stand.txt +++ b/forge-gui/res/cardsfolder/d/defiant_stand.txt @@ -3,6 +3,6 @@ ManaCost:1 W Types:Instant A:SP$ Pump | Cost$ 1 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +3 | SubAbility$ DBUntap | OpponentTurn$ True | ActivationPhases$ Declare Attackers | SpellDescription$ Cast CARDNAME only during the declare attackers step and only if you've been attacked this step. Target creature gets +1/+3 until end of turn. Untap that creature. SVar:DBUntap:DB$Untap | Defined$ Targeted -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=4380&type=card Oracle:Cast Defiant Stand only during the declare attackers step and only if you've been attacked this step.\nTarget creature gets +1/+3 until end of turn. Untap that creature. diff --git a/forge-gui/res/cardsfolder/d/deflection.txt b/forge-gui/res/cardsfolder/d/deflection.txt index 43eaa5f9aa2..8bc0cf08e64 100644 --- a/forge-gui/res/cardsfolder/d/deflection.txt +++ b/forge-gui/res/cardsfolder/d/deflection.txt @@ -2,6 +2,6 @@ Name:Deflection ManaCost:3 U Types:Instant A:SP$ ChangeTargets | Cost$ 3 U | TargetType$ Spell | ValidTgts$ Card | TargetsSingleTarget$ True | SpellDescription$ Change the target of target spell with a single target. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/deflection.jpg Oracle:Change the target of target spell with a single target. diff --git a/forge-gui/res/cardsfolder/d/deftblade_elite.txt b/forge-gui/res/cardsfolder/d/deftblade_elite.txt index 85c524a4f45..6a0c8aede7f 100644 --- a/forge-gui/res/cardsfolder/d/deftblade_elite.txt +++ b/forge-gui/res/cardsfolder/d/deftblade_elite.txt @@ -4,6 +4,6 @@ Types:Creature Human Soldier PT:1/1 K:Provoke A:AB$ Pump | Cost$ 1 W | KW$ Prevent all combat damage that would be dealt to and dealt by CARDNAME. | SpellDescription$ Prevent all combat damage that would be dealt to and dealt by CARDNAME this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/deftblade_elite.jpg Oracle:Provoke (When this attacks, you may have target creature defending player controls untap and block it if able.)\n{1}{W}: Prevent all combat damage that would be dealt to and dealt by Deftblade Elite this turn. diff --git a/forge-gui/res/cardsfolder/d/dega_sanctuary.txt b/forge-gui/res/cardsfolder/d/dega_sanctuary.txt index c844479597c..b0801aef71c 100644 --- a/forge-gui/res/cardsfolder/d/dega_sanctuary.txt +++ b/forge-gui/res/cardsfolder/d/dega_sanctuary.txt @@ -7,7 +7,7 @@ SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 4 | ConditionCheckSVar SVar:Y:Count$Valid Permanent.Black+YouCtrl/LimitMax.1 SVar:Z:Count$Valid Permanent.Red+YouCtrl/LimitMax.1 SVar:X:SVar$Y/Plus.Z -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Color$Black|Red SVar:Picture:http://wizards.com/global/images/magic/general/dega_sanctuary.jpg Oracle:At the beginning of your upkeep, if you control a black or red permanent, you gain 2 life. If you control a black permanent and a red permanent, you gain 4 life instead. diff --git a/forge-gui/res/cardsfolder/d/degavolver.txt b/forge-gui/res/cardsfolder/d/degavolver.txt index 90a364e97ff..7d10983bfde 100644 --- a/forge-gui/res/cardsfolder/d/degavolver.txt +++ b/forge-gui/res/cardsfolder/d/degavolver.txt @@ -10,7 +10,7 @@ SVar:VolverResilience:DB$ Animate | Defined$ Self | Abilities$ ABRegen | Permane SVar:ABRegen:AB$Regenerate | Cost$ PayLife<3> | SpellDescription$ Regenerate CARDNAME. SVar:VolverPumped:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | ETB$ True | SubAbility$ VolverSpeed | SpellDescription$ If CARDNAME was kicked with its {R} kicker, it enters the battlefield with a +1/+1 counter on it and with first strike. SVar:VolverSpeed:DB$ Animate | Defined$ Self | Keywords$ First Strike | Permanent$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black|Red DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/degavolver.jpg diff --git a/forge-gui/res/cardsfolder/d/deicide.txt b/forge-gui/res/cardsfolder/d/deicide.txt index fd17596382a..79ac355d10c 100644 --- a/forge-gui/res/cardsfolder/d/deicide.txt +++ b/forge-gui/res/cardsfolder/d/deicide.txt @@ -9,6 +9,6 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:NumInLib:TargetedController$CardsInLibrary SVar:NumInHand:TargetedController$CardsInHand SVar:NumInYard:TargetedController$CardsInGraveyard -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/deicide.jpg Oracle:Exile target enchantment. If the exiled card is a God card, search its controller's graveyard, hand, and library for any number of cards with the same name as that card and exile them, then that player shuffles their library. diff --git a/forge-gui/res/cardsfolder/d/delaying_shield.txt b/forge-gui/res/cardsfolder/d/delaying_shield.txt index 27ed8ceccd7..7be9e1dd840 100644 --- a/forge-gui/res/cardsfolder/d/delaying_shield.txt +++ b/forge-gui/res/cardsfolder/d/delaying_shield.txt @@ -10,6 +10,6 @@ SVar:RepeatOnUpkeep:DB$ Repeat | MaxRepeat$ NumRemoved | References$ NumRemoved SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 1 | Defined$ You | UnlessCost$ 1 W | UnlessPayer$ You SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:NumRemoved:Count$RememberedSize -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/delaying_shield.jpg Oracle:If damage would be dealt to you, put that many delay counters on Delaying Shield instead.\nAt the beginning of your upkeep, remove all delay counters from Delaying Shield. For each delay counter removed this way, you lose 1 life unless you pay {1}{W}. diff --git a/forge-gui/res/cardsfolder/d/delifs_cone.txt b/forge-gui/res/cardsfolder/d/delifs_cone.txt index 5940d97a3e1..1c35cce1e2f 100644 --- a/forge-gui/res/cardsfolder/d/delifs_cone.txt +++ b/forge-gui/res/cardsfolder/d/delifs_cone.txt @@ -6,6 +6,6 @@ SVar:TrigAttackerUnblocked:Mode$ AttackerUnblocked | ValidCard$ Card.IsRemembere SVar:GainLife:DB$ GainLife | Defined$ You | LifeAmount$ DelifX | SubAbility$ DBPump | References$ DelifX SVar:DBPump:DB$ Pump | Defined$ Remembered | KW$ HIDDEN CARDNAME assigns no combat damage | StackDescription$ {c:Remembered} assigns no combat damage this turn. SVar:DelifX:Remembered$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/delifs_cone.jpg Oracle:{T}, Sacrifice Delif's Cone: This turn, when target creature you control attacks and isn't blocked, you may gain life equal to its power. If you do, it assigns no combat damage this turn. diff --git a/forge-gui/res/cardsfolder/d/delifs_cube.txt b/forge-gui/res/cardsfolder/d/delifs_cube.txt index b8378656668..7a09408399a 100644 --- a/forge-gui/res/cardsfolder/d/delifs_cube.txt +++ b/forge-gui/res/cardsfolder/d/delifs_cube.txt @@ -8,6 +8,6 @@ SVar:PutCounter:DB$ PutCounter | Defined$ Imprinted | CounterType$ CUBE | Counte SVar:TrigLeave:Mode$ ChangesZone | ValidCard$ Creature.IsRemembered | Origin$ Battlefield | Destination$ Any | Execute$ ExileEffect | Static$ True SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile | Static$ True A:AB$ Regenerate | Cost$ 2 SubCounter<1/CUBE> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Regenerate target creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/delifs_cube.jpg Oracle:{2}, {T}: This turn, when target creature you control attacks and isn't blocked, it assigns no combat damage this turn and you put a cube counter on Delif's Cube.\n{2}, Remove a cube counter from Delif's Cube: Regenerate target creature. diff --git a/forge-gui/res/cardsfolder/d/delirium_skeins.txt b/forge-gui/res/cardsfolder/d/delirium_skeins.txt index 9b84cffd857..c08bf28f739 100644 --- a/forge-gui/res/cardsfolder/d/delirium_skeins.txt +++ b/forge-gui/res/cardsfolder/d/delirium_skeins.txt @@ -3,6 +3,6 @@ ManaCost:2 B Types:Sorcery A:SP$ RepeatEach | Cost$ 2 B | RepeatPlayers$ Player | RepeatSubAbility$ DeliriumDiscard | SpellDescription$ Each player discards three cards. SVar:DeliriumDiscard:DB$ Discard | Mode$ TgtChoose | Defined$ Remembered | NumCards$ 3 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/delirium_skeins.jpg Oracle:Each player discards three cards. diff --git a/forge-gui/res/cardsfolder/d/dementia_sliver.txt b/forge-gui/res/cardsfolder/d/dementia_sliver.txt index 65737b463e5..52e2566b1a5 100644 --- a/forge-gui/res/cardsfolder/d/dementia_sliver.txt +++ b/forge-gui/res/cardsfolder/d/dementia_sliver.txt @@ -6,7 +6,7 @@ S:Mode$ Continuous | Affected$ Sliver | AddAbility$ ABDementiaNameCard | AddSVar SVar:ABDementiaNameCard:AB$ NameCard | Cost$ T | Defined$ You | SubAbility$ DBDementiaReveal | SpellDescription$ Choose a card name. Target opponent reveals a card at random from their hand. If that card has the chosen name, that player discards it. Activate this ability only during your turn. SVar:DBDementiaReveal:DB$ Reveal | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | Random$ True | PlayerTurn$ True | SubAbility$ DBDementiaDiscard SVar:DBDementiaDiscard:DB$ Discard | DiscardValid$ Card.NamedCard | Mode$ TgtChoose | Defined$ Targeted -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dementia_sliver.jpg Oracle:All Slivers have "{T}: Choose a card name. Target opponent reveals a card at random from their hand. If that card has the chosen name, that player discards it. Activate this ability only during your turn." diff --git a/forge-gui/res/cardsfolder/d/demon_of_wailing_agonies.txt b/forge-gui/res/cardsfolder/d/demon_of_wailing_agonies.txt index 3975e6e9038..fbfdbf87b37 100644 --- a/forge-gui/res/cardsfolder/d/demon_of_wailing_agonies.txt +++ b/forge-gui/res/cardsfolder/d/demon_of_wailing_agonies.txt @@ -8,6 +8,6 @@ SVar:TrigDealsCB:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player SVar:TrigSac:DB$ Sacrifice | Defined$ TriggeredTarget | SacValid$ Creature SVar:X:Count$Valid Card.IsCommander+YouOwn+YouCtrl SVar:BuffedBy:Card.IsCommander -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/demon_of_wailing_agonies.jpg Oracle:Flying\nLieutenant — As long as you control your commander, Demon of Wailing Agonies gets +2/+2 and has "Whenever Demon of Wailing Agonies deals combat damage to a player, that player sacrifices a creature." diff --git a/forge-gui/res/cardsfolder/d/demonic_appetite.txt b/forge-gui/res/cardsfolder/d/demonic_appetite.txt index 8227e71d018..8750113c1b3 100644 --- a/forge-gui/res/cardsfolder/d/demonic_appetite.txt +++ b/forge-gui/res/cardsfolder/d/demonic_appetite.txt @@ -6,6 +6,6 @@ A:SP$ Attach | Cost$ B | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 3 | AddToughness$ 3 | Description$ Enchanted creature gets +3/+3. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ At the beginning of your upkeep, sacrifice a creature. SVar:TrigSac:DB$Sacrifice | Defined$ You | SacValid$ Creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/demonic_appetite.jpg Oracle:Enchant creature you control\nEnchanted creature gets +3/+3.\nAt the beginning of your upkeep, sacrifice a creature. diff --git a/forge-gui/res/cardsfolder/d/demonic_attorney.txt b/forge-gui/res/cardsfolder/d/demonic_attorney.txt index fc6d22dcd4c..c8fc0a2b75d 100644 --- a/forge-gui/res/cardsfolder/d/demonic_attorney.txt +++ b/forge-gui/res/cardsfolder/d/demonic_attorney.txt @@ -3,7 +3,7 @@ ManaCost:1 B B Types:Sorcery K:Remove CARDNAME from your deck before playing if you're not playing for ante. A:SP$ Mill | Cost$ 1 B B | Defined$ Player | NumCards$ 1 | Destination$ Ante | SpellDescription$ Each player antes the top card of their library. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/demonic_attorney.jpg Oracle:Remove Demonic Attorney from your deck before playing if you're not playing for ante.\nEach player antes the top card of their library. diff --git a/forge-gui/res/cardsfolder/d/demonic_collusion.txt b/forge-gui/res/cardsfolder/d/demonic_collusion.txt index 06ea8aca5c7..7a702c95546 100644 --- a/forge-gui/res/cardsfolder/d/demonic_collusion.txt +++ b/forge-gui/res/cardsfolder/d/demonic_collusion.txt @@ -3,6 +3,6 @@ ManaCost:3 B B Types:Sorcery K:Buyback:Discard<2/Card> A:SP$ ChangeZone | Cost$ 3 B B | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 1 | Hidden$ True | Shuffle$ True | SpellDescription$ Search your library for a card and put that card into your hand. Then shuffle your library. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/demonic_collusion.jpg Oracle:Buyback—Discard two cards. (You may discard two cards in addition to any other costs as you cast this spell. If you do, put this card into your hand as it resolves.)\nSearch your library for a card and put that card into your hand. Then shuffle your library. diff --git a/forge-gui/res/cardsfolder/d/demonic_consultation.txt b/forge-gui/res/cardsfolder/d/demonic_consultation.txt index 735925cc0fb..27be54c1166 100644 --- a/forge-gui/res/cardsfolder/d/demonic_consultation.txt +++ b/forge-gui/res/cardsfolder/d/demonic_consultation.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ NameCard | Cost$ B | Defined$ You | SubAbility$ DBMill | SpellDescription$ Choose a card name. Exile the top six cards of your library, then reveal cards from the top of your library until you reveal a card with the chosen name. Put that card into your hand and exile all other cards revealed this way. SVar:DBMill:DB$ Mill | Defined$ You | NumCards$ 6 | Destination$ Exile | SubAbility$ DBDigUntil SVar:DBDigUntil:DB$ DigUntil | Valid$ Card.NamedCard | FoundDestination$ Hand | RevealedDestination$ Exile | ValidDescription$ named card -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/demonic_consultation.jpg Oracle:Choose a card name. Exile the top six cards of your library, then reveal cards from the top of your library until you reveal a card with the chosen name. Put that card into your hand and exile all other cards revealed this way. diff --git a/forge-gui/res/cardsfolder/d/demonic_pact.txt b/forge-gui/res/cardsfolder/d/demonic_pact.txt index e24884a3c68..b240b246ee4 100644 --- a/forge-gui/res/cardsfolder/d/demonic_pact.txt +++ b/forge-gui/res/cardsfolder/d/demonic_pact.txt @@ -11,6 +11,6 @@ SVar:DeathPact:DB$ LosesGame | Defined$ You | ChoiceName$ DeathPact | SpellDescr # Clear RememberChoice just in case it's not getting cleared by Zone changes T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ ClearRemembered | Static$ True SVar:ClearRemembered:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/demonic_pact.jpg Oracle:At the beginning of your upkeep, choose one that hasn't been chosen —\n• Demonic Pact deals 4 damage to any target and you gain 4 life.\n• Target opponent discards two cards.\n• Draw two cards.\n• You lose the game. diff --git a/forge-gui/res/cardsfolder/d/demonic_taskmaster.txt b/forge-gui/res/cardsfolder/d/demonic_taskmaster.txt index 631d46acc17..27f3b78f18a 100644 --- a/forge-gui/res/cardsfolder/d/demonic_taskmaster.txt +++ b/forge-gui/res/cardsfolder/d/demonic_taskmaster.txt @@ -5,6 +5,6 @@ PT:4/3 K:Flying T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ At the beginning of your upkeep, sacrifice a creature other than CARDNAME. SVar:TrigSac:DB$ Sacrifice | Defined$ You | SacValid$ Creature.Other -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/demonic_taskmaster.jpg Oracle:Flying\nAt the beginning of your upkeep, sacrifice a creature other than Demonic Taskmaster. diff --git a/forge-gui/res/cardsfolder/d/demonic_tutor.txt b/forge-gui/res/cardsfolder/d/demonic_tutor.txt index 045a0fd7f1b..f47a0553a04 100644 --- a/forge-gui/res/cardsfolder/d/demonic_tutor.txt +++ b/forge-gui/res/cardsfolder/d/demonic_tutor.txt @@ -3,6 +3,6 @@ ManaCost:1 B Types:Sorcery A:SP$ ChangeZone | Cost$ 1 B | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 1 | Mandatory$ True | SpellDescription$ Search your library for a card and put that card into your hand. Then shuffle your library. #TODO: Improve the tutoring logic for the AI. Currently will generally look for the most expensive castable thing in the library (which can, of course, be used to advantage in properly constructed AI decks). -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://resources.wizards.com/magic/cards/3e/en-us/card1155.jpg Oracle:Search your library for a card and put that card into your hand. Then shuffle your library. diff --git a/forge-gui/res/cardsfolder/d/demonmail_hauberk.txt b/forge-gui/res/cardsfolder/d/demonmail_hauberk.txt index da2945105bc..bbfa6dcfd56 100644 --- a/forge-gui/res/cardsfolder/d/demonmail_hauberk.txt +++ b/forge-gui/res/cardsfolder/d/demonmail_hauberk.txt @@ -3,6 +3,6 @@ ManaCost:4 Types:Artifact Equipment K:Equip:Sac<1/Creature> S:Mode$ Continuous | Affected$ Card.EquippedBy | AddPower$ 4 | AddToughness$ 2 | Description$ Equipped creature gets +4/+2. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/demonmail_hauberk.jpg Oracle:Equipped creature gets +4/+2.\nEquip—Sacrifice a creature. diff --git a/forge-gui/res/cardsfolder/d/demons_horn.txt b/forge-gui/res/cardsfolder/d/demons_horn.txt index 82c77d4b1f1..892b7a9a652 100644 --- a/forge-gui/res/cardsfolder/d/demons_horn.txt +++ b/forge-gui/res/cardsfolder/d/demons_horn.txt @@ -3,7 +3,7 @@ ManaCost:2 Types:Artifact T:Mode$ SpellCast | ValidCard$ Card.Black | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever a player casts a black spell, you may gain 1 life. SVar:TrigGainLife:DB$GainLife | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black SVar:Picture:http://www.wizards.com/global/images/magic/general/demons_horn.jpg Oracle:Whenever a player casts a black spell, you may gain 1 life. diff --git a/forge-gui/res/cardsfolder/d/demoralize.txt b/forge-gui/res/cardsfolder/d/demoralize.txt index c9baedf624c..6e60293ed57 100644 --- a/forge-gui/res/cardsfolder/d/demoralize.txt +++ b/forge-gui/res/cardsfolder/d/demoralize.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ PumpAll | Cost$ 2 R | ValidCards$ Creature | KW$ Menace | SubAbility$ DBEffect2 | SpellDescription$ All creatures gain menace until end of turn. SVar:DBEffect2:DB$ Effect | Name$ Demoralize Effect 2 | StaticAbilities$ KWPump2 | Condition$ Threshold | SpellDescription$ Threshold — If seven or more cards are in your graveyard, creatures can't block this turn. SVar:KWPump2:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature | AddHiddenKeyword$ CARDNAME can't block. | Description$ Threshold — If seven or more cards are in your graveyard, creatures can't block this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/demoralize.jpg Oracle:All creatures gain menace until end of turn. (They can't be blocked except by two or more creatures.)\nThreshold — If seven or more cards are in your graveyard, creatures can't block this turn. diff --git a/forge-gui/res/cardsfolder/d/dense_canopy.txt b/forge-gui/res/cardsfolder/d/dense_canopy.txt index eb900b3d100..f67c2a0ded0 100644 --- a/forge-gui/res/cardsfolder/d/dense_canopy.txt +++ b/forge-gui/res/cardsfolder/d/dense_canopy.txt @@ -4,6 +4,6 @@ Types:Enchantment S:Mode$ Continuous | Affected$ Creature.withFlying | AddHiddenKeyword$ CARDNAME can block only creatures with flying. | Description$ Creatures with flying can block only creatures with flying. SVar:NonStackingEffect:True SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dense_canopy.jpg Oracle:Creatures with flying can block only creatures with flying. diff --git a/forge-gui/res/cardsfolder/d/dense_foliage.txt b/forge-gui/res/cardsfolder/d/dense_foliage.txt index 1175a9eee45..ea0c78c87ad 100644 --- a/forge-gui/res/cardsfolder/d/dense_foliage.txt +++ b/forge-gui/res/cardsfolder/d/dense_foliage.txt @@ -3,6 +3,6 @@ ManaCost:2 G Types:Enchantment S:Mode$ CantTarget | ValidCard$ Creature | ValidSA$ Spell | Description$ Creatures can't be the target of spells. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dense_foliage.jpg Oracle:Creatures can't be the targets of spells. diff --git a/forge-gui/res/cardsfolder/d/denying_wind.txt b/forge-gui/res/cardsfolder/d/denying_wind.txt index 00ef3c70972..9b10d0bf836 100644 --- a/forge-gui/res/cardsfolder/d/denying_wind.txt +++ b/forge-gui/res/cardsfolder/d/denying_wind.txt @@ -2,6 +2,6 @@ Name:Denying Wind ManaCost:7 U U Types:Sorcery A:SP$ ChangeZone | Cost$ 7 U U | Origin$ Library | Destination$ Exile | ValidTgts$ Player | ChangeType$ Card | ChangeNum$ 7 | IsCurse$ True | SpellDescription$ Search target player's library for up to seven cards and exile them. Then that player shuffles their library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/denying_wind.jpg Oracle:Search target player's library for up to seven cards and exile them. Then that player shuffles their library. diff --git a/forge-gui/res/cardsfolder/d/deploy_the_gatewatch.txt b/forge-gui/res/cardsfolder/d/deploy_the_gatewatch.txt index fc83efc6e19..3a0803c8044 100644 --- a/forge-gui/res/cardsfolder/d/deploy_the_gatewatch.txt +++ b/forge-gui/res/cardsfolder/d/deploy_the_gatewatch.txt @@ -2,6 +2,6 @@ Name:Deploy the Gatewatch ManaCost:4 W W Types:Sorcery A:SP$ Dig | Cost$ 4 W W | DigNum$ 7 | ChangeNum$ 2 | ChangeValid$ Planeswalker | Optional$ True | DestinationZone$ Battlefield | RestRandomOrder$ True | ForceRevealToController$ True | SpellDescription$ Look at the top seven cards of your library. Put up to two planeswalker cards from among them onto the battlefield. Put the rest on the bottom of your library in a random order. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/deploy_the_gatewatch.jpg Oracle:Look at the top seven cards of your library. Put up to two planeswalker cards from among them onto the battlefield. Put the rest on the bottom of your library in a random order. diff --git a/forge-gui/res/cardsfolder/d/descendant_of_masumaro.txt b/forge-gui/res/cardsfolder/d/descendant_of_masumaro.txt index 6b4fbae027b..1f89b8f5935 100644 --- a/forge-gui/res/cardsfolder/d/descendant_of_masumaro.txt +++ b/forge-gui/res/cardsfolder/d/descendant_of_masumaro.txt @@ -8,6 +8,6 @@ SVar:SelectOpponent:DB$ Pump | ValidTgts$ Opponent | TgtPrompt$ Select target op SVar:TrigRemoveCounter:DB$ RemoveCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ Y | References$ Y SVar:X:Count$InYourHand SVar:Y:TargetedPlayer$CardsInHand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/descendant_of_masumaro.jpg Oracle:At the beginning of your upkeep, put a +1/+1 counter on Descendant of Masumaro for each card in your hand, then remove a +1/+1 counter from Descendant of Masumaro for each card in target opponent's hand. diff --git a/forge-gui/res/cardsfolder/d/descendants_path.txt b/forge-gui/res/cardsfolder/d/descendants_path.txt index e6f74b370a3..c3e822c7b62 100644 --- a/forge-gui/res/cardsfolder/d/descendants_path.txt +++ b/forge-gui/res/cardsfolder/d/descendants_path.txt @@ -6,6 +6,6 @@ SVar:TrigDig:DB$ Dig | DigNum$ 1 | Reveal$ True | RememberRevealed$ True | Chang SVar:DBPlayIT:DB$ Play | Defined$ Remembered | Controller$ You | WithoutManaCost$ True | Optional$ True | RememberPlayed$ True | ConditionCheckSVar$ MatchType | ConditionSVarCompare$ EQ1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:MatchType:Remembered$Valid Creature.sharesCreatureTypeWith Card -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/descendants_path.jpg Oracle:At the beginning of your upkeep, reveal the top card of your library. If it's a creature card that shares a creature type with a creature you control, you may cast that card without paying its mana cost. Otherwise, put that card on the bottom of your library. diff --git a/forge-gui/res/cardsfolder/d/descent_into_madness.txt b/forge-gui/res/cardsfolder/d/descent_into_madness.txt index fde898adcff..28b470c5142 100644 --- a/forge-gui/res/cardsfolder/d/descent_into_madness.txt +++ b/forge-gui/res/cardsfolder/d/descent_into_madness.txt @@ -6,7 +6,7 @@ SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ DESPAIR | Coun SVar:DBExileSelf:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBExile SVar:DBExile:DB$ ChangeZone | DefinedPlayer$ Player.IsRemembered | Chooser$ Player.IsRemembered | ChangeType$ Permanent.RememberedPlayerCtrl,Card.RememberedPlayerCtrl | ChangeNum$ X | Hidden$ True | Origin$ Battlefield,Hand | Destination$ Exile | References$ X | Mandatory$ True SVar:X:Count$CardCounters.DESPAIR -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/descent_into_madness.jpg Oracle:At the beginning of your upkeep, put a despair counter on Descent into Madness, then each player exiles X permanents they control and/or cards from their hand, where X is the number of despair counters on Descent into Madness. diff --git a/forge-gui/res/cardsfolder/d/descent_of_the_dragons.txt b/forge-gui/res/cardsfolder/d/descent_of_the_dragons.txt index 376ef3e2c8e..4e09696db7e 100644 --- a/forge-gui/res/cardsfolder/d/descent_of_the_dragons.txt +++ b/forge-gui/res/cardsfolder/d/descent_of_the_dragons.txt @@ -6,6 +6,6 @@ SVar:DBToken:DB$ RepeatEach | UseImprinted$ True | DefinedCards$ DirectRemembere SVar:TokenDragon:DB$ Token | TokenAmount$ 1 | TokenName$ Dragon | TokenTypes$ Creature,Dragon | TokenOwner$ ImprintedController | TokenColors$ Red | TokenPower$ 4 | TokenToughness$ 4 | TokenKeywords$ Flying | TokenImage$ r_4_4_dragon_dtk SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:MaxTgts:Count$Valid Creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/descent_of_the_dragons.jpg Oracle:Destroy any number of target creatures. For each creature destroyed this way, its controller creates a 4/4 red Dragon creature token with flying. diff --git a/forge-gui/res/cardsfolder/d/desecration_elemental.txt b/forge-gui/res/cardsfolder/d/desecration_elemental.txt index 2da760ec7fc..c8a7501b4d9 100644 --- a/forge-gui/res/cardsfolder/d/desecration_elemental.txt +++ b/forge-gui/res/cardsfolder/d/desecration_elemental.txt @@ -5,7 +5,7 @@ PT:8/8 K:Fear T:Mode$ SpellCast | ValidCard$ Card | Execute$ TrigSac | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player casts a spell, sacrifice a creature. SVar:TrigSac:DB$Sacrifice | SacValid$ Creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:AntiBuffedBy:Card SVar:Picture:http://www.wizards.com/global/images/magic/general/desecration_elemental.jpg Oracle:Fear (This creature can't be blocked except by artifact creatures and/or black creatures.)\nWhenever a player casts a spell, sacrifice a creature. diff --git a/forge-gui/res/cardsfolder/d/deserters_quarters.txt b/forge-gui/res/cardsfolder/d/deserters_quarters.txt index e03e6368c27..09c73c0c337 100644 --- a/forge-gui/res/cardsfolder/d/deserters_quarters.txt +++ b/forge-gui/res/cardsfolder/d/deserters_quarters.txt @@ -6,6 +6,6 @@ A:AB$ Tap | Cost$ 6 T | ValidTgts$ Creature | RememberTapped$ True | AlwaysRemem S:Mode$ Continuous | Affected$ Card.IsRemembered | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. T:Mode$ Untaps | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ ClearRemembered | Static$ True SVar:ClearRemembered:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/deserters_quarters.jpg Oracle:You may choose not to untap Deserter's Quarters during your untap step.\n{6}, {T}: Tap target creature. It doesn't untap during its controller's untap step for as long as Deserter's Quarters remains tapped. diff --git a/forge-gui/res/cardsfolder/d/desolate_lighthouse.txt b/forge-gui/res/cardsfolder/d/desolate_lighthouse.txt index 1e727e5af23..bcb684d6527 100644 --- a/forge-gui/res/cardsfolder/d/desolate_lighthouse.txt +++ b/forge-gui/res/cardsfolder/d/desolate_lighthouse.txt @@ -4,6 +4,6 @@ Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Draw | Cost$ 1 U R T | NumCards$ 1 | SpellDescription$ Draw a card, then discard a card. | SubAbility$ DBDiscard SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/desolate_lighthouse.jpg Oracle:{T}: Add {C}.\n{1}{U}{R}, {T}: Draw a card, then discard a card. diff --git a/forge-gui/res/cardsfolder/d/desolation.txt b/forge-gui/res/cardsfolder/d/desolation.txt index 5ba050b79bc..13d0137948c 100644 --- a/forge-gui/res/cardsfolder/d/desolation.txt +++ b/forge-gui/res/cardsfolder/d/desolation.txt @@ -6,7 +6,7 @@ SVar:TrigSac:DB$ Sacrifice | SacValid$ Land | Defined$ Player.TappedLandForManaT SVar:DBRepeat:DB$ RepeatEach | DefinedCards$ Remembered | AdditionalRestriction$ Plains | UseImprinted$ True | RepeatSubAbility$ DBDamage | SubAbility$ DBCleanup SVar:DBDamage:DB$ DealDamage | Defined$ ImprintedController | NumDmg$ 2 SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/desolation.jpg Oracle:At the beginning of each end step, each player who tapped a land for mana this turn sacrifices a land. Desolation deals 2 damage to each player who sacrificed a Plains this way. diff --git a/forge-gui/res/cardsfolder/d/desolation_angel.txt b/forge-gui/res/cardsfolder/d/desolation_angel.txt index ca24be6b8a5..7b263417006 100644 --- a/forge-gui/res/cardsfolder/d/desolation_angel.txt +++ b/forge-gui/res/cardsfolder/d/desolation_angel.txt @@ -8,7 +8,7 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigDestroyYourLand:DB$DestroyAll | ValidCards$ Land.YouCtrl | SpellDescription$ CARDNAME destroys all land you control. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Secondary$ True | Execute$ TrigKicker | TriggerDescription$ Kicker: If you paid the kicker cost, destroy all lands instead. SVar:TrigKicker:DB$DestroyAll | ValidCards$ Land | SpellDescription$ CARDNAME destroys all land. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$white SVar:Picture:http://www.wizards.com/global/images/magic/general/desolation_angel.jpg Oracle:Kicker {W}{W} (You may pay an additional {W}{W} as you cast this spell.)\nFlying\nWhen Desolation Angel enters the battlefield, destroy all lands you control. If it was kicked, destroy all lands instead. diff --git a/forge-gui/res/cardsfolder/d/desolation_giant.txt b/forge-gui/res/cardsfolder/d/desolation_giant.txt index f2f8bab7641..6bef9621895 100644 --- a/forge-gui/res/cardsfolder/d/desolation_giant.txt +++ b/forge-gui/res/cardsfolder/d/desolation_giant.txt @@ -7,8 +7,8 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Secondary$ True | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy all other creatures. SVar:TrigDestroy:DB$DestroyAll | ValidCards$ Creature.Other+YouCtrl SVar:TrigKicker:DB$DestroyAll | ValidCards$ Creature.Other -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random DeckNeeds:Color$white SVar:Picture:http://www.wizards.com/global/images/magic/general/desolation_giant.jpg Oracle:Kicker {W}{W} (You may pay an additional {W}{W} as you cast this spell.)\nWhen Desolation Giant enters the battlefield, destroy all other creatures you control. If it was kicked, destroy all other creatures instead. diff --git a/forge-gui/res/cardsfolder/d/desperate_gambit.txt b/forge-gui/res/cardsfolder/d/desperate_gambit.txt index 7d1ca4324a8..9beaed5159f 100644 --- a/forge-gui/res/cardsfolder/d/desperate_gambit.txt +++ b/forge-gui/res/cardsfolder/d/desperate_gambit.txt @@ -12,6 +12,6 @@ SVar:WinX:ReplaceCount$DamageAmount/Twice SVar:CreateLossEffect:DB$ Effect | Name$ Desperate Gambit Loss Effect | ReplacementEffects$ EventLossDamageDone | SVars$ ExileEffect | References$ EventLossDamageDone,ExileEffect | RememberObjects$ Remembered SVar:EventLossDamageDone:Event$ DamageDone | ValidSource$ Card.IsRemembered | ReplaceWith$ ExileEffect | PreventionEffect$ True | Description$ The next time it would deal damage this turn, prevent that damage. SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/desperate_gambit.jpg Oracle:Choose a source you control and flip a coin. If you win the flip, the next time that source would deal damage this turn, it deals double that damage instead. If you lose the flip, the next time it would deal damage this turn, prevent that damage. diff --git a/forge-gui/res/cardsfolder/d/desperate_research.txt b/forge-gui/res/cardsfolder/d/desperate_research.txt index f96da2c1ce4..ca4edbbcb40 100644 --- a/forge-gui/res/cardsfolder/d/desperate_research.txt +++ b/forge-gui/res/cardsfolder/d/desperate_research.txt @@ -3,7 +3,7 @@ ManaCost:1 B Types:Sorcery A:SP$ NameCard | Cost$ 1 B | Defined$ You | ValidCards$ Card.nonBasic | ValidDesc$ card other than a basic land | SubAbility$ DBDig | SpellDescription$ Choose a card name other than a basic land card name. Reveal the top seven cards of your library and put all of them with that name into your hand. Exile the rest. SVar:DBDig:DB$ Dig | DigNum$ 7 | Reveal$ True | DestinationZone2$ Exile | ChangeValid$ Card.NamedCard | ChangeNum$ All -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/desperate_research.jpg Oracle:Choose a card name other than a basic land card name. Reveal the top seven cards of your library and put all of them with that name into your hand. Exile the rest. diff --git a/forge-gui/res/cardsfolder/d/despotic_scepter.txt b/forge-gui/res/cardsfolder/d/despotic_scepter.txt index 6b21f32e633..59a6296378c 100644 --- a/forge-gui/res/cardsfolder/d/despotic_scepter.txt +++ b/forge-gui/res/cardsfolder/d/despotic_scepter.txt @@ -2,6 +2,6 @@ Name:Despotic Scepter ManaCost:1 Types:Artifact A:AB$ Destroy | Cost$ T | ValidTgts$ Permanent.YouOwn | TgtPrompt$ Select target permanent you own | NoRegen$ True | SpellDescription$ Destroy target permanent you own. It can't be regenerated. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/despotic_scepter.jpg Oracle:{T}: Destroy target permanent you own. It can't be regenerated. diff --git a/forge-gui/res/cardsfolder/d/destructive_flow.txt b/forge-gui/res/cardsfolder/d/destructive_flow.txt index 96ef21571bc..2e564021350 100644 --- a/forge-gui/res/cardsfolder/d/destructive_flow.txt +++ b/forge-gui/res/cardsfolder/d/destructive_flow.txt @@ -3,6 +3,6 @@ ManaCost:B R G Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ At the beginning of each player's upkeep, that player sacrifices a nonbasic land. SVar:TrigSac:DB$ Sacrifice | SacValid$ Land.nonBasic | Defined$ TriggeredPlayer | SacMessage$ nonbasic land -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/destructive_flow.jpg Oracle:At the beginning of each player's upkeep, that player sacrifices a nonbasic land. diff --git a/forge-gui/res/cardsfolder/d/destructive_force.txt b/forge-gui/res/cardsfolder/d/destructive_force.txt index 10cd0f2af3f..a517302ca2b 100644 --- a/forge-gui/res/cardsfolder/d/destructive_force.txt +++ b/forge-gui/res/cardsfolder/d/destructive_force.txt @@ -3,6 +3,6 @@ ManaCost:5 R R Types:Sorcery A:SP$ Sacrifice | Cost$ 5 R R | Defined$ Player | SacValid$ Land | Amount$ 5 | SpellDescription$ Each player sacrifices five lands. CARDNAME deals 5 damage to each creature. | SubAbility$ DBDamage SVar:DBDamage:DB$ DamageAll | NumDmg$ 5 | ValidCards$ Creature -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/destructive_force.jpg Oracle:Each player sacrifices five lands. Destructive Force deals 5 damage to each creature. diff --git a/forge-gui/res/cardsfolder/d/detainment_spell.txt b/forge-gui/res/cardsfolder/d/detainment_spell.txt index 9dd1e198531..98b0f71dfd0 100644 --- a/forge-gui/res/cardsfolder/d/detainment_spell.txt +++ b/forge-gui/res/cardsfolder/d/detainment_spell.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ W | ValidTgts$ Creature | AILogic$ Curse S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddHiddenKeyword$ CARDNAME's activated abilities can't be activated. | Description$ Enchanted creature's activated abilities can't be activated. A:AB$ Attach | Cost$ 1 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | AILogic$ Curse | SpellDescription$ Attach CARDNAME to target creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/detainment_spell.jpg Oracle:Enchant creature\nEnchanted creature's activated abilities can't be activated.\n{1}{W}: Attach Detainment Spell to target creature. diff --git a/forge-gui/res/cardsfolder/d/detection_tower.txt b/forge-gui/res/cardsfolder/d/detection_tower.txt index 6be754bdf1b..7794e5159fe 100644 --- a/forge-gui/res/cardsfolder/d/detection_tower.txt +++ b/forge-gui/res/cardsfolder/d/detection_tower.txt @@ -4,6 +4,6 @@ Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Effect | Cost$ 1 T | StaticAbilities$ STLoseAB | SpellDescription$ Until end of turn, your opponents and creatures your opponents control with hexproof can be the targets of spells and abilities you control as though they didn’t have hexproof. SVar:STLoseAB:Mode$ Continuous | EffectZone$ Command | Affected$ You | AddKeyword$ IgnoreHexproof:Opponent,Creature.OppCtrl | Description$ Your opponents and creatures your opponents control with hexproof can be the targets of spells and abilities you control as though they didn’t have hexproof. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/detection_tower.jpg Oracle:{T}: Add {C}.\n{1}, {T}: Until end of turn, your opponents and creatures your opponents control with hexproof can be the targets of spells and abilities you control as though they didn’t have hexproof. diff --git a/forge-gui/res/cardsfolder/d/detritivore.txt b/forge-gui/res/cardsfolder/d/detritivore.txt index 169205b56d0..3918fd2d08a 100644 --- a/forge-gui/res/cardsfolder/d/detritivore.txt +++ b/forge-gui/res/cardsfolder/d/detritivore.txt @@ -9,6 +9,6 @@ T:Mode$ CounterRemoved | ValidCard$ Card.Self | TriggerZones$ Exile | CounterTyp SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Land.nonBasic | TgtPrompt$ Select a nonbasic land. SVar:X:Count$xPaid SVar:Y:Count$ValidGraveyard Land.nonBasic+OppCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/detritivore.jpg Oracle:Detritivore's power and toughness are each equal to the number of nonbasic land cards in your opponents' graveyards.\nSuspend X—{X}{3}{R}. X can't be 0. (Rather than cast this card from your hand, you may pay {X}{3}{R} and exile it with X time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.)\nWhenever a time counter is removed from Detritivore while it's exiled, destroy target nonbasic land. diff --git a/forge-gui/res/cardsfolder/d/devastating_dreams.txt b/forge-gui/res/cardsfolder/d/devastating_dreams.txt index b35b2b311d6..e9010e018b5 100644 --- a/forge-gui/res/cardsfolder/d/devastating_dreams.txt +++ b/forge-gui/res/cardsfolder/d/devastating_dreams.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ Sacrifice | Cost$ R R Discard | Defined$ Player | SacValid$ Land | Amount$ ChosenX | SubAbility$ DBDamage | References$ X | SpellDescription$ Each player sacrifices X lands. CARDNAME deals X damage to each creature. SVar:DBDamage:DB$ DamageAll | NumDmg$ ChosenX | ValidCards$ Creature | References$ X SVar:X:XChoice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/devastating_dreams.jpg Oracle:As an additional cost to cast Devastating Dreams, discard X cards at random.\nEach player sacrifices X lands. Devastating Dreams deals X damage to each creature. diff --git a/forge-gui/res/cardsfolder/d/devastating_summons.txt b/forge-gui/res/cardsfolder/d/devastating_summons.txt index 57d8ddac45b..539b01c9e87 100644 --- a/forge-gui/res/cardsfolder/d/devastating_summons.txt +++ b/forge-gui/res/cardsfolder/d/devastating_summons.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ Token | Cost$ R Sac | TokenAmount$ 2 | TokenName$ Elemental | TokenImage$ r x x elemental | TokenTypes$ Creature,Elemental | TokenOwner$ You | TokenColors$ Red | TokenPower$ ChosenX | TokenToughness$ ChosenX | References$ X | SpellDescription$ Create two X/X red Elemental creature tokens. SVar:X:XChoice #ChosenX SVar created by Cost payment -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/devastating_summons.jpg Oracle:As an additional cost to cast Devastating Summons, sacrifice X lands.\nCreate two X/X red Elemental creature tokens. diff --git a/forge-gui/res/cardsfolder/d/devoted_caretaker.txt b/forge-gui/res/cardsfolder/d/devoted_caretaker.txt index 67e72561f1d..d1b965f5c09 100644 --- a/forge-gui/res/cardsfolder/d/devoted_caretaker.txt +++ b/forge-gui/res/cardsfolder/d/devoted_caretaker.txt @@ -3,7 +3,7 @@ ManaCost:W Types:Creature Human Cleric PT:1/2 A:AB$ Pump | Cost$ W T | KW$ Protection:Spell.Instant,Spell.Sorcery:Protection from instant spells and from sorcery spells | ValidTgts$ Permanent.YouCtrl | TgtPrompt$ Select target permanent you control | SpellDescription$ Target permanent you control gains protection from instant spells and from sorcery spells until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonCombatPriority:3 SVar:Picture:http://www.wizards.com/global/images/magic/general/devoted_caretaker.jpg Oracle:{W}, {T}: Target permanent you control gains protection from instant spells and from sorcery spells until end of turn. diff --git a/forge-gui/res/cardsfolder/d/devoted_druid.txt b/forge-gui/res/cardsfolder/d/devoted_druid.txt index 79cff2a61ea..e3b939dadd8 100644 --- a/forge-gui/res/cardsfolder/d/devoted_druid.txt +++ b/forge-gui/res/cardsfolder/d/devoted_druid.txt @@ -4,6 +4,6 @@ Types:Creature Elf Druid PT:0/2 A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. A:AB$ Untap | Cost$ AddCounter<1/M1M1> | SpellDescription$ Untap CARDNAME. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/devoted_druid.jpg Oracle:{T}: Add {G}.\nPut a -1/-1 counter on Devoted Druid: Untap Devoted Druid. diff --git a/forge-gui/res/cardsfolder/d/devouring_greed.txt b/forge-gui/res/cardsfolder/d/devouring_greed.txt index ac5ba8f9bc9..9db08ba1d84 100644 --- a/forge-gui/res/cardsfolder/d/devouring_greed.txt +++ b/forge-gui/res/cardsfolder/d/devouring_greed.txt @@ -7,8 +7,8 @@ SVar:X:XChoice SVar:A:Sacrificed$Amount SVar:B:SVar$A/Times.2 SVar:C:SVar$B/Plus.2 -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random DeckHints:Type$Spirit SVar:Picture:http://www.wizards.com/global/images/magic/general/devouring_greed.jpg Oracle:As an additional cost to cast Devouring Greed, you may sacrifice any number of Spirits.\nTarget player loses 2 life plus 2 life for each Spirit sacrificed this way. You gain that much life. diff --git a/forge-gui/res/cardsfolder/d/devouring_rage.txt b/forge-gui/res/cardsfolder/d/devouring_rage.txt index 5cc4177b999..7915d6dfef0 100644 --- a/forge-gui/res/cardsfolder/d/devouring_rage.txt +++ b/forge-gui/res/cardsfolder/d/devouring_rage.txt @@ -6,8 +6,8 @@ SVar:Z:SVar$Y/Thrice SVar:Y:Sacrificed$Amount.Plus.1 SVar:X:XChoice #ChosenX SVar created by Cost payment -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All DeckHints:Type$Spirit SVar:Picture:http://www.wizards.com/global/images/magic/general/devouring_rage.jpg Oracle:As an additional cost to cast Devouring Rage, you may sacrifice any number of Spirits.\nTarget creature gets +3/+0 until end of turn. For each Spirit sacrificed this way, that creature gets an additional +3/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/d/devouring_strossus.txt b/forge-gui/res/cardsfolder/d/devouring_strossus.txt index 194705dff02..f33047ca2f9 100644 --- a/forge-gui/res/cardsfolder/d/devouring_strossus.txt +++ b/forge-gui/res/cardsfolder/d/devouring_strossus.txt @@ -7,6 +7,6 @@ K:Trample T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ At the beginning of your upkeep, sacrifice a creature. SVar:TrigSac:DB$Sacrifice | Defined$ You | SacValid$ Creature A:AB$ Regenerate | Cost$ Sac<1/Creature> | SpellDescription$ Regenerate CARDNAME. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/devouring_strossus.jpg Oracle:Flying, trample\nAt the beginning of your upkeep, sacrifice a creature.\nSacrifice a creature: Regenerate Devouring Strossus. diff --git a/forge-gui/res/cardsfolder/d/diabolic_intent.txt b/forge-gui/res/cardsfolder/d/diabolic_intent.txt index bc99f0750f7..3b7b27d21a6 100644 --- a/forge-gui/res/cardsfolder/d/diabolic_intent.txt +++ b/forge-gui/res/cardsfolder/d/diabolic_intent.txt @@ -2,6 +2,6 @@ Name:Diabolic Intent ManaCost:1 B Types:Sorcery A:SP$ ChangeZone | Cost$ 1 B Sac<1/Creature> | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 1 | Mandatory$ True | SpellDescription$ Search your library for a card and put that card into your hand. Then shuffle your library. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/diabolic_intent.jpg Oracle:As an additional cost to cast this spell, sacrifice a creature.\nSearch your library for a card and put that card into your hand. Then shuffle your library. diff --git a/forge-gui/res/cardsfolder/d/diabolic_revelation.txt b/forge-gui/res/cardsfolder/d/diabolic_revelation.txt index 2914ac2e99f..cae6b7406c5 100644 --- a/forge-gui/res/cardsfolder/d/diabolic_revelation.txt +++ b/forge-gui/res/cardsfolder/d/diabolic_revelation.txt @@ -3,6 +3,6 @@ ManaCost:X 3 B B Types:Sorcery A:SP$ ChangeZone | Cost$ X 3 B B | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ X | SpellDescription$ Search your library for up to X cards and put those cards into your hand. Then shuffle your library. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/diabolic_revelation.jpg Oracle:Search your library for up to X cards and put those cards into your hand. Then shuffle your library. diff --git a/forge-gui/res/cardsfolder/d/diabolic_tutor.txt b/forge-gui/res/cardsfolder/d/diabolic_tutor.txt index b083cd83922..59284f31ee0 100644 --- a/forge-gui/res/cardsfolder/d/diabolic_tutor.txt +++ b/forge-gui/res/cardsfolder/d/diabolic_tutor.txt @@ -3,6 +3,6 @@ ManaCost:2 B B Types:Sorcery A:SP$ ChangeZone | Cost$ 2 B B | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 1 | Mandatory$ True | SpellDescription$ Search your library for a card and put that card into your hand. Then shuffle your library. #TODO: Improve the tutoring logic for the AI. Currently will generally look for the most expensive castable thing in the library (which can, of course, be used to advantage in properly constructed AI decks). -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/diabolic_tutor.jpg Oracle:Search your library for a card and put that card into your hand. Then shuffle your library. diff --git a/forge-gui/res/cardsfolder/d/diabolic_vision.txt b/forge-gui/res/cardsfolder/d/diabolic_vision.txt index 5848f70c65c..0c3f5bef70b 100644 --- a/forge-gui/res/cardsfolder/d/diabolic_vision.txt +++ b/forge-gui/res/cardsfolder/d/diabolic_vision.txt @@ -2,6 +2,6 @@ Name:Diabolic Vision ManaCost:U B Types:Sorcery A:SP$ Dig | Cost$ U B | DigNum$ 5 | ChangeNum$ 1 | LibraryPosition2$ 0 | SpellDescription$ Look at the top five cards of your library. Put one of them into your hand and the rest on top of your library in any order. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/diabolic_vision.jpg Oracle:Look at the top five cards of your library. Put one of them into your hand and the rest on top of your library in any order. diff --git a/forge-gui/res/cardsfolder/d/diamond_faerie.txt b/forge-gui/res/cardsfolder/d/diamond_faerie.txt index 2776b0180b5..e436e218c63 100644 --- a/forge-gui/res/cardsfolder/d/diamond_faerie.txt +++ b/forge-gui/res/cardsfolder/d/diamond_faerie.txt @@ -5,6 +5,6 @@ PT:3/3 K:Flying A:AB$ PumpAll | Cost$ 1 S | ValidCards$ Creature.Snow+YouCtrl | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Snow creatures you control get +1/+1 until end of turn. # AI can now use snow mana to pay for activated abilities. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/diamond_faerie.jpg Oracle:Flying\n{1}{S}: Snow creatures you control get +1/+1 until end of turn. ({S} can be paid with one mana from a snow permanent.) diff --git a/forge-gui/res/cardsfolder/d/diamond_faerie_avatar.txt b/forge-gui/res/cardsfolder/d/diamond_faerie_avatar.txt index db7ca786600..2cc717eb25a 100644 --- a/forge-gui/res/cardsfolder/d/diamond_faerie_avatar.txt +++ b/forge-gui/res/cardsfolder/d/diamond_faerie_avatar.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Vanguard HandLifeModifier:+0/+5 A:AB$ Pump | ActivationZone$ Command | Cost$ S | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | NumAtt$ 1 | NumDef$ 1 | SpellDescription$ Target creature you control gets +1/+1 until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:https://downloads.cardforge.org/images/cards/VAN/Diamond Faerie Avatar.full.jpg Oracle:Hand +0, life +5\n{S}: Target creature you control gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/d/diamond_valley.txt b/forge-gui/res/cardsfolder/d/diamond_valley.txt index fc767b75b16..3843409c1ec 100644 --- a/forge-gui/res/cardsfolder/d/diamond_valley.txt +++ b/forge-gui/res/cardsfolder/d/diamond_valley.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land A:AB$ GainLife | Cost$ T Sac<1/Creature> | LifeAmount$ X | References$ X | SpellDescription$ You gain life equal to the sacrificed creature's toughness. SVar:X:Sacrificed$CardToughness -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/diamond_valley.jpg Oracle:{T}, Sacrifice a creature: You gain life equal to the sacrificed creature's toughness. diff --git a/forge-gui/res/cardsfolder/d/dichotomancy.txt b/forge-gui/res/cardsfolder/d/dichotomancy.txt index 1ceea222a76..b74a9180c50 100644 --- a/forge-gui/res/cardsfolder/d/dichotomancy.txt +++ b/forge-gui/res/cardsfolder/d/dichotomancy.txt @@ -5,6 +5,6 @@ K:Suspend:3:1 U U A:SP$ RepeatEach | Cost$ 7 U U | ValidTgts$ Opponent | UseImprinted$ True | RepeatCards$ Permanent.nonLand+TargetedPlayerCtrl+tapped | Zone$ Battlefield | ChooseOrder$ True | RepeatSubAbility$ DBSearch | SubAbility$ DBShuffle | StackDescription$ SpellDescription | SpellDescription$ For each tapped nonland permanent target opponent controls, search that player's library for a card with the same name as that permanent and put it onto the battlefield under your control. Then that player shuffles their library. SVar:DBSearch:DB$ ChangeZone | DefinedPlayer$ ImprintedController | Chooser$ You | Origin$ Library | Destination$ Battlefield | GainControl$ True | ChangeType$ Card.sharesNameWith Imprinted | ChangeNum$ 1 | NoShuffle$ True SVar:DBShuffle:DB$ Shuffle | Defined$ ParentTarget | StackDescription$ None -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dichotomancy.jpg Oracle:For each tapped nonland permanent target opponent controls, search that player's library for a card with the same name as that permanent and put it onto the battlefield under your control. Then that player shuffles their library.\nSuspend 3—{1}{U}{U} (Rather than cast this card from your hand, you may pay {1}{U}{U} and exile it with three time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.) diff --git a/forge-gui/res/cardsfolder/d/dictate_of_the_twin_gods.txt b/forge-gui/res/cardsfolder/d/dictate_of_the_twin_gods.txt index 5199731e287..c2e011c7aed 100644 --- a/forge-gui/res/cardsfolder/d/dictate_of_the_twin_gods.txt +++ b/forge-gui/res/cardsfolder/d/dictate_of_the_twin_gods.txt @@ -6,6 +6,6 @@ R:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Card | ValidTarget SVar:DmgTwice:DB$ ReplaceEffect | VarName$ DamageAmount | VarValue$ X | References$ X SVar:X:ReplaceCount$DamageAmount/Twice SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dictate_of_the_twin_gods.jpg Oracle:Flash\nIf a source would deal damage to a permanent or player, it deals double that damage to that permanent or player instead. diff --git a/forge-gui/res/cardsfolder/d/didgeridoo.txt b/forge-gui/res/cardsfolder/d/didgeridoo.txt index 06371231f6a..d59d2cec5c4 100644 --- a/forge-gui/res/cardsfolder/d/didgeridoo.txt +++ b/forge-gui/res/cardsfolder/d/didgeridoo.txt @@ -3,6 +3,6 @@ ManaCost:1 Types:Artifact A:AB$ ChangeZone | Cost$ 3 | Origin$ Hand | Destination$ Battlefield | ChangeType$ Permanent.Minotaur | ChangeNum$ 1 | SpellDescription$ You may put a Minotaur permanent card from your hand onto the battlefield. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/didgeridoo.jpg Oracle:{3}: You may put a Minotaur permanent card from your hand onto the battlefield. diff --git a/forge-gui/res/cardsfolder/d/diminish.txt b/forge-gui/res/cardsfolder/d/diminish.txt index 2918f67fbec..104d5463fe6 100644 --- a/forge-gui/res/cardsfolder/d/diminish.txt +++ b/forge-gui/res/cardsfolder/d/diminish.txt @@ -2,6 +2,6 @@ Name:Diminish ManaCost:U Types:Instant A:SP$ Animate | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Power$ 1 | Toughness$ 1 | IsCurse$ True | SpellDescription$ Target creature has base power and toughness 1/1 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/diminish.jpg Oracle:Target creature has base power and toughness 1/1 until end of turn. diff --git a/forge-gui/res/cardsfolder/d/diminishing_returns.txt b/forge-gui/res/cardsfolder/d/diminishing_returns.txt index ec8872a6054..db8ba854e15 100644 --- a/forge-gui/res/cardsfolder/d/diminishing_returns.txt +++ b/forge-gui/res/cardsfolder/d/diminishing_returns.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ ChangeZoneAll | Cost$ 2 U U | ChangeType$ Card | Origin$ Graveyard,Hand | Destination$ Library | Shuffle$ True | Random$ True | SubAbility$ DBExile | UseAllOriginZones$ True | SpellDescription$ Each player shuffles their hand and graveyard into their library. SVar:DBExile:DB$ Mill | Defined$ You | NumCards$ 10 | Destination$ Exile | SubAbility$ DBDraw | SpellDescription$ You exile the top ten cards of your library. SVar:DBDraw:DB$ Draw | Defined$ Player | NumCards$ 7 | SpellDescription$ Then each player draws up to seven cards. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/diminishing_returns.jpg Oracle:Each player shuffles their hand and graveyard into their library. You exile the top ten cards of your library. Then each player draws up to seven cards. diff --git a/forge-gui/res/cardsfolder/d/dimir_charm.txt b/forge-gui/res/cardsfolder/d/dimir_charm.txt index 07f34dc6d16..9ed6d8539d4 100644 --- a/forge-gui/res/cardsfolder/d/dimir_charm.txt +++ b/forge-gui/res/cardsfolder/d/dimir_charm.txt @@ -5,6 +5,6 @@ A:SP$ Charm | Cost$ U B | Choices$ CounterSorcery,DBDestroy,DBDig | CharmNum$ 1 SVar:CounterSorcery:DB$ Counter | TargetType$ Spell | TgtPrompt$ Select target Sorcery spell | ValidTgts$ Sorcery | SpellDescription$ Counter target sorcery spell. SVar:DBDestroy:DB$ Destroy | ValidTgts$ Creature.powerLE2 | TgtPrompt$ Select target creature with power 2 or less. | SpellDescription$ Destroy target creature with power 2 or less. SVar:DBDig:DB$ Dig | DigNum$ 3 | ValidTgts$ Player | TgtPrompt$ Select target player | ChangeNum$ 1 | DestinationZone$ Library | LibraryPosition$ 0 | DestinationZone2$ Graveyard | SpellDescription$ Look at the top three cards of target player's library, then put one back and the rest into that player's graveyard. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dimir_charm.jpg Oracle:Choose one —\n• Counter target sorcery spell.\n• Destroy target creature with power 2 or less.\n• Look at the top three cards of target player's library, then put one back and the rest into that player's graveyard. diff --git a/forge-gui/res/cardsfolder/d/dimir_cluestone.txt b/forge-gui/res/cardsfolder/d/dimir_cluestone.txt index 5ebf4dd5935..afd8478b034 100644 --- a/forge-gui/res/cardsfolder/d/dimir_cluestone.txt +++ b/forge-gui/res/cardsfolder/d/dimir_cluestone.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. A:AB$ Draw | Cost$ U B T Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Blue|Black SVar:Picture:http://www.wizards.com/global/images/magic/general/dimir_cluestone.jpg Oracle:{T}: Add {U} or {B}.\n{U}{B}, {T}, Sacrifice Dimir Cluestone: Draw a card. diff --git a/forge-gui/res/cardsfolder/d/dimir_doppelganger.txt b/forge-gui/res/cardsfolder/d/dimir_doppelganger.txt index f12f300c4ba..8eb95e9fc7f 100644 --- a/forge-gui/res/cardsfolder/d/dimir_doppelganger.txt +++ b/forge-gui/res/cardsfolder/d/dimir_doppelganger.txt @@ -5,6 +5,6 @@ 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. SVar:DDCopy:DB$ Clone | Defined$ Remembered | GainThisAbility$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All 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. diff --git a/forge-gui/res/cardsfolder/d/dimir_keyrune.txt b/forge-gui/res/cardsfolder/d/dimir_keyrune.txt index 184f6eeb420..6bb4db0dcc8 100644 --- a/forge-gui/res/cardsfolder/d/dimir_keyrune.txt +++ b/forge-gui/res/cardsfolder/d/dimir_keyrune.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. A:AB$ Animate | Cost$ U B | Defined$ Self | Power$ 2 | Toughness$ 2 | Types$ Artifact,Creature,Horror | Colors$ Blue,Black | HiddenKeywords$ Unblockable | SpellDescription$ CARDNAME becomes a 2/2 blue and black Horror artifact creature until end of turn and can't be blocked this turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Blue|Black SVar:Picture:http://www.wizards.com/global/images/magic/general/dimir_keyrune.jpg Oracle:{T}: Add {U} or {B}.\n{U}{B}: Dimir Keyrune becomes a 2/2 blue and black Horror artifact creature until end of turn and can't be blocked this turn. diff --git a/forge-gui/res/cardsfolder/d/dimir_locket.txt b/forge-gui/res/cardsfolder/d/dimir_locket.txt index 4b1aad4c90d..94d2ab1a85f 100644 --- a/forge-gui/res/cardsfolder/d/dimir_locket.txt +++ b/forge-gui/res/cardsfolder/d/dimir_locket.txt @@ -5,5 +5,5 @@ A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. DeckNeeds:Color$Blue | Black A:AB$ Draw | Cost$ UB UB UB UB T Sac<1/CARDNAME> | NumCards$ 2 | SpellDescription$ Draw two cards. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random Oracle:{T}: Add {U} or {B}.\n{U/B}{U/B}{U/B}{U/B}, {T}, Sacrifice Dimir Locket: Draw two cards. diff --git a/forge-gui/res/cardsfolder/d/dimir_machinations.txt b/forge-gui/res/cardsfolder/d/dimir_machinations.txt index 5a31974546d..5bc14396b4a 100644 --- a/forge-gui/res/cardsfolder/d/dimir_machinations.txt +++ b/forge-gui/res/cardsfolder/d/dimir_machinations.txt @@ -3,6 +3,6 @@ ManaCost:2 B Types:Sorcery A:SP$ Dig | Cost$ 2 B | DigNum$ 3 | ValidTgts$ Player | TgtPrompt$ Select target player | AnyNumber$ True | DestinationZone$ Exile | LibraryPosition2$ 0 | SpellDescription$ Look at the top three cards of target player's library. Exile any number of those cards, then put the rest back in any order. K:Transmute:1 B B -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dimir_machinations.jpg Oracle:Look at the top three cards of target player's library. Exile any number of those cards, then put the rest back in any order.\nTransmute {1}{B}{B} ({1}{B}{B}, Discard this card: Search your library for a card with the same converted mana cost as this card, reveal it, put it into your hand, then shuffle your library. Transmute only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/d/dimir_signet.txt b/forge-gui/res/cardsfolder/d/dimir_signet.txt index e4ffbe5fce8..f21d56cc447 100644 --- a/forge-gui/res/cardsfolder/d/dimir_signet.txt +++ b/forge-gui/res/cardsfolder/d/dimir_signet.txt @@ -2,6 +2,6 @@ Name:Dimir Signet ManaCost:2 Types:Artifact A:AB$ Mana | Cost$ 1 T | Produced$ U B | SpellDescription$ Add {U}{B}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dimir_signet.jpg Oracle:{1}, {T}: Add {U}{B}. diff --git a/forge-gui/res/cardsfolder/d/dingus_egg.txt b/forge-gui/res/cardsfolder/d/dingus_egg.txt index 7af8718e14e..b35c9ba77e2 100644 --- a/forge-gui/res/cardsfolder/d/dingus_egg.txt +++ b/forge-gui/res/cardsfolder/d/dingus_egg.txt @@ -3,6 +3,6 @@ ManaCost:4 Types:Artifact T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Land | TriggerZones$ Battlefield | Execute$ TrigDamage | NoTimestampCheck$ True | TriggerDescription$ Whenever a land is put into a graveyard from the battlefield, CARDNAME deals 2 damage to that land's controller. SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredCardController | NumDmg$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dingus_egg.jpg Oracle:Whenever a land is put into a graveyard from the battlefield, Dingus Egg deals 2 damage to that land's controller. diff --git a/forge-gui/res/cardsfolder/d/dingus_staff.txt b/forge-gui/res/cardsfolder/d/dingus_staff.txt index 6ab0f2eab13..76c385088b5 100644 --- a/forge-gui/res/cardsfolder/d/dingus_staff.txt +++ b/forge-gui/res/cardsfolder/d/dingus_staff.txt @@ -3,6 +3,6 @@ ManaCost:4 Types:Artifact T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a creature dies, CARDNAME deals 2 damage to that creature's controller. SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredCardController | NumDmg$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dingus_staff.jpg Oracle:Whenever a creature dies, Dingus Staff deals 2 damage to that creature's controller. diff --git a/forge-gui/res/cardsfolder/d/dire_wolves.txt b/forge-gui/res/cardsfolder/d/dire_wolves.txt index f07d2afd5e6..f35804ca831 100644 --- a/forge-gui/res/cardsfolder/d/dire_wolves.txt +++ b/forge-gui/res/cardsfolder/d/dire_wolves.txt @@ -4,6 +4,6 @@ Types:Creature Wolf PT:2/2 S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Banding | CheckSVar$ CheckPLAINS | SVarCompare$ GE1 | Description$ CARDNAME has banding as long as you control a Plains. SVar:CheckPLAINS:Count$Valid Plains.YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dire_wolves.jpg Oracle:Dire Wolves has banding as long as you control a Plains. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/d/disallow.txt b/forge-gui/res/cardsfolder/d/disallow.txt index 078a431c783..3de361a8967 100644 --- a/forge-gui/res/cardsfolder/d/disallow.txt +++ b/forge-gui/res/cardsfolder/d/disallow.txt @@ -2,6 +2,6 @@ Name:Disallow ManaCost:1 U U Types:Instant A:SP$ Counter | Cost$ 1 U U | TargetType$ Spell,Activated,Triggered | TgtPrompt$ Select target spell or ability | ValidTgts$ Card | SpellDescription$ Counter target spell, activated ability, or triggered ability. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/disallow.jpg Oracle:Counter target spell, activated ability, or triggered ability. (Mana abilities can't be targeted.) diff --git a/forge-gui/res/cardsfolder/d/disappearing_act.txt b/forge-gui/res/cardsfolder/d/disappearing_act.txt index 6abfd6a1106..deeb826f018 100644 --- a/forge-gui/res/cardsfolder/d/disappearing_act.txt +++ b/forge-gui/res/cardsfolder/d/disappearing_act.txt @@ -2,6 +2,6 @@ Name:Disappearing Act ManaCost:1 U U Types:Instant A:SP$ Counter | Cost$ 1 U U Return<1/Permanent> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | Destination$ Graveyard | SpellDescription$ Counter target spell. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/disappearing_act.jpg Oracle:As an additional cost to cast Disappearing Act, return a permanent you control to its owner's hand.\nCounter target spell. diff --git a/forge-gui/res/cardsfolder/d/disarm.txt b/forge-gui/res/cardsfolder/d/disarm.txt index c2a246c834f..9e5756bf549 100644 --- a/forge-gui/res/cardsfolder/d/disarm.txt +++ b/forge-gui/res/cardsfolder/d/disarm.txt @@ -2,6 +2,6 @@ Name:Disarm ManaCost:U Types:Instant A:SP$ UnattachAll | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | UnattachValid$ Equipment | SpellDescription$ Unattach all Equipment from target creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/disarm.jpg Oracle:Unattach all Equipment from target creature. diff --git a/forge-gui/res/cardsfolder/d/disaster_radius.txt b/forge-gui/res/cardsfolder/d/disaster_radius.txt index edba49e4c01..eb0cec31df4 100644 --- a/forge-gui/res/cardsfolder/d/disaster_radius.txt +++ b/forge-gui/res/cardsfolder/d/disaster_radius.txt @@ -3,6 +3,6 @@ ManaCost:5 R R Types:Sorcery A:SP$ DamageAll | Cost$ 5 R R Reveal<1/Creature> | NumDmg$ X | ValidCards$ Creature.OppCtrl | ValidDescription$ each creature your opponents control. | References$ X | SpellDescription$ CARDNAME deals X damage to each creature your opponents control, where X is the revealed card's converted mana cost. SVar:X:Revealed$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/disaster_radius.jpg Oracle:As an additional cost to cast Disaster Radius, reveal a creature card from your hand.\nDisaster Radius deals X damage to each creature your opponents control, where X is the revealed card's converted mana cost. diff --git a/forge-gui/res/cardsfolder/d/disciple_of_bolas.txt b/forge-gui/res/cardsfolder/d/disciple_of_bolas.txt index 441d7a2f692..e2322581e86 100644 --- a/forge-gui/res/cardsfolder/d/disciple_of_bolas.txt +++ b/forge-gui/res/cardsfolder/d/disciple_of_bolas.txt @@ -9,6 +9,6 @@ SVar:DBDraw:DB$ Draw | NumCards$ X | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:RememberedLKI$CardPower SVar:NeedsToPlay:Creature.YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/disciple_of_bolas.jpg Oracle:When Disciple of Bolas enters the battlefield, sacrifice another creature. You gain X life and draw X cards, where X is that creature's power. diff --git a/forge-gui/res/cardsfolder/d/disciple_of_griselbrand.txt b/forge-gui/res/cardsfolder/d/disciple_of_griselbrand.txt index 98bc6cf3fe5..78f8d2d3f7e 100644 --- a/forge-gui/res/cardsfolder/d/disciple_of_griselbrand.txt +++ b/forge-gui/res/cardsfolder/d/disciple_of_griselbrand.txt @@ -4,6 +4,6 @@ Types:Creature Human Cleric PT:1/1 A:AB$ GainLife | Cost$ 1 Sac<1/Creature> | Defined$ You | LifeAmount$ X | References$ X | SpellDescription$ You gain life equal to the sacrificed creature's toughness. SVar:X:Sacrificed$CardToughness -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/disciple_of_griselbrand.jpg Oracle:{1}, Sacrifice a creature: You gain life equal to the sacrificed creature's toughness. diff --git a/forge-gui/res/cardsfolder/d/disciple_of_kangee.txt b/forge-gui/res/cardsfolder/d/disciple_of_kangee.txt index 02e86d0963d..09133de71b8 100644 --- a/forge-gui/res/cardsfolder/d/disciple_of_kangee.txt +++ b/forge-gui/res/cardsfolder/d/disciple_of_kangee.txt @@ -4,6 +4,6 @@ Types:Creature Human Wizard PT:2/2 A:AB$ Pump | Cost$ U T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying | SubAbility$ Blue | SpellDescription$ Target creature gains flying and becomes blue until end of turn. SVar:Blue:DB$ Animate | Defined$ Targeted | Colors$ Blue | OverwriteColors$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/disciple_of_kangee.jpg Oracle:{U}, {T}: Target creature gains flying and becomes blue until end of turn. diff --git a/forge-gui/res/cardsfolder/d/discombobulate.txt b/forge-gui/res/cardsfolder/d/discombobulate.txt index 91f26f4e8d4..b2f16a187f5 100644 --- a/forge-gui/res/cardsfolder/d/discombobulate.txt +++ b/forge-gui/res/cardsfolder/d/discombobulate.txt @@ -3,6 +3,6 @@ ManaCost:2 U U Types:Instant A:SP$ Counter | Cost$ 2 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | Destination$ Graveyard | SubAbility$ DBRearrange | SpellDescription$ Counter target spell. Look at the top four cards of your library, then put them back in any order. SVar:DBRearrange:DB$RearrangeTopOfLibrary | Defined$ You | NumCards$ 4 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/discombobulate.jpg Oracle:Counter target spell. Look at the top four cards of your library, then put them back in any order. diff --git a/forge-gui/res/cardsfolder/d/disharmony.txt b/forge-gui/res/cardsfolder/d/disharmony.txt index 5cdc9f033a9..68d3e384ebf 100644 --- a/forge-gui/res/cardsfolder/d/disharmony.txt +++ b/forge-gui/res/cardsfolder/d/disharmony.txt @@ -5,6 +5,6 @@ Text:Cast Disharmony only during combat before blockers are declared. A:SP$ Untap | Cost$ 2 R | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | ActivationPhases$ BeginCombat->Declare Attackers | SpellDescription$ Untap target attacking creature and remove it from combat. Gain control of that creature until end of turn. | SubAbility$ DBGainControl SVar:DBGainControl:DB$ GainControl | Defined$ Targeted | LoseControl$ EOT | SubAbility$ RemCombat SVar:RemCombat:DB$ RemoveFromCombat | Defined$ Targeted -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/disharmony.jpg Oracle:Cast Disharmony only during combat before blockers are declared.\nUntap target attacking creature and remove it from combat. Gain control of that creature until end of turn. diff --git a/forge-gui/res/cardsfolder/d/disorder.txt b/forge-gui/res/cardsfolder/d/disorder.txt index 6b237e0b734..076b8418cea 100644 --- a/forge-gui/res/cardsfolder/d/disorder.txt +++ b/forge-gui/res/cardsfolder/d/disorder.txt @@ -2,6 +2,6 @@ Name:Disorder ManaCost:1 R Types:Sorcery A:SP$ DamageAll | Cost$ 1 R | ValidCards$ Creature.White | ValidPlayers$ Player.controlsCreature.White_GE1 | NumDmg$ 2 | SpellDescription$ Disorder deals 2 damage to each white creature and each player who controls a white creature. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/disorder.jpg Oracle:Disorder deals 2 damage to each white creature and each player who controls a white creature. diff --git a/forge-gui/res/cardsfolder/d/dispatch.txt b/forge-gui/res/cardsfolder/d/dispatch.txt index c241f4a29f9..0238205baf8 100644 --- a/forge-gui/res/cardsfolder/d/dispatch.txt +++ b/forge-gui/res/cardsfolder/d/dispatch.txt @@ -5,6 +5,6 @@ A:SP$ Tap | Cost$ W | TgtPrompt$ Choose target creature | ValidTgts$ Creature | SVar:DBExile:DB$ ChangeZone | Condition$ Metalcraft | Defined$ Targeted | Origin$ Battlefield | Destination$ Exile | ConditionDescription$ If you control three or more artifacts, SVar:NeedsToPlayVar:Y GE3 SVar:Y:Count$Valid Artifact.YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dispatch.jpg Oracle:Tap target creature.\nMetalcraft — If you control three or more artifacts, exile that creature. diff --git a/forge-gui/res/cardsfolder/d/dispersal_shield.txt b/forge-gui/res/cardsfolder/d/dispersal_shield.txt index 0711241becf..9c1fbf45dec 100644 --- a/forge-gui/res/cardsfolder/d/dispersal_shield.txt +++ b/forge-gui/res/cardsfolder/d/dispersal_shield.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | ValidTgts$ Card | ConditionCheckSVar$ X | ConditionSVarCompare$ LEY | References$ X,Y | SpellDescription$ Counter target spell if its converted mana cost is less than or equal to the highest converted mana cost among permanents you control. SVar:X:Targeted$CardManaCost SVar:Y:Count$MaxCMCYouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dispersal_shield.jpg Oracle:Counter target spell if its converted mana cost is less than or equal to the highest converted mana cost among permanents you control. diff --git a/forge-gui/res/cardsfolder/d/dispersing_orb.txt b/forge-gui/res/cardsfolder/d/dispersing_orb.txt index 2ca4bb17dbe..fec3206db81 100644 --- a/forge-gui/res/cardsfolder/d/dispersing_orb.txt +++ b/forge-gui/res/cardsfolder/d/dispersing_orb.txt @@ -3,6 +3,6 @@ ManaCost:3 U U Types:Enchantment A:AB$ ChangeZone | Cost$ 3 U Sac<1/Permanent> | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target permanent to its owner's hand. SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dispersing_orb.jpg Oracle:{3}{U}, Sacrifice a permanent: Return target permanent to its owner's hand. diff --git a/forge-gui/res/cardsfolder/d/displace.txt b/forge-gui/res/cardsfolder/d/displace.txt index fdb9de69f25..8a3658781ac 100644 --- a/forge-gui/res/cardsfolder/d/displace.txt +++ b/forge-gui/res/cardsfolder/d/displace.txt @@ -4,7 +4,7 @@ Types:Instant A:SP$ ChangeZone | Cost$ 2 U | ValidTgts$ Creature.YouCtrl | TargetMin$ 0 | TargetMax$ 2 | Origin$ Battlefield | Destination$ Exile | TgtPrompt$ Select target creature you control | RememberTargets$ True | SubAbility$ DBReturn | SpellDescription$ Exile up to two target creatures you control, then return those cards to the battlefield under their owner's control. SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ All | Destination$ Battlefield | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -#TODO: The AI successfully uses this to save one of its creatures, but not two. Also, it's not used on creatures that are held with something like Arrest. May need improvement before RemAIDeck is removed. -SVar:RemAIDeck:True +#TODO: The AI successfully uses this to save one of its creatures, but not two. Also, it's not used on creatures that are held with something like Arrest. May need improvement before RemoveDeck is removed. +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/displace.jpg Oracle:Exile up to two target creatures you control, then return those cards to the battlefield under their owner's control. diff --git a/forge-gui/res/cardsfolder/d/display_of_dominance.txt b/forge-gui/res/cardsfolder/d/display_of_dominance.txt index b1f975e7535..e98943cda19 100644 --- a/forge-gui/res/cardsfolder/d/display_of_dominance.txt +++ b/forge-gui/res/cardsfolder/d/display_of_dominance.txt @@ -5,6 +5,6 @@ A:SP$ Charm | Cost$ 1 G | Choices$ DBDestroy,DBProtect SVar:DBDestroy:DB$ Destroy | ValidTgts$ Permanent.nonCreature+Blue,Permanent.nonCreature+Black | TgtPrompt$ Select target blue or black noncreature permanent | SpellDescription$ Destroy target blue or black noncreature permanent. SVar:DBProtect:DB$ Effect | Name$ Display of Dominance Effect | StaticAbilities$ STCantBeTarget | SpellDescription$ Permanents you control can't be the targets of blue or black spells your opponents control this turn. SVar:STCantBeTarget:Mode$ CantTarget | ValidCard$ Permanent.YouCtrl | ValidSource$ Card.Blue+OppCtrl,Card.Black+OppCtrl | ValidSA$ Spell | EffectZone$ Command | Description$ Permanents you control can't be the targets of blue or black spells your opponents control this turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/display_of_dominance.jpg Oracle:Choose one —\n• Destroy target blue or black noncreature permanent.\n• Permanents you control can't be the targets of blue or black spells your opponents control this turn. diff --git a/forge-gui/res/cardsfolder/d/dispossess.txt b/forge-gui/res/cardsfolder/d/dispossess.txt index b82b8cf5207..91ec2f9c501 100644 --- a/forge-gui/res/cardsfolder/d/dispossess.txt +++ b/forge-gui/res/cardsfolder/d/dispossess.txt @@ -8,6 +8,6 @@ SVar:ExileLib:DB$ ChangeZone | Origin$ Library | Destination$ Exile | DefinedPla SVar:NumInLib:TargetedPlayer$CardsInLibrary SVar:NumInHand:TargetedPlayer$CardsInHand SVar:NumInYard:TargetedPlayer$CardsInGraveyard -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dispossess.jpg Oracle:Choose an artifact card name. Search target opponent's graveyard, hand, and library for any number of cards with the chosen name and exile them. Then that player shuffles their library. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/d/disrupting_shoal.txt b/forge-gui/res/cardsfolder/d/disrupting_shoal.txt index 1b550cf7bd7..7c5a6481a83 100644 --- a/forge-gui/res/cardsfolder/d/disrupting_shoal.txt +++ b/forge-gui/res/cardsfolder/d/disrupting_shoal.txt @@ -6,6 +6,6 @@ A:SP$ Counter | Cost$ ExileFromHand<1/Card.Blue> | CostDesc$ You may exile a blu SVar:X:Count$xPaid SVar:TargetCMC:Targeted$CardManaCost SVar:Y:Exiled$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/disrupting_shoal.jpg Oracle:You may exile a blue card with converted mana cost X from your hand rather than pay Disrupting Shoal's mana cost.\nCounter target spell if its converted mana cost is X. diff --git a/forge-gui/res/cardsfolder/d/distant_melody.txt b/forge-gui/res/cardsfolder/d/distant_melody.txt index 1139ada2527..2b74c216bca 100644 --- a/forge-gui/res/cardsfolder/d/distant_melody.txt +++ b/forge-gui/res/cardsfolder/d/distant_melody.txt @@ -4,7 +4,7 @@ Types:Sorcery A:SP$ ChooseType | Cost$ 3 U | Defined$ You | Type$ Creature | SubAbility$ DBDraw | AILogic$ MostProminentComputerControls | SpellDescription$ Choose a creature type. Draw a card for each permanent you control of that type. SVar:DBDraw:DB$ Draw | NumCards$ X | References$ X SVar:X:Count$Valid Permanent.ChosenType+YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NeedsToPlay:Creature SVar:Picture:http://www.wizards.com/global/images/magic/general/distant_melody.jpg Oracle:Choose a creature type. Draw a card for each permanent you control of that type. diff --git a/forge-gui/res/cardsfolder/d/distant_memories.txt b/forge-gui/res/cardsfolder/d/distant_memories.txt index e38c133e80e..896bf34440c 100644 --- a/forge-gui/res/cardsfolder/d/distant_memories.txt +++ b/forge-gui/res/cardsfolder/d/distant_memories.txt @@ -5,6 +5,6 @@ A:SP$ ChangeZone | Cost$ 2 U U | Origin$ Library | Destination$ Exile | ChangeTy SVar:DBReturn:DB$ChangeZone | Origin$ Exile | Destination$ Hand | ChangeType$ Card.IsRemembered | Hidden$ True | Chooser$ Opponent | RememberChanged$ True | ForgetOtherRemembered$ True | SubAbility$ DBDraw SVar:DBDraw:DB$Draw | NumCards$ 3 | ConditionCheckSVar$ X | ConditionSVarCompare$ LE0 | References$ X SVar:X:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/distant_memories.jpg Oracle:Search your library for a card, exile it, then shuffle your library. Any opponent may have you put that card into your hand. If no player does, you draw three cards. diff --git a/forge-gui/res/cardsfolder/d/distorting_lens.txt b/forge-gui/res/cardsfolder/d/distorting_lens.txt index 34a9a21e9f4..fdee88cc238 100644 --- a/forge-gui/res/cardsfolder/d/distorting_lens.txt +++ b/forge-gui/res/cardsfolder/d/distorting_lens.txt @@ -3,7 +3,7 @@ ManaCost:2 Types:Artifact A:AB$ ChooseColor | Cost$ T | Defined$ You | SubAbility$ Animate | SpellDescription$ Target permanent becomes the color of your choice until end of turn. SVar:Animate:DB$ Animate | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Colors$ ChosenColor | OverwriteColors$ True -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/distorting_lens.jpg Oracle:{T}: Target permanent becomes the color of your choice until end of turn. diff --git a/forge-gui/res/cardsfolder/d/divebomber_griffin.txt b/forge-gui/res/cardsfolder/d/divebomber_griffin.txt index cdba30c65fc..ffb32385a01 100644 --- a/forge-gui/res/cardsfolder/d/divebomber_griffin.txt +++ b/forge-gui/res/cardsfolder/d/divebomber_griffin.txt @@ -4,6 +4,6 @@ Types:Creature Griffin PT:3/2 K:Flying A:AB$ DealDamage | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Creature.attacking,Creature.blocking | AITgts$ BetterThanSource | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target attacking or blocking creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/divebomber_griffin.jpg Oracle:Flying\n{T}, Sacrifice Divebomber Griffin: Divebomber Griffin deals 3 damage to target attacking or blocking creature. diff --git a/forge-gui/res/cardsfolder/d/divergent_growth.txt b/forge-gui/res/cardsfolder/d/divergent_growth.txt index 08c73d5eafe..234039cded6 100644 --- a/forge-gui/res/cardsfolder/d/divergent_growth.txt +++ b/forge-gui/res/cardsfolder/d/divergent_growth.txt @@ -3,6 +3,6 @@ ManaCost:G Types:Instant A:SP$ AnimateAll | Cost$ G | ValidCards$ Land.YouCtrl | Abilities$ ABMana | SpellDescription$ Until end of turn, lands you control gain "{T}: Add one mana of any color." SVar:ABMana:AB$ Mana | Cost$ T | Produced$ Any | SpellDescription$ Add one mana of any color. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/divergent_growth.jpg Oracle:Until end of turn, lands you control gain "{T}: Add one mana of any color." diff --git a/forge-gui/res/cardsfolder/d/diversionary_tactics.txt b/forge-gui/res/cardsfolder/d/diversionary_tactics.txt index 0054412d7c5..15f823c3966 100644 --- a/forge-gui/res/cardsfolder/d/diversionary_tactics.txt +++ b/forge-gui/res/cardsfolder/d/diversionary_tactics.txt @@ -3,6 +3,6 @@ ManaCost:3 W Types:Enchantment A:AB$ Tap | Cost$ tapXType<2/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/diversionary_tactics.jpg Oracle:Tap two untapped creatures you control: Tap target creature. diff --git a/forge-gui/res/cardsfolder/d/divert.txt b/forge-gui/res/cardsfolder/d/divert.txt index 6624157c5b0..e6d76afea22 100644 --- a/forge-gui/res/cardsfolder/d/divert.txt +++ b/forge-gui/res/cardsfolder/d/divert.txt @@ -2,6 +2,6 @@ Name:Divert ManaCost:U Types:Instant A:SP$ ChangeTargets | Cost$ U | TargetType$ Spell | ValidTgts$ Card | TargetsSingleTarget$ True | RememberTargets$ True | ForgetOtherRemembered$ True | UnlessCost$ 2 | SpellDescription$ Change the target of target spell with a single target unless that spell's controller pays {2}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/divert.jpg Oracle:Change the target of target spell with a single target unless that spell's controller pays {2}. diff --git a/forge-gui/res/cardsfolder/d/divine_intervention.txt b/forge-gui/res/cardsfolder/d/divine_intervention.txt index cfc80235634..da21aeabf89 100644 --- a/forge-gui/res/cardsfolder/d/divine_intervention.txt +++ b/forge-gui/res/cardsfolder/d/divine_intervention.txt @@ -6,6 +6,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E SVar:TrigRemoveCtr:DB$ RemoveCounter | Defined$ Self | CounterType$ INTERVENTION | CounterNum$ 1 | SubAbility$ GameIsADraw SVar:GameIsADraw:DB$ GameDrawn | ConditionPresent$ Card.Self+counters_EQ0_INTERVENTION SVar:Picture:http://www.wizards.com/global/images/magic/general/divine_intervention.jpg -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All Oracle:Divine Intervention enters the battlefield with two intervention counters on it.\nAt the beginning of your upkeep, remove an intervention counter from Divine Intervention.\nWhen you remove the last intervention counter from Divine Intervention, the game is a draw. diff --git a/forge-gui/res/cardsfolder/d/divine_light.txt b/forge-gui/res/cardsfolder/d/divine_light.txt index e951fcf527a..f5fb880ee93 100644 --- a/forge-gui/res/cardsfolder/d/divine_light.txt +++ b/forge-gui/res/cardsfolder/d/divine_light.txt @@ -3,6 +3,6 @@ ManaCost:W Types:Sorcery A:SP$ Effect | Cost$ W | Name$ Divine Light 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:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/divine_light.jpg Oracle:Prevent all damage that would be dealt this turn to creatures you control. diff --git a/forge-gui/res/cardsfolder/d/divine_presence.txt b/forge-gui/res/cardsfolder/d/divine_presence.txt index a36c464a405..6f9ee4a7b94 100644 --- a/forge-gui/res/cardsfolder/d/divine_presence.txt +++ b/forge-gui/res/cardsfolder/d/divine_presence.txt @@ -5,6 +5,6 @@ R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Permanent,Player | SVar:Dmg3:DB$ ReplaceEffect | VarName$ DamageAmount | VarValue$ 3 SVar:NonStackingEffect:True SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/divine_presence.jpg Oracle:If a source would deal 4 or more damage to a permanent or player, that source deals 3 damage to that permanent or player instead. diff --git a/forge-gui/res/cardsfolder/d/divine_reckoning.txt b/forge-gui/res/cardsfolder/d/divine_reckoning.txt index 5d126a87a6e..02e1b453560 100644 --- a/forge-gui/res/cardsfolder/d/divine_reckoning.txt +++ b/forge-gui/res/cardsfolder/d/divine_reckoning.txt @@ -6,6 +6,6 @@ A:SP$ RepeatEach | Cost$ 2 W W | AILogic$ OpponentHasMultipleCreatures | RepeatP SVar:DBChoose:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Creature.RememberedPlayerCtrl | Mandatory$ True | RememberChosen$ True SVar:DBDestroyAll:DB$ DestroyAll | ValidCards$ Creature.IsNotRemembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/divine_reckoning.jpg Oracle:Each player chooses a creature they control. Destroy the rest.\nFlashback {5}{W}{W} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/d/divining_witch.txt b/forge-gui/res/cardsfolder/d/divining_witch.txt index b279d079979..774d5f0db8c 100644 --- a/forge-gui/res/cardsfolder/d/divining_witch.txt +++ b/forge-gui/res/cardsfolder/d/divining_witch.txt @@ -5,6 +5,6 @@ PT:1/1 A:AB$ NameCard | Cost$ 1 B T Discard<1/Card> | Defined$ You | SubAbility$ DBMill | SpellDescription$ Choose a card name. Exile the top six cards of your library, then reveal cards from the top of your library until you reveal a card with the chosen name. Put that card into your hand and exile all other cards revealed this way. SVar:DBMill:DB$ Mill | Defined$ You | NumCards$ 6 | Destination$ Exile | SubAbility$ DBDigUntil SVar:DBDigUntil:DB$ DigUntil | Valid$ Card.NamedCard | FoundDestination$ Hand | RevealedDestination$ Exile | ValidDescription$ named card -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://serv1.tcgimages.eu/img/cards/Nemesis/divining_witch.jpg Oracle:{1}{B}, {T}, Discard a card: Choose a card name. Exile the top six cards of your library, then reveal cards from the top of your library until you reveal a card with the chosen name. Put that card into your hand and exile all other cards revealed this way. diff --git a/forge-gui/res/cardsfolder/d/dizzy_spell.txt b/forge-gui/res/cardsfolder/d/dizzy_spell.txt index a67d5d1227c..22f78244242 100644 --- a/forge-gui/res/cardsfolder/d/dizzy_spell.txt +++ b/forge-gui/res/cardsfolder/d/dizzy_spell.txt @@ -3,7 +3,7 @@ ManaCost:U Types:Instant A:SP$ Pump | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -3 | IsCurse$ True | SpellDescription$ Target creature gets -3/-0 until end of turn. K:Transmute:1 U U -#TODO: The AI doesn't seem to use transmute, but otherwise uses this card just fine. Maybe need to improve the Transmute part before removing RemAIDeck. -SVar:RemAIDeck:True +#TODO: The AI doesn't seem to use transmute, but otherwise uses this card just fine. Maybe need to improve the Transmute part before removing RemoveDeck. +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dizzy_spell.jpg Oracle:Target creature gets -3/-0 until end of turn.\nTransmute {1}{U}{U} ({1}{U}{U}, Discard this card: Search your library for a card with the same converted mana cost as this card, reveal it, put it into your hand, then shuffle your library. Transmute only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/d/djinn_illuminatus.txt b/forge-gui/res/cardsfolder/d/djinn_illuminatus.txt index 7b38463d68d..cf02c158cb2 100644 --- a/forge-gui/res/cardsfolder/d/djinn_illuminatus.txt +++ b/forge-gui/res/cardsfolder/d/djinn_illuminatus.txt @@ -4,6 +4,6 @@ Types:Creature Djinn PT:3/5 K:Flying K:Each instant and sorcery spell you cast has replicate. The replicate cost is equal to its mana cost. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/djinn_illuminatus.jpg Oracle:Flying\nEach instant and sorcery spell you cast has replicate. The replicate cost is equal to its mana cost. (When you cast it, copy it for each time you paid its replicate cost. You may choose new targets for the copies.) diff --git a/forge-gui/res/cardsfolder/d/djinn_of_infinite_deceits.txt b/forge-gui/res/cardsfolder/d/djinn_of_infinite_deceits.txt index a1bcd207a1d..eb933cdd501 100644 --- a/forge-gui/res/cardsfolder/d/djinn_of_infinite_deceits.txt +++ b/forge-gui/res/cardsfolder/d/djinn_of_infinite_deceits.txt @@ -4,6 +4,6 @@ Types:Creature Djinn PT:2/7 K:Flying A:AB$ ExchangeControl | Cost$ T | ValidTgts$ Creature.nonLegendary | TgtPrompt$ Select target nonlegendary creature | TargetMin$ 2 | TargetMax$ 2 | ActivationPhases$ Upkeep,Draw,Main1,Main2,End of Turn | SpellDescription$ Exchange control of two target nonlegendary creatures. You can't activate this ability during combat. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/djinn_of_infinite_deceits.jpg Oracle:Flying\n{T}: Exchange control of two target nonlegendary creatures. You can't activate this ability during combat. diff --git a/forge-gui/res/cardsfolder/d/djinn_of_wishes.txt b/forge-gui/res/cardsfolder/d/djinn_of_wishes.txt index 4176076c85b..219048730e3 100644 --- a/forge-gui/res/cardsfolder/d/djinn_of_wishes.txt +++ b/forge-gui/res/cardsfolder/d/djinn_of_wishes.txt @@ -9,6 +9,6 @@ SVar:DBPlayIT:DB$ Play | Defined$ Remembered | Controller$ You | WithoutManaCost SVar:DBExileIfNotPlayed:DB$ ChangeZone | Origin$ Library | Destination$ Exile | Defined$ Remembered | DefinedPlayer$ You | ConditionCheckSVar$ DjinnX | ConditionSVarCompare$ EQ1 | SubAbility$ DBDjinnCleanup | References$ DjinnX SVar:DBDjinnCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DjinnX:Remembered$Valid Card.IsRemembered -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/djinn_of_wishes.jpg Oracle:Flying\nDjinn of Wishes enters the battlefield with three wish counters on it.\n{2}{U}{U}, Remove a wish counter from Djinn of Wishes: Reveal the top card of your library. You may play that card without paying its mana cost. If you don't, exile it. diff --git a/forge-gui/res/cardsfolder/d/dogpile.txt b/forge-gui/res/cardsfolder/d/dogpile.txt index 5664be632f8..a1f2af09288 100644 --- a/forge-gui/res/cardsfolder/d/dogpile.txt +++ b/forge-gui/res/cardsfolder/d/dogpile.txt @@ -3,6 +3,6 @@ ManaCost:3 R Types:Instant A:SP$ DealDamage | Cost$ 3 R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals damage to any target equal to the number of attacking creatures you control. SVar:X:Count$Valid Creature.attacking+YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dogpile.jpg Oracle:Dogpile deals damage to any target equal to the number of attacking creatures you control. diff --git a/forge-gui/res/cardsfolder/d/dominarias_judgment.txt b/forge-gui/res/cardsfolder/d/dominarias_judgment.txt index 0396c5383c0..173fa85d309 100644 --- a/forge-gui/res/cardsfolder/d/dominarias_judgment.txt +++ b/forge-gui/res/cardsfolder/d/dominarias_judgment.txt @@ -6,6 +6,6 @@ SVar:DBBlue:DB$PumpAll | ValidCards$ Creature.YouCtrl | KW$ Protection from blue SVar:DBBlack:DB$PumpAll | ValidCards$ Creature.YouCtrl | KW$ Protection from black | ConditionPresent$ Swamp.YouCtrl | ConditionCompare$ GE1 | ConditionDescription$ If you control an Swamp, | SubAbility$ DBRed SVar:DBRed:DB$PumpAll | ValidCards$ Creature.YouCtrl | KW$ Protection from red | ConditionPresent$ Mountain.YouCtrl | ConditionCompare$ GE1 | ConditionDescription$ If you control an Mountain, | SubAbility$ DBGreen SVar:DBGreen:DB$PumpAll | ValidCards$ Creature.YouCtrl | KW$ Protection from green | ConditionPresent$ Forest.YouCtrl | ConditionCompare$ GE1 | ConditionDescription$ If you control an Forest, -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dominarias_judgment.jpg Oracle:Until end of turn, creatures you control gain protection from white if you control a Plains, from blue if you control an Island, from black if you control a Swamp, from red if you control a Mountain, and from green if you control a Forest. diff --git a/forge-gui/res/cardsfolder/d/dominate.txt b/forge-gui/res/cardsfolder/d/dominate.txt index 27835f1961f..37217cf7989 100644 --- a/forge-gui/res/cardsfolder/d/dominate.txt +++ b/forge-gui/res/cardsfolder/d/dominate.txt @@ -3,6 +3,6 @@ ManaCost:X 1 U U Types:Instant A:SP$ GainControl | Cost$ X 1 U U | Announce$ X | ValidTgts$ Creature.cmcLEX | TgtPrompt$ Select target creature | References$ X | SpellDescription$ Gain control of target creature with converted mana cost X or less. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dominate.jpg Oracle:Gain control of target creature with converted mana cost X or less. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/d/dominating_licid.txt b/forge-gui/res/cardsfolder/d/dominating_licid.txt index 93fe235b55e..b432c621160 100644 --- a/forge-gui/res/cardsfolder/d/dominating_licid.txt +++ b/forge-gui/res/cardsfolder/d/dominating_licid.txt @@ -6,6 +6,6 @@ A:AB$ Animate | Cost$ 1 U U T | Defined$ Self | RemoveThisAbility$ True | Perman SVar:DBAttach:DB$ Attach | ValidTgts$ Creature | AILogic$ GainControl SVar:SPAttach:SP$ Attach | Cost$ 0 | ValidTgts$ Creature S:Mode$ Continuous | Affected$ Card.EnchantedBy | GainControl$ You | Description$ You control enchanted creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dominating_licid.jpg Oracle:{1}{U}{U}, {T}: Dominating Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {U} to end this effect.\nYou control enchanted creature. diff --git a/forge-gui/res/cardsfolder/d/domineering_will.txt b/forge-gui/res/cardsfolder/d/domineering_will.txt index 761cd0019fc..53f1ccb63d1 100644 --- a/forge-gui/res/cardsfolder/d/domineering_will.txt +++ b/forge-gui/res/cardsfolder/d/domineering_will.txt @@ -3,6 +3,6 @@ ManaCost:3 U Types:Instant A:SP$ Pump | Cost$ 3 U | ValidTgts$ Player | StackDescription$ None | SubAbility$ DBGainControl | SpellDescription$ Target player gains control of up to three target nonattacking creatures until end of turn. Untap those creatures. They block this turn if able. SVar:DBGainControl:DB$ GainControl | ValidTgts$ Creature.notattacking | TgtPrompt$ Select target nonattacking creature | AddKWs$ HIDDEN CARDNAME blocks each combat if able. | LoseControl$ EOT | TargetMin$ 0 | TargetMax$ 3 | NewController$ ParentTarget | Untap$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/domineering_will.jpg Oracle:Target player gains control of up to three target nonattacking creatures until end of turn. Untap those creatures. They block this turn if able. diff --git a/forge-gui/res/cardsfolder/d/donate.txt b/forge-gui/res/cardsfolder/d/donate.txt index 7ba82d5f6da..300b9a1c267 100644 --- a/forge-gui/res/cardsfolder/d/donate.txt +++ b/forge-gui/res/cardsfolder/d/donate.txt @@ -6,7 +6,7 @@ SVar:D1:DB$ Pump | RememberObjects$ Targeted | Static$ True | SubAbility$ D2 | S SVar:D2:DB$ Pump | ValidTgts$ Permanent.YouCtrl | TgtPrompt$ Select target permanent you control | SubAbility$ D3 | AILogic$ DonateTargetPerm | StackDescription$ None SVar:D3:DB$ GainControl | Defined$ Targeted | NewController$ Remembered | SubAbility$ D4 SVar:D4:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:DoNotDiscardIfAble:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/donate.jpg Oracle:Target player gains control of target permanent you control. diff --git a/forge-gui/res/cardsfolder/d/doomgape.txt b/forge-gui/res/cardsfolder/d/doomgape.txt index e85a3dda3f4..5fae49f3e46 100644 --- a/forge-gui/res/cardsfolder/d/doomgape.txt +++ b/forge-gui/res/cardsfolder/d/doomgape.txt @@ -10,6 +10,6 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:RememberedLKI$CardToughness SVar:NeedsToPlayVar:Z GE2 SVar:Z:Count$Valid Creature.YouCtrl+inZoneBattlefield -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/doomgape.jpg Oracle:Trample\nAt the beginning of your upkeep, sacrifice a creature. You gain life equal to that creature's toughness. diff --git a/forge-gui/res/cardsfolder/d/doomsday.txt b/forge-gui/res/cardsfolder/d/doomsday.txt index bb6f94bd072..d37d770b8e0 100644 --- a/forge-gui/res/cardsfolder/d/doomsday.txt +++ b/forge-gui/res/cardsfolder/d/doomsday.txt @@ -8,6 +8,6 @@ SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ Y | References$ Y | SubAbility$ DBCle SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$InYourLibrary SVar:Y:Count$YourLifeTotal/HalfUp -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/doomsday.jpg Oracle:Search your library and graveyard for five cards and exile the rest. Put the chosen cards on top of your library in any order. You lose half your life, rounded up. diff --git a/forge-gui/res/cardsfolder/d/door_of_destinies.txt b/forge-gui/res/cardsfolder/d/door_of_destinies.txt index 311754efacb..20d65891fc6 100644 --- a/forge-gui/res/cardsfolder/d/door_of_destinies.txt +++ b/forge-gui/res/cardsfolder/d/door_of_destinies.txt @@ -8,6 +8,6 @@ SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ CHARGE | Counte S:Mode$ Continuous | Affected$ Creature.ChosenType+YouCtrl | AddPower$ X | AddToughness$ X | Description$ Creatures you control of the chosen type get +1/+1 for each charge counter on CARDNAME. SVar:X:Count$CardCounters.CHARGE SVar:BuffedBy:Creature -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/door_of_destinies.jpg Oracle:As Door of Destinies enters the battlefield, choose a creature type.\nWhenever you cast a spell of the chosen type, put a charge counter on Door of Destinies.\nCreatures you control of the chosen type get +1/+1 for each charge counter on Door of Destinies. diff --git a/forge-gui/res/cardsfolder/d/door_to_nothingness.txt b/forge-gui/res/cardsfolder/d/door_to_nothingness.txt index 4cd1d905923..694e6c9cba4 100644 --- a/forge-gui/res/cardsfolder/d/door_to_nothingness.txt +++ b/forge-gui/res/cardsfolder/d/door_to_nothingness.txt @@ -3,6 +3,6 @@ ManaCost:5 Types:Artifact K:CARDNAME enters the battlefield tapped. A:AB$ LosesGame | Cost$ W W U U B B R R G G T Sac<1/CARDNAME> | ValidTgts$ Player | TgtPrompt$ Select target player | SpellDescription$ Target player loses the game. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/door_to_nothingness.jpg Oracle:Door to Nothingness enters the battlefield tapped.\n{W}{W}{U}{U}{B}{B}{R}{R}{G}{G}, {T}, Sacrifice Door to Nothingness: Target player loses the game. diff --git a/forge-gui/res/cardsfolder/d/doubling_chant.txt b/forge-gui/res/cardsfolder/d/doubling_chant.txt index 262c7752712..4a3990c356f 100644 --- a/forge-gui/res/cardsfolder/d/doubling_chant.txt +++ b/forge-gui/res/cardsfolder/d/doubling_chant.txt @@ -6,6 +6,6 @@ SVar:DBSearch:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | Chan SVar:DBShuffle:DB$ Shuffle | Defined$ You | StackDescription$ None SVar:NeedsToPlayVar:Z GE2 SVar:Z:Count$Valid Creature.YouCtrl+inZoneBattlefield -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/doubling_chant.jpg Oracle:For each creature you control, you may search your library for a creature card with the same name as that creature. Put those cards onto the battlefield, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/d/doubling_cube.txt b/forge-gui/res/cardsfolder/d/doubling_cube.txt index 96e2d1050be..1f505f864dc 100644 --- a/forge-gui/res/cardsfolder/d/doubling_cube.txt +++ b/forge-gui/res/cardsfolder/d/doubling_cube.txt @@ -2,6 +2,6 @@ Name:Doubling Cube ManaCost:2 Types:Artifact A:AB$ Mana | Cost$ 3 T | DoubleManaInPool$ True | ProduceNoOtherMana$ True | SpellDescription$ Double the amount of each type of unspent mana you have. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/doubling_cube.jpg Oracle:{3}, {T}: Double the amount of each type of unspent mana you have. diff --git a/forge-gui/res/cardsfolder/d/douse.txt b/forge-gui/res/cardsfolder/d/douse.txt index 71b02b9534c..821cec31f15 100644 --- a/forge-gui/res/cardsfolder/d/douse.txt +++ b/forge-gui/res/cardsfolder/d/douse.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Enchantment A:AB$ Counter | Cost$ 1 U | TargetType$ Spell | ValidTgts$ Card.Red | TgtPrompt$ Select target Red Spell | SpellDescription$ Counter target red spell. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/douse.jpg Oracle:{1}{U}: Counter target red spell. diff --git a/forge-gui/res/cardsfolder/d/drafnas_restoration.txt b/forge-gui/res/cardsfolder/d/drafnas_restoration.txt index 5c4a130f146..a6f600bcd53 100644 --- a/forge-gui/res/cardsfolder/d/drafnas_restoration.txt +++ b/forge-gui/res/cardsfolder/d/drafnas_restoration.txt @@ -4,7 +4,7 @@ Types:Sorcery A:SP$ Pump | Cost$ U | ValidTgts$ Player | TgtPrompt$ Select target Player | SubAbility$ DBChangeZone | IsCurse$ True | SpellDescription$ Put any number of target artifact cards from target player's graveyard on top of their library in any order. SVar:DBChangeZone:DB$ ChangeZone | TargetMin$ 0 | TargetMax$ X | TargetsWithDefinedController$ ParentTarget | Origin$ Graveyard | Destination$ Library | TgtPrompt$ Choose target artifact card | ValidTgts$ Artifact | References$ X SVar:X:Count$InAllYards -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/drafnas_restoration.jpg Oracle:Put any number of target artifact cards from target player's graveyard on top of their library in any order. diff --git a/forge-gui/res/cardsfolder/d/dragon_appeasement.txt b/forge-gui/res/cardsfolder/d/dragon_appeasement.txt index fd28b138123..4f070eee718 100644 --- a/forge-gui/res/cardsfolder/d/dragon_appeasement.txt +++ b/forge-gui/res/cardsfolder/d/dragon_appeasement.txt @@ -4,6 +4,6 @@ Types:Enchantment S:Mode$ Continuous | Affected$ You | AddKeyword$ Skip your draw step. | Description$ Skip your draw step. T:Mode$ Sacrificed | ValidCard$ Creature.YouCtrl | Execute$ TrigDrawCard | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ Whenever you sacrifice a creature, you may draw a card. SVar:TrigDrawCard:DB$Draw | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dragon_appeasement.jpg Oracle:Skip your draw step.\nWhenever you sacrifice a creature, you may draw a card. diff --git a/forge-gui/res/cardsfolder/d/dragon_arch.txt b/forge-gui/res/cardsfolder/d/dragon_arch.txt index 5156878d9b8..fa0299fa71b 100644 --- a/forge-gui/res/cardsfolder/d/dragon_arch.txt +++ b/forge-gui/res/cardsfolder/d/dragon_arch.txt @@ -2,6 +2,6 @@ Name:Dragon Arch ManaCost:5 Types:Artifact A:AB$ ChangeZone | Cost$ 2 T | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature.MultiColor | ChangeNum$ 1 | SpellDescription$ You may put a multicolored creature card from your hand onto the battlefield. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dragon_arch.jpg Oracle:{2}, {T}: You may put a multicolored creature card from your hand onto the battlefield. diff --git a/forge-gui/res/cardsfolder/d/dragon_mask.txt b/forge-gui/res/cardsfolder/d/dragon_mask.txt index 049510d630c..39b1c5a9480 100644 --- a/forge-gui/res/cardsfolder/d/dragon_mask.txt +++ b/forge-gui/res/cardsfolder/d/dragon_mask.txt @@ -5,6 +5,6 @@ A:AB$ Pump | Cost$ 3 T | NumAtt$ 2 | NumDef$ 2 | ValidTgts$ Creature.YouCtrl | T SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | Secondary$ True | RememberObjects$ ParentTarget | SpellDescription$ Return creature to owner's hand | SubAbility$ DBCleanup SVar:TrigReturn:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Defined$ DelayTriggerRemembered SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dragon_mask.jpg Oracle:{3}, {T}: Target creature you control gets +2/+2 until end of turn. Return it to its owner's hand at the beginning of the next end step. (Return it only if it's on the battlefield.) diff --git a/forge-gui/res/cardsfolder/d/dragon_throne_of_tarkir.txt b/forge-gui/res/cardsfolder/d/dragon_throne_of_tarkir.txt index 8d1e2a7f013..95739686384 100644 --- a/forge-gui/res/cardsfolder/d/dragon_throne_of_tarkir.txt +++ b/forge-gui/res/cardsfolder/d/dragon_throne_of_tarkir.txt @@ -5,6 +5,6 @@ K:Equip:3 S:Mode$ Continuous | Affected$ Card.EquippedBy | AddKeyword$ Defender | AddAbility$ ThroneTarkir | AddSVar$ ThroneTarkirX | Description$ Equipped creature has defender and "{2}, {T}: Other creatures you control gain trample and get +X/+X until end of turn, where X is this creature's power." SVar:ThroneTarkir:AB$ PumpAll | Cost$ 2 T | ValidCards$ Creature.Other+YouCtrl | NumAtt$ ThroneTarkirX | NumDef$ ThroneTarkirX | KW$ Trample | References$ ThroneTarkirX | SpellDescription$ Other creatures you control gain trample and get +X/+X until end of turn, where X is CARDNAME's power. SVar:ThroneTarkirX:Count$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dragon_throne_of_tarkir.jpg Oracle:Equipped creature has defender and "{2}, {T}: Other creatures you control gain trample and get +X/+X until end of turn, where X is this creature's power."\nEquip {3} diff --git a/forge-gui/res/cardsfolder/d/dragonrage.txt b/forge-gui/res/cardsfolder/d/dragonrage.txt index 9dac518384f..3b55487179f 100644 --- a/forge-gui/res/cardsfolder/d/dragonrage.txt +++ b/forge-gui/res/cardsfolder/d/dragonrage.txt @@ -5,6 +5,6 @@ A:SP$ Mana | Cost$ 2 R | Produced$ R | Amount$ X | References$ X | SubAbility$ D SVar:X:Count$Valid Creature.YouCtrl+attacking SVar:DBAnimateAll:DB$ AnimateAll | ValidCards$ Creature.YouCtrl+attacking | Abilities$ DrAbs SVar:DrAbs:AB$ Pump | Cost$ R | NumAtt$ 1 | SpellDescription$ This creature gets +1/+0 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dragonrage.jpg Oracle:Add {R} for each attacking creature you control. Until end of turn, attacking creatures you control gain "{R}: This creature gets +1/+0 until end of turn." diff --git a/forge-gui/res/cardsfolder/d/dragons_claw.txt b/forge-gui/res/cardsfolder/d/dragons_claw.txt index 29d49e39958..7d14ea2b910 100644 --- a/forge-gui/res/cardsfolder/d/dragons_claw.txt +++ b/forge-gui/res/cardsfolder/d/dragons_claw.txt @@ -3,7 +3,7 @@ ManaCost:2 Types:Artifact T:Mode$ SpellCast | ValidCard$ Card.Red | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever a player casts a red spell, you may gain 1 life. SVar:TrigGainLife:DB$GainLife | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Red SVar:Picture:http://www.wizards.com/global/images/magic/general/dragons_claw.jpg Oracle:Whenever a player casts a red spell, you may gain 1 life. diff --git a/forge-gui/res/cardsfolder/d/dragonshift.txt b/forge-gui/res/cardsfolder/d/dragonshift.txt index 1ac5c20c3db..07c2a336fd3 100644 --- a/forge-gui/res/cardsfolder/d/dragonshift.txt +++ b/forge-gui/res/cardsfolder/d/dragonshift.txt @@ -3,6 +3,6 @@ ManaCost:1 U R Types:Instant A:SP$ Animate | Cost$ 1 U R | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature | Power$ 4 | Toughness$ 4 | Keywords$ Flying | RemoveAllAbilities$ True | Colors$ Blue,Red | OverwriteColors$ True | Types$ Dragon | RemoveCreatureTypes$ True | SpellDescription$ Until end of turn, target creature you control becomes a blue and red Dragon with base power and toughness 4/4, loses all abilites, and gains flying. A:SP$ AnimateAll | Cost$ 3 U U R R | ValidCards$ Creature.YouCtrl | Power$ 4 | Toughness$ 4 | Keywords$ Flying | RemoveAllAbilities$ True | Colors$ Blue,Red | OverwriteColors$ True | Types$ Dragon | RemoveCreatureTypes$ True | PrecostDesc$ Overload | CostDesc$ {3}{U}{U}{R}{R} | NonBasicSpell$ True | SpellDescription$ (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") | StackDescription$ Until end of turn, each creature you control becomes a blue and red Dragon with base power and toughness 4/4, loses all abilites, and gains flying. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dragonshift.jpg Oracle:Until end of turn, target creature you control becomes a blue and red Dragon with base power and toughness 4/4, loses all abilities, and gains flying.\nOverload {3}{U}{U}{R}{R} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") diff --git a/forge-gui/res/cardsfolder/d/dragonstorm.txt b/forge-gui/res/cardsfolder/d/dragonstorm.txt index 28838b44546..6bd79506d07 100644 --- a/forge-gui/res/cardsfolder/d/dragonstorm.txt +++ b/forge-gui/res/cardsfolder/d/dragonstorm.txt @@ -3,6 +3,6 @@ ManaCost:8 R Types:Sorcery A:SP$ ChangeZone | Cost$ 8 R | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Dragon | ChangeNum$ 1 | SpellDescription$ Search your library for a Dragon permanent card, put it onto the battlefield, then shuffle your library. K:Storm -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dragonstorm.jpg Oracle:Search your library for a Dragon permanent card, put it onto the battlefield, then shuffle your library.\nStorm (When you cast this spell, copy it for each spell cast before it this turn.) diff --git a/forge-gui/res/cardsfolder/d/drake_skull_cameo.txt b/forge-gui/res/cardsfolder/d/drake_skull_cameo.txt index a504ad9d475..5c6188bb1ee 100644 --- a/forge-gui/res/cardsfolder/d/drake_skull_cameo.txt +++ b/forge-gui/res/cardsfolder/d/drake_skull_cameo.txt @@ -3,7 +3,7 @@ ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Blue|Black SVar:Picture:http://www.wizards.com/global/images/magic/general/drake_skull_cameo.jpg Oracle:{T}: Add {U} or {B}. diff --git a/forge-gui/res/cardsfolder/d/dralnu_lich_lord.txt b/forge-gui/res/cardsfolder/d/dralnu_lich_lord.txt index 145407f07d3..1b059e6d712 100644 --- a/forge-gui/res/cardsfolder/d/dralnu_lich_lord.txt +++ b/forge-gui/res/cardsfolder/d/dralnu_lich_lord.txt @@ -6,6 +6,6 @@ R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | Replac SVar:Sac:DB$Sacrifice | Defined$ You | SacValid$ Permanent | SacMessage$ Permanent | Amount$ X | References$ X SVar:X:ReplaceCount$DamageAmount A:AB$Pump | Cost$ T | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | KW$ Flashback | TgtZone$ Graveyard | PumpZone$ Graveyard | SpellDescription$ Target instant or sorcery card in your graveyard gains flashback until end of turn. The flashback cost is equal to its mana cost. (You may cast that card from your graveyard for its flashback cost. Then exile it.) -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dralnu_lich_lord.jpg Oracle:If damage would be dealt to Dralnu, Lich Lord, sacrifice that many permanents instead.\n{T}: Target instant or sorcery card in your graveyard gains flashback until end of turn. The flashback cost is equal to its mana cost. (You may cast that card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/d/dralnus_crusade.txt b/forge-gui/res/cardsfolder/d/dralnus_crusade.txt index b5e84b8f27f..d7bad214f72 100644 --- a/forge-gui/res/cardsfolder/d/dralnus_crusade.txt +++ b/forge-gui/res/cardsfolder/d/dralnus_crusade.txt @@ -3,6 +3,6 @@ ManaCost:1 B R Types:Enchantment S:Mode$ Continuous | Affected$ Creature.Goblin | AddPower$ 1 | AddToughness$ 1 | Description$ Goblin creatures get +1/+1. S:Mode$ Continuous | Affected$ Goblin | AddType$ Zombie | SetColor$ Black | Description$ All Goblins are black and are Zombies in addition to their other creature types. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dralnus_crusade.jpg Oracle:Goblin creatures get +1/+1.\nAll Goblins are black and are Zombies in addition to their other creature types. diff --git a/forge-gui/res/cardsfolder/d/dralnus_pet.txt b/forge-gui/res/cardsfolder/d/dralnus_pet.txt index cf222065acf..57ad907cc92 100644 --- a/forge-gui/res/cardsfolder/d/dralnus_pet.txt +++ b/forge-gui/res/cardsfolder/d/dralnus_pet.txt @@ -8,7 +8,7 @@ SVar:DBPump:DB$ Animate | Defined$ Self | Keywords$ Flying | Permanent$ True | S SVar:DBPutCounter:DB$ PutCounter | ETB$ True | Defined$ Self | CounterType$ P1P1 | CounterNum$ KickedPet | References$ KickedPet | SubAbility$ DBMoveToPlay SVar:DBMoveToPlay:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard SVar:KickedPet:Discarded$CardManaCost -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Color$Black DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/dralnus_pet.jpg diff --git a/forge-gui/res/cardsfolder/d/dramatic_entrance.txt b/forge-gui/res/cardsfolder/d/dramatic_entrance.txt index a2968538c83..81b8afe7530 100644 --- a/forge-gui/res/cardsfolder/d/dramatic_entrance.txt +++ b/forge-gui/res/cardsfolder/d/dramatic_entrance.txt @@ -2,6 +2,6 @@ Name:Dramatic Entrance ManaCost:3 G G Types:Instant A:SP$ ChangeZone | Cost$ 3 G G | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature.Green | ChangeNum$ 1 | SpellDescription$ You may put a green creature card from your hand onto the battlefield. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dramatic_entrance.jpg Oracle:You may put a green creature card from your hand onto the battlefield. diff --git a/forge-gui/res/cardsfolder/d/dread_charge.txt b/forge-gui/res/cardsfolder/d/dread_charge.txt index fa4e27f81f2..4b12ca86d01 100644 --- a/forge-gui/res/cardsfolder/d/dread_charge.txt +++ b/forge-gui/res/cardsfolder/d/dread_charge.txt @@ -3,6 +3,6 @@ ManaCost:3 B Types:Sorcery A:SP$ Effect | Cost$ 3 B | Name$ Dread Charge Effect | StaticAbilities$ KWPump | SpellDescription$ Black creatures you control can't be blocked this turn except by black creatures. SVar:KWPump:Mode$ CantBlockBy | ValidAttacker$ Creature.Black+YouCtrl | ValidBlocker$ Creature.nonBlack | EffectZone$ Command | Description$ Black creatures you control can't be blocked this turn except by black creatures. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dread_charge.jpg Oracle:Black creatures you control can't be blocked this turn except by black creatures. diff --git a/forge-gui/res/cardsfolder/d/dread_of_night.txt b/forge-gui/res/cardsfolder/d/dread_of_night.txt index a59b43d9364..a7259876b3e 100644 --- a/forge-gui/res/cardsfolder/d/dread_of_night.txt +++ b/forge-gui/res/cardsfolder/d/dread_of_night.txt @@ -2,6 +2,6 @@ Name:Dread of Night ManaCost:B Types:Enchantment S:Mode$ Continuous | Affected$ Creature.White | AddPower$ -1 | AddToughness$ -1 | Description$ White creatures get -1/-1. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dread_of_night.jpg Oracle:White creatures get -1/-1. diff --git a/forge-gui/res/cardsfolder/d/dreadship_reef.txt b/forge-gui/res/cardsfolder/d/dreadship_reef.txt index 7abfbb3e7c5..855bf9ca607 100644 --- a/forge-gui/res/cardsfolder/d/dreadship_reef.txt +++ b/forge-gui/res/cardsfolder/d/dreadship_reef.txt @@ -5,6 +5,6 @@ A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ PutCounter | Cost$ 1 T | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME. A:AB$ Mana | Cost$ 1 SubCounter | Produced$ Combo U B | Amount$ ChosenX | CostDesc$ {1}, Remove X storage counters from CARDNAME: | References$ X | SpellDescription$ Add X mana in any combination of {U} and/or {B}. SVar:X:XChoice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dreadship_reef.jpg Oracle:{T}: Add {C}.\n{1}, {T}: Put a storage counter on Dreadship Reef.\n{1}, Remove X storage counters from Dreadship Reef: Add X mana in any combination of {U} and/or {B}. diff --git a/forge-gui/res/cardsfolder/d/dream_chisel.txt b/forge-gui/res/cardsfolder/d/dream_chisel.txt index a52e6984e2b..2eafc7ab898 100644 --- a/forge-gui/res/cardsfolder/d/dream_chisel.txt +++ b/forge-gui/res/cardsfolder/d/dream_chisel.txt @@ -2,6 +2,6 @@ Name:Dream Chisel ManaCost:2 Types:Artifact S:Mode$ ReduceCost | ValidCard$ Creature | Type$ MorphDown | Activator$ You | Amount$ 1 | Description$ Face-down creature spells you cast cost {1} less to cast. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dream_chisel.jpg Oracle:Face-down creature spells you cast cost {1} less to cast. diff --git a/forge-gui/res/cardsfolder/d/dream_coat.txt b/forge-gui/res/cardsfolder/d/dream_coat.txt index 710eaa5769a..efde8cd3a29 100644 --- a/forge-gui/res/cardsfolder/d/dream_coat.txt +++ b/forge-gui/res/cardsfolder/d/dream_coat.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ U | ValidTgts$ Creature | AILogic$ Pump A:AB$ ChooseColor | Cost$ 0 | Defined$ You | OrColors$ True | ActivationLimit$ 1 | SubAbility$ DBAnimate | SpellDescription$ Enchanted creature becomes the color or colors of your choice. Activate this ability only once each turn. SVar:DBAnimate:DB$ Animate | Colors$ ChosenColor | OverwriteColors$ True | Defined$ Enchanted | Permanent$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dream_coat.jpg Oracle:Enchant creature\n{0}: Enchanted creature becomes the color or colors of your choice. Activate this ability only once each turn. diff --git a/forge-gui/res/cardsfolder/d/dream_halls.txt b/forge-gui/res/cardsfolder/d/dream_halls.txt index 2ebc5b667ab..090772353b7 100644 --- a/forge-gui/res/cardsfolder/d/dream_halls.txt +++ b/forge-gui/res/cardsfolder/d/dream_halls.txt @@ -3,6 +3,6 @@ ManaCost:3 U U Types:Enchantment S:Mode$ Continuous | Affected$ Card.nonToken | AddKeyword$ Alternative Cost:Discard<1/Card.SharesColorWith/color sharing> | AffectedZone$ Hand,Graveyard,Exile,Library,Command | Description$ Rather than pay the mana cost for a spell, its controller may discard a card that shares a color with that spell. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dream_halls.jpg Oracle:Rather than pay the mana cost for a spell, its controller may discard a card that shares a color with that spell. diff --git a/forge-gui/res/cardsfolder/d/dream_salvage.txt b/forge-gui/res/cardsfolder/d/dream_salvage.txt index 7e2ae6c0893..7ef47e68816 100644 --- a/forge-gui/res/cardsfolder/d/dream_salvage.txt +++ b/forge-gui/res/cardsfolder/d/dream_salvage.txt @@ -3,7 +3,7 @@ ManaCost:UB Types:Instant A:SP$ Draw | Cost$ UB | NumCards$ X | Defined$ You | ValidTgts$ Opponent | References$ X | SpellDescription$ Draw cards equal to the number of cards target opponent discarded this turn. SVar:X:TargetedPlayer$CardsDiscardedThisTurn -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dream_salvage.jpg Oracle:Draw cards equal to the number of cards target opponent discarded this turn. diff --git a/forge-gui/res/cardsfolder/d/dream_stalker.txt b/forge-gui/res/cardsfolder/d/dream_stalker.txt index 9fdae81e02b..d2839fd18ce 100644 --- a/forge-gui/res/cardsfolder/d/dream_stalker.txt +++ b/forge-gui/res/cardsfolder/d/dream_stalker.txt @@ -4,6 +4,6 @@ Types:Creature Illusion PT:1/5 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, return a permanent you control to its owner's hand. SVar:TrigChange:DB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Hidden$ True | Mandatory$ True | ChangeType$ Permanent.YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dream_stalker.jpg Oracle:When Dream Stalker enters the battlefield, return a permanent you control to its owner's hand. diff --git a/forge-gui/res/cardsfolder/d/dream_thrush.txt b/forge-gui/res/cardsfolder/d/dream_thrush.txt index 6fee1bba41e..bab9063e376 100644 --- a/forge-gui/res/cardsfolder/d/dream_thrush.txt +++ b/forge-gui/res/cardsfolder/d/dream_thrush.txt @@ -5,6 +5,6 @@ PT:1/1 K:Flying A:AB$ ChooseType | Cost$ T | Defined$ You | Type$ Basic Land | SubAbility$ DBAnimate | SpellDescription$ Target land becomes the basic land type of your choice until end of turn. SVar:DBAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dream_thrush.jpg Oracle:Flying\n{T}: Target land becomes the basic land type of your choice until end of turn. diff --git a/forge-gui/res/cardsfolder/d/dream_tides.txt b/forge-gui/res/cardsfolder/d/dream_tides.txt index 3dd8e1c623a..a442f42fc5f 100644 --- a/forge-gui/res/cardsfolder/d/dream_tides.txt +++ b/forge-gui/res/cardsfolder/d/dream_tides.txt @@ -8,7 +8,7 @@ SVar:DBUntap:DB$ RepeatEach | DefinedCards$ ChosenCard | RepeatSubAbility$ Untap SVar:UntapEach:DB$ Untap | Defined$ Remembered | UnlessCost$ 2 | UnlessPayer$ RememberedController | UnlessSwitched$ True | ShowCurrentCard$ Remembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True SVar:X:Count$Valid Creature.tapped+nonGreen+ActivePlayerCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/dream_tides.jpg Oracle:Creatures don't untap during their controllers' untap steps.\nAt the beginning of each player's upkeep, that player may choose any number of tapped nongreen creatures they control and pay {2} for each creature chosen this way. If the player does, untap those creatures. diff --git a/forge-gui/res/cardsfolder/d/dreamborn_muse.txt b/forge-gui/res/cardsfolder/d/dreamborn_muse.txt index 5ec24633017..1138a45c2f9 100644 --- a/forge-gui/res/cardsfolder/d/dreamborn_muse.txt +++ b/forge-gui/res/cardsfolder/d/dreamborn_muse.txt @@ -5,6 +5,6 @@ PT:2/2 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigMillYou | TriggerDescription$ At the beginning of each player's upkeep, that player puts the top X cards of their library into their graveyard, where X is the number of cards in their hand. SVar:TrigMillYou:DB$ Mill | Defined$ TriggeredPlayer | NumCards$ X | References$ X SVar:X:TriggeredPlayer$CardsInHand -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dreamborn_muse.jpg Oracle:At the beginning of each player's upkeep, that player puts the top X cards of their library into their graveyard, where X is the number of cards in their hand. diff --git a/forge-gui/res/cardsfolder/d/dreamcatcher.txt b/forge-gui/res/cardsfolder/d/dreamcatcher.txt index becb7121b5f..4f6b3587b8f 100644 --- a/forge-gui/res/cardsfolder/d/dreamcatcher.txt +++ b/forge-gui/res/cardsfolder/d/dreamcatcher.txt @@ -4,6 +4,6 @@ Types:Creature Spirit PT:1/1 T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, you may sacrifice Dreamcatcher. If you do, draw a card. SVar:TrigDraw:AB$Draw | Cost$ Sac<1/CARDNAME> | Defined$ You | NumCards$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dreamcatcher.jpg Oracle:Whenever you cast a Spirit or Arcane spell, you may sacrifice Dreamcatcher. If you do, draw a card. diff --git a/forge-gui/res/cardsfolder/d/dreams_grip.txt b/forge-gui/res/cardsfolder/d/dreams_grip.txt index a463426a60b..eb5a1e40ff8 100644 --- a/forge-gui/res/cardsfolder/d/dreams_grip.txt +++ b/forge-gui/res/cardsfolder/d/dreams_grip.txt @@ -5,6 +5,6 @@ K:Entwine:1 A:SP$ Charm | Cost$ U | Choices$ DBTap,DBUntap | CharmNum$ 1 SVar:DBTap:DB$ Tap | ValidTgts$ Permanent | TgtPrompt$ Select target permanent to tap | SpellDescription$ Tap target permanent. SVar:DBUntap:DB$ Untap | ValidTgts$ Permanent | TgtPrompt$ Select target permanent to untap | SpellDescription$ Untap target permanent. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dreams_grip.jpg Oracle:Choose one —\n• Tap target permanent.\n• Untap target permanent.\nEntwine {1} (Choose both if you pay the entwine cost.) diff --git a/forge-gui/res/cardsfolder/d/dreams_of_the_dead.txt b/forge-gui/res/cardsfolder/d/dreams_of_the_dead.txt index ef445a02ca5..fc5b9020c90 100644 --- a/forge-gui/res/cardsfolder/d/dreams_of_the_dead.txt +++ b/forge-gui/res/cardsfolder/d/dreams_of_the_dead.txt @@ -4,6 +4,6 @@ Types:Enchantment A:AB$ ChangeZone | Cost$ 1 U | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.White+YouCtrl,Creature.Black+YouCtrl | TgtPrompt$ Select target white or black creature in your graveyard | SubAbility$ DBPump | SpellDescription$ Return target white or black creature card from your graveyard to the battlefield. That creature gains "Cumulative upkeep {2}." If the creature would leave the battlefield, exile it instead of putting it anywhere else. SVar:DBPump:DB$ Pump | KW$ Cumulative upkeep:2 | LeaveBattlefield$ Exile | Defined$ Targeted | Permanent$ True SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dreams_of_the_dead.jpg Oracle:{1}{U}: Return target white or black creature card from your graveyard to the battlefield. That creature gains "Cumulative upkeep {2}." If the creature would leave the battlefield, exile it instead of putting it anywhere else. (At the beginning of its controller's upkeep, that player puts an age counter on it, then sacrifices it unless they pay its upkeep cost for each age counter on it.) diff --git a/forge-gui/res/cardsfolder/d/dreamwinder.txt b/forge-gui/res/cardsfolder/d/dreamwinder.txt index 0ac176bd8dd..820a5b3e9a4 100644 --- a/forge-gui/res/cardsfolder/d/dreamwinder.txt +++ b/forge-gui/res/cardsfolder/d/dreamwinder.txt @@ -4,6 +4,6 @@ Types:Creature Serpent PT:4/3 S:Mode$ CantAttack | ValidCard$ Card.Self | UnlessDefenderControls$ Island | Description$ CARDNAME can't attack unless defending player controls an Island. A:AB$ Animate | Cost$ U Sac<1/Island> | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Island | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | SpellDescription$ Target land becomes an Island until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dreamwinder.jpg Oracle:Dreamwinder can't attack unless defending player controls an Island.\n{U}, Sacrifice an Island: Target land becomes an Island until end of turn. diff --git a/forge-gui/res/cardsfolder/d/dredge.txt b/forge-gui/res/cardsfolder/d/dredge.txt index 9fbd64049b5..da942232b2f 100644 --- a/forge-gui/res/cardsfolder/d/dredge.txt +++ b/forge-gui/res/cardsfolder/d/dredge.txt @@ -3,6 +3,6 @@ ManaCost:B Types:Instant A:SP$ Sacrifice | Cost$ B | SacValid$ Creature,Land | SacMessage$ Creature or Land | SpellDescription$ Sacrifice a creature or land. | SubAbility$ DBDraw SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dredge.jpg Oracle:Sacrifice a creature or land.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/d/dregs_of_sorrow.txt b/forge-gui/res/cardsfolder/d/dregs_of_sorrow.txt index 9e7f31abab9..9ddfb10e46d 100644 --- a/forge-gui/res/cardsfolder/d/dregs_of_sorrow.txt +++ b/forge-gui/res/cardsfolder/d/dregs_of_sorrow.txt @@ -6,6 +6,6 @@ A:SP$ Destroy | Cost$ X 4 B | TargetMin$ 0 | TargetMax$ MaxTgts | ValidTgts$ Cre SVar:X:Targeted$Amount SVar:MaxTgts:Count$Valid Creature.nonBlack SVar:DB:DB$Draw | Defined$ You | NumCards$ X | References$ X -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dregs_of_sorrow.jpg Oracle:Destroy X target nonblack creatures. Draw X cards. diff --git a/forge-gui/res/cardsfolder/d/drift_of_the_dead.txt b/forge-gui/res/cardsfolder/d/drift_of_the_dead.txt index c096a78421b..82481f07644 100644 --- a/forge-gui/res/cardsfolder/d/drift_of_the_dead.txt +++ b/forge-gui/res/cardsfolder/d/drift_of_the_dead.txt @@ -6,6 +6,6 @@ K:Defender S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ CARDNAME's power and toughness are each equal to the number of snow lands you control. SVar:X:Count$Valid Land.Snow+YouCtrl SVar:NeedsToPlayVar:X GE2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/drift_of_the_dead.jpg Oracle:Defender (This creature can't attack.)\nDrift of the Dead's power and toughness are each equal to the number of snow lands you control. diff --git a/forge-gui/res/cardsfolder/d/dromar_the_banisher.txt b/forge-gui/res/cardsfolder/d/dromar_the_banisher.txt index 878ef72363e..7426c398607 100644 --- a/forge-gui/res/cardsfolder/d/dromar_the_banisher.txt +++ b/forge-gui/res/cardsfolder/d/dromar_the_banisher.txt @@ -6,6 +6,6 @@ K:Flying T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | OptionalDecider$ You | Execute$ TrigChoose | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may pay {2}{U}. If you do, choose a color, then return all creatures of that color to their owners' hands. SVar:TrigChoose:AB$ ChooseColor | Cost$ 2 U | Defined$ You | AILogic$ MostProminentHumanCreatures | SubAbility$ DBRevealDiscard SVar:DBRevealDiscard:DB$ ChangeZoneAll | ChangeType$ Creature.ChosenColor | Origin$ Battlefield | Destination$ Hand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dromar_the_banisher.jpg Oracle:Flying\nWhenever Dromar, the Banisher deals combat damage to a player, you may pay {2}{U}. If you do, choose a color, then return all creatures of that color to their owners' hands. diff --git a/forge-gui/res/cardsfolder/d/dromars_attendant.txt b/forge-gui/res/cardsfolder/d/dromars_attendant.txt index 6b46f8f1739..a4362a88930 100644 --- a/forge-gui/res/cardsfolder/d/dromars_attendant.txt +++ b/forge-gui/res/cardsfolder/d/dromars_attendant.txt @@ -3,6 +3,6 @@ ManaCost:5 Types:Artifact Creature Golem PT:3/3 A:AB$ Mana | Cost$ 1 Sac<1/CARDNAME> | Produced$ W U B | SpellDescription$ Add {W}{U}{B}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dromars_attendant.jpg Oracle:{1}, Sacrifice Dromar's Attendant: Add {W}{U}{B}. diff --git a/forge-gui/res/cardsfolder/d/dromoka_monument.txt b/forge-gui/res/cardsfolder/d/dromoka_monument.txt index 1a038d8b567..376ef00ea03 100644 --- a/forge-gui/res/cardsfolder/d/dromoka_monument.txt +++ b/forge-gui/res/cardsfolder/d/dromoka_monument.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. A:AB$ Animate | Cost$ 4 G W | Defined$ Self | Power$ 4 | Toughness$ 4 | Types$ Artifact,Creature,Dragon | Colors$ Green,White | Keywords$ Flying | SpellDescription$ CARDNAME becomes a 4/4 green and white Dragon artifact creature with flying until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Green|White SVar:Picture:http://www.wizards.com/global/images/magic/general/dromoka_monument.jpg Oracle:{T}: Add {G} or {W}.\n{4}{G}{W}: Dromoka Monument becomes a 4/4 green and white Dragon artifact creature with flying until end of turn. diff --git a/forge-gui/res/cardsfolder/d/droning_bureaucrats.txt b/forge-gui/res/cardsfolder/d/droning_bureaucrats.txt index c593d09f6fa..ee8e632578b 100644 --- a/forge-gui/res/cardsfolder/d/droning_bureaucrats.txt +++ b/forge-gui/res/cardsfolder/d/droning_bureaucrats.txt @@ -7,6 +7,6 @@ SVar:CreateDroningEffect:DB$ Effect | Name$ Droning Bureaucrats Effect | StaticA SVar:NoCombat:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.cmcEQDroningX | AddHiddenKeyword$ CARDNAME can't attack or block. | Description$ Each creature with converted mana cost X can't attack or block this turn. SVar:X:Count$xPaid SVar:DroningX:Number$0 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/droning_bureaucrats.jpg Oracle:{X}, {T}: Each creature with converted mana cost X can't attack or block this turn. diff --git a/forge-gui/res/cardsfolder/d/drooling_ogre.txt b/forge-gui/res/cardsfolder/d/drooling_ogre.txt index 5a569c5941e..67fff71e524 100644 --- a/forge-gui/res/cardsfolder/d/drooling_ogre.txt +++ b/forge-gui/res/cardsfolder/d/drooling_ogre.txt @@ -4,7 +4,7 @@ Types:Creature Ogre PT:3/3 T:Mode$ SpellCast | ValidCard$ Artifact | Execute$ TrigControl | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player casts an artifact spell, that player gains control of CARDNAME. (This effect lasts indefinitely.) SVar:TrigControl:DB$ GainControl | Defined$ Self | NewController$ TriggeredPlayer -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:AntiBuffedBy:Artifact SVar:Picture:http://www.wizards.com/global/images/magic/general/drooling_ogre.jpg Oracle:Whenever a player casts an artifact spell, that player gains control of Drooling Ogre. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/d/drop_of_honey.txt b/forge-gui/res/cardsfolder/d/drop_of_honey.txt index dfa108d1c03..35c7f35bcb5 100644 --- a/forge-gui/res/cardsfolder/d/drop_of_honey.txt +++ b/forge-gui/res/cardsfolder/d/drop_of_honey.txt @@ -7,6 +7,6 @@ SVar:DBDestroy:DB$ Destroy | Defined$ ChosenCard | NoRegen$ True T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Creature | PresentCompare$ EQ0 | Execute$ TrigSac | TriggerDescription$ When there are no creatures on the battlefield, sacrifice CARDNAME. SVar:TrigSac:DB$Sacrifice | Defined$ Self SVar:NeedsToPlay:Creature.YouDontCtrl+leastPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/drop_of_honey.jpg Oracle:At the beginning of your upkeep, destroy the creature with the least power. It can't be regenerated. If two or more creatures are tied for least power, you choose one of them.\nWhen there are no creatures on the battlefield, sacrifice Drop of Honey. diff --git a/forge-gui/res/cardsfolder/d/drown_in_filth.txt b/forge-gui/res/cardsfolder/d/drown_in_filth.txt index f335c13e454..504401e5313 100644 --- a/forge-gui/res/cardsfolder/d/drown_in_filth.txt +++ b/forge-gui/res/cardsfolder/d/drown_in_filth.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ Mill | Cost$ B G | NumCards$ 4 | Defined$ You | SubAbility$ DBPump | SpellDescription$ Choose target creature. Put the top four cards of your library into your graveyard, then that creatures gets -1/-1 until end of turn for each land card in your graveyard. SVar:DBPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -X | NumDef$ -X | IsCurse$ True | References$ X SVar:X:Count$ValidGraveyard Land.YouOwn -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/drown_in_filth.jpg Oracle:Choose target creature. Put the top four cards of your library into your graveyard, then that creature gets -1/-1 until end of turn for each land card in your graveyard. diff --git a/forge-gui/res/cardsfolder/d/drowned.txt b/forge-gui/res/cardsfolder/d/drowned.txt index ca773014477..56d23724f85 100644 --- a/forge-gui/res/cardsfolder/d/drowned.txt +++ b/forge-gui/res/cardsfolder/d/drowned.txt @@ -3,7 +3,7 @@ ManaCost:1 U Types:Creature Zombie PT:1/1 A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black SVar:Picture:http://www.wizards.com/global/images/magic/general/drowned.jpg Oracle:{B}: Regenerate Drowned. diff --git a/forge-gui/res/cardsfolder/d/drowned_rusalka.txt b/forge-gui/res/cardsfolder/d/drowned_rusalka.txt index 9faaf64660d..3671626b265 100644 --- a/forge-gui/res/cardsfolder/d/drowned_rusalka.txt +++ b/forge-gui/res/cardsfolder/d/drowned_rusalka.txt @@ -4,6 +4,6 @@ Types:Creature Spirit PT:1/1 A:AB$ Discard | Cost$ U Sac<1/Creature> | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | SubAbility$ DBDraw | SpellDescription$ Discard a card, then draw a card. SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/drowned_rusalka.jpg Oracle:{U}, Sacrifice a creature: Discard a card, then draw a card. diff --git a/forge-gui/res/cardsfolder/d/dryads_caress.txt b/forge-gui/res/cardsfolder/d/dryads_caress.txt index e1be87c1ae3..e445df8a990 100644 --- a/forge-gui/res/cardsfolder/d/dryads_caress.txt +++ b/forge-gui/res/cardsfolder/d/dryads_caress.txt @@ -4,7 +4,7 @@ Types:Instant A:SP$ GainLife | Cost$ 4 G G | Defined$ You | LifeAmount$ X | SubAbility$ DBUntapAll | References$ X | SpellDescription$ You gain 1 life for each creature on the battlefield. If {W} was spent to cast CARDNAME, untap all creatures you control. SVar:DBUntapAll:DB$ UntapAll | ConditionManaSpent$ W | ValidCards$ Creature.YouCtrl SVar:X:Count$Valid Creature -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dryads_caress.jpg Oracle:You gain 1 life for each creature on the battlefield. If {W} was spent to cast Dryad's Caress, untap all creatures you control. diff --git a/forge-gui/res/cardsfolder/d/dual_casting.txt b/forge-gui/res/cardsfolder/d/dual_casting.txt index c8af6478606..769e07679a5 100644 --- a/forge-gui/res/cardsfolder/d/dual_casting.txt +++ b/forge-gui/res/cardsfolder/d/dual_casting.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ 1 R | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddAbility$ ForkStick | Description$ Enchanted creature has "{R}, {T}: Copy target instant or sorcery spell you control. You may choose new targets for the copy." SVar:ForkStick:AB$ CopySpellAbility | Cost$ R T | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | SpellDescription$ Copy target instant or sorcery spell you control. You may choose new targets for the copy. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dual_casting.jpg Oracle:Enchant creature\nEnchanted creature has "{R}, {T}: Copy target instant or sorcery spell you control. You may choose new targets for the copy." diff --git a/forge-gui/res/cardsfolder/d/dualcaster_mage.txt b/forge-gui/res/cardsfolder/d/dualcaster_mage.txt index c01d566cb0c..f303c17ffdb 100644 --- a/forge-gui/res/cardsfolder/d/dualcaster_mage.txt +++ b/forge-gui/res/cardsfolder/d/dualcaster_mage.txt @@ -5,6 +5,6 @@ PT:2/2 K:Flash T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigCopy | TriggerDescription$ When CARDNAME enters the battlefield, copy target instant or sorcery spell. You may choose new targets for that copy. SVar:TrigCopy:DB$ CopySpellAbility | ValidTgts$ Instant,Sorcery | TargetType$ Spell -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dualcaster_mage.jpg Oracle:Flash\nWhen Dualcaster Mage enters the battlefield, copy target instant or sorcery spell. You may choose new targets for the copy. diff --git a/forge-gui/res/cardsfolder/d/duct_crawler.txt b/forge-gui/res/cardsfolder/d/duct_crawler.txt index 6c791319f35..816b3f16f2a 100644 --- a/forge-gui/res/cardsfolder/d/duct_crawler.txt +++ b/forge-gui/res/cardsfolder/d/duct_crawler.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Creature Insect PT:1/1 A:AB$ Pump | Cost$ 1 R | ValidTgts$ Creature | TgtPrompt$ Select target creature that can't block this creature this turn | IsCurse$ True | KW$ HIDDEN CantBlockCardUIDSource | DefinedKW$ CardUIDSource | UntilHostLeavesPlayOrEOT$ True | StackDescription$ {c:Targeted} can't block CARDNAME this turn. | SpellDescription$ Target creature can't block CARDNAME this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/duct_crawler.jpg Oracle:{1}{R}: Target creature can't block Duct Crawler this turn. diff --git a/forge-gui/res/cardsfolder/d/dueling_grounds.txt b/forge-gui/res/cardsfolder/d/dueling_grounds.txt index f9e78447243..1e9b029082e 100644 --- a/forge-gui/res/cardsfolder/d/dueling_grounds.txt +++ b/forge-gui/res/cardsfolder/d/dueling_grounds.txt @@ -3,6 +3,6 @@ ManaCost:1 G W Types:Enchantment S:Mode$ Continuous | GlobalRule$ No more than one creature can attack each combat. | Description$ No more than one creature can attack each combat. S:Mode$ Continuous | GlobalRule$ No more than one creature can block each combat. | Description$ No more than one creature can block each turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dueling_grounds.jpg Oracle:No more than one creature can attack each combat.\nNo more than one creature can block each turn. diff --git a/forge-gui/res/cardsfolder/d/dukhara_peafowl.txt b/forge-gui/res/cardsfolder/d/dukhara_peafowl.txt index 9aff1bb13ce..aaeed227d3b 100644 --- a/forge-gui/res/cardsfolder/d/dukhara_peafowl.txt +++ b/forge-gui/res/cardsfolder/d/dukhara_peafowl.txt @@ -3,6 +3,6 @@ ManaCost:4 Types:Artifact Creature Bird PT:2/4 A:AB$ Pump | Cost$ U | KW$ Flying | Defined$ Self | SpellDescription$ CARDNAME gains flying until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dukhara_peafowl.jpg Oracle:{U}: Dukhara Peafowl gains flying until end of turn. diff --git a/forge-gui/res/cardsfolder/d/dulcet_sirens.txt b/forge-gui/res/cardsfolder/d/dulcet_sirens.txt index ebe1fd528b5..417b0d18f87 100644 --- a/forge-gui/res/cardsfolder/d/dulcet_sirens.txt +++ b/forge-gui/res/cardsfolder/d/dulcet_sirens.txt @@ -5,6 +5,6 @@ PT:1/3 K:Morph:U A:AB$ Pump | Cost$ U T | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | SubAbility$ DBMustAttack | SpellDescription$ Target creature attacks target opponent this turn if able. SVar:DBMustAttack:DB$ MustAttack | ValidTgts$ Creature | TgtPrompt$ Select target creature | Defender$ ParentTarget | ThisTurn$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dulcet_sirens.jpg Oracle:{U}, {T}: Target creature attacks target opponent this turn if able.\nMorph {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.) diff --git a/forge-gui/res/cardsfolder/d/duplicity.txt b/forge-gui/res/cardsfolder/d/duplicity.txt index b3b599d423f..0e788527542 100644 --- a/forge-gui/res/cardsfolder/d/duplicity.txt +++ b/forge-gui/res/cardsfolder/d/duplicity.txt @@ -12,7 +12,7 @@ SVar:TrigDiscard:DB$ Discard | NumCards$ 1 | Mode$ TgtChoose T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ GoToYard | TriggerDescription$ When you lose control of CARDNAME, put all cards exiled with CARDNAME into their owner's graveyard. T:Mode$ ChangesController | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ GoToYard | Secondary$ True | TriggerDescription$ When you lose control of CARDNAME, put all cards exiled with CARDNAME into their owner's graveyard. SVar:GoToYard:DB$ ChangeZoneAll | Origin$ Exile | Destination$ Graveyard | ChangeType$ Card.IsRemembered | ForgetChanged$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/duplicity.jpg Oracle:When Duplicity enters the battlefield, exile the top five cards of your library face down.\nAt the beginning of your upkeep, you may exile all cards from your hand face down. If you do, put all other cards you own exiled with Duplicity into your hand.\nAt the beginning of your end step, discard a card.\nWhen you lose control of Duplicity, put all cards exiled with Duplicity into their owner's graveyard. diff --git a/forge-gui/res/cardsfolder/d/dust_of_moments.txt b/forge-gui/res/cardsfolder/d/dust_of_moments.txt index 98043992e93..40be48729e4 100644 --- a/forge-gui/res/cardsfolder/d/dust_of_moments.txt +++ b/forge-gui/res/cardsfolder/d/dust_of_moments.txt @@ -6,7 +6,7 @@ SVar:LoseTime:DB$ RemoveCounterAll | ValidCards$ Permanent | CounterType$ TIME | SVar:QuickenTime:DB$ RemoveCounterAll | ValidCards$ Card.suspended | CounterType$ TIME | CounterNum$ 2 | ValidZone$ Exile SVar:GainTime:DB$ PutCounterAll | ValidCards$ Permanent.counters_GE1_TIME | CounterType$ TIME | CounterNum$ 2 | SubAbility$ SlowTime | SpellDescription$ Put two time counters on each permanent with a time counter on it and each suspended card. SVar:SlowTime:DB$ PutCounterAll | ValidCards$ Card.suspended | CounterType$ TIME | CounterNum$ 2 | ValidZone$ Exile -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dust_of_moments.jpg Oracle:Choose one —\n• Remove two time counters from each permanent and each suspended card.\n• Put two time counters on each permanent with a time counter on it and each suspended card. diff --git a/forge-gui/res/cardsfolder/d/dwarven_armorer.txt b/forge-gui/res/cardsfolder/d/dwarven_armorer.txt index 509c48b6100..6e9d3148fe4 100644 --- a/forge-gui/res/cardsfolder/d/dwarven_armorer.txt +++ b/forge-gui/res/cardsfolder/d/dwarven_armorer.txt @@ -4,6 +4,6 @@ Types:Creature Dwarf PT:0/2 A:AB$ PutCounter | Cost$ R T Discard<1/Card> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P0 | CounterNum$ 1 | SpellDescription$ Put a +1/+0 counter on target creature. A:AB$ PutCounter | Cost$ R T Discard<1/Card> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P0P1 | CounterNum$ 1 | SpellDescription$ Put a +0/+1 counter on target creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_armorer.jpg Oracle:{R}, {T}, Discard a card: Put a +0/+1 counter or a +1/+0 counter on target creature. diff --git a/forge-gui/res/cardsfolder/d/dwarven_armory.txt b/forge-gui/res/cardsfolder/d/dwarven_armory.txt index 420787df23f..7ed0377215d 100644 --- a/forge-gui/res/cardsfolder/d/dwarven_armory.txt +++ b/forge-gui/res/cardsfolder/d/dwarven_armory.txt @@ -3,6 +3,6 @@ ManaCost:2 R R Types:Enchantment A:AB$ PutCounter | Cost$ 2 Sac<1/Land> | CounterType$ P2P2 | CounterNum$ 1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | PlayerTurn$ True | ActivationPhases$ Upkeep | SpellDescription$ Put a +2/+2 counter on target creature. Activate this ability only during any upkeep step. SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_armory.jpg Oracle:{2}, Sacrifice a land: Put a +2/+2 counter on target creature. Activate this ability only during any upkeep step. diff --git a/forge-gui/res/cardsfolder/d/dwarven_hold.txt b/forge-gui/res/cardsfolder/d/dwarven_hold.txt index 54bc4af37f7..3dda386a35c 100644 --- a/forge-gui/res/cardsfolder/d/dwarven_hold.txt +++ b/forge-gui/res/cardsfolder/d/dwarven_hold.txt @@ -8,6 +8,6 @@ SVar:TrigStore:DB$PutCounter | Defined$ Self | CounterType$ STORAGE | CounterNum A:AB$ Mana | Cost$ T SubCounter | Produced$ R | Amount$ ChosenX | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | References$ X | SpellDescription$ Add {R} for each storage counter removed this way. SVar:X:XChoice #ChosenX SVar created by Cost payment -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_hold.jpg Oracle:Dwarven Hold enters the battlefield tapped.\nYou may choose not to untap Dwarven Hold during your untap step.\nAt the beginning of your upkeep, if Dwarven Hold is tapped, put a storage counter on it.\n{T}, Remove any number of storage counters from Dwarven Hold: Add {R} for each storage counter removed this way. diff --git a/forge-gui/res/cardsfolder/d/dwarven_patrol.txt b/forge-gui/res/cardsfolder/d/dwarven_patrol.txt index 6f54ae26299..fef6ee68d03 100644 --- a/forge-gui/res/cardsfolder/d/dwarven_patrol.txt +++ b/forge-gui/res/cardsfolder/d/dwarven_patrol.txt @@ -5,6 +5,6 @@ PT:4/2 K:CARDNAME doesn't untap during your untap step. T:Mode$ SpellCast | ValidCard$ Card.nonRed | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigUntap | TriggerDescription$ Whenever you cast a nonred spell, untap CARDNAME. SVar:TrigUntap:DB$Untap | Defined$ Self -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_patrol.jpg Oracle:Dwarven Patrol doesn't untap during your untap step.\nWhenever you cast a nonred spell, untap Dwarven Patrol. diff --git a/forge-gui/res/cardsfolder/d/dwarven_recruiter.txt b/forge-gui/res/cardsfolder/d/dwarven_recruiter.txt index 44cf786fe20..3567f8d241b 100644 --- a/forge-gui/res/cardsfolder/d/dwarven_recruiter.txt +++ b/forge-gui/res/cardsfolder/d/dwarven_recruiter.txt @@ -5,6 +5,6 @@ PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, search your library for any number of Dwarf cards and reveal those cards. Shuffle your library, then put them on top of it in any order. SVar:TrigChangeZone:DB$ ChangeZone | ChangeNum$ X | ChangeType$ Dwarf | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | References$ X SVar:X:Count$InYourLibrary.Dwarf -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_recruiter.jpg Oracle:When Dwarven Recruiter enters the battlefield, search your library for any number of Dwarf cards and reveal those cards. Shuffle your library, then put them on top of it in any order. diff --git a/forge-gui/res/cardsfolder/d/dwarven_ruins.txt b/forge-gui/res/cardsfolder/d/dwarven_ruins.txt index b9feccc5b72..1659b2ba5b5 100644 --- a/forge-gui/res/cardsfolder/d/dwarven_ruins.txt +++ b/forge-gui/res/cardsfolder/d/dwarven_ruins.txt @@ -4,6 +4,6 @@ Types:Land K:CARDNAME enters the battlefield tapped. A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ R | Amount$ 2 | SpellDescription$ Add {R}{R}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_ruins.jpg Oracle:Dwarven Ruins enters the battlefield tapped.\n{T}: Add {R}.\n{T}, Sacrifice Dwarven Ruins: Add {R}{R}. diff --git a/forge-gui/res/cardsfolder/d/dwarven_sea_clan.txt b/forge-gui/res/cardsfolder/d/dwarven_sea_clan.txt index 401f93509bb..b7f15f5bddf 100644 --- a/forge-gui/res/cardsfolder/d/dwarven_sea_clan.txt +++ b/forge-gui/res/cardsfolder/d/dwarven_sea_clan.txt @@ -7,7 +7,7 @@ SVar:DBDelayTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | Execute$ SVar:TrigDmg:DB$ DealDamage | NumDmg$ 2 | Defined$ DelayTriggerRemembered SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:NeedsToPlay:Island.OppCtrl -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_sea_clan.jpg Oracle:{T}: Choose target attacking or blocking creature whose controller controls an Island. Dwarven Sea Clan deals 2 damage to that creature at end of combat. Activate this ability only before the end of combat step. diff --git a/forge-gui/res/cardsfolder/d/dwarven_shrine.txt b/forge-gui/res/cardsfolder/d/dwarven_shrine.txt index 02325184e02..10a768c8c25 100644 --- a/forge-gui/res/cardsfolder/d/dwarven_shrine.txt +++ b/forge-gui/res/cardsfolder/d/dwarven_shrine.txt @@ -6,6 +6,6 @@ SVar:TrigDmgRem:DB$ Pump | Defined$ TriggeredCard | PumpZone$ Stack | RememberOb SVar:DBDmg:DB$ DealDamage | Defined$ TriggeredActivator | NumDmg$ X | References$ X | SubAbility$ DBCleanup SVar:X:Count$ValidGraveyard Card.sharesNameWith Remembered/Twice SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_shrine.jpg Oracle:Whenever a player casts a spell, Dwarven Shrine deals X damage to that player, where X is twice the number of cards in all graveyards with the same name as that spell. diff --git a/forge-gui/res/cardsfolder/d/dwarven_song.txt b/forge-gui/res/cardsfolder/d/dwarven_song.txt index 0128f4398a2..51dcb504bea 100644 --- a/forge-gui/res/cardsfolder/d/dwarven_song.txt +++ b/forge-gui/res/cardsfolder/d/dwarven_song.txt @@ -3,7 +3,7 @@ ManaCost:R Types:Instant A:SP$ Animate | Cost$ R | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ MaxTgts | TgtPrompt$ Select target creatures | Colors$ Red | OverwriteColors$ True | References$ MaxTgts | SpellDescription$ Any number of target creatures become red until end of turn. SVar:MaxTgts:Count$Valid Creature -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_song.jpg Oracle:Any number of target creatures become red until end of turn. diff --git a/forge-gui/res/cardsfolder/d/dwarven_thaumaturgist.txt b/forge-gui/res/cardsfolder/d/dwarven_thaumaturgist.txt index 651c0ab6aae..8e5ea96d29f 100644 --- a/forge-gui/res/cardsfolder/d/dwarven_thaumaturgist.txt +++ b/forge-gui/res/cardsfolder/d/dwarven_thaumaturgist.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Creature Dwarf Shaman PT:1/2 A:AB$ Pump | Cost$ T | ValidTgts$ Creature | KW$ HIDDEN CARDNAME's power and toughness are switched | TgtPrompt$ Select target creature. | SpellDescription$ Switch target creature's power and toughness until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_thaumaturgist.jpg Oracle:{T}: Switch target creature's power and toughness until end of turn. diff --git a/forge-gui/res/cardsfolder/d/dwarven_weaponsmith.txt b/forge-gui/res/cardsfolder/d/dwarven_weaponsmith.txt index 4e2deec10c3..cd29ab3106b 100644 --- a/forge-gui/res/cardsfolder/d/dwarven_weaponsmith.txt +++ b/forge-gui/res/cardsfolder/d/dwarven_weaponsmith.txt @@ -3,6 +3,6 @@ ManaCost:1 R Types:Creature Dwarf Artificer PT:1/1 A:AB$ PutCounter | Cost$ T Sac<1/Artifact> | CounterType$ P1P1 | CounterNum$ 1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | PlayerTurn$ True | ActivationPhases$ Upkeep | SpellDescription$ Put a +1/+1 counter on target creature. Activate this ability only during your upkeep. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_weaponsmith.jpg Oracle:{T}, Sacrifice an artifact: Put a +1/+1 counter on target creature. Activate this ability only during your upkeep. diff --git a/forge-gui/res/cardsfolder/d/dwell_on_the_past.txt b/forge-gui/res/cardsfolder/d/dwell_on_the_past.txt index cf5fa729f7f..66e3425587a 100644 --- a/forge-gui/res/cardsfolder/d/dwell_on_the_past.txt +++ b/forge-gui/res/cardsfolder/d/dwell_on_the_past.txt @@ -3,6 +3,6 @@ ManaCost:G Types:Sorcery A:SP$ Pump | Cost$ G | ValidTgts$ Player | TgtPrompt$ Select target Player | SubAbility$ DBChangeZone | IsCurse$ True | SpellDescription$ Target player shuffles up to four target cards from their graveyard into their library. SVar:DBChangeZone:DB$ ChangeZone | TargetMin$ 0 | TargetMax$ 4 | TargetsWithDefinedController$ ParentTarget | Origin$ Graveyard | Destination$ Library | Shuffle$ True | TgtPrompt$ Choose target card | ValidTgts$ Card -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dwell_on_the_past.jpg Oracle:Target player shuffles up to four target cards from their graveyard into their library. diff --git a/forge-gui/res/cardsfolder/d/dystopia.txt b/forge-gui/res/cardsfolder/d/dystopia.txt index 6d7b0f98401..282c2817ea8 100644 --- a/forge-gui/res/cardsfolder/d/dystopia.txt +++ b/forge-gui/res/cardsfolder/d/dystopia.txt @@ -4,6 +4,6 @@ Types:Enchantment K:Cumulative upkeep:PayLife<1>:Pay 1 life. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ At the beginning of each player's upkeep, that player sacrifices a green or white permanent. SVar:TrigSac:DB$ Sacrifice | SacValid$ Permanent.Green,Permanent.White | Defined$ TriggeredPlayer | SpellDescription$ Sacrifice a green or white permanent. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dystopia.jpg Oracle:Cumulative upkeep—Pay 1 life. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nAt the beginning of each player's upkeep, that player sacrifices a green or white permanent. diff --git a/forge-gui/res/cardsfolder/e/early_frost.txt b/forge-gui/res/cardsfolder/e/early_frost.txt index 2f7e5969dbc..fcfcb97261a 100644 --- a/forge-gui/res/cardsfolder/e/early_frost.txt +++ b/forge-gui/res/cardsfolder/e/early_frost.txt @@ -2,6 +2,6 @@ Name:Early Frost ManaCost:1 U Types:Instant A:SP$ Tap | Cost$ 1 U | TargetMin$ 0 | TargetMax$ 3 | TgtPrompt$ Choose target land | ValidTgts$ Land | SpellDescription$ Tap up to three target lands. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/early_frost.jpg Oracle:Tap up to three target lands. diff --git a/forge-gui/res/cardsfolder/e/early_harvest.txt b/forge-gui/res/cardsfolder/e/early_harvest.txt index cdea8daf89e..0950af81522 100644 --- a/forge-gui/res/cardsfolder/e/early_harvest.txt +++ b/forge-gui/res/cardsfolder/e/early_harvest.txt @@ -2,6 +2,6 @@ Name:Early Harvest ManaCost:1 G G Types:Instant A:SP$ UntapAll | Cost$ 1 G G | ValidTgts$ Player | TgtPrompt$ Select target player | ValidCards$ Land.Basic | SpellDescription$ Target player untaps all basic lands they control. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/early_harvest.jpg Oracle:Target player untaps all basic lands they control. diff --git a/forge-gui/res/cardsfolder/e/earnest_fellowship.txt b/forge-gui/res/cardsfolder/e/earnest_fellowship.txt index 165a1b7ffdc..02b8e47277c 100644 --- a/forge-gui/res/cardsfolder/e/earnest_fellowship.txt +++ b/forge-gui/res/cardsfolder/e/earnest_fellowship.txt @@ -9,6 +9,6 @@ S:Mode$ Continuous | Affected$ Creature.Red | AddKeyword$ Protection from red S:Mode$ Continuous | Affected$ Creature.Green | AddKeyword$ Protection from green SVar:NonStackingEffect:True SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/earnest_fellowship.jpg Oracle:Each creature has protection from its colors. diff --git a/forge-gui/res/cardsfolder/e/earth_surge.txt b/forge-gui/res/cardsfolder/e/earth_surge.txt index 22e6cc6e7e8..a9826d22cbb 100644 --- a/forge-gui/res/cardsfolder/e/earth_surge.txt +++ b/forge-gui/res/cardsfolder/e/earth_surge.txt @@ -2,7 +2,7 @@ Name:Earth Surge ManaCost:3 G Types:Enchantment S:Mode$ Continuous | Affected$ Creature.Land | AddPower$ 2 | AddToughness$ 2 | Description$ Each land gets +2/+2 as long as it's a creature. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/earth_surge.jpg Oracle:Each land gets +2/+2 as long as it's a creature. diff --git a/forge-gui/res/cardsfolder/e/earthbrawn.txt b/forge-gui/res/cardsfolder/e/earthbrawn.txt index efb2d38203d..2de3f30cc89 100644 --- a/forge-gui/res/cardsfolder/e/earthbrawn.txt +++ b/forge-gui/res/cardsfolder/e/earthbrawn.txt @@ -5,6 +5,6 @@ K:Reinforce:1:1 G A:SP$ Pump | Cost$ 1 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | NumDef$ +3 | SpellDescription$ Target creature gets +3/+3 until end of turn. DeckHas:Ability$Counters DeckNeeds:Type$Creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/earthbrawn.jpg Oracle:Target creature gets +3/+3 until end of turn.\nReinforce 1—{1}{G} ({1}{G}, Discard this card: Put a +1/+1 counter on target creature.) diff --git a/forge-gui/res/cardsfolder/e/earthcraft.txt b/forge-gui/res/cardsfolder/e/earthcraft.txt index b08ead43aa0..015df3bac43 100644 --- a/forge-gui/res/cardsfolder/e/earthcraft.txt +++ b/forge-gui/res/cardsfolder/e/earthcraft.txt @@ -3,6 +3,6 @@ ManaCost:1 G Types:Enchantment A:AB$ Untap | Cost$ tapXType<1/Creature> | ValidTgts$ Land.Basic | TgtPrompt$ Select target basic land | SpellDescription$ Untap target basic land. SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/earthcraft.jpg Oracle:Tap an untapped creature you control: Untap target basic land. diff --git a/forge-gui/res/cardsfolder/e/earthlink.txt b/forge-gui/res/cardsfolder/e/earthlink.txt index d4552943560..e2c97e0bbec 100644 --- a/forge-gui/res/cardsfolder/e/earthlink.txt +++ b/forge-gui/res/cardsfolder/e/earthlink.txt @@ -4,6 +4,6 @@ Types:Enchantment K:UpkeepCost:2 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ Whenever a creature dies, that creature's controller sacrifices a land. SVar:TrigSac:DB$Sacrifice | SacValid$ Land | Defined$ TriggeredCardController -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/earthlink.jpg Oracle:At the beginning of your upkeep, sacrifice Earthlink unless you pay {2}.\nWhenever a creature dies, that creature's controller sacrifices a land. diff --git a/forge-gui/res/cardsfolder/e/earthshaker.txt b/forge-gui/res/cardsfolder/e/earthshaker.txt index e0a4786868f..b5933ad4700 100644 --- a/forge-gui/res/cardsfolder/e/earthshaker.txt +++ b/forge-gui/res/cardsfolder/e/earthshaker.txt @@ -5,7 +5,7 @@ PT:4/5 T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigTremor | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, CARDNAME deals 2 damage to each creature without flying. SVar:TrigTremor:DB$ DamageAll | ValidCards$ Creature.withoutFlying | NumDmg$ 2 | ValidDescription$ each creature without flying. | SpellDescription$ CARDNAME deals 2 damage to each creature without flying. SVar:BuffedBy:Arcane,Spirit -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/earthshaker.jpg Oracle:Whenever you cast a Spirit or Arcane spell, Earthshaker deals 2 damage to each creature without flying. diff --git a/forge-gui/res/cardsfolder/e/eastern_paladin.txt b/forge-gui/res/cardsfolder/e/eastern_paladin.txt index 1153c915bf1..57709a3dc30 100644 --- a/forge-gui/res/cardsfolder/e/eastern_paladin.txt +++ b/forge-gui/res/cardsfolder/e/eastern_paladin.txt @@ -3,6 +3,6 @@ ManaCost:2 B B Types:Creature Zombie Knight PT:3/3 A:AB$ Destroy | Cost$ B B T | ValidTgts$ Creature.Green | TgtPrompt$ Select target green creature | SpellDescription$ Destroy target green creature. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/eastern_paladin.jpg Oracle:{B}{B}, {T}: Destroy target green creature. diff --git a/forge-gui/res/cardsfolder/e/eater_of_hope.txt b/forge-gui/res/cardsfolder/e/eater_of_hope.txt index ba0a04eb3f1..9ea7f6509a5 100644 --- a/forge-gui/res/cardsfolder/e/eater_of_hope.txt +++ b/forge-gui/res/cardsfolder/e/eater_of_hope.txt @@ -5,7 +5,7 @@ PT:6/4 K:Flying A:AB$ Regenerate | Cost$ B Sac<1/Creature.Other/another creature> | SpellDescription$ Regenerate CARDNAME. A:AB$ Destroy | Cost$ 2 B Sac<2/Creature.Other/other creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Destroy target creature. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/eater_of_hope.jpg Oracle:Flying\n{B}, Sacrifice another creature: Regenerate Eater of Hope.\n{2}{B}, Sacrifice two other creatures: Destroy target creature. diff --git a/forge-gui/res/cardsfolder/e/ebon_praetor.txt b/forge-gui/res/cardsfolder/e/ebon_praetor.txt index 80cd4aeae05..0be587ff69e 100644 --- a/forge-gui/res/cardsfolder/e/ebon_praetor.txt +++ b/forge-gui/res/cardsfolder/e/ebon_praetor.txt @@ -10,7 +10,7 @@ A:AB$ RemoveCounter | Cost$ Sac<1/Creature> | CounterType$ M2M2 | CounterNum$ 1 SVar:DBPutCounter:DB$ PutCounter | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | CounterNum$ 1 | CounterType$ P1P0 | References$ X SVar:X:Sacrificed$Valid Thrull SVar:AIPreference:SacCost$Creature.Thrull,Creature.token+powerLE4+toughnessLE4,Creature.cmcLE2+powerLE2+toughnessLE3 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Thrull SVar:Picture:http://www.wizards.com/global/images/magic/general/ebon_praetor.jpg Oracle:First strike, trample\nAt the beginning of your upkeep, put a -2/-2 counter on Ebon Praetor.\nSacrifice a creature: Remove a -2/-2 counter from Ebon Praetor. If the sacrificed creature was a Thrull, put a +1/+0 counter on Ebon Praetor. Activate this ability only during your upkeep and only once each turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/e/ebon_stronghold.txt b/forge-gui/res/cardsfolder/e/ebon_stronghold.txt index a51aee46394..336772e0ff9 100644 --- a/forge-gui/res/cardsfolder/e/ebon_stronghold.txt +++ b/forge-gui/res/cardsfolder/e/ebon_stronghold.txt @@ -4,6 +4,6 @@ Types:Land K:CARDNAME enters the battlefield tapped. A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ B | Amount$ 2 | SpellDescription$ Add {B}{B}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ebon_stronghold.jpg Oracle:Ebon Stronghold enters the battlefield tapped.\n{T}: Add {B}.\n{T}, Sacrifice Ebon Stronghold: Add {B}{B}. diff --git a/forge-gui/res/cardsfolder/e/ebonblade_reaper.txt b/forge-gui/res/cardsfolder/e/ebonblade_reaper.txt index 551a9aa8bc7..3b316f05cab 100644 --- a/forge-gui/res/cardsfolder/e/ebonblade_reaper.txt +++ b/forge-gui/res/cardsfolder/e/ebonblade_reaper.txt @@ -9,6 +9,6 @@ T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage SVar:TrigLoseLifeOpp:DB$ LoseLife | Defined$ TriggeredTarget | LifeAmount$ EbonXOpp | References$ EbonXOpp SVar:EbonXYou:Count$YourLifeTotal/HalfUp SVar:EbonXOpp:TriggeredTarget$LifeTotal/HalfUp -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ebonblade_reaper.jpg Oracle:Whenever Ebonblade Reaper attacks, you lose half your life, rounded up.\nWhenever Ebonblade Reaper deals combat damage to a player, that player loses half their life, rounded up.\nMorph {3}{B}{B} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) diff --git a/forge-gui/res/cardsfolder/e/ebony_charm.txt b/forge-gui/res/cardsfolder/e/ebony_charm.txt index 1808a67b880..9faeb1234f0 100644 --- a/forge-gui/res/cardsfolder/e/ebony_charm.txt +++ b/forge-gui/res/cardsfolder/e/ebony_charm.txt @@ -6,6 +6,6 @@ SVar:EbonyDrain:DB$ LoseLife | ValidTgts$ Opponent | TgtPrompt$ Select target op SVar:EbonyGain:DB$ GainLife | Defined$ You | LifeAmount$ 1 SVar:EbonyExile:DB$ ChangeZone | TargetMin$ 0 | TargetMax$ 3 | TargetsFromSingleZone$ True | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SpellDescription$ Exile up to three target cards from a single graveyard. SVar:EbonyFear:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Fear | SpellDescription$ Target creature gains fear until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ebony_charm.jpg Oracle:Choose one —\n• Target opponent loses 1 life and you gain 1 life.\n• Exile up to three target cards from a single graveyard.\n• Target creature gains fear until end of turn. (It can't be blocked except by artifact creatures and/or black creatures.) diff --git a/forge-gui/res/cardsfolder/e/ebony_horse.txt b/forge-gui/res/cardsfolder/e/ebony_horse.txt index 3898cee7ac4..72f219f8b5d 100644 --- a/forge-gui/res/cardsfolder/e/ebony_horse.txt +++ b/forge-gui/res/cardsfolder/e/ebony_horse.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact A:AB$ Untap | Cost$ 2 T | ValidTgts$ Creature.attacking+YouCtrl | TgtPrompt$ Select target attacking creature you control | SubAbility$ DB | SpellDescription$ Untap target attacking creature you control. Prevent all combat damage that would be dealt to and dealt by that creature this turn. SVar:DB:DB$Pump | KW$ Prevent all combat damage that would be dealt to and dealt by CARDNAME. | Defined$ Targeted -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ebony_horse.jpg Oracle:{2}, {T}: Untap target attacking creature you control. Prevent all combat damage that would be dealt to and dealt by that creature this turn. diff --git a/forge-gui/res/cardsfolder/e/echo_mage.txt b/forge-gui/res/cardsfolder/e/echo_mage.txt index d8a472439ad..3159807fef8 100644 --- a/forge-gui/res/cardsfolder/e/echo_mage.txt +++ b/forge-gui/res/cardsfolder/e/echo_mage.txt @@ -10,6 +10,6 @@ SVar:CopyOnce:AB$CopySpellAbility | Cost$ U U T | ValidTgts$ Instant,Sorcery | S SVar:CopyTwice:AB$CopySpellAbility | Cost$ U U T | ValidTgts$ Instant,Sorcery | Amount$ 2 | SpellDescription$ Copy target instant or sorcery spell twice. You may choose new targets for the copies. SVar:X:Count$Valid Card.Self+counters_GE2_LEVEL+counters_LT4_LEVEL SVar:Y:Count$Valid Card.Self+counters_GE4_LEVEL -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/echo_mage.jpg Oracle:Level up {1}{U} ({1}{U}: Put a level counter on this. Level up only as a sorcery.)\nLEVEL 2-3\n2/4\n{U}{U}, {T}: Copy target instant or sorcery spell. You may choose new targets for the copy.\nLEVEL 4+\n2/5\n{U}{U}, {T}: Copy target instant or sorcery spell twice. You may choose new targets for the copies. diff --git a/forge-gui/res/cardsfolder/e/echoing_calm.txt b/forge-gui/res/cardsfolder/e/echoing_calm.txt index edd21547a4a..0643d3b14c8 100644 --- a/forge-gui/res/cardsfolder/e/echoing_calm.txt +++ b/forge-gui/res/cardsfolder/e/echoing_calm.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Destroy | Cost$ 1 W | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | SubAbility$ DBDestroyAll | RememberTargets$ True | ForgetOtherTargets$ True | SpellDescription$ Destroy target enchantment and all other enchantments with the same name as that enchantment. SVar:DBDestroyAll:DB$DestroyAll | ValidCards$ Remembered.Enchantment+Other+sameName | SubAbility$ DBCleanup SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/echoing_calm.jpg Oracle:Destroy target enchantment and all other enchantments with the same name as that enchantment. diff --git a/forge-gui/res/cardsfolder/e/echoing_decay.txt b/forge-gui/res/cardsfolder/e/echoing_decay.txt index ff383aac4e5..1316ed04eeb 100644 --- a/forge-gui/res/cardsfolder/e/echoing_decay.txt +++ b/forge-gui/res/cardsfolder/e/echoing_decay.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Pump | Cost$ 1 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | RememberTargets$ True | NumAtt$ -2 | NumDef$ -2 | SubAbility$ DBPumpAll | SpellDescription$ Target creature and all other creatures with the same name as that creature get -2/-2 until end of turn. SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Remembered.sameName+Other | NumAtt$ -2 | NumDef$ -2 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://resources.wizards.com/magic/cards/dst/en-us/card46176.jpg Oracle:Target creature and all other creatures with the same name as that creature get -2/-2 until end of turn. diff --git a/forge-gui/res/cardsfolder/e/echoing_ruin.txt b/forge-gui/res/cardsfolder/e/echoing_ruin.txt index 8d55d41e798..4cd39bbd180 100644 --- a/forge-gui/res/cardsfolder/e/echoing_ruin.txt +++ b/forge-gui/res/cardsfolder/e/echoing_ruin.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ Destroy | Cost$ 1 R | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SubAbility$ DBDestroyAll | RememberTargets$ True | ForgetOtherTargets$ True | SpellDescription$ Destroy target artifact and all other artifacts with the same name as that artifact. SVar:DBDestroyAll:DB$DestroyAll | ValidCards$ Remembered.Artifact+Other+sameName | SubAbility$ DBCleanup SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/echoing_ruin.jpg Oracle:Destroy target artifact and all other artifacts with the same name as that artifact. diff --git a/forge-gui/res/cardsfolder/e/edge_of_autumn.txt b/forge-gui/res/cardsfolder/e/edge_of_autumn.txt index 4a6a1cbf104..f8df4e359a4 100644 --- a/forge-gui/res/cardsfolder/e/edge_of_autumn.txt +++ b/forge-gui/res/cardsfolder/e/edge_of_autumn.txt @@ -3,6 +3,6 @@ ManaCost:1 G Types:Sorcery A:SP$ ChangeZone | Cost$ 1 G | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | Tapped$ True | ChangeNum$ 1 | ConditionPresent$ Land.YouCtrl | ConditionCompare$ LE4 | ConditionDescription$ If you control four or fewer lands, | SpellDescription$ If you control four or fewer lands, search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library. K:Cycling:Sac<1/Land> -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/edge_of_autumn.jpg Oracle:If you control four or fewer lands, search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library.\nCycling—Sacrifice a land. (Sacrifice a land, Discard this card: Draw a card.) diff --git a/forge-gui/res/cardsfolder/e/eerie_interlude.txt b/forge-gui/res/cardsfolder/e/eerie_interlude.txt index 5a3c24f21b7..4d7214a6632 100644 --- a/forge-gui/res/cardsfolder/e/eerie_interlude.txt +++ b/forge-gui/res/cardsfolder/e/eerie_interlude.txt @@ -6,6 +6,6 @@ SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ Tr SVar:TrigReturn:DB$ ChangeZone | Origin$ Exile | Destination$ Battlefield | Defined$ DelayTriggerRemembered SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$Valid Creature.YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/eerie_interlude.jpg Oracle:Exile any number of target creatures you control. Return those cards to the battlefield under their owner's control at the beginning of the next end step. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/e/eerie_procession.txt b/forge-gui/res/cardsfolder/e/eerie_procession.txt index 0e681126230..d9af307e873 100644 --- a/forge-gui/res/cardsfolder/e/eerie_procession.txt +++ b/forge-gui/res/cardsfolder/e/eerie_procession.txt @@ -2,7 +2,7 @@ Name:Eerie Procession ManaCost:2 U Types:Sorcery Arcane A:SP$ ChangeZone | Cost$ 2 U | Origin$ Library | Destination$ Hand | ChangeType$ Arcane | ChangeNum$ 1 | SpellDescription$ Search your library for an Arcane card, reveal that card, and put it into your hand. Then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/eerie_procession.jpg Oracle:Search your library for an Arcane card, reveal that card, and put it into your hand. Then shuffle your library. diff --git a/forge-gui/res/cardsfolder/e/eidolon_of_rhetoric.txt b/forge-gui/res/cardsfolder/e/eidolon_of_rhetoric.txt index d751c755c01..11c1c925ed8 100644 --- a/forge-gui/res/cardsfolder/e/eidolon_of_rhetoric.txt +++ b/forge-gui/res/cardsfolder/e/eidolon_of_rhetoric.txt @@ -4,6 +4,6 @@ Types:Enchantment Creature Spirit PT:1/4 S:Mode$ CantBeCast | ValidCard$ Card | Caster$ Player | NumLimitEachTurn$ 1 | Description$ Each player can't cast more than one spell each turn. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/eidolon_of_rhetoric.jpg Oracle:Each player can't cast more than one spell each turn. diff --git a/forge-gui/res/cardsfolder/e/eidolon_of_the_great_revel.txt b/forge-gui/res/cardsfolder/e/eidolon_of_the_great_revel.txt index a0a9ebf3cc7..4e9644c5f13 100644 --- a/forge-gui/res/cardsfolder/e/eidolon_of_the_great_revel.txt +++ b/forge-gui/res/cardsfolder/e/eidolon_of_the_great_revel.txt @@ -4,6 +4,6 @@ Types:Enchantment Creature Spirit PT:2/2 T:Mode$ SpellCast | ValidCard$ Card.cmcLE3 | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a player casts a spell with converted mana cost 3 or less, CARDNAME deals 2 damage to that player. SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredActivator | NumDmg$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/eidolon_of_the_great_revel.jpg Oracle:Whenever a player casts a spell with converted mana cost 3 or less, Eidolon of the Great Revel deals 2 damage to that player. diff --git a/forge-gui/res/cardsfolder/e/eiganjo_free_riders.txt b/forge-gui/res/cardsfolder/e/eiganjo_free_riders.txt index 55e15806db0..852d9c8c0ce 100644 --- a/forge-gui/res/cardsfolder/e/eiganjo_free_riders.txt +++ b/forge-gui/res/cardsfolder/e/eiganjo_free_riders.txt @@ -7,6 +7,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Creature.White | P SVar:TrigBounce:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Mandatory$ True | Hidden$ True | ChangeType$ Creature.White+YouCtrl SVar:NeedsToPlayVar:Z GE2 SVar:Z:Count$Valid Creature.White+YouCtrl+cmcLE4 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/eiganjo_free_riders.jpg Oracle:Flying\nAt the beginning of your upkeep, return a white creature you control to its owner's hand. diff --git a/forge-gui/res/cardsfolder/e/eight_and_a_half_tails.txt b/forge-gui/res/cardsfolder/e/eight_and_a_half_tails.txt index 540330cc694..8b8bf163513 100644 --- a/forge-gui/res/cardsfolder/e/eight_and_a_half_tails.txt +++ b/forge-gui/res/cardsfolder/e/eight_and_a_half_tails.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Fox Cleric PT:2/2 A:AB$ Protection | Cost$ 1 W | ValidTgts$ Permanent.YouCtrl | TgtPrompt$ Select target permanent you control | Gains$ white | SpellDescription$ Target permanent you control gains protection from white until end of turn. A:AB$ Animate | Cost$ 1 | Colors$ White | OverwriteColors$ True | ValidTgts$ Card | TgtZone$ Stack,Battlefield | SpellDescription$ Target spell or permanent becomes white until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHints:Name$Pious Kitsune SVar:Picture:http://www.wizards.com/global/images/magic/general/eight_and_a_half_tails.jpg Oracle:{1}{W}: Target permanent you control gains protection from white until end of turn.\n{1}: Target spell or permanent becomes white until end of turn. diff --git a/forge-gui/res/cardsfolder/e/eladamri.txt b/forge-gui/res/cardsfolder/e/eladamri.txt index 2be12008e0e..5d0c7295d72 100644 --- a/forge-gui/res/cardsfolder/e/eladamri.txt +++ b/forge-gui/res/cardsfolder/e/eladamri.txt @@ -6,5 +6,5 @@ A:AB$ Effect | ActivationZone$ Command | Cost$ 0 | ValidTgts$ Creature.YouCtrl | SVar:RedirectDamage:Event$ DamageDone | ValidTarget$ Creature.IsRemembered | ReplaceWith$ RedirectDmg | DamageTarget$ You | Description$ The next 1 damage that would be dealt to target creature you control is dealt to you instead. SVar:RedirectDmg:DB$ ReplaceSplitDamage | DamageTarget$ You SVar:Picture:https://downloads.cardforge.org/images/cards/VAN/Eladamri.full.jpg -SVar:RemAIDeck:True +AI:RemoveDeck:All Oracle:Hand -1, life +15\n{0}: The next 1 damage that would be dealt to target creature you control is dealt to you instead. diff --git a/forge-gui/res/cardsfolder/e/eladamri_lord_of_leaves_avatar.txt b/forge-gui/res/cardsfolder/e/eladamri_lord_of_leaves_avatar.txt index a3b390f1459..794f5e860a2 100644 --- a/forge-gui/res/cardsfolder/e/eladamri_lord_of_leaves_avatar.txt +++ b/forge-gui/res/cardsfolder/e/eladamri_lord_of_leaves_avatar.txt @@ -4,6 +4,6 @@ Types:Vanguard HandLifeModifier:-1/+2 T:Mode$ Phase | Phase$ Main1 | PreCombatMain$ True | ValidPlayer$ Player | TriggerZones$ Command | Execute$ TrigAddMana | TriggerDescription$ At the beginning of each player's precombat main phase, that player adds {G}{G}. SVar:TrigAddMana:DB$ Mana | Produced$ G | Amount$ 2 | Defined$ TriggeredPlayer -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:https://downloads.cardforge.org/images/cards/VAN/Eladamri, Lord of Leaves Avatar.full.jpg Oracle:Hand -1, life +2\nAt the beginning of each player's precombat main phase, that player adds {G}{G}. diff --git a/forge-gui/res/cardsfolder/e/elder_druid.txt b/forge-gui/res/cardsfolder/e/elder_druid.txt index 75663cb8160..a29d23abc67 100644 --- a/forge-gui/res/cardsfolder/e/elder_druid.txt +++ b/forge-gui/res/cardsfolder/e/elder_druid.txt @@ -3,6 +3,6 @@ ManaCost:3 G Types:Creature Elf Cleric Druid PT:2/2 A:AB$ TapOrUntap | Cost$ 3 G T | ValidTgts$ Artifact,Creature,Land | TgtPrompt$ Select target artifact, creature, or land | SpellDescription$ You may tap or untap target artifact, creature, or land. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/elder_druid.jpg Oracle:{3}{G}, {T}: You may tap or untap target artifact, creature, or land. diff --git a/forge-gui/res/cardsfolder/e/elder_pine_of_jukai.txt b/forge-gui/res/cardsfolder/e/elder_pine_of_jukai.txt index 835a05a1fde..5312e55c866 100644 --- a/forge-gui/res/cardsfolder/e/elder_pine_of_jukai.txt +++ b/forge-gui/res/cardsfolder/e/elder_pine_of_jukai.txt @@ -5,6 +5,6 @@ PT:2/1 T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDig | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, reveal the top three cards of your library. Put all land cards revealed this way into your hand and the rest on the bottom of your library in any order. SVar:TrigDig:DB$Dig | DigNum$ 3 | Reveal$ True | ChangeNum$ All | ChangeValid$ Land K:Soulshift:2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/elder_pine_of_jukai.jpg Oracle:Whenever you cast a Spirit or Arcane spell, reveal the top three cards of your library. Put all land cards revealed this way into your hand and the rest on the bottom of your library in any order.\nSoulshift 2 (When this creature dies, you may return target Spirit card with converted mana cost 2 or less from your graveyard to your hand.) diff --git a/forge-gui/res/cardsfolder/e/elder_spawn.txt b/forge-gui/res/cardsfolder/e/elder_spawn.txt index b9fdd057b3c..183b4de13dd 100644 --- a/forge-gui/res/cardsfolder/e/elder_spawn.txt +++ b/forge-gui/res/cardsfolder/e/elder_spawn.txt @@ -8,7 +8,7 @@ SVar:TrigElderSpawnSacrifice:DB$ Sacrifice | SacValid$ Island | Optional$ True | SVar:DBElderSpawnSacrificeMe:DB$ Sacrifice | Defined$ Self | ConditionDefined$ Remembered | ConditionPresent$ Island | ConditionCompare$ EQ0 | SubAbility$ DBElderSpawnDamage SVar:DBElderSpawnDamage:DB$ DealDamage | Defined$ You | NumDmg$ 6 | ConditionDefined$ Remembered | ConditionPresent$ Island | ConditionCompare$ EQ0 | SubAbility$ DBElderSpawnCleanup SVar:DBElderSpawnCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NeedsToPlayVar:Z GE3 SVar:Z:Count$Valid Island.YouCtrl+inZoneBattlefield SVar:Picture:http://www.wizards.com/global/images/magic/general/elder_spawn.jpg diff --git a/forge-gui/res/cardsfolder/e/eldrazi_temple.txt b/forge-gui/res/cardsfolder/e/eldrazi_temple.txt index b9840862fb6..edd97b99538 100644 --- a/forge-gui/res/cardsfolder/e/eldrazi_temple.txt +++ b/forge-gui/res/cardsfolder/e/eldrazi_temple.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ T | Produced$ C | Amount$ 2 | RestrictValid$ Card.Eldrazi+Colorless,Activated.Eldrazi+Colorless | SpellDescription$ Add {C}{C}. Spend this mana only to cast colorless Eldrazi spells or activate abilities of colorless Eldrazi. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/eldrazi_temple.jpg Oracle:{T}: Add {C}.\n{T}: Add {C}{C}. Spend this mana only to cast colorless Eldrazi spells or activate abilities of colorless Eldrazi. diff --git a/forge-gui/res/cardsfolder/e/elemental_augury.txt b/forge-gui/res/cardsfolder/e/elemental_augury.txt index a8682f8b5c8..26ce73f50aa 100644 --- a/forge-gui/res/cardsfolder/e/elemental_augury.txt +++ b/forge-gui/res/cardsfolder/e/elemental_augury.txt @@ -3,6 +3,6 @@ ManaCost:U B R Types:Enchantment A:AB$ RearrangeTopOfLibrary | Cost$ 3 | ValidTgts$ Player | TgtPrompt$ Choose target player. | NumCards$ 3 | SpellDescription$ Look at the top three cards of target player's library, then put them back in any order. SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/elemental_augury.jpg Oracle:{3}: Look at the top three cards of target player's library, then put them back in any order. diff --git a/forge-gui/res/cardsfolder/e/elephant_resurgence.txt b/forge-gui/res/cardsfolder/e/elephant_resurgence.txt index 0790151c102..25ff8fafdce 100644 --- a/forge-gui/res/cardsfolder/e/elephant_resurgence.txt +++ b/forge-gui/res/cardsfolder/e/elephant_resurgence.txt @@ -9,6 +9,6 @@ SVar:NeedsToPlayVar:Z GE2 SVar:Z:SVar$Z1/Minus.Z2 SVar:Z1:Count$ValidGraveyard Creature.YouOwn SVar:Z2:Count$ValidGraveyard Creature.OppOwn -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/elephant_resurgence.jpg Oracle:Each player creates a green Elephant creature token. Those creatures have "This creature's power and toughness are each equal to the number of creature cards in its controller's graveyard." diff --git a/forge-gui/res/cardsfolder/e/elfhame_sanctuary.txt b/forge-gui/res/cardsfolder/e/elfhame_sanctuary.txt index b0c75620658..daac07e28b8 100644 --- a/forge-gui/res/cardsfolder/e/elfhame_sanctuary.txt +++ b/forge-gui/res/cardsfolder/e/elfhame_sanctuary.txt @@ -5,6 +5,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | O SVar:TrigChange:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeNum$ 1 | SubAbility$ DBSkipDraw | ShuffleNonMandatory$ True SVar:DBSkipDraw:DB$ Effect | Name$ Elfhame Sanctuary Effect | Defined$ You | StaticAbilities$ SkipDraw SVar:SkipDraw:Mode$ Continuous | Affected$ You | AddKeyword$ Skip your draw step. | EffectZone$ Command | Description$ Skip your draw step. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/elfhame_sanctuary.jpg Oracle:At the beginning of your upkeep, you may search your library for a basic land card, reveal that card, and put it into your hand. If you do, you skip your draw step this turn and shuffle your library. diff --git a/forge-gui/res/cardsfolder/e/elite_arcanist.txt b/forge-gui/res/cardsfolder/e/elite_arcanist.txt index a0badade4fb..1b2ce7d98a8 100644 --- a/forge-gui/res/cardsfolder/e/elite_arcanist.txt +++ b/forge-gui/res/cardsfolder/e/elite_arcanist.txt @@ -11,6 +11,6 @@ SVar:ForgetCard:DB$ Cleanup | ForgetDefined$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True #Amount$ All | CopyOnce$ True for Strionic Resonator -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/elite_arcanist.jpg Oracle:When Elite Arcanist enters the battlefield, you may exile an instant card from your hand.\n{X}, {T}: Copy the exiled card. You may cast the copy without paying its mana cost. X is the converted mana cost of the exiled card. diff --git a/forge-gui/res/cardsfolder/e/elkin_lair.txt b/forge-gui/res/cardsfolder/e/elkin_lair.txt index 165df643e15..199d851df4b 100644 --- a/forge-gui/res/cardsfolder/e/elkin_lair.txt +++ b/forge-gui/res/cardsfolder/e/elkin_lair.txt @@ -16,6 +16,6 @@ SVar:DBDuration:DB$ StoreSVar | SVar$ ElkinSVar | Type$ Number | Expression$ 0 SVar:TrigReturn:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ Player | TriggerZones$ Command | Execute$ DBReturn | TriggerDescription$ At the beginning of the next end step, if the player hasn't played the card, they put it into their graveyard. SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Graveyard | SubAbility$ RemoveEffect SVar:RemoveEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/elkin_lair.jpg Oracle:At the beginning of each player's upkeep, that player exiles a card at random from their hand. The player may play that card this turn. At the beginning of the next end step, if the player hasn't played the card, they put it into their graveyard. diff --git a/forge-gui/res/cardsfolder/e/elsewhere_flask.txt b/forge-gui/res/cardsfolder/e/elsewhere_flask.txt index ba3abf04173..6c6ac972e0f 100644 --- a/forge-gui/res/cardsfolder/e/elsewhere_flask.txt +++ b/forge-gui/res/cardsfolder/e/elsewhere_flask.txt @@ -5,6 +5,6 @@ T:Mode$ ChangesZone | ValidCard$ Card.Self | Destination$ Battlefield | Execute$ SVar:TrigDraw:DB$ Draw | NumCards$ 1 A:AB$ ChooseType | Cost$ Sac<1/CARDNAME> | Type$ Basic Land | SubAbility$ DBAnimate | SpellDescription$ Choose a basic land type. Each land you control becomes that type until end of turn. SVar:DBAnimate:DB$ AnimateAll | ValidCards$ Land.YouCtrl | Types$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/elsewhere_flask.jpg Oracle:When Elsewhere Flask enters the battlefield, draw a card.\nSacrifice Elsewhere Flask: Choose a basic land type. Each land you control becomes that type until end of turn. diff --git a/forge-gui/res/cardsfolder/e/elusive_tormentor_insidious_mist.txt b/forge-gui/res/cardsfolder/e/elusive_tormentor_insidious_mist.txt index 235bbe756b2..f5d232f9f87 100644 --- a/forge-gui/res/cardsfolder/e/elusive_tormentor_insidious_mist.txt +++ b/forge-gui/res/cardsfolder/e/elusive_tormentor_insidious_mist.txt @@ -5,7 +5,7 @@ PT:4/4 A:AB$SetState | Cost$ 1 Discard<1/Card> | Defined$ Self | Mode$ Transform | SpellDescription$ Transform CARDNAME. SVar:Picture:http://www.wizards.com/global/images/magic/general/elusive_tormentor.jpg AlternateMode:DoubleFaced -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHas:Ability$Discard DeckHints:Keyword$Madness & Ability$Delirium Oracle:{1}, Discard a card: Transform Elusive Tormentor. diff --git a/forge-gui/res/cardsfolder/e/elven_palisade.txt b/forge-gui/res/cardsfolder/e/elven_palisade.txt index e04b578e06f..7aa921614e3 100644 --- a/forge-gui/res/cardsfolder/e/elven_palisade.txt +++ b/forge-gui/res/cardsfolder/e/elven_palisade.txt @@ -3,6 +3,6 @@ ManaCost:G Types:Enchantment A:AB$ Pump | Cost$ Sac<1/Forest> | NumAtt$ -3 | NumDef$ 0 | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking | SpellDescription$ Target attacking creature gets -3/-0 until end of turn. SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/elven_palisade.jpg Oracle:Sacrifice a Forest: Target attacking creature gets -3/-0 until end of turn. diff --git a/forge-gui/res/cardsfolder/e/elvish_branchbender.txt b/forge-gui/res/cardsfolder/e/elvish_branchbender.txt index 2225fe1927d..2c4de0c88d7 100644 --- a/forge-gui/res/cardsfolder/e/elvish_branchbender.txt +++ b/forge-gui/res/cardsfolder/e/elvish_branchbender.txt @@ -4,6 +4,6 @@ Types:Creature Elf Druid PT:2/2 A:AB$ Animate | Cost$ T | ValidTgts$ Forest | TgtPrompt$ Select target Forest | Power$ X | Toughness$ X | Types$ Creature,Treefolk | References$ X | SpellDescription$ Until end of turn, target Forest becomes an X/X Treefolk creature in addition to its other types, where X is the number of Elves you control. SVar:X:Count$Valid Elf.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_branchbender.jpg Oracle:{T}: Until end of turn, target Forest becomes an X/X Treefolk creature in addition to its other types, where X is the number of Elves you control. diff --git a/forge-gui/res/cardsfolder/e/elvish_harbinger.txt b/forge-gui/res/cardsfolder/e/elvish_harbinger.txt index 7a26529c6c0..d21d0e91f35 100644 --- a/forge-gui/res/cardsfolder/e/elvish_harbinger.txt +++ b/forge-gui/res/cardsfolder/e/elvish_harbinger.txt @@ -5,6 +5,6 @@ PT:1/2 A:AB$ Mana | Cost$ T | Produced$ Any | SpellDescription$ Add one mana of any color. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for an Elf card, reveal it, then shuffle your library and put that card on top of it. SVar:TrigChange:DB$ ChangeZone | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Card.Elf | ChangeNum$ 1 | ShuffleNonMandatory$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_harbinger.jpg Oracle:When Elvish Harbinger enters the battlefield, you may search your library for an Elf card, reveal it, then shuffle your library and put that card on top of it.\n{T}: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/e/elvish_healer.txt b/forge-gui/res/cardsfolder/e/elvish_healer.txt index 38085d0a841..cee7b8e1a8f 100644 --- a/forge-gui/res/cardsfolder/e/elvish_healer.txt +++ b/forge-gui/res/cardsfolder/e/elvish_healer.txt @@ -5,7 +5,7 @@ PT:1/2 A:AB$ PreventDamage | Cost$ T | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | Amount$ X | RememberTargets$ True | SubAbility$ DBCleanup | References$ X | SpellDescription$ Prevent the next 1 damage that would be dealt to any target this turn. If that creature is green, prevent the next 2 damage instead. SVar:X:Remembered$Valid Creature.Green/Plus.1 SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Color$Green SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_healer.jpg Oracle:{T}: Prevent the next 1 damage that would be dealt to any target this turn. If that creature is green, prevent the next 2 damage instead. diff --git a/forge-gui/res/cardsfolder/e/elvish_pathcutter.txt b/forge-gui/res/cardsfolder/e/elvish_pathcutter.txt index 94197f40a88..076c42a99ee 100644 --- a/forge-gui/res/cardsfolder/e/elvish_pathcutter.txt +++ b/forge-gui/res/cardsfolder/e/elvish_pathcutter.txt @@ -3,6 +3,6 @@ ManaCost:3 G Types:Creature Elf Scout PT:1/2 A:AB$ Pump | Cost$ 2 G | ValidTgts$ Creature.Elf | TgtPrompt$ Select target Elf creature | KW$ Forestwalk | SpellDescription$ Target Elf creature gains forestwalk until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_pathcutter.jpg Oracle:{2}{G}: Target Elf creature gains forestwalk until end of turn. diff --git a/forge-gui/res/cardsfolder/e/elvish_promenade.txt b/forge-gui/res/cardsfolder/e/elvish_promenade.txt index e71212dfc54..ea83bc81692 100644 --- a/forge-gui/res/cardsfolder/e/elvish_promenade.txt +++ b/forge-gui/res/cardsfolder/e/elvish_promenade.txt @@ -3,6 +3,6 @@ ManaCost:3 G Types:Tribal Sorcery Elf A:SP$ Token | Cost$ 3 G | TokenAmount$ X | TokenName$ Elf Warrior | TokenTypes$ Creature,Elf,Warrior | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | References$ X | SpellDescription$ Create a 1/1 green Elf Warrior creature token for each Elf you control. SVar:X:Count$Valid Elf.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_promenade.jpg Oracle:Create a 1/1 green Elf Warrior creature token for each Elf you control. diff --git a/forge-gui/res/cardsfolder/e/elvish_scout.txt b/forge-gui/res/cardsfolder/e/elvish_scout.txt index 1dcb45c57c9..4c65c748db3 100644 --- a/forge-gui/res/cardsfolder/e/elvish_scout.txt +++ b/forge-gui/res/cardsfolder/e/elvish_scout.txt @@ -4,6 +4,6 @@ Types:Creature Elf Scout PT:1/1 A:AB$ Untap | Cost$ G T | ValidTgts$ Creature.attacking+YouCtrl | TgtPrompt$ Select target attacking creature you control | SubAbility$ DBPump | SpellDescription$ Untap target attacking creature you control. Prevent all combat damage that would be dealt to and dealt by it this turn. SVar:DBPump:DB$Pump | Defined$ Targeted | KW$ Prevent all combat damage that would be dealt to and dealt by CARDNAME. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_scout.jpg Oracle:{G}, {T}: Untap target attacking creature you control. Prevent all combat damage that would be dealt to and dealt by it this turn. diff --git a/forge-gui/res/cardsfolder/e/embalmed_brawler.txt b/forge-gui/res/cardsfolder/e/embalmed_brawler.txt index b00b1b7f32c..bba05266bc3 100644 --- a/forge-gui/res/cardsfolder/e/embalmed_brawler.txt +++ b/forge-gui/res/cardsfolder/e/embalmed_brawler.txt @@ -7,6 +7,6 @@ T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescript T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigLoseLife | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or blocks, you lose 1 life for each +1/+1 counter on it. SVar:TrigLoseLife:DB$ LoseLife | Defined$ You | LifeAmount$ X | References$ X SVar:X:Count$CardCounters.P1P1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/embalmed_brawler.jpg Oracle:Amplify 1 (As this creature enters the battlefield, put a +1/+1 counter on it for each Zombie card you reveal in your hand.)\nWhenever Embalmed Brawler attacks or blocks, you lose 1 life for each +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/e/embalmers_tools.txt b/forge-gui/res/cardsfolder/e/embalmers_tools.txt index 4ce67782da6..bce9917049b 100644 --- a/forge-gui/res/cardsfolder/e/embalmers_tools.txt +++ b/forge-gui/res/cardsfolder/e/embalmers_tools.txt @@ -3,7 +3,7 @@ ManaCost:2 Types:Artifact S:Mode$ ReduceCost | ValidCard$ Creature.YouOwn+inZoneGraveyard | Type$ Ability | Amount$ 1 | Description$ Activated abilities of creature cards in your graveyard cost {1} less to activate. A:AB$ Mill | Cost$ tapXType<1/Zombie> | NumCards$ 1 | ValidTgts$ Player | TgtPrompt$ Choose a player | AILogic$ EndOfOppTurn | SpellDescription$ Target player puts the top card of their library into their graveyard. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Zombie SVar:Picture:http://www.wizards.com/global/images/magic/general/embalmers_tools.jpg Oracle:Activated abilities of creature cards in your graveyard cost {1} less to activate.\nTap an untapped Zombie you control: Target player puts the top card of their library into their graveyard. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/e/embargo.txt b/forge-gui/res/cardsfolder/e/embargo.txt index a59fbc11af8..4cdac8022ab 100644 --- a/forge-gui/res/cardsfolder/e/embargo.txt +++ b/forge-gui/res/cardsfolder/e/embargo.txt @@ -4,7 +4,7 @@ Types:Enchantment S:Mode$ Continuous | Affected$ Permanent.nonLand | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Nonland permanents don't untap during their controllers' untap steps. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ At the beginning of your upkeep, you lose 2 life. SVar:TrigLoseLife:DB$LoseLife | Defined$ You | LifeAmount$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/embargo.jpg Oracle:Nonland permanents don't untap during their controllers' untap steps.\nAt the beginning of your upkeep, you lose 2 life. diff --git a/forge-gui/res/cardsfolder/e/ember_gale.txt b/forge-gui/res/cardsfolder/e/ember_gale.txt index fde7da3f763..91fec0362f2 100644 --- a/forge-gui/res/cardsfolder/e/ember_gale.txt +++ b/forge-gui/res/cardsfolder/e/ember_gale.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ Effect | Cost$ 3 R | Name$ Ember Gale Effect | ValidTgts$ Player | TgtPrompt$ Select target player | AILogic$ Evasion | StaticAbilities$ CantBlock | RememberObjects$ Targeted | SubAbility$ DBDamage | SpellDescription$ Creatures target player controls can't block this turn. CARDNAME deals 1 damage to each white and/or blue creature that player controls. SVar:DBDamage:DB$ DamageAll | NumDmg$ 1 | ValidCards$ Creature.White+TargetedPlayerCtrl,Creature.Blue+TargetedPlayerCtrl | ValidDescription$ each creature that's white or blue that player controls. SVar:CantBlock:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.RememberedPlayerCtrl | AddHiddenKeyword$ CARDNAME can't block. | SubAbility$ DBDamage | SpellDescription$ Creatures targeted player controls can't block this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ember_gale.jpg Oracle:Creatures target player controls can't block this turn. Ember Gale deals 1 damage to each white and/or blue creature that player controls. diff --git a/forge-gui/res/cardsfolder/e/emberwilde_caliph.txt b/forge-gui/res/cardsfolder/e/emberwilde_caliph.txt index 1567e0df84c..aae59424018 100644 --- a/forge-gui/res/cardsfolder/e/emberwilde_caliph.txt +++ b/forge-gui/res/cardsfolder/e/emberwilde_caliph.txt @@ -8,6 +8,6 @@ K:CARDNAME attacks each combat if able. T:Mode$ DamageDealtOnce | ValidSource$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever CARDNAME deals damage, you lose that much life. SVar:TrigLoseLife:DB$ LoseLife | Defined$ You | LifeAmount$ X | References$ X SVar:X:TriggerCount$DamageAmount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/emberwilde_caliph.jpg Oracle:Flying, trample\nEmberwilde Caliph attacks each combat if able.\nWhenever Emberwilde Caliph deals damage, you lose that much life. diff --git a/forge-gui/res/cardsfolder/e/embolden.txt b/forge-gui/res/cardsfolder/e/embolden.txt index b3fdc925a2f..ca3dd50f48a 100644 --- a/forge-gui/res/cardsfolder/e/embolden.txt +++ b/forge-gui/res/cardsfolder/e/embolden.txt @@ -3,6 +3,6 @@ ManaCost:2 W Types:Instant A:SP$ PreventDamage | Cost$ 2 W | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target to prevent damage to | Amount$ 4 | TargetMin$ 1 | TargetMax$ 4 | DividedAsYouChoose$ 4 | SpellDescription$ Prevent the next 4 damage that would be dealt this turn to any number of targets, divided as you choose. K:Flashback:1 W -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/embolden.jpg Oracle:Prevent the next 4 damage that would be dealt this turn to any number of targets, divided as you choose.\nFlashback {1}{W} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/e/emerald_charm.txt b/forge-gui/res/cardsfolder/e/emerald_charm.txt index 776dc82630a..71fd427817f 100644 --- a/forge-gui/res/cardsfolder/e/emerald_charm.txt +++ b/forge-gui/res/cardsfolder/e/emerald_charm.txt @@ -5,6 +5,6 @@ A:SP$ Charm | Cost$ G | Choices$ DBUntap,DBDestroy,DBDebuff | Defined$ You SVar:DBUntap:DB$ Untap | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | SpellDescription$ Untap target permanent. SVar:DBDestroy:DB$ Destroy | ValidTgts$ Enchantment.nonAura | TgtPrompt$ Select target non-Aura enchantment | SpellDescription$ Destroy target non-Aura enchantment. SVar:DBDebuff:DB$ Debuff | ValidTgts$ Creature | TgtPrompt$ Select target creature | Keywords$ Flying | SpellDescription$ Target creature loses flying until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/emerald_charm.jpg Oracle:Choose one —\n• Untap target permanent.\n• Destroy target non-Aura enchantment.\n• Target creature loses flying until end of turn. diff --git a/forge-gui/res/cardsfolder/e/emerald_medallion.txt b/forge-gui/res/cardsfolder/e/emerald_medallion.txt index 2bf952b9735..83fede0fc4a 100644 --- a/forge-gui/res/cardsfolder/e/emerald_medallion.txt +++ b/forge-gui/res/cardsfolder/e/emerald_medallion.txt @@ -2,7 +2,7 @@ Name:Emerald Medallion ManaCost:2 Types:Artifact S:Mode$ ReduceCost | ValidCard$ Card.Green | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Green spells you cast cost {1} less to cast. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$green SVar:Picture:http://www.wizards.com/global/images/magic/general/emerald_medallion.jpg Oracle:Green spells you cast cost {1} less to cast. diff --git a/forge-gui/res/cardsfolder/e/empty_city_ruse.txt b/forge-gui/res/cardsfolder/e/empty_city_ruse.txt index a2255e5041d..bd8d1d749bd 100644 --- a/forge-gui/res/cardsfolder/e/empty_city_ruse.txt +++ b/forge-gui/res/cardsfolder/e/empty_city_ruse.txt @@ -2,6 +2,6 @@ Name:Empty City Ruse ManaCost:W Types:Sorcery A:SP$ Pump | Cost$ W | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | KW$ Skip all combat phases of your next turn. | Permanent$ True | SpellDescription$ Target opponent skips all combat phases of their next turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/empty_city_ruse.jpg Oracle:Target opponent skips all combat phases of their next turn. diff --git a/forge-gui/res/cardsfolder/e/empty_the_catacombs.txt b/forge-gui/res/cardsfolder/e/empty_the_catacombs.txt index b52623dc259..4d136dc1641 100644 --- a/forge-gui/res/cardsfolder/e/empty_the_catacombs.txt +++ b/forge-gui/res/cardsfolder/e/empty_the_catacombs.txt @@ -2,6 +2,6 @@ Name:Empty the Catacombs ManaCost:3 B Types:Sorcery A:SP$ ChangeZoneAll | Cost$ 3 B | ChangeType$ Creature | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Each player returns all creature cards from their graveyard to their hand. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/empty_the_catacombs.jpg Oracle:Each player returns all creature cards from their graveyard to their hand. diff --git a/forge-gui/res/cardsfolder/e/emrakul_the_promised_end.txt b/forge-gui/res/cardsfolder/e/emrakul_the_promised_end.txt index 6ef5299cb58..f59631b16b1 100644 --- a/forge-gui/res/cardsfolder/e/emrakul_the_promised_end.txt +++ b/forge-gui/res/cardsfolder/e/emrakul_the_promised_end.txt @@ -12,6 +12,6 @@ SVar:TrigControlPlayer:DB$ ControlPlayer | ValidTgts$ Opponent | TgtPrompt$ Sele SVar:DBDelTrig:DB$ DelayedTrigger | Mode$ Phase | ValidPlayer$ Player.IsRemembered | Phase$ Untap | Execute$ DBAddTurn | Static$ True SVar:DBAddTurn:DB$ AddTurn | Defined$ Remembered | NumTurns$ 1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/emrakul_the_promised_end.jpg Oracle:Emrakul, the Promised End costs {1} less to cast for each card type among cards in your graveyard.\nWhen you cast Emrakul, you gain control of target opponent during that player's next turn. After that turn, that player takes an extra turn.\nFlying, trample, protection from instants \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/e/emrakuls_influence.txt b/forge-gui/res/cardsfolder/e/emrakuls_influence.txt index 4c83d273f64..307e262ab1a 100644 --- a/forge-gui/res/cardsfolder/e/emrakuls_influence.txt +++ b/forge-gui/res/cardsfolder/e/emrakuls_influence.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ SpellCast | ValidCard$ Creature.Eldrazi+cmcGE7 | ValidActivatingPlayer$ You | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast an Eldrazi creature spell with converted mana cost 7 or greater, draw two cards. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 2 DeckNeeds:Type$Eldrazi -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/emrakuls_influence.jpg Oracle:Whenever you cast an Eldrazi creature spell with converted mana cost 7 or greater, draw two cards. diff --git a/forge-gui/res/cardsfolder/e/encase_in_ice.txt b/forge-gui/res/cardsfolder/e/encase_in_ice.txt index f30458a4a23..8e9480dad76 100644 --- a/forge-gui/res/cardsfolder/e/encase_in_ice.txt +++ b/forge-gui/res/cardsfolder/e/encase_in_ice.txt @@ -7,6 +7,6 @@ A:SP$ Attach | Cost$ 1 U | ValidTgts$ Creature.Red,Creature.Green | TgtPrompt$ S T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigTap | TriggerDescription$ When CARDNAME enters the battlefield, tap enchanted creature. SVar:TrigTap:DB$ Tap | Defined$ Enchanted S:Mode$ Continuous | Affected$ Creature.AttachedBy | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Enchanted creature doesn't untap during its controller's untap step. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/encase_in_ice.jpg Oracle:Flash (You may cast this spell any time you could cast an instant.)\nEnchant red or green creature\nWhen Encase in Ice enters the battlefield, tap enchanted creature.\nEnchanted creature doesn't untap during its controller's untap step. diff --git a/forge-gui/res/cardsfolder/e/enchanted_evening.txt b/forge-gui/res/cardsfolder/e/enchanted_evening.txt index bd5cceeceb0..cce6ddcddb6 100644 --- a/forge-gui/res/cardsfolder/e/enchanted_evening.txt +++ b/forge-gui/res/cardsfolder/e/enchanted_evening.txt @@ -3,6 +3,6 @@ ManaCost:3 WU WU Types:Enchantment S:Mode$ Continuous | Affected$ Permanent | AddType$ Enchantment | Description$ All permanents are enchantments in addition to their other types. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/enchanted_evening.jpg Oracle:All permanents are enchantments in addition to their other types. diff --git a/forge-gui/res/cardsfolder/e/enchantresss_presence.txt b/forge-gui/res/cardsfolder/e/enchantresss_presence.txt index ead13b3fa6f..d2950dbe86a 100644 --- a/forge-gui/res/cardsfolder/e/enchantresss_presence.txt +++ b/forge-gui/res/cardsfolder/e/enchantresss_presence.txt @@ -3,6 +3,6 @@ ManaCost:2 G Types:Enchantment T:Mode$ SpellCast | ValidCard$ Enchantment | ValidActivatingPlayer$ You | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast an enchantment spell, draw a card. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/enchantresss_presence.jpg Oracle:Whenever you cast an enchantment spell, draw a card. diff --git a/forge-gui/res/cardsfolder/e/endangered_armodon.txt b/forge-gui/res/cardsfolder/e/endangered_armodon.txt index 15e1dd55296..bc2cce670e0 100644 --- a/forge-gui/res/cardsfolder/e/endangered_armodon.txt +++ b/forge-gui/res/cardsfolder/e/endangered_armodon.txt @@ -4,6 +4,6 @@ Types:Creature Elephant PT:4/5 T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Creature.toughnessLE2+YouCtrl | PresentCompare$ GE1 | Execute$ TrigSac | TriggerDescription$ When you control a creature with toughness 2 or less, sacrifice CARDNAME. SVar:TrigSac:DB$Sacrifice | Defined$ Self -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/endangered_armodon.jpg Oracle:When you control a creature with toughness 2 or less, sacrifice Endangered Armodon. diff --git a/forge-gui/res/cardsfolder/e/endemic_plague.txt b/forge-gui/res/cardsfolder/e/endemic_plague.txt index 63bf9bef781..e406c855b1d 100644 --- a/forge-gui/res/cardsfolder/e/endemic_plague.txt +++ b/forge-gui/res/cardsfolder/e/endemic_plague.txt @@ -3,6 +3,6 @@ ManaCost:3 B Types:Sorcery A:SP$ DestroyAll | Cost$ 3 B Sac<1/Creature> | RememberCostCards$ True | ValidCards$ Creature.sharesCreatureTypeWith Remembered | SubAbility$ DBCleanup | SpellDescription$ Destroy all creatures that share a creature type with the sacrificed creature. They can't be regenerated. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/endemic_plague.jpg Oracle:As an additional cost to cast Endemic Plague, sacrifice a creature.\nDestroy all creatures that share a creature type with the sacrificed creature. They can't be regenerated. diff --git a/forge-gui/res/cardsfolder/e/endless_horizons.txt b/forge-gui/res/cardsfolder/e/endless_horizons.txt index 8a2a467939b..f5feb9d1ef6 100644 --- a/forge-gui/res/cardsfolder/e/endless_horizons.txt +++ b/forge-gui/res/cardsfolder/e/endless_horizons.txt @@ -6,6 +6,6 @@ SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Library | Destination$ Exile | Chan T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigRetrieve | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, you may put a card you own exiled with CARDNAME into your hand. SVar:TrigRetrieve:DB$ ChangeZone | ChangeType$ Card.IsRemembered+YouOwn | ChangeNum$ 1 | Origin$ Exile | Destination$ Hand | Hidden$ True SVar:X:Count$TypeInYourLibrary.Plains -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/endless_horizons.jpg Oracle:When Endless Horizons enters the battlefield, search your library for any number of Plains cards and exile them. Then shuffle your library.\nAt the beginning of your upkeep, you may put a card you own exiled with Endless Horizons into your hand. diff --git a/forge-gui/res/cardsfolder/e/endless_ranks_of_the_dead.txt b/forge-gui/res/cardsfolder/e/endless_ranks_of_the_dead.txt index 7b47fad8c23..cc8e262d955 100644 --- a/forge-gui/res/cardsfolder/e/endless_ranks_of_the_dead.txt +++ b/forge-gui/res/cardsfolder/e/endless_ranks_of_the_dead.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of your upkeep, create X 2/2 black Zombie creature tokens, where X is half the number of Zombies you control, rounded down. SVar:TrigToken:DB$ Token | TokenImage$ b 2 2 zombie ISD | TokenAltImages$ b_2_2_zombie2_ISD,b_2_2_zombie3_ISD | TokenAmount$ X | TokenName$ Zombie | TokenTypes$ Creature,Zombie | TokenOwner$ You | TokenPower$ 2 | TokenToughness$ 2 | TokenColors$ Black | References$ X SVar:X:Count$Valid Creature.Zombie+YouCtrl/HalfDown -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/endless_ranks_of_the_dead.jpg Oracle:At the beginning of your upkeep, create X 2/2 black Zombie creature tokens, where X is half the number of Zombies you control, rounded down. diff --git a/forge-gui/res/cardsfolder/e/endless_swarm.txt b/forge-gui/res/cardsfolder/e/endless_swarm.txt index d97bb67edbd..3f74152b888 100644 --- a/forge-gui/res/cardsfolder/e/endless_swarm.txt +++ b/forge-gui/res/cardsfolder/e/endless_swarm.txt @@ -5,6 +5,6 @@ K:Epic A:SP$ Token | Cost$ 5 G G G | TokenAmount$ X | TokenName$ Snake | TokenTypes$ Creature,Snake | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | TokenImage$ g 1 1 snake CHK | References$ X | SpellDescription$ Create a 1/1 green Snake creature token for each card in your hand. SVar:X:Count$InYourHand #NOTE: The AI will not stop making land drops after casting this spell (so, random decks may also utilize manlands and other cards with activation cost already on the battlefield to the maximum effect) -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/endless_swarm.jpg Oracle:Create a 1/1 green Snake creature token for each card in your hand.\nEpic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability.) diff --git a/forge-gui/res/cardsfolder/e/endless_whispers.txt b/forge-gui/res/cardsfolder/e/endless_whispers.txt index 744e470215d..2abd0a041e3 100644 --- a/forge-gui/res/cardsfolder/e/endless_whispers.txt +++ b/forge-gui/res/cardsfolder/e/endless_whispers.txt @@ -7,7 +7,7 @@ SVar:EndlessDelayTrigReturn:DB$ Effect | ValidTgts$ Opponent | TgtPrompt$ Select SVar:TrigEndlessGain:Mode$ Phase | Phase$ End of Turn | Execute$ EndlessReturn | TriggerZones$ Command | TriggerDescription$ Return CARDNAME to the battlefield. SVar:EndlessReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ Imprinted | GainControl$ True | SubAbility$ EndlessRemoveEffect SVar:EndlessRemoveEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/endless_whispers.jpg Oracle:Each creature has "When this creature dies, choose target opponent. That player puts this card from its owner's graveyard onto the battlefield under their control at the beginning of the next end step." diff --git a/forge-gui/res/cardsfolder/e/endure.txt b/forge-gui/res/cardsfolder/e/endure.txt index 411ee639a80..93d460661de 100644 --- a/forge-gui/res/cardsfolder/e/endure.txt +++ b/forge-gui/res/cardsfolder/e/endure.txt @@ -3,6 +3,6 @@ ManaCost:3 W W Types:Instant A:SP$ Effect | Cost$ 3 W W | Name$ Endure Effect | ReplacementEffects$ RPrevent | AILogic$ Fog | SpellDescription$ Prevent all damage that would be dealt to you and permanents you control this turn. SVar:RPrevent:Event$ DamageDone | Prevent$ True | ActiveZones$ Command | ValidTarget$ You,Permanent.YouCtrl | Description$ Prevent all damage that would be dealt to you and permanents you control this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/endure.jpg Oracle:Prevent all damage that would be dealt to you and permanents you control this turn. diff --git a/forge-gui/res/cardsfolder/e/enduring_ideal.txt b/forge-gui/res/cardsfolder/e/enduring_ideal.txt index a120b4c1592..0e4c2e7e323 100644 --- a/forge-gui/res/cardsfolder/e/enduring_ideal.txt +++ b/forge-gui/res/cardsfolder/e/enduring_ideal.txt @@ -3,6 +3,6 @@ ManaCost:5 W W Types:Sorcery K:Epic A:SP$ChangeZone | Cost$ 5 W W | Origin$ Library | Destination$ Battlefield | ChangeType$ Enchantment | ChangeNum$ 1 | SpellDescription$ Search your library for an enchantment card, put it onto the battlefield, then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/enduring_ideal.jpg Oracle:Search your library for an enchantment card, put it onto the battlefield, then shuffle your library.\nEpic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability.) diff --git a/forge-gui/res/cardsfolder/e/enduring_renewal.txt b/forge-gui/res/cardsfolder/e/enduring_renewal.txt index 0d09ff5c047..77c521d8076 100644 --- a/forge-gui/res/cardsfolder/e/enduring_renewal.txt +++ b/forge-gui/res/cardsfolder/e/enduring_renewal.txt @@ -9,8 +9,8 @@ SVar:DBEnduringDraw:DB$ Draw | NumCards$ 1 | ConditionDefined$ Remembered | Cond SVar:DBEnduringCleanup:DB$ Cleanup | ClearRemembered$ True T:Mode$ ChangesZone | ValidCard$ Creature.YouOwn | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigEnduringBounce | TriggerZones$ Battlefield | TriggerDescription$ Whenever a creature is put into your graveyard from the battlefield, return it to your hand. SVar:TrigEnduringBounce:DB$ ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Hand -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/enduring_renewal.jpg Oracle:Play with your hand revealed.\nIf you would draw a card, reveal the top card of your library instead. If it's a creature card, put it into your graveyard. Otherwise, draw a card.\nWhenever a creature is put into your graveyard from the battlefield, return it to your hand. diff --git a/forge-gui/res/cardsfolder/e/energy_arc.txt b/forge-gui/res/cardsfolder/e/energy_arc.txt index 0866b30bbda..db7d097103d 100644 --- a/forge-gui/res/cardsfolder/e/energy_arc.txt +++ b/forge-gui/res/cardsfolder/e/energy_arc.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Untap | Cost$ W U | TargetMin$ 0 | TargetMax$ MaxTgts | TgtPrompt$ Choose any number of target creatures | ValidTgts$ Creature | References$ MaxTgts | SpellDescription$ Untap any number of target creatures. Prevent all combat damage that would be dealt to and dealt by those creatures this turn. | SubAbility$ DBPump SVar:DBPump:DB$Pump | Defined$ Targeted | KW$ Prevent all combat damage that would be dealt to and dealt by CARDNAME. SVar:MaxTgts:Count$Valid Creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/energy_arc.jpg Oracle:Untap any number of target creatures. Prevent all combat damage that would be dealt to and dealt by those creatures this turn. diff --git a/forge-gui/res/cardsfolder/e/energy_chamber.txt b/forge-gui/res/cardsfolder/e/energy_chamber.txt index f74d21225c5..4d25ce95049 100644 --- a/forge-gui/res/cardsfolder/e/energy_chamber.txt +++ b/forge-gui/res/cardsfolder/e/energy_chamber.txt @@ -5,7 +5,7 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigCharm | TriggerZ SVar:TrigCharm:DB$ Charm | Choices$ CounterP1P1,CounterCharge | CharmNum$ 1 SVar:CounterP1P1:DB$ PutCounter | ValidTgts$ Creature.Artifact | TgtPrompt$ Select target artifact creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target artifact creature. SVar:CounterCharge:DB$ PutCounter | ValidTgts$ Artifact.nonCreature | TgtPrompt$ Select target noncreature artifact | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on target noncreature artifact. -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckNeeds:Type$Artifact DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/energy_chamber.jpg diff --git a/forge-gui/res/cardsfolder/e/energy_field.txt b/forge-gui/res/cardsfolder/e/energy_field.txt index 5c4daef6e42..741c0b0c8d2 100644 --- a/forge-gui/res/cardsfolder/e/energy_field.txt +++ b/forge-gui/res/cardsfolder/e/energy_field.txt @@ -6,6 +6,6 @@ SVar:TrigSac:DB$ Sacrifice | Defined$ Self R:Event$ DamageDone | ActiveZones$ Battlefield | Prevent$ True | ValidTarget$ You | ValidSource$ Card.YouDontCtrl,Emblem.YouDontCtrl | Description$ Prevent all damage that would be dealt to you by sources you don't control. SVar:NonStackingEffect:True #NOTE: The AI will not play around this effect, so it's only good in properly designed decks that circumvent the necessity to worry about the detrimental effect. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/energy_field.jpg Oracle:Prevent all damage that would be dealt to you by sources you don't control.\nWhen a card is put into your graveyard from anywhere, sacrifice Energy Field. diff --git a/forge-gui/res/cardsfolder/e/energy_flux.txt b/forge-gui/res/cardsfolder/e/energy_flux.txt index 146504a83ff..b06d9bf04e3 100644 --- a/forge-gui/res/cardsfolder/e/energy_flux.txt +++ b/forge-gui/res/cardsfolder/e/energy_flux.txt @@ -2,6 +2,6 @@ Name:Energy Flux ManaCost:2 U Types:Enchantment S:Mode$ Continuous | Affected$ Artifact | AddKeyword$ UpkeepCost:2 | Description$ All artifacts have "At the beginning of your upkeep, sacrifice this artifact unless you pay {2}." -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/energy_flux.jpg Oracle:All artifacts have "At the beginning of your upkeep, sacrifice this artifact unless you pay {2}." diff --git a/forge-gui/res/cardsfolder/e/energy_storm.txt b/forge-gui/res/cardsfolder/e/energy_storm.txt index 5dfddb91f63..0658c38b4e4 100644 --- a/forge-gui/res/cardsfolder/e/energy_storm.txt +++ b/forge-gui/res/cardsfolder/e/energy_storm.txt @@ -4,7 +4,7 @@ Types:Enchantment K:Cumulative upkeep:1 S:Mode$ Continuous | Affected$ Creature.withFlying | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Creatures with flying don't untap during their controllers' untap steps. R:Event$ DamageDone | ActiveZones$ Battlefield | Prevent$ True | ValidSource$ Instant,Sorcery | Description$ Prevent all damage that would be dealt by instant and sorcery spells. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/energy_storm.jpg Oracle:Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nPrevent all damage that would be dealt by instant and sorcery spells.\nCreatures with flying don't untap during their controllers' untap steps. diff --git a/forge-gui/res/cardsfolder/e/energy_tap.txt b/forge-gui/res/cardsfolder/e/energy_tap.txt index 25a5689e024..02f4d3884a8 100644 --- a/forge-gui/res/cardsfolder/e/energy_tap.txt +++ b/forge-gui/res/cardsfolder/e/energy_tap.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ Tap | Cost$ U | TgtPrompt$ Select target untapped creature you control | ValidTgts$ Creature.untapped+YouCtrl | SubAbility$ DBMana | SpellDescription$ Tap target untapped creature you control. If you do, add an amount of {C} equal to that creature's converted mana cost. SVar:DBMana:DB$Mana | Produced$ C | Amount$ X | References$ X SVar:X:Targeted$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/energy_tap.jpg Oracle:Tap target untapped creature you control. If you do, add an amount of {C} equal to that creature's converted mana cost. diff --git a/forge-gui/res/cardsfolder/e/energy_vortex.txt b/forge-gui/res/cardsfolder/e/energy_vortex.txt index cab8faf9c94..439f2e4db40 100644 --- a/forge-gui/res/cardsfolder/e/energy_vortex.txt +++ b/forge-gui/res/cardsfolder/e/energy_vortex.txt @@ -10,6 +10,6 @@ SVar:TrigDamage:DB$ DealDamage | Defined$ ChosenPlayer | NumDmg$ 3 | UnlessCost$ A:AB$ PutCounter | Cost$ X | CounterType$ VORTEX | CounterNum$ X | References$ X | PlayerTurn$ True | ActivationPhases$ Upkeep | SpellDescription$ Put X vortex counters on CARDNAME. Activate this ability only during your upkeep. SVar:X:Count$xPaid SVar:Y:Count$CardCounters.VORTEX -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/energy_vortex.jpg Oracle:As Energy Vortex enters the battlefield, choose an opponent.\nAt the beginning of your upkeep, remove all vortex counters from Energy Vortex.\nAt the beginning of the chosen player's upkeep, Energy Vortex deals 3 damage to that player unless they pay {1} for each vortex counter on Energy Vortex.\n{X}: Put X vortex counters on Energy Vortex. Activate this ability only during your upkeep. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/e/enervate.txt b/forge-gui/res/cardsfolder/e/enervate.txt index 737f757cc3e..a57f60e22d3 100644 --- a/forge-gui/res/cardsfolder/e/enervate.txt +++ b/forge-gui/res/cardsfolder/e/enervate.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Tap | Cost$ 1 U | TgtPrompt$ Choose target artifact, creature or land | ValidTgts$ Artifact,Creature,Land | SpellDescription$ Tap target artifact, creature or land. Draw a card at the beginning of next turn's upkeep | SubAbility$ DelTrigSlowtrip SVar:DelTrigSlowtrip:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ DrawSlowtrip | TriggerDescription$ Draw a card. SVar:DrawSlowtrip:DB$Draw | NumCards$ 1 | Defined$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/enervate.jpg Oracle:Tap target artifact, creature, or land.\nDraw a card at the beginning of the next turn's upkeep. diff --git a/forge-gui/res/cardsfolder/e/engineered_explosives.txt b/forge-gui/res/cardsfolder/e/engineered_explosives.txt index 53c09bae5f1..3d109d4f6cb 100644 --- a/forge-gui/res/cardsfolder/e/engineered_explosives.txt +++ b/forge-gui/res/cardsfolder/e/engineered_explosives.txt @@ -6,7 +6,7 @@ A:AB$ DestroyAll | Cost$ 2 Sac<1/CARDNAME> | ValidCards$ Permanent.nonLand+cmcEQ SVar:X:Count$xPaid SVar:Y:Count$CardCounters.CHARGE SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHints:Ability$Proliferate SVar:Picture:http://www.wizards.com/global/images/magic/general/engineered_explosives.jpg Oracle:Sunburst (This enters the battlefield with a charge counter on it for each color of mana spent to cast it.)\n{2}, Sacrifice Engineered Explosives: Destroy each nonland permanent with converted mana cost equal to the number of charge counters on Engineered Explosives. diff --git a/forge-gui/res/cardsfolder/e/enigma_eidolon.txt b/forge-gui/res/cardsfolder/e/enigma_eidolon.txt index 84aedf23808..23c4450f764 100644 --- a/forge-gui/res/cardsfolder/e/enigma_eidolon.txt +++ b/forge-gui/res/cardsfolder/e/enigma_eidolon.txt @@ -5,6 +5,6 @@ PT:2/2 A:AB$ Mill | Cost$ U Sac<1/CARDNAME> | NumCards$ 3 | ValidTgts$ Player | TgtPrompt$ Select target player | SpellDescription$ Target player puts the top three cards of their library into their graveyard. T:Mode$ SpellCast | ValidCard$ Card.MultiColor | ValidActivatingPlayer$ You | TriggerZones$ Graveyard | OptionalDecider$ You | Execute$ TrigReturn | TriggerDescription$ Whenever you cast a multicolored spell, you may return CARDNAME from your graveyard to your hand. SVar:TrigReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | Defined$ Self -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/enigma_eidolon.jpg Oracle:{U}, Sacrifice Enigma Eidolon: Target player puts the top three cards of their library into their graveyard.\nWhenever you cast a multicolored spell, you may return Enigma Eidolon from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/e/enlightened_tutor.txt b/forge-gui/res/cardsfolder/e/enlightened_tutor.txt index 54cf9bb008b..9bc8ba3e24d 100644 --- a/forge-gui/res/cardsfolder/e/enlightened_tutor.txt +++ b/forge-gui/res/cardsfolder/e/enlightened_tutor.txt @@ -2,6 +2,6 @@ Name:Enlightened Tutor ManaCost:W Types:Instant A:SP$ ChangeZone | Cost$ W | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Artifact,Enchantment | ChangeNum$ 1 | SpellDescription$ Search your library for an artifact or enchantment card and reveal that card. Shuffle your library, then put the card on top of it. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/enlightened_tutor.jpg Oracle:Search your library for an artifact or enchantment card and reveal that card. Shuffle your library, then put the card on top of it. diff --git a/forge-gui/res/cardsfolder/e/enraging_licid.txt b/forge-gui/res/cardsfolder/e/enraging_licid.txt index e4fc0844bdb..eac27319ae1 100644 --- a/forge-gui/res/cardsfolder/e/enraging_licid.txt +++ b/forge-gui/res/cardsfolder/e/enraging_licid.txt @@ -6,6 +6,6 @@ A:AB$ Animate | Cost$ R T | Defined$ Self | RemoveThisAbility$ True | Permanent$ SVar:DBAttach:DB$ Attach | ValidTgts$ Creature | AILogic$ Pump SVar:SPAttach:SP$ Attach | Cost$ 0 | ValidTgts$ Creature S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Haste | Description$ Enchanted creature has haste. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/enraging_licid.jpg Oracle:{R}, {T}: Enraging Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {R} to end this effect.\nEnchanted creature has haste. diff --git a/forge-gui/res/cardsfolder/e/enslaved_horror.txt b/forge-gui/res/cardsfolder/e/enslaved_horror.txt index a697bac78be..ea756fb7d2f 100644 --- a/forge-gui/res/cardsfolder/e/enslaved_horror.txt +++ b/forge-gui/res/cardsfolder/e/enslaved_horror.txt @@ -5,7 +5,7 @@ PT:4/4 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ RepeatPlayers | TriggerDescription$ When CARDNAME enters the battlefield, each other player may return a creature card from their graveyard to the battlefield. SVar:RepeatPlayers:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ TrigChange SVar:TrigChange:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature.RememberedPlayerCtrl | DefinedPlayer$ Player.Opponent | ChangeNum$ 1 | Hidden$ True | Optional$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NeedsToPlayVar:Z EQ0 SVar:Z:Count$ValidGraveyard Creature.OppOwn+powerGT4+toughnessGT4 SVar:Picture:http://www.wizards.com/global/images/magic/general/enslaved_horror.jpg diff --git a/forge-gui/res/cardsfolder/e/ensnare.txt b/forge-gui/res/cardsfolder/e/ensnare.txt index 2aa2a376e34..2feaba3a804 100644 --- a/forge-gui/res/cardsfolder/e/ensnare.txt +++ b/forge-gui/res/cardsfolder/e/ensnare.txt @@ -3,6 +3,6 @@ ManaCost:3 U Types:Instant A:SP$ TapAll | Cost$ 3 U | ValidCards$ Creature | SpellDescription$ Tap all creatures. SVar:AltCost:Cost$ Return<2/Island> -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ensnare.jpg Oracle:You may return two Islands you control to their owner's hand rather than pay Ensnare's mana cost.\nTap all creatures. diff --git a/forge-gui/res/cardsfolder/e/ensnaring_bridge.txt b/forge-gui/res/cardsfolder/e/ensnaring_bridge.txt index 02b33fce0c7..c496fa6dbc8 100644 --- a/forge-gui/res/cardsfolder/e/ensnaring_bridge.txt +++ b/forge-gui/res/cardsfolder/e/ensnaring_bridge.txt @@ -4,7 +4,7 @@ Types:Artifact S:Mode$ Continuous | Affected$ Creature.powerGTX | AddHiddenKeyword$ CARDNAME can't attack. | Description$ Creatures with power greater than the number of cards in your hand can't attack. SVar:X:Count$InYourHand #NOTE: The AI will not play around this effect, so it's only good in properly designed decks that circumvent the necessity to worry about the detrimental effect. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:PreferredHandSize:0 SVar:Picture:http://www.wizards.com/global/images/magic/general/ensnaring_bridge.jpg Oracle:Creatures with power greater than the number of cards in your hand can't attack. diff --git a/forge-gui/res/cardsfolder/e/ensoul_artifact.txt b/forge-gui/res/cardsfolder/e/ensoul_artifact.txt index 30bedb9508e..b31a6dfa55d 100644 --- a/forge-gui/res/cardsfolder/e/ensoul_artifact.txt +++ b/forge-gui/res/cardsfolder/e/ensoul_artifact.txt @@ -4,6 +4,6 @@ Types:Enchantment Aura K:Enchant artifact A:SP$ Attach | Cost$ 1 U | ValidTgts$ Artifact | AITgts$ Card.nonCreature | AILogic$ Animate S:Mode$ Continuous | Affected$ Card.AttachedBy | SetPower$ 5 | SetToughness$ 5 | AddType$ Creature | Description$ Enchanted artifact is a creature with base power and toughness 5/5 in addition to its other types. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ensoul_artifact.jpg Oracle:Enchant artifact\nEnchanted artifact is a creature with base power and toughness 5/5 in addition to its other types. diff --git a/forge-gui/res/cardsfolder/e/entangling_trap.txt b/forge-gui/res/cardsfolder/e/entangling_trap.txt index 0ff3de0bd4e..d9168d880e1 100644 --- a/forge-gui/res/cardsfolder/e/entangling_trap.txt +++ b/forge-gui/res/cardsfolder/e/entangling_trap.txt @@ -6,6 +6,6 @@ SVar:TrigTapW:DB$ Tap | ValidTgts$ Creature.OppCtrl | SubAbility$ TrigTapW2 SVar:TrigTapW2:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True T:Mode$ Clashed | ValidPlayer$ You | Won$ False | TriggerZones$ Battlefield | Execute$ TrigTapL | Secondary$ True | TriggerDescription$ Whenever you clash, tap target creature an opponent controls. If you won, that creature doesn't untap during its controller's next untap step. (This ability triggers after the clash ends.) SVar:TrigTapL:DB$ Tap | ValidTgts$ Creature.OppCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/entangling_trap.jpg Oracle:Whenever you clash, tap target creature an opponent controls. If you won, that creature doesn't untap during its controller's next untap step. (This ability triggers after the clash ends.) diff --git a/forge-gui/res/cardsfolder/e/enter_the_infinite.txt b/forge-gui/res/cardsfolder/e/enter_the_infinite.txt index cf4c353f0f8..1977cc2a1d5 100644 --- a/forge-gui/res/cardsfolder/e/enter_the_infinite.txt +++ b/forge-gui/res/cardsfolder/e/enter_the_infinite.txt @@ -6,6 +6,6 @@ SVar:DBTop:DB$ ChangeZone | Origin$ Hand | Destination$ Library | Hidden$ True | SVar:DBEffect:DB$ Effect | Name$ Enter the Infinite Effect | StaticAbilities$ STHandSize | Duration$ UntilYourNextTurn SVar:STHandSize:Mode$ Continuous | EffectZone$ Command | Affected$ You | SetMaxHandSize$ Unlimited | Description$ You have no maximum hand size. SVar:X:Count$InYourLibrary -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/enter_the_infinite.jpg Oracle:Draw cards equal to the number of cards in your library, then put a card from your hand on top of your library. You have no maximum hand size until your next turn. diff --git a/forge-gui/res/cardsfolder/e/entrancing_melody.txt b/forge-gui/res/cardsfolder/e/entrancing_melody.txt index 63ce5495f5c..81b5c60fc5d 100644 --- a/forge-gui/res/cardsfolder/e/entrancing_melody.txt +++ b/forge-gui/res/cardsfolder/e/entrancing_melody.txt @@ -3,6 +3,6 @@ ManaCost:X U U Types:Sorcery A:SP$ GainControl | Cost$ X U U | Announce$ X | ValidTgts$ Creature.cmcEQX | TgtPrompt$ Select target creature | References$ X | SpellDescription$ Gain control of target creature with converted mana cost X. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/entrancing_melody.jpg Oracle:Gain control of target creature with converted mana cost X. diff --git a/forge-gui/res/cardsfolder/e/entropic_eidolon.txt b/forge-gui/res/cardsfolder/e/entropic_eidolon.txt index 0620d2042ed..35fa7c06d73 100644 --- a/forge-gui/res/cardsfolder/e/entropic_eidolon.txt +++ b/forge-gui/res/cardsfolder/e/entropic_eidolon.txt @@ -6,6 +6,6 @@ A:AB$ LoseLife | Cost$ B Sac<1/CARDNAME> | ValidTgts$ Player | TgtPrompt$ Select SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 T:Mode$ SpellCast | ValidCard$ Card.MultiColor | ValidActivatingPlayer$ You | TriggerZones$ Graveyard | OptionalDecider$ You | Execute$ TrigReturn | TriggerDescription$ Whenever you cast a multicolored spell, you may return CARDNAME from your graveyard to your hand. SVar:TrigReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | Defined$ Self -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/entropic_eidolon.jpg Oracle:{B}, Sacrifice Entropic Eidolon: Target player loses 1 life and you gain 1 life.\nWhenever you cast a multicolored spell, you may return Entropic Eidolon from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/e/eon_hub.txt b/forge-gui/res/cardsfolder/e/eon_hub.txt index 449ee0cf9ea..191e96c7f6a 100644 --- a/forge-gui/res/cardsfolder/e/eon_hub.txt +++ b/forge-gui/res/cardsfolder/e/eon_hub.txt @@ -3,6 +3,6 @@ ManaCost:5 Types:Artifact S:Mode$ Continuous | Affected$ Player | AddKeyword$ Skip your upkeep step. | Description$ Players skip their upkeep steps. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/eon_hub.jpg Oracle:Players skip their upkeep steps. diff --git a/forge-gui/res/cardsfolder/e/epic_experiment.txt b/forge-gui/res/cardsfolder/e/epic_experiment.txt index db9847a0ef3..4ac375b26d7 100644 --- a/forge-gui/res/cardsfolder/e/epic_experiment.txt +++ b/forge-gui/res/cardsfolder/e/epic_experiment.txt @@ -6,6 +6,6 @@ SVar:DBPlay:DB$ Play | Valid$ Instant.cmcLEX+IsRemembered+YouOwn,Sorcery.cmcLEX+ SVar:DBGrave:DB$ ChangeZoneAll | Origin$ Exile | Destination$ Graveyard | ChangeType$ Card.IsRemembered+YouOwn | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/epic_experiment.jpg Oracle:Exile the top X cards of your library. For each instant and sorcery card with converted mana cost X or less among them, you may cast that card without paying its mana cost. Then put all cards exiled this way that weren't cast into your graveyard. diff --git a/forge-gui/res/cardsfolder/e/epic_struggle.txt b/forge-gui/res/cardsfolder/e/epic_struggle.txt index 1873e1831e6..ff64f235e6b 100644 --- a/forge-gui/res/cardsfolder/e/epic_struggle.txt +++ b/forge-gui/res/cardsfolder/e/epic_struggle.txt @@ -3,6 +3,6 @@ ManaCost:2 G G Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | PresentCompare$ GE20 | IsPresent$ Creature.YouCtrl | Execute$ TrigWinsLife | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, if you control twenty or more creatures, you win the game. SVar:TrigWinsLife:DB$WinsGame | Defined$ You -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/epic_struggle.jpg Oracle:At the beginning of your upkeep, if you control twenty or more creatures, you win the game. diff --git a/forge-gui/res/cardsfolder/e/epiphany_storm.txt b/forge-gui/res/cardsfolder/e/epiphany_storm.txt index 3c60d69fb09..fc2d3be25b6 100644 --- a/forge-gui/res/cardsfolder/e/epiphany_storm.txt +++ b/forge-gui/res/cardsfolder/e/epiphany_storm.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ R | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddAbility$ UCDraw | Description$ Enchanted creature has "{R}, {T}, Discard a card: Draw a card." SVar:UCDraw:AB$ Draw | Cost$ R T Discard<1/Card> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/epiphany_storm.jpg Oracle:Enchant creature\nEnchanted creature has "{R}, {T}, Discard a card: Draw a card." diff --git a/forge-gui/res/cardsfolder/e/equal_treatment.txt b/forge-gui/res/cardsfolder/e/equal_treatment.txt index 3448c39b936..f0f81151aad 100644 --- a/forge-gui/res/cardsfolder/e/equal_treatment.txt +++ b/forge-gui/res/cardsfolder/e/equal_treatment.txt @@ -5,6 +5,6 @@ A:SP$ Effect | Cost$ 1 W | Name$ Equal Treatment Effect | ReplacementEffects$ Eq SVar:EqualEvent:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Card | ValidTarget$ Permanent,Player | ReplaceWith$ DmgTwo | Description$ If any source would deal 1 or more damage to a permanent or player this turn, it deals 2 damage to that permanent or player instead. SVar:DmgTwo:DB$ ReplaceEffect | VarName$ DamageAmount | VarValue$ 2 SVar:DBDraw:DB$ Draw | NumCards$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/equal_treatment.jpg Oracle:If any source would deal 1 or more damage to a permanent or player this turn, it deals 2 damage to that permanent or player instead.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/e/erithizon.txt b/forge-gui/res/cardsfolder/e/erithizon.txt index 1613077fe87..fcc8e558a20 100644 --- a/forge-gui/res/cardsfolder/e/erithizon.txt +++ b/forge-gui/res/cardsfolder/e/erithizon.txt @@ -4,6 +4,6 @@ Types:Creature Beast PT:4/4 T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME attacks, put a +1/+1 counter on target creature of defending player's choice. SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | TargetingPlayer$ DefendingPlayer -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/erithizon.jpg Oracle:Whenever Erithizon attacks, put a +1/+1 counter on target creature of defending player's choice. diff --git a/forge-gui/res/cardsfolder/e/errand_of_duty.txt b/forge-gui/res/cardsfolder/e/errand_of_duty.txt index 4988f3032bf..e86edec2040 100644 --- a/forge-gui/res/cardsfolder/e/errand_of_duty.txt +++ b/forge-gui/res/cardsfolder/e/errand_of_duty.txt @@ -2,6 +2,6 @@ Name:Errand of Duty ManaCost:1 W Types:Instant A:SP$ Token | Cost$ 1 W | TokenAmount$ 1 | TokenName$ Knight | TokenTypes$ Creature,Knight | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Banding | SpellDescription$ Create a 1/1 white Knight creature token with banding. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/errand_of_duty.jpg Oracle:Create a 1/1 white Knight creature token with banding. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/e/erratic_mutation.txt b/forge-gui/res/cardsfolder/e/erratic_mutation.txt index c3c919a41b0..3542611b5c8 100644 --- a/forge-gui/res/cardsfolder/e/erratic_mutation.txt +++ b/forge-gui/res/cardsfolder/e/erratic_mutation.txt @@ -5,6 +5,6 @@ A:SP$ DigUntil | Cost$ 2 U | Valid$ Card.nonLand | ValidDescription$ nonland | F SVar:MutantPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | NumDef$ -X | References$ X | SubAbility$ JitterClean SVar:JitterClean:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/erratic_mutation.jpg Oracle:Choose target creature. Reveal cards from the top of your library until you reveal a nonland card. That creature gets +X/-X until end of turn, where X is that card's converted mana cost. Put all cards revealed this way on the bottom of your library in any order. diff --git a/forge-gui/res/cardsfolder/e/ersatz_gnomes.txt b/forge-gui/res/cardsfolder/e/ersatz_gnomes.txt index 2216583a0c4..6b12bb70b5d 100644 --- a/forge-gui/res/cardsfolder/e/ersatz_gnomes.txt +++ b/forge-gui/res/cardsfolder/e/ersatz_gnomes.txt @@ -5,7 +5,7 @@ PT:1/1 A:AB$ Animate | Cost$ T | Colors$ Colorless | OverwriteColors$ True | ValidTgts$ Card.inZoneStack | TgtZone$ Stack,Battlefield | TgtPrompt$ Select target spell to make colorless | Permanent$ True | SpellDescription$ Target spell becomes colorless. #For the above part to work, another zone MUST be included because of interaction with regular targeting on the stack that stops the ability from working correctly. Use the inZone targeting restriction to limit it to stack. TODO: Probably need to fix this properly. A:AB$ Animate | Cost$ T | Colors$ Colorless | OverwriteColors$ True | ValidTgts$ Permanent | TgtPrompt$ Select target permanent to make colorless | SpellDescription$ Target permanent becomes colorless until end of turn. -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ersatz_gnomes.jpg Oracle:{T}: Target spell becomes colorless.\n{T}: Target permanent becomes colorless until end of turn. diff --git a/forge-gui/res/cardsfolder/e/ertai_the_corrupted.txt b/forge-gui/res/cardsfolder/e/ertai_the_corrupted.txt index 9e0f1789f05..81c353c34d0 100644 --- a/forge-gui/res/cardsfolder/e/ertai_the_corrupted.txt +++ b/forge-gui/res/cardsfolder/e/ertai_the_corrupted.txt @@ -3,6 +3,6 @@ ManaCost:2 W U B Types:Legendary Creature Human Wizard PT:3/4 A:AB$ Counter | Cost$ U T Sac<1/Creature;Enchantment/creature or enchantment> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SpellDescription$ Counter target spell. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ertai_the_corrupted.jpg Oracle:{U}, {T}, Sacrifice a creature or enchantment: Counter target spell. diff --git a/forge-gui/res/cardsfolder/e/ertais_trickery.txt b/forge-gui/res/cardsfolder/e/ertais_trickery.txt index 81c06cb6040..92446697932 100644 --- a/forge-gui/res/cardsfolder/e/ertais_trickery.txt +++ b/forge-gui/res/cardsfolder/e/ertais_trickery.txt @@ -3,6 +3,6 @@ ManaCost:U Types:Instant A:SP$ Counter | Cost$ U | TargetType$ Spell | TgtPrompt$ Select target spell if it was kicked | ValidTgts$ Card | ConditionCheckSVar$ ConditionKicked | ConditionSVarCompare$ EQ1 | References$ ConditionKicked | SpellDescription$ Counter target spell if it was kicked. SVar:ConditionKicked:Targeted$Valid Card.kicked -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ertais_trickery.jpg Oracle:Counter target spell if it was kicked. diff --git a/forge-gui/res/cardsfolder/e/escape_routes.txt b/forge-gui/res/cardsfolder/e/escape_routes.txt index 62f38f5f588..82947d56dc9 100644 --- a/forge-gui/res/cardsfolder/e/escape_routes.txt +++ b/forge-gui/res/cardsfolder/e/escape_routes.txt @@ -3,7 +3,7 @@ ManaCost:2 U Types:Enchantment A:AB$ ChangeZone | Cost$ 2 U | ValidTgts$ Creature.White+YouCtrl,Creature.Black+YouCtrl | TgtPrompt$ Select target white or black creature you control | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target white or black creature you control to its owner's hand. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Color$White|Black SVar:Picture:http://www.wizards.com/global/images/magic/general/escape_routes.jpg Oracle:{2}{U}: Return target white or black creature you control to its owner's hand. diff --git a/forge-gui/res/cardsfolder/e/esper_sojourners.txt b/forge-gui/res/cardsfolder/e/esper_sojourners.txt index fa72eb737a9..579716575dd 100644 --- a/forge-gui/res/cardsfolder/e/esper_sojourners.txt +++ b/forge-gui/res/cardsfolder/e/esper_sojourners.txt @@ -6,6 +6,6 @@ K:Cycling:2 U T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigTapOrUntap | OptionalDecider$ You | TriggerDescription$ When you cycle CARDNAME or it dies, you may tap or untap target permanent. T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigTapOrUntap | OptionalDecider$ You | Secondary$ True | TriggerDescription$ When you cycle CARDNAME or it dies, you may tap or untap target permanent. SVar:TrigTapOrUntap:DB$TapOrUntap | ValidTgts$ Permanent | TgtPrompt$ Select target permanent -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/esper_sojourners.jpg Oracle:When you cycle Esper Sojourners or it dies, you may tap or untap target permanent.\nCycling {2}{U} ({2}{U}, Discard this card: Draw a card.) diff --git a/forge-gui/res/cardsfolder/e/esperzoa.txt b/forge-gui/res/cardsfolder/e/esperzoa.txt index 45c4db23407..61781a99ebf 100644 --- a/forge-gui/res/cardsfolder/e/esperzoa.txt +++ b/forge-gui/res/cardsfolder/e/esperzoa.txt @@ -5,6 +5,6 @@ PT:4/3 K:Flying T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigBounce | TriggerDescription$ At the beginning of your upkeep, return an artifact you control to its owner's hand. SVar:TrigBounce:DB$ChangeZone | ChangeType$ Artifact.YouCtrl | ChangeNum$ 1 | Origin$ Battlefield | Destination$ Hand | Mandatory$ True | Hidden$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/esperzoa.jpg Oracle:Flying\nAt the beginning of your upkeep, return an artifact you control to its owner's hand. diff --git a/forge-gui/res/cardsfolder/e/essence_bottle.txt b/forge-gui/res/cardsfolder/e/essence_bottle.txt index af6c87451f2..b229890e1a4 100644 --- a/forge-gui/res/cardsfolder/e/essence_bottle.txt +++ b/forge-gui/res/cardsfolder/e/essence_bottle.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ PutCounter | Cost$ 3 T | Defined$ Self | CounterType$ ELIXIR | CounterNum$ 1 | SpellDescription$ Put an elixir counter on CARDNAME. A:AB$ GainLife | Cost$ T SubCounter | Defined$ You | LifeAmount$ X | References$ X | SpellDescription$ You gain 2 life for each elixir counter removed this way. SVar:X:SVar$CostCountersRemoved/Twice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/essence_bottle.jpg Oracle:{3}, {T}: Put an elixir counter on Essence Bottle.\n{T}, Remove all elixir counters from Essence Bottle: You gain 2 life for each elixir counter removed this way. diff --git a/forge-gui/res/cardsfolder/e/essence_flare.txt b/forge-gui/res/cardsfolder/e/essence_flare.txt index fc3f0e28bc2..6e554fbbae3 100644 --- a/forge-gui/res/cardsfolder/e/essence_flare.txt +++ b/forge-gui/res/cardsfolder/e/essence_flare.txt @@ -5,6 +5,6 @@ A:SP$ Attach | Cost$ U | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 2 | Description$ Enchanted creature gets +2/+0. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ EnchantedController | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of the upkeep of enchanted creature's controller, put a -0/-1 counter on that creature. SVar:TrigPutCounter:DB$PutCounter | Defined$ Enchanted | CounterType$ M0M1 | CounterNum$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/essence_flare.jpg Oracle:Enchant creature\nEnchanted creature gets +2/+0.\nAt the beginning of the upkeep of enchanted creature's controller, put a -0/-1 counter on that creature. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/e/essence_leak.txt b/forge-gui/res/cardsfolder/e/essence_leak.txt index 483ee90c4fb..2a9c85a97d5 100644 --- a/forge-gui/res/cardsfolder/e/essence_leak.txt +++ b/forge-gui/res/cardsfolder/e/essence_leak.txt @@ -6,7 +6,7 @@ A:SP$ Attach | Cost$ U | ValidTgts$ Permanent | TgtPrompt$ Select target permane S:Mode$ Continuous | Affected$ Permanent.AttachedBy+Red,Permanent.AttachedBy+Green | AddTrigger$ TrigEssencePhase | AddSVar$ TrigEssenceLeak | Description$ As long as enchanted permanent is red or green, it has "At the beginning of your upkeep, sacrifice this permanent unless you pay its mana cost." SVar:TrigEssencePhase:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigEssenceLeak | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, sacrifice this permanent unless you pay its mana cost. SVar:TrigEssenceLeak:DB$ Sacrifice | Defined$ Self | UnlessCost$ CardManaCost | UnlessPayer$ You -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingAttachEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/essence_leak.jpg Oracle:Enchant permanent\nAs long as enchanted permanent is red or green, it has "At the beginning of your upkeep, sacrifice this permanent unless you pay its mana cost." diff --git a/forge-gui/res/cardsfolder/e/etched_oracle.txt b/forge-gui/res/cardsfolder/e/etched_oracle.txt index 1a452d0a342..998e51c4d3c 100644 --- a/forge-gui/res/cardsfolder/e/etched_oracle.txt +++ b/forge-gui/res/cardsfolder/e/etched_oracle.txt @@ -4,7 +4,7 @@ Types:Artifact Creature Wizard PT:0/0 K:Sunburst A:AB$ Draw | Cost$ 1 SubCounter<4/P1P1> | ValidTgts$ Player | TgtPrompt$ Select a player | NumCards$ 3 | SpellDescription$ Target player draws three cards. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NeedsToPlayVar:Z GE4 SVar:Z:Count$UniqueManaColorsProduced.ByUntappedSources DeckHints:Ability$Proliferate diff --git a/forge-gui/res/cardsfolder/e/etched_oracle_avatar.txt b/forge-gui/res/cardsfolder/e/etched_oracle_avatar.txt index 7f2410cdcc2..2a91827ee68 100644 --- a/forge-gui/res/cardsfolder/e/etched_oracle_avatar.txt +++ b/forge-gui/res/cardsfolder/e/etched_oracle_avatar.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Vanguard HandLifeModifier:+1/-4 S:Mode$ Continuous | EffectZone$ Command | Affected$ Card.YouCtrl | AddKeyword$ Alternative Cost:W U B R G | AffectedZone$ Hand,Graveyard,Exile,Library,Command | Description$ You may pay {W}{U}{B}{R}{G} rather than pay the mana cost for spells that you cast. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:https://downloads.cardforge.org/images/cards/VAN/Etched Oracle Avatar.full.jpg Oracle:Hand +1, life -4\nYou may pay {W}{U}{B}{R}{G} rather than pay the mana cost for spells that you cast. diff --git a/forge-gui/res/cardsfolder/e/eternal_dominion.txt b/forge-gui/res/cardsfolder/e/eternal_dominion.txt index f80cb2d5734..70b1ec7797c 100644 --- a/forge-gui/res/cardsfolder/e/eternal_dominion.txt +++ b/forge-gui/res/cardsfolder/e/eternal_dominion.txt @@ -4,6 +4,6 @@ Types:Sorcery K:Epic A:SP$ ChangeZone | Cost$ 7 U U U | Origin$ Library | Destination$ Battlefield | ValidTgts$ Opponent | ChangeType$ Artifact,Creature,Enchantment,Land | ChangeNum$ 1 | GainControl$ True | IsCurse$ True | StackDescription$ SpellDescription | SpellDescription$ Search target opponent's library for a creature card and put that card onto the battlefield under your control. Then that player shuffles their library. #TODO: Tutoring in general can be improved to make this card work better for the AI. Currently the AI will grab the most expensive targets in the opponent's library (which is not necessarily a bad thing in itself, but not always optimal). -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/eternal_dominion.jpg Oracle:Search target opponent's library for an artifact, creature, enchantment, or land card. Put that card onto the battlefield under your control. Then that player shuffles their library.\nEpic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability. You may choose a new target for the copy.) diff --git a/forge-gui/res/cardsfolder/e/ethereal_champion.txt b/forge-gui/res/cardsfolder/e/ethereal_champion.txt index 447ef630a28..cec40e89f65 100644 --- a/forge-gui/res/cardsfolder/e/ethereal_champion.txt +++ b/forge-gui/res/cardsfolder/e/ethereal_champion.txt @@ -3,6 +3,6 @@ ManaCost:2 W W W Types:Creature Avatar PT:3/4 A:AB$ PreventDamage | Cost$ PayLife<1> | Defined$ Self | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to CARDNAME this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ethereal_champion.jpg Oracle:Pay 1 life: Prevent the next 1 damage that would be dealt to Ethereal Champion this turn. diff --git a/forge-gui/res/cardsfolder/e/ethersworn_canonist.txt b/forge-gui/res/cardsfolder/e/ethersworn_canonist.txt index 0f22be20680..db769ef61ad 100644 --- a/forge-gui/res/cardsfolder/e/ethersworn_canonist.txt +++ b/forge-gui/res/cardsfolder/e/ethersworn_canonist.txt @@ -3,6 +3,6 @@ ManaCost:1 W Types:Artifact Creature Human Cleric PT:2/2 S:Mode$ CantBeCast | ValidCard$ Card.nonArtifact | Caster$ Player | NumLimitEachTurn$ 1 | Description$ Each player who has cast a nonartifact spell this turn can't cast additional nonartifact spells. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ethersworn_canonist.jpg Oracle:Each player who has cast a nonartifact spell this turn can't cast additional nonartifact spells. diff --git a/forge-gui/res/cardsfolder/e/etherwrought_page.txt b/forge-gui/res/cardsfolder/e/etherwrought_page.txt index ebb5bff2bec..f8bc9f17049 100644 --- a/forge-gui/res/cardsfolder/e/etherwrought_page.txt +++ b/forge-gui/res/cardsfolder/e/etherwrought_page.txt @@ -6,7 +6,7 @@ SVar:TrigCharm:DB$ Charm | Choices$ DBGainLife,DBDig,DBLoseLife | CharmNum$ 1 SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 | SpellDescription$ You gain 2 life. SVar:DBDig:DB$ Dig | DigNum$ 1 | ChangeNum$ 1 | DestinationZone$ Graveyard | Optional$ True | LibraryPosition2$ 0 | SpellDescription$ Look at the top card of your library. You may put that card into your graveyard. SVar:DBLoseLife:DB$ LoseLife | Defined$ Player.Opponent | LifeAmount$ 1 | SpellDescription$ Each opponent loses 1 life. -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHas:Ability$LifeGain SVar:Picture:http://www.wizards.com/global/images/magic/general/etherwrought_page.jpg Oracle:At the beginning of your upkeep, choose one —\n• You gain 2 life.\n• Look at the top card of your library. You may put that card into your graveyard.\n• Each opponent loses 1 life. diff --git a/forge-gui/res/cardsfolder/e/eunuchs_intrigues.txt b/forge-gui/res/cardsfolder/e/eunuchs_intrigues.txt index 8ea18164dd5..83e63109173 100644 --- a/forge-gui/res/cardsfolder/e/eunuchs_intrigues.txt +++ b/forge-gui/res/cardsfolder/e/eunuchs_intrigues.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ ChooseCard | Cost$ 2 R | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | Amount$ 1 | Choices$ Creature.TargetedPlayerCtrl | SubAbility$ DBPumpAll | RememberChosen$ True | AILogic$ BestBlocker | SpellDescription$ Target opponent chooses a creature they control. Other creatures they control can't block this turn. SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.IsNotRemembered+TargetedPlayerCtrl | KW$ HIDDEN CARDNAME can't block. | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/eunuchs_intrigues.jpg Oracle:Target opponent chooses a creature they control. Other creatures they control can't block this turn. diff --git a/forge-gui/res/cardsfolder/e/eureka.txt b/forge-gui/res/cardsfolder/e/eureka.txt index 3cc06f7d9dd..66be4ea0f36 100644 --- a/forge-gui/res/cardsfolder/e/eureka.txt +++ b/forge-gui/res/cardsfolder/e/eureka.txt @@ -14,7 +14,7 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:NumPlayerGiveup:Number$0 SVar:TotalPlayer:PlayerCountPlayers$Amount SVar:CheckHand:Count$ValidHand Permanent.IsNotRemembered+RememberedPlayerCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NeedsToPlayVar:Y GE1 SVar:Y:Count$ValidHand Permanent.YouCtrl+cmcGE5 SVar:Picture:http://www.wizards.com/global/images/magic/general/eureka.jpg diff --git a/forge-gui/res/cardsfolder/e/evaporate.txt b/forge-gui/res/cardsfolder/e/evaporate.txt index 00ec7cbed04..9825737a812 100644 --- a/forge-gui/res/cardsfolder/e/evaporate.txt +++ b/forge-gui/res/cardsfolder/e/evaporate.txt @@ -2,6 +2,6 @@ Name:Evaporate ManaCost:2 R Types:Sorcery A:SP$ DamageAll | Cost$ 2 R | NumDmg$ 1 | ValidCards$ Creature.White,Creature.Blue | ValidDescription$ each creature that's white or blue. | SpellDescription$ CARDNAME deals 1 damage to each creature that's white or blue. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/evaporate.jpg Oracle:Evaporate deals 1 damage to each white and/or blue creature. diff --git a/forge-gui/res/cardsfolder/e/everlasting_torment.txt b/forge-gui/res/cardsfolder/e/everlasting_torment.txt index cd56ca1b6c2..3e2216cff6d 100644 --- a/forge-gui/res/cardsfolder/e/everlasting_torment.txt +++ b/forge-gui/res/cardsfolder/e/everlasting_torment.txt @@ -5,6 +5,6 @@ S:Mode$ Continuous | Affected$ Player | AddKeyword$ You can't gain life. | Descr S:Mode$ Continuous | GlobalRule$ Damage can't be prevented. | Description$ Damage can't be prevented. S:Mode$ Continuous | GlobalRule$ All damage is dealt as though it's source had wither. | Description$ All damage is dealt as though it's source had wither. (A source with wither deals damage to creatures in the form of -1/-1 counters.) SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/everlasting_torment.jpg Oracle:Players can't gain life.\nDamage can't be prevented.\nAll damage is dealt as though its source had wither. (A source with wither deals damage to creatures in the form of -1/-1 counters.) diff --git a/forge-gui/res/cardsfolder/e/evermind.txt b/forge-gui/res/cardsfolder/e/evermind.txt index 6ee18a504e4..dc91f742d5d 100644 --- a/forge-gui/res/cardsfolder/e/evermind.txt +++ b/forge-gui/res/cardsfolder/e/evermind.txt @@ -4,6 +4,6 @@ Types:Instant Arcane Colors:blue K:Splice:Arcane:1 U A:SP$ Draw | Cost$ 0 | NumCards$ 1 | ActivationLimit$ 0 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/evermind.jpg Oracle:(Nonexistent mana costs can't be paid.)\nDraw a card.\nSplice onto Arcane {1}{U} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) diff --git a/forge-gui/res/cardsfolder/e/evershrike.txt b/forge-gui/res/cardsfolder/e/evershrike.txt index 12e26440bdb..45dceb7cee5 100644 --- a/forge-gui/res/cardsfolder/e/evershrike.txt +++ b/forge-gui/res/cardsfolder/e/evershrike.txt @@ -10,6 +10,6 @@ SVar:AttachAura:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | Chang SVar:DBExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | Defined$ Self | ConditionDefined$ Remembered | ConditionPresent$ Aura | ConditionCompare$ EQ0 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/evershrike.jpg Oracle:Flying\nEvershrike gets +2/+2 for each Aura attached to it.\n{X}{W/B}{W/B}: Return Evershrike from your graveyard to the battlefield. You may put an Aura card with converted mana cost X or less from your hand onto the battlefield attached to it. If you don't, exile Evershrike. diff --git a/forge-gui/res/cardsfolder/e/evolution_charm.txt b/forge-gui/res/cardsfolder/e/evolution_charm.txt index b54765f3570..57233c062c5 100644 --- a/forge-gui/res/cardsfolder/e/evolution_charm.txt +++ b/forge-gui/res/cardsfolder/e/evolution_charm.txt @@ -5,6 +5,6 @@ A:SP$ Charm | Cost$ 1 G | Choices$ SearchLand,Return,DoPump | CharmNum$ 1 SVar:SearchLand:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeNum$ 1 | PrecostDesc$ Choose one — | SpellDescription$ Search your library for a basic land card, reveal it, put it into your hand, then shuffle your library. SVar:Return:DB$ ChangeZone | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target creature card from your graveyard to your hand. SVar:DoPump:DB$ Pump | ValidTgts$ Creature | KW$ Flying | TgtPrompt$ Select target creature | SpellDescription$ Target creature gains flying until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/evolution_charm.jpg Oracle:Choose one —\n• Search your library for a basic land card, reveal it, put it into your hand, then shuffle your library.\n• Return target creature card from your graveyard to your hand.\n• Target creature gains flying until end of turn. diff --git a/forge-gui/res/cardsfolder/e/evolution_vat.txt b/forge-gui/res/cardsfolder/e/evolution_vat.txt index 221bb3af60d..c423ebf7fb1 100644 --- a/forge-gui/res/cardsfolder/e/evolution_vat.txt +++ b/forge-gui/res/cardsfolder/e/evolution_vat.txt @@ -7,6 +7,6 @@ SVar:DBAnimate:DB$Animate | Defined$ Targeted | Abilities$ ABPutCounter SVar:ABPutCounter:AB$ MultiplyCounter | Cost$ 2 G U | Defined$ Self | CounterType$ P1P1 | SpellDescription$ Double the number of +1/+1 counters on CARDNAME. DeckHints:Ability$Counters DeckNeeds:Color$Green|Blue -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/evolution_vat.jpg Oracle:{3}, {T}: Tap target creature and put a +1/+1 counter on it. Until end of turn, that creature gains "{2}{G}{U}: Double the number of +1/+1 counters on this creature." diff --git a/forge-gui/res/cardsfolder/e/evolutionary_leap.txt b/forge-gui/res/cardsfolder/e/evolutionary_leap.txt index d65bcd84f7e..f7e2e3fd5f3 100644 --- a/forge-gui/res/cardsfolder/e/evolutionary_leap.txt +++ b/forge-gui/res/cardsfolder/e/evolutionary_leap.txt @@ -2,6 +2,6 @@ Name:Evolutionary Leap ManaCost:1 G Types:Enchantment A:AB$ DigUntil | Cost$ G Sac<1/Creature> | Valid$ Card.Creature | ValidDescription$ creature | RevealedDestination$ Library | RevealedLibraryPosition$ -1 | RevealRandomOrder$ True | FoundDestination$ Hand | SpellDescription$ Reveal cards from the top of your library until you reveal a creature card. Put that card into your hand and the rest on the bottom of your library in a random order. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/evolutionary_leap.jpg Oracle:{G}, Sacrifice a creature: Reveal cards from the top of your library until you reveal a creature card. Put that card into your hand and the rest on the bottom of your library in a random order. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/e/exalted_dragon.txt b/forge-gui/res/cardsfolder/e/exalted_dragon.txt index d82e10df247..b5761bda572 100644 --- a/forge-gui/res/cardsfolder/e/exalted_dragon.txt +++ b/forge-gui/res/cardsfolder/e/exalted_dragon.txt @@ -4,6 +4,6 @@ Types:Creature Dragon PT:5/5 K:Flying S:Mode$ CantAttackUnless | ValidCard$ Creature.Self | Target$ Player,Planeswalker | Cost$ Sac<1/Land> | Description$ CARDNAME can't attack unless you sacrifice a land. (This cost is paid as attackers are declared.) -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/exalted_dragon.jpg Oracle:Flying\nExalted Dragon can't attack unless you sacrifice a land. (This cost is paid as attackers are declared.) diff --git a/forge-gui/res/cardsfolder/e/excavation.txt b/forge-gui/res/cardsfolder/e/excavation.txt index a2aae189681..b60ccb70e30 100644 --- a/forge-gui/res/cardsfolder/e/excavation.txt +++ b/forge-gui/res/cardsfolder/e/excavation.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Enchantment A:AB$ Draw | Cost$ 1 Sac<1/Land> | NumCards$ 1 | AnyPlayer$ True | SpellDescription$ Draw a card. Any player may activate this ability. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/excavation.jpg Oracle:{1}, Sacrifice a land: Draw a card. Any player may activate this ability. diff --git a/forge-gui/res/cardsfolder/e/excavator.txt b/forge-gui/res/cardsfolder/e/excavator.txt index 8ba9f91c390..9ea4470a0ce 100644 --- a/forge-gui/res/cardsfolder/e/excavator.txt +++ b/forge-gui/res/cardsfolder/e/excavator.txt @@ -2,7 +2,7 @@ Name:Excavator ManaCost:2 Types:Artifact A:AB$ Pump | Cost$ T Sac<1/Land.Basic/basic land> | DefinedLandwalk$ Sacrificed | ValidTgts$ Creature | SpellDescription$ Target creature gains landwalk of each of the land types of the sacrificed land until end of turn. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/excavator.jpg Oracle:{T}, Sacrifice a basic land: Target creature gains landwalk of each of the land types of the sacrificed land until end of turn. diff --git a/forge-gui/res/cardsfolder/e/execute.txt b/forge-gui/res/cardsfolder/e/execute.txt index 949ce1b0cc6..d5982739d81 100644 --- a/forge-gui/res/cardsfolder/e/execute.txt +++ b/forge-gui/res/cardsfolder/e/execute.txt @@ -3,6 +3,6 @@ ManaCost:2 B Types:Instant A:SP$ Destroy | Cost$ 2 B | ValidTgts$ Creature.White | TgtPrompt$ Select target white creature | NoRegen$ True | SpellDescription$ Destroy target white creature. It can't be regenerated. | SubAbility$ DBDraw SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/execute.jpg Oracle:Destroy target white creature. It can't be regenerated.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/e/exert_influence.txt b/forge-gui/res/cardsfolder/e/exert_influence.txt index 1fa9a12d23e..0bdc41cbec2 100644 --- a/forge-gui/res/cardsfolder/e/exert_influence.txt +++ b/forge-gui/res/cardsfolder/e/exert_influence.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ GainControl | Cost$ 4 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ1 | References$ X,Y | SpellDescription$ Converge — Gain control of target creature if its power is less than or equal to the number of colors of mana spent to cast CARDNAME. SVar:Y:Count$Converge SVar:X:Targeted$Valid Creature.powerLEY -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/exert_influence.jpg Oracle:Converge — Gain control of target creature if its power is less than or equal to the number of colors of mana spent to cast Exert Influence. diff --git a/forge-gui/res/cardsfolder/e/exiled_doomsayer.txt b/forge-gui/res/cardsfolder/e/exiled_doomsayer.txt index 55b89743001..a34555fcc53 100644 --- a/forge-gui/res/cardsfolder/e/exiled_doomsayer.txt +++ b/forge-gui/res/cardsfolder/e/exiled_doomsayer.txt @@ -3,6 +3,6 @@ ManaCost:1 W Types:Creature Human Cleric PT:1/2 S:Mode$ RaiseCost | ValidCard$ Creature.faceDown | Type$ MorphUp | Amount$ 2 | Description$ All morph costs cost {2} more. (This doesn't affect the cost to cast creature spells face down.) -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/exiled_doomsayer.jpg Oracle:All morph costs cost {2} more. (This doesn't affect the cost to cast creature spells face down.) diff --git a/forge-gui/res/cardsfolder/e/exotic_disease.txt b/forge-gui/res/cardsfolder/e/exotic_disease.txt index 16c4589850d..201bf53cb37 100644 --- a/forge-gui/res/cardsfolder/e/exotic_disease.txt +++ b/forge-gui/res/cardsfolder/e/exotic_disease.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ LoseLife | Cost$ 4 B | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ X | References$ X | SubAbility$ DBGainLife | SpellDescription$ Domain — Target player loses X life and you gain X life, where X is the number of basic land types among lands you control. SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ X | References$ X SVar:X:Count$Domain -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/exotic_disease.jpg Oracle:Domain — Target player loses X life and you gain X life, where X is the number of basic land types among lands you control. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/e/experiment_kraj.txt b/forge-gui/res/cardsfolder/e/experiment_kraj.txt index 722c1b62315..49b2c52e7cf 100644 --- a/forge-gui/res/cardsfolder/e/experiment_kraj.txt +++ b/forge-gui/res/cardsfolder/e/experiment_kraj.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Ooze Mutant PT:4/6 S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ Battlefield | GainsAbilitiesOf$ Creature.Other+counters_GE1_P1P1 | Description$ CARDNAME has all activated abilities of each other creature with a +1/+1 counter on it. A:AB$PutCounter | Cost$ T | CounterType$ P1P1 | CounterNum$ 1 | ValidTgts$ Creature | SpellDescription$ Put a +1/+1 counter on target creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/experiment_kraj.jpg Oracle:Experiment Kraj has all activated abilities of each other creature with a +1/+1 counter on it.\n{T}: Put a +1/+1 counter on target creature. diff --git a/forge-gui/res/cardsfolder/e/extract.txt b/forge-gui/res/cardsfolder/e/extract.txt index 255c86cd509..7b3214f19e4 100644 --- a/forge-gui/res/cardsfolder/e/extract.txt +++ b/forge-gui/res/cardsfolder/e/extract.txt @@ -2,6 +2,6 @@ Name:Extract ManaCost:U Types:Sorcery A:SP$ ChangeZone | Cost$ U | Origin$ Library | Destination$ Exile | ValidTgts$ Player | ChangeType$ Card | ChangeNum$ 1 | IsCurse$ True | SpellDescription$ Search target player's library for a card and exile it. Then that player shuffles their library. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/extract.jpg Oracle:Search target player's library for a card and exile it. Then that player shuffles their library. diff --git a/forge-gui/res/cardsfolder/e/extract_from_darkness.txt b/forge-gui/res/cardsfolder/e/extract_from_darkness.txt index 83a579fc72b..4fbf5eef509 100644 --- a/forge-gui/res/cardsfolder/e/extract_from_darkness.txt +++ b/forge-gui/res/cardsfolder/e/extract_from_darkness.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ Mill | Cost$ 3 U B | NumCards$ 2 | Defined$ Player | SubAbility$ DBChoose | SpellDescription$ Each player puts the top two cards of their library into their graveyard. Then put a creature card from a graveyard onto the battlefield under your control. SVar:DBChoose:DB$ ChooseCard | Defined$ You | Choices$ Creature | ChoiceZone$ Graveyard | Mandatory$ True | SubAbility$ DBReturn SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ ChosenCard | GainControl$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/extract_from_darkness.jpg Oracle:Each player puts the top two cards of their library into their graveyard. Then put a creature card from a graveyard onto the battlefield under your control. diff --git a/forge-gui/res/cardsfolder/e/extraplanar_lens.txt b/forge-gui/res/cardsfolder/e/extraplanar_lens.txt index 0979f7664bd..3e63e373186 100644 --- a/forge-gui/res/cardsfolder/e/extraplanar_lens.txt +++ b/forge-gui/res/cardsfolder/e/extraplanar_lens.txt @@ -8,6 +8,6 @@ SVar:TrigMana:DB$ ManaReflected | Valid$ Defined.Triggered | ColorOrType$ Type | T:Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Card.Self | Destination$ Any | Execute$ DBCleanup | Static$ True SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True SVar:NeedsToPlay:Land.Basic+YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/extraplanar_lens.jpg Oracle:Imprint — When Extraplanar Lens enters the battlefield, you may exile target land you control.\nWhenever a land with the same name as the exiled card is tapped for mana, its controller adds one mana of any type that land produced. diff --git a/forge-gui/res/cardsfolder/e/extravagant_spirit.txt b/forge-gui/res/cardsfolder/e/extravagant_spirit.txt index 4dc3099cd28..66a2749b01c 100644 --- a/forge-gui/res/cardsfolder/e/extravagant_spirit.txt +++ b/forge-gui/res/cardsfolder/e/extravagant_spirit.txt @@ -5,6 +5,6 @@ PT:4/4 K:Flying K:UpkeepCost:X:{1} for each card in your hand SVar:X:Count$InYourHand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/extravagant_spirit.jpg Oracle:Flying\nAt the beginning of your upkeep, sacrifice Extravagant Spirit unless you pay {1} for each card in your hand. diff --git a/forge-gui/res/cardsfolder/e/eye_of_doom.txt b/forge-gui/res/cardsfolder/e/eye_of_doom.txt index 9f4bbb0b000..9a002bde0c2 100644 --- a/forge-gui/res/cardsfolder/e/eye_of_doom.txt +++ b/forge-gui/res/cardsfolder/e/eye_of_doom.txt @@ -6,6 +6,6 @@ SVar:TrigChoose:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBCho SVar:DBChoose:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Permanent.nonLand | AILogic$ OppPreferred | Mandatory$ True | SubAbility$ DBPutCounter SVar:DBPutCounter:DB$ PutCounter | Defined$ ChosenCard | CounterType$ DOOM | CounterNum$ 1 A:AB$ DestroyAll | Cost$ 2 T Sac<1/CARDNAME> | ValidCards$ Permanent.counters_GE1_DOOM | SpellDescription$ Destroy each permanent with a doom counter. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/eye_of_doom.jpg Oracle:When Eye of Doom enters the battlefield, each player chooses a nonland permanent and puts a doom counter on it.\n{2}, {T}, Sacrifice Eye of Doom: Destroy each permanent with a doom counter on it. diff --git a/forge-gui/res/cardsfolder/e/eye_of_ramos.txt b/forge-gui/res/cardsfolder/e/eye_of_ramos.txt index 0f9b1e0c7ec..286622ab5b2 100644 --- a/forge-gui/res/cardsfolder/e/eye_of_ramos.txt +++ b/forge-gui/res/cardsfolder/e/eye_of_ramos.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Mana | Cost$ Sac<1/CARDNAME> | Produced$ U | SpellDescription$ Add {U}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/eye_of_ramos.jpg Oracle:{T}: Add {U}.\nSacrifice Eye of Ramos: Add {U}. diff --git a/forge-gui/res/cardsfolder/e/eye_of_singularity.txt b/forge-gui/res/cardsfolder/e/eye_of_singularity.txt index 1e5e41d45b8..73f48654e22 100644 --- a/forge-gui/res/cardsfolder/e/eye_of_singularity.txt +++ b/forge-gui/res/cardsfolder/e/eye_of_singularity.txt @@ -8,6 +8,6 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Perman SVar:TrigDestroyRem:DB$ Pump | RememberObjects$ TriggeredCard | SubAbility$ DBDestroyAll SVar:DBDestroyAll:DB$ DestroyAll | ValidCards$ Permanent.IsNotRemembered+sharesNameWith Remembered | NoRegen$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/eye_of_singularity.jpg Oracle:When Eye of Singularity enters the battlefield, destroy each permanent with the same name as another permanent, except for basic lands. They can't be regenerated.\nWhenever a permanent other than a basic land enters the battlefield, destroy all other permanents with that name. They can't be regenerated. diff --git a/forge-gui/res/cardsfolder/e/eye_of_the_storm.txt b/forge-gui/res/cardsfolder/e/eye_of_the_storm.txt index 03c9a260d34..2653638f2cb 100644 --- a/forge-gui/res/cardsfolder/e/eye_of_the_storm.txt +++ b/forge-gui/res/cardsfolder/e/eye_of_the_storm.txt @@ -9,7 +9,7 @@ T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCar SVar:DBForget:DB$ Pump | Defined$ TriggeredCard | ForgetObjects$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/eye_of_the_storm.jpg Oracle:Whenever a player casts an instant or sorcery card, exile it. Then that player copies each instant or sorcery card exiled with Eye of the Storm. For each copy, the player may cast the copy without paying its mana cost. diff --git a/forge-gui/res/cardsfolder/e/eye_of_ugin.txt b/forge-gui/res/cardsfolder/e/eye_of_ugin.txt index dc25ff6fa06..e7685019c7d 100644 --- a/forge-gui/res/cardsfolder/e/eye_of_ugin.txt +++ b/forge-gui/res/cardsfolder/e/eye_of_ugin.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Legendary Land S:Mode$ ReduceCost | ValidCard$ Eldrazi.Colorless | Type$ Spell | Activator$ You | Amount$ 2 | Description$ Colorless Eldrazi spells you cast cost {2} less to cast. A:AB$ ChangeZone | Cost$ 7 T | Origin$ Library | Destination$ Hand | ChangeType$ Creature.Colorless | ChangeNum$ 1 | SpellDescription$ Search your library for a colorless creature card, reveal it, put it into your hand, then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/eye_of_ugin.jpg Oracle:Colorless Eldrazi spells you cast cost {2} less to cast.\n{7}, {T}: Search your library for a colorless creature card, reveal it, put it into your hand, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/e/eye_spy.txt b/forge-gui/res/cardsfolder/e/eye_spy.txt index 2d63e9d5535..176d17a6568 100644 --- a/forge-gui/res/cardsfolder/e/eye_spy.txt +++ b/forge-gui/res/cardsfolder/e/eye_spy.txt @@ -2,6 +2,6 @@ Name:Eye Spy ManaCost:U Types:Sorcery A:SP$ Dig | Cost$ U | ValidTgts$ Player | DigNum$ 1 | AnyNumber$ True | DestinationZone$ Graveyard | LibraryPosition2$ 0 | SpellDescription$ Look at the top card of target player's library. You may put that card into their graveyard. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://serv4.tcgimages.eu/img/cards/Portal_Second_Age/eye_spy.jpg Oracle:Look at the top card of target player's library. You may put that card into their graveyard. diff --git a/forge-gui/res/cardsfolder/e/eyes_of_the_watcher.txt b/forge-gui/res/cardsfolder/e/eyes_of_the_watcher.txt index 7ae47425490..53064a96b94 100644 --- a/forge-gui/res/cardsfolder/e/eyes_of_the_watcher.txt +++ b/forge-gui/res/cardsfolder/e/eyes_of_the_watcher.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Enchantment T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | Execute$ TrigScry | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast an instant or sorcery spell, you may pay {1}. If you do, scry 2. (Look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) SVar:TrigScry:AB$Scry | Cost$ 1 | ScryNum$ 2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/eyes_of_the_watcher.jpg Oracle:Whenever you cast an instant or sorcery spell, you may pay {1}. If you do, scry 2. (Look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) diff --git a/forge-gui/res/cardsfolder/e/eyes_of_the_wisent.txt b/forge-gui/res/cardsfolder/e/eyes_of_the_wisent.txt index 51af9d61382..fe2bbb29f23 100644 --- a/forge-gui/res/cardsfolder/e/eyes_of_the_wisent.txt +++ b/forge-gui/res/cardsfolder/e/eyes_of_the_wisent.txt @@ -3,6 +3,6 @@ ManaCost:1 G Types:Tribal Enchantment Elemental T:Mode$ SpellCast | ValidCard$ Card.Blue | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | PlayerTurn$ True | Execute$ TrigToken | OptionalDecider$ You | TriggerDescription$ Whenever an opponent casts a blue spell during your turn, you may create a 4/4 green Elemental creature token. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenName$ Elemental | TokenTypes$ Creature,Elemental | TokenOwner$ You | TokenColors$ Green | TokenPower$ 4 | TokenToughness$ 4 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/eyes_of_the_wisent.jpg Oracle:Whenever an opponent casts a blue spell during your turn, you may create a 4/4 green Elemental creature token. diff --git a/forge-gui/res/cardsfolder/f/fabricate.txt b/forge-gui/res/cardsfolder/f/fabricate.txt index 259ffe00c2a..61d46ba1405 100644 --- a/forge-gui/res/cardsfolder/f/fabricate.txt +++ b/forge-gui/res/cardsfolder/f/fabricate.txt @@ -2,6 +2,6 @@ Name:Fabricate ManaCost:2 U Types:Sorcery A:SP$ ChangeZone | Cost$ 2 U | Origin$ Library | Destination$ Hand | ChangeType$ Artifact | ChangeNum$ 1 | SpellDescription$ Search your library for an artifact card, reveal it, put it into your hand, then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/fabricate.jpg Oracle:Search your library for an artifact card, reveal it, put it into your hand, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/f/face_of_fear.txt b/forge-gui/res/cardsfolder/f/face_of_fear.txt index fcadedbae60..f4d9ceee45e 100644 --- a/forge-gui/res/cardsfolder/f/face_of_fear.txt +++ b/forge-gui/res/cardsfolder/f/face_of_fear.txt @@ -4,6 +4,6 @@ Types:Creature Horror PT:3/4 A:AB$ Pump | Cost$ 2 B Discard<1/Card> | Defined$ Self | KW$ Fear | SpellDescription$ CARDNAME gains fear until end of turn. SVar:AIPreference:DiscardCost$Card.cmcLE3 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/face_of_fear.jpg Oracle:{2}{B}, Discard a card: Face of Fear gains fear until end of turn. (It can't be blocked except by artifact creatures and/or black creatures.) diff --git a/forge-gui/res/cardsfolder/f/faces_of_the_past.txt b/forge-gui/res/cardsfolder/f/faces_of_the_past.txt index f577bdd4f8f..77e4a9475df 100644 --- a/forge-gui/res/cardsfolder/f/faces_of_the_past.txt +++ b/forge-gui/res/cardsfolder/f/faces_of_the_past.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Enchantment T:Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Creature | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigTaporUntapAll | TriggerDescription$ Whenever a creature dies, tap all untapped creatures that share a creature type with it or untap all tapped creatures that share a creature type with it. SVar:TrigTaporUntapAll:DB$ TaporUntapAll | ValidCards$ TriggeredCard.sharesCreatureTypeWith | ValidMessage$ creatures that share a creature type with the triggered creature -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/faces_of_the_past.jpg Oracle:Whenever a creature dies, tap all untapped creatures that share a creature type with it or untap all tapped creatures that share a creature type with it. diff --git a/forge-gui/res/cardsfolder/f/faerie_harbinger.txt b/forge-gui/res/cardsfolder/f/faerie_harbinger.txt index 2649e332241..628f0d28507 100644 --- a/forge-gui/res/cardsfolder/f/faerie_harbinger.txt +++ b/forge-gui/res/cardsfolder/f/faerie_harbinger.txt @@ -6,6 +6,6 @@ K:Flying K:Flash T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for a Faerie card, reveal it, then shuffle your library and put that card on top of it. SVar:TrigChange:DB$ ChangeZone | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Card.Faerie | ChangeNum$ 1 | ShuffleNonMandatory$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/faerie_harbinger.jpg Oracle:Flash\nFlying\nWhen Faerie Harbinger enters the battlefield, you may search your library for a Faerie card, reveal it, then shuffle your library and put that card on top of it. diff --git a/forge-gui/res/cardsfolder/f/faerie_noble.txt b/forge-gui/res/cardsfolder/f/faerie_noble.txt index 8f035972d7e..68ab0ea995a 100644 --- a/forge-gui/res/cardsfolder/f/faerie_noble.txt +++ b/forge-gui/res/cardsfolder/f/faerie_noble.txt @@ -5,6 +5,6 @@ PT:1/2 K:Flying S:Mode$ Continuous | Affected$ Creature.Faerie+Other+YouCtrl | AddToughness$ 1 | Description$ Other Faerie creatures you control get +0/+1. A:AB$ PumpAll | Cost$ T | ValidCards$ Creature.Faerie+Other+YouCtrl | NumAtt$ +1 | SpellDescription$ Other Faerie creatures you control get +1/+0 until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/faerie_noble.jpg Oracle:Flying\nOther Faerie creatures you control get +0/+1.\n{T}: Other Faerie creatures you control get +1/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/f/faith_healer.txt b/forge-gui/res/cardsfolder/f/faith_healer.txt index 38bfacf07af..235b780cc98 100644 --- a/forge-gui/res/cardsfolder/f/faith_healer.txt +++ b/forge-gui/res/cardsfolder/f/faith_healer.txt @@ -4,6 +4,6 @@ Types:Creature Human Cleric PT:1/1 A:AB$ GainLife | Cost$ Sac<1/Enchantment> | LifeAmount$ X | References$ X | SpellDescription$ You gain life equal to the sacrificed enchantment's converted mana cost. SVar:X:Sacrificed$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/faith_healer.jpg Oracle:Sacrifice an enchantment: You gain life equal to the sacrificed enchantment's converted mana cost. diff --git a/forge-gui/res/cardsfolder/f/faithless_looting.txt b/forge-gui/res/cardsfolder/f/faithless_looting.txt index 809b7ad0d5a..793cf0647cd 100644 --- a/forge-gui/res/cardsfolder/f/faithless_looting.txt +++ b/forge-gui/res/cardsfolder/f/faithless_looting.txt @@ -4,6 +4,6 @@ Types:Sorcery K:Flashback:2 R A:SP$ Draw | Cost$ R | NumCards$ 2 | SpellDescription$ Draw two cards, then discard two cards. | SubAbility$ DBDiscard SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 2 | Mode$ TgtChoose -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/faithless_looting.jpg Oracle:Draw two cards, then discard two cards.\nFlashback {2}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/f/faiths_shield.txt b/forge-gui/res/cardsfolder/f/faiths_shield.txt index f7acd96cf42..cdfb4f4d2e3 100644 --- a/forge-gui/res/cardsfolder/f/faiths_shield.txt +++ b/forge-gui/res/cardsfolder/f/faiths_shield.txt @@ -5,6 +5,6 @@ A:SP$ Protection | Cost$ W | CheckSVar$ FatefulHour | SVarCompare$ GT5 | ValidTg A:SP$ ChooseColor | Cost$ W | CheckSVar$ FatefulHour | SVarCompare$ LE5 | Defined$ You | AILogic$ MostProminentAttackers | SubAbility$ DBProtection | References$ FatefulHour | SpellDescription$ Fateful Hour — If you have 5 or less life, instead you and each permanent you control gain protection from the color of your choice until end of turn. SVar:DBProtection:DB$ ProtectionAll | ValidCards$ Permanent.YouCtrl | ValidPlayers$ You | Gains$ ChosenColor SVar:FatefulHour:Count$YourLifeTotal -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/faiths_shield.jpg Oracle:Target permanent you control gains protection from the color of your choice until end of turn.\nFateful hour — If you have 5 or less life, instead you and each permanent you control gain protection from the color of your choice until end of turn. diff --git a/forge-gui/res/cardsfolder/f/falkenrath_torturer.txt b/forge-gui/res/cardsfolder/f/falkenrath_torturer.txt index 68a1939a1aa..2e4b7885124 100644 --- a/forge-gui/res/cardsfolder/f/falkenrath_torturer.txt +++ b/forge-gui/res/cardsfolder/f/falkenrath_torturer.txt @@ -5,6 +5,6 @@ PT:2/1 A:AB$ Pump | Cost$ Sac<1/Creature> | Defined$ Self | KW$ Flying | SubAbility$ DBPutCounter | SpellDescription$ CARDNAME gains flying until end of turn. If the sacrificed creature was a Human, put a +1/+1 counter on Falkenrath Torturer. SVar:DBPutCounter:DB$PutCounter | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | CounterNum$ 1 | CounterType$ P1P1 | References$ X SVar:X:Sacrificed$Valid Human -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/falkenrath_torturer.jpg Oracle:Sacrifice a creature: Falkenrath Torturer gains flying until end of turn. If the sacrificed creature was a Human, put a +1/+1 counter on Falkenrath Torturer. diff --git a/forge-gui/res/cardsfolder/f/false_cure.txt b/forge-gui/res/cardsfolder/f/false_cure.txt index 11ea9b57ef0..e57cef6ca08 100644 --- a/forge-gui/res/cardsfolder/f/false_cure.txt +++ b/forge-gui/res/cardsfolder/f/false_cure.txt @@ -5,7 +5,7 @@ A:SP$ Effect | Cost$ B B | Name$ False Cure Effect | Triggers$ GainLife | SVars$ SVar:GainLife:Mode$ LifeGained | ValidPlayer$ Player | TriggerZones$ Command | Execute$ TrigLoseLife | TriggerDescription$ Whenever a player gains life, that player loses 2 life for each 1 life they gained. SVar:TrigLoseLife:DB$ LoseLife | Defined$ TriggeredPlayer | LifeAmount$ X | References$ X SVar:X:TriggerCount$LifeAmount/Times.2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/false_cure.jpg Oracle:Until end of turn, whenever a player gains life, that player loses 2 life for each 1 life they gained. diff --git a/forge-gui/res/cardsfolder/f/false_dawn.txt b/forge-gui/res/cardsfolder/f/false_dawn.txt index b9e6a741287..8eb635c8be1 100644 --- a/forge-gui/res/cardsfolder/f/false_dawn.txt +++ b/forge-gui/res/cardsfolder/f/false_dawn.txt @@ -6,7 +6,7 @@ SVar:DBDraw:DB$ Draw | NumCards$ 1 SVar:FDRep:Event$ ProduceMana | ActiveZones$ Command | ValidCard$ Card.YouCtrl | NoTapCheck$ True | ManaReplacement$ ProduceW | Description$ Spells and abilities you control that would add colored mana add that much white mana instead. SVar:ProduceW:R->W & B->W & U->W & G->W SVar:FDManaConvertion:Mode$ Continuous | EffectZone$ Command | Affected$ You | ManaColorConversion$ Additive | WhiteConversion$ All | Description$ You may spend white mana as though it were mana of any color. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/false_dawn.jpg Oracle:Until end of turn, spells and abilities you control that would add colored mana add that much white mana instead. Until end of turn, you may spend white mana as though it were mana of any color.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/f/false_memories.txt b/forge-gui/res/cardsfolder/f/false_memories.txt index 411e739d63b..d3c4da4fd35 100644 --- a/forge-gui/res/cardsfolder/f/false_memories.txt +++ b/forge-gui/res/cardsfolder/f/false_memories.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Mill | Cost$ 1 U | NumCards$ 7 | SubAbility$ DelTrig | SpellDescription$ Put the top seven cards of your library into your graveyard. At the beginning of the next end step, exile seven cards from your graveyard. SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigExile | TriggerDescription$ At the beginning of the next end step, exile seven cards from your graveyard. SVar:TrigExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | ChangeType$ Card.YouCtrl | ChangeNum$ 7 | Hidden$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/false_memories.jpg Oracle:Put the top seven cards of your library into your graveyard. At the beginning of the next end step, exile seven cards from your graveyard. diff --git a/forge-gui/res/cardsfolder/f/false_peace.txt b/forge-gui/res/cardsfolder/f/false_peace.txt index 80b0ac632e3..777b239894c 100644 --- a/forge-gui/res/cardsfolder/f/false_peace.txt +++ b/forge-gui/res/cardsfolder/f/false_peace.txt @@ -2,6 +2,6 @@ Name:False Peace ManaCost:W Types:Sorcery A:SP$ Pump | Cost$ W | ValidTgts$ Player | TgtPrompt$ Select target player | KW$ Skip all combat phases of your next turn. | Permanent$ True | SpellDescription$ Target player skips all combat phases of their next turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/false_peace.jpg Oracle:Target player skips all combat phases of their next turn. diff --git a/forge-gui/res/cardsfolder/f/false_prophet.txt b/forge-gui/res/cardsfolder/f/false_prophet.txt index ce2b9587c97..80c0b2e98a2 100644 --- a/forge-gui/res/cardsfolder/f/false_prophet.txt +++ b/forge-gui/res/cardsfolder/f/false_prophet.txt @@ -4,6 +4,6 @@ Types:Creature Human Cleric PT:2/2 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigSac | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, exile all creatures. SVar:TrigSac:DB$ChangeZoneAll | ChangeType$ Creature | Origin$ Battlefield | Destination$ Exile -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/false_prophet.jpg Oracle:When False Prophet dies, exile all creatures. diff --git a/forge-gui/res/cardsfolder/f/falter.txt b/forge-gui/res/cardsfolder/f/falter.txt index ee5d0b992cc..c849ced2cd3 100644 --- a/forge-gui/res/cardsfolder/f/falter.txt +++ b/forge-gui/res/cardsfolder/f/falter.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Effect | Cost$ 1 R | Name$ Falter Effect | StaticAbilities$ KWPump | AILogic$ Evasion | SpellDescription$ Creatures without flying can't block this turn. SVar:KWPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.withoutFlying | AddHiddenKeyword$ CARDNAME can't block. | Description$ Creatures without flying can't block this turn. SVar:PlayMain1:TRUE -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/falter.jpg Oracle:Creatures without flying can't block this turn. diff --git a/forge-gui/res/cardsfolder/f/familiars_ruse.txt b/forge-gui/res/cardsfolder/f/familiars_ruse.txt index 77b72e9f3c5..0bd173a18ff 100644 --- a/forge-gui/res/cardsfolder/f/familiars_ruse.txt +++ b/forge-gui/res/cardsfolder/f/familiars_ruse.txt @@ -2,6 +2,6 @@ Name:Familiar's Ruse ManaCost:U U Types:Instant A:SP$ Counter | Cost$ U U Return<1/Creature> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | Destination$ Graveyard | SpellDescription$ Counter target spell. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/familiars_ruse.jpg Oracle:As an additional cost to cast Familiar's Ruse, return a creature you control to its owner's hand.\nCounter target spell. diff --git a/forge-gui/res/cardsfolder/f/famished_ghoul.txt b/forge-gui/res/cardsfolder/f/famished_ghoul.txt index 9412939e69d..ee65f6caf87 100644 --- a/forge-gui/res/cardsfolder/f/famished_ghoul.txt +++ b/forge-gui/res/cardsfolder/f/famished_ghoul.txt @@ -3,6 +3,6 @@ ManaCost:3 B Types:Creature Zombie PT:3/2 A:AB$ ChangeZone | Cost$ 1 B Sac<1/CARDNAME> | TargetMin$ 0 | TargetMax$ 2 | TargetsFromSingleZone$ True | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SpellDescription$ Exile up to two target cards from a single graveyard. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/famished_ghoul.jpg Oracle:{1}{B}, Sacrifice Famished Ghoul: Exile up to two target cards from a single graveyard. diff --git a/forge-gui/res/cardsfolder/f/famished_paladin.txt b/forge-gui/res/cardsfolder/f/famished_paladin.txt index 533100d263f..e51541affe9 100644 --- a/forge-gui/res/cardsfolder/f/famished_paladin.txt +++ b/forge-gui/res/cardsfolder/f/famished_paladin.txt @@ -5,6 +5,6 @@ PT:3/3 K:CARDNAME doesn't untap during your untap step. T:Mode$ LifeGained | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigUntap | TriggerDescription$ Whenever you gain life, untap CARDNAME. SVar:TrigUntap:DB$ Untap | Defined$ Self -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/famished_paladin.jpg Oracle:Famished Paladin doesn't untap during your untap step.\nWhenever you gain life, untap Famished Paladin. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/f/fanatical_devotion.txt b/forge-gui/res/cardsfolder/f/fanatical_devotion.txt index cb46e0d0591..77f3f405a13 100644 --- a/forge-gui/res/cardsfolder/f/fanatical_devotion.txt +++ b/forge-gui/res/cardsfolder/f/fanatical_devotion.txt @@ -3,6 +3,6 @@ ManaCost:2 W Types:Enchantment A:AB$ Regenerate | ValidTgts$ Creature | TgtPrompt$ Select target creature | Cost$ Sac<1/Creature> | SpellDescription$ Regenerate target creature. SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fanatical_devotion.jpg Oracle:Sacrifice a creature: Regenerate target creature. diff --git a/forge-gui/res/cardsfolder/f/farrelite_priest.txt b/forge-gui/res/cardsfolder/f/farrelite_priest.txt index 6ff2c2be677..f72e31e92d0 100644 --- a/forge-gui/res/cardsfolder/f/farrelite_priest.txt +++ b/forge-gui/res/cardsfolder/f/farrelite_priest.txt @@ -4,6 +4,6 @@ Types:Creature Human Cleric PT:1/3 A:AB$ Mana | Cost$ 1 | Produced$ W | ActivationNumberSacrifice$ GE4 | ActivationResolveSub$ DBPump | SpellDescription$ Add {W}. If this ability has been activated four or more times this turn, sacrifice CARDNAME at the beginning of the next end step. SVar:DBPump:DB$ Pump | AtEOT$ Sacrifice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/farrelite_priest.jpg Oracle:{1}: Add {W}. If this ability has been activated four or more times this turn, sacrifice Farrelite Priest at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/f/farseek.txt b/forge-gui/res/cardsfolder/f/farseek.txt index 3d0f282410a..cc163e2cb87 100644 --- a/forge-gui/res/cardsfolder/f/farseek.txt +++ b/forge-gui/res/cardsfolder/f/farseek.txt @@ -2,7 +2,7 @@ Name:Farseek ManaCost:1 G Types:Sorcery A:SP$ ChangeZone | Cost$ 1 G | Origin$ Library | Destination$ Battlefield | ChangeType$ Plains,Island,Swamp,Mountain | Tapped$ True | ChangeNum$ 1 | SpellDescription$ Search your library for a Plains, Island, Swamp, or Mountain card, put it onto the battlefield tapped, then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$White|Blue|Black|Red SVar:Picture:http://www.wizards.com/global/images/magic/general/farseek.jpg Oracle:Search your library for a Plains, Island, Swamp, or Mountain card, put it onto the battlefield tapped, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/f/fascination.txt b/forge-gui/res/cardsfolder/f/fascination.txt index 69af9e89c57..860f2126e62 100644 --- a/forge-gui/res/cardsfolder/f/fascination.txt +++ b/forge-gui/res/cardsfolder/f/fascination.txt @@ -5,6 +5,6 @@ A:SP$ Charm | Cost$ X U U | Choices$ DBDraw,DBMill SVar:DBDraw:DB$ Draw | Defined$ Player | NumCards$ X | References$ X | SpellDescription$ Each player draws X cards. SVar:DBMill:DB$ Mill | Defined$ Player | NumCards$ X | References$ X | SpellDescription$ Each player puts the top X cards of their library into their graveyard. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fascination.jpg Oracle:Choose one —\n• Each player draws X cards.\n• Each player puts the top X cards of their library into their graveyard. diff --git a/forge-gui/res/cardsfolder/f/fatal_attraction.txt b/forge-gui/res/cardsfolder/f/fatal_attraction.txt index a11b1795db3..5d5cd347107 100644 --- a/forge-gui/res/cardsfolder/f/fatal_attraction.txt +++ b/forge-gui/res/cardsfolder/f/fatal_attraction.txt @@ -7,6 +7,6 @@ T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefi SVar:TrigDamage2:DB$ DealDamage | Defined$ Enchanted | NumDmg$ 2 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDamage4 | TriggerDescription$ At the beginning of your upkeep, CARDNAME deals 4 damage to enchanted creature. SVar:TrigDamage4:DB$ DealDamage | Defined$ Enchanted | NumDmg$ 4 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fatal_attraction.jpg Oracle:Enchant creature\nWhen Fatal Attraction enters the battlefield, it deals 2 damage to enchanted creature.\nAt the beginning of your upkeep, Fatal Attraction deals 4 damage to enchanted creature. diff --git a/forge-gui/res/cardsfolder/f/fatal_lore.txt b/forge-gui/res/cardsfolder/f/fatal_lore.txt index 1435941a551..235429550db 100644 --- a/forge-gui/res/cardsfolder/f/fatal_lore.txt +++ b/forge-gui/res/cardsfolder/f/fatal_lore.txt @@ -5,6 +5,6 @@ A:SP$ Charm | Cost$ 2 B B | Chooser$ Opponent | Choices$ DrawThree,DestroyAndDra SVar:DrawThree:DB$ Draw | NumCards$ 3 | Defined$ You | SpellDescription$ You draw three cards. SVar:DestroyAndDraw:DB$ Destroy | ValidTgts$ Creature.ChosenCtrl | TgtPrompt$ Select target creature | TargetMin$ 0 | TargetMax$ 2 | NoRegen$ True | SpellDescription$ You destroy up to two target creatures that opponent controls and that player draws up to three cards. Those creatures can't be regenerated. | SubAbility$ ChooserDraws SVar:ChooserDraws:DB$ Draw | NumCards$ 3 | Defined$ ChosenPlayer -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fatal_lore.jpg Oracle:An opponent chooses one —\n• You draw three cards.\n• You destroy up to two target creatures that player controls. They can't be regenerated. That player draws up to three cards. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/f/fatal_mutation.txt b/forge-gui/res/cardsfolder/f/fatal_mutation.txt index 46b2ae9a502..2575ab2b925 100644 --- a/forge-gui/res/cardsfolder/f/fatal_mutation.txt +++ b/forge-gui/res/cardsfolder/f/fatal_mutation.txt @@ -5,7 +5,7 @@ K:Enchant creature A:SP$ Attach | Cost$ B | ValidTgts$ Creature | AILogic$ Curse T:Mode$ TurnFaceUp | ValidCard$ Card.AttachedBy | Execute$ TrigDestroy | TriggerZones$ Battlefield | TriggerDescription$ When enchanted creature is turned face up, destroy it. It can't be regenerated. SVar:TrigDestroy:DB$ Destroy | Defined$ TriggeredCard | NoRegen$ True -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fatal_mutation.jpg Oracle:Enchant creature\nWhen enchanted creature is turned face up, destroy it. It can't be regenerated. diff --git a/forge-gui/res/cardsfolder/f/fate_transfer.txt b/forge-gui/res/cardsfolder/f/fate_transfer.txt index c7565310caa..276936bdca6 100644 --- a/forge-gui/res/cardsfolder/f/fate_transfer.txt +++ b/forge-gui/res/cardsfolder/f/fate_transfer.txt @@ -6,7 +6,7 @@ SVar:DBRemember:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creatu SVar:DBMove:DB$ RepeatEach | Defined$ Imprinted | RepeatCounters$ True | RepeatSubAbility$ MoveCounters | SubAbility$ DBCleanup SVar:MoveCounters:DB$ MoveCounter | Source$ Imprinted | Defined$ Remembered | CounterType$ RepeatSVarCounter | CounterNum$ RepeatCounterAmount SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/fate_transfer.jpg Oracle:Move all counters from target creature onto another target creature. diff --git a/forge-gui/res/cardsfolder/f/fatestitcher.txt b/forge-gui/res/cardsfolder/f/fatestitcher.txt index bbbeb5b7148..b878111a010 100644 --- a/forge-gui/res/cardsfolder/f/fatestitcher.txt +++ b/forge-gui/res/cardsfolder/f/fatestitcher.txt @@ -4,6 +4,6 @@ Types:Creature Zombie Wizard PT:1/2 K:Unearth:U A:AB$ TapOrUntap | Cost$ T | ValidTgts$ Permanent.Other | TgtPrompt$ Select another target permanent | SpellDescription$ You may tap or untap another target permanent. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fatestitcher.jpg Oracle:{T}: You may tap or untap another target permanent.\nUnearth {U} ({U}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/f/fatigue.txt b/forge-gui/res/cardsfolder/f/fatigue.txt index 369dcf97255..b25405d74d3 100644 --- a/forge-gui/res/cardsfolder/f/fatigue.txt +++ b/forge-gui/res/cardsfolder/f/fatigue.txt @@ -2,6 +2,6 @@ Name:Fatigue ManaCost:1 U Types:Sorcery A:SP$ Pump | Cost$ 1 U | ValidTgts$ Player | TgtPrompt$ Select target player | KW$ Skip your next draw step. | Permanent$ True | SpellDescription$ Target player skips their next draw step. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fatigue.jpg Oracle:Target player skips their next draw step. diff --git a/forge-gui/res/cardsfolder/f/fault_riders.txt b/forge-gui/res/cardsfolder/f/fault_riders.txt index 8b814d374f7..e2bfa351553 100644 --- a/forge-gui/res/cardsfolder/f/fault_riders.txt +++ b/forge-gui/res/cardsfolder/f/fault_riders.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Creature Human Soldier PT:2/2 A:AB$ Pump | Cost$ Sac<1/Land> | Defined$ Self | NumAtt$ +2 | KW$ First Strike | ActivationLimit$ 1 | SpellDescription$ CARDNAME gets +2/+0 and gains first strike until end of turn. Activate this ability only once each turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fault_riders.jpg Oracle:Sacrifice a land: Fault Riders gets +2/+0 and gains first strike until end of turn. Activate this ability only once each turn. diff --git a/forge-gui/res/cardsfolder/f/favor_of_the_mighty.txt b/forge-gui/res/cardsfolder/f/favor_of_the_mighty.txt index 9825c6211df..43835698eda 100644 --- a/forge-gui/res/cardsfolder/f/favor_of_the_mighty.txt +++ b/forge-gui/res/cardsfolder/f/favor_of_the_mighty.txt @@ -3,6 +3,6 @@ ManaCost:1 W Types:Tribal Enchantment Giant S:Mode$ Continuous | Affected$ Creature.greatestCMC_Creature | AddKeyword$ Protection from all colors | Description$ Each creature with the highest converted mana cost has protection from all colors. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/favor_of_the_mighty.jpg Oracle:Each creature with the highest converted mana cost has protection from all colors. diff --git a/forge-gui/res/cardsfolder/f/feast_of_blood.txt b/forge-gui/res/cardsfolder/f/feast_of_blood.txt index c0700403b82..72ef60449bc 100644 --- a/forge-gui/res/cardsfolder/f/feast_of_blood.txt +++ b/forge-gui/res/cardsfolder/f/feast_of_blood.txt @@ -3,6 +3,6 @@ ManaCost:1 B Types:Sorcery A:SP$ Destroy | Cost$ 1 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBGainLife | IsPresent$ Vampire.YouCtrl | PresentCompare$ GE2 | SpellDescription$ Cast CARDNAME only if you control two or more Vampires. Destroy target creature. You gain 4 life. SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 4 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/feast_of_blood.jpg Oracle:Cast Feast of Blood only if you control two or more Vampires.\nDestroy target creature. You gain 4 life. diff --git a/forge-gui/res/cardsfolder/f/feast_of_worms.txt b/forge-gui/res/cardsfolder/f/feast_of_worms.txt index 17bdb0a9e2e..eda253c5f69 100644 --- a/forge-gui/res/cardsfolder/f/feast_of_worms.txt +++ b/forge-gui/res/cardsfolder/f/feast_of_worms.txt @@ -3,6 +3,6 @@ ManaCost:3 G G Types:Sorcery Arcane A:SP$ Destroy | Cost$ 3 G G | ValidTgts$ Land | TgtPrompt$ Select target land | SubAbility$ DBSacrifice | SpellDescription$ Destroy target land. If that land was legendary, its controller sacrifices another land. SVar:DBSacrifice:DB$ Sacrifice | Defined$ TargetedController | SacValid$ Land | ConditionDefined$ Targeted | ConditionPresent$ Land.Legendary | ConditionCompare$ EQ1 | ConditionDescription$ If that land was legendary, -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/feast_of_worms.jpg Oracle:Destroy target land. If that land was legendary, its controller sacrifices another land. diff --git a/forge-gui/res/cardsfolder/f/fecundity.txt b/forge-gui/res/cardsfolder/f/fecundity.txt index 3748ef3ed0a..926e7d5ed86 100644 --- a/forge-gui/res/cardsfolder/f/fecundity.txt +++ b/forge-gui/res/cardsfolder/f/fecundity.txt @@ -3,6 +3,6 @@ ManaCost:2 G Types:Enchantment T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigDraw | OptionalDecider$ TriggeredCardController | TriggerDescription$ Whenever a creature dies, that creature's controller may draw a card. SVar:TrigDraw:DB$Draw | Defined$ TriggeredCardController | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/fecundity.jpg Oracle:Whenever a creature dies, that creature's controller may draw a card. diff --git a/forge-gui/res/cardsfolder/f/feed_the_pack.txt b/forge-gui/res/cardsfolder/f/feed_the_pack.txt index 09d18856c96..248e44afc50 100644 --- a/forge-gui/res/cardsfolder/f/feed_the_pack.txt +++ b/forge-gui/res/cardsfolder/f/feed_the_pack.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | OptionalDecider$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of your end step, you may sacrifice a nontoken creature. If you do, create X 2/2 green Wolf creature tokens, where X is the sacrificed creature's toughness. SVar:TrigToken:AB$ Token | Cost$ Sac<1/Creature.nonToken/nontoken creature> | TokenAmount$ X | TokenName$ Wolf | TokenColors$ Green | TokenTypes$ Creature,Wolf | TokenOwner$ You | TokenPower$ 2 | TokenToughness$ 2 | TokenImage$ g 2 2 wolf ISD | ConditionCheckSVar$ X | References$ X SVar:X:Sacrificed$CardToughness -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/feed_the_pack.jpg Oracle:At the beginning of your end step, you may sacrifice a nontoken creature. If you do, create X 2/2 green Wolf creature tokens, where X is the sacrificed creature's toughness. diff --git a/forge-gui/res/cardsfolder/f/feedback_bolt.txt b/forge-gui/res/cardsfolder/f/feedback_bolt.txt index 504791c8fc6..612109fb5cc 100644 --- a/forge-gui/res/cardsfolder/f/feedback_bolt.txt +++ b/forge-gui/res/cardsfolder/f/feedback_bolt.txt @@ -3,6 +3,6 @@ ManaCost:4 R Types:Instant A:SP$ DealDamage | Cost$ 4 R | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals damage to target player or planeswalker equal to the number of artifacts you control. SVar:X:Count$TypeYouCtrl.Artifact -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/feedback_bolt.jpg Oracle:Feedback Bolt deals damage to target player or planeswalker equal to the number of artifacts you control. diff --git a/forge-gui/res/cardsfolder/f/feeding_frenzy.txt b/forge-gui/res/cardsfolder/f/feeding_frenzy.txt index 7be6614ec94..206fb3fe4c3 100644 --- a/forge-gui/res/cardsfolder/f/feeding_frenzy.txt +++ b/forge-gui/res/cardsfolder/f/feeding_frenzy.txt @@ -3,6 +3,6 @@ ManaCost:2 B Types:Instant A:SP$ Pump | Cost$ 2 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -X | NumDef$ -X | IsCurse$ True | References$ X | SpellDescription$ Target creature gets -X/-X until end of turn, where X is the number of Zombies on the battlefield. SVar:X:Count$Valid Zombie -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/feeding_frenzy.jpg Oracle:Target creature gets -X/-X until end of turn, where X is the number of Zombies on the battlefield. diff --git a/forge-gui/res/cardsfolder/f/feint.txt b/forge-gui/res/cardsfolder/f/feint.txt index 1632accc9e5..13094388ac5 100644 --- a/forge-gui/res/cardsfolder/f/feint.txt +++ b/forge-gui/res/cardsfolder/f/feint.txt @@ -5,6 +5,6 @@ A:SP$ TapAll | Cost$ R | ValidCards$ Creature.blockingRemembered | ValidTgts$ Cr SVar:FeintPump:DB$ Pump | Defined$ Remembered | KW$ Prevent all combat damage that would be dealt by CARDNAME. | SubAbility$ FeintPumpAll SVar:FeintPumpAll:DB$ Pump | Defined$ Valid Creature.blockingRemembered | KW$ Prevent all combat damage that would be dealt by CARDNAME. | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/feint.jpg Oracle:Tap all creatures blocking target attacking creature. Prevent all combat damage that would be dealt this turn by that creature and each creature blocking it. diff --git a/forge-gui/res/cardsfolder/f/feldons_cane.txt b/forge-gui/res/cardsfolder/f/feldons_cane.txt index 7233cb849d3..7a17060cd21 100644 --- a/forge-gui/res/cardsfolder/f/feldons_cane.txt +++ b/forge-gui/res/cardsfolder/f/feldons_cane.txt @@ -2,7 +2,7 @@ Name:Feldon's Cane ManaCost:1 Types:Artifact A:AB$ ChangeZoneAll | Cost$ T Exile<1/CARDNAME> | ChangeType$ Card.YouOwn | Origin$ Graveyard | Destination$ Library | Shuffle$ True | SpellDescription$ Shuffle your graveyard into your library. -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/feldons_cane.jpg Oracle:{T}, Exile Feldon's Cane: Shuffle your graveyard into your library. diff --git a/forge-gui/res/cardsfolder/f/fell_the_mighty.txt b/forge-gui/res/cardsfolder/f/fell_the_mighty.txt index c2884e62681..3300c852c60 100644 --- a/forge-gui/res/cardsfolder/f/fell_the_mighty.txt +++ b/forge-gui/res/cardsfolder/f/fell_the_mighty.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ Pump | Cost$ 4 W | ValidTgts$ Creature | StackDescription$ None | SubAbility$ DBDestroy | AILogic$ FellTheMighty | SpellDescription$ Destroy all creatures with power greater than target creature's power. SVar:DBDestroy:DB$ DestroyAll | ValidCards$ Creature.powerGTX | References$ X SVar:X:ParentTargeted$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fell_the_mighty.jpg Oracle:Destroy all creatures with power greater than target creature's power. diff --git a/forge-gui/res/cardsfolder/f/fend_off.txt b/forge-gui/res/cardsfolder/f/fend_off.txt index 663f9da0cfc..5e158772e64 100644 --- a/forge-gui/res/cardsfolder/f/fend_off.txt +++ b/forge-gui/res/cardsfolder/f/fend_off.txt @@ -3,6 +3,6 @@ ManaCost:1 W Types:Instant A:SP$ Pump | Cost$ 1 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Prevent all combat damage that would be dealt by CARDNAME. | SpellDescription$ Prevent all combat damage that would be dealt by target creature this turn. K:Cycling:2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fend_off.jpg Oracle:Prevent all combat damage that would be dealt by target creature this turn.\nCycling {2} ({2}, Discard this card: Draw a card.) diff --git a/forge-gui/res/cardsfolder/f/fendeep_summoner.txt b/forge-gui/res/cardsfolder/f/fendeep_summoner.txt index 59fd64696f7..4334a40686d 100644 --- a/forge-gui/res/cardsfolder/f/fendeep_summoner.txt +++ b/forge-gui/res/cardsfolder/f/fendeep_summoner.txt @@ -3,6 +3,6 @@ ManaCost:4 B Types:Creature Treefolk Shaman PT:3/5 A:AB$ Animate | Cost$ T | ValidTgts$ Swamp | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Select target Swamp | Power$ 3 | Toughness$ 5 | Types$ Creature,Warrior,Treefolk | SpellDescription$ Up to two target Swamps each become 3/5 Treefolk Warrior creatures in addition to their other types until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fendeep_summoner.jpg Oracle:{T}: Up to two target Swamps each become 3/5 Treefolk Warrior creatures in addition to their other types until end of turn. diff --git a/forge-gui/res/cardsfolder/f/feral_contest.txt b/forge-gui/res/cardsfolder/f/feral_contest.txt index d7696f21ab5..1618b8affe5 100644 --- a/forge-gui/res/cardsfolder/f/feral_contest.txt +++ b/forge-gui/res/cardsfolder/f/feral_contest.txt @@ -3,6 +3,6 @@ ManaCost:3 G Types:Sorcery A:SP$ PutCounter | Cost$ 3 G | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ 1 | References$ X | SubAbility$ DBMustBlock | SpellDescription$ Put a +1/+1 counter on target creature you control. Another target creature blocks it this turn if able. SVar:DBMustBlock:DB$ MustBlock | DefinedAttacker$ ParentTarget | ValidTgts$ Creature | TgtPrompt$ Select target creature to block -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/feral_contest.jpg Oracle:Put a +1/+1 counter on target creature you control. Another target creature blocks it this turn if able. diff --git a/forge-gui/res/cardsfolder/f/feral_deceiver.txt b/forge-gui/res/cardsfolder/f/feral_deceiver.txt index 49c2f5dc570..3291b90bfbc 100644 --- a/forge-gui/res/cardsfolder/f/feral_deceiver.txt +++ b/forge-gui/res/cardsfolder/f/feral_deceiver.txt @@ -6,6 +6,6 @@ A:AB$ Dig | Cost$ 1 | DigNum$ 1 | DestinationZone$ Library | LibraryPosition$ 0 A:AB$ Dig | Cost$ 2 | DigNum$ 1 | ActivationLimit$ 1 | Reveal$ True | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | NoMove$ True | RememberRevealed$ True | SubAbility$ TrigPump | SpellDescription$ Reveal the top card of your library. If it's a land card, CARDNAME gets +2/+2 and gains trample until end of turn. Activate this ability only once each turn. SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ 2 | NumDef$ 2 | KW$ Trample | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | ConditionCompare$ GE1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/feral_deceiver.jpg Oracle:{1}: Look at the top card of your library.\n{2}: Reveal the top card of your library. If it's a land card, Feral Deceiver gets +2/+2 and gains trample until end of turn. Activate this ability only once each turn. diff --git a/forge-gui/res/cardsfolder/f/ferozs_ban.txt b/forge-gui/res/cardsfolder/f/ferozs_ban.txt index 4edcf231637..abf5d3fd381 100644 --- a/forge-gui/res/cardsfolder/f/ferozs_ban.txt +++ b/forge-gui/res/cardsfolder/f/ferozs_ban.txt @@ -2,6 +2,6 @@ Name:Feroz's Ban ManaCost:6 Types:Artifact S:Mode$ RaiseCost | ValidCard$ Creature | Type$ Spell | Amount$ 2 | Description$ Creature spells cost {2} more to cast. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ferozs_ban.jpg Oracle:Creature spells cost {2} more to cast. diff --git a/forge-gui/res/cardsfolder/f/fertile_ground.txt b/forge-gui/res/cardsfolder/f/fertile_ground.txt index 921004dbbfc..d5b13a9e671 100644 --- a/forge-gui/res/cardsfolder/f/fertile_ground.txt +++ b/forge-gui/res/cardsfolder/f/fertile_ground.txt @@ -5,6 +5,6 @@ K:Enchant land A:SP$ Attach | Cost$ 1 G | ValidTgts$ Land | AILogic$ Pump T:Mode$ TapsForMana | ValidCard$ Card.AttachedBy | Execute$ TrigMana | Static$ True | TriggerDescription$ Whenever enchanted land is tapped for mana, its controller adds an additional one mana of any color. SVar:TrigMana:DB$ Mana | Produced$ Any | Amount$ 1 | Defined$ TriggeredCardController -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fertile_ground.jpg Oracle:Enchant land\nWhenever enchanted land is tapped for mana, its controller adds an additional one mana of any color. diff --git a/forge-gui/res/cardsfolder/f/fertile_imagination.txt b/forge-gui/res/cardsfolder/f/fertile_imagination.txt index 0ea391b5b57..aeafe8e9a14 100644 --- a/forge-gui/res/cardsfolder/f/fertile_imagination.txt +++ b/forge-gui/res/cardsfolder/f/fertile_imagination.txt @@ -7,7 +7,7 @@ SVar:DBToken:DB$ Token | TokenAmount$ X | TokenName$ Saproling | TokenTypes$ Cre SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:SVar$Y/Twice SVar:Y:Remembered$Valid Card.ChosenType -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHas:Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/fertile_imagination.jpg Oracle:Choose a card type. Target opponent reveals their hand. Create two 1/1 green Saproling creature tokens for each card of the chosen type revealed this way. (Artifact, creature, enchantment, instant, land, planeswalker, sorcery, and tribal are card types.) diff --git a/forge-gui/res/cardsfolder/f/festercreep.txt b/forge-gui/res/cardsfolder/f/festercreep.txt index f886deba365..4319be7bb79 100644 --- a/forge-gui/res/cardsfolder/f/festercreep.txt +++ b/forge-gui/res/cardsfolder/f/festercreep.txt @@ -4,6 +4,6 @@ Types:Creature Elemental PT:0/0 K:etbCounter:P1P1:1 A:AB$ PumpAll | Cost$ 1 B SubCounter<1/P1P1> | ValidCards$ Creature.Other | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ All other creatures get -1/-1 until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/festercreep.jpg Oracle:Festercreep enters the battlefield with a +1/+1 counter on it.\n{1}{B}, Remove a +1/+1 counter from Festercreep: All other creatures get -1/-1 until end of turn. diff --git a/forge-gui/res/cardsfolder/f/festival.txt b/forge-gui/res/cardsfolder/f/festival.txt index def0ed2952f..0ad3f467bb2 100644 --- a/forge-gui/res/cardsfolder/f/festival.txt +++ b/forge-gui/res/cardsfolder/f/festival.txt @@ -4,6 +4,6 @@ Types:Instant Text:Cast CARDNAME only during an opponent's upkeep. A:SP$ Effect | Cost$ W | Name$ Festival Effect | StaticAbilities$ KWPump | OpponentTurn$ True | ActivationPhases$ Upkeep | SpellDescription$ Creatures can't attack this turn. SVar:KWPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature | AddHiddenKeyword$ CARDNAME can't attack. | Description$ Creatures can't attack this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/festival.jpg Oracle:Cast Festival only during an opponent's upkeep.\nCreatures can't attack this turn. diff --git a/forge-gui/res/cardsfolder/f/festival_of_the_guildpact.txt b/forge-gui/res/cardsfolder/f/festival_of_the_guildpact.txt index dfc6913182e..2e7f51a0777 100644 --- a/forge-gui/res/cardsfolder/f/festival_of_the_guildpact.txt +++ b/forge-gui/res/cardsfolder/f/festival_of_the_guildpact.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ PreventDamage | Cost$ X W | Defined$ You | Amount$ X | SubAbility$ DBDraw | References$ X | SpellDescription$ Prevent the next X damage that would be dealt to you this turn. SVar:X:Count$xPaid SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/festival_of_the_guildpact.jpg Oracle:Prevent the next X damage that would be dealt to you this turn.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/f/fetid_heath.txt b/forge-gui/res/cardsfolder/f/fetid_heath.txt index 22a32f572aa..a3fb82aadcb 100644 --- a/forge-gui/res/cardsfolder/f/fetid_heath.txt +++ b/forge-gui/res/cardsfolder/f/fetid_heath.txt @@ -5,6 +5,6 @@ A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ WB T | Produced$ W | Amount$ 2 | SpellDescription$ Add {W}{W}. A:AB$ Mana | Cost$ WB T | Produced$ W B | SpellDescription$ Add {W}{B}. A:AB$ Mana | Cost$ WB T | Produced$ B | Amount$ 2 | SpellDescription$ Add {B}{B}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fetid_heath.jpg Oracle:{T}: Add {C}.\n{W/B}, {T}: Add {W}{W}, {W}{B}, or {B}{B}. diff --git a/forge-gui/res/cardsfolder/f/fettergeist.txt b/forge-gui/res/cardsfolder/f/fettergeist.txt index 97ea0019a75..f863e274b3f 100644 --- a/forge-gui/res/cardsfolder/f/fettergeist.txt +++ b/forge-gui/res/cardsfolder/f/fettergeist.txt @@ -5,6 +5,6 @@ PT:3/4 K:Flying K:UpkeepCost:X:{1} for each other creature you control SVar:X:Count$Valid Creature.Other+YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fettergeist.jpg Oracle:Flying\nAt the beginning of your upkeep, sacrifice Fettergeist unless you pay {1} for each other creature you control. diff --git a/forge-gui/res/cardsfolder/f/fiddlehead_kami.txt b/forge-gui/res/cardsfolder/f/fiddlehead_kami.txt index 3341e045839..18ae495d4de 100644 --- a/forge-gui/res/cardsfolder/f/fiddlehead_kami.txt +++ b/forge-gui/res/cardsfolder/f/fiddlehead_kami.txt @@ -5,6 +5,6 @@ PT:3/3 T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRegen | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, regenerate CARDNAME. SVar:TrigRegen:DB$Regenerate | Defined$ Self SVar:BuffedBy:Arcane,Spirit -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/fiddlehead_kami.jpg Oracle:Whenever you cast a Spirit or Arcane spell, regenerate Fiddlehead Kami. diff --git a/forge-gui/res/cardsfolder/f/field_of_dreams.txt b/forge-gui/res/cardsfolder/f/field_of_dreams.txt index fa6a36e2e50..49c953bbd36 100644 --- a/forge-gui/res/cardsfolder/f/field_of_dreams.txt +++ b/forge-gui/res/cardsfolder/f/field_of_dreams.txt @@ -3,6 +3,6 @@ ManaCost:U Types:World Enchantment S:Mode$ Continuous | Affected$ Card.TopLibrary | AffectedZone$ Library | MayLookAt$ Player | Description$ Players play with the top card of their libraries revealed. SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/field_of_dreams.jpg Oracle:Players play with the top card of their libraries revealed. diff --git a/forge-gui/res/cardsfolder/f/field_of_reality.txt b/forge-gui/res/cardsfolder/f/field_of_reality.txt index 0dd5d400f2f..b99fb732d35 100644 --- a/forge-gui/res/cardsfolder/f/field_of_reality.txt +++ b/forge-gui/res/cardsfolder/f/field_of_reality.txt @@ -5,7 +5,7 @@ K:Enchant creature A:SP$ Attach | Cost$ 2 U | ValidTgts$ Creature | AILogic$ Pump S:Mode$ CantBlockBy | ValidAttacker$ Creature.EnchantedBy | ValidBlocker$ Creature.Spirit | Description$ Enchanted creature can't be blocked by Spirits. A:AB$ ChangeZone | Cost$ 1 U | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingAttachEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/field_of_reality.jpg Oracle:Enchant creature\nEnchanted creature can't be blocked by Spirits.\n{1}{U}: Return Field of Reality to its owner's hand. diff --git a/forge-gui/res/cardsfolder/f/field_of_ruin.txt b/forge-gui/res/cardsfolder/f/field_of_ruin.txt index c903fa24197..e5bd5e8c7fb 100644 --- a/forge-gui/res/cardsfolder/f/field_of_ruin.txt +++ b/forge-gui/res/cardsfolder/f/field_of_ruin.txt @@ -4,6 +4,6 @@ Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Destroy | Cost$ 2 T Sac<1/CARDNAME> | ValidTgts$ Land.nonBasic+OppCtrl | TgtPrompt$ Select target nonbasic land an opponent controls. | SubAbility$ DBSearch | AILogic$ GhostQuarter | SpellDescription$ Destroy target nonbasic land an opponent controls. Each player searches their library for a basic land card, puts it onto the battlefield, then shuffles their library. SVar:DBSearch:DB$ChangeZone | Origin$ Library | Destination$ Battlefield | DefinedPlayer$ Player | ChangeType$ Land.Basic | ChangeNum$ 1 | StackDescription$ Each player searches their library for a basic land card, puts it onto the battlefied, then shuffles their library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/field_of_ruin.jpg Oracle:{T}: Add {C}\n{2}, {T}, Sacrifice Field of Ruin: Destroy target nonbasic land an opponent controls. Each player searches their library for a basic land card, puts it onto the battlefield, then shuffles their library. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/f/fiend_of_the_shadows.txt b/forge-gui/res/cardsfolder/f/fiend_of_the_shadows.txt index 1ea23ea3531..8a3a9d208df 100644 --- a/forge-gui/res/cardsfolder/f/fiend_of_the_shadows.txt +++ b/forge-gui/res/cardsfolder/f/fiend_of_the_shadows.txt @@ -11,7 +11,7 @@ SVar:DBForget:DB$ Pump | Defined$ TriggeredCard | ForgetObjects$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True A:AB$ Regenerate | Cost$ Sac<1/Human> | SpellDescription$ Regenerate CARDNAME. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:AIPreference:SacCost$Creature.token,Creature.cmcLE1 SVar:DeckNeeds:Type$Human SVar:Picture:http://www.wizards.com/global/images/magic/general/fiend_of_the_shadows.jpg diff --git a/forge-gui/res/cardsfolder/f/fiery_bombardment.txt b/forge-gui/res/cardsfolder/f/fiery_bombardment.txt index b6260a2b7ac..d63ad67aa02 100644 --- a/forge-gui/res/cardsfolder/f/fiery_bombardment.txt +++ b/forge-gui/res/cardsfolder/f/fiery_bombardment.txt @@ -4,6 +4,6 @@ Types:Enchantment A:AB$ DealDamage | Cost$ 2 Sac<1/Creature> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X | PrecostDesc$ Chroma — | SpellDescription$ CARDNAME deals damage to any target equal to the number of red mana symbols in the sacrificed creature's mana cost. SVar:X:Sacrificed$ChromaSource.Red SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fiery_bombardment.jpg Oracle:Chroma — {2}, Sacrifice a creature: Fiery Bombardment deals damage to any target equal to the number of red mana symbols in the sacrificed creature's mana cost. diff --git a/forge-gui/res/cardsfolder/f/fiery_gambit.txt b/forge-gui/res/cardsfolder/f/fiery_gambit.txt index d74c0339a1e..c9e77447f25 100644 --- a/forge-gui/res/cardsfolder/f/fiery_gambit.txt +++ b/forge-gui/res/cardsfolder/f/fiery_gambit.txt @@ -19,6 +19,6 @@ SVar:DrawNine:DB$ Draw | Defined$ You | NumCards$ 9 | ConditionCheckSVar$ Wins | SVar:UntapLands:DB$ UntapAll | ValidCards$ Land.YouCtrl | ConditionCheckSVar$ Wins | ConditionSVarCompare$ GE3 SVar:Wins:Number$0 SVar:Loss:Number$0 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fiery_gambit.jpg Oracle:Flip a coin until you lose a flip or choose to stop flipping. If you lose a flip, Fiery Gambit has no effect. If you win one or more flips, Fiery Gambit deals 3 damage to target creature. If you win two or more flips, Fiery Gambit deals 6 damage to each opponent. If you win three or more flips, draw nine cards and untap all lands you control. diff --git a/forge-gui/res/cardsfolder/f/fiery_justice.txt b/forge-gui/res/cardsfolder/f/fiery_justice.txt index b8d696a96bb..069cb9dfcc6 100644 --- a/forge-gui/res/cardsfolder/f/fiery_justice.txt +++ b/forge-gui/res/cardsfolder/f/fiery_justice.txt @@ -3,6 +3,6 @@ ManaCost:R G W Types:Sorcery A:SP$ DealDamage | Cost$ R G W | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target to distribute damage to | NumDmg$ 5 | TargetMin$ 1 | TargetMax$ 5 | DividedAsYouChoose$ 5 | SubAbility$ Justice | SpellDescription$ CARDNAME deals 5 damage divided as you choose among any number of targets. Target opponent gains 5 life. SVar:Justice:DB$ GainLife | ValidTgts$ Opponent | TgtPrompt$ Select target opponent to gain life | LifeAmount$ 5 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fiery_justice.jpg Oracle:Fiery Justice deals 5 damage divided as you choose among any number of targets. Target opponent gains 5 life. diff --git a/forge-gui/res/cardsfolder/f/fighting_chance.txt b/forge-gui/res/cardsfolder/f/fighting_chance.txt index 8b8a9400d37..0995a9e0fa1 100644 --- a/forge-gui/res/cardsfolder/f/fighting_chance.txt +++ b/forge-gui/res/cardsfolder/f/fighting_chance.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ RepeatEach | Cost$ R | RepeatCards$ Creature.blocking | Zone$ Battlefield | RepeatSubAbility$ DBFlip | SpellDescription$ For each blocking creature, flip a coin. If you win the flip, prevent all combat damage that would be dealt by that creature this turn. SVar:DBFlip:DB$ FlipACoin | WinSubAbility$ DBPreventDmg SVar:DBPreventDmg:DB$ Pump | Defined$ Remembered | KW$ Prevent all combat damage that would be dealt by CARDNAME. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fighting_chance.jpg Oracle:For each blocking creature, flip a coin. If you win the flip, prevent all combat damage that would be dealt by that creature this turn. diff --git a/forge-gui/res/cardsfolder/f/final_fortune.txt b/forge-gui/res/cardsfolder/f/final_fortune.txt index 18d4c6a5ef2..0140307e795 100644 --- a/forge-gui/res/cardsfolder/f/final_fortune.txt +++ b/forge-gui/res/cardsfolder/f/final_fortune.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ AddTurn | Cost$ R R | NumTurns$ 1 | ExtraTurnDelayedTrigger$ DBDelTrig | ExtraTurnDelayedTriggerExcute$ TrigLose | References$ DBDelTrig,TrigLose | SpellDescription$ Take an extra turn after this one. At the beginning of that turn's end step, you lose the game. SVar:DBDelTrig:ThisTurn$ True | Mode$ Phase | Phase$ End of Turn | TriggerDescription$ At the beginning of that turn's end step, you lose the game. SVar:TrigLose:DB$ LosesGame | Defined$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/final_fortune.jpg Oracle:Take an extra turn after this one. At the beginning of that turn's end step, you lose the game. diff --git a/forge-gui/res/cardsfolder/f/final_revels.txt b/forge-gui/res/cardsfolder/f/final_revels.txt index 5e4787eabfe..2c7b2f59781 100644 --- a/forge-gui/res/cardsfolder/f/final_revels.txt +++ b/forge-gui/res/cardsfolder/f/final_revels.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ Charm | Cost$ 4 B | Choices$ DBPump,DBPump2 SVar:DBPump:DB$ PumpAll | ValidCards$ Creature | NumAtt$ +2 | SpellDescription$ All creatures get +2/+0 until end of turn. SVar:DBPump2:DB$ PumpAll | ValidCards$ Creature | NumDef$ -2 | SpellDescription$ All creatures get -0/-2 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/final_revels.jpg Oracle:Choose one —\n• All creatures get +2/+0 until end of turn.\n• All creatures get -0/-2 until end of turn. diff --git a/forge-gui/res/cardsfolder/f/final_strike.txt b/forge-gui/res/cardsfolder/f/final_strike.txt index c084e85decb..e28b2035c42 100644 --- a/forge-gui/res/cardsfolder/f/final_strike.txt +++ b/forge-gui/res/cardsfolder/f/final_strike.txt @@ -3,6 +3,6 @@ ManaCost:2 B B Types:Sorcery A:SP$ DealDamage | Cost$ 2 B B Sac<1/Creature> | ValidTgts$ Opponent,Planeswalker | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals damage to target opponent or planeswalker equal to the sacrificed creature's power. SVar:X:Sacrificed$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal/final_strike.jpg Oracle:As an additional cost to cast Final Strike, sacrifice a creature.\nFinal Strike deals damage to target opponent or planeswalker equal to the sacrificed creature's power. diff --git a/forge-gui/res/cardsfolder/f/fire_and_brimstone.txt b/forge-gui/res/cardsfolder/f/fire_and_brimstone.txt index 25746427614..172e4f4b663 100644 --- a/forge-gui/res/cardsfolder/f/fire_and_brimstone.txt +++ b/forge-gui/res/cardsfolder/f/fire_and_brimstone.txt @@ -3,6 +3,6 @@ ManaCost:3 W W Types:Instant A:SP$ DealDamage | Cost$ 3 W W | ValidTgts$ Player.DeclaredAttackerThisTurn | SubAbility$ DBDealDamage | TgtPrompt$ Select target player who declared an attacking creature this turn | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target player who attacked this turn and 4 damage to you. SVar:DBDealDamage:DB$DealDamage | Defined$ You | NumDmg$ 4 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fire_and_brimstone.jpg Oracle:Fire and Brimstone deals 4 damage to target player who attacked this turn and 4 damage to you. diff --git a/forge-gui/res/cardsfolder/f/fire_covenant.txt b/forge-gui/res/cardsfolder/f/fire_covenant.txt index f99f1f99071..0aacf8ebe39 100644 --- a/forge-gui/res/cardsfolder/f/fire_covenant.txt +++ b/forge-gui/res/cardsfolder/f/fire_covenant.txt @@ -5,6 +5,6 @@ A:SP$ DealDamage | Announce$ X | Cost$ 1 B R PayLife | ValidTgts$ Creature | SVar:MaxTgts:Count$Valid Creature SVar:X:Count$XChoice #X Will get overwritten by Announce -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fire_covenant.jpg Oracle:As an additional cost to cast Fire Covenant, pay X life.\nFire Covenant deals X damage divided as you choose among any number of target creatures. diff --git a/forge-gui/res/cardsfolder/f/fire_lit_thicket.txt b/forge-gui/res/cardsfolder/f/fire_lit_thicket.txt index 2c9ef0527fd..ecee177dbfb 100644 --- a/forge-gui/res/cardsfolder/f/fire_lit_thicket.txt +++ b/forge-gui/res/cardsfolder/f/fire_lit_thicket.txt @@ -5,6 +5,6 @@ A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ RG T | Produced$ R | Amount$ 2 | SpellDescription$ Add {R}{R}. A:AB$ Mana | Cost$ RG T | Produced$ R G | SpellDescription$ Add {R}{G}. A:AB$ Mana | Cost$ RG T | Produced$ G | Amount$ 2 | SpellDescription$ Add {G}{G}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fire_lit_thicket.jpg Oracle:{T}: Add {C}.\n{R/G}, {T}: Add {R}{R}, {R}{G}, or {G}{G}. diff --git a/forge-gui/res/cardsfolder/f/fire_sprites.txt b/forge-gui/res/cardsfolder/f/fire_sprites.txt index 4b14e814206..ff0cc0f3bc2 100644 --- a/forge-gui/res/cardsfolder/f/fire_sprites.txt +++ b/forge-gui/res/cardsfolder/f/fire_sprites.txt @@ -4,6 +4,6 @@ Types:Creature Faerie PT:1/1 K:Flying A:AB$ Mana | Cost$ G T | Produced$ R | SpellDescription$ Add {R}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fire_sprites.jpg Oracle:Flying\n{G}, {T}: Add {R}. diff --git a/forge-gui/res/cardsfolder/f/firecat_blitz.txt b/forge-gui/res/cardsfolder/f/firecat_blitz.txt index 5987bda18fe..234283a6772 100644 --- a/forge-gui/res/cardsfolder/f/firecat_blitz.txt +++ b/forge-gui/res/cardsfolder/f/firecat_blitz.txt @@ -8,6 +8,6 @@ SVar:X:Count$xPaid SVar:Y:XChoice #Flashback uses Y because SVars can't overlap #ChosenX SVar created by Cost payment -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/firecat_blitz.jpg Oracle:Create X 1/1 red Elemental Cat creature tokens with haste. Exile them at the beginning of the next end step.\nFlashback—{R}{R}, Sacrifice X Mountains. (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/f/firedrinker_satyr.txt b/forge-gui/res/cardsfolder/f/firedrinker_satyr.txt index 33307be20c6..4def9ec3e8b 100644 --- a/forge-gui/res/cardsfolder/f/firedrinker_satyr.txt +++ b/forge-gui/res/cardsfolder/f/firedrinker_satyr.txt @@ -7,6 +7,6 @@ SVar:TrigDamage:DB$ DealDamage | NumDmg$ X | Defined$ You | References$ X SVar:X:TriggerCount$DamageAmount A:AB$ Pump | Cost$ 1 R | NumAtt$ 1 | SubAbility$ DBDmg | SpellDescription$ CARDNAME gets +1/+0 until end of turn and deals 1 damage to you. SVar:DBDmg:DB$ DealDamage | NumDmg$ 1 | Defined$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/firedrinker_satyr.jpg Oracle:Whenever Firedrinker Satyr is dealt damage, it deals that much damage to you.\n{1}{R}: Firedrinker Satyr gets +1/+0 until end of turn and deals 1 damage to you. diff --git a/forge-gui/res/cardsfolder/f/firefright_mage.txt b/forge-gui/res/cardsfolder/f/firefright_mage.txt index f67b95120d5..07bc037b172 100644 --- a/forge-gui/res/cardsfolder/f/firefright_mage.txt +++ b/forge-gui/res/cardsfolder/f/firefright_mage.txt @@ -4,6 +4,6 @@ Types:Creature Goblin Spellshaper PT:1/1 A:AB$ Effect | Cost$ 1 R T Discard<1/Card> | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature | RememberObjects$ Targeted | Name$ Firefright Mage's Effect | StaticAbilities$ KWPump | SpellDescription$ Target creature can't be blocked this turn except by artifact creatures and/or red creatures. SVar:KWPump:Mode$ CantBlockBy | ValidAttacker$ Creature.IsRemembered | ValidBlocker$ Creature.nonArtifact+nonRed | EffectZone$ Command | Description$ Remembered creature can't be blocked this turn except by artifact creatures and/or red creatures. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/firefright_mage.jpg Oracle:{1}{R}, {T}, Discard a card: Target creature can't be blocked this turn except by artifact creatures and/or red creatures. diff --git a/forge-gui/res/cardsfolder/f/firehoof_cavalry.txt b/forge-gui/res/cardsfolder/f/firehoof_cavalry.txt index 803dc37104b..2c82a9d8c56 100644 --- a/forge-gui/res/cardsfolder/f/firehoof_cavalry.txt +++ b/forge-gui/res/cardsfolder/f/firehoof_cavalry.txt @@ -3,7 +3,7 @@ ManaCost:W Types:Creature Human Berserker PT:1/1 A:AB$ Pump | Cost$ 3 R | NumAtt$ +2 | KW$ Trample | SpellDescription$ CARDNAME gets +2/+0 and gains trample until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Red SVar:Picture:http://www.wizards.com/global/images/magic/general/firehoof_cavalry.jpg Oracle:{3}{R}: Firehoof Cavalry gets +2/+0 and gains trample until end of turn. diff --git a/forge-gui/res/cardsfolder/f/fireminds_research.txt b/forge-gui/res/cardsfolder/f/fireminds_research.txt index fc7c35836ce..2346b26b8db 100644 --- a/forge-gui/res/cardsfolder/f/fireminds_research.txt +++ b/forge-gui/res/cardsfolder/f/fireminds_research.txt @@ -7,6 +7,6 @@ SVar:BuffedBy:Instant,Sorcery DeckHints:Type$Instant | Sorcery A:AB$ Draw | Cost$ 1 U SubCounter<2/CHARGE> | NumCards$ 1 | SpellDescription$ Draw a card. A:AB$ DealDamage | Cost$ 1 R SubCounter<5/CHARGE> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 5 | SpellDescription$ CARDNAME deals 5 damage to any target. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Instant|Sorcery Oracle:Whenever you cast an instant or sorcery spell, put a charge counter on Firemind's Research.\n{1}{U}, Remove two charge counters from Firemind's Research: Draw a card.\n{1}{R}, Remove five charge counters from Firemind's Research: It deals 5 damage to any target. diff --git a/forge-gui/res/cardsfolder/f/firescreamer.txt b/forge-gui/res/cardsfolder/f/firescreamer.txt index a4811623fd2..f546f9bcafa 100644 --- a/forge-gui/res/cardsfolder/f/firescreamer.txt +++ b/forge-gui/res/cardsfolder/f/firescreamer.txt @@ -3,7 +3,7 @@ ManaCost:3 B Types:Creature Kavu PT:2/2 A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Red SVar:Picture:http://www.wizards.com/global/images/magic/general/firescreamer.jpg Oracle:{R}: Firescreamer gets +1/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/f/firespout.txt b/forge-gui/res/cardsfolder/f/firespout.txt index fed8231150b..618bb26236d 100644 --- a/forge-gui/res/cardsfolder/f/firespout.txt +++ b/forge-gui/res/cardsfolder/f/firespout.txt @@ -3,6 +3,6 @@ ManaCost:2 RG Types:Sorcery A:SP$ DamageAll | Cost$ 2 RG | ValidCards$ Creature.withoutFlying | NumDmg$ 3 | ConditionManaSpent$ R | SubAbility$ GPaid | SpellDescription$ CARDNAME deals 3 damage to each creature without flying if {R} was spent to cast CARDNAME and 3 damage to each creature with flying if {G} was spent to cast it. (Do both if {R}{G} was spent.) SVar:GPaid:DB$ DamageAll | ValidCards$ Creature.withFlying | NumDmg$ 3 | ConditionManaSpent$ G -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/firespout.jpg Oracle:Firespout deals 3 damage to each creature without flying if {R} was spent to cast Firespout and 3 damage to each creature with flying if {G} was spent to cast it. (Do both if {R}{G} was spent.) diff --git a/forge-gui/res/cardsfolder/f/firestorm.txt b/forge-gui/res/cardsfolder/f/firestorm.txt index 848c0f667ef..7e183d70eb3 100644 --- a/forge-gui/res/cardsfolder/f/firestorm.txt +++ b/forge-gui/res/cardsfolder/f/firestorm.txt @@ -6,6 +6,6 @@ SVar:X:TargetedObjects$Amount SVar:MaxTargets:SVar$MaxPlayers/Plus.MaxCreaturesAndPlaneswalkers SVar:MaxPlayers:PlayerCountPlayers$Amount SVar:MaxCreaturesAndPlaneswalkers:Count$Valid Creature,Planeswalker -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/firestorm.jpg Oracle:As an additional cost to cast Firestorm, discard X cards.\nFirestorm deals X damage to each of X targets. diff --git a/forge-gui/res/cardsfolder/f/fist_of_suns.txt b/forge-gui/res/cardsfolder/f/fist_of_suns.txt index 84df42b0bc6..34a9c14022c 100644 --- a/forge-gui/res/cardsfolder/f/fist_of_suns.txt +++ b/forge-gui/res/cardsfolder/f/fist_of_suns.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact S:Mode$ Continuous | Affected$ Card.YouCtrl | AddKeyword$ Alternative Cost:W U B R G | AffectedZone$ Hand,Graveyard,Exile,Library,Command | Description$ You may pay {W}{U}{B}{R}{G} rather than pay the mana cost for spells that you cast. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/fist_of_suns.jpg Oracle:You may pay {W}{U}{B}{R}{G} rather than pay the mana cost for spells that you cast. diff --git a/forge-gui/res/cardsfolder/f/flailing_manticore.txt b/forge-gui/res/cardsfolder/f/flailing_manticore.txt index 91437629967..2d2d8335371 100644 --- a/forge-gui/res/cardsfolder/f/flailing_manticore.txt +++ b/forge-gui/res/cardsfolder/f/flailing_manticore.txt @@ -6,6 +6,6 @@ K:Flying K:First Strike A:AB$ Pump | Cost$ 1 | NumAtt$ +1 | NumDef$ +1 | AnyPlayer$ True | SpellDescription$ CARDNAME gets +1/+1 until end of turn. Any player may activate this ability. A:AB$ Pump | Cost$ 1 | NumAtt$ -1 | NumDef$ -1 | AnyPlayer$ True | IsCurse$ True | SpellDescription$ CARDNAME gets -1/-1 until end of turn. Any player may activate this ability. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/flailing_manticore.jpg Oracle:Flying, first strike\n{1}: Flailing Manticore gets +1/+1 until end of turn. Any player may activate this ability.\n{1}: Flailing Manticore gets -1/-1 until end of turn. Any player may activate this ability. diff --git a/forge-gui/res/cardsfolder/f/flailing_ogre.txt b/forge-gui/res/cardsfolder/f/flailing_ogre.txt index 0dcf450eb33..65dd77a5ad7 100644 --- a/forge-gui/res/cardsfolder/f/flailing_ogre.txt +++ b/forge-gui/res/cardsfolder/f/flailing_ogre.txt @@ -4,6 +4,6 @@ Types:Creature Ogre PT:3/3 A:AB$ Pump | Cost$ 1 | NumAtt$ +1 | NumDef$ +1 | AnyPlayer$ True | SpellDescription$ CARDNAME gets +1/+1 until end of turn. Any player may activate this ability. A:AB$ Pump | Cost$ 1 | NumAtt$ -1 | NumDef$ -1 | AnyPlayer$ True | IsCurse$ True | SpellDescription$ CARDNAME gets -1/-1 until end of turn. Any player may activate this ability. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/flailing_ogre.jpg Oracle:{1}: Flailing Ogre gets +1/+1 until end of turn. Any player may activate this ability.\n{1}: Flailing Ogre gets -1/-1 until end of turn. Any player may activate this ability. diff --git a/forge-gui/res/cardsfolder/f/flailing_soldier.txt b/forge-gui/res/cardsfolder/f/flailing_soldier.txt index 45030af7ec8..2a225fed5ab 100644 --- a/forge-gui/res/cardsfolder/f/flailing_soldier.txt +++ b/forge-gui/res/cardsfolder/f/flailing_soldier.txt @@ -4,6 +4,6 @@ Types:Creature Human Soldier PT:2/2 A:AB$ Pump | Cost$ 1 | NumAtt$ +1 | NumDef$ +1 | AnyPlayer$ True | SpellDescription$ CARDNAME gets +1/+1 until end of turn. Any player may activate this ability. A:AB$ Pump | Cost$ 1 | NumAtt$ -1 | NumDef$ -1 | AnyPlayer$ True | IsCurse$ True | SpellDescription$ CARDNAME gets -1/-1 until end of turn. Any player may activate this ability. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/flailing_soldier.jpg Oracle:{1}: Flailing Soldier gets +1/+1 until end of turn. Any player may activate this ability.\n{1}: Flailing Soldier gets -1/-1 until end of turn. Any player may activate this ability. diff --git a/forge-gui/res/cardsfolder/f/flame_fusillade.txt b/forge-gui/res/cardsfolder/f/flame_fusillade.txt index 975c078db2a..651cfbbcd10 100644 --- a/forge-gui/res/cardsfolder/f/flame_fusillade.txt +++ b/forge-gui/res/cardsfolder/f/flame_fusillade.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ Effect | Cost$ 3 R | Name$ Flame Fusillade Effect | StaticAbilities$ STDamage | SVars$ ABDamage | SpellDescription$ Until end of turn, permanents you control gain "{T}: This permanent deals 1 damage to any target." SVar:STDamage:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Permanent.YouCtrl | AddAbility$ ABDamage | Description$ Until end of turn, permanents you control gain "{T}: This permanent deals 1 damage to any target." SVar:ABDamage:AB$ DealDamage | Cost$ T | NumDmg$ 1 | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | SpellDescription$ CARDNAME deals 1 damage to any target -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/flame_fusillade.jpg Oracle:Until end of turn, permanents you control gain "{T}: This permanent deals 1 damage to any target." diff --git a/forge-gui/res/cardsfolder/f/flame_kin_war_scout.txt b/forge-gui/res/cardsfolder/f/flame_kin_war_scout.txt index fc0033f3967..cc48c710f0a 100644 --- a/forge-gui/res/cardsfolder/f/flame_kin_war_scout.txt +++ b/forge-gui/res/cardsfolder/f/flame_kin_war_scout.txt @@ -6,6 +6,6 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creatu SVar:TrigSac:DB$Sacrifice | Defined$ Self | SubAbility$ DBDamage | RememberSacrificed$ True SVar:DBDamage:DB$DealDamage | Defined$ TriggeredCardLKICopy | NumDmg$ 4 | ConditionDefined$ Remembered | ConditionPresent$ Card.Self | SubAbility$ DBCleanup SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/flame_kin_war_scout.jpg Oracle:When another creature enters the battlefield, sacrifice Flame-Kin War Scout. If you do, Flame-Kin War Scout deals 4 damage to that creature. diff --git a/forge-gui/res/cardsfolder/f/flamekin_harbinger.txt b/forge-gui/res/cardsfolder/f/flamekin_harbinger.txt index 1043477c581..d91099dda24 100644 --- a/forge-gui/res/cardsfolder/f/flamekin_harbinger.txt +++ b/forge-gui/res/cardsfolder/f/flamekin_harbinger.txt @@ -4,6 +4,6 @@ Types:Creature Elemental Shaman PT:1/1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for a Elemental card, reveal it, then shuffle your library and put that card on top of it. SVar:TrigChange:DB$ ChangeZone | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Card.Elemental | ChangeNum$ 1 | ShuffleNonMandatory$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/flamekin_harbinger.jpg Oracle:When Flamekin Harbinger enters the battlefield, you may search your library for an Elemental card, reveal it, then shuffle your library and put that card on top of it. diff --git a/forge-gui/res/cardsfolder/f/flameshot.txt b/forge-gui/res/cardsfolder/f/flameshot.txt index ee0ad780e9d..233d3ea7849 100644 --- a/forge-gui/res/cardsfolder/f/flameshot.txt +++ b/forge-gui/res/cardsfolder/f/flameshot.txt @@ -3,6 +3,6 @@ ManaCost:3 R Types:Sorcery A:SP$ DealDamage | Cost$ 3 R | ValidTgts$ Creature | TgtPrompt$ Select target creature to distribute damage to | NumDmg$ 3 | TargetMin$ 1 | TargetMax$ 3 | DividedAsYouChoose$ 3 | SpellDescription$ CARDNAME deals 3 damage divided as you choose among any number of target creatures. SVar:AltCost:Cost$ Discard<1/Mountain> -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/flameshot.jpg Oracle:You may discard a Mountain card rather than pay Flameshot's mana cost.\nFlameshot deals 3 damage divided as you choose among one, two, or three target creatures. diff --git a/forge-gui/res/cardsfolder/f/flaring_pain.txt b/forge-gui/res/cardsfolder/f/flaring_pain.txt index f1ef059f6c4..3adddc6bdc2 100644 --- a/forge-gui/res/cardsfolder/f/flaring_pain.txt +++ b/forge-gui/res/cardsfolder/f/flaring_pain.txt @@ -4,7 +4,7 @@ Types:Instant K:Flashback:R A:SP$ Effect | Cost$ 1 R | Name$ Flaring Pain Effect | StaticAbilities$ STCantPrevent | SpellDescription$ Damage can't be prevented this turn. SVar:STCantPrevent:Mode$ Continuous | EffectZone$ Command | GlobalRule$ Damage can't be prevented. | Description$ Damage can't be prevented. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/flaring_pain.jpg Oracle:Damage can't be prevented this turn.\nFlashback {R} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/f/flash.txt b/forge-gui/res/cardsfolder/f/flash.txt index 5a887ae160c..70df31d4ff3 100644 --- a/forge-gui/res/cardsfolder/f/flash.txt +++ b/forge-gui/res/cardsfolder/f/flash.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ ChangeZone | Cost$ 1 U | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature | ChangeNum$ 1 | SubAbility$ DBSac | RememberChanged$ True | SpellDescription$ You may put a creature card from your hand onto the battlefield. If you do, sacrifice it unless you pay its mana cost reduced by up to {2}. SVar:DBSac:DB$ SacrificeAll | Defined$ Remembered | UnlessCost$ RememberedCostMinus2 | UnlessPayer$ You | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/flash.jpg Oracle:You may put a creature card from your hand onto the battlefield. If you do, sacrifice it unless you pay its mana cost reduced by up to {2}. diff --git a/forge-gui/res/cardsfolder/f/flash_conscription.txt b/forge-gui/res/cardsfolder/f/flash_conscription.txt index 647660980ba..de0adf4aa62 100644 --- a/forge-gui/res/cardsfolder/f/flash_conscription.txt +++ b/forge-gui/res/cardsfolder/f/flash_conscription.txt @@ -7,6 +7,6 @@ SVar:TrigDamage:Mode$ DamageDealtOnce | CombatDamage$ True | ValidSource$ Card.S SVar:GainLife:DB$ GainLife | LifeAmount$ X | References$ X SVar:X:TriggerCount$DamageAmount DeckHints:Color$White -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/flash_conscription.jpg Oracle:Untap target creature and gain control of it until end of turn. That creature gains haste until end of turn. If {W} was spent to cast Flash Conscription, the creature gains "Whenever this creature deals combat damage, you gain that much life" until end of turn. diff --git a/forge-gui/res/cardsfolder/f/flash_flood.txt b/forge-gui/res/cardsfolder/f/flash_flood.txt index d7bb054ac5d..9f0e1578334 100644 --- a/forge-gui/res/cardsfolder/f/flash_flood.txt +++ b/forge-gui/res/cardsfolder/f/flash_flood.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Charm | Cost$ U | Choices$ DBDestroy,DBChangeZone SVar:DBDestroy:DB$ Destroy | ValidTgts$ Permanent.Red | TgtPrompt$ Select target red permanent | SpellDescription$ Destroy target red permanent. SVar:DBChangeZone:DB$ ChangeZone | ValidTgts$ Mountain | TgtPrompt$ Select target Mountain | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target Mountain to its owner's hand. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/flash_flood.jpg Oracle:Choose one —\n• Destroy target red permanent.\n• Return target Mountain to its owner's hand. diff --git a/forge-gui/res/cardsfolder/f/flash_of_defiance.txt b/forge-gui/res/cardsfolder/f/flash_of_defiance.txt index 122621b7768..0e907be7be1 100644 --- a/forge-gui/res/cardsfolder/f/flash_of_defiance.txt +++ b/forge-gui/res/cardsfolder/f/flash_of_defiance.txt @@ -4,7 +4,7 @@ Types:Sorcery K:Flashback:1 R PayLife<3> A:SP$ Effect | Cost$ 1 R | Name$ Flash of Defiance Effect | StaticAbilities$ KWPump | AILogic$ Evasion | SpellDescription$ Green creatures and white creatures can't block this turn. SVar:KWPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.Green,Creature.White | AddHiddenKeyword$ CARDNAME can't block. | Description$ Green creatures and white creatures can't block this turn. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/flash_of_defiance.jpg Oracle:Green creatures and white creatures can't block this turn.\nFlashback—{1}{R}, Pay 3 life. (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/f/flash_of_insight.txt b/forge-gui/res/cardsfolder/f/flash_of_insight.txt index 6a6958b9c3c..e3a5d7c37a9 100644 --- a/forge-gui/res/cardsfolder/f/flash_of_insight.txt +++ b/forge-gui/res/cardsfolder/f/flash_of_insight.txt @@ -5,6 +5,6 @@ A:SP$ Dig | Cost$ X 1 U | DigNum$ X | ChangeNum$ 1 | DestinationZone$ Hand | Des A:SP$ Dig | Cost$ 1 U ExileFromGrave | Flashback$ True | CostDesc$Flashback—{1}{U}, Exile X blue cards from your graveyard. | DigNum$ ChosenX | ChangeNum$ 1 | DestinationZone$ Hand | DestinationZone2$ Library | LibraryPosition$ -1 | References$ Y | SpellDescription$ (You may cast this card from your graveyard for its flashback cost, then exile it. You can't exile CARDNAME to pay for its own flashback cost.) SVar:Y:XChoice SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/flash_of_insight.jpg Oracle:Look at the top X cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order.\nFlashback—{1}{U}, Exile X blue cards from your graveyard. (You may cast this card from your graveyard for its flashback cost, then exile it. You can't exile Flash of Insight to pay for its own flashback cost.) \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/f/flashfires.txt b/forge-gui/res/cardsfolder/f/flashfires.txt index 9661ac40d9a..f53c9d05dce 100644 --- a/forge-gui/res/cardsfolder/f/flashfires.txt +++ b/forge-gui/res/cardsfolder/f/flashfires.txt @@ -2,6 +2,6 @@ Name:Flashfires ManaCost:3 R Types:Sorcery A:SP$ DestroyAll | Cost$ 3 R | ValidCards$ Plains | SpellDescription$ Destroy all Plains. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/flashfires.jpg Oracle:Destroy all Plains. diff --git a/forge-gui/res/cardsfolder/f/flesh_reaver.txt b/forge-gui/res/cardsfolder/f/flesh_reaver.txt index 3714937fe62..a05be169362 100644 --- a/forge-gui/res/cardsfolder/f/flesh_reaver.txt +++ b/forge-gui/res/cardsfolder/f/flesh_reaver.txt @@ -5,6 +5,6 @@ PT:4/4 T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature,Opponent | Execute$ TrigFleshReaverDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage to a creature or opponent, CARDNAME deals that much damage to you. SVar:TrigFleshReaverDamage:DB$ DealDamage | NumDmg$ FleshReaverX | Defined$ You | References$ FleshReaverX SVar:FleshReaverX:TriggerCount$DamageAmount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/flesh_reaver.jpg Oracle:Whenever Flesh Reaver deals damage to a creature or opponent, Flesh Reaver deals that much damage to you. diff --git a/forge-gui/res/cardsfolder/f/fleshgrafter.txt b/forge-gui/res/cardsfolder/f/fleshgrafter.txt index 16c7349fa80..7e919bbcd6e 100644 --- a/forge-gui/res/cardsfolder/f/fleshgrafter.txt +++ b/forge-gui/res/cardsfolder/f/fleshgrafter.txt @@ -3,7 +3,7 @@ ManaCost:2 B Types:Creature Human Warrior PT:2/2 A:AB$ Pump | Cost$ Discard<1/Artifact> | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ CARDNAME gets +2/+2 until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:AIPreference:DiscardCost$Artifact DeckHints:Type$Artifact SVar:Picture:http://www.wizards.com/global/images/magic/general/fleshgrafter.jpg diff --git a/forge-gui/res/cardsfolder/f/flicker.txt b/forge-gui/res/cardsfolder/f/flicker.txt index 839c607e3a0..d20e8c63c9d 100644 --- a/forge-gui/res/cardsfolder/f/flicker.txt +++ b/forge-gui/res/cardsfolder/f/flicker.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ ChangeZone | Cost$ 1 W | ValidTgts$ Permanent.nonToken | Origin$ Battlefield | Destination$ Exile | TgtPrompt$ Select target nontoken permanent | RememberTargets$ True | SubAbility$ DBReturn | SpellDescription$ Exile target nontoken permanent, then return it to the battlefield under its owner's control. SVar:DBReturn:DB$ChangeZone | Defined$ Remembered | Origin$ All | Destination$ Battlefield | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/flicker.jpg Oracle:Exile target nontoken permanent, then return it to the battlefield under its owner's control. diff --git a/forge-gui/res/cardsfolder/f/flickerform.txt b/forge-gui/res/cardsfolder/f/flickerform.txt index a58bff5c0dd..c427b820a30 100644 --- a/forge-gui/res/cardsfolder/f/flickerform.txt +++ b/forge-gui/res/cardsfolder/f/flickerform.txt @@ -14,7 +14,7 @@ SVar:FlickerformAttach:DB$ RepeatEach | UseImprinted$ True | RepeatCards$ Aura.I SVar:DBAllAuraAttach:DB$ ChangeZone | Defined$ Imprinted | Origin$ Exile | Destination$ Battlefield | AttachedTo$ Valid Creature.IsRemembered SVar:FlickerformCleanup:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingAttachEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/flickerform.jpg Oracle:Enchant creature\n{2}{W}{W}: Exile enchanted creature and all Auras attached to it. At the beginning of the next end step, return that card to the battlefield under its owner's control. If you do, return the other cards exiled this way to the battlefield under their owners' control attached to that creature. diff --git a/forge-gui/res/cardsfolder/f/flickering_ward.txt b/forge-gui/res/cardsfolder/f/flickering_ward.txt index f2a01a3fd2e..18b31270e08 100644 --- a/forge-gui/res/cardsfolder/f/flickering_ward.txt +++ b/forge-gui/res/cardsfolder/f/flickering_ward.txt @@ -7,7 +7,7 @@ SVar:ChooseColor:DB$ ChooseColor | Defined$ You | SpellDescription$ As CARDNAME A:SP$ Attach | Cost$ W | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Protection:Card.ChosenColor:Protection from ChosenColor:Card.CardUID_HostCardUID | Description$ Enchanted creature has protection from the chosen color. This effect doesn't remove CARDNAME. A:AB$ ChangeZone | Cost$ W | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:ChosenProtection:True SVar:Picture:http://www.wizards.com/global/images/magic/general/flickering_ward.jpg Oracle:Enchant creature\nAs Flickering Ward enters the battlefield, choose a color.\nEnchanted creature has protection from the chosen color. This effect doesn't remove Flickering Ward.\n{W}: Return Flickering Ward to its owner's hand. diff --git a/forge-gui/res/cardsfolder/f/flight_spellbomb.txt b/forge-gui/res/cardsfolder/f/flight_spellbomb.txt index 729d3527a98..6fa2e0103fe 100644 --- a/forge-gui/res/cardsfolder/f/flight_spellbomb.txt +++ b/forge-gui/res/cardsfolder/f/flight_spellbomb.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ Pump | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying | SpellDescription$ Target creature gains flying until end of turn. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | OptionalDecider$ TriggeredCardController | Execute$ TrigDraw | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you may pay {U}. If you do, draw a card. SVar:TrigDraw:AB$Draw | Cost$ U | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/flight_spellbomb.jpg Oracle:{T}, Sacrifice Flight Spellbomb: Target creature gains flying until end of turn.\nWhen Flight Spellbomb is put into a graveyard from the battlefield, you may pay {U}. If you do, draw a card. diff --git a/forge-gui/res/cardsfolder/f/fling.txt b/forge-gui/res/cardsfolder/f/fling.txt index 29981714e98..42863c42a81 100644 --- a/forge-gui/res/cardsfolder/f/fling.txt +++ b/forge-gui/res/cardsfolder/f/fling.txt @@ -3,6 +3,6 @@ ManaCost:1 R Types:Instant A:SP$ DealDamage | Cost$ 1 R Sac<1/Creature> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals damage equal to the sacrificed creature's power to any target. SVar:X:Sacrificed$CardPower -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/fling.jpg Oracle:As an additional cost to cast Fling, sacrifice a creature.\nFling deals damage equal to the sacrificed creature's power to any target. diff --git a/forge-gui/res/cardsfolder/f/floating_shield.txt b/forge-gui/res/cardsfolder/f/floating_shield.txt index a4dc1de9f3c..4c62284e025 100644 --- a/forge-gui/res/cardsfolder/f/floating_shield.txt +++ b/forge-gui/res/cardsfolder/f/floating_shield.txt @@ -7,7 +7,7 @@ SVar:ChooseColor:DB$ ChooseColor | Defined$ You | SpellDescription$ As CARDNAME A:SP$ Attach | Cost$ 2 W | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Protection:Card.ChosenColor:Protection from ChosenColor:Card.CardUID_HostCardUID | Description$ Enchanted creature has protection from the chosen color. This effect doesn't remove CARDNAME. A:AB$ Protection | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | Gains$ ChosenColor | SpellDescription$ Target creature gains protection from the chosen color until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:ChosenProtection:True SVar:Picture:http://www.wizards.com/global/images/magic/general/floating_shield.jpg Oracle:Enchant creature\nAs Floating Shield enters the battlefield, choose a color.\nEnchanted creature has protection from the chosen color. This effect doesn't remove Floating Shield.\nSacrifice Floating Shield: Target creature gains protection from the chosen color until end of turn. diff --git a/forge-gui/res/cardsfolder/f/floodbringer.txt b/forge-gui/res/cardsfolder/f/floodbringer.txt index 026b4116d0d..b763205766f 100644 --- a/forge-gui/res/cardsfolder/f/floodbringer.txt +++ b/forge-gui/res/cardsfolder/f/floodbringer.txt @@ -4,6 +4,6 @@ Types:Creature Moonfolk Wizard PT:1/2 K:Flying A:AB$ Tap | Cost$ 2 Return<1/Land> | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Tap target land. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/floodbringer.jpg Oracle:Flying\n{2}, Return a land you control to its owner's hand: Tap target land. diff --git a/forge-gui/res/cardsfolder/f/floodchaser.txt b/forge-gui/res/cardsfolder/f/floodchaser.txt index 6cc1acb2d79..c6f4361c863 100644 --- a/forge-gui/res/cardsfolder/f/floodchaser.txt +++ b/forge-gui/res/cardsfolder/f/floodchaser.txt @@ -5,6 +5,6 @@ PT:0/0 K:etbCounter:P1P1:6 S:Mode$ CantAttack | ValidCard$ Card.Self | UnlessDefenderControls$ Island | Description$ CARDNAME can't attack unless defending player controls an Island. A:AB$ Animate | Cost$ U SubCounter<1/P1P1> | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Island | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | SpellDescription$ Target land becomes an Island until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/floodchaser.jpg Oracle:Floodchaser enters the battlefield with six +1/+1 counters on it.\nFloodchaser can't attack unless defending player controls an Island.\n{U}, Remove a +1/+1 counter from Floodchaser: Target land becomes an Island until end of turn. diff --git a/forge-gui/res/cardsfolder/f/flooded_grove.txt b/forge-gui/res/cardsfolder/f/flooded_grove.txt index 7c7f99596af..25f5e6b014f 100644 --- a/forge-gui/res/cardsfolder/f/flooded_grove.txt +++ b/forge-gui/res/cardsfolder/f/flooded_grove.txt @@ -5,6 +5,6 @@ A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ GU T | Produced$ U | Amount$ 2 | SpellDescription$ Add {U}{U}. A:AB$ Mana | Cost$ GU T | Produced$ G U | SpellDescription$ Add {G}{U}. A:AB$ Mana | Cost$ GU T | Produced$ G | Amount$ 2 | SpellDescription$ Add {G}{G}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/flooded_grove.jpg Oracle:{T}: Add {C}.\n{G/U}, {T}: Add {G}{G}, {G}{U}, or {U}{U}. diff --git a/forge-gui/res/cardsfolder/f/flooded_shoreline.txt b/forge-gui/res/cardsfolder/f/flooded_shoreline.txt index e61be320f8b..dd9918ab564 100644 --- a/forge-gui/res/cardsfolder/f/flooded_shoreline.txt +++ b/forge-gui/res/cardsfolder/f/flooded_shoreline.txt @@ -3,6 +3,6 @@ ManaCost:U U Types:Enchantment A:AB$ ChangeZone | Cost$ U U Return<2/Island> | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/flooded_shoreline.jpg Oracle:{U}{U}, Return two Islands you control to their owner's hand: Return target creature to its owner's hand. diff --git a/forge-gui/res/cardsfolder/f/flooded_woodlands.txt b/forge-gui/res/cardsfolder/f/flooded_woodlands.txt index 448bed12381..b0d08b603e7 100644 --- a/forge-gui/res/cardsfolder/f/flooded_woodlands.txt +++ b/forge-gui/res/cardsfolder/f/flooded_woodlands.txt @@ -2,6 +2,6 @@ Name:Flooded Woodlands ManaCost:2 U B Types:Enchantment S:Mode$ CantAttackUnless | ValidCard$ Creature.Green | Target$ Player,Planeswalker | Cost$ Sac<1/Land> | Description$ Green creatures can't attack unless their controller sacrifices a land for each green creature they control that's attacking. (This cost is paid as attackers are declared.) -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/flooded_woodlands.jpg Oracle:Green creatures can't attack unless their controller sacrifices a land for each green creature they control that's attacking. (This cost is paid as attackers are declared.) diff --git a/forge-gui/res/cardsfolder/f/floodtide_serpent.txt b/forge-gui/res/cardsfolder/f/floodtide_serpent.txt index e9b26dddb55..8e1c168eb13 100644 --- a/forge-gui/res/cardsfolder/f/floodtide_serpent.txt +++ b/forge-gui/res/cardsfolder/f/floodtide_serpent.txt @@ -5,7 +5,7 @@ PT:4/4 S:Mode$ CantAttackUnless | ValidCard$ Creature.Self | Target$ Player,Planeswalker | Cost$ Return<1/Enchantment> | Description$ CARDNAME can't attack unless you return an enchantment you control to its owner's hand. SVar:NeedsToPlayVar:Y GE1 SVar:Y:Count$Valid Enchantment.YouCtrl -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/floodtide_serpent.jpg Oracle:Floodtide Serpent can't attack unless you return an enchantment you control to its owner's hand. (This cost is paid as attackers are declared.) diff --git a/forge-gui/res/cardsfolder/f/floodwater_dam.txt b/forge-gui/res/cardsfolder/f/floodwater_dam.txt index 9cb55a48286..9aae5cc89fe 100644 --- a/forge-gui/res/cardsfolder/f/floodwater_dam.txt +++ b/forge-gui/res/cardsfolder/f/floodwater_dam.txt @@ -5,6 +5,6 @@ A:AB$ Tap | Cost$ X X 1 T | TargetMin$ 0 | TargetMax$ MaxTgts | ValidTgts$ Land # It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) SVar:X:Targeted$Amount SVar:MaxTgts:Count$Valid Land -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/floodwater_dam.jpg Oracle:{X}{X}{1}, {T}: Tap X target lands. diff --git a/forge-gui/res/cardsfolder/f/flourishing_defenses.txt b/forge-gui/res/cardsfolder/f/flourishing_defenses.txt index 714331f5d98..74de62fd2a0 100644 --- a/forge-gui/res/cardsfolder/f/flourishing_defenses.txt +++ b/forge-gui/res/cardsfolder/f/flourishing_defenses.txt @@ -3,6 +3,6 @@ ManaCost:4 G Types:Enchantment T:Mode$ CounterAdded | ValidCard$ Creature | TriggerZones$ Battlefield | CounterType$ M1M1 | Execute$ TrigToken | OptionalDecider$ You | TriggerDescription$ Whenever a -1/-1 counter is put on a creature, create a 1/1 green Elf Warrior creature token. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenName$ Elf Warrior | TokenTypes$ Creature,Elf,Warrior | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | TokenImage$ g 1 1 elf warrior SHM -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/flourishing_defenses.jpg Oracle:Whenever a -1/-1 counter is put on a creature, you may create a 1/1 green Elf Warrior creature token. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/f/flow_of_ideas.txt b/forge-gui/res/cardsfolder/f/flow_of_ideas.txt index 27628610b7d..df3a7525ea9 100644 --- a/forge-gui/res/cardsfolder/f/flow_of_ideas.txt +++ b/forge-gui/res/cardsfolder/f/flow_of_ideas.txt @@ -3,6 +3,6 @@ ManaCost:5 U Types:Sorcery A:SP$ Draw | Cost$ 5 U | NumCards$ X | References$ X | SpellDescription$ Draw a card for each Island you control. SVar:X:Count$TypeYouCtrl.Island -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/flow_of_ideas.jpg Oracle:Draw a card for each Island you control. diff --git a/forge-gui/res/cardsfolder/f/flowering_lumberknot.txt b/forge-gui/res/cardsfolder/f/flowering_lumberknot.txt index 42a61e9718a..3aa15d66ed6 100644 --- a/forge-gui/res/cardsfolder/f/flowering_lumberknot.txt +++ b/forge-gui/res/cardsfolder/f/flowering_lumberknot.txt @@ -3,6 +3,6 @@ ManaCost:3 G Types:Creature Treefolk PT:5/5 S:Mode$ Continuous | Affected$ Creature.Self+NotPaired | AddHiddenKeyword$ CARDNAME can't attack or block. | Description$ CARDNAME can't attack or block unless it's paired with a creature with soulbond. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/flowering_lumberknot.jpg Oracle:Flowering Lumberknot can't attack or block unless it's paired with a creature with soulbond. diff --git a/forge-gui/res/cardsfolder/f/flowstone_slide.txt b/forge-gui/res/cardsfolder/f/flowstone_slide.txt index cad9369c19d..4818cc2c472 100644 --- a/forge-gui/res/cardsfolder/f/flowstone_slide.txt +++ b/forge-gui/res/cardsfolder/f/flowstone_slide.txt @@ -3,6 +3,6 @@ ManaCost:X 2 R R Types:Sorcery A:SP$ PumpAll | Cost$ X 2 R R | ValidCards$ Creature | IsCurse$ True | NumAtt$ +X | NumDef$ -X | References$ X | SpellDescription$ All Creatures get +X/-X until end of turn. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/flowstone_slide.jpg Oracle:All creatures get +X/-X until end of turn. diff --git a/forge-gui/res/cardsfolder/f/flowstone_surge.txt b/forge-gui/res/cardsfolder/f/flowstone_surge.txt index c085e92d08f..f117aa8c7c4 100644 --- a/forge-gui/res/cardsfolder/f/flowstone_surge.txt +++ b/forge-gui/res/cardsfolder/f/flowstone_surge.txt @@ -2,7 +2,7 @@ Name:Flowstone Surge ManaCost:1 R Types:Enchantment S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddPower$ 1 | AddToughness$ -1 | Description$ Creatures you control get +1/-1. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/flowstone_surge.jpg Oracle:Creatures you control get +1/-1. diff --git a/forge-gui/res/cardsfolder/f/fluctuator.txt b/forge-gui/res/cardsfolder/f/fluctuator.txt index 2cb4abb73b5..54caaa75a12 100644 --- a/forge-gui/res/cardsfolder/f/fluctuator.txt +++ b/forge-gui/res/cardsfolder/f/fluctuator.txt @@ -2,6 +2,6 @@ Name:Fluctuator ManaCost:2 Types:Artifact S:Mode$ ReduceCost | ValidCard$ Card | ValidSpell$ Activated.Cycling | Activator$ You | Amount$ 2 | Description$ Cycling abilities you activate cost you up to {2} less to activate. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/fluctuator.jpg Oracle:Cycling abilities you activate cost up to {2} less to activate. diff --git a/forge-gui/res/cardsfolder/f/flurry_of_wings.txt b/forge-gui/res/cardsfolder/f/flurry_of_wings.txt index 5d9ab8f3402..08496f46a80 100644 --- a/forge-gui/res/cardsfolder/f/flurry_of_wings.txt +++ b/forge-gui/res/cardsfolder/f/flurry_of_wings.txt @@ -3,6 +3,6 @@ ManaCost:G W U Types:Instant A:SP$ Token | Cost$ G W U | TokenAmount$ X | TokenName$ Bird Soldier | TokenTypes$ Creature,Bird,Soldier | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | References$ X | SpellDescription$ Create X 1/1 white Bird Soldier creature tokens with flying, where X is the number of attacking creatures. SVar:X:Count$Valid Creature.attacking -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/flurry_of_wings.jpg Oracle:Create X 1/1 white Bird Soldier creature tokens with flying, where X is the number of attacking creatures. diff --git a/forge-gui/res/cardsfolder/f/flux.txt b/forge-gui/res/cardsfolder/f/flux.txt index 7940b1885ef..ea1e30d16bc 100644 --- a/forge-gui/res/cardsfolder/f/flux.txt +++ b/forge-gui/res/cardsfolder/f/flux.txt @@ -7,7 +7,7 @@ SVar:DBFluxDraw:DB$ Draw | NumCards$ X | Defined$ Player.IsRemembered | Referenc SVar:CleanTheFlux:DB$ Cleanup | ClearRemembered$ True SVar:DBDraw:DB$ Draw | NumCards$ 1 SVar:X:Remembered$Amount/Minus.1 -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/flux.jpg Oracle:Each player discards any number of cards, then draws that many cards.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/f/fluxcharger.txt b/forge-gui/res/cardsfolder/f/fluxcharger.txt index 34be14b5614..86637b33888 100644 --- a/forge-gui/res/cardsfolder/f/fluxcharger.txt +++ b/forge-gui/res/cardsfolder/f/fluxcharger.txt @@ -5,7 +5,7 @@ PT:1/5 K:Flying T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChangePT | OptionalDecider$ You | TriggerDescription$ Whenever you cast a instant or sorcery spell, you may switch CARDNAME's power and toughness until end of turn. SVar:TrigChangePT:DB$ Pump | KW$ HIDDEN CARDNAME's power and toughness are switched | Defined$ Self -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHints:Type$Instant|Sorcery SVar:Picture:http://www.wizards.com/global/images/magic/general/fluxcharger.jpg Oracle:Flying\nWhenever you cast an instant or sorcery spell, you may switch Fluxcharger's power and toughness until end of turn. diff --git a/forge-gui/res/cardsfolder/f/fodder_cannon.txt b/forge-gui/res/cardsfolder/f/fodder_cannon.txt index 69d51052a05..a75581b77db 100644 --- a/forge-gui/res/cardsfolder/f/fodder_cannon.txt +++ b/forge-gui/res/cardsfolder/f/fodder_cannon.txt @@ -3,6 +3,6 @@ ManaCost:4 Types:Artifact A:AB$ DealDamage | Cost$ 4 T Sac<1/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target creature. SVar:AIPreference:SacCost$Creature.token+powerLE3+toughnessLE3,Creature.nonToken+cmcLE2+powerLE1+toughnessLE2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/fodder_cannon.jpg Oracle:{4}, {T}, Sacrifice a creature: Fodder Cannon deals 4 damage to target creature. diff --git a/forge-gui/res/cardsfolder/f/fodder_launch.txt b/forge-gui/res/cardsfolder/f/fodder_launch.txt index a7e1bd91e9d..fded00fcde1 100644 --- a/forge-gui/res/cardsfolder/f/fodder_launch.txt +++ b/forge-gui/res/cardsfolder/f/fodder_launch.txt @@ -3,6 +3,6 @@ ManaCost:3 B Types:Tribal Sorcery Goblin A:SP$ Pump | Cost$ 3 B Sac<1/Goblin> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -5 | NumDef$ -5 | IsCurse$ True | SubAbility$ DBDealDamage | SpellDescription$ Target creature gets -5/-5 until end of turn. Fodder Launch deals 5 damage to that creature's controller. SVar:DBDealDamage:DB$DealDamage | Defined$ TargetedController | NumDmg$ 5 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/fodder_launch.jpg Oracle:As an additional cost to cast Fodder Launch, sacrifice a Goblin.\nTarget creature gets -5/-5 until end of turn. Fodder Launch deals 5 damage to that creature's controller. diff --git a/forge-gui/res/cardsfolder/f/fog_patch.txt b/forge-gui/res/cardsfolder/f/fog_patch.txt index fc30a0e90eb..07d0d8a1bb7 100644 --- a/forge-gui/res/cardsfolder/f/fog_patch.txt +++ b/forge-gui/res/cardsfolder/f/fog_patch.txt @@ -4,6 +4,6 @@ Types:Instant Text:Cast CARDNAME only during the declare blockers step. A:SP$ RepeatEach | Cost$ 1 G | ActivationPhases$ Declare Blockers | RepeatSubAbility$ DBBecomeBlocked | RepeatCards$ Creature.attacking | SpellDescription$ Attacking creatures become blocked. (This spell works on creatures that can't be blocked.) SVar:DBBecomeBlocked:DB$ BecomesBlocked | Defined$ Remembered -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fog_patch.jpg Oracle:Cast Fog Patch only during the declare blockers step.\nAttacking creatures become blocked. (This spell works on creatures that can't be blocked.) diff --git a/forge-gui/res/cardsfolder/f/folk_medicine.txt b/forge-gui/res/cardsfolder/f/folk_medicine.txt index d3a4c4f0e51..ce1ed394124 100644 --- a/forge-gui/res/cardsfolder/f/folk_medicine.txt +++ b/forge-gui/res/cardsfolder/f/folk_medicine.txt @@ -4,7 +4,7 @@ Types:Instant K:Flashback:1 W A:SP$ GainLife | Cost$ 2 G | LifeAmount$ X | References$ X | SpellDescription$ You gain 1 life for each creature you control. SVar:X:Count$TypeYouCtrl.Creature -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$white SVar:Picture:http://www.wizards.com/global/images/magic/general/folk_medicine.jpg Oracle:You gain 1 life for each creature you control.\nFlashback {1}{W} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/f/food_chain.txt b/forge-gui/res/cardsfolder/f/food_chain.txt index 9dfff7b22a8..bff503c63bf 100644 --- a/forge-gui/res/cardsfolder/f/food_chain.txt +++ b/forge-gui/res/cardsfolder/f/food_chain.txt @@ -4,6 +4,6 @@ Types:Enchantment A:AB$ Mana | Cost$ Exile<1/Creature> | Produced$ Any | Amount$ X | RestrictValid$ Card.Creature | References$ X | SpellDescription$ Add X mana of any one color, where X is the exiled creature's converted mana cost plus one. Spend this mana only to cast creature spells. SVar:X:Exiled$CardManaCost/Plus.1 SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/food_chain.jpg Oracle:Exile a creature you control: Add X mana of any one color, where X is the exiled creature's converted mana cost plus one. Spend this mana only to cast creature spells. diff --git a/forge-gui/res/cardsfolder/f/footbottom_feast.txt b/forge-gui/res/cardsfolder/f/footbottom_feast.txt index 9793de91d32..e4a27212a0c 100644 --- a/forge-gui/res/cardsfolder/f/footbottom_feast.txt +++ b/forge-gui/res/cardsfolder/f/footbottom_feast.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ ChangeZone | Cost$ 2 B | Origin$ Graveyard | Destination$ Library | TargetMin$ 0 | TargetMax$ X | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | References$ X | SpellDescription$ Put any number of target creature cards from your graveyard on top of your library. | SubAbility$ DBDraw SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. SVar:X:Count$TypeInYourYard.Creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/footbottom_feast.jpg Oracle:Put any number of target creature cards from your graveyard on top of your library.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/f/footsteps_of_the_goryo.txt b/forge-gui/res/cardsfolder/f/footsteps_of_the_goryo.txt index eabf73a4f49..494a454bf76 100644 --- a/forge-gui/res/cardsfolder/f/footsteps_of_the_goryo.txt +++ b/forge-gui/res/cardsfolder/f/footsteps_of_the_goryo.txt @@ -3,6 +3,6 @@ ManaCost:2 B Types:Sorcery Arcane A:SP$ ChangeZone | Cost$ 2 B | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature in your graveyard | GainControl$ True | SubAbility$ DBPump | AILogic$ BeforeCombat | SpellDescription$ Return target creature card from your graveyard to the battlefield. Sacrifice that creature at the beginning of the next end step. SVar:DBPump:DB$ Pump | Defined$ Targeted | AtEOT$ Sacrifice -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/footsteps_of_the_goryo.jpg Oracle:Return target creature card from your graveyard to the battlefield. Sacrifice that creature at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/f/forbid.txt b/forge-gui/res/cardsfolder/f/forbid.txt index f996794121d..293a03a155d 100644 --- a/forge-gui/res/cardsfolder/f/forbid.txt +++ b/forge-gui/res/cardsfolder/f/forbid.txt @@ -3,6 +3,6 @@ ManaCost:1 U U Types:Instant K:Buyback:Discard<2/Card> A:SP$ Counter | Cost$ 1 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | Destination$ Graveyard | SpellDescription$ Counter target spell. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://magiccards.info/scans/en/fnmp/27.jpg Oracle:Buyback—Discard two cards. (You may discard two cards in addition to any other costs as you cast this spell. If you do, put this card into your hand as it resolves.)\nCounter target spell. diff --git a/forge-gui/res/cardsfolder/f/forbidden_alchemy.txt b/forge-gui/res/cardsfolder/f/forbidden_alchemy.txt index 56757a98306..bdd83575e61 100644 --- a/forge-gui/res/cardsfolder/f/forbidden_alchemy.txt +++ b/forge-gui/res/cardsfolder/f/forbidden_alchemy.txt @@ -3,7 +3,7 @@ ManaCost:2 U Types:Instant K:Flashback:6 B A:SP$ Dig | Cost$ 2 U | DigNum$ 4 | DestinationZone2$ Graveyard | SpellDescription$ Look at the top four cards of your library. Put one of them into your hand and the rest into your graveyard. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHas:Ability$Graveyard DeckHints:Color$Black SVar:Picture:http://www.wizards.com/global/images/magic/general/forbidden_alchemy.jpg diff --git a/forge-gui/res/cardsfolder/f/forbidden_crypt.txt b/forge-gui/res/cardsfolder/f/forbidden_crypt.txt index 225bb73b660..2adb271568f 100644 --- a/forge-gui/res/cardsfolder/f/forbidden_crypt.txt +++ b/forge-gui/res/cardsfolder/f/forbidden_crypt.txt @@ -8,7 +8,7 @@ SVar:CardsInGrave:Count$InYourYard R:Event$ Moved | ActiveZones$ Battlefield | Destination$ Graveyard | ValidCard$ Card.nonToken+YouOwn | ReplaceWith$ CryptExile | Description$ If a card would be put into your graveyard from anywhere, exile that card instead. SVar:CryptExile:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Exile | Defined$ ReplacedCard SVar:NonStackingEffect:True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/forbidden_crypt.jpg Oracle:If you would draw a card, return a card from your graveyard to your hand instead. If you can't, you lose the game.\nIf a card would be put into your graveyard from anywhere, exile that card instead. diff --git a/forge-gui/res/cardsfolder/f/forbidden_ritual.txt b/forge-gui/res/cardsfolder/f/forbidden_ritual.txt index be4f599f1cd..483e653bc8c 100644 --- a/forge-gui/res/cardsfolder/f/forbidden_ritual.txt +++ b/forge-gui/res/cardsfolder/f/forbidden_ritual.txt @@ -7,7 +7,7 @@ SVar:DBGenericChoice:DB$ GenericChoice | Choices$ PaySac,PayDiscard | Defined$ T SVar:PaySac:DB$ LoseLife | LifeAmount$ 2 | Defined$ Targeted | UnlessCost$ Sac<1/Permanent> | UnlessPayer$ Targeted | UnlessAI$ LifeLE2 | SpellDescription$ You lose 2 life unless you sacrifice a permanent SVar:PayDiscard:DB$ LoseLife | LifeAmount$ 2 | Defined$ Targeted | UnlessCost$ Discard<1/Card> | UnlessPayer$ Targeted | UnlessAI$ LifeLE2 | SpellDescription$ You lose 2 life unless you discard a card SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/forbidden_ritual.jpg Oracle:Sacrifice a nontoken permanent. If you do, target opponent loses 2 life unless they sacrifice a permanent or discard a card. You may repeat this process any number of times. diff --git a/forge-gui/res/cardsfolder/f/force_of_savagery.txt b/forge-gui/res/cardsfolder/f/force_of_savagery.txt index f6ba7ade81a..7346583e478 100644 --- a/forge-gui/res/cardsfolder/f/force_of_savagery.txt +++ b/forge-gui/res/cardsfolder/f/force_of_savagery.txt @@ -4,6 +4,6 @@ Types:Creature Elemental PT:8/0 K:Trample A:SP$ PermanentCreature | Cost$ 2 G | AILogic$ ZeroToughness -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/force_of_savagery.jpg Oracle:Trample diff --git a/forge-gui/res/cardsfolder/f/forced_fruition.txt b/forge-gui/res/cardsfolder/f/forced_fruition.txt index 363d4ec2de7..a1920201ba3 100644 --- a/forge-gui/res/cardsfolder/f/forced_fruition.txt +++ b/forge-gui/res/cardsfolder/f/forced_fruition.txt @@ -3,6 +3,6 @@ ManaCost:4 U U Types:Enchantment T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever an opponent casts a spell, that player draws seven cards. SVar:TrigDraw:DB$Draw | Defined$ TriggeredActivator | NumCards$ 7 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/Forced_Fruition.jpg Oracle:Whenever an opponent casts a spell, that player draws seven cards. diff --git a/forge-gui/res/cardsfolder/f/forced_march.txt b/forge-gui/res/cardsfolder/f/forced_march.txt index 918caee5a37..061c8052502 100644 --- a/forge-gui/res/cardsfolder/f/forced_march.txt +++ b/forge-gui/res/cardsfolder/f/forced_march.txt @@ -3,6 +3,6 @@ ManaCost:X B B B Types:Sorcery A:SP$ DestroyAll | Cost$ X B B B | ValidCards$ Creature.cmcLEX | References$ X | SpellDescription$ Destroy all creatures with converted mana cost X or less. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/forced_march.jpg Oracle:Destroy all creatures with converted mana cost X or less. diff --git a/forge-gui/res/cardsfolder/f/forerunner_of_the_heralds.txt b/forge-gui/res/cardsfolder/f/forerunner_of_the_heralds.txt index 73f895590a5..2197733ddf3 100644 --- a/forge-gui/res/cardsfolder/f/forerunner_of_the_heralds.txt +++ b/forge-gui/res/cardsfolder/f/forerunner_of_the_heralds.txt @@ -8,6 +8,6 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Perman SVar:TrigCounters:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 DeckHas:Ability$Counters DeckHints:Type$Merfolk -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/forerunner_of_the_heralds.jpg Oracle:When Forerunner of the Heralds enters the battlefield, you may search your library for a Merfolk card, reveal it, then shuffle your library and put that card on top of it. \nWhenever another Merfolk enters the battlefield under your control, put a +1/+1 counter on Foreruner of the Heralds. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/f/foreshadow.txt b/forge-gui/res/cardsfolder/f/foreshadow.txt index 8e1d92455c7..3841db6e721 100644 --- a/forge-gui/res/cardsfolder/f/foreshadow.txt +++ b/forge-gui/res/cardsfolder/f/foreshadow.txt @@ -7,6 +7,6 @@ SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ X | SubAbility$ DelTrigSlowtrip SVar:DelTrigSlowtrip:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ DrawSlowtrip | TriggerDescription$ Draw a card. SVar:DrawSlowtrip:DB$Draw | NumCards$ 1 | Defined$ You SVar:X:Remembered$Valid Card.NamedCard -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/foreshadow.jpg Oracle:Choose a card name, then target opponent puts the top card of their library into their graveyard. If that card has the chosen name, you draw a card.\nDraw a card at the beginning of the next turn's upkeep. diff --git a/forge-gui/res/cardsfolder/f/foresight.txt b/forge-gui/res/cardsfolder/f/foresight.txt index 7bc4c03b625..46304266afc 100644 --- a/forge-gui/res/cardsfolder/f/foresight.txt +++ b/forge-gui/res/cardsfolder/f/foresight.txt @@ -4,7 +4,7 @@ Types:Sorcery A:SP$ ChangeZone | Cost$ 1 U | Origin$ Library | Destination$ Exile | ChangeType$ Card | ChangeNum$ 3 | Mandatory$ True | SpellDescription$ Search your library for three cards, exile them, then shuffle your library. Draw a card at the beginning of the next turn's upkeep. | SubAbility$ DelTrigSlowtrip SVar:DelTrigSlowtrip:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ DrawSlowtrip | TriggerDescription$ Draw a card. SVar:DrawSlowtrip:DB$Draw | NumCards$ 1 | Defined$ You -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/foresight.jpg Oracle:Search your library for three cards, exile them, then shuffle your library.\nDraw a card at the beginning of the next turn's upkeep. diff --git a/forge-gui/res/cardsfolder/f/forethought_amulet.txt b/forge-gui/res/cardsfolder/f/forethought_amulet.txt index 24075378c1f..3670f2906e8 100644 --- a/forge-gui/res/cardsfolder/f/forethought_amulet.txt +++ b/forge-gui/res/cardsfolder/f/forethought_amulet.txt @@ -4,6 +4,6 @@ Types:Artifact K:UpkeepCost:3 R:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Instant,Sorcery | ValidTarget$ You | DamageAmount$ GE3 | ReplaceWith$ Dmg2 | Description$ If an instant or sorcery source would deal 3 or more damage to you, it deals 2 damage to you instead. SVar:Dmg2:DB$ ReplaceEffect | VarName$ DamageAmount | VarValue$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/forethought_amulet.jpg Oracle:At the beginning of your upkeep, sacrifice Forethought Amulet unless you pay {3}.\nIf an instant or sorcery source would deal 3 or more damage to you, it deals 2 damage to you instead. diff --git a/forge-gui/res/cardsfolder/f/forfend.txt b/forge-gui/res/cardsfolder/f/forfend.txt index 28b1f823709..3e20beb9984 100644 --- a/forge-gui/res/cardsfolder/f/forfend.txt +++ b/forge-gui/res/cardsfolder/f/forfend.txt @@ -3,6 +3,6 @@ ManaCost:1 W Types:Instant A:SP$ Effect | Cost$ 1 W | Name$ Forfend Effect | ReplacementEffects$ RPrevent | SpellDescription$ Prevent all damage that would be dealt to creatures this turn. SVar:RPrevent:Event$ DamageDone | Prevent$ True | ActiveZones$ Command | ValidTarget$ Creature | Description$ Prevent all damage that would be dealt to creatures this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/forfend.jpg Oracle:Prevent all damage that would be dealt to creatures this turn. diff --git a/forge-gui/res/cardsfolder/f/forge_armor.txt b/forge-gui/res/cardsfolder/f/forge_armor.txt index 6c9a5964557..0d0a653cd33 100644 --- a/forge-gui/res/cardsfolder/f/forge_armor.txt +++ b/forge-gui/res/cardsfolder/f/forge_armor.txt @@ -3,7 +3,7 @@ ManaCost:4 R Types:Instant A:SP$ PutCounter | Cost$ 4 R Sac<1/Artifact> | CounterType$ P1P1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterNum$ X | References$ X | SpellDescription$ Put X +1/+1 counters on target creature, where X is the sacrificed artifact's converted mana cost. SVar:X:Sacrificed$CardManaCost -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/forge_armor.jpg Oracle:As an additional cost to cast Forge Armor, sacrifice an artifact.\nPut X +1/+1 counters on target creature, where X is the sacrificed artifact's converted mana cost. diff --git a/forge-gui/res/cardsfolder/f/forgotten_lore.txt b/forge-gui/res/cardsfolder/f/forgotten_lore.txt index 71180a16915..8bc88d36b7c 100644 --- a/forge-gui/res/cardsfolder/f/forgotten_lore.txt +++ b/forge-gui/res/cardsfolder/f/forgotten_lore.txt @@ -10,6 +10,6 @@ SVar:DBReset:DB$ StoreSVar | SVar$ CheckNotPaid | Type$ Number | Expression$ 1 | SVar:ChoiceNum:Count$ValidGraveyard Card.YouOwn+IsNotRemembered SVar:CheckNotPaid:Number$1 SVar:CheckRepeat:SVar$ChoiceNum/Times.CheckNotPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/forgotten_lore.jpg Oracle:Target opponent chooses a card in your graveyard. You may pay {G}. If you do, repeat this process except that opponent can't choose a card already chosen for Forgotten Lore. Then put the last chosen card into your hand. diff --git a/forge-gui/res/cardsfolder/f/fork.txt b/forge-gui/res/cardsfolder/f/fork.txt index 202f8527b93..9a3295a242f 100644 --- a/forge-gui/res/cardsfolder/f/fork.txt +++ b/forge-gui/res/cardsfolder/f/fork.txt @@ -2,6 +2,6 @@ Name:Fork ManaCost:R R Types:Instant A:SP$ CopySpellAbility | Cost$ R R | ValidTgts$ Instant,Sorcery | TargetType$ Spell | CopyIsColor$ Red | OverwriteColors$ True | SpellDescription$ Copy target instant or sorcery spell, except that the copy is red. You may choose new targets for the copy. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fork.jpg Oracle:Copy target instant or sorcery spell, except that the copy is red. You may choose new targets for the copy. diff --git a/forge-gui/res/cardsfolder/f/formation.txt b/forge-gui/res/cardsfolder/f/formation.txt index 34a8b8d68e8..2ea7a085abd 100644 --- a/forge-gui/res/cardsfolder/f/formation.txt +++ b/forge-gui/res/cardsfolder/f/formation.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Pump | Cost$ 1 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Banding | SubAbility$ DelTrigSlowtrip | SpellDescription$ Target creature gains banding until end of turn. Draw a card at the beginning of the next turn's upkeep. SVar:DelTrigSlowtrip:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ DrawSlowtrip | TriggerDescription$ Draw a card. SVar:DrawSlowtrip:DB$ Draw | NumCards$ 1 | Defined$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/formation.jpg Oracle:Target creature gains banding until end of turn. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding a player controls are blocking or being blocked by a creature, that player divides that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.)\nDraw a card at the beginning of the next turn's upkeep. diff --git a/forge-gui/res/cardsfolder/f/forsaken_city.txt b/forge-gui/res/cardsfolder/f/forsaken_city.txt index 6984b40d017..7428978c384 100644 --- a/forge-gui/res/cardsfolder/f/forsaken_city.txt +++ b/forge-gui/res/cardsfolder/f/forsaken_city.txt @@ -5,6 +5,6 @@ K:CARDNAME doesn't untap during your untap step. A:AB$ Mana | Cost$ T | Produced$ Any | SpellDescription$ Add one mana of any color. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigUntap | TriggerDescription$ At the beginning of your upkeep, you may exile a card from your hand. If you do, untap CARDNAME. SVar:TrigUntap:AB$Untap | Cost$ ExileFromHand<1/Card> | Defined$ Self -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/forsaken_city.jpg Oracle:Forsaken City doesn't untap during your untap step.\nAt the beginning of your upkeep, you may exile a card from your hand. If you do, untap Forsaken City.\n{T}: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/f/forsaken_wastes.txt b/forge-gui/res/cardsfolder/f/forsaken_wastes.txt index 6916ce08056..d05ca44ec40 100644 --- a/forge-gui/res/cardsfolder/f/forsaken_wastes.txt +++ b/forge-gui/res/cardsfolder/f/forsaken_wastes.txt @@ -6,6 +6,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ TrigLoseLife | Tr T:Mode$ BecomesTarget | ValidTarget$ Card.Self | SourceType$ Spell | Execute$ TrigLoseLife5 | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME becomes the target of a spell, that spell's controller loses 5 life. SVar:TrigLoseLife:DB$ LoseLife | Defined$ TriggeredPlayer | LifeAmount$ 1 SVar:TrigLoseLife5:DB$ LoseLife | Defined$ TriggeredSourceController | LifeAmount$ 5 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/forsaken_wastes.jpg Oracle:Players can't gain life.\nAt the beginning of each player's upkeep, that player loses 1 life.\nWhenever Forsaken Wastes becomes the target of a spell, that spell's controller loses 5 life. diff --git a/forge-gui/res/cardsfolder/f/fortified_area.txt b/forge-gui/res/cardsfolder/f/fortified_area.txt index db47a700af0..b20a1617875 100644 --- a/forge-gui/res/cardsfolder/f/fortified_area.txt +++ b/forge-gui/res/cardsfolder/f/fortified_area.txt @@ -2,7 +2,7 @@ Name:Fortified Area ManaCost:1 W W Types:Enchantment S:Mode$ Continuous | Affected$ Creature.YouCtrl+Wall | AddPower$ 1 | AddKeyword$ Banding | Description$ Wall creatures you control get +1/+0 and have banding. -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fortified_area.jpg Oracle:Wall creatures you control get +1/+0 and have banding. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/f/fortitude.txt b/forge-gui/res/cardsfolder/f/fortitude.txt index 5f235dc9f61..fa6e2affd57 100644 --- a/forge-gui/res/cardsfolder/f/fortitude.txt +++ b/forge-gui/res/cardsfolder/f/fortitude.txt @@ -6,7 +6,7 @@ A:SP$ Attach | Cost$ 1 G | ValidTgts$ Creature | AILogic$ Pump A:AB$ Regenerate | Cost$ Sac<1/Forest> | Defined$ Enchanted | SpellDescription$ Regenerate enchanted creature. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, return CARDNAME to its owner's hand. SVar:TrigChangeZone:DB$ChangeZone | Origin$ Graveyard | Destination$ Hand | Defined$ TriggeredCard -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingAttachEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/fortitude.jpg Oracle:Enchant creature\nSacrifice a Forest: Regenerate enchanted creature.\nWhen Fortitude is put into a graveyard from the battlefield, return Fortitude to its owner's hand. diff --git a/forge-gui/res/cardsfolder/f/fossil_find.txt b/forge-gui/res/cardsfolder/f/fossil_find.txt index f45c5dfc255..ca72b6ba9d8 100644 --- a/forge-gui/res/cardsfolder/f/fossil_find.txt +++ b/forge-gui/res/cardsfolder/f/fossil_find.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ ChooseCard | Cost$ RG | Choices$ Card.YouOwn | ChoiceZone$ Graveyard | AtRandom$ True | Amount$ 1 | SubAbility$ DBReturn | SpellDescription$ Return a card at random from your graveyard to your hand, then reorder your graveyard as you choose. SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | Defined$ ChosenCard | SubAbility$ DBReorder SVar:DBReorder:DB$ ReorderZone | Zone$ Graveyard | Defined$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fossil_find.jpg Oracle:Return a card at random from your graveyard to your hand, then reorder your graveyard as you choose. diff --git a/forge-gui/res/cardsfolder/f/foul_presence.txt b/forge-gui/res/cardsfolder/f/foul_presence.txt index 117b08892f6..8a575d0c4c9 100644 --- a/forge-gui/res/cardsfolder/f/foul_presence.txt +++ b/forge-gui/res/cardsfolder/f/foul_presence.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ 2 B | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ -1 | AddToughness$ -1 | AddAbility$ Pump | Description$ Enchanted creature gets -1/-1 and has "{T}: Target creature gets -1/-1 until end of turn." SVar:Pump:AB$Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | SpellDescription$ Target creature gets -1/-1 until end of turn." -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/foul_presence.jpg Oracle:Enchant creature\nEnchanted creature gets -1/-1 and has "{T}: Target creature gets -1/-1 until end of turn." diff --git a/forge-gui/res/cardsfolder/f/foul_tongue_shriek.txt b/forge-gui/res/cardsfolder/f/foul_tongue_shriek.txt index dc4ebe9727b..7be604f6f22 100644 --- a/forge-gui/res/cardsfolder/f/foul_tongue_shriek.txt +++ b/forge-gui/res/cardsfolder/f/foul_tongue_shriek.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ LoseLife | Cost$ B | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | LifeAmount$ X | References$ X | SubAbility$ DBGainLife | SpellDescription$ Target opponent loses 1 life for each attacking creature you control. You gain that much life. SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ X | References$ X SVar:X:Count$Valid Creature.attacking+YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/foul_tongue_shriek.jpg Oracle:Target opponent loses 1 life for each attacking creature you control. You gain that much life. diff --git a/forge-gui/res/cardsfolder/f/fountain_of_cho.txt b/forge-gui/res/cardsfolder/f/fountain_of_cho.txt index 36aa61aea28..a8cf43e3bb8 100644 --- a/forge-gui/res/cardsfolder/f/fountain_of_cho.txt +++ b/forge-gui/res/cardsfolder/f/fountain_of_cho.txt @@ -6,6 +6,6 @@ A:AB$ PutCounter | Cost$ T | Defined$ Self | CounterType$ STORAGE | CounterNum$ A:AB$ Mana | Cost$ T SubCounter | Produced$ W | Amount$ ChosenX | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | References$ X | SpellDescription$ Add {W} for each storage counter removed this way. SVar:X:XChoice #ChosenX SVar created by Cost payment -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fountain_of_cho.jpg Oracle:Fountain of Cho enters the battlefield tapped.\n{T}: Put a storage counter on Fountain of Cho.\n{T}, Remove any number of storage counters from Fountain of Cho: Add {W} for each storage counter removed this way. diff --git a/forge-gui/res/cardsfolder/f/foxfire.txt b/forge-gui/res/cardsfolder/f/foxfire.txt index 37ad8dde637..e5ab8eb334f 100644 --- a/forge-gui/res/cardsfolder/f/foxfire.txt +++ b/forge-gui/res/cardsfolder/f/foxfire.txt @@ -5,6 +5,6 @@ A:SP$ Untap | Cost$ 2 G | ValidTgts$ Creature.attacking | TgtPrompt$ Select targ SVar:DBPump:DB$Pump | Defined$ Targeted | KW$ Prevent all combat damage that would be dealt to and dealt by CARDNAME. | SubAbility$ DelTrigSlowtrip SVar:DelTrigSlowtrip:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ DrawSlowtrip | TriggerDescription$ Draw a card. SVar:DrawSlowtrip:DB$Draw | NumCards$ 1 | Defined$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/foxfire.jpg Oracle:Untap target attacking creature. Prevent all combat damage that would be dealt to and dealt by that creature this turn.\nDraw a card at the beginning of the next turn's upkeep. diff --git a/forge-gui/res/cardsfolder/f/fractured_loyalty.txt b/forge-gui/res/cardsfolder/f/fractured_loyalty.txt index 6a618c68923..606f902b6cb 100644 --- a/forge-gui/res/cardsfolder/f/fractured_loyalty.txt +++ b/forge-gui/res/cardsfolder/f/fractured_loyalty.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ 1 R | ValidTgts$ Creature | AILogic$ Curse T:Mode$ BecomesTarget | ValidTarget$ Card.EnchantedBy | TriggerZones$ Battlefield | Execute$ TrigGainControl | TriggerDescription$ Whenever enchanted creature becomes the target of a spell or ability, that spell or ability's controller gains control of that creature. (This effect lasts indefinitely.) SVar:TrigGainControl:DB$ GainControl | Defined$ Enchanted | NewController$ TriggeredSourceController | Permanent$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/fractured_loyalty.jpg Oracle:Enchant creature\nWhenever enchanted creature becomes the target of a spell or ability, that spell or ability's controller gains control of that creature. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/f/fractured_powerstone.txt b/forge-gui/res/cardsfolder/f/fractured_powerstone.txt index ab3c63cabb5..9c4216154b0 100644 --- a/forge-gui/res/cardsfolder/f/fractured_powerstone.txt +++ b/forge-gui/res/cardsfolder/f/fractured_powerstone.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ RollPlanarDice | Cost$ T | SorcerySpeed$ True | SpellDescription$ Roll the planar die. Activate this ability only any time you could cast a sorcery. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/fractured_powerstone.jpg Oracle:{T}: Add {C}.\n{T}: Roll the planar die. Activate this ability only any time you could cast a sorcery. diff --git a/forge-gui/res/cardsfolder/f/frankensteins_monster.txt b/forge-gui/res/cardsfolder/f/frankensteins_monster.txt index 01339f3a587..0281003504a 100644 --- a/forge-gui/res/cardsfolder/f/frankensteins_monster.txt +++ b/forge-gui/res/cardsfolder/f/frankensteins_monster.txt @@ -16,6 +16,6 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True SVar:X:Count$xPaid SVar:CheckExiled:Count$ValidExile Card.IsRemembered SVar:CheckYard:Count$ValidGraveyard Creature.YouOwn -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/frankensteins_monster.jpg Oracle:As Frankenstein's Monster enters the battlefield, exile X creature cards from your graveyard. If you can't, put Frankenstein's Monster into its owner's graveyard instead of onto the battlefield. For each creature card exiled this way, Frankenstein's Monster enters the battlefield with a +2/+0, +1/+1, or +0/+2 counter on it. diff --git a/forge-gui/res/cardsfolder/f/frantic_salvage.txt b/forge-gui/res/cardsfolder/f/frantic_salvage.txt index 74aded2bb79..febcde89151 100644 --- a/forge-gui/res/cardsfolder/f/frantic_salvage.txt +++ b/forge-gui/res/cardsfolder/f/frantic_salvage.txt @@ -4,7 +4,7 @@ Types:Instant A:SP$ ChangeZone | Cost$ 3 W | Origin$ Graveyard | Destination$ Library | TargetMin$ 0 | TargetMax$ X | TgtPrompt$ Choose target artifact card in your graveyard | ValidTgts$ Artifact.YouCtrl | SubAbility$ DBDraw | References$ X | SpellDescription$ Put any number of target artifact cards from your graveyard on top of your library. SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. SVar:X:Count$TypeInYourYard.Artifact -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/frantic_salvage.jpg Oracle:Put any number of target artifact cards from your graveyard on top of your library.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/f/frantic_search.txt b/forge-gui/res/cardsfolder/f/frantic_search.txt index 5b476ee7a69..96cdd892e01 100644 --- a/forge-gui/res/cardsfolder/f/frantic_search.txt +++ b/forge-gui/res/cardsfolder/f/frantic_search.txt @@ -4,7 +4,7 @@ Types:Instant A:SP$ Draw | Cost$ 2 U | NumCards$ 2 | SpellDescription$ Draw two cards, then discard two cards. Untap up to three lands. | SubAbility$ DBDiscard SVar:DBDiscard:DB$Discard | NumCards$ 2 | Mode$ TgtChoose | SubAbility$ DBUntap SVar:DBUntap:DB$ Untap | UntapUpTo$ True | UntapType$ Land | Amount$ 3 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:FreeSpellAI:True SVar:Picture:http://www.wizards.com/global/images/magic/general/frantic_search.jpg Oracle:Draw two cards, then discard two cards. Untap up to three lands. diff --git a/forge-gui/res/cardsfolder/f/freed_from_the_real.txt b/forge-gui/res/cardsfolder/f/freed_from_the_real.txt index 560c4b7b193..0c80ad51a0e 100644 --- a/forge-gui/res/cardsfolder/f/freed_from_the_real.txt +++ b/forge-gui/res/cardsfolder/f/freed_from_the_real.txt @@ -5,7 +5,7 @@ K:Enchant creature A:SP$ Attach | Cost$ 2 U | ValidTgts$ Creature | AILogic$ Pump A:AB$ Tap | Cost$ U | Defined$ Enchanted | SpellDescription$ Tap enchanted creature. A:AB$ Untap | Cost$ U | Defined$ Enchanted | SpellDescription$ Untap enchanted creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingAttachEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/freed_from_the_real.jpg Oracle:Enchant creature\n{U}: Tap enchanted creature.\n{U}: Untap enchanted creature. diff --git a/forge-gui/res/cardsfolder/f/frenetic_ogre.txt b/forge-gui/res/cardsfolder/f/frenetic_ogre.txt index 3a43659cf8b..aaa00b7d8ff 100644 --- a/forge-gui/res/cardsfolder/f/frenetic_ogre.txt +++ b/forge-gui/res/cardsfolder/f/frenetic_ogre.txt @@ -3,6 +3,6 @@ ManaCost:4 R Types:Creature Ogre PT:2/3 A:AB$ Pump | Cost$ R Discard<1/Random> | NumAtt$ +3 | SpellDescription$ CARDNAME gets +3/+0 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/frenetic_ogre.jpg Oracle:{R}, Discard a card at random: Frenetic Ogre gets +3/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/f/frenetic_sliver.txt b/forge-gui/res/cardsfolder/f/frenetic_sliver.txt index 7c48410b128..5c6cba7d168 100644 --- a/forge-gui/res/cardsfolder/f/frenetic_sliver.txt +++ b/forge-gui/res/cardsfolder/f/frenetic_sliver.txt @@ -9,6 +9,6 @@ SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ Mo SVar:MoveBack:DB$ ChangeZone | Origin$ Exile | Destination$ Battlefield | Defined$ Self SVar:DBSacSelf:DB$ Sacrifice | Defined$ Self SVar:PlayMain1:TRUE -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/frenetic_sliver.jpg Oracle:All Slivers have "{0}: If this permanent is on the battlefield, flip a coin. If you win the flip, exile this permanent and return it to the battlefield under its owner's control at the beginning of the next end step. If you lose the flip, sacrifice it." diff --git a/forge-gui/res/cardsfolder/f/fresh_meat.txt b/forge-gui/res/cardsfolder/f/fresh_meat.txt index 8d971fc0745..583193dc4c0 100644 --- a/forge-gui/res/cardsfolder/f/fresh_meat.txt +++ b/forge-gui/res/cardsfolder/f/fresh_meat.txt @@ -3,6 +3,6 @@ ManaCost:3 G Types:Instant A:SP$ Token | Cost$ 3 G | TokenAmount$ X | TokenOwner$ You | TokenName$ Beast | TokenTypes$ Creature,Beast | TokenColors$ Green | TokenPower$ 3 | TokenToughness$ 3 | TokenImage$ g 3 3 beast NPH | References$ X | SpellDescription$ Create a 3/3 green Beast creature token for each creature put into your graveyard from the battlefield this turn. SVar:X:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature.YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fresh_meat.jpg Oracle:Create a 3/3 green Beast creature token for each creature put into your graveyard from the battlefield this turn. diff --git a/forge-gui/res/cardsfolder/f/freyalise_supplicant.txt b/forge-gui/res/cardsfolder/f/freyalise_supplicant.txt index c1044f6380a..6d3b35f8f3b 100644 --- a/forge-gui/res/cardsfolder/f/freyalise_supplicant.txt +++ b/forge-gui/res/cardsfolder/f/freyalise_supplicant.txt @@ -4,7 +4,7 @@ Types:Creature Human Cleric PT:1/1 A:AB$ DealDamage | Cost$ T Sac<1/Creature.Red;Creature.White/red or white creature> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals damage to any target equal to half the sacrificed creature's power, rounded down. SVar:X:Sacrificed$CardPower/HalfDown -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/freyalise_supplicant.jpg Oracle:{T}, Sacrifice a red or white creature: Freyalise Supplicant deals damage to any target equal to half the sacrificed creature's power, rounded down. diff --git a/forge-gui/res/cardsfolder/f/freyalises_charm.txt b/forge-gui/res/cardsfolder/f/freyalises_charm.txt index 48792ee4b58..8b09d6437d8 100644 --- a/forge-gui/res/cardsfolder/f/freyalises_charm.txt +++ b/forge-gui/res/cardsfolder/f/freyalises_charm.txt @@ -4,6 +4,6 @@ Types:Enchantment A:AB$ ChangeZone | Cost$ G G | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. T:Mode$ SpellCast | ValidCard$ Card.Black | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDraw | OptionalDecider$ You | TriggerDescription$ Whenever an opponent casts a black spell, you may pay {G}{G}. If you do, you draw a card. SVar:TrigDraw:AB$Draw | Cost$ G G | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/freyalises_charm.jpg Oracle:Whenever an opponent casts a black spell, you may pay {G}{G}. If you do, you draw a card.\n{G}{G}: Return Freyalise's Charm to its owner's hand. diff --git a/forge-gui/res/cardsfolder/f/freyalises_radiance.txt b/forge-gui/res/cardsfolder/f/freyalises_radiance.txt index 330fdc5a6ca..4fe1be5c72a 100644 --- a/forge-gui/res/cardsfolder/f/freyalises_radiance.txt +++ b/forge-gui/res/cardsfolder/f/freyalises_radiance.txt @@ -3,7 +3,7 @@ ManaCost:1 G Types:Enchantment S:Mode$ Continuous | Affected$ Permanent.Snow | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Snow permanents don't untap during their controllers' untap steps. K:Cumulative upkeep:2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/freyalises_radiance.jpg Oracle:Cumulative upkeep {2} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nSnow permanents don't untap during their controllers' untap steps. diff --git a/forge-gui/res/cardsfolder/f/freyalises_winds.txt b/forge-gui/res/cardsfolder/f/freyalises_winds.txt index 5cbe64290cb..707656a6ef6 100644 --- a/forge-gui/res/cardsfolder/f/freyalises_winds.txt +++ b/forge-gui/res/cardsfolder/f/freyalises_winds.txt @@ -5,6 +5,6 @@ T:Mode$ Taps | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDesc SVar:TrigPutCounter:DB$ PutCounter | Defined$ TriggeredCardLKICopy | CounterType$ WIND | CounterNum$ 1 R:Event$ Untap | ActiveZones$ Battlefield | ValidCard$ Permanent.counters_GE1_WIND | ReplaceWith$ RepRemoveCounter | UntapStep$ True | Description$ If a permanent with a wind counter on it would untap during its controller's untap step, remove all wind counters from it instead. SVar:RepRemoveCounter:DB$ RemoveCounter | Defined$ ReplacedCard | CounterType$ WIND | CounterNum$ All -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/freyalises_winds.jpg Oracle:Whenever a permanent becomes tapped, put a wind counter on it.\nIf a permanent with a wind counter on it would untap during its controller's untap step, remove all wind counters from it instead. diff --git a/forge-gui/res/cardsfolder/f/friendly_fire.txt b/forge-gui/res/cardsfolder/f/friendly_fire.txt index 8e81a5334f3..5ea954f693d 100644 --- a/forge-gui/res/cardsfolder/f/friendly_fire.txt +++ b/forge-gui/res/cardsfolder/f/friendly_fire.txt @@ -6,6 +6,6 @@ SVar:DBReveal:DB$ Reveal | Defined$ TargetedController | Random$ True | Remember SVar:DBDmg:DB$ DamageAll | NumDmg$ X | ValidPlayers$ TargetedController | ValidCards$ Targeted.Self | SubAbility$ DBCleanup | References$ X SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/friendly_fire.jpg Oracle:Target creature's controller reveals a card at random from their hand. Friendly Fire deals damage to that creature and that player equal to the revealed card's converted mana cost. diff --git a/forge-gui/res/cardsfolder/f/from_the_ashes.txt b/forge-gui/res/cardsfolder/f/from_the_ashes.txt index 6cd7fc77a87..128fbe93b9a 100644 --- a/forge-gui/res/cardsfolder/f/from_the_ashes.txt +++ b/forge-gui/res/cardsfolder/f/from_the_ashes.txt @@ -8,6 +8,6 @@ SVar:DBShuffle:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ Shuffl SVar:ShuffleSearched:DB$ Shuffle | Defined$ Player.IsRemembered | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | References$ X SVar:X:Count$Valid Card.IsRemembered+RememberedPlayerCtrl SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/from_the_ashes.jpg Oracle:Destroy all nonbasic lands. For each land destroyed this way, its controller may search their library for a basic land card and put it onto the battlefield. Then each player who searched their library this way shuffles it. diff --git a/forge-gui/res/cardsfolder/f/frontline_strategist.txt b/forge-gui/res/cardsfolder/f/frontline_strategist.txt index 21a526099ce..d6cd7d63d17 100644 --- a/forge-gui/res/cardsfolder/f/frontline_strategist.txt +++ b/forge-gui/res/cardsfolder/f/frontline_strategist.txt @@ -6,6 +6,6 @@ K:Morph:W T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigCurseNonSoldiers | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME is turned face up, prevent all combat damage non-Soldier creatures would deal this turn. SVar:TrigCurseNonSoldiers:DB$ Effect | Name$ Frontline Strategist Effect | ReplacementEffects$ RPrevent SVar:RPrevent:Event$ DamageDone | Prevent$ True | IsCombat$ True | ActiveZones$ Command | ValidSource$ Creature.nonSoldier | Description$ Prevent all combat damage non-Soldier creatures would deal this turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/frontline_strategist.jpg Oracle:Morph {W} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.)\nWhen Frontline Strategist is turned face up, prevent all combat damage non-Soldier creatures would deal this turn. diff --git a/forge-gui/res/cardsfolder/f/full_moons_rise.txt b/forge-gui/res/cardsfolder/f/full_moons_rise.txt index bd3ccaef8df..61b84b86c28 100644 --- a/forge-gui/res/cardsfolder/f/full_moons_rise.txt +++ b/forge-gui/res/cardsfolder/f/full_moons_rise.txt @@ -3,6 +3,6 @@ ManaCost:1 G Types:Enchantment S:Mode$ Continuous | Affected$ Creature.Werewolf+YouCtrl | AddPower$ 1 | AddToughness$ 0 | AddKeyword$ Trample | Description$ Werewolf creatures you control get +1/+0 and have trample. A:AB$RegenerateAll | Cost$ Sac<1/CARDNAME> | ValidCards$ Creature.Werewolf+YouCtrl | SpellDescription$ Regenerate all Werewolf creatures you control. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/full_moons_rise.jpg Oracle:Werewolf creatures you control get +1/+0 and have trample.\nSacrifice Full Moon's Rise: Regenerate all Werewolf creatures you control. diff --git a/forge-gui/res/cardsfolder/f/funeral_pyre.txt b/forge-gui/res/cardsfolder/f/funeral_pyre.txt index 7a95d436af6..24b5d2fe659 100644 --- a/forge-gui/res/cardsfolder/f/funeral_pyre.txt +++ b/forge-gui/res/cardsfolder/f/funeral_pyre.txt @@ -3,7 +3,7 @@ ManaCost:W Types:Instant A:SP$ ChangeZone | Cost$ W | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SubAbility$ DBToken | SpellDescription$ Exile target card from a graveyard. SVar:DBToken:DB$Token | TokenAmount$ 1 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenOwner$ TargetedController | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SpellDescription$ Its owner creates a 1/1 white Spirit creature token with flying. -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHas:Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/funeral_pyre.jpg Oracle:Exile target card from a graveyard. Its owner creates a 1/1 white Spirit creature token with flying. diff --git a/forge-gui/res/cardsfolder/f/fungal_bloom.txt b/forge-gui/res/cardsfolder/f/fungal_bloom.txt index f0dd5308f8f..4487f98b7eb 100644 --- a/forge-gui/res/cardsfolder/f/fungal_bloom.txt +++ b/forge-gui/res/cardsfolder/f/fungal_bloom.txt @@ -3,7 +3,7 @@ ManaCost:G G Types:Enchantment A:AB$ PutCounter | Cost$ G G | ValidTgts$ Fungus | TgtPrompt$ Select target Fungus | CounterType$ SPORE | CounterNum$ 1 | SpellDescription$ Put a spore counter on target Fungus. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Fungus SVar:Picture:http://www.wizards.com/global/images/magic/general/fungal_bloom.jpg Oracle:{G}{G}: Put a spore counter on target Fungus. diff --git a/forge-gui/res/cardsfolder/f/fungal_plots.txt b/forge-gui/res/cardsfolder/f/fungal_plots.txt index 6218c07c23a..6a7dbd776cc 100644 --- a/forge-gui/res/cardsfolder/f/fungal_plots.txt +++ b/forge-gui/res/cardsfolder/f/fungal_plots.txt @@ -4,6 +4,6 @@ Types:Enchantment A:AB$ Token | Cost$ 1 G ExileFromGrave<1/Creature> | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | TokenImage$ g 1 1 saproling DOM | SpellDescription$ Create a 1/1 green Saproling creature token. A:AB$ GainLife | Cost$ Sac<2/Saproling> | Defined$ You | LifeAmount$ 2 | SubAbility$ DBDraw | SpellDescription$ Gain 2 life and draw a card. SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHas:Ability$Token Oracle:{1}{G}, Exile a creature card from your graveyard: Create a 1/1 green Saproling creature token.\nSacrifice two Saprolings: Gain 2 life and draw a card. diff --git a/forge-gui/res/cardsfolder/f/fungal_reaches.txt b/forge-gui/res/cardsfolder/f/fungal_reaches.txt index dafd6494bea..257e9a07598 100644 --- a/forge-gui/res/cardsfolder/f/fungal_reaches.txt +++ b/forge-gui/res/cardsfolder/f/fungal_reaches.txt @@ -5,6 +5,6 @@ A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ PutCounter | Cost$ 1 T | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME. A:AB$ Mana | Cost$ 1 SubCounter | Produced$ Combo R G | Amount$ ChosenX | CostDesc$ {1}, Remove X storage counters from CARDNAME: | References$ X | SpellDescription$ Add X mana in any combination of {R} and/or {G}. SVar:X:XChoice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fungal_reaches.jpg Oracle:{T}: Add {C}.\n{1}, {T}: Put a storage counter on Fungal Reaches.\n{1}, Remove X storage counters from Fungal Reaches: Add X mana in any combination of {R} and/or {G}. diff --git a/forge-gui/res/cardsfolder/f/fungus_elemental.txt b/forge-gui/res/cardsfolder/f/fungus_elemental.txt index 183b3d630cc..8a63d42badc 100644 --- a/forge-gui/res/cardsfolder/f/fungus_elemental.txt +++ b/forge-gui/res/cardsfolder/f/fungus_elemental.txt @@ -3,6 +3,6 @@ ManaCost:3 G Types:Creature Fungus Elemental PT:3/3 A:AB$ PutCounter | Cost$ G Sac<1/Forest> | Defined$ Self | CounterType$ P2P2 | CounterNum$ 1 | IsPresent$ Card.Self+enteredBattlefieldThisTurn | SpellDescription$ Put a +2/+2 counter on CARDNAME. Activate this ability only if CARDNAME entered the battlefield this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fungus_elemental.jpg Oracle:{G}, Sacrifice a Forest: Put a +2/+2 counter on Fungus Elemental. Activate this ability only if Fungus Elemental entered the battlefield this turn. diff --git a/forge-gui/res/cardsfolder/f/furnace_brood.txt b/forge-gui/res/cardsfolder/f/furnace_brood.txt index c45aa5cca8e..fe3929fde59 100644 --- a/forge-gui/res/cardsfolder/f/furnace_brood.txt +++ b/forge-gui/res/cardsfolder/f/furnace_brood.txt @@ -3,6 +3,6 @@ ManaCost:3 R Types:Creature Elemental PT:3/3 A:AB$ Pump | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME can't be regenerated. | IsCurse$ True | SpellDescription$ Target creature can't be regenerated this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/furnace_brood.jpg Oracle:{R}: Target creature can't be regenerated this turn. diff --git a/forge-gui/res/cardsfolder/f/furnace_celebration.txt b/forge-gui/res/cardsfolder/f/furnace_celebration.txt index 3eb1b3e2874..7709cb6266c 100644 --- a/forge-gui/res/cardsfolder/f/furnace_celebration.txt +++ b/forge-gui/res/cardsfolder/f/furnace_celebration.txt @@ -3,6 +3,6 @@ ManaCost:1 R R Types:Enchantment T:Mode$ Sacrificed | ValidCard$ Permanent.Other | Execute$ TrigDealDamage | OptionalDecider$ You | TriggerZones$ Battlefield | ValidPlayer$ You | TriggerDescription$ Whenever you sacrifice another permanent, you may pay {2}. If you do, CARDNAME deals 2 damage to any target. SVar:TrigDealDamage:AB$DealDamage | Cost$ 2 | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/furnace_celebration.jpg Oracle:Whenever you sacrifice another permanent, you may pay {2}. If you do, Furnace Celebration deals 2 damage to any target. diff --git a/forge-gui/res/cardsfolder/f/furnace_of_rath.txt b/forge-gui/res/cardsfolder/f/furnace_of_rath.txt index b4669d30018..2d27dee5c56 100644 --- a/forge-gui/res/cardsfolder/f/furnace_of_rath.txt +++ b/forge-gui/res/cardsfolder/f/furnace_of_rath.txt @@ -5,6 +5,6 @@ R:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Card | ValidTarget SVar:DmgTwice:DB$ ReplaceEffect | VarName$ DamageAmount | VarValue$ X | References$ X SVar:X:ReplaceCount$DamageAmount/Twice SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/furnace_of_rath.jpg Oracle:If a source would deal damage to a permanent or player, it deals double that damage to that permanent or player instead. diff --git a/forge-gui/res/cardsfolder/f/fury_charm.txt b/forge-gui/res/cardsfolder/f/fury_charm.txt index 077065e0f4d..3a2d22a9b6d 100644 --- a/forge-gui/res/cardsfolder/f/fury_charm.txt +++ b/forge-gui/res/cardsfolder/f/fury_charm.txt @@ -5,6 +5,6 @@ A:SP$ Charm | Cost$ 1 R | CharmNum$ 1 | Choices$ Bash,Buff,LoseTime SVar:Bash:DB$ Destroy | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy target artifact. SVar:Buff:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ 1 | NumDef$ 1 | KW$ Trample | SpellDescription$ Target creature gets +1/+1 and gains trample until end of turn. SVar:LoseTime:DB$ RemoveCounter | ValidTgts$ Permanent.inZoneBattlefield,Card.suspended | AITgts$ Permanent.counters_GE1_TIME+YouDontCtrl,Card.suspended+YouCtrl | TgtPrompt$ Select target permanent or suspended card. | CounterType$ TIME | CounterNum$ 2 | TgtZone$ Battlefield,Exile | SpellDescription$ Remove two time counters from target permanent or suspended card. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fury_charm.jpg Oracle:Choose one —\n• Destroy target artifact.\n• Target creature gets +1/+1 and gains trample until end of turn.\n• Remove two time counters from target permanent or suspended card. diff --git a/forge-gui/res/cardsfolder/f/fylamarid.txt b/forge-gui/res/cardsfolder/f/fylamarid.txt index 242bbcae433..cca14fbe4ca 100644 --- a/forge-gui/res/cardsfolder/f/fylamarid.txt +++ b/forge-gui/res/cardsfolder/f/fylamarid.txt @@ -5,6 +5,6 @@ PT:1/3 K:Flying K:CantBeBlockedBy Creature.Blue A:AB$ Animate | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Colors$ Blue | OverwriteColors$ True | SpellDescription$ Target creature becomes blue until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fylamarid.jpg Oracle:Flying\nFylamarid can't be blocked by blue creatures.\n{U}: Target creature becomes blue until end of turn. diff --git a/forge-gui/res/cardsfolder/f/fyndhorn_pollen.txt b/forge-gui/res/cardsfolder/f/fyndhorn_pollen.txt index 38fff9c82e7..67d1b58cdfb 100644 --- a/forge-gui/res/cardsfolder/f/fyndhorn_pollen.txt +++ b/forge-gui/res/cardsfolder/f/fyndhorn_pollen.txt @@ -4,6 +4,6 @@ Types:Enchantment K:Cumulative upkeep:1 S:Mode$ Continuous | Affected$ Creature | AddPower$ -1 | Description$ All creatures get -1/-0. A:AB$ PumpAll | Cost$ 1 G | ValidCards$ Creature | NumAtt$ -1 | IsCurse$ True | SpellDescription$ All creatures get -1/-0 until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/fyndhorn_pollen.jpg Oracle:Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nAll creatures get -1/-0.\n{1}{G}: All creatures get -1/-0 until end of turn. diff --git a/forge-gui/res/cardsfolder/g/gabriel_angelfire.txt b/forge-gui/res/cardsfolder/g/gabriel_angelfire.txt index cda7ff8da00..d696f7e4e9b 100644 --- a/forge-gui/res/cardsfolder/g/gabriel_angelfire.txt +++ b/forge-gui/res/cardsfolder/g/gabriel_angelfire.txt @@ -8,6 +8,6 @@ SVar:SVar1:DB$ Pump | Defined$ Self | KW$ Flying | UntilYourNextUpkeep$ True | S SVar:SVar2:DB$ Pump | Defined$ Self | KW$ First Strike | UntilYourNextUpkeep$ True | SpellDescription$ First strike SVar:SVar3:DB$ Pump | Defined$ Self | KW$ Trample | UntilYourNextUpkeep$ True | SpellDescription$ Trample SVar:SVar4:DB$ Pump | Defined$ Self | KW$ Rampage:3 | UntilYourNextUpkeep$ True | SpellDescription$ Rampage 3 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gabriel_angelfire.jpg Oracle:At the beginning of your upkeep, choose flying, first strike, trample, or rampage 3. Gabriel Angelfire gains that ability until your next upkeep. (Whenever a creature with rampage 3 becomes blocked, it gets +3/+3 until end of turn for each creature blocking it beyond the first.) diff --git a/forge-gui/res/cardsfolder/g/gaeas_balance.txt b/forge-gui/res/cardsfolder/g/gaeas_balance.txt index 1c55a2292ca..c171c995cb5 100644 --- a/forge-gui/res/cardsfolder/g/gaeas_balance.txt +++ b/forge-gui/res/cardsfolder/g/gaeas_balance.txt @@ -7,6 +7,6 @@ SVar:DBMountain:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | Ch SVar:DBSwamp:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Swamp | SubAbility$ DBForest | Shuffle$ False SVar:DBForest:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Forest | SubAbility$ DBShuffle | Shuffle$ False SVar:DBShuffle:DB$ Shuffle -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/gaeas_balance.jpg Oracle:As an additional cost to cast Gaea's Balance, sacrifice five lands.\nSearch your library for a land card of each basic land type, put them onto the battlefield, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/g/gaeas_blessing.txt b/forge-gui/res/cardsfolder/g/gaeas_blessing.txt index 5b1b01d5e6d..419a3d17e30 100644 --- a/forge-gui/res/cardsfolder/g/gaeas_blessing.txt +++ b/forge-gui/res/cardsfolder/g/gaeas_blessing.txt @@ -6,6 +6,6 @@ SVar:DBChangeZone:DB$ ChangeZone | TargetMin$ 0 | TargetMax$ 3 | TargetsWithDefi SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. T:Mode$ ChangesZone | Origin$ Library | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME is put into your graveyard from your library, shuffle your graveyard into your library. SVar:TrigChange:DB$ ChangeZoneAll | ChangeType$ Card.YouOwn | Origin$ Graveyard | Destination$ Library | Shuffle$ True | SpellDescription$ Shuffle your graveyard into your library. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gaeas_blessing.jpg Oracle:Target player shuffles up to three target cards from their graveyard into their library.\nDraw a card.\nWhen Gaea's Blessing is put into your graveyard from your library, shuffle your graveyard into your library. diff --git a/forge-gui/res/cardsfolder/g/gaeas_liege.txt b/forge-gui/res/cardsfolder/g/gaeas_liege.txt index 815683424fb..3a3fc92e5d8 100644 --- a/forge-gui/res/cardsfolder/g/gaeas_liege.txt +++ b/forge-gui/res/cardsfolder/g/gaeas_liege.txt @@ -10,6 +10,6 @@ SVar:B:Count$Valid Card.Self+attacking SVar:Y:Count$Valid Forest.DefenderCtrl A:AB$ Animate | Cost$ T | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Forest | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | UntilHostLeavesPlay$ True | SpellDescription$ Target land becomes a Forest until CARDNAME leaves the battlefield. SVar:BuffedBy:Forest -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gaeas_liege.jpg Oracle:As long as Gaea's Liege isn't attacking, its power and toughness are each equal to the number of Forests you control. As long as Gaea's Liege is attacking, its power and toughness are each equal to the number of Forests defending player controls.\n{T}: Target land becomes a Forest until Gaea's Liege leaves the battlefield. diff --git a/forge-gui/res/cardsfolder/g/gaeas_might.txt b/forge-gui/res/cardsfolder/g/gaeas_might.txt index 44b6b32f3cd..c29dd114302 100644 --- a/forge-gui/res/cardsfolder/g/gaeas_might.txt +++ b/forge-gui/res/cardsfolder/g/gaeas_might.txt @@ -3,6 +3,6 @@ ManaCost:G Types:Instant A:SP$ Pump | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | NumDef$ +X | References$ X | SpellDescription$ Domain — Target creature gets +1/+1 until end of turn for each basic land type among lands you control. SVar:X:Count$Domain -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/gaeas_might.jpg Oracle:Domain — Target creature gets +1/+1 until end of turn for each basic land type among lands you control. diff --git a/forge-gui/res/cardsfolder/g/gainsay.txt b/forge-gui/res/cardsfolder/g/gainsay.txt index 9576543ebcf..299b3239080 100644 --- a/forge-gui/res/cardsfolder/g/gainsay.txt +++ b/forge-gui/res/cardsfolder/g/gainsay.txt @@ -2,6 +2,6 @@ Name:Gainsay ManaCost:1 U Types:Instant A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TgtPrompt$ Select target Blue spell | ValidTgts$ Card.Blue | SpellDescription$ Counter target blue spell. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/gainsay.jpg Oracle:Counter target blue spell. diff --git a/forge-gui/res/cardsfolder/g/gale_force.txt b/forge-gui/res/cardsfolder/g/gale_force.txt index 4023b3bcaf7..d517162a47a 100644 --- a/forge-gui/res/cardsfolder/g/gale_force.txt +++ b/forge-gui/res/cardsfolder/g/gale_force.txt @@ -2,6 +2,6 @@ Name:Gale Force ManaCost:4 G Types:Sorcery A:SP$ DamageAll | Cost$ 4 G | NumDmg$ 5 | ValidCards$ Creature.withFlying | ValidDescription$ each creature with flying. | SpellDescription$ CARDNAME deals 5 damage to each creature with flying. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/gale_force.jpg Oracle:Gale Force deals 5 damage to each creature with flying. diff --git a/forge-gui/res/cardsfolder/g/galepowder_mage.txt b/forge-gui/res/cardsfolder/g/galepowder_mage.txt index 00335f563ae..82e6f709a55 100644 --- a/forge-gui/res/cardsfolder/g/galepowder_mage.txt +++ b/forge-gui/res/cardsfolder/g/galepowder_mage.txt @@ -8,6 +8,6 @@ SVar:TrigExile:DB$ ChangeZone | ValidTgts$ Creature.Other | Mandatory$ True | Tg SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigBounce | TriggerDescription$ Return exiled creature to the battlefield. | RememberObjects$ Remembered | SubAbility$ DBCleanup SVar:TrigBounce:DB$ ChangeZone | Origin$ Exile | Destination$ Battlefield | Defined$ DelayTriggerRemembered SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/galepowder_mage.jpg Oracle:Flying\nWhenever Galepowder Mage attacks, exile another target creature. Return that card to the battlefield under its owner's control at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/g/gallowbraid.txt b/forge-gui/res/cardsfolder/g/gallowbraid.txt index 0904ec62697..be74605ab0b 100644 --- a/forge-gui/res/cardsfolder/g/gallowbraid.txt +++ b/forge-gui/res/cardsfolder/g/gallowbraid.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Horror PT:5/5 K:Trample K:Cumulative upkeep:PayLife<1>:Pay 1 life. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gallowbraid.jpg Oracle:Trample\nCumulative upkeep—Pay 1 life. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) diff --git a/forge-gui/res/cardsfolder/g/galvanic_key.txt b/forge-gui/res/cardsfolder/g/galvanic_key.txt index 82cece491c6..7dbc520d1a4 100644 --- a/forge-gui/res/cardsfolder/g/galvanic_key.txt +++ b/forge-gui/res/cardsfolder/g/galvanic_key.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact K:Flash A:AB$ Untap | Cost$ 3 T | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Untap target artifact. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/galvanic_key.jpg Oracle:Flash\n{3}, {T}: Untap target artifact. diff --git a/forge-gui/res/cardsfolder/g/gamble.txt b/forge-gui/res/cardsfolder/g/gamble.txt index 83a1d72dbde..97117b2b951 100644 --- a/forge-gui/res/cardsfolder/g/gamble.txt +++ b/forge-gui/res/cardsfolder/g/gamble.txt @@ -5,6 +5,6 @@ A:SP$ ChangeZone | Cost$ R | Origin$ Library | Destination$ Hand | ChangeType$ C SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ Random SVar:NeedsToPlayVar:Z GE2 SVar:Z:Count$InYourHand -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/gamble.jpg Oracle:Search your library for a card, put that card into your hand, discard a card at random, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/g/game_of_chaos.txt b/forge-gui/res/cardsfolder/g/game_of_chaos.txt index fb9605c5392..844cb7dcd9d 100644 --- a/forge-gui/res/cardsfolder/g/game_of_chaos.txt +++ b/forge-gui/res/cardsfolder/g/game_of_chaos.txt @@ -13,6 +13,6 @@ SVar:RememberOpp:DB$ Pump | RememberObjects$ Targeted SVar:DoubleLifeStake:DB$ StoreSVar | SVar$ NumLife | References$ NumLife | Type$ CountSVar | Expression$ NumLife/Times.2 SVar:DBRestore:DB$ StoreSVar | SVar$ NumLife | References$ NumLife | Type$ Number | Expression$ 1 SVar:NumLife:Number$1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/game_of_chaos.jpg Oracle:Flip a coin. If you win the flip, you gain 1 life and target opponent loses 1 life, and you decide whether to flip again. If you lose the flip, you lose 1 life and that opponent gains 1 life, and that player decides whether to flip again. Double the life stakes with each flip. diff --git a/forge-gui/res/cardsfolder/g/game_preserve.txt b/forge-gui/res/cardsfolder/g/game_preserve.txt index 907474b3843..230d16685c5 100644 --- a/forge-gui/res/cardsfolder/g/game_preserve.txt +++ b/forge-gui/res/cardsfolder/g/game_preserve.txt @@ -7,6 +7,6 @@ SVar:EachDig:DB$ Dig | Defined$ Remembered | DigNum$ 1 | Reveal$ True | NoMove$ SVar:GoToBattlefield:DB$ ChangeZoneAll | ChangeType$ Card.TopLibrary | Origin$ Library | Destination$ Battlefield | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$ValidLibrary Card.nonCreature+IsRemembered -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/game_preserve.jpg Oracle:At the beginning of your upkeep, each player reveals the top card of their library. If all cards revealed this way are creature cards, put those cards onto the battlefield under their owners' control. diff --git a/forge-gui/res/cardsfolder/g/gangrenous_goliath.txt b/forge-gui/res/cardsfolder/g/gangrenous_goliath.txt index 8137c207ce1..43bb5856bc3 100644 --- a/forge-gui/res/cardsfolder/g/gangrenous_goliath.txt +++ b/forge-gui/res/cardsfolder/g/gangrenous_goliath.txt @@ -3,6 +3,6 @@ ManaCost:3 B B Types:Creature Zombie Giant PT:4/4 A:AB$ ChangeZone | Cost$tapXType<3/Cleric> | Origin$ Graveyard | Destination$ Hand | ActivationZone$ Graveyard | SpellDescription$ Return CARDNAME from your graveyard to your hand. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/gangrenous_goliath.jpg Oracle:Tap three untapped Clerics you control: Return Gangrenous Goliath from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/g/gargantuan_gorilla.txt b/forge-gui/res/cardsfolder/g/gargantuan_gorilla.txt index 83fc946ce1b..c1ea1a5a0e3 100644 --- a/forge-gui/res/cardsfolder/g/gargantuan_gorilla.txt +++ b/forge-gui/res/cardsfolder/g/gargantuan_gorilla.txt @@ -12,6 +12,6 @@ A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature.Other | TgtPrompt$ Select targe SVar:DamageThis:DB$DealDamage | Defined$ Self | DamageSource$ Targeted | NumDmg$ Y | References$ Y SVar:X:Count$CardPower SVar:Y:Targeted$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gargantuan_gorilla.jpg Oracle:At the beginning of your upkeep, you may sacrifice a Forest. If you sacrifice a snow Forest this way, Gargantuan Gorilla gains trample until end of turn. If you don't sacrifice a Forest, sacrifice Gargantuan Gorilla and it deals 7 damage to you.\n{T}: Gargantuan Gorilla deals damage equal to its power to another target creature. That creature deals damage equal to its power to Gargantuan Gorilla. diff --git a/forge-gui/res/cardsfolder/g/gargoyle_sentinel.txt b/forge-gui/res/cardsfolder/g/gargoyle_sentinel.txt index be8f4381665..1387343abab 100644 --- a/forge-gui/res/cardsfolder/g/gargoyle_sentinel.txt +++ b/forge-gui/res/cardsfolder/g/gargoyle_sentinel.txt @@ -6,6 +6,6 @@ K:Defender A:AB$ Debuff | Cost$ 3 | Keywords$ Defender | Defined$ Self | SubAbility$ Flight | SpellDescription$ Until end of turn, CARDNAME loses defender and gains flying. SVar:Flight:DB$ Pump | Defined$ Self | KW$ Flying #The AI currently won't understand that this ability is actually a good thing to do. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gargoyle_sentinel.jpg Oracle:Defender (This creature can't attack.)\n{3}: Until end of turn, Gargoyle Sentinel loses defender and gains flying. diff --git a/forge-gui/res/cardsfolder/g/gate_smasher.txt b/forge-gui/res/cardsfolder/g/gate_smasher.txt index eae0d322c96..212b19472a4 100644 --- a/forge-gui/res/cardsfolder/g/gate_smasher.txt +++ b/forge-gui/res/cardsfolder/g/gate_smasher.txt @@ -5,6 +5,6 @@ Text:CARDNAME can be attached only to a creature with toughness 4 or greater. K:Equip:3 K:CantEquip:Creature.toughnessLT4 S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 3 | AddKeyword$ Trample | Description$ Equipped creature gets +3/+0 and has trample. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/gate_smasher.jpg Oracle:Gate Smasher can be attached only to a creature with toughness 4 or greater.\nEquipped creature gets +3/+0 and has trample.\nEquip {3} diff --git a/forge-gui/res/cardsfolder/g/gate_to_phyrexia.txt b/forge-gui/res/cardsfolder/g/gate_to_phyrexia.txt index 307e363bf30..287ccf45332 100644 --- a/forge-gui/res/cardsfolder/g/gate_to_phyrexia.txt +++ b/forge-gui/res/cardsfolder/g/gate_to_phyrexia.txt @@ -2,7 +2,7 @@ Name:Gate to Phyrexia ManaCost:B B Types:Enchantment A:AB$ Destroy | Cost$ Sac<1/Creature> | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | ActivationPhases$ Upkeep | ActivationLimit$ 1 | PlayerTurn$ True | SpellDescription$ Destroy target artifact. Activate this ability only during your upkeep and only once each turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/gate_to_phyrexia.jpg Oracle:Sacrifice a creature: Destroy target artifact. Activate this ability only during your upkeep and only once each turn. diff --git a/forge-gui/res/cardsfolder/g/gate_to_the_aether.txt b/forge-gui/res/cardsfolder/g/gate_to_the_aether.txt index 27a8178ceee..8bdff649078 100644 --- a/forge-gui/res/cardsfolder/g/gate_to_the_aether.txt +++ b/forge-gui/res/cardsfolder/g/gate_to_the_aether.txt @@ -3,6 +3,6 @@ ManaCost:6 Types:Artifact T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ TrigAetherDig | TriggerController$ TriggeredPlayer | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each player's upkeep, that player reveals the top card of their library. If it's an artifact, creature, enchantment, or land card, the player may put it onto the battlefield. SVar:TrigAetherDig:DB$ Dig | Defined$ TriggeredPlayer | DigNum$ 1 | Reveal$ True | DestinationZone$ Battlefield | DestinationZone2$ Library | LibraryPosition2$ 0 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Artifact,Creature,Enchantment,Land -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/gate_to_the_aether.jpg Oracle:At the beginning of each player's upkeep, that player reveals the top card of their library. If it's an artifact, creature, enchantment, or land card, the player may put it onto the battlefield. diff --git a/forge-gui/res/cardsfolder/g/gateway_shade.txt b/forge-gui/res/cardsfolder/g/gateway_shade.txt index 98f0a07cbc4..62df899466c 100644 --- a/forge-gui/res/cardsfolder/g/gateway_shade.txt +++ b/forge-gui/res/cardsfolder/g/gateway_shade.txt @@ -4,7 +4,7 @@ Types:Creature Shade PT:1/1 A:AB$ Pump | Cost$ B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. A:AB$ Pump | Cost$ tapXType<1/Gate> | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ CARDNAME gets +2/+2 until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Gate SVar:Picture:http://www.wizards.com/global/images/magic/general/gateway_shade.jpg Oracle:{B}: Gateway Shade gets +1/+1 until end of turn.\nTap an untapped Gate you control: Gateway Shade gets +2/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/g/gather_specimens.txt b/forge-gui/res/cardsfolder/g/gather_specimens.txt index 251d07c8c4c..7480e957e21 100644 --- a/forge-gui/res/cardsfolder/g/gather_specimens.txt +++ b/forge-gui/res/cardsfolder/g/gather_specimens.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Effect | Cost$ 3 U U U | Name$ Gather Specimens Effect | ReplacementEffects$ OppCreatEnters | SVars$ ETBYourCtrl | SpellDescription$ If a creature would enter the battlefield under an opponent's control this turn, it enters the battlefield under your control instead. SVar:OppCreatEnters:Event$ Moved | Destination$ Battlefield | ValidCard$ Creature.OppCtrl | ReplaceWith$ ETBYourCtrl | Description$ If a creature would enter the battlefield under an opponent's control this turn, it enters the battlefield under your control instead. SVar:ETBYourCtrl:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard | GainControl$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gather_specimens.jpg Oracle:If a creature would enter the battlefield under an opponent's control this turn, it enters the battlefield under your control instead. diff --git a/forge-gui/res/cardsfolder/g/gauntlet_of_might.txt b/forge-gui/res/cardsfolder/g/gauntlet_of_might.txt index 43285a2bedf..0c6c0efd3ad 100644 --- a/forge-gui/res/cardsfolder/g/gauntlet_of_might.txt +++ b/forge-gui/res/cardsfolder/g/gauntlet_of_might.txt @@ -4,7 +4,7 @@ Types:Artifact S:Mode$ Continuous | Affected$ Creature.Red | AddPower$ 1 | AddToughness$ 1 | Description$ Red creatures get +1/+1. T:Mode$ TapsForMana | ValidCard$ Mountain | Execute$ TrigMana | TriggerZones$ Battlefield | Static$ True | TriggerDescription$ Whenever a Mountain is tapped for mana, its controller adds an additional {R}. SVar:TrigMana:DB$ Mana | Produced$ R | Amount$ 1 | Defined$ TriggeredPlayer -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Red SVar:Picture:http://www.wizards.com/global/images/magic/general/gauntlet_of_might.jpg Oracle:Red creatures get +1/+1.\nWhenever a Mountain is tapped for mana, its controller adds an additional {R}. diff --git a/forge-gui/res/cardsfolder/g/gauntlets_of_chaos.txt b/forge-gui/res/cardsfolder/g/gauntlets_of_chaos.txt index 8d94fad66e9..6d5d5f43151 100644 --- a/forge-gui/res/cardsfolder/g/gauntlets_of_chaos.txt +++ b/forge-gui/res/cardsfolder/g/gauntlets_of_chaos.txt @@ -5,6 +5,6 @@ A:AB$ Pump | Cost$ 5 Sac<1/CARDNAME> | ValidTgts$ Artifact.YouCtrl,Creature.YouC SVar:DBExchange:DB$ ExchangeControl | Defined$ ParentTarget | ValidTgts$ Permanent.OppCtrl | TgtPrompt$ Select target permanent an opponent controls that shares one of those types | TargetsWithSharedTypes$ Artifact,Creature,Land | RememberExchanged$ True | SubAbility$ DBDestroyAll SVar:DBDestroyAll:DB$ DestroyAll | ValidCards$ Aura.AttachedTo Card.IsRemembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gauntlets_of_chaos.jpg Oracle:{5}, Sacrifice Gauntlets of Chaos: Exchange control of target artifact, creature, or land you control and target permanent an opponent controls that shares one of those types with it. If those permanents are exchanged this way, destroy all Auras attached to them. diff --git a/forge-gui/res/cardsfolder/g/gaze_of_granite.txt b/forge-gui/res/cardsfolder/g/gaze_of_granite.txt index 94d56bf5d04..a13c5d15c07 100644 --- a/forge-gui/res/cardsfolder/g/gaze_of_granite.txt +++ b/forge-gui/res/cardsfolder/g/gaze_of_granite.txt @@ -3,6 +3,6 @@ ManaCost:X B B G Types:Sorcery A:SP$ DestroyAll | Cost$ X B B G | ValidCards$ Permanent.nonLand+cmcLEX | References$ X | SpellDescription$ Destroy each nonland permanent with converted mana cost X or less. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gaze_of_granite.jpg Oracle:Destroy each nonland permanent with converted mana cost X or less. diff --git a/forge-gui/res/cardsfolder/g/gaze_of_pain.txt b/forge-gui/res/cardsfolder/g/gaze_of_pain.txt index 68900da2aad..9363e7e7cfc 100644 --- a/forge-gui/res/cardsfolder/g/gaze_of_pain.txt +++ b/forge-gui/res/cardsfolder/g/gaze_of_pain.txt @@ -6,6 +6,6 @@ SVar:TrigAttackerUnblocked:Mode$ AttackerUnblocked | ValidCard$ Creature.YouCtrl SVar:Damage:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | SubAbility$ DBPump | References$ X SVar:DBPump:DB$ Pump | Defined$ TriggeredAttacker | KW$ HIDDEN CARDNAME assigns no combat damage SVar:X:TriggeredAttacker$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gaze_of_pain.jpg Oracle:Until end of turn, whenever a creature you control attacks and isn't blocked, you may choose to have it deal damage equal to its power to a target creature. If you do, it assigns no combat damage this turn. diff --git a/forge-gui/res/cardsfolder/g/gelid_shackles.txt b/forge-gui/res/cardsfolder/g/gelid_shackles.txt index 9af89f63828..b53e146309c 100644 --- a/forge-gui/res/cardsfolder/g/gelid_shackles.txt +++ b/forge-gui/res/cardsfolder/g/gelid_shackles.txt @@ -6,7 +6,7 @@ A:SP$ Attach | Cost$ W | ValidTgts$ Creature | AILogic$ Curse S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddHiddenKeyword$ CARDNAME can't block. & CARDNAME's activated abilities can't be activated. | Description$ Enchanted creature can't block and its activated abilities can't be activated. A:AB$ Pump | Cost$ S | Defined$ Enchanted | KW$ Defender | IsCurse$ True | SpellDescription$ Enchanted creature gains defender until end of turn. # AI can now use snow mana to pay for activated abilities. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingAttachEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/gelid_shackles.jpg Oracle:Enchant creature\nEnchanted creature can't block, and its activated abilities can't be activated.\n{S}: Enchanted creature gains defender until end of turn. ({S} can be paid with one mana from a snow permanent.) diff --git a/forge-gui/res/cardsfolder/g/gem_of_becoming.txt b/forge-gui/res/cardsfolder/g/gem_of_becoming.txt index b0d1e61c077..36a166bdd9a 100644 --- a/forge-gui/res/cardsfolder/g/gem_of_becoming.txt +++ b/forge-gui/res/cardsfolder/g/gem_of_becoming.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ ChangeZone | Cost$ 3 T Sac<1/CARDNAME> | Origin$ Library | Destination$ Hand | ChangeType$ Island | ChangeNum$ 1 | SubAbility$ DBSwamp | SpellDescription$ Search your library for an Island card, a Swamp card, and a Mountain card. Reveal those cards and put them into your hand. Then shuffle your library. SVar:DBSwamp:DB$ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Swamp | ChangeNum$ 1 | SubAbility$ DBMountain SVar:DBMountain:DB$ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Mountain | ChangeNum$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$blue|black|red SVar:Picture:http://www.wizards.com/global/images/magic/general/gem_of_becoming.jpg Oracle:{3}, {T}, Sacrifice Gem of Becoming: Search your library for an Island card, a Swamp card, and a Mountain card. Reveal those cards and put them into your hand. Then shuffle your library. diff --git a/forge-gui/res/cardsfolder/g/gemstone_caverns.txt b/forge-gui/res/cardsfolder/g/gemstone_caverns.txt index 1d436da011a..e4a9f505840 100644 --- a/forge-gui/res/cardsfolder/g/gemstone_caverns.txt +++ b/forge-gui/res/cardsfolder/g/gemstone_caverns.txt @@ -9,6 +9,6 @@ A:AB$ Mana | Cost$ T | Produced$ C | ConditionCheckSVar$ CheckCounter | Conditio SVar:DBMana:DB$ Mana | Produced$ Any | ConditionCheckSVar$ CheckCounter | ConditionSVarCompare$ GE1 | References$ CheckCounter SVar:CheckCounter:Count$CardCounters.LUCK #TODO: The AI is not yet fully aware that this card can generate any color of mana at any time if it has a luck counter on it. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gemstone_caverns.jpg Oracle:If Gemstone Caverns is in your opening hand and you're not playing first, you may begin the game with Gemstone Caverns on the battlefield with a luck counter on it. If you do, exile a card from your hand.\n{T}: Add {C}. If Gemstone Caverns has a luck counter on it, instead add one mana of any color. diff --git a/forge-gui/res/cardsfolder/g/gemstone_mine.txt b/forge-gui/res/cardsfolder/g/gemstone_mine.txt index 673106ee112..e3f376b7e78 100644 --- a/forge-gui/res/cardsfolder/g/gemstone_mine.txt +++ b/forge-gui/res/cardsfolder/g/gemstone_mine.txt @@ -4,6 +4,6 @@ Types:Land K:etbCounter:MINING:3 A:AB$ Mana | Cost$ T SubCounter<1/MINING> | Produced$ Any | SubAbility$ DBSac | SpellDescription$ Add one mana of any color. If there are no mining counters on Gemstone Mine, sacrifice it. SVar:DBSac:DB$ Sacrifice | SacValid$ Self | ConditionPresent$ Card.Self+counters_EQ0_MINING -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/gemstone_mine.jpg Oracle:Gemstone Mine enters the battlefield with three mining counters on it.\n{T}, Remove a mining counter from Gemstone Mine: Add one mana of any color. If there are no mining counters on Gemstone Mine, sacrifice it. diff --git a/forge-gui/res/cardsfolder/g/generals_regalia.txt b/forge-gui/res/cardsfolder/g/generals_regalia.txt index 3ee6dcd6017..2b47fc6ae13 100644 --- a/forge-gui/res/cardsfolder/g/generals_regalia.txt +++ b/forge-gui/res/cardsfolder/g/generals_regalia.txt @@ -8,6 +8,6 @@ SVar:GeneralDmg:DB$ ReplaceEffect | VarName$ Affected | VarValue$ Remembered | V SVar:OutOfSight:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Defined$ Imprinted | Execute$ ExileEffect | Static$ True SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile | Static$ True SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/generals_regalia.jpg Oracle:{3}: The next time a source of your choice would deal damage to you this turn, that damage is dealt to target creature you control instead. diff --git a/forge-gui/res/cardsfolder/g/generator_servant.txt b/forge-gui/res/cardsfolder/g/generator_servant.txt index 574a30f4d78..0254bd8c813 100644 --- a/forge-gui/res/cardsfolder/g/generator_servant.txt +++ b/forge-gui/res/cardsfolder/g/generator_servant.txt @@ -3,6 +3,6 @@ ManaCost:1 R Types:Creature Elemental PT:2/1 A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ C | Amount$ 2 | AddsKeywords$ Haste | AddsKeywordsType$ Creature | AddsKeywordsUntil$ UntilEOT | SpellDescription$ Add {C}{C}. If that mana is spent on a creature spell, it gains haste until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/generator_servant.jpg Oracle:{T}, Sacrifice Generator Servant: Add {C}{C}. If that mana is spent on a creature spell, it gains haste until end of turn. (That creature can attack and {T} as soon as it comes under your control.) diff --git a/forge-gui/res/cardsfolder/g/genesis_chamber.txt b/forge-gui/res/cardsfolder/g/genesis_chamber.txt index 5172596d000..28885615f26 100644 --- a/forge-gui/res/cardsfolder/g/genesis_chamber.txt +++ b/forge-gui/res/cardsfolder/g/genesis_chamber.txt @@ -3,7 +3,7 @@ ManaCost:2 Types:Artifact T:Mode$ ChangesZone | ValidPlayer$ Player | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonToken | TriggerZones$ Battlefield | Execute$ TrigToken | IsPresent$ Card.Self+untapped | TriggerDescription$ Whenever a nontoken creature enters the battlefield, if CARDNAME is untapped, that creature's controller creates a 1/1 colorless Myr artifact creature token. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenOwner$ TriggeredCardController | TokenName$ Myr | TokenTypes$ Artifact,Creature,Myr | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Create a 1/1 Myr artifact creature token. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHas:Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/genesis_chamber.jpg Oracle:Whenever a nontoken creature enters the battlefield, if Genesis Chamber is untapped, that creature's controller creates a 1/1 colorless Myr artifact creature token. diff --git a/forge-gui/res/cardsfolder/g/geothermal_crevice.txt b/forge-gui/res/cardsfolder/g/geothermal_crevice.txt index a8b0827e812..7fac1aecded 100644 --- a/forge-gui/res/cardsfolder/g/geothermal_crevice.txt +++ b/forge-gui/res/cardsfolder/g/geothermal_crevice.txt @@ -4,6 +4,6 @@ Types:Land K:CARDNAME enters the battlefield tapped. A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ B G | SpellDescription$ Add {B}{G}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/geothermal_crevice.jpg Oracle:Geothermal Crevice enters the battlefield tapped.\n{T}: Add {R}.\n{T}, Sacrifice Geothermal Crevice: Add {B}{G}. diff --git a/forge-gui/res/cardsfolder/g/ghave_guru_of_spores.txt b/forge-gui/res/cardsfolder/g/ghave_guru_of_spores.txt index 3ce16f79552..60777114562 100644 --- a/forge-gui/res/cardsfolder/g/ghave_guru_of_spores.txt +++ b/forge-gui/res/cardsfolder/g/ghave_guru_of_spores.txt @@ -5,7 +5,7 @@ PT:0/0 K:etbCounter:P1P1:5 A:AB$ Token | Cost$ 1 SubCounter<1/P1P1/Creature.YouCtrl/Creature you Control> | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Create a 1/1 green Saproling creature token. A:AB$ PutCounter | Cost$ 1 Sac<1/Creature> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHas:Ability$Counters & Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/ghave_guru_of_spores.jpg Oracle:Ghave, Guru of Spores enters the battlefield with five +1/+1 counters on it.\n{1}, Remove a +1/+1 counter from a creature you control: Create a 1/1 green Saproling creature token.\n{1}, Sacrifice a creature: Put a +1/+1 counter on target creature. diff --git a/forge-gui/res/cardsfolder/g/ghazban_ogre.txt b/forge-gui/res/cardsfolder/g/ghazban_ogre.txt index eace18c6780..2757db28e51 100644 --- a/forge-gui/res/cardsfolder/g/ghazban_ogre.txt +++ b/forge-gui/res/cardsfolder/g/ghazban_ogre.txt @@ -4,6 +4,6 @@ Types:Creature Ogre PT:2/2 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | APlayerHasMoreLifeThanEachOther$ True | Execute$ TrigOppControl | TriggerDescription$ At the beginning of your upkeep, if a player has more life than each other player, the player with the most life gains control of CARDNAME. SVar:TrigOppControl:DB$ GainControl | Defined$ Self | NewController$ Player.withMostLife -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ghazban_ogre.jpg Oracle:At the beginning of your upkeep, if a player has more life than each other player, the player with the most life gains control of Ghazban Ogre. diff --git a/forge-gui/res/cardsfolder/g/ghirapur_aether_grid.txt b/forge-gui/res/cardsfolder/g/ghirapur_aether_grid.txt index 47c39e2d250..635f9d93b62 100644 --- a/forge-gui/res/cardsfolder/g/ghirapur_aether_grid.txt +++ b/forge-gui/res/cardsfolder/g/ghirapur_aether_grid.txt @@ -2,6 +2,6 @@ Name:Ghirapur Aether Grid ManaCost:2 R Types:Enchantment A:AB$ DealDamage | Cost$ tapXType<2/Artifact> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to any target. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ghirapur_aether_grid.jpg Oracle:Tap two untapped artifacts you control: Ghirapur Aether Grid deals 1 damage to any target. diff --git a/forge-gui/res/cardsfolder/g/ghost_quarter.txt b/forge-gui/res/cardsfolder/g/ghost_quarter.txt index 42757b2ffbd..e3602563add 100644 --- a/forge-gui/res/cardsfolder/g/ghost_quarter.txt +++ b/forge-gui/res/cardsfolder/g/ghost_quarter.txt @@ -4,6 +4,6 @@ Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Destroy | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Land | TgtPrompt$ Select target land. | SubAbility$ DBChange | AILogic$ GhostQuarter | AITgts$ Land.nonBasic | SpellDescription$ Destroy target land. Its controller may search their library for a basic land card, put it onto the battlefield, then shuffle their library. SVar:DBChange:DB$ChangeZone | Optional$ True | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | ChangeNum$ 1 | DefinedPlayer$ TargetedController | ShuffleNonMandatory$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ghost_quarter.jpg Oracle:{T}: Add {C}.\n{T}, Sacrifice Ghost Quarter: Destroy target land. Its controller may search their library for a basic land card, put it onto the battlefield, then shuffle their library. diff --git a/forge-gui/res/cardsfolder/g/ghost_tactician.txt b/forge-gui/res/cardsfolder/g/ghost_tactician.txt index 4774b668770..48b987720fa 100644 --- a/forge-gui/res/cardsfolder/g/ghost_tactician.txt +++ b/forge-gui/res/cardsfolder/g/ghost_tactician.txt @@ -3,6 +3,6 @@ ManaCost:4 W Types:Creature Spirit Spellshaper PT:2/5 A:AB$ PumpAll | Cost$ W T Discard<1/Card> | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | SpellDescription$ Creatures you control get +1/+0 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ghost_tactician.jpg Oracle:{W}, {T}, Discard a card: Creatures you control get +1/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/g/ghostform.txt b/forge-gui/res/cardsfolder/g/ghostform.txt index 6120c0a0d4a..58c1ae8ad15 100644 --- a/forge-gui/res/cardsfolder/g/ghostform.txt +++ b/forge-gui/res/cardsfolder/g/ghostform.txt @@ -2,6 +2,6 @@ Name:Ghostform ManaCost:1 U Types:Sorcery A:SP$ Pump | Cost$ 1 U | ValidTgts$ Creature | KW$ HIDDEN Unblockable | AILogic$ Pump | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Select up to two target creatures | SpellDescription$ Up to two target creatures can't be blocked this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ghostform.jpg Oracle:Up to two target creatures can't be blocked this turn. diff --git a/forge-gui/res/cardsfolder/g/ghostly_flicker.txt b/forge-gui/res/cardsfolder/g/ghostly_flicker.txt index 95009d64f6b..c6e081e5436 100644 --- a/forge-gui/res/cardsfolder/g/ghostly_flicker.txt +++ b/forge-gui/res/cardsfolder/g/ghostly_flicker.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ ChangeZone | Cost$ 2 U | ValidTgts$ Artifact.YouCtrl,Creature.YouCtrl,Land.YouCtrl | TargetMin$ 2 | TargetMax$ 2 | TgtPrompt$ Select 2 target artifacts, creatures, or lands that you control | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBReturn | SpellDescription$ Exile two target artifacts, creatures and/or lands you control, then return those cards to the battlefield under your control. SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | GainControl$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ghostly_flicker.jpg Oracle:Exile two target artifacts, creatures, and/or lands you control, then return those cards to the battlefield under your control. diff --git a/forge-gui/res/cardsfolder/g/ghostly_possession.txt b/forge-gui/res/cardsfolder/g/ghostly_possession.txt index e41d6b58c83..f0b79f8cdc9 100644 --- a/forge-gui/res/cardsfolder/g/ghostly_possession.txt +++ b/forge-gui/res/cardsfolder/g/ghostly_possession.txt @@ -4,6 +4,6 @@ Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ 2 W | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Flying & Prevent all combat damage that would be dealt to and dealt by CARDNAME. | Description$ Enchanted creature has flying. Prevent all combat damage that would be dealt to and dealt by enchanted creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ghostly_possession.jpg Oracle:Enchant creature\nEnchanted creature has flying.\nPrevent all combat damage that would be dealt to and dealt by enchanted creature. diff --git a/forge-gui/res/cardsfolder/g/ghostly_touch.txt b/forge-gui/res/cardsfolder/g/ghostly_touch.txt index 3ca5d96f50b..bec8b280250 100644 --- a/forge-gui/res/cardsfolder/g/ghostly_touch.txt +++ b/forge-gui/res/cardsfolder/g/ghostly_touch.txt @@ -6,6 +6,6 @@ A:SP$ Attach | Cost$ 1 U | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddTrigger$ AttackTrigger | AddSVar$ TrigTapUnTap | Description$ Enchanted creature has "Whenever this creature attacks, you may tap or untap target permanent. SVar:AttackTrigger:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigTapUnTap | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME attacks, you may tap or untap target permanent. SVar:TrigTapUnTap:DB$ TapOrUntap | ValidTgts$ Permanent | TgtPrompt$ Select target permanent -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ghostly_touch.jpg Oracle:Enchant creature\nEnchanted creature has "Whenever this creature attacks, you may tap or untap target permanent." diff --git a/forge-gui/res/cardsfolder/g/ghosts_of_the_innocent.txt b/forge-gui/res/cardsfolder/g/ghosts_of_the_innocent.txt index 3052274f6ee..049aeb78c06 100644 --- a/forge-gui/res/cardsfolder/g/ghosts_of_the_innocent.txt +++ b/forge-gui/res/cardsfolder/g/ghosts_of_the_innocent.txt @@ -6,5 +6,5 @@ R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Player,Permanent | SVar:DmgHalfDown:DB$ ReplaceEffect | VarName$ DamageAmount | VarValue$ X | References$ X SVar:X:ReplaceCount$DamageAmount/HalfDown SVar:Picture:http://www.wizards.com/global/images/magic/general/ghosts_of_the_innocent.jpg -SVar:RemRandomDeck:True +AI:RemoveDeck:Random Oracle:If a source would deal damage to a permanent or player, it deals half that damage, rounded down, to that permanent or player instead. diff --git a/forge-gui/res/cardsfolder/g/ghostway.txt b/forge-gui/res/cardsfolder/g/ghostway.txt index e4a02d2e18f..bbe178c4f67 100644 --- a/forge-gui/res/cardsfolder/g/ghostway.txt +++ b/forge-gui/res/cardsfolder/g/ghostway.txt @@ -5,6 +5,6 @@ A:SP$ ChangeZoneAll | Cost$ 2 W | ChangeType$ Creature.YouCtrl | Origin$ Battlef SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigGhostReturn | TriggerDescription$ Return exiled creatures to the battlefield. | RememberObjects$ Remembered | SubAbility$ DBCleanup SVar:TrigGhostReturn:DB$ ChangeZone | Defined$ DelayTriggerRemembered | Origin$ Exile | Destination$ Battlefield SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ghostway.jpg Oracle:Exile each creature you control. Return those cards to the battlefield under their owner's control at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/g/ghoulcaller_gisa.txt b/forge-gui/res/cardsfolder/g/ghoulcaller_gisa.txt index 36239220be2..e2c5dfb57dc 100644 --- a/forge-gui/res/cardsfolder/g/ghoulcaller_gisa.txt +++ b/forge-gui/res/cardsfolder/g/ghoulcaller_gisa.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Human Wizard PT:3/4 A:AB$ Token | Cost$ B T Sac<1/Creature.Other/another creature> | TokenAmount$ X | TokenName$ Zombie | TokenTypes$ Creature,Zombie | TokenOwner$ You | TokenPower$ 2 | TokenToughness$ 2 | TokenImage$ b 2 2 zombie C14 | TokenColors$ Black | References$ X | SpellDescription$ Create X 2/2 black Zombie creature tokens, where X is the sacrificed creature's power. SVar:X:Sacrificed$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ghoulcaller_gisa.jpg Oracle:{B}, {T}, Sacrifice another creature: Create X 2/2 black Zombie creature tokens, where X is the sacrificed creature's power. diff --git a/forge-gui/res/cardsfolder/g/ghoulcallers_bell.txt b/forge-gui/res/cardsfolder/g/ghoulcallers_bell.txt index ee354455f8c..fc60749e81e 100644 --- a/forge-gui/res/cardsfolder/g/ghoulcallers_bell.txt +++ b/forge-gui/res/cardsfolder/g/ghoulcallers_bell.txt @@ -2,6 +2,6 @@ Name:Ghoulcaller's Bell ManaCost:1 Types:Artifact A:AB$ Mill | Cost$ T | NumCards$ 1 | Defined$ Player | SpellDescription$ Each player puts the top card of their library into their graveyard. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ghoulcallers_bell.jpg Oracle:{T}: Each player puts the top card of their library into their graveyard. diff --git a/forge-gui/res/cardsfolder/g/ghoulcallers_chant.txt b/forge-gui/res/cardsfolder/g/ghoulcallers_chant.txt index b6839aea483..f6ad01aac0e 100644 --- a/forge-gui/res/cardsfolder/g/ghoulcallers_chant.txt +++ b/forge-gui/res/cardsfolder/g/ghoulcallers_chant.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ Charm | Cost$ B | CharmNum$ 1 | Choices$ DBChangeZone1,DBChangeZone2 SVar:DBChangeZone1:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | Mandatory$ True | TgtPrompt$ Select target creature card in your graveyard | ValidTgts$ Creature.YouOwn | SpellDescription$ Return target creature card from your graveyard to your hand. SVar:DBChangeZone2:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | Mandatory$ True | TgtPrompt$ Select two target Zombie cards in your graveyard | ValidTgts$ Zombie.YouOwn | TargetMin$ 2 | TargetMax$ 2 | SpellDescription$ Return two target Zombie cards from your graveyard to your hand. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ghoulcallers_chant.jpg Oracle:Choose one —\n• Return target creature card from your graveyard to your hand.\n• Return two target Zombie cards from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/g/giant_caterpillar.txt b/forge-gui/res/cardsfolder/g/giant_caterpillar.txt index e885561d115..b775a7bf7ce 100644 --- a/forge-gui/res/cardsfolder/g/giant_caterpillar.txt +++ b/forge-gui/res/cardsfolder/g/giant_caterpillar.txt @@ -4,6 +4,6 @@ Types:Creature Insect PT:3/3 A:AB$ DelayedTrigger | Cost$ G Sac<1/CARDNAME> | Mode$ Phase | Phase$ End of Turn | Execute$ TrigToken | SpellDescription$ Create a 1/1 green Insect creature token with flying named Butterfly at the beginning of the next end step. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenName$ Butterfly | TokenTypes$ Creature,Insect | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/giant_caterpillar.jpg Oracle:{G}, Sacrifice Giant Caterpillar: Create a 1/1 green Insect creature token with flying named Butterfly at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/g/giant_harbinger.txt b/forge-gui/res/cardsfolder/g/giant_harbinger.txt index b4e55cd09a8..2ab28a23408 100644 --- a/forge-gui/res/cardsfolder/g/giant_harbinger.txt +++ b/forge-gui/res/cardsfolder/g/giant_harbinger.txt @@ -4,6 +4,6 @@ Types:Creature Giant Shaman PT:3/4 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for a Giant card, reveal it, then shuffle your library and put that card on top of it. SVar:TrigChange:DB$ ChangeZone | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Card.Giant | ChangeNum$ 1 | ShuffleNonMandatory$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/giant_harbinger.jpg Oracle:When Giant Harbinger enters the battlefield, you may search your library for a Giant card, reveal it, then shuffle your library and put that card on top of it. diff --git a/forge-gui/res/cardsfolder/g/giant_oyster.txt b/forge-gui/res/cardsfolder/g/giant_oyster.txt index 35799279d08..b34e27aef6e 100644 --- a/forge-gui/res/cardsfolder/g/giant_oyster.txt +++ b/forge-gui/res/cardsfolder/g/giant_oyster.txt @@ -12,6 +12,6 @@ T:Mode$ Untaps | TriggerZones$ Battlefield | ValidCard$ Card.Self | Execute$ Rem T:Mode$ ChangesZone | TriggerZones$ Battlefield | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ RemoveCounters | Secondary$ True | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME leaves the battlefield or becomes untapped, remove all -1/-1 counters from the creature. SVar:RemoveCounters:DB$ RemoveCounter | Defined$ Creature.IsRemembered | CounterType$ M1M1 | CounterNum$ All | SubAbility$ ClearRemembered SVar:ClearRemembered:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/giant_oyster.jpg Oracle:You may choose not to untap Giant Oyster during your untap step.\n{T}: For as long as Giant Oyster remains tapped, target tapped creature doesn't untap during its controller's untap step, and at the beginning of each of your draw steps, put a -1/-1 counter on that creature. When Giant Oyster leaves the battlefield or becomes untapped, remove all -1/-1 counters from the creature. diff --git a/forge-gui/res/cardsfolder/g/giant_slug.txt b/forge-gui/res/cardsfolder/g/giant_slug.txt index e1a14c2b5eb..d66f8f79a90 100644 --- a/forge-gui/res/cardsfolder/g/giant_slug.txt +++ b/forge-gui/res/cardsfolder/g/giant_slug.txt @@ -5,6 +5,6 @@ PT:1/1 A:AB$ DelayedTrigger | Cost$ 5 | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ ChooseB | RememberObjects$ Self | StackDescription$ SpellDescription | SpellDescription$ At the beginning of your next upkeep, choose a basic land type. CARDNAME gains landwalk of the chosen type until the end of that turn. SVar:ChooseB:DB$ ChooseType | Defined$ You | Type$ Basic Land | AILogic$ ChosenLandwalk | SubAbility$ DBPump SVar:DBPump:DB$ Pump | Defined$ DelayTriggerRemembered | KW$ ChosenTypewalk | DefinedKW$ ChosenType | ConditionDefined$ DelayTriggerRemembered | ConditionPresent$ Card.StrictlySelf -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/giant_slug.jpg Oracle:{5}: At the beginning of your next upkeep, choose a basic land type. Giant Slug gains landwalk of the chosen type until the end of that turn. diff --git a/forge-gui/res/cardsfolder/g/giant_trap_door_spider.txt b/forge-gui/res/cardsfolder/g/giant_trap_door_spider.txt index 1fb9d8ba0ef..6945f014503 100644 --- a/forge-gui/res/cardsfolder/g/giant_trap_door_spider.txt +++ b/forge-gui/res/cardsfolder/g/giant_trap_door_spider.txt @@ -4,6 +4,6 @@ Types:Creature Spider PT:2/3 A:AB$ ChangeZone | Cost$ 1 R G T | ValidTgts$ Creature.attackingYou+withoutFlying | TgtPrompt$ Select target creature without flying that's attacking you | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile CARDNAME and target creature without flying that's attacking you. | SubAbility$ ExileME SVar:ExileME:DB$ChangeZone | Origin$ Battlefield | Destination$ Exile | Defined$ Self -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/giant_trap_door_spider.jpg Oracle:{1}{R}{G}, {T}: Exile Giant Trap Door Spider and target creature without flying that's attacking you. diff --git a/forge-gui/res/cardsfolder/g/giants_ire.txt b/forge-gui/res/cardsfolder/g/giants_ire.txt index d1ad63f483b..8cc321e317a 100644 --- a/forge-gui/res/cardsfolder/g/giants_ire.txt +++ b/forge-gui/res/cardsfolder/g/giants_ire.txt @@ -3,6 +3,6 @@ ManaCost:3 R Types:Tribal Sorcery Giant A:SP$ DealDamage | Cost$ 3 R | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | NumDmg$ 4 | SubAbility$ DBDraw | SpellDescription$ CARDNAME deals 4 damage to target player or planeswalker. If you control a Giant, draw a card. SVar:DBDraw:DB$Draw | NumCards$ 1 | ConditionPresent$ Giant.YouCtrl | ConditionCompare$ GE1 | ConditionDescription$ If you control a Giant, -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/giants_ire.jpg Oracle:Giant's Ire deals 4 damage to target player or planeswalker. If you control a Giant, draw a card. diff --git a/forge-gui/res/cardsfolder/g/gibbering_descent.txt b/forge-gui/res/cardsfolder/g/gibbering_descent.txt index ced3222b79b..ad5049de72a 100644 --- a/forge-gui/res/cardsfolder/g/gibbering_descent.txt +++ b/forge-gui/res/cardsfolder/g/gibbering_descent.txt @@ -6,6 +6,6 @@ S:Mode$ Continuous | Affected$ You | Condition$ Hellbent | AddKeyword$ Skip your T:Mode$ Phase | Phase$ Upkeep | Execute$ TrigLoseLifeDiscard | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each player's upkeep, that player loses 1 life and discards a card. SVar:TrigLoseLifeDiscard:DB$LoseLife | Defined$ TriggeredPlayer | LifeAmount$ 1 | SubAbility$ DBDiscard SVar:DBDiscard:DB$Discard | Defined$ TriggeredPlayer | NumCards$ 1 | Mode$ TgtChoose -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gibbering_descent.jpg Oracle:At the beginning of each player's upkeep, that player loses 1 life and discards a card.\nHellbent — Skip your upkeep step if you have no cards in hand.\nMadness {2}{B}{B} (If you discard this card, discard it into exile. When you do, cast it for its madness cost or put it into your graveyard.) \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/g/gideon_champion_of_justice.txt b/forge-gui/res/cardsfolder/g/gideon_champion_of_justice.txt index 33fc226de67..8a975973feb 100644 --- a/forge-gui/res/cardsfolder/g/gideon_champion_of_justice.txt +++ b/forge-gui/res/cardsfolder/g/gideon_champion_of_justice.txt @@ -8,6 +8,6 @@ SVar:GideonPrevent:DB$ Pump | Defined$ Self | KW$ Prevent all damage that would A:AB$ ChangeZoneAll | Cost$ SubCounter<15/LOYALTY> | ChangeType$ Permanent.Other | ValidDescription$ other permanent | Origin$ Battlefield | Destination$ Exile | Planeswalker$ True | Ultimate$ True | SpellDescription$ Exile all other permanents. SVar:X:TargetedPlayer$CreaturesInPlay SVar:GideonPT:Count$CardCounters.LOYALTY -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gideon_champion_of_justice.jpg Oracle:[+1]: Put a loyalty counter on Gideon, Champion of Justice for each creature target opponent controls.\n[0]: Until end of turn, Gideon, Champion of Justice becomes a Human Soldier creature with power and toughness each equal to the number of loyalty counters on him and gains indestructible. He's still a planeswalker. Prevent all damage that would be dealt to him this turn.\n[-15]: Exile all other permanents. diff --git a/forge-gui/res/cardsfolder/g/gideon_jura.txt b/forge-gui/res/cardsfolder/g/gideon_jura.txt index cb08882c978..979181d189a 100644 --- a/forge-gui/res/cardsfolder/g/gideon_jura.txt +++ b/forge-gui/res/cardsfolder/g/gideon_jura.txt @@ -7,6 +7,6 @@ A:AB$ Destroy | Cost$ SubCounter<2/LOYALTY> | ValidTgts$ Creature.tapped | TgtPr A:AB$ Animate | Cost$ AddCounter<0/LOYALTY> | Defined$ Self | Power$ 6 | Toughness$ 6 | Types$ Creature,Human,Soldier | SubAbility$ DBPrevent | Planeswalker$ True | Ultimate$ True | SpellDescription$ Until end of turn, CARDNAME becomes a 6/6 Human Soldier creature that's still a planeswalker. Prevent all damage that would be dealt to him this turn. SVar:DBPrevent:DB$ Pump | Defined$ Self | KW$ Prevent all damage that would be dealt to CARDNAME. #restriction logic will need to be added to Human declare attackers for this to be OK for the AI to use -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gideon_jura.jpg Oracle:[+2]: During target opponent's next turn, creatures that player controls attack Gideon Jura if able.\n[-2]: Destroy target tapped creature.\n[0]: Until end of turn, Gideon Jura becomes a 6/6 Human Soldier creature that's still a planeswalker. Prevent all damage that would be dealt to him this turn. diff --git a/forge-gui/res/cardsfolder/g/gideons_defeat.txt b/forge-gui/res/cardsfolder/g/gideons_defeat.txt index fa24cdba1c2..2c93bdbb6d7 100644 --- a/forge-gui/res/cardsfolder/g/gideons_defeat.txt +++ b/forge-gui/res/cardsfolder/g/gideons_defeat.txt @@ -3,6 +3,6 @@ ManaCost:W Types:Instant A:SP$ ChangeZone | Cost$ W | ValidTgts$ Creature.White+attacking,Creature.White+blocking | TgtPrompt$ Select target white creature that's attacking or blocking | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBGainLife | SpellDescription$ Exile target white creature that's attacking or blocking. If it was a Gideon planeswalker, you gain 5 life. SVar:DBGainLife:DB$GainLife | LifeAmount$ 5 | ConditionDefined$ Targeted | ConditionPresent$ Planeswalker.Gideon -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/gideons_defeat.jpg Oracle:Exile target white creature that's attacking or blocking. If it was a Gideon planeswalker, you gain 5 life. diff --git a/forge-gui/res/cardsfolder/g/gideons_intervention.txt b/forge-gui/res/cardsfolder/g/gideons_intervention.txt index 1de35a02ed2..c95385c505a 100644 --- a/forge-gui/res/cardsfolder/g/gideons_intervention.txt +++ b/forge-gui/res/cardsfolder/g/gideons_intervention.txt @@ -5,6 +5,6 @@ K:ETBReplacement:Other:DBNameCard SVar:DBNameCard:DB$ NameCard | Defined$ You | SpellDescription$ As CARDNAME enters the battlefield, name a card. S:Mode$ CantBeCast | ValidCard$ Card.NamedCard+nonLand | Caster$ Opponent | Description$ Your opponents can't cast spells with the chosen name. R:Event$ DamageDone | ActiveZones$ Battlefield | Prevent$ True | ValidTarget$ You,Permanent.YouCtrl | ValidSource$ Card.NamedCard | Description$ Prevent all damage that would be dealt to you and permanents you control by sources with the chosen name. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/gideons_intervention.jpg Oracle:As Gideon's Intervention enters the battlefield, choose a card name.\nYour opponents can't cast spells with the chosen name.\nPrevent all damage that would be dealt to you and permanents you control by sources with the chosen name. diff --git a/forge-gui/res/cardsfolder/g/gift_of_tusks.txt b/forge-gui/res/cardsfolder/g/gift_of_tusks.txt index 8c902100744..e695740f1a6 100644 --- a/forge-gui/res/cardsfolder/g/gift_of_tusks.txt +++ b/forge-gui/res/cardsfolder/g/gift_of_tusks.txt @@ -2,6 +2,6 @@ Name:Gift of Tusks ManaCost:U Types:Instant A:SP$ Animate | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Power$ 3 | Toughness$ 3 | RemoveAllAbilities$ True | Colors$ Green | OverwriteColors$ True | Types$ Elephant | RemoveCreatureTypes$ True | SpellDescription$ Until end of turn, target creature loses all abilities and becomes a green Elephant with base power and toughness 3/3. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gift_of_tusks.jpg Oracle:Until end of turn, target creature loses all abilities and becomes a green Elephant with base power and toughness 3/3. diff --git a/forge-gui/res/cardsfolder/g/gilded_light.txt b/forge-gui/res/cardsfolder/g/gilded_light.txt index 208ae3a7a79..9e2c423995e 100644 --- a/forge-gui/res/cardsfolder/g/gilded_light.txt +++ b/forge-gui/res/cardsfolder/g/gilded_light.txt @@ -3,6 +3,6 @@ ManaCost:1 W Types:Instant A:SP$ Pump | Cost$ 1 W | Defined$ You | KW$ Shroud | SpellDescription$ You gain shroud until end of turn. (You can't be the target of spells or abilities.) K:Cycling:2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gilded_light.jpg Oracle:You gain shroud until end of turn. (You can't be the target of spells or abilities.)\nCycling {2} ({2}, Discard this card: Draw a card.) diff --git a/forge-gui/res/cardsfolder/g/gilt_leaf_palace.txt b/forge-gui/res/cardsfolder/g/gilt_leaf_palace.txt index 0cc9accd232..c737166e1d2 100644 --- a/forge-gui/res/cardsfolder/g/gilt_leaf_palace.txt +++ b/forge-gui/res/cardsfolder/g/gilt_leaf_palace.txt @@ -3,7 +3,7 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random K:ETBReplacement:Other:DBTap SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ Reveal<1/Elf> | UnlessPayer$ You | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may reveal an Elf card from your hand. If you don't, CARDNAME enters the battlefield tapped. SVar:Picture:http://www.wizards.com/global/images/magic/general/gilt_leaf_palace.jpg diff --git a/forge-gui/res/cardsfolder/g/gitaxian_probe.txt b/forge-gui/res/cardsfolder/g/gitaxian_probe.txt index 8b63d1aaa2d..21e41bccbf8 100644 --- a/forge-gui/res/cardsfolder/g/gitaxian_probe.txt +++ b/forge-gui/res/cardsfolder/g/gitaxian_probe.txt @@ -3,6 +3,6 @@ ManaCost:PU Types:Sorcery A:SP$ RevealHand | Cost$ PU | ValidTgts$ Player | TgtPrompt$ Select target player | SubAbility$ DBDraw | AIPhyrexianPayment$ Never | SpellDescription$ Look at target player's hand. SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gitaxian_probe.jpg Oracle:({P/U} can be paid with either {U} or 2 life.)\nLook at target player's hand.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/g/give_take.txt b/forge-gui/res/cardsfolder/g/give_take.txt index adf4564548b..b9866386431 100644 --- a/forge-gui/res/cardsfolder/g/give_take.txt +++ b/forge-gui/res/cardsfolder/g/give_take.txt @@ -17,5 +17,5 @@ A:SP$ RemoveCounter | Cost$ 2 U | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Selec SVar:DBDraw:DB$ Draw | NumCards$ X | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$RememberedSize -SVar:RemAIDeck:True +AI:RemoveDeck:All Oracle:Remove all +1/+1 counters from target creature you control. Draw that many cards.\nFuse (You may cast one or both halves of this card from your hand.) diff --git a/forge-gui/res/cardsfolder/g/glacial_chasm.txt b/forge-gui/res/cardsfolder/g/glacial_chasm.txt index 423765ddfe5..68a3d4f2290 100644 --- a/forge-gui/res/cardsfolder/g/glacial_chasm.txt +++ b/forge-gui/res/cardsfolder/g/glacial_chasm.txt @@ -6,7 +6,7 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigSac:DB$Sacrifice | SacValid$ Land | ChangeNum$ 1 S:Mode$ CantAttack | ValidCard$ Creature.YouCtrl | Description$ Creatures you control can't attack. R:Event$ DamageDone | ActiveZones$ Battlefield | Prevent$ True | ValidTarget$ You | Description$ Prevent all damage that would be dealt to you. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/glacial_chasm.jpg Oracle:Cumulative upkeep—Pay 2 life. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nWhen Glacial Chasm enters the battlefield, sacrifice a land.\nCreatures you control can't attack.\nPrevent all damage that would be dealt to you. diff --git a/forge-gui/res/cardsfolder/g/glacial_crasher.txt b/forge-gui/res/cardsfolder/g/glacial_crasher.txt index 81cc3bc89d4..58c7b309dc6 100644 --- a/forge-gui/res/cardsfolder/g/glacial_crasher.txt +++ b/forge-gui/res/cardsfolder/g/glacial_crasher.txt @@ -5,7 +5,7 @@ PT:5/5 K:Trample S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ CARDNAME can't attack. | CheckSVar$ X | SVarCompare$ EQ0 | Description$ CARDNAME can't attack unless there is a Mountain on the battlefield. SVar:X:Count$Valid Mountain -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Red SVar:BuffedBy:Mountain SVar:Picture:http://www.wizards.com/global/images/magic/general/glacial_crasher.jpg diff --git a/forge-gui/res/cardsfolder/g/glacial_crevasses.txt b/forge-gui/res/cardsfolder/g/glacial_crevasses.txt index 64e94b4894a..ff3265a5424 100644 --- a/forge-gui/res/cardsfolder/g/glacial_crevasses.txt +++ b/forge-gui/res/cardsfolder/g/glacial_crevasses.txt @@ -2,6 +2,6 @@ Name:Glacial Crevasses ManaCost:2 R Types:Enchantment A:AB$ Fog | Cost$ Sac<1/Mountain.Snow/snow Mountain> | SpellDescription$ Prevent all combat damage that would be dealt this turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/glacial_crevasses.jpg Oracle:Sacrifice a snow Mountain: Prevent all combat damage that would be dealt this turn. diff --git a/forge-gui/res/cardsfolder/g/glacial_plating.txt b/forge-gui/res/cardsfolder/g/glacial_plating.txt index 1e174279cc3..f4b4a412365 100644 --- a/forge-gui/res/cardsfolder/g/glacial_plating.txt +++ b/forge-gui/res/cardsfolder/g/glacial_plating.txt @@ -6,6 +6,6 @@ K:Cumulative upkeep:S A:SP$ Attach | Cost$ 2 W W | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ X | AddToughness$ X | References$ X | Description$ Enchanted creature gets +3/+3 for each age counter on CARDNAME. SVar:X:Count$CardCounters.AGE/Thrice -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/glacial_plating.jpg Oracle:Enchant creature\nCumulative upkeep {S} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it. {S} can be paid with one mana from a snow permanent.)\nEnchanted creature gets +3/+3 for each age counter on Glacial Plating. diff --git a/forge-gui/res/cardsfolder/g/glaciers.txt b/forge-gui/res/cardsfolder/g/glaciers.txt index bf97c3aa521..c338a7812bb 100644 --- a/forge-gui/res/cardsfolder/g/glaciers.txt +++ b/forge-gui/res/cardsfolder/g/glaciers.txt @@ -3,6 +3,6 @@ ManaCost:2 W U Types:Enchantment K:UpkeepCost:W U S:Mode$ Continuous | Affected$ Mountain | AddType$ Plains | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | Description$ All Mountains are Plains. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/glaciers.jpg Oracle:At the beginning of your upkeep, sacrifice Glaciers unless you pay {W}{U}.\nAll Mountains are Plains. diff --git a/forge-gui/res/cardsfolder/g/glamerdye.txt b/forge-gui/res/cardsfolder/g/glamerdye.txt index 28a10a9fae4..503f2e45542 100644 --- a/forge-gui/res/cardsfolder/g/glamerdye.txt +++ b/forge-gui/res/cardsfolder/g/glamerdye.txt @@ -3,7 +3,7 @@ ManaCost:1 U Types:Instant K:Retrace A:SP$ ChangeText | Cost$ 1 U | ValidTgts$ Card | TgtZone$ Stack,Battlefield | TgtPrompt$ Choose target spell or permanent | ChangeColorWord$ Choose Choose | Permanent$ True | SpellDescription$ Change the text of target spell or permanent by replacing all instances of one color word with another. -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/glamerdye.jpg Oracle:Change the text of target spell or permanent by replacing all instances of one color word with another.\nRetrace (You may cast this card from your graveyard by discarding a land card in addition to paying its other costs.) diff --git a/forge-gui/res/cardsfolder/g/glare_of_subdual.txt b/forge-gui/res/cardsfolder/g/glare_of_subdual.txt index 6056d0c0e21..b0523096ec3 100644 --- a/forge-gui/res/cardsfolder/g/glare_of_subdual.txt +++ b/forge-gui/res/cardsfolder/g/glare_of_subdual.txt @@ -2,6 +2,6 @@ Name:Glare of Subdual ManaCost:2 G W Types:Enchantment A:AB$ Tap | Cost$ tapXType<1/Creature> | ValidTgts$ Artifact,Creature | TgtPrompt$ Select target artifact or creature | SpellDescription$ Tap target artifact or creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/glare_of_subdual.jpg Oracle:Tap an untapped creature you control: Tap target artifact or creature. diff --git a/forge-gui/res/cardsfolder/g/glarecaster.txt b/forge-gui/res/cardsfolder/g/glarecaster.txt index 8ca7a766ffd..83585cab0ad 100644 --- a/forge-gui/res/cardsfolder/g/glarecaster.txt +++ b/forge-gui/res/cardsfolder/g/glarecaster.txt @@ -7,6 +7,6 @@ A:AB$ Effect | Cost$ 5 W | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ SVar:SelflessDamage:Event$ DamageDone | ValidTarget$ Creature.EffectSource,You | ReplaceWith$ SelflessDmg | DamageTarget$ Remembered | Description$ The next time damage would be dealt to EFFECTSOURCE and/or you this turn, that damage is dealt to any target instead. SVar:SelflessDmg:DB$ ReplaceEffect | VarName$ Affected | VarValue$ Remembered | VarType$ GameEntity | SubAbility$ ExileEffect SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile | Static$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/glarecaster.jpg Oracle:Flying\n{5}{W}: The next time damage would be dealt to Glarecaster and/or you this turn, that damage is dealt to any target instead. diff --git a/forge-gui/res/cardsfolder/g/glarewielder.txt b/forge-gui/res/cardsfolder/g/glarewielder.txt index 6ca9e6bf447..e3152589dd2 100644 --- a/forge-gui/res/cardsfolder/g/glarewielder.txt +++ b/forge-gui/res/cardsfolder/g/glarewielder.txt @@ -7,6 +7,6 @@ K:Evoke:1 R T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, up to two target creatures can't block this turn. SVar:TrigPump:DB$Pump | TargetMin$ 0 | TargetMax$ 2 | KW$ HIDDEN CARDNAME can't block. | IsCurse$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature SVar:PlayMain1:TRUE -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/glarewielder.jpg Oracle:Haste\nWhen Glarewielder enters the battlefield, up to two target creatures can't block this turn.\nEvoke {1}{R} (You may cast this spell for its evoke cost. If you do, it's sacrificed when it enters the battlefield.) diff --git a/forge-gui/res/cardsfolder/g/glasses_of_urza.txt b/forge-gui/res/cardsfolder/g/glasses_of_urza.txt index 0135f9362f1..e876d96eb0b 100644 --- a/forge-gui/res/cardsfolder/g/glasses_of_urza.txt +++ b/forge-gui/res/cardsfolder/g/glasses_of_urza.txt @@ -2,6 +2,6 @@ Name:Glasses of Urza ManaCost:1 Types:Artifact A:AB$ RevealHand | Cost$ T | ValidTgts$ Player | TgtPrompt$ Select target player | SpellDescription$ Look at target player's hand. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/glasses_of_urza.jpg Oracle:{T}: Look at target player's hand. diff --git a/forge-gui/res/cardsfolder/g/gleam_of_resistance.txt b/forge-gui/res/cardsfolder/g/gleam_of_resistance.txt index b0f6e5bc45b..6bd8be08fea 100644 --- a/forge-gui/res/cardsfolder/g/gleam_of_resistance.txt +++ b/forge-gui/res/cardsfolder/g/gleam_of_resistance.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ UntapAll | Cost$ 4 W | ValidCards$ Creature.YouCtrl | SpellDescription$ Creatures you control get +1/+2 until end of turn. Untap those creatures. | SubAbility$ DBPumpYourCreatures SVar:DBPumpYourCreatures:DB$ PumpAll | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +2 K:TypeCycling:Basic:1 W -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gleam_of_resistance.jpg Oracle:Creatures you control get +1/+2 until end of turn. Untap those creatures.\nBasic landcycling {1}{W} ({1}{W}, Discard this card: Search your library for a basic land card, reveal it, put it into your hand, then shuffle your library.) diff --git a/forge-gui/res/cardsfolder/g/glen_elendra.txt b/forge-gui/res/cardsfolder/g/glen_elendra.txt index 3154517e133..2a8ee190512 100644 --- a/forge-gui/res/cardsfolder/g/glen_elendra.txt +++ b/forge-gui/res/cardsfolder/g/glen_elendra.txt @@ -6,6 +6,6 @@ SVar:TrigExchange:DB$ Pump | ValidTgts$ Creature.YouCtrl+dealtCombatDamageThisCo SVar:DBExchange:DB$ ExchangeControl | Defined$ ParentTarget | ValidTgts$ Creature.ControlledBy Player.wasDealtCombatDamageThisCombatBy ParentTarget | TgtPrompt$ Select target creature that player controls. T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, gain control of target creature you own. SVar:RolledChaos:DB$ GainControl | ValidTgts$ Creature.YouOwn | TgtPrompt$ Select target creature you own to gain control of -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/glen_elendra.jpg Oracle:At the end of combat, you may exchange control of target creature you control that dealt combat damage to a player this combat and target creature that player controls.\nWhenever you roll {CHAOS}, gain control of target creature you own. diff --git a/forge-gui/res/cardsfolder/g/glen_elendra_pranksters.txt b/forge-gui/res/cardsfolder/g/glen_elendra_pranksters.txt index 7e380bf5349..a2c4b516cde 100644 --- a/forge-gui/res/cardsfolder/g/glen_elendra_pranksters.txt +++ b/forge-gui/res/cardsfolder/g/glen_elendra_pranksters.txt @@ -5,6 +5,6 @@ PT:1/3 K:Flying T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OpponentTurn$ True | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ Whenever you cast a spell during an opponent's turn, you may return target creature you control to its owner's hand. SVar:TrigChangeZone:DB$ ChangeZone | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | Origin$ Battlefield | Destination$ Hand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/glen_elendra_pranksters.jpg Oracle:Flying\nWhenever you cast a spell during an opponent's turn, you may return target creature you control to its owner's hand. diff --git a/forge-gui/res/cardsfolder/g/gliding_licid.txt b/forge-gui/res/cardsfolder/g/gliding_licid.txt index f9c69bb38e7..54880df24c8 100644 --- a/forge-gui/res/cardsfolder/g/gliding_licid.txt +++ b/forge-gui/res/cardsfolder/g/gliding_licid.txt @@ -6,6 +6,6 @@ A:AB$ Animate | Cost$ U T | Defined$ Self | RemoveThisAbility$ True | Permanent$ SVar:DBAttach:DB$ Attach | ValidTgts$ Creature | AILogic$ Pump SVar:SPAttach:SP$ Attach | Cost$ 0 | ValidTgts$ Creature S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Flying | Description$ Enchanted creature has flying. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gliding_licid.jpg Oracle:{U}, {T}: Gliding Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {U} to end this effect.\nEnchanted creature has flying. diff --git a/forge-gui/res/cardsfolder/g/glimmervoid.txt b/forge-gui/res/cardsfolder/g/glimmervoid.txt index 7327955a123..b980ba4fb32 100644 --- a/forge-gui/res/cardsfolder/g/glimmervoid.txt +++ b/forge-gui/res/cardsfolder/g/glimmervoid.txt @@ -5,6 +5,6 @@ A:AB$ Mana | Cost$ T | Produced$ Any | Amount$ 1 | SpellDescription$ Add one man T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | IsPresent$ Artifact.YouCtrl | PresentCompare$ EQ0 | Execute$ TrigSac | TriggerDescription$ At the beginning of the end step, if you control no artifacts, sacrifice CARDNAME. SVar:TrigSac:DB$Sacrifice | Defined$ Self SVar:NeedsToPlay:Artifact.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/glimmervoid.jpg Oracle:At the beginning of the end step, if you control no artifacts, sacrifice Glimmervoid.\n{T}: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/g/glimmervoid_basin.txt b/forge-gui/res/cardsfolder/g/glimmervoid_basin.txt index dc7e966c6db..fd987e01b7e 100644 --- a/forge-gui/res/cardsfolder/g/glimmervoid_basin.txt +++ b/forge-gui/res/cardsfolder/g/glimmervoid_basin.txt @@ -6,6 +6,6 @@ SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Controller T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, choose target creature. Each player except that creature's controller creates a token that's a copy of that creature. SVar:RolledChaos:DB$ RepeatEach | RepeatPlayers$ NonTargetedController | RepeatSubAbility$ DBCopy | ValidTgts$ Creature | TgtPrompt$ Select target creature SVar:DBCopy:DB$ CopyPermanent | Defined$ ParentTarget | Controller$ Remembered -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/glimmervoid_basin.jpg Oracle:Whenever a player casts an instant or sorcery spell with a single target, they copy that spell for each other spell, permanent, card not on the battlefield, and/or player the spell could target. Each copy targets a different one of them.\nWhenever you roll {CHAOS}, choose target creature. Each player except that creature's controller creates a token that's a copy of that creature. diff --git a/forge-gui/res/cardsfolder/g/glimpse_of_nature.txt b/forge-gui/res/cardsfolder/g/glimpse_of_nature.txt index 36a5792e7ba..041ac6b83e0 100644 --- a/forge-gui/res/cardsfolder/g/glimpse_of_nature.txt +++ b/forge-gui/res/cardsfolder/g/glimpse_of_nature.txt @@ -4,7 +4,7 @@ Types:Sorcery A:SP$ Effect | Cost$ G | Name$ Glimpse of Nature Effect | Triggers$ CreatureSpell | SVars$ TrigDraw | SpellDescription$ Whenever you cast a creature spell this turn, draw a card. SVar:CreatureSpell:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | Execute$ TrigDraw | TriggerZones$ Command | TriggerDescription$ Whenever you cast a creature spell this turn, draw a card. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/glimpse_of_nature.jpg Oracle:Whenever you cast a creature spell this turn, draw a card. diff --git a/forge-gui/res/cardsfolder/g/glimpse_the_future.txt b/forge-gui/res/cardsfolder/g/glimpse_the_future.txt index 72f5ee9d4a7..53629422421 100644 --- a/forge-gui/res/cardsfolder/g/glimpse_the_future.txt +++ b/forge-gui/res/cardsfolder/g/glimpse_the_future.txt @@ -2,6 +2,6 @@ Name:Glimpse the Future ManaCost:2 U Types:Sorcery A:SP$ Dig | Cost$ 2 U | DigNum$ 3 | DestinationZone2$ Graveyard | SpellDescription$ Look at the top three cards of your library. Put one of them into your hand and the rest into your graveyard. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/glimpse_the_future.jpg Oracle:Look at the top three cards of your library. Put one of them into your hand and the rest into your graveyard. diff --git a/forge-gui/res/cardsfolder/g/glint_hawk_idol.txt b/forge-gui/res/cardsfolder/g/glint_hawk_idol.txt index 29d4a722ed5..0ac32a7dd4f 100644 --- a/forge-gui/res/cardsfolder/g/glint_hawk_idol.txt +++ b/forge-gui/res/cardsfolder/g/glint_hawk_idol.txt @@ -5,7 +5,7 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Artifa SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 2 | Toughness$ 2 | Types$ Artifact,Creature,Bird | Keywords$ Flying A:AB$ Animate | Cost$ W | Defined$ Self | Power$ 2 | Toughness$ 2 | Types$ Artifact,Creature,Bird | Keywords$ Flying | SpellDescription$ CARDNAME becomes a 2/2 Bird artifact creature with flying until end of turn. SVar:BuffedBy:Artifact -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$white SVar:Picture:http://www.wizards.com/global/images/magic/general/glint_hawk_idol.jpg Oracle:Whenever another artifact enters the battlefield under your control, you may have Glint Hawk Idol become a 2/2 Bird artifact creature with flying until end of turn.\n{W}: Glint Hawk Idol becomes a 2/2 Bird artifact creature with flying until end of turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/g/glissa_sunseeker.txt b/forge-gui/res/cardsfolder/g/glissa_sunseeker.txt index 867c1a6c28f..9c2f47ef9da 100644 --- a/forge-gui/res/cardsfolder/g/glissa_sunseeker.txt +++ b/forge-gui/res/cardsfolder/g/glissa_sunseeker.txt @@ -7,6 +7,6 @@ A:AB$ Destroy | Cost$ T | ValidTgts$ Artifact | TgtPrompt$ Select target artifac SVar:X:Count$ManaPool:All SVar:Y:Targeted$CardManaCost #AI won't specifically put mana in pool to activate the ability -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/glissa_sunseeker.jpg Oracle:First strike\n{T}: Destroy target artifact if its converted mana cost is equal to the amount of unspent mana you have. diff --git a/forge-gui/res/cardsfolder/g/glittering_wish.txt b/forge-gui/res/cardsfolder/g/glittering_wish.txt index 9c7defcf708..15fa5e5aa3d 100644 --- a/forge-gui/res/cardsfolder/g/glittering_wish.txt +++ b/forge-gui/res/cardsfolder/g/glittering_wish.txt @@ -3,6 +3,6 @@ ManaCost:G W Types:Sorcery A:SP$ ChangeZone | Cost$ G W | Origin$ Sideboard | Destination$ Hand | ChangeType$ Card.MultiColor+YouOwn | ChangeNum$ 1 | SubAbility$ DBChange | SpellDescription$ You may choose a multicolored card you own from outside the game, reveal that card, and put it into your hand. Exile CARDNAME. SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/glittering_wish.jpg Oracle:You may choose a multicolored card you own from outside the game, reveal that card, and put it into your hand. Exile Glittering Wish. diff --git a/forge-gui/res/cardsfolder/g/global_ruin.txt b/forge-gui/res/cardsfolder/g/global_ruin.txt index 0f198b9d23b..27e02226a29 100644 --- a/forge-gui/res/cardsfolder/g/global_ruin.txt +++ b/forge-gui/res/cardsfolder/g/global_ruin.txt @@ -3,6 +3,6 @@ ManaCost:4 W Types:Sorcery A:SP$ ChooseCard | Cost$ 4 W | Defined$ Player | EachBasicType$ Controlled | SubAbility$ DBDestroy | SpellDescription$ Each player chooses from the lands they control a land of each basic land type, then sacrifices the rest. | StackDescription$ SpellDescription SVar:DBDestroy:DB$ SacrificeAll | ValidCards$ Land.nonChosenCard | StackDescription$ None -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/global_ruin.jpg Oracle:Each player chooses from the lands they control a land of each basic land type, then sacrifices the rest. diff --git a/forge-gui/res/cardsfolder/g/gloom.txt b/forge-gui/res/cardsfolder/g/gloom.txt index a7b1ba60b0e..9490426f08a 100644 --- a/forge-gui/res/cardsfolder/g/gloom.txt +++ b/forge-gui/res/cardsfolder/g/gloom.txt @@ -3,6 +3,6 @@ ManaCost:2 B Types:Enchantment S:Mode$ RaiseCost | ValidCard$ Card.White | Type$ Spell | Amount$ 3 | Description$ White spells cost {3} more to cast. S:Mode$ RaiseCost | ValidCard$ Enchantment.White | Type$ Ability | Amount$ 3 | AffectedZone$ Battlefield | Description$ Activated abilities of white enchantments cost {3} more to activate. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/gloom.jpg Oracle:White spells cost {3} more to cast.\nActivated abilities of white enchantments cost {3} more to activate. diff --git a/forge-gui/res/cardsfolder/g/glorious_end.txt b/forge-gui/res/cardsfolder/g/glorious_end.txt index 6e96e8bd417..68de3ccb363 100644 --- a/forge-gui/res/cardsfolder/g/glorious_end.txt +++ b/forge-gui/res/cardsfolder/g/glorious_end.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$EndTurn | Cost$ 2 R | SubAbility$ DelayedLoss | SpellDescription$ End the turn. At the beginning of your next end step, you lose the game. SVar:DelayedLoss:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | Execute$ TrigLoseGame | TriggerDescription$ Lose the game. SVar:TrigLoseGame:DB$ LosesGame | Defined$ SourceController -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/glorious_end.jpg Oracle:End the turn. (Exile all spells and abilities on the stack, including this card. The player whose turn it is discards down to their maximum hand size. Damage wears off, and "this turn" and "until end of turn" effects end.)\nAt the beginning of your next end step, you lose the game. diff --git a/forge-gui/res/cardsfolder/g/glyph_of_destruction.txt b/forge-gui/res/cardsfolder/g/glyph_of_destruction.txt index 55bb4c8ad1d..e511ef74b0e 100644 --- a/forge-gui/res/cardsfolder/g/glyph_of_destruction.txt +++ b/forge-gui/res/cardsfolder/g/glyph_of_destruction.txt @@ -3,7 +3,7 @@ ManaCost:R Types:Instant A:SP$ Pump | Cost$ R | ValidTgts$ Creature.Wall+blocking | TgtPrompt$ Select target blocking Wall you control | SubAbility$ DBPump | KW$ Prevent all damage that would be dealt to CARDNAME. | SpellDescription$ Target blocking Wall you control gets +10/+0 until end of combat. Prevent all damage that would be dealt to it this turn. Destroy it at the beginning of the next end step. SVar:DBPump:DB$ Pump | NumAtt$ +10 | Defined$ Targeted | UntilEndOfCombat$ True | AtEOT$ Destroy -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/glyph_of_destruction.jpg Oracle:Target blocking Wall you control gets +10/+0 until end of combat. Prevent all damage that would be dealt to it this turn. Destroy it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/g/glyph_of_doom.txt b/forge-gui/res/cardsfolder/g/glyph_of_doom.txt index 00461f8081f..98505f61e86 100644 --- a/forge-gui/res/cardsfolder/g/glyph_of_doom.txt +++ b/forge-gui/res/cardsfolder/g/glyph_of_doom.txt @@ -6,7 +6,7 @@ SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | RememberObjec SVar:TrigRem:DB$ Pump | RememberObjects$ DelayTriggerRemembered | SubAbility$ TrigDestroy SVar:TrigDestroy:DB$ DestroyAll | ValidCards$ Creature.blockedByRemembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/glyph_of_doom.jpg Oracle:Choose target Wall creature. At this turn's next end of combat, destroy all creatures that were blocked by that creature this turn. diff --git a/forge-gui/res/cardsfolder/g/glyph_of_life.txt b/forge-gui/res/cardsfolder/g/glyph_of_life.txt index bbf9da1b922..6c2bdc093fc 100644 --- a/forge-gui/res/cardsfolder/g/glyph_of_life.txt +++ b/forge-gui/res/cardsfolder/g/glyph_of_life.txt @@ -5,7 +5,7 @@ A:SP$ Effect | Cost$ W | Name$ Glyph of Life Effect | ValidTgts$ Creature.Wall | SVar:TrigDamage:Mode$ DamageDone | ValidSource$ Creature.attacking | ValidTarget$ Creature.IsRemembered | Execute$ TrigGainLife | TriggerDescription$ Whenever an attacking creature deals damage to this creature, you gain that much life. SVar:TrigGainLife:DB$ GainLife | LifeAmount$ X | Defined$ You | References$ X SVar:X:TriggerCount$DamageAmount -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/glyph_of_life.jpg Oracle:Choose target Wall creature. Whenever that creature is dealt damage by an attacking creature this turn, you gain that much life. diff --git a/forge-gui/res/cardsfolder/g/gnathosaur.txt b/forge-gui/res/cardsfolder/g/gnathosaur.txt index 6b923305612..93e066c40d4 100644 --- a/forge-gui/res/cardsfolder/g/gnathosaur.txt +++ b/forge-gui/res/cardsfolder/g/gnathosaur.txt @@ -3,6 +3,6 @@ ManaCost:4 R R Types:Creature Dinosaur PT:5/4 A:AB$ Pump | Cost$ Sac<1/Artifact> | Defined$ Self | KW$ Trample | SpellDescription$ CARDNAME gains trample until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gnathosaur.jpg Oracle:Sacrifice an artifact: Gnathosaur gains trample until end of turn. diff --git a/forge-gui/res/cardsfolder/g/goblin_archaeologist.txt b/forge-gui/res/cardsfolder/g/goblin_archaeologist.txt index 0f376ee2a33..d5d4b3efd0b 100644 --- a/forge-gui/res/cardsfolder/g/goblin_archaeologist.txt +++ b/forge-gui/res/cardsfolder/g/goblin_archaeologist.txt @@ -6,6 +6,6 @@ A:AB$ FlipACoin | Cost$ R T | ValidTgts$ Artifact | TgtPrompt$ Select target art SVar:DBDestroy:DB$ Destroy | Defined$ Targeted | SubAbility$ DBUntapSelf SVar:DBUntapSelf:DB$ Untap | Defined$ Self SVar:DBSacSelf:DB$ Sacrifice | Defined$ Self -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_archaeologist.jpg Oracle:{R}, {T}: Flip a coin. If you win the flip, destroy target artifact and untap Goblin Archaeologist. If you lose the flip, sacrifice Goblin Archaeologist. diff --git a/forge-gui/res/cardsfolder/g/goblin_bangchuckers.txt b/forge-gui/res/cardsfolder/g/goblin_bangchuckers.txt index 8845b77ffce..daaf5b4567f 100644 --- a/forge-gui/res/cardsfolder/g/goblin_bangchuckers.txt +++ b/forge-gui/res/cardsfolder/g/goblin_bangchuckers.txt @@ -5,6 +5,6 @@ PT:2/2 A:AB$ FlipACoin | Cost$ T | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | WinSubAbility$ DBDamageTarget | LoseSubAbility$ DBDamageSelf | SpellDescription$ Flip a coin. If you win the flip, CARDNAME deals 2 damage to any target. If you lose the flip, CARDNAME deals 2 damage to itself. SVar:DBDamageTarget:DB$DealDamage | Defined$ Targeted | NumDmg$ 2 SVar:DBDamageSelf:DB$DealDamage | Defined$ Self | NumDmg$ 2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_bangchuckers.jpg Oracle:{T}: Flip a coin. If you win the flip, Goblin Bangchuckers deals 2 damage to any target. If you lose the flip, Goblin Bangchuckers deals 2 damage to itself. diff --git a/forge-gui/res/cardsfolder/g/goblin_bombardment.txt b/forge-gui/res/cardsfolder/g/goblin_bombardment.txt index b46c650c9b2..1ac4471592f 100644 --- a/forge-gui/res/cardsfolder/g/goblin_bombardment.txt +++ b/forge-gui/res/cardsfolder/g/goblin_bombardment.txt @@ -2,7 +2,7 @@ Name:Goblin Bombardment ManaCost:1 R Types:Enchantment A:AB$ DealDamage | Cost$ Sac<1/Creature> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to any target. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_bombardment.jpg Oracle:Sacrifice a creature: Goblin Bombardment deals 1 damage to any target. diff --git a/forge-gui/res/cardsfolder/g/goblin_cadets.txt b/forge-gui/res/cardsfolder/g/goblin_cadets.txt index 930a60818b2..5326138ec1a 100644 --- a/forge-gui/res/cardsfolder/g/goblin_cadets.txt +++ b/forge-gui/res/cardsfolder/g/goblin_cadets.txt @@ -7,6 +7,6 @@ T:Mode$ Blocks | ValidCard$ Creature | ValidBlocked$ Card.Self | Execute$ Change SVar:ChangeControl:DB$GainControl | Defined$ Self | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | SpellDescription$ Target opponent gains control of CARDNAME. | SubAbility$ RemCombat SVar:RemCombat:DB$ RemoveFromCombat | Defined$ Self SVar:SacMe:1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_cadets.jpg Oracle:Whenever Goblin Cadets blocks or becomes blocked, target opponent gains control of it. (This removes Goblin Cadets from combat.) diff --git a/forge-gui/res/cardsfolder/g/goblin_cannon.txt b/forge-gui/res/cardsfolder/g/goblin_cannon.txt index add918f199f..d864925fd94 100644 --- a/forge-gui/res/cardsfolder/g/goblin_cannon.txt +++ b/forge-gui/res/cardsfolder/g/goblin_cannon.txt @@ -3,6 +3,6 @@ ManaCost:4 Types:Artifact A:AB$DealDamage | Cost$ 2 | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | SubAbility$ DBSac | SpellDescription$ CARDNAME deals 1 damage to any target. Sacrifice CARDNAME. SVar:DBSac:DB$Sacrifice | Defined$ Self -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_cannon.jpg Oracle:{2}: Goblin Cannon deals 1 damage to any target. Sacrifice Goblin Cannon. diff --git a/forge-gui/res/cardsfolder/g/goblin_caves.txt b/forge-gui/res/cardsfolder/g/goblin_caves.txt index 9a28be6cd6b..8c3355b8e35 100644 --- a/forge-gui/res/cardsfolder/g/goblin_caves.txt +++ b/forge-gui/res/cardsfolder/g/goblin_caves.txt @@ -6,6 +6,6 @@ A:SP$ Attach | Cost$ 1 R R | ValidTgts$ Land | AITgts$ Mountain.Basic | AILogic$ S:Mode$ Continuous | Affected$ Creature.Goblin | AddToughness$ 2 | CheckSVar$ X | SVarCompare$ EQ1 | Description$ If enchanted land is a basic Mountain, Goblin creatures get +0/+2. SVar:X:Count$Valid Land.AttachedBy+Basic+Mountain SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_caves.jpg Oracle:Enchant land\nAs long as enchanted land is a basic Mountain, Goblin creatures get +0/+2. diff --git a/forge-gui/res/cardsfolder/g/goblin_clearcutter.txt b/forge-gui/res/cardsfolder/g/goblin_clearcutter.txt index c5c2a0523df..28b88b8d0c4 100644 --- a/forge-gui/res/cardsfolder/g/goblin_clearcutter.txt +++ b/forge-gui/res/cardsfolder/g/goblin_clearcutter.txt @@ -3,6 +3,6 @@ ManaCost:3 R Types:Creature Goblin PT:3/3 A:AB$ Mana | Cost$ T Sac<1/Forest> | Produced$ Combo R G | Amount$ 3 | SpellDescription$ Add three mana in any combination of {R} and/or {G}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_clearcutter.jpg Oracle:{T}, Sacrifice a Forest: Add three mana in any combination of {R} and/or {G}. diff --git a/forge-gui/res/cardsfolder/g/goblin_diplomats.txt b/forge-gui/res/cardsfolder/g/goblin_diplomats.txt index 3b56d849dcb..b2b9b48a1d9 100644 --- a/forge-gui/res/cardsfolder/g/goblin_diplomats.txt +++ b/forge-gui/res/cardsfolder/g/goblin_diplomats.txt @@ -4,6 +4,6 @@ Types:Creature Goblin PT:2/1 A:AB$ Effect | Cost$ T | Name$ Goblin Diplomats Effect | StaticAbilities$ KWPump | SpellDescription$ Each creature attacks this turn if able. SVar:KWPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature | AddHiddenKeyword$ CARDNAME attacks each combat if able. | Description$ Each creature attacks this turn if able. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_diplomats.jpg Oracle:{T}: Each creature attacks this turn if able. diff --git a/forge-gui/res/cardsfolder/g/goblin_dynamo.txt b/forge-gui/res/cardsfolder/g/goblin_dynamo.txt index 09a9cc1baae..f01b08a2c90 100644 --- a/forge-gui/res/cardsfolder/g/goblin_dynamo.txt +++ b/forge-gui/res/cardsfolder/g/goblin_dynamo.txt @@ -5,6 +5,6 @@ PT:4/4 A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to any target. A:AB$ DealDamage | Cost$ X R T Sac<1/CARDNAME> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals X damage to any target. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_dynamo.jpg Oracle:{T}: Goblin Dynamo deals 1 damage to any target.\n{X}{R}, {T}, Sacrifice Goblin Dynamo: Goblin Dynamo deals X damage to any target. diff --git a/forge-gui/res/cardsfolder/g/goblin_flectomancer.txt b/forge-gui/res/cardsfolder/g/goblin_flectomancer.txt index 1448f088a71..9e81c3a2edd 100644 --- a/forge-gui/res/cardsfolder/g/goblin_flectomancer.txt +++ b/forge-gui/res/cardsfolder/g/goblin_flectomancer.txt @@ -3,6 +3,6 @@ ManaCost:U R R Types:Creature Goblin Wizard PT:2/2 A:AB$ ChangeTargets | Cost$ Sac<1/CARDNAME> | TargetType$ Spell | ValidTgts$ Instant,Sorcery | TgtPrompt$ Select target instant or sorcery spell | SpellDescription$ You may change the targets of target instant or sorcery spell. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_flectomancer.jpg Oracle:Sacrifice Goblin Flectomancer: You may change the targets of target instant or sorcery spell. diff --git a/forge-gui/res/cardsfolder/g/goblin_game.txt b/forge-gui/res/cardsfolder/g/goblin_game.txt index 0da8cb90352..5c787efa63e 100644 --- a/forge-gui/res/cardsfolder/g/goblin_game.txt +++ b/forge-gui/res/cardsfolder/g/goblin_game.txt @@ -6,6 +6,6 @@ SVar:DBLoseLife:DB$ LoseLife | Defined$ Remembered | References$ X | LifeAmount$ SVar:X:Count$ChosenNumber SVar:DBLoseHalfLife:DB$ LoseLife | Defined$ Remembered | References$ Y | LifeAmount$ Y SVar:Y:PlayerCountRemembered$LifeTotal/HalfUp -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_game.jpg Oracle:Each player hides at least one item, then all players reveal them simultaneously. Each player loses life equal to the number of items they revealed. The player who revealed the fewest items then loses half their life, rounded up. If two or more players are tied for fewest, each loses half their life, rounded up. diff --git a/forge-gui/res/cardsfolder/g/goblin_grenade.txt b/forge-gui/res/cardsfolder/g/goblin_grenade.txt index 524aaca0e04..9785f017cea 100644 --- a/forge-gui/res/cardsfolder/g/goblin_grenade.txt +++ b/forge-gui/res/cardsfolder/g/goblin_grenade.txt @@ -3,7 +3,7 @@ ManaCost:R Types:Sorcery A:SP$ DealDamage | Cost$ R Sac<1/Goblin> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 5 | SpellDescription$ CARDNAME deals 5 damage to any target. SVar:AIPreference:SacCost$Creature.Goblin+cmcLE1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Goblin SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_grenade.jpg Oracle:As an additional cost to cast Goblin Grenade, sacrifice a Goblin.\nGoblin Grenade deals 5 damage to any target. diff --git a/forge-gui/res/cardsfolder/g/goblin_legionnaire.txt b/forge-gui/res/cardsfolder/g/goblin_legionnaire.txt index 52ac42d1c0f..2ef8e10ff1f 100644 --- a/forge-gui/res/cardsfolder/g/goblin_legionnaire.txt +++ b/forge-gui/res/cardsfolder/g/goblin_legionnaire.txt @@ -4,6 +4,6 @@ Types:Creature Goblin Soldier PT:2/2 A:AB$ DealDamage | Cost$ R Sac<1/CARDNAME> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to any target. A:AB$ PreventDamage | Cost$ W Sac<1/CARDNAME> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | Amount$ 2 | SpellDescription$ Prevent the next 2 damage that would be dealt to any target this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_legionnaire.jpg Oracle:{R}, Sacrifice Goblin Legionnaire: Goblin Legionnaire deals 2 damage to any target.\n{W}, Sacrifice Goblin Legionnaire: Prevent the next 2 damage that would be dealt to any target this turn. diff --git a/forge-gui/res/cardsfolder/g/goblin_lyre.txt b/forge-gui/res/cardsfolder/g/goblin_lyre.txt index 5958fc60d56..81b2d7a3ff3 100644 --- a/forge-gui/res/cardsfolder/g/goblin_lyre.txt +++ b/forge-gui/res/cardsfolder/g/goblin_lyre.txt @@ -6,6 +6,6 @@ SVar:DBDamageOpp:DB$ DealDamage | Defined$ Targeted | NumDmg$ X | References$ X SVar:DBDamageYou:DB$ DealDamage | Defined$ You | NumDmg$ Y | References$ Y SVar:X:Count$Valid Creature.YouCtrl SVar:Y:Count$Valid Creature.OppCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_lyre.jpg Oracle:Sacrifice Goblin Lyre: Flip a coin. If you win the flip, Goblin Lyre deals damage to target opponent equal to the number of creatures you control. If you lose the flip, Goblin Lyre deals damage to you equal to the number of creatures that opponent controls. diff --git a/forge-gui/res/cardsfolder/g/goblin_machinist.txt b/forge-gui/res/cardsfolder/g/goblin_machinist.txt index 38f9cc23606..765b0a8fc18 100644 --- a/forge-gui/res/cardsfolder/g/goblin_machinist.txt +++ b/forge-gui/res/cardsfolder/g/goblin_machinist.txt @@ -6,6 +6,6 @@ A:AB$ DigUntil | Cost$ 2 R | Valid$ Card.nonLand | ValidDescription$ nonland | R SVar:DBPump:DB$ Pump | NumAtt$ RCX | SubAbility$ DBCleanup | References$ RCX SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:RCX:Remembered$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_machinist.jpg Oracle:{2}{R}: Reveal cards from the top of your library until you reveal a nonland card. Goblin Machinist gets +X/+0 until end of turn, where X is that card's converted mana cost. Put the revealed cards on the bottom of your library in any order. diff --git a/forge-gui/res/cardsfolder/g/goblin_psychopath.txt b/forge-gui/res/cardsfolder/g/goblin_psychopath.txt index d0aedb5ccaa..997d0d4fec4 100644 --- a/forge-gui/res/cardsfolder/g/goblin_psychopath.txt +++ b/forge-gui/res/cardsfolder/g/goblin_psychopath.txt @@ -10,6 +10,6 @@ SVar:EventDamageDone:Event$ DamageDone | ValidSource$ Card.EffectSource | Replac SVar:DamageYou:DB$ ReplaceEffect | VarName$ Affected | VarValue$ You | VarType$ Player | SubAbility$ ExileEffect SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:PsychoX:ReplaceCount$DamageAmount -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_psychopath.jpg Oracle:Whenever Goblin Psychopath attacks or blocks, flip a coin. If you lose the flip, the next time it would deal combat damage this turn, it deals that damage to you instead. diff --git a/forge-gui/res/cardsfolder/g/goblin_pyromancer.txt b/forge-gui/res/cardsfolder/g/goblin_pyromancer.txt index ce22cc4207e..f107670d4ef 100644 --- a/forge-gui/res/cardsfolder/g/goblin_pyromancer.txt +++ b/forge-gui/res/cardsfolder/g/goblin_pyromancer.txt @@ -6,6 +6,6 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ At the beginning of the end step, destroy all Goblins. SVar:TrigPump:DB$PumpAll | ValidCards$ Creature.Goblin | NumAtt$ 3 SVar:TrigDestroy:DB$DestroyAll | ValidCards$ Creature.Goblin -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_pyromancer.jpg Oracle:When Goblin Pyromancer enters the battlefield, Goblin creatures get +3/+0 until end of turn.\nAt the beginning of the end step, destroy all Goblins. diff --git a/forge-gui/res/cardsfolder/g/goblin_recruiter.txt b/forge-gui/res/cardsfolder/g/goblin_recruiter.txt index 5e4606469a7..cc0de0ad780 100644 --- a/forge-gui/res/cardsfolder/g/goblin_recruiter.txt +++ b/forge-gui/res/cardsfolder/g/goblin_recruiter.txt @@ -6,8 +6,8 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigChangeZone:DB$ ChangeZone | ChangeNum$ X | ChangeType$ Goblin | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | References$ X SVar:X:Count$InYourLibrary.Goblin DeckNeeds:Type$Goblin -#TODO: The AI generally is able to use this card, but will basically place all of its goblins on top of the library in no specific order, which is not very smart. Might need some improvement before RemAIDeck is removed. Currently adding a restriction to at least only play it if the AI has enough lands out on the battlefield already. -SVar:RemAIDeck:True +#TODO: The AI generally is able to use this card, but will basically place all of its goblins on top of the library in no specific order, which is not very smart. Might need some improvement before RemoveDeck is removed. Currently adding a restriction to at least only play it if the AI has enough lands out on the battlefield already. +AI:RemoveDeck:All SVar:NeedsToPlayVar:Z GE4 SVar:Z:Count$Valid Land.YouCtrl+inZoneBattlefield SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_recruiter.jpg diff --git a/forge-gui/res/cardsfolder/g/goblin_sappers.txt b/forge-gui/res/cardsfolder/g/goblin_sappers.txt index 264a75bceb4..f2f181dcedb 100644 --- a/forge-gui/res/cardsfolder/g/goblin_sappers.txt +++ b/forge-gui/res/cardsfolder/g/goblin_sappers.txt @@ -9,6 +9,6 @@ SVar:TrigDestroyFriend:DB$ Destroy | Defined$ DelayTriggerRemembered SVar:DelTrigBoth:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigDestroySapper | TriggerDescription$ Destroy it and CARDNAME at end of combat. | RememberObjects$ Remembered | SubAbility$ DBCleanup SVar:TrigDestroySapper:DB$ Destroy | Defined$ Self | SubAbility$ TrigDestroyFriend SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_sappers.jpg Oracle:{R}{R}, {T}: Target creature you control can't be blocked this turn. Destroy it and Goblin Sappers at end of combat.\n{R}{R}{R}{R}, {T}: Target creature you control can't be blocked this turn. Destroy it at end of combat. diff --git a/forge-gui/res/cardsfolder/g/goblin_shrine.txt b/forge-gui/res/cardsfolder/g/goblin_shrine.txt index aca108a68ac..926b44c3eff 100644 --- a/forge-gui/res/cardsfolder/g/goblin_shrine.txt +++ b/forge-gui/res/cardsfolder/g/goblin_shrine.txt @@ -8,6 +8,6 @@ T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.S SVar:TrigDealDamage:DB$DamageAll | ValidCards$ Creature.Goblin | NumDmg$ 1 SVar:X:Count$Valid Land.AttachedBy+Basic+Mountain SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_shrine.jpg Oracle:Enchant land\nAs long as enchanted land is a basic Mountain, Goblin creatures get +1/+0.\nWhen Goblin Shrine leaves the battlefield, it deals 1 damage to each Goblin creature. diff --git a/forge-gui/res/cardsfolder/g/goblin_ski_patrol.txt b/forge-gui/res/cardsfolder/g/goblin_ski_patrol.txt index d4931e48fab..daaaf45d97b 100644 --- a/forge-gui/res/cardsfolder/g/goblin_ski_patrol.txt +++ b/forge-gui/res/cardsfolder/g/goblin_ski_patrol.txt @@ -3,6 +3,6 @@ ManaCost:1 R Types:Creature Goblin PT:1/1 A:AB$ Pump | Cost$ 1 R | NumAtt$ +2 | KW$ Flying | Permanent$ True | ActivationLimit$ 1 | IsPresent$ Mountain.Snow+YouCtrl | AtEOT$ Sacrifice | SpellDescription$ CARDNAME gets +2/+0 and gains flying. Its controller sacrifices it at the beginning of the next end step. Activate this ability only once and only if you control a snow Mountain. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_ski_patrol.jpg Oracle:{1}{R}: Goblin Ski Patrol gets +2/+0 and gains flying. Its controller sacrifices it at the beginning of the next end step. Activate this ability only once and only if you control a snow Mountain. diff --git a/forge-gui/res/cardsfolder/g/goblin_test_pilot.txt b/forge-gui/res/cardsfolder/g/goblin_test_pilot.txt index 778cdbc2690..102f99d9118 100644 --- a/forge-gui/res/cardsfolder/g/goblin_test_pilot.txt +++ b/forge-gui/res/cardsfolder/g/goblin_test_pilot.txt @@ -4,7 +4,7 @@ Types:Creature Goblin Pilot Wizard PT:0/2 K:Flying A:AB$ DealDamage | Cost$ T | NumDmg$ 2 | ValidTgts$ Creature,Player,Planeswalker | TargetsAtRandom$ True | SpellDescription$ CARDNAME deals 2 damage to any target chosen at random. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_test_pilot.jpg Oracle:Flying\n{T}: Goblin Test Pilot deals 2 damage to any target chosen at random. diff --git a/forge-gui/res/cardsfolder/g/goblin_war_cry.txt b/forge-gui/res/cardsfolder/g/goblin_war_cry.txt index 12960d8a35f..8c885813763 100644 --- a/forge-gui/res/cardsfolder/g/goblin_war_cry.txt +++ b/forge-gui/res/cardsfolder/g/goblin_war_cry.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ ChooseCard | Cost$ 2 R | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | Amount$ 1 | Choices$ Creature.TargetedPlayerCtrl | SubAbility$ DBPumpAll | RememberChosen$ True | AILogic$ BestBlocker | SpellDescription$ Target opponent chooses a creature they control. Other creatures they control can't block this turn. SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.IsNotRemembered+TargetedPlayerCtrl | KW$ HIDDEN CARDNAME can't block. | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_war_cry.jpg Oracle:Target opponent chooses a creature they control. Other creatures they control can't block this turn. diff --git a/forge-gui/res/cardsfolder/g/goblin_war_strike.txt b/forge-gui/res/cardsfolder/g/goblin_war_strike.txt index 088e6228d0b..da62b932fcc 100644 --- a/forge-gui/res/cardsfolder/g/goblin_war_strike.txt +++ b/forge-gui/res/cardsfolder/g/goblin_war_strike.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Sorcery A:SP$ DealDamage | Cost$ R | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals damage to target player or planeswalker equal to the number of Goblins you control. SVar:X:Count$TypeYouCtrl.Goblin -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_war_strike.jpg Oracle:Goblin War Strike deals damage to target player or planeswalker equal to the number of Goblins you control. diff --git a/forge-gui/res/cardsfolder/g/goblin_warrens.txt b/forge-gui/res/cardsfolder/g/goblin_warrens.txt index 973576fde33..caa9c1f08af 100644 --- a/forge-gui/res/cardsfolder/g/goblin_warrens.txt +++ b/forge-gui/res/cardsfolder/g/goblin_warrens.txt @@ -4,7 +4,7 @@ Types:Enchantment A:AB$ Token | Cost$ 2 R Sac<2/Goblin> | TokenAmount$ 3 | TokenName$ Goblin | TokenTypes$ Creature,Goblin | TokenOwner$ You | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Create three 1/1 red Goblin creature tokens. SVar:AIPreference:SacCost$Creature.Goblin+cmcLE1 SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Goblin SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_warrens.jpg Oracle:{2}{R}, Sacrifice two Goblins: Create three 1/1 red Goblin creature tokens. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/g/goblin_welder.txt b/forge-gui/res/cardsfolder/g/goblin_welder.txt index 17f54322053..04276b0c1dc 100644 --- a/forge-gui/res/cardsfolder/g/goblin_welder.txt +++ b/forge-gui/res/cardsfolder/g/goblin_welder.txt @@ -8,7 +8,7 @@ SVar:DBSacrifice:DB$ SacrificeAll | ValidCards$ Card.IsRemembered | ConditionDef SVar:DBReturn:DB$ ChangeZone | Defined$ Imprinted | Origin$ Graveyard | Destination$ Battlefield | SubAbility$ DBCleanup | ConditionDefined$ Remembered | ConditionPresent$ Artifact | ConditionCompare$ GE1 | ConditionCheckSVar$ CheckImprint | ConditionSVarCompare$ GE1 | StackDescription$ None SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True SVar:CheckImprint:Imprinted$Valid Artifact.sharesControllerWith Remembered -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_welder.jpg Oracle:{T}: Choose target artifact a player controls and target artifact card in that player's graveyard. If both targets are still legal as this ability resolves, that player simultaneously sacrifices the artifact and returns the artifact card to the battlefield. diff --git a/forge-gui/res/cardsfolder/g/god_pharaohs_faithful.txt b/forge-gui/res/cardsfolder/g/god_pharaohs_faithful.txt index 658127102b0..9614e456efe 100644 --- a/forge-gui/res/cardsfolder/g/god_pharaohs_faithful.txt +++ b/forge-gui/res/cardsfolder/g/god_pharaohs_faithful.txt @@ -4,7 +4,7 @@ Types:Creature Human Wizard PT:0/4 T:Mode$ SpellCast | ValidCard$ Card.Blue,Card.Red,Card.Black | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever you cast a blue, black or red spell, you gain 1 life. SVar:TrigGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Blue|Black|Red SVar:Picture:http://www.wizards.com/global/images/magic/general/god_pharaohs_faithful.jpg Oracle:Whenever you cast a blue, black or red spell, you gain 1 life. diff --git a/forge-gui/res/cardsfolder/g/godhunter_octopus.txt b/forge-gui/res/cardsfolder/g/godhunter_octopus.txt index e06b9706fed..8e73f36e00c 100644 --- a/forge-gui/res/cardsfolder/g/godhunter_octopus.txt +++ b/forge-gui/res/cardsfolder/g/godhunter_octopus.txt @@ -3,6 +3,6 @@ ManaCost:5 U Types:Creature Octopus PT:5/5 S:Mode$ CantAttack | ValidCard$ Card.Self | UnlessDefenderControls$ Enchantment,Permanent.enchanted | Description$ CARDNAME can't attack unless defending player controls an enchantment or an enchanted permanent. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/godhunter_octopus.jpg Oracle:Godhunter Octopus can't attack unless defending player controls an enchantment or an enchanted permanent. diff --git a/forge-gui/res/cardsfolder/g/godtoucher.txt b/forge-gui/res/cardsfolder/g/godtoucher.txt index 94b83f66a3c..44b52c7e53f 100644 --- a/forge-gui/res/cardsfolder/g/godtoucher.txt +++ b/forge-gui/res/cardsfolder/g/godtoucher.txt @@ -3,7 +3,7 @@ ManaCost:3 G Types:Creature Elf Cleric PT:2/2 A:AB$ Pump | Cost$ 1 W T | KW$ Prevent all damage that would be dealt to CARDNAME. | ValidTgts$ Creature.powerGE5 | TgtPrompt$ Select target creature with power 5 or greater | SpellDescription$ Prevent all damage that would be dealt to target creature with power 5 or greater this turn. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/godtoucher.jpg Oracle:{1}{W}, {T}: Prevent all damage that would be dealt to target creature with power 5 or greater this turn. diff --git a/forge-gui/res/cardsfolder/g/golden_wish.txt b/forge-gui/res/cardsfolder/g/golden_wish.txt index 18dd3166907..0452d57d10f 100644 --- a/forge-gui/res/cardsfolder/g/golden_wish.txt +++ b/forge-gui/res/cardsfolder/g/golden_wish.txt @@ -3,6 +3,6 @@ ManaCost:3 W W Types:Sorcery A:SP$ ChangeZone | Cost$ 3 W W | Origin$ Sideboard | Destination$ Hand | ChangeType$ Artifact.YouOwn,Enchantment.YouOwn | ChangeNum$ 1 | SubAbility$ DBChange | SpellDescription$ You may choose an artifact or enchantment card you own from outside the game, reveal that card, and put it into your hand. Exile CARDNAME. SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/golden_wish.jpg Oracle:You may choose an artifact or enchantment card you own from outside the game, reveal that card, and put it into your hand. Exile Golden Wish. diff --git a/forge-gui/res/cardsfolder/g/golgari_cluestone.txt b/forge-gui/res/cardsfolder/g/golgari_cluestone.txt index 8bf8256037a..b9fc34b4b05 100644 --- a/forge-gui/res/cardsfolder/g/golgari_cluestone.txt +++ b/forge-gui/res/cardsfolder/g/golgari_cluestone.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. A:AB$ Draw | Cost$ B G T Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black|Green SVar:Picture:http://www.wizards.com/global/images/magic/general/golgari_cluestone.jpg Oracle:{T}: Add {B} or {G}.\n{B}{G}, {T}, Sacrifice Golgari Cluestone: Draw a card. diff --git a/forge-gui/res/cardsfolder/g/golgari_keyrune.txt b/forge-gui/res/cardsfolder/g/golgari_keyrune.txt index 298867cf733..5145f6708cc 100644 --- a/forge-gui/res/cardsfolder/g/golgari_keyrune.txt +++ b/forge-gui/res/cardsfolder/g/golgari_keyrune.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. A:AB$ Animate | Cost$ B G | Defined$ Self | Power$ 2 | Toughness$ 2 | Types$ Artifact,Creature,Insect | Colors$ Black,Green | Keywords$ Deathtouch | SpellDescription$ CARDNAME becomes a 2/2 black and green Insect artifact creature with deathtouch until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black|Green SVar:Picture:http://www.wizards.com/global/images/magic/general/golgari_keyrune.jpg Oracle:{T}: Add {B} or {G}.\n{B}{G}: Golgari Keyrune becomes a 2/2 black and green Insect artifact creature with deathtouch until end of turn. diff --git a/forge-gui/res/cardsfolder/g/golgari_locket.txt b/forge-gui/res/cardsfolder/g/golgari_locket.txt index 3f7e389434b..dc882bd3261 100644 --- a/forge-gui/res/cardsfolder/g/golgari_locket.txt +++ b/forge-gui/res/cardsfolder/g/golgari_locket.txt @@ -3,8 +3,8 @@ ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black | Green A:AB$ Draw | Cost$ BG BG BG BG T Sac<1/CARDNAME> | NumCards$ 2 | SpellDescription$ Draw two cards. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random Oracle:{T}: Add {B} or {G}.\n{B/G}{B/G}{B/G}{B/G}, {T}, Sacrifice Golgari Locket: Draw two cards. diff --git a/forge-gui/res/cardsfolder/g/golgari_signet.txt b/forge-gui/res/cardsfolder/g/golgari_signet.txt index ef39cdff6b7..e677fc074b8 100644 --- a/forge-gui/res/cardsfolder/g/golgari_signet.txt +++ b/forge-gui/res/cardsfolder/g/golgari_signet.txt @@ -2,6 +2,6 @@ Name:Golgari Signet ManaCost:2 Types:Artifact A:AB$ Mana | Cost$ 1 T | Produced$ B G | SpellDescription$ Add {B}{G}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/golgari_signet.jpg Oracle:{1}, {T}: Add {B}{G}. diff --git a/forge-gui/res/cardsfolder/g/golgothian_sylex.txt b/forge-gui/res/cardsfolder/g/golgothian_sylex.txt index a52dbc59d30..4e271ad0c87 100644 --- a/forge-gui/res/cardsfolder/g/golgothian_sylex.txt +++ b/forge-gui/res/cardsfolder/g/golgothian_sylex.txt @@ -2,8 +2,8 @@ Name:Golgothian Sylex ManaCost:4 Types:Artifact A:AB$ SacrificeAll | Cost$ 1 T | ValidCards$ Permanent.nonToken+setATQ | SpellDescription$ Each nontoken permanent originally printed in the Antiquities expansion is sacrificed by its controller. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/golgothian_sylex.jpg Oracle:{1}, {T}: Each nontoken permanent originally printed in the Antiquities expansion is sacrificed by its controller. diff --git a/forge-gui/res/cardsfolder/g/gore_vassal.txt b/forge-gui/res/cardsfolder/g/gore_vassal.txt index 6ce18e72074..b60a3d7483f 100644 --- a/forge-gui/res/cardsfolder/g/gore_vassal.txt +++ b/forge-gui/res/cardsfolder/g/gore_vassal.txt @@ -6,6 +6,6 @@ A:AB$ PutCounter | Cost$ Sac<1/CARDNAME> | CounterType$ M1M1 | CounterNum$ 1 | V SVar:DBRegenerate:DB$ Regenerate | Defined$ Remembered | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | SubAbility$ DBCleanup | References$ X SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$CardToughness -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gore_vassal.jpg Oracle:Sacrifice Gore Vassal: Put a -1/-1 counter on target creature. Then if that creature's toughness is 1 or greater, regenerate it. diff --git a/forge-gui/res/cardsfolder/g/goryos_vengeance.txt b/forge-gui/res/cardsfolder/g/goryos_vengeance.txt index d6109ae3bb4..3bf66cf2735 100644 --- a/forge-gui/res/cardsfolder/g/goryos_vengeance.txt +++ b/forge-gui/res/cardsfolder/g/goryos_vengeance.txt @@ -4,7 +4,7 @@ Types:Instant Arcane K:Splice:Arcane:2 B A:SP$ ChangeZone | Cost$ 1 B | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.Legendary+YouCtrl | TgtPrompt$ Select target legendary creature in your graveyard | GainControl$ True | SubAbility$ DBPump | AILogic$ BeforeCombat | SpellDescription$ Return target legendary creature card from your graveyard to the battlefield. That creature gains haste. Exile it at the beginning of the next end step. SVar:DBPump:DB$ Animate | Keywords$ Haste | sVars$ SneakAttackEOT | Defined$ Targeted | Permanent$ True | AtEOT$ Exile -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True SVar:Picture:http://www.wizards.com/global/images/magic/general/goryos_vengeance.jpg diff --git a/forge-gui/res/cardsfolder/g/gossamer_chains.txt b/forge-gui/res/cardsfolder/g/gossamer_chains.txt index 63f30636f6c..dfe72d439ac 100644 --- a/forge-gui/res/cardsfolder/g/gossamer_chains.txt +++ b/forge-gui/res/cardsfolder/g/gossamer_chains.txt @@ -2,6 +2,6 @@ Name:Gossamer Chains ManaCost:W W Types:Enchantment A:AB$ Pump | Cost$ Return<1/CARDNAME> | ValidTgts$ Creature.attacking+unblocked | TgtPrompt$ Select target unblocked creature | IsCurse$ True | KW$ Prevent all combat damage that would be dealt by CARDNAME. | SpellDescription$ Prevent all combat damage that would be dealt by target unblocked creature this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gossamer_chains.jpg Oracle:Return Gossamer Chains to its owner's hand: Prevent all combat damage that would be dealt by target unblocked creature this turn. diff --git a/forge-gui/res/cardsfolder/g/grab_the_reins.txt b/forge-gui/res/cardsfolder/g/grab_the_reins.txt index 39cb3ea64c4..f4ebaee777a 100644 --- a/forge-gui/res/cardsfolder/g/grab_the_reins.txt +++ b/forge-gui/res/cardsfolder/g/grab_the_reins.txt @@ -8,6 +8,6 @@ SVar:DBSac:DB$ Sacrifice | Amount$ 1 | SacValid$ Creature | RememberSacrificed$ SVar:GrabDmg:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target to deal the damage to | NumDmg$ X | SubAbility$ DBCleanup | References$ X SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:RememberedLKI$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/grab_the_reins.jpg Oracle:Choose one —\n• Until end of turn, you gain control of target creature and it gains haste.\n• Sacrifice a creature. Grab the Reins deals damage equal to that creature's power to any target.\nEntwine {2}{R} (Choose both if you pay the entwine cost.) diff --git a/forge-gui/res/cardsfolder/g/graceful_antelope.txt b/forge-gui/res/cardsfolder/g/graceful_antelope.txt index 4b9a1f08b3e..7cbb1a0c85b 100644 --- a/forge-gui/res/cardsfolder/g/graceful_antelope.txt +++ b/forge-gui/res/cardsfolder/g/graceful_antelope.txt @@ -5,6 +5,6 @@ PT:1/4 K:Plainswalk T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigAnimate | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may have target land become a Plains until CARDNAME leaves the battlefield. SVar:TrigAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | UntilHostLeavesPlay$ True | Types$ Plains | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/graceful_antelope.jpg Oracle:Plainswalk (This creature can't be blocked as long as defending player controls a Plains.)\nWhenever Graceful Antelope deals combat damage to a player, you may have target land become a Plains until Graceful Antelope leaves the battlefield. diff --git a/forge-gui/res/cardsfolder/g/graceful_reprieve.txt b/forge-gui/res/cardsfolder/g/graceful_reprieve.txt index 7a8a150382a..f4c7057c2d2 100644 --- a/forge-gui/res/cardsfolder/g/graceful_reprieve.txt +++ b/forge-gui/res/cardsfolder/g/graceful_reprieve.txt @@ -5,6 +5,6 @@ A:SP$ Effect | Cost$ 1 W | Name$ Graceful Reprieve Effect | ValidTgts$ Creature SVar:TrigGracefulReprieve:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.IsRemembered | Execute$ GracefulReprieveReturn | TriggerDescription$ When target creature dies this turn, return that card to the battlefield under its owner's control. SVar:GracefulReprieveReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Graveyard | Destination$ Battlefield | SubAbility$ ExileEffect SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/graceful_reprieve.jpg Oracle:When target creature dies this turn, return that card to the battlefield under its owner's control. diff --git a/forge-gui/res/cardsfolder/g/graf_mole.txt b/forge-gui/res/cardsfolder/g/graf_mole.txt index 7c6855b7b38..e5db7274bb4 100644 --- a/forge-gui/res/cardsfolder/g/graf_mole.txt +++ b/forge-gui/res/cardsfolder/g/graf_mole.txt @@ -4,7 +4,7 @@ Types:Creature Mole Beast PT:2/4 T:Mode$ Sacrificed | ValidPlayer$ You | ValidCard$ Clue | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever you sacrifice a Clue, you gain 3 life. SVar:TrigGainLife:DB$ GainLife | LifeAmount$ 3 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Ability$Investigate SVar:Picture:http://www.wizards.com/global/images/magic/general/graf_mole.jpg Oracle:Whenever you sacrifice a Clue, you gain 3 life. diff --git a/forge-gui/res/cardsfolder/g/grafdiggers_cage.txt b/forge-gui/res/cardsfolder/g/grafdiggers_cage.txt index 7c3283c7e80..d736b534973 100644 --- a/forge-gui/res/cardsfolder/g/grafdiggers_cage.txt +++ b/forge-gui/res/cardsfolder/g/grafdiggers_cage.txt @@ -6,6 +6,6 @@ R:Event$Moved | ActiveZones$ Battlefield | Origin$ Library | Destination$ Battle S:Mode$ CantBeCast | Origin$ Graveyard | Description$ Players can't cast spells from graveyards or libraries. S:Mode$ CantBeCast | Origin$ Library SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/grafdiggers_cage.jpg Oracle:Creature cards in graveyards and libraries can't enter the battlefield.\nPlayers can't cast spells from graveyards or libraries. diff --git a/forge-gui/res/cardsfolder/g/grafted_skullcap.txt b/forge-gui/res/cardsfolder/g/grafted_skullcap.txt index d9b81bec752..015c824b83a 100644 --- a/forge-gui/res/cardsfolder/g/grafted_skullcap.txt +++ b/forge-gui/res/cardsfolder/g/grafted_skullcap.txt @@ -5,6 +5,6 @@ T:Mode$ Phase | Phase$ Draw | ValidPlayer$ You | TriggerZones$ Battlefield | Exe T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ At the beginning of your end step, discard your hand. SVar:TrigDraw:DB$Draw | NumCards$ 1 SVar:TrigDiscard:DB$Discard | Mode$ Hand -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/grafted_skullcap.jpg Oracle:At the beginning of your draw step, draw an additional card.\nAt the beginning of your end step, discard your hand. diff --git a/forge-gui/res/cardsfolder/g/grand_architect.txt b/forge-gui/res/cardsfolder/g/grand_architect.txt index 869579f7b3e..8a7dee51591 100644 --- a/forge-gui/res/cardsfolder/g/grand_architect.txt +++ b/forge-gui/res/cardsfolder/g/grand_architect.txt @@ -5,6 +5,6 @@ PT:1/3 S:Mode$ Continuous | Affected$ Creature.Blue+Other+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Other blue creatures you control get +1/+1. A:AB$ Animate | Cost$ U | ValidTgts$ Creature.Artifact | TgtPrompt$ Select target artifact creature | Colors$ Blue | OverwriteColors$ True | SpellDescription$ Target artifact creature becomes blue until end of turn. A:AB$ Mana | Cost$ tapXType<1/Creature.Blue> | Produced$ C | Amount$ 2 | RestrictValid$ Card.Artifact,Activated.Artifact | SpellDescription$ Add {C}{C}. Spend this mana only to cast artifact spells or activate abilities of artifacts. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/grand_architect.jpg Oracle:Other blue creatures you control get +1/+1.\n{U}: Target artifact creature becomes blue until end of turn.\nTap an untapped blue creature you control: Add {C}{C}. Spend this mana only to cast artifact spells or activate abilities of artifacts. diff --git a/forge-gui/res/cardsfolder/g/grassland_crusader.txt b/forge-gui/res/cardsfolder/g/grassland_crusader.txt index c272d5d33ed..9648676f053 100644 --- a/forge-gui/res/cardsfolder/g/grassland_crusader.txt +++ b/forge-gui/res/cardsfolder/g/grassland_crusader.txt @@ -3,6 +3,6 @@ ManaCost:5 W Types:Creature Human Cleric Soldier PT:2/4 A:AB$ Pump | Cost$ T | NumAtt$ +2 | NumDef$ +2 | ValidTgts$ Creature.Elf,Creature.Soldier | TgtPrompt$ Select target Elf or Soldier creature | SpellDescription$ Target Elf or Soldier creature gets +2/+2 until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/grassland_crusader.jpg Oracle:{T}: Target Elf or Soldier creature gets +2/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/g/grave_consequences.txt b/forge-gui/res/cardsfolder/g/grave_consequences.txt index efa81c33f5a..305d8f21676 100644 --- a/forge-gui/res/cardsfolder/g/grave_consequences.txt +++ b/forge-gui/res/cardsfolder/g/grave_consequences.txt @@ -11,6 +11,6 @@ SVar:DBLoseLife:DB$ LoseLife | Defined$ Player.IsRemembered | LifeAmount$ X | Re SVar:DBDraw:DB$ Draw | NumCards$ 1 SVar:X:Count$ValidGraveyard Card.RememberedPlayerCtrl SVar:Y:Count$ChosenNumber -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/grave_consequences.jpg Oracle:Each player may exile any number of cards from their graveyard. Then each player loses 1 life for each card in their graveyard.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/g/grave_peril.txt b/forge-gui/res/cardsfolder/g/grave_peril.txt index cf5d691b858..d4ba0be0cb1 100644 --- a/forge-gui/res/cardsfolder/g/grave_peril.txt +++ b/forge-gui/res/cardsfolder/g/grave_peril.txt @@ -5,6 +5,6 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creatu SVar:TrigSac:DB$ SacrificeAll | ValidCards$ Card.Self | SubAbility$ DBDestroy | RememberSacrificed$ True SVar:DBDestroy:DB$ Destroy | Defined$ TriggeredCard | ConditionDefined$ Remembered | ConditionPresent$ Card SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/grave_peril.jpg Oracle:When a nonblack creature enters the battlefield, sacrifice Grave Peril. If you do, destroy that creature. diff --git a/forge-gui/res/cardsfolder/g/grave_servitude.txt b/forge-gui/res/cardsfolder/g/grave_servitude.txt index 2ac04286d2f..a0ef4724132 100644 --- a/forge-gui/res/cardsfolder/g/grave_servitude.txt +++ b/forge-gui/res/cardsfolder/g/grave_servitude.txt @@ -5,6 +5,6 @@ K:Enchant creature K:MayFlashSac A:SP$ Attach | Cost$ 1 B | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 3 | AddToughness$ -1 | SetColor$ Black | Description$ Enchanted creature gets +3/-1 and is black. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/grave_servitude.jpg Oracle:You may cast Grave Servitude as though it had flash. If you cast it any time a sorcery couldn't have been cast, the controller of the permanent it becomes sacrifices it at the beginning of the next cleanup step.\nEnchant creature\nEnchanted creature gets +3/-1 and is black. diff --git a/forge-gui/res/cardsfolder/g/gravebind.txt b/forge-gui/res/cardsfolder/g/gravebind.txt index 2ebf4cfa3da..696013576bf 100644 --- a/forge-gui/res/cardsfolder/g/gravebind.txt +++ b/forge-gui/res/cardsfolder/g/gravebind.txt @@ -4,7 +4,7 @@ Types:Instant A:SP$ Pump | Cost$ B | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME can't be regenerated. | IsCurse$ True | SubAbility$ DelTrigSlowtrip | SpellDescription$ Target creature can't be regenerated this turn. Draw a card at the beginning of the next turn's upkeep. SVar:DelTrigSlowtrip:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ DrawSlowtrip | TriggerDescription$ Draw a card. SVar:DrawSlowtrip:DB$Draw | NumCards$ 1 | Defined$ You -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/gravebind.jpg Oracle:Target creature can't be regenerated this turn.\nDraw a card at the beginning of the next turn's upkeep. diff --git a/forge-gui/res/cardsfolder/g/graven_cairns.txt b/forge-gui/res/cardsfolder/g/graven_cairns.txt index cba0c6a7e6f..eef51eac438 100644 --- a/forge-gui/res/cardsfolder/g/graven_cairns.txt +++ b/forge-gui/res/cardsfolder/g/graven_cairns.txt @@ -5,6 +5,6 @@ A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ BR T | Produced$ B | Amount$ 2 | SpellDescription$ Add {B}{B}. A:AB$ Mana | Cost$ BR T | Produced$ B R | SpellDescription$ Add {B}{R}. A:AB$ Mana | Cost$ BR T | Produced$ R | Amount$ 2 | SpellDescription$ Add {R}{R}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/graven_cairns.jpg Oracle:{T}: Add {C}.\n{B/R}, {T}: Add {B}{B}, {B}{R}, or {R}{R}. diff --git a/forge-gui/res/cardsfolder/g/gravepurge.txt b/forge-gui/res/cardsfolder/g/gravepurge.txt index 332208695d6..8766047600d 100644 --- a/forge-gui/res/cardsfolder/g/gravepurge.txt +++ b/forge-gui/res/cardsfolder/g/gravepurge.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ ChangeZone | Cost$ 2 B | Origin$ Graveyard | Destination$ Library | TargetMin$ 0 | TargetMax$ X | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SubAbility$ DBDraw | References$ X | SpellDescription$ Put any number of target creature cards from your graveyard on top of your library. SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. SVar:X:Count$TypeInYourYard.Creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gravepurge.jpg Oracle:Put any number of target creature cards from your graveyard on top of your library.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/g/gravespawn_sovereign.txt b/forge-gui/res/cardsfolder/g/gravespawn_sovereign.txt index a6364dcb8e9..0f4cdaf6788 100644 --- a/forge-gui/res/cardsfolder/g/gravespawn_sovereign.txt +++ b/forge-gui/res/cardsfolder/g/gravespawn_sovereign.txt @@ -3,6 +3,6 @@ ManaCost:4 B B Types:Creature Zombie PT:3/3 A:AB$ ChangeZone | Cost$ tapXType<5/Zombie> | TgtPrompt$ Choose target creature card in a graveyard | GainControl$ True | ValidTgts$ Creature | Origin$ Graveyard | Destination$ Battlefield | SpellDescription$ Put target creature card from a graveyard onto the battlefield under your control. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/gravespawn_sovereign.jpg Oracle:Tap five untapped Zombies you control: Put target creature card from a graveyard onto the battlefield under your control. diff --git a/forge-gui/res/cardsfolder/g/gravitational_shift.txt b/forge-gui/res/cardsfolder/g/gravitational_shift.txt index bf75b3a3585..d4e040c501d 100644 --- a/forge-gui/res/cardsfolder/g/gravitational_shift.txt +++ b/forge-gui/res/cardsfolder/g/gravitational_shift.txt @@ -4,6 +4,6 @@ Types:Enchantment S:Mode$ Continuous | Affected$ Creature.withFlying | AddPower$ 2 | Description$ Creatures with flying get +2/+0. S:Mode$ Continuous | Affected$ Creature.withoutFlying | AddPower$ -2 | Description$ Creatures without flying get -2/-0. SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/gravitational_shift.jpg Oracle:Creatures with flying get +2/+0.\nCreatures without flying get -2/-0. diff --git a/forge-gui/res/cardsfolder/g/gravity_sphere.txt b/forge-gui/res/cardsfolder/g/gravity_sphere.txt index 11f708b56ea..5f4322b00c8 100644 --- a/forge-gui/res/cardsfolder/g/gravity_sphere.txt +++ b/forge-gui/res/cardsfolder/g/gravity_sphere.txt @@ -4,6 +4,6 @@ Types:World Enchantment S:Mode$ Continuous | Affected$ Creature | RemoveKeyword$ Flying | Description$ All creatures lose flying. SVar:NonStackingEffect:True SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/gravity_sphere.jpg Oracle:All creatures lose flying. diff --git a/forge-gui/res/cardsfolder/g/grazing_kelpie.txt b/forge-gui/res/cardsfolder/g/grazing_kelpie.txt index df135564069..eb7f88e735f 100644 --- a/forge-gui/res/cardsfolder/g/grazing_kelpie.txt +++ b/forge-gui/res/cardsfolder/g/grazing_kelpie.txt @@ -4,6 +4,6 @@ Types:Creature Beast PT:2/3 K:Persist A:AB$ ChangeZone | Cost$ GU Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Library | ValidTgts$ Card | TgtPrompt$ Select target card from a graveyard | LibraryPosition$ -1 | SpellDescription$ Put target card from a graveyard on the bottom of its owner's library. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/grazing_kelpie.jpg Oracle:{G/U}, Sacrifice Grazing Kelpie: Put target card from a graveyard on the bottom of its owner's library.\nPersist (When this creature dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.) diff --git a/forge-gui/res/cardsfolder/g/great_defender.txt b/forge-gui/res/cardsfolder/g/great_defender.txt index d57db92db12..05622ba0325 100644 --- a/forge-gui/res/cardsfolder/g/great_defender.txt +++ b/forge-gui/res/cardsfolder/g/great_defender.txt @@ -3,6 +3,6 @@ ManaCost:W Types:Instant A:SP$ Pump | Cost$ W | ValidTgts$ Creature | NumDef$ +X | TgtPrompt$ Select target creature | References$ X | SpellDescription$ Target creature gets +0/+X until end of turn, where X is its converted mana cost. SVar:X:Targeted$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/great_defender.jpg Oracle:Target creature gets +0/+X until end of turn, where X is its converted mana cost. diff --git a/forge-gui/res/cardsfolder/g/great_wall.txt b/forge-gui/res/cardsfolder/g/great_wall.txt index c3597e8ee5f..c0d9999409b 100644 --- a/forge-gui/res/cardsfolder/g/great_wall.txt +++ b/forge-gui/res/cardsfolder/g/great_wall.txt @@ -3,6 +3,6 @@ ManaCost:2 W Types:Enchantment S:Mode$ Continuous | Affected$ Creature.withPlainswalk | AddHiddenKeyword$ May be blocked as though it doesn't have Plainswalk. | Description$ Creatures with plainswalk can be blocked as though they didn't have plainswalk. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/great_wall.jpg Oracle:Creatures with plainswalk can be blocked as though they didn't have plainswalk. diff --git a/forge-gui/res/cardsfolder/g/greater_good.txt b/forge-gui/res/cardsfolder/g/greater_good.txt index 1097381c38e..10ad093f549 100644 --- a/forge-gui/res/cardsfolder/g/greater_good.txt +++ b/forge-gui/res/cardsfolder/g/greater_good.txt @@ -5,6 +5,6 @@ A:AB$ Draw | Cost$ Sac<1/Creature> | NumCards$ X | SubAbility$ DB | References$ SVar:DB:DB$Discard | NumCards$ 3 | Mode$ TgtChoose SVar:X:Sacrificed$CardPower SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/greater_good.jpg Oracle:Sacrifice a creature: Draw cards equal to the sacrificed creature's power, then discard three cards. diff --git a/forge-gui/res/cardsfolder/g/greater_realm_of_preservation.txt b/forge-gui/res/cardsfolder/g/greater_realm_of_preservation.txt index 2d76e174b1f..c2de99e8738 100644 --- a/forge-gui/res/cardsfolder/g/greater_realm_of_preservation.txt +++ b/forge-gui/res/cardsfolder/g/greater_realm_of_preservation.txt @@ -6,6 +6,6 @@ SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPreventNextFromSource | SVars$ R SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.ChosenCard+BlackSource,Card.ChosenCard+RedSource | ValidTarget$ You | ReplaceWith$ ExileEffect | PreventionEffect$ True | Description$ The next time the chosen black or red source deals damage to you, prevent that damage. SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/greater_realm_of_preservation.jpg Oracle:{1}{W}: The next time a black or red source of your choice would deal damage to you this turn, prevent that damage. diff --git a/forge-gui/res/cardsfolder/g/greel_mind_raker.txt b/forge-gui/res/cardsfolder/g/greel_mind_raker.txt index 05d1e11fd61..63329467c0c 100644 --- a/forge-gui/res/cardsfolder/g/greel_mind_raker.txt +++ b/forge-gui/res/cardsfolder/g/greel_mind_raker.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Horror Spellshaper PT:3/3 A:AB$ Discard | Cost$ X B T Discard<2/Card> | ValidTgts$ Player | NumCards$ X | Mode$ Random | References$ X | SpellDescription$ Target player discards X cards at random. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/greel_mind_raker.jpg Oracle:{X}{B}, {T}, Discard two cards: Target player discards X cards at random. diff --git a/forge-gui/res/cardsfolder/g/green_mana_battery.txt b/forge-gui/res/cardsfolder/g/green_mana_battery.txt index e5bc61d216a..24c156d0ea2 100644 --- a/forge-gui/res/cardsfolder/g/green_mana_battery.txt +++ b/forge-gui/res/cardsfolder/g/green_mana_battery.txt @@ -6,6 +6,6 @@ A:AB$ Mana | Cost$ T SubCounter | Produced$ G | Amount$ Y | CostDesc$ SVar:Y:Number$1/Plus.ChosenX SVar:X:XChoice #ChosenX SVar created by Cost payment -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/green_mana_battery.jpg Oracle:{2}, {T}: Put a charge counter on Green Mana Battery.\n{T}, Remove any number of charge counters from Green Mana Battery: Add {G}, then add an additional {G} for each charge counter removed this way. diff --git a/forge-gui/res/cardsfolder/g/green_scarab.txt b/forge-gui/res/cardsfolder/g/green_scarab.txt index 3a1d0cf18c8..77600c350e4 100644 --- a/forge-gui/res/cardsfolder/g/green_scarab.txt +++ b/forge-gui/res/cardsfolder/g/green_scarab.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ W | ValidTgts$ Creature | AILogic$ Pump S:Mode$ CantBlockBy | ValidAttacker$ Creature.EnchantedBy | ValidBlocker$ Creature.Green | Description$ Enchanted creature can't be blocked by green creatures. S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 2 | AddToughness$ 2 | IsPresent$ Permanent.Green+OppCtrl | Description$ Enchanted creature gets +2/+2 as long as an opponent controls a green permanent. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/green_scarab.jpg Oracle:Enchant creature\nEnchanted creature can't be blocked by green creatures.\nEnchanted creature gets +2/+2 as long as an opponent controls a green permanent. diff --git a/forge-gui/res/cardsfolder/g/green_ward.txt b/forge-gui/res/cardsfolder/g/green_ward.txt index cb61244d4d5..dd7d9f82954 100644 --- a/forge-gui/res/cardsfolder/g/green_ward.txt +++ b/forge-gui/res/cardsfolder/g/green_ward.txt @@ -4,6 +4,6 @@ Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ W | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Protection:Card.Green:Protection from green:Card.CardUID_HostCardUID | Description$ Enchanted creature has protection from green. This effect doesn't remove CARDNAME. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/green_ward.jpg Oracle:Enchant creature\nEnchanted creature has protection from green. This effect doesn't remove Green Ward. diff --git a/forge-gui/res/cardsfolder/g/greener_pastures.txt b/forge-gui/res/cardsfolder/g/greener_pastures.txt index d7fd6c06cad..b02d0c8b004 100644 --- a/forge-gui/res/cardsfolder/g/greener_pastures.txt +++ b/forge-gui/res/cardsfolder/g/greener_pastures.txt @@ -5,6 +5,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ TrigToken | Check SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ TriggeredPlayer | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 SVar:ActiveLands:Count$Valid Land.ActivePlayerCtrl SVar:HighestOpp:PlayerCountNonActive$HighestValid Land.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/greener_pastures.jpg Oracle:At the beginning of each player's upkeep, if that player controls more lands than each other player, the player creates a 1/1 green Saproling creature token. diff --git a/forge-gui/res/cardsfolder/g/greenhilt_trainee.txt b/forge-gui/res/cardsfolder/g/greenhilt_trainee.txt index 9582f7654b8..3f1dc8c206f 100644 --- a/forge-gui/res/cardsfolder/g/greenhilt_trainee.txt +++ b/forge-gui/res/cardsfolder/g/greenhilt_trainee.txt @@ -3,6 +3,6 @@ ManaCost:3 G Types:Creature Elf Warrior PT:2/3 A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | IsPresent$ Card.powerGE4+Self | NumAtt$ +4 | NumDef$ +4 | SpellDescription$ Target creature gets +4/+4 until end of turn. Activate this ability only if CARDNAME's power is 4 or greater. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/greenhilt_trainee.jpg Oracle:{T}: Target creature gets +4/+4 until end of turn. Activate this ability only if Greenhilt Trainee's power is 4 or greater. diff --git a/forge-gui/res/cardsfolder/g/greenseeker.txt b/forge-gui/res/cardsfolder/g/greenseeker.txt index 2afc5a55036..f9f7d5a9b07 100644 --- a/forge-gui/res/cardsfolder/g/greenseeker.txt +++ b/forge-gui/res/cardsfolder/g/greenseeker.txt @@ -3,6 +3,6 @@ ManaCost:G Types:Creature Elf Spellshaper PT:1/1 A:AB$ ChangeZone | Cost$ G T Discard<1/Card> | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeNum$ 1 | SpellDescription$ Search your library for a basic land card, reveal it, put it into your hand, then shuffle your library. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/greenseeker.jpg Oracle:{G}, {T}, Discard a card: Search your library for a basic land card, reveal it, put it into your hand, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/g/gremlin_mine.txt b/forge-gui/res/cardsfolder/g/gremlin_mine.txt index cf91d529cc1..317a43cff8a 100644 --- a/forge-gui/res/cardsfolder/g/gremlin_mine.txt +++ b/forge-gui/res/cardsfolder/g/gremlin_mine.txt @@ -3,6 +3,6 @@ ManaCost:1 Types:Artifact A:AB$ DealDamage | Cost$ 1 T Sac<1/CARDNAME> | ValidTgts$ Creature.Artifact | TgtPrompt$ Select target artifact creature | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target artifact creature. A:AB$ RemoveCounter | Cost$ 1 T Sac<1/CARDNAME> | ValidTgts$ Artifact.nonCreature | TgtPrompt$ Select target noncreature artifact | CounterType$ CHARGE | CounterNum$ 4 | UpTo$ True | SpellDescription$ Remove up to four charge counters from target noncreature artifact. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gremlin_mine.jpg Oracle:{1}, {T}, Sacrifice Gremlin Mine: Gremlin Mine deals 4 damage to target artifact creature.\n{1}, {T}, Sacrifice Gremlin Mine: Remove up to four charge counters from target noncreature artifact. diff --git a/forge-gui/res/cardsfolder/g/grenzo_dungeon_warden.txt b/forge-gui/res/cardsfolder/g/grenzo_dungeon_warden.txt index 48984f87632..6efc87c417c 100644 --- a/forge-gui/res/cardsfolder/g/grenzo_dungeon_warden.txt +++ b/forge-gui/res/cardsfolder/g/grenzo_dungeon_warden.txt @@ -8,6 +8,6 @@ A:AB$ ChangeZone | Cost$ 2 | Defined$ BottomOfLibrary | Origin$ Library | Destin SVar:DBChangeZone:DB$ ChangeZone | Defined$ Remembered | Origin$ All | Destination$ Battlefield | Hidden$ True | ConditionDefined$ Remembered | ConditionPresent$ Card.Creature+powerLEY | ConditionCompare$ GE1 | References$ Y | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Y:Count$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/grenzo_dungeon_warden.jpg Oracle:Grenzo, Dungeon Warden enters the battlefield with X +1/+1 counters on it.\n{2}: Put the bottom card of your library into your graveyard. If it's a creature card with power less than or equal to Grenzo's power, put it onto the battlefield. diff --git a/forge-gui/res/cardsfolder/g/grenzos_rebuttal.txt b/forge-gui/res/cardsfolder/g/grenzos_rebuttal.txt index 6ba6b133215..ac9972822ba 100644 --- a/forge-gui/res/cardsfolder/g/grenzos_rebuttal.txt +++ b/forge-gui/res/cardsfolder/g/grenzos_rebuttal.txt @@ -8,6 +8,6 @@ SVar:DBChooseCreature:DB$ ChooseCard | Defined$ Remembered | Choices$ Creature.C SVar:DBChooseLand:DB$ ChooseCard | Defined$ Remembered | Choices$ Land.ControlledByPlayerInTheDirection_Left_Player.IsRemembered | ChoiceTitle$ Choose a land | Mandatory$ True | RememberChosen$ True SVar:DBDestroy:DB$ Destroy | Defined$ Remembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/grenzos_rebuttal.jpg Oracle:Create a 4/4 red Ogre creature token. Starting with you, each player chooses an artifact, a creature, and a land from among the permanents controlled by the player to their left. Destroy each permanent chosen this way. diff --git a/forge-gui/res/cardsfolder/g/grid_monitor.txt b/forge-gui/res/cardsfolder/g/grid_monitor.txt index 69494782c25..c32cfc9ca47 100644 --- a/forge-gui/res/cardsfolder/g/grid_monitor.txt +++ b/forge-gui/res/cardsfolder/g/grid_monitor.txt @@ -3,6 +3,6 @@ ManaCost:4 Types:Artifact Creature Construct PT:4/6 S:Mode$ CantBeCast | ValidCard$ Creature | Caster$ You | Description$ You can't cast creature spells. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/grid_monitor.jpg Oracle:You can't cast creature spells. diff --git a/forge-gui/res/cardsfolder/g/griffin_canyon.txt b/forge-gui/res/cardsfolder/g/griffin_canyon.txt index 684e5eacf0d..1769a16b665 100644 --- a/forge-gui/res/cardsfolder/g/griffin_canyon.txt +++ b/forge-gui/res/cardsfolder/g/griffin_canyon.txt @@ -4,6 +4,6 @@ Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Untap | Cost$ T | ValidTgts$ Griffin | TgtPrompt$ Select target Griffin | SubAbility$ DBPump | SpellDescription$ Untap target Griffin. If it's a creature, it gets +1/+1 until end of turn. SVar:DBPump:DB$Pump | NumAtt$ +1 | NumDef$ +1 | Defined$ Targeted -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/griffin_canyon.jpg Oracle:{T}: Add {C}.\n{T}: Untap target Griffin. If it's a creature, it gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/g/griffin_rider.txt b/forge-gui/res/cardsfolder/g/griffin_rider.txt index 0ff00807884..e3c913c24da 100644 --- a/forge-gui/res/cardsfolder/g/griffin_rider.txt +++ b/forge-gui/res/cardsfolder/g/griffin_rider.txt @@ -5,7 +5,7 @@ PT:1/1 S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 3 | AddToughness$ 3 | AddKeyword$ Flying | CheckSVar$ X | SVarCompare$ GE1 | Description$ As long as you control a Griffin, CARDNAME gets +3/+3 and has flying. SVar:X:Count$Valid Griffin.YouCtrl SVar:BuffedBy:Griffin -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Griffin SVar:Picture:http://www.wizards.com/global/images/magic/general/griffin_rider.jpg Oracle:As long as you control a Griffin creature, Griffin Rider gets +3/+3 and has flying. diff --git a/forge-gui/res/cardsfolder/g/grim_contest.txt b/forge-gui/res/cardsfolder/g/grim_contest.txt index 1d44911936c..d6a0c5276e3 100644 --- a/forge-gui/res/cardsfolder/g/grim_contest.txt +++ b/forge-gui/res/cardsfolder/g/grim_contest.txt @@ -3,6 +3,6 @@ ManaCost:1 B G Types:Instant A:SP$ Pump | Cost$ 1 B G | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Choose target creature you control | SubAbility$ DBFight | SpellDescription$ Choose target creature you control and target creature an opponent controls. Each of those creatures deals damage equal to its toughness to the other. SVar:DBFight:DB$ Fight | Defined$ ParentTarget | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls | FightWithToughness$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/grim_contest.jpg Oracle:Choose target creature you control and target creature an opponent controls. Each of those creatures deals damage equal to its toughness to the other. diff --git a/forge-gui/res/cardsfolder/g/grim_feast.txt b/forge-gui/res/cardsfolder/g/grim_feast.txt index e7b2ba5955e..bbf40212e4b 100644 --- a/forge-gui/res/cardsfolder/g/grim_feast.txt +++ b/forge-gui/res/cardsfolder/g/grim_feast.txt @@ -7,6 +7,6 @@ SVar:TrigDamage:DB$ DealDamage | Defined$ You | NumDmg$ 1 SVar:TrigGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X SVar:X:TriggeredCard$CardToughness SVar:AICastPreference:MaxControlled$ 1 | NeverCastIfLifeBelow$ 5 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/grim_feast.jpg Oracle:At the beginning of your upkeep, Grim Feast deals 1 damage to you.\nWhenever a creature is put into an opponent's graveyard from the battlefield, you gain life equal to its toughness. diff --git a/forge-gui/res/cardsfolder/g/grim_monolith.txt b/forge-gui/res/cardsfolder/g/grim_monolith.txt index 8bb293f6252..ca1487726f4 100644 --- a/forge-gui/res/cardsfolder/g/grim_monolith.txt +++ b/forge-gui/res/cardsfolder/g/grim_monolith.txt @@ -4,6 +4,6 @@ Types:Artifact K:CARDNAME doesn't untap during your untap step. A:AB$ Untap | Cost$ 4 | AILogic$ EOT | SpellDescription$ Untap CARDNAME. A:AB$ Mana | Cost$ T | Produced$ C | Amount$ 3 | SpellDescription$ Add {C}{C}{C}. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/grim_monolith.jpg Oracle:Grim Monolith doesn't untap during your untap step.\n{T}: Add {C}{C}{C}.\n{4}: Untap Grim Monolith. diff --git a/forge-gui/res/cardsfolder/g/grim_reminder.txt b/forge-gui/res/cardsfolder/g/grim_reminder.txt index 4efefd9138b..d3c122e32f5 100644 --- a/forge-gui/res/cardsfolder/g/grim_reminder.txt +++ b/forge-gui/res/cardsfolder/g/grim_reminder.txt @@ -8,7 +8,7 @@ SVar:DBShuffle:DB$ Shuffle | Defined$ You | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True SVar:LoseLifeCheck:Count$ThisTurnCast_Card.RememberedPlayerCtrl+sharesNameWith Imprinted A:AB$ ChangeZone | Cost$ B B | Origin$ Graveyard | Destination$ Hand | ActivationZone$ Graveyard | ActivationPhases$ Upkeep | PlayerTurn$ True | SpellDescription$ Return CARDNAME from your graveyard to your hand. Activate this ability only during your upkeep.. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/grim_reminder.jpg Oracle:Search your library for a nonland card and reveal it. Each opponent who cast a card this turn with the same name as that card loses 6 life. Then shuffle your library.\n{B}{B}: Return Grim Reminder from your graveyard to your hand. Activate this ability only during your upkeep. diff --git a/forge-gui/res/cardsfolder/g/grim_tutor.txt b/forge-gui/res/cardsfolder/g/grim_tutor.txt index fe868748864..a1edad5b93d 100644 --- a/forge-gui/res/cardsfolder/g/grim_tutor.txt +++ b/forge-gui/res/cardsfolder/g/grim_tutor.txt @@ -5,6 +5,6 @@ A:SP$ ChangeZone | Cost$ 1 B B | Origin$ Library | Destination$ Hand | ChangeTyp SVar:DBLoseLife:DB$LoseLife | LifeAmount$ 3 #TODO: The AI will currently search for the most expensive valid card in the library. This can be used to the AI's advantage with #careful deck design (which is why this card only works in properly designed AI decks). Consider improving tutoring logic with priorities. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/grim_tutor.jpg Oracle:Search your library for a card and put that card into your hand, then shuffle your library. You lose 3 life. diff --git a/forge-gui/res/cardsfolder/g/grimgrin_corpse_born.txt b/forge-gui/res/cardsfolder/g/grimgrin_corpse_born.txt index 7ee8739d50b..e4fe5ff7979 100644 --- a/forge-gui/res/cardsfolder/g/grimgrin_corpse_born.txt +++ b/forge-gui/res/cardsfolder/g/grimgrin_corpse_born.txt @@ -9,7 +9,7 @@ SVar:DBPutCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$1 T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ Whenever CARDNAME attacks, destroy target creature defending player controls, then put a +1/+1 counter on CARDNAME. SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Creature.DefenderCtrl | TgtPrompt$ Select target creature | SubAbility$ DBPutCounter SVar:DBPutCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:HasAttackEffect:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/grimgrin_corpse_born.jpg Oracle:Grimgrin, Corpse-Born enters the battlefield tapped and doesn't untap during your untap step.\nSacrifice another creature: Untap Grimgrin and put a +1/+1 counter on it.\nWhenever Grimgrin attacks, destroy target creature defending player controls, then put a +1/+1 counter on Grimgrin. diff --git a/forge-gui/res/cardsfolder/g/grimoire_of_the_dead.txt b/forge-gui/res/cardsfolder/g/grimoire_of_the_dead.txt index b0876b2a53d..e549db6be35 100644 --- a/forge-gui/res/cardsfolder/g/grimoire_of_the_dead.txt +++ b/forge-gui/res/cardsfolder/g/grimoire_of_the_dead.txt @@ -5,7 +5,7 @@ A:AB$ PutCounter | Cost$ 1 T Discard<1/Card> | Defined$ Self | CounterType$ STUD A:AB$ ChangeZoneAll | Cost$ T SubCounter<3/STUDY> Sac<1/CARDNAME> | ChangeType$ Creature | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | RememberChanged$ True | SubAbility$ DBAnimate | SpellDescription$ Put all creature cards in all graveyards onto the battlefield under your control. They are black Zombies in addition to their other colors and types. SVar:DBAnimate:DB$ AnimateAll | ValidCards$ Creature.IsRemembered | Colors$ Black | Types$ Zombie | Permanent$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:IsReanimatorCard:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/grimoire_of_the_dead.jpg Oracle:{1}, {T}, Discard a card: Put a study counter on Grimoire of the Dead.\n{T}, Remove three study counters from Grimoire of the Dead and sacrifice it: Put all creature cards from all graveyards onto the battlefield under your control. They're black Zombies in addition to their other colors and types. diff --git a/forge-gui/res/cardsfolder/g/grimoire_thief.txt b/forge-gui/res/cardsfolder/g/grimoire_thief.txt index 16a2617872c..a35d0ff77aa 100644 --- a/forge-gui/res/cardsfolder/g/grimoire_thief.txt +++ b/forge-gui/res/cardsfolder/g/grimoire_thief.txt @@ -11,7 +11,7 @@ T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCar SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/grimoire_thief.jpg Oracle:Whenever Grimoire Thief becomes tapped, exile the top three cards of target opponent's library face down.\nYou may look at cards exiled with Grimoire Thief.\n{U}, Sacrifice Grimoire Thief: Turn all cards exiled with Grimoire Thief face up. Counter all spells with those names. diff --git a/forge-gui/res/cardsfolder/g/grinding_station.txt b/forge-gui/res/cardsfolder/g/grinding_station.txt index 5ae24fe6937..cf0c37395d4 100644 --- a/forge-gui/res/cardsfolder/g/grinding_station.txt +++ b/forge-gui/res/cardsfolder/g/grinding_station.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ Mill | Cost$ T Sac<1/Artifact> | NumCards$ 3 | ValidTgts$ Player | TgtPrompt$ Select target player | SpellDescription$ Target player puts the top three cards of their library into their graveyard. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Artifact | IsPresent$ Card.Self | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ Whenever an artifact enters the battlefield, you may untap CARDNAME. SVar:TrigUntap:DB$Untap | Defined$ Self -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/grinding_station.jpg Oracle:{T}, Sacrifice an artifact: Target player puts the top three cards of their library into their graveyard.\nWhenever an artifact enters the battlefield, you may untap Grinding Station. diff --git a/forge-gui/res/cardsfolder/g/grinning_ignus.txt b/forge-gui/res/cardsfolder/g/grinning_ignus.txt index dfbbe0c6561..2548af5fad8 100644 --- a/forge-gui/res/cardsfolder/g/grinning_ignus.txt +++ b/forge-gui/res/cardsfolder/g/grinning_ignus.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Creature Elemental PT:2/2 A:AB$ Mana | Cost$ R Return<1/CARDNAME> | Produced$ C C R | Amount$ 1 | SorcerySpeed$ True | SpellDescription$ Add {C}{C}{R}. Activate this ability only any time you could cast a sorcery. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/grinning_ignus.jpg Oracle:{R}, Return Grinning Ignus to its owner's hand: Add {C}{C}{R}. Activate this ability only any time you could cast a sorcery. diff --git a/forge-gui/res/cardsfolder/g/grinning_totem.txt b/forge-gui/res/cardsfolder/g/grinning_totem.txt index 84a9176d493..8194fd08f06 100644 --- a/forge-gui/res/cardsfolder/g/grinning_totem.txt +++ b/forge-gui/res/cardsfolder/g/grinning_totem.txt @@ -18,6 +18,6 @@ SVar:RemoveEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination # Remove Totem Effect when the card is played SVar:TrigLandPlayed:Mode$ LandPlayed | ValidCard$ Land.IsRemembered | Static$ True | TriggerZones$ Command | Execute$ RemoveEffect SVar:TrigCast:Mode$ SpellCast | ValidCard$ Card.IsRemembered | Static$ True | TriggerZones$ Command | Execute$ RemoveEffect -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/grinning_totem.jpg Oracle:{2}, {T}, Sacrifice Grinning Totem: Search target opponent's library for a card and exile it. Then that player shuffles their library. Until the beginning of your next upkeep, you may play that card. At the beginning of your next upkeep, if you haven't played it, put it into its owner's graveyard. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/g/grip_of_chaos.txt b/forge-gui/res/cardsfolder/g/grip_of_chaos.txt index 8b1bc65caff..45948de78f9 100644 --- a/forge-gui/res/cardsfolder/g/grip_of_chaos.txt +++ b/forge-gui/res/cardsfolder/g/grip_of_chaos.txt @@ -3,6 +3,6 @@ ManaCost:4 R R Types:Enchantment T:Mode$ SpellAbilityCast | IsSingleTarget$ True | TriggerZones$ Battlefield | Execute$ TrigChangeTarget | TriggerDescription$ Whenever a spell or ability is put onto the stack, if it has a single target, reselect its target at random. (Select from among all legal targets.) SVar:TrigChangeTarget:DB$ ChangeTargets | Defined$ TriggeredSpellAbility | RandomTarget$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/grip_of_chaos.jpg Oracle:Whenever a spell or ability is put onto the stack, if it has a single target, reselect its target at random. (Select from among all legal targets.) diff --git a/forge-gui/res/cardsfolder/g/grixis_charm.txt b/forge-gui/res/cardsfolder/g/grixis_charm.txt index dd93b6b89d4..11e69d3c932 100644 --- a/forge-gui/res/cardsfolder/g/grixis_charm.txt +++ b/forge-gui/res/cardsfolder/g/grixis_charm.txt @@ -5,6 +5,6 @@ A:SP$ Charm | Cost$ U B R | Choices$ DBChangeZone,DBPump,DBPumpAll | CharmNum$ 1 SVar:DBChangeZone:DB$ ChangeZone | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target permanent to its owner's hand. SVar:DBPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -4 | NumDef$ -4 | IsCurse$ True | SpellDescription$ Target creature gets -4/-4 until end of turn. SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.YouCtrl | NumAtt$ +2 | NumDef$ 0 | SpellDescription$ Creatures you control get +2/+0 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/grixis_charm.jpg Oracle:Choose one —\n• Return target permanent to its owner's hand.\n• Target creature gets -4/-4 until end of turn.\n• Creatures you control get +2/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/g/grixis_illusionist.txt b/forge-gui/res/cardsfolder/g/grixis_illusionist.txt index b6399b25d01..5d761c6874e 100644 --- a/forge-gui/res/cardsfolder/g/grixis_illusionist.txt +++ b/forge-gui/res/cardsfolder/g/grixis_illusionist.txt @@ -4,6 +4,6 @@ Types:Creature Human Wizard PT:1/1 A:AB$ ChooseType | Cost$ T | Defined$ You | Type$ Basic Land | SubAbility$ DBAnimate | SpellDescription$ Target land you control becomes the basic land type of your choice until end of turn. SVar:DBAnimate:DB$ Animate | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | Types$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/grixis_illusionist.jpg Oracle:{T}: Target land you control becomes the basic land type of your choice until end of turn. diff --git a/forge-gui/res/cardsfolder/g/grollub.txt b/forge-gui/res/cardsfolder/g/grollub.txt index 33f8e7bd252..c6c597e1ae4 100644 --- a/forge-gui/res/cardsfolder/g/grollub.txt +++ b/forge-gui/res/cardsfolder/g/grollub.txt @@ -5,6 +5,6 @@ PT:3/3 T:Mode$ DamageDoneOnce | ValidTarget$ Card.Self | Execute$ TrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME is dealt damage, each opponent gains that much life. SVar:TrigGain:DB$ GainLife | Defined$ Player.Opponent | LifeAmount$ X | References$ X SVar:X:TriggerCount$DamageAmount -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/grollub.jpg Oracle:Whenever Grollub is dealt damage, each opponent gains that much life. diff --git a/forge-gui/res/cardsfolder/g/ground_seal.txt b/forge-gui/res/cardsfolder/g/ground_seal.txt index 51b79cbaa8b..346867fbb80 100644 --- a/forge-gui/res/cardsfolder/g/ground_seal.txt +++ b/forge-gui/res/cardsfolder/g/ground_seal.txt @@ -5,6 +5,6 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 S:Mode$ CantTarget | AffectedZone$ Graveyard | Description$ Cards in graveyards can't be the targets of spells or abilities. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ground_seal.jpg Oracle:When Ground Seal enters the battlefield, draw a card.\nCards in graveyards can't be the targets of spells or abilities. diff --git a/forge-gui/res/cardsfolder/g/grozoth.txt b/forge-gui/res/cardsfolder/g/grozoth.txt index e88259c279d..0dde6905481 100644 --- a/forge-gui/res/cardsfolder/g/grozoth.txt +++ b/forge-gui/res/cardsfolder/g/grozoth.txt @@ -8,6 +8,6 @@ SVar:TrigChange:DB$ChangeZone | Origin$ Library | Destination$ Hand | ChangeType A:AB$ Debuff | Cost$ 4 | Keywords$ Defender | Defined$ Self | SpellDescription$ CARDNAME loses defender until end of turn. K:Transmute:1 U U SVar:X:Count$InYourLibrary -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/grozoth.jpg Oracle:Defender (This creature can't attack.)\nWhen Grozoth enters the battlefield, you may search your library for any number of cards that have converted mana cost 9, reveal them, and put them into your hand. If you do, shuffle your library.\n{4}: Grozoth loses defender until end of turn.\nTransmute {1}{U}{U} ({1}{U}{U}, Discard this card: Search your library for a card with the same converted mana cost as this card, reveal it, put it into your hand, then shuffle your library. Transmute only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/g/gruesome_slaughter.txt b/forge-gui/res/cardsfolder/g/gruesome_slaughter.txt index 2293826e2ab..318ebc1a9ab 100644 --- a/forge-gui/res/cardsfolder/g/gruesome_slaughter.txt +++ b/forge-gui/res/cardsfolder/g/gruesome_slaughter.txt @@ -4,7 +4,7 @@ Types:Instant A:SP$ AnimateAll | Cost$ 6 | ValidCards$ Creature.Colorless+YouCtrl | Abilities$ ThrowPunch | sVars$ GruesomeX | SpellDescription$ Until end of turn, colorless creatures you control gain "{T}: This creature deals damage equal to its power to target creature." SVar:ThrowPunch:AB$ DealDamage | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ GruesomeX | References$ GruesomeX | SpellDescription$ This creature deals damage equal to its power to target creature. SVar:GruesomeX:Count$CardPower -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Color$Colorless & Keyword$Devoid SVar:Picture:http://www.wizards.com/global/images/magic/general/gruesome_slaughter.jpg Oracle:Until end of turn, colorless creatures you control gain "{T}: This creature deals damage equal to its power to target creature." diff --git a/forge-gui/res/cardsfolder/g/gruul_cluestone.txt b/forge-gui/res/cardsfolder/g/gruul_cluestone.txt index c584b092496..6cce99af656 100644 --- a/forge-gui/res/cardsfolder/g/gruul_cluestone.txt +++ b/forge-gui/res/cardsfolder/g/gruul_cluestone.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. A:AB$ Draw | Cost$ R G T Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Red|Green SVar:Picture:http://www.wizards.com/global/images/magic/general/gruul_cluestone.jpg Oracle:{T}: Add {R} or {G}.\n{R}{G}, {T}, Sacrifice Gruul Cluestone: Draw a card. diff --git a/forge-gui/res/cardsfolder/g/gruul_keyrune.txt b/forge-gui/res/cardsfolder/g/gruul_keyrune.txt index 9170c9dcc0d..179dcfb3bde 100644 --- a/forge-gui/res/cardsfolder/g/gruul_keyrune.txt +++ b/forge-gui/res/cardsfolder/g/gruul_keyrune.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. A:AB$ Animate | Cost$ R G | Defined$ Self | Power$ 3 | Toughness$ 2 | Types$ Artifact,Creature,Beast | Colors$ Red,Green | Keywords$ Trample | SpellDescription$ CARDNAME becomes a 3/2 red and green Beast artifact creature with trample until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Red|Green SVar:Picture:http://www.wizards.com/global/images/magic/general/gruul_keyrune.jpg Oracle:{T}: Add {R} or {G}.\n{R}{G}: Gruul Keyrune becomes a 3/2 red and green Beast artifact creature with trample until end of turn. diff --git a/forge-gui/res/cardsfolder/g/gruul_scrapper.txt b/forge-gui/res/cardsfolder/g/gruul_scrapper.txt index 0b978ea3ecc..348bd861547 100644 --- a/forge-gui/res/cardsfolder/g/gruul_scrapper.txt +++ b/forge-gui/res/cardsfolder/g/gruul_scrapper.txt @@ -5,7 +5,7 @@ PT:3/2 T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | ManaSpent$ R | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, if {R} was spent to cast CARDNAME, it gains haste until end of turn. SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ Haste SVar:ManaNeededToAvoidNegativeEffect:red -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:PlayMain1:ALWAYS DeckNeeds:Color$Red SVar:Picture:http://www.wizards.com/global/images/magic/general/gruul_scrapper.jpg diff --git a/forge-gui/res/cardsfolder/g/gruul_signet.txt b/forge-gui/res/cardsfolder/g/gruul_signet.txt index 6e8fdd7024f..274a99d29c4 100644 --- a/forge-gui/res/cardsfolder/g/gruul_signet.txt +++ b/forge-gui/res/cardsfolder/g/gruul_signet.txt @@ -2,6 +2,6 @@ Name:Gruul Signet ManaCost:2 Types:Artifact A:AB$ Mana | Cost$ 1 T | Produced$ R G | SpellDescription$ Add {R}{G}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gruul_signet.jpg Oracle:{1}, {T}: Add {R}{G}. diff --git a/forge-gui/res/cardsfolder/g/guard_dogs.txt b/forge-gui/res/cardsfolder/g/guard_dogs.txt index 7ba08124c9c..e9bd45d6340 100644 --- a/forge-gui/res/cardsfolder/g/guard_dogs.txt +++ b/forge-gui/res/cardsfolder/g/guard_dogs.txt @@ -5,7 +5,7 @@ PT:2/2 A:AB$ ChooseCard | Cost$ 2 W T | Choices$ Permanent.YouCtrl | Amount$ 1 | ChoiceTitle$ Choose a permanent you control | RememberChosen$ True | SubAbility$ DBPrevent | SpellDescription$ Choose a permanent you control. Prevent all combat damage target creature would deal this turn if it shares a color with that permanent. SVar:DBPrevent:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature whose combat damage will be prevented | KW$ Prevent all combat damage that would be dealt by CARDNAME. | ConditionDefined$ Targeted | ConditionPresent$ Card.SharesColorWith Card.IsRemembered | ConditionCompare$ GE1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/guard_dogs.jpg Oracle:{2}{W}, {T}: Choose a permanent you control. Prevent all combat damage target creature would deal this turn if it shares a color with that permanent. diff --git a/forge-gui/res/cardsfolder/g/guardian_angel.txt b/forge-gui/res/cardsfolder/g/guardian_angel.txt index 8cf4e961ee7..555780e69a0 100644 --- a/forge-gui/res/cardsfolder/g/guardian_angel.txt +++ b/forge-gui/res/cardsfolder/g/guardian_angel.txt @@ -6,7 +6,7 @@ SVar:GuardianEffect:DB$ Effect | Name$ Guardian Angel Effect | Abilities$ ABProt SVar:ABProtect:AB$ PreventDamage | ActivationZone$ Command | Cost$ 1 | InstantSpeed$ True | Defined$ Remembered | Amount$ 1 | SpellDescription$ You may pay 1 any time you could cast an instant. If you do, prevent the next 1 damage that would be dealt to that permanent or player this turn. SVar:OutOfSight:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Defined$ Remembered | Execute$ ExileEffect | Static$ True SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile | Static$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:X:Count$xPaid SVar:Picture:http://www.wizards.com/global/images/magic/general/guardian_angel.jpg Oracle:Prevent the next X damage that would be dealt to any target this turn. Until end of turn, you may pay {1} any time you could cast an instant. If you do, prevent the next 1 damage that would be dealt to that permanent or player this turn. diff --git a/forge-gui/res/cardsfolder/g/guiding_spirit.txt b/forge-gui/res/cardsfolder/g/guiding_spirit.txt index 4f3a102ff79..7c04f0f8a89 100644 --- a/forge-gui/res/cardsfolder/g/guiding_spirit.txt +++ b/forge-gui/res/cardsfolder/g/guiding_spirit.txt @@ -4,7 +4,7 @@ Types:Creature Angel Spirit PT:1/2 K:Flying A:AB$ ChangeZoneAll | Cost$ T | ValidTgts$ Player | TgtPrompt$ Select target player | Origin$ Graveyard | Destination$ Library | ChangeType$ Card.TopGraveyardCreature | SpellDescription$ If the top card of target player's graveyard is a creature card, put that card on top of that player's library. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NeedsOrderedGraveyard:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/guiding_spirit.jpg Oracle:Flying\n{T}: If the top card of target player's graveyard is a creature card, put that card on top of that player's library. diff --git a/forge-gui/res/cardsfolder/g/guild_feud.txt b/forge-gui/res/cardsfolder/g/guild_feud.txt index ef9c78d9f37..3c60462bbeb 100644 --- a/forge-gui/res/cardsfolder/g/guild_feud.txt +++ b/forge-gui/res/cardsfolder/g/guild_feud.txt @@ -7,6 +7,6 @@ SVar:YouPick:DB$ Dig | Defined$ You | DigNum$ 3 | Reveal$ True | ChangeNum$ 1 | SVar:PicksFight:DB$ Fight | Defined$ Remembered | SubAbility$ DBCleanup | ConditionCheckSVar$ NumFighters | References$ NumFighters | ConditionSVarCompare$ EQ2 | StackDescription$ If two creatures are put onto the battlefield this way, those creatures fight each other. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:NumFighters:Remembered$Amount -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/guild_feud.jpg Oracle:At the beginning of your upkeep, target opponent reveals the top three cards of their library, may put a creature card from among them onto the battlefield, then puts the rest into their graveyard. You do the same with the top three cards of your library. If two creatures are put onto the battlefield this way, those creatures fight each other. diff --git a/forge-gui/res/cardsfolder/g/gurzigost.txt b/forge-gui/res/cardsfolder/g/gurzigost.txt index 92507a91bed..8bb176aca12 100644 --- a/forge-gui/res/cardsfolder/g/gurzigost.txt +++ b/forge-gui/res/cardsfolder/g/gurzigost.txt @@ -4,6 +4,6 @@ Types:Creature Beast PT:6/8 K:UpkeepCost:PutCardToLibFromGrave<2/-1/Card> A:AB$ Pump | Cost$ G G Discard<1/Card> | KW$ HIDDEN You may have CARDNAME assign its combat damage as though it weren't blocked. | SpellDescription$ You may have CARDNAME assign its combat damage this turn as though it weren't blocked. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gurzigost.jpg Oracle:At the beginning of your upkeep, sacrifice Gurzigost unless you put two cards from your graveyard on the bottom of your library.\n{G}{G}, Discard a card: You may have Gurzigost assign its combat damage this turn as though it weren't blocked. diff --git a/forge-gui/res/cardsfolder/g/gusthas_scepter.txt b/forge-gui/res/cardsfolder/g/gusthas_scepter.txt index 3c95bc0ca99..77f2badf6a4 100644 --- a/forge-gui/res/cardsfolder/g/gusthas_scepter.txt +++ b/forge-gui/res/cardsfolder/g/gusthas_scepter.txt @@ -14,6 +14,6 @@ T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.S T:Mode$ ChangesController | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ DBChangeZoneAll | Secondary$ True | TriggerDescription$ When you lose control of CARDNAME, put all cards exiled with CARDNAME into their owner's graveyard. SVar:DBChangeZoneAll:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Exile | Destination$ Graveyard | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gusthas_scepter.jpg Oracle:{T}: Exile a card from your hand face down. You may look at it for as long as it remains exiled.\n{T}: Return a card you own exiled with Gustha's Scepter to your hand.\nWhen you lose control of Gustha's Scepter, put all cards exiled with Gustha's Scepter into their owner's graveyard. diff --git a/forge-gui/res/cardsfolder/g/gutter_grime.txt b/forge-gui/res/cardsfolder/g/gutter_grime.txt index f5fbb63429a..bb379c5017d 100644 --- a/forge-gui/res/cardsfolder/g/gutter_grime.txt +++ b/forge-gui/res/cardsfolder/g/gutter_grime.txt @@ -6,6 +6,6 @@ SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ SLIME | Counte SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenName$ Ooze | TokenTypes$ Creature,Ooze | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | TokenImage$ g x x ooze ISD | TokenSVars$ GutterGrimePT | RememberSource$ True | TokenStaticAbilities$ Static SVar:Static:Mode$ Continuous | SetPower$ GutterGrimePT | SetToughness$ GutterGrimePT | CharacteristicDefining$ True | Description$ This creature's power and toughness are each equal to the number of slime counters on Gutter Grime. SVar:GutterGrimePT:Remembered$CardCounters.SLIME -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/gutter_grime.jpg Oracle:Whenever a nontoken creature you control dies, put a slime counter on Gutter Grime, then create a green Ooze creature with "This creature's power and toughness are each equal to the number of slime counters on Gutter Grime." \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/g/gutwrencher_oni.txt b/forge-gui/res/cardsfolder/g/gutwrencher_oni.txt index 5da83c0d8be..9d810fe9fdd 100644 --- a/forge-gui/res/cardsfolder/g/gutwrencher_oni.txt +++ b/forge-gui/res/cardsfolder/g/gutwrencher_oni.txt @@ -5,7 +5,7 @@ PT:5/4 K:Trample T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigDiscard | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, discard a card if you don't control an Ogre. SVar:TrigDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | ConditionPresent$ Ogre.YouCtrl | ConditionCompare$ EQ0 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NeedsToPlay:Ogre.YouCtrl DeckHints:Type$Ogre SVar:Picture:http://www.wizards.com/global/images/magic/general/gutwrencher_oni.jpg diff --git a/forge-gui/res/cardsfolder/h/haakon_stromgald_scourge.txt b/forge-gui/res/cardsfolder/h/haakon_stromgald_scourge.txt index ce8d054e44d..54b2d112141 100644 --- a/forge-gui/res/cardsfolder/h/haakon_stromgald_scourge.txt +++ b/forge-gui/res/cardsfolder/h/haakon_stromgald_scourge.txt @@ -7,7 +7,7 @@ S:Mode$ CantBeCast | ValidCard$ Card.Self | Origin$ Exile,Hand,Library,Command | S:Mode$ Continuous | Affected$ Knight.YouCtrl | MayPlay$ True | EffectZone$ Battlefield | AffectedZone$ Graveyard | Description$ As long as CARDNAME is on the battlefield, you may play Knight cards from your graveyard. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigLose | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, you lose 2 life. SVar:TrigLose:DB$ LoseLife | Defined$ You | LifeAmount$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:DiscardMe:5 SVar:Picture:http://www.wizards.com/global/images/magic/general/haakon_stromgald_scourge.jpg Oracle:You may cast Haakon, Stromgald Scourge from your graveyard, but not from anywhere else.\nAs long as Haakon is on the battlefield, you may play Knight cards from your graveyard.\nWhen Haakon dies, you lose 2 life. diff --git a/forge-gui/res/cardsfolder/h/hagra_diabolist.txt b/forge-gui/res/cardsfolder/h/hagra_diabolist.txt index ec9c45b907a..c1204860f97 100644 --- a/forge-gui/res/cardsfolder/h/hagra_diabolist.txt +++ b/forge-gui/res/cardsfolder/h/hagra_diabolist.txt @@ -8,6 +8,6 @@ SVar:TrigLoseLife:DB$LoseLife | ValidTgts$ Player | LifeAmount$ NumAllies | TgtP SVar:NumAllies:Count$Valid Ally.YouCtrl SVar:PlayMain1:TRUE SVar:BuffedBy:Ally -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/hagra_diabolist.jpg Oracle:Whenever Hagra Diabolist or another Ally enters the battlefield under your control, you may have target player lose life equal to the number of Allies you control. diff --git a/forge-gui/res/cardsfolder/h/hail_storm.txt b/forge-gui/res/cardsfolder/h/hail_storm.txt index b50d3406f97..36b7855b162 100644 --- a/forge-gui/res/cardsfolder/h/hail_storm.txt +++ b/forge-gui/res/cardsfolder/h/hail_storm.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ DamageAll | Cost$ 1 G G | NumDmg$ 2 | ValidCards$ Creature.attacking | ValidDescription$ each attacking creature. | SubAbility$ DBDamage | SpellDescription$ CARDNAME deals 2 damage to each attacking creature and 1 damage to you and each creature you control. SVar:DBDamage:DB$DealDamage | NumDmg$ 1 | Defined$ You | SubAbility$ DBDamageAll SVar:DBDamageAll:DB$DamageAll | NumDmg$ 1 | ValidCards$ Creature.YouCtrl | ValidDescription$ each creature you control. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/hail_storm.jpg Oracle:Hail Storm deals 2 damage to each attacking creature and 1 damage to you and each creature you control. diff --git a/forge-gui/res/cardsfolder/h/hall_of_gemstone.txt b/forge-gui/res/cardsfolder/h/hall_of_gemstone.txt index e26df053b6e..3b1ecfe9733 100644 --- a/forge-gui/res/cardsfolder/h/hall_of_gemstone.txt +++ b/forge-gui/res/cardsfolder/h/hall_of_gemstone.txt @@ -6,6 +6,6 @@ SVar:TrigChoose:DB$ ChooseColor | Defined$ TriggeredPlayer | AILogic$ MostPromin SVar:DBEffect:DB$ Effect | ReplacementEffects$ ReplaceChosen | SVars$ ProduceChosen SVar:ReplaceChosen:Event$ ProduceMana | ActiveZones$ Command | ValidCard$ Land | ManaReplacement$ ProduceChosen | Description$ Lands tapped for mana produce mana of the chosen color instead of any other color. SVar:ProduceChosen:C->Chosen & U->Chosen & B->Chosen & R->Chosen & G->Chosen & W->Chosen -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/hall_of_gemstone.jpg Oracle:At the beginning of each player's upkeep, that player chooses a color. Until end of turn, lands tapped for mana produce mana of the chosen color instead of any other color. diff --git a/forge-gui/res/cardsfolder/h/hallow.txt b/forge-gui/res/cardsfolder/h/hallow.txt index da87d8b6d04..2a80afd7206 100644 --- a/forge-gui/res/cardsfolder/h/hallow.txt +++ b/forge-gui/res/cardsfolder/h/hallow.txt @@ -7,6 +7,6 @@ SVar:GainLifeYou:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X SVar:X:ReplaceCount$DamageAmount SVar:TargetMoved:Mode$ ChangesZone | ValidCard$ Card.IsRemembered | ExcludedDestinations$ Battlefield | Execute$ ExileEffect | TriggerZones$ Command | Static$ True SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/hallow.jpg Oracle:Prevent all damage target spell would deal this turn. You gain life equal to the damage prevented this way. diff --git a/forge-gui/res/cardsfolder/h/hallowed_ground.txt b/forge-gui/res/cardsfolder/h/hallowed_ground.txt index 3b9c5019067..447c4187e4f 100644 --- a/forge-gui/res/cardsfolder/h/hallowed_ground.txt +++ b/forge-gui/res/cardsfolder/h/hallowed_ground.txt @@ -2,6 +2,6 @@ Name:Hallowed Ground ManaCost:1 W Types:Enchantment A:AB$ ChangeZone | Cost$ W W | ValidTgts$ Land.nonSnow+YouCtrl | TgtPrompt$ Target nonsnow land you control | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target nonsnow land you control to its owner's hand. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/hallowed_ground.jpg Oracle:{W}{W}: Return target nonsnow land you control to its owner's hand. diff --git a/forge-gui/res/cardsfolder/h/hallowed_moonlight.txt b/forge-gui/res/cardsfolder/h/hallowed_moonlight.txt index 6739fab1621..f7c80dfd2dc 100644 --- a/forge-gui/res/cardsfolder/h/hallowed_moonlight.txt +++ b/forge-gui/res/cardsfolder/h/hallowed_moonlight.txt @@ -5,6 +5,6 @@ A:SP$ Effect | Cost$ 1 W | ReplacementEffects$ ReplaceExile | SVars$ DBExile | S SVar:ReplaceExile:Event$ Moved | ActiveZones$ Command | Destination$ Battlefield | ValidCard$ Creature.wasNotCast | ReplaceWith$ DBExile | Description$ If a creature would enter the battlefield and it wasn't cast, exile it instead. SVar:DBExile:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Exile | Defined$ ReplacedCard SVar:DBDraw:DB$ Draw | NumCards$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/hallowed_moonlight.jpg Oracle:Until end of turn, if a creature would enter the battlefield and it wasn't cast, exile it instead.\nDraw a card. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/h/halls_of_mist.txt b/forge-gui/res/cardsfolder/h/halls_of_mist.txt index 03192228f0b..b9489e31164 100644 --- a/forge-gui/res/cardsfolder/h/halls_of_mist.txt +++ b/forge-gui/res/cardsfolder/h/halls_of_mist.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land K:Cumulative upkeep:1 S:Mode$ Continuous | Affected$ Creature.attackedLastTurn | AddHiddenKeyword$ CARDNAME can't attack. | Description$ Creatures that attacked during their controller's last turn can't attack. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/halls_of_mist.jpg Oracle:Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nCreatures that attacked during their controller's last turn can't attack. diff --git a/forge-gui/res/cardsfolder/h/hammer_mage.txt b/forge-gui/res/cardsfolder/h/hammer_mage.txt index 149e59574e9..e4d1dd1bf4e 100644 --- a/forge-gui/res/cardsfolder/h/hammer_mage.txt +++ b/forge-gui/res/cardsfolder/h/hammer_mage.txt @@ -4,6 +4,6 @@ Types:Creature Human Spellshaper PT:1/1 A:AB$ DestroyAll | Cost$ X R T Discard<1/Card> | ValidCards$ Artifact.cmcLEX | References$ X | SpellDescription$ Destroy all artifacts with converted mana cost X or less. SVar:X:Count$xPaid -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/hammer_mage.jpg Oracle:{X}{R}, {T}, Discard a card: Destroy all artifacts with converted mana cost X or less. diff --git a/forge-gui/res/cardsfolder/h/hammerheim.txt b/forge-gui/res/cardsfolder/h/hammerheim.txt index 8b64e20bea3..b71a96f6bb2 100644 --- a/forge-gui/res/cardsfolder/h/hammerheim.txt +++ b/forge-gui/res/cardsfolder/h/hammerheim.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Legendary Land A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. A:AB$ Debuff | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | AllSuffixKeywords$ walk | SpellDescription$ Target creature loses all landwalk abilities until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/hammerheim.jpg Oracle:{T}: Add {R}.\n{T}: Target creature loses all landwalk abilities until end of turn. diff --git a/forge-gui/res/cardsfolder/h/hana_kami.txt b/forge-gui/res/cardsfolder/h/hana_kami.txt index e578c353afe..837a47e26ca 100644 --- a/forge-gui/res/cardsfolder/h/hana_kami.txt +++ b/forge-gui/res/cardsfolder/h/hana_kami.txt @@ -3,6 +3,6 @@ ManaCost:G Types:Creature Spirit PT:1/1 A:AB$ ChangeZone | Cost$ 1 G Sac<1/CARDNAME> | TgtPrompt$ Choose target Arcane card in your graveyard | ValidTgts$ Arcane | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target Arcane card from your graveyard to your hand. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/hana_kami.jpg Oracle:{1}{G}, Sacrifice Hana Kami: Return target Arcane card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/h/hand_to_hand.txt b/forge-gui/res/cardsfolder/h/hand_to_hand.txt index 09620dbd698..dcd5bca5a1f 100644 --- a/forge-gui/res/cardsfolder/h/hand_to_hand.txt +++ b/forge-gui/res/cardsfolder/h/hand_to_hand.txt @@ -4,6 +4,6 @@ Types:Enchantment S:Mode$ CantBeCast | ValidCard$ Instant | Phases$ BeginCombat->EndCombat | Description$ During combat, players can't cast instant spells or activate abilities that aren't mana abilities. S:Mode$ CantBeActivated | ValidCard$ Card | Phases$ BeginCombat->EndCombat | NonMana$ True SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/hand_to_hand.jpg Oracle:During combat, players can't cast instant spells or activate abilities that aren't mana abilities. diff --git a/forge-gui/res/cardsfolder/h/hankyu.txt b/forge-gui/res/cardsfolder/h/hankyu.txt index 031ef4be64a..0edd940b135 100644 --- a/forge-gui/res/cardsfolder/h/hankyu.txt +++ b/forge-gui/res/cardsfolder/h/hankyu.txt @@ -6,7 +6,7 @@ S:Mode$ Continuous | Affected$ Card.EquippedBy | AddAbility$ HankyuPutCounter & SVar:HankyuPutCounter:AB$ PutCounter | Cost$ T | CounterType$ AIM | CounterNum$ 1 | Defined$ OriginalHost | SpellDescription$ Put an aim counter on Hankyu. SVar:HankyuDmg:AB$ DealDamage | Cost$ T SubCounter | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ HankyuX | References$ HankyuX | SpellDescription$ CARDNAME deals damage to any target equal to the number of aim counters removed this way. SVar:HankyuX:SVar$CostCountersRemoved -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingAttachEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/hankyu.jpg Oracle:Equipped creature has "{T}: Put an aim counter on Hankyu" and "{T}, Remove all aim counters from Hankyu: This creature deals damage to any target equal to the number of aim counters removed this way."\nEquip {4} ({4}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/h/hannas_custody.txt b/forge-gui/res/cardsfolder/h/hannas_custody.txt index 61f3c77fe02..74f69e51d3a 100644 --- a/forge-gui/res/cardsfolder/h/hannas_custody.txt +++ b/forge-gui/res/cardsfolder/h/hannas_custody.txt @@ -3,6 +3,6 @@ ManaCost:2 W Types:Enchantment S:Mode$ Continuous | Affected$ Artifact | AddKeyword$ Shroud | Description$ All artifacts have shroud. (They can't be the targets of spells or abilities.) SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/hannas_custody.jpg Oracle:All artifacts have shroud. (They can't be the targets of spells or abilities.) diff --git a/forge-gui/res/cardsfolder/h/hapless_researcher.txt b/forge-gui/res/cardsfolder/h/hapless_researcher.txt index c48ebb14a54..e62e61832fd 100644 --- a/forge-gui/res/cardsfolder/h/hapless_researcher.txt +++ b/forge-gui/res/cardsfolder/h/hapless_researcher.txt @@ -4,6 +4,6 @@ Types:Creature Human Wizard PT:1/1 A:AB$ Draw | Cost$ Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card, then discard a card. | SubAbility$ DBDiscard SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/hapless_researcher.jpg Oracle:Sacrifice Hapless Researcher: Draw a card, then discard a card. diff --git a/forge-gui/res/cardsfolder/h/harbinger_of_night.txt b/forge-gui/res/cardsfolder/h/harbinger_of_night.txt index 92affeafe89..e76772fd067 100644 --- a/forge-gui/res/cardsfolder/h/harbinger_of_night.txt +++ b/forge-gui/res/cardsfolder/h/harbinger_of_night.txt @@ -4,7 +4,7 @@ Types:Creature Spirit PT:2/3 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounterAll | TriggerDescription$ At the beginning of your upkeep, put a -1/-1 counter on each creature. SVar:TrigPutCounterAll:DB$ PutCounterAll | ValidCards$ Creature | CounterType$ M1M1 | CounterNum$ 1 | IsCurse$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/harbinger_of_night.jpg Oracle:At the beginning of your upkeep, put a -1/-1 counter on each creature. diff --git a/forge-gui/res/cardsfolder/h/hardened_scales.txt b/forge-gui/res/cardsfolder/h/hardened_scales.txt index 2ac5b7205fd..b120129db71 100644 --- a/forge-gui/res/cardsfolder/h/hardened_scales.txt +++ b/forge-gui/res/cardsfolder/h/hardened_scales.txt @@ -4,7 +4,7 @@ Types:Enchantment R:Event$ AddCounter | ActiveZones$ Battlefield | ValidCard$ Creature.YouCtrl | ValidCounterType$ P1P1 | ReplaceWith$ AddOneMoreCounters | Description$ If one or more +1/+1 counters would be put on a creature you control, that many plus one +1/+1 counters are put on it instead. SVar:AddOneMoreCounters:DB$ ReplaceEffect | VarName$ CounterNum | VarValue$ X | References$ X SVar:X:ReplaceCount$CounterNum/Plus.1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/hardened_scales.jpg Oracle:If one or more +1/+1 counters would be put on a creature you control, that many plus one +1/+1 counters are put on it instead. diff --git a/forge-gui/res/cardsfolder/h/harmless_offering.txt b/forge-gui/res/cardsfolder/h/harmless_offering.txt index 4b13f944a4d..26dd7831ec5 100644 --- a/forge-gui/res/cardsfolder/h/harmless_offering.txt +++ b/forge-gui/res/cardsfolder/h/harmless_offering.txt @@ -6,6 +6,6 @@ SVar:D1:DB$ Pump | RememberObjects$ Targeted | Static$ True | SubAbility$ D2 | S SVar:D2:DB$ Pump | ValidTgts$ Permanent.YouCtrl | TgtPrompt$ Select target permanent you control | SubAbility$ D3 | StackDescription$ None SVar:D3:DB$ GainControl | Defined$ Targeted | NewController$ Remembered | SubAbility$ D4 SVar:D4:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/harmless_offering.jpg Oracle:Target opponent gains control of target permanent you control. diff --git a/forge-gui/res/cardsfolder/h/harmonic_convergence.txt b/forge-gui/res/cardsfolder/h/harmonic_convergence.txt index 90354b2178b..98c752d1c07 100644 --- a/forge-gui/res/cardsfolder/h/harmonic_convergence.txt +++ b/forge-gui/res/cardsfolder/h/harmonic_convergence.txt @@ -2,6 +2,6 @@ Name:Harmonic Convergence ManaCost:2 G Types:Instant A:SP$ ChangeZoneAll | Cost$ 2 G | ChangeType$ Enchantment | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 |SpellDescription$ Put all enchantments on top of their owners' libraries. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/harmonic_convergence.jpg Oracle:Put all enchantments on top of their owners' libraries. diff --git a/forge-gui/res/cardsfolder/h/harmony_of_nature.txt b/forge-gui/res/cardsfolder/h/harmony_of_nature.txt index 93b9a6556a6..a992c401ae4 100644 --- a/forge-gui/res/cardsfolder/h/harmony_of_nature.txt +++ b/forge-gui/res/cardsfolder/h/harmony_of_nature.txt @@ -8,6 +8,6 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$Valid Creature.YouCtrl SVar:Y:Remembered$Amount SVar:Z:SVar$Y/Times.4 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/harmony_of_nature.jpg Oracle:Tap any number of untapped creatures you control. You gain 4 life for each creature tapped this way. diff --git a/forge-gui/res/cardsfolder/h/harsh_deceiver.txt b/forge-gui/res/cardsfolder/h/harsh_deceiver.txt index bdafe5e82a1..23c50b94215 100644 --- a/forge-gui/res/cardsfolder/h/harsh_deceiver.txt +++ b/forge-gui/res/cardsfolder/h/harsh_deceiver.txt @@ -7,6 +7,6 @@ A:AB$ Dig | Cost$ 2 | DigNum$ 1 | ActivationLimit$ 1 | Reveal$ True | Destinatio SVar:DBUntap:DB$ Untap | Defined$ Self | SubAbility$ DBPump | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | ConditionCompare$ GE1 SVar:DBPump:DB$ Pump | Defined$ Self | NumAtt$ 1 | NumDef$ 1 | SubAbility$ DBCleanup | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | ConditionCompare$ GE1 SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/harsh_deceiver.jpg Oracle:{1}: Look at the top card of your library.\n{2}: Reveal the top card of your library. If it's a land card, untap Harsh Deceiver and it gets +1/+1 until end of turn. Activate this ability only once each turn. diff --git a/forge-gui/res/cardsfolder/h/harsh_judgment.txt b/forge-gui/res/cardsfolder/h/harsh_judgment.txt index 2e7fd9fe05d..4c95488a3b1 100644 --- a/forge-gui/res/cardsfolder/h/harsh_judgment.txt +++ b/forge-gui/res/cardsfolder/h/harsh_judgment.txt @@ -5,6 +5,6 @@ K:ETBReplacement:Other:ChooseColor SVar:ChooseColor:DB$ ChooseColor | Defined$ You | AILogic$ MostProminentInHumanDeck | SpellDescription$ As CARDNAME enters the battlefield, choose a color. R:Event$ DamageDone | ValidTarget$ You | ActiveZones$ Battlefield | ValidSource$ Instant.ChosenColor,Sorcery.ChosenColor | ReplaceWith$ HarshDmg | Description$ If an instant or sorcery spell of the chosen color would deal damage to you, it deals that damage to its controller instead. SVar:HarshDmg:DB$ ReplaceEffect | VarName$ Affected | VarValue$ ReplacedSourceController | VarType$ Player -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/harsh_judgment.jpg Oracle:As Harsh Judgment enters the battlefield, choose a color.\nIf an instant or sorcery spell of the chosen color would deal damage to you, it deals that damage to its controller instead. diff --git a/forge-gui/res/cardsfolder/h/harsh_justice.txt b/forge-gui/res/cardsfolder/h/harsh_justice.txt index c8ec082ad18..780e277c086 100644 --- a/forge-gui/res/cardsfolder/h/harsh_justice.txt +++ b/forge-gui/res/cardsfolder/h/harsh_justice.txt @@ -5,6 +5,6 @@ A:SP$ Effect | Cost$ 2 W | Name$ Harsh Justice Effect | Triggers$ TrigDamage | S SVar:TrigDamage:Mode$ DamageDone | ValidSource$ Creature.attacking | ValidTarget$ You | Execute$ TrigDealDamage | CombatDamage$ True | TriggerDescription$ This turn, whenever an attacking creature deals combat damage to you, it deals that much damage to its controller. SVar:TrigDealDamage:DB$ DealDamage | Defined$ TriggeredSourceController | NumDmg$ X | DamageSource$ TriggeredSource | References$ X SVar:X:TriggerCount$DamageAmount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/harsh_justice.jpg Oracle:Cast Harsh Justice only during the declare attackers step and only if you've been attacked this step.\nThis turn, whenever an attacking creature deals combat damage to you, it deals that much damage to its controller. diff --git a/forge-gui/res/cardsfolder/h/harsh_mercy.txt b/forge-gui/res/cardsfolder/h/harsh_mercy.txt index 8e6cca7c822..6c924051f0e 100644 --- a/forge-gui/res/cardsfolder/h/harsh_mercy.txt +++ b/forge-gui/res/cardsfolder/h/harsh_mercy.txt @@ -6,6 +6,6 @@ SVar:DBChooseType:DB$ ChooseType | Defined$ Player.IsRemembered | Type$ Creature SVar:DBRemember:DB$ PumpAll | ValidCards$ Creature.ChosenType | RememberAllPumped$ True SVar:DBDestroyAll:DB$ DestroyAll | ValidCards$ Creature.IsNotRemembered | NoRegen$ True | SubAbility$ DBCleanup | StackDescription$ None SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/harsh_mercy.jpg Oracle:Each player chooses a creature type. Destroy all creatures that aren't of a type chosen this way. They can't be regenerated. diff --git a/forge-gui/res/cardsfolder/h/harvest_mage.txt b/forge-gui/res/cardsfolder/h/harvest_mage.txt index 38377390b64..4210c4d3a46 100644 --- a/forge-gui/res/cardsfolder/h/harvest_mage.txt +++ b/forge-gui/res/cardsfolder/h/harvest_mage.txt @@ -5,7 +5,7 @@ PT:1/1 A:AB$ Effect | Cost$ G T Discard<1/Card> | ReplacementEffects$ HarvestReplacement | SVars$ HarvestProduce | References$ HarvestReplacement,HarvestProduce | AILogic$ Never | Stackable$ False | SpellDescription$ Until end of turn, if you tap a land for mana, it produces one mana of a color of your choice instead of any other type and amount. SVar:HarvestReplacement:Event$ ProduceMana | ActiveZones$ Command | ValidCard$ Land.YouCtrl | ManaReplacement$ HarvestProduce | Description$ If you tap a land for mana, it produces one mana of a color of your choice instead of any other type and amount. SVar:HarvestProduce:Any->Any -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/harvest_mage.jpg Oracle:{G}, {T}, Discard a card: Until end of turn, if you tap a land for mana, it produces one mana of a color of your choice instead of any other type and amount. diff --git a/forge-gui/res/cardsfolder/h/harvest_pyre.txt b/forge-gui/res/cardsfolder/h/harvest_pyre.txt index 963e05dc520..78e535599de 100644 --- a/forge-gui/res/cardsfolder/h/harvest_pyre.txt +++ b/forge-gui/res/cardsfolder/h/harvest_pyre.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ DealDamage | Cost$ 1 R ExileFromGrave | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ Y | References$ X,Y | SpellDescription$ CARDNAME deals X damage to target creature. SVar:Y:Number$0/Plus.ChosenX SVar:X:XChoice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/harvest_pyre.jpg Oracle:As an additional cost to cast Harvest Pyre, exile X cards from your graveyard.\nHarvest Pyre deals X damage to target creature. diff --git a/forge-gui/res/cardsfolder/h/hasran_ogress.txt b/forge-gui/res/cardsfolder/h/hasran_ogress.txt index 1520b2fe477..3b21ed7fa37 100644 --- a/forge-gui/res/cardsfolder/h/hasran_ogress.txt +++ b/forge-gui/res/cardsfolder/h/hasran_ogress.txt @@ -4,6 +4,6 @@ Types:Creature Ogre PT:3/2 T:Mode$ Attacks | ValidCard$ Creature.Self | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever CARDNAME attacks, it deals 3 damage to you unless you pay {2}. SVar:TrigDamage:DB$DealDamage | Defined$ You | NumDmg$ 3 | UnlessCost$ 2 | UnlessPayer$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/hasran_ogress.jpg Oracle:Whenever Hasran Ogress attacks, it deals 3 damage to you unless you pay {2}. diff --git a/forge-gui/res/cardsfolder/h/hatching_plans.txt b/forge-gui/res/cardsfolder/h/hatching_plans.txt index 1b3b6522e7c..769282f81c4 100644 --- a/forge-gui/res/cardsfolder/h/hatching_plans.txt +++ b/forge-gui/res/cardsfolder/h/hatching_plans.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, draw three cards. SVar:TrigDraw:DB$ Draw | Defined$ TriggeredCardController | NumCards$ 3 SVar:SacMe:5 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/hatching_plans.jpg Oracle:When Hatching Plans is put into a graveyard from the battlefield, draw three cards. diff --git a/forge-gui/res/cardsfolder/h/hate_weaver.txt b/forge-gui/res/cardsfolder/h/hate_weaver.txt index dd7f62f091e..445659732c5 100644 --- a/forge-gui/res/cardsfolder/h/hate_weaver.txt +++ b/forge-gui/res/cardsfolder/h/hate_weaver.txt @@ -3,7 +3,7 @@ ManaCost:1 B Types:Creature Zombie Wizard PT:2/1 A:AB$ Pump | Cost$ 2 | ValidTgts$ Creature.Blue,Creature.Red | NumAtt$ +1 | SpellDescription$ Target blue or red creature gets +1/+0 until end of turn. | TgtPrompt$ Select target blue or red creature. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Color$Blue|Red SVar:Picture:http://www.wizards.com/global/images/magic/general/hate_weaver.jpg Oracle:{2}: Target blue or red creature gets +1/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/h/hatred.txt b/forge-gui/res/cardsfolder/h/hatred.txt index 3dc367fb6b2..77f94b06243 100644 --- a/forge-gui/res/cardsfolder/h/hatred.txt +++ b/forge-gui/res/cardsfolder/h/hatred.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Pump | Cost$ 3 B B PayLife | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ ChosenX | References$ X | SpellDescription$ Target creature gets +X/+0 until end of turn. SVar:X:XChoice #ChosenX SVar created by Cost payment -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/hatred.jpg Oracle:As an additional cost to cast Hatred, pay X life.\nTarget creature gets +X/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/h/haunted_angel.txt b/forge-gui/res/cardsfolder/h/haunted_angel.txt index 9c7a2b3ab4e..acf3a13d346 100644 --- a/forge-gui/res/cardsfolder/h/haunted_angel.txt +++ b/forge-gui/res/cardsfolder/h/haunted_angel.txt @@ -6,6 +6,6 @@ K:Flying T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChange | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, exile CARDNAME and each other player creates a 3/3 black Angel creature token with flying. SVar:TrigChange:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | Defined$ TriggeredCard | SubAbility$ DBToken SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenName$ Angel | TokenTypes$ Creature,Angel | TokenOwner$ Player.Other | TokenColors$ Black | TokenPower$ 3 | TokenToughness$ 3 | TokenKeywords$ Flying -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://resources.wizards.com/magic/cards/ap/en-us/card25910.jpg Oracle:Flying\nWhen Haunted Angel dies, exile Haunted Angel and each other player creates a 3/3 black Angel creature token with flying. diff --git a/forge-gui/res/cardsfolder/h/haunted_crossroads.txt b/forge-gui/res/cardsfolder/h/haunted_crossroads.txt index 9d1941b980f..d94bce23383 100644 --- a/forge-gui/res/cardsfolder/h/haunted_crossroads.txt +++ b/forge-gui/res/cardsfolder/h/haunted_crossroads.txt @@ -2,7 +2,7 @@ Name:Haunted Crossroads ManaCost:2 B Types:Enchantment A:AB$ ChangeZone | Cost$ B | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | Origin$ Graveyard | Destination$ Library | SpellDescription$ Put target creature card from your graveyard on top of your library. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/haunted_crossroads.jpg Oracle:{B}: Put target creature card from your graveyard on top of your library. diff --git a/forge-gui/res/cardsfolder/h/haunting_misery.txt b/forge-gui/res/cardsfolder/h/haunting_misery.txt index 6a25278974d..ebccd7a32cc 100644 --- a/forge-gui/res/cardsfolder/h/haunting_misery.txt +++ b/forge-gui/res/cardsfolder/h/haunting_misery.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ DealDamage | Cost$ 1 B B ExileFromGrave | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | NumDmg$ ChosenX | References$ X | SpellDescription$ CARDNAME deals X damage to target player or planeswalker. SVar:X:XChoice #ChosenX SVar created by Cost payment -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/haunting_misery.jpg Oracle:As an additional cost to cast Haunting Misery, exile X creature cards from your graveyard.\nHaunting Misery deals X damage to target player or planeswalker. diff --git a/forge-gui/res/cardsfolder/h/haven_of_the_spirit_dragon.txt b/forge-gui/res/cardsfolder/h/haven_of_the_spirit_dragon.txt index f57b387bec4..a7d4fab9b12 100644 --- a/forge-gui/res/cardsfolder/h/haven_of_the_spirit_dragon.txt +++ b/forge-gui/res/cardsfolder/h/haven_of_the_spirit_dragon.txt @@ -4,6 +4,6 @@ Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ T | Produced$ Any | Amount$ 1 | RestrictValid$ Creature.Dragon | SpellDescription$ Add one mana of any color. Spend this mana only to cast a Dragon creature spell. A:AB$ ChangeZone | Cost$ 2 T Sac<1/CARDNAME> | TgtPrompt$ Select target Dragon creature card or Ugin planeswalker card in your graveyard | ValidTgts$ Creature.Dragon+YouCtrl,Planeswalker.Ugin+YouCtrl | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target Dragon creature card or Ugin planeswalker card from your graveyard to your hand. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/haven_of_the_spirit_dragon.jpg Oracle:{T}: Add {C}.\n{T}: Add one mana of any color. Spend this mana only to cast a Dragon creature spell.\n{2}, {T}, Sacrifice Haven of the Spirit Dragon: Return target Dragon creature card or Ugin planeswalker card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/h/havengul_lich.txt b/forge-gui/res/cardsfolder/h/havengul_lich.txt index bed96695749..2a9bb2bcc80 100644 --- a/forge-gui/res/cardsfolder/h/havengul_lich.txt +++ b/forge-gui/res/cardsfolder/h/havengul_lich.txt @@ -7,6 +7,6 @@ SVar:STPlay:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ C SVar:DTCast:Mode$ SpellCast | ValidCard$ Card.IsRemembered | Execute$ StealAbs | TriggerDescription$ When you cast that card this turn, Havengul Lich gains all activated abilities of that card until end of turn. SVar:StealAbs:DB$ Effect | Name$ Havengul Lich effect | RememberObjects$ TriggeredCard | StaticAbilities$ STSteal SVar:STSteal:Mode$ Continuous | Affected$ EffectSource | EffectZone$ Command | GainsAbilitiesOf$ Creature.IsRemembered | GainsAbilitiesOfZones$ Library,Hand,Stack,Battlefield,Graveyard,Exile,Command | Description$ Havengul Lich gains all activated abilities of that card until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/havengul_lich.jpg Oracle:{1}: You may cast target creature card in a graveyard this turn. When you cast that card this turn, Havengul Lich gains all activated abilities of that card until end of turn. diff --git a/forge-gui/res/cardsfolder/h/havengul_skaab.txt b/forge-gui/res/cardsfolder/h/havengul_skaab.txt index dd026905b30..4057b6aba73 100644 --- a/forge-gui/res/cardsfolder/h/havengul_skaab.txt +++ b/forge-gui/res/cardsfolder/h/havengul_skaab.txt @@ -4,6 +4,6 @@ Types:Creature Zombie Horror PT:4/5 T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigChange | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME attacks, return another creature you control to its owner's hand. SVar:TrigChange:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Hidden$ True | Mandatory$ True | ChangeType$ Creature.Other+YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/havengul_skaab.jpg Oracle:Whenever Havengul Skaab attacks, return another creature you control to its owner's hand. diff --git a/forge-gui/res/cardsfolder/h/havenwood_battleground.txt b/forge-gui/res/cardsfolder/h/havenwood_battleground.txt index f59e560bc32..852550f9dc3 100644 --- a/forge-gui/res/cardsfolder/h/havenwood_battleground.txt +++ b/forge-gui/res/cardsfolder/h/havenwood_battleground.txt @@ -4,6 +4,6 @@ Types:Land K:CARDNAME enters the battlefield tapped. A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ G | Amount$ 2 |SpellDescription$ Add {G}{G}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/havenwood_battleground.jpg Oracle:Havenwood Battleground enters the battlefield tapped.\n{T}: Add {G}.\n{T}, Sacrifice Havenwood Battleground: Add {G}{G}. diff --git a/forge-gui/res/cardsfolder/h/havoc.txt b/forge-gui/res/cardsfolder/h/havoc.txt index 8329b943628..bef86ed5a4c 100644 --- a/forge-gui/res/cardsfolder/h/havoc.txt +++ b/forge-gui/res/cardsfolder/h/havoc.txt @@ -3,6 +3,6 @@ ManaCost:1 R Types:Enchantment T:Mode$ SpellCast | ValidCard$ Card.White | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever an opponent casts a white spell, they lose 2 life. SVar:TrigLoseLife:DB$LoseLife | Defined$ TriggeredActivator | LifeAmount$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/havoc.jpg Oracle:Whenever an opponent casts a white spell, they lose 2 life. diff --git a/forge-gui/res/cardsfolder/h/havoc_demon.txt b/forge-gui/res/cardsfolder/h/havoc_demon.txt index 2ffca24ad08..bf7335aa9c1 100644 --- a/forge-gui/res/cardsfolder/h/havoc_demon.txt +++ b/forge-gui/res/cardsfolder/h/havoc_demon.txt @@ -5,6 +5,6 @@ PT:5/5 K:Flying T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigPumpAll | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, all creatures get -5/-5 until end of turn. SVar:TrigPumpAll:DB$PumpAll | ValidCards$ Creature | NumAtt$ -5 | NumDef$ -5 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/havoc_demon.jpg Oracle:Flying\nWhen Havoc Demon dies, all creatures get -5/-5 until end of turn. diff --git a/forge-gui/res/cardsfolder/h/havoc_festival.txt b/forge-gui/res/cardsfolder/h/havoc_festival.txt index c1ab5fdc79b..e0eb3cc357a 100644 --- a/forge-gui/res/cardsfolder/h/havoc_festival.txt +++ b/forge-gui/res/cardsfolder/h/havoc_festival.txt @@ -5,6 +5,6 @@ S:Mode$ Continuous | Affected$ Player | AddKeyword$ You can't gain life. | Descr T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ At the beginning of each player's upkeep, that player loses half their life, rounded up. SVar:TrigLoseLife:DB$ LoseLife | Defined$ TriggeredPlayer | LifeAmount$ HavocX SVar:HavocX:TriggeredPlayer$LifeTotal/HalfUp -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/havoc_festival.jpg Oracle:Players can't gain life.\nAt the beginning of each player's upkeep, that player loses half their life, rounded up. diff --git a/forge-gui/res/cardsfolder/h/hazduhr_the_abbot.txt b/forge-gui/res/cardsfolder/h/hazduhr_the_abbot.txt index cc3819c4ea8..0915a90f5c7 100644 --- a/forge-gui/res/cardsfolder/h/hazduhr_the_abbot.txt +++ b/forge-gui/res/cardsfolder/h/hazduhr_the_abbot.txt @@ -13,6 +13,6 @@ SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True SVar:X:Count$xPaid #X Will get overwritten by Announce SVar:Y:Number$0 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/hazduhr_the_abbot.jpg Oracle:{X}, {T}: The next X damage that would be dealt this turn to target white creature you control is dealt to Hazduhr the Abbot instead. diff --git a/forge-gui/res/cardsfolder/h/hazy_homunculus.txt b/forge-gui/res/cardsfolder/h/hazy_homunculus.txt index ee70afd7895..7ac4286d053 100644 --- a/forge-gui/res/cardsfolder/h/hazy_homunculus.txt +++ b/forge-gui/res/cardsfolder/h/hazy_homunculus.txt @@ -4,6 +4,6 @@ Types:Creature Homunculus Illusion PT:1/1 S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ Unblockable | CheckSVar$ X | SVarCompare$ GE1 | Description$ CARDNAME can't be blocked as long as defending player controls an untapped land. SVar:X:Count$Valid Land.DefenderCtrl+untapped -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/hazy_homunculus.jpg Oracle:Hazy Homunculus can't be blocked as long as defending player controls an untapped land. diff --git a/forge-gui/res/cardsfolder/h/he_who_hungers.txt b/forge-gui/res/cardsfolder/h/he_who_hungers.txt index f29c757292d..4f91ab07f96 100644 --- a/forge-gui/res/cardsfolder/h/he_who_hungers.txt +++ b/forge-gui/res/cardsfolder/h/he_who_hungers.txt @@ -5,7 +5,7 @@ PT:3/2 K:Flying A:AB$ Discard | Cost$ 1 Sac<1/Spirit> | ValidTgts$ Opponent | SorcerySpeed$ True | NumCards$ 1 | Mode$ RevealYouChoose | SpellDescription$ Target opponent reveals their hand. You choose a card from it. That player discards that card. Activate this ability only any time you could cast a sorcery. K:Soulshift:4 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Spirit SVar:Picture:http://www.wizards.com/global/images/magic/general/he_who_hungers.jpg Oracle:Flying\n{1}, Sacrifice a Spirit: Target opponent reveals their hand. You choose a card from it. That player discards that card. Activate this ability only any time you could cast a sorcery.\nSoulshift 4 (When this creature dies, you may return target Spirit card with converted mana cost 4 or less from your graveyard to your hand.) diff --git a/forge-gui/res/cardsfolder/h/head_games.txt b/forge-gui/res/cardsfolder/h/head_games.txt index 1708873cf66..b1c1ddbc12c 100644 --- a/forge-gui/res/cardsfolder/h/head_games.txt +++ b/forge-gui/res/cardsfolder/h/head_games.txt @@ -5,6 +5,6 @@ A:SP$ ChangeZoneAll | Cost$ 3 B B | ValidTgts$ Opponent | Origin$ Hand | Destina SVar:HeadChange:DB$ ChangeZone | DefinedPlayer$ Targeted | Origin$ Library | Destination$ Hand | ChangeNum$ X | ChangeType$ Card | Chooser$ You | SubAbility$ DBCleanup | References$ X SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/head_games.jpg Oracle:Target opponent puts the cards from their hand on top of their library. Search that player's library for that many cards. The player puts those cards into their hand, then shuffles their library. diff --git a/forge-gui/res/cardsfolder/h/healing_grace.txt b/forge-gui/res/cardsfolder/h/healing_grace.txt index c5b33bd80e2..889ee524509 100644 --- a/forge-gui/res/cardsfolder/h/healing_grace.txt +++ b/forge-gui/res/cardsfolder/h/healing_grace.txt @@ -8,5 +8,5 @@ SVar:GraceDmg:DB$ ReplaceDamage | VarName$ X | References$ X SVar:DBGainLife:DB$ GainLife | LifeAmount$ 3 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True SVar:X:Number$3 -SVar:RemAIDeck:True +AI:RemoveDeck:All Oracle:Prevent the next 3 damage that would be dealt to any target this turn by a source of your choice. You gain 3 life. diff --git a/forge-gui/res/cardsfolder/h/heap_doll.txt b/forge-gui/res/cardsfolder/h/heap_doll.txt index 8cd2fd28e75..53fb4584268 100644 --- a/forge-gui/res/cardsfolder/h/heap_doll.txt +++ b/forge-gui/res/cardsfolder/h/heap_doll.txt @@ -3,6 +3,6 @@ ManaCost:1 Types:Artifact Creature Scarecrow PT:1/1 A:AB$ ChangeZone | Cost$ Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SpellDescription$ Exile target card from a graveyard. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/heap_doll.jpg Oracle:Sacrifice Heap Doll: Exile target card from a graveyard. diff --git a/forge-gui/res/cardsfolder/h/heart_of_ramos.txt b/forge-gui/res/cardsfolder/h/heart_of_ramos.txt index 367aeaf6dc1..b53d640e492 100644 --- a/forge-gui/res/cardsfolder/h/heart_of_ramos.txt +++ b/forge-gui/res/cardsfolder/h/heart_of_ramos.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. A:AB$ Mana | Cost$ Sac<1/CARDNAME> | Produced$ R | SpellDescription$ Add {R}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/heart_of_ramos.jpg Oracle:{T}: Add {R}.\nSacrifice Heart of Ramos: Add {R}. diff --git a/forge-gui/res/cardsfolder/h/heart_warden.txt b/forge-gui/res/cardsfolder/h/heart_warden.txt index d7495313d01..c12a72db652 100644 --- a/forge-gui/res/cardsfolder/h/heart_warden.txt +++ b/forge-gui/res/cardsfolder/h/heart_warden.txt @@ -4,6 +4,6 @@ Types:Creature Elf Druid PT:1/1 A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. A:AB$ Draw | Cost$ 2 Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/heart_warden.jpg Oracle:{T}: Add {G}.\n{2}, Sacrifice Heart Warden: Draw a card. diff --git a/forge-gui/res/cardsfolder/h/heartbeat_of_spring.txt b/forge-gui/res/cardsfolder/h/heartbeat_of_spring.txt index 91fa6adff1e..c30b56eb47f 100644 --- a/forge-gui/res/cardsfolder/h/heartbeat_of_spring.txt +++ b/forge-gui/res/cardsfolder/h/heartbeat_of_spring.txt @@ -3,6 +3,6 @@ ManaCost:2 G Types:Enchantment T:Mode$ TapsForMana | ValidCard$ Land | Execute$ TrigMana | TriggerZones$ Battlefield | Static$ True | TriggerDescription$ Whenever a player taps a land for mana, that player adds one mana of any type that land produced. SVar:TrigMana:DB$ ManaReflected | ColorOrType$ Type | Valid$ Defined.Triggered | ReflectProperty$ Produced | Defined$ TriggeredPlayer -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/heartbeat_of_spring.jpg Oracle:Whenever a player taps a land for mana, that player adds one mana of any type that land produced. diff --git a/forge-gui/res/cardsfolder/h/heartless_hidetsugu.txt b/forge-gui/res/cardsfolder/h/heartless_hidetsugu.txt index 33828e88411..03ae2c5fa9d 100644 --- a/forge-gui/res/cardsfolder/h/heartless_hidetsugu.txt +++ b/forge-gui/res/cardsfolder/h/heartless_hidetsugu.txt @@ -5,6 +5,6 @@ PT:4/3 A:AB$ RepeatEach | Cost$ T | RepeatPlayers$ Player | RepeatSubAbility$ DBDealDamage | DamageMap$ True | SpellDescription$ CARDNAME deals damage to each player equal to half that player's life total, rounded down. SVar:DBDealDamage:DB$ DealDamage | Defined$ Remembered | NumDmg$ HeartlessX | References$ HeartlessX SVar:HeartlessX:PlayerCountRemembered$LifeTotal/HalfDown -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/heartless_hidetsugu.jpg Oracle:{T}: Heartless Hidetsugu deals damage to each player equal to half that player's life total, rounded down. diff --git a/forge-gui/res/cardsfolder/h/heartless_summoning.txt b/forge-gui/res/cardsfolder/h/heartless_summoning.txt index f0d2e67c469..7d20ca62cbb 100644 --- a/forge-gui/res/cardsfolder/h/heartless_summoning.txt +++ b/forge-gui/res/cardsfolder/h/heartless_summoning.txt @@ -3,7 +3,7 @@ ManaCost:1 B Types:Enchantment S:Mode$ ReduceCost | ValidCard$ Creature | Type$ Spell | Activator$ You | Amount$ 2 | Description$ Creature spells you cast cost {2} less to cast. S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddPower$ -1 | AddToughness$ -1 | Description$ Creatures you control get -1/-1. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:AICastPreference:MaxControlled$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/heartless_summoning.jpg Oracle:Creature spells you cast cost {2} less to cast.\nCreatures you control get -1/-1. diff --git a/forge-gui/res/cardsfolder/h/heartwood_shard.txt b/forge-gui/res/cardsfolder/h/heartwood_shard.txt index 8c85efa82e0..421d25a5d03 100644 --- a/forge-gui/res/cardsfolder/h/heartwood_shard.txt +++ b/forge-gui/res/cardsfolder/h/heartwood_shard.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact A:AB$ Pump | Cost$ 3 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Trample | SpellDescription$ Target creature gains trample until end of turn. A:AB$ Pump | Cost$ G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Trample | SpellDescription$ Target creature gains trample until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/heartwood_shard.jpg Oracle:{3}, {T} or {G}, {T}: Target creature gains trample until end of turn. diff --git a/forge-gui/res/cardsfolder/h/heat_of_battle.txt b/forge-gui/res/cardsfolder/h/heat_of_battle.txt index e0e7e90fd21..f664968b0dd 100644 --- a/forge-gui/res/cardsfolder/h/heat_of_battle.txt +++ b/forge-gui/res/cardsfolder/h/heat_of_battle.txt @@ -3,6 +3,6 @@ ManaCost:1 R Types:Enchantment T:Mode$ Blocks | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a creature blocks, CARDNAME deals 1 damage to that creature's controller. SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredBlockerController | NumDmg$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/heat_of_battle.jpg Oracle:Whenever a creature blocks, Heat of Battle deals 1 damage to that creature's controller. diff --git a/forge-gui/res/cardsfolder/h/heat_stroke.txt b/forge-gui/res/cardsfolder/h/heat_stroke.txt index 9cc3e10490a..822535c823b 100644 --- a/forge-gui/res/cardsfolder/h/heat_stroke.txt +++ b/forge-gui/res/cardsfolder/h/heat_stroke.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ Phase | Phase$ EndCombat | TriggerZones$ Battlefield | ValidPlayer$ Player | Execute$ TrigDestroy | TriggerDescription$ At end of combat, destroy each creature that blocked or was blocked this turn. SVar:TrigDestroy:DB$ DestroyAll | ValidCards$ Creature.blockedByThisTurn,Creature.blockedThisTurn SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/heat_stroke.jpg Oracle:At end of combat, destroy each creature that blocked or was blocked this turn. diff --git a/forge-gui/res/cardsfolder/h/heat_wave.txt b/forge-gui/res/cardsfolder/h/heat_wave.txt index d4d7ddb338f..980739fef3a 100644 --- a/forge-gui/res/cardsfolder/h/heat_wave.txt +++ b/forge-gui/res/cardsfolder/h/heat_wave.txt @@ -4,6 +4,6 @@ Types:Enchantment K:Cumulative upkeep:R S:Mode$ CantBlockBy | ValidAttacker$ Creature.YouCtrl | ValidBlocker$ Creature.Blue | Description$ Blue creatures can't block creatures you control. S:Mode$ CantBlockUnless | ValidCard$ Creature.nonBlue | Attacker$ Creature.YouCtrl | Cost$ PayLife<1> | Description$ Nonblue creatures can't block creatures you control unless their controller pays 1 life for each blocking creature they control. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/heat_wave.jpg Oracle:Cumulative upkeep {R} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nBlue creatures can't block creatures you control.\nNonblue creatures can't block creatures you control unless their controller pays 1 life for each blocking creature they control. diff --git a/forge-gui/res/cardsfolder/h/heaven_earth.txt b/forge-gui/res/cardsfolder/h/heaven_earth.txt index b8b9118b5af..7d7a50310fe 100644 --- a/forge-gui/res/cardsfolder/h/heaven_earth.txt +++ b/forge-gui/res/cardsfolder/h/heaven_earth.txt @@ -4,7 +4,7 @@ AlternateMode: Split Types:Instant A:SP$ DamageAll | Cost$ X G | ValidCards$ Creature.withFlying | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals X damage to each creature with flying. SVar:X:Count$xPaid -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/heaven_earth.jpg Oracle:Heaven deals X damage to each creature with flying. diff --git a/forge-gui/res/cardsfolder/h/heavenly_blademaster.txt b/forge-gui/res/cardsfolder/h/heavenly_blademaster.txt index 2db796ffe20..2d0cd348dc6 100644 --- a/forge-gui/res/cardsfolder/h/heavenly_blademaster.txt +++ b/forge-gui/res/cardsfolder/h/heavenly_blademaster.txt @@ -8,7 +8,7 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:DBAttach:DB$ RepeatEach | RepeatSubAbility$ DBRepeatAttach | RepeatCards$ Aura.YouCtrl,Equipment.YouCtrl SVar:DBRepeatAttach:DB$ Attach | Object$ Remembered | Optional$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random S:Mode$ Continuous | Affected$ Creature.Other+YouCtrl | AddPower$ X | AddToughness$ X | References$ X | Description$ Other creatures you control get +1/+1 for each Aura and Equipment attached to CARDNAME. SVar:X:Count$Valid Equipment.Attached,Aura.Attached SVar:EnchantMe:Multiple diff --git a/forge-gui/res/cardsfolder/h/heavens_gate.txt b/forge-gui/res/cardsfolder/h/heavens_gate.txt index 493e1693554..5b30bc8c7b9 100644 --- a/forge-gui/res/cardsfolder/h/heavens_gate.txt +++ b/forge-gui/res/cardsfolder/h/heavens_gate.txt @@ -3,7 +3,7 @@ ManaCost:W Types:Instant A:SP$ Animate | Cost$ W | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ MaxTgts | TgtPrompt$ Select target creatures | Colors$ White | OverwriteColors$ True | References$ MaxTgts | SpellDescription$ Any number of target creatures become white until end of turn. SVar:MaxTgts:Count$Valid Creature -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/heavens_gate.jpg Oracle:Any number of target creatures become white until end of turn. diff --git a/forge-gui/res/cardsfolder/h/hecatomb.txt b/forge-gui/res/cardsfolder/h/hecatomb.txt index cf4995c7e40..dc7ddbe918e 100644 --- a/forge-gui/res/cardsfolder/h/hecatomb.txt +++ b/forge-gui/res/cardsfolder/h/hecatomb.txt @@ -7,7 +7,7 @@ SVar:DBSacSelf:DB$ Sacrifice | Defined$ Self | SubAbility$ DBCleanup | Condition SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount A:AB$ DealDamage | Cost$ tapXType<1/Swamp> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to any target. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:NeedsToPlayVar:Creats GE4 SVar:Creats:Count$Valid Creature.YouCtrl diff --git a/forge-gui/res/cardsfolder/h/hedron_alignment.txt b/forge-gui/res/cardsfolder/h/hedron_alignment.txt index 65265be6c75..422ed3c3eb3 100644 --- a/forge-gui/res/cardsfolder/h/hedron_alignment.txt +++ b/forge-gui/res/cardsfolder/h/hedron_alignment.txt @@ -18,5 +18,5 @@ SVar:Y:SVar$A/Plus.B SVar:Z:SVar$C/Plus.D A:AB$ Scry | Cost$ 1 U | ScryNum$ 1 | SpellDescription$ Scry 1. DeckNeeds:Name$Hedron Alignment -SVar:RemRandomDeck:True +AI:RemoveDeck:Random Oracle:Hexproof\nAt the beginning of your upkeep, you may reveal your hand. If you do, you win the game if you own a card named Hedron Alignment in exile, in your hand, in your graveyard, and on the battlefield.\n{1}{U}:Scry 1. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/h/heedless_one.txt b/forge-gui/res/cardsfolder/h/heedless_one.txt index b49c81acac5..0ee126e2448 100644 --- a/forge-gui/res/cardsfolder/h/heedless_one.txt +++ b/forge-gui/res/cardsfolder/h/heedless_one.txt @@ -6,7 +6,7 @@ K:Trample S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ CARDNAME's power and toughness are each equal to the number of Elves on the battlefield. SVar:X:Count$Valid Elf SVar:BuffedBy:Permanent.Elf -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NoZeroToughnessAI:True SVar:Picture:http://www.wizards.com/global/images/magic/general/heedless_one.jpg Oracle:Trample\nHeedless One's power and toughness are each equal to the number of Elves on the battlefield. diff --git a/forge-gui/res/cardsfolder/h/heidar_rimewind_master.txt b/forge-gui/res/cardsfolder/h/heidar_rimewind_master.txt index 75a52683097..3262ae45971 100644 --- a/forge-gui/res/cardsfolder/h/heidar_rimewind_master.txt +++ b/forge-gui/res/cardsfolder/h/heidar_rimewind_master.txt @@ -3,6 +3,6 @@ ManaCost:4 U Types:Legendary Creature Human Wizard PT:3/3 A:AB$ ChangeZone | Cost$ 2 T | ValidTgts$ Permanent | TgtPrompt$ Select target Permanent | Origin$ Battlefield | Destination$ Hand | IsPresent$ Permanent.Snow+YouCtrl | PresentCompare$ GE4 | SpellDescription$ Return target permanent to its owner's hand. Activate this ability only if you control four or more snow permanents. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/heidar_rimewind_master.jpg Oracle:{2}, {T}: Return target permanent to its owner's hand. Activate this ability only if you control four or more snow permanents. diff --git a/forge-gui/res/cardsfolder/h/helionaut.txt b/forge-gui/res/cardsfolder/h/helionaut.txt index f595471c35f..d4d05b965c6 100644 --- a/forge-gui/res/cardsfolder/h/helionaut.txt +++ b/forge-gui/res/cardsfolder/h/helionaut.txt @@ -4,6 +4,6 @@ Types:Creature Human Soldier PT:1/2 K:Flying A:AB$ Mana | Cost$ 1 T | Produced$ Any | SpellDescription$ Add one mana of any color. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/helionaut.jpg Oracle:Flying\n{1}, {T}: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/h/helix_pinnacle.txt b/forge-gui/res/cardsfolder/h/helix_pinnacle.txt index 349b1e040fc..1623e8d7238 100644 --- a/forge-gui/res/cardsfolder/h/helix_pinnacle.txt +++ b/forge-gui/res/cardsfolder/h/helix_pinnacle.txt @@ -6,6 +6,6 @@ SVar:TrigWinGame:DB$WinsGame | Defined$ You K:Shroud A:AB$ PutCounter | Cost$ X | CounterType$ TOWER | CounterNum$ X | References$ X | SpellDescription$ Put a tower counter on CARDNAME. SVar:X:Count$xPaid -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/helix_pinnacle.jpg Oracle:Shroud (This enchantment can't be the target of spells or abilities.)\n{X}: Put X tower counters on Helix Pinnacle.\nAt the beginning of your upkeep, if there are 100 or more tower counters on Helix Pinnacle, you win the game. diff --git a/forge-gui/res/cardsfolder/h/hell_bent_raider.txt b/forge-gui/res/cardsfolder/h/hell_bent_raider.txt index 3cc8e1cf09d..a5650bbfd09 100644 --- a/forge-gui/res/cardsfolder/h/hell_bent_raider.txt +++ b/forge-gui/res/cardsfolder/h/hell_bent_raider.txt @@ -5,6 +5,6 @@ PT:2/2 K:First Strike K:Haste A:AB$ Protection | Cost$ Discard<1/Random> | Gains$ white | SpellDescription$ CARDNAME gains protection from white until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/hell_bent_raider.jpg Oracle:First strike, haste\nDiscard a card at random: Hell-Bent Raider gains protection from white until end of turn. diff --git a/forge-gui/res/cardsfolder/h/hellfire.txt b/forge-gui/res/cardsfolder/h/hellfire.txt index 523a322d8a0..26be733f8a8 100644 --- a/forge-gui/res/cardsfolder/h/hellfire.txt +++ b/forge-gui/res/cardsfolder/h/hellfire.txt @@ -7,6 +7,6 @@ SVar:X:Remembered$Amount.Plus.3 # Remember Destroyed still isn't quite right since Hellfire cares about Replacement effects too SVar:NeedsToPlayVar:Y GE5 SVar:Y:Count$YourLifeTotal -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/hellfire.jpg Oracle:Destroy all nonblack creatures. Hellfire deals X plus 3 damage to you, where X is the number of creatures that died this way. diff --git a/forge-gui/res/cardsfolder/h/hellion_eruption.txt b/forge-gui/res/cardsfolder/h/hellion_eruption.txt index 62071059a7b..63d36057d64 100644 --- a/forge-gui/res/cardsfolder/h/hellion_eruption.txt +++ b/forge-gui/res/cardsfolder/h/hellion_eruption.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ SacrificeAll | Cost$ 5 R | ValidCards$ Creature.YouCtrl | RememberSacrificed$ True | SubAbility$ DBToken | SpellDescription$ Sacrifice all creatures you control, then create that many 4/4 red Hellion creature tokens. SVar:DBToken:DB$Token | TokenAmount$ X | TokenName$ Hellion | TokenTypes$ Creature,Hellion | TokenOwner$ You | TokenColors$ Red | TokenPower$ 4 | TokenToughness$ 4 | References$ X SVar:X:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/hellion_eruption.jpg Oracle:Sacrifice all creatures you control, then create that many 4/4 red Hellion creature tokens. diff --git a/forge-gui/res/cardsfolder/h/hells_caretaker.txt b/forge-gui/res/cardsfolder/h/hells_caretaker.txt index ae1847c5119..ae6b2a43610 100644 --- a/forge-gui/res/cardsfolder/h/hells_caretaker.txt +++ b/forge-gui/res/cardsfolder/h/hells_caretaker.txt @@ -4,6 +4,6 @@ Types:Creature Horror PT:1/1 A:AB$ ChangeZone | Cost$ T Sac<1/Creature> | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | Origin$ Graveyard | Destination$ Battlefield | PlayerTurn$ True | ActivationPhases$ Upkeep | SpellDescription$ Return target creature card from your graveyard to the battlefield. Activate this ability only during your upkeep. SVar:AIPreference:SacCost$Creature.cmcLE3 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/hells_caretaker.jpg Oracle:{T}, Sacrifice a creature: Return target creature card from your graveyard to the battlefield. Activate this ability only during your upkeep. diff --git a/forge-gui/res/cardsfolder/h/hells_caretaker_avatar.txt b/forge-gui/res/cardsfolder/h/hells_caretaker_avatar.txt index 30f0b2e671a..5e193bc37a9 100644 --- a/forge-gui/res/cardsfolder/h/hells_caretaker_avatar.txt +++ b/forge-gui/res/cardsfolder/h/hells_caretaker_avatar.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Vanguard HandLifeModifier:-1/-4 A:AB$ ChangeZone | Cost$ 3 Sac<1/Creature/creature> | ActivationZone$ Command | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature in your graveyard | SpellDescription$ Return target creature card from your graveyard to the battlefield. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:https://downloads.cardforge.org/images/cards/VAN/Hell's Caretaker Avatar.full.jpg Oracle:Hand -1, life -4\n{3}, Sacrifice a creature: Return target creature card from your graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/h/helm_of_chatzuk.txt b/forge-gui/res/cardsfolder/h/helm_of_chatzuk.txt index 2c5c4bdc712..b7e6d608dc7 100644 --- a/forge-gui/res/cardsfolder/h/helm_of_chatzuk.txt +++ b/forge-gui/res/cardsfolder/h/helm_of_chatzuk.txt @@ -2,6 +2,6 @@ Name:Helm of Chatzuk ManaCost:1 Types:Artifact A:AB$ Pump | Cost$ 1 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Banding | SpellDescription$ Target creature gains banding until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/helm_of_chatzuk.jpg Oracle:{1}, {T}: Target creature gains banding until end of turn. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding a player controls are blocking or being blocked by a creature, that player divides that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/h/helm_of_the_gods.txt b/forge-gui/res/cardsfolder/h/helm_of_the_gods.txt index e0ab3020b12..ddd5be09b2e 100644 --- a/forge-gui/res/cardsfolder/h/helm_of_the_gods.txt +++ b/forge-gui/res/cardsfolder/h/helm_of_the_gods.txt @@ -5,6 +5,6 @@ K:Equip:1 S:Mode$ Continuous | Affected$ Card.EquippedBy | AddPower$ X | AddToughness$ X | References$ X | Description$ Equipped creature gets +1/+1 for each enchantment you control. SVar:X:Count$Valid Enchantment.YouCtrl SVar:BuffedBy:Enchantment -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/helm_of_the_gods.jpg Oracle:Equipped creature gets +1/+1 for each enchantment you control.\nEquip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/h/helvault.txt b/forge-gui/res/cardsfolder/h/helvault.txt index e4beec8e019..a14a479afcd 100644 --- a/forge-gui/res/cardsfolder/h/helvault.txt +++ b/forge-gui/res/cardsfolder/h/helvault.txt @@ -9,6 +9,6 @@ T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ SVar:TrigReturn:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered+ExiledWithSource | Origin$ Exile | Destination$ Battlefield | Destination$ Battlefield | SubAbility$ DBCleanup T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ExcludedDestinations$ Graveyard | ValidCard$ Card.Self | Execute$ DBCleanup | Static$ True SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/helvault.jpg Oracle:{1}, {T}: Exile target creature you control.\n{7}, {T}: Exile target creature you don't control.\nWhen Helvault is put into a graveyard from the battlefield, return all cards exiled with it to the battlefield under their owners' control. diff --git a/forge-gui/res/cardsfolder/h/hematite_talisman.txt b/forge-gui/res/cardsfolder/h/hematite_talisman.txt index bb4a8688556..3a234b9c64d 100644 --- a/forge-gui/res/cardsfolder/h/hematite_talisman.txt +++ b/forge-gui/res/cardsfolder/h/hematite_talisman.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact T:Mode$ SpellCast | ValidCard$ Card.Red | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ Whenever a player casts a red spell, you may pay {3}. If you do, untap target permanent. SVar:TrigUntap:AB$Untap | Cost$ 3 | ValidTgts$ Permanent | TgtPrompt$ Select target permanent -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/hematite_talisman.jpg Oracle:Whenever a player casts a red spell, you may pay {3}. If you do, untap target permanent. diff --git a/forge-gui/res/cardsfolder/h/henchfiend_of_ukor.txt b/forge-gui/res/cardsfolder/h/henchfiend_of_ukor.txt index acdcbd72856..1b79d36cc02 100644 --- a/forge-gui/res/cardsfolder/h/henchfiend_of_ukor.txt +++ b/forge-gui/res/cardsfolder/h/henchfiend_of_ukor.txt @@ -7,7 +7,7 @@ K:Echo:1 B A:AB$ Pump | Cost$ BR | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. SVar:NeedsToPlayVar:Y GE1 SVar:Y:Count$Valid Swamp.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black SVar:Picture:http://www.wizards.com/global/images/magic/general/henchfiend_of_ukor.jpg Oracle:Haste\nEcho {1}{B} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice this permanent unless you pay its echo cost.)\n{B/R}: Henchfiend of Ukor gets +1/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/h/henge_of_ramos.txt b/forge-gui/res/cardsfolder/h/henge_of_ramos.txt index 4af98241b5b..c8f1a71dc65 100644 --- a/forge-gui/res/cardsfolder/h/henge_of_ramos.txt +++ b/forge-gui/res/cardsfolder/h/henge_of_ramos.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ 2 T | Produced$ Any | SpellDescription$ Add one mana of any color. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/henge_of_ramos.jpg Oracle:{T}: Add {C}.\n{2}, {T}: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/h/heretics_punishment.txt b/forge-gui/res/cardsfolder/h/heretics_punishment.txt index 8a84e504622..9f80a7b16bf 100644 --- a/forge-gui/res/cardsfolder/h/heretics_punishment.txt +++ b/forge-gui/res/cardsfolder/h/heretics_punishment.txt @@ -5,7 +5,7 @@ A:AB$ Mill | Cost$ 3 R | NumCards$ 3 | RememberMilled$ True | SubAbility$ DBHere SVar:DBHereticDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ HereticX | SubAbility$ DBHereticCleanup | References$ HereticX SVar:DBHereticCleanup:DB$ Cleanup | ClearRemembered$ True SVar:HereticX:Count$HighestCMC_Card.IsRemembered -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/heretics_punishment.jpg Oracle:{3}{R}: Choose any target, then put the top three cards of your library into your graveyard. Heretic's Punishment deals damage to that permanent or player equal to the highest converted mana cost among those cards. diff --git a/forge-gui/res/cardsfolder/h/heritage_druid.txt b/forge-gui/res/cardsfolder/h/heritage_druid.txt index a3b84d01f8a..2391ba9b007 100644 --- a/forge-gui/res/cardsfolder/h/heritage_druid.txt +++ b/forge-gui/res/cardsfolder/h/heritage_druid.txt @@ -3,6 +3,6 @@ ManaCost:G Types:Creature Elf Druid PT:1/1 A:AB$ Mana | Cost$ tapXType<3/Elf> | Produced$ G | Amount$ 3 | SpellDescription$ Add {G}{G}{G}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/heritage_druid.jpg Oracle:Tap three untapped Elves you control: Add {G}{G}{G}. diff --git a/forge-gui/res/cardsfolder/h/hermit_druid.txt b/forge-gui/res/cardsfolder/h/hermit_druid.txt index f60f3095f62..e7396b05707 100644 --- a/forge-gui/res/cardsfolder/h/hermit_druid.txt +++ b/forge-gui/res/cardsfolder/h/hermit_druid.txt @@ -3,7 +3,7 @@ ManaCost:1 G Types:Creature Human Druid PT:1/1 A:AB$ DigUntil | Cost$ G T | Valid$ Land.Basic | ValidDescription$ basic land | FoundDestination$ Hand | RevealedDestination$ Graveyard | AILogic$ DontMillSelf | SpellDescription$ Reveal cards from the top of your library until you reveal a basic land card. Put that card into your hand and all other cards revealed this way into your graveyard. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonCombatPriority:4 SVar:Picture:http://www.wizards.com/global/images/magic/general/hermit_druid.jpg Oracle:{G}, {T}: Reveal cards from the top of your library until you reveal a basic land card. Put that card into your hand and all other cards revealed this way into your graveyard. diff --git a/forge-gui/res/cardsfolder/h/heroes_podium.txt b/forge-gui/res/cardsfolder/h/heroes_podium.txt index 3a21880cfc8..6e149d26387 100644 --- a/forge-gui/res/cardsfolder/h/heroes_podium.txt +++ b/forge-gui/res/cardsfolder/h/heroes_podium.txt @@ -5,6 +5,6 @@ S:Mode$ Continuous | Affected$ Creature.Legendary+YouCtrl | AddPower$ AffectedX SVar:AffectedX:Count$Valid Creature.Legendary+Other+YouCtrl A:AB$ Dig | Cost$ X T | DigNum$ X | ChangeNum$ 1 | ChangeValid$ Creature.Legendary | DestinationZone$ Hand | DestinationZone2$ Library | LibraryPosition$ -1 | RestRandomOrder$ True | References$ X | SpellDescription$ Look at the top X cards of your library. You may reveal a legendary creature card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. SVar:X:Count$xPaid -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/heroes_podium.jpg Oracle:Each legendary creature you control gets +1/+1 for each other legendary creature you control.\n{X}, {T}: Look at the top X cards of your library. You may reveal a legendary creature card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. diff --git a/forge-gui/res/cardsfolder/h/heroic_defiance.txt b/forge-gui/res/cardsfolder/h/heroic_defiance.txt index 1d7f451ffd0..9675ff915be 100644 --- a/forge-gui/res/cardsfolder/h/heroic_defiance.txt +++ b/forge-gui/res/cardsfolder/h/heroic_defiance.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ 1 W | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 3 | AddToughness$ 3 | CheckSVar$ X | SVarCompare$ EQ0 | Description$ Enchanted creature gets +3/+3 unless it shares a color with the most common color among all permanents or a color tied for most common. SVar:X:Count$Valid Card.EnchantedBy+SharesColorWith MostProminentColor -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/heroic_defiance.jpg Oracle:Enchant creature\nEnchanted creature gets +3/+3 unless it shares a color with the most common color among all permanents or a color tied for most common. diff --git a/forge-gui/res/cardsfolder/h/heroism.txt b/forge-gui/res/cardsfolder/h/heroism.txt index 5fdbf84a5d0..3665d6fe68b 100644 --- a/forge-gui/res/cardsfolder/h/heroism.txt +++ b/forge-gui/res/cardsfolder/h/heroism.txt @@ -4,7 +4,7 @@ Types:Enchantment A:AB$ RepeatEach | Cost$ Sac<1/Creature.White/White Creature> | RepeatCards$ Creature.attacking+Red | RepeatSubAbility$ DBPump | SpellDescription$ For each attacking red creature, prevent all combat damage that would be dealt by that creature this turn unless its controller pays {2}{R}. SVar:DBPump:DB$ Pump | Defined$ Remembered | KW$ Prevent all combat damage that would be dealt by CARDNAME. | UnlessCost$ 2 R | UnlessPayer$ RememberedController | ShowCurrentCard$ Remembered SVar:AIPreference:SacCost$Creature.token -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/heroism.jpg Oracle:Sacrifice a white creature: For each attacking red creature, prevent all combat damage that would be dealt by that creature this turn unless its controller pays {2}{R}. diff --git a/forge-gui/res/cardsfolder/h/hesitation.txt b/forge-gui/res/cardsfolder/h/hesitation.txt index 3f96cac2169..4aa037954b8 100644 --- a/forge-gui/res/cardsfolder/h/hesitation.txt +++ b/forge-gui/res/cardsfolder/h/hesitation.txt @@ -4,7 +4,7 @@ Types:Enchantment T:Mode$ SpellCast | ValidCard$ Card | Execute$ TrigCounter | TriggerZones$ Battlefield | TriggerDescription$ When a player casts a spell, sacrifice CARDNAME and counter that spell. SVar:TrigCounter:DB$ Counter | Defined$ TriggeredSpellAbility | SubAbility$ DBSacrifice SVar:DBSacrifice:DB$ Sacrifice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/hesitation.jpg Oracle:When a player casts a spell, sacrifice Hesitation and counter that spell. diff --git a/forge-gui/res/cardsfolder/h/hex_parasite.txt b/forge-gui/res/cardsfolder/h/hex_parasite.txt index f44b962d9f7..f8618e1853e 100644 --- a/forge-gui/res/cardsfolder/h/hex_parasite.txt +++ b/forge-gui/res/cardsfolder/h/hex_parasite.txt @@ -7,6 +7,6 @@ SVar:DBPump:DB$Pump | NumAtt$ +Y | Defined$ Self | SubAbility$ DBCleanup | Refer SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$xPaid SVar:Y:Count$RememberedSize -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/hex_parasite.jpg Oracle:{X}{P/B}: Remove up to X counters from target permanent. For each counter removed this way, Hex Parasite gets +1/+0 until end of turn. ({P/B} can be paid with either {B} or 2 life.) diff --git a/forge-gui/res/cardsfolder/h/hibernation.txt b/forge-gui/res/cardsfolder/h/hibernation.txt index 56247e97218..fc7f921b83c 100644 --- a/forge-gui/res/cardsfolder/h/hibernation.txt +++ b/forge-gui/res/cardsfolder/h/hibernation.txt @@ -2,6 +2,6 @@ Name:Hibernation ManaCost:2 U Types:Instant A:SP$ ChangeZoneAll | Cost$ 2 U | ChangeType$ Permanent.Green | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return all green permanents to their owners' hands. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/hibernation.jpg Oracle:Return all green permanents to their owners' hands. diff --git a/forge-gui/res/cardsfolder/h/hickory_woodlot.txt b/forge-gui/res/cardsfolder/h/hickory_woodlot.txt index c9ad66076de..540313a9acf 100644 --- a/forge-gui/res/cardsfolder/h/hickory_woodlot.txt +++ b/forge-gui/res/cardsfolder/h/hickory_woodlot.txt @@ -6,6 +6,6 @@ SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | SubAbility$ DBAddCounter | SVar:DBAddCounter:DB$ PutCounter | Defined$ Self | ETB$ True | CounterType$ DEPLETION | CounterNum$ 2 A:AB$ Mana | Cost$ T SubCounter<1/DEPLETION> | Produced$ G | SubAbility$ DBSac | Amount$ 2 | SpellDescription$ Add {G}{G}. If there are no depletion counters on CARDNAME, sacrifice it. SVar:DBSac:DB$ Sacrifice | SacValid$ Self | ConditionPresent$ Card.Self+counters_EQ0_DEPLETION -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://wizards.com/global/images/magic/general/hickory_woodlot.jpg Oracle:Hickory Woodlot enters the battlefield tapped with two depletion counters on it.\n{T}, Remove a depletion counter from Hickory Woodlot: Add {G}{G}. If there are no depletion counters on Hickory Woodlot, sacrifice it. diff --git a/forge-gui/res/cardsfolder/h/hidden_path.txt b/forge-gui/res/cardsfolder/h/hidden_path.txt index a33c2dcaa32..5b2f1f1e4d5 100644 --- a/forge-gui/res/cardsfolder/h/hidden_path.txt +++ b/forge-gui/res/cardsfolder/h/hidden_path.txt @@ -3,6 +3,6 @@ ManaCost:2 G G G G Types:Enchantment S:Mode$ Continuous | Affected$ Creature.Green | AddKeyword$ Forestwalk | Description$ Green creatures have forestwalk. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/hidden_path.jpg Oracle:Green creatures have forestwalk. diff --git a/forge-gui/res/cardsfolder/h/hidden_retreat.txt b/forge-gui/res/cardsfolder/h/hidden_retreat.txt index 92a3418b62e..c34b3f81ff3 100644 --- a/forge-gui/res/cardsfolder/h/hidden_retreat.txt +++ b/forge-gui/res/cardsfolder/h/hidden_retreat.txt @@ -6,7 +6,7 @@ A:AB$ Effect | Cost$ PutCardToLibFromHand<1/0/Card> | ValidTgts$ Instant,Sorcery SVar:PreventDmg:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Stack | Affected$ Card.IsRemembered | AddKeyword$ Prevent all damage that would be dealt by CARDNAME. | Description$ Prevent all damage target instant or sorcery spell would deal this turn. SVar:TargetMoved:Mode$ ChangesZone | Origin$ Stack | Destination$ Any | ValidCard$ Card.IsRemembered | Execute$ ExileEffect | TriggerZones$ Command | Static$ True SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/hidden_retreat.jpg Oracle:Put a card from your hand on top of your library: Prevent all damage that would be dealt by target instant or sorcery spell this turn. diff --git a/forge-gui/res/cardsfolder/h/hidden_stag.txt b/forge-gui/res/cardsfolder/h/hidden_stag.txt index 0c47ae9fe68..30c21758e83 100644 --- a/forge-gui/res/cardsfolder/h/hidden_stag.txt +++ b/forge-gui/res/cardsfolder/h/hidden_stag.txt @@ -5,6 +5,6 @@ T:Mode$ LandPlayed | ValidCard$ Land.OppCtrl | IsPresent$ Card.Self+Enchantment SVar:TrigHiddenStagAnimateOppLand:DB$ Animate | Defined$ Self | Types$ Creature,Elk,Beast | Power$ 3 | Toughness$ 2 | RemoveCardTypes$ True | Permanent$ True T:Mode$ LandPlayed | ValidCard$ Land.YouCtrl | IsPresent$ Card.Self+Creature | Execute$ TrigHiddenStagAnimateYourLand | TriggerZones$ Battlefield | TriggerDescription$ Whenever you play a land, if CARDNAME is a creature, CARDNAME becomes an enchantment. SVar:TrigHiddenStagAnimateYourLand:DB$ Animate | Defined$ Self | Types$ Enchantment | RemoveCardTypes$ True | Permanent$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/hidden_stag.jpg Oracle:Whenever an opponent plays a land, if Hidden Stag is an enchantment, Hidden Stag becomes a 3/2 Elk Beast creature.\nWhenever you play a land, if Hidden Stag is a creature, Hidden Stag becomes an enchantment. diff --git a/forge-gui/res/cardsfolder/h/hidden_strings.txt b/forge-gui/res/cardsfolder/h/hidden_strings.txt index 25e69a0bf0a..a144eb308d4 100644 --- a/forge-gui/res/cardsfolder/h/hidden_strings.txt +++ b/forge-gui/res/cardsfolder/h/hidden_strings.txt @@ -5,7 +5,7 @@ K:Cipher A:SP$ TapOrUntap | Cost$ 1 U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | SubAbility$ DBTapOrUntap | SpellDescription$ You may tap or untap target permanent, then you may tap or untap another target permanent. SVar:DBTapOrUntap:DB$ TapOrUntap | ValidTgts$ Permanent | TgtPrompt$ Select target permanent (2) | TargetUnique$ True | SubAbility$ Cipher SVar:Cipher:DB$ Encode | Defined$ Self -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckNeeds:Type$Creature SVar:Picture:http://www.wizards.com/global/images/magic/general/hidden_strings.jpg Oracle:You may tap or untap target permanent, then you may tap or untap another target permanent.\nCipher (Then you may exile this spell card encoded on a creature you control. Whenever that creature deals combat damage to a player, its controller may cast a copy of the encoded card without paying its mana cost.) diff --git a/forge-gui/res/cardsfolder/h/high_market.txt b/forge-gui/res/cardsfolder/h/high_market.txt index e16f6636dec..aab5bc634ce 100644 --- a/forge-gui/res/cardsfolder/h/high_market.txt +++ b/forge-gui/res/cardsfolder/h/high_market.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ GainLife | Cost$ T Sac<1/Creature> | LifeAmount$ 1 | SpellDescription$ You gain 1 life. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/high_market.jpg Oracle:{T}: Add {C}.\n{T}, Sacrifice a creature: You gain 1 life. diff --git a/forge-gui/res/cardsfolder/h/high_seas.txt b/forge-gui/res/cardsfolder/h/high_seas.txt index bdb9212e16c..d6946fa96d7 100644 --- a/forge-gui/res/cardsfolder/h/high_seas.txt +++ b/forge-gui/res/cardsfolder/h/high_seas.txt @@ -2,6 +2,6 @@ Name:High Seas ManaCost:2 U Types:Enchantment S:Mode$ RaiseCost | ValidCard$ Creature.Red,Creature.Green | Type$ Spell | Amount$ 1 | Description$ Red creature spells and green creature spells cost {1} more to cast. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/high_seas.jpg Oracle:Red creature spells and green creature spells cost {1} more to cast. diff --git a/forge-gui/res/cardsfolder/h/high_tide.txt b/forge-gui/res/cardsfolder/h/high_tide.txt index a23bbd23855..253886e7c97 100644 --- a/forge-gui/res/cardsfolder/h/high_tide.txt +++ b/forge-gui/res/cardsfolder/h/high_tide.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Effect | Cost$ U | Name$ High Tide Effect | Triggers$ IslandTrigger | SVars$ TrigMana | SpellDescription$ Until end of turn, whenever a player taps an Island for mana, that player adds an additional {U}. SVar:IslandTrigger:Mode$ TapsForMana | ValidCard$ Island | Execute$ TrigMana | Static$ True | TriggerDescription$ Whenever a player taps an Island for mana, that player adds an additional {U}. SVar:TrigMana:DB$ Mana | Produced$ U | Amount$ 1 | Defined$ TriggeredPlayer -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/high_tide.jpg Oracle:Until end of turn, whenever a player taps an Island for mana, that player adds an additional {U}. diff --git a/forge-gui/res/cardsfolder/h/highland_berserker.txt b/forge-gui/res/cardsfolder/h/highland_berserker.txt index 11e089ad367..8efebe7eba5 100644 --- a/forge-gui/res/cardsfolder/h/highland_berserker.txt +++ b/forge-gui/res/cardsfolder/h/highland_berserker.txt @@ -7,6 +7,6 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Ally.O SVar:TrigPump:DB$PumpAll | ValidCards$ Ally.YouCtrl | KW$ First Strike SVar:PlayMain1:TRUE SVar:BuffedBy:Ally -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/highland_berserker.jpg Oracle:Whenever Highland Berserker or another Ally enters the battlefield under your control, you may have Ally creatures you control gain first strike until end of turn. diff --git a/forge-gui/res/cardsfolder/h/hikari_twilight_guardian.txt b/forge-gui/res/cardsfolder/h/hikari_twilight_guardian.txt index cb0e5c2604c..f10454fc8d8 100644 --- a/forge-gui/res/cardsfolder/h/hikari_twilight_guardian.txt +++ b/forge-gui/res/cardsfolder/h/hikari_twilight_guardian.txt @@ -7,6 +7,6 @@ T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | Trig SVar:TrigExile:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Exile | AILogic$ IfNotBuffed | SubAbility$ DelTrig SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | TriggerDescription$ Return CARDNAME to the battlefield. SVar:TrigReturn:DB$ ChangeZone | Defined$ Self | Origin$ Exile | Destination$ Battlefield -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/hikari_twilight_guardian.jpg Oracle:Flying\nWhenever you cast a Spirit or Arcane spell, you may exile Hikari, Twilight Guardian. If you do, return it to the battlefield under its owner's control at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/h/hint_of_insanity.txt b/forge-gui/res/cardsfolder/h/hint_of_insanity.txt index 4caea88c5a2..f8f61758593 100644 --- a/forge-gui/res/cardsfolder/h/hint_of_insanity.txt +++ b/forge-gui/res/cardsfolder/h/hint_of_insanity.txt @@ -5,6 +5,6 @@ A:SP$ RevealHand | Cost$ 2 B | ValidTgts$ Player | IsCurse$ True | RememberRevea SVar:DBRepeat:DB$ RepeatEach | RepeatCards$ Card.IsRemembered+nonLand | Zone$ Hand | RepeatSubAbility$ DBDiscard | UseImprinted$ True | SubAbility$ DBCleanup SVar:DBDiscard:DB$ Discard | Mode$ Defined | Defined$ Remembered | DefinedCards$ ValidHand Card.sharesNameWith Imprinted+RememberedPlayerCtrl+IsNotImprinted SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/hint_of_insanity.jpg Oracle:Target player reveals their hand. That player discards all nonland cards with the same name as another card in their hand. diff --git a/forge-gui/res/cardsfolder/h/hisoka_minamo_sensei.txt b/forge-gui/res/cardsfolder/h/hisoka_minamo_sensei.txt index 9bd69d29b2b..a3d09da63aa 100644 --- a/forge-gui/res/cardsfolder/h/hisoka_minamo_sensei.txt +++ b/forge-gui/res/cardsfolder/h/hisoka_minamo_sensei.txt @@ -5,6 +5,6 @@ PT:1/3 A:AB$ Counter | Cost$ 2 U Discard<1/Card> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | ConditionCheckSVar$ X | ConditionSVarCompare$ EQY | References$ X,Y | SpellDescription$ Counter target spell if it has the same converted mana cost as the discarded card. SVar:X:Targeted$CardManaCost SVar:Y:Discarded$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/hisoka_minamo_sensei.jpg Oracle:{2}{U}, Discard a card: Counter target spell if it has the same converted mana cost as the discarded card. diff --git a/forge-gui/res/cardsfolder/h/hisokas_defiance.txt b/forge-gui/res/cardsfolder/h/hisokas_defiance.txt index 5a2fd4d001f..b15b025b2dc 100644 --- a/forge-gui/res/cardsfolder/h/hisokas_defiance.txt +++ b/forge-gui/res/cardsfolder/h/hisokas_defiance.txt @@ -2,6 +2,6 @@ Name:Hisoka's Defiance ManaCost:1 U Types:Instant A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TgtPrompt$ Select target Spirit or Arcane spell | ValidTgts$ Spirit,Arcane | SpellDescription$ Counter target Spirit or Arcane spell. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/hisokas_defiance.jpg Oracle:Counter target Spirit or Arcane spell. diff --git a/forge-gui/res/cardsfolder/h/hisokas_guard.txt b/forge-gui/res/cardsfolder/h/hisokas_guard.txt index 5c1768deab7..523e321f3c4 100644 --- a/forge-gui/res/cardsfolder/h/hisokas_guard.txt +++ b/forge-gui/res/cardsfolder/h/hisokas_guard.txt @@ -7,6 +7,6 @@ A:AB$ Pump | Cost$ 1 U T | ValidTgts$ Creature.YouCtrl+Other | TgtPrompt$ Select S:Mode$ Continuous | Affected$ Creature.IsRemembered | AddKeyword$ Shroud T:Mode$ Untaps | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ ClearRemembered | Static$ True SVar:ClearRemembered:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/hisokas_guard.jpg Oracle:You may choose not to untap Hisoka's Guard during your untap step.\n{1}{U}, {T}: Target creature you control other than Hisoka's Guard has shroud for as long as Hisoka's Guard remains tapped. (It can't be the target of spells or abilities.) diff --git a/forge-gui/res/cardsfolder/h/hive_mind.txt b/forge-gui/res/cardsfolder/h/hive_mind.txt index 294198c7d09..2cb798a8cf2 100644 --- a/forge-gui/res/cardsfolder/h/hive_mind.txt +++ b/forge-gui/res/cardsfolder/h/hive_mind.txt @@ -3,7 +3,7 @@ ManaCost:5 U Types:Enchantment T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ Player | Execute$ TrigCopy | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player casts an instant or sorcery spell, each other player copies that spell. Each of those players may choose new targets for their copy. SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Controller$ TriggeredCardOpponent -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:RemMultiplayer:True SVar:Picture:http://www.wizards.com/global/images/magic/general/hive_mind.jpg Oracle:Whenever a player casts an instant or sorcery spell, each other player copies that spell. Each of those players may choose new targets for their copy. diff --git a/forge-gui/res/cardsfolder/h/hivestone.txt b/forge-gui/res/cardsfolder/h/hivestone.txt index 495d6de2330..96090a738e6 100644 --- a/forge-gui/res/cardsfolder/h/hivestone.txt +++ b/forge-gui/res/cardsfolder/h/hivestone.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddType$ Sliver | Description$ Creatures you control are Slivers in addition to their other creature types. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/hivestone.jpg Oracle:Creatures you control are Slivers in addition to their other creature types. diff --git a/forge-gui/res/cardsfolder/h/hivis_of_the_scale.txt b/forge-gui/res/cardsfolder/h/hivis_of_the_scale.txt index ccc9bb86373..f4638f8b196 100644 --- a/forge-gui/res/cardsfolder/h/hivis_of_the_scale.txt +++ b/forge-gui/res/cardsfolder/h/hivis_of_the_scale.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Viashino Shaman PT:3/4 K:You may choose not to untap CARDNAME during your untap step. A:AB$ GainControl | Cost$ T | ValidTgts$ Dragon | TgtPrompt$ Select target Dragon. | LoseControl$ Untap,LeavesPlay,LoseControl | SpellDescription$ Gain control of target Dragon for as long as you control CARDNAME and CARDNAME remains tapped. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/hivis_of_the_scale.jpg Oracle:You may choose not to untap Hivis of the Scale during your untap step.\n{T}: Gain control of target Dragon for as long as you control Hivis and Hivis remains tapped. diff --git a/forge-gui/res/cardsfolder/h/hokori_dust_drinker.txt b/forge-gui/res/cardsfolder/h/hokori_dust_drinker.txt index 9cf41bf5697..ecfbd95e14a 100644 --- a/forge-gui/res/cardsfolder/h/hokori_dust_drinker.txt +++ b/forge-gui/res/cardsfolder/h/hokori_dust_drinker.txt @@ -5,6 +5,6 @@ PT:2/2 S:Mode$ Continuous | Affected$ Land | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Lands don't untap during their controller's untap steps. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield | IsPresent$ Card.Self | Execute$ TrigUntap | TriggerDescription$ At the beginning of each player's upkeep, that player untaps a land they control. SVar:TrigUntap:DB$ Untap | UntapExactly$ True | UntapType$ Land.ActivePlayerCtrl | Amount$ 1 | Defined$ TriggeredPlayer -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/hokori_dust_drinker.jpg Oracle:Lands don't untap during their controllers' untap steps.\nAt the beginning of each player's upkeep, that player untaps a land they control. diff --git a/forge-gui/res/cardsfolder/h/holistic_wisdom.txt b/forge-gui/res/cardsfolder/h/holistic_wisdom.txt index 6fa03ef8ccb..67162c7109d 100644 --- a/forge-gui/res/cardsfolder/h/holistic_wisdom.txt +++ b/forge-gui/res/cardsfolder/h/holistic_wisdom.txt @@ -4,6 +4,6 @@ Types:Enchantment A:AB$ Pump | Cost$ 2 ExileFromHand<1/Card> | RememberCostCards$ True | SubAbility$ DBChangeZone | ValidTgts$ Card.YouOwn | TgtZone$ Graveyard | StackDescription$ None | SpellDescription$ Return target card from your graveyard to your hand if it shares a card type with the card exiled this way. (Artifact, creature, enchantment, instant, land, planeswalker, sorcery, and tribal are card types.) SVar:DBChangeZone:DB$ ChangeZone | Defined$ ParentTarget | Origin$ Graveyard | Destination$ Hand | ConditionDefined$ ParentTarget | ConditionPresent$ Card.sharesCardTypeWith Remembered | ConditionCompare$ GE1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/holistic_wisdom.jpg Oracle:{2}, Exile a card from your hand: Return target card from your graveyard to your hand if it shares a card type with the card exiled this way. (Artifact, creature, enchantment, instant, land, planeswalker, sorcery, and tribal are card types.) diff --git a/forge-gui/res/cardsfolder/h/hollow_trees.txt b/forge-gui/res/cardsfolder/h/hollow_trees.txt index 1d4d2edf113..6657b73aaaf 100644 --- a/forge-gui/res/cardsfolder/h/hollow_trees.txt +++ b/forge-gui/res/cardsfolder/h/hollow_trees.txt @@ -8,6 +8,6 @@ SVar:TrigStore:DB$PutCounter | Defined$ Self | CounterType$ STORAGE | CounterNum A:AB$ Mana | Cost$ T SubCounter | Produced$ G | Amount$ ChosenX | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | References$ X | SpellDescription$ Add {G} for each storage counter removed this way. SVar:X:XChoice #ChosenX SVar created by Cost payment -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/hollow_trees.jpg Oracle:Hollow Trees enters the battlefield tapped.\nYou may choose not to untap Hollow Trees during your untap step.\nAt the beginning of your upkeep, if Hollow Trees is tapped, put a storage counter on it.\n{T}, Remove any number of storage counters from Hollow Trees: Add {G} for each storage counter removed this way. diff --git a/forge-gui/res/cardsfolder/h/hollow_warrior.txt b/forge-gui/res/cardsfolder/h/hollow_warrior.txt index 62bcb49adbc..cddd0d753d2 100644 --- a/forge-gui/res/cardsfolder/h/hollow_warrior.txt +++ b/forge-gui/res/cardsfolder/h/hollow_warrior.txt @@ -4,6 +4,6 @@ Types:Artifact Creature Golem Warrior PT:4/4 S:Mode$ CantAttackUnless | ValidCard$ Card.Self | Cost$ tapXType<1/Creature.notattacking> | Description$ CARDNAME can't attack or block unless you tap an untapped creature you control not declared as an attacking or blocking creature this combat. (This cost is paid as attackers or blockers are declared.) S:Mode$ CantBlockUnless | ValidCard$ Card.Self | Cost$ tapXType<1/Creature.notblocking> -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/hollow_warrior.jpg Oracle:Hollow Warrior can't attack or block unless you tap an untapped creature you control not declared as an attacking or blocking creature this combat. (This cost is paid as attackers or blockers are declared.) diff --git a/forge-gui/res/cardsfolder/h/hollowhenge_spirit.txt b/forge-gui/res/cardsfolder/h/hollowhenge_spirit.txt index c950c449cf4..eee043b873d 100644 --- a/forge-gui/res/cardsfolder/h/hollowhenge_spirit.txt +++ b/forge-gui/res/cardsfolder/h/hollowhenge_spirit.txt @@ -6,7 +6,7 @@ K:Flash K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigRemove | TriggerDescription$ When CARDNAME enters the battlefield, remove target attacking or blocking creature from combat. SVar:TrigRemove:DB$ RemoveFromCombat | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:AmbushAI:True SVar:Picture:http://www.wizards.com/global/images/magic/general/hollowhenge_spirit.jpg Oracle:Flash (You may cast this spell any time you could cast an instant.)\nFlying\nWhen Hollowhenge Spirit enters the battlefield, remove target attacking or blocking creature from combat. diff --git a/forge-gui/res/cardsfolder/h/holy_justiciar.txt b/forge-gui/res/cardsfolder/h/holy_justiciar.txt index 7d810b017c1..6c0a7493b05 100644 --- a/forge-gui/res/cardsfolder/h/holy_justiciar.txt +++ b/forge-gui/res/cardsfolder/h/holy_justiciar.txt @@ -4,6 +4,6 @@ Types:Creature Human Cleric PT:2/1 A:AB$ Tap | Cost$ 2 W T | TgtPrompt$ Choose target creature | ValidTgts$ Creature | SubAbility$ DBExile | SpellDescription$ Tap target creature. If that creature is a Zombie, exile it. SVar:DBExile:DB$ChangeZone | ConditionDefined$ Targeted | ConditionPresent$ Creature.Zombie | ConditionCompare$ EQ1 | Defined$ Targeted | Origin$ Battlefield | Destination$ Exile | ConditionDescription$ If that creature is a Zombie, -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/holy_justiciar.jpg Oracle:{2}{W}, {T}: Tap target creature. If that creature is a Zombie, exile it. diff --git a/forge-gui/res/cardsfolder/h/homarid_shaman.txt b/forge-gui/res/cardsfolder/h/homarid_shaman.txt index 1ef12a7f82c..71eb57549c9 100644 --- a/forge-gui/res/cardsfolder/h/homarid_shaman.txt +++ b/forge-gui/res/cardsfolder/h/homarid_shaman.txt @@ -3,6 +3,6 @@ ManaCost:2 U U Types:Creature Homarid Shaman PT:2/1 A:AB$ Tap | Cost$ U | ValidTgts$ Creature.Green | TgtPrompt$ Select target green creature | SpellDescription$ Tap target green creature. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/homarid_shaman.jpg Oracle:{U}: Tap target green creature. diff --git a/forge-gui/res/cardsfolder/h/homarid_spawning_bed.txt b/forge-gui/res/cardsfolder/h/homarid_spawning_bed.txt index f652fb1db3a..37514e4e151 100644 --- a/forge-gui/res/cardsfolder/h/homarid_spawning_bed.txt +++ b/forge-gui/res/cardsfolder/h/homarid_spawning_bed.txt @@ -3,7 +3,7 @@ ManaCost:U U Types:Enchantment A:AB$ Token | Cost$ 1 U U Sac<1/Creature.Blue/blue creature> | TokenImage$ u 1 1 camarid | TokenAmount$ X | TokenName$ Camarid | TokenTypes$ Creature,Camarid | TokenOwner$ You | TokenColors$ Blue | TokenPower$ 1 | TokenToughness$ 1 | References$ X | SpellDescription$ Create X 1/1 blue Camarid creature tokens, where X is the sacrificed creature's converted mana cost. SVar:X:Sacrificed$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/homarid_spawning_bed.jpg Oracle:{1}{U}{U}, Sacrifice a blue creature: Create X 1/1 blue Camarid creature tokens, where X is the sacrificed creature's converted mana cost. diff --git a/forge-gui/res/cardsfolder/h/homicidal_seclusion.txt b/forge-gui/res/cardsfolder/h/homicidal_seclusion.txt index fc737b3bf57..2cb6508a8e2 100644 --- a/forge-gui/res/cardsfolder/h/homicidal_seclusion.txt +++ b/forge-gui/res/cardsfolder/h/homicidal_seclusion.txt @@ -3,7 +3,7 @@ ManaCost:4 B Types:Enchantment S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddPower$ 3 | AddToughness$ 1 | AddKeyword$ Lifelink | CheckSVar$ X | SVarCompare$ EQ1 | Description$ As long as you control exactly one creature, that creature gets +3/+1 and has lifelink. SVar:X:Count$Valid Creature.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/homicidal_seclusion.jpg Oracle:As long as you control exactly one creature, that creature gets +3/+1 and has lifelink. diff --git a/forge-gui/res/cardsfolder/h/homing_sliver.txt b/forge-gui/res/cardsfolder/h/homing_sliver.txt index 02e79564a5a..fd402461405 100644 --- a/forge-gui/res/cardsfolder/h/homing_sliver.txt +++ b/forge-gui/res/cardsfolder/h/homing_sliver.txt @@ -4,6 +4,6 @@ Types:Creature Sliver PT:2/2 K:TypeCycling:Sliver:3 S:Mode$ Continuous | Affected$ Sliver | EffectZone$ Battlefield | AffectedZone$ Hand | AddKeyword$ TypeCycling:Sliver:3 | Description$ Each Sliver card in each player's hand has slivercycling {3}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/homing_sliver.jpg Oracle:Each Sliver card in each player's hand has slivercycling {3}.\nSlivercycling {3} ({3}, Discard this card: Search your library for a Sliver card, reveal it, put it into your hand, then shuffle your library.) diff --git a/forge-gui/res/cardsfolder/h/honor_worn_shaku.txt b/forge-gui/res/cardsfolder/h/honor_worn_shaku.txt index a80ffee6c18..1d22326ba13 100644 --- a/forge-gui/res/cardsfolder/h/honor_worn_shaku.txt +++ b/forge-gui/res/cardsfolder/h/honor_worn_shaku.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Untap | Cost$ tapXType<1/Permanent.Legendary> | CostDesc$ Tap an untapped legendary permanent you control: | SpellDescription$ Untap CARDNAME. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/honor_worn_shaku.jpg Oracle:{T}: Add {C}.\nTap an untapped legendary permanent you control: Untap Honor-Worn Shaku. diff --git a/forge-gui/res/cardsfolder/h/horizon_seed.txt b/forge-gui/res/cardsfolder/h/horizon_seed.txt index 2adf790f12c..0734cd01774 100644 --- a/forge-gui/res/cardsfolder/h/horizon_seed.txt +++ b/forge-gui/res/cardsfolder/h/horizon_seed.txt @@ -5,7 +5,7 @@ PT:2/1 T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRegenerate | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, regenerate target creature. SVar:TrigRegenerate:DB$ Regenerate | ValidTgts$ Creature | TgtPrompt$ Select target creature SVar:BuffedBy:Spirit,Arcane -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/horizon_seed.jpg Oracle:Whenever you cast a Spirit or Arcane spell, regenerate target creature. diff --git a/forge-gui/res/cardsfolder/h/horn_of_greed.txt b/forge-gui/res/cardsfolder/h/horn_of_greed.txt index f5b93c2b97b..e60e002efcd 100644 --- a/forge-gui/res/cardsfolder/h/horn_of_greed.txt +++ b/forge-gui/res/cardsfolder/h/horn_of_greed.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact T:Mode$ LandPlayed | ValidCard$ Land | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever a player plays a land, that player draws a card. SVar:TrigDraw:DB$Draw | Defined$ TriggeredCardController | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/horn_of_greed.jpg Oracle:Whenever a player plays a land, that player draws a card. diff --git a/forge-gui/res/cardsfolder/h/horn_of_plenty.txt b/forge-gui/res/cardsfolder/h/horn_of_plenty.txt index 787f593d629..37165f0b09b 100644 --- a/forge-gui/res/cardsfolder/h/horn_of_plenty.txt +++ b/forge-gui/res/cardsfolder/h/horn_of_plenty.txt @@ -6,6 +6,6 @@ SVar:DelayedTrigEff:DB$ Effect | Triggers$ EOTTrig | SVars$ TrigDraw,RemoveEff | SVar:EOTTrig:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Command | Execute$ TrigDraw | TriggerDescription$ Draw a card at the beginning of the next end step. SVar:TrigDraw:DB$ Draw | Defined$ Player.IsRemembered | NumCards$ 1 | SubAbility$ RemoveEff SVar:RemoveEff:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/horn_of_plenty.jpg Oracle:Whenever a player casts a spell, they may pay {1}. If that player does, they draw a card at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/h/horn_of_ramos.txt b/forge-gui/res/cardsfolder/h/horn_of_ramos.txt index a5c227e0400..91970f4ae40 100644 --- a/forge-gui/res/cardsfolder/h/horn_of_ramos.txt +++ b/forge-gui/res/cardsfolder/h/horn_of_ramos.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. A:AB$ Mana | Cost$Sac<1/CARDNAME> | Produced$ G | SpellDescription$ Add {G}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/horn_of_ramos.jpg Oracle:{T}: Add {G}.\nSacrifice Horn of Ramos: Add {G}. diff --git a/forge-gui/res/cardsfolder/h/horror_of_horrors.txt b/forge-gui/res/cardsfolder/h/horror_of_horrors.txt index f73709e7115..86fa3525a20 100644 --- a/forge-gui/res/cardsfolder/h/horror_of_horrors.txt +++ b/forge-gui/res/cardsfolder/h/horror_of_horrors.txt @@ -2,7 +2,7 @@ Name:Horror of Horrors ManaCost:3 B B Types:Enchantment A:AB$ Regenerate | ValidTgts$ Creature.Black | TgtPrompt$ Select target black creature | Cost$ Sac<1/Swamp> | SpellDescription$ Regenerate target black creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/horror_of_horrors.jpg Oracle:Sacrifice a Swamp: Regenerate target black creature. (The next time that creature would be destroyed this turn, it isn't. Instead tap it, remove all damage from it, and remove it from combat.) diff --git a/forge-gui/res/cardsfolder/h/hour_of_eternity.txt b/forge-gui/res/cardsfolder/h/hour_of_eternity.txt index c1910b3a088..7549753b76a 100644 --- a/forge-gui/res/cardsfolder/h/hour_of_eternity.txt +++ b/forge-gui/res/cardsfolder/h/hour_of_eternity.txt @@ -7,7 +7,7 @@ SVar:DBClone:DB$ CopyPermanent | Defined$ Imprinted | SetPower$ 4 | SetToughness SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Targeted$Amount SVar:MaxTgts:Count$TypeInYourYard.Creature -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHas:Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/hour_of_eternity.jpg Oracle:Exile X target creature cards from your graveyard. For each card exiled this way, create a token that's a copy of that card, except it's a 4/4 black Zombie. diff --git a/forge-gui/res/cardsfolder/h/hour_of_need.txt b/forge-gui/res/cardsfolder/h/hour_of_need.txt index 6f7c3379661..6bd8195fb43 100644 --- a/forge-gui/res/cardsfolder/h/hour_of_need.txt +++ b/forge-gui/res/cardsfolder/h/hour_of_need.txt @@ -7,6 +7,6 @@ SVar:DBRepeat:DB$ RepeatEach | DefinedCards$ DirectRemembered | UseImprinted$ Tr SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenName$ Sphinx | TokenTypes$ Creature,Sphinx | TokenOwner$ ImprintedController | TokenColors$ Blue | TokenPower$ 4 | TokenToughness$ 4 | TokenKeywords$ Flying SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$Valid Creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/hour_of_need.jpg Oracle:Strive — Hour of Need costs {1}{U} more to cast for each target beyond the first.\nExile any number of target creatures. For each creature exiled this way, its controller creates a 4/4 blue Sphinx creature token with flying. diff --git a/forge-gui/res/cardsfolder/h/howlpack_resurgence.txt b/forge-gui/res/cardsfolder/h/howlpack_resurgence.txt index 9398f2768d3..75ee65c3ae0 100644 --- a/forge-gui/res/cardsfolder/h/howlpack_resurgence.txt +++ b/forge-gui/res/cardsfolder/h/howlpack_resurgence.txt @@ -3,7 +3,7 @@ ManaCost:2 G Types:Enchantment K:Flash S:Mode$ Continuous | Affected$ Creature.Wolf+YouCtrl,Creature.Werewolf+YouCtrl | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Trample | Description$ Each creature you control that's a Wolf or a Werewolf gets +1/+1 and has trample. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Wolf & Type$Werewolf SVar:Picture:Picture:http://www.wizards.com/global/images/magic/general/howlpack_resurgence.jpg Oracle:Flash (You may cast this spell any time you could cast an instant.)\nEach creature you control that's a Wolf or a Werewolf gets +1/+1 and has trample. diff --git a/forge-gui/res/cardsfolder/h/howlpack_wolf.txt b/forge-gui/res/cardsfolder/h/howlpack_wolf.txt index 4adaee3a6dc..cc194e13347 100644 --- a/forge-gui/res/cardsfolder/h/howlpack_wolf.txt +++ b/forge-gui/res/cardsfolder/h/howlpack_wolf.txt @@ -6,7 +6,7 @@ S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ CARDNAME can't bloc SVar:X:Count$Valid Wolf.Other+YouCtrl/Plus.Y SVar:Y:Count$Valid Werewolf.Other+YouCtrl SVar:BuffedBy:Wolf,Werewolf -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Wolf & Type$Werewolf SVar:Picture:http://www.wizards.com/global/images/magic/general/howlpack_wolf.jpg Oracle:Howlpack Wolf can't block unless you control another Wolf or Werewolf. diff --git a/forge-gui/res/cardsfolder/h/howltooth_hollow.txt b/forge-gui/res/cardsfolder/h/howltooth_hollow.txt index 67ba406056c..d3f00f13c74 100644 --- a/forge-gui/res/cardsfolder/h/howltooth_hollow.txt +++ b/forge-gui/res/cardsfolder/h/howltooth_hollow.txt @@ -5,6 +5,6 @@ K:Hideaway A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. A:AB$ Play | Cost$ B T | Defined$ Remembered | Amount$ All | Controller$ You | WithoutManaCost$ True | Optional$ True | ConditionCheckSVar$ Hands | ConditionSVarCompare$ EQ0 | ForgetRemembered$ True | References$ Hands | AILogic$ CheckCondition | SpellDescription$ You may play the exiled card without paying its mana cost if each player has no cards in hand. SVar:Hands:Count$NumInAllHands -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/howltooth_hollow.jpg Oracle:Hideaway (This land enters the battlefield tapped. When it does, look at the top four cards of your library, exile one face down, then put the rest on the bottom of your library.)\n{T}: Add {B}.\n{B}, {T}: You may play the exiled card without paying its mana cost if each player has no cards in hand. diff --git a/forge-gui/res/cardsfolder/h/hua_tuo_honored_physician.txt b/forge-gui/res/cardsfolder/h/hua_tuo_honored_physician.txt index d899537e24e..61f6f8a8970 100644 --- a/forge-gui/res/cardsfolder/h/hua_tuo_honored_physician.txt +++ b/forge-gui/res/cardsfolder/h/hua_tuo_honored_physician.txt @@ -3,6 +3,6 @@ ManaCost:1 G G Types:Legendary Creature Human PT:1/2 A:AB$ ChangeZone | Cost$ T | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | Origin$ Graveyard | Destination$ Library | PlayerTurn$ True | ActivationPhases$ Upkeep,Draw,Main1,BeginCombat | SpellDescription$ Put target creature card from your graveyard on top of your library. Activate this ability only during your turn, before attackers are declared. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/hua_tuo_honored_physician.jpg Oracle:{T}: Put target creature card from your graveyard on top of your library. Activate this ability only during your turn, before attackers are declared. diff --git a/forge-gui/res/cardsfolder/h/huatli_dinosaur_knight.txt b/forge-gui/res/cardsfolder/h/huatli_dinosaur_knight.txt index 4f0d02ea956..0da98aba2a0 100644 --- a/forge-gui/res/cardsfolder/h/huatli_dinosaur_knight.txt +++ b/forge-gui/res/cardsfolder/h/huatli_dinosaur_knight.txt @@ -7,7 +7,7 @@ A:AB$ Pump | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | ValidTgts$ Creat SVar:DBDealDamage:DB$ DealDamage | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Select target creature you don't control | AILogic$ PowerDmg | NumDmg$ X | References$ X | DamageSource$ ParentTarget SVar:X:ParentTargeted$CardPower A:AB$ PumpAll | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidCards$ Creature.Dinosaur+YouCtrl | NumAtt$ +4 | NumDef$ +4 | SpellDescription$ Dinosaurs you control get +4/+4 until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Dinosaur DeckHints:Name$Sun Blessed Mount SVar:Picture:http://www.wizards.com/global/images/magic/general/huatli_dinosaur_knight.jpg diff --git a/forge-gui/res/cardsfolder/h/hull_breach.txt b/forge-gui/res/cardsfolder/h/hull_breach.txt index 565141b8cfc..d970ed2c62d 100644 --- a/forge-gui/res/cardsfolder/h/hull_breach.txt +++ b/forge-gui/res/cardsfolder/h/hull_breach.txt @@ -6,6 +6,6 @@ SVar:DBDestroy1:DB$ Destroy | ValidTgts$ Artifact | TgtPrompt$ Select target art SVar:DBDestroy2:DB$ Destroy | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | SpellDescription$ Destroy target enchantment. SVar:DBDestroy3:DB$ Destroy | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy target artifact and target enchantment. | SubAbility$ DestroyEnch SVar:DestroyEnch:DB$ Destroy | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/hull_breach.jpg Oracle:Choose one —\n• Destroy target artifact.\n• Destroy target enchantment.\n• Destroy target artifact and target enchantment. diff --git a/forge-gui/res/cardsfolder/h/hum_of_the_radix.txt b/forge-gui/res/cardsfolder/h/hum_of_the_radix.txt index 76eed30ea46..ba0b8b468a3 100644 --- a/forge-gui/res/cardsfolder/h/hum_of_the_radix.txt +++ b/forge-gui/res/cardsfolder/h/hum_of_the_radix.txt @@ -3,6 +3,6 @@ ManaCost:2 G G Types:Enchantment S:Mode$ RaiseCost | ValidCard$ Artifact | Activator$ Player | Type$ Spell | Amount$ X | AffectedAmount$ True | Description$ Each artifact spell costs {1} more to cast for each artifact its controller controls. SVar:X:Count$Valid Artifact.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/hum_of_the_radix.jpg Oracle:Each artifact spell costs {1} more to cast for each artifact its controller controls. diff --git a/forge-gui/res/cardsfolder/h/humility.txt b/forge-gui/res/cardsfolder/h/humility.txt index e0c229f1eb1..cb5302c65e3 100644 --- a/forge-gui/res/cardsfolder/h/humility.txt +++ b/forge-gui/res/cardsfolder/h/humility.txt @@ -2,6 +2,6 @@ Name:Humility ManaCost:2 W W Types:Enchantment S:Mode$ Continuous | Affected$ Creature | SetPower$ 1 | SetToughness$ 1 | RemoveAllAbilities$ True | Description$ All creatures lose all abilities and have base power and toughness 1/1. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/humility.jpg Oracle:All creatures lose all abilities and have base power and toughness 1/1. diff --git a/forge-gui/res/cardsfolder/h/hundred_talon_strike.txt b/forge-gui/res/cardsfolder/h/hundred_talon_strike.txt index 9a8dd4cdd4c..3065998c10b 100644 --- a/forge-gui/res/cardsfolder/h/hundred_talon_strike.txt +++ b/forge-gui/res/cardsfolder/h/hundred_talon_strike.txt @@ -3,7 +3,7 @@ ManaCost:W Types:Instant Arcane K:Splice:Arcane:tapXType<1/Creature.White/white creature> A:SP$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | KW$ First Strike | SpellDescription$ Target creature gets +1/+0 and gains first strike until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHints:Type$Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/hundred_talon_strike.jpg Oracle:Target creature gets +1/+0 and gains first strike until end of turn.\nSplice onto Arcane—Tap an untapped white creature you control. (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) diff --git a/forge-gui/res/cardsfolder/h/hunger_of_the_nim.txt b/forge-gui/res/cardsfolder/h/hunger_of_the_nim.txt index 5291f3e2dbd..54baf97a397 100644 --- a/forge-gui/res/cardsfolder/h/hunger_of_the_nim.txt +++ b/forge-gui/res/cardsfolder/h/hunger_of_the_nim.txt @@ -3,6 +3,6 @@ ManaCost:1 B Types:Sorcery A:SP$ Pump | Cost$ 1 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | References$ X | SpellDescription$ Target creature gets +1/+0 until end of turn for each artifact you control. SVar:X:Count$TypeYouCtrl.Artifact -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/hunger_of_the_nim.jpg Oracle:Target creature gets +1/+0 until end of turn for each artifact you control. diff --git a/forge-gui/res/cardsfolder/h/hunt_down.txt b/forge-gui/res/cardsfolder/h/hunt_down.txt index 5585bab83e2..08c5d5cb2ec 100644 --- a/forge-gui/res/cardsfolder/h/hunt_down.txt +++ b/forge-gui/res/cardsfolder/h/hunt_down.txt @@ -3,6 +3,6 @@ ManaCost:G Types:Sorcery A:SP$ Pump | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature to attack | StackDescription$ None | SubAbility$ DBMustBlock | SpellDescription$ Target creature blocks target creature this turn if able. SVar:DBMustBlock:DB$ MustBlock | DefinedAttacker$ ParentTarget | ValidTgts$ Creature | TgtPrompt$ Select target creature to block -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/hunt_down.jpg Oracle:Target creature blocks target creature this turn if able. diff --git a/forge-gui/res/cardsfolder/h/hunters_ambush.txt b/forge-gui/res/cardsfolder/h/hunters_ambush.txt index 88b6b3251a1..5978081e9c1 100644 --- a/forge-gui/res/cardsfolder/h/hunters_ambush.txt +++ b/forge-gui/res/cardsfolder/h/hunters_ambush.txt @@ -3,6 +3,6 @@ ManaCost:2 G Types:Instant A:SP$ Effect | Cost$ 2 G | Name$ Hunter's Ambush Effect | StaticAbilities$ KWPump | SpellDescription$ Prevent all combat damage that would be dealt by nongreen creatures this turn. SVar:KWPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.nonGreen | AddKeyword$ Prevent all combat damage that would be dealt by CARDNAME. | Description$ Prevent all combat damage that would be dealt by nongreen creatures this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/hunters_ambush.jpg Oracle:Prevent all combat damage that would be dealt by nongreen creatures this turn. diff --git a/forge-gui/res/cardsfolder/h/hunters_insight.txt b/forge-gui/res/cardsfolder/h/hunters_insight.txt index 8a103ee76b0..162e4fd8724 100644 --- a/forge-gui/res/cardsfolder/h/hunters_insight.txt +++ b/forge-gui/res/cardsfolder/h/hunters_insight.txt @@ -5,6 +5,6 @@ A:SP$ Effect | Cost$ 2 G | Name$ Hunter's Insight Effect | ValidTgts$ Creature | SVar:TrigDamage:Mode$ DamageDone | ValidSource$ Creature.IsRemembered | ValidTarget$ Player,Planeswalker | Execute$ TrigDraw | CombatDamage$ True | TriggerDescription$ Whenever that creature deals combat damage to a player or planeswalker this turn, draw that many cards. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ X | References$ X SVar:X:TriggerCount$DamageAmount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/hunters_insight.jpg Oracle:Choose target creature you control. Whenever that creature deals combat damage to a player or planeswalker this turn, draw that many cards. diff --git a/forge-gui/res/cardsfolder/h/hunting_drake.txt b/forge-gui/res/cardsfolder/h/hunting_drake.txt index a75ff534022..d596dcd0af8 100644 --- a/forge-gui/res/cardsfolder/h/hunting_drake.txt +++ b/forge-gui/res/cardsfolder/h/hunting_drake.txt @@ -5,6 +5,6 @@ PT:2/2 K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, put target red or green creature on top of its owner's library. SVar:TrigChangeZone:DB$ChangeZone | ValidTgts$ Creature.Red,Creature.Green | TgtPrompt$ Select target red or green creature | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/hunting_drake.jpg Oracle:Flying\nWhen Hunting Drake enters the battlefield, put target red or green creature on top of its owner's library. diff --git a/forge-gui/res/cardsfolder/h/hurr_jackal.txt b/forge-gui/res/cardsfolder/h/hurr_jackal.txt index b6ebb528180..ac3b60db71e 100644 --- a/forge-gui/res/cardsfolder/h/hurr_jackal.txt +++ b/forge-gui/res/cardsfolder/h/hurr_jackal.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Creature Jackal PT:1/1 A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME can't be regenerated. | IsCurse$ True | SpellDescription$ Target creature can't be regenerated this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/hurr_jackal.jpg Oracle:{T}: Target creature can't be regenerated this turn. diff --git a/forge-gui/res/cardsfolder/h/hushwing_gryff.txt b/forge-gui/res/cardsfolder/h/hushwing_gryff.txt index a51af93aa50..733dba6072a 100644 --- a/forge-gui/res/cardsfolder/h/hushwing_gryff.txt +++ b/forge-gui/res/cardsfolder/h/hushwing_gryff.txt @@ -5,6 +5,6 @@ PT:2/1 K:Flash K:Flying S:Mode$ Continuous | GlobalRule$ Creatures entering the battlefield don't cause abilities to trigger. | Description$ Creatures entering the battlefield don't cause abilities to trigger. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/hushwing_gryff.jpg Oracle:Flash\nFlying\nCreatures entering the battlefield don't cause abilities to trigger. diff --git a/forge-gui/res/cardsfolder/h/hydroblast.txt b/forge-gui/res/cardsfolder/h/hydroblast.txt index 40b79218879..33c8e1568a9 100644 --- a/forge-gui/res/cardsfolder/h/hydroblast.txt +++ b/forge-gui/res/cardsfolder/h/hydroblast.txt @@ -5,6 +5,6 @@ A:SP$ Charm | Cost$ U | Choices$ DBCounter,DBDestroy | CharmNum$ 1 SVar:DBCounter:DB$ Counter | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | AITgts$ Card.Red | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | References$ X | SpellDescription$ Counter target spell if it's red. SVar:DBDestroy:DB$ Destroy | ValidTgts$ Permanent | AITgts$ Card.Red | TgtPrompt$ Select target permanent | ConditionDefined$ Targeted | ConditionPresent$ Card.Red | ConditionCompare$ GE1 | SpellDescription$ Destroy target permanent if it's red. SVar:X:Targeted$Valid Card.Red -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/hydroblast.jpg Oracle:Choose one —\n• Counter target spell if it's red.\n• Destroy target permanent if it's red. diff --git a/forge-gui/res/cardsfolder/h/hydromorph_guardian.txt b/forge-gui/res/cardsfolder/h/hydromorph_guardian.txt index 66159d77114..157a4f5ede0 100644 --- a/forge-gui/res/cardsfolder/h/hydromorph_guardian.txt +++ b/forge-gui/res/cardsfolder/h/hydromorph_guardian.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Creature Elemental PT:2/2 A:AB$ Counter | Cost$ U Sac<1/CARDNAME> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | TargetValidTargeting$ Creature.YouCtrl | SpellDescription$ Counter target spell that targets one or more creatures you control. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/hydromorph_guardian.jpg Oracle:{U}, Sacrifice Hydromorph Guardian: Counter target spell that targets one or more creatures you control. diff --git a/forge-gui/res/cardsfolder/h/hydromorph_gull.txt b/forge-gui/res/cardsfolder/h/hydromorph_gull.txt index 43f664579ff..f1dd51e7a38 100644 --- a/forge-gui/res/cardsfolder/h/hydromorph_gull.txt +++ b/forge-gui/res/cardsfolder/h/hydromorph_gull.txt @@ -4,6 +4,6 @@ Types:Creature Elemental Bird PT:3/3 K:Flying A:AB$ Counter | Cost$ U Sac<1/CARDNAME> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | TargetValidTargeting$ Creature.YouCtrl | SpellDescription$ Counter target spell that targets one or more creatures you control. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/hydromorph_gull.jpg Oracle:Flying\n{U}, Sacrifice Hydromorph Gull: Counter target spell that targets one or more creatures you control. diff --git a/forge-gui/res/cardsfolder/h/hypergenesis.txt b/forge-gui/res/cardsfolder/h/hypergenesis.txt index c3f44dad2ae..ed0843c6c42 100644 --- a/forge-gui/res/cardsfolder/h/hypergenesis.txt +++ b/forge-gui/res/cardsfolder/h/hypergenesis.txt @@ -16,7 +16,7 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:NumPlayerGiveup:Number$0 SVar:TotalPlayer:PlayerCountPlayers$Amount SVar:CheckHand:Count$ValidHand Artifact.IsNotRemembered+RememberedPlayerCtrl,Creature.IsNotRemembered+RememberedPlayerCtrl,Enchantment.IsNotRemembered+RememberedPlayerCtrl,Land.IsNotRemembered+RememberedPlayerCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NeedsToPlayVar:Y GE1 SVar:Y:Count$ValidHand Permanent.YouCtrl+cmcGE5 SVar:Picture:http://www.wizards.com/global/images/magic/general/hypergenesis.jpg diff --git a/forge-gui/res/cardsfolder/h/hyperion_blacksmith.txt b/forge-gui/res/cardsfolder/h/hyperion_blacksmith.txt index acd58582b50..c1ac1bfec9b 100644 --- a/forge-gui/res/cardsfolder/h/hyperion_blacksmith.txt +++ b/forge-gui/res/cardsfolder/h/hyperion_blacksmith.txt @@ -3,6 +3,6 @@ ManaCost:1 R R Types:Creature Human Artificer PT:2/2 A:AB$ TapOrUntap | Cost$ T | ValidTgts$ Artifact.OppCtrl | TgtPrompt$ Select target artifact an opponent controls | SpellDescription$ You may tap or untap target artifact an opponent controls. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/hyperion_blacksmith.jpg Oracle:{T}: You may tap or untap target artifact an opponent controls. diff --git a/forge-gui/res/cardsfolder/h/hypnox.txt b/forge-gui/res/cardsfolder/h/hypnox.txt index f4c0b81dd54..09be124a684 100644 --- a/forge-gui/res/cardsfolder/h/hypnox.txt +++ b/forge-gui/res/cardsfolder/h/hypnox.txt @@ -8,6 +8,6 @@ SVar:TrigExile:DB$ ChangeZoneAll | ValidTgts$ Opponent | ChangeType$ Card.Target T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Any | Execute$ TrigReturn | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME leaves the battlefield, return the exiled cards to their owner's hand. SVar:TrigReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Hand | SubAbility$ DBCleanup SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/hypnox.jpg Oracle:Flying\nWhen Hypnox enters the battlefield, if you cast it from your hand, exile all cards from target opponent's hand.\nWhen Hypnox leaves the battlefield, return the exiled cards to their owner's hand. diff --git a/forge-gui/res/cardsfolder/h/hypochondria.txt b/forge-gui/res/cardsfolder/h/hypochondria.txt index 0831264bf43..730248ab38d 100644 --- a/forge-gui/res/cardsfolder/h/hypochondria.txt +++ b/forge-gui/res/cardsfolder/h/hypochondria.txt @@ -3,6 +3,6 @@ ManaCost:1 W Types:Enchantment A:AB$ PreventDamage | Cost$ W Discard<1/Card> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | Amount$ 3 | SpellDescription$ Prevent the next 3 damage that would be dealt to any target this turn. A:AB$ PreventDamage | Cost$ W Sac<1/CARDNAME> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | Amount$ 3 | SpellDescription$ Prevent the next 3 damage that would be dealt to any target this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/hypochondria.jpg Oracle:{W}, Discard a card: Prevent the next 3 damage that would be dealt to target permanent or player this turn.\n{W}, Sacrifice Hypochondria: Prevent the next 3 damage that would be dealt to any target this turn. diff --git a/forge-gui/res/cardsfolder/i/ib_halfheart_goblin_tactician.txt b/forge-gui/res/cardsfolder/i/ib_halfheart_goblin_tactician.txt index d7835176fb6..2aaaf294e40 100644 --- a/forge-gui/res/cardsfolder/i/ib_halfheart_goblin_tactician.txt +++ b/forge-gui/res/cardsfolder/i/ib_halfheart_goblin_tactician.txt @@ -8,6 +8,6 @@ SVar:HalfHeartTrigSacrifice:DB$ Sacrifice | SacValid$ TriggeredAttacker | Rememb SVar:HalfHeartDBDamage:DB$ DealDamage | DamageSource$ TriggeredAttacker | NumDmg$ 4 | Defined$ TriggeredBlockers | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ1 | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ib_halfheart_goblin_tactician.jpg Oracle:Whenever another Goblin you control becomes blocked, sacrifice it. If you do, it deals 4 damage to each creature blocking it.\nSacrifice two Mountains: Create two 1/1 red Goblin creature tokens. diff --git a/forge-gui/res/cardsfolder/i/icatian_crier.txt b/forge-gui/res/cardsfolder/i/icatian_crier.txt index 8949f3db4dc..9a992913f8b 100644 --- a/forge-gui/res/cardsfolder/i/icatian_crier.txt +++ b/forge-gui/res/cardsfolder/i/icatian_crier.txt @@ -4,6 +4,6 @@ Types:Creature Human Spellshaper PT:1/1 A:AB$ Token | Cost$ 1 W T Discard<1/Card> | TokenAmount$ 2 | TokenName$ Citizen | TokenTypes$ Creature,Citizen | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Create two 1/1 white Citizen creature tokens. SVar:AIPreference:DiscardCost$Card.cmcLE1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/icatian_crier.jpg Oracle:{1}{W}, {T}, Discard a card: Create two 1/1 white Citizen creature tokens. diff --git a/forge-gui/res/cardsfolder/i/icatian_infantry.txt b/forge-gui/res/cardsfolder/i/icatian_infantry.txt index 415bc027f99..24d991f70f9 100644 --- a/forge-gui/res/cardsfolder/i/icatian_infantry.txt +++ b/forge-gui/res/cardsfolder/i/icatian_infantry.txt @@ -4,6 +4,6 @@ Types:Creature Human Soldier PT:1/1 A:AB$ Pump | Cost$ 1 | Defined$ Self | KW$ First Strike | SpellDescription$ CARDNAME gains first strike until end of turn. A:AB$ Pump | Cost$ 1 | Defined$ Self | KW$ Banding | SpellDescription$ CARDNAME gains banding until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/icatian_infantry.jpg Oracle:{1}: Icatian Infantry gains first strike until end of turn.\n{1}: Icatian Infantry gains banding until end of turn. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/i/icatian_moneychanger.txt b/forge-gui/res/cardsfolder/i/icatian_moneychanger.txt index 4c5258bb56d..0a6ca59ccd6 100644 --- a/forge-gui/res/cardsfolder/i/icatian_moneychanger.txt +++ b/forge-gui/res/cardsfolder/i/icatian_moneychanger.txt @@ -9,6 +9,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ CREDIT | CounterNum$ 1 | SpellDescription$ Put a credit counter on CARDNAME. A:AB$ GainLife | Cost$ Sac<1/CARDNAME> | LifeAmount$ X | PlayerTurn$ True | ActivationPhases$ Upkeep | References$ X | SpellDescription$ You gain life equal to the number of credit counters on CARDNAME. SVar:X:Count$CardCounters.CREDIT -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/icatian_moneychanger.jpg Oracle:Icatian Moneychanger enters the battlefield with three credit counters on it.\nWhen Icatian Moneychanger enters the battlefield, it deals 3 damage to you.\nAt the beginning of your upkeep, put a credit counter on Icatian Moneychanger.\nSacrifice Icatian Moneychanger: You gain 1 life for each credit counter on Icatian Moneychanger. Activate this ability only during your upkeep. diff --git a/forge-gui/res/cardsfolder/i/icatian_phalanx.txt b/forge-gui/res/cardsfolder/i/icatian_phalanx.txt index c4dbbda9dc2..ae6676ff016 100644 --- a/forge-gui/res/cardsfolder/i/icatian_phalanx.txt +++ b/forge-gui/res/cardsfolder/i/icatian_phalanx.txt @@ -3,6 +3,6 @@ ManaCost:4 W Types:Creature Human Soldier PT:2/4 K:Banding -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/icatian_phalanx.jpg Oracle:Banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/i/icatian_skirmishers.txt b/forge-gui/res/cardsfolder/i/icatian_skirmishers.txt index aa735dc6b68..7095e71dc1d 100644 --- a/forge-gui/res/cardsfolder/i/icatian_skirmishers.txt +++ b/forge-gui/res/cardsfolder/i/icatian_skirmishers.txt @@ -6,6 +6,6 @@ K:First Strike K:Banding T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, all creatures banded with it gain first strike until end of turn. SVar:TrigPump:DB$ PumpAll | ValidCards$ Creature.attackersBandedWith | KW$ First Strike -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/icatian_skirmishers.jpg Oracle:First strike, banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.)\nWhenever Icatian Skirmishers attacks, all creatures banded with it gain first strike until end of turn. diff --git a/forge-gui/res/cardsfolder/i/icatian_store.txt b/forge-gui/res/cardsfolder/i/icatian_store.txt index eb88a28921d..3ab8e9bf3f7 100644 --- a/forge-gui/res/cardsfolder/i/icatian_store.txt +++ b/forge-gui/res/cardsfolder/i/icatian_store.txt @@ -8,6 +8,6 @@ SVar:TrigStore:DB$PutCounter | Defined$ Self | CounterType$ STORAGE | CounterNum A:AB$ Mana | Cost$ T SubCounter | Produced$ W | Amount$ ChosenX | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | References$ X | SpellDescription$ Add {W} for each storage counter removed this way. SVar:X:XChoice #ChosenX SVar created by Cost payment -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/icatian_store.jpg Oracle:Icatian Store enters the battlefield tapped.\nYou may choose not to untap Icatian Store during your untap step.\nAt the beginning of your upkeep, if Icatian Store is tapped, put a storage counter on it.\n{T}, Remove any number of storage counters from Icatian Store: Add {W} for each storage counter removed this way. diff --git a/forge-gui/res/cardsfolder/i/ice_floe.txt b/forge-gui/res/cardsfolder/i/ice_floe.txt index 3419182b54a..7a02251369a 100644 --- a/forge-gui/res/cardsfolder/i/ice_floe.txt +++ b/forge-gui/res/cardsfolder/i/ice_floe.txt @@ -6,6 +6,6 @@ A:AB$ Tap | Cost$ T | ValidTgts$ Creature.withoutFlying+attackingYou | TgtPrompt S:Mode$ Continuous | Affected$ Creature.IsRemembered | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. T:Mode$ Untaps | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ ClearRemembered | Static$ True SVar:ClearRemembered:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ice_floe.jpg Oracle:You may choose not to untap Ice Floe during your untap step.\n{T}: Tap target creature without flying that's attacking you. It doesn't untap during its controller's untap step for as long as Ice Floe remains tapped. diff --git a/forge-gui/res/cardsfolder/i/iceberg.txt b/forge-gui/res/cardsfolder/i/iceberg.txt index 0a9db367317..5d1d92355c8 100644 --- a/forge-gui/res/cardsfolder/i/iceberg.txt +++ b/forge-gui/res/cardsfolder/i/iceberg.txt @@ -5,6 +5,6 @@ K:etbCounter:ICE:X SVar:X:Count$xPaid A:AB$ PutCounter | Cost$ 3 | CounterType$ ICE | CounterNum$ 1 | SpellDescription$ Put an ice counter on CARDNAME. A:AB$ Mana | Cost$ SubCounter<1/ICE> | Produced$ C | SpellDescription$ Add {C}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/iceberg.jpg Oracle:Iceberg enters the battlefield with X ice counters on it.\n{3}: Put an ice counter on Iceberg.\nRemove an ice counter from Iceberg: Add {C}. diff --git a/forge-gui/res/cardsfolder/i/ichneumon_druid.txt b/forge-gui/res/cardsfolder/i/ichneumon_druid.txt index 0cb7ac789c8..357d7281be3 100644 --- a/forge-gui/res/cardsfolder/i/ichneumon_druid.txt +++ b/forge-gui/res/cardsfolder/i/ichneumon_druid.txt @@ -4,6 +4,6 @@ Types:Creature Human Druid PT:1/1 T:Mode$ SpellCast | ValidCard$ Instant | ValidActivatingPlayer$ Player.Opponent | ActivatorThisTurnCast$ GT1 | NoResolvingCheck$ True | TriggerZones$ Battlefield | Execute$ TrigDmg | TriggerDescription$ Whenever an opponent casts an instant spell other than the first instant spell that player casts each turn, CARDNAME deals 4 damage to them. SVar:TrigDmg:DB$ DealDamage | Defined$ TriggeredActivator | NumDmg$ 4 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ichneumon_druid.jpg Oracle:Whenever an opponent casts an instant spell other than the first instant spell that player casts each turn, Ichneumon Druid deals 4 damage to them. diff --git a/forge-gui/res/cardsfolder/i/ichor_explosion.txt b/forge-gui/res/cardsfolder/i/ichor_explosion.txt index 829ae2b6cd6..71abe6e98d8 100644 --- a/forge-gui/res/cardsfolder/i/ichor_explosion.txt +++ b/forge-gui/res/cardsfolder/i/ichor_explosion.txt @@ -3,6 +3,6 @@ ManaCost:5 B B Types:Sorcery A:SP$ PumpAll | Cost$ 5 B B Sac<1/Creature> | ValidCards$ Creature | IsCurse$ True | NumAtt$ -X | NumDef$ -X | References$ X | SpellDescription$ All creatures get -X/-X until end of turn, where X is the sacrificed creature's power. SVar:X:Sacrificed$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ichor_explosion.jpg Oracle:As an additional cost to cast Ichor Explosion, sacrifice a creature.\nAll creatures get -X/-X until end of turn, where X is the sacrificed creature's power. diff --git a/forge-gui/res/cardsfolder/i/ichor_wellspring.txt b/forge-gui/res/cardsfolder/i/ichor_wellspring.txt index 08ef5817764..7cc3f98645e 100644 --- a/forge-gui/res/cardsfolder/i/ichor_wellspring.txt +++ b/forge-gui/res/cardsfolder/i/ichor_wellspring.txt @@ -4,7 +4,7 @@ Types:Artifact T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield or is put into a graveyard from the battlefield, draw a card. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerController$ TriggeredCardController | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield or is put into a graveyard from the battlefield, draw a card. SVar:TrigDraw:DB$Draw | NumCards$ 1 | Defined$ TriggeredCardController -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:SacMe:5 SVar:Picture:http://www.wizards.com/global/images/magic/general/ichor_wellspring.jpg Oracle:When Ichor Wellspring enters the battlefield or is put into a graveyard from the battlefield, draw a card. diff --git a/forge-gui/res/cardsfolder/i/ideas_unbound.txt b/forge-gui/res/cardsfolder/i/ideas_unbound.txt index fb42fb14eb2..c14e6c6f13b 100644 --- a/forge-gui/res/cardsfolder/i/ideas_unbound.txt +++ b/forge-gui/res/cardsfolder/i/ideas_unbound.txt @@ -4,6 +4,6 @@ Types:Sorcery Arcane A:SP$ Draw | Cost$ U U | Defined$ You | NumCards$ 3 | SubAbility$ DelayedDiscard | SpellDescription$ Draw three cards. Discard three cards at the beginning of the next end step. SVar:DelayedDiscard:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ Discard | TriggerDescription$ Discard three cards. SVar:Discard:DB$ Discard | Defined$ You | NumCards$ 3 | Mode$ TgtChoose -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ideas_unbound.jpg Oracle:Draw three cards. Discard three cards at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/i/idyllic_tutor.txt b/forge-gui/res/cardsfolder/i/idyllic_tutor.txt index baa23950347..0b011f1f3a9 100644 --- a/forge-gui/res/cardsfolder/i/idyllic_tutor.txt +++ b/forge-gui/res/cardsfolder/i/idyllic_tutor.txt @@ -2,6 +2,6 @@ Name:Idyllic Tutor ManaCost:2 W Types:Sorcery A:SP$ ChangeZone | Cost$ 2 W | Origin$ Library | Destination$ Hand | ChangeType$ Enchantment | ChangeNum$ 1 | SpellDescription$ Search your library for an enchantment card, reveal it, put it into your hand, then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/idyllic_tutor.jpg Oracle:Search your library for an enchantment card, reveal it, put it into your hand, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/i/ignite_disorder.txt b/forge-gui/res/cardsfolder/i/ignite_disorder.txt index d5492cd554f..e8208d55703 100644 --- a/forge-gui/res/cardsfolder/i/ignite_disorder.txt +++ b/forge-gui/res/cardsfolder/i/ignite_disorder.txt @@ -2,6 +2,6 @@ Name:Ignite Disorder ManaCost:1 R Types:Instant A:SP$ DealDamage | Cost$ 1 R | ValidTgts$ Creature.Blue,Creature.White | TgtPrompt$ Select target white and/or blue creature to distribute damage to | NumDmg$ 3 | TargetMin$ 1 | TargetMax$ 3 | DividedAsYouChoose$ 3 | SpellDescription$ CARDNAME deals 3 damage divided as you choose among one, two, or three target white and/or blue creatures. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ignite_disorder.jpg Oracle:Ignite Disorder deals 3 damage divided as you choose among one, two, or three target white and/or blue creatures. diff --git a/forge-gui/res/cardsfolder/i/ignition_team.txt b/forge-gui/res/cardsfolder/i/ignition_team.txt index 89b5392c9f6..5a399f2d0e8 100644 --- a/forge-gui/res/cardsfolder/i/ignition_team.txt +++ b/forge-gui/res/cardsfolder/i/ignition_team.txt @@ -5,6 +5,6 @@ PT:0/0 K:etbCounter:P1P1:X:no Condition:CARDNAME enters the battlefield with X +1/+1 counters on it, where X is the number of tapped lands on the battlefield. SVar:X:Count$Valid Land.tapped A:AB$ Animate | Cost$ 2 R SubCounter<1/P1P1> | ValidTgts$ Land | Power$ 4 | Toughness$ 4 | Types$ Creature,Elemental | Colors$ Red | SpellDescription$ Target land becomes a 4/4 red Elemental creature until end of turn. It's still a land. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ignition_team.jpg Oracle:Ignition Team enters the battlefield with X +1/+1 counters on it, where X is the number of tapped lands on the battlefield.\n{2}{R}, Remove a +1/+1 counter from Ignition Team: Target land becomes a 4/4 red Elemental creature until end of turn. It's still a land. diff --git a/forge-gui/res/cardsfolder/i/ignorant_bliss.txt b/forge-gui/res/cardsfolder/i/ignorant_bliss.txt index dcab0f351b8..0eeb5722d14 100644 --- a/forge-gui/res/cardsfolder/i/ignorant_bliss.txt +++ b/forge-gui/res/cardsfolder/i/ignorant_bliss.txt @@ -6,6 +6,6 @@ SVar:DelayedReturn:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execu SVar:ReturnAll:DB$ ChangeZone | Origin$ Exile | Destination$ Hand | Defined$ DelayTriggerRemembered | SubAbility$ YouDraw SVar:YouDraw:DB$ Draw | Defined$ You | NumCards$ 1 SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ignorant_bliss.jpg Oracle:Exile all cards from your hand face down. At the beginning of the next end step, return those cards to your hand, then draw a card. diff --git a/forge-gui/res/cardsfolder/i/iizuka_the_ruthless.txt b/forge-gui/res/cardsfolder/i/iizuka_the_ruthless.txt index e39b9fc9c41..05fead83d4b 100644 --- a/forge-gui/res/cardsfolder/i/iizuka_the_ruthless.txt +++ b/forge-gui/res/cardsfolder/i/iizuka_the_ruthless.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Human Samurai PT:3/3 K:Bushido:2 A:AB$ PumpAll | Cost$ 2 R Sac<1/Samurai> | ValidCards$ Creature.Samurai+YouCtrl | KW$ Double Strike | SpellDescription$ Samurai creatures you control gain double strike until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/iizuka_the_ruthless.jpg Oracle:Bushido 2 (When this blocks or becomes blocked, it gets +2/+2 until end of turn.)\n{2}{R}, Sacrifice a Samurai: Samurai creatures you control gain double strike until end of turn. diff --git a/forge-gui/res/cardsfolder/i/ill_gotten_gains.txt b/forge-gui/res/cardsfolder/i/ill_gotten_gains.txt index 7ae4e79ddae..abc92720d56 100644 --- a/forge-gui/res/cardsfolder/i/ill_gotten_gains.txt +++ b/forge-gui/res/cardsfolder/i/ill_gotten_gains.txt @@ -5,6 +5,6 @@ A:SP$ Discard | Cost$ 2 B B | Mode$ Hand | Defined$ Player | SubAbility$ DBExile SVar:DBExile:DB$ ChangeZone | Origin$ Stack | Destination$ Exile | SubAbility$ DBChangeZoneChoose SVar:DBChangeZoneChoose:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBChangeZone SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ChangeNum$ 3 | ChangeType$ Card | DefinedPlayer$ Remembered | Hidden$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ill_gotten_gains.jpg Oracle:Exile Ill-Gotten Gains. Each player discards their hand, then returns up to three cards from their graveyard to their hand. diff --git a/forge-gui/res/cardsfolder/i/illness_in_the_ranks.txt b/forge-gui/res/cardsfolder/i/illness_in_the_ranks.txt index 502dfb0d56b..be011476b87 100644 --- a/forge-gui/res/cardsfolder/i/illness_in_the_ranks.txt +++ b/forge-gui/res/cardsfolder/i/illness_in_the_ranks.txt @@ -3,6 +3,6 @@ ManaCost:B Types:Enchantment S:Mode$ Continuous | Affected$ Creature.token | AddPower$ -1 | AddToughness$ -1 | Description$ Creature tokens get -1/-1. SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/illness_in_the_ranks.jpg Oracle:Creature tokens get -1/-1. diff --git a/forge-gui/res/cardsfolder/i/illuminated_folio.txt b/forge-gui/res/cardsfolder/i/illuminated_folio.txt index 3435e544fb0..ba7711f0938 100644 --- a/forge-gui/res/cardsfolder/i/illuminated_folio.txt +++ b/forge-gui/res/cardsfolder/i/illuminated_folio.txt @@ -2,6 +2,6 @@ Name:Illuminated Folio ManaCost:5 Types:Artifact A:AB$ Draw | Cost$ 1 T Reveal<2/SameColor> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/illuminated_folio.jpg Oracle:{1}, {T}, Reveal two cards from your hand that share a color: Draw a card. diff --git a/forge-gui/res/cardsfolder/i/illuminated_wings.txt b/forge-gui/res/cardsfolder/i/illuminated_wings.txt index 6a48c5637be..861543c690b 100644 --- a/forge-gui/res/cardsfolder/i/illuminated_wings.txt +++ b/forge-gui/res/cardsfolder/i/illuminated_wings.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ 1 U | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Flying | Description$ Enchanted creature has flying. A:AB$ Draw | Cost$ 2 Sac<1/CARDNAME> | Defined$ You | NumCards$ 1 | SpellDescription$ Draw a card -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/illuminated_wings.jpg Oracle:Enchant creature\nEnchanted creature has flying.\n{2}, Sacrifice Illuminated Wings: Draw a card. diff --git a/forge-gui/res/cardsfolder/i/illusion_of_choice.txt b/forge-gui/res/cardsfolder/i/illusion_of_choice.txt index 19625c6df97..851503cf9a0 100644 --- a/forge-gui/res/cardsfolder/i/illusion_of_choice.txt +++ b/forge-gui/res/cardsfolder/i/illusion_of_choice.txt @@ -4,5 +4,5 @@ Types:Instant A:SP$ Effect | Cost$ U | Name$ Illusion of Choice Effect | StaticAbilities$ STVoter | SubAbility$ DBDraw | SpellDescription$ You choose how each player votes this turn. Draw a card. SVar:DBDraw:DB$ Draw | NumCards$ 1 SVar:STVoter:Mode$ Continuous | EffectZone$ Command | Affected$ You | AddKeyword$ You choose how each player votes this turn. | Description$ You choose how each player votes this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All Oracle:You choose how each player votes this turn. Draw a card. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/i/illusionists_gambit.txt b/forge-gui/res/cardsfolder/i/illusionists_gambit.txt index 17c73b4519b..8b2b52e8beb 100644 --- a/forge-gui/res/cardsfolder/i/illusionists_gambit.txt +++ b/forge-gui/res/cardsfolder/i/illusionists_gambit.txt @@ -9,6 +9,6 @@ SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | StaticAbilities$ STCant SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:STCantAttack:Mode$ CantAttack | EffectZone$ Command | ValidCard$ Creature.IsRemembered | Target$ You,Planeswalker.YouCtrl | Description$ Each of those creatures attacks that combat if able. SVar:STMustAttack:Mode$ Continuous | EffectZone$ Command | ValidCard$ Creature.IsRemembered | AddHiddenKeyword$ CARDNAME attacks each combat if able. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/illusionists_gambit.jpg Oracle:Cast Illusionist's Gambit only during the declare blockers step on an opponent's turn.\nRemove all attacking creatures from combat and untap them. After this phase, there is an additional combat phase. Each of those creatures attacks that combat if able. They can't attack you or a planeswalker you control that combat. diff --git a/forge-gui/res/cardsfolder/i/illusionists_stratagem.txt b/forge-gui/res/cardsfolder/i/illusionists_stratagem.txt index 1f77b01fcef..e0374b630c0 100644 --- a/forge-gui/res/cardsfolder/i/illusionists_stratagem.txt +++ b/forge-gui/res/cardsfolder/i/illusionists_stratagem.txt @@ -5,6 +5,6 @@ A:SP$ ChangeZone | Cost$ 3 U | ValidTgts$ Creature.YouCtrl | TargetMin$ 0 | Targ SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ All | Destination$ Battlefield | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/illusionists_stratagem.jpg Oracle:Exile up to two target creatures you control, then return those cards to the battlefield under their owner's control.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/i/illusions_of_grandeur.txt b/forge-gui/res/cardsfolder/i/illusions_of_grandeur.txt index 9696ce28978..8d6fd049d51 100644 --- a/forge-gui/res/cardsfolder/i/illusions_of_grandeur.txt +++ b/forge-gui/res/cardsfolder/i/illusions_of_grandeur.txt @@ -7,7 +7,7 @@ T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.S SVar:TrigGainLife:DB$ GainLife | Defined$ TriggeredCardController | LifeAmount$ 20 SVar:TrigLoseLife:DB$ LoseLife | Defined$ TriggeredCardController | LifeAmount$ 20 SVar:AICastPreference:MustHaveInHand$ Donate | MaxControlled$ 1 | NumManaSourcesNextTurn$ 5 | AlwaysCastIfLifeBelow$ 4 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:DeckNeeds:Name$Donate SVar:DonateMe:5 SVar:PlayMain1:TRUE diff --git a/forge-gui/res/cardsfolder/i/illusory_demon.txt b/forge-gui/res/cardsfolder/i/illusory_demon.txt index 21854be77d9..9f89e9ace19 100644 --- a/forge-gui/res/cardsfolder/i/illusory_demon.txt +++ b/forge-gui/res/cardsfolder/i/illusory_demon.txt @@ -5,6 +5,6 @@ PT:4/3 K:Flying T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ You | Execute$ TrigSac | TriggerZones$ Battlefield | TriggerDescription$ When you cast a spell, sacrifice CARDNAME. SVar:TrigSac:DB$Sacrifice | SacValid$ Self -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/illusory_demon.jpg Oracle:Flying\nWhen you cast a spell, sacrifice Illusory Demon. diff --git a/forge-gui/res/cardsfolder/i/imagecrafter.txt b/forge-gui/res/cardsfolder/i/imagecrafter.txt index 8e09b3fad80..2929542eaa8 100644 --- a/forge-gui/res/cardsfolder/i/imagecrafter.txt +++ b/forge-gui/res/cardsfolder/i/imagecrafter.txt @@ -4,6 +4,6 @@ Types:Creature Human Wizard PT:1/1 A:AB$ ChooseType | Cost$ T | Defined$ You | Type$ Creature | InvalidTypes$ Wall | SubAbility$ DBAnimate | SpellDescription$ Choose a creature type other than Wall. Target creature becomes that type until end of turn. SVar:DBAnimate:DB$ Animate | ValidTgts$ Creature | TgtPrompt$ Select target creature | Types$ ChosenType | RemoveCreatureTypes$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/imagecrafter.jpg Oracle:{T}: Choose a creature type other than Wall. Target creature becomes that type until end of turn. diff --git a/forge-gui/res/cardsfolder/i/imi_statue.txt b/forge-gui/res/cardsfolder/i/imi_statue.txt index 24b20533b36..90e4b96c4e1 100644 --- a/forge-gui/res/cardsfolder/i/imi_statue.txt +++ b/forge-gui/res/cardsfolder/i/imi_statue.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact S:Mode$ Continuous | Affected$ Player | AddKeyword$ UntapAdjust:Artifact:1 | Description$ Players can't untap more than one artifact during their untap steps. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/imi_statue.jpg Oracle:Players can't untap more than one artifact during their untap steps. diff --git a/forge-gui/res/cardsfolder/i/immortal_coil.txt b/forge-gui/res/cardsfolder/i/immortal_coil.txt index 91668b453a5..37d8c083b95 100644 --- a/forge-gui/res/cardsfolder/i/immortal_coil.txt +++ b/forge-gui/res/cardsfolder/i/immortal_coil.txt @@ -9,6 +9,6 @@ SVar:TrigLoseGame:DB$ LosesGame | Defined$ You SVar:X:ReplaceCount$DamageAmount SVar:Y:Count$ValidGraveyard Card.YouCtrl SVar:NeedsToPlayVar:Y GE1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/immortal_coil.jpg Oracle:{T}, Exile two cards from your graveyard: Draw a card.\nIf damage would be dealt to you, prevent that damage. Exile a card from your graveyard for each 1 damage prevented this way.\nWhen there are no cards in your graveyard, you lose the game. diff --git a/forge-gui/res/cardsfolder/i/impatience.txt b/forge-gui/res/cardsfolder/i/impatience.txt index 2486cef2d31..331500b008d 100644 --- a/forge-gui/res/cardsfolder/i/impatience.txt +++ b/forge-gui/res/cardsfolder/i/impatience.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ Phase | Phase$ End of Turn | CheckSVar$ TrigCast | SVarCompare$ EQ0 | Execute$ ImpatientDamage | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each player's end step, if that player didn't cast a spell this turn, CARDNAME deals 2 damage to them. SVar:ImpatientDamage:DB$ DealDamage | Defined$ TriggeredPlayer | NumDmg$ 2 SVar:TrigCast:Count$ThisTurnCast_Card.ActivePlayerCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/impatience.jpg Oracle:At the beginning of each player's end step, if that player didn't cast a spell this turn, Impatience deals 2 damage to them. diff --git a/forge-gui/res/cardsfolder/i/impelled_giant.txt b/forge-gui/res/cardsfolder/i/impelled_giant.txt index ae9423b9bca..9f1678dfee5 100644 --- a/forge-gui/res/cardsfolder/i/impelled_giant.txt +++ b/forge-gui/res/cardsfolder/i/impelled_giant.txt @@ -5,6 +5,6 @@ PT:3/3 K:Trample A:AB$ Pump | Cost$ tapXType<1/Creature.Red+Other/other red creature> | NumAtt$ +X | References$ X | SpellDescription$ CARDNAME gets +X/+0 until end of turn, where X is the power of the creature tapped this way. SVar:X:Tapped$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/impelled_giant.jpg Oracle:Trample\nTap an untapped red creature you control other than Impelled Giant: Impelled Giant gets +X/+0 until end of turn, where X is the power of the creature tapped this way. diff --git a/forge-gui/res/cardsfolder/i/impending_disaster.txt b/forge-gui/res/cardsfolder/i/impending_disaster.txt index 1b4710d61ca..37367980f48 100644 --- a/forge-gui/res/cardsfolder/i/impending_disaster.txt +++ b/forge-gui/res/cardsfolder/i/impending_disaster.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSac | IsPresent$ Land | PresentCompare$ GE7 | TriggerDescription$ At the beginning of your upkeep, if there are seven or more lands on the battlefield, sacrifice CARDNAME and destroy all lands. SVar:TrigSac:DB$Sacrifice | Defined$ Self | SubAbility$ DBDestroyAll SVar:DBDestroyAll:DB$DestroyAll | ValidCards$ Land | SpellDescription$ Destroy all lands. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/impending_disaster.jpg Oracle:At the beginning of your upkeep, if there are seven or more lands on the battlefield, sacrifice Impending Disaster and destroy all lands. diff --git a/forge-gui/res/cardsfolder/i/imperial_seal.txt b/forge-gui/res/cardsfolder/i/imperial_seal.txt index 6fc78b97e7c..2cbc86fbfa4 100644 --- a/forge-gui/res/cardsfolder/i/imperial_seal.txt +++ b/forge-gui/res/cardsfolder/i/imperial_seal.txt @@ -5,6 +5,6 @@ A:SP$ ChangeZone | Cost$ B | Origin$ Library | Destination$ Library | LibraryPos SVar:DBLoseLife:DB$LoseLife | LifeAmount$ 2 #TODO: The AI will currently search for the most expensive valid card in the library. This can be used to the AI's advantage with #careful deck design (which is why this card only works in properly designed AI decks). Consider improving tutoring logic with priorities. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/imperial_seal.jpg Oracle:Search your library for a card, then shuffle your library and put that card on top of it. You lose 2 life. diff --git a/forge-gui/res/cardsfolder/i/implement_of_combustion.txt b/forge-gui/res/cardsfolder/i/implement_of_combustion.txt index a38c44a55ba..68468fcf8ad 100644 --- a/forge-gui/res/cardsfolder/i/implement_of_combustion.txt +++ b/forge-gui/res/cardsfolder/i/implement_of_combustion.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ DealDamage | Cost$ R Sac<1/CARDNAME> | NumDmg$ 1 | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | SpellDescription$ CARDNAME deals 1 damage to target player or planeswalker. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, draw a card. SVar:TrigDraw:DB$Draw | NumCards$ 1 | Defined$ TriggeredCardController -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Red SVar:Picture:http://www.wizards.com/global/images/magic/general/implement_of_combustion.jpg Oracle:{R}, Sacrifice Implement of Combustion: It deals 1 damage to target player or planeswalker.\nWhen Implement of Combustion is put into a graveyard from the battlefield, draw a card. diff --git a/forge-gui/res/cardsfolder/i/implement_of_examination.txt b/forge-gui/res/cardsfolder/i/implement_of_examination.txt index 4e31b40aa5f..a0028d2855a 100644 --- a/forge-gui/res/cardsfolder/i/implement_of_examination.txt +++ b/forge-gui/res/cardsfolder/i/implement_of_examination.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ Draw | Cost$ U Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, draw a card. SVar:TrigDraw:DB$Draw | NumCards$ 1 | Defined$ TriggeredCardController -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Blue SVar:Picture:http://www.wizards.com/global/images/magic/general/implement_of_examination.jpg Oracle:{U}, Sacrifice Implement of Examination: Draw a card.\nWhen Implement of Examination is put into a graveyard from the battlefield, draw a card. diff --git a/forge-gui/res/cardsfolder/i/implement_of_ferocity.txt b/forge-gui/res/cardsfolder/i/implement_of_ferocity.txt index 78c61b0d8d2..a8331dc9519 100644 --- a/forge-gui/res/cardsfolder/i/implement_of_ferocity.txt +++ b/forge-gui/res/cardsfolder/i/implement_of_ferocity.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ PutCounter | Cost$ G Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | SorcerySpeed$ True | SpellDescription$ Put a +1/+1 counter on target creature. Activate this ability only any time you could cast a sorcery. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, draw a card. SVar:TrigDraw:DB$Draw | NumCards$ 1 | Defined$ TriggeredCardController -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Green SVar:Picture:http://www.wizards.com/global/images/magic/general/implement_of_ferocity.jpg Oracle:{G}, Sacrifice Implement of Ferocity: Put a +1/+1 counter on target creature. Activate this ability only any time you could cast a sorcery.\nWhen Implement of Ferocity is put into a graveyard from the battlefield, draw a card. diff --git a/forge-gui/res/cardsfolder/i/implement_of_improvement.txt b/forge-gui/res/cardsfolder/i/implement_of_improvement.txt index 37fcc5a02b4..a33a5118b81 100644 --- a/forge-gui/res/cardsfolder/i/implement_of_improvement.txt +++ b/forge-gui/res/cardsfolder/i/implement_of_improvement.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ GainLife | Cost$ W Sac<1/CARDNAME> | Defined$ You | LifeAmount$ 2 | SpellDescription$ You gain 2 life. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, draw a card. SVar:TrigDraw:DB$Draw | NumCards$ 1 | Defined$ TriggeredCardController -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$White SVar:Picture:http://www.wizards.com/global/images/magic/general/implement_of_improvement.jpg Oracle:{W}, Sacrifice Implement of Improvement: You gain 2 life.\nWhen Implement of Improvement is put into a graveyard from the battlefield, draw a card. diff --git a/forge-gui/res/cardsfolder/i/implement_of_malice.txt b/forge-gui/res/cardsfolder/i/implement_of_malice.txt index 11d5c5b2c3e..9a70e12b8a9 100644 --- a/forge-gui/res/cardsfolder/i/implement_of_malice.txt +++ b/forge-gui/res/cardsfolder/i/implement_of_malice.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ Discard | Cost$ B Sac<1/CARDNAME> | ValidTgts$ Player | TgtPrompt$ Select target player | SorcerySpeed$ True | NumCards$ 1 | Mode$ TgtChoose | SpellDescription$ Target player discards a card. Activate this ability only any time you could cast a sorcery. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, draw a card. SVar:TrigDraw:DB$Draw | NumCards$ 1 | Defined$ TriggeredCardController -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black SVar:Picture:http://www.wizards.com/global/images/magic/general/implement_of_malice.jpg Oracle:{B}, Sacrifice Implement of Malice: Target player discards a card. Activate this ability only any time you could cast a sorcery.\nWhen Implement of Malice is put into a graveyard from the battlefield, draw a card. diff --git a/forge-gui/res/cardsfolder/i/implements_of_sacrifice.txt b/forge-gui/res/cardsfolder/i/implements_of_sacrifice.txt index 18d0525db8c..4ff05af4c55 100644 --- a/forge-gui/res/cardsfolder/i/implements_of_sacrifice.txt +++ b/forge-gui/res/cardsfolder/i/implements_of_sacrifice.txt @@ -2,6 +2,6 @@ Name:Implements of Sacrifice ManaCost:2 Types:Artifact A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ Any | Amount$ 2 | SpellDescription$ Add two mana of any one color. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/implements_of_sacrifice.jpg Oracle:{1}, {T}, Sacrifice Implements of Sacrifice: Add two mana of any one color. diff --git a/forge-gui/res/cardsfolder/i/imprison.txt b/forge-gui/res/cardsfolder/i/imprison.txt index 9ee9662dc8d..2412b4148e6 100644 --- a/forge-gui/res/cardsfolder/i/imprison.txt +++ b/forge-gui/res/cardsfolder/i/imprison.txt @@ -14,6 +14,6 @@ SVar:DBTapAttacker:DB$ Tap | Defined$ TriggeredAttacker | SubAbility$ DBRemoveAt SVar:DBTapBlocker:DB$ Tap | Defined$ TriggeredBlocker | SubAbility$ DBRemoveBlocker SVar:DBRemoveAttacker:DB$ RemoveFromCombat | Defined$ TriggeredAttacker SVar:DBRemoveBlocker:DB$ RemoveFromCombat | Defined$ TriggeredBlocker | UnblockCreaturesBlockedOnlyBy$ TriggeredBlocker -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/imprison.jpg Oracle:Enchant creature\nWhenever a player activates an ability of enchanted creature with {T} in its activation cost that isn't a mana ability, you may pay {1}. If you do, counter that ability. If you don't, destroy Imprison.\nWhenever enchanted creature attacks or blocks, you may pay {1}. If you do, tap the creature, remove it from combat, and creatures it was blocking that had become blocked by only that creature this combat become unblocked. If you don't, destroy Imprison. diff --git a/forge-gui/res/cardsfolder/i/impromptu_raid.txt b/forge-gui/res/cardsfolder/i/impromptu_raid.txt index c6e100f9929..d57f63f087e 100644 --- a/forge-gui/res/cardsfolder/i/impromptu_raid.txt +++ b/forge-gui/res/cardsfolder/i/impromptu_raid.txt @@ -4,7 +4,7 @@ Types:Enchantment A:AB$ Dig | Cost$ 2 RG | DigNum$ 1 | Reveal$ True | ChangeNum$ All | ChangeValid$ Creature | DestinationZone$ Battlefield | DestinationZone2$ Graveyard | RememberChanged$ True | SubAbility$ DBPump | SpellDescription$ Reveal the top card of your library. If it isn't a creature card, put it into your graveyard. Otherwise, put that card onto the battlefield. That creature gains haste. Sacrifice it at the beginning of the next end step. SVar:DBPump:DB$ Animate | Keywords$ Haste | sVars$ SneakAttackEOT | Defined$ Remembered | Permanent$ True | AtEOT$ Sacrifice | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True SVar:Picture:http://www.wizards.com/global/images/magic/general/impromptu_raid.jpg Oracle:{2}{R/G}: Reveal the top card of your library. If it isn't a creature card, put it into your graveyard. Otherwise, put that card onto the battlefield. That creature gains haste. Sacrifice it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/i/imps_mischief.txt b/forge-gui/res/cardsfolder/i/imps_mischief.txt index ef1766daaaf..645b07da1ae 100644 --- a/forge-gui/res/cardsfolder/i/imps_mischief.txt +++ b/forge-gui/res/cardsfolder/i/imps_mischief.txt @@ -5,6 +5,6 @@ A:SP$ ChangeTargets | Cost$ 1 B | TargetType$ Spell | ValidTgts$ Card | TargetsS SVar:DBLoseLife:DB$ LoseLife | Defined$ You | LifeAmount$ X | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/imps_mischief.jpg Oracle:Change the target of target spell with a single target. You lose life equal to that spell's converted mana cost. diff --git a/forge-gui/res/cardsfolder/i/imps_taunt.txt b/forge-gui/res/cardsfolder/i/imps_taunt.txt index 7dff589c9e3..589e1c6342b 100644 --- a/forge-gui/res/cardsfolder/i/imps_taunt.txt +++ b/forge-gui/res/cardsfolder/i/imps_taunt.txt @@ -3,6 +3,6 @@ ManaCost:1 B Types:Instant K:Buyback:3 A:SP$ Pump | Cost$ 1 B | ValidTgts$ Creature | KW$ HIDDEN CARDNAME attacks each combat if able. | TgtPrompt$ Select target creature | SpellDescription$ Target creature attacks this turn if able. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/imps_taunt.jpg Oracle:Buyback {3} (You may pay an additional {3} as you cast this spell. If you do, put this card into your hand as it resolves.)\nTarget creature attacks this turn if able. diff --git a/forge-gui/res/cardsfolder/i/impulsive_maneuvers.txt b/forge-gui/res/cardsfolder/i/impulsive_maneuvers.txt index 9bdca3498e5..85e0abfc060 100644 --- a/forge-gui/res/cardsfolder/i/impulsive_maneuvers.txt +++ b/forge-gui/res/cardsfolder/i/impulsive_maneuvers.txt @@ -12,6 +12,6 @@ SVar:WinX:ReplaceCount$DamageAmount/Twice SVar:CreateLossEffect:DB$ Effect | Name$ Impulsive Maneuvers Loss Effect | ReplacementEffects$ EventLossDamageDone | SVars$ ExileEffect | References$ EventLossDamageDone,ExileEffect | ImprintCards$ TriggeredAttacker SVar:EventLossDamageDone:Event$ DamageDone | ValidSource$ Card.IsImprinted | ReplaceWith$ ExileEffect | PreventionEffect$ True | IsCombat$ True | Description$ The next time creature would deal combat damage this turn, prevent that damage. SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/impulsive_maneuvers.jpg Oracle:Whenever a creature attacks, flip a coin. If you win the flip, the next time that creature would deal combat damage this turn, it deals double that damage instead. If you lose the flip, the next time that creature would deal combat damage this turn, prevent that damage. diff --git a/forge-gui/res/cardsfolder/i/in_the_eye_of_chaos.txt b/forge-gui/res/cardsfolder/i/in_the_eye_of_chaos.txt index ea76282e2a9..d3abfa45903 100644 --- a/forge-gui/res/cardsfolder/i/in_the_eye_of_chaos.txt +++ b/forge-gui/res/cardsfolder/i/in_the_eye_of_chaos.txt @@ -4,6 +4,6 @@ Types:World Enchantment T:Mode$ SpellCast | ValidCard$ Instant | Execute$ TrigCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player casts an instant spell, counter it unless that player pays {X}, where X is its converted mana cost. SVar:TrigCounter:DB$Counter | Defined$ TriggeredSpellAbility | UnlessCost$ X | UnlessPayer$ TriggeredActivator | References$ X SVar:X:TriggeredCard$CardManaCost -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/in_the_eye_of_chaos.jpg Oracle:Whenever a player casts an instant spell, counter it unless that player pays {X}, where X is its converted mana cost. diff --git a/forge-gui/res/cardsfolder/i/iname_death_aspect.txt b/forge-gui/res/cardsfolder/i/iname_death_aspect.txt index 1590029e0e0..2dbf6e64096 100644 --- a/forge-gui/res/cardsfolder/i/iname_death_aspect.txt +++ b/forge-gui/res/cardsfolder/i/iname_death_aspect.txt @@ -5,6 +5,6 @@ PT:4/4 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for any number of Spirit cards and put them into your graveyard. If you do, shuffle your library. SVar:TrigChangeZone:DB$ ChangeZone | ChangeType$ Spirit.YouCtrl | Origin$ Library | Destination$ Graveyard | ChangeNum$ X | Shuffle$ True | References$ X | ShuffleNonMandatory$ True SVar:X:Count$TypeInYourLibrary.Spirit -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/iname_death_aspect.jpg Oracle:When Iname, Death Aspect enters the battlefield, you may search your library for any number of Spirit cards and put them into your graveyard. If you do, shuffle your library. diff --git a/forge-gui/res/cardsfolder/i/iname_life_aspect.txt b/forge-gui/res/cardsfolder/i/iname_life_aspect.txt index 1beee129697..52b5aaef44e 100644 --- a/forge-gui/res/cardsfolder/i/iname_life_aspect.txt +++ b/forge-gui/res/cardsfolder/i/iname_life_aspect.txt @@ -7,7 +7,7 @@ SVar:TrigExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | Defined SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Spirit | TargetsWithDefinedController$ TriggeredCardController | TargetMin$ 0 | TargetMax$ X | References$ X | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:TriggeredCardController$ValidGraveyard Spirit.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Spirit SVar:Picture:http://www.wizards.com/global/images/magic/general/iname_life_aspect.jpg Oracle:When Iname, Life Aspect dies, you may exile it. If you do, return any number of target Spirit cards from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/i/incandescent_soulstoke.txt b/forge-gui/res/cardsfolder/i/incandescent_soulstoke.txt index d5e51cac21c..e2148a07530 100644 --- a/forge-gui/res/cardsfolder/i/incandescent_soulstoke.txt +++ b/forge-gui/res/cardsfolder/i/incandescent_soulstoke.txt @@ -6,7 +6,7 @@ S:Mode$ Continuous | Affected$ Creature.Elemental+Other+YouCtrl | AddPower$ 1 | A:AB$ ChangeZone | Cost$ 1 R T | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature.Elemental+YouCtrl | SubAbility$ DBPump | RememberChanged$ True | ForgetOtherRemembered$ True | SpellDescription$ You may put an Elemental creature card from your hand onto the battlefield. That creature gains haste until end of turn. Sacrifice it at the beginning of the next end step. SVar:DBPump:DB$ Animate | Keywords$ Haste | sVars$ SneakAttackEOT | Defined$ Remembered | AtEOT$ Sacrifice | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:PlayMain1:TRUE SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True SVar:Picture:http://www.wizards.com/global/images/magic/general/incandescent_soulstoke.jpg diff --git a/forge-gui/res/cardsfolder/i/incite.txt b/forge-gui/res/cardsfolder/i/incite.txt index 7891e3425f5..1c4ce1c6804 100644 --- a/forge-gui/res/cardsfolder/i/incite.txt +++ b/forge-gui/res/cardsfolder/i/incite.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Instant A:SP$ Animate | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | Colors$ Red | OverwriteColors$ True | SubAbility$ DBPump | SpellDescription$ Target creature becomes red until end of turn and attacks this turn if able. SVar:DBPump:DB$ Pump | KW$ HIDDEN CARDNAME attacks each combat if able. | Defined$ Targeted -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/incite.jpg Oracle:Target creature becomes red until end of turn and attacks this turn if able. diff --git a/forge-gui/res/cardsfolder/i/incite_hysteria.txt b/forge-gui/res/cardsfolder/i/incite_hysteria.txt index 9bcdb79e124..2e626d59d4e 100644 --- a/forge-gui/res/cardsfolder/i/incite_hysteria.txt +++ b/forge-gui/res/cardsfolder/i/incite_hysteria.txt @@ -2,6 +2,6 @@ Name:Incite Hysteria ManaCost:2 R Types:Sorcery A:SP$Pump | Cost$ 2 R | ValidTgts$ Creature | Radiance$ True | KW$ CARDNAME can't block. | SpellDescription$ Radiance — Until end of turn, target creature and each other creature that shares a color with it gain "This creature can't block." -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/incite_hysteria.jpg Oracle:Radiance — Until end of turn, target creature and each other creature that shares a color with it gain "This creature can't block." diff --git a/forge-gui/res/cardsfolder/i/incite_rebellion.txt b/forge-gui/res/cardsfolder/i/incite_rebellion.txt index 60c2cec655a..18fed9e519e 100644 --- a/forge-gui/res/cardsfolder/i/incite_rebellion.txt +++ b/forge-gui/res/cardsfolder/i/incite_rebellion.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ RepeatEach | Cost$ 4 R R | RepeatPlayers$ Player | RepeatSubAbility$ DmgEach | DamageMap$ True | SpellDescription$ For each player, CARDNAME deals damage to that player and each creature that player controls equal to the number of creatures they control. SVar:DmgEach:DB$ DamageAll | ValidPlayers$ Remembered | ValidCards$ Creature.RememberedPlayerCtrl | NumDmg$ X | References$ X SVar:X:Count$Valid Creature.RememberedPlayerCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/incite_rebellion.jpg Oracle:For each player, Incite Rebellion deals damage to that player and each creature that player controls equal to the number of creatures they control. diff --git a/forge-gui/res/cardsfolder/i/incite_war.txt b/forge-gui/res/cardsfolder/i/incite_war.txt index 4e98b6bea47..48c54383cbe 100644 --- a/forge-gui/res/cardsfolder/i/incite_war.txt +++ b/forge-gui/res/cardsfolder/i/incite_war.txt @@ -6,6 +6,6 @@ A:SP$ Charm | Cost$ 2 R | Choices$ DBEffect,DBPumpAll | CharmNum$ 1 SVar:DBEffect:DB$ Effect | Name$ Incite War Effect | ValidTgts$ Player | TgtPrompt$ Select target player | StaticAbilities$ MustAttack | References$ MustAttack | RememberObjects$ Targeted | SpellDescription$ Creatures target player controls attack this turn if able. SVar:MustAttack:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.RememberedPlayerCtrl | AddHiddenKeyword$ CARDNAME attacks each combat if able. | Description$ Creatures target player controls attack this turn if able. SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ First Strike | SpellDescription$ Creatures you control gain first strike until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/incite_war.jpg Oracle:Choose one —\n• Creatures target player controls attack this turn if able.\n• Creatures you control gain first strike until end of turn.\nEntwine {2} (Choose both if you pay the entwine cost.) diff --git a/forge-gui/res/cardsfolder/i/increasing_vengeance.txt b/forge-gui/res/cardsfolder/i/increasing_vengeance.txt index 6964cc30425..ccbe03d5390 100644 --- a/forge-gui/res/cardsfolder/i/increasing_vengeance.txt +++ b/forge-gui/res/cardsfolder/i/increasing_vengeance.txt @@ -5,6 +5,6 @@ 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. SVar:DBCopy2:DB$ CopySpellAbility | Defined$ Targeted | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | References$ X SVar:X:Count$wasCastFromGraveyard.1.0 -SVar:RemAIDeck:True +AI:RemoveDeck:All 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.) diff --git a/forge-gui/res/cardsfolder/i/indestructible_aura.txt b/forge-gui/res/cardsfolder/i/indestructible_aura.txt index 2e1392ea45a..d5d7ff10a0c 100644 --- a/forge-gui/res/cardsfolder/i/indestructible_aura.txt +++ b/forge-gui/res/cardsfolder/i/indestructible_aura.txt @@ -2,6 +2,6 @@ Name:Indestructible Aura ManaCost:W Types:Instant A:SP$ Pump | Cost$ W | KW$ Prevent all damage that would be dealt to CARDNAME. | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Prevent all damage that would be dealt to target creature this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/indestructible_aura.jpg Oracle:Prevent all damage that would be dealt to target creature this turn. diff --git a/forge-gui/res/cardsfolder/i/index.txt b/forge-gui/res/cardsfolder/i/index.txt index 36449c1a827..395f8de160c 100644 --- a/forge-gui/res/cardsfolder/i/index.txt +++ b/forge-gui/res/cardsfolder/i/index.txt @@ -2,6 +2,6 @@ Name:Index ManaCost:U Types:Sorcery A:SP$ RearrangeTopOfLibrary | Cost$ U | Defined$ You | NumCards$ 5 | SpellDescription$ Look at the top five cards of your library, then put them back in any order. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/index.jpg Oracle:Look at the top five cards of your library, then put them back in any order. diff --git a/forge-gui/res/cardsfolder/i/induce_despair.txt b/forge-gui/res/cardsfolder/i/induce_despair.txt index af1b3aacdda..399ab2de5ac 100644 --- a/forge-gui/res/cardsfolder/i/induce_despair.txt +++ b/forge-gui/res/cardsfolder/i/induce_despair.txt @@ -3,6 +3,6 @@ ManaCost:2 B Types:Instant A:SP$ Pump | Cost$ 2 B Reveal<1/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -X | NumDef$ -X | IsCurse$ True | References$ X | SpellDescription$ Target creature gets -X/-X until end of turn, where X is the revealed card's converted mana cost. SVar:X:Revealed$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/induce_despair.jpg Oracle:As an additional cost to cast Induce Despair, reveal a creature card from your hand.\nTarget creature gets -X/-X until end of turn, where X is the revealed card's converted mana cost. diff --git a/forge-gui/res/cardsfolder/i/induce_paranoia.txt b/forge-gui/res/cardsfolder/i/induce_paranoia.txt index 09ba4a19880..6756f6d941b 100644 --- a/forge-gui/res/cardsfolder/i/induce_paranoia.txt +++ b/forge-gui/res/cardsfolder/i/induce_paranoia.txt @@ -6,7 +6,7 @@ SVar:DBMill:DB$ Mill | NumCards$ X | Defined$ TargetedController | ConditionMana SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$RememberedNumber SVar:ManaNeededToAvoidNegativeEffect:black -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black SVar:Picture:http://www.wizards.com/global/images/magic/general/induce_paranoia.jpg Oracle:Counter target spell. If {B} was spent to cast Induce Paranoia, that spell's controller puts the top X cards of their library into their graveyard, where X is the spell's converted mana cost. diff --git a/forge-gui/res/cardsfolder/i/indulgent_aristocrat.txt b/forge-gui/res/cardsfolder/i/indulgent_aristocrat.txt index 327968fa341..9281720e0a4 100644 --- a/forge-gui/res/cardsfolder/i/indulgent_aristocrat.txt +++ b/forge-gui/res/cardsfolder/i/indulgent_aristocrat.txt @@ -7,6 +7,6 @@ A:AB$ PutCounterAll | Cost$ 2 Sac<1/Creature> | ValidCards$ Vampire.YouCtrl | Co SVar:AIPreference:SacCost$Creature.token+nonVampire,Creature.nonVampire+cmcEQ1,Creature.nonVampire+cmcEQ2+powerLE1 DeckHints:Type$Vampire # TODO: improve the logic when the AI wants to sac creatures -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/indulgent_aristocrat.jpg Oracle:Lifelink\n{2}, Sacrifice a creature: Put a +1/+1 counter on each Vampire you control. diff --git a/forge-gui/res/cardsfolder/i/infernal_caretaker.txt b/forge-gui/res/cardsfolder/i/infernal_caretaker.txt index cb262ee3859..2abd48f7c08 100644 --- a/forge-gui/res/cardsfolder/i/infernal_caretaker.txt +++ b/forge-gui/res/cardsfolder/i/infernal_caretaker.txt @@ -5,6 +5,6 @@ PT:2/2 K:Morph:3 B T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigChange | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME is turned face up, return all Zombie cards from all graveyards to their owners' hands. SVar:TrigChange:DB$ChangeZoneAll | ChangeType$ Zombie | Origin$ Graveyard | Destination$ Hand -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/infernal_caretaker.jpg Oracle:Morph {3}{B} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.)\nWhen Infernal Caretaker is turned face up, return all Zombie cards from all graveyards to their owners' hands. diff --git a/forge-gui/res/cardsfolder/i/infernal_darkness.txt b/forge-gui/res/cardsfolder/i/infernal_darkness.txt index 1c8798ec7b9..59c9333f082 100644 --- a/forge-gui/res/cardsfolder/i/infernal_darkness.txt +++ b/forge-gui/res/cardsfolder/i/infernal_darkness.txt @@ -4,7 +4,7 @@ Types:Enchantment K:Cumulative upkeep:B PayLife<1>:Pay {B} and 1 life. R:Event$ ProduceMana | ActiveZones$ Battlefield | ValidCard$ Land | ManaReplacement$ ProduceB | Description$ If a land is tapped for mana, it produces {B} instead of any other type. SVar:ProduceB:C->B & U->B & R->B & G->B & W->B -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/infernal_darkness.jpg Oracle:Cumulative upkeep—Pay {B} and 1 life. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nIf a land is tapped for mana, it produces {B} instead of any other type. diff --git a/forge-gui/res/cardsfolder/i/infernal_genesis.txt b/forge-gui/res/cardsfolder/i/infernal_genesis.txt index d2d825eef0e..888be3b96ea 100644 --- a/forge-gui/res/cardsfolder/i/infernal_genesis.txt +++ b/forge-gui/res/cardsfolder/i/infernal_genesis.txt @@ -6,6 +6,6 @@ SVar:TrigMill:DB$ Mill | Defined$ TriggeredPlayer | NumCards$ 1 | RememberMilled SVar:TrigToken:DB$ Token | TokenAmount$ X | TokenName$ Minion | TokenTypes$ Creature,Minion | TokenOwner$ TriggeredPlayer | TokenColors$ Black | TokenPower$ 1 | TokenToughness$ 1 | SubAbility$ DBCleanup | References$ X SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True SVar:X:Remembered$CardManaCost -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/infernal_genesis.jpg Oracle:At the beginning of each player's upkeep, that player puts the top card of their library into their graveyard. Then they create X 1/1 black Minion creature tokens, where X is that card's converted mana cost. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/i/infernal_harvest.txt b/forge-gui/res/cardsfolder/i/infernal_harvest.txt index b87282cf202..5341fa462d2 100644 --- a/forge-gui/res/cardsfolder/i/infernal_harvest.txt +++ b/forge-gui/res/cardsfolder/i/infernal_harvest.txt @@ -5,6 +5,6 @@ A:SP$ DealDamage | Announce$ X | Cost$ 1 B Return | ValidTgts$ Creature SVar:MaxTgts:Count$Valid Creature SVar:X:Count$XChoice #X Will get overwritten by Announce -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/infernal_harvest.jpg Oracle:As an additional cost to cast Infernal Harvest, return X Swamps you control to their owner's hand.\nInfernal Harvest deals X damage divided as you choose among any number of target creatures. diff --git a/forge-gui/res/cardsfolder/i/infernal_offering.txt b/forge-gui/res/cardsfolder/i/infernal_offering.txt index e2f63c9f5ba..10e582e4be9 100644 --- a/forge-gui/res/cardsfolder/i/infernal_offering.txt +++ b/forge-gui/res/cardsfolder/i/infernal_offering.txt @@ -10,7 +10,7 @@ SVar:DBChoose:DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | SubAb SVar:DBReturnYou:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature.YouCtrl | ChangeNum$ 1 | Hidden$ True | SubAbility$ DBReturnOpp SVar:DBReturnOpp:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature.ChosenCtrl | DefinedPlayer$ ChosenPlayer | Chooser$ ChosenPlayer | ChangeNum$ 1 | Hidden$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/infernal_offering.jpg Oracle:Choose an opponent. You and that player each sacrifice a creature. Each player who sacrificed a creature this way draws two cards.\nChoose an opponent. Return a creature card from your graveyard to the battlefield, then that player returns a creature card from their graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/i/infernal_plunge.txt b/forge-gui/res/cardsfolder/i/infernal_plunge.txt index b24c4179c07..f8ba551d45e 100644 --- a/forge-gui/res/cardsfolder/i/infernal_plunge.txt +++ b/forge-gui/res/cardsfolder/i/infernal_plunge.txt @@ -2,6 +2,6 @@ Name:Infernal Plunge ManaCost:R Types:Sorcery A:SP$ Mana | Cost$ R Sac<1/Creature> | Produced$ R | Amount$ 3 | SpellDescription$ Add {R}{R}{R}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/infernal_plunge.jpg Oracle:As an additional cost to cast Infernal Plunge, sacrifice a creature.\nAdd {R}{R}{R}. diff --git a/forge-gui/res/cardsfolder/i/infernal_tribute.txt b/forge-gui/res/cardsfolder/i/infernal_tribute.txt index 661300d8cf2..8d8471da38c 100644 --- a/forge-gui/res/cardsfolder/i/infernal_tribute.txt +++ b/forge-gui/res/cardsfolder/i/infernal_tribute.txt @@ -2,7 +2,7 @@ Name:Infernal Tribute ManaCost:B B B Types:Enchantment A:AB$ Draw | Cost$ 2 Sac<1/Permanent.nonToken/nontoken permanent> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/infernal_tribute.jpg Oracle:{2}, Sacrifice a nontoken permanent: Draw a card. diff --git a/forge-gui/res/cardsfolder/i/infernal_tutor.txt b/forge-gui/res/cardsfolder/i/infernal_tutor.txt index fd424c1be3e..bb0354dc38e 100644 --- a/forge-gui/res/cardsfolder/i/infernal_tutor.txt +++ b/forge-gui/res/cardsfolder/i/infernal_tutor.txt @@ -6,6 +6,6 @@ SVar:DBChangeZone:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeT SVar:DBChangeZone2:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 1 | Mandatory$ True | ConditionCheckSVar$ X | ConditionSVarCompare$ LT1 | SubAbility$ DBCleanup | References$ X SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$InYourHand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/infernal_tutor.jpg Oracle:Reveal a card from your hand. Search your library for a card with the same name as that card, reveal it, put it into your hand, then shuffle your library.\nHellbent — If you have no cards in hand, instead search your library for a card, put it into your hand, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/i/inferno_trap.txt b/forge-gui/res/cardsfolder/i/inferno_trap.txt index 6f8ab12d176..a3e7db4e746 100644 --- a/forge-gui/res/cardsfolder/i/inferno_trap.txt +++ b/forge-gui/res/cardsfolder/i/inferno_trap.txt @@ -4,6 +4,6 @@ Types:Instant Trap A:SP$ DealDamage | Cost$ 3 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target creature. A:SP$ DealDamage | Cost$ R | CheckSVar$ CreaturesAttacked | SVarCompare$ GE2 | ValidTgts$ Creature | References$ CreaturesAttacked | TgtPrompt$ Select target creature | NumDmg$ 4 | SpellDescription$ If you've been dealt damage by two or more creatures this turn, you may pay {R} rather than pay CARDNAME's mana cost. SVar:CreaturesAttacked:Count$YourDamageSourcesThisTurn Creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/inferno_trap.jpg Oracle:If you've been dealt damage by two or more creatures this turn, you may pay {R} rather than pay Inferno Trap's mana cost.\nInferno Trap deals 4 damage to target creature. diff --git a/forge-gui/res/cardsfolder/i/infinite_hourglass.txt b/forge-gui/res/cardsfolder/i/infinite_hourglass.txt index c76a534d06f..35f12c0b512 100644 --- a/forge-gui/res/cardsfolder/i/infinite_hourglass.txt +++ b/forge-gui/res/cardsfolder/i/infinite_hourglass.txt @@ -6,6 +6,6 @@ SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ TIME | Counter S:Mode$ Continuous | Affected$ Creature | AddPower$ X | Description$ All creatures get +1/+0 for each time counter on CARDNAME. SVar:X:Count$CardCounters.TIME A:AB$ RemoveCounter | Cost$ 3 | CounterType$ TIME | CounterNum$ 1 | ActivationPhases$ Upkeep | AnyPlayer$ True | SpellDescription$ Remove a time counter from CARDNAME. Any player may activate this ability but only during any upkeep step. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/infinite_hourglass.jpg Oracle:At the beginning of your upkeep, put a time counter on Infinite Hourglass.\nAll creatures get +1/+0 for each time counter on Infinite Hourglass.\n{3}: Remove a time counter from Infinite Hourglass. Any player may activate this ability but only during any upkeep step. diff --git a/forge-gui/res/cardsfolder/i/infinite_obliteration.txt b/forge-gui/res/cardsfolder/i/infinite_obliteration.txt index c565a72eca8..216f68ff3ab 100644 --- a/forge-gui/res/cardsfolder/i/infinite_obliteration.txt +++ b/forge-gui/res/cardsfolder/i/infinite_obliteration.txt @@ -8,6 +8,6 @@ SVar:ExileLib:DB$ ChangeZone | Origin$ Library | Destination$ Exile | DefinedPla SVar:NumInLib:TargetedPlayer$CardsInLibrary SVar:NumInHand:TargetedPlayer$CardsInHand SVar:NumInYard:TargetedPlayer$CardsInGraveyard -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/infinite_obliteration.jpg Oracle:Choose a creature card name. Search target opponent's graveyard, hand, and library for any number of cards with that name and exile them. Then that player shuffles their library. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/i/infuse_with_the_elements.txt b/forge-gui/res/cardsfolder/i/infuse_with_the_elements.txt index b2f317d5787..9864580b295 100644 --- a/forge-gui/res/cardsfolder/i/infuse_with_the_elements.txt +++ b/forge-gui/res/cardsfolder/i/infuse_with_the_elements.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ PutCounter | Cost$ 3 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ X | References$ X | SubAbility$ DBPump | SpellDescription$ Converge — Put X +1/+1 counters on target creature, where X is the number of colors of mana spent to cast CARDNAME. That creature gains trample until end of turn. SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ Trample SVar:X:Count$Converge -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/infuse_with_the_elements.jpg Oracle:Converge — Put X +1/+1 counters on target creature, where X is the number of colors of mana spent to cast Infuse with the Elements. That creature gains trample until end of turn. diff --git a/forge-gui/res/cardsfolder/i/infused_arrows.txt b/forge-gui/res/cardsfolder/i/infused_arrows.txt index 4e02a1c6e83..02a4d277f6a 100644 --- a/forge-gui/res/cardsfolder/i/infused_arrows.txt +++ b/forge-gui/res/cardsfolder/i/infused_arrows.txt @@ -5,7 +5,7 @@ K:Sunburst #ChosenX SVar created by Cost payment A:AB$ Pump | Cost$ T SubCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -ChosenX | NumDef$ -ChosenX | References$ X | SpellDescription$ Target creature gets -X/-X until end of turn. SVar:X:XChoice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NeedsToPlayVar:Z GE1 SVar:Z:Count$UniqueManaColorsProduced.ByUntappedSources DeckHints:Ability$Proliferate diff --git a/forge-gui/res/cardsfolder/i/initiates_of_the_ebon_hand.txt b/forge-gui/res/cardsfolder/i/initiates_of_the_ebon_hand.txt index cf84ffa7bcd..eabc89d5e29 100644 --- a/forge-gui/res/cardsfolder/i/initiates_of_the_ebon_hand.txt +++ b/forge-gui/res/cardsfolder/i/initiates_of_the_ebon_hand.txt @@ -4,6 +4,6 @@ Types:Creature Cleric PT:1/1 A:AB$ Mana | Cost$ 1 | Produced$ B | ActivationNumberSacrifice$ GE4 | ActivationResolveSub$ DBPump | SpellDescription$ Add {B}. If this ability has been activated four or more times this turn, sacrifice CARDNAME at the beginning of the next end step. SVar:DBPump:DB$ Pump | AtEOT$ Sacrifice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/initiates_of_the_ebon_hand.jpg Oracle:{1}: Add {B}. If this ability has been activated four or more times this turn, sacrifice Initiates of the Ebon Hand at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/i/inkfathom_witch.txt b/forge-gui/res/cardsfolder/i/inkfathom_witch.txt index bbe47616560..2bf637033cb 100644 --- a/forge-gui/res/cardsfolder/i/inkfathom_witch.txt +++ b/forge-gui/res/cardsfolder/i/inkfathom_witch.txt @@ -4,6 +4,6 @@ Types:Creature Merfolk Wizard PT:1/1 K:Fear A:AB$ AnimateAll | Cost$ 2 U B | ValidCards$ Creature.unblocked | Power$ 4 | Toughness$ 1 | SpellDescription$ Each unblocked creature has base power and toughness 4/1 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/inkfathom_witch.jpg Oracle:Fear (This creature can't be blocked except by artifact creatures and/or black creatures.)\n{2}{U}{B}: Each unblocked creature has base power and toughness 4/1 until end of turn. diff --git a/forge-gui/res/cardsfolder/i/inner_sanctum.txt b/forge-gui/res/cardsfolder/i/inner_sanctum.txt index 91cb980b411..612b6c3aee9 100644 --- a/forge-gui/res/cardsfolder/i/inner_sanctum.txt +++ b/forge-gui/res/cardsfolder/i/inner_sanctum.txt @@ -3,7 +3,7 @@ ManaCost:1 W W Types:Enchantment K:Cumulative upkeep:PayLife<2>:Pay 2 life. R:Event$ DamageDone | ActiveZones$ Battlefield | Prevent$ True | ValidTarget$ Creature.YouCtrl | Description$ Prevent all damage that would be dealt to creatures you control. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/inner_sanctum.jpg Oracle:Cumulative upkeep—Pay 2 life. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nPrevent all damage that would be dealt to creatures you control. diff --git a/forge-gui/res/cardsfolder/i/inner_struggle.txt b/forge-gui/res/cardsfolder/i/inner_struggle.txt index 10323c19ea1..a7c31202b6f 100644 --- a/forge-gui/res/cardsfolder/i/inner_struggle.txt +++ b/forge-gui/res/cardsfolder/i/inner_struggle.txt @@ -3,6 +3,6 @@ ManaCost:3 R Types:Instant A:SP$ DealDamage | Cost$ 3 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | DamageSource$ Targeted | NumDmg$ X | References$ X | SpellDescription$ Target creature deals damage to itself equal to its power. SVar:X:Targeted$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/inner_struggle.jpg Oracle:Target creature deals damage to itself equal to its power. diff --git a/forge-gui/res/cardsfolder/i/innocence_kami.txt b/forge-gui/res/cardsfolder/i/innocence_kami.txt index 17b1d565e32..0089ccd1d07 100644 --- a/forge-gui/res/cardsfolder/i/innocence_kami.txt +++ b/forge-gui/res/cardsfolder/i/innocence_kami.txt @@ -5,7 +5,7 @@ PT:2/3 T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigUntap | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, untap CARDNAME. A:AB$ Tap | Cost$ W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. SVar:TrigUntap:DB$Untap | Defined$ Self -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/innocence_kami.jpg Oracle:{W}, {T}: Tap target creature.\nWhenever you cast a Spirit or Arcane spell, untap Innocence Kami. diff --git a/forge-gui/res/cardsfolder/i/innocent_blood.txt b/forge-gui/res/cardsfolder/i/innocent_blood.txt index 86dc5fd82d6..972738c01fa 100644 --- a/forge-gui/res/cardsfolder/i/innocent_blood.txt +++ b/forge-gui/res/cardsfolder/i/innocent_blood.txt @@ -2,6 +2,6 @@ Name:Innocent Blood ManaCost:B Types:Sorcery A:SP$ Sacrifice | Cost$ B | SacValid$ Creature | Defined$ Player | SpellDescription$ Each player sacrifices a creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/innocent_blood.jpg Oracle:Each player sacrifices a creature. diff --git a/forge-gui/res/cardsfolder/i/inquisition.txt b/forge-gui/res/cardsfolder/i/inquisition.txt index b76af16ad81..9cbbb72d5b5 100644 --- a/forge-gui/res/cardsfolder/i/inquisition.txt +++ b/forge-gui/res/cardsfolder/i/inquisition.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ RevealHand | Cost$ 2 B | ValidTgts$ Player | TgtPrompt$ Select target player | RememberRevealed$ True | SubAbility$ Damage | SpellDescription$ Target player reveals their hand. CARDNAME deals damage to that player equal to the number of white cards in their hand. SVar:Damage:DB$ DealDamage | Defined$ Targeted | NumDmg$ X | References$ X SVar:X:Remembered$Valid Card.White -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/inquisition.jpg Oracle:Target player reveals their hand. Inquisition deals damage to that player equal to the number of white cards in their hand. diff --git a/forge-gui/res/cardsfolder/i/inquisitors_snare.txt b/forge-gui/res/cardsfolder/i/inquisitors_snare.txt index 66bf34bca17..8db981ee137 100644 --- a/forge-gui/res/cardsfolder/i/inquisitors_snare.txt +++ b/forge-gui/res/cardsfolder/i/inquisitors_snare.txt @@ -3,6 +3,6 @@ ManaCost:1 W Types:Instant A:SP$ Pump | Cost$ 1 W | ValidTgts$ Creature.attacking,Creature.blocking | IsCurse$ True | KW$ Prevent all damage that would be dealt by CARDNAME. | SubAbility$ DBDestroy | SpellDescription$ Prevent all damage target attacking or blocking creature would deal this turn. If that creature is black or red, destroy it. SVar:DBDestroy:DB$ Destroy | Defined$ Targeted | ConditionDefined$ Targeted | ConditionPresent$ Card.Black,Card.Red | ConditionCompare$ GE1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/inquisitors_snare.jpg Oracle:Prevent all damage target attacking or blocking creature would deal this turn. If that creature is black or red, destroy it. diff --git a/forge-gui/res/cardsfolder/i/inside_out.txt b/forge-gui/res/cardsfolder/i/inside_out.txt index 6e6efab7aca..f225c0ecdb6 100644 --- a/forge-gui/res/cardsfolder/i/inside_out.txt +++ b/forge-gui/res/cardsfolder/i/inside_out.txt @@ -3,6 +3,6 @@ ManaCost:1 UR Types:Instant A:SP$ Pump | Cost$ 1 UR | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch target creature's power and toughness until end of turn. | SubAbility$ DBDraw SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/inside_out.jpg Oracle:Switch target creature's power and toughness until end of turn.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/i/insidious_dreams.txt b/forge-gui/res/cardsfolder/i/insidious_dreams.txt index 9eaa44ab1f2..4ad161ddd1a 100644 --- a/forge-gui/res/cardsfolder/i/insidious_dreams.txt +++ b/forge-gui/res/cardsfolder/i/insidious_dreams.txt @@ -3,6 +3,6 @@ ManaCost:3 B Types:Instant A:SP$ ChangeZone | Cost$ 3 B Discard | Origin$ Library | Destination$ Library | ChangeType$ Card | ChangeNum$ ChosenX | LibraryPosition$ 0 | References$ X | SpellDescription$ Search your library for X cards. Then shuffle your library and put those cards on top of it in any order. SVar:X:XChoice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/insidious_dreams.jpg Oracle:As an additional cost to cast Insidious Dreams, discard X cards.\nSearch your library for X cards. Then shuffle your library and put those cards on top of it in any order. diff --git a/forge-gui/res/cardsfolder/i/insight.txt b/forge-gui/res/cardsfolder/i/insight.txt index 9020af82190..8888314f2f3 100644 --- a/forge-gui/res/cardsfolder/i/insight.txt +++ b/forge-gui/res/cardsfolder/i/insight.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Enchantment T:Mode$ SpellCast | ValidCard$ Card.Green | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever an opponent casts a green spell, you draw a card. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/insight.jpg Oracle:Whenever an opponent casts a green spell, you draw a card. diff --git a/forge-gui/res/cardsfolder/i/insist.txt b/forge-gui/res/cardsfolder/i/insist.txt index e138a69eb5d..b6f68101f9b 100644 --- a/forge-gui/res/cardsfolder/i/insist.txt +++ b/forge-gui/res/cardsfolder/i/insist.txt @@ -6,6 +6,6 @@ SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. SVar:SpellCastTrig:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | Execute$ Insistence | TriggerDescription$ The next creature spell you cast this turn can't be countered. SVar:Insistence:DB$ Pump | Defined$ TriggeredCard | KW$ HIDDEN CARDNAME can't be countered. | PumpZone$ Stack | SubAbility$ DBCleanup SVar:DBCleanup:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/insist.jpg Oracle:The next creature spell you cast this turn can't be countered.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/i/inspired_sprite.txt b/forge-gui/res/cardsfolder/i/inspired_sprite.txt index 34991f3e165..e951d837981 100644 --- a/forge-gui/res/cardsfolder/i/inspired_sprite.txt +++ b/forge-gui/res/cardsfolder/i/inspired_sprite.txt @@ -8,6 +8,6 @@ T:Mode$ SpellCast | ValidCard$ Wizard | ValidActivatingPlayer$ You | TriggerZone A:AB$ Draw | Cost$ T | NumCards$ 1 | SpellDescription$ Draw a card, then discard a card. | SubAbility$ DBDiscard SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose SVar:TrigUntap:DB$Untap | Defined$ Self -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/inspired_sprite.jpg Oracle:Flash\nFlying\nWhenever you cast a Wizard spell, you may untap Inspired Sprite.\n{T}: Draw a card, then discard a card. diff --git a/forge-gui/res/cardsfolder/i/inspiring_call.txt b/forge-gui/res/cardsfolder/i/inspiring_call.txt index ed698f9153f..ee0916a01cd 100644 --- a/forge-gui/res/cardsfolder/i/inspiring_call.txt +++ b/forge-gui/res/cardsfolder/i/inspiring_call.txt @@ -4,7 +4,7 @@ Types:Instant A:SP$ Draw | Cost$ 2 G | NumCards$ X | References$ X | SubAbility$ DBPumpAll | SpellDescription$ Draw a card for each creature you control with a +1/+1 counter on it. Those creatures gain indestructible until end of turn. SVar:X:Count$Valid Creature.YouCtrl+counters_GE1_P1P1 SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.YouCtrl+counters_GE1_P1P1 | KW$ Indestructible -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/inspiring_call.jpg Oracle:Draw a card for each creature you control with a +1/+1 counter on it. Those creatures gain indestructible until end of turn. diff --git a/forge-gui/res/cardsfolder/i/instigator.txt b/forge-gui/res/cardsfolder/i/instigator.txt index d6b0ce05ed2..f095bd95dde 100644 --- a/forge-gui/res/cardsfolder/i/instigator.txt +++ b/forge-gui/res/cardsfolder/i/instigator.txt @@ -4,6 +4,6 @@ Types:Creature Human Spellshaper PT:1/1 A:AB$ Effect | Cost$ 1 B B T Discard<1/Card> | Name$ Instigator Effect | ValidTgts$ Player | TgtPrompt$ Select target player | StaticAbilities$ AttackThisTurn | References$ AttackThisTurn | RememberObjects$ Targeted | SpellDescription$ Creatures target player controls attack this turn if able. SVar:AttackThisTurn:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.RememberedPlayerCtrl | AddHiddenKeyword$ CARDNAME attacks each combat if able. | Description$ Creatures targeted player controls attack this turn if able. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/Instigator.jpg Oracle:{1}{B}{B}, {T}, Discard a card: Creatures target player controls attack this turn if able. diff --git a/forge-gui/res/cardsfolder/i/intangible_virtue.txt b/forge-gui/res/cardsfolder/i/intangible_virtue.txt index fae55219a3f..8106a3eb572 100644 --- a/forge-gui/res/cardsfolder/i/intangible_virtue.txt +++ b/forge-gui/res/cardsfolder/i/intangible_virtue.txt @@ -3,6 +3,6 @@ ManaCost:1 W Types:Enchantment S:Mode$ Continuous | Affected$ Creature.token+YouCtrl | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Vigilance | Description$ Creature tokens you control get +1/+1 and have vigilance. SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/intangible_virtue.jpg Oracle:Creature tokens you control get +1/+1 and have vigilance. diff --git a/forge-gui/res/cardsfolder/i/intellectual_offering.txt b/forge-gui/res/cardsfolder/i/intellectual_offering.txt index 4685475ccec..eb527db7af1 100644 --- a/forge-gui/res/cardsfolder/i/intellectual_offering.txt +++ b/forge-gui/res/cardsfolder/i/intellectual_offering.txt @@ -5,7 +5,7 @@ A:SP$ ChoosePlayer | Cost$ 4 U | Defined$ You | Choices$ Player.Opponent | SubAb SVar:DBDraw:DB$ Draw | Defined$ ChosenAndYou | NumCards$ 3 | SubAbility$ DBChoose SVar:DBChoose:DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | SubAbility$ DBUntap SVar:DBUntap:DB$ UntapAll | ValidCards$ Permanent.nonLand+YouCtrl,Permanent.nonLand+ChosenCtrl -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/intellectual_offering.jpg Oracle:Choose an opponent. You and that player each draw three cards.\nChoose an opponent. Untap all nonland permanents you control and all nonland permanents that player controls. diff --git a/forge-gui/res/cardsfolder/i/interdict.txt b/forge-gui/res/cardsfolder/i/interdict.txt index a99ed56208a..92a61e52a01 100644 --- a/forge-gui/res/cardsfolder/i/interdict.txt +++ b/forge-gui/res/cardsfolder/i/interdict.txt @@ -5,6 +5,6 @@ A:SP$ Counter | Cost$ 1 U | TargetType$ Activated | TgtPrompt$ Select target act SVar:DBEffect:DB$ Effect | Name$ Interdict Effect | StaticAbilities$ STCantBeActivated | RememberObjects$ Remembered | SubAbility$ DBDraw SVar:STCantBeActivated:Mode$ CantBeActivated | EffectZone$ Command | ValidCard$ Permanent.IsRemembered SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/interdict.jpg Oracle:Counter target activated ability from an artifact, creature, enchantment, or land. That permanent's activated abilities can't be activated this turn. (Mana abilities can't be targeted.)\nDraw a card. diff --git a/forge-gui/res/cardsfolder/i/intervention_pact.txt b/forge-gui/res/cardsfolder/i/intervention_pact.txt index d48f376f427..ae0acb898a4 100644 --- a/forge-gui/res/cardsfolder/i/intervention_pact.txt +++ b/forge-gui/res/cardsfolder/i/intervention_pact.txt @@ -13,6 +13,6 @@ SVar:DBDelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Y SVar:TrigLoseGame:DB$ LosesGame | UnlessCost$ 1 W W | UnlessPayer$ You | Defined$ You SVar:NeedsToPlayVar:NumLands GE3 SVar:NumLands:Count$Valid Land.YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/intervention_pact.jpg Oracle:The next time a source of your choice would deal damage to you this turn, prevent that damage. You gain life equal to the damage prevented this way.\nAt the beginning of your next upkeep, pay {1}{W}{W}. If you don't, you lose the game. diff --git a/forge-gui/res/cardsfolder/i/intimidation_bolt.txt b/forge-gui/res/cardsfolder/i/intimidation_bolt.txt index cd154d6e4f8..397a4c270df 100644 --- a/forge-gui/res/cardsfolder/i/intimidation_bolt.txt +++ b/forge-gui/res/cardsfolder/i/intimidation_bolt.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ DealDamage | Cost$ 1 R W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 3 | RememberTargets$ True | SubAbility$ DBPumpAll | SpellDescription$ CARDNAME deals 3 damage to target creature. Other creatures can't attack this turn. SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Remembered.Creature+Other | KW$ HIDDEN CARDNAME can't attack. | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/intimidation_bolt.jpg Oracle:Intimidation Bolt deals 3 damage to target creature. Other creatures can't attack this turn. diff --git a/forge-gui/res/cardsfolder/i/into_the_fray.txt b/forge-gui/res/cardsfolder/i/into_the_fray.txt index f4b7f2d3604..4bbf64d72a5 100644 --- a/forge-gui/res/cardsfolder/i/into_the_fray.txt +++ b/forge-gui/res/cardsfolder/i/into_the_fray.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Instant Arcane K:Splice:Arcane:R A:SP$ Pump | Cost$ R | ValidTgts$ Creature | KW$ HIDDEN CARDNAME attacks each combat if able. | TgtPrompt$ Select target creature | SpellDescription$ Target creature attacks this turn if able. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/into_the_fray.jpg Oracle:Target creature attacks this turn if able.\nSplice onto Arcane {R} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) diff --git a/forge-gui/res/cardsfolder/i/into_the_north.txt b/forge-gui/res/cardsfolder/i/into_the_north.txt index acf7db2deee..44e84461a1b 100644 --- a/forge-gui/res/cardsfolder/i/into_the_north.txt +++ b/forge-gui/res/cardsfolder/i/into_the_north.txt @@ -2,6 +2,6 @@ Name:Into the North ManaCost:1 G Types:Sorcery A:SP$ ChangeZone | Cost$ 1 G | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Snow | Tapped$ True | ChangeNum$ 1 | SpellDescription$ Search your library for a snow land card, put it onto the battlefield tapped, then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/into_the_north.jpg Oracle:Search your library for a snow land card, put it onto the battlefield tapped, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/i/intruder_alarm.txt b/forge-gui/res/cardsfolder/i/intruder_alarm.txt index 47bfc448d7c..49b3b30d894 100644 --- a/forge-gui/res/cardsfolder/i/intruder_alarm.txt +++ b/forge-gui/res/cardsfolder/i/intruder_alarm.txt @@ -4,6 +4,6 @@ Types:Enchantment S:Mode$ Continuous | Affected$ Player | AddKeyword$ UntapAdjust:Creature:0 | Description$ Creatures don't untap during their controllers' untap steps. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigUntapAll | TriggerDescription$ Whenever a creature enters the battlefield, untap all creatures. SVar:TrigUntapAll:DB$ UntapAll | ValidCards$ Creature | SpellDescription$ untap all creatures. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/intruder_alarm.jpg Oracle:Creatures don't untap during their controllers' untap steps.\nWhenever a creature enters the battlefield, untap all creatures. diff --git a/forge-gui/res/cardsfolder/i/invasion_plans.txt b/forge-gui/res/cardsfolder/i/invasion_plans.txt index 88b5eea17a6..89c10cbc565 100644 --- a/forge-gui/res/cardsfolder/i/invasion_plans.txt +++ b/forge-gui/res/cardsfolder/i/invasion_plans.txt @@ -4,6 +4,6 @@ Types:Enchantment S:Mode$ Continuous | GlobalRule$ The attacking player chooses how each creature blocks each turn. | Description$ The attacking player chooses how each creature blocks each turn. S:Mode$ Continuous | Affected$ Creature | AddHiddenKeyword$ CARDNAME blocks each combat if able. | Description$ All creatures block each combat if able. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/invasion_plans.jpg Oracle:All creatures block each combat if able.\nThe attacking player chooses how each creature blocks each turn. diff --git a/forge-gui/res/cardsfolder/i/invasive_species.txt b/forge-gui/res/cardsfolder/i/invasive_species.txt index 71eb878c781..6386d8b8b68 100644 --- a/forge-gui/res/cardsfolder/i/invasive_species.txt +++ b/forge-gui/res/cardsfolder/i/invasive_species.txt @@ -5,6 +5,6 @@ PT:3/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, return another permanent you control to its owner's hand. SVar:TrigChange:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Hidden$ True | Mandatory$ True | ChangeType$ Permanent.Other+YouCtrl | AILogic$ NeverBounceItself SVar:NeedsToPlay:Creature.YouCtrl+cmcLE2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/invasive_species.jpg Oracle:When Invasive Species enters the battlefield, return another permanent you control to its owner's hand. diff --git a/forge-gui/res/cardsfolder/i/invert_invent.txt b/forge-gui/res/cardsfolder/i/invert_invent.txt index 63f7d936e87..c8088ef23cf 100644 --- a/forge-gui/res/cardsfolder/i/invert_invent.txt +++ b/forge-gui/res/cardsfolder/i/invert_invent.txt @@ -12,6 +12,6 @@ ManaCost:4 U R Types:Instant A:SP$ ChangeZone | Cost$ 4 U R | Origin$ Library | Destination$ Hand | ChangeType$ Instant | ChangeNum$ 1 | SubAbility$ DBChange | SpellDescription$ Search your library for and instant permanent and/or a sorcery card, reveal them, put them into your hand, then shuffle your library. SVar:DBChange:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Sorcery | ChangeNum$ 1 | Shuffle$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Instant|Sorcery Oracle:Search your library for an instant card and/or a sorcery card, reveal them, put them into your hand, then shuffle your library. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/i/invert_the_skies.txt b/forge-gui/res/cardsfolder/i/invert_the_skies.txt index 7abca11e66b..ec6989fb525 100644 --- a/forge-gui/res/cardsfolder/i/invert_the_skies.txt +++ b/forge-gui/res/cardsfolder/i/invert_the_skies.txt @@ -3,6 +3,6 @@ ManaCost:3 GU Types:Instant A:SP$ AnimateAll | Cost$ 3 GU | ValidCards$ Creature.OppCtrl | RemoveKeywords$ Flying | ConditionManaSpent$ G | SubAbility$ UPaid | SpellDescription$ Creatures your opponents control lose flying until end of turn if {G} was spent to cast CARDNAME, and creatures you control gain flying until end of turn if {U} was spent to cast it. (Do both if {G}{U} was spent.) SVar:UPaid:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Flying | ConditionManaSpent$ U -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/invert_the_skies.jpg Oracle:Creatures your opponents control lose flying until end of turn if {G} was spent to cast Invert the Skies, and creatures you control gain flying until end of turn if {U} was spent to cast it. (Do both if {G}{U} was spent.) diff --git a/forge-gui/res/cardsfolder/i/inverter_of_truth.txt b/forge-gui/res/cardsfolder/i/inverter_of_truth.txt index b833ed10d16..806b153a73a 100644 --- a/forge-gui/res/cardsfolder/i/inverter_of_truth.txt +++ b/forge-gui/res/cardsfolder/i/inverter_of_truth.txt @@ -7,6 +7,6 @@ K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExileYourLibrary | TriggerDescription$ When CARDNAME enters the battlefield, exile all cards from your library face down, then shuffle all cards from your graveyard into your library. SVar:TrigExileYourLibrary:DB$ChangeZoneAll | ChangeType$ Card.YouOwn | Origin$ Library | Destination$ Exile | ExileFaceDown$ True | SubAbility$ DBShuffle SVar:DBShuffle:DB$ChangeZoneAll | ChangeType$ Card.YouOwn | Origin$ Graveyard | Destination$ Library | Shuffle$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/inverter_of_truth.jpg Oracle:Devoid (This card has no color.)\nFlying\nWhen Inverter of Truth enters the battlefield, exile all cards from your library face down, then shuffle all cards from your graveyard into your library. diff --git a/forge-gui/res/cardsfolder/i/invigorating_boon.txt b/forge-gui/res/cardsfolder/i/invigorating_boon.txt index 8237e0aef64..d2e19ea88c2 100644 --- a/forge-gui/res/cardsfolder/i/invigorating_boon.txt +++ b/forge-gui/res/cardsfolder/i/invigorating_boon.txt @@ -3,6 +3,6 @@ ManaCost:1 G Types:Enchantment T:Mode$ Cycled | ValidCard$ Card | Execute$ TrigPutCounter | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever a player cycles a card, you may put a +1/+1 counter on target creature. SVar:TrigPutCounter:DB$PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/invigorating_boon.jpg Oracle:Whenever a player cycles a card, you may put a +1/+1 counter on target creature. diff --git a/forge-gui/res/cardsfolder/i/ion_storm.txt b/forge-gui/res/cardsfolder/i/ion_storm.txt index 9bc7237cbf8..d3d96bc9a4a 100644 --- a/forge-gui/res/cardsfolder/i/ion_storm.txt +++ b/forge-gui/res/cardsfolder/i/ion_storm.txt @@ -3,7 +3,7 @@ ManaCost:2 R Types:Enchantment A:AB$ DealDamage | Cost$ 1 R SubCounter<1/P1P1/Permanent/permanent you control> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to any target. A:AB$ DealDamage | Cost$ 1 R SubCounter<1/CHARGE/Permanent/permanent you control> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to any target. -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ion_storm.jpg Oracle:{1}{R}, Remove a +1/+1 counter or a charge counter from a permanent you control: Ion Storm deals 2 damage to any target. diff --git a/forge-gui/res/cardsfolder/i/ire_of_kaminari.txt b/forge-gui/res/cardsfolder/i/ire_of_kaminari.txt index 345d9dc0e9b..455304bb24a 100644 --- a/forge-gui/res/cardsfolder/i/ire_of_kaminari.txt +++ b/forge-gui/res/cardsfolder/i/ire_of_kaminari.txt @@ -3,7 +3,7 @@ ManaCost:3 R Types:Instant Arcane A:SP$ DealDamage | Cost$ 3 R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X | SpellDescription$ Ire of Kaminari deals damage to any target equal to the number of Arcane cards in your graveyard. SVar:X:Count$TypeInYourYard.Arcane -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/ire_of_kaminari.jpg Oracle:Ire of Kaminari deals damage to any target equal to the number of Arcane cards in your graveyard. diff --git a/forge-gui/res/cardsfolder/i/irini_sengir.txt b/forge-gui/res/cardsfolder/i/irini_sengir.txt index 1e101819fb0..b0c783bbce7 100644 --- a/forge-gui/res/cardsfolder/i/irini_sengir.txt +++ b/forge-gui/res/cardsfolder/i/irini_sengir.txt @@ -3,6 +3,6 @@ ManaCost:2 B B Types:Legendary Creature Vampire Dwarf PT:2/2 S:Mode$ RaiseCost | ValidCard$ Enchantment.White,Enchantment.Green | Type$ Spell | Amount$ 2 | Description$ White enchantment spells and green enchantment spells cost 2 more to cast. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/irini_sengir.jpg Oracle:Green enchantment spells and white enchantment spells cost {2} more to cast. diff --git a/forge-gui/res/cardsfolder/i/iron_heart_chimera.txt b/forge-gui/res/cardsfolder/i/iron_heart_chimera.txt index 2ddded95dbe..57f5abbac8c 100644 --- a/forge-gui/res/cardsfolder/i/iron_heart_chimera.txt +++ b/forge-gui/res/cardsfolder/i/iron_heart_chimera.txt @@ -6,6 +6,6 @@ K:Vigilance A:AB$ PutCounter | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.Chimera | TgtPrompt$ Select target Chimera creature | CounterType$ P2P2 | CounterNum$ 1 | SubAbility$ DBPump | SpellDescription$ Put a +2/+2 counter on target Chimera creature. It gains vigilance. (This effect lasts indefinitely.) SVar:DBPump:DB$Pump | KW$ Vigilance | Defined$ Targeted | Permanent$ True #TODO: Ensure that the AI actually uses the ability, and uses it smartly enough (ditto for other similar Chimera creatures). -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/iron_heart_chimera.jpg Oracle:Vigilance\nSacrifice Iron-Heart Chimera: Put a +2/+2 counter on target Chimera creature. It gains vigilance. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/i/iron_star.txt b/forge-gui/res/cardsfolder/i/iron_star.txt index bac762dc95a..514b595fd12 100644 --- a/forge-gui/res/cardsfolder/i/iron_star.txt +++ b/forge-gui/res/cardsfolder/i/iron_star.txt @@ -3,6 +3,6 @@ ManaCost:1 Types:Artifact T:Mode$ SpellCast | ValidCard$ Card.Red | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever a player casts a red spell, you may pay {1}. If you do, you gain 1 life. SVar:TrigGainLife:AB$GainLife | Cost$ 1 | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/iron_star.jpg Oracle:Whenever a player casts a red spell, you may pay {1}. If you do, you gain 1 life. diff --git a/forge-gui/res/cardsfolder/i/irradiate.txt b/forge-gui/res/cardsfolder/i/irradiate.txt index 09063f1489c..49479b8b1be 100644 --- a/forge-gui/res/cardsfolder/i/irradiate.txt +++ b/forge-gui/res/cardsfolder/i/irradiate.txt @@ -3,6 +3,6 @@ ManaCost:3 B Types:Instant A:SP$ Pump | Cost$ 3 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -X | NumDef$ -X | IsCurse$ True | References$ X | SpellDescription$ Target creature gets -1/-1 until end of turn for each artifact you control. SVar:X:Count$NumTypeYouCtrl.Artifact -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/irradiate.jpg Oracle:Target creature gets -1/-1 until end of turn for each artifact you control. diff --git a/forge-gui/res/cardsfolder/i/irresistible_prey.txt b/forge-gui/res/cardsfolder/i/irresistible_prey.txt index 5ce56a63127..d040b4a17aa 100644 --- a/forge-gui/res/cardsfolder/i/irresistible_prey.txt +++ b/forge-gui/res/cardsfolder/i/irresistible_prey.txt @@ -3,6 +3,6 @@ ManaCost:G Types:Sorcery A:SP$ Pump | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME must be blocked if able. | AILogic$ Pump | SubAbility$ DBDraw | SpellDescription$ Target creature must be blocked this turn if able. SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/irresistible_prey.jpg Oracle:Target creature must be blocked this turn if able.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/i/irrigation_ditch.txt b/forge-gui/res/cardsfolder/i/irrigation_ditch.txt index f05a2e33e48..258742be773 100644 --- a/forge-gui/res/cardsfolder/i/irrigation_ditch.txt +++ b/forge-gui/res/cardsfolder/i/irrigation_ditch.txt @@ -4,6 +4,6 @@ Types:Land K:CARDNAME enters the battlefield tapped. A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ G U | SpellDescription$ Add {G}{U}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/irrigation_ditch.jpg Oracle:Irrigation Ditch enters the battlefield tapped.\n{T}: Add {W}.\n{T}, Sacrifice Irrigation Ditch: Add {G}{U}. diff --git a/forge-gui/res/cardsfolder/i/ishi_ishi_akki_crackshot.txt b/forge-gui/res/cardsfolder/i/ishi_ishi_akki_crackshot.txt index 879ef12a7b4..50d1d6fb1bd 100644 --- a/forge-gui/res/cardsfolder/i/ishi_ishi_akki_crackshot.txt +++ b/forge-gui/res/cardsfolder/i/ishi_ishi_akki_crackshot.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Goblin Warrior PT:1/1 T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever an opponent casts a Spirit or Arcane spell, CARDNAME deals 2 damage to that player. SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredCardController | NumDmg$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ishi_ishi_akki_crackshot.jpg Oracle:Whenever an opponent casts a Spirit or Arcane spell, Ishi-Ishi, Akki Crackshot deals 2 damage to that player. diff --git a/forge-gui/res/cardsfolder/i/island_of_wak_wak.txt b/forge-gui/res/cardsfolder/i/island_of_wak_wak.txt index d8f72b74b57..4236e88fd6b 100644 --- a/forge-gui/res/cardsfolder/i/island_of_wak_wak.txt +++ b/forge-gui/res/cardsfolder/i/island_of_wak_wak.txt @@ -2,6 +2,6 @@ Name:Island of Wak-Wak ManaCost:no cost Types:Land A:AB$ Animate | Cost$ T | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | Power$ 0 | SpellDescription$ Target creature with flying has base power 0 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/island_of_wak_wak.jpg Oracle:{T}: Target creature with flying has base power 0 until end of turn. diff --git a/forge-gui/res/cardsfolder/i/island_sanctuary.txt b/forge-gui/res/cardsfolder/i/island_sanctuary.txt index 736edecacb8..2fd2dfc0107 100644 --- a/forge-gui/res/cardsfolder/i/island_sanctuary.txt +++ b/forge-gui/res/cardsfolder/i/island_sanctuary.txt @@ -5,6 +5,6 @@ R:Event$ Draw | ActiveZones$ Battlefield | ActivePhases$ Draw | PlayerTurn$ True SVar:SanctuaryEffect:DB$ Effect | Name$ Sanctuary Effect | StaticAbilities$ IslandRetreat | Duration$ UntilYourNextTurn SVar:IslandRetreat:Mode$ CantAttack | EffectZone$ Command | ValidCard$ Creature.withoutFlying+withoutIslandwalk | Target$ You | Description$ Creatures without flying and/or islandwalk can't attack you. SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/island_sanctuary.jpg Oracle:If you would draw a card during your draw step, instead you may skip that draw. If you do, until your next turn, you can't be attacked except by creatures with flying and/or islandwalk. diff --git a/forge-gui/res/cardsfolder/i/isochron_scepter.txt b/forge-gui/res/cardsfolder/i/isochron_scepter.txt index 35414ebe63b..d702270f964 100644 --- a/forge-gui/res/cardsfolder/i/isochron_scepter.txt +++ b/forge-gui/res/cardsfolder/i/isochron_scepter.txt @@ -9,6 +9,6 @@ SVar:DBForget:DB$ Pump | ForgetImprinted$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Card.Self | Destination$ Any | Execute$ DBCleanup | Static$ True SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True #Amount$ All | CopyOnce$ True for Strionic Resonator -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/isochron_scepter.jpg Oracle:Imprint — When Isochron Scepter enters the battlefield, you may exile an instant card with converted mana cost 2 or less from your hand.\n{2}, {T}: You may copy the exiled card. If you do, you may cast the copy without paying its mana cost. diff --git a/forge-gui/res/cardsfolder/i/ith_high_arcanist.txt b/forge-gui/res/cardsfolder/i/ith_high_arcanist.txt index 8067b54552f..584d335bf3d 100644 --- a/forge-gui/res/cardsfolder/i/ith_high_arcanist.txt +++ b/forge-gui/res/cardsfolder/i/ith_high_arcanist.txt @@ -6,6 +6,6 @@ K:Vigilance A:AB$ Untap | Cost$ T | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | SubAbility$ DBPump | SpellDescription$ Untap target attacking creature. Prevent all combat damage that would be dealt to and dealt by that creature this turn. SVar:DBPump:DB$Pump | Defined$ Targeted | KW$ Prevent all combat damage that would be dealt to and dealt by CARDNAME. K:Suspend:4:W U -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ith_high_arcanist.jpg Oracle:Vigilance\n{T}: Untap target attacking creature. Prevent all combat damage that would be dealt to and dealt by that creature this turn.\nSuspend 4—{W}{U} (Rather than cast this card from your hand, you may pay {W}{U} and exile it with four time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) diff --git a/forge-gui/res/cardsfolder/i/ivory_charm.txt b/forge-gui/res/cardsfolder/i/ivory_charm.txt index c703086b595..8c940a2bc3a 100644 --- a/forge-gui/res/cardsfolder/i/ivory_charm.txt +++ b/forge-gui/res/cardsfolder/i/ivory_charm.txt @@ -5,6 +5,6 @@ A:SP$ Charm | Cost$ W | Choices$ PumpAll,Tap,Prevent | CharmNum$ 1 SVar:PumpAll:DB$ PumpAll | ValidCards$ Creature | NumAtt$ -2 | IsCurse$ True | SpellDescription$ All creatures get -2/-0 until end of turn. SVar:Tap:DB$ Tap | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. SVar:Prevent:DB$ PreventDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to any target this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ivory_charm.jpg Oracle:Choose one —\n• All creatures get -2/-0 until end of turn.\n• Tap target creature.\n• Prevent the next 1 damage that would be dealt to any target this turn. diff --git a/forge-gui/res/cardsfolder/i/ivory_crane_netsuke.txt b/forge-gui/res/cardsfolder/i/ivory_crane_netsuke.txt index 0abc4689aa8..df55d521c3c 100644 --- a/forge-gui/res/cardsfolder/i/ivory_crane_netsuke.txt +++ b/forge-gui/res/cardsfolder/i/ivory_crane_netsuke.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Card.YouCtrl | PresentZone$ Hand | PresentCompare$ GT6 | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ At the beginning of your upkeep, if you have seven or more cards in hand, you gain 4 life. SVar:TrigGainLife:DB$GainLife | Defined$ You | LifeAmount$ 4 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ivory_crane_netsuke.jpg Oracle:At the beginning of your upkeep, if you have seven or more cards in hand, you gain 4 life. diff --git a/forge-gui/res/cardsfolder/i/ivory_cup.txt b/forge-gui/res/cardsfolder/i/ivory_cup.txt index 931d4f22514..0f9804b5423 100644 --- a/forge-gui/res/cardsfolder/i/ivory_cup.txt +++ b/forge-gui/res/cardsfolder/i/ivory_cup.txt @@ -3,6 +3,6 @@ ManaCost:1 Types:Artifact T:Mode$ SpellCast | ValidCard$ Card.White | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever a player casts a white spell, you may pay {1}. If you do, you gain 1 life. SVar:TrigGainLife:AB$GainLife | Cost$ 1 | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ivory_cup.jpg Oracle:Whenever a player casts a white spell, you may pay {1}. If you do, you gain 1 life. diff --git a/forge-gui/res/cardsfolder/i/ivory_gargoyle.txt b/forge-gui/res/cardsfolder/i/ivory_gargoyle.txt index 185919580dc..cf633d4954f 100644 --- a/forge-gui/res/cardsfolder/i/ivory_gargoyle.txt +++ b/forge-gui/res/cardsfolder/i/ivory_gargoyle.txt @@ -8,6 +8,6 @@ SVar:TrigSkipDraw:DB$ Pump | Defined$ TriggeredCardController | KW$ Skip your ne SVar:TrigDelay:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | RememberObjects$ TriggeredCard | TriggerDescription$ Return CARDNAME to the battlefield. SVar:TrigReturn:DB$ ChangeZone | Defined$ DelayTriggerRemembered | Origin$ Graveyard | Destination$ Battlefield A:AB$ ChangeZone | Cost$ 4 W | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile CARDNAME. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ivory_gargoyle.jpg Oracle:Flying\nWhen Ivory Gargoyle dies, return it to the battlefield under its owner's control at the beginning of the next end step and you skip your next draw step.\n{4}{W}: Exile Ivory Gargoyle. diff --git a/forge-gui/res/cardsfolder/i/ivory_guardians.txt b/forge-gui/res/cardsfolder/i/ivory_guardians.txt index 5b5e757295a..d5adeb0afcf 100644 --- a/forge-gui/res/cardsfolder/i/ivory_guardians.txt +++ b/forge-gui/res/cardsfolder/i/ivory_guardians.txt @@ -5,7 +5,7 @@ PT:3/3 K:Protection from red S:Mode$ Continuous | Affected$ Creature.namedIvory Guardians | AddPower$ 1 | AddToughness$ 1 | CheckSVar$ X | SVarCompare$ GE1 | Description$ Creatures named CARDNAME get +1/+1 as long as an opponent controls a nontoken red permanent. SVar:X:Count$Valid Permanent.Red+nonToken+OppCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Name$Ivory Guardians SVar:Picture:http://www.wizards.com/global/images/magic/general/ivory_guardians.jpg Oracle:Protection from red\nCreatures named Ivory Guardians get +1/+1 as long as an opponent controls a nontoken red permanent. diff --git a/forge-gui/res/cardsfolder/i/ivy_seer.txt b/forge-gui/res/cardsfolder/i/ivy_seer.txt index 3ba373f93c5..0c4e619861e 100644 --- a/forge-gui/res/cardsfolder/i/ivy_seer.txt +++ b/forge-gui/res/cardsfolder/i/ivy_seer.txt @@ -6,6 +6,6 @@ A:AB$ Reveal | Cost$ 2 G T | Defined$ You | RevealValid$ Card.Green | AnyNumber$ SVar:DBIvyPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ IvyX | NumDef$ IvyX | SubAbility$ DBIvyCleanup | References$ IvyX SVar:IvyX:Remembered$Amount SVar:DBIvyCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ivy_seer.jpg Oracle:{2}{G}, {T}: Reveal any number of green cards in your hand. Target creature gets +X/+X until end of turn, where X is the number of cards revealed this way. diff --git a/forge-gui/res/cardsfolder/i/ixidors_will.txt b/forge-gui/res/cardsfolder/i/ixidors_will.txt index f62151494d5..8e0c4178742 100644 --- a/forge-gui/res/cardsfolder/i/ixidors_will.txt +++ b/forge-gui/res/cardsfolder/i/ixidors_will.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Instant A:SP$ Counter | Cost$ 2 U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ X | References$ X | SpellDescription$ Counter target spell unless its controller pays {2} for each Wizard on the battlefield. SVar:X:Count$TypeYouCtrl.Wizard/Twice -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ixidors_will.jpg Oracle:Counter target spell unless its controller pays {2} for each Wizard on the battlefield. diff --git a/forge-gui/res/cardsfolder/i/izzet_chemister.txt b/forge-gui/res/cardsfolder/i/izzet_chemister.txt index 92f5166ebca..533f0f4b728 100644 --- a/forge-gui/res/cardsfolder/i/izzet_chemister.txt +++ b/forge-gui/res/cardsfolder/i/izzet_chemister.txt @@ -10,6 +10,6 @@ SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:NumRemembered:Count$ValidExile Instant.YouOwn+ExiledWithSource,Sorcery.YouOwn+ExiledWithSource -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/izzet_chemister.jpg Oracle:Haste\n{R}, {T}: Exile target instant or sorcery card from your graveyard.\n{1}{R}, {T}, Sacrifice Izzet Chemister: Cast any number of cards exiled with Izzet Chemister without paying their mana costs. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/i/izzet_cluestone.txt b/forge-gui/res/cardsfolder/i/izzet_cluestone.txt index 87aa186ee39..8049c41a3b9 100644 --- a/forge-gui/res/cardsfolder/i/izzet_cluestone.txt +++ b/forge-gui/res/cardsfolder/i/izzet_cluestone.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. A:AB$ Draw | Cost$ U R T Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Blue|Red SVar:Picture:http://www.wizards.com/global/images/magic/general/izzet_cluestone.jpg Oracle:{T}: Add {U} or {R}.\n{U}{R}, {T}, Sacrifice Izzet Cluestone: Draw a card. diff --git a/forge-gui/res/cardsfolder/i/izzet_guildmage.txt b/forge-gui/res/cardsfolder/i/izzet_guildmage.txt index 66c32b84c1b..963e1177204 100644 --- a/forge-gui/res/cardsfolder/i/izzet_guildmage.txt +++ b/forge-gui/res/cardsfolder/i/izzet_guildmage.txt @@ -4,6 +4,6 @@ Types:Creature Human Wizard PT:2/2 A:AB$ CopySpellAbility | Cost$ 2 U | ValidTgts$ Instant.YouCtrl+cmcLE2 | TargetType$ Spell | SpellDescription$ Copy target instant spell you control with converted mana cost 2 or less. You may choose new targets for the copy. A:AB$ CopySpellAbility | Cost$ 2 R | ValidTgts$ Sorcery.YouCtrl+cmcLE2 | TargetType$ Spell | SpellDescription$ Copy target sorcery spell you control with converted mana cost 2 or less. You may choose new targets for the copy. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/izzet_guildmage.jpg Oracle:{2}{U}: Copy target instant spell you control with converted mana cost 2 or less. You may choose new targets for the copy.\n{2}{R}: Copy target sorcery spell you control with converted mana cost 2 or less. You may choose new targets for the copy. diff --git a/forge-gui/res/cardsfolder/i/izzet_keyrune.txt b/forge-gui/res/cardsfolder/i/izzet_keyrune.txt index 58efa6386e1..413f58067a9 100644 --- a/forge-gui/res/cardsfolder/i/izzet_keyrune.txt +++ b/forge-gui/res/cardsfolder/i/izzet_keyrune.txt @@ -7,7 +7,7 @@ A:AB$ Animate | Cost$ U R | Defined$ Self | Power$ 2 | Toughness$ 1 | Types$ Art T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigLoot | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may draw a card. If you do, discard a card. SVar:TrigLoot:DB$Draw | NumCards$ 1 | SubAbility$ DBDiscard SVar:DBDiscard:DB$Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Blue|Red SVar:Picture:http://www.wizards.com/global/images/magic/general/izzet_keyrune.jpg Oracle:{T}: Add {U} or {R}.\n{U}{R}: Until end of turn, Izzet Keyrune becomes a 2/1 blue and red Elemental artifact creature.\nWhenever Izzet Keyrune deals combat damage to a player, you may draw a card. If you do, discard a card. diff --git a/forge-gui/res/cardsfolder/i/izzet_locket.txt b/forge-gui/res/cardsfolder/i/izzet_locket.txt index f057ab3d226..bea86b0f851 100644 --- a/forge-gui/res/cardsfolder/i/izzet_locket.txt +++ b/forge-gui/res/cardsfolder/i/izzet_locket.txt @@ -5,5 +5,5 @@ A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. DeckNeeds:Color$Blue | Red A:AB$ Draw | Cost$ UR UR UR UR T Sac<1/CARDNAME> | NumCards$ 2 | SpellDescription$ Draw two cards. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random Oracle:{T}: Add {U} or {R}.\n{U/R}{U/R}{U/R}{U/R}, {T}, Sacrifice Izzet Locket: Draw two cards. diff --git a/forge-gui/res/cardsfolder/i/izzet_signet.txt b/forge-gui/res/cardsfolder/i/izzet_signet.txt index aa868382101..03d6ba5c3fa 100644 --- a/forge-gui/res/cardsfolder/i/izzet_signet.txt +++ b/forge-gui/res/cardsfolder/i/izzet_signet.txt @@ -2,6 +2,6 @@ Name:Izzet Signet ManaCost:2 Types:Artifact A:AB$ Mana | Cost$ 1 T | Produced$ U R | SpellDescription$ Add {U}{R}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/izzet_signet.jpg Oracle:{1}, {T}: Add {U}{R}. diff --git a/forge-gui/res/cardsfolder/j/jace_the_living_guildpact.txt b/forge-gui/res/cardsfolder/j/jace_the_living_guildpact.txt index 1b0d538b1cf..7aefe3c6a34 100644 --- a/forge-gui/res/cardsfolder/j/jace_the_living_guildpact.txt +++ b/forge-gui/res/cardsfolder/j/jace_the_living_guildpact.txt @@ -6,6 +6,6 @@ A:AB$ Dig | Cost$ AddCounter<1/LOYALTY> | Defined$ You | DigNum$ 2 | Destination A:AB$ ChangeZone | Cost$ SubCounter<3/LOYALTY> | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Permanent.Other+nonLand | TgtPrompt$ Select another target nonland permanent | Planeswalker$ True | SpellDescription$ Return another target nonland permanent to its owner's hand. A:AB$ ChangeZoneAll | Cost$ SubCounter<8/LOYALTY> | ChangeType$ Card | Origin$ Hand,Graveyard | Destination$ Library | Shuffle$ True | SubAbility$ DBDraw | UseAllOriginZones$ True | Planeswalker$ True | Ultimate$ True | SpellDescription$ Each player shuffles their hand and graveyard into their library. You draw seven cards. SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 7 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/jace_the_living_guildpact.jpg Oracle:[+1]: Look at the top two cards of your library. Put one of them into your graveyard.\n[-3]: Return another target nonland permanent to its owner's hand.\n[-8]: Each player shuffles their hand and graveyard into their library. You draw seven cards. diff --git a/forge-gui/res/cardsfolder/j/jaces_archivist.txt b/forge-gui/res/cardsfolder/j/jaces_archivist.txt index 49285d08d12..3395e9034e7 100644 --- a/forge-gui/res/cardsfolder/j/jaces_archivist.txt +++ b/forge-gui/res/cardsfolder/j/jaces_archivist.txt @@ -6,6 +6,6 @@ A:AB$ Discard | Cost$ U T | Defined$ Player | RememberDiscarded$ True | Mode$ Ha SVar:WindfallDraw:DB$ Draw | Defined$ Player | NumCards$ X | References$ X | SubAbility$ WindfallCleanup SVar:WindfallCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:PlayerCountPlayers$HighestValidGraveyard,Library,Exile Card.IsRemembered+YouOwn -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/jaces_archivist.jpg Oracle:{U}, {T}: Each player discards their hand, then draws cards equal to the greatest number of cards a player discarded this way. diff --git a/forge-gui/res/cardsfolder/j/jaces_defeat.txt b/forge-gui/res/cardsfolder/j/jaces_defeat.txt index 058f3dc5550..b6057f46ea0 100644 --- a/forge-gui/res/cardsfolder/j/jaces_defeat.txt +++ b/forge-gui/res/cardsfolder/j/jaces_defeat.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Instant A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TgtPrompt$ Select target Blue spell | ValidTgts$ Card.Blue | SubAbility$ DBScry | SpellDescription$ Counter target blue spell. If it was a Jace planeswalker spell, scry 2. SVar:DBScry:DB$Scry | ScryNum$ 2 | ConditionDefined$ Targeted | ConditionPresent$ Planeswalker.Jace -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/jaces_defeat.jpg Oracle:Counter target blue spell. If it was a Jace planeswalker spell, scry 2. diff --git a/forge-gui/res/cardsfolder/j/jackalope_herd.txt b/forge-gui/res/cardsfolder/j/jackalope_herd.txt index 578f9513d38..3d637ea0dc9 100644 --- a/forge-gui/res/cardsfolder/j/jackalope_herd.txt +++ b/forge-gui/res/cardsfolder/j/jackalope_herd.txt @@ -4,6 +4,6 @@ Types:Creature Rabbit Beast PT:4/5 T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigReturn | TriggerDescription$ When you cast a spell, return CARDNAME to its owner's hand. SVar:TrigReturn:DB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Defined$ Self -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/jackalope_herd.jpg Oracle:When you cast a spell, return Jackalope Herd to its owner's hand. diff --git a/forge-gui/res/cardsfolder/j/jade_idol.txt b/forge-gui/res/cardsfolder/j/jade_idol.txt index e2b25bb030e..69d68b1d121 100644 --- a/forge-gui/res/cardsfolder/j/jade_idol.txt +++ b/forge-gui/res/cardsfolder/j/jade_idol.txt @@ -4,7 +4,7 @@ Types:Artifact T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAnimate | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, CARDNAME becomes a 4/4 Spirit artifact creature until end of turn. SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 4 | Toughness$ 4 | Types$ Creature,Artifact,Spirit SVar:BuffedBy:Arcane,Spirit -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/jade_idol.jpg Oracle:Whenever you cast a Spirit or Arcane spell, Jade Idol becomes a 4/4 Spirit artifact creature until end of turn. diff --git a/forge-gui/res/cardsfolder/j/jade_monolith.txt b/forge-gui/res/cardsfolder/j/jade_monolith.txt index fffbf478596..699614bd74f 100644 --- a/forge-gui/res/cardsfolder/j/jade_monolith.txt +++ b/forge-gui/res/cardsfolder/j/jade_monolith.txt @@ -9,6 +9,6 @@ SVar:SelflessDmg:DB$ ReplaceEffect | VarName$ Affected | VarValue$ You | VarType SVar:OutOfSight:Mode$ ChangesZone | Origin$ Any | Destination$ Any | Defined$ ChosenCard | Execute$ ExileEffect | Static$ True SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile | Static$ True SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/jade_monolith.jpg Oracle:{1}: The next time a source of your choice would deal damage to target creature this turn, that source deals that damage to you instead. diff --git a/forge-gui/res/cardsfolder/j/jagged_scar_archers.txt b/forge-gui/res/cardsfolder/j/jagged_scar_archers.txt index e67729298b0..8b914f8be14 100644 --- a/forge-gui/res/cardsfolder/j/jagged_scar_archers.txt +++ b/forge-gui/res/cardsfolder/j/jagged_scar_archers.txt @@ -7,7 +7,7 @@ SVar:Y:Count$Valid Elf.YouCtrl A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals damage equal to its power to target creature with flying. SVar:X:Count$CardPower SVar:BuffedBy:Permanent.Elf -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NoZeroToughnessAI:True SVar:Picture:http://www.wizards.com/global/images/magic/general/jagged_scar_archers.jpg Oracle:Jagged-Scar Archers's power and toughness are each equal to the number of Elves you control.\n{T}: Jagged-Scar Archers deals damage equal to its power to target creature with flying. diff --git a/forge-gui/res/cardsfolder/j/jalira_master_polymorphist.txt b/forge-gui/res/cardsfolder/j/jalira_master_polymorphist.txt index c16ce589d96..4a379b69e95 100644 --- a/forge-gui/res/cardsfolder/j/jalira_master_polymorphist.txt +++ b/forge-gui/res/cardsfolder/j/jalira_master_polymorphist.txt @@ -3,6 +3,6 @@ ManaCost:3 U Types:Legendary Creature Human Wizard PT:2/2 A:AB$ DigUntil | Cost$ 2 U T Sac<1/Creature.Other/another creature>| Valid$ Creature.nonLegendary | ValidDescription$ nonlegendary creature | FoundDestination$ Battlefield | RevealedDestination$ Library | RevealedLibraryPosition$ -1 | RevealRandomOrder$ True | SpellDescription$ Reveal cards from the top of your library until you reveal a nonlegendary creature card. Put that card onto the battlefield and the rest on the bottom of your library in a random order. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/jalira_master_polymorphist.jpg Oracle:{2}{U}, {T}, Sacrifice another creature: Reveal cards from the top of your library until you reveal a nonlegendary creature card. Put that card onto the battlefield and the rest on the bottom of your library in a random order. diff --git a/forge-gui/res/cardsfolder/j/jalum_tome.txt b/forge-gui/res/cardsfolder/j/jalum_tome.txt index 995df048910..54122722352 100644 --- a/forge-gui/res/cardsfolder/j/jalum_tome.txt +++ b/forge-gui/res/cardsfolder/j/jalum_tome.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact A:AB$ Draw | Cost$ 2 T | NumCards$ 1 | SpellDescription$ Draw a card, then discard a card. | SubAbility$ DBDiscard SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/jalum_tome.jpg Oracle:{2}, {T}: Draw a card, then discard a card. diff --git a/forge-gui/res/cardsfolder/j/jamuraan_lion.txt b/forge-gui/res/cardsfolder/j/jamuraan_lion.txt index 50fcf8e7ad3..ff3063fe1f6 100644 --- a/forge-gui/res/cardsfolder/j/jamuraan_lion.txt +++ b/forge-gui/res/cardsfolder/j/jamuraan_lion.txt @@ -3,6 +3,6 @@ ManaCost:2 W Types:Creature Cat PT:3/1 A:AB$ Pump | Cost$ W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME can't block. | IsCurse$ True | SpellDescription$ Target creature can't block this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/jamuraan_lion.jpg Oracle:{W}, {T}: Target creature can't block this turn. diff --git a/forge-gui/res/cardsfolder/j/jandors_ring.txt b/forge-gui/res/cardsfolder/j/jandors_ring.txt index 569d74ed0df..7040683adc9 100644 --- a/forge-gui/res/cardsfolder/j/jandors_ring.txt +++ b/forge-gui/res/cardsfolder/j/jandors_ring.txt @@ -2,6 +2,6 @@ Name:Jandor's Ring ManaCost:6 Types:Artifact A:AB$ Draw | Cost$ 2 T Discard<1/LastDrawn> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/jandors_ring.jpg Oracle:{2}, {T}, Discard the last card you drew this turn: Draw a card. diff --git a/forge-gui/res/cardsfolder/j/jandors_saddlebags.txt b/forge-gui/res/cardsfolder/j/jandors_saddlebags.txt index b8dde5f1557..970fba444d0 100644 --- a/forge-gui/res/cardsfolder/j/jandors_saddlebags.txt +++ b/forge-gui/res/cardsfolder/j/jandors_saddlebags.txt @@ -2,6 +2,6 @@ Name:Jandor's Saddlebags ManaCost:2 Types:Artifact A:AB$ Untap | Cost$ 3 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Untap target creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/jandors_saddlebags.jpg Oracle:{3}, {T}: Untap target creature. diff --git a/forge-gui/res/cardsfolder/j/jangling_automaton.txt b/forge-gui/res/cardsfolder/j/jangling_automaton.txt index e95a1ef4bba..1c87c49b082 100644 --- a/forge-gui/res/cardsfolder/j/jangling_automaton.txt +++ b/forge-gui/res/cardsfolder/j/jangling_automaton.txt @@ -4,6 +4,6 @@ Types:Artifact Creature Construct PT:3/2 T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigUntap | TriggerDescription$ Whenever CARDNAME attacks, untap all creatures defending player controls. SVar:TrigUntap:DB$UntapAll | ValidCards$ Creature.DefenderCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/jangling_automaton.jpg Oracle:Whenever Jangling Automaton attacks, untap all creatures defending player controls. diff --git a/forge-gui/res/cardsfolder/j/jar_of_eyeballs.txt b/forge-gui/res/cardsfolder/j/jar_of_eyeballs.txt index a9b3b0cbcae..8e0b8002a33 100644 --- a/forge-gui/res/cardsfolder/j/jar_of_eyeballs.txt +++ b/forge-gui/res/cardsfolder/j/jar_of_eyeballs.txt @@ -5,6 +5,6 @@ T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ EYEBALL | CounterNum$ 2 A:AB$ Dig | Cost$ 3 T SubCounter | DigNum$ X | ChangeNum$ 1 | DestinationZone$ Hand | DestinationZone2$ Library | LibraryPosition$ -1 | References$ X | SpellDescription$ Look at the top X cards of your library where X is the number of eyeball counters removed this way. Put one of them into your hand and the rest on the bottom of your library in any order. SVar:X:SVar$CostCountersRemoved -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/jar_of_eyeballs.jpg Oracle:Whenever a creature you control dies, put two eyeball counters on Jar of Eyeballs.\n{3}, {T}, Remove all eyeball counters from Jar of Eyeballs: Look at the top X cards of your library, where X is the number of eyeball counters removed this way. Put one of them into your hand and the rest on the bottom of your library in any order. diff --git a/forge-gui/res/cardsfolder/j/jasmine_seer.txt b/forge-gui/res/cardsfolder/j/jasmine_seer.txt index 6f05be29ad8..c7b0dc8ed49 100644 --- a/forge-gui/res/cardsfolder/j/jasmine_seer.txt +++ b/forge-gui/res/cardsfolder/j/jasmine_seer.txt @@ -6,6 +6,6 @@ A:AB$ Reveal | Cost$ 2 W T | Defined$ You | RevealValid$ Card.White | AnyNumber$ SVar:DBJasmineLife:DB$ GainLife | LifeAmount$ JasmineX | SubAbility$ DBJasmineCleanup | References$ JasmineX SVar:JasmineX:Remembered$Amount.Twice SVar:DBJasmineCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/jasmine_seer.jpg Oracle:{2}{W}, {T}: Reveal any number of white cards in your hand. You gain 2 life for each card revealed this way. diff --git a/forge-gui/res/cardsfolder/j/jeskai_banner.txt b/forge-gui/res/cardsfolder/j/jeskai_banner.txt index 12c4a6b1a89..7989af8ed84 100644 --- a/forge-gui/res/cardsfolder/j/jeskai_banner.txt +++ b/forge-gui/res/cardsfolder/j/jeskai_banner.txt @@ -5,7 +5,7 @@ A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. A:AB$ Draw | Cost$ U R W T Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Blue|Red|White SVar:Picture:http://www.wizards.com/global/images/magic/general/jeskai_banner.jpg Oracle:{T}: Add {U}, {R}, or {W}.\n{U}{R}{W}, {T}, Sacrifice Jeskai Banner: Draw a card. diff --git a/forge-gui/res/cardsfolder/j/jesters_cap.txt b/forge-gui/res/cardsfolder/j/jesters_cap.txt index 9f8d4a4c03f..f03b41ac05a 100644 --- a/forge-gui/res/cardsfolder/j/jesters_cap.txt +++ b/forge-gui/res/cardsfolder/j/jesters_cap.txt @@ -2,6 +2,6 @@ Name:Jester's Cap ManaCost:4 Types:Artifact A:AB$ ChangeZone | Cost$ 2 T Sac<1/CARDNAME> | ValidTgts$ Player | Chooser$ You | Origin$ Library | Destination$ Exile | ChangeType$ Card | ChangeNum$ 3 | IsCurse$ True | SpellDescription$ Search target player's library for three cards and exile them. Then that player shuffles their library. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/jesters_cap.jpg Oracle:{2}, {T}, Sacrifice Jester's Cap: Search target player's library for three cards and exile them. Then that player shuffles their library. diff --git a/forge-gui/res/cardsfolder/j/jesters_mask.txt b/forge-gui/res/cardsfolder/j/jesters_mask.txt index b0b12cc3387..a5c76176cdc 100644 --- a/forge-gui/res/cardsfolder/j/jesters_mask.txt +++ b/forge-gui/res/cardsfolder/j/jesters_mask.txt @@ -6,6 +6,6 @@ A:AB$ ChangeZoneAll | Cost$ 1 T Sac<1/CARDNAME> | ValidTgts$ Opponent | Origin$ SVar:DBMask:DB$ ChangeZone | DefinedPlayer$ Targeted | Origin$ Library | Destination$ Hand | ChangeNum$ X | ChangeType$ Card | Chooser$ You | SubAbility$ DBCleanup | References$ X SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/jesters_mask.jpg Oracle:Jester's Mask enters the battlefield tapped.\n{1}, {T}, Sacrifice Jester's Mask: Target opponent puts the cards from their hand on top of their library. Search that player's library for that many cards. That player puts those cards into their hand, then shuffles their library. diff --git a/forge-gui/res/cardsfolder/j/jesters_scepter.txt b/forge-gui/res/cardsfolder/j/jesters_scepter.txt index f2610c50bce..43b988a728a 100644 --- a/forge-gui/res/cardsfolder/j/jesters_scepter.txt +++ b/forge-gui/res/cardsfolder/j/jesters_scepter.txt @@ -12,6 +12,6 @@ T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCar SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard A:AB$ Counter | Cost$ 2 T ExiledMoveToGrave<1/Card.IsRemembered+ExiledWithSource/card exiled with CARDNAME> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | SpellDescription$ Counter target spell if it has the same name as that card. SVar:X:Targeted$Valid Card.sharesNameWith MovedToGrave -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/jesters_scepter.jpg Oracle:When Jester's Scepter enters the battlefield, exile the top five cards of target player's library face down. You may look at those cards for as long as they remain exiled.\n{2}, {T}, Put a card exiled with Jester's Scepter into its owner's graveyard: Counter target spell if it has the same name as that card. diff --git a/forge-gui/res/cardsfolder/j/jet_medallion.txt b/forge-gui/res/cardsfolder/j/jet_medallion.txt index e9772a95674..418bcec5d99 100644 --- a/forge-gui/res/cardsfolder/j/jet_medallion.txt +++ b/forge-gui/res/cardsfolder/j/jet_medallion.txt @@ -2,7 +2,7 @@ Name:Jet Medallion ManaCost:2 Types:Artifact S:Mode$ ReduceCost | ValidCard$ Card.Black | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Black spells you cast cost {1} less to cast. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black SVar:Picture:http://www.wizards.com/global/images/magic/general/jet_medallion.jpg Oracle:Black spells you cast cost {1} less to cast. diff --git a/forge-gui/res/cardsfolder/j/jeweled_amulet.txt b/forge-gui/res/cardsfolder/j/jeweled_amulet.txt index cfdf9ab7dbc..1ff5f555ece 100644 --- a/forge-gui/res/cardsfolder/j/jeweled_amulet.txt +++ b/forge-gui/res/cardsfolder/j/jeweled_amulet.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ PutCounter | Cost$ 1 T | RememberCostMana$ True | CounterType$ CHARGE | CounterNum$ 1 | CheckSVar$ X | SVarCompare$ EQ0 | References$ X | SpellDescription$ Put a charge counter on CARDNAME. Note the type of mana spent to pay this activation cost. Activate this ability only if there are no charge counters on CARDNAME. SVar:X:Count$CardCounters.CHARGE A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ Special LastNotedType | SpellDescription$ Add one mana of CARDNAME's last noted type. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/jeweled_amulet.jpg Oracle:{1}, {T}: Put a charge counter on Jeweled Amulet. Note the type of mana spent to pay this activation cost. Activate this ability only if there are no charge counters on Jeweled Amulet.\n{T}, Remove a charge counter from Jeweled Amulet: Add one mana of Jeweled Amulet's last noted type. diff --git a/forge-gui/res/cardsfolder/j/jeweled_bird.txt b/forge-gui/res/cardsfolder/j/jeweled_bird.txt index 170c980b13a..040eb62527c 100644 --- a/forge-gui/res/cardsfolder/j/jeweled_bird.txt +++ b/forge-gui/res/cardsfolder/j/jeweled_bird.txt @@ -7,7 +7,7 @@ SVar:DBUnAnte:DB$ ChangeZoneAll | ConditionCheckSVar$ Y | ConditionSVarCompare$ SVar:DBDraw:DB$ Draw | ConditionCheckSVar$ Y | ConditionSVarCompare$ GT0 | Defined$ You | NumCards$ 1 | SubAbility$ DBCleanup | References$ Y SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Y:Remembered$Amount -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/jeweled_bird.jpg Oracle:Remove Jeweled Bird from your deck before playing if you're not playing for ante.\n{T}: Ante Jeweled Bird. If you do, put all other cards you own from the ante into your graveyard, then draw a card. diff --git a/forge-gui/res/cardsfolder/j/jeweled_spirit.txt b/forge-gui/res/cardsfolder/j/jeweled_spirit.txt index ea704e5bf54..5f6ba1f0eb5 100644 --- a/forge-gui/res/cardsfolder/j/jeweled_spirit.txt +++ b/forge-gui/res/cardsfolder/j/jeweled_spirit.txt @@ -4,6 +4,6 @@ Types:Creature Spirit PT:3/3 K:Flying A:AB$ Protection | Cost$ Sac<2/Land> | Gains$ Choice | Choices$ AnyColor,artifacts | SpellDescription$ CARDNAME gains protection from artifacts or from the color of your choice until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/jeweled_spirit.jpg Oracle:Flying\nSacrifice two lands: Jeweled Spirit gains protection from artifacts or from the color of your choice until end of turn. diff --git a/forge-gui/res/cardsfolder/j/jhoira_of_the_ghitu.txt b/forge-gui/res/cardsfolder/j/jhoira_of_the_ghitu.txt index 9765f504d2b..e658d3a656d 100644 --- a/forge-gui/res/cardsfolder/j/jhoira_of_the_ghitu.txt +++ b/forge-gui/res/cardsfolder/j/jhoira_of_the_ghitu.txt @@ -5,6 +5,6 @@ PT:2/2 A:AB$ PutCounter | Cost$ 2 ExileFromHand<1/Card.nonLand/nonland card> | CostDesc$ {2}, Exile a nonland card from your hand: | RememberCards$ True | Defined$ ExiledCards | CounterType$ TIME | CounterNum$ 4 | SubAbility$ GiveSuspend | TgtZone$ Exile | StackDescription$ Put four time counters on the exiled card. | SpellDescription$ Put four time counters on the exiled card. If it doesn't have suspend, it gains suspend. (At the beginning of your upkeep, remove a time counter from that card. When the last is removed, cast it without paying its mana cost. If it's a creature, it has haste.) SVar:GiveSuspend:DB$ PumpAll | ValidCards$ Card.IsRemembered+withoutSuspend | KW$ Suspend | PumpZone$ Exile | Permanent$ True | SubAbility$ DBCleanup | StackDescription$ If it doesn't have suspend, it gains suspend. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/jhoira_of_the_ghitu.jpg Oracle:{2}, Exile a nonland card from your hand: Put four time counters on the exiled card. If it doesn't have suspend, it gains suspend. (At the beginning of your upkeep, remove a time counter from that card. When the last is removed, cast it without paying its mana cost. If it's a creature, it has haste.) diff --git a/forge-gui/res/cardsfolder/j/jinx.txt b/forge-gui/res/cardsfolder/j/jinx.txt index 3d467dd07f1..805457ae5f2 100644 --- a/forge-gui/res/cardsfolder/j/jinx.txt +++ b/forge-gui/res/cardsfolder/j/jinx.txt @@ -5,6 +5,6 @@ A:SP$ ChooseType | Cost$ 1 U | Defined$ You | Type$ Basic Land | SubAbility$ DBA SVar:DBAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | SubAbility$ DelTrigSlowtrip SVar:DelTrigSlowtrip:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ DrawSlowtrip | TriggerDescription$ Draw a card. SVar:DrawSlowtrip:DB$Draw | NumCards$ 1 | Defined$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/jinx.jpg Oracle:Target land becomes the basic land type of your choice until end of turn.\nDraw a card at the beginning of the next turn's upkeep. diff --git a/forge-gui/res/cardsfolder/j/jinxed_choker.txt b/forge-gui/res/cardsfolder/j/jinxed_choker.txt index 93e3ecf610f..effef7f3c6a 100644 --- a/forge-gui/res/cardsfolder/j/jinxed_choker.txt +++ b/forge-gui/res/cardsfolder/j/jinxed_choker.txt @@ -10,6 +10,6 @@ SVar:X:Count$CardCounters.CHARGE A:AB$ PutCounter | Cost$ 3 | CounterType$ CHARGE | CounterNum$ 1 | AILogic$ Never | SpellDescription$ Put a charge counter on CARDNAME. A:AB$ RemoveCounter | Cost$ 3 | CounterType$ CHARGE | CounterNum$ 1 | AILogic$ EndOfOpponentsTurn | SpellDescription$ Remove a charge counter from CARDNAME. SVar:SacMe:4 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/jinxed_choker.jpg Oracle:At the beginning of your end step, target opponent gains control of Jinxed Choker and puts a charge counter on it.\nAt the beginning of your upkeep, Jinxed Choker deals damage to you equal to the number of charge counters on it.\n{3}: Put a charge counter on Jinxed Choker or remove one from it. diff --git a/forge-gui/res/cardsfolder/j/jinxed_idol.txt b/forge-gui/res/cardsfolder/j/jinxed_idol.txt index 05c24a9f47a..65d536bd198 100644 --- a/forge-gui/res/cardsfolder/j/jinxed_idol.txt +++ b/forge-gui/res/cardsfolder/j/jinxed_idol.txt @@ -5,6 +5,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E SVar:TrigDamage:DB$ DealDamage | Defined$ You | NumDmg$ 2 A:AB$ GainControl | Cost$ Sac<1/Creature> | Defined$ Self | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | SpellDescription$ Target opponent gains control of CARDNAME. SVar:SacMe:4 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/jinxed_idol.jpg Oracle:At the beginning of your upkeep, Jinxed Idol deals 2 damage to you.\nSacrifice a creature: Target opponent gains control of Jinxed Idol. diff --git a/forge-gui/res/cardsfolder/j/jinxed_ring.txt b/forge-gui/res/cardsfolder/j/jinxed_ring.txt index 50f4b18c842..050abce02e8 100644 --- a/forge-gui/res/cardsfolder/j/jinxed_ring.txt +++ b/forge-gui/res/cardsfolder/j/jinxed_ring.txt @@ -5,6 +5,6 @@ T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ SVar:TrigDamage:DB$ DealDamage | Defined$ You | NumDmg$ 1 A:AB$ GainControl | Cost$ Sac<1/Creature> | Defined$ Self | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | SpellDescription$ Target opponent gains control of CARDNAME. (This effect lasts indefinitely.) SVar:SacMe:4 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/jinxed_ring.jpg Oracle:Whenever a nontoken permanent is put into your graveyard from the battlefield, Jinxed Ring deals 1 damage to you.\nSacrifice a creature: Target opponent gains control of Jinxed Ring. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/j/jodah_archmage_eternal.txt b/forge-gui/res/cardsfolder/j/jodah_archmage_eternal.txt index e3e99c78b66..4d801c7c9bb 100644 --- a/forge-gui/res/cardsfolder/j/jodah_archmage_eternal.txt +++ b/forge-gui/res/cardsfolder/j/jodah_archmage_eternal.txt @@ -5,6 +5,6 @@ PT:4/3 K:Flying S:Mode$ Continuous | Affected$ Card.YouCtrl | AddKeyword$ Alternative Cost:W U B R G | AffectedZone$ Hand,Graveyard,Exile,Library,Command | Description$ You may pay {W}{U}{B}{R}{G} rather than pay the mana cost for spells that you cast. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/jodah_archmage_eternal.jpg Oracle:Flying\nYou may pay {W}{U}{B}{R}{G} rather than pay the mana cost for spells that you cast. diff --git a/forge-gui/res/cardsfolder/j/johan.txt b/forge-gui/res/cardsfolder/j/johan.txt index ba7f694d077..afece1170bb 100644 --- a/forge-gui/res/cardsfolder/j/johan.txt +++ b/forge-gui/res/cardsfolder/j/johan.txt @@ -7,6 +7,6 @@ SVar:TrigCantAttack:DB$ Pump | KW$ CARDNAME can't attack. | UntilEndOfCombat$ Tr SVar:DBEffect:DB$ Effect | StaticAbilities$ STVigilance | ImprintCards$ Self | SVars$ JohanUntap | Duration$ UntilEndOfCombat SVar:STVigilance:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl | AddHiddenKeyword$ Attacking doesn't cause CARDNAME to tap. | CheckSVar$ JohanUntap | Description$ Attacking doesn't cause creatures you control to tap this combat if Johan is untapped. SVar:JohanUntap:Count$Valid Card.IsImprinted+untapped -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/johan.jpg Oracle:At the beginning of combat on your turn, you may have Johan gain "Johan can't attack" until end of combat. If you do, attacking doesn't cause creatures you control to tap this combat if Johan is untapped. diff --git a/forge-gui/res/cardsfolder/j/jokulhaups.txt b/forge-gui/res/cardsfolder/j/jokulhaups.txt index a5b11de6d0a..8090c1f47f9 100644 --- a/forge-gui/res/cardsfolder/j/jokulhaups.txt +++ b/forge-gui/res/cardsfolder/j/jokulhaups.txt @@ -2,6 +2,6 @@ Name:Jokulhaups ManaCost:4 R R Types:Sorcery A:SP$ DestroyAll | Cost$ 4 R R | ValidCards$ Artifact,Creature,Land | NoRegen$ True | SpellDescription$ Destroy all artifacts, creatures, and lands. They can't be regenerated. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://resources.wizards.com/magic/cards/6e/en-us/card14653.jpg Oracle:Destroy all artifacts, creatures, and lands. They can't be regenerated. diff --git a/forge-gui/res/cardsfolder/j/jolt.txt b/forge-gui/res/cardsfolder/j/jolt.txt index 135e79e8bad..6f2726e2a4d 100644 --- a/forge-gui/res/cardsfolder/j/jolt.txt +++ b/forge-gui/res/cardsfolder/j/jolt.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ TapOrUntap | Cost$ 2 U | ValidTgts$ Artifact,Creature,Land | TgtPrompt$ Select target artifact, creature, or land | SubAbility$ DelTrigSlowtrip | SpellDescription$ You may tap or untap target artifact, creature, or land. Draw a card at the beginning of the next turn's upkeep. SVar:DelTrigSlowtrip:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ DrawSlowtrip | TriggerDescription$ Draw a card. SVar:DrawSlowtrip:DB$Draw | NumCards$ 1 | Defined$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/jolt.jpg Oracle:You may tap or untap target artifact, creature, or land.\nDraw a card at the beginning of the next turn's upkeep. diff --git a/forge-gui/res/cardsfolder/j/jolting_merfolk.txt b/forge-gui/res/cardsfolder/j/jolting_merfolk.txt index c5064146c3f..e36eaee4606 100644 --- a/forge-gui/res/cardsfolder/j/jolting_merfolk.txt +++ b/forge-gui/res/cardsfolder/j/jolting_merfolk.txt @@ -4,6 +4,6 @@ Types:Creature Merfolk PT:2/2 K:Fading:4 A:AB$ Tap | Cost$ SubCounter<1/FADE> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/jolting_merfolk.jpg Oracle:Fading 4 (This creature enters the battlefield with four fade counters on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it.)\nRemove a fade counter from Jolting Merfolk: Tap target creature. diff --git a/forge-gui/res/cardsfolder/j/joraga_bard.txt b/forge-gui/res/cardsfolder/j/joraga_bard.txt index def0da3d9f0..1af56f0467c 100644 --- a/forge-gui/res/cardsfolder/j/joraga_bard.txt +++ b/forge-gui/res/cardsfolder/j/joraga_bard.txt @@ -7,6 +7,6 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Ally.O SVar:TrigPump:DB$PumpAll | ValidCards$ Ally.YouCtrl | KW$ Vigilance SVar:PlayMain1:TRUE SVar:BuffedBy:Ally -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/joraga_bard.jpg Oracle:Whenever Joraga Bard or another Ally enters the battlefield under your control, you may have Ally creatures you control gain vigilance until end of turn. diff --git a/forge-gui/res/cardsfolder/j/joraga_warcaller.txt b/forge-gui/res/cardsfolder/j/joraga_warcaller.txt index 082d690bc48..bc591efe5c3 100644 --- a/forge-gui/res/cardsfolder/j/joraga_warcaller.txt +++ b/forge-gui/res/cardsfolder/j/joraga_warcaller.txt @@ -7,7 +7,7 @@ K:etbCounter:P1P1:XKicked:no condition:CARDNAME enters the battlefield with a +1 S:Mode$ Continuous | Affected$ Creature.Elf+Other+YouCtrl | AddPower$ X | AddToughness$ X | Description$ Other Elf creatures you control get +1/+1 for each +1/+1 counter on CARDNAME. SVar:X:Count$CardCounters.P1P1 SVar:XKicked:Count$TimesKicked -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Elf DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/joraga_warcaller.jpg diff --git a/forge-gui/res/cardsfolder/j/jorubai_murk_lurker.txt b/forge-gui/res/cardsfolder/j/jorubai_murk_lurker.txt index 0d4ad29329f..f7dac3984e3 100644 --- a/forge-gui/res/cardsfolder/j/jorubai_murk_lurker.txt +++ b/forge-gui/res/cardsfolder/j/jorubai_murk_lurker.txt @@ -6,7 +6,7 @@ S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 1 | AddToughness$ 1 | Check SVar:X:Count$Valid Swamp.YouCtrl A:AB$ Pump | Cost$ 1 B | ValidTgts$ Creature | KW$ Lifelink | SpellDescription$ Target creature gains lifelink until end of turn. SVar:BuffedBy:Swamp -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black SVar:Picture:http://www.wizards.com/global/images/magic/general/jorubai_murk_lurker.jpg Oracle:Jorubai Murk Lurker gets +1/+1 as long as you control a Swamp.\n{1}{B}: Target creature gains lifelink until end of turn. (Damage dealt by the creature also causes its controller to gain that much life.) diff --git a/forge-gui/res/cardsfolder/j/journey_of_discovery.txt b/forge-gui/res/cardsfolder/j/journey_of_discovery.txt index 4f62928babd..44033faf6eb 100644 --- a/forge-gui/res/cardsfolder/j/journey_of_discovery.txt +++ b/forge-gui/res/cardsfolder/j/journey_of_discovery.txt @@ -6,6 +6,6 @@ A:SP$ Charm | Cost$ 2 G | Choices$ DBChangeZone,DBEffect | CharmNum$ 1 SVar:DBChangeZone:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeNum$ 2 | SpellDescription$ Search your library for up to two basic land cards, reveal them, put them into your hand, then shuffle your library. SVar:DBEffect:DB$ Effect | Name$ Journey of Discovery Effect | StaticAbilities$ JourneyOfDis | AILogic$ Always | SpellDescription$ You may play up to two additional lands this turn. SVar:JourneyOfDis:Mode$ Continuous | Affected$ You | AddKeyword$ AdjustLandPlays:2 | EffectZone$ Command | Description$ You may play two additional lands this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/journey_of_discovery.jpg Oracle:Choose one —\n• Search your library for up to two basic land cards, reveal them, put them into your hand, then shuffle your library.\n• You may play up to two additional lands this turn.\nEntwine {2}{G} (Choose both if you pay the entwine cost.) diff --git a/forge-gui/res/cardsfolder/j/jovial_evil.txt b/forge-gui/res/cardsfolder/j/jovial_evil.txt index 97265b61742..bae62f6f887 100644 --- a/forge-gui/res/cardsfolder/j/jovial_evil.txt +++ b/forge-gui/res/cardsfolder/j/jovial_evil.txt @@ -3,6 +3,6 @@ ManaCost:2 B Types:Sorcery A:SP$ DealDamage | Cost$ 2 B | ValidTgts$ Opponent | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals X damage to target opponent, where X is twice the number of white creatures that player controls. SVar:X:Count$Valid Creature.White+TargetedPlayerCtrl/Twice -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/jovial_evil.jpg Oracle:Jovial Evil deals X damage to target opponent, where X is twice the number of white creatures that player controls. diff --git a/forge-gui/res/cardsfolder/j/judge_unworthy.txt b/forge-gui/res/cardsfolder/j/judge_unworthy.txt index 3c9c1034782..808763223d1 100644 --- a/forge-gui/res/cardsfolder/j/judge_unworthy.txt +++ b/forge-gui/res/cardsfolder/j/judge_unworthy.txt @@ -5,6 +5,6 @@ A:SP$Scry | Cost$ 1 W | ScryNum$ 3 | SubAbility$ DBReveal | SpellDescription$ Ch SVar:DBReveal:DB$ Dig | DigNum$ 1 | Reveal$ True | DestinationZone$ Library | LibraryPosition$ 0 | SubAbility$ DBDamage SVar:DBDamage:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | References$ X SVar:X:Count$TopOfLibraryCMC -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/judge_unworthy.jpg Oracle:Choose target attacking or blocking creature. Scry 3, then reveal the top card of your library. Judge Unworthy deals damage equal to that card's converted mana cost to that creature. (To scry 3, look at the top three cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) diff --git a/forge-gui/res/cardsfolder/j/juju_bubble.txt b/forge-gui/res/cardsfolder/j/juju_bubble.txt index 968ed9ce498..54d3aa9fe84 100644 --- a/forge-gui/res/cardsfolder/j/juju_bubble.txt +++ b/forge-gui/res/cardsfolder/j/juju_bubble.txt @@ -6,7 +6,7 @@ A:AB$ GainLife | Cost$ 2 | Defined$ You | LifeAmount$ 1 | SpellDescription$ You T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ When you play a card, sacrifice CARDNAME. T:Mode$ LandPlayed | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigSac | Secondary$ True | TriggerDescription$ When you play a card, sacrifice CARDNAME. SVar:TrigSac:AB$Sacrifice | Cost$ 0 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/juju_bubble.jpg Oracle:Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nWhen you play a card, sacrifice Juju Bubble.\n{2}: You gain 1 life. diff --git a/forge-gui/res/cardsfolder/j/jund_charm.txt b/forge-gui/res/cardsfolder/j/jund_charm.txt index 4065a9390a6..0db02309277 100644 --- a/forge-gui/res/cardsfolder/j/jund_charm.txt +++ b/forge-gui/res/cardsfolder/j/jund_charm.txt @@ -5,6 +5,6 @@ A:SP$ Charm | Cost$ B R G | Choices$ DBChangeZone,DBDmg,DBPutCounter | CharmNum$ SVar:DBChangeZone:DB$ ChangeZoneAll | ValidTgts$ Player | TgtPrompt$ Select target player | ChangeType$ Card | Origin$ Graveyard | Destination$ Exile | SpellDescription$ Exile all cards from target player's graveyard. SVar:DBDmg:DB$ DamageAll | NumDmg$ 2 | ValidCards$ Creature | SpellDescription$ CARDNAME deals 2 damage to each creature. SVar:DBPutCounter:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 2 | SpellDescription$ Put two +1/+1 counters on target creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/jund_charm.jpg Oracle:Choose one —\n• Exile all cards from target player's graveyard.\n• Jund Charm deals 2 damage to each creature.\n• Put two +1/+1 counters on target creature. diff --git a/forge-gui/res/cardsfolder/j/juniper_order_advocate.txt b/forge-gui/res/cardsfolder/j/juniper_order_advocate.txt index cf74fe8309e..7c117d67bbb 100644 --- a/forge-gui/res/cardsfolder/j/juniper_order_advocate.txt +++ b/forge-gui/res/cardsfolder/j/juniper_order_advocate.txt @@ -5,7 +5,7 @@ PT:1/2 S:Mode$ Continuous | Affected$ Creature.Green+YouCtrl | AddPower$ 1 | AddToughness$ 1 | CheckSVar$ X | SVarCompare$ EQ1 | Description$ As long as CARDNAME is untapped, green creatures you control get +1/+1. SVar:X:Count$Valid Card.Self+untapped SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Green DeckHints:Color$Green SVar:Picture:http://www.wizards.com/global/images/magic/general/juniper_order_advocate.jpg diff --git a/forge-gui/res/cardsfolder/j/junk_golem.txt b/forge-gui/res/cardsfolder/j/junk_golem.txt index 5f7fdfbb6d5..1aafcd12f17 100644 --- a/forge-gui/res/cardsfolder/j/junk_golem.txt +++ b/forge-gui/res/cardsfolder/j/junk_golem.txt @@ -6,6 +6,6 @@ K:etbCounter:P1P1:3 K:UpkeepCost:SubCounter<1/P1P1> SVar:TrigSac:DB$ Sacrifice | Defined$ Self | UnlessCost$ SubCounter<1/P1P1> | UnlessPayer$ You A:AB$ PutCounter | Cost$ 1 Discard<1/Card> | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on CARDNAME. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/junk_golem.jpg Oracle:Junk Golem enters the battlefield with three +1/+1 counters on it.\nAt the beginning of your upkeep, sacrifice Junk Golem unless you remove a +1/+1 counter from it.\n{1}, Discard a card: Put a +1/+1 counter on Junk Golem. diff --git a/forge-gui/res/cardsfolder/j/junkyo_bell.txt b/forge-gui/res/cardsfolder/j/junkyo_bell.txt index 8ee84f69e03..7513990d077 100644 --- a/forge-gui/res/cardsfolder/j/junkyo_bell.txt +++ b/forge-gui/res/cardsfolder/j/junkyo_bell.txt @@ -4,6 +4,6 @@ Types:Artifact T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may have target creature you control get +X/+X until end of turn, where X is the number of creatures you control. If you do, sacrifice that creature at the beginning of the next end step. SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | NumAtt$ +X | NumDef$ +X | References$ X | AtEOT$ Sacrifice SVar:X:Count$Valid Creature.YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/junkyo_bell.jpg Oracle:At the beginning of your upkeep, you may have target creature you control get +X/+X until end of turn, where X is the number of creatures you control. If you do, sacrifice that creature at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/j/juntu_stakes.txt b/forge-gui/res/cardsfolder/j/juntu_stakes.txt index 1959b6628c9..8d37e6339d2 100644 --- a/forge-gui/res/cardsfolder/j/juntu_stakes.txt +++ b/forge-gui/res/cardsfolder/j/juntu_stakes.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact S:Mode$ Continuous | Affected$ Creature.powerLE1 | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Creatures with power 1 or less don't untap during their controllers' untap steps. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/juntu_stakes.jpg Oracle:Creatures with power 1 or less don't untap during their controllers' untap steps. diff --git a/forge-gui/res/cardsfolder/j/justice.txt b/forge-gui/res/cardsfolder/j/justice.txt index 615e57e758d..b4264e313de 100644 --- a/forge-gui/res/cardsfolder/j/justice.txt +++ b/forge-gui/res/cardsfolder/j/justice.txt @@ -5,6 +5,6 @@ K:UpkeepCost:W W T:Mode$ DamageDealtOnce | ValidSource$ Card.Red | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever a red creature or spell deals damage, CARDNAME deals that much damage to that creature's or spell's controller. SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredSourceController | NumDmg$ X | References$ X SVar:X:TriggerCount$DamageAmount -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/justice.jpg Oracle:At the beginning of your upkeep, sacrifice Justice unless you pay {W}{W}.\nWhenever a red creature or spell deals damage, Justice deals that much damage to that creature's or spell's controller. diff --git a/forge-gui/res/cardsfolder/j/juxtapose.txt b/forge-gui/res/cardsfolder/j/juxtapose.txt index e5ce5a364ca..07faf62f196 100644 --- a/forge-gui/res/cardsfolder/j/juxtapose.txt +++ b/forge-gui/res/cardsfolder/j/juxtapose.txt @@ -13,6 +13,6 @@ SVar:X:Count$HighestCMC_Creature.YouCtrl+inZoneBattlefield SVar:Y:Count$HighestCMC_Creature.TargetedPlayerCtrl+inZoneBattlefield SVar:Z:Count$HighestCMC_Artifact.YouCtrl+inZoneBattlefield SVar:W:Count$HighestCMC_Artifact.TargetedPlayerCtrl+inZoneBattlefield -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/juxtapose.jpg Oracle:You and target player exchange control of the creature you each control with the highest converted mana cost. Then exchange control of artifacts the same way. If two or more permanents a player controls are tied for highest cost, their controller chooses one of them. diff --git a/forge-gui/res/cardsfolder/j/jwari_shapeshifter.txt b/forge-gui/res/cardsfolder/j/jwari_shapeshifter.txt index 7f577e6cf89..cba7d1f9bf5 100644 --- a/forge-gui/res/cardsfolder/j/jwari_shapeshifter.txt +++ b/forge-gui/res/cardsfolder/j/jwari_shapeshifter.txt @@ -4,6 +4,6 @@ Types:Creature Shapeshifter Ally PT:0/0 K:ETBReplacement:Copy:DBCopy:Optional SVar:DBCopy:DB$ Clone | Choices$ Creature.Ally+Other | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any Ally creature on the battlefield. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/jwari_shapeshifter.jpg Oracle:You may have Jwari Shapeshifter enter the battlefield as a copy of any Ally creature on the battlefield. diff --git a/forge-gui/res/cardsfolder/k/kaboom.txt b/forge-gui/res/cardsfolder/k/kaboom.txt index b65f6bca5db..f5276298bb9 100644 --- a/forge-gui/res/cardsfolder/k/kaboom.txt +++ b/forge-gui/res/cardsfolder/k/kaboom.txt @@ -7,6 +7,6 @@ SVar:DBDmg:DB$ DealDamage | Defined$ Player.IsRemembered | NumDmg$ X | Reference SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True SVar:X:Remembered$CardManaCost SVar:Maxplayer:PlayerCountPlayers$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kaboom!.jpg Oracle:Choose any number of target players. For each of those players, reveal cards from the top of your library until you reveal a nonland card, Kaboom! deals damage equal to that card's converted mana cost to that player, then you put the revealed cards on the bottom of your library in any order. diff --git a/forge-gui/res/cardsfolder/k/kaerveks_spite.txt b/forge-gui/res/cardsfolder/k/kaerveks_spite.txt index a7b149ab90a..f45f1648e60 100644 --- a/forge-gui/res/cardsfolder/k/kaerveks_spite.txt +++ b/forge-gui/res/cardsfolder/k/kaerveks_spite.txt @@ -2,6 +2,6 @@ Name:Kaervek's Spite ManaCost:B B B Types:Instant A:SP$LoseLife | Cost$ B B B Sac Discard<0/Hand> | ValidTgts$ Player | LifeAmount$ 5 | CostDesc$ As an additional cost to cast Kaervek's Spite, sacrifice all permanents you control and discard your hand. | SpellDescription$ Target player loses 5 life. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kaerveks_spite.jpg Oracle:As an additional cost to cast Kaervek's Spite, sacrifice all permanents you control and discard your hand.\nTarget player loses 5 life. diff --git a/forge-gui/res/cardsfolder/k/kagemaro_first_to_suffer.txt b/forge-gui/res/cardsfolder/k/kagemaro_first_to_suffer.txt index 765369a1c6d..db1a344cf1f 100644 --- a/forge-gui/res/cardsfolder/k/kagemaro_first_to_suffer.txt +++ b/forge-gui/res/cardsfolder/k/kagemaro_first_to_suffer.txt @@ -5,6 +5,6 @@ PT:*/* S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ CARDNAME's power and toughness are each equal to the number of cards in your hand. A:AB$ PumpAll | Cost$ B Sac<1/CARDNAME> | ValidCards$ Creature | NumAtt$ -X | NumDef$ -X | IsCurse$ True | References$ X | SpellDescription$ All creatures get -X/-X until end of turn, where X is the number of cards in your hand. SVar:X:Count$InYourHand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kagemaro_first_to_suffer.jpg Oracle:Kagemaro, First to Suffer's power and toughness are each equal to the number of cards in your hand.\n{B}, Sacrifice Kagemaro: All creatures get -X/-X until end of turn, where X is the number of cards in your hand. diff --git a/forge-gui/res/cardsfolder/k/kagemaros_clutch.txt b/forge-gui/res/cardsfolder/k/kagemaros_clutch.txt index 52b70642a05..77138caf9fe 100644 --- a/forge-gui/res/cardsfolder/k/kagemaros_clutch.txt +++ b/forge-gui/res/cardsfolder/k/kagemaros_clutch.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ 3 B | ValidTgts$ Creature | AILogic$ Curse S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ -X | AddToughness$ -X | Description$ Enchanted creature gets -X/-X, where X is the number of cards in your hand. SVar:X:Count$InYourHand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kagemaros_clutch.jpg Oracle:Enchant creature\nEnchanted creature gets -X/-X, where X is the number of cards in your hand. diff --git a/forge-gui/res/cardsfolder/k/kaho_minamo_historian.txt b/forge-gui/res/cardsfolder/k/kaho_minamo_historian.txt index 6aa5f8a1bab..f266e634d2f 100644 --- a/forge-gui/res/cardsfolder/k/kaho_minamo_historian.txt +++ b/forge-gui/res/cardsfolder/k/kaho_minamo_historian.txt @@ -11,6 +11,6 @@ SVar:ForgetCard:DB$ Cleanup | ForgetDefined$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kaho_minamo_historian.jpg Oracle:When Kaho, Minamo Historian enters the battlefield, search your library for up to three instant cards and exile them. Then shuffle your library.\n{X}, {T}: You may cast a card with converted mana cost X exiled with Kaho without paying its mana cost. diff --git a/forge-gui/res/cardsfolder/k/kaleidostone.txt b/forge-gui/res/cardsfolder/k/kaleidostone.txt index dcbd54a65b6..4535663342a 100644 --- a/forge-gui/res/cardsfolder/k/kaleidostone.txt +++ b/forge-gui/res/cardsfolder/k/kaleidostone.txt @@ -4,6 +4,6 @@ Types:Artifact T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 A:AB$ Mana | Cost$ 5 T Sac<1/CARDNAME> | Produced$ W U B R G | SpellDescription$ Add {W}{U}{B}{R}{G}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kaleidostone.jpg Oracle:When Kaleidostone enters the battlefield, draw a card.\n{5}, {T}, Sacrifice Kaleidostone: Add {W}{U}{B}{R}{G}. diff --git a/forge-gui/res/cardsfolder/k/kamahls_summons.txt b/forge-gui/res/cardsfolder/k/kamahls_summons.txt index 8a84de93ba3..78e4be4e64d 100644 --- a/forge-gui/res/cardsfolder/k/kamahls_summons.txt +++ b/forge-gui/res/cardsfolder/k/kamahls_summons.txt @@ -9,6 +9,6 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$ValidHand Card.IsRemembered+RememberedPlayerCtrl SVar:NeedsToPlayVar:Y GE3 SVar:Y:Count$ValidHand Creature.YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kamahls_summons.jpg Oracle:Each player may reveal any number of creature cards from their hand. Then each player creates a 2/2 green Bear creature token for each card they revealed this way. diff --git a/forge-gui/res/cardsfolder/k/kambal_consul_of_allocation.txt b/forge-gui/res/cardsfolder/k/kambal_consul_of_allocation.txt index c23a8022fe1..0f600326829 100644 --- a/forge-gui/res/cardsfolder/k/kambal_consul_of_allocation.txt +++ b/forge-gui/res/cardsfolder/k/kambal_consul_of_allocation.txt @@ -5,6 +5,6 @@ Types:Legendary Creature Human Advisor T:Mode$ SpellCast | ValidCard$ Card.nonCreature | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDrain | TriggerDescription$ Whenever an opponent casts a noncreature spell, that player loses 2 life and you gain 2 life. SVar:TrigDrain:DB$ LoseLife | Defined$ TriggeredActivator | LifeAmount$ 2 | SubAbility$ DBGainLife SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/kambal_consul_of_allocation.jpg Oracle:Whenever an opponent casts a noncreature spell, that player loses 2 life and you gain 2 life. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/k/kami_of_ancient_law.txt b/forge-gui/res/cardsfolder/k/kami_of_ancient_law.txt index 37294064a0a..815e07d9d20 100644 --- a/forge-gui/res/cardsfolder/k/kami_of_ancient_law.txt +++ b/forge-gui/res/cardsfolder/k/kami_of_ancient_law.txt @@ -3,6 +3,6 @@ ManaCost:1 W Types:Creature Spirit PT:2/2 A:AB$ Destroy | Cost$ Sac<1/CARDNAME> | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | SpellDescription$ Destroy target enchantment. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kami_of_ancient_law.jpg Oracle:Sacrifice Kami of Ancient Law: Destroy target enchantment. diff --git a/forge-gui/res/cardsfolder/k/kami_of_the_painted_road.txt b/forge-gui/res/cardsfolder/k/kami_of_the_painted_road.txt index 908c992c4ae..0e188dae3f7 100644 --- a/forge-gui/res/cardsfolder/k/kami_of_the_painted_road.txt +++ b/forge-gui/res/cardsfolder/k/kami_of_the_painted_road.txt @@ -4,7 +4,7 @@ Types:Creature Spirit PT:3/3 T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigProtect | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, CARDNAME gains protection from the color of your choice until end of turn. SVar:TrigProtect:DB$ Protection | Defined$ Self | Gains$ Choice | Choices$ AnyColor -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:BuffedBy:Arcane,Spirit DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/kami_of_the_painted_road.jpg diff --git a/forge-gui/res/cardsfolder/k/kami_of_the_waning_moon.txt b/forge-gui/res/cardsfolder/k/kami_of_the_waning_moon.txt index 0a38564965b..3c045d248b5 100644 --- a/forge-gui/res/cardsfolder/k/kami_of_the_waning_moon.txt +++ b/forge-gui/res/cardsfolder/k/kami_of_the_waning_moon.txt @@ -6,7 +6,7 @@ K:Flying T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, target creature gains fear until end of turn. (It can't be blocked except by artifact creatures and/or black creatures.) SVar:TrigPump:DB$Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Fear SVar:BuffedBy:Arcane,Spirit -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/kami_of_the_waning_moon.jpg Oracle:Flying\nWhenever you cast a Spirit or Arcane spell, target creature gains fear until end of turn. (It can't be blocked except by artifact creatures and/or black creatures.) diff --git a/forge-gui/res/cardsfolder/k/karma.txt b/forge-gui/res/cardsfolder/k/karma.txt index 6e3a9082c64..087114b53cb 100644 --- a/forge-gui/res/cardsfolder/k/karma.txt +++ b/forge-gui/res/cardsfolder/k/karma.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of each player's upkeep, CARDNAME deals damage to that player equal to the number of Swamps they control. SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredPlayer | NumDmg$ X | References$ X SVar:X:Count$Valid Swamp.ActivePlayerCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/karma.jpg Oracle:At the beginning of each player's upkeep, Karma deals damage to that player equal to the number of Swamps they control. diff --git a/forge-gui/res/cardsfolder/k/karn_silver_golem.txt b/forge-gui/res/cardsfolder/k/karn_silver_golem.txt index 1ccc3243e06..b177a4c8799 100644 --- a/forge-gui/res/cardsfolder/k/karn_silver_golem.txt +++ b/forge-gui/res/cardsfolder/k/karn_silver_golem.txt @@ -7,6 +7,6 @@ T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigPump | Secondary$ True | Tr SVar:TrigPump:DB$Pump | Defined$ Self | NumAtt$ -4 | NumDef$ 4 A:AB$ Animate | Cost$ 1 | ValidTgts$ Artifact.nonCreature | TgtPrompt$ Select target noncreature artifact | Power$ X | Toughness$ X | Types$ Artifact,Creature | References$ X | SpellDescription$ Target noncreature artifact becomes an artifact creature with power and toughness each equal to its converted mana cost until end of turn. SVar:X:Targeted$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/karn_silver_golem.jpg Oracle:Whenever Karn, Silver Golem blocks or becomes blocked, it gets -4/+4 until end of turn.\n{1}: Target noncreature artifact becomes an artifact creature with power and toughness each equal to its converted mana cost until end of turn. diff --git a/forge-gui/res/cardsfolder/k/karns_touch.txt b/forge-gui/res/cardsfolder/k/karns_touch.txt index a814d8c49d8..d8efcd9c3f2 100644 --- a/forge-gui/res/cardsfolder/k/karns_touch.txt +++ b/forge-gui/res/cardsfolder/k/karns_touch.txt @@ -3,6 +3,6 @@ ManaCost:U U Types:Instant A:SP$ Animate | Cost$ U U | ValidTgts$ Artifact.nonCreature | TgtPrompt$ Select noncreature artifact | Power$ X | Toughness$ X | Types$ Artifact,Creature | References$ X | SpellDescription$ Target noncreature artifact becomes an artifact creature with power and toughness each equal to its converted mana cost until end of turn. (It retains its abilities.) SVar:X:Targeted$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/karns_touch.jpg Oracle:Target noncreature artifact becomes an artifact creature with power and toughness each equal to its converted mana cost until end of turn. (It retains its abilities.) diff --git a/forge-gui/res/cardsfolder/k/karonas_zealot.txt b/forge-gui/res/cardsfolder/k/karonas_zealot.txt index 4fb0442abbe..f39d990cbea 100644 --- a/forge-gui/res/cardsfolder/k/karonas_zealot.txt +++ b/forge-gui/res/cardsfolder/k/karonas_zealot.txt @@ -7,6 +7,6 @@ T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ KaronaEffect | TriggerZones SVar:KaronaEffect:DB$ Effect | ValidTgts$ Creature | TgtPrompt$ Select target creature to redirect the damage to | ReplacementEffects$ ZealotDamage | SVars$ MirrorStrikeDmg | Duration$ HostLeavesOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield SVar:ZealotDamage:Event$ DamageDone | ValidTarget$ Creature.EffectSource | ReplaceWith$ MirrorStrikeDmg | DamageTarget$ Remembered | Description$ All damage that would be dealt to Karona's Zealot this turn is dealt to target creature instead. SVar:MirrorStrikeDmg:DB$ ReplaceEffect | VarName$ Affected | VarValue$ Remembered | VarType$ Card -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/karonas_zealot.jpg Oracle:Morph {3}{W}{W} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.)\nWhen Karona's Zealot is turned face up, all damage that would be dealt to it this turn is dealt to target creature instead. diff --git a/forge-gui/res/cardsfolder/k/karplusan_giant.txt b/forge-gui/res/cardsfolder/k/karplusan_giant.txt index 5f881f1928f..c24f49f9403 100644 --- a/forge-gui/res/cardsfolder/k/karplusan_giant.txt +++ b/forge-gui/res/cardsfolder/k/karplusan_giant.txt @@ -3,6 +3,6 @@ ManaCost:6 R Types:Creature Giant PT:3/3 A:AB$ Pump | Cost$ tapXType<1/Land.Snow/snow land> | NumAtt$ +1 | NumDef$ +1 | CostDesc$ Tap an untapped snow land you control: | SpellDescription$ Karplusan Giant gets +1/+1 until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/karplusan_giant.jpg Oracle:Tap an untapped snow land you control: Karplusan Giant gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/k/karplusan_minotaur.txt b/forge-gui/res/cardsfolder/k/karplusan_minotaur.txt index 9a7a616f3bf..2d936302bfe 100644 --- a/forge-gui/res/cardsfolder/k/karplusan_minotaur.txt +++ b/forge-gui/res/cardsfolder/k/karplusan_minotaur.txt @@ -7,6 +7,6 @@ T:Mode$ FlippedCoin | ValidPlayer$ You | ValidResult$ Win | TriggerZones$ Battle SVar:TrigYouDmg:DB$ DealDamage | NumDmg$ 1 | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target T:Mode$ FlippedCoin | ValidPlayer$ You | ValidResult$ Lose | TriggerZones$ Battlefield | Execute$ TrigOppDmg | TriggerDescription$ Whenever you lose a coin flip, CARDNAME deals 1 damage to any target of an opponent's choice. SVar:TrigOppDmg:DB$ DealDamage | NumDmg$ 1 | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | TargetingPlayer$ Opponent -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/karplusan_minotaur.jpg Oracle:Cumulative upkeep—Flip a coin. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nWhenever you win a coin flip, Karplusan Minotaur deals 1 damage to any target.\nWhenever you lose a coin flip, Karplusan Minotaur deals 1 damage to any target of an opponent's choice. diff --git a/forge-gui/res/cardsfolder/k/katabatic_winds.txt b/forge-gui/res/cardsfolder/k/katabatic_winds.txt index 179b81c2bbd..28f56769d5d 100644 --- a/forge-gui/res/cardsfolder/k/katabatic_winds.txt +++ b/forge-gui/res/cardsfolder/k/katabatic_winds.txt @@ -4,6 +4,6 @@ Types:Enchantment K:Phasing S:Mode$ Continuous | Affected$ Creature.withFlying | AddHiddenKeyword$ CARDNAME can't attack or block. | Description$ Creatures with flying can't attack or block, and their activated abilities with {T} in their costs can't be activated. S:Mode$ CantBeActivated | ValidCard$ Creature.withFlying | AffectedZone$ Battlefield | TapAbility$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/katabatic_winds.jpg Oracle:Phasing (This phases in or out before you untap during each of your untap steps. While it's phased out, it's treated as though it doesn't exist.)\nCreatures with flying can't attack or block, and their activated abilities with {T} in their costs can't be activated. diff --git a/forge-gui/res/cardsfolder/k/kataki_wars_wage.txt b/forge-gui/res/cardsfolder/k/kataki_wars_wage.txt index ac02b0f5081..7f1cd548333 100644 --- a/forge-gui/res/cardsfolder/k/kataki_wars_wage.txt +++ b/forge-gui/res/cardsfolder/k/kataki_wars_wage.txt @@ -3,6 +3,6 @@ ManaCost:1 W Types:Legendary Creature Spirit PT:2/1 S:Mode$ Continuous | Affected$ Artifact | AddKeyword$ UpkeepCost:1 | Description$ All artifacts have "At the beginning of your upkeep, sacrifice this artifact unless you pay {1}." -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/kataki_wars_wage.jpg Oracle:All artifacts have "At the beginning of your upkeep, sacrifice this artifact unless you pay {1}." diff --git a/forge-gui/res/cardsfolder/k/kavu_glider.txt b/forge-gui/res/cardsfolder/k/kavu_glider.txt index c330e16f250..c0f2c253d4c 100644 --- a/forge-gui/res/cardsfolder/k/kavu_glider.txt +++ b/forge-gui/res/cardsfolder/k/kavu_glider.txt @@ -4,7 +4,7 @@ Types:Creature Kavu PT:2/1 A:AB$ Pump | Cost$ W | NumDef$ +1 | SpellDescription$ CARDNAME gets +0/+1 until end of turn. A:AB$ Pump | Cost$ U | Defined$ Self | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$White|Blue SVar:Picture:http://www.wizards.com/global/images/magic/general/kavu_glider.jpg Oracle:{W}: Kavu Glider gets +0/+1 until end of turn.\n{U}: Kavu Glider gains flying until end of turn. diff --git a/forge-gui/res/cardsfolder/k/kavu_lair.txt b/forge-gui/res/cardsfolder/k/kavu_lair.txt index 23bfc69dc48..1524555e120 100644 --- a/forge-gui/res/cardsfolder/k/kavu_lair.txt +++ b/forge-gui/res/cardsfolder/k/kavu_lair.txt @@ -3,6 +3,6 @@ ManaCost:2 G Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.powerGE4 | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever a creature with power 4 or greater enters the battlefield, its controller draws a card. SVar:TrigDraw:DB$Draw | Defined$ TriggeredCardController | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/kavu_lair.jpg Oracle:Whenever a creature with power 4 or greater enters the battlefield, its controller draws a card. diff --git a/forge-gui/res/cardsfolder/k/kavu_recluse.txt b/forge-gui/res/cardsfolder/k/kavu_recluse.txt index b5b208fc5bf..a1852cb6e59 100644 --- a/forge-gui/res/cardsfolder/k/kavu_recluse.txt +++ b/forge-gui/res/cardsfolder/k/kavu_recluse.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Creature Kavu PT:2/2 A:AB$Animate | Cost$ T | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Forest | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | SpellDescription$ Target land becomes a Forest until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kavu_recluse.jpg Oracle:{T}: Target land becomes a Forest until end of turn. diff --git a/forge-gui/res/cardsfolder/k/kavu_scout.txt b/forge-gui/res/cardsfolder/k/kavu_scout.txt index e584be26d9b..90e29f78450 100644 --- a/forge-gui/res/cardsfolder/k/kavu_scout.txt +++ b/forge-gui/res/cardsfolder/k/kavu_scout.txt @@ -5,6 +5,6 @@ PT:0/2 S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | Description$ Domain — CARDNAME gets +1/+0 for each basic land type among lands you control. SVar:X:Count$Domain SVar:BuffedBy:Plains,Island,Swamp,Mountain,Forest -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/kavu_scout.jpg Oracle:Domain — Kavu Scout gets +1/+0 for each basic land type among lands you control. diff --git a/forge-gui/res/cardsfolder/k/kaya_ghost_assassin.txt b/forge-gui/res/cardsfolder/k/kaya_ghost_assassin.txt index 75bb160be05..1fb87df195f 100644 --- a/forge-gui/res/cardsfolder/k/kaya_ghost_assassin.txt +++ b/forge-gui/res/cardsfolder/k/kaya_ghost_assassin.txt @@ -16,6 +16,6 @@ A:AB$ LoseLife | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | Defined$ Pla SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 A:AB$ Discard | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | Ultimate$ True | Defined$ Player.Opponent | NumCards$ 1 | Mode$ TgtChoose | SubAbility$ DBDraw | SpellDescription$ Each opponent discards a card and you draw a card. SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kaya_ghost_assassin.jpg Oracle:[0]: Exile Kaya, Ghost Assassin or up to one target creature. Return that card to the battlefield under its owner's control at the beginning of your next upkeep. You lose 2 life.\n[-1]: Each opponent loses 2 life and you gain 2 life.\n[-2]: Each opponent discards a card and you draw a card. diff --git a/forge-gui/res/cardsfolder/k/kazuuls_toll_collector.txt b/forge-gui/res/cardsfolder/k/kazuuls_toll_collector.txt index 39ee6170f70..7ead5219e96 100644 --- a/forge-gui/res/cardsfolder/k/kazuuls_toll_collector.txt +++ b/forge-gui/res/cardsfolder/k/kazuuls_toll_collector.txt @@ -4,6 +4,6 @@ Types:Creature Ogre Warrior PT:3/2 A:AB$ Pump | Cost$ 0 | ValidTgts$ Equipment.YouCtrl | AITgts$ Equipment.YouCtrl+notEquipping | TgtPrompt$ Select target Equipment you control | SubAbility$ KazuulAttach | SorcerySpeed$ True | StackDescription$ None | SpellDescription$ Attach target Equipment you control to Kazuul's Toll Collector. SVar:KazuulAttach:DB$ Attach | Object$ ParentTarget | Defined$ Self -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kazuuls_toll_collector.jpg Oracle:{0}: Attach target Equipment you control to Kazuul's Toll Collector. Activate this ability only any time you could cast a sorcery. diff --git a/forge-gui/res/cardsfolder/k/kederekt_leviathan.txt b/forge-gui/res/cardsfolder/k/kederekt_leviathan.txt index 40f3114aa09..6b81e0be484 100644 --- a/forge-gui/res/cardsfolder/k/kederekt_leviathan.txt +++ b/forge-gui/res/cardsfolder/k/kederekt_leviathan.txt @@ -5,6 +5,6 @@ PT:5/5 K:Unearth:6 U T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, return all other nonland permanents to their owners' hands. SVar:TrigChange:DB$ChangeZoneAll | ChangeType$ Permanent.nonLand+Other | Origin$ Battlefield | Destination$ Hand -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/kederekt_leviathan.jpg Oracle:When Kederekt Leviathan enters the battlefield, return all other nonland permanents to their owners' hands.\nUnearth {6}{U} ({6}{U}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/k/keeper_of_progenitus.txt b/forge-gui/res/cardsfolder/k/keeper_of_progenitus.txt index eb311f9af0c..d9d3a9bc7aa 100644 --- a/forge-gui/res/cardsfolder/k/keeper_of_progenitus.txt +++ b/forge-gui/res/cardsfolder/k/keeper_of_progenitus.txt @@ -4,6 +4,6 @@ Types:Creature Elf Druid PT:1/3 T:Mode$ TapsForMana | ValidCard$ Mountain,Forest,Plains | Execute$ TrigMana | TriggerZones$ Battlefield | Static$ True | TriggerDescription$ Whenever a player taps a Mountain, Forest, or Plains for mana, that player adds one mana of any type that land produced. SVar:TrigMana:DB$ ManaReflected | ColorOrType$ Type | Valid$ Defined.Triggered | ReflectProperty$ Produced | Defined$ TriggeredPlayer -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/keeper_of_progenitus.jpg Oracle:Whenever a player taps a Mountain, Forest, or Plains for mana, that player adds one mana of any type that land produced. diff --git a/forge-gui/res/cardsfolder/k/keldon_battlewagon.txt b/forge-gui/res/cardsfolder/k/keldon_battlewagon.txt index 20c4e795622..ebebd0f17b3 100644 --- a/forge-gui/res/cardsfolder/k/keldon_battlewagon.txt +++ b/forge-gui/res/cardsfolder/k/keldon_battlewagon.txt @@ -10,6 +10,6 @@ SVar:TrigSacrifice:DB$Sacrifice | Defined$ Self SVar:SacrificeEndCombat:True A:AB$ Pump | Cost$ tapXType<1/Creature> | NumAtt$ +X | References$ X | SpellDescription$ CARDNAME gets +X/+0 until end of turn, where X is the power of the creature tapped this way. SVar:X:Tapped$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/keldon_battlewagon.jpg Oracle:Trample\nKeldon Battlewagon can't block.\nWhen Keldon Battlewagon attacks, sacrifice it at end of combat.\nTap an untapped creature you control: Keldon Battlewagon gets +X/+0 until end of turn, where X is the power of the creature tapped this way. diff --git a/forge-gui/res/cardsfolder/k/keldon_necropolis.txt b/forge-gui/res/cardsfolder/k/keldon_necropolis.txt index d9e791cf40a..ee2e0a732c4 100644 --- a/forge-gui/res/cardsfolder/k/keldon_necropolis.txt +++ b/forge-gui/res/cardsfolder/k/keldon_necropolis.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Legendary Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ DealDamage | Cost$ 4 R T Sac<1/Creature> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to any target. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/keldon_necropolis.jpg Oracle:{T}: Add {C}.\n{4}{R}, {T}, Sacrifice a creature: Keldon Necropolis deals 2 damage to any target. diff --git a/forge-gui/res/cardsfolder/k/kelsinko_ranger.txt b/forge-gui/res/cardsfolder/k/kelsinko_ranger.txt index c93d0c446fd..5816eaa44d5 100644 --- a/forge-gui/res/cardsfolder/k/kelsinko_ranger.txt +++ b/forge-gui/res/cardsfolder/k/kelsinko_ranger.txt @@ -3,7 +3,7 @@ ManaCost:W Types:Creature Human PT:1/1 A:AB$ Pump | Cost$ 1 W | TgtPrompt$ Choose target green creature | ValidTgts$ Creature.Green | KW$ First Strike | SpellDescription$ Target green creature gains first strike until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Color$Green SVar:Picture:http://www.wizards.com/global/images/magic/general/kelsinko_ranger.jpg Oracle:{1}{W}: Target green creature gains first strike until end of turn. diff --git a/forge-gui/res/cardsfolder/k/kheru_dreadmaw.txt b/forge-gui/res/cardsfolder/k/kheru_dreadmaw.txt index 2bd87028eb5..a16bb3b6fe8 100644 --- a/forge-gui/res/cardsfolder/k/kheru_dreadmaw.txt +++ b/forge-gui/res/cardsfolder/k/kheru_dreadmaw.txt @@ -6,6 +6,6 @@ K:Defender A:AB$ GainLife | Cost$ 1 G Sac<1/Creature.Other/another creature> | LifeAmount$ X | References$ X | SubAbility$ DBCleanup | SpellDescription$ You gain life equal to the sacrificed creature's toughness. SVar:X:Sacrificed$CardToughness SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kheru_dreadmaw.jpg Oracle:Defender\n{1}{G}, Sacrifice another creature: You gain life equal to the sacrificed creature's toughness. diff --git a/forge-gui/res/cardsfolder/k/kheru_lich_lord.txt b/forge-gui/res/cardsfolder/k/kheru_lich_lord.txt index c80b70c2e52..3bf8a695b61 100644 --- a/forge-gui/res/cardsfolder/k/kheru_lich_lord.txt +++ b/forge-gui/res/cardsfolder/k/kheru_lich_lord.txt @@ -7,6 +7,6 @@ SVar:TrigChangZone:AB$ ChangeZone | Cost$ 2 B | ChangeType$ Creature.YouCtrl | O SVar:DBUnearthed:DB$ Animate | Defined$ Remembered | Keywords$ Flying & Trample & Haste | LeaveBattlefield$ Exile | sVars$ KheruMustAttack | Permanent$ True | SubAbility$ DBCleanup | AtEOT$ Exile | StackDescription$ It gains flying, trample, and haste. Exile that card at the beginning of your next end step. If it would leave the battlefield, exile it instead of putting it anywhere else. SVar:KheruMustAttack:SVar:MustAttack:True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/kheru_lich_lord.jpg Oracle:At the beginning of your upkeep, you may pay {2}{B}. If you do, return a creature card at random from your graveyard to the battlefield. It gains flying, trample, and haste. Exile that card at the beginning of your next end step. If it would leave the battlefield, exile it instead of putting it anywhere else. diff --git a/forge-gui/res/cardsfolder/k/kheru_spellsnatcher.txt b/forge-gui/res/cardsfolder/k/kheru_spellsnatcher.txt index 0a7039cb4f9..8cb0d53762c 100644 --- a/forge-gui/res/cardsfolder/k/kheru_spellsnatcher.txt +++ b/forge-gui/res/cardsfolder/k/kheru_spellsnatcher.txt @@ -9,6 +9,6 @@ SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | StaticAbilities$ STPlay SVar:STPlay:Mode$ Continuous | MayPlay$ True | MayPlayWithoutManaCost$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may cast cards without paying their mana cost as long as they remain exiled. SVar:TrigCleanup:Mode$ ChangesZone | ValidCard$ Card.IsRemembered | Origin$ Exile | Destination$ Any | TriggerZones$ Command | Execute$ DBCleanup | Static$ True SVar:DBCleanup:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kheru_spellsnatcher.jpg Oracle:Morph {4}{U}{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.)\nWhen Kheru Spellsnatcher is turned face up, counter target spell. If that spell is countered this way, exile it instead of putting it into its owner's graveyard. You may cast that card without paying its mana cost for as long as it remains exiled. diff --git a/forge-gui/res/cardsfolder/k/kiku_nights_flower.txt b/forge-gui/res/cardsfolder/k/kiku_nights_flower.txt index 110d89cd1f7..5d667d2a8c4 100644 --- a/forge-gui/res/cardsfolder/k/kiku_nights_flower.txt +++ b/forge-gui/res/cardsfolder/k/kiku_nights_flower.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Human Assassin PT:1/1 A:AB$ DealDamage | Cost$ 2 B B T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | DamageSource$ Targeted | References$ X | SpellDescription$ Target creature deals damage to itself equal to its power. SVar:X:Targeted$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kiku_nights_flower.jpg Oracle:{2}{B}{B}, {T}: Target creature deals damage to itself equal to its power. diff --git a/forge-gui/res/cardsfolder/k/kikus_shadow.txt b/forge-gui/res/cardsfolder/k/kikus_shadow.txt index 943ad1b45e4..4085ab605e8 100644 --- a/forge-gui/res/cardsfolder/k/kikus_shadow.txt +++ b/forge-gui/res/cardsfolder/k/kikus_shadow.txt @@ -3,6 +3,6 @@ ManaCost:B B Types:Sorcery A:SP$ DealDamage | Cost$ B B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | DamageSource$ Targeted | References$ X | SpellDescription$ Target creature deals damage to itself equal to its power. SVar:X:Targeted$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kikus_shadow.jpg Oracle:Target creature deals damage to itself equal to its power. diff --git a/forge-gui/res/cardsfolder/k/kill_suit_cultist.txt b/forge-gui/res/cardsfolder/k/kill_suit_cultist.txt index 8ec98f276bb..515895e562d 100644 --- a/forge-gui/res/cardsfolder/k/kill_suit_cultist.txt +++ b/forge-gui/res/cardsfolder/k/kill_suit_cultist.txt @@ -7,6 +7,6 @@ A:AB$ Effect | Cost$ B Sac<1/CARDNAME> | ValidTgts$ Creature | ReplacementEffect SVar:SelfDamage:Event$ DamageDone | ValidTarget$ Creature.IsRemembered | ReplaceWith$ CultistDestroy | Description$ The next time damage would be dealt to target creature this turn, destroy that creature instead. SVar:CultistDestroy:DB$ Destroy | Defined$ ReplacedTarget | SubAbility$ ExileEffect SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kill_suit_cultist.jpg Oracle:Kill-Suit Cultist attacks each combat if able.\n{B}, Sacrifice Kill-Suit Cultist: The next time damage would be dealt to target creature this turn, destroy that creature instead. diff --git a/forge-gui/res/cardsfolder/k/kill_switch.txt b/forge-gui/res/cardsfolder/k/kill_switch.txt index 6c4f29c0255..ccca11fedca 100644 --- a/forge-gui/res/cardsfolder/k/kill_switch.txt +++ b/forge-gui/res/cardsfolder/k/kill_switch.txt @@ -5,8 +5,8 @@ A:AB$ TapAll | Cost$ 2 T | ValidCards$ Artifact.Other | RememberTapped$ True | S S:Mode$ Continuous | Affected$ Card.IsRemembered | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. T:Mode$ Untaps | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ ClearRemembered | Static$ True SVar:ClearRemembered:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/kill_switch.jpg Oracle:{2}, {T}: Tap all other artifacts. They don't untap during their controllers' untap steps for as long as Kill Switch remains tapped. diff --git a/forge-gui/res/cardsfolder/k/killing_glare.txt b/forge-gui/res/cardsfolder/k/killing_glare.txt index febeefed3d0..2edfd61e0d1 100644 --- a/forge-gui/res/cardsfolder/k/killing_glare.txt +++ b/forge-gui/res/cardsfolder/k/killing_glare.txt @@ -3,6 +3,6 @@ ManaCost:X B Types:Instant A:SP$ Destroy | Cost$ X B | ValidTgts$ Creature.powerLEX | TgtPrompt$ Select target creature with power X or less | References$ X | SpellDescription$ Destroy target creature with power X or less. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/killing_glare.jpg Oracle:Destroy target creature with power X or less. diff --git a/forge-gui/res/cardsfolder/k/killing_wave.txt b/forge-gui/res/cardsfolder/k/killing_wave.txt index 0325b00227e..0abca813233 100644 --- a/forge-gui/res/cardsfolder/k/killing_wave.txt +++ b/forge-gui/res/cardsfolder/k/killing_wave.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ RepeatEach | Cost$ X B | RepeatCards$ Creature | Zone$ Battlefield | RepeatSubAbility$ DBSacUnless | References$ X | SpellDescription$ For each creature, its controller sacrifices it unless they pay X life. SVar:DBSacUnless:DB$ Sacrifice | Defined$ Player | SacValid$ Remembered.Self | UnlessCost$ PayLife | UnlessPayer$ RememberedController | References$ X | Random$ True | StackDescription$ Sacrifice {c:Remembered} SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/killing_wave.jpg Oracle:For each creature, its controller sacrifices it unless they pay X life. diff --git a/forge-gui/res/cardsfolder/k/kindle_the_carnage.txt b/forge-gui/res/cardsfolder/k/kindle_the_carnage.txt index f5c84fb22d1..b56493745d5 100644 --- a/forge-gui/res/cardsfolder/k/kindle_the_carnage.txt +++ b/forge-gui/res/cardsfolder/k/kindle_the_carnage.txt @@ -7,6 +7,6 @@ SVar:DBDmgAll:DB$ DamageAll | ValidCards$ Creature | NumDmg$ X | ConditionCheckS SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$CardManaCost SVar:Y:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kindle_the_carnage.jpg Oracle:Discard a card at random. If you do, Kindle the Carnage deals damage equal to that card's converted mana cost to each creature. You may repeat this process any number of times. diff --git a/forge-gui/res/cardsfolder/k/kindred_summons.txt b/forge-gui/res/cardsfolder/k/kindred_summons.txt index 5ce06316c58..1ae5c8f4907 100644 --- a/forge-gui/res/cardsfolder/k/kindred_summons.txt +++ b/forge-gui/res/cardsfolder/k/kindred_summons.txt @@ -5,7 +5,7 @@ A:SP$ ChooseType | Cost$ 5 G G | Defined$ You | Type$ Creature | SubAbility$ DBD SVar:DBDigUntil:DB$ DigUntil | Amount$ X | References$ X | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | Valid$ Creature.ChosenType+YouOwn | ValidDescription$ creature with chosen type | RevealedDestination$ Library | RevealedLibraryPosition$ -1 | FoundDestination$ Battlefield | SubAbility$ DBShuffle SVar:DBShuffle:DB$ Shuffle | Defined$ You SVar:X:Count$Valid Creature.ChosenType+YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random #TODO: This could benefit from something like "Creature.YouCtrl+sharesCreatureTypeWithAnotherCreature" (doesn't exist in code yet) SVar:NeedsToPlay:Creature.YouCtrl+inZoneBattlefield SVar:Picture:http://www.wizards.com/global/images/magic/general/kindred_summons.jpg diff --git a/forge-gui/res/cardsfolder/k/king_crab.txt b/forge-gui/res/cardsfolder/k/king_crab.txt index 1f64718a7b8..22955f19ca9 100644 --- a/forge-gui/res/cardsfolder/k/king_crab.txt +++ b/forge-gui/res/cardsfolder/k/king_crab.txt @@ -3,6 +3,6 @@ ManaCost:4 U U Types:Creature Crab PT:4/5 A:AB$ ChangeZone | Cost$ 1 U T | ValidTgts$ Creature.Green | TgtPrompt$ Select target green Creature | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SpellDescription$ Put target green creature on top of its owner's library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/king_crab.jpg Oracle:{1}{U}, {T}: Put target green creature on top of its owner's library. diff --git a/forge-gui/res/cardsfolder/k/king_suleiman.txt b/forge-gui/res/cardsfolder/k/king_suleiman.txt index aca242af432..e6e891681de 100644 --- a/forge-gui/res/cardsfolder/k/king_suleiman.txt +++ b/forge-gui/res/cardsfolder/k/king_suleiman.txt @@ -3,6 +3,6 @@ ManaCost:1 W Types:Creature Human PT:1/1 A:AB$ Destroy | Cost$ T | ValidTgts$ Djinn,Efreet | TgtPrompt$ Select target Djinn or Efreet | SpellDescription$ Destroy target Djinn or Efreet. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/king_suleiman.jpg Oracle:{T}: Destroy target Djinn or Efreet. diff --git a/forge-gui/res/cardsfolder/k/kinsbaile_borderguard.txt b/forge-gui/res/cardsfolder/k/kinsbaile_borderguard.txt index dfa5dc868f6..124d7a549b5 100644 --- a/forge-gui/res/cardsfolder/k/kinsbaile_borderguard.txt +++ b/forge-gui/res/cardsfolder/k/kinsbaile_borderguard.txt @@ -10,6 +10,6 @@ SVar:Y:TriggeredCard$CardCounters.ALL SVar:NeedsToPlay:X GE2 SVar:BuffedBy:Kithkin DeckHints:Type$Kithkin -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/kinsbaile_borderguard.jpg Oracle:Kinsbaile Borderguard enters the battlefield with a +1/+1 counter on it for each other Kithkin you control.\nWhen Kinsbaile Borderguard dies, create a 1/1 white Kithkin Soldier creature token for each counter on it. diff --git a/forge-gui/res/cardsfolder/k/kioras_dismissal.txt b/forge-gui/res/cardsfolder/k/kioras_dismissal.txt index 89cf1852183..09c0eeec6c3 100644 --- a/forge-gui/res/cardsfolder/k/kioras_dismissal.txt +++ b/forge-gui/res/cardsfolder/k/kioras_dismissal.txt @@ -4,6 +4,6 @@ Types:Instant K:Strive:U A:SP$ ChangeZone | Cost$ U | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | TargetMin$ 0 | TargetMax$ X | Origin$ Battlefield | Destination$ Hand | References$ X | SpellDescription$ Return any number of target enchantments to their owners' hands. SVar:X:Count$Valid Enchantment -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/kioras_dismissal.jpg Oracle:Strive — Kiora's Dismissal costs {U} more to cast for each target beyond the first.\nReturn any number of target enchantments to their owners' hands. diff --git a/forge-gui/res/cardsfolder/k/kioras_follower.txt b/forge-gui/res/cardsfolder/k/kioras_follower.txt index ae8df6769cb..367758ad69d 100644 --- a/forge-gui/res/cardsfolder/k/kioras_follower.txt +++ b/forge-gui/res/cardsfolder/k/kioras_follower.txt @@ -3,6 +3,6 @@ ManaCost:G U Types:Creature Merfolk PT:2/2 A:AB$ Untap | Cost$ T | ValidTgts$ Permanent.Other | TgtPrompt$ Select another target permanent. | SpellDescription$ Untap another target permanent. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kioras_follower.jpg Oracle:{T}: Untap another target permanent. diff --git a/forge-gui/res/cardsfolder/k/kiri_onna.txt b/forge-gui/res/cardsfolder/k/kiri_onna.txt index 242ea40daf6..e0d4217a98c 100644 --- a/forge-gui/res/cardsfolder/k/kiri_onna.txt +++ b/forge-gui/res/cardsfolder/k/kiri_onna.txt @@ -6,6 +6,6 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigReturnThis | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, you may return CARDNAME to its owner's hand. SVar:TrigReturnOther:DB$ ChangeZone | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand SVar:TrigReturnThis:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Hand -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/kiri_onna.jpg Oracle:When Kiri-Onna enters the battlefield, return target creature to its owner's hand.\nWhenever you cast a Spirit or Arcane spell, you may return Kiri-Onna to its owner's hand. diff --git a/forge-gui/res/cardsfolder/k/kithkin_armor.txt b/forge-gui/res/cardsfolder/k/kithkin_armor.txt index e4c37ad7ab5..db47e3f3c3b 100644 --- a/forge-gui/res/cardsfolder/k/kithkin_armor.txt +++ b/forge-gui/res/cardsfolder/k/kithkin_armor.txt @@ -12,7 +12,7 @@ SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPreventNextFromSource | ImprintC SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.ChosenCard | ValidTarget$ Card.IsImprinted | ReplaceWith$ ExileEffect | PreventionEffect$ True | Description$ The next time the chosen source deals damage to enchanted creature, prevent that damage. SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True | ClearChosenCard$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingAttachEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/kithkin_armor.jpg Oracle:Enchant creature\nEnchanted creature can't be blocked by creatures with power 3 or greater.\nSacrifice Kithkin Armor: The next time a source of your choice would deal damage to enchanted creature this turn, prevent that damage. diff --git a/forge-gui/res/cardsfolder/k/kithkin_harbinger.txt b/forge-gui/res/cardsfolder/k/kithkin_harbinger.txt index 7f8deb1d2e5..06dbfe6825c 100644 --- a/forge-gui/res/cardsfolder/k/kithkin_harbinger.txt +++ b/forge-gui/res/cardsfolder/k/kithkin_harbinger.txt @@ -4,6 +4,6 @@ Types:Creature Kithkin Wizard PT:1/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for a Kithkin card, reveal it, then shuffle your library and put that card on top of it. SVar:TrigChange:DB$ ChangeZone | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Card.Kithkin | ChangeNum$ 1 | ShuffleNonMandatory$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/kithkin_harbinger.jpg Oracle:When Kithkin Harbinger enters the battlefield, you may search your library for a Kithkin card, reveal it, then shuffle your library and put that card on top of it. diff --git a/forge-gui/res/cardsfolder/k/kithkin_mourncaller.txt b/forge-gui/res/cardsfolder/k/kithkin_mourncaller.txt index dccc494e850..3106b291a04 100644 --- a/forge-gui/res/cardsfolder/k/kithkin_mourncaller.txt +++ b/forge-gui/res/cardsfolder/k/kithkin_mourncaller.txt @@ -4,6 +4,6 @@ Types:Creature Kithkin Scout PT:2/2 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Kithkin+attackingLKI+YouOwn,Creature.Elf+attackingLKI+YouOwn | Execute$ TrigDraw | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ Whenever an attacking Kithkin or Elf is put into your graveyard from the battlefield, you may draw a card. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/kithkin_mourncaller.jpg Oracle:Whenever an attacking Kithkin or Elf is put into your graveyard from the battlefield, you may draw a card. diff --git a/forge-gui/res/cardsfolder/k/kithkin_zephyrnaut.txt b/forge-gui/res/cardsfolder/k/kithkin_zephyrnaut.txt index 436d9c02c11..068482b2272 100644 --- a/forge-gui/res/cardsfolder/k/kithkin_zephyrnaut.txt +++ b/forge-gui/res/cardsfolder/k/kithkin_zephyrnaut.txt @@ -6,6 +6,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigKinship | Trigge SVar:TrigKinship:DB$ PeekAndReveal | PeekAmount$ 1 | RevealValid$ Card.sharesCreatureTypeWith | RevealOptional$ True | RememberRevealed$ True | SubAbility$ DBPump SVar:DBPump:DB$ Pump | Defined$ Self | NumAtt$ +2 | NumDef$ +2 | KW$ Flying & Vigilance | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/kithkin_zephyrnaut.jpg Oracle:Kinship — At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Kithkin Zephyrnaut, you may reveal it. If you do, Kithkin Zephyrnaut gets +2/+2 and gains flying and vigilance until end of turn. diff --git a/forge-gui/res/cardsfolder/k/kitsune_mystic_autumn_tail_kitsune_sage.txt b/forge-gui/res/cardsfolder/k/kitsune_mystic_autumn_tail_kitsune_sage.txt index 611f9b2f256..8227bb3a474 100644 --- a/forge-gui/res/cardsfolder/k/kitsune_mystic_autumn_tail_kitsune_sage.txt +++ b/forge-gui/res/cardsfolder/k/kitsune_mystic_autumn_tail_kitsune_sage.txt @@ -4,7 +4,7 @@ Types:Creature Fox Wizard PT:2/3 T:Mode$ Phase | Phase$ End of Turn | IsPresent$ Aura.Attached | PresentCompare$ GE2 | Execute$ TrigFlip | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of the end step, if Kitsune Mystic is enchanted by two or more Auras, flip it. SVar:TrigFlip:DB$ SetState | Defined$ Self | Mode$ Flip -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Aura SVar:EnchantMe:Multiple SVar:Picture:http://www.wizards.com/global/images/magic/general/kitsune_mystic.jpg @@ -21,6 +21,6 @@ A:AB$ Pump | Cost$ 1 | Amount$ 1 | ValidTgts$ Aura.AttachedTo Creature | TgtProm SVar:ChooseNewHost:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Creature.NotEnchantedByTargeted | ChoiceZone$ Battlefield | SubAbility$ KitsuneAttach | RememberChosen$ True | AILogic$ AtLeast1 SVar:KitsuneAttach:DB$ Attach | Object$ ParentTarget | Defined$ Remembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/autumn_tail_kitsune_sage.jpg Oracle:{1}: Attach target Aura attached to a creature to another creature. diff --git a/forge-gui/res/cardsfolder/k/kitsune_palliator.txt b/forge-gui/res/cardsfolder/k/kitsune_palliator.txt index c46c3922e77..63711b50a63 100644 --- a/forge-gui/res/cardsfolder/k/kitsune_palliator.txt +++ b/forge-gui/res/cardsfolder/k/kitsune_palliator.txt @@ -3,6 +3,6 @@ ManaCost:2 W Types:Creature Fox Cleric PT:0/2 A:AB$ PreventDamageAll | Cost$ T | ValidCards$ Creature | ValidPlayers$ Player | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to each creature and each player this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kitsune_palliator.jpg Oracle:{T}: Prevent the next 1 damage that would be dealt to each creature and each player this turn. diff --git a/forge-gui/res/cardsfolder/k/kjeldoran_escort.txt b/forge-gui/res/cardsfolder/k/kjeldoran_escort.txt index 45f608e1a76..556c0458123 100644 --- a/forge-gui/res/cardsfolder/k/kjeldoran_escort.txt +++ b/forge-gui/res/cardsfolder/k/kjeldoran_escort.txt @@ -3,6 +3,6 @@ ManaCost:2 W W Types:Creature Human Soldier PT:2/3 K:Banding -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kjeldoran_escort.jpg Oracle:Banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/k/kjeldoran_javelineer.txt b/forge-gui/res/cardsfolder/k/kjeldoran_javelineer.txt index 03c0c49c6fe..b44c0f72f42 100644 --- a/forge-gui/res/cardsfolder/k/kjeldoran_javelineer.txt +++ b/forge-gui/res/cardsfolder/k/kjeldoran_javelineer.txt @@ -5,6 +5,6 @@ PT:1/2 K:Cumulative upkeep:1 A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals damage equal to the number of age counters on it to target attacking or blocking creature. SVar:X:Count$CardCounters.AGE -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kjeldoran_javelineer.jpg Oracle:Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\n{T}: Kjeldoran Javelineer deals damage equal to the number of age counters on it to target attacking or blocking creature. diff --git a/forge-gui/res/cardsfolder/k/kjeldoran_knight.txt b/forge-gui/res/cardsfolder/k/kjeldoran_knight.txt index f6a26d168bc..9bfdf4fb998 100644 --- a/forge-gui/res/cardsfolder/k/kjeldoran_knight.txt +++ b/forge-gui/res/cardsfolder/k/kjeldoran_knight.txt @@ -5,6 +5,6 @@ PT:1/1 K:Banding A:AB$ Pump | Cost$ 1 W | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. A:AB$ Pump | Cost$ W W | NumDef$ +2 | SpellDescription$ CARDNAME gets +0/+2 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kjeldoran_knight.jpg Oracle:Banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.)\n{1}{W}: Kjeldoran Knight gets +1/+0 until end of turn.\n{W}{W}: Kjeldoran Knight gets +0/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/k/kjeldoran_phalanx.txt b/forge-gui/res/cardsfolder/k/kjeldoran_phalanx.txt index 156e6ddb376..68ff3d51c82 100644 --- a/forge-gui/res/cardsfolder/k/kjeldoran_phalanx.txt +++ b/forge-gui/res/cardsfolder/k/kjeldoran_phalanx.txt @@ -4,6 +4,6 @@ Types:Creature Human Soldier PT:2/5 K:First Strike K:Banding -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kjeldoran_phalanx.jpg Oracle:First strike, banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/k/kjeldoran_pride.txt b/forge-gui/res/cardsfolder/k/kjeldoran_pride.txt index 3ca38962b28..3497d412260 100644 --- a/forge-gui/res/cardsfolder/k/kjeldoran_pride.txt +++ b/forge-gui/res/cardsfolder/k/kjeldoran_pride.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ 1 W | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 2 | Description$ Enchanted creature gets +1/+2. A:AB$ Attach | Cost$ 2 U | ValidTgts$ Creature.NotEnchantedBy | TgtPrompt$ Select target creature other than enchanted creature | AILogic$ Pump | SpellDescription$ Attach CARDNAME to target creature other than enchanted creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kjeldoran_pride.jpg Oracle:Enchant creature\nEnchanted creature gets +1/+2.\n{2}{U}: Attach Kjeldoran Pride to target creature other than enchanted creature. diff --git a/forge-gui/res/cardsfolder/k/kjeldoran_skycaptain.txt b/forge-gui/res/cardsfolder/k/kjeldoran_skycaptain.txt index 0b234f0df0e..0fa90dc2fc8 100644 --- a/forge-gui/res/cardsfolder/k/kjeldoran_skycaptain.txt +++ b/forge-gui/res/cardsfolder/k/kjeldoran_skycaptain.txt @@ -5,6 +5,6 @@ PT:2/2 K:Flying K:First Strike K:Banding -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kjeldoran_skycaptain.jpg Oracle:Flying, first strike, banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/k/kjeldoran_skyknight.txt b/forge-gui/res/cardsfolder/k/kjeldoran_skyknight.txt index caf14ebe031..e8c9bee0ef0 100644 --- a/forge-gui/res/cardsfolder/k/kjeldoran_skyknight.txt +++ b/forge-gui/res/cardsfolder/k/kjeldoran_skyknight.txt @@ -5,6 +5,6 @@ PT:1/1 K:Flying K:First Strike K:Banding -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kjeldoran_skyknight.jpg Oracle:Flying, first strike, banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/k/kjeldoran_warrior.txt b/forge-gui/res/cardsfolder/k/kjeldoran_warrior.txt index 595ee1c059e..77c4e592256 100644 --- a/forge-gui/res/cardsfolder/k/kjeldoran_warrior.txt +++ b/forge-gui/res/cardsfolder/k/kjeldoran_warrior.txt @@ -3,6 +3,6 @@ ManaCost:W Types:Creature Human Warrior PT:1/1 K:Banding -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kjeldoran_warrior.jpg Oracle:Banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/k/knacksaw_clique.txt b/forge-gui/res/cardsfolder/k/knacksaw_clique.txt index df8df320a0c..88ac8920f1e 100644 --- a/forge-gui/res/cardsfolder/k/knacksaw_clique.txt +++ b/forge-gui/res/cardsfolder/k/knacksaw_clique.txt @@ -9,6 +9,6 @@ SVar:STPlay:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ C SVar:TrigCleanup:Mode$ ChangesZone | ValidCard$ Card.IsRemembered | Origin$ Exile | Destination$ Any | TriggerZones$ Command | Execute$ DBExileSelf | Static$ True SVar:DBExileSelf:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ Truek -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/knacksaw_clique.jpg Oracle:Flying\n{1}{U}, {Q}: Target opponent exiles the top card of their library. Until end of turn, you may play that card. ({Q} is the untap symbol.) diff --git a/forge-gui/res/cardsfolder/k/knight_of_the_mists.txt b/forge-gui/res/cardsfolder/k/knight_of_the_mists.txt index a2086ca5e92..3ca7e857c21 100644 --- a/forge-gui/res/cardsfolder/k/knight_of_the_mists.txt +++ b/forge-gui/res/cardsfolder/k/knight_of_the_mists.txt @@ -5,6 +5,6 @@ PT:2/2 K:Flanking T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, you may pay {U}. If you don't, destroy target Knight and it can't be regenerated. SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Creature.Knight | TgtPrompt$ Select target Knight | NoRegen$ True | UnlessCost$ U | UnlessPayer$ You | UnlessAI$ DefinedTargetedController -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/knight_of_the_mists.jpg Oracle:Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.)\nWhen Knight of the Mists enters the battlefield, you may pay {U}. If you don't, destroy target Knight and it can't be regenerated. diff --git a/forge-gui/res/cardsfolder/k/knights_of_thorn.txt b/forge-gui/res/cardsfolder/k/knights_of_thorn.txt index 1c90a58d3ff..3a331627abd 100644 --- a/forge-gui/res/cardsfolder/k/knights_of_thorn.txt +++ b/forge-gui/res/cardsfolder/k/knights_of_thorn.txt @@ -4,6 +4,6 @@ Types:Creature Human Knight PT:2/2 K:Protection from red K:Banding -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/knights_of_thorn.jpg Oracle:Protection from red, banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/k/knollspine_dragon.txt b/forge-gui/res/cardsfolder/k/knollspine_dragon.txt index d0a8f6efa62..fc743af22ba 100644 --- a/forge-gui/res/cardsfolder/k/knollspine_dragon.txt +++ b/forge-gui/res/cardsfolder/k/knollspine_dragon.txt @@ -7,6 +7,6 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigDiscard:DB$ Discard | Mode$ Hand | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | NumCards$ X | Defined$ You | ValidTgts$ Opponent | References$ X SVar:X:TargetedPlayer$DamageThisTurn -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/knollspine_dragon.jpg Oracle:Flying\nWhen Knollspine Dragon enters the battlefield, you may discard your hand and draw cards equal to the damage dealt to target opponent this turn. diff --git a/forge-gui/res/cardsfolder/k/knollspine_invocation.txt b/forge-gui/res/cardsfolder/k/knollspine_invocation.txt index 11e9df29280..d1c0e7c5959 100644 --- a/forge-gui/res/cardsfolder/k/knollspine_invocation.txt +++ b/forge-gui/res/cardsfolder/k/knollspine_invocation.txt @@ -3,6 +3,6 @@ ManaCost:1 R R Types:Enchantment A:AB$ DealDamage | Announce$ X | Cost$ X Discard<1/Card.cmcEQX/card with converted mana cost X> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals X damage to any target. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/knollspine_invocation.jpg Oracle:{X}, Discard a card with converted mana cost X: Knollspine Invocation deals X damage to any target. diff --git a/forge-gui/res/cardsfolder/k/knotvine_mystic.txt b/forge-gui/res/cardsfolder/k/knotvine_mystic.txt index ca80670cbfd..22b6aa4b1e5 100644 --- a/forge-gui/res/cardsfolder/k/knotvine_mystic.txt +++ b/forge-gui/res/cardsfolder/k/knotvine_mystic.txt @@ -3,6 +3,6 @@ ManaCost:R G W Types:Creature Elf Druid PT:2/2 A:AB$ Mana | Cost$ 1 T | Produced$ R G W | SpellDescription$ Add {R}{G}{W}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/knotvine_mystic.jpg Oracle:{1}, {T}: Add {R}{G}{W}. diff --git a/forge-gui/res/cardsfolder/k/knowledge_exploitation.txt b/forge-gui/res/cardsfolder/k/knowledge_exploitation.txt index 342613a6207..39dd61ffbca 100644 --- a/forge-gui/res/cardsfolder/k/knowledge_exploitation.txt +++ b/forge-gui/res/cardsfolder/k/knowledge_exploitation.txt @@ -7,6 +7,6 @@ SVar:DBPlay:DB$ Play | Defined$ Remembered | Controller$ You | WithoutManaCost$ SVar:DBShuffle:DB$ Shuffle | Defined$ RememberedController | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True DeckNeeds:Type$Rogue -SVar:RemAIDeck:Rare +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/knowledge_exploitation.jpg Oracle:Prowl {3}{U} (You may cast this for its prowl cost if you dealt combat damage to a player this turn with a Rogue.)\nSearch target opponent's library for an instant or sorcery card. You may cast that card without paying its mana cost. Then that player shuffles their library. diff --git a/forge-gui/res/cardsfolder/k/knowledge_vault.txt b/forge-gui/res/cardsfolder/k/knowledge_vault.txt index 9b2d9e75a44..254535c169e 100644 --- a/forge-gui/res/cardsfolder/k/knowledge_vault.txt +++ b/forge-gui/res/cardsfolder/k/knowledge_vault.txt @@ -8,6 +8,6 @@ SVar:DBChangeZoneAll:DB$ ChangeZoneAll | ChangeType$ Remembered | Origin$ Exile T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Any | Hidden$ True | Execute$ TrigGraveyard | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME leaves the battlefield, put all cards exiled with CARDNAME into their owner's graveyard. SVar:TrigGraveyard:DB$ ChangeZoneAll | ChangeType$ Remembered | Origin$ Exile | Destination$ Graveyard SVar:VaultX:Remembered$Valid Card.Self -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/knowledge_vault.jpg Oracle:{2}, {T}: Exile the top card of your library face down.\n{0}: Sacrifice Knowledge Vault. If you do, discard your hand, then put all cards exiled with Knowledge Vault into their owner's hand.\nWhen Knowledge Vault leaves the battlefield, put all cards exiled with Knowledge Vault into their owner's graveyard. diff --git a/forge-gui/res/cardsfolder/k/kodama_of_the_center_tree.txt b/forge-gui/res/cardsfolder/k/kodama_of_the_center_tree.txt index 19ba54a8f98..c7ffb92446e 100644 --- a/forge-gui/res/cardsfolder/k/kodama_of_the_center_tree.txt +++ b/forge-gui/res/cardsfolder/k/kodama_of_the_center_tree.txt @@ -5,7 +5,7 @@ PT:*/* K:Soulshift:X:, where X is the number of Spirits you control.:Spirit.YouCtrl S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | References$ X | Description$ CARDNAME's power and toughness are each equal to the number of Spirits you control. SVar:X:Count$Valid Spirit.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:BuffedBy:Spirit SVar:NoZeroToughnessAI:True DeckHints:Type$Spirit diff --git a/forge-gui/res/cardsfolder/k/kolaghan_monument.txt b/forge-gui/res/cardsfolder/k/kolaghan_monument.txt index 74c9abb4be4..b48a3bb9b0f 100644 --- a/forge-gui/res/cardsfolder/k/kolaghan_monument.txt +++ b/forge-gui/res/cardsfolder/k/kolaghan_monument.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. A:AB$ Animate | Cost$ 4 B R | Defined$ Self | Power$ 4 | Toughness$ 4 | Types$ Artifact,Creature,Dragon | Colors$ Black,Red | Keywords$ Flying | SpellDescription$ CARDNAME becomes a 4/4 black and red Dragon artifact creature with flying until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black|Red SVar:Picture:http://www.wizards.com/global/images/magic/general/kolaghan_monument.jpg Oracle:{T}: Add {B} or {R}.\n{4}{B}{R}: Kolaghan Monument becomes a 4/4 black and red Dragon artifact creature with flying until end of turn. diff --git a/forge-gui/res/cardsfolder/k/kondas_banner.txt b/forge-gui/res/cardsfolder/k/kondas_banner.txt index 28d467cbcec..ac73ead1a79 100644 --- a/forge-gui/res/cardsfolder/k/kondas_banner.txt +++ b/forge-gui/res/cardsfolder/k/kondas_banner.txt @@ -6,7 +6,7 @@ K:CantEquip:Creature.nonLegendary K:Equip:2 S:Mode$ Continuous | Affected$ Creature.SharesColorWith Equipped | AddPower$ 1 | AddToughness$ 1 | Description$ Creatures that share a color with equipped creature get +1/+1. S:Mode$ Continuous | Affected$ Creature.sharesCreatureTypeWith Equipped | AddPower$ 1 | AddToughness$ 1 | Description$ Creatures that share a creature type with equipped creature get +1/+1. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Legendary SVar:Picture:http://www.wizards.com/global/images/magic/general/kondas_banner.jpg Oracle:Konda's Banner can be attached only to a legendary creature.\nCreatures that share a color with equipped creature get +1/+1.\nCreatures that share a creature type with equipped creature get +1/+1.\nEquip {2} diff --git a/forge-gui/res/cardsfolder/k/kookus.txt b/forge-gui/res/cardsfolder/k/kookus.txt index 7177a72dd26..ae0c0e947ef 100644 --- a/forge-gui/res/cardsfolder/k/kookus.txt +++ b/forge-gui/res/cardsfolder/k/kookus.txt @@ -7,7 +7,7 @@ A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Creature.YouCtrl+namedKeeper of Kookus | PresentCompare$ EQ0 | Execute$ TrigNoKeeper | TriggerDescription$ At the beginning of your upkeep, if you don't control a creature named Keeper of Kookus, CARDNAME deals 3 damage to you and attacks this turn if able. SVar:TrigNoKeeper:DB$DealDamage | NumDmg$ 3 | Defined$ You | SubAbility$ DBMustAttack SVar:DBMustAttack:DB$Pump | KW$ HIDDEN CARDNAME attacks each combat if able. | Defined$ Self | SpellDescription$ CARDNAME attacks this turn if able. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Name$Keeper of Kookus SVar:Picture:http://www.wizards.com/global/images/magic/general/kookus.jpg Oracle:Trample\nAt the beginning of your upkeep, if you don't control a creature named Keeper of Kookus, Kookus deals 3 damage to you and attacks this turn if able.\n{R}: Kookus gets +1/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/k/kor_chant.txt b/forge-gui/res/cardsfolder/k/kor_chant.txt index 00c574b9276..d5ef3b9b54f 100644 --- a/forge-gui/res/cardsfolder/k/kor_chant.txt +++ b/forge-gui/res/cardsfolder/k/kor_chant.txt @@ -9,6 +9,6 @@ SVar:SelflessDmg:DB$ ReplaceEffect | VarName$ Affected | VarValue$ Remembered | SVar:OutOfSight:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Defined$ Imprinted,Remembered | Execute$ ExileEffect | Static$ True SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile | Static$ True SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kor_chant.jpg Oracle:All damage that would be dealt this turn to target creature you control by a source of your choice is dealt to another target creature instead. diff --git a/forge-gui/res/cardsfolder/k/kor_dirge.txt b/forge-gui/res/cardsfolder/k/kor_dirge.txt index 6f49540c7d4..930a4f1de3d 100644 --- a/forge-gui/res/cardsfolder/k/kor_dirge.txt +++ b/forge-gui/res/cardsfolder/k/kor_dirge.txt @@ -9,6 +9,6 @@ SVar:SelflessDmg:DB$ ReplaceEffect | VarName$ Affected | VarValue$ Remembered | SVar:OutOfSight:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Defined$ Imprinted,Remembered | Execute$ ExileEffect | Static$ True SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile | Static$ True SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kor_dirge.jpg Oracle:All damage that would be dealt this turn to target creature you control by a source of your choice is dealt to another target creature instead. diff --git a/forge-gui/res/cardsfolder/k/kor_outfitter.txt b/forge-gui/res/cardsfolder/k/kor_outfitter.txt index 0d2436a51f2..0ef3e67d3e5 100644 --- a/forge-gui/res/cardsfolder/k/kor_outfitter.txt +++ b/forge-gui/res/cardsfolder/k/kor_outfitter.txt @@ -5,6 +5,6 @@ PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ EquipmentSelection | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may attach target Equipment you control to target creature you control. SVar:EquipmentSelection:DB$ Pump | ValidTgts$ Equipment.YouCtrl | TgtPrompt$ Select target equipment you control | SubAbility$ KorOutfitting | StackDescription$ None SVar:KorOutfitting:DB$ Attach | Object$ ParentTarget | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kor_outfitter.jpg Oracle:When Kor Outfitter enters the battlefield, you may attach target Equipment you control to target creature you control. diff --git a/forge-gui/res/cardsfolder/k/kormus_bell.txt b/forge-gui/res/cardsfolder/k/kormus_bell.txt index 15b7aae64af..d031fcea61a 100644 --- a/forge-gui/res/cardsfolder/k/kormus_bell.txt +++ b/forge-gui/res/cardsfolder/k/kormus_bell.txt @@ -3,6 +3,6 @@ ManaCost:4 Types:Artifact S:Mode$ Continuous | Affected$ Swamp | SetPower$ 1 | SetToughness$ 1 | AddType$ Creature | SetColor$ Black | Description$ All Swamps are 1/1 black creatures that are still lands. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/kormus_bell.jpg Oracle:All Swamps are 1/1 black creatures that are still lands. diff --git a/forge-gui/res/cardsfolder/k/koskun_keep.txt b/forge-gui/res/cardsfolder/k/koskun_keep.txt index d883b845dbc..24a3c1ef56f 100644 --- a/forge-gui/res/cardsfolder/k/koskun_keep.txt +++ b/forge-gui/res/cardsfolder/k/koskun_keep.txt @@ -5,6 +5,6 @@ A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ 1 T | Produced$ R | SpellDescription$ Add {R}. A:AB$ Mana | Cost$ 2 T | Produced$ B | SpellDescription$ Add {B}. A:AB$ Mana | Cost$ 2 T | Produced$ G | SpellDescription$ Add {G}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/koskun_keep.jpg Oracle:{T}: Add {C}.\n{1}, {T}: Add {R}.\n{2}, {T}: Add {B} or {G}. diff --git a/forge-gui/res/cardsfolder/k/krakens_eye.txt b/forge-gui/res/cardsfolder/k/krakens_eye.txt index a4e130ab3f6..a8227aff137 100644 --- a/forge-gui/res/cardsfolder/k/krakens_eye.txt +++ b/forge-gui/res/cardsfolder/k/krakens_eye.txt @@ -3,7 +3,7 @@ ManaCost:2 Types:Artifact T:Mode$ SpellCast | ValidCard$ Card.Blue | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever a player casts a blue spell, you may gain 1 life. SVar:TrigGainLife:DB$GainLife | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Blue SVar:Picture:http://www.wizards.com/global/images/magic/general/krakens_eye.jpg Oracle:Whenever a player casts a blue spell, you may gain 1 life. diff --git a/forge-gui/res/cardsfolder/k/krark_clan_engineers.txt b/forge-gui/res/cardsfolder/k/krark_clan_engineers.txt index 2f2cb1a1e32..c19fc777578 100644 --- a/forge-gui/res/cardsfolder/k/krark_clan_engineers.txt +++ b/forge-gui/res/cardsfolder/k/krark_clan_engineers.txt @@ -3,6 +3,6 @@ ManaCost:3 R Types:Creature Goblin Artificer PT:2/2 A:AB$ Destroy | Cost$ R Sac<2/Artifact> | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy target artifact. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/krark_clan_engineers.jpg Oracle:{R}, Sacrifice two artifacts: Destroy target artifact. diff --git a/forge-gui/res/cardsfolder/k/krark_clan_ironworks.txt b/forge-gui/res/cardsfolder/k/krark_clan_ironworks.txt index 9d5d5cb0ec4..883a918897f 100644 --- a/forge-gui/res/cardsfolder/k/krark_clan_ironworks.txt +++ b/forge-gui/res/cardsfolder/k/krark_clan_ironworks.txt @@ -2,6 +2,6 @@ Name:Krark-Clan Ironworks ManaCost:4 Types:Artifact A:AB$ Mana | Cost$ Sac<1/Artifact> | Produced$ C | Amount$ 2 | SpellDescription$ Add {C}{C}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/krark_clan_ironworks.jpg Oracle:Sacrifice an artifact: Add {C}{C}. diff --git a/forge-gui/res/cardsfolder/k/krark_clan_ogre.txt b/forge-gui/res/cardsfolder/k/krark_clan_ogre.txt index cae09465d8d..972e7cdf231 100644 --- a/forge-gui/res/cardsfolder/k/krark_clan_ogre.txt +++ b/forge-gui/res/cardsfolder/k/krark_clan_ogre.txt @@ -3,6 +3,6 @@ ManaCost:3 R R Types:Creature Ogre PT:3/3 A:AB$ Pump | Cost$ R Sac<1/Artifact> | ValidTgts$ Creature | TgtPrompt$ Select target creature | IsCurse$ True | KW$ HIDDEN CARDNAME can't block. | SpellDescription$ Target creature can't block this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/krark_clan_ogre.jpg Oracle:{R}, Sacrifice an artifact: Target creature can't block this turn. diff --git a/forge-gui/res/cardsfolder/k/krark_clan_shaman.txt b/forge-gui/res/cardsfolder/k/krark_clan_shaman.txt index 23e835f552e..980eac176b4 100644 --- a/forge-gui/res/cardsfolder/k/krark_clan_shaman.txt +++ b/forge-gui/res/cardsfolder/k/krark_clan_shaman.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Creature Goblin Shaman PT:1/1 A:AB$ DamageAll | Cost$ Sac<1/Artifact> | ValidCards$ Creature.withoutFlying | NumDmg$ 1 | ValidDescription$ each creature without flying. | SpellDescription$ CARDNAME deals 1 damage to each creature without flying. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/krark_clan_shaman.jpg Oracle:Sacrifice an artifact: Krark-Clan Shaman deals 1 damage to each creature without flying. diff --git a/forge-gui/res/cardsfolder/k/krark_clan_stoker.txt b/forge-gui/res/cardsfolder/k/krark_clan_stoker.txt index 22bacdb4c57..497edeaa8c8 100644 --- a/forge-gui/res/cardsfolder/k/krark_clan_stoker.txt +++ b/forge-gui/res/cardsfolder/k/krark_clan_stoker.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Creature Goblin Shaman PT:2/2 A:AB$ Mana | Cost$ T Sac<1/Artifact> | Produced$ R | Amount$ 2 | SpellDescription$ Add {R}{R}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/krark_clan_stoker.jpg Oracle:{T}, Sacrifice an artifact: Add {R}{R}. diff --git a/forge-gui/res/cardsfolder/k/krarks_thumb.txt b/forge-gui/res/cardsfolder/k/krarks_thumb.txt index bdcccac49a6..f73656fa3fb 100644 --- a/forge-gui/res/cardsfolder/k/krarks_thumb.txt +++ b/forge-gui/res/cardsfolder/k/krarks_thumb.txt @@ -2,6 +2,6 @@ Name:Krark's Thumb ManaCost:2 Types:Legendary Artifact S:Mode$ Continuous | Affected$ You | AddKeyword$ If you would flip a coin, instead flip two coins and ignore one. | Description$ If you would flip a coin, instead flip two coins and ignore one. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/krarks_thumb.jpg Oracle:If you would flip a coin, instead flip two coins and ignore one. diff --git a/forge-gui/res/cardsfolder/k/krasis_incubation.txt b/forge-gui/res/cardsfolder/k/krasis_incubation.txt index db7b4ec5351..28fa9114b4c 100644 --- a/forge-gui/res/cardsfolder/k/krasis_incubation.txt +++ b/forge-gui/res/cardsfolder/k/krasis_incubation.txt @@ -8,7 +8,7 @@ T:Mode$ Attached | ValidSource$ Card.Self | ValidTarget$ Creature | TriggerZones SVar:TrigRemember:DB$ Cleanup | ClearRemembered$ True | SubAbility$ RememberNew SVar:RememberNew:DB$ Pump | RememberObjects$ Enchanted A:AB$ PutCounter | Cost$ 1 G U Return<1/CARDNAME> | Defined$ Remembered | CounterType$ P1P1 | CounterNum$ 2 | SpellDescription$ Put two +1/+1 counters on enchanted creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/krasis_incubation.jpg Oracle:Enchant creature\nEnchanted creature can't attack or block, and its activated abilities can't be activated.\n{1}{G}{U}, Return Krasis Incubation to its owner's hand: Put two +1/+1 counters on enchanted creature. diff --git a/forge-gui/res/cardsfolder/k/kris_mage.txt b/forge-gui/res/cardsfolder/k/kris_mage.txt index b9274e404a6..3041f8045fb 100644 --- a/forge-gui/res/cardsfolder/k/kris_mage.txt +++ b/forge-gui/res/cardsfolder/k/kris_mage.txt @@ -4,5 +4,5 @@ Types:Creature Human Spellshaper PT:1/1 A:AB$ DealDamage | Cost$ R T Discard<1/Card> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to any target. SVar:Picture:http://www.wizards.com/global/images/magic/general/kris_mage.jpg -SVar:RemAIDeck:True +AI:RemoveDeck:All Oracle:{R}, {T}, Discard a card: Kris Mage deals 1 damage to any target. diff --git a/forge-gui/res/cardsfolder/k/krosan_archer.txt b/forge-gui/res/cardsfolder/k/krosan_archer.txt index 47a0d423ca1..0481de12da3 100644 --- a/forge-gui/res/cardsfolder/k/krosan_archer.txt +++ b/forge-gui/res/cardsfolder/k/krosan_archer.txt @@ -4,6 +4,6 @@ Types:Creature Centaur Archer PT:2/3 K:Reach A:AB$ Pump | Cost$ G Discard<1/Card> | NumDef$ +2 | SpellDescription$ CARDNAME gets +0/+2 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/krosan_archer.jpg Oracle:Reach (This creature can block creatures with flying.)\n{G}, Discard a card: Krosan Archer gets +0/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/k/krosan_reclamation.txt b/forge-gui/res/cardsfolder/k/krosan_reclamation.txt index 11ab5a24918..3a07f1bbdc1 100644 --- a/forge-gui/res/cardsfolder/k/krosan_reclamation.txt +++ b/forge-gui/res/cardsfolder/k/krosan_reclamation.txt @@ -4,6 +4,6 @@ Types:Instant K:Flashback:1 G A:SP$ Pump | Cost$ 1 G | ValidTgts$ Player | TgtPrompt$ Select target Player | SubAbility$ DBChangeZone | IsCurse$ True | SpellDescription$ Target player shuffles up to two target cards from their graveyard into their library. SVar:DBChangeZone:DB$ ChangeZone | TargetMin$ 0 | TargetMax$ 2 | TargetsWithDefinedController$ ParentTarget | Origin$ Graveyard | Destination$ Library | Shuffle$ True | TgtPrompt$ Choose target card | ValidTgts$ Card -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/krosan_reclamation.jpg Oracle:Target player shuffles up to two target cards from their graveyard into their library.\nFlashback {1}{G} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/k/krosan_restorer.txt b/forge-gui/res/cardsfolder/k/krosan_restorer.txt index c64dd74f6e0..2924167d96b 100644 --- a/forge-gui/res/cardsfolder/k/krosan_restorer.txt +++ b/forge-gui/res/cardsfolder/k/krosan_restorer.txt @@ -4,6 +4,6 @@ Types:Creature Human Druid PT:1/2 A:AB$ Untap | Cost$ T | ValidTgts$ Land | TgtPrompt$ Choose target land | SpellDescription$ Untap target land. A:AB$ Untap | Cost$ T | ValidTgts$ Land | TgtPrompt$ Choose target land | TargetMin$ 0 | TargetMax$ 3 | Activation$ Threshold | PrecostDesc$ Threshold — | SpellDescription$ Untap up to three target lands. Activate this ability only if seven or more cards are in your graveyard. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/krosan_restorer.jpg Oracle:{T}: Untap target land.\nThreshold — {T}: Untap up to three target lands. Activate this ability only if seven or more cards are in your graveyard. diff --git a/forge-gui/res/cardsfolder/k/krovikan_elementalist.txt b/forge-gui/res/cardsfolder/k/krovikan_elementalist.txt index 263757c62f7..fa943898748 100644 --- a/forge-gui/res/cardsfolder/k/krovikan_elementalist.txt +++ b/forge-gui/res/cardsfolder/k/krovikan_elementalist.txt @@ -4,6 +4,6 @@ Types:Creature Human Wizard PT:1/1 A:AB$ Pump | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | SpellDescription$ Target creature gets +1/+0 until end of turn. A:AB$ Pump | Cost$ U U | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | KW$ Flying | AtEOT$ Sacrifice | SpellDescription$ Target creature you control gains flying until end of turn. Sacrifice it at the beginning of the next end step. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/krovikan_elementalist.jpg Oracle:{2}{R}: Target creature gets +1/+0 until end of turn.\n{U}{U}: Target creature you control gains flying until end of turn. Sacrifice it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/k/krovikan_plague.txt b/forge-gui/res/cardsfolder/k/krovikan_plague.txt index 7f1dcbc2705..f5fe2f8bdf6 100644 --- a/forge-gui/res/cardsfolder/k/krovikan_plague.txt +++ b/forge-gui/res/cardsfolder/k/krovikan_plague.txt @@ -8,6 +8,6 @@ SVar:DelTrigSlowtrip:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPla SVar:DrawSlowtrip:DB$Draw | NumCards$ 1 | Defined$ You A:AB$DealDamage | Cost$ tapXType<1/Creature.EnchantedBy/Enchanted Creature> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | SubAbility$ DBPutCounter | CostDesc$ Tap enchanted creature: | SpellDescription$ CARDNAME deals 1 damage to any target. Put a -0/-1 counter on enchanted creature. Activate this ability only if enchanted creature is untapped. SVar:DBPutCounter:DB$PutCounter | Defined$ Enchanted | CounterType$ M0M1 | CounterNum$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/krovikan_plague.jpg Oracle:Enchant non-Wall creature you control\nWhen Krovikan Plague enters the battlefield, draw a card at the beginning of the next turn's upkeep.\nTap enchanted creature: Krovikan Plague deals 1 damage to any target. Put a -0/-1 counter on enchanted creature. Activate this ability only if enchanted creature is untapped. diff --git a/forge-gui/res/cardsfolder/k/krovikan_sorcerer.txt b/forge-gui/res/cardsfolder/k/krovikan_sorcerer.txt index 219154d5ec0..a15c1b7f4cf 100644 --- a/forge-gui/res/cardsfolder/k/krovikan_sorcerer.txt +++ b/forge-gui/res/cardsfolder/k/krovikan_sorcerer.txt @@ -6,7 +6,7 @@ A:AB$ Draw | Cost$ T Discard<1/Card.nonBlack> | NumCards$ 1 | CostDesc$ {T}, Dis A:AB$ Draw | Cost$ T Discard<1/Card.Black> | NumCards$ 2 | CostDesc$ {T}, Discard a black card: | RememberDrawn$ True | SubAbility$ DBDiscard | SpellDescription$ Draw two cards, then discard one of them. SVar:DBDiscard:DB$Discard | Defined$ You | Mode$ TgtChoose | DiscardValid$ Card.IsRemembered | NumCards$ 1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHints:Color$Black SVar:Picture:http://www.wizards.com/global/images/magic/general/krovikan_sorcerer.jpg Oracle:{T}, Discard a nonblack card: Draw a card.\n{T}, Discard a black card: Draw two cards, then discard one of them. diff --git a/forge-gui/res/cardsfolder/k/krovikan_whispers.txt b/forge-gui/res/cardsfolder/k/krovikan_whispers.txt index 531211be895..4fbaa830bb7 100644 --- a/forge-gui/res/cardsfolder/k/krovikan_whispers.txt +++ b/forge-gui/res/cardsfolder/k/krovikan_whispers.txt @@ -8,6 +8,6 @@ S:Mode$ Continuous | Affected$ Card.EnchantedBy | GainControl$ You | Description T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigLoseLife | ValidCard$ Card.Self | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you lose 2 life for each age counter on it. SVar:TrigLoseLife:DB$ LoseLife | LifeAmount$ X | References$ X SVar:X:TriggeredCard$CardCounters.AGE/Times.2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/krovikan_whispers.jpg Oracle:Enchant creature\nCumulative upkeep {U} or {B} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nYou control enchanted creature.\nWhen Krovikan Whispers is put into a graveyard from the battlefield, you lose 2 life for each age counter on it. diff --git a/forge-gui/res/cardsfolder/k/kry_shield.txt b/forge-gui/res/cardsfolder/k/kry_shield.txt index b33d15803f3..4951f4f1cf8 100644 --- a/forge-gui/res/cardsfolder/k/kry_shield.txt +++ b/forge-gui/res/cardsfolder/k/kry_shield.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ Pump | Cost$ 2 T | KW$ Prevent all damage that would be dealt by CARDNAME. | TgtPrompt$ Select target creature you control | ValidTgts$ Creature.YouCtrl | SubAbility$ DBPump | SpellDescription$ Prevent all damage that would be dealt this turn by target creature you control. That creature gets +0/+X until end of turn, where X is its converted mana cost. SVar:DBPump:DB$ Pump | Defined$ Targeted | NumDef$ X | References$ X SVar:X:Targeted$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kry_shield.jpg Oracle:{2}, {T}: Prevent all damage that would be dealt this turn by target creature you control. That creature gets +0/+X until end of turn, where X is its converted mana cost. diff --git a/forge-gui/res/cardsfolder/k/kukemssa_serpent.txt b/forge-gui/res/cardsfolder/k/kukemssa_serpent.txt index 7ccddbef885..836ce8c97e9 100644 --- a/forge-gui/res/cardsfolder/k/kukemssa_serpent.txt +++ b/forge-gui/res/cardsfolder/k/kukemssa_serpent.txt @@ -7,6 +7,6 @@ A:AB$ Animate | Cost$ U Sac<1/Island> | ValidTgts$ Land.OppCtrl | TgtPrompt$ Sel T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Island.YouCtrl | PresentCompare$ EQ0 | Execute$ TrigSac | TriggerDescription$ When you control no Islands, sacrifice CARDNAME. SVar:TrigSac:DB$Sacrifice | Defined$ Self SVar:NeedsToPlay:Island.YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kukemssa_serpent.jpg Oracle:Kukemssa Serpent can't attack unless defending player controls an Island.\n{U}, Sacrifice an Island: Target land an opponent controls becomes an Island until end of turn.\nWhen you control no Islands, sacrifice Kukemssa Serpent. diff --git a/forge-gui/res/cardsfolder/k/kuldotha_flamefiend.txt b/forge-gui/res/cardsfolder/k/kuldotha_flamefiend.txt index 22261202e5f..dbff69d914f 100644 --- a/forge-gui/res/cardsfolder/k/kuldotha_flamefiend.txt +++ b/forge-gui/res/cardsfolder/k/kuldotha_flamefiend.txt @@ -4,6 +4,6 @@ Types:Creature Elemental PT:4/4 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, you may sacrifice an artifact. If you do, CARDNAME deals 4 damage divided as you choose among any number of targets. SVar:TrigDealDamage:AB$ DealDamage | Cost$ Sac<1/Artifact> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target to distribute damage to | NumDmg$ 4 | TargetMin$ 1 | TargetMax$ 4 | DividedAsYouChoose$ 4 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kuldotha_flamefiend.jpg Oracle:When Kuldotha Flamefiend enters the battlefield, you may sacrifice an artifact. If you do, Kuldotha Flamefiend deals 4 damage divided as you choose among any number of targets. diff --git a/forge-gui/res/cardsfolder/k/kuldotha_forgemaster.txt b/forge-gui/res/cardsfolder/k/kuldotha_forgemaster.txt index 34ac3169bdc..9ef49206ec6 100644 --- a/forge-gui/res/cardsfolder/k/kuldotha_forgemaster.txt +++ b/forge-gui/res/cardsfolder/k/kuldotha_forgemaster.txt @@ -3,6 +3,6 @@ ManaCost:5 Types:Artifact Creature Construct PT:3/5 A:AB$ ChangeZone | Cost$ T Sac<3/Artifact> | Origin$ Library | Destination$ Battlefield | ChangeType$ Artifact | ChangeNum$ 1 | SpellDescription$ Search your library for an artifact card, put it onto the battlefield, then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/kuldotha_forgemaster.jpg Oracle:{T}, Sacrifice three artifacts: Search your library for an artifact card, put it onto the battlefield, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/k/kuldotha_rebirth.txt b/forge-gui/res/cardsfolder/k/kuldotha_rebirth.txt index ecc5bdb5031..3e3e86a9c0e 100644 --- a/forge-gui/res/cardsfolder/k/kuldotha_rebirth.txt +++ b/forge-gui/res/cardsfolder/k/kuldotha_rebirth.txt @@ -2,7 +2,7 @@ Name:Kuldotha Rebirth ManaCost:R Types:Sorcery A:SP$ Token | Cost$ R Sac<1/Artifact> | TokenAmount$ 3 | TokenOwner$ You | TokenName$ Goblin | TokenTypes$ Creature,Goblin | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 | TokenImage$ r 1 1 goblin SOM | SpellDescription$ Create three 1/1 red Goblin creature tokens. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:AIPreference:SacCost$Artifact.token,Artifact.cmcEQ1 SVar:Picture:http://www.wizards.com/global/images/magic/general/kuldotha_rebirth.jpg Oracle:As an additional cost to cast Kuldotha Rebirth, sacrifice an artifact.\nCreate three 1/1 red Goblin creature tokens. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/k/kumanos_blessing.txt b/forge-gui/res/cardsfolder/k/kumanos_blessing.txt index 582dff6c9ac..107bcf6f187 100644 --- a/forge-gui/res/cardsfolder/k/kumanos_blessing.txt +++ b/forge-gui/res/cardsfolder/k/kumanos_blessing.txt @@ -6,7 +6,7 @@ K:Enchant creature A:SP$ Attach | Cost$ 2 R | ValidTgts$ Creature | AILogic$ Pump R:Event$ Moved | ValidLKI$ Creature.DamagedByEnchanted | Destination$ Graveyard | ActiveZones$ Battlefield | ReplaceWith$ DBExile | Description$ If a creature dealt damage by enchanted creature this turn would die, exile it instead. SVar:DBExile:DB$ ChangeZone | Defined$ ReplacedCard | Origin$ Battlefield | Destination$ Exile -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingAttachEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/kumanos_blessing.jpg Oracle:Flash\nEnchant creature\nIf a creature dealt damage by enchanted creature this turn would die, exile it instead. diff --git a/forge-gui/res/cardsfolder/k/kyoki_sanitys_eclipse.txt b/forge-gui/res/cardsfolder/k/kyoki_sanitys_eclipse.txt index c4286fcf10a..8d372445edc 100644 --- a/forge-gui/res/cardsfolder/k/kyoki_sanitys_eclipse.txt +++ b/forge-gui/res/cardsfolder/k/kyoki_sanitys_eclipse.txt @@ -5,7 +5,7 @@ PT:6/4 T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigExile | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, target opponent exiles a card from their hand. #This needs Defined$ Opponent because ValidTgts$ Opponent lets Kyoki's controller select the card to be exiled SVar:TrigExile:DB$ChangeZone | Origin$ Hand | Destination$ Exile | ChangeType$ Card | ValidTgts$ Opponent | Chooser$ Targeted | TgtPrompt$ Select target opponent | ChangeNum$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/kyoki_sanitys_eclipse.jpg Oracle:Whenever you cast a Spirit or Arcane spell, target opponent exiles a card from their hand. diff --git a/forge-gui/res/cardsfolder/k/kyren_archive.txt b/forge-gui/res/cardsfolder/k/kyren_archive.txt index 5fe7ea1b6c6..a46b5a47a25 100644 --- a/forge-gui/res/cardsfolder/k/kyren_archive.txt +++ b/forge-gui/res/cardsfolder/k/kyren_archive.txt @@ -6,6 +6,6 @@ SVar:TrigKyrenExile:DB$ ChangeZone | Defined$ TopOfLibrary | Origin$ Library | D A:AB$ ChangeZoneAll | Cost$ 5 Discard<1/Hand> Sac<1/CARDNAME> | ChangeType$ Card.IsRemembered+ExiledWithSource | Origin$ Exile | Destination$ Hand | Hidden$ True | AILogic$ DiscardAllAndRetExiled.minAdv2 | SubAbility$ DBKyrenCleanup | SpellDescription$ Put all cards exiled with CARDNAME into their owner's hand. SVar:DBKyrenCleanup:DB$ Cleanup | ClearRemembered$ True SVar:AIPreference:DiscardCost$Card -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/kyren_archive.jpg Oracle:At the beginning of your upkeep, you may exile the top card of your library face down.\n{5}, Discard your hand, Sacrifice Kyren Archive: Put all cards exiled with Kyren Archive into their owner's hand. diff --git a/forge-gui/res/cardsfolder/k/kyren_toy.txt b/forge-gui/res/cardsfolder/k/kyren_toy.txt index 56195b70fb2..0f720356b9c 100644 --- a/forge-gui/res/cardsfolder/k/kyren_toy.txt +++ b/forge-gui/res/cardsfolder/k/kyren_toy.txt @@ -5,6 +5,6 @@ A:AB$ PutCounter | Cost$ 1 T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescri A:AB$ Mana | Cost$ T SubCounter | Produced$ C | Amount$ Y | References$ X,Y | SpellDescription$ Add {C} equal to one plus the amount of counters removed. SVar:Y:Number$1/Plus.ChosenX SVar:X:XChoice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/kyren_toy.jpg Oracle:{1}, {T}: Put a charge counter on Kyren Toy.\n{T}, Remove X charge counters from Kyren Toy: Add {C} equal to one plus the amount of counters removed. diff --git a/forge-gui/res/cardsfolder/l/lady_evangela.txt b/forge-gui/res/cardsfolder/l/lady_evangela.txt index 92169bf7e89..2de14654057 100644 --- a/forge-gui/res/cardsfolder/l/lady_evangela.txt +++ b/forge-gui/res/cardsfolder/l/lady_evangela.txt @@ -3,7 +3,7 @@ ManaCost:W U B Types:Legendary Creature Human Cleric PT:1/2 A:AB$ Pump | Cost$ W B T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Prevent all combat damage that would be dealt by CARDNAME. | IsCurse$ True | SpellDescription$ Prevent all combat damage that would be dealt by target creature this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonCombatPriority:2 SVar:Picture:http://www.wizards.com/global/images/magic/general/lady_evangela.jpg Oracle:{W}{B}, {T}: Prevent all combat damage that would be dealt by target creature this turn. diff --git a/forge-gui/res/cardsfolder/l/lady_sun.txt b/forge-gui/res/cardsfolder/l/lady_sun.txt index 9a3503c1080..e04ad7bd4dd 100644 --- a/forge-gui/res/cardsfolder/l/lady_sun.txt +++ b/forge-gui/res/cardsfolder/l/lady_sun.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Human Advisor PT:1/1 A:AB$ ChangeZone | Cost$ T | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBChangeZone | PlayerTurn$ True | ActivationPhases$ Upkeep->BeginCombat | SpellDescription$ Return CARDNAME and another target creature to their owners' hands. Activate this ability only during your turn, before attackers are declared. SVar:DBChangeZone:DB$ ChangeZone | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/lady_sun.jpg Oracle:{T}: Return Lady Sun and another target creature to their owners' hands. Activate this ability only during your turn, before attackers are declared. diff --git a/forge-gui/res/cardsfolder/l/lake_of_the_dead.txt b/forge-gui/res/cardsfolder/l/lake_of_the_dead.txt index 28b1da3d15c..badb1aee8bc 100644 --- a/forge-gui/res/cardsfolder/l/lake_of_the_dead.txt +++ b/forge-gui/res/cardsfolder/l/lake_of_the_dead.txt @@ -9,6 +9,6 @@ SVar:MoveToGraveyard:DB$ ChangeZone | Origin$ All | Destination$ Graveyard | Def SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/lake_of_the_dead.jpg Oracle:If Lake of the Dead would enter the battlefield, sacrifice a Swamp instead. If you do, put Lake of the Dead onto the battlefield. If you don't, put it into its owner's graveyard.\n{T}: Add {B}.\n{T}, Sacrifice a Swamp: Add {B}{B}{B}{B}. diff --git a/forge-gui/res/cardsfolder/l/lammastide_weave.txt b/forge-gui/res/cardsfolder/l/lammastide_weave.txt index d78035eca9a..1174faf423d 100644 --- a/forge-gui/res/cardsfolder/l/lammastide_weave.txt +++ b/forge-gui/res/cardsfolder/l/lammastide_weave.txt @@ -8,7 +8,7 @@ SVar:DBDraw:DB$ Draw | NumCards$ 1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$CardManaCost SVar:Y:Remembered$Valid Card.NamedCard -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/lammastide_weave.jpg Oracle:Choose a card name, then target player puts the top card of their library into their graveyard. If that card has the chosen name, you gain life equal to its converted mana cost.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/l/lancers_en_kor.txt b/forge-gui/res/cardsfolder/l/lancers_en_kor.txt index b7d8f417b5e..6a2cacbcf69 100644 --- a/forge-gui/res/cardsfolder/l/lancers_en_kor.txt +++ b/forge-gui/res/cardsfolder/l/lancers_en_kor.txt @@ -6,6 +6,6 @@ K:Trample A:AB$ Effect | Cost$ 0 | Name$ en-Kor Redirection | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control to redirect the damage to | ReplacementEffects$ EnKor | SVars$ EnKorDmg | References$ EnKor,EnKorDmg | Duration$ HostLeavesOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SpellDescription$ The next 1 damage that would be dealt to CARDNAME this turn is dealt to target creature you control instead. SVar:EnKor:Event$ DamageDone | ValidTarget$ Creature.EffectSource | ReplaceWith$ EnKorDmg | DamageTarget$ Remembered | Description$ The next 1 damage that would be dealt to EFFECTSOURCE this turn is dealt to target creature you control instead. SVar:EnKorDmg:DB$ ReplaceSplitDamage | DamageTarget$ Remembered -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/lancers_en_kor.jpg Oracle:Trample\n{0}: The next 1 damage that would be dealt to Lancers en-Kor this turn is dealt to target creature you control instead. diff --git a/forge-gui/res/cardsfolder/l/lands_edge.txt b/forge-gui/res/cardsfolder/l/lands_edge.txt index 79f8ed9accd..2a5ba7afaef 100644 --- a/forge-gui/res/cardsfolder/l/lands_edge.txt +++ b/forge-gui/res/cardsfolder/l/lands_edge.txt @@ -3,6 +3,6 @@ ManaCost:1 R R Types:World Enchantment A:AB$ DealDamage | Cost$ Discard<1/Card> | ValidTgts$ Player,Planeswalker | NumDmg$ X | References$ X | AnyPlayer$ True | AILogic$ DiscardLands | SpellDescription$ If the discarded card was a land card, CARDNAME deals 2 damage to target player or planeswalker. Any player may activate this ability. SVar:X:Discarded$Valid Land/Times.2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/lands_edge.jpg Oracle:Discard a card: If the discarded card was a land card, Land's Edge deals 2 damage to target player or planeswalker. Any player may activate this ability. diff --git a/forge-gui/res/cardsfolder/l/landslide.txt b/forge-gui/res/cardsfolder/l/landslide.txt index 389552b48d0..c91a3d596ad 100644 --- a/forge-gui/res/cardsfolder/l/landslide.txt +++ b/forge-gui/res/cardsfolder/l/landslide.txt @@ -6,6 +6,6 @@ SVar:DBDamage:DB$ DealDamage | ValidTgts$ Player,Planeswalker | TgtPrompt$ Selec SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:SacX:Count$Valid Mountain.YouCtrl SVar:DmgX:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/landslide.jpg Oracle:Sacrifice any number of Mountains. Landslide deals that much damage to target player or planeswalker. diff --git a/forge-gui/res/cardsfolder/l/lantern_of_insight.txt b/forge-gui/res/cardsfolder/l/lantern_of_insight.txt index 03ae266b4bd..f27183a46ad 100644 --- a/forge-gui/res/cardsfolder/l/lantern_of_insight.txt +++ b/forge-gui/res/cardsfolder/l/lantern_of_insight.txt @@ -3,6 +3,6 @@ ManaCost:1 Types:Artifact S:Mode$ Continuous | Affected$ Card.TopLibrary | AffectedZone$ Library | MayLookAt$ Player | Description$ Players play with the top card of their libraries revealed. A:AB$ Shuffle | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Player | TgtPrompt$ Select target player | SpellDescription$ Target player shuffles their library. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/lantern_of_insight.jpg Oracle:Players play with the top card of their libraries revealed.\n{T}, Sacrifice Lantern of Insight: Target player shuffles their library. diff --git a/forge-gui/res/cardsfolder/l/lapis_lazuli_talisman.txt b/forge-gui/res/cardsfolder/l/lapis_lazuli_talisman.txt index 3d581e6d4eb..d438b6f604b 100644 --- a/forge-gui/res/cardsfolder/l/lapis_lazuli_talisman.txt +++ b/forge-gui/res/cardsfolder/l/lapis_lazuli_talisman.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact T:Mode$ SpellCast | ValidCard$ Card.Blue | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ Whenever a player casts a blue spell, you may pay {3}. If you do, untap target permanent. SVar:TrigUntap:AB$Untap | Cost$ 3 | ValidTgts$ Permanent | TgtPrompt$ Select target permanent -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/lapis_lazuli_talisman.jpg Oracle:Whenever a player casts a blue spell, you may pay {3}. If you do, untap target permanent. diff --git a/forge-gui/res/cardsfolder/l/laquatuss_creativity.txt b/forge-gui/res/cardsfolder/l/laquatuss_creativity.txt index 47e80633d8e..bdc9ccc1a28 100644 --- a/forge-gui/res/cardsfolder/l/laquatuss_creativity.txt +++ b/forge-gui/res/cardsfolder/l/laquatuss_creativity.txt @@ -6,6 +6,6 @@ SVar:DBDiscard:DB$ Discard | Defined$ Targeted | Mode$ TgtChoose | NumCards$ Y | SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:TargetedPlayer$CardsInHand SVar:Y:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/laquatuss_creativity.jpg Oracle:Target player draws cards equal to the number of cards in their hand, then discards that many cards. diff --git a/forge-gui/res/cardsfolder/l/laquatuss_disdain.txt b/forge-gui/res/cardsfolder/l/laquatuss_disdain.txt index 6f223049030..d5f7e2d33a8 100644 --- a/forge-gui/res/cardsfolder/l/laquatuss_disdain.txt +++ b/forge-gui/res/cardsfolder/l/laquatuss_disdain.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Instant A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TgtPrompt$ Select target spell cast from a graveyard | ValidTgts$ Card.wasCastFromGraveyard | SubAbility$ DBDraw | SpellDescription$ Counter target spell cast from a graveyard. Draw a card. SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/laquatuss_disdain.jpg Oracle:Counter target spell cast from a graveyard.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/l/lashwrithe.txt b/forge-gui/res/cardsfolder/l/lashwrithe.txt index e208bb6caf0..28ba70efa3d 100644 --- a/forge-gui/res/cardsfolder/l/lashwrithe.txt +++ b/forge-gui/res/cardsfolder/l/lashwrithe.txt @@ -6,7 +6,7 @@ K:Equip:PB PB S:Mode$ Continuous | Affected$ Card.EquippedBy | AddPower$ X | AddToughness$ X | Description$ Equipped creature gets +1/+1 for each Swamp you control. SVar:X:Count$Valid Swamp.YouCtrl SVar:BuffedBy:Swamp -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black & Type$Swamp DeckHas:Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/lashwrithe.jpg diff --git a/forge-gui/res/cardsfolder/l/last_chance.txt b/forge-gui/res/cardsfolder/l/last_chance.txt index 1740412b43f..f7a2c3628aa 100644 --- a/forge-gui/res/cardsfolder/l/last_chance.txt +++ b/forge-gui/res/cardsfolder/l/last_chance.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ AddTurn | Cost$ R R | NumTurns$ 1 | ExtraTurnDelayedTrigger$ DBDelTrig | ExtraTurnDelayedTriggerExcute$ TrigLose | References$ DBDelTrig,TrigLose | SpellDescription$ Take an extra turn after this one. At the beginning of that turn's end step, you lose the game. SVar:DBDelTrig:ThisTurn$ True | Mode$ Phase | Phase$ End of Turn | TriggerDescription$ At the beginning of that turn's end step, you lose the game. SVar:TrigLose:DB$ LosesGame | Defined$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/last_chance.jpg Oracle:Take an extra turn after this one. At the beginning of that turn's end step, you lose the game. diff --git a/forge-gui/res/cardsfolder/l/last_ditch_effort.txt b/forge-gui/res/cardsfolder/l/last_ditch_effort.txt index 3521ba8582f..57e3026ddca 100644 --- a/forge-gui/res/cardsfolder/l/last_ditch_effort.txt +++ b/forge-gui/res/cardsfolder/l/last_ditch_effort.txt @@ -6,6 +6,6 @@ SVar:DBDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtProm SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:SacX:Count$Valid Creature.YouCtrl SVar:DmgX:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/last_ditch_effort.jpg Oracle:Sacrifice any number of creatures. Last-Ditch Effort deals that much damage to any target. diff --git a/forge-gui/res/cardsfolder/l/last_laugh.txt b/forge-gui/res/cardsfolder/l/last_laugh.txt index 946243dad61..40da9ec52ee 100644 --- a/forge-gui/res/cardsfolder/l/last_laugh.txt +++ b/forge-gui/res/cardsfolder/l/last_laugh.txt @@ -5,7 +5,7 @@ T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Creature | PresentCompar SVar:TrigSac:DB$Sacrifice | Defined$ Self T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Permanent.Other | TriggerZones$ Battlefield | Execute$ TrigDamageAll | TriggerDescription$ Whenever a permanent other than CARDNAME is put into a graveyard from the battlefield, CARDNAME deals 1 damage to each creature and each player. SVar:TrigDamageAll:DB$DamageAll | ValidCards$ Creature | ValidPlayers$ Player | ValidDescription$ each creature and each player. | NumDmg$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NeedsToPlay:Creature SVar:Picture:http://www.wizards.com/global/images/magic/general/last_laugh.jpg Oracle:Whenever a permanent other than Last Laugh is put into a graveyard from the battlefield, Last Laugh deals 1 damage to each creature and each player.\nWhen no creatures are on the battlefield, sacrifice Last Laugh. diff --git a/forge-gui/res/cardsfolder/l/last_rites.txt b/forge-gui/res/cardsfolder/l/last_rites.txt index 14bd3b54efd..0aece24b0d4 100644 --- a/forge-gui/res/cardsfolder/l/last_rites.txt +++ b/forge-gui/res/cardsfolder/l/last_rites.txt @@ -5,6 +5,6 @@ A:SP$ Discard | Cost$ 2 B | AnyNumber$ True | Optional$ True | Mode$ TgtChoose | SVar:DBLastRitesDiscard:DB$ Discard | Mode$ RevealYouChoose | NumCards$ X | DiscardValid$ Card.nonLand | ValidTgts$ Opponent | References$ X SVar:DBLastRitesCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/last_rites.jpg Oracle:Discard any number of cards. Target player reveals their hand, then you choose a nonland card from it for each card discarded this way. That player discards those cards. diff --git a/forge-gui/res/cardsfolder/l/last_stand.txt b/forge-gui/res/cardsfolder/l/last_stand.txt index 7980d9a4f93..fa93215922a 100644 --- a/forge-gui/res/cardsfolder/l/last_stand.txt +++ b/forge-gui/res/cardsfolder/l/last_stand.txt @@ -12,6 +12,6 @@ SVar:MountainsYouControl:Count$TypeYouCtrl.Mountain SVar:ForestsYouControl:Count$TypeYouCtrl.Forest SVar:PlainsYouControl:Count$TypeYouCtrl.Plains/Times.2 SVar:IslandsYouControl:Count$TypeYouCtrl.Island -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/last_stand.jpg Oracle:Target opponent loses 2 life for each Swamp you control. Last Stand deals damage to target creature equal to the number of Mountains you control. Create a 1/1 green Saproling creature token for each Forest you control. You gain 2 life for each Plains you control. Draw a card for each Island you control, then discard that many cards. diff --git a/forge-gui/res/cardsfolder/l/latulla_keldon_overseer.txt b/forge-gui/res/cardsfolder/l/latulla_keldon_overseer.txt index 2e5656ec24d..577251770cd 100644 --- a/forge-gui/res/cardsfolder/l/latulla_keldon_overseer.txt +++ b/forge-gui/res/cardsfolder/l/latulla_keldon_overseer.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Human Spellshaper PT:3/3 A:AB$ DealDamage | Cost$ X R T Discard<2/Card>| ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals X damage to any target. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/latulla_keldon_overseer.jpg Oracle:{X}{R}, {T}, Discard two cards: Latulla, Keldon Overseer deals X damage to any target. diff --git a/forge-gui/res/cardsfolder/l/launch_party.txt b/forge-gui/res/cardsfolder/l/launch_party.txt index eb0e62d2d78..1eaba21e923 100644 --- a/forge-gui/res/cardsfolder/l/launch_party.txt +++ b/forge-gui/res/cardsfolder/l/launch_party.txt @@ -3,6 +3,6 @@ ManaCost:3 B Types:Instant A:SP$ Destroy | Cost$ 3 B Sac<1/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBDrain | SpellDescription$ Destroy target creature. Its controller loses 2 life. SVar:DBDrain:DB$LoseLife | Defined$ TargetedController | LifeAmount$ 2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/launch_party.jpg Oracle:As an additional cost to cast Launch Party, sacrifice a creature.\nDestroy target creature. Its controller loses 2 life. diff --git a/forge-gui/res/cardsfolder/l/lavacore_elemental.txt b/forge-gui/res/cardsfolder/l/lavacore_elemental.txt index 67ad211e5ef..b69ece48e2a 100644 --- a/forge-gui/res/cardsfolder/l/lavacore_elemental.txt +++ b/forge-gui/res/cardsfolder/l/lavacore_elemental.txt @@ -5,6 +5,6 @@ PT:5/3 K:Vanishing:1 T:Mode$ DamageDone | ValidSource$ Creature.YouCtrl | TriggerZones$ Battlefield | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigPutCounter | TriggerDescription$ Whenever a creature you control deals combat damage to a player, put a time counter on CARDNAME. SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ TIME | CounterNum$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/lavacore_elemental.jpg Oracle:Vanishing 1 (This permanent enters the battlefield with a time counter on it. At the beginning of your upkeep, remove a time counter from it. When the last is removed, sacrifice it.)\nWhenever a creature you control deals combat damage to a player, put a time counter on Lavacore Elemental. diff --git a/forge-gui/res/cardsfolder/l/lawbringer.txt b/forge-gui/res/cardsfolder/l/lawbringer.txt index 474cd15baf8..6693951b168 100644 --- a/forge-gui/res/cardsfolder/l/lawbringer.txt +++ b/forge-gui/res/cardsfolder/l/lawbringer.txt @@ -3,6 +3,6 @@ ManaCost:2 W Types:Creature Kor Rebel PT:2/2 A:AB$ ChangeZone | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Creature.Red | TgtPrompt$ Select target red Creature | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target red creature. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/lawbringer.jpg Oracle:{T}, Sacrifice Lawbringer: Exile target red creature. diff --git a/forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt b/forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt index a0bc6751f89..e8ca9b12e08 100644 --- a/forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt +++ b/forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt @@ -5,6 +5,6 @@ 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 Lazav, Dimir Mastermind become a copy of that card, except its name is Lazav, Dimir Mastermind, it’s legendary in addition to its other types, and it has hexproof and this ability. SVar:LazavCopy:DB$ Clone | Defined$ TriggeredCard | NewName$ Lazav, Dimir Mastermind | AddTypes$ Legendary | AddKeywords$ Hexproof | GainThisAbility$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All 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 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/l/lead_belly_chimera.txt b/forge-gui/res/cardsfolder/l/lead_belly_chimera.txt index 6741ca8b84e..360b26b9c62 100644 --- a/forge-gui/res/cardsfolder/l/lead_belly_chimera.txt +++ b/forge-gui/res/cardsfolder/l/lead_belly_chimera.txt @@ -5,6 +5,6 @@ PT:2/2 K:Trample A:AB$ PutCounter | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.Chimera | TgtPrompt$ Select target Chimera creature | CounterType$ P2P2 | CounterNum$ 1 | SubAbility$ DBPump | SpellDescription$ Put a +2/+2 counter on target Chimera creature. It gains trample. (This effect lasts indefinitely.) SVar:DBPump:DB$Pump | KW$ Trample | Defined$ Targeted | Permanent$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/lead_belly_chimera.jpg Oracle:Trample\nSacrifice Lead-Belly Chimera: Put a +2/+2 counter on target Chimera creature. It gains trample. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/l/leaden_fists.txt b/forge-gui/res/cardsfolder/l/leaden_fists.txt index 6683b501487..b2815ba7d4d 100644 --- a/forge-gui/res/cardsfolder/l/leaden_fists.txt +++ b/forge-gui/res/cardsfolder/l/leaden_fists.txt @@ -5,6 +5,6 @@ K:Flash K:Enchant creature A:SP$ Attach | Cost$ 2 U | ValidTgts$ Creature | AILogic$ KeepTapped S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 3 | AddToughness$ 3 | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Enchanted creature gets +3/+3 and doesn't untap during its controller's untap step. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/leaden_fists.jpg Oracle:Flash (You may cast this spell any time you could cast an instant.)\nEnchant creature\nEnchanted creature gets +3/+3 and doesn't untap during its controller's untap step. diff --git a/forge-gui/res/cardsfolder/l/leaf_crowned_elder.txt b/forge-gui/res/cardsfolder/l/leaf_crowned_elder.txt index 21c12a51694..c4cb626340a 100644 --- a/forge-gui/res/cardsfolder/l/leaf_crowned_elder.txt +++ b/forge-gui/res/cardsfolder/l/leaf_crowned_elder.txt @@ -6,6 +6,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigKinship | Trigge SVar:TrigKinship:DB$ PeekAndReveal | PeekAmount$ 1 | RevealValid$ Card.sharesCreatureTypeWith | RevealOptional$ True | RememberRevealed$ True | SubAbility$ DBPlay SVar:DBPlay:DB$ Play | Defined$ TopOfLibrary | WithoutManaCost$ True | Optional$ True | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/leaf_crowned_elder.jpg Oracle:Kinship — At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Leaf-Crowned Elder, you may reveal it. If you do, you may play that card without paying its mana cost. diff --git a/forge-gui/res/cardsfolder/l/leave_no_trace.txt b/forge-gui/res/cardsfolder/l/leave_no_trace.txt index 3244bf74a20..e05b6859e2d 100644 --- a/forge-gui/res/cardsfolder/l/leave_no_trace.txt +++ b/forge-gui/res/cardsfolder/l/leave_no_trace.txt @@ -2,6 +2,6 @@ Name:Leave No Trace ManaCost:1 W Types:Instant A:SP$ Destroy | Cost$ 1 W | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | Radiance$ True | SpellDescription$ Radiance — Destroy target enchantment and each other enchantment that shares a color with it. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/leave_no_trace.jpg Oracle:Radiance — Destroy target enchantment and each other enchantment that shares a color with it. diff --git a/forge-gui/res/cardsfolder/l/leech_bonder.txt b/forge-gui/res/cardsfolder/l/leech_bonder.txt index 478c02beec8..58dae737737 100644 --- a/forge-gui/res/cardsfolder/l/leech_bonder.txt +++ b/forge-gui/res/cardsfolder/l/leech_bonder.txt @@ -5,6 +5,6 @@ PT:3/3 K:etbCounter:M1M1:2 A:AB$ Pump | Cost$ U Q | ValidTgts$ Creature | TgtPrompt$ Select target creature to remove counters | SubAbility$ DBMove | StackDescription$ None | SpellDescription$ Move a counter from target creature onto a second target creature. SVar:DBMove:DB$ MoveCounter | Source$ ParentTarget | ValidTgts$ Creature | TgtPrompt$ Select target creature to add counters | TargetUnique$ True | CounterType$ Any | CounterNum$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/leech_bonder.jpg Oracle:Leech Bonder enters the battlefield with two -1/-1 counters on it.\n{U}, {Q}: Move a counter from target creature onto a second target creature. ({Q} is the untap symbol.) diff --git a/forge-gui/res/cardsfolder/l/leeches.txt b/forge-gui/res/cardsfolder/l/leeches.txt index 2efc2d182eb..38131f2c41f 100644 --- a/forge-gui/res/cardsfolder/l/leeches.txt +++ b/forge-gui/res/cardsfolder/l/leeches.txt @@ -4,7 +4,7 @@ Types:Sorcery A:SP$ DealDamage | Cost$ 1 W W | ValidTgts$ Player | NumDmg$ X | References$ X | SubAbility$ Unpoison | SpellDescription$ Target player loses all poison counters. Leeches deals that much damage to that player. SVar:Unpoison:DB$ Poison | Defined$ ParentTarget | Num$ -X SVar:X:TargetedPlayer$PoisonCounters -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/leeches.jpg Oracle:Target player loses all poison counters. Leeches deals that much damage to that player. diff --git a/forge-gui/res/cardsfolder/l/leeching_licid.txt b/forge-gui/res/cardsfolder/l/leeching_licid.txt index b78d2424640..3a618cfdea9 100644 --- a/forge-gui/res/cardsfolder/l/leeching_licid.txt +++ b/forge-gui/res/cardsfolder/l/leeching_licid.txt @@ -7,6 +7,6 @@ SVar:DBAttach:DB$ Attach | ValidTgts$ Creature | AILogic$ Curse SVar:SPAttach:SP$ Attach | Cost$ 0 | ValidTgts$ Creature T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ EnchantedController | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of the upkeep of enchanted creature's controller, CARDNAME deals 1 damage to that player. SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredPlayer | NumDmg$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/leeching_licid.jpg Oracle:{B}, {T}: Leeching Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {B} to end this effect.\nAt the beginning of the upkeep of enchanted creature's controller, Leeching Licid deals 1 damage to that player. diff --git a/forge-gui/res/cardsfolder/l/legacy_weapon.txt b/forge-gui/res/cardsfolder/l/legacy_weapon.txt index 3c01d7c270c..dfe4dcd8ca9 100644 --- a/forge-gui/res/cardsfolder/l/legacy_weapon.txt +++ b/forge-gui/res/cardsfolder/l/legacy_weapon.txt @@ -3,6 +3,6 @@ ManaCost:7 Types:Legendary Artifact A:AB$ ChangeZone | Cost$ W U B R G | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target permanent. K:If CARDNAME would be put into a graveyard from anywhere, reveal CARDNAME and shuffle it into its owner's library instead. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/legacy_weapon.jpg Oracle:{W}{U}{B}{R}{G}: Exile target permanent.\nIf Legacy Weapon would be put into a graveyard from anywhere, reveal Legacy Weapon and shuffle it into its owner's library instead. diff --git a/forge-gui/res/cardsfolder/l/legerdemain.txt b/forge-gui/res/cardsfolder/l/legerdemain.txt index 8ef89464a72..aac8a000596 100644 --- a/forge-gui/res/cardsfolder/l/legerdemain.txt +++ b/forge-gui/res/cardsfolder/l/legerdemain.txt @@ -3,6 +3,6 @@ ManaCost:2 U U Types:Sorcery A:SP$ Pump | Cost$ 2 U U | ValidTgts$ Artifact,Creature | TgtPrompt$ target artifact or creature | StackDescription$ None | SubAbility$ DBExchange | SpellDescription$ Exchange control of target artifact or creature and another target permanent that shares one of those types with it. (This effect lasts indefinitely.) SVar:DBExchange:DB$ ExchangeControl | Defined$ ParentTarget | ValidTgts$ Permanent | TgtPrompt$ Select target permanent that shares one of those types | TargetsWithSharedTypes$ Artifact,Creature | TargetUnique$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/legerdemain.jpg Oracle:Exchange control of target artifact or creature and another target permanent that shares one of those types with it. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/l/lens_of_clarity.txt b/forge-gui/res/cardsfolder/l/lens_of_clarity.txt index 7945f47f15a..15f86e34287 100644 --- a/forge-gui/res/cardsfolder/l/lens_of_clarity.txt +++ b/forge-gui/res/cardsfolder/l/lens_of_clarity.txt @@ -2,7 +2,7 @@ Name:Lens of Clarity ManaCost:1 Types:Artifact S:Mode$ Continuous | Affected$ Card.TopLibrary+YouCtrl,Creature.faceDown+YouDontCtrl | AffectedZone$ Library,Battlefield | MayLookAt$ You | Description$ You may look at the top card of your library and at face-down creatures you don't control. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/lens_of_clarity.jpg Oracle:You may look at the top card of your library and at face-down creatures you don't control. (You may do this at any time.) diff --git a/forge-gui/res/cardsfolder/l/leonin_arbiter.txt b/forge-gui/res/cardsfolder/l/leonin_arbiter.txt index f3536ac52bc..c352838ed3f 100644 --- a/forge-gui/res/cardsfolder/l/leonin_arbiter.txt +++ b/forge-gui/res/cardsfolder/l/leonin_arbiter.txt @@ -4,6 +4,6 @@ Types:Creature Cat Cleric PT:2/2 S:Mode$ Continuous | Affected$ Player | AddKeyword$ CantSearchLibrary | IgnoreEffectCost$ 2 | Description$ Players can't search libraries. Any player may pay {2} for that player to ignore this effect until end of turn. #TODO: The AI won't activate the effect yet, but then again, it won't activate it even if the human is playing with this card, so it doesn't affect specifically the AI playability of this card. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/leonin_arbiter.jpg Oracle:Players can't search libraries. Any player may pay {2} for that player to ignore this effect until end of turn. diff --git a/forge-gui/res/cardsfolder/l/leonin_sun_standard.txt b/forge-gui/res/cardsfolder/l/leonin_sun_standard.txt index 6f727cd0acf..a068e980bf3 100644 --- a/forge-gui/res/cardsfolder/l/leonin_sun_standard.txt +++ b/forge-gui/res/cardsfolder/l/leonin_sun_standard.txt @@ -2,7 +2,7 @@ Name:Leonin Sun Standard ManaCost:2 Types:Artifact A:AB$ PumpAll | Cost$ 1 W | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Creatures you control get +1/+1 until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$white SVar:Picture:http://www.wizards.com/global/images/magic/general/leonin_sun_standard.jpg Oracle:{1}{W}: Creatures you control get +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/l/leshracs_sigil.txt b/forge-gui/res/cardsfolder/l/leshracs_sigil.txt index 56123824341..e8597fd9e1c 100644 --- a/forge-gui/res/cardsfolder/l/leshracs_sigil.txt +++ b/forge-gui/res/cardsfolder/l/leshracs_sigil.txt @@ -4,6 +4,6 @@ Types:Enchantment A:AB$ ChangeZone | Cost$ B B | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. T:Mode$ SpellCast | ValidCard$ Card.Green | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDiscard | OptionalDecider$ You | TriggerDescription$ Whenever an opponent casts a green spell, you may pay {B}{B}. If you do, look at that player's hand and choose a card from it. The player discards that card. SVar:TrigDiscard:AB$ Discard | Cost$ B B | Defined$ TriggeredActivator | NumCards$ 1 | Mode$ RevealYouChoose -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/leshracs_sigil.jpg Oracle:Whenever an opponent casts a green spell, you may pay {B}{B}. If you do, look at that player's hand and choose a card from it. The player discards that card.\n{B}{B}: Return Leshrac's Sigil to its owner's hand. diff --git a/forge-gui/res/cardsfolder/l/lethal_vapors.txt b/forge-gui/res/cardsfolder/l/lethal_vapors.txt index 3b974087d83..5cc5b9e2506 100644 --- a/forge-gui/res/cardsfolder/l/lethal_vapors.txt +++ b/forge-gui/res/cardsfolder/l/lethal_vapors.txt @@ -6,6 +6,6 @@ SVar:TrigDestroy:DB$ Destroy | Defined$ TriggeredCard A:AB$ Destroy | Cost$ 0 | Defined$ Self | SubAbility$ DBSkipTurn | AnyPlayer$ True | AILogic$ WillSkipTurn | SpellDescription$ Destroy CARDNAME. You skip your next turn. Any player may activate this ability. SVar:DBSkipTurn:DB$ SkipTurn | Defined$ You | NumTurns$ 1 | AILogic$ Always SVar:AICurseEffect:DestroyCreature -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/lethal_vapors.jpg Oracle:Whenever a creature enters the battlefield, destroy it.\n{0}: Destroy Lethal Vapors. You skip your next turn. Any player may activate this ability. diff --git a/forge-gui/res/cardsfolder/l/leveler.txt b/forge-gui/res/cardsfolder/l/leveler.txt index 4015c585864..c0ae2719b75 100644 --- a/forge-gui/res/cardsfolder/l/leveler.txt +++ b/forge-gui/res/cardsfolder/l/leveler.txt @@ -4,6 +4,6 @@ Types:Artifact Creature Juggernaut PT:10/10 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExileYourLibrary | TriggerDescription$ When CARDNAME enters the battlefield, exile all cards from your library. SVar:TrigExileYourLibrary:DB$ChangeZoneAll | ChangeType$ Card.YouOwn | Origin$ Library | Destination$ Exile -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/leveler.jpg Oracle:When Leveler enters the battlefield, exile all cards from your library. diff --git a/forge-gui/res/cardsfolder/l/leviathan.txt b/forge-gui/res/cardsfolder/l/leviathan.txt index 89a76dee02b..53709d6109c 100644 --- a/forge-gui/res/cardsfolder/l/leviathan.txt +++ b/forge-gui/res/cardsfolder/l/leviathan.txt @@ -10,6 +10,6 @@ SVar:TrigUntap:AB$ Untap | Cost$ Sac<2/Island> S:Mode$ CantAttackUnless | ValidCard$ Creature.Self | Target$ Player,Planeswalker | Cost$ Sac<2/Island> | Description$ CARDNAME can't attack unless you sacrifice two islands. (This cost is paid as attackers are declared.) SVar:NeedsToPlayVar:Y GE4 SVar:Y:Count$Valid Island.YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/leviathan.jpg Oracle:Trample\nLeviathan enters the battlefield tapped and doesn't untap during your untap step.\nAt the beginning of your upkeep, you may sacrifice two Islands. If you do, untap Leviathan.\nLeviathan can't attack unless you sacrifice two Islands. (This cost is paid as attackers are declared.) diff --git a/forge-gui/res/cardsfolder/l/ley_line.txt b/forge-gui/res/cardsfolder/l/ley_line.txt index 18609354192..0374eea41c6 100644 --- a/forge-gui/res/cardsfolder/l/ley_line.txt +++ b/forge-gui/res/cardsfolder/l/ley_line.txt @@ -3,6 +3,6 @@ ManaCost:3 G Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | OptionalDecider$ TriggeredPlayer | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of each player's upkeep, that player may put a +1/+1 counter on target creature of their choice. SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | TargetingPlayer$ TriggeredPlayer -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ley_line.jpg Oracle:At the beginning of each player's upkeep, that player may put a +1/+1 counter on target creature of their choice. diff --git a/forge-gui/res/cardsfolder/l/leyline_of_lifeforce.txt b/forge-gui/res/cardsfolder/l/leyline_of_lifeforce.txt index 66a95ab80af..1e60fdd6691 100644 --- a/forge-gui/res/cardsfolder/l/leyline_of_lifeforce.txt +++ b/forge-gui/res/cardsfolder/l/leyline_of_lifeforce.txt @@ -5,6 +5,6 @@ K:MayEffectFromOpeningHand:FromHand SVar:FromHand:DB$ ChangeZone | Defined$ Self | Origin$ Hand | Destination$ Battlefield | SpellDescription$ If CARDNAME is in your opening hand, you may begin the game with it on the battlefield. S:Mode$ Continuous | Affected$ Creature | AddHiddenKeyword$ CARDNAME can't be countered. | AffectedZone$ Stack | Description$ Creature spells can't be countered. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/leyline_of_lifeforce.jpg Oracle:If Leyline of Lifeforce is in your opening hand, you may begin the game with it on the battlefield.\nCreature spells can't be countered. diff --git a/forge-gui/res/cardsfolder/l/leyline_of_lightning.txt b/forge-gui/res/cardsfolder/l/leyline_of_lightning.txt index cc9834739f3..8c09ba6edf6 100644 --- a/forge-gui/res/cardsfolder/l/leyline_of_lightning.txt +++ b/forge-gui/res/cardsfolder/l/leyline_of_lightning.txt @@ -5,6 +5,6 @@ K:MayEffectFromOpeningHand:FromHand SVar:FromHand:DB$ ChangeZone | Defined$ Self | Origin$ Hand | Destination$ Battlefield | SpellDescription$ If CARDNAME is in your opening hand, you may begin the game with it on the battlefield. T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever you cast a spell, you may pay {1}. If you do, CARDNAME deals 1 damage to target player or planeswalker. SVar:TrigDealDamage:AB$DealDamage | Cost$ 1 | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | NumDmg$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/leyline_of_lightning.jpg Oracle:If Leyline of Lightning is in your opening hand, you may begin the game with it on the battlefield.\nWhenever you cast a spell, you may pay {1}. If you do, Leyline of Lightning deals 1 damage to target player or planeswalker. diff --git a/forge-gui/res/cardsfolder/l/leyline_of_punishment.txt b/forge-gui/res/cardsfolder/l/leyline_of_punishment.txt index 304ddfe614e..eef26edfe6b 100644 --- a/forge-gui/res/cardsfolder/l/leyline_of_punishment.txt +++ b/forge-gui/res/cardsfolder/l/leyline_of_punishment.txt @@ -6,6 +6,6 @@ SVar:FromHand:DB$ ChangeZone | Defined$ Self | Origin$ Hand | Destination$ Battl S:Mode$ Continuous | Affected$ Player | AddKeyword$ You can't gain life. | Description$ Players can't gain life. S:Mode$ Continuous | GlobalRule$ Damage can't be prevented. | Description$ Damage can't be prevented. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/leyline_of_punishment.jpg Oracle:If Leyline of Punishment is in your opening hand, you may begin the game with it on the battlefield.\nPlayers can't gain life.\nDamage can't be prevented. diff --git a/forge-gui/res/cardsfolder/l/leyline_of_singularity.txt b/forge-gui/res/cardsfolder/l/leyline_of_singularity.txt index a6bc416dc1f..a7475eb8e9a 100644 --- a/forge-gui/res/cardsfolder/l/leyline_of_singularity.txt +++ b/forge-gui/res/cardsfolder/l/leyline_of_singularity.txt @@ -4,6 +4,6 @@ Types:Enchantment K:MayEffectFromOpeningHand:FromHand SVar:FromHand:DB$ ChangeZone | Defined$ Self | Origin$ Hand | Destination$ Battlefield | SpellDescription$ If CARDNAME is in your opening hand, you may begin the game with it on the battlefield. S:Mode$ Continuous | Affected$ Permanent.nonLand | AddType$ Legendary | Description$ All nonland permanents are legendary. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/leyline_of_singularity.jpg Oracle:If Leyline of Singularity is in your opening hand, you may begin the game with it on the battlefield.\nAll nonland permanents are legendary. diff --git a/forge-gui/res/cardsfolder/l/leyline_of_the_meek.txt b/forge-gui/res/cardsfolder/l/leyline_of_the_meek.txt index d28a728996e..3425cbba1a1 100644 --- a/forge-gui/res/cardsfolder/l/leyline_of_the_meek.txt +++ b/forge-gui/res/cardsfolder/l/leyline_of_the_meek.txt @@ -5,6 +5,6 @@ K:MayEffectFromOpeningHand:FromHand SVar:FromHand:DB$ ChangeZone | Defined$ Self | Origin$ Hand | Destination$ Battlefield | SpellDescription$ If CARDNAME is in your opening hand, you may begin the game with it on the battlefield. S:Mode$ Continuous | Affected$ Creature.token | AddPower$ 1 | AddToughness$ 1 | Description$ Creature tokens get +1/+1. SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/leyline_of_the_meek.jpg Oracle:If Leyline of the Meek is in your opening hand, you may begin the game with it on the battlefield.\nCreature tokens get +1/+1. diff --git a/forge-gui/res/cardsfolder/l/leyline_of_the_void.txt b/forge-gui/res/cardsfolder/l/leyline_of_the_void.txt index 9047d77d5bd..7bb91dcf54e 100644 --- a/forge-gui/res/cardsfolder/l/leyline_of_the_void.txt +++ b/forge-gui/res/cardsfolder/l/leyline_of_the_void.txt @@ -6,6 +6,6 @@ SVar:FromHand:DB$ ChangeZone | Defined$ Self | Origin$ Hand | Destination$ Battl R:Event$ Moved | ActiveZones$ Battlefield | Destination$ Graveyard | ValidCard$ Card.nonToken+OppOwn | ReplaceWith$ Exile | Description$ If a card would be put into an opponent's graveyard from anywhere, exile it instead. SVar:Exile:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Exile | Defined$ ReplacedCard SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/leyline_of_the_void.jpg Oracle:If Leyline of the Void is in your opening hand, you may begin the game with it on the battlefield.\nIf a card would be put into an opponent's graveyard from anywhere, exile it instead. diff --git a/forge-gui/res/cardsfolder/l/leyline_of_vitality.txt b/forge-gui/res/cardsfolder/l/leyline_of_vitality.txt index a190af5d0fa..bf9713a6b3b 100644 --- a/forge-gui/res/cardsfolder/l/leyline_of_vitality.txt +++ b/forge-gui/res/cardsfolder/l/leyline_of_vitality.txt @@ -7,6 +7,6 @@ S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddToughness$ 1 | Description$ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever a creature enters the battlefield under your control, you may gain 1 life. SVar:TrigGainLife:DB$GainLife | Defined$ You | LifeAmount$ 1 SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/leyline_of_vitality.jpg Oracle:If Leyline of Vitality is in your opening hand, you may begin the game with it on the battlefield.\nCreatures you control get +0/+1.\nWhenever a creature enters the battlefield under your control, you may gain 1 life. diff --git a/forge-gui/res/cardsfolder/l/liability.txt b/forge-gui/res/cardsfolder/l/liability.txt index c23ad6b5e47..7d4471be30e 100644 --- a/forge-gui/res/cardsfolder/l/liability.txt +++ b/forge-gui/res/cardsfolder/l/liability.txt @@ -3,6 +3,6 @@ ManaCost:1 B B Types:Enchantment T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Permanent.nonToken | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever a nontoken permanent is put into a player's graveyard from the battlefield, that player loses 1 life. SVar:TrigLoseLife:DB$LoseLife | Defined$ TriggeredCardOwner | LifeAmount$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/liability.jpg Oracle:Whenever a nontoken permanent is put into a player's graveyard from the battlefield, that player loses 1 life. diff --git a/forge-gui/res/cardsfolder/l/liars_pendulum.txt b/forge-gui/res/cardsfolder/l/liars_pendulum.txt index f8229a04c12..6a102dfea25 100644 --- a/forge-gui/res/cardsfolder/l/liars_pendulum.txt +++ b/forge-gui/res/cardsfolder/l/liars_pendulum.txt @@ -9,6 +9,6 @@ SVar:DBInHandDraw:DB$ Draw | Defined$ You | ConditionPlayerDefined$ Remembered | SVar:DBNotInHandDraw:DB$ Draw | Defined$ You | ConditionPlayerDefined$ Remembered | ConditionPlayerContains$ You | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$ValidHand Card.NamedCard -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/liars_pendulum.jpg Oracle:{2}, {T}: Choose a card name. Target opponent guesses whether a card with that name is in your hand. You may reveal your hand. If you do and your opponent guessed wrong, draw a card. diff --git a/forge-gui/res/cardsfolder/l/liberated_dwarf.txt b/forge-gui/res/cardsfolder/l/liberated_dwarf.txt index 9af61407841..59f806e5c1e 100644 --- a/forge-gui/res/cardsfolder/l/liberated_dwarf.txt +++ b/forge-gui/res/cardsfolder/l/liberated_dwarf.txt @@ -3,7 +3,7 @@ ManaCost:R Types:Creature Dwarf PT:1/1 A:AB$ Pump | Cost$ R Sac<1/CARDNAME> | ValidTgts$ Creature.Green | TgtPrompt$ Select target green creature | NumAtt$ +1 | KW$ First Strike | SpellDescription$ Target green creature gets +1/+0 and gains first strike until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Color$Green SVar:Picture:http://www.wizards.com/global/images/magic/general/liberated_dwarf.jpg Oracle:{R}, Sacrifice Liberated Dwarf: Target green creature gets +1/+0 and gains first strike until end of turn. diff --git a/forge-gui/res/cardsfolder/l/lich.txt b/forge-gui/res/cardsfolder/l/lich.txt index 1909dcf6cd9..3a448609c18 100644 --- a/forge-gui/res/cardsfolder/l/lich.txt +++ b/forge-gui/res/cardsfolder/l/lich.txt @@ -16,7 +16,7 @@ SVar:PermanentsToSac:TriggerCount$DamageAmount SVar:Y:Count$Valid Permanent.nontoken+YouCtrl T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigLose | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you lose the game. SVar:TrigLose:DB$ LosesGame | Defined$ You -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/lich.jpg Oracle:As Lich enters the battlefield, you lose life equal to your life total.\nYou don't lose the game for having 0 or less life.\nIf you would gain life, draw that many cards instead.\nWhenever you're dealt damage, sacrifice that many nontoken permanents. If you can't, you lose the game.\nWhen Lich is put into a graveyard from the battlefield, you lose the game. diff --git a/forge-gui/res/cardsfolder/l/lichs_tomb.txt b/forge-gui/res/cardsfolder/l/lichs_tomb.txt index 9e6bc89b2f2..999f1d4e40b 100644 --- a/forge-gui/res/cardsfolder/l/lichs_tomb.txt +++ b/forge-gui/res/cardsfolder/l/lichs_tomb.txt @@ -5,6 +5,6 @@ S:Mode$ Continuous | Affected$ You | AddKeyword$ You don't lose the game for hav T:Mode$ LifeLost | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ Whenever you lose life, sacrifice a permanent for each 1 life you lost. (Damage causes loss of life.) SVar:TrigSac:DB$Sacrifice | Amount$ X | SacValid$ Permanent | References$ X SVar:X:TriggerCount$LifeAmount -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/lichs_tomb.jpg Oracle:You don't lose the game for having 0 or less life.\nWhenever you lose life, sacrifice a permanent for each 1 life you lost. (Damage causes loss of life.) diff --git a/forge-gui/res/cardsfolder/l/liege_of_the_pit.txt b/forge-gui/res/cardsfolder/l/liege_of_the_pit.txt index 04c0e50bbe9..0766eb28a4f 100644 --- a/forge-gui/res/cardsfolder/l/liege_of_the_pit.txt +++ b/forge-gui/res/cardsfolder/l/liege_of_the_pit.txt @@ -10,6 +10,6 @@ SVar:TrigSac:DB$Sacrifice | Defined$ You | SacValid$ Creature.Other | SubAbility SVar:DBDamage:DB$ DealDamage | Defined$ You | NumDmg$ 7 | ConditionCheckSVar$ X | ConditionSVarCompare$ LT1 | SubAbility$ DBCleanup | References$ X SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/liege_of_the_pit.jpg Oracle:Flying, trample\nAt the beginning of your upkeep, sacrifice a creature other than Liege of the Pit. If you can't, Liege of the Pit deals 7 damage to you.\nMorph {B}{B}{B}{B} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) diff --git a/forge-gui/res/cardsfolder/l/lieutenant_kirtar.txt b/forge-gui/res/cardsfolder/l/lieutenant_kirtar.txt index e9f937ac8d8..a26389e2366 100644 --- a/forge-gui/res/cardsfolder/l/lieutenant_kirtar.txt +++ b/forge-gui/res/cardsfolder/l/lieutenant_kirtar.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Bird Soldier PT:2/2 K:Flying A:AB$ ChangeZone | Cost$ 1 W Sac<1/CARDNAME> | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking Creature | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target attacking creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/lieutenant_kirtar.jpg Oracle:Flying\n{1}{W}, Sacrifice Lieutenant Kirtar: Exile target attacking creature. diff --git a/forge-gui/res/cardsfolder/l/life_and_limb.txt b/forge-gui/res/cardsfolder/l/life_and_limb.txt index 7fae62fc806..35ea5a69eea 100644 --- a/forge-gui/res/cardsfolder/l/life_and_limb.txt +++ b/forge-gui/res/cardsfolder/l/life_and_limb.txt @@ -3,6 +3,6 @@ ManaCost:3 G Types:Enchantment S:Mode$ Continuous | Affected$ Forest,Saproling | SetPower$ 1 | SetToughness$ 1 | AddType$ Land & Creature & Forest & Saproling | SetColor$ Green | Description$ All Forests and all Saprolings are 1/1 green Saproling creatures and Forest lands in addition to their other types. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/life_and_limb.jpg Oracle:All Forests and all Saprolings are 1/1 green Saproling creatures and Forest lands in addition to their other types. diff --git a/forge-gui/res/cardsfolder/l/life_chisel.txt b/forge-gui/res/cardsfolder/l/life_chisel.txt index 4193b8c55e9..c170081a58d 100644 --- a/forge-gui/res/cardsfolder/l/life_chisel.txt +++ b/forge-gui/res/cardsfolder/l/life_chisel.txt @@ -3,7 +3,7 @@ ManaCost:4 Types:Artifact A:AB$ GainLife | Cost$ Sac<1/Creature> | LifeAmount$ X | PlayerTurn$ True | ActivationPhases$ Upkeep | References$ X | SpellDescription$ You gain life equal to the sacrificed creature's toughness. Activate this ability only during your upkeep. SVar:X:Sacrificed$CardToughness -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/life_chisel.jpg Oracle:Sacrifice a creature: You gain life equal to the sacrificed creature's toughness. Activate this ability only during your upkeep. diff --git a/forge-gui/res/cardsfolder/l/life_matrix.txt b/forge-gui/res/cardsfolder/l/life_matrix.txt index 8000b1b427f..0e286b459ba 100644 --- a/forge-gui/res/cardsfolder/l/life_matrix.txt +++ b/forge-gui/res/cardsfolder/l/life_matrix.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ PutCounter | Cost$ 4 T | PlayerTurn$ True | ActivationPhases$ Upkeep | CounterType$ MATRIX | CounterNum$ 1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBAnimate | SpellDescription$ Put a matrix counter on target creature and that creature gains "Remove a matrix counter from this creature: Regenerate this creature." SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Abilities$ Regen | Permanent$ True | SpellDescription$ Activate this ability only during your upkeep. SVar:Regen:AB$ Regenerate | Cost$ SubCounter<1/MATRIX> | SpellDescription$ Regenerate CARDNAME. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/life_matrix.jpg Oracle:{4}, {T}: Put a matrix counter on target creature and that creature gains "Remove a matrix counter from this creature: Regenerate this creature." Activate this ability only during your upkeep. diff --git a/forge-gui/res/cardsfolder/l/lifeblood.txt b/forge-gui/res/cardsfolder/l/lifeblood.txt index 6716da768a8..fe5775a06af 100644 --- a/forge-gui/res/cardsfolder/l/lifeblood.txt +++ b/forge-gui/res/cardsfolder/l/lifeblood.txt @@ -3,6 +3,6 @@ ManaCost:2 W W Types:Enchantment T:Mode$ Taps | ValidCard$ Mountain.OppCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever a Mountain an opponent controls becomes tapped, you gain 1 life. SVar:TrigGainLife:DB$GainLife | LifeAmount$ 1 | Defined$ You -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/lifeblood.jpg Oracle:Whenever a Mountain an opponent controls becomes tapped, you gain 1 life. diff --git a/forge-gui/res/cardsfolder/l/lifecraft_awakening.txt b/forge-gui/res/cardsfolder/l/lifecraft_awakening.txt index 4effade1a8e..5e14ba071bf 100644 --- a/forge-gui/res/cardsfolder/l/lifecraft_awakening.txt +++ b/forge-gui/res/cardsfolder/l/lifecraft_awakening.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ PutCounter | Cost$ X G | ValidTgts$ Artifact.YouCtrl | TgtPrompt$ Select target artifact you control | CounterType$ P1P1 | CounterNum$ X | References$ X | SubAbility$ DBAnimate | SpellDescription$ Put X +1/+1 counters on target artifact you control. If it isn't a creature or Vehicle, it becomes a 0/0 Construct artifact creature. SVar:DBAnimate:DB$ Animate | Defined$ Targeted.nonCreature+nonVehicle | Power$ 0 | Toughness$ 0 | Types$ Artifact,Creature,Construct | Permanent$ True SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/lifecraft_awakening.jpg Oracle:Put X +1/+1 counters on target artifact you control. If it isn't a creature or Vehicle, it becomes a 0/0 Construct artifact creature. diff --git a/forge-gui/res/cardsfolder/l/lifecrafters_bestiary.txt b/forge-gui/res/cardsfolder/l/lifecrafters_bestiary.txt index 95bcad9275c..6272d0e8a2a 100644 --- a/forge-gui/res/cardsfolder/l/lifecrafters_bestiary.txt +++ b/forge-gui/res/cardsfolder/l/lifecrafters_bestiary.txt @@ -5,7 +5,7 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E SVar:TrigScry:DB$ Scry | ScryNum$ 1 T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | Execute$ TrigDraw | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever you cast a creature spell, you may pay {G}. If you do, draw a card. SVar:TrigDraw:AB$Draw | Cost$ G | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Green SVar:Picture:http://www.wizards.com/global/images/magic/general/lifecrafters_bestiary.jpg Oracle:At the beginning of your upkeep, scry 1.\nWhenever you cast a creature spell, you may pay {G}. If you do, draw a card. diff --git a/forge-gui/res/cardsfolder/l/lifeforce.txt b/forge-gui/res/cardsfolder/l/lifeforce.txt index 008d22358fe..e663730b794 100644 --- a/forge-gui/res/cardsfolder/l/lifeforce.txt +++ b/forge-gui/res/cardsfolder/l/lifeforce.txt @@ -2,7 +2,7 @@ Name:Lifeforce ManaCost:G G Types:Enchantment A:AB$ Counter | Cost$ G G | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card.Black | SpellDescription$ Counter target black spell. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/lifeforce.jpg Oracle:{G}{G}: Counter target black spell. diff --git a/forge-gui/res/cardsfolder/l/lifelace.txt b/forge-gui/res/cardsfolder/l/lifelace.txt index 919974e8c0d..ddee1b78c33 100644 --- a/forge-gui/res/cardsfolder/l/lifelace.txt +++ b/forge-gui/res/cardsfolder/l/lifelace.txt @@ -2,7 +2,7 @@ Name:Lifelace ManaCost:G Types:Instant A:SP$ Animate | Cost$ G | Colors$ Green | OverwriteColors$ True | ValidTgts$ Card | TgtZone$ Stack,Battlefield | Permanent$ True | SpellDescription$ Target spell or permanent becomes green. (Mana symbols on that permanent remain unchanged.) -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/lifelace.jpg Oracle:Target spell or permanent becomes green. (Mana symbols on that permanent remain unchanged.) diff --git a/forge-gui/res/cardsfolder/l/lifeline.txt b/forge-gui/res/cardsfolder/l/lifeline.txt index 70a096cfe96..2d93764628f 100644 --- a/forge-gui/res/cardsfolder/l/lifeline.txt +++ b/forge-gui/res/cardsfolder/l/lifeline.txt @@ -5,7 +5,7 @@ T:Mode$ ChangesZone | ValidCard$ Card.Creature | Origin$ Battlefield | Destinati SVar:TrigLifelineDelay:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | ValidPlayer$ Player | Execute$ TrigLifelineReturn | TriggerDescription$ Return that creature to the battlefield. | RememberObjects$ TriggeredCard SVar:TrigLifelineReturn:DB$ ChangeZone | Defined$ DelayTriggerRemembered | Origin$ Graveyard | Destination$ Battlefield SVar:LifelineX:Count$Valid Creature -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/lifeline.jpg Oracle:Whenever a creature dies, if another creature is on the battlefield, return the first card to the battlefield under its owner's control at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/l/lifes_legacy.txt b/forge-gui/res/cardsfolder/l/lifes_legacy.txt index c0725467e76..2b5d0f78fa6 100644 --- a/forge-gui/res/cardsfolder/l/lifes_legacy.txt +++ b/forge-gui/res/cardsfolder/l/lifes_legacy.txt @@ -3,6 +3,6 @@ ManaCost:1 G Types:Sorcery A:SP$ Draw | Cost$ 1 G Sac<1/Creature> | NumCards$ XPower | References$ XPower | SpellDescription$ Draw cards equal to the sacrificed creature's power. SVar:XPower:Sacrificed$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/lifes_legacy.jpg Oracle:As an additional cost to cast Life's Legacy, sacrifice a creature.\nDraw cards equal to the sacrificed creature's power. diff --git a/forge-gui/res/cardsfolder/l/lifespark_spellbomb.txt b/forge-gui/res/cardsfolder/l/lifespark_spellbomb.txt index 0cea0c59f67..b69a7525701 100644 --- a/forge-gui/res/cardsfolder/l/lifespark_spellbomb.txt +++ b/forge-gui/res/cardsfolder/l/lifespark_spellbomb.txt @@ -3,6 +3,6 @@ ManaCost:1 Types:Artifact A:AB$ Animate | Cost$ G Sac<1/CARDNAME> | ValidTgts$ Land | TgtPrompt$ Select target land | Power$ 3 | Toughness$ 3 | Types$ Creature | SpellDescription$ Until end of turn, target land becomes a 3/3 creature that's still a land. A:AB$ Draw | Cost$ 1 Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/lifespark_spellbomb.jpg Oracle:{G}, Sacrifice Lifespark Spellbomb: Until end of turn, target land becomes a 3/3 creature that's still a land.\n{1}, Sacrifice Lifespark Spellbomb: Draw a card. diff --git a/forge-gui/res/cardsfolder/l/lifespinner.txt b/forge-gui/res/cardsfolder/l/lifespinner.txt index 9a05c1588d8..c0dd0d31708 100644 --- a/forge-gui/res/cardsfolder/l/lifespinner.txt +++ b/forge-gui/res/cardsfolder/l/lifespinner.txt @@ -3,6 +3,6 @@ ManaCost:3 G Types:Creature Spirit PT:3/3 A:AB$ ChangeZone | Cost$ T Sac<3/Spirit> | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Spirit+Legendary | ChangeNum$ 1 | SpellDescription$ Search your library for a legendary Spirit permanent card, put it onto the battlefield, then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/lifespinner.jpg Oracle:{T}, Sacrifice three Spirits: Search your library for a legendary Spirit permanent card, put it onto the battlefield, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/l/lifetap.txt b/forge-gui/res/cardsfolder/l/lifetap.txt index bb446ce307b..512157ef801 100644 --- a/forge-gui/res/cardsfolder/l/lifetap.txt +++ b/forge-gui/res/cardsfolder/l/lifetap.txt @@ -3,6 +3,6 @@ ManaCost:U U Types:Enchantment T:Mode$ Taps | ValidCard$ Forest.OppCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever a Forest an opponent controls becomes tapped, you gain 1 life. SVar:TrigGainLife:DB$GainLife | LifeAmount$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/lifetap.jpg Oracle:Whenever a Forest an opponent controls becomes tapped, you gain 1 life. diff --git a/forge-gui/res/cardsfolder/l/light_of_day.txt b/forge-gui/res/cardsfolder/l/light_of_day.txt index 3dfa7dcbb0b..55463294d6e 100644 --- a/forge-gui/res/cardsfolder/l/light_of_day.txt +++ b/forge-gui/res/cardsfolder/l/light_of_day.txt @@ -3,6 +3,6 @@ ManaCost:3 W Types:Enchantment S:Mode$ Continuous | Affected$ Creature.Black | AddHiddenKeyword$ CARDNAME can't attack or block. | Description$ Black creatures can't attack or block. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/light_of_day.jpg Oracle:Black creatures can't attack or block. diff --git a/forge-gui/res/cardsfolder/l/light_of_sanction.txt b/forge-gui/res/cardsfolder/l/light_of_sanction.txt index c1059b552a9..311c1509963 100644 --- a/forge-gui/res/cardsfolder/l/light_of_sanction.txt +++ b/forge-gui/res/cardsfolder/l/light_of_sanction.txt @@ -3,6 +3,6 @@ ManaCost:1 W W Types:Enchantment R:Event$ DamageDone | ActiveZones$ Battlefield | Prevent$ True | ValidTarget$ Creature.YouCtrl | ValidSource$ Card.YouCtrl,Emblem.YouCtrl | Description$ Prevent all damage that would be dealt to creatures you control by sources you control. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/light_of_sanction.jpg Oracle:Prevent all damage that would be dealt to creatures you control by sources you control. diff --git a/forge-gui/res/cardsfolder/l/light_of_the_legion.txt b/forge-gui/res/cardsfolder/l/light_of_the_legion.txt index efd8b6a6d24..3f072aa9a2a 100644 --- a/forge-gui/res/cardsfolder/l/light_of_the_legion.txt +++ b/forge-gui/res/cardsfolder/l/light_of_the_legion.txt @@ -6,6 +6,6 @@ K:Flying K:Mentor T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigPutCounters | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, put a +1/+1 counter on each white creature you control. SVar:TrigPutCounters:DB$PutCounterAll | ValidCards$ Creature.White+YouCtrl | CounterType$ P1P1 | CounterNum$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHas:Ability$Counters & Ability$Token Oracle:Flying\nMentor (Whenever this creature attacks, put a +1/+1 counter on target attacking creature with lesser power.)\nWhen Light of the Legion dies, put a +1/+1 counter on each white creature you control. diff --git a/forge-gui/res/cardsfolder/l/lightbringer.txt b/forge-gui/res/cardsfolder/l/lightbringer.txt index e40681385b8..35557379163 100644 --- a/forge-gui/res/cardsfolder/l/lightbringer.txt +++ b/forge-gui/res/cardsfolder/l/lightbringer.txt @@ -3,6 +3,6 @@ ManaCost:2 W Types:Creature Kor Rebel PT:2/2 A:AB$ ChangeZone | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Creature.Black | TgtPrompt$ Select target black Creature | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target black creature. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/lightbringer.jpg Oracle:{T}, Sacrifice Lightbringer: Exile target black creature. diff --git a/forge-gui/res/cardsfolder/l/lightning_dart.txt b/forge-gui/res/cardsfolder/l/lightning_dart.txt index 425f7016b94..e0485a315b1 100644 --- a/forge-gui/res/cardsfolder/l/lightning_dart.txt +++ b/forge-gui/res/cardsfolder/l/lightning_dart.txt @@ -6,7 +6,7 @@ SVar:DBDmg:DB$ DealDamage | Defined$ Remembered | NumDmg$ 1 | ConditionCheckSVar SVar:DBDmgWU:DB$ DealDamage | Defined$ Remembered | NumDmg$ 4 | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | References$ X | StackDescription$ None | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$Valid Creature.IsRemembered+White,Creature.IsRemembered+Blue -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/lightning_dart.jpg Oracle:Lightning Dart deals 1 damage to target creature. If that creature is white or blue, Lightning Dart deals 4 damage to it instead. diff --git a/forge-gui/res/cardsfolder/l/lightning_rift.txt b/forge-gui/res/cardsfolder/l/lightning_rift.txt index ef566adbf63..846f799ab82 100644 --- a/forge-gui/res/cardsfolder/l/lightning_rift.txt +++ b/forge-gui/res/cardsfolder/l/lightning_rift.txt @@ -3,6 +3,6 @@ ManaCost:1 R Types:Enchantment T:Mode$ Cycled | ValidCard$ Card | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player cycles a card, you may pay {1}. If you do, CARDNAME deals 2 damage to any target. SVar:TrigDamage:AB$DealDamage | Cost$ 1 | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/lightning_rift.jpg Oracle:Whenever a player cycles a card, you may pay {1}. If you do, Lightning Rift deals 2 damage to any target. diff --git a/forge-gui/res/cardsfolder/l/lightning_storm.txt b/forge-gui/res/cardsfolder/l/lightning_storm.txt index b3be72af0b1..c6f81bc3a8c 100644 --- a/forge-gui/res/cardsfolder/l/lightning_storm.txt +++ b/forge-gui/res/cardsfolder/l/lightning_storm.txt @@ -5,6 +5,6 @@ A:SP$ DealDamage | Cost$ 1 R R | ValidTgts$ Creature,Player,Planeswalker | TgtPr SVar:X:Count$CardCounters.CHARGE/Plus.3 A:AB$ PutCounter | Cost$ Discard<1/Land> | CounterType$ CHARGE | CounterNum$ 2 | Defined$ Self | ActivationZone$ Stack | SubAbility$ DBChangeTarget | AnyPlayer$ True | SpellDescription$ Put two charge counters on CARDNAME. You may choose a new target for it. Any player may activate this ability but only if CARDNAME is on the stack. SVar:DBChangeTarget:DB$ ChangeTargets | Defined$ SourceFirstSpell | Optional$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/lightning_storm.jpg Oracle:Lightning Storm deals X damage to any target, where X is 3 plus the number of charge counters on it.\nDiscard a land card: Put two charge counters on Lightning Storm. You may choose a new target for it. Any player may activate this ability but only if Lightning Storm is on the stack. diff --git a/forge-gui/res/cardsfolder/l/lightning_volley.txt b/forge-gui/res/cardsfolder/l/lightning_volley.txt index 53aa12e0fc4..5d3ffd3f919 100644 --- a/forge-gui/res/cardsfolder/l/lightning_volley.txt +++ b/forge-gui/res/cardsfolder/l/lightning_volley.txt @@ -3,6 +3,6 @@ ManaCost:3 R Types:Instant A:SP$ AnimateAll | Cost$ 3 R | ValidCards$ Creature.YouCtrl | Abilities$ LVAbs | SpellDescription$ Until end of turn, creatures you control gain "{T}: This creature deals 1 damage to any target." SVar:LVAbs:AB$ DealDamage | Cost$ T | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to any target. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/lightning_volley.jpg Oracle:Until end of turn, creatures you control gain "{T}: This creature deals 1 damage to any target." diff --git a/forge-gui/res/cardsfolder/l/lilianas_contract.txt b/forge-gui/res/cardsfolder/l/lilianas_contract.txt index ae6121f04eb..cb58d5bd2b8 100644 --- a/forge-gui/res/cardsfolder/l/lilianas_contract.txt +++ b/forge-gui/res/cardsfolder/l/lilianas_contract.txt @@ -7,5 +7,5 @@ SVar:Contractors:Count$DifferentCardNames_Demon.YouCtrl+inZoneBattlefield T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, you draw 4 cards and you lose 4 life. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 4 | SubAbility$ DBLoseLife SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 4 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random Oracle:When CARDNAME enters the battlefield, you draw 4 cards and you lose 4 life.\nAt the beginning of your upkeep, if you control four or more Demons with different names, you win the game. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/l/lilianas_defeat.txt b/forge-gui/res/cardsfolder/l/lilianas_defeat.txt index 3ab1ee69c56..1a978366942 100644 --- a/forge-gui/res/cardsfolder/l/lilianas_defeat.txt +++ b/forge-gui/res/cardsfolder/l/lilianas_defeat.txt @@ -3,6 +3,6 @@ ManaCost:B Types:Sorcery A:SP$ Destroy | Cost$ B | ValidTgts$ Creature.Black,Planeswalker.Black | TgtPrompt$ Select target black creature or black planeswalker | SubAbility$ DBLoseLife | SpellDescription$ Destroy target black creature or black planeswalker. If that permanent was a Liliana planeswalker, her controller loses 3 life. SVar:DBLoseLife:DB$ LoseLife | Defined$ TargetedController | LifeAmount$ 3 | ConditionDefined$ Targeted | ConditionPresent$ Planeswalker.Liliana -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/lilianas_defeat.jpg Oracle:Destroy target black creature or black planeswalker. If that permanent was a Liliana planeswalker, her controller loses 3 life. diff --git a/forge-gui/res/cardsfolder/l/lilianas_indignation.txt b/forge-gui/res/cardsfolder/l/lilianas_indignation.txt index 26322d7abc3..1977e68cf13 100644 --- a/forge-gui/res/cardsfolder/l/lilianas_indignation.txt +++ b/forge-gui/res/cardsfolder/l/lilianas_indignation.txt @@ -6,7 +6,7 @@ SVar:DBLoseLife:DB$LoseLife | ValidTgts$ Player | TgtPrompt$ Select a player | L SVar:X:Count$xPaid SVar:Y:Count$ValidGraveyard Creature.IsRemembered/Times.2 SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHints:Ability$Delirium DeckHas:Ability$Graveyard SVar:Picture:http://www.wizards.com/global/images/magic/general/lilianas_indignation.jpg diff --git a/forge-gui/res/cardsfolder/l/lim_duls_paladin.txt b/forge-gui/res/cardsfolder/l/lim_duls_paladin.txt index fbeabfad38e..707f47ea291 100644 --- a/forge-gui/res/cardsfolder/l/lim_duls_paladin.txt +++ b/forge-gui/res/cardsfolder/l/lim_duls_paladin.txt @@ -14,6 +14,6 @@ T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | Execute$ TrigUnBlockedPump | SVar:TrigUnBlockedPump:DB$ Pump | KW$ HIDDEN CARDNAME assigns no combat damage | SubAbility$ DBLoseLife SVar:DBLoseLife:DB$ LoseLife | Defined$ DefendingPlayer | LifeAmount$ 4 SVar:X:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/lim_duls_paladin.jpg Oracle:Trample\nAt the beginning of your upkeep, you may discard a card. If you don't, sacrifice Lim-Dul's Paladin and draw a card.\nWhenever Lim-Dul's Paladin becomes blocked, it gets +6/+3 until end of turn.\nWhenever Lim-Dul's Paladin attacks and isn't blocked, it assigns no combat damage to defending player this turn and that player loses 4 life. diff --git a/forge-gui/res/cardsfolder/l/lim_duls_vault.txt b/forge-gui/res/cardsfolder/l/lim_duls_vault.txt index ce265cfea01..ad7879b27b3 100644 --- a/forge-gui/res/cardsfolder/l/lim_duls_vault.txt +++ b/forge-gui/res/cardsfolder/l/lim_duls_vault.txt @@ -11,6 +11,6 @@ SVar:DBShuffle:DB$ ChangeZone | Origin$ Library | Destination$ Library | Library SVar:DBReset:DB$ StoreSVar | SVar$ LifePaid | Type$ Number | Expression$ 0 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:LifePaid:Number$0 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/lim_duls_vault.jpg Oracle:Look at the top five cards of your library. As many times as you choose, you may pay 1 life, put those cards on the bottom of your library in any order, then look at the top five cards of your library. Then shuffle your library and put the last cards you looked at this way on top of it in any order. diff --git a/forge-gui/res/cardsfolder/l/limestone_golem.txt b/forge-gui/res/cardsfolder/l/limestone_golem.txt index 133189d6258..4bbff911ae6 100644 --- a/forge-gui/res/cardsfolder/l/limestone_golem.txt +++ b/forge-gui/res/cardsfolder/l/limestone_golem.txt @@ -3,6 +3,6 @@ ManaCost:6 Types:Artifact Creature Golem PT:3/4 A:AB$ Draw | Cost$ 2 Sac<1/CARDNAME> | NumCards$ 1 | ValidTgts$ Player | TgtPrompt$ Choose a player to draw a card | SpellDescription$ Target player draws a card. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/limestone_golem.jpg Oracle:{2}, Sacrifice Limestone Golem: Target player draws a card. diff --git a/forge-gui/res/cardsfolder/l/limited_resources.txt b/forge-gui/res/cardsfolder/l/limited_resources.txt index d2e2671f5eb..378b74d6889 100644 --- a/forge-gui/res/cardsfolder/l/limited_resources.txt +++ b/forge-gui/res/cardsfolder/l/limited_resources.txt @@ -9,7 +9,7 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True S:Mode$ CantPlayLand | CheckSVar$ X | SVarCompare$ GE10 | Description$ Players can't play lands as long as ten or more lands are on the battlefield. SVar:X:Count$Valid Land SVar:NonStackingEffect:True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/limited_resources.jpg Oracle:When Limited Resources enters the battlefield, each player chooses five lands they control and sacrifices the rest.\nPlayers can't play lands as long as ten or more lands are on the battlefield. diff --git a/forge-gui/res/cardsfolder/l/lin_sivvi_defiant_hero.txt b/forge-gui/res/cardsfolder/l/lin_sivvi_defiant_hero.txt index 47e94519bba..ab4c0b73fa6 100644 --- a/forge-gui/res/cardsfolder/l/lin_sivvi_defiant_hero.txt +++ b/forge-gui/res/cardsfolder/l/lin_sivvi_defiant_hero.txt @@ -5,7 +5,7 @@ PT:1/3 A:AB$ ChangeZone | Cost$ X T | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Rebel+cmcLEX | ChangeNum$ 1 | References$ X | SpellDescription$ Search your library for a Rebel permanent card with converted mana cost X or less, put it onto the battlefield, then shuffle your library. A:AB$ ChangeZone | Cost$ 3 | ValidTgts$ Rebel.YouCtrl | Origin$ Graveyard | Destination$ Library | LibraryPosition$ -1 | TgtPrompt$ Select target Rebel card in your graveyard | SpellDescription$ Put target Rebel card in your graveyard on the bottom of your library. SVar:X:Count$xPaid -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonCombatPriority:1 SVar:Picture:http://www.wizards.com/global/images/magic/general/lin_sivvi_defiant_hero.jpg Oracle:{X}, {T}: Search your library for a Rebel permanent card with converted mana cost X or less, put it onto the battlefield, then shuffle your library.\n{3}: Put target Rebel card from your graveyard on the bottom of your library. diff --git a/forge-gui/res/cardsfolder/l/lions_eye_diamond.txt b/forge-gui/res/cardsfolder/l/lions_eye_diamond.txt index 5aae51857e7..cf937344bf9 100644 --- a/forge-gui/res/cardsfolder/l/lions_eye_diamond.txt +++ b/forge-gui/res/cardsfolder/l/lions_eye_diamond.txt @@ -2,6 +2,6 @@ Name:Lion's Eye Diamond ManaCost:0 Types:Artifact A:AB$ Mana | Cost$ Sac<1/CARDNAME> Discard<0/Hand> | Produced$ Any | Amount$ 3 | InstantSpeed$ True | SpellDescription$ Add three mana of any one color. Activate this ability only any time you could cast an instant. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/lions_eye_diamond.jpg Oracle:Sacrifice Lion's Eye Diamond, Discard your hand: Add three mana of any one color. Activate this ability only any time you could cast an instant. diff --git a/forge-gui/res/cardsfolder/l/liquid_fire.txt b/forge-gui/res/cardsfolder/l/liquid_fire.txt index 3b46e5c695d..66a7ea5a2e6 100644 --- a/forge-gui/res/cardsfolder/l/liquid_fire.txt +++ b/forge-gui/res/cardsfolder/l/liquid_fire.txt @@ -6,6 +6,6 @@ A:SP$ DealDamage | Cost$ 4 R R | AnnounceType$ ChooseNumber | Min$ 0 | Max$ 5 | SVar:DBDmg:DB$ DealDamage | Defined$ TargetedController | NumDmg$ Y | References$ Y SVar:X:Count$ChosenNumber SVar:Y:SVar$X/NMinus.5 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/liquid_fire.jpg Oracle:As an additional cost to cast Liquid Fire, choose a number between 0 and 5.\nLiquid Fire deals X damage to target creature and 5 minus X damage to that creature's controller, where X is the chosen number. diff --git a/forge-gui/res/cardsfolder/l/liquimetal_coating.txt b/forge-gui/res/cardsfolder/l/liquimetal_coating.txt index ccbe7b2aaa8..042bb06126b 100644 --- a/forge-gui/res/cardsfolder/l/liquimetal_coating.txt +++ b/forge-gui/res/cardsfolder/l/liquimetal_coating.txt @@ -2,6 +2,6 @@ Name:Liquimetal Coating ManaCost:2 Types:Artifact A:AB$ Animate | Cost$ T | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Types$ Artifact | SpellDescription$ Target permanent becomes an artifact in addition to its other types until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/liquimetal_coating.jpg Oracle:{T}: Target permanent becomes an artifact in addition to its other types until end of turn. diff --git a/forge-gui/res/cardsfolder/l/lithatog.txt b/forge-gui/res/cardsfolder/l/lithatog.txt index 59ad0a74341..72b4702191a 100644 --- a/forge-gui/res/cardsfolder/l/lithatog.txt +++ b/forge-gui/res/cardsfolder/l/lithatog.txt @@ -4,6 +4,6 @@ Types:Creature Atog PT:1/2 A:AB$ Pump | Cost$ Sac<1/Artifact> | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Lithatog gets +1/+1 until end of turn. A:AB$ Pump | Cost$ Sac<1/Land> | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Lithatog gets +1/+1 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/lithatog.jpg Oracle:Sacrifice an artifact: Lithatog gets +1/+1 until end of turn.\nSacrifice a land: Lithatog gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/l/living_death.txt b/forge-gui/res/cardsfolder/l/living_death.txt index e87654eac8d..c7acaa134bb 100644 --- a/forge-gui/res/cardsfolder/l/living_death.txt +++ b/forge-gui/res/cardsfolder/l/living_death.txt @@ -5,7 +5,7 @@ A:SP$ ChangeZoneAll | Cost$ 3 B B | ChangeType$ Creature | Origin$ Graveyard | D SVar:DBSacrifice:DB$SacrificeAll | ValidCards$ Creature | SubAbility$ DBReturn SVar:DBReturn:DB$ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | SubAbility$ DBCleanup SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:IsReanimatorCard:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/living_death.jpg Oracle:Each player exiles all creature cards from their graveyard, then sacrifices all creatures they control, then puts all cards they exiled this way onto the battlefield. diff --git a/forge-gui/res/cardsfolder/l/living_destiny.txt b/forge-gui/res/cardsfolder/l/living_destiny.txt index 9cc9f703e0c..479d1086228 100644 --- a/forge-gui/res/cardsfolder/l/living_destiny.txt +++ b/forge-gui/res/cardsfolder/l/living_destiny.txt @@ -3,6 +3,6 @@ ManaCost:3 G Types:Instant A:SP$ GainLife | Cost$ 3 G Reveal<1/Creature> | LifeAmount$ X | References$ X | SpellDescription$ You gain life equal to the revealed card's converted mana cost. SVar:X:Revealed$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/living_destiny.jpg Oracle:As an additional cost to cast Living Destiny, reveal a creature card from your hand.\nYou gain life equal to the revealed card's converted mana cost. diff --git a/forge-gui/res/cardsfolder/l/living_end.txt b/forge-gui/res/cardsfolder/l/living_end.txt index 47cc8df1428..78a2bfe0289 100644 --- a/forge-gui/res/cardsfolder/l/living_end.txt +++ b/forge-gui/res/cardsfolder/l/living_end.txt @@ -7,7 +7,7 @@ A:SP$ ChangeZoneAll | Cost$ 0 | ChangeType$ Creature | Origin$ Graveyard | Desti SVar:SacAll:DB$ SacrificeAll | ValidCards$ Creature | SubAbility$ ReturnAll SVar:ReturnAll:DB$ ChangeZoneAll | Origin$ Exile | Destination$ Battlefield | ChangeType$ Card.IsRemembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:IsReanimatorCard:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/living_end.jpg Oracle:Suspend 3—{2}{B}{B} (Rather than cast this card from your hand, pay {2}{B}{B} and exile it with three time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.)\nEach player exiles all creature cards from their graveyard, then sacrifices all creatures they control, then puts all cards they exiled this way onto the battlefield. diff --git a/forge-gui/res/cardsfolder/l/living_inferno.txt b/forge-gui/res/cardsfolder/l/living_inferno.txt index ac1cc66d313..abac8d96750 100644 --- a/forge-gui/res/cardsfolder/l/living_inferno.txt +++ b/forge-gui/res/cardsfolder/l/living_inferno.txt @@ -9,6 +9,6 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$CardPower SVar:FirePower:Count$CardPower SVar:Min:SVar$FirePower/LimitMax.1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/living_inferno.jpg Oracle:{T}: Living Inferno deals damage equal to its power divided as you choose among any number of target creatures. Each of those creatures deals damage equal to its power to Living Inferno. diff --git a/forge-gui/res/cardsfolder/l/living_lands.txt b/forge-gui/res/cardsfolder/l/living_lands.txt index 1003e9236ea..c4483c6079d 100644 --- a/forge-gui/res/cardsfolder/l/living_lands.txt +++ b/forge-gui/res/cardsfolder/l/living_lands.txt @@ -3,6 +3,6 @@ ManaCost:3 G Types:Enchantment S:Mode$ Continuous | Affected$ Forest | SetPower$ 1 | SetToughness$ 1 | AddType$ Creature | Description$ All Forests are 1/1 creatures that are still lands. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/living_lands.jpg Oracle:All Forests are 1/1 creatures that are still lands. diff --git a/forge-gui/res/cardsfolder/l/living_lore.txt b/forge-gui/res/cardsfolder/l/living_lore.txt index 9e9b8629864..d29b0750417 100644 --- a/forge-gui/res/cardsfolder/l/living_lore.txt +++ b/forge-gui/res/cardsfolder/l/living_lore.txt @@ -10,6 +10,6 @@ T:Mode$ DamageDealtOnce | CombatDamage$ True | ValidSource$ Card.Self | Execute$ SVar:TrigSacLore:AB$ Play | Cost$ Sac<1/CARDNAME> | Defined$ Remembered | Amount$ All | Controller$ You | WithoutManaCost$ True | Optional$ True | ForgetRemembered$ True T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/living_lore.jpg Oracle:As Living Lore enters the battlefield, exile an instant or sorcery card from your graveyard.\nLiving Lore's power and toughness are each equal to the exiled card's converted mana cost.\nWhenever Living Lore deals combat damage, you may sacrifice it. If you do, you may cast the exiled card without paying its mana cost. diff --git a/forge-gui/res/cardsfolder/l/living_plane.txt b/forge-gui/res/cardsfolder/l/living_plane.txt index 481a9aadd0d..e600c1cd7da 100644 --- a/forge-gui/res/cardsfolder/l/living_plane.txt +++ b/forge-gui/res/cardsfolder/l/living_plane.txt @@ -3,6 +3,6 @@ ManaCost:2 G G Types:World Enchantment S:Mode$ Continuous | Affected$ Land | SetPower$ 1 | SetToughness$ 1 | AddType$ Creature | Description$ All lands are 1/1 creatures that are still lands. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/living_plane.jpg Oracle:All lands are 1/1 creatures that are still lands. diff --git a/forge-gui/res/cardsfolder/l/living_wish.txt b/forge-gui/res/cardsfolder/l/living_wish.txt index e3e2df4e6ac..729a86aa84e 100644 --- a/forge-gui/res/cardsfolder/l/living_wish.txt +++ b/forge-gui/res/cardsfolder/l/living_wish.txt @@ -3,6 +3,6 @@ ManaCost:1 G Types:Sorcery A:SP$ ChangeZone | Cost$ 1 G | Origin$ Sideboard | Destination$ Hand | ChangeType$ Creature.YouOwn,Land.YouOwn | ChangeNum$ 1 | SubAbility$ DBChange | SpellDescription$ You may choose a creature or land card you own from outside the game, reveal that card, and put it into your hand. Exile CARDNAME. SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/living_wish.jpg Oracle:You may choose a creature or land card you own from outside the game, reveal that card, and put it into your hand. Exile Living Wish. diff --git a/forge-gui/res/cardsfolder/l/llanowar_druid.txt b/forge-gui/res/cardsfolder/l/llanowar_druid.txt index a0eedf530a7..f32c7752599 100644 --- a/forge-gui/res/cardsfolder/l/llanowar_druid.txt +++ b/forge-gui/res/cardsfolder/l/llanowar_druid.txt @@ -3,6 +3,6 @@ ManaCost:1 G Types:Creature Elf Druid PT:1/2 A:AB$ UntapAll | Cost$ T Sac<1/CARDNAME> | ValidCards$ Forest | SpellDescription$ Untap all Forests. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/llanowar_druid.jpg Oracle:{T}, Sacrifice Llanowar Druid: Untap all Forests. diff --git a/forge-gui/res/cardsfolder/l/loam_dryad.txt b/forge-gui/res/cardsfolder/l/loam_dryad.txt index bf3b046e863..c19ef715ed5 100644 --- a/forge-gui/res/cardsfolder/l/loam_dryad.txt +++ b/forge-gui/res/cardsfolder/l/loam_dryad.txt @@ -3,6 +3,6 @@ ManaCost:G Types:Creature Dryad Horror PT:1/2 A:AB$ Mana | Cost$ T tapXType<1/Creature> | Produced$ Any | SpellDescription$ Add one mana of any color. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/loam_dryad.jpg Oracle:{T}, Tap an untapped creature you control: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/l/loathsome_catoblepas.txt b/forge-gui/res/cardsfolder/l/loathsome_catoblepas.txt index a5d3990f557..2c2b29a52a7 100644 --- a/forge-gui/res/cardsfolder/l/loathsome_catoblepas.txt +++ b/forge-gui/res/cardsfolder/l/loathsome_catoblepas.txt @@ -5,8 +5,8 @@ PT:3/3 A:AB$ Pump | Cost$ 2 G | KW$ HIDDEN CARDNAME must be blocked if able. | AILogic$ Pump | SpellDescription$ CARDNAME must be blocked this turn if able. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigPump | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, target creature an opponent controls gets -3/-3 until end of turn. SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | NumAtt$ -3 | NumDef$ -3 | IsCurse$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Green -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/loathsome_catoblepas.jpg Oracle:{2}{G}: Loathsome Catoblepas must be blocked this turn if able.\nWhen Loathsome Catoblepas dies, target creature an opponent controls gets -3/-3 until end of turn. diff --git a/forge-gui/res/cardsfolder/l/locket_of_yesterdays.txt b/forge-gui/res/cardsfolder/l/locket_of_yesterdays.txt index 1d2ad04bf07..26c55e2057c 100644 --- a/forge-gui/res/cardsfolder/l/locket_of_yesterdays.txt +++ b/forge-gui/res/cardsfolder/l/locket_of_yesterdays.txt @@ -3,6 +3,6 @@ ManaCost:1 Types:Artifact S:Mode$ ReduceCost | ValidCard$ Card | Type$ Spell | Activator$ You | Amount$ AffectedX | Description$ Spells you cast cost {1} less to cast for each card with the same name as that spell in your graveyard. SVar:AffectedX:Count$ValidGraveyard Card.sharesNameWith+YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/locket_of_yesterdays.jpg Oracle:Spells you cast cost {1} less to cast for each card with the same name as that spell in your graveyard. diff --git a/forge-gui/res/cardsfolder/l/lodestone_bauble.txt b/forge-gui/res/cardsfolder/l/lodestone_bauble.txt index 6b986a63947..f1d2bc57b3b 100644 --- a/forge-gui/res/cardsfolder/l/lodestone_bauble.txt +++ b/forge-gui/res/cardsfolder/l/lodestone_bauble.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ ChangeZone | Cost$ 1 T Sac<1/CARDNAME> | TargetMin$ 0 | TargetMax$ 4 | TargetsFromSingleZone$ True | Origin$ Graveyard | Destination$ Library | LibraryPosition$ 0 | TgtPrompt$ Choose target basic land card in a graveyard | ValidTgts$ Land.Basic | SubAbility$ DelTrigSlowtrip | SpellDescription$ Put up to four target basic land cards from a player's graveyard on top of their library in any order. That player draws a card at the beginning of the next turn's upkeep. SVar:DelTrigSlowtrip:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ DrawSlowtrip | TriggerDescription$ Draw a card. SVar:DrawSlowtrip:DB$Draw | NumCards$ 1 | Defined$ You -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/lodestone_bauble.jpg Oracle:{1}, {T}, Sacrifice Lodestone Bauble: Put up to four target basic land cards from a player's graveyard on top of their library in any order. That player draws a card at the beginning of the next turn's upkeep. diff --git a/forge-gui/res/cardsfolder/l/long_forgotten_gohei.txt b/forge-gui/res/cardsfolder/l/long_forgotten_gohei.txt index b58c856cf5c..1d5c7215a8f 100644 --- a/forge-gui/res/cardsfolder/l/long_forgotten_gohei.txt +++ b/forge-gui/res/cardsfolder/l/long_forgotten_gohei.txt @@ -3,7 +3,7 @@ ManaCost:3 Types:Artifact S:Mode$ Continuous | Affected$ Creature.Spirit+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Spirit creatures you control get +1/+1. S:Mode$ ReduceCost | ValidCard$ Arcane | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Arcane spells you cast cost {1} less to cast. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:PlayMain1:TRUE DeckHints:Type$Arcane|Spirit SVar:Picture:http://www.wizards.com/global/images/magic/general/long_forgotten_gohei.jpg diff --git a/forge-gui/res/cardsfolder/l/long_term_plans.txt b/forge-gui/res/cardsfolder/l/long_term_plans.txt index 65f7acbcbde..0f6e0e83ea1 100644 --- a/forge-gui/res/cardsfolder/l/long_term_plans.txt +++ b/forge-gui/res/cardsfolder/l/long_term_plans.txt @@ -2,6 +2,6 @@ Name:Long-Term Plans ManaCost:2 U Types:Instant A:SP$ ChangeZone | Cost$ 2 U | Origin$ Library | Destination$ Library | LibraryPosition$ 2 | ChangeType$ Card | ChangeNum$ 1 | Mandatory$ True | SpellDescription$ Search your library for a card, shuffle your library, then put that card third from the top. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/long_term_plans.jpg Oracle:Search your library for a card, shuffle your library, then put that card third from the top. diff --git a/forge-gui/res/cardsfolder/l/lord_of_the_pit.txt b/forge-gui/res/cardsfolder/l/lord_of_the_pit.txt index 0e702fc76b4..690f4a214d3 100644 --- a/forge-gui/res/cardsfolder/l/lord_of_the_pit.txt +++ b/forge-gui/res/cardsfolder/l/lord_of_the_pit.txt @@ -9,6 +9,6 @@ SVar:TrigSac:DB$Sacrifice | Defined$ You | SacValid$ Creature.Other | SubAbility SVar:DBDamage:DB$ DealDamage | Defined$ You | NumDmg$ 7 | ConditionCheckSVar$ X | ConditionSVarCompare$ LT1 | SubAbility$ DBCleanup | References$ X SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/lord_of_the_pit.jpg Oracle:Flying, trample\nAt the beginning of your upkeep, sacrifice a creature other than Lord of the Pit. If you can't, Lord of the Pit deals 7 damage to you. diff --git a/forge-gui/res/cardsfolder/l/lord_of_tresserhorn.txt b/forge-gui/res/cardsfolder/l/lord_of_tresserhorn.txt index 841a9c131a7..d8d8cc6b5ed 100644 --- a/forge-gui/res/cardsfolder/l/lord_of_tresserhorn.txt +++ b/forge-gui/res/cardsfolder/l/lord_of_tresserhorn.txt @@ -7,6 +7,6 @@ A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. SVar:TrigLose:DB$LoseLife | LifeAmount$ 2 | SubAbility$ DBSac SVar:DBSac:DB$Sacrifice | Amount$ 2 | SacValid$ Creature | SubAbility$ DBDraw SVar:DBDraw:DB$Draw | ValidTgts$ Opponent | NumCards$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/lord_of_tresserhorn.jpg Oracle:When Lord of Tresserhorn enters the battlefield, you lose 2 life, you sacrifice two creatures, and target opponent draws two cards.\n{B}: Regenerate Lord of Tresserhorn. diff --git a/forge-gui/res/cardsfolder/l/lost_auramancers.txt b/forge-gui/res/cardsfolder/l/lost_auramancers.txt index 50bde5f910d..71bbbd10288 100644 --- a/forge-gui/res/cardsfolder/l/lost_auramancers.txt +++ b/forge-gui/res/cardsfolder/l/lost_auramancers.txt @@ -5,7 +5,7 @@ PT:3/3 T:Mode$ ChangesZone | ValidCard$ Card.Self+counters_EQ0_TIME | Origin$ Battlefield | Destination$ Graveyard | Execute$ DBReturn | OptionalDecider$ TriggeredCardController | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, if it had no time counters on it, you may search your library for an enchantment card and put it onto the battlefield. If you do, shuffle your library. SVar:DBReturn:DB$ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Enchantment.YouOwn | ChangeNum$ 1 | ShuffleNonMandatory$ True K:Vanishing:3 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Enchantment SVar:Picture:http://www.wizards.com/global/images/magic/general/lost_auramancers.jpg Oracle:Vanishing 3 (This permanent enters the battlefield with three time counters on it. At the beginning of your upkeep, remove a time counter from it. When the last is removed, sacrifice it.)\nWhen Lost Auramancers dies, if it had no time counters on it, you may search your library for an enchantment card and put it onto the battlefield. If you do, shuffle your library. diff --git a/forge-gui/res/cardsfolder/l/lost_legacy.txt b/forge-gui/res/cardsfolder/l/lost_legacy.txt index 4739de62d45..0a3485f444a 100644 --- a/forge-gui/res/cardsfolder/l/lost_legacy.txt +++ b/forge-gui/res/cardsfolder/l/lost_legacy.txt @@ -7,6 +7,6 @@ SVar:Exile:DB$ ChangeZoneAll | Origin$ Graveyard,Hand,Library | Destination$ Exi SVar:Draw:DB$ Draw | Defined$ TargetedPlayer | NumCards$ X | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$RememberedSize -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/lost_legacy.jpg Oracle:Choose a nonartifact, nonland card name. Search target player's graveyard, hand, and library for any number of cards with that name and exile them. That player shuffles their library, then draws a card for each card exiled from hand this way. diff --git a/forge-gui/res/cardsfolder/l/lotus_blossom.txt b/forge-gui/res/cardsfolder/l/lotus_blossom.txt index 196275c7f17..500cf667adb 100644 --- a/forge-gui/res/cardsfolder/l/lotus_blossom.txt +++ b/forge-gui/res/cardsfolder/l/lotus_blossom.txt @@ -5,6 +5,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigPutCounter | Tri A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ Any | Amount$ X | References$ X | SpellDescription$ Add X mana of any one color, where X is the number of petal counters on Lotus Blossom. SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ PETAL | CounterNum$ 1 SVar:X:Count$CardCounters.PETAL -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/lotus_blossom.jpg Oracle:At the beginning of your upkeep, you may put a petal counter on Lotus Blossom.\n{T}, Sacrifice Lotus Blossom: Add X mana of any one color, where X is the number of petal counters on Lotus Blossom. diff --git a/forge-gui/res/cardsfolder/l/lotus_cobra.txt b/forge-gui/res/cardsfolder/l/lotus_cobra.txt index a2cc5697383..cff746f9ac4 100644 --- a/forge-gui/res/cardsfolder/l/lotus_cobra.txt +++ b/forge-gui/res/cardsfolder/l/lotus_cobra.txt @@ -4,6 +4,6 @@ Types:Creature Snake PT:2/1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigMana | TriggerDescription$ Landfall — Whenever a land enters the battlefield under your control, you may add one mana of any color. SVar:TrigMana:DB$ Mana | Produced$ Any | AILogic$ MostProminentInComputerHand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/lotus_cobra.jpg Oracle:Landfall — Whenever a land enters the battlefield under your control, you may add one mana of any color. diff --git a/forge-gui/res/cardsfolder/l/lotus_petal.txt b/forge-gui/res/cardsfolder/l/lotus_petal.txt index bdae2e0126f..204ddd84c63 100644 --- a/forge-gui/res/cardsfolder/l/lotus_petal.txt +++ b/forge-gui/res/cardsfolder/l/lotus_petal.txt @@ -2,6 +2,6 @@ Name:Lotus Petal ManaCost:0 Types:Artifact A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ Any | SpellDescription$ Add one mana of any color. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/lotus_petal.jpg Oracle:{T}, Sacrifice Lotus Petal: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/l/lowland_oaf.txt b/forge-gui/res/cardsfolder/l/lowland_oaf.txt index b9360b5122b..79532b51c8d 100644 --- a/forge-gui/res/cardsfolder/l/lowland_oaf.txt +++ b/forge-gui/res/cardsfolder/l/lowland_oaf.txt @@ -4,6 +4,6 @@ Types:Creature Giant Warrior PT:3/3 A:AB$ Pump | Cost$ T | ValidTgts$ Goblin.YouCtrl | TgtPrompt$ Select Goblin you control | NumAtt$ +1 | NumDef$ +0 | KW$ Flying | AtEOT$ Sacrifice | SpellDescription$ Target Goblin creature you control gets +1/+0 and gains flying until end of turn. Sacrifice that creature at the beginning of the next end step. DeckNeeds:Type$Goblin -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/lowland_oaf.jpg Oracle:{T}: Target Goblin creature you control gets +1/+0 and gains flying until end of turn. Sacrifice that creature at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/l/loxodon_peacekeeper.txt b/forge-gui/res/cardsfolder/l/loxodon_peacekeeper.txt index 4deb39afec5..0c5d839ccf6 100644 --- a/forge-gui/res/cardsfolder/l/loxodon_peacekeeper.txt +++ b/forge-gui/res/cardsfolder/l/loxodon_peacekeeper.txt @@ -5,7 +5,7 @@ PT:4/4 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigGainControl | TriggerDescription$ At the beginning of your upkeep, the player with the lowest life total gains control of CARDNAME. If two or more players are tied for lowest life total, you choose one of them, and that player gains control of CARDNAME. SVar:TrigGainControl:DB$ ChoosePlayer | Defined$ You | Choices$ Player.withLowestLife | ChoiceTitle$ Choose an player with lowest life total | AILogic$ Pump | SubAbility$ DBGainControl SVar:DBGainControl:DB$ GainControl | Defined$ Self | NewController$ Player.Chosen -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/loxodon_peacekeeper.jpg Oracle:At the beginning of your upkeep, the player with the lowest life total gains control of Loxodon Peacekeeper. If two or more players are tied for lowest life total, you choose one of them, and that player gains control of Loxodon Peacekeeper. diff --git a/forge-gui/res/cardsfolder/l/loyal_drake.txt b/forge-gui/res/cardsfolder/l/loyal_drake.txt index febd4bd2438..d838b3396f8 100644 --- a/forge-gui/res/cardsfolder/l/loyal_drake.txt +++ b/forge-gui/res/cardsfolder/l/loyal_drake.txt @@ -5,5 +5,5 @@ PT:2/2 K:Flying T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Card.IsCommander+YouOwn+YouCtrl | Execute$ TrigDraw | TriggerDescription$ At the beginning of combat on your turn, if you control your commander, draw a card. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random Oracle:Flying\nLieutenant — At the beginning of combat on your turn, if you control your commander, draw a card. diff --git a/forge-gui/res/cardsfolder/l/loyal_unicorn.txt b/forge-gui/res/cardsfolder/l/loyal_unicorn.txt index 98f5a0b1733..9101864d7ef 100644 --- a/forge-gui/res/cardsfolder/l/loyal_unicorn.txt +++ b/forge-gui/res/cardsfolder/l/loyal_unicorn.txt @@ -9,5 +9,5 @@ SVar:RPrevent:Event$ DamageDone | Prevent$ True | IsCombat$ True | ActiveZones$ S:Mode$ Continuous | Affected$ Creature.Other+YouCtrl | AddKeyword$ Vigilance | Description$ Other creatures you control gain vigilance until end of turn. SVar:X:Count$Valid Card.IsCommander+YouOwn+YouCtrl SVar:BuffedBy:Card.IsCommander -SVar:RemRandomDeck:True +AI:RemoveDeck:Random Oracle:Vigilance\nLieutenant — At the beginning of combat on your turn, if you control your commander, prevent all combat damage that would be dealt to creatures you control this turn. Other creatures you control gain vigilance until end of turn. diff --git a/forge-gui/res/cardsfolder/l/lumengrid_augur.txt b/forge-gui/res/cardsfolder/l/lumengrid_augur.txt index ec6c11ec8fc..2f3f8e49098 100644 --- a/forge-gui/res/cardsfolder/l/lumengrid_augur.txt +++ b/forge-gui/res/cardsfolder/l/lumengrid_augur.txt @@ -6,6 +6,6 @@ A:AB$ Draw | Cost$ 1 T | NumCards$ 1 | ValidTgts$ Player | TgtPrompt$ Select tar SVar:DBDiscard:DB$ Discard | Defined$ Targeted | NumCards$ 1 | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBUntap SVar:DBUntap:DB$ Untap | Defined$ Self | ConditionDefined$ Remembered | ConditionPresent$ Card.Artifact | ConditionCompare$ EQ1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/lumengrid_augur.jpg Oracle:{1}, {T}: Target player draws a card, then discards a card. If that player discards an artifact card this way, untap Lumengrid Augur. diff --git a/forge-gui/res/cardsfolder/l/luminesce.txt b/forge-gui/res/cardsfolder/l/luminesce.txt index 354cf871339..2a54ccd7511 100644 --- a/forge-gui/res/cardsfolder/l/luminesce.txt +++ b/forge-gui/res/cardsfolder/l/luminesce.txt @@ -3,7 +3,7 @@ ManaCost:W Types:Instant A:SP$ Effect | Cost$ W | ReplacementEffects$ RPrevent | SpellDescription$ Prevent all damage that black sources and red sources would deal this turn. SVar:RPrevent:Event$ DamageDone | Prevent$ True | ActiveZones$ Command | ValidSource$ Card.BlackSource,Card.RedSource | Description$ Prevent all damage that black sources and red sources would deal this turn. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/luminesce.jpg Oracle:Prevent all damage that black sources and red sources would deal this turn. diff --git a/forge-gui/res/cardsfolder/l/lunar_avenger.txt b/forge-gui/res/cardsfolder/l/lunar_avenger.txt index e676ce82faa..697b3053e3e 100644 --- a/forge-gui/res/cardsfolder/l/lunar_avenger.txt +++ b/forge-gui/res/cardsfolder/l/lunar_avenger.txt @@ -7,7 +7,7 @@ A:AB$ GenericChoice | Cost$ SubCounter<1/P1P1> | Choices$ DBFlying,DBFirstStrike SVar:DBFlying:DB$ Pump | Defined$ Self | KW$ Flying | SpellDescription$ gains flying until end of turn. SVar:DBFirstStrike:DB$ Pump | Defined$ Self | KW$ First Strike | SpellDescription$ gains first strike until end of turn. SVar:DBHaste:DB$ Pump | Defined$ Self | KW$ Haste | SpellDescription$ gains haste until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NeedsToPlayVar:Z GE2 SVar:Z:Count$UniqueManaColorsProduced.ByUntappedSources DeckHints:Ability$Proliferate diff --git a/forge-gui/res/cardsfolder/l/lupine_prototype.txt b/forge-gui/res/cardsfolder/l/lupine_prototype.txt index c900ecd04ff..38ec066d8d9 100644 --- a/forge-gui/res/cardsfolder/l/lupine_prototype.txt +++ b/forge-gui/res/cardsfolder/l/lupine_prototype.txt @@ -4,6 +4,6 @@ Types:Artifact Creature Wolf Construct PT:5/5 S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ CARDNAME can't attack or block. | CheckSVar$ X | SVarCompare$ GE1 | Description$ CARDNAME can't attack or block can't attack or block unless a player has no cards in hand. SVar:X:PlayerCountPlayers$LowestValidHand Card.YouOwn -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/lupine_prototype.jpg Oracle:Lupine Prototype can't attack or block unless a player has no cards in hand. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/l/lurking_arynx.txt b/forge-gui/res/cardsfolder/l/lurking_arynx.txt index f56ccdf623a..9498d2f6353 100644 --- a/forge-gui/res/cardsfolder/l/lurking_arynx.txt +++ b/forge-gui/res/cardsfolder/l/lurking_arynx.txt @@ -4,6 +4,6 @@ Types:Creature Cat Beast PT:3/5 A:AB$ MustBlock | Cost$ 2 G | ValidTgts$ Creature | CheckSVar$ FormidableTest | SVarCompare$ GE8 | References$ FormidableTest | PrecostDesc$ Formidable — | TgtPrompt$ Select target creature that must block this creature this turn | SpellDescription$ Target creature blocks CARDNAME this turn if able. Activate this ability only if creatures you control have total power 8 or greater. SVar:FormidableTest:Count$SumPower_Creature.YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/lurking_arynx.jpg Oracle:Formidable — {2}{G}: Target creature blocks Lurking Arynx this turn if able. Activate this ability only if creatures you control have total power 8 or greater. diff --git a/forge-gui/res/cardsfolder/l/lurking_evil.txt b/forge-gui/res/cardsfolder/l/lurking_evil.txt index 6f091155929..0d5495132ed 100644 --- a/forge-gui/res/cardsfolder/l/lurking_evil.txt +++ b/forge-gui/res/cardsfolder/l/lurking_evil.txt @@ -3,6 +3,6 @@ ManaCost:B B B Types:Enchantment A:AB$ Animate | Cost$ PayLife | Types$ Creature,Horror | Power$ 4 | Toughness$ 4 | Keywords$ Flying | RemoveCardTypes$ True | Permanent$ True | CostDesc$ Pay half your life, rounded up: | References$ X | SpellDescription$ CARDNAME becomes a 4/4 Horror creature with flying. SVar:X:Count$YourLifeTotal/HalfUp -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/lurking_evil.jpg Oracle:Pay half your life, rounded up: Lurking Evil becomes a 4/4 Horror creature with flying. diff --git a/forge-gui/res/cardsfolder/l/lush_growth.txt b/forge-gui/res/cardsfolder/l/lush_growth.txt index e01915fc5b6..9f514786b34 100644 --- a/forge-gui/res/cardsfolder/l/lush_growth.txt +++ b/forge-gui/res/cardsfolder/l/lush_growth.txt @@ -4,6 +4,6 @@ Types:Enchantment Aura K:Enchant land A:SP$ Attach | Cost$ G | ValidTgts$ Land | AILogic$ Pump S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddType$ Mountain & Forest & Plains | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | Description$ Enchanted land is a Mountain, Forest, and Plains. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/lush_growth.jpg Oracle:Enchant land\nEnchanted land is a Mountain, Forest, and Plains. diff --git a/forge-gui/res/cardsfolder/l/lyzolda_the_blood_witch.txt b/forge-gui/res/cardsfolder/l/lyzolda_the_blood_witch.txt index 825316ee975..f5298cfd5ca 100644 --- a/forge-gui/res/cardsfolder/l/lyzolda_the_blood_witch.txt +++ b/forge-gui/res/cardsfolder/l/lyzolda_the_blood_witch.txt @@ -6,6 +6,6 @@ A:AB$DealDamage | Cost$ 2 Sac<1/Creature> | ValidTgts$ Creature,Player,Planeswal SVar:DBDraw:DB$Draw | NumCards$ 1 | Defined$ You | ConditionCheckSVar$ Y | ConditionSVarCompare$ GE1 | References$ Y SVar:X:Sacrificed$Valid Creature.Red SVar:Y:Sacrificed$Valid Creature.Black -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/lyzolda_the_blood_witch.jpg Oracle:{2}, Sacrifice a creature: Lyzolda, the Blood Witch deals 2 damage to any target if the sacrificed creature was red. Draw a card if the sacrificed creature was black. diff --git a/forge-gui/res/cardsfolder/m/machinate.txt b/forge-gui/res/cardsfolder/m/machinate.txt index ebea7cc55db..bbb4e3e44a9 100644 --- a/forge-gui/res/cardsfolder/m/machinate.txt +++ b/forge-gui/res/cardsfolder/m/machinate.txt @@ -3,6 +3,6 @@ ManaCost:1 U U Types:Instant A:SP$ Dig | Cost$ 1 U U | DigNum$ X | References$ X | SpellDescription$ Look at the top X cards of your library, where X is the number of artifacts you control. Put one of those cards into your hand and the rest on the bottom of your library in any order. SVar:X:Count$Valid Artifact.YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/machinate.jpg Oracle:Look at the top X cards of your library, where X is the number of artifacts you control. Put one of those cards into your hand and the rest on the bottom of your library in any order. diff --git a/forge-gui/res/cardsfolder/m/mad_prophet.txt b/forge-gui/res/cardsfolder/m/mad_prophet.txt index 4d8e12aec1d..0ff51e58724 100644 --- a/forge-gui/res/cardsfolder/m/mad_prophet.txt +++ b/forge-gui/res/cardsfolder/m/mad_prophet.txt @@ -4,7 +4,7 @@ Types:Creature Human Shaman PT:2/2 K:Haste A:AB$ Draw | Cost$ T Discard<1/Card> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHas:Ability$Discard DeckHints:Keyword$Madness & Ability$Delirium SVar:Picture:http://www.wizards.com/global/images/magic/general/mad_prophet.jpg diff --git a/forge-gui/res/cardsfolder/m/madblind_mountain.txt b/forge-gui/res/cardsfolder/m/madblind_mountain.txt index 47ebf9c85fb..89187e298e1 100644 --- a/forge-gui/res/cardsfolder/m/madblind_mountain.txt +++ b/forge-gui/res/cardsfolder/m/madblind_mountain.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land Mountain K:CARDNAME enters the battlefield tapped. A:AB$ Shuffle | Cost$ R T | Defined$ You | IsPresent$ Permanent.Red+YouCtrl | PresentCompare$ GE2 | SpellDescription$ Shuffle your library. Activate this ability only if you control two or more red permanents. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/madblind_mountain.jpg Oracle:({T}: Add {R}.)\nMadblind Mountain enters the battlefield tapped.\n{R}, {T}: Shuffle your library. Activate this ability only if you control two or more red permanents. diff --git a/forge-gui/res/cardsfolder/m/maddening_imp.txt b/forge-gui/res/cardsfolder/m/maddening_imp.txt index b997f17b2fd..3a438d4fcf5 100644 --- a/forge-gui/res/cardsfolder/m/maddening_imp.txt +++ b/forge-gui/res/cardsfolder/m/maddening_imp.txt @@ -7,8 +7,8 @@ A:AB$ Effect | Cost$ T | Name$ Maddening Imp Effect | StaticAbilities$ KWPump | SVar:KWPump:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.ActivePlayerCtrl+nonWall | AffectedZone$ Battlefield | AddHiddenKeyword$ CARDNAME attacks each combat if able. | Description$ Non-Wall creatures the active player controls attack this turn if able. SVar:DestroyPacifist:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigDestroy | TriggerDescription$ At the beginning of the next end step, destroy each of those creatures that didn't attack this turn. SVar:TrigDestroy:DB$ DestroyAll | ValidCards$ Creature.ActivePlayerCtrl+notAttackedThisTurn+nonWall -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:NonCombatPriority:5 SVar:Picture:http://www.wizards.com/global/images/magic/general/maddening_imp.jpg Oracle:Flying\n{T}: Non-Wall creatures the active player controls attack this turn if able. At the beginning of the next end step, destroy each of those creatures that didn't attack this turn. Activate this ability only during an opponent's turn and only before combat. diff --git a/forge-gui/res/cardsfolder/m/mage_il_vec.txt b/forge-gui/res/cardsfolder/m/mage_il_vec.txt index f13e620174d..a3296edbf82 100644 --- a/forge-gui/res/cardsfolder/m/mage_il_vec.txt +++ b/forge-gui/res/cardsfolder/m/mage_il_vec.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Creature Human Wizard PT:2/2 A:AB$ DealDamage | Cost$ T Discard<1/Random> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to any target. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mage_il_vec.jpg Oracle:{T}, Discard a card at random: Mage il-Vec deals 1 damage to any target. diff --git a/forge-gui/res/cardsfolder/m/mage_ring_network.txt b/forge-gui/res/cardsfolder/m/mage_ring_network.txt index 4e5dde20bd4..6ab0a5de275 100644 --- a/forge-gui/res/cardsfolder/m/mage_ring_network.txt +++ b/forge-gui/res/cardsfolder/m/mage_ring_network.txt @@ -5,6 +5,6 @@ A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ PutCounter | Cost$ 1 T | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME. A:AB$ Mana | Cost$ T SubCounter | Produced$ C | Amount$ ChosenX | CostDesc$ {T}, Remove X storage counters from CARDNAME: | References$ X | SpellDescription$ Add {C} equal to the amount of counters removed. SVar:X:XChoice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mage_ring_network.jpg Oracle:{T}: Add {C}.\n{1}, {T}: Put a storage counter on Mage-Ring Network.\n{T}, Remove X storage counters from Mage-Ring Network: Add {C} equal to the amount of counters removed. diff --git a/forge-gui/res/cardsfolder/m/mageta_the_lion.txt b/forge-gui/res/cardsfolder/m/mageta_the_lion.txt index 0432b8c8fc5..fd74f2db3f6 100644 --- a/forge-gui/res/cardsfolder/m/mageta_the_lion.txt +++ b/forge-gui/res/cardsfolder/m/mageta_the_lion.txt @@ -3,6 +3,6 @@ ManaCost:3 W W Types:Legendary Creature Human Spellshaper PT:3/3 A:AB$ DestroyAll | Cost$ 2 W W T Discard<2/Card> | ValidCards$ Creature.Other | NoRegen$ True | SpellDescription$ Destroy all creatures except for Mageta the Lion. Those creatures can't be regenerated. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mageta_the_lion.jpg Oracle:{2}{W}{W}, {T}, Discard two cards: Destroy all creatures except for Mageta the Lion. Those creatures can't be regenerated. diff --git a/forge-gui/res/cardsfolder/m/magewrights_stone.txt b/forge-gui/res/cardsfolder/m/magewrights_stone.txt index 34bedae508e..95e8a021421 100644 --- a/forge-gui/res/cardsfolder/m/magewrights_stone.txt +++ b/forge-gui/res/cardsfolder/m/magewrights_stone.txt @@ -2,6 +2,6 @@ Name:Magewright's Stone ManaCost:2 Types:Artifact A:AB$ Untap | Cost$ 1 T | ValidTgts$ Creature.hasActivatedAbilityWithTapCost | TgtPrompt$ Select target creature that has an activated ability with Tap in its cost. | SpellDescription$ Untap target creature that has an activated ability with {T} in its cost. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/magewrights_stone.jpg Oracle:{1}, {T}: Untap target creature that has an activated ability with {T} in its cost. diff --git a/forge-gui/res/cardsfolder/m/magical_hack.txt b/forge-gui/res/cardsfolder/m/magical_hack.txt index 13826429316..41dfa8a5073 100644 --- a/forge-gui/res/cardsfolder/m/magical_hack.txt +++ b/forge-gui/res/cardsfolder/m/magical_hack.txt @@ -2,7 +2,7 @@ Name:Magical Hack ManaCost:U Types:Instant A:SP$ ChangeText | Cost$ U | ValidTgts$ Card | TgtZone$ Stack,Battlefield | TgtPrompt$ Choose target spell or permanent | ChangeTypeWord$ ChooseBasicLandType ChooseBasicLandType | Permanent$ True | SpellDescription$ Change the text of target spell or permanent by replacing all instances of one basic land type with another. (For example, you may change "swampwalk" to "plainswalk." This effect lasts indefinitely.) -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/magical_hack.jpg Oracle:Change the text of target spell or permanent by replacing all instances of one basic land type with another. (For example, you may change "swampwalk" to "plainswalk." This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/m/magister_of_worth.txt b/forge-gui/res/cardsfolder/m/magister_of_worth.txt index 1c4175537a3..5703a4f114f 100644 --- a/forge-gui/res/cardsfolder/m/magister_of_worth.txt +++ b/forge-gui/res/cardsfolder/m/magister_of_worth.txt @@ -7,6 +7,6 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigVote:DB$ Vote | Defined$ Player | VoteGrace$ MagisterofWorthZombify | VoteCondemnation$ MagisterofWorthDestroy | Tied$ MagisterofWorthDestroy | VoteType$ Grace,Condemnation | AILogic$ GraceOrCondemnation SVar:MagisterofWorthZombify:DB$ ChangeZoneAll | ChangeType$ Creature | Origin$ Graveyard | Destination$ Battlefield SVar:MagisterofWorthDestroy:DB$ DestroyAll | ValidCards$ Creature.Other -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/magister_of_worth.jpg Oracle:Flying\nWill of the council — When Magister of Worth enters the battlefield, starting with you, each player votes for grace or condemnation. If grace gets more votes, each player returns each creature card from their graveyard to the battlefield. If condemnation gets more votes or the vote is tied, destroy all creatures other than Magister of Worth. diff --git a/forge-gui/res/cardsfolder/m/magistrates_veto.txt b/forge-gui/res/cardsfolder/m/magistrates_veto.txt index ce224f030b6..f7fa2e9fca4 100644 --- a/forge-gui/res/cardsfolder/m/magistrates_veto.txt +++ b/forge-gui/res/cardsfolder/m/magistrates_veto.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Enchantment S:Mode$ Continuous | Affected$ Creature.White,Creature.Blue | AddHiddenKeyword$ CARDNAME can't block. | Description$ White creatures and blue creatures can't block. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/magistrates_veto.jpg Oracle:White creatures and blue creatures can't block. diff --git a/forge-gui/res/cardsfolder/m/magma_burst.txt b/forge-gui/res/cardsfolder/m/magma_burst.txt index 40ca8c421fa..2415c2b0884 100644 --- a/forge-gui/res/cardsfolder/m/magma_burst.txt +++ b/forge-gui/res/cardsfolder/m/magma_burst.txt @@ -4,6 +4,6 @@ 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:RemAIDeck:True +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/magma_giant.txt b/forge-gui/res/cardsfolder/m/magma_giant.txt index cd78fc0df32..5ef1c2d04cd 100644 --- a/forge-gui/res/cardsfolder/m/magma_giant.txt +++ b/forge-gui/res/cardsfolder/m/magma_giant.txt @@ -4,6 +4,6 @@ Types:Creature Giant PT:5/5 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDamageAll | TriggerDescription$ When CARDNAME enters the battlefield, it deals 2 damage to each creature and each player. SVar:TrigDamageAll:DB$DamageAll | ValidCards$ Creature | ValidPlayers$ Player | NumDmg$ 2 | ValidDescription$ each creature and each player. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/magma_giant.jpg Oracle:When Magma Giant enters the battlefield, it deals 2 damage to each creature and each player. diff --git a/forge-gui/res/cardsfolder/m/magma_vein.txt b/forge-gui/res/cardsfolder/m/magma_vein.txt index c0fb354d84d..b95a6a1472c 100644 --- a/forge-gui/res/cardsfolder/m/magma_vein.txt +++ b/forge-gui/res/cardsfolder/m/magma_vein.txt @@ -2,6 +2,6 @@ Name:Magma Vein ManaCost:2 R Types:Enchantment A:AB$ DamageAll | Cost$ R Sac<1/Land> | ValidCards$ Creature.withoutFlying | NumDmg$ 1 | ValidDescription$ each creature without flying. | SpellDescription$ CARDNAME deals 1 damage to each creature without flying. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/magma_vein.jpg Oracle:{R}, Sacrifice a land: Magma Vein deals 1 damage to each creature without flying. diff --git a/forge-gui/res/cardsfolder/m/magmasaur.txt b/forge-gui/res/cardsfolder/m/magmasaur.txt index 42d27490f4a..20640e84533 100644 --- a/forge-gui/res/cardsfolder/m/magmasaur.txt +++ b/forge-gui/res/cardsfolder/m/magmasaur.txt @@ -8,6 +8,6 @@ SVar:SelfDestruct:DB$ Sacrifice | Defined$ Self | RememberSacrificed$ True | Unl SVar:LetEmHaveIt:DB$ DamageAll | ValidCards$ Creature.withoutFlying | ValidPlayers$ Player | NumDmg$ X | References$ X | ConditionDefined$ Remembered | ConditionPresent$ Card | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$CardCounters.P1P1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/magmasaur.jpg Oracle:Magmasaur enters the battlefield with five +1/+1 counters on it.\nAt the beginning of your upkeep, you may remove a +1/+1 counter from Magmasaur. If you don't, sacrifice Magmasaur and it deals damage equal to the number of +1/+1 counters on it to each creature without flying and each player. diff --git a/forge-gui/res/cardsfolder/m/magmatic_chasm.txt b/forge-gui/res/cardsfolder/m/magmatic_chasm.txt index ab40696124b..b7c14f56d0f 100644 --- a/forge-gui/res/cardsfolder/m/magmatic_chasm.txt +++ b/forge-gui/res/cardsfolder/m/magmatic_chasm.txt @@ -3,6 +3,6 @@ ManaCost:1 R Types:Sorcery A:SP$ Effect | Cost$ 1 R | Name$ Magmatic Chasm Effect | StaticAbilities$ KWPump | AILogic$ Evasion | SpellDescription$ Creatures without flying can't block this turn. SVar:KWPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.withoutFlying | AddHiddenKeyword$ CARDNAME can't block. | Description$ Creatures without flying can't block this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/magmatic_chasm.jpg Oracle:Creatures without flying can't block this turn. diff --git a/forge-gui/res/cardsfolder/m/magmatic_core.txt b/forge-gui/res/cardsfolder/m/magmatic_core.txt index 41e9cb7501a..9e5709e750b 100644 --- a/forge-gui/res/cardsfolder/m/magmatic_core.txt +++ b/forge-gui/res/cardsfolder/m/magmatic_core.txt @@ -8,6 +8,6 @@ T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefiel SVar:MagmaticDamage:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature to distribute damage to | NumDmg$ CoreStrength | TargetMin$ Min | TargetMax$ CoreStrength | References$ Min,CoreStrength | DividedAsYouChoose$ CoreStrength SVar:CoreStrength:Count$CardCounters.AGE SVar:Min:SVar$CoreStrength/LimitMax.1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/magmatic_core.jpg Oracle:Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nAt the beginning of your end step, Magmatic Core deals X damage divided as you choose among any number of target creatures, where X is the number of age counters on it. diff --git a/forge-gui/res/cardsfolder/m/magmatic_insight.txt b/forge-gui/res/cardsfolder/m/magmatic_insight.txt index 6089a5ed126..2f85c216fe2 100644 --- a/forge-gui/res/cardsfolder/m/magmatic_insight.txt +++ b/forge-gui/res/cardsfolder/m/magmatic_insight.txt @@ -2,6 +2,6 @@ Name:Magmatic Insight ManaCost:R Types:Sorcery A:SP$ Draw | Cost$ R Discard<1/Land> | CostDesc$ As an additional cost to cast CARDNAME, discard a land card. | NumCards$ 2 | Defined$ You | SpellDescription$ Draw two cards. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/magmatic_insight.jpg Oracle:As an additional cost to cast Magmatic Insight, discard a land card.\nDraw two cards. diff --git a/forge-gui/res/cardsfolder/m/magmaw.txt b/forge-gui/res/cardsfolder/m/magmaw.txt index 2ed2365d296..a050d5bbfa6 100644 --- a/forge-gui/res/cardsfolder/m/magmaw.txt +++ b/forge-gui/res/cardsfolder/m/magmaw.txt @@ -3,6 +3,6 @@ ManaCost:3 R R Types:Creature Elemental PT:4/4 A:AB$ DealDamage | Cost$ 1 Sac<1/Permanent.nonLand/nonland permanent> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to any target. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/magmaw.jpg Oracle:{1}, Sacrifice a nonland permanent: Magmaw deals 1 damage to any target. diff --git a/forge-gui/res/cardsfolder/m/magnetic_flux.txt b/forge-gui/res/cardsfolder/m/magnetic_flux.txt index 33ac5ffa98f..eab8e21bdfa 100644 --- a/forge-gui/res/cardsfolder/m/magnetic_flux.txt +++ b/forge-gui/res/cardsfolder/m/magnetic_flux.txt @@ -2,6 +2,6 @@ Name:Magnetic Flux ManaCost:2 U Types:Instant A:SP$ PumpAll | Cost$ 2 U | ValidCards$ Creature.Artifact+YouCtrl | KW$ Flying | SpellDescription$ Artifact creatures you control gain flying until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/magnetic_flux.jpg Oracle:Artifact creatures you control gain flying until end of turn. diff --git a/forge-gui/res/cardsfolder/m/magnetic_mine.txt b/forge-gui/res/cardsfolder/m/magnetic_mine.txt index 80632ba09fe..a51bd4fff5e 100644 --- a/forge-gui/res/cardsfolder/m/magnetic_mine.txt +++ b/forge-gui/res/cardsfolder/m/magnetic_mine.txt @@ -3,6 +3,6 @@ ManaCost:4 Types:Artifact T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Artifact.Other | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever another artifact is put into a graveyard from the battlefield, CARDNAME deals 2 damage to that artifact's controller. SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredCardController | NumDmg$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/magnetic_mine.jpg Oracle:Whenever another artifact is put into a graveyard from the battlefield, Magnetic Mine deals 2 damage to that artifact's controller. diff --git a/forge-gui/res/cardsfolder/m/magnetic_mountain.txt b/forge-gui/res/cardsfolder/m/magnetic_mountain.txt index 36e1ec120b4..c74968ad37e 100644 --- a/forge-gui/res/cardsfolder/m/magnetic_mountain.txt +++ b/forge-gui/res/cardsfolder/m/magnetic_mountain.txt @@ -7,7 +7,7 @@ SVar:TrigChoose:DB$ ChooseCard | Defined$ TriggeredPlayer | Amount$ X | Referenc SVar:DBUntap:DB$ RepeatEach | DefinedCards$ ChosenCard | RepeatSubAbility$ UntapEach SVar:UntapEach:DB$ Untap | Defined$ Remembered | UnlessCost$ 4 | UnlessPayer$ RememberedController | UnlessSwitched$ True | ShowCurrentCard$ Remembered SVar:X:Count$Valid Creature.tapped+Blue+ActivePlayerCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/magnetic_mountain.jpg Oracle:Blue creatures don't untap during their controllers' untap steps.\nAt the beginning of each player's upkeep, that player may choose any number of tapped blue creatures they control and pay {4} for each creature chosen this way. If the player does, untap those creatures. diff --git a/forge-gui/res/cardsfolder/m/magnetic_theft.txt b/forge-gui/res/cardsfolder/m/magnetic_theft.txt index 41c28c7f95b..b5e038fd960 100644 --- a/forge-gui/res/cardsfolder/m/magnetic_theft.txt +++ b/forge-gui/res/cardsfolder/m/magnetic_theft.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Instant A:SP$ Pump | Cost$ R | ValidTgts$ Equipment | TgtPrompt$ Select target equipment | IsCurse$ True | SubAbility$ MagneticTheft | StackDescription$ None | SpellDescription$ Attach target Equipment to target creature. (Control of the Equipment doesn't change.) SVar:MagneticTheft:DB$ Attach | Object$ ParentTarget | ValidTgts$ Creature | TgtPrompt$ Select target creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/magnetic_theft.jpg Oracle:Attach target Equipment to target creature. (Control of the Equipment doesn't change.) diff --git a/forge-gui/res/cardsfolder/m/magnivore.txt b/forge-gui/res/cardsfolder/m/magnivore.txt index 33e5e0ae817..90dd9201b53 100644 --- a/forge-gui/res/cardsfolder/m/magnivore.txt +++ b/forge-gui/res/cardsfolder/m/magnivore.txt @@ -6,6 +6,6 @@ K:Haste S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | References$ X | Description$ CARDNAME's power and toughness are each equal to the number of sorcery cards in all graveyards. SVar:X:Count$TypeInAllYards.Sorcery SVar:NeedsToPlayVar:X GE2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/magnivore.jpg Oracle:Haste\nMagnivore's power and toughness are each equal to the number of sorcery cards in all graveyards. diff --git a/forge-gui/res/cardsfolder/m/magosi_the_waterveil.txt b/forge-gui/res/cardsfolder/m/magosi_the_waterveil.txt index 538cf68f909..9f376f2ddf9 100644 --- a/forge-gui/res/cardsfolder/m/magosi_the_waterveil.txt +++ b/forge-gui/res/cardsfolder/m/magosi_the_waterveil.txt @@ -7,6 +7,6 @@ A:AB$ PutCounter | Cost$ U T | Defined$ Self | CounterType$ EON | CounterNum$ 1 A:AB$ AddTurn | Cost$ T SubCounter<1/EON> | NumTurns$ 1 | Defined$ You | SubAbility$ DBBounce | SpellDescription$ Take an extra turn after this one. SVar:DBSkipTurn:DB$ SkipTurn | NumTurns$ 1 | Defined$ You SVar:DBBounce:DB$ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Hand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/magosi_the_waterveil.jpg Oracle:Magosi, the Waterveil enters the battlefield tapped.\n{T}: Add {U}.\n{U}, {T}: Put an eon counter on Magosi, the Waterveil. Skip your next turn.\n{T}, Remove an eon counter from Magosi, the Waterveil and return it to its owner's hand: Take an extra turn after this one. diff --git a/forge-gui/res/cardsfolder/m/magus_of_the_abyss.txt b/forge-gui/res/cardsfolder/m/magus_of_the_abyss.txt index d68ea9c693b..38fbea8a9bb 100644 --- a/forge-gui/res/cardsfolder/m/magus_of_the_abyss.txt +++ b/forge-gui/res/cardsfolder/m/magus_of_the_abyss.txt @@ -4,6 +4,6 @@ Types:Creature Human Wizard PT:4/3 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ TrigDestroy | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each player's upkeep, destroy target nonartifact creature that player controls of their choice. It can't be regenerated. SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Creature.nonArtifact+ActivePlayerCtrl | TgtPrompt$ Choose target nonartifact creature. | NoRegen$ True | TargetingPlayer$ TriggeredPlayer -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/magus_of_the_abyss.jpg Oracle:At the beginning of each player's upkeep, destroy target nonartifact creature that player controls of their choice. It can't be regenerated. diff --git a/forge-gui/res/cardsfolder/m/magus_of_the_arena.txt b/forge-gui/res/cardsfolder/m/magus_of_the_arena.txt index 7fa4b37c5b1..9e2a571e85d 100644 --- a/forge-gui/res/cardsfolder/m/magus_of_the_arena.txt +++ b/forge-gui/res/cardsfolder/m/magus_of_the_arena.txt @@ -6,6 +6,6 @@ A:AB$ Tap | Cost$ 3 T | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target c SVar:DBTap:DB$ Tap | TargetingPlayer$ Player.Opponent | TargetingPlayerControls$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature you control | SubAbility$ DBFight | AlwaysRemember$ True SVar:DBFight:DB$ Fight | Defined$ Remembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/magus_of_the_arena.jpg Oracle:{3}, {T}: Tap target creature you control and target creature of an opponent's choice they control. Those creatures fight each other. (Each deals damage equal to its power to the other.) diff --git a/forge-gui/res/cardsfolder/m/magus_of_the_bazaar.txt b/forge-gui/res/cardsfolder/m/magus_of_the_bazaar.txt index 5626128f892..9a2c5455738 100644 --- a/forge-gui/res/cardsfolder/m/magus_of_the_bazaar.txt +++ b/forge-gui/res/cardsfolder/m/magus_of_the_bazaar.txt @@ -4,6 +4,6 @@ Types:Creature Human Wizard PT:0/1 A:AB$ Draw | Cost$ T | NumCards$ 2 | SpellDescription$ Draw two cards, then discard three cards. | SubAbility$ DBDiscard SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 3 | Mode$ TgtChoose -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/magus_of_the_bazaar.jpg Oracle:{T}: Draw two cards, then discard three cards. diff --git a/forge-gui/res/cardsfolder/m/magus_of_the_candelabra.txt b/forge-gui/res/cardsfolder/m/magus_of_the_candelabra.txt index fc5b026cf44..50f61fee501 100644 --- a/forge-gui/res/cardsfolder/m/magus_of_the_candelabra.txt +++ b/forge-gui/res/cardsfolder/m/magus_of_the_candelabra.txt @@ -6,6 +6,6 @@ A:AB$ Untap | Cost$ X T | TargetMin$ 0 | TargetMax$ MaxTgts | References$ X,MaxT # It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) SVar:X:Targeted$Amount SVar:MaxTgts:Count$Valid Land -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/magus_of_the_candelabra.jpg Oracle:{X}, {T}: Untap X target lands. diff --git a/forge-gui/res/cardsfolder/m/magus_of_the_coffers.txt b/forge-gui/res/cardsfolder/m/magus_of_the_coffers.txt index 6d6b6aed9e7..3cb6233625c 100644 --- a/forge-gui/res/cardsfolder/m/magus_of_the_coffers.txt +++ b/forge-gui/res/cardsfolder/m/magus_of_the_coffers.txt @@ -4,6 +4,6 @@ Types:Creature Human Wizard PT:4/4 A:AB$ Mana | Cost$ 2 T | Produced$ B | Amount$ X | References$ X | SpellDescription$ Add {B} for each Swamp you control. SVar:X:Count$Valid Swamp.YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/magus_of_the_coffers.jpg Oracle:{2}, {T}: Add {B} for each Swamp you control. diff --git a/forge-gui/res/cardsfolder/m/magus_of_the_jar.txt b/forge-gui/res/cardsfolder/m/magus_of_the_jar.txt index 40bb86339b1..68e4061bfe1 100644 --- a/forge-gui/res/cardsfolder/m/magus_of_the_jar.txt +++ b/forge-gui/res/cardsfolder/m/magus_of_the_jar.txt @@ -8,6 +8,6 @@ SVar:DelayedReturn:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execu SVar:DBDiscard:DB$ Discard | Defined$ Player | Mode$ Hand | SubAbility$ ReturnAll SVar:ReturnAll:DB$ ChangeZone | Defined$ DelayTriggerRemembered | Origin$ Exile | Destination$ Hand SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/magus_of_the_jar.jpg Oracle:{T}, Sacrifice Magus of the Jar: Each player exiles all cards from their hand face down and draws seven cards. At the beginning of the next end step, each player discards their hand and returns to their hand each card they exiled this way. diff --git a/forge-gui/res/cardsfolder/m/magus_of_the_library.txt b/forge-gui/res/cardsfolder/m/magus_of_the_library.txt index 79665b0a6c3..f753550bc88 100644 --- a/forge-gui/res/cardsfolder/m/magus_of_the_library.txt +++ b/forge-gui/res/cardsfolder/m/magus_of_the_library.txt @@ -4,6 +4,6 @@ Types:Creature Human Wizard PT:1/1 A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Draw | Cost$ T | NumCards$ 1 | ActivationCardsInHand$ 7 | SpellDescription$ Draw a card. Activate this ability only if you have exactly seven cards in hand. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://resources.wizards.com/magic/cards/plc/en-us/card134741.jpg Oracle:{T}: Add {C}.\n{T}: Draw a card. Activate this ability only if you have exactly seven cards in hand. diff --git a/forge-gui/res/cardsfolder/m/magus_of_the_moat.txt b/forge-gui/res/cardsfolder/m/magus_of_the_moat.txt index a7c2178ddec..960bcd1144d 100644 --- a/forge-gui/res/cardsfolder/m/magus_of_the_moat.txt +++ b/forge-gui/res/cardsfolder/m/magus_of_the_moat.txt @@ -3,6 +3,6 @@ ManaCost:2 W W Types:Creature Human Wizard PT:0/3 S:Mode$ Continuous | Affected$ Creature.withoutFlying | AddHiddenKeyword$ CARDNAME can't attack. | Description$ Creatures without flying can't attack. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/magus_of_the_moat.jpg Oracle:Creatures without flying can't attack. diff --git a/forge-gui/res/cardsfolder/m/magus_of_the_moon.txt b/forge-gui/res/cardsfolder/m/magus_of_the_moon.txt index 1d0221c6984..8567ab0b4e1 100644 --- a/forge-gui/res/cardsfolder/m/magus_of_the_moon.txt +++ b/forge-gui/res/cardsfolder/m/magus_of_the_moon.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Creature Human Wizard PT:2/2 S:Mode$ Continuous | Affected$ Land.nonBasic | AddType$ Mountain | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | Description$ Nonbasic lands are Mountains. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/magus_of_the_moon.jpg Oracle:Nonbasic lands are Mountains. diff --git a/forge-gui/res/cardsfolder/m/magus_of_the_scroll.txt b/forge-gui/res/cardsfolder/m/magus_of_the_scroll.txt index 795b6c1694f..9d9213632a0 100644 --- a/forge-gui/res/cardsfolder/m/magus_of_the_scroll.txt +++ b/forge-gui/res/cardsfolder/m/magus_of_the_scroll.txt @@ -6,6 +6,6 @@ A:AB$ NameCard | Cost$ 3 T | Defined$ You | SubAbility$ DBReveal | SpellDescript SVar:DBReveal:DB$ Reveal | Random$ True | RememberRevealed$ True | Defined$ You | SubAbility$ DBDamage SVar:DBDamage:DB$ DealDamage | NumDmg$ 2 | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | ConditionDefined$ Remembered | ConditionPresent$ Card.NamedCard | ConditionCompare$ EQ1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/magus_of_the_scroll.jpg Oracle:{3}, {T}: Choose a card name, then reveal a card at random from your hand. If that card has the chosen name, Magus of the Scroll deals 2 damage to any target. diff --git a/forge-gui/res/cardsfolder/m/magus_of_the_tabernacle.txt b/forge-gui/res/cardsfolder/m/magus_of_the_tabernacle.txt index eb9c7f9ebd4..f817007a40f 100644 --- a/forge-gui/res/cardsfolder/m/magus_of_the_tabernacle.txt +++ b/forge-gui/res/cardsfolder/m/magus_of_the_tabernacle.txt @@ -3,6 +3,6 @@ ManaCost:3 W Types:Creature Human Wizard PT:2/6 S:Mode$ Continuous | Affected$ Creature | AddKeyword$ UpkeepCost:1 | Description$ All creatures have "At the beginning of your upkeep, sacrifice this creature unless you pay {1}." -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/magus_of_the_tabernacle.jpg Oracle:All creatures have "At the beginning of your upkeep, sacrifice this creature unless you pay {1}." diff --git a/forge-gui/res/cardsfolder/m/magus_of_the_unseen.txt b/forge-gui/res/cardsfolder/m/magus_of_the_unseen.txt index a6c05acf0d1..ef0662e9d73 100644 --- a/forge-gui/res/cardsfolder/m/magus_of_the_unseen.txt +++ b/forge-gui/res/cardsfolder/m/magus_of_the_unseen.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Creature Human Wizard PT:1/1 A:AB$ GainControl | Cost$ 1 U T | ValidTgts$ Artifact.OppCtrl | TgtPrompt$ Select target artifact opponent controls | LoseControl$ EOT | AddKWs$ Haste | Untap$ True | TapOnLose$ True | SpellDescription$ Untap target artifact an opponent controls and gain control of it until end of turn. It gains haste until end of turn. When you lose control of the artifact, tap it. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/magus_of_the_unseen.jpg Oracle:{1}{U}, {T}: Untap target artifact an opponent controls and gain control of it until end of turn. It gains haste until end of turn. When you lose control of the artifact, tap it. diff --git a/forge-gui/res/cardsfolder/m/magus_of_the_wheel.txt b/forge-gui/res/cardsfolder/m/magus_of_the_wheel.txt index 2025430fdfd..d04f44cb9b4 100644 --- a/forge-gui/res/cardsfolder/m/magus_of_the_wheel.txt +++ b/forge-gui/res/cardsfolder/m/magus_of_the_wheel.txt @@ -4,6 +4,6 @@ Types:Creature Human Wizard PT:3/3 A:AB$ Discard | Cost$ 1 R T Sac<1/CARDNAME> | Defined$ Player | Mode$ Hand | SubAbility$ DBDraw | SpellDescription$ Each player discards their hand, then draws seven cards. SVar:DBDraw:DB$ Draw | Defined$ Player | NumCards$ 7 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/magus_of_the_wheel.jpg Oracle:{1}{R}, {T}, Sacrifice Magus of the Wheel: Each player discards their hand, then draws seven cards. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/m/major_teroh.txt b/forge-gui/res/cardsfolder/m/major_teroh.txt index cf7688e5df8..4c111b7b08a 100644 --- a/forge-gui/res/cardsfolder/m/major_teroh.txt +++ b/forge-gui/res/cardsfolder/m/major_teroh.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Bird Soldier PT:2/3 K:Flying A:AB$ ChangeZoneAll | Cost$ 3 W W Sac<1/CARDNAME> | ChangeType$ Creature.Black | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile all black creatures. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/major_teroh.jpg Oracle:Flying\n{3}{W}{W}, Sacrifice Major Teroh: Exile all black creatures. diff --git a/forge-gui/res/cardsfolder/m/makindi_shieldmate.txt b/forge-gui/res/cardsfolder/m/makindi_shieldmate.txt index 7f46c800b04..458a4d4ca09 100644 --- a/forge-gui/res/cardsfolder/m/makindi_shieldmate.txt +++ b/forge-gui/res/cardsfolder/m/makindi_shieldmate.txt @@ -7,6 +7,6 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Ally.Other+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may put a +1/+1 counter on CARDNAME. SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 SVar:BuffedBy:Ally -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/makindi_shieldmate.jpg Oracle:Defender\nWhenever Makindi Shieldmate or another Ally enters the battlefield under your control, you may put a +1/+1 counter on Makindi Shieldmate. diff --git a/forge-gui/res/cardsfolder/m/malachite_talisman.txt b/forge-gui/res/cardsfolder/m/malachite_talisman.txt index eca875d4cb5..0067502630d 100644 --- a/forge-gui/res/cardsfolder/m/malachite_talisman.txt +++ b/forge-gui/res/cardsfolder/m/malachite_talisman.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact T:Mode$ SpellCast | ValidCard$ Card.Green | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ Whenever a player casts a green spell, you may pay {3}. If you do, untap target permanent. SVar:TrigUntap:AB$Untap | Cost$ 3 | ValidTgts$ Permanent | TgtPrompt$ Select target permanent -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/malachite_talisman.jpg Oracle:Whenever a player casts a green spell, you may pay {3}. If you do, untap target permanent. diff --git a/forge-gui/res/cardsfolder/m/malakir_bloodwitch.txt b/forge-gui/res/cardsfolder/m/malakir_bloodwitch.txt index a9888dd52e2..040a1ae8f16 100644 --- a/forge-gui/res/cardsfolder/m/malakir_bloodwitch.txt +++ b/forge-gui/res/cardsfolder/m/malakir_bloodwitch.txt @@ -10,6 +10,6 @@ SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ AFLifeLost SVar:AFLifeLost:Number$0 #AFLifeLost will be set by LoseLife SVar:X:Count$Valid Vampire.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/malakir_bloodwitch.jpg Oracle:Flying, protection from white\nWhen Malakir Bloodwitch enters the battlefield, each opponent loses life equal to the number of Vampires you control. You gain life equal to the life lost this way. diff --git a/forge-gui/res/cardsfolder/m/malakir_soothsayer.txt b/forge-gui/res/cardsfolder/m/malakir_soothsayer.txt index e7b089b0439..f51ed27718d 100644 --- a/forge-gui/res/cardsfolder/m/malakir_soothsayer.txt +++ b/forge-gui/res/cardsfolder/m/malakir_soothsayer.txt @@ -4,7 +4,7 @@ Types:Creature Vampire Shaman Ally PT:4/4 A:AB$ Draw | Cost$ T tapXType<1/Ally> | NumCards$ 1 | PrecostDesc$ Cohort — | SpellDescription$ You draw a card and you lose 1 life. | SubAbility$ DBLoseLife SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHints:Type$Ally SVar:Picture:http://www.wizards.com/global/images/magic/general/malakir_soothsayer.jpg Oracle:Cohort — {T}, Tap an untapped Ally you control: You draw a card and you lose 1 life. diff --git a/forge-gui/res/cardsfolder/m/malevolent_awakening.txt b/forge-gui/res/cardsfolder/m/malevolent_awakening.txt index 6ef2fd5ce0a..032be51512e 100644 --- a/forge-gui/res/cardsfolder/m/malevolent_awakening.txt +++ b/forge-gui/res/cardsfolder/m/malevolent_awakening.txt @@ -2,6 +2,6 @@ Name:Malevolent Awakening ManaCost:1 B B Types:Enchantment A:AB$ ChangeZone | Cost$ 1 B B Sac<1/Creature> | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target creature card from your graveyard to your hand. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/malevolent_awakening.jpg Oracle:{1}{B}{B}, Sacrifice a creature: Return target creature card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/m/malicious_advice.txt b/forge-gui/res/cardsfolder/m/malicious_advice.txt index 3c86de41c45..ab59e4e0b7a 100644 --- a/forge-gui/res/cardsfolder/m/malicious_advice.txt +++ b/forge-gui/res/cardsfolder/m/malicious_advice.txt @@ -6,6 +6,6 @@ SVar:Drain:DB$LoseLife | LifeAmount$ X | References$ X # It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) SVar:X:Targeted$Amount SVar:MaxTgts:Count$Valid Artifact,Creature,Land -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/malicious_advice.jpg Oracle:Tap X target artifacts, creatures, and/or lands. You lose X life. diff --git a/forge-gui/res/cardsfolder/m/malicious_intent.txt b/forge-gui/res/cardsfolder/m/malicious_intent.txt index b4a888c2ca4..1a70206ed25 100644 --- a/forge-gui/res/cardsfolder/m/malicious_intent.txt +++ b/forge-gui/res/cardsfolder/m/malicious_intent.txt @@ -6,6 +6,6 @@ A:SP$ Attach | Cost$ 1 R | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddAbility$ HostileAct | Description$ Enchanted creature has "{T}: Target creature can't block this turn." SVar:HostileAct:AB$Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | IsCurse$ True | KW$ HIDDEN CARDNAME can't block. | SpellDescription$ Target creature can't block this turn. SVar:NonStackingAttachEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/malicious_intent.jpg Oracle:Enchant creature\nEnchanted creature has "{T}: Target creature can't block this turn." diff --git a/forge-gui/res/cardsfolder/m/malignant_growth.txt b/forge-gui/res/cardsfolder/m/malignant_growth.txt index 34ee08c732f..a5771726c54 100644 --- a/forge-gui/res/cardsfolder/m/malignant_growth.txt +++ b/forge-gui/res/cardsfolder/m/malignant_growth.txt @@ -8,6 +8,6 @@ SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ GROWTH | Count SVar:TrigDraw:DB$ Draw | Defined$ TriggeredPlayer | NumCards$ X | References$ X | SubAbility$ DBDamage SVar:DBDamage:DB$ DealDamage | Defined$ TriggeredPlayer | NumDmg$ X | References$ X SVar:X:Count$CardCounters.GROWTH -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/malignant_growth.jpg Oracle:Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nAt the beginning of your upkeep, put a growth counter on Malignant Growth.\nAt the beginning of each opponent's draw step, that player draws an additional card for each growth counter on Malignant Growth, then Malignant Growth deals damage to the player equal to the number of cards they drew this way. diff --git a/forge-gui/res/cardsfolder/m/mana_breach.txt b/forge-gui/res/cardsfolder/m/mana_breach.txt index fb400d1a02e..8b65a4b1858 100644 --- a/forge-gui/res/cardsfolder/m/mana_breach.txt +++ b/forge-gui/res/cardsfolder/m/mana_breach.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Enchantment T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigBounce | TriggerDescription$ Whenever a player casts a spell, that player returns a land they control to its owner's hand. SVar:TrigBounce:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | ChangeNum$ 1 | ChangeType$ Land | Mandatory$ True | DefinedPlayer$ TriggeredActivator | Chooser$ TriggeredActivator | Hidden$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_breach.jpg Oracle:Whenever a player casts a spell, that player returns a land they control to its owner's hand. diff --git a/forge-gui/res/cardsfolder/m/mana_clash.txt b/forge-gui/res/cardsfolder/m/mana_clash.txt index 66c0827d4b9..a9962c99b61 100644 --- a/forge-gui/res/cardsfolder/m/mana_clash.txt +++ b/forge-gui/res/cardsfolder/m/mana_clash.txt @@ -9,6 +9,6 @@ SVar:ClashTails:DB$ StoreSVar | SVar$ RepeatCheck | Type$ CountSVar | Expression SVar:ClashDamage:DB$ DamageAll | ValidPlayers$ FlippedTails | NumDmg$ 1 | SubAbility$ ResetFlips SVar:ResetFlips:DB$ Cleanup | ClearCoinFlips$ True SVar:RepeatCheck:Number$ 0 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_clash.jpg Oracle:You and target opponent each flip a coin. Mana Clash deals 1 damage to each player whose coin comes up tails. Repeat this process until both players' coins come up heads on the same flip. diff --git a/forge-gui/res/cardsfolder/m/mana_crypt.txt b/forge-gui/res/cardsfolder/m/mana_crypt.txt index fdce5eac479..eed974cfe94 100644 --- a/forge-gui/res/cardsfolder/m/mana_crypt.txt +++ b/forge-gui/res/cardsfolder/m/mana_crypt.txt @@ -5,6 +5,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E SVar:TrigFlip:DB$ FlipACoin | Defined$ You | LoseSubAbility$ DBDamage SVar:DBDamage:DB$ DealDamage | Defined$ You | NumDmg$ 3 A:AB$ Mana | Cost$ T | Produced$ C | Amount$ 2 | SpellDescription$ Add {C}{C}. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_crypt.jpg Oracle:At the beginning of your upkeep, flip a coin. If you lose the flip, Mana Crypt deals 3 damage to you.\n{T}: Add {C}{C}. diff --git a/forge-gui/res/cardsfolder/m/mana_cylix.txt b/forge-gui/res/cardsfolder/m/mana_cylix.txt index 1aee50e5984..014f51a11d5 100644 --- a/forge-gui/res/cardsfolder/m/mana_cylix.txt +++ b/forge-gui/res/cardsfolder/m/mana_cylix.txt @@ -2,6 +2,6 @@ Name:Mana Cylix ManaCost:1 Types:Artifact A:AB$ Mana | Cost$ 1 T | Produced$ Any | SpellDescription$ Add one mana of any color. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_cylix.jpg Oracle:{1}, {T}: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/m/mana_echoes.txt b/forge-gui/res/cardsfolder/m/mana_echoes.txt index d4c38667f5b..159abe09436 100644 --- a/forge-gui/res/cardsfolder/m/mana_echoes.txt +++ b/forge-gui/res/cardsfolder/m/mana_echoes.txt @@ -6,6 +6,6 @@ SVar:TrigPump:DB$ Pump | Defined$ TriggeredCard | RememberObjects$ TriggeredCard SVar:DBMana:DB$ Mana | Produced$ C | Defined$ You | Amount$ X | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$Valid Creature.sharesCreatureTypeWith Remembered+YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_echoes.jpg Oracle:Whenever a creature enters the battlefield, you may add an amount of {C} equal to the number of creatures you control that share a creature type with it. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/m/mana_maze.txt b/forge-gui/res/cardsfolder/m/mana_maze.txt index 68918520901..80a07118820 100644 --- a/forge-gui/res/cardsfolder/m/mana_maze.txt +++ b/forge-gui/res/cardsfolder/m/mana_maze.txt @@ -2,7 +2,7 @@ Name:Mana Maze ManaCost:1 U Types:Enchantment S:Mode$ CantBeCast | ValidCard$ Card.SharesColorWith LastCastThisTurn | Description$ Players can't cast spells that share a color with the spell most recently cast this turn. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_maze.jpg Oracle:Players can't cast spells that share a color with the spell most recently cast this turn. diff --git a/forge-gui/res/cardsfolder/m/mana_prism.txt b/forge-gui/res/cardsfolder/m/mana_prism.txt index 22060a00e0f..0e101684660 100644 --- a/forge-gui/res/cardsfolder/m/mana_prism.txt +++ b/forge-gui/res/cardsfolder/m/mana_prism.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ 1 T | Produced$ Any | SpellDescription$ Add one mana of any color. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_prism.jpg Oracle:{T}: Add {C}.\n{1}, {T}: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/m/mana_seism.txt b/forge-gui/res/cardsfolder/m/mana_seism.txt index 1e2e7ff5b2f..416d1c6bb38 100644 --- a/forge-gui/res/cardsfolder/m/mana_seism.txt +++ b/forge-gui/res/cardsfolder/m/mana_seism.txt @@ -6,6 +6,6 @@ SVar:DBMana:DB$ Mana | Produced$ C | Amount$ X | References$ X | SubAbility$ DBC SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:SacX:Count$Valid Land.YouCtrl SVar:X:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_seism.jpg Oracle:Sacrifice any number of lands. Add {C} for each land sacrificed this way. diff --git a/forge-gui/res/cardsfolder/m/mana_severance.txt b/forge-gui/res/cardsfolder/m/mana_severance.txt index be8e93f5472..7a5d0dea9bb 100644 --- a/forge-gui/res/cardsfolder/m/mana_severance.txt +++ b/forge-gui/res/cardsfolder/m/mana_severance.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Sorcery A:SP$ ChangeZone | Cost$ 1 U | Origin$ Library | Destination$ Exile | ChangeType$ Land | ChangeNum$ XFetch | References$ XFetch | SpellDescription$ Search your library for any number of land cards and exile them. Then shuffle your library. SVar:XFetch:Count$TypeInYourLibrary.Land -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_severance.jpg Oracle:Search your library for any number of land cards and exile them. Then shuffle your library. diff --git a/forge-gui/res/cardsfolder/m/mana_short.txt b/forge-gui/res/cardsfolder/m/mana_short.txt index 7ad5ae466c4..1a4744867f2 100644 --- a/forge-gui/res/cardsfolder/m/mana_short.txt +++ b/forge-gui/res/cardsfolder/m/mana_short.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Instant A:SP$ TapAll | Cost$ 2 U | ValidTgts$ Player | TgtPrompt$ Select target player | ValidCards$ Land | SubAbility$ DrainMana | SpellDescription$ Tap all lands target player controls and that player loses all unspent mana. SVar:DrainMana:DB$ DrainMana | Defined$ Targeted -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_short.jpg Oracle:Tap all lands target player controls and that player loses all unspent mana. diff --git a/forge-gui/res/cardsfolder/m/mana_vapors.txt b/forge-gui/res/cardsfolder/m/mana_vapors.txt index 7e21e5a1903..59858a491d4 100644 --- a/forge-gui/res/cardsfolder/m/mana_vapors.txt +++ b/forge-gui/res/cardsfolder/m/mana_vapors.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ PumpAll | Cost$ 1 U | ValidTgts$ Player | IsCurse$ True | ValidCards$ Land.TargetedPlayerCtrl | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | SpellDescription$ Lands target player controls don't untap during their next untap step. #TODO: the AI doesn't really target the opponent with the tapped lands in a multiplayer game (not necessarily, anyway). Could use improvement before this card is marked AI playable. SVar:NeedsToPlay:Land.OppCtrl+tapped -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_vapors.jpg Oracle:Lands target player controls don't untap during their next untap step. diff --git a/forge-gui/res/cardsfolder/m/mana_vault.txt b/forge-gui/res/cardsfolder/m/mana_vault.txt index b3eb8967469..1d3d224d168 100644 --- a/forge-gui/res/cardsfolder/m/mana_vault.txt +++ b/forge-gui/res/cardsfolder/m/mana_vault.txt @@ -8,6 +8,6 @@ T:Mode$ Phase | Phase$ Draw | ValidPlayer$ You | IsPresent$ Card.Self+tapped | E SVar:TrigUntap:AB$Untap | Cost$ 4 | Defined$ Self SVar:TrigDamage:DB$DealDamage | Defined$ You | NumDmg$ 1 #TODO: The AI will untap this with Voltaic Key and will correctly untap it when it has enough available mana. Might improve the logic for when the AI actually taps it for mana, perhaps. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_vault.jpg Oracle:Mana Vault doesn't untap during your untap step.\nAt the beginning of your upkeep, you may pay {4}. If you do, untap Mana Vault.\nAt the beginning of your draw step, if Mana Vault is tapped, it deals 1 damage to you.\n{T}: Add {C}{C}{C}. diff --git a/forge-gui/res/cardsfolder/m/mana_vortex.txt b/forge-gui/res/cardsfolder/m/mana_vortex.txt index 3684865c000..e1f9f7ae8fc 100644 --- a/forge-gui/res/cardsfolder/m/mana_vortex.txt +++ b/forge-gui/res/cardsfolder/m/mana_vortex.txt @@ -7,6 +7,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield SVar:TrigSac:DB$ Sacrifice | SacValid$ Land | Defined$ TriggeredPlayer | SacMessage$ land T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Land | PresentCompare$ EQ0 | Execute$ TrigSacSelf | TriggerDescription$ When there are no lands on the battlefield, sacrifice CARDNAME. SVar:TrigSacSelf:DB$ Sacrifice | Defined$ Self -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_vortex.jpg Oracle:When you cast Mana Vortex, counter it unless you sacrifice a land.\nAt the beginning of each player's upkeep, that player sacrifices a land.\nWhen there are no lands on the battlefield, sacrifice Mana Vortex. diff --git a/forge-gui/res/cardsfolder/m/manabarbs.txt b/forge-gui/res/cardsfolder/m/manabarbs.txt index 30a820f265f..3c98c645120 100644 --- a/forge-gui/res/cardsfolder/m/manabarbs.txt +++ b/forge-gui/res/cardsfolder/m/manabarbs.txt @@ -3,6 +3,6 @@ ManaCost:3 R Types:Enchantment T:Mode$ TapsForMana | ValidCard$ Land | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a player taps a land for mana, CARDNAME deals 1 damage to that player. SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredPlayer | NumDmg$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/manabarbs.jpg Oracle:Whenever a player taps a land for mana, Manabarbs deals 1 damage to that player. diff --git a/forge-gui/res/cardsfolder/m/manabond.txt b/forge-gui/res/cardsfolder/m/manabond.txt index e93249ca7fd..cdd8957451a 100644 --- a/forge-gui/res/cardsfolder/m/manabond.txt +++ b/forge-gui/res/cardsfolder/m/manabond.txt @@ -4,7 +4,7 @@ Types:Enchantment T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigChangeAll | TriggerDescription$ At the beginning of your end step, you may reveal your hand and put all land cards from it onto the battlefield. If you do, discard your hand. SVar:TrigChangeAll:DB$ChangeZoneAll | ChangeType$ Land.YouCtrl | Origin$ Hand | Destination$ Battlefield | SubAbility$ DBDiscard SVar:DBDiscard:DB$Discard | Mode$ Hand -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/manabond.jpg Oracle:At the beginning of your end step, you may reveal your hand and put all land cards from it onto the battlefield. If you do, discard your hand. diff --git a/forge-gui/res/cardsfolder/m/manamorphose.txt b/forge-gui/res/cardsfolder/m/manamorphose.txt index 88d16d28620..f425bca0520 100644 --- a/forge-gui/res/cardsfolder/m/manamorphose.txt +++ b/forge-gui/res/cardsfolder/m/manamorphose.txt @@ -3,6 +3,6 @@ ManaCost:1 RG Types:Instant A:SP$ Mana | Cost$ 1 RG | Produced$ Combo Any | Amount$ 2 | AILogic$ MostProminentInComputerHand | SubAbility$ DBDraw | SpellDescription$ Add two mana in any combination of colors. Draw a card. SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/manamorphose.jpg Oracle:Add two mana in any combination of colors.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/m/mangaras_equity.txt b/forge-gui/res/cardsfolder/m/mangaras_equity.txt index 9ab5cf449cc..4e67f48647e 100644 --- a/forge-gui/res/cardsfolder/m/mangaras_equity.txt +++ b/forge-gui/res/cardsfolder/m/mangaras_equity.txt @@ -7,6 +7,6 @@ SVar:ChooseBlackOrRed:DB$ ChooseColor | Defined$ You | Choices$ black,red | AILo T:Mode$ DamageDone | ValidSource$ Creature.ChosenColor | ValidTarget$ Creature.White+YouCtrl,You | TriggerZones$ Battlefield | Execute$ MangarasRetribution | TriggerDescription$ Whenever a creature of the chosen color deals damage to you or a white creature you control, CARDNAME deals that much damage to that creature. SVar:MangarasRetribution:DB$ DealDamage | Defined$ TriggeredSourceLKICopy | NumDmg$ MangaraX | References$ MangaraX SVar:MangaraX:TriggerCount$DamageAmount -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mangaras_equity.jpg Oracle:As Mangara's Equity enters the battlefield, choose black or red.\nAt the beginning of your upkeep, sacrifice Mangara's Equity unless you pay {1}{W}.\nWhenever a creature of the chosen color deals damage to you or a white creature you control, Mangara's Equity deals that much damage to that creature. diff --git a/forge-gui/res/cardsfolder/m/mangaras_tome.txt b/forge-gui/res/cardsfolder/m/mangaras_tome.txt index 6a4a78d3772..8e6d119935f 100644 --- a/forge-gui/res/cardsfolder/m/mangaras_tome.txt +++ b/forge-gui/res/cardsfolder/m/mangaras_tome.txt @@ -12,7 +12,7 @@ SVar:DrawReplace:Event$ Draw | ValidPlayer$ You | ReplaceWith$ RepMangarasTome | SVar:TrigLeavePlay:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.IsImprinted | Execute$ ExileEffect | Static$ True SVar:RepMangarasTome:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Hand | SubAbility$ ExileEffect SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mangaras_tome.jpg Oracle:When Mangara's Tome enters the battlefield, search your library for five cards, exile them in a face-down pile, and shuffle that pile. Then shuffle your library.\n{2}: The next time you would draw a card this turn, instead put the top card of the exiled pile into its owner's hand. diff --git a/forge-gui/res/cardsfolder/m/maniacal_rage.txt b/forge-gui/res/cardsfolder/m/maniacal_rage.txt index b8c7b7ac375..dc0b823f0b6 100644 --- a/forge-gui/res/cardsfolder/m/maniacal_rage.txt +++ b/forge-gui/res/cardsfolder/m/maniacal_rage.txt @@ -4,6 +4,6 @@ Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ 1 R | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 2 | AddToughness$ 2 | AddHiddenKeyword$ CARDNAME can't block. | Description$ Enchanted creature gets +2/+2 and can't block. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/maniacal_rage.jpg Oracle:Enchant creature\nEnchanted creature gets +2/+2 and can't block. diff --git a/forge-gui/res/cardsfolder/m/manipulate_fate.txt b/forge-gui/res/cardsfolder/m/manipulate_fate.txt index 47ab7601c5a..239402a6128 100644 --- a/forge-gui/res/cardsfolder/m/manipulate_fate.txt +++ b/forge-gui/res/cardsfolder/m/manipulate_fate.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Sorcery A:SP$ ChangeZone | Cost$ 1 U | Origin$ Library | Destination$ Exile | ChangeType$ Card | ChangeNum$ 3 | Mandatory$ True | SpellDescription$ Search your library for three cards, exile them, then shuffle your library. | SubAbility$ DBDraw SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/manipulate_fate.jpg Oracle:Search your library for three cards, exile them, then shuffle your library.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/m/mannichi_the_fevered_dream.txt b/forge-gui/res/cardsfolder/m/mannichi_the_fevered_dream.txt index e89271bb276..56d69de3f8c 100644 --- a/forge-gui/res/cardsfolder/m/mannichi_the_fevered_dream.txt +++ b/forge-gui/res/cardsfolder/m/mannichi_the_fevered_dream.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Legendary Creature Spirit PT:1/2 A:AB$ PumpAll | Cost$ 1 R | ValidCards$ Creature | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch each creature's power and toughness until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mannichi_the_fevered_dream.jpg Oracle:{1}{R}: Switch each creature's power and toughness until end of turn. diff --git a/forge-gui/res/cardsfolder/m/manor_gargoyle.txt b/forge-gui/res/cardsfolder/m/manor_gargoyle.txt index 53877756a27..031058c15a4 100644 --- a/forge-gui/res/cardsfolder/m/manor_gargoyle.txt +++ b/forge-gui/res/cardsfolder/m/manor_gargoyle.txt @@ -7,6 +7,6 @@ S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Indestructible | CheckSVa SVar:X:Count$Valid Card.Self+withDefender A:AB$ Debuff | Cost$ 1 | Keywords$ Defender | Defined$ Self | SubAbility$ DBFlight | SpellDescription$ Until end of turn, CARDNAME loses defender and gains flying. SVar:DBFlight:DB$ Pump | Defined$ Self | KW$ Flying -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/manor_gargoyle.jpg Oracle:Defender\nManor Gargoyle has indestructible as long as it has defender.\n{1}: Until end of turn, Manor Gargoyle loses defender and gains flying. diff --git a/forge-gui/res/cardsfolder/m/maralen_of_the_mornsong.txt b/forge-gui/res/cardsfolder/m/maralen_of_the_mornsong.txt index c214ebddcbe..023d11b1c2a 100644 --- a/forge-gui/res/cardsfolder/m/maralen_of_the_mornsong.txt +++ b/forge-gui/res/cardsfolder/m/maralen_of_the_mornsong.txt @@ -6,6 +6,6 @@ S:Mode$ Continuous | Affected$ Player | AddKeyword$ You can't draw cards. | Desc T:Mode$ Phase | Phase$ Draw | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigDrain | TriggerDescription$ At the beginning of each player's draw step, that player loses 3 life, searches their library for a card, puts it into their hand, then shuffles their library. SVar:TrigDrain:DB$ LoseLife | Defined$ TriggeredPlayer | LifeAmount$ 3 | SubAbility$ DBTutor SVar:DBTutor:DB$ ChangeZone | DefinedPlayer$ TriggeredPlayer | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/maralen_of_the_mornsong.jpg Oracle:Players can't draw cards.\nAt the beginning of each player's draw step, that player loses 3 life, searches their library for a card, puts it into their hand, then shuffles their library. diff --git a/forge-gui/res/cardsfolder/m/maralen_of_the_mornsong_avatar.txt b/forge-gui/res/cardsfolder/m/maralen_of_the_mornsong_avatar.txt index a4ba3cc190f..f331d4a631b 100644 --- a/forge-gui/res/cardsfolder/m/maralen_of_the_mornsong_avatar.txt +++ b/forge-gui/res/cardsfolder/m/maralen_of_the_mornsong_avatar.txt @@ -10,6 +10,6 @@ S:Mode$ Continuous | EffectZone$ Command | Affected$ You | AddKeyword$ You can't T:Mode$ Phase | Phase$ Draw | ValidPlayer$ You | TriggerZones$ Command | Execute$ TrigDig | TriggerDescription$ At the beginning of your draw step, look at the top X cards of your library, where X is the amount of life paid with CARDNAME. Put one of them into your hand, then shuffle your library. SVar:TrigDig:DB$ Dig | DigNum$ LifePaidOnNewGame | References$ LifePaidOnNewGame | ChangeNum$ 1 | LibraryPosition$ 0 | SubAbility$ DBShuffle SVar:DBShuffle:DB$ Shuffle | Defined$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:https://downloads.cardforge.org/images/cards/VAN/Maralen of the Mornsong Avatar.full.jpg Oracle:Hand +0, life -3\nAt the beginning of the game, you may pay any amount of life.\nYou can't draw cards.\nAt the beginning of your draw step, look at the top X cards of your library, where X is the amount of life paid with Maralen of the Mornsong Avatar. Put one of them into your hand, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/m/marath_will_of_the_wild.txt b/forge-gui/res/cardsfolder/m/marath_will_of_the_wild.txt index 587dc3cb6f8..0ab01dde124 100644 --- a/forge-gui/res/cardsfolder/m/marath_will_of_the_wild.txt +++ b/forge-gui/res/cardsfolder/m/marath_will_of_the_wild.txt @@ -9,6 +9,6 @@ SVar:MarathCounters:DB$ PutCounter | ValidTgts$ Creature | CounterType$ P1P1 | C SVar:MarathDmg:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ Z | References$ Z | SpellDescription$ CARDNAME deals X damage to any target. X can't be 0. SVar:MarathToken:DB$ Token | TokenAmount$ 1 | TokenName$ Elemental | TokenOwner$ You | TokenPower$ Z | TokenToughness$ Z | References$ Z | TokenTypes$ Creature,Elemental | TokenColors$ Green | TokenImage$ g x x elemental | SpellDescription$ Create an X/X green Elemental creature token. X can't be 0. SVar:Z:SVar$CostCountersRemoved -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/marath_will_of_the_wild.jpg Oracle:Marath, Will of the Wild enters the battlefield with a number of +1/+1 counters on it equal to the amount of mana spent to cast it.\n{X}, Remove X +1/+1 counters from Marath: Choose one —\n• Put X +1/+1 counters on target creature. X can't be 0.\n• Marath deals X damage to any target. X can't be 0.\n• Create an X/X green Elemental creature token. X can't be 0. diff --git a/forge-gui/res/cardsfolder/m/marauding_knight.txt b/forge-gui/res/cardsfolder/m/marauding_knight.txt index 17816318ee6..907f36d23ea 100644 --- a/forge-gui/res/cardsfolder/m/marauding_knight.txt +++ b/forge-gui/res/cardsfolder/m/marauding_knight.txt @@ -5,6 +5,6 @@ PT:2/2 K:Protection from white S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | AddToughness$ X | References$ X | Description$ CARDNAME gets +1/+1 for each Plains your opponents control. SVar:X:Count$Valid Plains.OppCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/marauding_knight.jpg Oracle:Protection from white\nMarauding Knight gets +1/+1 for each Plains your opponents control. diff --git a/forge-gui/res/cardsfolder/m/maraxus_of_keld.txt b/forge-gui/res/cardsfolder/m/maraxus_of_keld.txt index 059c1c19d4e..2a485ed0e3e 100644 --- a/forge-gui/res/cardsfolder/m/maraxus_of_keld.txt +++ b/forge-gui/res/cardsfolder/m/maraxus_of_keld.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Human Warrior PT:*/* S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | References$ X | Description$ CARDNAME's power and toughness are each equal to the number of untapped artifacts, creatures, and lands you control. SVar:X:Count$Valid Artifact.untapped+YouCtrl,Creature.untapped+YouCtrl,Land.untapped+YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/maraxus_of_keld.jpg Oracle:Maraxus of Keld's power and toughness are each equal to the number of untapped artifacts, creatures, and lands you control. diff --git a/forge-gui/res/cardsfolder/m/marble_titan.txt b/forge-gui/res/cardsfolder/m/marble_titan.txt index a49f75278f6..9eecdd3e1ad 100644 --- a/forge-gui/res/cardsfolder/m/marble_titan.txt +++ b/forge-gui/res/cardsfolder/m/marble_titan.txt @@ -3,6 +3,6 @@ ManaCost:3 W Types:Creature Giant S:Mode$ Continuous | Affected$ Creature.powerGE3 | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Creatures with power 3 or greater don't untap during their controllers' untap steps. PT:3/3 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card84533.jpg Oracle:Creatures with power 3 or greater don't untap during their controllers' untap steps. diff --git a/forge-gui/res/cardsfolder/m/march_from_the_tomb.txt b/forge-gui/res/cardsfolder/m/march_from_the_tomb.txt index 4e5fab37bcf..d286a5b77d3 100644 --- a/forge-gui/res/cardsfolder/m/march_from_the_tomb.txt +++ b/forge-gui/res/cardsfolder/m/march_from_the_tomb.txt @@ -3,7 +3,7 @@ ManaCost:3 W B Types:Sorcery A:SP$ ChangeZone | Cost$ 3 W B | Origin$ Graveyard | Destination$ Battlefield | TargetMin$ 0 | TargetMax$ X | References$ X | MaxTotalTargetCMC$ 8 | ValidTgts$ Creature.Ally+YouCtrl | TgtPrompt$ Select target Ally creature card in your graveyard. | SpellDescription$ Return any number of target Ally creature cards with total converted mana cost 8 or less from your graveyard to the battlefield. SVar:X:Count$ValidGraveyard Creature.Ally+YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Ally SVar:Picture:http://www.wizards.com/global/images/magic/general/march_from_the_tomb.jpg Oracle:Return any number of target Ally creature cards with total converted mana cost 8 or less from your graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/m/march_of_the_drowned.txt b/forge-gui/res/cardsfolder/m/march_of_the_drowned.txt index 087dada1d51..af73ec9f743 100644 --- a/forge-gui/res/cardsfolder/m/march_of_the_drowned.txt +++ b/forge-gui/res/cardsfolder/m/march_of_the_drowned.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ Charm | Cost$ B | CharmNum$ 1 | Choices$ DBChangeZone1,DBChangeZone2 SVar:DBChangeZone1:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | Mandatory$ True | TgtPrompt$ Select target creature card in your graveyard | ValidTgts$ Creature.YouOwn | SpellDescription$ Return target creature card from your graveyard to your hand. SVar:DBChangeZone2:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | Mandatory$ True | TgtPrompt$ Select two target Pirate cards in your graveyard | ValidTgts$ Pirate.YouOwn | TargetMin$ 2 | TargetMax$ 2 | SpellDescription$ Return two target Pirate cards from your graveyard to your hand. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/march_of_the_drowned.jpg Oracle:Choose one —\n• Return target creature card from your graveyard to your hand.\n• Return two target Pirate cards from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/m/march_of_the_machines.txt b/forge-gui/res/cardsfolder/m/march_of_the_machines.txt index 43814bf945c..157f32fecf0 100644 --- a/forge-gui/res/cardsfolder/m/march_of_the_machines.txt +++ b/forge-gui/res/cardsfolder/m/march_of_the_machines.txt @@ -5,6 +5,6 @@ S:Mode$ Continuous | Affected$ Artifact.nonCreature | SetPower$ AffectedX | SetT SVar:AffectedX:Count$CardManaCost SVar:NonStackingEffect:True SVar:PlayMain1:ALWAYS -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/march_of_the_machines.jpg Oracle:Each noncreature artifact is an artifact creature with power and toughness each equal to its converted mana cost. (Equipment that's a creature can't equip a creature.) diff --git a/forge-gui/res/cardsfolder/m/mardu_banner.txt b/forge-gui/res/cardsfolder/m/mardu_banner.txt index 711094fe2cd..9609b4cf093 100644 --- a/forge-gui/res/cardsfolder/m/mardu_banner.txt +++ b/forge-gui/res/cardsfolder/m/mardu_banner.txt @@ -5,7 +5,7 @@ A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. A:AB$ Draw | Cost$ R W B T Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Red|White|Black SVar:Picture:http://www.wizards.com/global/images/magic/general/mardu_banner.jpg Oracle:{T}: Add {R}, {W}, or {B}.\n{R}{W}{B}, {T}, Sacrifice Mardu Banner: Draw a card. diff --git a/forge-gui/res/cardsfolder/m/mardu_blazebringer.txt b/forge-gui/res/cardsfolder/m/mardu_blazebringer.txt index 8084c1a4a9a..1b2e223b77d 100644 --- a/forge-gui/res/cardsfolder/m/mardu_blazebringer.txt +++ b/forge-gui/res/cardsfolder/m/mardu_blazebringer.txt @@ -7,6 +7,6 @@ T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ DelTrig | Secondary$ True | Tri SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigSacrifice | TriggerDescription$ Sacrifice CARDNAME at end of combat. SVar:TrigSacrifice:DB$ Sacrifice | Defined$ Self SVar:SacrificeEndCombat:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mardu_blazebringer.jpg Oracle:When Mardu Blazebringer attacks or blocks, sacrifice it at end of combat. diff --git a/forge-gui/res/cardsfolder/m/mardu_hateblade.txt b/forge-gui/res/cardsfolder/m/mardu_hateblade.txt index 3948307cd0a..f05fae043a4 100644 --- a/forge-gui/res/cardsfolder/m/mardu_hateblade.txt +++ b/forge-gui/res/cardsfolder/m/mardu_hateblade.txt @@ -3,7 +3,7 @@ ManaCost:W Types:Creature Human Warrior PT:1/1 A:AB$ Pump | Cost$ B | KW$ Deathtouch | SpellDescription$ CARDNAME gains deathtouch until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black SVar:Picture:http://www.wizards.com/global/images/magic/general/mardu_hateblade.jpg Oracle:{B}: Mardu Hateblade gains deathtouch until end of turn. (Any amount of damage it deals to a creature is enough to destroy it.) diff --git a/forge-gui/res/cardsfolder/m/marjhan.txt b/forge-gui/res/cardsfolder/m/marjhan.txt index 89c4d6b2f84..8d0cd6fad16 100644 --- a/forge-gui/res/cardsfolder/m/marjhan.txt +++ b/forge-gui/res/cardsfolder/m/marjhan.txt @@ -10,6 +10,6 @@ A:AB$ Untap | Cost$ U U Sac<1/Creature> | ActivationPhases$ Upkeep | PlayerTurn$ A:AB$ DealDamage | Cost$ U U | NumDmg$ 1 | ValidTgts$ Creature.attacking+withoutFlying | TgtPrompt$ Select target attacking creature without flying | SubAbility$ DBPump | SpellDescription$ CARDNAME gets -1/-0 until end of turn and deals 1 damage to target attacking creature without flying. SVar:DBPump:DB$ Pump | NumAtt$ -1| Defined$ Self SVar:NeedsToPlay:Island.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/marjhan.jpg Oracle:Marjhan doesn't untap during your untap step.\n{U}{U}, Sacrifice a creature: Untap Marjhan. Activate this ability only during your upkeep.\nMarjhan can't attack unless defending player controls an Island.\n{U}{U}: Marjhan gets -1/-0 until end of turn and deals 1 damage to target attacking creature without flying.\nWhen you control no Islands, sacrifice Marjhan. diff --git a/forge-gui/res/cardsfolder/m/mark_for_death.txt b/forge-gui/res/cardsfolder/m/mark_for_death.txt index 42539b36f8a..b7586858695 100644 --- a/forge-gui/res/cardsfolder/m/mark_for_death.txt +++ b/forge-gui/res/cardsfolder/m/mark_for_death.txt @@ -5,6 +5,6 @@ A:SP$ Pump | Cost$ 3 R | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target SVar:DBUntap:DB$ Untap | Defined$ Targeted | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | Name$ Mark for Death Effect | StaticAbilities$ KWPump | AILogic$ Evasion | RememberObjects$ TargetedController | ImprintCards$ Targeted SVar:KWPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.IsNotImprinted+RememberedPlayerCtrl | AddHiddenKeyword$ CARDNAME can't block. | Description$ Other creatures that player controls can't block this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mark_for_death.jpg Oracle:Target creature an opponent controls blocks this turn if able. Untap that creature. Other creatures that player controls can't block this turn. diff --git a/forge-gui/res/cardsfolder/m/mark_of_the_oni.txt b/forge-gui/res/cardsfolder/m/mark_of_the_oni.txt index 70f9d2b48de..76e8abe27e2 100644 --- a/forge-gui/res/cardsfolder/m/mark_of_the_oni.txt +++ b/forge-gui/res/cardsfolder/m/mark_of_the_oni.txt @@ -7,7 +7,7 @@ S:Mode$ Continuous | Affected$ Card.EnchantedBy | GainControl$ You | Description T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | IsPresent$ Demon.YouCtrl | PresentCompare$ EQ0 | Execute$ TrigSac | TriggerDescription$ At the beginning of the end step, if you control no Demons, sacrifice CARDNAME. SVar:TrigSac:DB$Sacrifice | Defined$ Self SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NeedsToPlay:Demon.YouCtrl DeckHints:Type$Demon SVar:Picture:http://www.wizards.com/global/images/magic/general/mark_of_the_oni.jpg diff --git a/forge-gui/res/cardsfolder/m/marker_beetles.txt b/forge-gui/res/cardsfolder/m/marker_beetles.txt index be0d45a4525..2bc236d7444 100644 --- a/forge-gui/res/cardsfolder/m/marker_beetles.txt +++ b/forge-gui/res/cardsfolder/m/marker_beetles.txt @@ -5,6 +5,6 @@ PT:2/3 A:AB$ Draw | Cost$ 2 Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigPump | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, target creature gets +1/+1 until end of turn. SVar:TrigPump:DB$Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/marker_beetles.jpg Oracle:When Marker Beetles dies, target creature gets +1/+1 until end of turn.\n{2}, Sacrifice Marker Beetles: Draw a card. diff --git a/forge-gui/res/cardsfolder/m/market_festival.txt b/forge-gui/res/cardsfolder/m/market_festival.txt index 54ccbdac866..98c69799547 100644 --- a/forge-gui/res/cardsfolder/m/market_festival.txt +++ b/forge-gui/res/cardsfolder/m/market_festival.txt @@ -5,6 +5,6 @@ K:Enchant land A:SP$ Attach | Cost$ 3 G | ValidTgts$ Land | AILogic$ Pump T:Mode$ TapsForMana | ValidCard$ Card.AttachedBy | Execute$ TrigMana | Static$ True | TriggerDescription$ Whenever enchanted land is tapped for mana, its controller adds an additional two mana in any combination of colors. SVar:TrigMana:DB$ Mana | Produced$ Combo Any | Amount$ 2 | Defined$ TriggeredCardController -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/market_festival.jpg Oracle:Enchant land\nWhenever enchanted land is tapped for mana, its controller adds an additional two mana in any combination of colors. diff --git a/forge-gui/res/cardsfolder/m/maro.txt b/forge-gui/res/cardsfolder/m/maro.txt index fa73ecb1deb..beab1349175 100644 --- a/forge-gui/res/cardsfolder/m/maro.txt +++ b/forge-gui/res/cardsfolder/m/maro.txt @@ -4,7 +4,7 @@ Types:Creature Elemental PT:*/* S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | References$ X | Description$ CARDNAME's power and toughness are each equal to the number of cards in your hand. SVar:X:Count$InYourHand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NeedsToPlayVar:X GE2 SVar:Picture:http://www.wizards.com/global/images/magic/general/maro.jpg Oracle:Maro's power and toughness are each equal to the number of cards in your hand. diff --git a/forge-gui/res/cardsfolder/m/maro_avatar.txt b/forge-gui/res/cardsfolder/m/maro_avatar.txt index dad2d761599..cd174f3048f 100644 --- a/forge-gui/res/cardsfolder/m/maro_avatar.txt +++ b/forge-gui/res/cardsfolder/m/maro_avatar.txt @@ -5,5 +5,5 @@ HandLifeModifier:+2/-7 A:AB$ Pump | Cost$ tapXType<1/Creature> Discard<1/Card> | ActivationZone$ Command | ValidTgts$ Creature | NumAtt$ +X | NumDef$ +X | SpellDescription$ Target creature you control gets +X/+X until end of turn, where X is the number of cards in your hand. SVar:X:Count$InYourHand SVar:Picture:https://downloads.cardforge.org/images/cards/VAN/Maro Avatar.full.jpg -SVar:RemAIDeck:True +AI:RemoveDeck:All Oracle:Hand +2, life -7\nTap an untapped creature you control, Discard a card: Target creature you control gets +X/+X until end of turn, where X is the number of cards in your hand. diff --git a/forge-gui/res/cardsfolder/m/marrow_gnawer.txt b/forge-gui/res/cardsfolder/m/marrow_gnawer.txt index 352ff98c44b..15642f90171 100644 --- a/forge-gui/res/cardsfolder/m/marrow_gnawer.txt +++ b/forge-gui/res/cardsfolder/m/marrow_gnawer.txt @@ -5,7 +5,7 @@ PT:2/3 S:Mode$ Continuous | Affected$ Creature.Rat | AddKeyword$ Fear | Description$ Rat creatures have fear. (They can't be blocked except by artifact creatures and/or black creatures.) A:AB$ Token | Cost$ T Sac<1/Rat> | TokenAmount$ X | References$ X | TokenName$ Rat | TokenTypes$ Creature,Rat | TokenOwner$ You | TokenColors$ Black | TokenPower$ 1 | TokenToughness$ 1 | TokenImage$ b 1 1 rat CHK | SpellDescription$ Create X 1/1 black Rat creature tokens, where X is the number of Rats you control. SVar:X:Count$TypeYouCtrl.Rat -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Rat SVar:Picture:http://www.wizards.com/global/images/magic/general/marrow_gnawer.jpg Oracle:Rat creatures have fear. (They can't be blocked except by artifact creatures and/or black creatures.)\n{T}, Sacrifice a Rat: Create X 1/1 black Rat creature tokens, where X is the number of Rats you control. diff --git a/forge-gui/res/cardsfolder/m/marsh_flitter.txt b/forge-gui/res/cardsfolder/m/marsh_flitter.txt index a68fc5fdef2..8e91bc8bb3e 100644 --- a/forge-gui/res/cardsfolder/m/marsh_flitter.txt +++ b/forge-gui/res/cardsfolder/m/marsh_flitter.txt @@ -6,6 +6,6 @@ K:Flying T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create two 1/1 black Goblin Rogue creature tokens. SVar:TrigToken:DB$Token | TokenAmount$ 2 | TokenName$ Goblin Rogue | TokenTypes$ Creature,Goblin,Rogue | TokenOwner$ You | TokenColors$ Black | TokenPower$ 1 | TokenToughness$ 1 A:AB$ Animate | Cost$ Sac<1/Goblin> | Defined$ Self | Power$ 3 | Toughness$ 3 | SpellDescription$ CARDNAME has base power and toughness 3/3 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/marsh_flitter.jpg Oracle:Flying\nWhen Marsh Flitter enters the battlefield, create two 1/1 black Goblin Rogue creature tokens.\nSacrifice a Goblin: Marsh Flitter has base power and toughness 3/3 until end of turn. diff --git a/forge-gui/res/cardsfolder/m/marsh_lurker.txt b/forge-gui/res/cardsfolder/m/marsh_lurker.txt index feb2b7b147a..962fbf3a802 100644 --- a/forge-gui/res/cardsfolder/m/marsh_lurker.txt +++ b/forge-gui/res/cardsfolder/m/marsh_lurker.txt @@ -3,6 +3,6 @@ ManaCost:3 B Types:Creature Beast PT:3/2 A:AB$ Pump | Cost$ Sac<1/Swamp> | KW$ Fear | SpellDescription$ Marsh Lurker gains fear until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/marsh_lurker.jpg Oracle:Sacrifice a Swamp: Marsh Lurker gains fear until end of turn. (It can't be blocked except by artifact creatures and/or black creatures.) diff --git a/forge-gui/res/cardsfolder/m/marshaling_the_troops.txt b/forge-gui/res/cardsfolder/m/marshaling_the_troops.txt index 6a9e3142f7c..e2a297d63b9 100644 --- a/forge-gui/res/cardsfolder/m/marshaling_the_troops.txt +++ b/forge-gui/res/cardsfolder/m/marshaling_the_troops.txt @@ -8,6 +8,6 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$Valid Creature.YouCtrl SVar:Y:Remembered$Amount SVar:Z:SVar$Y/Times.4 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/marshaling_the_troops.jpg Oracle:Tap any number of untapped creatures you control. You gain 4 life for each creature tapped this way. diff --git a/forge-gui/res/cardsfolder/m/marshals_anthem.txt b/forge-gui/res/cardsfolder/m/marshals_anthem.txt index 949c8b1b35e..da26b20c16c 100644 --- a/forge-gui/res/cardsfolder/m/marshals_anthem.txt +++ b/forge-gui/res/cardsfolder/m/marshals_anthem.txt @@ -7,7 +7,7 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | TargetMin$ 0 | TargetMax$ X | References$ X | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature card from your graveyard. SVar:X:Count$TimesKicked #TODO: The AI maximizes payment, even if it can't return anything from the graveyard. Otherwise the card is played just fine. -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/marshals_anthem.jpg Oracle:Multikicker {1}{W} (You may pay an additional {1}{W} any number of times as you cast this spell.)\nCreatures you control get +1/+1.\nWhen Marshal's Anthem enters the battlefield, return up to X target creature cards from your graveyard to the battlefield, where X is the number of times Marshal's Anthem was kicked. diff --git a/forge-gui/res/cardsfolder/m/martyr_of_ashes.txt b/forge-gui/res/cardsfolder/m/martyr_of_ashes.txt index 9d68806da08..b4e6fa6c0f9 100644 --- a/forge-gui/res/cardsfolder/m/martyr_of_ashes.txt +++ b/forge-gui/res/cardsfolder/m/martyr_of_ashes.txt @@ -4,6 +4,6 @@ Types:Creature Human Shaman PT:1/1 A:AB$ DamageAll | Cost$ 2 Reveal Sac<1/CARDNAME> | CostDesc$ {2}, Reveal X red cards from your hand, Sacrifice CARDNAME: | ValidCards$ Creature.withoutFlying | NumDmg$ ChosenX | References$ X | ValidDescription$ each creature without flying | SpellDescription$ CARDNAME deals X damage to each creature without flying. SVar:X:XChoice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/martyr_of_ashes.jpg Oracle:{2}, Reveal X red cards from your hand, Sacrifice Martyr of Ashes: Martyr of Ashes deals X damage to each creature without flying. diff --git a/forge-gui/res/cardsfolder/m/martyr_of_bones.txt b/forge-gui/res/cardsfolder/m/martyr_of_bones.txt index 820c8e129d7..59fd584608c 100644 --- a/forge-gui/res/cardsfolder/m/martyr_of_bones.txt +++ b/forge-gui/res/cardsfolder/m/martyr_of_bones.txt @@ -5,6 +5,6 @@ PT:1/1 A:AB$ ChangeZone | Cost$ 1 Reveal Sac<1/CARDNAME> | CostDesc$ {1}, Reveal X black cards from your hand, Sacrifice CARDNAME: | Origin$ Graveyard | TargetsFromSingleZone$ True | Destination$ Exile | TargetMin$ 0 | TargetMax$ Y | ValidTgts$ Card | References$ X,Y | SpellDescription$ Exile up to X target cards from a single graveyard. SVar:X:TargetedObjects$Amount SVar:Y:Count$ValidHand Card.Black+YouOwn -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/martyr_of_bones.jpg Oracle:{1}, Reveal X black cards from your hand, Sacrifice Martyr of Bones: Exile up to X target cards from a single graveyard. diff --git a/forge-gui/res/cardsfolder/m/martyr_of_frost.txt b/forge-gui/res/cardsfolder/m/martyr_of_frost.txt index b25fb7369f7..d854c29ea72 100644 --- a/forge-gui/res/cardsfolder/m/martyr_of_frost.txt +++ b/forge-gui/res/cardsfolder/m/martyr_of_frost.txt @@ -4,6 +4,6 @@ Types:Creature Human Wizard PT:1/1 A:AB$ Counter | Cost$ 2 Reveal Sac<1/CARDNAME> | CostDesc$ {2}, Reveal X blue cards from your hand, Sacrifice CARDNAME: | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ ChosenX | References$ X | SpellDescription$ Counter target spell unless its controller pays {X}. SVar:X:XChoice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/martyr_of_frost.jpg Oracle:{2}, Reveal X blue cards from your hand, Sacrifice Martyr of Frost: Counter target spell unless its controller pays {X}. diff --git a/forge-gui/res/cardsfolder/m/martyr_of_sands.txt b/forge-gui/res/cardsfolder/m/martyr_of_sands.txt index 72b27509ed8..c7ac480f587 100644 --- a/forge-gui/res/cardsfolder/m/martyr_of_sands.txt +++ b/forge-gui/res/cardsfolder/m/martyr_of_sands.txt @@ -5,6 +5,6 @@ PT:1/1 A:AB$ GainLife | Cost$ 1 Reveal Sac<1/CARDNAME> | CostDesc$ {1}, Reveal X white cards from your hand, Sacrifice CARDNAME: | LifeAmount$ Y | References$ X,Y | SpellDescription$ You gain three times X life. SVar:X:XChoice SVar:Y:SVar$ChosenX/Times.3 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/martyr_of_sands.jpg Oracle:{1}, Reveal X white cards from your hand, Sacrifice Martyr of Sands: You gain three times X life. diff --git a/forge-gui/res/cardsfolder/m/martyr_of_spores.txt b/forge-gui/res/cardsfolder/m/martyr_of_spores.txt index c08542f3855..be6a6e832d6 100644 --- a/forge-gui/res/cardsfolder/m/martyr_of_spores.txt +++ b/forge-gui/res/cardsfolder/m/martyr_of_spores.txt @@ -4,6 +4,6 @@ Types:Creature Human Shaman PT:1/1 A:AB$ Pump | Cost$ 1 Reveal Sac<1/CARDNAME> | CostDesc$ {1}, Reveal X green cards from your hand, Sacrifice CARDNAME: | NumAtt$ ChosenX | NumDef$ ChosenX | References$ X | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Target creature gets +X/+X until end of turn. SVar:X:XChoice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/martyr_of_spores.jpg Oracle:{1}, Reveal X green cards from your hand, Sacrifice Martyr of Spores: Target creature gets +X/+X until end of turn. diff --git a/forge-gui/res/cardsfolder/m/martyred_rusalka.txt b/forge-gui/res/cardsfolder/m/martyred_rusalka.txt index f0cb056d928..ef7494a8c48 100644 --- a/forge-gui/res/cardsfolder/m/martyred_rusalka.txt +++ b/forge-gui/res/cardsfolder/m/martyred_rusalka.txt @@ -3,6 +3,6 @@ ManaCost:W Types:Creature Spirit PT:1/1 A:AB$ Pump | Cost$ W Sac<1/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME can't attack. | SpellDescription$ Target creature can't attack this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/martyred_rusalka.jpg Oracle:{W}, Sacrifice a creature: Target creature can't attack this turn. diff --git a/forge-gui/res/cardsfolder/m/martyrs_cause.txt b/forge-gui/res/cardsfolder/m/martyrs_cause.txt index 1ff0a31fffb..0875865bfc6 100644 --- a/forge-gui/res/cardsfolder/m/martyrs_cause.txt +++ b/forge-gui/res/cardsfolder/m/martyrs_cause.txt @@ -7,7 +7,7 @@ SVar:OutOfSight:Mode$ ChangesZone | TriggerZones$ Command | Origin$ Battlefield SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.ChosenCard,Emblem.ChosenCard | ValidTarget$ Card.IsRemembered,Player.IsRemembered | ReplaceWith$ ExileEffect | PreventionEffect$ True | Description$ The next time the chosen source deals damage to the any target, prevent that damage. SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/martyrs_cause.jpg Oracle:Sacrifice a creature: The next time a source of your choice would deal damage to any target this turn, prevent that damage. diff --git a/forge-gui/res/cardsfolder/m/martyrs_cry.txt b/forge-gui/res/cardsfolder/m/martyrs_cry.txt index c1c2c2ed7bd..8acb6c88ace 100644 --- a/forge-gui/res/cardsfolder/m/martyrs_cry.txt +++ b/forge-gui/res/cardsfolder/m/martyrs_cry.txt @@ -5,6 +5,6 @@ A:SP$ ChangeZoneAll | Cost$ W W | Origin$ Battlefield | Destination$ Exile | Rem SVar:DBRepeat:DB$ RepeatEach | DefinedCards$ DirectRemembered | UseImprinted$ True | RepeatSubAbility$ DBDraw | SubAbility$ DBCleanup SVar:DBDraw:DB$ Draw | Defined$ ImprintedController | NumCards$ 1 SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/martyrs_cry.jpg Oracle:Exile all white creatures. For each creature exiled this way, its controller draws a card. diff --git a/forge-gui/res/cardsfolder/m/martyrs_tomb.txt b/forge-gui/res/cardsfolder/m/martyrs_tomb.txt index ca02dc9e6f8..efb4109058a 100644 --- a/forge-gui/res/cardsfolder/m/martyrs_tomb.txt +++ b/forge-gui/res/cardsfolder/m/martyrs_tomb.txt @@ -2,7 +2,7 @@ Name:Martyrs' Tomb ManaCost:2 W B Types:Enchantment A:AB$ PreventDamage | Cost$ PayLife<2> | ValidTgts$ Creature | Amount$ 1 | TgtPrompt$ Select target creature | SpellDescription$ Prevent the next 1 damage that would be dealt to target creature this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/martyrs_tomb.jpg Oracle:Pay 2 life: Prevent the next 1 damage that would be dealt to target creature this turn. diff --git a/forge-gui/res/cardsfolder/m/mask_of_intolerance.txt b/forge-gui/res/cardsfolder/m/mask_of_intolerance.txt index 7cb185f1acd..dc8fa2adb83 100644 --- a/forge-gui/res/cardsfolder/m/mask_of_intolerance.txt +++ b/forge-gui/res/cardsfolder/m/mask_of_intolerance.txt @@ -4,6 +4,6 @@ Types:Artifact T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield | CheckSVar$ CheckLandTypes | References$ CheckLandTypes | SVarCompare$ GE4 | Execute$ TrigDamage | TriggerDescription$ At the beginning of each player's upkeep, if there are four or more basic land types among lands that player controls, CARDNAME deals 3 damage to them. SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredPlayer | NumDmg$ 3 SVar:CheckLandTypes:Count$DomainActivePlayer -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mask_of_intolerance.jpg Oracle:At the beginning of each player's upkeep, if there are four or more basic land types among lands that player controls, Mask of Intolerance deals 3 damage to them. diff --git a/forge-gui/res/cardsfolder/m/mask_of_the_mimic.txt b/forge-gui/res/cardsfolder/m/mask_of_the_mimic.txt index 038ffe7a6aa..87ad91674ec 100644 --- a/forge-gui/res/cardsfolder/m/mask_of_the_mimic.txt +++ b/forge-gui/res/cardsfolder/m/mask_of_the_mimic.txt @@ -3,6 +3,6 @@ ManaCost:U Types:Instant A:SP$ Pump | Cost$ U Sac<1/Creature> | ValidTgts$ Creature.nonToken | TgtPrompt$ Select target nontoken creature | Static$ True | StackDescription$ None | SubAbility$ DBChangeZone SVar:DBChangeZone:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Targeted.sameName | ChangeNum$ 1 | Hidden$ True | StackDescription$ Search your library for a card with the same name as target nontoken creature and put that card onto the battlefield. | SpellDescription$ As an additional cost to cast CARDNAME, sacrifice a creature. Search your library for a card with the same name as target nontoken creature and put that card onto the battlefield. Then shuffle your library. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mask_of_the_mimic.jpg Oracle:As an additional cost to cast Mask of the Mimic, sacrifice a creature.\nSearch your library for a card with the same name as target nontoken creature and put that card onto the battlefield. Then shuffle your library. diff --git a/forge-gui/res/cardsfolder/m/mass_appeal.txt b/forge-gui/res/cardsfolder/m/mass_appeal.txt index e155d73386e..dc0a9a210ad 100644 --- a/forge-gui/res/cardsfolder/m/mass_appeal.txt +++ b/forge-gui/res/cardsfolder/m/mass_appeal.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Sorcery A:SP$ Draw | Cost$ 2 U | NumCards$ X | References$ X | SpellDescription$ Draw a card for each Human you control. SVar:X:Count$TypeYouCtrl.Human -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mass_appeal.jpg Oracle:Draw a card for each Human you control. diff --git a/forge-gui/res/cardsfolder/m/mass_hysteria.txt b/forge-gui/res/cardsfolder/m/mass_hysteria.txt index 2f807ad8ff2..c8976a546e0 100644 --- a/forge-gui/res/cardsfolder/m/mass_hysteria.txt +++ b/forge-gui/res/cardsfolder/m/mass_hysteria.txt @@ -3,7 +3,7 @@ ManaCost:R Types:Enchantment S:Mode$ Continuous | Affected$ Creature | AddKeyword$ Haste | Description$ All creatures have haste. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:BuffedBy:Creature SVar:AntiBuffedBy:Creature SVar:Picture:http://www.wizards.com/global/images/magic/general/mass_hysteria.jpg diff --git a/forge-gui/res/cardsfolder/m/mass_polymorph.txt b/forge-gui/res/cardsfolder/m/mass_polymorph.txt index 4e514f3bc24..1e5a93d98e9 100644 --- a/forge-gui/res/cardsfolder/m/mass_polymorph.txt +++ b/forge-gui/res/cardsfolder/m/mass_polymorph.txt @@ -6,6 +6,6 @@ SVar:DBMassReveal:DB$ DigUntil | Amount$ MassX | References$ MassX | Valid$ Crea SVar:DBMassCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBMassShuffle SVar:DBMassShuffle:DB$ Shuffle SVar:MassX:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mass_polymorph.jpg Oracle:Exile all creatures you control, then reveal cards from the top of your library until you reveal that many creature cards. Put all creature cards revealed this way onto the battlefield, then shuffle the rest of the revealed cards into your library. diff --git a/forge-gui/res/cardsfolder/m/master_of_etherium.txt b/forge-gui/res/cardsfolder/m/master_of_etherium.txt index 11eb65d97fb..dc2965a0876 100644 --- a/forge-gui/res/cardsfolder/m/master_of_etherium.txt +++ b/forge-gui/res/cardsfolder/m/master_of_etherium.txt @@ -7,7 +7,7 @@ S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ SVar:X:Count$Valid Artifact.YouCtrl SVar:PlayMain1:TRUE SVar:BuffedBy:Artifact -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NoZeroToughnessAI:True SVar:Picture:http://www.wizards.com/global/images/magic/general/master_of_etherium.jpg Oracle:Master of Etherium's power and toughness are each equal to the number of artifacts you control.\nOther artifact creatures you control get +1/+1. diff --git a/forge-gui/res/cardsfolder/m/master_of_the_veil.txt b/forge-gui/res/cardsfolder/m/master_of_the_veil.txt index f2854bf9ffc..066ba7845d4 100644 --- a/forge-gui/res/cardsfolder/m/master_of_the_veil.txt +++ b/forge-gui/res/cardsfolder/m/master_of_the_veil.txt @@ -5,6 +5,6 @@ PT:2/3 K:Morph:2 U T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigSetState | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME is turned face up, you may turn target creature with morph face down. SVar:TrigSetState:DB$SetState | ValidTgts$ Creature.faceUp+withMorph,Creature.faceUp+withMegamorph | TgtPrompt$ Select target creature with morph. | Mode$ TurnFace -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/master_of_the_veil.jpg Oracle:Morph {2}{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.)\nWhen Master of the Veil is turned face up, you may turn target creature with a morph ability face down. diff --git a/forge-gui/res/cardsfolder/m/master_transmuter.txt b/forge-gui/res/cardsfolder/m/master_transmuter.txt index e055245aeab..da1d521fc64 100644 --- a/forge-gui/res/cardsfolder/m/master_transmuter.txt +++ b/forge-gui/res/cardsfolder/m/master_transmuter.txt @@ -3,6 +3,6 @@ ManaCost:3 U Types:Artifact Creature Human Artificer PT:1/2 A:AB$ ChangeZone | Cost$ U T Return<1/Artifact> | Origin$ Hand | Destination$ Battlefield | ChangeType$ Artifact | ChangeNum$ 1 | SpellDescription$ You may put an artifact card from your hand onto the battlefield. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/master_transmuter.jpg Oracle:{U}, {T}, Return an artifact you control to its owner's hand: You may put an artifact card from your hand onto the battlefield. diff --git a/forge-gui/res/cardsfolder/m/master_warcraft.txt b/forge-gui/res/cardsfolder/m/master_warcraft.txt index 39f330372c0..98423566a41 100644 --- a/forge-gui/res/cardsfolder/m/master_warcraft.txt +++ b/forge-gui/res/cardsfolder/m/master_warcraft.txt @@ -2,6 +2,6 @@ Name:Master Warcraft ManaCost:2 RW RW Types:Instant A:SP$ DeclareCombatants | Cost$ 2 RW RW | DeclareAttackers$ True | DeclareBlockers$ True | ActivationPhases$ Upkeep->BeginCombat | Until$ EndOfTurn | SpellDescription$ Cast CARDNAME only before attackers are declared. You choose which creatures attack this turn. You choose which creatures block this turn and how those creatures block. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/master_warcraft.jpg Oracle:Cast Master Warcraft only before attackers are declared.\nYou choose which creatures attack this turn.\nYou choose which creatures block this turn and how those creatures block. diff --git a/forge-gui/res/cardsfolder/m/masticore.txt b/forge-gui/res/cardsfolder/m/masticore.txt index 40706492e1e..f42039800ee 100644 --- a/forge-gui/res/cardsfolder/m/masticore.txt +++ b/forge-gui/res/cardsfolder/m/masticore.txt @@ -5,6 +5,6 @@ PT:4/4 K:UpkeepCost:Discard<1/Card> A:AB$ Regenerate | Cost$ 2 | SpellDescription$ Regenerate CARDNAME. A:AB$ DealDamage | Cost$ 2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/masticore.jpg Oracle:At the beginning of your upkeep, sacrifice Masticore unless you discard a card.\n{2}: Masticore deals 1 damage to target creature.\n{2}: Regenerate Masticore. diff --git a/forge-gui/res/cardsfolder/m/masumaro_first_to_live.txt b/forge-gui/res/cardsfolder/m/masumaro_first_to_live.txt index f5be5c1f48c..77feda06167 100644 --- a/forge-gui/res/cardsfolder/m/masumaro_first_to_live.txt +++ b/forge-gui/res/cardsfolder/m/masumaro_first_to_live.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Spirit PT:*/* S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | References$ X | Description$ CARDNAME's power and toughness are each equal to twice the number of cards in your hand. SVar:X:Count$InYourHand/Times.2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/masumaro_first_to_live.jpg Oracle:Masumaro, First to Live's power and toughness are each equal to twice the number of cards in your hand. diff --git a/forge-gui/res/cardsfolder/m/matca_rioters.txt b/forge-gui/res/cardsfolder/m/matca_rioters.txt index 231a15e3980..7a28d629ec9 100644 --- a/forge-gui/res/cardsfolder/m/matca_rioters.txt +++ b/forge-gui/res/cardsfolder/m/matca_rioters.txt @@ -5,7 +5,7 @@ PT:*/* S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | References$ X | Description$ Domain — CARDNAME's power and toughness are each equal to the number of basic land types among lands you control. SVar:X:Count$Domain SVar:BuffedBy:Plains,Island,Swamp,Mountain,Forest -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NeedsToPlayVar:X GE2 SVar:Picture:http://www.wizards.com/global/images/magic/general/matca_rioters.jpg Oracle:Domain — Matca Rioters's power and toughness are each equal to the number of basic land types among lands you control. diff --git a/forge-gui/res/cardsfolder/m/mausoleum_secrets.txt b/forge-gui/res/cardsfolder/m/mausoleum_secrets.txt index b72535a1309..7b05422fada 100644 --- a/forge-gui/res/cardsfolder/m/mausoleum_secrets.txt +++ b/forge-gui/res/cardsfolder/m/mausoleum_secrets.txt @@ -3,5 +3,5 @@ ManaCost:1 B Types:Instant A:SP$ ChangeZone | Cost$ 1 B | Origin$ Library | Destination$ Hand | ChangeType$ Card.Black+cmcLEX | ChangeNum$ 1 | References$ X | SpellDescription$ Undergrowth - Search your library for a black card with converted mana cost less than or equal to the number of creature cards in your graveyard, reveal it, put it into your hand, then search your library. SVar:X:Count$TypeInYourYard.Creature -SVar:RemRandomDeck:True +AI:RemoveDeck:Random Oracle:Undergrowth — Search your library for a black card with converted mana cost less than or equal to the number of creature cards in your graveyard, reveal it, put it into your hand, then search your library. diff --git a/forge-gui/res/cardsfolder/m/mausoleum_wanderer.txt b/forge-gui/res/cardsfolder/m/mausoleum_wanderer.txt index f32113eecc9..93a9b844b84 100644 --- a/forge-gui/res/cardsfolder/m/mausoleum_wanderer.txt +++ b/forge-gui/res/cardsfolder/m/mausoleum_wanderer.txt @@ -7,7 +7,7 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigPump:DB$Pump | Defined$ Self | NumAtt$ 1 | NumDef$ 1 A:AB$ Counter | Cost$ Sac<1/CARDNAME> | TargetType$ Spell | ValidTgts$ Instant,Sorcery | TgtPrompt$ Select target Instant or Sorcery Spell | UnlessCost$ X | References$ X | SpellDescription$Counter target instant or sorcery spell unless its controller pays {X}, where X is Mausoleum Wanderer's power. SVar:X:Count$CardPower -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:BuffedBy:Spirit DeckHints:Type$Spirit SVar:Picture:http://www.wizards.com/global/images/magic/general/mausoleum_wanderer.jpg diff --git a/forge-gui/res/cardsfolder/m/mayael_the_anima.txt b/forge-gui/res/cardsfolder/m/mayael_the_anima.txt index b0e90d9ac7b..5b549496b56 100644 --- a/forge-gui/res/cardsfolder/m/mayael_the_anima.txt +++ b/forge-gui/res/cardsfolder/m/mayael_the_anima.txt @@ -3,6 +3,6 @@ ManaCost:R G W Types:Legendary Creature Elf Shaman PT:2/3 A:AB$ Dig | Cost$ 3 R G W T | DigNum$ 5 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Creature.powerGE5 | DestinationZone$ Battlefield | SpellDescription$ Look at the top five cards of your library. You may put a creature card with power 5 or greater from among them onto the battlefield. Put the rest on the bottom of your library in any order. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mayael_the_anima.jpg Oracle:{3}{R}{G}{W}, {T}: Look at the top five cards of your library. You may put a creature card with power 5 or greater from among them onto the battlefield. Put the rest on the bottom of your library in any order. diff --git a/forge-gui/res/cardsfolder/m/maze_of_shadows.txt b/forge-gui/res/cardsfolder/m/maze_of_shadows.txt index e53453d2a49..dc4379826d3 100644 --- a/forge-gui/res/cardsfolder/m/maze_of_shadows.txt +++ b/forge-gui/res/cardsfolder/m/maze_of_shadows.txt @@ -4,6 +4,6 @@ Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Pump | Cost$ T | ValidTgts$ Creature.attacking+withShadow | TgtPrompt$ Select target attacking creature with shadow | KW$ Prevent all combat damage that would be dealt to and dealt by CARDNAME. | SubAbility$ DBUntap | SpellDescription$ Untap target attacking creature with shadow. Prevent all combat damage that would be dealt to and dealt by that creature this turn. SVar:DBUntap:DB$Untap | Defined$ Targeted -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/maze_of_shadows.jpg Oracle:{T}: Add {C}.\n{T}: Untap target attacking creature with shadow. Prevent all combat damage that would be dealt to and dealt by that creature this turn. diff --git a/forge-gui/res/cardsfolder/m/mazes_end.txt b/forge-gui/res/cardsfolder/m/mazes_end.txt index 9240d71e5a7..609f13ab3ac 100644 --- a/forge-gui/res/cardsfolder/m/mazes_end.txt +++ b/forge-gui/res/cardsfolder/m/mazes_end.txt @@ -6,6 +6,6 @@ A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ ChangeZone | Cost$ 3 T Return<1/CARDNAME> | ChangeType$ Gate | ChangeNum$ 1 | Origin$ Library | Destination$ Battlefield | SubAbility$ DBWin | SpellDescription$ Search your library for a Gate card, put it onto the battlefield, then shuffle your library. If you control ten or more Gates with different names, you win the game. SVar:DBWin:DB$ WinsGame | Defined$ You | ConditionCheckSVar$ MazeGate | ConditionSVarCompare$ GE10 | References$ MazeGate SVar:MazeGate:Count$DifferentCardNames_Gate.YouCtrl+inZoneBattlefield -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mazes_end.jpg Oracle:Maze's End enters the battlefield tapped.\n{T}: Add {C}.\n{3}, {T}, Return Maze's End to its owner's hand: Search your library for a Gate card, put it onto the battlefield, then shuffle your library. If you control ten or more Gates with different names, you win the game. diff --git a/forge-gui/res/cardsfolder/m/measure_of_wickedness.txt b/forge-gui/res/cardsfolder/m/measure_of_wickedness.txt index 49c1319c7d2..45858194c80 100644 --- a/forge-gui/res/cardsfolder/m/measure_of_wickedness.txt +++ b/forge-gui/res/cardsfolder/m/measure_of_wickedness.txt @@ -7,7 +7,7 @@ SVar:DBLoseLife:DB$ LoseLife | Defined$ You | LifeAmount$ 8 T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Card.nonToken+YouOwn+Other | TriggerZones$ Battlefield | Execute$ TrigGainControl | TriggerDescription$ Whenever another card is put into your graveyard from anywhere, target opponent gains control of CARDNAME. SVar:TrigGainControl:DB$ GainControl | Defined$ Self | ValidTgts$ Opponent | TgtPrompt$ Select target opponent S:Mode$ Continuous | Affected$ Permanent.YouCtrl | AddSVar$ Sac -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Sac:SVar:SacMe:3 SVar:Picture:http://www.wizards.com/global/images/magic/general/measure_of_wickedness.jpg Oracle:At the beginning of your end step, sacrifice Measure of Wickedness and you lose 8 life.\nWhenever another card is put into your graveyard from anywhere, target opponent gains control of Measure of Wickedness. diff --git a/forge-gui/res/cardsfolder/m/meddle.txt b/forge-gui/res/cardsfolder/m/meddle.txt index f25a89ae25d..3b2be67c800 100644 --- a/forge-gui/res/cardsfolder/m/meddle.txt +++ b/forge-gui/res/cardsfolder/m/meddle.txt @@ -2,5 +2,5 @@ Name:Meddle ManaCost:1 U Types:Instant A:SP$ ChangeTargets | Cost$ 1 U | TargetType$ Spell | ValidTgts$ Spell | ConditionTargetValidTargeting$ Creature | ConditionTargetsSingleTarget$ True | TargetRestriction$ Creature.Other | SpellDescription$ If target spell has only one target and that target is a creature, change that spell's target to another creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All Oracle:If target spell has only one target and that target is a creature, change that spell's target to another creature. diff --git a/forge-gui/res/cardsfolder/m/meddling_mage.txt b/forge-gui/res/cardsfolder/m/meddling_mage.txt index a9d21993d4d..ea3dc7c5598 100644 --- a/forge-gui/res/cardsfolder/m/meddling_mage.txt +++ b/forge-gui/res/cardsfolder/m/meddling_mage.txt @@ -5,6 +5,6 @@ PT:2/2 K:ETBReplacement:Other:DBNameCard SVar:DBNameCard:DB$ NameCard | Defined$ You | ValidCards$ Card.nonLand | ValidDesc$ nonland | SpellDescription$ As CARDNAME enters the battlefield, choose a nonland card name. S:Mode$ CantBeCast | ValidCard$ Card.NamedCard | Description$ Spells with the chosen name can't be cast. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/meddling_mage.jpg Oracle:As Meddling Mage enters the battlefield, choose a nonland card name.\nSpells with the chosen name can't be cast. diff --git a/forge-gui/res/cardsfolder/m/medicine_bag.txt b/forge-gui/res/cardsfolder/m/medicine_bag.txt index 4937e6d0eba..4aadbfde978 100644 --- a/forge-gui/res/cardsfolder/m/medicine_bag.txt +++ b/forge-gui/res/cardsfolder/m/medicine_bag.txt @@ -2,6 +2,6 @@ Name:Medicine Bag ManaCost:3 Types:Artifact A:AB$ Regenerate | ValidTgts$ Creature | TgtPrompt$ Select target creature | Cost$ 1 T Discard<1/Card> | SpellDescription$ Regenerate target creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/medicine_bag.jpg Oracle:{1}, {T}, Discard a card: Regenerate target creature. diff --git a/forge-gui/res/cardsfolder/m/meekstone.txt b/forge-gui/res/cardsfolder/m/meekstone.txt index 5d3deba0a6c..3d4c4792696 100644 --- a/forge-gui/res/cardsfolder/m/meekstone.txt +++ b/forge-gui/res/cardsfolder/m/meekstone.txt @@ -3,6 +3,6 @@ ManaCost:1 Types:Artifact S:Mode$ Continuous | Affected$ Creature.powerGE3 | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Creatures with power 3 or greater don't untap during their controllers' untap steps. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/meekstone.jpg Oracle:Creatures with power 3 or greater don't untap during their controllers' untap steps. diff --git a/forge-gui/res/cardsfolder/m/megatherium.txt b/forge-gui/res/cardsfolder/m/megatherium.txt index 69cf7bcb9f3..d83166c2c09 100644 --- a/forge-gui/res/cardsfolder/m/megatherium.txt +++ b/forge-gui/res/cardsfolder/m/megatherium.txt @@ -6,6 +6,6 @@ K:Trample T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME enters the battlefield, sacrifice it unless you pay {1} for each card in your hand. SVar:TrigSac:DB$Sacrifice | Defined$ Self | UnlessCost$ X | UnlessPayer$ You | References$ X SVar:X:Count$InYourHand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/megatherium.jpg Oracle:Trample\nWhen Megatherium enters the battlefield, sacrifice it unless you pay {1} for each card in your hand. diff --git a/forge-gui/res/cardsfolder/m/meishin_the_mind_cage.txt b/forge-gui/res/cardsfolder/m/meishin_the_mind_cage.txt index ba2cbd2447d..9cea4b9a01e 100644 --- a/forge-gui/res/cardsfolder/m/meishin_the_mind_cage.txt +++ b/forge-gui/res/cardsfolder/m/meishin_the_mind_cage.txt @@ -3,6 +3,6 @@ ManaCost:4 U U U Types:Legendary Enchantment S:Mode$ Continuous | Affected$ Creature | AddPower$ -X | References$ X | Description$ All creatures get -X/-0, where X is the number of cards in your hand. SVar:X:Count$InYourHand -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/meishin_the_mind_cage.jpg Oracle:All creatures get -X/-0, where X is the number of cards in your hand. diff --git a/forge-gui/res/cardsfolder/m/melee.txt b/forge-gui/res/cardsfolder/m/melee.txt index b4c428b1ad3..ef13d2ca5f1 100644 --- a/forge-gui/res/cardsfolder/m/melee.txt +++ b/forge-gui/res/cardsfolder/m/melee.txt @@ -8,6 +8,6 @@ SVar:RemoveEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination SVar:TrigAttack:Mode$ AttackerUnblocked | ValidCard$ Creature | Execute$ TrigUntap | TriggerZones$ Command | TriggerDescription$ Whenever a creature attacks and isn't blocked this combat, untap it and remove it from combat. SVar:TrigUntap:DB$ Untap | Defined$ TriggeredAttacker | SubAbility$ RemCombat SVar:RemCombat:DB$ RemoveFromCombat | Defined$ TriggeredAttacker -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/melee.jpg Oracle:Cast Melee only during your turn and only during combat before blockers are declared.\nYou choose which creatures block this combat and how those creatures block.\nWhenever a creature attacks and isn't blocked this combat, untap it and remove it from combat. diff --git a/forge-gui/res/cardsfolder/m/meletis_charlatan.txt b/forge-gui/res/cardsfolder/m/meletis_charlatan.txt index c6204040af9..d7029d6c6c1 100644 --- a/forge-gui/res/cardsfolder/m/meletis_charlatan.txt +++ b/forge-gui/res/cardsfolder/m/meletis_charlatan.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Creature Human Wizard PT:2/3 A:AB$ CopySpellAbility | Cost$ 2 U T | ValidTgts$ Instant,Sorcery | TargetType$ Spell | Controller$ TargetedController | SpellDescription$ The controller of target instant or sorcery spell copies it. That player may choose new targets for the copy. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/meletis_charlatan.jpg Oracle:{2}{U}, {T}: The controller of target instant or sorcery spell copies it. That player may choose new targets for the copy. diff --git a/forge-gui/res/cardsfolder/m/meloku_the_clouded_mirror.txt b/forge-gui/res/cardsfolder/m/meloku_the_clouded_mirror.txt index d3af1117534..a1358ba4bcf 100644 --- a/forge-gui/res/cardsfolder/m/meloku_the_clouded_mirror.txt +++ b/forge-gui/res/cardsfolder/m/meloku_the_clouded_mirror.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Moonfolk Wizard PT:2/4 K:Flying A:AB$ Token | Cost$ 1 Return<1/Land> | TokenAmount$ 1 | TokenName$ Illusion | TokenTypes$ Creature,Illusion | TokenOwner$ You | TokenColors$ Blue | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SpellDescription$ Create a 1/1 blue Illusion creature token with flying. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card75268.jpg Oracle:Flying\n{1}, Return a land you control to its owner's hand: Create a 1/1 blue Illusion creature token with flying. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/m/meltdown.txt b/forge-gui/res/cardsfolder/m/meltdown.txt index f43385d82e8..f9290414d1c 100644 --- a/forge-gui/res/cardsfolder/m/meltdown.txt +++ b/forge-gui/res/cardsfolder/m/meltdown.txt @@ -3,6 +3,6 @@ ManaCost:X R Types:Sorcery A:SP$ DestroyAll | Cost$ X R | ValidCards$ Artifact.cmcLEX | References$ X | SpellDescription$ Destroy each artifact with converted mana cost X or less. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/meltdown.jpg Oracle:Destroy each artifact with converted mana cost X or less. diff --git a/forge-gui/res/cardsfolder/m/melting.txt b/forge-gui/res/cardsfolder/m/melting.txt index ead13b98931..15dd1558f55 100644 --- a/forge-gui/res/cardsfolder/m/melting.txt +++ b/forge-gui/res/cardsfolder/m/melting.txt @@ -3,6 +3,6 @@ ManaCost:3 R Types:Enchantment S:Mode$ Continuous | Affected$ Land | RemoveType$ Snow | Description$ All lands are no longer snow. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/melting.jpg Oracle:All lands are no longer snow. diff --git a/forge-gui/res/cardsfolder/m/memnarch.txt b/forge-gui/res/cardsfolder/m/memnarch.txt index a7c38a84ca3..f24cf4431f3 100644 --- a/forge-gui/res/cardsfolder/m/memnarch.txt +++ b/forge-gui/res/cardsfolder/m/memnarch.txt @@ -4,6 +4,6 @@ Types:Legendary Artifact Creature Wizard PT:4/5 A:AB$ Animate | Cost$ 1 U U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Types$ Artifact | Permanent$ True | SpellDescription$ Target permanent becomes an artifact in addition to its other types. A:AB$ GainControl | Cost$ 3 U | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Gain control of target artifact. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://resources.wizards.com/magic/cards/dst/en-us/card51054.jpg Oracle:{1}{U}{U}: Target permanent becomes an artifact in addition to its other types.\n{3}{U}: Gain control of target artifact. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/m/memoricide.txt b/forge-gui/res/cardsfolder/m/memoricide.txt index 0e7f5754231..3cb63781b32 100644 --- a/forge-gui/res/cardsfolder/m/memoricide.txt +++ b/forge-gui/res/cardsfolder/m/memoricide.txt @@ -8,6 +8,6 @@ SVar:ExileLib:DB$ ChangeZone | Origin$ Library | Destination$ Exile | DefinedPla SVar:NumInLib:TargetedPlayer$CardsInLibrary SVar:NumInHand:TargetedPlayer$CardsInHand SVar:NumInYard:TargetedPlayer$CardsInGraveyard -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/memoricide.jpg Oracle:Choose a nonland card name. Search target player's graveyard, hand, and library for any number of cards with that name and exile them. Then that player shuffles their library. diff --git a/forge-gui/res/cardsfolder/m/memory_crystal.txt b/forge-gui/res/cardsfolder/m/memory_crystal.txt index 4d25305b4dc..482847fae1d 100644 --- a/forge-gui/res/cardsfolder/m/memory_crystal.txt +++ b/forge-gui/res/cardsfolder/m/memory_crystal.txt @@ -2,6 +2,6 @@ Name:Memory Crystal ManaCost:3 Types:Artifact S:Mode$ ReduceCost | ValidCard$ Card | ValidSpell$ Spell.Buyback | Activator$ Player | Amount$ 2 | Description$ Buyback costs cost {2} less. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/memory_crystal.jpg Oracle:Buyback costs cost {2} less. diff --git a/forge-gui/res/cardsfolder/m/memory_jar.txt b/forge-gui/res/cardsfolder/m/memory_jar.txt index 5045a961bf7..ec87f5ad112 100644 --- a/forge-gui/res/cardsfolder/m/memory_jar.txt +++ b/forge-gui/res/cardsfolder/m/memory_jar.txt @@ -7,6 +7,6 @@ SVar:DelayedReturn:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execu SVar:DiscardEach:DB$ Discard | Defined$ Player | Mode$ Hand | SubAbility$ ReturnAll SVar:ReturnAll:DB$ ChangeZone | Origin$ Exile | Destination$ Hand | Defined$ DelayTriggerRemembered SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/memory_jar.jpg Oracle:{T}, Sacrifice Memory Jar: Each player exiles all cards from their hand face down and draws seven cards. At the beginning of the next end step, each player discards their hand and returns to their hand each card they exiled this way. diff --git a/forge-gui/res/cardsfolder/m/memory_plunder.txt b/forge-gui/res/cardsfolder/m/memory_plunder.txt index 3cd944d9ea2..142b4b27497 100644 --- a/forge-gui/res/cardsfolder/m/memory_plunder.txt +++ b/forge-gui/res/cardsfolder/m/memory_plunder.txt @@ -2,6 +2,6 @@ Name:Memory Plunder ManaCost:UB UB UB UB Types:Instant A:SP$ Play | Cost$ UB UB UB UB | TgtZone$ Graveyard | WithoutManaCost$ True | ValidTgts$ Instant.OppOwn,Sorcery.OppOwn | TgtPrompt$ Choose target instant or sorcery card from an opponent's graveyard | Optional$ True | SpellDescription$ You may cast target instant or sorcery card from an opponent's graveyard without paying its mana cost. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/memory_plunder.jpg Oracle:You may cast target instant or sorcery card from an opponent's graveyard without paying its mana cost. diff --git a/forge-gui/res/cardsfolder/m/memorys_journey.txt b/forge-gui/res/cardsfolder/m/memorys_journey.txt index 305d106af7a..c9bac0be89b 100644 --- a/forge-gui/res/cardsfolder/m/memorys_journey.txt +++ b/forge-gui/res/cardsfolder/m/memorys_journey.txt @@ -4,6 +4,6 @@ Types:Instant K:Flashback:G A:SP$ Pump | Cost$ 1 U | ValidTgts$ Player | TgtPrompt$ Select target Player | SubAbility$ DBChangeZone | IsCurse$ True | SpellDescription$ Target player shuffles up to three target cards from their graveyard into their library. SVar:DBChangeZone:DB$ ChangeZone | TargetMin$ 0 | TargetMax$ 3 | TargetsWithDefinedController$ ParentTarget | Origin$ Graveyard | Destination$ Library | Shuffle$ True | TgtPrompt$ Choose target card | ValidTgts$ Card -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/memorys_journey.jpg Oracle:Target player shuffles up to three target cards from their graveyard into their library.\nFlashback {G} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/m/mental_discipline.txt b/forge-gui/res/cardsfolder/m/mental_discipline.txt index 04ea5c95ea5..9b0b334818a 100644 --- a/forge-gui/res/cardsfolder/m/mental_discipline.txt +++ b/forge-gui/res/cardsfolder/m/mental_discipline.txt @@ -2,7 +2,7 @@ Name:Mental Discipline ManaCost:1 U U Types:Enchantment A:AB$ Draw | Cost$ 1 U Discard<1/Card> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/mental_discipline.jpg Oracle:{1}{U}, Discard a card: Draw a card. diff --git a/forge-gui/res/cardsfolder/m/mental_note.txt b/forge-gui/res/cardsfolder/m/mental_note.txt index 5236050aa20..87385048a26 100644 --- a/forge-gui/res/cardsfolder/m/mental_note.txt +++ b/forge-gui/res/cardsfolder/m/mental_note.txt @@ -3,6 +3,6 @@ ManaCost:U Types:Instant A:SP$ Mill | Cost$ U | NumCards$ 2 | Defined$ You | SubAbility$ DBDraw | SpellDescription$ Put the top two cards of your library into your graveyard. Draw a card. SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mental_note.jpg Oracle:Put the top two cards of your library into your graveyard.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/m/mercadian_bazaar.txt b/forge-gui/res/cardsfolder/m/mercadian_bazaar.txt index db318c9b96e..da26bff1f16 100644 --- a/forge-gui/res/cardsfolder/m/mercadian_bazaar.txt +++ b/forge-gui/res/cardsfolder/m/mercadian_bazaar.txt @@ -6,6 +6,6 @@ A:AB$ PutCounter | Cost$ T | Defined$ Self | CounterType$ STORAGE | CounterNum$ A:AB$ Mana | Cost$ T SubCounter | Produced$ R | Amount$ ChosenX | References$ X | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | SpellDescription$ Add {R} for each storage counter removed this way. SVar:X:XChoice #ChosenX SVar created by Cost payment -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mercadian_bazaar.jpg Oracle:Mercadian Bazaar enters the battlefield tapped.\n{T}: Put a storage counter on Mercadian Bazaar.\n{T}, Remove any number of storage counters from Mercadian Bazaar: Add {R} for each storage counter removed this way. diff --git a/forge-gui/res/cardsfolder/m/mercadian_lift.txt b/forge-gui/res/cardsfolder/m/mercadian_lift.txt index 9a58586d633..98f54e90bab 100644 --- a/forge-gui/res/cardsfolder/m/mercadian_lift.txt +++ b/forge-gui/res/cardsfolder/m/mercadian_lift.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ PutCounter | Cost$ 1 T | CounterType$ WINCH | CounterNum$ 1 | SpellDescription$ Put a winch counter on CARDNAME. A:AB$ ChangeZone | Cost$ T SubCounter | ChangeNum$ 1 | ChangeType$ Creature.cmcEQChosenX | Origin$ Hand | Destination$ Battlefield | References$ X | Optional$ True | SpellDescription$ You may put a creature card with converted mana cost X from your hand onto the battlefield. SVar:X:XChoice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mercadian_lift.jpg Oracle:{1}, {T}: Put a winch counter on Mercadian Lift.\n{T}, Remove X winch counters from Mercadian Lift: You may put a creature card with converted mana cost X from your hand onto the battlefield. diff --git a/forge-gui/res/cardsfolder/m/mercadias_downfall.txt b/forge-gui/res/cardsfolder/m/mercadias_downfall.txt index 78c28fd4e19..3e7171bf203 100644 --- a/forge-gui/res/cardsfolder/m/mercadias_downfall.txt +++ b/forge-gui/res/cardsfolder/m/mercadias_downfall.txt @@ -4,7 +4,7 @@ Types:Instant A:SP$ RepeatEach | Cost$ 2 R | RepeatCards$ Creature.attacking | RepeatSubAbility$ DBPump | SpellDescription$ Each attacking creature gets +1/+0 until end of turn for each nonbasic land defending player controls. SVar:DBPump:DB$ Pump | Defined$ Remembered | References$ X | NumAtt$ X SVar:X:Count$Valid Land.nonBasic+DefenderCtrlForRemembered -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mercadias_downfall.jpg Oracle:Each attacking creature gets +1/+0 until end of turn for each nonbasic land defending player controls. diff --git a/forge-gui/res/cardsfolder/m/merchant_scroll.txt b/forge-gui/res/cardsfolder/m/merchant_scroll.txt index 633bf222893..94b4d2728ff 100644 --- a/forge-gui/res/cardsfolder/m/merchant_scroll.txt +++ b/forge-gui/res/cardsfolder/m/merchant_scroll.txt @@ -2,6 +2,6 @@ Name:Merchant Scroll ManaCost:1 U Types:Sorcery A:SP$ ChangeZone | Cost$ 1 U | Origin$ Library | Destination$ Hand | ChangeType$ Instant.Blue | ChangeNum$ 1 | SpellDescription$ Search your library for a blue instant card, reveal that card, and put it into your hand. Then shuffle your library. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/merchant_scroll.jpg Oracle:Search your library for a blue instant card, reveal that card, and put it into your hand. Then shuffle your library. diff --git a/forge-gui/res/cardsfolder/m/merciless_resolve.txt b/forge-gui/res/cardsfolder/m/merciless_resolve.txt index 4071fa621ba..39dec8e5ff3 100644 --- a/forge-gui/res/cardsfolder/m/merciless_resolve.txt +++ b/forge-gui/res/cardsfolder/m/merciless_resolve.txt @@ -2,6 +2,6 @@ Name:Merciless Resolve ManaCost:2 B Types:Instant A:SP$ Draw | Cost$ 2 B Sac<1/Creature;Land/creature or land> | NumCards$ 2 | SpellDescription$ Draw two cards. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/merciless_resolve.jpg Oracle:As an additional cost to cast Merciless Resolve, sacrifice a creature or land.\nDraw two cards. diff --git a/forge-gui/res/cardsfolder/m/merfolk_thaumaturgist.txt b/forge-gui/res/cardsfolder/m/merfolk_thaumaturgist.txt index 433578a1aa9..e1796391531 100644 --- a/forge-gui/res/cardsfolder/m/merfolk_thaumaturgist.txt +++ b/forge-gui/res/cardsfolder/m/merfolk_thaumaturgist.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Creature Merfolk Wizard PT:1/2 A:AB$ Pump | Cost$ T | ValidTgts$ Creature | KW$ HIDDEN CARDNAME's power and toughness are switched | TgtPrompt$ Select target creature. | SpellDescription$ Switch target creature's power and toughness until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/merfolk_thaumaturgist.jpg Oracle:{T}: Switch target creature's power and toughness until end of turn. diff --git a/forge-gui/res/cardsfolder/m/merrow_commerce.txt b/forge-gui/res/cardsfolder/m/merrow_commerce.txt index 46be25756ba..5f6eedea583 100644 --- a/forge-gui/res/cardsfolder/m/merrow_commerce.txt +++ b/forge-gui/res/cardsfolder/m/merrow_commerce.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Tribal Enchantment Merfolk T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ UntapMerfolk | TriggerDescription$ At the beginning of your end step, untap all Merfolk you control. SVar:UntapMerfolk:DB$UntapAll | ValidCards$ Merfolk.YouCtrl | SpellDescription$ Untap all Merfolk you control. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/merrow_commerce.jpg Oracle:At the beginning of your end step, untap all Merfolk you control. diff --git a/forge-gui/res/cardsfolder/m/merrow_grimeblotter.txt b/forge-gui/res/cardsfolder/m/merrow_grimeblotter.txt index 13beb47b43d..997f42ed16b 100644 --- a/forge-gui/res/cardsfolder/m/merrow_grimeblotter.txt +++ b/forge-gui/res/cardsfolder/m/merrow_grimeblotter.txt @@ -3,6 +3,6 @@ ManaCost:3 UB Types:Creature Merfolk Wizard PT:2/2 A:AB$ Pump | Cost$ 1 UB Untap | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -2 | IsCurse$ True | SpellDescription$ Target creature gets -2/-0 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/merrow_grimeblotter.jpg Oracle:{1}{U/B}, {Q}: Target creature gets -2/-0 until end of turn. ({Q} is the untap symbol.) diff --git a/forge-gui/res/cardsfolder/m/merrow_harbinger.txt b/forge-gui/res/cardsfolder/m/merrow_harbinger.txt index 6b5b7c99a7f..f0cd215c64e 100644 --- a/forge-gui/res/cardsfolder/m/merrow_harbinger.txt +++ b/forge-gui/res/cardsfolder/m/merrow_harbinger.txt @@ -5,6 +5,6 @@ PT:2/3 K:Islandwalk T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for a Merfolk card, reveal it, then shuffle your library and put that card on top of it. SVar:TrigChange:DB$ ChangeZone | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Card.Merfolk | ChangeNum$ 1 | ShuffleNonMandatory$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/merrow_harbinger.jpg Oracle:Islandwalk\nWhen Merrow Harbinger enters the battlefield, you may search your library for a Merfolk card, reveal it, then shuffle your library and put that card on top of it. diff --git a/forge-gui/res/cardsfolder/m/merrow_wavebreakers.txt b/forge-gui/res/cardsfolder/m/merrow_wavebreakers.txt index 9d0c899e228..9759d6885c2 100644 --- a/forge-gui/res/cardsfolder/m/merrow_wavebreakers.txt +++ b/forge-gui/res/cardsfolder/m/merrow_wavebreakers.txt @@ -3,6 +3,6 @@ ManaCost:4 U Types:Creature Merfolk Soldier PT:3/3 A:AB$ Pump | Cost$ 1 U Untap | Defined$ Self | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/merrow_wavebreakers.jpg Oracle:{1}{U}, {Q}: Merrow Wavebreakers gains flying until end of turn. ({Q} is the untap symbol.) diff --git a/forge-gui/res/cardsfolder/m/mesa_enchantress.txt b/forge-gui/res/cardsfolder/m/mesa_enchantress.txt index fe460a9712c..256124d176e 100644 --- a/forge-gui/res/cardsfolder/m/mesa_enchantress.txt +++ b/forge-gui/res/cardsfolder/m/mesa_enchantress.txt @@ -4,7 +4,7 @@ Types:Creature Human Druid PT:0/2 T:Mode$ SpellCast | ValidCard$ Enchantment | ValidActivatingPlayer$ You | Execute$ TrigDraw | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever you cast an enchantment spell, you may draw a card. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Enchantment SVar:Picture:http://www.wizards.com/global/images/magic/general/mesa_enchantress.jpg Oracle:Whenever you cast an enchantment spell, you may draw a card. diff --git a/forge-gui/res/cardsfolder/m/mesa_pegasus.txt b/forge-gui/res/cardsfolder/m/mesa_pegasus.txt index a181b898a99..ea734be41c5 100644 --- a/forge-gui/res/cardsfolder/m/mesa_pegasus.txt +++ b/forge-gui/res/cardsfolder/m/mesa_pegasus.txt @@ -4,6 +4,6 @@ Types:Creature Pegasus PT:1/1 K:Flying K:Banding -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mesa_pegasus.jpg Oracle:Flying, banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/m/mesmeric_orb.txt b/forge-gui/res/cardsfolder/m/mesmeric_orb.txt index fbeb92ca654..ec69421a651 100644 --- a/forge-gui/res/cardsfolder/m/mesmeric_orb.txt +++ b/forge-gui/res/cardsfolder/m/mesmeric_orb.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact T:Mode$ Untaps | ValidCard$ Card | TriggerZones$ Battlefield | Execute$ TrigMill | TriggerDescription$ Whenever a permanent becomes untapped, that permanent's controller puts the top card of their library into their graveyard. SVar:TrigMill:DB$ Mill | Defined$ TriggeredCardController | NumCards$ 1 | NoReveal$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mesmeric_orb.jpg Oracle:Whenever a permanent becomes untapped, that permanent's controller puts the top card of their library into their graveyard. diff --git a/forge-gui/res/cardsfolder/m/mesmeric_sliver.txt b/forge-gui/res/cardsfolder/m/mesmeric_sliver.txt index 30bfb939329..4b7a595e9fc 100644 --- a/forge-gui/res/cardsfolder/m/mesmeric_sliver.txt +++ b/forge-gui/res/cardsfolder/m/mesmeric_sliver.txt @@ -7,6 +7,6 @@ SVar:MesmericETB:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | Va SVar:MesmFateseal:DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | AILogic$ Curse | SubAbility$ DBDig SVar:DBDig:DB$ Dig | Defined$ ChosenPlayer | DigNum$ 1 | AnyNumber$ True | DestinationZone$ Library | LibraryPosition$ -1 | LibraryPosition2$ 0 | SubAbility$ DBCleanupChosen SVar:DBCleanupChosen:DB$ Cleanup | ClearChosenPlayer$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mesmeric_sliver.jpg Oracle:All Slivers have "When this permanent enters the battlefield, you may fateseal 1." (To fateseal 1, its controller looks at the top card of an opponent's library, then they may put that card on the bottom of that library.) diff --git a/forge-gui/res/cardsfolder/m/mesmeric_trance.txt b/forge-gui/res/cardsfolder/m/mesmeric_trance.txt index 6468ba023f0..ed5ac39ae5e 100644 --- a/forge-gui/res/cardsfolder/m/mesmeric_trance.txt +++ b/forge-gui/res/cardsfolder/m/mesmeric_trance.txt @@ -3,6 +3,6 @@ ManaCost:1 U U Types:Enchantment K:Cumulative upkeep:1 A:AB$ Draw | Cost$ U Discard<1/Card> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mesmeric_trance.jpg Oracle:Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\n{U}, Discard a card: Draw a card. diff --git a/forge-gui/res/cardsfolder/m/metal_fatigue.txt b/forge-gui/res/cardsfolder/m/metal_fatigue.txt index 27704512050..a7c1da0c5f4 100644 --- a/forge-gui/res/cardsfolder/m/metal_fatigue.txt +++ b/forge-gui/res/cardsfolder/m/metal_fatigue.txt @@ -2,6 +2,6 @@ Name:Metal Fatigue ManaCost:2 W Types:Instant A:SP$ TapAll | Cost$ 2 W | ValidCards$ Artifact | SpellDescription$ Tap all artifacts. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/metal_fatigue.jpg Oracle:Tap all artifacts. diff --git a/forge-gui/res/cardsfolder/m/metalworker.txt b/forge-gui/res/cardsfolder/m/metalworker.txt index c50df02a5a3..bdb6e31389b 100644 --- a/forge-gui/res/cardsfolder/m/metalworker.txt +++ b/forge-gui/res/cardsfolder/m/metalworker.txt @@ -6,7 +6,7 @@ A:AB$ Reveal | Cost$ T | RevealValid$ Card.Artifact+YouCtrl | AnyNumber$ True | SVar:DBMetalWorkerMana:DB$ Mana | Produced$ C | Amount$ MetalWorkerX | References$ MetalWorkerX,X | SubAbility$ DBMetalWorkerCleanup SVar:DBMetalWorkerCleanup:DB$ Cleanup | ClearRemembered$ True SVar:MetalWorkerX:Remembered$Amount.Twice -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/metalworker.jpg Oracle:{T}: Reveal any number of artifact cards in your hand. Add {C}{C} for each card revealed this way. diff --git a/forge-gui/res/cardsfolder/m/metamorphose.txt b/forge-gui/res/cardsfolder/m/metamorphose.txt index 9534a2d2ecf..b1f01e9ae55 100644 --- a/forge-gui/res/cardsfolder/m/metamorphose.txt +++ b/forge-gui/res/cardsfolder/m/metamorphose.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Instant A:SP$ ChangeZone | Cost$ 1 U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SubAbility$ DBChange | SpellDescription$ Put target permanent an opponent controls on top of its owner's library. That opponent may put an artifact, creature, enchantment, or land card from their hand onto the battlefield. SVar:DBChange:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | ChangeType$ Artifact,Creature,Enchantment,Land | DefinedPlayer$ TargetedController | ChangeNum$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/metamorphose.jpg Oracle:Put target permanent an opponent controls on top of its owner's library. That opponent may put an artifact, creature, enchantment, or land card from their hand onto the battlefield. diff --git a/forge-gui/res/cardsfolder/m/metamorphosis.txt b/forge-gui/res/cardsfolder/m/metamorphosis.txt index 7fc5de85f66..27c192256ca 100644 --- a/forge-gui/res/cardsfolder/m/metamorphosis.txt +++ b/forge-gui/res/cardsfolder/m/metamorphosis.txt @@ -3,6 +3,6 @@ ManaCost:G Types:Sorcery A:SP$ Mana | Cost$ G Sac<1/Creature> | Produced$ Any | Amount$ X | References$ X | RestrictValid$ Card.Creature | SpellDescription$ Add X mana of any one color, where X is one plus the sacrificed creature's converted mana cost. Spend this mana only to cast creature spells. SVar:X:Sacrificed$CardManaCost/Plus.1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/metamorphosis.jpg Oracle:As an additional cost to cast Metamorphosis, sacrifice a creature.\nAdd X mana of any one color, where X is one plus the sacrificed creature's converted mana cost. Spend this mana only to cast creature spells. diff --git a/forge-gui/res/cardsfolder/m/metathran_aerostat.txt b/forge-gui/res/cardsfolder/m/metathran_aerostat.txt index 8306aea364e..a8768babc6b 100644 --- a/forge-gui/res/cardsfolder/m/metathran_aerostat.txt +++ b/forge-gui/res/cardsfolder/m/metathran_aerostat.txt @@ -7,6 +7,6 @@ A:AB$ ChangeZone | Cost$ X U | Origin$ Hand | Destination$ Battlefield | ChangeT SVar:DBReturn:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Defined$ Self | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ EQ1 | SubAbility$ Cleanup SVar:X:Count$xPaid SVar:Cleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/metathran_aerostat.jpg Oracle:Flying\n{X}{U}: You may put a creature card with converted mana cost X from your hand onto the battlefield. If you do, return Metathran Aerostat to its owner's hand. diff --git a/forge-gui/res/cardsfolder/m/metathran_transport.txt b/forge-gui/res/cardsfolder/m/metathran_transport.txt index b1c67878a23..ad50eb38ffd 100644 --- a/forge-gui/res/cardsfolder/m/metathran_transport.txt +++ b/forge-gui/res/cardsfolder/m/metathran_transport.txt @@ -5,6 +5,6 @@ PT:1/3 K:Flying K:CantBeBlockedBy Creature.Blue A:AB$ Animate | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Colors$ Blue | OverwriteColors$ True | SpellDescription$ Target creature becomes blue until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/metathran_transport.jpg Oracle:Flying\nMetathran Transport can't be blocked by blue creatures.\n{U}: Target creature becomes blue until end of turn. diff --git a/forge-gui/res/cardsfolder/m/metathran_zombie.txt b/forge-gui/res/cardsfolder/m/metathran_zombie.txt index e9f5be81c6c..5ab48882041 100644 --- a/forge-gui/res/cardsfolder/m/metathran_zombie.txt +++ b/forge-gui/res/cardsfolder/m/metathran_zombie.txt @@ -3,7 +3,7 @@ ManaCost:1 U Types:Creature Metathran Zombie PT:1/1 A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black SVar:Picture:http://www.wizards.com/global/images/magic/general/metathran_zombie.jpg Oracle:{B}: Regenerate Metathran Zombie. diff --git a/forge-gui/res/cardsfolder/m/meteor_crater.txt b/forge-gui/res/cardsfolder/m/meteor_crater.txt index ae90f4df15d..596944aee4c 100644 --- a/forge-gui/res/cardsfolder/m/meteor_crater.txt +++ b/forge-gui/res/cardsfolder/m/meteor_crater.txt @@ -2,6 +2,6 @@ Name:Meteor Crater ManaCost:no cost Types:Land A:AB$ ManaReflected | Cost$ T | ColorOrType$ Color | Valid$ Permanent.YouCtrl | ReflectProperty$ Is | SpellDescription$ Choose a color of a permanent you control. Add one mana of that color. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/meteor_crater.jpg Oracle:{T}: Choose a color of a permanent you control. Add one mana of that color. diff --git a/forge-gui/res/cardsfolder/m/meteor_shower.txt b/forge-gui/res/cardsfolder/m/meteor_shower.txt index 48a28a8f690..eb21bfda14c 100644 --- a/forge-gui/res/cardsfolder/m/meteor_shower.txt +++ b/forge-gui/res/cardsfolder/m/meteor_shower.txt @@ -8,6 +8,6 @@ SVar:MaxTgts:SVar$NumPlayers/Plus.1 SVar:DistroDmg:SVar$X/Plus.1 SVar:X:Count$xPaid #X Will get overwritten by Announce -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/meteor_shower.jpg Oracle:Meteor Shower deals X plus 1 damage divided as you choose among any number of targets. diff --git a/forge-gui/res/cardsfolder/m/meteor_storm.txt b/forge-gui/res/cardsfolder/m/meteor_storm.txt index 59d6ab9c715..60112f6099a 100644 --- a/forge-gui/res/cardsfolder/m/meteor_storm.txt +++ b/forge-gui/res/cardsfolder/m/meteor_storm.txt @@ -2,7 +2,7 @@ Name:Meteor Storm ManaCost:R G Types:Enchantment A:AB$ DealDamage | Cost$ 2 R G Discard<2/Random> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to any target. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/meteor_storm.jpg Oracle:{2}{R}{G}, Discard two cards at random: Meteor Storm deals 4 damage to any target. diff --git a/forge-gui/res/cardsfolder/m/miasmic_mummy.txt b/forge-gui/res/cardsfolder/m/miasmic_mummy.txt index 69a3fa14f3a..d4e3606e00f 100644 --- a/forge-gui/res/cardsfolder/m/miasmic_mummy.txt +++ b/forge-gui/res/cardsfolder/m/miasmic_mummy.txt @@ -4,6 +4,6 @@ Types:Creature Zombie Jackal PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, each player discards a card. SVar:TrigDiscard:DB$ Discard | Defined$ Player | NumCards$ 1 | Mode$ TgtChoose -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/miasmic_mummy.jpg Oracle:When Miasmic Mummy enters the battlefield, each player discards a card. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/m/midnight_banshee.txt b/forge-gui/res/cardsfolder/m/midnight_banshee.txt index 0c788bfbd93..cb900652b61 100644 --- a/forge-gui/res/cardsfolder/m/midnight_banshee.txt +++ b/forge-gui/res/cardsfolder/m/midnight_banshee.txt @@ -5,6 +5,6 @@ PT:5/5 K:Wither T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounterAll | TriggerDescription$ At the beginning of your upkeep, put a -1/-1 counter on each nonblack creature. SVar:TrigPutCounterAll:DB$ PutCounterAll | ValidCards$ Creature.nonBlack | CounterType$ M1M1 | IsCurse$ True | CounterNum$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/midnight_banshee.jpg Oracle:Wither (This deals damage to creatures in the form of -1/-1 counters.)\nAt the beginning of your upkeep, put a -1/-1 counter on each nonblack creature. diff --git a/forge-gui/res/cardsfolder/m/midnight_ritual.txt b/forge-gui/res/cardsfolder/m/midnight_ritual.txt index bfcddee94e3..d3ff1705534 100644 --- a/forge-gui/res/cardsfolder/m/midnight_ritual.txt +++ b/forge-gui/res/cardsfolder/m/midnight_ritual.txt @@ -5,6 +5,6 @@ A:SP$ ChangeZone | Cost$ X 2 B | Origin$ Graveyard | Destination$ Exile | TgtPro SVar:DBToken:DB$ Token | TokenImage$ b 2 2 zombie 10E | TokenName$ Zombie | TokenColors$ Black | TokenTypes$ Creature,Zombie | TokenPower$ 2 | TokenToughness$ 2 | TokenOwner$ You | TokenAmount$ X | References$ X SVar:X:Targeted$Amount SVar:MaxTgts:Count$TypeInYourYard.Creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/midnight_ritual.jpg Oracle:Exile X target creature cards from your graveyard. For each creature card exiled this way, create a 2/2 black Zombie creature token. diff --git a/forge-gui/res/cardsfolder/m/midsummer_revel.txt b/forge-gui/res/cardsfolder/m/midsummer_revel.txt index 86324bc28a8..884f7b1aefd 100644 --- a/forge-gui/res/cardsfolder/m/midsummer_revel.txt +++ b/forge-gui/res/cardsfolder/m/midsummer_revel.txt @@ -4,7 +4,7 @@ Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, you may put a verse counter on CARDNAME. A:AB$ Token | Cost$ G Sac<1/CARDNAME> | TokenImage$ g 3 3 beast | TokenAmount$ X | References$ X | TokenName$ Beast | TokenTypes$ Creature,Beast | TokenOwner$ You | TokenColors$ Green | TokenPower$ 3 | TokenToughness$ 3 | SpellDescription$ Create X 3/3 green Beast creature tokens. SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ VERSE | CounterNum$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:X:Count$CardCounters.VERSE SVar:Picture:http://www.wizards.com/global/images/magic/general/midsummer_revel.jpg Oracle:At the beginning of your upkeep, you may put a verse counter on Midsummer Revel.\n{G}, Sacrifice Midsummer Revel: Create X 3/3 green Beast creature tokens, where X is the number of verse counters on Midsummer Revel. diff --git a/forge-gui/res/cardsfolder/m/might_makes_right.txt b/forge-gui/res/cardsfolder/m/might_makes_right.txt index 5228c347cb6..53ed72461b4 100644 --- a/forge-gui/res/cardsfolder/m/might_makes_right.txt +++ b/forge-gui/res/cardsfolder/m/might_makes_right.txt @@ -6,6 +6,6 @@ SVar:TrigGainControl:DB$ GainControl | ValidTgts$ Creature.OppCtrl | TgtPrompt$ SVar:X:Count$Valid Creature.greatestPower SVar:Y:Count$Valid Creature.greatestPower+YouCtrl SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/might_makes_right.jpg Oracle:At the beginning of combat on your turn, if you control each creature on the battlefield with the greatest power, gain control of target creature an opponent controls until end of turn. Untap that creature. It gains haste until end of turn. (It can attack and {T} this turn.) diff --git a/forge-gui/res/cardsfolder/m/might_of_alara.txt b/forge-gui/res/cardsfolder/m/might_of_alara.txt index 2b246beb497..f88e3b0fbf5 100644 --- a/forge-gui/res/cardsfolder/m/might_of_alara.txt +++ b/forge-gui/res/cardsfolder/m/might_of_alara.txt @@ -3,6 +3,6 @@ ManaCost:G Types:Instant A:SP$ Pump | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | NumDef$ +X | References$ X | SpellDescription$ Domain — Target creature gets +1/+1 until end of turn for each basic land type among lands you control. SVar:X:Count$Domain -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/might_of_alara.jpg Oracle:Domain — Target creature gets +1/+1 until end of turn for each basic land type among lands you control. diff --git a/forge-gui/res/cardsfolder/m/might_of_the_nephilim.txt b/forge-gui/res/cardsfolder/m/might_of_the_nephilim.txt index 21b80041c13..38557105461 100644 --- a/forge-gui/res/cardsfolder/m/might_of_the_nephilim.txt +++ b/forge-gui/res/cardsfolder/m/might_of_the_nephilim.txt @@ -3,6 +3,6 @@ ManaCost:1 G Types:Instant A:SP$ Pump | Cost$ 1 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | NumDef$ +X | References$ X | SpellDescription$ Target creature gets +2/+2 until end of turn for each of its colors. SVar:X:Targeted$CardNumColors/Times.2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/might_of_the_nephilim.jpg Oracle:Target creature gets +2/+2 until end of turn for each of its colors. diff --git a/forge-gui/res/cardsfolder/m/might_weaver.txt b/forge-gui/res/cardsfolder/m/might_weaver.txt index c12fac91822..f91af834ce8 100644 --- a/forge-gui/res/cardsfolder/m/might_weaver.txt +++ b/forge-gui/res/cardsfolder/m/might_weaver.txt @@ -3,7 +3,7 @@ ManaCost:1 G Types:Creature Human Wizard PT:2/1 A:AB$ Pump | Cost$ 2 | ValidTgts$ Creature.Red,Creature.White | KW$ Trample | SpellDescription$ Target red or white creature gains trample until end of turn. | TgtPrompt$ Select target red or white creature. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Color$White|Red SVar:Picture:http://www.wizards.com/global/images/magic/general/might_weaver.jpg Oracle:{2}: Target red or white creature gains trample until end of turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/m/mightstone.txt b/forge-gui/res/cardsfolder/m/mightstone.txt index 75b02efdd1c..d768d7e6e20 100644 --- a/forge-gui/res/cardsfolder/m/mightstone.txt +++ b/forge-gui/res/cardsfolder/m/mightstone.txt @@ -3,6 +3,6 @@ ManaCost:4 Types:Artifact S:Mode$ Continuous | Affected$ Creature.attacking | AddPower$ 1 | Description$ Attacking creatures get +1/+0. SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mightstone.jpg Oracle:Attacking creatures get +1/+0. diff --git a/forge-gui/res/cardsfolder/m/mighty_emergence.txt b/forge-gui/res/cardsfolder/m/mighty_emergence.txt index 136d2675c52..ccec3652023 100644 --- a/forge-gui/res/cardsfolder/m/mighty_emergence.txt +++ b/forge-gui/res/cardsfolder/m/mighty_emergence.txt @@ -3,6 +3,6 @@ ManaCost:2 G Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.powerGE5+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a creature with power 5 or greater enters the battlefield under your control, you may put two +1/+1 counters on it. SVar:TrigPutCounter:DB$PutCounter | Defined$ TriggeredCardLKICopy | CounterType$ P1P1 | CounterNum$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mighty_emergence.jpg Oracle:Whenever a creature with power 5 or greater enters the battlefield under your control, you may put two +1/+1 counters on it. diff --git a/forge-gui/res/cardsfolder/m/mimic_vat.txt b/forge-gui/res/cardsfolder/m/mimic_vat.txt index c0523e568f2..1f2333f8205 100644 --- a/forge-gui/res/cardsfolder/m/mimic_vat.txt +++ b/forge-gui/res/cardsfolder/m/mimic_vat.txt @@ -11,7 +11,7 @@ SVar:DBForget:DB$ Pump | ForgetImprinted$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Card.Self | Destination$ Any | Execute$ DBCleanImprinted | Static$ True SVar:DBCleanImprinted:DB$ Cleanup | ClearImprinted$ True SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True SVar:Picture:http://www.wizards.com/global/images/magic/general/mimic_vat.jpg Oracle:Imprint — Whenever a nontoken creature dies, you may exile that card. If you do, return each other card exiled with Mimic Vat to its owner's graveyard.\n{3}, {T}: Create a token that's a copy of a card exiled with Mimic Vat. It gains haste. Exile it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/m/minamo_school_at_waters_edge.txt b/forge-gui/res/cardsfolder/m/minamo_school_at_waters_edge.txt index d4540f7f7a2..bdf0f0cf9d3 100644 --- a/forge-gui/res/cardsfolder/m/minamo_school_at_waters_edge.txt +++ b/forge-gui/res/cardsfolder/m/minamo_school_at_waters_edge.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Legendary Land A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Untap | Cost$ U T | ValidTgts$ Permanent.Legendary | TgtPrompt$ Select target legendary permanent | SpellDescription$ Untap target legendary permanent. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/minamo_school_at_waters_edge.jpg Oracle:{T}: Add {U}.\n{U}, {T}: Untap target legendary permanent. diff --git a/forge-gui/res/cardsfolder/m/minamo_sightbender.txt b/forge-gui/res/cardsfolder/m/minamo_sightbender.txt index 2b2c59461a1..6558bed1e71 100644 --- a/forge-gui/res/cardsfolder/m/minamo_sightbender.txt +++ b/forge-gui/res/cardsfolder/m/minamo_sightbender.txt @@ -4,6 +4,6 @@ Types:Creature Human Wizard PT:1/2 A:AB$ Pump | Announce$ X | Cost$ X T | KW$ HIDDEN Unblockable | TgtPrompt$ Select target creature with power X or less | ValidTgts$ Creature.powerLEX | References$ X | SpellDescription$ Target creature with power X or less can't be blocked this turn. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/minamo_sightbender.jpg Oracle:{X}, {T}: Target creature with power X or less can't be blocked this turn. diff --git a/forge-gui/res/cardsfolder/m/mind_bend.txt b/forge-gui/res/cardsfolder/m/mind_bend.txt index 11d88585011..ec9ea948105 100644 --- a/forge-gui/res/cardsfolder/m/mind_bend.txt +++ b/forge-gui/res/cardsfolder/m/mind_bend.txt @@ -4,7 +4,7 @@ Types:Instant A:SP$ GenericChoice | Cost$ U | ValidTgts$ Permanent | TgtPrompt$ Choose target permanent | Choices$ ChangeColor,ChangeType | Defined$ You | SpellDescription$ Change the text of target permanent by replacing all instances of one color word with another or one basic land type with another. (For example, you may change "nonblack creature" to "nongreen creature" or "forestwalk" to "islandwalk." This effect lasts indefinitely.) SVar:ChangeColor:DB$ ChangeText | Defined$ ParentTarget | ChangeColorWord$ Choose Choose | Permanent$ True | SpellDescription$ Change color SVar:ChangeType:DB$ ChangeText | Defined$ ParentTarget | ChangeTypeWord$ ChooseBasicLandType ChooseBasicLandType | Permanent$ True | SpellDescription$ Change type -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mind_bend.jpg Oracle:Change the text of target permanent by replacing all instances of one color word with another or one basic land type with another. (For example, you may change "nonblack creature" to "nongreen creature" or "forestwalk" to "islandwalk." This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/m/mind_bomb.txt b/forge-gui/res/cardsfolder/m/mind_bomb.txt index eb4ce086204..d88976dc6fd 100644 --- a/forge-gui/res/cardsfolder/m/mind_bomb.txt +++ b/forge-gui/res/cardsfolder/m/mind_bomb.txt @@ -9,7 +9,7 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$ChosenNumber SVar:Y:Count$RememberedSize/Minus.1 SVar:Z:SVar$Y/NMinus.3 -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mind_bomb.jpg Oracle:Each player may discard up to three cards. Mind Bomb deals damage to each player equal to 3 minus the number of cards they discarded this way. diff --git a/forge-gui/res/cardsfolder/m/mind_extraction.txt b/forge-gui/res/cardsfolder/m/mind_extraction.txt index 9628b2ca547..56015785e60 100644 --- a/forge-gui/res/cardsfolder/m/mind_extraction.txt +++ b/forge-gui/res/cardsfolder/m/mind_extraction.txt @@ -3,6 +3,6 @@ ManaCost:2 B Types:Sorcery A:SP$ Discard | Cost$ 2 B Sac<1/Creature> | RememberCostCards$ True | ValidTgts$ Player | DiscardValid$ Card.SharesColorWith Remembered | Mode$ RevealDiscardAll | SubAbility$ DBCleanup | SpellDescription$ Target player reveals their hand and discards all cards of each of the sacrificed creature's colors. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mind_extraction.jpg Oracle:As an additional cost to cast Mind Extraction, sacrifice a creature.\nTarget player reveals their hand and discards all cards of each of the sacrificed creature's colors. diff --git a/forge-gui/res/cardsfolder/m/mind_games.txt b/forge-gui/res/cardsfolder/m/mind_games.txt index f241b941f68..3d207623c56 100644 --- a/forge-gui/res/cardsfolder/m/mind_games.txt +++ b/forge-gui/res/cardsfolder/m/mind_games.txt @@ -3,6 +3,6 @@ ManaCost:U Types:Instant A:SP$ Tap | Cost$ U | TgtPrompt$ Choose target artifact, creature or land | ValidTgts$ Artifact,Creature,Land | SpellDescription$ Tap target artifact, creature or land. K:Buyback:2 U -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mind_games.jpg Oracle:Buyback {2}{U} (You may pay an additional {2}{U} as you cast this spell. If you do, put this card into your hand as it resolves.)\nTap target artifact, creature, or land. diff --git a/forge-gui/res/cardsfolder/m/mind_harness.txt b/forge-gui/res/cardsfolder/m/mind_harness.txt index 741bbff3e8f..aac59d34e48 100644 --- a/forge-gui/res/cardsfolder/m/mind_harness.txt +++ b/forge-gui/res/cardsfolder/m/mind_harness.txt @@ -5,6 +5,6 @@ K:Enchant red or green creature K:Cumulative upkeep:1 A:SP$ Attach | Cost$ U | ValidTgts$ Creature.Red,Creature.Green | TgtPrompt$ Select target Red or Green Creature | AILogic$ GainControl S:Mode$ Continuous | Affected$ Card.EnchantedBy | GainControl$ You | Description$ You control enchanted creature. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mind_harness.jpg Oracle:Enchant red or green creature\nCumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nYou control enchanted creature. diff --git a/forge-gui/res/cardsfolder/m/mind_maggots.txt b/forge-gui/res/cardsfolder/m/mind_maggots.txt index 829fcbcad5d..6facb2cdfe9 100644 --- a/forge-gui/res/cardsfolder/m/mind_maggots.txt +++ b/forge-gui/res/cardsfolder/m/mind_maggots.txt @@ -12,6 +12,6 @@ SVar:MaxChoice:Count$TypeInYourHand.Creature SVar:ChosenMaggots:Count$ChosenNumber SVar:DiscardedMind:Remembered$Amount SVar:MindMaggotsCount:SVar$DiscardedMind/Times.2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mind_maggots.jpg Oracle:When Mind Maggots enters the battlefield, discard any number of creature cards. For each card discarded this way, put two +1/+1 counters on Mind Maggots. diff --git a/forge-gui/res/cardsfolder/m/mind_over_matter.txt b/forge-gui/res/cardsfolder/m/mind_over_matter.txt index b90127802dc..fd7ea7c7682 100644 --- a/forge-gui/res/cardsfolder/m/mind_over_matter.txt +++ b/forge-gui/res/cardsfolder/m/mind_over_matter.txt @@ -2,8 +2,8 @@ Name:Mind Over Matter ManaCost:2 U U U U Types:Enchantment A:AB$ TapOrUntap | Cost$ Discard<1/Card> | ValidTgts$ Artifact,Creature,Land | TgtPrompt$ Select target artifact, creature, or land | SpellDescription$ You may tap or untap target artifact, creature, or land. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/mind_over_matter.jpg Oracle:Discard a card: You may tap or untap target artifact, creature, or land. diff --git a/forge-gui/res/cardsfolder/m/mind_slash.txt b/forge-gui/res/cardsfolder/m/mind_slash.txt index 0ed3c622050..12edb038db0 100644 --- a/forge-gui/res/cardsfolder/m/mind_slash.txt +++ b/forge-gui/res/cardsfolder/m/mind_slash.txt @@ -2,7 +2,7 @@ Name:Mind Slash ManaCost:1 B B Types:Enchantment A:AB$ Discard | Cost$ B Sac<1/Creature> | ValidTgts$ Opponent | SorcerySpeed$ True | NumCards$ 1 | Mode$ RevealYouChoose | SpellDescription$ Target opponent reveals their hand. You choose a card from it. That player discards that card. Activate this ability only any time you could cast a sorcery. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/mind_slash.jpg Oracle:{B}, Sacrifice a creature: Target opponent reveals their hand. You choose a card from it. That player discards that card. Activate this ability only any time you could cast a sorcery. diff --git a/forge-gui/res/cardsfolder/m/mind_swords.txt b/forge-gui/res/cardsfolder/m/mind_swords.txt index b6a6e736f8c..59bb7a2252c 100644 --- a/forge-gui/res/cardsfolder/m/mind_swords.txt +++ b/forge-gui/res/cardsfolder/m/mind_swords.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ ChangeZone | Cost$ 1 B | Origin$ Hand | Destination$ Exile | ChangeType$ Card | ChangeNum$ 2 | Hidden$ True | Mandatory$ True | SubAbility$ DBExileOpp | SpellDescription$ Each player exiles two cards from their hand. A:SP$ ChangeZone | Cost$ Sac<1/Creature> | IsPresent$ Swamp.YouCtrl | Origin$ Hand | Destination$ Exile | ChangeType$ Card | ChangeNum$ 2 | Hidden$ True | Mandatory$ True | SubAbility$ DBExileOpp | CostDesc$ If you control a Swamp, you may sacrifice a creature | SpellDescription$ rather than pay CARDNAME's mana cost. SVar:DBExileOpp:DB$ ChangeZone | DefinedPlayer$ Opponent | Origin$ Hand | Destination$ Exile | ChangeType$ Card | ChangeNum$ 2 | Mandatory$ True | Hidden$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mind_swords.jpg Oracle:If you control a Swamp, you may sacrifice a creature rather than pay Mind Swords's mana cost.\nEach player exiles two cards from their hand. diff --git a/forge-gui/res/cardsfolder/m/mindblaze.txt b/forge-gui/res/cardsfolder/m/mindblaze.txt index 8ad4ca3f812..bf24a657377 100644 --- a/forge-gui/res/cardsfolder/m/mindblaze.txt +++ b/forge-gui/res/cardsfolder/m/mindblaze.txt @@ -10,7 +10,7 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:TargetedPlayer$CardsInLibrary SVar:Y:Remembered$Valid Card.NamedCard SVar:Z:Number$ChosenNumber -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mindblaze.jpg Oracle:Choose a nonland card name and a number greater than 0. Target player reveals their library. If that library contains exactly the chosen number of cards with the chosen name, Mindblaze deals 8 damage to that player. Then that player shuffles their library. diff --git a/forge-gui/res/cardsfolder/m/mindbreak_trap.txt b/forge-gui/res/cardsfolder/m/mindbreak_trap.txt index 5a4dc7d2c13..555879b29c4 100644 --- a/forge-gui/res/cardsfolder/m/mindbreak_trap.txt +++ b/forge-gui/res/cardsfolder/m/mindbreak_trap.txt @@ -5,6 +5,6 @@ A:SP$ ChangeZone | Cost$ 2 U U | TargetType$ Spell | ValidTgts$ Card | TgtZone$ A:SP$ ChangeZone | Cost$ 0 | CheckSVar$ OppCastThisTurn | SVarCompare$ GE3 | TargetType$ Spell | ValidTgts$ Card | TgtZone$ Stack | Origin$ Stack | Destination$ Exile | TargetMin$ 0 | TargetMax$ MaxTgts | References$ OppCastThisTurn,MaxTgts | Fizzle$ True | SpellDescription$ If an opponent cast three or more spells this turn, you may pay {0} rather than pay CARDNAME's mana cost. SVar:OppCastThisTurn:Count$ThisTurnCast_Card.YouDontCtrl SVar:MaxTgts:Count$SpellsOnStack -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mindbreak_trap.jpg Oracle:If an opponent cast three or more spells this turn, you may pay {0} rather than pay Mindbreak Trap's mana cost.\nExile any number of target spells. diff --git a/forge-gui/res/cardsfolder/m/mindcrank.txt b/forge-gui/res/cardsfolder/m/mindcrank.txt index 28f18e3f243..6b4c57bf604 100644 --- a/forge-gui/res/cardsfolder/m/mindcrank.txt +++ b/forge-gui/res/cardsfolder/m/mindcrank.txt @@ -4,7 +4,7 @@ Types:Artifact T:Mode$ LifeLost | ValidPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigMill | TriggerDescription$ Whenever an opponent loses life, that player puts that many cards from the top of their library into their graveyard. (Damage causes loss of life.) SVar:TrigMill:DB$ Mill | Defined$ TriggeredPlayer | NumCards$ X | References$ X SVar:X:TriggerCount$LifeAmount -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/mindcrank.jpg Oracle:Whenever an opponent loses life, that player puts that many cards from the top of their library into their graveyard. (Damage causes loss of life.) diff --git a/forge-gui/res/cardsfolder/m/mindlash_sliver.txt b/forge-gui/res/cardsfolder/m/mindlash_sliver.txt index 7495103dc5f..ba40c2fc8a1 100644 --- a/forge-gui/res/cardsfolder/m/mindlash_sliver.txt +++ b/forge-gui/res/cardsfolder/m/mindlash_sliver.txt @@ -4,6 +4,6 @@ Types:Creature Sliver PT:1/1 S:Mode$ Continuous | Affected$ Sliver | AddAbility$ Discard | Description$ All Slivers have "{1}, Sacrifice this permanent: Each player discards a card." SVar:Discard:AB$Discard | Cost$ 1 Sac<1/CARDNAME> | Defined$ Player | NumCards$ 1 | Mode$ TgtChoose | SpellDescription$ Each player discards a card. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mindlash_sliver.jpg Oracle:All Slivers have "{1}, Sacrifice this permanent: Each player discards a card." diff --git a/forge-gui/res/cardsfolder/m/mindreaver.txt b/forge-gui/res/cardsfolder/m/mindreaver.txt index 2dffd1dc4be..a235d54d397 100644 --- a/forge-gui/res/cardsfolder/m/mindreaver.txt +++ b/forge-gui/res/cardsfolder/m/mindreaver.txt @@ -9,7 +9,7 @@ T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCar SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | Execute$ TrigCleanup | Static$ True SVar:TrigCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mindreaver.jpg Oracle:Heroic — Whenever you cast a spell that targets Mindreaver, exile the top three cards of target player's library.\n{U}{U}, Sacrifice Mindreaver: Counter target spell with the same name as a card exiled with Mindreaver. diff --git a/forge-gui/res/cardsfolder/m/minds_aglow.txt b/forge-gui/res/cardsfolder/m/minds_aglow.txt index a3a86df4313..e9ee572b853 100644 --- a/forge-gui/res/cardsfolder/m/minds_aglow.txt +++ b/forge-gui/res/cardsfolder/m/minds_aglow.txt @@ -8,6 +8,6 @@ SVar:DBDraw:DB$ Draw | Defined$ Player | NumCards$ JoinForcesAmount | SubAbility SVar:DBReset:DB$ StoreSVar | SVar$ JoinForcesAmount | Type$ Number | Expression$ 0 | References$ JoinForcesAmount SVar:X:Count$ChosenNumber SVar:JoinForcesAmount:Number$0 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/minds_aglow.jpg Oracle:Join forces — Starting with you, each player may pay any amount of mana. Each player draws X cards, where X is the total amount of mana paid this way. diff --git a/forge-gui/res/cardsfolder/m/mindslaver.txt b/forge-gui/res/cardsfolder/m/mindslaver.txt index 10d301c39df..9862eb7b00a 100644 --- a/forge-gui/res/cardsfolder/m/mindslaver.txt +++ b/forge-gui/res/cardsfolder/m/mindslaver.txt @@ -2,6 +2,6 @@ Name:Mindslaver ManaCost:6 Types:Legendary Artifact A:AB$ ControlPlayer | Cost$ 4 T Sac<1/CARDNAME> | ValidTgts$ Player | TgtPrompt$ Select target player | SpellDescription$ You control target player during that player's next turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mindslaver.jpg Oracle:{4}, {T}, Sacrifice Mindslaver: You control target player during that player's next turn. (You see all cards that player could see and make all decisions for the player.) diff --git a/forge-gui/res/cardsfolder/m/mindstorm_crown.txt b/forge-gui/res/cardsfolder/m/mindstorm_crown.txt index ce05c8ff919..b587f3c9eb5 100644 --- a/forge-gui/res/cardsfolder/m/mindstorm_crown.txt +++ b/forge-gui/res/cardsfolder/m/mindstorm_crown.txt @@ -4,6 +4,6 @@ Types:Artifact T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ At the beginning of your upkeep, draw a card if you had no cards in hand at the beginning of this turn. If you had a card in hand, Mindstorm Crown deals 1 damage to you. SVar:TrigDraw:DB$ Draw | Defined$ You.NoCardsInHandAtBeginningOfTurn | NumCards$ 1 | SubAbility$ DBPain SVar:DBPain:DB$ DealDamage | NumDmg$ 1 | Defined$ You.CardsInHandAtBeginningOfTurn -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mindstorm_crown.jpg Oracle:At the beginning of your upkeep, draw a card if you had no cards in hand at the beginning of this turn. If you had a card in hand, Mindstorm Crown deals 1 damage to you. diff --git a/forge-gui/res/cardsfolder/m/minion_of_leshrac.txt b/forge-gui/res/cardsfolder/m/minion_of_leshrac.txt index 72fd5e9d470..271b03483db 100644 --- a/forge-gui/res/cardsfolder/m/minion_of_leshrac.txt +++ b/forge-gui/res/cardsfolder/m/minion_of_leshrac.txt @@ -8,6 +8,6 @@ SVar:TrigDmg:DB$ DealDamage | Defined$ You | NumDmg$ 5 | UnlessCost$ Sac<1/Creat SVar:DBTap:DB$ Tap | Defined$ Self | ConditionPlayerDefined$ Remembered | ConditionPlayerContains$ You | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True A:AB$ Destroy | Cost$ T | ValidTgts$ Land,Creature | TgtPrompt$ Select target creature or land | SpellDescription$ Destroy target creature or land. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/minion_of_leshrac.jpg Oracle:Protection from black\nAt the beginning of your upkeep, Minion of Leshrac deals 5 damage to you unless you sacrifice a creature other than Minion of Leshrac. If Minion of Leshrac deals damage to you this way, tap it.\n{T}: Destroy target creature or land. diff --git a/forge-gui/res/cardsfolder/m/minion_of_the_wastes.txt b/forge-gui/res/cardsfolder/m/minion_of_the_wastes.txt index 3f278265271..e6c12554ebb 100644 --- a/forge-gui/res/cardsfolder/m/minion_of_the_wastes.txt +++ b/forge-gui/res/cardsfolder/m/minion_of_the_wastes.txt @@ -9,6 +9,6 @@ SVar:MoveToPlay:DB$ ChangeZone | Defined$ ReplacedCard | Origin$ All | Destinati S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ LifePaidOnETB | SetToughness$ LifePaidOnETB | References$ LifePaidOnETB | Description$ CARDNAME's power and toughness are each equal to the life paid as it entered the battlefield. SVar:X:XChoice SVar:LifePaidOnETB:Number$0 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/minion_of_the_wastes.jpg Oracle:Trample\nAs Minion of the Wastes enters the battlefield, pay any amount of life.\nMinion of the Wastes's power and toughness are each equal to the life paid as it entered the battlefield. diff --git a/forge-gui/res/cardsfolder/m/minions_murmurs.txt b/forge-gui/res/cardsfolder/m/minions_murmurs.txt index bba98b6dff2..5997ee6e0ae 100644 --- a/forge-gui/res/cardsfolder/m/minions_murmurs.txt +++ b/forge-gui/res/cardsfolder/m/minions_murmurs.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ Draw | Cost$ 2 B B | NumCards$ X | References$ X | SpellDescription$ You draw X cards and you lose X life, where X is the number of creatures you control. | SubAbility$ DB1 SVar:DB1:DB$LoseLife | LifeAmount$ X | References$ X SVar:X:Count$TypeYouCtrl.Creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://resources.wizards.com/magic/cards/fut/en-us/card130316.jpg Oracle:You draw X cards and you lose X life, where X is the number of creatures you control. diff --git a/forge-gui/res/cardsfolder/m/minotaur_tactician.txt b/forge-gui/res/cardsfolder/m/minotaur_tactician.txt index 621ef6a081c..1cb476e577d 100644 --- a/forge-gui/res/cardsfolder/m/minotaur_tactician.txt +++ b/forge-gui/res/cardsfolder/m/minotaur_tactician.txt @@ -8,7 +8,7 @@ S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 1 | AddToughness$ 1 | Check SVar:X:Count$Valid Creature.YouCtrl+White SVar:Y:Count$Valid Creature.YouCtrl+Blue SVar:BuffedBy:Creature.White,Creature.Blue -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Color$White|Blue SVar:Picture:http://www.wizards.com/global/images/magic/general/minotaur_tactician.jpg Oracle:Haste\nMinotaur Tactician gets +1/+1 as long as you control a white creature.\nMinotaur Tactician gets +1/+1 as long as you control a blue creature. diff --git a/forge-gui/res/cardsfolder/m/mirage_mirror.txt b/forge-gui/res/cardsfolder/m/mirage_mirror.txt index 84192493ce0..10e2be239ff 100644 --- a/forge-gui/res/cardsfolder/m/mirage_mirror.txt +++ b/forge-gui/res/cardsfolder/m/mirage_mirror.txt @@ -2,6 +2,6 @@ Name:Mirage Mirror ManaCost:3 Types:Artifact A:AB$ Clone | Cost$ 2 | ValidTgts$ Artifact,Creature,Enchantment,Land | TgtPrompt$ Select target artifact, creature, enchantment, or land. | Duration$ UntilEndOfTurn | SpellDescription$ CARDNAME becomes a copy of target artifact, creature, enchantment, or land until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mirage_mirror.jpg Oracle:{2}: Mirage Mirror becomes a copy of target artifact, creature, enchantment, or land until end of turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/m/mire_kavu.txt b/forge-gui/res/cardsfolder/m/mire_kavu.txt index bc923abde87..95549ceb212 100644 --- a/forge-gui/res/cardsfolder/m/mire_kavu.txt +++ b/forge-gui/res/cardsfolder/m/mire_kavu.txt @@ -4,7 +4,7 @@ Types:Creature Kavu PT:3/2 S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 1 | AddToughness$ 1 | CheckSVar$ X | SVarCompare$ GE1 | References$ X | Description$ CARDNAME gets +1/+1 as long as you control a Swamp. SVar:X:Count$Valid Swamp.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:BuffedBy:Swamp DeckNeeds:Color$Black SVar:Picture:http://www.wizards.com/global/images/magic/general/mire_kavu.jpg diff --git a/forge-gui/res/cardsfolder/m/mire_shade.txt b/forge-gui/res/cardsfolder/m/mire_shade.txt index 8fc2f2b6561..2abc769b342 100644 --- a/forge-gui/res/cardsfolder/m/mire_shade.txt +++ b/forge-gui/res/cardsfolder/m/mire_shade.txt @@ -3,6 +3,6 @@ ManaCost:1 B Types:Creature Shade PT:1/1 A:AB$ PutCounter | Cost$ B Sac<1/Swamp> | CounterType$ P1P1 | CounterNum$ 1 | SorcerySpeed$ True | SpellDescription$ Put a +1/+1 counter on CARDNAME. Activate this ability only any time you could cast a sorcery. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mire_shade.jpg Oracle:{B}, Sacrifice a Swamp: Put a +1/+1 counter on Mire Shade. Activate this ability only any time you could cast a sorcery. diff --git a/forge-gui/res/cardsfolder/m/miren_the_moaning_well.txt b/forge-gui/res/cardsfolder/m/miren_the_moaning_well.txt index 6b17f83a393..f9ce8d8f566 100644 --- a/forge-gui/res/cardsfolder/m/miren_the_moaning_well.txt +++ b/forge-gui/res/cardsfolder/m/miren_the_moaning_well.txt @@ -4,6 +4,6 @@ Types:Legendary Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ GainLife | Cost$ 3 T Sac<1/Creature> | LifeAmount$ X | References$ X | SpellDescription$ You gain life equal to the sacrificed creature's toughness. SVar:X:Sacrificed$CardToughness -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/miren_the_moaning_well.jpg Oracle:{T}: Add {C}.\n{3}, {T}, Sacrifice a creature: You gain life equal to the sacrificed creature's toughness. diff --git a/forge-gui/res/cardsfolder/m/mirozel.txt b/forge-gui/res/cardsfolder/m/mirozel.txt index 68fcf01f841..83da6fb24d8 100644 --- a/forge-gui/res/cardsfolder/m/mirozel.txt +++ b/forge-gui/res/cardsfolder/m/mirozel.txt @@ -5,6 +5,6 @@ PT:2/3 K:Flying T:Mode$ BecomesTarget | ValidTarget$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigChange | TriggerDescription$ When CARDNAME becomes the target of a spell or ability, return CARDNAME to its owner's hand. SVar:TrigChange:DB$ChangeZone | Origin$ Battlefield | Destination$ Hand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mirozel.jpg Oracle:Flying\nWhen Mirozel becomes the target of a spell or ability, return Mirozel to its owner's hand. diff --git a/forge-gui/res/cardsfolder/m/mirri.txt b/forge-gui/res/cardsfolder/m/mirri.txt index 8d48cceac08..ddbf7096e00 100644 --- a/forge-gui/res/cardsfolder/m/mirri.txt +++ b/forge-gui/res/cardsfolder/m/mirri.txt @@ -4,6 +4,6 @@ Types:Vanguard HandLifeModifier:+0/+5 R:Event$ ProduceMana | ActiveZones$ Command | ValidCard$ Land.Basic+YouCtrl | ManaReplacement$ ProduceAny | Description$ If a basic land you control is tapped for mana, it produces mana of a color of your choice instead of any other type. SVar:ProduceAny:C->Any & B->Any & R->Any & G->Any & W->Any & U->Any -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:https://downloads.cardforge.org/images/cards/VAN/Mirri.full.jpg Oracle:Hand +0, life +5\nIf a basic land you control is tapped for mana, it produces mana of a color of your choice instead of any other type. diff --git a/forge-gui/res/cardsfolder/m/mirris_guile.txt b/forge-gui/res/cardsfolder/m/mirris_guile.txt index 851eebf22ec..52505709527 100644 --- a/forge-gui/res/cardsfolder/m/mirris_guile.txt +++ b/forge-gui/res/cardsfolder/m/mirris_guile.txt @@ -3,7 +3,7 @@ ManaCost:G Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigRearrange | TriggerDescription$ At the beginning of your upkeep, you may look at the top three cards of your library, then put them back in any order. SVar:TrigRearrange:DB$RearrangeTopOfLibrary | Defined$ You | NumCards$ 3 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/mirris_guile.jpg Oracle:At the beginning of your upkeep, you may look at the top three cards of your library, then put them back in any order. diff --git a/forge-gui/res/cardsfolder/m/mirror_entity.txt b/forge-gui/res/cardsfolder/m/mirror_entity.txt index 44e0fa23b10..cb3917da4fc 100644 --- a/forge-gui/res/cardsfolder/m/mirror_entity.txt +++ b/forge-gui/res/cardsfolder/m/mirror_entity.txt @@ -5,6 +5,6 @@ PT:1/1 K:Changeling A:AB$ AnimateAll | Cost$ X | Power$ X | Toughness$ X | References$ X | Types$ AllCreatureTypes | ValidCards$ Creature.YouCtrl | SpellDescription$ Until end of turn, creatures you control have base power and toughness X/X and gain all creature types. | StackDescription$ SpellDescription SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mirror_entity.jpg Oracle:Changeling (This card is every creature type.)\n{X}: Until end of turn, creatures you control have base power and toughness X/X and gain all creature types. diff --git a/forge-gui/res/cardsfolder/m/mirror_gallery.txt b/forge-gui/res/cardsfolder/m/mirror_gallery.txt index 24f45509440..6c34e3c03f5 100644 --- a/forge-gui/res/cardsfolder/m/mirror_gallery.txt +++ b/forge-gui/res/cardsfolder/m/mirror_gallery.txt @@ -3,6 +3,6 @@ ManaCost:5 Types:Artifact S:Mode$ Continuous | GlobalRule$ The legend rule doesn't apply. | Description$ The "legend rule" doesn't apply. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mirror_gallery.jpg Oracle:The "legend rule" doesn't apply. diff --git a/forge-gui/res/cardsfolder/m/mirror_of_fate.txt b/forge-gui/res/cardsfolder/m/mirror_of_fate.txt index 4e9b43bba43..3e0aa2a4f61 100644 --- a/forge-gui/res/cardsfolder/m/mirror_of_fate.txt +++ b/forge-gui/res/cardsfolder/m/mirror_of_fate.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ ChooseCard | Cost$ T Sac<1/CARDNAME> | MinAmount$ 0 | Amount$ 7 | Choices$ Card.YouOwn+faceUp | SubAbility$ DBExile | RememberChosen$ True | ChoiceZone$ Exile | SpellDescription$ Choose up to seven face-up exiled cards you own. Exile all the cards from your library, then put the chosen cards on top of your library. SVar:DBExile:DB$ ChangeZoneAll | Origin$ Library | Destination$ Exile | Defined$ You | SubAbility$ DBReturn SVar:DBReturn:DB$ ChangeZoneAll | Origin$ Exile | Destination$ Library | Defined$ You | ChangeType$ Card.IsRemembered -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mirror_of_fate.jpg Oracle:{T}, Sacrifice Mirror of Fate: Choose up to seven face-up exiled cards you own. Exile all the cards from your library, then put the chosen cards on top of your library. diff --git a/forge-gui/res/cardsfolder/m/mirror_of_the_forebears.txt b/forge-gui/res/cardsfolder/m/mirror_of_the_forebears.txt index aebd0089655..fd4d92cf51a 100644 --- a/forge-gui/res/cardsfolder/m/mirror_of_the_forebears.txt +++ b/forge-gui/res/cardsfolder/m/mirror_of_the_forebears.txt @@ -4,6 +4,6 @@ Types:Artifact K:ETBReplacement:Other:ChooseCT SVar:ChooseCT:DB$ ChooseType | Defined$ You | Type$ Creature | AILogic$ MostProminentComputerControls | SpellDescription$ As CARDNAME enters the battlefield, choose a creature type. A:AB$ Clone | Cost$ 1 | ValidTgts$ Creature.ChosenType+YouCtrl | TgtPrompt$ Select target creature you control of the chosen type | Duration$ UntilEndOfTurn | AddTypes$ Artifact | SpellDescription$ Until end of turn, CARDNAME becomes a copy of target creature you control of the chosen type, except it's an artifact in addition to its other types. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mirror_of_the_forebears.jpg Oracle:As Mirror of the Forebears enters the battlefield, choose a creature type.\n{1}: Until end of turn, Mirror of the Forebears becomes a copy of target creature you control of the chosen type, except it's an artifact in addition to its other types. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/m/mirror_strike.txt b/forge-gui/res/cardsfolder/m/mirror_strike.txt index 251b6e045da..a88124e15c6 100644 --- a/forge-gui/res/cardsfolder/m/mirror_strike.txt +++ b/forge-gui/res/cardsfolder/m/mirror_strike.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Effect | Cost$ 3 W | Name$ Mirror Strike Effect | ReplacementEffects$ DamageEvent | SVars$ MirrorStrikeDmg | | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | ValidTgts$ Creature.attacking+unblocked | TgtPrompt$ Select target unblocked creature | IsCurse$ True | SpellDescription$ All combat damage that would be dealt to you this turn by target unblocked creature is dealt to its controller instead. SVar:DamageEvent:Event$ DamageDone | ValidSource$ Creature.IsRemembered | ValidTarget$ You | ReplaceWith$ MirrorStrikeDmg | IsCombat$ True | Description$ All combat damage that would be dealt to you this turn by target unblocked creature is dealt to its controller instead. SVar:MirrorStrikeDmg:DB$ ReplaceEffect | VarName$ Affected | VarValue$ ReplacedSourceController | VarType$ Player -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mirror_strike.jpg Oracle:All combat damage that would be dealt to you this turn by target unblocked creature is dealt to its controller instead. diff --git a/forge-gui/res/cardsfolder/m/mirrorwood_treefolk.txt b/forge-gui/res/cardsfolder/m/mirrorwood_treefolk.txt index 41029740066..b44896282f9 100644 --- a/forge-gui/res/cardsfolder/m/mirrorwood_treefolk.txt +++ b/forge-gui/res/cardsfolder/m/mirrorwood_treefolk.txt @@ -6,6 +6,6 @@ A:AB$ Effect | Cost$ 2 R W | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt SVar:SelflessDamage:Event$ DamageDone | ValidTarget$ Creature.EffectSource | ReplaceWith$ SelflessDmg | DamageTarget$ Remembered | Description$ The next time damage would be dealt to EFFECTSOURCE this turn, that damage is dealt to any target instead. SVar:SelflessDmg:DB$ ReplaceEffect | VarName$ Affected | VarValue$ Remembered | VarType$ GameEntity | SubAbility$ ExileEffect SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile | Static$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mirrorwood_treefolk.jpg Oracle:{2}{R}{W}: The next time damage would be dealt to Mirrorwood Treefolk this turn, that damage is dealt to any target instead. diff --git a/forge-gui/res/cardsfolder/m/mischievous_quanar.txt b/forge-gui/res/cardsfolder/m/mischievous_quanar.txt index 3b1c05c7607..ac3499046b8 100644 --- a/forge-gui/res/cardsfolder/m/mischievous_quanar.txt +++ b/forge-gui/res/cardsfolder/m/mischievous_quanar.txt @@ -6,6 +6,6 @@ K:Morph:1 U U A:AB$ SetState | Cost$ 3 U U | Defined$ Self | Mode$ TurnFace | SpellDescription$ Turn CARDNAME face down. T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigCopy | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME is turned face up, copy target instant or sorcery spell. You may choose new targets for that copy. SVar:TrigCopy:DB$ CopySpellAbility | ValidTgts$ Instant,Sorcery -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mischievous_quanar.jpg Oracle:{3}{U}{U}: Turn Mischievous Quanar face down.\nMorph {1}{U}{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.)\nWhen Mischievous Quanar is turned face up, copy target instant or sorcery spell. You may choose new targets for that copy. diff --git a/forge-gui/res/cardsfolder/m/misdirection.txt b/forge-gui/res/cardsfolder/m/misdirection.txt index 65144c0a90d..81acda228bf 100644 --- a/forge-gui/res/cardsfolder/m/misdirection.txt +++ b/forge-gui/res/cardsfolder/m/misdirection.txt @@ -3,6 +3,6 @@ ManaCost:3 U U Types:Instant SVar:AltCost:Cost$ ExileFromHand<1/Card.Blue> | Description$ You may exile a blue card from your hand rather than pay CARDNAME's mana cost. A:SP$ ChangeTargets | Cost$ 3 U U | TargetType$ Spell | ValidTgts$ Card | TargetsSingleTarget$ True | SpellDescription$ Change the target of target spell with a single target. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/misdirection.jpg Oracle:You may exile a blue card from your hand rather than pay Misdirection's mana cost.\nChange the target of target spell with a single target. diff --git a/forge-gui/res/cardsfolder/m/mishras_bauble.txt b/forge-gui/res/cardsfolder/m/mishras_bauble.txt index 96f364eaca4..231b6494cc9 100644 --- a/forge-gui/res/cardsfolder/m/mishras_bauble.txt +++ b/forge-gui/res/cardsfolder/m/mishras_bauble.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ Dig | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Player | TgtPrompt$ Select target player | DigNum$ 1 | NoMove$ True | SubAbility$ DelTrigSlowtrip | SpellDescription$ Look at the top card of target player's library. SVar:DelTrigSlowtrip:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ DrawSlowtrip | StackDescription$ SpellDescription | SpellDescription$ Draw a card at the beginning of the next turn's upkeep. SVar:DrawSlowtrip:DB$Draw | NumCards$ 1 | Defined$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mishras_bauble.jpg Oracle:{T}, Sacrifice Mishra's Bauble: Look at the top card of target player's library. Draw a card at the beginning of the next turn's upkeep. diff --git a/forge-gui/res/cardsfolder/m/mishras_helix.txt b/forge-gui/res/cardsfolder/m/mishras_helix.txt index 3814729afc8..f0c2b66125b 100644 --- a/forge-gui/res/cardsfolder/m/mishras_helix.txt +++ b/forge-gui/res/cardsfolder/m/mishras_helix.txt @@ -5,6 +5,6 @@ A:AB$ Tap | Cost$ X T | TargetMin$ 0 | TargetMax$ MaxTgts | References$ X,MaxTgt # It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) SVar:X:Targeted$Amount SVar:MaxTgts:Count$Valid Land -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mishras_helix.jpg Oracle:{X}, {T}: Tap X target lands. diff --git a/forge-gui/res/cardsfolder/m/mishras_workshop.txt b/forge-gui/res/cardsfolder/m/mishras_workshop.txt index 4c72005248c..8f527de6668 100644 --- a/forge-gui/res/cardsfolder/m/mishras_workshop.txt +++ b/forge-gui/res/cardsfolder/m/mishras_workshop.txt @@ -2,6 +2,6 @@ Name:Mishra's Workshop ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | Amount$ 3 | RestrictValid$ Artifact | SpellDescription$ Add {C}{C}{C}. Spend this mana only to cast artifact spells. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mishras_workshop.jpg Oracle:{T}: Add {C}{C}{C}. Spend this mana only to cast artifact spells. diff --git a/forge-gui/res/cardsfolder/m/misinformation.txt b/forge-gui/res/cardsfolder/m/misinformation.txt index 78063a61a9a..99f267d43fc 100644 --- a/forge-gui/res/cardsfolder/m/misinformation.txt +++ b/forge-gui/res/cardsfolder/m/misinformation.txt @@ -2,6 +2,6 @@ Name:Misinformation ManaCost:B Types:Instant A:SP$ ChangeZone | Cost$ B | Origin$ Graveyard | Destination$ Library | LibraryPosition$ 0 | TgtPrompt$ Choose target card in opponent's graveyard | ValidTgts$ Card.OppOwn | TargetMin$ 0 | TargetMax$ 3 | SpellDescription$ Put up to three target cards from an opponent's graveyard on top of their library in any order. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/misinformation.jpg Oracle:Put up to three target cards from an opponent's graveyard on top of their library in any order. diff --git a/forge-gui/res/cardsfolder/m/mission_briefing.txt b/forge-gui/res/cardsfolder/m/mission_briefing.txt index 3fc8640f76e..d75e550cca6 100644 --- a/forge-gui/res/cardsfolder/m/mission_briefing.txt +++ b/forge-gui/res/cardsfolder/m/mission_briefing.txt @@ -8,7 +8,7 @@ SVar:Play:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Car SVar:ReplaceGraveyard:Event$ Moved | ValidCard$ Card.IsRemembered | Origin$ Stack | Destination$ Graveyard | ReplaceWith$ MoveExile | Description$ If that card would be put into your graveyard this turn, exile it instead. SVar:MoveExile:DB$ ChangeZone | Defined$ ReplacedCard | Origin$ Stack | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHas:Ability$Surveil & Ability$Graveyard SVar:Picture:http://www.wizards.com/global/images/magic/general/mission_briefing.jpg Oracle:Surveil 2, then choose an instant or sorcery card in your graveyard. You may cast that card this turn. If that card would be put into your graveyard this turn, exile it instead. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/m/mist_of_stagnation.txt b/forge-gui/res/cardsfolder/m/mist_of_stagnation.txt index 1df5d8e4db7..b5eb5adab5b 100644 --- a/forge-gui/res/cardsfolder/m/mist_of_stagnation.txt +++ b/forge-gui/res/cardsfolder/m/mist_of_stagnation.txt @@ -7,7 +7,7 @@ SVar:TrigChoose:DB$ ChooseCard | Defined$ TriggeredPlayer | Amount$ X | Referenc SVar:DBUntap:DB$ UntapAll | ValidCards$ Permanent.IsRemembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$ValidGraveyard Card.ActivePlayerCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/mist_of_stagnation.jpg Oracle:Permanents don't untap during their controllers' untap steps.\nAt the beginning of each player's upkeep, that player chooses a permanent for each card in their graveyard, then untaps those permanents. diff --git a/forge-gui/res/cardsfolder/m/mistbind_clique.txt b/forge-gui/res/cardsfolder/m/mistbind_clique.txt index 0f6900ff0e0..01339bde834 100644 --- a/forge-gui/res/cardsfolder/m/mistbind_clique.txt +++ b/forge-gui/res/cardsfolder/m/mistbind_clique.txt @@ -7,6 +7,6 @@ K:Flying K:Champion:Faerie T:Mode$ Championed | ValidCard$ Faerie | ValidSource$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigTapAll | TriggerDescription$ When a Faerie is championed with CARDNAME, tap all lands target player controls. SVar:TrigTapAll:DB$ TapAll | ValidTgts$ Player | TgtPrompt$ Select target player | ValidCards$ Land -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mistbind_clique.jpg Oracle:Flash\nFlying\nChampion a Faerie (When this enters the battlefield, sacrifice it unless you exile another Faerie you control. When this leaves the battlefield, that card returns to the battlefield.)\nWhen a Faerie is championed with Mistbind Clique, tap all lands target player controls. diff --git a/forge-gui/res/cardsfolder/m/mistform_dreamer.txt b/forge-gui/res/cardsfolder/m/mistform_dreamer.txt index 02edcfb1abb..f85a86fb1fc 100644 --- a/forge-gui/res/cardsfolder/m/mistform_dreamer.txt +++ b/forge-gui/res/cardsfolder/m/mistform_dreamer.txt @@ -5,6 +5,6 @@ PT:2/1 K:Flying A:AB$ ChooseType | Cost$ 1 | Defined$ You | Type$ Creature | SubAbility$ DBAnimate | SpellDescription$ CARDNAME becomes the creature type of your choice until end of turn. SVar:DBAnimate:DB$ Animate | Types$ ChosenType | RemoveCreatureTypes$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mistform_dreamer.jpg Oracle:Flying\n{1}: Mistform Dreamer becomes the creature type of your choice until end of turn. diff --git a/forge-gui/res/cardsfolder/m/mistform_mask.txt b/forge-gui/res/cardsfolder/m/mistform_mask.txt index d40c5ab40e2..bc2012a968f 100644 --- a/forge-gui/res/cardsfolder/m/mistform_mask.txt +++ b/forge-gui/res/cardsfolder/m/mistform_mask.txt @@ -6,7 +6,7 @@ A:SP$ Attach | Cost$ 1 U | ValidTgts$ Creature | AILogic$ Pump A:AB$ ChooseType | Cost$ 1 | Type$ Creature | AILogic$ MostProminentComputerControls | SubAbility$ DBAnimate | SpellDescription$ Enchanted creature becomes the creature type of your choice until end of turn. SVar:DBAnimate:DB$ Animate | Defined$ Enchanted | Types$ ChosenType | RemoveCreatureTypes$ True SVar:NonStackingAttachEffect:True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mistform_mask.jpg Oracle:Enchant creature\n{1}: Enchanted creature becomes the creature type of your choice until end of turn. diff --git a/forge-gui/res/cardsfolder/m/mistform_mutant.txt b/forge-gui/res/cardsfolder/m/mistform_mutant.txt index 84206173cfa..045e0b48b83 100644 --- a/forge-gui/res/cardsfolder/m/mistform_mutant.txt +++ b/forge-gui/res/cardsfolder/m/mistform_mutant.txt @@ -4,6 +4,6 @@ Types:Creature Illusion Mutant PT:3/4 A:AB$ ChooseType | Cost$ 1 U | Defined$ You | Type$ Creature | InvalidTypes$ Wall | SubAbility$ DBAnimate | SpellDescription$ Choose a creature type other than Wall. Target creature becomes that type until end of turn. SVar:DBAnimate:DB$ Animate | ValidTgts$ Creature | TgtPrompt$ Select target creature | Types$ ChosenType | RemoveCreatureTypes$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mistform_mutant.jpg Oracle:{1}{U}: Choose a creature type other than Wall. Target creature becomes that type until end of turn. diff --git a/forge-gui/res/cardsfolder/m/mistform_seaswift.txt b/forge-gui/res/cardsfolder/m/mistform_seaswift.txt index 983540f6aa7..15062c814e6 100644 --- a/forge-gui/res/cardsfolder/m/mistform_seaswift.txt +++ b/forge-gui/res/cardsfolder/m/mistform_seaswift.txt @@ -6,6 +6,6 @@ K:Flying A:AB$ ChooseType | Cost$ 1 | Defined$ You | Type$ Creature | SubAbility$ DBAnimate | SpellDescription$ CARDNAME becomes the creature type of your choice until end of turn. SVar:DBAnimate:DB$ Animate | Types$ ChosenType | RemoveCreatureTypes$ True K:Morph:1 U -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mistform_seaswift.jpg Oracle:Flying\n{1}: Mistform Seaswift becomes the creature type of your choice until end of turn.\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.) diff --git a/forge-gui/res/cardsfolder/m/mistform_shrieker.txt b/forge-gui/res/cardsfolder/m/mistform_shrieker.txt index e5c284fb1b7..662918d8d44 100644 --- a/forge-gui/res/cardsfolder/m/mistform_shrieker.txt +++ b/forge-gui/res/cardsfolder/m/mistform_shrieker.txt @@ -6,6 +6,6 @@ K:Flying A:AB$ ChooseType | Cost$ 1 | Defined$ You | Type$ Creature | SubAbility$ DBAnimate | SpellDescription$ CARDNAME becomes the creature type of your choice until end of turn. SVar:DBAnimate:DB$ Animate | Types$ ChosenType | RemoveCreatureTypes$ True K:Morph:3 U U -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mistform_shrieker.jpg Oracle:Flying\n{1}: Mistform Shrieker becomes the creature type of your choice until end of turn.\nMorph {3}{U}{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.) diff --git a/forge-gui/res/cardsfolder/m/mistform_skyreaver.txt b/forge-gui/res/cardsfolder/m/mistform_skyreaver.txt index 72bfa22c64c..abed3fbbc8b 100644 --- a/forge-gui/res/cardsfolder/m/mistform_skyreaver.txt +++ b/forge-gui/res/cardsfolder/m/mistform_skyreaver.txt @@ -5,6 +5,6 @@ PT:6/6 K:Flying A:AB$ ChooseType | Cost$ 1 | Defined$ You | Type$ Creature | SubAbility$ DBAnimate | SpellDescription$ CARDNAME becomes the creature type of your choice until end of turn. SVar:DBAnimate:DB$ Animate | Types$ ChosenType | RemoveCreatureTypes$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mistform_skyreaver.jpg Oracle:Flying\n{1}: Mistform Skyreaver becomes the creature type of your choice until end of turn. diff --git a/forge-gui/res/cardsfolder/m/mistform_sliver.txt b/forge-gui/res/cardsfolder/m/mistform_sliver.txt index 72a4faf3249..0fd8f0eff60 100644 --- a/forge-gui/res/cardsfolder/m/mistform_sliver.txt +++ b/forge-gui/res/cardsfolder/m/mistform_sliver.txt @@ -5,6 +5,6 @@ PT:1/1 S:Mode$ Continuous | Affected$ Sliver | AddAbility$ ABChooseType | AddSVar$ DBAnimate | Description$ All Slivers have "{1}: This permanent becomes the creature type of your choice in addition to its other types until end of turn." SVar:ABChooseType:AB$ ChooseType | Cost$ 1 | Type$ Creature | SubAbility$ DBAnimate | SpellDescription$ This permanent becomes the creature type of your choice in addition to its other types until end of turn. SVar:DBAnimate:DB$ Animate | Types$ ChosenType -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mistform_sliver.jpg Oracle:All Slivers have "{1}: This permanent becomes the creature type of your choice in addition to its other types until end of turn." diff --git a/forge-gui/res/cardsfolder/m/mistform_stalker.txt b/forge-gui/res/cardsfolder/m/mistform_stalker.txt index a8767180ee5..e05faf74b2c 100644 --- a/forge-gui/res/cardsfolder/m/mistform_stalker.txt +++ b/forge-gui/res/cardsfolder/m/mistform_stalker.txt @@ -5,6 +5,6 @@ PT:1/1 A:AB$ ChooseType | Cost$ 1 | Defined$ You | Type$ Creature | SubAbility$ DBAnimate | SpellDescription$ CARDNAME becomes the creature type of your choice until end of turn. SVar:DBAnimate:DB$ Animate | Types$ ChosenType | RemoveCreatureTypes$ True A:AB$ Pump | Cost$ 2 U U | Defined$ Self | NumAtt$ +2 | NumDef$ +2 | KW$ Flying | SpellDescription$ CARDNAME gets +2/+2 and gains flying until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mistform_stalker.jpg Oracle:{1}: Mistform Stalker becomes the creature type of your choice until end of turn.\n{2}{U}{U}: Mistform Stalker gets +2/+2 and gains flying until end of turn. diff --git a/forge-gui/res/cardsfolder/m/mistform_wakecaster.txt b/forge-gui/res/cardsfolder/m/mistform_wakecaster.txt index c0ca68e0513..c87fed72a00 100644 --- a/forge-gui/res/cardsfolder/m/mistform_wakecaster.txt +++ b/forge-gui/res/cardsfolder/m/mistform_wakecaster.txt @@ -7,6 +7,6 @@ A:AB$ ChooseType | Cost$ 1 | Type$ Creature | Defined$ You | SubAbility$ DBAnima SVar:DBAnimate:DB$ Animate | Types$ ChosenType | RemoveCreatureTypes$ True A:AB$ ChooseType | Cost$ 2 U U T | Type$ Creature | Defined$ You | SubAbility$ DBAnimateAll | SpellDescription$ Choose a creature type. Each creature you control becomes that type until end of turn. SVar:DBAnimateAll:DB$ AnimateAll | ValidCards$ Creature.YouCtrl | Types$ ChosenType | RemoveCreatureTypes$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mistform_wakecaster.jpg Oracle:Flying\n{1}: Mistform Wakecaster becomes the creature type of your choice until end of turn.\n{2}{U}{U}, {T}: Choose a creature type. Each creature you control becomes that type until end of turn. diff --git a/forge-gui/res/cardsfolder/m/mistform_wall.txt b/forge-gui/res/cardsfolder/m/mistform_wall.txt index ef4e9369bf7..83407f925fc 100644 --- a/forge-gui/res/cardsfolder/m/mistform_wall.txt +++ b/forge-gui/res/cardsfolder/m/mistform_wall.txt @@ -5,6 +5,6 @@ PT:1/4 S:Mode$ Continuous | Affected$ Card.Self+Wall | AddKeyword$ Defender | Description$ CARDNAME has defender as long as it's a Wall. A:AB$ ChooseType | Cost$ 1 | Type$ Creature | AILogic$ MostProminentComputerControls | SubAbility$ DBAnimate | SpellDescription$ CARDNAME becomes the creature type of your choice until end of turn. SVar:DBAnimate:DB$ Animate | Types$ ChosenType | RemoveCreatureTypes$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mistform_wall.jpg Oracle:Mistform Wall has defender as long as it's a Wall.\n{1}: Mistform Wall becomes the creature type of your choice until end of turn. diff --git a/forge-gui/res/cardsfolder/m/mistform_warchief.txt b/forge-gui/res/cardsfolder/m/mistform_warchief.txt index fc779ed9de8..4edbb912784 100644 --- a/forge-gui/res/cardsfolder/m/mistform_warchief.txt +++ b/forge-gui/res/cardsfolder/m/mistform_warchief.txt @@ -5,6 +5,6 @@ PT:1/3 S:Mode$ ReduceCost | ValidCard$ Creature.sharesCreatureTypeWith | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Creature spells you cast that share a creature type with CARDNAME cost {1} less to cast. A:AB$ ChooseType | Cost$ T | Defined$ You | Type$ Creature | SubAbility$ DBAnimate | SpellDescription$ CARDNAME becomes the creature type of your choice until end of turn. SVar:DBAnimate:DB$ Animate | Types$ ChosenType | RemoveCreatureTypes$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mistform_warchief.jpg Oracle:Creature spells you cast that share a creature type with Mistform Warchief cost {1} less to cast.\n{T}: Mistform Warchief becomes the creature type of your choice until end of turn. diff --git a/forge-gui/res/cardsfolder/m/mitotic_manipulation.txt b/forge-gui/res/cardsfolder/m/mitotic_manipulation.txt index 479bae7f17d..08f2b490976 100644 --- a/forge-gui/res/cardsfolder/m/mitotic_manipulation.txt +++ b/forge-gui/res/cardsfolder/m/mitotic_manipulation.txt @@ -2,6 +2,6 @@ Name:Mitotic Manipulation ManaCost:1 U U Types:Sorcery A:SP$ Dig | Cost$ 1 U U | DigNum$ 7 | ChangeValid$ Permanent | ChangeNum$ 1 | Optional$ True | Mitosis$ True | DestinationZone$ Battlefield | SpellDescription$ Look at the top seven cards of your library. You may put one of those cards onto the battlefield if it has the same name as a permanent. Put the rest on the bottom of your library in any order. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mitotic_manipulation.jpg Oracle:Look at the top seven cards of your library. You may put one of those cards onto the battlefield if it has the same name as a permanent. Put the rest on the bottom of your library in any order. diff --git a/forge-gui/res/cardsfolder/m/mizzium_transreliquat.txt b/forge-gui/res/cardsfolder/m/mizzium_transreliquat.txt index 6799f7d0476..e86074aa2b9 100644 --- a/forge-gui/res/cardsfolder/m/mizzium_transreliquat.txt +++ b/forge-gui/res/cardsfolder/m/mizzium_transreliquat.txt @@ -3,6 +3,6 @@ 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. | GainThisAbility$ True | SpellDescription$ CARDNAME becomes a copy of target artifact and gains this ability. -SVar:RemAIDeck:True +AI:RemoveDeck:All 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. diff --git a/forge-gui/res/cardsfolder/m/mizzixs_mastery.txt b/forge-gui/res/cardsfolder/m/mizzixs_mastery.txt index 47a6ace2276..8ce944d5daf 100644 --- a/forge-gui/res/cardsfolder/m/mizzixs_mastery.txt +++ b/forge-gui/res/cardsfolder/m/mizzixs_mastery.txt @@ -6,6 +6,6 @@ A:SP$ ChangeZoneAll | Cost$ 5 R R R | NonBasicSpell$ True | Origin$ Graveyard | SVar:DBPlay:DB$ Play | Valid$ Card.IsRemembered | ValidZone$ Exile | Controller$ You | CopyCard$ True | CopyOnce$ True | WithoutManaCost$ True | Optional$ True | Amount$ All | SubAbility$ ExileMe SVar:ExileMe:DB$ ChangeZoneAll | Origin$ Stack | Destination$ Exile | ChangeType$ Card.Self | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mizzixs_mastery.jpg Oracle:Exile target card that's an instant or sorcery from your graveyard. For each card exiled this way, copy it, and you may cast the copy without paying its mana cost. Exile Mizzix's Mastery.\nOverload {5}{R}{R}{R} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") diff --git a/forge-gui/res/cardsfolder/m/mnemonic_nexus.txt b/forge-gui/res/cardsfolder/m/mnemonic_nexus.txt index b9f6d8c9967..47f3ec12e7a 100644 --- a/forge-gui/res/cardsfolder/m/mnemonic_nexus.txt +++ b/forge-gui/res/cardsfolder/m/mnemonic_nexus.txt @@ -2,6 +2,6 @@ Name:Mnemonic Nexus ManaCost:3 U Types:Instant A:SP$ ChangeZoneAll | Cost$ 3 U | Defined$ Player | ChangeType$ Card | Origin$ Graveyard | Destination$ Library | Shuffle$ True | SpellDescription$ Each player shuffles their graveyard into their library. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mnemonic_nexus.jpg Oracle:Each player shuffles their graveyard into their library. diff --git a/forge-gui/res/cardsfolder/m/moat.txt b/forge-gui/res/cardsfolder/m/moat.txt index 7f45df80056..aa110cfbe6c 100644 --- a/forge-gui/res/cardsfolder/m/moat.txt +++ b/forge-gui/res/cardsfolder/m/moat.txt @@ -2,6 +2,6 @@ Name:Moat ManaCost:2 W W Types:Enchantment S:Mode$ Continuous | Affected$ Creature.withoutFlying | AddHiddenKeyword$ CARDNAME can't attack. | Description$ Creatures without flying can't attack. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/moat.jpg Oracle:Creatures without flying can't attack. diff --git a/forge-gui/res/cardsfolder/m/mogg_cannon.txt b/forge-gui/res/cardsfolder/m/mogg_cannon.txt index 17768f070eb..b51b8cec5c1 100644 --- a/forge-gui/res/cardsfolder/m/mogg_cannon.txt +++ b/forge-gui/res/cardsfolder/m/mogg_cannon.txt @@ -2,6 +2,6 @@ Name:Mogg Cannon ManaCost:2 Types:Artifact A:AB$ Pump | Cost$ T | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | NumAtt$ +1 | NumDef$ +0 | KW$ Flying | AtEOT$ Destroy | SpellDescription$ Target creature you control gets +1/+0 and gains flying until end of turn. Destroy that creature at the beginning of the next end step. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mogg_cannon.jpg Oracle:{T}: Target creature you control gets +1/+0 and gains flying until end of turn. Destroy that creature at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/m/mogg_raider.txt b/forge-gui/res/cardsfolder/m/mogg_raider.txt index fca9ff6584a..08161b3996d 100644 --- a/forge-gui/res/cardsfolder/m/mogg_raider.txt +++ b/forge-gui/res/cardsfolder/m/mogg_raider.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Creature Goblin PT:1/1 A:AB$ Pump | Cost$ Sac<1/Goblin> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Target creature gets +1/+1 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mogg_raider.jpg Oracle:Sacrifice a Goblin: Target creature gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/m/mogg_squad.txt b/forge-gui/res/cardsfolder/m/mogg_squad.txt index 6df1eb2ef6a..5234960dd32 100644 --- a/forge-gui/res/cardsfolder/m/mogg_squad.txt +++ b/forge-gui/res/cardsfolder/m/mogg_squad.txt @@ -5,6 +5,6 @@ PT:3/3 S:Mode$ Continuous | Affected$ Card.Self | AddPower$ -X | AddToughness$ -X | References$ X | Description$ CARDNAME gets -1/-1 for each other creature on the battlefield. SVar:X:Count$Valid Creature.Other SVar:AntiBuffedBy:Creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mogg_squad.jpg Oracle:Mogg Squad gets -1/-1 for each other creature on the battlefield. diff --git a/forge-gui/res/cardsfolder/m/moggcatcher.txt b/forge-gui/res/cardsfolder/m/moggcatcher.txt index 2b93f31c267..0dbf7a46bd1 100644 --- a/forge-gui/res/cardsfolder/m/moggcatcher.txt +++ b/forge-gui/res/cardsfolder/m/moggcatcher.txt @@ -3,7 +3,7 @@ ManaCost:2 R R Types:Creature Human Mercenary PT:2/2 A:AB$ ChangeZone | Cost$ 3 T | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Goblin | ChangeNum$ 1 | SpellDescription$ Search your library for a Goblin permanent card, put it onto the battlefield, then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonCombatPriority:3 SVar:Picture:http://www.wizards.com/global/images/magic/general/moggcatcher.jpg Oracle:{3}, {T}: Search your library for a Goblin permanent card, put it onto the battlefield, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/m/mogiss_warhound.txt b/forge-gui/res/cardsfolder/m/mogiss_warhound.txt index ff45aa74eb8..fbb8093bbf6 100644 --- a/forge-gui/res/cardsfolder/m/mogiss_warhound.txt +++ b/forge-gui/res/cardsfolder/m/mogiss_warhound.txt @@ -5,6 +5,6 @@ PT:2/2 K:Bestow:2 R K:CARDNAME attacks each combat if able. S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 2 | AddToughness$ 2 | AddHiddenKeyword$ CARDNAME attacks each combat if able. | Description$ Enchanted creature gets +2/+2 and attacks each combat if able. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mogiss_warhound.jpg Oracle:Bestow {2}{R} (If you cast this card for its bestow cost, it's an Aura spell with enchant creature. It becomes a creature again if it's not attached to a creature.)\nMogis's Warhound attacks each combat if able.\nEnchanted creature gets +2/+2 and attacks each combat if able. diff --git a/forge-gui/res/cardsfolder/m/molder_slug.txt b/forge-gui/res/cardsfolder/m/molder_slug.txt index 591d3ed2b29..a2884a2cd4a 100644 --- a/forge-gui/res/cardsfolder/m/molder_slug.txt +++ b/forge-gui/res/cardsfolder/m/molder_slug.txt @@ -4,6 +4,6 @@ Types:Creature Slug Beast PT:4/6 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ At the beginning of each player's upkeep, that player sacrifices an artifact. SVar:TrigSac:DB$ Sacrifice | SacValid$ Artifact | Defined$ TriggeredPlayer | SpellDescription$ Sacrifice an artifact. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/molder_slug.jpg Oracle:At the beginning of each player's upkeep, that player sacrifices an artifact. diff --git a/forge-gui/res/cardsfolder/m/molten_firebird.txt b/forge-gui/res/cardsfolder/m/molten_firebird.txt index 0da2987d52d..04309ee34c1 100644 --- a/forge-gui/res/cardsfolder/m/molten_firebird.txt +++ b/forge-gui/res/cardsfolder/m/molten_firebird.txt @@ -8,6 +8,6 @@ SVar:TrigSkipDraw:DB$ Pump | Defined$ TriggeredCardController | KW$ Skip your ne SVar:TrigDelay:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | RememberObjects$ TriggeredCard | TriggerDescription$ Return CARDNAME to the battlefield. SVar:TrigReturn:DB$ ChangeZone | Defined$ DelayTriggerRemembered | Origin$ Graveyard | Destination$ Battlefield A:AB$ ChangeZone | Cost$ 4 R | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile CARDNAME. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/molten_firebird.jpg Oracle:Flying\nWhen Molten Firebird dies, return it to the battlefield under its owner's control at the beginning of the next end step and you skip your next draw step.\n{4}{R}: Exile Molten Firebird. diff --git a/forge-gui/res/cardsfolder/m/molten_slagheap.txt b/forge-gui/res/cardsfolder/m/molten_slagheap.txt index c44abb721aa..eaf076cb4e5 100644 --- a/forge-gui/res/cardsfolder/m/molten_slagheap.txt +++ b/forge-gui/res/cardsfolder/m/molten_slagheap.txt @@ -5,6 +5,6 @@ A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ PutCounter | Cost$ 1 T | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME. A:AB$ Mana | Cost$ 1 SubCounter | Produced$ Combo B R | Amount$ ChosenX | CostDesc$ {1}, Remove X storage counters from CARDNAME: | References$ X | SpellDescription$ Add X mana in any combination of {B} and/or {R}. SVar:X:XChoice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/molten_slagheap.jpg Oracle:{T}: Add {C}.\n{1}, {T}: Put a storage counter on Molten Slagheap.\n{1}, Remove X storage counters from Molten Slagheap: Add X mana in any combination of {B} and/or {R}. diff --git a/forge-gui/res/cardsfolder/m/molten_tail_masticore.txt b/forge-gui/res/cardsfolder/m/molten_tail_masticore.txt index 389d4240113..32380af1c36 100644 --- a/forge-gui/res/cardsfolder/m/molten_tail_masticore.txt +++ b/forge-gui/res/cardsfolder/m/molten_tail_masticore.txt @@ -7,6 +7,6 @@ A:AB$DealDamage | Cost$ 4 ExileFromGrave<1/Creature> | NumDmg$ 4 | ValidTgts$ Cr A:AB$Regenerate | Cost$ 2 | SpellDescription$ Regenerate CARDNAME. SVar:NeedsToPlayVar:Z GE3 SVar:Z:Count$InYourHand -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/molten_tail_masticore.jpg Oracle:At the beginning of your upkeep, sacrifice Molten-Tail Masticore unless you discard a card.\n{4}, Exile a creature card from your graveyard: Molten-Tail Masticore deals 4 damage to any target.\n{2}: Regenerate Molten-Tail Masticore. diff --git a/forge-gui/res/cardsfolder/m/moment_of_silence.txt b/forge-gui/res/cardsfolder/m/moment_of_silence.txt index ba931590432..7e08cd3cf09 100644 --- a/forge-gui/res/cardsfolder/m/moment_of_silence.txt +++ b/forge-gui/res/cardsfolder/m/moment_of_silence.txt @@ -2,6 +2,6 @@ Name:Moment of Silence ManaCost:W Types:Instant A:SP$ Pump | Cost$ W | ValidTgts$ Player | TgtPrompt$ Select target player | KW$ Skip your next combat phase. | SpellDescription$ Target player skips their next combat phase this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/moment_of_silence.jpg Oracle:Target player skips their next combat phase this turn. diff --git a/forge-gui/res/cardsfolder/m/momentous_fall.txt b/forge-gui/res/cardsfolder/m/momentous_fall.txt index 03640348020..5a8a1903363 100644 --- a/forge-gui/res/cardsfolder/m/momentous_fall.txt +++ b/forge-gui/res/cardsfolder/m/momentous_fall.txt @@ -5,6 +5,6 @@ A:SP$ Draw | Cost$ 2 G G Sac<1/Creature> | NumCards$ XPower | References$ XPower SVar:DBGainLife:DB$GainLife | LifeAmount$ XToughness | References$ XToughness SVar:XPower:Sacrificed$CardPower SVar:XToughness:Sacrificed$CardToughness -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/momentous_fall.jpg Oracle:As an additional cost to cast Momentous Fall, sacrifice a creature.\nYou draw cards equal to the sacrificed creature's power, then you gain life equal to its toughness. diff --git a/forge-gui/res/cardsfolder/m/monsoon.txt b/forge-gui/res/cardsfolder/m/monsoon.txt index 112a0836ed5..03b1633b1fd 100644 --- a/forge-gui/res/cardsfolder/m/monsoon.txt +++ b/forge-gui/res/cardsfolder/m/monsoon.txt @@ -8,6 +8,6 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount S:Mode$ Continuous | Affected$ Island | AddSVar$ AITap SVar:AITap:SVar:AITapDown:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/monsoon.jpg Oracle:At the beginning of each player's end step, tap all untapped Islands that player controls and Monsoon deals X damage to the player, where X is the number of Islands tapped this way. diff --git a/forge-gui/res/cardsfolder/m/moonbow_illusionist.txt b/forge-gui/res/cardsfolder/m/moonbow_illusionist.txt index aa870e5b3ba..f9f5bd51854 100644 --- a/forge-gui/res/cardsfolder/m/moonbow_illusionist.txt +++ b/forge-gui/res/cardsfolder/m/moonbow_illusionist.txt @@ -5,6 +5,6 @@ PT:2/1 K:Flying A:AB$ ChooseType | Cost$ 2 Return<1/Land> | Defined$ You | Type$ Basic Land | SubAbility$ DBAnimate | SpellDescription$ Target land becomes the basic land type of your choice until end of turn. SVar:DBAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/moonbow_illusionist.jpg Oracle:Flying\n{2}, Return a land you control to its owner's hand: Target land becomes the basic land type of your choice until end of turn. diff --git a/forge-gui/res/cardsfolder/m/moonlace.txt b/forge-gui/res/cardsfolder/m/moonlace.txt index 8e17aac491a..094807f4378 100644 --- a/forge-gui/res/cardsfolder/m/moonlace.txt +++ b/forge-gui/res/cardsfolder/m/moonlace.txt @@ -2,7 +2,7 @@ Name:Moonlace ManaCost:U Types:Instant A:SP$ Animate | Cost$ U | Colors$ Colorless | OverwriteColors$ True | ValidTgts$ Card | TgtZone$ Stack,Battlefield | Permanent$ True | SpellDescription$ Target spell or permanent becomes colorless. -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/moonlace.jpg Oracle:Target spell or permanent becomes colorless. diff --git a/forge-gui/res/cardsfolder/m/moonlight_bargain.txt b/forge-gui/res/cardsfolder/m/moonlight_bargain.txt index a084b2dca5e..aa6861c14bb 100644 --- a/forge-gui/res/cardsfolder/m/moonlight_bargain.txt +++ b/forge-gui/res/cardsfolder/m/moonlight_bargain.txt @@ -6,6 +6,6 @@ SVar:DBRepeat:DB$ RepeatEach | RepeatSubAbility$ DBChangeZone | RepeatCards$ Car SVar:DBChangeZone:DB$ ChangeZone | Defined$ Imprinted | Origin$ Library | Destination$ Graveyard | UnlessCost$ PayLife<2> | UnlessPayer$ You | ForgetChanged$ True | StackDescription$ Put [{c:Imprinted}] into your graveyard SVar:PutIntoHand:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Library | Destination$ Hand | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/moonlight_bargain.jpg Oracle:Look at the top five cards of your library. For each card, put that card into your graveyard unless you pay 2 life. Then put the rest into your hand. diff --git a/forge-gui/res/cardsfolder/m/moonlight_geist.txt b/forge-gui/res/cardsfolder/m/moonlight_geist.txt index c1383b28373..8e711506a53 100644 --- a/forge-gui/res/cardsfolder/m/moonlight_geist.txt +++ b/forge-gui/res/cardsfolder/m/moonlight_geist.txt @@ -4,6 +4,6 @@ Types:Creature Spirit PT:2/1 K:Flying A:AB$ Pump | Cost$ 3 W | Defined$ Self | KW$ Prevent all combat damage that would be dealt to and dealt by CARDNAME. | SpellDescription$ Prevent all combat damage that would be dealt to and dealt by CARDNAME this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/moonlight_geist.jpg Oracle:Flying\n{3}{W}: Prevent all combat damage that would be dealt to and dealt by Moonlight Geist this turn. diff --git a/forge-gui/res/cardsfolder/m/moonlight_hunt.txt b/forge-gui/res/cardsfolder/m/moonlight_hunt.txt index 37f9f9f949f..388abe0e1de 100644 --- a/forge-gui/res/cardsfolder/m/moonlight_hunt.txt +++ b/forge-gui/res/cardsfolder/m/moonlight_hunt.txt @@ -5,7 +5,7 @@ A:SP$ DealDamage | Cost$ 1 G | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Sele SVar:MoonlightDamage:DB$ RepeatEach | RepeatSubAbility$ WolfStrike | UseImprinted$ True | RepeatCards$ Creature.Wolf+YouCtrl,Creature.Werewolf+YouCtrl | StackDescription$ None | DamageMap$ True SVar:WolfStrike:DB$ DealDamage | DamageSource$ Imprinted | NumDmg$ X | References$ X | Defined$ ParentTarget | StackDescription$ None SVar:X:Imprinted$CardPower -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Wolf & Type$Werewolf SVar:Picture:http://www.wizards.com/global/images/magic/general/moonlight_hunt.jpg Oracle:Choose target creature you don't control. Each creature you control that's a Wolf or a Werewolf deals damage equal to its power to that creature. diff --git a/forge-gui/res/cardsfolder/m/moonlit_strider.txt b/forge-gui/res/cardsfolder/m/moonlit_strider.txt index 8d7b63f289b..dbdb5736098 100644 --- a/forge-gui/res/cardsfolder/m/moonlit_strider.txt +++ b/forge-gui/res/cardsfolder/m/moonlit_strider.txt @@ -4,7 +4,7 @@ Types:Creature Spirit PT:1/4 K:Soulshift:3 A:AB$ Protection | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | Gains$ Choice | Choices$ AnyColor | SpellDescription$ Target creature you control gains protection from the color of your choice until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Spirit SVar:Picture:http://www.wizards.com/global/images/magic/general/moonlit_strider.jpg Oracle:Sacrifice Moonlit Strider: Target creature you control gains protection from the color of your choice until end of turn.\nSoulshift 3 (When this creature dies, you may return target Spirit card with converted mana cost 3 or less from your graveyard to your hand.) diff --git a/forge-gui/res/cardsfolder/m/moonmist.txt b/forge-gui/res/cardsfolder/m/moonmist.txt index 51a75e86e4e..4704280c906 100644 --- a/forge-gui/res/cardsfolder/m/moonmist.txt +++ b/forge-gui/res/cardsfolder/m/moonmist.txt @@ -5,6 +5,6 @@ A:SP$ SetState | Cost$ 1 G | Defined$ Valid Creature.Human+DoubleFaced | Mode$ T SVar:DBCurseNonWolves:DB$ Effect | Name$ Moonmist Effect | ReplacementEffects$ RPrevent SVar:RPrevent:Event$ DamageDone | Prevent$ True | IsCombat$ True | ActiveZones$ Command | ValidSource$ Creature.nonWerewolf+nonWolf | Description$ Prevent all combat damage that would be dealt this turn by creatures other than Werewolves and Wolves. SVar:NeedsToPlay:Human.YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/moonmist.jpg Oracle:Transform all Humans. Prevent all combat damage that would be dealt this turn by creatures other than Werewolves and Wolves. (Only double-faced cards can be transformed.) diff --git a/forge-gui/res/cardsfolder/m/moonring_island.txt b/forge-gui/res/cardsfolder/m/moonring_island.txt index 457236819c2..998aa494240 100644 --- a/forge-gui/res/cardsfolder/m/moonring_island.txt +++ b/forge-gui/res/cardsfolder/m/moonring_island.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land Island K:CARDNAME enters the battlefield tapped. A:AB$ Dig | Cost$ U T | ValidTgts$ Player | TgtPrompt$ Select target player | DigNum$ 1 | DestinationZone$ Library | LibraryPosition$ 0 | IsPresent$ Permanent.Blue+YouCtrl | PresentCompare$ GE2 | SpellDescription$ Look at the top card of target player's library. Activate this ability only if you control two or more blue permanents. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/moonring_island.jpg Oracle:({T}: Add {U}.)\nMoonring Island enters the battlefield tapped.\n{U}, {T}: Look at the top card of target player's library. Activate this ability only if you control two or more blue permanents. diff --git a/forge-gui/res/cardsfolder/m/moonring_mirror.txt b/forge-gui/res/cardsfolder/m/moonring_mirror.txt index d194ae4e2d7..75b92fad17d 100644 --- a/forge-gui/res/cardsfolder/m/moonring_mirror.txt +++ b/forge-gui/res/cardsfolder/m/moonring_mirror.txt @@ -11,6 +11,6 @@ T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCar SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup2 SVar:DBCleanup2:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/moonring_mirror.jpg Oracle:Whenever you draw a card, exile the top card of your library face down.\nAt the beginning of your upkeep, you may exile all cards from your hand face down. If you do, put all other cards you own exiled with Moonring Mirror into your hand. diff --git a/forge-gui/res/cardsfolder/m/morality_shift.txt b/forge-gui/res/cardsfolder/m/morality_shift.txt index 3a813c4c18f..8a2e3c4bddb 100644 --- a/forge-gui/res/cardsfolder/m/morality_shift.txt +++ b/forge-gui/res/cardsfolder/m/morality_shift.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ ChangeZoneAll | Cost$ 5 B B | ChangeType$ Card.YouCtrl | Origin$ Library | Destination$ Graveyard | SubAbility$ GraveShift | RememberChanged$ True | SpellDescription$ Exchange your graveyard and library. Then shuffle your library. SVar:GraveShift:DB$ ChangeZoneAll | ChangeType$ Card.YouCtrl+IsNotRemembered | Origin$ Graveyard | Destination$ Library | Shuffle$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/morality_shift.jpg Oracle:Exchange your graveyard and library. Then shuffle your library. diff --git a/forge-gui/res/cardsfolder/m/moratorium_stone.txt b/forge-gui/res/cardsfolder/m/moratorium_stone.txt index 2a783921c68..d813c3a352b 100644 --- a/forge-gui/res/cardsfolder/m/moratorium_stone.txt +++ b/forge-gui/res/cardsfolder/m/moratorium_stone.txt @@ -5,6 +5,6 @@ A:AB$ ChangeZone | Cost$ 2 T | Origin$ Graveyard | Destination$ Exile | TgtPromp A:AB$ ChangeZone | Cost$ 2 W B Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card.nonLand | RememberTargets$ True | ForgetOtherTargets$ True | SubAbility$ DBChangeAll | SpellDescription$ Exile target nonland card from a graveyard, all other cards from graveyards with the same name as that card, and all permanents with that name. SVar:DBChangeAll:DB$ChangeZoneAll | Origin$ Graveyard,Battlefield | Destination$ Exile | ChangeType$ Remembered.sameName | SubAbility$ DBCleanup SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/moratorium_stone.jpg Oracle:{2}, {T}: Exile target card from a graveyard.\n{2}{W}{B}, {T}, Sacrifice Moratorium Stone: Exile target nonland card from a graveyard, all other cards from graveyards with the same name as that card, and all permanents with that name. diff --git a/forge-gui/res/cardsfolder/m/morgue_thrull.txt b/forge-gui/res/cardsfolder/m/morgue_thrull.txt index 6ec2e9f50ca..be72b86db69 100644 --- a/forge-gui/res/cardsfolder/m/morgue_thrull.txt +++ b/forge-gui/res/cardsfolder/m/morgue_thrull.txt @@ -3,6 +3,6 @@ ManaCost:2 B Types:Creature Thrull PT:2/2 A:AB$ Mill | Cost$ Sac<1/CARDNAME> | Defined$ You | NumCards$ 3 | SpellDescription$ Put the top three cards of your library into your graveyard. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/morgue_thrull.jpg Oracle:Sacrifice Morgue Thrull: Put the top three cards of your library into your graveyard. diff --git a/forge-gui/res/cardsfolder/m/morgue_toad.txt b/forge-gui/res/cardsfolder/m/morgue_toad.txt index 7413920722c..3bce597d06c 100644 --- a/forge-gui/res/cardsfolder/m/morgue_toad.txt +++ b/forge-gui/res/cardsfolder/m/morgue_toad.txt @@ -4,6 +4,6 @@ Types:Creature Frog PT:2/2 A:AB$ Mana | Cost$ Sac<1/CARDNAME> | Produced$ U R | SpellDescription$ Add {U}{R}. DeckNeeds:Color$Blue|Red -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/morgue_toad.jpg Oracle:Sacrifice Morgue Toad: Add {U}{R}. diff --git a/forge-gui/res/cardsfolder/m/morinfen.txt b/forge-gui/res/cardsfolder/m/morinfen.txt index f90a2cead1a..d7c22115a4d 100644 --- a/forge-gui/res/cardsfolder/m/morinfen.txt +++ b/forge-gui/res/cardsfolder/m/morinfen.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Horror PT:5/4 K:Flying K:Cumulative upkeep:PayLife<1>:Pay 1 life. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/morinfen.jpg Oracle:Flying\nCumulative upkeep—Pay 1 life. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) diff --git a/forge-gui/res/cardsfolder/m/morinfen_avatar.txt b/forge-gui/res/cardsfolder/m/morinfen_avatar.txt index bbacec19f5f..e9f2bacbf9f 100644 --- a/forge-gui/res/cardsfolder/m/morinfen_avatar.txt +++ b/forge-gui/res/cardsfolder/m/morinfen_avatar.txt @@ -5,7 +5,7 @@ HandLifeModifier:+0/+30 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Command | Execute$ TrigLoseLife | TriggerDescription$ At the beginning of your upkeep, you lose 1 life for each permanent you control. SVar:TrigLoseLife:DB$ LoseLife | Defined$ You | LifeAmount$ Ouch SVar:Ouch:Count$Valid Permanent.YouCtrl -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:https://downloads.cardforge.org/images/cards/VAN/Morinfen Avatar.full.jpg Oracle:Hand +0, life +30\nAt the beginning of your upkeep, you lose 1 life for each permanent you control. diff --git a/forge-gui/res/cardsfolder/m/moriok_replica.txt b/forge-gui/res/cardsfolder/m/moriok_replica.txt index abb8bee9415..392a3f10217 100644 --- a/forge-gui/res/cardsfolder/m/moriok_replica.txt +++ b/forge-gui/res/cardsfolder/m/moriok_replica.txt @@ -4,6 +4,6 @@ Types:Artifact Creature Warrior PT:2/2 A:AB$ Draw | Cost$ 1 B Sac<1/CARDNAME> | NumCards$ 2 | SubAbility$ DBLoseLife | SpellDescription$ You draw two cards and lose 2 life. SVar:DBLoseLife:DB$LoseLife | LifeAmount$ 2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/moriok_replica.jpg Oracle:{1}{B}, Sacrifice Moriok Replica: You draw two cards and lose 2 life. diff --git a/forge-gui/res/cardsfolder/m/morningtide.txt b/forge-gui/res/cardsfolder/m/morningtide.txt index 2e59da560b8..6c95e084cde 100644 --- a/forge-gui/res/cardsfolder/m/morningtide.txt +++ b/forge-gui/res/cardsfolder/m/morningtide.txt @@ -2,6 +2,6 @@ Name:Morningtide ManaCost:1 W Types:Sorcery A:SP$ ChangeZoneAll | Cost$ 1 W | ChangeType$ Card | Origin$ Graveyard | Destination$ Exile | AILogic$ ExileGraveyards | SpellDescription$ Exile all cards from all graveyards. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/morningtide.jpg Oracle:Exile all cards from all graveyards. diff --git a/forge-gui/res/cardsfolder/m/mortarpod.txt b/forge-gui/res/cardsfolder/m/mortarpod.txt index 546fa1b4a74..45bbfee8ffe 100644 --- a/forge-gui/res/cardsfolder/m/mortarpod.txt +++ b/forge-gui/res/cardsfolder/m/mortarpod.txt @@ -6,6 +6,6 @@ K:Equip:2 S:Mode$ Continuous | Affected$ Card.EquippedBy | AddToughness$ 1 | AddAbility$ Damage | Description$ Equipped creature gets +0/+1 and has "Sacrifice this creature: This creature deals 1 damage to any target." SVar:Damage:AB$DealDamage | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to any target. DeckHas:Ability$Token -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mortarpod.jpg Oracle:Living weapon (When this Equipment enters the battlefield, create a 0/0 black Germ creature token, then attach this to it.)\nEquipped creature gets +0/+1 and has "Sacrifice this creature: This creature deals 1 damage to any target."\nEquip {2} diff --git a/forge-gui/res/cardsfolder/m/mortipede.txt b/forge-gui/res/cardsfolder/m/mortipede.txt index 88aecb1ea5e..b2200b0ed09 100644 --- a/forge-gui/res/cardsfolder/m/mortipede.txt +++ b/forge-gui/res/cardsfolder/m/mortipede.txt @@ -3,6 +3,6 @@ ManaCost:3 B Types:Creature Insect PT:4/1 A:AB$ Pump | Cost$ 2 G | KW$ HIDDEN All creatures able to block CARDNAME do so. | SpellDescription$ All creatures able to block CARDNAME this turn do so. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mortipede.jpg Oracle:{2}{G}: All creatures able to block Mortipede this turn do so. diff --git a/forge-gui/res/cardsfolder/m/mortiphobia.txt b/forge-gui/res/cardsfolder/m/mortiphobia.txt index 37d4a4aacc1..a9e119e3751 100644 --- a/forge-gui/res/cardsfolder/m/mortiphobia.txt +++ b/forge-gui/res/cardsfolder/m/mortiphobia.txt @@ -3,6 +3,6 @@ ManaCost:1 B B Types:Enchantment A:AB$ ChangeZone | Cost$ 1 B Discard<1/Card> | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SpellDescription$ Exile target card from a graveyard. A:AB$ ChangeZone | Cost$ 1 B Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SpellDescription$ Exile target card from a graveyard. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/Mortiphobia.jpg Oracle:{1}{B}, Discard a card: Exile target card from a graveyard.\n{1}{B}, Sacrifice Mortiphobia: Exile target card from a graveyard. diff --git a/forge-gui/res/cardsfolder/m/mortuary.txt b/forge-gui/res/cardsfolder/m/mortuary.txt index 8288d8e860b..b54c8935f07 100644 --- a/forge-gui/res/cardsfolder/m/mortuary.txt +++ b/forge-gui/res/cardsfolder/m/mortuary.txt @@ -3,7 +3,7 @@ ManaCost:3 B Types:Enchantment T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouOwn | TriggerZones$ Battlefield | Execute$ TrigReturn | TriggerDescription$ Whenever a creature is put into your graveyard from the battlefield, put that card on top of your library. SVar:TrigReturn:DB$ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | LibraryPosition$ 0 | Destination$ Library -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/mortuary.jpg Oracle:Whenever a creature is put into your graveyard from the battlefield, put that card on top of your library. diff --git a/forge-gui/res/cardsfolder/m/mossfire_egg.txt b/forge-gui/res/cardsfolder/m/mossfire_egg.txt index 85196400caa..82acf7ce0ba 100644 --- a/forge-gui/res/cardsfolder/m/mossfire_egg.txt +++ b/forge-gui/res/cardsfolder/m/mossfire_egg.txt @@ -3,7 +3,7 @@ ManaCost:1 Types:Artifact A:AB$ Mana | Cost$ 2 T Sac<1/CARDNAME> | Produced$ R G | SubAbility$ DBDraw | SpellDescription$ Add {R}{G}. Draw a card. SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mossfire_egg.jpg Oracle:{2}, {T}, Sacrifice Mossfire Egg: Add {R}{G}. Draw a card. diff --git a/forge-gui/res/cardsfolder/m/mossfire_valley.txt b/forge-gui/res/cardsfolder/m/mossfire_valley.txt index 091644d14f1..1852af6249b 100644 --- a/forge-gui/res/cardsfolder/m/mossfire_valley.txt +++ b/forge-gui/res/cardsfolder/m/mossfire_valley.txt @@ -2,6 +2,6 @@ Name:Mossfire Valley ManaCost:no cost Types:Land A:AB$ Mana | Cost$ 1 T | Produced$ R G | SpellDescription$ Add {R}{G}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mossfire_valley.jpg Oracle:{1}, {T}: Add {R}{G}. diff --git a/forge-gui/res/cardsfolder/m/mountain_stronghold.txt b/forge-gui/res/cardsfolder/m/mountain_stronghold.txt index f892601aab1..33d5a9da22e 100644 --- a/forge-gui/res/cardsfolder/m/mountain_stronghold.txt +++ b/forge-gui/res/cardsfolder/m/mountain_stronghold.txt @@ -2,6 +2,6 @@ Name:Mountain Stronghold ManaCost:no cost Types:Land S:Mode$ Continuous | Affected$ Creature.Red+Legendary | AddKeyword$ Bands with Other Legendary Creatures | Description$ Red legendary creatures you control have "bands with other legendary creatures." (Any legendary creatures can attack in a band as long as at least one has "bands with other legendary creatures." Bands are blocked as a group. If at least two legendary creatures you control, one of which has "bands with other legendary creatures," are blocking or being blocked by the same creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mountain_stronghold.jpg Oracle:Red legendary creatures you control have "bands with other legendary creatures." (Any legendary creatures can attack in a band as long as at least one has "bands with other legendary creatures." Bands are blocked as a group. If at least two legendary creatures you control, one of which has "bands with other legendary creatures," are blocking or being blocked by the same creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/m/mountain_titan.txt b/forge-gui/res/cardsfolder/m/mountain_titan.txt index af414aabe6a..6eee3619bb9 100644 --- a/forge-gui/res/cardsfolder/m/mountain_titan.txt +++ b/forge-gui/res/cardsfolder/m/mountain_titan.txt @@ -6,6 +6,6 @@ A:AB$ Effect | Cost$ 1 R R | Name$ Mountain Titan Effect | Triggers$ TrigSpellCa SVar:TrigSpellCast:Mode$ SpellCast | ValidCard$ Card.Black | ValidActivatingPlayer$ You | Execute$ TrigPutCounter | TriggerZones$ Command | TriggerDescription$ Whenever you cast a black spell, put a +1/+1 counter on Mountain Titan. SVar:TrigPutCounter:DB$ PutCounter | Defined$ Remembered | CounterType$ P1P1 | CounterNum$ 1 SVar:BuffedBy:Card.Black -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mountain_titan.jpg Oracle:{1}{R}{R}: Until end of turn, whenever you cast a black spell, put a +1/+1 counter on Mountain Titan. diff --git a/forge-gui/res/cardsfolder/m/mournful_zombie.txt b/forge-gui/res/cardsfolder/m/mournful_zombie.txt index 997c4736df2..e22e858497a 100644 --- a/forge-gui/res/cardsfolder/m/mournful_zombie.txt +++ b/forge-gui/res/cardsfolder/m/mournful_zombie.txt @@ -3,7 +3,7 @@ ManaCost:2 B Types:Creature Zombie PT:2/1 A:AB$ GainLife | Cost$ W T | LifeAmount$ 1 | ValidTgts$ Player | TgtPrompt$ Choose a player to gain 1 life | SpellDescription$ Target player gains 1 life. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$white SVar:Picture:http://www.wizards.com/global/images/magic/general/mournful_zombie.jpg Oracle:{W}, {T}: Target player gains 1 life. diff --git a/forge-gui/res/cardsfolder/m/mourning.txt b/forge-gui/res/cardsfolder/m/mourning.txt index 8027a0e5d03..364e656cb96 100644 --- a/forge-gui/res/cardsfolder/m/mourning.txt +++ b/forge-gui/res/cardsfolder/m/mourning.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ 1 B | ValidTgts$ Creature | AILogic$ Curse S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ -2 | Description$ Enchanted creature gets -2/-0. A:AB$ ChangeZone | Cost$ B | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mourning.jpg Oracle:Enchant creature\nEnchanted creature gets -2/-0.\n{B}: Return Mourning to its owner's hand. diff --git a/forge-gui/res/cardsfolder/m/mouth_of_ronom.txt b/forge-gui/res/cardsfolder/m/mouth_of_ronom.txt index f6ca6bcd0aa..0006cbf3c0c 100644 --- a/forge-gui/res/cardsfolder/m/mouth_of_ronom.txt +++ b/forge-gui/res/cardsfolder/m/mouth_of_ronom.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Snow Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ DealDamage | Cost$ 4 S T Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target creature. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mouth_of_ronom.jpg Oracle:{T}: Add {C}.\n{4}{S}, {T}, Sacrifice Mouth of Ronom: Mouth of Ronom deals 4 damage to target creature. ({S} can be paid with one mana from a snow permanent.) diff --git a/forge-gui/res/cardsfolder/m/mox_opal.txt b/forge-gui/res/cardsfolder/m/mox_opal.txt index 8e9adcbad22..4d1b62faaba 100644 --- a/forge-gui/res/cardsfolder/m/mox_opal.txt +++ b/forge-gui/res/cardsfolder/m/mox_opal.txt @@ -2,6 +2,6 @@ Name:Mox Opal ManaCost:0 Types:Legendary Artifact A:AB$ Mana | Cost$ T | Produced$ Any | Activation$ Metalcraft | PrecostDesc$ Metalcraft — | SpellDescription$ Add one mana of any color. Activate this ability only if you control three or more artifacts. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mox_opal.jpg Oracle:Metalcraft — {T}: Add one mana of any color. Activate this ability only if you control three or more artifacts. diff --git a/forge-gui/res/cardsfolder/m/mudbutton_clanger.txt b/forge-gui/res/cardsfolder/m/mudbutton_clanger.txt index d576a07f26f..3085f8b465c 100644 --- a/forge-gui/res/cardsfolder/m/mudbutton_clanger.txt +++ b/forge-gui/res/cardsfolder/m/mudbutton_clanger.txt @@ -6,6 +6,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigKinship | Trigge SVar:TrigKinship:DB$ PeekAndReveal | PeekAmount$ 1 | RevealValid$ Card.sharesCreatureTypeWith | RevealOptional$ True | RememberRevealed$ True | SubAbility$ DBPump SVar:DBPump:DB$ Pump | NumAtt$ +1 | NumDef$ +1 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mudbutton_clanger.jpg Oracle:Kinship — At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Mudbutton Clanger, you may reveal it. If you do, Mudbutton Clanger gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/m/mudhole.txt b/forge-gui/res/cardsfolder/m/mudhole.txt index 5b835d938ae..047b46fa60c 100644 --- a/forge-gui/res/cardsfolder/m/mudhole.txt +++ b/forge-gui/res/cardsfolder/m/mudhole.txt @@ -2,6 +2,6 @@ Name:Mudhole ManaCost:2 R Types:Instant A:SP$ ChangeZoneAll | Cost$ 2 R | ValidTgts$ Player | TgtPrompt$ Select target player | Origin$ Graveyard | Destination$ Exile | ChangeType$ Land | SpellDescription$ Target player exiles all land cards from their graveyard. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mudhole.jpg Oracle:Target player exiles all land cards from their graveyard. diff --git a/forge-gui/res/cardsfolder/m/mudslide.txt b/forge-gui/res/cardsfolder/m/mudslide.txt index 752d1868fde..d8bebea789c 100644 --- a/forge-gui/res/cardsfolder/m/mudslide.txt +++ b/forge-gui/res/cardsfolder/m/mudslide.txt @@ -7,7 +7,7 @@ SVar:TrigChoose:DB$ ChooseCard | Defined$ TriggeredPlayer | Amount$ X | Referenc SVar:DBUntap:DB$ RepeatEach | DefinedCards$ ChosenCard | RepeatSubAbility$ UntapEach SVar:UntapEach:DB$ Untap | Defined$ Remembered | UnlessCost$ 2 | UnlessPayer$ RememberedController | UnlessSwitched$ True | ShowCurrentCard$ Remembered SVar:X:Count$Valid Creature.tapped+withoutFlying+ActivePlayerCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/mudslide.jpg Oracle:Creatures without flying don't untap during their controllers' untap steps.\nAt the beginning of each player's upkeep, that player may choose any number of tapped creatures without flying they control and pay {2} for each creature chosen this way. If the player does, untap those creatures. diff --git a/forge-gui/res/cardsfolder/m/multanis_presence.txt b/forge-gui/res/cardsfolder/m/multanis_presence.txt index 4ed192277f9..0b8f131ea0a 100644 --- a/forge-gui/res/cardsfolder/m/multanis_presence.txt +++ b/forge-gui/res/cardsfolder/m/multanis_presence.txt @@ -3,6 +3,6 @@ ManaCost:G Types:Enchantment T:Mode$ Countered | ValidCard$ Card | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ DBDraw | TriggerDescription$ Whenever a spell you've cast is countered, draw a card. SVar:DBDraw:DB$ Draw | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/multanis_presence.jpg Oracle:Whenever a spell you've cast is countered, draw a card. diff --git a/forge-gui/res/cardsfolder/m/murasa_pyromancer.txt b/forge-gui/res/cardsfolder/m/murasa_pyromancer.txt index 84f57830938..cbd488f2857 100644 --- a/forge-gui/res/cardsfolder/m/murasa_pyromancer.txt +++ b/forge-gui/res/cardsfolder/m/murasa_pyromancer.txt @@ -8,6 +8,6 @@ SVar:TrigDamage:DB$DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target c SVar:NumAllies:Count$Valid Ally.YouCtrl SVar:PlayMain1:TRUE SVar:BuffedBy:Ally -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/murasa_pyromancer.jpg Oracle:Whenever Murasa Pyromancer or another Ally enters the battlefield under your control, you may have Murasa Pyromancer deal damage to target creature equal to the number of Allies you control. diff --git a/forge-gui/res/cardsfolder/m/murderers_axe.txt b/forge-gui/res/cardsfolder/m/murderers_axe.txt index dc3d5b2e0f6..6ffd548642d 100644 --- a/forge-gui/res/cardsfolder/m/murderers_axe.txt +++ b/forge-gui/res/cardsfolder/m/murderers_axe.txt @@ -4,7 +4,7 @@ Types:Artifact Equipment S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddToughness$ 2 | Description$ Equipped creature gets +2/+2. K:Equip:Discard<1/Card> SVar:AIPreference:DiscardCost$Card -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHas:Ability$Discard DeckHints:Keyword$Madness & Ability$Delirium SVar:Picture:http://www.wizards.com/global/images/magic/general/murderers_axe.jpg diff --git a/forge-gui/res/cardsfolder/m/murderous_betrayal.txt b/forge-gui/res/cardsfolder/m/murderous_betrayal.txt index 9509571b1e8..b81df1c11be 100644 --- a/forge-gui/res/cardsfolder/m/murderous_betrayal.txt +++ b/forge-gui/res/cardsfolder/m/murderous_betrayal.txt @@ -3,7 +3,7 @@ ManaCost:B B B Types:Enchantment A:AB$ Destroy | Cost$ B B PayLife | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target non black creature | NoRegen$ True | CostDesc$ {B}{B}, Pay half your life, rounded up: | References$ X | SpellDescription$ Destroy target nonblack creature. It can't be regenerated. SVar:X:Count$YourLifeTotal/HalfUp -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/murderous_betrayal.jpg Oracle:{B}{B}, Pay half your life, rounded up: Destroy target nonblack creature. It can't be regenerated. diff --git a/forge-gui/res/cardsfolder/m/musician.txt b/forge-gui/res/cardsfolder/m/musician.txt index beedd714aa0..de5c5e189d4 100644 --- a/forge-gui/res/cardsfolder/m/musician.txt +++ b/forge-gui/res/cardsfolder/m/musician.txt @@ -11,6 +11,6 @@ SVar:MusiciansSpite:DB$ Destroy | Defined$ Self | UnlessCost$ MusicX | UnlessPay SVar:MusicX:Count$CardCounters.MUSIC SVar:NeedsToPlayVar:Z GE5 SVar:Z:Count$Valid Land.YouCtrl+inZoneBattlefield -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/musician.jpg Oracle:Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\n{T}: Put a music counter on target creature. If it doesn't have "At the beginning of your upkeep, destroy this creature unless you pay {1} for each music counter on it," it gains that ability. diff --git a/forge-gui/res/cardsfolder/m/mwonvuli_beast_tracker.txt b/forge-gui/res/cardsfolder/m/mwonvuli_beast_tracker.txt index cad071d4a7d..9ad4b85734e 100644 --- a/forge-gui/res/cardsfolder/m/mwonvuli_beast_tracker.txt +++ b/forge-gui/res/cardsfolder/m/mwonvuli_beast_tracker.txt @@ -4,7 +4,7 @@ Types:Creature Human Scout PT:2/1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ ScoutSearch | TriggerDescription$ When CARDNAME enters the battlefield, search your library for a creature card with deathtouch, hexproof, reach or trample and reveal it. Shuffle your library, then put that card on top of it. SVar:ScoutSearch:DB$ ChangeZone | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeNum$ 1 | ChangeType$ Creature.withDeathtouch+YouCtrl,Creature.withHexproof+YouCtrl,Creature.withReach+YouCtrl,Creature.withTrample+YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Keyword$Deathtouch|Hexproof|Reach|Trample SVar:Picture:http://www.wizards.com/global/images/magic/general/mwonvuli_beast_tracker.jpg Oracle:When Mwonvuli Beast Tracker enters the battlefield, search your library for a creature card with deathtouch, hexproof, reach, or trample and reveal it. Shuffle your library and put that card on top of it. diff --git a/forge-gui/res/cardsfolder/m/mycosynth_fiend.txt b/forge-gui/res/cardsfolder/m/mycosynth_fiend.txt index 89123e811c5..809515d4ed4 100644 --- a/forge-gui/res/cardsfolder/m/mycosynth_fiend.txt +++ b/forge-gui/res/cardsfolder/m/mycosynth_fiend.txt @@ -4,6 +4,6 @@ Types:Creature Horror PT:2/2 S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | AddToughness$ X | References$ X | Description$ CARDNAME gets +1/+1 for each poison counter your opponents have. SVar:X:Count$TotalOppPoisonCounters -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mycosynth_fiend.jpg Oracle:Mycosynth Fiend gets +1/+1 for each poison counter your opponents have. diff --git a/forge-gui/res/cardsfolder/m/mycosynth_lattice.txt b/forge-gui/res/cardsfolder/m/mycosynth_lattice.txt index fd26b531ec9..940dac5951c 100644 --- a/forge-gui/res/cardsfolder/m/mycosynth_lattice.txt +++ b/forge-gui/res/cardsfolder/m/mycosynth_lattice.txt @@ -5,6 +5,6 @@ S:Mode$ Continuous | Affected$ Permanent | AddType$ Artifact | Description$ All S:Mode$ Continuous| Affected$ Card | SetColor$ Colorless | AffectedZone$ Battlefield,Hand,Library,Graveyard,Exile,Stack,Command | Description$ All cards that aren't on the battlefield, spells, and permanents are colorless. S:Mode$ Continuous | Affected$ Player | ManaColorConversion$ Additive | WhiteConversion$ All | BlueConversion$ All | BlackConversion$ All | RedConversion$ All | GreenConversion$ All | ColorlessConversion$ All | Description$ Players may spend mana as though it were mana of any color. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mycosynth_lattice.jpg Oracle:All permanents are artifacts in addition to their other types.\nAll cards that aren't on the battlefield, spells, and permanents are colorless.\nPlayers may spend mana as though it were mana of any color. diff --git a/forge-gui/res/cardsfolder/m/myojin_of_lifes_web.txt b/forge-gui/res/cardsfolder/m/myojin_of_lifes_web.txt index 04566e86add..d9ed8ff45d4 100644 --- a/forge-gui/res/cardsfolder/m/myojin_of_lifes_web.txt +++ b/forge-gui/res/cardsfolder/m/myojin_of_lifes_web.txt @@ -7,6 +7,6 @@ SVar:ETBCounter:DB$PutCounter | Defined$ Self | CounterType$ DIVINITY | CounterN S:Mode$ Continuous | Affected$ Card.Self+counters_GE1_DIVINITY | AddKeyword$ Indestructible | Description$ CARDNAME has indestructible as long as it has a divinity counter on it. A:AB$ ChangeZone | Cost$ SubCounter<1/DIVINITY> | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature | ChangeNum$ X | References$ X | SpellDescription$ Put any number of creature cards from your hand onto the battlefield. SVar:X:Count$InYourHand.Creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/myojin_of_lifes_web.jpg Oracle:Myojin of Life's Web enters the battlefield with a divinity counter on it if you cast it from your hand.\nMyojin of Life's Web has indestructible as long as it has a divinity counter on it.\nRemove a divinity counter from Myojin of Life's Web: Put any number of creature cards from your hand onto the battlefield. diff --git a/forge-gui/res/cardsfolder/m/myojin_of_seeing_winds.txt b/forge-gui/res/cardsfolder/m/myojin_of_seeing_winds.txt index ef3cf88137c..fff77f37375 100644 --- a/forge-gui/res/cardsfolder/m/myojin_of_seeing_winds.txt +++ b/forge-gui/res/cardsfolder/m/myojin_of_seeing_winds.txt @@ -7,6 +7,6 @@ SVar:ETBCounter:DB$PutCounter | Defined$ Self | CounterType$ DIVINITY | CounterN S:Mode$ Continuous | Affected$ Card.Self+counters_GE1_DIVINITY | AddKeyword$ Indestructible | Description$ CARDNAME has indestructible as long as it has a divinity counter on it. A:AB$ Draw | Cost$ SubCounter<1/DIVINITY> | NumCards$ X | References$ X | SpellDescription$ Draw a card for each permanent you control. SVar:X:Count$Valid Permanent.YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/myojin_of_seeing_winds.jpg Oracle:Myojin of Seeing Winds enters the battlefield with a divinity counter on it if you cast it from your hand.\nMyojin of Seeing Winds has indestructible as long as it has a divinity counter on it.\nRemove a divinity counter from Myojin of Seeing Winds: Draw a card for each permanent you control. diff --git a/forge-gui/res/cardsfolder/m/myr_landshaper.txt b/forge-gui/res/cardsfolder/m/myr_landshaper.txt index 342682916b9..509668f1b33 100644 --- a/forge-gui/res/cardsfolder/m/myr_landshaper.txt +++ b/forge-gui/res/cardsfolder/m/myr_landshaper.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact Creature Myr PT:1/1 A:AB$ Animate | Cost$ T | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Artifact | SpellDescription$ Target land becomes an artifact in addition to its other types until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/myr_landshaper.jpg Oracle:{T}: Target land becomes an artifact in addition to its other types until end of turn. diff --git a/forge-gui/res/cardsfolder/m/myr_quadropod.txt b/forge-gui/res/cardsfolder/m/myr_quadropod.txt index ec10490383f..dac593835e2 100644 --- a/forge-gui/res/cardsfolder/m/myr_quadropod.txt +++ b/forge-gui/res/cardsfolder/m/myr_quadropod.txt @@ -3,6 +3,6 @@ ManaCost:4 Types:Artifact Creature Myr PT:1/4 A:AB$ Pump | Cost$ 3 | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch CARDNAME's power and toughness until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/myr_quadropod.jpg Oracle:{3}: Switch Myr Quadropod's power and toughness until end of turn. diff --git a/forge-gui/res/cardsfolder/m/myr_reservoir.txt b/forge-gui/res/cardsfolder/m/myr_reservoir.txt index 3a039c67eb2..28b08aeeab8 100644 --- a/forge-gui/res/cardsfolder/m/myr_reservoir.txt +++ b/forge-gui/res/cardsfolder/m/myr_reservoir.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ C | Amount$ 2 | RestrictValid$ Myr,Activated.Myr | SpellDescription$ Add {C}{C}. Spend this mana only to cast Myr spells or activate abilities of Myr. A:AB$ ChangeZone | Cost$ 3 T | TgtPrompt$ Choose target Myr card in your graveyard | ValidTgts$ Card.Myr+YouCtrl | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target Myr card from your graveyard to your hand. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/myr_reservoir.jpg Oracle:{T}: Add {C}{C}. Spend this mana only to cast Myr spells or activate abilities of Myr.\n{3}, {T}: Return target Myr card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/m/myr_superion.txt b/forge-gui/res/cardsfolder/m/myr_superion.txt index 3d9a93a570d..05ddedcf006 100644 --- a/forge-gui/res/cardsfolder/m/myr_superion.txt +++ b/forge-gui/res/cardsfolder/m/myr_superion.txt @@ -4,6 +4,6 @@ Types:Artifact Creature Myr PT:5/6 Text:Spend only mana produced by creatures to cast CARDNAME. SVar:FullCost:Mana<2\Creature> -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/myr_superion.jpg Oracle:Spend only mana produced by creatures to cast Myr Superion. diff --git a/forge-gui/res/cardsfolder/m/mystic_barrier.txt b/forge-gui/res/cardsfolder/m/mystic_barrier.txt index 024ec9c3b3d..bfe1e14ae16 100644 --- a/forge-gui/res/cardsfolder/m/mystic_barrier.txt +++ b/forge-gui/res/cardsfolder/m/mystic_barrier.txt @@ -5,8 +5,8 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChooseDirection | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield or at the beginning of your upkeep, choose left or right. SVar:TrigChooseDirection:AB$ ChooseDirection | Cost$ 0 S:Mode$ CantAttack | DefenderNotNearestToYouInChosenDirection$ True | Description$ Each player may attack only the opponent seated nearest them in the last chosen direction and planeswalkers controlled by that player. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mystic_barrier.jpg Oracle:When Mystic Barrier enters the battlefield or at the beginning of your upkeep, choose left or right.\nEach player may attack only the opponent seated nearest them in the last chosen direction and planeswalkers controlled by that player. diff --git a/forge-gui/res/cardsfolder/m/mystic_compass.txt b/forge-gui/res/cardsfolder/m/mystic_compass.txt index 227f5c8f874..e950568e8c7 100644 --- a/forge-gui/res/cardsfolder/m/mystic_compass.txt +++ b/forge-gui/res/cardsfolder/m/mystic_compass.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact A:AB$ ChooseType | Cost$ 1 T | Defined$ You | Type$ Basic Land | SubAbility$ DBAnimate | SpellDescription$ Target land becomes the basic land type of your choice until end of turn. SVar:DBAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mystic_compass.jpg Oracle:{1}, {T}: Target land becomes the basic land type of your choice until end of turn. diff --git a/forge-gui/res/cardsfolder/m/mystic_confluence.txt b/forge-gui/res/cardsfolder/m/mystic_confluence.txt index 5ecd1b1fa20..08d268c7a92 100644 --- a/forge-gui/res/cardsfolder/m/mystic_confluence.txt +++ b/forge-gui/res/cardsfolder/m/mystic_confluence.txt @@ -5,6 +5,6 @@ A:SP$ Charm | Cost$ 3 U U | Choices$ DBCounter,DBReturn,DBDraw | CharmNum$ 3 | C SVar:DBCounter:DB$ Counter | TargetType$ Spell | ValidTgts$ Card | UnlessCost$ 3 | SpellDescription$ Counter target spell unless its controller pays {3}. SVar:DBReturn:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Return target creature to its owner's hand. SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mystic_confluence.jpg Oracle:Choose three. You may choose the same mode more than once.\n• Counter target spell unless its controller pays {3}.\n• Return target creature to its owner's hand.\n• Draw a card. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/m/mystic_decree.txt b/forge-gui/res/cardsfolder/m/mystic_decree.txt index c3d47e39f79..23c3c679aa7 100644 --- a/forge-gui/res/cardsfolder/m/mystic_decree.txt +++ b/forge-gui/res/cardsfolder/m/mystic_decree.txt @@ -3,6 +3,6 @@ ManaCost:2 U U Types:World Enchantment S:Mode$ Continuous | Affected$ Creature | RemoveKeyword$ Flying & Islandwalk | Description$ All creatures lose flying and islandwalk. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mystic_decree.jpg Oracle:All creatures lose flying and islandwalk. diff --git a/forge-gui/res/cardsfolder/m/mystic_gate.txt b/forge-gui/res/cardsfolder/m/mystic_gate.txt index f1f860338b2..afb0ec1ce17 100644 --- a/forge-gui/res/cardsfolder/m/mystic_gate.txt +++ b/forge-gui/res/cardsfolder/m/mystic_gate.txt @@ -5,6 +5,6 @@ A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ WU T | Produced$ W | Amount$2 | SpellDescription$ Add {W}{W}. A:AB$ Mana | Cost$ WU T | Produced$ W U | SpellDescription$ Add {W}{U}. A:AB$ Mana | Cost$ WU T | Produced$ U | Amount$2 | SpellDescription$ Add {U}{U}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mystic_gate.jpg Oracle:{T}: Add {C}.\n{W/U}, {T}: Add {W}{W}, {W}{U}, or {U}{U}. diff --git a/forge-gui/res/cardsfolder/m/mystic_remora.txt b/forge-gui/res/cardsfolder/m/mystic_remora.txt index a1ad16f64a1..5d2e3dad103 100644 --- a/forge-gui/res/cardsfolder/m/mystic_remora.txt +++ b/forge-gui/res/cardsfolder/m/mystic_remora.txt @@ -4,6 +4,6 @@ Types:Enchantment K:Cumulative upkeep:1 T:Mode$ SpellCast | ValidCard$ Card.nonCreature | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDraw | OptionalDecider$ You | TriggerDescription$ Whenever an opponent casts a noncreature spell, you may draw a card unless that player pays {4}. SVar:TrigDraw:DB$Draw | Defined$ You | UnlessCost$ 4 | UnlessPayer$ TriggeredPlayer | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mystic_remora.jpg Oracle:Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nWhenever an opponent casts a noncreature spell, you may draw a card unless that player pays {4}. diff --git a/forge-gui/res/cardsfolder/m/mystic_retrieval.txt b/forge-gui/res/cardsfolder/m/mystic_retrieval.txt index ed57ec139b1..71092bf24d9 100644 --- a/forge-gui/res/cardsfolder/m/mystic_retrieval.txt +++ b/forge-gui/res/cardsfolder/m/mystic_retrieval.txt @@ -3,7 +3,7 @@ ManaCost:3 U Types:Sorcery K:Flashback:2 R A:SP$ ChangeZone | Cost$ 3 U | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target instant or sorcery card in your graveyard | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | SpellDescription$ Return target instant or sorcery card from your graveyard to your hand. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Red SVar:Picture:http://www.wizards.com/global/images/magic/general/mystic_retrieval.jpg Oracle:Return target instant or sorcery card from your graveyard to your hand.\nFlashback {2}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/m/mystic_veil.txt b/forge-gui/res/cardsfolder/m/mystic_veil.txt index dc73f2bd9c8..1dde205bf4c 100644 --- a/forge-gui/res/cardsfolder/m/mystic_veil.txt +++ b/forge-gui/res/cardsfolder/m/mystic_veil.txt @@ -5,6 +5,6 @@ K:MayFlashSac K:Enchant creature A:SP$ Attach | Cost$ 1 U | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Shroud | Description$ Enchanted creature has shroud. (It can't be the target of spells or abilities.) -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mystic_veil.jpg Oracle:You may cast Mystic Veil as though it had flash. If you cast it any time a sorcery couldn't have been cast, the controller of the permanent it becomes sacrifices it at the beginning of the next cleanup step.\nEnchant creature\nEnchanted creature has shroud. (It can't be the target of spells or abilities.) diff --git a/forge-gui/res/cardsfolder/m/mystical_teachings.txt b/forge-gui/res/cardsfolder/m/mystical_teachings.txt index 6960b18a871..2a9041ed588 100644 --- a/forge-gui/res/cardsfolder/m/mystical_teachings.txt +++ b/forge-gui/res/cardsfolder/m/mystical_teachings.txt @@ -5,6 +5,6 @@ K:Flashback:5 B A:SP$ ChangeZone | Cost$ 3 U | ChangeType$ Instant,Card.hasKeywordFlash | ChangeNum$ 1 | Origin$ Library | Destination$ Hand | Shuffle$ True | SpellDescription$ Search your library for an instant card or a card with flash, reveal it, put it into your hand, then shuffle your library. #TODO: The AI will currently search for the most expensive valid card in the library. This can be used to the AI's advantage with #careful deck design (which is why this card only works in properly designed AI decks). Consider improving tutoring logic with priorities. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mystical_teachings.jpg Oracle:Search your library for an instant card or a card with flash, reveal it, put it into your hand, then shuffle your library.\nFlashback {5}{B} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/m/mystical_tutor.txt b/forge-gui/res/cardsfolder/m/mystical_tutor.txt index b047c52b1cf..5d54e0c5482 100644 --- a/forge-gui/res/cardsfolder/m/mystical_tutor.txt +++ b/forge-gui/res/cardsfolder/m/mystical_tutor.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ ChangeZone | Cost$ U | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Instant,Sorcery | ChangeNum$ 1 | SpellDescription$ Search your library for an instant or sorcery card and reveal that card. Shuffle your library, then put the card on top of it. #TODO: The AI will currently search for the most expensive valid card in the library. This can be used to the AI's advantage with #careful deck design (which is why this card only works in properly designed AI decks). Consider improving tutoring logic with priorities. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/mystical_tutor.jpg Oracle:Search your library for an instant or sorcery card and reveal that card. Shuffle your library, then put the card on top of it. diff --git a/forge-gui/res/cardsfolder/m/myth_unbound.txt b/forge-gui/res/cardsfolder/m/myth_unbound.txt index 3855b57b5b0..c206ac6e92a 100644 --- a/forge-gui/res/cardsfolder/m/myth_unbound.txt +++ b/forge-gui/res/cardsfolder/m/myth_unbound.txt @@ -5,5 +5,5 @@ S:Mode$ ReduceCost | ValidCard$ Card.IsCommander+YouOwn | Type$ Spell | Amount$ T:Mode$ ChangesZoneAll | ValidCard$ Card.IsCommander+YouOwn | Origin$ Any | Destination$ Command | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever your commander is put into the command zone from anywhere, draw a card. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 SVar:AffectedX:Count$CommanderCastFromCommandZone -SVar:RemRandomDeck:True +AI:RemoveDeck:Random Oracle:Your commander costs {1} less to cast for each time it's been cast from the command zone this game.\nWhenever your commander is put into the command zone from anywhere, draw a card. diff --git a/forge-gui/res/cardsfolder/n/nacatl_hunt_pride.txt b/forge-gui/res/cardsfolder/n/nacatl_hunt_pride.txt index b35f71992ea..029bdd54658 100644 --- a/forge-gui/res/cardsfolder/n/nacatl_hunt_pride.txt +++ b/forge-gui/res/cardsfolder/n/nacatl_hunt_pride.txt @@ -5,6 +5,6 @@ PT:5/4 K:Vigilance A:AB$ Pump | Cost$ R T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME can't block. | SpellDescription$ Target creature can't block this turn. A:AB$ Pump | Cost$ G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME blocks each combat if able. | SpellDescription$ Target creature blocks this turn if able. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/nacatl_hunt_pride.jpg Oracle:Vigilance\n{R}, {T}: Target creature can't block this turn.\n{G}, {T}: Target creature blocks this turn if able. diff --git a/forge-gui/res/cardsfolder/n/nacre_talisman.txt b/forge-gui/res/cardsfolder/n/nacre_talisman.txt index 9fd2a621bf4..44f838d9cc1 100644 --- a/forge-gui/res/cardsfolder/n/nacre_talisman.txt +++ b/forge-gui/res/cardsfolder/n/nacre_talisman.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact T:Mode$ SpellCast | ValidCard$ Card.White | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ Whenever a player casts a white spell, you may pay {3}. If you do, untap target permanent. SVar:TrigUntap:AB$Untap | Cost$ 3 | ValidTgts$ Permanent | TgtPrompt$ Select target permanent -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/nacre_talisman.jpg Oracle:Whenever a player casts a white spell, you may pay {3}. If you do, untap target permanent. diff --git a/forge-gui/res/cardsfolder/n/nagao_bound_by_honor.txt b/forge-gui/res/cardsfolder/n/nagao_bound_by_honor.txt index 5c6cfa7efca..a0b5f217641 100644 --- a/forge-gui/res/cardsfolder/n/nagao_bound_by_honor.txt +++ b/forge-gui/res/cardsfolder/n/nagao_bound_by_honor.txt @@ -5,6 +5,6 @@ PT:3/3 K:Bushido:1 T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ Whenever CARDNAME attacks, Samurai creatures you control get +1/+1 until end of turn. SVar:TrigPumpAll:DB$PumpAll | ValidCards$ Creature.Samurai+YouCtrl | NumAtt$ +1 | NumDef$ +1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/nagao_bound_by_honor.jpg Oracle:Bushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.)\nWhenever Nagao, Bound by Honor attacks, Samurai creatures you control get +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/n/nahiri_the_lithomancer.txt b/forge-gui/res/cardsfolder/n/nahiri_the_lithomancer.txt index 71bfd1951a9..bafcae2b4ae 100644 --- a/forge-gui/res/cardsfolder/n/nahiri_the_lithomancer.txt +++ b/forge-gui/res/cardsfolder/n/nahiri_the_lithomancer.txt @@ -12,6 +12,6 @@ A:AB$ Token | Cost$ SubCounter<10/LOYALTY> | Planeswalker$ True | Ultimate$ True SVar:StoneforgedST:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 5 | AddToughness$ 5 | AddKeyword$ Double Strike | Description$ Equipped creature gets +5/+5 and has double strike. DeckHas:Ability$Token DeckNeeds:Type$Equipment -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/nahiri_the_lithomancer.jpg Oracle:[+2]: Create a 1/1 white Kor Soldier creature token. You may attach an Equipment you control to it.\n[-2]: You may put an Equipment card from your hand or graveyard onto the battlefield.\n[-10]: Create a colorless Equipment artifact token named Stoneforged Blade. It has indestructible, "Equipped creature gets +5/+5 and has double strike," and equip {0}.\nNahiri, the Lithomancer can be your commander. diff --git a/forge-gui/res/cardsfolder/n/nahiris_wrath.txt b/forge-gui/res/cardsfolder/n/nahiris_wrath.txt index 6e0746e18ca..1981d880d8a 100644 --- a/forge-gui/res/cardsfolder/n/nahiris_wrath.txt +++ b/forge-gui/res/cardsfolder/n/nahiris_wrath.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ DealDamage | Announce$ X | Cost$ 2 R Discard | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker | TargetMin$ 0 | TargetMax$ X | NumDmg$ Y | References$ X,Y | SpellDescription$ CARDNAME deals damage equal to the total converted mana cost of the discarded cards to each of up to X target creatures and/or planeswalkers. SVar:X:XChoice SVar:Y:Discarded$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/nahiris_wrath.jpg Oracle:As an additional cost to cast Nahiri's Wrath, discard X cards.\nNahiri's Wrath deals damage equal to the total converted mana cost of the discarded cards to each of up to X target creatures and/or planeswalkers. diff --git a/forge-gui/res/cardsfolder/n/naked_singularity.txt b/forge-gui/res/cardsfolder/n/naked_singularity.txt index c48b8005e21..9da248d9f55 100644 --- a/forge-gui/res/cardsfolder/n/naked_singularity.txt +++ b/forge-gui/res/cardsfolder/n/naked_singularity.txt @@ -13,7 +13,7 @@ R:Event$ ProduceMana | ActiveZones$ Battlefield | ValidCard$ Mountain | ManaRepl SVar:ProduceU:C->U & B->U & G->U & R->U & W->U R:Event$ ProduceMana | ActiveZones$ Battlefield | ValidCard$ Forest | ManaReplacement$ ProduceB | Secondary$ True | Description$ If tapped for mana, Forests produce B. SVar:ProduceB:C->B & G->B & U->B & R->B & W->B -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/naked_singularity.jpg Oracle:Cumulative upkeep {3} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nIf tapped for mana, Plains produce {R}, Islands produce {G}, Swamps produce {W}, Mountains produce {U}, and Forests produce {B} instead of any other type. diff --git a/forge-gui/res/cardsfolder/n/nalathni_dragon.txt b/forge-gui/res/cardsfolder/n/nalathni_dragon.txt index 6b0acfb3093..b239efb25c0 100644 --- a/forge-gui/res/cardsfolder/n/nalathni_dragon.txt +++ b/forge-gui/res/cardsfolder/n/nalathni_dragon.txt @@ -6,6 +6,6 @@ K:Flying K:Banding A:AB$ Pump | Cost$ R | NumAtt$ +1 | ActivationNumberSacrifice$ GE4 | ActivationResolveSub$ DBPump | SpellDescription$ CARDNAME gets +1/+0 until end of turn. If this ability has been activated four or more times this turn, sacrifice CARDNAME at the beginning of the next end step. SVar:DBPump:DB$ Pump | AtEOT$ Sacrifice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/nalathni_dragon.jpg Oracle:Flying, banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.)\n{R}: Nalathni Dragon gets +1/+0 until end of turn. If this ability has been activated four or more times this turn, sacrifice Nalathni Dragon at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/n/nameless_one.txt b/forge-gui/res/cardsfolder/n/nameless_one.txt index ea10b68334a..b897f8925ec 100644 --- a/forge-gui/res/cardsfolder/n/nameless_one.txt +++ b/forge-gui/res/cardsfolder/n/nameless_one.txt @@ -7,7 +7,7 @@ S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ SVar:X:Count$Valid Wizard SVar:Y:Count$Valid Card.Self+faceUp SVar:BuffedBy:Wizard -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NoZeroToughnessAI:True SVar:Picture:http://www.wizards.com/global/images/magic/general/nameless_one.jpg Oracle:Nameless One's power and toughness are each equal to the number of Wizards on the battlefield.\nMorph {2}{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.) diff --git a/forge-gui/res/cardsfolder/n/nameless_race.txt b/forge-gui/res/cardsfolder/n/nameless_race.txt index 08b5df65dbe..f154a9f0b68 100644 --- a/forge-gui/res/cardsfolder/n/nameless_race.txt +++ b/forge-gui/res/cardsfolder/n/nameless_race.txt @@ -12,7 +12,7 @@ SVar:Limit:SVar$Active/Plus.Buried SVar:Active:Count$Valid Permanent.White+nonToken+OppCtrl SVar:Buried:Count$ValidGraveyard Card.White+OppCtrl SVar:LifePaidOnETB:Number$0 -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/nameless_race.jpg Oracle:Trample\nAs Nameless Race enters the battlefield, pay any amount of life. The amount you pay can't be more than the total number of white nontoken permanents your opponents control plus the total number of white cards in their graveyards.\nNameless Race's power and toughness are each equal to the life paid as it entered the battlefield. diff --git a/forge-gui/res/cardsfolder/n/nantuko_cultivator.txt b/forge-gui/res/cardsfolder/n/nantuko_cultivator.txt index 0856353a87c..f3b87159cbd 100644 --- a/forge-gui/res/cardsfolder/n/nantuko_cultivator.txt +++ b/forge-gui/res/cardsfolder/n/nantuko_cultivator.txt @@ -9,6 +9,6 @@ SVar:DBNantukoDraw:DB$ Draw | NumCards$ NantukoY | References$ NantukoY | SubAbi SVar:DBNantukoCleanup:DB$ Cleanup | ClearRemembered$ True SVar:NantukoX:Count$TypeInYourHand.Land SVar:NantukoY:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/nantuko_cultivator.jpg Oracle:When Nantuko Cultivator enters the battlefield, you may discard any number of land cards. Put that many +1/+1 counters on Nantuko Cultivator and draw that many cards. diff --git a/forge-gui/res/cardsfolder/n/nantuko_mentor.txt b/forge-gui/res/cardsfolder/n/nantuko_mentor.txt index 2c9f53844bc..34cf116c048 100644 --- a/forge-gui/res/cardsfolder/n/nantuko_mentor.txt +++ b/forge-gui/res/cardsfolder/n/nantuko_mentor.txt @@ -4,6 +4,6 @@ Types:Creature Insect Druid PT:1/1 A:AB$ Pump | Cost$ 2 G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ X | NumDef$ X | References$ X | SpellDescription$ Target creature gets +X/+X until end of turn, where X is that creature's power. SVar:X:Targeted$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/nantuko_mentor.jpg Oracle:{2}{G}, {T}: Target creature gets +X/+X until end of turn, where X is that creature's power. diff --git a/forge-gui/res/cardsfolder/n/nantuko_monastery.txt b/forge-gui/res/cardsfolder/n/nantuko_monastery.txt index dc573a26b03..107f865a0cf 100644 --- a/forge-gui/res/cardsfolder/n/nantuko_monastery.txt +++ b/forge-gui/res/cardsfolder/n/nantuko_monastery.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Animate | Cost$ G W | Activation$ Threshold | Defined$ Self | Power$ 4 | Toughness$ 4 | Types$ Creature,Insect,Monk | Colors$ Green,White | Keywords$ First Strike | SpellDescription$ CARDNAME becomes a 4/4 green and white Insect Monk creature with first strike until end of turn. It's still a land. Activate this ability only if seven or more cards are in your graveyard. | PrecostDesc$ Threshold — -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/nantuko_monastery.jpg Oracle:{T}: Add {C}.\nThreshold — {G}{W}: Nantuko Monastery becomes a 4/4 green and white Insect Monk creature with first strike until end of turn. It's still a land. Activate this ability only if seven or more cards are in your graveyard. diff --git a/forge-gui/res/cardsfolder/n/nantuko_shrine.txt b/forge-gui/res/cardsfolder/n/nantuko_shrine.txt index d7d68d76990..86cfb398c45 100644 --- a/forge-gui/res/cardsfolder/n/nantuko_shrine.txt +++ b/forge-gui/res/cardsfolder/n/nantuko_shrine.txt @@ -6,6 +6,6 @@ SVar:TrigTokenRem:DB$ Pump | Defined$ TriggeredCard | PumpZone$ Stack | Remember SVar:DBToken:DB$ Token | TokenAmount$ X | TokenName$ Squirrel | TokenTypes$ Creature,Squirrel | TokenOwner$ TriggeredActivator | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | References$ X | SubAbility$ DBCleanup SVar:X:Count$ValidGraveyard Card.sharesNameWith Remembered SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/nantuko_shrine.jpg Oracle:Whenever a player casts a spell, that player creates X 1/1 green Squirrel creature tokens, where X is the number of cards in all graveyards with the same name as that spell. diff --git a/forge-gui/res/cardsfolder/n/narcissism.txt b/forge-gui/res/cardsfolder/n/narcissism.txt index 5f583858eff..7db0155fdc3 100644 --- a/forge-gui/res/cardsfolder/n/narcissism.txt +++ b/forge-gui/res/cardsfolder/n/narcissism.txt @@ -3,6 +3,6 @@ ManaCost:2 G Types:Enchantment A:AB$ Pump | Cost$ G Discard<1/Card> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Target creature gets +2/+2 until end of turn. A:AB$ Pump | Cost$ G Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Target creature gets +2/+2 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/narcissism.jpg Oracle:{G}, Discard a card: Target creature gets +2/+2 until end of turn.\n{G}, Sacrifice Narcissism: Target creature gets +2/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/n/narnam_cobra.txt b/forge-gui/res/cardsfolder/n/narnam_cobra.txt index 1af3d8c146b..bd152cc691b 100644 --- a/forge-gui/res/cardsfolder/n/narnam_cobra.txt +++ b/forge-gui/res/cardsfolder/n/narnam_cobra.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact Creature Snake PT:2/1 A:AB$ Pump | Cost$ G | KW$ Deathtouch | Defined$ Self | SpellDescription$ CARDNAME gains deathtouch until end of turn. (Any amount of damage it deals to a creature is enough to destroy it.) -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/narnam_cobra.jpg Oracle:{G}: Narnam Cobra gains deathtouch until end of turn. (Any amount of damage it deals to a creature is enough to destroy it.) diff --git a/forge-gui/res/cardsfolder/n/natural_affinity.txt b/forge-gui/res/cardsfolder/n/natural_affinity.txt index cfe32729cc4..b42b12a2875 100644 --- a/forge-gui/res/cardsfolder/n/natural_affinity.txt +++ b/forge-gui/res/cardsfolder/n/natural_affinity.txt @@ -2,6 +2,6 @@ Name:Natural Affinity ManaCost:2 G Types:Instant A:SP$ AnimateAll | Cost$ 2 G | ValidCards$ Land | Types$ Creature | Power$ 2 | Toughness$ 2 | SpellDescription$ All lands become 2/2 creatures until end of turn. They're still lands. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/natural_affinity.jpg Oracle:All lands become 2/2 creatures until end of turn. They're still lands. diff --git a/forge-gui/res/cardsfolder/n/natural_emergence.txt b/forge-gui/res/cardsfolder/n/natural_emergence.txt index c6b24eea8af..a8caf430e72 100644 --- a/forge-gui/res/cardsfolder/n/natural_emergence.txt +++ b/forge-gui/res/cardsfolder/n/natural_emergence.txt @@ -5,7 +5,7 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigBounce:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Hidden$ True | ChangeType$ Enchantment.YouCtrl+Red,Enchantment.YouCtrl+Green | ChangeNum$ 1 | Mandatory$ True | AILogic$ NeverBounceItself S:Mode$ Continuous | Affected$ Land.YouCtrl | SetPower$ 2 | SetToughness$ 2 | AddType$ Creature | AddKeyword$ First Strike | Description$ Lands you control are 2/2 creatures with first strike. They're still lands. SVar:NeedsToPlay:Enchantment.Red+YouCtrl,Enchantment.Green+YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True DeckNeeds:Type$Enchantment SVar:Picture:http://www.wizards.com/global/images/magic/general/natural_emergence.jpg diff --git a/forge-gui/res/cardsfolder/n/natural_selection.txt b/forge-gui/res/cardsfolder/n/natural_selection.txt index 7bd9c79bf4f..c6aac13b557 100644 --- a/forge-gui/res/cardsfolder/n/natural_selection.txt +++ b/forge-gui/res/cardsfolder/n/natural_selection.txt @@ -2,6 +2,6 @@ Name:Natural Selection ManaCost:G Types:Instant A:SP$ RearrangeTopOfLibrary | Cost$ G | ValidTgts$ Player | TgtPrompt$ Choose target player. | NumCards$ 3 | MayShuffle$ True | SpellDescription$ Look at the top 3 cards of target player's library and put them back in any order. You may have that player shuffle their library. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/natural_selection.jpg Oracle:Look at the top three cards of target player's library, then put them back in any order. You may have that player shuffle their library. diff --git a/forge-gui/res/cardsfolder/n/natures_blessing.txt b/forge-gui/res/cardsfolder/n/natures_blessing.txt index 7c749aa5cf3..b3271e1113f 100644 --- a/forge-gui/res/cardsfolder/n/natures_blessing.txt +++ b/forge-gui/res/cardsfolder/n/natures_blessing.txt @@ -6,7 +6,7 @@ SVar:DBPutCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ P1P1 | Count SVar:DBBanding:DB$ Pump | Defined$ Targeted | KW$ Banding | Permanent$ True | SpellDescription$ Target creature gains Banding SVar:DBFirstStrike:DB$ Pump | Defined$ Targeted | KW$ First Strike | Permanent$ True | SpellDescription$ Target creature gains First Strike SVar:DBTrample:DB$ Pump | Defined$ Targeted | KW$ Trample | Permanent$ True | SpellDescription$ Target creature gains Trample -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/natures_blessing.jpg Oracle:{G}{W}, Discard a card: Put a +1/+1 counter on target creature or that creature gains banding, first strike, or trample. (This effect lasts indefinitely. Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding a player controls are blocking or being blocked by a creature, that player divides that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/n/natures_chosen.txt b/forge-gui/res/cardsfolder/n/natures_chosen.txt index 30b3dd91c22..1c4a3e91601 100644 --- a/forge-gui/res/cardsfolder/n/natures_chosen.txt +++ b/forge-gui/res/cardsfolder/n/natures_chosen.txt @@ -5,6 +5,6 @@ K:Enchant creature you control A:SP$ Attach | Cost$ G | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | AILogic$ Pump A:AB$ Untap | Cost$ 0 | Defined$ Enchanted | ActivationLimit$ 1 | PlayerTurn$ True | SpellDescription$ Untap enchanted creature. Activate this ability only during your turn and only once each turn. A:AB$ Untap | Cost$ tapXType<1/Creature.AttachedBy+White> | CostDesc$ Tap enchanted creature: | ValidTgts$ Artifact,Creature,Land | TgtPrompt$ Select target artifact, creature, or land | ActivationLimit$ 1 | SpellDescription$ Untap target artifact, creature, or land. Activate this ability only if enchanted creature is white and is untapped and only once each turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/natures_chosen.jpg Oracle:Enchant creature you control\n{0}: Untap enchanted creature. Activate this ability only during your turn and only once each turn.\nTap enchanted creature: Untap target artifact, creature, or land. Activate this ability only if enchanted creature is white and is untapped and only once each turn. diff --git a/forge-gui/res/cardsfolder/n/natures_cloak.txt b/forge-gui/res/cardsfolder/n/natures_cloak.txt index 327ae6562ef..05045f799f9 100644 --- a/forge-gui/res/cardsfolder/n/natures_cloak.txt +++ b/forge-gui/res/cardsfolder/n/natures_cloak.txt @@ -2,6 +2,6 @@ Name:Nature's Cloak ManaCost:2 G Types:Sorcery A:SP$ PumpAll | Cost$ 2 G | ValidCards$ Creature.Green+YouCtrl | KW$ Forestwalk | SpellDescription$ Green creatures you control gain forestwalk until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal/natures_cloak.jpg Oracle:Green creatures you control gain forestwalk until end of turn (They can't be blocked as long as defending player controls a Forest). diff --git a/forge-gui/res/cardsfolder/n/natures_revolt.txt b/forge-gui/res/cardsfolder/n/natures_revolt.txt index 546f43814df..659b9199891 100644 --- a/forge-gui/res/cardsfolder/n/natures_revolt.txt +++ b/forge-gui/res/cardsfolder/n/natures_revolt.txt @@ -3,6 +3,6 @@ ManaCost:3 G G Types:Enchantment S:Mode$ Continuous | Affected$ Land | SetPower$ 2 | SetToughness$ 2 | AddType$ Creature | Description$ All lands are 2/2 creatures that are still lands. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/natures_revolt.jpg Oracle:All lands are 2/2 creatures that are still lands. diff --git a/forge-gui/res/cardsfolder/n/natures_ruin.txt b/forge-gui/res/cardsfolder/n/natures_ruin.txt index 476f964b80c..fad6ca676d8 100644 --- a/forge-gui/res/cardsfolder/n/natures_ruin.txt +++ b/forge-gui/res/cardsfolder/n/natures_ruin.txt @@ -2,6 +2,6 @@ Name:Nature's Ruin ManaCost:2 B Types:Sorcery A:SP$ DestroyAll | Cost$ 2 B | ValidCards$ Creature.Green | SpellDescription$ Destroy all green creatures. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://serv4.tcgimages.eu/img/cards/Portal/natures_ruin.jpg Oracle:Destroy all green creatures. diff --git a/forge-gui/res/cardsfolder/n/natures_wrath.txt b/forge-gui/res/cardsfolder/n/natures_wrath.txt index a852b9d4c83..9de69085eb7 100644 --- a/forge-gui/res/cardsfolder/n/natures_wrath.txt +++ b/forge-gui/res/cardsfolder/n/natures_wrath.txt @@ -7,6 +7,6 @@ SVar:TrigSacrificeBlue:DB$ Sacrifice | Defined$ TriggeredCardController | SacVal T:Mode$ ChangesZone | ValidCard$ Swamp,Card.Black | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigSacrificeBlack | TriggerDescription$ Whenever a player puts an Swamp or black permanent onto the battlefield, they sacrifice an Swamp or black permanent. SVar:TrigSacrificeBlack:DB$ Sacrifice | Defined$ TriggeredCardController | SacValid$ Swamp,Card.Black | SacMessage$ Swamp or a black permanent SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/natures_wrath.jpg Oracle:At the beginning of your upkeep, sacrifice Nature's Wrath unless you pay {G}.\nWhenever a player puts an Island or blue permanent onto the battlefield, they sacrifice an Island or blue permanent.\nWhenever a player puts a Swamp or black permanent onto the battlefield, they sacrifice a Swamp or black permanent. diff --git a/forge-gui/res/cardsfolder/n/naya_soulbeast.txt b/forge-gui/res/cardsfolder/n/naya_soulbeast.txt index 4a472e3ea71..fca6ef0be87 100644 --- a/forge-gui/res/cardsfolder/n/naya_soulbeast.txt +++ b/forge-gui/res/cardsfolder/n/naya_soulbeast.txt @@ -11,6 +11,6 @@ SVar:SoulbestETB:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Batt SVar:SoulbestCounters:DB$ PutCounter | ETB$ True | Defined$ Self | CounterType$ P1P1 | CounterNum$ X | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$CardManaCost -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/naya_soulbeast.jpg Oracle:Trample\nWhen you cast Naya Soulbeast, each player reveals the top card of their library. Naya Soulbeast enters the battlefield with X +1/+1 counters on it, where X is the total converted mana cost of all cards revealed this way. diff --git a/forge-gui/res/cardsfolder/n/near_death_experience.txt b/forge-gui/res/cardsfolder/n/near_death_experience.txt index 4c0c4f4503c..a1be2a982a6 100644 --- a/forge-gui/res/cardsfolder/n/near_death_experience.txt +++ b/forge-gui/res/cardsfolder/n/near_death_experience.txt @@ -3,6 +3,6 @@ ManaCost:2 W W W Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | LifeTotal$ You | LifeAmount$ EQ1 | TriggerZones$ Battlefield | Execute$ TrigWin | TriggerDescription$ At the beginning of your upkeep, if you have exactly 1 life, you win the game. SVar:TrigWin:DB$WinsGame | Defined$ You -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/near_death_experience.jpg Oracle:At the beginning of your upkeep, if you have exactly 1 life, you win the game. diff --git a/forge-gui/res/cardsfolder/n/nebuchadnezzar.txt b/forge-gui/res/cardsfolder/n/nebuchadnezzar.txt index c0ffb0603a4..8e4615b07fc 100644 --- a/forge-gui/res/cardsfolder/n/nebuchadnezzar.txt +++ b/forge-gui/res/cardsfolder/n/nebuchadnezzar.txt @@ -7,6 +7,6 @@ SVar:DBReveal:DB$ Reveal | ValidTgts$ Opponent | Random$ True | NumCards$ X | Re SVar:DBDiscard:DB$ Discard | DefinedCards$ ValidHand Card.IsRemembered+NamedCard | Defined$ Targeted | Mode$ Defined | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/nebuchadnezzar.jpg Oracle:{X}, {T}: Choose a card name. Target opponent reveals X cards at random from their hand. Then that player discards all cards with that name revealed this way. Activate this ability only during your turn. diff --git a/forge-gui/res/cardsfolder/n/necra_sanctuary.txt b/forge-gui/res/cardsfolder/n/necra_sanctuary.txt index deb132c7a19..c47d30ff976 100644 --- a/forge-gui/res/cardsfolder/n/necra_sanctuary.txt +++ b/forge-gui/res/cardsfolder/n/necra_sanctuary.txt @@ -8,6 +8,6 @@ SVar:Y:Count$Valid Permanent.Green+YouCtrl/LimitMax.1 SVar:Z:Count$Valid Permanent.White+YouCtrl/LimitMax.1 SVar:X:SVar$Y/Plus.Z DeckHints:Color$White|Green -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/necra_sanctuary.jpg Oracle:At the beginning of your upkeep, if you control a green or white permanent, target player loses 1 life. If you control a green permanent and a white permanent, that player loses 3 life instead. diff --git a/forge-gui/res/cardsfolder/n/necravolver.txt b/forge-gui/res/cardsfolder/n/necravolver.txt index a2075b1d36a..3a5d7ed9c73 100644 --- a/forge-gui/res/cardsfolder/n/necravolver.txt +++ b/forge-gui/res/cardsfolder/n/necravolver.txt @@ -12,7 +12,7 @@ SVar:VolverLife:DB$ Animate | Defined$ Self | Triggers$ PseudoLifelink | sVars$ SVar:PseudoLifelink:Mode$ DamageDealtOnce | ValidSource$ Card.Self | Execute$ VolverTrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage, you gain that much life. SVar:VolverTrigGain:DB$ GainLife | Defined$ You | LifeAmount$ VolverX | References$ VolverX SVar:VolverX:TriggerCount$DamageAmount -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Green|White DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/necravolver.jpg diff --git a/forge-gui/res/cardsfolder/n/necrogen_mists.txt b/forge-gui/res/cardsfolder/n/necrogen_mists.txt index 18e7db5add2..7a77a4ed50e 100644 --- a/forge-gui/res/cardsfolder/n/necrogen_mists.txt +++ b/forge-gui/res/cardsfolder/n/necrogen_mists.txt @@ -3,6 +3,6 @@ ManaCost:2 B Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ At the beginning of each player's upkeep, that player discards a card. SVar:TrigDiscard:DB$Discard | Defined$ TriggeredPlayer | NumCards$ 1 | Mode$ TgtChoose -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/necrogen_mists.jpg Oracle:At the beginning of each player's upkeep, that player discards a card. diff --git a/forge-gui/res/cardsfolder/n/necrogen_spellbomb.txt b/forge-gui/res/cardsfolder/n/necrogen_spellbomb.txt index b383f66b19c..b0d9485a8ef 100644 --- a/forge-gui/res/cardsfolder/n/necrogen_spellbomb.txt +++ b/forge-gui/res/cardsfolder/n/necrogen_spellbomb.txt @@ -3,6 +3,6 @@ ManaCost:1 Types:Artifact A:AB$ Discard | Cost$ B Sac<1/CARDNAME> | ValidTgts$ Player | NumCards$ 1 | Mode$ TgtChoose | SpellDescription$ Target player discards a card. A:AB$ Draw | Cost$ 1 Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/necrogen_spellbomb.jpg Oracle:{B}, Sacrifice Necrogen Spellbomb: Target player discards a card.\n{1}, Sacrifice Necrogen Spellbomb: Draw a card. diff --git a/forge-gui/res/cardsfolder/n/necrogenesis.txt b/forge-gui/res/cardsfolder/n/necrogenesis.txt index d46d63248ca..293f98df8af 100644 --- a/forge-gui/res/cardsfolder/n/necrogenesis.txt +++ b/forge-gui/res/cardsfolder/n/necrogenesis.txt @@ -3,7 +3,7 @@ ManaCost:B G Types:Enchantment A:AB$ ChangeZone | Cost$ 2 | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Creature | TgtPrompt$ Select target creature from a graveyard | SubAbility$ DBToken | SpellDescription$ Exile target creature card from a graveyard. Create a 1/1 green Saproling creature token. SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | TokenImage$ g 1 1 saproling ALA -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHas:Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/necrogenesis.jpg Oracle:{2}: Exile target creature card from a graveyard. Create a 1/1 green Saproling creature token. diff --git a/forge-gui/res/cardsfolder/n/necromancers_stockpile.txt b/forge-gui/res/cardsfolder/n/necromancers_stockpile.txt index fc1668e191e..31244590ddf 100644 --- a/forge-gui/res/cardsfolder/n/necromancers_stockpile.txt +++ b/forge-gui/res/cardsfolder/n/necromancers_stockpile.txt @@ -4,7 +4,7 @@ Types:Enchantment A:AB$ Draw | Cost$ 1 B Discard<1/Creature> | NumCards$ 1 | SubAbility$ DBToken | SpellDescription$ Draw a card. If the discarded card was a Zombie card, create a tapped 2/2 black Zombie creature token. SVar:DBToken:DB$ Token | TokenName$ Zombie | TokenColors$ Black | TokenTypes$ Creature,Zombie | TokenPower$ 2 | TokenToughness$ 2 | TokenImage$ b 2 2 zombie M15 | TokenOwner$ You | TokenAmount$ 1 | TokenTapped$ True | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | References$ X SVar:X:Discarded$Valid Card.Zombie -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/necromancers_stockpile.jpg Oracle:{1}{B}, Discard a creature card: Draw a card. If the discarded card was a Zombie card, create a tapped 2/2 black Zombie creature token. diff --git a/forge-gui/res/cardsfolder/n/necroplasm.txt b/forge-gui/res/cardsfolder/n/necroplasm.txt index 3d8662c1f90..50aab2d4626 100644 --- a/forge-gui/res/cardsfolder/n/necroplasm.txt +++ b/forge-gui/res/cardsfolder/n/necroplasm.txt @@ -8,6 +8,6 @@ T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefiel SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 SVar:TrigDestroy:DB$DestroyAll | ValidCards$ Creature.cmcEQX | References$ X SVar:X:Count$CardCounters.P1P1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/necroplasm.jpg Oracle:At the beginning of your upkeep, put a +1/+1 counter on Necroplasm.\nAt the beginning of your end step, destroy each creature with converted mana cost equal to the number of +1/+1 counters on Necroplasm.\nDredge 2 (If you would draw a card, instead you may put exactly two cards from the top of your library into your graveyard. If you do, return this card from your graveyard to your hand. Otherwise, draw a card.) diff --git a/forge-gui/res/cardsfolder/n/necropotence.txt b/forge-gui/res/cardsfolder/n/necropotence.txt index 671103b8c0c..9ceb6cd641f 100644 --- a/forge-gui/res/cardsfolder/n/necropotence.txt +++ b/forge-gui/res/cardsfolder/n/necropotence.txt @@ -9,7 +9,7 @@ SVar:DelayedReturn:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Valid SVar:TrigReturn:DB$ ChangeZone | Origin$ Exile | Destination$ Hand | Defined$ DelayTriggerRemembered SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:AICastPreference:NeverCastIfLifeBelow$ 7 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/necropotence.jpg Oracle:Skip your draw step.\nWhenever you discard a card, exile that card from your graveyard.\nPay 1 life: Exile the top card of your library face down. Put that card into your hand at the beginning of your next end step. diff --git a/forge-gui/res/cardsfolder/n/necropotence_avatar.txt b/forge-gui/res/cardsfolder/n/necropotence_avatar.txt index 142b51bb545..a0232b9992f 100644 --- a/forge-gui/res/cardsfolder/n/necropotence_avatar.txt +++ b/forge-gui/res/cardsfolder/n/necropotence_avatar.txt @@ -10,5 +10,5 @@ SVar:DBLoseLife:DB$LoseLife | Defined$ You | LifeAmount$ X | References$ X SVar:X:Count$CardCounters.DEATH SVar:Turns:Count$TotalTurns SVar:Picture:https://downloads.cardforge.org/images/cards/VAN/Necropotence Avatar.full.jpg -SVar:RemAIDeck:True +AI:RemoveDeck:All Oracle:Hand +0, life +4\nSkip your draw step.\nAt the beginning of your end step, if it's not the first turn of the game, put a death counter on Necropotence Avatar. You draw X cards and you lose X life, where X is the number of death counters on Necropotence Avatar. diff --git a/forge-gui/res/cardsfolder/n/necrotic_plague.txt b/forge-gui/res/cardsfolder/n/necrotic_plague.txt index b1b379173d8..f05fab0c00f 100644 --- a/forge-gui/res/cardsfolder/n/necrotic_plague.txt +++ b/forge-gui/res/cardsfolder/n/necrotic_plague.txt @@ -11,6 +11,6 @@ SVar:TrigChoose:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Choose a creature yo SVar:DBChange:DB$ ChangeZone | Defined$ Self | Origin$ Graveyard | Destination$ Battlefield | AttachedTo$ ParentTarget SVar:NeedsToPlayVar:Z GE3 SVar:Z:Count$Valid Creature.OppCtrl+inZoneBattlefield -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/necrotic_plague.jpg Oracle:Enchant creature\nEnchanted creature has "At the beginning of your upkeep, sacrifice this creature."\nWhen enchanted creature dies, its controller chooses target creature one of their opponents controls. Return Necrotic Plague from its owner's graveyard to the battlefield attached to that creature. diff --git a/forge-gui/res/cardsfolder/n/nectar_faerie.txt b/forge-gui/res/cardsfolder/n/nectar_faerie.txt index e752d059908..ddf5f52ebe5 100644 --- a/forge-gui/res/cardsfolder/n/nectar_faerie.txt +++ b/forge-gui/res/cardsfolder/n/nectar_faerie.txt @@ -4,6 +4,6 @@ Types:Creature Faerie Wizard PT:1/1 K:Flying A:AB$ Pump | Cost$ B T | ValidTgts$ Faerie,Elf | TgtPrompt$ Select target Faerie or Elf | KW$ Lifelink | SpellDescription$ Target Faerie or Elf gains lifelink until end of turn. (Damage dealt by the creature also causes its controller to gain that much life.) -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/nectar_faerie.jpg Oracle:Flying\n{B}, {T}: Target Faerie or Elf gains lifelink until end of turn. (Damage dealt by the creature also causes its controller to gain that much life.) diff --git a/forge-gui/res/cardsfolder/n/need_for_speed.txt b/forge-gui/res/cardsfolder/n/need_for_speed.txt index baefee64ee0..eb28617b807 100644 --- a/forge-gui/res/cardsfolder/n/need_for_speed.txt +++ b/forge-gui/res/cardsfolder/n/need_for_speed.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Enchantment A:AB$ Pump | Cost$ Sac<1/Land> | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Haste | SpellDescription$ Target creature gains haste until end of turn. SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/need_for_speed.jpg Oracle:Sacrifice a land: Target creature gains haste until end of turn. diff --git a/forge-gui/res/cardsfolder/n/nefarious_lich.txt b/forge-gui/res/cardsfolder/n/nefarious_lich.txt index c8e75b7ee9a..cc2f9fc5cfa 100644 --- a/forge-gui/res/cardsfolder/n/nefarious_lich.txt +++ b/forge-gui/res/cardsfolder/n/nefarious_lich.txt @@ -13,7 +13,7 @@ SVar:Draw:DB$ Draw | Defined$ You | NumCards$ Y | References$ Y SVar:Y:ReplaceCount$LifeGained T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | TriggerController$ TriggeredCardController | Execute$ TrigLose | TriggerDescription$ When CARDNAME leaves the battlefield, you lose the game. SVar:TrigLose:DB$ LosesGame | Defined$ You -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/nefarious_lich.jpg Oracle:If damage would be dealt to you, exile that many cards from your graveyard instead. If you can't, you lose the game.\nIf you would gain life, draw that many cards instead.\nWhen Nefarious Lich leaves the battlefield, you lose the game. diff --git a/forge-gui/res/cardsfolder/n/nekrataal_avatar.txt b/forge-gui/res/cardsfolder/n/nekrataal_avatar.txt index 3521b2f7e3c..79383ca4b75 100644 --- a/forge-gui/res/cardsfolder/n/nekrataal_avatar.txt +++ b/forge-gui/res/cardsfolder/n/nekrataal_avatar.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Vanguard HandLifeModifier:-1/-4 S:Mode$ ReduceCost | EffectZone$ Command | ValidCard$ Creature | Type$ Spell | Activator$ You | Amount$ 1 | Color$ B | Description$ Creature spells you cast cost {B} less to cast. This effect reduces only the amount of colored mana you pay. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:https://downloads.cardforge.org/images/cards/VAN/Nekrataal Avatar.full.jpg Oracle:Hand -1, life -4\nCreature spells you cast cost {B} less to cast. This effect reduces only the amount of colored mana you pay. diff --git a/forge-gui/res/cardsfolder/n/nemata_grove_guardian.txt b/forge-gui/res/cardsfolder/n/nemata_grove_guardian.txt index 14d5bd35aaf..e21c022e5a5 100644 --- a/forge-gui/res/cardsfolder/n/nemata_grove_guardian.txt +++ b/forge-gui/res/cardsfolder/n/nemata_grove_guardian.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Treefolk PT:4/5 A:AB$ Token | Cost$ 2 G | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Create a 1/1 green Saproling creature token. A:AB$ PumpAll | Cost$ Sac<1/Saproling> | ValidCards$ Creature.Saproling | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Saproling creatures get +1/+1 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHints:Type$Fungus DeckHas:Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/nemata_grove_guardian.jpg diff --git a/forge-gui/res/cardsfolder/n/nether_void.txt b/forge-gui/res/cardsfolder/n/nether_void.txt index e45ee831e2e..2cea1da1be1 100644 --- a/forge-gui/res/cardsfolder/n/nether_void.txt +++ b/forge-gui/res/cardsfolder/n/nether_void.txt @@ -3,7 +3,7 @@ ManaCost:3 B Types:World Enchantment T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigCounter | TriggerDescription$ Whenever a player casts a spell, counter it unless that player pays {3}. SVar:TrigCounter:DB$ Counter | UnlessCost$ 3 | Defined$ TriggeredSpellAbility | UnlessPayer$ TriggeredCardController -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:AI_SpellsNeedExtraMana:3 SVar:Picture:http://www.wizards.com/global/images/magic/general/nether_void.jpg Oracle:Whenever a player casts a spell, counter it unless that player pays {3}. diff --git a/forge-gui/res/cardsfolder/n/nettling_imp.txt b/forge-gui/res/cardsfolder/n/nettling_imp.txt index 57bca293ee5..8e52355e6ec 100644 --- a/forge-gui/res/cardsfolder/n/nettling_imp.txt +++ b/forge-gui/res/cardsfolder/n/nettling_imp.txt @@ -5,6 +5,6 @@ PT:1/1 A:AB$ Pump | Cost$ T | ValidTgts$ Creature.nonWall+ActivePlayerCtrl+notFirstTurnControlled | TgtPrompt$ Select target non-Wall creature the active player has controlled continuously since the beginning of the turn. | ActivationPhases$ Upkeep->BeginCombat | OpponentTurn$ True | KW$ HIDDEN CARDNAME attacks each combat if able. | SubAbility$ DestroyPacifist | SpellDescription$ Choose target non-Wall creature the active player has controlled continuously since the beginning of the turn. That creature attacks this turn if able. Destroy it at the beginning of the next end step if it didn't attack this turn. Activate this ability only during an opponent's turn, before attackers are declared. SVar:DestroyPacifist:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | RememberObjects$ ParentTarget | Execute$ TrigDestroy | TriggerDescription$ At the beginning of the end step, destroy that creature if it didn't attack this turn. SVar:TrigDestroy:DB$ Destroy | Defined$ DelayTriggerRemembered | ConditionDefined$ DelayTriggerRemembered | ConditionPresent$ Creature.notAttackedThisTurn | ConditionCompare$ GE1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/nettling_imp.jpg Oracle:{T}: Choose target non-Wall creature the active player has controlled continuously since the beginning of the turn. That creature attacks this turn if able. Destroy it at the beginning of the next end step if it didn't attack this turn. Activate this ability only during an opponent's turn, before attackers are declared. diff --git a/forge-gui/res/cardsfolder/n/neurok_replica.txt b/forge-gui/res/cardsfolder/n/neurok_replica.txt index 284fbcfbddd..a3cea138885 100644 --- a/forge-gui/res/cardsfolder/n/neurok_replica.txt +++ b/forge-gui/res/cardsfolder/n/neurok_replica.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact Creature Wizard PT:1/4 A:AB$ ChangeZone | Cost$ 1 U Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/neurok_replica.jpg Oracle:{1}{U}, Sacrifice Neurok Replica: Return target creature to its owner's hand. diff --git a/forge-gui/res/cardsfolder/n/neurok_transmuter.txt b/forge-gui/res/cardsfolder/n/neurok_transmuter.txt index 2eb00f173bc..cb339684049 100644 --- a/forge-gui/res/cardsfolder/n/neurok_transmuter.txt +++ b/forge-gui/res/cardsfolder/n/neurok_transmuter.txt @@ -4,6 +4,6 @@ Types:Creature Human Wizard PT:2/2 A:AB$ Animate | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Types$ Artifact | SpellDescription$ Target creature becomes an artifact in addition to its other types until end of turn. A:AB$ Animate | Cost$ U | ValidTgts$ Creature.Artifact | TgtPrompt$ Select target artifact creature | Colors$ Blue | OverwriteColors$ True | RemoveTypes$ Artifact | SpellDescription$ Until end of turn, target artifact creature becomes blue and isn't an artifact. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/neurok_transmuter.jpg Oracle:{U}: Target creature becomes an artifact in addition to its other types until end of turn.\n{U}: Until end of turn, target artifact creature becomes blue and isn't an artifact. diff --git a/forge-gui/res/cardsfolder/n/neverending_torment.txt b/forge-gui/res/cardsfolder/n/neverending_torment.txt index 09114c33b9b..eda52ce178a 100644 --- a/forge-gui/res/cardsfolder/n/neverending_torment.txt +++ b/forge-gui/res/cardsfolder/n/neverending_torment.txt @@ -4,6 +4,6 @@ Types:Sorcery K:Epic A:SP$ ChangeZone | Cost$ 4 B B | Origin$ Library | Destination$ Exile | ValidTgts$ Player | ChangeType$ Card | ChangeNum$ X | References$ X | IsCurse$ True | SpellDescription$ Search target player's library for X cards, where X is the number of cards in your hand, and exile it. Then that player shuffles their library. SVar:X:Count$InYourHand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/neverending_torment.jpg Oracle:Search target player's library for X cards, where X is the number of cards in your hand, and exile them. Then that player shuffles their library.\nEpic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability. You may choose a new target for the copy.) diff --git a/forge-gui/res/cardsfolder/n/nevermore.txt b/forge-gui/res/cardsfolder/n/nevermore.txt index 2fa972de973..d599ca2607d 100644 --- a/forge-gui/res/cardsfolder/n/nevermore.txt +++ b/forge-gui/res/cardsfolder/n/nevermore.txt @@ -4,6 +4,6 @@ Types:Enchantment K:ETBReplacement:Other:DBNameCard SVar:DBNameCard:DB$ NameCard | Defined$ You | ValidCards$ Card.nonLand | ValidDesc$ nonland | SpellDescription$ As CARDNAME enters the battlefield, choose a nonland card name. S:Mode$ CantBeCast | ValidCard$ Card.NamedCard | Description$ Spells with the chosen name can't be cast. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/nevermore.jpg Oracle:As Nevermore enters the battlefield, choose a nonland card name.\nSpells with the chosen name can't be cast. diff --git a/forge-gui/res/cardsfolder/n/new_frontiers.txt b/forge-gui/res/cardsfolder/n/new_frontiers.txt index 60d050d7c52..bf6df9fb5d7 100644 --- a/forge-gui/res/cardsfolder/n/new_frontiers.txt +++ b/forge-gui/res/cardsfolder/n/new_frontiers.txt @@ -3,6 +3,6 @@ ManaCost:X G Types:Sorcery A:SP$ ChangeZone | Optional$ True | Cost$ X G | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | DefinedPlayer$ Player | ChangeNum$ X | Tapped$ True | References$ X | Shuffle$ True | SpellDescription$ Each player may search their library for up to X basic land cards and put them onto the battlefield tapped. Then each player who searched their library this way shuffles it. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/new_frontiers.jpg Oracle:Each player may search their library for up to X basic land cards and put them onto the battlefield tapped. Then each player who searched their library this way shuffles it. diff --git a/forge-gui/res/cardsfolder/n/nezumi_bone_reader.txt b/forge-gui/res/cardsfolder/n/nezumi_bone_reader.txt index 7019d397b16..2e07b247e2b 100644 --- a/forge-gui/res/cardsfolder/n/nezumi_bone_reader.txt +++ b/forge-gui/res/cardsfolder/n/nezumi_bone_reader.txt @@ -3,6 +3,6 @@ ManaCost:1 B Types:Creature Rat Shaman PT:1/1 A:AB$ Discard | Cost$ B Sac<1/Creature> | ValidTgts$ Player | SorcerySpeed$ True | NumCards$ 1 | Mode$ TgtChoose | SpellDescription$ Target player discards a card. Activate this ability only any time you could cast a sorcery. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/nezumi_bone_reader.jpg Oracle:{B}, Sacrifice a creature: Target player discards a card. Activate this ability only any time you could cast a sorcery. diff --git a/forge-gui/res/cardsfolder/n/nezumi_shadow_watcher.txt b/forge-gui/res/cardsfolder/n/nezumi_shadow_watcher.txt index 9ee9ed1c82e..12c65ef965b 100644 --- a/forge-gui/res/cardsfolder/n/nezumi_shadow_watcher.txt +++ b/forge-gui/res/cardsfolder/n/nezumi_shadow_watcher.txt @@ -3,6 +3,6 @@ ManaCost:B Types:Creature Rat Warrior PT:1/1 A:AB$ Destroy | Cost$ Sac<1/CARDNAME> | ValidTgts$ Ninja | TgtPrompt$ Select target Ninja | SpellDescription$ Destroy target Ninja. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/nezumi_shadow_watcher.jpg Oracle:Sacrifice Nezumi Shadow-Watcher: Destroy target Ninja. diff --git a/forge-gui/res/cardsfolder/n/niblis_of_the_breath.txt b/forge-gui/res/cardsfolder/n/niblis_of_the_breath.txt index a40610d9c8c..1a58067fef4 100644 --- a/forge-gui/res/cardsfolder/n/niblis_of_the_breath.txt +++ b/forge-gui/res/cardsfolder/n/niblis_of_the_breath.txt @@ -4,6 +4,6 @@ Types:Creature Spirit PT:2/1 K:Flying A:AB$ TapOrUntap | Cost$ U T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ You may tap or untap target creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/niblis_of_the_breath.jpg Oracle:Flying\n{U}, {T}: You may tap or untap target creature. diff --git a/forge-gui/res/cardsfolder/n/night_dealings.txt b/forge-gui/res/cardsfolder/n/night_dealings.txt index b6566ddd3d4..523ecd28780 100644 --- a/forge-gui/res/cardsfolder/n/night_dealings.txt +++ b/forge-gui/res/cardsfolder/n/night_dealings.txt @@ -6,6 +6,6 @@ SVar:TrigPutCounter:DB$ PutCounter | CounterType$ THEFT | CounterNum$ Y | Refere A:AB$ ChangeZone | Cost$ 2 B B SubCounter | Origin$ Library | Destination$ Hand | ChangeType$ Card.nonLand+YouCtrl+cmcEQChosenX | ChangeNum$ 1 | Reveal$ True | Shuffle$ True | References$ X | SpellDescription$ Search your library for a nonland card with converted mana cost X, reveal it, put it into your hand, then shuffle your library. SVar:X:XChoice SVar:Y:TriggerCount$DamageAmount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/night_dealings.jpg Oracle:Whenever a source you control deals damage to another player, put that many theft counters on Night Dealings.\n{2}{B}{B}, Remove X theft counters from Night Dealings: Search your library for a nonland card with converted mana cost X, reveal it, put it into your hand, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/n/night_of_souls_betrayal.txt b/forge-gui/res/cardsfolder/n/night_of_souls_betrayal.txt index 8710617836e..5c084c52c57 100644 --- a/forge-gui/res/cardsfolder/n/night_of_souls_betrayal.txt +++ b/forge-gui/res/cardsfolder/n/night_of_souls_betrayal.txt @@ -2,6 +2,6 @@ Name:Night of Souls' Betrayal ManaCost:2 B B Types:Legendary Enchantment S:Mode$ Continuous | Affected$ Creature | AddPower$ -1 | AddToughness$ -1 | Description$ All creatures get -1/-1. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/night_of_souls_betrayal.jpg Oracle:All creatures get -1/-1. diff --git a/forge-gui/res/cardsfolder/n/night_soil.txt b/forge-gui/res/cardsfolder/n/night_soil.txt index 3f2abd2ffea..0195a029366 100644 --- a/forge-gui/res/cardsfolder/n/night_soil.txt +++ b/forge-gui/res/cardsfolder/n/night_soil.txt @@ -2,7 +2,7 @@ Name:Night Soil ManaCost:G G Types:Enchantment A:AB$ Token | Cost$ 1 ExileSameGrave<2/Creature> | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Create a 1/1 green Saproling creature token. -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHas:Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/night_soil.jpg Oracle:{1}, Exile two creature cards from a single graveyard: Create a 1/1 green Saproling creature token. diff --git a/forge-gui/res/cardsfolder/n/nightbirds_clutches.txt b/forge-gui/res/cardsfolder/n/nightbirds_clutches.txt index 91e4fd8a297..a78429f4716 100644 --- a/forge-gui/res/cardsfolder/n/nightbirds_clutches.txt +++ b/forge-gui/res/cardsfolder/n/nightbirds_clutches.txt @@ -3,6 +3,6 @@ ManaCost:1 R Types:Sorcery K:Flashback:3 R A:SP$ Pump | Cost$ 1 R | ValidTgts$ Creature | KW$ HIDDEN CARDNAME can't block. | IsCurse$ True | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Select up to two target creatures | SpellDescription$ Up to two target creatures can't block this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/nightbirds_clutches.jpg Oracle:Up to two target creatures can't block this turn.\nFlashback {3}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/n/nightcreep.txt b/forge-gui/res/cardsfolder/n/nightcreep.txt index b5f07727975..2909cd1039a 100644 --- a/forge-gui/res/cardsfolder/n/nightcreep.txt +++ b/forge-gui/res/cardsfolder/n/nightcreep.txt @@ -3,6 +3,6 @@ ManaCost:B B Types:Instant A:SP$ AnimateAll | Cost$ B B | ValidCards$ Creature | Colors$ Black | OverwriteColors$ True | SubAbility$ AnimateSwamp | SpellDescription$ Until end of turn, all creatures become black and all lands become Swamps. SVar:AnimateSwamp:DB$AnimateAll | ValidCards$ Land | Types$ Swamp | RemoveLandTypes$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/nightcreep.jpg Oracle:Until end of turn, all creatures become black and all lands become Swamps. diff --git a/forge-gui/res/cardsfolder/n/nightmare_lash.txt b/forge-gui/res/cardsfolder/n/nightmare_lash.txt index cc5985845a8..42c2442d8d6 100644 --- a/forge-gui/res/cardsfolder/n/nightmare_lash.txt +++ b/forge-gui/res/cardsfolder/n/nightmare_lash.txt @@ -5,6 +5,6 @@ K:Equip:PayLife<3> S:Mode$ Continuous | Affected$ Card.EquippedBy | AddPower$ X | AddToughness$ X | References$ X | Description$ Equipped creature gets +1/+1 for each Swamp you control. SVar:X:Count$Valid Swamp.YouCtrl SVar:BuffedBy:Swamp -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/nightmare_lash.jpg Oracle:Equipped creature gets +1/+1 for each Swamp you control.\nEquip—Pay 3 life. (Pay 3 life: Attach to target creature you control. Equip only as a sorcery. This card enters the battlefield unattached and stays on the battlefield if the creature leaves.) diff --git a/forge-gui/res/cardsfolder/n/nightscape_apprentice.txt b/forge-gui/res/cardsfolder/n/nightscape_apprentice.txt index 4a03605ad64..4aa57c3f1fe 100644 --- a/forge-gui/res/cardsfolder/n/nightscape_apprentice.txt +++ b/forge-gui/res/cardsfolder/n/nightscape_apprentice.txt @@ -4,6 +4,6 @@ Types:Creature Zombie Wizard PT:1/1 A:AB$ ChangeZone | Cost$ U T | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SpellDescription$ Put target creature you control on top of its owner's library. A:AB$ Pump | Cost$ R T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ First Strike | SpellDescription$ Target creature gains first strike until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/nightscape_apprentice.jpg Oracle:{U}, {T}: Put target creature you control on top of its owner's library.\n{R}, {T}: Target creature gains first strike until end of turn. diff --git a/forge-gui/res/cardsfolder/n/nightscape_master.txt b/forge-gui/res/cardsfolder/n/nightscape_master.txt index e09820441ae..6a41d4b7e4f 100644 --- a/forge-gui/res/cardsfolder/n/nightscape_master.txt +++ b/forge-gui/res/cardsfolder/n/nightscape_master.txt @@ -4,7 +4,7 @@ Types:Creature Zombie Wizard PT:2/2 A:AB$ ChangeZone | Cost$ U U T | ValidTgts$ Creature | TgtPrompt$ Select target Creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. A:AB$ DealDamage | Cost$ R R T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Red|Blue SVar:Picture:http://www.wizards.com/global/images/magic/general/nightscape_master.jpg Oracle:{U}{U}, {T}: Return target creature to its owner's hand.\n{R}{R}, {T}: Nightscape Master deals 2 damage to target creature. diff --git a/forge-gui/res/cardsfolder/n/nightshade_assassin.txt b/forge-gui/res/cardsfolder/n/nightshade_assassin.txt index c3863dc0896..e4d5818ea3e 100644 --- a/forge-gui/res/cardsfolder/n/nightshade_assassin.txt +++ b/forge-gui/res/cardsfolder/n/nightshade_assassin.txt @@ -9,6 +9,6 @@ SVar:TrigReveal:DB$ Reveal | Defined$ You | RevealValid$ Card.Black | AnyNumber$ SVar:DBPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ X | NumDef$ X | IsCurse$ True | SubAbility$ DBNightshadeCleanup | References$ X SVar:DBNightshadeCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount.Negative -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/nightshade_assassin.jpg Oracle:First strike\nWhen Nightshade Assassin enters the battlefield, you may reveal X black cards in your hand. If you do, target creature gets -X/-X until end of turn.\nMadness {1}{B} (If you discard this card, discard it into exile. When you do, cast it for its madness cost or put it into your graveyard.) diff --git a/forge-gui/res/cardsfolder/n/nightshade_schemers.txt b/forge-gui/res/cardsfolder/n/nightshade_schemers.txt index ef8a23e7967..c85f580980e 100644 --- a/forge-gui/res/cardsfolder/n/nightshade_schemers.txt +++ b/forge-gui/res/cardsfolder/n/nightshade_schemers.txt @@ -7,6 +7,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigKinship | Trigge SVar:TrigKinship:DB$ PeekAndReveal | PeekAmount$ 1 | RevealValid$ Card.sharesCreatureTypeWith | RevealOptional$ True | RememberRevealed$ True | SubAbility$ DBLoseLife SVar:DBLoseLife:DB$ LoseLife | Defined$ Opponent | LifeAmount$ 2 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/nightshade_schemers.jpg Oracle:Flying\nKinship — At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Nightshade Schemers, you may reveal it. If you do, each opponent loses 2 life. diff --git a/forge-gui/res/cardsfolder/n/nightshade_seer.txt b/forge-gui/res/cardsfolder/n/nightshade_seer.txt index e6ea975f02e..65879632883 100644 --- a/forge-gui/res/cardsfolder/n/nightshade_seer.txt +++ b/forge-gui/res/cardsfolder/n/nightshade_seer.txt @@ -6,6 +6,6 @@ A:AB$ Reveal | Cost$ 2 B T | Defined$ You | RevealValid$ Card.Black | AnyNumber$ SVar:DBNightshadePump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ NightshadeX | NumDef$ NightshadeX | IsCurse$ True | SubAbility$ DBNightshadeCleanup | References$ NightshadeX SVar:DBNightshadeCleanup:DB$ Cleanup | ClearRemembered$ True SVar:NightshadeX:Remembered$Amount.Negative -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/nightshade_seer.jpg Oracle:{2}{B}, {T}: Reveal any number of black cards in your hand. Target creature gets -X/-X until end of turn, where X is the number of cards revealed this way. diff --git a/forge-gui/res/cardsfolder/n/nightsnare.txt b/forge-gui/res/cardsfolder/n/nightsnare.txt index 8f925ea2c5a..010a40aa00b 100644 --- a/forge-gui/res/cardsfolder/n/nightsnare.txt +++ b/forge-gui/res/cardsfolder/n/nightsnare.txt @@ -6,6 +6,6 @@ SVar:DBChoose:DB$ ChooseCard | ChoiceZone$ Hand | Amount$ 1 | Choices$ Card.nonL SVar:DBDiscard:DB$ Discard | DefinedCards$ ChosenCard | Defined$ Targeted | Mode$ Defined | SubAbility$ DBCleanup | StackDescription$ None | ConditionDefined$ ChosenCard | ConditionPresent$ Card | ConditionCompare$ EQ1 | SubAbility$ DBDiscard2 SVar:DBDiscard2:DB$ Discard | Defined$ Targeted | NumCards$ 2 | Mode$ TgtChoose | SubAbility$ DBCleanup | ConditionDefined$ ChosenCard | ConditionPresent$ Card | ConditionCompare$ EQ0 | StackDescription$ None SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/nightsnare.jpg Oracle:Target opponent reveals their hand. You may choose a nonland card from it. If you do, that player discards that card. If you don't, that player discards two cards. diff --git a/forge-gui/res/cardsfolder/n/nihil_spellbomb.txt b/forge-gui/res/cardsfolder/n/nihil_spellbomb.txt index ad96d7a7942..20344d37f38 100644 --- a/forge-gui/res/cardsfolder/n/nihil_spellbomb.txt +++ b/forge-gui/res/cardsfolder/n/nihil_spellbomb.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ ChangeZoneAll | Cost$ T Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Player | TgtPrompt$ Select target player | ChangeType$ Card | Shuffle$ True | SpellDescription$ Exile all cards from target player's graveyard. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | OptionalDecider$ TriggeredCardController | Execute$ TrigDraw | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you may pay {B}. If you do, draw a card. SVar:TrigDraw:AB$Draw | Cost$ B | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/nihil_spellbomb.jpg Oracle:{T}, Sacrifice Nihil Spellbomb: Exile all cards from target player's graveyard.\nWhen Nihil Spellbomb is put into a graveyard from the battlefield, you may pay {B}. If you do, draw a card. diff --git a/forge-gui/res/cardsfolder/n/nihilistic_glee.txt b/forge-gui/res/cardsfolder/n/nihilistic_glee.txt index 66a5828ea87..5950a7c84aa 100644 --- a/forge-gui/res/cardsfolder/n/nihilistic_glee.txt +++ b/forge-gui/res/cardsfolder/n/nihilistic_glee.txt @@ -4,6 +4,6 @@ Types:Enchantment A:AB$ LoseLife | Cost$ 2 B Discard<1/Card> | ValidTgts$ Opponent | LifeAmount$ 1 | SubAbility$ DBGainLife | SpellDescription$ Target opponent loses 1 life and you gain 1 life. A:AB$ Draw | Cost$ 1 PayLife<2> | NumCards$ 1 | Activation$ Hellbent | PrecostDesc$ Hellbent — | SpellDescription$ Draw a card. Activate this ability only if you have no cards in hand. SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/nihilistic_glee.jpg Oracle:{2}{B}, Discard a card: Target opponent loses 1 life and you gain 1 life.\nHellbent — {1}, Pay 2 life: Draw a card. Activate this ability only if you have no cards in hand. diff --git a/forge-gui/res/cardsfolder/n/nim_devourer.txt b/forge-gui/res/cardsfolder/n/nim_devourer.txt index 32e3169ea9f..87149ef8a09 100644 --- a/forge-gui/res/cardsfolder/n/nim_devourer.txt +++ b/forge-gui/res/cardsfolder/n/nim_devourer.txt @@ -7,6 +7,6 @@ SVar:X:Count$Valid Artifact.YouCtrl A:AB$ ChangeZone | Cost$ B B | Origin$ Graveyard | Destination$ Battlefield | ActivationZone$ Graveyard | PlayerTurn$ True | ActivationPhases$ Upkeep | SubAbility$ DBSac | SpellDescription$ Return CARDNAME from your graveyard to the battlefield, then sacrifice a creature. Activate this ability only during your upkeep. SVar:DBSac:DB$ Sacrifice | Defined$ You | SacValid$ Creature SVar:BuffedBy:Artifact -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/nim_devourer.jpg Oracle:Nim Devourer gets +1/+0 for each artifact you control.\n{B}{B}: Return Nim Devourer from your graveyard to the battlefield, then sacrifice a creature. Activate this ability only during your upkeep. diff --git a/forge-gui/res/cardsfolder/n/nim_grotesque.txt b/forge-gui/res/cardsfolder/n/nim_grotesque.txt index 1101ebb4ebb..3cc376b2746 100644 --- a/forge-gui/res/cardsfolder/n/nim_grotesque.txt +++ b/forge-gui/res/cardsfolder/n/nim_grotesque.txt @@ -5,6 +5,6 @@ PT:3/6 S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | References$ X | Description$ CARDNAME gets +1/+0 for each artifact you control. SVar:X:Count$Valid Artifact.YouCtrl SVar:BuffedBy:Artifact -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/nim_grotesque.jpg Oracle:Nim Grotesque gets +1/+0 for each artifact you control. diff --git a/forge-gui/res/cardsfolder/n/nim_lasher.txt b/forge-gui/res/cardsfolder/n/nim_lasher.txt index 41aba2e1609..f30c8b2a0cc 100644 --- a/forge-gui/res/cardsfolder/n/nim_lasher.txt +++ b/forge-gui/res/cardsfolder/n/nim_lasher.txt @@ -5,6 +5,6 @@ PT:1/1 S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | References$ X | Description$ CARDNAME gets +1/+0 for each artifact you control. SVar:X:Count$Valid Artifact.YouCtrl SVar:BuffedBy:Artifact -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/nim_lasher.jpg Oracle:Nim Lasher gets +1/+0 for each artifact you control. diff --git a/forge-gui/res/cardsfolder/n/nim_replica.txt b/forge-gui/res/cardsfolder/n/nim_replica.txt index b2cd661cd56..1aa0f568bfc 100644 --- a/forge-gui/res/cardsfolder/n/nim_replica.txt +++ b/forge-gui/res/cardsfolder/n/nim_replica.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact Creature Zombie PT:3/1 A:AB$ Pump | Cost$ 2 B Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ Target creature gets -1/-1 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/nim_replica.jpg Oracle:{2}{B}, Sacrifice Nim Replica: Target creature gets -1/-1 until end of turn. diff --git a/forge-gui/res/cardsfolder/n/nim_shambler.txt b/forge-gui/res/cardsfolder/n/nim_shambler.txt index 2b19250d979..bf34a3798e8 100644 --- a/forge-gui/res/cardsfolder/n/nim_shambler.txt +++ b/forge-gui/res/cardsfolder/n/nim_shambler.txt @@ -6,6 +6,6 @@ S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | References$ X | Descrip A:AB$ Regenerate | Cost$ Sac<1/Creature> | SpellDescription$ Regenerate CARDNAME. SVar:X:Count$Valid Artifact.YouCtrl SVar:BuffedBy:Artifact -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/nim_shambler.jpg Oracle:Nim Shambler gets +1/+0 for each artifact you control.\nSacrifice a creature: Regenerate Nim Shambler. diff --git a/forge-gui/res/cardsfolder/n/nim_shrieker.txt b/forge-gui/res/cardsfolder/n/nim_shrieker.txt index cd93208b10e..dbcd36e6076 100644 --- a/forge-gui/res/cardsfolder/n/nim_shrieker.txt +++ b/forge-gui/res/cardsfolder/n/nim_shrieker.txt @@ -6,7 +6,7 @@ K:Flying S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | References$ X | Description$ CARDNAME gets +1/+0 for each artifact you control. SVar:X:Count$Valid Artifact.YouCtrl SVar:NeedsToPlayVar:X GE2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:BuffedBy:Artifact SVar:Picture:http://www.wizards.com/global/images/magic/general/nim_shrieker.jpg Oracle:Flying\nNim Shrieker gets +1/+0 for each artifact you control. diff --git a/forge-gui/res/cardsfolder/n/nin_the_pain_artist.txt b/forge-gui/res/cardsfolder/n/nin_the_pain_artist.txt index 2ed8df8cb82..e9d321d69d7 100644 --- a/forge-gui/res/cardsfolder/n/nin_the_pain_artist.txt +++ b/forge-gui/res/cardsfolder/n/nin_the_pain_artist.txt @@ -5,6 +5,6 @@ PT:1/1 A:AB$ DealDamage | Cost$ X U R T | Announce$ X | References$ X | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | SubAbility$ DBDraw | AILogic$ NinThePainArtist | SpellDescription$ CARDNAME deals X damage to target creature. That creature's controller draws X cards. SVar:DBDraw:DB$Draw | Defined$ TargetedController | NumCards$ X | References$ X SVar:X:Count$xPaid -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/nin_the_pain_artist.jpg Oracle:{X}{U}{R}, {T}: Nin, the Pain Artist deals X damage to target creature. That creature's controller draws X cards. diff --git a/forge-gui/res/cardsfolder/n/nine_ringed_bo.txt b/forge-gui/res/cardsfolder/n/nine_ringed_bo.txt index 2eeb9bc6db6..520995e5945 100644 --- a/forge-gui/res/cardsfolder/n/nine_ringed_bo.txt +++ b/forge-gui/res/cardsfolder/n/nine_ringed_bo.txt @@ -2,6 +2,6 @@ Name:Nine-Ringed Bo ManaCost:3 Types:Artifact A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature.Spirit | NumDmg$ 1 | ReplaceDyingDefined$ Targeted | SpellDescription$ CARDNAME deals 1 damage to target Spirit creature. If that creature would die this turn, exile it instead. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/nine_ringed_bo.jpg Oracle:{T}: Nine-Ringed Bo deals 1 damage to target Spirit creature. If that creature would die this turn, exile it instead. diff --git a/forge-gui/res/cardsfolder/n/nissa_revane.txt b/forge-gui/res/cardsfolder/n/nissa_revane.txt index 7fdc241345f..2643292ca04 100644 --- a/forge-gui/res/cardsfolder/n/nissa_revane.txt +++ b/forge-gui/res/cardsfolder/n/nissa_revane.txt @@ -7,7 +7,7 @@ A:AB$ GainLife | Cost$ AddCounter<1/LOYALTY> | LifeAmount$ XLife | Planeswalker$ A:AB$ ChangeZone | Cost$ SubCounter<7/LOYALTY> | Origin$ Library | Destination$ Battlefield | ChangeType$ Creature.Elf | ChangeNum$ XFetch | Planeswalker$ True | Ultimate$ True | StackDescription$ SpellDescription | References$ XFetch | SpellDescription$ Search your library for any number of Elf creature cards, put them onto the battlefield, then shuffle your library. SVar:XLife:Count$TypeYouCtrl.Elf/Times.2 SVar:XFetch:Count$TypeInYourLibrary.Elf -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Name$Nissa's Chosen DeckHints:Type$Elf SVar:Picture:http://www.wizards.com/global/images/magic/general/nissa_revane.jpg diff --git a/forge-gui/res/cardsfolder/n/nissas_defeat.txt b/forge-gui/res/cardsfolder/n/nissas_defeat.txt index 2cc8ff6ca5d..7a8daff19ef 100644 --- a/forge-gui/res/cardsfolder/n/nissas_defeat.txt +++ b/forge-gui/res/cardsfolder/n/nissas_defeat.txt @@ -3,6 +3,6 @@ ManaCost:2 G Types:Sorcery A:SP$ Destroy | Cost$ 2 G | ValidTgts$ Forest,Enchantment.Green,Planeswalker.Green | TgtPrompt$ Select target Forest, green enchantment, or green planeswalker | SubAbility$ DBDraw | SpellDescription$ Destroy target Forest, green enchantment, or green planeswalker. If that permanent was a Nissa planeswalker, draw a card. SVar:DBDraw:DB$Draw | NumCards$ 1 | ConditionDefined$ Targeted | ConditionPresent$ Planeswalker.Nissa -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/nissas_defeat.jpg Oracle:Destroy target Forest, green enchantment, or green planeswalker. If that permanent was a Nissa planeswalker, draw a card. diff --git a/forge-gui/res/cardsfolder/n/nissas_judgment.txt b/forge-gui/res/cardsfolder/n/nissas_judgment.txt index 2e99a427904..f159615c803 100644 --- a/forge-gui/res/cardsfolder/n/nissas_judgment.txt +++ b/forge-gui/res/cardsfolder/n/nissas_judgment.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ PutCounter | Cost$ 4 G | AILogic$ PowerDmg | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DealToCreature | SpellDescription$ Support 2. (Put a +1/+1 counter on each of up to two target creatures.) SVar:DealToCreature:DB$ EachDamage | AILogic$ PowerDmg | ValidCards$ Creature.YouCtrl+counters_GE1_P1P1 | NumDmg$ X | References$ X | TgtPrompt$ Choose target creature opponent controls | ValidTgts$ Creature.OppCtrl | TargetMin$ 0 | TargetMax$ 1 | SpellDescription$ Each creature you control with a +1/+1 counter deals damage equal to its power to target creature opponent controls. SVar:X:Count$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/nissas_judgment.jpg Oracle:Support 2. (Put a +1/+1 counter on each of up to two target creatures.) Choose up to one target creature an opponent controls. Each creature you control with a +1/+1 counter on it deals damage equal to its power to that creature. diff --git a/forge-gui/res/cardsfolder/n/niveous_wisps.txt b/forge-gui/res/cardsfolder/n/niveous_wisps.txt index e9e1e3f818e..e68dd72ef4a 100644 --- a/forge-gui/res/cardsfolder/n/niveous_wisps.txt +++ b/forge-gui/res/cardsfolder/n/niveous_wisps.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Animate | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | Colors$ White | OverwriteColors$ True | SubAbility$ DBDraw | SpellDescription$ Target creature becomes white until end of turn. Tap that creature. Draw a card. SVar:DBDraw:DB$Draw | SubAbility$ DBTap | NumCards$ 1 SVar:DBTap:DB$Tap | Defined$ Targeted -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/niveous_wisps.jpg Oracle:Target creature becomes white until end of turn. Tap that creature.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/n/nivix_aerie_of_the_firemind.txt b/forge-gui/res/cardsfolder/n/nivix_aerie_of_the_firemind.txt index 80877a61c96..1e3f439a2d3 100644 --- a/forge-gui/res/cardsfolder/n/nivix_aerie_of_the_firemind.txt +++ b/forge-gui/res/cardsfolder/n/nivix_aerie_of_the_firemind.txt @@ -6,6 +6,6 @@ A:AB$ Mill | Cost$ T 2 U R | Defined$ You | NumCards$ 1 | Destination$ Exile | R SVar:DBEffect:DB$Effect | RememberObjects$ RememberedCard | StaticAbilities$ Play | SubAbility$ DBCleanup | ExileOnMoved$ Exile | Duration$ UntilYourNextTurn SVar:Play:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Instant.IsRemembered,Sorcery.IsRemembered | AffectedZone$ Exile | Description$ You may play remembered card. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/nivix_aerie_of_the_firemind.jpg Oracle:{T}: Add {C}.\n{2}{U}{R}, {T}: Exile the top card of your library. Until your next turn, you may cast that card if it's an instant or sorcery. diff --git a/forge-gui/res/cardsfolder/n/nivmagus_elemental.txt b/forge-gui/res/cardsfolder/n/nivmagus_elemental.txt index ff3588c9ade..e17b8d01e45 100644 --- a/forge-gui/res/cardsfolder/n/nivmagus_elemental.txt +++ b/forge-gui/res/cardsfolder/n/nivmagus_elemental.txt @@ -3,6 +3,6 @@ ManaCost:UR Types:Creature Elemental PT:1/2 A:AB$ PutCounter | Cost$ ExileFromStack<1/Spell.Instant+YouCtrl;Spell.Sorcery+YouCtrl/instant or sorcery spell> | CostDesc$ Exile an instant or sorcery spell you control: | CounterType$ P1P1 | CounterNum$ 2 | SpellDescription$ Put two +1/+1 counters on CARDNAME. (That spell won't resolve.) -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/nivmagus_elemental.jpg Oracle:Exile an instant or sorcery spell you control: Put two +1/+1 counters on Nivmagus Elemental. (That spell won't resolve.) diff --git a/forge-gui/res/cardsfolder/n/nix.txt b/forge-gui/res/cardsfolder/n/nix.txt index e634c8cb5af..5a297482bee 100644 --- a/forge-gui/res/cardsfolder/n/nix.txt +++ b/forge-gui/res/cardsfolder/n/nix.txt @@ -2,6 +2,6 @@ Name:Nix ManaCost:U Types:Instant A:SP$ Counter | Cost$ U | TargetType$ Spell | ValidTgts$ Card | CounterNoManaSpell$ True | SpellDescription$ Counter target spell if no mana was spent to cast it. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/nix.jpg Oracle:Counter target spell if no mana was spent to cast it. diff --git a/forge-gui/res/cardsfolder/n/no_quarter.txt b/forge-gui/res/cardsfolder/n/no_quarter.txt index 0c69d1d921b..e0ac8073162 100644 --- a/forge-gui/res/cardsfolder/n/no_quarter.txt +++ b/forge-gui/res/cardsfolder/n/no_quarter.txt @@ -7,6 +7,6 @@ SVar:DestroyBlocker:DB$ Destroy | Defined$ TriggeredBlocker SVar:DestroyAttacker:DB$ Destroy | Defined$ TriggeredAttacker SVar:AttackerPower:Count$ TriggeredAttacker.Power SVar:BlockerPower:Count$ TriggeredBlocker.Power -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/no_quarter.jpg Oracle:Whenever a creature becomes blocked by a creature with lesser power, destroy the blocking creature.\nWhenever a creature blocks a creature with lesser power, destroy the attacking creature. diff --git a/forge-gui/res/cardsfolder/n/noble_elephant.txt b/forge-gui/res/cardsfolder/n/noble_elephant.txt index a512b5122a8..a0b14e1fb9f 100644 --- a/forge-gui/res/cardsfolder/n/noble_elephant.txt +++ b/forge-gui/res/cardsfolder/n/noble_elephant.txt @@ -4,6 +4,6 @@ Types:Creature Elephant PT:2/2 K:Trample K:Banding -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/noble_elephant.jpg Oracle:Trample, banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/n/noetic_scales.txt b/forge-gui/res/cardsfolder/n/noetic_scales.txt index 4ccabc73cb4..c393c123d11 100644 --- a/forge-gui/res/cardsfolder/n/noetic_scales.txt +++ b/forge-gui/res/cardsfolder/n/noetic_scales.txt @@ -4,7 +4,7 @@ Types:Artifact T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigBounce | TriggerDescription$ At the beginning of each player's upkeep, return to its owner's hand each creature that player controls with power greater than the number of cards in their hand. SVar:TrigBounce:DB$ ChangeZoneAll | ChangeType$ Creature.ActivePlayerCtrl+powerGTX | Origin$ Battlefield | Destination$ Hand | References$ X SVar:X:Count$ValidHand Card.ActivePlayerCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/noetic_scales.jpg Oracle:At the beginning of each player's upkeep, return to its owner's hand each creature that player controls with power greater than the number of cards in their hand. diff --git a/forge-gui/res/cardsfolder/n/nomad_stadium.txt b/forge-gui/res/cardsfolder/n/nomad_stadium.txt index b84b6300973..2127d443fad 100644 --- a/forge-gui/res/cardsfolder/n/nomad_stadium.txt +++ b/forge-gui/res/cardsfolder/n/nomad_stadium.txt @@ -4,6 +4,6 @@ Types:Land A:AB$ Mana | Cost$ T | Produced$ W | SubAbility$ DBPain | SpellDescription$ Add {W}. CARDNAME deals 1 damage to you. A:AB$ GainLife | Cost$ W T Sac<1/CARDNAME> | LifeAmount$ 4 | Activation$ Threshold | PrecostDesc$ Threshold — | SpellDescription$ You gain 4 life. Activate this ability only if seven or more cards are in your graveyard. SVar:DBPain:DB$ DealDamage | NumDmg$ 1 | Defined$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/nomad_stadium.jpg Oracle:{T}: Add {W}. Nomad Stadium deals 1 damage to you.\nThreshold — {W}, {T}, Sacrifice Nomad Stadium: You gain 4 life. Activate this ability only if seven or more cards are in your graveyard. diff --git a/forge-gui/res/cardsfolder/n/nomadic_elf.txt b/forge-gui/res/cardsfolder/n/nomadic_elf.txt index bad2b1c240b..052a320b7c9 100644 --- a/forge-gui/res/cardsfolder/n/nomadic_elf.txt +++ b/forge-gui/res/cardsfolder/n/nomadic_elf.txt @@ -3,6 +3,6 @@ ManaCost:1 G Types:Creature Elf Nomad PT:2/2 A:AB$ Mana | Cost$ 1 G | Produced$ Any | SpellDescription$ Add one mana of any color. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/nomadic_elf.jpg Oracle:{1}{G}: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/n/nomads_en_kor.txt b/forge-gui/res/cardsfolder/n/nomads_en_kor.txt index 04c36d29e34..f8b9cfe02ef 100644 --- a/forge-gui/res/cardsfolder/n/nomads_en_kor.txt +++ b/forge-gui/res/cardsfolder/n/nomads_en_kor.txt @@ -5,6 +5,6 @@ PT:1/1 A:AB$ Effect | Cost$ 0 | Name$ en-Kor Redirection | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control to redirect the damage to | ReplacementEffects$ EnKor | SVars$ EnKorDmg | References$ EnKor,EnKorDmg | Duration$ HostLeavesOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SpellDescription$ The next 1 damage that would be dealt to CARDNAME this turn is dealt to target creature you control instead. SVar:EnKor:Event$ DamageDone | ValidTarget$ Creature.EffectSource | ReplaceWith$ EnKorDmg | DamageTarget$ Remembered | Description$ The next 1 damage that would be dealt to EFFECTSOURCE this turn is dealt to target creature you control instead. SVar:EnKorDmg:DB$ ReplaceSplitDamage | DamageTarget$ Remembered -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/nomads_en_kor.jpg Oracle:{0}: The next 1 damage that would be dealt to Nomads en-Kor this turn is dealt to target creature you control instead. diff --git a/forge-gui/res/cardsfolder/n/norin_the_wary.txt b/forge-gui/res/cardsfolder/n/norin_the_wary.txt index 820b624480e..22e153318de 100644 --- a/forge-gui/res/cardsfolder/n/norin_the_wary.txt +++ b/forge-gui/res/cardsfolder/n/norin_the_wary.txt @@ -8,6 +8,6 @@ SVar:TrigExile:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destinatio SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | TriggerDescription$ Return CARDNAME to the battlefield SVar:TrigReturn:DB$ ChangeZone | Defined$ Self | Origin$ Exile,Command | Destination$ Battlefield SVar:MustAttack:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/norin_the_wary.jpg Oracle:When a player casts a spell or a creature attacks, exile Norin the Wary. Return it to the battlefield under its owner's control at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/n/norritt.txt b/forge-gui/res/cardsfolder/n/norritt.txt index 9204eec3efe..68b1fcd3a58 100644 --- a/forge-gui/res/cardsfolder/n/norritt.txt +++ b/forge-gui/res/cardsfolder/n/norritt.txt @@ -6,7 +6,7 @@ A:AB$ Untap | Cost$ T | ValidTgts$ Creature.Blue | TgtPrompt$ Select target blue A:AB$ Pump | Cost$ T | ValidTgts$ Creature.nonWall+ActivePlayerCtrl+notFirstTurnControlled | TgtPrompt$ Select target non-Wall creature the active player has controlled continuously since the beginning of the turn. | ActivationPhases$ Upkeep->BeginCombat | KW$ HIDDEN CARDNAME attacks each combat if able. | SubAbility$ DestroyPacifist | SpellDescription$ Choose target non-Wall creature the active player has controlled continuously since the beginning of the turn. That creature attacks this turn if able. Destroy it at the beginning of the next end step if it didn't attack this turn. Activate this ability only before attackers are declared. SVar:DestroyPacifist:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigDestroy | RememberObjects$ ParentTarget | TriggerDescription$ At the beginning of the end step, destroy that creature if it didn't attack this turn. SVar:TrigDestroy:DB$ Destroy | Defined$ DelayTriggerRemembered | ConditionDefined$ DelayTriggerRemembered | ConditionPresent$ Creature.notAttackedThisTurn | ConditionCompare$ GE1 -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHints:Color$Blue SVar:Picture:http://www.wizards.com/global/images/magic/general/norritt.jpg Oracle:{T}: Untap target blue creature.\n{T}: Choose target non-Wall creature the active player has controlled continuously since the beginning of the turn. That creature attacks this turn if able. Destroy it at the beginning of the next end step if it didn't attack this turn. Activate this ability only before attackers are declared. diff --git a/forge-gui/res/cardsfolder/n/north_star.txt b/forge-gui/res/cardsfolder/n/north_star.txt index 6e22bb02b85..14f0eeea100 100644 --- a/forge-gui/res/cardsfolder/n/north_star.txt +++ b/forge-gui/res/cardsfolder/n/north_star.txt @@ -2,6 +2,6 @@ Name:North Star ManaCost:4 Types:Artifact A:AB$ Pump | Cost$ 4 T | Defined$ You | KW$ You may spend mana as though it were mana of any color to cast a spell this turn. | SpellDescription$ For one spell this turn, you may spend mana as though it were mana of any type to pay that spell's mana cost. (Additional costs are still paid normally.) -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/north_star.jpg Oracle:{4}, {T}: For one spell this turn, you may spend mana as though it were mana of any type to pay that spell's mana cost. (Additional costs are still paid normally.) diff --git a/forge-gui/res/cardsfolder/n/northern_paladin.txt b/forge-gui/res/cardsfolder/n/northern_paladin.txt index 79d110cd1c4..2a70be6b480 100644 --- a/forge-gui/res/cardsfolder/n/northern_paladin.txt +++ b/forge-gui/res/cardsfolder/n/northern_paladin.txt @@ -3,6 +3,6 @@ ManaCost:2 W W Types:Creature Human Knight PT:3/3 A:AB$ Destroy | Cost$ W W T | ValidTgts$ Permanent.Black | TgtPrompt$ Select target black permanent | SpellDescription$ Destroy target black permanent. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/northern_paladin.jpg Oracle:{W}{W}, {T}: Destroy target black permanent. diff --git a/forge-gui/res/cardsfolder/n/nostalgic_dreams.txt b/forge-gui/res/cardsfolder/n/nostalgic_dreams.txt index 5bb3baa343f..64d1459a6e4 100644 --- a/forge-gui/res/cardsfolder/n/nostalgic_dreams.txt +++ b/forge-gui/res/cardsfolder/n/nostalgic_dreams.txt @@ -5,6 +5,6 @@ A:SP$ ChangeZone | Cost$ G G Discard | Origin$ Graveyard | Destination$ SVar:DBChange:DB$ChangeZone | Origin$ Stack | Destination$ Exile SVar:MaxTgts:Count$InYourYard SVar:X:Targeted$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/nostalgic_dreams.jpg Oracle:As an additional cost to cast Nostalgic Dreams, discard X cards.\nReturn X target cards from your graveyard to your hand. Exile Nostalgic Dreams. diff --git a/forge-gui/res/cardsfolder/n/nourishing_shoal.txt b/forge-gui/res/cardsfolder/n/nourishing_shoal.txt index 3f17763b6ef..e239157a3eb 100644 --- a/forge-gui/res/cardsfolder/n/nourishing_shoal.txt +++ b/forge-gui/res/cardsfolder/n/nourishing_shoal.txt @@ -5,6 +5,6 @@ A:SP$ GainLife | Cost$ X G G | LifeAmount$ X | References$ X | SpellDescription$ A:SP$ GainLife | Cost$ ExileFromHand<1/Card.Green> | CostDesc$ You may exile a green card from your hand rather than pay CARDNAME's mana cost. | LifeAmount$ Y | References$ Y | SpellDescription$ You gain X life, where X is the exiled card's converted mana cost. SVar:X:Count$xPaid SVar:Y:Exiled$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/nourishing_shoal.jpg Oracle:You may exile a green card with converted mana cost X from your hand rather than pay Nourishing Shoal's mana cost.\nYou gain X life. diff --git a/forge-gui/res/cardsfolder/n/nova_chaser.txt b/forge-gui/res/cardsfolder/n/nova_chaser.txt index 5d5f6684511..dfbedc73bfd 100644 --- a/forge-gui/res/cardsfolder/n/nova_chaser.txt +++ b/forge-gui/res/cardsfolder/n/nova_chaser.txt @@ -4,6 +4,6 @@ Types:Creature Elemental Warrior PT:10/2 K:Trample K:Champion:Elemental -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/nova_chaser.jpg Oracle:Trample\nChampion an Elemental (When this enters the battlefield, sacrifice it unless you exile another Elemental you control. When this leaves the battlefield, that card returns to the battlefield.) diff --git a/forge-gui/res/cardsfolder/n/nova_pentacle.txt b/forge-gui/res/cardsfolder/n/nova_pentacle.txt index 31f0f34ffa6..2e5c6e88787 100644 --- a/forge-gui/res/cardsfolder/n/nova_pentacle.txt +++ b/forge-gui/res/cardsfolder/n/nova_pentacle.txt @@ -9,7 +9,7 @@ SVar:SelflessDmg:DB$ ReplaceEffect | VarName$ Affected | VarValue$ Remembered | SVar:OutOfSight:Mode$ ChangesZone | Origin$ Any | Destination$ Any | Defined$ ChosenCard | Execute$ ExileEffect | Static$ True SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile | Static$ True SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/nova_pentacle.jpg Oracle:{3}, {T}: The next time a source of your choice would deal damage to you this turn, that damage is dealt to target creature of an opponent's choice instead. diff --git a/forge-gui/res/cardsfolder/n/noxious_vapors.txt b/forge-gui/res/cardsfolder/n/noxious_vapors.txt index 268e44f0319..ea3bc250205 100644 --- a/forge-gui/res/cardsfolder/n/noxious_vapors.txt +++ b/forge-gui/res/cardsfolder/n/noxious_vapors.txt @@ -10,7 +10,7 @@ SVar:DBChooseB:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Card.Rem SVar:DBChooseU:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Card.RememberedPlayerCtrl+Blue | ChoiceZone$ Hand | RememberChosen$ True | SubAbility$ DBDiscard SVar:DBDiscard:DB$ Discard | Mode$ Defined | Defined$ Player.IsRemembered | DefinedCards$ ValidHand Card.IsNotRemembered+nonLand+RememberedPlayerCtrl | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/noxious_vapors.jpg Oracle:Each player reveals their hand and chooses one card of each color from it, then discards all other nonland cards. diff --git a/forge-gui/res/cardsfolder/n/null_brooch.txt b/forge-gui/res/cardsfolder/n/null_brooch.txt index 167aba789d6..b9df451465d 100644 --- a/forge-gui/res/cardsfolder/n/null_brooch.txt +++ b/forge-gui/res/cardsfolder/n/null_brooch.txt @@ -2,6 +2,6 @@ Name:Null Brooch ManaCost:4 Types:Artifact A:AB$ Counter | Cost$ 2 T Discard<0/Hand> | TargetType$ Spell | TgtPrompt$ Select target nonCreature spell | ValidTgts$ Card.nonCreature | AILogic$ NullBrooch | SpellDescription$ Counter target noncreature spell. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/null_brooch.jpg Oracle:{2}, {T}, Discard your hand: Counter target noncreature spell. diff --git a/forge-gui/res/cardsfolder/n/null_chamber.txt b/forge-gui/res/cardsfolder/n/null_chamber.txt index fb24f752b10..cf7afa34422 100644 --- a/forge-gui/res/cardsfolder/n/null_chamber.txt +++ b/forge-gui/res/cardsfolder/n/null_chamber.txt @@ -11,6 +11,6 @@ S:Mode$ CantBeCast | ValidCard$ Card.IsRemembered | Description$ Spells with the S:Mode$ CantPlayLand | ValidCard$ Land.IsRemembered T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/null_chamber.jpg Oracle:As Null Chamber enters the battlefield, you and an opponent each choose a card name other than a basic land card name.\nSpells with the chosen names can't be cast. diff --git a/forge-gui/res/cardsfolder/n/null_profusion.txt b/forge-gui/res/cardsfolder/n/null_profusion.txt index 92070702f52..0c84047906b 100644 --- a/forge-gui/res/cardsfolder/n/null_profusion.txt +++ b/forge-gui/res/cardsfolder/n/null_profusion.txt @@ -6,6 +6,6 @@ S:Mode$ Continuous | Affected$ You | SetMaxHandSize$ 2 | Description$ Your maxim T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever you play a card, draw a card. T:Mode$ LandPlayed | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDraw | Secondary$ True | TriggerDescription$ Whenever you play a card, draw a card. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/null_profusion.jpg Oracle:Skip your draw step.\nWhenever you play a card, draw a card.\nYour maximum hand size is two. diff --git a/forge-gui/res/cardsfolder/n/null_rod.txt b/forge-gui/res/cardsfolder/n/null_rod.txt index 57a0328deb4..80e158d9f06 100644 --- a/forge-gui/res/cardsfolder/n/null_rod.txt +++ b/forge-gui/res/cardsfolder/n/null_rod.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact S:Mode$ Continuous | Affected$ Artifact | AddHiddenKeyword$ CARDNAME's activated abilities can't be activated. | Description$ Activated abilities of artifacts can't be activated. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/null_rod.jpg Oracle:Activated abilities of artifacts can't be activated. diff --git a/forge-gui/res/cardsfolder/n/nullmage_advocate.txt b/forge-gui/res/cardsfolder/n/nullmage_advocate.txt index 6264942596b..f698e45206b 100644 --- a/forge-gui/res/cardsfolder/n/nullmage_advocate.txt +++ b/forge-gui/res/cardsfolder/n/nullmage_advocate.txt @@ -4,6 +4,6 @@ Types:Creature Insect Druid PT:2/3 A:AB$ ChangeZone | Cost$ T | ValidTgts$ Card.OppOwn | TargetMin$ 2 | TargetMax$ 2 | Origin$ Graveyard | Destination$ Hand | SubAbility$ DBDestroy | SpellDescription$ Return two target cards from an opponent's graveyard to their hand. Destroy target artifact or enchantment. SVar:DBDestroy:DB$Destroy | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/nullmage_advocate.jpg Oracle:{T}: Return two target cards from an opponent's graveyard to their hand. Destroy target artifact or enchantment. diff --git a/forge-gui/res/cardsfolder/n/nullmage_shepherd.txt b/forge-gui/res/cardsfolder/n/nullmage_shepherd.txt index c5b02ea303f..e5d4f4ce73e 100644 --- a/forge-gui/res/cardsfolder/n/nullmage_shepherd.txt +++ b/forge-gui/res/cardsfolder/n/nullmage_shepherd.txt @@ -3,6 +3,6 @@ ManaCost:3 G Types:Creature Elf Shaman PT:2/4 A:AB$ Destroy | Cost$ tapXType<4/Creature> | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy target artifact or enchantment. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/nullmage_shepherd.jpg Oracle:Tap four untapped creatures you control: Destroy target artifact or enchantment. diff --git a/forge-gui/res/cardsfolder/n/nullstone_gargoyle.txt b/forge-gui/res/cardsfolder/n/nullstone_gargoyle.txt index 88918f0788c..4ab367a7fb3 100644 --- a/forge-gui/res/cardsfolder/n/nullstone_gargoyle.txt +++ b/forge-gui/res/cardsfolder/n/nullstone_gargoyle.txt @@ -6,6 +6,6 @@ K:Flying T:Mode$ SpellCast | ValidCard$ Card.nonCreature | CheckSVar$ X | References$ X | SVarCompare$ EQ1 | NoResolvingCheck$ True | TriggerZones$ Battlefield | Execute$ TrigCounter | TriggerDescription$ Whenever the first noncreature spell of a turn is cast, counter that spell. SVar:TrigCounter:DB$ Counter | Defined$ TriggeredSpellAbility SVar:X:Count$ThisTurnCast_Card.nonCreature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/nullstone_gargoyle.jpg Oracle:Flying\nWhenever the first noncreature spell of a turn is cast, counter that spell. diff --git a/forge-gui/res/cardsfolder/n/numai_outcast.txt b/forge-gui/res/cardsfolder/n/numai_outcast.txt index 6aa216a4b57..07af6d07f1c 100644 --- a/forge-gui/res/cardsfolder/n/numai_outcast.txt +++ b/forge-gui/res/cardsfolder/n/numai_outcast.txt @@ -4,6 +4,6 @@ Types:Creature Human Samurai PT:1/1 K:Bushido:2 A:AB$ Regenerate | Cost$ B PayLife<5> | SpellDescription$ Regenerate CARDNAME. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/numai_outcast.jpg Oracle:Bushido 2 (When this blocks or becomes blocked, it gets +2/+2 until end of turn.)\n{B}, Pay 5 life: Regenerate Numai Outcast. diff --git a/forge-gui/res/cardsfolder/n/nurturing_licid.txt b/forge-gui/res/cardsfolder/n/nurturing_licid.txt index 4aa4b948ef7..a7ed9f2d568 100644 --- a/forge-gui/res/cardsfolder/n/nurturing_licid.txt +++ b/forge-gui/res/cardsfolder/n/nurturing_licid.txt @@ -6,6 +6,6 @@ A:AB$ Animate | Cost$ G T | Defined$ Self | RemoveThisAbility$ True | Permanent$ SVar:DBAttach:DB$ Attach | ValidTgts$ Creature | AILogic$ Pump SVar:SPAttach:SP$ Attach | Cost$ 0 | ValidTgts$ Creature A:AB$ Regenerate | Cost$ G | Defined$ Enchanted | SpellDescription$ Regenerate enchanted creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/nurturing_licid.jpg Oracle:{G}, {T}: Nurturing Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {G} to end this effect.\n{G}: Regenerate enchanted creature. diff --git a/forge-gui/res/cardsfolder/n/nyx_weaver.txt b/forge-gui/res/cardsfolder/n/nyx_weaver.txt index f6a516d15c9..c1f882f83b5 100644 --- a/forge-gui/res/cardsfolder/n/nyx_weaver.txt +++ b/forge-gui/res/cardsfolder/n/nyx_weaver.txt @@ -6,6 +6,6 @@ K:Reach T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigMill | TriggerDescription$ At the beginning of your upkeep, put the top two cards of your library into your graveyard. SVar:TrigMill:DB$ Mill | Defined$ You | NumCards$ 2 A:AB$ ChangeZone | Cost$ 1 B G Exile<1/CARDNAME> | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target card in your graveyard | ValidTgts$ Card.YouCtrl | SpellDescription$ Return target card from your graveyard to your hand. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/nyx_weaver.jpg Oracle:Reach\nAt the beginning of your upkeep, put the top two cards of your library into your graveyard.\n{1}{B}{G}, Exile Nyx Weaver: Return target card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/o/oath_of_lim_dul.txt b/forge-gui/res/cardsfolder/o/oath_of_lim_dul.txt index ad8ffbf2157..3daac46e5c5 100644 --- a/forge-gui/res/cardsfolder/o/oath_of_lim_dul.txt +++ b/forge-gui/res/cardsfolder/o/oath_of_lim_dul.txt @@ -6,6 +6,6 @@ SVar:TrigLimDulSac:DB$ Repeat | MaxRepeat$ X | RepeatSubAbility$ DBSac | Referen SVar:DBSac:DB$ Sacrifice | SacValid$ Permanent.Other | Amount$ 1 | UnlessCost$ Discard<1/Card> | UnlessPayer$ You A:AB$ Draw | Cost$ B B | NumCards$ 1 | SpellDescription$ Draw a card. SVar:X:TriggerCount$LifeAmount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/oath_of_lim_dul.jpg Oracle:Whenever you lose life, for each 1 life you lost, sacrifice a permanent other than Oath of Lim-Dul unless you discard a card. (Damage dealt to you causes you to lose life.)\n{B}{B}: Draw a card. diff --git a/forge-gui/res/cardsfolder/o/oath_of_scholars.txt b/forge-gui/res/cardsfolder/o/oath_of_scholars.txt index 26515b94a63..23bb9aeb1ac 100644 --- a/forge-gui/res/cardsfolder/o/oath_of_scholars.txt +++ b/forge-gui/res/cardsfolder/o/oath_of_scholars.txt @@ -5,6 +5,6 @@ T:Mode$ Phase | Phase$ Upkeep | Execute$ TrigOathofScholars | TriggerZones$ Batt SVar:TrigOathofScholars:DB$ Pump | TargetingPlayer$ TriggeredPlayer | ValidTgts$ Player.OpponentToActive+hasMoreCardsInHandThanActive | TgtPrompt$ Choose target player who has more life than you and is your opponent | IsCurse$ True | SubAbility$ DBDiscard SVar:DBDiscard:DB$ Discard | Defined$ TriggeredPlayer | Mode$ Hand | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | Defined$ TriggeredPlayer | NumCards$ 3 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/oath_of_scholars.jpg Oracle:At the beginning of each player's upkeep, that player chooses target player who has more cards in hand than they do and is their opponent. The first player may discard their hand and draw three cards. diff --git a/forge-gui/res/cardsfolder/o/oath_of_the_ancient_wood.txt b/forge-gui/res/cardsfolder/o/oath_of_the_ancient_wood.txt index a2a8af4b4f1..9626570a723 100644 --- a/forge-gui/res/cardsfolder/o/oath_of_the_ancient_wood.txt +++ b/forge-gui/res/cardsfolder/o/oath_of_the_ancient_wood.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.Other+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME or another enchantment enters the battlefield under your control, you may put a +1/+1 counter on target creature. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPutCounter | Secondary$ True | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME or another enchantment enters the battlefield under your control, you may put a +1/+1 counter on target creature. SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/oath_of_the_ancient_wood.jpg Oracle:Whenever Oath of the Ancient Wood or another enchantment enters the battlefield under your control, you may put a +1/+1 counter on target creature. diff --git a/forge-gui/res/cardsfolder/o/oathkeeper_takenos_daisho.txt b/forge-gui/res/cardsfolder/o/oathkeeper_takenos_daisho.txt index 370a73f0813..ed56bc0c0b5 100644 --- a/forge-gui/res/cardsfolder/o/oathkeeper_takenos_daisho.txt +++ b/forge-gui/res/cardsfolder/o/oathkeeper_takenos_daisho.txt @@ -10,7 +10,7 @@ T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | Defined$ Remembered T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.EquippedBy | Execute$ TrigReturn | TriggerController$ TriggeredCardController | TriggerDescription$ Whenever equipped creature dies, return that card to the battlefield under your control if it's a Samurai card. SVar:TrigReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ TriggeredCard | GainControl$ True | ConditionDefined$ TriggeredCard | ConditionPresent$ Card.Samurai | ConditionCompare$ GE1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Samurai SVar:Picture:http://www.wizards.com/global/images/magic/general/oathkeeper_takenos_daisho.jpg Oracle:Equipped creature gets +3/+1.\nWhenever equipped creature dies, return that card to the battlefield under your control if it's a Samurai card.\nWhen Oathkeeper, Takeno's Daisho is put into a graveyard from the battlefield, exile equipped creature.\nEquip {2} diff --git a/forge-gui/res/cardsfolder/o/ob_nixilis_of_the_black_oath.txt b/forge-gui/res/cardsfolder/o/ob_nixilis_of_the_black_oath.txt index 8dc5d9423b6..618d39e725b 100644 --- a/forge-gui/res/cardsfolder/o/ob_nixilis_of_the_black_oath.txt +++ b/forge-gui/res/cardsfolder/o/ob_nixilis_of_the_black_oath.txt @@ -12,6 +12,6 @@ A:AB$ Effect | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Ultimate$ True SVar:ObGainLife:AB$ GainLife | Cost$ 1 B Sac<1/Creature> | ActivationZone$ Command | LifeAmount$ X | References$ X | SubAbility$ DBDraw | SpellDescription$ You gain X life and draw X cards, where X is the sacrificed creature's power. SVar:DBDraw:DB$ Draw | NumCards$ X | References$ X SVar:X:Sacrificed$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ob_nixilis_of_the_black_oath.jpg Oracle:[+2]: Each opponent loses 1 life. You gain life equal to the life lost this way.\n[-2]: Create a 5/5 black Demon creature token with flying. You lose 2 life.\n[-8]: You get an emblem with "{1}{B}, Sacrifice a creature: You gain X life and draw X cards, where X is the sacrificed creature's power."\nOb Nixilis of the Black Oath can be your commander. diff --git a/forge-gui/res/cardsfolder/o/obelisk_of_urd.txt b/forge-gui/res/cardsfolder/o/obelisk_of_urd.txt index c77ef5b12cc..6964a34f04c 100644 --- a/forge-gui/res/cardsfolder/o/obelisk_of_urd.txt +++ b/forge-gui/res/cardsfolder/o/obelisk_of_urd.txt @@ -5,7 +5,7 @@ K:Convoke K:ETBReplacement:Other:ChooseCT SVar:ChooseCT:DB$ ChooseType | Defined$ You | Type$ Creature | SpellDescription$ As CARDNAME enters the battlefield, choose a creature type. | AILogic$ MostProminentInComputerDeck S:Mode$ Continuous | Affected$ Creature.ChosenType+YouCtrl | AddPower$ 2 | AddToughness$ 2 | Description$ Creatures you control of the chosen type get +2/+2. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/obelisk_of_urd.jpg Oracle:Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nAs Obelisk of Urd enters the battlefield, choose a creature type.\nCreatures you control of the chosen type get +2/+2. diff --git a/forge-gui/res/cardsfolder/o/oblivion_crown.txt b/forge-gui/res/cardsfolder/o/oblivion_crown.txt index c0a9092457b..b906edca695 100644 --- a/forge-gui/res/cardsfolder/o/oblivion_crown.txt +++ b/forge-gui/res/cardsfolder/o/oblivion_crown.txt @@ -6,6 +6,6 @@ K:Flash A:SP$ Attach | Cost$ 1 B | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddAbility$ Pump | Description$ Enchanted creature has "Discard a card: This creature gets +1/+1 until end of turn." SVar:Pump:AB$ Pump | Cost$ Discard<1/Card> | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/oblivion_crown.jpg Oracle:Flash (You may cast this spell any time you could cast an instant.)\nEnchant creature\nEnchanted creature has "Discard a card: This creature gets +1/+1 until end of turn." diff --git a/forge-gui/res/cardsfolder/o/oblivion_stone.txt b/forge-gui/res/cardsfolder/o/oblivion_stone.txt index ddc96ebdbea..dee63a5697a 100644 --- a/forge-gui/res/cardsfolder/o/oblivion_stone.txt +++ b/forge-gui/res/cardsfolder/o/oblivion_stone.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ PutCounter | Cost$ 4 T | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | CounterType$ FATE | CounterNum$ 1 | SpellDescription$ Put a fate counter on target permanent. A:AB$ DestroyAll | Cost$ 5 T Sac<1/CARDNAME> | ValidCards$ Permanent.nonLand+counters_LT1_FATE | SubAbility$ DBRemove | SpellDescription$ Destroy each nonland permanent without a fate counter on it, then remove all fate counters from all permanents. SVar:DBRemove:DB$ RemoveCounterAll | ValidCards$ Permanent | CounterType$ FATE | AllCounters$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/oblivion_stone.jpg Oracle:{4}, {T}: Put a fate counter on target permanent.\n{5}, {T}, Sacrifice Oblivion Stone: Destroy each nonland permanent without a fate counter on it, then remove all fate counters from all permanents. diff --git a/forge-gui/res/cardsfolder/o/oboro_breezecaller.txt b/forge-gui/res/cardsfolder/o/oboro_breezecaller.txt index 1644ab6b17a..cecfe32aebd 100644 --- a/forge-gui/res/cardsfolder/o/oboro_breezecaller.txt +++ b/forge-gui/res/cardsfolder/o/oboro_breezecaller.txt @@ -4,6 +4,6 @@ Types:Creature Moonfolk Wizard PT:1/1 K:Flying A:AB$ Untap | Cost$ 2 Return<1/Land> | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Untap target land. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/oboro_breezecaller.jpg Oracle:Flying\n{2}, Return a land you control to its owner's hand: Untap target land. diff --git a/forge-gui/res/cardsfolder/o/oboro_envoy.txt b/forge-gui/res/cardsfolder/o/oboro_envoy.txt index 64d1239b795..accd008ba88 100644 --- a/forge-gui/res/cardsfolder/o/oboro_envoy.txt +++ b/forge-gui/res/cardsfolder/o/oboro_envoy.txt @@ -5,6 +5,6 @@ PT:1/3 K:Flying A:AB$ Pump | Cost$ 2 Return<1/Land> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -X | References$ X | IsCurse$ True | SpellDescription$ Target creature gets -X/-0 until end of turn, where X is the number of cards in your hand. SVar:X:Count$InYourHand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/oboro_envoy.jpg Oracle:Flying\n{2}, Return a land you control to its owner's hand: Target creature gets -X/-0 until end of turn, where X is the number of cards in your hand. diff --git a/forge-gui/res/cardsfolder/o/obscuring_aether.txt b/forge-gui/res/cardsfolder/o/obscuring_aether.txt index c75bb9e7b82..340d55b25b7 100644 --- a/forge-gui/res/cardsfolder/o/obscuring_aether.txt +++ b/forge-gui/res/cardsfolder/o/obscuring_aether.txt @@ -3,7 +3,7 @@ ManaCost:G Types:Enchantment S:Mode$ ReduceCost | ValidCard$ Creature | Type$ MorphDown | Activator$ You | Amount$ 1 | Description$ Face-down creature spells you cast cost {1} less to cast. A:AB$ SetState | Cost$ 1 G | Defined$ Self | Mode$ TurnFace | SpellDescription$ Turn CARDNAME face down. (It becomes a 2/2 creature.) -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHints:Keyword$Morph|Megamorph SVar:Picture:http://www.wizards.com/global/images/magic/general/obscuring_aether.jpg Oracle:Face-down creature spells you cast cost {1} less to cast.\n{1}{G}: Turn Obscuring Aether face down. (It becomes a 2/2 creature.) diff --git a/forge-gui/res/cardsfolder/o/odric_master_tactician.txt b/forge-gui/res/cardsfolder/o/odric_master_tactician.txt index 88647cd474b..44bdbfbb499 100644 --- a/forge-gui/res/cardsfolder/o/odric_master_tactician.txt +++ b/forge-gui/res/cardsfolder/o/odric_master_tactician.txt @@ -6,6 +6,6 @@ K:First Strike T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | CheckSVar$ OdricTest | SVarCompare$ GE3 | NoResolvingCheck$ True | Execute$ TrigOdricEffect | TriggerDescription$ Whenever CARDNAME and at least three other creatures attack, you choose which creatures block this combat and how those creatures block. SVar:TrigOdricEffect:DB$ DeclareCombatants | DeclareBlockers$ True SVar:OdricTest:Count$Valid Creature.attacking+Other -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/odric_master_tactician.jpg Oracle:First strike\nWhenever Odric, Master Tactician and at least three other creatures attack, you choose which creatures block this combat and how those creatures block. diff --git a/forge-gui/res/cardsfolder/o/odunos_river_trawler.txt b/forge-gui/res/cardsfolder/o/odunos_river_trawler.txt index d77962737f4..6898d8910b2 100644 --- a/forge-gui/res/cardsfolder/o/odunos_river_trawler.txt +++ b/forge-gui/res/cardsfolder/o/odunos_river_trawler.txt @@ -5,8 +5,8 @@ PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, return target enchantment creature card from your graveyard to your hand. SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Enchantment.Creature+YouCtrl A:AB$ ChangeZone | Cost$ W Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Enchantment.Creature+YouCtrl | TgtPrompt$ Select target enchantment creature card from your graveyard | SpellDescription$ Return target enchantment creature card from your graveyard to your hand. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random DeckNeeds:Color$White SVar:Picture:http://www.wizards.com/global/images/magic/general/odunos_river_trawler.jpg Oracle:When Odunos River Trawler enters the battlefield, return target enchantment creature card from your graveyard to your hand.\n{W}, Sacrifice Odunos River Trawler: Return target enchantment creature card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/o/offalsnout.txt b/forge-gui/res/cardsfolder/o/offalsnout.txt index 4764255fc2b..55236e0778a 100644 --- a/forge-gui/res/cardsfolder/o/offalsnout.txt +++ b/forge-gui/res/cardsfolder/o/offalsnout.txt @@ -6,6 +6,6 @@ K:Flash K:Evoke:B T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigExile | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME leaves the battlefield, exile target card from a graveyard. SVar:TrigExile:DB$ChangeZone | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/offalsnout.jpg Oracle:Flash\nWhen Offalsnout leaves the battlefield, exile target card from a graveyard.\nEvoke {B} (You may cast this spell for its evoke cost. If you do, it's sacrificed when it enters the battlefield.) \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/o/ogre_marauder.txt b/forge-gui/res/cardsfolder/o/ogre_marauder.txt index e198c87fba8..c7f42996245 100644 --- a/forge-gui/res/cardsfolder/o/ogre_marauder.txt +++ b/forge-gui/res/cardsfolder/o/ogre_marauder.txt @@ -7,7 +7,7 @@ SVar:TrigOgreMarauderSacrifice:DB$ Sacrifice | SacValid$ Creature | Defined$ Def SVar:DBOgreMarauderPump:DB$ Pump | Defined$ Self | KW$ HIDDEN Unblockable | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ EQ0 | SubAbility$ DBOgreMarauderCleanup SVar:DBOgreMarauderCleanup:DB$ Cleanup | ClearRemembered$ True SVar:HasAttackEffect:TRUE -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ogre_marauder.jpg Oracle:Whenever Ogre Marauder attacks, it gains "Ogre Marauder can't be blocked" until end of turn unless defending player sacrifices a creature. diff --git a/forge-gui/res/cardsfolder/o/ogre_recluse.txt b/forge-gui/res/cardsfolder/o/ogre_recluse.txt index 1430c4f1a12..02317906494 100644 --- a/forge-gui/res/cardsfolder/o/ogre_recluse.txt +++ b/forge-gui/res/cardsfolder/o/ogre_recluse.txt @@ -5,6 +5,6 @@ PT:5/4 T:Mode$ SpellCast | Execute$ TrigTap | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player casts a spell, tap CARDNAME. SVar:TrigTap:DB$Tap | Defined$ Self SVar:AntiBuffedBy:Card -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ogre_recluse.jpg Oracle:Whenever a player casts a spell, tap Ogre Recluse. diff --git a/forge-gui/res/cardsfolder/o/ogre_savant.txt b/forge-gui/res/cardsfolder/o/ogre_savant.txt index bdc8cdf4978..77611e5afe1 100644 --- a/forge-gui/res/cardsfolder/o/ogre_savant.txt +++ b/forge-gui/res/cardsfolder/o/ogre_savant.txt @@ -5,7 +5,7 @@ PT:3/2 T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigReturn | TriggerDescription$ When CARDNAME enters the battlefield, if {U} was spent to cast Ogre Savant, return target creature to its owner's hand. SVar:TrigReturn:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Creature | TgtPrompt$ Select target creature | ConditionManaSpent$ U SVar:ManaNeededToAvoidNegativeEffect:blue -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Blue SVar:Picture:http://www.wizards.com/global/images/magic/general/ogre_savant.jpg Oracle:When Ogre Savant enters the battlefield, if {U} was spent to cast Ogre Savant, return target creature to its owner's hand. diff --git a/forge-gui/res/cardsfolder/o/ojutai_monument.txt b/forge-gui/res/cardsfolder/o/ojutai_monument.txt index a073897e425..5c03aaba832 100644 --- a/forge-gui/res/cardsfolder/o/ojutai_monument.txt +++ b/forge-gui/res/cardsfolder/o/ojutai_monument.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Animate | Cost$ 4 W U | Defined$ Self | Power$ 4 | Toughness$ 4 | Types$ Artifact,Creature,Dragon | Colors$ White,Blue | Keywords$ Flying | SpellDescription$ CARDNAME becomes a 4/4 white and blue Dragon artifact creature with flying until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$White|Blue SVar:Picture:http://www.wizards.com/global/images/magic/general/ojutai_monument.jpg Oracle:{T}: Add {W} or {U}.\n{4}{W}{U}: Ojutai Monument becomes a 4/4 white and blue Dragon artifact creature with flying until end of turn. diff --git a/forge-gui/res/cardsfolder/o/omen.txt b/forge-gui/res/cardsfolder/o/omen.txt index 373a9cab628..fd0a0b8f67b 100644 --- a/forge-gui/res/cardsfolder/o/omen.txt +++ b/forge-gui/res/cardsfolder/o/omen.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Sorcery A:SP$ RearrangeTopOfLibrary | Cost$ 1 U | Defined$ You | NumCards$ 3 | MayShuffle$ True | SubAbility$ DBDraw | SpellDescription$ Look at the top three cards of your library, then put them back in any order. You may shuffle your library. Draw a card. SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://serv4.tcgimages.eu/img/cards/Portal/omen.jpg Oracle:Look at the top three cards of your library, then put them back in any order. You may shuffle your library.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/o/omen_machine.txt b/forge-gui/res/cardsfolder/o/omen_machine.txt index 7524058368f..920622f90c9 100644 --- a/forge-gui/res/cardsfolder/o/omen_machine.txt +++ b/forge-gui/res/cardsfolder/o/omen_machine.txt @@ -7,6 +7,6 @@ SVar:TrigOmenExileCard:DB$ Mill | NumCards$ 1 | Defined$ TriggeredPlayer | Desti SVar:DBOmenLand:DB$ ChangeZone | Origin$ Exile | Destination$ Battlefield | ChangeType$ Land.IsRemembered+ActivePlayerCtrl | ChangeNum$ 1 | DefinedPlayer$ TriggeredPlayer | Chooser$ TriggeredPlayer | Hidden$ True | Mandatory$ True | SubAbility$ DBOmenPlay SVar:DBOmenPlay:DB$ Play | ValidZone$ Exile | Controller$ TriggeredPlayer | Valid$ Card.IsRemembered | WithoutManaCost$ True | SubAbility$ DBOmenCleanup SVar:DBOmenCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/omen_machine.jpg Oracle:Players can't draw cards.\nAt the beginning of each player's draw step, that player exiles the top card of their library. If it's a land card, the player puts it onto the battlefield. Otherwise, the player casts it without paying its mana cost if able. diff --git a/forge-gui/res/cardsfolder/o/omen_of_fire.txt b/forge-gui/res/cardsfolder/o/omen_of_fire.txt index 91df7c10b37..7b1b9419385 100644 --- a/forge-gui/res/cardsfolder/o/omen_of_fire.txt +++ b/forge-gui/res/cardsfolder/o/omen_of_fire.txt @@ -5,6 +5,6 @@ A:SP$ ChangeZoneAll | Cost$ 3 R R | ChangeType$ Island | Origin$ Battlefield | D SVar:DBSac:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBSacEach SVar:DBSacEach:DB$ Sacrifice | Defined$ Player.IsRemembered | Amount$ OppX | SacValid$ Plains,Permanent.White | References$ OppX SVar:OppX:Count$Valid Permanent.White+RememberedPlayerCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/omen_of_fire.jpg Oracle:Return all Islands to their owners' hands.\nEach player sacrifices a Plains or a white permanent for each white permanent they control. diff --git a/forge-gui/res/cardsfolder/o/omnath_locus_of_mana.txt b/forge-gui/res/cardsfolder/o/omnath_locus_of_mana.txt index 9f82b7ddd2c..b3e5dc73979 100644 --- a/forge-gui/res/cardsfolder/o/omnath_locus_of_mana.txt +++ b/forge-gui/res/cardsfolder/o/omnath_locus_of_mana.txt @@ -5,6 +5,6 @@ PT:1/1 S:Mode$ Continuous | Affected$ You | AddKeyword$ Green mana doesn't empty from your mana pool as steps and phases end. | Description$ You don't lose green mana as steps and phases end.. S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | AddToughness$ X | References$ X | Description$ CARDNAME gets +1/+1 for each unspent green mana you have. SVar:X:Count$ManaPool:green -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/omnath_locus_of_mana.jpg Oracle:You don't lose green mana as steps and phases end.\nOmnath, Locus of Mana gets +1/+1 for each unspent green mana you have. diff --git a/forge-gui/res/cardsfolder/o/omnibian.txt b/forge-gui/res/cardsfolder/o/omnibian.txt index 873dcf3a6e3..deb53ca7136 100644 --- a/forge-gui/res/cardsfolder/o/omnibian.txt +++ b/forge-gui/res/cardsfolder/o/omnibian.txt @@ -3,6 +3,6 @@ ManaCost:1 G G U Types:Creature Frog PT:3/3 A:AB$ Animate | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | Power$ 3 | Toughness$ 3 | Types$ Frog | RemoveCreatureTypes$ True | SpellDescription$ Target creature becomes a Frog with base power and toughness 3/3 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/omnibian.jpg Oracle:{T}: Target creature becomes a Frog with base power and toughness 3/3 until end of turn. diff --git a/forge-gui/res/cardsfolder/o/omniscience.txt b/forge-gui/res/cardsfolder/o/omniscience.txt index 47446dc4c63..dcbed941b4f 100644 --- a/forge-gui/res/cardsfolder/o/omniscience.txt +++ b/forge-gui/res/cardsfolder/o/omniscience.txt @@ -2,6 +2,6 @@ Name:Omniscience ManaCost:7 U U U Types:Enchantment S:Mode$ Continuous | Affected$ Card.nonLand+YouOwn | MayPlay$ True | MayPlayWithoutManaCost$ True | AffectedZone$ Hand | Description$ You may cast spells from your hand without paying their mana costs. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/omniscience.jpg Oracle:You may cast spells from your hand without paying their mana costs. diff --git a/forge-gui/res/cardsfolder/o/ondu_cleric.txt b/forge-gui/res/cardsfolder/o/ondu_cleric.txt index 018f9215c98..9b6d5b071f4 100644 --- a/forge-gui/res/cardsfolder/o/ondu_cleric.txt +++ b/forge-gui/res/cardsfolder/o/ondu_cleric.txt @@ -7,6 +7,6 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Ally.O SVar:TrigGainLife:DB$GainLife | Defined$ You | LifeAmount$ X | References$ X SVar:X:Count$Valid Ally.YouCtrl SVar:BuffedBy:Ally -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ondu_cleric.jpg Oracle:Whenever Ondu Cleric or another Ally enters the battlefield under your control, you may gain life equal to the number of Allies you control. diff --git a/forge-gui/res/cardsfolder/o/one_with_nothing.txt b/forge-gui/res/cardsfolder/o/one_with_nothing.txt index 770b46b8760..386ace95fb9 100644 --- a/forge-gui/res/cardsfolder/o/one_with_nothing.txt +++ b/forge-gui/res/cardsfolder/o/one_with_nothing.txt @@ -2,6 +2,6 @@ Name:One with Nothing ManaCost:B Types:Instant A:SP$ Discard | Cost$ B | Mode$ Hand | SpellDescription$ Discard your hand. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/one_with_nothing.jpg Oracle:Discard your hand. diff --git a/forge-gui/res/cardsfolder/o/oni_of_wild_places.txt b/forge-gui/res/cardsfolder/o/oni_of_wild_places.txt index 934e0552970..f93e0db549c 100644 --- a/forge-gui/res/cardsfolder/o/oni_of_wild_places.txt +++ b/forge-gui/res/cardsfolder/o/oni_of_wild_places.txt @@ -7,6 +7,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigBounce | Trigger SVar:TrigBounce:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Mandatory$ True | Hidden$ True | ChangeType$ Creature.Red+YouCtrl SVar:NeedsToPlayVar:Z GE2 SVar:Z:Count$Valid Creature.Red+YouCtrl+inZoneBattlefield -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/oni_of_wild_places.jpg Oracle:Haste\nAt the beginning of your upkeep, return a red creature you control to its owner's hand. diff --git a/forge-gui/res/cardsfolder/o/oni_possession.txt b/forge-gui/res/cardsfolder/o/oni_possession.txt index b4a55a197cd..5a2c5b37467 100644 --- a/forge-gui/res/cardsfolder/o/oni_possession.txt +++ b/forge-gui/res/cardsfolder/o/oni_possession.txt @@ -9,6 +9,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E SVar:TrigSac:DB$Sacrifice | Defined$ You | SacValid$ Creature SVar:NeedsToPlayVar:Z GE3 SVar:Z:Count$Valid Creature.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/oni_possession.jpg Oracle:Enchant creature\nAt the beginning of your upkeep, sacrifice a creature.\nEnchanted creature gets +3/+3 and has trample.\nEnchanted creature is a Demon Spirit. diff --git a/forge-gui/res/cardsfolder/o/onyx_talisman.txt b/forge-gui/res/cardsfolder/o/onyx_talisman.txt index d466cdc9c42..bd41397b528 100644 --- a/forge-gui/res/cardsfolder/o/onyx_talisman.txt +++ b/forge-gui/res/cardsfolder/o/onyx_talisman.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact T:Mode$ SpellCast | ValidCard$ Card.Black | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ Whenever a player casts a black spell, you may pay {3}. If you do, untap target permanent. SVar:TrigUntap:AB$Untap | Cost$ 3 | ValidTgts$ Permanent | TgtPrompt$ Select target permanent -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/onyx_talisman.jpg Oracle:Whenever a player casts a black spell, you may pay {3}. If you do, untap target permanent. diff --git a/forge-gui/res/cardsfolder/o/ooze_flux.txt b/forge-gui/res/cardsfolder/o/ooze_flux.txt index a46860bd842..f9cddc74304 100644 --- a/forge-gui/res/cardsfolder/o/ooze_flux.txt +++ b/forge-gui/res/cardsfolder/o/ooze_flux.txt @@ -3,7 +3,7 @@ ManaCost:3 G Types:Enchantment A:AB$ Token | Announce$ X | Cost$ XCantBe0 1 G SubCounter | TokenAmount$ 1 | TokenName$ Ooze | TokenTypes$ Creature,Ooze | TokenOwner$ You | TokenImage$ g x x ooze | TokenColors$ Green | TokenPower$ X | TokenToughness$ X | SpellDescription$ Create an X/X green Ooze creature token, where X is the number of +1/+1 counters removed this way. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHints:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/ooze_flux.jpg Oracle:{1}{G}, Remove one or more +1/+1 counters from among creatures you control: Create an X/X green Ooze creature token, where X is the number of +1/+1 counters removed this way. diff --git a/forge-gui/res/cardsfolder/o/opal_acrolith.txt b/forge-gui/res/cardsfolder/o/opal_acrolith.txt index 2cd8af16773..5dc02fae54d 100644 --- a/forge-gui/res/cardsfolder/o/opal_acrolith.txt +++ b/forge-gui/res/cardsfolder/o/opal_acrolith.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | IsPresent$ Card.Self+Enchantment | Execute$ TrigAnimate | TriggerDescription$ When an opponent casts a creature spell, if CARDNAME is an enchantment, CARDNAME becomes a 2/4 Soldier creature. A:AB$ Animate | Cost$ 0 | Defined$ Self | Types$ Enchantment | RemoveCardTypes$ True | Permanent$ True | SpellDescription$ CARDNAME becomes an enchantment. SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 2 | Toughness$ 4 | Types$ Creature,Soldier | RemoveCardTypes$ True | Permanent$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/opal_acrolith.jpg Oracle:Whenever an opponent casts a creature spell, if Opal Acrolith is an enchantment, Opal Acrolith becomes a 2/4 Soldier creature.\n{0}: Opal Acrolith becomes an enchantment. diff --git a/forge-gui/res/cardsfolder/o/opal_eye_kondas_yojimbo.txt b/forge-gui/res/cardsfolder/o/opal_eye_kondas_yojimbo.txt index 104bd5b35c0..37a1d529511 100644 --- a/forge-gui/res/cardsfolder/o/opal_eye_kondas_yojimbo.txt +++ b/forge-gui/res/cardsfolder/o/opal_eye_kondas_yojimbo.txt @@ -12,6 +12,6 @@ SVar:OutOfSight:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Def SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile | Static$ True SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True A:AB$ PreventDamage | Cost$ 1 W | Defined$ Self | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to CARDNAME this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/opal_eye_kondas_yojimbo.jpg Oracle:Defender (This creature can't attack.)\nBushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.)\n{T}: The next time a source of your choice would deal damage this turn, that damage is dealt to Opal-Eye, Konda's Yojimbo instead.\n{1}{W}: Prevent the next 1 damage that would be dealt to Opal-Eye this turn. diff --git a/forge-gui/res/cardsfolder/o/opal_palace.txt b/forge-gui/res/cardsfolder/o/opal_palace.txt index 3be97979600..645dbfeeb62 100644 --- a/forge-gui/res/cardsfolder/o/opal_palace.txt +++ b/forge-gui/res/cardsfolder/o/opal_palace.txt @@ -4,7 +4,7 @@ Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ 1 T | Produced$ Combo ColorIdentity | AddsCounters$ Card.IsCommander_P1P1_ManaAddsCounterNum | SpellDescription$ Add one mana of any color in your commander's color identity. If you spend this mana to cast your commander, it enters the battlefield with a number of additional +1/+1 counters on it equal to the number of times it's been cast from the command zone this game. SVar:ManaAddsCounterNum:Count$CommanderCastFromCommandZone -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/opal_palace.jpg Oracle:{T}: Add {C}.\n{1}, {T}: Add one mana of any color in your commander's color identity. If you spend this mana to cast your commander, it enters the battlefield with a number of additional +1/+1 counters on it equal to the number of times it's been cast from the command zone this game. diff --git a/forge-gui/res/cardsfolder/o/opalescence.txt b/forge-gui/res/cardsfolder/o/opalescence.txt index a6673640892..fc9e07db32b 100644 --- a/forge-gui/res/cardsfolder/o/opalescence.txt +++ b/forge-gui/res/cardsfolder/o/opalescence.txt @@ -4,6 +4,6 @@ Types:Enchantment S:Mode$ Continuous | Affected$ Enchantment.nonAura+Other | SetPower$ AffectedX | SetToughness$ AffectedX | References$ AffectedX | AddType$ Creature | Description$ Each other non-Aura enchantment is a creature in addition to its other types and has base power and base toughness each equal to its converted mana cost. SVar:AffectedX:Count$CardManaCost SVar:PlayMain1:ALWAYS -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/opalescence.jpg Oracle:Each other non-Aura enchantment is a creature in addition to its other types and has base power and base toughness each equal to its converted mana cost. diff --git a/forge-gui/res/cardsfolder/o/open_the_armory.txt b/forge-gui/res/cardsfolder/o/open_the_armory.txt index 6cb62ce230d..9304bfd4b56 100644 --- a/forge-gui/res/cardsfolder/o/open_the_armory.txt +++ b/forge-gui/res/cardsfolder/o/open_the_armory.txt @@ -2,6 +2,6 @@ Name:Open the Armory ManaCost:1 W Types:Sorcery A:SP$ ChangeZone | Cost$ 1 W | Origin$ Library | Destination$ Hand | ChangeType$ Aura,Equipment | ChangeNum$ 1 | SpellDescription$ Search your library for an Aura or Equipment card, reveal it, put it into your hand, then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/open_the_armory.jpg Oracle:Search your library for an Aura or Equipment card, reveal it, put it into your hand, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/o/open_the_vaults.txt b/forge-gui/res/cardsfolder/o/open_the_vaults.txt index 0a2917bce20..109443f1ab3 100644 --- a/forge-gui/res/cardsfolder/o/open_the_vaults.txt +++ b/forge-gui/res/cardsfolder/o/open_the_vaults.txt @@ -2,6 +2,6 @@ Name:Open the Vaults ManaCost:4 W W Types:Sorcery A:SP$ ChangeZoneAll | Cost$ 4 W W | ChangeType$ Artifact,Enchantment | Origin$ Graveyard | Destination$ Battlefield | SpellDescription$ Return all artifact and enchantment cards from all graveyards to the battlefield under their owners' control. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/open_the_vaults.jpg Oracle:Return all artifact and enchantment cards from all graveyards to the battlefield under their owners' control. (Auras with nothing to enchant remain in graveyards.) diff --git a/forge-gui/res/cardsfolder/o/ophidian.txt b/forge-gui/res/cardsfolder/o/ophidian.txt index cc5e0577138..8deeb99742e 100644 --- a/forge-gui/res/cardsfolder/o/ophidian.txt +++ b/forge-gui/res/cardsfolder/o/ophidian.txt @@ -5,6 +5,6 @@ PT:1/3 T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDraw | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, you may draw a card. If you do, CARDNAME assigns no combat damage this turn. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 | SubAbility$ DBPump SVar:DBPump:DB$Pump | KW$ HIDDEN CARDNAME assigns no combat damage -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ophidian.jpg Oracle:Whenever Ophidian attacks and isn't blocked, you may draw a card. If you do, Ophidian assigns no combat damage this turn. diff --git a/forge-gui/res/cardsfolder/o/opposition.txt b/forge-gui/res/cardsfolder/o/opposition.txt index a0a7eff1ada..900ddb3443d 100644 --- a/forge-gui/res/cardsfolder/o/opposition.txt +++ b/forge-gui/res/cardsfolder/o/opposition.txt @@ -2,7 +2,7 @@ Name:Opposition ManaCost:2 U U Types:Enchantment A:AB$ Tap | Cost$ tapXType<1/Creature> | ValidTgts$ Artifact,Creature,Land | TgtPrompt$ Select target artifact, creature or land | SpellDescription$ Tap target artifact, creature or land. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/opposition.jpg Oracle:Tap an untapped creature you control: Tap target artifact, creature, or land. diff --git a/forge-gui/res/cardsfolder/o/oppression.txt b/forge-gui/res/cardsfolder/o/oppression.txt index 6daa01adae5..e2268b25d5a 100644 --- a/forge-gui/res/cardsfolder/o/oppression.txt +++ b/forge-gui/res/cardsfolder/o/oppression.txt @@ -3,6 +3,6 @@ ManaCost:1 B B Types:Enchantment T:Mode$ SpellCast | ValidCard$ Card | TriggerZones$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ Whenever a player casts a spell, that player discards a card. SVar:TrigDiscard:DB$Discard | Defined$ TriggeredActivator | NumCards$ 1 | Mode$ TgtChoose -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/oppression.jpg Oracle:Whenever a player casts a spell, that player discards a card. diff --git a/forge-gui/res/cardsfolder/o/oppressive_will.txt b/forge-gui/res/cardsfolder/o/oppressive_will.txt index dd9bdc56d17..8173a6c2eda 100644 --- a/forge-gui/res/cardsfolder/o/oppressive_will.txt +++ b/forge-gui/res/cardsfolder/o/oppressive_will.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Instant A:SP$ Counter | Cost$ 2 U | Type$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ X | References$ X | SpellDescription$ Counter target spell unless its controller pays {1} for each card in your hand. SVar:X:Count$InYourHand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/oppressive_will.jpg Oracle:Counter target spell unless its controller pays {1} for each card in your hand. diff --git a/forge-gui/res/cardsfolder/o/oracle.txt b/forge-gui/res/cardsfolder/o/oracle.txt index 03567464c82..3502d278e8f 100644 --- a/forge-gui/res/cardsfolder/o/oracle.txt +++ b/forge-gui/res/cardsfolder/o/oracle.txt @@ -4,6 +4,6 @@ Types:Vanguard HandLifeModifier:+1/+9 A:AB$ Untap | ActivationZone$ Command | Cost$ 0 | ValidTgts$ Creature.attacking+youCtrl | TgtPrompt$ Select target attacking creature you control | SubAbility$ Reconsider | SpellDescription$ Untap target attacking creature you control and remove it from combat. SVar:Reconsider:DB$ RemoveFromCombat | Defined$ Targeted -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:https://downloads.cardforge.org/images/cards/VAN/Oracle.full.jpg Oracle:Hand +1, life +9\n{0}: Untap target attacking creature you control and remove it from combat. diff --git a/forge-gui/res/cardsfolder/o/oracles_attendants.txt b/forge-gui/res/cardsfolder/o/oracles_attendants.txt index f2ca5594ce9..d0b6bec683f 100644 --- a/forge-gui/res/cardsfolder/o/oracles_attendants.txt +++ b/forge-gui/res/cardsfolder/o/oracles_attendants.txt @@ -10,6 +10,6 @@ SVar:SelflessDmg:DB$ ReplaceEffect | VarName$ Affected | VarValue$ EffectSource SVar:OutOfSight:Mode$ ChangesZone | Origin$ Any | Destination$ Any | Defined$ ChosenCard | Execute$ ExileEffect | Static$ True SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile | Static$ True SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/oracles_attendants.jpg Oracle:{T}: All damage that would be dealt to target creature this turn by a source of your choice is dealt to Oracle's Attendants instead. diff --git a/forge-gui/res/cardsfolder/o/oran_rief_recluse.txt b/forge-gui/res/cardsfolder/o/oran_rief_recluse.txt index af66f2cb9f8..1ded78141f7 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. -SVar:RemAIDeck:True +AI:RemoveDeck:All 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/orb_of_dreams.txt b/forge-gui/res/cardsfolder/o/orb_of_dreams.txt index 7d5fc7d9085..08bd53fe546 100644 --- a/forge-gui/res/cardsfolder/o/orb_of_dreams.txt +++ b/forge-gui/res/cardsfolder/o/orb_of_dreams.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact S:Mode$ ETBTapped | ValidCard$ Permanent | Description$ Permanents enter the battlefield tapped. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/orb_of_dreams.jpg Oracle:Permanents enter the battlefield tapped. diff --git a/forge-gui/res/cardsfolder/o/orbweaver_kumo.txt b/forge-gui/res/cardsfolder/o/orbweaver_kumo.txt index fd992576f82..3a597a80072 100644 --- a/forge-gui/res/cardsfolder/o/orbweaver_kumo.txt +++ b/forge-gui/res/cardsfolder/o/orbweaver_kumo.txt @@ -6,7 +6,7 @@ K:Reach T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, CARDNAME gains forestwalk until end of turn. SVar:TrigPump:DB$Pump | Defined$ Self | KW$ Forestwalk SVar:BuffedBy:Arcane,Spirit -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/orbweaver_kumo.jpg Oracle:Reach (This creature can block creatures with flying.)\nWhenever you cast a Spirit or Arcane spell, Orbweaver Kumo gains forestwalk until end of turn. diff --git a/forge-gui/res/cardsfolder/o/orc_general.txt b/forge-gui/res/cardsfolder/o/orc_general.txt index 3eb20eadb50..e30d57e10d2 100644 --- a/forge-gui/res/cardsfolder/o/orc_general.txt +++ b/forge-gui/res/cardsfolder/o/orc_general.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Creature Orc Warrior PT:2/2 A:AB$ PumpAll | Cost$ T Sac<1/Goblin.Other;Orc.Other/another Orc or Goblin> | ValidCards$ Creature.Orc+Other | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Other Orc creatures get +1/+1 until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/orc_general.jpg Oracle:{T}, Sacrifice another Orc or Goblin: Other Orc creatures get +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/o/orcish_artillery.txt b/forge-gui/res/cardsfolder/o/orcish_artillery.txt index 0fcc5f1c35b..9fd1c514a97 100644 --- a/forge-gui/res/cardsfolder/o/orcish_artillery.txt +++ b/forge-gui/res/cardsfolder/o/orcish_artillery.txt @@ -6,6 +6,6 @@ A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt SVar:DBDealDamage:DB$DealDamage | Defined$ You | NumDmg$ 3 | SubAbility$ DBDamageResolve SVar:DBDamageResolve:DB$ DamageResolve SVar:SelfDamageAmount:3 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83193.jpg Oracle:{T}: Orcish Artillery deals 2 damage to any target and 3 damage to you. diff --git a/forge-gui/res/cardsfolder/o/orcish_bloodpainter.txt b/forge-gui/res/cardsfolder/o/orcish_bloodpainter.txt index 75b92e2fbbf..82c0db9b328 100644 --- a/forge-gui/res/cardsfolder/o/orcish_bloodpainter.txt +++ b/forge-gui/res/cardsfolder/o/orcish_bloodpainter.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Creature Orc Shaman PT:2/1 A:AB$ DealDamage | Cost$ T Sac<1/Creature> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to any target. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/orcish_bloodpainter.jpg Oracle:{T}, Sacrifice a creature: Orcish Bloodpainter deals 1 damage to any target. diff --git a/forge-gui/res/cardsfolder/o/orcish_cannonade.txt b/forge-gui/res/cardsfolder/o/orcish_cannonade.txt index 7d47bf73ba6..fe16d048163 100644 --- a/forge-gui/res/cardsfolder/o/orcish_cannonade.txt +++ b/forge-gui/res/cardsfolder/o/orcish_cannonade.txt @@ -6,6 +6,6 @@ SVar:DB1:DB$DealDamage | NumDmg$ 3 | Defined$ You | SubAbility$ DBDamageResolve SVar:DBDamageResolve:DB$ DamageResolve | SubAbility$ DB2 SVar:DB2:DB$Draw | NumCards$ 1 SVar:SelfDamageAmount:3 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/orcish_cannonade.jpg Oracle:Orcish Cannonade deals 2 damage to any target and 3 damage to you.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/o/orcish_cannoneers.txt b/forge-gui/res/cardsfolder/o/orcish_cannoneers.txt index 143a1facb97..a05806565ee 100644 --- a/forge-gui/res/cardsfolder/o/orcish_cannoneers.txt +++ b/forge-gui/res/cardsfolder/o/orcish_cannoneers.txt @@ -6,6 +6,6 @@ A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt SVar:DBDealDamage:DB$DealDamage | Defined$ You | NumDmg$ 3 | SubAbility$ DBDamageResolve SVar:DBDamageResolve:DB$ DamageResolve SVar:SelfDamageAmount:3 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/orcish_cannoneers.jpg Oracle:{T}: Orcish Cannoneers deals 2 damage to any target and 3 damage to you. diff --git a/forge-gui/res/cardsfolder/o/orcish_farmer.txt b/forge-gui/res/cardsfolder/o/orcish_farmer.txt index 87254748702..ab59e439cbc 100644 --- a/forge-gui/res/cardsfolder/o/orcish_farmer.txt +++ b/forge-gui/res/cardsfolder/o/orcish_farmer.txt @@ -3,6 +3,6 @@ ManaCost:1 R R Types:Creature Orc PT:2/2 A:AB$ Animate | Cost$ T | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Swamp | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | UntilControllerNextUntap$ True | SpellDescription$ Target land becomes a Swamp until its controller's next untap step. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/orcish_farmer.jpg Oracle:{T}: Target land becomes a Swamp until its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/o/orcish_healer.txt b/forge-gui/res/cardsfolder/o/orcish_healer.txt index df3f195419e..e8afb892316 100644 --- a/forge-gui/res/cardsfolder/o/orcish_healer.txt +++ b/forge-gui/res/cardsfolder/o/orcish_healer.txt @@ -5,7 +5,7 @@ PT:1/1 A:AB$ Pump | Cost$ R R T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME can't be regenerated. | IsCurse$ True | SpellDescription$ Target creature can't be regenerated this turn. A:AB$ Regenerate | Cost$ B B R T | ValidTgts$ Creature.Black,Creature.Green | TgtPrompt$ Select target black or green creature | SpellDescription$ Regenerate target black or green creature. A:AB$ Regenerate | Cost$ R G G T | ValidTgts$ Creature.Black,Creature.Green | TgtPrompt$ Select target black or green creature | SpellDescription$ Regenerate target black or green creature. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Green|Black SVar:Picture:http://www.wizards.com/global/images/magic/general/orcish_healer.jpg Oracle:{R}{R}, {T}: Target creature can't be regenerated this turn.\n{B}{B}{R}, {T}: Regenerate target black or green creature.\n{R}{G}{G}, {T}: Regenerate target black or green creature. diff --git a/forge-gui/res/cardsfolder/o/orcish_librarian.txt b/forge-gui/res/cardsfolder/o/orcish_librarian.txt index f7775892c13..b398df39341 100644 --- a/forge-gui/res/cardsfolder/o/orcish_librarian.txt +++ b/forge-gui/res/cardsfolder/o/orcish_librarian.txt @@ -3,6 +3,6 @@ ManaCost:1 R Types:Creature Orc PT:1/1 A:AB$ Dig | Cost$ R T | Defined$ You | DigNum$ 8 | ChangeNum$ 4 | RandomChange$ True | DestinationZone$ Exile | LibraryPosition2$ 0 | DestinationZone2$ Library | SpellDescription$ Look at the top eight cards of your library. Exile four of them at random, then put the rest on top of your library in any order. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/orcish_librarian.jpg Oracle:{R}, {T}: Look at the top eight cards of your library. Exile four of them at random, then put the rest on top of your library in any order. diff --git a/forge-gui/res/cardsfolder/o/orcish_lumberjack.txt b/forge-gui/res/cardsfolder/o/orcish_lumberjack.txt index 143191e532c..20ae951a1c4 100644 --- a/forge-gui/res/cardsfolder/o/orcish_lumberjack.txt +++ b/forge-gui/res/cardsfolder/o/orcish_lumberjack.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Creature Orc PT:1/1 A:AB$ Mana | Cost$ T Sac<1/Forest> | Produced$ Combo R G | Amount$ 3 | SpellDescription$ Add three mana in any combination of {R} and/or {G}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/orcish_lumberjack.jpg Oracle:{T}, Sacrifice a Forest: Add three mana in any combination of {R} and/or {G}. diff --git a/forge-gui/res/cardsfolder/o/orcish_mechanics.txt b/forge-gui/res/cardsfolder/o/orcish_mechanics.txt index 78da41fad95..d6438bf094d 100644 --- a/forge-gui/res/cardsfolder/o/orcish_mechanics.txt +++ b/forge-gui/res/cardsfolder/o/orcish_mechanics.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Creature Orc PT:1/1 A:AB$ DealDamage | Cost$ T Sac<1/Artifact> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to any target. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/orcish_mechanics.jpg Oracle:{T}, Sacrifice an artifact: Orcish Mechanics deals 2 damage to any target. diff --git a/forge-gui/res/cardsfolder/o/orcish_settlers.txt b/forge-gui/res/cardsfolder/o/orcish_settlers.txt index 1019612a488..d34b40262f1 100644 --- a/forge-gui/res/cardsfolder/o/orcish_settlers.txt +++ b/forge-gui/res/cardsfolder/o/orcish_settlers.txt @@ -5,6 +5,6 @@ PT:1/1 A:AB$ Destroy | Cost$ X X R T Sac<1/CARDNAME> | TargetMin$ 0 | TargetMax$ MaxTgts | References$ X,MaxTgts | ValidTgts$ Land | TgtPrompt$ Select target lands | SpellDescription$ Destroy X target lands. SVar:X:Targeted$Amount SVar:MaxTgts:Count$Valid Land -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/orcish_settlers.jpg Oracle:{X}{X}{R}, {T}, Sacrifice Orcish Settlers: Destroy X target lands. diff --git a/forge-gui/res/cardsfolder/o/orcish_vandal.txt b/forge-gui/res/cardsfolder/o/orcish_vandal.txt index 9c76bab4367..5e1f5dae127 100644 --- a/forge-gui/res/cardsfolder/o/orcish_vandal.txt +++ b/forge-gui/res/cardsfolder/o/orcish_vandal.txt @@ -4,5 +4,5 @@ Types:Creature Orc Warrior PT:1/1 A:AB$ DealDamage | Cost$ T Sac<1/Artifact> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to any target. SVar:AIPreference:SacCost$Artifact.token+nonCreature,Artifact.token+powerLE1,Artifact.cmcEQ1,Artifact.cmcEQ2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random Oracle:{T}, Sacrifice an artifact: Orcish Vandal deals 2 damage to any target. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/o/order_of_succession.txt b/forge-gui/res/cardsfolder/o/order_of_succession.txt index b65ebbb1038..b378f36fe31 100644 --- a/forge-gui/res/cardsfolder/o/order_of_succession.txt +++ b/forge-gui/res/cardsfolder/o/order_of_succession.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ ChooseDirection | Cost$ 3 U | SubAbility$ DBRepeat | AILogic$ GainControl | SpellDescription$ Choose left or right. Starting with you and proceeding in the chosen direction, each player chooses a creature controlled by the next player in that direction. Each player gains control of the creature they chose. SVar:DBRepeat:DB$ RepeatEach | RepeatSubAbility$ DBGainControl | RecordChoice$ True | ChooseCard$ Creature | FilterControlledBy$ NextPlayerInChosenDirection SVar:DBGainControl:DB$ GainControl | NewController$ Remembered | AllValid$ Card.IsImprinted -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/order_of_succession.jpg Oracle:Choose left or right. Starting with you and proceeding in the chosen direction, each player chooses a creature controlled by the next player in that direction. Each player gains control of the creature they chose. diff --git a/forge-gui/res/cardsfolder/o/order_of_the_sacred_torch.txt b/forge-gui/res/cardsfolder/o/order_of_the_sacred_torch.txt index ada81c669ed..89f410b4f39 100644 --- a/forge-gui/res/cardsfolder/o/order_of_the_sacred_torch.txt +++ b/forge-gui/res/cardsfolder/o/order_of_the_sacred_torch.txt @@ -3,6 +3,6 @@ ManaCost:1 W W Types:Creature Human Knight PT:2/2 A:AB$ Counter | Cost$ T PayLife<1> | TargetType$ Spell | TgtPrompt$ Select target Black spell | ValidTgts$ Card.Black | SpellDescription$ Counter target black spell. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/order_of_the_sacred_torch.jpg Oracle:{T}, Pay 1 life: Counter target black spell. diff --git a/forge-gui/res/cardsfolder/o/ordered_migration.txt b/forge-gui/res/cardsfolder/o/ordered_migration.txt index ae0c77c235c..403344d2105 100644 --- a/forge-gui/res/cardsfolder/o/ordered_migration.txt +++ b/forge-gui/res/cardsfolder/o/ordered_migration.txt @@ -3,6 +3,6 @@ ManaCost:3 W U Types:Sorcery A:SP$ Token | Cost$ 3 W U | TokenAmount$ X | References$ X | TokenName$ Bird | TokenTypes$ Creature,Bird | TokenOwner$ You | TokenColors$ Blue | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SpellDescription$ Domain — Create a 1/1 blue Bird creature token with flying for each basic land type among lands you control. SVar:X:Count$Domain -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ordered_migration.jpg Oracle:Domain — Create a 1/1 blue Bird creature token with flying for each basic land type among lands you control. diff --git a/forge-gui/res/cardsfolder/o/ordruun_commando.txt b/forge-gui/res/cardsfolder/o/ordruun_commando.txt index 063a8923ccc..16973aefba5 100644 --- a/forge-gui/res/cardsfolder/o/ordruun_commando.txt +++ b/forge-gui/res/cardsfolder/o/ordruun_commando.txt @@ -3,7 +3,7 @@ ManaCost:3 R Types:Creature Minotaur Soldier PT:4/1 A:AB$ PreventDamage | Cost$ W | Defined$ Self | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to CARDNAME this turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$white SVar:Picture:http://www.wizards.com/global/images/magic/general/ordruun_commando.jpg Oracle:{W}: Prevent the next 1 damage that would be dealt to Ordruun Commando this turn. diff --git a/forge-gui/res/cardsfolder/o/ore_gorger.txt b/forge-gui/res/cardsfolder/o/ore_gorger.txt index 31e7b63ee76..cfba9a6c49e 100644 --- a/forge-gui/res/cardsfolder/o/ore_gorger.txt +++ b/forge-gui/res/cardsfolder/o/ore_gorger.txt @@ -4,7 +4,7 @@ Types:Creature Spirit PT:3/1 T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDestroy | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, you may destroy target nonbasic land. SVar:TrigDestroy:DB$Destroy | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target nonbasic land -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/ore_gorger.jpg Oracle:Whenever you cast a Spirit or Arcane spell, you may destroy target nonbasic land. diff --git a/forge-gui/res/cardsfolder/o/oreskos_explorer.txt b/forge-gui/res/cardsfolder/o/oreskos_explorer.txt index d519bc8bb7f..57f741cebb4 100644 --- a/forge-gui/res/cardsfolder/o/oreskos_explorer.txt +++ b/forge-gui/res/cardsfolder/o/oreskos_explorer.txt @@ -5,6 +5,6 @@ PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigSearch | TriggerDescription$ When CARDNAME enters the battlefield, search your library for up to X Plains cards, where X is the number of players who control more lands than you. Reveal those cards, put them into your hand, then shuffle your library. SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Plains | ChangeNum$ X | Shuffle$ True | References$ X SVar:X:PlayerCountPropertywithAtLeast1MoreLandsThanYou$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/oreskos_explorer.jpg Oracle:When Oreskos Explorer enters the battlefield, search your library for up to X Plains cards, where X is the number of players who control more lands than you. Reveal those cards, put them into your hand, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/o/oriss_samite_guardian.txt b/forge-gui/res/cardsfolder/o/oriss_samite_guardian.txt index 79c00c94be0..e24fcbd8262 100644 --- a/forge-gui/res/cardsfolder/o/oriss_samite_guardian.txt +++ b/forge-gui/res/cardsfolder/o/oriss_samite_guardian.txt @@ -6,7 +6,7 @@ A:AB$ Pump | Cost$ T | KW$ Prevent all damage that would be dealt to CARDNAME. | A:AB$ Effect | Cost$ Discard<1/Card.namedOriss, Samite Guardian> | CostDesc$ Grandeur — Discard another card named CARDNAME:| Name$ Oriss Effect | IsCurse$ True | StaticAbilities$ CantBeCast,CantAttack | ValidTgts$ Player | RememberObjects$ Targeted | AILogic$ BeginningOfOppTurn | SpellDescription$ Target player can't cast spells this turn, and creatures that player controls can't attack this turn. SVar:CantBeCast:Mode$ CantBeCast | EffectZone$ Command | ValidCard$ Card | Caster$ Player.IsRemembered | Description$ Targeted player can't cast spells this turn. SVar:CantAttack:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.RememberedPlayerCtrl | AddHiddenKeyword$ CARDNAME can't attack. | Description$ Creatures targeted player controls can't attack this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonCombatPriority:2 DeckHints:Name$Oriss, Samite Guardian SVar:Picture:http://www.wizards.com/global/images/magic/general/oriss_samite_guardian.jpg diff --git a/forge-gui/res/cardsfolder/o/ornate_kanzashi.txt b/forge-gui/res/cardsfolder/o/ornate_kanzashi.txt index 241a5462c96..458c78b9834 100644 --- a/forge-gui/res/cardsfolder/o/ornate_kanzashi.txt +++ b/forge-gui/res/cardsfolder/o/ornate_kanzashi.txt @@ -7,6 +7,6 @@ SVar:STPlay:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ C SVar:TrigCleanup:Mode$ ChangesZone | ValidCard$ Card.IsRemembered | Origin$ Exile | Destination$ Any | TriggerZones$ Command | Execute$ DBExileSelf | Static$ True SVar:DBExileSelf:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ornate_kanzashi.jpg Oracle:{2}, {T}: Target opponent exiles the top card of their library. You may play that card this turn. diff --git a/forge-gui/res/cardsfolder/o/orochi_leafcaller.txt b/forge-gui/res/cardsfolder/o/orochi_leafcaller.txt index a84dd316615..2b3c8e70f58 100644 --- a/forge-gui/res/cardsfolder/o/orochi_leafcaller.txt +++ b/forge-gui/res/cardsfolder/o/orochi_leafcaller.txt @@ -3,6 +3,6 @@ ManaCost:G Types:Creature Snake Shaman PT:1/1 A:AB$ Mana | Cost$ G | Produced$ Any | SpellDescription$ Add one mana of any color. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/orochi_leafcaller.jpg Oracle:{G}: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/o/orzhov_charm.txt b/forge-gui/res/cardsfolder/o/orzhov_charm.txt index 105c5b9ad86..2c76465a4e6 100644 --- a/forge-gui/res/cardsfolder/o/orzhov_charm.txt +++ b/forge-gui/res/cardsfolder/o/orzhov_charm.txt @@ -9,6 +9,6 @@ SVar:DBDestroy:DB$ Destroy | ValidTgts$ Creature | TgtPrompt$ Select target crea SVar:DBLoseLife:DB$ LoseLife | Defined$ You | LifeAmount$ X | References$ X SVar:X:TargetedLKI$CardToughness SVar:DBZombify:DB$ ChangeZone | ValidTgts$ Creature.cmcLE1+YouOwn | TgtPrompt$ Select target creature card with converted mana cost 1 or less in your graveyard | Origin$ Graveyard | Destination$ Battlefield | SpellDescription$ Return target creature card with converted mana cost 1 or less from your graveyard to the battlefield. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/orzhov_charm.jpg Oracle:Choose one —\n• Return target creature you control and all Auras you control attached to it to their owner's hand.\n• Destroy target creature and you lose life equal to its toughness.\n• Return target creature card with converted mana cost 1 or less from your graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/o/orzhov_cluestone.txt b/forge-gui/res/cardsfolder/o/orzhov_cluestone.txt index 8923cad0acf..5346cf9ae6e 100644 --- a/forge-gui/res/cardsfolder/o/orzhov_cluestone.txt +++ b/forge-gui/res/cardsfolder/o/orzhov_cluestone.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. A:AB$ Draw | Cost$ W B T Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$White|Black SVar:Picture:http://www.wizards.com/global/images/magic/general/orzhov_cluestone.jpg Oracle:{T}: Add {W} or {B}.\n{W}{B}, {T}, Sacrifice Orzhov Cluestone: Draw a card. diff --git a/forge-gui/res/cardsfolder/o/orzhov_keyrune.txt b/forge-gui/res/cardsfolder/o/orzhov_keyrune.txt index 456c4e3cd6a..15b8cc4d84d 100644 --- a/forge-gui/res/cardsfolder/o/orzhov_keyrune.txt +++ b/forge-gui/res/cardsfolder/o/orzhov_keyrune.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. A:AB$ Animate | Cost$ W B | Defined$ Self | Power$ 1 | Toughness$ 4 | Types$ Artifact,Creature,Thrull | Colors$ White,Black | Keywords$ Lifelink | SpellDescription$ CARDNAME becomes a 1/4 white and black Thrull artifact creature with lifelink until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$White|Black SVar:Picture:http://www.wizards.com/global/images/magic/general/orzhov_keyrune.jpg Oracle:{T}: Add {W} or {B}.\n{W}{B}: Orzhov Keyrune becomes a 1/4 white and black Thrull artifact creature with lifelink until end of turn. diff --git a/forge-gui/res/cardsfolder/o/orzhov_pontiff.txt b/forge-gui/res/cardsfolder/o/orzhov_pontiff.txt index 5e60fa3bf18..b6084159cca 100644 --- a/forge-gui/res/cardsfolder/o/orzhov_pontiff.txt +++ b/forge-gui/res/cardsfolder/o/orzhov_pontiff.txt @@ -6,6 +6,6 @@ K:Haunt:TrigChoose SVar:TrigChoose:DB$ Charm | Choices$ DBPump,DBCurse | CharmNum$ 1 SVar:DBPump:DB$ PumpAll | ValidCards$ Card.Creature+YouCtrl | NumAtt$ 1 | NumDef$ 1 | SpellDescription$ Creatures you control get +1/+1 until end of turn. SVar:DBCurse:DB$ PumpAll | ValidCards$ Card.Creature+YouDontCtrl | NumAtt$ -1 | NumDef$ -1 | SpellDescription$ Creatures you don't control get -1/-1 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/orzhov_pontiff.jpg Oracle:Haunt (When this creature dies, exile it haunting target creature.)\nWhen Orzhov Pontiff enters the battlefield or the creature it haunts dies, choose one —\n• Creatures you control get +1/+1 until end of turn.\n• Creatures you don't control get -1/-1 until end of turn. diff --git a/forge-gui/res/cardsfolder/o/orzhov_signet.txt b/forge-gui/res/cardsfolder/o/orzhov_signet.txt index a69ce0a40de..f4edd3a181a 100644 --- a/forge-gui/res/cardsfolder/o/orzhov_signet.txt +++ b/forge-gui/res/cardsfolder/o/orzhov_signet.txt @@ -2,6 +2,6 @@ Name:Orzhov Signet ManaCost:2 Types:Artifact A:AB$ Mana | Cost$ 1 T | Produced$ W B | SpellDescription$ Add {W}{B}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/orzhov_signet.jpg Oracle:{1}, {T}: Add {W}{B}. diff --git a/forge-gui/res/cardsfolder/o/ostiary_thrull.txt b/forge-gui/res/cardsfolder/o/ostiary_thrull.txt index 89d0740870f..b98646db80b 100644 --- a/forge-gui/res/cardsfolder/o/ostiary_thrull.txt +++ b/forge-gui/res/cardsfolder/o/ostiary_thrull.txt @@ -3,7 +3,7 @@ ManaCost:3 B Types:Creature Thrull PT:2/2 A:AB$ Tap | Cost$ W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$white SVar:Picture:http://www.wizards.com/global/images/magic/general/ostiary_thrull.jpg Oracle:{W}, {T}: Tap target creature. diff --git a/forge-gui/res/cardsfolder/o/otherworld_atlas.txt b/forge-gui/res/cardsfolder/o/otherworld_atlas.txt index f8c26b0a026..f7f5c238c0d 100644 --- a/forge-gui/res/cardsfolder/o/otherworld_atlas.txt +++ b/forge-gui/res/cardsfolder/o/otherworld_atlas.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ PutCounter | Cost$ T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. A:AB$ Draw | Cost$ T | Defined$ Player | NumCards$ X | References$ X | SpellDescription$ Each player draws a card for each charge counter on CARDNAME. SVar:X:Count$CardCounters.CHARGE -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/otherworld_atlas.jpg Oracle:{T}: Put a charge counter on Otherworld Atlas.\n{T}: Each player draws a card for each charge counter on Otherworld Atlas. diff --git a/forge-gui/res/cardsfolder/o/oubliette.txt b/forge-gui/res/cardsfolder/o/oubliette.txt index ba1dffc123c..14f7ae21444 100644 --- a/forge-gui/res/cardsfolder/o/oubliette.txt +++ b/forge-gui/res/cardsfolder/o/oubliette.txt @@ -11,6 +11,6 @@ SVar:RestoreCounters:DB$ NoteCounters | Mode$ Load | Defined$ Imprinted | SubAbi SVar:TrigReturn:DB$ ChangeZone | Defined$ Imprinted | Origin$ Exile | Destination$ Battlefield | Tapped$ True | SubAbility$ TrigAuraReturn SVar:TrigAuraReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | AttachedTo$ Valid Creature.IsImprinted SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://resources.wizards.com/magic/cards/med/en-us/card159135.jpg Oracle:When Oubliette enters the battlefield, exile target creature and all Auras attached to it. Note the number and kind of counters that were on that creature.\nWhen Oubliette leaves the battlefield, return that exiled card to the battlefield under its owner's control tapped with the noted number and kind of counters on it. If you do, return the other exiled cards to the battlefield under their owner's control attached to that permanent. diff --git a/forge-gui/res/cardsfolder/o/outbreak.txt b/forge-gui/res/cardsfolder/o/outbreak.txt index 4022231a339..a2b5f04bffd 100644 --- a/forge-gui/res/cardsfolder/o/outbreak.txt +++ b/forge-gui/res/cardsfolder/o/outbreak.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ ChooseType | Cost$ 3 B | Defined$ You | Type$ Creature | SubAbility$ DBPumpAll | SpellDescription$ Choose a creature type. All creatures of that type get -1/-1 until end of turn. SVar:DBPumpAll:DB$PumpAll | ValidCards$ Creature.ChosenType | IsCurse$ True | NumAtt$ -1 | NumDef$ -1 | SpellDescription$ All creatures of that type get -1/-1 until end of turn. SVar:AltCost:Cost$ Discard<1/Swamp> -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/outbreak.jpg Oracle:You may discard a Swamp card rather than pay Outbreak's mana cost.\nChoose a creature type. All creatures of that type get -1/-1 until end of turn. diff --git a/forge-gui/res/cardsfolder/o/outmaneuver.txt b/forge-gui/res/cardsfolder/o/outmaneuver.txt index c2b1d2f6464..bba1cbff12c 100644 --- a/forge-gui/res/cardsfolder/o/outmaneuver.txt +++ b/forge-gui/res/cardsfolder/o/outmaneuver.txt @@ -5,6 +5,6 @@ A:SP$ Pump | Cost$ X R | KW$ HIDDEN CARDNAME assigns its combat damage as though # It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) SVar:X:Targeted$Amount SVar:MaxTgts:Count$Valid Creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/outmaneuver.jpg Oracle:X target blocked creatures assign their combat damage this turn as though they weren't blocked. diff --git a/forge-gui/res/cardsfolder/o/outrider_en_kor.txt b/forge-gui/res/cardsfolder/o/outrider_en_kor.txt index 0cc7f4e7623..46cfad641e1 100644 --- a/forge-gui/res/cardsfolder/o/outrider_en_kor.txt +++ b/forge-gui/res/cardsfolder/o/outrider_en_kor.txt @@ -6,6 +6,6 @@ K:Flanking A:AB$ Effect | Cost$ 0 | Name$ en-Kor Redirection | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control to redirect the damage to | ReplacementEffects$ EnKor | SVars$ EnKorDmg | References$ EnKor,EnKorDmg | Duration$ HostLeavesOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SpellDescription$ The next 1 damage that would be dealt to CARDNAME this turn is dealt to target creature you control instead. SVar:EnKor:Event$ DamageDone | ValidTarget$ Creature.EffectSource | ReplaceWith$ EnKorDmg | DamageTarget$ Remembered | Description$ The next 1 damage that would be dealt to EFFECTSOURCE this turn is dealt to target creature you control instead. SVar:EnKorDmg:DB$ ReplaceSplitDamage | DamageTarget$ Remembered -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/outrider_en_kor.jpg Oracle:Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.)\n{0}: The next 1 damage that would be dealt to Outrider en-Kor this turn is dealt to target creature you control instead. diff --git a/forge-gui/res/cardsfolder/o/overabundance.txt b/forge-gui/res/cardsfolder/o/overabundance.txt index 931e0d1de44..fb5958be812 100644 --- a/forge-gui/res/cardsfolder/o/overabundance.txt +++ b/forge-gui/res/cardsfolder/o/overabundance.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ TapsForMana | ValidCard$ Land | Execute$ TrigDmg | TriggerZones$ Battlefield | Static$ True | TriggerDescription$ Whenever a player taps a land for mana, that player adds one mana of any type that land produced, and CARDNAME deals 1 damage to them. SVar:TrigDmg:DB$ DealDamage | Defined$ TriggeredCardController | NumDmg$ 1 | SubAbility$ DBMana SVar:DBMana:DB$ ManaReflected | ColorOrType$ Type | Valid$ Defined.Triggered | ReflectProperty$ Produced | Defined$ TriggeredCardController -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/overabundance.jpg Oracle:Whenever a player taps a land for mana, that player adds one mana of any type that land produced, and Overabundance deals 1 damage to them. diff --git a/forge-gui/res/cardsfolder/o/overblaze.txt b/forge-gui/res/cardsfolder/o/overblaze.txt index 666d4275e16..11d1d7b542f 100644 --- a/forge-gui/res/cardsfolder/o/overblaze.txt +++ b/forge-gui/res/cardsfolder/o/overblaze.txt @@ -7,8 +7,8 @@ SVar:OverblazeEvent:Event$ DamageDone | ValidSource$ Permanent.IsRemembered | Va SVar:DmgTwice:DB$ ReplaceEffect | VarName$ DamageAmount | VarValue$ X | References$ X SVar:X:ReplaceCount$DamageAmount/Twice SVar:PlayMain1:TRUE -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random DeckHints:Type$Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/overblaze.jpg Oracle:Each time target permanent would deal damage to a permanent or player this turn, it deals double that damage to that permanent or player instead.\nSplice onto Arcane {2}{R}{R} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) diff --git a/forge-gui/res/cardsfolder/o/overburden.txt b/forge-gui/res/cardsfolder/o/overburden.txt index 528495dee48..c2714425a41 100644 --- a/forge-gui/res/cardsfolder/o/overburden.txt +++ b/forge-gui/res/cardsfolder/o/overburden.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonToken | TriggerZones$ Battlefield | Execute$ TrigBounce | TriggerDescription$ Whenever a player puts a nontoken creature onto the battlefield, that player returns a land they control to its owner's hand. SVar:TrigBounce:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | ChangeType$ Land | ChangeNum$ 1 | Mandatory$ True | DefinedPlayer$ TriggeredCardController | Chooser$ TriggeredCardController | Hidden$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/overburden.jpg Oracle:Whenever a player puts a nontoken creature onto the battlefield, that player returns a land they control to its owner's hand. diff --git a/forge-gui/res/cardsfolder/o/overeager_apprentice.txt b/forge-gui/res/cardsfolder/o/overeager_apprentice.txt index b5425fc3d09..44eb0e9aab1 100644 --- a/forge-gui/res/cardsfolder/o/overeager_apprentice.txt +++ b/forge-gui/res/cardsfolder/o/overeager_apprentice.txt @@ -3,6 +3,6 @@ ManaCost:2 B Types:Creature Human Minion PT:1/2 A:AB$ Mana | Cost$ Discard<1/Card> Sac<1/CARDNAME> | Produced$ B | Amount$ 3 | SpellDescription$ Add {B}{B}{B}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/overeager_apprentice.jpg Oracle:Discard a card, Sacrifice Overeager Apprentice: Add {B}{B}{B}. diff --git a/forge-gui/res/cardsfolder/o/overgrown_estate.txt b/forge-gui/res/cardsfolder/o/overgrown_estate.txt index a5363058b0e..ab05f0fe02b 100644 --- a/forge-gui/res/cardsfolder/o/overgrown_estate.txt +++ b/forge-gui/res/cardsfolder/o/overgrown_estate.txt @@ -2,7 +2,7 @@ Name:Overgrown Estate ManaCost:B G W Types:Enchantment A:AB$ GainLife | Cost$ Sac<1/Land> | Defined$ You | LifeAmount$ 3 | SpellDescription$ You gain 3 life. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/overgrown_estate.jpg Oracle:Sacrifice a land: You gain 3 life. diff --git a/forge-gui/res/cardsfolder/o/overgrowth.txt b/forge-gui/res/cardsfolder/o/overgrowth.txt index 373b274946a..47005f2b6e5 100644 --- a/forge-gui/res/cardsfolder/o/overgrowth.txt +++ b/forge-gui/res/cardsfolder/o/overgrowth.txt @@ -6,6 +6,6 @@ A:SP$ Attach | Cost$ 2 G | ValidTgts$ Land | AILogic$ Pump T:Mode$ TapsForMana | ValidCard$ Card.AttachedBy | Execute$ TrigMana | Static$ True | TriggerDescription$ Whenever enchanted land is tapped for mana, its controller adds an additional {G}{G}. SVar:TrigMana:DB$ Mana | Produced$ G | Amount$ 2 | Defined$ TriggeredCardController #TODO: Mana prediction for lands that produce additional mana (Overgrowth, Mana Flare, etc.) -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/overgrowth.jpg Oracle:Enchant land (Target a land as you cast this. This card enters the battlefield attached to that land.)\nWhenever enchanted land is tapped for mana, its controller adds an additional {G}{G}. diff --git a/forge-gui/res/cardsfolder/o/overlaid_terrain.txt b/forge-gui/res/cardsfolder/o/overlaid_terrain.txt index 0410ab154d1..b258286870b 100644 --- a/forge-gui/res/cardsfolder/o/overlaid_terrain.txt +++ b/forge-gui/res/cardsfolder/o/overlaid_terrain.txt @@ -5,7 +5,7 @@ K:ETBReplacement:Other:TrigSac SVar:TrigSac:DB$ SacrificeAll | ValidCards$ Land.YouCtrl | SpellDescription$ As CARDNAME enters the battlefield, sacrifice all lands you control. S:Mode$ Continuous | Affected$ Land.YouCtrl | AddAbility$ AnyMana | Description$ Lands you control have "{T}: Add two mana of any one color." SVar:AnyMana:AB$ Mana | Cost$ T | Produced$ Any | Amount$ 2 | SpellDescription$ Add two mana of any one color. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/overlaid_terrain.jpg Oracle:As Overlaid Terrain enters the battlefield, sacrifice all lands you control.\nLands you control have "{T}: Add two mana of any one color." diff --git a/forge-gui/res/cardsfolder/o/overmaster.txt b/forge-gui/res/cardsfolder/o/overmaster.txt index ad999d40c8c..b9fbe6dc528 100644 --- a/forge-gui/res/cardsfolder/o/overmaster.txt +++ b/forge-gui/res/cardsfolder/o/overmaster.txt @@ -6,6 +6,6 @@ SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. SVar:SpellCastTrig:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | Execute$ Mastery | TriggerDescription$ The next instant or sorcery spell you cast this turn can't be countered by spells or abilities. SVar:Mastery:DB$ Pump | Defined$ TriggeredCard | KW$ HIDDEN CARDNAME can't be countered. | PumpZone$ Stack | SubAbility$ DBCleanup SVar:DBCleanup:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/overmaster.jpg Oracle:The next instant or sorcery spell you cast this turn can't be countered by spells or abilities.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/o/overtaker.txt b/forge-gui/res/cardsfolder/o/overtaker.txt index a1bd99f4d68..ff3019f080f 100644 --- a/forge-gui/res/cardsfolder/o/overtaker.txt +++ b/forge-gui/res/cardsfolder/o/overtaker.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Creature Merfolk Spellshaper PT:1/1 A:AB$ GainControl | Cost$ 3 U T Discard<1/Card> | ValidTgts$ Creature | TgtPrompt$ Select target creature | LoseControl$ EOT | AddKWs$ Haste | Untap$ True | SpellDescription$ Untap target creature and gain control of it until end of turn. That creature gains haste until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/overtaker.jpg Oracle:{3}{U}, {T}, Discard a card: Untap target creature and gain control of it until end of turn. That creature gains haste until end of turn. diff --git a/forge-gui/res/cardsfolder/o/overwhelm.txt b/forge-gui/res/cardsfolder/o/overwhelm.txt index 278dad722e5..ec66b55300a 100644 --- a/forge-gui/res/cardsfolder/o/overwhelm.txt +++ b/forge-gui/res/cardsfolder/o/overwhelm.txt @@ -3,6 +3,6 @@ ManaCost:5 G G Types:Sorcery K:Convoke A:SP$PumpAll | Cost$ 5 G G | ValidCards$ Creature.YouCtrl | NumAtt$ 3 | NumDef$ 3 | SpellDescription$ Creatures you control get +3/+3 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/overwhelm.jpg Oracle:Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nCreatures you control get +3/+3 until end of turn. diff --git a/forge-gui/res/cardsfolder/o/ovinomancer.txt b/forge-gui/res/cardsfolder/o/ovinomancer.txt index d2b596d63b9..06c499e88ff 100644 --- a/forge-gui/res/cardsfolder/o/ovinomancer.txt +++ b/forge-gui/res/cardsfolder/o/ovinomancer.txt @@ -9,6 +9,6 @@ SVar:TrigBounce:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Hidde SVar:DBSacSelf:DB$ Sacrifice | Defined$ Self | SubAbility$ DBCleanup | ConditionCheckSVar$ X | ConditionSVarCompare$ LT3 | References$ X SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ovinomancer.jpg Oracle:When Ovinomancer enters the battlefield, sacrifice it unless you return three basic lands you control to their owner's hand.\n{T}, Return Ovinomancer to its owner's hand: Destroy target creature. It can't be regenerated. That creature's controller creates a 0/1 green Sheep creature token. diff --git a/forge-gui/res/cardsfolder/o/oxidda_daredevil.txt b/forge-gui/res/cardsfolder/o/oxidda_daredevil.txt index c0cc998700f..382a7869706 100644 --- a/forge-gui/res/cardsfolder/o/oxidda_daredevil.txt +++ b/forge-gui/res/cardsfolder/o/oxidda_daredevil.txt @@ -4,6 +4,6 @@ Types:Creature Goblin Artificer PT:2/1 A:AB$ Pump | Cost$ Sac<1/Artifact> | KW$ Haste | SpellDescription$ Oxidda Daredevil gains haste until end of turn. SVar:PlayMain1:TRUE -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/oxidda_daredevil.jpg Oracle:Sacrifice an artifact: Oxidda Daredevil gains haste until end of turn. diff --git a/forge-gui/res/cardsfolder/o/oxidda_golem.txt b/forge-gui/res/cardsfolder/o/oxidda_golem.txt index 62b6636fa2b..9eaa6310f10 100644 --- a/forge-gui/res/cardsfolder/o/oxidda_golem.txt +++ b/forge-gui/res/cardsfolder/o/oxidda_golem.txt @@ -5,7 +5,7 @@ PT:3/2 K:Haste S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ Affinity for Mountains (This spell costs {1} less to cast for each Mountain you control.) SVar:X:Count$Valid Mountain.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Red SVar:Picture:http://www.wizards.com/global/images/magic/general/oxidda_golem.jpg Oracle:Affinity for Mountains (This spell costs {1} less to cast for each Mountain you control.)\nHaste diff --git a/forge-gui/res/cardsfolder/o/oyobi_who_split_the_heavens.txt b/forge-gui/res/cardsfolder/o/oyobi_who_split_the_heavens.txt index 6f7f1dac010..4e987b1ce51 100644 --- a/forge-gui/res/cardsfolder/o/oyobi_who_split_the_heavens.txt +++ b/forge-gui/res/cardsfolder/o/oyobi_who_split_the_heavens.txt @@ -5,7 +5,7 @@ PT:3/6 K:Flying T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, create a 3/3 white Spirit creature token with flying. SVar:TrigToken:DB$Token | TokenImage$ w 3 3 spirit | TokenAmount$ 1 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenOwner$ You | TokenColors$ White | TokenPower$ 3 | TokenToughness$ 3 | TokenKeywords$ Flying -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/oyobi_who_split_the_heavens.jpg Oracle:Flying\nWhenever you cast a Spirit or Arcane spell, create a 3/3 white Spirit creature token with flying. diff --git a/forge-gui/res/cardsfolder/p/pack_hunt.txt b/forge-gui/res/cardsfolder/p/pack_hunt.txt index 6f9e256c0f2..16931b9beeb 100644 --- a/forge-gui/res/cardsfolder/p/pack_hunt.txt +++ b/forge-gui/res/cardsfolder/p/pack_hunt.txt @@ -3,7 +3,7 @@ ManaCost:3 G Types:Sorcery A:SP$ Pump | Cost$ 3 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | Static$ True | StackDescription$ None | SubAbility$ DBChangeZone | SpellDescription$ Search your library for up to three cards with the same name as target creature, reveal them, put them into your hand, then shuffle your library. SVar:DBChangeZone:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Targeted.sameName | ChangeNum$ 3 | StackDescription$ Search your library for up to three cards with the same name as target creature, reveal them, put them into your hand, then shuffle your library. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/pack_hunt.jpg Oracle:Search your library for up to three cards with the same name as target creature, reveal them, put them into your hand, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/p/packs_disdain.txt b/forge-gui/res/cardsfolder/p/packs_disdain.txt index 76ea1109995..ffda4b28308 100644 --- a/forge-gui/res/cardsfolder/p/packs_disdain.txt +++ b/forge-gui/res/cardsfolder/p/packs_disdain.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ ChooseType | Cost$ 1 B | Defined$ You | Type$ Creature | SubAbility$ DBPump| SpellDescription$ Choose a creature type. Target creature gets -1/-1 until end of turn for each permanent of the chosen type you control. SVar:DBPump:DB$ Pump | NumAtt$ -X | NumDef$ -X | References$ X | ValidTgts$ Creature | TgtPrompt$ Select target creature. SVar:X:Count$Valid Permanent.ChosenType+YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/packs_disdain.jpg Oracle:Choose a creature type. Target creature gets -1/-1 until end of turn for each permanent of the chosen type you control. diff --git a/forge-gui/res/cardsfolder/p/pact_of_negation.txt b/forge-gui/res/cardsfolder/p/pact_of_negation.txt index 39fab438cfa..946e375167d 100644 --- a/forge-gui/res/cardsfolder/p/pact_of_negation.txt +++ b/forge-gui/res/cardsfolder/p/pact_of_negation.txt @@ -7,6 +7,6 @@ SVar:DBDelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Y SVar:TrigLoseGame:DB$ LosesGame | UnlessCost$ 3 U U | UnlessPayer$ You | Defined$ You SVar:NeedsToPlayVar:NumLands GE5 SVar:NumLands:Count$Valid Land.YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/pact_of_negation.jpg Oracle:Counter target spell.\nAt the beginning of your next upkeep, pay {3}{U}{U}. If you don't, you lose the game. diff --git a/forge-gui/res/cardsfolder/p/pact_of_the_titan.txt b/forge-gui/res/cardsfolder/p/pact_of_the_titan.txt index 73e9f4b8a74..eb82939f8ec 100644 --- a/forge-gui/res/cardsfolder/p/pact_of_the_titan.txt +++ b/forge-gui/res/cardsfolder/p/pact_of_the_titan.txt @@ -7,6 +7,6 @@ SVar:DBDelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Y SVar:TrigLoseGame:DB$ LosesGame | UnlessCost$ 4 R | UnlessPayer$ You | Defined$ You SVar:NeedsToPlayVar:NumLands GE5 SVar:NumLands:Count$Valid Land.YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/pact_of_the_titan.jpg Oracle:Create a 4/4 red Giant creature token.\nAt the beginning of your next upkeep, pay {4}{R}. If you don't, you lose the game. diff --git a/forge-gui/res/cardsfolder/p/pain_kami.txt b/forge-gui/res/cardsfolder/p/pain_kami.txt index d870fcab723..7036a4b99db 100644 --- a/forge-gui/res/cardsfolder/p/pain_kami.txt +++ b/forge-gui/res/cardsfolder/p/pain_kami.txt @@ -4,6 +4,6 @@ Types:Creature Spirit PT:2/2 A:AB$ DealDamage | Cost$ X R Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals X damage to target creature. SVar:X:Count$xPaid -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/pain_kami.jpg Oracle:{X}{R}, Sacrifice Pain Kami: Pain Kami deals X damage to target creature. diff --git a/forge-gui/res/cardsfolder/p/painbringer.txt b/forge-gui/res/cardsfolder/p/painbringer.txt index d7911a7abd9..c537f54cddb 100644 --- a/forge-gui/res/cardsfolder/p/painbringer.txt +++ b/forge-gui/res/cardsfolder/p/painbringer.txt @@ -4,6 +4,6 @@ Types:Creature Human Minion PT:1/1 A:AB$ Pump | Cost$ T ExileFromGrave | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -ChosenX | NumDef$ -ChosenX | References$ X | CostDesc$ {T}, Exile any number of cards from your graveyard: | SpellDescription$ Target creature gets -X/-X until end of turn, where X is the number of cards exiled this way. SVar:X:XChoice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/painbringer.jpg Oracle:{T}, Exile any number of cards from your graveyard: Target creature gets -X/-X until end of turn, where X is the number of cards exiled this way. diff --git a/forge-gui/res/cardsfolder/p/painted_bluffs.txt b/forge-gui/res/cardsfolder/p/painted_bluffs.txt index 9620600f543..c0d4e38d5ad 100644 --- a/forge-gui/res/cardsfolder/p/painted_bluffs.txt +++ b/forge-gui/res/cardsfolder/p/painted_bluffs.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land Desert A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ 1 T | Produced$ Any | SpellDescription$ Add one mana of any color. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/painted_bluffs.jpg Oracle:{T}: Add {C}.\n{1}, {T}: Add one mana of any color. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/p/painwracker_oni.txt b/forge-gui/res/cardsfolder/p/painwracker_oni.txt index 180d7075cb1..1db9605d417 100644 --- a/forge-gui/res/cardsfolder/p/painwracker_oni.txt +++ b/forge-gui/res/cardsfolder/p/painwracker_oni.txt @@ -5,7 +5,7 @@ PT:5/4 K:Fear T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigSac | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, sacrifice a creature if you don't control an Ogre. SVar:TrigSac:DB$ Sacrifice | SacValid$ Creature | Defined$ You | ConditionPresent$ Ogre.YouCtrl | ConditionCompare$ EQ0 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NeedsToPlay:Ogre.YouCtrl DeckHints:Type$Ogre SVar:Picture:http://www.wizards.com/global/images/magic/general/painwracker_oni.jpg diff --git a/forge-gui/res/cardsfolder/p/pale_moon.txt b/forge-gui/res/cardsfolder/p/pale_moon.txt index efedece7f24..c88cf4adfcf 100644 --- a/forge-gui/res/cardsfolder/p/pale_moon.txt +++ b/forge-gui/res/cardsfolder/p/pale_moon.txt @@ -4,7 +4,7 @@ Types:Instant A:SP$ Effect | Cost$ 1 U | ReplacementEffects$ ReplaceColorless | SVars$ ProduceColorless | SpellDescription$ Until end of turn, if a player taps a nonbasic land for mana, it produces colorless mana instead of any other type. SVar:ReplaceColorless:Event$ ProduceMana | ActiveZones$ Command | ValidCard$ Land.nonBasic | ManaReplacement$ ProduceColorless | Description$ If a player taps a nonbasic land for mana, it produces colorless mana instead of any other type. SVar:ProduceColorless:U->1 & B->1 & R->1 & G->1 & W->1 -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/pale_moon.jpg Oracle:Until end of turn, if a player taps a nonbasic land for mana, it produces colorless mana instead of any other type. diff --git a/forge-gui/res/cardsfolder/p/pale_wayfarer.txt b/forge-gui/res/cardsfolder/p/pale_wayfarer.txt index ab2cd56668a..031524b50dd 100644 --- a/forge-gui/res/cardsfolder/p/pale_wayfarer.txt +++ b/forge-gui/res/cardsfolder/p/pale_wayfarer.txt @@ -3,6 +3,6 @@ ManaCost:5 W W Types:Creature Spirit Giant PT:4/4 A:AB$ Protection | Cost$ 2 W W Untap | ValidTgts$ Creature | TgtPrompt$ Select target creature | Gains$ Choice | Choices$ AnyColor | Choser$ Controller | SpellDescription$ Target creature gains protection from the color of its controller's choice until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/pale_wayfarer.jpg Oracle:{2}{W}{W}, {Q}: Target creature gains protection from the color of its controller's choice until end of turn. ({Q} is the untap symbol.) diff --git a/forge-gui/res/cardsfolder/p/panacea.txt b/forge-gui/res/cardsfolder/p/panacea.txt index 9ce5f214f65..d65de63929c 100644 --- a/forge-gui/res/cardsfolder/p/panacea.txt +++ b/forge-gui/res/cardsfolder/p/panacea.txt @@ -3,6 +3,6 @@ ManaCost:4 Types:Artifact A:AB$ PreventDamage | Cost$ X X T | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | Amount$ X | References$ X | SpellDescription$ Prevent the next X damage that would be dealt to any target this turn. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/panacea.jpg Oracle:{X}{X}, {T}: Prevent the next X damage that would be dealt to any target this turn. diff --git a/forge-gui/res/cardsfolder/p/pandemonium.txt b/forge-gui/res/cardsfolder/p/pandemonium.txt index ed58f7ceadc..4c23ada2711 100644 --- a/forge-gui/res/cardsfolder/p/pandemonium.txt +++ b/forge-gui/res/cardsfolder/p/pandemonium.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigDamage | OptionalDecider$ TriggeredCardController | TriggerDescription$ Whenever a creature enters the battlefield, that creature's controller may have it deal damage equal to its power to any target of their choice. SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X | DamageSource$ TriggeredCard | TargetingPlayer$ TriggeredCardController SVar:X:TriggeredCard$CardPower -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/pandemonium.jpg Oracle:Whenever a creature enters the battlefield, that creature's controller may have it deal damage equal to its power to any target of their choice. diff --git a/forge-gui/res/cardsfolder/p/pangosaur.txt b/forge-gui/res/cardsfolder/p/pangosaur.txt index 65286bfd481..5e3f46a92e5 100644 --- a/forge-gui/res/cardsfolder/p/pangosaur.txt +++ b/forge-gui/res/cardsfolder/p/pangosaur.txt @@ -4,6 +4,6 @@ Types:Creature Dinosaur PT:6/6 T:Mode$ LandPlayed | ValidCard$ Land | TriggerZones$ Battlefield | Execute$ TrigBounce | TriggerDescription$ Whenever a player plays a land, return Pangosaur to its owner's hand. SVar:TrigBounce:DB$ChangeZone | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/pangosaur.jpg Oracle:Whenever a player plays a land, return Pangosaur to its owner's hand. diff --git a/forge-gui/res/cardsfolder/p/panic_attack.txt b/forge-gui/res/cardsfolder/p/panic_attack.txt index a41041e8996..07b54d78c75 100644 --- a/forge-gui/res/cardsfolder/p/panic_attack.txt +++ b/forge-gui/res/cardsfolder/p/panic_attack.txt @@ -2,6 +2,6 @@ Name:Panic Attack ManaCost:2 R Types:Sorcery A:SP$ Pump | Cost$ 2 R | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 3 | KW$ HIDDEN CARDNAME can't block. | IsCurse$ True | TgtPrompt$ Select target creature. | SpellDescription$ Up to three target creatures can't block this turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/panic_attack.jpg Oracle:Up to three target creatures can't block this turn. diff --git a/forge-gui/res/cardsfolder/p/panic_spellbomb.txt b/forge-gui/res/cardsfolder/p/panic_spellbomb.txt index 98365f9cb5e..a5329da6158 100644 --- a/forge-gui/res/cardsfolder/p/panic_spellbomb.txt +++ b/forge-gui/res/cardsfolder/p/panic_spellbomb.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ Pump | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME can't block. | IsCurse$ True | SpellDescription$ Target creature can't block this turn. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | OptionalDecider$ TriggeredCardController | Execute$ TrigDraw | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you may pay {R}. If you do, draw a card. SVar:TrigDraw:AB$Draw | Cost$ R | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/panic_spellbomb.jpg Oracle:{T}, Sacrifice Panic Spellbomb: Target creature can't block this turn.\nWhen Panic Spellbomb is put into a graveyard from the battlefield, you may pay {R}. If you do, draw a card. diff --git a/forge-gui/res/cardsfolder/p/panoptic_mirror.txt b/forge-gui/res/cardsfolder/p/panoptic_mirror.txt index 97818c62066..4919f269181 100644 --- a/forge-gui/res/cardsfolder/p/panoptic_mirror.txt +++ b/forge-gui/res/cardsfolder/p/panoptic_mirror.txt @@ -9,6 +9,6 @@ T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCar SVar:DBForget:DB$ Pump | ForgetImprinted$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Card.Self | Destination$ Any | Execute$ DBCleanup | Static$ True SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/panoptic_mirror.jpg Oracle:Imprint — {X}, {T}: You may exile an instant or sorcery card with converted mana cost X from your hand.\nAt the beginning of your upkeep, you may copy a card exiled with Panoptic Mirror. If you do, you may cast the copy without paying its mana cost. diff --git a/forge-gui/res/cardsfolder/p/paradigm_shift.txt b/forge-gui/res/cardsfolder/p/paradigm_shift.txt index 93d41217712..b2110061efd 100644 --- a/forge-gui/res/cardsfolder/p/paradigm_shift.txt +++ b/forge-gui/res/cardsfolder/p/paradigm_shift.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Sorcery A:SP$ ChangeZoneAll | Cost$ 1 U | ChangeType$ Card.YouOwn | Origin$ Library | Destination$ Exile | SubAbility$ DBShuffle | SpellDescription$ Exile all cards from your library. Then shuffle your graveyard into your library. SVar:DBShuffle:DB$ChangeZoneAll | ChangeType$ Card.YouOwn | Origin$ Graveyard | Destination$ Library | Shuffle$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/paradigm_shift.jpg Oracle:Exile all cards from your library. Then shuffle your graveyard into your library. diff --git a/forge-gui/res/cardsfolder/p/paradox_haze.txt b/forge-gui/res/cardsfolder/p/paradox_haze.txt index 40026f5089e..2c6183281bc 100644 --- a/forge-gui/res/cardsfolder/p/paradox_haze.txt +++ b/forge-gui/res/cardsfolder/p/paradox_haze.txt @@ -5,6 +5,6 @@ K:Enchant player A:SP$ Attach | Cost$ 2 U | ValidTgts$ Player T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player.EnchantedBy | TriggerZones$ Battlefield | FirstUpkeep$ True | Execute$ AddUpkeep | TriggerDescription$ At the beginning of enchanted player's first upkeep each turn, that player gets an additional upkeep step after this step. SVar:AddUpkeep:DB$ AddPhase | ExtraPhase$ Upkeep -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/paradox_haze.jpg Oracle:Enchant player\nAt the beginning of enchanted player's first upkeep each turn, that player gets an additional upkeep step after this step. diff --git a/forge-gui/res/cardsfolder/p/parallax_dementia.txt b/forge-gui/res/cardsfolder/p/parallax_dementia.txt index f8f74de35ae..184059a2ebe 100644 --- a/forge-gui/res/cardsfolder/p/parallax_dementia.txt +++ b/forge-gui/res/cardsfolder/p/parallax_dementia.txt @@ -7,6 +7,6 @@ A:SP$ Attach | Cost$ 1 B | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 3 | AddToughness$ 2 | Description$ Enchanted creature gets +3/+2. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME leaves the battlefield, destroy enchanted creature. That creature can't be regenerated. SVar:TrigDestroy:DB$DestroyAll | ValidCards$ Triggered.EnchantedBy | NoRegen$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/parallax_dementia.jpg Oracle:Enchant creature\nFading 1 (This enchantment enters the battlefield with one fade counter on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it.)\nEnchanted creature gets +3/+2.\nWhen Parallax Dementia leaves the battlefield, destroy enchanted creature. That creature can't be regenerated. diff --git a/forge-gui/res/cardsfolder/p/parallax_inhibitor.txt b/forge-gui/res/cardsfolder/p/parallax_inhibitor.txt index 8e5d2b8b517..9bf1bc3e8b0 100644 --- a/forge-gui/res/cardsfolder/p/parallax_inhibitor.txt +++ b/forge-gui/res/cardsfolder/p/parallax_inhibitor.txt @@ -2,6 +2,6 @@ Name:Parallax Inhibitor ManaCost:2 Types:Artifact A:AB$ PutCounterAll | Cost$ 1 T Sac<1/CARDNAME> | ValidCards$ Permanent.withFading+YouCtrl | CounterType$ FADE | CounterNum$ 1 | SpellDescription$ Put a fade counter on each permanent with fading you control. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/parallax_inhibitor.jpg Oracle:{1}, {T}, Sacrifice Parallax Inhibitor: Put a fade counter on each permanent with fading you control. diff --git a/forge-gui/res/cardsfolder/p/parallax_tide.txt b/forge-gui/res/cardsfolder/p/parallax_tide.txt index 3c257bc043d..682b32be76c 100644 --- a/forge-gui/res/cardsfolder/p/parallax_tide.txt +++ b/forge-gui/res/cardsfolder/p/parallax_tide.txt @@ -7,6 +7,6 @@ T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.S SVar:TrigReturn:DB$ChangeZone | Defined$ Imprinted | Origin$ Exile | Destination$ Battlefield | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True SVar:PlayMain1:TRUE -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/parallax_tide.jpg Oracle:Fading 5 (This enchantment enters the battlefield with five fade counters on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it.)\nRemove a fade counter from Parallax Tide: Exile target land.\nWhen Parallax Tide leaves the battlefield, each player returns to the battlefield all cards they own exiled with Parallax Tide. diff --git a/forge-gui/res/cardsfolder/p/parallax_wave.txt b/forge-gui/res/cardsfolder/p/parallax_wave.txt index 5c3b664e0ec..eb087bdc4b1 100644 --- a/forge-gui/res/cardsfolder/p/parallax_wave.txt +++ b/forge-gui/res/cardsfolder/p/parallax_wave.txt @@ -7,6 +7,6 @@ T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.S SVar:TrigReturn:DB$ ChangeZone | Defined$ Imprinted | Origin$ Exile | Destination$ Battlefield | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True SVar:PlayMain1:TRUE -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/parallax_wave.jpg Oracle:Fading 5 (This enchantment enters the battlefield with five fade counters on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it.)\nRemove a fade counter from Parallax Wave: Exile target creature.\nWhen Parallax Wave leaves the battlefield, each player returns to the battlefield all cards they own exiled with Parallax Wave. diff --git a/forge-gui/res/cardsfolder/p/parallectric_feedback.txt b/forge-gui/res/cardsfolder/p/parallectric_feedback.txt index 9d5a2c81876..1bab7b2db54 100644 --- a/forge-gui/res/cardsfolder/p/parallectric_feedback.txt +++ b/forge-gui/res/cardsfolder/p/parallectric_feedback.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Pump | Cost$ 3 R | ValidTgts$ Card | TgtZone$ Stack | TgtPrompt$ Select target spell | PumpZone$ Stack | StackDescription$ None | SubAbility$ DBDmg | SpellDescription$ CARDNAME deals damage to target spell's controller equal to that spell's converted mana cost. SVar:DBDmg:DB$ DealDamage | Defined$ TargetedController | NumDmg$ X | References$ X SVar:X:Targeted$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/parallectric_feedback.jpg Oracle:Parallectric Feedback deals damage to target spell's controller equal to that spell's converted mana cost. diff --git a/forge-gui/res/cardsfolder/p/parallel_evolution.txt b/forge-gui/res/cardsfolder/p/parallel_evolution.txt index cc1b93069e9..1cbd28fbdd7 100644 --- a/forge-gui/res/cardsfolder/p/parallel_evolution.txt +++ b/forge-gui/res/cardsfolder/p/parallel_evolution.txt @@ -4,6 +4,6 @@ Types:Sorcery K:Flashback:4 G G G A:SP$ RepeatEach | Cost$ 3 G G | RepeatSubAbility$ DBClone | RepeatCards$ Creature.token | AILogic$ CloneAllTokens | SpellDescription$ For each creature token on the battlefield, its controller creates a token that's a copy of that creature. SVar:DBClone:DB$ CopyPermanent | Defined$ Remembered | Controller$ RememberedController -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/parallel_evolution.jpg Oracle:For each creature token on the battlefield, its controller creates a token that's a copy of that creature.\nFlashback {4}{G}{G}{G} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/p/parallel_thoughts.txt b/forge-gui/res/cardsfolder/p/parallel_thoughts.txt index e647dec0032..48537a8da5e 100644 --- a/forge-gui/res/cardsfolder/p/parallel_thoughts.txt +++ b/forge-gui/res/cardsfolder/p/parallel_thoughts.txt @@ -9,7 +9,7 @@ T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.S SVar:TrigReset:DB$ Cleanup | ClearRemembered$ True R:Event$ Draw | ActiveZones$ Battlefield | ValidPlayer$ You | ReplaceWith$ RepParallelThoughts | Optional$ True | OptionalDecider$ You | Description$ If you would draw a card, you may instead put the top card of the pile you exiled into your hand. SVar:RepParallelThoughts:DB$ ChangeZone | Defined$ FirstRemembered | Origin$ Exile | Destination$ Hand -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/parallel_thoughts.jpg Oracle:When Parallel Thoughts enters the battlefield, search your library for seven cards, exile them in a face-down pile, and shuffle that pile. Then shuffle your library.\nIf you would draw a card, you may instead put the top card of the pile you exiled into your hand. diff --git a/forge-gui/res/cardsfolder/p/pardic_collaborator.txt b/forge-gui/res/cardsfolder/p/pardic_collaborator.txt index 3d23aa9b124..4efc8aedf5a 100644 --- a/forge-gui/res/cardsfolder/p/pardic_collaborator.txt +++ b/forge-gui/res/cardsfolder/p/pardic_collaborator.txt @@ -4,7 +4,7 @@ Types:Creature Human Barbarian PT:2/2 K:First Strike A:AB$ Pump | Cost$ B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black SVar:Picture:http://www.wizards.com/global/images/magic/general/pardic_collaborator.jpg Oracle:First strike\n{B}: Pardic Collaborator gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/p/pardic_lancer.txt b/forge-gui/res/cardsfolder/p/pardic_lancer.txt index 518b5fc5712..126e3d7a913 100644 --- a/forge-gui/res/cardsfolder/p/pardic_lancer.txt +++ b/forge-gui/res/cardsfolder/p/pardic_lancer.txt @@ -3,6 +3,6 @@ ManaCost:4 R Types:Creature Human Barbarian PT:3/2 A:AB$ Pump | Cost$ Discard<1/Random> | Defined$ Self | NumAtt$ +1 | KW$ First Strike | SpellDescription$ CARDNAME gets +1/+0 and gains first strike until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/pardic_lancer.jpg Oracle:Discard a card at random: Pardic Lancer gets +1/+0 and gains first strike until end of turn. diff --git a/forge-gui/res/cardsfolder/p/pardic_miner.txt b/forge-gui/res/cardsfolder/p/pardic_miner.txt index 4e136da1c9c..78b6f527a07 100644 --- a/forge-gui/res/cardsfolder/p/pardic_miner.txt +++ b/forge-gui/res/cardsfolder/p/pardic_miner.txt @@ -4,6 +4,6 @@ Types:Creature Dwarf PT:1/1 A:AB$ Effect | Cost$ Sac<1/CARDNAME> | ValidTgts$ Player | Name$ Pardic Miner Effect | StaticAbilities$ STCantPlayLand | RememberObjects$ Targeted | AILogic$ BeginningOfOppTurn | SpellDescription$ Target player can't play lands this turn. SVar:STCantPlayLand:Mode$ CantPlayLand | EffectZone$ Command | Player$ Player.IsRemembered | Description$ Target player can't play land cards this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/pardic_miner.jpg Oracle:Sacrifice Pardic Miner: Target player can't play lands this turn. diff --git a/forge-gui/res/cardsfolder/p/pardic_swordsmith.txt b/forge-gui/res/cardsfolder/p/pardic_swordsmith.txt index a20a9e01a17..946e9d1802c 100644 --- a/forge-gui/res/cardsfolder/p/pardic_swordsmith.txt +++ b/forge-gui/res/cardsfolder/p/pardic_swordsmith.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Creature Dwarf PT:1/1 A:AB$ Pump | Cost$ R Discard<1/Random> | NumAtt$ +2 | SpellDescription$ CARDNAME gets +2/+0 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/pardic_swordsmith.jpg Oracle:{R}, Discard a card at random: Pardic Swordsmith gets +2/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/p/paroxysm.txt b/forge-gui/res/cardsfolder/p/paroxysm.txt index e106818e8f4..14656d421e8 100644 --- a/forge-gui/res/cardsfolder/p/paroxysm.txt +++ b/forge-gui/res/cardsfolder/p/paroxysm.txt @@ -8,6 +8,6 @@ SVar:TriggeredParoxysm:DB$ Dig | Defined$ TriggeredPlayer | DigNum$ 1 | Reveal$ SVar:DestructiveParoxysm:DB$ Destroy | Defined$ Enchanted | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | ConditionCompare$ EQ1 | SubAbility$ BeserkParoxysm SVar:BeserkParoxysm:DB$ Pump | Defined$ Enchanted | NumAtt$ 3 | NumDef$ 3 | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | ConditionCompare$ EQ0 | SubAbility$DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/paroxysm.jpg Oracle:Enchant creature\nAt the beginning of the upkeep of enchanted creature's controller, that player reveals the top card of their library. If that card is a land card, destroy that creature. Otherwise, it gets +3/+3 until end of turn. diff --git a/forge-gui/res/cardsfolder/p/part_the_veil.txt b/forge-gui/res/cardsfolder/p/part_the_veil.txt index 09959208647..8b94973c03a 100644 --- a/forge-gui/res/cardsfolder/p/part_the_veil.txt +++ b/forge-gui/res/cardsfolder/p/part_the_veil.txt @@ -2,6 +2,6 @@ Name:Part the Veil ManaCost:3 U Types:Instant Arcane A:SP$ ChangeZoneAll | Cost$ 3 U | ChangeType$ Creature.YouCtrl | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return all creatures you control to their owner's hand. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/part_the_veil.jpg Oracle:Return all creatures you control to their owner's hand. diff --git a/forge-gui/res/cardsfolder/p/part_water.txt b/forge-gui/res/cardsfolder/p/part_water.txt index ff568018d5e..eca7777cd23 100644 --- a/forge-gui/res/cardsfolder/p/part_water.txt +++ b/forge-gui/res/cardsfolder/p/part_water.txt @@ -5,7 +5,7 @@ A:SP$ Pump | Cost$ X X U | KW$ Islandwalk | TargetMin$ 0 | TargetMax$ MaxTgts | # It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) SVar:X:Targeted$Amount SVar:MaxTgts:Count$Valid Creature -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/part_water.jpg Oracle:X target creatures gain islandwalk until end of turn. diff --git a/forge-gui/res/cardsfolder/p/past_in_flames.txt b/forge-gui/res/cardsfolder/p/past_in_flames.txt index dcc2b810131..4cbcc68c7fd 100644 --- a/forge-gui/res/cardsfolder/p/past_in_flames.txt +++ b/forge-gui/res/cardsfolder/p/past_in_flames.txt @@ -3,6 +3,6 @@ ManaCost:3 R Types:Sorcery K:Flashback:4 R A:SP$PumpAll | Cost$ 3 R | ValidCards$ Instant.YouCtrl,Sorcery.YouCtrl | KW$ Flashback | PumpZone$ Graveyard | SpellDescription$ Each instant and sorcery card in your graveyard gains flashback until end of turn. The flashback cost is equal to its mana cost. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/past_in_flames.jpg Oracle:Each instant and sorcery card in your graveyard gains flashback until end of turn. The flashback cost is equal to its mana cost.\nFlashback {4}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/p/patagia_viper.txt b/forge-gui/res/cardsfolder/p/patagia_viper.txt index 00f8364ce00..db23a950581 100644 --- a/forge-gui/res/cardsfolder/p/patagia_viper.txt +++ b/forge-gui/res/cardsfolder/p/patagia_viper.txt @@ -8,7 +8,7 @@ T:Mode$ ChangesZone | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ SVar:TrigToken:DB$Token | TokenImage$ gu 1 1 snake | TokenAmount$ 2 | TokenName$ Snake | TokenTypes$ Creature,Snake | TokenOwner$ You | TokenColors$ Green,Blue | TokenPower$ 1 | TokenToughness$ 1 SVar:TrigSac:DB$Sacrifice | Defined$ Self SVar:ManaNeededToAvoidNegativeEffect:blue -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Blue SVar:Picture:http://www.wizards.com/global/images/magic/general/patagia_viper.jpg Oracle:Flying\nWhen Patagia Viper enters the battlefield, create two 1/1 green and blue Snake creature tokens.\nWhen Patagia Viper enters the battlefield, sacrifice it unless {U} was spent to cast it. diff --git a/forge-gui/res/cardsfolder/p/patriarchs_bidding.txt b/forge-gui/res/cardsfolder/p/patriarchs_bidding.txt index 83de1dfa28a..6e8d6d63345 100644 --- a/forge-gui/res/cardsfolder/p/patriarchs_bidding.txt +++ b/forge-gui/res/cardsfolder/p/patriarchs_bidding.txt @@ -6,6 +6,6 @@ SVar:DBChooseType:DB$ ChooseType | Defined$ Player.IsRemembered | Type$ Creature SVar:DBRemember:DB$ PumpAll | ValidCards$ Creature.ChosenType | RememberAllPumped$ True | PumpZone$ Graveyard SVar:DBBidding:DB$ ChangeZoneAll | ChangeType$ Creature.IsRemembered | Origin$ Graveyard | Destination$ Battlefield | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/patriarchs_bidding.jpg Oracle:Each player chooses a creature type. Each player returns all creature cards of a type chosen this way from their graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/p/patriarchs_desire.txt b/forge-gui/res/cardsfolder/p/patriarchs_desire.txt index 42f867b04d8..68fd6ccf2b1 100644 --- a/forge-gui/res/cardsfolder/p/patriarchs_desire.txt +++ b/forge-gui/res/cardsfolder/p/patriarchs_desire.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ 3 B | ValidTgts$ Creature | AILogic$ Curse S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ X | AddToughness$ -X | References$ X | Description$ Enchanted creature gets +2/-2. Threshold — Enchanted creature gets an additional +2/-2 as long as seven or more cards are in your graveyard. SVar:X:Count$Threshold.4.2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/patriarchs_desire.jpg Oracle:Enchant creature\nEnchanted creature gets +2/-2.\nThreshold — Enchanted creature gets an additional +2/-2 as long as seven or more cards are in your graveyard. diff --git a/forge-gui/res/cardsfolder/p/patron_of_the_akki.txt b/forge-gui/res/cardsfolder/p/patron_of_the_akki.txt index aea5a8216fc..ae66f7e0c79 100644 --- a/forge-gui/res/cardsfolder/p/patron_of_the_akki.txt +++ b/forge-gui/res/cardsfolder/p/patron_of_the_akki.txt @@ -5,6 +5,6 @@ PT:5/5 K:Goblin offering T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, creatures you control get +2/+0 until end of turn. SVar:TrigPump:DB$ PumpAll | ValidCards$ Creature.YouCtrl | NumAtt$ 2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/patron_of_the_akki.jpg Oracle:Goblin offering (You may cast this card any time you could cast an instant by sacrificing a Goblin and paying the difference in mana costs between this and the sacrificed Goblin. Mana cost includes color.)\nWhenever Patron of the Akki attacks, creatures you control get +2/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/p/patron_of_the_kitsune.txt b/forge-gui/res/cardsfolder/p/patron_of_the_kitsune.txt index f106ec22274..77b6d29d236 100644 --- a/forge-gui/res/cardsfolder/p/patron_of_the_kitsune.txt +++ b/forge-gui/res/cardsfolder/p/patron_of_the_kitsune.txt @@ -5,6 +5,6 @@ PT:5/6 K:Fox offering T:Mode$ Attacks | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ PatronLife | OptionalDecider$ You | TriggerDescription$ Whenever a creature attacks, you gain 1 life. SVar:PatronLife:DB$ GainLife | LifeAmount$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/patron_of_the_kitsune.jpg Oracle:Fox offering (You may cast this card any time you could cast an instant by sacrificing a Fox and paying the difference in mana costs between this and the sacrificed Fox. Mana cost includes color.)\nWhenever a creature attacks, you may gain 1 life. diff --git a/forge-gui/res/cardsfolder/p/patron_of_the_moon.txt b/forge-gui/res/cardsfolder/p/patron_of_the_moon.txt index 726ea387abe..cb4140e52c0 100644 --- a/forge-gui/res/cardsfolder/p/patron_of_the_moon.txt +++ b/forge-gui/res/cardsfolder/p/patron_of_the_moon.txt @@ -5,6 +5,6 @@ PT:5/4 K:Moonfolk offering K:Flying A:AB$ ChangeZone | Cost$ 1 | ChangeNum$ 2 | Origin$ Hand | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.YouCtrl | SpellDescription$ Put up to two land cards from your hand onto the battlefield tapped. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/patron_of_the_moon.jpg Oracle:Moonfolk offering (You may cast this card any time you could cast an instant by sacrificing a Moonfolk and paying the difference in mana costs between this and the sacrificed Moonfolk. Mana cost includes color.)\nFlying\n{1}: Put up to two land cards from your hand onto the battlefield tapped. diff --git a/forge-gui/res/cardsfolder/p/patron_of_the_nezumi.txt b/forge-gui/res/cardsfolder/p/patron_of_the_nezumi.txt index 8ce3fcc28ff..418e3f069de 100644 --- a/forge-gui/res/cardsfolder/p/patron_of_the_nezumi.txt +++ b/forge-gui/res/cardsfolder/p/patron_of_the_nezumi.txt @@ -5,6 +5,6 @@ PT:6/6 K:Rat offering T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Battlefield | ValidCard$ Card.OppOwn | Execute$ TrigLoseLife | TriggerDescription$ Whenever a permanent is put into an opponent's graveyard, that player loses 1 life. SVar:TrigLoseLife:DB$ LoseLife | Defined$ TriggeredCardOwner | LifeAmount$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/patron_of_the_nezumi.jpg Oracle:Rat offering (You may cast this card any time you could cast an instant by sacrificing a Rat and paying the difference in mana costs between this and the sacrificed Rat. Mana cost includes color.)\nWhenever a permanent is put into an opponent's graveyard, that player loses 1 life. diff --git a/forge-gui/res/cardsfolder/p/patron_of_the_orochi.txt b/forge-gui/res/cardsfolder/p/patron_of_the_orochi.txt index 3f584ed89bd..25d4143f896 100644 --- a/forge-gui/res/cardsfolder/p/patron_of_the_orochi.txt +++ b/forge-gui/res/cardsfolder/p/patron_of_the_orochi.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Spirit PT:7/7 K:Snake offering A:AB$ UntapAll | Cost$ T | ValidCards$ Forest,Creature.Green | ActivationLimit$ 1 | SpellDescription$ Untap all Forests and all green creatures. Activate this ability only once each turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/patron_of_the_orochi.jpg Oracle:Snake offering (You may cast this card any time you could cast an instant by sacrificing a Snake and paying the difference in mana costs between this and the sacrificed Snake. Mana cost includes color.)\n{T}: Untap all Forests and all green creatures. Activate this ability only once each turn. diff --git a/forge-gui/res/cardsfolder/p/patron_wizard.txt b/forge-gui/res/cardsfolder/p/patron_wizard.txt index 0fcf1039d6c..11a62cf40eb 100644 --- a/forge-gui/res/cardsfolder/p/patron_wizard.txt +++ b/forge-gui/res/cardsfolder/p/patron_wizard.txt @@ -3,6 +3,6 @@ ManaCost:U U U Types:Creature Human Wizard PT:2/2 A:AB$ Counter | Cost$ tapXType<1/Wizard> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 1 | SpellDescription$ Counter target spell unless its controller pays {1}. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/patron_wizard.jpg Oracle:Tap an untapped Wizard you control: Counter target spell unless its controller pays {1}. diff --git a/forge-gui/res/cardsfolder/p/peace_of_mind.txt b/forge-gui/res/cardsfolder/p/peace_of_mind.txt index eb92932ce15..5c989db911d 100644 --- a/forge-gui/res/cardsfolder/p/peace_of_mind.txt +++ b/forge-gui/res/cardsfolder/p/peace_of_mind.txt @@ -4,7 +4,7 @@ Types:Enchantment A:AB$ GainLife | Cost$ W Discard<1/Card> | LifeAmount$ 3 | SpellDescription$ You gain 3 life. SVar:AIPreference:DiscardCost$Card DeckHints:Ability$Discard -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/peace_of_mind.jpg Oracle:{W}, Discard a card: You gain 3 life. diff --git a/forge-gui/res/cardsfolder/p/peacekeeper.txt b/forge-gui/res/cardsfolder/p/peacekeeper.txt index 4c4bdcdc432..de3a75f56f9 100644 --- a/forge-gui/res/cardsfolder/p/peacekeeper.txt +++ b/forge-gui/res/cardsfolder/p/peacekeeper.txt @@ -4,6 +4,6 @@ Types:Creature Human PT:1/1 K:UpkeepCost:1 W S:Mode$ Continuous | Affected$ Creature | AddHiddenKeyword$ CARDNAME can't attack. | Description$ Creatures can't attack. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/peacekeeper.jpg Oracle:At the beginning of your upkeep, sacrifice Peacekeeper unless you pay {1}{W}.\nCreatures can't attack. diff --git a/forge-gui/res/cardsfolder/p/peak_eruption.txt b/forge-gui/res/cardsfolder/p/peak_eruption.txt index a4b54945c4b..06f9f8fe666 100644 --- a/forge-gui/res/cardsfolder/p/peak_eruption.txt +++ b/forge-gui/res/cardsfolder/p/peak_eruption.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Sorcery A:SP$ Destroy | Cost$ 2 R | ValidTgts$ Mountain | TgtPrompt$ Choose target mountain | SubAbility$ DBDealDamage | SpellDescription$ Destroy target Mountain. CARDNAME deals 3 damage to that land's controller. SVar:DBDealDamage:DB$ DealDamage | Defined$ TargetedController | NumDmg$ 3 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/peak_eruption.jpg Oracle:Destroy target Mountain. Peak Eruption deals 3 damage to that land's controller. diff --git a/forge-gui/res/cardsfolder/p/pearl_medallion.txt b/forge-gui/res/cardsfolder/p/pearl_medallion.txt index a3330cc0299..cf0bbf2930b 100644 --- a/forge-gui/res/cardsfolder/p/pearl_medallion.txt +++ b/forge-gui/res/cardsfolder/p/pearl_medallion.txt @@ -2,7 +2,7 @@ Name:Pearl Medallion ManaCost:2 Types:Artifact S:Mode$ ReduceCost | ValidCard$ Card.White | Type$ Spell | Activator$ You | Amount$ 1 | Description$ White spells you cast cost {1} less to cast. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$white SVar:Picture:http://www.wizards.com/global/images/magic/general/pearl_medallion.jpg Oracle:White spells you cast cost {1} less to cast. diff --git a/forge-gui/res/cardsfolder/p/peat_bog.txt b/forge-gui/res/cardsfolder/p/peat_bog.txt index 8de73ac0f3e..5ae33dcda06 100644 --- a/forge-gui/res/cardsfolder/p/peat_bog.txt +++ b/forge-gui/res/cardsfolder/p/peat_bog.txt @@ -6,7 +6,7 @@ SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | SubAbility$ DBAddCounter | SVar:DBAddCounter:DB$ PutCounter | Defined$ Self | ETB$ True | CounterType$ DEPLETION | CounterNum$ 2 A:AB$ Mana | Cost$ T SubCounter<1/DEPLETION> | Produced$ B | SubAbility$ DBSac | Amount$ 2 | SpellDescription$ Add {B}{B}. If there are no depletion counters on CARDNAME, sacrifice it. SVar:DBSac:DB$ Sacrifice | SacValid$ Self | ConditionPresent$ Card.Self+counters_EQ0_DEPLETION -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://wizards.com/global/images/magic/general/peat_bog.jpg Oracle:Peat Bog enters the battlefield tapped with two depletion counters on it.\n{T}, Remove a depletion counter from Peat Bog: Add {B}{B}. If there are no depletion counters on Peat Bog, sacrifice it. diff --git a/forge-gui/res/cardsfolder/p/pedantic_learning.txt b/forge-gui/res/cardsfolder/p/pedantic_learning.txt index 22582dbe0cc..3d2b5025051 100644 --- a/forge-gui/res/cardsfolder/p/pedantic_learning.txt +++ b/forge-gui/res/cardsfolder/p/pedantic_learning.txt @@ -3,6 +3,6 @@ ManaCost:U U Types:Enchantment T:Mode$ ChangesZone | ValidCard$ Land.YouCtrl | Origin$ Library | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever a land card is put into your graveyard from your library, you may pay {1}. If you do, draw a card. SVar:TrigDraw:AB$ Draw | Cost$ 1 | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/pedantic_learning.jpg Oracle:Whenever a land card is put into your graveyard from your library, you may pay {1}. If you do, draw a card. diff --git a/forge-gui/res/cardsfolder/p/peek.txt b/forge-gui/res/cardsfolder/p/peek.txt index 8d9e7e8cdb3..148ba7d1ecb 100644 --- a/forge-gui/res/cardsfolder/p/peek.txt +++ b/forge-gui/res/cardsfolder/p/peek.txt @@ -3,6 +3,6 @@ ManaCost:U Types:Instant A:SP$ RevealHand | Cost$ U | ValidTgts$ Player | TgtPrompt$ Select target player | SubAbility$ DBDraw | SpellDescription$ Look at target player's hand. SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/peek.jpg Oracle:Look at target player's hand.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/p/peel_from_reality.txt b/forge-gui/res/cardsfolder/p/peel_from_reality.txt index ba24242e96d..2c0f2eb5097 100644 --- a/forge-gui/res/cardsfolder/p/peel_from_reality.txt +++ b/forge-gui/res/cardsfolder/p/peel_from_reality.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Instant A:SP$ ChangeZone | Cost$ 1 U | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBBounce | SpellDescription$ Return target creature you control and target creature you don't control to their owner's hands. SVar:DBBounce:DB$ ChangeZone | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Select target creature you don't control | Origin$ Battlefield | Destination$ Hand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://resources.wizards.com/magic/cards/rav/en-us/card87951.jpg Oracle:Return target creature you control and target creature you don't control to their owners' hands. diff --git a/forge-gui/res/cardsfolder/p/peer_pressure.txt b/forge-gui/res/cardsfolder/p/peer_pressure.txt index e6f31e42241..e0deb2a1e7a 100644 --- a/forge-gui/res/cardsfolder/p/peer_pressure.txt +++ b/forge-gui/res/cardsfolder/p/peer_pressure.txt @@ -5,7 +5,7 @@ A:SP$ ChooseType | Cost$ 3 U | Defined$ You | Type$ Creature | SubAbility$ Apply SVar:ApplyPressure:DB$ GainControl | AllValid$ Creature.ChosenType | NewController$ You | ConditionCheckSVar$ YourPeerGroup | ConditionSVarCompare$ GTY | References$ YourPeerGroup,Y SVar:YourPeerGroup:Count$Valid Creature.ChosenType+YouCtrl SVar:Y:PlayerCountOther$HighestValid Creature.ChosenType+YouCtrl -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/peer_pressure.jpg Oracle:Choose a creature type. If you control more creatures of that type than each other player, you gain control of all creatures of that type. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/p/pegasus_refuge.txt b/forge-gui/res/cardsfolder/p/pegasus_refuge.txt index 644aa7d7a75..229c8e29181 100644 --- a/forge-gui/res/cardsfolder/p/pegasus_refuge.txt +++ b/forge-gui/res/cardsfolder/p/pegasus_refuge.txt @@ -2,7 +2,7 @@ Name:Pegasus Refuge ManaCost:3 W Types:Enchantment A:AB$ Token | Cost$ 2 Discard<1/Card> | TokenImage$ w 1 1 pegasus flying | TokenAmount$ 1 | TokenName$ Pegasus | TokenTypes$ Creature,Pegasus | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SpellDescription$ Create a 1/1 white Pegasus creature token with flying. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/pegasus_refuge.jpg Oracle:{2}, Discard a card: Create a 1/1 white Pegasus creature token with flying. diff --git a/forge-gui/res/cardsfolder/p/penance.txt b/forge-gui/res/cardsfolder/p/penance.txt index 48f7879fce0..655fec580ff 100644 --- a/forge-gui/res/cardsfolder/p/penance.txt +++ b/forge-gui/res/cardsfolder/p/penance.txt @@ -6,7 +6,7 @@ SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPreventNextFromSource | SVars$ R SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.ChosenCard+BlackSource,Card.ChosenCard+RedSource | ReplaceWith$ ExileEffect | PreventionEffect$ True | Description$ The next time the chosen black or red source deals damage, prevent that damage. SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/penance.jpg Oracle:Put a card from your hand on top of your library: The next time a black or red source of your choice would deal damage this turn, prevent that damage. diff --git a/forge-gui/res/cardsfolder/p/pendelhaven.txt b/forge-gui/res/cardsfolder/p/pendelhaven.txt index 837124440bc..0764642f27c 100644 --- a/forge-gui/res/cardsfolder/p/pendelhaven.txt +++ b/forge-gui/res/cardsfolder/p/pendelhaven.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Legendary Land A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. A:AB$ Pump | Cost$ T | NumAtt$ +1 | NumDef$ +2 | ValidTgts$ Creature.powerEQ1+toughnessEQ1 | TgtPrompt$ Select target 1/1 Creature | SpellDescription$ Target 1/1 creature gets +1/+2 until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/pendelhaven.jpg Oracle:{T}: Add {G}.\n{T}: Target 1/1 creature gets +1/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/p/pendrell_mists.txt b/forge-gui/res/cardsfolder/p/pendrell_mists.txt index a3a8c560003..74a6508161a 100644 --- a/forge-gui/res/cardsfolder/p/pendrell_mists.txt +++ b/forge-gui/res/cardsfolder/p/pendrell_mists.txt @@ -2,6 +2,6 @@ Name:Pendrell Mists ManaCost:3 U Types:Enchantment S:Mode$ Continuous | Affected$ Creature | AddKeyword$ UpkeepCost:1 | Description$ All creatures have "At the beginning of your upkeep, sacrifice this creature unless you pay {1}." -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/pendrell_mists.jpg Oracle:All creatures have "At the beginning of your upkeep, sacrifice this creature unless you pay {1}." diff --git a/forge-gui/res/cardsfolder/p/peppersmoke.txt b/forge-gui/res/cardsfolder/p/peppersmoke.txt index 2838111bf2a..c656fb32f6a 100644 --- a/forge-gui/res/cardsfolder/p/peppersmoke.txt +++ b/forge-gui/res/cardsfolder/p/peppersmoke.txt @@ -3,6 +3,6 @@ ManaCost:B Types:Tribal Instant Faerie A:SP$ Pump | Cost$ B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SubAbility$ DBDraw | SpellDescription$ Target creature gets -1/-1 until end of turn. If you control a Faerie, draw a card. SVar:DBDraw:DB$Draw | NumCards$ 1 | ConditionPresent$ Faerie.YouCtrl | ConditionCompare$ GE1 | ConditionDescription$ If you control a Faerie, -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/peppersmoke.jpg Oracle:Target creature gets -1/-1 until end of turn. If you control a Faerie, draw a card. diff --git a/forge-gui/res/cardsfolder/p/peregrine_mask.txt b/forge-gui/res/cardsfolder/p/peregrine_mask.txt index d001fa97e44..87fc4659b44 100644 --- a/forge-gui/res/cardsfolder/p/peregrine_mask.txt +++ b/forge-gui/res/cardsfolder/p/peregrine_mask.txt @@ -3,6 +3,6 @@ ManaCost:1 Types:Artifact Equipment K:Equip:2 S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddKeyword$ Defender & Flying & First Strike | Description$ Equipped creature has defender, flying, and first strike. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/peregrine_mask.jpg Oracle:Equipped creature has defender, flying, and first strike.\nEquip {2} diff --git a/forge-gui/res/cardsfolder/p/perilous_forays.txt b/forge-gui/res/cardsfolder/p/perilous_forays.txt index 9ff4bc333a2..8122a510b92 100644 --- a/forge-gui/res/cardsfolder/p/perilous_forays.txt +++ b/forge-gui/res/cardsfolder/p/perilous_forays.txt @@ -2,6 +2,6 @@ Name:Perilous Forays ManaCost:3 G G Types:Enchantment A:AB$ ChangeZone | Cost$ 1 Sac<1/Creature> | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Plains,Land.Island,Land.Swamp,Land.Mountain,Land.Forest | Tapped$ True | ChangeNum$ 1 | SpellDescription$ Search your library for a land card with a basic land type, put it onto the battlefield tapped, then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/perilous_forays.jpg Oracle:{1}, Sacrifice a creature: Search your library for a land card with a basic land type, put it onto the battlefield tapped, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/p/perilous_research.txt b/forge-gui/res/cardsfolder/p/perilous_research.txt index e79ebdc0053..51e4c378bff 100644 --- a/forge-gui/res/cardsfolder/p/perilous_research.txt +++ b/forge-gui/res/cardsfolder/p/perilous_research.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Draw | Cost$ 1 U | NumCards$ 2 | SubAbility$ DBSac | SpellDescription$ Draw two cards, then sacrifice a permanent. SVar:DBSac:DB$ Sacrifice | SacValid$ Permanent SVar:NeedsToPlay:Permanent.YouCtrl+HasSVar SacMe -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/perilous_research.jpg Oracle:Draw two cards, then sacrifice a permanent. diff --git a/forge-gui/res/cardsfolder/p/perish.txt b/forge-gui/res/cardsfolder/p/perish.txt index f80e0f005d6..6f5d75d758b 100644 --- a/forge-gui/res/cardsfolder/p/perish.txt +++ b/forge-gui/res/cardsfolder/p/perish.txt @@ -2,6 +2,6 @@ Name:Perish ManaCost:2 B Types:Sorcery A:SP$ DestroyAll | Cost$ 2 B | ValidCards$ Creature.Green | NoRegen$ True | SpellDescription$ Destroy all green creatures. They can't be regenerated. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/perish.jpg Oracle:Destroy all green creatures. They can't be regenerated. diff --git a/forge-gui/res/cardsfolder/p/pernicious_deed.txt b/forge-gui/res/cardsfolder/p/pernicious_deed.txt index b86b220ed1b..36d9a59c5f5 100644 --- a/forge-gui/res/cardsfolder/p/pernicious_deed.txt +++ b/forge-gui/res/cardsfolder/p/pernicious_deed.txt @@ -3,7 +3,7 @@ ManaCost:1 B G Types:Enchantment A:AB$ DestroyAll | Cost$ X Sac<1/CARDNAME> | ValidCards$ Artifact.cmcLEX,Creature.cmcLEX,Enchantment.cmcLEX | References$ X | SpellDescription$ Destroy each artifact, creature, and enchantment with converted mana cost X or less. SVar:X:Count$xPaid -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/pernicious_deed.jpg Oracle:{X}, Sacrifice Pernicious Deed: Destroy each artifact, creature, and enchantment with converted mana cost X or less. diff --git a/forge-gui/res/cardsfolder/p/perpetual_timepiece.txt b/forge-gui/res/cardsfolder/p/perpetual_timepiece.txt index 9f896b75ca0..b185fcfc366 100644 --- a/forge-gui/res/cardsfolder/p/perpetual_timepiece.txt +++ b/forge-gui/res/cardsfolder/p/perpetual_timepiece.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ Mill | Cost$ T | Defined$ You | NumCards$ 2 | SpellDescription$ Put the top two cards of your library into your graveyard. A:AB$ ChangeZone | Cost$ 2 Exile<1/CARDNAME> | Origin$ Graveyard | Destination$ Library | TargetMin$ 0 | TargetMax$ X | References$ X | Shuffle$ True | TgtPrompt$ Choose target card in your graveyard | ValidTgts$ Card.YouCtrl | SpellDescription$ Shuffle any number of target cards from your graveyard into your library. SVar:X:Count$InYourYard -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/perpetual_timepiece.jpg Oracle:{T}: Put the top two cards of your library into your graveyard.\n{2}, Exile Perpetual Timepiece: Shuffle any number of target cards from your graveyard into your library. diff --git a/forge-gui/res/cardsfolder/p/perplexing_chimera.txt b/forge-gui/res/cardsfolder/p/perplexing_chimera.txt index f33676f540f..e11d7e204fc 100644 --- a/forge-gui/res/cardsfolder/p/perplexing_chimera.txt +++ b/forge-gui/res/cardsfolder/p/perplexing_chimera.txt @@ -6,6 +6,6 @@ T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ Opponent | Optional SVar:ExchangeControlSpell:DB$ ControlSpell | Defined$ TriggeredSpellAbility | Mode$ Exchange | Remember$ True | SubAbility$ DBChooseTargets SVar:DBChooseTargets:DB$ ChangeTargets | Defined$ TriggeredSpellAbility | Optional$ True | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE2 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/perplexing_chimera.jpg Oracle:Whenever an opponent casts a spell, you may exchange control of Perplexing Chimera and that spell. If you do, you may choose new targets for the spell. (If the spell becomes a permanent, you control that permanent.) diff --git a/forge-gui/res/cardsfolder/p/personal_incarnation.txt b/forge-gui/res/cardsfolder/p/personal_incarnation.txt index 192b411f4e1..b14d54f7de9 100644 --- a/forge-gui/res/cardsfolder/p/personal_incarnation.txt +++ b/forge-gui/res/cardsfolder/p/personal_incarnation.txt @@ -10,6 +10,6 @@ SVar:TrigLoseLife:DB$ Pump | RememberObjects$ TriggeredCardOwner | SubAbility$ D SVar:DBLoseLife:DB$ LoseLife | Defined$ Remembered | LifeAmount$ HavocX | References$ HavocX | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:HavocX:PlayerCountRemembered$LifeTotal/HalfUp -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/personal_incarnation.jpg Oracle:{0}: The next 1 damage that would be dealt to Personal Incarnation this turn is dealt to its owner instead. Only Personal Incarnation's owner may activate this ability.\nWhen Personal Incarnation dies, its owner loses half their life, rounded up. diff --git a/forge-gui/res/cardsfolder/p/personal_tutor.txt b/forge-gui/res/cardsfolder/p/personal_tutor.txt index c680ca9119c..db24299a7d7 100644 --- a/forge-gui/res/cardsfolder/p/personal_tutor.txt +++ b/forge-gui/res/cardsfolder/p/personal_tutor.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ ChangeZone | Cost$ U | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Sorcery | ChangeNum$ 1 | SpellDescription$ Search your library for a sorcery card and reveal that card. Shuffle your library, then put the card on top of it. #TODO: The AI will currently search for the most expensive valid card in the library. This can be used to the AI's advantage with #careful deck design (which is why this card only works in properly designed AI decks). Consider improving tutoring logic with priorities. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/personal_tutor.jpg Oracle:Search your library for a sorcery card and reveal that card. Shuffle your library, then put the card on top of it. diff --git a/forge-gui/res/cardsfolder/p/pestilence_rats.txt b/forge-gui/res/cardsfolder/p/pestilence_rats.txt index 3557bc5e97b..3081afd2933 100644 --- a/forge-gui/res/cardsfolder/p/pestilence_rats.txt +++ b/forge-gui/res/cardsfolder/p/pestilence_rats.txt @@ -5,6 +5,6 @@ PT:*/3 S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | References$ X | Description$ CARDNAME's power is equal to the number of other Rats on the battlefield. SVar:X:Count$Valid Rat.Other SVar:BuffedBy:Rat -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/pestilence_rats.jpg Oracle:Pestilence Rats's power is equal to the number of other Rats on the battlefield. (For example, as long as there are two other Rats on the battlefield, Pestilence Rats's power and toughness are 2/3.) diff --git a/forge-gui/res/cardsfolder/p/petalmane_baku.txt b/forge-gui/res/cardsfolder/p/petalmane_baku.txt index 49b0256a14b..d77be0d23e2 100644 --- a/forge-gui/res/cardsfolder/p/petalmane_baku.txt +++ b/forge-gui/res/cardsfolder/p/petalmane_baku.txt @@ -7,7 +7,7 @@ SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ KI | CounterNum #ChosenX SVar created by Cost payment A:AB$ Mana | Cost$ 1 SubCounter | Produced$ Any | Amount$ ChosenX | References$ X | AILogic$ ManaRitual | SpellDescription$ Add X mana of any one color. SVar:X:XChoice -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/petalmane_baku.jpg Oracle:Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Petalmane Baku.\n{1}, Remove X ki counters from Petalmane Baku: Add X mana of any one color. diff --git a/forge-gui/res/cardsfolder/p/petals_of_insight.txt b/forge-gui/res/cardsfolder/p/petals_of_insight.txt index 459033e6817..521c1d06586 100644 --- a/forge-gui/res/cardsfolder/p/petals_of_insight.txt +++ b/forge-gui/res/cardsfolder/p/petals_of_insight.txt @@ -6,6 +6,6 @@ SVar:DBPetalChoose:DB$ GenericChoice | Choices$ ReturnPetals,DrawCards | Defined SVar:ReturnPetals:DB$ Dig | DigNum$ 3 | ChangeNum$ All | DestinationZone$ Library | LibraryPosition$ -1 | SubAbility$ DBChangeZone | SpellDescription$ You may put those cards on the bottom of your library in any order. If you do, return CARDNAME to its owner's hand. SVar:DBChangeZone:DB$ ChangeZone | Origin$ Stack | Destination$ Hand | Defined$ Self SVar:DrawCards:DB$ Draw | NumCards$ 3 | SpellDescription$ Otherwise, draw three cards. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/petals_of_insight.jpg Oracle:Look at the top three cards of your library. You may put those cards on the bottom of your library in any order. If you do, return Petals of Insight to its owner's hand. Otherwise, draw three cards. diff --git a/forge-gui/res/cardsfolder/p/petrahydrox.txt b/forge-gui/res/cardsfolder/p/petrahydrox.txt index 29bbf079c32..6cf3a0c8f14 100644 --- a/forge-gui/res/cardsfolder/p/petrahydrox.txt +++ b/forge-gui/res/cardsfolder/p/petrahydrox.txt @@ -4,6 +4,6 @@ Types:Creature Weird PT:3/3 T:Mode$ BecomesTarget | ValidTarget$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigChange | TriggerDescription$ When CARDNAME becomes the target of a spell or ability, return CARDNAME to its owner's hand. SVar:TrigChange:DB$ChangeZone | Origin$ Battlefield | Destination$ Hand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/petrahydrox.jpg Oracle:({U/R} can be paid with either {U} or {R}.)\nWhen Petrahydrox becomes the target of a spell or ability, return Petrahydrox to its owner's hand. diff --git a/forge-gui/res/cardsfolder/p/petrified_field.txt b/forge-gui/res/cardsfolder/p/petrified_field.txt index 83e33c484fe..affab43f499 100644 --- a/forge-gui/res/cardsfolder/p/petrified_field.txt +++ b/forge-gui/res/cardsfolder/p/petrified_field.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ ChangeZone | Cost$ T Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Select target land card in your graveyard | ValidTgts$ Land.YouCtrl | SpellDescription$ Return target land card from your graveyard to your hand. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/petrified_field.jpg Oracle:{T}: Add {C}.\n{T}, Sacrifice Petrified Field: Return target land card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/p/phantasmal_mount.txt b/forge-gui/res/cardsfolder/p/phantasmal_mount.txt index 8a6d31335ce..a71d7a53997 100644 --- a/forge-gui/res/cardsfolder/p/phantasmal_mount.txt +++ b/forge-gui/res/cardsfolder/p/phantasmal_mount.txt @@ -10,7 +10,7 @@ SVar:SacMount:DB$ SacrificeAll | Defined$ Imprinted | SubAbility$ ExileEffect SVar:LostTheTarget:Mode$ ChangesZone | ValidCard$ Card.IsImprinted | Origin$ Battlefield | Destination$ Any | Execute$ SacTarget | TriggerDescription$ When Phantasmal Mount leaves the battlefield this turn, sacrifice the targeted creature. SVar:SacTarget:DB$ SacrificeAll | Defined$ Remembered | SubAbility$ ExileEffect SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/phantasmal_mount.jpg Oracle:Flying\n{T}: Target creature you control with toughness 2 or less gets +1/+1 and gains flying until end of turn. When Phantasmal Mount leaves the battlefield this turn, sacrifice that creature. When the creature leaves the battlefield this turn, sacrifice Phantasmal Mount. diff --git a/forge-gui/res/cardsfolder/p/phantasmal_sphere.txt b/forge-gui/res/cardsfolder/p/phantasmal_sphere.txt index 73c3cb11745..472a577ba3a 100644 --- a/forge-gui/res/cardsfolder/p/phantasmal_sphere.txt +++ b/forge-gui/res/cardsfolder/p/phantasmal_sphere.txt @@ -10,6 +10,6 @@ T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.S SVar:OrbToken:DB$ Token | TokenImage$ u x x orb | ValidTgts$ Opponent | TokenOwner$ Targeted | TokenName$ Orb | TokenColors$ Blue | TokenTypes$ Creature,Orb | TokenPower$ XLKI | TokenToughness$ XLKI | References$ XLKI | TokenAmount$ 1 SVar:X:Count$CardCounters.P1P1 SVar:XLKI:TriggeredCard$CardCounters.P1P1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/phantasmal_sphere.jpg Oracle:Flying\nAt the beginning of your upkeep, put a +1/+1 counter on Phantasmal Sphere, then sacrifice Phantasmal Sphere unless you pay {1} for each +1/+1 counter on it.\nWhen Phantasmal Sphere leaves the battlefield, target opponent creates an X/X blue Orb creature token with flying, where X is the number of +1/+1 counters on Phantasmal Sphere. diff --git a/forge-gui/res/cardsfolder/p/phantasmal_terrain.txt b/forge-gui/res/cardsfolder/p/phantasmal_terrain.txt index 5aea46a0d21..05fcf07f003 100644 --- a/forge-gui/res/cardsfolder/p/phantasmal_terrain.txt +++ b/forge-gui/res/cardsfolder/p/phantasmal_terrain.txt @@ -6,6 +6,6 @@ A:SP$ Attach | Cost$ U U | ValidTgts$ Land | AILogic$ ChangeType K:ETBReplacement:Other:DBChooseBasic SVar:DBChooseBasic:DB$ ChooseType | Type$ Basic Land | SpellDescription$ As CARDNAME enters the battlefield, choose a basic land type. S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddType$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | Description$ Enchanted land is the chosen type. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/phantasmal_terrain.jpg Oracle:Enchant land\nAs Phantasmal Terrain enters the battlefield, choose a basic land type.\nEnchanted land is the chosen type. diff --git a/forge-gui/res/cardsfolder/p/phantatog.txt b/forge-gui/res/cardsfolder/p/phantatog.txt index 14ead1e27a5..e8d834d2705 100644 --- a/forge-gui/res/cardsfolder/p/phantatog.txt +++ b/forge-gui/res/cardsfolder/p/phantatog.txt @@ -4,6 +4,6 @@ Types:Creature Atog PT:1/2 A:AB$ Pump | Cost$ Sac<1/Enchantment> | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. A:AB$ Pump | Cost$ Discard<1/Card> | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/phantatog.jpg Oracle:Sacrifice an enchantment: Phantatog gets +1/+1 until end of turn.\nDiscard a card: Phantatog gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/p/phelddagrif.txt b/forge-gui/res/cardsfolder/p/phelddagrif.txt index 1123b96e6fc..f1b773adf0d 100644 --- a/forge-gui/res/cardsfolder/p/phelddagrif.txt +++ b/forge-gui/res/cardsfolder/p/phelddagrif.txt @@ -8,6 +8,6 @@ A:AB$ ChangeZone | Cost$ U | Origin$ Battlefield | Destination$ Hand | SubAbilit SVar:DBToken:DB$Token | ValidTgts$ Opponent | TokenAmount$ 1 | TokenName$ Hippo | TokenTypes$ Creature,Hippo | TokenOwner$ Opponent | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 SVar:DBGain:DB$GainLife | LifeAmount$ 2 | ValidTgts$ Opponent SVar:DBDraw:DB$Draw | NumCards$ 1 | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | OptionalDecider$ Opponent -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/phelddagrif.jpg Oracle:{G}: Phelddagrif gains trample until end of turn. Target opponent creates a 1/1 green Hippo creature token.\n{W}: Phelddagrif gains flying until end of turn. Target opponent gains 2 life.\n{U}: Return Phelddagrif to its owner's hand. Target opponent may draw a card. diff --git a/forge-gui/res/cardsfolder/p/phosphorescent_feast.txt b/forge-gui/res/cardsfolder/p/phosphorescent_feast.txt index 84144a6ed99..9efceeaea2c 100644 --- a/forge-gui/res/cardsfolder/p/phosphorescent_feast.txt +++ b/forge-gui/res/cardsfolder/p/phosphorescent_feast.txt @@ -5,6 +5,6 @@ A:SP$ Reveal | Cost$ 2 G G G | AnyNumber$ True | RememberRevealed$ True | SubAbi SVar:DBGainLife:DB$ GainLife | LifeAmount$ X | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$ChromaSource.Green/Twice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/phosphorescent_feast.jpg Oracle:Chroma — Reveal any number of cards in your hand. You gain 2 life for each green mana symbol in those cards' mana costs. diff --git a/forge-gui/res/cardsfolder/p/phylactery_lich.txt b/forge-gui/res/cardsfolder/p/phylactery_lich.txt index a6733e6035d..58f0915bf74 100644 --- a/forge-gui/res/cardsfolder/p/phylactery_lich.txt +++ b/forge-gui/res/cardsfolder/p/phylactery_lich.txt @@ -9,7 +9,7 @@ SVar:DBPutCounter:DB$ PutCounter | CounterType$ PHYLACTERY | CounterNum$ 1 | Def SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Permanent.counters_GE1_PHYLACTERY+YouCtrl | PresentCompare$ EQ0 | Execute$ TrigSac | TriggerDescription$ When you control no permanents with phylactery counters on them, sacrifice CARDNAME. SVar:TrigSac:DB$Sacrifice | Defined$ Self -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Artifact SVar:NeedsToPlay:Artifact.YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/phylactery_lich.jpg diff --git a/forge-gui/res/cardsfolder/p/phyrexian_altar.txt b/forge-gui/res/cardsfolder/p/phyrexian_altar.txt index 4681edea1a3..3ccc95c160c 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_altar.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_altar.txt @@ -2,6 +2,6 @@ Name:Phyrexian Altar ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ Sac<1/Creature> | Produced$ Any | SpellDescription$ Add one mana of any color. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_altar.jpg Oracle:Sacrifice a creature: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_bloodstock.txt b/forge-gui/res/cardsfolder/p/phyrexian_bloodstock.txt index f0a515d4615..0dfadc944ec 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_bloodstock.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_bloodstock.txt @@ -4,6 +4,6 @@ Types:Creature Zombie PT:3/3 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME leaves the battlefield, destroy target white creature. It can't be regenerated. SVar:TrigDestroy:DB$Destroy | ValidTgts$ Creature.White | NoRegen$ True | TgtPrompt$ Select target white creature. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_bloodstock.jpg Oracle:When Phyrexian Bloodstock leaves the battlefield, destroy target white creature. It can't be regenerated. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_boon.txt b/forge-gui/res/cardsfolder/p/phyrexian_boon.txt index f66fb2cc4c1..5b1c331d595 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_boon.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_boon.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ 2 B | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy+Black | AddPower$ 2 | AddToughness$ 1 | Description$ Enchanted creature gets +2/+1 as long as it's black. S:Mode$ Continuous | Affected$ Creature.EnchantedBy+nonBlack | AddPower$ -1 | AddToughness$ -2 | Description$ Otherwise, it gets -1/-2. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_boon.jpg Oracle:Enchant creature\nEnchanted creature gets +2/+1 as long as it's black. Otherwise, it gets -1/-2. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_colossus.txt b/forge-gui/res/cardsfolder/p/phyrexian_colossus.txt index a825054b7b6..26cf479d3db 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_colossus.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_colossus.txt @@ -5,6 +5,6 @@ PT:8/8 K:CARDNAME doesn't untap during your untap step. A:AB$ Untap | Cost$ PayLife<8> | SpellDescription$ Untap CARDNAME. K:CantBeBlockedByAmount LT3 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_colossus.jpg Oracle:Phyrexian Colossus doesn't untap during your untap step.\nPay 8 life: Untap Phyrexian Colossus.\nPhyrexian Colossus can't be blocked except by three or more creatures. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_debaser.txt b/forge-gui/res/cardsfolder/p/phyrexian_debaser.txt index 51f0dcb79a2..1398c3ac7ee 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_debaser.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_debaser.txt @@ -4,6 +4,6 @@ Types:Creature Carrier PT:2/2 K:Flying A:AB$ Pump | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -2 | NumDef$ -2 | IsCurse$ True | SpellDescription$ Target creature gets -2/-2 until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_debaser.jpg Oracle:Flying\n{T}, Sacrifice Phyrexian Debaser: Target creature gets -2/-2 until end of turn. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_delver.txt b/forge-gui/res/cardsfolder/p/phyrexian_delver.txt index fd45c87b639..b1da0f85a52 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_delver.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_delver.txt @@ -6,6 +6,6 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigChangeZone:DB$ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Choose target creature card in your graveyard | GainControl$ True | ChangeNum$ 1 | SubAbility$ DBLoseLifeYou SVar:DBLoseLifeYou:DB$LoseLife | Defined$ You | LifeAmount$ X | References$ X SVar:X:Targeted$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_delver.jpg Oracle:When Phyrexian Delver enters the battlefield, return target creature card from your graveyard to the battlefield. You lose life equal to that card's converted mana cost. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_denouncer.txt b/forge-gui/res/cardsfolder/p/phyrexian_denouncer.txt index d4202817e67..98251d3703a 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_denouncer.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_denouncer.txt @@ -3,6 +3,6 @@ ManaCost:1 B Types:Creature Carrier PT:1/1 A:AB$ Pump | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ Target creature gets -1/-1 until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_denouncer.jpg Oracle:{T}, Sacrifice Phyrexian Denouncer: Target creature gets -1/-1 until end of turn. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_devourer.txt b/forge-gui/res/cardsfolder/p/phyrexian_devourer.txt index 5749e6e373b..6304610ebd3 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_devourer.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_devourer.txt @@ -6,6 +6,6 @@ T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Creature.Self+powerGE7 | SVar:TrigSac:DB$Sacrifice | Defined$ Self A:AB$ PutCounter | Cost$ ExileFromTop<1/Card> | Defined$ Self | CounterNum$ X | References$ X | CounterType$ P1P1 | SpellDescription$ Put X +1/+1 counters on CARDNAME, where X is the exiled card's converted mana cost. SVar:X:Exiled$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_devourer.jpg Oracle:When Phyrexian Devourer's power is 7 or greater, sacrifice it.\nExile the top card of your library: Put X +1/+1 counters on Phyrexian Devourer, where X is the exiled card's converted mana cost. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_dreadnought.txt b/forge-gui/res/cardsfolder/p/phyrexian_dreadnought.txt index f2c6419d390..fbbf6de0833 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_dreadnought.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_dreadnought.txt @@ -10,7 +10,7 @@ SVar:SacrificeCreatures:DB$ SacrificeAll | Defined$ Remembered | ConditionCheckS SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:TotalPower:Remembered$CardPower SVar:X:Count$Valid Creature.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NeedsToPlayVar:Y GE12 SVar:Y:Count$SumPower_Creature.YouCtrl+notnamedPhyrexian Dreadnought SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_dreadnought.jpg diff --git a/forge-gui/res/cardsfolder/p/phyrexian_etchings.txt b/forge-gui/res/cardsfolder/p/phyrexian_etchings.txt index f777dd08382..baf041d3b42 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_etchings.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_etchings.txt @@ -8,6 +8,6 @@ T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | Execute$ Tr SVar:TrigLoseLife:DB$ LoseLife | LifeAmount$ Y | References$ Y SVar:X:Count$CardCounters.AGE SVar:Y:TriggeredCard$CardCounters.AGE/Times.2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_etchings.jpg Oracle:Cumulative upkeep {B} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nAt the beginning of your end step, draw a card for each age counter on Phyrexian Etchings.\nWhen Phyrexian Etchings is put into a graveyard from the battlefield, you lose 2 life for each age counter on it. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_furnace.txt b/forge-gui/res/cardsfolder/p/phyrexian_furnace.txt index d27aeca6ab4..9b5820bb19a 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_furnace.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_furnace.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ ChangeZoneAll | Cost$ T | ValidTgts$ Player | TgtPrompt$ Select target player | ChangeType$ Card.BottomGraveyard | Origin$ Graveyard | Destination$ Exile | SpellDescription$ Exile the bottom card of target player's graveyard. A:AB$ ChangeZone | Cost$ 1 Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SubAbility$ DBDraw | SpellDescription$ Exile target card from a graveyard. Draw a card. SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NeedsOrderedGraveyard:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_furnace.jpg Oracle:{T}: Exile the bottom card of target player's graveyard.\n{1}, Sacrifice Phyrexian Furnace: Exile target card from a graveyard. Draw a card. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_gremlins.txt b/forge-gui/res/cardsfolder/p/phyrexian_gremlins.txt index 48e2e1ad6eb..795cfaec2e8 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_gremlins.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_gremlins.txt @@ -7,6 +7,6 @@ A:AB$ Tap | Cost$ T | ValidTgts$ Artifact | RememberTapped$ True | AlwaysRemembe S:Mode$ Continuous | Affected$ Creature.IsRemembered | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. T:Mode$ Untaps | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ ClearRemembered | Static$ True SVar:ClearRemembered:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_gremlins.jpg Oracle:You may choose not to untap Phyrexian Gremlins during your untap step.\n{T}: Tap target artifact. It doesn't untap during its controller's untap step for as long as Phyrexian Gremlins remains tapped. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_grimoire.txt b/forge-gui/res/cardsfolder/p/phyrexian_grimoire.txt index 28484119236..0a6312113e0 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_grimoire.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_grimoire.txt @@ -6,7 +6,7 @@ SVar:DBChoose:DB$ ChooseCard | ValidTgts$ Opponent | Choices$ Card.IsRemembered SVar:DBExile:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Graveyard | Destination$ Exile | SubAbility$ DBReturn SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Graveyard | Destination$ Hand | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NeedsOrderedGraveyard:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_grimoire.jpg Oracle:{4}, {T}: Target opponent chooses one of the top two cards of your graveyard. Exile that card and put the other one into your hand. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_ironfoot.txt b/forge-gui/res/cardsfolder/p/phyrexian_ironfoot.txt index 027a43448bd..5dd9f841322 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_ironfoot.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_ironfoot.txt @@ -5,6 +5,6 @@ PT:3/4 K:CARDNAME doesn't untap during your untap step. A:AB$ Untap | Cost$ 1 S | SpellDescription$ Untap CARDNAME. # AI can now use snow mana to pay for activated abilities. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_ironfoot.jpg Oracle:Phyrexian Ironfoot doesn't untap during your untap step.\n{1}{S}: Untap Phyrexian Ironfoot. ({S} can be paid with one mana from a snow permanent.) diff --git a/forge-gui/res/cardsfolder/p/phyrexian_negator.txt b/forge-gui/res/cardsfolder/p/phyrexian_negator.txt index 252e1899492..470f2f3389e 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_negator.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_negator.txt @@ -6,6 +6,6 @@ K:Trample T:Mode$ DamageDoneOnce | ValidTarget$ Card.Self | Execute$ TrigSac | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME is dealt damage, sacrifice that many permanents. SVar:TrigSac:DB$ Sacrifice | Amount$ X | SacValid$ Permanent | References$ X SVar:X:TriggerCount$DamageAmount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_negator.jpg Oracle:Trample\nWhenever Phyrexian Negator is dealt damage, sacrifice that many permanents. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_plaguelord.txt b/forge-gui/res/cardsfolder/p/phyrexian_plaguelord.txt index 67447bae322..1d810da200a 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_plaguelord.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_plaguelord.txt @@ -4,6 +4,6 @@ Types:Creature Carrier PT:4/4 A:AB$ Pump | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -4 | NumDef$ -4 | IsCurse$ True | SpellDescription$ Target creature gets -4/-4 until end of turn. A:AB$ Pump | Cost$ Sac<1/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ Target creature gets -1/-1 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_plaguelord.jpg Oracle:{T}, Sacrifice Phyrexian Plaguelord: Target creature gets -4/-4 until end of turn.\nSacrifice a creature: Target creature gets -1/-1 until end of turn. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_portal.txt b/forge-gui/res/cardsfolder/p/phyrexian_portal.txt index 1db7b9e10d6..bc4a872d23c 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_portal.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_portal.txt @@ -8,6 +8,6 @@ SVar:DBExile:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destinatio SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True # This variable may be incorrect if the controller changes while the ability is on the stack SVar:X:Count$InYourLibrary -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_portal.jpg Oracle:{3}: If your library has ten or more cards in it, target opponent looks at the top ten cards of your library and separates them into two face-down piles. Exile one of those piles. Search the other pile for a card, put it into your hand, then shuffle the rest of that pile into your library. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_processor.txt b/forge-gui/res/cardsfolder/p/phyrexian_processor.txt index 528f7770bad..e2fa0b3d50e 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_processor.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_processor.txt @@ -7,6 +7,6 @@ SVar:MoveToPlay:DB$ ChangeZone | Defined$ ReplacedCard | Origin$ All | Destinati A:AB$ Token | Cost$ 4 T | TokenAmount$ 1 | TokenName$ Minion | TokenTypes$ Creature,Minion | TokenOwner$ You | TokenColors$ Black | TokenPower$ LifePaidOnETB | TokenToughness$ LifePaidOnETB | TokenImage$ b x x minion | SpellDescription$ Create an X/X black Minion creature token, where X is the life paid as CARDNAME entered the battlefield. SVar:X:XChoice SVar:LifePaidOnETB:Number$0 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_processor.jpg Oracle:As Phyrexian Processor enters the battlefield, pay any amount of life.\n{4}, {T}: Create an X/X black Minion creature token, where X is the life paid as Phyrexian Processor entered the battlefield. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_purge.txt b/forge-gui/res/cardsfolder/p/phyrexian_purge.txt index 498b3b69356..1e7e8f7df28 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_purge.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_purge.txt @@ -5,6 +5,6 @@ A:SP$ Destroy | Cost$ 2 B R PayLife | ValidTgts$ Creature | TargetMin$ 0 | Ta SVar:MaxPayLifeLimit:Count$YourLifeTotal/DivideEvenlyDown.3 SVar:X:SVar$Y/Times.3 SVar:Y:Targeted$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_purge.jpg Oracle:Destroy any number of target creatures.\nPhyrexian Purge costs 3 life more to cast for each target. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_reclamation.txt b/forge-gui/res/cardsfolder/p/phyrexian_reclamation.txt index efe797f428d..fa78e07d85b 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_reclamation.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_reclamation.txt @@ -2,7 +2,7 @@ Name:Phyrexian Reclamation ManaCost:B Types:Enchantment A:AB$ ChangeZone | Cost$ 1 B PayLife<2> | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target creature card from your graveyard to your hand. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_reclamation.jpg Oracle:{1}{B}, Pay 2 life: Return target creature card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_revoker.txt b/forge-gui/res/cardsfolder/p/phyrexian_revoker.txt index 51f9a06f0ef..4773c48eedd 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_revoker.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_revoker.txt @@ -5,6 +5,6 @@ PT:2/1 K:ETBReplacement:Other:DBNameCard SVar:DBNameCard:DB$ NameCard | Defined$ You | ValidCards$ Card.nonLand | ValidDesc$ nonland | SpellDescription$ As CARDNAME enters the battlefield, choose a nonland card name. S:Mode$ CantBeActivated | ValidCard$ Card.NamedCard | Description$ Activated abilities of sources with the chosen name can't be activated. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_revoker.jpg Oracle:As Phyrexian Revoker enters the battlefield, choose a nonland card name.\nActivated abilities of sources with the chosen name can't be activated. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_slayer.txt b/forge-gui/res/cardsfolder/p/phyrexian_slayer.txt index 1fe3910f9b8..12e2ba10878 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_slayer.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_slayer.txt @@ -5,6 +5,6 @@ PT:2/2 K:Flying T:Mode$ AttackerBlocked | ValidCard$ Card.Self | ValidBlocker$ Creature.White | Execute$ TrigDestroyBlocker | TriggerDescription$ Whenever CARDNAME becomes blocked by a white creature, destroy that creature. It can't be regenerated. SVar:TrigDestroyBlocker:DB$Destroy | Defined$ TriggeredBlocker | NoRegen$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_slayer.jpg Oracle:Flying\nWhenever Phyrexian Slayer becomes blocked by a white creature, destroy that creature. It can't be regenerated. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_soulgorger.txt b/forge-gui/res/cardsfolder/p/phyrexian_soulgorger.txt index a3c78b5cbf7..7ce31a7edb8 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_soulgorger.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_soulgorger.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Snow Artifact Creature Construct PT:8/8 K:Cumulative upkeep:Sac<1/Creature>:Sacrifice a creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_soulgorger.jpg Oracle:Cumulative upkeep—Sacrifice a creature. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) diff --git a/forge-gui/res/cardsfolder/p/phyrexian_splicer.txt b/forge-gui/res/cardsfolder/p/phyrexian_splicer.txt index 9ae0d9ae567..b152f930e76 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_splicer.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_splicer.txt @@ -9,6 +9,6 @@ SVar:DBGainFly:DB$Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature SVar:DBGainFs:DB$Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature to gain first strike | KW$ First Strike | TargetUnique$ True SVar:DBGainShdw:DB$Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature to gain shadow | KW$ Shadow | TargetUnique$ True SVar:DBGainTrpl:DB$Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature to gain trample | KW$ Trample | TargetUnique$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_splicer.jpg Oracle:{2}, {T}, Choose flying, first strike, trample, or shadow: Until end of turn, target creature with the chosen ability loses it and another target creature gains it. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_totem.txt b/forge-gui/res/cardsfolder/p/phyrexian_totem.txt index 51cf7827e32..cfb92b33ef9 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_totem.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_totem.txt @@ -6,6 +6,6 @@ A:AB$ Animate | Cost$ 2 B | Defined$ Self | Power$ 5 | Toughness$ 5 | Types$ Cre T:Mode$ DamageDoneOnce | ValidTarget$ Creature.Self | Execute$ TrigSac | TriggerDescription$ Whenever CARDNAME is dealt damage, if it's a creature, sacrifice that many permanents. SVar:TrigSac:DB$Sacrifice | SacValid$ Permanent | Amount$ X | References$ X SVar:X:TriggerCount$DamageAmount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_totem.jpg Oracle:{T}: Add {B}.\n{2}{B}: Phyrexian Totem becomes a 5/5 black Horror artifact creature with trample until end of turn.\nWhenever Phyrexian Totem is dealt damage, if it's a creature, sacrifice that many permanents. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_tower.txt b/forge-gui/res/cardsfolder/p/phyrexian_tower.txt index a65d1def01b..2b0fba6b72e 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_tower.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_tower.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Legendary Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ T Sac<1/Creature> | Produced$ B | Amount$ 2 | SpellDescription$ Add {B}{B}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_tower.jpg Oracle:{T}: Add {C}.\n{T}, Sacrifice a creature: Add {B}{B}. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_tribute.txt b/forge-gui/res/cardsfolder/p/phyrexian_tribute.txt index 7a1c1bb589a..dc9d582a125 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_tribute.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_tribute.txt @@ -3,6 +3,6 @@ ManaCost:2 B Types:Sorcery A:SP$ Destroy | Cost$ 2 B Sac<2/Creature> | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy target artifact. SVar:AIPreference:SacCost$Creature.token,Creature.cmcLE1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_tribute.jpg Oracle:As an additional cost to cast Phyrexian Tribute, sacrifice two creatures.\nDestroy target artifact. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_tyranny.txt b/forge-gui/res/cardsfolder/p/phyrexian_tyranny.txt index ebe763726e6..d4c31a1ce0d 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_tyranny.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_tyranny.txt @@ -3,6 +3,6 @@ ManaCost:U B R Types:Enchantment T:Mode$ Drawn | ValidCard$ Card | TriggerZones$ Battlefield | Execute$ TrigLose | TriggerDescription$ Whenever a player draws a card, that player loses 2 life unless they pay {2}. SVar:TrigLose:DB$LoseLife | Defined$ TriggeredCardController | LifeAmount$ 2 | UnlessCost$ 2 | UnlessPayer$ TriggeredCardController -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_tyranny.jpg Oracle:Whenever a player draws a card, that player loses 2 life unless they pay {2}. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_vatmother.txt b/forge-gui/res/cardsfolder/p/phyrexian_vatmother.txt index afb1fb4c7a5..fe5615a3f81 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_vatmother.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_vatmother.txt @@ -5,6 +5,6 @@ PT:4/5 K:Infect T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPoison | TriggerDescription$ At the beginning of your upkeep, you get a poison counter. SVar:TrigPoison:DB$Poison | Defined$ You | Num$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_vatmother.jpg Oracle:Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.)\nAt the beginning of your upkeep, you get a poison counter. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_vault.txt b/forge-gui/res/cardsfolder/p/phyrexian_vault.txt index 3290b87092b..a51b7a07e8c 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_vault.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_vault.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact A:AB$ Draw | Cost$ 2 T Sac<1/Creature> | NumCards$ 1 | SpellDescription$ Draw a card. SVar:AIPreference:SacCost$Creature.cmcLE2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_vault.jpg Oracle:{2}, {T}, Sacrifice a creature: Draw a card. diff --git a/forge-gui/res/cardsfolder/p/phyrexias_core.txt b/forge-gui/res/cardsfolder/p/phyrexias_core.txt index fc37ab4e9ea..59761b1fd8c 100644 --- a/forge-gui/res/cardsfolder/p/phyrexias_core.txt +++ b/forge-gui/res/cardsfolder/p/phyrexias_core.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ GainLife | Cost$ 1 T Sac<1/Artifact> | LifeAmount$ 1 | SpellDescription$ You gain 1 life. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexias_core.jpg Oracle:{T}: Add {C}.\n{1}, {T}, Sacrifice an artifact: You gain 1 life. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/p/piety.txt b/forge-gui/res/cardsfolder/p/piety.txt index a9b5dfbb98f..3d7ca2ced29 100644 --- a/forge-gui/res/cardsfolder/p/piety.txt +++ b/forge-gui/res/cardsfolder/p/piety.txt @@ -2,6 +2,6 @@ Name:Piety ManaCost:2 W Types:Instant A:SP$ PumpAll | Cost$ 2 W | ValidCards$ Creature.blocking | NumDef$ +3 | SpellDescription$ Blocking creatures get +0/+3 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/piety.jpg Oracle:Blocking creatures get +0/+3 until end of turn. diff --git a/forge-gui/res/cardsfolder/p/piety_charm.txt b/forge-gui/res/cardsfolder/p/piety_charm.txt index e3d0fc28038..91f93d95f6b 100644 --- a/forge-gui/res/cardsfolder/p/piety_charm.txt +++ b/forge-gui/res/cardsfolder/p/piety_charm.txt @@ -6,6 +6,6 @@ SVar:DetroyAura:DB$ Destroy | ValidTgts$ Aura.AttachedTo Creature | TgtPrompt$ S SVar:PumpSoldier:DB$ Pump | NumAtt$ +2 | NumDef$ +2 | ValidTgts$ Creature.Soldier | TgtPrompt$ Select target Soldier creature | SpellDescription$ Target Soldier creature gets +2/+2 until end of turn. SVar:PumpVigilance:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Vigilance | SpellDescription$ Creatures you control gain vigilance until end of turn. DeckHints:Type$Soldier -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/piety_charm.jpg Oracle:Choose one —\n• Destroy target Aura attached to a creature.\n• Target Soldier creature gets +2/+2 until end of turn.\n• Creatures you control gain vigilance until end of turn. diff --git a/forge-gui/res/cardsfolder/p/pikemen.txt b/forge-gui/res/cardsfolder/p/pikemen.txt index 88e47d8dbcd..396033977f3 100644 --- a/forge-gui/res/cardsfolder/p/pikemen.txt +++ b/forge-gui/res/cardsfolder/p/pikemen.txt @@ -4,6 +4,6 @@ Types:Creature Human Soldier PT:1/1 K:First Strike K:Banding -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/pikemen.jpg Oracle:First strike, banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/p/pilgrim_of_justice.txt b/forge-gui/res/cardsfolder/p/pilgrim_of_justice.txt index 13c6b177182..a7867c6d47d 100644 --- a/forge-gui/res/cardsfolder/p/pilgrim_of_justice.txt +++ b/forge-gui/res/cardsfolder/p/pilgrim_of_justice.txt @@ -8,6 +8,6 @@ SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPreventNextFromSource | SVars$ R SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.ChosenCard+RedSource | ReplaceWith$ ExileEffect | PreventionEffect$ True | Description$ The next time the chosen red source deals damage, prevent that damage. SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/pilgrim_of_justice.jpg Oracle:Protection from red\n{W}, Sacrifice Pilgrim of Justice: The next time a red source of your choice would deal damage this turn, prevent that damage. diff --git a/forge-gui/res/cardsfolder/p/pilgrim_of_virtue.txt b/forge-gui/res/cardsfolder/p/pilgrim_of_virtue.txt index f2804d0920e..6b668c258f7 100644 --- a/forge-gui/res/cardsfolder/p/pilgrim_of_virtue.txt +++ b/forge-gui/res/cardsfolder/p/pilgrim_of_virtue.txt @@ -8,6 +8,6 @@ SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPreventNextFromSource | SVars$ R SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.ChosenCard+BlackSource | ReplaceWith$ ExileEffect | PreventionEffect$ True | Description$ The next time the chosen black source deals damage, prevent that damage. SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/pilgrim_of_virtue.jpg Oracle:Protection from black\n{W}, Sacrifice Pilgrim of Virtue: The next time a black source of your choice would deal damage this turn, prevent that damage. diff --git a/forge-gui/res/cardsfolder/p/pili_pala.txt b/forge-gui/res/cardsfolder/p/pili_pala.txt index fe9f202f6c0..f67c0349d15 100644 --- a/forge-gui/res/cardsfolder/p/pili_pala.txt +++ b/forge-gui/res/cardsfolder/p/pili_pala.txt @@ -4,6 +4,6 @@ Types:Artifact Creature Scarecrow PT:1/1 K:Flying A:AB$ Mana | Cost$ 2 Q | Produced$ Any | SpellDescription$ Add one mana of any color. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/pili_pala.jpg Oracle:Flying\n{2}, {Q}: Add one mana of any color. ({Q} is the untap symbol.) diff --git a/forge-gui/res/cardsfolder/p/pillar_of_the_paruns.txt b/forge-gui/res/cardsfolder/p/pillar_of_the_paruns.txt index b19ecb2415e..d38753e8f27 100644 --- a/forge-gui/res/cardsfolder/p/pillar_of_the_paruns.txt +++ b/forge-gui/res/cardsfolder/p/pillar_of_the_paruns.txt @@ -2,6 +2,6 @@ Name:Pillar of the Paruns ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ Any | RestrictValid$ Card.MultiColor | SpellDescription$ Add one mana of any color. Spend this mana only to cast a multicolored spell. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/pillar_of_the_paruns.jpg Oracle:{T}: Add one mana of any color. Spend this mana only to cast a multicolored spell. diff --git a/forge-gui/res/cardsfolder/p/pillar_tombs_of_aku.txt b/forge-gui/res/cardsfolder/p/pillar_tombs_of_aku.txt index e2852a5bb9d..fdfc4e6a98c 100644 --- a/forge-gui/res/cardsfolder/p/pillar_tombs_of_aku.txt +++ b/forge-gui/res/cardsfolder/p/pillar_tombs_of_aku.txt @@ -6,6 +6,6 @@ SVar:TrigSac:DB$ Sacrifice | SacValid$ Creature | Defined$ TriggeredPlayer | Rem SVar:DBLoseLife:DB$ LoseLife | Defined$ TriggeredPlayer | LifeAmount$ 5 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ0 | SubAbility$ DBSacSelf SVar:DBSacSelf:DB$ Sacrifice | SacValid$ Self | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ0 | SubAbility$ DBCleanup SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/pillar_tombs_of_aku.jpg Oracle:At the beginning of each player's upkeep, that player may sacrifice a creature. If that player doesn't, they lose 5 life and you sacrifice Pillar Tombs of Aku. diff --git a/forge-gui/res/cardsfolder/p/pitchstone_wall.txt b/forge-gui/res/cardsfolder/p/pitchstone_wall.txt index cc5bc1ff93c..51de3a43733 100644 --- a/forge-gui/res/cardsfolder/p/pitchstone_wall.txt +++ b/forge-gui/res/cardsfolder/p/pitchstone_wall.txt @@ -5,6 +5,6 @@ PT:2/5 K:Defender T:Mode$ Discarded | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigChange | TriggerDescription$ Whenever you discard a card, you may sacrifice CARDNAME. If you do, return the discarded card from your graveyard to your hand. SVar:TrigChange:AB$ChangeZone | Cost$ Sac<1/CARDNAME> | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Hand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/pitchstone_wall.jpg Oracle:Defender (This creature can't attack.)\nWhenever you discard a card, you may sacrifice Pitchstone Wall. If you do, return the discarded card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/p/pithing_needle.txt b/forge-gui/res/cardsfolder/p/pithing_needle.txt index 9552fbfd961..84dfd999872 100644 --- a/forge-gui/res/cardsfolder/p/pithing_needle.txt +++ b/forge-gui/res/cardsfolder/p/pithing_needle.txt @@ -4,6 +4,6 @@ Types:Artifact K:ETBReplacement:Other:DBNameCard SVar:DBNameCard:DB$ NameCard | Defined$ You | SpellDescription$ As CARDNAME enters the battlefield, choose a card name. S:Mode$ CantBeActivated | ValidCard$ Card.NamedCard | NonMana$ True | Description$ Activated abilities of sources with the chosen name can't be activated unless they're mana abilities. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/pithing_needle.jpg Oracle:As Pithing Needle enters the battlefield, name choose a card name.\nActivated abilities of sources with the chosen name can't be activated unless they're mana abilities. diff --git a/forge-gui/res/cardsfolder/p/plagiarize.txt b/forge-gui/res/cardsfolder/p/plagiarize.txt index 39b5f89759b..5f1c6a281c5 100644 --- a/forge-gui/res/cardsfolder/p/plagiarize.txt +++ b/forge-gui/res/cardsfolder/p/plagiarize.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Effect | Cost$ 3 U | Name$ Plagiarize Effect | ReplacementEffects$ EventDraw | SVars$ ABDraw | RememberObjects$ Targeted | ValidTgts$ Player | TgtPrompt$ Select target player | IsCurse$ True | SpellDescription$ Until end of turn, if target player would draw a card, instead that player skips that draw and you draw a card. SVar:EventDraw:Event$ Draw | ValidPlayer$ Player.IsRemembered | ReplaceWith$ ABDraw | Description$ If the targeted player would draw a card, that player skips that draw and you draw a card. SVar:ABDraw:DB$ Draw | Defined$ You | NumCards$ 1 | SpellDescription$ You draw a card. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/plagiarize.jpg Oracle:Until end of turn, if target player would draw a card, instead that player skips that draw and you draw a card. diff --git a/forge-gui/res/cardsfolder/p/plague_boiler.txt b/forge-gui/res/cardsfolder/p/plague_boiler.txt index 4da638d3b1d..cb8abe49a77 100644 --- a/forge-gui/res/cardsfolder/p/plague_boiler.txt +++ b/forge-gui/res/cardsfolder/p/plague_boiler.txt @@ -10,6 +10,6 @@ T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Card.Self+counters_GE3_P SVar:TrigSac:DB$ Sacrifice | Defined$ Self | RememberSacrificed$ True | SubAbility$ DBDestroyAll SVar:DBDestroyAll:DB$ DestroyAll | ValidCards$ Permanent.nonLand | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/plague_boiler.jpg Oracle:At the beginning of your upkeep, put a plague counter on Plague Boiler.\n{1}{B}{G}: Put a plague counter on Plague Boiler or remove a plague counter from it.\nWhen Plague Boiler has three or more plague counters on it, sacrifice it. If you do, destroy all nonland permanents. diff --git a/forge-gui/res/cardsfolder/p/plague_dogs.txt b/forge-gui/res/cardsfolder/p/plague_dogs.txt index c6dd655a519..8187cac4546 100644 --- a/forge-gui/res/cardsfolder/p/plague_dogs.txt +++ b/forge-gui/res/cardsfolder/p/plague_dogs.txt @@ -5,6 +5,6 @@ PT:3/3 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigNausea | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, all creatures get -1/-1 until end of turn. SVar:TrigNausea:DB$PumpAll | ValidCards$ Creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ All creatures get -1/-1 until end of turn. A:AB$ Draw | Cost$ 2 Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/plague_dogs.jpg Oracle:When Plague Dogs dies, all creatures get -1/-1 until end of turn.\n{2}, Sacrifice Plague Dogs: Draw a card. diff --git a/forge-gui/res/cardsfolder/p/plague_rats.txt b/forge-gui/res/cardsfolder/p/plague_rats.txt index f3b25e1d3a3..9865712f4a5 100644 --- a/forge-gui/res/cardsfolder/p/plague_rats.txt +++ b/forge-gui/res/cardsfolder/p/plague_rats.txt @@ -5,7 +5,7 @@ PT:*/* S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | References$ X | Description$ CARDNAME's power and toughness are each equal to the number of creatures named Plague Rats on the battlefield. SVar:X:Count$Valid Creature.namedPlague Rats SVar:BuffedBy:Creature.namedPlague Rats -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NoZeroToughnessAI:True DeckHints:Name$Plague Rats SVar:Picture:http://www.wizards.com/global/images/magic/general/plague_rats.jpg diff --git a/forge-gui/res/cardsfolder/p/plague_witch.txt b/forge-gui/res/cardsfolder/p/plague_witch.txt index 52ee6270267..8975d19ce8f 100644 --- a/forge-gui/res/cardsfolder/p/plague_witch.txt +++ b/forge-gui/res/cardsfolder/p/plague_witch.txt @@ -3,6 +3,6 @@ ManaCost:1 B Types:Creature Elf Spellshaper PT:1/1 A:AB$ Pump | Cost$ B T Discard<1/Card> | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Target creature gets -1/-1 until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/plague_witch.jpg Oracle:{B}, {T}, Discard a card: Target creature gets -1/-1 until end of turn. diff --git a/forge-gui/res/cardsfolder/p/plagued_rusalka.txt b/forge-gui/res/cardsfolder/p/plagued_rusalka.txt index e19a2c8202f..dc7c997c818 100644 --- a/forge-gui/res/cardsfolder/p/plagued_rusalka.txt +++ b/forge-gui/res/cardsfolder/p/plagued_rusalka.txt @@ -3,6 +3,6 @@ ManaCost:B Types:Creature Spirit PT:1/1 A:AB$ Pump | Cost$ B Sac<1/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ Target creature gets -1/-1 until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/plagued_rusalka.jpg Oracle:{B}, Sacrifice a creature: Target creature gets -1/-1 until end of turn. diff --git a/forge-gui/res/cardsfolder/p/plaguemaw_beast.txt b/forge-gui/res/cardsfolder/p/plaguemaw_beast.txt index 5a2404afaac..0683ba28eef 100644 --- a/forge-gui/res/cardsfolder/p/plaguemaw_beast.txt +++ b/forge-gui/res/cardsfolder/p/plaguemaw_beast.txt @@ -3,7 +3,7 @@ ManaCost:3 G G Types:Creature Beast PT:4/3 A:AB$ Proliferate | Cost$ T Sac<1/Creature> | SpellDescription$ Proliferate. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:AIPreference:SacCost$Creature.token+powerLE3+toughnessLE3,Creature.cmcLE2 DeckHas:Ability$Proliferate DeckNeeds:Ability$Counters diff --git a/forge-gui/res/cardsfolder/p/planar_birth.txt b/forge-gui/res/cardsfolder/p/planar_birth.txt index e34a1c12731..9d374d8fc2e 100644 --- a/forge-gui/res/cardsfolder/p/planar_birth.txt +++ b/forge-gui/res/cardsfolder/p/planar_birth.txt @@ -2,6 +2,6 @@ Name:Planar Birth ManaCost:1 W Types:Sorcery A:SP$ ChangeZoneAll | Cost$ 1 W | ChangeType$ Land.Basic | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True | SpellDescription$ Return all basic land cards from all graveyards to the battlefield tapped under their owners' control. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/planar_birth.jpg Oracle:Return all basic land cards from all graveyards to the battlefield tapped under their owners' control. diff --git a/forge-gui/res/cardsfolder/p/planar_chaos.txt b/forge-gui/res/cardsfolder/p/planar_chaos.txt index 02a14a0359d..9d9271d90c4 100644 --- a/forge-gui/res/cardsfolder/p/planar_chaos.txt +++ b/forge-gui/res/cardsfolder/p/planar_chaos.txt @@ -7,6 +7,6 @@ SVar:DBSacrifice:DB$ Sacrifice | Defined$ Self T:Mode$ SpellCast | ValidCard$ Card | TriggerZones$ Battlefield | Execute$ TrigFlipYouCast | TriggerDescription$ Whenever a player casts a spell, that player flips a coin. If they lose the flip, counter that spell. SVar:TrigFlipYouCast:DB$ FlipACoin | LoseSubAbility$ DBCounter | Caller$ TriggeredActivator SVar:DBCounter:DB$ Counter | Defined$ TriggeredSpellAbility -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/planar_chaos.jpg Oracle:At the beginning of your upkeep, flip a coin. If you lose the flip, sacrifice Planar Chaos.\nWhenever a player casts a spell, that player flips a coin. If they lose the flip, counter that spell. diff --git a/forge-gui/res/cardsfolder/p/planar_collapse.txt b/forge-gui/res/cardsfolder/p/planar_collapse.txt index 910040231c3..b8c7f6466c7 100644 --- a/forge-gui/res/cardsfolder/p/planar_collapse.txt +++ b/forge-gui/res/cardsfolder/p/planar_collapse.txt @@ -4,7 +4,7 @@ Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Creature | PresentCompare$ GE4 | Execute$ TrigSac | TriggerDescription$ At the beginning of your upkeep, if there are four or more creatures on the battlefield, sacrifice CARDNAME and destroy all creatures. They can't be regenerated. SVar:TrigSac:DB$Sacrifice | Defined$ Self | SubAbility$ DBDestroyAll SVar:DBDestroyAll:DB$DestroyAll | ValidCards$ Creature | NoRegen$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/planar_collapse.jpg Oracle:At the beginning of your upkeep, if there are four or more creatures on the battlefield, sacrifice Planar Collapse and destroy all creatures. They can't be regenerated. diff --git a/forge-gui/res/cardsfolder/p/planar_despair.txt b/forge-gui/res/cardsfolder/p/planar_despair.txt index 3535639ba6a..c9a475ad40b 100644 --- a/forge-gui/res/cardsfolder/p/planar_despair.txt +++ b/forge-gui/res/cardsfolder/p/planar_despair.txt @@ -3,6 +3,6 @@ ManaCost:3 B B Types:Sorcery A:SP$ PumpAll | Cost$ 3 B B | ValidCards$ Creature | NumAtt$ -X | NumDef$ -X | References$ X | IsCurse$ True | SpellDescription$ Domain — All creatures get -1/-1 until end of turn for each basic land type among lands you control. SVar:X:Count$Domain -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/planar_despair.jpg Oracle:Domain — All creatures get -1/-1 until end of turn for each basic land type among lands you control. diff --git a/forge-gui/res/cardsfolder/p/planar_guide.txt b/forge-gui/res/cardsfolder/p/planar_guide.txt index 20f6425d913..afa285f224f 100644 --- a/forge-gui/res/cardsfolder/p/planar_guide.txt +++ b/forge-gui/res/cardsfolder/p/planar_guide.txt @@ -6,6 +6,6 @@ A:AB$ ChangeZoneAll | Cost$ 3 W Exile<1/CARDNAME> | ChangeType$ Creature | Origi SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | RememberObjects$ Remembered | TriggerDescription$ Return cards exiled by CARDNAME to the battlefield. | SubAbility$ DBCleanup SVar:TrigReturn:DB$ ChangeZone | Defined$ DelayTriggerRemembered | Origin$ Exile | Destination$ Battlefield SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/planar_guide.jpg Oracle:{3}{W}, Exile Planar Guide: Exile all creatures. At the beginning of the next end step, return those cards to the battlefield under their owners' control. diff --git a/forge-gui/res/cardsfolder/p/planar_overlay.txt b/forge-gui/res/cardsfolder/p/planar_overlay.txt index ffdbfe9d341..123cab942d9 100644 --- a/forge-gui/res/cardsfolder/p/planar_overlay.txt +++ b/forge-gui/res/cardsfolder/p/planar_overlay.txt @@ -9,7 +9,7 @@ SVar:ChoosePlains:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Plain SVar:ChooseForest:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Forest.RememberedPlayerCtrl | Mandatory$ True | RememberChosen$ True | AILogic$ WorstCard SVar:DBChangeZone:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Battlefield | Destination$ Hand | StackDescription$ None | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/planar_overlay.jpg Oracle:Each player chooses a land they control of each basic land type. Return those lands to their owners' hands. diff --git a/forge-gui/res/cardsfolder/p/planar_void.txt b/forge-gui/res/cardsfolder/p/planar_void.txt index ffec8eb147d..04d56642d83 100644 --- a/forge-gui/res/cardsfolder/p/planar_void.txt +++ b/forge-gui/res/cardsfolder/p/planar_void.txt @@ -3,7 +3,7 @@ ManaCost:B Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | TriggerZones$ Battlefield | ValidCard$ Card.nonToken+Other | Execute$ TrigChange | TriggerDescription$ Whenever another card is put into a graveyard from anywhere, exile that card. SVar:TrigChange:DB$ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Exile -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/planar_void.jpg Oracle:Whenever another card is put into a graveyard from anywhere, exile that card. diff --git a/forge-gui/res/cardsfolder/p/planeswalkers_fury.txt b/forge-gui/res/cardsfolder/p/planeswalkers_fury.txt index 221288638b9..399d1e1c0cb 100644 --- a/forge-gui/res/cardsfolder/p/planeswalkers_fury.txt +++ b/forge-gui/res/cardsfolder/p/planeswalkers_fury.txt @@ -5,7 +5,7 @@ A:AB$ Reveal | Cost$ 3 R | Random$ True | RememberRevealed$ True | ValidTgts$ Op SVar:DBDamage:DB$ DealDamage | Defined$ ParentTarget | NumDmg$ X | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/planeswalkers_fury.jpg Oracle:{3}{R}: Target opponent reveals a card at random from their hand. Planeswalker's Fury deals damage equal to that card's converted mana cost to that player. Activate this ability only any time you could cast a sorcery. diff --git a/forge-gui/res/cardsfolder/p/plaxmanta.txt b/forge-gui/res/cardsfolder/p/plaxmanta.txt index fc9e001627e..3d72c0ca949 100644 --- a/forge-gui/res/cardsfolder/p/plaxmanta.txt +++ b/forge-gui/res/cardsfolder/p/plaxmanta.txt @@ -8,6 +8,6 @@ T:Mode$ ChangesZone | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ SVar:TrigPumpAll:DB$PumpAll | ValidCards$ Creature.YouCtrl | KW$ Shroud SVar:TrigSac:DB$Sacrifice | Defined$ Self SVar:ManaNeededToAvoidNegativeEffect:green -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/plaxmanta.jpg Oracle:Flash\nWhen Plaxmanta enters the battlefield, creatures you control gain shroud until end of turn. (They can't be the targets of spells or abilities.)\nWhen Plaxmanta enters the battlefield, sacrifice it unless {G} was spent to cast it. diff --git a/forge-gui/res/cardsfolder/p/plea_for_guidance.txt b/forge-gui/res/cardsfolder/p/plea_for_guidance.txt index f4e6b8f2d9d..7b41f335d54 100644 --- a/forge-gui/res/cardsfolder/p/plea_for_guidance.txt +++ b/forge-gui/res/cardsfolder/p/plea_for_guidance.txt @@ -2,6 +2,6 @@ Name:Plea for Guidance ManaCost:5 W Types:Sorcery A:SP$ ChangeZone | Cost$ 5 W | Origin$ Library | Destination$ Hand | ChangeType$ Enchantment | ChangeNum$ 2 | SpellDescription$ Search your library for up to two enchantment cards, reveal them, put them into your hand, then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/plea_for_guidance.jpg Oracle:Search your library for up to two enchantment cards, reveal them, put them into your hand, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/p/plea_for_power.txt b/forge-gui/res/cardsfolder/p/plea_for_power.txt index 3ab6888de5d..5f6a3fc74ec 100644 --- a/forge-gui/res/cardsfolder/p/plea_for_power.txt +++ b/forge-gui/res/cardsfolder/p/plea_for_power.txt @@ -6,6 +6,6 @@ SVar:DBAddTurn:DB$ AddTurn | NumTurns$ 1 | Defined$ You SVar:DBDrawThree:DB$ Draw | Defined$ You | NumCards$ 3 SVar:NeedsToPlayVar:Z LE6 SVar:Z:Count$InYourHand -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/plea_for_power.jpg Oracle:Will of the council — Starting with you, each player votes for time or knowledge. If time gets more votes, take an extra turn after this one. If knowledge gets more votes or the vote is tied, draw three cards. diff --git a/forge-gui/res/cardsfolder/p/plow_through_reito.txt b/forge-gui/res/cardsfolder/p/plow_through_reito.txt index 4986048b9a7..407afced0cc 100644 --- a/forge-gui/res/cardsfolder/p/plow_through_reito.txt +++ b/forge-gui/res/cardsfolder/p/plow_through_reito.txt @@ -5,6 +5,6 @@ A:SP$ ChangeZone | Cost$ 1 W | Origin$ Battlefield | Destination$ Hand | ChangeT SVar:ReitoPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ Y | NumDef$ Y | References$ Y SVar:X:Count$Valid Plains.YouCtrl SVar:Y:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/plow_through_reito.jpg Oracle:Sweep — Return any number of Plains you control to their owner's hand. Target creature gets +1/+1 until end of turn for each Plains returned this way. diff --git a/forge-gui/res/cardsfolder/p/plunge_into_darkness.txt b/forge-gui/res/cardsfolder/p/plunge_into_darkness.txt index 8b5b04b3caa..d1eaa469cde 100644 --- a/forge-gui/res/cardsfolder/p/plunge_into_darkness.txt +++ b/forge-gui/res/cardsfolder/p/plunge_into_darkness.txt @@ -14,6 +14,6 @@ SVar:DBDig:DB$ Dig | DigNum$ AFLifeLost | DestinationZone2$ Exile SVar:Y:Count$ChosenNumber SVar:LifeAmountX:Count$YourLifeTotal/LimitMin.0 SVar:AFLifeLost:Number$0 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/plunge_into_darkness.jpg Oracle:Choose one —\n• Sacrifice any number of creatures, then you gain 3 life for each sacrificed creature.\n• Pay X life, then look at the top X cards of your library. Put one of those cards into your hand and exile the rest.\nEntwine {B} (Choose both if you pay the entwine cost.) diff --git a/forge-gui/res/cardsfolder/p/political_trickery.txt b/forge-gui/res/cardsfolder/p/political_trickery.txt index 1ab12730817..66177e9c3a0 100644 --- a/forge-gui/res/cardsfolder/p/political_trickery.txt +++ b/forge-gui/res/cardsfolder/p/political_trickery.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Sorcery A:SP$ Pump | Cost$ 2 U | ValidTgts$ Land.YouCtrl | TgtPrompt$ Choose target land you control | SubAbility$ DBExchange | SpellDescription$ Exchange control of target land you control and target land an opponent controls. (This effect lasts indefinitely.) SVar:DBExchange:DB$ ExchangeControl | Defined$ ParentTarget | ValidTgts$ Land.OppCtrl | TgtPrompt$ Choose target land an opponent controls -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/political_trickery.jpg Oracle:Exchange control of target land you control and target land an opponent controls. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/p/pollen_remedy.txt b/forge-gui/res/cardsfolder/p/pollen_remedy.txt index a6689cc48ad..b633afe4f70 100644 --- a/forge-gui/res/cardsfolder/p/pollen_remedy.txt +++ b/forge-gui/res/cardsfolder/p/pollen_remedy.txt @@ -4,6 +4,6 @@ Types:Instant K:Kicker:Sac<1/Land> A:SP$ PreventDamage | Cost$ W | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target to prevent damage to | Amount$ 5 | TargetMin$ 1 | TargetMax$ X | References$ X | DividedAsYouChoose$ X | SpellDescription$ Prevent the next 3 damage that would be dealt this turn to any number of targets, divided as you choose. If CARDNAME was kicked, prevent the next 6 damage this way instead. SVar:X:Count$Kicked.6.3 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/pollen_remedy.jpg Oracle:Kicker—Sacrifice a land. (You may sacrifice a land in addition to any other costs as you cast this spell.)\nPrevent the next 3 damage that would be dealt this turn to any number of targets, divided as you choose. If Pollen Remedy was kicked, prevent the next 6 damage this way instead. diff --git a/forge-gui/res/cardsfolder/p/polymorph.txt b/forge-gui/res/cardsfolder/p/polymorph.txt index b6b2299b9e5..9c5a48c560d 100644 --- a/forge-gui/res/cardsfolder/p/polymorph.txt +++ b/forge-gui/res/cardsfolder/p/polymorph.txt @@ -3,6 +3,6 @@ ManaCost:3 U Types:Sorcery A:SP$ Destroy | Cost$ 3 U | NoRegen$ True | ValidTgts$ Creature | AILogic$ Polymorph | RememberLKI$ True | TgtPrompt$ Select target creature | SubAbility$ DBDig | SpellDescription$ Destroy target creature. It can't be regenerated. Its controller reveals cards from the top of their library until they reveal a creature card. The player puts that card onto the battlefield, then shuffles all other cards revealed this way into their library. SVar:DBDig:DB$ DigUntil | Defined$ RememberedController | Valid$ Creature | ValidDescription$ creature | FoundDestination$ Battlefield | RevealedDestination$ Library | Shuffle$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/polymorph.jpg Oracle:Destroy target creature. It can't be regenerated. Its controller reveals cards from the top of their library until they reveal a creature card. The player puts that card onto the battlefield, then shuffles all other cards revealed this way into their library. diff --git a/forge-gui/res/cardsfolder/p/polymorphists_jest.txt b/forge-gui/res/cardsfolder/p/polymorphists_jest.txt index 4e3692363a7..331909b6c90 100644 --- a/forge-gui/res/cardsfolder/p/polymorphists_jest.txt +++ b/forge-gui/res/cardsfolder/p/polymorphists_jest.txt @@ -2,6 +2,6 @@ Name:Polymorphist's Jest ManaCost:1 U U Types:Instant A:SP$ AnimateAll | Cost$ 1 U U | ValidTgts$ Player | TgtPrompt$ Select target Player | ValidCards$ Creature | Power$ 1 | Toughness$ 1 | RemoveAllAbilities$ True | Colors$ Blue | OverwriteColors$ True | Types$ Frog | RemoveCreatureTypes$ True | SpellDescription$ Until end of turn, each creature target player controls loses all abilities and becomes a blue Frog with base power and toughness 1/1. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/polymorphists_jest.jpg Oracle:Until end of turn, each creature target player controls loses all abilities and becomes a blue Frog with base power and toughness 1/1. diff --git a/forge-gui/res/cardsfolder/p/polymorphous_rush.txt b/forge-gui/res/cardsfolder/p/polymorphous_rush.txt index 54d2859ed59..3afc81051dd 100644 --- a/forge-gui/res/cardsfolder/p/polymorphous_rush.txt +++ b/forge-gui/res/cardsfolder/p/polymorphous_rush.txt @@ -7,6 +7,6 @@ SVar:Pump4Tgt:DB$ RepeatEach | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Choose t SVar:ShapeTgt:DB$ Clone | Defined$ ChosenCard | CloneTarget$ Remembered | Duration$ UntilEndOfTurn SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True SVar:MaxTargets:Count$Valid Creature.YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/polymorphous_rush.jpg Oracle:Strive — Polymorphous Rush costs {1}{U} more to cast for each target beyond the first.\nChoose a creature on the battlefield. Any number of target creatures you control each become a copy of that creature until end of turn. diff --git a/forge-gui/res/cardsfolder/p/ponder.txt b/forge-gui/res/cardsfolder/p/ponder.txt index 8cf9a78b83f..01915ca2486 100644 --- a/forge-gui/res/cardsfolder/p/ponder.txt +++ b/forge-gui/res/cardsfolder/p/ponder.txt @@ -3,6 +3,6 @@ ManaCost:U Types:Sorcery A:SP$ RearrangeTopOfLibrary | Cost$ U | Defined$ You | NumCards$ 3 | MayShuffle$ True | SubAbility$ DBDraw | SpellDescription$ Look at the top three cards of your library, then put them back in any order. You may shuffle your library. Draw a card. SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ponder.jpg Oracle:Look at the top three cards of your library, then put them back in any order. You may shuffle your library.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/p/porphyry_nodes.txt b/forge-gui/res/cardsfolder/p/porphyry_nodes.txt index 88f11d1eda1..29a8f86090d 100644 --- a/forge-gui/res/cardsfolder/p/porphyry_nodes.txt +++ b/forge-gui/res/cardsfolder/p/porphyry_nodes.txt @@ -7,6 +7,6 @@ SVar:DBDestroy:DB$ Destroy | Defined$ ChosenCard | NoRegen$ True T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Creature | PresentCompare$ EQ0 | Execute$ TrigSac | TriggerDescription$ When there are no creatures on the battlefield, sacrifice CARDNAME. SVar:TrigSac:DB$ Sacrifice | Defined$ Self SVar:NeedsToPlay:Creature.YouDontCtrl+leastPower -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/porphyry_nodes.jpg Oracle:At the beginning of your upkeep, destroy the creature with the least power. It can't be regenerated. If two or more creatures are tied for least power, you choose one of them.\nWhen there are no creatures on the battlefield, sacrifice Porphyry Nodes. diff --git a/forge-gui/res/cardsfolder/p/portal_mage.txt b/forge-gui/res/cardsfolder/p/portal_mage.txt index 0fb0447c7a0..b5860cb9058 100644 --- a/forge-gui/res/cardsfolder/p/portal_mage.txt +++ b/forge-gui/res/cardsfolder/p/portal_mage.txt @@ -5,6 +5,6 @@ PT:2/2 K:Flash T:Mode$ ChangesZone | Phase$ Declare Attackers | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeAttacker | OptionalDecider$ You | TriggerDescription$ When Portal Mage enters the battlefield during the declare attackers step, you may reselect which player or planeswalker target attacking creature is attacking. SVar:TrigChangeAttacker:DB$ ChangeCombatants | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/portal_mage.jpg Oracle:Flash\nWhen Portal Mage enters the battlefield during the declare attackers step, you may reselect which player or planeswalker target attacking creature is attacking. (It can't attack its controller or its controller's planeswalkers.) diff --git a/forge-gui/res/cardsfolder/p/portcullis.txt b/forge-gui/res/cardsfolder/p/portcullis.txt index 1a64ba8e87a..a13c521d275 100644 --- a/forge-gui/res/cardsfolder/p/portcullis.txt +++ b/forge-gui/res/cardsfolder/p/portcullis.txt @@ -6,6 +6,6 @@ T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ SVar:TrigExile:DB$ChangeZone | ConditionPresent$ Creature | ConditionCompare$ GE3 | Defined$ TriggeredCard | RememberChanged$ True | Origin$ Battlefield | Destination$ Exile SVar:TrigReturn:DB$ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Exile | Destination$ Battlefield | SubAbility$ DBCleanup SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/portcullis.jpg Oracle:Whenever a creature enters the battlefield, if there are two or more other creatures on the battlefield, exile that creature. Return that card to the battlefield under its owner's control when Portcullis leaves the battlefield. diff --git a/forge-gui/res/cardsfolder/p/portent.txt b/forge-gui/res/cardsfolder/p/portent.txt index cc6289b8ee6..513d6375f86 100644 --- a/forge-gui/res/cardsfolder/p/portent.txt +++ b/forge-gui/res/cardsfolder/p/portent.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ RearrangeTopOfLibrary | Cost$ U | ValidTgts$ Player | TgtPrompt$ Choose target player. | NumCards$ 3 | MayShuffle$ True | SubAbility$ DelTrigSlowtrip | SpellDescription$ Look at the top three cards of target player's library, then put them back in any order. You may have that player shuffle their library. Draw a card at the beginning of the next turn's upkeep. SVar:DelTrigSlowtrip:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ DrawSlowtrip | TriggerDescription$ Draw a card. SVar:DrawSlowtrip:DB$Draw | NumCards$ 1 | Defined$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/portent.jpg Oracle:Look at the top three cards of target player's library, then put them back in any order. You may have that player shuffle their library.\nDraw a card at the beginning of the next turn's upkeep. diff --git a/forge-gui/res/cardsfolder/p/possessed_portal.txt b/forge-gui/res/cardsfolder/p/possessed_portal.txt index d05f541f47a..ad1e307cf9e 100644 --- a/forge-gui/res/cardsfolder/p/possessed_portal.txt +++ b/forge-gui/res/cardsfolder/p/possessed_portal.txt @@ -5,6 +5,6 @@ R:Event$ Draw | ActiveZones$ Battlefield | ValidPlayer$ Player | Prevent$ True | T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigSacrifice | TriggerDescription$ At the beginning of each end step, each player sacrifices a permanent unless they discard a card. SVar:TrigSacrifice:DB$ RepeatEach | RepeatSubAbility$ DBSac | RepeatPlayers$ Player SVar:DBSac:DB$ Sacrifice | SacValid$ Permanent | Defined$ Player.IsRemembered | UnlessCost$ Discard<1/Card> | UnlessPayer$ Remembered -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/possessed_portal.jpg Oracle:If a player would draw a card, that player skips that draw instead.\nAt the beginning of each end step, each player sacrifices a permanent unless they discard a card. diff --git a/forge-gui/res/cardsfolder/p/postmortem_lunge.txt b/forge-gui/res/cardsfolder/p/postmortem_lunge.txt index 6d66dd5e2ad..71c99472d0e 100644 --- a/forge-gui/res/cardsfolder/p/postmortem_lunge.txt +++ b/forge-gui/res/cardsfolder/p/postmortem_lunge.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ ChangeZone | Cost$ X PB | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouOwn | TgtPromp$ Choose target creature with CMC equal to X. | References$ X | SubAbility$ DBHaste | AILogic$ BeforeCombat | SpellDescription$ Return target creature card with converted mana cost X from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step. SVar:DBHaste:DB$ Animate | Defined$ Targeted | Keywords$ Haste | Permanent$ True | AtEOT$ Exile SVar:X:Targeted$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/postmortem_lunge.jpg Oracle:({P/B} can be paid with either {B} or 2 life.)\nReturn target creature card with converted mana cost X from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/p/powder_keg.txt b/forge-gui/res/cardsfolder/p/powder_keg.txt index f242e735898..788d8a6c3de 100644 --- a/forge-gui/res/cardsfolder/p/powder_keg.txt +++ b/forge-gui/res/cardsfolder/p/powder_keg.txt @@ -5,6 +5,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | O SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ FUSE | CounterNum$ 1 A:AB$ DestroyAll | Cost$ T Sac<1/CARDNAME> | ValidCards$ Artifact.cmcEQX,Creature.cmcEQX | References$ X | SpellDescription$ Destroy each artifact and creature with converted mana cost equal to the number of fuse counters on CARDNAME. SVar:X:Count$CardCounters.FUSE -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/powder_keg.jpg Oracle:At the beginning of your upkeep, you may put a fuse counter on Powder Keg.\n{T}, Sacrifice Powder Keg: Destroy each artifact and creature with converted mana cost equal to the number of fuse counters on Powder Keg. diff --git a/forge-gui/res/cardsfolder/p/power_armor.txt b/forge-gui/res/cardsfolder/p/power_armor.txt index 04668331aea..474cbd1a62f 100644 --- a/forge-gui/res/cardsfolder/p/power_armor.txt +++ b/forge-gui/res/cardsfolder/p/power_armor.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ Pump | Cost$ 3 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | NumDef$ +X | References$ X | PrecostDesc$ Domain — | SpellDescription$ Target creature gets +1/+1 until end of turn for each basic land type among lands you control. SVar:X:Count$Domain SVar:BuffedBy:Plains,Island,Swamp,Mountain,Forest -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/power_armor.jpg Oracle:Domain — {3}, {T}: Target creature gets +1/+1 until end of turn for each basic land type among lands you control. diff --git a/forge-gui/res/cardsfolder/p/power_artifact.txt b/forge-gui/res/cardsfolder/p/power_artifact.txt index 39af3df1cc2..d95ffe6b2b7 100644 --- a/forge-gui/res/cardsfolder/p/power_artifact.txt +++ b/forge-gui/res/cardsfolder/p/power_artifact.txt @@ -4,6 +4,6 @@ Types:Enchantment Aura K:Enchant artifact S:Mode$ ReduceCost | ValidCard$ Artifact.EnchantedBy | Type$ Ability | Amount$ 2 | MinMana$ 1 | Description$ Enchanted artifact's activated abilities cost {2} less to activate. This effect can't reduce the amount of mana an ability costs to activate to less than one mana. A:SP$ Attach | Cost$ U U | ValidTgts$ Artifact | AILogic$ Pump -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/power_artifact.jpg Oracle:Enchant artifact\nEnchanted artifact's activated abilities cost {2} less to activate. This effect can't reduce the amount of mana an ability costs to activate to less than one mana. diff --git a/forge-gui/res/cardsfolder/p/power_surge.txt b/forge-gui/res/cardsfolder/p/power_surge.txt index b85fa8b29ce..61ded589035 100644 --- a/forge-gui/res/cardsfolder/p/power_surge.txt +++ b/forge-gui/res/cardsfolder/p/power_surge.txt @@ -6,6 +6,6 @@ SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredPlayer | NumDmg$ X | Referenc SVar:X:TriggeredPlayer$NumPowerSurgeLands S:Mode$ Continuous | Affected$ Land | AddSVar$ AITap SVar:AITap:SVar:AITapDown:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/power_surge.jpg Oracle:At the beginning of each player's upkeep, Power Surge deals X damage to that player, where X is the number of untapped lands they controlled at the beginning of this turn. diff --git a/forge-gui/res/cardsfolder/p/powerleech.txt b/forge-gui/res/cardsfolder/p/powerleech.txt index fbd09e41189..c1938356d9c 100644 --- a/forge-gui/res/cardsfolder/p/powerleech.txt +++ b/forge-gui/res/cardsfolder/p/powerleech.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ AbilityCast | NonTapCost$ True | ValidCard$ Artifact | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigGain | TriggerDescription$ Whenever an artifact an opponent controls becomes tapped or an opponent activates an artifact's ability without {T} in its activation cost, you gain 1 life. T:Mode$ Taps | ValidCard$ Artifact.OppCtrl | TriggerZones$ Battlefield | Execute$ TrigGain | Secondary$ True | TriggerDescription$ Whenever an artifact an opponent controls becomes tapped or an opponent activates an artifact's ability without {T} in its activation cost, you gain 1 life. SVar:TrigGain:DB$ GainLife | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/powerleech.jpg Oracle:Whenever an artifact an opponent controls becomes tapped or an opponent activates an artifact's ability without {T} in its activation cost, you gain 1 life. diff --git a/forge-gui/res/cardsfolder/p/powerstone_minefield.txt b/forge-gui/res/cardsfolder/p/powerstone_minefield.txt index cf64d69912c..eeeba5b68b7 100644 --- a/forge-gui/res/cardsfolder/p/powerstone_minefield.txt +++ b/forge-gui/res/cardsfolder/p/powerstone_minefield.txt @@ -5,6 +5,6 @@ T:Mode$ Attacks | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ Tri T:Mode$ Blocks | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigDamage2 | Secondary$ True | TriggerDescription$ Whenever a creature attacks or blocks, CARDNAME deals 2 damage to it. SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredAttackerLKICopy | NumDmg$ 2 SVar:TrigDamage2:DB$DealDamage | Defined$ TriggeredBlockerLKICopy | NumDmg$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/powerstone_minefield.jpg Oracle:Whenever a creature attacks or blocks, Powerstone Minefield deals 2 damage to it. diff --git a/forge-gui/res/cardsfolder/p/pox.txt b/forge-gui/res/cardsfolder/p/pox.txt index 284c4e5da09..9165599809f 100644 --- a/forge-gui/res/cardsfolder/p/pox.txt +++ b/forge-gui/res/cardsfolder/p/pox.txt @@ -10,6 +10,6 @@ SVar:A:PlayerCountRemembered$LifeTotal/ThirdUp SVar:C:PlayerCountRemembered$CardsInHand/ThirdUp SVar:E:PlayerCountRemembered$Valid Creature.RememberedPlayerCtrl/ThirdUp SVar:G:PlayerCountRemembered$Valid Land.RememberedPlayerCtrl/ThirdUp -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/pox.jpg Oracle:Each player loses a third of their life, then discards a third of the cards in their hand, then sacrifices a third of the creatures they control, then sacrifices a third of the lands they control. Round up each time. diff --git a/forge-gui/res/cardsfolder/p/praetors_grasp.txt b/forge-gui/res/cardsfolder/p/praetors_grasp.txt index 0a247adc45a..fafb23cd890 100644 --- a/forge-gui/res/cardsfolder/p/praetors_grasp.txt +++ b/forge-gui/res/cardsfolder/p/praetors_grasp.txt @@ -7,6 +7,6 @@ SVar:STPlay:Mode$ Continuous | MayLookAt$ You | MayPlay$ True | EffectZone$ Comm SVar:TrigCleanup:Mode$ ChangesZone | ValidCard$ Card.IsRemembered | Origin$ Exile | Destination$ Any | TriggerZones$ Command | Execute$ DBExileSelf | Static$ True SVar:DBExileSelf:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/praetors_grasp.jpg Oracle:Search target opponent's library for a card and exile it face down. Then that player shuffles their library. You may look at and play that card for as long as it remains exiled. diff --git a/forge-gui/res/cardsfolder/p/prakhata_pillar-bug.txt b/forge-gui/res/cardsfolder/p/prakhata_pillar-bug.txt index a5584791127..bcb6e602b1f 100644 --- a/forge-gui/res/cardsfolder/p/prakhata_pillar-bug.txt +++ b/forge-gui/res/cardsfolder/p/prakhata_pillar-bug.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact Creature Insect PT:2/3 A:AB$ Pump | Cost$ B | KW$ Lifelink | Defined$ Self | SpellDescription$ CARDNAME gains lifelink until end of turn. (Damage dealt by this creature also causes you to gain that much life.) -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/prakhata_pillar_bug.jpg Oracle:{B}: Prakhata Pillar-Bug gains lifelink until end of turn. (Damage dealt by this creature also causes you to gain that much life.) diff --git a/forge-gui/res/cardsfolder/p/precognition.txt b/forge-gui/res/cardsfolder/p/precognition.txt index 7d33136b5f8..58c340da185 100644 --- a/forge-gui/res/cardsfolder/p/precognition.txt +++ b/forge-gui/res/cardsfolder/p/precognition.txt @@ -3,6 +3,6 @@ ManaCost:4 U Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDig | TriggerDescription$ At the beginning of your upkeep, you may look at the top card of target opponent's library. If you do, you may put that card on the bottom of that player's library. SVar:TrigDig:DB$ Dig | ValidTgts$ Opponent | DigNum$ 1 | AnyNumber$ True | DestinationZone$ Library | LibraryPosition2$ 0 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/precognition.jpg Oracle:At the beginning of your upkeep, you may look at the top card of target opponent's library. If you do, you may put that card on the bottom of that player's library. diff --git a/forge-gui/res/cardsfolder/p/predict.txt b/forge-gui/res/cardsfolder/p/predict.txt index e83b3fc3ef6..813bbe70fd6 100644 --- a/forge-gui/res/cardsfolder/p/predict.txt +++ b/forge-gui/res/cardsfolder/p/predict.txt @@ -6,6 +6,6 @@ SVar:DBMill:DB$ Mill | ValidTgts$ Player | TgtPrompt$ Select target player | Num SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ X | References$ X | SubAbility$ DBDraw2 SVar:DBDraw2:DB$ Draw | Defined$ You | NumCards$ 1 SVar:X:Remembered$Valid Card.NamedCard -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/predict.jpg Oracle:Choose a card name, then target player puts the top card of their library into their graveyard. If that card has the chosen name, you draw two cards. Otherwise, you draw a card. diff --git a/forge-gui/res/cardsfolder/p/presence_of_the_master.txt b/forge-gui/res/cardsfolder/p/presence_of_the_master.txt index 3db67e08a4f..536a9fc9a78 100644 --- a/forge-gui/res/cardsfolder/p/presence_of_the_master.txt +++ b/forge-gui/res/cardsfolder/p/presence_of_the_master.txt @@ -4,7 +4,7 @@ Types:Enchantment T:Mode$ SpellCast | ValidCard$ Enchantment | TriggerZones$ Battlefield | Execute$ TrigCounter | TriggerDescription$ Whenever a player casts an enchantment spell, counter it. SVar:TrigCounter:DB$Counter | Defined$ TriggeredSpellAbility SVar:AICurseEffect:CounterEnchantment -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/presence_of_the_master.jpg Oracle:Whenever a player casts an enchantment spell, counter it. diff --git a/forge-gui/res/cardsfolder/p/price_of_glory.txt b/forge-gui/res/cardsfolder/p/price_of_glory.txt index 6dcaa9a72bd..230bab03d29 100644 --- a/forge-gui/res/cardsfolder/p/price_of_glory.txt +++ b/forge-gui/res/cardsfolder/p/price_of_glory.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ TapsForMana | ValidCard$ Land | Execute$ TrigDestroy | TriggerZones$ Battlefield | Activator$ Player.NonActive | TriggerDescription$ Whenever a player taps a land for mana, if it's not that player's turn, destroy that land. SVar:TrigDestroy:DB$ Destroy | Defined$ TriggeredCard SVar:AICurseEffect:NonActive -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/price_of_glory.jpg Oracle:Whenever a player taps a land for mana, if it's not that player's turn, destroy that land. diff --git a/forge-gui/res/cardsfolder/p/price_of_progress.txt b/forge-gui/res/cardsfolder/p/price_of_progress.txt index ef1b26d3892..3e75ebb26b3 100644 --- a/forge-gui/res/cardsfolder/p/price_of_progress.txt +++ b/forge-gui/res/cardsfolder/p/price_of_progress.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ RepeatEach | Cost$ 1 R | RepeatPlayers$ Player | RepeatSubAbility$ DBDamage | DamageMap$ True | AILogic$ PriceOfProgress | SpellDescription$ CARDNAME deals 2 damage to each player for each nonbasic land they control. SVar:DBDamage:DB$ DealDamage | Defined$ Remembered | NumDmg$ X | References$ X SVar:X:Count$Valid Land.nonBasic+RememberedPlayerCtrl/Times.2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/price_of_progress.jpg Oracle:Price of Progress deals damage to each player equal to twice the number of nonbasic lands that player controls. diff --git a/forge-gui/res/cardsfolder/p/priest_of_yawgmoth.txt b/forge-gui/res/cardsfolder/p/priest_of_yawgmoth.txt index 16eeed9301b..87bedcfbc33 100644 --- a/forge-gui/res/cardsfolder/p/priest_of_yawgmoth.txt +++ b/forge-gui/res/cardsfolder/p/priest_of_yawgmoth.txt @@ -4,6 +4,6 @@ Types:Creature Human Cleric PT:1/2 A:AB$ Mana | Cost$ T Sac<1/Artifact> | Produced$ B | Amount$ X | References$ X | SpellDescription$ Add an amount of black mana equal to the sacrificed artifact's converted mana cost. SVar:X:Sacrificed$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/priest_of_yawgmoth.jpg Oracle:{T}, Sacrifice an artifact: Add an amount of {B} equal to the sacrificed artifact's converted mana cost. diff --git a/forge-gui/res/cardsfolder/p/primal_beyond.txt b/forge-gui/res/cardsfolder/p/primal_beyond.txt index 2eb532e34ec..ceb54b8d6a0 100644 --- a/forge-gui/res/cardsfolder/p/primal_beyond.txt +++ b/forge-gui/res/cardsfolder/p/primal_beyond.txt @@ -5,6 +5,6 @@ A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ T | Produced$ Any | RestrictValid$ Card.Elemental,Activated.Elemental | SpellDescription$ Add one mana of any color. Spend this mana only to cast an Elemental spell or activate an ability of an Elemental. K:ETBReplacement:Other:DBTap SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ Reveal<1/Elemental> | UnlessPayer$ You | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may reveal an Elemental card from your hand. If you don't, CARDNAME enters the battlefield tapped. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/primal_beyond.jpg Oracle:As Primal Beyond enters the battlefield, you may reveal an Elemental card from your hand. If you don't, Primal Beyond enters the battlefield tapped.\n{T}: Add {C}.\n{T}: Add one mana of any color. Spend this mana only to cast an Elemental spell or activate an ability of an Elemental. diff --git a/forge-gui/res/cardsfolder/p/primal_clay.txt b/forge-gui/res/cardsfolder/p/primal_clay.txt index 9c76d84532f..5f149ce3b5b 100644 --- a/forge-gui/res/cardsfolder/p/primal_clay.txt +++ b/forge-gui/res/cardsfolder/p/primal_clay.txt @@ -7,6 +7,6 @@ SVar:MoldChoice:DB$ GenericChoice | Defined$ You | Choices$ GroundMold,AirMold,W SVar:GroundMold:DB$ Animate | Defined$ Self | Permanent$ True | Power$ 3 | Toughness$ 3 | SpellDescription$ CARDNAME is 3/3 SVar:AirMold:DB$ Animate | Defined$ Self | Permanent$ True | Power$ 2 | Toughness$ 2 | Keywords$ Flying | SpellDescription$ CARDNAME is 2/2 with flying SVar:WallMold:DB$ Animate | Defined$ Self | Permanent$ True | Power$ 1 | Toughness$ 6 | Types$ Wall | Keywords$ Defender | SpellDescription$ CARDNAME is 1/6 with defender and is a wall in addition to its other types -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://resources.wizards.com/magic/cards/4e/en-us/card2065.jpg Oracle:As Primal Clay enters the battlefield, it becomes your choice of a 3/3 artifact creature, a 2/2 artifact creature with flying, or a 1/6 Wall artifact creature with defender in addition to its other types. (A creature with defender can't attack.) diff --git a/forge-gui/res/cardsfolder/p/primal_cocoon.txt b/forge-gui/res/cardsfolder/p/primal_cocoon.txt index ff34ad731ae..b82d442fd39 100644 --- a/forge-gui/res/cardsfolder/p/primal_cocoon.txt +++ b/forge-gui/res/cardsfolder/p/primal_cocoon.txt @@ -8,6 +8,6 @@ SVar:TrigPutCounter:DB$ PutCounter | Defined$ Enchanted | CounterType$ P1P1 | Co T:Mode$ Attacks | ValidCard$ Card.AttachedBy | Execute$ TrigSac | TriggerDescription$ When enchanted creature attacks or blocks, sacrifice Primal Cocoon. T:Mode$ Blocks | ValidCard$ Card.AttachedBy | Execute$ TrigSac | Secondary$ True | TriggerDescription$ When enchanted creature attacks or blocks, sacrifice Primal Cocoon. SVar:TrigSac:DB$ Sacrifice | Defined$ Self -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/primal_cocoon.jpg Oracle:Enchant creature\nAt the beginning of your upkeep, put a +1/+1 counter on enchanted creature.\nWhen enchanted creature attacks or blocks, sacrifice Primal Cocoon. diff --git a/forge-gui/res/cardsfolder/p/primal_order.txt b/forge-gui/res/cardsfolder/p/primal_order.txt index 8cd21383fce..11813a0f288 100644 --- a/forge-gui/res/cardsfolder/p/primal_order.txt +++ b/forge-gui/res/cardsfolder/p/primal_order.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of each player's upkeep, CARDNAME deals damage to that player equal to the number of nonbasic lands they control. SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredPlayer | NumDmg$ X | References$ X SVar:X:Count$Valid Land.nonBasic+ActivePlayerCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/primal_order.jpg Oracle:At the beginning of each player's upkeep, Primal Order deals damage to that player equal to the number of nonbasic lands they control. diff --git a/forge-gui/res/cardsfolder/p/primal_plasma.txt b/forge-gui/res/cardsfolder/p/primal_plasma.txt index 6729fe60a60..dca9c1b421d 100644 --- a/forge-gui/res/cardsfolder/p/primal_plasma.txt +++ b/forge-gui/res/cardsfolder/p/primal_plasma.txt @@ -8,6 +8,6 @@ SVar:GroundPlasma:DB$ Animate | Defined$ Self | Permanent$ True | Power$ 3 | Tou SVar:AirPlasma:DB$ Animate | Defined$ Self | Permanent$ True | Power$ 2 | Toughness$ 2 | Keywords$ Flying | SpellDescription$ CARDNAME is 2/2 with flying | SubAbility$ DBMove SVar:WallPlasma:DB$ Animate | Defined$ Self | Permanent$ True | Power$ 1 | Toughness$ 6 | Keywords$ Defender | SpellDescription$ CARDNAME is 1/6 with defender | SubAbility$ DBMove SVar:DBMove:DB$ ChangeZone | Defined$ ReplacedCard | Origin$ All | Destination$ Battlefield -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://resources.wizards.com/magic/cards/plc/en-us/card124757.jpg Oracle:As Primal Plasma enters the battlefield, it becomes your choice of a 3/3 creature, a 2/2 creature with flying, or a 1/6 creature with defender. diff --git a/forge-gui/res/cardsfolder/p/primal_whisperer.txt b/forge-gui/res/cardsfolder/p/primal_whisperer.txt index cbaa025ed21..a3d879f8a17 100644 --- a/forge-gui/res/cardsfolder/p/primal_whisperer.txt +++ b/forge-gui/res/cardsfolder/p/primal_whisperer.txt @@ -5,6 +5,6 @@ PT:2/2 K:Morph:3 G S:Mode$ Continuous | Affected$ Card.Self+faceUp | AddPower$ X | AddToughness$ X | References$ X | Description$ CARDNAME gets +2/+2 for each face-down creature on the battlefield. SVar:X:Count$Valid Creature.faceDown/Times.2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/primal_whisperer.jpg Oracle:Primal Whisperer gets +2/+2 for each face-down creature on the battlefield.\nMorph {3}{G} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) diff --git a/forge-gui/res/cardsfolder/p/primordial_mist.txt b/forge-gui/res/cardsfolder/p/primordial_mist.txt index 3f626ac5b1d..0c5e16185f3 100644 --- a/forge-gui/res/cardsfolder/p/primordial_mist.txt +++ b/forge-gui/res/cardsfolder/p/primordial_mist.txt @@ -5,5 +5,5 @@ T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefiel SVar:TrigManifest:DB$ Manifest | Amount$ 1 | Defined$ TopOfLibrary A:AB$ Effect | Cost$ Exile<1/Permanent.faceDown>| RememberObjects$ ExiledCards | StaticAbilities$ Play | SubAbility$ DBCleanup | ExileOnMoved$ Exile | SpellDescription$ Exile a face-down permanent you control face up: You may play that card this turn. (You still pay its costs. Timing rules still apply.) SVar:Play:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may play remembered card. -SVar:RemAIDeck:True +AI:RemoveDeck:All Oracle:At the beginning of your end step, you may manifest the top card of your library. (Put it onto the battlefield face down as a 2/2 creature. Turn it face up any time for its mana cost if it's a creature card.)\nExile a face-down permanent you control face up: You may play that card this turn. (You still pay its costs. Timing rules still apply.) diff --git a/forge-gui/res/cardsfolder/p/primordial_ooze.txt b/forge-gui/res/cardsfolder/p/primordial_ooze.txt index e0aee358214..0fc931b6052 100644 --- a/forge-gui/res/cardsfolder/p/primordial_ooze.txt +++ b/forge-gui/res/cardsfolder/p/primordial_ooze.txt @@ -11,6 +11,6 @@ SVar:DBDmg:DB$ DealDamage | NumDmg$ X | Defined$ You | References$ X | Condition SVar:DBReset:DB$ StoreSVar | SVar$ PrimordialPaid | Type$ Number | Expression$ 0 SVar:X:Count$CardCounters.P1P1 SVar:PrimordialPaid:Number$0 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/primordial_ooze.jpg Oracle:Primordial Ooze attacks each combat if able.\nAt the beginning of your upkeep, put a +1/+1 counter on Primordial Ooze. Then you may pay {X}, where X is the number of +1/+1 counters on it. If you don't, tap Primordial Ooze and it deals X damage to you. diff --git a/forge-gui/res/cardsfolder/p/prism_array.txt b/forge-gui/res/cardsfolder/p/prism_array.txt index 7695a7dcf74..040df3dbbdc 100644 --- a/forge-gui/res/cardsfolder/p/prism_array.txt +++ b/forge-gui/res/cardsfolder/p/prism_array.txt @@ -5,6 +5,6 @@ K:etbCounter:CRYSTAL:X:no Condition:Converge — CARDNAME enters the battlfield SVar:X:Count$Converge A:AB$ Tap | Cost$ SubCounter<1/CRYSTAL> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. A:AB$ Scry | Cost$ W U B R G | ScryNum$ 3 |SpellDescription$ Scry 3. (Look at the top three cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/prism_array.jpg Oracle:Converge — Prism Array enters the battlfield with a crystal counter on it for each color of mana spent to cast it.\nRemove a crystal counter from Prism Array: Tap target creature.\n{W}{U}{B}{R}{G}: Scry 3. (Look at the top three cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) diff --git a/forge-gui/res/cardsfolder/p/prismatic_circle.txt b/forge-gui/res/cardsfolder/p/prismatic_circle.txt index 504023244f6..da5cc6ebac0 100644 --- a/forge-gui/res/cardsfolder/p/prismatic_circle.txt +++ b/forge-gui/res/cardsfolder/p/prismatic_circle.txt @@ -9,6 +9,6 @@ SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPreventNextFromSource | SVars$ R SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.ChosenCard+ChosenColorSource | ValidTarget$ You | ReplaceWith$ ExileEffect | PreventionEffect$ True | Description$ The next time the chosen source deals damage to you, prevent that damage. SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/prismatic_circle.jpg Oracle:Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nAs Prismatic Circle enters the battlefield, choose a color.\n{1}: The next time a source of your choice of the chosen color would deal damage to you this turn, prevent that damage. diff --git a/forge-gui/res/cardsfolder/p/prismatic_lace.txt b/forge-gui/res/cardsfolder/p/prismatic_lace.txt index 2937bb39f87..9bddfd020e4 100644 --- a/forge-gui/res/cardsfolder/p/prismatic_lace.txt +++ b/forge-gui/res/cardsfolder/p/prismatic_lace.txt @@ -3,7 +3,7 @@ ManaCost:U Types:Instant A:SP$ ChooseColor | Cost$ U | Defined$ You | OrColors$ True | SubAbility$ Animate | SpellDescription$ Target permanent becomes the color or colors of your choice. (This effect lasts indefinitely.) SVar:Animate:DB$ Animate | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Colors$ ChosenColor | OverwriteColors$ True | Permanent$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/prismatic_lace.jpg Oracle:Target permanent becomes the color or colors of your choice. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/p/prismatic_lens.txt b/forge-gui/res/cardsfolder/p/prismatic_lens.txt index 4356bafda10..ceada1745a0 100644 --- a/forge-gui/res/cardsfolder/p/prismatic_lens.txt +++ b/forge-gui/res/cardsfolder/p/prismatic_lens.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ 1 T | Produced$ Any | SpellDescription$ Add one mana of any color. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/prismatic_lens.jpg Oracle:{T}: Add {C}.\n{1}, {T}: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/p/prismatic_omen.txt b/forge-gui/res/cardsfolder/p/prismatic_omen.txt index 98d2f880fb4..02cd4e11fcb 100644 --- a/forge-gui/res/cardsfolder/p/prismatic_omen.txt +++ b/forge-gui/res/cardsfolder/p/prismatic_omen.txt @@ -3,6 +3,6 @@ ManaCost:1 G Types:Enchantment S:Mode$ Continuous | Affected$ Land.YouCtrl | AddType$ Plains & Island & Swamp & Mountain & Forest | Description$ Lands you control are every basic land type in addition to their other types. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/prismatic_omen.jpg Oracle:Lands you control are every basic land type in addition to their other types. diff --git a/forge-gui/res/cardsfolder/p/prismatic_strands.txt b/forge-gui/res/cardsfolder/p/prismatic_strands.txt index c2afd51e403..6e58671a909 100644 --- a/forge-gui/res/cardsfolder/p/prismatic_strands.txt +++ b/forge-gui/res/cardsfolder/p/prismatic_strands.txt @@ -5,6 +5,6 @@ K:Flashback:tapXType<1/Creature.White/white creature> A:SP$ ChooseColor | Cost$ 2 W | Defined$ You | AILogic$ MostProminentInHumanDeck | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | Name$ Prismatic Strands Effect | ReplacementEffects$ RPrevent | SpellDescription$ Prevent all damage that sources of the color of your choice would deal this turn. SVar:RPrevent:Event$ DamageDone | Prevent$ True | ActiveZones$ Command | ValidSource$ Card.ChosenColor | Description$ Prevent all damage that sources of the chosen color would deal this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/prismatic_strands.jpg Oracle:Prevent all damage that sources of the color of your choice would deal this turn.\nFlashback—Tap an untapped white creature you control. (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/p/prismwake_merrow.txt b/forge-gui/res/cardsfolder/p/prismwake_merrow.txt index 39c915d3f51..095fbcefa16 100644 --- a/forge-gui/res/cardsfolder/p/prismwake_merrow.txt +++ b/forge-gui/res/cardsfolder/p/prismwake_merrow.txt @@ -6,6 +6,6 @@ K:Flash T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChooseColor | TriggerDescription$ When CARDNAME enters the battlefield, target permanent becomes the color or colors of your choice until end of turn. SVar:TrigChooseColor:DB$ ChooseColor | Defined$ You | OrColors$ True | SubAbility$ Animate SVar:Animate:DB$ Animate | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Colors$ ChosenColor | OverwriteColors$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/prismwake_merrow.jpg Oracle:Flash\nWhen Prismwake Merrow enters the battlefield, target permanent becomes the color or colors of your choice until end of turn. diff --git a/forge-gui/res/cardsfolder/p/proclamation_of_rebirth.txt b/forge-gui/res/cardsfolder/p/proclamation_of_rebirth.txt index 3b4e4ad9e1a..2c8bd174461 100644 --- a/forge-gui/res/cardsfolder/p/proclamation_of_rebirth.txt +++ b/forge-gui/res/cardsfolder/p/proclamation_of_rebirth.txt @@ -3,6 +3,6 @@ ManaCost:2 W Types:Sorcery A:SP$ ChangeZone | Cost$ 2 W | TargetMin$ 0 | TargetMax$ 3 | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature card with converted mana cost 1 or less in your graveyard | ValidTgts$ Creature.cmcLE1+YouCtrl | SpellDescription$ Return up to three target creature cards with converted mana cost 1 or less from your graveyard to the battlefield. A:AB$ ChangeZone | Cost$ 5 W | ActivationZone$ Hand | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature card with converted mana cost 1 or less in your graveyard | ValidTgts$ Creature.cmcLE1+YouCtrl | ActivationLimit$ 1 | PlayerTurn$ True | ActivationPhases$ Upkeep | PrecostDesc$ Forecast — | CostDesc$ {5}{W}, Reveal CARDNAME from your hand: | SpellDescription$ Return target creature card with converted mana cost 1 or less from your graveyard to the battlefield. (Activate this ability only during your upkeep and only once each turn.) -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/proclamation_of_rebirth.jpg Oracle:Return up to three target creature cards with converted mana cost 1 or less from your graveyard to the battlefield.\nForecast — {5}{W}, Reveal Proclamation of Rebirth from your hand: Return target creature card with converted mana cost 1 or less from your graveyard to the battlefield. (Activate this ability only during your upkeep and only once each turn.) diff --git a/forge-gui/res/cardsfolder/p/profane_command.txt b/forge-gui/res/cardsfolder/p/profane_command.txt index 473c5909f5b..ce6bd0aaac3 100644 --- a/forge-gui/res/cardsfolder/p/profane_command.txt +++ b/forge-gui/res/cardsfolder/p/profane_command.txt @@ -8,6 +8,6 @@ SVar:DBWeaken:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature SVar:DBSearch:DB$ Pump | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ X | KW$ Fear | References$ X | TgtPrompt$ Select target creature to gain Fear | SpellDescription$ Up to X target creatures gain fear until end of turn. (They can't be blocked except by artifact creatures and/or black creatures.) SVar:X:Count$xPaid #X Will get overwritten by Announce -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/profane_command.jpg Oracle:Choose two —\n• Target player loses X life.\n• Return target creature card with converted mana cost X or less from your graveyard to the battlefield.\n• Target creature gets -X/-X until end of turn.\n• Up to X target creatures gain fear until end of turn. (They can't be blocked except by artifact creatures and/or black creatures.) diff --git a/forge-gui/res/cardsfolder/p/profane_prayers.txt b/forge-gui/res/cardsfolder/p/profane_prayers.txt index 54accc586c7..f0d02e78735 100644 --- a/forge-gui/res/cardsfolder/p/profane_prayers.txt +++ b/forge-gui/res/cardsfolder/p/profane_prayers.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ DealDamage | Cost$ 2 B B | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X | SubAbility$ DBGainLife | SpellDescription$ Profane Prayers deals X damage to any target and you gain X life, where X is the number of Clerics on the battlefield. SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ X | References$ X SVar:X:Count$TypeOnBattlefield.Cleric -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/profane_prayers.jpg Oracle:Profane Prayers deals X damage to any target and you gain X life, where X is the number of Clerics on the battlefield. diff --git a/forge-gui/res/cardsfolder/p/profaner_of_the_dead.txt b/forge-gui/res/cardsfolder/p/profaner_of_the_dead.txt index b42e091c8bc..fc83348252d 100644 --- a/forge-gui/res/cardsfolder/p/profaner_of_the_dead.txt +++ b/forge-gui/res/cardsfolder/p/profaner_of_the_dead.txt @@ -6,6 +6,6 @@ K:Exploit T:Mode$ Exploited | ValidCard$ Creature | ValidSource$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigChangeZoneAll | TriggerDescription$ When CARDNAME exploits a creature, return to their owners' hands all creatures your opponents control with toughness less than the exploited creature's toughness. SVar:TrigChangeZoneAll:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Hand | ChangeType$ Creature.toughnessLTX+OppCtrl | References$ X | AbilityCount$ X SVar:X:TriggeredExploited$CardToughness -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/profaner_of_the_dead.jpg Oracle:Exploit (When this creature enters the battlefield, you may sacrifice a creature.)\nWhen Profaner of the Dead exploits a creature, return to their owners' hands all creatures your opponents control with toughness less than the exploited creature's toughness. diff --git a/forge-gui/res/cardsfolder/p/prohibit.txt b/forge-gui/res/cardsfolder/p/prohibit.txt index df6cc992c7a..dbb50bbe2c8 100644 --- a/forge-gui/res/cardsfolder/p/prohibit.txt +++ b/forge-gui/res/cardsfolder/p/prohibit.txt @@ -5,6 +5,6 @@ K:Kicker:2 A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | ValidTgts$ Card | ConditionCheckSVar$ Y | ConditionSVarCompare$ LEX | References$ X,Y | SpellDescription$ Counter target spell if its converted mana cost is 2 or less. If CARDNAME was kicked, counter that spell if its converted mana cost is 4 or less instead. SVar:X:Count$Kicked.4.2 SVar:Y:Targeted$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/prohibit.jpg Oracle:Kicker {2} (You may pay an additional {2} as you cast this spell.)\nCounter target spell if its converted mana cost is 2 or less. If Prohibit was kicked, counter that spell if its converted mana cost is 4 or less instead. diff --git a/forge-gui/res/cardsfolder/p/promise_of_power.txt b/forge-gui/res/cardsfolder/p/promise_of_power.txt index 22b54653b47..80626298a5b 100644 --- a/forge-gui/res/cardsfolder/p/promise_of_power.txt +++ b/forge-gui/res/cardsfolder/p/promise_of_power.txt @@ -7,6 +7,6 @@ SVar:DBDraw:DB$ Draw | NumCards$ 5 | SpellDescription$ You draw five cards and y SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 5 SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenName$ Demon | TokenTypes$ Creature,Demon | TokenOwner$ You | TokenColors$ Black | TokenKeywords$ Flying | TokenPower$ X | TokenToughness$ X | References$ X | SpellDescription$ Create an X/X black Demon creature token with flying, where X is the number of cards in your hand. SVar:X:Count$NumCardsInYourHand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/promise_of_power.jpg Oracle:Choose one —\n• You draw five cards and you lose 5 life.\n• Create an X/X black Demon creature token with flying, where X is the number of cards in your hand.\nEntwine {4} (Choose both if you pay the entwine cost.) diff --git a/forge-gui/res/cardsfolder/p/prophetic_prism.txt b/forge-gui/res/cardsfolder/p/prophetic_prism.txt index 0b3748db2d0..906d119c814 100644 --- a/forge-gui/res/cardsfolder/p/prophetic_prism.txt +++ b/forge-gui/res/cardsfolder/p/prophetic_prism.txt @@ -4,6 +4,6 @@ Types:Artifact T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 A:AB$ Mana | Cost$ 1 T | Produced$ Any | SpellDescription$ Add one mana of any color. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/prophetic_prism.jpg Oracle:When Prophetic Prism enters the battlefield, draw a card.\n{1}, {T}: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/p/prophetic_ravings.txt b/forge-gui/res/cardsfolder/p/prophetic_ravings.txt index 09870879ea9..2b8faa148fb 100644 --- a/forge-gui/res/cardsfolder/p/prophetic_ravings.txt +++ b/forge-gui/res/cardsfolder/p/prophetic_ravings.txt @@ -6,6 +6,6 @@ A:SP$ Attach | Cost$ R | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Haste | AddAbility$ ProphetDraw | Description$ Enchanted creature has haste and "{T}, Discard a card: Draw a card." SVar:ProphetDraw:AB$ Draw | Cost$ T Discard<1/Card> | NumCards$ 1 | SpellDescription$ Draw a card. SVar:NonStackingAttachEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/prophetic_ravings.jpg Oracle:Enchant creature\nEnchanted creature has haste and "{T}, Discard a card: Draw a card." diff --git a/forge-gui/res/cardsfolder/p/prosperity.txt b/forge-gui/res/cardsfolder/p/prosperity.txt index 08b0846c708..633d14cf599 100644 --- a/forge-gui/res/cardsfolder/p/prosperity.txt +++ b/forge-gui/res/cardsfolder/p/prosperity.txt @@ -3,6 +3,6 @@ ManaCost:X U Types:Sorcery A:SP$ Draw | Cost$ X U | Defined$ Player | NumCards$ X | References$ X | SpellDescription$ Each player draws X cards. SVar:X:Count$xPaid -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/prosperity.jpg Oracle:Each player draws X cards. diff --git a/forge-gui/res/cardsfolder/p/protective_sphere.txt b/forge-gui/res/cardsfolder/p/protective_sphere.txt index feca31c7549..bdd6ae97947 100644 --- a/forge-gui/res/cardsfolder/p/protective_sphere.txt +++ b/forge-gui/res/cardsfolder/p/protective_sphere.txt @@ -5,7 +5,7 @@ A:AB$ ChooseSource | Cost$ 1 PayLife<1> | Choices$ Card.SharesColorWith Activati SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPrevent | RememberObjects$ Remembered | SubAbility$ DBCleanup | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup SVar:RPrevent:Event$ DamageDone | Prevent$ True | ActiveZones$ Command | ValidTarget$ You | ValidSource$ Card.IsRemembered | Description$ Prevent all damage that would be dealt to you by a source of your choice that shares a color with the mana spent on this activation cost. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/protective_sphere.jpg Oracle:{1}, Pay 1 life: Prevent all damage that would be dealt to you this turn by a source of your choice that shares a color with the mana spent on this activation cost. (Colorless mana prevents no damage.) diff --git a/forge-gui/res/cardsfolder/p/proteus_staff.txt b/forge-gui/res/cardsfolder/p/proteus_staff.txt index 382c77ab2a6..61ac6e7a2ba 100644 --- a/forge-gui/res/cardsfolder/p/proteus_staff.txt +++ b/forge-gui/res/cardsfolder/p/proteus_staff.txt @@ -3,8 +3,8 @@ ManaCost:3 Types:Artifact A:AB$ ChangeZone | Cost$ 2 U T | SorcerySpeed$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | AILogic$ Polymorph | Origin$ Battlefield | Destination$ Library | LibraryPosition$ -1 | SubAbility$ DBDigUntil | SpellDescription$ Put target creature on the bottom of its owner's library. That creature's controller reveals cards from the top of their library until they reveal a creature card. The player puts that card onto the battlefield and the rest on the bottom of their library in any order. Activate this ability only any time you could cast a sorcery. SVar:DBDigUntil:DB$ DigUntil | Defined$ TargetedController | Valid$ Creature | ValidDescription$ creature | FoundDestination$ Battlefield | RevealedDestination$ Library | RevealedLibraryPosition$ -1 -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random DeckNeeds:Color$Blue SVar:Picture:http://www.wizards.com/global/images/magic/general/proteus_staff.jpg Oracle:{2}{U}, {T}: Put target creature on the bottom of its owner's library. That creature's controller reveals cards from the top of their library until they reveal a creature card. The player puts that card onto the battlefield and the rest on the bottom of their library in any order. Activate this ability only any time you could cast a sorcery. diff --git a/forge-gui/res/cardsfolder/p/protomatter_powder.txt b/forge-gui/res/cardsfolder/p/protomatter_powder.txt index 524d9d970c3..ed885a0ac42 100644 --- a/forge-gui/res/cardsfolder/p/protomatter_powder.txt +++ b/forge-gui/res/cardsfolder/p/protomatter_powder.txt @@ -2,6 +2,6 @@ Name:Protomatter Powder ManaCost:2 U Types:Artifact A:AB$ ChangeZone | Cost$ 4 W T Sac<1/CARDNAME> | TgtPrompt$ Choose target artifact card in your graveyard | ValidTgts$ Artifact.YouCtrl | Origin$ Graveyard | Destination$ Battlefield | SpellDescription$ Return target artifact card from your graveyard to the battlefield. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/protomatter_powder.jpg Oracle:{4}{W}, {T}, Sacrifice Protomatter Powder: Return target artifact card from your graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/p/prototype_portal.txt b/forge-gui/res/cardsfolder/p/prototype_portal.txt index 51fa8e20ed1..76cb36611b5 100644 --- a/forge-gui/res/cardsfolder/p/prototype_portal.txt +++ b/forge-gui/res/cardsfolder/p/prototype_portal.txt @@ -11,6 +11,6 @@ T:Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Card.Self | Destination$ SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True SVar:NeedsToPlayVar:Z GE2 SVar:Z:Count$ValidHand Artifact.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/prototype_portal.jpg Oracle:Imprint — When Prototype Portal enters the battlefield, you may exile an artifact card from your hand.\n{X}, {T}: Create a token that's a copy of the exiled card. X is the converted mana cost of that card. diff --git a/forge-gui/res/cardsfolder/p/provoke.txt b/forge-gui/res/cardsfolder/p/provoke.txt index bdb037294c0..0fe2bcc79c7 100644 --- a/forge-gui/res/cardsfolder/p/provoke.txt +++ b/forge-gui/res/cardsfolder/p/provoke.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Pump | Cost$ 1 G | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Select target creature you don't control | KW$ HIDDEN CARDNAME blocks each combat if able. | IsCurse$ True | SubAbility$ DBUntap | SpellDescription$ Untap target creature you don't control. That creature blocks this turn if able. Draw a card. SVar:DBUntap:DB$Untap | Defined$ Targeted | SubAbility$ DBDraw SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/provoke.jpg Oracle:Untap target creature you don't control. That creature blocks this turn if able.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/p/prowess_of_the_fair.txt b/forge-gui/res/cardsfolder/p/prowess_of_the_fair.txt index 7cda8106eb8..f26f0d579c0 100644 --- a/forge-gui/res/cardsfolder/p/prowess_of_the_fair.txt +++ b/forge-gui/res/cardsfolder/p/prowess_of_the_fair.txt @@ -3,6 +3,6 @@ ManaCost:1 B Types:Tribal Enchantment Elf T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Elf.nonToken+Other+YouOwn | TriggerZones$ Battlefield | Execute$ TrigToken | OptionalDecider$ You | TriggerDescription$ Whenever another nontoken Elf is put into your graveyard from the battlefield, you may create a 1/1 green Elf Warrior creature token. SVar:TrigToken:DB$Token | TokenAmount$ 1 | TokenName$ Elf Warrior | TokenTypes$ Creature,Elf,Warrior | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/prowess_of_the_fair.jpg Oracle:Whenever another nontoken Elf is put into your graveyard from the battlefield, you may create a 1/1 green Elf Warrior creature token. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/p/psionic_entity.txt b/forge-gui/res/cardsfolder/p/psionic_entity.txt index f4aceaad7a5..0c26bd953b7 100644 --- a/forge-gui/res/cardsfolder/p/psionic_entity.txt +++ b/forge-gui/res/cardsfolder/p/psionic_entity.txt @@ -4,6 +4,6 @@ Types:Creature Illusion PT:2/2 A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 | SubAbility$ DB1 | SpellDescription$ CARDNAME deals 2 damage to any target and 3 damage to itself. SVar:DB1:DB$DealDamage | NumDmg$ 3 | Defined$ Self -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/psionic_entity.jpg Oracle:{T}: Psionic Entity deals 2 damage to any target and 3 damage to itself. diff --git a/forge-gui/res/cardsfolder/p/psychatog.txt b/forge-gui/res/cardsfolder/p/psychatog.txt index b8be269c82a..f22b8e2279f 100644 --- a/forge-gui/res/cardsfolder/p/psychatog.txt +++ b/forge-gui/res/cardsfolder/p/psychatog.txt @@ -4,6 +4,6 @@ Types:Creature Atog PT:1/2 A:AB$ Pump | Cost$ Discard<1/Card> | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. A:AB$ Pump | Cost$ ExileFromGrave<2/card> | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/psychatog.jpg Oracle:Discard a card: Psychatog gets +1/+1 until end of turn.\nExile two cards from your graveyard: Psychatog gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/p/psychic_allergy.txt b/forge-gui/res/cardsfolder/p/psychic_allergy.txt index 2c3c073c703..1a8f2b3935a 100644 --- a/forge-gui/res/cardsfolder/p/psychic_allergy.txt +++ b/forge-gui/res/cardsfolder/p/psychic_allergy.txt @@ -8,6 +8,6 @@ SVar:TrigDamageOpp:DB$ DealDamage | Defined$ TriggeredPlayer | NumDmg$ X | Refer SVar:X:Count$Valid Permanent.ActivePlayerCtrl+ChosenColor+nonToken T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ At the beginning of your upkeep, destroy CARDNAME unless you sacrifice two Islands. SVar:TrigDestroy:DB$ Destroy | Defined$ Self | UnlessPayer$ You | UnlessCost$ Sac<2/Island> -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/psychic_allergy.jpg Oracle:As Psychic Allergy enters the battlefield, choose a color.\nAt the beginning of each opponent's upkeep, Psychic Allergy deals X damage to that player, where X is the number of nontoken permanents of the chosen color they control.\nAt the beginning of your upkeep, destroy Psychic Allergy unless you sacrifice two Islands. diff --git a/forge-gui/res/cardsfolder/p/psychic_intrusion.txt b/forge-gui/res/cardsfolder/p/psychic_intrusion.txt index a1c49eb9c5f..fd16b080671 100644 --- a/forge-gui/res/cardsfolder/p/psychic_intrusion.txt +++ b/forge-gui/res/cardsfolder/p/psychic_intrusion.txt @@ -7,6 +7,6 @@ SVar:STPlay:Mode$ Continuous | MayPlay$ True | MayPlayIgnoreColor$ True | Effect SVar:TriggerCastPI: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:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/psychic_intrusion.jpg Oracle:Target opponent reveals their hand. You choose a nonland card from that player's graveyard or hand and exile it. You may cast that card for as long as it remains exiled, and you may spend mana as though it were mana of any color to cast that spell. diff --git a/forge-gui/res/cardsfolder/p/psychic_possession.txt b/forge-gui/res/cardsfolder/p/psychic_possession.txt index 1fe828a3f7c..0c603a2f544 100644 --- a/forge-gui/res/cardsfolder/p/psychic_possession.txt +++ b/forge-gui/res/cardsfolder/p/psychic_possession.txt @@ -6,6 +6,6 @@ A:SP$ Attach | Cost$ 2 U U | ValidTgts$ Opponent | AILogic$ Curse S:Mode$ Continuous | Affected$ You | AddKeyword$ Skip your draw step. | Description$ Skip your draw step. T:Mode$ Drawn | ValidCard$ Card.OppOwn | TriggerZones$ Battlefield | Execute$ TrigDraw | OptionalDecider$ You | TriggerDescription$ Whenever enchanted opponent draws a card, you may draw a card. SVar:TrigDraw:DB$ Draw | NumCards$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/psychic_possession.jpg Oracle:Enchant opponent\nSkip your draw step.\nWhenever enchanted opponent draws a card, you may draw a card. diff --git a/forge-gui/res/cardsfolder/p/psychic_puppetry.txt b/forge-gui/res/cardsfolder/p/psychic_puppetry.txt index c0c63fe1045..d2b93ed2eb2 100644 --- a/forge-gui/res/cardsfolder/p/psychic_puppetry.txt +++ b/forge-gui/res/cardsfolder/p/psychic_puppetry.txt @@ -3,7 +3,7 @@ ManaCost:1 U Types:Instant Arcane K:Splice:Arcane:U A:SP$ TapOrUntap | Cost$ 1 U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | SpellDescription$ You may tap or untap target permanent. -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHints:Type$Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/psychic_puppetry.jpg Oracle:You may tap or untap target permanent.\nSplice onto Arcane {U} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) diff --git a/forge-gui/res/cardsfolder/p/psychic_spear.txt b/forge-gui/res/cardsfolder/p/psychic_spear.txt index c6fd450c9ed..b4c6d901a4a 100644 --- a/forge-gui/res/cardsfolder/p/psychic_spear.txt +++ b/forge-gui/res/cardsfolder/p/psychic_spear.txt @@ -2,6 +2,6 @@ Name:Psychic Spear ManaCost:B Types:Sorcery A:SP$ Discard | Cost$ B | ValidTgts$ Player | NumCards$ 1 | DiscardValid$ Creature.Spirit,Instant.Arcane,Sorcery.Arcane | Mode$ RevealYouChoose | SpellDescription$ Target player reveals their hand. You choose a Spirit or Arcane card from it. That player discards that card. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/psychic_spear.jpg Oracle:Target player reveals their hand. You choose a Spirit or Arcane card from it. That player discards that card. diff --git a/forge-gui/res/cardsfolder/p/psychic_surgery.txt b/forge-gui/res/cardsfolder/p/psychic_surgery.txt index 7e0a70099fc..d64b506a2bf 100644 --- a/forge-gui/res/cardsfolder/p/psychic_surgery.txt +++ b/forge-gui/res/cardsfolder/p/psychic_surgery.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Enchantment T:Mode$ Shuffled | ValidPlayer$ Opponent | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDig | TriggerDescription$ Whenever an opponent shuffles their library, you may look at the top two cards of that library. You may exile one of those cards. Then put the rest on top of that library in any order. SVar:TrigDig:DB$ Dig | Defined$ TriggeredPlayer | DigNum$ 2 | ChangeNum$ 1 | Optional$ True | DestinationZone$ Exile | LibraryPosition2$ 0 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/psychic_surgery.jpg Oracle:Whenever an opponent shuffles their library, you may look at the top two cards of that library. You may exile one of those cards. Then put the rest on top of that library in any order. diff --git a/forge-gui/res/cardsfolder/p/psychic_theft.txt b/forge-gui/res/cardsfolder/p/psychic_theft.txt index bde01b7f00b..ee8aa45d7e8 100644 --- a/forge-gui/res/cardsfolder/p/psychic_theft.txt +++ b/forge-gui/res/cardsfolder/p/psychic_theft.txt @@ -14,6 +14,6 @@ SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination SVar:RemoveEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile # Remove Effect when the card is played SVar:TrigCast:Mode$ SpellCast | ValidCard$ Card.IsRemembered | Static$ True | TriggerZones$ Command | Execute$ RemoveEffect -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/psychic_theft.jpg Oracle:Target player reveals their hand. You choose an instant or sorcery card from it and exile that card. You may cast that card for as long as it remains exiled. At the beginning of the next end step, if you haven't cast the card, return it to its owner's hand. diff --git a/forge-gui/res/cardsfolder/p/psychic_trance.txt b/forge-gui/res/cardsfolder/p/psychic_trance.txt index 26a70521e8e..00642e57dcd 100644 --- a/forge-gui/res/cardsfolder/p/psychic_trance.txt +++ b/forge-gui/res/cardsfolder/p/psychic_trance.txt @@ -4,7 +4,7 @@ Types:Instant A:SP$ Effect | Cost$ 2 U U | Name$ Psychic Trance Effect | StaticAbilities$ Static | SVars$ Counter | SpellDescription$ Until end of turn, Wizards you control gain "{T}: Counter target spell." SVar:Static:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Card.Wizard+YouCtrl | AddAbility$ Counter | Description$ All Wizards you control have Tap: Counter target spell. SVar:Counter:AB$ Counter | Cost$ T | TargetType$ Spell | ValidTgts$ Card | SpellDescription$ Counter target spell -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/psychic_trance.jpg Oracle:Until end of turn, Wizards you control gain "{T}: Counter target spell." diff --git a/forge-gui/res/cardsfolder/p/psychic_transfer.txt b/forge-gui/res/cardsfolder/p/psychic_transfer.txt index 8d2bb025d26..77cfddfc4ec 100644 --- a/forge-gui/res/cardsfolder/p/psychic_transfer.txt +++ b/forge-gui/res/cardsfolder/p/psychic_transfer.txt @@ -5,6 +5,6 @@ A:SP$ ExchangeLife | Cost$ 4 U | ValidTgts$ Player | ConditionCheckSVar$ X | Con SVar:X:SVar$Y/Abs SVar:Y:Count$YourLifeTotal/Minus.Z SVar:Z:Count$TargetedLifeTotal -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/psychic_transfer.jpg Oracle:If the difference between your life total and target player's life total is 5 or less, exchange life totals with that player. diff --git a/forge-gui/res/cardsfolder/p/psychic_vortex.txt b/forge-gui/res/cardsfolder/p/psychic_vortex.txt index 48cbc24df46..e0370caf4e9 100644 --- a/forge-gui/res/cardsfolder/p/psychic_vortex.txt +++ b/forge-gui/res/cardsfolder/p/psychic_vortex.txt @@ -5,6 +5,6 @@ K:Cumulative upkeep:Draw<1/You>:Draw a card. T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | Execute$ TrigSac | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your end step, sacrifice a land and discard your hand. SVar:TrigSac:DB$ Sacrifice | SacValid$ Land | SubAbility$ DBDiscard SVar:DBDiscard:DB$ Discard | Mode$ Hand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/psychic_vortex.jpg Oracle:Cumulative upkeep—Draw a card. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nAt the beginning of your end step, sacrifice a land and discard your hand. diff --git a/forge-gui/res/cardsfolder/p/psychogenic_probe.txt b/forge-gui/res/cardsfolder/p/psychogenic_probe.txt index 7b3cb6ba2a5..58e1c67f233 100644 --- a/forge-gui/res/cardsfolder/p/psychogenic_probe.txt +++ b/forge-gui/res/cardsfolder/p/psychogenic_probe.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact T:Mode$ Shuffled | ValidPlayer$ Player | ShuffleFromEffect$ True | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a spell or ability causes a player to shuffle their library, CARDNAME deals 2 damage to them. SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredPlayer | NumDmg$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/psychogenic_probe.jpg Oracle:Whenever a spell or ability causes a player to shuffle their library, Psychogenic Probe deals 2 damage to them. diff --git a/forge-gui/res/cardsfolder/p/psychosis_crawler.txt b/forge-gui/res/cardsfolder/p/psychosis_crawler.txt index 1cd13233efd..0eb9092349b 100644 --- a/forge-gui/res/cardsfolder/p/psychosis_crawler.txt +++ b/forge-gui/res/cardsfolder/p/psychosis_crawler.txt @@ -6,7 +6,7 @@ S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ SVar:X:Count$InYourHand T:Mode$ Drawn | ValidCard$ Card.YouOwn | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever you draw a card, each opponent loses 1 life. SVar:TrigLoseLife:DB$ LoseLife | Defined$ Player.Opponent | LifeAmount$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NeedsToPlayVar:X GE3 SVar:Picture:http://www.wizards.com/global/images/magic/general/psychosis_crawler.jpg Oracle:Psychosis Crawler's power and toughness are each equal to the number of cards in your hand.\nWhenever you draw a card, each opponent loses 1 life. diff --git a/forge-gui/res/cardsfolder/p/psychotic_episode.txt b/forge-gui/res/cardsfolder/p/psychotic_episode.txt index 7e3662d4ea6..b5465fb20d7 100644 --- a/forge-gui/res/cardsfolder/p/psychotic_episode.txt +++ b/forge-gui/res/cardsfolder/p/psychotic_episode.txt @@ -7,6 +7,6 @@ SVar:DBRevealTopLibrary:DB$ Dig | DigNum$ 1 | Reveal$ True | Defined$ Targeted | SVar:DBRevealHand:DB$ ChangeZone | DefinedPlayer$ Targeted | Origin$ Hand | Destination$ Library | LibraryPosition$ -1 | ChangeType$ Card | ChangeNum$ 1 | Hidden$ True | RememberChanged$ True | Chooser$ You | Optional$ True | SubAbility$ DBChooseTopLibrary SVar:DBChooseTopLibrary:DB$ Dig | DigNum$ 1 | Reveal$ True | Defined$ Targeted | Chooser$ You | RememberChanged$ True | DestinationZone$ Library | LibraryPosition$ -1 | SubAbility$ DBCleanup | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ0 SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/psychotic_episode.jpg Oracle:Target player reveals their hand and the top card of their library. You choose a card revealed this way. That player puts the chosen card on the bottom of their library.\nMadness {1}{B} (If you discard this card, discard it into exile. When you do, cast it for its madness cost or put it into your graveyard.) diff --git a/forge-gui/res/cardsfolder/p/psychotic_fury.txt b/forge-gui/res/cardsfolder/p/psychotic_fury.txt index a331f772d76..2b98dbefa10 100644 --- a/forge-gui/res/cardsfolder/p/psychotic_fury.txt +++ b/forge-gui/res/cardsfolder/p/psychotic_fury.txt @@ -3,6 +3,6 @@ ManaCost:1 R Types:Instant A:SP$ Pump | Cost$ 1 R | ValidTgts$ Creature.MultiColor | TgtPrompt$ Select target multicolored creature | KW$ Double Strike | SubAbility$ DBDraw | SpellDescription$ Target multicolored creature gains double strike until end of turn. SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/psychotic_fury.jpg Oracle:Target multicolored creature gains double strike until end of turn.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/p/pteron_ghost.txt b/forge-gui/res/cardsfolder/p/pteron_ghost.txt index 58505368d12..ada4a980bd7 100644 --- a/forge-gui/res/cardsfolder/p/pteron_ghost.txt +++ b/forge-gui/res/cardsfolder/p/pteron_ghost.txt @@ -4,6 +4,6 @@ Types:Creature Dinosaur Spirit PT:1/1 K:Flying A:AB$ Regenerate | Cost$ Sac<1/CARDNAME> | ValidTgts$ Artifact | TgtPrompt$ Select target artifact. | SpellDescription$ Regenerate target artifact. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/pteron_ghost.jpg Oracle:Flying\nSacrifice Pteron Ghost: Regenerate target artifact. diff --git a/forge-gui/res/cardsfolder/p/pucas_mischief.txt b/forge-gui/res/cardsfolder/p/pucas_mischief.txt index 6430e4d2d77..224a915c142 100644 --- a/forge-gui/res/cardsfolder/p/pucas_mischief.txt +++ b/forge-gui/res/cardsfolder/p/pucas_mischief.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigExchange | TriggerDescription$ At the beginning of your upkeep, you may exchange control of target nonland permanent you control and target nonland permanent an opponent controls with an equal or lesser converted mana cost. SVar:TrigExchange:DB$ Pump | ValidTgts$ Permanent.YouCtrl+nonLand | TgtPrompt$ Select target nonland permanent you control | SubAbility$ DBExchange SVar:DBExchange:DB$ ExchangeControl | Defined$ ParentTarget | ValidTgts$ Permanent.OppCtrl+nonLand | TgtPrompt$ Select target nonland permanent an opponent controls with less or equal converted mana cost | TargetsWithRelatedProperty$ LECMC -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/pucas_mischief.jpg Oracle:At the beginning of your upkeep, you may exchange control of target nonland permanent you control and target nonland permanent an opponent controls with an equal or lesser converted mana cost. diff --git a/forge-gui/res/cardsfolder/p/pull_from_eternity.txt b/forge-gui/res/cardsfolder/p/pull_from_eternity.txt index 49016829842..2dd57f86c55 100644 --- a/forge-gui/res/cardsfolder/p/pull_from_eternity.txt +++ b/forge-gui/res/cardsfolder/p/pull_from_eternity.txt @@ -2,6 +2,6 @@ Name:Pull from Eternity ManaCost:W Types:Instant A:SP$ ChangeZone | Cost$ W | Origin$ Exile | Destination$ Graveyard | ValidTgts$ Card.faceUp | ChangeNum$ 1 | SpellDescription$ Put target face-up exiled card into its owner's graveyard. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/pull_from_eternity.jpg Oracle:Put target face-up exiled card into its owner's graveyard. diff --git a/forge-gui/res/cardsfolder/p/pulsating_illusion.txt b/forge-gui/res/cardsfolder/p/pulsating_illusion.txt index 8d82932d8ce..bed27b001d9 100644 --- a/forge-gui/res/cardsfolder/p/pulsating_illusion.txt +++ b/forge-gui/res/cardsfolder/p/pulsating_illusion.txt @@ -5,6 +5,6 @@ PT:0/1 K:Flying A:AB$ Pump | Cost$ Discard<1/Card> | NumAtt$ +4 | NumDef$ +4 | ActivationLimit$ 1 | SpellDescription$ CARDNAME gets +4/+4 until end of turn. Activate this ability only once each turn. SVar:AIPreference:DiscardCost$Card -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/pulsating_illusion.jpg Oracle:Flying\nDiscard a card: Pulsating Illusion gets +4/+4 until end of turn. Activate this ability only once each turn. diff --git a/forge-gui/res/cardsfolder/p/pulse_of_llanowar.txt b/forge-gui/res/cardsfolder/p/pulse_of_llanowar.txt index 71d6e706c27..473470e27af 100644 --- a/forge-gui/res/cardsfolder/p/pulse_of_llanowar.txt +++ b/forge-gui/res/cardsfolder/p/pulse_of_llanowar.txt @@ -3,7 +3,7 @@ ManaCost:3 G Types:Enchantment R:Event$ ProduceMana | ActiveZones$ Battlefield | ValidCard$ Land.Basic+YouCtrl | ManaReplacement$ ProduceAny | Description$ If a basic land you control is tapped for mana, it produces mana of a color of your choice instead of any other type. SVar:ProduceAny:C->Any & R->Any & B->Any & U->Any & G->Any & W->Any -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/pulse_of_llanowar.jpg Oracle:If a basic land you control is tapped for mana, it produces mana of a color of your choice instead of any other type. diff --git a/forge-gui/res/cardsfolder/p/pulsemage_advocate.txt b/forge-gui/res/cardsfolder/p/pulsemage_advocate.txt index ab9db220c59..cb6e6059f05 100644 --- a/forge-gui/res/cardsfolder/p/pulsemage_advocate.txt +++ b/forge-gui/res/cardsfolder/p/pulsemage_advocate.txt @@ -4,6 +4,6 @@ Types:Creature Human Cleric PT:1/3 A:AB$ ChangeZone | Cost$ T | ValidTgts$ Card.OppOwn | TargetMin$ 3 | TargetMax$ 3 | Origin$ Graveyard | Destination$ Hand | SubAbility$ DBReturn | SpellDescription$ Return three target cards from an opponent's graveyard to their hand. Return target creature card from your graveyard to the battlefield. SVar:DBReturn:DB$ ChangeZone | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature | Origin$ Graveyard | Destination$ Battlefield -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/pulsemage_advocate.jpg Oracle:{T}: Return three target cards from an opponent's graveyard to their hand. Return target creature card from your graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/p/puppet_strings.txt b/forge-gui/res/cardsfolder/p/puppet_strings.txt index 8e982a4b7d5..1c7a6c9e4f0 100644 --- a/forge-gui/res/cardsfolder/p/puppet_strings.txt +++ b/forge-gui/res/cardsfolder/p/puppet_strings.txt @@ -2,6 +2,6 @@ Name:Puppet Strings ManaCost:3 Types:Artifact A:AB$ TapOrUntap | Cost$ 2 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ You may tap or untap target creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/puppet_strings.jpg Oracle:{2}, {T}: You may tap or untap target creature. diff --git a/forge-gui/res/cardsfolder/p/puppeteer.txt b/forge-gui/res/cardsfolder/p/puppeteer.txt index 5c0860c7270..cb8ab2ef1d6 100644 --- a/forge-gui/res/cardsfolder/p/puppeteer.txt +++ b/forge-gui/res/cardsfolder/p/puppeteer.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Creature Human Wizard PT:1/2 A:AB$ TapOrUntap | Cost$ U T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ You may tap or untap target creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/puppeteer.jpg Oracle:{U}, {T}: You may tap or untap target creature. diff --git a/forge-gui/res/cardsfolder/p/puppets_verdict.txt b/forge-gui/res/cardsfolder/p/puppets_verdict.txt index 25d54b59779..27b931bb1b0 100644 --- a/forge-gui/res/cardsfolder/p/puppets_verdict.txt +++ b/forge-gui/res/cardsfolder/p/puppets_verdict.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ FlipACoin | Cost$ 1 R R | WinSubAbility$ DBDestorySmall | LoseSubAbility$ DBDestoryBig | SpellDescription$ Flip a coin. If you win the flip, destroy all creatures with power 2 or less. If you lose the flip, destroy all creatures with power 3 or greater. SVar:DBDestorySmall:DB$ DestroyAll | ValidCards$ Creature.powerLE2 SVar:DBDestoryBig:DB$ DestroyAll | ValidCards$ Creature.powerGE3 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/puppets_verdict.jpg Oracle:Flip a coin. If you win the flip, destroy all creatures with power 2 or less. If you lose the flip, destroy all creatures with power 3 or greater. diff --git a/forge-gui/res/cardsfolder/p/pure_intentions.txt b/forge-gui/res/cardsfolder/p/pure_intentions.txt index 2d1f5ac8129..8dd0402a16e 100644 --- a/forge-gui/res/cardsfolder/p/pure_intentions.txt +++ b/forge-gui/res/cardsfolder/p/pure_intentions.txt @@ -7,7 +7,7 @@ SVar:TrigPureChange:DB$ ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard T:Mode$ Discarded | ValidCard$ Card.Self | ValidCause$ Card.OppCtrl | Execute$ TrigPureReturn | TriggerDescription$ When a spell or ability an opponent controls causes you to discard CARDNAME, return it to your hand. SVar:TrigPureReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand SVar:DiscardMeByOpp:1 -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/pure_intentions.jpg Oracle:Whenever a spell or ability an opponent controls causes you to discard cards this turn, return those cards from your graveyard to your hand.\nWhen a spell or ability an opponent controls causes you to discard Pure Intentions, return Pure Intentions from your graveyard to your hand at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/p/purelace.txt b/forge-gui/res/cardsfolder/p/purelace.txt index 97aba6361de..055e16d49a4 100644 --- a/forge-gui/res/cardsfolder/p/purelace.txt +++ b/forge-gui/res/cardsfolder/p/purelace.txt @@ -2,7 +2,7 @@ Name:Purelace ManaCost:W Types:Instant A:SP$ Animate | Cost$ W | Colors$ White | OverwriteColors$ True | ValidTgts$ Card | TgtZone$ Stack,Battlefield | Permanent$ True | SpellDescription$ Target spell or permanent becomes white. (Mana symbols on that permanent remain unchanged.) -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/purelace.jpg Oracle:Target spell or permanent becomes white. (Mana symbols on that permanent remain unchanged.) diff --git a/forge-gui/res/cardsfolder/p/puresight_merrow.txt b/forge-gui/res/cardsfolder/p/puresight_merrow.txt index d4e1b812796..6742ef1d90c 100644 --- a/forge-gui/res/cardsfolder/p/puresight_merrow.txt +++ b/forge-gui/res/cardsfolder/p/puresight_merrow.txt @@ -3,6 +3,6 @@ ManaCost:WU WU Types:Creature Merfolk Wizard PT:2/2 A:AB$ Dig | Cost$ WU Untap | DigNum$ 1 | DestinationZone$ Exile | DestinationZone2$ Library | LibraryPosition2$ 0 | Optional$ True | SpellDescription$ Look at the top card of your library. You may exile that card. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/puresight_merrow.jpg Oracle:{W/U}, {Q}: Look at the top card of your library. You may exile that card. ({Q} is the untap symbol.) diff --git a/forge-gui/res/cardsfolder/p/purging_scythe.txt b/forge-gui/res/cardsfolder/p/purging_scythe.txt index f81774c2c10..1ee5a6f2da3 100644 --- a/forge-gui/res/cardsfolder/p/purging_scythe.txt +++ b/forge-gui/res/cardsfolder/p/purging_scythe.txt @@ -5,6 +5,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigChooseDmg | Trig SVar:TrigChooseDmg:DB$ ChooseCard | Defined$ You | Choices$ Creature.leastToughness | Mandatory$ True | SubAbility$ DBDmg SVar:DBDmg:DB$ DealDamage | NumDmg$ 2 | Defined$ ChosenCard SVar:NeedsToPlay:Creature.YouDontCtrl+leastToughness -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/purging_scythe.jpg Oracle:At the beginning of your upkeep, Purging Scythe deals 2 damage to the creature with the least toughness. If two or more creatures are tied for least toughness, you choose one of them. diff --git a/forge-gui/res/cardsfolder/p/purify_the_grave.txt b/forge-gui/res/cardsfolder/p/purify_the_grave.txt index 8cf43eab65f..fbecb174f1a 100644 --- a/forge-gui/res/cardsfolder/p/purify_the_grave.txt +++ b/forge-gui/res/cardsfolder/p/purify_the_grave.txt @@ -3,6 +3,6 @@ ManaCost:W Types:Instant K:Flashback:W A:SP$ ChangeZone | Cost$ W | ValidTgts$ Card | TgtPrompt$ Select card to exile | Origin$ Graveyard | Destination$ Exile | SpellDescription$ Exile target card from a graveyard. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/purify_the_grave.jpg Oracle:Exile target card from a graveyard.\nFlashback {W} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/p/pursuit_of_knowledge.txt b/forge-gui/res/cardsfolder/p/pursuit_of_knowledge.txt index f096685e5a8..b2033a456b7 100644 --- a/forge-gui/res/cardsfolder/p/pursuit_of_knowledge.txt +++ b/forge-gui/res/cardsfolder/p/pursuit_of_knowledge.txt @@ -4,6 +4,6 @@ Types:Enchantment R:Event$ Draw | ActiveZones$ Battlefield | ValidPlayer$ You | Optional$ True | ReplaceWith$ Counter | Description$ If you would draw a card, you may put a study counter on CARDNAME instead. A:AB$ Draw | Cost$ SubCounter<3/STUDY> Sac<1/CARDNAME> | NumCards$ 7 | SpellDescription$ Draw seven cards. SVar:Counter:DB$ PutCounter | Defined$ Self | CounterNum$ 1 | CounterType$ STUDY -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/pursuit_of_knowledge.jpg Oracle:If you would draw a card, you may put a study counter on Pursuit of Knowledge instead.\nRemove three study counters from Pursuit of Knowledge, Sacrifice Pursuit of Knowledge: Draw seven cards. diff --git a/forge-gui/res/cardsfolder/p/putrefaction.txt b/forge-gui/res/cardsfolder/p/putrefaction.txt index 01c319c48c6..62416217969 100644 --- a/forge-gui/res/cardsfolder/p/putrefaction.txt +++ b/forge-gui/res/cardsfolder/p/putrefaction.txt @@ -3,6 +3,6 @@ ManaCost:4 B Types:Enchantment T:Mode$ SpellCast | ValidCard$ Card.Green,Card.White | Execute$ TrigDiscard | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player casts a green or white spell, that player discards a card. SVar:TrigDiscard:DB$Discard | Defined$ TriggeredActivator | NumCards$ 1 | Mode$ TgtChoose -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/putrefaction.jpg Oracle:Whenever a player casts a green or white spell, that player discards a card. diff --git a/forge-gui/res/cardsfolder/p/putrid_cyclops.txt b/forge-gui/res/cardsfolder/p/putrid_cyclops.txt index fc3884055a8..beaafdbfb0b 100644 --- a/forge-gui/res/cardsfolder/p/putrid_cyclops.txt +++ b/forge-gui/res/cardsfolder/p/putrid_cyclops.txt @@ -7,6 +7,6 @@ SVar:TrigSrcy:DB$ Scry | ScryNum$ 1 | SubAbility$ DBReveal SVar:DBReveal:DB$ Dig | DigNum$ 1 | Reveal$ True | DestinationZone$ Library | LibraryPosition$ 0 | SubAbility$ DBPump SVar:DBPump:DB$ Pump | Defined$ TriggeredCard | NumAtt$ -X | NumDef$ -X | References$ X SVar:X:Count$TopOfLibraryCMC -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/putrid_cyclops.jpg Oracle:When Putrid Cyclops enters the battlefield, scry 1, then reveal the top card of your library. Putrid Cyclops gets -X/-X until end of turn, where X is that card's converted mana cost. (To scry 1, look at the top card of your library, then you may put that card on the bottom of your library.) diff --git a/forge-gui/res/cardsfolder/p/putrid_imp.txt b/forge-gui/res/cardsfolder/p/putrid_imp.txt index 801daad3b83..4fe5a44e155 100644 --- a/forge-gui/res/cardsfolder/p/putrid_imp.txt +++ b/forge-gui/res/cardsfolder/p/putrid_imp.txt @@ -4,6 +4,6 @@ Types:Creature Zombie Imp PT:1/1 A:AB$ Pump | Cost$ Discard<1/Card> | Defined$ Self | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 1 | AddToughness$ 1 | AddHiddenKeyword$ CARDNAME can't block. | Condition$ Threshold | Description$ Threshold — As long as seven or more cards are in your graveyard, CARDNAME gets +1/+1 and can't block. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/putrid_imp.jpg Oracle:Discard a card: Putrid Imp gains flying until end of turn.\nThreshold — As long as seven or more cards are in your graveyard, Putrid Imp gets +1/+1 and can't block. diff --git a/forge-gui/res/cardsfolder/p/putrid_leech.txt b/forge-gui/res/cardsfolder/p/putrid_leech.txt index 90d63f3f0a5..c6a51fa7f54 100644 --- a/forge-gui/res/cardsfolder/p/putrid_leech.txt +++ b/forge-gui/res/cardsfolder/p/putrid_leech.txt @@ -3,6 +3,6 @@ ManaCost:B G Types:Creature Zombie Leech PT:2/2 A:AB$ Pump | Cost$ PayLife<2> | NumAtt$ +2 | NumDef$ +2 | ActivationLimit$ 1 | SpellDescription$ Putrid Leech gets +2/+2 until end of turn. Activate this ability only once each turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/putrid_leech.jpg Oracle:Pay 2 life: Putrid Leech gets +2/+2 until end of turn. Activate this ability only once each turn. diff --git a/forge-gui/res/cardsfolder/p/putrid_warrior.txt b/forge-gui/res/cardsfolder/p/putrid_warrior.txt index b7f5c236aee..aa8f5cd310c 100644 --- a/forge-gui/res/cardsfolder/p/putrid_warrior.txt +++ b/forge-gui/res/cardsfolder/p/putrid_warrior.txt @@ -6,7 +6,7 @@ T:Mode$ DamageDealtOnce | ValidSource$ Card.Self | Execute$ TrigCharm | TriggerZ SVar:TrigCharm:DB$ Charm | Choices$ SVar1,SVar2 SVar:SVar1:DB$ LoseLife | Defined$ Player | LifeAmount$ 1 | SpellDescription$ Each player loses 1 life. SVar:SVar2:DB$ GainLife | Defined$ Player | LifeAmount$ 1 | SpellDescription$ Each player gains 1 life. -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHas:Ability$LifeGain SVar:Picture:http://www.wizards.com/global/images/magic/general/putrid_warrior.jpg Oracle:Whenever Putrid Warrior deals damage, choose one —\n• Each player loses 1 life.\n• Each player gains 1 life. diff --git a/forge-gui/res/cardsfolder/p/pygmy_hippo.txt b/forge-gui/res/cardsfolder/p/pygmy_hippo.txt index 8041c683dd9..c08e5a734df 100644 --- a/forge-gui/res/cardsfolder/p/pygmy_hippo.txt +++ b/forge-gui/res/cardsfolder/p/pygmy_hippo.txt @@ -10,6 +10,6 @@ SVar:DBDelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ Main2 | Execute$ TrigAd SVar:TrigAddMana:DB$ Mana | Produced$ C | Amount$ X | References$ X SVar:X:Count$TriggerRememberAmount SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/pygmy_hippo.jpg Oracle:Whenever Pygmy Hippo attacks and isn't blocked, you may have defending player activate a mana ability of each land they control and lose all unspent mana. If you do, Pygmy Hippo assigns no combat damage this turn and at the beginning of your next main phase this turn, you add an amount of {C} equal to the amount of mana that player lost this way. diff --git a/forge-gui/res/cardsfolder/p/pygmy_kavu.txt b/forge-gui/res/cardsfolder/p/pygmy_kavu.txt index 41bd6edb032..59ed20440c5 100644 --- a/forge-gui/res/cardsfolder/p/pygmy_kavu.txt +++ b/forge-gui/res/cardsfolder/p/pygmy_kavu.txt @@ -5,6 +5,6 @@ PT:1/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card for each black creature your opponents control. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ X | References$ X SVar:X:Count$Valid Creature.Black+OppCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/pygmy_kavu.jpg Oracle:When Pygmy Kavu enters the battlefield, draw a card for each black creature your opponents control. diff --git a/forge-gui/res/cardsfolder/p/pyric_salamander.txt b/forge-gui/res/cardsfolder/p/pyric_salamander.txt index 3e445957859..7656bdeef9e 100644 --- a/forge-gui/res/cardsfolder/p/pyric_salamander.txt +++ b/forge-gui/res/cardsfolder/p/pyric_salamander.txt @@ -3,6 +3,6 @@ ManaCost:1 R Types:Creature Salamander PT:1/1 A:AB$ Pump | Cost$ R | NumAtt$ +1 | AtEOT$ Sacrifice | SpellDescription$ CARDNAME gets +1/+0 until end of turn. Sacrifice CARDNAME at the beginning of the next end step. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/pyric_salamander.jpg Oracle:{R}: Pyric Salamander gets +1/+0 until end of turn. Sacrifice Pyric Salamander at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/p/pyrite_spellbomb.txt b/forge-gui/res/cardsfolder/p/pyrite_spellbomb.txt index 5263f3608ca..6a01eff3cf9 100644 --- a/forge-gui/res/cardsfolder/p/pyrite_spellbomb.txt +++ b/forge-gui/res/cardsfolder/p/pyrite_spellbomb.txt @@ -3,6 +3,6 @@ ManaCost:1 Types:Artifact A:AB$ Draw | Cost$ 1 Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. A:AB$ DealDamage | Cost$ R Sac<1/CARDNAME> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select target creature or player | NumDmg$ 2 | SpellDescription$ It deals 2 damage to any target. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/pyrite_spellbomb.jpg Oracle:{R}, Sacrifice Pyrite Spellbomb: It deals 2 damage to any target.\n{1}, Sacrifice Pyrite Spellbomb: Draw a card. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/p/pyroblast.txt b/forge-gui/res/cardsfolder/p/pyroblast.txt index 8527cd5feed..01e646fc70d 100644 --- a/forge-gui/res/cardsfolder/p/pyroblast.txt +++ b/forge-gui/res/cardsfolder/p/pyroblast.txt @@ -5,6 +5,6 @@ A:SP$ Charm | Cost$ R | Choices$ DBCounter,DBDestroy | CharmNum$ 1 SVar:DBCounter:DB$ Counter | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | AITgts$ Card.Blue | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | References$ X | SpellDescription$ Counter target spell if it's blue. SVar:DBDestroy:DB$ Destroy | ValidTgts$ Permanent | AITgts$ Card.Blue | TgtPrompt$ Select target permanent | ConditionDefined$ Targeted | ConditionPresent$ Card.Blue | ConditionCompare$ GE1 | SpellDescription$ Destroy target permanent if it's blue. SVar:X:Targeted$Valid Card.Blue -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/pyroblast.jpg Oracle:Choose one —\n• Counter target spell if it's blue.\n• Destroy target permanent if it's blue. diff --git a/forge-gui/res/cardsfolder/p/pyroclast_consul.txt b/forge-gui/res/cardsfolder/p/pyroclast_consul.txt index 874bcf74117..d64d600ed94 100644 --- a/forge-gui/res/cardsfolder/p/pyroclast_consul.txt +++ b/forge-gui/res/cardsfolder/p/pyroclast_consul.txt @@ -6,6 +6,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigKinship | Trigge SVar:TrigKinship:DB$ PeekAndReveal | PeekAmount$ 1 | RevealValid$ Card.sharesCreatureTypeWith | RevealOptional$ True | RememberRevealed$ True | SubAbility$ DBDamageAll SVar:DBDamageAll:DB$ DamageAll | NumDmg$ 2 | ValidCards$ Creature | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/pyroclast_consul.jpg Oracle:Kinship — At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Pyroclast Consul, you may reveal it. If you do, Pyroclast Consul deals 2 damage to each creature. diff --git a/forge-gui/res/cardsfolder/p/pyroconvergence.txt b/forge-gui/res/cardsfolder/p/pyroconvergence.txt index 1e8be5d6455..6bb81fea514 100644 --- a/forge-gui/res/cardsfolder/p/pyroconvergence.txt +++ b/forge-gui/res/cardsfolder/p/pyroconvergence.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ SpellCast | ValidCard$ Card.MultiColor | ValidActivatingPlayer$ You | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a multicolored spell, CARDNAME deals 2 damage to any target. SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 SVar:BuffedBy:Card.MultiColor -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/pyroconvergence.jpg Oracle:Whenever you cast a multicolored spell, Pyroconvergence deals 2 damage to any target. diff --git a/forge-gui/res/cardsfolder/p/pyromancers_gauntlet.txt b/forge-gui/res/cardsfolder/p/pyromancers_gauntlet.txt index 4fb38934faa..f14ed8881f9 100644 --- a/forge-gui/res/cardsfolder/p/pyromancers_gauntlet.txt +++ b/forge-gui/res/cardsfolder/p/pyromancers_gauntlet.txt @@ -4,6 +4,6 @@ Types:Artifact R:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Instant.YouCtrl+Red,Sorcery.YouCtrl+Red,Planeswalker.YouCtrl+Red | ValidTarget$ Permanent,Player | ReplaceWith$ DmgPlus2 | Description$ If a red instant or sorcery spell you control or a red planeswalker you control would deal damage to a permanent or player, it deals that much damage plus 2 to that permanent or player instead. SVar:DmgPlus2:DB$ ReplaceEffect | VarName$ DamageAmount | VarValue$ X | References$ X SVar:X:ReplaceCount$DamageAmount/Plus.2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/pyromancers_gauntlet.jpg Oracle:If a red instant or sorcery spell you control or a red planeswalker you control would deal damage to a permanent or player, it deals that much damage plus 2 to that permanent or player instead. diff --git a/forge-gui/res/cardsfolder/p/pyromancers_swath.txt b/forge-gui/res/cardsfolder/p/pyromancers_swath.txt index e5afc76da18..9b806cafc5c 100644 --- a/forge-gui/res/cardsfolder/p/pyromancers_swath.txt +++ b/forge-gui/res/cardsfolder/p/pyromancers_swath.txt @@ -6,6 +6,6 @@ SVar:DmgPlus2:DB$ ReplaceEffect | VarName$ DamageAmount | VarValue$ X | Referenc SVar:X:ReplaceCount$DamageAmount/Plus.2 T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ At the beginning of each end step, discard your hand. SVar:TrigDiscard:DB$Discard | Mode$ Hand -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/pyromancers_swath.jpg Oracle:If an instant or sorcery source you control would deal damage to a permanent or player, it deals that much damage plus 2 to that permanent or player instead.\nAt the beginning of each end step, discard your hand. diff --git a/forge-gui/res/cardsfolder/p/pyromancy.txt b/forge-gui/res/cardsfolder/p/pyromancy.txt index 2cb50fc0296..ad6069814ea 100644 --- a/forge-gui/res/cardsfolder/p/pyromancy.txt +++ b/forge-gui/res/cardsfolder/p/pyromancy.txt @@ -3,7 +3,7 @@ ManaCost:2 R R Types:Enchantment A:AB$ DealDamage | Cost$ 3 Discard<1/Random> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals damage to any target equal to the converted mana cost of the discarded card. SVar:X:Discarded$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/pyromancy.jpg Oracle:{3}, Discard a card at random: Pyromancy deals damage to any target equal to the converted mana cost of the discarded card. diff --git a/forge-gui/res/cardsfolder/p/pyromania.txt b/forge-gui/res/cardsfolder/p/pyromania.txt index d990dc976bb..e3ae65b932d 100644 --- a/forge-gui/res/cardsfolder/p/pyromania.txt +++ b/forge-gui/res/cardsfolder/p/pyromania.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Enchantment A:AB$ DealDamage | Cost$ 1 R Discard<1/Random> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to any target. A:AB$ DealDamage | Cost$ 1 R Sac<1/CARDNAME> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to any target. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/pyromania.jpg Oracle:{1}{R}, Discard a card at random: Pyromania deals 1 damage to any target.\n{1}{R}, Sacrifice Pyromania: Pyromania deals 1 damage to any target. diff --git a/forge-gui/res/cardsfolder/p/pyrostatic_pillar.txt b/forge-gui/res/cardsfolder/p/pyrostatic_pillar.txt index 7f8daf4ea4a..820b02f4923 100644 --- a/forge-gui/res/cardsfolder/p/pyrostatic_pillar.txt +++ b/forge-gui/res/cardsfolder/p/pyrostatic_pillar.txt @@ -3,6 +3,6 @@ ManaCost:1 R Types:Enchantment T:Mode$ SpellCast | ValidCard$ Card.cmcLE3 | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a player casts a spell with converted mana cost 3 or less, CARDNAME deals 2 damage to that player. SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredActivator | NumDmg$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/pyrostatic_pillar.jpg Oracle:Whenever a player casts a spell with converted mana cost 3 or less, Pyrostatic Pillar deals 2 damage to that player. diff --git a/forge-gui/res/cardsfolder/p/pyxis_of_pandemonium.txt b/forge-gui/res/cardsfolder/p/pyxis_of_pandemonium.txt index 1fc7720be4f..bb7199d66ae 100644 --- a/forge-gui/res/cardsfolder/p/pyxis_of_pandemonium.txt +++ b/forge-gui/res/cardsfolder/p/pyxis_of_pandemonium.txt @@ -8,6 +8,6 @@ T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCar SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/pyxis_of_pandemonium.jpg Oracle:{T}: Each player exiles the top card of their library face down.\n{7}, {T}, Sacrifice Pyxis of Pandemonium: Each player turns face up all cards they own exiled with Pyxis of Pandemonium, then puts all permanent cards among them onto the battlefield. diff --git a/forge-gui/res/cardsfolder/q/quagmire.txt b/forge-gui/res/cardsfolder/q/quagmire.txt index 394cabf40bb..631480bb228 100644 --- a/forge-gui/res/cardsfolder/q/quagmire.txt +++ b/forge-gui/res/cardsfolder/q/quagmire.txt @@ -3,6 +3,6 @@ ManaCost:2 B Types:Enchantment S:Mode$ Continuous | Affected$ Creature.withSwampwalk | AddHiddenKeyword$ May be blocked as though it doesn't have Mountainwalk. | Description$ Creatures with swampwalk can be blocked as though they didn't have swampwalk. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/quagmire.jpg Oracle:Creatures with swampwalk can be blocked as though they didn't have swampwalk. diff --git a/forge-gui/res/cardsfolder/q/quagmire_druid.txt b/forge-gui/res/cardsfolder/q/quagmire_druid.txt index 31b38429d05..b30fee97112 100644 --- a/forge-gui/res/cardsfolder/q/quagmire_druid.txt +++ b/forge-gui/res/cardsfolder/q/quagmire_druid.txt @@ -3,6 +3,6 @@ ManaCost:2 B Types:Creature Zombie Druid PT:2/2 A:AB$ Destroy | Cost$ G T Sac<1/Creature> | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | SpellDescription$ Destroy target enchantment. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/quagmire_druid.jpg Oracle:{G}, {T}, Sacrifice a creature: Destroy target enchantment. diff --git a/forge-gui/res/cardsfolder/q/quarum_trench_gnomes.txt b/forge-gui/res/cardsfolder/q/quarum_trench_gnomes.txt index 5b9b049cab5..f7d1e9915fb 100644 --- a/forge-gui/res/cardsfolder/q/quarum_trench_gnomes.txt +++ b/forge-gui/res/cardsfolder/q/quarum_trench_gnomes.txt @@ -5,7 +5,7 @@ PT:1/1 A:AB$ Animate | Cost$ T | ValidTgts$ Plains | IsCurse$ True | TgtPrompt$ Choose target plains | Replacements$ QuarumReplacement | sVars$ QuarumProduce | Permanent$ True | StackDescription$ If target {c:Targeted} is tapped for mana, it produces colorless mana instead of white mana. (This effect lasts indefinitely.) | SpellDescription$ If target Plains is tapped for mana, it produces colorless mana instead of white mana. (This effect lasts indefinitely.) SVar:QuarumReplacement:Event$ ProduceMana | ActiveZones$ Battlefield | ValidCard$ Card.Plains+Self | ManaReplacement$ QuarumProduce | Description$ If CARDNAME is tapped for mana, it produces colorless mana instead of white mana. SVar:QuarumProduce:W->1 -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/quarum_trench_gnomes.jpg Oracle:{T}: If target Plains is tapped for mana, it produces colorless mana instead of white mana. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/q/quest_for_ancient_secrets.txt b/forge-gui/res/cardsfolder/q/quest_for_ancient_secrets.txt index 59e4ffd257b..ff78dd6669d 100644 --- a/forge-gui/res/cardsfolder/q/quest_for_ancient_secrets.txt +++ b/forge-gui/res/cardsfolder/q/quest_for_ancient_secrets.txt @@ -4,7 +4,7 @@ Types:Enchantment A:AB$ ChangeZoneAll | Cost$ SubCounter<5/QUEST> Sac<1/CARDNAME> | TgtPrompt$ Select target player. | ValidTgts$ Player | ChangeType$ Card | Origin$ Graveyard | Destination$ Library | Shuffle$ True | SpellDescription$ Target player shuffles their graveyard into their library. T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Card.nonToken+YouOwn | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever a card is put into your graveyard from anywhere, you may put a quest counter on CARDNAME. SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ QUEST | CounterNum$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHas:Ability$Counters SVar:MaxQuestEffect:5 SVar:Picture:http://www.wizards.com/global/images/magic/general/quest_for_ancient_secrets.jpg diff --git a/forge-gui/res/cardsfolder/q/quest_for_pure_flame.txt b/forge-gui/res/cardsfolder/q/quest_for_pure_flame.txt index 1f3035df4a2..19569b22dc4 100644 --- a/forge-gui/res/cardsfolder/q/quest_for_pure_flame.txt +++ b/forge-gui/res/cardsfolder/q/quest_for_pure_flame.txt @@ -8,7 +8,7 @@ SVar:DamageEvent:Event$ DamageDone | ValidSource$ Card.YouCtrl,Emblem.YouCtrl | SVar:DmgTwice:DB$ ReplaceEffect | VarName$ DamageAmount | VarValue$ X | References$ X SVar:X:ReplaceCount$DamageAmount/Twice SVar:PlayMain1:TRUE -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHas:Ability$Counters SVar:MaxQuestEffect:4 SVar:Picture:http://www.wizards.com/global/images/magic/general/quest_for_pure_flame.jpg diff --git a/forge-gui/res/cardsfolder/q/quest_for_the_holy_relic.txt b/forge-gui/res/cardsfolder/q/quest_for_the_holy_relic.txt index 1703dc1bfa8..86e5e6ff802 100644 --- a/forge-gui/res/cardsfolder/q/quest_for_the_holy_relic.txt +++ b/forge-gui/res/cardsfolder/q/quest_for_the_holy_relic.txt @@ -4,7 +4,7 @@ Types:Enchantment T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever you cast a creature spell, you may put a quest counter on CARDNAME. SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ QUEST | CounterNum$ 1 | SpellDescription$ Whenever you cast a creature spell, you may put a quest counter on CARDNAME. A:AB$ ChangeZone | Cost$ SubCounter<5/QUEST> Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | ChangeType$ Card.Equipment+YouOwn | ChangeNum$ 1 | AttachedTo$ Creature.YouCtrl | SpellDescription$ Search your library for an Equipment card, put it onto the battlefield, and attach it to a creature you control. Then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Equipment DeckHas:Ability$Counters SVar:MaxQuestEffect:5 diff --git a/forge-gui/res/cardsfolder/q/quest_for_the_nihil_stone.txt b/forge-gui/res/cardsfolder/q/quest_for_the_nihil_stone.txt index c126265ebf7..7fbf69e350c 100644 --- a/forge-gui/res/cardsfolder/q/quest_for_the_nihil_stone.txt +++ b/forge-gui/res/cardsfolder/q/quest_for_the_nihil_stone.txt @@ -7,7 +7,7 @@ SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ QUEST | Counte SVar:TrigLoseLife:DB$ LoseLife | Defined$ TriggeredPlayer | LifeAmount$ 5 SVar:CardsInHand:Count$ValidHand Card.ActivePlayerCtrl SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Ability$Discard SVar:MaxQuestEffect:2 SVar:Picture:http://www.wizards.com/global/images/magic/general/quest_for_the_nihil_stone.jpg diff --git a/forge-gui/res/cardsfolder/q/questing_phelddagrif.txt b/forge-gui/res/cardsfolder/q/questing_phelddagrif.txt index 85364bf04f1..6236f305780 100644 --- a/forge-gui/res/cardsfolder/q/questing_phelddagrif.txt +++ b/forge-gui/res/cardsfolder/q/questing_phelddagrif.txt @@ -8,6 +8,6 @@ A:AB$ Pump | Cost$ U | Defined$ Self | KW$ Flying | SubAbility$ DBDraw | SpellDe SVar:DBToken:DB$Token | ValidTgts$ Opponent | TokenAmount$ 1 | TokenName$ Hippo | TokenTypes$ Creature,Hippo | TokenOwner$ Opponent | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 SVar:DBGain:DB$GainLife | LifeAmount$ 2 | ValidTgts$ Opponent SVar:DBDraw:DB$Draw | NumCards$ 1 | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | OptionalDecider$ Opponent -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/questing_phelddagrif.jpg Oracle:{G}: Questing Phelddagrif gets +1/+1 until end of turn. Target opponent creates a 1/1 green Hippo creature token.\n{W}: Questing Phelddagrif gains protection from black and from red until end of turn. Target opponent gains 2 life.\n{U}: Questing Phelddagrif gains flying until end of turn. Target opponent may draw a card. diff --git a/forge-gui/res/cardsfolder/q/quickchange.txt b/forge-gui/res/cardsfolder/q/quickchange.txt index 43a1c61cbf5..3ae42041d20 100644 --- a/forge-gui/res/cardsfolder/q/quickchange.txt +++ b/forge-gui/res/cardsfolder/q/quickchange.txt @@ -4,7 +4,7 @@ Types:Instant A:SP$ ChooseColor | Cost$ 1 U | Defined$ You | OrColors$ True | SubAbility$ Animate | SpellDescription$ Target creature becomes the color or colors of your choice until end of turn. Draw a card. SVar:Animate:DB$ Animate | ValidTgts$ Creature | TgtPrompt$ Select target creature | Colors$ ChosenColor | OverwriteColors$ True | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/quickchange.jpg Oracle:Target creature becomes the color or colors of your choice until end of turn.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/q/quicken.txt b/forge-gui/res/cardsfolder/q/quicken.txt index 47dc52b2555..39aedb3af1e 100644 --- a/forge-gui/res/cardsfolder/q/quicken.txt +++ b/forge-gui/res/cardsfolder/q/quicken.txt @@ -6,6 +6,6 @@ SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card. SVar:QuickenStA:Mode$ Continuous | EffectZone$ Command | Affected$ Sorcery | AffectedZone$ Hand,Graveyard,Exile,Library | WithFlash$ You SVar:SpellCastTrig:Mode$ SpellCast | ValidCard$ Sorcery | ValidActivatingPlayer$ You | Execute$ Quickened | Static$ True | TriggerDescription$ The next sorcery card you cast this turn can be cast as though it had flash. SVar:Quickened:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/quicken.jpg Oracle:The next sorcery card you cast this turn can be cast as though it had flash. (It can be cast any time you could cast an instant.)\nDraw a card. diff --git a/forge-gui/res/cardsfolder/q/quickening_licid.txt b/forge-gui/res/cardsfolder/q/quickening_licid.txt index 8f63209701c..beacf259168 100644 --- a/forge-gui/res/cardsfolder/q/quickening_licid.txt +++ b/forge-gui/res/cardsfolder/q/quickening_licid.txt @@ -6,6 +6,6 @@ A:AB$ Animate | Cost$ W T | Defined$ Self | RemoveThisAbility$ True | Permanent$ SVar:DBAttach:DB$ Attach | ValidTgts$ Creature | AILogic$ Pump SVar:SPAttach:SP$ Attach | Cost$ 0 | ValidTgts$ Creature S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ First Strike | Description$ Enchanted creature has first strike. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/quickening_licid.jpg Oracle:{1}{W}, {T}: Quickening Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {W} to end this effect.\nEnchanted creature has first strike. diff --git a/forge-gui/res/cardsfolder/q/quicksilver_dragon.txt b/forge-gui/res/cardsfolder/q/quicksilver_dragon.txt index eb96db64a86..50047efd19d 100644 --- a/forge-gui/res/cardsfolder/q/quicksilver_dragon.txt +++ b/forge-gui/res/cardsfolder/q/quicksilver_dragon.txt @@ -5,6 +5,6 @@ PT:5/5 K:Flying K:Morph:4 U A:AB$ ChangeTargets | Cost$ U | TargetType$ Spell | ValidTgts$ Card | ConditionTargetValidTargeting$ Card.Self | ConditionTargetsSingleTarget$ True | TargetRestriction$ Creature.Other | SpellDescription$ If target spell has only one target and that target is CARDNAME, change that spell's target to another creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/quicksilver_dragon.jpg Oracle:Flying\n{U}: If target spell has only one target and that target is Quicksilver Dragon, change that spell's target to another creature.\nMorph {4}{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.) diff --git a/forge-gui/res/cardsfolder/q/quicksilver_elemental.txt b/forge-gui/res/cardsfolder/q/quicksilver_elemental.txt index 09e2f05538a..fe94220387d 100644 --- a/forge-gui/res/cardsfolder/q/quicksilver_elemental.txt +++ b/forge-gui/res/cardsfolder/q/quicksilver_elemental.txt @@ -5,6 +5,6 @@ PT:3/4 K:ManaConvert:Blue:All A:AB$ Effect | Cost$ U | ValidTgts$ Creature | TgtZone$ Battlefield | TgtPrompt$ Select target creature card | StaticAbilities$ STSteal | SVars$ STSteal | RememberObjects$ Targeted | SpellDescription$ CARDNAME gains all activated abilities of target creature until end of turn. SVar:STSteal:Mode$ Continuous | Affected$ EffectSource | EffectZone$ Command | GainsAbilitiesOf$ Creature.IsRemembered | GainsAbilitiesOfZones$ Library,Hand,Stack,Battlefield,Graveyard,Exile,Command | Description$ Quicksilver Elemental gains all activated abilities of that card until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/quicksilver_elemental.jpg Oracle:{U}: Quicksilver Elemental gains all activated abilities of target creature until end of turn. (If any of the abilities use that creature's name, use this creature's name instead.)\nYou may spend blue mana as though it were mana of any color to pay the activation costs of Quicksilver Elemental's abilities. diff --git a/forge-gui/res/cardsfolder/q/quicksilver_fountain.txt b/forge-gui/res/cardsfolder/q/quicksilver_fountain.txt index fa55c5d3dac..ef902bb6adf 100644 --- a/forge-gui/res/cardsfolder/q/quicksilver_fountain.txt +++ b/forge-gui/res/cardsfolder/q/quicksilver_fountain.txt @@ -8,6 +8,6 @@ SVar:STFlood:Mode$ Continuous | EffectZone$ Battlefield | Affected$ Card.Self+co T:Mode$ Phase | Phase$ End of Turn | CheckSVar$ X | SVarCompare$ EQ0 | TriggerZones$ Battlefield | Execute$ TrigRemoveAll | References$ X | TriggerDescription$ At the beginning of each end step, if all lands on the battlefield are Islands, remove all flood counters from them. SVar:TrigRemoveAll:DB$ RemoveCounterAll | ValidCards$ Land | CounterType$ FLOOD | AllCounters$ True SVar:X:Count$Valid Land.nonIsland -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/quicksilver_fountain.jpg Oracle:At the beginning of each player's upkeep, that player puts a flood counter on target non-Island land they control of their choice. That land is an Island for as long as it has a flood counter on it.\nAt the beginning of each end step, if all lands on the battlefield are Islands, remove all flood counters from them. diff --git a/forge-gui/res/cardsfolder/q/quiet_speculation.txt b/forge-gui/res/cardsfolder/q/quiet_speculation.txt index ae680ea4239..9d94f5b5456 100644 --- a/forge-gui/res/cardsfolder/q/quiet_speculation.txt +++ b/forge-gui/res/cardsfolder/q/quiet_speculation.txt @@ -2,6 +2,6 @@ Name:Quiet Speculation ManaCost:1 U Types:Sorcery A:SP$ChangeZone | Cost$ 1 U | Origin$ Library | Destination$ Graveyard | ValidTgts$ Player | ChangeType$ Card.withFlashback | ChangeNum$ 3 | SpellDescription$ Search target player's library for up to three cards with flashback and put them into that player's graveyard. Then the player shuffles their library. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/quiet_speculation.jpg Oracle:Search target player's library for up to three cards with flashback and put them into that player's graveyard. Then the player shuffles their library. diff --git a/forge-gui/res/cardsfolder/q/quillmane_baku.txt b/forge-gui/res/cardsfolder/q/quillmane_baku.txt index cbe29675587..b850e7b3c3d 100644 --- a/forge-gui/res/cardsfolder/q/quillmane_baku.txt +++ b/forge-gui/res/cardsfolder/q/quillmane_baku.txt @@ -7,6 +7,6 @@ SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ KI | CounterNum A:AB$ ChangeZone | Cost$ 1 T SubCounter | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Creature | ChangeNum$ 1 | References$ X | SpellDescription$ Return target creature with converted mana cost X or less to its owner's hand. SVar:X:Targeted$CardManaCost # We'll need to improve the script at some stage, especially if we add Hunter of Eyeblights or Razorfin Abolisher. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/quillmane_baku.jpg Oracle:Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Quillmane Baku.\n{1}, {T}, Remove X ki counters from Quillmane Baku: Return target creature with converted mana cost X or less to its owner's hand. diff --git a/forge-gui/res/cardsfolder/q/quillspike.txt b/forge-gui/res/cardsfolder/q/quillspike.txt index 3b799cf1f91..50f59b2eb3b 100644 --- a/forge-gui/res/cardsfolder/q/quillspike.txt +++ b/forge-gui/res/cardsfolder/q/quillspike.txt @@ -3,6 +3,6 @@ ManaCost:2 BG Types:Creature Beast PT:1/1 A:AB$ Pump | Cost$ BG SubCounter<1/M1M1/Creature/a creature you control> | NumAtt$ +3 | NumDef$ +3 | SpellDescription$ CARDNAME gets +3/+3 until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/quillspike.jpg Oracle:{B/G}, Remove a -1/-1 counter from a creature you control: Quillspike gets +3/+3 until end of turn. diff --git a/forge-gui/res/cardsfolder/q/quirion_dryad.txt b/forge-gui/res/cardsfolder/q/quirion_dryad.txt index 3c9c2552aff..c116bd9033b 100644 --- a/forge-gui/res/cardsfolder/q/quirion_dryad.txt +++ b/forge-gui/res/cardsfolder/q/quirion_dryad.txt @@ -5,7 +5,7 @@ PT:1/1 T:Mode$ SpellCast | ValidCard$ Card.White,Card.Blue,Card.Black,Card.Red | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever you cast a white, blue, black, or red spell, put a +1/+1 counter on CARDNAME. SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 SVar:BuffedBy:Card.White,Card.Blue,Card.Black,Card.Red -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$white|blue|black|red SVar:Picture:http://www.wizards.com/global/images/magic/general/quirion_dryad.jpg Oracle:Whenever you cast a white, blue, black, or red spell, put a +1/+1 counter on Quirion Dryad. diff --git a/forge-gui/res/cardsfolder/q/quirion_ranger.txt b/forge-gui/res/cardsfolder/q/quirion_ranger.txt index f3750b5758c..2a7608ac9c2 100644 --- a/forge-gui/res/cardsfolder/q/quirion_ranger.txt +++ b/forge-gui/res/cardsfolder/q/quirion_ranger.txt @@ -3,6 +3,6 @@ ManaCost:G Types:Creature Elf PT:1/1 A:AB$ Untap | Cost$ Return<1/Forest> | ValidTgts$ Creature | TgtPrompt$ Select target creature | ActivationLimit$ 1 | SpellDescription$ Untap target creature. Activate this ability only once each turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/quirion_ranger.jpg Oracle:Return a Forest you control to its owner's hand: Untap target creature. Activate this ability only once each turn. diff --git a/forge-gui/res/cardsfolder/r/radiant_destiny.txt b/forge-gui/res/cardsfolder/r/radiant_destiny.txt index e2e9375cc6f..bada3e430fe 100644 --- a/forge-gui/res/cardsfolder/r/radiant_destiny.txt +++ b/forge-gui/res/cardsfolder/r/radiant_destiny.txt @@ -6,7 +6,7 @@ K:ETBReplacement:Other:ChooseCT SVar:ChooseCT:DB$ ChooseType | Defined$ You | Type$ Creature | SpellDescription$ As CARDNAME enters the battlefield, choose a creature type. | AILogic$ MostProminentInComputerDeck S:Mode$ Continuous | Affected$ Creature.ChosenType+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Creatures you control of the chosen type get +1/+1. S:Mode$ Continuous | Affected$ Creature.ChosenType+YouCtrl | AddKeyword$ Vigilance | Condition$ Blessing | Description$ As long as you have the city's blessing, they also have vigilance. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/radiant_destiny.jpg Oracle:Ascend (If you control ten or more permanents, you get the city's blessing for the rest of the game.)\nAs Radiant Destiny enters the battlefield, choose a creature type.\nCreatures you control of the chosen type get +1/+1. As long as you have the city's blessing, they also have vigilance. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/r/radiant_essence.txt b/forge-gui/res/cardsfolder/r/radiant_essence.txt index 2ebaa1df5e4..4d6ba12463a 100644 --- a/forge-gui/res/cardsfolder/r/radiant_essence.txt +++ b/forge-gui/res/cardsfolder/r/radiant_essence.txt @@ -4,6 +4,6 @@ Types:Creature Spirit PT:2/3 S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 1 | AddToughness$ 2 | CheckSVar$ X | SVarCompare$ GE1 | References$ X | Description$ CARDNAME gets +1/+2 as long as an opponent controls a black permanent. SVar:X:Count$Valid Creature.OppCtrl+Black -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/radiant_essence.jpg Oracle:Radiant Essence gets +1/+2 as long as an opponent controls a black permanent. diff --git a/forge-gui/res/cardsfolder/r/radiant_flames.txt b/forge-gui/res/cardsfolder/r/radiant_flames.txt index dd36b3bbfc8..1b2c8960c77 100644 --- a/forge-gui/res/cardsfolder/r/radiant_flames.txt +++ b/forge-gui/res/cardsfolder/r/radiant_flames.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Sorcery A:SP$ DamageAll | Cost$ 2 R | NumDmg$ X | ValidCards$ Creature | ValidDescription$ each creature. | References$ X | SpellDescription$ Converge — CARDNAME deals X damage to each creature, where X is the number of colors of mana spent to cast CARDNAME. SVar:X:Count$Converge -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/radiant_flames.jpg Oracle:Converge — Radiant Flames deals X damage to each creature, where X is the number of colors of mana spent to cast Radiant Flames. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/r/radiant_kavu.txt b/forge-gui/res/cardsfolder/r/radiant_kavu.txt index c090a2392ab..788989de301 100644 --- a/forge-gui/res/cardsfolder/r/radiant_kavu.txt +++ b/forge-gui/res/cardsfolder/r/radiant_kavu.txt @@ -4,6 +4,6 @@ Types:Creature Kavu PT:3/3 A:AB$ Effect | Cost$ R G W | Name$ Radiant Kavu Effect | ReplacementEffects$ RPrevent | SpellDescription$ Prevent all combat damage blue creatures and black creatures would deal this turn. SVar:RPrevent:Event$ DamageDone | Prevent$ True | IsCombat$ True | ActiveZones$ Command | ValidSource$ Creature.Blue,Creature.Black | Description$ Prevent all combat damage blue creatures and black creatures would deal this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/radiant_kavu.jpg Oracle:{R}{G}{W}: Prevent all combat damage blue creatures and black creatures would deal this turn. diff --git a/forge-gui/res/cardsfolder/r/radiate.txt b/forge-gui/res/cardsfolder/r/radiate.txt index 8d76b7f64a1..6d3f57c4da2 100644 --- a/forge-gui/res/cardsfolder/r/radiate.txt +++ b/forge-gui/res/cardsfolder/r/radiate.txt @@ -2,6 +2,6 @@ Name:Radiate ManaCost:3 R R Types:Instant A:SP$ CopySpellAbility | Cost$ 3 R R | ValidTgts$ Instant,Sorcery | TargetType$ Spell | TargetsSingleTarget$ True | TargetValidTargeting$ Permanent,Player | Controller$ You | CopyForEachCanTarget$ True | CanTargetPlayer$ True | SpellDescription$ Choose target instant or sorcery spell that targets only a single permanent or player. Copy that spell for each other permanent or player the spell could target. Each copy targets a different one of those permanents and players. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/radiate.jpg Oracle:Choose target instant or sorcery spell that targets only a single permanent or player. Copy that spell for each other permanent or player the spell could target. Each copy targets a different one of those permanents and players. diff --git a/forge-gui/res/cardsfolder/r/ragamuffyn.txt b/forge-gui/res/cardsfolder/r/ragamuffyn.txt index 0fd91855074..1de86f97bc6 100644 --- a/forge-gui/res/cardsfolder/r/ragamuffyn.txt +++ b/forge-gui/res/cardsfolder/r/ragamuffyn.txt @@ -3,6 +3,6 @@ ManaCost:2 B Types:Creature Zombie Cleric PT:2/2 A:AB$ Draw | Cost$ T Sac<1/Creature;Land/creature or land> | PrecostDesc$ Hellbent — | NumCards$ 1 | Activation$ Hellbent | SpellDescription$ Draw a card. Activate this ability only if you have no cards in hand. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ragamuffyn.jpg Oracle:Hellbent — {T}, Sacrifice a creature or land: Draw a card. Activate this ability only if you have no cards in hand. diff --git a/forge-gui/res/cardsfolder/r/rage_extractor.txt b/forge-gui/res/cardsfolder/r/rage_extractor.txt index b24e21a83e6..2f4e126fac0 100644 --- a/forge-gui/res/cardsfolder/r/rage_extractor.txt +++ b/forge-gui/res/cardsfolder/r/rage_extractor.txt @@ -5,6 +5,6 @@ T:Mode$ SpellCast | ValidCard$ Card.CostsPhyrexianMana | ValidActivatingPlayer$ SVar:TrigDealDamage:DB$DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X SVar:X:TriggerCount$CastSACMC SVar:BuffedBy:Card.CostsPhyrexianMana -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rage_extractor.jpg Oracle:({P/R} can be paid with either {R} or 2 life.)\nWhenever you cast a spell with {P} in its mana cost, Rage Extractor deals damage equal to that spell's converted mana cost to any target. diff --git a/forge-gui/res/cardsfolder/r/rage_weaver.txt b/forge-gui/res/cardsfolder/r/rage_weaver.txt index f576ad29773..cb1cdc2f6e3 100644 --- a/forge-gui/res/cardsfolder/r/rage_weaver.txt +++ b/forge-gui/res/cardsfolder/r/rage_weaver.txt @@ -4,6 +4,6 @@ Types:Creature Human Wizard PT:2/1 A:AB$ Pump | Cost$ 2 | ValidTgts$ Creature.Black,Creature.Green | KW$ Haste | SpellDescription$ Target black or green creature gains haste until end of turn. | TgtPrompt$ Select target black or green creature. DeckHints:Color$Black|Green -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rage_weaver.jpg Oracle:{2}: Target black or green creature gains haste until end of turn. (It can attack and {T} this turn.) diff --git a/forge-gui/res/cardsfolder/r/ragnar.txt b/forge-gui/res/cardsfolder/r/ragnar.txt index 362a9a21046..0b884a274b0 100644 --- a/forge-gui/res/cardsfolder/r/ragnar.txt +++ b/forge-gui/res/cardsfolder/r/ragnar.txt @@ -3,6 +3,6 @@ ManaCost:G W U Types:Legendary Creature Human Cleric PT:2/2 A:AB$ Regenerate | Cost$ G W U T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Regenerate target creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ragnar.jpg Oracle:{G}{W}{U}, {T}: Regenerate target creature. diff --git a/forge-gui/res/cardsfolder/r/rain_of_daggers.txt b/forge-gui/res/cardsfolder/r/rain_of_daggers.txt index 077e98276a6..ebd09126241 100644 --- a/forge-gui/res/cardsfolder/r/rain_of_daggers.txt +++ b/forge-gui/res/cardsfolder/r/rain_of_daggers.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ DestroyAll | Cost$ 4 B B | ValidCards$ Creature | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | RememberDestroyed$ True | SubAbility$ DBLoseLife | SpellDescription$ Destroy all creatures target opponent controls. You lose 2 life for each creature destroyed this way. SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ X | References$ X SVar:X:Remembered$Amount.Twice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rain_of_daggers.jpg Oracle:Destroy all creatures target opponent controls. You lose 2 life for each creature destroyed this way. diff --git a/forge-gui/res/cardsfolder/r/rain_of_filth.txt b/forge-gui/res/cardsfolder/r/rain_of_filth.txt index 5dce8f447bb..0de46c6fe7e 100644 --- a/forge-gui/res/cardsfolder/r/rain_of_filth.txt +++ b/forge-gui/res/cardsfolder/r/rain_of_filth.txt @@ -3,6 +3,6 @@ ManaCost:B Types:Instant A:SP$ AnimateAll | Cost$ B | ValidCards$ Land.YouCtrl | Abilities$ ABMana | SpellDescription$ Until end of turn, lands you control gain "Sacrifice this land: Add {B}." SVar:ABMana:AB$ Mana | Cost$ Sac<1/CARDNAME> | Produced$ B | SpellDescription$ Add {B}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rain_of_filth.jpg Oracle:Until end of turn, lands you control gain "Sacrifice this land: Add {B}." diff --git a/forge-gui/res/cardsfolder/r/rain_of_gore.txt b/forge-gui/res/cardsfolder/r/rain_of_gore.txt index 7a6cc79a90d..6d7e0b0dbdb 100644 --- a/forge-gui/res/cardsfolder/r/rain_of_gore.txt +++ b/forge-gui/res/cardsfolder/r/rain_of_gore.txt @@ -5,6 +5,6 @@ R:Event$ GainLife | ActiveZones$ Battlefield | ValidSource$ Card | SourceControl SVar:RLoseLife:DB$ LoseLife | LifeAmount$ X | Defined$ ReplacedPlayer | References$ X SVar:X:ReplaceCount$LifeGained SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rain_of_gore.jpg Oracle:If a spell or ability would cause its controller to gain life, that player loses that much life instead. diff --git a/forge-gui/res/cardsfolder/r/rain_of_rust.txt b/forge-gui/res/cardsfolder/r/rain_of_rust.txt index 0e3ac5515db..c24405c5b58 100644 --- a/forge-gui/res/cardsfolder/r/rain_of_rust.txt +++ b/forge-gui/res/cardsfolder/r/rain_of_rust.txt @@ -5,6 +5,6 @@ K:Entwine:3 R A:SP$ Charm | Cost$ 3 R R | Choices$ DBDestroyArtifact,DBDestroyLand | CharmNum$ 1 SVar:DBDestroyArtifact:DB$ Destroy | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy target artifact. SVar:DBDestroyLand:DB$ Destroy | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Destroy target land. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rain_of_rust.jpg Oracle:Choose one —\n• Destroy target artifact.\n• Destroy target land.\nEntwine {3}{R} (Choose both if you pay the entwine cost.) diff --git a/forge-gui/res/cardsfolder/r/rainbow_crow.txt b/forge-gui/res/cardsfolder/r/rainbow_crow.txt index 12450fd392a..88a2b833e41 100644 --- a/forge-gui/res/cardsfolder/r/rainbow_crow.txt +++ b/forge-gui/res/cardsfolder/r/rainbow_crow.txt @@ -5,6 +5,6 @@ PT:2/2 K:Flying A:AB$ ChooseColor | Cost$ 1 | Defined$ You | SubAbility$ Animate | SpellDescription$ CARDNAME becomes the color of your choice until end of turn. SVar:Animate:DB$ Animate | Defined$ Self | Colors$ ChosenColor | OverwriteColors$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rainbow_crow.jpg Oracle:Flying\n{1}: Rainbow Crow becomes the color of your choice until end of turn. diff --git a/forge-gui/res/cardsfolder/r/rainbow_vale.txt b/forge-gui/res/cardsfolder/r/rainbow_vale.txt index 64b02c61863..6efdb2e2d6c 100644 --- a/forge-gui/res/cardsfolder/r/rainbow_vale.txt +++ b/forge-gui/res/cardsfolder/r/rainbow_vale.txt @@ -5,6 +5,6 @@ A:AB$ Mana | Cost$ T | Produced$ Any | SubAbility$ ValeTrig | SpellDescription$ SVar:ValeTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ ChooseOpp | TriggerDescription$ An opponent gains control of CARDNAME at the beginning of the next end step. SVar:ChooseOpp:DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | ChoiceTitle$ Choose an opponent to give control to: | AILogic$ Curse | SubAbility$ DonateTheVale SVar:DonateTheVale:DB$ GainControl | Defined$ Self | NewController$ Player.Chosen -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rainbow_vale.jpg Oracle:{T}: Add one mana of any color. An opponent gains control of Rainbow Vale at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/r/raka_sanctuary.txt b/forge-gui/res/cardsfolder/r/raka_sanctuary.txt index 0b727f415b9..383645702ad 100644 --- a/forge-gui/res/cardsfolder/r/raka_sanctuary.txt +++ b/forge-gui/res/cardsfolder/r/raka_sanctuary.txt @@ -7,7 +7,7 @@ SVar:DBDmg:DB$ DealDamage | Defined$ Targeted | NumDmg$ 3 | ConditionCheckSVar$ SVar:Y:Count$Valid Permanent.White+YouCtrl/LimitMax.1 SVar:Z:Count$Valid Permanent.Blue+YouCtrl/LimitMax.1 SVar:X:SVar$Y/Plus.Z -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Color$White|Blue SVar:Picture:http://www.wizards.com/global/images/magic/general/raka_sanctuary.jpg Oracle:At the beginning of your upkeep, if you control a white or blue permanent, Raka Sanctuary deals 1 damage to target creature. If you control a white permanent and a blue permanent, Raka Sanctuary deals 3 damage to that creature instead. diff --git a/forge-gui/res/cardsfolder/r/rakalite.txt b/forge-gui/res/cardsfolder/r/rakalite.txt index 8e1d9e859cd..46e80eac803 100644 --- a/forge-gui/res/cardsfolder/r/rakalite.txt +++ b/forge-gui/res/cardsfolder/r/rakalite.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ PreventDamage | Cost$ 2 | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | Amount$ 1 | SubAbility$ DBReturn | SpellDescription$ Prevent the next 1 damage that would be dealt to any target this turn. Return CARDNAME to its owner's hand at the beginning of the next end step. SVar:DBReturn:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigBounce | TriggerDescription$ Return CARDNAME to its owner's hand. SVar:TrigBounce:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Hand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rakalite.jpg Oracle:{2}: Prevent the next 1 damage that would be dealt to any target this turn. Return Rakalite to its owner's hand at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/r/rakavolver.txt b/forge-gui/res/cardsfolder/r/rakavolver.txt index e4c7af30b0a..97d65cbd7bd 100644 --- a/forge-gui/res/cardsfolder/r/rakavolver.txt +++ b/forge-gui/res/cardsfolder/r/rakavolver.txt @@ -12,7 +12,7 @@ SVar:VolverTrigGain:DB$ GainLife | Defined$ You | LifeAmount$ VolverX | Referenc SVar:VolverX:TriggerCount$DamageAmount SVar:VolverPumped:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | ETB$ True | SubAbility$ VolverLaunch | SpellDescription$ If CARDNAME was kicked with its {U} kicker, it enters the battlefield with a +1/+1 counter on it and with flying. SVar:VolverLaunch:DB$ Animate | Defined$ Self | Keywords$ Flying | Permanent$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$White|Blue DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/rakavolver.jpg diff --git a/forge-gui/res/cardsfolder/r/rakdos_augermage.txt b/forge-gui/res/cardsfolder/r/rakdos_augermage.txt index de96cc39998..5592d9dbedc 100644 --- a/forge-gui/res/cardsfolder/r/rakdos_augermage.txt +++ b/forge-gui/res/cardsfolder/r/rakdos_augermage.txt @@ -5,6 +5,6 @@ PT:3/2 K:First Strike A:AB$ Discard | Cost$ T | Defined$ You | ValidTgts$ Opponent | SorcerySpeed$ True | NumCards$ 1 | Mode$ RevealTgtChoose | SubAbility$ DBDiscard | SpellDescription$ Reveal your hand and discard a card of target opponent's choice. Then that player reveals their hand and discards a card of your choice. Activate this ability only any time you could cast a sorcery. SVar:DBDiscard:DB$ Discard | Defined$ ParentTarget | NumCards$ 1 | Mode$ RevealYouChoose -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rakdos_augermage.jpg Oracle:First strike\n{T}: Reveal your hand and discard a card of target opponent's choice. Then that player reveals their hand and discards a card of your choice. Activate this ability only any time you could cast a sorcery. diff --git a/forge-gui/res/cardsfolder/r/rakdos_charm.txt b/forge-gui/res/cardsfolder/r/rakdos_charm.txt index 606d2bcbc92..dfd29dedf2d 100644 --- a/forge-gui/res/cardsfolder/r/rakdos_charm.txt +++ b/forge-gui/res/cardsfolder/r/rakdos_charm.txt @@ -6,6 +6,6 @@ SVar:Exile:DB$ ChangeZoneAll | ValidTgts$ Player | TgtPrompt$ Select target play SVar:Smash:DB$ Destroy | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy target artifact. SVar:CreatureDamage:DB$ RepeatEach | RepeatCards$ Creature | RepeatSubAbility$ DBDamage | DamageMap$ True | SpellDescription$ Each creature deals 1 damage to its controller. SVar:DBDamage:DB$ DealDamage | Defined$ RememberedController | DamageSource$ Remembered | NumDmg$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rakdos_charm.jpg Oracle:Choose one —\n• Exile all cards from target player's graveyard.\n• Destroy target artifact.\n• Each creature deals 1 damage to its controller. diff --git a/forge-gui/res/cardsfolder/r/rakdos_cluestone.txt b/forge-gui/res/cardsfolder/r/rakdos_cluestone.txt index f32a7e712fc..b46444175fc 100644 --- a/forge-gui/res/cardsfolder/r/rakdos_cluestone.txt +++ b/forge-gui/res/cardsfolder/r/rakdos_cluestone.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. A:AB$ Draw | Cost$ B R T Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black|Red SVar:Picture:http://www.wizards.com/global/images/magic/general/rakdos_cluestone.jpg Oracle:{T}: Add {B} or {R}.\n{B}{R}, {T}, Sacrifice Rakdos Cluestone: Draw a card. diff --git a/forge-gui/res/cardsfolder/r/rakdos_keyrune.txt b/forge-gui/res/cardsfolder/r/rakdos_keyrune.txt index 57b67a6e267..63215fbadea 100644 --- a/forge-gui/res/cardsfolder/r/rakdos_keyrune.txt +++ b/forge-gui/res/cardsfolder/r/rakdos_keyrune.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. A:AB$ Animate | Cost$ B R | Defined$ Self | Power$ 3 | Toughness$ 1 | Types$ Artifact,Creature,Devil | Colors$ Black,Red | Keywords$ First Strike | SpellDescription$ CARDNAME becomes a 3/1 black and red Devil artifact creature with first strike until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black|Red SVar:Picture:http://www.wizards.com/global/images/magic/general/rakdos_keyrune.jpg Oracle:{T}: Add {B} or {R}.\n{B}{R}: Rakdos Keyrune becomes a 3/1 black and red Devil artifact creature with first strike until end of turn. diff --git a/forge-gui/res/cardsfolder/r/rakdos_riteknife.txt b/forge-gui/res/cardsfolder/r/rakdos_riteknife.txt index fa4a0c581c5..4fd8049a9ea 100644 --- a/forge-gui/res/cardsfolder/r/rakdos_riteknife.txt +++ b/forge-gui/res/cardsfolder/r/rakdos_riteknife.txt @@ -6,6 +6,6 @@ S:Mode$ Continuous | Affected$ Card.EquippedBy | AddPower$ X | References$ X | A SVar:RitualSac:AB$ PutCounter | Cost$ T Sac<1/Creature> | Defined$ OriginalHost | CounterType$ BLOOD | CounterNum$ 1 | SpellDescription$ Put a blood counter on Rakdos Riteknife. A:AB$ Sacrifice | Cost$ B R Sac<1/CARDNAME> | ValidTgts$ Player | SacValid$ Permanent | SacMessage$ Permanent | Amount$ X | References$ X | SpellDescription$ Target player sacrifices a permanent for each blood counter on CARDNAME. SVar:X:Count$CardCounters.BLOOD -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rakdos_riteknife.jpg Oracle:Equipped creature gets +1/+0 for each blood counter on Rakdos Riteknife and has "{T}, Sacrifice a creature: Put a blood counter on Rakdos Riteknife."\n{B}{R}, Sacrifice Rakdos Riteknife: Target player sacrifices a permanent for each blood counter on Rakdos Riteknife.\nEquip {2} diff --git a/forge-gui/res/cardsfolder/r/rakdos_signet.txt b/forge-gui/res/cardsfolder/r/rakdos_signet.txt index f7f30d36de4..7da49f1a727 100644 --- a/forge-gui/res/cardsfolder/r/rakdos_signet.txt +++ b/forge-gui/res/cardsfolder/r/rakdos_signet.txt @@ -2,6 +2,6 @@ Name:Rakdos Signet ManaCost:2 Types:Artifact A:AB$ Mana | Cost$ 1 T | Produced$ B R | SpellDescription$ Add {B}{R}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rakdos_signet.jpg Oracle:{1}, {T}: Add {B}{R}. diff --git a/forge-gui/res/cardsfolder/r/rakdos_the_defiler.txt b/forge-gui/res/cardsfolder/r/rakdos_the_defiler.txt index 941df6e3378..5506f1526a5 100644 --- a/forge-gui/res/cardsfolder/r/rakdos_the_defiler.txt +++ b/forge-gui/res/cardsfolder/r/rakdos_the_defiler.txt @@ -10,6 +10,6 @@ SVar:TrigSac:DB$ Sacrifice | Defined$ You | Amount$ X | References$ X | SacValid SVar:TrigSac2:DB$ Sacrifice | Defined$ TriggeredTarget | Amount$ Y | References$ Y | SacValid$ Permanent.nonDemon | SacMessage$ non-Demon Permanent SVar:X:Count$Valid Permanent.nonDemon+YouCtrl/HalfUp SVar:Y:TriggeredTarget$Valid Permanent.nonDemon+YouCtrl/HalfUp -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rakdos_the_defiler.jpg Oracle:Flying, trample\nWhenever Rakdos the Defiler attacks, sacrifice half the non-Demon permanents you control, rounded up.\nWhenever Rakdos deals combat damage to a player, that player sacrifices half the non-Demon permanents they control, rounded up. diff --git a/forge-gui/res/cardsfolder/r/raksha_golden_cub.txt b/forge-gui/res/cardsfolder/r/raksha_golden_cub.txt index b49b312a14c..d2692a64210 100644 --- a/forge-gui/res/cardsfolder/r/raksha_golden_cub.txt +++ b/forge-gui/res/cardsfolder/r/raksha_golden_cub.txt @@ -6,6 +6,6 @@ K:Vigilance S:Mode$ Continuous | Affected$ Creature.Cat+YouCtrl | AddPower$ 2 | AddToughness$ 2 | CheckSVar$ X | SVarCompare$ EQ1 | References$ X | AddKeyword$ Double Strike | Description$ As long as CARDNAME is equipped, Cat creatures you control get +2/+2 and have double strike. SVar:X:Count$Valid Card.Self+equipped SVar:EquipMe:Once -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/raksha_golden_cub.jpg Oracle:Vigilance\nAs long as Raksha Golden Cub is equipped, Cat creatures you control get +2/+2 and have double strike. diff --git a/forge-gui/res/cardsfolder/r/rally_the_ancestors.txt b/forge-gui/res/cardsfolder/r/rally_the_ancestors.txt index 8f748e8f24e..7071a655ade 100644 --- a/forge-gui/res/cardsfolder/r/rally_the_ancestors.txt +++ b/forge-gui/res/cardsfolder/r/rally_the_ancestors.txt @@ -7,6 +7,6 @@ SVar:TrigExile:DB$ ChangeZone | Defined$ DelayTriggerRemembered | Origin$ Battle SVar:ExileSelf:DB$ ChangeZone | Origin$ Stack | Destination$ Exile | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rally_the_ancestors.jpg Oracle:Return each creature card with converted mana cost X or less from your graveyard to the battlefield. Exile those creatures at the beginning of your next upkeep. Exile Rally the Ancestors. diff --git a/forge-gui/res/cardsfolder/r/rally_the_horde.txt b/forge-gui/res/cardsfolder/r/rally_the_horde.txt index 61e44a4481e..72d9c7492c6 100644 --- a/forge-gui/res/cardsfolder/r/rally_the_horde.txt +++ b/forge-gui/res/cardsfolder/r/rally_the_horde.txt @@ -10,6 +10,6 @@ SVar:X:Count$ValidExile Land.IsImprinted SVar:DBToken:DB$ Token | TokenAmount$ Y | References$ Y | TokenName$ Warrior | TokenTypes$ Creature,Warrior | TokenOwner$ You | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 | SubAbility$ DBCleanup | StackDescription$ None SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True SVar:Y:Count$ValidExile Card.IsRemembered+nonLand -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rally_the_horde.jpg Oracle:Exile the top card of your library. Exile the top card of your library. Exile the top card of your library. If the last card exiled isn't a land, repeat this process. Create a 1/1 red Warrior creature token for each nonland card exiled this way. diff --git a/forge-gui/res/cardsfolder/r/rally_the_righteous.txt b/forge-gui/res/cardsfolder/r/rally_the_righteous.txt index a661f59ddef..63c50c56f81 100644 --- a/forge-gui/res/cardsfolder/r/rally_the_righteous.txt +++ b/forge-gui/res/cardsfolder/r/rally_the_righteous.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Pump | Cost$ 1 R W | ValidTgts$ Creature | Radiance$ True | RememberTargets$ True | NumAtt$ 2 | SubAbility$ DBUntap | SpellDescription$ Radiance — Untap target creature and each other creature that shares a color with it. Those creatures get +2/+0 until end of turn. SVar:DBUntap:DB$ UntapAll | ValidCards$ Creature.SharesColorWith Remembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rally_the_righteous.jpg Oracle:Radiance — Untap target creature and each other creature that shares a color with it. Those creatures get +2/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/r/rally_the_troops.txt b/forge-gui/res/cardsfolder/r/rally_the_troops.txt index 2c63be67ace..3278643a72d 100644 --- a/forge-gui/res/cardsfolder/r/rally_the_troops.txt +++ b/forge-gui/res/cardsfolder/r/rally_the_troops.txt @@ -2,6 +2,6 @@ Name:Rally the Troops ManaCost:W Types:Instant A:SP$ UntapAll | Cost$ W | ValidCards$ Creature.YouCtrl | OpponentTurn$ True | ActivationPhases$ Declare Attackers | SpellDescription$ Cast CARDNAME only during the declare attackers step and only if you've been attacked this step. Untap all creatures you control. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rally_the_troops.jpg Oracle:Cast Rally the Troops only during the declare attackers step and only if you've been attacked this step.\nUntap all creatures you control. diff --git a/forge-gui/res/cardsfolder/r/ramosian_rally.txt b/forge-gui/res/cardsfolder/r/ramosian_rally.txt index f173c93d2bb..cac901e9d77 100644 --- a/forge-gui/res/cardsfolder/r/ramosian_rally.txt +++ b/forge-gui/res/cardsfolder/r/ramosian_rally.txt @@ -3,6 +3,6 @@ ManaCost:3 W Types:Instant A:SP$ PumpAll | Cost$ 3 W | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Creatures you control get +1/+1 until end of turn. A:SP$ PumpAll | Cost$ tapXType<1/Creature> | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | IsPresent$ Plains.YouCtrl | SpellDescription$ If you control a Plains, you may tap an untapped creature you control rather than pay CARDNAME's mana cost. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ramosian_rally.jpg Oracle:If you control a Plains, you may tap an untapped creature you control rather than pay Ramosian Rally's mana cost.\nCreatures you control get +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/r/rampant_elephant.txt b/forge-gui/res/cardsfolder/r/rampant_elephant.txt index cc40000d9c1..62851a275c6 100644 --- a/forge-gui/res/cardsfolder/r/rampant_elephant.txt +++ b/forge-gui/res/cardsfolder/r/rampant_elephant.txt @@ -3,7 +3,7 @@ ManaCost:3 W Types:Creature Elephant PT:2/2 A:AB$ MustBlock | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Target creature blocks CARDNAME this turn if able. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rampant_elephant.jpg Oracle:{G}: Target creature blocks Rampant Elephant this turn if able. diff --git a/forge-gui/res/cardsfolder/r/rank_and_file.txt b/forge-gui/res/cardsfolder/r/rank_and_file.txt index f5a55861382..2a7aebcc03c 100644 --- a/forge-gui/res/cardsfolder/r/rank_and_file.txt +++ b/forge-gui/res/cardsfolder/r/rank_and_file.txt @@ -5,6 +5,6 @@ PT:3/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ When CARDNAME enters the battlefield, green creatures get -1/-1 until end of turn. SVar:TrigPumpAll:DB$PumpAll | ValidCards$ Creature.Green | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rank_and_file.jpg Oracle:When Rank and File enters the battlefield, green creatures get -1/-1 until end of turn. diff --git a/forge-gui/res/cardsfolder/r/ransack.txt b/forge-gui/res/cardsfolder/r/ransack.txt index 7c7626fa1be..a6d48aae156 100644 --- a/forge-gui/res/cardsfolder/r/ransack.txt +++ b/forge-gui/res/cardsfolder/r/ransack.txt @@ -2,6 +2,6 @@ Name:Ransack ManaCost:3 U Types:Sorcery A:SP$ Dig | Cost$ 3 U | ValidTgts$ Player | DigNum$ 5 | AnyNumber$ True | DestinationZone$ Library | LibraryPosition2$ 0 | SpellDescription$ Look at the top five cards of target player's library. Put any number of them on the bottom of that library in any order and the rest on top of the library in any order. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ransack.jpg Oracle:Look at the top five cards of target player's library. Put any number of them on the bottom of that library in any order and the rest on top of the library in any order. diff --git a/forge-gui/res/cardsfolder/r/rapid_decay.txt b/forge-gui/res/cardsfolder/r/rapid_decay.txt index 78782412416..c01d326941c 100644 --- a/forge-gui/res/cardsfolder/r/rapid_decay.txt +++ b/forge-gui/res/cardsfolder/r/rapid_decay.txt @@ -3,6 +3,6 @@ ManaCost:1 B Types:Instant A:SP$ ChangeZone | Cost$ 1 B | TargetMin$ 0 | TargetMax$ 3 | TargetsFromSingleZone$ True | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SpellDescription$ Exile up to three target cards from a single graveyard. K:Cycling:2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rapid_decay.jpg Oracle:Exile up to three target cards from a single graveyard.\nCycling {2} ({2}, Discard this card: Draw a card.) diff --git a/forge-gui/res/cardsfolder/r/rapid_fire.txt b/forge-gui/res/cardsfolder/r/rapid_fire.txt index 59bbd6b3506..de4ac890c1e 100644 --- a/forge-gui/res/cardsfolder/r/rapid_fire.txt +++ b/forge-gui/res/cardsfolder/r/rapid_fire.txt @@ -4,6 +4,6 @@ Types:Instant Text:Cast CARDNAME only before blockers are declared. A:SP$ Pump | Cost$ 3 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ First Strike | ActivationPhases$ Upkeep->Declare Attackers | SubAbility$ DBPump | SpellDescription$ Target creature gains first strike until end of turn. If it doesn't have rampage, that creature gains rampage 2 until end of turn. (Whenever this creature becomes blocked, it gets +2/+2 until end of turn for each creature blocking it beyond the first.) SVar:DBPump:DB$Pump | Defined$ Targeted | KW$ Rampage:2 | ConditionDefined$ Targeted | ConditionPresent$ Creature.withoutRampage -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rapid_fire.jpg Oracle:Cast Rapid Fire only before blockers are declared.\nTarget creature gains first strike until end of turn. If it doesn't have rampage, that creature gains rampage 2 until end of turn. (Whenever this creature becomes blocked, it gets +2/+2 until end of turn for each creature blocking it beyond the first.) diff --git a/forge-gui/res/cardsfolder/r/rashka_the_slayer.txt b/forge-gui/res/cardsfolder/r/rashka_the_slayer.txt index ae7533ec76e..c6dee99a977 100644 --- a/forge-gui/res/cardsfolder/r/rashka_the_slayer.txt +++ b/forge-gui/res/cardsfolder/r/rashka_the_slayer.txt @@ -5,6 +5,6 @@ PT:3/3 K:Reach T:Mode$ Blocks | ValidCard$ Card.Self | ValidBlocked$ Creature.Black | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks one or more black creatures, CARDNAME gets +1/+2 until end of turn. SVar:TrigPump:DB$Pump | Defined$ Self | NumAtt$ 1 | NumDef$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rashka_the_slayer.jpg Oracle:Reach (This creature can block creatures with flying.)\nWhenever Rashka the Slayer blocks one or more black creatures, Rashka gets +1/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/r/rathi_assassin.txt b/forge-gui/res/cardsfolder/r/rathi_assassin.txt index 44875513cd2..00d79330d0d 100644 --- a/forge-gui/res/cardsfolder/r/rathi_assassin.txt +++ b/forge-gui/res/cardsfolder/r/rathi_assassin.txt @@ -4,6 +4,6 @@ Types:Creature Zombie Mercenary Assassin PT:2/2 A:AB$ ChangeZone | Cost$ 3 T | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Mercenary+cmcLE3 | ChangeNum$ 1 | SpellDescription$ Search your library for a Mercenary permanent card with converted mana cost 3 or less, put it onto the battlefield, then shuffle your library. A:AB$ Destroy | Cost$ 1 B B T | ValidTgts$ Creature.tapped+nonBlack | TgtPrompt$ Select target tapped nonblack creature | SpellDescription$ Destroy target tapped nonblack creature. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rathi_assassin.jpg Oracle:{1}{B}{B}, {T}: Destroy target tapped nonblack creature.\n{3}, {T}: Search your library for a Mercenary permanent card with converted mana cost 3 or less, put it onto the battlefield, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/r/rathi_fiend.txt b/forge-gui/res/cardsfolder/r/rathi_fiend.txt index 08b9204af77..1bfa0993135 100644 --- a/forge-gui/res/cardsfolder/r/rathi_fiend.txt +++ b/forge-gui/res/cardsfolder/r/rathi_fiend.txt @@ -5,6 +5,6 @@ PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ When CARDNAME enters the battlefield, each player loses 3 life. SVar:TrigLoseLife:DB$ LoseLife | Defined$ Player | LifeAmount$ 3 A:AB$ ChangeZone | Cost$ 3 T | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Mercenary+cmcLE3 | ChangeNum$ 1 | SpellDescription$ Search your library for a Mercenary permanent card with converted mana cost 3 or less, put it onto the battlefield, then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rathi_fiend.jpg Oracle:When Rathi Fiend enters the battlefield, each player loses 3 life.\n{3}, {T}: Search your library for a Mercenary permanent card with converted mana cost 3 or less, put it onto the battlefield, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/r/rathi_intimidator.txt b/forge-gui/res/cardsfolder/r/rathi_intimidator.txt index 617e38ad6d2..5fbeeeb4811 100644 --- a/forge-gui/res/cardsfolder/r/rathi_intimidator.txt +++ b/forge-gui/res/cardsfolder/r/rathi_intimidator.txt @@ -4,6 +4,6 @@ Types:Creature Horror Mercenary PT:2/1 K:Fear A:AB$ ChangeZone | Cost$ 2 T | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Mercenary+cmcLE2 | ChangeNum$ 1 | SpellDescription$ Search your library for a Mercenary permanent card with converted mana cost 2 or less, put it onto the battlefield, then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rathi_intimidator.jpg Oracle:Fear (This creature can't be blocked except by artifact creatures and/or black creatures.)\n{2}, {T}: Search your library for a Mercenary permanent card with converted mana cost 2 or less, put it onto the battlefield, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/r/raths_edge.txt b/forge-gui/res/cardsfolder/r/raths_edge.txt index d3de1b11da4..fe8b932280d 100644 --- a/forge-gui/res/cardsfolder/r/raths_edge.txt +++ b/forge-gui/res/cardsfolder/r/raths_edge.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Legendary Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ DealDamage | Cost$ 4 T Sac<1/Land> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to any target. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/raths_edge.jpg Oracle:{T}: Add {C}.\n{4}, {T}, Sacrifice a land: Rath's Edge deals 1 damage to any target. diff --git a/forge-gui/res/cardsfolder/r/rats_feast.txt b/forge-gui/res/cardsfolder/r/rats_feast.txt index b2084166fa0..96cd1c4b12a 100644 --- a/forge-gui/res/cardsfolder/r/rats_feast.txt +++ b/forge-gui/res/cardsfolder/r/rats_feast.txt @@ -4,7 +4,7 @@ Types:Sorcery A:SP$ ChangeZone | Cost$ X B | TargetMin$ 0 | TargetMax$ MaxTgts | TargetsFromSingleZone$ True | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | References$ X,MaxTgts | SpellDescription$ Exile X target cards from a single graveyard. SVar:X:Targeted$Amount SVar:MaxTgts:Count$TypeInYourYard.Creature -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rats_feast.jpg Oracle:Exile X target cards from a single graveyard. diff --git a/forge-gui/res/cardsfolder/r/rattleblaze_scarecrow.txt b/forge-gui/res/cardsfolder/r/rattleblaze_scarecrow.txt index 19412454135..75d4d12eea4 100644 --- a/forge-gui/res/cardsfolder/r/rattleblaze_scarecrow.txt +++ b/forge-gui/res/cardsfolder/r/rattleblaze_scarecrow.txt @@ -7,7 +7,7 @@ S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Haste | CheckSVar$ Y | SV SVar:X:Count$Valid Creature.YouCtrl+Black SVar:Y:Count$Valid Creature.YouCtrl+Red SVar:BuffedBy:Creature.Black,Creature.Red -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black|Red SVar:Picture:http://www.wizards.com/global/images/magic/general/rattleblaze_scarecrow.jpg Oracle:Rattleblaze Scarecrow has persist as long as you control a black creature. (When this creature dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.)\nRattleblaze Scarecrow has haste as long as you control a red creature. diff --git a/forge-gui/res/cardsfolder/r/raven_guild_initiate.txt b/forge-gui/res/cardsfolder/r/raven_guild_initiate.txt index ef1fbff17bd..b9ddeb8a530 100644 --- a/forge-gui/res/cardsfolder/r/raven_guild_initiate.txt +++ b/forge-gui/res/cardsfolder/r/raven_guild_initiate.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Creature Human Wizard PT:1/4 K:Morph:Return<1/Bird> -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/raven_guild_initiate.jpg Oracle:Morph—Return a Bird you control to its owner's hand. (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) diff --git a/forge-gui/res/cardsfolder/r/ravenous_trap.txt b/forge-gui/res/cardsfolder/r/ravenous_trap.txt index 3dd00235db5..adff251928e 100644 --- a/forge-gui/res/cardsfolder/r/ravenous_trap.txt +++ b/forge-gui/res/cardsfolder/r/ravenous_trap.txt @@ -4,6 +4,6 @@ Types:Instant Trap A:SP$ ChangeZoneAll | Cost$ 2 B B | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Player | TgtPrompt$ Select target player | ChangeType$ Card | SpellDescription$ Exile all cards from target player's graveyard. A:SP$ ChangeZoneAll | Cost$ 0 | CheckSVar$ CardsToGraveyard | SVarCompare$ GE3 | References$ CardsToGraveyard |Origin$ Graveyard | Destination$ Exile | ValidTgts$ Player | TgtPrompt$ Select target player | ChangeType$ Card | SpellDescription$ If an opponent had three or more cards put into their graveyard from anywhere this turn, you may pay {0} rather than pay CARDNAME's mana cost. SVar:CardsToGraveyard:Count$ThisTurnEntered_Graveyard_Card.YouDontCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ravenous_trap.jpg Oracle:If an opponent had three or more cards put into their graveyard from anywhere this turn, you may pay {0} rather than pay Ravenous Trap's mana cost.\nExile all cards from target player's graveyard. diff --git a/forge-gui/res/cardsfolder/r/ravenous_vampire.txt b/forge-gui/res/cardsfolder/r/ravenous_vampire.txt index 6b1711fc198..63e0d0cc253 100644 --- a/forge-gui/res/cardsfolder/r/ravenous_vampire.txt +++ b/forge-gui/res/cardsfolder/r/ravenous_vampire.txt @@ -8,6 +8,6 @@ SVar:TrigSacrifice:DB$ Sacrifice | Optional$ True | SacValid$ Creature.nonArtifa SVar:DBPutCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Creature.nonArtifact | ConditionCompare$ GE1 | SubAbility$ DBTap SVar:DBTap:DB$ Tap | Defined$ Self | ConditionDefined$ Remembered | ConditionPresent$ Creature.nonArtifact | ConditionCompare$ EQ0 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ravenous_vampire.jpg Oracle:Flying\nAt the beginning of your upkeep, you may sacrifice a nonartifact creature. If you do, put a +1/+1 counter on Ravenous Vampire. If you don't, tap Ravenous Vampire. diff --git a/forge-gui/res/cardsfolder/r/raving_oni_slave.txt b/forge-gui/res/cardsfolder/r/raving_oni_slave.txt index 542b28880a1..94eb0dd3b8d 100644 --- a/forge-gui/res/cardsfolder/r/raving_oni_slave.txt +++ b/forge-gui/res/cardsfolder/r/raving_oni_slave.txt @@ -5,6 +5,6 @@ PT:3/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ When CARDNAME enters the battlefield or leaves the battlefield, you lose 3 life if you don't control a Demon. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigLoseLife | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield or leaves the battlefield, you lose 3 life if you don't control a Demon. SVar:TrigLoseLife:DB$LoseLife | Defined$ You | LifeAmount$ 3 | ConditionPresent$ Demon.YouCtrl | ConditionCompare$ EQ0 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/raving_oni_slave.jpg Oracle:When Raving Oni-Slave enters the battlefield or leaves the battlefield, you lose 3 life if you don't control a Demon. diff --git a/forge-gui/res/cardsfolder/r/raze.txt b/forge-gui/res/cardsfolder/r/raze.txt index 298a0286b8d..48fb62f2165 100644 --- a/forge-gui/res/cardsfolder/r/raze.txt +++ b/forge-gui/res/cardsfolder/r/raze.txt @@ -2,6 +2,6 @@ Name:Raze ManaCost:R Types:Sorcery A:SP$ Destroy | Cost$ R Sac<1/Land> | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Destroy target land. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/raze.jpg Oracle:As an additional cost to cast Raze, sacrifice a land.\nDestroy target land. diff --git a/forge-gui/res/cardsfolder/r/razia_boros_archangel.txt b/forge-gui/res/cardsfolder/r/razia_boros_archangel.txt index ae97b5dad75..1aceb600e55 100644 --- a/forge-gui/res/cardsfolder/r/razia_boros_archangel.txt +++ b/forge-gui/res/cardsfolder/r/razia_boros_archangel.txt @@ -12,6 +12,6 @@ SVar:RaziaDmg:DB$ ReplaceSplitDamage | DamageTarget$ Imprinted | VarName$ X | Re SVar:OutOfSight:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.IsImprinted,Card.IsRemembered | Execute$ ExileEffect | Static$ True SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:X:Number$3 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/razia_boros_archangel.jpg Oracle:Flying, vigilance, haste\n{T}: The next 3 damage that would be dealt to target creature you control this turn is dealt to another target creature instead. diff --git a/forge-gui/res/cardsfolder/r/razias_purification.txt b/forge-gui/res/cardsfolder/r/razias_purification.txt index cb2d148138f..a2eb10b0535 100644 --- a/forge-gui/res/cardsfolder/r/razias_purification.txt +++ b/forge-gui/res/cardsfolder/r/razias_purification.txt @@ -5,6 +5,6 @@ A:SP$ RepeatEach | Cost$ 4 R W | RepeatPlayers$ Player | RepeatSubAbility$ DBCho SVar:DBChooseSac:DB$ ChooseCard | Defined$ Remembered | Choices$ Permanent.RememberedPlayerCtrl | Amount$ 3 | ChoiceTitle$ Choose three cards not to be sacrificed | RememberChosen$ True | Mandatory$ True SVar:DBSac:DB$ SacrificeAll | ValidCards$ Permanent.IsNotRemembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/razias_purification.jpg Oracle:Each player chooses three permanents they control, then sacrifices the rest. diff --git a/forge-gui/res/cardsfolder/r/razing_snidd.txt b/forge-gui/res/cardsfolder/r/razing_snidd.txt index 3f648707c5c..4b1adfaace1 100644 --- a/forge-gui/res/cardsfolder/r/razing_snidd.txt +++ b/forge-gui/res/cardsfolder/r/razing_snidd.txt @@ -6,7 +6,7 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creatu T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME enters the battlefield, each player sacrifices a land. SVar:TrigChange:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Hidden$ True | Mandatory$ True | ChangeType$ Creature.Black+YouCtrl,Creature.Red+YouCtrl | AILogic$ NeverBounceItself SVar:TrigSac:DB$ Sacrifice | Defined$ Player | SacValid$ Land -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NeedsToPlay:Creature.Black+cmcLE3+YouCtrl+inZoneBattlefield,Creature.Red+cmcLE3+YouCtrl+inZoneBattlefield SVar:Picture:http://www.wizards.com/global/images/magic/general/razing_snidd.jpg Oracle:When Razing Snidd enters the battlefield, return a black or red creature you control to its owner's hand.\nWhen Razing Snidd enters the battlefield, each player sacrifices a land. diff --git a/forge-gui/res/cardsfolder/r/razor_golem.txt b/forge-gui/res/cardsfolder/r/razor_golem.txt index 610c8281af7..a84579714dd 100644 --- a/forge-gui/res/cardsfolder/r/razor_golem.txt +++ b/forge-gui/res/cardsfolder/r/razor_golem.txt @@ -5,7 +5,7 @@ PT:3/4 K:Vigilance S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ Affinity for Plains (This spell costs {1} less to cast for each Plains you control.) SVar:X:Count$Valid Plains.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$white SVar:Picture:http://www.wizards.com/global/images/magic/general/razor_golem.jpg Oracle:Affinity for Plains (This spell costs {1} less to cast for each Plains you control.)\nVigilance diff --git a/forge-gui/res/cardsfolder/r/razor_pendulum.txt b/forge-gui/res/cardsfolder/r/razor_pendulum.txt index 93beed43b6b..3be0b38ee0b 100644 --- a/forge-gui/res/cardsfolder/r/razor_pendulum.txt +++ b/forge-gui/res/cardsfolder/r/razor_pendulum.txt @@ -3,6 +3,6 @@ ManaCost:4 Types:Artifact T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigDamage | LifeTotal$ ActivePlayer | LifeAmount$ LE5 | TriggerDescription$ At the beginning of each player's end step, if that player has 5 or less life, CARDNAME deals 2 damage to them. SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredPlayer | NumDmg$ 2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/razor_pendulum.jpg Oracle:At the beginning of each player's end step, if that player has 5 or less life, Razor Pendulum deals 2 damage to them. diff --git a/forge-gui/res/cardsfolder/r/razorjaw_oni.txt b/forge-gui/res/cardsfolder/r/razorjaw_oni.txt index 01022a52bd2..a141fb133d6 100644 --- a/forge-gui/res/cardsfolder/r/razorjaw_oni.txt +++ b/forge-gui/res/cardsfolder/r/razorjaw_oni.txt @@ -3,6 +3,6 @@ ManaCost:3 B Types:Creature Demon Spirit PT:4/5 S:Mode$ Continuous | Affected$ Creature.Black | AddHiddenKeyword$ CARDNAME can't block. | Description$ Black creatures can't block. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/razorjaw_oni.jpg Oracle:Black creatures can't block. diff --git a/forge-gui/res/cardsfolder/r/razormane_masticore.txt b/forge-gui/res/cardsfolder/r/razormane_masticore.txt index d9b6c22f906..bb2115e06ba 100644 --- a/forge-gui/res/cardsfolder/r/razormane_masticore.txt +++ b/forge-gui/res/cardsfolder/r/razormane_masticore.txt @@ -6,6 +6,6 @@ K:First Strike K:UpkeepCost:Discard<1/Card> T:Mode$ Phase | Phase$ Draw | ValidPlayer$ You | OptionalDecider$ You | Execute$ TrigDealDamage | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your draw step, you may have CARDNAME deal 3 damage to target creature. SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 3 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/razormane_masticore.jpg Oracle:First strike\nAt the beginning of your upkeep, sacrifice Razormane Masticore unless you discard a card.\nAt the beginning of your draw step, you may have Razormane Masticore deal 3 damage to target creature. diff --git a/forge-gui/res/cardsfolder/r/read_the_runes.txt b/forge-gui/res/cardsfolder/r/read_the_runes.txt index d126ba4b3d3..f8c36f4583e 100644 --- a/forge-gui/res/cardsfolder/r/read_the_runes.txt +++ b/forge-gui/res/cardsfolder/r/read_the_runes.txt @@ -6,6 +6,6 @@ SVar:DBRepeat:DB$ RepeatEach | UseImprinted$ True | RepeatCards$ Card.IsRemember SVar:DBDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | UnlessCost$ Sac<1/Permanent> | UnlessPayer$ You SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/read_the_runes.jpg Oracle:Draw X cards. For each card drawn this way, discard a card unless you sacrifice a permanent. diff --git a/forge-gui/res/cardsfolder/r/reality_anchor.txt b/forge-gui/res/cardsfolder/r/reality_anchor.txt index a24532df7ad..0846fb432ad 100644 --- a/forge-gui/res/cardsfolder/r/reality_anchor.txt +++ b/forge-gui/res/cardsfolder/r/reality_anchor.txt @@ -3,6 +3,6 @@ ManaCost:1 G Types:Instant A:SP$ Debuff | Cost$ 1 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | Keywords$ Shadow | SubAbility$ DBDraw | SpellDescription$ Target creature loses shadow until end of turn. Draw a card. SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/reality_anchor.jpg Oracle:Target creature loses shadow until end of turn.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/r/reality_ripple.txt b/forge-gui/res/cardsfolder/r/reality_ripple.txt index c5da49bb7f2..6db24af2a6d 100644 --- a/forge-gui/res/cardsfolder/r/reality_ripple.txt +++ b/forge-gui/res/cardsfolder/r/reality_ripple.txt @@ -2,6 +2,6 @@ Name:Reality Ripple ManaCost:1 U Types:Instant A:SP$Phases | Cost$ 1 U | ValidTgts$ Artifact,Creature,Land | TgtPrompt$ Select target artifact, creature or land | IsCurse$ True | SpellDescription$ Target artifact, creature, or land phases out. (While it's phased out, it's treated as though it doesn't exist. It phases in before its controller untaps during their next untap step.) -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/reality_ripple.jpg Oracle:Target artifact, creature, or land phases out. (While it's phased out, it's treated as though it doesn't exist. It phases in before its controller untaps during their next untap step.) diff --git a/forge-gui/res/cardsfolder/r/reality_spasm.txt b/forge-gui/res/cardsfolder/r/reality_spasm.txt index 5ae4278c3db..e7bf771e589 100644 --- a/forge-gui/res/cardsfolder/r/reality_spasm.txt +++ b/forge-gui/res/cardsfolder/r/reality_spasm.txt @@ -6,6 +6,6 @@ A:SP$ Untap | Cost$ X U U | TargetMin$ 0 | TargetMax$ MaxTgts | References$ X,Ma # It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) SVar:X:Targeted$Amount SVar:MaxTgts:Count$Valid Permanent -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/reality_spasm.jpg Oracle:Choose one —\n• Tap X target permanents.\n• Untap X target permanents. diff --git a/forge-gui/res/cardsfolder/r/reality_twist.txt b/forge-gui/res/cardsfolder/r/reality_twist.txt index 21194876476..66c104972ca 100644 --- a/forge-gui/res/cardsfolder/r/reality_twist.txt +++ b/forge-gui/res/cardsfolder/r/reality_twist.txt @@ -11,8 +11,8 @@ R:Event$ ProduceMana | ActiveZones$ Battlefield | ValidCard$ Mountain | ManaRepl SVar:ProduceW:C->W & B->W & G->W & R->W & U->W R:Event$ ProduceMana | ActiveZones$ Battlefield | ValidCard$ Forest | ManaReplacement$ ProduceB | Secondary$ True | Description$ If tapped for mana, Forests produce B. SVar:ProduceB:C->B & G->B & U->B & R->B & W->B -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/reality_twist.jpg Oracle:Cumulative upkeep {1}{U}{U} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nIf tapped for mana, Plains produce {R}, Swamps produce {G}, Mountains produce {W}, and Forests produce {B} instead of any other type. diff --git a/forge-gui/res/cardsfolder/r/realm_razer.txt b/forge-gui/res/cardsfolder/r/realm_razer.txt index 1de5476911d..7f4227c5fb9 100644 --- a/forge-gui/res/cardsfolder/r/realm_razer.txt +++ b/forge-gui/res/cardsfolder/r/realm_razer.txt @@ -7,6 +7,6 @@ SVar:TrigExile:DB$ ChangeZoneAll | ChangeType$ Land | Origin$ Battlefield | Dest T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Any | Execute$ TrigRecall | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME leaves the battlefield, return the exiled cards to the battlefield tapped under their owners' control. SVar:TrigRecall:DB$ ChangeZoneAll | ChangeType$ Remembered.ExiledWithSource | Origin$ Exile | Destination$ Battlefield | Tapped$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/realm_razer.jpg Oracle:When Realm Razer enters the battlefield, exile all lands.\nWhen Realm Razer leaves the battlefield, return the exiled cards to the battlefield tapped under their owners' control. diff --git a/forge-gui/res/cardsfolder/r/reap.txt b/forge-gui/res/cardsfolder/r/reap.txt index 4d5eea0e58e..487f28dc0ce 100644 --- a/forge-gui/res/cardsfolder/r/reap.txt +++ b/forge-gui/res/cardsfolder/r/reap.txt @@ -5,6 +5,6 @@ A:SP$ Pump | Cost$ 1 G | TgtPrompt$ Select target Opponent | ValidTgts$ Opponent SVar:GraveReap:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | TargetMin$ 0 | TargetMax$ NrBlackAtCasting | References$ NrBlackAtCasting | TgtPrompt$ Choose target card in your graveyard | ValidTgts$ Card.YouCtrl SVar:NrBlackAtCasting:Count$Valid Permanent.Black+TargetedPlayerCtrl SVar:AIPlayForSub:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/reap.jpg Oracle:Return up to X target cards from your graveyard to your hand, where X is the number of black permanents target opponent controls as you cast Reap. diff --git a/forge-gui/res/cardsfolder/r/reaper_king.txt b/forge-gui/res/cardsfolder/r/reaper_king.txt index 0f0bb8b3eb6..c11a3aba0ac 100644 --- a/forge-gui/res/cardsfolder/r/reaper_king.txt +++ b/forge-gui/res/cardsfolder/r/reaper_king.txt @@ -6,6 +6,6 @@ S:Mode$ Continuous | Affected$ Creature.Scarecrow+Other+YouCtrl | AddPower$ 1 | T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Scarecrow.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Whenever another Scarecrow enters the battlefield under your control, destroy target permanent. SVar:TrigDestroy:DB$Destroy | ValidTgts$ Permanent | TgtPrompt$ Select target permanent SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/reaper_king.jpg Oracle:Other Scarecrow creatures you control get +1/+1.\nWhenever another Scarecrow enters the battlefield under your control, destroy target permanent. diff --git a/forge-gui/res/cardsfolder/r/reaping_the_rewards.txt b/forge-gui/res/cardsfolder/r/reaping_the_rewards.txt index 509220b1fbc..12103bf249b 100644 --- a/forge-gui/res/cardsfolder/r/reaping_the_rewards.txt +++ b/forge-gui/res/cardsfolder/r/reaping_the_rewards.txt @@ -3,6 +3,6 @@ ManaCost:W Types:Instant K:Buyback:Sac<1/Land> A:SP$ GainLife | Cost$ W | LifeAmount$ 2 | SpellDescription$ You gain 2 life. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/reaping_the_rewards.jpg Oracle:Buyback—Sacrifice a land. (You may sacrifice a land in addition to any other costs as you cast this spell. If you do, put this card into your hand as it resolves.)\nYou gain 2 life. diff --git a/forge-gui/res/cardsfolder/r/rebellion_of_the_flamekin.txt b/forge-gui/res/cardsfolder/r/rebellion_of_the_flamekin.txt index e160b436c2c..1ee453988e9 100644 --- a/forge-gui/res/cardsfolder/r/rebellion_of_the_flamekin.txt +++ b/forge-gui/res/cardsfolder/r/rebellion_of_the_flamekin.txt @@ -5,6 +5,6 @@ T:Mode$ Clashed | ValidPlayer$ You | Won$ True | TriggerZones$ Battlefield | Opt SVar:TrigTokenW:AB$Token | Cost$ 1 | TokenOwner$ You | TokenAmount$ 1 | TokenName$ Elemental Shaman | TokenColors$ Red | TokenTypes$ Creature,Elemental,Shaman | TokenPower$ 3 | TokenToughness$ 1 | TokenKeywords$ Haste T:Mode$ Clashed | ValidPlayer$ You | Won$ False | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigTokenL | Secondary$ True | TriggerDescription$ Whenever you clash, you may pay {1}. If you do, create a 3/1 red Elemental Shaman creature token. If you won, that token gains haste until end of turn. (This ability triggers after the clash ends.) SVar:TrigTokenL:AB$Token | Cost$ 1 | TokenOwner$ You | TokenAmount$ 1 | TokenName$ Elemental Shaman | TokenColors$ Red | TokenTypes$ Creature,Elemental,Shaman | TokenPower$ 3 | TokenToughness$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rebellion_of_the_flamekin.jpg Oracle:Whenever you clash, you may pay {1}. If you do, create a 3/1 red Elemental Shaman creature token. If you won, that token gains haste until end of turn. (This ability triggers after the clash ends.) diff --git a/forge-gui/res/cardsfolder/r/reborn_hope.txt b/forge-gui/res/cardsfolder/r/reborn_hope.txt index 67be78f75fb..188595466a4 100644 --- a/forge-gui/res/cardsfolder/r/reborn_hope.txt +++ b/forge-gui/res/cardsfolder/r/reborn_hope.txt @@ -2,6 +2,6 @@ Name:Reborn Hope ManaCost:G W Types:Sorcery A:SP$ ChangeZone | Cost$ G W | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target multicolored card in your graveyard | ValidTgts$ Card.MultiColor+YouCtrl | SpellDescription$ Return target multicolored card from your graveyard to your hand. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/reborn_hope.jpg Oracle:Return target multicolored card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/r/rebound.txt b/forge-gui/res/cardsfolder/r/rebound.txt index 5876770624d..d43934c461c 100644 --- a/forge-gui/res/cardsfolder/r/rebound.txt +++ b/forge-gui/res/cardsfolder/r/rebound.txt @@ -2,6 +2,6 @@ Name:Rebound ManaCost:1 U Types:Instant A:SP$ ChangeTargets | Cost$ 1 U | TargetType$ Spell | ValidTgts$ Card | TargetValidTargeting$ Player | TargetsSingleTarget$ True | TargetRestriction$ Player | SpellDescription$ Change the target of target spell that targets only a player. The new target must be a player. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rebound.jpg Oracle:Change the target of target spell that targets only a player. The new target must be a player. diff --git a/forge-gui/res/cardsfolder/r/recall.txt b/forge-gui/res/cardsfolder/r/recall.txt index 2750fe67856..1c9cc1355df 100644 --- a/forge-gui/res/cardsfolder/r/recall.txt +++ b/forge-gui/res/cardsfolder/r/recall.txt @@ -7,6 +7,6 @@ SVar:DBExile:DB$ChangeZone | Origin$ Stack | Destination$ Exile | SubAbility$ Cl SVar:Cleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$xPaid SVar:Y:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/recall.jpg Oracle:Discard X cards, then return a card from your graveyard to your hand for each card discarded this way. Exile Recall. diff --git a/forge-gui/res/cardsfolder/r/recantation.txt b/forge-gui/res/cardsfolder/r/recantation.txt index 7be76b86530..a7d5095b61a 100644 --- a/forge-gui/res/cardsfolder/r/recantation.txt +++ b/forge-gui/res/cardsfolder/r/recantation.txt @@ -5,6 +5,6 @@ A:AB$ ChangeZone | Cost$ U Sac<1/CARDNAME> | Origin$ Battlefield | Destination$ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, you may put a verse counter on CARDNAME. SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ VERSE | CounterNum$ 1 SVar:X:Count$CardCounters.VERSE -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/recantation.jpg Oracle:At the beginning of your upkeep, you may put a verse counter on Recantation.\n{U}, Sacrifice Recantation: Return up to X target permanents to their owners' hands, where X is the number of verse counters on Recantation. diff --git a/forge-gui/res/cardsfolder/r/reckless_abandon.txt b/forge-gui/res/cardsfolder/r/reckless_abandon.txt index 96481df7134..340d90d3838 100644 --- a/forge-gui/res/cardsfolder/r/reckless_abandon.txt +++ b/forge-gui/res/cardsfolder/r/reckless_abandon.txt @@ -2,6 +2,6 @@ Name:Reckless Abandon ManaCost:R Types:Sorcery A:SP$ DealDamage | Cost$ R Sac<1/Creature> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to any target. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/reckless_abandon.jpg Oracle:As an additional cost to cast Reckless Abandon, sacrifice a creature.\nReckless Abandon deals 4 damage to target any target. diff --git a/forge-gui/res/cardsfolder/r/reckless_assault.txt b/forge-gui/res/cardsfolder/r/reckless_assault.txt index c96bb4a48ed..7701de705d3 100644 --- a/forge-gui/res/cardsfolder/r/reckless_assault.txt +++ b/forge-gui/res/cardsfolder/r/reckless_assault.txt @@ -2,7 +2,7 @@ Name:Reckless Assault ManaCost:2 B R Types:Enchantment A:AB$ DealDamage | Cost$ 1 PayLife<2> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to any target. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/reckless_assault.jpg Oracle:{1}, Pay 2 life: Reckless Assault deals 1 damage to any target. diff --git a/forge-gui/res/cardsfolder/r/reckless_one.txt b/forge-gui/res/cardsfolder/r/reckless_one.txt index 3b6b85016c5..5bf51007520 100644 --- a/forge-gui/res/cardsfolder/r/reckless_one.txt +++ b/forge-gui/res/cardsfolder/r/reckless_one.txt @@ -6,7 +6,7 @@ K:Haste S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | References$ X | Description$ CARDNAME's power and toughness are each equal to the number of Goblins on the battlefield. SVar:X:Count$Valid Goblin SVar:BuffedBy:Goblin -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NoZeroToughnessAI:True SVar:Picture:http://www.wizards.com/global/images/magic/general/reckless_one.jpg Oracle:Haste\nReckless One's power and toughness are each equal to the number of Goblins on the battlefield. diff --git a/forge-gui/res/cardsfolder/r/reclamation.txt b/forge-gui/res/cardsfolder/r/reclamation.txt index e04db6e2ea8..1ae7ebc14ca 100644 --- a/forge-gui/res/cardsfolder/r/reclamation.txt +++ b/forge-gui/res/cardsfolder/r/reclamation.txt @@ -2,6 +2,6 @@ Name:Reclamation ManaCost:2 G W Types:Enchantment S:Mode$ CantAttackUnless | ValidCard$ Creature.Black | Target$ Player,Planeswalker | Cost$ Sac<1/Land> | Description$ Black creatures can't attack unless their controller sacrifices a land for each black creature they control that's attacking. (This cost is paid as attackers are declared.) -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/reclamation.jpg Oracle:Black creatures can't attack unless their controller sacrifices a land for each black creature they control that's attacking. (This cost is paid as attackers are declared.) diff --git a/forge-gui/res/cardsfolder/r/reclusive_wight.txt b/forge-gui/res/cardsfolder/r/reclusive_wight.txt index 7ec2ef13655..bf68891962e 100644 --- a/forge-gui/res/cardsfolder/r/reclusive_wight.txt +++ b/forge-gui/res/cardsfolder/r/reclusive_wight.txt @@ -4,6 +4,6 @@ Types:Creature Zombie Minion PT:4/4 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Permanent.nonLand+YouCtrl | PresentCompare$ GE2 | Execute$ TrigSacrifice | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, if you control another nonland permanent, sacrifice CARDNAME. SVar:TrigSacrifice:AB$Sacrifice | Cost$ 0 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/reclusive_wight.jpg Oracle:At the beginning of your upkeep, if you control another nonland permanent, sacrifice Reclusive Wight. diff --git a/forge-gui/res/cardsfolder/r/reconnaissance.txt b/forge-gui/res/cardsfolder/r/reconnaissance.txt index 60f0e46664e..5074c5cec44 100644 --- a/forge-gui/res/cardsfolder/r/reconnaissance.txt +++ b/forge-gui/res/cardsfolder/r/reconnaissance.txt @@ -3,7 +3,7 @@ ManaCost:W Types:Enchantment A:AB$ RemoveFromCombat | Cost$ 0 | ValidTgts$ Creature.attacking+YouCtrl | TgtPrompt$ Select target attacking creature you control. | SubAbility$ DBUntap | SpellDescription$ Remove target attacking creature you control from combat and untap it. SVar:DBUntap:DB$ Untap | Defined$ Targeted -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/reconnaissance.jpg Oracle:{0}: Remove target attacking creature you control from combat and untap it. diff --git a/forge-gui/res/cardsfolder/r/recurring_insight.txt b/forge-gui/res/cardsfolder/r/recurring_insight.txt index bc0c6b5b2db..8a7a42284b9 100644 --- a/forge-gui/res/cardsfolder/r/recurring_insight.txt +++ b/forge-gui/res/cardsfolder/r/recurring_insight.txt @@ -5,6 +5,6 @@ K:Rebound A:SP$ Pump | Cost$ 4 U U | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | SubAbility$ DBDraw | StackDescription$ None | SpellDescription$ Draw cards equal to the number of cards in target opponent's hand. SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ X | References$ X SVar:X:TargetedPlayer$CardsInHand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/recurring_insight.jpg Oracle:Draw cards equal to the number of cards in target opponent's hand.\nRebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) diff --git a/forge-gui/res/cardsfolder/r/recycle.txt b/forge-gui/res/cardsfolder/r/recycle.txt index 253856fc6e4..c52f2afbce5 100644 --- a/forge-gui/res/cardsfolder/r/recycle.txt +++ b/forge-gui/res/cardsfolder/r/recycle.txt @@ -6,6 +6,6 @@ S:Mode$ Continuous | Affected$ You | SetMaxHandSize$ 2 | Description$ Your maxim T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever you play a card, draw a card. T:Mode$ LandPlayed | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDraw | Secondary$ True | TriggerDescription$ Whenever you play a card, draw a card. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/recycle.jpg Oracle:Skip your draw step.\nWhenever you play a card, draw a card.\nYour maximum hand size is two. diff --git a/forge-gui/res/cardsfolder/r/red_elemental_blast.txt b/forge-gui/res/cardsfolder/r/red_elemental_blast.txt index 05ce591446c..fc79483218f 100644 --- a/forge-gui/res/cardsfolder/r/red_elemental_blast.txt +++ b/forge-gui/res/cardsfolder/r/red_elemental_blast.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Charm | Cost$ R | Choices$ DBCounter,DBDestroy | CharmNum$ 1 SVar:DBCounter:DB$ Counter | TargetType$ Spell | ValidTgts$ Card.Blue | SpellDescription$ Counter target blue spell. SVar:DBDestroy:DB$ Destroy | ValidTgts$ Permanent.Blue | TgtPrompt$ Select target blue permanent | SpellDescription$ Destroy target blue permanent. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/red_elemental_blast.jpg Oracle:Choose one —\n• Counter target blue spell.\n• Destroy target blue permanent. diff --git a/forge-gui/res/cardsfolder/r/red_mana_battery.txt b/forge-gui/res/cardsfolder/r/red_mana_battery.txt index 7dd070427b8..b6c2b5319fd 100644 --- a/forge-gui/res/cardsfolder/r/red_mana_battery.txt +++ b/forge-gui/res/cardsfolder/r/red_mana_battery.txt @@ -6,6 +6,6 @@ A:AB$ Mana | Cost$ T SubCounter | Produced$ R | Amount$ Y | References SVar:Y:Number$1/Plus.ChosenX SVar:X:XChoice #ChosenX SVar created by Cost payment -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/red_mana_battery.jpg Oracle:{2}, {T}: Put a charge counter on Red Mana Battery.\n{T}, Remove any number of charge counters from Red Mana Battery: Add {R}, then add an additional {R} for each charge counter removed this way. diff --git a/forge-gui/res/cardsfolder/r/red_scarab.txt b/forge-gui/res/cardsfolder/r/red_scarab.txt index d2c4548415d..a9f92492093 100644 --- a/forge-gui/res/cardsfolder/r/red_scarab.txt +++ b/forge-gui/res/cardsfolder/r/red_scarab.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ W | ValidTgts$ Creature | AILogic$ Pump S:Mode$ CantBlockBy | ValidAttacker$ Creature.EnchantedBy | ValidBlocker$ Creature.Red | Description$ Enchanted creature can't be blocked by red creatures. S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 2 | AddToughness$ 2 | IsPresent$ Permanent.Red+OppCtrl | Description$ Enchanted creature gets +2/+2 as long as an opponent controls a red permanent. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/red_scarab.jpg Oracle:Enchant creature\nEnchanted creature can't be blocked by red creatures.\nEnchanted creature gets +2/+2 as long as an opponent controls a red permanent. diff --git a/forge-gui/res/cardsfolder/r/red_ward.txt b/forge-gui/res/cardsfolder/r/red_ward.txt index e0b69edc17b..326d58cef70 100644 --- a/forge-gui/res/cardsfolder/r/red_ward.txt +++ b/forge-gui/res/cardsfolder/r/red_ward.txt @@ -4,6 +4,6 @@ Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ W | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Protection:Card.Red:Protection from red:Card.CardUID_HostCardUID | Description$ Enchanted creature has protection from red. This effect doesn't remove CARDNAME. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/red_ward.jpg Oracle:Enchant creature\nEnchanted creature has protection from red. This effect doesn't remove Red Ward. diff --git a/forge-gui/res/cardsfolder/r/redeem.txt b/forge-gui/res/cardsfolder/r/redeem.txt index 7e412046e8b..85b7d004dea 100644 --- a/forge-gui/res/cardsfolder/r/redeem.txt +++ b/forge-gui/res/cardsfolder/r/redeem.txt @@ -2,6 +2,6 @@ Name:Redeem ManaCost:1 W Types:Instant A:SP$ Pump | Cost$ 1 W | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Select up to two target creatures | ValidTgts$ Creature | KW$ Prevent all damage that would be dealt to CARDNAME. | SpellDescription$ Prevent all damage that would be dealt this turn to up to two target creatures. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/redeem.jpg Oracle:Prevent all damage that would be dealt this turn to up to two target creatures. diff --git a/forge-gui/res/cardsfolder/r/redirect.txt b/forge-gui/res/cardsfolder/r/redirect.txt index 31cc0afdc40..f38f3bad3e9 100644 --- a/forge-gui/res/cardsfolder/r/redirect.txt +++ b/forge-gui/res/cardsfolder/r/redirect.txt @@ -2,5 +2,5 @@ Name:Redirect ManaCost:U U Types:Instant A:SP$ ChangeTargets | Cost$ U U | TargetType$ Spell | Optional$ True | ValidTgts$ Card | SpellDescription$ You may choose new targets for target spell. -SVar:RemAIDeck:True +AI:RemoveDeck:All Oracle:You may choose new targets for target spell. diff --git a/forge-gui/res/cardsfolder/r/reduce_to_dreams.txt b/forge-gui/res/cardsfolder/r/reduce_to_dreams.txt index b2d72507689..8733520a365 100644 --- a/forge-gui/res/cardsfolder/r/reduce_to_dreams.txt +++ b/forge-gui/res/cardsfolder/r/reduce_to_dreams.txt @@ -2,6 +2,6 @@ Name:Reduce to Dreams ManaCost:3 U U Types:Sorcery A:SP$ ChangeZoneAll | Cost$ 3 U U | ChangeType$ Artifact,Enchantment | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return all artifacts and enchantments to their owners' hands. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/reduce_to_dreams.jpg Oracle:Return all artifacts and enchantments to their owners' hands. diff --git a/forge-gui/res/cardsfolder/r/reef_shaman.txt b/forge-gui/res/cardsfolder/r/reef_shaman.txt index f47c69b6356..d3841326805 100644 --- a/forge-gui/res/cardsfolder/r/reef_shaman.txt +++ b/forge-gui/res/cardsfolder/r/reef_shaman.txt @@ -4,6 +4,6 @@ Types:Creature Merfolk Shaman PT:0/2 A:AB$ ChooseType | Cost$ T | Defined$ You | Type$ Basic Land | SubAbility$ DBAnimate | SpellDescription$ Target land becomes the basic land type of your choice until end of turn. SVar:DBAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/reef_shaman.jpg Oracle:{T}: Target land becomes the basic land type of your choice until end of turn. diff --git a/forge-gui/res/cardsfolder/r/reflect_damage.txt b/forge-gui/res/cardsfolder/r/reflect_damage.txt index 89c2878a51f..c6c59f31d15 100644 --- a/forge-gui/res/cardsfolder/r/reflect_damage.txt +++ b/forge-gui/res/cardsfolder/r/reflect_damage.txt @@ -7,6 +7,6 @@ SVar:SelflessDamage:Event$ DamageDone | ValidSource$ Card.ChosenCard,Emblem.Chos SVar:SelflessDmg:DB$ ReplaceEffect | VarName$ Affected | VarValue$ ReplacedSourceController | VarType$ Player | SubAbility$ ExileEffect SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile | Static$ True SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/reflect_damage.jpg Oracle:The next time a source of your choice would deal damage this turn, that damage is dealt to that source's controller instead. diff --git a/forge-gui/res/cardsfolder/r/reflecting_mirror.txt b/forge-gui/res/cardsfolder/r/reflecting_mirror.txt index 362f7711099..17b674bb566 100644 --- a/forge-gui/res/cardsfolder/r/reflecting_mirror.txt +++ b/forge-gui/res/cardsfolder/r/reflecting_mirror.txt @@ -2,7 +2,7 @@ Name:Reflecting Mirror ManaCost:4 Types:Artifact A:AB$ ChangeTargets | Cost$ X T | References$ X | TargetType$ Spell | ValidTgts$ Card | TargetValidTargeting$ You | TargetsSingleTarget$ True | TargetRestriction$ Player | SpellDescription$ Change the target of target spell with a single target if that target is you. The new target must be a player. X is twice the converted mana cost of that spell. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:X:Targeted$CardManaCost/Twice SVar:Picture:http://www.wizards.com/global/images/magic/general/reflecting_mirror.jpg Oracle:{X}, {T}: Change the target of target spell with a single target if that target is you. The new target must be a player. X is twice the converted mana cost of that spell. diff --git a/forge-gui/res/cardsfolder/r/refuse_cooperate.txt b/forge-gui/res/cardsfolder/r/refuse_cooperate.txt index 47a9e16b1b2..3faa79eb7d1 100644 --- a/forge-gui/res/cardsfolder/r/refuse_cooperate.txt +++ b/forge-gui/res/cardsfolder/r/refuse_cooperate.txt @@ -6,7 +6,7 @@ A:SP$ Pump | Cost$ 3 R | ValidTgts$ Card | TgtZone$ Stack | TgtPrompt$ Select ta SVar:DBDmg:DB$ DealDamage | Defined$ TargetedController | NumDmg$ X | References$ X SVar:X:Targeted$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/refuse_cooperate.jpg Oracle:Refuse deals damage to target spell's controller equal to that spell's converted mana cost. diff --git a/forge-gui/res/cardsfolder/r/reign_of_chaos.txt b/forge-gui/res/cardsfolder/r/reign_of_chaos.txt index 5f41a2a3517..0db5267bb8e 100644 --- a/forge-gui/res/cardsfolder/r/reign_of_chaos.txt +++ b/forge-gui/res/cardsfolder/r/reign_of_chaos.txt @@ -6,6 +6,6 @@ SVar:DBDestroy1:DB$ Destroy | ValidTgts$ Plains | TgtPrompt$ Select target Plain SVar:DBDestroy2:DB$ Destroy | ValidTgts$ Island | TgtPrompt$ Select target Island | SubAbility$ DBDestroyBlue | SpellDescription$ Destroy target Island and target blue creature. SVar:DBDestroyWhite:DB$ Destroy | ValidTgts$ Creature.White | TgtPrompt$ Select target white creature SVar:DBDestroyBlue:DB$ Destroy | ValidTgts$ Creature.Blue | TgtPrompt$ Select target blue creature -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/reign_of_chaos.jpg Oracle:Choose one —\n• Destroy target Plains and target white creature.\n• Destroy target Island and target blue creature. diff --git a/forge-gui/res/cardsfolder/r/reign_of_terror.txt b/forge-gui/res/cardsfolder/r/reign_of_terror.txt index b54244bf31c..cbfa5d033c3 100644 --- a/forge-gui/res/cardsfolder/r/reign_of_terror.txt +++ b/forge-gui/res/cardsfolder/r/reign_of_terror.txt @@ -7,7 +7,7 @@ SVar:DestroyGreen:DB$ DestroyAll | ValidCards$ Creature.Green | NoRegen$ True | SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ X | Defined$ You | SubAbility$ DBCleanup | References$ X SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$RememberedSize/Twice -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/reign_of_terror.jpg Oracle:Destroy all green creatures or all white creatures. They can't be regenerated. You lose 2 life for each creature that died this way. diff --git a/forge-gui/res/cardsfolder/r/reincarnation.txt b/forge-gui/res/cardsfolder/r/reincarnation.txt index 24262b0ab91..09aa98122a7 100644 --- a/forge-gui/res/cardsfolder/r/reincarnation.txt +++ b/forge-gui/res/cardsfolder/r/reincarnation.txt @@ -5,6 +5,6 @@ A:SP$ Effect | Cost$ 1 G G | ValidTgts$ Creature | TgtPrompt$ Choose target crea SVar:TargetDies:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.IsRemembered | Execute$ Reincarnate | TriggerController$ You | TriggerDescription$ When the target of Reincarnate dies this turn, return a creature card from its owner's graveyard to the battlefield under the control of that creature's owner. SVar:Reincarnate:DB$ ChangeZone | ChangeType$ Creature.sharesOwnerWith Remembered | Origin$ Graveyard | Destination$ Battlefield | Mandatory$ True | ChangeNum$ 1 | Hidden$ True | SubAbility$ ExileEffect SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/reincarnation.jpg Oracle:Choose target creature. When that creature dies this turn, return a creature card from its owner's graveyard to the battlefield under the control of that creature's owner. diff --git a/forge-gui/res/cardsfolder/r/reins_of_power.txt b/forge-gui/res/cardsfolder/r/reins_of_power.txt index b3963855e3f..ee85f3be60b 100644 --- a/forge-gui/res/cardsfolder/r/reins_of_power.txt +++ b/forge-gui/res/cardsfolder/r/reins_of_power.txt @@ -6,6 +6,6 @@ SVar:DBUnTapYours:DB$ UntapAll | ValidCards$ Creature.YouCtrl | RememberUntapped SVar:DBGainCtrl:DB$ GainControl | AllValid$ Creature.IsRemembered+RememberedPlayerCtrl | AddKWs$ Haste | NewController$ You | LoseControl$ EOT | ForgetControlled$ True | StackDescription$ None | SubAbility$ DBGainCtrlOpp SVar:DBGainCtrlOpp:DB$ GainControl | AllValid$ Creature.IsRemembered+YouCtrl | AddKWs$ Haste | NewController$ Player.IsRemembered | LoseControl$ EOT | StackDescription$ None | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/reins_of_power.jpg Oracle:Untap all creatures you control and all creatures target opponent controls. You and that opponent each gain control of all creatures the other controls until end of turn. Those creatures gain haste until end of turn. diff --git a/forge-gui/res/cardsfolder/r/reins_of_the_vinesteed.txt b/forge-gui/res/cardsfolder/r/reins_of_the_vinesteed.txt index 20f00cd6cc7..6e8318c6841 100644 --- a/forge-gui/res/cardsfolder/r/reins_of_the_vinesteed.txt +++ b/forge-gui/res/cardsfolder/r/reins_of_the_vinesteed.txt @@ -9,7 +9,7 @@ SVar:TrigReturnOwner:DB$ Pump | RememberObjects$ TriggeredCard | SubAbility$ DBR SVar:DBReturnChoose:DB$ ChooseCard | Choices$ Creature.sharesCreatureTypeWith Remembered+CanBeEnchantedBy | ChoiceTitle$ Choose a creature shares a creature type with the former enchanted creature | SubAbility$ DBReturn SVar:DBReturn:DB$ ChangeZone | Defined$ Self | Origin$ Graveyard | Destination$ Battlefield | AttachedTo$ ChosenCard | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/reins_of_the_vinesteed.jpg Oracle:Enchant creature\nEnchanted creature gets +2/+2.\nWhen enchanted creature dies, you may return Reins of the Vinesteed from your graveyard to the battlefield attached to a creature that shares a creature type with that creature. diff --git a/forge-gui/res/cardsfolder/r/reiterate.txt b/forge-gui/res/cardsfolder/r/reiterate.txt index 29f9b5ebc3f..5636ba43cc9 100644 --- a/forge-gui/res/cardsfolder/r/reiterate.txt +++ b/forge-gui/res/cardsfolder/r/reiterate.txt @@ -3,6 +3,6 @@ ManaCost:1 R R Types:Instant K:Buyback:3 A:SP$ CopySpellAbility | Cost$ 1 R R | ValidTgts$ Instant,Sorcery | TargetType$ Spell | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/reiterate.jpg Oracle:Buyback {3} (You may pay an additional {3} as you cast this spell. If you do, put this card into your hand as it resolves.)\nCopy target instant or sorcery spell. You may choose new targets for the copy. diff --git a/forge-gui/res/cardsfolder/r/reito_lantern.txt b/forge-gui/res/cardsfolder/r/reito_lantern.txt index 3b808682b8c..f28add6d895 100644 --- a/forge-gui/res/cardsfolder/r/reito_lantern.txt +++ b/forge-gui/res/cardsfolder/r/reito_lantern.txt @@ -2,6 +2,6 @@ Name:Reito Lantern ManaCost:2 Types:Artifact A:AB$ ChangeZone | Cost$ 3 | ValidTgts$ Card | TgtPrompt$ Select target card in a graveyard | Origin$ Graveyard | Destination$ Library | LibraryPosition$ -1 | SpellDescription$ Put target card from a graveyard on the bottom of its owner's library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/reito_lantern.jpg Oracle:{3}: Put target card from a graveyard on the bottom of its owner's library. diff --git a/forge-gui/res/cardsfolder/r/reiver_demon.txt b/forge-gui/res/cardsfolder/r/reiver_demon.txt index b694b91a291..127b0fd9716 100644 --- a/forge-gui/res/cardsfolder/r/reiver_demon.txt +++ b/forge-gui/res/cardsfolder/r/reiver_demon.txt @@ -5,6 +5,6 @@ PT:6/6 K:Flying T:Mode$ ChangesZone | ValidCard$ Card.wasCastFromHand+Self | Destination$ Battlefield | Execute$ TrigDestroyAll | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it from your hand, destroy all nonartifact, nonblack creatures. They can't be regenerated. SVar:TrigDestroyAll:DB$ DestroyAll | ValidCards$ Creature.nonArtifact+nonBlack | NoRegen$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/reiver_demon.jpg Oracle:Flying\nWhen Reiver Demon enters the battlefield, if you cast it from your hand, destroy all nonartifact, nonblack creatures. They can't be regenerated. diff --git a/forge-gui/res/cardsfolder/r/relic_barrier.txt b/forge-gui/res/cardsfolder/r/relic_barrier.txt index c90c5523add..4bc3cb8d499 100644 --- a/forge-gui/res/cardsfolder/r/relic_barrier.txt +++ b/forge-gui/res/cardsfolder/r/relic_barrier.txt @@ -2,6 +2,6 @@ Name:Relic Barrier ManaCost:2 Types:Artifact A:AB$ Tap | Cost$ T | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Tap target artifact. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/relic_barrier.jpg Oracle:{T}: Tap target artifact. diff --git a/forge-gui/res/cardsfolder/r/relic_bind.txt b/forge-gui/res/cardsfolder/r/relic_bind.txt index 2ab309c4483..f8ecd72f6cc 100644 --- a/forge-gui/res/cardsfolder/r/relic_bind.txt +++ b/forge-gui/res/cardsfolder/r/relic_bind.txt @@ -7,7 +7,7 @@ T:Mode$ Taps | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ SVar:TrigCharm:DB$ Charm | Choices$ DBDamage,DBGain SVar:DBDamage:DB$ DealDamage | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target player or planeswalker. SVar:DBGain:DB$ GainLife | ValidTgts$ Player | TgtPrompt$ Select target player | LifeAmount$ 1 | SpellDescription$ Target player gains 1 life. -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHas:Ability$LifeGain SVar:Picture:http://www.wizards.com/global/images/magic/general/relic_bind.jpg Oracle:Enchant artifact an opponent controls\nWhenever enchanted artifact becomes tapped, choose one —\n• Relic Bind deals 1 damage to target player or planeswalker.\n• Target player gains 1 life. diff --git a/forge-gui/res/cardsfolder/r/relic_of_progenitus.txt b/forge-gui/res/cardsfolder/r/relic_of_progenitus.txt index 75203b747c2..0f8c0ad1a21 100644 --- a/forge-gui/res/cardsfolder/r/relic_of_progenitus.txt +++ b/forge-gui/res/cardsfolder/r/relic_of_progenitus.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ ChangeZone | Cost$ T | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Player | DefinedPlayer$ Targeted | Mandatory$ True | ChangeType$ Card | ChangeNum$ 1 | Hidden$ True | IsCurse$ True | Chooser$ Targeted | SpellDescription$ Target player exiles a card from their graveyard. A:AB$ ChangeZoneAll | Cost$ 1 Exile<1/CARDNAME> | Origin$ Graveyard | Destination$ Exile | ChangeType$ Card | AILogic$ ExileGraveyards | SubAbility$ DBDraw | SpellDescription$ Exile all cards from all graveyards. Draw a card. SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/relic_of_progenitus.jpg Oracle:{T}: Target player exiles a card from their graveyard.\n{1}, Exile Relic of Progenitus: Exile all cards from all graveyards. Draw a card. diff --git a/forge-gui/res/cardsfolder/r/relic_putrescence.txt b/forge-gui/res/cardsfolder/r/relic_putrescence.txt index cb9581e76f3..266f8ae31c8 100644 --- a/forge-gui/res/cardsfolder/r/relic_putrescence.txt +++ b/forge-gui/res/cardsfolder/r/relic_putrescence.txt @@ -5,6 +5,6 @@ K:Enchant artifact A:SP$ Attach | Cost$ 2 B | ValidTgts$ Artifact | AILogic$ Curse T:Mode$ Taps | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigPoison | TriggerDescription$ Whenever enchanted artifact becomes tapped, its controller gets a poison counter. SVar:TrigPoison:DB$ Poison | Defined$ TriggeredCardController | Num$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/relic_putrescence.jpg Oracle:Enchant artifact\nWhenever enchanted artifact becomes tapped, its controller gets a poison counter. diff --git a/forge-gui/res/cardsfolder/r/relic_ward.txt b/forge-gui/res/cardsfolder/r/relic_ward.txt index fe449bc7e0f..0ad49c780ec 100644 --- a/forge-gui/res/cardsfolder/r/relic_ward.txt +++ b/forge-gui/res/cardsfolder/r/relic_ward.txt @@ -5,6 +5,6 @@ K:MayFlashSac K:Enchant artifact A:SP$ Attach | Cost$ 1 W | ValidTgts$ Artifact | AILogic$ Pump S:Mode$ Continuous | Affected$ Artifact.EnchantedBy | AddKeyword$ Shroud | Description$ Enchanted artifact has shroud. (It can't be the target of spells or abilities.) -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/relic_ward.jpg Oracle:You may cast Relic Ward as though it had flash. If you cast it any time a sorcery couldn't have been cast, the controller of the permanent it becomes sacrifices it at the beginning of the next cleanup step.\nEnchant artifact\nEnchanted artifact has shroud. (It can't be the target of spells or abilities.) diff --git a/forge-gui/res/cardsfolder/r/remedy.txt b/forge-gui/res/cardsfolder/r/remedy.txt index 1b2b9750051..3ecfcb007bf 100644 --- a/forge-gui/res/cardsfolder/r/remedy.txt +++ b/forge-gui/res/cardsfolder/r/remedy.txt @@ -2,6 +2,6 @@ Name:Remedy ManaCost:1 W Types:Instant A:SP$ PreventDamage | Cost$ 1 W | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target to prevent damage to | Amount$ 5 | TargetMin$ 1 | TargetMax$ 5 | DividedAsYouChoose$ 5 | SpellDescription$ Prevent the next 5 damage that would be dealt this turn to any number of targets, divided as you choose. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/remedy.jpg Oracle:Prevent the next 5 damage that would be dealt this turn to any number of targets, divided as you choose. diff --git a/forge-gui/res/cardsfolder/r/reminisce.txt b/forge-gui/res/cardsfolder/r/reminisce.txt index a1ee010c2b7..d02e7350d12 100644 --- a/forge-gui/res/cardsfolder/r/reminisce.txt +++ b/forge-gui/res/cardsfolder/r/reminisce.txt @@ -2,6 +2,6 @@ Name:Reminisce ManaCost:2 U Types:Sorcery A:SP$ ChangeZoneAll | Cost$ 2 U | ValidTgts$ Player | TgtPrompt$ Select target player | Origin$ Graveyard | Destination$ Library | ChangeType$ Card | Shuffle$ True | SpellDescription$ Target player shuffles their graveyard into their library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/reminisce.jpg Oracle:Target player shuffles their graveyard into their library. diff --git a/forge-gui/res/cardsfolder/r/remote_farm.txt b/forge-gui/res/cardsfolder/r/remote_farm.txt index 946d9ad8daf..10be03636dd 100644 --- a/forge-gui/res/cardsfolder/r/remote_farm.txt +++ b/forge-gui/res/cardsfolder/r/remote_farm.txt @@ -6,6 +6,6 @@ SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | SubAbility$ DBAddCounter | SVar:DBAddCounter:DB$ PutCounter | Defined$ Self | ETB$ True | CounterType$ DEPLETION | CounterNum$ 2 A:AB$ Mana | Cost$ T SubCounter<1/DEPLETION> | Produced$ W | SubAbility$ DBSac | Amount$ 2 | SpellDescription$ Add {W}{W}. If there are no depletion counters on CARDNAME, sacrifice it. SVar:DBSac:DB$ Sacrifice | SacValid$ Self | ConditionPresent$ Card.Self+counters_EQ0_DEPLETION -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://wizards.com/global/images/magic/general/remote_farm.jpg Oracle:Remote Farm enters the battlefield tapped with two depletion counters on it.\n{T}, Remove a depletion counter from Remote Farm: Add {W}{W}. If there are no depletion counters on Remote Farm, sacrifice it. diff --git a/forge-gui/res/cardsfolder/r/remove_enchantments.txt b/forge-gui/res/cardsfolder/r/remove_enchantments.txt index f8fac6a51a1..3ae7c1b209d 100644 --- a/forge-gui/res/cardsfolder/r/remove_enchantments.txt +++ b/forge-gui/res/cardsfolder/r/remove_enchantments.txt @@ -3,6 +3,6 @@ ManaCost:W Types:Instant A:SP$ ChangeZoneAll | Cost$ W | ChangeType$ Card.Enchantment+YouCtrl+YouOwn,Card.Aura+YouOwn+AttachedTo Permanent.YouCtrl,Card.Aura+YouOwn+AttachedTo Creature.attacking+OppCtrl | UseAllOriginZones$ True | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBDestroyEnchantments | SpellDescription$ Return to your hand all enchantments you both own and control, all Auras you own attached to permanents you control, and all Auras you own attached to attacking creatures your opponents control. Then destroy all other enchantments you control, all other Auras attached to permanents you control, and all other Auras attached to attacking creatures your opponents control. SVar:DBDestroyEnchantments:DB$ DestroyAll | ValidCards$ Card.Enchantment+YouCtrl,Card.Aura+AttachedTo Permanent.YouCtrl,Card.Aura+AttachedTo Creature.attacking+OppCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/remove_enchantments.jpg Oracle:Return to your hand all enchantments you both own and control, all Auras you own attached to permanents you control, and all Auras you own attached to attacking creatures your opponents control. Then destroy all other enchantments you control, all other Auras attached to permanents you control, and all other Auras attached to attacking creatures your opponents control. diff --git a/forge-gui/res/cardsfolder/r/rend_spirit.txt b/forge-gui/res/cardsfolder/r/rend_spirit.txt index 545d0e8d677..a87fd950816 100644 --- a/forge-gui/res/cardsfolder/r/rend_spirit.txt +++ b/forge-gui/res/cardsfolder/r/rend_spirit.txt @@ -2,6 +2,6 @@ Name:Rend Spirit ManaCost:2 B Types:Instant A:SP$ Destroy | Cost$ 2 B | ValidTgts$ Creature.Spirit | TgtPrompt$ Select target Spirit | SpellDescription$ Destroy target Spirit. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rend_spirit.jpg Oracle:Destroy target Spirit. diff --git a/forge-gui/res/cardsfolder/r/rending_volley.txt b/forge-gui/res/cardsfolder/r/rending_volley.txt index 150e863753d..0ae0ad367d7 100644 --- a/forge-gui/res/cardsfolder/r/rending_volley.txt +++ b/forge-gui/res/cardsfolder/r/rending_volley.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Instant K:CARDNAME can't be countered. A:SP$ DealDamage | Cost$ R | ValidTgts$ Creature.White,Creature.Blue | NumDmg$ 4 | TgtPrompt$ Select target white or blue creature. | SpellDescription$ CARDNAME deals 4 damage to target white or blue creature. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rending_volley.jpg Oracle:Rending Volley can't be countered by spells or abilities.\nRending Volley deals 4 damage to target white or blue creature. diff --git a/forge-gui/res/cardsfolder/r/renewing_dawn.txt b/forge-gui/res/cardsfolder/r/renewing_dawn.txt index e7da9618771..a9ff8498f72 100644 --- a/forge-gui/res/cardsfolder/r/renewing_dawn.txt +++ b/forge-gui/res/cardsfolder/r/renewing_dawn.txt @@ -3,6 +3,6 @@ ManaCost:1 W Types:Sorcery A:SP$ GainLife | Cost$ 1 W | LifeAmount$ X | References$ X | SpellDescription$ You gain 2 life for each Mountain target opponent controls. SVar:X:Count$TypeOppCtrl.Mountain/Times.2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://serv2.tcgimages.eu/img/cards/Portal/renewing_dawn.jpg Oracle:You gain 2 life for each Mountain target opponent controls. diff --git a/forge-gui/res/cardsfolder/r/renounce.txt b/forge-gui/res/cardsfolder/r/renounce.txt index 23e12c4e584..43f892be05b 100644 --- a/forge-gui/res/cardsfolder/r/renounce.txt +++ b/forge-gui/res/cardsfolder/r/renounce.txt @@ -6,6 +6,6 @@ SVar:DBGainLife:DB$GainLife | LifeAmount$ LifeX | References$ LifeX | SubAbility SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:SacX:Count$Valid Permanent.YouCtrl SVar:LifeX:Remembered$Amount.Twice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/renounce.jpg Oracle:Sacrifice any number of permanents. You gain 2 life for each permanent sacrificed this way. diff --git a/forge-gui/res/cardsfolder/r/renowned_weaponsmith.txt b/forge-gui/res/cardsfolder/r/renowned_weaponsmith.txt index 1f0320ec0ea..8e74eeafd15 100644 --- a/forge-gui/res/cardsfolder/r/renowned_weaponsmith.txt +++ b/forge-gui/res/cardsfolder/r/renowned_weaponsmith.txt @@ -5,6 +5,6 @@ PT:1/3 A:AB$ Mana | Cost$ T | Produced$ C | Amount$ 2 | RestrictValid$ Card.Artifact,Activated.Artifact | SpellDescription$ Add {C}{C}. Spend this mana only to cast artifact spells or activate abilities of artifacts. A:AB$ ChangeZone | Cost$ U T | Origin$ Library | Destination$ Hand| ChangeType$ Card.namedHeart-Piercer Bow,Card.namedVial of Dragonfire | ChangeNum$ 1 | StackDescription$ SpellDescription | SpellDescription$ Search your library for a card named Heart-Piercer Bow or Vial of Dragonfire, put it into your hand, then shuffle your library. DeckHints:Name$Heart-Piercer Bow|Vial of Dragonfire -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/renowned_weaponsmith.jpg Oracle:{T}: Add {C}{C}. Spend this mana only to cast artifact spells or activate abilities of artifacts.\n{U}, {T}: Search your library for a card named Heart-Piercer Bow or Vial of Dragonfire, reveal it, put it into your hand, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/r/repel_intruders.txt b/forge-gui/res/cardsfolder/r/repel_intruders.txt index e5cfd2dcecc..0dd773da2f8 100644 --- a/forge-gui/res/cardsfolder/r/repel_intruders.txt +++ b/forge-gui/res/cardsfolder/r/repel_intruders.txt @@ -3,6 +3,6 @@ ManaCost:3 WU Types:Instant A:SP$ Token | Cost$ 3 WU | TokenImage$ w 1 1 kithkin soldier SHM | TokenAmount$ 2 | TokenName$ Kithkin Soldier | TokenTypes$ Creature,Kithkin,Soldier | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | ConditionManaSpent$ W | SubAbility$ UPaid | SpellDescription$ Create two 1/1 white Kithkin Soldier creatures if {W} was spent to cast CARDNAME. Counter up to one target creature spell if {U} was spent to cast CARDNAME. (Do both if {W}{U} was spent.) SVar:UPaid:DB$ Counter | TargetType$ Spell | TgtPrompt$ Select target Creature spell | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Creature | ConditionManaSpent$ U -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/repel_intruders.jpg Oracle:Create two 1/1 white Kithkin Soldier creatures if {W} was spent to cast Repel Intruders. Counter up to one target creature spell if {U} was spent to cast Repel Intruders. (Do both if {W}{U} was spent.) diff --git a/forge-gui/res/cardsfolder/r/repel_the_abominable.txt b/forge-gui/res/cardsfolder/r/repel_the_abominable.txt index 3e6cb194f48..c370475990d 100644 --- a/forge-gui/res/cardsfolder/r/repel_the_abominable.txt +++ b/forge-gui/res/cardsfolder/r/repel_the_abominable.txt @@ -3,6 +3,6 @@ ManaCost:1 W Types:Instant A:SP$ Effect | Cost$ 1 W | Name$ Repel the Abominable Effect | ReplacementEffects$ RPrevent | SpellDescription$ Prevent all damage that would be dealt this turn by non-Human sources. SVar:RPrevent:Event$ DamageDone | Prevent$ True | ValidSource$ Card.nonHuman,Emblem | ActiveZones$ Command | Description$ Prevent all damage that would be dealt this turn by non-Human sources. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/repel_the_abominable.jpg Oracle:Prevent all damage that would be dealt this turn by non-Human sources. diff --git a/forge-gui/res/cardsfolder/r/repentance.txt b/forge-gui/res/cardsfolder/r/repentance.txt index dac502feab8..7614e6c4d8e 100644 --- a/forge-gui/res/cardsfolder/r/repentance.txt +++ b/forge-gui/res/cardsfolder/r/repentance.txt @@ -3,6 +3,6 @@ ManaCost:2 W Types:Sorcery A:SP$ DealDamage | Cost$ 2 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | DamageSource$ Targeted | NumDmg$ X | References$ X | SpellDescription$ Target creature deals damage to itself equal to its power. SVar:X:Targeted$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/repentance.jpg Oracle:Target creature deals damage to itself equal to its power. diff --git a/forge-gui/res/cardsfolder/r/repercussion.txt b/forge-gui/res/cardsfolder/r/repercussion.txt index f0583d6e664..367940876e4 100644 --- a/forge-gui/res/cardsfolder/r/repercussion.txt +++ b/forge-gui/res/cardsfolder/r/repercussion.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ DamageDoneOnce | ValidTarget$ Creature | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a creature is dealt damage, CARDNAME deals that much damage to that creature's controller. SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredTargetController | NumDmg$ X | References$ X SVar:X:TriggerCount$DamageAmount -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/repercussion.jpg Oracle:Whenever a creature is dealt damage, Repercussion deals that much damage to that creature's controller. diff --git a/forge-gui/res/cardsfolder/r/repopulate.txt b/forge-gui/res/cardsfolder/r/repopulate.txt index 4a1b9ff127b..d017e4e2d48 100644 --- a/forge-gui/res/cardsfolder/r/repopulate.txt +++ b/forge-gui/res/cardsfolder/r/repopulate.txt @@ -3,6 +3,6 @@ ManaCost:1 G Types:Instant A:SP$ ChangeZoneAll | Cost$ 1 G | Origin$ Graveyard | Destination$ Library | ValidTgts$ Player | TgtPrompt$ Select target player | ChangeType$ Creature | Shuffle$ True | SpellDescription$ Shuffle all creature cards from target player's graveyard into that player's library. K:Cycling:2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/repopulate.jpg Oracle:Shuffle all creature cards from target player's graveyard into that player's library.\nCycling {2} ({2}, Discard this card: Draw a card.) diff --git a/forge-gui/res/cardsfolder/r/reprocess.txt b/forge-gui/res/cardsfolder/r/reprocess.txt index 6b3d468806d..bb32f20f6f2 100644 --- a/forge-gui/res/cardsfolder/r/reprocess.txt +++ b/forge-gui/res/cardsfolder/r/reprocess.txt @@ -6,6 +6,6 @@ SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ DrawX | References$ DrawX | SubA SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:SacX:Count$Valid Artifact.YouCtrl,Creature.YouCtrl,Land.YouCtrl SVar:DrawX:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/reprocess.jpg Oracle:Sacrifice any number of artifacts, creatures, and/or lands. Draw a card for each permanent sacrificed this way. diff --git a/forge-gui/res/cardsfolder/r/reroute.txt b/forge-gui/res/cardsfolder/r/reroute.txt index bf77d9d1c5d..d1866b0f7b2 100644 --- a/forge-gui/res/cardsfolder/r/reroute.txt +++ b/forge-gui/res/cardsfolder/r/reroute.txt @@ -3,6 +3,6 @@ ManaCost:1 R Types:Instant A:SP$ ChangeTargets | Cost$ 1 R | TargetType$ Activated | ValidTgts$ Card | TgtPrompt$ Select target Activated Ability | TargetsSingleTarget$ True | SubAbility$ DBDraw | SpellDescription$ Change the target of target activated ability with a single target. (Mana abilities can't be targeted.) Draw a card. SVar:DBDraw:DB$ Draw | NumCards$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/reroute.jpg Oracle:Change the target of target activated ability with a single target. (Mana abilities can't be targeted.)\nDraw a card. diff --git a/forge-gui/res/cardsfolder/r/rescue_from_the_underworld.txt b/forge-gui/res/cardsfolder/r/rescue_from_the_underworld.txt index 1f8f1bcab6d..437fa701899 100644 --- a/forge-gui/res/cardsfolder/r/rescue_from_the_underworld.txt +++ b/forge-gui/res/cardsfolder/r/rescue_from_the_underworld.txt @@ -6,6 +6,6 @@ SVar:DBDelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Y SVar:MoveToPlay:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ DelayTriggerRemembered | GainControl$ True SVar:DBExile:DB$ ChangeZone | Defined$ Self | Origin$ Stack | Destination$ Exile | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rescue_from_the_underworld.jpg Oracle:As an additional cost to cast Rescue from the Underworld, sacrifice a creature.\nChoose target creature card in your graveyard. Return that card and the sacrificed card to the battlefield under your control at the beginning of your next upkeep. Exile Rescue from the Underworld. diff --git a/forge-gui/res/cardsfolder/r/research_development.txt b/forge-gui/res/cardsfolder/r/research_development.txt index be8d46d6c06..96ea226b77b 100644 --- a/forge-gui/res/cardsfolder/r/research_development.txt +++ b/forge-gui/res/cardsfolder/r/research_development.txt @@ -3,7 +3,7 @@ ManaCost:G U AlternateMode: Split Types:Instant A:SP$ ChangeZone | Cost$ G U | Origin$ Sideboard | Destination$ Library | Shuffle$ True | ChangeType$ Card.YouOwn | ChangeNum$ 4 | SpellDescription$ Choose up to four cards you own from outside the game and shuffle them into your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/researchdevelopment.jpg Oracle:Choose up to four cards you own from outside the game and shuffle them into your library. diff --git a/forge-gui/res/cardsfolder/r/reset.txt b/forge-gui/res/cardsfolder/r/reset.txt index b7f28e0f408..74c7d154ed1 100644 --- a/forge-gui/res/cardsfolder/r/reset.txt +++ b/forge-gui/res/cardsfolder/r/reset.txt @@ -2,6 +2,6 @@ Name:Reset ManaCost:U U Types:Instant A:SP$ UntapAll | Cost$ U U | ValidCards$ Land.YouCtrl | OpponentTurn$ True | ActivationPhases$ Draw-> | SpellDescription$ Cast Reset only during an opponent's turn after their upkeep step. Untap all lands you control. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/reset.jpg Oracle:Cast Reset only during an opponent's turn after their upkeep step.\nUntap all lands you control. diff --git a/forge-gui/res/cardsfolder/r/reshape.txt b/forge-gui/res/cardsfolder/r/reshape.txt index 9b6437bee0d..d2040d60e9e 100644 --- a/forge-gui/res/cardsfolder/r/reshape.txt +++ b/forge-gui/res/cardsfolder/r/reshape.txt @@ -3,6 +3,6 @@ ManaCost:X U U Types:Sorcery A:SP$ ChangeZone | Cost$ X U U Sac<1/Artifact> | Origin$ Library | Destination$ Battlefield | ChangeType$ Artifact.cmcLEX | References$ X | ChangeNum$ 1 | Shuffle$ True | SpellDescription$ Search your library for an artifact card with converted mana cost X or less, put it onto the battlefield, then shuffle your library. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/reshape.jpg Oracle:As an additional cost to cast Reshape, sacrifice an artifact.\nSearch your library for an artifact card with converted mana cost X or less, put it onto the battlefield, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/r/resilient_wanderer.txt b/forge-gui/res/cardsfolder/r/resilient_wanderer.txt index 69ec44095f8..5bb91fe9307 100644 --- a/forge-gui/res/cardsfolder/r/resilient_wanderer.txt +++ b/forge-gui/res/cardsfolder/r/resilient_wanderer.txt @@ -4,6 +4,6 @@ Types:Creature Human Nomad PT:2/3 K:First Strike A:AB$ Protection | Cost$ Discard<1/Card> | Defined$ Self | Gains$ Choice | Choices$ AnyColor | SpellDescription$ CARDNAME gains protection from the color of your choice until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/resilient_wanderer.jpg Oracle:First strike\nDiscard a card: Resilient Wanderer gains protection from the color of your choice until end of turn. diff --git a/forge-gui/res/cardsfolder/r/resistance_fighter.txt b/forge-gui/res/cardsfolder/r/resistance_fighter.txt index 817e4cd3f7c..6f0aeab2439 100644 --- a/forge-gui/res/cardsfolder/r/resistance_fighter.txt +++ b/forge-gui/res/cardsfolder/r/resistance_fighter.txt @@ -3,6 +3,6 @@ ManaCost:W Types:Creature Human Soldier PT:1/1 A:AB$ Pump | Cost$ Sac<1/CARDNAME> | KW$ Prevent all combat damage that would be dealt by CARDNAME. | IsCurse$True | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Prevent all combat damage target creature would deal this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/resistance_fighter.jpg Oracle:Sacrifice Resistance Fighter: Prevent all combat damage target creature would deal this turn. diff --git a/forge-gui/res/cardsfolder/r/resounding_roar.txt b/forge-gui/res/cardsfolder/r/resounding_roar.txt index 8f3a638e748..cf465e5b19a 100644 --- a/forge-gui/res/cardsfolder/r/resounding_roar.txt +++ b/forge-gui/res/cardsfolder/r/resounding_roar.txt @@ -5,6 +5,6 @@ K:Cycling:5 R G W A:SP$ Pump | Cost$ 1 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | NumDef$ +3 | SpellDescription$ Target creature gets +3/+3 until end of turn. T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When you cycle CARDNAME, target creature gets +6/+6 until end of turn SVar:TrigPump:DB$Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +6 | NumDef$ +6 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/resounding_roar.jpg Oracle:Target creature gets +3/+3 until end of turn.\nCycling {5}{R}{G}{W} ({5}{R}{G}{W}, Discard this card: Draw a card.)\nWhen you cycle Resounding Roar, target creature gets +6/+6 until end of turn. diff --git a/forge-gui/res/cardsfolder/r/resounding_scream.txt b/forge-gui/res/cardsfolder/r/resounding_scream.txt index d2da769d9a3..b88de8ec297 100644 --- a/forge-gui/res/cardsfolder/r/resounding_scream.txt +++ b/forge-gui/res/cardsfolder/r/resounding_scream.txt @@ -5,6 +5,6 @@ K:Cycling:5 U B R A:SP$ Discard | Cost$ 2 B | ValidTgts$ Player | TgtPrompt$ Select target player | NumCards$ 1 | Mode$ Random | SpellDescription$ Target player discards a card at random. T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When you cycle CARDNAME, target player discards two cards at random. SVar:TrigDiscard:DB$Discard | ValidTgts$ Player | TgtPrompt$ Select target player | NumCards$ 2 | Mode$ Random -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/resounding_scream.jpg Oracle:Target player discards a card at random.\nCycling {5}{U}{B}{R} ({5}{U}{B}{R}, Discard this card: Draw a card.)\nWhen you cycle Resounding Scream, target player discards two cards at random. diff --git a/forge-gui/res/cardsfolder/r/resounding_silence.txt b/forge-gui/res/cardsfolder/r/resounding_silence.txt index f5d969dde66..0d9077cb492 100644 --- a/forge-gui/res/cardsfolder/r/resounding_silence.txt +++ b/forge-gui/res/cardsfolder/r/resounding_silence.txt @@ -5,6 +5,6 @@ K:Cycling:5 G W U A:SP$ ChangeZone | Cost$ 3 W | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target attacking creature. T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When you cycle CARDNAME, exile up to two target attacking creatures. SVar:TrigExile:DB$ChangeZone | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | TargetMin$ 0 | TargetMax$ 2 | Origin$ Battlefield | Destination$ Exile -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/resounding_silence.jpg Oracle:Exile target attacking creature.\nCycling {5}{G}{W}{U} ({5}{G}{W}{U}, Discard this card: Draw a card.)\nWhen you cycle Resounding Silence, exile up to two target attacking creatures. diff --git a/forge-gui/res/cardsfolder/r/resplendent_mentor.txt b/forge-gui/res/cardsfolder/r/resplendent_mentor.txt index 59d86e1de3c..0fd77332c1b 100644 --- a/forge-gui/res/cardsfolder/r/resplendent_mentor.txt +++ b/forge-gui/res/cardsfolder/r/resplendent_mentor.txt @@ -4,6 +4,6 @@ Types:Creature Kithkin Cleric PT:2/2 S:Mode$ Continuous | Affected$ Creature.White+YouCtrl | AddAbility$ GainLife | Description$ White creatures you control have "{T}: You gain 1 life." SVar:GainLife:AB$GainLife | Cost$ T | LifeAmount$ 1 | Defined$ You | SpellDescription$ You gain 1 life. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/resplendent_mentor.jpg Oracle:White creatures you control have "{T}: You gain 1 life." diff --git a/forge-gui/res/cardsfolder/r/rest_in_peace.txt b/forge-gui/res/cardsfolder/r/rest_in_peace.txt index 3da7b2a6e0f..b8e0f8281ff 100644 --- a/forge-gui/res/cardsfolder/r/rest_in_peace.txt +++ b/forge-gui/res/cardsfolder/r/rest_in_peace.txt @@ -6,6 +6,6 @@ SVar:TrigChangeZoneAll:DB$ ChangeZoneAll | ChangeType$ Card | Origin$ Graveyard R:Event$ Moved | ActiveZones$ Battlefield | Destination$ Graveyard | ValidCard$ Card | ReplaceWith$ Exile | Description$ If a card or token would be put into a graveyard from anywhere, exile it instead. SVar:Exile:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Exile | Defined$ ReplacedCard SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rest_in_peace.jpg Oracle:When Rest in Peace enters the battlefield, exile all cards from all graveyards.\nIf a card or token would be put into a graveyard from anywhere, exile it instead. diff --git a/forge-gui/res/cardsfolder/r/restless_dreams.txt b/forge-gui/res/cardsfolder/r/restless_dreams.txt index 98b8eafb842..de8719d0c3f 100644 --- a/forge-gui/res/cardsfolder/r/restless_dreams.txt +++ b/forge-gui/res/cardsfolder/r/restless_dreams.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ ChangeZone | Cost$ B Discard | Origin$ Graveyard | Destination$ Hand | TargetMin$ 0 | TargetMax$ MaxTgts | References$ X,MaxTgts | ValidTgts$ Creature.YouCtrl | SpellDescription$ Return X target creature cards from your graveyard to your hand. SVar:X:Targeted$Amount SVar:MaxTgts:Count$TypeInYourYard.Creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/restless_dreams.jpg Oracle:As an additional cost to cast Restless Dreams, discard X cards.\nReturn X target creature cards from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/r/restore.txt b/forge-gui/res/cardsfolder/r/restore.txt index bbcec1b2902..aff869799b0 100644 --- a/forge-gui/res/cardsfolder/r/restore.txt +++ b/forge-gui/res/cardsfolder/r/restore.txt @@ -2,6 +2,6 @@ Name:Restore ManaCost:1 G Types:Sorcery A:SP$ ChangeZone | Cost$ 1 G | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | TgtPrompt$ Select target land card in a graveyard | ValidTgts$ Land | SpellDescription$ Put target land card from a graveyard onto the battlefield under your control. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/restore.jpg Oracle:Put target land card from a graveyard onto the battlefield under your control. diff --git a/forge-gui/res/cardsfolder/r/restore_balance.txt b/forge-gui/res/cardsfolder/r/restore_balance.txt index 0ddc148dfd3..2e72a2e605e 100644 --- a/forge-gui/res/cardsfolder/r/restore_balance.txt +++ b/forge-gui/res/cardsfolder/r/restore_balance.txt @@ -6,6 +6,6 @@ K:Suspend:6:W A:SP$ Balance | Cost$ 1 W | Valid$ Land | AILogic$ BalanceCreaturesAndLands | SubAbility$ BalanceCreatures | SpellDescription$ Each player chooses a number of lands they control equal to the number of lands controlled by the player who controls the fewest, then sacrifices the rest. Players discard cards and sacrifice creatures the same way. | ActivationLimit$ 0 SVar:BalanceCreatures:DB$ Balance | Valid$ Creature | SubAbility$ BalanceHands SVar:BalanceHands:DB$ Balance | Zone$ Hand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/restore_balance.jpg Oracle:Suspend 6—{W} (Rather than cast this card from your hand, pay {W} and exile it with six time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.)\nEach player chooses a number of lands they control equal to the number of lands controlled by the player who controls the fewest, then sacrifices the rest. Players sacrifice creatures and discard cards the same way. diff --git a/forge-gui/res/cardsfolder/r/resuscitate.txt b/forge-gui/res/cardsfolder/r/resuscitate.txt index 81c2b621b7c..0ce750871f2 100644 --- a/forge-gui/res/cardsfolder/r/resuscitate.txt +++ b/forge-gui/res/cardsfolder/r/resuscitate.txt @@ -3,6 +3,6 @@ ManaCost:1 G Types:Instant A:SP$ AnimateAll | Cost$ 1 G | ValidCards$ Creature.YouCtrl | Abilities$ ABRegen | SpellDescription$ Until end of turn, creatures you control gain "{1}: Regenerate this creature." SVar:ABRegen:AB$Regenerate | Cost$ 1 | SpellDescription$ Regenerate this creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/resuscitate.jpg Oracle:Until end of turn, creatures you control gain "{1}: Regenerate this creature." diff --git a/forge-gui/res/cardsfolder/r/retether.txt b/forge-gui/res/cardsfolder/r/retether.txt index 8006fb8357d..c6ad72c0d21 100644 --- a/forge-gui/res/cardsfolder/r/retether.txt +++ b/forge-gui/res/cardsfolder/r/retether.txt @@ -3,7 +3,7 @@ ManaCost:3 W Types:Sorcery A:SP$ RepeatEach | Cost$ 3 W | RepeatCards$ Aura.YouOwn | Zone$ Graveyard | RepeatSubAbility$ DBAttach | SpellDescription$ Return each Aura card from your graveyard to the battlefield. Only creatures can be enchanted this way. (Aura cards that can't enchant a creature on the battlefield remain in your graveyard.) SVar:DBAttach:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ Remembered | AttachedTo$ Creature.CanBeEnchantedByTargeted -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Aura SVar:Picture:http://www.wizards.com/global/images/magic/general/retether.jpg Oracle:Return each Aura card from your graveyard to the battlefield. Only creatures can be enchanted this way. (Aura cards that can't enchant a creature on the battlefield remain in your graveyard.) diff --git a/forge-gui/res/cardsfolder/r/retraced_image.txt b/forge-gui/res/cardsfolder/r/retraced_image.txt index b8702f15a0b..f8e1507ced0 100644 --- a/forge-gui/res/cardsfolder/r/retraced_image.txt +++ b/forge-gui/res/cardsfolder/r/retraced_image.txt @@ -6,7 +6,7 @@ A:SP$ Pump | Cost$ U | SubAbility$ DBCleanup | Static$ True | StackDescription$ SVar:DBReveal:DB$ Reveal | RememberRevealed$ True | SubAbility$ DBChangeZone SVar:DBChangeZone:DB$ ChangeZone | Defined$ Remembered | Origin$ Hand | Destination$ Battlefield | ConditionDefined$ Remembered | ConditionPresent$ Card.sharesNameWith Battlefield | ConditionCompare$ GE1 SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBReveal -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/retraced_image.jpg Oracle:Reveal a card in your hand, then put that card onto the battlefield if it has the same name as a permanent. diff --git a/forge-gui/res/cardsfolder/r/retract.txt b/forge-gui/res/cardsfolder/r/retract.txt index bd79ad01eae..eba3226961b 100644 --- a/forge-gui/res/cardsfolder/r/retract.txt +++ b/forge-gui/res/cardsfolder/r/retract.txt @@ -2,6 +2,6 @@ Name:Retract ManaCost:U Types:Instant A:SP$ ChangeZoneAll | Cost$ U | ChangeType$ Artifact.YouCtrl | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return all artifacts you control to their owner's hand. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/retract.jpg Oracle:Return all artifacts you control to their owner's hand. diff --git a/forge-gui/res/cardsfolder/r/retraction_helix.txt b/forge-gui/res/cardsfolder/r/retraction_helix.txt index da0c14908c3..e80a486d3ba 100644 --- a/forge-gui/res/cardsfolder/r/retraction_helix.txt +++ b/forge-gui/res/cardsfolder/r/retraction_helix.txt @@ -3,6 +3,6 @@ ManaCost:U Types:Instant A:SP$ Animate | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Abilities$ ABChangeZone | SpellDescription$ Until end of turn, target creature gains "{T}: Return target nonland permanent to its owner's hand." SVar:ABChangeZone:AB$ ChangeZone | Cost$ T | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target nonland permanent to its owner's hand. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/retraction_helix.jpg Oracle:Until end of turn, target creature gains "{T}: Return target nonland permanent to its owner's hand." diff --git a/forge-gui/res/cardsfolder/r/retribution_of_the_ancients.txt b/forge-gui/res/cardsfolder/r/retribution_of_the_ancients.txt index 3655079d9ee..1e67f2e560e 100644 --- a/forge-gui/res/cardsfolder/r/retribution_of_the_ancients.txt +++ b/forge-gui/res/cardsfolder/r/retribution_of_the_ancients.txt @@ -3,8 +3,8 @@ ManaCost:B Types:Enchantment A:AB$ Pump | Announce$ X | Cost$ B SubCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -X | NumDef$ -X | References$ X | IsCurse$ True | SpellDescription$ Target creature gets -X/-X until end of turn. SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random DeckNeeds:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/retribution_of_the_ancients.jpg Oracle:{B}, Remove X +1/+1 counters from among creatures you control: Target creature gets -X/-X until end of turn. diff --git a/forge-gui/res/cardsfolder/r/return_of_the_nightstalkers.txt b/forge-gui/res/cardsfolder/r/return_of_the_nightstalkers.txt index a0bb9e323a4..36ab4d02882 100644 --- a/forge-gui/res/cardsfolder/r/return_of_the_nightstalkers.txt +++ b/forge-gui/res/cardsfolder/r/return_of_the_nightstalkers.txt @@ -3,6 +3,6 @@ ManaCost:5 B B Types:Sorcery A:SP$ ChangeZoneAll | Cost$ 5 B B | SubAbility$ DBDestroy | ChangeType$ Permanent.Nightstalker+YouCtrl | Origin$ Graveyard | Destination$ Battlefield | SpellDescription$ Return all Nightstalker permanent cards from your graveyard to the battlefield. Then destroy all Swamps you control. SVar:DBDestroy:DB$DestroyAll | ValidCards$ Swamp.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/return_of_the_nightstalkers.jpg Oracle:Return all Nightstalker permanent cards from your graveyard to the battlefield. Then destroy all Swamps you control. diff --git a/forge-gui/res/cardsfolder/r/revealing_wind.txt b/forge-gui/res/cardsfolder/r/revealing_wind.txt index 7e431d6c337..44b06f9166b 100644 --- a/forge-gui/res/cardsfolder/r/revealing_wind.txt +++ b/forge-gui/res/cardsfolder/r/revealing_wind.txt @@ -7,6 +7,6 @@ SVar:DBCleanLoop:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBChoose SVar:DBChoose:DB$ ChooseCard | Choices$ Creature.faceDown+attacking,Creature.faceDown+blocking | RememberChosen$ True | ChoiceTitle$ Choose an face-down attacking or blocking creature | SubAbility$ DBLook SVar:DBLook:DB$ LookAt | Defined$ Remembered SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/revealing_wind.jpg Oracle:Prevent all combat damage that would be dealt this turn. You may look at each face-down creature that's attacking or blocking. diff --git a/forge-gui/res/cardsfolder/r/revelation.txt b/forge-gui/res/cardsfolder/r/revelation.txt index d0dbbba099f..bb4e58c2bde 100644 --- a/forge-gui/res/cardsfolder/r/revelation.txt +++ b/forge-gui/res/cardsfolder/r/revelation.txt @@ -3,7 +3,7 @@ ManaCost:G Types:World Enchantment S:Mode$ Continuous | Affected$ Player | AddKeyword$ Play with your hand revealed. | Description$ Players play with their hands revealed. SVar:NonStackingEffect:True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/revelation.jpg Oracle:Players play with their hands revealed. diff --git a/forge-gui/res/cardsfolder/r/revenant.txt b/forge-gui/res/cardsfolder/r/revenant.txt index 4b5c972422f..53078f0d1c2 100644 --- a/forge-gui/res/cardsfolder/r/revenant.txt +++ b/forge-gui/res/cardsfolder/r/revenant.txt @@ -5,7 +5,7 @@ PT:*/* K:Flying S:Mode$ Continuous | Affected$ Card.Self | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | References$ X | Description$ CARDNAME's power and toughness are each equal to the number of creature cards in your graveyard. SVar:X:Count$TypeInYourYard.Creature -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NeedsToPlayVar:X GE3 SVar:Picture:http://www.wizards.com/global/images/magic/general/revenant.jpg Oracle:Flying\nRevenant's power and toughness are each equal to the number of creature cards in your graveyard. diff --git a/forge-gui/res/cardsfolder/r/revenant_patriarch.txt b/forge-gui/res/cardsfolder/r/revenant_patriarch.txt index cf809157a9c..20d8e919e95 100644 --- a/forge-gui/res/cardsfolder/r/revenant_patriarch.txt +++ b/forge-gui/res/cardsfolder/r/revenant_patriarch.txt @@ -6,7 +6,7 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:RevenantPump:DB$Pump | ValidTgts$ Player | KW$ Skip your next combat phase. | Permanent$ True | TgtPrompt$ Select target Player | IsCurse$ True K:CARDNAME can't block. SVar:ManaNeededToAvoidNegativeEffect:white -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$White SVar:Picture:http://www.wizards.com/global/images/magic/general/revenant_patriarch.jpg Oracle:When Revenant Patriarch enters the battlefield, if {W} was spent to cast it, target player skips their next combat phase.\nRevenant Patriarch can't block. diff --git a/forge-gui/res/cardsfolder/r/reverberate.txt b/forge-gui/res/cardsfolder/r/reverberate.txt index aa0f01ef3ca..7bc69bba3cc 100644 --- a/forge-gui/res/cardsfolder/r/reverberate.txt +++ b/forge-gui/res/cardsfolder/r/reverberate.txt @@ -2,6 +2,6 @@ Name:Reverberate ManaCost:R R Types:Instant A:SP$ CopySpellAbility | Cost$ R R | ValidTgts$ Instant,Sorcery | TargetType$ Spell | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/reverberate.jpg Oracle:Copy target instant or sorcery spell. You may choose new targets for the copy. diff --git a/forge-gui/res/cardsfolder/r/reverberation.txt b/forge-gui/res/cardsfolder/r/reverberation.txt index 65f93f6d053..0347b4755fb 100644 --- a/forge-gui/res/cardsfolder/r/reverberation.txt +++ b/forge-gui/res/cardsfolder/r/reverberation.txt @@ -5,6 +5,6 @@ Types:Instant A:SP$ Effect | Cost$ 2 U U | ValidTgts$ Sorcery | AILogic$ Prevent | TgtZone$ Stack,Battlefield | TgtPrompt$ Select target sorcery spell to redirect damage from | RememberObjects$ Targeted | ExileOnMoved$ Stack | ReplacementEffects$ SelflessDamage | SVars$ SelflessDmg | References$ SelflessDamage,SelflessDmg | StackDescription$ SpellDescription | SpellDescription$ All damage that would be dealt this turn by target sorcery spell is dealt to that spell's controller instead. SVar:SelflessDamage:Event$ DamageDone | ValidSource$ Card.IsRemembered | ReplaceWith$ SelflessDmg | Description$ The next time a source of your choice would deal damage this turn, that damage is dealt to that source's controller instead. SVar:SelflessDmg:DB$ ReplaceEffect | VarName$ Affected | VarValue$ ReplacedSourceController | VarType$ Player -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/reverberation.jpg Oracle:All damage that would be dealt this turn by target sorcery spell is dealt to that spell's controller instead. diff --git a/forge-gui/res/cardsfolder/r/reverent_mantra.txt b/forge-gui/res/cardsfolder/r/reverent_mantra.txt index b388ffde0ef..fb1ea07d49f 100644 --- a/forge-gui/res/cardsfolder/r/reverent_mantra.txt +++ b/forge-gui/res/cardsfolder/r/reverent_mantra.txt @@ -4,6 +4,6 @@ Types:Instant SVar:AltCost:Cost$ ExileFromHand<1/Card.White> | Description$ You may exile a white card from your hand rather than pay CARDNAME's mana cost. A:SP$ ChooseColor | Cost$ 3 W | Defined$ You | SubAbility$ DBProtection | AILogic$ MostProminentHumanControls | StackDescription$ SpellDescription | SpellDescription$ Choose a color. All creatures gain protection from the chosen color until end of turn. SVar:DBProtection:DB$ ProtectionAll | ValidCards$ Creature | Gains$ ChosenColor -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/reverent_mantra.jpg Oracle:You may exile a white card from your hand rather than pay Reverent Mantra's mana cost.\nChoose a color. All creatures gain protection from the chosen color until end of turn. diff --git a/forge-gui/res/cardsfolder/r/reverse_polarity.txt b/forge-gui/res/cardsfolder/r/reverse_polarity.txt index 1f11c828f60..fed5ed73d21 100644 --- a/forge-gui/res/cardsfolder/r/reverse_polarity.txt +++ b/forge-gui/res/cardsfolder/r/reverse_polarity.txt @@ -3,6 +3,6 @@ ManaCost:W W Types:Instant A:SP$ GainLife | Cost$ W W | Defined$ You | LifeAmount$ X | References$ X | SpellDescription$ You gain X life, where X is twice the damage dealt to you so far this turn by artifacts. SVar:X:Count$YourTypeDamageThisTurn Artifact/Times.2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/reverse_polarity.jpg Oracle:You gain X life, where X is twice the damage dealt to you so far this turn by artifacts. diff --git a/forge-gui/res/cardsfolder/r/reverse_the_sands.txt b/forge-gui/res/cardsfolder/r/reverse_the_sands.txt index 2f30b6960ff..aa049ab957b 100644 --- a/forge-gui/res/cardsfolder/r/reverse_the_sands.txt +++ b/forge-gui/res/cardsfolder/r/reverse_the_sands.txt @@ -3,6 +3,6 @@ ManaCost:6 W W Types:Sorcery A:SP$ SetLife | Cost$ 6 W W | ValidTgts$ Player | TargetMin$ 0 | TargetMax$ Maxplayer | References$ Maxplayer | Redistribute$ True | SpellDescription$ Redistribute any number of players' life totals. (Each of those players gets one life total back.) SVar:Maxplayer:PlayerCountPlayers$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/reverse_the_sands.jpg Oracle:Redistribute any number of players' life totals. (Each of those players gets one life total back.) diff --git a/forge-gui/res/cardsfolder/r/rewards_of_diversity.txt b/forge-gui/res/cardsfolder/r/rewards_of_diversity.txt index 1a0542537c6..bd8c8d1869a 100644 --- a/forge-gui/res/cardsfolder/r/rewards_of_diversity.txt +++ b/forge-gui/res/cardsfolder/r/rewards_of_diversity.txt @@ -3,6 +3,6 @@ ManaCost:2 W Types:Enchantment T:Mode$ SpellCast | ValidCard$ Card.MultiColor | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever an opponent casts a multicolored spell, you gain 4 life. SVar:TrigGainLife:DB$GainLife | Defined$ You | LifeAmount$ 4 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rewards_of_diversity.jpg Oracle:Whenever an opponent casts a multicolored spell, you gain 4 life. diff --git a/forge-gui/res/cardsfolder/r/reweave.txt b/forge-gui/res/cardsfolder/r/reweave.txt index 06bd2cf23c2..21103b71615 100644 --- a/forge-gui/res/cardsfolder/r/reweave.txt +++ b/forge-gui/res/cardsfolder/r/reweave.txt @@ -5,7 +5,7 @@ K:Splice:Arcane:2 U U A:SP$ Destroy | Cost$ 5 U | ValidTgts$ Permanent | Sacrifice$ True | SubAbility$ DBDigUntil | RememberDestroyed$ True | SpellDescription$ Target permanent's controller sacrifices it. If they do, that player reveals cards from the top of their library until they reveal a permanent card that shares a card type with the sacrificed permanent, puts that card onto the battlefield, then shuffles their library. SVar:DBDigUntil:DB$ DigUntil | Defined$ TargetedController | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ1 | Valid$ Permanent.sharesCardTypeWith Remembered | ValidDescription$ permanent card that shares a card type with the sacrificed permanent | FoundDestination$ Battlefield | RevealedDestination$ Library | Shuffle$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHints:Type$Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/reweave.jpg Oracle:Target permanent's controller sacrifices it. If they do, that player reveals cards from the top of their library until they reveal a permanent card that shares a card type with the sacrificed permanent, puts that card onto the battlefield, then shuffles their library.\nSplice onto Arcane {2}{U}{U} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) diff --git a/forge-gui/res/cardsfolder/r/rhox_meditant.txt b/forge-gui/res/cardsfolder/r/rhox_meditant.txt index 659fe509e2f..fe7da93138a 100644 --- a/forge-gui/res/cardsfolder/r/rhox_meditant.txt +++ b/forge-gui/res/cardsfolder/r/rhox_meditant.txt @@ -4,7 +4,7 @@ Types:Creature Rhino Monk PT:2/4 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | IsPresent$ Permanent.Green+YouCtrl | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, if you control a green permanent, draw a card. SVar:TrigDraw:DB$ Draw | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Green DeckHints:Color$Green SVar:Picture:http://www.wizards.com/global/images/magic/general/rhox_meditant.jpg diff --git a/forge-gui/res/cardsfolder/r/rhys_the_exiled.txt b/forge-gui/res/cardsfolder/r/rhys_the_exiled.txt index 4ed44b0cd51..70d91d21a54 100644 --- a/forge-gui/res/cardsfolder/r/rhys_the_exiled.txt +++ b/forge-gui/res/cardsfolder/r/rhys_the_exiled.txt @@ -8,6 +8,6 @@ SVar:TrigGainLife:DB$GainLife | Defined$ You | LifeAmount$ X | References$ X SVar:X:Count$Valid Elf.YouCtrl # Explicit AI preference for SacCost is needed to avoid infinite recursion and stack overflow when AI is considering AB Regenerate with SacCost vs. trample creatures. SVar:AIPreference:SacCost$Creature.Elf -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rhys_the_exiled.jpg Oracle:Whenever Rhys the Exiled attacks, you gain 1 life for each Elf you control.\n{B}, Sacrifice an Elf: Regenerate Rhys the Exiled. diff --git a/forge-gui/res/cardsfolder/r/rhystic_cave.txt b/forge-gui/res/cardsfolder/r/rhystic_cave.txt index d8a1f189cb3..04be40d28ed 100644 --- a/forge-gui/res/cardsfolder/r/rhystic_cave.txt +++ b/forge-gui/res/cardsfolder/r/rhystic_cave.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land A:AB$ ChooseColor | Cost$ T | AILogic$ MostProminentInComputerDeck | SubAbility$ DBMana | InstantSpeed$ True | SpellDescription$ Choose a color. Add one mana of that color unless any player pays {1}. Activate this ability only any time you could cast an instant. SVar:DBMana:DB$ Mana | Produced$ Chosen | UnlessCost$ 1 | UnlessPayer$ Player | SpellDescription$ Add one mana of the chosen color. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rhystic_cave.jpg Oracle:{T}: Choose a color. Add one mana of that color unless any player pays {1}. Activate this ability only any time you could cast an instant. diff --git a/forge-gui/res/cardsfolder/r/rhystic_circle.txt b/forge-gui/res/cardsfolder/r/rhystic_circle.txt index 9678dc50887..f17dbeb60b4 100644 --- a/forge-gui/res/cardsfolder/r/rhystic_circle.txt +++ b/forge-gui/res/cardsfolder/r/rhystic_circle.txt @@ -6,6 +6,6 @@ SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPreventNextFromSource | Remember SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.IsRemembered | ValidTarget$ You | ReplaceWith$ ExileEffect | PreventionEffect$ True | Description$ The next time the chosen source deals damage to you, prevent that damage. SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rhystic_circle.jpg Oracle:{1}: Any player may pay {1}. If no one does, the next time a source of your choice would deal damage to you this turn, prevent that damage. diff --git a/forge-gui/res/cardsfolder/r/rhystic_deluge.txt b/forge-gui/res/cardsfolder/r/rhystic_deluge.txt index 5c74ec8791b..24a9efba22c 100644 --- a/forge-gui/res/cardsfolder/r/rhystic_deluge.txt +++ b/forge-gui/res/cardsfolder/r/rhystic_deluge.txt @@ -2,7 +2,7 @@ Name:Rhystic Deluge ManaCost:2 U Types:Enchantment A:AB$ Tap | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | UnlessCost$ 1 | UnlessPayer$ TargetedController | SpellDescription$ Tap target creature unless its controller pays {1}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/rhystic_deluge.jpg Oracle:{U}: Tap target creature unless its controller pays {1}. diff --git a/forge-gui/res/cardsfolder/r/rhystic_lightning.txt b/forge-gui/res/cardsfolder/r/rhystic_lightning.txt index 0a0adc42cbc..39fb6eb85a6 100644 --- a/forge-gui/res/cardsfolder/r/rhystic_lightning.txt +++ b/forge-gui/res/cardsfolder/r/rhystic_lightning.txt @@ -7,6 +7,6 @@ SVar:DBDmg:DB$ DealDamage | Defined$ Targeted | NumDmg$ X | References$ X,Rhysti SVar:DBReset:DB$ StoreSVar | SVar$ RhysticPaid | Type$ Number | Expression$ 1 SVar:RhysticPaid:Number$1 SVar:X:Count$Compare RhysticPaid EQ1.2.4 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rhystic_lightning.jpg Oracle:Rhystic Lightning deals 4 damage to any target unless that permanent's controller or that player pays {2}. If they do, Rhystic Lightning deals 2 damage to the permanent or player. diff --git a/forge-gui/res/cardsfolder/r/rhystic_shield.txt b/forge-gui/res/cardsfolder/r/rhystic_shield.txt index 37e4900bbae..fa04d569771 100644 --- a/forge-gui/res/cardsfolder/r/rhystic_shield.txt +++ b/forge-gui/res/cardsfolder/r/rhystic_shield.txt @@ -3,6 +3,6 @@ ManaCost:1 W Types:Instant A:SP$ PumpAll | Cost$ 1 W | ValidCards$ Creature.YouCtrl | NumDef$ +1 | SubAbility$ DBPumpAll | SpellDescription$ Creatures you control get +0/+1 until end of turn. They get an additional +0/+2 until end of turn unless any player pays {2}. SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.YouCtrl | NumDef$ +2 | UnlessCost$ 2 | UnlessPayer$ Player -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rhystic_shield.jpg Oracle:Creatures you control get +0/+1 until end of turn. They get an additional +0/+2 until end of turn unless any player pays {2}. diff --git a/forge-gui/res/cardsfolder/r/rhystic_tutor.txt b/forge-gui/res/cardsfolder/r/rhystic_tutor.txt index c5ff6494c0e..4b35084fa6d 100644 --- a/forge-gui/res/cardsfolder/r/rhystic_tutor.txt +++ b/forge-gui/res/cardsfolder/r/rhystic_tutor.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ ChangeZone | Cost$ 2 B | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 1 | UnlessCost$ 2 | UnlessPayer$ Player | Mandatory$ True | SpellDescription$ Unless any player pays {2}, search your library for a card, put that card into your hand, then shuffle your library. SVar:NeedsToPlayVar:Z LE1 SVar:Z:Count$Valid Card.canProduceMana+OppCtrl+inZoneBattlefield+untapped -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rhystic_tutor.jpg Oracle:Unless any player pays {2}, search your library for a card, put that card into your hand, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/r/ribbons_of_night.txt b/forge-gui/res/cardsfolder/r/ribbons_of_night.txt index afb6ca41e76..a5eb75b9064 100644 --- a/forge-gui/res/cardsfolder/r/ribbons_of_night.txt +++ b/forge-gui/res/cardsfolder/r/ribbons_of_night.txt @@ -5,7 +5,7 @@ A:SP$ DealDamage | Cost$ 4 B | NumDmg$ 4 | ValidTgts$ Creature | TgtPrompt$ Sele SVar:DBGainLife:DB$ GainLife | LifeAmount$ 4 | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | NumCards$ 1 | ConditionManaSpent$ U SVar:ManaNeededToAvoidNegativeEffect:blue -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Blue SVar:Picture:http://www.wizards.com/global/images/magic/general/ribbons_of_night.jpg Oracle:Ribbons of Night deals 4 damage to target creature and you gain 4 life. If {U} was spent to cast Ribbons of Night, draw a card. diff --git a/forge-gui/res/cardsfolder/r/ribbons_of_the_reikai.txt b/forge-gui/res/cardsfolder/r/ribbons_of_the_reikai.txt index 9d42d9c8cc7..6191be3f9e2 100644 --- a/forge-gui/res/cardsfolder/r/ribbons_of_the_reikai.txt +++ b/forge-gui/res/cardsfolder/r/ribbons_of_the_reikai.txt @@ -3,6 +3,6 @@ ManaCost:4 U Types:Sorcery Arcane A:SP$ Draw | Cost$ 4 U | NumCards$ X | References$ X | SpellDescription$ Draw a card for each Spirit you control. SVar:X:Count$TypeYouCtrl.Spirit -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ribbons_of_the_reikai.jpg Oracle:Draw a card for each Spirit you control. diff --git a/forge-gui/res/cardsfolder/r/riddle_of_lightning.txt b/forge-gui/res/cardsfolder/r/riddle_of_lightning.txt index 1635b8b15d3..be8ff2e9ece 100644 --- a/forge-gui/res/cardsfolder/r/riddle_of_lightning.txt +++ b/forge-gui/res/cardsfolder/r/riddle_of_lightning.txt @@ -5,6 +5,6 @@ A:SP$Scry | Cost$ 3 R R | ScryNum$ 3 | SubAbility$ DBReveal | SpellDescription$ SVar:DBReveal:DB$ Dig | DigNum$ 1 | Reveal$ True | DestinationZone$ Library | LibraryPosition$ 0 | SubAbility$ DBDamage SVar:DBDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X | StackDescription$ CARDNAME deals damage equal to that card's converted mana cost to that permanent or player. SVar:X:Count$TopOfLibraryCMC -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/riddle_of_lightning.jpg Oracle:Choose any target. Scry 3, then reveal the top card of your library. Riddle of Lightning deals damage equal to that card's converted mana cost to that permanent or player. (To scry 3, look at the top three cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) diff --git a/forge-gui/res/cardsfolder/r/riddlesmith.txt b/forge-gui/res/cardsfolder/r/riddlesmith.txt index 97c726a768f..8eb1a59c874 100644 --- a/forge-gui/res/cardsfolder/r/riddlesmith.txt +++ b/forge-gui/res/cardsfolder/r/riddlesmith.txt @@ -5,6 +5,6 @@ PT:2/1 T:Mode$ SpellCast | ValidCard$ Artifact | ValidActivatingPlayer$ You | Execute$ TrigLoot | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever you cast an artifact spell, you may draw a card. If you do, discard a card. SVar:TrigLoot:DB$Draw | NumCards$ 1 | SubAbility$ DBDiscard SVar:DBDiscard:DB$Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/riddlesmith.jpg Oracle:Whenever you cast an artifact spell, you may draw a card. If you do, discard a card. diff --git a/forge-gui/res/cardsfolder/r/rift_elemental.txt b/forge-gui/res/cardsfolder/r/rift_elemental.txt index 09df73f9ef6..e33c738ab28 100644 --- a/forge-gui/res/cardsfolder/r/rift_elemental.txt +++ b/forge-gui/res/cardsfolder/r/rift_elemental.txt @@ -4,6 +4,6 @@ Types:Creature Elemental PT:1/1 A:AB$ Pump | Cost$ 1 R SubCounter<1/TIME/Permanent/permanent you control> | Defined$ Self | NumAtt$ 2 | SpellDescription$ CARDNAME gets +2/+0 until end of turn. A:AB$ Pump | Cost$ 1 R SubCounter<1/TIME/Card.suspended/suspended card you own/Exile> | Defined$ Self | NumAtt$ 2 | SpellDescription$ CARDNAME gets +2/+0 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rift_elemental.jpg Oracle:{1}{R}, Remove a time counter from a permanent you control or suspended card you own: Rift Elemental gets +2/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/r/righteous_aura.txt b/forge-gui/res/cardsfolder/r/righteous_aura.txt index b729d64ad86..4ddba3fc167 100644 --- a/forge-gui/res/cardsfolder/r/righteous_aura.txt +++ b/forge-gui/res/cardsfolder/r/righteous_aura.txt @@ -6,7 +6,7 @@ SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPreventNextFromSource | Remember SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.IsRemembered | ValidTarget$ You | ReplaceWith$ ExileEffect | PreventionEffect$ True | Description$ The next time the chosen source deals damage to you, prevent that damage. SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/righteous_aura.jpg Oracle:{W}, Pay 2 life: The next time a source of your choice would deal damage to you this turn, prevent that damage. diff --git a/forge-gui/res/cardsfolder/r/righteous_indignation.txt b/forge-gui/res/cardsfolder/r/righteous_indignation.txt index df864dfb965..48c30075a25 100644 --- a/forge-gui/res/cardsfolder/r/righteous_indignation.txt +++ b/forge-gui/res/cardsfolder/r/righteous_indignation.txt @@ -3,6 +3,6 @@ ManaCost:2 W Types:Enchantment T:Mode$ AttackerBlocked | ValidCard$ Creature.Black,Creature.Red | ValidBlocker$ Creature | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a creature blocks a black or red creature, the blocking creature gets +1/+1 until end of turn. SVar:TrigPump:DB$ Pump | NumAtt$ +1 | NumDef$ +1 | Defined$ TriggeredBlocker | SpellDescription$ The blocking creature gets +1/+1 until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/righteous_indignation.jpg Oracle:Whenever a creature blocks a black or red creature, the blocking creature gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/r/righteousness.txt b/forge-gui/res/cardsfolder/r/righteousness.txt index 8cfcee47983..df2a1e1890b 100644 --- a/forge-gui/res/cardsfolder/r/righteousness.txt +++ b/forge-gui/res/cardsfolder/r/righteousness.txt @@ -2,6 +2,6 @@ Name:Righteousness ManaCost:W Types:Instant A:SP$ Pump | Cost$ W | ValidTgts$ Creature.blocking | NumAtt$ +7 | NumDef$ +7 | TgtPrompt$ Select target blocking creature | SpellDescription$ Target blocking creature gets +7/+7 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/righteousness.jpg Oracle:Target blocking creature gets +7/+7 until end of turn. diff --git a/forge-gui/res/cardsfolder/r/rimebound_dead.txt b/forge-gui/res/cardsfolder/r/rimebound_dead.txt index 41a69e3fc94..183f6b7e06b 100644 --- a/forge-gui/res/cardsfolder/r/rimebound_dead.txt +++ b/forge-gui/res/cardsfolder/r/rimebound_dead.txt @@ -4,6 +4,6 @@ Types:Snow Creature Skeleton PT:1/1 A:AB$ Regenerate | Cost$ S | SpellDescription$ Regenerate CARDNAME. # AI can now use snow mana to pay for activated abilities. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rimebound_dead.jpg Oracle:{S}: Regenerate Rimebound Dead. ({S} can be paid with one mana from a snow permanent.) diff --git a/forge-gui/res/cardsfolder/r/rimefeather_owl.txt b/forge-gui/res/cardsfolder/r/rimefeather_owl.txt index 70fb0c7b72d..e143a1d7782 100644 --- a/forge-gui/res/cardsfolder/r/rimefeather_owl.txt +++ b/forge-gui/res/cardsfolder/r/rimefeather_owl.txt @@ -8,7 +8,7 @@ A:AB$ PutCounter | Cost$ 1 S | ValidTgts$ Permanent | TgtPrompt$ Select target p S:Mode$ Continuous | EffectZone$ Battlefield | Affected$ Permanent.counters_GE1_ICE | AddType$ Snow | Description$ Permanents with ice counters on them are snow. SVar:X:Count$Valid Permanent.Snow SVar:BuffedBy:Permanent.Snow -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Snow SVar:NoZeroToughnessAI:True SVar:Picture:http://www.wizards.com/global/images/magic/general/rimefeather_owl.jpg diff --git a/forge-gui/res/cardsfolder/r/rimehorn_aurochs.txt b/forge-gui/res/cardsfolder/r/rimehorn_aurochs.txt index d713ef3ba2b..a450bb11dd5 100644 --- a/forge-gui/res/cardsfolder/r/rimehorn_aurochs.txt +++ b/forge-gui/res/cardsfolder/r/rimehorn_aurochs.txt @@ -8,7 +8,7 @@ SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ X | References$ X SVar:X:Count$Valid Creature.Aurochs+attacking+Other A:AB$ Pump | Cost$ 2 S | ValidTgts$ Creature | TgtPrompt$ Select target creature to attack | StackDescription$ None | SubAbility$ DBMustBlock | SpellDescription$ Target creature blocks target creature this turn if able. SVar:DBMustBlock:DB$ MustBlock | DefinedAttacker$ ParentTarget | ValidTgts$ Creature | TgtPrompt$ Select target creature to block -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rimehorn_aurochs.jpg Oracle:Trample\nWhenever Rimehorn Aurochs attacks, it gets +1/+0 until end of turn for each other attacking Aurochs.\n{2}{S}: Target creature blocks target creature this turn if able. ({S} can be paid with one mana from a snow permanent.) diff --git a/forge-gui/res/cardsfolder/r/rimescale_dragon.txt b/forge-gui/res/cardsfolder/r/rimescale_dragon.txt index 48beae9f352..1674f58571e 100644 --- a/forge-gui/res/cardsfolder/r/rimescale_dragon.txt +++ b/forge-gui/res/cardsfolder/r/rimescale_dragon.txt @@ -6,6 +6,6 @@ K:Flying S:Mode$ Continuous | Affected$ Creature.counters_GE1_ICE | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Creatures with ice counters on them don't untap during their controllers' untap steps. A:AB$ PutCounter | Cost$ 2 S | ValidTgts$ Creature | IsCurse$ True | TgtPrompt$ Select target creature | CounterType$ ICE | CounterNum$ 1 | SubAbility$ DBTap | SpellDescription$ Put an ice counter on target creature. Tap that creature. SVar:DBTap:DB$ Tap | Defined$ Targeted -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rimescale_dragon.jpg Oracle:Flying\n{2}{S}: Tap target creature and put an ice counter on it. ({S} can be paid with one mana from a snow permanent.)\nCreatures with ice counters on them don't untap during their controllers' untap steps. diff --git a/forge-gui/res/cardsfolder/r/rimewind_cryomancer.txt b/forge-gui/res/cardsfolder/r/rimewind_cryomancer.txt index 3ffc356defa..7028e77de9c 100644 --- a/forge-gui/res/cardsfolder/r/rimewind_cryomancer.txt +++ b/forge-gui/res/cardsfolder/r/rimewind_cryomancer.txt @@ -3,6 +3,6 @@ ManaCost:3 U Types:Creature Human Wizard PT:2/3 A:AB$ Counter | Cost$ 1 T | TgtPrompt$ Select target Activated Ability | ValidTgts$ Card | TargetType$ Activated | IsPresent$ Permanent.Snow+YouCtrl | PresentCompare$ GE4 | SpellDescription$ Counter target activated ability. Activate this ability only if you control four or more snow permanents. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rimewind_cryomancer.jpg Oracle:{1}, {T}: Counter target activated ability. Activate this ability only if you control four or more snow permanents. (Mana abilities can't be targeted.) diff --git a/forge-gui/res/cardsfolder/r/rimewind_taskmage.txt b/forge-gui/res/cardsfolder/r/rimewind_taskmage.txt index b27ece0f6c1..6f52249a47b 100644 --- a/forge-gui/res/cardsfolder/r/rimewind_taskmage.txt +++ b/forge-gui/res/cardsfolder/r/rimewind_taskmage.txt @@ -3,7 +3,7 @@ ManaCost:1 U Types:Creature Human Wizard PT:1/2 A:AB$ TapOrUntap | Cost$ 1 T | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | IsPresent$ Permanent.Snow+YouCtrl | PresentCompare$ GE4 | SpellDescription$ You may tap or untap target permanent. Activate this ability only if you control four or more snow permanents. -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rimewind_taskmage.jpg Oracle:{1}, {T}: You may tap or untap target permanent. Activate this ability only if you control four or more snow permanents. diff --git a/forge-gui/res/cardsfolder/r/ring_of_evos_isle.txt b/forge-gui/res/cardsfolder/r/ring_of_evos_isle.txt index 41fd99922b9..6d7b96e7488 100644 --- a/forge-gui/res/cardsfolder/r/ring_of_evos_isle.txt +++ b/forge-gui/res/cardsfolder/r/ring_of_evos_isle.txt @@ -5,7 +5,7 @@ K:Equip:1 A:AB$ Pump | Cost$ 2 | Defined$ Equipped | KW$ Hexproof | SpellDescription$ Equipped creature gains hexproof until end of turn. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ EvosCounter | TriggerDescription$ At the beginning of your upkeep, put a +1/+1 counter on equipped creature if it's blue. SVar:EvosCounter:DB$PutCounter | Defined$ Equipped | ConditionDefined$ Equipped | ConditionPresent$ Creature.Blue | ConditionCompare$ EQ1 | CounterType$ P1P1 | CounterNum$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:AttachAi:AITgts$ Creature.Blue DeckNeeds:Color$Blue SVar:Picture:http://www.wizards.com/global/images/magic/general/ring_of_evos_isle.jpg diff --git a/forge-gui/res/cardsfolder/r/ring_of_gix.txt b/forge-gui/res/cardsfolder/r/ring_of_gix.txt index 7764e9f7dd7..cbedd367b94 100644 --- a/forge-gui/res/cardsfolder/r/ring_of_gix.txt +++ b/forge-gui/res/cardsfolder/r/ring_of_gix.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact K:Echo:3 A:AB$ Tap | Cost$ 1 T | ValidTgts$ Artifact,Creature,Land | TgtPrompt$ Select target artifact, creature, or land | SpellDescription$ Tap target artifact, creature, or land. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ring_of_gix.jpg Oracle:Echo {3} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.)\n{1}, {T}: Tap target artifact, creature, or land. diff --git a/forge-gui/res/cardsfolder/r/ring_of_kalonia.txt b/forge-gui/res/cardsfolder/r/ring_of_kalonia.txt index 4faafff8292..5195515f874 100644 --- a/forge-gui/res/cardsfolder/r/ring_of_kalonia.txt +++ b/forge-gui/res/cardsfolder/r/ring_of_kalonia.txt @@ -5,7 +5,7 @@ K:Equip:1 S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddKeyword$ Trample | Description$ Equipped creature has trample. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ KaloniaCounter | TriggerDescription$ At the beginning of your upkeep, put a +1/+1 counter on equipped creature if it's green. SVar:KaloniaCounter:DB$PutCounter | Defined$ Equipped | ConditionDefined$ Equipped | ConditionPresent$ Creature.Green | ConditionCompare$ EQ1 | CounterType$ P1P1 | CounterNum$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:AttachAi:AITgts$ Creature.Green DeckNeeds:Color$Green SVar:Picture:http://www.wizards.com/global/images/magic/general/ring_of_kalonia.jpg diff --git a/forge-gui/res/cardsfolder/r/ring_of_maruf.txt b/forge-gui/res/cardsfolder/r/ring_of_maruf.txt index bb33fbe685e..baef9a0593c 100644 --- a/forge-gui/res/cardsfolder/r/ring_of_maruf.txt +++ b/forge-gui/res/cardsfolder/r/ring_of_maruf.txt @@ -5,7 +5,7 @@ A:AB$ Effect | Cost$ 5 T Exile<1/CARDNAME> | Name$ Ring of Ma'ruf Effect | Repla SVar:DrawReplace:Event$ Draw | ValidPlayer$ You | ReplaceWith$ TutorSideboard | Description$ The next time you would draw a card this turn, instead choose a card you own from outside the game and put it into your hand. SVar:TutorSideboard:DB$ ChangeZone | Origin$ Sideboard | Destination$ Hand | ChangeType$ Card.YouOwn | ChangeNum$ 1 | Hidden$ True | SubAbility$ ExileEffect SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ring_of_maruf.jpg Oracle:{5}, {T}, Exile Ring of Ma'ruf: The next time you would draw a card this turn, instead choose a card you own from outside the game and put it into your hand. diff --git a/forge-gui/res/cardsfolder/r/ring_of_thune.txt b/forge-gui/res/cardsfolder/r/ring_of_thune.txt index 408d8514cbc..f2e04781af1 100644 --- a/forge-gui/res/cardsfolder/r/ring_of_thune.txt +++ b/forge-gui/res/cardsfolder/r/ring_of_thune.txt @@ -5,7 +5,7 @@ K:Equip:1 S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddKeyword$ Vigilance | Description$ Equipped creature has vigilance. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ ThuneCounter | TriggerDescription$ At the beginning of your upkeep, put a +1/+1 counter on equipped creature if it's white. SVar:ThuneCounter:DB$PutCounter | Defined$ Equipped | ConditionDefined$ Equipped | ConditionPresent$ Creature.White | ConditionCompare$ EQ1 | CounterType$ P1P1 | CounterNum$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:AttachAi:AITgts$ Creature.White DeckNeeds:Color$White SVar:Picture:http://www.wizards.com/global/images/magic/general/ring_of_thune.jpg diff --git a/forge-gui/res/cardsfolder/r/ring_of_valkas.txt b/forge-gui/res/cardsfolder/r/ring_of_valkas.txt index 9076dc50abd..77b0cf32afe 100644 --- a/forge-gui/res/cardsfolder/r/ring_of_valkas.txt +++ b/forge-gui/res/cardsfolder/r/ring_of_valkas.txt @@ -5,7 +5,7 @@ K:Equip:1 S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddKeyword$ Haste | Description$ Equipped creature has haste. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ ValkasCounter | TriggerDescription$ At the beginning of your upkeep, put a +1/+1 counter on equipped creature if it's red. SVar:ValkasCounter:DB$PutCounter | Defined$ Equipped | ConditionDefined$ Equipped | ConditionPresent$ Creature.Red | ConditionCompare$ EQ1 | CounterType$ P1P1 | CounterNum$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:AttachAi:AITgts$ Creature.Red DeckNeeds:Color$Red SVar:Picture:http://www.wizards.com/global/images/magic/general/ring_of_valkas.jpg diff --git a/forge-gui/res/cardsfolder/r/ring_of_xathrid.txt b/forge-gui/res/cardsfolder/r/ring_of_xathrid.txt index c10ed49330f..92e4262f549 100644 --- a/forge-gui/res/cardsfolder/r/ring_of_xathrid.txt +++ b/forge-gui/res/cardsfolder/r/ring_of_xathrid.txt @@ -5,7 +5,7 @@ K:Equip:1 A:AB$ Regenerate | Cost$ 2 | Defined$ Equipped | SpellDescription$ Regenerate equipped creature. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ XathridCounter | TriggerDescription$ At the beginning of your upkeep, put a +1/+1 counter on equipped creature if it's black. SVar:XathridCounter:DB$PutCounter | Defined$ Equipped | ConditionDefined$ Equipped | ConditionPresent$ Creature.Black | ConditionCompare$ EQ1 | CounterType$ P1P1 | CounterNum$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:AttachAi:AITgts$ Creature.Black DeckNeeds:Color$Black SVar:Picture:http://www.wizards.com/global/images/magic/general/ring_of_xathrid.jpg diff --git a/forge-gui/res/cardsfolder/r/riot_control.txt b/forge-gui/res/cardsfolder/r/riot_control.txt index d2229d7c549..e041cd8074f 100644 --- a/forge-gui/res/cardsfolder/r/riot_control.txt +++ b/forge-gui/res/cardsfolder/r/riot_control.txt @@ -5,6 +5,6 @@ A:SP$ GainLife | Cost$ 2 W | Defined$ You | LifeAmount$ X | References$ X | SubA SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPrevent SVar:RPrevent:Event$ DamageDone | Prevent$ True | ActiveZones$ Command | ValidTarget$ You | Description$ Prevent all damage that would be dealt to you this turn. SVar:X:Count$Valid Creature.OppCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/riot_control.jpg Oracle:You gain 1 life for each creature your opponents control. Prevent all damage that would be dealt to you this turn. diff --git a/forge-gui/res/cardsfolder/r/riptide.txt b/forge-gui/res/cardsfolder/r/riptide.txt index 6c4cccd8db0..139c774d427 100644 --- a/forge-gui/res/cardsfolder/r/riptide.txt +++ b/forge-gui/res/cardsfolder/r/riptide.txt @@ -2,6 +2,6 @@ Name:Riptide ManaCost:U Types:Instant A:SP$ TapAll | Cost$ U | ValidCards$ Creature.Blue | SpellDescription$ Tap all blue creatures. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/riptide.jpg Oracle:Tap all blue creatures. diff --git a/forge-gui/res/cardsfolder/r/riptide_chimera.txt b/forge-gui/res/cardsfolder/r/riptide_chimera.txt index 7050984a176..175ff52e709 100644 --- a/forge-gui/res/cardsfolder/r/riptide_chimera.txt +++ b/forge-gui/res/cardsfolder/r/riptide_chimera.txt @@ -5,7 +5,7 @@ PT:3/4 K:Flying T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigBounce | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, return an enchanment you control to its owner's hand. SVar:TrigBounce:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Mandatory$ True | Hidden$ True | ChangeType$ Enchantment.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NeedsToPlayVar:Z GE2 SVar:Z:Count$Valid Enchantment.YouCtrl+inZoneBattlefield SVar:Picture:http://www.wizards.com/global/images/magic/general/riptide_chimera.jpg diff --git a/forge-gui/res/cardsfolder/r/riptide_chronologist.txt b/forge-gui/res/cardsfolder/r/riptide_chronologist.txt index 8f6386f567a..432b7189c25 100644 --- a/forge-gui/res/cardsfolder/r/riptide_chronologist.txt +++ b/forge-gui/res/cardsfolder/r/riptide_chronologist.txt @@ -4,6 +4,6 @@ Types:Creature Human Wizard PT:1/3 A:AB$ ChooseType | Cost$ U Sac<1/CARDNAME> | Type$ Creature | SubAbility$ DBUntapAll | SpellDescription$ Untap all creatures of the creature type of your choice. SVar:DBUntapAll:DB$ UntapAll | ValidCards$ Creature.ChosenType -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/riptide_chronologist.jpg Oracle:{U}, Sacrifice Riptide Chronologist: Untap all creatures of the creature type of your choice. diff --git a/forge-gui/res/cardsfolder/r/riptide_director.txt b/forge-gui/res/cardsfolder/r/riptide_director.txt index 2e3280a012e..5877f6e2414 100644 --- a/forge-gui/res/cardsfolder/r/riptide_director.txt +++ b/forge-gui/res/cardsfolder/r/riptide_director.txt @@ -4,7 +4,7 @@ Types:Creature Human Wizard PT:2/3 A:AB$ Draw | Cost$ 2 U U T | NumCards$ X | References$ X | SpellDescription$ Draw a card for each Wizard you control. SVar:X:Count$TypeYouCtrl.Wizard -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonCombatPriority:3 SVar:Picture:http://www.wizards.com/global/images/magic/general/riptide_director.jpg Oracle:{2}{U}{U}, {T}: Draw a card for each Wizard you control. diff --git a/forge-gui/res/cardsfolder/r/riptide_laboratory.txt b/forge-gui/res/cardsfolder/r/riptide_laboratory.txt index 016f927187c..77456c3a2bc 100644 --- a/forge-gui/res/cardsfolder/r/riptide_laboratory.txt +++ b/forge-gui/res/cardsfolder/r/riptide_laboratory.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$T | Produced$ C | SpellDescription$ Add {C}. A:AB$ ChangeZone | Cost$ 1 U T | ValidTgts$ Card.Wizard+YouCtrl | TgtPrompt$ Select target Wizard you control | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target Wizard you control to its owner's hand. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/riptide_laboratory.jpg Oracle:{T}: Add {C}.\n{1}{U}, {T}: Return target Wizard you control to its owner's hand. diff --git a/forge-gui/res/cardsfolder/r/riptide_mangler.txt b/forge-gui/res/cardsfolder/r/riptide_mangler.txt index 24059776c34..c2b6eb59937 100644 --- a/forge-gui/res/cardsfolder/r/riptide_mangler.txt +++ b/forge-gui/res/cardsfolder/r/riptide_mangler.txt @@ -5,6 +5,6 @@ PT:0/3 A:AB$ Pump | Cost$ 1 U | ValidTgts$ Creature | TgtPrompt$ Select target Creature | SubAbility$ DBChangePower | StackDescription$ None | SpellDescription$ Change CARDNAME's base power to target creature's power. (This effect lasts indefinitely.) SVar:DBChangePower:DB$ Animate | Defined$ Self | Power$ X | References$ X | Permanent$ True SVar:X:Targeted$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/riptide_mangler.jpg Oracle:{1}{U}: Change Riptide Mangler's base power to target creature's power. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/r/riptide_shapeshifter.txt b/forge-gui/res/cardsfolder/r/riptide_shapeshifter.txt index 5e7b1130617..f7c9265367b 100644 --- a/forge-gui/res/cardsfolder/r/riptide_shapeshifter.txt +++ b/forge-gui/res/cardsfolder/r/riptide_shapeshifter.txt @@ -4,6 +4,6 @@ Types:Creature Shapeshifter PT:3/3 A:AB$ ChooseType | Cost$ 2 U U Sac<1/CARDNAME> | Type$ Creature | SubAbility$ DBDigUntil | SpellDescription$ Choose a creature type. Reveal cards from the top of your library until you reveal a creature card of that type. Put that card onto the battlefield and shuffle the rest into your library. SVar:DBDigUntil:DB$ DigUntil | Valid$ Creature.ChosenType | ValidDescription$ creature card of chosen type | FoundDestination$ Battlefield | RevealedDestination$ Library | Shuffle$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/riptide_shapeshifter.jpg Oracle:{2}{U}{U}, Sacrifice Riptide Shapeshifter: Choose a creature type. Reveal cards from the top of your library until you reveal a creature card of that type. Put that card onto the battlefield and shuffle the rest into your library. diff --git a/forge-gui/res/cardsfolder/r/riptide_survivor.txt b/forge-gui/res/cardsfolder/r/riptide_survivor.txt index 2d325ff8b6e..c5190eabfd6 100644 --- a/forge-gui/res/cardsfolder/r/riptide_survivor.txt +++ b/forge-gui/res/cardsfolder/r/riptide_survivor.txt @@ -6,6 +6,6 @@ K:Morph:1 U U T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME is turned face up, discard two cards, then draw three cards. SVar:TrigDiscard:DB$ Discard | Defined$ You | NumCards$ 2 | Mode$ TgtChoose | SubAbility$ DBDraw SVar:DBDraw:DB$Draw | NumCards$ 3 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/riptide_survivor.jpg Oracle:Morph {1}{U}{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.)\nWhen Riptide Survivor is turned face up, discard two cards, then draw three cards. diff --git a/forge-gui/res/cardsfolder/r/rishadan_cutpurse.txt b/forge-gui/res/cardsfolder/r/rishadan_cutpurse.txt index 49ea9194546..bfc6dfcbe29 100644 --- a/forge-gui/res/cardsfolder/r/rishadan_cutpurse.txt +++ b/forge-gui/res/cardsfolder/r/rishadan_cutpurse.txt @@ -7,6 +7,6 @@ SVar:RepeatEachOpp:DB$ RepeatEach | RepeatPlayers$ Player.Opponent | RepeatSubAb SVar:TrigSac:DB$ Sacrifice | Defined$ Remembered | SacValid$ Permanent | SacMessage$ Permanent | UnlessCost$ 1 | UnlessPayer$ Remembered SVar:NeedsToPlayVar:Z EQ0 SVar:Z:Count$Valid Card.canProduceMana+OppCtrl+untapped -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rishadan_cutpurse.jpg Oracle:When Rishadan Cutpurse enters the battlefield, each opponent sacrifices a permanent unless they pay {1}. diff --git a/forge-gui/res/cardsfolder/r/rishadan_pawnshop.txt b/forge-gui/res/cardsfolder/r/rishadan_pawnshop.txt index 62c4a63309e..5a3a59898b4 100644 --- a/forge-gui/res/cardsfolder/r/rishadan_pawnshop.txt +++ b/forge-gui/res/cardsfolder/r/rishadan_pawnshop.txt @@ -2,6 +2,6 @@ Name:Rishadan Pawnshop ManaCost:2 Types:Artifact A:AB$ ChangeZone | Cost$ 2 T | ValidTgts$ Permanent.nonToken+YouCtrl | TgtPrompt$ Select target nontoken permanent you control | Origin$ Battlefield | Destination$ Library | Shuffle$ True | SpellDescription$ Shuffle target nontoken permanent you control into its owner's library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rishadan_pawnshop.jpg Oracle:{2}, {T}: Shuffle target nontoken permanent you control into its owner's library. diff --git a/forge-gui/res/cardsfolder/r/rishadan_port.txt b/forge-gui/res/cardsfolder/r/rishadan_port.txt index 1380c242e49..071bee59b82 100644 --- a/forge-gui/res/cardsfolder/r/rishadan_port.txt +++ b/forge-gui/res/cardsfolder/r/rishadan_port.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Tap | Cost$ 1 T | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Tap target land. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rishadan_port.jpg Oracle:{T}: Add {C}.\n{1}, {T}: Tap target land. diff --git a/forge-gui/res/cardsfolder/r/rising_waters.txt b/forge-gui/res/cardsfolder/r/rising_waters.txt index 641b55607b9..111ca018c48 100644 --- a/forge-gui/res/cardsfolder/r/rising_waters.txt +++ b/forge-gui/res/cardsfolder/r/rising_waters.txt @@ -4,7 +4,7 @@ Types:Enchantment S:Mode$ Continuous | Affected$ Land | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Lands don't untap during their controller's untap steps. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield | IsPresent$ Card.Self | Execute$ TrigUntap | TriggerDescription$ At the beginning of each player's upkeep, that player untaps a land they control. SVar:TrigUntap:DB$ Untap | UntapUpTo$ True | UntapType$ Land.ActivePlayerCtrl | Amount$ 1 | Defined$ TriggeredPlayer -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/rising_waters.jpg Oracle:Lands don't untap during their controllers' untap steps.\nAt the beginning of each player's upkeep, that player untaps a land they control. diff --git a/forge-gui/res/cardsfolder/r/risky_move.txt b/forge-gui/res/cardsfolder/r/risky_move.txt index 03aa0ad8952..0212b47e6bf 100644 --- a/forge-gui/res/cardsfolder/r/risky_move.txt +++ b/forge-gui/res/cardsfolder/r/risky_move.txt @@ -8,6 +8,6 @@ SVar:TrigChoose:DB$ ChooseCard | Defined$ You | Choices$ Creature.YouCtrl | Mand SVar:DBChoosePlayer:DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | SubAbility$ DBFlip SVar:DBFlip:DB$ FlipACoin | LoseSubAbility$ DBControl SVar:DBControl:DB$ GainControl | NewController$ Player.Chosen | Defined$ ChosenCard -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/risky_move.jpg Oracle:At the beginning of each player's upkeep, that player gains control of Risky Move.\nWhen you gain control of Risky Move from another player, choose a creature you control and an opponent. Flip a coin. If you lose the flip, that opponent gains control of that creature. diff --git a/forge-gui/res/cardsfolder/r/rite_of_belzenlok.txt b/forge-gui/res/cardsfolder/r/rite_of_belzenlok.txt index 8928eac61cb..51567032f69 100644 --- a/forge-gui/res/cardsfolder/r/rite_of_belzenlok.txt +++ b/forge-gui/res/cardsfolder/r/rite_of_belzenlok.txt @@ -9,5 +9,5 @@ SVar:DemonTrigSac:DB$ Sacrifice | Defined$ You | SacValid$ Creature.Other | SubA SVar:DemonDBDamage:DB$ DealDamage | Defined$ You | NumDmg$ 6 | ConditionCheckSVar$ X | ConditionSVarCompare$ LT1 | SubAbility$ DemonDBCleanup | References$ X SVar:DemonDBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount -SVar:RemRandomDeck:True +AI:RemoveDeck:Random Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI, II - Create two 0/1 black Cleric creature tokens.\nIII - Create a 6/6 black Demon creature token with flying, trample, and "At the beginning of your upkeep, sacrifice another creature. If you can't, this creature deals 6 damage to you." \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/r/rite_of_ruin.txt b/forge-gui/res/cardsfolder/r/rite_of_ruin.txt index 5f3d3ea2eca..2baf565e225 100644 --- a/forge-gui/res/cardsfolder/r/rite_of_ruin.txt +++ b/forge-gui/res/cardsfolder/r/rite_of_ruin.txt @@ -51,6 +51,6 @@ SVar:SacL3:DB$ SacrificeAll | ValidCards$ Land.IsRemembered | SubAbility$ DBClea SVar:DBChooseA3:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ ChooseA3 | SubAbility$ SacA3 SVar:SacA3:DB$ SacrificeAll | ValidCards$ Artifact.IsRemembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rite_of_ruin.jpg Oracle:Choose an order for artifacts, creatures, and lands. Each player sacrifices one permanent of the first type, sacrifices two of the second type, then sacrifices three of the third type. diff --git a/forge-gui/res/cardsfolder/r/rite_of_the_raging_storm.txt b/forge-gui/res/cardsfolder/r/rite_of_the_raging_storm.txt index 673011e3bd0..80a3f98ff11 100644 --- a/forge-gui/res/cardsfolder/r/rite_of_the_raging_storm.txt +++ b/forge-gui/res/cardsfolder/r/rite_of_the_raging_storm.txt @@ -5,6 +5,6 @@ S:Mode$ CantAttack | ValidCard$ Creature.namedLightning Rager | Target$ You,Plan T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each player's upkeep, that player creates a 5/1 red Elemental creature token named Lightning Rager. It has trample, haste, and "At the beginning of the end step, sacrifice this creature." SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenName$ Lightning Rager | TokenTypes$ Creature,Elemental | TokenOwner$ TriggeredPlayer | TokenPower$ 5 | TokenToughness$ 1 | TokenKeywords$ Trample<>Haste | TokenSVars$ LightningRagerEOT | TokenColors$ Red | TokenImage$ r 5 1 lightning rager | AtEOTTrig$ Sacrifice SVar:LightningRagerEOT:SVar:EndOfTurnLeavePlay:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rite_of_the_raging_storm.jpg Oracle:Creatures named Lightning Rager can't attack you or planeswalkers you control.\nAt the beginning of each player's upkeep, that player creates a 5/1 red Elemental creature token named Lightning Rager. It has trample, haste, and "At the beginning of the end step, sacrifice this creature." \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/r/rite_of_undoing.txt b/forge-gui/res/cardsfolder/r/rite_of_undoing.txt index e537024602b..fc64d02ba2b 100644 --- a/forge-gui/res/cardsfolder/r/rite_of_undoing.txt +++ b/forge-gui/res/cardsfolder/r/rite_of_undoing.txt @@ -4,7 +4,7 @@ Types:Instant K:Delve A:SP$ ChangeZone | Cost$ 4 U | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Permanent.YouCtrl+nonLand | TgtPrompt$ Select target nonland permanent you control | SubAbility$ DBChange | SpellDescription$ Return target nonland permanent you control and target mpm;amd permanent you don't control to their owners' hands. SVar:DBChange:DB$ChangeZone | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Permanent.YouDontCtrl+nonLand | TgtPrompt$ Select target nonland permanent you don't control -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHints:Ability$Graveyard SVar:Picture:http://www.wizards.com/global/images/magic/general/rite_of_undoing.jpg Oracle:Delve (Each card you exile from your graveyard while casting this spell pays for {1}.)\nReturn target nonland permanent you control and target nonland permanent you don't control to their owners' hands. diff --git a/forge-gui/res/cardsfolder/r/rites_of_initiation.txt b/forge-gui/res/cardsfolder/r/rites_of_initiation.txt index bfcfb4dd071..f00a099c840 100644 --- a/forge-gui/res/cardsfolder/r/rites_of_initiation.txt +++ b/forge-gui/res/cardsfolder/r/rites_of_initiation.txt @@ -8,6 +8,6 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:MaxChoice:Count$InYourHand SVar:ChosenInitiation:Count$ChosenNumber SVar:Y:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rites_of_initiation.jpg Oracle:Discard any number of cards at random. Creatures you control get +1/+0 until end of turn for each card discarded this way. diff --git a/forge-gui/res/cardsfolder/r/rites_of_refusal.txt b/forge-gui/res/cardsfolder/r/rites_of_refusal.txt index 8b3e6bf34df..3d85c56e1e0 100644 --- a/forge-gui/res/cardsfolder/r/rites_of_refusal.txt +++ b/forge-gui/res/cardsfolder/r/rites_of_refusal.txt @@ -6,6 +6,6 @@ SVar:DBCounter:DB$ Counter | TargetType$ Spell | ValidTgts$ Card | TgtPrompt$ Se SVar:X:Remembered$Amount SVar:Y:SVar$X/Times.3 SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rites_of_refusal.jpg Oracle:Discard any number of cards. Counter target spell unless its controller pays {3} for each card discarded this way. diff --git a/forge-gui/res/cardsfolder/r/rites_of_spring.txt b/forge-gui/res/cardsfolder/r/rites_of_spring.txt index 6e1de761e6c..8f17a7e4601 100644 --- a/forge-gui/res/cardsfolder/r/rites_of_spring.txt +++ b/forge-gui/res/cardsfolder/r/rites_of_spring.txt @@ -5,6 +5,6 @@ A:SP$ Discard | Cost$ 1 G | Defined$ You | AnyNumber$ True | Mode$ TgtChoose | O SVar:DBChangeZone:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeNum$ X | SubAbility$ DBCleanup | References$ X SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rites_of_spring.jpg Oracle:Discard any number of cards. Search your library for up to that many basic land cards, reveal those cards, and put them into your hand. Then shuffle your library. diff --git a/forge-gui/res/cardsfolder/r/riths_attendant.txt b/forge-gui/res/cardsfolder/r/riths_attendant.txt index 62030f37010..1389d9d93d6 100644 --- a/forge-gui/res/cardsfolder/r/riths_attendant.txt +++ b/forge-gui/res/cardsfolder/r/riths_attendant.txt @@ -3,6 +3,6 @@ ManaCost:5 Types:Artifact Creature Golem PT:3/3 A:AB$ Mana | Cost$ 1 Sac<1/CARDNAME> | Produced$ R G W | SpellDescription$ Add {R}{G}{W}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/riths_attendant.jpg Oracle:{1}, Sacrifice Rith's Attendant: Add {R}{G}{W}. diff --git a/forge-gui/res/cardsfolder/r/ritual_of_subdual.txt b/forge-gui/res/cardsfolder/r/ritual_of_subdual.txt index 37e1057760d..87972a95860 100644 --- a/forge-gui/res/cardsfolder/r/ritual_of_subdual.txt +++ b/forge-gui/res/cardsfolder/r/ritual_of_subdual.txt @@ -4,8 +4,8 @@ Types:Enchantment K:Cumulative upkeep:2 R:Event$ ProduceMana | ActiveZones$ Battlefield | ValidCard$ Land | ManaReplacement$ ProduceColorless | Description$ If a land is tapped for mana, it produces colorless mana instead of any other type. SVar:ProduceColorless:B->1 & U->1 & R->1 & G->1 & W->1 -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/ritual_of_subdual.jpg Oracle:Cumulative upkeep {2} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nIf a land is tapped for mana, it produces colorless mana instead of any other type. diff --git a/forge-gui/res/cardsfolder/r/ritual_of_the_machine.txt b/forge-gui/res/cardsfolder/r/ritual_of_the_machine.txt index 0aa55109b96..4c5a294c1dd 100644 --- a/forge-gui/res/cardsfolder/r/ritual_of_the_machine.txt +++ b/forge-gui/res/cardsfolder/r/ritual_of_the_machine.txt @@ -2,6 +2,6 @@ Name:Ritual of the Machine ManaCost:2 B B Types:Sorcery A:SP$ GainControl | Cost$ 2 B B Sac<1/Creature> | ValidTgts$ Creature.nonBlack+nonArtifact | TgtPrompt$Select target nonartifact, nonblack creature | SpellDescription$ Gain control of target nonblack, nonartifact creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ritual_of_the_machine.jpg Oracle:As an additional cost to cast Ritual of the Machine, sacrifice a creature.\nGain control of target nonartifact, nonblack creature. diff --git a/forge-gui/res/cardsfolder/r/river_of_tears.txt b/forge-gui/res/cardsfolder/r/river_of_tears.txt index a724b2ca4cb..867be205b00 100644 --- a/forge-gui/res/cardsfolder/r/river_of_tears.txt +++ b/forge-gui/res/cardsfolder/r/river_of_tears.txt @@ -2,7 +2,7 @@ Name:River of Tears ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ U | ReplaceIfLandPlayed$ B | SpellDescription$ Add {U}. If you played a land this turn, add {B} instead. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Color$Blue|Black SVar:Picture:http://www.wizards.com/global/images/magic/general/river_of_tears.jpg Oracle:{T}: Add {U}. If you played a land this turn, add {B} instead. diff --git a/forge-gui/res/cardsfolder/r/rivers_grasp.txt b/forge-gui/res/cardsfolder/r/rivers_grasp.txt index 68bc552fe57..26418ea9847 100644 --- a/forge-gui/res/cardsfolder/r/rivers_grasp.txt +++ b/forge-gui/res/cardsfolder/r/rivers_grasp.txt @@ -3,6 +3,6 @@ ManaCost:3 UB Types:Sorcery A:SP$ ChangeZone | Cost$ 3 UB | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Choose target creature to bounce | ValidTgts$ Creature | Origin$ Battlefield | Destination$ Hand | ConditionManaSpent$ U | SubAbility$ BPaid | SpellDescription$ If {U} was spent to cast CARDNAME, return up to one target creature to its owner's hand. If {B} was spent to cast CARDNAME, target player reveals their hand, you choose a nonland card from it, then that player discards that card. (Do both if {U}{B} was spent.) SVar:BPaid:DB$ Discard | ValidTgts$ Player | NumCards$ 1 | Mode$ RevealYouChoose | DiscardValid$ Card.nonLand | ConditionManaSpent$ B -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rivers_grasp.jpg Oracle:If {U} was spent to cast River's Grasp, return up to one target creature to its owner's hand. If {B} was spent to cast River's Grasp, target player reveals their hand, you choose a nonland card from it, then that player discards that card. (Do both if {U}{B} was spent.) diff --git a/forge-gui/res/cardsfolder/r/roar_of_challenge.txt b/forge-gui/res/cardsfolder/r/roar_of_challenge.txt index e9543174a27..723943af713 100644 --- a/forge-gui/res/cardsfolder/r/roar_of_challenge.txt +++ b/forge-gui/res/cardsfolder/r/roar_of_challenge.txt @@ -3,6 +3,6 @@ ManaCost:2 G Types:Sorcery A:SP$ Pump | Cost$ 2 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN All creatures able to block CARDNAME do so. | SubAbility$ DBPump | SpellDescription$ All creatures able to block target creature this turn do so. Ferocious — That creature gains indestructible until end of turn if you control a creature with power 4 or greater. SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ Indestructible | ConditionPresent$ Creature.YouCtrl+powerGE4 | ConditionCompare$ GE1 | ConditionDescription$ If you control a creature with power 4 or greater. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/roar_of_challenge.jpg Oracle:All creatures able to block target creature this turn do so.\nFerocious — That creature gains indestructible until end of turn if you control a creature with power 4 or greater. diff --git a/forge-gui/res/cardsfolder/r/roar_of_jukai.txt b/forge-gui/res/cardsfolder/r/roar_of_jukai.txt index 68274e3abd4..b0f96d93073 100644 --- a/forge-gui/res/cardsfolder/r/roar_of_jukai.txt +++ b/forge-gui/res/cardsfolder/r/roar_of_jukai.txt @@ -3,7 +3,7 @@ ManaCost:2 G Types:Instant Arcane K:Splice:Arcane:GainLife<5/Player.Opponent> A:SP$ PumpAll | Cost$ 2 G | ValidCards$ Creature.blocked | NumAtt$ +2 | NumDef$ +2 | ConditionPresent$ Forest.YouCtrl | ConditionCompare$ GE1 | SpellDescription$ If you control a Forest, each blocked creature gets +2/+2 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHints:Type$Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/roar_of_jukai.jpg Oracle:If you control a Forest, each blocked creature gets +2/+2 until end of turn.\nSplice onto Arcane—An opponent gains 5 life. (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) diff --git a/forge-gui/res/cardsfolder/r/roar_of_reclamation.txt b/forge-gui/res/cardsfolder/r/roar_of_reclamation.txt index 4d5430bc43d..13ca2406f6b 100644 --- a/forge-gui/res/cardsfolder/r/roar_of_reclamation.txt +++ b/forge-gui/res/cardsfolder/r/roar_of_reclamation.txt @@ -2,6 +2,6 @@ Name:Roar of Reclamation ManaCost:5 W W Types:Sorcery A:SP$ ChangeZoneAll | Cost$ 5 W W | ChangeType$ Artifact | Origin$ Graveyard | Destination$ Battlefield | SpellDescription$ Each player returns all artifact cards from their graveyard to the battlefield. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/roar_of_reclamation.jpg Oracle:Each player returns all artifact cards from their graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/r/roar_of_the_crowd.txt b/forge-gui/res/cardsfolder/r/roar_of_the_crowd.txt index 09a717ecd4d..5d4ba94265f 100644 --- a/forge-gui/res/cardsfolder/r/roar_of_the_crowd.txt +++ b/forge-gui/res/cardsfolder/r/roar_of_the_crowd.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ ChooseType | Cost$ 3 R | Defined$ You | Type$ Creature | SubAbility$ DBDamage | SpellDescription$ Choose a creature type. CARDNAME deals damage to any target equal to the number of permanents you control of the chosen type. SVar:DBDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X SVar:X:Count$Valid Permanent.ChosenType+YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/roar_of_the_crowd.jpg Oracle:Choose a creature type. Roar of the Crowd deals damage to any target equal to the number of permanents you control of the chosen type. diff --git a/forge-gui/res/cardsfolder/r/roar_of_the_kha.txt b/forge-gui/res/cardsfolder/r/roar_of_the_kha.txt index 258bbc02c90..fbf654fa9ae 100644 --- a/forge-gui/res/cardsfolder/r/roar_of_the_kha.txt +++ b/forge-gui/res/cardsfolder/r/roar_of_the_kha.txt @@ -5,6 +5,6 @@ K:Entwine:1 W A:SP$ Charm | Cost$ 1 W | Choices$ DBPump,DBUntap | CharmNum$ 1 SVar:DBPump:DB$ PumpAll | NumAtt$ 1 | NumDef$ 1 | ValidCards$ Creature.YouCtrl | SpellDescription$ Creatures you control get +1/+1 until end of turn. SVar:DBUntap:DB$ UntapAll | ValidCards$ Creature.YouCtrl | SpellDescription$ Untap all creatures you control. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/roar_of_the_kha.jpg Oracle:Choose one —\n• Creatures you control get +1/+1 until end of turn.\n• Untap all creatures you control.\nEntwine {1}{W} (Choose both if you pay the entwine cost.) diff --git a/forge-gui/res/cardsfolder/r/roaring_primadox.txt b/forge-gui/res/cardsfolder/r/roaring_primadox.txt index 6e1b1330c74..a2f5186948f 100644 --- a/forge-gui/res/cardsfolder/r/roaring_primadox.txt +++ b/forge-gui/res/cardsfolder/r/roaring_primadox.txt @@ -5,6 +5,6 @@ PT:4/4 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigBounce | TriggerDescription$ At the beginning of your upkeep, return a creature you control to its owner's hand. SVar:TrigBounce:DB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Hidden$ True | Mandatory$ True | ChangeType$ Creature.YouCtrl | ChangeNum$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/roaring_primadox.jpg -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NeedsToPlay:Creature.YouCtrl+inZoneBattlefield Oracle:At the beginning of your upkeep, return a creature you control to its owner's hand. diff --git a/forge-gui/res/cardsfolder/r/rock_hydra.txt b/forge-gui/res/cardsfolder/r/rock_hydra.txt index 2c0ce77a386..f0f4a94dee9 100644 --- a/forge-gui/res/cardsfolder/r/rock_hydra.txt +++ b/forge-gui/res/cardsfolder/r/rock_hydra.txt @@ -15,6 +15,6 @@ SVar:NumDmgTrig:TriggerCount$DamageAmount SVar:X:Count$xPaid SVar:Y:Count$CardCounters.P1P1 SVar:Z:SVar$NumDmg/Minus.Y -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rock_hydra.jpg Oracle:Rock Hydra enters the battlefield with X +1/+1 counters on it.\nFor each 1 damage that would be dealt to Rock Hydra, if it has a +1/+1 counter on it, remove a +1/+1 counter from it and prevent that 1 damage.\n{R}: Prevent the next 1 damage that would be dealt to Rock Hydra this turn.\n{R}{R}{R}: Put a +1/+1 counter on Rock Hydra. Activate this ability only during your upkeep. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/r/rocket_launcher.txt b/forge-gui/res/cardsfolder/r/rocket_launcher.txt index 725adcb4f61..53eaeb66b62 100644 --- a/forge-gui/res/cardsfolder/r/rocket_launcher.txt +++ b/forge-gui/res/cardsfolder/r/rocket_launcher.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ DealDamage | Cost$ 2 | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | SubAbility$ DBDelayTrig | IsPresent$ Card.Self+notFirstTurnControlled | SpellDescription$ CARDNAME deals 1 damage to any target. Destroy CARDNAME at the beginning of the next end step. Activate this ability only if you've controlled CARDNAME continuously since the beginning of your most recent turn. SVar:DBDelayTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ DestroySource | TriggerDescription$ Destroy CARDNAME at the beginning of the next end step. SVar:DestroySource:DB$ Destroy | Defined$ Self -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rocket_launcher.jpg Oracle:{2}: Rocket Launcher deals 1 damage to any target. Destroy Rocket Launcher at the beginning of the next end step. Activate this ability only if you've controlled Rocket Launcher continuously since the beginning of your most recent turn. diff --git a/forge-gui/res/cardsfolder/r/rofelloss_gift.txt b/forge-gui/res/cardsfolder/r/rofelloss_gift.txt index 74c83dc8458..7099a2c1ade 100644 --- a/forge-gui/res/cardsfolder/r/rofelloss_gift.txt +++ b/forge-gui/res/cardsfolder/r/rofelloss_gift.txt @@ -5,6 +5,6 @@ A:SP$ Reveal | Cost$ G | RevealValid$ Card.Green+YouCtrl | AnyNumber$ True | Rem SVar:DBChangeZone:DB$ ChangeZone | Hidden$ True | Mandatory$ True | ChangeType$ Card.Enchantment+YouOwn | ChangeNum$ X | References$ X | Origin$ Graveyard | Destination$ Hand | SubAbility$ Cleanup SVar:Cleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rofelloss_gift.jpg Oracle:Reveal any number of green cards in your hand. Return an enchantment card from your graveyard to your hand for each card revealed this way. diff --git a/forge-gui/res/cardsfolder/r/rogue_skycaptain.txt b/forge-gui/res/cardsfolder/r/rogue_skycaptain.txt index 33db1585d37..6dcceda0b27 100644 --- a/forge-gui/res/cardsfolder/r/rogue_skycaptain.txt +++ b/forge-gui/res/cardsfolder/r/rogue_skycaptain.txt @@ -12,7 +12,7 @@ SVar:DBDonate:DB$ GainControl | Defined$ Self | NewController$ Player.Chosen | C SVar:DBReset:DB$ StoreSVar | SVar$ CheckPaid | Type$ Number | Expression$ 0 SVar:CheckPaid:Number$0 SVar:X:Count$CardCounters.WAGE/Twice -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rogue_skycaptain.jpg Oracle:Flying\nAt the beginning of your upkeep, put a wage counter on Rogue Skycaptain. You may pay {2} for each wage counter on it. If you don't, remove all wage counters from Rogue Skycaptain and an opponent gains control of it. diff --git a/forge-gui/res/cardsfolder/r/roiling_horror.txt b/forge-gui/res/cardsfolder/r/roiling_horror.txt index dc83f7d051f..5ba7af71779 100644 --- a/forge-gui/res/cardsfolder/r/roiling_horror.txt +++ b/forge-gui/res/cardsfolder/r/roiling_horror.txt @@ -11,6 +11,6 @@ SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 SVar:X:Count$xPaid SVar:Y:Count$YourLifeTotal/Minus.Z SVar:Z:Count$OppGreatestLifeTotal -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/roiling_horror.jpg Oracle:Roiling Horror's power and toughness are each equal to your life total minus the life total of an opponent with the most life.\nSuspend X—{X}{B}{B}{B}. X can't be 0. (Rather than cast this card from your hand, you may pay {X}{B}{B}{B} and exile it with X time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.)\nWhenever a time counter is removed from Roiling Horror while it's exiled, target player loses 1 life and you gain 1 life. diff --git a/forge-gui/res/cardsfolder/r/roiling_terrain.txt b/forge-gui/res/cardsfolder/r/roiling_terrain.txt index a2ae27de3ed..ddaf0c6a13c 100644 --- a/forge-gui/res/cardsfolder/r/roiling_terrain.txt +++ b/forge-gui/res/cardsfolder/r/roiling_terrain.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ Destroy | Cost$ 2 R R | ValidTgts$ Land | TgtPrompt$ Select target land | SubAbility$ DBDamage | SpellDescription$ Destroy target land, then CARDNAME deals damage to that land's controller equal to the number of land cards in that player's graveyard. SVar:DBDamage:DB$DealDamage | Defined$ TargetedController | NumDmg$ X | References$ X SVar:X:TargetedController$LandsInGraveyard -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/roiling_terrain.jpg Oracle:Destroy target land, then Roiling Terrain deals damage to that land's controller equal to the number of land cards in that player's graveyard. diff --git a/forge-gui/res/cardsfolder/r/roilmages_trick.txt b/forge-gui/res/cardsfolder/r/roilmages_trick.txt index 359e4a71491..5dc29f1263f 100644 --- a/forge-gui/res/cardsfolder/r/roilmages_trick.txt +++ b/forge-gui/res/cardsfolder/r/roilmages_trick.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ PumpAll | Cost$ 3 U | ValidCards$ Creature.OppCtrl | NumAtt$ -X | NumDef$ 0 | References$ X | SubAbility$ DBDraw | SpellDescription$ Converge — Creatures your opponents control get -X/-0 until end of turn, where X is the number of colors of mana spent to cast CARDNAME. Draw a card. SVar:DBDraw:DB$ Draw | NumCards$ 1 SVar:X:Count$Converge -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/roilmages_trick.jpg Oracle:Converge — Creatures your opponents control get -X/-0 until end of turn, where X is the number of colors of mana spent to cast Roilmage's Trick.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/r/rollick_of_abandon.txt b/forge-gui/res/cardsfolder/r/rollick_of_abandon.txt index f6af58e9b98..92ecc0ab438 100644 --- a/forge-gui/res/cardsfolder/r/rollick_of_abandon.txt +++ b/forge-gui/res/cardsfolder/r/rollick_of_abandon.txt @@ -2,6 +2,6 @@ Name:Rollick of Abandon ManaCost:3 R R Types:Sorcery A:SP$ PumpAll | Cost$ 3 R R | ValidCards$ Creature | NumAtt$ +2 | NumDef$ -2 | SpellDescription$ All creatures get +2/-2 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rollick_of_abandon.jpg Oracle:All creatures get +2/-2 until end of turn. diff --git a/forge-gui/res/cardsfolder/r/rolling_spoil.txt b/forge-gui/res/cardsfolder/r/rolling_spoil.txt index ce397d022a5..207934a5d45 100644 --- a/forge-gui/res/cardsfolder/r/rolling_spoil.txt +++ b/forge-gui/res/cardsfolder/r/rolling_spoil.txt @@ -4,7 +4,7 @@ Types:Sorcery A:SP$ Destroy | Cost$ 2 G G | ValidTgts$ Land| TgtPrompt$ Select target land | SubAbility$ PumpAll | SpellDescription$ Destroy target land. If {B} was spent to cast CARDNAME, all creatures get -1/-1 until end of turn. SVar:PumpAll:DB$ PumpAll | ValidCards$ Creature | NumAtt$ -1 | NumDef$ -1 | ConditionManaSpent$ B | IsCurse$ True SVar:ManaNeededToAvoidNegativeEffect:black -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black SVar:Picture:http://www.wizards.com/global/images/magic/general/rolling_spoil.jpg Oracle:Destroy target land. If {B} was spent to cast Rolling Spoil, all creatures get -1/-1 until end of turn. diff --git a/forge-gui/res/cardsfolder/r/rolling_stones.txt b/forge-gui/res/cardsfolder/r/rolling_stones.txt index c008147ed22..a44513394c6 100644 --- a/forge-gui/res/cardsfolder/r/rolling_stones.txt +++ b/forge-gui/res/cardsfolder/r/rolling_stones.txt @@ -4,6 +4,6 @@ Types:Enchantment S:Mode$ Continuous | Affected$ Creature.Wall | AddHiddenKeyword$ CARDNAME can attack as though it didn't have defender. | Description$ Wall creatures can attack as though they didn't have defender. SVar:NonStackingEffect:True SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rolling_stones.jpg Oracle:Wall creatures can attack as though they didn't have defender. diff --git a/forge-gui/res/cardsfolder/r/ronom_hulk.txt b/forge-gui/res/cardsfolder/r/ronom_hulk.txt index 5536ba0d492..c003849a087 100644 --- a/forge-gui/res/cardsfolder/r/ronom_hulk.txt +++ b/forge-gui/res/cardsfolder/r/ronom_hulk.txt @@ -4,6 +4,6 @@ Types:Creature Beast PT:5/6 K:Protection:Snow:Protection from snow K:Cumulative upkeep:1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ronom_hulk.jpg Oracle:Protection from snow\nCumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) diff --git a/forge-gui/res/cardsfolder/r/ronom_serpent.txt b/forge-gui/res/cardsfolder/r/ronom_serpent.txt index ebd587e5aa8..34383f2fadb 100644 --- a/forge-gui/res/cardsfolder/r/ronom_serpent.txt +++ b/forge-gui/res/cardsfolder/r/ronom_serpent.txt @@ -6,6 +6,6 @@ S:Mode$ CantAttack | ValidCard$ Card.Self | UnlessDefenderControls$ Land.Snow | T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Land.Snow+YouCtrl | PresentCompare$ EQ0 | Execute$ TrigSac | TriggerDescription$ When you control no snow lands, sacrifice Ronom Serpent. SVar:TrigSac:DB$ Sacrifice | Defined$ Self SVar:NeedsToPlay:Land.Snow+YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ronom_serpent.jpg Oracle:Ronom Serpent can't attack unless defending player controls a snow land.\nWhen you control no snow lands, sacrifice Ronom Serpent. diff --git a/forge-gui/res/cardsfolder/r/rooftop_storm.txt b/forge-gui/res/cardsfolder/r/rooftop_storm.txt index 4137eaa1c0b..8b4ea9bf2b7 100644 --- a/forge-gui/res/cardsfolder/r/rooftop_storm.txt +++ b/forge-gui/res/cardsfolder/r/rooftop_storm.txt @@ -3,6 +3,6 @@ ManaCost:5 U Types:Enchantment S:Mode$ Continuous | Affected$ Creature.YouCtrl+Zombie | AddKeyword$ Alternative Cost:0 | AffectedZone$ Hand,Graveyard,Exile,Library,Command | Description$ You may pay {0} rather than pay the mana cost for Zombie creature spells you cast. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rooftop_storm.jpg Oracle:You may pay {0} rather than pay the mana cost for Zombie creature spells you cast. diff --git a/forge-gui/res/cardsfolder/r/root_cage.txt b/forge-gui/res/cardsfolder/r/root_cage.txt index f640419cf18..291ecdea696 100644 --- a/forge-gui/res/cardsfolder/r/root_cage.txt +++ b/forge-gui/res/cardsfolder/r/root_cage.txt @@ -3,6 +3,6 @@ ManaCost:1 G Types:Enchantment S:Mode$ Continuous | Affected$ Mercenary | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Mercenaries don't untap during their controllers' untap steps. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/root_cage.jpg Oracle:Mercenaries don't untap during their controllers' untap steps. diff --git a/forge-gui/res/cardsfolder/r/root_greevil.txt b/forge-gui/res/cardsfolder/r/root_greevil.txt index e03fd341b2c..c3f31c19446 100644 --- a/forge-gui/res/cardsfolder/r/root_greevil.txt +++ b/forge-gui/res/cardsfolder/r/root_greevil.txt @@ -4,6 +4,6 @@ Types:Creature Beast PT:2/3 A:AB$ ChooseColor | Cost$ 2 G T Sac<1/CARDNAME> | Defined$ You | SubAbility$ DestroyAll | SpellDescription$ Destroy all enchantments of the color of your choice. SVar:DestroyAll:DB$ DestroyAll | ValidCards$ Enchantment.ChosenColor -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/root_greevil.jpg Oracle:{2}{G}, {T}, Sacrifice Root Greevil: Destroy all enchantments of the color of your choice. diff --git a/forge-gui/res/cardsfolder/r/root_maze.txt b/forge-gui/res/cardsfolder/r/root_maze.txt index e339b4981ed..a21ae4da538 100644 --- a/forge-gui/res/cardsfolder/r/root_maze.txt +++ b/forge-gui/res/cardsfolder/r/root_maze.txt @@ -3,6 +3,6 @@ ManaCost:G Types:Enchantment S:Mode$ ETBTapped | ValidCard$ Artifact,Land | Description$ Artifacts and lands enter the battlefield tapped. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/root_maze.jpg Oracle:Artifacts and lands enter the battlefield tapped. diff --git a/forge-gui/res/cardsfolder/r/rootgrapple.txt b/forge-gui/res/cardsfolder/r/rootgrapple.txt index 30213d31703..c29d19592c0 100644 --- a/forge-gui/res/cardsfolder/r/rootgrapple.txt +++ b/forge-gui/res/cardsfolder/r/rootgrapple.txt @@ -3,6 +3,6 @@ ManaCost:4 G Types:Tribal Instant Treefolk A:SP$ Destroy | Cost$ 4 G | ValidTgts$ Permanent.nonCreature | TgtPrompt$ Select target noncreature permanent | SubAbility$ DBDraw | SpellDescription$ Destroy target noncreature permanent. If you control a Treefolk, draw a card. SVar:DBDraw:DB$Draw | NumCards$ 1 | ConditionPresent$ Treefolk.YouCtrl | ConditionCompare$ GE1 | ConditionDescription$ If you control a Treefolk, -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rootgrapple.jpg Oracle:Destroy target noncreature permanent. If you control a Treefolk, draw a card. diff --git a/forge-gui/res/cardsfolder/r/rootrunner.txt b/forge-gui/res/cardsfolder/r/rootrunner.txt index 644a7a1bfbc..fec543a0912 100644 --- a/forge-gui/res/cardsfolder/r/rootrunner.txt +++ b/forge-gui/res/cardsfolder/r/rootrunner.txt @@ -4,7 +4,7 @@ Types:Creature Spirit PT:3/3 A:AB$ ChangeZone | Cost$ G G Sac<1/CARDNAME> | ValidTgts$ Land | TgtPrompt$ Select target Land | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SpellDescription$ Put target land on top of its owner's library. K:Soulshift:3 -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHints:Type$Spirit SVar:Picture:http://www.wizards.com/global/images/magic/general/rootrunner.jpg Oracle:{G}{G}, Sacrifice Rootrunner: Put target land on top of its owner's library.\nSoulshift 3 (When this creature dies, you may return target Spirit card with converted mana cost 3 or less from your graveyard to your hand.) diff --git a/forge-gui/res/cardsfolder/r/roots_of_life.txt b/forge-gui/res/cardsfolder/r/roots_of_life.txt index 70ff4cd6e4a..29a8c4267ed 100644 --- a/forge-gui/res/cardsfolder/r/roots_of_life.txt +++ b/forge-gui/res/cardsfolder/r/roots_of_life.txt @@ -5,6 +5,6 @@ K:ETBReplacement:Other:ChooseLT SVar:ChooseLT:DB$ ChooseType | Defined$ You | Type$ Basic Land | InvalidTypes$ Mountain,Forest,Plains | AILogic$ MostProminentOppControls | SpellDescription$ As CARDNAME enters the battlefield, choose Island or Swamp. T:Mode$ Taps | ValidCard$ Land.ChosenType+OppCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | OptionalDecider$ You | TriggerDescription$ Whenever a land of the chosen type an opponent controls becomes tapped, you may gain 1 life. SVar:TrigGainLife:DB$ GainLife | LifeAmount$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/roots_of_life.jpg Oracle:As Roots of Life enters the battlefield, choose Island or Swamp.\nWhenever a land of the chosen type an opponent controls becomes tapped, you gain 1 life. diff --git a/forge-gui/res/cardsfolder/r/rootwater_matriarch.txt b/forge-gui/res/cardsfolder/r/rootwater_matriarch.txt index 2cb19e133dd..e98f6be1d46 100644 --- a/forge-gui/res/cardsfolder/r/rootwater_matriarch.txt +++ b/forge-gui/res/cardsfolder/r/rootwater_matriarch.txt @@ -6,6 +6,6 @@ A:AB$ GainControl | Cost$ T | ValidTgts$ Creature | References$ X,Y | AITgts$ Cr # the hostcard of SVar X is the controlled card SVar:X:Count$Valid Card.Self+enchanted SVar:Y:Targeted$Valid Card.enchanted -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rootwater_matriarch.jpg Oracle:{T}: Gain control of target creature for as long as that creature is enchanted. diff --git a/forge-gui/res/cardsfolder/r/rootwater_mystic.txt b/forge-gui/res/cardsfolder/r/rootwater_mystic.txt index 7cc792f6400..3f47d7a12e9 100644 --- a/forge-gui/res/cardsfolder/r/rootwater_mystic.txt +++ b/forge-gui/res/cardsfolder/r/rootwater_mystic.txt @@ -3,6 +3,6 @@ ManaCost:U Types:Creature Merfolk Wizard PT:1/1 A:AB$ Dig | Cost$ 1 U | ValidTgts$ Player | TgtPrompt$ Select target player | DigNum$ 1 | DestinationZone$ Library | LibraryPosition$ 0 | SpellDescription$ Look at the top card of target player's library. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rootwater_mystic.jpg Oracle:{1}{U}: Look at the top card of target player's library. diff --git a/forge-gui/res/cardsfolder/r/rotting_giant.txt b/forge-gui/res/cardsfolder/r/rotting_giant.txt index 0198fff7258..7196663e561 100644 --- a/forge-gui/res/cardsfolder/r/rotting_giant.txt +++ b/forge-gui/res/cardsfolder/r/rotting_giant.txt @@ -5,6 +5,6 @@ PT:3/3 T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ Whenever CARDNAME attacks or blocks, sacrifice it unless you exile a card from your graveyard. T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigSac | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or blocks, sacrifice it unless you exile a card from your graveyard. SVar:TrigSac:DB$ Sacrifice | Defined$ Self | UnlessCost$ ExileFromGrave<1/Card> | UnlessPayer$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rotting_giant.jpg Oracle:Whenever Rotting Giant attacks or blocks, sacrifice it unless you exile a card from your graveyard. diff --git a/forge-gui/res/cardsfolder/r/rouse.txt b/forge-gui/res/cardsfolder/r/rouse.txt index 0f58026ba5e..223a9a747df 100644 --- a/forge-gui/res/cardsfolder/r/rouse.txt +++ b/forge-gui/res/cardsfolder/r/rouse.txt @@ -3,6 +3,6 @@ ManaCost:1 B Types:Instant A:SP$ Pump | Cost$ 1 B | ValidTgts$ Creature | NumAtt$ +2 | TgtPrompt$ Select target creature | SpellDescription$ Target creature gets +2/+0 until end of turn. A:SP$ Pump | Cost$ PayLife<2> | ValidTgts$ Creature | NumAtt$ +2 | TgtPrompt$ Select target creature | isPresent$ Swamp.YouCtrl | SpellDescription$ If you control a Swamp, you may pay 2 life rather than pay Rouse's mana cost. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rouse.jpg Oracle:If you control a Swamp, you may pay 2 life rather than pay Rouse's mana cost.\nTarget creature gets +2/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/r/royal_decree.txt b/forge-gui/res/cardsfolder/r/royal_decree.txt index 5de4ab417cd..c17441887be 100644 --- a/forge-gui/res/cardsfolder/r/royal_decree.txt +++ b/forge-gui/res/cardsfolder/r/royal_decree.txt @@ -4,6 +4,6 @@ Types:Enchantment K:Cumulative upkeep:W T:Mode$ Taps | ValidCard$ Swamp,Mountain,Permanent.Black,Permanent.Red | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a Swamp, Mountain, black permanent, or red permanent becomes tapped, CARDNAME deals 1 damage to that permanent's controller. SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredCardController | NumDmg$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/royal_decree.jpg Oracle:Cumulative upkeep {W} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nWhenever a Swamp, Mountain, black permanent, or red permanent becomes tapped, Royal Decree deals 1 damage to that permanent's controller. diff --git a/forge-gui/res/cardsfolder/r/ruby_medallion.txt b/forge-gui/res/cardsfolder/r/ruby_medallion.txt index e954dfb962b..b02b4356f8d 100644 --- a/forge-gui/res/cardsfolder/r/ruby_medallion.txt +++ b/forge-gui/res/cardsfolder/r/ruby_medallion.txt @@ -2,7 +2,7 @@ Name:Ruby Medallion ManaCost:2 Types:Artifact S:Mode$ ReduceCost | ValidCard$ Card.Red | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Red spells you cast cost {1} less to cast. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Red SVar:Picture:http://www.wizards.com/global/images/magic/general/ruby_medallion.jpg Oracle:Red spells you cast cost {1} less to cast. diff --git a/forge-gui/res/cardsfolder/r/rude_awakening.txt b/forge-gui/res/cardsfolder/r/rude_awakening.txt index 7a485a9ce1b..5a7f03c5035 100644 --- a/forge-gui/res/cardsfolder/r/rude_awakening.txt +++ b/forge-gui/res/cardsfolder/r/rude_awakening.txt @@ -5,6 +5,6 @@ K:Entwine:2 G A:SP$ Charm | Cost$ 4 G | Choices$ DBUntap,DBAnimate | CharmNum$ 1 SVar:DBUntap:DB$ UntapAll | ValidCards$ Land.YouCtrl | SpellDescription$ Untap all lands you control. SVar:DBAnimate:DB$ AnimateAll | ValidCards$ Land.YouCtrl | Power$ 2 | Toughness$ 2 | Types$ Creature | SpellDescription$ Until end of turn, lands you control become 2/2 creatures that are still lands. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rude_awakening.jpg Oracle:Choose one —\n• Untap all lands you control.\n• Until end of turn, lands you control become 2/2 creatures that are still lands.\nEntwine {2}{G} (Choose both if you pay the entwine cost.) diff --git a/forge-gui/res/cardsfolder/r/rugged_prairie.txt b/forge-gui/res/cardsfolder/r/rugged_prairie.txt index c71474e1d50..39a5aa223d4 100644 --- a/forge-gui/res/cardsfolder/r/rugged_prairie.txt +++ b/forge-gui/res/cardsfolder/r/rugged_prairie.txt @@ -5,6 +5,6 @@ A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ RW T | Produced$ W | Amount$ 2 | SpellDescription$ Add {W}{W}. A:AB$ Mana | Cost$ RW T | Produced$ R W | SpellDescription$ Add {R}{W}. A:AB$ Mana | Cost$ RW T | Produced$ R | Amount$ 2 | SpellDescription$ Add {R}{R}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rugged_prairie.jpg Oracle:{T}: Add {C}.\n{R/W}, {T}: Add {R}{R}, {R}{W}, or {W}{W}. diff --git a/forge-gui/res/cardsfolder/r/ruin_ghost.txt b/forge-gui/res/cardsfolder/r/ruin_ghost.txt index fdf648d988c..3a651bbec98 100644 --- a/forge-gui/res/cardsfolder/r/ruin_ghost.txt +++ b/forge-gui/res/cardsfolder/r/ruin_ghost.txt @@ -4,6 +4,6 @@ Types:Creature Spirit PT:1/1 A:AB$ ChangeZone | Cost$ W T | TargetMin$ 1 | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | RememberTargets$ True | ForgetOtherTargets$ True | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBReturn | SpellDescription$ Exile target land you control, then return it to the battlefield under your control. SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | GainControl$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ruin_ghost.jpg Oracle:{W}, {T}: Exile target land you control, then return it to the battlefield under your control. diff --git a/forge-gui/res/cardsfolder/r/ruins_of_trokair.txt b/forge-gui/res/cardsfolder/r/ruins_of_trokair.txt index d1b1902eee3..81aab304857 100644 --- a/forge-gui/res/cardsfolder/r/ruins_of_trokair.txt +++ b/forge-gui/res/cardsfolder/r/ruins_of_trokair.txt @@ -4,6 +4,6 @@ Types:Land K:CARDNAME enters the battlefield tapped. A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ W | Amount$ 2 | SpellDescription$ Add {W}{W}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ruins_of_trokair.jpg Oracle:Ruins of Trokair enters the battlefield tapped.\n{T}: Add {W}.\n{T}, Sacrifice Ruins of Trokair: Add {W}{W}. diff --git a/forge-gui/res/cardsfolder/r/rule_of_law.txt b/forge-gui/res/cardsfolder/r/rule_of_law.txt index 0b719081643..e53c8aa5f25 100644 --- a/forge-gui/res/cardsfolder/r/rule_of_law.txt +++ b/forge-gui/res/cardsfolder/r/rule_of_law.txt @@ -3,6 +3,6 @@ ManaCost:2 W Types:Enchantment S:Mode$ CantBeCast | ValidCard$ Card | Caster$ Player | NumLimitEachTurn$ 1 | Description$ Each player can't cast more than one spell each turn. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rule_of_law.jpg Oracle:Each player can't cast more than one spell each turn. diff --git a/forge-gui/res/cardsfolder/r/rumbling_aftershocks.txt b/forge-gui/res/cardsfolder/r/rumbling_aftershocks.txt index 6b3de5bd2b8..dfab11dee89 100644 --- a/forge-gui/res/cardsfolder/r/rumbling_aftershocks.txt +++ b/forge-gui/res/cardsfolder/r/rumbling_aftershocks.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ SpellCast | ValidCard$ Card.YouCtrl+kicked | TriggerZones$ Battlefield | Execute$ DamageSomeone | OptionalDecider$ You | TriggerDescription$ Whenever you cast a kicked spell, you may have CARDNAME deal damage to any target equal to the number of times that spell was kicked. SVar:DamageSomeone:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | References$ X | NumDmg$ X | TgtPrompt$ Select any target SVar:X:TriggeredSpellAbility$Count$TimesKicked -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rumbling_aftershocks.jpg Oracle:Whenever you cast a kicked spell, you may have Rumbling Aftershocks deal damage to any target equal to the number of times that spell was kicked. diff --git a/forge-gui/res/cardsfolder/r/rumbling_crescendo.txt b/forge-gui/res/cardsfolder/r/rumbling_crescendo.txt index f3aed6c989c..6fa79fd4ed4 100644 --- a/forge-gui/res/cardsfolder/r/rumbling_crescendo.txt +++ b/forge-gui/res/cardsfolder/r/rumbling_crescendo.txt @@ -5,6 +5,6 @@ A:AB$ Destroy | Cost$ R Sac<1/CARDNAME> | TargetMin$ 0 | TargetMax$ X | Referenc T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, you may put a verse counter on CARDNAME. SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ VERSE | CounterNum$ 1 SVar:X:Count$CardCounters.VERSE -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rumbling_crescendo.jpg Oracle:At the beginning of your upkeep, you may put a verse counter on Rumbling Crescendo.\n{R}, Sacrifice Rumbling Crescendo: Destroy up to X target lands, where X is the number of verse counters on Rumbling Crescendo. diff --git a/forge-gui/res/cardsfolder/r/rummaging_wizard.txt b/forge-gui/res/cardsfolder/r/rummaging_wizard.txt index b2379f1beed..b0951e87eaf 100644 --- a/forge-gui/res/cardsfolder/r/rummaging_wizard.txt +++ b/forge-gui/res/cardsfolder/r/rummaging_wizard.txt @@ -3,6 +3,6 @@ ManaCost:3 U Types:Creature Human Wizard PT:2/2 A:AB$ Dig | Cost$ 2 U | DigNum$ 1 | DestinationZone$ Graveyard | Optional$ True | LibraryPosition2$ 0 | SpellDescription$ Look at the top card of your library. You may put that card into your graveyard. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rummaging_wizard.jpg Oracle:{2}{U}: Look at the top card of your library. You may put that card into your graveyard. diff --git a/forge-gui/res/cardsfolder/r/rune_of_protection_artifacts.txt b/forge-gui/res/cardsfolder/r/rune_of_protection_artifacts.txt index 9378dbdca77..6efcbea9bd5 100644 --- a/forge-gui/res/cardsfolder/r/rune_of_protection_artifacts.txt +++ b/forge-gui/res/cardsfolder/r/rune_of_protection_artifacts.txt @@ -7,6 +7,6 @@ SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPreventNextFromSource | SVars$ R SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.ChosenCard+Artifact | ValidTarget$ You | ReplaceWith$ ExileEffect | PreventionEffect$ True | Description$ The next time the chosen artifact source deals damage to you, prevent that damage. SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rune_of_protection_artifacts.jpg Oracle:{W}: The next time an artifact source of your choice would deal damage to you this turn, prevent that damage.\nCycling {2} ({2}, Discard this card: Draw a card.) diff --git a/forge-gui/res/cardsfolder/r/rune_of_protection_black.txt b/forge-gui/res/cardsfolder/r/rune_of_protection_black.txt index a1a5adfebf6..f8ecfaca02e 100644 --- a/forge-gui/res/cardsfolder/r/rune_of_protection_black.txt +++ b/forge-gui/res/cardsfolder/r/rune_of_protection_black.txt @@ -7,6 +7,6 @@ SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPreventNextFromSource | SVars$ R SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.ChosenCard+BlackSource | ValidTarget$ You | ReplaceWith$ ExileEffect | PreventionEffect$ True | Description$ The next time the chosen black source deals damage to you, prevent that damage. SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rune_of_protection_black.jpg Oracle:{W}: The next time a black source of your choice would deal damage to you this turn, prevent that damage.\nCycling {2} ({2}, Discard this card: Draw a card.) diff --git a/forge-gui/res/cardsfolder/r/rune_of_protection_blue.txt b/forge-gui/res/cardsfolder/r/rune_of_protection_blue.txt index 0102b39a461..cdbe703127a 100644 --- a/forge-gui/res/cardsfolder/r/rune_of_protection_blue.txt +++ b/forge-gui/res/cardsfolder/r/rune_of_protection_blue.txt @@ -7,6 +7,6 @@ SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPreventNextFromSource | SVars$ R SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.ChosenCard+BlueSource | ValidTarget$ You | ReplaceWith$ ExileEffect | PreventionEffect$ True | Description$ The next time the chosen blue source deals damage to you, prevent that damage. SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rune_of_protection_blue.jpg Oracle:{W}: The next time a blue source of your choice would deal damage to you this turn, prevent that damage.\nCycling {2} ({2}, Discard this card: Draw a card.) diff --git a/forge-gui/res/cardsfolder/r/rune_of_protection_green.txt b/forge-gui/res/cardsfolder/r/rune_of_protection_green.txt index d9b344c957b..f08159ae6bf 100644 --- a/forge-gui/res/cardsfolder/r/rune_of_protection_green.txt +++ b/forge-gui/res/cardsfolder/r/rune_of_protection_green.txt @@ -7,6 +7,6 @@ SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPreventNextFromSource | SVars$ R SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.ChosenCard+GreenSource | ValidTarget$ You | ReplaceWith$ ExileEffect | PreventionEffect$ True | Description$ The next time the chosen green source deals damage to you, prevent that damage. SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rune_of_protection_green.jpg Oracle:{W}: The next time a green source of your choice would deal damage to you this turn, prevent that damage.\nCycling {2} ({2}, Discard this card: Draw a card.) diff --git a/forge-gui/res/cardsfolder/r/rune_of_protection_lands.txt b/forge-gui/res/cardsfolder/r/rune_of_protection_lands.txt index e8d658f08d6..fce2d24e45f 100644 --- a/forge-gui/res/cardsfolder/r/rune_of_protection_lands.txt +++ b/forge-gui/res/cardsfolder/r/rune_of_protection_lands.txt @@ -7,6 +7,6 @@ SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPreventNextFromSource | SVars$ R SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.ChosenCard+Land | ValidTarget$ You | ReplaceWith$ ExileEffect | PreventionEffect$ True | Description$ The next time the chosen land source deals damage to you, prevent that damage. SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rune_of_protection_lands.jpg Oracle:{W}: The next time a land source of your choice would deal damage to you this turn, prevent that damage.\nCycling {2} ({2}, Discard this card: Draw a card.) diff --git a/forge-gui/res/cardsfolder/r/rune_of_protection_red.txt b/forge-gui/res/cardsfolder/r/rune_of_protection_red.txt index 18ac31828e1..3e79eb9b5de 100644 --- a/forge-gui/res/cardsfolder/r/rune_of_protection_red.txt +++ b/forge-gui/res/cardsfolder/r/rune_of_protection_red.txt @@ -7,6 +7,6 @@ SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPreventNextFromSource | SVars$ R SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.ChosenCard+RedSource | ValidTarget$ You | ReplaceWith$ ExileEffect | PreventionEffect$ True | Description$ The next time the chosen red source deals damage to you, prevent that damage. SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rune_of_protection_red.jpg Oracle:{W}: The next time a red source of your choice would deal damage to you this turn, prevent that damage.\nCycling {2} ({2}, Discard this card: Draw a card.) diff --git a/forge-gui/res/cardsfolder/r/rune_of_protection_white.txt b/forge-gui/res/cardsfolder/r/rune_of_protection_white.txt index eae7a24cc7b..b8569b76aaa 100644 --- a/forge-gui/res/cardsfolder/r/rune_of_protection_white.txt +++ b/forge-gui/res/cardsfolder/r/rune_of_protection_white.txt @@ -7,6 +7,6 @@ SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPreventNextFromSource | SVars$ R SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.ChosenCard+WhiteSource | ValidTarget$ You | ReplaceWith$ ExileEffect | PreventionEffect$ True | Description$ The next time the chosen white source deals damage to you, prevent that damage. SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rune_of_protection_white.jpg Oracle:{W}: The next time a white source of your choice would deal damage to you this turn, prevent that damage.\nCycling {2} ({2}, Discard this card: Draw a card.) diff --git a/forge-gui/res/cardsfolder/r/runed_arch.txt b/forge-gui/res/cardsfolder/r/runed_arch.txt index 4fe8b0bb8a8..84a1abb1892 100644 --- a/forge-gui/res/cardsfolder/r/runed_arch.txt +++ b/forge-gui/res/cardsfolder/r/runed_arch.txt @@ -6,6 +6,6 @@ A:AB$ Pump | Cost$ X T Sac<1/CARDNAME> | KW$ HIDDEN Unblockable | TargetMin$ 0 | # It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) SVar:X:Targeted$Amount SVar:MaxTgts:Count$Valid Creature.powerLE2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/runed_arch.jpg Oracle:Runed Arch enters the battlefield tapped.\n{X}, {T}, Sacrifice Runed Arch: X target creatures with power 2 or less can't be blocked this turn. diff --git a/forge-gui/res/cardsfolder/r/runed_halo.txt b/forge-gui/res/cardsfolder/r/runed_halo.txt index 04c928631ac..741ef1cfdf1 100644 --- a/forge-gui/res/cardsfolder/r/runed_halo.txt +++ b/forge-gui/res/cardsfolder/r/runed_halo.txt @@ -4,7 +4,7 @@ Types:Enchantment K:ETBReplacement:Other:DBNameCard SVar:DBNameCard:DB$ NameCard | Defined$ You | SpellDescription$ As CARDNAME enters the battlefield, choose a card name. S:Mode$ Continuous | Affected$ You | AddKeyword$ Protection:ChosenName | Description$ You have protection from the chosen name. (You can't be targeted, dealt damage, or enchanted by anything with that name.) -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/runed_halo.jpg Oracle:As Runed Halo enters the battlefield, name a card.\nYou have protection from the chosen name. (You can't be targeted, dealt damage, or enchanted by anything with that name.) diff --git a/forge-gui/res/cardsfolder/r/runic_repetition.txt b/forge-gui/res/cardsfolder/r/runic_repetition.txt index 1e79ace3fd2..fe8fa3db77c 100644 --- a/forge-gui/res/cardsfolder/r/runic_repetition.txt +++ b/forge-gui/res/cardsfolder/r/runic_repetition.txt @@ -2,6 +2,6 @@ Name:Runic Repetition ManaCost:2 U Types:Sorcery A:SP$ ChangeZone | Cost$ 2 U | Origin$ Exile | Destination$ Hand | TgtPrompt$ Select target exiled card with flashback you own | ValidTgts$ Card.YouOwn+withFlashback | SpellDescription$ Return target exiled card with flashback you own to your hand. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/runic_repetition.jpg Oracle:Return target exiled card with flashback you own to your hand. diff --git a/forge-gui/res/cardsfolder/r/rupture.txt b/forge-gui/res/cardsfolder/r/rupture.txt index 60b4339ac7e..43faa18ee74 100644 --- a/forge-gui/res/cardsfolder/r/rupture.txt +++ b/forge-gui/res/cardsfolder/r/rupture.txt @@ -5,6 +5,6 @@ A:SP$ Sacrifice | Cost$ 2 R | Amount$ 1 | SacValid$ Creature | RememberSacrifice SVar:RuptureDmg:DB$ DamageAll | ValidCards$ Creature.withoutFlying | ValidPlayers$ Player | NumDmg$ X | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:RememberedLKI$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rupture.jpg Oracle:Sacrifice a creature. Rupture deals damage equal to that creature's power to each creature without flying and each player. diff --git a/forge-gui/res/cardsfolder/r/ruric_thar_the_unbowed.txt b/forge-gui/res/cardsfolder/r/ruric_thar_the_unbowed.txt index cb30f3e1ad6..57290327b60 100644 --- a/forge-gui/res/cardsfolder/r/ruric_thar_the_unbowed.txt +++ b/forge-gui/res/cardsfolder/r/ruric_thar_the_unbowed.txt @@ -7,7 +7,7 @@ K:Reach K:CARDNAME attacks each combat if able. T:Mode$ SpellCast | TriggerZones$ Battlefield | ValidCard$ Card.nonCreature | ValidActivatingPlayer$ Player | Execute$ TrigDmg | TriggerDescription$ Whenever a player casts a noncreature spell, CARDNAME deals 6 damage to that player. SVar:TrigDmg:DB$ DealDamage | Defined$ TriggeredActivator | NumDmg$ 6 -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/ruric_thar_the_unbowed.jpg Oracle:Vigilance, reach\nRuric Thar, the Unbowed attacks each combat if able.\nWhenever a player casts a noncreature spell, Ruric Thar deals 6 damage to that player. diff --git a/forge-gui/res/cardsfolder/r/rush_of_battle.txt b/forge-gui/res/cardsfolder/r/rush_of_battle.txt index 84e32addbf1..d733be825a6 100644 --- a/forge-gui/res/cardsfolder/r/rush_of_battle.txt +++ b/forge-gui/res/cardsfolder/r/rush_of_battle.txt @@ -3,7 +3,7 @@ ManaCost:3 W Types:Sorcery A:SP$ PumpAll | Cost$ 3 W | ValidCards$ Creature.YouCtrl | NumAtt$ +2 | NumDef$ +1 | SubAbility$ DBPump | SpellDescription$ Creatures you control get +2/+1 until end of turn. Warrior creatures you control gain lifelink until end of turn. SVar:DBPump:DB$ PumpAll | ValidCards$ Creature.YouCtrl+Warrior | KW$ Lifelink -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Warrior SVar:Picture:http://www.wizards.com/global/images/magic/general/rush_of_battle.jpg Oracle:Creatures you control get +2/+1 until end of turn. Warrior creatures you control gain lifelink until end of turn. (Damage dealt by those Warriors also causes their controller to gain that much life.) diff --git a/forge-gui/res/cardsfolder/r/rush_of_knowledge.txt b/forge-gui/res/cardsfolder/r/rush_of_knowledge.txt index cd8572a3d66..158699506de 100644 --- a/forge-gui/res/cardsfolder/r/rush_of_knowledge.txt +++ b/forge-gui/res/cardsfolder/r/rush_of_knowledge.txt @@ -3,6 +3,6 @@ ManaCost:4 U Types:Sorcery A:SP$ Draw | Cost$ 4 U | Defined$ You | NumCards$ X | References$ X | SpellDescription$ Draw cards equal to the highest converted mana cost among permanents you control. SVar:X:Count$MaxCMCYouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rush_of_knowledge.jpg Oracle:Draw cards equal to the highest converted mana cost among permanents you control. diff --git a/forge-gui/res/cardsfolder/r/rushwood_grove.txt b/forge-gui/res/cardsfolder/r/rushwood_grove.txt index f68dd537758..2fdb4972cd3 100644 --- a/forge-gui/res/cardsfolder/r/rushwood_grove.txt +++ b/forge-gui/res/cardsfolder/r/rushwood_grove.txt @@ -6,6 +6,6 @@ A:AB$ PutCounter | Cost$ T | Defined$ Self | CounterType$ STORAGE | CounterNum$ A:AB$ Mana | Cost$ T SubCounter | Produced$ G | Amount$ ChosenX | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | References$ X | SpellDescription$ Add {G} for each storage counter removed this way. SVar:X:XChoice #ChosenX SVar created by Cost payment -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rushwood_grove.jpg Oracle:Rushwood Grove enters the battlefield tapped.\n{T}: Put a storage counter on Rushwood Grove.\n{T}, Remove any number of storage counters from Rushwood Grove: Add {G} for each storage counter removed this way. diff --git a/forge-gui/res/cardsfolder/r/rushwood_herbalist.txt b/forge-gui/res/cardsfolder/r/rushwood_herbalist.txt index 2798a73e7d5..bfe68fb6d13 100644 --- a/forge-gui/res/cardsfolder/r/rushwood_herbalist.txt +++ b/forge-gui/res/cardsfolder/r/rushwood_herbalist.txt @@ -3,6 +3,6 @@ ManaCost:2 G Types:Creature Human Spellshaper PT:2/2 A:AB$ Regenerate | ValidTgts$ Creature | TgtPrompt$ Select target creature | Cost$ G T Discard<1/Card> | SpellDescription$ Regenerate target creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rushwood_herbalist.jpg Oracle:{G}, {T}, Discard a card: Regenerate target creature. diff --git a/forge-gui/res/cardsfolder/r/rust.txt b/forge-gui/res/cardsfolder/r/rust.txt index 23ce34a48a4..a421b86f73e 100644 --- a/forge-gui/res/cardsfolder/r/rust.txt +++ b/forge-gui/res/cardsfolder/r/rust.txt @@ -2,7 +2,7 @@ Name:Rust ManaCost:G Types:Instant A:SP$ Counter | Cost$ G | TargetType$ Activated | TgtPrompt$ Select target ability | ValidTgts$ Artifact | SpellDescription$ Counter target activated ability from an artifact source. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rust.jpg Oracle:Counter target activated ability from an artifact source. (Mana abilities can't be targeted.) diff --git a/forge-gui/res/cardsfolder/r/rust_elemental.txt b/forge-gui/res/cardsfolder/r/rust_elemental.txt index 5e380e29475..b0fb71883d2 100644 --- a/forge-gui/res/cardsfolder/r/rust_elemental.txt +++ b/forge-gui/res/cardsfolder/r/rust_elemental.txt @@ -9,6 +9,6 @@ SVar:DBTap:DB$ Tap | Defined$ Self | ConditionCheckSVar$ X | ConditionSVarCompar SVar:DBLoseLife:DB$ LoseLife | Defined$ You | LifeAmount$ 4 | ConditionCheckSVar$ X | ConditionSVarCompare$ LT1 | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rust_elemental.jpg Oracle:Flying\nAt the beginning of your upkeep, sacrifice an artifact other than Rust Elemental. If you can't, tap Rust Elemental and you lose 4 life. diff --git a/forge-gui/res/cardsfolder/r/rust_tick.txt b/forge-gui/res/cardsfolder/r/rust_tick.txt index 0826257af97..9e2c030ea7d 100644 --- a/forge-gui/res/cardsfolder/r/rust_tick.txt +++ b/forge-gui/res/cardsfolder/r/rust_tick.txt @@ -7,6 +7,6 @@ A:AB$ Tap | Cost$ 1 T | ValidTgts$ Artifact | RememberTapped$ True | AlwaysRemem S:Mode$ Continuous | Affected$ Creature.IsRemembered | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. T:Mode$ Untaps | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ ClearRemembered | Static$ True SVar:ClearRemembered:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rust_tick.jpg Oracle:You may choose not to untap Rust Tick during your untap step.\n{1}, {T}: Tap target artifact. It doesn't untap during its controller's untap step for as long as Rust Tick remains tapped. diff --git a/forge-gui/res/cardsfolder/r/rusted_slasher.txt b/forge-gui/res/cardsfolder/r/rusted_slasher.txt index cffce85b82f..55aa48c6af6 100644 --- a/forge-gui/res/cardsfolder/r/rusted_slasher.txt +++ b/forge-gui/res/cardsfolder/r/rusted_slasher.txt @@ -4,6 +4,6 @@ Types:Artifact Creature Horror PT:4/1 A:AB$ Regenerate | Cost$ Sac<1/Artifact> | SpellDescription$ Regenerate CARDNAME. SVar:AIPreference:SacCost$Artifact.token,Artifact.cmcEQ1,Artifact.cmcEQ2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rusted_slasher.jpg Oracle:Sacrifice an artifact: Regenerate Rusted Slasher. diff --git a/forge-gui/res/cardsfolder/r/ruthless_disposal.txt b/forge-gui/res/cardsfolder/r/ruthless_disposal.txt index 8a22b6344f4..fbd75887939 100644 --- a/forge-gui/res/cardsfolder/r/ruthless_disposal.txt +++ b/forge-gui/res/cardsfolder/r/ruthless_disposal.txt @@ -2,7 +2,7 @@ Name:Ruthless Disposal ManaCost:4 B Types:Sorcery A:SP$ Pump | Cost$ 4 B Discard<1/Card> Sac<1/Creature> | TargetMin$ 2 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -13 | NumDef$ -13 | SpellDescription$ Two target creatures each get -13/-13 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHints:Ability$Discard SVar:Picture:http://www.wizards.com/global/images/magic/general/ruthless_disposal.jpg Oracle:As an additional cost to cast Ruthless Disposal, discard a card and sacrifice a creature.\nTwo target creatures each get -13/-13 until end of turn. diff --git a/forge-gui/res/cardsfolder/r/ruthless_invasion.txt b/forge-gui/res/cardsfolder/r/ruthless_invasion.txt index 890e8a4853c..6c7653d34fa 100644 --- a/forge-gui/res/cardsfolder/r/ruthless_invasion.txt +++ b/forge-gui/res/cardsfolder/r/ruthless_invasion.txt @@ -3,6 +3,6 @@ ManaCost:3 PR Types:Sorcery A:SP$ Effect | Cost$ 3 PR | Name$ Ruthless Invasion Effect | StaticAbilities$ KWPump | AILogic$ Evasion | SpellDescription$ Nonartifact creatures can't block this turn. SVar:KWPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.nonArtifact | AddHiddenKeyword$ CARDNAME can't block. | Description$ Nonartifact creatures can't block this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ruthless_invasion.jpg Oracle:({P/R} can be paid with either {R} or 2 life.)\nNonartifact creatures can't block this turn. diff --git a/forge-gui/res/cardsfolder/s/sacellum_godspeaker.txt b/forge-gui/res/cardsfolder/s/sacellum_godspeaker.txt index ca398257f41..ff53562cdb3 100644 --- a/forge-gui/res/cardsfolder/s/sacellum_godspeaker.txt +++ b/forge-gui/res/cardsfolder/s/sacellum_godspeaker.txt @@ -6,6 +6,6 @@ A:AB$ Reveal | Cost$ T | RevealValid$ Creature.powerGE5+YouCtrl | AnyNumber$ Tru SVar:DBspeakerMana:DB$ Mana | Produced$ G | Amount$ X | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sacellum_godspeaker.jpg Oracle:{T}: Reveal any number of creature cards with power 5 or greater from your hand. Add {G} for each card revealed this way. diff --git a/forge-gui/res/cardsfolder/s/sacred_ground.txt b/forge-gui/res/cardsfolder/s/sacred_ground.txt index 0dcf7991f6d..f5cf651f94c 100644 --- a/forge-gui/res/cardsfolder/s/sacred_ground.txt +++ b/forge-gui/res/cardsfolder/s/sacred_ground.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ Sacrificed | ValidCard$ Land.YouOwn | ValidSourceController$ Player.Opponent | Execute$ TrigReturn | TriggerZones$ Battlefield | TriggerDescription$ Whenever a spell or ability an opponent controls causes a land to be put into your graveyard from the battlefield, return that card to the battlefield. T:Mode$ Destroyed | ValidCauser$ Player.Opponent | ValidCard$ Land.YouOwn | Execute$ TrigReturn | Secondary$ True | TriggerZones$ Battlefield | TriggerDescription$ Whenever a spell or ability an opponent controls causes a land to be put into your graveyard from the battlefield, return that card to the battlefield. SVar:TrigReturn:DB$ ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Battlefield -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sacred_ground.jpg Oracle:Whenever a spell or ability an opponent controls causes a land to be put into your graveyard from the battlefield, return that card to the battlefield. diff --git a/forge-gui/res/cardsfolder/s/sacred_guide.txt b/forge-gui/res/cardsfolder/s/sacred_guide.txt index 4f1d88eeb08..b03709afb9b 100644 --- a/forge-gui/res/cardsfolder/s/sacred_guide.txt +++ b/forge-gui/res/cardsfolder/s/sacred_guide.txt @@ -3,6 +3,6 @@ ManaCost:W Types:Creature Human Cleric PT:1/1 A:AB$ DigUntil | Cost$ 1 W Sac<1/CARDNAME> | Valid$ Card.White | ValidDescription$ white | FoundDestination$ Hand | RevealedDestination$ Exile | SpellDescription$ Reveal cards from the top of your library until you reveal a white card. Put that card into your hand and exile all other cards revealed this way. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sacred_guide.jpg Oracle:{1}{W}, Sacrifice Sacred Guide: Reveal cards from the top of your library until you reveal a white card. Put that card into your hand and exile all other cards revealed this way. diff --git a/forge-gui/res/cardsfolder/s/sacred_mesa.txt b/forge-gui/res/cardsfolder/s/sacred_mesa.txt index c0c74eb29ea..2d0e693c721 100644 --- a/forge-gui/res/cardsfolder/s/sacred_mesa.txt +++ b/forge-gui/res/cardsfolder/s/sacred_mesa.txt @@ -3,6 +3,6 @@ ManaCost:2 W Types:Enchantment K:UpkeepCost:Sac<1/Pegasus> A:AB$ Token | Cost$ 1 W | TokenImage$ w 1 1 pegasus flying | TokenAmount$ 1 | TokenName$ Pegasus | TokenTypes$ Creature,Pegasus | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SpellDescription$ Create a 1/1 white Pegasus creature token with flying. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sacred_mesa.jpg Oracle:At the beginning of your upkeep, sacrifice Sacred Mesa unless you sacrifice a Pegasus.\n{1}{W}: Create a 1/1 white Pegasus creature token with flying. diff --git a/forge-gui/res/cardsfolder/s/sacred_rites.txt b/forge-gui/res/cardsfolder/s/sacred_rites.txt index aad5fdf8a98..2f2809a1803 100644 --- a/forge-gui/res/cardsfolder/s/sacred_rites.txt +++ b/forge-gui/res/cardsfolder/s/sacred_rites.txt @@ -5,6 +5,6 @@ A:SP$ Discard | Cost$ W | Defined$ You | AnyNumber$ True | Mode$ TgtChoose | Opt SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.YouCtrl | NumDef$ +X | SubAbility$ DBCleanup | References$ X SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sacred_rites.jpg Oracle:Discard any number of cards. Creatures you control get +0/+1 until end of turn for each card discarded this way. diff --git a/forge-gui/res/cardsfolder/s/sacrifice.txt b/forge-gui/res/cardsfolder/s/sacrifice.txt index bf76abb216f..796d7da5dfb 100644 --- a/forge-gui/res/cardsfolder/s/sacrifice.txt +++ b/forge-gui/res/cardsfolder/s/sacrifice.txt @@ -3,6 +3,6 @@ ManaCost:B Types:Instant A:SP$ Mana | Cost$ B Sac<1/Creature> | Produced$ B | Amount$ X | References$ X | SpellDescription$ Add an amount of black mana equal to the sacrificed creature's converted mana cost. SVar:X:Sacrificed$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sacrifice.jpg Oracle:As an additional cost to cast Sacrifice, sacrifice a creature.\nAdd an amount of {B} equal to the sacrificed creature's converted mana cost. diff --git a/forge-gui/res/cardsfolder/s/safe_haven.txt b/forge-gui/res/cardsfolder/s/safe_haven.txt index e54e64a4cbf..7027a6c5026 100644 --- a/forge-gui/res/cardsfolder/s/safe_haven.txt +++ b/forge-gui/res/cardsfolder/s/safe_haven.txt @@ -8,6 +8,6 @@ T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCar SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/safe_haven.jpg Oracle:{2}, {T}: Exile target creature you control.\nAt the beginning of your upkeep, you may sacrifice Safe Haven. If you do, return each card exiled with Safe Haven to the battlefield under its owner's control. diff --git a/forge-gui/res/cardsfolder/s/saffi_eriksdotter.txt b/forge-gui/res/cardsfolder/s/saffi_eriksdotter.txt index 09a719e3868..095144026f2 100644 --- a/forge-gui/res/cardsfolder/s/saffi_eriksdotter.txt +++ b/forge-gui/res/cardsfolder/s/saffi_eriksdotter.txt @@ -5,6 +5,6 @@ PT:2/2 A:AB$ Effect | Cost$ Sac<1/CARDNAME> | Name$ Saffi Eriksdotter | ValidTgts$ Creature | TgtPrompt$ Select target creature | Triggers$ TrigChangesZone | SVars$ TrigBounceMe | ForgetOnMoved$ Graveyard | References$ TrigChangesZone,TrigBounceMe | RememberObjects$ Targeted | SpellDescription$ When target creature is put into your graveyard from the battlefield this turn, return that card to the battlefield. SVar:TrigChangesZone:Mode$ ChangesZone | ValidCard$ Creature.IsRemembered+YouOwn | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigBounceMe | TriggerDescription$ If the targeted card of Saffi Eriksdotter is put into your graveyard from the battlefield this turn, return it to the battlefield. SVar:TrigBounceMe:DB$ ChangeZone | Defined$ Remembered | Origin$ Graveyard | Destination$ Battlefield -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/saffi_eriksdotter.jpg Oracle:Sacrifice Saffi Eriksdotter: When target creature is put into your graveyard from the battlefield this turn, return that card to the battlefield. diff --git a/forge-gui/res/cardsfolder/s/sage_of_ancient_lore_werewolf_of_ancient_hunger.txt b/forge-gui/res/cardsfolder/s/sage_of_ancient_lore_werewolf_of_ancient_hunger.txt index 9c8f28f3481..000471dcd55 100644 --- a/forge-gui/res/cardsfolder/s/sage_of_ancient_lore_werewolf_of_ancient_hunger.txt +++ b/forge-gui/res/cardsfolder/s/sage_of_ancient_lore_werewolf_of_ancient_hunger.txt @@ -9,7 +9,7 @@ SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 T:Mode$ Phase | Phase$ Upkeep | WerewolfTransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if no spells were cast last turn, transform CARDNAME. SVar:TrigTransform:DB$ SetState | Defined$ Self | Mode$ Transform #TODO: update logic for the AI to play around this -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NeedsToPlayVar:X GE3 SVar:Picture:http://www.wizards.com/global/images/magic/general/sage_of_ancient_lore.jpg AlternateMode:DoubleFaced diff --git a/forge-gui/res/cardsfolder/s/sage_of_hours.txt b/forge-gui/res/cardsfolder/s/sage_of_hours.txt index 33b6bc3e3c6..8c92c84f4b4 100644 --- a/forge-gui/res/cardsfolder/s/sage_of_hours.txt +++ b/forge-gui/res/cardsfolder/s/sage_of_hours.txt @@ -6,6 +6,6 @@ T:Mode$ SpellCast | ValidActivatingPlayer$ You | TargetsValid$ Card.Self | Trigg SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 A:AB$ AddTurn | Cost$ SubCounter | Defined$ You | NumTurns$ X | References$ X | SpellDescription$ For each five counters removed this way, take an extra turn after this one. SVar:X:SVar$CostCountersRemoved/DivideEvenlyDown.5 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sage_of_hours.jpg Oracle:Heroic — Whenever you cast a spell that targets Sage of Hours, put a +1/+1 counter on it.\nRemove all +1/+1 counters from Sage of Hours: For each five counters removed this way, take an extra turn after this one. diff --git a/forge-gui/res/cardsfolder/s/sage_of_lat_nam.txt b/forge-gui/res/cardsfolder/s/sage_of_lat_nam.txt index 16c30b3b577..8a826965b62 100644 --- a/forge-gui/res/cardsfolder/s/sage_of_lat_nam.txt +++ b/forge-gui/res/cardsfolder/s/sage_of_lat_nam.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Creature Human Artificer PT:1/2 A:AB$ Draw | Cost$ T Sac<1/Artifact> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sage_of_lat_nam.jpg Oracle:{T}, Sacrifice an artifact: Draw a card. diff --git a/forge-gui/res/cardsfolder/s/sages_dousing.txt b/forge-gui/res/cardsfolder/s/sages_dousing.txt index c022b3d7d3a..cea50daaa72 100644 --- a/forge-gui/res/cardsfolder/s/sages_dousing.txt +++ b/forge-gui/res/cardsfolder/s/sages_dousing.txt @@ -3,7 +3,7 @@ ManaCost:2 U Types:Tribal Instant Wizard A:SP$ Counter | Cost$ 2 U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 3 | SubAbility$ DBDraw | SpellDescription$ Counter target spell unless its controller pays {3}. If you control a Wizard, draw a card. SVar:DBDraw:DB$Draw | NumCards$ 1 | ConditionPresent$ Wizard.YouCtrl | ConditionCompare$ GE1 | ConditionDescription$ If you control a Wizard, -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Wizard SVar:Picture:http://www.wizards.com/global/images/magic/general/sages_dousing.jpg Oracle:Counter target spell unless its controller pays {3}. If you control a Wizard, draw a card. diff --git a/forge-gui/res/cardsfolder/s/sages_of_the_anima.txt b/forge-gui/res/cardsfolder/s/sages_of_the_anima.txt index 19dfcee5852..f669a7e2768 100644 --- a/forge-gui/res/cardsfolder/s/sages_of_the_anima.txt +++ b/forge-gui/res/cardsfolder/s/sages_of_the_anima.txt @@ -4,6 +4,6 @@ Types:Creature Elf Wizard PT:3/4 R:Event$ Draw | ActiveZones$ Battlefield | ValidPlayer$ You | ReplaceWith$ Dig | Description$ If you would draw a card, instead reveal the top three cards of your library. Put all creature cards revealed this way into your hand and the rest on the bottom of your library in any order. SVar:Dig:DB$Dig | DigNum$ 3 | Reveal$ True | ChangeNum$ All | ChangeValid$ Creature -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sages_of_the_anima.jpg Oracle:If you would draw a card, instead reveal the top three cards of your library. Put all creature cards revealed this way into your hand and the rest on the bottom of your library in any order. diff --git a/forge-gui/res/cardsfolder/s/saltcrusted_steppe.txt b/forge-gui/res/cardsfolder/s/saltcrusted_steppe.txt index 4c9a12b54ef..bfe2e7b941a 100644 --- a/forge-gui/res/cardsfolder/s/saltcrusted_steppe.txt +++ b/forge-gui/res/cardsfolder/s/saltcrusted_steppe.txt @@ -5,6 +5,6 @@ A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ PutCounter | Cost$ 1 T | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME. A:AB$ Mana | Cost$ 1 SubCounter | Produced$ Combo G W | Amount$ ChosenX | CostDesc$ {1}, Remove X storage counters from CARDNAME: | References$ X | SpellDescription$ Add X mana in any combination of {G} and/or {W}. SVar:X:XChoice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/saltcrusted_steppe.jpg Oracle:{T}: Add {C}.\n{1}, {T}: Put a storage counter on Saltcrusted Steppe.\n{1}, Remove X storage counters from Saltcrusted Steppe: Add X mana in any combination of {G} and/or {W}. diff --git a/forge-gui/res/cardsfolder/s/salvage_scout.txt b/forge-gui/res/cardsfolder/s/salvage_scout.txt index fc7c006928c..63a115dbc90 100644 --- a/forge-gui/res/cardsfolder/s/salvage_scout.txt +++ b/forge-gui/res/cardsfolder/s/salvage_scout.txt @@ -3,6 +3,6 @@ ManaCost:W Types:Creature Human Scout PT:1/1 A:AB$ ChangeZone | Cost$ W Sac<1/CARDNAME> | TgtPrompt$ Choose target artifact card in your graveyard | ValidTgts$ Artifact.YouCtrl | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target artifact card from your graveyard to your hand. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/salvage_scout.jpg Oracle:{W}, Sacrifice Salvage Scout: Return target artifact card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/s/salvage_scuttler.txt b/forge-gui/res/cardsfolder/s/salvage_scuttler.txt index 022192b7b86..8393e3dcfe8 100644 --- a/forge-gui/res/cardsfolder/s/salvage_scuttler.txt +++ b/forge-gui/res/cardsfolder/s/salvage_scuttler.txt @@ -4,6 +4,6 @@ Types:Creature Crab PT:4/4 T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigChange | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME attacks, return an artifact you control to its owner's hand. SVar:TrigChange:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Hidden$ True | Mandatory$ True | ChangeType$ Artifact.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/salvage_scutler.jpg Oracle:Whenever Salvage Scuttler attacks, return an artifact you control to its owner's hand. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/salvaging_station.txt b/forge-gui/res/cardsfolder/s/salvaging_station.txt index de8f218529e..dbd80005aa9 100644 --- a/forge-gui/res/cardsfolder/s/salvaging_station.txt +++ b/forge-gui/res/cardsfolder/s/salvaging_station.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ ChangeZone | Cost$ T | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Artifact.nonCreature+cmcLE1+YouCtrl | TgtPrompt$ Select target noncreature artifact card with converted mana cost 1 or less from your graveyard | SpellDescription$ Return target noncreature artifact card with converted mana cost 1 or less from your graveyard to the battlefield. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | Execute$ TrigUntap | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ Whenever a creature dies, you may untap CARDNAME. SVar:TrigUntap:DB$Untap | Defined$ Self -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/salvaging_station.jpg Oracle:{T}: Return target noncreature artifact card with converted mana cost 1 or less from your graveyard to the battlefield.\nWhenever a creature dies, you may untap Salvaging Station. diff --git a/forge-gui/res/cardsfolder/s/samite_censer_bearer.txt b/forge-gui/res/cardsfolder/s/samite_censer_bearer.txt index c7d5c4b3a15..11ef68aacd8 100644 --- a/forge-gui/res/cardsfolder/s/samite_censer_bearer.txt +++ b/forge-gui/res/cardsfolder/s/samite_censer_bearer.txt @@ -3,6 +3,6 @@ ManaCost:W Types:Creature Human Rebel Cleric PT:1/1 A:AB$ PreventDamageAll | Cost$ W Sac<1/CARDNAME> | ValidCards$ Creature.YouCtrl | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to each creature you control this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/samite_censer_bearer.jpg Oracle:{W}, Sacrifice Samite Censer-Bearer: Prevent the next 1 damage that would be dealt to each creature you control this turn. diff --git a/forge-gui/res/cardsfolder/s/samite_elder.txt b/forge-gui/res/cardsfolder/s/samite_elder.txt index 83215e29a79..6e73586c451 100644 --- a/forge-gui/res/cardsfolder/s/samite_elder.txt +++ b/forge-gui/res/cardsfolder/s/samite_elder.txt @@ -3,6 +3,6 @@ ManaCost:2 W Types:Creature Human Cleric PT:1/2 A:AB$ ProtectionAll | Cost$ T | ValidCards$ Creature.YouCtrl | ValidTgts$ Permanent.YouCtrl | TgtPrompt$ Select target permanent you control | Gains$ TargetedCardColor | StackDescription$ SpellDescription | SpellDescription$ Creatures you control gain protection from the colors of target permanent you control until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/samite_elder.jpg Oracle:{T}: Creatures you control gain protection from the colors of target permanent you control until end of turn. diff --git a/forge-gui/res/cardsfolder/s/samite_sanctuary.txt b/forge-gui/res/cardsfolder/s/samite_sanctuary.txt index 9fd6bb2980b..6125128bdf0 100644 --- a/forge-gui/res/cardsfolder/s/samite_sanctuary.txt +++ b/forge-gui/res/cardsfolder/s/samite_sanctuary.txt @@ -2,7 +2,7 @@ Name:Samite Sanctuary ManaCost:2 W Types:Enchantment A:AB$ PreventDamage | Cost$ 2 | ValidTgts$ Creature | Amount$ 1 | TgtPrompt$ Select target creature | AnyPlayer$ True | SpellDescription$ Prevent the next 1 damage that would be dealt to target creature this turn. Any player may activate this ability. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/samite_sanctuary.jpg Oracle:{2}: Prevent the next 1 damage that would be dealt to target creature this turn. Any player may activate this ability. diff --git a/forge-gui/res/cardsfolder/s/sanctimony.txt b/forge-gui/res/cardsfolder/s/sanctimony.txt index e289e1d83b8..89ec45d95ce 100644 --- a/forge-gui/res/cardsfolder/s/sanctimony.txt +++ b/forge-gui/res/cardsfolder/s/sanctimony.txt @@ -3,6 +3,6 @@ ManaCost:1 W Types:Enchantment T:Mode$ TapsForMana | ValidCard$ Mountain.OppCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | OptionalDecider$ You | TriggerDescription$ Whenever an opponent taps a Mountain for mana, you may gain 1 life. SVar:TrigGainLife:DB$GainLife | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sanctimony.jpg Oracle:Whenever an opponent taps a Mountain for mana, you may gain 1 life. diff --git a/forge-gui/res/cardsfolder/s/sanctum_guardian.txt b/forge-gui/res/cardsfolder/s/sanctum_guardian.txt index 495af6fbbd5..0a5deb96cef 100644 --- a/forge-gui/res/cardsfolder/s/sanctum_guardian.txt +++ b/forge-gui/res/cardsfolder/s/sanctum_guardian.txt @@ -8,6 +8,6 @@ SVar:OutOfSight:Mode$ ChangesZone | TriggerZones$ Command | Origin$ Battlefield SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.ChosenCard,Emblem.ChosenCard | ValidTarget$ Card.IsRemembered,Player.IsRemembered | ReplaceWith$ ExileEffect | PreventionEffect$ True | Description$ The next time the chosen source deals damage to any target this turn, prevent that damage. SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sanctum_guardian.jpg Oracle:Sacrifice Sanctum Guardian: The next time a source of your choice would deal damage to any target this turn, prevent that damage. diff --git a/forge-gui/res/cardsfolder/s/sanctum_prelate.txt b/forge-gui/res/cardsfolder/s/sanctum_prelate.txt index 6fcd8fe398f..43e9cb26025 100644 --- a/forge-gui/res/cardsfolder/s/sanctum_prelate.txt +++ b/forge-gui/res/cardsfolder/s/sanctum_prelate.txt @@ -6,6 +6,6 @@ K:ETBReplacement:Other:ChooseNumber SVar:ChooseNumber:DB$ ChooseNumber | Defined$ You | SpellDescription$ As CARDNAME enters the battlefield, choose a number. S:Mode$ CantBeCast | ValidCard$ Card.nonCreature+cmcEQX | References$ X | Description$ Noncreature spells with converted mana cost equal to the chosen number can't be cast. SVar:X:Number$ChosenNumber -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sanctum_prelate.jpg Oracle:As Sanctum Prelate enters the battlefield, choose a number.\nNoncreature spells with converted mana cost equal to the chosen number can't be cast. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/sand_silos.txt b/forge-gui/res/cardsfolder/s/sand_silos.txt index 1889c253ded..99db3fbe082 100644 --- a/forge-gui/res/cardsfolder/s/sand_silos.txt +++ b/forge-gui/res/cardsfolder/s/sand_silos.txt @@ -8,6 +8,6 @@ SVar:TrigStore:DB$PutCounter | Defined$ Self | CounterType$ STORAGE | CounterNum A:AB$ Mana | Cost$ T SubCounter | Produced$ U | Amount$ ChosenX | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | References$ X | SpellDescription$ Add {U} for each storage counter removed this way. SVar:X:XChoice #ChosenX SVar created by Cost payment -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sand_silos.jpg Oracle:Sand Silos enters the battlefield tapped.\nYou may choose not to untap Sand Silos during your untap step.\nAt the beginning of your upkeep, if Sand Silos is tapped, put a storage counter on it.\n{T}, Remove any number of storage counters from Sand Silos: Add {U} for each storage counter removed this way. diff --git a/forge-gui/res/cardsfolder/s/sand_squid.txt b/forge-gui/res/cardsfolder/s/sand_squid.txt index ee94e9442f1..33e9fec9275 100644 --- a/forge-gui/res/cardsfolder/s/sand_squid.txt +++ b/forge-gui/res/cardsfolder/s/sand_squid.txt @@ -8,6 +8,6 @@ A:AB$ Tap | Cost$ T | ValidTgts$ Creature | RememberTapped$ True | AlwaysRemembe S:Mode$ Continuous | Affected$ Creature.IsRemembered | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. T:Mode$ Untaps | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ ClearRemembered | Static$ True SVar:ClearRemembered:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sand_squid.jpg Oracle:Islandwalk\nYou may choose not to untap Sand Squid during your untap step.\n{T}: Tap target creature. That creature doesn't untap during its controller's untap step for as long as Sand Squid remains tapped. diff --git a/forge-gui/res/cardsfolder/s/sandals_of_abdallah.txt b/forge-gui/res/cardsfolder/s/sandals_of_abdallah.txt index 6b342751369..afb5f601521 100644 --- a/forge-gui/res/cardsfolder/s/sandals_of_abdallah.txt +++ b/forge-gui/res/cardsfolder/s/sandals_of_abdallah.txt @@ -6,7 +6,7 @@ SVar:AbdallahsSandalsEffect:DB$ Effect | Name$ Sandals of Abdallah Effect | Trig SVar:SandalWearerDied:Mode$ ChangesZone | ValidCard$ Card.IsRemembered | Origin$ Battlefield | Destination$ Graveyard | Execute$ SandalsDestroyed | TriggerDescription$ When the targeted creature dies this turn, destroy Sandals of Abdallah. SVar:SandalsDestroyed:DB$ Destroy | Defined$ Imprinted | SubAbility$ ExileEffect SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sandals_of_abdallah.jpg Oracle:{2}, {T}: Target creature gains islandwalk until end of turn. When that creature dies this turn, destroy Sandals of Abdallah. diff --git a/forge-gui/res/cardsfolder/s/sands_of_time.txt b/forge-gui/res/cardsfolder/s/sands_of_time.txt index 6be69680e8d..a09ef2bc3a3 100644 --- a/forge-gui/res/cardsfolder/s/sands_of_time.txt +++ b/forge-gui/res/cardsfolder/s/sands_of_time.txt @@ -6,6 +6,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield SVar:TrigSands:DB$ UntapAll | Defined$ TriggeredPlayer | ValidCards$ Artifact.tapped,Creature.tapped,Land.tapped | RememberUntapped$ True | SubAbility$ DBTap SVar:DBTap:DB$ TapAll | Defined$ TriggeredPlayer | ValidCards$ Artifact.untapped+IsNotRemembered,Creature.untapped+IsNotRemembered,Land.untapped+IsNotRemembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sands_of_time.jpg Oracle:Each player skips their untap step.\nAt the beginning of each player's upkeep, that player simultaneously untaps each tapped artifact, creature, and land they control and taps each untapped artifact, creature, and land they control. diff --git a/forge-gui/res/cardsfolder/s/sandsower.txt b/forge-gui/res/cardsfolder/s/sandsower.txt index 74769bd6fc7..0bc63e887ad 100644 --- a/forge-gui/res/cardsfolder/s/sandsower.txt +++ b/forge-gui/res/cardsfolder/s/sandsower.txt @@ -3,6 +3,6 @@ ManaCost:3 W Types:Creature Spirit PT:1/3 A:AB$ Tap | Cost$ tapXType<3/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sandsower.jpg Oracle:Tap three untapped creatures you control: Tap target creature. diff --git a/forge-gui/res/cardsfolder/s/sandstone_deadfall.txt b/forge-gui/res/cardsfolder/s/sandstone_deadfall.txt index d6c897387e6..0af7fcc180f 100644 --- a/forge-gui/res/cardsfolder/s/sandstone_deadfall.txt +++ b/forge-gui/res/cardsfolder/s/sandstone_deadfall.txt @@ -2,6 +2,6 @@ Name:Sandstone Deadfall ManaCost:3 Types:Artifact A:AB$ Destroy | Cost$ T Sac<1/CARDNAME> Sac<2/Land> | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | SpellDescription$ Destroy target attacking creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sandstone_deadfall.jpg Oracle:{T}, Sacrifice two lands and Sandstone Deadfall: Destroy target attacking creature. diff --git a/forge-gui/res/cardsfolder/s/sandstone_needle.txt b/forge-gui/res/cardsfolder/s/sandstone_needle.txt index c8d73416ac1..76d3b241ed1 100644 --- a/forge-gui/res/cardsfolder/s/sandstone_needle.txt +++ b/forge-gui/res/cardsfolder/s/sandstone_needle.txt @@ -6,7 +6,7 @@ SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | SubAbility$ DBAddCounter | SVar:DBAddCounter:DB$ PutCounter | Defined$ Self | ETB$ True | CounterType$ DEPLETION | CounterNum$ 2 A:AB$ Mana | Cost$ T SubCounter<1/DEPLETION> | Produced$ R | SubAbility$ DBSac | Amount$ 2 | SpellDescription$ Add {R}{R}. If there are no depletion counters on CARDNAME, sacrifice it. SVar:DBSac:DB$ Sacrifice | SacValid$ Self | ConditionPresent$ Card.Self+counters_EQ0_DEPLETION -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://wizards.com/global/images/magic/general/sandstone_needle.jpg Oracle:Sandstone Needle enters the battlefield tapped with two depletion counters on it.\n{T}, Remove a depletion counter from Sandstone Needle: Add {R}{R}. If there are no depletion counters on Sandstone Needle, sacrifice it. diff --git a/forge-gui/res/cardsfolder/s/sandstorm_eidolon.txt b/forge-gui/res/cardsfolder/s/sandstorm_eidolon.txt index 992c491cb93..8e6ac0b96c4 100644 --- a/forge-gui/res/cardsfolder/s/sandstorm_eidolon.txt +++ b/forge-gui/res/cardsfolder/s/sandstorm_eidolon.txt @@ -5,6 +5,6 @@ PT:2/2 A:AB$ Pump | Cost$ R Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME can't block. | IsCurse$ True | SpellDescription$ Target creature can't block this turn. T:Mode$ SpellCast | ValidCard$ Card.MultiColor | ValidActivatingPlayer$ You | TriggerZones$ Graveyard | OptionalDecider$ You | Execute$ TrigReturn | TriggerDescription$ Whenever you cast a multicolored spell, you may return CARDNAME from your graveyard to your hand. SVar:TrigReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | Defined$ Self -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sandstorm_eidolon.jpg Oracle:{R}, Sacrifice Sandstorm Eidolon: Target creature can't block this turn.\nWhenever you cast a multicolored spell, you may return Sandstorm Eidolon from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/s/sanguimancy.txt b/forge-gui/res/cardsfolder/s/sanguimancy.txt index 0197121cd6e..0e2cbfe74f4 100644 --- a/forge-gui/res/cardsfolder/s/sanguimancy.txt +++ b/forge-gui/res/cardsfolder/s/sanguimancy.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ Draw | Cost$ 4 B | NumCards$ X | References$ X | SubAbility$ DBLoseLife | SpellDescription$ You draw X cards and you lose X life, where X is your devotion to black. SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ X | References$ X SVar:X:Count$Devotion.Black -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sanguimancy.jpg Oracle:You draw X cards and you lose X life, where X is your devotion to black. (Each {B} in the mana costs of permanents you control counts toward your devotion to black.) diff --git a/forge-gui/res/cardsfolder/s/sanguine_bond.txt b/forge-gui/res/cardsfolder/s/sanguine_bond.txt index e9f4ba7ebd9..ff230f8d052 100644 --- a/forge-gui/res/cardsfolder/s/sanguine_bond.txt +++ b/forge-gui/res/cardsfolder/s/sanguine_bond.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ LifeGained | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDrain | TriggerDescription$ Whenever you gain life, target opponent loses that much life. SVar:TrigDrain:DB$LoseLife | ValidTgts$ Opponent | TgtPromp$ Select target opponent | LifeAmount$ X | References$ X SVar:X:TriggerCount$LifeAmount -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sanguine_bond.jpg Oracle:Whenever you gain life, target opponent loses that much life. diff --git a/forge-gui/res/cardsfolder/s/sanguine_praetor.txt b/forge-gui/res/cardsfolder/s/sanguine_praetor.txt index c2544af4a58..96059ac50f9 100644 --- a/forge-gui/res/cardsfolder/s/sanguine_praetor.txt +++ b/forge-gui/res/cardsfolder/s/sanguine_praetor.txt @@ -4,6 +4,6 @@ Types:Creature Avatar Praetor PT:7/5 A:AB$ DestroyAll | Cost$ B Sac<1/Creature> | ValidCards$ Creature.cmcEQX | References$ X | SpellDescription$ Destroy each creature with the same converted mana cost as the sacrificed creature. SVar:X:Sacrificed$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sanguine_praetor.jpg Oracle:{B}, Sacrifice a creature: Destroy each creature with the same converted mana cost as the sacrificed creature. diff --git a/forge-gui/res/cardsfolder/s/sapphire_charm.txt b/forge-gui/res/cardsfolder/s/sapphire_charm.txt index ef9bbf7a910..fb3da9b4a93 100644 --- a/forge-gui/res/cardsfolder/s/sapphire_charm.txt +++ b/forge-gui/res/cardsfolder/s/sapphire_charm.txt @@ -6,6 +6,6 @@ SVar:DelTrigSlowtrip:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidTgt SVar:DrawSlowtrip:DB$ Draw | NumCards$ 1 | Defined$ DelayTriggerRemembered | SpellDescription$ Draw a card. SVar:Pump:DB$ Pump | ValidTgts$ Creature | KW$ Flying | TgtPrompt$ Select target creature | SpellDescription$ Target creature gains flying until end of turn. SVar:Phases:DB$ Phases | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | SpellDescription$ Target creature an opponent controls phases out. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sapphire_charm.jpg Oracle:Choose one —\n• Target player draws a card at the beginning of the next turn's upkeep.\n• Target creature gains flying until end of turn.\n• Target creature an opponent controls phases out. (While it's phased out, it's treated as though it doesn't exist. It phases in before its controller untaps during their next untap step.) diff --git a/forge-gui/res/cardsfolder/s/sapphire_medallion.txt b/forge-gui/res/cardsfolder/s/sapphire_medallion.txt index b0adcc418e8..96e01930624 100644 --- a/forge-gui/res/cardsfolder/s/sapphire_medallion.txt +++ b/forge-gui/res/cardsfolder/s/sapphire_medallion.txt @@ -2,7 +2,7 @@ Name:Sapphire Medallion ManaCost:2 Types:Artifact S:Mode$ ReduceCost | ValidCard$ Card.Blue | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Blue spells you cast cost {1} less to cast. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Blue SVar:Picture:http://www.wizards.com/global/images/magic/general/sapphire_medallion.jpg Oracle:Blue spells you cast cost {1} less to cast. diff --git a/forge-gui/res/cardsfolder/s/saprazzan_bailiff.txt b/forge-gui/res/cardsfolder/s/saprazzan_bailiff.txt index 3c63ff7eb13..79975944b0b 100644 --- a/forge-gui/res/cardsfolder/s/saprazzan_bailiff.txt +++ b/forge-gui/res/cardsfolder/s/saprazzan_bailiff.txt @@ -6,6 +6,6 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME leaves the battlefield, return all artifact and enchantment cards from all graveyards to their owners' hands. SVar:TrigExile:DB$ChangeZoneAll | ChangeType$ Artifact,Enchantment | Origin$ Graveyard | Destination$ Exile SVar:TrigReturn:DB$ChangeZoneAll | ChangeType$ Artifact,Enchantment | Origin$ Graveyard | Destination$ Hand -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/saprazzan_bailiff.jpg Oracle:When Saprazzan Bailiff enters the battlefield, exile all artifact and enchantment cards from all graveyards.\nWhen Saprazzan Bailiff leaves the battlefield, return all artifact and enchantment cards from all graveyards to their owners' hands. diff --git a/forge-gui/res/cardsfolder/s/saprazzan_breaker.txt b/forge-gui/res/cardsfolder/s/saprazzan_breaker.txt index a4cba96a456..c7a5a57cc9c 100644 --- a/forge-gui/res/cardsfolder/s/saprazzan_breaker.txt +++ b/forge-gui/res/cardsfolder/s/saprazzan_breaker.txt @@ -5,6 +5,6 @@ PT:3/3 A:AB$ Dig | Cost$ U | DigNum$ 1 | Reveal$ True | ChangeNum$ All | RememberRevealed$ True | DestinationZone$ Graveyard | SubAbility$ DBPump | SpellDescription$ Put the top card of your library into your graveyard. If that card is a land card, CARDNAME can't be blocked this turn. SVar:DBPump:DB$ Pump | Defined$ Self | KW$ HIDDEN Unblockable | ConditionDefined$ Remembered | ConditionPresent$ Card.Land | ConditionCompare$ EQ1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/saprazzan_breaker.jpg Oracle:{U}: Put the top card of your library into your graveyard. If that card is a land card, Saprazzan Breaker can't be blocked this turn. diff --git a/forge-gui/res/cardsfolder/s/saprazzan_cove.txt b/forge-gui/res/cardsfolder/s/saprazzan_cove.txt index e8b3440db9b..661555ad76f 100644 --- a/forge-gui/res/cardsfolder/s/saprazzan_cove.txt +++ b/forge-gui/res/cardsfolder/s/saprazzan_cove.txt @@ -6,6 +6,6 @@ A:AB$ PutCounter | Cost$ T | Defined$ Self | CounterType$ STORAGE | CounterNum$ A:AB$ Mana | Cost$ T SubCounter | Produced$ U | Amount$ ChosenX | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | References$ X | SpellDescription$ Add {U} for each storage counter removed this way. SVar:X:XChoice #ChosenX SVar created by Cost payment -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/saprazzan_cove.jpg Oracle:Saprazzan Cove enters the battlefield tapped.\n{T}: Put a storage counter on Saprazzan Cove.\n{T}, Remove any number of storage counters from Saprazzan Cove: Add {U} for each storage counter removed this way. diff --git a/forge-gui/res/cardsfolder/s/saprazzan_outrigger.txt b/forge-gui/res/cardsfolder/s/saprazzan_outrigger.txt index bca9dfa11fc..a324c78650b 100644 --- a/forge-gui/res/cardsfolder/s/saprazzan_outrigger.txt +++ b/forge-gui/res/cardsfolder/s/saprazzan_outrigger.txt @@ -6,6 +6,6 @@ T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ DelTrig | TriggerDescription$ T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ DelTrig | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or blocks, put it on top of its owner's library at end of combat. SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | Execute$ TrigChange | TriggerDescription$ Put CARDNAME on top of its owner's library. SVar:TrigChange:DB$ChangeZone | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | Defined$ Self -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/saprazzan_outrigger.jpg Oracle:When Saprazzan Outrigger attacks or blocks, put it on top of its owner's library at end of combat. diff --git a/forge-gui/res/cardsfolder/s/saprazzan_skerry.txt b/forge-gui/res/cardsfolder/s/saprazzan_skerry.txt index faee71457e9..da4f79e6585 100644 --- a/forge-gui/res/cardsfolder/s/saprazzan_skerry.txt +++ b/forge-gui/res/cardsfolder/s/saprazzan_skerry.txt @@ -6,7 +6,7 @@ SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | SubAbility$ DBAddCounter | SVar:DBAddCounter:DB$ PutCounter | Defined$ Self | ETB$ True | CounterType$ DEPLETION | CounterNum$ 2 A:AB$ Mana | Cost$ T SubCounter<1/DEPLETION> | Produced$ U | SubAbility$ DBSac | Amount$ 2 | SpellDescription$ Add {U}{U}. If there are no depletion counters on CARDNAME, sacrifice it. SVar:DBSac:DB$ Sacrifice | SacValid$ Self | ConditionPresent$ Card.Self+counters_EQ0_DEPLETION -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://wizards.com/global/images/magic/general/saprazzan_skerry.jpg Oracle:Saprazzan Skerry enters the battlefield tapped with two depletion counters on it.\n{T}, Remove a depletion counter from Saprazzan Skerry: Add {U}{U}. If there are no depletion counters on Saprazzan Skerry, sacrifice it. diff --git a/forge-gui/res/cardsfolder/s/saproling_burst.txt b/forge-gui/res/cardsfolder/s/saproling_burst.txt index 5efe2a2783b..9ce714dd492 100644 --- a/forge-gui/res/cardsfolder/s/saproling_burst.txt +++ b/forge-gui/res/cardsfolder/s/saproling_burst.txt @@ -8,7 +8,7 @@ SVar:X:Count$CardCounters.FADE T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Any | Execute$ DestroyRemembered | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME leaves the battlefield, destroy all tokens created with CARDNAME. They can't be regenerated. SVar:DestroyRemembered:DB$ DestroyAll | ValidCards$ Card.IsImprinted | NoRegen$ True | SubAbility$ DBCleanUp SVar:DBCleanUp:DB$ Cleanup | ClearImprinted$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHas:Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/saproling_burst.jpg Oracle:Fading 7 (This enchantment enters the battlefield with seven fade counters on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it.)\nRemove a fade counter from Saproling Burst: Create a green Saproling creature token. It has "This creature's power and toughness are each equal to the number of fade counters on Saproling Burst."\nWhen Saproling Burst leaves the battlefield, destroy all tokens created with Saproling Burst. They can't be regenerated. diff --git a/forge-gui/res/cardsfolder/s/saproling_cluster.txt b/forge-gui/res/cardsfolder/s/saproling_cluster.txt index 12584fada09..018d4b5df34 100644 --- a/forge-gui/res/cardsfolder/s/saproling_cluster.txt +++ b/forge-gui/res/cardsfolder/s/saproling_cluster.txt @@ -2,7 +2,7 @@ Name:Saproling Cluster ManaCost:1 G Types:Enchantment A:AB$ Token | Cost$ 1 Discard<1/Card> | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | AnyPlayer$ True | SpellDescription$ Create a 1/1 green Saproling creature token. Any player may activate this ability. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True DeckHas:Ability$Discard & Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/saproling_cluster.jpg diff --git a/forge-gui/res/cardsfolder/s/saproling_infestation.txt b/forge-gui/res/cardsfolder/s/saproling_infestation.txt index a6d5280a71d..451831cafb2 100644 --- a/forge-gui/res/cardsfolder/s/saproling_infestation.txt +++ b/forge-gui/res/cardsfolder/s/saproling_infestation.txt @@ -3,7 +3,7 @@ ManaCost:1 G Types:Enchantment T:Mode$ SpellCast | ValidCard$ Card.YouCtrl+kicked | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever a player kicks a spell, you create a 1/1 green Saproling creature token. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Keyword$Kicker DeckHas:Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/saproling_infestation.jpg diff --git a/forge-gui/res/cardsfolder/s/sarkhans_triumph.txt b/forge-gui/res/cardsfolder/s/sarkhans_triumph.txt index a310e080f67..a56d96d21ec 100644 --- a/forge-gui/res/cardsfolder/s/sarkhans_triumph.txt +++ b/forge-gui/res/cardsfolder/s/sarkhans_triumph.txt @@ -2,7 +2,7 @@ Name:Sarkhan's Triumph ManaCost:2 R Types:Instant A:SP$ ChangeZone | Cost$ 2 R | Origin$ Library | Destination$ Hand | ChangeType$ Creature.Dragon | ChangeNum$ 1 | SpellDescription$ Search your library for a Dragon creature card, reveal it, put it into your hand, then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Dragon SVar:Picture:http://www.wizards.com/global/images/magic/general/sarkhans_triumph.jpg Oracle:Search your library for a Dragon creature card, reveal it, put it into your hand, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/s/satyr_enchanter.txt b/forge-gui/res/cardsfolder/s/satyr_enchanter.txt index 32a871100d9..753c5f4f923 100644 --- a/forge-gui/res/cardsfolder/s/satyr_enchanter.txt +++ b/forge-gui/res/cardsfolder/s/satyr_enchanter.txt @@ -4,6 +4,6 @@ Types:Creature Satyr Druid PT:2/2 T:Mode$ SpellCast | ValidCard$ Enchantment | ValidActivatingPlayer$ You | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast an enchantment spell, draw a card. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/satyr_enchanter.jpg Oracle:Whenever you cast an enchantment spell, draw a card. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/satyr_piper.txt b/forge-gui/res/cardsfolder/s/satyr_piper.txt index c79081a7268..5dd07b2b351 100644 --- a/forge-gui/res/cardsfolder/s/satyr_piper.txt +++ b/forge-gui/res/cardsfolder/s/satyr_piper.txt @@ -3,6 +3,6 @@ ManaCost:2 G Types:Creature Satyr Rogue PT:2/1 A:AB$ Pump | Cost$ 3 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME must be blocked if able. | AILogic$ Pump | SpellDescription$ Target creature must be blocked this turn if able. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/satyr_piper.jpg Oracle:{3}{G}: Target creature must be blocked this turn if able. diff --git a/forge-gui/res/cardsfolder/s/savage_beating.txt b/forge-gui/res/cardsfolder/s/savage_beating.txt index 9814e1e65bd..c45d436dc9e 100644 --- a/forge-gui/res/cardsfolder/s/savage_beating.txt +++ b/forge-gui/res/cardsfolder/s/savage_beating.txt @@ -7,6 +7,6 @@ A:SP$ Charm | Cost$ 3 R R | Choices$ DBPump,DBUntapAll | CharmNum$ 1 | PlayerTur SVar:DBPump:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Double Strike | SpellDescription$ Creatures you control gain double strike until end of turn. SVar:DBUntapAll:DB$ UntapAll | ValidCards$ Creature.YouCtrl | SubAbility$ DBAddCombat | SpellDescription$ Untap all creatures you control. After this phase, there is an additional combat phase. SVar:DBAddCombat:DB$ AddPhase | ExtraPhase$ BeginCombat | AfterPhase$ EndCombat -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/savage_beating.jpg Oracle:Cast Savage Beating only during your turn and only during combat.\nChoose one —\n• Creatures you control gain double strike until end of turn.\n• Untap all creatures you control. After this phase, there is an additional combat phase.\nEntwine {1}{R} (Choose both if you pay the entwine cost.) diff --git a/forge-gui/res/cardsfolder/s/savage_firecat.txt b/forge-gui/res/cardsfolder/s/savage_firecat.txt index 64726f255e1..627ae9a3575 100644 --- a/forge-gui/res/cardsfolder/s/savage_firecat.txt +++ b/forge-gui/res/cardsfolder/s/savage_firecat.txt @@ -6,6 +6,6 @@ K:etbCounter:P1P1:7 K:Trample T:Mode$ TapsForMana | ValidCard$ Land.YouCtrl | Execute$ TrigRemoveCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever you tap a land for mana, remove a +1/+1 counter from CARDNAME. SVar:TrigRemoveCounter:DB$RemoveCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/savage_firecat.jpg Oracle:Trample\nSavage Firecat enters the battlefield with seven +1/+1 counters on it.\nWhenever you tap a land for mana, remove a +1/+1 counter from Savage Firecat. diff --git a/forge-gui/res/cardsfolder/s/savage_offensive.txt b/forge-gui/res/cardsfolder/s/savage_offensive.txt index a1cb06b52f8..c20c15bf26c 100644 --- a/forge-gui/res/cardsfolder/s/savage_offensive.txt +++ b/forge-gui/res/cardsfolder/s/savage_offensive.txt @@ -4,7 +4,7 @@ Types:Sorcery K:Kicker:G A:SP$ PumpAll | Cost$ 1 R | ValidCards$ Creature.YouCtrl | KW$ First Strike | NumAtt$ X | NumDef$ X | References$ X | SpellDescription$ Creatures you control gain first strike until end of turn. If CARDNAME was kicked, they get +1/+1 until end of turn. SVar:X:Count$Kicked.1.0 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Green SVar:Picture:http://www.wizards.com/global/images/magic/general/savage_offensive.jpg Oracle:Kicker {G} (You may pay an additional {G} as you cast this spell.)\nCreatures you control gain first strike until end of turn. If Savage Offensive was kicked, they get +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/s/savage_summoning.txt b/forge-gui/res/cardsfolder/s/savage_summoning.txt index 2bf6423c2ed..61f07158f79 100644 --- a/forge-gui/res/cardsfolder/s/savage_summoning.txt +++ b/forge-gui/res/cardsfolder/s/savage_summoning.txt @@ -11,6 +11,6 @@ SVar:ETBCounters:Event$ Moved | Origin$ Stack | Destination$ Battlefield | Valid SVar:ETBAddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ MoveToBattlefield SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard | SubAbility$ ExileSelf SVar:ExileSelf:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/savage_summoning.jpg Oracle:This spell can't be countered.\nThe next creature card you cast this turn can be cast as though it had flash. That spell can't be countered. That creature enters the battlefield with an additional +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/s/savra_queen_of_the_golgari.txt b/forge-gui/res/cardsfolder/s/savra_queen_of_the_golgari.txt index 2af372ba7ca..03ef50afb68 100644 --- a/forge-gui/res/cardsfolder/s/savra_queen_of_the_golgari.txt +++ b/forge-gui/res/cardsfolder/s/savra_queen_of_the_golgari.txt @@ -6,6 +6,6 @@ T:Mode$ Sacrificed | ValidPlayer$ You | ValidCard$ Creature.Black | TriggerZones T:Mode$ Sacrificed | ValidPlayer$ You | ValidCard$ Creature.Green | TriggerZones$ Battlefield | Execute$ TrigGainLife | OptionalDecider$ You | TriggerDescription$ Whenever you sacrifice a green creature, you may gain 2 life. SVar:TrigSacrifice:AB$ Sacrifice | Cost$ PayLife<2> | Defined$ Player.Other | SacValid$ Creature | SacMessage$ Creature SVar:TrigGainLife:DB$ GainLife | LifeAmount$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/savra_queen_of_the_golgari.jpg Oracle:Whenever you sacrifice a black creature, you may pay 2 life. If you do, each other player sacrifices a creature.\nWhenever you sacrifice a green creature, you may gain 2 life. diff --git a/forge-gui/res/cardsfolder/s/sawtooth_loon.txt b/forge-gui/res/cardsfolder/s/sawtooth_loon.txt index 48ec729e0b3..93091cafc5f 100644 --- a/forge-gui/res/cardsfolder/s/sawtooth_loon.txt +++ b/forge-gui/res/cardsfolder/s/sawtooth_loon.txt @@ -9,6 +9,6 @@ SVar:TrigChange:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Hidde SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 2 | SubAbility$ DBChangeZone SVar:DBChangeZone:DB$ ChangeZone | Origin$ Hand | Destination$ Library | LibraryPosition$ -1 | ChangeNum$ 2 | Mandatory$ True #TODO: The AI is bad with the "put two cards on the bottom of your library" thing, it'll put its best cards there because it thinks that it's as good as putting them on top. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sawtooth_loon.jpg Oracle:Flying\nWhen Sawtooth Loon enters the battlefield, return a white or blue creature you control to its owner's hand.\nWhen Sawtooth Loon enters the battlefield, draw two cards, then put two cards from your hand on the bottom of your library. diff --git a/forge-gui/res/cardsfolder/s/scab_clan_giant.txt b/forge-gui/res/cardsfolder/s/scab_clan_giant.txt index f3fe590ab1f..7dace863c6b 100644 --- a/forge-gui/res/cardsfolder/s/scab_clan_giant.txt +++ b/forge-gui/res/cardsfolder/s/scab_clan_giant.txt @@ -4,6 +4,6 @@ Types:Creature Giant Warrior PT:4/5 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFight | TriggerDescription$ When CARDNAME enters the battlefield, it fights target creature an opponent controls chosen at random. SVar:TrigFight:DB$ Fight | Defined$ Self | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls | TargetsAtRandom$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/scab_clan_giant.jpg Oracle:When Scab-Clan Giant enters the battlefield, it fights target creature an opponent controls chosen at random. diff --git a/forge-gui/res/cardsfolder/s/scald.txt b/forge-gui/res/cardsfolder/s/scald.txt index 8ce2aa1fb4c..fe204ec71e7 100644 --- a/forge-gui/res/cardsfolder/s/scald.txt +++ b/forge-gui/res/cardsfolder/s/scald.txt @@ -3,6 +3,6 @@ ManaCost:1 R Types:Enchantment T:Mode$ TapsForMana | ValidCard$ Island | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever a player taps an Island for mana, CARDNAME deals 1 damage to that player. SVar:TrigDealDamage:DB$DealDamage | Defined$ TriggeredCardController | NumDmg$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/scald.jpg Oracle:Whenever a player taps an Island for mana, Scald deals 1 damage to that player. diff --git a/forge-gui/res/cardsfolder/s/scandalmonger.txt b/forge-gui/res/cardsfolder/s/scandalmonger.txt index 5e7956b884c..30b7622f466 100644 --- a/forge-gui/res/cardsfolder/s/scandalmonger.txt +++ b/forge-gui/res/cardsfolder/s/scandalmonger.txt @@ -3,6 +3,6 @@ ManaCost:3 B Types:Creature Boar Monger PT:3/3 A:AB$ Discard | Cost$ 2 | ValidTgts$ Player | NumCards$ 1 | Mode$ TgtChoose | SorcerySpeed$ True | AnyPlayer$ True | IsCurse$ True | SpellDescription$ Target player discards a card. Any player may activate this ability but only any time they could cast a sorcery. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/scandalmonger.jpg Oracle:{2}: Target player discards a card. Any player may activate this ability but only any time they could cast a sorcery. diff --git a/forge-gui/res/cardsfolder/s/scapegoat.txt b/forge-gui/res/cardsfolder/s/scapegoat.txt index 8274dfd44a8..77ce42f083c 100644 --- a/forge-gui/res/cardsfolder/s/scapegoat.txt +++ b/forge-gui/res/cardsfolder/s/scapegoat.txt @@ -3,6 +3,6 @@ ManaCost:W Types:Instant A:SP$ ChangeZone | Cost$ W Sac<1/Creature> | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature | TargetMin$ 0 | TargetMax$ X | Origin$ Battlefield | Destination$ Hand | CostDesc$ As an additional cost to cast CARDNAME, sacrifice a creature. | References$ X | SpellDescription$ Return any number of target creatures you control to their owner's hand. SVar:X:Count$Valid Creature.YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/scapegoat.jpg Oracle:As an additional cost to cast Scapegoat, sacrifice a creature.\nReturn any number of target creatures you control to their owner's hand. diff --git a/forge-gui/res/cardsfolder/s/scapeshift.txt b/forge-gui/res/cardsfolder/s/scapeshift.txt index 7b2517d26cf..8e8359c942b 100644 --- a/forge-gui/res/cardsfolder/s/scapeshift.txt +++ b/forge-gui/res/cardsfolder/s/scapeshift.txt @@ -6,6 +6,6 @@ SVar:DBShift:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | Chang SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:SacX:Count$Valid Land.YouCtrl SVar:ShiftX:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/scapeshift.jpg Oracle:Sacrifice any number of lands. Search your library for up to that many land cards, put them onto the battlefield tapped, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/s/scarab_of_the_unseen.txt b/forge-gui/res/cardsfolder/s/scarab_of_the_unseen.txt index 331a3ee8735..22671a1ba1d 100644 --- a/forge-gui/res/cardsfolder/s/scarab_of_the_unseen.txt +++ b/forge-gui/res/cardsfolder/s/scarab_of_the_unseen.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ ChangeZoneAll | Cost$ T Sac<1/CARDNAME> | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Permanent.YouOwn | TgtPrompt$ Select target permanent you own | ChangeType$ Aura.AttachedTo Targeted | SubAbility$ DelTrigSlowtrip | SpellDescription$ Return all Auras attached to target permanent you own to their owners' hands. Draw a card at the beginning of the next turn's upkeep. SVar:DelTrigSlowtrip:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ DrawSlowtrip | TriggerDescription$ Draw a card. SVar:DrawSlowtrip:DB$Draw | NumCards$ 1 | Defined$ You -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/scarab_of_the_unseen.jpg Oracle:{T}, Sacrifice Scarab of the Unseen: Return all Auras attached to target permanent you own to their owners' hands. Draw a card at the beginning of the next turn's upkeep. diff --git a/forge-gui/res/cardsfolder/s/scarblade_elite.txt b/forge-gui/res/cardsfolder/s/scarblade_elite.txt index 61856c25564..5ed706cb248 100644 --- a/forge-gui/res/cardsfolder/s/scarblade_elite.txt +++ b/forge-gui/res/cardsfolder/s/scarblade_elite.txt @@ -3,6 +3,6 @@ ManaCost:B B Types:Creature Elf Assassin PT:2/2 A:AB$ Destroy | Cost$ T ExileFromGrave<1/Assassin> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Destroy target creature. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/scarblade_elite.jpg Oracle:{T}, Exile an Assassin card from your graveyard: Destroy target creature. diff --git a/forge-gui/res/cardsfolder/s/scarecrow.txt b/forge-gui/res/cardsfolder/s/scarecrow.txt index b0dc42bfc70..022459023dc 100644 --- a/forge-gui/res/cardsfolder/s/scarecrow.txt +++ b/forge-gui/res/cardsfolder/s/scarecrow.txt @@ -4,6 +4,6 @@ Types:Artifact Creature Scarecrow PT:2/2 A:AB$ Effect | Cost$ 6 T | Name$ Scarecrow Effect | ReplacementEffects$ RPrevent | SpellDescription$ Prevent all damage that would be dealt to you this turn by creatures with flying. SVar:RPrevent:Event$ DamageDone | Prevent$ True | ActiveZones$ Command | ValidTarget$ You | ValidSource$ Creature.withFlying | Description$ Prevent all damage that would be dealt to you this turn by creatures with flying. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/scarecrow.jpg Oracle:{6}, {T}: Prevent all damage that would be dealt to you this turn by creatures with flying. diff --git a/forge-gui/res/cardsfolder/s/scarred_vinebreeder.txt b/forge-gui/res/cardsfolder/s/scarred_vinebreeder.txt index 6a97b24dff7..5563265391a 100644 --- a/forge-gui/res/cardsfolder/s/scarred_vinebreeder.txt +++ b/forge-gui/res/cardsfolder/s/scarred_vinebreeder.txt @@ -3,6 +3,6 @@ ManaCost:1 B Types:Creature Elf Shaman PT:1/1 A:AB$ Pump | Cost$ 2 B ExileFromGrave<1/Elf> | NumAtt$ +3 | NumDef$ +3 | SpellDescription$ CARDNAME gets +3/+3 until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/scarred_vinebreeder.jpg Oracle:{2}{B}, Exile an Elf card from your graveyard: Scarred Vinebreeder gets +3/+3 until end of turn. diff --git a/forge-gui/res/cardsfolder/s/scarwood_bandits.txt b/forge-gui/res/cardsfolder/s/scarwood_bandits.txt index ba8337fa88b..1575399f155 100644 --- a/forge-gui/res/cardsfolder/s/scarwood_bandits.txt +++ b/forge-gui/res/cardsfolder/s/scarwood_bandits.txt @@ -4,6 +4,6 @@ Types:Creature Human Rogue PT:2/2 K:Forestwalk A:AB$ GainControl | Cost$ 2 G T | ValidTgts$ Artifact | TgtPrompt$ Select target artifact. | LoseControl$ LeavesPlay | UnlessCost$ 2 | UnlessPayer$ Opponent | SpellDescription$ Unless an opponent pays {2}, gain control of target artifact for as long as CARDNAME remains on the battlefield. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/scarwood_bandits.jpg Oracle:Forestwalk\n{2}{G}, {T}: Unless an opponent pays {2}, gain control of target artifact for as long as Scarwood Bandits remains on the battlefield. diff --git a/forge-gui/res/cardsfolder/s/scavenger_grounds.txt b/forge-gui/res/cardsfolder/s/scavenger_grounds.txt index 3c602c441bb..85778e71d65 100644 --- a/forge-gui/res/cardsfolder/s/scavenger_grounds.txt +++ b/forge-gui/res/cardsfolder/s/scavenger_grounds.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land Desert A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ ChangeZoneAll | Cost$ 2 T Sac<1/Desert> | Origin$ Graveyard | Destination$ Exile | ChangeType$ Card | AILogic$ ExileGraveyards | SpellDescription$ Exile all cards from all graveyards. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/scavenger_grounds.jpg Oracle:{T}: Add {C}.\n{2}, {T}, Sacrifice a Desert: Exile all cards from all graveyards. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/scent_of_brine.txt b/forge-gui/res/cardsfolder/s/scent_of_brine.txt index f0f7999e058..c95050b6822 100644 --- a/forge-gui/res/cardsfolder/s/scent_of_brine.txt +++ b/forge-gui/res/cardsfolder/s/scent_of_brine.txt @@ -5,6 +5,6 @@ A:SP$ Reveal | Cost$ 1 U | Defined$ You | RevealValid$ Card.Blue | AnyNumber$ Tr SVar:DBScentOfBrineCounter:DB$ Counter | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ ScentOfBrineX | SubAbility$ DBScentOfBrineCleanup | References$ ScentOfBrineX SVar:DBScentOfBrineCleanup:DB$ Cleanup | ClearRemembered$ True SVar:ScentOfBrineX:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/scent_of_brine.jpg Oracle:Reveal any number of blue cards in your hand. Counter target spell unless its controller pays {1} for each card revealed this way. diff --git a/forge-gui/res/cardsfolder/s/scent_of_cinder.txt b/forge-gui/res/cardsfolder/s/scent_of_cinder.txt index c5642b390c9..b69aae5331e 100644 --- a/forge-gui/res/cardsfolder/s/scent_of_cinder.txt +++ b/forge-gui/res/cardsfolder/s/scent_of_cinder.txt @@ -5,6 +5,6 @@ A:SP$ Reveal | Cost$ 1 R | Defined$ You | RevealValid$ Card.Red | AnyNumber$ Tru SVar:DBScentOfCinderDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ ScentOfCinderX | SubAbility$ DBScentOfCinderCleanup | References$ ScentOfCinderX SVar:ScentOfCinderX:Remembered$Amount SVar:DBScentOfCinderCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/scent_of_cinder.jpg Oracle:Reveal any number of red cards in your hand. Scent of Cinder deals X damage to any target, where X is the number of cards revealed this way. diff --git a/forge-gui/res/cardsfolder/s/scent_of_ivy.txt b/forge-gui/res/cardsfolder/s/scent_of_ivy.txt index 988b9ab3bb7..6dc3571f6a4 100644 --- a/forge-gui/res/cardsfolder/s/scent_of_ivy.txt +++ b/forge-gui/res/cardsfolder/s/scent_of_ivy.txt @@ -5,6 +5,6 @@ A:SP$ Reveal | Cost$ G | Defined$ You | RevealValid$ Card.Green | AnyNumber$ Tru SVar:DBScentOfIvyPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ ScentOfIvyX | NumDef$ ScentOfIvyX | SubAbility$ DBScentOfIvyCleanup | References$ ScentOfIvyX SVar:ScentOfIvyX:Remembered$Amount SVar:DBScentOfIvyCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/scent_of_ivy.jpg Oracle:Reveal any number of green cards in your hand. Target creature gets +X/+X until end of turn, where X is the number of cards revealed this way. diff --git a/forge-gui/res/cardsfolder/s/scent_of_jasmine.txt b/forge-gui/res/cardsfolder/s/scent_of_jasmine.txt index d9a0201879a..d16b189988b 100644 --- a/forge-gui/res/cardsfolder/s/scent_of_jasmine.txt +++ b/forge-gui/res/cardsfolder/s/scent_of_jasmine.txt @@ -5,6 +5,6 @@ A:SP$ Reveal | Cost$ W | Defined$ You | RevealValid$ Card.White | AnyNumber$ Tru SVar:DBScentOfJasmineLife:DB$ GainLife | LifeAmount$ ScentOfJasmineX | SubAbility$ DBScentOfJasmineCleanup | References$ ScentOfJasmineX SVar:ScentOfJasmineX:Remembered$Amount.Twice SVar:DBScentOfJasmineCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/scent_of_jasmine.jpg Oracle:Reveal any number of white cards in your hand. You gain 2 life for each card revealed this way. diff --git a/forge-gui/res/cardsfolder/s/scent_of_nightshade.txt b/forge-gui/res/cardsfolder/s/scent_of_nightshade.txt index 5e12ea9a928..47bddeaf523 100644 --- a/forge-gui/res/cardsfolder/s/scent_of_nightshade.txt +++ b/forge-gui/res/cardsfolder/s/scent_of_nightshade.txt @@ -5,6 +5,6 @@ A:SP$ Reveal | Cost$ 1 B | Defined$ You | RevealValid$ Card.Black | AnyNumber$ T SVar:DBScentOfNightshadePump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ ScentOfNightshadeX | NumDef$ ScentOfNightshadeX | SubAbility$ DBScentOfNightshadeCleanup | References$ ScentOfNightshadeX SVar:DBScentOfNightshadeCleanup:DB$ Cleanup | ClearRemembered$ True SVar:ScentOfNightshadeX:Remembered$Amount.Negative -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/scent_of_nightshade.jpg Oracle:Reveal any number of black cards in your hand. Target creature gets -X/-X until end of turn, where X is the number of cards revealed this way. diff --git a/forge-gui/res/cardsfolder/s/scepter_of_empires.txt b/forge-gui/res/cardsfolder/s/scepter_of_empires.txt index 6e07c6d65ae..2cfcb9b98f5 100644 --- a/forge-gui/res/cardsfolder/s/scepter_of_empires.txt +++ b/forge-gui/res/cardsfolder/s/scepter_of_empires.txt @@ -6,7 +6,7 @@ SVar:X:Count$Compare AllM12Empires GT0.3.1 SVar:AllM12Empires:SVar$Z/Times.Y SVar:Z:Count$Valid Artifact.namedCrown of Empires+YouCtrl SVar:Y:Count$Valid Artifact.namedThrone of Empires+YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Name$Throne of Empires|Crown of Empires SVar:Picture:http://www.wizards.com/global/images/magic/general/scepter_of_empires.jpg Oracle:{T}: Scepter of Empires deals 1 damage to target player or planeswalker. It deals 3 damage to that player or planeswalker instead if you control artifacts named Crown of Empires and Throne of Empires. diff --git a/forge-gui/res/cardsfolder/s/school_of_the_unseen.txt b/forge-gui/res/cardsfolder/s/school_of_the_unseen.txt index 6d51cdf6350..e8002cb79a8 100644 --- a/forge-gui/res/cardsfolder/s/school_of_the_unseen.txt +++ b/forge-gui/res/cardsfolder/s/school_of_the_unseen.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ 2 T | Produced$ Any | SpellDescription$ Add one mana of any color. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/school_of_the_unseen.jpg Oracle:{T}: Add {C}.\n{2}, {T}: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/s/scion_of_oona.txt b/forge-gui/res/cardsfolder/s/scion_of_oona.txt index 062ef0a2cf9..b46e1fde2bc 100644 --- a/forge-gui/res/cardsfolder/s/scion_of_oona.txt +++ b/forge-gui/res/cardsfolder/s/scion_of_oona.txt @@ -7,6 +7,6 @@ K:Flying S:Mode$ Continuous | Affected$ Creature.Faerie+Other+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Other Faerie creatures you control get +1/+1. S:Mode$ Continuous | Affected$ Faerie.Other+YouCtrl | AddKeyword$ Shroud | Description$ Other Faeries you control have shroud. SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/scion_of_oona.jpg Oracle:Flash\nFlying\nOther Faerie creatures you control get +1/+1.\nOther Faeries you control have shroud. (They can't be the targets of spells or abilities.) diff --git a/forge-gui/res/cardsfolder/s/scorched_earth.txt b/forge-gui/res/cardsfolder/s/scorched_earth.txt index d67b59385df..1bf7e23c31f 100644 --- a/forge-gui/res/cardsfolder/s/scorched_earth.txt +++ b/forge-gui/res/cardsfolder/s/scorched_earth.txt @@ -5,7 +5,7 @@ A:SP$ Destroy | Cost$ X R Discard | TargetMin$ 0 | TargetMax$ MaxTgts | # It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) SVar:X:Targeted$Amount SVar:MaxTgts:Count$Valid Land -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:PlayBeforeLandDrop:true SVar:Picture:http://www.wizards.com/global/images/magic/general/scorched_earth.jpg Oracle:As an additional cost to cast Scorched Earth, discard X land cards.\nDestroy X target lands. diff --git a/forge-gui/res/cardsfolder/s/scorched_ruins.txt b/forge-gui/res/cardsfolder/s/scorched_ruins.txt index c50cb2013d3..e5d7af9e738 100644 --- a/forge-gui/res/cardsfolder/s/scorched_ruins.txt +++ b/forge-gui/res/cardsfolder/s/scorched_ruins.txt @@ -10,6 +10,6 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount SVar:NeedsToPlayVar:Y GE2 SVar:Y:Count$Valid Land.YouCtrl+untapped -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/scorched_ruins.jpg Oracle:If Scorched Ruins would enter the battlefield, sacrifice two untapped lands instead. If you do, put Scorched Ruins onto the battlefield. If you don't, put it into its owner's graveyard.\n{T}: Add {C}{C}{C}{C}. diff --git a/forge-gui/res/cardsfolder/s/scorched_rusalka.txt b/forge-gui/res/cardsfolder/s/scorched_rusalka.txt index 1c9787fcfa8..4db8f736d4f 100644 --- a/forge-gui/res/cardsfolder/s/scorched_rusalka.txt +++ b/forge-gui/res/cardsfolder/s/scorched_rusalka.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Creature Spirit PT:1/1 A:AB$ DealDamage | Cost$ R Sac<1/Creature> | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target player or planeswalker. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/scorched_rusalka.jpg Oracle:{R}, Sacrifice a creature: Scorched Rusalka deals 1 damage to target player or planeswalker. diff --git a/forge-gui/res/cardsfolder/s/scourge_of_numai.txt b/forge-gui/res/cardsfolder/s/scourge_of_numai.txt index fc1e435347e..39e2fe5167a 100644 --- a/forge-gui/res/cardsfolder/s/scourge_of_numai.txt +++ b/forge-gui/res/cardsfolder/s/scourge_of_numai.txt @@ -4,7 +4,7 @@ Types:Creature Demon Spirit PT:4/4 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigLoseLife | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, you lose 2 life if you don't control an Ogre. SVar:TrigLoseLife:DB$LoseLife | Defined$ You | LifeAmount$ 2 | ConditionPresent$ Ogre.YouCtrl | ConditionCompare$ EQ0 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Ogre SVar:Picture:http://www.wizards.com/global/images/magic/general/scourge_of_numai.jpg Oracle:At the beginning of your upkeep, you lose 2 life if you don't control an Ogre. diff --git a/forge-gui/res/cardsfolder/s/scourge_of_skola_vale.txt b/forge-gui/res/cardsfolder/s/scourge_of_skola_vale.txt index 1232dc05b63..291ab8aa856 100644 --- a/forge-gui/res/cardsfolder/s/scourge_of_skola_vale.txt +++ b/forge-gui/res/cardsfolder/s/scourge_of_skola_vale.txt @@ -6,6 +6,6 @@ K:etbCounter:P1P1:2 K:Trample A:AB$ PutCounter | Cost$ T Sac<1/Creature.Other/another creature> | CounterType$ P1P1 | CounterNum$ X | References$ X | SpellDescription$ Put a number of +1/+1 counters on CARDNAME equal to the sacrificed creature's toughness. SVar:X:Sacrificed$CardToughness -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/scourge_of_skola_vale.jpg Oracle:Trample\nScourge of Skola Vale enters the battlefield with two +1/+1 counters on it.\n{T}, Sacrifice another creature: Put a number of +1/+1 counters on Scourge of Skola Vale equal to the sacrificed creature's toughness. diff --git a/forge-gui/res/cardsfolder/s/scourglass.txt b/forge-gui/res/cardsfolder/s/scourglass.txt index a47796f32c0..06e2d225f15 100644 --- a/forge-gui/res/cardsfolder/s/scourglass.txt +++ b/forge-gui/res/cardsfolder/s/scourglass.txt @@ -2,6 +2,6 @@ Name:Scourglass ManaCost:3 W W Types:Artifact A:AB$ DestroyAll | Cost$ T Sac<1/CARDNAME> | ValidCards$ Permanent.nonArtifact+nonLand | PlayerTurn$ True | ActivationPhases$ Upkeep | SpellDescription$ Destroy all permanents except for artifacts and lands. Activate this ability only during your upkeep. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/scourglass.jpg Oracle:{T}, Sacrifice Scourglass: Destroy all permanents except for artifacts and lands. Activate this ability only during your upkeep. diff --git a/forge-gui/res/cardsfolder/s/scouting_trek.txt b/forge-gui/res/cardsfolder/s/scouting_trek.txt index e206914cdd6..05d5a2a2837 100644 --- a/forge-gui/res/cardsfolder/s/scouting_trek.txt +++ b/forge-gui/res/cardsfolder/s/scouting_trek.txt @@ -3,6 +3,6 @@ ManaCost:1 G Types:Sorcery A:SP$ ChangeZone | Cost$ 1 G | ChangeNum$ X | ChangeType$ Land.Basic | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | References$ X | SpellDescription$ Search your library for any number of basic land cards. Reveal those cards, then shuffle your library and put them on top of it. SVar:X:Count$InYourLibrary.Land.Basic -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/scouting_trek.jpg Oracle:Search your library for any number of basic land cards. Reveal those cards, then shuffle your library and put them on top of it. diff --git a/forge-gui/res/cardsfolder/s/scouts_warning.txt b/forge-gui/res/cardsfolder/s/scouts_warning.txt index a057e9aa9d7..856ca399081 100644 --- a/forge-gui/res/cardsfolder/s/scouts_warning.txt +++ b/forge-gui/res/cardsfolder/s/scouts_warning.txt @@ -6,6 +6,6 @@ SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card. SVar:ScoutFlash:Mode$ Continuous | EffectZone$ Command | Affected$ Creature | AffectedZone$ Hand,Graveyard,Exile,Library,Command | WithFlash$ You SVar:SpellCastTrig:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | Execute$ WarningGiven | Static$ True | TriggerDescription$ The next creature card you play this turn can be played as though it had flash. SVar:WarningGiven:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/scouts_warning.jpg Oracle:The next creature card you play this turn can be played as though it had flash.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/s/scrambleverse.txt b/forge-gui/res/cardsfolder/s/scrambleverse.txt index bda68c77422..9ae166c75d5 100644 --- a/forge-gui/res/cardsfolder/s/scrambleverse.txt +++ b/forge-gui/res/cardsfolder/s/scrambleverse.txt @@ -3,7 +3,7 @@ ManaCost:6 R R Types:Sorcery A:SP$ RepeatEach | Cost$ 6 R R | RecordChoice$ True | ChoosePlayer$ True | Random$ True | RepeatSubAbility$ DBGainControl | RepeatCards$ Permanent.nonLand | SpellDescription$ For each nonland permanent, choose a player at random. Then each player gains control of each permanent for which they were chosen. Untap those permanents. SVar:DBGainControl:DB$ GainControl | NewController$ Player.IsRemembered | AllValid$ Permanent.IsImprinted | Untap$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/scrambleverse.jpg Oracle:For each nonland permanent, choose a player at random. Then each player gains control of each permanent for which they were chosen. Untap those permanents. diff --git a/forge-gui/res/cardsfolder/s/scrap_mastery.txt b/forge-gui/res/cardsfolder/s/scrap_mastery.txt index e6d3736bb4f..983559fe8fd 100644 --- a/forge-gui/res/cardsfolder/s/scrap_mastery.txt +++ b/forge-gui/res/cardsfolder/s/scrap_mastery.txt @@ -5,6 +5,6 @@ A:SP$ ChangeZoneAll | Cost$ 3 R R | ChangeType$ Artifact | Origin$ Graveyard | D SVar:DBSacrifice:DB$ SacrificeAll | ValidCards$ Artifact | SubAbility$ DBReturn SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/scrap_mastery.jpg Oracle:Each player exiles all artifact cards from their graveyard, then sacrifices all artifacts they control, then puts all cards they exiled this way onto the battlefield. diff --git a/forge-gui/res/cardsfolder/s/scrapyard_salvo.txt b/forge-gui/res/cardsfolder/s/scrapyard_salvo.txt index 8f1690c936f..0936bce6b8a 100644 --- a/forge-gui/res/cardsfolder/s/scrapyard_salvo.txt +++ b/forge-gui/res/cardsfolder/s/scrapyard_salvo.txt @@ -3,6 +3,6 @@ ManaCost:1 R R Types:Sorcery A:SP$ DealDamage | Cost$ 1 R R | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals damage to target player or planeswalker equal to the number of artifact cards in your graveyard. SVar:X:Count$TypeInYourYard.Artifact -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/scrapyard_salvo.jpg Oracle:Scrapyard Salvo deals damage to target player or planeswalker equal to the number of artifact cards in your graveyard. diff --git a/forge-gui/res/cardsfolder/s/scroll_of_avacyn.txt b/forge-gui/res/cardsfolder/s/scroll_of_avacyn.txt index f1429891582..5cf3078cfd2 100644 --- a/forge-gui/res/cardsfolder/s/scroll_of_avacyn.txt +++ b/forge-gui/res/cardsfolder/s/scroll_of_avacyn.txt @@ -3,6 +3,6 @@ ManaCost:1 Types:Artifact A:AB$ Draw | Cost$ 1 Sac<1/CARDNAME> | NumCards$ 1 | SubAbility$ BlessedLife | SpellDescription$ Draw a card. If you control an Angel, you gain 5 life. SVar:BlessedLife:DB$GainLife | Defined$ You | ConditionPresent$ Angel.YouCtrl | ConditionCompare$ GE1 | LifeAmount$ 5 | ConditionDescription$ If you control an Angel, -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/scroll_of_avacyn.jpg Oracle:{1}, Sacrifice Scroll of Avacyn: Draw a card. If you control an Angel, you gain 5 life. diff --git a/forge-gui/res/cardsfolder/s/scroll_of_griselbrand.txt b/forge-gui/res/cardsfolder/s/scroll_of_griselbrand.txt index 9e02b768548..05cb5d8ce7b 100644 --- a/forge-gui/res/cardsfolder/s/scroll_of_griselbrand.txt +++ b/forge-gui/res/cardsfolder/s/scroll_of_griselbrand.txt @@ -3,6 +3,6 @@ ManaCost:1 Types:Artifact A:AB$ Discard | Cost$ 1 Sac<1/CARDNAME> | ValidTgts$ Opponent | TgtPrompt$ Choose an opponent | NumCards$ 1 | Mode$ TgtChoose | SubAbility$ DemonBlight | SpellDescription$ Target player discards a card. If you control a Demon, that player loses 3 life. SVar:DemonBlight:DB$ LoseLife | Defined$ Targeted | ConditionPresent$ Demon.YouCtrl | ConditionCompare$ GE1 | LifeAmount$ 3 | ConditionDescription$ If you control a Demon, -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/scroll_of_griselbrand.jpg Oracle:{1}, Sacrifice Scroll of Griselbrand: Target opponent discards a card. If you control a Demon, that player loses 3 life. diff --git a/forge-gui/res/cardsfolder/s/scroll_of_origins.txt b/forge-gui/res/cardsfolder/s/scroll_of_origins.txt index 27f1343abfa..86760bb6bb0 100644 --- a/forge-gui/res/cardsfolder/s/scroll_of_origins.txt +++ b/forge-gui/res/cardsfolder/s/scroll_of_origins.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact A:AB$ Draw | Cost$ 2 T | NumCards$ 1 | ConditionCheckSVar$ X | ConditionSVarCompare$ GE7 | References$ X | AILogic$ CheckCondition | SpellDescription$ Draw a card if you have seven or more cards in hand. SVar:X:Count$InYourHand -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/scroll_of_origins.jpg Oracle:{2}, {T}: Draw a card if you have seven or more cards in hand. diff --git a/forge-gui/res/cardsfolder/s/scroll_rack.txt b/forge-gui/res/cardsfolder/s/scroll_rack.txt index 51d204a035f..cb06a3b42d4 100644 --- a/forge-gui/res/cardsfolder/s/scroll_rack.txt +++ b/forge-gui/res/cardsfolder/s/scroll_rack.txt @@ -7,6 +7,6 @@ SVar:DBReplace:DB$ ChangeZoneAll | Origin$ Exile | Destination$ Library | Change SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:XFetch:Count$InYourHand SVar:X:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/scroll_rack.jpg Oracle:{1}, {T}: Exile any number of cards from your hand face down. Put that many cards from the top of your library into your hand. Then look at the exiled cards and put them on top of your library in any order. diff --git a/forge-gui/res/cardsfolder/s/scrounging_bandar.txt b/forge-gui/res/cardsfolder/s/scrounging_bandar.txt index ed00e6e6b64..6e9c8ce8dab 100644 --- a/forge-gui/res/cardsfolder/s/scrounging_bandar.txt +++ b/forge-gui/res/cardsfolder/s/scrounging_bandar.txt @@ -7,6 +7,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | O SVar:TrigMoveCounter:DB$ MoveCounter | ValidTgts$ Creature.Other | TgtPrompt$ Select target creature | Source$ Self | CounterType$ P1P1 | CounterNum$ Any DeckNeeds:Ability$Counters DeckHas:Ability$Counters -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/scrounging_bandar.jpg Oracle:Scrounging Bandar enters the battlefield with two +1/+1 counters on it.\nAt the beginning of your upkeep, you may move any number of +1/+1 counters from Scrounging Bandar onto another target creature. diff --git a/forge-gui/res/cardsfolder/s/scryb_ranger.txt b/forge-gui/res/cardsfolder/s/scryb_ranger.txt index d67b47a5722..32c9400aec7 100644 --- a/forge-gui/res/cardsfolder/s/scryb_ranger.txt +++ b/forge-gui/res/cardsfolder/s/scryb_ranger.txt @@ -6,6 +6,6 @@ K:Flash K:Flying K:Protection from blue A:AB$ Untap | Cost$ Return<1/Forest> | ValidTgts$ Creature | TgtPrompt$ Select target creature | ActivationLimit$ 1 | SpellDescription$ Untap target creature. Activate this ability only once each turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/scryb_ranger.jpg Oracle:Flash (You may cast this spell any time you could cast an instant.)\nFlying, protection from blue\nReturn a Forest you control to its owner's hand: Untap target creature. Activate this ability only once each turn. diff --git a/forge-gui/res/cardsfolder/s/scrying_glass.txt b/forge-gui/res/cardsfolder/s/scrying_glass.txt index 58429066b4b..c7f7ff05950 100644 --- a/forge-gui/res/cardsfolder/s/scrying_glass.txt +++ b/forge-gui/res/cardsfolder/s/scrying_glass.txt @@ -8,6 +8,6 @@ SVar:DBScryingGlassDraw:DB$ Draw | ConditionCheckSVar$ ScryingGlassX | Condition SVar:DBScryingGlassCleanup:DB$ Cleanup | ClearRemembered$ True SVar:ScryingGlassX:Remembered$Valid Card.ChosenColor SVar:ScryingGlassY:Count$ChosenNumber -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/scrying_glass.jpg Oracle:{3}, {T}: Choose a number greater than 0 and a color. Target opponent reveals their hand. If that opponent reveals exactly the chosen number of cards of the chosen color, you draw a card. diff --git a/forge-gui/res/cardsfolder/s/scrying_sheets.txt b/forge-gui/res/cardsfolder/s/scrying_sheets.txt index 543d5c8b560..7e86351cc1b 100644 --- a/forge-gui/res/cardsfolder/s/scrying_sheets.txt +++ b/forge-gui/res/cardsfolder/s/scrying_sheets.txt @@ -3,7 +3,7 @@ ManaCost:no cost Types:Snow Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Dig | Cost$ 1 S T | DigNum$ 1 | ChangeNum$ 1 | ChangeValid$ Card.Snow | Optional$ True | LibraryPosition2$ 0 | ForceRevealToController$ True | SpellDescription$ Look at the top card of your library. If that card is snow, you may reveal it and put it into your hand. ({S} can be paid with one mana from a snow permanent.) -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/scrying_sheets.jpg Oracle:{T}: Add {C}.\n{1}{S}, {T}: Look at the top card of your library. If that card is snow, you may reveal it and put it into your hand. ({S} can be paid with one mana from a snow permanent.) diff --git a/forge-gui/res/cardsfolder/s/scuttling_death.txt b/forge-gui/res/cardsfolder/s/scuttling_death.txt index 69cc7e17b2f..7bc3b7fd79a 100644 --- a/forge-gui/res/cardsfolder/s/scuttling_death.txt +++ b/forge-gui/res/cardsfolder/s/scuttling_death.txt @@ -4,7 +4,7 @@ Types:Creature Spirit PT:4/2 A:AB$ Pump | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ Target creature gets -1/-1 until end of turn. K:Soulshift:4 -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHints:Type$Spirit SVar:Picture:http://www.wizards.com/global/images/magic/general/scuttling_death.jpg Oracle:Sacrifice Scuttling Death: Target creature gets -1/-1 until end of turn.\nSoulshift 4 (When this creature dies, you may return target Spirit card with converted mana cost 4 or less from your graveyard to your hand.) diff --git a/forge-gui/res/cardsfolder/s/sea_kings_blessing.txt b/forge-gui/res/cardsfolder/s/sea_kings_blessing.txt index 370d165bc2a..a06d0fda19e 100644 --- a/forge-gui/res/cardsfolder/s/sea_kings_blessing.txt +++ b/forge-gui/res/cardsfolder/s/sea_kings_blessing.txt @@ -3,7 +3,7 @@ ManaCost:U Types:Instant A:SP$ Animate | Cost$ U | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ MaxTgts | TgtPrompt$ Select target creatures | Colors$ Blue | OverwriteColors$ True | References$ MaxTgts | SpellDescription$ Any number of target creatures become blue until end of turn. SVar:MaxTgts:Count$Valid Creature -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sea_kings_blessing.jpg Oracle:Any number of target creatures become blue until end of turn. diff --git a/forge-gui/res/cardsfolder/s/sea_scryer.txt b/forge-gui/res/cardsfolder/s/sea_scryer.txt index 33821d536d6..d12fed90c7d 100644 --- a/forge-gui/res/cardsfolder/s/sea_scryer.txt +++ b/forge-gui/res/cardsfolder/s/sea_scryer.txt @@ -4,6 +4,6 @@ Types:Creature Merfolk Wizard PT:1/1 A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ 1 T | Produced$ U | SpellDescription$ Add {U}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sea_scryer.jpg Oracle:{T}: Add {C}.\n{1}, {T}: Add {U}. diff --git a/forge-gui/res/cardsfolder/s/sea_snidd.txt b/forge-gui/res/cardsfolder/s/sea_snidd.txt index 91a7402a6f0..f1886f97c9e 100644 --- a/forge-gui/res/cardsfolder/s/sea_snidd.txt +++ b/forge-gui/res/cardsfolder/s/sea_snidd.txt @@ -4,6 +4,6 @@ Types:Creature Beast PT:3/3 A:AB$ ChooseType | Cost$ T | Defined$ You | Type$ Basic Land | SubAbility$ DBAnimate | SpellDescription$ Target land becomes the basic land type of your choice until end of turn. SVar:DBAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sea_snidd.jpg Oracle:{T}: Target land becomes the basic land type of your choice until end of turn. diff --git a/forge-gui/res/cardsfolder/s/seafarers_quay.txt b/forge-gui/res/cardsfolder/s/seafarers_quay.txt index ec14485f301..ecd01521ae3 100644 --- a/forge-gui/res/cardsfolder/s/seafarers_quay.txt +++ b/forge-gui/res/cardsfolder/s/seafarers_quay.txt @@ -2,6 +2,6 @@ Name:Seafarer's Quay ManaCost:no cost Types:Land S:Mode$ Continuous | Affected$ Creature.Blue+Legendary | AddKeyword$ Bands with Other Legendary Creatures | Description$ Blue legendary creatures you control have "bands with other legendary creatures." (Any legendary creatures can attack in a band as long as at least one has "bands with other legendary creatures." Bands are blocked as a group. If at least two legendary creatures you control, one of which has "bands with other legendary creatures," are blocking or being blocked by the same creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/seafarers_quay.jpg Oracle:Blue legendary creatures you control have "bands with other legendary creatures." (Any legendary creatures can attack in a band as long as at least one has "bands with other legendary creatures." Bands are blocked as a group. If at least two legendary creatures you control, one of which has "bands with other legendary creatures," are blocking or being blocked by the same creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/s/seahunter.txt b/forge-gui/res/cardsfolder/s/seahunter.txt index 08db4082cc8..9af246c946a 100644 --- a/forge-gui/res/cardsfolder/s/seahunter.txt +++ b/forge-gui/res/cardsfolder/s/seahunter.txt @@ -3,7 +3,7 @@ ManaCost:2 U U Types:Creature Human Mercenary PT:2/2 A:AB$ ChangeZone | Cost$ 3 T | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Merfolk | ChangeNum$ 1 | SpellDescription$ Search your library for a Merfolk permanent card, put it onto the battlefield, then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonCombatPriority:3 SVar:Picture:http://www.wizards.com/global/images/magic/general/seahunter.jpg Oracle:{3}, {T}: Search your library for a Merfolk permanent card, put it onto the battlefield, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/s/seal_of_the_guildpact.txt b/forge-gui/res/cardsfolder/s/seal_of_the_guildpact.txt index b9c8519bd8d..d2e2e273c4b 100644 --- a/forge-gui/res/cardsfolder/s/seal_of_the_guildpact.txt +++ b/forge-gui/res/cardsfolder/s/seal_of_the_guildpact.txt @@ -5,6 +5,6 @@ K:ETBReplacement:Other:ChooseColors SVar:ChooseColors:DB$ ChooseColor | Defined$ You | TwoColors$ True | AILogic$ MostProminentDualInComputerDeck | SpellDescription$ As CARDNAME enters the battlefield, choose two colors. S:Mode$ ReduceCost | ValidCard$ Card | Type$ Spell | Activator$ You | Amount$ Col | Description$ Each spell you cast costs {1} less to cast for each of the chosen colors it is. SVar:Col:Count$HasNumChosenColors.Self -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/seal_of_the_guildpact.jpg Oracle:As Seal of the Guildpact enters the battlefield, choose two colors.\nEach spell you cast costs {1} less to cast for each of the chosen colors it is. diff --git a/forge-gui/res/cardsfolder/s/sealed_fate.txt b/forge-gui/res/cardsfolder/s/sealed_fate.txt index 2218990eb8f..ab4a10378d8 100644 --- a/forge-gui/res/cardsfolder/s/sealed_fate.txt +++ b/forge-gui/res/cardsfolder/s/sealed_fate.txt @@ -3,6 +3,6 @@ ManaCost:X U B Types:Sorcery A:SP$ Dig | Cost$ X U B | ValidTgts$ Opponent | DigNum$ X | ChangeNum$ 1 | DestinationZone$ Exile | LibraryPosition2$ 0 | References$ X | SpellDescription$ Look at the top X cards of target opponent's library. Exile one of those cards and put the rest back on top of that player's library in any order. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sealed_fate.jpg Oracle:Look at the top X cards of target opponent's library. Exile one of those cards and put the rest back on top of that player's library in any order. diff --git a/forge-gui/res/cardsfolder/s/seance.txt b/forge-gui/res/cardsfolder/s/seance.txt index e1a32ec38a1..b90424950a9 100644 --- a/forge-gui/res/cardsfolder/s/seance.txt +++ b/forge-gui/res/cardsfolder/s/seance.txt @@ -8,7 +8,7 @@ SVar:DBAnimate:DB$ Animate | Defined$ Clones | Types$ Spirit | sVars$ SneakAttac SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End Of Turn | Execute$ DBExile | RememberObjects$ Clones | TriggerDescription$ CARDNAME - Exile the token at the beginning of the next end step. | SubAbility$ DBCleanup | AILogic$ Always SVar:DBExile:DB$ ChangeZone | Defined$ DelayTriggerRemembered | Origin$ Battlefield | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True SVar:Picture:http://www.wizards.com/global/images/magic/general/seance.jpg Oracle:At the beginning of each upkeep, you may exile target creature card from your graveyard. If you do, create a token that's a copy of that card, except it's a Spirit in addition to its other types. Exile it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/s/search_for_survivors.txt b/forge-gui/res/cardsfolder/s/search_for_survivors.txt index 6654a27070b..d0b2cb67fd6 100644 --- a/forge-gui/res/cardsfolder/s/search_for_survivors.txt +++ b/forge-gui/res/cardsfolder/s/search_for_survivors.txt @@ -9,6 +9,6 @@ SVar:DBExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | Condition SVar:DBCleanupChosen:DB$ Cleanup | ClearChosenPlayer$ True | ClearChosenCard$ True SVar:X:Count$ValidGraveyard Creature.YouCtrl SVar:NeedsToPlayVar:X GE2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/search_for_survivors.jpg Oracle:Reorder your graveyard at random. An opponent chooses a card at random in your graveyard. If it's a creature card, put it onto the battlefield. Otherwise, exile it. diff --git a/forge-gui/res/cardsfolder/s/search_the_city.txt b/forge-gui/res/cardsfolder/s/search_the_city.txt index 694d4364f3f..ba1a719c53f 100644 --- a/forge-gui/res/cardsfolder/s/search_the_city.txt +++ b/forge-gui/res/cardsfolder/s/search_the_city.txt @@ -10,6 +10,6 @@ SVar:SacSelf:DB$ Sacrifice | Defined$ Self | ConditionCheckSVar$ StillLooking | SVar:AllFoundCelebration:DB$ AddTurn | NumTurns$ 1 | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ1 | References$ X SVar:StillLooking:Remembered$Amount SVar:X:Remembered$Amount -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/search_the_city.jpg Oracle:When Search the City enters the battlefield, exile the top five cards of your library.\nWhenever you play a card with the same name as one of the exiled cards, you may put one of those cards with that name into its owner's hand. Then if there are no cards exiled with Search the City, sacrifice it. If you do, take an extra turn after this one. diff --git a/forge-gui/res/cardsfolder/s/search_warrant.txt b/forge-gui/res/cardsfolder/s/search_warrant.txt index 6d1ad274b39..a7783b54f36 100644 --- a/forge-gui/res/cardsfolder/s/search_warrant.txt +++ b/forge-gui/res/cardsfolder/s/search_warrant.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ RevealHand | Cost$ W U | ValidTgts$ Player | TgtPrompt$ Select target player | SubAbility$ DBGainLife | SpellDescription$ Target player reveals their hand. You gain life equal to the number of cards in that player's hand. SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X SVar:X:Count$InTargetedHand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/search_warrant.jpg Oracle:Target player reveals their hand. You gain life equal to the number of cards in that player's hand. diff --git a/forge-gui/res/cardsfolder/s/searing_meditation.txt b/forge-gui/res/cardsfolder/s/searing_meditation.txt index ea432350c71..9497c3fe7cf 100644 --- a/forge-gui/res/cardsfolder/s/searing_meditation.txt +++ b/forge-gui/res/cardsfolder/s/searing_meditation.txt @@ -3,6 +3,6 @@ ManaCost:1 R W Types:Enchantment T:Mode$ LifeGained | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDamage | TriggerDescription$ Whenever you gain life, you may pay {2}. If you do, CARDNAME deals 2 damage to any target. SVar:TrigDamage:AB$DealDamage | Cost$ 2 | NumDmg$ 2 | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/searing_meditation.jpg Oracle:Whenever you gain life, you may pay {2}. If you do, Searing Meditation deals 2 damage to any target. diff --git a/forge-gui/res/cardsfolder/s/searing_rays.txt b/forge-gui/res/cardsfolder/s/searing_rays.txt index 8412b54d317..ef3f414cd82 100644 --- a/forge-gui/res/cardsfolder/s/searing_rays.txt +++ b/forge-gui/res/cardsfolder/s/searing_rays.txt @@ -5,6 +5,6 @@ A:SP$ ChooseColor | Cost$ 2 R | Defined$ You | SubAbility$ DBDmgEach | AILogic$ SVar:DBDmgEach:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBDmg | DamageMap$ True SVar:DBDmg:DB$ DealDamage | Defined$ Remembered | NumDmg$ X | References$ X SVar:X:Count$Valid Creature.RememberedPlayerCtrl+ChosenColor -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/searing_rays.jpg Oracle:Choose a color. Searing Rays deals damage to each player equal to the number of creatures of that color that player controls. diff --git a/forge-gui/res/cardsfolder/s/searing_spear_askari.txt b/forge-gui/res/cardsfolder/s/searing_spear_askari.txt index 7e9fa708b8d..9d381e608d1 100644 --- a/forge-gui/res/cardsfolder/s/searing_spear_askari.txt +++ b/forge-gui/res/cardsfolder/s/searing_spear_askari.txt @@ -4,6 +4,6 @@ Types:Creature Human Knight PT:2/2 K:Flanking A:AB$ Pump | Cost$ 1 R | KW$ Menace | SpellDescription$ CARDNAME gains menace until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/searing_spear_askari.jpg Oracle:Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.)\n{1}{R}: Searing Spear Askari gains menace until end of turn. (It can't be blocked except by two or more creatures.) diff --git a/forge-gui/res/cardsfolder/s/seascape_aerialist.txt b/forge-gui/res/cardsfolder/s/seascape_aerialist.txt index 72d9eecbff0..fa7fe9f4642 100644 --- a/forge-gui/res/cardsfolder/s/seascape_aerialist.txt +++ b/forge-gui/res/cardsfolder/s/seascape_aerialist.txt @@ -7,6 +7,6 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Ally.O SVar:TrigPump:DB$PumpAll | ValidCards$ Ally.YouCtrl | KW$ Flying SVar:PlayMain1:TRUE SVar:BuffedBy:Ally -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/seascape_aerialist.jpg Oracle:Whenever Seascape Aerialist or another Ally enters the battlefield under your control, you may have Ally creatures you control gain flying until end of turn. diff --git a/forge-gui/res/cardsfolder/s/seashell_cameo.txt b/forge-gui/res/cardsfolder/s/seashell_cameo.txt index a047f98444f..b2d5ec5bd5b 100644 --- a/forge-gui/res/cardsfolder/s/seashell_cameo.txt +++ b/forge-gui/res/cardsfolder/s/seashell_cameo.txt @@ -3,7 +3,7 @@ ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$White|Blue SVar:Picture:http://www.wizards.com/global/images/magic/general/seashell_cameo.jpg Oracle:{T}: Add {W} or {U}. diff --git a/forge-gui/res/cardsfolder/s/seaside_haven.txt b/forge-gui/res/cardsfolder/s/seaside_haven.txt index 7b2be09d620..8811e62ad34 100644 --- a/forge-gui/res/cardsfolder/s/seaside_haven.txt +++ b/forge-gui/res/cardsfolder/s/seaside_haven.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Draw | Cost$ W U T Sac<1/Bird> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/seaside_haven.jpg Oracle:{T}: Add {C}.\n{W}{U}, {T}, Sacrifice a Bird: Draw a card. diff --git a/forge-gui/res/cardsfolder/s/seasons_past.txt b/forge-gui/res/cardsfolder/s/seasons_past.txt index 7411c61572a..a4cca54e8b1 100644 --- a/forge-gui/res/cardsfolder/s/seasons_past.txt +++ b/forge-gui/res/cardsfolder/s/seasons_past.txt @@ -5,5 +5,5 @@ A:SP$ ChangeZone | Cost$ 4 G G | ChangeType$ Card.YouOwn | Hidden$ True | Origin SVar:DBChangeZone:DB$ ChangeZone | Defined$ Self | Origin$ Stack | Destination$ Library | LibraryPosition$ -1 SVar:X:Count$ValidGraveyard Card.YouOwn SVar:Picture:http://www.wizards.com/global/images/magic/general/seasons_past.jpg -SVar:RemRandomDeck:True +AI:RemoveDeck:Random Oracle:Return any number of cards with different converted mana costs from your graveyard to your hand. Put Seasons Past on the bottom of its owner's library. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/second_harvest.txt b/forge-gui/res/cardsfolder/s/second_harvest.txt index b47c19058f8..fdfb6a3157b 100644 --- a/forge-gui/res/cardsfolder/s/second_harvest.txt +++ b/forge-gui/res/cardsfolder/s/second_harvest.txt @@ -3,6 +3,6 @@ ManaCost:2 G G Types:Instant A:SP$ RepeatEach | Cost$ 2 G G | RepeatSubAbility$ DBClone | RepeatCards$ Permanent.token+YouCtrl | AILogic$ CloneAllTokens | SpellDescription$ For each token you control, create a token that's a copy of that permanent. SVar:DBClone:DB$ CopyPermanent | Defined$ Remembered -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/second_harvest.jpg Oracle:For each token you control, create a token that's a copy of that permanent. diff --git a/forge-gui/res/cardsfolder/s/second_sight.txt b/forge-gui/res/cardsfolder/s/second_sight.txt index 4593f84a8d2..42a59990396 100644 --- a/forge-gui/res/cardsfolder/s/second_sight.txt +++ b/forge-gui/res/cardsfolder/s/second_sight.txt @@ -5,6 +5,6 @@ K:Entwine:U A:SP$ Charm | Cost$ 2 U | Choices$ DBRearrange,DBRearrange2 | CharmNum$ 1 SVar:DBRearrange:DB$ RearrangeTopOfLibrary | ValidTgts$ Opponent | TgtPrompt$ Choose target opponent. | NumCards$ 5 | SpellDescription$ Look at the top five cards of target opponent's library, then put them back in any order. SVar:DBRearrange2:DB$ RearrangeTopOfLibrary | Defined$ You | NumCards$ 5 | SpellDescription$ look at the top five cards of your library, then put them back in any order. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/second_sight.jpg Oracle:Choose one —\n• Look at the top five cards of target opponent's library, then put them back in any order.\n• Look at the top five cards of your library, then put them back in any order.\nEntwine {U} (Choose both if you pay the entwine cost.) diff --git a/forge-gui/res/cardsfolder/s/second_wind.txt b/forge-gui/res/cardsfolder/s/second_wind.txt index 3a65810716c..a7cbfbf185a 100644 --- a/forge-gui/res/cardsfolder/s/second_wind.txt +++ b/forge-gui/res/cardsfolder/s/second_wind.txt @@ -5,7 +5,7 @@ K:Enchant creature A:SP$ Attach | Cost$ 2 U | ValidTgts$ Creature | AILogic$ Pump A:AB$ Tap | Cost$ T | Defined$ Enchanted | SpellDescription$ Tap enchanted creature. A:AB$ Untap | Cost$ T | Defined$ Enchanted | SpellDescription$ Untap enchanted creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingAttachEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/second_wind.jpg Oracle:Enchant creature\n{T}: Tap enchanted creature.\n{T}: Untap enchanted creature. diff --git a/forge-gui/res/cardsfolder/s/secret_plans.txt b/forge-gui/res/cardsfolder/s/secret_plans.txt index c213a60dcff..bce730f17f9 100644 --- a/forge-gui/res/cardsfolder/s/secret_plans.txt +++ b/forge-gui/res/cardsfolder/s/secret_plans.txt @@ -5,7 +5,7 @@ S:Mode$ Continuous | Affected$ Creature.faceDown+YouCtrl | AddToughness$ 1 | Des T:Mode$ TurnFaceUp | ValidCard$ Permanent.YouCtrl | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever a permanent you control is turned face up, draw a card. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Keyword$Morph SVar:Picture:http://www.wizards.com/global/images/magic/general/secret_plans.jpg Oracle:Face-down creatures you control get +0/+1.\nWhenever a permanent you control is turned face up, draw a card. diff --git a/forge-gui/res/cardsfolder/s/secretkeeper.txt b/forge-gui/res/cardsfolder/s/secretkeeper.txt index b8039fe2ad2..be0ca948792 100644 --- a/forge-gui/res/cardsfolder/s/secretkeeper.txt +++ b/forge-gui/res/cardsfolder/s/secretkeeper.txt @@ -5,6 +5,6 @@ PT:2/2 S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Flying | CheckSVar$ X | SVarCompare$ GTY | Description$ As long as you have more cards in hand than each opponent, CARDNAME gets +2/+2 and has flying. SVar:X:Count$InYourHand SVar:Y:PlayerCountOpponents$HighestCardsInHand -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/secretkeeper.jpg Oracle:As long as you have more cards in hand than each opponent, Secretkeeper gets +2/+2 and has flying. diff --git a/forge-gui/res/cardsfolder/s/secrets_of_the_dead.txt b/forge-gui/res/cardsfolder/s/secrets_of_the_dead.txt index 35d84940d25..b9acfe7967a 100644 --- a/forge-gui/res/cardsfolder/s/secrets_of_the_dead.txt +++ b/forge-gui/res/cardsfolder/s/secrets_of_the_dead.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Enchantment T:Mode$ SpellCast | ValidCard$ Card.wasCastFromGraveyard | ValidActivatingPlayer$ You | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a spell from your graveyard, draw a card. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/secrets_of_the_dead.jpg Oracle:Whenever you cast a spell from your graveyard, draw a card. diff --git a/forge-gui/res/cardsfolder/s/sedge_sliver.txt b/forge-gui/res/cardsfolder/s/sedge_sliver.txt index 2b4b00f4d29..fc075371e36 100644 --- a/forge-gui/res/cardsfolder/s/sedge_sliver.txt +++ b/forge-gui/res/cardsfolder/s/sedge_sliver.txt @@ -7,7 +7,7 @@ SVar:SedgeSliverST:Mode$ Continuous | Affected$ Card.Self | AddPower$ 1 | AddTou S:Mode$ Continuous | Affected$ Sliver | AddAbility$ Pump | Description$ All Slivers have "{B}: Regenerate this permanent." SVar:Pump:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black SVar:Picture:http://www.wizards.com/global/images/magic/general/sedge_sliver.jpg Oracle:All Sliver creatures have "This creature gets +1/+1 as long as you control a Swamp."\nAll Slivers have "{B}: Regenerate this permanent." diff --git a/forge-gui/res/cardsfolder/s/sedraxis_alchemist.txt b/forge-gui/res/cardsfolder/s/sedraxis_alchemist.txt index 031c63b2838..2268318ab71 100644 --- a/forge-gui/res/cardsfolder/s/sedraxis_alchemist.txt +++ b/forge-gui/res/cardsfolder/s/sedraxis_alchemist.txt @@ -4,7 +4,7 @@ Types:Creature Zombie Wizard PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | IsPresent$ Permanent.Blue+YouCtrl | Execute$ TrigBounce | TriggerDescription$ When CARDNAME enters the battlefield, if you control a blue permanent, return target nonland permanent to its owner's hand. SVar:TrigBounce:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Blue DeckHints:Color$Blue SVar:PlayMain1:TRUE diff --git a/forge-gui/res/cardsfolder/s/see_beyond.txt b/forge-gui/res/cardsfolder/s/see_beyond.txt index 00aca31b74f..fa61ab2ac5b 100644 --- a/forge-gui/res/cardsfolder/s/see_beyond.txt +++ b/forge-gui/res/cardsfolder/s/see_beyond.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Sorcery A:SP$ Draw | Cost$ 1 U | NumCards$ 2 | SubAbility$ DBShuffle | SpellDescription$ Draw two cards, then shuffle a card from your hand into your library. SVar:DBShuffle:DB$ ChangeZone | Origin$ Hand | Destination$ Library | Shuffle$ True | ChangeType$ Card.YouOwn | ChangeNum$ 1 | Mandatory$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/see_beyond.jpg Oracle:Draw two cards, then shuffle a card from your hand into your library. diff --git a/forge-gui/res/cardsfolder/s/seed_spark.txt b/forge-gui/res/cardsfolder/s/seed_spark.txt index 0239cc16759..d7f586a105d 100644 --- a/forge-gui/res/cardsfolder/s/seed_spark.txt +++ b/forge-gui/res/cardsfolder/s/seed_spark.txt @@ -4,7 +4,7 @@ Types:Instant A:SP$ Destroy | Cost$ 3 W | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SubAbility$ MakeToken | SpellDescription$ Destroy target artifact or enchantment. SVar:MakeToken:DB$ Token | ConditionManaSpent$ G | TokenAmount$ 2 | TokenOwner$ You | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | TokenImage$ g 1 1 saproling RAV | SpellDescription$ If {G} was spent to cast CARDNAME, create two 1/1 green Saproling creature tokens. SVar:ManaNeededToAvoidNegativeEffect:green -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Green DeckHas:Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/seed_spark.jpg diff --git a/forge-gui/res/cardsfolder/s/seedling_charm.txt b/forge-gui/res/cardsfolder/s/seedling_charm.txt index fafad3d80b1..623d19a8ea7 100644 --- a/forge-gui/res/cardsfolder/s/seedling_charm.txt +++ b/forge-gui/res/cardsfolder/s/seedling_charm.txt @@ -5,6 +5,6 @@ A:SP$ Charm | Cost$ G | Choices$ DBChangeZone,DBRegen,DBPump | CharmNum$ 1 SVar:DBChangeZone:DB$ ChangeZone | ValidTgts$ Aura.AttachedTo Creature | TgtPrompt$ Select target Aura attached to a creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target Aura attached to a creature to its owner's hand. SVar:DBRegen:DB$ Regenerate | ValidTgts$ Creature.Green | TgtPrompt$ Select target green creature. | SpellDescription$ Regenerate target green creature. SVar:DBPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Trample | SpellDescription$ Target creature gains trample until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/seedling_charm.jpg Oracle:Choose one —\n• Return target Aura attached to a creature to its owner's hand.\n• Regenerate target green creature.\n• Target creature gains trample until end of turn. diff --git a/forge-gui/res/cardsfolder/s/seeds_of_innocence.txt b/forge-gui/res/cardsfolder/s/seeds_of_innocence.txt index 4438c705b25..1d773574a77 100644 --- a/forge-gui/res/cardsfolder/s/seeds_of_innocence.txt +++ b/forge-gui/res/cardsfolder/s/seeds_of_innocence.txt @@ -6,7 +6,7 @@ SVar:DBRepeat:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBGainL SVar:DBGainLife:DB$ GainLife | Defined$ Player.IsRemembered | LifeAmount$ X | References$ X SVar:X:RememberedLKI$FilterControlledByRemembered_CardManaCost SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/seeds_of_innocence.jpg Oracle:Destroy all artifacts. They can't be regenerated. The controller of each of those artifacts gains life equal to its converted mana cost. diff --git a/forge-gui/res/cardsfolder/s/seedtime.txt b/forge-gui/res/cardsfolder/s/seedtime.txt index 05abfa83761..8063a0fb202 100644 --- a/forge-gui/res/cardsfolder/s/seedtime.txt +++ b/forge-gui/res/cardsfolder/s/seedtime.txt @@ -3,7 +3,7 @@ ManaCost:1 G Types:Instant A:SP$ AddTurn | Cost$ 1 G | NumTurns$ 1 | PlayerTurn$ True | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | References$ X | SpellDescription$ Cast CARDNAME only during your turn. Take an extra turn after this one if an opponent cast a blue spell this turn. SVar:X:Count$ThisTurnCast_Card.Blue+OppCtrl -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/seedtime.jpg Oracle:Cast Seedtime only during your turn.\nTake an extra turn after this one if an opponent cast a blue spell this turn. diff --git a/forge-gui/res/cardsfolder/s/seething_pathblazer.txt b/forge-gui/res/cardsfolder/s/seething_pathblazer.txt index 1e02505dea8..a81d7b66fe3 100644 --- a/forge-gui/res/cardsfolder/s/seething_pathblazer.txt +++ b/forge-gui/res/cardsfolder/s/seething_pathblazer.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Creature Elemental Warrior PT:2/2 A:AB$ Pump | Cost$ Sac<1/Elemental> | NumAtt$ +2 | KW$ First Strike | SpellDescription$ Seething Pathblazer gets +2/+0 and gains first strike until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/seething_pathblazer.jpg Oracle:Sacrifice an Elemental: Seething Pathblazer gets +2/+0 and gains first strike until end of turn. diff --git a/forge-gui/res/cardsfolder/s/segmented_wurm.txt b/forge-gui/res/cardsfolder/s/segmented_wurm.txt index 4bc5d7adec7..7b97a1a1a90 100644 --- a/forge-gui/res/cardsfolder/s/segmented_wurm.txt +++ b/forge-gui/res/cardsfolder/s/segmented_wurm.txt @@ -4,7 +4,7 @@ Types:Creature Wurm PT:5/5 T:Mode$ BecomesTarget | ValidTarget$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME becomes the target of a spell or ability, put a -1/-1 counter on it. SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterNum$ 1 | CounterType$ M1M1 -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/segmented_wurm.jpg Oracle:Whenever Segmented Wurm becomes the target of a spell or ability, put a -1/-1 counter on it. diff --git a/forge-gui/res/cardsfolder/s/seismic_stomp.txt b/forge-gui/res/cardsfolder/s/seismic_stomp.txt index 907a2a62c60..c5a9939f53a 100644 --- a/forge-gui/res/cardsfolder/s/seismic_stomp.txt +++ b/forge-gui/res/cardsfolder/s/seismic_stomp.txt @@ -3,6 +3,6 @@ ManaCost:1 R Types:Sorcery A:SP$ Effect | Cost$ 1 R | Name$ Seismic Stomp Effect | StaticAbilities$ KWPump | AILogic$ Evasion | SpellDescription$ Creatures without flying can't block this turn. SVar:KWPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.withoutFlying | AddHiddenKeyword$ CARDNAME can't block. | Description$ Creatures without flying can't block this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/seismic_stomp.jpg Oracle:Creatures without flying can't block this turn. diff --git a/forge-gui/res/cardsfolder/s/selective_memory.txt b/forge-gui/res/cardsfolder/s/selective_memory.txt index 2e573ef3abe..497100b93af 100644 --- a/forge-gui/res/cardsfolder/s/selective_memory.txt +++ b/forge-gui/res/cardsfolder/s/selective_memory.txt @@ -3,6 +3,6 @@ ManaCost:3 U Types:Sorcery A:SP$ ChangeZone | Cost$ 3 U | Origin$ Library | Destination$ Exile | ChangeType$ Card.nonLand | ChangeNum$ XFetch | References$ XFetch | SpellDescription$ Search your library for any number of nonland cards and exile them. Then shuffle your library. SVar:XFetch:Count$InYourLibrary -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/selective_memory.jpg Oracle:Search your library for any number of nonland cards and exile them. Then shuffle your library. diff --git a/forge-gui/res/cardsfolder/s/selesnya_cluestone.txt b/forge-gui/res/cardsfolder/s/selesnya_cluestone.txt index 4ba8cb8c4a2..63c76add0a9 100644 --- a/forge-gui/res/cardsfolder/s/selesnya_cluestone.txt +++ b/forge-gui/res/cardsfolder/s/selesnya_cluestone.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. A:AB$ Draw | Cost$ G W T Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Green|White SVar:Picture:http://www.wizards.com/global/images/magic/general/selesnya_cluestone.jpg Oracle:{T}: Add {G} or {W}.\n{G}{W}, {T}, Sacrifice Selesnya Cluestone: Draw a card. diff --git a/forge-gui/res/cardsfolder/s/selesnya_keyrune.txt b/forge-gui/res/cardsfolder/s/selesnya_keyrune.txt index 4746f2613c0..be8d6278df4 100644 --- a/forge-gui/res/cardsfolder/s/selesnya_keyrune.txt +++ b/forge-gui/res/cardsfolder/s/selesnya_keyrune.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. A:AB$ Animate | Cost$ G W | Defined$ Self | Power$ 3 | Toughness$ 3 | Types$ Artifact,Creature,Wolf | Colors$ Green,White | SpellDescription$ CARDNAME becomes a 3/3 green and white Wolf artifact creature until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Green|White SVar:Picture:http://www.wizards.com/global/images/magic/general/selesnya_keyrune.jpg Oracle:{T}: Add {G} or {W}.\n{G}{W}: Selesnya Keyrune becomes a 3/3 green and white Wolf artifact creature until end of turn. diff --git a/forge-gui/res/cardsfolder/s/selesnya_locket.txt b/forge-gui/res/cardsfolder/s/selesnya_locket.txt index 215e199ac23..7a4674f329b 100644 --- a/forge-gui/res/cardsfolder/s/selesnya_locket.txt +++ b/forge-gui/res/cardsfolder/s/selesnya_locket.txt @@ -3,7 +3,7 @@ ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Green | White A:AB$Draw | Cost$ GW GW GW GW T Sac<1/CARDNAME> | NumCards$ 2 | SpellDescription$ Draw two cards. Oracle:{T}: Add {G} or {W}.\n{G/W}{G/W}{G/W}{G/W}, {T}, Sacrifice Selesnya Locket: Draw two cards. diff --git a/forge-gui/res/cardsfolder/s/selesnya_signet.txt b/forge-gui/res/cardsfolder/s/selesnya_signet.txt index 60690886f4b..32bc42e454d 100644 --- a/forge-gui/res/cardsfolder/s/selesnya_signet.txt +++ b/forge-gui/res/cardsfolder/s/selesnya_signet.txt @@ -2,6 +2,6 @@ Name:Selesnya Signet ManaCost:2 Types:Artifact A:AB$ Mana | Cost$ 1 T | Produced$ G W | SpellDescription$ Add {G}{W}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/selesnya_signet.jpg Oracle:{1}, {T}: Add {G}{W}. diff --git a/forge-gui/res/cardsfolder/s/selfless_cathar.txt b/forge-gui/res/cardsfolder/s/selfless_cathar.txt index a0a7e340ccf..45748e81c55 100644 --- a/forge-gui/res/cardsfolder/s/selfless_cathar.txt +++ b/forge-gui/res/cardsfolder/s/selfless_cathar.txt @@ -3,6 +3,6 @@ ManaCost:W Types:Creature Human Cleric PT:1/1 A:AB$ PumpAll | Cost$ 1 W Sac<1/CARDNAME> | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Creatures you control get +1/+1 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/selfless_cathar.jpg Oracle:{1}{W}, Sacrifice Selfless Cathar: Creatures you control get +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/s/selfless_exorcist.txt b/forge-gui/res/cardsfolder/s/selfless_exorcist.txt index f979e7d963d..88aaca9fff0 100644 --- a/forge-gui/res/cardsfolder/s/selfless_exorcist.txt +++ b/forge-gui/res/cardsfolder/s/selfless_exorcist.txt @@ -5,6 +5,6 @@ PT:3/4 A:AB$ ChangeZone | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Graveyard | Destination$ Exile | SubAbility$ DBDealDamage | SpellDescription$ Exile target creature card from a graveyard. That card deals damage equal to its power to CARDNAME. SVar:DBDealDamage:DB$DealDamage | Defined$ Self | NumDmg$ X | References$ X SVar:X:Targeted$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/selfless_exorcist.jpg Oracle:{T}: Exile target creature card from a graveyard. That card deals damage equal to its power to Selfless Exorcist. diff --git a/forge-gui/res/cardsfolder/s/selvala_explorer_returned.txt b/forge-gui/res/cardsfolder/s/selvala_explorer_returned.txt index ad6d06291b6..96b11629bf7 100644 --- a/forge-gui/res/cardsfolder/s/selvala_explorer_returned.txt +++ b/forge-gui/res/cardsfolder/s/selvala_explorer_returned.txt @@ -8,6 +8,6 @@ SVar:DBGainLife:DB$ GainLife | LifeAmount$ X | References$ X | SubAbility$ DBDra SVar:DBDraw:DB$ Draw | Defined$ Player | NumCards$ 1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Valid Card.nonLand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/selvala_explorer_returned.jpg Oracle:Parley — {T}: Each player reveals the top card of their library. For each nonland card revealed this way, add {G} and you gain 1 life. Then each player draws a card. diff --git a/forge-gui/res/cardsfolder/s/semblance_anvil.txt b/forge-gui/res/cardsfolder/s/semblance_anvil.txt index aae46a5ef87..50f7b6f79f4 100644 --- a/forge-gui/res/cardsfolder/s/semblance_anvil.txt +++ b/forge-gui/res/cardsfolder/s/semblance_anvil.txt @@ -8,6 +8,6 @@ T:Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Card.Self | Destination$ SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True SVar:NeedsToPlayVar:Y GE1 SVar:Y:Count$ValidHand Permanent.nonLand+YouOwn -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/semblance_anvil.jpg Oracle:Imprint — When Semblance Anvil enters the battlefield, you may exile a nonland card from your hand.\nSpells you cast that share a card type with the exiled card cost {2} less to cast. diff --git a/forge-gui/res/cardsfolder/s/sengir_nosferatu.txt b/forge-gui/res/cardsfolder/s/sengir_nosferatu.txt index fa647f024b7..f7029316c77 100644 --- a/forge-gui/res/cardsfolder/s/sengir_nosferatu.txt +++ b/forge-gui/res/cardsfolder/s/sengir_nosferatu.txt @@ -5,6 +5,6 @@ PT:4/4 K:Flying A:AB$ Token | Cost$ 1 B Exile<1/CARDNAME> | TokenAmount$ 1 | TokenName$ Bat | TokenTypes$ Creature,Bat | TokenOwner$ You | TokenColors$ Black | TokenPower$ 1 | TokenToughness$ 2 | TokenKeywords$ Flying | TokenAbilities$ ABReturn | SpellDescription$ Create a 1/2 black Bat creature token with flying. It has "{1}{B}, Sacrifice this creature: Return an exiled card named CARDNAME to the battlefield under its owner's control." SVar:ABReturn:AB$ChangeZone | Cost$ 1 B Sac<1/CARDNAME> | ChangeType$ Card.namedSengir Nosferatu | ChangeNum$ 1 | Origin$ Exile | Destination$ Battlefield | Hidden$ True | SpellDescription$ Return an exiled card named Sengir Nosferatu to the battlefield under its owner's control -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sengir_nosferatu.jpg Oracle:Flying\n{1}{B}, Exile Sengir Nosferatu: Create a 1/2 black Bat creature token with flying. It has "{1}{B}, Sacrifice this creature: Return an exiled card named Sengir Nosferatu to the battlefield under its owner's control." diff --git a/forge-gui/res/cardsfolder/s/sensation_gorger.txt b/forge-gui/res/cardsfolder/s/sensation_gorger.txt index fdb6d072aeb..b92696f98a1 100644 --- a/forge-gui/res/cardsfolder/s/sensation_gorger.txt +++ b/forge-gui/res/cardsfolder/s/sensation_gorger.txt @@ -7,6 +7,6 @@ SVar:TrigKinship:DB$ PeekAndReveal | PeekAmount$ 1 | RevealValid$ Card.sharesCre SVar:DBDiscard:DB$ Discard | Mode$ Hand | Defined$ Player | SubAbility$ DBEachDraw | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ1 SVar:DBEachDraw:DB$Draw | Defined$ Player | NumCards$ 4 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sensation_gorger.jpg Oracle:Kinship — At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Sensation Gorger, you may reveal it. If you do, each player discards their hand, then draws four cards. diff --git a/forge-gui/res/cardsfolder/s/senseis_divining_top.txt b/forge-gui/res/cardsfolder/s/senseis_divining_top.txt index 528ef8fb0f6..c8a798ccf24 100644 --- a/forge-gui/res/cardsfolder/s/senseis_divining_top.txt +++ b/forge-gui/res/cardsfolder/s/senseis_divining_top.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ RearrangeTopOfLibrary | Cost$ 1 | Defined$ You | NumCards$ 3 | SpellDescription$ Look at the top three cards of your library, then put them back in any order. A:AB$ Draw | Cost$ T | Defined$ You | NumCards$ 1 | SubAbility$ DBChangeZone | SpellDescription$ Draw a card, then put CARDNAME on top of its owner's library. SVar:DBChangeZone:DB$ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/senseis_divining_top.jpg Oracle:{1}: Look at the top three cards of your library, then put them back in any order.\n{T}: Draw a card, then put Sensei's Divining Top on top of its owner's library. diff --git a/forge-gui/res/cardsfolder/s/sentinel.txt b/forge-gui/res/cardsfolder/s/sentinel.txt index 257363f15a2..a80ca408891 100644 --- a/forge-gui/res/cardsfolder/s/sentinel.txt +++ b/forge-gui/res/cardsfolder/s/sentinel.txt @@ -5,6 +5,6 @@ PT:1/1 A:AB$ Pump | Cost$ 0 | ValidTgts$ Creature.blockedBySource,Creature.blockingSource | TgtPrompt$ Select target creature blocking or being blocked by this creature | SubAbility$ DBAnimate | StackDescription$ None | SpellDescription$ Change CARDNAME's base toughness to 1 plus the power of target creature blocking or blocked by CARDNAME. (This effect lasts indefinitely.) SVar:DBAnimate:DB$ Animate | Defined$ Self | Toughness$ X | Permanent$ True SVar:X:Targeted$CardPower/Plus.1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sentinel.jpg Oracle:{0}: Change Sentinel's base toughness to 1 plus the power of target creature blocking or blocked by Sentinel. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/s/serendib_djinn.txt b/forge-gui/res/cardsfolder/s/serendib_djinn.txt index 74429815c65..47f19c6a894 100644 --- a/forge-gui/res/cardsfolder/s/serendib_djinn.txt +++ b/forge-gui/res/cardsfolder/s/serendib_djinn.txt @@ -10,6 +10,6 @@ SVar:Clean:DB$ Cleanup | ClearRemembered$ True T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Land.YouCtrl | PresentCompare$ EQ0 | Execute$ TrigSac | TriggerDescription$ When you control no lands, sacrifice CARDNAME. SVar:TrigSac:DB$ Sacrifice | Defined$ Self SVar:NeedsToPlay:Island.YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/serendib_djinn.jpg Oracle:Flying\nAt the beginning of your upkeep, sacrifice a land. If you sacrifice an Island this way, Serendib Djinn deals 3 damage to you.\nWhen you control no lands, sacrifice Serendib Djinn. diff --git a/forge-gui/res/cardsfolder/s/serene_master.txt b/forge-gui/res/cardsfolder/s/serene_master.txt index 199e8378fb5..9d6911c2328 100644 --- a/forge-gui/res/cardsfolder/s/serene_master.txt +++ b/forge-gui/res/cardsfolder/s/serene_master.txt @@ -4,6 +4,6 @@ Types:Creature Human Monk PT:0/2 T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigExchangePower | TriggerDescription$ Whenever CARDNAME blocks, exchange its power and the power of target creature it's blocking until end of combat. SVar:TrigExchangePower:DB$ ExchangePower | ValidTgts$ Creature.blockedBySource | TgtPrompt$ Select target creature it's blocking | Defined$ Self | UntilEndOfCombat$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/serene_master.jpg Oracle:Whenever Serene Master blocks, exchange its power and the power of target creature it's blocking until end of combat. diff --git a/forge-gui/res/cardsfolder/s/serene_steward.txt b/forge-gui/res/cardsfolder/s/serene_steward.txt index 4c414f37938..5bb1fec4516 100644 --- a/forge-gui/res/cardsfolder/s/serene_steward.txt +++ b/forge-gui/res/cardsfolder/s/serene_steward.txt @@ -4,7 +4,7 @@ Types:Creature Human Cleric Ally PT:2/2 T:Mode$ LifeGained | ValidPlayer$ You | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever you gain life, you may pay {W}. If you do, put a +1/+1 counter on target creature. SVar:TrigPutCounter:AB$PutCounter | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Ability$LifeGain SVar:Picture:http://www.wizards.com/global/images/magic/general/serene_steward.jpg Oracle:Whenever you gain life, you may pay {W}. If you do, put a +1/+1 counter on target creature. diff --git a/forge-gui/res/cardsfolder/s/serene_sunset.txt b/forge-gui/res/cardsfolder/s/serene_sunset.txt index 21578fd039d..31a224669ac 100644 --- a/forge-gui/res/cardsfolder/s/serene_sunset.txt +++ b/forge-gui/res/cardsfolder/s/serene_sunset.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Pump | Cost$ X G | ValidTgts$ Creature | TgtPrompt$ Select target creature | TargetMin$ 0 | TargetMax$ MaxTgts | KW$ Prevent all combat damage that would be dealt by CARDNAME. | IsCurse$ True | References$ X,MaxTgts | SpellDescription$ Prevent all combat damage X target creatures would deal this turn. SVar:X:Targeted$Amount SVar:MaxTgts:Count$Valid Creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/serene_sunset.jpg Oracle:Prevent all combat damage X target creatures would deal this turn. diff --git a/forge-gui/res/cardsfolder/s/serenity.txt b/forge-gui/res/cardsfolder/s/serenity.txt index f55cc5b5503..87d4099cc08 100644 --- a/forge-gui/res/cardsfolder/s/serenity.txt +++ b/forge-gui/res/cardsfolder/s/serenity.txt @@ -4,7 +4,7 @@ Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDestroyAll | TriggerDescription$ At the beginning of your upkeep, destroy all artifacts and enchantments. They can't be regenerated. SVar:TrigDestroyAll:DB$DestroyAll | ValidCards$ Artifact,Enchantment | NoRegen$ True SVar:NeedsToPlay:Artifact.YouDontCtrl,Enchantment.YouDontCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/serenity.jpg Oracle:At the beginning of your upkeep, destroy all artifacts and enchantments. They can't be regenerated. diff --git a/forge-gui/res/cardsfolder/s/serra_ascendant.txt b/forge-gui/res/cardsfolder/s/serra_ascendant.txt index f5d1c0abac4..81045a93bcb 100644 --- a/forge-gui/res/cardsfolder/s/serra_ascendant.txt +++ b/forge-gui/res/cardsfolder/s/serra_ascendant.txt @@ -5,6 +5,6 @@ PT:1/1 K:Lifelink S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 5 | AddToughness$ 5 | AddKeyword$ Flying | CheckSVar$ X | SVarCompare$ GE30 | Description$ As long as you have 30 or more life, CARDNAME gets +5/+5 and has flying. SVar:X:Count$YourLifeTotal -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/serra_ascendant.jpg Oracle:Lifelink\nAs long as you have 30 or more life, Serra Ascendant gets +5/+5 and has flying. diff --git a/forge-gui/res/cardsfolder/s/serra_aviary.txt b/forge-gui/res/cardsfolder/s/serra_aviary.txt index 03b263b048d..637cb7e304f 100644 --- a/forge-gui/res/cardsfolder/s/serra_aviary.txt +++ b/forge-gui/res/cardsfolder/s/serra_aviary.txt @@ -3,6 +3,6 @@ ManaCost:3 W Types:World Enchantment S:Mode$ Continuous | Affected$ Creature.withFlying | AddPower$ 1 | AddToughness$ 1 | Description$ Creatures with flying get +1/+1. SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/serra_aviary.jpg Oracle:Creatures with flying get +1/+1. diff --git a/forge-gui/res/cardsfolder/s/serras_boon.txt b/forge-gui/res/cardsfolder/s/serras_boon.txt index 29fc8f0b769..458a084cf09 100644 --- a/forge-gui/res/cardsfolder/s/serras_boon.txt +++ b/forge-gui/res/cardsfolder/s/serras_boon.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ 2 W | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy+White | AddPower$ 1 | AddToughness$ 2 | Description$ Enchanted creature gets +1/+2 as long as it's white. S:Mode$ Continuous | Affected$ Creature.EnchantedBy+nonWhite | AddPower$ -2 | AddToughness$ -1 | Description$ Otherwise, it gets -2/-1. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/serras_boon.jpg Oracle:Enchant creature\nEnchanted creature gets +1/+2 as long as it's white. Otherwise, it gets -2/-1. diff --git a/forge-gui/res/cardsfolder/s/serras_hymn.txt b/forge-gui/res/cardsfolder/s/serras_hymn.txt index 757834b7bf7..b69f688e1cc 100644 --- a/forge-gui/res/cardsfolder/s/serras_hymn.txt +++ b/forge-gui/res/cardsfolder/s/serras_hymn.txt @@ -7,6 +7,6 @@ A:AB$ PreventDamage | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature,Player,Planesw SVar:X:Count$CardCounters.VERSE SVar:MaxTgts:PlayerCountPlayers$Amount/Plus.NumCreatures SVar:NumCreatures:Count$Valid Creature,Planeswalker -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/serras_hymn.jpg Oracle:At the beginning of your upkeep, you may put a verse counter on Serra's Hymn.\nSacrifice Serra's Hymn: Prevent the next X damage that would be dealt this turn to any number of targets, divided as you choose, where X is the number of verse counters on Serra's Hymn. diff --git a/forge-gui/res/cardsfolder/s/serras_sanctum.txt b/forge-gui/res/cardsfolder/s/serras_sanctum.txt index b9b2e0fd574..cb4f94aa451 100644 --- a/forge-gui/res/cardsfolder/s/serras_sanctum.txt +++ b/forge-gui/res/cardsfolder/s/serras_sanctum.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Legendary Land A:AB$ Mana | Cost$ T | Produced$ W | Amount$ X | References$ X | SpellDescription$ Add {W} for each Enchantment you control. SVar:X:Count$Valid Enchantment.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/serras_sanctum.jpg Oracle:{T}: Add {W} for each enchantment you control. diff --git a/forge-gui/res/cardsfolder/s/serum_powder.txt b/forge-gui/res/cardsfolder/s/serum_powder.txt index 11feb2adb7e..d9aeae35bd8 100644 --- a/forge-gui/res/cardsfolder/s/serum_powder.txt +++ b/forge-gui/res/cardsfolder/s/serum_powder.txt @@ -3,7 +3,7 @@ ManaCost:3 Types:Artifact Text:Any time you could mulligan and CARDNAME is in your hand, you may exile all the cards from your hand, then draw that many cards. (You can do this in addition to taking mulligans.) A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/serum_powder.jpg Oracle:{T}: Add {C}.\nAny time you could mulligan and Serum Powder is in your hand, you may exile all the cards from your hand, then draw that many cards. (You can do this in addition to taking mulligans.) diff --git a/forge-gui/res/cardsfolder/s/serum_tank.txt b/forge-gui/res/cardsfolder/s/serum_tank.txt index f7ed87b5ff5..9c47cb5e648 100644 --- a/forge-gui/res/cardsfolder/s/serum_tank.txt +++ b/forge-gui/res/cardsfolder/s/serum_tank.txt @@ -5,6 +5,6 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | ValidCard$ Artifact.Other | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME or another artifact enters the battlefield, put a charge counter on CARDNAME. | Secondary$ True A:AB$ Draw | Cost$ 3 T SubCounter<1/CHARGE> | NumCards$ 1 | SpellDescription$ Draw a card. SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ CHARGE | CounterNum$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/serum_tank.jpg Oracle:Whenever Serum Tank or another artifact enters the battlefield, put a charge counter on Serum Tank.\n{3}, {T}, Remove a charge counter from Serum Tank: Draw a card. diff --git a/forge-gui/res/cardsfolder/s/setessan_tactics.txt b/forge-gui/res/cardsfolder/s/setessan_tactics.txt index 65de91ad4e0..de39023f2e8 100644 --- a/forge-gui/res/cardsfolder/s/setessan_tactics.txt +++ b/forge-gui/res/cardsfolder/s/setessan_tactics.txt @@ -6,6 +6,6 @@ A:SP$ Pump | Cost$ 1 G | ValidTgts$ Creature | NumAtt$ +1 | NumDef$ +1 | TargetM SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Abilities$ SetessanFight SVar:SetessanFight:AB$ Fight | Cost$ T | Defined$ Self | ValidTgts$ Creature.Other | TgtPrompt$ Select another creature | SpellDescription$ CARDNAME fights another target creature. SVar:MaxTargets:Count$Valid Creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/setessan_tactics.jpg Oracle:Strive — Setessan Tactics costs {G} more to cast for each target beyond the first.\nUntil end of turn, any number of target creatures each get +1/+1 and gain "{T}: This creature fights another target creature." diff --git a/forge-gui/res/cardsfolder/s/sewerdreg.txt b/forge-gui/res/cardsfolder/s/sewerdreg.txt index 89691c651fa..2bc6d920ab3 100644 --- a/forge-gui/res/cardsfolder/s/sewerdreg.txt +++ b/forge-gui/res/cardsfolder/s/sewerdreg.txt @@ -4,6 +4,6 @@ Types:Creature Spirit PT:3/3 K:Swampwalk A:AB$ ChangeZone | Cost$ Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SpellDescription$ Exile target card from a graveyard. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sewerdreg.jpg Oracle:Swampwalk\nSacrifice Sewerdreg: Exile target card from a graveyard. diff --git a/forge-gui/res/cardsfolder/s/sewers_of_estark.txt b/forge-gui/res/cardsfolder/s/sewers_of_estark.txt index 1556ab801a2..23e5e1229db 100644 --- a/forge-gui/res/cardsfolder/s/sewers_of_estark.txt +++ b/forge-gui/res/cardsfolder/s/sewers_of_estark.txt @@ -7,6 +7,6 @@ SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.IsRemembered,Creature.isBlocke SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True SVar:X:Count$Valid Creature.IsRemembered+attacking SVar:Y:Count$Valid Creature.IsRemembered+blocking -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sewers_of_estark.jpg Oracle:Choose target creature. If it's attacking, it can't be blocked this turn. If it's blocking, prevent all combat damage that would be dealt this combat by it and each creature it's blocking. diff --git a/forge-gui/res/cardsfolder/s/shades_breath.txt b/forge-gui/res/cardsfolder/s/shades_breath.txt index 2d00ea550c7..446f69adca5 100644 --- a/forge-gui/res/cardsfolder/s/shades_breath.txt +++ b/forge-gui/res/cardsfolder/s/shades_breath.txt @@ -3,6 +3,6 @@ ManaCost:1 B Types:Instant A:SP$ AnimateAll | Cost$ 1 B | ValidCards$ Creature.YouCtrl | Colors$ Black | OverwriteColors$ True | Types$ Shade | RemoveCreatureTypes$ True | Abilities$ ABPump | SpellDescription$ Until end of turn, each creature you control becomes black, its creature type becomes Shade, and it gains "{B}: This creature gets +1/+1 until end of turn." SVar:ABPump:AB$Pump | Cost$ B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shades_breath.jpg Oracle:Until end of turn, each creature you control becomes a black Shade and gains "{B}: This creature gets +1/+1 until end of turn." diff --git a/forge-gui/res/cardsfolder/s/shadow_of_doubt.txt b/forge-gui/res/cardsfolder/s/shadow_of_doubt.txt index fd44a3aabc8..d4ffd96e988 100644 --- a/forge-gui/res/cardsfolder/s/shadow_of_doubt.txt +++ b/forge-gui/res/cardsfolder/s/shadow_of_doubt.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Effect | Cost$ UB UB | StaticAbilities$ STCantSearch | SubAbility$ DBDraw | SpellDescription$ Players can't search libraries this turn. Draw a card. SVar:STCantSearch:Mode$ Continuous | Affected$ Player | EffectZone$ Command | AddKeyword$ CantSearchLibrary | Description$ Players can't search libraries. SVar:DBDraw:DB$ Draw | NumCards$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shadow_of_doubt.jpg Oracle:({U/B} can be paid with either {U} or {B}.)\nPlayers can't search libraries this turn.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/s/shadowblood_egg.txt b/forge-gui/res/cardsfolder/s/shadowblood_egg.txt index 90838066656..6ea952a052d 100644 --- a/forge-gui/res/cardsfolder/s/shadowblood_egg.txt +++ b/forge-gui/res/cardsfolder/s/shadowblood_egg.txt @@ -3,7 +3,7 @@ ManaCost:1 Types:Artifact A:AB$ Mana | Cost$ 2 T Sac<1/CARDNAME> | Produced$ B R | SubAbility$ DBDraw | SpellDescription$ Add {B}{R}. Draw a card. SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/shadowblood_egg.jpg Oracle:{2}, {T}, Sacrifice Shadowblood Egg: Add {B}{R}. Draw a card. diff --git a/forge-gui/res/cardsfolder/s/shadowblood_ridge.txt b/forge-gui/res/cardsfolder/s/shadowblood_ridge.txt index 8004b7a2c22..ff5dd5bd04e 100644 --- a/forge-gui/res/cardsfolder/s/shadowblood_ridge.txt +++ b/forge-gui/res/cardsfolder/s/shadowblood_ridge.txt @@ -2,6 +2,6 @@ Name:Shadowblood Ridge ManaCost:no cost Types:Land A:AB$ Mana | Cost$ 1 T | Produced$ B R | SpellDescription$ Add {B}{R}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shadowblood_ridge.jpg Oracle:{1}, {T}: Add {B}{R}. diff --git a/forge-gui/res/cardsfolder/s/shadowstorm.txt b/forge-gui/res/cardsfolder/s/shadowstorm.txt index 8ed49ac7a71..2091434261d 100644 --- a/forge-gui/res/cardsfolder/s/shadowstorm.txt +++ b/forge-gui/res/cardsfolder/s/shadowstorm.txt @@ -2,6 +2,6 @@ Name:Shadowstorm ManaCost:R Types:Sorcery A:SP$ DamageAll | Cost$ R | NumDmg$ 2 | ValidCards$ Creature.withShadow | ValidDescription$ each creature with shadow. | SpellDescription$ CARDNAME deals 2 damage to each creature with shadow. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/shadowstorm.jpg Oracle:Shadowstorm deals 2 damage to each creature with shadow. diff --git a/forge-gui/res/cardsfolder/s/shaman_en_kor.txt b/forge-gui/res/cardsfolder/s/shaman_en_kor.txt index 1c7d8e3ad0e..0e826e69396 100644 --- a/forge-gui/res/cardsfolder/s/shaman_en_kor.txt +++ b/forge-gui/res/cardsfolder/s/shaman_en_kor.txt @@ -13,6 +13,6 @@ SVar:SelflessDmg:DB$ ReplaceEffect | VarName$ Affected | VarValue$ EffectSource SVar:OutOfSight:Mode$ ChangesZone | Origin$ Any | Destination$ Any | Defined$ ChosenCard | Execute$ ExileEffect | Static$ True SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile | Static$ True SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shaman_en_kor.jpg Oracle:{0}: The next 1 damage that would be dealt to Shaman en-Kor this turn is dealt to target creature you control instead.\n{1}{W}: The next time a source of your choice would deal damage to target creature this turn, that damage is dealt to Shaman en-Kor instead. diff --git a/forge-gui/res/cardsfolder/s/shambling_swarm.txt b/forge-gui/res/cardsfolder/s/shambling_swarm.txt index 1e67d68a589..373b311c60a 100644 --- a/forge-gui/res/cardsfolder/s/shambling_swarm.txt +++ b/forge-gui/res/cardsfolder/s/shambling_swarm.txt @@ -7,6 +7,6 @@ SVar:SwarmSpread:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target SVar:DelayedRemoveCounters:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigRemoveCounter | Secondary$ True | TriggerDescription$ For each -1/-1 counter you put on a creature this way, remove a -1/-1 counter from that creature at the beginning of the next end step. SVar:TrigRemoveCounter:DB$ RemoveCounter | Defined$ Remembered | CounterType$ M1M1 | CounterNum$ Remembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shambling_swarm.jpg Oracle:When Shambling Swarm dies, distribute three -1/-1 counters among one, two, or three target creatures. For each -1/-1 counter you put on a creature this way, remove a -1/-1 counter from that creature at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/s/shaper_parasite.txt b/forge-gui/res/cardsfolder/s/shaper_parasite.txt index 8810cf75622..9e7fa614af4 100644 --- a/forge-gui/res/cardsfolder/s/shaper_parasite.txt +++ b/forge-gui/res/cardsfolder/s/shaper_parasite.txt @@ -7,6 +7,6 @@ T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigChoice | TriggerZones$ SVar:TrigChoice:DB$ GenericChoice | ValidTgts$ Creature | TgtPrompt$ Select target creature | Defined$ You | Choices$ TrigPump1,TrigPump2 SVar:TrigPump1:DB$Pump | Defined$ Targeted | NumAtt$ +2 | NumDef$ -2 | IsCurse$ True | SpellDescription$ +2/-2 SVar:TrigPump2:DB$Pump | Defined$ Targeted | NumAtt$ -2 | NumDef$ +2 | IsCurse$ True | SpellDescription$ -2/+2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shaper_parasite.jpg Oracle:Morph {2}{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.)\nWhen Shaper Parasite is turned face up, target creature gets +2/-2 or -2/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/s/shapesharer.txt b/forge-gui/res/cardsfolder/s/shapesharer.txt index 6967cef1d40..c88f1736623 100644 --- a/forge-gui/res/cardsfolder/s/shapesharer.txt +++ b/forge-gui/res/cardsfolder/s/shapesharer.txt @@ -5,6 +5,6 @@ PT:1/1 K:Changeling A:AB$ Pump | Cost$ 2 U | ValidTgts$ Creature.Shapeshifter | TgtPrompt$ Choose target Shapeshifter | AILogic$ Pump | SubAbility$ ShapesharerCopy | StackDescription$ None | SpellDescription$ Target Shapeshifter becomes a copy of target creature until your next turn. SVar:ShapesharerCopy:DB$ Clone | ValidTgts$ Creature | TgtPrompt$ Choose target creature to copy | CloneTarget$ ParentTarget | Duration$ UntilYourNextTurn -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shapesharer.jpg Oracle:Changeling (This card is every creature type.)\n{2}{U}: Target Shapeshifter becomes a copy of target creature until your next turn. diff --git a/forge-gui/res/cardsfolder/s/shapeshifter.txt b/forge-gui/res/cardsfolder/s/shapeshifter.txt index 89422aff9a1..42ed38df7ca 100644 --- a/forge-gui/res/cardsfolder/s/shapeshifter.txt +++ b/forge-gui/res/cardsfolder/s/shapeshifter.txt @@ -8,6 +8,6 @@ SVar:ChooseNumber:DB$ ChooseNumber | Defined$ You | Min$ 0 | Max$ 7 | AILogic$ M S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ Y | Description$ CARDNAME's power is equal to the last chosen number and its toughness is equal to 7 minus that number. SVar:X:Count$ChosenNumber SVar:Y:Number$7/Minus.X -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shapeshifter.jpg Oracle:As Shapeshifter enters the battlefield, choose a number between 0 and 7.\nAt the beginning of your upkeep, you may choose a number between 0 and 7.\nShapeshifter's power is equal to the last chosen number and its toughness is equal to 7 minus that number. diff --git a/forge-gui/res/cardsfolder/s/shard_convergence.txt b/forge-gui/res/cardsfolder/s/shard_convergence.txt index 8f447f20cff..b8162cba2b4 100644 --- a/forge-gui/res/cardsfolder/s/shard_convergence.txt +++ b/forge-gui/res/cardsfolder/s/shard_convergence.txt @@ -5,7 +5,7 @@ A:SP$ ChangeZone | Cost$ 3 G | Origin$ Library | Destination$ Hand | ChangeType$ SVar:DBIsland:DB$ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Island | ChangeNum$ 1 | SubAbility$ DBSwamp SVar:DBSwamp:DB$ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Swamp | ChangeNum$ 1 | SubAbility$ DBMountain SVar:DBMountain:DB$ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Mountain | ChangeNum$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$White|Blue|Black|Red SVar:Picture:http://www.wizards.com/global/images/magic/general/shard_convergence.jpg Oracle:Search your library for a Plains card, an Island card, a Swamp card, and a Mountain card. Reveal those cards and put them into your hand. Then shuffle your library. diff --git a/forge-gui/res/cardsfolder/s/shared_animosity.txt b/forge-gui/res/cardsfolder/s/shared_animosity.txt index 814eb01d3b3..ceebf59d8f5 100644 --- a/forge-gui/res/cardsfolder/s/shared_animosity.txt +++ b/forge-gui/res/cardsfolder/s/shared_animosity.txt @@ -6,6 +6,6 @@ SVar:AnimosityPump:DB$ Pump | RememberObjects$ TriggeredAttacker | SubAbility$ A SVar:AnimosityPump2:DB$ Pump | Defined$ Remembered | NumAtt$ X | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$Valid Creature.attacking+IsNotRemembered+sharesCreatureTypeWith Remembered -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/shared_animosity.jpg Oracle:Whenever a creature you control attacks, it gets +1/+0 until end of turn for each other attacking creature that shares a creature type with it. diff --git a/forge-gui/res/cardsfolder/s/shared_fate.txt b/forge-gui/res/cardsfolder/s/shared_fate.txt index 4f4265257e5..323cb0b0ad6 100644 --- a/forge-gui/res/cardsfolder/s/shared_fate.txt +++ b/forge-gui/res/cardsfolder/s/shared_fate.txt @@ -12,7 +12,7 @@ SVar:DBExile:DB$ Mill | NumCards$ 1 | Destination$ Exile | ExileFaceDown$ True | SVar:STPlay:Mode$ Continuous | MayLookAt$ You | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may look at and play cards exiled with Shared Fate. SVar:TrigCleanup:Mode$ ChangesZone | ValidCard$ Card.IsRemembered | Origin$ Exile | Destination$ Any | TriggerZones$ Command | Execute$ DBCleanup | Static$ True SVar:DBCleanup:DB$ Cleanup | ForgetDefined$ TriggeredCard -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/shared_fate.jpg Oracle:If a player would draw a card, that player exiles the top card of an opponent's library face down instead.\nEach player may look at and play cards they exiled with Shared Fate. diff --git a/forge-gui/res/cardsfolder/s/shared_trauma.txt b/forge-gui/res/cardsfolder/s/shared_trauma.txt index 1726ebf9ff9..88a6cf49c8d 100644 --- a/forge-gui/res/cardsfolder/s/shared_trauma.txt +++ b/forge-gui/res/cardsfolder/s/shared_trauma.txt @@ -8,7 +8,7 @@ SVar:DBMill:DB$ Mill | Defined$ Player | NumCards$ JoinForcesAmount | SubAbility SVar:DBReset:DB$ StoreSVar | SVar$ JoinForcesAmount | Type$ Number | Expression$ 0 | References$ JoinForcesAmount SVar:X:Count$ChosenNumber SVar:JoinForcesAmount:Number$0 -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/shared_trauma.jpg Oracle:Join forces — Starting with you, each player may pay any amount of mana. Each player puts the top X cards of their library into their graveyard, where X is the total amount of mana paid this way. diff --git a/forge-gui/res/cardsfolder/s/shared_triumph.txt b/forge-gui/res/cardsfolder/s/shared_triumph.txt index f59f574e3f1..b923dff2eaa 100644 --- a/forge-gui/res/cardsfolder/s/shared_triumph.txt +++ b/forge-gui/res/cardsfolder/s/shared_triumph.txt @@ -4,7 +4,7 @@ Types:Enchantment K:ETBReplacement:Other:ChooseCT SVar:ChooseCT:DB$ ChooseType | Defined$ You | Type$ Creature | SpellDescription$ As CARDNAME enters the battlefield, choose a creature type. | AILogic$ MostProminentInComputerDeck S:Mode$ Continuous | Affected$ Creature.ChosenType | AddPower$ 1 | AddToughness$ 1 | Description$ Creatures of the chosen type get +1/+1. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/shared_triumph.jpg Oracle:As Shared Triumph enters the battlefield, choose a creature type.\nCreatures of the chosen type get +1/+1. diff --git a/forge-gui/res/cardsfolder/s/shattered_crypt.txt b/forge-gui/res/cardsfolder/s/shattered_crypt.txt index c977de913a4..9c1eb5a7020 100644 --- a/forge-gui/res/cardsfolder/s/shattered_crypt.txt +++ b/forge-gui/res/cardsfolder/s/shattered_crypt.txt @@ -5,6 +5,6 @@ A:SP$ ChangeZone | Cost$ X B B | Origin$ Graveyard | Destination$ Hand | ValidTg SVar:DBLoseLife:DB$LoseLife | Defined$ You | LifeAmount$ X | References$ X SVar:X:Targeted$Amount SVar:MaxTgts:Count$TypeInYourYard.Creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shattered_crypt.jpg Oracle:Return X target creature cards from your graveyard to your hand. You lose X life. diff --git a/forge-gui/res/cardsfolder/s/shattered_perception.txt b/forge-gui/res/cardsfolder/s/shattered_perception.txt index 026385fda22..dc3f9df0dc9 100644 --- a/forge-gui/res/cardsfolder/s/shattered_perception.txt +++ b/forge-gui/res/cardsfolder/s/shattered_perception.txt @@ -6,6 +6,6 @@ SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ X | SubAbility$ DBCleanup | Refe SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount K:Flashback:5 R -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shattered_perception.jpg Oracle:Discard all the cards in your hand, then draw that many cards.\nFlashback {5}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/s/shauku_endbringer.txt b/forge-gui/res/cardsfolder/s/shauku_endbringer.txt index bdcc74a664f..351c134384e 100644 --- a/forge-gui/res/cardsfolder/s/shauku_endbringer.txt +++ b/forge-gui/res/cardsfolder/s/shauku_endbringer.txt @@ -10,6 +10,6 @@ SVar:TrigLoseLife:DB$LoseLife | Defined$ You | LifeAmount$ 3 SVar:DBCounter:DB$PutCounter | CounterType$ P1P1 | CounterNum$ 1 | Defined$ Self SVar:X:Count$Valid Creature #TODO: This creature seems almost AI playable, except the AI won't play around it and will cast other creatures, which may not even be a necessarily bad thing. Maybe RemRandomDeck would suffice here. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shauku_endbringer.jpg Oracle:Flying\nShauku, Endbringer can't attack if there's another creature on the battlefield.\nAt the beginning of your upkeep, you lose 3 life.\n{T}: Exile target creature and put a +1/+1 counter on Shauku. diff --git a/forge-gui/res/cardsfolder/s/shaukus_minion.txt b/forge-gui/res/cardsfolder/s/shaukus_minion.txt index 33d06530afe..f7f3d87abe7 100644 --- a/forge-gui/res/cardsfolder/s/shaukus_minion.txt +++ b/forge-gui/res/cardsfolder/s/shaukus_minion.txt @@ -3,6 +3,6 @@ ManaCost:1 B R Types:Creature Human Minion PT:2/2 A:AB$ DealDamage | Cost$ B R T | ValidTgts$ Creature.White | TgtPrompt$ Select target white creature | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target white creature. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/shaukus_minion.jpg Oracle:{B}{R}, {T}: Shauku's Minion deals 2 damage to target white creature. diff --git a/forge-gui/res/cardsfolder/s/shelkin_brownie.txt b/forge-gui/res/cardsfolder/s/shelkin_brownie.txt index 5e4118e0568..69e5cf7bb0a 100644 --- a/forge-gui/res/cardsfolder/s/shelkin_brownie.txt +++ b/forge-gui/res/cardsfolder/s/shelkin_brownie.txt @@ -3,6 +3,6 @@ ManaCost:1 G Types:Creature Ouphe PT:1/1 A:AB$ Debuff | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | Keywords$ Bands with Other Creatures named Wolves of the Hunt & Bands with Other Legendary Creatures | SpellDescription$ Target creature loses all "bands with other" abilities until end of turn. | StackDescription$ SpellDescription -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shelkin_brownie.jpg Oracle:{T}: Target creature loses all "bands with other" abilities until end of turn. diff --git a/forge-gui/res/cardsfolder/s/shell_of_the_last_kappa.txt b/forge-gui/res/cardsfolder/s/shell_of_the_last_kappa.txt index 9697c0111c6..b695c8a5dba 100644 --- a/forge-gui/res/cardsfolder/s/shell_of_the_last_kappa.txt +++ b/forge-gui/res/cardsfolder/s/shell_of_the_last_kappa.txt @@ -7,6 +7,6 @@ T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCar SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shell_of_the_last_kappa.jpg Oracle:{3}, {T}: Exile target instant or sorcery spell that targets you. (The spell has no effect.)\n{3}, {T}, Sacrifice Shell of the Last Kappa: You may cast a card exiled with Shell of the Last Kappa without paying its mana cost. diff --git a/forge-gui/res/cardsfolder/s/shelldock_isle.txt b/forge-gui/res/cardsfolder/s/shelldock_isle.txt index 73510183f80..a930808f610 100644 --- a/forge-gui/res/cardsfolder/s/shelldock_isle.txt +++ b/forge-gui/res/cardsfolder/s/shelldock_isle.txt @@ -5,6 +5,6 @@ K:Hideaway A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Play | Cost$ U T | Defined$ Remembered | Amount$ All | Controller$ You | WithoutManaCost$ True | Optional$ True | ConditionCheckSVar$ X | ConditionSVarCompare$ LE20 | ForgetRemembered$ True | References$ X | AILogic$ CheckCondition | SpellDescription$ You may play the exiled card without paying its mana cost if a library has twenty or fewer cards in it. SVar:X:PlayerCountPlayers$LowestValidLibrary Card.YouOwn -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/shelldock_isle.jpg Oracle:Hideaway (This land enters the battlefield tapped. When it does, look at the top four cards of your library, exile one face down, then put the rest on the bottom of your library.)\n{T}: Add {U}.\n{U}, {T}: You may play the exiled card without paying its mana cost if a library has twenty or fewer cards in it. diff --git a/forge-gui/res/cardsfolder/s/sheltering_ancient.txt b/forge-gui/res/cardsfolder/s/sheltering_ancient.txt index 2c978c1e85f..ed2a5b43172 100644 --- a/forge-gui/res/cardsfolder/s/sheltering_ancient.txt +++ b/forge-gui/res/cardsfolder/s/sheltering_ancient.txt @@ -4,6 +4,6 @@ Types:Creature Treefolk PT:5/5 K:Trample K:Cumulative upkeep:AddCounter<1/P1P1/Creature.OppCtrl/creature an opponent controls>:Put a +1/+1 counter on a creature an opponent controls. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sheltering_ancient.jpg Oracle:Trample\nCumulative upkeep—Put a +1/+1 counter on a creature an opponent controls. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) diff --git a/forge-gui/res/cardsfolder/s/sheltering_prayers.txt b/forge-gui/res/cardsfolder/s/sheltering_prayers.txt index 3a07c0c95a9..7c9f3e89768 100644 --- a/forge-gui/res/cardsfolder/s/sheltering_prayers.txt +++ b/forge-gui/res/cardsfolder/s/sheltering_prayers.txt @@ -6,6 +6,6 @@ S:Mode$ Continuous | Affected$ Land.Basic+YouDontCtrl | AddKeyword$ Shroud | Che SVar:X:Count$Valid Land.YouCtrl SVar:Y:Count$Valid Land.YouDontCtrl SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sheltering_prayers.jpg Oracle:Basic lands each player controls have shroud as long as that player controls three or fewer lands. (They can't be the targets of spells or abilities.) diff --git a/forge-gui/res/cardsfolder/s/shepherd_of_rot.txt b/forge-gui/res/cardsfolder/s/shepherd_of_rot.txt index cacf174a21a..61653aaf319 100644 --- a/forge-gui/res/cardsfolder/s/shepherd_of_rot.txt +++ b/forge-gui/res/cardsfolder/s/shepherd_of_rot.txt @@ -4,6 +4,6 @@ Types:Creature Zombie Cleric PT:1/1 A:AB$ LoseLife | Cost$ T | Defined$ Player | LifeAmount$ X | References$ X | SpellDescription$ Each player loses 1 life for each Zombie on the battlefield. SVar:X:Count$TypeOnBattlefield.Zombie -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/shepherd_of_rot.jpg Oracle:{T}: Each player loses 1 life for each Zombie on the battlefield. diff --git a/forge-gui/res/cardsfolder/s/shield_bearer.txt b/forge-gui/res/cardsfolder/s/shield_bearer.txt index 870232efb4a..58b0d2be835 100644 --- a/forge-gui/res/cardsfolder/s/shield_bearer.txt +++ b/forge-gui/res/cardsfolder/s/shield_bearer.txt @@ -3,6 +3,6 @@ ManaCost:1 W Types:Creature Human Soldier PT:0/3 K:Banding -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shield_bearer.jpg Oracle:Banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/s/shield_dancer.txt b/forge-gui/res/cardsfolder/s/shield_dancer.txt index 3c37bdb1649..65b3521af14 100644 --- a/forge-gui/res/cardsfolder/s/shield_dancer.txt +++ b/forge-gui/res/cardsfolder/s/shield_dancer.txt @@ -6,6 +6,6 @@ A:AB$ Effect | Cost$ 2 W | ValidTgts$ Creature.attacking | TgtPrompt$ Select tar SVar:DamageShielded:Event$ DamageDone | IsCombat$ True | ValidSource$ Card.IsRemembered | ValidTarget$ Card.EffectSource | ReplaceWith$ DmgSelf | Description$ The next time the targeted attacking creature would deal combat damage to EFFECTSOURCE this turn, that creature deals that damage to itself instead. SVar:DmgSelf:DB$ ReplaceEffect | VarName$ Affected | VarValue$ Remembered | VarType$ Card | SubAbility$ ExileEffect SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shield_dancer.jpg Oracle:{2}{W}: The next time target attacking creature would deal combat damage to Shield Dancer this turn, that creature deals that damage to itself instead. diff --git a/forge-gui/res/cardsfolder/s/shield_wall.txt b/forge-gui/res/cardsfolder/s/shield_wall.txt index ef5115cfd03..28ba4114fbf 100644 --- a/forge-gui/res/cardsfolder/s/shield_wall.txt +++ b/forge-gui/res/cardsfolder/s/shield_wall.txt @@ -2,6 +2,6 @@ Name:Shield Wall ManaCost:1 W Types:Instant A:SP$ PumpAll | Cost$ 1 W | ValidCards$ Creature.YouCtrl | NumDef$ +2 | SpellDescription$ Creatures you control get +0/+2 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://resources.wizards.com/magic/cards/7e/en-us/card11499.jpg Oracle:Creatures you control get +0/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/s/shielded_by_faith.txt b/forge-gui/res/cardsfolder/s/shielded_by_faith.txt index 38103f50692..ee40c045d73 100644 --- a/forge-gui/res/cardsfolder/s/shielded_by_faith.txt +++ b/forge-gui/res/cardsfolder/s/shielded_by_faith.txt @@ -6,6 +6,6 @@ A:SP$ Attach | Cost$ 1 W W | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Indestructible | Description$ Enchanted creature has indestructible. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigAttach | OptionalDecider$ You | TriggerDescription$ Whenever a creature enters the battlefield, you may attach CARDNAME to that creature. SVar:TrigAttach:DB$ Attach | Defined$ TriggeredCard -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shielded_by_faith.jpg Oracle:Enchant creature\nEnchanted creature has indestructible.\nWhenever a creature enters the battlefield, you may attach Shielded by Faith to that creature. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/shielded_passage.txt b/forge-gui/res/cardsfolder/s/shielded_passage.txt index 6bd19814cba..9ca3931da6c 100644 --- a/forge-gui/res/cardsfolder/s/shielded_passage.txt +++ b/forge-gui/res/cardsfolder/s/shielded_passage.txt @@ -2,6 +2,6 @@ Name:Shielded Passage ManaCost:W Types:Instant A:SP$ Pump | Cost$ W | KW$ Prevent all damage that would be dealt to CARDNAME. | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Prevent all damage that would be dealt to target creature this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shielded_passage.jpg Oracle:Prevent all damage that would be dealt to target creature this turn. diff --git a/forge-gui/res/cardsfolder/s/shieldmage_advocate.txt b/forge-gui/res/cardsfolder/s/shieldmage_advocate.txt index 2b3b9f7acf9..0240087e5ad 100644 --- a/forge-gui/res/cardsfolder/s/shieldmage_advocate.txt +++ b/forge-gui/res/cardsfolder/s/shieldmage_advocate.txt @@ -7,6 +7,6 @@ SVar:DBChooseSource:DB$ ChooseSource | Choices$ Card,Emblem | AILogic$ NeedsPrev SVar:DBEffect:DB$ Effect | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target to prevent damage | ForgetOnMoved$ Battlefield | ReplacementEffects$ RPrevent | References$ RPrevent | RememberObjects$ TargetedPlayer,ThisTargetedCard | SubAbility$ DBCleanup | ConditionDefined$ ChosenCard | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup SVar:RPrevent:Event$ DamageDone | Prevent$ True | ActiveZones$ Command | ValidSource$ Card.ChosenCard | ValidTarget$ Player.IsRemembered,Card.IsRemembered | Description$ Prevent all damage that would be dealt to any target this turn by a source of your choice. SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shieldmage_advocate.jpg Oracle:{T}: Return target card from an opponent's graveyard to their hand. Prevent all damage that would be dealt to any target this turn by a source of your choice. diff --git a/forge-gui/res/cardsfolder/s/shieldmage_elder.txt b/forge-gui/res/cardsfolder/s/shieldmage_elder.txt index 5e4108403cc..068ecbcb862 100644 --- a/forge-gui/res/cardsfolder/s/shieldmage_elder.txt +++ b/forge-gui/res/cardsfolder/s/shieldmage_elder.txt @@ -7,6 +7,6 @@ A:AB$ Effect | Cost$ tapXType<2/Wizard> | ValidTgts$ Card.inZoneStack | TgtZone$ SVar:STNoDmg:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield,Stack | Affected$ Card.IsRemembered | AddKeyword$ Prevent all damage that would be dealt by CARDNAME. | Description$ Prevent all damage target spell would deal this turn. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True #Another Zone should be included currently, therefore the target would be a card, not a spell/ability -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shieldmage_elder.jpg Oracle:Tap two untapped Clerics you control: Prevent all damage target creature would deal this turn.\nTap two untapped Wizards you control: Prevent all damage target spell would deal this turn. diff --git a/forge-gui/res/cardsfolder/s/shields_of_velis_vel.txt b/forge-gui/res/cardsfolder/s/shields_of_velis_vel.txt index e12e79136b6..fba57c89625 100644 --- a/forge-gui/res/cardsfolder/s/shields_of_velis_vel.txt +++ b/forge-gui/res/cardsfolder/s/shields_of_velis_vel.txt @@ -5,6 +5,6 @@ K:Changeling A:SP$ PumpAll | Cost$ W | ValidTgts$ Player | TgtPrompt$ Select target player | ValidCards$ Creature | NumAtt$ +0 | NumDef$ +1 | SubAbility$ DBAnimate | SpellDescription$ Creatures target player controls get +0/+1 and gain all creature types until end of turn. SVar:DBAnimate:DB$ AnimateAll | ValidCards$ Creature.TargetedPlayerCtrl | Types$ AllCreatureTypes SVar:NeedsToPlay:Creature.YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shields_of_velis_vel.jpg Oracle:Changeling (This card is every creature type.)\nCreatures target player controls get +0/+1 and gain all creature types until end of turn. diff --git a/forge-gui/res/cardsfolder/s/shifting_borders.txt b/forge-gui/res/cardsfolder/s/shifting_borders.txt index 67753a5e487..a51c48a1a0e 100644 --- a/forge-gui/res/cardsfolder/s/shifting_borders.txt +++ b/forge-gui/res/cardsfolder/s/shifting_borders.txt @@ -3,6 +3,6 @@ ManaCost:3 U Types:Instant Arcane K:Splice:Arcane:3 U A:SP$ ExchangeControl | Cost$ 3 U | ValidTgts$ Land | TgtPrompt$ Select target Land | TargetMin$ 2 | TargetMax$ 2 | SpellDescription$ Exchange control of two target lands. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shifting_borders.jpg Oracle:Exchange control of two target lands.\nSplice onto Arcane {3}{U} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) diff --git a/forge-gui/res/cardsfolder/s/shifting_loyalties.txt b/forge-gui/res/cardsfolder/s/shifting_loyalties.txt index 36b01650587..717403fb436 100644 --- a/forge-gui/res/cardsfolder/s/shifting_loyalties.txt +++ b/forge-gui/res/cardsfolder/s/shifting_loyalties.txt @@ -3,7 +3,7 @@ ManaCost:5 U Types:Sorcery A:SP$ Pump | Cost$ 5 U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | SubAbility$ DBExchange | StackDescription$ None | SpellDescription$ Exchange control of two target permanents that share a card type. SVar:DBExchange:DB$ ExchangeControl | Defined$ ParentTarget | ValidTgts$ Permanent | TgtPrompt$ Select target permanent shares a card type with it | TargetsWithSharedTypes$ Creature,Artifact,Enchantment,Planeswalker,Land | TargetUnique$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/shifting_loyalties.jpg Oracle:Exchange control of two target permanents that share a card type. (Artifact, creature, enchantment, land, and planeswalker are card types.) diff --git a/forge-gui/res/cardsfolder/s/shifting_sky.txt b/forge-gui/res/cardsfolder/s/shifting_sky.txt index 7d9134138d9..434ea064a90 100644 --- a/forge-gui/res/cardsfolder/s/shifting_sky.txt +++ b/forge-gui/res/cardsfolder/s/shifting_sky.txt @@ -4,7 +4,7 @@ Types:Enchantment K:ETBReplacement:Other:ChooseColor SVar:ChooseColor:DB$ ChooseColor | Defined$ You | AILogic$ MostProminentKeywordInComputerDeck | SpellDescription$ As CARDNAME enters the battlefield, choose a color. S:Mode$ Continuous| Affected$ Permanent.nonLand | SetColor$ ChosenColor | Description$ All nonland permanents are the chosen color. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/shifting_sky.jpg Oracle:As Shifting Sky enters the battlefield, choose a color.\nAll nonland permanents are the chosen color. diff --git a/forge-gui/res/cardsfolder/s/shifty_doppelganger.txt b/forge-gui/res/cardsfolder/s/shifty_doppelganger.txt index d8e7a756df4..8a91d5d9932 100644 --- a/forge-gui/res/cardsfolder/s/shifty_doppelganger.txt +++ b/forge-gui/res/cardsfolder/s/shifty_doppelganger.txt @@ -8,6 +8,6 @@ SVar:DBDelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ SVar:TrigSac:DB$ SacrificeAll | Defined$ DelayTriggerRemembered | Controller$ You | RememberSacrificed$ True | SubAbility$ DBBounce SVar:DBBounce:DB$ ChangeZone | Origin$ Exile | Defined$ Self | Destination$ Battlefield | ConditionDefined$ Remembered | ConditionPresent$ Card | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shifty_doppelganger.jpg Oracle:{3}{U}, Exile Shifty Doppelganger: You may put a creature card from your hand onto the battlefield. If you do, that creature gains haste until end of turn. At the beginning of the next end step, sacrifice that creature. If you do, return Shifty Doppelganger to the battlefield. diff --git a/forge-gui/res/cardsfolder/s/shimatsu_the_bloodcloaked.txt b/forge-gui/res/cardsfolder/s/shimatsu_the_bloodcloaked.txt index 7093b7a7d3b..4bfeaf0be9f 100644 --- a/forge-gui/res/cardsfolder/s/shimatsu_the_bloodcloaked.txt +++ b/forge-gui/res/cardsfolder/s/shimatsu_the_bloodcloaked.txt @@ -9,7 +9,7 @@ SVar:MoveToPlay:DB$ ChangeZone | Defined$ ReplacedCard | Origin$ All | Destinati SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:SacX:Count$Valid Permanent.YouCtrl SVar:X:Remembered$Amount -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/shimatsu_the_bloodcloaked.jpg Oracle:As Shimatsu the Bloodcloaked enters the battlefield, sacrifice any number of permanents. Shimatsu enters the battlefield with that many +1/+1 counters on it. diff --git a/forge-gui/res/cardsfolder/s/shimmer.txt b/forge-gui/res/cardsfolder/s/shimmer.txt index 3a01844726f..02fa73ffb89 100644 --- a/forge-gui/res/cardsfolder/s/shimmer.txt +++ b/forge-gui/res/cardsfolder/s/shimmer.txt @@ -4,6 +4,6 @@ Types:Enchantment K:ETBReplacement:Other:ChooseLT SVar:ChooseLT:DB$ ChooseType | Defined$ You | Type$ Land | SpellDescription$ As CARDNAME enters the battlefield, choose a land type. S:Mode$ Continuous | Affected$ Land.ChosenType | AddKeyword$ Phasing | Description$ Each land of the chosen type has phasing. (It phases in or out before its controller untaps during each of their untap steps. While it's phased out, it's treated as though it doesn't exist.) -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shimmer.jpg Oracle:As Shimmer enters the battlefield, choose a land type.\nEach land of the chosen type has phasing. (It phases in or out before its controller untaps during each of their untap steps. While it's phased out, it's treated as though it doesn't exist.) diff --git a/forge-gui/res/cardsfolder/s/shimmering_grotto.txt b/forge-gui/res/cardsfolder/s/shimmering_grotto.txt index 0847f79b4e1..deeb864966a 100644 --- a/forge-gui/res/cardsfolder/s/shimmering_grotto.txt +++ b/forge-gui/res/cardsfolder/s/shimmering_grotto.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ 1 T | Produced$ Any | SpellDescription$ Add one mana of any color. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shimmering_grotto.jpg Oracle:{T}: Add {C}.\n{1}, {T}: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/s/shimmering_mirage.txt b/forge-gui/res/cardsfolder/s/shimmering_mirage.txt index 63781c37fb8..2444854c258 100644 --- a/forge-gui/res/cardsfolder/s/shimmering_mirage.txt +++ b/forge-gui/res/cardsfolder/s/shimmering_mirage.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ ChooseType | Cost$ 1 U | Defined$ You | Type$ Basic Land | SubAbility$ DBAnimate | SpellDescription$ Target land becomes the basic land type of your choice until end of turn. Draw a card. SVar:DBAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shimmering_mirage.jpg Oracle:Target land becomes the basic land type of your choice until end of turn.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/s/shinen_of_lifes_roar.txt b/forge-gui/res/cardsfolder/s/shinen_of_lifes_roar.txt index 4a70e624d1f..04fc16ae33b 100644 --- a/forge-gui/res/cardsfolder/s/shinen_of_lifes_roar.txt +++ b/forge-gui/res/cardsfolder/s/shinen_of_lifes_roar.txt @@ -4,6 +4,6 @@ Types:Creature Spirit PT:1/2 K:All creatures able to block CARDNAME do so. A:AB$ Pump | Cost$ 2 G G Discard<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | PrecostDesc$ Channel — | KW$ HIDDEN All creatures able to block CARDNAME do so. | ActivationZone$ Hand | SpellDescription$ All creatures able to block target creature this turn do so. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shinen_of_lifes_roar.jpg Oracle:All creatures able to block Shinen of Life's Roar do so.\nChannel — {2}{G}{G}, Discard Shinen of Life's Roar: All creatures able to block target creature this turn do so. diff --git a/forge-gui/res/cardsfolder/s/shisato_whispering_hunter.txt b/forge-gui/res/cardsfolder/s/shisato_whispering_hunter.txt index e0e747ffe02..20bc3b78ac0 100644 --- a/forge-gui/res/cardsfolder/s/shisato_whispering_hunter.txt +++ b/forge-gui/res/cardsfolder/s/shisato_whispering_hunter.txt @@ -6,7 +6,7 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E SVar:TrigSac:DB$Sacrifice | Defined$ You | SacValid$ Snake T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player skips their next untap step. SVar:TrigPump:DB$Pump | Defined$ TriggeredTarget | KW$ Skip your next untap step. | Permanent$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/shisato_whispering_hunter.jpg Oracle:At the beginning of your upkeep, sacrifice a Snake.\nWhenever Shisato, Whispering Hunter deals combat damage to a player, that player skips their next untap step. diff --git a/forge-gui/res/cardsfolder/s/shivan_emissary.txt b/forge-gui/res/cardsfolder/s/shivan_emissary.txt index a228a609c38..c92ccdf7d86 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 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black 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/shoving_match.txt b/forge-gui/res/cardsfolder/s/shoving_match.txt index 242c86c8b5e..f8d55a03cfa 100644 --- a/forge-gui/res/cardsfolder/s/shoving_match.txt +++ b/forge-gui/res/cardsfolder/s/shoving_match.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Instant A:SP$ AnimateAll | Cost$ 2 U | ValidCards$ Creature | Abilities$ ShovingMatch | SpellDescription$ Until end of turn, all creatures gain "{T}: Tap target creature." SVar:ShovingMatch:AB$ Tap | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shoving_match.jpg Oracle:Until end of turn, all creatures gain "{T}: Tap target creature." diff --git a/forge-gui/res/cardsfolder/s/showstopper.txt b/forge-gui/res/cardsfolder/s/showstopper.txt index 77f324bbbcb..081c8e26aa0 100644 --- a/forge-gui/res/cardsfolder/s/showstopper.txt +++ b/forge-gui/res/cardsfolder/s/showstopper.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ AnimateAll | Cost$ 1 B R | ValidCards$ Creature.YouCtrl | Triggers$ DiesTrigger | sVars$ ShowstopperTrigDamage | References$ DiesTrigger,ShowstopperTrigDamage | SpellDescription$ Until end of turn, creatures you control gain "When this creature dies, it deals 2 damage to target creature an opponent controls." SVar:DiesTrigger:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ ShowstopperTrigDamage | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, it deals 2 damage to target creature an opponent controls. SVar:ShowstopperTrigDamage:DB$ DealDamage | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | NumDmg$ 2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/showstopper.jpg Oracle:Until end of turn, creatures you control gain "When this creature dies, it deals 2 damage to target creature an opponent controls." diff --git a/forge-gui/res/cardsfolder/s/shred_memory.txt b/forge-gui/res/cardsfolder/s/shred_memory.txt index 12428288401..e0e6c3f03b2 100644 --- a/forge-gui/res/cardsfolder/s/shred_memory.txt +++ b/forge-gui/res/cardsfolder/s/shred_memory.txt @@ -3,6 +3,6 @@ ManaCost:1 B Types:Instant A:SP$ ChangeZone | Cost$ 1 B | TargetMin$ 0 | TargetMax$ 4 | TargetsFromSingleZone$ True | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SpellDescription$ Exile up to four target cards from a single graveyard. K:Transmute:1 B B -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shred_memory.jpg Oracle:Exile up to four target cards from a single graveyard.\nTransmute {1}{B}{B} ({1}{B}{B}, Discard this card: Search your library for a card with the same converted mana cost as this card, reveal it, put it into your hand, then shuffle your library. Transmute only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/s/shrewd_negotiation.txt b/forge-gui/res/cardsfolder/s/shrewd_negotiation.txt index 77f3408c3b6..dff9d12c796 100644 --- a/forge-gui/res/cardsfolder/s/shrewd_negotiation.txt +++ b/forge-gui/res/cardsfolder/s/shrewd_negotiation.txt @@ -3,6 +3,6 @@ ManaCost:4 U Types:Sorcery A:SP$ Pump | Cost$ 4 U | ValidTgts$ Artifact.YouCtrl | TgtPrompt$ Choose target artifact you control | SubAbility$ DBExchange | SpellDescription$ Exchange control of target artifact you control and target artifact or creature you don't control. SVar:DBExchange:DB$ ExchangeControl | Defined$ ParentTarget | ValidTgts$ Artifact.YouDontCtrl,Creature.YouDontCtrl | TgtPrompt$ Choose target artifact or creature you don't control -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shrewd_negotiation.jpg Oracle:Exchange control of target artifact you control and target artifact or creature you don't control. diff --git a/forge-gui/res/cardsfolder/s/shrieking_grotesque.txt b/forge-gui/res/cardsfolder/s/shrieking_grotesque.txt index 684544432dd..38dc2df2cc4 100644 --- a/forge-gui/res/cardsfolder/s/shrieking_grotesque.txt +++ b/forge-gui/res/cardsfolder/s/shrieking_grotesque.txt @@ -6,7 +6,7 @@ K:Flying T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigDiscard | ManaSpent$ B | TriggerDescription$ When CARDNAME enters the battlefield, if {B} was spent to cast it, target player discards a card. SVar:TrigDiscard:DB$ Discard | ValidTgts$ Player | TgtPrompt$ Select target player | Mode$ TgtChoose SVar:ManaNeededToAvoidNegativeEffect:black -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black SVar:Picture:http://www.wizards.com/global/images/magic/general/shrieking_grotesque.jpg Oracle:Flying\nWhen Shrieking Grotesque enters the battlefield, if {B} was spent to cast it, target player discards a card. diff --git a/forge-gui/res/cardsfolder/s/shrine_of_boundless_growth.txt b/forge-gui/res/cardsfolder/s/shrine_of_boundless_growth.txt index 067da5a822e..09aa6f28ee2 100644 --- a/forge-gui/res/cardsfolder/s/shrine_of_boundless_growth.txt +++ b/forge-gui/res/cardsfolder/s/shrine_of_boundless_growth.txt @@ -6,6 +6,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E SVar:TrigAddCounter:DB$PutCounter | CounterType$ CHARGE | CounterNum$ 1 A:AB$Mana | Cost$ T Sac<1/CARDNAME> | Produced$ C | Amount$ X | References$ X | SpellDescription$ Add {C} for each charge counter on CARDNAME. SVar:X:Count$CardCounters.CHARGE -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shrine_of_boundless_growth.jpg Oracle:At the beginning of your upkeep or whenever you cast a green spell, put a charge counter on Shrine of Boundless Growth.\n{T}, Sacrifice Shrine of Boundless Growth: Add {C} for each charge counter on Shrine of Boundless Growth. diff --git a/forge-gui/res/cardsfolder/s/shrine_of_limitless_power.txt b/forge-gui/res/cardsfolder/s/shrine_of_limitless_power.txt index d55e4d12f58..b3475d8a8ba 100644 --- a/forge-gui/res/cardsfolder/s/shrine_of_limitless_power.txt +++ b/forge-gui/res/cardsfolder/s/shrine_of_limitless_power.txt @@ -6,6 +6,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E SVar:TrigAddCounter:DB$ PutCounter | CounterType$ CHARGE | CounterNum$ 1 A:AB$ Discard | Cost$ 4 T Sac<1/CARDNAME> | ValidTgts$ Player | TgtPrompt$ Select target player | NumCards$ X | Mode$ TgtChoose | References$ X | SpellDescription$ Target player discards a card for each charge counter on CARDNAME. SVar:X:Sacrificed$CardCounters.CHARGE -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shrine_of_limitless_power.jpg Oracle:At the beginning of your upkeep or whenever you cast a black spell, put a charge counter on Shrine of Limitless Power.\n{4}, {T}, Sacrifice Shrine of Limitless Power: Target player discards a card for each charge counter on Shrine of Limitless Power. diff --git a/forge-gui/res/cardsfolder/s/shrine_of_piercing_vision.txt b/forge-gui/res/cardsfolder/s/shrine_of_piercing_vision.txt index 4efca47f0cf..d033b89c7e9 100644 --- a/forge-gui/res/cardsfolder/s/shrine_of_piercing_vision.txt +++ b/forge-gui/res/cardsfolder/s/shrine_of_piercing_vision.txt @@ -6,6 +6,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E SVar:TrigAddCounter:DB$PutCounter | CounterType$ CHARGE | CounterNum$ 1 A:AB$ Dig | Cost$ T Sac<1/CARDNAME> | DigNum$ X | References$ X | SpellDescription$ Look at the top X cards of your library, where X is the number of charge counters on CARDNAME. Put one of those cards into your hand and the rest on the bottom of your library in any order. SVar:X:Count$CardCounters.CHARGE -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shrine_of_piercing_vision.jpg Oracle:At the beginning of your upkeep or whenever you cast a blue spell, put a charge counter on Shrine of Piercing Vision.\n{T}, Sacrifice Shrine of Piercing Vision: Look at the top X cards of your library, where X is the number of charge counters on Shrine of Piercing Vision. Put one of those cards into your hand and the rest on the bottom of your library in any order. diff --git a/forge-gui/res/cardsfolder/s/shrine_of_the_forsaken_gods.txt b/forge-gui/res/cardsfolder/s/shrine_of_the_forsaken_gods.txt index d0e4b3aaa06..65a83596b18 100644 --- a/forge-gui/res/cardsfolder/s/shrine_of_the_forsaken_gods.txt +++ b/forge-gui/res/cardsfolder/s/shrine_of_the_forsaken_gods.txt @@ -3,7 +3,7 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ T | Produced$ C | Amount$ 2 | IsPresent$ Land.YouCtrl | PresentCompare$ GE7 | RestrictValid$ Card.Colorless | SpellDescription$ Add {C}{C}. Spend this mana only to cast colorless spells. Activate this ability only if you control seven or more lands. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHas:Ability$Mana.Colorless DeckHints:Color$Colorless & Keyword$Devoid SVar:Picture:http://www.wizards.com/global/images/magic/general/shrine_of_the_forsaken_gods.jpg diff --git a/forge-gui/res/cardsfolder/s/shriveling_rot.txt b/forge-gui/res/cardsfolder/s/shriveling_rot.txt index 5a9ca2bf33b..1860b430449 100644 --- a/forge-gui/res/cardsfolder/s/shriveling_rot.txt +++ b/forge-gui/res/cardsfolder/s/shriveling_rot.txt @@ -10,6 +10,6 @@ SVar:SVar1:DB$ Destroy | Defined$ TriggeredTarget SVar:Trig2:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | Execute$ SVar2 | TriggerDescription$ Whenever a creature dies, that creature's controller loses life equal to its toughness. SVar:SVar2:DB$ LoseLife | Defined$ TriggeredCardController | LifeAmount$ X | References$ X SVar:X:TriggeredCard$CardToughness -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shriveling_rot.jpg Oracle:Choose one —\n• Until end of turn, whenever a creature is dealt damage, destroy it.\n• Until end of turn, whenever a creature dies, that creature's controller loses life equal to its toughness.\nEntwine {2}{B} (Choose both if you pay the entwine cost.) diff --git a/forge-gui/res/cardsfolder/s/shrouded_lore.txt b/forge-gui/res/cardsfolder/s/shrouded_lore.txt index 22fbb21faa1..b9e4f323cde 100644 --- a/forge-gui/res/cardsfolder/s/shrouded_lore.txt +++ b/forge-gui/res/cardsfolder/s/shrouded_lore.txt @@ -10,6 +10,6 @@ SVar:DBReset:DB$ StoreSVar | SVar$ CheckNotPaid | Type$ Number | Expression$ 1 | SVar:ChoiceNum:Count$ValidGraveyard Card.YouOwn+IsNotRemembered SVar:CheckNotPaid:Number$1 SVar:CheckRepeat:SVar$ChoiceNum/Times.CheckNotPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shrouded_lore.jpg Oracle:Target opponent chooses a card in your graveyard. You may pay {B}. If you do, repeat this process except that opponent can't choose a card already chosen for Shrouded Lore. Then put the last chosen card into your hand. diff --git a/forge-gui/res/cardsfolder/s/shunt.txt b/forge-gui/res/cardsfolder/s/shunt.txt index 0cc71105c71..6754860cf8a 100644 --- a/forge-gui/res/cardsfolder/s/shunt.txt +++ b/forge-gui/res/cardsfolder/s/shunt.txt @@ -2,6 +2,6 @@ Name:Shunt ManaCost:1 R R Types:Instant A:SP$ ChangeTargets | Cost$ 1 R R | TargetType$ Spell | ValidTgts$ Card | TargetsSingleTarget$ True | SpellDescription$ Change the target of target spell with a single target. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/shunt.jpg Oracle:Change the target of target spell with a single target. diff --git a/forge-gui/res/cardsfolder/s/shuriken.txt b/forge-gui/res/cardsfolder/s/shuriken.txt index 7dd99f69c47..b1215e95126 100644 --- a/forge-gui/res/cardsfolder/s/shuriken.txt +++ b/forge-gui/res/cardsfolder/s/shuriken.txt @@ -6,7 +6,7 @@ S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddAbility$ ShurikenDamage SVar:ShurikenDamage:AB$ DealDamage | Cost$ T Unattach | NumDmg$ 2 | DamageSource$ OriginalHost | RememberCostCards$ True | ValidTgts$ Creature | SubAbility$ ShurikenGainCtrl | SpellDescription$ Shuriken deals 2 damage to target creature. That creature's controller gains control of Shuriken unless it was unattached from a Ninja SVar:ShurikenGainCtrl:DB$ GainControl | NewController$ TargetedController | Defined$ Valid Card.IsRemembered+namedShuriken | ConditionDefined$ Self | ConditionPresent$ Ninja | ConditionCompare$ EQ0 | SubAbility$ ShurikenForget SVar:ShurikenForget:DB$ Pump | ForgetObjects$ Valid Card.IsRemembered+namedShuriken | StackDescription$ None -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingAttachEffect:True DeckHints:Type$Ninja SVar:Picture:http://www.wizards.com/global/images/magic/general/shuriken.jpg diff --git a/forge-gui/res/cardsfolder/s/sickening_dreams.txt b/forge-gui/res/cardsfolder/s/sickening_dreams.txt index 992beca057d..60bb9701287 100644 --- a/forge-gui/res/cardsfolder/s/sickening_dreams.txt +++ b/forge-gui/res/cardsfolder/s/sickening_dreams.txt @@ -3,6 +3,6 @@ ManaCost:1 B Types:Sorcery A:SP$ DamageAll | Cost$ 1 B Discard | NumDmg$ ChosenX | ValidCards$ Creature | ValidPlayers$ Player | ValidDescription$ each creature and each player. | References$ X | SpellDescription$ CARDNAME deals X damage to each creature and each player. SVar:X:XChoice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sickening_dreams.jpg Oracle:As an additional cost to cast Sickening Dreams, discard X cards.\nSickening Dreams deals X damage to each creature and each player. diff --git a/forge-gui/res/cardsfolder/s/sickening_shoal.txt b/forge-gui/res/cardsfolder/s/sickening_shoal.txt index 7bbf96154a9..ed50a626476 100644 --- a/forge-gui/res/cardsfolder/s/sickening_shoal.txt +++ b/forge-gui/res/cardsfolder/s/sickening_shoal.txt @@ -5,6 +5,6 @@ A:SP$ Pump | Cost$ X B B | ValidTgts$ Creature | TgtPrompt$ Select target creatu A:SP$ Pump | Cost$ ExileFromHand<1/Card.Black> | CostDesc$ You may exile a black card from your hand rather than pay Sickening Shoal's mana cost. | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -Y | NumDef$ -Y | IsCurse$ True | References$ Y | SpellDescription$ Target creature gets -X/-X until end of turn, where X is the exiled card's converted mana cost. SVar:X:Count$xPaid SVar:Y:Exiled$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sickening_shoal.jpg Oracle:You may exile a black card with converted mana cost X from your hand rather than pay Sickening Shoal's mana cost.\nTarget creature gets -X/-X until end of turn. diff --git a/forge-gui/res/cardsfolder/s/sideswipe.txt b/forge-gui/res/cardsfolder/s/sideswipe.txt index 941fe9ba44f..3ed934bd4fe 100644 --- a/forge-gui/res/cardsfolder/s/sideswipe.txt +++ b/forge-gui/res/cardsfolder/s/sideswipe.txt @@ -2,7 +2,7 @@ Name:Sideswipe ManaCost:1 R Types:Instant A:SP$ ChangeTargets | Cost$ 1 R | TargetType$ Spell | Optional$ True | ValidTgts$ Card.Arcane | SpellDescription$ You may change any targets of target Arcane spell. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sideswipe.jpg Oracle:You may change any targets of target Arcane spell. diff --git a/forge-gui/res/cardsfolder/s/sight_of_the_scalelords.txt b/forge-gui/res/cardsfolder/s/sight_of_the_scalelords.txt index d3d93cec2fb..1142afa3b94 100644 --- a/forge-gui/res/cardsfolder/s/sight_of_the_scalelords.txt +++ b/forge-gui/res/cardsfolder/s/sight_of_the_scalelords.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of combat on your turn, creatures you control with toughness 4 or greater get +2/+2 and gain vigilance until end of turn. SVar:TrigPump:DB$ PumpAll | ValidCards$ Creature.YouCtrl+toughnessGE4 | KW$ Vigilance | NumAtt$ +2 | NumDef$ +2 SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sight_of_the_scalelords.jpg Oracle:At the beginning of combat on your turn, creatures you control with toughness 4 or greater get +2/+2 and gain vigilance until end of turn. diff --git a/forge-gui/res/cardsfolder/s/sigil_tracer.txt b/forge-gui/res/cardsfolder/s/sigil_tracer.txt index 900b15b68b1..5cc76b81d14 100644 --- a/forge-gui/res/cardsfolder/s/sigil_tracer.txt +++ b/forge-gui/res/cardsfolder/s/sigil_tracer.txt @@ -3,6 +3,6 @@ ManaCost:1 U U Types:Creature Merfolk Wizard PT:2/2 A:AB$CopySpellAbility | Cost$ 1 U tapXType<2/Wizard> | ValidTgts$ Instant,Sorcery | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sigil_tracer.jpg Oracle:{1}{U}, Tap two untapped Wizards you control: Copy target instant or sorcery spell. You may choose new targets for the copy. diff --git a/forge-gui/res/cardsfolder/s/signal_the_clans.txt b/forge-gui/res/cardsfolder/s/signal_the_clans.txt index d12bfd6343f..65248f65a9f 100644 --- a/forge-gui/res/cardsfolder/s/signal_the_clans.txt +++ b/forge-gui/res/cardsfolder/s/signal_the_clans.txt @@ -7,6 +7,6 @@ SVar:DBChange:DB$ ChangeZone | Origin$ Library | Destination$ Hand | Defined$ Ch SVar:DBShuffle:DB$ Shuffle | Defined$ You | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$DifferentCardNames_Creature.IsRemembered -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/signal_the_clans.jpg Oracle:Search your library for three creature cards and reveal them. If you reveal three cards with different names, choose one of them at random and put that card into your hand. Shuffle the rest into your library. diff --git a/forge-gui/res/cardsfolder/s/silent_assassin.txt b/forge-gui/res/cardsfolder/s/silent_assassin.txt index 67be20be83d..8e99bf1d952 100644 --- a/forge-gui/res/cardsfolder/s/silent_assassin.txt +++ b/forge-gui/res/cardsfolder/s/silent_assassin.txt @@ -5,6 +5,6 @@ PT:2/1 A:AB$ Effect | Cost$ 3 B | ValidTgts$ Creature.blocking | Name$ Assassin Tracking Effect | TgtPrompt$ Select target blocking creature | IsCurse$ True | RememberObjects$ Targeted | Triggers$ DelTrig | SVars$ TrigDestroy | References$ DelTrig,TrigDestroy | SpellDescription$ Destroy target blocking creature at end of combat. SVar:DelTrig:Mode$ Phase | Phase$ EndCombat | Execute$ TrigDestroy | TriggerDescription$ Destroy the blocking creature at end of combat. SVar:TrigDestroy:DB$ Destroy | Defined$ Remembered | SpellDescription$ Destroy the blocking creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/silent_assassin.jpg Oracle:{3}{B}: Destroy target blocking creature at end of combat. diff --git a/forge-gui/res/cardsfolder/s/silent_gravestone.txt b/forge-gui/res/cardsfolder/s/silent_gravestone.txt index 49176235266..c6859dfcba1 100644 --- a/forge-gui/res/cardsfolder/s/silent_gravestone.txt +++ b/forge-gui/res/cardsfolder/s/silent_gravestone.txt @@ -7,6 +7,6 @@ SVar:DBChangeZoneAll:DB$ ChangeZoneAll | Origin$ Graveyard | Destination$ Exile SVar:DBDraw:DB$Draw | NumCards$ 1 //It probably doesn't matter whether graveyards are exiled simultaneously with Silent Gravestone, but nevertheless, is there a way to do it? SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/silent_gravestone.jpg Oracle:Cards in graveyards can't be the targets of spells or abilities.\n{4}, {T}: Exile Silent Gravestone and all cards from all graveyards. Draw a card. diff --git a/forge-gui/res/cardsfolder/s/silumgar_monument.txt b/forge-gui/res/cardsfolder/s/silumgar_monument.txt index 72464e58196..56871a54555 100644 --- a/forge-gui/res/cardsfolder/s/silumgar_monument.txt +++ b/forge-gui/res/cardsfolder/s/silumgar_monument.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. A:AB$ Animate | Cost$ 4 U B | Defined$ Self | Power$ 4 | Toughness$ 4 | Types$ Artifact,Creature,Dragon | Colors$ Blue,Black | Keywords$ Flying | SpellDescription$ CARDNAME becomes a 4/4 blue and black Dragon artifact creature with flying until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Blue|Black SVar:Picture:http://www.wizards.com/global/images/magic/general/silumgar_monument.jpg Oracle:{T}: Add {U} or {B}.\n{4}{U}{B}: Silumgar Monument becomes a 4/4 blue and black Dragon artifact creature with flying until end of turn. diff --git a/forge-gui/res/cardsfolder/s/silumgar_sorcerer.txt b/forge-gui/res/cardsfolder/s/silumgar_sorcerer.txt index 7a8c91a3072..46cf8e1410b 100644 --- a/forge-gui/res/cardsfolder/s/silumgar_sorcerer.txt +++ b/forge-gui/res/cardsfolder/s/silumgar_sorcerer.txt @@ -7,6 +7,6 @@ K:Flying K:Exploit T:Mode$ Exploited | ValidCard$ Creature | ValidSource$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigCounter | TriggerDescription$ When CARDNAME exploits a creature, counter target creature spell. SVar:TrigCounter:DB$ Counter | TargetType$ Spell | ValidTgts$ Creature | TgtPrompt$ Select target creature spell -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/silumgar_sorcerer.jpg Oracle:Flash (You may cast this spell any time you could cast an instant.)\nFlying\nExploit (When this creature enters the battlefield, you may sacrifice a creature.)\nWhen Silumgar Sorcerer exploits a creature, counter target creature spell. diff --git a/forge-gui/res/cardsfolder/s/silver_wyvern.txt b/forge-gui/res/cardsfolder/s/silver_wyvern.txt index 3ab2bdc5b88..4e68e1ccfc5 100644 --- a/forge-gui/res/cardsfolder/s/silver_wyvern.txt +++ b/forge-gui/res/cardsfolder/s/silver_wyvern.txt @@ -4,6 +4,6 @@ Types:Creature Drake PT:4/3 K:Flying A:AB$ ChangeTargets | Cost$ U | TargetType$ Spell,Activated,Triggered | ValidTgts$ Card | TargetValidTargeting$ Card.Self | TargetsSingleTarget$ True | TargetRestriction$ Creature | SpellDescription$ Change the target of target spell or ability that targets only CARDNAME. The new target must be a creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/silver_wyvern.jpg Oracle:Flying\n{U}: Change the target of target spell or ability that targets only Silver Wyvern. The new target must be a creature. diff --git a/forge-gui/res/cardsfolder/s/silverglade_pathfinder.txt b/forge-gui/res/cardsfolder/s/silverglade_pathfinder.txt index 5c042713cd9..d498dc575e0 100644 --- a/forge-gui/res/cardsfolder/s/silverglade_pathfinder.txt +++ b/forge-gui/res/cardsfolder/s/silverglade_pathfinder.txt @@ -3,6 +3,6 @@ ManaCost:1 G Types:Creature Dryad Spellshaper PT:1/1 A:AB$ ChangeZone | Cost$ 1 G T Discard<1/Card> | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | ChangeNum$ 1 | Tapped$ True | SpellDescription$ Search your library for a basic land card and put that card onto the battlefield tapped. Then shuffle your library. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/silverglade_pathfinder.jpg Oracle:{1}{G}, {T}, Discard a card: Search your library for a basic land card and put that card onto the battlefield tapped. Then shuffle your library. diff --git a/forge-gui/res/cardsfolder/s/simic_basilisk.txt b/forge-gui/res/cardsfolder/s/simic_basilisk.txt index 5dbee01c8ed..026296c3d32 100644 --- a/forge-gui/res/cardsfolder/s/simic_basilisk.txt +++ b/forge-gui/res/cardsfolder/s/simic_basilisk.txt @@ -10,6 +10,6 @@ SVar:TrigDestroySimic:DB$Destroy | Defined$ DelayTriggerRemembered DeckNeeds:Ability$Counters DeckHas:Ability$Counters SVar:AIGraftPreference:DontMoveCounterIfLethal -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/simic_basilisk.jpg Oracle:Graft 3 (This creature enters the battlefield with three +1/+1 counters on it. Whenever another creature enters the battlefield, you may move a +1/+1 counter from this creature onto it.)\n{1}{G}: Until end of turn, target creature with a +1/+1 counter on it gains "Whenever this creature deals combat damage to a creature, destroy that creature at end of combat." diff --git a/forge-gui/res/cardsfolder/s/simic_cluestone.txt b/forge-gui/res/cardsfolder/s/simic_cluestone.txt index 9cc3ab73d43..56be0a17b37 100644 --- a/forge-gui/res/cardsfolder/s/simic_cluestone.txt +++ b/forge-gui/res/cardsfolder/s/simic_cluestone.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Draw | Cost$ G U T Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Green|Blue SVar:Picture:http://www.wizards.com/global/images/magic/general/simic_cluestone.jpg Oracle:{T}: Add {G} or {U}.\n{G}{U}, {T}, Sacrifice Simic Cluestone: Draw a card. diff --git a/forge-gui/res/cardsfolder/s/simic_guildmage.txt b/forge-gui/res/cardsfolder/s/simic_guildmage.txt index 4b1603f2c2c..79123e586f3 100644 --- a/forge-gui/res/cardsfolder/s/simic_guildmage.txt +++ b/forge-gui/res/cardsfolder/s/simic_guildmage.txt @@ -8,6 +8,6 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True A:AB$ Pump| Cost$ 1 U | ValidTgts$ Aura.AttachedTo Permanent | TgtPrompt$ Select target aura to move | RememberObjects$ Valid Permanent.EnchantedBy Targeted | SubAbility$ ChooseNewHost | StackDescription$ None | SpellDescription$ Attach target Aura attached to a permanent to another permanent with the same controller. SVar:ChooseNewHost:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Permanent.NotEnchantedByTargeted+sharesControllerWith Remembered+CanBeEnchantedByTargeted | ChoiceZone$ Battlefield | SubAbility$ DBAttach | AILogic$ AtLeast1 SVar:DBAttach:DB$ Attach | Object$ ParentTarget | Defined$ ChosenCard | SubAbility$ DBCleanup -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/simic_guildmage.jpg Oracle:({G/U} can be paid with either {G} or {U}.)\n{1}{G}: Move a +1/+1 counter from target creature onto another target creature with the same controller.\n{1}{U}: Attach target Aura attached to a permanent to another permanent with the same controller. diff --git a/forge-gui/res/cardsfolder/s/simic_keyrune.txt b/forge-gui/res/cardsfolder/s/simic_keyrune.txt index fea5442a279..a5da04530b0 100644 --- a/forge-gui/res/cardsfolder/s/simic_keyrune.txt +++ b/forge-gui/res/cardsfolder/s/simic_keyrune.txt @@ -4,7 +4,7 @@ Types:Artifact A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Animate | Cost$ G U | Defined$ Self | Power$ 2 | Toughness$ 3 | Types$ Artifact,Creature,Crab | Colors$ Green,Blue | Keywords$ Hexproof | SpellDescription$ CARDNAME becomes a 2/3 green and blue Crab artifact creature with hexproof until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Green|Blue SVar:Picture:http://www.wizards.com/global/images/magic/general/simic_keyrune.jpg Oracle:{T}: Add {G} or {U}.\n{G}{U}: Simic Keyrune becomes a 2/3 green and blue Crab artifact creature with hexproof until end of turn. (It can't be the target of spells or abilities your opponents control.) diff --git a/forge-gui/res/cardsfolder/s/simic_manipulator.txt b/forge-gui/res/cardsfolder/s/simic_manipulator.txt index e6698bb1c55..4d12bfd72ea 100644 --- a/forge-gui/res/cardsfolder/s/simic_manipulator.txt +++ b/forge-gui/res/cardsfolder/s/simic_manipulator.txt @@ -5,7 +5,7 @@ PT:0/1 K:Evolve A:AB$ GainControl | Announce$ X | XCantBe0$ True | Cost$ T SubCounter | ValidTgts$ Creature.powerLEX | TgtPrompt$ Select target with power less than or equal to the number of +1/+1 counters removed this way | SpellDescription$ Gain control of target creature with power less than or equal to the number of +1/+1 counters removed this way. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHas:Ability$Counters DeckHints:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/simic_manipulator.jpg diff --git a/forge-gui/res/cardsfolder/s/simic_signet.txt b/forge-gui/res/cardsfolder/s/simic_signet.txt index 1df7b22bc07..1a5255dbeb4 100644 --- a/forge-gui/res/cardsfolder/s/simic_signet.txt +++ b/forge-gui/res/cardsfolder/s/simic_signet.txt @@ -2,6 +2,6 @@ Name:Simic Signet ManaCost:2 Types:Artifact A:AB$ Mana | Cost$ 1 T | Produced$ G U | SpellDescription$ Add {G}{U}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/simic_signet.jpg Oracle:{1}, {T}: Add {G}{U}. diff --git a/forge-gui/res/cardsfolder/s/simplify.txt b/forge-gui/res/cardsfolder/s/simplify.txt index 00aa24c065c..810e5dfe57b 100644 --- a/forge-gui/res/cardsfolder/s/simplify.txt +++ b/forge-gui/res/cardsfolder/s/simplify.txt @@ -2,6 +2,6 @@ Name:Simplify ManaCost:G Types:Sorcery A:SP$ Sacrifice | Cost$ G | SacValid$ Enchantment | Defined$ Player | SpellDescription$ Each player sacrifices an enchantment. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/simplify.jpg Oracle:Each player sacrifices an enchantment. diff --git a/forge-gui/res/cardsfolder/s/simulacrum.txt b/forge-gui/res/cardsfolder/s/simulacrum.txt index 542a6c588fc..15d859a3d8a 100644 --- a/forge-gui/res/cardsfolder/s/simulacrum.txt +++ b/forge-gui/res/cardsfolder/s/simulacrum.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ GainLife | Cost$ 1 B | Defined$ You | LifeAmount$ X | SubAbility$ Dmg | References$ X | SpellDescription$ You gain life equal to the damage dealt to you this turn. CARDNAME deals damage to target creature you control equal to the damage dealt to you this turn. SVar:Dmg:DB$ DealDamage | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | NumDmg$ X | References$ X SVar:X:Count$YourDamageThisTurn -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/simulacrum.jpg Oracle:You gain life equal to the damage dealt to you this turn. Simulacrum deals damage to target creature you control equal to the damage dealt to you this turn. diff --git a/forge-gui/res/cardsfolder/s/singing_tree.txt b/forge-gui/res/cardsfolder/s/singing_tree.txt index f070d150a02..a62a82b618e 100644 --- a/forge-gui/res/cardsfolder/s/singing_tree.txt +++ b/forge-gui/res/cardsfolder/s/singing_tree.txt @@ -3,6 +3,6 @@ ManaCost:3 G Types:Creature Plant PT:0/3 A:AB$ Animate | Cost$ T | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | Power$ 0 | SpellDescription$ Target attacking creature has base power 0 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/singing_tree.jpg Oracle:{T}: Target attacking creature has base power 0 until end of turn. diff --git a/forge-gui/res/cardsfolder/s/sink_into_takenuma.txt b/forge-gui/res/cardsfolder/s/sink_into_takenuma.txt index d31121a677a..6b31db825ce 100644 --- a/forge-gui/res/cardsfolder/s/sink_into_takenuma.txt +++ b/forge-gui/res/cardsfolder/s/sink_into_takenuma.txt @@ -5,6 +5,6 @@ A:SP$ ChangeZone | Cost$ 3 B | Origin$ Battlefield | Destination$ Hand | ChangeT SVar:DBDiscard:DB$ Discard | ValidTgts$ Player | TgtPrompt$ Select target player | NumCards$ Y | Mode$ TgtChoose | References$ Y SVar:X:Count$Valid Swamp.YouCtrl SVar:Y:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sink_into_takenuma.jpg Oracle:Sweep — Return any number of Swamps you control to their owner's hand. Target player discards a card for each Swamp returned this way. diff --git a/forge-gui/res/cardsfolder/s/sins_of_the_past.txt b/forge-gui/res/cardsfolder/s/sins_of_the_past.txt index 93b612744a4..d87638ac5b0 100644 --- a/forge-gui/res/cardsfolder/s/sins_of_the_past.txt +++ b/forge-gui/res/cardsfolder/s/sins_of_the_past.txt @@ -7,6 +7,6 @@ SVar:DBEffect:DB$ Effect | RememberObjects$ Targeted | ExileOnMoved$ Stack | Rep SVar:ReplaceGraveyard:Event$ Moved | ValidCard$ Card.IsRemembered | Origin$ Stack | Destination$ Graveyard | ReplaceWith$ MoveExile | Description$ If that card would be put into your graveyard this turn, exile it instead. SVar:MoveExile:DB$ ChangeZone | Defined$ ReplacedCard | Origin$ Stack | Destination$ Exile SVar:DBChange:DB$ChangeZone | Origin$ Stack | Destination$ Exile -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sins_of_the_past.jpg Oracle:Until end of turn, you may cast target instant or sorcery card from your graveyard without paying its mana cost. If that card would be put into your graveyard this turn, exile it instead. Exile Sins of the Past. diff --git a/forge-gui/res/cardsfolder/s/sire_of_the_storm.txt b/forge-gui/res/cardsfolder/s/sire_of_the_storm.txt index 618032615aa..150e40e0f76 100644 --- a/forge-gui/res/cardsfolder/s/sire_of_the_storm.txt +++ b/forge-gui/res/cardsfolder/s/sire_of_the_storm.txt @@ -5,7 +5,7 @@ PT:3/3 K:Flying T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | Execute$ TrigDraw | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, you may draw a card. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/sire_of_the_storm.jpg Oracle:Flying\nWhenever you cast a Spirit or Arcane spell, you may draw a card. diff --git a/forge-gui/res/cardsfolder/s/siren_song_lyre.txt b/forge-gui/res/cardsfolder/s/siren_song_lyre.txt index b15b2beb23e..6e5ae931aa4 100644 --- a/forge-gui/res/cardsfolder/s/siren_song_lyre.txt +++ b/forge-gui/res/cardsfolder/s/siren_song_lyre.txt @@ -4,6 +4,6 @@ Types:Artifact Equipment K:Equip:2 S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddAbility$ SirenSongTap | Description$ Equipped creature has "2, {T}: Tap target creature." SVar:SirenSongTap:AB$ Tap | Cost$ 2 T | ValidTgts$ Creature | SpellDescription$ Tap target creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/siren_song_lyre.jpg Oracle:Equipped creature has "{2}, {T}: Tap target creature."\nEquip {2} diff --git a/forge-gui/res/cardsfolder/s/sirens_call.txt b/forge-gui/res/cardsfolder/s/sirens_call.txt index fe5f54aa90c..99c7830d460 100644 --- a/forge-gui/res/cardsfolder/s/sirens_call.txt +++ b/forge-gui/res/cardsfolder/s/sirens_call.txt @@ -6,7 +6,7 @@ SVar:KWPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | SVar:DestroyPacifist:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigDestroy | TriggerDescription$ At the beginning of the next end step, destroy all non-Wall creatures that player controls that didn't attack this turn. SVar:TrigDestroy:DB$ DestroyAll | ValidCards$ Creature.ActivePlayerCtrl+notAttackedThisTurn+nonWall+notFirstTurnControlled | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sirens_call.jpg Oracle:Cast Siren's Call only during an opponent's turn, before attackers are declared.\nCreatures the active player controls attack this turn if able.\nAt the beginning of the next end step, destroy all non-Wall creatures that player controls that didn't attack this turn. Ignore this effect for each creature the player didn't control continuously since the beginning of the turn. diff --git a/forge-gui/res/cardsfolder/s/sirens_ruse.txt b/forge-gui/res/cardsfolder/s/sirens_ruse.txt index 4b778ab8786..059b48703b5 100644 --- a/forge-gui/res/cardsfolder/s/sirens_ruse.txt +++ b/forge-gui/res/cardsfolder/s/sirens_ruse.txt @@ -9,6 +9,6 @@ SVar:DBPirateDraw:DB$ Draw | NumCards$ 1 | ConditionCheckSVar$ WasPirate | Condi SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBReinitialize SVar:DBReinitialize:DB$ StoreSVar | SVar$ WasPirate | Type$ Number | Expression$ 0 | References$ WasPirate SVar:WasPirate:Number$0 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sirens_ruse.jpg Oracle:Exile target creature you control, then return that card to the battlefield under your control. If a Pirate was exiled this way, draw a card. diff --git a/forge-gui/res/cardsfolder/s/sirocco.txt b/forge-gui/res/cardsfolder/s/sirocco.txt index 741abcdb73e..e482e722de2 100644 --- a/forge-gui/res/cardsfolder/s/sirocco.txt +++ b/forge-gui/res/cardsfolder/s/sirocco.txt @@ -5,6 +5,6 @@ A:SP$ RevealHand | Cost$ 1 R | RememberRevealed$ True | ValidTgts$ Player | TgtP SVar:DBRepeatDiscard:DB$ RepeatEach | UseImprinted$ True | RepeatCards$ Card.IsRemembered+Instant+Blue | Zone$ Hand | RepeatSubAbility$ DBDiscard | SubAbility$ DBCleanup SVar:DBDiscard:DB$ Discard | DefinedCards$ Imprinted | Mode$ Defined | UnlessCost$ PayLife<4> | UnlessPayer$ Targeted | StackDescription$ Discard {c:Imprinted} SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sirocco.jpg Oracle:Target player reveals their hand. For each blue instant card revealed this way, that player discards that card unless they pay 4 life. diff --git a/forge-gui/res/cardsfolder/s/sisay.txt b/forge-gui/res/cardsfolder/s/sisay.txt index 0392ed28b43..cb53c690a27 100644 --- a/forge-gui/res/cardsfolder/s/sisay.txt +++ b/forge-gui/res/cardsfolder/s/sisay.txt @@ -4,6 +4,6 @@ Types:Vanguard HandLifeModifier:-2/-3 T:Mode$ TapsForMana | TriggerZones$ Command | ValidCard$ Land.YouCtrl | Execute$ TrigMana | Static$ True | TriggerDescription$ Whenever you tap a land for mana, add one mana of any type that land produced. SVar:TrigMana:DB$ ManaReflected | ColorOrType$ Type | Valid$ Defined.Triggered | ReflectProperty$ Produced | Defined$ TriggeredPlayer -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:https://downloads.cardforge.org/images/cards/VAN/Sisay.full.jpg Oracle:Hand -2, life -3\nWhenever you tap a land for mana, add one mana of any type that land produced. diff --git a/forge-gui/res/cardsfolder/s/sisays_ingenuity.txt b/forge-gui/res/cardsfolder/s/sisays_ingenuity.txt index 6122261f50f..a149226791e 100644 --- a/forge-gui/res/cardsfolder/s/sisays_ingenuity.txt +++ b/forge-gui/res/cardsfolder/s/sisays_ingenuity.txt @@ -8,7 +8,7 @@ SVar:TrigDraw:DB$ Draw | NumCards$ 1 S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddAbility$ ABChooseColor | AddSVar$ DBAnimate | Description$ Enchanted creature has "{2}{U}: Target creature becomes the color of your choice until end of turn." SVar:ABChooseColor:AB$ ChooseColor | Cost$ 2 U | Defined$ You | SubAbility$ DBAnimate | SpellDescription$ Target creature becomes the color of your choice until end of turn. SVar:DBAnimate:DB$ Animate | ValidTgts$ Creature | TgtPrompt$ Select target creature | Colors$ ChosenColor | OverwriteColors$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingAttachEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/sisays_ingenuity.jpg Oracle:Enchant creature\nWhen Sisay's Ingenuity enters the battlefield, draw a card.\nEnchanted creature has "{2}{U}: Target creature becomes the color of your choice until end of turn." diff --git a/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt b/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt index caee30ec586..aec478cc53a 100644 --- a/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt +++ b/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt @@ -9,7 +9,7 @@ T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCar SVar:DBForget:DB$ Pump | ForgetImprinted$ TriggeredCard T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Any | Execute$ DBCleanup | Static$ True | Secondary$ True | TriggerDescription$ Forget all remembered cards. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sisters_of_stone_death.jpg Oracle:{G}: Target creature blocks Sisters of Stone Death this turn if able.\n{B}{G}: Exile target creature blocking or blocked by Sisters of Stone Death.\n{2}{B}: Put a creature card exiled with Sisters of Stone Death onto the battlefield under your control. diff --git a/forge-gui/res/cardsfolder/s/sivvis_ruse.txt b/forge-gui/res/cardsfolder/s/sivvis_ruse.txt index 2082be2dc08..469a657da53 100644 --- a/forge-gui/res/cardsfolder/s/sivvis_ruse.txt +++ b/forge-gui/res/cardsfolder/s/sivvis_ruse.txt @@ -6,6 +6,6 @@ A:SP$ Effect | Cost$ 2 W W | Name$ Sivvi's Ruse Effect | ReplacementEffects$ RPr 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 +AI:RemoveDeck:All 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. diff --git a/forge-gui/res/cardsfolder/s/sivvis_valor.txt b/forge-gui/res/cardsfolder/s/sivvis_valor.txt index 0d5b908faa0..a939d504722 100644 --- a/forge-gui/res/cardsfolder/s/sivvis_valor.txt +++ b/forge-gui/res/cardsfolder/s/sivvis_valor.txt @@ -7,6 +7,6 @@ SVar:SelflessDamage:Event$ DamageDone | ValidTarget$ Card.IsRemembered | Replace SVar:SelflessDmg:DB$ ReplaceEffect | VarName$ Affected | VarValue$ You | VarType$ Player SVar:OutOfSight:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Creature.IsRemembered | Execute$ ExileEffect | Static$ True SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile | Static$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sivvis_valor.jpg Oracle:If you control a Plains, you may tap an untapped creature you control rather than pay Sivvi's Valor's mana cost.\nAll damage that would be dealt to target creature this turn is dealt to you instead. diff --git a/forge-gui/res/cardsfolder/s/skeletal_scrying.txt b/forge-gui/res/cardsfolder/s/skeletal_scrying.txt index ec5eb745b68..4d3bdeb51ef 100644 --- a/forge-gui/res/cardsfolder/s/skeletal_scrying.txt +++ b/forge-gui/res/cardsfolder/s/skeletal_scrying.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Draw | Cost$ X B ExileFromGrave | NumCards$ X | SubAbility$ DBLoseLife | References$ X | SpellDescription$ You draw X cards and you lose X life. SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ X | References$ X SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/skeletal_scrying.jpg Oracle:As an additional cost to cast Skeletal Scrying, exile X cards from your graveyard.\nYou draw X cards and you lose X life. diff --git a/forge-gui/res/cardsfolder/s/skeleton_shard.txt b/forge-gui/res/cardsfolder/s/skeleton_shard.txt index cda3ff77ef1..61136dfa53b 100644 --- a/forge-gui/res/cardsfolder/s/skeleton_shard.txt +++ b/forge-gui/res/cardsfolder/s/skeleton_shard.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact A:AB$ ChangeZone | Cost$ 3 T | ValidTgts$ Creature.Artifact+YouCtrl | TgtPrompt$ Choose target artifact creature card in your graveyard | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target artifact creature card from your graveyard to your hand. A:AB$ ChangeZone | Cost$ B T | ValidTgts$ Creature.Artifact+YouCtrl | TgtPrompt$ Choose target artifact creature card in your graveyard | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target artifact creature card from your graveyard to your hand. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/skeleton_shard.jpg Oracle:{3}, {T} or {B}, {T}: Return target artifact creature card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/s/skinshifter.txt b/forge-gui/res/cardsfolder/s/skinshifter.txt index ff586005ec0..fddd8fa0be3 100644 --- a/forge-gui/res/cardsfolder/s/skinshifter.txt +++ b/forge-gui/res/cardsfolder/s/skinshifter.txt @@ -6,6 +6,6 @@ A:AB$ Charm | Cost$ G | Choices$ DBRhino,DBBird,DBPlant | CharmNum$ 1 | Activati SVar:DBRhino:DB$Animate | Defined$ Self | Power$ 4 | Toughness$ 4 | Types$ Rhino | RemoveCreatureTypes$ True | Keywords$ Trample | SpellDescription$ Until end of turn, CARDNAME becomes a Rhino with base power and toughness 4/4 and gains trample. Activate this ability only once each turn. SVar:DBBird:DB$Animate | Defined$ Self | Power$ 2 | Toughness$ 2 | Types$ Bird | RemoveCreatureTypes$ True | Keywords$ Flying | SpellDescription$ Until end of turn, CARDNAME becomes a Bird with base power and toughness 2/2 and gains flying. Activate this ability only once each turn. SVar:DBPlant:DB$Animate | Defined$ Self | Power$ 0 | Toughness$ 8 | Types$ Plant | RemoveCreatureTypes$ True | SpellDescription$ Until end of turn, CARDNAME becomes a Plant with base power and toughness 0/8. Activate this ability only once each turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/skinshifter.jpg Oracle:{G}: Choose one —\n• Until end of turn, Skinshifter becomes a Rhino with base power and toughness 4/4 and gains trample. Activate this ability only once each turn.\n• Until end of turn, Skinshifter becomes a Bird with base power and toughness 2/2 and gains flying. Activate this ability only once each turn.\n• Until end of turn, Skinshifter becomes a Plant with base power and toughness 0/8. Activate this ability only once each turn. diff --git a/forge-gui/res/cardsfolder/s/skirge_familiar.txt b/forge-gui/res/cardsfolder/s/skirge_familiar.txt index fc8e195f62a..5f95908d389 100644 --- a/forge-gui/res/cardsfolder/s/skirge_familiar.txt +++ b/forge-gui/res/cardsfolder/s/skirge_familiar.txt @@ -4,6 +4,6 @@ Types:Creature Imp PT:3/2 K:Flying A:AB$ Mana | Cost$ Discard<1/Card> | Produced$ B | SpellDescription$ Add {B}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/skirge_familiar.jpg Oracle:Flying\nDiscard a card: Add {B}. diff --git a/forge-gui/res/cardsfolder/s/skirk_alarmist.txt b/forge-gui/res/cardsfolder/s/skirk_alarmist.txt index d6238ce4291..7a6ccda105f 100644 --- a/forge-gui/res/cardsfolder/s/skirk_alarmist.txt +++ b/forge-gui/res/cardsfolder/s/skirk_alarmist.txt @@ -7,6 +7,6 @@ A:AB$ SetState | Cost$ T | ValidTgts$ Creature.YouCtrl+faceDown | Mode$ TurnFace SVar:DBDelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigSac | RememberObjects$ Targeted | TriggerDescription$ At the beginning of the next end step, sacrifice it. | SubAbility$ DBCleanup SVar:TrigSac:DB$ SacrificeAll | Defined$ DelayTriggerRemembered SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/skirk_alarmist.jpg Oracle:Haste\n{T}: Turn target face-down creature you control face up. At the beginning of the next end step, sacrifice it. diff --git a/forge-gui/res/cardsfolder/s/skirk_fire_marshal.txt b/forge-gui/res/cardsfolder/s/skirk_fire_marshal.txt index 1df962fa9fe..b54740233fc 100644 --- a/forge-gui/res/cardsfolder/s/skirk_fire_marshal.txt +++ b/forge-gui/res/cardsfolder/s/skirk_fire_marshal.txt @@ -4,6 +4,6 @@ Types:Creature Goblin PT:2/2 A:AB$ DamageAll | Cost$ tapXType<5/Goblin> | ValidCards$ Creature | ValidPlayers$ Player | NumDmg$ 10 | ValidDescription$ each creature and each player. | SpellDescription$ CARDNAME deals 10 damage to each creature and each player. K:Protection from red -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/skirk_fire_marshal.jpg Oracle:Protection from red\nTap five untapped Goblins you control: Skirk Fire Marshal deals 10 damage to each creature and each player. diff --git a/forge-gui/res/cardsfolder/s/skirk_outrider.txt b/forge-gui/res/cardsfolder/s/skirk_outrider.txt index 21dd5da1dae..e6ef558b4f1 100644 --- a/forge-gui/res/cardsfolder/s/skirk_outrider.txt +++ b/forge-gui/res/cardsfolder/s/skirk_outrider.txt @@ -4,7 +4,7 @@ Types:Creature Goblin PT:2/2 S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Trample | CheckSVar$ X | SVarCompare$ GE1 | Description$ As long as you control a Beast, CARDNAME gets +2/+2 and has trample. SVar:X:Count$Valid Beast.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:BuffedBy:Beast SVar:Picture:http://www.wizards.com/global/images/magic/general/skirk_outrider.jpg Oracle:As long as you control a Beast, Skirk Outrider gets +2/+2 and has trample. diff --git a/forge-gui/res/cardsfolder/s/skirk_volcanist.txt b/forge-gui/res/cardsfolder/s/skirk_volcanist.txt index 585495cace3..9a5041e2560 100644 --- a/forge-gui/res/cardsfolder/s/skirk_volcanist.txt +++ b/forge-gui/res/cardsfolder/s/skirk_volcanist.txt @@ -5,6 +5,6 @@ PT:3/1 K:Morph:Sac<2/Mountain> T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME is turned face up, it deals 3 damage divided as you choose among one, two, or three target creatures. SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature to distribute damage to | NumDmg$ 3 | TargetMin$ 1 | TargetMax$ 3 | DividedAsYouChoose$ 3 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/skirk_volcanist.jpg Oracle:Morph—Sacrifice two Mountains. (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.)\nWhen Skirk Volcanist is turned face up, it deals 3 damage divided as you choose among one, two, or three target creatures. diff --git a/forge-gui/res/cardsfolder/s/skirsdag_flayer.txt b/forge-gui/res/cardsfolder/s/skirsdag_flayer.txt index da37b9eae73..135ac324a40 100644 --- a/forge-gui/res/cardsfolder/s/skirsdag_flayer.txt +++ b/forge-gui/res/cardsfolder/s/skirsdag_flayer.txt @@ -3,6 +3,6 @@ ManaCost:1 B Types:Creature Human Cleric PT:1/1 A:AB$ Destroy | Cost$ 3 B T Sac<1/Human> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Destroy target creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/skirsdag_flayer.jpg Oracle:{3}{B}, {T}, Sacrifice a Human: Destroy target creature. diff --git a/forge-gui/res/cardsfolder/s/skittering_horror.txt b/forge-gui/res/cardsfolder/s/skittering_horror.txt index 8945df6004b..d560569573e 100644 --- a/forge-gui/res/cardsfolder/s/skittering_horror.txt +++ b/forge-gui/res/cardsfolder/s/skittering_horror.txt @@ -4,6 +4,6 @@ Types:Creature Horror PT:4/3 T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ When you cast a creature spell, sacrifice CARDNAME. SVar:TrigSac:DB$ Sacrifice | Defined$ Self -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/skittering_horror.jpg Oracle:When you cast a creature spell, sacrifice Skittering Horror. diff --git a/forge-gui/res/cardsfolder/s/skittering_monstrosity.txt b/forge-gui/res/cardsfolder/s/skittering_monstrosity.txt index 64387914d77..26229649a42 100644 --- a/forge-gui/res/cardsfolder/s/skittering_monstrosity.txt +++ b/forge-gui/res/cardsfolder/s/skittering_monstrosity.txt @@ -4,6 +4,6 @@ Types:Creature Horror PT:5/5 T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | Execute$ TrigSac | TriggerZones$ Battlefield | TriggerDescription$ When you cast a creature spell, sacrifice CARDNAME. SVar:TrigSac:DB$Sacrifice | Defined$ Self -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/skittering_monstrosity.jpg Oracle:When you cast a creature spell, sacrifice Skittering Monstrosity. diff --git a/forge-gui/res/cardsfolder/s/skittering_skirge.txt b/forge-gui/res/cardsfolder/s/skittering_skirge.txt index 25cabdb81ba..a08c1046da3 100644 --- a/forge-gui/res/cardsfolder/s/skittering_skirge.txt +++ b/forge-gui/res/cardsfolder/s/skittering_skirge.txt @@ -5,6 +5,6 @@ PT:3/2 K:Flying T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSacrifice | TriggerDescription$ When you cast a creature spell, sacrifice CARDNAME. SVar:TrigSacrifice:AB$Sacrifice | Cost$ 0 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/skittering_skirge.jpg Oracle:Flying\nWhen you cast a creature spell, sacrifice Skittering Skirge. diff --git a/forge-gui/res/cardsfolder/s/skittish_kavu.txt b/forge-gui/res/cardsfolder/s/skittish_kavu.txt index ef89119780f..60b29b8e811 100644 --- a/forge-gui/res/cardsfolder/s/skittish_kavu.txt +++ b/forge-gui/res/cardsfolder/s/skittish_kavu.txt @@ -6,6 +6,6 @@ S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 1 | AddToughness$ 1 | Check SVar:X:Count$Valid Creature.White+OppCtrl/Plus.Y SVar:Y:Count$Valid Creature.Blue+OppCtrl SVar:AntiBuffedBy:Creature.White,Creature.Blue -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/skittish_kavu.jpg Oracle:Skittish Kavu gets +1/+1 as long as no opponent controls a white or blue creature. diff --git a/forge-gui/res/cardsfolder/s/skred.txt b/forge-gui/res/cardsfolder/s/skred.txt index 2ccb25af922..7b6525de306 100644 --- a/forge-gui/res/cardsfolder/s/skred.txt +++ b/forge-gui/res/cardsfolder/s/skred.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Instant A:SP$ DealDamage | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | References$ X | SpellDescription$ Skred deals damage to target creature equal to the number of snow permanents you control. SVar:X:Count$TypeYouCtrl.Snow -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/skred.jpg Oracle:Skred deals damage to target creature equal to the number of snow permanents you control. diff --git a/forge-gui/res/cardsfolder/s/skull_collector.txt b/forge-gui/res/cardsfolder/s/skull_collector.txt index 7d001895dcc..0e51b4891f1 100644 --- a/forge-gui/res/cardsfolder/s/skull_collector.txt +++ b/forge-gui/res/cardsfolder/s/skull_collector.txt @@ -7,6 +7,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigBounce | Trigger SVar:TrigBounce:DB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Mandatory$ True | Hidden$ True | ChangeType$ Creature.Black+YouCtrl SVar:NeedsToPlayVar:Z GE2 SVar:Z:Count$Valid Creature.Black+YouCtrl+inZoneBattlefield -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/skull_collector.jpg Oracle:At the beginning of your upkeep, return a black creature you control to its owner's hand.\n{1}{B}: Regenerate Skull Collector. diff --git a/forge-gui/res/cardsfolder/s/skullmane_baku.txt b/forge-gui/res/cardsfolder/s/skullmane_baku.txt index 18ea8c76e83..7763a6af192 100644 --- a/forge-gui/res/cardsfolder/s/skullmane_baku.txt +++ b/forge-gui/res/cardsfolder/s/skullmane_baku.txt @@ -7,7 +7,7 @@ SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ KI | CounterNum #ChosenX SVar created by Cost payment A:AB$ Pump | Cost$ 1 T SubCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -ChosenX | NumDef$ -ChosenX | IsCurse$ True | AILogic$ DebuffForXCounters | References$ X | SpellDescription$ Target creature gets -X/-X until end of turn. SVar:X:XChoice -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/skullmane_baku.jpg Oracle:Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Skullmane Baku.\n{1}, {T}, Remove X ki counters from Skullmane Baku: Target creature gets -X/-X until end of turn. diff --git a/forge-gui/res/cardsfolder/s/skulltap.txt b/forge-gui/res/cardsfolder/s/skulltap.txt index a8de726b233..6663eab7029 100644 --- a/forge-gui/res/cardsfolder/s/skulltap.txt +++ b/forge-gui/res/cardsfolder/s/skulltap.txt @@ -2,6 +2,6 @@ Name:Skulltap ManaCost:1 B Types:Sorcery A:SP$ Draw | Cost$ 1 B Sac<1/Creature> | NumCards$ 2 | SpellDescription$ Draw two cards. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/skulltap.jpg Oracle:As an additional cost to cast Skulltap, sacrifice a creature.\nDraw two cards. diff --git a/forge-gui/res/cardsfolder/s/sky_swallower.txt b/forge-gui/res/cardsfolder/s/sky_swallower.txt index 9595bfaa385..8839c148a28 100644 --- a/forge-gui/res/cardsfolder/s/sky_swallower.txt +++ b/forge-gui/res/cardsfolder/s/sky_swallower.txt @@ -5,6 +5,6 @@ PT:8/8 K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainControl | TriggerDescription$ When CARDNAME enters the battlefield, target opponent gains control of all other permanents you control. SVar:TrigGainControl:DB$ GainControl | ValidTgts$ Opponent | AllValid$ Permanent.Other+YouCtrl | NewController$ Opponent -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://resources.wizards.com/magic/cards/gpt/en-us/card96835.jpg Oracle:Flying\nWhen Sky Swallower enters the battlefield, target opponent gains control of all other permanents you control. diff --git a/forge-gui/res/cardsfolder/s/skycloud_egg.txt b/forge-gui/res/cardsfolder/s/skycloud_egg.txt index e859201a171..72e17fcd121 100644 --- a/forge-gui/res/cardsfolder/s/skycloud_egg.txt +++ b/forge-gui/res/cardsfolder/s/skycloud_egg.txt @@ -3,7 +3,7 @@ ManaCost:1 Types:Artifact A:AB$ Mana | Cost$ 2 T Sac<1/CARDNAME> | Produced$ W U | SubAbility$ DBDraw | SpellDescription$ Add {W}{U}. Draw a card. SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/skycloud_egg.jpg Oracle:{2}, {T}, Sacrifice Skycloud Egg: Add {W}{U}. Draw a card. diff --git a/forge-gui/res/cardsfolder/s/skycloud_expanse.txt b/forge-gui/res/cardsfolder/s/skycloud_expanse.txt index e494e7a540d..e79f3bfa8ec 100644 --- a/forge-gui/res/cardsfolder/s/skycloud_expanse.txt +++ b/forge-gui/res/cardsfolder/s/skycloud_expanse.txt @@ -2,6 +2,6 @@ Name:Skycloud Expanse ManaCost:no cost Types:Land A:AB$ Mana | Cost$ 1 T | Produced$ W U | SpellDescription$ Add {W}{U}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/skycloud_expanse.jpg Oracle:{1}, {T}: Add {W}{U}. diff --git a/forge-gui/res/cardsfolder/s/skyscribing.txt b/forge-gui/res/cardsfolder/s/skyscribing.txt index 5cc6c478896..c214ca00a72 100644 --- a/forge-gui/res/cardsfolder/s/skyscribing.txt +++ b/forge-gui/res/cardsfolder/s/skyscribing.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ Draw | Cost$ X U U | Defined$ Player | NumCards$ X | References$ X | SpellDescription$ Each player draws X cards. A:AB$ Draw | Cost$ 2 U | NumCards$ 1 | Defined$ Player | ActivationZone$ Hand | ActivationLimit$ 1 | PlayerTurn$ True | ActivationPhases$ Upkeep | PrecostDesc$ Forecast — | CostDesc$ {2}{U}, Reveal CARDNAME from your hand: | SpellDescription$ Each player draws a card. (Activate this ability only during your upkeep and only once each turn.) SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/skyscribing.jpg Oracle:Each player draws X cards.\nForecast — {2}{U}, Reveal Skyscribing from your hand: Each player draws a card. (Activate this ability only during your upkeep and only once each turn.) diff --git a/forge-gui/res/cardsfolder/s/skyship_plunderer.txt b/forge-gui/res/cardsfolder/s/skyship_plunderer.txt index 2e77c934152..d6a48249238 100644 --- a/forge-gui/res/cardsfolder/s/skyship_plunderer.txt +++ b/forge-gui/res/cardsfolder/s/skyship_plunderer.txt @@ -5,6 +5,6 @@ PT:2/1 K:Flying T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigIncrementCounters | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, for each kind of counter on target permanent or player, give permanent or player another counter of that kind. SVar:TrigIncrementCounters:DB$ PutCounter | ValidTgts$ Permanent,Player | CounterType$ ExistingCounter | EachExistingCounter$ True | CounterNum$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/skyship_plunderer.jpg Oracle:Flying\nWhenever Skyship Plunderer deals combat damage to a player, for each kind of counter on target permanent or player, give permanent or player another counter of that kind. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/skyshroud_blessing.txt b/forge-gui/res/cardsfolder/s/skyshroud_blessing.txt index 180e701872a..1241bccff85 100644 --- a/forge-gui/res/cardsfolder/s/skyshroud_blessing.txt +++ b/forge-gui/res/cardsfolder/s/skyshroud_blessing.txt @@ -3,6 +3,6 @@ ManaCost:1 G Types:Instant A:SP$ PumpAll | Cost$ 1 G | ValidCards$ Land | KW$ Shroud | SubAbility$ DBDraw | SpellDescription$ All lands gain shroud until end of turn. (They can't be the targets of spells or abilities.) Draw a card. SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/skyshroud_blessing.jpg Oracle:All lands gain shroud until end of turn. (They can't be the targets of spells or abilities.)\nDraw a card. diff --git a/forge-gui/res/cardsfolder/s/skyshroud_elf.txt b/forge-gui/res/cardsfolder/s/skyshroud_elf.txt index 54819bf1cb4..b7641d67223 100644 --- a/forge-gui/res/cardsfolder/s/skyshroud_elf.txt +++ b/forge-gui/res/cardsfolder/s/skyshroud_elf.txt @@ -5,6 +5,6 @@ PT:1/1 A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. A:AB$ Mana | Cost$ 1 | Produced$ W | SpellDescription$ Add {W}. A:AB$ Mana | Cost$ 1 | Produced$ R | SpellDescription$ Add {R}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/skyshroud_elf.jpg Oracle:{T}: Add {G}.\n{1}: Add {R} or {W}. diff --git a/forge-gui/res/cardsfolder/s/skyshroud_poacher.txt b/forge-gui/res/cardsfolder/s/skyshroud_poacher.txt index 2c52d107851..f9fece92751 100644 --- a/forge-gui/res/cardsfolder/s/skyshroud_poacher.txt +++ b/forge-gui/res/cardsfolder/s/skyshroud_poacher.txt @@ -3,7 +3,7 @@ ManaCost:2 G G Types:Creature Human Rebel PT:2/2 A:AB$ ChangeZone | Cost$ 3 T | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Elf | ChangeNum$ 1 | SpellDescription$ Search your library for an Elf permanent card, put it onto the battlefield, then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonCombatPriority:3 SVar:Picture:http://www.wizards.com/global/images/magic/general/skyshroud_poacher.jpg Oracle:{3}, {T}: Search your library for an Elf permanent card, put it onto the battlefield, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/s/skyshroud_vampire.txt b/forge-gui/res/cardsfolder/s/skyshroud_vampire.txt index 500da0540a5..9a2a7bf6a5c 100644 --- a/forge-gui/res/cardsfolder/s/skyshroud_vampire.txt +++ b/forge-gui/res/cardsfolder/s/skyshroud_vampire.txt @@ -4,6 +4,6 @@ Types:Creature Vampire PT:3/3 K:Flying A:AB$ Pump | Cost$ Discard<1/Creature> | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Skyshroud Vampire gets +2/+2 until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/skyshroud_vampire.jpg Oracle:Flying\nDiscard a creature card: Skyshroud Vampire gets +2/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/s/skyshroud_war_beast.txt b/forge-gui/res/cardsfolder/s/skyshroud_war_beast.txt index b9325fb555a..efc009f4882 100644 --- a/forge-gui/res/cardsfolder/s/skyshroud_war_beast.txt +++ b/forge-gui/res/cardsfolder/s/skyshroud_war_beast.txt @@ -7,7 +7,7 @@ K:ETBReplacement:Other:ChooseP SVar:ChooseP:DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | AILogic$ Curse | SpellDescription$ As CARDNAME enters the battlefield, choose an opponent. S:Mode$ Continuous | EffectZone$ Battlefield | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ CARDNAME's power and toughness are each equal to the number of nonbasic lands the chosen player controls. SVar:X:Count$Valid Land.nonBasic+ChosenCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NeedsToPlayVar:Z GE1 SVar:Z:Count$Valid Land.nonBasic+OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/skyshroud_war_beast.jpg diff --git a/forge-gui/res/cardsfolder/s/slab_hammer.txt b/forge-gui/res/cardsfolder/s/slab_hammer.txt index 59a1cfe34c5..5786a689c95 100644 --- a/forge-gui/res/cardsfolder/s/slab_hammer.txt +++ b/forge-gui/res/cardsfolder/s/slab_hammer.txt @@ -4,6 +4,6 @@ Types:Artifact Equipment K:Equip:2 T:Mode$ Attacks | ValidCard$ Card.EquippedBy | Execute$ TrigPump | TriggerDescription$ Whenever equipped creature attacks, you may return a land you control to its owner's hand. If you do, the creature gets +2/+2 until end of turn. SVar:TrigPump:AB$ Pump | Cost$ Return<1/Land> | Defined$ TriggeredAttacker | NumAtt$ 2 | NumDef$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/slab_hammer.jpg Oracle:Whenever equipped creature attacks, you may return a land you control to its owner's hand. If you do, the creature gets +2/+2 until end of turn.\nEquip {2} diff --git a/forge-gui/res/cardsfolder/s/slag_fiend.txt b/forge-gui/res/cardsfolder/s/slag_fiend.txt index 17f240a51ee..71563b35bed 100644 --- a/forge-gui/res/cardsfolder/s/slag_fiend.txt +++ b/forge-gui/res/cardsfolder/s/slag_fiend.txt @@ -4,7 +4,7 @@ Types:Creature Construct PT:*/* S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ CARDNAME's power and toughness are each equal to the number of artifact cards in all graveyards. SVar:X:Count$TypeInAllYards.Artifact -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NeedsToPlayVar:X GE1 SVar:Picture:http://www.wizards.com/global/images/magic/general/slag_fiend.jpg Oracle:Slag Fiend's power and toughness are each equal to the number of artifact cards in all graveyards. diff --git a/forge-gui/res/cardsfolder/s/slate_of_ancestry.txt b/forge-gui/res/cardsfolder/s/slate_of_ancestry.txt index a97280fb09c..b38fce4849f 100644 --- a/forge-gui/res/cardsfolder/s/slate_of_ancestry.txt +++ b/forge-gui/res/cardsfolder/s/slate_of_ancestry.txt @@ -3,6 +3,6 @@ ManaCost:4 Types:Artifact A:AB$ Draw | Cost$ 4 T Discard<1/Hand> | NumCards$ X | References$ X | SpellDescription$ Draw a card for each creature you control. SVar:X:Count$TypeYouCtrl.Creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/slate_of_ancestry.jpg Oracle:{4}, {T}, Discard your hand: Draw a card for each creature you control. diff --git a/forge-gui/res/cardsfolder/s/slaughter_games.txt b/forge-gui/res/cardsfolder/s/slaughter_games.txt index d5b305ea929..85393220ed8 100644 --- a/forge-gui/res/cardsfolder/s/slaughter_games.txt +++ b/forge-gui/res/cardsfolder/s/slaughter_games.txt @@ -9,6 +9,6 @@ SVar:ExileLib:DB$ ChangeZone | Origin$ Library | Destination$ Exile | DefinedPla SVar:NumInLib:TargetedPlayer$CardsInLibrary SVar:NumInHand:TargetedPlayer$CardsInHand SVar:NumInYard:TargetedPlayer$CardsInGraveyard -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/slaughter_games.jpg Oracle:Slaughter Games can't be countered by spells or abilities.\nChoose a nonland card name. Search target opponent's graveyard, hand, and library for any number of cards with that name and exile them. Then that player shuffles their library. diff --git a/forge-gui/res/cardsfolder/s/slaughter_pact.txt b/forge-gui/res/cardsfolder/s/slaughter_pact.txt index 14d8918ec47..46a6176806e 100644 --- a/forge-gui/res/cardsfolder/s/slaughter_pact.txt +++ b/forge-gui/res/cardsfolder/s/slaughter_pact.txt @@ -7,6 +7,6 @@ SVar:DBDelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Y SVar:TrigLoseGame:DB$ LosesGame | UnlessCost$ 2 B | UnlessPayer$ You | Defined$ You SVar:NeedsToPlayVar:NumLands GE3 SVar:NumLands:Count$Valid Land.YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/slaughter_pact.jpg Oracle:Destroy target nonblack creature.\nAt the beginning of your next upkeep, pay {2}{B}. If you don't, you lose the game. diff --git a/forge-gui/res/cardsfolder/s/slaughter_the_strong.txt b/forge-gui/res/cardsfolder/s/slaughter_the_strong.txt index 5358956e2d6..66f6b398e70 100644 --- a/forge-gui/res/cardsfolder/s/slaughter_the_strong.txt +++ b/forge-gui/res/cardsfolder/s/slaughter_the_strong.txt @@ -5,6 +5,6 @@ A:SP$ RepeatEach | Cost$ 1 W W | RepeatPlayers$ Player | RepeatSubAbility$ Choos SVar:ChooseCrtr:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.RememberedPlayerCtrl | WithTotalPower$ 4 | RememberChosen$ True | AILogic$ NegativePowerFirst SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Creature.IsNotRemembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/slaughter_the_strong.jpg Oracle:Each player chooses any number of creatures they control with total power 4 or less, then sacrifices all other creatures they control. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/slay.txt b/forge-gui/res/cardsfolder/s/slay.txt index 8ed32d9ad79..e333f49554d 100644 --- a/forge-gui/res/cardsfolder/s/slay.txt +++ b/forge-gui/res/cardsfolder/s/slay.txt @@ -3,6 +3,6 @@ ManaCost:2 B Types:Instant A:SP$ Destroy | Cost$ 2 B | ValidTgts$ Creature.Green | TgtPrompt$ Select target green creature | NoRegen$ True | SpellDescription$ Destroy target green creature. It can't be regenerated. | SubAbility$ DBDraw SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/slay.jpg Oracle:Destroy target green creature. It can't be regenerated.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/s/sleeper_agent.txt b/forge-gui/res/cardsfolder/s/sleeper_agent.txt index 293d63b0645..79dcf8b3f5d 100644 --- a/forge-gui/res/cardsfolder/s/sleeper_agent.txt +++ b/forge-gui/res/cardsfolder/s/sleeper_agent.txt @@ -7,6 +7,6 @@ SVar:TrigGainControl:DB$ GainControl | Defined$ Self | ValidTgts$ Opponent | Tgt T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of your upkeep, CARDNAME deals 2 damage to you. SVar:TrigDamage:DB$ DealDamage | Defined$ You | NumDmg$ 2 SVar:NeedsToPlay:Creature.YouCtrl+toughnessGT3,Creature.YouCtrl+powerGE3 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sleeper_agent.jpg Oracle:When Sleeper Agent enters the battlefield, target opponent gains control of it.\nAt the beginning of your upkeep, Sleeper Agent deals 2 damage to you. diff --git a/forge-gui/res/cardsfolder/s/sleight_of_hand.txt b/forge-gui/res/cardsfolder/s/sleight_of_hand.txt index 6c0cf8ed666..4bc88251b09 100644 --- a/forge-gui/res/cardsfolder/s/sleight_of_hand.txt +++ b/forge-gui/res/cardsfolder/s/sleight_of_hand.txt @@ -2,6 +2,6 @@ Name:Sleight of Hand ManaCost:U Types:Sorcery A:SP$ Dig | Cost$ U | DigNum$ 2 | SpellDescription$ Look at the top two cards of your library. Put one of them into your hand and the other on the bottom of your library. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sleight_of_hand.jpg Oracle:Look at the top two cards of your library. Put one of them into your hand and the other on the bottom of your library. diff --git a/forge-gui/res/cardsfolder/s/sleight_of_mind.txt b/forge-gui/res/cardsfolder/s/sleight_of_mind.txt index d0d46ef782e..70395eb6baa 100644 --- a/forge-gui/res/cardsfolder/s/sleight_of_mind.txt +++ b/forge-gui/res/cardsfolder/s/sleight_of_mind.txt @@ -2,7 +2,7 @@ Name:Sleight of Mind ManaCost:U Types:Instant A:SP$ ChangeText | Cost$ U | ValidTgts$ Card | TgtZone$ Stack,Battlefield | TgtPrompt$ Choose target spell or permanent | Permanent$ True | ChangeColorWord$ Choose Choose | SpellDescription$ Change the text of target spell or permanent by replacing all instances of one color word with another. (For example, you may change "target black spell" to "target blue spell." This effect lasts indefinitely.) -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/alter_reality.jpg Oracle:Change the text of target spell or permanent by replacing all instances of one color word with another. (For example, you may change "target black spell" to "target blue spell." This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/s/slimy_kavu.txt b/forge-gui/res/cardsfolder/s/slimy_kavu.txt index 4397233ed1c..c5c9f7f4eb3 100644 --- a/forge-gui/res/cardsfolder/s/slimy_kavu.txt +++ b/forge-gui/res/cardsfolder/s/slimy_kavu.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Creature Kavu PT:2/2 A:AB$ Animate | Cost$ T | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Swamp | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | SpellDescription$ Target land becomes a Swamp until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/slimy_kavu.jpg Oracle:{T}: Target land becomes a Swamp until end of turn. diff --git a/forge-gui/res/cardsfolder/s/slingbow_trap.txt b/forge-gui/res/cardsfolder/s/slingbow_trap.txt index 2cecfc6a19e..5962fcf3b0a 100644 --- a/forge-gui/res/cardsfolder/s/slingbow_trap.txt +++ b/forge-gui/res/cardsfolder/s/slingbow_trap.txt @@ -3,6 +3,6 @@ ManaCost:3 G Types:Instant Trap A:SP$ Destroy | Cost$ G | ValidTgts$ Creature.attacking+withFlying | IsPresent$ Creature.attacking+Black+withFlying | OptionalDecider$ You | TgtPrompt$ Select target attacking creature with flying. | SpellDescription$ If a black creature with flying is attacking, you may pay {G} rather than pay CARDNAME's mana cost. A:SP$ Destroy | Cost$ 3 G | ValidTgts$ Creature.attacking+withFlying | TgtPrompt$ Select target attacking creature with flying. | SpellDescription$ Destroy target attacking creature with flying. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/Slingbow_Trap.jpg Oracle:If a black creature with flying is attacking, you may pay {G} rather than pay Slingbow Trap's mana cost.\nDestroy target attacking creature with flying. diff --git a/forge-gui/res/cardsfolder/s/slingshot_goblin.txt b/forge-gui/res/cardsfolder/s/slingshot_goblin.txt index 5a6d9ac5554..90be0ce3bcf 100644 --- a/forge-gui/res/cardsfolder/s/slingshot_goblin.txt +++ b/forge-gui/res/cardsfolder/s/slingshot_goblin.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Creature Goblin PT:2/2 A:AB$ DealDamage | Cost$ R T | ValidTgts$ Creature.Blue | TgtPrompt$ Select target blue creature | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target blue creature. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/slingshot_goblin.jpg Oracle:{R}, {T}: Slingshot Goblin deals 2 damage to target blue creature. diff --git a/forge-gui/res/cardsfolder/s/slinking_skirge.txt b/forge-gui/res/cardsfolder/s/slinking_skirge.txt index e5324578ef9..bac88805082 100644 --- a/forge-gui/res/cardsfolder/s/slinking_skirge.txt +++ b/forge-gui/res/cardsfolder/s/slinking_skirge.txt @@ -4,6 +4,6 @@ Types:Creature Imp PT:2/1 K:Flying A:AB$ Draw | Cost$ 2 Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/slinking_skirge.jpg Oracle:Flying\n{2}, Sacrifice Slinking Skirge: Draw a card. diff --git a/forge-gui/res/cardsfolder/s/sliversmith.txt b/forge-gui/res/cardsfolder/s/sliversmith.txt index 3b682f2f4df..514262e2d63 100644 --- a/forge-gui/res/cardsfolder/s/sliversmith.txt +++ b/forge-gui/res/cardsfolder/s/sliversmith.txt @@ -3,7 +3,7 @@ ManaCost:2 Types:Artifact Creature Spellshaper PT:1/1 A:AB$ Token | Cost$ 1 T Discard<1/Card> | TokenAmount$ 1 | TokenName$ Metallic Sliver | TokenTypes$ Artifact,Creature,Sliver | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Create a 1/1 colorless Sliver artifact creature token named Metallic Sliver. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:AIPreference:DiscardCost$Card DeckHints:Type$Sliver DeckHas:Ability$Discard & Ability$Token diff --git a/forge-gui/res/cardsfolder/s/slobad_goblin_tinkerer.txt b/forge-gui/res/cardsfolder/s/slobad_goblin_tinkerer.txt index 32e44353149..4e405bc5d9d 100644 --- a/forge-gui/res/cardsfolder/s/slobad_goblin_tinkerer.txt +++ b/forge-gui/res/cardsfolder/s/slobad_goblin_tinkerer.txt @@ -3,6 +3,6 @@ ManaCost:1 R Types:Legendary Creature Goblin Artificer PT:1/2 A:AB$ Pump | Cost$ Sac<1/Artifact> | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | KW$ Indestructible | SpellDescription$ Target artifact gains indestructible until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/slobad_goblin_tinkerer.jpg Oracle:Sacrifice an artifact: Target artifact gains indestructible until end of turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/slumbering_tora.txt b/forge-gui/res/cardsfolder/s/slumbering_tora.txt index cf2a7617659..a4755be497f 100644 --- a/forge-gui/res/cardsfolder/s/slumbering_tora.txt +++ b/forge-gui/res/cardsfolder/s/slumbering_tora.txt @@ -3,8 +3,8 @@ ManaCost:3 Types:Artifact A:AB$ Animate | Cost$ 2 Discard<1/Spirit;Arcane/spirit or arcane card> | CostDesc$ {2}, Discard a Spirit or Arcane card: | Defined$ Self | Power$ X | Toughness$ X | Types$ Creature,Artifact,Cat | SpellDescription$ CARDNAME becomes an X/X Cat artifact creature until end of turn, where X is the discarded card's converted mana cost. SVar:X:Discarded$CardManaCost -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/slumbering_tora.jpg Oracle:{2}, Discard a Spirit or Arcane card: Slumbering Tora becomes an X/X Cat artifact creature until end of turn, where X is the discarded card's converted mana cost. diff --git a/forge-gui/res/cardsfolder/s/smallpox.txt b/forge-gui/res/cardsfolder/s/smallpox.txt index 6dbd95e89a8..111920ef881 100644 --- a/forge-gui/res/cardsfolder/s/smallpox.txt +++ b/forge-gui/res/cardsfolder/s/smallpox.txt @@ -5,6 +5,6 @@ A:SP$ LoseLife | Cost$ B B | Defined$ Player | LifeAmount$ 1 | AILifeThreshold$ SVar:DBDiscard:DB$Discard | NumCards$ 1 | Mode$ TgtChoose | Defined$ Player | SubAbility$ DBSacCreature SVar:DBSacCreature:DB$Sacrifice | SacValid$ Creature | Defined$ Player | SubAbility$ DBSacLand SVar:DBSacLand:DB$Sacrifice | SacValid$ Land | Defined$ Player -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/smallpox.jpg Oracle:Each player loses 1 life, discards a card, sacrifices a creature, then sacrifices a land. diff --git a/forge-gui/res/cardsfolder/s/smite.txt b/forge-gui/res/cardsfolder/s/smite.txt index 3a0ff071572..011656557a4 100644 --- a/forge-gui/res/cardsfolder/s/smite.txt +++ b/forge-gui/res/cardsfolder/s/smite.txt @@ -2,6 +2,6 @@ Name:Smite ManaCost:W Types:Instant A:SP$ Destroy | Cost$ W | ValidTgts$ Creature.blocked | TgtPrompt$ Select target blocked creature | SpellDescription$ Destroy target blocked creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/smite.jpg Oracle:Destroy target blocked creature. diff --git a/forge-gui/res/cardsfolder/s/smoke.txt b/forge-gui/res/cardsfolder/s/smoke.txt index a311819e7c5..bd63c46ce3b 100644 --- a/forge-gui/res/cardsfolder/s/smoke.txt +++ b/forge-gui/res/cardsfolder/s/smoke.txt @@ -3,6 +3,6 @@ ManaCost:R R Types:Enchantment S:Mode$ Continuous | Affected$ Player | AddKeyword$ UntapAdjust:Creature:1 | Description$ Players can't untap more than one creature during their untap steps. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/smoke.jpg Oracle:Players can't untap more than one creature during their untap steps. diff --git a/forge-gui/res/cardsfolder/s/smokebraider.txt b/forge-gui/res/cardsfolder/s/smokebraider.txt index 25eb5b49377..e3c27872043 100644 --- a/forge-gui/res/cardsfolder/s/smokebraider.txt +++ b/forge-gui/res/cardsfolder/s/smokebraider.txt @@ -3,6 +3,6 @@ ManaCost:1 R Types:Creature Elemental Shaman PT:1/1 A:AB$ Mana | Cost$ T | Produced$ Combo Any | Amount$ 2 | RestrictValid$ Card.Elemental,Activated.Elemental | AILogic$ MostProminentInComputerHand | SpellDescription$ Add two mana in any combination of colors. Spend this mana only to cast Elemental spells or activate abilities of Elementals. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/smokebraider.jpg Oracle:{T}: Add two mana in any combination of colors. Spend this mana only to cast Elemental spells or activate abilities of Elementals. diff --git a/forge-gui/res/cardsfolder/s/smokestack.txt b/forge-gui/res/cardsfolder/s/smokestack.txt index d370e3cc5f6..0e2dc65bc56 100644 --- a/forge-gui/res/cardsfolder/s/smokestack.txt +++ b/forge-gui/res/cardsfolder/s/smokestack.txt @@ -6,6 +6,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | O SVar:TrigSacrifice:DB$ Sacrifice | Defined$ TriggeredPlayer | Amount$ X | References$ X | SacValid$ Permanent | SacMessage$ Permanent SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ SOOT | CounterNum$ 1 SVar:X:Count$CardCounters.SOOT -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/smokestack.jpg Oracle:At the beginning of your upkeep, you may put a soot counter on Smokestack.\nAt the beginning of each player's upkeep, that player sacrifices a permanent for each soot counter on Smokestack. diff --git a/forge-gui/res/cardsfolder/s/smothering_abomination.txt b/forge-gui/res/cardsfolder/s/smothering_abomination.txt index e8172ee1646..e2f79880eca 100644 --- a/forge-gui/res/cardsfolder/s/smothering_abomination.txt +++ b/forge-gui/res/cardsfolder/s/smothering_abomination.txt @@ -8,7 +8,7 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E SVar:TrigSac:DB$ Sacrifice | Defined$ You | SacValid$ Creature | SacMessage$ Creature T:Mode$ Sacrificed | ValidCard$ Creature.YouCtrl | Execute$ TrigDrawCard | TriggerZones$ Battlefield | TriggerDescription$ Whenever you sacrifice a creature, draw a card. SVar:TrigDrawCard:DB$ Draw | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NeedsToPlayVar:Z GE2 SVar:Z:Count$Valid Creature.YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/smothering_abomination.jpg diff --git a/forge-gui/res/cardsfolder/s/snakeform.txt b/forge-gui/res/cardsfolder/s/snakeform.txt index e011d4b80cb..a44ef809277 100644 --- a/forge-gui/res/cardsfolder/s/snakeform.txt +++ b/forge-gui/res/cardsfolder/s/snakeform.txt @@ -3,6 +3,6 @@ ManaCost:2 GU Types:Instant A:SP$ Animate | Cost$ 2 GU | ValidTgts$ Creature | TgtPrompt$ Select target creature | Power$ 1 | Toughness$ 1 | RemoveAllAbilities$ True | Colors$ Green | OverwriteColors$ True | Types$ Snake | RemoveCreatureTypes$ True | SubAbility$ DBDraw | IsCurse$ True | SpellDescription$ Until end of turn, target creature loses all abilities and becomes a green Snake with base power and toughness 1/1. Draw a card. SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/snakeform.jpg Oracle:Until end of turn, target creature loses all abilities and becomes a green Snake with base power and toughness 1/1.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/s/sneak_attack.txt b/forge-gui/res/cardsfolder/s/sneak_attack.txt index b8a0e052343..2d77709cda6 100644 --- a/forge-gui/res/cardsfolder/s/sneak_attack.txt +++ b/forge-gui/res/cardsfolder/s/sneak_attack.txt @@ -6,7 +6,7 @@ SVar:DBPump:DB$ Animate | Keywords$ Haste | sVars$ SneakAttackEOT | Defined$ Rem SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:PlayMain1:ALWAYS SVar:Picture:http://www.wizards.com/global/images/magic/general/sneak_attack.jpg Oracle:{R}: You may put a creature card from your hand onto the battlefield. That creature gains haste. Sacrifice the creature at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/s/snow_hound.txt b/forge-gui/res/cardsfolder/s/snow_hound.txt index cb304c9d0c4..96e4bb3826d 100644 --- a/forge-gui/res/cardsfolder/s/snow_hound.txt +++ b/forge-gui/res/cardsfolder/s/snow_hound.txt @@ -4,6 +4,6 @@ Types:Creature Hound PT:1/1 A:AB$ ChangeZone | Cost$ 1 T | ValidTgts$ Creature.Blue+YouCtrl,Creature.Green+YouCtrl | TgtPrompt$ Select target blue or green creature you control | Origin$ Battlefield | Destination$ Hand | SubAbility$ Return | SpellDescription$ Return CARDNAME and target green or blue creature you control to their owner's hand. SVar:Return:DB$ChangeZone | Origin$ Battlefield | Destination$ Hand -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/snow_hound.jpg Oracle:{1}, {T}: Return Snow Hound and target green or blue creature you control to their owner's hand. diff --git a/forge-gui/res/cardsfolder/s/snowblind.txt b/forge-gui/res/cardsfolder/s/snowblind.txt index 67edd8daaab..133b0e390fe 100644 --- a/forge-gui/res/cardsfolder/s/snowblind.txt +++ b/forge-gui/res/cardsfolder/s/snowblind.txt @@ -12,7 +12,7 @@ SVar:EnchantedY:Enchanted$CardToughness/Minus.1 SVar:EnchantedDef:SVar$EnchantedY/Negative SVar:AttackingY:SVar$EnchantedDef/LimitMin.AttackingX SVar:NotAttackingY:SVar$EnchantedDef/LimitMin.NotAttackingX -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Snow SVar:Picture:http://www.wizards.com/global/images/magic/general/snowblind.jpg Oracle:Enchant creature\nEnchanted creature gets -X/-Y. If that creature is attacking, X is the number of snow lands defending player controls. Otherwise, X is the number of snow lands its controller controls. Y is equal to X or to enchanted creature's toughness minus 1, whichever is smaller. diff --git a/forge-gui/res/cardsfolder/s/snowfall.txt b/forge-gui/res/cardsfolder/s/snowfall.txt index 1f09791fb78..7396e0f1945 100644 --- a/forge-gui/res/cardsfolder/s/snowfall.txt +++ b/forge-gui/res/cardsfolder/s/snowfall.txt @@ -5,7 +5,7 @@ K:Cumulative upkeep:U T:Mode$ TapsForMana | ValidCard$ Island | Execute$ TrigMana | Static$ True | TriggerZones$ Battlefield | OptionalDecider$ TriggeredCardController | TriggerDescription$ Whenever an Island is tapped for mana, its controller may add an additional {U}. If that Island is snow, its controller may add an additional {U}{U} instead. Spend this mana only to pay cumulative upkeep costs. SVar:TrigMana:DB$ Mana | Produced$ U | Amount$ 1 | Defined$ TriggeredCardController | RestrictValid$ CumulativeUpkeep | ConditionDefined$ TriggeredCard | ConditionPresent$ Land.Snow | ConditionCompare$ EQ0 | SubAbility$ DBMana SVar:DBMana:DB$ Mana | Produced$ U | Amount$ 2 | Defined$ TriggeredCardController | RestrictValid$ CumulativeUpkeep | ConditionDefined$ TriggeredCard | ConditionPresent$ Land.Snow | ConditionCompare$ GE1 -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/snowfall.jpg Oracle:Cumulative upkeep {U} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nWhenever an Island is tapped for mana, its controller may add an additional {U}. If that Island is snow, its controller may add an additional {U}{U} instead. Spend this mana only to pay cumulative upkeep costs. diff --git a/forge-gui/res/cardsfolder/s/soilshaper.txt b/forge-gui/res/cardsfolder/s/soilshaper.txt index 66b2ee1ceaa..5c75a69ce63 100644 --- a/forge-gui/res/cardsfolder/s/soilshaper.txt +++ b/forge-gui/res/cardsfolder/s/soilshaper.txt @@ -5,7 +5,7 @@ PT:1/1 T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAnimate | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, target land becomes a 3/3 creature until end of turn. It's still a land. SVar:TrigAnimate:DB$Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Power$ 3 | Toughness$ 3 | Types$ Creature SVar:BuffedBy:Arcane,Spirit -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/soilshaper.jpg Oracle:Whenever you cast a Spirit or Arcane spell, target land becomes a 3/3 creature until end of turn. It's still a land. diff --git a/forge-gui/res/cardsfolder/s/sokenzan_renegade.txt b/forge-gui/res/cardsfolder/s/sokenzan_renegade.txt index 8fef58c8dcf..926d931853c 100644 --- a/forge-gui/res/cardsfolder/s/sokenzan_renegade.txt +++ b/forge-gui/res/cardsfolder/s/sokenzan_renegade.txt @@ -5,6 +5,6 @@ PT:3/3 K:Bushido:1 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigGainControl | APlayerHasMostCardsInHand$ True | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, if a player has more cards in hand than each other player, the player who has the most cards in hand gains control of CARDNAME. SVar:TrigGainControl:DB$ GainControl | Defined$ Self | NewController$ Player.withMostCardsInHand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sokenzan_renegade.jpg Oracle:Bushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.)\nAt the beginning of your upkeep, if a player has more cards in hand than each other player, the player who has the most cards in hand gains control of Sokenzan Renegade. diff --git a/forge-gui/res/cardsfolder/s/soldevi_adnate.txt b/forge-gui/res/cardsfolder/s/soldevi_adnate.txt index 95982ac6516..c1ee9f35fe0 100644 --- a/forge-gui/res/cardsfolder/s/soldevi_adnate.txt +++ b/forge-gui/res/cardsfolder/s/soldevi_adnate.txt @@ -4,6 +4,6 @@ Types:Creature Human Cleric PT:1/2 A:AB$ Mana | Cost$ T Sac<1/Creature.Black;Creature.Artifact/black or artifact creature> | Produced$ B | Amount$ X | SpellDescription$ Add an amount of black mana equal to the sacrificed creature's converted mana cost. SVar:X:Sacrificed$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/soldevi_adnate.jpg Oracle:{T}, Sacrifice a black or artifact creature: Add an amount of {B} equal to the sacrificed creature's converted mana cost. diff --git a/forge-gui/res/cardsfolder/s/soldevi_digger.txt b/forge-gui/res/cardsfolder/s/soldevi_digger.txt index cd1017f598d..1c2a6fcc44d 100644 --- a/forge-gui/res/cardsfolder/s/soldevi_digger.txt +++ b/forge-gui/res/cardsfolder/s/soldevi_digger.txt @@ -2,7 +2,7 @@ Name:Soldevi Digger ManaCost:2 Types:Artifact A:AB$ ChangeZone | Cost$ 2 | Origin$ Graveyard | Destination$ Library | LibraryPosition$ -1 | Hidden$ True | Mandatory$ True | ChangeType$ Card.TopGraveyard+YouOwn | SpellDescription$ Put the top card of your graveyard on the bottom of your library. | StackDescription$ Put the top card of your graveyard on the bottom of your library. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NeedsOrderedGraveyard:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/soldevi_digger.jpg Oracle:{2}: Put the top card of your graveyard on the bottom of your library. diff --git a/forge-gui/res/cardsfolder/s/soldevi_excavations.txt b/forge-gui/res/cardsfolder/s/soldevi_excavations.txt index 83776ea4229..2ef2ea17797 100644 --- a/forge-gui/res/cardsfolder/s/soldevi_excavations.txt +++ b/forge-gui/res/cardsfolder/s/soldevi_excavations.txt @@ -9,6 +9,6 @@ SVar:MoveToGraveyard:DB$ ChangeZone | Origin$ All | Destination$ Graveyard | Def SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ1 | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/soldevi_excavations.jpg Oracle:If Soldevi Excavations would enter the battlefield, sacrifice an untapped Island instead. If you do, put Soldevi Excavations onto the battlefield. If you don't, put it into its owner's graveyard.\n{T}: Add {C}{U}.\n{1}, {T}: Scry 1. (Look at the top card of your library. You may put that card on the bottom of your library.) diff --git a/forge-gui/res/cardsfolder/s/soldevi_golem.txt b/forge-gui/res/cardsfolder/s/soldevi_golem.txt index 5afb09ee35a..33ec0c58e59 100644 --- a/forge-gui/res/cardsfolder/s/soldevi_golem.txt +++ b/forge-gui/res/cardsfolder/s/soldevi_golem.txt @@ -6,6 +6,6 @@ K:CARDNAME doesn't untap during your untap step. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | OptionalDecider$ You | Execute$ TrigUntap | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, you may untap target tapped creature an opponent controls. If you do, untap CARDNAME. SVar:TrigUntap:DB$ Untap | ValidTgts$ Creature.OppCtrl+tapped | TgtPrompt$ Select target tapped creature an opponent controls | SubAbility$ DBUntap SVar:DBUntap:DB$ Untap | Defined$ Self -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/soldevi_golem.jpg Oracle:Soldevi Golem doesn't untap during your untap step.\nAt the beginning of your upkeep, you may untap target tapped creature an opponent controls. If you do, untap Soldevi Golem. diff --git a/forge-gui/res/cardsfolder/s/soldevi_machinist.txt b/forge-gui/res/cardsfolder/s/soldevi_machinist.txt index 4284be65958..b6ef8139a80 100644 --- a/forge-gui/res/cardsfolder/s/soldevi_machinist.txt +++ b/forge-gui/res/cardsfolder/s/soldevi_machinist.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Creature Human Wizard Artificer PT:1/1 A:AB$ Mana | Cost$ T | Produced$ C | Amount$ 2 | RestrictValid$ Activated.Artifact | SpellDescription$ Add {C}{C}. Spend this mana only to activate abilities of artifacts. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/soldevi_machinist.jpg Oracle:{T}: Add {C}{C}. Spend this mana only to activate abilities of artifacts. diff --git a/forge-gui/res/cardsfolder/s/soldevi_sage.txt b/forge-gui/res/cardsfolder/s/soldevi_sage.txt index 3e635a341a5..54293a642bd 100644 --- a/forge-gui/res/cardsfolder/s/soldevi_sage.txt +++ b/forge-gui/res/cardsfolder/s/soldevi_sage.txt @@ -5,6 +5,6 @@ PT:1/1 A:AB$ Draw | Cost$ T Sac<2/Land> | NumCards$ 3 | RememberDrawn$ True | SubAbility$ DBDiscard | SpellDescription$ Draw three cards, then discard one of them. SVar:DBDiscard:DB$Discard | Defined$ You | Mode$ TgtChoose | DiscardValid$ Card.IsRemembered | NumCards$ 1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/soldevi_sage.jpg Oracle:{T}, Sacrifice two lands: Draw three cards, then discard one of them. diff --git a/forge-gui/res/cardsfolder/s/soldier_replica.txt b/forge-gui/res/cardsfolder/s/soldier_replica.txt index 8d6a3133409..10306a277de 100644 --- a/forge-gui/res/cardsfolder/s/soldier_replica.txt +++ b/forge-gui/res/cardsfolder/s/soldier_replica.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact Creature Soldier PT:1/3 A:AB$ DealDamage | Cost$ 1 W Sac<1/CARDNAME> | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target attacking or blocking creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/soldier_replica.jpg Oracle:{1}{W}, Sacrifice Soldier Replica: Soldier Replica deals 3 damage to target attacking or blocking creature. diff --git a/forge-gui/res/cardsfolder/s/solidarity.txt b/forge-gui/res/cardsfolder/s/solidarity.txt index 3cc7c8dd5d5..78977258660 100644 --- a/forge-gui/res/cardsfolder/s/solidarity.txt +++ b/forge-gui/res/cardsfolder/s/solidarity.txt @@ -2,6 +2,6 @@ Name:Solidarity ManaCost:3 W Types:Instant A:SP$ PumpAll | Cost$ 3 W | ValidCards$ Creature.YouCtrl | NumDef$ +5 | SpellDescription$ Creatures you control get +0/+5 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://resources.wizards.com/magic/cards/8ed/en-us/card45188.jpg Oracle:Creatures you control get +0/+5 until end of turn. diff --git a/forge-gui/res/cardsfolder/s/solitary_confinement.txt b/forge-gui/res/cardsfolder/s/solitary_confinement.txt index 1f5a830e0c3..997aae1ea80 100644 --- a/forge-gui/res/cardsfolder/s/solitary_confinement.txt +++ b/forge-gui/res/cardsfolder/s/solitary_confinement.txt @@ -5,6 +5,6 @@ K:UpkeepCost:Discard<1/Card> S:Mode$ Continuous | Affected$ You | AddKeyword$ Skip your draw step. | Description$ Skip your draw step. S:Mode$ Continuous | Affected$ You | AddKeyword$ Shroud | Description$ You have shroud. (You can't be the target of spells or abilities.) R:Event$ DamageDone | ActiveZones$ Battlefield | Prevent$ True | ValidTarget$ You | Description$ Prevent all damage that would be dealt to you. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/solitary_confinement.jpg Oracle:At the beginning of your upkeep, sacrifice Solitary Confinement unless you discard a card.\nSkip your draw step.\nYou have shroud. (You can't be the target of spells or abilities.)\nPrevent all damage that would be dealt to you. diff --git a/forge-gui/res/cardsfolder/s/soltari_guerrillas.txt b/forge-gui/res/cardsfolder/s/soltari_guerrillas.txt index 549fca4152a..165d58b6a98 100644 --- a/forge-gui/res/cardsfolder/s/soltari_guerrillas.txt +++ b/forge-gui/res/cardsfolder/s/soltari_guerrillas.txt @@ -7,6 +7,6 @@ A:AB$ Effect | Cost$ 0 | Name$ Soltari Guerrillas Effect | ReplacementEffects$ E SVar:EventGuerrillasDamageDone:Event$ DamageDone | ValidSource$ Card.IsImprinted | ValidTarget$ Opponent | ReplaceWith$ DamageGuerrillasCreature | IsCombat$ True | Description$ The next time Soltari Guerrillas would deal combat damage to an opponent this turn, it deals that damage to target creature instead. SVar:DamageGuerrillasCreature:DB$ DealDamage | CombatDamage$ True | NumDmg$ GuerrillasX | References$ GuerrillasX | Defined$ Remembered | DamageSource$ Imprinted SVar:GuerrillasX:ReplaceCount$DamageAmount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/soltari_guerrillas.jpg Oracle:Shadow (This creature can block or be blocked by only creatures with shadow.)\n{0}: The next time Soltari Guerrillas would deal combat damage to an opponent this turn, it deals that damage to target creature instead. diff --git a/forge-gui/res/cardsfolder/s/song_of_blood.txt b/forge-gui/res/cardsfolder/s/song_of_blood.txt index 8801491a4e5..09475afcbd4 100644 --- a/forge-gui/res/cardsfolder/s/song_of_blood.txt +++ b/forge-gui/res/cardsfolder/s/song_of_blood.txt @@ -6,6 +6,6 @@ SVar:DBEffect:DB$ Effect | Name$ Song of Blood Effect | Triggers$ TrigAttacks | SVar:TrigAttacks:Mode$ Attacks | ValidCard$ Creature.YouCtrl | Execute$ Pump | TriggerDescription$ Whenever a creature attacks this turn, it gets +1/+0 until end of turn for each creature card put into your graveyard this way. SVar:Pump:DB$ Pump | Defined$ TriggeredAttacker | NumAtt$ +X | References$ X SVar:X:Remembered$Valid Creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/song_of_blood.jpg Oracle:Put the top four cards of your library into your graveyard.\nWhenever a creature attacks this turn, it gets +1/+0 until end of turn for each creature card put into your graveyard this way. diff --git a/forge-gui/res/cardsfolder/s/song_of_serenity.txt b/forge-gui/res/cardsfolder/s/song_of_serenity.txt index 1a79b62386d..4d5e8c88118 100644 --- a/forge-gui/res/cardsfolder/s/song_of_serenity.txt +++ b/forge-gui/res/cardsfolder/s/song_of_serenity.txt @@ -3,6 +3,6 @@ ManaCost:1 G Types:Enchantment S:Mode$ Continuous | Affected$ Creature.enchanted | AddHiddenKeyword$ CARDNAME can't attack or block. | Description$ Creatures that are enchanted can't attack or block. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/song_of_serenity.jpg Oracle:Creatures that are enchanted can't attack or block. diff --git a/forge-gui/res/cardsfolder/s/songs_of_the_damned.txt b/forge-gui/res/cardsfolder/s/songs_of_the_damned.txt index 9e9337105f4..d1427b86bf2 100644 --- a/forge-gui/res/cardsfolder/s/songs_of_the_damned.txt +++ b/forge-gui/res/cardsfolder/s/songs_of_the_damned.txt @@ -3,6 +3,6 @@ ManaCost:B Types:Instant A:SP$ Mana | Cost$ B | Produced$ B | Amount$ X | References$ X | SpellDescription$ Add {B} for each creature card in your graveyard. SVar:X:Count$TypeInYourYard.Creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/songs_of_the_damned.jpg Oracle:Add {B} for each creature card in your graveyard. diff --git a/forge-gui/res/cardsfolder/s/soot_imp.txt b/forge-gui/res/cardsfolder/s/soot_imp.txt index b301ead1071..f30cb6ceba3 100644 --- a/forge-gui/res/cardsfolder/s/soot_imp.txt +++ b/forge-gui/res/cardsfolder/s/soot_imp.txt @@ -5,6 +5,6 @@ PT:1/2 K:Flying T:Mode$ SpellCast | ValidCard$ Card.nonBlack | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever a player casts a nonblack spell, that player loses 1 life. SVar:TrigLoseLife:DB$LoseLife | Defined$ TriggeredActivator | LifeAmount$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/soot_imp.jpg Oracle:Flying\nWhenever a player casts a nonblack spell, that player loses 1 life. diff --git a/forge-gui/res/cardsfolder/s/soothsaying.txt b/forge-gui/res/cardsfolder/s/soothsaying.txt index 0f066a64dde..1daaad284a8 100644 --- a/forge-gui/res/cardsfolder/s/soothsaying.txt +++ b/forge-gui/res/cardsfolder/s/soothsaying.txt @@ -4,7 +4,7 @@ Types:Enchantment A:AB$ Shuffle | Cost$ 3 U U | Defined$ You | SpellDescription$ Shuffle your library. A:AB$ RearrangeTopOfLibrary | Cost$ X | Defined$ You | NumCards$ X | References$ X | SpellDescription$ Look at the top X cards of your library, then put them back in any order. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/soothsaying.jpg Oracle:{3}{U}{U}: Shuffle your library.\n{X}: Look at the top X cards of your library, then put them back in any order. diff --git a/forge-gui/res/cardsfolder/s/sophic_centaur.txt b/forge-gui/res/cardsfolder/s/sophic_centaur.txt index a5728f54ddc..70d7be7e714 100644 --- a/forge-gui/res/cardsfolder/s/sophic_centaur.txt +++ b/forge-gui/res/cardsfolder/s/sophic_centaur.txt @@ -4,6 +4,6 @@ Types:Creature Centaur Spellshaper PT:1/1 A:AB$ GainLife | Cost$ 2 G G T Discard<1/Card> | LifeAmount$ X | References$ X | SpellDescription$ You gain 2 life for each card in your hand. SVar:X:Count$CardsInYourHand/Times.2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sophic_centaur.jpg Oracle:{2}{G}{G}, {T}, Discard a card: You gain 2 life for each card in your hand. diff --git a/forge-gui/res/cardsfolder/s/soramaro_first_to_dream.txt b/forge-gui/res/cardsfolder/s/soramaro_first_to_dream.txt index 5273c077d8c..8a996bfcf98 100644 --- a/forge-gui/res/cardsfolder/s/soramaro_first_to_dream.txt +++ b/forge-gui/res/cardsfolder/s/soramaro_first_to_dream.txt @@ -6,7 +6,7 @@ K:Flying S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ CARDNAME's power and toughness are each equal to the number of cards in your hand. A:AB$ Draw | Cost$ 4 Return<1/Land> | NumCards$ 1 | SpellDescription$ Draw a card. SVar:X:Count$InYourHand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NeedsToPlayVar:X GE3 SVar:Picture:http://www.wizards.com/global/images/magic/general/soramaro_first_to_dream.jpg Oracle:Flying\nSoramaro, First to Dream's power and toughness are each equal to the number of cards in your hand.\n{4}, Return a land you control to its owner's hand: Draw a card. diff --git a/forge-gui/res/cardsfolder/s/soratami_cloud_chariot.txt b/forge-gui/res/cardsfolder/s/soratami_cloud_chariot.txt index a02ff8d016c..83cc370d6f4 100644 --- a/forge-gui/res/cardsfolder/s/soratami_cloud_chariot.txt +++ b/forge-gui/res/cardsfolder/s/soratami_cloud_chariot.txt @@ -3,6 +3,6 @@ ManaCost:5 Types:Artifact A:AB$ Pump | Cost$ 2 | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | KW$ Flying | SpellDescription$ Target creature you control gains flying until end of turn. A:AB$ Pump | Cost$ 2 | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | KW$ Prevent all combat damage that would be dealt to and dealt by CARDNAME. | SpellDescription$ Prevent all combat damage that would be dealt to and dealt by target creature you control this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/soratami_cloud_chariot.jpg Oracle:{2}: Target creature you control gains flying until end of turn.\n{2}: Prevent all combat damage that would be dealt to and dealt by target creature you control this turn. diff --git a/forge-gui/res/cardsfolder/s/soratami_cloudskater.txt b/forge-gui/res/cardsfolder/s/soratami_cloudskater.txt index 5704073e221..135923dfed5 100644 --- a/forge-gui/res/cardsfolder/s/soratami_cloudskater.txt +++ b/forge-gui/res/cardsfolder/s/soratami_cloudskater.txt @@ -5,6 +5,6 @@ PT:1/1 K:Flying A:AB$ Draw | Cost$ 2 Return<1/Land> | NumCards$ 1 | SpellDescription$ Draw a card, then discard a card. | SubAbility$ DBDiscard SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/soratami_cloudskater.jpg Oracle:Flying\n{2}, Return a land you control to its owner's hand: Draw a card, then discard a card. diff --git a/forge-gui/res/cardsfolder/s/soratami_mindsweeper.txt b/forge-gui/res/cardsfolder/s/soratami_mindsweeper.txt index 551b51dde2e..86ef5d1a12f 100644 --- a/forge-gui/res/cardsfolder/s/soratami_mindsweeper.txt +++ b/forge-gui/res/cardsfolder/s/soratami_mindsweeper.txt @@ -4,6 +4,6 @@ Types:Creature Moonfolk Wizard PT:1/4 K:Flying A:AB$ Mill | Cost$ 2 Return<1/Land> | NumCards$ 2 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player puts the top two cards of their library into their graveyard. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/soratami_mindsweeper.jpg Oracle:Flying\n{2}, Return a land you control to its owner's hand: Target player puts the top two cards of their library into their graveyard. diff --git a/forge-gui/res/cardsfolder/s/soratami_mirror_guard.txt b/forge-gui/res/cardsfolder/s/soratami_mirror_guard.txt index 882dad186c3..4f61d0f26ef 100644 --- a/forge-gui/res/cardsfolder/s/soratami_mirror_guard.txt +++ b/forge-gui/res/cardsfolder/s/soratami_mirror_guard.txt @@ -4,6 +4,6 @@ Types:Creature Moonfolk Wizard PT:3/1 K:Flying A:AB$ Pump | Cost$ 2 Return<1/Land> | ValidTgts$ Creature.powerLE2 | TgtPrompt$ Select target creature with power 2 or less | KW$ HIDDEN Unblockable | SpellDescription$ Target creature with power 2 or less can't be blocked this turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/soratami_mirror_guard.jpg Oracle:Flying\n{2}, Return a land you control to its owner's hand: Target creature with power 2 or less can't be blocked this turn. diff --git a/forge-gui/res/cardsfolder/s/soratami_mirror_mage.txt b/forge-gui/res/cardsfolder/s/soratami_mirror_mage.txt index 573df7a3a9b..a3995157d81 100644 --- a/forge-gui/res/cardsfolder/s/soratami_mirror_mage.txt +++ b/forge-gui/res/cardsfolder/s/soratami_mirror_mage.txt @@ -4,6 +4,6 @@ Types:Creature Moonfolk Wizard PT:2/1 K:Flying A:AB$ ChangeZone | Cost$ 3 Return<3/Land> | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/soratami_mirror_mage.jpg Oracle:Flying\n{3}, Return three lands you control to their owner's hand: Return target creature to its owner's hand. diff --git a/forge-gui/res/cardsfolder/s/soratami_rainshaper.txt b/forge-gui/res/cardsfolder/s/soratami_rainshaper.txt index 8af536865ed..ea6cdca6599 100644 --- a/forge-gui/res/cardsfolder/s/soratami_rainshaper.txt +++ b/forge-gui/res/cardsfolder/s/soratami_rainshaper.txt @@ -4,6 +4,6 @@ Types:Creature Moonfolk Wizard PT:2/1 K:Flying A:AB$ Pump | Cost$ 3 Return<1/Land> | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | KW$ Shroud | SpellDescription$ Target creature you control gains shroud until end of turn. (It can't be the target of spells or abilities.) -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/soratami_rainshaper.jpg Oracle:Flying\n{3}, Return a land you control to its owner's hand: Target creature you control gains shroud until end of turn. (It can't be the target of spells or abilities.) diff --git a/forge-gui/res/cardsfolder/s/soratami_seer.txt b/forge-gui/res/cardsfolder/s/soratami_seer.txt index 809c830c6ca..6c27773f52d 100644 --- a/forge-gui/res/cardsfolder/s/soratami_seer.txt +++ b/forge-gui/res/cardsfolder/s/soratami_seer.txt @@ -7,6 +7,6 @@ A:AB$ Discard | Cost$ 4 Return<2/Land> | Defined$ You | RememberDiscarded$ True SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/soratami_seer.jpg Oracle:Flying\n{4}, Return two lands you control to their owner's hand: Discard all the cards in your hand, then draw that many cards. diff --git a/forge-gui/res/cardsfolder/s/soraya_the_falconer.txt b/forge-gui/res/cardsfolder/s/soraya_the_falconer.txt index 7d4e5aa49f5..4cff4021ae4 100644 --- a/forge-gui/res/cardsfolder/s/soraya_the_falconer.txt +++ b/forge-gui/res/cardsfolder/s/soraya_the_falconer.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Human PT:2/2 S:Mode$ Continuous | Affected$ Creature.Bird | AddPower$ 1 | AddToughness$ 1 | Description$ Bird creatures get +1/+1. A:AB$ Pump | Cost$ 1 W | ValidTgts$ Creature.Bird | TgtPrompt$ Select target bird creature | KW$ Banding | SpellDescription$ Target Bird creature gains banding until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/soraya_the_falconer.jpg Oracle:Bird creatures get +1/+1.\n{1}{W}: Target Bird creature gains banding until end of turn. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding a player controls are blocking or being blocked by a creature, that player divides that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/s/sorcerous_sight.txt b/forge-gui/res/cardsfolder/s/sorcerous_sight.txt index 65b87eb803a..9a7d931813a 100644 --- a/forge-gui/res/cardsfolder/s/sorcerous_sight.txt +++ b/forge-gui/res/cardsfolder/s/sorcerous_sight.txt @@ -3,6 +3,6 @@ ManaCost:U Types:Sorcery A:SP$ RevealHand | Cost$ U | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | SubAbility$ DBDraw | SpellDescription$ Look at target opponent's hand. SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sorcerous_sight.jpg Oracle:Look at target opponent's hand.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/s/sorcerous_spyglass.txt b/forge-gui/res/cardsfolder/s/sorcerous_spyglass.txt index 8b28489bb75..ad67deb0e03 100644 --- a/forge-gui/res/cardsfolder/s/sorcerous_spyglass.txt +++ b/forge-gui/res/cardsfolder/s/sorcerous_spyglass.txt @@ -5,8 +5,8 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigPeek:DB$ RevealHand | ValidTgts$ Opponent | TgtPrompt$ Select an opponent | SubAbility$ DBNameCard SVar:DBNameCard:DB$ NameCard | Defined$ You S:Mode$ CantBeActivated | ValidCard$ Card.NamedCard | NonMana$ True | Description$ Activated abilities of sources with the chosen name can't be activated unless they're mana abilities. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random # TODO: Might improve AI logic to support it (the AI needs to pick cards that actually have activated nonmana abilities on them) -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sorcerous_spyglass.jpg Oracle:As Sorcerous Spyglass enters the battlefield, look at an opponent's hand, then choose any card name. Activated abilities of sources with the chosen name can't be activated unless they're mana abilities. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/soul_channeling.txt b/forge-gui/res/cardsfolder/s/soul_channeling.txt index acdca1f7994..ecc3bf81f39 100644 --- a/forge-gui/res/cardsfolder/s/soul_channeling.txt +++ b/forge-gui/res/cardsfolder/s/soul_channeling.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ 2 B | ValidTgts$ Creature | AILogic$ Pump A:AB$ Regenerate | Cost$ PayLife<2> | Defined$ Enchanted | SpellDescription$ Regenerate enchanted creature. SVar:NonStackingAttachEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_channeling.jpg Oracle:Enchant creature\nPay 2 life: Regenerate enchanted creature. diff --git a/forge-gui/res/cardsfolder/s/soul_conduit.txt b/forge-gui/res/cardsfolder/s/soul_conduit.txt index a8deba2d4a5..19717637587 100644 --- a/forge-gui/res/cardsfolder/s/soul_conduit.txt +++ b/forge-gui/res/cardsfolder/s/soul_conduit.txt @@ -2,6 +2,6 @@ Name:Soul Conduit ManaCost:6 Types:Artifact A:AB$ ExchangeLife | Cost$ 6 T | ValidTgts$ Player | TargetMin$ 2 | TargetMax$ 2 | TgtPrompt$ Select target player | SpellDescription$ Two target players exchange life totals. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_conduit.jpg Oracle:{6}, {T}: Two target players exchange life totals. diff --git a/forge-gui/res/cardsfolder/s/soul_exchange.txt b/forge-gui/res/cardsfolder/s/soul_exchange.txt index 53135937267..d3ba25cf4dd 100644 --- a/forge-gui/res/cardsfolder/s/soul_exchange.txt +++ b/forge-gui/res/cardsfolder/s/soul_exchange.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ ChangeZone | Cost$ B B Exile<1/Creature> | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Select target creature card in your graveyard | ValidTgts$ Creature.YouOwn | SubAbility$ DBPutCounter | SpellDescription$ Return target creature card from your graveyard to the battlefield. Put a +2/+2 counter on that creature if the exiled creature was a Thrull. SVar:DBPutCounter:DB$PutCounter | CounterNum$ X | CounterType$ P2P2 | Defined$ Targeted SVar:X:Exiled$Valid Thrull -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_exchange.jpg Oracle:As an additional cost to cast Soul Exchange, exile a creature you control.\nReturn target creature card from your graveyard to the battlefield. Put a +2/+2 counter on that creature if the exiled creature was a Thrull. diff --git a/forge-gui/res/cardsfolder/s/soul_kiss.txt b/forge-gui/res/cardsfolder/s/soul_kiss.txt index 59a3fdd304e..6e2e1f13cb9 100644 --- a/forge-gui/res/cardsfolder/s/soul_kiss.txt +++ b/forge-gui/res/cardsfolder/s/soul_kiss.txt @@ -4,7 +4,7 @@ Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ 2 B | ValidTgts$ Creature | AILogic$ Pump A:AB$ Pump | Cost$ B PayLife<1> | Defined$ Enchanted | NumAtt$ +2 | NumDef$ +2 | ActivationLimit$ 3 | SpellDescription$ Enchanted creature gets +2/+2 until end of turn. Activate this ability no more than three times each turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingAttachEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_kiss.jpg Oracle:Enchant creature\n{B}, Pay 1 life: Enchanted creature gets +2/+2 until end of turn. Activate this ability no more than three times each turn. diff --git a/forge-gui/res/cardsfolder/s/soul_of_magma.txt b/forge-gui/res/cardsfolder/s/soul_of_magma.txt index 09d53988912..6dc7b5d6b12 100644 --- a/forge-gui/res/cardsfolder/s/soul_of_magma.txt +++ b/forge-gui/res/cardsfolder/s/soul_of_magma.txt @@ -5,7 +5,7 @@ PT:2/2 T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, CARDNAME deals 1 damage to target creature. SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 1 SVar:BuffedBy:Arcane,Spirit -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_of_magma.jpg Oracle:Whenever you cast a Spirit or Arcane spell, Soul of Magma deals 1 damage to target creature. diff --git a/forge-gui/res/cardsfolder/s/soul_rend.txt b/forge-gui/res/cardsfolder/s/soul_rend.txt index d49d74e1121..e55f69189c0 100644 --- a/forge-gui/res/cardsfolder/s/soul_rend.txt +++ b/forge-gui/res/cardsfolder/s/soul_rend.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Destroy | Cost$ 1 B | ValidTgts$ Creature | AITgts$ Card.White | TgtPrompt$ Select target creature | ConditionDefined$ Targeted | ConditionPresent$ Creature.White | ConditionCompare$ EQ1 | NoRegen$ True | SubAbility$ DelTrigSlowtrip | SpellDescription$ Destroy target creature if it's white. A creature destroyed this way can't be regenerated. Draw a card at the beginning of the next turn's upkeep. SVar:DelTrigSlowtrip:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ DrawSlowtrip | TriggerDescription$ Draw a card. SVar:DrawSlowtrip:DB$Draw | NumCards$ 1 | Defined$ You -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_rend.jpg Oracle:Destroy target creature if it's white. A creature destroyed this way can't be regenerated.\nDraw a card at the beginning of the next turn's upkeep. diff --git a/forge-gui/res/cardsfolder/s/soul_sculptor.txt b/forge-gui/res/cardsfolder/s/soul_sculptor.txt index b9dcb51f5be..eddc467b722 100644 --- a/forge-gui/res/cardsfolder/s/soul_sculptor.txt +++ b/forge-gui/res/cardsfolder/s/soul_sculptor.txt @@ -3,6 +3,6 @@ ManaCost:2 W Types:Creature Human PT:1/1 A:AB$ Animate | Cost$ 1 W T | ValidTgts$ Creature | Types$ Enchantment | RemoveAllAbilities$ True | RemoveCardTypes$ True | UntilAPlayerCastSpell$ Creature | SpellDescription$ Target creature becomes an enchantment and loses all abilities until a player casts a creature spell. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_sculptor.jpg Oracle:{1}{W}, {T}: Target creature becomes an enchantment and loses all abilities until a player casts a creature spell. diff --git a/forge-gui/res/cardsfolder/s/soul_seizer_ghastly_haunting.txt b/forge-gui/res/cardsfolder/s/soul_seizer_ghastly_haunting.txt index 4763c0ec576..26b0fb3f09c 100644 --- a/forge-gui/res/cardsfolder/s/soul_seizer_ghastly_haunting.txt +++ b/forge-gui/res/cardsfolder/s/soul_seizer_ghastly_haunting.txt @@ -19,6 +19,6 @@ Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ 0 | ValidTgts$ Creature | AILogic$ GainControl S:Mode$ Continuous | Affected$ Card.EnchantedBy | GainControl$ You | Description$ You control enchanted creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ghastly_haunting.jpg Oracle:Enchant creature\nYou control enchanted creature. diff --git a/forge-gui/res/cardsfolder/s/soul_snuffers.txt b/forge-gui/res/cardsfolder/s/soul_snuffers.txt index 4837d02314c..d9060798ff4 100644 --- a/forge-gui/res/cardsfolder/s/soul_snuffers.txt +++ b/forge-gui/res/cardsfolder/s/soul_snuffers.txt @@ -4,6 +4,6 @@ Types:Creature Elemental Shaman PT:3/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigPutCounterAll | TriggerDescription$ When CARDNAME enters the battlefield, put a -1/-1 counter on each creature. SVar:TrigPutCounterAll:DB$ PutCounterAll | ValidCards$ Creature | CounterType$ M1M1 | CounterNum$ 1 | IsCurse$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_snuffers.jpg Oracle:When Soul Snuffers enters the battlefield, put a -1/-1 counter on each creature. diff --git a/forge-gui/res/cardsfolder/s/soul_strings.txt b/forge-gui/res/cardsfolder/s/soul_strings.txt index f5fde3e79b9..0c085bb2694 100644 --- a/forge-gui/res/cardsfolder/s/soul_strings.txt +++ b/forge-gui/res/cardsfolder/s/soul_strings.txt @@ -3,6 +3,6 @@ ManaCost:X B Types:Sorcery A:SP$ ChangeZone | Cost$ X B | Origin$ Graveyard | Destination$ Hand | TargetMin$ 2 | TargetMax$ 2 | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | UnlessCost$ X | UnlessPayer$ Player | References$ X | SpellDescription$ Return two target creature cards from your graveyard to your hand unless any player pays {X}. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_strings.jpg Oracle:Return two target creature cards from your graveyard to your hand unless any player pays {X}. diff --git a/forge-gui/res/cardsfolder/s/soulblast.txt b/forge-gui/res/cardsfolder/s/soulblast.txt index 6cd61082d21..10d135107d8 100644 --- a/forge-gui/res/cardsfolder/s/soulblast.txt +++ b/forge-gui/res/cardsfolder/s/soulblast.txt @@ -3,6 +3,6 @@ ManaCost:3 R R R Types:Instant A:SP$ DealDamage | Cost$ 3 R R R Sac | NumDmg$ X | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | CostDesc$ As an additional cost to cast CARDNAME, sacrifice all creatures you control. | SpellDescription$ CARDNAME deals damage to any target equal to the total power of the sacrificed creatures. SVar:X:Sacrificed$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/soulblast.jpg Oracle:As an additional cost to cast Soulblast, sacrifice all creatures you control.\nSoulblast deals damage to any target equal to the total power of the sacrificed creatures. diff --git a/forge-gui/res/cardsfolder/s/soulbright_flamekin.txt b/forge-gui/res/cardsfolder/s/soulbright_flamekin.txt index 96dfd36e626..461c9902209 100644 --- a/forge-gui/res/cardsfolder/s/soulbright_flamekin.txt +++ b/forge-gui/res/cardsfolder/s/soulbright_flamekin.txt @@ -9,6 +9,6 @@ SVar:SoulbrightNum:Number$0 T:Mode$ Phase | Phase$ Cleanup | Execute$ TrigReset | Static$ True T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigReset | Static$ True SVar:TrigReset:DB$ StoreSVar | SVar$ SoulbrightNum | Type$ Number | Expression$ 0 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/soulbright_flamekin.jpg Oracle:{2}: Target creature gains trample until end of turn. If this is the third time this ability has resolved this turn, you may add {R}{R}{R}{R}{R}{R}{R}{R}. diff --git a/forge-gui/res/cardsfolder/s/soulcatchers_aerie.txt b/forge-gui/res/cardsfolder/s/soulcatchers_aerie.txt index 40028bde110..fa730e6879e 100644 --- a/forge-gui/res/cardsfolder/s/soulcatchers_aerie.txt +++ b/forge-gui/res/cardsfolder/s/soulcatchers_aerie.txt @@ -5,6 +5,6 @@ S:Mode$ Continuous | Affected$ Creature.Bird | AddPower$ X | AddToughness$ X | D T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Bird.YouOwn | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a Bird is put into your graveyard from the battlefield, put a feather counter on CARDNAME. SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ FEATHER | CounterNum$ 1 SVar:X:Count$CardCounters.FEATHER -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/soulcatchers_aerie.jpg Oracle:Whenever a Bird is put into your graveyard from the battlefield, put a feather counter on Soulcatchers' Aerie.\nBird creatures get +1/+1 for each feather counter on Soulcatchers' Aerie. diff --git a/forge-gui/res/cardsfolder/s/souldrinker.txt b/forge-gui/res/cardsfolder/s/souldrinker.txt index 7394b8ced61..6636ad6fee5 100644 --- a/forge-gui/res/cardsfolder/s/souldrinker.txt +++ b/forge-gui/res/cardsfolder/s/souldrinker.txt @@ -3,6 +3,6 @@ ManaCost:3 B Types:Creature Spirit PT:2/2 A:AB$ PutCounter | Cost$ PayLife<3> | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on CARDNAME. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/souldrinker.jpg Oracle:Pay 3 life: Put a +1/+1 counter on Souldrinker. diff --git a/forge-gui/res/cardsfolder/s/soulgorger_orgg.txt b/forge-gui/res/cardsfolder/s/soulgorger_orgg.txt index c79b7af5676..ebb908a119a 100644 --- a/forge-gui/res/cardsfolder/s/soulgorger_orgg.txt +++ b/forge-gui/res/cardsfolder/s/soulgorger_orgg.txt @@ -10,6 +10,6 @@ SVar:LifePaidOnETB:Number$0 SVar:LifeAllButOne:Count$YourLifeTotal/Minus.1 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Creature.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME leaves the battlefield, you gain life equal to the life you lost when it entered the battlefield. SVar:TrigGainLife:DB$ GainLife | LifeAmount$ LifePaidOnETB | References$ LifePaidOnETB -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/soulgorger_orgg.jpg Oracle:Trample\nWhen Soulgorger Orgg enters the battlefield, you lose all but 1 life.\nWhen Soulgorger Orgg leaves the battlefield, you gain life equal to the life you lost when it entered the battlefield. diff --git a/forge-gui/res/cardsfolder/s/soulless_one.txt b/forge-gui/res/cardsfolder/s/soulless_one.txt index 6703052e798..5ef1453762d 100644 --- a/forge-gui/res/cardsfolder/s/soulless_one.txt +++ b/forge-gui/res/cardsfolder/s/soulless_one.txt @@ -5,7 +5,7 @@ PT:*/* S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ CARDNAME's power and toughness are each equal to the number of Zombies on the battlefield plus the number of Zombie cards in all graveyards. SVar:X:Count$TypeOnBattlefield.Zombie/Plus.Y SVar:Y:Count$TypeInAllYards.Zombie -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NoZeroToughnessAI:True SVar:Picture:http://www.wizards.com/global/images/magic/general/soulless_one.jpg Oracle:Soulless One's power and toughness are each equal to the number of Zombies on the battlefield plus the number of Zombie cards in all graveyards. diff --git a/forge-gui/res/cardsfolder/s/souls_grace.txt b/forge-gui/res/cardsfolder/s/souls_grace.txt index db0861d2089..4a7b5a769f6 100644 --- a/forge-gui/res/cardsfolder/s/souls_grace.txt +++ b/forge-gui/res/cardsfolder/s/souls_grace.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Pump | Cost$ 1 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBGainLife | SpellDescription$ You gain life equal to target creature's power. SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ X SVar:X:Targeted$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/souls_grace.jpg Oracle:You gain life equal to target creature's power. diff --git a/forge-gui/res/cardsfolder/s/souls_might.txt b/forge-gui/res/cardsfolder/s/souls_might.txt index fc40a5f559e..1bd77fcca00 100644 --- a/forge-gui/res/cardsfolder/s/souls_might.txt +++ b/forge-gui/res/cardsfolder/s/souls_might.txt @@ -3,6 +3,6 @@ ManaCost:4 G Types:Sorcery A:SP$ PutCounter | Cost$ 4 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ X | References$ X | SpellDescription$ Put X +1/+1 counters on target creature, where X is that creature's power. SVar:X:Targeted$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/souls_might.jpg Oracle:Put X +1/+1 counters on target creature, where X is that creature's power. diff --git a/forge-gui/res/cardsfolder/s/soultether_golem.txt b/forge-gui/res/cardsfolder/s/soultether_golem.txt index da0fa8b69af..dfef8953bc4 100644 --- a/forge-gui/res/cardsfolder/s/soultether_golem.txt +++ b/forge-gui/res/cardsfolder/s/soultether_golem.txt @@ -5,6 +5,6 @@ PT:3/3 K:Vanishing:1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever another creature enters the battlefield under your control, put a time counter on CARDNAME. SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ TIME | CounterNum$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/soultether_golem.jpg Oracle:Vanishing 1 (This permanent enters the battlefield with a time counter on it. At the beginning of your upkeep, remove a time counter from it. When the last is removed, sacrifice it.)\nWhenever another creature enters the battlefield under your control, put a time counter on Soultether Golem. diff --git a/forge-gui/res/cardsfolder/s/southern_paladin.txt b/forge-gui/res/cardsfolder/s/southern_paladin.txt index e5a42801a99..1935c861bfa 100644 --- a/forge-gui/res/cardsfolder/s/southern_paladin.txt +++ b/forge-gui/res/cardsfolder/s/southern_paladin.txt @@ -3,6 +3,6 @@ ManaCost:2 W W Types:Creature Human Knight PT:3/3 A:AB$ Destroy | Cost$ W W T | ValidTgts$ Permanent.Red | TgtPrompt$ Select target red permanent | SpellDescription$ Destroy target red permanent. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/southern_paladin.jpg Oracle:{W}{W}, {T}: Destroy target red permanent. diff --git a/forge-gui/res/cardsfolder/s/sovereigns_of_lost_alara.txt b/forge-gui/res/cardsfolder/s/sovereigns_of_lost_alara.txt index 59806eec125..077b41e0bf4 100644 --- a/forge-gui/res/cardsfolder/s/sovereigns_of_lost_alara.txt +++ b/forge-gui/res/cardsfolder/s/sovereigns_of_lost_alara.txt @@ -6,6 +6,6 @@ K:Exalted T:Mode$ Attacks | ValidCard$ Creature.YouCtrl | Alone$ True | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigSearch | TriggerDescription$ Whenever a creature you control attacks alone, you may search your library for an Aura card that could enchant that creature, put it onto the battlefield attached to that creature, then shuffle your library. SVar:TrigSearch:DB$ Pump | RememberObjects$ TriggeredAttacker | SubAbility$ DBMoveAura SVar:DBMoveAura:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Aura.CanEnchantRemembered+YouCtrl | AttachedTo$ Remembered | ChangeNum$ 1 | Hidden$ True | ShuffleNonMandatory$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sovereigns_of_lost_alara.jpg Oracle:Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.)\nWhenever a creature you control attacks alone, you may search your library for an Aura card that could enchant that creature, put it onto the battlefield attached to that creature, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/s/spare_from_evil.txt b/forge-gui/res/cardsfolder/s/spare_from_evil.txt index 229b2e39efd..e16bfc81e0b 100644 --- a/forge-gui/res/cardsfolder/s/spare_from_evil.txt +++ b/forge-gui/res/cardsfolder/s/spare_from_evil.txt @@ -2,6 +2,6 @@ Name:Spare from Evil ManaCost:1 W Types:Instant A:SP$ PumpAll | Cost$ 1 W | ValidCards$ Creature.YouCtrl | KW$ Protection:Creature.nonHuman:Protection from non-Human creatures. | SpellDescription$ Creatures you control gain protection from non-Human creatures until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/spare_from_evil.jpg Oracle:Creatures you control gain protection from non-Human creatures until end of turn. diff --git a/forge-gui/res/cardsfolder/s/spark_of_creativity.txt b/forge-gui/res/cardsfolder/s/spark_of_creativity.txt index 35e45eebbe0..a4259ff8fa9 100644 --- a/forge-gui/res/cardsfolder/s/spark_of_creativity.txt +++ b/forge-gui/res/cardsfolder/s/spark_of_creativity.txt @@ -9,6 +9,6 @@ SVar:SparkPlay:DB$ Effect | RememberObjects$ RememberedCard | StaticAbilities$ P SVar:Play:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may play remembered card. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$RememberedCardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/spark_of_creativity.jpg Oracle:Choose target creature. Exile the top card of your library. You may have Spark of Creativity deal damage to that creature equal to the exiled card's converted mana cost. If you don't, you may play that card until end of turn. diff --git a/forge-gui/res/cardsfolder/s/sparksmith.txt b/forge-gui/res/cardsfolder/s/sparksmith.txt index f0abb7943e8..31a899c0a7c 100644 --- a/forge-gui/res/cardsfolder/s/sparksmith.txt +++ b/forge-gui/res/cardsfolder/s/sparksmith.txt @@ -5,6 +5,6 @@ PT:1/1 A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | References$ X | SubAbility$ DBDealDamage | SpellDescription$ CARDNAME deals X damage to target creature and X damage to you, where X is the number of Goblins on the battlefield. SVar:DBDealDamage:DB$ DealDamage | Defined$ You | NumDmg$ X | References$ X SVar:X:Count$TypeOnBattlefield.Goblin -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://resources.wizards.com/magic/cards/ons/en-us/card39476.jpg Oracle:{T}: Sparksmith deals X damage to target creature and X damage to you, where X is the number of Goblins on the battlefield. diff --git a/forge-gui/res/cardsfolder/s/sparkspitter.txt b/forge-gui/res/cardsfolder/s/sparkspitter.txt index 82202fc7084..51336347241 100644 --- a/forge-gui/res/cardsfolder/s/sparkspitter.txt +++ b/forge-gui/res/cardsfolder/s/sparkspitter.txt @@ -4,6 +4,6 @@ Types:Creature Elemental Spellshaper PT:1/3 A:AB$ Token | Cost$ R T Discard<1/Card> | TokenAmount$ 1 | TokenName$ Spark Elemental | TokenTypes$ Creature,Elemental | TokenOwner$ You | TokenColors$ Red | TokenPower$ 3 | TokenToughness$ 1 | TokenKeywords$ Haste<>Trample | AtEOTTrig$ Sacrifice | TokenSVars$ SparkspitterEOT | SpellDescription$ Create a 3/1 red Elemental creature token named Spark Elemental. It has trample, haste, and "At the beginning of the end step, sacrifice Spark Elemental." SVar:SparkspitterEOT:SVar:EndOfTurnLeavePlay:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://resources.wizards.com/magic/cards/fut/en-us/card130341.jpg Oracle:{R}, {T}, Discard a card: Create a 3/1 red Elemental creature token named Spark Elemental. It has trample, haste, and "At the beginning of the end step, sacrifice Spark Elemental." diff --git a/forge-gui/res/cardsfolder/s/spatial_binding.txt b/forge-gui/res/cardsfolder/s/spatial_binding.txt index 8f998717717..c78a87ac514 100644 --- a/forge-gui/res/cardsfolder/s/spatial_binding.txt +++ b/forge-gui/res/cardsfolder/s/spatial_binding.txt @@ -2,7 +2,7 @@ Name:Spatial Binding ManaCost:U B Types:Enchantment A:AB$ Pump | Cost$ PayLife<1> | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | KW$ HIDDEN CARDNAME can't phase out. | AITgts$ Permanent.withPhasing+YouCtrl | UntilYourNextUpkeep$ True | SpellDescription$ Until your next upkeep, target permanent can't phase out. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/spatial_binding.jpg Oracle:Pay 1 life: Until your next upkeep, target permanent can't phase out. diff --git a/forge-gui/res/cardsfolder/s/spawnbinder_mage.txt b/forge-gui/res/cardsfolder/s/spawnbinder_mage.txt index 2b9305c61e7..8c1d218576e 100644 --- a/forge-gui/res/cardsfolder/s/spawnbinder_mage.txt +++ b/forge-gui/res/cardsfolder/s/spawnbinder_mage.txt @@ -3,7 +3,7 @@ ManaCost:3 W Types:Creature Human Wizard Ally PT:2/4 A:AB$ Tap | Cost$ T tapXType<1/Ally> | ValidTgts$ Creature | TgtPrompt$ Select target creature | PrecostDesc$ Cohort — | SpellDescription$ Tap target creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHints:Type$Ally SVar:Picture:http://www.wizards.com/global/images/magic/general/spawnbinder_mage.jpg Oracle:Cohort — {T}, Tap an untapped Ally you control: Tap target creature. diff --git a/forge-gui/res/cardsfolder/s/spawnbroker.txt b/forge-gui/res/cardsfolder/s/spawnbroker.txt index 734aa845609..16b703e4f82 100644 --- a/forge-gui/res/cardsfolder/s/spawnbroker.txt +++ b/forge-gui/res/cardsfolder/s/spawnbroker.txt @@ -5,6 +5,6 @@ PT:1/1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigExchange | TriggerDescription$ When CARDNAME enters the battlefield, you may exchange control of target creature you control and target creature with power less than or equal to that creature's power an opponent controls. SVar:TrigExchange:DB$ Pump | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | SubAbility$ DBExchange SVar:DBExchange:DB$ ExchangeControl | Defined$ ParentTarget | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls with less or equal power | TargetsWithRelatedProperty$ LEPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/spawnbroker.jpg Oracle:When Spawnbroker enters the battlefield, you may exchange control of target creature you control and target creature with power less than or equal to that creature's power an opponent controls. diff --git a/forge-gui/res/cardsfolder/s/spawning_pit.txt b/forge-gui/res/cardsfolder/s/spawning_pit.txt index 8156fe0cb15..4240a8b0d33 100644 --- a/forge-gui/res/cardsfolder/s/spawning_pit.txt +++ b/forge-gui/res/cardsfolder/s/spawning_pit.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact A:AB$ PutCounter | Cost$ Sac<1/Creature> | Defined$ Self | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. A:AB$ Token | Cost$ 1 SubCounter<2/CHARGE> | TokenAmount$ 1 | TokenController$ You | TokenName$ Spawn | TokenTypes$ Artifact,Creature,Spawn | TokenColors$ Colorless | TokenPower$ 2 | TokenToughness$ 2 | SpellDescription$ Create a 2/2 colorless Spawn artifact creature token. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/spawning_pit.jpg Oracle:Sacrifice a creature: Put a charge counter on Spawning Pit.\n{1}, Remove two charge counters from Spawning Pit: Create a 2/2 colorless Spawn artifact creature token. diff --git a/forge-gui/res/cardsfolder/s/species_gorger.txt b/forge-gui/res/cardsfolder/s/species_gorger.txt index 4916bc3d387..9bec063a0ad 100644 --- a/forge-gui/res/cardsfolder/s/species_gorger.txt +++ b/forge-gui/res/cardsfolder/s/species_gorger.txt @@ -6,6 +6,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigBounce | Trigger SVar:TrigBounce:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Mandatory$ True | Hidden$ True | ChangeType$ Creature.YouCtrl SVar:NeedsToPlayVar:Z GE2 SVar:Z:Count$Valid Creature.YouCtrl+inZoneBattlefield -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/species_gorger.jpg Oracle:At the beginning of your upkeep, return a creature you control to its owner's hand. diff --git a/forge-gui/res/cardsfolder/s/spectral_searchlight.txt b/forge-gui/res/cardsfolder/s/spectral_searchlight.txt index 200af7cb723..dd4e0aa8af2 100644 --- a/forge-gui/res/cardsfolder/s/spectral_searchlight.txt +++ b/forge-gui/res/cardsfolder/s/spectral_searchlight.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact A:AB$ ChoosePlayer | Cost$ T | Defined$ You | Choices$ Player | ChoiceTitle$ Choose a player | SubAbility$ DBMana | SpellDescription$ Choose a player. That player adds one mana of any color they choose. SVar:DBMana:DB$ Mana | Produced$ Any | Defined$ ChosenPlayer -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/spectral_searchlight.jpg Oracle:{T}: Choose a player. That player adds one mana of any color they choose. diff --git a/forge-gui/res/cardsfolder/s/spectral_shift.txt b/forge-gui/res/cardsfolder/s/spectral_shift.txt index a282eceb3c3..f7b9a38dbff 100644 --- a/forge-gui/res/cardsfolder/s/spectral_shift.txt +++ b/forge-gui/res/cardsfolder/s/spectral_shift.txt @@ -5,7 +5,7 @@ K:Entwine:2 A:SP$ Charm | Cost$ 1 U | Choices$ DBBasicLand,DBColor SVar:DBBasicLand:DB$ ChangeText | ValidTgts$ Card | TgtZone$ Stack,Battlefield | TgtPrompt$ Choose target spell or permanent | ChangeTypeWord$ ChooseBasicLandType ChooseBasicLandType | Permanent$ True | SpellDescription$ Change the text of target spell or permanent by replacing all instances of one basic land type with another. (This effect lasts indefinitely.) SVar:DBColor:DB$ ChangeText | ValidTgts$ Card | TgtZone$ Stack,Battlefield | TgtPrompt$ Choose target spell or permanent | ChangeColorWord$ Choose Choose | Permanent$ True | SpellDescription$ Change the text of target spell or permanent by replacing all instances of one color word with another. (This effect lasts indefinitely.) -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/spectral_shift.jpg Oracle:Choose one —\n• Change the text of target spell or permanent by replacing all instances of one basic land type with another. (This effect last indefinitely.)\n• Change the text of target spell or permanent by replacing all instances of one color word with another. (This effect last indefinitely.)\nEntwine {2} (Choose both if you pay the entwine cost.) diff --git a/forge-gui/res/cardsfolder/s/spell_contortion.txt b/forge-gui/res/cardsfolder/s/spell_contortion.txt index 6e9fd55b3e2..6a38ac49933 100644 --- a/forge-gui/res/cardsfolder/s/spell_contortion.txt +++ b/forge-gui/res/cardsfolder/s/spell_contortion.txt @@ -5,6 +5,6 @@ A:SP$ Counter | Cost$ 2 U | TargetType$ Spell | TgtPrompt$ Select target spell | K:Multikicker:1 U SVar:DBDraw:DB$ Draw | NumCards$ X | References$ X SVar:X:Count$TimesKicked -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/spell_contortion.jpg Oracle:Multikicker {1}{U} (You may pay an additional {1}{U} any number of times as you cast this spell.)\nCounter target spell unless its controller pays {2}. Draw a card for each time Spell Contortion was kicked. diff --git a/forge-gui/res/cardsfolder/s/spellbinder.txt b/forge-gui/res/cardsfolder/s/spellbinder.txt index 173f9524dbd..6f35645ab1b 100644 --- a/forge-gui/res/cardsfolder/s/spellbinder.txt +++ b/forge-gui/res/cardsfolder/s/spellbinder.txt @@ -11,6 +11,6 @@ SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True #Amount$ All | CopyOnce$ True for Strionic Resonator SVar:NeedsToPlayVar:Z GE1 SVar:Z:Count$ValidHand Card.Instant+YouOwn -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/spellbinder.jpg Oracle:Imprint — When Spellbinder enters the battlefield, you may exile an instant card from your hand.\nWhenever equipped creature deals combat damage to a player, you may copy the exiled card. If you do, you may cast the copy without paying its mana cost.\nEquip {4} diff --git a/forge-gui/res/cardsfolder/s/spellbook.txt b/forge-gui/res/cardsfolder/s/spellbook.txt index 84860423487..f8992209c55 100644 --- a/forge-gui/res/cardsfolder/s/spellbook.txt +++ b/forge-gui/res/cardsfolder/s/spellbook.txt @@ -2,7 +2,7 @@ Name:Spellbook ManaCost:0 Types:Artifact S:Mode$ Continuous | Affected$ You | SetMaxHandSize$ Unlimited | Description$ You have no maximum hand size. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/spellbook.jpg Oracle:You have no maximum hand size. diff --git a/forge-gui/res/cardsfolder/s/spellshift.txt b/forge-gui/res/cardsfolder/s/spellshift.txt index 08e6684002c..eb6e3f044d2 100644 --- a/forge-gui/res/cardsfolder/s/spellshift.txt +++ b/forge-gui/res/cardsfolder/s/spellshift.txt @@ -6,6 +6,6 @@ SVar:DBDig:DB$ DigUntil | Defined$ TargetedController | Valid$ Instant,Sorcery | SVar:DBPlay:DB$ Play | Defined$ Remembered | Controller$ TargetedController | WithoutManaCost$ True | Optional$ True | SubAbility$ DBShuffle SVar:DBShuffle:DB$ Shuffle | Defined$ TargetedController | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/spellshift.jpg Oracle:Counter target instant or sorcery spell. Its controller reveals cards from the top of their library until they reveal an instant or sorcery card. That player may cast that card without paying its mana cost. Then they shuffle their library. diff --git a/forge-gui/res/cardsfolder/s/spellshock.txt b/forge-gui/res/cardsfolder/s/spellshock.txt index 693dc79c04e..1e9008c91ba 100644 --- a/forge-gui/res/cardsfolder/s/spellshock.txt +++ b/forge-gui/res/cardsfolder/s/spellshock.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Enchantment T:Mode$ SpellCast | ValidCard$ Card | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player casts a spell, CARDNAME deals 2 damage to that player. SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredActivator | NumDmg$ 2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/spellshock.jpg Oracle:Whenever a player casts a spell, Spellshock deals 2 damage to that player. diff --git a/forge-gui/res/cardsfolder/s/spelltwine.txt b/forge-gui/res/cardsfolder/s/spelltwine.txt index c1296d96319..87e3b6f5ec5 100644 --- a/forge-gui/res/cardsfolder/s/spelltwine.txt +++ b/forge-gui/res/cardsfolder/s/spelltwine.txt @@ -6,6 +6,6 @@ SVar:TgtOpp:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ SVar:CopyYou:DB$ CopySpellAbility | Defined$ Remembered | SubAbility$ CopyOpp | CopyMultipleSpells$ 2 | SubAbility$ ExileSelf SVar:ExileSelf:DB$ ChangeZone | Origin$ Stack | Destination$ Exile | Defined$ Self | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/spelltwine.jpg Oracle:Exile target instant or sorcery card from your graveyard and target instant or sorcery card from an opponent's graveyard. Copy those cards. Cast the copies if able without paying their mana costs. Exile Spelltwine. diff --git a/forge-gui/res/cardsfolder/s/spellweaver_helix.txt b/forge-gui/res/cardsfolder/s/spellweaver_helix.txt index 7975a227cc7..437b856571f 100644 --- a/forge-gui/res/cardsfolder/s/spellweaver_helix.txt +++ b/forge-gui/res/cardsfolder/s/spellweaver_helix.txt @@ -9,7 +9,7 @@ SVar:DBPlay:DB$ Play | Defined$ ValidAll Card.IsImprinted+doesNotShareNameWith R SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True T:Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Card.Self | Destination$ Any | Execute$ DBCleanImprinted | Static$ True SVar:DBCleanImprinted:DB$ Cleanup | ClearImprinted$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/spellweaver_helix.jpg Oracle:Imprint — When Spellweaver Helix enters the battlefield, you may exile two target sorcery cards from a single graveyard.\nWhenever a player casts a card, if it has the same name as one of the cards exiled with Spellweaver Helix, you may copy the other. If you do, you may cast the copy without paying its mana cost. diff --git a/forge-gui/res/cardsfolder/s/spellweaver_volute.txt b/forge-gui/res/cardsfolder/s/spellweaver_volute.txt index 75ba2a5ddbb..513f0e685b7 100644 --- a/forge-gui/res/cardsfolder/s/spellweaver_volute.txt +++ b/forge-gui/res/cardsfolder/s/spellweaver_volute.txt @@ -10,7 +10,7 @@ SVar:DBChooseCard:DB$ ChooseCard | Choices$ Instant | ChoiceZone$ Graveyard | Am SVar:DBAttach:DB$ Attach | Defined$ ChosenCard | Object$ Self | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/spellweaver_volute.jpg Oracle:Enchant instant card in a graveyard\nWhenever you cast a sorcery spell, copy the enchanted instant card. You may cast the copy without paying its mana cost. If you do, exile the enchanted card and attach Spellweaver Volute to another instant card in a graveyard. diff --git a/forge-gui/res/cardsfolder/s/sphere_of_duty.txt b/forge-gui/res/cardsfolder/s/sphere_of_duty.txt index 04084315b85..ec1754c3651 100644 --- a/forge-gui/res/cardsfolder/s/sphere_of_duty.txt +++ b/forge-gui/res/cardsfolder/s/sphere_of_duty.txt @@ -2,6 +2,6 @@ Name:Sphere of Duty ManaCost:3 W Types:Enchantment S:Mode$ PreventDamage | Target$ You | Source$ Card.GreenSource | Amount$ 2 | Description$ If a green source would deal damage to you, prevent 2 of that damage. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sphere_of_duty.jpg Oracle:If a green source would deal damage to you, prevent 2 of that damage. diff --git a/forge-gui/res/cardsfolder/s/sphere_of_grace.txt b/forge-gui/res/cardsfolder/s/sphere_of_grace.txt index 49efbee8943..d8e72c522fd 100644 --- a/forge-gui/res/cardsfolder/s/sphere_of_grace.txt +++ b/forge-gui/res/cardsfolder/s/sphere_of_grace.txt @@ -2,6 +2,6 @@ Name:Sphere of Grace ManaCost:3 W Types:Enchantment S:Mode$ PreventDamage | Target$ You | Source$ Card.BlackSource | Amount$ 2 | Description$ If a black source would deal damage to you, prevent 2 of that damage. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sphere_of_grace.jpg Oracle:If a black source would deal damage to you, prevent 2 of that damage. diff --git a/forge-gui/res/cardsfolder/s/sphere_of_law.txt b/forge-gui/res/cardsfolder/s/sphere_of_law.txt index b2aa51d6a17..d52cd7e380b 100644 --- a/forge-gui/res/cardsfolder/s/sphere_of_law.txt +++ b/forge-gui/res/cardsfolder/s/sphere_of_law.txt @@ -2,6 +2,6 @@ Name:Sphere of Law ManaCost:3 W Types:Enchantment S:Mode$ PreventDamage | Target$ You | Source$ Card.RedSource | Amount$ 2 | Description$ If a red source would deal damage to you, prevent 2 of that damage. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sphere_of_law.jpg Oracle:If a red source would deal damage to you, prevent 2 of that damage. diff --git a/forge-gui/res/cardsfolder/s/sphere_of_purity.txt b/forge-gui/res/cardsfolder/s/sphere_of_purity.txt index d6d481e76f0..8f4e434af94 100644 --- a/forge-gui/res/cardsfolder/s/sphere_of_purity.txt +++ b/forge-gui/res/cardsfolder/s/sphere_of_purity.txt @@ -2,6 +2,6 @@ Name:Sphere of Purity ManaCost:3 W Types:Enchantment S:Mode$ PreventDamage | Target$ You | Source$ Artifact | Amount$ 1 | Description$ If an artifact source would deal damage to you, prevent 1 of that damage. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sphere_of_purity.jpg Oracle:If an artifact would deal damage to you, prevent 1 of that damage. diff --git a/forge-gui/res/cardsfolder/s/sphere_of_reason.txt b/forge-gui/res/cardsfolder/s/sphere_of_reason.txt index 3fd94034e76..06348adbe40 100644 --- a/forge-gui/res/cardsfolder/s/sphere_of_reason.txt +++ b/forge-gui/res/cardsfolder/s/sphere_of_reason.txt @@ -2,6 +2,6 @@ Name:Sphere of Reason ManaCost:3 W Types:Enchantment S:Mode$ PreventDamage | Target$ You | Source$ Card.BlueSource | Amount$ 2 | Description$ If a blue source would deal damage to you, prevent 2 of that damage. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sphere_of_reason.jpg Oracle:If a blue source would deal damage to you, prevent 2 of that damage. diff --git a/forge-gui/res/cardsfolder/s/sphere_of_resistance.txt b/forge-gui/res/cardsfolder/s/sphere_of_resistance.txt index 3e1c6f48729..cdedd7ebb14 100644 --- a/forge-gui/res/cardsfolder/s/sphere_of_resistance.txt +++ b/forge-gui/res/cardsfolder/s/sphere_of_resistance.txt @@ -2,6 +2,6 @@ Name:Sphere of Resistance ManaCost:2 Types:Artifact S:Mode$ RaiseCost | ValidCard$ Card | Type$ Spell | Amount$ 1 | Description$ Spells cost {1} more to cast. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sphere_of_resistance.jpg Oracle:Spells cost {1} more to cast. diff --git a/forge-gui/res/cardsfolder/s/sphere_of_truth.txt b/forge-gui/res/cardsfolder/s/sphere_of_truth.txt index 858548109ee..658a76d6fab 100644 --- a/forge-gui/res/cardsfolder/s/sphere_of_truth.txt +++ b/forge-gui/res/cardsfolder/s/sphere_of_truth.txt @@ -2,6 +2,6 @@ Name:Sphere of Truth ManaCost:3 W Types:Enchantment S:Mode$ PreventDamage | Target$ You | Source$ Card.WhiteSource | Amount$ 2 | Description$ If a white source would deal damage to you, prevent 2 of that damage. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sphere_of_truth.jpg Oracle:If a white source would deal damage to you, prevent 2 of that damage. diff --git a/forge-gui/res/cardsfolder/s/sphinxs_decree.txt b/forge-gui/res/cardsfolder/s/sphinxs_decree.txt index 85c569c7cd8..76ecb48438f 100644 --- a/forge-gui/res/cardsfolder/s/sphinxs_decree.txt +++ b/forge-gui/res/cardsfolder/s/sphinxs_decree.txt @@ -5,6 +5,6 @@ A:SP$ RepeatEach | Cost$ 1 W | RepeatPlayers$ Player.Opponent | NextTurnForEachP SVar:DBEffect:DB$ Effect | Name$ Sphinx's Decree Effect | StaticAbilities$ STCantBeCast | EffectOwner$ Remembered SVar:STCantBeCast:Mode$ CantBeCast | ValidCard$ Instant,Sorcery | Caster$ You | EffectZone$ Command | Description$ You can't cast instant or sorcery spells. SVar:AIPlayForSub:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sphinxs_decree.jpg Oracle:Each opponent can't cast instant or sorcery spells during that player's next turn. diff --git a/forge-gui/res/cardsfolder/s/spike_rogue.txt b/forge-gui/res/cardsfolder/s/spike_rogue.txt index b1988884632..26e18ab754b 100644 --- a/forge-gui/res/cardsfolder/s/spike_rogue.txt +++ b/forge-gui/res/cardsfolder/s/spike_rogue.txt @@ -5,6 +5,6 @@ PT:0/0 K:etbCounter:P1P1:2 A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1/Creature.YouCtrl/Creature you Control> | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on CARDNAME. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_rogue.jpg Oracle:Spike Rogue enters the battlefield with two +1/+1 counters on it.\n{2}, Remove a +1/+1 counter from Spike Rogue: Put a +1/+1 counter on target creature.\n{2}, Remove a +1/+1 counter from a creature you control: Put a +1/+1 counter on Spike Rogue. diff --git a/forge-gui/res/cardsfolder/s/spinal_parasite.txt b/forge-gui/res/cardsfolder/s/spinal_parasite.txt index 91bbcaafd04..1d3b3ebc5b7 100644 --- a/forge-gui/res/cardsfolder/s/spinal_parasite.txt +++ b/forge-gui/res/cardsfolder/s/spinal_parasite.txt @@ -5,8 +5,8 @@ PT:-1/-1 K:Sunburst A:AB$ RemoveCounter | Cost$ SubCounter<2/P1P1> | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | CounterType$ Any | CounterNum$ 1 | SpellDescription$ Remove a counter from target permanent. #TODO: For some reason the AI removes beneficial counters from its own permanents with this card. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:NeedsToPlayVar:Z GE3 SVar:NoZeroToughnessAI:True SVar:Z:Count$UniqueManaColorsProduced.ByUntappedSources diff --git a/forge-gui/res/cardsfolder/s/spinal_villain.txt b/forge-gui/res/cardsfolder/s/spinal_villain.txt index a80eaf8410f..081f92717bf 100644 --- a/forge-gui/res/cardsfolder/s/spinal_villain.txt +++ b/forge-gui/res/cardsfolder/s/spinal_villain.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Creature Beast PT:1/2 A:AB$ Destroy | Cost$ T | ValidTgts$ Creature.Blue | TgtPrompt$ Select target blue creature | SpellDescription$ Destroy target blue creature. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/spinal_villain.jpg Oracle:{T}: Destroy target blue creature. diff --git a/forge-gui/res/cardsfolder/s/spincrusher.txt b/forge-gui/res/cardsfolder/s/spincrusher.txt index 714bb89569f..b70eb3a63ca 100644 --- a/forge-gui/res/cardsfolder/s/spincrusher.txt +++ b/forge-gui/res/cardsfolder/s/spincrusher.txt @@ -5,7 +5,7 @@ PT:0/2 T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME blocks, put a +1/+1 counter on it. A:AB$ Pump | Cost$ SubCounter<1/P1P1> | KW$ HIDDEN Unblockable | SpellDescription$ CARDNAME can't be blocked this turn. SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:HasBlockEffect:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/spincrusher.jpg Oracle:Whenever Spincrusher blocks, put a +1/+1 counter on it.\nRemove a +1/+1 counter from Spincrusher: Spincrusher can't be blocked this turn. diff --git a/forge-gui/res/cardsfolder/s/spinning_darkness.txt b/forge-gui/res/cardsfolder/s/spinning_darkness.txt index 2b6a8d5ed1f..3058e4b2bee 100644 --- a/forge-gui/res/cardsfolder/s/spinning_darkness.txt +++ b/forge-gui/res/cardsfolder/s/spinning_darkness.txt @@ -4,7 +4,7 @@ Types:Instant SVar:AltCost:Cost$ ExileFromGrave<3/Card.Black+FromTopGrave> | Description$ You may exile the top three black cards of your graveyard rather than pay CARDNAME's mana cost. A:SP$ DealDamage | Cost$ 4 B B | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | NumDmg$ 3 | SubAbility$ DBGainLife | SpellDescription$ CARDNAME deals 3 damage to target nonblack creature. You gain 3 life. SVar:DBGainLife:DB$ GainLife | LifeAmount$ 3 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NeedsOrderedGraveyard:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/spinning_darkness.jpg Oracle:You may exile the top three black cards of your graveyard rather than pay Spinning Darkness's mana cost.\nSpinning Darkness deals 3 damage to target nonblack creature. You gain 3 life. diff --git a/forge-gui/res/cardsfolder/s/spire_owl.txt b/forge-gui/res/cardsfolder/s/spire_owl.txt index 5d9e6a84bab..2f00e0eb4ca 100644 --- a/forge-gui/res/cardsfolder/s/spire_owl.txt +++ b/forge-gui/res/cardsfolder/s/spire_owl.txt @@ -5,6 +5,6 @@ PT:1/1 K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigRearrange | TriggerDescription$ When CARDNAME enters the battlefield, look at the top four cards of your library, then put them back in any order. SVar:TrigRearrange:DB$RearrangeTopOfLibrary | Defined$ You | NumCards$ 4 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/spire_owl.jpg Oracle:Flying\nWhen Spire Owl enters the battlefield, look at the top four cards of your library, then put them back in any order. diff --git a/forge-gui/res/cardsfolder/s/spirit_en_kor.txt b/forge-gui/res/cardsfolder/s/spirit_en_kor.txt index 45fb552a94a..48e389005cd 100644 --- a/forge-gui/res/cardsfolder/s/spirit_en_kor.txt +++ b/forge-gui/res/cardsfolder/s/spirit_en_kor.txt @@ -6,6 +6,6 @@ K:Flying A:AB$ Effect | Cost$ 0 | Name$ en-Kor Redirection | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control to redirect the damage to | ReplacementEffects$ EnKor | SVars$ EnKorDmg | References$ EnKor,EnKorDmg | Duration$ HostLeavesOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SpellDescription$ The next 1 damage that would be dealt to CARDNAME this turn is dealt to target creature you control instead. SVar:EnKor:Event$ DamageDone | ValidTarget$ Creature.EffectSource | ReplaceWith$ EnKorDmg | DamageTarget$ Remembered | Description$ The next 1 damage that would be dealt to EFFECTSOURCE this turn is dealt to target creature you control instead. SVar:EnKorDmg:DB$ ReplaceSplitDamage | DamageTarget$ Remembered -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/spirit_en_kor.jpg Oracle:Flying\n{0}: The next 1 damage that would be dealt to Spirit en-Kor this turn is dealt to target creature you control instead. diff --git a/forge-gui/res/cardsfolder/s/spirit_flare.txt b/forge-gui/res/cardsfolder/s/spirit_flare.txt index 14daafdc932..fa0cff08a05 100644 --- a/forge-gui/res/cardsfolder/s/spirit_flare.txt +++ b/forge-gui/res/cardsfolder/s/spirit_flare.txt @@ -6,6 +6,6 @@ A:SP$ Tap | Cost$ 3 W | TgtPrompt$ Select target untapped creature you control | SVar:SpiritDmg:DB$ DealDamage | ValidTgts$ Creature.attacking+OppCtrl,Creature.blocking+OppCtrl | TgtPrompt$ Select target attacking or blocking creature an opponent controls | NumDmg$ SpiritStrength | ConditionCheckSVar$ WasTapped | ConditionSVarCompare$ GE1 | References$ SpiritStrength,WasTapped SVar:SpiritStrength:Remembered$CardPower SVar:WasTapped:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/spirit_flare.jpg Oracle:Tap target untapped creature you control. If you do, it deals damage equal to its power to target attacking or blocking creature an opponent controls.\nFlashback—{1}{W}, Pay 3 life. (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/s/spirit_of_resistance.txt b/forge-gui/res/cardsfolder/s/spirit_of_resistance.txt index b5ee98219d2..a9fddb9bec2 100644 --- a/forge-gui/res/cardsfolder/s/spirit_of_resistance.txt +++ b/forge-gui/res/cardsfolder/s/spirit_of_resistance.txt @@ -3,6 +3,6 @@ ManaCost:2 W Types:Enchantment S:Mode$ PreventDamage | Target$ You | Condition$ PermanentOfEachColor | Description$ As long as you control a permanent of each color, prevent all damage that would be dealt to you. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/spirit_of_resistance.jpg Oracle:As long as you control a permanent of each color, prevent all damage that would be dealt to you. diff --git a/forge-gui/res/cardsfolder/s/spirit_weaver.txt b/forge-gui/res/cardsfolder/s/spirit_weaver.txt index dc5a1e799ed..187cb2079bc 100644 --- a/forge-gui/res/cardsfolder/s/spirit_weaver.txt +++ b/forge-gui/res/cardsfolder/s/spirit_weaver.txt @@ -3,7 +3,7 @@ ManaCost:1 W Types:Creature Human Wizard PT:2/1 A:AB$ Pump | Cost$ 2 | ValidTgts$ Creature.Green,Creature.Blue | NumDef$ +1 | SpellDescription$ Target green or blue creature gets +0/+1 until end of turn. | TgtPrompt$ Select target green or blue creature. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Color$Green|Blue SVar:Picture:http://www.wizards.com/global/images/magic/general/spirit_weaver.jpg Oracle:{2}: Target green or blue creature gets +0/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/s/spiritual_asylum.txt b/forge-gui/res/cardsfolder/s/spiritual_asylum.txt index 493fd493d88..59501c6e412 100644 --- a/forge-gui/res/cardsfolder/s/spiritual_asylum.txt +++ b/forge-gui/res/cardsfolder/s/spiritual_asylum.txt @@ -5,6 +5,6 @@ S:Mode$ Continuous | Affected$ Creature.YouCtrl,Land.YouCtrl | AddKeyword$ Shrou T:Mode$ Attacks | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigSacrifice | TriggerDescription$ When a creature you control attacks, sacrifice CARDNAME. SVar:TrigSacrifice:AB$Sacrifice | Cost$ 0 SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/spiritual_asylum.jpg Oracle:Creatures and lands you control have shroud. (They can't be the targets of spells or abilities.)\nWhen a creature you control attacks, sacrifice Spiritual Asylum. diff --git a/forge-gui/res/cardsfolder/s/spiritualize.txt b/forge-gui/res/cardsfolder/s/spiritualize.txt index 3fb33930a7e..badc52067b9 100644 --- a/forge-gui/res/cardsfolder/s/spiritualize.txt +++ b/forge-gui/res/cardsfolder/s/spiritualize.txt @@ -6,6 +6,6 @@ SVar:TrigDamage:Mode$ DamageDoneOnce | ValidSource$ Creature.IsRemembered | Exec SVar:TrigGainLife:DB$ GainLife | LifeAmount$ X | References$ X | Defined$ You SVar:DBDraw:DB$ Draw | NumCards$ 1 SVar:X:TriggerCount$DamageAmount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/spiritualize.jpg Oracle:Until end of turn, whenever target creature deals damage, you gain that much life.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/s/spiteflame_witch.txt b/forge-gui/res/cardsfolder/s/spiteflame_witch.txt index 51df1722cd8..b31b65e23c8 100644 --- a/forge-gui/res/cardsfolder/s/spiteflame_witch.txt +++ b/forge-gui/res/cardsfolder/s/spiteflame_witch.txt @@ -3,6 +3,6 @@ ManaCost:1 BR Types:Creature Elemental Shaman PT:2/1 A:AB$ LoseLife | Cost$ B R | Defined$ Player | LifeAmount$ 1 | SpellDescription$ Each player loses 1 life. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/spiteflame_witch.jpg Oracle:{B}{R}: Each player loses 1 life. diff --git a/forge-gui/res/cardsfolder/s/spiteful_bully.txt b/forge-gui/res/cardsfolder/s/spiteful_bully.txt index a353660ab2e..37381e1ab20 100644 --- a/forge-gui/res/cardsfolder/s/spiteful_bully.txt +++ b/forge-gui/res/cardsfolder/s/spiteful_bully.txt @@ -4,6 +4,6 @@ Types:Creature Zombie Mercenary PT:3/3 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of your upkeep, CARDNAME deals 3 damage to target creature you control. SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature | NumDmg$ 3 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/spiteful_bully.jpg Oracle:At the beginning of your upkeep, Spiteful Bully deals 3 damage to target creature you control. diff --git a/forge-gui/res/cardsfolder/s/spiteful_visions.txt b/forge-gui/res/cardsfolder/s/spiteful_visions.txt index e0ee0165bae..b12620d7602 100644 --- a/forge-gui/res/cardsfolder/s/spiteful_visions.txt +++ b/forge-gui/res/cardsfolder/s/spiteful_visions.txt @@ -5,6 +5,6 @@ T:Mode$ Phase | Phase$ Draw | ValidPlayer$ Player | TriggerZones$ Battlefield | SVar:TrigDraw:DB$Draw | NumCards$ 1 | Defined$ TriggeredPlayer T:Mode$ Drawn | ValidCard$ Card | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a player draws a card, CARDNAME deals 1 damage to that player. SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredCardOwner | NumDmg$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/spiteful_visions.jpg Oracle:At the beginning of each player's draw step, that player draws an additional card.\nWhenever a player draws a card, Spiteful Visions deals 1 damage to that player. diff --git a/forge-gui/res/cardsfolder/s/spitting_slug.txt b/forge-gui/res/cardsfolder/s/spitting_slug.txt index 198d6cb03c5..d36ee9b155d 100644 --- a/forge-gui/res/cardsfolder/s/spitting_slug.txt +++ b/forge-gui/res/cardsfolder/s/spitting_slug.txt @@ -9,6 +9,6 @@ SVar:PumpSelf:DB$Pump | Defined$ Self | KW$ First Strike | ConditionCheckSVar$ S SVar:PumpOthers:DB$PumpAll | ValidCards$ Creature.blockingSource,Creature.blockedBySource | KW$ First Strike | ConditionCheckSVar$ SlugUnpaid | ConditionSVarCompare$ EQ1 | SubAbility$ DBReset SVar:DBReset:DB$ StoreSVar | SVar$ SlugUnpaid | Type$ Number | Expression$ 0 SVar:SlugUnpaid:Number$0 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/spitting_slug.jpg Oracle:Whenever Spitting Slug blocks or becomes blocked, you may pay {1}{G}. If you do, Spitting Slug gains first strike until end of turn. Otherwise, each creature blocking or blocked by Spitting Slug gains first strike until end of turn. diff --git a/forge-gui/res/cardsfolder/s/spitting_spider.txt b/forge-gui/res/cardsfolder/s/spitting_spider.txt index c995bc3cad8..bf92b150583 100644 --- a/forge-gui/res/cardsfolder/s/spitting_spider.txt +++ b/forge-gui/res/cardsfolder/s/spitting_spider.txt @@ -4,6 +4,6 @@ Types:Creature Spider PT:3/5 K:Reach A:AB$ DamageAll | Cost$ Sac<1/Land> | NumDmg$ 1 | ValidCards$ Creature.withFlying | ValidDescription$ each creature and with flying. | SpellDescription$ CARDNAME deals 1 damage to each creature with flying. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://resources.wizards.com/magic/cards/pr/en-us/card24666.jpg Oracle:Reach (This creature can block creatures with flying.)\nSacrifice a land: Spitting Spider deals 1 damage to each creature with flying. diff --git a/forge-gui/res/cardsfolder/s/splintering_wind.txt b/forge-gui/res/cardsfolder/s/splintering_wind.txt index 1792dd3b3fb..774e523c4ab 100644 --- a/forge-gui/res/cardsfolder/s/splintering_wind.txt +++ b/forge-gui/res/cardsfolder/s/splintering_wind.txt @@ -5,6 +5,6 @@ A:AB$ DealDamage | Cost$ 2 G | ValidTgts$ Creature | TgtPrompt$ Select target cr SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenName$ Splinter | TokenTypes$ Creature,Splinter | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Cumulative upkeep:G<>Flying | TokenTriggers$ TrigDamage | TokenSVars$ TrigBoom SVar:TrigDamage:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Any | TriggerZones$ Battlefield | Execute$ TrigBoom | TriggerDescription$ When this creature leaves the battlefield, it deals 1 damage to you and each creature you control. SVar:TrigBoom:DB$ DamageAll | ValidCards$ Creature.YouCtrl | ValidPlayers$ Self | NumDmg$ 1 | SpellDescription$ Deal 1 damage to you and each creature you control. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/splintering_wind.jpg Oracle:{2}{G}: Splintering Wind deals 1 damage to target creature. Create a 1/1 green Splinter creature token. It has flying and "Cumulative upkeep {G}." When it leaves the battlefield, it deals 1 damage to you and each creature you control. (At the beginning of its controller's upkeep, that player puts an age counter on it, then sacrifices it unless they pay its upkeep cost for each age counter on it.) diff --git a/forge-gui/res/cardsfolder/s/split_decision.txt b/forge-gui/res/cardsfolder/s/split_decision.txt index 08c3b4cc28c..85c1a30fc3b 100644 --- a/forge-gui/res/cardsfolder/s/split_decision.txt +++ b/forge-gui/res/cardsfolder/s/split_decision.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Vote | Cost$ 1 U | ValidTgts$ Instant,Sorcery | TgtZone$ Stack | TargetType$ Spell | Defined$ Player | VoteDenial$ DBDenial | VoteDuplication$ DBDuplication | Tied$ DBDuplication | VoteType$ Denial,Duplication | SpellDescription$ Will of the Council — Choose target instant or sorcery spell. Starting with you, each player votes for denial or duplication. If denial gets more votes, counter that spell. If duplication gets more votes or the vote is tied, copy the spell. You may choose new targets for the copy. SVar:DBDenial:DB$ Counter | Defined$ Targeted SVar:DBDuplication:DB$ CopySpellAbility | Defined$ Targeted -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/split_decision.jpg Oracle:Will of the council — Choose target instant or sorcery spell. Starting with you, each player votes for denial or duplication. If denial gets more votes, counter the spell. If duplication gets more votes or the vote is tied, copy the spell. You may choose new targets for the copy. diff --git a/forge-gui/res/cardsfolder/s/spoils_of_evil.txt b/forge-gui/res/cardsfolder/s/spoils_of_evil.txt index 78baa6eec8d..4197ffeb6cc 100644 --- a/forge-gui/res/cardsfolder/s/spoils_of_evil.txt +++ b/forge-gui/res/cardsfolder/s/spoils_of_evil.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ GainLife | Cost$ 2 B | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | Defined$ You | LifeAmount$ X | References$ X | SubAbility$ DBMana | SpellDescription$ For each artifact or creature card in target opponent's graveyard, add {1} and you gain 1 life. SVar:DBMana:DB$ Mana | Produced$ C | Amount$ X | References$ X SVar:X:Count$ValidGraveyard Creature.OppOwn,Artifact.OppOwn -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/spoils_of_evil.jpg Oracle:For each artifact or creature card in target opponent's graveyard, add {C} and you gain 1 life. diff --git a/forge-gui/res/cardsfolder/s/spoils_of_the_vault.txt b/forge-gui/res/cardsfolder/s/spoils_of_the_vault.txt index 54cfed7d335..927b48b2d22 100644 --- a/forge-gui/res/cardsfolder/s/spoils_of_the_vault.txt +++ b/forge-gui/res/cardsfolder/s/spoils_of_the_vault.txt @@ -6,7 +6,7 @@ SVar:DBDigUntil:DB$ DigUntil | Valid$ Card.NamedCard | FoundDestination$ Hand | SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ X | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/spoils_of_the_vault.jpg Oracle:Choose a card name. Reveal cards from the top of your library until you reveal a card with that name, then put that card into your hand. Exile all other cards revealed this way, and you lose 1 life for each of the exiled cards. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/spoils_of_war.txt b/forge-gui/res/cardsfolder/s/spoils_of_war.txt index c8d66f05805..912f6874dab 100644 --- a/forge-gui/res/cardsfolder/s/spoils_of_war.txt +++ b/forge-gui/res/cardsfolder/s/spoils_of_war.txt @@ -4,6 +4,6 @@ Types:Sorcery Text:X is the number of artifact and/or creature cards in an opponent's graveyard as you cast CARDNAME. A:SP$ PutCounter | Cost$ X B | ValidTgts$ Creature | TgtPrompt$ Select target creature to distribute counters to | CounterType$ P1P1 | CounterNum$ X | TargetMin$ 1 | TargetMax$ X | DividedAsYouChoose$ X | SpellDescription$ Distribute X +1/+1 counters among any number of target creatures. SVar:X:Count$ValidGraveyard Creature.OppCtrl,Artifact.OppCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/spoils_of_war.jpg Oracle:X is the number of artifact and/or creature cards in an opponent's graveyard as you cast Spoils of War.\nDistribute X +1/+1 counters among any number of target creatures. diff --git a/forge-gui/res/cardsfolder/s/spore_burst.txt b/forge-gui/res/cardsfolder/s/spore_burst.txt index 0791413129d..e8aae07584a 100644 --- a/forge-gui/res/cardsfolder/s/spore_burst.txt +++ b/forge-gui/res/cardsfolder/s/spore_burst.txt @@ -3,7 +3,7 @@ ManaCost:3 G Types:Sorcery A:SP$ Token | Cost$ 3 G | TokenAmount$ X | References$ X | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | TokenImage$ g 1 1 saproling ALA | SpellDescription$ Domain — Create a 1/1 green Saproling creature token for each basic land type among lands you control. SVar:X:Count$Domain -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHas:Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/spore_burst.jpg Oracle:Domain — Create a 1/1 green Saproling creature token for each basic land type among lands you control. diff --git a/forge-gui/res/cardsfolder/s/spreading_plague.txt b/forge-gui/res/cardsfolder/s/spreading_plague.txt index de559f0e6f2..a0cfb8ef116 100644 --- a/forge-gui/res/cardsfolder/s/spreading_plague.txt +++ b/forge-gui/res/cardsfolder/s/spreading_plague.txt @@ -3,7 +3,7 @@ ManaCost:4 B Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature | Execute$ TrigDestroy | TriggerZones$ Battlefield | TriggerDescription$ Whenever a creature enters the battlefield, destroy all other creatures that share a color with it. They can't be regenerated. SVar:TrigDestroy:DB$ DestroyAll | ValidCards$ Triggered.SharesColorWith+Creature+Other | NoRegen$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/spreading_plague.jpg Oracle:Whenever a creature enters the battlefield, destroy all other creatures that share a color with it. They can't be regenerated. diff --git a/forge-gui/res/cardsfolder/s/springjack_pasture.txt b/forge-gui/res/cardsfolder/s/springjack_pasture.txt index fc35ebeafb9..2f2b5c90b0a 100644 --- a/forge-gui/res/cardsfolder/s/springjack_pasture.txt +++ b/forge-gui/res/cardsfolder/s/springjack_pasture.txt @@ -6,6 +6,6 @@ A:AB$ Token | Cost$ 4 T | TokenAmount$ 1 | TokenName$ Goat | TokenTypes$ Creatur A:AB$Mana | Cost$ T Sac | CostDesc$ {T}, Sacrifice X Goats: | Produced$ Any | Amount$ ChosenX | References$ X | Defined$ You | SubAbility$ DBGainLife | SpellDescription$ Add X mana of any one color. You gain X life. SVar:X:XChoice SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ ChosenX -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/springjack_pasture.jpg Oracle:{T}: Add {C}.\n{4}, {T}: Create a 0/1 white Goat creature token.\n{T}, Sacrifice X Goats: Add X mana of any one color. You gain X life. diff --git a/forge-gui/res/cardsfolder/s/springleaf_drum.txt b/forge-gui/res/cardsfolder/s/springleaf_drum.txt index bdee966da52..fd721646d28 100644 --- a/forge-gui/res/cardsfolder/s/springleaf_drum.txt +++ b/forge-gui/res/cardsfolder/s/springleaf_drum.txt @@ -2,6 +2,6 @@ Name:Springleaf Drum ManaCost:1 Types:Artifact A:AB$ Mana | Cost$ T tapXType<1/Creature> | Produced$ Any | SpellDescription$ Add one mana of any color. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/springleaf_drum.jpg Oracle:{T}, Tap an untapped creature you control: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/s/spurred_wolverine.txt b/forge-gui/res/cardsfolder/s/spurred_wolverine.txt index 63f5ca39128..dae91ec1981 100644 --- a/forge-gui/res/cardsfolder/s/spurred_wolverine.txt +++ b/forge-gui/res/cardsfolder/s/spurred_wolverine.txt @@ -3,7 +3,7 @@ ManaCost:4 R Types:Creature Wolverine Beast PT:3/2 A:AB$ Pump | Cost$ tapXType<2/Beast> | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ First Strike | SpellDescription$ Target creature gains first strike until end of turn. -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/spurred_wolverine.jpg Oracle:Tap two untapped Beasts you control: Target creature gains first strike until end of turn. diff --git a/forge-gui/res/cardsfolder/s/spy_network.txt b/forge-gui/res/cardsfolder/s/spy_network.txt index 0fdf6a0b91f..875f45df79a 100644 --- a/forge-gui/res/cardsfolder/s/spy_network.txt +++ b/forge-gui/res/cardsfolder/s/spy_network.txt @@ -6,6 +6,6 @@ SVar:DBHand:DB$ LookAt | Defined$ ValidHand Card.TargetedPlayerCtrl | SubAbility SVar:DBTopLibrary:DB$ LookAt | Defined$ ValidAll Card.TopLibrary+TargetedPlayerCtrl | SubAbility$ DBFaceDown | StackDescription$ None SVar:DBFaceDown:DB$ LookAt | Defined$ Valid Creature.faceDown+TargetedPlayerCtrl | SubAbility$ DBRearrange | StackDescription$ None SVar:DBRearrange:DB$ RearrangeTopOfLibrary | Defined$ You | NumCards$ 4 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/spy_network.jpg Oracle:Look at target player's hand, the top card of that player's library, and any face-down creatures they control. Look at the top four cards of your library, then put them back in any order. diff --git a/forge-gui/res/cardsfolder/s/squall_line.txt b/forge-gui/res/cardsfolder/s/squall_line.txt index f1aaddd3e15..ef578509329 100644 --- a/forge-gui/res/cardsfolder/s/squall_line.txt +++ b/forge-gui/res/cardsfolder/s/squall_line.txt @@ -3,6 +3,6 @@ ManaCost:X G G Types:Instant A:SP$ DamageAll | Cost$ X G G | References$ X | ValidCards$ Creature.withFlying | ValidPlayers$ Player | NumDmg$ X | ValidDescription$ each creature with flying and each player. | SpellDescription$ CARDNAME deals X damage to each creature with flying and each player. SVar:X:Count$xPaid -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/squall_line.jpg Oracle:Squall Line deals X damage to each creature with flying and each player. diff --git a/forge-gui/res/cardsfolder/s/squallmonger.txt b/forge-gui/res/cardsfolder/s/squallmonger.txt index a625818d2a7..844190c5d1c 100644 --- a/forge-gui/res/cardsfolder/s/squallmonger.txt +++ b/forge-gui/res/cardsfolder/s/squallmonger.txt @@ -3,6 +3,6 @@ ManaCost:3 G Types:Creature Monger PT:3/3 A:AB$ DamageAll | Cost$ 2 | NumDmg$ 1 | ValidCards$ Creature.withFlying | ValidPlayers$ Player | AnyPlayer$ True | ValidDescription$ each creature with flying and and each player. | SpellDescription$ CARDNAME deals 1 damage to each creature with flying and each player. Any player may activate this ability. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/squallmonger.jpg Oracle:{2}: Squallmonger deals 1 damage to each creature with flying and each player. Any player may activate this ability. diff --git a/forge-gui/res/cardsfolder/s/squandered_resources.txt b/forge-gui/res/cardsfolder/s/squandered_resources.txt index 6d1b2470975..59ef71af0e7 100644 --- a/forge-gui/res/cardsfolder/s/squandered_resources.txt +++ b/forge-gui/res/cardsfolder/s/squandered_resources.txt @@ -2,7 +2,7 @@ Name:Squandered Resources ManaCost:B G Types:Enchantment A:AB$ ManaReflected | Cost$ Sac<1/Land> | ColorOrType$ Type | Valid$ Defined.Sacrificed | ReflectProperty$ Produce | SpellDescription$ Add one mana of any type the sacrificed land could produce. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/squandered_resources.jpg Oracle:Sacrifice a land: Add one mana of any type the sacrificed land could produce. diff --git a/forge-gui/res/cardsfolder/s/squeaking_pie_grubfellows.txt b/forge-gui/res/cardsfolder/s/squeaking_pie_grubfellows.txt index ca52cd6a3ff..08d97d11eba 100644 --- a/forge-gui/res/cardsfolder/s/squeaking_pie_grubfellows.txt +++ b/forge-gui/res/cardsfolder/s/squeaking_pie_grubfellows.txt @@ -6,6 +6,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigKinship | Trigge SVar:TrigKinship:DB$ PeekAndReveal | PeekAmount$ 1 | RevealValid$ Card.sharesCreatureTypeWith | RevealOptional$ True | RememberRevealed$ True | SubAbility$ DBDiscard SVar:DBDiscard:DB$ Discard | Defined$ Opponent | NumCards$ 1 | Mode$ TgtChoose | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/squeaking_pie_grubfellows.jpg Oracle:Kinship — At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Squeaking Pie Grubfellows, you may reveal it. If you do, each opponent discards a card. diff --git a/forge-gui/res/cardsfolder/s/squealing_devil.txt b/forge-gui/res/cardsfolder/s/squealing_devil.txt index 2f32586254f..e2714986395 100644 --- a/forge-gui/res/cardsfolder/s/squealing_devil.txt +++ b/forge-gui/res/cardsfolder/s/squealing_devil.txt @@ -9,6 +9,6 @@ SVar:TrigPump:AB$ Pump | Cost$ X | References$ X | ValidTgts$ Creature | TgtProm SVar:X:Count$xPaid SVar:TrigSac:DB$Sacrifice | Defined$ Self SVar:ManaNeededToAvoidNegativeEffect:black -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/squealing_devil.jpg Oracle:Fear (This creature can't be blocked except by artifact creatures and/or black creatures.)\nWhen Squealing Devil enters the battlefield, you may pay {X}. If you do, target creature gets +X/+0 until end of turn.\nWhen Squealing Devil enters the battlefield, sacrifice it unless {B} was spent to cast it. diff --git a/forge-gui/res/cardsfolder/s/squee.txt b/forge-gui/res/cardsfolder/s/squee.txt index 0b130870bbc..f90b9788337 100644 --- a/forge-gui/res/cardsfolder/s/squee.txt +++ b/forge-gui/res/cardsfolder/s/squee.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Vanguard HandLifeModifier:+3/-4 S:Mode$ Continuous | EffectZone$ Command | Affected$ Opponent | AddKeyword$ Play with your hand revealed. | Description$ Your opponents play with their hands revealed. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:https://downloads.cardforge.org/images/cards/VAN/Squee.full.jpg Oracle:Hand +3, life -4\nYour opponents play with their hands revealed. diff --git a/forge-gui/res/cardsfolder/s/squees_revenge.txt b/forge-gui/res/cardsfolder/s/squees_revenge.txt index 010031db4f6..b0a6633ee24 100644 --- a/forge-gui/res/cardsfolder/s/squees_revenge.txt +++ b/forge-gui/res/cardsfolder/s/squees_revenge.txt @@ -14,6 +14,6 @@ SVar:TimesToFlip:Number$ChosenNumber SVar:FlipsDone:Number$0 SVar:Loss:Number$0 SVar:CardsToDraw:Count$ChosenNumber/Times.2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/squees_revenge.jpg Oracle:Choose a number. Flip a coin that many times or until you lose a flip, whichever comes first. If you win all the flips, draw two cards for each flip. diff --git a/forge-gui/res/cardsfolder/s/squeeze.txt b/forge-gui/res/cardsfolder/s/squeeze.txt index cbb94bb92f9..e7b5743c139 100644 --- a/forge-gui/res/cardsfolder/s/squeeze.txt +++ b/forge-gui/res/cardsfolder/s/squeeze.txt @@ -2,6 +2,6 @@ Name:Squeeze ManaCost:3 U Types:Enchantment S:Mode$ RaiseCost | ValidCard$ Sorcery | Type$ Spell | Amount$ 3 | Description$ Sorcery spells cost {3} more to cast. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/squeeze.jpg Oracle:Sorcery spells cost {3} more to cast. diff --git a/forge-gui/res/cardsfolder/s/squirrel_wrangler.txt b/forge-gui/res/cardsfolder/s/squirrel_wrangler.txt index cc878035451..9590ea6b7cf 100644 --- a/forge-gui/res/cardsfolder/s/squirrel_wrangler.txt +++ b/forge-gui/res/cardsfolder/s/squirrel_wrangler.txt @@ -4,6 +4,6 @@ Types:Creature Human Druid PT:2/2 A:AB$ Token | Cost$ 1 G Sac<1/Land> | TokenAmount$ 2 | TokenName$ Squirrel | TokenTypes$ Creature,Squirrel | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Create two 1/1 green Squirrel creature tokens. A:AB$ PumpAll | Cost$ 1 G Sac<1/Land> | ValidCards$ Creature.Squirrel | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Squirrel creatures get +1/+1 until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/squirrel_wrangler.jpg Oracle:{1}{G}, Sacrifice a land: Create two 1/1 green Squirrel creature tokens.\n{1}{G}, Sacrifice a land: Squirrel creatures get +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/s/sram_senior_edificer.txt b/forge-gui/res/cardsfolder/s/sram_senior_edificer.txt index ea305d04f97..f7abe334881 100644 --- a/forge-gui/res/cardsfolder/s/sram_senior_edificer.txt +++ b/forge-gui/res/cardsfolder/s/sram_senior_edificer.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Dwarf Advisor PT:2/2 T:Mode$ SpellCast | ValidCard$ Aura,Equipment,Vehicle | ValidActivatingPlayer$ You | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast an Aura, Equipment, or Vehicle spell, draw a card. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Enchantment SVar:Picture:http://www.wizards.com/global/images/magic/general/sram_senior_edificer.jpg Oracle:Whenever you cast an Aura, Equipment, or Vehicle spell, draw a card. diff --git a/forge-gui/res/cardsfolder/s/stabilizer.txt b/forge-gui/res/cardsfolder/s/stabilizer.txt index 6078c981619..65a359be13a 100644 --- a/forge-gui/res/cardsfolder/s/stabilizer.txt +++ b/forge-gui/res/cardsfolder/s/stabilizer.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact S:Mode$ Continuous | GlobalRule$ Players can't cycle cards. | Description$ Players can't cycle cards. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/stabilizer.jpg Oracle:Players can't cycle cards. diff --git a/forge-gui/res/cardsfolder/s/staff_of_the_ages.txt b/forge-gui/res/cardsfolder/s/staff_of_the_ages.txt index 5089919fcb4..7a98a9801be 100644 --- a/forge-gui/res/cardsfolder/s/staff_of_the_ages.txt +++ b/forge-gui/res/cardsfolder/s/staff_of_the_ages.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact S:Mode$ Continuous | Affected$ Creature | AddHiddenKeyword$ May be blocked as though it doesn't have landwalk. | Description$ Creatures with landwalk abilities can be blocked as though they didn't have those abilities. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/staff_of_the_ages.jpg Oracle:Creatures with landwalk abilities can be blocked as though they didn't have those abilities. diff --git a/forge-gui/res/cardsfolder/s/staff_of_the_death_magus.txt b/forge-gui/res/cardsfolder/s/staff_of_the_death_magus.txt index b0782083a0c..b7edaaaa6b5 100644 --- a/forge-gui/res/cardsfolder/s/staff_of_the_death_magus.txt +++ b/forge-gui/res/cardsfolder/s/staff_of_the_death_magus.txt @@ -4,7 +4,7 @@ Types:Artifact T:Mode$ SpellCast | ValidCard$ Card.Black | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever you cast a black spell or a Swamp enters the battlefield under your control, you gain 1 life. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Swamp.YouCtrl | TriggerZones$ Battlefield | Secondary$ True | Execute$ TrigGainLife | TriggerDescription$ Whenever you cast a black spell or a Swamp enters the battlefield under your control, you gain 1 life. SVar:TrigGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black SVar:Picture:http://www.wizards.com/global/images/magic/general/staff_of_the_death_magus.jpg Oracle:Whenever you cast a black spell or a Swamp enters the battlefield under your control, you gain 1 life. diff --git a/forge-gui/res/cardsfolder/s/staff_of_the_flame_magus.txt b/forge-gui/res/cardsfolder/s/staff_of_the_flame_magus.txt index 0af917979b4..29a498565cf 100644 --- a/forge-gui/res/cardsfolder/s/staff_of_the_flame_magus.txt +++ b/forge-gui/res/cardsfolder/s/staff_of_the_flame_magus.txt @@ -4,7 +4,7 @@ Types:Artifact T:Mode$ SpellCast | ValidCard$ Card.Red | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever you cast a red spell or a Mountain enters the battlefield under your control, you gain 1 life. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Mountain.YouCtrl | TriggerZones$ Battlefield | Secondary$ True | Execute$ TrigGainLife | TriggerDescription$ Whenever you cast a red spell or a Mountain enters the battlefield under your control, you gain 1 life. SVar:TrigGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Red SVar:Picture:http://www.wizards.com/global/images/magic/general/staff_of_the_flame_magus.jpg Oracle:Whenever you cast a red spell or a Mountain enters the battlefield under your control, you gain 1 life. diff --git a/forge-gui/res/cardsfolder/s/staff_of_the_mind_magus.txt b/forge-gui/res/cardsfolder/s/staff_of_the_mind_magus.txt index 90009564273..8a774d56264 100644 --- a/forge-gui/res/cardsfolder/s/staff_of_the_mind_magus.txt +++ b/forge-gui/res/cardsfolder/s/staff_of_the_mind_magus.txt @@ -4,7 +4,7 @@ Types:Artifact T:Mode$ SpellCast | ValidCard$ Card.Blue | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever you cast a blue spell or an Island enters the battlefield under your control, you gain 1 life. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Island.YouCtrl | TriggerZones$ Battlefield | Secondary$ True | Execute$ TrigGainLife | TriggerDescription$ Whenever you cast a blue spell or an Island enters the battlefield under your control, you gain 1 life. SVar:TrigGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Blue SVar:Picture:http://www.wizards.com/global/images/magic/general/staff_of_the_mind_magus.jpg Oracle:Whenever you cast a blue spell or an Island enters the battlefield under your control, you gain 1 life. diff --git a/forge-gui/res/cardsfolder/s/staff_of_the_sun_magus.txt b/forge-gui/res/cardsfolder/s/staff_of_the_sun_magus.txt index 760f39ae608..beea15c7089 100644 --- a/forge-gui/res/cardsfolder/s/staff_of_the_sun_magus.txt +++ b/forge-gui/res/cardsfolder/s/staff_of_the_sun_magus.txt @@ -4,7 +4,7 @@ Types:Artifact T:Mode$ SpellCast | ValidCard$ Card.White | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever you cast a white spell or a Plains enters the battlefield under your control, you gain 1 life. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Plains.YouCtrl | TriggerZones$ Battlefield | Secondary$ True | Execute$ TrigGainLife | TriggerDescription$ Whenever you cast a white spell or a Plains enters the battlefield under your control, you gain 1 life. SVar:TrigGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$White SVar:Picture:http://www.wizards.com/global/images/magic/general/staff_of_the_sun_magus.jpg Oracle:Whenever you cast a white spell or a Plains enters the battlefield under your control, you gain 1 life. diff --git a/forge-gui/res/cardsfolder/s/staff_of_the_wild_magus.txt b/forge-gui/res/cardsfolder/s/staff_of_the_wild_magus.txt index eb196c66cfb..06b37e6701b 100644 --- a/forge-gui/res/cardsfolder/s/staff_of_the_wild_magus.txt +++ b/forge-gui/res/cardsfolder/s/staff_of_the_wild_magus.txt @@ -4,7 +4,7 @@ Types:Artifact T:Mode$ SpellCast | ValidCard$ Card.Green | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever you cast a green spell or a Forest enters the battlefield under your control, you gain 1 life. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Forest.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | Secondary$ True | TriggerDescription$ Whenever you cast a green spell or a Forest enters the battlefield under your control, you gain 1 life. SVar:TrigGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Green SVar:Picture:http://www.wizards.com/global/images/magic/general/staff_of_the_wild_magus.jpg Oracle:Whenever you cast a green spell or a Forest enters the battlefield under your control, you gain 1 life. diff --git a/forge-gui/res/cardsfolder/s/stain_the_mind.txt b/forge-gui/res/cardsfolder/s/stain_the_mind.txt index 993cc7fe2f9..8983c54cbcf 100644 --- a/forge-gui/res/cardsfolder/s/stain_the_mind.txt +++ b/forge-gui/res/cardsfolder/s/stain_the_mind.txt @@ -9,7 +9,7 @@ SVar:ExileLib:DB$ ChangeZone | Origin$ Library | Destination$ Exile | DefinedPla SVar:NumInLib:TargetedPlayer$CardsInLibrary SVar:NumInHand:TargetedPlayer$CardsInHand SVar:NumInYard:TargetedPlayer$CardsInGraveyard -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/stain_the_mind.jpg Oracle:Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nChoose a nonland card name. Search target player's graveyard, hand, and library for any number of cards with that name and exile them. Then that player shuffles their library. diff --git a/forge-gui/res/cardsfolder/s/stalking_yeti.txt b/forge-gui/res/cardsfolder/s/stalking_yeti.txt index 312e6e42ad9..2c34282d48d 100644 --- a/forge-gui/res/cardsfolder/s/stalking_yeti.txt +++ b/forge-gui/res/cardsfolder/s/stalking_yeti.txt @@ -8,6 +8,6 @@ SVar:DBDamage:DB$DealDamage | Defined$ Self | DamageSource$ Targeted | NumDmg$ Y A:AB$ ChangeZone | Cost$ 2 S | Origin$ Battlefield | Destination$ Hand | SorcerySpeed$ True | SpellDescription$ Return CARDNAME to its owner's hand. Activate this ability only any time you could cast a sorcery. SVar:X:Count$CardPower SVar:Y:Targeted$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/stalking_yeti.jpg Oracle:When Stalking Yeti enters the battlefield, if it's on the battlefield, it deals damage equal to its power to target creature an opponent controls and that creature deals damage equal to its power to Stalking Yeti.\n{2}{S}: Return Stalking Yeti to its owner's hand. Activate this ability only any time you could cast a sorcery. ({S} can be paid with one mana from a snow permanent.) diff --git a/forge-gui/res/cardsfolder/s/stampeding_serow.txt b/forge-gui/res/cardsfolder/s/stampeding_serow.txt index eb83782bc17..3ce4d3f0df3 100644 --- a/forge-gui/res/cardsfolder/s/stampeding_serow.txt +++ b/forge-gui/res/cardsfolder/s/stampeding_serow.txt @@ -7,6 +7,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigBounce | Trigger SVar:TrigBounce:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | ChangeType$ Creature.Green+YouCtrl | ChangeNum$ 1 | Mandatory$ True | Hidden$ True SVar:NeedsToPlayVar:Z GE2 SVar:Z:Count$Valid Creature.Green+YouCtrl+inZoneBattlefield -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/stampeding_serow.jpg Oracle:Trample\nAt the beginning of your upkeep, return a green creature you control to its owner's hand. diff --git a/forge-gui/res/cardsfolder/s/stampeding_wildebeests.txt b/forge-gui/res/cardsfolder/s/stampeding_wildebeests.txt index f91d461cfaf..f5316fddbfb 100644 --- a/forge-gui/res/cardsfolder/s/stampeding_wildebeests.txt +++ b/forge-gui/res/cardsfolder/s/stampeding_wildebeests.txt @@ -7,6 +7,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E SVar:TrigBounce:DB$ChangeZone | ChangeType$ Creature.Green+YouCtrl | ChangeNum$ 1 | Origin$ Battlefield | Destination$ Hand | Mandatory$ True | Hidden$ True SVar:NeedsToPlayVar:Z GE2 SVar:Z:Count$Valid Creature.Green+YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/stampeding_wildebeests.jpg Oracle:Trample\nAt the beginning of your upkeep, return a green creature you control to its owner's hand. diff --git a/forge-gui/res/cardsfolder/s/standardize.txt b/forge-gui/res/cardsfolder/s/standardize.txt index 39bef978c2f..94f629a8481 100644 --- a/forge-gui/res/cardsfolder/s/standardize.txt +++ b/forge-gui/res/cardsfolder/s/standardize.txt @@ -3,6 +3,6 @@ ManaCost:U U Types:Instant A:SP$ ChooseType | Cost$ U U | Defined$ You | Type$ Creature | InvalidTypes$ Wall | SubAbility$ DBAnimateAll | SpellDescription$ Choose a creature type other than Wall. Each creature becomes that type until end of turn. SVar:DBAnimateAll:DB$ AnimateAll | ValidCards$ Creature | Types$ ChosenType | RemoveCreatureTypes$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/standardize.jpg Oracle:Choose a creature type other than Wall. Each creature becomes that type until end of turn. diff --git a/forge-gui/res/cardsfolder/s/standing_stones.txt b/forge-gui/res/cardsfolder/s/standing_stones.txt index 3254a93481e..2c51d9ce652 100644 --- a/forge-gui/res/cardsfolder/s/standing_stones.txt +++ b/forge-gui/res/cardsfolder/s/standing_stones.txt @@ -2,6 +2,6 @@ Name:Standing Stones ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ 1 T PayLife<1> | Produced$ Any | SpellDescription$ Add one mana of any color. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/standing_stones.jpg Oracle:{1}, {T}, Pay 1 life: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/s/standstill.txt b/forge-gui/res/cardsfolder/s/standstill.txt index 8236863e08b..e89cac6d658 100644 --- a/forge-gui/res/cardsfolder/s/standstill.txt +++ b/forge-gui/res/cardsfolder/s/standstill.txt @@ -9,6 +9,6 @@ SVar:X:Remembered$Amount SVar:Y:Count$Valid Creature.YouCtrl SVar:Z:Count$Valid Creature.OppCtrl SVar:NeedsToPlayVar:Y GTZ -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/standstill.jpg Oracle:When a player casts a spell, sacrifice Standstill. If you do, each of that player's opponents draws three cards. diff --git a/forge-gui/res/cardsfolder/s/starfield_of_nyx.txt b/forge-gui/res/cardsfolder/s/starfield_of_nyx.txt index 7a42fcf8df4..c6bee78ba00 100644 --- a/forge-gui/res/cardsfolder/s/starfield_of_nyx.txt +++ b/forge-gui/res/cardsfolder/s/starfield_of_nyx.txt @@ -8,6 +8,6 @@ SVar:X:Count$Valid Enchantment.YouCtrl SVar:AffectedX:Count$CardManaCost SVar:BuffedBy:Enchantment SVar:PlayMain1:ALWAYS -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/starfield_of_nyx.jpg Oracle:At the beginning of your upkeep, you may return target enchantment card from your graveyard to the battlefield.\nAs long as you control five or more enchantments, each other non-Aura enchantment you control is a creature in addition to its other types and has base power and base toughness each equal to its converted mana cost. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/starke_of_rath.txt b/forge-gui/res/cardsfolder/s/starke_of_rath.txt index 3aa705a3e46..6d3b6abaa20 100644 --- a/forge-gui/res/cardsfolder/s/starke_of_rath.txt +++ b/forge-gui/res/cardsfolder/s/starke_of_rath.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Human Rogue PT:2/2 A:AB$ Destroy | Cost$ T | ValidTgts$ Artifact,Creature | TgtPrompt$ Select target artifact or creature | SubAbility$ TrigControl | SpellDescription$ Destroy target artifact or creature. SVar:TrigControl:DB$ GainControl | Defined$ Self | NewController$ TargetedController | SpellDescription$ That permanent's controller gains control of CARDNAME. (This effect lasts indefinitely.) -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/starke_of_rath.jpg Oracle:{T}: Destroy target artifact or creature. That permanent's controller gains control of Starke of Rath. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/s/starlight.txt b/forge-gui/res/cardsfolder/s/starlight.txt index f5c20b42d91..be69fc434cb 100644 --- a/forge-gui/res/cardsfolder/s/starlight.txt +++ b/forge-gui/res/cardsfolder/s/starlight.txt @@ -3,6 +3,6 @@ ManaCost:1 W Types:Sorcery A:SP$ GainLife | Cost$ 1 W | ValidTgts$ Opponent | Defined$ You | LifeAmount$ X | References$ X | SpellDescription$ You gain 3 life for each black creature target opponent controls. SVar:X:Count$Valid Creature.TargetedPlayerCtrl+Black/Times.3 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/starlight.jpg Oracle:You gain 3 life for each black creature target opponent controls. diff --git a/forge-gui/res/cardsfolder/s/starlit_sanctum.txt b/forge-gui/res/cardsfolder/s/starlit_sanctum.txt index d5a77bae7e9..a15698f7563 100644 --- a/forge-gui/res/cardsfolder/s/starlit_sanctum.txt +++ b/forge-gui/res/cardsfolder/s/starlit_sanctum.txt @@ -6,6 +6,6 @@ A:AB$ GainLife | Cost$ W T Sac<1/Creature.Cleric/Cleric creature> | LifeAmount$ SVar:X:Sacrificed$CardToughness A:AB$ LoseLife | Cost$ B T Sac<1/Creature.Cleric/Cleric creature> | ValidTgts$ Player | LifeAmount$ Y | References$ Y | TgtPrompt$ Select a player | SpellDescription$ Target player loses life equal to the sacrificed creature's power. SVar:Y:Sacrificed$CardPower -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/starlit_sanctum.jpg Oracle:{T}: Add {C}.\n{W}, {T}, Sacrifice a Cleric creature: You gain life equal to the sacrificed creature's toughness.\n{B}, {T}, Sacrifice a Cleric creature: Target player loses life equal to the sacrificed creature's power. diff --git a/forge-gui/res/cardsfolder/s/starved_rusalka.txt b/forge-gui/res/cardsfolder/s/starved_rusalka.txt index 2069ddd0ce2..58fa04b60b4 100644 --- a/forge-gui/res/cardsfolder/s/starved_rusalka.txt +++ b/forge-gui/res/cardsfolder/s/starved_rusalka.txt @@ -3,6 +3,6 @@ ManaCost:G Types:Creature Spirit PT:1/1 A:AB$ GainLife | Cost$ G Sac<1/Creature> | LifeAmount$ 1 | SpellDescription$ You gain 1 life. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/starved_rusalka.jpg Oracle:{G}, Sacrifice a creature: You gain 1 life. diff --git a/forge-gui/res/cardsfolder/s/stasis.txt b/forge-gui/res/cardsfolder/s/stasis.txt index f3cf1bcfd13..76b89021eb2 100644 --- a/forge-gui/res/cardsfolder/s/stasis.txt +++ b/forge-gui/res/cardsfolder/s/stasis.txt @@ -3,7 +3,7 @@ ManaCost:1 U Types:Enchantment S:Mode$ Continuous | Affected$ Player | AddKeyword$ Skip your untap step. | Description$ Players skip their untap steps. K:UpkeepCost:U -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/stasis.jpg Oracle:Players skip their untap steps.\nAt the beginning of your upkeep, sacrifice Stasis unless you pay {U}. diff --git a/forge-gui/res/cardsfolder/s/stasis_cell.txt b/forge-gui/res/cardsfolder/s/stasis_cell.txt index 3a4040e8f08..7e807b9a074 100644 --- a/forge-gui/res/cardsfolder/s/stasis_cell.txt +++ b/forge-gui/res/cardsfolder/s/stasis_cell.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ 4 U | ValidTgts$ Creature | AILogic$ KeepTapped S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Enchanted creature doesn't untap during its controller's untap step. A:AB$ Attach | Cost$ 3 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | AILogic$ KeepTapped | SpellDescription$ Attach CARDNAME to target creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/stasis_cell.jpg Oracle:Enchant creature\nEnchanted creature doesn't untap during its controller's untap step.\n{3}{U}: Attach Stasis Cell to target creature. diff --git a/forge-gui/res/cardsfolder/s/statecraft.txt b/forge-gui/res/cardsfolder/s/statecraft.txt index 91567058bf6..ee68e82fe48 100644 --- a/forge-gui/res/cardsfolder/s/statecraft.txt +++ b/forge-gui/res/cardsfolder/s/statecraft.txt @@ -3,6 +3,6 @@ ManaCost:3 U Types:Enchantment S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddKeyword$ Prevent all combat damage that would be dealt to and dealt by CARDNAME. | Description$ Prevent all combat damage that would be dealt to and dealt by creatures you control. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/statecraft.jpg Oracle:Prevent all combat damage that would be dealt to and dealt by creatures you control. diff --git a/forge-gui/res/cardsfolder/s/static_orb.txt b/forge-gui/res/cardsfolder/s/static_orb.txt index dec058f8302..127565fa294 100644 --- a/forge-gui/res/cardsfolder/s/static_orb.txt +++ b/forge-gui/res/cardsfolder/s/static_orb.txt @@ -3,8 +3,8 @@ ManaCost:3 Types:Artifact S:Mode$ Continuous | Affected$ Player | AddKeyword$ UntapAdjust:Permanent:2 | CheckSVar$ X | SVarCompare$ EQ1 | Description$ As long as CARDNAME is untapped, players can't untap more than two permanents during their untap steps. SVar:X:Count$Valid Card.Self+untapped -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/static_orb.jpg Oracle:As long as Static Orb is untapped, players can't untap more than two permanents during their untap steps. diff --git a/forge-gui/res/cardsfolder/s/steadfastness.txt b/forge-gui/res/cardsfolder/s/steadfastness.txt index b1197fc353c..3c7e87eddd7 100644 --- a/forge-gui/res/cardsfolder/s/steadfastness.txt +++ b/forge-gui/res/cardsfolder/s/steadfastness.txt @@ -2,6 +2,6 @@ Name:Steadfastness ManaCost:1 W Types:Sorcery A:SP$ PumpAll | Cost$ 1 W | ValidCards$ Creature.YouCtrl | NumDef$ +3 | SpellDescription$ Creatures you control get +0/+3 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal/steadfastness.jpg Oracle:Creatures you control get +0/+3 until end of turn. diff --git a/forge-gui/res/cardsfolder/s/steal_enchantment.txt b/forge-gui/res/cardsfolder/s/steal_enchantment.txt index 6b1b7a01ef3..aa082fe5802 100644 --- a/forge-gui/res/cardsfolder/s/steal_enchantment.txt +++ b/forge-gui/res/cardsfolder/s/steal_enchantment.txt @@ -4,6 +4,6 @@ Types:Enchantment Aura K:Enchant enchantment A:SP$ Attach | Cost$ U U | ValidTgts$ Enchantment | AILogic$ GainControl S:Mode$ Continuous | Affected$ Card.EnchantedBy | GainControl$ You | Description$ You control enchanted enchantment. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/steal_enchantment.jpg Oracle:Enchant enchantment\nYou control enchanted enchantment. diff --git a/forge-gui/res/cardsfolder/s/steamclaw.txt b/forge-gui/res/cardsfolder/s/steamclaw.txt index de6fbc43805..603ca6eceac 100644 --- a/forge-gui/res/cardsfolder/s/steamclaw.txt +++ b/forge-gui/res/cardsfolder/s/steamclaw.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact A:AB$ ChangeZone | Cost$ 3 T | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SpellDescription$ Exile target card from a graveyard. A:AB$ ChangeZone | Cost$ 1 Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SpellDescription$ Exile target card from a graveyard. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/steamclaw.jpg Oracle:{3}, {T}: Exile target card from a graveyard.\n{1}, Sacrifice Steamclaw: Exile target card from a graveyard. diff --git a/forge-gui/res/cardsfolder/s/steamcore_weird.txt b/forge-gui/res/cardsfolder/s/steamcore_weird.txt index 005d53f9f2d..509d5dd416f 100644 --- a/forge-gui/res/cardsfolder/s/steamcore_weird.txt +++ b/forge-gui/res/cardsfolder/s/steamcore_weird.txt @@ -5,7 +5,7 @@ PT:1/3 T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigDamage | TriggerDescription$ When CARDNAME enters the battlefield, if {R} was spent to cast CARDNAME, it deals 2 damage to any target. SVar:TrigDamage:DB$ DealDamage | NumDmg$ 2 | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | ConditionManaSpent$ R SVar:ManaNeededToAvoidNegativeEffect:red -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Red SVar:Picture:http://www.wizards.com/global/images/magic/general/steamcore_weird.jpg Oracle:When Steamcore Weird enters the battlefield, if {R} was spent to cast Steamcore Weird, it deals 2 damage to any target. diff --git a/forge-gui/res/cardsfolder/s/steel_golem.txt b/forge-gui/res/cardsfolder/s/steel_golem.txt index cd3884a3955..e42ecb62636 100644 --- a/forge-gui/res/cardsfolder/s/steel_golem.txt +++ b/forge-gui/res/cardsfolder/s/steel_golem.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact Creature Golem PT:3/4 S:Mode$ CantBeCast | ValidCard$ Creature | Caster$ You | Description$ You can't cast creature spells. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/steel_golem.jpg Oracle:You can't cast creature spells. diff --git a/forge-gui/res/cardsfolder/s/steelclad_serpent.txt b/forge-gui/res/cardsfolder/s/steelclad_serpent.txt index e5bd0b50d7b..a111026251e 100644 --- a/forge-gui/res/cardsfolder/s/steelclad_serpent.txt +++ b/forge-gui/res/cardsfolder/s/steelclad_serpent.txt @@ -4,6 +4,6 @@ Types:Artifact Creature Serpent PT:4/5 S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ CARDNAME can't attack. | CheckSVar$ X | SVarCompare$ EQ0 | Description$ CARDNAME can't attack unless you control another artifact. SVar:X:Count$Valid Artifact.YouCtrl+Other -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/steelclad_serpent.jpg Oracle:Steelclad Serpent can't attack unless you control another artifact. diff --git a/forge-gui/res/cardsfolder/s/steeling_stance.txt b/forge-gui/res/cardsfolder/s/steeling_stance.txt index 56d8b5b1bca..7dc88fe7dec 100644 --- a/forge-gui/res/cardsfolder/s/steeling_stance.txt +++ b/forge-gui/res/cardsfolder/s/steeling_stance.txt @@ -3,6 +3,6 @@ ManaCost:1 W W Types:Instant A:SP$ PumpAll | Cost$ 1 W W | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Creatures you control get +1/+1 until end of turn. A:AB$ Pump | Cost$ W | TgtPrompt$ Choose target creature | ValidTgts$ Creature | NumAtt$ +1 | NumDef$ +1 | ActivationZone$ Hand | ActivationLimit$ 1 | PlayerTurn$ True | ActivationPhases$ Upkeep | PrecostDesc$ Forecast — | CostDesc$ {W}, Reveal CARDNAME from your hand: | SpellDescription$ Target creature gets +1/+1 until end of turn. (Activate this ability only during your upkeep and only once each turn.) -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/steeling_stance.jpg Oracle:Creatures you control get +1/+1 until end of turn.\nForecast — {W}, Reveal Steeling Stance from your hand: Target creature gets +1/+1 until end of turn. (Activate this ability only during your upkeep and only once each turn.) diff --git a/forge-gui/res/cardsfolder/s/steelshapers_gift.txt b/forge-gui/res/cardsfolder/s/steelshapers_gift.txt index 09bb06965ef..9fd2eb8097f 100644 --- a/forge-gui/res/cardsfolder/s/steelshapers_gift.txt +++ b/forge-gui/res/cardsfolder/s/steelshapers_gift.txt @@ -2,7 +2,7 @@ Name:Steelshaper's Gift ManaCost:W Types:Sorcery A:SP$ ChangeZone | Cost$ W | Origin$ Library | Destination$ Hand | ChangeType$ Equipment | ChangeNum$ 1 | SpellDescription$ Search your library for an Equipment card, reveal that card, and put it into your hand. Then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Equipment SVar:Picture:http://www.wizards.com/global/images/magic/general/steelshapers_gift.jpg Oracle:Search your library for an Equipment card, reveal that card, and put it into your hand. Then shuffle your library. diff --git a/forge-gui/res/cardsfolder/s/steely_resolve.txt b/forge-gui/res/cardsfolder/s/steely_resolve.txt index 58987c3818c..9c1db233111 100644 --- a/forge-gui/res/cardsfolder/s/steely_resolve.txt +++ b/forge-gui/res/cardsfolder/s/steely_resolve.txt @@ -4,6 +4,6 @@ Types:Enchantment K:ETBReplacement:Other:ChooseCT SVar:ChooseCT:DB$ ChooseType | Defined$ You | Type$ Creature | SpellDescription$ As CARDNAME enters the battlefield, choose a creature type. | AILogic$ MostProminentInComputerDeck S:Mode$ Continuous | Affected$ Creature.ChosenType | AddKeyword$ Shroud | Description$ Creatures of the chosen type have shroud. (They can't be the targets of spells or abilities.) -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/steely_resolve.jpg Oracle:As Steely Resolve enters the battlefield, choose a creature type.\nCreatures of the chosen type have shroud. (They can't be the targets of spells or abilities.) diff --git a/forge-gui/res/cardsfolder/s/stench_of_evil.txt b/forge-gui/res/cardsfolder/s/stench_of_evil.txt index aa9a24ee727..f81c34aa0d6 100644 --- a/forge-gui/res/cardsfolder/s/stench_of_evil.txt +++ b/forge-gui/res/cardsfolder/s/stench_of_evil.txt @@ -5,6 +5,6 @@ A:SP$ DestroyAll | Cost$ 2 B B | ValidCards$ Plains | RememberDestroyed$ True | SVar:DBPay:DB$ RepeatEach | DefinedCards$ DirectRemembered | UseImprinted$ True| RepeatSubAbility$ DBDmg | SubAbility$ DBCleanup | DamageMap$ True SVar:DBDmg:DB$ DealDamage | NumDmg$ 1 | Defined$ ImprintedController | UnlessCost$ 2 | UnlessPayer$ ImprintedController | ShowCurrentCard$ Imprinted SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/stench_of_evil.jpg Oracle:Destroy all Plains. For each land destroyed this way, Stench of Evil deals 1 damage to that land's controller unless they pay {2}. diff --git a/forge-gui/res/cardsfolder/s/stenchskipper.txt b/forge-gui/res/cardsfolder/s/stenchskipper.txt index f4700c6fe41..2a22af84094 100644 --- a/forge-gui/res/cardsfolder/s/stenchskipper.txt +++ b/forge-gui/res/cardsfolder/s/stenchskipper.txt @@ -5,7 +5,7 @@ PT:6/5 K:Flying T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | IsPresent$ Goblin.YouCtrl | PresentCompare$ EQ0 | Execute$ TrigSac | TriggerDescription$ At the beginning of the end step, if you control no Goblins, sacrifice CARDNAME. SVar:TrigSac:DB$Sacrifice | Defined$ Self -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NeedsToPlay:Goblin.YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/stenchskipper.jpg Oracle:Flying\nAt the beginning of the end step, if you control no Goblins, sacrifice Stenchskipper. diff --git a/forge-gui/res/cardsfolder/s/stensia_banquet.txt b/forge-gui/res/cardsfolder/s/stensia_banquet.txt index b926fdf329a..bd70780bbd4 100644 --- a/forge-gui/res/cardsfolder/s/stensia_banquet.txt +++ b/forge-gui/res/cardsfolder/s/stensia_banquet.txt @@ -4,7 +4,7 @@ Types:Sorcery A:SP$ DealDamage | Cost$ 2 R | ValidTgts$ Opponent,Planeswalker | TgtPrompt$ Select target opponent or planeswalker | NumDmg$ X | References$ X | SubAbility$ DBDraw | SpellDescription$ CARDNAME deals damage to target opponent or planeswalker equal to the number of Vampires you control. Draw a card. SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 SVar:X:Count$TypeYouCtrl.Vampire -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Vampire SVar:Picture:http://www.wizards.com/global/images/magic/general/stensia_banquet.jpg Oracle:Stensia Banquet deals damage to target opponent or planeswalker equal to the number of Vampires you control.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/s/sterling_grove.txt b/forge-gui/res/cardsfolder/s/sterling_grove.txt index bd4b3af72cb..5221296ee11 100644 --- a/forge-gui/res/cardsfolder/s/sterling_grove.txt +++ b/forge-gui/res/cardsfolder/s/sterling_grove.txt @@ -3,6 +3,6 @@ ManaCost:G W Types:Enchantment S:Mode$ Continuous | Affected$ Enchantment.Other+YouCtrl | AddKeyword$ Shroud | Description$ Other enchantments you control have shroud. (They can't be the targets of spells or abilities.) A:AB$ ChangeZone | Cost$ 1 Sac<1/CARDNAME> | Origin$ Library | Destination$ Library | ChangeType$ Enchantment | ChangeNum$ 1 | SpellDescription$ Search your library for an enchantment card and reveal that card. Shuffle your library, then put the card on top of it. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sterling_grove.jpg Oracle:Other enchantments you control have shroud. (They can't be the targets of spells or abilities.)\n{1}, Sacrifice Sterling Grove: Search your library for an enchantment card and reveal that card. Shuffle your library, then put the card on top of it. diff --git a/forge-gui/res/cardsfolder/s/stern_judge.txt b/forge-gui/res/cardsfolder/s/stern_judge.txt index 4234cfd4193..e5ff2a3047b 100644 --- a/forge-gui/res/cardsfolder/s/stern_judge.txt +++ b/forge-gui/res/cardsfolder/s/stern_judge.txt @@ -6,6 +6,6 @@ A:AB$ RepeatEach | Cost$ T | RepeatPlayers$ Player | RepeatSubAbility$ DBLoseLif SVar:DBLoseLife:DB$ LoseLife | Defined$ Remembered | LifeAmount$ X | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$Valid Swamp.RememberedPlayerCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://resources.wizards.com/magic/cards/tor/en-us/card35082.jpg Oracle:{T}: Each player loses 1 life for each Swamp they control. diff --git a/forge-gui/res/cardsfolder/s/stifle.txt b/forge-gui/res/cardsfolder/s/stifle.txt index e91508d4480..5cde550fca6 100644 --- a/forge-gui/res/cardsfolder/s/stifle.txt +++ b/forge-gui/res/cardsfolder/s/stifle.txt @@ -2,6 +2,6 @@ Name:Stifle ManaCost:U Types:Instant A:SP$ Counter | Cost$ U | TgtPrompt$ Select target Activated or Triggered Ability | ValidTgts$ Card | TargetType$ Activated,Triggered | SpellDescription$ Counter target activated or triggered ability. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/stifle.jpg Oracle:Counter target activated or triggered ability. (Mana abilities can't be targeted.) diff --git a/forge-gui/res/cardsfolder/s/stinging_licid.txt b/forge-gui/res/cardsfolder/s/stinging_licid.txt index 0731f7ea8b2..e1c5bdf2184 100644 --- a/forge-gui/res/cardsfolder/s/stinging_licid.txt +++ b/forge-gui/res/cardsfolder/s/stinging_licid.txt @@ -7,6 +7,6 @@ SVar:DBAttach:DB$ Attach | ValidTgts$ Creature | AILogic$ Curse SVar:SPAttach:SP$ Attach | Cost$ 0 | ValidTgts$ Creature T:Mode$ Taps | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever enchanted creature becomes tapped, CARDNAME deals 2 damage to that creature's controller. SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredCardController | NumDmg$ 2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/stinging_licid.jpg Oracle:{1}{U}, {T}: Stinging Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {U} to end this effect.\nWhenever enchanted creature becomes tapped, Stinging Licid deals 2 damage to that creature's controller. diff --git a/forge-gui/res/cardsfolder/s/stinkdrinker_bandit.txt b/forge-gui/res/cardsfolder/s/stinkdrinker_bandit.txt index 627281856bb..1bd6d55aa5f 100644 --- a/forge-gui/res/cardsfolder/s/stinkdrinker_bandit.txt +++ b/forge-gui/res/cardsfolder/s/stinkdrinker_bandit.txt @@ -6,6 +6,6 @@ K:Prowl:1 B T:Mode$ AttackerUnblocked | ValidCard$ Rogue.YouCtrl | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever a Rogue you control attacks and isn't blocked, it gets +2/+1 until end of turn. SVar:TrigPump:DB$Pump | NumAtt$ +2 | NumDef$ +1 | Defined$ TriggeredAttacker DeckNeeds:Type$Rogue -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/stinkdrinker_bandit.jpg Oracle:Prowl {1}{B} (You may cast this for its prowl cost if you dealt combat damage to a player this turn with a Goblin or Rogue.)\nWhenever a Rogue you control attacks and isn't blocked, it gets +2/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/s/stinkdrinker_daredevil.txt b/forge-gui/res/cardsfolder/s/stinkdrinker_daredevil.txt index 4aeedc9255e..b90edd5114f 100644 --- a/forge-gui/res/cardsfolder/s/stinkdrinker_daredevil.txt +++ b/forge-gui/res/cardsfolder/s/stinkdrinker_daredevil.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Creature Goblin Rogue PT:1/3 S:Mode$ ReduceCost | ValidCard$ Giant | Type$ Spell | Activator$ You | Amount$ 2 | Description$ Giant spells you cast cost {2} less to cast. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/stinkdrinker_daredevil.jpg Oracle:Giant spells you cast cost {2} less to cast. diff --git a/forge-gui/res/cardsfolder/s/stir_the_pride.txt b/forge-gui/res/cardsfolder/s/stir_the_pride.txt index c216615c268..527ee45eb82 100644 --- a/forge-gui/res/cardsfolder/s/stir_the_pride.txt +++ b/forge-gui/res/cardsfolder/s/stir_the_pride.txt @@ -8,6 +8,6 @@ SVar:DBAnimateAll:DB$ AnimateAll | ValidCards$ Creature.YouCtrl | Triggers$ Trig SVar:TrigPrideDamage:Mode$ DamageDealtOnce | ValidSource$ Card.Self | Execute$ GainLife | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage, you gain that much life. SVar:GainLife:DB$ GainLife | LifeAmount$ GainLifeX | References$ GainLifeX SVar:GainLifeX:TriggerCount$DamageAmount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/stir_the_pride.jpg Oracle:Choose one —\n• Creatures you control get +2/+2 until end of turn.\n• Until end of turn, creatures you control gain "Whenever this creature deals damage, you gain that much life."\nEntwine {1}{W} (Choose both if you pay the entwine cost.) diff --git a/forge-gui/res/cardsfolder/s/stitchers_apprentice.txt b/forge-gui/res/cardsfolder/s/stitchers_apprentice.txt index bebd25491d4..847d9174114 100644 --- a/forge-gui/res/cardsfolder/s/stitchers_apprentice.txt +++ b/forge-gui/res/cardsfolder/s/stitchers_apprentice.txt @@ -4,6 +4,6 @@ Types:Creature Homunculus PT:1/2 A:AB$ Token | Cost$ 1 U T | TokenImage$ u 2 2 homunculus | TokenAmount$ 1 | TokenName$ Homunculus | TokenTypes$ Creature,Homunculus | TokenOwner$ You | TokenColors$ Blue | TokenPower$ 2 | TokenToughness$ 2 | SubAbility$ DBSac | SpellDescription$ Create a 2/2 blue Homunculus creature token, then sacrifice a creature. SVar:DBSac:DB$Sacrifice | SacValid$ Creature | Defined$ You | Amount$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/stitchers_apprentice.jpg Oracle:{1}{U}, {T}: Create a 2/2 blue Homunculus creature token, then sacrifice a creature. diff --git a/forge-gui/res/cardsfolder/s/stoic_champion.txt b/forge-gui/res/cardsfolder/s/stoic_champion.txt index 94ec01052c1..79af4ad90bf 100644 --- a/forge-gui/res/cardsfolder/s/stoic_champion.txt +++ b/forge-gui/res/cardsfolder/s/stoic_champion.txt @@ -4,6 +4,6 @@ Types:Creature Human Soldier PT:2/2 T:Mode$ Cycled | ValidCard$ Card | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player cycles a card, CARDNAME gets +2/+2 until end of turn. SVar:TrigPump:DB$Pump | Defined$ Self | NumAtt$ +2 | NumDef$ +2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/stoic_champion.jpg Oracle:Whenever a player cycles a card, Stoic Champion gets +2/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/s/stomping_slabs.txt b/forge-gui/res/cardsfolder/s/stomping_slabs.txt index cc9f7b6505e..e442105828e 100644 --- a/forge-gui/res/cardsfolder/s/stomping_slabs.txt +++ b/forge-gui/res/cardsfolder/s/stomping_slabs.txt @@ -4,7 +4,7 @@ Types:Sorcery A:SP$ Dig | Cost$ 2 R | DigNum$ 7 | Reveal$ True | RememberRevealed$ True | DestinationZone$ Library | LibraryPosition$ -1 | LibraryPosition2$ -1 | SubAbility$ DBDamage | SpellDescription$ Reveal the top seven cards of your library, then put those cards on the bottom of your library in any order. If a card named CARDNAME was revealed this way, CARDNAME deals 7 damage to any target. SVar:DBDamage:DB$ DealDamage | NumDmg$ 7 | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | ConditionDefined$ Remembered | ConditionPresent$ Card.namedStomping Slabs | ConditionCompare$ GE1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Name$Stomping Slabs SVar:Picture:http://www.wizards.com/global/images/magic/general/stomping_slabs.jpg Oracle:Reveal the top seven cards of your library, then put those cards on the bottom of your library in any order. If a card named Stomping Slabs was revealed this way, Stomping Slabs deals 7 damage to any target. diff --git a/forge-gui/res/cardsfolder/s/stoneforge_masterwork.txt b/forge-gui/res/cardsfolder/s/stoneforge_masterwork.txt index 91d37567fe0..0b71cc9d2d8 100644 --- a/forge-gui/res/cardsfolder/s/stoneforge_masterwork.txt +++ b/forge-gui/res/cardsfolder/s/stoneforge_masterwork.txt @@ -4,7 +4,7 @@ Types:Artifact Equipment S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ AffectedX | AddToughness$ AffectedX | References$ AffectedX | EffectZone$ Battlefield | Description$ Equipped creature gets +1/+1 for each other creature you control that shares a creature type with it. SVar:AffectedX:Count$Valid Creature.sharesCreatureTypeWith+Other+YouCtrl SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random K:Equip:2 SVar:Picture:http://www.wizards.com/global/images/magic/general/stoneforge_masterwork.jpg Oracle:Equipped creature gets +1/+1 for each other creature you control that shares a creature type with it.\nEquip {2} diff --git a/forge-gui/res/cardsfolder/s/stoneshaker_shaman.txt b/forge-gui/res/cardsfolder/s/stoneshaker_shaman.txt index f4045ec4f73..4b26b3234e4 100644 --- a/forge-gui/res/cardsfolder/s/stoneshaker_shaman.txt +++ b/forge-gui/res/cardsfolder/s/stoneshaker_shaman.txt @@ -6,6 +6,6 @@ T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigSa SVar:TrigSac:DB$ Sacrifice | SacValid$ Land.untapped | Defined$ TriggeredPlayer | SpellDescription$ Sacrifice an untapped land. S:Mode$ Continuous | Affected$ Land | AddSVar$ AITap SVar:AITap:SVar:AITapDown:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/stoneshaker_shaman.jpg Oracle:At the beginning of each player's end step, that player sacrifices an untapped land. diff --git a/forge-gui/res/cardsfolder/s/stonewise_fortifier.txt b/forge-gui/res/cardsfolder/s/stonewise_fortifier.txt index 12c568239bd..2aee12be7cd 100644 --- a/forge-gui/res/cardsfolder/s/stonewise_fortifier.txt +++ b/forge-gui/res/cardsfolder/s/stonewise_fortifier.txt @@ -4,6 +4,6 @@ Types:Creature Human Wizard PT:2/2 A:AB$ Effect | Cost$ 4 W | ValidTgts$ Creature | RememberObjects$ Targeted | ImprintCards$ Self | ForgetOnMoved$ Battlefield | ReplacementEffects$ RPrevent | Duration$ HostLeavesOrEOT | SpellDescription$ Prevent all damage that would be dealt to CARDNAME by target creature this turn. SVar:RPrevent:Event$ DamageDone | Prevent$ True | IsCombat$ True | ActiveZones$ Command | ValidTarget$ Card.IsImprinted | ValidSource$ Creature.IsRemembered | Description$ Prevent all damage that would be dealt to CARDNAME by target creature this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/stonewise_fortifier.jpg Oracle:{4}{W}: Prevent all damage that would be dealt to Stonewise Fortifier by target creature this turn. diff --git a/forge-gui/res/cardsfolder/s/stony_silence.txt b/forge-gui/res/cardsfolder/s/stony_silence.txt index d82ac7005bf..6157c9da110 100644 --- a/forge-gui/res/cardsfolder/s/stony_silence.txt +++ b/forge-gui/res/cardsfolder/s/stony_silence.txt @@ -3,6 +3,6 @@ ManaCost:1 W Types:Enchantment S:Mode$ Continuous | Affected$ Artifact | AddHiddenKeyword$ CARDNAME's activated abilities can't be activated. | Description$ Activated abilities of artifacts can't be activated. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/stony_silence.jpg Oracle:Activated abilities of artifacts can't be activated. diff --git a/forge-gui/res/cardsfolder/s/stonybrook_angler.txt b/forge-gui/res/cardsfolder/s/stonybrook_angler.txt index ec117ce81f9..9a49a075f2b 100644 --- a/forge-gui/res/cardsfolder/s/stonybrook_angler.txt +++ b/forge-gui/res/cardsfolder/s/stonybrook_angler.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Creature Merfolk Wizard PT:1/2 A:AB$ TapOrUntap | Cost$ 1 U T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ You may tap or untap target creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/stonybrook_angler.jpg Oracle:{1}{U}, {T}: You may tap or untap target creature. diff --git a/forge-gui/res/cardsfolder/s/storage_matrix.txt b/forge-gui/res/cardsfolder/s/storage_matrix.txt index c26ba1742f6..e0e22ea8572 100644 --- a/forge-gui/res/cardsfolder/s/storage_matrix.txt +++ b/forge-gui/res/cardsfolder/s/storage_matrix.txt @@ -3,7 +3,7 @@ ManaCost:3 Types:Artifact S:Mode$ Continuous | Affected$ Player | AddKeyword$ OnlyUntapChosen:Artifact,Creature,Land | CheckSVar$ X | SVarCompare$ EQ1 | Description$ As long as CARDNAME is untapped, each player chooses artifact, creature, or land during their untap step. That player can untap only permanents of the chosen type this step. SVar:X:Count$Valid Card.Self+untapped -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/storage_matrix.jpg Oracle:As long as Storage Matrix is untapped, each player chooses artifact, creature, or land during their untap step. That player can untap only permanents of the chosen type this step. diff --git a/forge-gui/res/cardsfolder/s/storm_cauldron.txt b/forge-gui/res/cardsfolder/s/storm_cauldron.txt index a0f6505a3ab..c3f77e6be87 100644 --- a/forge-gui/res/cardsfolder/s/storm_cauldron.txt +++ b/forge-gui/res/cardsfolder/s/storm_cauldron.txt @@ -4,6 +4,6 @@ Types:Artifact S:Mode$ Continuous | Affected$ Player | AddKeyword$ AdjustLandPlays:1 | Description$ Each player may play an additional land during each of their turns. T:Mode$ TapsForMana | ValidCard$ Land | Execute$ TrigBounce | TriggerZones$ Battlefield | TriggerDescription$ Whenever a land is tapped for mana, return it to its owner's hand. SVar:TrigBounce:DB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Defined$ TriggeredCard -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/storm_cauldron.jpg Oracle:Each player may play an additional land during each of their turns.\nWhenever a land is tapped for mana, return it to its owner's hand. diff --git a/forge-gui/res/cardsfolder/s/storm_world.txt b/forge-gui/res/cardsfolder/s/storm_world.txt index 189c56bdf1a..0421116cdb1 100644 --- a/forge-gui/res/cardsfolder/s/storm_world.txt +++ b/forge-gui/res/cardsfolder/s/storm_world.txt @@ -4,6 +4,6 @@ Types:World Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of each player's upkeep, CARDNAME deals X damage to that player, where X is 4 minus the number of cards in their hand. SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredPlayer | NumDmg$ X | References$ X SVar:X:Count$ValidHand Card.ActivePlayerCtrl/NMinus.4 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/storm_world.jpg Oracle:At the beginning of each player's upkeep, Storm World deals X damage to that player, where X is 4 minus the number of cards in their hand. diff --git a/forge-gui/res/cardsfolder/s/stormfront_riders.txt b/forge-gui/res/cardsfolder/s/stormfront_riders.txt index 20308559f4b..24574971952 100644 --- a/forge-gui/res/cardsfolder/s/stormfront_riders.txt +++ b/forge-gui/res/cardsfolder/s/stormfront_riders.txt @@ -10,6 +10,6 @@ SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenName$ Soldier | TokenTypes$ Cre SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Hidden$ True | ChangeType$ Creature.YouCtrl | ChangeNum$ 2 | Mandatory$ True SVar:NeedsToPlayVar:Z GE2 SVar:Z:Count$Valid Creature.YouCtrl+cmcLE4+inZoneBattlefield -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/stormfront_riders.jpg Oracle:Flying\nWhen Stormfront Riders enters the battlefield, return two creatures you control to their owner's hand.\nWhenever Stormfront Riders or another creature is returned to your hand from the battlefield, create a 1/1 white Soldier creature token. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/stormscale_anarch.txt b/forge-gui/res/cardsfolder/s/stormscale_anarch.txt index b4adfc85430..fe6bf6ebfc4 100644 --- a/forge-gui/res/cardsfolder/s/stormscale_anarch.txt +++ b/forge-gui/res/cardsfolder/s/stormscale_anarch.txt @@ -4,6 +4,6 @@ Types:Creature Viashino Shaman PT:2/2 A:AB$ DealDamage | Cost$ 2 R Discard<1/Random> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | SpellDescription$ CARDNAME deals 2 damage to any target. If the discarded card was multicolored, CARDNAME deals 4 damage to that permanent or player instead. SVar:X:Discarded$CardMulticolor.4.2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/stormscale_anarch.jpg Oracle:{2}{R}, Discard a card at random: Stormscale Anarch deals 2 damage to any target. If the discarded card was multicolored, Stormscale Anarch deals 4 damage to that permanent or player instead. diff --git a/forge-gui/res/cardsfolder/s/stormscape_master.txt b/forge-gui/res/cardsfolder/s/stormscape_master.txt index 4b8a489ea4c..d0d516e77fa 100644 --- a/forge-gui/res/cardsfolder/s/stormscape_master.txt +++ b/forge-gui/res/cardsfolder/s/stormscape_master.txt @@ -5,7 +5,7 @@ PT:2/2 A:AB$ Protection | Cost$ W W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | Gains$ Choice | Choices$ AnyColor | SpellDescription$ Target creature gains protection from the color of your choice until end of turn. A:AB$ LoseLife | Cost$ B B T | ValidTgts$ Player | TgtPrompt$ Select target player | LifeAmount$ 2 | SubAbility$ DBGainLife | SpellDescription$ Target player loses 2 life and you gain 2 life. SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black|White SVar:Picture:http://www.wizards.com/global/images/magic/general/stormscape_master.jpg Oracle:{W}{W}, {T}: Target creature gains protection from the color of your choice until end of turn.\n{B}{B}, {T}: Target player loses 2 life and you gain 2 life. diff --git a/forge-gui/res/cardsfolder/s/stormsurge_kraken.txt b/forge-gui/res/cardsfolder/s/stormsurge_kraken.txt index 2c7bb8f94d2..bd94bd7f066 100644 --- a/forge-gui/res/cardsfolder/s/stormsurge_kraken.txt +++ b/forge-gui/res/cardsfolder/s/stormsurge_kraken.txt @@ -8,6 +8,6 @@ SVar:TrigBlocked:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ Stormsu SVar:StormsurgeKrakenDraw:DB$ Draw | NumCards$ 2 SVar:X:Count$Valid Card.IsCommander+YouOwn+YouCtrl SVar:BuffedBy:Card.IsCommander -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/stormsurge_kraken.jpg Oracle:Hexproof\nLieutenant — As long as you control your commander, Stormsurge Kraken gets +2/+2 and has "Whenever Stormsurge Kraken becomes blocked, you may draw two cards." diff --git a/forge-gui/res/cardsfolder/s/stormwatch_eagle.txt b/forge-gui/res/cardsfolder/s/stormwatch_eagle.txt index 713777eeb7a..3399683e3f9 100644 --- a/forge-gui/res/cardsfolder/s/stormwatch_eagle.txt +++ b/forge-gui/res/cardsfolder/s/stormwatch_eagle.txt @@ -4,6 +4,6 @@ Types:Creature Bird PT:2/1 K:Flying A:AB$ ChangeZone | Cost$ Sac<1/Land> | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/stormwatch_eagle.jpg Oracle:Flying\nSacrifice a land: Return Stormwatch Eagle to its owner's hand. diff --git a/forge-gui/res/cardsfolder/s/strands_of_night.txt b/forge-gui/res/cardsfolder/s/strands_of_night.txt index d4214f35bca..d3540de02fb 100644 --- a/forge-gui/res/cardsfolder/s/strands_of_night.txt +++ b/forge-gui/res/cardsfolder/s/strands_of_night.txt @@ -2,7 +2,7 @@ Name:Strands of Night ManaCost:2 B B Types:Enchantment A:AB$ ChangeZone | Cost$ B B PayLife<2> Sac<1/Swamp> | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | Origin$ Graveyard | Destination$ Battlefield | SpellDescription$ Return target creature card from your graveyard to the battlefield. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/strands_of_night.jpg Oracle:{B}{B}, Pay 2 life, Sacrifice a Swamp: Return target creature card from your graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/s/strange_inversion.txt b/forge-gui/res/cardsfolder/s/strange_inversion.txt index 32a0f1d73dc..380bb4ea222 100644 --- a/forge-gui/res/cardsfolder/s/strange_inversion.txt +++ b/forge-gui/res/cardsfolder/s/strange_inversion.txt @@ -3,7 +3,7 @@ ManaCost:2 R Types:Instant Arcane K:Splice:Arcane:1 R A:SP$ Pump | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch target creature's power and toughness until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHints:Type$Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/strange_inversion.jpg Oracle:Switch target creature's power and toughness until end of turn.\nSplice onto Arcane {1}{R} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) diff --git a/forge-gui/res/cardsfolder/s/stranglehold.txt b/forge-gui/res/cardsfolder/s/stranglehold.txt index a38688b481a..78db97549dd 100644 --- a/forge-gui/res/cardsfolder/s/stranglehold.txt +++ b/forge-gui/res/cardsfolder/s/stranglehold.txt @@ -3,6 +3,6 @@ ManaCost:3 R Types:Enchantment S:Mode$ Continuous | Affected$ Opponent | AddKeyword$ CantSearchLibrary | Description$ Your opponents can't search libraries. S:Mode$ Continuous | Affected$ Opponent | AddKeyword$ If you would begin an extra turn, skip that turn instead. | Description$ If an opponent would begin an extra turn, that player skips that turn instead. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/stranglehold.jpg Oracle:Your opponents can't search libraries.\nIf an opponent would begin an extra turn, that player skips that turn instead. diff --git a/forge-gui/res/cardsfolder/s/strata_scythe.txt b/forge-gui/res/cardsfolder/s/strata_scythe.txt index 05c0a45b68d..87ed6f7d920 100644 --- a/forge-gui/res/cardsfolder/s/strata_scythe.txt +++ b/forge-gui/res/cardsfolder/s/strata_scythe.txt @@ -8,6 +8,6 @@ S:Mode$ Continuous | Affected$ Card.EquippedBy | AddPower$ X | AddToughness$ X | SVar:X:Count$Valid Land.sharesNameWith Imprinted T:Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Card.Self | Destination$ Any | Execute$ DBCleanup | Static$ True SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/strata_scythe.jpg Oracle:Imprint — When Strata Scythe enters the battlefield, search your library for a land card, exile it, then shuffle your library.\nEquipped creature gets +1/+1 for each land on the battlefield with the same name as the exiled card.\nEquip {3} diff --git a/forge-gui/res/cardsfolder/s/stratadon.txt b/forge-gui/res/cardsfolder/s/stratadon.txt index 497931c96c2..75644141cb8 100644 --- a/forge-gui/res/cardsfolder/s/stratadon.txt +++ b/forge-gui/res/cardsfolder/s/stratadon.txt @@ -5,6 +5,6 @@ PT:5/5 K:Trample S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ Domain — CARDNAME costs {1} less to cast for each basic land type among lands you control. SVar:X:Count$Domain -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/stratadon.jpg Oracle:Domain — Stratadon costs {1} less to cast for each basic land type among lands you control.\nTrample diff --git a/forge-gui/res/cardsfolder/s/strategic_planning.txt b/forge-gui/res/cardsfolder/s/strategic_planning.txt index 36b557ba599..c5c10453d45 100644 --- a/forge-gui/res/cardsfolder/s/strategic_planning.txt +++ b/forge-gui/res/cardsfolder/s/strategic_planning.txt @@ -2,6 +2,6 @@ Name:Strategic Planning ManaCost:1 U Types:Sorcery A:SP$ Dig | Cost$ 1 U | DigNum$ 3 | DestinationZone2$ Graveyard | SpellDescription$ Look at the top three cards of your library. Put one of them into your hand and the rest into your graveyard. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/strategic_planning.jpg Oracle:Look at the top three cards of your library. Put one of them into your hand and the rest into your graveyard. diff --git a/forge-gui/res/cardsfolder/s/stream_of_consciousness.txt b/forge-gui/res/cardsfolder/s/stream_of_consciousness.txt index 047f100d086..28aace8fbb4 100644 --- a/forge-gui/res/cardsfolder/s/stream_of_consciousness.txt +++ b/forge-gui/res/cardsfolder/s/stream_of_consciousness.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Instant Arcane A:SP$ Pump | Cost$ 1 U | ValidTgts$ Player | TgtPrompt$ Select target Player | SubAbility$ DBChangeZone | IsCurse$ True | SpellDescription$ Target player shuffles up to four target cards from their graveyard into their library. SVar:DBChangeZone:DB$ ChangeZone | TargetMin$ 0 | TargetMax$ 4 | TargetsWithDefinedController$ ParentTarget | Origin$ Graveyard | Destination$ Library | Shuffle$ True | TgtPrompt$ Choose target card | ValidTgts$ Card -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/stream_of_consciousness.jpg Oracle:Target player shuffles up to four target cards from their graveyard into their library. diff --git a/forge-gui/res/cardsfolder/s/street_sweeper.txt b/forge-gui/res/cardsfolder/s/street_sweeper.txt index 2cca0ee0177..3f918d4e265 100644 --- a/forge-gui/res/cardsfolder/s/street_sweeper.txt +++ b/forge-gui/res/cardsfolder/s/street_sweeper.txt @@ -4,6 +4,6 @@ Types:Artifact Creature Construct PT:4/6 T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDestroyAll | TriggerDescription$ Whenever CARDNAME attacks, destroy all Auras attached to target land. SVar:TrigDestroyAll:DB$ DestroyAll | ValidCards$ Card.Aura+AttachedTo Targeted | ValidTgts$ Land | TgtPrompt$ Select target land -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/street_sweeper.jpg Oracle:Whenever Street Sweeper attacks, destroy all Auras attached to target land. diff --git a/forge-gui/res/cardsfolder/s/strength_of_night.txt b/forge-gui/res/cardsfolder/s/strength_of_night.txt index af7299dc3dc..2b933f0fda3 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, -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black & Type$Zombie 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/s/strength_of_unity.txt b/forge-gui/res/cardsfolder/s/strength_of_unity.txt index 31a2b172953..05cdd74c2fc 100644 --- a/forge-gui/res/cardsfolder/s/strength_of_unity.txt +++ b/forge-gui/res/cardsfolder/s/strength_of_unity.txt @@ -6,6 +6,6 @@ A:SP$ Attach | Cost$ 3 W | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ X | AddToughness$ X | Description$ Domain — Enchanted creature gets +1/+1 for each basic land type among lands you control. SVar:X:Count$Domain SVar:BuffedBy:Plains,Island,Swamp,Mountain,Forest -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/strength_of_unity.jpg Oracle:Enchant creature\nDomain — Enchanted creature gets +1/+1 for each basic land type among lands you control. diff --git a/forge-gui/res/cardsfolder/s/strionic_resonator.txt b/forge-gui/res/cardsfolder/s/strionic_resonator.txt index a4e29b64c98..06f879f323c 100644 --- a/forge-gui/res/cardsfolder/s/strionic_resonator.txt +++ b/forge-gui/res/cardsfolder/s/strionic_resonator.txt @@ -2,7 +2,7 @@ Name:Strionic Resonator ManaCost:2 Types:Artifact A:AB$ CopySpellAbility | Cost$ 2 T | TargetType$ Triggered | ValidTgts$ Card.YouCtrl | SpellDescription$ Copy target triggered ability you control. You may choose new targets for the copy. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/strionic_resonator.jpg Oracle:{2}, {T}: Copy target triggered ability you control. You may choose new targets for the copy. (A triggered ability uses the words "when," "whenever," or "at.") diff --git a/forge-gui/res/cardsfolder/s/strip_bare.txt b/forge-gui/res/cardsfolder/s/strip_bare.txt index 3b897a238cc..99a2d8416ff 100644 --- a/forge-gui/res/cardsfolder/s/strip_bare.txt +++ b/forge-gui/res/cardsfolder/s/strip_bare.txt @@ -2,6 +2,6 @@ Name:Strip Bare ManaCost:W Types:Instant A:SP$ DestroyAll | Cost$ W | ValidCards$ Card.AttachedTo Targeted | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Destroy all Auras and Equipment attached to target creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/strip_bare.jpg Oracle:Destroy all Auras and Equipment attached to target creature. diff --git a/forge-gui/res/cardsfolder/s/stromgald_cabal.txt b/forge-gui/res/cardsfolder/s/stromgald_cabal.txt index 3d05d0f1386..5bafa5624ba 100644 --- a/forge-gui/res/cardsfolder/s/stromgald_cabal.txt +++ b/forge-gui/res/cardsfolder/s/stromgald_cabal.txt @@ -3,6 +3,6 @@ ManaCost:1 B B Types:Creature Human Knight PT:2/2 A:AB$ Counter | Cost$ T PayLife<1> | TargetType$ Spell | TgtPrompt$ Select target White spell | ValidTgts$ Card.White | SpellDescription$ Counter target white spell. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/stromgald_cabal.jpg Oracle:{T}, Pay 1 life: Counter target white spell. diff --git a/forge-gui/res/cardsfolder/s/stromgald_spy.txt b/forge-gui/res/cardsfolder/s/stromgald_spy.txt index 4262962cdd0..66a10254ea3 100644 --- a/forge-gui/res/cardsfolder/s/stromgald_spy.txt +++ b/forge-gui/res/cardsfolder/s/stromgald_spy.txt @@ -6,6 +6,6 @@ T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | E SVar:TrigExile:DB$ Effect | StaticAbilities$ STRevealHand | RememberObjects$ DefendingPlayer | Duration$ UntilHostLeavesPlay | SubAbility$ DBPump SVar:DBPump:DB$ Pump | Defined$ Self | KW$ HIDDEN CARDNAME assigns no combat damage SVar:STRevealHand:Mode$ Continuous | EffectZone$ Command | Affected$ Player.IsRemembered | AddKeyword$ Play with your hand revealed. | Description$ The defending player plays with their hand revealed. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/stromgald_spy.jpg Oracle:Whenever Stromgald Spy attacks and isn't blocked, you may have defending player play with their hand revealed for as long as Stromgald Spy remains on the battlefield. If you do, Stromgald Spy assigns no combat damage this turn. diff --git a/forge-gui/res/cardsfolder/s/strongarm_tactics.txt b/forge-gui/res/cardsfolder/s/strongarm_tactics.txt index 27609bddd9a..2fb6e185581 100644 --- a/forge-gui/res/cardsfolder/s/strongarm_tactics.txt +++ b/forge-gui/res/cardsfolder/s/strongarm_tactics.txt @@ -6,7 +6,7 @@ SVar:DBRepeat:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBLoseL SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 4 | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | Defined$ Player.IsRemembered | References$ X SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Valid Creature.RememberedPlayerCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NeedsToPlayVar:Z GE1 SVar:Z:Count$TypeInYourHand.Creature SVar:Picture:http://www.wizards.com/global/images/magic/general/strongarm_tactics.jpg diff --git a/forge-gui/res/cardsfolder/s/strongarm_thug.txt b/forge-gui/res/cardsfolder/s/strongarm_thug.txt index 13b31399720..651a46f53c1 100644 --- a/forge-gui/res/cardsfolder/s/strongarm_thug.txt +++ b/forge-gui/res/cardsfolder/s/strongarm_thug.txt @@ -4,6 +4,6 @@ Types:Creature Human Mercenary PT:1/1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may return target Mercenary card from your graveyard to your hand. SVar:TrigChangeZone:DB$ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Mercenary.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/strongarm_thug.jpg Oracle:When Strongarm Thug enters the battlefield, you may return target Mercenary card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/s/stronghold_assassin.txt b/forge-gui/res/cardsfolder/s/stronghold_assassin.txt index 9ca325fdcca..3be97d56469 100644 --- a/forge-gui/res/cardsfolder/s/stronghold_assassin.txt +++ b/forge-gui/res/cardsfolder/s/stronghold_assassin.txt @@ -3,6 +3,6 @@ ManaCost:1 B B Types:Creature Zombie Assassin PT:2/1 A:AB$ Destroy | Cost$ T Sac<1/Creature> | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | SpellDescription$ Destroy target nonblack creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/stronghold_assassin.jpg Oracle:{T}, Sacrifice a creature: Destroy target nonblack creature. diff --git a/forge-gui/res/cardsfolder/s/stronghold_discipline.txt b/forge-gui/res/cardsfolder/s/stronghold_discipline.txt index f5af173c23e..c95996f776c 100644 --- a/forge-gui/res/cardsfolder/s/stronghold_discipline.txt +++ b/forge-gui/res/cardsfolder/s/stronghold_discipline.txt @@ -5,6 +5,6 @@ A:SP$ RepeatEach | Cost$ 2 B B | RepeatPlayers$ Player | RepeatSubAbility$ DBLos SVar:DBLoseLife:DB$ LoseLife | Defined$ Player.IsRemembered | LifeAmount$ X | References$ X SVar:X:Count$Valid Creature.RememberedPlayerCtrl SVar:AIPlayForSub:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/stronghold_discipline.jpg Oracle:Each player loses 1 life for each creature they control. diff --git a/forge-gui/res/cardsfolder/s/stronghold_gambit.txt b/forge-gui/res/cardsfolder/s/stronghold_gambit.txt index e44d8e01b3e..37ed909a900 100644 --- a/forge-gui/res/cardsfolder/s/stronghold_gambit.txt +++ b/forge-gui/res/cardsfolder/s/stronghold_gambit.txt @@ -8,6 +8,6 @@ SVar:DBRevealCard:DB$ Reveal | Defined$ Player.IsRemembered | RevealDefined$ Val SVar:FilterCreature:DB$ Pump | ForgetObjects$ ValidHand Card.nonCreature+IsRemembered | SubAbility$ MoveToPlay SVar:MoveToPlay:DB$ ChangeZoneAll | ChangeType$ Card.lowestRememberedCMC | Origin$ Hand | Destination$ Battlefield | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/stronghold_gambit.jpg Oracle:Each player chooses a card in their hand. Then each player reveals their chosen card. The owner of each creature card revealed this way with the lowest converted mana cost puts it onto the battlefield. diff --git a/forge-gui/res/cardsfolder/s/stronghold_machinist.txt b/forge-gui/res/cardsfolder/s/stronghold_machinist.txt index 132eb351cfa..26854f6bf61 100644 --- a/forge-gui/res/cardsfolder/s/stronghold_machinist.txt +++ b/forge-gui/res/cardsfolder/s/stronghold_machinist.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Creature Human Spellshaper PT:1/1 A:AB$ Counter | Cost$ U U T Discard<1/Card> | TargetType$ Spell | TgtPrompt$ Select target nonCreature spell | ValidTgts$ Card.nonCreature | SpellDescription$ Counter target noncreature spell. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/stronghold_machinist.jpg Oracle:{U}{U}, {T}, Discard a card: Counter target noncreature spell. diff --git a/forge-gui/res/cardsfolder/s/stronghold_rats.txt b/forge-gui/res/cardsfolder/s/stronghold_rats.txt index 4a6dd840ce8..2c11165f168 100644 --- a/forge-gui/res/cardsfolder/s/stronghold_rats.txt +++ b/forge-gui/res/cardsfolder/s/stronghold_rats.txt @@ -5,6 +5,6 @@ PT:2/1 K:Shadow T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDiscard | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, each player discards a card. SVar:TrigDiscard:DB$Discard | Defined$ Player | NumCards$ 1 | Mode$ TgtChoose -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/stronghold_rats.jpg Oracle:Shadow (This creature can block or be blocked by only creatures with shadow.)\nWhenever Stronghold Rats deals combat damage to a player, each player discards a card. diff --git a/forge-gui/res/cardsfolder/s/stronghold_taskmaster.txt b/forge-gui/res/cardsfolder/s/stronghold_taskmaster.txt index 6d141ff3b31..ef64397f10e 100644 --- a/forge-gui/res/cardsfolder/s/stronghold_taskmaster.txt +++ b/forge-gui/res/cardsfolder/s/stronghold_taskmaster.txt @@ -3,6 +3,6 @@ ManaCost:2 B B Types:Creature Giant Minion PT:4/3 S:Mode$ Continuous | Affected$ Creature.Black+Other | AddPower$ -1 | AddToughness$ -1 | Description$ Other black creatures get -1/-1. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/stronghold_taskmaster.jpg Oracle:Other black creatures get -1/-1. diff --git a/forge-gui/res/cardsfolder/s/student_of_elements_tobita_master_of_winds.txt b/forge-gui/res/cardsfolder/s/student_of_elements_tobita_master_of_winds.txt index 856c740d0d1..82b1ac3ef11 100644 --- a/forge-gui/res/cardsfolder/s/student_of_elements_tobita_master_of_winds.txt +++ b/forge-gui/res/cardsfolder/s/student_of_elements_tobita_master_of_winds.txt @@ -4,7 +4,7 @@ Types:Creature Human Wizard PT:1/1 T:Mode$ Always | IsPresent$ Card.Self+withFlying | TriggerZones$ Battlefield | Execute$ TrigFlip | TriggerDescription$ When CARDNAME has flying, flip it. SVar:TrigFlip:DB$SetState | Defined$ Self | Mode$ Flip -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/student_of_elements.jpg AlternateMode:Flip Oracle:When Student of Elements has flying, flip it. diff --git a/forge-gui/res/cardsfolder/s/stunning_reversal.txt b/forge-gui/res/cardsfolder/s/stunning_reversal.txt index 8b4d5148664..2436c9fa6a8 100644 --- a/forge-gui/res/cardsfolder/s/stunning_reversal.txt +++ b/forge-gui/res/cardsfolder/s/stunning_reversal.txt @@ -7,6 +7,6 @@ SVar:DrawSeven:DB$ Draw | NumCards$ 7 | SubAbility$ DBSetLife SVar:DBSetLife:DB$ SetLife | Defined$ You | LifeAmount$ 1 | SubAbility$ ExileEffect SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBExile:DB$ ChangeZone | Defined$ Self | Origin$ Stack | Destination$ Exile -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random Oracle:The next time you would lose the game this turn, instead draw seven cards and your life total becomes 1.\nExile Stunning Reversal. diff --git a/forge-gui/res/cardsfolder/s/subdue.txt b/forge-gui/res/cardsfolder/s/subdue.txt index 417e9bb1bd6..89ff01f435e 100644 --- a/forge-gui/res/cardsfolder/s/subdue.txt +++ b/forge-gui/res/cardsfolder/s/subdue.txt @@ -3,6 +3,6 @@ ManaCost:G Types:Instant A:SP$ Pump | Cost$ G | ValidTgts$ Creature | NumAtt$ 0 | NumDef$ +X | KW$ Prevent all combat damage that would be dealt by CARDNAME | TgtPrompt$ Select target creature | SpellDescription$ Prevent all combat damage that would be dealt by target creature this turn. That creature gets +0/+X until end of turn, where X is its converted mana cost. SVar:X:Targeted$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/subdue.jpg Oracle:Prevent all combat damage that would be dealt by target creature this turn. That creature gets +0/+X until end of turn, where X is its converted mana cost. diff --git a/forge-gui/res/cardsfolder/s/subterranean_hangar.txt b/forge-gui/res/cardsfolder/s/subterranean_hangar.txt index feed67cdc02..8e66ea7b7d7 100644 --- a/forge-gui/res/cardsfolder/s/subterranean_hangar.txt +++ b/forge-gui/res/cardsfolder/s/subterranean_hangar.txt @@ -6,6 +6,6 @@ A:AB$ PutCounter | Cost$ T | Defined$ Self | CounterType$ STORAGE | CounterNum$ A:AB$ Mana | Cost$ T SubCounter | Produced$ B | Amount$ ChosenX | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | References$ X | SpellDescription$ Add {B} for each storage counter removed this way. SVar:X:XChoice #ChosenX SVar created by Cost payment -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/subterranean_hangar.jpg Oracle:Subterranean Hangar enters the battlefield tapped.\n{T}: Put a storage counter on Subterranean Hangar.\n{T}, Remove any number of storage counters from Subterranean Hangar: Add {B} for each storage counter removed this way. diff --git a/forge-gui/res/cardsfolder/s/subterranean_spirit.txt b/forge-gui/res/cardsfolder/s/subterranean_spirit.txt index cb50fa407d3..553b3127b16 100644 --- a/forge-gui/res/cardsfolder/s/subterranean_spirit.txt +++ b/forge-gui/res/cardsfolder/s/subterranean_spirit.txt @@ -4,6 +4,6 @@ Types:Creature Elemental Spirit PT:3/3 K:Protection from red A:AB$ DamageAll | Cost$ T | NumDmg$ 1 | ValidCards$ Creature.withoutFlying | ValidDescription$ each creature and without flying. | SpellDescription$ CARDNAME deals 1 damage to each creature without flying. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/subterranean_spirit.jpg Oracle:Protection from red\n{T}: Subterranean Spirit deals 1 damage to each creature without flying. diff --git a/forge-gui/res/cardsfolder/s/sudden_demise.txt b/forge-gui/res/cardsfolder/s/sudden_demise.txt index ea87b88bd3d..fc3dbc7a0c5 100644 --- a/forge-gui/res/cardsfolder/s/sudden_demise.txt +++ b/forge-gui/res/cardsfolder/s/sudden_demise.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ ChooseColor | Cost$ X R | AILogic$ MostProminentHumanCreatures | SubAbility$ DBDmg | SpellDescription$ Choose a color. CARDNAME deals X damage to each creature of the chosen color. SVar:DBDmg:DB$ DamageAll | NumDmg$ X | References$ X | ValidCards$ Creature.ChosenColor | ValidDescription$ each creature of the chosen color. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sudden_demise.jpg Oracle:Choose a color. Sudden Demise deals X damage to each creature of the chosen color. diff --git a/forge-gui/res/cardsfolder/s/sudden_disappearance.txt b/forge-gui/res/cardsfolder/s/sudden_disappearance.txt index f825a529ef1..6b38c0eb735 100644 --- a/forge-gui/res/cardsfolder/s/sudden_disappearance.txt +++ b/forge-gui/res/cardsfolder/s/sudden_disappearance.txt @@ -5,6 +5,6 @@ A:SP$ ChangeZoneAll | Cost$ 5 W | Origin$ Battlefield | Destination$ Exile | Val SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | RememberObjects$ Remembered | TriggerDescription$ Return exiled permanents to the battlefield. | SubAbility$ DBCleanup SVar:TrigReturn:DB$ ChangeZone | Origin$ Exile | Destination$ Battlefield | Defined$ DelayTriggerRemembered SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sudden_disappearance.jpg Oracle:Exile all nonland permanents target player controls. Return the exiled cards to the battlefield under their owner's control at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/s/sudden_reclamation.txt b/forge-gui/res/cardsfolder/s/sudden_reclamation.txt index a255f64d280..48e54f99526 100644 --- a/forge-gui/res/cardsfolder/s/sudden_reclamation.txt +++ b/forge-gui/res/cardsfolder/s/sudden_reclamation.txt @@ -4,7 +4,7 @@ Types:Instant A:SP$ Mill | Cost$ 3 G | NumCards$ 4 | Defined$ You | SubAbility$ DBChangeZone1 | SpellDescription$ Put the top four cards of your library into your graveyard, then return a creature card and a land card from your graveyard to your hand. SVar:DBChangeZone1:DB$ ChangeZone | Hidden$ True | Mandatory$ True | ChangeType$ Creature.YouOwn | ChangeNum$ 1 | Origin$ Graveyard | Destination$ Hand | SubAbility$ DBChangeZone2 SVar:DBChangeZone2:DB$ ChangeZone | Hidden$ True | Mandatory$ True | ChangeType$ Land.YouOwn | ChangeNum$ 1 | Origin$ Graveyard | Destination$ Hand -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHas:Ability$Graveyard SVar:Picture:http://www.wizards.com/global/images/magic/general/sudden_reclamation.jpg Oracle:Put the top four cards of your library into your graveyard, then return a creature card and a land card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/s/sudden_spoiling.txt b/forge-gui/res/cardsfolder/s/sudden_spoiling.txt index fac1c131840..c12b72325da 100644 --- a/forge-gui/res/cardsfolder/s/sudden_spoiling.txt +++ b/forge-gui/res/cardsfolder/s/sudden_spoiling.txt @@ -3,6 +3,6 @@ ManaCost:1 B B Types:Instant K:Split second A:SP$ AnimateAll | Cost$ 1 B B | ValidTgts$ Player | TgtPrompt$ Select target player | ValidCards$ Creature | Power$ 0 | Toughness$ 2 | RemoveAllAbilities$ True | SpellDescription$ Until end of turn, creatures target player controls lose all abilities and have base power and toughness 0/2. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sudden_spoiling.jpg Oracle:Split second (As long as this spell is on the stack, players can't cast spells or activate abilities that aren't mana abilities.)\nUntil end of turn, creatures target player controls lose all abilities and have base power and toughness 0/2. diff --git a/forge-gui/res/cardsfolder/s/suffer_the_past.txt b/forge-gui/res/cardsfolder/s/suffer_the_past.txt index 9f686b2db20..77e726de8ff 100644 --- a/forge-gui/res/cardsfolder/s/suffer_the_past.txt +++ b/forge-gui/res/cardsfolder/s/suffer_the_past.txt @@ -10,6 +10,6 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:TargetedObjects$Amount/Minus.1 SVar:MaxTgts:TargetedPlayer$ValidGraveyard Card SVar:Y:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/suffer_the_past.jpg Oracle:Exile X target cards from target player's graveyard. For each card exiled this way, that player loses 1 life and you gain 1 life. diff --git a/forge-gui/res/cardsfolder/s/suffocation.txt b/forge-gui/res/cardsfolder/s/suffocation.txt index 8968a55904a..4fad2982680 100644 --- a/forge-gui/res/cardsfolder/s/suffocation.txt +++ b/forge-gui/res/cardsfolder/s/suffocation.txt @@ -11,6 +11,6 @@ A:SP$ DealDamage | Cost$ 1 U | Defined$ Remembered | NumDmg$ 4 | CheckSVar$ X | SVar:DelTrigSlowtrip:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ DrawSlowtrip | TriggerDescription$ Draw a card. SVar:DrawSlowtrip:DB$Draw | NumCards$ 1 | Defined$ You SVar:X:Count$RememberedSize -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/suffocation.jpg Oracle:Cast Suffocation only if you were dealt damage this turn by a red instant or sorcery spell.\nSuffocation deals 4 damage to the controller of the last red instant or sorcery spell that dealt damage to you this turn.\nDraw a card at the beginning of the next turn's upkeep. diff --git a/forge-gui/res/cardsfolder/s/suicidal_charge.txt b/forge-gui/res/cardsfolder/s/suicidal_charge.txt index 22bda917037..7956aa5550d 100644 --- a/forge-gui/res/cardsfolder/s/suicidal_charge.txt +++ b/forge-gui/res/cardsfolder/s/suicidal_charge.txt @@ -2,6 +2,6 @@ Name:Suicidal Charge ManaCost:3 B R Types:Enchantment A:AB$ PumpAll | Cost$ Sac<1/CARDNAME> | ValidCards$ Creature.OppCtrl | NumAtt$ -1 | NumDef$ -1 | KW$ HIDDEN CARDNAME attacks each combat if able. | IsCurse$ True | SpellDescription$ Creatures your opponents control get -1/-1 until end of turn. Those creatures attack this turn if able. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/suicidal_charge.jpg Oracle:Sacrifice Suicidal Charge: Creatures your opponents control get -1/-1 until end of turn. Those creatures attack this turn if able. diff --git a/forge-gui/res/cardsfolder/s/suleimans_legacy.txt b/forge-gui/res/cardsfolder/s/suleimans_legacy.txt index 6d03eeff584..d28de099edc 100644 --- a/forge-gui/res/cardsfolder/s/suleimans_legacy.txt +++ b/forge-gui/res/cardsfolder/s/suleimans_legacy.txt @@ -5,7 +5,7 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigDestroyAll:DB$DestroyAll | ValidCards$ Djinn,Efreet | NoRegen$ True T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Djinn,Efreet | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Whenever a Djinn or Efreet enters the battlefield, destroy it. It can't be regenerated. SVar:TrigDestroy:DB$Destroy | Defined$ TriggeredCard | NoRegen$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/suleimans_legacy.jpg Oracle:When Suleiman's Legacy enters the battlefield, destroy all Djinns and Efreets. They can't be regenerated.\nWhenever a Djinn or Efreet enters the battlefield, destroy it. It can't be regenerated. diff --git a/forge-gui/res/cardsfolder/s/sulfur_vent.txt b/forge-gui/res/cardsfolder/s/sulfur_vent.txt index 0f1b2caae39..16edef63fba 100644 --- a/forge-gui/res/cardsfolder/s/sulfur_vent.txt +++ b/forge-gui/res/cardsfolder/s/sulfur_vent.txt @@ -4,6 +4,6 @@ Types:Land K:CARDNAME enters the battlefield tapped. A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ U R | SpellDescription$ Add {U}{R}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sulfur_vent.jpg Oracle:Sulfur Vent enters the battlefield tapped.\n{T}: Add {B}.\n{T}, Sacrifice Sulfur Vent: Add {U}{R}. diff --git a/forge-gui/res/cardsfolder/s/sulfuric_vapors.txt b/forge-gui/res/cardsfolder/s/sulfuric_vapors.txt index 6f968f7797c..602d67e0ee9 100644 --- a/forge-gui/res/cardsfolder/s/sulfuric_vapors.txt +++ b/forge-gui/res/cardsfolder/s/sulfuric_vapors.txt @@ -5,6 +5,6 @@ R:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Spell.Red | ValidT SVar:DmgPlus1:DB$ ReplaceEffect | VarName$ DamageAmount | VarValue$ X | References$ X SVar:X:ReplaceCount$DamageAmount/Plus.1 SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sulfuric_vapors.jpg Oracle:If a red spell would deal damage to a permanent or player, it deals that much damage plus 1 to that permanent or player instead. diff --git a/forge-gui/res/cardsfolder/s/sultai_ascendancy.txt b/forge-gui/res/cardsfolder/s/sultai_ascendancy.txt index 2b886e74aba..8a18971982a 100644 --- a/forge-gui/res/cardsfolder/s/sultai_ascendancy.txt +++ b/forge-gui/res/cardsfolder/s/sultai_ascendancy.txt @@ -3,6 +3,6 @@ ManaCost:B G U Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ DBDig | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, look at the top two cards of your library. Put any number of them into your graveyard and the rest back on top of your library in any order. SVar:DBDig:DB$ Dig | ValidTgts$ You | DigNum$ 2 | AnyNumber$ | DestinationZone$ Graveyard | LibraryPosition2$ 0 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sultai_ascendancy.jpg Oracle:At the beginning of your upkeep, look at the top two cards of your library. Put any number of them into your graveyard and the rest back on top of your library in any order. diff --git a/forge-gui/res/cardsfolder/s/sultai_banner.txt b/forge-gui/res/cardsfolder/s/sultai_banner.txt index 03e60f6872c..ff217cf8d65 100644 --- a/forge-gui/res/cardsfolder/s/sultai_banner.txt +++ b/forge-gui/res/cardsfolder/s/sultai_banner.txt @@ -5,7 +5,7 @@ A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Draw | Cost$ B G U T Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black|Green|Blue SVar:Picture:http://www.wizards.com/global/images/magic/general/sultai_banner.jpg Oracle:{T}: Add {B}, {G}, or {U}.\n{B}{G}{U}, {T}, Sacrifice Sultai Banner: Draw a card. diff --git a/forge-gui/res/cardsfolder/s/summary_dismissal.txt b/forge-gui/res/cardsfolder/s/summary_dismissal.txt index 7c7f9e1f9fb..cf208335a9b 100644 --- a/forge-gui/res/cardsfolder/s/summary_dismissal.txt +++ b/forge-gui/res/cardsfolder/s/summary_dismissal.txt @@ -3,6 +3,6 @@ ManaCost:2 U U Types:Instant A:SP$ ChangeZoneAll | Cost$ 2 U U | ChangeType$ Card.Other | Origin$ Stack | Destination$ Exile | Fizzle$ True | SubAbility$ DBCounter | SpellDescription$ Exile all other spells and counter all abilities. SVar:DBCounter: DB$ Counter | AllType$ Activated,Triggered | AllValid$ Card -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/summary_dismissal.jpg Oracle:Exile all other spells and counter all abilities. diff --git a/forge-gui/res/cardsfolder/s/summon_the_school.txt b/forge-gui/res/cardsfolder/s/summon_the_school.txt index f693e0b3f8a..8fef633e565 100644 --- a/forge-gui/res/cardsfolder/s/summon_the_school.txt +++ b/forge-gui/res/cardsfolder/s/summon_the_school.txt @@ -3,6 +3,6 @@ ManaCost:3 W Types:Tribal Sorcery Merfolk A:SP$ Token | Cost$ 3 W | TokenImage$ u 1 1 merfolk wizard | TokenAmount$ 2 | TokenName$ Merfolk Wizard | TokenTypes$ Creature,Merfolk,Wizard | TokenOwner$ You | TokenColors$ Blue | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Create two 1/1 blue Merfolk Wizard creature tokens. A:AB$ ChangeZone | Cost$tapXType<4/Merfolk> | Origin$ Graveyard | Destination$ Hand | ActivationZone$ Graveyard | SpellDescription$ Return CARDNAME from your graveyard to your hand. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/summon_the_school.jpg Oracle:Create two 1/1 blue Merfolk Wizard creature tokens.\nTap four untapped Merfolk you control: Return Summon the School from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/s/summoners_egg.txt b/forge-gui/res/cardsfolder/s/summoners_egg.txt index 7977f0e3e2d..9c9a8f7a92f 100644 --- a/forge-gui/res/cardsfolder/s/summoners_egg.txt +++ b/forge-gui/res/cardsfolder/s/summoners_egg.txt @@ -9,6 +9,6 @@ SVar:TrigFaceUp:DB$ SetState | Defined$ Imprinted | SubAbility$ DBChangeZone | M SVar:DBChangeZone:DB$ ChangeZone | Defined$ Imprinted | Origin$ Exile | Destination$ Battlefield | ConditionDefined$ Imprinted | ConditionPresent$ Creature | GainControl$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True SVar:SacMe:5 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/summoners_egg.jpg Oracle:Imprint — When Summoner's Egg enters the battlefield, you may exile a card from your hand face down.\nWhen Summoner's Egg dies, turn the exiled card face up. If it's a creature card, put it onto the battlefield under your control. diff --git a/forge-gui/res/cardsfolder/s/summoners_pact.txt b/forge-gui/res/cardsfolder/s/summoners_pact.txt index 13c5659bcf3..ecbac0a9db0 100644 --- a/forge-gui/res/cardsfolder/s/summoners_pact.txt +++ b/forge-gui/res/cardsfolder/s/summoners_pact.txt @@ -7,6 +7,6 @@ SVar:DBDelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Y SVar:TrigLoseGame:DB$ LosesGame | UnlessCost$ 2 G G | UnlessPayer$ You | Defined$ You SVar:NeedsToPlayVar:NumLands GE4 SVar:NumLands:Count$Valid Land.YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/summoners_pact.jpg Oracle:Search your library for a green creature card, reveal it, put it into your hand, then shuffle your library.\nAt the beginning of your next upkeep, pay {2}{G}{G}. If you don't, you lose the game. diff --git a/forge-gui/res/cardsfolder/s/summoning_station.txt b/forge-gui/res/cardsfolder/s/summoning_station.txt index 1641c448cd4..19960574119 100644 --- a/forge-gui/res/cardsfolder/s/summoning_station.txt +++ b/forge-gui/res/cardsfolder/s/summoning_station.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ Token | Cost$ T | TokenAmount$ 1 | TokenName$ Pincher | TokenTypes$ Creature,Pincher | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 2 | TokenToughness$ 2 | SpellDescription$ Create a 2/2 colorless Pincher creature token. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Artifact | TriggerZones$ Battlefield | Execute$ TrigUntap | OptionalDecider$ You | TriggerDescription$ Whenever an artifact is put into a graveyard from the battlefield, you may untap CARDNAME. SVar:TrigUntap:DB$Untap | Defined$ Self -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/summoning_station.jpg Oracle:{T}: Create a 2/2 colorless Pincher creature token.\nWhenever an artifact is put into a graveyard from the battlefield, you may untap Summoning Station. diff --git a/forge-gui/res/cardsfolder/s/sunbeam_spellbomb.txt b/forge-gui/res/cardsfolder/s/sunbeam_spellbomb.txt index 3390713b15a..979feb8d9c0 100644 --- a/forge-gui/res/cardsfolder/s/sunbeam_spellbomb.txt +++ b/forge-gui/res/cardsfolder/s/sunbeam_spellbomb.txt @@ -3,6 +3,6 @@ ManaCost:1 Types:Artifact A:AB$ Draw | Cost$ 1 Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. A:AB$ GainLife | Cost$ W Sac<1/CARDNAME> | LifeAmount$ 5 | SpellDescription$ You gain 5 life. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sunbeam_spellbomb.jpg Oracle:{W}, Sacrifice Sunbeam Spellbomb: You gain 5 life.\n{1}, Sacrifice Sunbeam Spellbomb: Draw a card. diff --git a/forge-gui/res/cardsfolder/s/sunblade_elf.txt b/forge-gui/res/cardsfolder/s/sunblade_elf.txt index 31deff5de24..27ebfc2d8b0 100644 --- a/forge-gui/res/cardsfolder/s/sunblade_elf.txt +++ b/forge-gui/res/cardsfolder/s/sunblade_elf.txt @@ -6,7 +6,7 @@ S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 1 | AddToughness$ 1 | Check SVar:X:Count$Valid Plains.YouCtrl A:AB$ PumpAll | Cost$ 4 W | ValidCards$ Creature.YouCtrl | NumAtt$ 1 | NumDef$ 1 | SpellDescription$ Creatures you control get +1/+1 until end of turn. SVar:BuffedBy:Plains -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$White SVar:Picture:http://www.wizards.com/global/images/magic/general/sunblade_elf.jpg Oracle:Sunblade Elf gets +1/+1 as long as you control a Plains.\n{4}{W}: Creatures you control get +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/s/sunbond.txt b/forge-gui/res/cardsfolder/s/sunbond.txt index 9f65edd92fd..9ddc9ca9dc9 100644 --- a/forge-gui/res/cardsfolder/s/sunbond.txt +++ b/forge-gui/res/cardsfolder/s/sunbond.txt @@ -7,6 +7,6 @@ S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddTrigger$ SunbondTrig | SVar:SunbondTrig:Mode$ LifeGained | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ SunbondPutCounter | TriggerDescription$ Whenever you gain life, put that many +1/+1 counters on CARDNAME. SVar:SunbondPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ SunbondTriggerAmount | References$ SunbondTriggerAmount SVar:SunbondTriggerAmount:TriggerCount$LifeAmount -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sunbond.jpg Oracle:Enchant creature\nEnchanted creature has "Whenever you gain life, put that many +1/+1 counters on this creature." diff --git a/forge-gui/res/cardsfolder/s/sundial_of_the_infinite.txt b/forge-gui/res/cardsfolder/s/sundial_of_the_infinite.txt index b1e7ff33c41..05945ce312c 100644 --- a/forge-gui/res/cardsfolder/s/sundial_of_the_infinite.txt +++ b/forge-gui/res/cardsfolder/s/sundial_of_the_infinite.txt @@ -2,6 +2,6 @@ Name:Sundial of the Infinite ManaCost:2 Types:Artifact A:AB$ EndTurn | Cost$ 1 T | PlayerTurn$ True | SpellDescription$ End the turn. Activate this ability only during your turn. (Exile all spells and abilities on the stack. Discard down to your maximum hand size. Damage wears off, and "this turn" and "until end of turn" effects end.) -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sundial_of_the_infinite.jpg Oracle:{1}, {T}: End the turn. Activate this ability only during your turn. (Exile all spells and abilities on the stack. Discard down to your maximum hand size. Damage wears off, and "this turn" and "until end of turn" effects end.) diff --git a/forge-gui/res/cardsfolder/s/sunflare_shaman.txt b/forge-gui/res/cardsfolder/s/sunflare_shaman.txt index 503479b7a6f..f4096615a95 100644 --- a/forge-gui/res/cardsfolder/s/sunflare_shaman.txt +++ b/forge-gui/res/cardsfolder/s/sunflare_shaman.txt @@ -6,6 +6,6 @@ A:AB$ DealDamage | Cost$ 1 R T | ValidTgts$ Creature,Player,Planeswalker | TgtPr SVar:DBDealDamage:DB$ DealDamage | NumDmg$ X | References$ X | Defined$ Self | SubAbility$ DBDamageResolve SVar:DBDamageResolve:DB$ DamageResolve SVar:X:Count$TypeInYourYard.Elemental -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sunflare_shaman.jpg Oracle:{1}{R}, {T}: Sunflare Shaman deals X damage to any target and X damage to itself, where X is the number of Elemental cards in your graveyard. diff --git a/forge-gui/res/cardsfolder/s/sunforger.txt b/forge-gui/res/cardsfolder/s/sunforger.txt index d86cf9d7362..a70da576710 100644 --- a/forge-gui/res/cardsfolder/s/sunforger.txt +++ b/forge-gui/res/cardsfolder/s/sunforger.txt @@ -7,7 +7,7 @@ SVar:CastFound:DB$ Play | Defined$ Remembered | Controller$ You | WithoutManaCos SVar:YouShuffle:DB$ Shuffle | Defined$ You | SubAbility$ DBCleanup | StackDescription$ None SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True K:Equip:3 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Red|White SVar:Picture:http://www.wizards.com/global/images/magic/general/sunforger.jpg Oracle:Equipped creature gets +4/+0.\n{R}{W}, Unattach Sunforger: Search your library for a red or white instant card with converted mana cost 4 or less and cast that card without paying its mana cost. Then shuffle your library.\nEquip {3} diff --git a/forge-gui/res/cardsfolder/s/sunglasses_of_urza.txt b/forge-gui/res/cardsfolder/s/sunglasses_of_urza.txt index 2dffbdae745..62d4c2dd3bf 100644 --- a/forge-gui/res/cardsfolder/s/sunglasses_of_urza.txt +++ b/forge-gui/res/cardsfolder/s/sunglasses_of_urza.txt @@ -2,7 +2,7 @@ Name:Sunglasses of Urza ManaCost:3 Types:Artifact S:Mode$ Continuous | Affected$ You | ManaColorConversion$ Additive | WhiteConversion$ Red | Description$ You may spend white mana as though it were red mana. -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sunglasses_of_urza.jpg Oracle:You may spend white mana as though it were red mana. diff --git a/forge-gui/res/cardsfolder/s/sungrass_egg.txt b/forge-gui/res/cardsfolder/s/sungrass_egg.txt index 924c24cee3a..69444093262 100644 --- a/forge-gui/res/cardsfolder/s/sungrass_egg.txt +++ b/forge-gui/res/cardsfolder/s/sungrass_egg.txt @@ -3,7 +3,7 @@ ManaCost:1 Types:Artifact A:AB$ Mana | Cost$ 2 T Sac<1/CARDNAME> | Produced$ G W | SubAbility$ DBDraw | SpellDescription$ Add {G}{W}. Draw a card. SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sungrass_egg.jpg Oracle:{2}, {T}, Sacrifice Sungrass Egg: Add {G}{W}. Draw a card. diff --git a/forge-gui/res/cardsfolder/s/sungrass_prairie.txt b/forge-gui/res/cardsfolder/s/sungrass_prairie.txt index 61f56856f2a..fb91eaf2d4a 100644 --- a/forge-gui/res/cardsfolder/s/sungrass_prairie.txt +++ b/forge-gui/res/cardsfolder/s/sungrass_prairie.txt @@ -2,6 +2,6 @@ Name:Sungrass Prairie ManaCost:no cost Types:Land A:AB$ Mana | Cost$ 1 T | Produced$ G W | SpellDescription$ Add {G}{W}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sungrass_prairie.jpg Oracle:{1}, {T}: Add {G}{W}. diff --git a/forge-gui/res/cardsfolder/s/sunken_hope.txt b/forge-gui/res/cardsfolder/s/sunken_hope.txt index 13828578a61..12225ac572f 100644 --- a/forge-gui/res/cardsfolder/s/sunken_hope.txt +++ b/forge-gui/res/cardsfolder/s/sunken_hope.txt @@ -3,6 +3,6 @@ ManaCost:3 U U Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigChangeZoneYou | TriggerDescription$ At the beginning of each player's upkeep, that player returns a creature they control to its owner's hand. SVar:TrigChangeZoneYou:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Hidden$ True | Mandatory$ True | ChangeType$ Creature | DefinedPlayer$ TriggeredPlayer | ChangeNum$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sunken_hope.jpg Oracle:At the beginning of each player's upkeep, that player returns a creature they control to its owner's hand. diff --git a/forge-gui/res/cardsfolder/s/sunken_ruins.txt b/forge-gui/res/cardsfolder/s/sunken_ruins.txt index a9175e47285..3760750e810 100644 --- a/forge-gui/res/cardsfolder/s/sunken_ruins.txt +++ b/forge-gui/res/cardsfolder/s/sunken_ruins.txt @@ -5,6 +5,6 @@ A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ UB T | Produced$ U | Amount$ 2 | SpellDescription$ Add {U}{U}. A:AB$ Mana | Cost$ UB T | Produced$ U B | SpellDescription$ Add {U}{B}. A:AB$ Mana | Cost$ UB T | Produced$ B | Amount$ 2 | SpellDescription$ Add {B}{B}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sunken_ruins.jpg Oracle:{T}: Add {C}.\n{U/B}, {T}: Add {U}{U}, {U}{B}, or {B}{B}. diff --git a/forge-gui/res/cardsfolder/s/sunrise_sovereign.txt b/forge-gui/res/cardsfolder/s/sunrise_sovereign.txt index 205db7e55d4..4406ff75275 100644 --- a/forge-gui/res/cardsfolder/s/sunrise_sovereign.txt +++ b/forge-gui/res/cardsfolder/s/sunrise_sovereign.txt @@ -4,6 +4,6 @@ Types:Creature Giant Warrior PT:5/5 S:Mode$ Continuous | Affected$ Creature.Giant+Other+YouCtrl | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Trample | Description$ Other Giant creatures you control get +2/+2 and have trample. SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sunrise_sovereign.jpg Oracle:Other Giant creatures you control get +2/+2 and have trample. diff --git a/forge-gui/res/cardsfolder/s/sunscape_apprentice.txt b/forge-gui/res/cardsfolder/s/sunscape_apprentice.txt index 107f28720f9..1a1c5004fc5 100644 --- a/forge-gui/res/cardsfolder/s/sunscape_apprentice.txt +++ b/forge-gui/res/cardsfolder/s/sunscape_apprentice.txt @@ -4,6 +4,6 @@ Types:Creature Human Wizard PT:1/1 A:AB$ Pump | Cost$ G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Target creature gets +1/+1 until end of turn. A:AB$ ChangeZone | Cost$ U T | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SpellDescription$ Put target creature you control on top of its owner's library. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sunscape_apprentice.jpg Oracle:{G}, {T}: Target creature gets +1/+1 until end of turn.\n{U}, {T}: Put target creature you control on top of its owner's library. diff --git a/forge-gui/res/cardsfolder/s/sunscape_familiar.txt b/forge-gui/res/cardsfolder/s/sunscape_familiar.txt index 5787bbab196..d886d824cc3 100644 --- a/forge-gui/res/cardsfolder/s/sunscape_familiar.txt +++ b/forge-gui/res/cardsfolder/s/sunscape_familiar.txt @@ -4,7 +4,7 @@ Types:Creature Wall PT:0/3 K:Defender S:Mode$ ReduceCost | ValidCard$ Card.Blue,Card.Green | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Green spells and blue spells you cast cost {1} less to cast. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Green|Blue DeckHints:Color$Green|Blue SVar:Picture:http://www.wizards.com/global/images/magic/general/sunscape_familiar.jpg diff --git a/forge-gui/res/cardsfolder/s/sunscape_master.txt b/forge-gui/res/cardsfolder/s/sunscape_master.txt index 2c23fd1bd87..8c0511d521d 100644 --- a/forge-gui/res/cardsfolder/s/sunscape_master.txt +++ b/forge-gui/res/cardsfolder/s/sunscape_master.txt @@ -4,7 +4,7 @@ Types:Creature Human Wizard PT:2/2 A:AB$ ChangeZone | Cost$ U U T | ValidTgts$ Creature | TgtPrompt$ Select target Creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. A:AB$ PumpAll | Cost$ G G T | ValidCards$ Creature.YouCtrl | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Creatures you control get +2/+2 until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Blue SVar:Picture:http://www.wizards.com/global/images/magic/general/sunscape_master.jpg Oracle:{G}{G}, {T}: Creatures you control get +2/+2 until end of turn.\n{U}{U}, {T}: Return target creature to its owner's hand. diff --git a/forge-gui/res/cardsfolder/s/sunscour.txt b/forge-gui/res/cardsfolder/s/sunscour.txt index 87df5c9ef25..e8fd80d6e43 100644 --- a/forge-gui/res/cardsfolder/s/sunscour.txt +++ b/forge-gui/res/cardsfolder/s/sunscour.txt @@ -3,6 +3,6 @@ ManaCost:5 W W Types:Sorcery A:SP$ DestroyAll | Cost$ 5 W W | ValidCards$ Creature | SpellDescription$ Destroy all creatures. A:SP$ DestroyAll | Cost$ ExileFromHand<2/Card.White> | ValidCards$ Creature | CostDesc$ You may exile two white cards from your hand | SpellDescription$ rather than pay CARDNAME's mana cost. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sunscour.jpg Oracle:You may exile two white cards from your hand rather than pay Sunscour's mana cost.\nDestroy all creatures. diff --git a/forge-gui/res/cardsfolder/s/sunstone.txt b/forge-gui/res/cardsfolder/s/sunstone.txt index 8ede8b84ce6..4ea19e71e95 100644 --- a/forge-gui/res/cardsfolder/s/sunstone.txt +++ b/forge-gui/res/cardsfolder/s/sunstone.txt @@ -2,6 +2,6 @@ Name:Sunstone ManaCost:3 Types:Artifact A:AB$ Fog | Cost$ 2 Sac<1/Land.Snow/snow land> | SpellDescription$ Prevent all combat damage that would be dealt this turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sunstone.jpg Oracle:{2}, Sacrifice a snow land: Prevent all combat damage that would be dealt this turn. diff --git a/forge-gui/res/cardsfolder/s/suntouched_myr.txt b/forge-gui/res/cardsfolder/s/suntouched_myr.txt index f693da3dd9d..35e0781286d 100644 --- a/forge-gui/res/cardsfolder/s/suntouched_myr.txt +++ b/forge-gui/res/cardsfolder/s/suntouched_myr.txt @@ -4,7 +4,7 @@ Types:Artifact Creature Myr PT:0/0 K:Sunburst SVar:NoZeroToughnessAI:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NeedsToPlayVar:Z GE2 SVar:Z:Count$UniqueManaColorsProduced.ByUntappedSources DeckHints:Ability$Proliferate diff --git a/forge-gui/res/cardsfolder/s/suppress.txt b/forge-gui/res/cardsfolder/s/suppress.txt index 34ed5fe8347..2515da146a2 100644 --- a/forge-gui/res/cardsfolder/s/suppress.txt +++ b/forge-gui/res/cardsfolder/s/suppress.txt @@ -5,6 +5,6 @@ A:SP$ ChangeZoneAll | Cost$ 2 B | ValidTgts$ Player | TgtPrompt$ Select target p SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | ValidPlayer$ Player.IsRemembered | Execute$ TrigReturn | Secondary$ True | TriggerDescription$ Return exiled cards to targeted player's hand. SVar:TrigReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Hand | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/suppress.jpg Oracle:Target player exiles all cards from their hand face down. At the beginning of the end step of that player's next turn, that player returns those cards to their hand. diff --git a/forge-gui/res/cardsfolder/s/suppression_field.txt b/forge-gui/res/cardsfolder/s/suppression_field.txt index 144ac35e872..53a49f306b6 100644 --- a/forge-gui/res/cardsfolder/s/suppression_field.txt +++ b/forge-gui/res/cardsfolder/s/suppression_field.txt @@ -2,6 +2,6 @@ Name:Suppression Field ManaCost:1 W Types:Enchantment S:Mode$ RaiseCost | ValidCard$ Card | Type$ NonManaAbility | Amount$ 2 | Description$ Activated abilities cost {2} more to activate unless they're mana abilities. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/suppression_field.jpg Oracle:Activated abilities cost {2} more to activate unless they're mana abilities. diff --git a/forge-gui/res/cardsfolder/s/supreme_exemplar.txt b/forge-gui/res/cardsfolder/s/supreme_exemplar.txt index 1006f7d3f14..cedf8a45e99 100644 --- a/forge-gui/res/cardsfolder/s/supreme_exemplar.txt +++ b/forge-gui/res/cardsfolder/s/supreme_exemplar.txt @@ -4,6 +4,6 @@ Types:Creature Elemental PT:10/10 K:Flying K:Champion:Elemental -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/supreme_exemplar.jpg Oracle:Flying\nChampion an Elemental (When this enters the battlefield, sacrifice it unless you exile another Elemental you control. When this leaves the battlefield, that card returns to the battlefield.) diff --git a/forge-gui/res/cardsfolder/s/supreme_inquisitor.txt b/forge-gui/res/cardsfolder/s/supreme_inquisitor.txt index f081611d78c..721dc7f9e6b 100644 --- a/forge-gui/res/cardsfolder/s/supreme_inquisitor.txt +++ b/forge-gui/res/cardsfolder/s/supreme_inquisitor.txt @@ -3,6 +3,6 @@ ManaCost:3 U U Types:Creature Human Wizard PT:1/3 A:AB$ ChangeZone | Cost$ tapXType<5/Wizard> | Origin$ Library | Destination$ Exile | ValidTgts$ Player | ChangeType$ Card | ChangeNum$ 5 | IsCurse$ True | SpellDescription$ Search target player's library for up to five cards and exile them. Then that player shuffles their library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/supreme_inquisitor.jpg Oracle:Tap five untapped Wizards you control: Search target player's library for up to five cards and exile them. Then that player shuffles their library. diff --git a/forge-gui/res/cardsfolder/s/surge_node.txt b/forge-gui/res/cardsfolder/s/surge_node.txt index 06489028c5e..93c94f89735 100644 --- a/forge-gui/res/cardsfolder/s/surge_node.txt +++ b/forge-gui/res/cardsfolder/s/surge_node.txt @@ -3,6 +3,6 @@ ManaCost:1 Types:Artifact K:etbCounter:CHARGE:6 A:AB$ PutCounter | Cost$ 1 T SubCounter<1/CHARGE> | ValidTgts$ Artifact | TgtPrompt$ Select target Artifact | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on target artifact. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/surge_node.jpg Oracle:Surge Node enters the battlefield with six charge counters on it.\n{1}, {T}, Remove a charge counter from Surge Node: Put a charge counter on target artifact. diff --git a/forge-gui/res/cardsfolder/s/surge_of_righteousness.txt b/forge-gui/res/cardsfolder/s/surge_of_righteousness.txt index fa275c9fb57..3c284a9edd2 100644 --- a/forge-gui/res/cardsfolder/s/surge_of_righteousness.txt +++ b/forge-gui/res/cardsfolder/s/surge_of_righteousness.txt @@ -3,6 +3,6 @@ ManaCost:1 W Types:Instant A:SP$ Destroy | Cost$ 1 W | ValidTgts$ Creature.Black+attacking,Creature.Black+blocking,Creature.Red+attacking,Creature.Red+blocking | TgtPrompt$ Select target black or red creature that's attacking or blocking | SubAbility$ NaturalLife | SpellDescription$ Destroy target black or red creature that's attacking or blocking. You gain 2 life. SVar:NaturalLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/surge_of_righteousness.jpg Oracle:Destroy target black or red creature that's attacking or blocking. You gain 2 life. diff --git a/forge-gui/res/cardsfolder/s/surge_of_strength.txt b/forge-gui/res/cardsfolder/s/surge_of_strength.txt index 0c317e1412a..98d8e664b6d 100644 --- a/forge-gui/res/cardsfolder/s/surge_of_strength.txt +++ b/forge-gui/res/cardsfolder/s/surge_of_strength.txt @@ -3,6 +3,6 @@ ManaCost:R G Types:Instant A:SP$ Pump | Cost$ R G Discard<1/Card.Green;Card.Red> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | KW$ Trample | CostDesc$ As an additional cost to cast Surge of Strength, discard a red or green card. | SpellDescription$ Target creature gains trample and gets +X/+0 until end of turn, where X is that creature's converted mana cost. SVar:X:Targeted$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/surge_of_strength.jpg Oracle:As an additional cost to cast Surge of Strength, discard a red or green card.\nTarget creature gains trample and gets +X/+0 until end of turn, where X is that creature's converted mana cost. diff --git a/forge-gui/res/cardsfolder/s/surge_of_thoughtweft.txt b/forge-gui/res/cardsfolder/s/surge_of_thoughtweft.txt index db4f9753e59..fdea6e0515a 100644 --- a/forge-gui/res/cardsfolder/s/surge_of_thoughtweft.txt +++ b/forge-gui/res/cardsfolder/s/surge_of_thoughtweft.txt @@ -3,6 +3,6 @@ ManaCost:1 W Types:Tribal Instant Kithkin A:SP$ PumpAll | Cost$ 1 W | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | SubAbility$ DBDraw | SpellDescription$ Creatures you control get +1/+1 until end of turn. If you control a Kithkin, draw a card. SVar:DBDraw:DB$Draw | NumCards$ 1 | ConditionPresent$ Kithkin.YouCtrl | ConditionCompare$ GE1 | ConditionDescription$ If you control a Kithkin, -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/surge_of_thoughtweft.jpg Oracle:Creatures you control get +1/+1 until end of turn. If you control a Kithkin, draw a card. diff --git a/forge-gui/res/cardsfolder/s/surprise_deployment.txt b/forge-gui/res/cardsfolder/s/surprise_deployment.txt index 20ecbf80d67..432a6081ee8 100644 --- a/forge-gui/res/cardsfolder/s/surprise_deployment.txt +++ b/forge-gui/res/cardsfolder/s/surprise_deployment.txt @@ -5,6 +5,6 @@ A:SP$ ChangeZone | Cost$ 3 W | Origin$ Hand | Destination$ Battlefield | Optiona SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End Of Turn | Execute$ TrigBounce | RememberObjects$ Remembered | TriggerDescription$ At the beginning of the next end step, return that creature to your hand. | AILogic$ Always | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup SVar:TrigBounce:DB$ ChangeZone | Defined$ DelayTriggerRemembered | Origin$ Battlefield | Destination$ Hand SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/surprise_deployment.jpg Oracle:Cast Surprise Deployment only during combat.\nYou may put a nonwhite creature card from your hand onto the battlefield. At the beginning of the next end step, return that creature to your hand. (Return it only if it's on the battlefield.) diff --git a/forge-gui/res/cardsfolder/s/surreal_memoir.txt b/forge-gui/res/cardsfolder/s/surreal_memoir.txt index 6bfe190cbd7..6a241065895 100644 --- a/forge-gui/res/cardsfolder/s/surreal_memoir.txt +++ b/forge-gui/res/cardsfolder/s/surreal_memoir.txt @@ -3,6 +3,6 @@ ManaCost:3 R Types:Sorcery K:Rebound A:SP$ ChangeZone | Cost$ 3 R | ChangeType$ Instant.YouCtrl | ChangeNum$ 1 | Hidden$ True | Origin$ Graveyard | AtRandom$ True | Destination$ Hand | SpellDescription$ Return an instant card at random from your graveyard to your hand. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/surreal_memoir.jpg Oracle:Return an instant card at random from your graveyard to your hand.\nRebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) diff --git a/forge-gui/res/cardsfolder/s/surveyors_scope.txt b/forge-gui/res/cardsfolder/s/surveyors_scope.txt index c3cf286fe25..bc92f2af7f8 100644 --- a/forge-gui/res/cardsfolder/s/surveyors_scope.txt +++ b/forge-gui/res/cardsfolder/s/surveyors_scope.txt @@ -3,7 +3,7 @@ ManaCost:2 Types:Artifact A:AB$ ChangeZone | Cost$ T Exile<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | ChangeNum$ X | References$ X | SpellDescription$ Search your library for up to X basic land cards, where X is the number of players who control at least two more lands than you. Put those lands onto the battlefield, then shuffle your library. SVar:X:PlayerCountPropertywithAtLeast2MoreLandsThanYou$Amount -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/surveyors_scope.jpg Oracle:{T}, Exile Surveyor's Scope: Search your library for up to X basic land cards, where X is the number of players who control at least two more lands than you. Put those cards onto the battlefield, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/s/survival_of_the_fittest.txt b/forge-gui/res/cardsfolder/s/survival_of_the_fittest.txt index 3c4357d5028..f8d842eb102 100644 --- a/forge-gui/res/cardsfolder/s/survival_of_the_fittest.txt +++ b/forge-gui/res/cardsfolder/s/survival_of_the_fittest.txt @@ -2,7 +2,7 @@ Name:Survival of the Fittest ManaCost:1 G Types:Enchantment A:AB$ ChangeZone | Cost$ G Discard<1/Creature> | Origin$ Library | Destination$ Hand | ChangeType$ Creature | ChangeNum$ 1 | AILogic$ SurvivalOfTheFittest | SpellDescription$ Search your library for a Creature card and put it into your hand. Then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:AIPreference:DiscardCost$Special:SurvivalOfTheFittest SVar:Picture:http://www.wizards.com/global/images/magic/general/survival_of_the_fittest.jpg diff --git a/forge-gui/res/cardsfolder/s/survivor_of_the_unseen.txt b/forge-gui/res/cardsfolder/s/survivor_of_the_unseen.txt index a6ea5edc78b..be8c6363e73 100644 --- a/forge-gui/res/cardsfolder/s/survivor_of_the_unseen.txt +++ b/forge-gui/res/cardsfolder/s/survivor_of_the_unseen.txt @@ -5,6 +5,6 @@ PT:2/1 K:Cumulative upkeep:2 A:AB$ Draw | Cost$ T | NumCards$ 2 | SubAbility$ DBTop | SpellDescription$ Draw two cards, then put a card from your hand on top of your library. SVar:DBTop:DB$ ChangeZone | Origin$ Hand | Destination$ Library | ChangeType$ Card | ChangeNum$ 1 | Mandatory$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/survivor_of_the_unseen.jpg Oracle:Cumulative upkeep {2} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\n{T}: Draw two cards, then put a card from your hand on top of your library. diff --git a/forge-gui/res/cardsfolder/s/sustenance.txt b/forge-gui/res/cardsfolder/s/sustenance.txt index a3e8a70abac..b79b34414e6 100644 --- a/forge-gui/res/cardsfolder/s/sustenance.txt +++ b/forge-gui/res/cardsfolder/s/sustenance.txt @@ -2,7 +2,7 @@ Name:Sustenance ManaCost:1 G Types:Enchantment A:AB$ Pump | Cost$ 1 Sac<1/Land> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Target creature gets +1/+1 until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/sustenance.jpg Oracle:{1}, Sacrifice a land: Target creature gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/s/sutured_ghoul.txt b/forge-gui/res/cardsfolder/s/sutured_ghoul.txt index 1afe9a0445e..6ac29c72e0c 100644 --- a/forge-gui/res/cardsfolder/s/sutured_ghoul.txt +++ b/forge-gui/res/cardsfolder/s/sutured_ghoul.txt @@ -11,6 +11,6 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:TotalPower:Remembered$CardPower SVar:TotalToughness:Remembered$CardToughness SVar:X:Count$TypeInYourYard.Creature -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sutured_ghoul.jpg Oracle:Trample\nAs Sutured Ghoul enters the battlefield, exile any number of creature cards from your graveyard.\nSutured Ghoul's power is equal to the total power of the exiled cards and its toughness is equal to their total toughness. diff --git a/forge-gui/res/cardsfolder/s/svogthos_the_restless_tomb.txt b/forge-gui/res/cardsfolder/s/svogthos_the_restless_tomb.txt index 552cde08a71..e3154900912 100644 --- a/forge-gui/res/cardsfolder/s/svogthos_the_restless_tomb.txt +++ b/forge-gui/res/cardsfolder/s/svogthos_the_restless_tomb.txt @@ -5,6 +5,6 @@ A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Animate | Cost$ 3 B G | Defined$ Self | Types$ Creature,Zombie,Plant | Colors$ Black,Green | staticAbilities$ Static | References$ X | SpellDescription$ Until end of turn, CARDNAME becomes a black and green Plant Zombie creature with "This creature's power and toughness are each equal to the number of creature cards in your graveyard." It's still a land. SVar:Static:Mode$ Continuous | EffectZone$ Battlefield | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ This creature's power and toughness are each equal to the number of creature cards in your graveyard. SVar:X:Count$TypeInYourYard.Creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/svogthos_the_restless_tomb.jpg Oracle:{T}: Add {C}.\n{3}{B}{G}: Until end of turn, Svogthos, the Restless Tomb becomes a black and green Plant Zombie creature with "This creature's power and toughness are each equal to the number of creature cards in your graveyard." It's still a land. diff --git a/forge-gui/res/cardsfolder/s/svyelunite_temple.txt b/forge-gui/res/cardsfolder/s/svyelunite_temple.txt index e1c515bb1d6..b7429a6b389 100644 --- a/forge-gui/res/cardsfolder/s/svyelunite_temple.txt +++ b/forge-gui/res/cardsfolder/s/svyelunite_temple.txt @@ -4,6 +4,6 @@ Types:Land K:CARDNAME enters the battlefield tapped. A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ U | Amount$ 2 | SpellDescription$ Add {U}{U}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/svyelunite_temple.jpg Oracle:Svyelunite Temple enters the battlefield tapped.\n{T}: Add {U}.\n{T}, Sacrifice Svyelunite Temple: Add {U}{U}. diff --git a/forge-gui/res/cardsfolder/s/swan_song.txt b/forge-gui/res/cardsfolder/s/swan_song.txt index b895a31e258..e21d8145a75 100644 --- a/forge-gui/res/cardsfolder/s/swan_song.txt +++ b/forge-gui/res/cardsfolder/s/swan_song.txt @@ -3,6 +3,6 @@ ManaCost:U Types:Instant A:SP$ Counter | Cost$ U | TargetType$ Spell | TgtPrompt$ Select target enchantment, instant or sorcery spell | ValidTgts$ Enchantment,Instant,Sorcery | SubAbility$ DBToken | SpellDescription$ Counter target enchantment, instant or sorcery spell. Its controller creates a 2/2 blue Bird creature token with flying. SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenOwner$ TargetedController | TokenName$ Bird | TokenTypes$ Creature,Bird | TokenColors$ Blue | TokenPower$ 2 | TokenToughness$ 2 | TokenKeywords$ Flying | TokenImage$ u_2_2_bird_ths -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/swan_song.jpg Oracle:Counter target enchantment, instant, or sorcery spell. Its controller creates a 2/2 blue Bird creature token with flying. diff --git a/forge-gui/res/cardsfolder/s/sway_of_illusion.txt b/forge-gui/res/cardsfolder/s/sway_of_illusion.txt index 1a2ba23a41f..6e7643e7afb 100644 --- a/forge-gui/res/cardsfolder/s/sway_of_illusion.txt +++ b/forge-gui/res/cardsfolder/s/sway_of_illusion.txt @@ -5,6 +5,6 @@ A:SP$ ChooseColor | Cost$ 1 U | Defined$ You | SubAbility$ DBSwayAnimate | Spell SVar:DBSwayAnimate:DB$ Animate | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ MaxTgts | References$ MaxTgts | TgtPrompt$ Select target creatures | Colors$ ChosenColor | OverwriteColors$ True | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | NumCards$ 1 SVar:MaxTgts:Count$Valid Creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sway_of_illusion.jpg Oracle:Any number of target creatures become the color of your choice until end of turn.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/s/sway_of_the_stars.txt b/forge-gui/res/cardsfolder/s/sway_of_the_stars.txt index 5f0a2cd606c..58a1083bd42 100644 --- a/forge-gui/res/cardsfolder/s/sway_of_the_stars.txt +++ b/forge-gui/res/cardsfolder/s/sway_of_the_stars.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ ChangeZoneAll | Cost$ 8 U U | ChangeType$ Card | Origin$ Hand,Graveyard,Battlefield | Destination$ Library | Random$ True | Shuffle$ True | SubAbility$ DBDraw | UseAllOriginZones$ True | SpellDescription$ Each player shuffles their hand, graveyard, and permanents they own into their library, then draws seven cards. Each player's life total becomes 7. SVar:DBDraw:DB$ Draw | NumCards$ 7 | Defined$ Player | SubAbility$ DBSetLife | StackDescription$ None SVar:DBSetLife:DB$ SetLife | Defined$ Player | LifeAmount$ 7 | StackDescription$ None -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sway_of_the_stars.jpg Oracle:Each player shuffles their hand, graveyard, and permanents they own into their library, then draws seven cards. Each player's life total becomes 7. diff --git a/forge-gui/res/cardsfolder/s/swerve.txt b/forge-gui/res/cardsfolder/s/swerve.txt index 57654d27e6f..c7b4be88754 100644 --- a/forge-gui/res/cardsfolder/s/swerve.txt +++ b/forge-gui/res/cardsfolder/s/swerve.txt @@ -2,6 +2,6 @@ Name:Swerve ManaCost:U R Types:Instant A:SP$ ChangeTargets | Cost$ U R | TargetType$ Spell | ValidTgts$ Card | TargetsSingleTarget$ True | SpellDescription$ Change the target of target spell with a single target. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/swerve.jpg Oracle:Change the target of target spell with a single target. diff --git a/forge-gui/res/cardsfolder/s/swift_silence.txt b/forge-gui/res/cardsfolder/s/swift_silence.txt index 36e7eec3c30..b3a9364b182 100644 --- a/forge-gui/res/cardsfolder/s/swift_silence.txt +++ b/forge-gui/res/cardsfolder/s/swift_silence.txt @@ -5,6 +5,6 @@ A:SP$ Counter | Cost$ 2 W U U | AllType$ Spell | AllValid$ Card.Other | Remember SVar:DBDraw:DB$ Draw | NumCards$ X | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/swift_silence.jpg Oracle:Counter all other spells. Draw a card for each spell countered this way. diff --git a/forge-gui/res/cardsfolder/s/sword_of_the_ages.txt b/forge-gui/res/cardsfolder/s/sword_of_the_ages.txt index c70f869073e..acc53073f77 100644 --- a/forge-gui/res/cardsfolder/s/sword_of_the_ages.txt +++ b/forge-gui/res/cardsfolder/s/sword_of_the_ages.txt @@ -6,6 +6,6 @@ A:AB$ DealDamage | Cost$ T Sac<1/CARDNAME> Sac | NumDmg$ Y | ValidTg SVar:DBExile:DB$ ChangeZone | Defined$ SacrificedCards | Origin$ Graveyard | Destination$ Exile SVar:X:XChoice SVar:Y:Sacrificed$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sword_of_the_ages.jpg Oracle:Sword of the Ages enters the battlefield tapped.\n{T}, Sacrifice Sword of the Ages and any number of creatures you control: Sword of the Ages deals X damage to any target, where X is the total power of the creatures sacrificed this way, then exile Sword of the Ages and those creature cards. diff --git a/forge-gui/res/cardsfolder/s/sword_of_the_chosen.txt b/forge-gui/res/cardsfolder/s/sword_of_the_chosen.txt index cc45b78cb94..76232b13d8b 100644 --- a/forge-gui/res/cardsfolder/s/sword_of_the_chosen.txt +++ b/forge-gui/res/cardsfolder/s/sword_of_the_chosen.txt @@ -2,6 +2,6 @@ Name:Sword of the Chosen ManaCost:2 Types:Legendary Artifact A:AB$ Pump | Cost$ T | ValidTgts$ Creature.Legendary | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Target legendary creature gets +2/+2 until end of turn. | TgtPrompt$ Select target legendary creature. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sword_of_the_chosen.jpg Oracle:{T}: Target legendary creature gets +2/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/s/sword_of_the_paruns.txt b/forge-gui/res/cardsfolder/s/sword_of_the_paruns.txt index 00c80dff9a0..267912f417a 100644 --- a/forge-gui/res/cardsfolder/s/sword_of_the_paruns.txt +++ b/forge-gui/res/cardsfolder/s/sword_of_the_paruns.txt @@ -7,6 +7,6 @@ S:Mode$ Continuous | Affected$ Creature.untapped+YouCtrl | AddToughness$ 2 | Che A:AB$ TapOrUntap | Cost$ 3 | Defined$ Equipped | IsPresent$ Card.EquippedBy | SpellDescription$ You may tap or untap equipped creature. SVar:X:Count$Valid Card.EquippedBy+tapped SVar:Y:Count$Valid Card.EquippedBy+untapped -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sword_of_the_paruns.jpg Oracle:As long as equipped creature is tapped, tapped creatures you control get +2/+0.\nAs long as equipped creature is untapped, untapped creatures you control get +0/+2.\n{3}: You may tap or untap equipped creature.\nEquip {3} diff --git a/forge-gui/res/cardsfolder/s/sworn_defender.txt b/forge-gui/res/cardsfolder/s/sworn_defender.txt index da825bc0952..e8e24272167 100644 --- a/forge-gui/res/cardsfolder/s/sworn_defender.txt +++ b/forge-gui/res/cardsfolder/s/sworn_defender.txt @@ -6,6 +6,6 @@ A:AB$ Pump | Cost$ 1 | ValidTgts$ Creature.blockedBySource,Creature.blockingSour SVar:DBAnimate:DB$ Animate | Defined$ Self | Power$ X | Toughness$ Y SVar:X:Targeted$CardToughness/Minus.1 SVar:Y:Targeted$CardPower/Plus.1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sworn_defender.jpg Oracle:{1}: Sworn Defender's power becomes the toughness of target creature blocking or being blocked by Sworn Defender minus 1 until end of turn, and Sworn Defender's toughness becomes 1 plus the power of that creature until end of turn. diff --git a/forge-gui/res/cardsfolder/s/sylvan_awakening.txt b/forge-gui/res/cardsfolder/s/sylvan_awakening.txt index f99fe14811c..5c72cb1f22e 100644 --- a/forge-gui/res/cardsfolder/s/sylvan_awakening.txt +++ b/forge-gui/res/cardsfolder/s/sylvan_awakening.txt @@ -2,6 +2,6 @@ Name:Sylvan Awakening ManaCost:2 G Types:Sorcery A:SP$ AnimateAll | Cost$ 2 G | Power$ 2 | Toughness$ 2 | Types$ Creature,Elemental | Keywords$ Reach & Indestructible & Haste | ValidCards$ Land.YouCtrl | UntilYourNextTurn$ True | SpellDescription$ Until your next turn, all lands you control become 2/2 Elemental creatures with reach, indestructible, and haste. They're still lands. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sylvan_awakening.jpg Oracle:Until your next turn, all lands you control become 2/2 Elemental creatures with reach, indestructible, and haste. They're still lands. diff --git a/forge-gui/res/cardsfolder/s/sylvan_echoes.txt b/forge-gui/res/cardsfolder/s/sylvan_echoes.txt index 13f8f010137..f7d3bd2b7b9 100644 --- a/forge-gui/res/cardsfolder/s/sylvan_echoes.txt +++ b/forge-gui/res/cardsfolder/s/sylvan_echoes.txt @@ -3,6 +3,6 @@ ManaCost:G Types:Enchantment T:Mode$ Clashed | ValidPlayer$ You | Won$ True | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever you clash and win, you may draw a card. (This ability triggers after the clash ends.) SVar:TrigDraw:DB$Draw | Defined$ You -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sylvan_echoes.jpg Oracle:Whenever you clash and win, you may draw a card. (This ability triggers after the clash ends.) diff --git a/forge-gui/res/cardsfolder/s/sylvan_library.txt b/forge-gui/res/cardsfolder/s/sylvan_library.txt index 7666aab5da2..5e809403a24 100644 --- a/forge-gui/res/cardsfolder/s/sylvan_library.txt +++ b/forge-gui/res/cardsfolder/s/sylvan_library.txt @@ -7,6 +7,6 @@ SVar:ChooseDrawn:DB$ ChooseCard | ChoiceZone$ Hand | Choices$ Card.YouOwn+DrawnT SVar:DBPayOrReturn:DB$ RepeatEach | UseImprinted$ True | RepeatCards$ Card.IsRemembered | Zone$ Hand | RepeatSubAbility$ DBReplace | SubAbility$ DBCleanup | NoReveal$ True SVar:DBReplace:DB$ ChangeZone | Origin$ Hand | Destination$ Library | ChangeType$ Card.IsImprinted | UnlessCost$ PayLife<4> | Mandatory$ True | StackDescription$ Put {c:Imprinted} on top of your library | UnlessPayer$ TriggeredPlayer | SubAbility$ DBCleanup | NoReveal$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sylvan_library.jpg Oracle:At the beginning of your draw step, you may draw two additional cards. If you do, choose two cards in your hand drawn this turn. For each of those cards, pay 4 life or put the card on top of your library. diff --git a/forge-gui/res/cardsfolder/s/sylvan_offering.txt b/forge-gui/res/cardsfolder/s/sylvan_offering.txt index 123cf5dbe76..290eb1954fd 100644 --- a/forge-gui/res/cardsfolder/s/sylvan_offering.txt +++ b/forge-gui/res/cardsfolder/s/sylvan_offering.txt @@ -6,7 +6,7 @@ SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenName$ Treefolk | TokenOwner$ Chos SVar:DBChoose:DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | SubAbility$ DBToken2 SVar:DBToken2:DB$ Token | TokenAmount$ X | References$ X | TokenName$ Elf Warrior | TokenTypes$ Creature,Elf,Warrior | TokenOwner$ ChosenAndYou | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | TokenImage$ g 1 1 elf warrior C14 SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sylvan_offering.jpg Oracle:Choose an opponent. You and that player each create an X/X green Treefolk creature token.\nChoose an opponent. You and that player each create X 1/1 green Elf Warrior creature tokens. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/sylvan_paradise.txt b/forge-gui/res/cardsfolder/s/sylvan_paradise.txt index 75f202b04cc..19153d3a7ce 100644 --- a/forge-gui/res/cardsfolder/s/sylvan_paradise.txt +++ b/forge-gui/res/cardsfolder/s/sylvan_paradise.txt @@ -3,7 +3,7 @@ ManaCost:G Types:Instant A:SP$ Animate | Cost$ G | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ MaxTgts | References$ MaxTgts | TgtPrompt$ Select target creatures | Colors$ Green | OverwriteColors$ True | SpellDescription$ Any number of target creatures become green until end of turn. SVar:MaxTgts:Count$Valid Creature -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sylvan_paradise.jpg Oracle:Any number of target creatures become green until end of turn. diff --git a/forge-gui/res/cardsfolder/s/sylvan_safekeeper.txt b/forge-gui/res/cardsfolder/s/sylvan_safekeeper.txt index 84e0cca458b..dd1ea376d4a 100644 --- a/forge-gui/res/cardsfolder/s/sylvan_safekeeper.txt +++ b/forge-gui/res/cardsfolder/s/sylvan_safekeeper.txt @@ -3,6 +3,6 @@ ManaCost:G Types:Creature Human Wizard PT:1/1 A:AB$ Pump | Cost$ Sac<1/Land> | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | KW$ Shroud | SpellDescription$ Target creature you control gains shroud until end of turn. (It can't be the target of spells or abilities.) -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sylvan_safekeeper.jpg Oracle:Sacrifice a land: Target creature you control gains shroud until end of turn. (It can't be the target of spells or abilities.) diff --git a/forge-gui/res/cardsfolder/s/sylvan_yeti.txt b/forge-gui/res/cardsfolder/s/sylvan_yeti.txt index d21c5120a64..6f0c80cdbb0 100644 --- a/forge-gui/res/cardsfolder/s/sylvan_yeti.txt +++ b/forge-gui/res/cardsfolder/s/sylvan_yeti.txt @@ -4,6 +4,6 @@ Types:Creature Yeti PT:*/4 S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | Description$ CARDNAME's power is equal to the number of cards in your hand. SVar:X:Count$InYourHand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://serv1.tcgimages.eu/img/cards/Portal_Second_Age/sylvan_yeti.jpg Oracle:Sylvan Yeti's power is equal to the number of cards in your hand. diff --git a/forge-gui/res/cardsfolder/s/symbiotic_deployment.txt b/forge-gui/res/cardsfolder/s/symbiotic_deployment.txt index 12edbfba1c1..c4de09dc9d4 100644 --- a/forge-gui/res/cardsfolder/s/symbiotic_deployment.txt +++ b/forge-gui/res/cardsfolder/s/symbiotic_deployment.txt @@ -3,7 +3,7 @@ ManaCost:2 G Types:Enchantment S:Mode$ Continuous | Affected$ You | AddKeyword$ Skip your draw step. | Description$ Skip your draw step. A:AB$ Draw | Cost$ 1 tapXType<2/Creature> | Defined$ You | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/symbiotic_deployment.jpg Oracle:Skip your draw step.\n{1}, Tap two untapped creatures you control: Draw a card. diff --git a/forge-gui/res/cardsfolder/s/synod_artificer.txt b/forge-gui/res/cardsfolder/s/synod_artificer.txt index d33c88bc2fc..6b88a63f5dd 100644 --- a/forge-gui/res/cardsfolder/s/synod_artificer.txt +++ b/forge-gui/res/cardsfolder/s/synod_artificer.txt @@ -7,6 +7,6 @@ A:AB$ Untap | Cost$ X T | References$ X,MaxTgts | TargetMin$ 0 | TargetMax$ MaxT # It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) SVar:X:Targeted$Amount SVar:MaxTgts:Count$Valid Artifact.nonCreature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/synod_artificer.jpg Oracle:{X}, {T}: Tap X target noncreature artifacts.\n{X}, {T}: Untap X target noncreature artifacts. diff --git a/forge-gui/res/cardsfolder/s/synod_sanctum.txt b/forge-gui/res/cardsfolder/s/synod_sanctum.txt index 7226af97ce3..f6b71b52d5a 100644 --- a/forge-gui/res/cardsfolder/s/synod_sanctum.txt +++ b/forge-gui/res/cardsfolder/s/synod_sanctum.txt @@ -7,6 +7,6 @@ T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCar SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Card.Self | Destination$ Any | Execute$ DBCleanup | Static$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/synod_sanctum.jpg Oracle:{2}, {T}: Exile target permanent you control.\n{2}, Sacrifice Synod Sanctum: Return all cards exiled with Synod Sanctum to the battlefield under your control. diff --git a/forge-gui/res/cardsfolder/s/synthetic_destiny.txt b/forge-gui/res/cardsfolder/s/synthetic_destiny.txt index 869cd72fb76..1784af6d68c 100644 --- a/forge-gui/res/cardsfolder/s/synthetic_destiny.txt +++ b/forge-gui/res/cardsfolder/s/synthetic_destiny.txt @@ -7,6 +7,6 @@ SVar:DBMassReveal:DB$ DigUntil | Amount$ MassX | References$ MassX | Valid$ Crea SVar:DBMassCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBMassShuffle SVar:DBMassShuffle:DB$ Shuffle SVar:MassX:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/synthetic_destiny.jpg Oracle:Exile all creatures you control. At the beginning of the next end step, reveal cards from the top of your library until you reveal that many creature cards, put all creature cards revealed this way onto the battlefield, then shuffle the rest of the revealed cards into your library. diff --git a/forge-gui/res/cardsfolder/t/tahngarths_glare.txt b/forge-gui/res/cardsfolder/t/tahngarths_glare.txt index eefd8b5c2eb..8956e352816 100644 --- a/forge-gui/res/cardsfolder/t/tahngarths_glare.txt +++ b/forge-gui/res/cardsfolder/t/tahngarths_glare.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Sorcery A:SP$ RearrangeTopOfLibrary | Cost$ R | ValidTgts$ Opponent | NumCards$ 3 | SubAbility$ DBRearange | SpellDescription$ Look at the top three cards of target opponent's library, then put them back in any order. That player looks at the top three cards of your library, then puts them back in any order. SVar:DBRearange:DB$ RearrangeTopOfLibrary | Defined$ You | RearrangePlayer$ Targeted | NumCards$ 3 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tahngarths_glare.jpg Oracle:Look at the top three cards of target opponent's library, then put them back in any order. That player looks at the top three cards of your library, then puts them back in any order. diff --git a/forge-gui/res/cardsfolder/t/tahngarths_rage.txt b/forge-gui/res/cardsfolder/t/tahngarths_rage.txt index 98645cf8538..42299c8d996 100644 --- a/forge-gui/res/cardsfolder/t/tahngarths_rage.txt +++ b/forge-gui/res/cardsfolder/t/tahngarths_rage.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ R | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy+attacking | AddPower$ 3 | Description$ Enchanted creature gets +3/+0 as long as it's attacking. Otherwise, it gets -2/-1. S:Mode$ Continuous | Affected$ Creature.EnchantedBy+notattacking | AddPower$ -2 | AddToughness$ -1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tahngarths_rage.jpg Oracle:Enchant creature\nEnchanted creature gets +3/+0 as long as it's attacking. Otherwise, it gets -2/-1. diff --git a/forge-gui/res/cardsfolder/t/taigam_sidisis_hand.txt b/forge-gui/res/cardsfolder/t/taigam_sidisis_hand.txt index 159f5280bb6..4fab5790e62 100644 --- a/forge-gui/res/cardsfolder/t/taigam_sidisis_hand.txt +++ b/forge-gui/res/cardsfolder/t/taigam_sidisis_hand.txt @@ -7,6 +7,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E SVar:TrigDig:DB$ Dig | DigNum$ 3 | DestinationZone2$ Graveyard | SpellDescription$ Look at the top three cards of your library. Put one of them into your hand and the rest into your graveyard. A:AB$ Pump | Cost$ B T ExileFromGrave | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -X | NumDef$ -X | References$ X | IsCurse$ True | SpellDescription$ Target creature gets -X/-X until end of turn. | CostDesc$ {B}, {T}, Exile X cards from your graveyard: SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/taigam_sidisis_hand.jpg Oracle:Skip your draw step.\nAt the beginning of your upkeep, look at the top three cards of your library. Put one of them into your hand and the rest into your graveyard.\n{B}, {T}, Exile X cards from your graveyard: Target creature gets -X/-X until end of turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/t/taigams_scheming.txt b/forge-gui/res/cardsfolder/t/taigams_scheming.txt index 50093b571d1..7cac511f41c 100644 --- a/forge-gui/res/cardsfolder/t/taigams_scheming.txt +++ b/forge-gui/res/cardsfolder/t/taigams_scheming.txt @@ -2,6 +2,6 @@ Name:Taigam's Scheming ManaCost:1 U Types:Sorcery A:SP$ Dig | Cost$ 1 U | DigNum$ 5 | AnyNumber$ True | DestinationZone$ Graveyard | LibraryPosition2$ 0 | SpellDescription$ Look at the top five cards of your library. Put any number of them into your graveyard and the rest back on top of your library in any order. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/taigams_scheming.jpg Oracle:Look at the top five cards of your library. Put any number of them into your graveyard and the rest back on top of your library in any order. diff --git a/forge-gui/res/cardsfolder/t/tainted_aether.txt b/forge-gui/res/cardsfolder/t/tainted_aether.txt index a2e1dbb3606..9f6bb7c8079 100644 --- a/forge-gui/res/cardsfolder/t/tainted_aether.txt +++ b/forge-gui/res/cardsfolder/t/tainted_aether.txt @@ -3,7 +3,7 @@ ManaCost:2 B B Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature | Execute$ TrigSacrifice | TriggerZones$ Battlefield | TriggerDescription$ Whenever a creature enters the battlefield, its controller sacrifices a creature or land. SVar:TrigSacrifice:DB$ Sacrifice | SacValid$ Creature,Land | Defined$ TriggeredCardController -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/tainted_aether.jpg Oracle:Whenever a creature enters the battlefield, its controller sacrifices a creature or land. diff --git a/forge-gui/res/cardsfolder/t/tainted_remedy.txt b/forge-gui/res/cardsfolder/t/tainted_remedy.txt index 40af9881f07..7698a2a301c 100644 --- a/forge-gui/res/cardsfolder/t/tainted_remedy.txt +++ b/forge-gui/res/cardsfolder/t/tainted_remedy.txt @@ -5,6 +5,6 @@ R:Event$ GainLife | ActiveZones$ Battlefield | ValidPlayer$ Opponent | ReplaceWi SVar:RLoseLife:DB$ LoseLife | LifeAmount$ X | Defined$ ReplacedPlayer | References$ X SVar:X:ReplaceCount$LifeGained SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/tainted_remedy.jpg Oracle:If an opponent would gain life, that player loses that much life instead. diff --git a/forge-gui/res/cardsfolder/t/tajuru_archer.txt b/forge-gui/res/cardsfolder/t/tajuru_archer.txt index b84923e931c..538e135c84d 100644 --- a/forge-gui/res/cardsfolder/t/tajuru_archer.txt +++ b/forge-gui/res/cardsfolder/t/tajuru_archer.txt @@ -8,6 +8,6 @@ SVar:TrigDamage:DB$DealDamage | ValidTgts$ Creature.withFlying | NumDmg$ NumAlli SVar:NumAllies:Count$Valid Ally.YouCtrl SVar:PlayMain1:TRUE SVar:BuffedBy:Ally -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/tajuru_archer.jpg Oracle:Whenever Tajuru Archer or another Ally enters the battlefield under your control, you may have Tajuru Archer deal damage to target creature with flying equal to the number of Allies you control. diff --git a/forge-gui/res/cardsfolder/t/takara.txt b/forge-gui/res/cardsfolder/t/takara.txt index bedf1ee9500..5e57a432c5c 100644 --- a/forge-gui/res/cardsfolder/t/takara.txt +++ b/forge-gui/res/cardsfolder/t/takara.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Vanguard HandLifeModifier:+3/-8 A:AB$ DealDamage | ActivationZone$ Command | Cost$ Sac<1/Creature> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to any target. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:https://downloads.cardforge.org/images/cards/VAN/Takara.full.jpg Oracle:Hand +3, life -8\nSacrifice a creature: Takara deals 1 damage to any target. diff --git a/forge-gui/res/cardsfolder/t/takenos_cavalry.txt b/forge-gui/res/cardsfolder/t/takenos_cavalry.txt index 50eaa8d70d4..9030870f7b7 100644 --- a/forge-gui/res/cardsfolder/t/takenos_cavalry.txt +++ b/forge-gui/res/cardsfolder/t/takenos_cavalry.txt @@ -4,6 +4,6 @@ Types:Creature Human Samurai Archer PT:1/1 K:Bushido:1 A:AB$ DealDamage | Cost$ T | ValidTgts$ Spirit.attacking,Spirit.blocking | TgtPrompt$ Select target attacking or blocking Spirit | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target attacking or blocking Spirit. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/takenos_cavalry.jpg Oracle:Bushido 1 (When this blocks or becomes blocked, it gets +1/+1 until end of turn.)\n{T}: Takeno's Cavalry deals 1 damage to target attacking or blocking Spirit. diff --git a/forge-gui/res/cardsfolder/t/takklemaggot.txt b/forge-gui/res/cardsfolder/t/takklemaggot.txt index 70529d3ce76..e2d7e89b62b 100644 --- a/forge-gui/res/cardsfolder/t/takklemaggot.txt +++ b/forge-gui/res/cardsfolder/t/takklemaggot.txt @@ -15,7 +15,7 @@ SVar:DBPump:DB$ Pump | RememberObjects$ TriggeredCardController | SubAbility$ DB SVar:DBChangeZone2:DB$ ChangeZone | Defined$ Self | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | ConditionDefined$ ChosenCard | ConditionPresent$ Creature | ConditionCompare$ EQ0 SVar:TrigUpkeep:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player.IsRemembered | Execute$ TrigDmg | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of that player's upkeep, CARDNAME deals 1 damage to them. SVar:TrigDmg:DB$ DealDamage | Defined$ Remembered | NumDmg$ 1 -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/takklemaggot.jpg Oracle:Enchant creature\nAt the beginning of the upkeep of enchanted creature's controller, put a -0/-1 counter on that creature.\nWhen enchanted creature dies, that creature's controller chooses a creature that Takklemaggot could enchant. If they do, return Takklemaggot to the battlefield under your control attached to that creature. If they don't, return Takklemaggot to the battlefield under your control as a non-Aura enchantment. It loses "enchant creature" and gains "At the beginning of that player's upkeep, Takklemaggot deals 1 damage to them." diff --git a/forge-gui/res/cardsfolder/t/talaras_bane.txt b/forge-gui/res/cardsfolder/t/talaras_bane.txt index 38f7ae996b3..9f0b7454da5 100644 --- a/forge-gui/res/cardsfolder/t/talaras_bane.txt +++ b/forge-gui/res/cardsfolder/t/talaras_bane.txt @@ -8,6 +8,6 @@ SVar:DBGainLife:DB$ GainLife | LifeAmount$ X | References$ X | SubAbility$ DBDis SVar:DBDiscard:DB$ Discard | DefinedCards$ Imprinted | Defined$ Targeted | Mode$ Defined | SubAbility$ DBCleanup | StackDescription$ None | ConditionDefined$ Imprinted | ConditionPresent$ Card | ConditionCompare$ GE1 SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True SVar:X:Imprinted$CardToughness -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/talaras_bane.jpg Oracle:Target opponent reveals their hand. You choose a green or white creature card from it. You gain life equal to that creature card's toughness, then that player discards that card. diff --git a/forge-gui/res/cardsfolder/t/talon_of_pain.txt b/forge-gui/res/cardsfolder/t/talon_of_pain.txt index a9bddca85e1..d5613e7084d 100644 --- a/forge-gui/res/cardsfolder/t/talon_of_pain.txt +++ b/forge-gui/res/cardsfolder/t/talon_of_pain.txt @@ -6,6 +6,6 @@ SVar:TalonPutCounter:DB$ PutCounter | CounterType$ CHARGE | CounterNum$ 1 A:AB$ DealDamage | Cost$ X T SubCounter | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals X damage to any target. SVar:X:Count$xPaid # The X cost won't be limited by the number of charge counters, but if enough aren't present, the spell will be cancelled. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/talon_of_pain.jpg Oracle:Whenever a source you control other than Talon of Pain deals damage to an opponent, put a charge counter on Talon of Pain.\n{X}, {T}, Remove X charge counters from Talon of Pain: Talon of Pain deals X damage to any target. diff --git a/forge-gui/res/cardsfolder/t/tangle_angler.txt b/forge-gui/res/cardsfolder/t/tangle_angler.txt index ea35d53ce49..e409e592c9a 100644 --- a/forge-gui/res/cardsfolder/t/tangle_angler.txt +++ b/forge-gui/res/cardsfolder/t/tangle_angler.txt @@ -4,6 +4,6 @@ Types:Creature Horror PT:1/5 K:Infect A:AB$ MustBlock | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Target creature blocks CARDNAME this turn if able. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tangle_angler.jpg Oracle:Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.)\n{G}: Target creature blocks Tangle Angler this turn if able. diff --git a/forge-gui/res/cardsfolder/t/tangle_wire.txt b/forge-gui/res/cardsfolder/t/tangle_wire.txt index e1f905716e7..13ec3930e8d 100644 --- a/forge-gui/res/cardsfolder/t/tangle_wire.txt +++ b/forge-gui/res/cardsfolder/t/tangle_wire.txt @@ -7,7 +7,7 @@ SVar:DBTap:DB$ Tap | Defined$ ChosenCard | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True SVar:X:Count$CardCounters.FADE K:Fading:4 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NeedsToPlayVar:Y GE2 SVar:Y:Count$Valid Land.YouDontCtrl,Creature.YouDontCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/tangle_wire.jpg diff --git a/forge-gui/res/cardsfolder/t/tangleroot.txt b/forge-gui/res/cardsfolder/t/tangleroot.txt index 324a9af4a80..add85fe4292 100644 --- a/forge-gui/res/cardsfolder/t/tangleroot.txt +++ b/forge-gui/res/cardsfolder/t/tangleroot.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact T:Mode$ SpellCast | ValidCard$ Creature | Execute$ TrigMana | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player casts a creature spell, that player adds {G}. SVar:TrigMana:DB$ Mana | Produced$ G | Amount$ 1 | Defined$ TriggeredActivator -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/tangleroot.jpg Oracle:Whenever a player casts a creature spell, that player adds {G}. diff --git a/forge-gui/res/cardsfolder/t/tar_pitcher.txt b/forge-gui/res/cardsfolder/t/tar_pitcher.txt index 445997f8457..c81b250cc6c 100644 --- a/forge-gui/res/cardsfolder/t/tar_pitcher.txt +++ b/forge-gui/res/cardsfolder/t/tar_pitcher.txt @@ -4,6 +4,6 @@ Types:Creature Goblin Shaman PT:2/2 A:AB$ DealDamage | Cost$ T Sac<1/Goblin> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to any target. SVar:AIPreference:SacCost$Goblin.token,Goblin.Other -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/tar_pitcher.jpg Oracle:{T}, Sacrifice a Goblin: Tar Pitcher deals 2 damage to any target. diff --git a/forge-gui/res/cardsfolder/t/tariff.txt b/forge-gui/res/cardsfolder/t/tariff.txt index 526f9b81136..082694791eb 100644 --- a/forge-gui/res/cardsfolder/t/tariff.txt +++ b/forge-gui/res/cardsfolder/t/tariff.txt @@ -5,5 +5,5 @@ A:SP$ RepeatEach | Cost$ 1 W | RepeatPlayers$ Player | RepeatSubAbility$ DBChoos SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestCMC_CreatureControlledByRemembered | Mandatory$ True | SubAbility$ DBSac SVar:DBSac:DB$ Sacrifice | Defined$ Player.IsRemembered | SacValid$ Card.ChosenCard | SacMessage$ the creature with the highest converted mana cost | UnlessCost$ ChosenManaCost | UnlessPayer$ Player.IsRemembered SVar:Picture:http://www.wizards.com/global/images/magic/general/tariff.jpg -SVar:RemAIDeck:True +AI:RemoveDeck:All Oracle:Each player sacrifices the creature they control with the highest converted mana cost unless they pay that creature's mana cost. If two or more creatures a player controls are tied for highest cost, that player chooses one. diff --git a/forge-gui/res/cardsfolder/t/tattered_drake.txt b/forge-gui/res/cardsfolder/t/tattered_drake.txt index c21036afb09..c0b5190a37d 100644 --- a/forge-gui/res/cardsfolder/t/tattered_drake.txt +++ b/forge-gui/res/cardsfolder/t/tattered_drake.txt @@ -4,7 +4,7 @@ Types:Creature Zombie Drake PT:2/2 K:Flying A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black SVar:Picture:http://www.wizards.com/global/images/magic/general/tattered_drake.jpg Oracle:Flying\n{B}: Regenerate Tattered Drake. diff --git a/forge-gui/res/cardsfolder/t/taunt.txt b/forge-gui/res/cardsfolder/t/taunt.txt index 01ba1910afe..8cb45bfb28d 100644 --- a/forge-gui/res/cardsfolder/t/taunt.txt +++ b/forge-gui/res/cardsfolder/t/taunt.txt @@ -2,6 +2,6 @@ Name:Taunt ManaCost:U Types:Sorcery A:SP$ MustAttack | Cost$ U | ValidTgts$ Player | TgtPrompt$ Select target player | Defender$ You | SpellDescription$ During target player's next turn, creatures that player controls attack you if able. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/taunt.jpg Oracle:During target player's next turn, creatures that player controls attack you if able. diff --git a/forge-gui/res/cardsfolder/t/taunting_challenge.txt b/forge-gui/res/cardsfolder/t/taunting_challenge.txt index f470b12b4c1..567acf3ee2e 100644 --- a/forge-gui/res/cardsfolder/t/taunting_challenge.txt +++ b/forge-gui/res/cardsfolder/t/taunting_challenge.txt @@ -2,6 +2,6 @@ Name:Taunting Challenge ManaCost:1 G G Types:Sorcery A:SP$ Pump | Cost$ 1 G G | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN All creatures able to block CARDNAME do so. | SpellDescription$ All creatures able to block target creature this turn do so. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/taunting_challenge.jpg Oracle:All creatures able to block target creature this turn do so. diff --git a/forge-gui/res/cardsfolder/t/teardrop_kami.txt b/forge-gui/res/cardsfolder/t/teardrop_kami.txt index c1655da8eaa..02e8ea78ba5 100644 --- a/forge-gui/res/cardsfolder/t/teardrop_kami.txt +++ b/forge-gui/res/cardsfolder/t/teardrop_kami.txt @@ -3,6 +3,6 @@ ManaCost:U Types:Creature Spirit PT:1/1 A:AB$ TapOrUntap | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ You may tap or untap target creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/teardrop_kami.jpg Oracle:Sacrifice Teardrop Kami: You may tap or untap target creature. diff --git a/forge-gui/res/cardsfolder/t/tears_of_rage.txt b/forge-gui/res/cardsfolder/t/tears_of_rage.txt index 89362008787..26c9135b4e7 100644 --- a/forge-gui/res/cardsfolder/t/tears_of_rage.txt +++ b/forge-gui/res/cardsfolder/t/tears_of_rage.txt @@ -6,6 +6,6 @@ A:SP$ PumpAll | Cost$ 2 R R | ActivationPhases$ Declare Attackers | ValidCards$ SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End Of Turn | Execute$ TrigSac | RememberObjects$ Valid Creature.attacking+YouCtrl | TriggerDescription$ CARDNAME - Sacrifice those creature at the beginning of the next end step. | AILogic$ Always SVar:TrigSac:DB$ SacrificeAll | Defined$ DelayTriggerRemembered | Controller$ You SVar:X:Count$Valid Creature.attacking+YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tears_of_rage.jpg Oracle:Cast Tears of Rage only during the declare attackers step.\nAttacking creatures you control get +X/+0 until end of turn, where X is the number of attacking creatures. Sacrifice those creatures at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/t/tectonic_break.txt b/forge-gui/res/cardsfolder/t/tectonic_break.txt index 51ffececc73..6ad8c15e0b7 100644 --- a/forge-gui/res/cardsfolder/t/tectonic_break.txt +++ b/forge-gui/res/cardsfolder/t/tectonic_break.txt @@ -3,6 +3,6 @@ ManaCost:X R R Types:Sorcery A:SP$ Sacrifice | Cost$ X R R | Amount$ X | References$ X | SacValid$ Land | Defined$ Player | SpellDescription$ Each player sacrifices X lands. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tectonic_break.jpg Oracle:Each player sacrifices X lands. diff --git a/forge-gui/res/cardsfolder/t/tectonic_edge.txt b/forge-gui/res/cardsfolder/t/tectonic_edge.txt index d0a9c80fbfb..fb68ce26c8c 100644 --- a/forge-gui/res/cardsfolder/t/tectonic_edge.txt +++ b/forge-gui/res/cardsfolder/t/tectonic_edge.txt @@ -4,6 +4,6 @@ Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Destroy | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target nonbasic land. | Cost$ 1 T Sac<1/CARDNAME> | CheckSVar$ X | SVarCompare$ GE4 | References$ X | AILogic$ LandForLand | SpellDescription$ Destroy target nonbasic land. Activate this ability only if an opponent controls four or more lands. SVar:X:PlayerCountOpponents$HighestValid Land.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/tectonic_edge.jpg Oracle:{T}: Add {C}.\n{1}, {T}, Sacrifice Tectonic Edge: Destroy target nonbasic land. Activate this ability only if an opponent controls four or more lands. diff --git a/forge-gui/res/cardsfolder/t/tectonic_instability.txt b/forge-gui/res/cardsfolder/t/tectonic_instability.txt index 52e50c9b96b..986ec0953e7 100644 --- a/forge-gui/res/cardsfolder/t/tectonic_instability.txt +++ b/forge-gui/res/cardsfolder/t/tectonic_instability.txt @@ -3,7 +3,7 @@ ManaCost:2 R Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ Whenever a land enters the battlefield, tap all lands its controller controls. SVar:TrigTap:DB$ TapAll | ValidCards$ TriggeredCard.sharesControllerWith+Land -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/tectonic_instability.jpg Oracle:Whenever a land enters the battlefield, tap all lands its controller controls. diff --git a/forge-gui/res/cardsfolder/t/teetering_peaks.txt b/forge-gui/res/cardsfolder/t/teetering_peaks.txt index ac690a22fcd..f9c8ea45559 100644 --- a/forge-gui/res/cardsfolder/t/teetering_peaks.txt +++ b/forge-gui/res/cardsfolder/t/teetering_peaks.txt @@ -5,6 +5,6 @@ K:CARDNAME enters the battlefield tapped. A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature gets +2/+0 until end of turn. SVar:TrigPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +0 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/teetering_peaks.jpg Oracle:Teetering Peaks enters the battlefield tapped.\nWhen Teetering Peaks enters the battlefield, target creature gets +2/+0 until end of turn.\n{T}: Add {R}. diff --git a/forge-gui/res/cardsfolder/t/teferis_care.txt b/forge-gui/res/cardsfolder/t/teferis_care.txt index fd30d28b989..ebc60bbfadc 100644 --- a/forge-gui/res/cardsfolder/t/teferis_care.txt +++ b/forge-gui/res/cardsfolder/t/teferis_care.txt @@ -3,6 +3,6 @@ ManaCost:2 W Types:Enchantment A:AB$ Destroy | Cost$ W Sac<1/Enchantment> | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | SpellDescription$ Destroy target enchantment. A:AB$ Counter | Cost$ 3 U U | TargetType$ Spell | TgtPrompt$ Select target Enchantment | ValidTgts$ Enchantment | SpellDescription$ Counter target enchantment spell. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/teferis_care.jpg Oracle:{W}, Sacrifice an enchantment: Destroy target enchantment.\n{3}{U}{U}: Counter target enchantment spell. diff --git a/forge-gui/res/cardsfolder/t/teferis_puzzle_box.txt b/forge-gui/res/cardsfolder/t/teferis_puzzle_box.txt index 0005e2d1aa2..9b3bc276dd8 100644 --- a/forge-gui/res/cardsfolder/t/teferis_puzzle_box.txt +++ b/forge-gui/res/cardsfolder/t/teferis_puzzle_box.txt @@ -6,6 +6,6 @@ SVar:TrigChangeAll:DB$ ChangeZoneAll | DefinedPlayer$ TriggeredPlayer | Defined$ SVar:DBDraw:DB$Draw | NumCards$ X | Defined$ TriggeredPlayer | SubAbility$ DBCleanup SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/teferis_puzzle_box.jpg Oracle:At the beginning of each player's draw step, that player puts the cards in their hand on the bottom of their library in any order, then draws that many cards. diff --git a/forge-gui/res/cardsfolder/t/teferis_realm.txt b/forge-gui/res/cardsfolder/t/teferis_realm.txt index 09f2865ddf8..43f356c16c6 100644 --- a/forge-gui/res/cardsfolder/t/teferis_realm.txt +++ b/forge-gui/res/cardsfolder/t/teferis_realm.txt @@ -7,6 +7,6 @@ SVar:ChooseCreature:DB$ Phases | AllValid$ Creature.nonToken | SpellDescription$ SVar:ChooseArtifact:DB$ Phases | AllValid$ Artifact.nonToken | SpellDescription$ Artifact SVar:ChooseLand:DB$ Phases | AllValid$ Land.nonToken | SpellDescription$ Land SVar:ChooseEnchant:DB$ Phases | AllValid$ Enchantment.nonAura+nonToken | SpellDescription$ non-Aura Enchantment -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/teferis_realm.jpg Oracle:At the beginning of each player's upkeep, that player chooses artifact, creature, land, or non-Aura enchantment. All nontoken permanents of that type phase out. (While they're phased out, they're treated as though they don't exist. Each one phases in before its controller untaps during their next untap step.) diff --git a/forge-gui/res/cardsfolder/t/teferis_veil.txt b/forge-gui/res/cardsfolder/t/teferis_veil.txt index 9607433103f..49992f800d0 100644 --- a/forge-gui/res/cardsfolder/t/teferis_veil.txt +++ b/forge-gui/res/cardsfolder/t/teferis_veil.txt @@ -4,7 +4,7 @@ Types:Enchantment T:Mode$ Attacks | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ DelayedTrig | TriggerDescription$ Whenever a creature you control attacks, it phases out at end of combat. (While it's phased out, it's treated as though it doesn't exist. It phases in before you untap during your next untap step.) SVar:DelayedTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigPhase | RememberObjects$ TriggeredAttacker | TriggerDescription$ Attacking creatures you control phase out at end of combat. SVar:TrigPhase:DB$Phases | Defined$ DelayTriggerRemembered -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/teferis_veil.jpg Oracle:Whenever a creature you control attacks, it phases out at end of combat. (While it's phased out, it's treated as though it doesn't exist. It phases in before you untap during your next untap step.) diff --git a/forge-gui/res/cardsfolder/t/tek.txt b/forge-gui/res/cardsfolder/t/tek.txt index f6b98889eee..066b009e937 100644 --- a/forge-gui/res/cardsfolder/t/tek.txt +++ b/forge-gui/res/cardsfolder/t/tek.txt @@ -12,7 +12,7 @@ SVar:ISLAND:Count$Valid Island.YouCtrl SVar:SWAMP:Count$Valid Swamp.YouCtrl SVar:MOUNTAIN:Count$Valid Mountain.YouCtrl SVar:FOREST:Count$Valid Forest.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:BuffedBy:Land SVar:Picture:http://www.wizards.com/global/images/magic/general/tek.jpg Oracle:Tek gets +0/+2 as long as you control a Plains, has flying as long as you control an Island, gets +2/+0 as long as you control a Swamp, has first strike as long as you control a Mountain, and has trample as long as you control a Forest. diff --git a/forge-gui/res/cardsfolder/t/tel_jilad_stylus.txt b/forge-gui/res/cardsfolder/t/tel_jilad_stylus.txt index 45432ab57e5..aa39677401e 100644 --- a/forge-gui/res/cardsfolder/t/tel_jilad_stylus.txt +++ b/forge-gui/res/cardsfolder/t/tel_jilad_stylus.txt @@ -2,7 +2,7 @@ Name:Tel-Jilad Stylus ManaCost:1 Types:Artifact A:AB$ ChangeZone | Cost$ T | ValidTgts$ Permanent.YouOwn | TgtPrompt$ Select target permanent you own | Origin$ Battlefield | Destination$ Library | LibraryPosition$ -1 | SpellDescription$ Put target permanent you own on the bottom of your library. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/tel_jilad_stylus.jpg Oracle:{T}: Put target permanent you own on the bottom of your library. diff --git a/forge-gui/res/cardsfolder/t/telekinetic_bonds.txt b/forge-gui/res/cardsfolder/t/telekinetic_bonds.txt index 15d17da86a3..d8e16b9b416 100644 --- a/forge-gui/res/cardsfolder/t/telekinetic_bonds.txt +++ b/forge-gui/res/cardsfolder/t/telekinetic_bonds.txt @@ -3,7 +3,7 @@ ManaCost:2 U U U Types:Enchantment T:Mode$ Discarded | ValidPlayer$ Player | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigTapOrUntap | TriggerDescription$ Whenever a player discards a card, you may pay {1}{U}. If you do, you may tap or untap target permanent. SVar:TrigTapOrUntap:AB$TapOrUntap | Cost$ 1 U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/telekinetic_bonds.jpg Oracle:Whenever a player discards a card, you may pay {1}{U}. If you do, you may tap or untap target permanent. diff --git a/forge-gui/res/cardsfolder/t/telepathy.txt b/forge-gui/res/cardsfolder/t/telepathy.txt index a9f56e7b19a..1e4493614a5 100644 --- a/forge-gui/res/cardsfolder/t/telepathy.txt +++ b/forge-gui/res/cardsfolder/t/telepathy.txt @@ -3,6 +3,6 @@ ManaCost:U Types:Enchantment S:Mode$ Continuous | Affected$ Opponent | AddKeyword$ Play with your hand revealed. | Description$ Your opponents play with their hands revealed. SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/telepathy.jpg Oracle:Your opponents play with their hands revealed. diff --git a/forge-gui/res/cardsfolder/t/teleport.txt b/forge-gui/res/cardsfolder/t/teleport.txt index 9b8adb85e08..e93dc92d59c 100644 --- a/forge-gui/res/cardsfolder/t/teleport.txt +++ b/forge-gui/res/cardsfolder/t/teleport.txt @@ -2,6 +2,6 @@ Name:Teleport ManaCost:U U U Types:Instant A:SP$ Pump | Cost$ U U U | ActivationPhases$ Declare Attackers | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN Unblockable | SpellDescription$ Cast CARDNAME only during the declare attackers step. Target creature can't be blocked this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/teleport.jpg Oracle:Cast Teleport only during the declare attackers step.\nTarget creature can't be blocked this turn. diff --git a/forge-gui/res/cardsfolder/t/telimtors_edict.txt b/forge-gui/res/cardsfolder/t/telimtors_edict.txt index 0bfe40409dd..74e7ac72200 100644 --- a/forge-gui/res/cardsfolder/t/telimtors_edict.txt +++ b/forge-gui/res/cardsfolder/t/telimtors_edict.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ ChangeZone | Cost$ R | ValidTgts$ Permanent.YouCtrl,Permanent.YouOwn | TgtPrompt$ Select target permanent you own or control | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target permanent you own or control. Draw a card at the beginning of the next turn's upkeep. | SubAbility$ DelTrigSlowtrip SVar:DelTrigSlowtrip:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ DrawSlowtrip | TriggerDescription$ Draw a card. SVar:DrawSlowtrip:DB$Draw | NumCards$ 1 | Defined$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/telimtors_edict.jpg Oracle:Exile target permanent you own or control.\nDraw a card at the beginning of the next turn's upkeep. diff --git a/forge-gui/res/cardsfolder/t/telling_time.txt b/forge-gui/res/cardsfolder/t/telling_time.txt index 64961e6b4b2..0ebd4f08e2e 100644 --- a/forge-gui/res/cardsfolder/t/telling_time.txt +++ b/forge-gui/res/cardsfolder/t/telling_time.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Instant A:SP$ Dig | Cost$ 1 U | DigNum$ 3 | ChangeNum$ 1 | LibraryPosition2$ 0 | SkipReorder$ True | SubAbility$ DBDig | NoLooking$ True | SpellDescription$ Look at the top three cards of your library. Put one of those cards into your hand, one on top of your library, and one on the bottom of your library. | StackDescription$ Look at the top three cards of your library. Put one of those cards into your hand, one on top of your library, and one on the bottom of your library. SVar:DBDig:DB$ Dig | DigNum$ 2 | ChangeNum$ 1 | DestinationZone$ Library | LibraryPosition$ 0 | NoLooking$ True | StackDescription$ None -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/telling_time.jpg Oracle:Look at the top three cards of your library. Put one of those cards into your hand, one on top of your library, and one on the bottom of your library. diff --git a/forge-gui/res/cardsfolder/t/temple_of_the_false_god.txt b/forge-gui/res/cardsfolder/t/temple_of_the_false_god.txt index ace29770a3d..6acf26fcc4f 100644 --- a/forge-gui/res/cardsfolder/t/temple_of_the_false_god.txt +++ b/forge-gui/res/cardsfolder/t/temple_of_the_false_god.txt @@ -2,6 +2,6 @@ Name:Temple of the False God ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | Amount$ 2 | IsPresent$ Land.YouCtrl | PresentCompare$ GE5 | SpellDescription$ Add {C}{C}. Activate this ability only if you control five or more lands. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/temple_of_the_false_god.jpg Oracle:{T}: Add {C}{C}. Activate this ability only if you control five or more lands. diff --git a/forge-gui/res/cardsfolder/t/temporal_aperture.txt b/forge-gui/res/cardsfolder/t/temporal_aperture.txt index a4c835b7eb3..62c0f0236fe 100644 --- a/forge-gui/res/cardsfolder/t/temporal_aperture.txt +++ b/forge-gui/res/cardsfolder/t/temporal_aperture.txt @@ -8,6 +8,6 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:STPlay:Mode$ Continuous | EffectZone$ Command | Affected$ Card.TopLibrary+YouCtrl+IsRemembered | AffectedZone$ Library | MayPlay$ True | MayPlayWithoutManaCost$ True | MayLookAt$ Player SVar:StillTopCheck:Mode$ Always | TriggerZones$ Command | IsPresent$ Card.TopLibrary+YouCtrl+IsNotRemembered | PresentZone$ Library | Execute$ ExileEffect | Static$ True SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/temporal_aperture.jpg Oracle:{5}, {T}: Shuffle your library, then reveal the top card. Until end of turn, for as long as that card remains on top of your library, play with the top card of your library revealed and you may play that card without paying its mana cost. (If it has X in its mana cost, X is 0.) diff --git a/forge-gui/res/cardsfolder/t/temporal_cascade.txt b/forge-gui/res/cardsfolder/t/temporal_cascade.txt index ecffbdfba56..493c9bdb305 100644 --- a/forge-gui/res/cardsfolder/t/temporal_cascade.txt +++ b/forge-gui/res/cardsfolder/t/temporal_cascade.txt @@ -5,6 +5,6 @@ K:Entwine:2 A:SP$ Charm | Cost$ 5 U U | Choices$ DBChangeZone,DBDraw | CharmNum$ 1 SVar:DBChangeZone:DB$ ChangeZoneAll | ChangeType$ Card | Origin$ Hand,Graveyard | Destination$ Library | Shuffle$ True | Random$ True | UseAllOriginZones$ True | SpellDescription$ Each player shuffles their hand and graveyard into their library. SVar:DBDraw:DB$ Draw | NumCards$ 7 | Defined$ Player | SpellDescription$ Each player draws seven cards. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/temporal_cascade.jpg Oracle:Choose one —\n• Each player shuffles their hand and graveyard into their library.\n• Each player draws seven cards.\nEntwine {2} (Choose both if you pay the entwine cost.) diff --git a/forge-gui/res/cardsfolder/t/temporal_distortion.txt b/forge-gui/res/cardsfolder/t/temporal_distortion.txt index 363aae01793..f053c17b6cf 100644 --- a/forge-gui/res/cardsfolder/t/temporal_distortion.txt +++ b/forge-gui/res/cardsfolder/t/temporal_distortion.txt @@ -6,6 +6,6 @@ SVar:TrigPutCounter:DB$ PutCounter | CounterType$ HOURGLASS | CounterNum$ 1 | De S:Mode$ Continuous | Affected$ Permanent.counters_GE1_HOURGLASS | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Each permanent with an hourglass counter on it doesn't untap during its controller's untap step. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ TrigRemoveCounter | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each player's upkeep, remove all hourglass counters from permanents that player controls. SVar:TrigRemoveCounter:DB$ RemoveCounterAll | CounterType$ HOURGLASS | AllCounters$ True | ValidCards$ Permanent.ActivePlayerCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/temporal_distortion.jpg Oracle:Whenever a creature or land becomes tapped, put an hourglass counter on it.\nEach permanent with an hourglass counter on it doesn't untap during its controller's untap step.\nAt the beginning of each player's upkeep, remove all hourglass counters from permanents that player controls. diff --git a/forge-gui/res/cardsfolder/t/temporary_truce.txt b/forge-gui/res/cardsfolder/t/temporary_truce.txt index a7a6052aee4..9906d53ba55 100644 --- a/forge-gui/res/cardsfolder/t/temporary_truce.txt +++ b/forge-gui/res/cardsfolder/t/temporary_truce.txt @@ -8,6 +8,6 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True # Player is remembered here SVar:Y:Count$RememberedSize/NMinus.3 SVar:X:SVar$Y/Twice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/temporary_truce.jpg Oracle:Each player may draw up to two cards. For each card less than two a player draws this way, that player gains 2 life. diff --git a/forge-gui/res/cardsfolder/t/tempting_licid.txt b/forge-gui/res/cardsfolder/t/tempting_licid.txt index c989133f14f..f1b72402a7a 100644 --- a/forge-gui/res/cardsfolder/t/tempting_licid.txt +++ b/forge-gui/res/cardsfolder/t/tempting_licid.txt @@ -6,6 +6,6 @@ A:AB$ Animate | Cost$ G T | Defined$ Self | RemoveThisAbility$ True | Permanent$ SVar:DBAttach:DB$ Attach | ValidTgts$ Creature | AILogic$ Pump SVar:SPAttach:SP$ Attach | Cost$ 0 | ValidTgts$ Creature S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddHiddenKeyword$ All creatures able to block CARDNAME do so. | Description$ All creatures able to block enchanted creature do so. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tempting_licid.jpg Oracle:{G}, {T}: Tempting Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {G} to end this effect.\nAll creatures able to block enchanted creature do so. diff --git a/forge-gui/res/cardsfolder/t/temur_banner.txt b/forge-gui/res/cardsfolder/t/temur_banner.txt index a0993c99a48..cc97ade5788 100644 --- a/forge-gui/res/cardsfolder/t/temur_banner.txt +++ b/forge-gui/res/cardsfolder/t/temur_banner.txt @@ -5,7 +5,7 @@ A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. A:AB$ Draw | Cost$ G U R T Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Green|Blue|Red SVar:Picture:http://www.wizards.com/global/images/magic/general/temur_banner.jpg Oracle:{T}: Add {G}, {U}, or {R}.\n{G}{U}{R}, {T}, Sacrifice Temur Banner: Draw a card. diff --git a/forge-gui/res/cardsfolder/t/tendrils_of_despair.txt b/forge-gui/res/cardsfolder/t/tendrils_of_despair.txt index c2c2a38fe50..638ecadd7b0 100644 --- a/forge-gui/res/cardsfolder/t/tendrils_of_despair.txt +++ b/forge-gui/res/cardsfolder/t/tendrils_of_despair.txt @@ -2,6 +2,6 @@ Name:Tendrils of Despair ManaCost:B Types:Sorcery A:SP$ Discard | Cost$ B Sac<1/Creature> | ValidTgts$ Opponent | NumCards$ 2 | Mode$ TgtChoose | SpellDescription$ Target opponent discards two cards. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tendrils_of_despair.jpg Oracle:As an additional cost to cast Tendrils of Despair, sacrifice a creature.\nTarget opponent discards two cards. diff --git a/forge-gui/res/cardsfolder/t/tenza_godos_maul.txt b/forge-gui/res/cardsfolder/t/tenza_godos_maul.txt index cfbad64f98d..47881156d77 100644 --- a/forge-gui/res/cardsfolder/t/tenza_godos_maul.txt +++ b/forge-gui/res/cardsfolder/t/tenza_godos_maul.txt @@ -5,7 +5,7 @@ K:Equip:1 S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 1 | AddToughness$ 1 | Description$ Equipped creature gets +1/+1. S:Mode$ Continuous | Affected$ Card.EquippedBy+Legendary | AddPower$ 2 | AddToughness$ 2 | Description$ As long as it's legendary, it gets an additional +2/+2. S:Mode$ Continuous | Affected$ Card.EquippedBy+Red | AddKeyword$ Trample | Description$ As long as it's red, it has trample. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:AttachAi:AITgts$ Card.Red,Card.Legendary DeckNeeds:Color$red SVar:Picture:http://www.wizards.com/global/images/magic/general/tenza_godos_maul.jpg diff --git a/forge-gui/res/cardsfolder/t/teremko_griffin.txt b/forge-gui/res/cardsfolder/t/teremko_griffin.txt index 16c5ee7d687..0076784f9aa 100644 --- a/forge-gui/res/cardsfolder/t/teremko_griffin.txt +++ b/forge-gui/res/cardsfolder/t/teremko_griffin.txt @@ -4,6 +4,6 @@ Types:Creature Griffin PT:2/2 K:Flying K:Banding -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/teremko_griffin.jpg Oracle:Flying, banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/t/terra_eternal.txt b/forge-gui/res/cardsfolder/t/terra_eternal.txt index 23956dce2a4..1b9ae2e4fba 100644 --- a/forge-gui/res/cardsfolder/t/terra_eternal.txt +++ b/forge-gui/res/cardsfolder/t/terra_eternal.txt @@ -3,6 +3,6 @@ ManaCost:2 W Types:Enchantment S:Mode$ Continuous | Affected$ Land | AddKeyword$ Indestructible | Description$ All lands have indestructible. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/terra_eternal.jpg Oracle:All lands have indestructible. diff --git a/forge-gui/res/cardsfolder/t/terraformer.txt b/forge-gui/res/cardsfolder/t/terraformer.txt index 486a1a9225d..7f820c9e60f 100644 --- a/forge-gui/res/cardsfolder/t/terraformer.txt +++ b/forge-gui/res/cardsfolder/t/terraformer.txt @@ -4,6 +4,6 @@ Types:Creature Human Wizard PT:2/2 A:AB$ ChooseType | Cost$ 1 | Type$ Basic Land | SubAbility$ DBAnimate | SpellDescription$ Choose a basic land type. Each land you control becomes that type until end of turn. SVar:DBAnimate:DB$ AnimateAll | ValidCards$ Land.YouCtrl | Types$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/terraformer.jpg Oracle:{1}: Choose a basic land type. Each land you control becomes that type until end of turn. diff --git a/forge-gui/res/cardsfolder/t/terrarion.txt b/forge-gui/res/cardsfolder/t/terrarion.txt index 245ece3d9e8..d000d925194 100644 --- a/forge-gui/res/cardsfolder/t/terrarion.txt +++ b/forge-gui/res/cardsfolder/t/terrarion.txt @@ -5,6 +5,6 @@ A:AB$ Mana | Cost$ 2 T Sac<1/CARDNAME> | Produced$ Combo Any | Amount$ 2 | AILog T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, draw a card. SVar:TrigDraw:DB$Draw | Defined$ TriggeredCardController | NumCards$ 1 K:CARDNAME enters the battlefield tapped. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/terrarion.jpg Oracle:Terrarion enters the battlefield tapped.\n{2}, {T}, Sacrifice Terrarion: Add two mana in any combination of colors.\nWhen Terrarion is put into a graveyard from the battlefield, draw a card. diff --git a/forge-gui/res/cardsfolder/t/terravore.txt b/forge-gui/res/cardsfolder/t/terravore.txt index 437e10f024b..5d358489c1a 100644 --- a/forge-gui/res/cardsfolder/t/terravore.txt +++ b/forge-gui/res/cardsfolder/t/terravore.txt @@ -5,7 +5,7 @@ PT:*/* K:Trample S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | References$ X | Description$ CARDNAME's power and toughness are each equal to the number of land cards in all graveyards. SVar:X:Count$TypeInAllYards.Land -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NeedsToPlayVar:X GE1 SVar:Picture:http://www.wizards.com/global/images/magic/general/terravore.jpg Oracle:Trample\nTerravore's power and toughness are each equal to the number of land cards in all graveyards. diff --git a/forge-gui/res/cardsfolder/t/terrifying_presence.txt b/forge-gui/res/cardsfolder/t/terrifying_presence.txt index a21c435d1d7..ed6b2c4ed77 100644 --- a/forge-gui/res/cardsfolder/t/terrifying_presence.txt +++ b/forge-gui/res/cardsfolder/t/terrifying_presence.txt @@ -3,6 +3,6 @@ ManaCost:1 G Types:Instant A:SP$ Effect | Cost$ 1 G | Name$ Terrifying Presence Effect | ValidTgts$ Creature | TgtPrompt$ Select target creature | ReplacementEffects$ RPrevent | RememberObjects$ Targeted | SpellDescription$ Prevent all damage that would be dealt this turn by creatures other than target creature. SVar:RPrevent:Event$ DamageDone | Prevent$ True | IsCombat$ True | ActiveZones$ Command | ValidSource$ Creature.IsNotRemembered | Description$ Prevent all damage that would be dealt this turn by creatures other than target creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/terrifying_presence.jpg Oracle:Prevent all combat damage that would be dealt by creatures other than target creature this turn. diff --git a/forge-gui/res/cardsfolder/t/territorial_dispute.txt b/forge-gui/res/cardsfolder/t/territorial_dispute.txt index 82864402a74..88858bbba78 100644 --- a/forge-gui/res/cardsfolder/t/territorial_dispute.txt +++ b/forge-gui/res/cardsfolder/t/territorial_dispute.txt @@ -3,7 +3,7 @@ ManaCost:4 R R Types:Enchantment K:UpkeepCost:Sac<1/Land> S:Mode$ CantPlayLand | Description$ Players can't play lands. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/territorial_dispute.jpg Oracle:At the beginning of your upkeep, sacrifice Territorial Dispute unless you sacrifice a land.\nPlayers can't play lands. diff --git a/forge-gui/res/cardsfolder/t/test_of_endurance.txt b/forge-gui/res/cardsfolder/t/test_of_endurance.txt index 3db5e9837cb..84088ccb867 100644 --- a/forge-gui/res/cardsfolder/t/test_of_endurance.txt +++ b/forge-gui/res/cardsfolder/t/test_of_endurance.txt @@ -3,6 +3,6 @@ ManaCost:2 W W Types:Enchantment T:Mode$Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | LifeTotal$ You | LifeAmount$ GE50 | Execute$ TrigWin | TriggerDescription$ At the beginning of your upkeep, if you have 50 or more life, you win the game. SVar:TrigWin:DB$WinsGame | Defined$ You -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/test_of_endurance.jpg Oracle:At the beginning of your upkeep, if you have 50 or more life, you win the game. diff --git a/forge-gui/res/cardsfolder/t/testament_of_faith.txt b/forge-gui/res/cardsfolder/t/testament_of_faith.txt index 549a4d21334..28d8b624644 100644 --- a/forge-gui/res/cardsfolder/t/testament_of_faith.txt +++ b/forge-gui/res/cardsfolder/t/testament_of_faith.txt @@ -3,6 +3,6 @@ ManaCost:W Types:Enchantment A:AB$ Animate | Cost$ X | Defined$ Self | Power$ X | Toughness$ X | References$ X | Types$ Creature,Wall | Keywords$ Defender | SpellDescription$ CARDNAME becomes an X/X Wall creature with defender in addition to its other types until end of turn. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/testament_of_faith.jpg Oracle:{X}: Testament of Faith becomes an X/X Wall creature with defender in addition to its other types until end of turn. diff --git a/forge-gui/res/cardsfolder/t/tethered_griffin.txt b/forge-gui/res/cardsfolder/t/tethered_griffin.txt index fb8972af067..96295975023 100644 --- a/forge-gui/res/cardsfolder/t/tethered_griffin.txt +++ b/forge-gui/res/cardsfolder/t/tethered_griffin.txt @@ -6,7 +6,7 @@ K:Flying T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Enchantment.YouCtrl | PresentCompare$ EQ0 | Execute$ TrigSac | TriggerDescription$ When you control no enchantments, sacrifice CARDNAME. SVar:TrigSac:DB$Sacrifice | Defined$ Self SVar:NeedsToPlay:Enchantment.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Enchantment SVar:Picture:http://www.wizards.com/global/images/magic/general/tethered_griffin.jpg Oracle:Flying\nWhen you control no enchantments, sacrifice Tethered Griffin. diff --git a/forge-gui/res/cardsfolder/t/tezzeret_master_of_metal.txt b/forge-gui/res/cardsfolder/t/tezzeret_master_of_metal.txt index aef113a09b7..ccb34ba71d2 100644 --- a/forge-gui/res/cardsfolder/t/tezzeret_master_of_metal.txt +++ b/forge-gui/res/cardsfolder/t/tezzeret_master_of_metal.txt @@ -7,7 +7,7 @@ A:AB$ LoseLife | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | ValidTgts$ O SVar:X:Count$Valid Artifact.YouCtrl A:AB$ GainControl | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | AllValid$ Artifact,Creature | ControlledByTarget$ True | NewController$ You | SpellDescription$ Gain control of all artifacts and creatures target opponent controls. DeckNeeds:Type$Artifact -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Name$Tezzeret's Betrayal SVar:Picture:http://www.wizards.com/global/images/magic/general/tezzeret_master_of_metal.jpg Oracle:[+1]: Reveal cards from the top of your library until you reveal an artifact card. Put that card into your hand and the rest on the bottom of your library in a random order.\n[-3]: Target opponent loses life equal to the number of artifacts you control.\n[-8]: Gain control of all artifacts and creatures target opponent controls. diff --git a/forge-gui/res/cardsfolder/t/tezzeret_the_seeker.txt b/forge-gui/res/cardsfolder/t/tezzeret_the_seeker.txt index 1d23fcd5c59..0310718891e 100644 --- a/forge-gui/res/cardsfolder/t/tezzeret_the_seeker.txt +++ b/forge-gui/res/cardsfolder/t/tezzeret_the_seeker.txt @@ -7,7 +7,7 @@ A:AB$ ChangeZone | Cost$ SubCounter | Origin$ Library | Destination$ A:AB$ AnimateAll | Cost$ SubCounter<5/LOYALTY> | Power$ 5 | Toughness$ 5 | Types$ Creature,Artifact | ValidCards$ Artifact.YouCtrl | Planeswalker$ True | Ultimate$ True | SpellDescription$ Artifacts you control become artifact creatures with base power and toughness 5/5 until end of turn. #ChosenX SVar created by Cost payment SVar:X:XChoice -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Artifact SVar:Picture:http://www.wizards.com/global/images/magic/general/tezzeret_the_seeker.jpg Oracle:[+1]: Untap up to two target artifacts.\n[-X]: Search your library for an artifact card with converted mana cost X or less, put it onto the battlefield, then shuffle your library.\n[-5]: Artifacts you control become artifact creatures with base power and toughness 5/5 until end of turn. diff --git a/forge-gui/res/cardsfolder/t/tezzerets_touch.txt b/forge-gui/res/cardsfolder/t/tezzerets_touch.txt index f8aa6989884..f8eac85a784 100644 --- a/forge-gui/res/cardsfolder/t/tezzerets_touch.txt +++ b/forge-gui/res/cardsfolder/t/tezzerets_touch.txt @@ -6,6 +6,6 @@ A:SP$ Attach | Cost$ 1 U B | ValidTgts$ Artifact | AITgts$ Card.nonCreature | AI S:Mode$ Continuous | Affected$ Card.AttachedBy | SetPower$ 5 | SetToughness$ 5 | AddType$ Creature | Description$ Enchanted artifact is a creature with base power and toughness 5/5 in addition to its other types. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.AttachedBy | Execute$ TrigChangeZone | TriggerDescription$ When enchanted artifact is put into a graveyard, return that card to its owner's hand. SVar:TrigChangeZone:DB$ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Hand -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/tezzerets_touch.jpg Oracle:Enchant artifact\nEnchanted artifact is a creature with base power and toughness 5/5 in addition to its other types.\nWhen enchanted artifact is put into a graveyard, return that card to its owner's hand. diff --git a/forge-gui/res/cardsfolder/t/thalakos_mistfolk.txt b/forge-gui/res/cardsfolder/t/thalakos_mistfolk.txt index 5dfe737e15f..54c48dc6cf2 100644 --- a/forge-gui/res/cardsfolder/t/thalakos_mistfolk.txt +++ b/forge-gui/res/cardsfolder/t/thalakos_mistfolk.txt @@ -7,6 +7,6 @@ K:Shadow # ChangeZone default to top of library for destination # A:AB$ ChangeZone | Cost$ U | Defined$ Self | Origin$ Battlefield | Destination$ Library | SpellDescription$ Put CARDNAME on top of its owner's library. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/thalakos_mistfolk.jpg Oracle:Shadow (This creature can block or be blocked by only creatures with shadow.)\n{U}: Put Thalakos Mistfolk on top of its owner's library. diff --git a/forge-gui/res/cardsfolder/t/thassas_ire.txt b/forge-gui/res/cardsfolder/t/thassas_ire.txt index 22f335b1c5b..fdee3b1bc3c 100644 --- a/forge-gui/res/cardsfolder/t/thassas_ire.txt +++ b/forge-gui/res/cardsfolder/t/thassas_ire.txt @@ -2,6 +2,6 @@ Name:Thassa's Ire ManaCost:U Types:Enchantment A:AB$ TapOrUntap | Cost$ 3 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ You may tap or untap target creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/thassas_ire.jpg Oracle:{3}{U}: You may tap or untap target creature. diff --git a/forge-gui/res/cardsfolder/t/thaumatog.txt b/forge-gui/res/cardsfolder/t/thaumatog.txt index 9b4eca59bf6..77b1d44a23d 100644 --- a/forge-gui/res/cardsfolder/t/thaumatog.txt +++ b/forge-gui/res/cardsfolder/t/thaumatog.txt @@ -4,6 +4,6 @@ Types:Creature Atog PT:1/2 A:AB$ Pump | Cost$ Sac<1/Enchantment> | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Thaumatog gets +1/+1 until end of turn. A:AB$ Pump | Cost$ Sac<1/Land> | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Thaumatog gets +1/+1 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/thaumatog.jpg Oracle:Sacrifice a land: Thaumatog gets +1/+1 until end of turn.\nSacrifice an enchantment: Thaumatog gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/t/the_abyss.txt b/forge-gui/res/cardsfolder/t/the_abyss.txt index adbe22fb2df..24680e4671f 100644 --- a/forge-gui/res/cardsfolder/t/the_abyss.txt +++ b/forge-gui/res/cardsfolder/t/the_abyss.txt @@ -3,6 +3,6 @@ ManaCost:3 B Types:World Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ TrigDestroy | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each player's upkeep, destroy target nonartifact creature that player controls of their choice. It can't be regenerated. SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Creature.nonArtifact+ActivePlayerCtrl | TgtPrompt$ Choose target nonartifact creature. | NoRegen$ True | TargetingPlayer$ TriggeredPlayer -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/the_abyss.jpg Oracle:At the beginning of each player's upkeep, destroy target nonartifact creature that player controls of their choice. It can't be regenerated. diff --git a/forge-gui/res/cardsfolder/t/the_chain_veil.txt b/forge-gui/res/cardsfolder/t/the_chain_veil.txt index 16da80ee278..bfba291ac02 100644 --- a/forge-gui/res/cardsfolder/t/the_chain_veil.txt +++ b/forge-gui/res/cardsfolder/t/the_chain_veil.txt @@ -6,7 +6,7 @@ SVar:TrigLoseLife:DB$ LoseLife | Defined$ You | LifeAmount$ 2 A:AB$ Effect | Cost$ 4 T | StaticAbilities$ STPump | AILogic$ ChainVeil | SpellDescription$ For each planeswalker you control, you may activate one of its loyalty abilities once this turn as though none of its loyalty abilities had been activated this turn. SVar:STPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Planeswalker.YouCtrl | AddHiddenKeyword$ May activate CARDNAME's loyalty abilities once | Description$ For each planeswalker you control, you may activate one of its loyalty abilities once this turn as though none of its loyalty abilities had been activated this turn. SVar:NeedsToPlay:Planeswalker.YouCtrl -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/the_chain_veil.jpg Oracle:At the beginning of your end step, if you didn't activate a loyalty ability of a planeswalker this turn, you lose 2 life.\n{4}, {T}: For each planeswalker you control, you may activate one of its loyalty abilities once this turn as though none of its loyalty abilities have been activated this turn. diff --git a/forge-gui/res/cardsfolder/t/the_flame_of_keld.txt b/forge-gui/res/cardsfolder/t/the_flame_of_keld.txt index 020ffdfc947..69a0758307f 100644 --- a/forge-gui/res/cardsfolder/t/the_flame_of_keld.txt +++ b/forge-gui/res/cardsfolder/t/the_flame_of_keld.txt @@ -8,5 +8,5 @@ SVar:TrigEffect:DB$ Effect | Name$ The Flame of Keld Effect | ReplacementEffects SVar:FlameOfKeldDamageEvent:Event$ DamageDone | ActiveZones$ Command | ValidSource$ Card.RedSource | ValidTarget$ Permanent,Player | ReplaceWith$ DmgPlus2 | Description$ If a red source you control would deal damage to a permanent or player this turn, it deals that much damage plus 2 to that permanent or player instead. SVar:DmgPlus2:DB$ ReplaceEffect | VarName$ DamageAmount | VarValue$ X | References$ X SVar:X:ReplaceCount$DamageAmount/Plus.2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI — Discard your hand.\nII — Draw two cards.\nIII — If a red source you control would deal damage to a permanent or player this turn, it deals that much damage plus 2 to that permanent or player instead. diff --git a/forge-gui/res/cardsfolder/t/the_tabernacle_at_pendrell_vale.txt b/forge-gui/res/cardsfolder/t/the_tabernacle_at_pendrell_vale.txt index 60e993b4674..a0228e429ba 100644 --- a/forge-gui/res/cardsfolder/t/the_tabernacle_at_pendrell_vale.txt +++ b/forge-gui/res/cardsfolder/t/the_tabernacle_at_pendrell_vale.txt @@ -4,6 +4,6 @@ Types:Legendary Land S:Mode$ Continuous | Affected$ Creature | AddTrigger$ TabernacleTrig | AddSVar$ TabernacleDestroy | Description$ All creatures have "At the beginning of your upkeep, destroy this creature unless you pay {1}." SVar:TabernacleTrig:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TabernacleDestroy | TriggerDescription$ At the beginning of your upkeep, destroy CARDNAME unless you pay {1}. SVar:TabernacleDestroy:DB$ Destroy | Defined$ Self | UnlessPayer$ You | UnlessCost$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/the_tabernacle_at_pendrell_vale.jpg Oracle:All creatures have "At the beginning of your upkeep, destroy this creature unless you pay {1}." diff --git a/forge-gui/res/cardsfolder/t/thelonite_druid.txt b/forge-gui/res/cardsfolder/t/thelonite_druid.txt index 6e0ced4578a..f83c3a6220e 100644 --- a/forge-gui/res/cardsfolder/t/thelonite_druid.txt +++ b/forge-gui/res/cardsfolder/t/thelonite_druid.txt @@ -4,6 +4,6 @@ Types:Creature Human Cleric Druid PT:1/1 A:AB$ AnimateAll | Cost$ 1 G T Sac<1/Creature> | ValidCards$ Forest.YouCtrl | Types$ Creature | Power$ 2 | Toughness$ 3 | SpellDescription$ Forests you control become 2/3 creatures until end of turn. They're still lands. SVar:AIPreference:SacCost$Creature.token -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/thelonite_druid.jpg Oracle:{1}{G}, {T}, Sacrifice a creature: Forests you control become 2/3 creatures until end of turn. They're still lands. diff --git a/forge-gui/res/cardsfolder/t/thelonite_monk.txt b/forge-gui/res/cardsfolder/t/thelonite_monk.txt index 11a2e316de5..2b0a9b78c62 100644 --- a/forge-gui/res/cardsfolder/t/thelonite_monk.txt +++ b/forge-gui/res/cardsfolder/t/thelonite_monk.txt @@ -4,6 +4,6 @@ Types:Creature Insect Monk Cleric PT:1/2 A:AB$ Animate | Cost$ T Sac<1/Creature.Green/green creature> | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Forest | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | Permanent$ True | SpellDescription$ Target land becomes a Forest. (This effect lasts indefinitely.) SVar:AIPreference:SacCost$Creature.Green+token -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/thelonite_monk.jpg Oracle:{T}, Sacrifice a green creature: Target land becomes a Forest. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/t/thelons_chant.txt b/forge-gui/res/cardsfolder/t/thelons_chant.txt index f7c668d233c..a9849b8699c 100644 --- a/forge-gui/res/cardsfolder/t/thelons_chant.txt +++ b/forge-gui/res/cardsfolder/t/thelons_chant.txt @@ -4,6 +4,6 @@ Types:Enchantment K:UpkeepCost:G T:Mode$ ChangesZone | ValidCard$ Swamp | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigDmg | TriggerDescription$ Whenever a player puts a Swamp onto the battlefield, CARDNAME deals 3 damage to that player unless they put a -1/-1 counter on a creature they control. SVar:TrigDmg:DB$ DealDamage | Defined$ TriggeredCardController | NumDmg$ 3 | UnlessCost$ AddCounter<1/M1M1/Creature.YouCtrl/a creature you control> | UnlessPayer$ TriggeredCardController -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/thelons_chant.jpg Oracle:At the beginning of your upkeep, sacrifice Thelon's Chant unless you pay {G}.\nWhenever a player puts a Swamp onto the battlefield, Thelon's Chant deals 3 damage to that player unless they put a -1/-1 counter on a creature they control. diff --git a/forge-gui/res/cardsfolder/t/thelons_curse.txt b/forge-gui/res/cardsfolder/t/thelons_curse.txt index 87396ef1634..c1d71b2d588 100644 --- a/forge-gui/res/cardsfolder/t/thelons_curse.txt +++ b/forge-gui/res/cardsfolder/t/thelons_curse.txt @@ -7,7 +7,7 @@ SVar:TrigChoose:DB$ ChooseCard | Defined$ TriggeredPlayer | Amount$ X | Referenc SVar:DBUntap:DB$ RepeatEach | DefinedCards$ ChosenCard | RepeatSubAbility$ UntapEach SVar:UntapEach:DB$ Untap | Defined$ Remembered | UnlessCost$ U | UnlessPayer$ RememberedController | UnlessSwitched$ True | ShowCurrentCard$ Remembered SVar:X:Count$Valid Creature.tapped+Blue+ActivePlayerCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/thelons_curse.jpg Oracle:Blue creatures don't untap during their controllers' untap steps.\nAt the beginning of each player's upkeep, that player may choose any number of tapped blue creatures they control and pay {U} for each creature chosen this way. If the player does, untap those creatures. diff --git a/forge-gui/res/cardsfolder/t/thermal_flux.txt b/forge-gui/res/cardsfolder/t/thermal_flux.txt index a97df95259e..62a325ffcdd 100644 --- a/forge-gui/res/cardsfolder/t/thermal_flux.txt +++ b/forge-gui/res/cardsfolder/t/thermal_flux.txt @@ -6,6 +6,6 @@ SVar:ChooseFreeze:DB$ Animate | ValidTgts$ Permanent.nonSnow | TgtPrompt$ Select SVar:ChooseThaw:DB$ Animate | ValidTgts$ Permanent.Snow | TgtPrompt$ Select target snow permanent | RemoveTypes$ Snow | SubAbility$ DelTrigSlowtrip | SpellDescription$ Target snow permanent isn't snow until end of turn. Draw a card at the beginning of the next turn's upkeep. SVar:DelTrigSlowtrip:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ DrawSlowtrip | TriggerDescription$ Draw a card. SVar:DrawSlowtrip:DB$Draw | NumCards$ 1 | Defined$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/thermal_flux.jpg Oracle:Choose one —\n• Target nonsnow permanent becomes snow until end of turn.\n• Target snow permanent isn't snow until end of turn.\nDraw a card at the beginning of the next turn's upkeep. diff --git a/forge-gui/res/cardsfolder/t/thermopod.txt b/forge-gui/res/cardsfolder/t/thermopod.txt index 7fc27acbcdc..31725ab7ce6 100644 --- a/forge-gui/res/cardsfolder/t/thermopod.txt +++ b/forge-gui/res/cardsfolder/t/thermopod.txt @@ -4,6 +4,6 @@ Types:Snow Creature Slug PT:4/3 A:AB$ Mana | Cost$ Sac<1/Creature> | Produced$ R | SpellDescription$ Add {R}. A:AB$ Pump | Cost$ S | KW$ Haste | Defined$ Self | SpellDescription$ CARDNAME gains haste until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/thermopod.jpg Oracle:{S}: Thermopod gains haste until end of turn. ({S} can be paid with one mana from a snow permanent.)\nSacrifice a creature: Add {R}. diff --git a/forge-gui/res/cardsfolder/t/thespians_stage.txt b/forge-gui/res/cardsfolder/t/thespians_stage.txt index 2a2b3db4896..276afdc26e9 100644 --- a/forge-gui/res/cardsfolder/t/thespians_stage.txt +++ b/forge-gui/res/cardsfolder/t/thespians_stage.txt @@ -3,6 +3,6 @@ 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. | GainThisAbility$ True | SpellDescription$ CARDNAME becomes a copy of target land and gains this ability. -SVar:RemAIDeck:True +AI:RemoveDeck:All 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. diff --git a/forge-gui/res/cardsfolder/t/thief_of_blood.txt b/forge-gui/res/cardsfolder/t/thief_of_blood.txt index 4229df30678..d561db94bdf 100644 --- a/forge-gui/res/cardsfolder/t/thief_of_blood.txt +++ b/forge-gui/res/cardsfolder/t/thief_of_blood.txt @@ -8,6 +8,6 @@ SVar:DBRemoveCounterAll:DB$ RemoveCounterAll | ValidCards$ Permanent | AllCounte SVar:DBPutCounters:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$ChosenNumber -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/thief_of_blood.jpg Oracle:Flying\nAs Thief of Blood enters the battlefield, remove all counters from all permanents. Thief of Blood enters the battlefield with a +1/+1 counter on it for each counter removed this way. diff --git a/forge-gui/res/cardsfolder/t/thieves_auction.txt b/forge-gui/res/cardsfolder/t/thieves_auction.txt index 6543773646e..10af838daf8 100644 --- a/forge-gui/res/cardsfolder/t/thieves_auction.txt +++ b/forge-gui/res/cardsfolder/t/thieves_auction.txt @@ -6,6 +6,6 @@ SVar:DBRepeatChoose:DB$ Repeat | RepeatSubAbility$ DBRepeat | RepeatDefined$ Rem SVar:DBRepeat:DB$ RepeatEach | StartingWithActivator$ True | RepeatPlayers$ Player | RepeatSubAbility$ DBChoose SVar:DBChoose:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Card.IsRemembered | ForgetChosen$ True | ChoiceZone$ Exile | SubAbility$ DBGainControl SVar:DBGainControl:DB$ ChangeZone | Origin$ Exile | Destination$ Battlefield | Defined$ ChosenCard | GainControl$ True | Tapped$ True | NewController$ Player.IsRemembered -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/thieves_auction.jpg Oracle:Exile all nontoken permanents. Starting with you, each player chooses one of the exiled cards and puts it onto the battlefield tapped under their control. Repeat this process until all cards exiled this way have been chosen. diff --git a/forge-gui/res/cardsfolder/t/thieves_fortune.txt b/forge-gui/res/cardsfolder/t/thieves_fortune.txt index 0355d6548b9..1aa42f5536c 100644 --- a/forge-gui/res/cardsfolder/t/thieves_fortune.txt +++ b/forge-gui/res/cardsfolder/t/thieves_fortune.txt @@ -3,7 +3,7 @@ ManaCost:2 U Types:Tribal Instant Rogue K:Prowl:U A:SP$ Dig | Cost$ 2 U | DigNum$ 4 | ChangeNum$ 1 | SpellDescription$ Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order. -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckNeeds:Type$Rogue SVar:Picture:http://www.wizards.com/global/images/magic/general/thieves_fortune.jpg Oracle:Prowl {U} (You may cast this for its prowl cost if you dealt combat damage to a player this turn with a Rogue.)\nLook at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order. diff --git a/forge-gui/res/cardsfolder/t/thing_from_the_deep.txt b/forge-gui/res/cardsfolder/t/thing_from_the_deep.txt index 4a1b50555af..0ae33c59cc9 100644 --- a/forge-gui/res/cardsfolder/t/thing_from_the_deep.txt +++ b/forge-gui/res/cardsfolder/t/thing_from_the_deep.txt @@ -5,6 +5,6 @@ PT:9/9 T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigSacUnless | TriggerDescription$ Whenever CARDNAME attacks, sacrifice it unless you sacrifice an Island. SVar:TrigSacUnless:DB$ Sacrifice | Defined$ Self | UnlessCost$ Sac<1/Island> | UnlessPayer$ You SVar:NeedsToPlay:Island.YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/thing_from_the_deep.jpg Oracle:Whenever Thing from the Deep attacks, sacrifice it unless you sacrifice an Island. diff --git a/forge-gui/res/cardsfolder/t/think_tank.txt b/forge-gui/res/cardsfolder/t/think_tank.txt index 5fd08fb8304..7ec676edb6f 100644 --- a/forge-gui/res/cardsfolder/t/think_tank.txt +++ b/forge-gui/res/cardsfolder/t/think_tank.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDig | TriggerDescription$ At the beginning of your upkeep, look at the top card of your library. You may put that card into your graveyard. SVar:TrigDig:DB$Dig | DigNum$ 1 | ChangeNum$ 1 | DestinationZone$ Graveyard | Optional$ True | LibraryPosition2$ 0 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/think_tank.jpg Oracle:At the beginning of your upkeep, look at the top card of your library. You may put that card into your graveyard. diff --git a/forge-gui/res/cardsfolder/t/thorn_of_amethyst.txt b/forge-gui/res/cardsfolder/t/thorn_of_amethyst.txt index 91fa45fed8b..b380bcd6d41 100644 --- a/forge-gui/res/cardsfolder/t/thorn_of_amethyst.txt +++ b/forge-gui/res/cardsfolder/t/thorn_of_amethyst.txt @@ -2,6 +2,6 @@ Name:Thorn of Amethyst ManaCost:2 Types:Artifact S:Mode$ RaiseCost | ValidCard$ Card.nonCreature | Type$ Spell | Amount$ 1 | Description$ Noncreature spells cost {1} more to cast. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/thorn_of_amethyst.jpg Oracle:Noncreature spells cost {1} more to cast. diff --git a/forge-gui/res/cardsfolder/t/thornscape_master.txt b/forge-gui/res/cardsfolder/t/thornscape_master.txt index aebc8727e24..0f63e1ac711 100644 --- a/forge-gui/res/cardsfolder/t/thornscape_master.txt +++ b/forge-gui/res/cardsfolder/t/thornscape_master.txt @@ -4,7 +4,7 @@ Types:Creature Human Wizard PT:2/2 A:AB$ DealDamage | Cost$ R R T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature. A:AB$ Protection | Cost$ W W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | Gains$ Choice | Choices$ AnyColor | SpellDescription$ Target creature gains protection from the color of your choice until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Red|White SVar:Picture:http://www.wizards.com/global/images/magic/general/thornscape_master.jpg Oracle:{R}{R}, {T}: Thornscape Master deals 2 damage to target creature.\n{W}{W}, {T}: Target creature gains protection from the color of your choice until end of turn. diff --git a/forge-gui/res/cardsfolder/t/thornwatch_scarecrow.txt b/forge-gui/res/cardsfolder/t/thornwatch_scarecrow.txt index d8a3414e2ab..014e98a9c6d 100644 --- a/forge-gui/res/cardsfolder/t/thornwatch_scarecrow.txt +++ b/forge-gui/res/cardsfolder/t/thornwatch_scarecrow.txt @@ -7,7 +7,7 @@ S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Vigilance | CheckSVar$ Y SVar:X:Count$Valid Creature.Green+YouCtrl SVar:Y:Count$Valid Creature.White+YouCtrl SVar:BuffedBy:Creature.White,Creature.Green -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$white|green SVar:Picture:http://www.wizards.com/global/images/magic/general/thornwatch_scarecrow.jpg Oracle:Thornwatch Scarecrow has wither as long as you control a green creature. (It deals damage to creatures in the form of -1/-1 counters.)\nThornwatch Scarecrow has vigilance as long as you control a white creature. diff --git a/forge-gui/res/cardsfolder/t/thought_courier.txt b/forge-gui/res/cardsfolder/t/thought_courier.txt index 4d097fbd636..67afc20da09 100644 --- a/forge-gui/res/cardsfolder/t/thought_courier.txt +++ b/forge-gui/res/cardsfolder/t/thought_courier.txt @@ -4,6 +4,6 @@ Types:Creature Human Wizard PT:1/1 A:AB$ Draw | Cost$ T | NumCards$ 1 | SpellDescription$ Draw a card, then discard a card. | SubAbility$ DBDiscard SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card82980.jpg Oracle:{T}: Draw a card, then discard a card. diff --git a/forge-gui/res/cardsfolder/t/thought_devourer.txt b/forge-gui/res/cardsfolder/t/thought_devourer.txt index 02f2f45c85a..66113c9aaf0 100644 --- a/forge-gui/res/cardsfolder/t/thought_devourer.txt +++ b/forge-gui/res/cardsfolder/t/thought_devourer.txt @@ -4,6 +4,6 @@ Types:Creature Beast PT:4/4 S:Mode$ Continuous | Affected$ You | RaiseMaxHandSize$ -4 | Description$ Your maximum hand size is reduced by four. K:Flying -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/thought_devourer.jpg Oracle:Flying\nYour maximum hand size is reduced by four. diff --git a/forge-gui/res/cardsfolder/t/thought_dissector.txt b/forge-gui/res/cardsfolder/t/thought_dissector.txt index 7e7f2606024..57f688cee6b 100644 --- a/forge-gui/res/cardsfolder/t/thought_dissector.txt +++ b/forge-gui/res/cardsfolder/t/thought_dissector.txt @@ -6,6 +6,6 @@ SVar:SacThought:DB$ Sacrifice | ConditionCheckSVar$ Found | ConditionSVarCompare SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Found:Remembered$Amount SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/thought_dissector.jpg Oracle:{X}, {T}: Target opponent reveals cards from the top of their library until an artifact card or X cards are revealed, whichever comes first. If an artifact card is revealed this way, put it onto the battlefield under your control and sacrifice Thought Dissector. Put the rest of the revealed cards into that player's graveyard. diff --git a/forge-gui/res/cardsfolder/t/thought_eater.txt b/forge-gui/res/cardsfolder/t/thought_eater.txt index f515265a117..75b86b1684f 100644 --- a/forge-gui/res/cardsfolder/t/thought_eater.txt +++ b/forge-gui/res/cardsfolder/t/thought_eater.txt @@ -4,6 +4,6 @@ Types:Creature Beast PT:2/2 S:Mode$ Continuous | Affected$ You | RaiseMaxHandSize$ -3 | Description$ Your maximum hand size is reduced by three. K:Flying -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/thought_eater.jpg Oracle:Flying\nYour maximum hand size is reduced by three. diff --git a/forge-gui/res/cardsfolder/t/thought_gorger.txt b/forge-gui/res/cardsfolder/t/thought_gorger.txt index 2a0efa662dd..a2e22f18da7 100644 --- a/forge-gui/res/cardsfolder/t/thought_gorger.txt +++ b/forge-gui/res/cardsfolder/t/thought_gorger.txt @@ -11,6 +11,6 @@ SVar:StrengthOfThoughts:Count$CountersAdded P1P1 Card.Self T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ BringBackThoughts | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME leaves the battlefield, draw a card for each +1/+1 counter on it. SVar:BringBackThoughts:DB$ Draw | NumCards$ Disgorge | References$ Disgorge | Defined$ TriggeredCardController SVar:Disgorge:TriggeredCard$CardCounters.P1P1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/thought_gorger.jpg Oracle:Trample\nWhen Thought Gorger enters the battlefield, put a +1/+1 counter on it for each card in your hand. If you do, discard your hand.\nWhen Thought Gorger leaves the battlefield, draw a card for each +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/t/thought_hemorrhage.txt b/forge-gui/res/cardsfolder/t/thought_hemorrhage.txt index 3593ec3fd5c..42fe770552e 100644 --- a/forge-gui/res/cardsfolder/t/thought_hemorrhage.txt +++ b/forge-gui/res/cardsfolder/t/thought_hemorrhage.txt @@ -11,6 +11,6 @@ SVar:NumInLib:TargetedPlayer$CardsInLibrary SVar:NumInHand:TargetedPlayer$CardsInHand SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True SVar:X:Remembered$Valid Card.NamedCard/Times.3 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/thought_hemorrhage.jpg Oracle:Choose a nonland card name. Target player reveals their hand. Thought Hemorrhage deals 3 damage to that player for each card with the chosen name revealed this way. Search that player's graveyard, hand, and library for all cards with that name and exile them. Then that player shuffles their library. diff --git a/forge-gui/res/cardsfolder/t/thought_lash.txt b/forge-gui/res/cardsfolder/t/thought_lash.txt index 1eb6d0eff5a..f73b12b7b6c 100644 --- a/forge-gui/res/cardsfolder/t/thought_lash.txt +++ b/forge-gui/res/cardsfolder/t/thought_lash.txt @@ -5,8 +5,8 @@ K:Cumulative upkeep:ExileFromTop<1/Card>:Exile the top card of your library. T:Mode$ PayCumulativeUpkeep | ValidCard$ Card.Self | Paid$ False | Execute$ TrigExileAll | TriggerDescription$ When a player doesn't pay CARDNAME's cumulative upkeep, that player exiles all cards from their library. SVar:TrigExileAll:DB$ ChangeZoneAll | Origin$ Library | Destination$ Exile | ChangeType$ Card.YouCtrl A:AB$ PreventDamage | Cost$ ExileFromTop<1/Card> | Defined$ You | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to you this turn. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/thought_lash.jpg Oracle:Cumulative upkeep—Exile the top card of your library. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nWhen a player doesn't pay Thought Lash's cumulative upkeep, that player exiles all cards from their library.\nExile the top card of your library: Prevent the next 1 damage that would be dealt to you this turn. diff --git a/forge-gui/res/cardsfolder/t/thought_nibbler.txt b/forge-gui/res/cardsfolder/t/thought_nibbler.txt index 9699dbc148d..45bebd081d1 100644 --- a/forge-gui/res/cardsfolder/t/thought_nibbler.txt +++ b/forge-gui/res/cardsfolder/t/thought_nibbler.txt @@ -4,6 +4,6 @@ Types:Creature Beast PT:1/1 S:Mode$ Continuous | Affected$ You | RaiseMaxHandSize$ -2 | Description$ Your maximum hand size is reduced by two. K:Flying -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/thought_nibbler.jpg Oracle:Flying\nYour maximum hand size is reduced by two. diff --git a/forge-gui/res/cardsfolder/t/thought_prison.txt b/forge-gui/res/cardsfolder/t/thought_prison.txt index a338e0b1bf8..45454d6f396 100644 --- a/forge-gui/res/cardsfolder/t/thought_prison.txt +++ b/forge-gui/res/cardsfolder/t/thought_prison.txt @@ -9,7 +9,7 @@ T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCar SVar:DBForget:DB$ Pump | ForgetImprinted$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Card.Self | Destination$ Any | Execute$ DBCleanup | Static$ True SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/thought_prison.jpg Oracle:Imprint — When Thought Prison enters the battlefield, you may have target player reveal their hand. If you do, choose a nonland card from it and exile that card.\nWhenever a player casts a spell that shares a color or converted mana cost with the exiled card, Thought Prison deals 2 damage to that player. diff --git a/forge-gui/res/cardsfolder/t/thoughtbound_primoc.txt b/forge-gui/res/cardsfolder/t/thoughtbound_primoc.txt index 30650381ef4..a74ad588277 100644 --- a/forge-gui/res/cardsfolder/t/thoughtbound_primoc.txt +++ b/forge-gui/res/cardsfolder/t/thoughtbound_primoc.txt @@ -5,7 +5,7 @@ PT:2/3 K:Flying T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | CheckDefinedPlayer$ Player.withMostTypeWizardOnly | Execute$ TrigGain | TriggerDescription$ At the beginning of your upkeep, if a player controls more Wizards than each other player, the player who controls the most Wizards gains control of CARDNAME. SVar:TrigGain:DB$ GainControl | Defined$ Self | NewController$ Player.withMostTypeWizardOnly -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Wizard SVar:Picture:http://www.wizards.com/global/images/magic/general/thoughtbound_primoc.jpg Oracle:Flying\nAt the beginning of your upkeep, if a player controls more Wizards than each other player, the player who controls the most Wizards gains control of Thoughtbound Primoc. diff --git a/forge-gui/res/cardsfolder/t/thoughtlace.txt b/forge-gui/res/cardsfolder/t/thoughtlace.txt index df4347e9f67..c5765b4bdb4 100644 --- a/forge-gui/res/cardsfolder/t/thoughtlace.txt +++ b/forge-gui/res/cardsfolder/t/thoughtlace.txt @@ -2,7 +2,7 @@ Name:Thoughtlace ManaCost:U Types:Instant A:SP$ Animate | Cost$ U | Colors$ Blue | OverwriteColors$ True | ValidTgts$ Card | TgtZone$ Stack,Battlefield | Permanent$ True | SpellDescription$ Target spell or permanent becomes blue. (Mana symbols on that permanent remain unchanged.) -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/thoughtlace.jpg Oracle:Target spell or permanent becomes blue. (Mana symbols on that permanent remain unchanged.) diff --git a/forge-gui/res/cardsfolder/t/thoughtleech.txt b/forge-gui/res/cardsfolder/t/thoughtleech.txt index baca3fc2c85..a3ffec5c021 100644 --- a/forge-gui/res/cardsfolder/t/thoughtleech.txt +++ b/forge-gui/res/cardsfolder/t/thoughtleech.txt @@ -3,6 +3,6 @@ ManaCost:G G Types:Enchantment T:Mode$ Taps | ValidCard$ Island.OppCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | Optional$ True | TriggerDescription$ Whenever an Island an opponent controls becomes tapped, you may gain 1 life. SVar:TrigGainLife:DB$ GainLife | LifeAmount$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/thoughtleech.jpg Oracle:Whenever an Island an opponent controls becomes tapped, you may gain 1 life. diff --git a/forge-gui/res/cardsfolder/t/thoughtpicker_witch.txt b/forge-gui/res/cardsfolder/t/thoughtpicker_witch.txt index b289e086a45..68d36ca4bde 100644 --- a/forge-gui/res/cardsfolder/t/thoughtpicker_witch.txt +++ b/forge-gui/res/cardsfolder/t/thoughtpicker_witch.txt @@ -3,6 +3,6 @@ ManaCost:B Types:Creature Human Wizard PT:1/1 A:AB$ Dig | Cost$ 1 Sac<1/Creature> | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | DigNum$ 2 | DestinationZone$ Exile | DestinationZone2$ Library | LibraryPosition2$ 0 | SpellDescription$ Look at the top two cards of target opponent's library, then exile one of them. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/thoughtpicker_witch.jpg Oracle:{1}, Sacrifice a creature: Look at the top two cards of target opponent's library, then exile one of them. diff --git a/forge-gui/res/cardsfolder/t/thoughts_of_ruin.txt b/forge-gui/res/cardsfolder/t/thoughts_of_ruin.txt index 30e656ee519..6ee35ea0c36 100644 --- a/forge-gui/res/cardsfolder/t/thoughts_of_ruin.txt +++ b/forge-gui/res/cardsfolder/t/thoughts_of_ruin.txt @@ -3,6 +3,6 @@ ManaCost:2 R R Types:Sorcery A:SP$ Sacrifice | Cost$ 2 R R | SacValid$ Land | Amount$ X | References$ X | Defined$ Player | SpellDescription$ Each player sacrifices a land for each card in your hand. SVar:X:Count$InYourHand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/thoughts_of_ruin.jpg Oracle:Each player sacrifices a land for each card in your hand. diff --git a/forge-gui/res/cardsfolder/t/thran_forge.txt b/forge-gui/res/cardsfolder/t/thran_forge.txt index ade04b3e597..a824b6cc398 100644 --- a/forge-gui/res/cardsfolder/t/thran_forge.txt +++ b/forge-gui/res/cardsfolder/t/thran_forge.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact A:AB$ Animate | Cost$ 2 | ValidTgts$ Creature.nonArtifact | TgtPrompt$ Select target nonartifact creature | Types$ Artifact | SubAbility$ DBPump | SpellDescription$ Until end of turn, target nonartifact creature gets +1/+0 and becomes an artifact in addition to its other types. SVar:DBPump:DB$Pump | Defined$ Targeted | NumAtt$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/thran_forge.jpg Oracle:{2}: Until end of turn, target nonartifact creature gets +1/+0 and becomes an artifact in addition to its other types. diff --git a/forge-gui/res/cardsfolder/t/thran_foundry.txt b/forge-gui/res/cardsfolder/t/thran_foundry.txt index 54c576e6b09..a6a3a7a82cc 100644 --- a/forge-gui/res/cardsfolder/t/thran_foundry.txt +++ b/forge-gui/res/cardsfolder/t/thran_foundry.txt @@ -2,6 +2,6 @@ Name:Thran Foundry ManaCost:1 Types:Artifact A:AB$ ChangeZoneAll | Cost$ 1 T Exile<1/CARDNAME> | Origin$ Graveyard | Destination$ Library | ValidTgts$ Player | TgtPrompt$ Select target player | ChangeType$ Card | Shuffle$ True | SpellDescription$ Target player shuffles their graveyard into their library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/thran_foundry.jpg Oracle:{1}, {T}, Exile Thran Foundry: Target player shuffles their graveyard into their library. diff --git a/forge-gui/res/cardsfolder/t/thran_lens.txt b/forge-gui/res/cardsfolder/t/thran_lens.txt index 21bf22e290c..038548e97de 100644 --- a/forge-gui/res/cardsfolder/t/thran_lens.txt +++ b/forge-gui/res/cardsfolder/t/thran_lens.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact S:Mode$ Continuous | Affected$ Permanent | SetColor$ Colorless | Description$ All permanents are colorless. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/thran_lens.jpg Oracle:All permanents are colorless. diff --git a/forge-gui/res/cardsfolder/t/thran_turbine.txt b/forge-gui/res/cardsfolder/t/thran_turbine.txt index 99af0c7eda7..2017b10f330 100644 --- a/forge-gui/res/cardsfolder/t/thran_turbine.txt +++ b/forge-gui/res/cardsfolder/t/thran_turbine.txt @@ -3,6 +3,6 @@ ManaCost:1 Types:Artifact T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | OptionalDecider$ You | TriggerZones$ Battlefield | Execute$ DBMana | TriggerDescription$ At the beginning of your upkeep, you may add {C}{C}. You can't spend this mana to cast spells. SVar:DBMana:DB$ Mana | Amount$ 2 | Produced$ C | RestrictValid$ nonSpell -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/thran_turbine.jpg Oracle:At the beginning of your upkeep, you may add {C}{C}. You can't spend this mana to cast spells. diff --git a/forge-gui/res/cardsfolder/t/thran_weaponry.txt b/forge-gui/res/cardsfolder/t/thran_weaponry.txt index a8cbb260089..a49143a9cab 100644 --- a/forge-gui/res/cardsfolder/t/thran_weaponry.txt +++ b/forge-gui/res/cardsfolder/t/thran_weaponry.txt @@ -7,6 +7,6 @@ A:AB$ PumpAll | Cost$ 2 T | ValidCards$ Creature | RememberAllPumped$ True | Spe S:Mode$ Continuous | Affected$ Creature.IsRemembered | AddPower$ 2 | AddToughness$ 2 T:Mode$ Untaps | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ ClearRemembered | Static$ True SVar:ClearRemembered:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/thran_weaponry.jpg Oracle:Echo {4} (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.)\nYou may choose not to untap Thran Weaponry during your untap step.\n{2}, {T}: All creatures get +2/+2 for as long as Thran Weaponry remains tapped. diff --git a/forge-gui/res/cardsfolder/t/three_dreams.txt b/forge-gui/res/cardsfolder/t/three_dreams.txt index 24790157c25..5c4d14dcba6 100644 --- a/forge-gui/res/cardsfolder/t/three_dreams.txt +++ b/forge-gui/res/cardsfolder/t/three_dreams.txt @@ -2,6 +2,6 @@ Name:Three Dreams ManaCost:4 W Types:Sorcery A:SP$ ChangeZone | Cost$ 4 W | Origin$ Library | Destination$ Hand | ChangeType$ Aura | ChangeNum$ 3 | DifferentNames$ True | SpellDescription$ Search your library for up to three Aura cards with different names, reveal them, put them into your hand, then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/three_dreams.jpg Oracle:Search your library for up to three Aura cards with different names, reveal them, put them into your hand, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/t/three_wishes.txt b/forge-gui/res/cardsfolder/t/three_wishes.txt index b5d714c956e..6d93463fb6e 100644 --- a/forge-gui/res/cardsfolder/t/three_wishes.txt +++ b/forge-gui/res/cardsfolder/t/three_wishes.txt @@ -7,7 +7,7 @@ SVar:STCanLookAtMayPlay:Mode$ Continuous | MayLookAt$ You | MayPlay$ True | Effe SVar:DBDelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ MoveToYard | RememberObjects$ Remembered | TriggerDescription$ At the beginning of your next upkeep, put any of those cards you didn't play into your graveyard. | SubAbility$ DBCleanup SVar:MoveToYard:DB$ ChangeZone | Origin$ Exile | Destination$ Graveyard | Defined$ DelayTriggerRemembered SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/three_wishes.jpg Oracle:Exile the top three cards of your library face down. You may look at those cards for as long as they remain exiled. Until your next turn, you may play those cards. At the beginning of your next upkeep, put any of those cards you didn't play into your graveyard. diff --git a/forge-gui/res/cardsfolder/t/throne_of_bone.txt b/forge-gui/res/cardsfolder/t/throne_of_bone.txt index 1e1006d59ef..20903ea51f3 100644 --- a/forge-gui/res/cardsfolder/t/throne_of_bone.txt +++ b/forge-gui/res/cardsfolder/t/throne_of_bone.txt @@ -3,6 +3,6 @@ ManaCost:1 Types:Artifact T:Mode$ SpellCast | ValidCard$ Card.Black | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever a player casts a black spell, you may pay {1}. If you do, you gain 1 life. SVar:TrigGainLife:AB$GainLife | Cost$ 1 | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/throne_of_bone.jpg Oracle:Whenever a player casts a black spell, you may pay {1}. If you do, you gain 1 life. diff --git a/forge-gui/res/cardsfolder/t/throne_of_empires.txt b/forge-gui/res/cardsfolder/t/throne_of_empires.txt index d2d1576f62d..24daa0f7428 100644 --- a/forge-gui/res/cardsfolder/t/throne_of_empires.txt +++ b/forge-gui/res/cardsfolder/t/throne_of_empires.txt @@ -6,7 +6,7 @@ SVar:X:Count$Compare AllM12Empires GT0.5.1 SVar:AllM12Empires:SVar$Z/Times.Y SVar:Z:Count$Valid Artifact.namedCrown of Empires+YouCtrl SVar:Y:Count$Valid Artifact.namedScepter of Empires+YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Name$Scepter of Empires|Crown of Empires SVar:Picture:http://www.wizards.com/global/images/magic/general/throne_of_empires.jpg Oracle:{1}, {T}: Create a 1/1 white Soldier creature token. Create five of those tokens instead if you control artifacts named Crown of Empires and Scepter of Empires. diff --git a/forge-gui/res/cardsfolder/t/throne_of_geth.txt b/forge-gui/res/cardsfolder/t/throne_of_geth.txt index 99f47421290..ad5594baf2d 100644 --- a/forge-gui/res/cardsfolder/t/throne_of_geth.txt +++ b/forge-gui/res/cardsfolder/t/throne_of_geth.txt @@ -5,6 +5,6 @@ A:AB$ Proliferate | Cost$ T Sac<1/Artifact> | SpellDescription$ Proliferate DeckHas:Ability$Proliferate DeckNeeds:Ability$Counters SVar:AIPreference:SacCost$Artifact.token,Artifact.cmcLE2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/throne_of_geth.jpg Oracle:{T}, Sacrifice an artifact: Proliferate. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.) diff --git a/forge-gui/res/cardsfolder/t/through_the_breach.txt b/forge-gui/res/cardsfolder/t/through_the_breach.txt index 559a5377351..c698e9963ba 100644 --- a/forge-gui/res/cardsfolder/t/through_the_breach.txt +++ b/forge-gui/res/cardsfolder/t/through_the_breach.txt @@ -6,7 +6,7 @@ A:SP$ ChangeZone | Cost$ 4 R | Origin$ Hand | Destination$ Battlefield | ChangeT SVar:DBPump:DB$ Animate | Keywords$ Haste | sVars$ ThroughtheBreachEOT | Defined$ Remembered | Permanent$ True | AtEOT$ Sacrifice | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:ThroughtheBreachEOT:SVar:EndOfTurnLeavePlay:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:PlayMain1:TRUE DeckHints:Type$Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/through_the_breach.jpg diff --git a/forge-gui/res/cardsfolder/t/throwing_knife.txt b/forge-gui/res/cardsfolder/t/throwing_knife.txt index 98e4eb539d6..2bce1316b44 100644 --- a/forge-gui/res/cardsfolder/t/throwing_knife.txt +++ b/forge-gui/res/cardsfolder/t/throwing_knife.txt @@ -5,6 +5,6 @@ K:Equip:2 S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | Description$ Equipped creature gets +2/+0. T:Mode$ Attacks | ValidCard$ Card.EquippedBy | Execute$ TrigDamage | OptionalDecider$ You | TriggerDescription$ Whenever equipped creature attacks, you may sacrifice CARDNAME. If you do, CARDNAME deals 2 damage to any target. SVar:TrigDamage:AB$ DealDamage | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/throwing_knife.jpg Oracle:Equipped creature gets +2/+0.\nWhenever equipped creature attacks, you may sacrifice Throwing Knife. If you do, Throwing Knife deals 2 damage to any target.\nEquip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/t/thrull_champion.txt b/forge-gui/res/cardsfolder/t/thrull_champion.txt index 834c9fcd109..2dfc70f9e29 100644 --- a/forge-gui/res/cardsfolder/t/thrull_champion.txt +++ b/forge-gui/res/cardsfolder/t/thrull_champion.txt @@ -4,6 +4,6 @@ Types:Creature Thrull PT:2/2 S:Mode$ Continuous | Affected$ Creature.Thrull | AddPower$ 1 | AddToughness$ 1 | Description$ Thrull creatures get +1/+1. A:AB$ GainControl | Cost$ T | ValidTgts$ Thrull | TgtPrompt$ Select target Thrull | LoseControl$ LoseControl,LeavesPlay | SpellDescription$ Gain control of target Thrull for as long as you control CARDNAME. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/thrull_champion.jpg Oracle:Thrull creatures get +1/+1.\n{T}: Gain control of target Thrull for as long as you control Thrull Champion. diff --git a/forge-gui/res/cardsfolder/t/thrull_wizard.txt b/forge-gui/res/cardsfolder/t/thrull_wizard.txt index 936b2de7a64..b56ede1ada8 100644 --- a/forge-gui/res/cardsfolder/t/thrull_wizard.txt +++ b/forge-gui/res/cardsfolder/t/thrull_wizard.txt @@ -5,7 +5,7 @@ PT:1/1 A:AB$ GenericChoice | Cost$ 1 B | TgtPrompt$ Select target black spell | TargetType$ Spell | ValidTgts$ Card.Black | TgtZone$ Stack | Choices$ PayB,Pay3 | Defined$ TargetedController | AILogic$ PayUnlessCost | SpellDescription$ Counter target black spell unless that spell's controller pays {B} or {3}. SVar:PayB:DB$ Counter | Defined$ Targeted | UnlessCost$ B | SpellDescription$ Counter spell unless you pay B SVar:Pay3:DB$ Counter | Defined$ Targeted | UnlessCost$ 3 | SpellDescription$ Counter spell unless you pay 3 -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/thrull_wizard.jpg Oracle:{1}{B}: Counter target black spell unless that spell's controller pays {B} or {3}. diff --git a/forge-gui/res/cardsfolder/t/thunder_of_hooves.txt b/forge-gui/res/cardsfolder/t/thunder_of_hooves.txt index 9a60c7d357f..2159f55a4d1 100644 --- a/forge-gui/res/cardsfolder/t/thunder_of_hooves.txt +++ b/forge-gui/res/cardsfolder/t/thunder_of_hooves.txt @@ -3,6 +3,6 @@ ManaCost:3 R Types:Sorcery A:SP$ DamageAll | Cost$ 3 R | NumDmg$ X | References$ X | ValidCards$ Creature.withoutFlying | ValidPlayers$ Player | ValidDescription$ each creature without flying and each player. | SpellDescription$ CARDNAME deals X damage to each creature without flying and each player, where X is the number of Beasts on the battlefield. SVar:X:Count$TypeOnBattlefield.Beast -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/thunder_of_hooves.jpg Oracle:Thunder of Hooves deals X damage to each creature without flying and each player, where X is the number of Beasts on the battlefield. diff --git a/forge-gui/res/cardsfolder/t/thunder_totem.txt b/forge-gui/res/cardsfolder/t/thunder_totem.txt index e383f520a33..a8aae30595f 100644 --- a/forge-gui/res/cardsfolder/t/thunder_totem.txt +++ b/forge-gui/res/cardsfolder/t/thunder_totem.txt @@ -3,7 +3,7 @@ ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ W | Amount$ 1 | SpellDescription$ Add {W}. A:AB$ Animate | Cost$ 1 W W | Defined$ Self | Power$ 2 | Toughness$ 2 | Types$ Creature,Artifact,Spirit | Colors$ White | Keywords$ Flying & First Strike | SpellDescription$ CARDNAME becomes a 2/2 white Spirit artifact creature with flying and first strike until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$white SVar:Picture:http://www.wizards.com/global/images/magic/general/thunder_totem.jpg Oracle:{T}: Add {W}.\n{1}{W}{W}: Thunder Totem becomes a 2/2 white Spirit artifact creature with flying and first strike until end of turn. diff --git a/forge-gui/res/cardsfolder/t/thundercloud_shaman.txt b/forge-gui/res/cardsfolder/t/thundercloud_shaman.txt index 02a63b3301b..5e9254448a2 100644 --- a/forge-gui/res/cardsfolder/t/thundercloud_shaman.txt +++ b/forge-gui/res/cardsfolder/t/thundercloud_shaman.txt @@ -7,6 +7,6 @@ SVar:TrigDamageAll:DB$ DamageAll | ValidCards$ Creature.nonGiant | NumDmg$ X | R SVar:X:Count$TypeYouCtrl.Giant DeckNeeds:Type$Giant SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/thundercloud_shaman.jpg Oracle:When Thundercloud Shaman enters the battlefield, it deals damage equal to the number of Giants you control to each non-Giant creature. diff --git a/forge-gui/res/cardsfolder/t/thunderfoot_baloth.txt b/forge-gui/res/cardsfolder/t/thunderfoot_baloth.txt index 959155d2b22..66ef9736a92 100644 --- a/forge-gui/res/cardsfolder/t/thunderfoot_baloth.txt +++ b/forge-gui/res/cardsfolder/t/thunderfoot_baloth.txt @@ -7,6 +7,6 @@ S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 2 | AddToughness$ 2 | Check S:Mode$ Continuous | Affected$ Creature.YouCtrl+Other | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Trample | CheckSVar$ X | SVarCompare$ GE1 SVar:X:Count$Valid Card.IsCommander+YouOwn+YouCtrl SVar:BuffedBy:Card.IsCommander -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/thunderfoot_baloth.jpg Oracle:Trample\nLieutenant — As long as you control your commander, Thunderfoot Baloth gets +2/+2 and other creatures you control get +2/+2 and have trample. diff --git a/forge-gui/res/cardsfolder/t/thunderheads.txt b/forge-gui/res/cardsfolder/t/thunderheads.txt index 7a432e38b26..3bc286c837e 100644 --- a/forge-gui/res/cardsfolder/t/thunderheads.txt +++ b/forge-gui/res/cardsfolder/t/thunderheads.txt @@ -4,6 +4,6 @@ Types:Instant K:Replicate:2 U A:SP$ Token | Cost$ 2 U | TokenName$ Weird | TokenOwner$ You | TokenPower$ 3 | TokenToughness$ 3 | TokenKeywords$ Defender<>Flying | TokenSVars$ ThunderheadsEOT | AtEOT$ Exile | TokenAmount$ 1 | TokenColors$ Blue | TokenTypes$ Creature,Weird | SpellDescription$ Create a 3/3 blue Weird creature token with defender and flying. Exile it at the beginning of the next end step. SVar:ThunderheadsEOT:SVar:EndOfTurnLeavePlay:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/thunderheads.jpg Oracle:Replicate {2}{U} (When you cast this spell, copy it for each time you paid its replicate cost.)\nCreate a 3/3 blue Weird creature token with defender and flying. Exile it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/t/thunderscape_familiar.txt b/forge-gui/res/cardsfolder/t/thunderscape_familiar.txt index 7771564a5be..5c21c2b9c2b 100644 --- a/forge-gui/res/cardsfolder/t/thunderscape_familiar.txt +++ b/forge-gui/res/cardsfolder/t/thunderscape_familiar.txt @@ -4,7 +4,7 @@ Types:Creature Kavu PT:1/1 K:First Strike S:Mode$ ReduceCost | ValidCard$ Card.Black,Card.Green | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Black spells and green spells you cast cost {1} less to cast. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Green|Black DeckHints:Color$Green|Black SVar:Picture:http://www.wizards.com/global/images/magic/general/thunderscape_familiar.jpg diff --git a/forge-gui/res/cardsfolder/t/thunderscape_master.txt b/forge-gui/res/cardsfolder/t/thunderscape_master.txt index 18be211368b..b640ab6646e 100644 --- a/forge-gui/res/cardsfolder/t/thunderscape_master.txt +++ b/forge-gui/res/cardsfolder/t/thunderscape_master.txt @@ -5,7 +5,7 @@ PT:2/2 A:AB$ LoseLife | Cost$ B B T | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 2 | SubAbility$ DBGainLife | SpellDescription$ Target player loses 2 life and you gain 2 life. A:AB$ PumpAll | Cost$ G G T | ValidCards$ Creature.YouCtrl | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Creatures you control get +2/+2 until end of turn. SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black SVar:Picture:http://www.wizards.com/global/images/magic/general/thunderscape_master.jpg Oracle:{B}{B}, {T}: Target player loses 2 life and you gain 2 life.\n{G}{G}, {T}: Creatures you control get +2/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/t/thwart.txt b/forge-gui/res/cardsfolder/t/thwart.txt index 72f2e74cfa6..bdb4cfdfdea 100644 --- a/forge-gui/res/cardsfolder/t/thwart.txt +++ b/forge-gui/res/cardsfolder/t/thwart.txt @@ -3,6 +3,6 @@ ManaCost:2 U U Types:Instant A:SP$ Counter | Cost$ 2 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SpellDescription$ Counter target spell. SVar:AltCost:Cost$ Return<3/Island> -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/thwart.jpg Oracle:You may return three Islands you control to their owner's hand rather than pay Thwart's mana cost.\nCounter target spell. diff --git a/forge-gui/res/cardsfolder/t/tidal_bore.txt b/forge-gui/res/cardsfolder/t/tidal_bore.txt index f0cd771db49..99ca8ee980a 100644 --- a/forge-gui/res/cardsfolder/t/tidal_bore.txt +++ b/forge-gui/res/cardsfolder/t/tidal_bore.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Instant A:SP$ TapOrUntap | Cost$ 1 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ You may tap or untap target creature. SVar:AltCost:Cost$ Return<1/Island> -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tidal_bore.jpg Oracle:You may return an Island you control to its owner's hand rather than pay Tidal Bore's mana cost.\nYou may tap or untap target creature. diff --git a/forge-gui/res/cardsfolder/t/tidal_control.txt b/forge-gui/res/cardsfolder/t/tidal_control.txt index d913bf3a699..0d93f51c53f 100644 --- a/forge-gui/res/cardsfolder/t/tidal_control.txt +++ b/forge-gui/res/cardsfolder/t/tidal_control.txt @@ -4,7 +4,7 @@ Types:Enchantment K:Cumulative upkeep:2 A:AB$ Counter | Cost$ 2 | TargetType$ Spell | TgtPrompt$ Select target red or green spell | ValidTgts$ Card.Green,Card.Red | AnyPlayer$ True | SpellDescription$ Counter target red or green spell. Any player may activate this ability. A:AB$ Counter | Cost$ PayLife<2> | TargetType$ Spell | TgtPrompt$ Select target red of green spell | ValidTgts$ Card.Green,Card.Red | AnyPlayer$ True | SpellDescription$ Counter target red or green spell. Any player may activate this ability. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/tidal_control.jpg Oracle:Cumulative upkeep {2} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nPay 2 life or {2}: Counter target red or green spell. Any player may activate this ability. diff --git a/forge-gui/res/cardsfolder/t/tidal_courier.txt b/forge-gui/res/cardsfolder/t/tidal_courier.txt index aaa07d59801..78840442f1c 100644 --- a/forge-gui/res/cardsfolder/t/tidal_courier.txt +++ b/forge-gui/res/cardsfolder/t/tidal_courier.txt @@ -5,6 +5,6 @@ PT:1/2 T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigDig | TriggerDescription$ When CARDNAME enters the battlefield, reveal the top four cards of your library. Put all Merfolk cards revealed this way into your hand and the rest on the bottom of your library in any order. SVar:TrigDig:DB$Dig | DigNum$ 4 | Reveal$ True | ChangeNum$ All | ChangeValid$ Merfolk A:AB$ Pump | Cost$ 3 U | Defined$ Self | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/tidal_courier.jpg Oracle:When Tidal Courier enters the battlefield, reveal the top four cards of your library. Put all Merfolk cards revealed this way into your hand and the rest on the bottom of your library in any order.\n{3}{U}: Tidal Courier gains flying until end of turn. diff --git a/forge-gui/res/cardsfolder/t/tidal_flats.txt b/forge-gui/res/cardsfolder/t/tidal_flats.txt index 0eb349fa788..17d564ab7ce 100644 --- a/forge-gui/res/cardsfolder/t/tidal_flats.txt +++ b/forge-gui/res/cardsfolder/t/tidal_flats.txt @@ -3,6 +3,6 @@ ManaCost:U Types:Enchantment A:AB$ RepeatEach | Cost$ U U | RepeatCards$ Creature.attacking+withoutFlying | RepeatSubAbility$ PumpOthers | SpellDescription$ For each attacking creature without flying, its controller may pay {1}. If they don't, creatures you control blocking that creature gain first strike until end of turn. SVar:PumpOthers:DB$PumpAll | ValidCards$ Creature.blockingRemembered+YouCtrl | KW$ First Strike | UnlessCost$ 1 | UnlessPayer$ RememberedController | ShowCurrentCard$ Remembered -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tidal_flats.jpg Oracle:{U}{U}: For each attacking creature without flying, its controller may pay {1}. If they don't, creatures you control blocking that creature gain first strike until end of turn. diff --git a/forge-gui/res/cardsfolder/t/tidal_influence.txt b/forge-gui/res/cardsfolder/t/tidal_influence.txt index 61677831ca3..94e91e5ff82 100644 --- a/forge-gui/res/cardsfolder/t/tidal_influence.txt +++ b/forge-gui/res/cardsfolder/t/tidal_influence.txt @@ -11,6 +11,6 @@ S:Mode$ Continuous | Affected$ Creature.Blue | AddPower$ +2 | CheckSVar$ TidalCo SVar:TidalCounters:Count$CardCounters.TIDE T:Mode$ Always | IsPresent$ Card.Self+counters_GE4_TIDE | TriggerZones$ Battlefield | Execute$ TrigRemove | TriggerDescription$ Whenever there are four tide counters on CARDNAME, remove all tide counters from it. SVar:TrigRemove:DB$ RemoveCounter | CounterType$ TIDE | CounterNum$ All -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/tidal_influence.jpg Oracle:Cast Tidal Influence only if no permanents named Tidal Influence are on the battlefield.\nTidal Influence enters the battlefield with a tide counter on it.\nAt the beginning of your upkeep, put a tide counter on Tidal Influence.\nAs long as there is exactly one tide counter on Tidal Influence, all blue creatures get -2/-0.\nAs long as there are exactly three tide counters on Tidal Influence, all blue creatures get +2/+0.\nWhenever there are four tide counters on Tidal Influence, remove all tide counters from it. diff --git a/forge-gui/res/cardsfolder/t/tidal_visionary.txt b/forge-gui/res/cardsfolder/t/tidal_visionary.txt index f2852a3af6c..1ebf778a1eb 100644 --- a/forge-gui/res/cardsfolder/t/tidal_visionary.txt +++ b/forge-gui/res/cardsfolder/t/tidal_visionary.txt @@ -4,6 +4,6 @@ Types:Creature Merfolk Wizard PT:1/1 A:AB$ ChooseColor | Cost$ T | Defined$ You | SubAbility$ Animate | SpellDescription$ Target creature becomes the color of your choice until end of turn. SVar:Animate:DB$ Animate | ValidTgts$ Creature | TgtPrompt$ Select target creature | Colors$ ChosenColor | OverwriteColors$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tidal_visionary.jpg Oracle:{T}: Target creature becomes the color of your choice until end of turn. diff --git a/forge-gui/res/cardsfolder/t/tidal_warrior.txt b/forge-gui/res/cardsfolder/t/tidal_warrior.txt index 319fc99a204..8fcb15b820c 100644 --- a/forge-gui/res/cardsfolder/t/tidal_warrior.txt +++ b/forge-gui/res/cardsfolder/t/tidal_warrior.txt @@ -3,6 +3,6 @@ ManaCost:U Types:Creature Merfolk Warrior PT:1/1 A:AB$ Animate | Cost$ T | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Island | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | SpellDescription$ Target land becomes an Island until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tidal_warrior.jpg Oracle:{T}: Target land becomes an Island until end of turn. diff --git a/forge-gui/res/cardsfolder/t/tidal_wave.txt b/forge-gui/res/cardsfolder/t/tidal_wave.txt index bdd925272a6..b4f43db6670 100644 --- a/forge-gui/res/cardsfolder/t/tidal_wave.txt +++ b/forge-gui/res/cardsfolder/t/tidal_wave.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Instant A:SP$ Token | Cost$ 2 U | TokenAmount$ 1 | TokenName$ Wall | TokenTypes$ Creature,Wall | TokenOwner$ You | TokenColors$ Blue | TokenPower$ 5 | TokenToughness$ 5 | TokenKeywords$ Defender | TokenSVars$ TidalWaveEOT | AtEOT$ Sacrifice | SpellDescription$ Create a 5/5 blue Wall creature token with defender. Sacrifice it at the beginning of the next end step. SVar:TidalWaveEOT:SVar:EndOfTurnLeavePlay:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tidal_wave.jpg Oracle:Create a 5/5 blue Wall creature token with defender. Sacrifice it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/t/tide_drifter.txt b/forge-gui/res/cardsfolder/t/tide_drifter.txt index c2b0d28fb6c..01a36d15a82 100644 --- a/forge-gui/res/cardsfolder/t/tide_drifter.txt +++ b/forge-gui/res/cardsfolder/t/tide_drifter.txt @@ -5,7 +5,7 @@ PT:0/5 K:Devoid S:Mode$ Continuous | Affected$ Creature.Colorless+Other+YouCtrl | AddToughness$ 1| Description$ Other colorless creatures you control get +0/+1. SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Keyword$Devoid & Color$Colorless SVar:Picture:http://www.wizards.com/global/images/magic/general/tide_drifter.jpg Oracle:Devoid (This card has no color.)\nOther colorless creatures you control get +0/+1. diff --git a/forge-gui/res/cardsfolder/t/tide_of_war.txt b/forge-gui/res/cardsfolder/t/tide_of_war.txt index f992a431a77..745abefb444 100644 --- a/forge-gui/res/cardsfolder/t/tide_of_war.txt +++ b/forge-gui/res/cardsfolder/t/tide_of_war.txt @@ -5,6 +5,6 @@ T:Mode$ BlockersDeclared | Execute$ WarFlip | TriggerZones$ Battlefield | Trigge SVar:WarFlip:DB$ FlipACoin | Caller$ You | WinSubAbility$ SacBlockers | LoseSubAbility$ SacAttackers SVar:SacBlockers:DB$ SacrificeAll | Defined$ TriggeredBlockers SVar:SacAttackers:DB$ SacrificeAll | Defined$ TriggeredAttackers -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/tide_of_war.jpg Oracle:Whenever one or more creatures block, flip a coin. If you win the flip, each blocking creature is sacrificed by its controller. If you lose the flip, each blocked creature is sacrificed by its controller. diff --git a/forge-gui/res/cardsfolder/t/tideforce_elemental.txt b/forge-gui/res/cardsfolder/t/tideforce_elemental.txt index 7dea866fd2b..20f5ac44c68 100644 --- a/forge-gui/res/cardsfolder/t/tideforce_elemental.txt +++ b/forge-gui/res/cardsfolder/t/tideforce_elemental.txt @@ -5,6 +5,6 @@ PT:2/1 A:AB$ TapOrUntap | Cost$ U T | ValidTgts$ Creature.Other | TgtPrompt$ Select another target creature | SpellDescription$ You may tap or untap another target creature. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | OptionalDecider$ You | TriggerZones$ Battlefield | Execute$ TrigUntap | TriggerDescription$ Landfall — Whenever a land enters the battlefield under your control, you may untap CARDNAME. SVar:TrigUntap:DB$Untap | Defined$ Self -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/Tideforce_Elemental.jpg Oracle:{U}, {T}: You may tap or untap another target creature.\nLandfall — Whenever a land enters the battlefield under your control, you may untap Tideforce Elemental. diff --git a/forge-gui/res/cardsfolder/t/tideshaper_mystic.txt b/forge-gui/res/cardsfolder/t/tideshaper_mystic.txt index 0329908b82d..06650eb6edb 100644 --- a/forge-gui/res/cardsfolder/t/tideshaper_mystic.txt +++ b/forge-gui/res/cardsfolder/t/tideshaper_mystic.txt @@ -4,6 +4,6 @@ Types:Creature Merfolk Wizard PT:1/1 A:AB$ ChooseType | Cost$ T | Defined$ You | Type$ Basic Land | PlayerTurn$ True | SubAbility$ DBAnimate | SpellDescription$ Target land becomes the basic land type of your choice until end of turn. Activate this ability only during your turn. SVar:DBAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tideshaper_mystic.jpg Oracle:{T}: Target land becomes the basic land type of your choice until end of turn. Activate this ability only during your turn. diff --git a/forge-gui/res/cardsfolder/t/tidewater_minion.txt b/forge-gui/res/cardsfolder/t/tidewater_minion.txt index a584e1515c2..4f12cce04e9 100644 --- a/forge-gui/res/cardsfolder/t/tidewater_minion.txt +++ b/forge-gui/res/cardsfolder/t/tidewater_minion.txt @@ -5,6 +5,6 @@ PT:4/4 K:Defender A:AB$ Debuff | Cost$ 4 | Keywords$ Defender | Defined$ Self | SpellDescription$ CARDNAME loses defender until end of turn. A:AB$ Untap | Cost$ T | ValidTgts$ Permanent | TgtPrompt$ Select target permanent| SpellDescription$ Untap target permanent. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tidewater_minion.jpg Oracle:Defender (This creature can't attack.)\n{4}: Tidewater Minion loses defender until end of turn.\n{T}: Untap target permanent. diff --git a/forge-gui/res/cardsfolder/t/tigereye_cameo.txt b/forge-gui/res/cardsfolder/t/tigereye_cameo.txt index 709ba271db2..432ea400309 100644 --- a/forge-gui/res/cardsfolder/t/tigereye_cameo.txt +++ b/forge-gui/res/cardsfolder/t/tigereye_cameo.txt @@ -3,7 +3,7 @@ ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Green|White SVar:Picture:http://www.wizards.com/global/images/magic/general/tigereye_cameo.jpg Oracle:{T}: Add {G} or {W}. diff --git a/forge-gui/res/cardsfolder/t/timber_wolves.txt b/forge-gui/res/cardsfolder/t/timber_wolves.txt index e2255f0bca1..53b722cefa5 100644 --- a/forge-gui/res/cardsfolder/t/timber_wolves.txt +++ b/forge-gui/res/cardsfolder/t/timber_wolves.txt @@ -3,6 +3,6 @@ ManaCost:G Types:Creature Wolf PT:1/1 K:Banding -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/timber_wolves.jpg Oracle:Banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/t/time_and_tide.txt b/forge-gui/res/cardsfolder/t/time_and_tide.txt index a685f66a209..0de709ebd0c 100644 --- a/forge-gui/res/cardsfolder/t/time_and_tide.txt +++ b/forge-gui/res/cardsfolder/t/time_and_tide.txt @@ -2,6 +2,6 @@ Name:Time and Tide ManaCost:U U Types:Instant A:SP$ Phases | Cost$ U U | AllValid$ Creature | PhaseInOrOutAll$ True | SpellDescription$ Simultaneously, all phased-out creatures phase in and all creatures with phasing phase out. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/time_and_tide.jpg Oracle:Simultaneously, all phased-out creatures phase in and all creatures with phasing phase out. diff --git a/forge-gui/res/cardsfolder/t/time_elemental.txt b/forge-gui/res/cardsfolder/t/time_elemental.txt index 521cd4a9562..bb00aaca78a 100644 --- a/forge-gui/res/cardsfolder/t/time_elemental.txt +++ b/forge-gui/res/cardsfolder/t/time_elemental.txt @@ -8,6 +8,6 @@ T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ DelayedTrig | Secondary$ True | SVar:DelayedTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigSac | TriggerDescription$ At end of combat, sacrifice CARDNAME and CARDNAME deals 5 damage to you. SVar:TrigSac:DB$Sacrifice | Defined$ Self | SubAbility$ DBDamage SVar:DBDamage:DB$DealDamage | NumDmg$ 5 | Defined$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/time_elemental.jpg Oracle:When Time Elemental attacks or blocks, at end of combat, sacrifice it and it deals 5 damage to you.\n{2}{U}{U}, {T}: Return target permanent that isn't enchanted to its owner's hand. diff --git a/forge-gui/res/cardsfolder/t/time_of_need.txt b/forge-gui/res/cardsfolder/t/time_of_need.txt index 69179e367a8..c47f4545f1f 100644 --- a/forge-gui/res/cardsfolder/t/time_of_need.txt +++ b/forge-gui/res/cardsfolder/t/time_of_need.txt @@ -2,7 +2,7 @@ Name:Time of Need ManaCost:1 G Types:Sorcery A:SP$ ChangeZone | Cost$ 1 G | Origin$ Library | Destination$ Hand | ChangeType$ Creature.Legendary | ChangeNum$ 1 | SpellDescription$ Search your library for a legendary creature card, reveal it, put it into your hand, then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Legendary SVar:Picture:http://www.wizards.com/global/images/magic/general/time_of_need.jpg Oracle:Search your library for a legendary creature card, reveal it, put it into your hand, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/t/time_sieve.txt b/forge-gui/res/cardsfolder/t/time_sieve.txt index 948ba16dc07..b5c4af95a04 100644 --- a/forge-gui/res/cardsfolder/t/time_sieve.txt +++ b/forge-gui/res/cardsfolder/t/time_sieve.txt @@ -2,6 +2,6 @@ Name:Time Sieve ManaCost:U B Types:Artifact A:AB$ AddTurn | Cost$ T Sac<5/Artifact> | NumTurns$ 1 | SpellDescription$ Take an extra turn after this one. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/time_sieve.jpg Oracle:{T}, Sacrifice five artifacts: Take an extra turn after this one. diff --git a/forge-gui/res/cardsfolder/t/time_stop.txt b/forge-gui/res/cardsfolder/t/time_stop.txt index d78c2fda650..90e9babaaeb 100644 --- a/forge-gui/res/cardsfolder/t/time_stop.txt +++ b/forge-gui/res/cardsfolder/t/time_stop.txt @@ -2,6 +2,6 @@ Name:Time Stop ManaCost:4 U U Types:Instant A:SP$EndTurn | Cost$ 4 U U | SpellDescription$ End the turn. (Exile all spells and abilities on the stack, including this card. The player whose turn it is discards down to their maximum hand size. Damage wears off, and "this turn" and "until end of turn" effects end.) -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/time_stop.jpg Oracle:End the turn. (Exile all spells and abilities on the stack, including this card. The player whose turn it is discards down to their maximum hand size. Damage wears off, and "this turn" and "until end of turn" effects end.) diff --git a/forge-gui/res/cardsfolder/t/time_vault.txt b/forge-gui/res/cardsfolder/t/time_vault.txt index e7bcdc14a97..30e898d2bfc 100644 --- a/forge-gui/res/cardsfolder/t/time_vault.txt +++ b/forge-gui/res/cardsfolder/t/time_vault.txt @@ -6,6 +6,6 @@ K:CARDNAME doesn't untap during your untap step. K:CARDNAME enters the battlefield tapped. A:AB$ AddTurn | Cost$ T | NumTurns$ 1 | SpellDescription$ Take an extra turn after this one. SVar:PlayMain1:ALWAYS -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/time_vault.jpg Oracle:Time Vault enters the battlefield tapped.\nTime Vault doesn't untap during your untap step.\nIf you would begin your turn while Time Vault is tapped, you may skip that turn instead. If you do, untap Time Vault.\n{T}: Take an extra turn after this one. diff --git a/forge-gui/res/cardsfolder/t/timebender.txt b/forge-gui/res/cardsfolder/t/timebender.txt index 95b331b15e5..060c855cebe 100644 --- a/forge-gui/res/cardsfolder/t/timebender.txt +++ b/forge-gui/res/cardsfolder/t/timebender.txt @@ -7,6 +7,6 @@ T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigChoose | TriggerZones$ SVar:TrigChoose:DB$ Charm | CharmNum$ 1 | Choices$ LoseTime,GainTime SVar:LoseTime:DB$ RemoveCounter | ValidTgts$ Permanent.inZoneBattlefield,Card.suspended | AITgts$ Permanent.counters_GE1_TIME+inZoneBattlefield+YouDontCtrl,Card.suspended+YouCtrl | TgtPrompt$ Select target permanent or suspended card. | CounterType$ TIME | CounterNum$ 2 | TgtZone$ Battlefield,Exile | SpellDescription$ Remove two time counters from target permanent or suspended card. SVar:GainTime:DB$ PutCounter | ValidTgts$ Permanent.counters_GE1_TIME+inZoneBattlefield,Card.suspended | AITgts$ Permanent.counters_GE1_TIME+inZoneBattlefield+YouCtrl,Card.suspended+YouDontCtrl | TgtPrompt$ Select target permanent with a time counter on it or suspended card. | CounterType$ TIME | CounterNum$ 2 | TgtZone$ Battlefield,Exile | SpellDescription$ Put two time counters target permanent with a time counter on it or suspended card. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/timebender.jpg Oracle:Morph {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.)\nWhen Timebender is turned face up, choose one —\n• Remove two time counters from target permanent or suspended card.\n• Put two time counters on target permanent with a time counter on it or suspended card. diff --git a/forge-gui/res/cardsfolder/t/timecrafting.txt b/forge-gui/res/cardsfolder/t/timecrafting.txt index fc11c8ea7b8..db6e7f576bb 100644 --- a/forge-gui/res/cardsfolder/t/timecrafting.txt +++ b/forge-gui/res/cardsfolder/t/timecrafting.txt @@ -5,7 +5,7 @@ A:SP$ Charm | Cost$ X R | CharmNum$ 1 | Choices$ LoseTime,GainTime | References$ SVar:LoseTime:DB$ RemoveCounter | ValidTgts$ Permanent.inZoneBattlefield,Card.suspended | AITgts$ Permanent.counters_GE1_TIME+inZoneBattlefield+YouDontCtrl,Card.suspended+YouCtrl | TgtPrompt$ Select target permanent or suspended card. | CounterType$ TIME | CounterNum$ X | References$ X | TgtZone$ Battlefield,Exile | SpellDescription$ Remove X time counters from target permanent or suspended card. SVar:GainTime:DB$ PutCounter | ValidTgts$ Permanent.counters_GE1_TIME+inZoneBattlefield,Card.suspended | AITgts$ Permanent.counters_GE1_TIME+inZoneBattlefield+YouCtrl,Card.suspended+YouDontCtrl | TgtPrompt$ Select target permanent with a time counter on it or suspended card. | CounterType$ TIME | CounterNum$ X | References$ X | TgtZone$ Battlefield,Exile | SpellDescription$ Put X time counters target permanent with a time counter on it or suspended card. SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/timecrafting.jpg Oracle:Choose one —\n• Remove X time counters from target permanent or suspended card.\n• Put X time counters on target permanent with a time counter on it or suspended card. diff --git a/forge-gui/res/cardsfolder/t/timesifter.txt b/forge-gui/res/cardsfolder/t/timesifter.txt index e88d0281918..552a833fb73 100644 --- a/forge-gui/res/cardsfolder/t/timesifter.txt +++ b/forge-gui/res/cardsfolder/t/timesifter.txt @@ -12,6 +12,6 @@ SVar:FindHighestCMC:DB$ Pump | ImprintCards$ ValidAll Card.greatestRememberedCMC SVar:X:Count$ValidExile Card.IsImprinted SVar:DBAddTurn:DB$ AddTurn | Defined$ ImprintedController | NumTurns$ 1 | ShowMessage$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/timesifter.jpg Oracle:At the beginning of each upkeep, each player exiles the top card of their library. The player who exiled the card with the highest converted mana cost takes an extra turn after this one. If two or more players' cards are tied for highest cost, the tied players repeat this process until the tie is broken. diff --git a/forge-gui/res/cardsfolder/t/timid_drake.txt b/forge-gui/res/cardsfolder/t/timid_drake.txt index 8af69e9f3b5..cd5fdcb1a86 100644 --- a/forge-gui/res/cardsfolder/t/timid_drake.txt +++ b/forge-gui/res/cardsfolder/t/timid_drake.txt @@ -6,6 +6,6 @@ K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other | TriggerZones$ Battlefield | Execute$ TrigReturn | TriggerDescription$ When another creature enters the battlefield, return CARDNAME to its owner's hand. SVar:TrigReturn:DB$ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Hand SVar:AntiBuffedBy:Creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/timid_drake.jpg Oracle:Flying\nWhen another creature enters the battlefield, return Timid Drake to its owner's hand. diff --git a/forge-gui/res/cardsfolder/t/tin_street_hooligan.txt b/forge-gui/res/cardsfolder/t/tin_street_hooligan.txt index 174bc2dc82b..3f5a96313c6 100644 --- a/forge-gui/res/cardsfolder/t/tin_street_hooligan.txt +++ b/forge-gui/res/cardsfolder/t/tin_street_hooligan.txt @@ -5,7 +5,7 @@ PT:2/1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | ManaSpent$ G | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, if {G} was spent to cast CARDNAME, destroy target artifact. SVar:TrigDestroy:DB$Destroy | ValidTgts$ Artifact | TgtPrompt$ Select target artifact. SVar:ManaNeededToAvoidNegativeEffect:green -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Green SVar:Picture:http://www.wizards.com/global/images/magic/general/tin_street_hooligan.jpg Oracle:When Tin Street Hooligan enters the battlefield, if {G} was spent to cast Tin Street Hooligan, destroy target artifact. diff --git a/forge-gui/res/cardsfolder/t/tin_street_market.txt b/forge-gui/res/cardsfolder/t/tin_street_market.txt index 722ccd5d763..645342afbe7 100644 --- a/forge-gui/res/cardsfolder/t/tin_street_market.txt +++ b/forge-gui/res/cardsfolder/t/tin_street_market.txt @@ -6,6 +6,6 @@ A:SP$ Attach | Cost$ 4 R | ValidTgts$ Land | AILogic$ Pump S:Mode$ Continuous | Affected$ Card.EnchantedBy | AddAbility$ UCDraw | Description$ Enchanted land has "{T}, Discard a card: Draw a card." SVar:UCDraw:AB$ Draw | Cost$ T Discard<1/Card> | NumCards$ 1 | SpellDescription$ Draw a card. SVar:NonStackingAttachEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tin_street_market.jpg Oracle:Enchant land\nEnchanted land has "{T}, Discard a card: Draw a card." diff --git a/forge-gui/res/cardsfolder/t/tin_wing_chimera.txt b/forge-gui/res/cardsfolder/t/tin_wing_chimera.txt index a39572a8e8d..b2d13622672 100644 --- a/forge-gui/res/cardsfolder/t/tin_wing_chimera.txt +++ b/forge-gui/res/cardsfolder/t/tin_wing_chimera.txt @@ -5,6 +5,6 @@ PT:2/2 K:Flying A:AB$ PutCounter | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.Chimera | TgtPrompt$ Select target Chimera creature | CounterType$ P2P2 | CounterNum$ 1 | SubAbility$ DBPump | SpellDescription$ Put a +2/+2 counter on target Chimera creature. It gains flying. (This effect lasts indefinitely.) SVar:DBPump:DB$Pump | KW$ Flying | Defined$ Targeted | Permanent$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tin_wing_chimera.jpg Oracle:Flying\nSacrifice Tin-Wing Chimera: Put a +2/+2 counter on target Chimera creature. It gains flying. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/t/tinder_farm.txt b/forge-gui/res/cardsfolder/t/tinder_farm.txt index 61d64174eec..afc8e9954c8 100644 --- a/forge-gui/res/cardsfolder/t/tinder_farm.txt +++ b/forge-gui/res/cardsfolder/t/tinder_farm.txt @@ -4,6 +4,6 @@ Types:Land K:CARDNAME enters the battlefield tapped. A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. A:AB$ Mana | Cost$T Sac<1/CARDNAME> | Produced$ R W | SpellDescription$ Add {R}{W}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tinder_farm.jpg Oracle:Tinder Farm enters the battlefield tapped.\n{T}: Add {G}.\n{T}, Sacrifice Tinder Farm: Add {R}{W}. diff --git a/forge-gui/res/cardsfolder/t/tinder_wall.txt b/forge-gui/res/cardsfolder/t/tinder_wall.txt index b71a1d86d59..02eb325d739 100644 --- a/forge-gui/res/cardsfolder/t/tinder_wall.txt +++ b/forge-gui/res/cardsfolder/t/tinder_wall.txt @@ -5,6 +5,6 @@ PT:0/3 K:Defender A:AB$ Mana | Cost$ Sac<1/CARDNAME> | Produced$ R | Amount$ 2 | SpellDescription$ Add {R}{R}. A:AB$ DealDamage | Cost$ R Sac<1/CARDNAME> | ValidTgts$ Creature.blockedBySource | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature it's blocking. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tinder_wall.jpg Oracle:Defender (This creature can't attack.)\nSacrifice Tinder Wall: Add {R}{R}.\n{R}, Sacrifice Tinder Wall: Tinder Wall deals 2 damage to target creature it's blocking. diff --git a/forge-gui/res/cardsfolder/t/tinker.txt b/forge-gui/res/cardsfolder/t/tinker.txt index 1fbea5ad17d..d7b0a64898f 100644 --- a/forge-gui/res/cardsfolder/t/tinker.txt +++ b/forge-gui/res/cardsfolder/t/tinker.txt @@ -2,7 +2,7 @@ Name:Tinker ManaCost:2 U Types:Sorcery A:SP$ ChangeZone | Cost$ 2 U Sac<1/Artifact> | Origin$ Library | Destination$ Battlefield | ChangeType$ Artifact | ChangeNum$ 1 | SpellDescription$ Search your library for an artifact card and put that card onto the battlefield. Then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:AIPreference:SacCost$Artifact.token,Artifact.cmcEQ0+nonLegendary+notnamedMox Pearl+notnamedMox Sapphire+notnamedMox Ruby+notnamedMox Emerald+notnamedMox Jet+notnamedBlack Lotus+notnamedLotus Petal,Artifact.cmcEQ1,Artifact.cmcEQ2,Artifact.cmcEQ3 SVar:Picture:http://www.wizards.com/global/images/magic/general/tinker.jpg Oracle:As an additional cost to cast Tinker, sacrifice an artifact.\nSearch your library for an artifact card and put that card onto the battlefield. Then shuffle your library. diff --git a/forge-gui/res/cardsfolder/t/titanias_song.txt b/forge-gui/res/cardsfolder/t/titanias_song.txt index 333536db114..73bdbd4da82 100644 --- a/forge-gui/res/cardsfolder/t/titanias_song.txt +++ b/forge-gui/res/cardsfolder/t/titanias_song.txt @@ -8,6 +8,6 @@ SVar:KWAnimateAll:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlef SVar:AffectedX:Count$CardManaCost SVar:NonStackingEffect:True SVar:PlayMain1:ALWAYS -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/titanias_song.jpg Oracle:Each noncreature artifact loses all abilities and becomes an artifact creature with power and toughness each equal to its converted mana cost. If Titania's Song leaves the battlefield, this effect continues until end of turn. diff --git a/forge-gui/res/cardsfolder/t/titans_presence.txt b/forge-gui/res/cardsfolder/t/titans_presence.txt index 55c3ce81b9f..d6bcc17ca32 100644 --- a/forge-gui/res/cardsfolder/t/titans_presence.txt +++ b/forge-gui/res/cardsfolder/t/titans_presence.txt @@ -4,7 +4,7 @@ Types:Instant A:SP$ ChangeZone | Cost$ 3 Reveal<1/Creature.Colorless> | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Exile | ConditionCheckSVar$ X | ConditionSVarCompare$ LEY | References$ X,Y | SpellDescription$ Exile target creature if its power is less than or equal to the revealed card's power. SVar:Y:Revealed$CardPower SVar:X:Targeted$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHints:Color$Colorless & Keyword$Devoid SVar:Picture:http://www.wizards.com/global/images/magic/general/titans_presence.jpg Oracle:As an additional cost to cast Titan's Presence, reveal a colorless creature card from your hand.\nExile target creature if its power is less than or equal to the revealed card's power. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/t/tivadars_crusade.txt b/forge-gui/res/cardsfolder/t/tivadars_crusade.txt index 48b1e0f957f..f72b549b786 100644 --- a/forge-gui/res/cardsfolder/t/tivadars_crusade.txt +++ b/forge-gui/res/cardsfolder/t/tivadars_crusade.txt @@ -2,6 +2,6 @@ Name:Tivadar's Crusade ManaCost:1 W W Types:Sorcery A:SP$ DestroyAll | Cost$ 1 W W | ValidCards$ Goblin | SpellDescription$ Destroy all Goblins. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/tivadars_crusade.jpg Oracle:Destroy all Goblins. diff --git a/forge-gui/res/cardsfolder/t/toils_of_night_and_day.txt b/forge-gui/res/cardsfolder/t/toils_of_night_and_day.txt index c992c0e19da..239e7d1f2b7 100644 --- a/forge-gui/res/cardsfolder/t/toils_of_night_and_day.txt +++ b/forge-gui/res/cardsfolder/t/toils_of_night_and_day.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Instant Arcane A:SP$ TapOrUntap | Cost$ 2 U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | SubAbility$ DBTapOrUntap | SpellDescription$ You may tap or untap target permanent, then you may tap or untap another target permanent. SVar:DBTapOrUntap:DB$TapOrUntap | ValidTgts$ Permanent | TgtPrompt$ Select target permanent (2) | TargetUnique$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/toils_of_night_and_day.jpg Oracle:You may tap or untap target permanent, then you may tap or untap another target permanent. diff --git a/forge-gui/res/cardsfolder/t/tolaria.txt b/forge-gui/res/cardsfolder/t/tolaria.txt index c8ae2ba38aa..0741df663db 100644 --- a/forge-gui/res/cardsfolder/t/tolaria.txt +++ b/forge-gui/res/cardsfolder/t/tolaria.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Legendary Land A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Debuff | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | Keywords$ Banding & Bands with Other Creatures named Wolves of the Hunt & Bands with Other Legendary Creatures | ActivationPhases$ Upkeep | SpellDescription$ Target creature loses banding and all "bands with other" abilities until end of turn. Activate this ability only during any upkeep step. | StackDescription$ SpellDescription -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tolaria.jpg Oracle:{T}: Add {U}.\n{T}: Target creature loses banding and all "bands with other" abilities until end of turn. Activate this ability only during any upkeep step. diff --git a/forge-gui/res/cardsfolder/t/tolaria_west.txt b/forge-gui/res/cardsfolder/t/tolaria_west.txt index ef3400d8718..b4b72f8ba37 100644 --- a/forge-gui/res/cardsfolder/t/tolaria_west.txt +++ b/forge-gui/res/cardsfolder/t/tolaria_west.txt @@ -4,6 +4,6 @@ Types:Land K:CARDNAME enters the battlefield tapped. A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. K:Transmute:1 U U -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tolaria_west.jpg Oracle:Tolaria West enters the battlefield tapped.\n{T}: Add {U}.\nTransmute {1}{U}{U} ({1}{U}{U}, Discard this card: Search your library for a card with converted mana cost 0, reveal it, put it into your hand, then shuffle your library. Transmute only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/t/tolarian_academy.txt b/forge-gui/res/cardsfolder/t/tolarian_academy.txt index d24c2373326..3a3ec3fca01 100644 --- a/forge-gui/res/cardsfolder/t/tolarian_academy.txt +++ b/forge-gui/res/cardsfolder/t/tolarian_academy.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Legendary Land A:AB$ Mana | Cost$ T | Produced$ U | Amount$ X | References$ X | SpellDescription$ Add {U} for each artifact you control. SVar:X:Count$Valid Artifact.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/tolarian_academy.jpg Oracle:{T}: Add {U} for each artifact you control. diff --git a/forge-gui/res/cardsfolder/t/tolarian_winds.txt b/forge-gui/res/cardsfolder/t/tolarian_winds.txt index db1aeba0d12..8c4ee97aa81 100644 --- a/forge-gui/res/cardsfolder/t/tolarian_winds.txt +++ b/forge-gui/res/cardsfolder/t/tolarian_winds.txt @@ -5,6 +5,6 @@ A:SP$ Discard | Cost$ 1 U | Defined$ You | RememberDiscarded$ True | Mode$ Hand SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ X | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tolarian_winds.jpg Oracle:Discard all the cards in your hand, then draw that many cards. diff --git a/forge-gui/res/cardsfolder/t/tomb_of_urami.txt b/forge-gui/res/cardsfolder/t/tomb_of_urami.txt index 87817129b86..dbd555573f0 100644 --- a/forge-gui/res/cardsfolder/t/tomb_of_urami.txt +++ b/forge-gui/res/cardsfolder/t/tomb_of_urami.txt @@ -4,6 +4,6 @@ Types:Legendary Land A:AB$ Mana | Cost$ T | Produced$ B | SubAbility$ DBPain | SpellDescription$ Add {B}. CARDNAME deals 1 damage to you if you don't control an Ogre. SVar:DBPain:DB$DealDamage | NumDmg$ 1 | Defined$ You | ConditionPresent$ Ogre.YouCtrl | ConditionCompare$ EQ0 A:AB$ Token | Cost$ 2 B B T Sac | TokenAmount$ 1 | TokenController$ You | TokenName$ Urami | TokenTypes$ Legendary,Creature,Demon,Spirit | TokenColors$ Black | TokenPower$ 5 | TokenToughness$ 5 | TokenKeywords$ Flying | CostDesc$ {2}{B}{B}, {T}, Sacrifice all lands you control: | SpellDescription$ Create a legendary 5/5 black Demon Spirit creature token with flying named Urami. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tomb_of_urami.jpg Oracle:{T}: Add {B}. Tomb of Urami deals 1 damage to you if you don't control an Ogre.\n{2}{B}{B}, {T}, Sacrifice all lands you control: Create a legendary 5/5 black Demon Spirit creature token with flying named Urami. diff --git a/forge-gui/res/cardsfolder/t/tomb_robber.txt b/forge-gui/res/cardsfolder/t/tomb_robber.txt index 8a8bb732bce..30c0a49a432 100644 --- a/forge-gui/res/cardsfolder/t/tomb_robber.txt +++ b/forge-gui/res/cardsfolder/t/tomb_robber.txt @@ -5,6 +5,6 @@ PT:1/1 K:Menace A:AB$ Explore | Cost$ 1 Discard<1/Card> | SpellDescription$ CARDNAME explores. (Reveal the top card of your library. Put that card into your hand if it's a land. Otherwise, put a +1/+1 counter on this creature, then put the card back or put it into your graveyard.) DeckHas:Ability$Counters -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tomb_robber.jpg Oracle:Menace\n{1}, Discard a card: Tomb Robber explores. (Reveal the top card of your library. Put that card into your hand if it's a land. Otherwise, put a +1/+1 counter on this creature, then put the card back or put it into your graveyard.) \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/t/tombfire.txt b/forge-gui/res/cardsfolder/t/tombfire.txt index ca44e6461e1..1c7a77ae803 100644 --- a/forge-gui/res/cardsfolder/t/tombfire.txt +++ b/forge-gui/res/cardsfolder/t/tombfire.txt @@ -2,6 +2,6 @@ Name:Tombfire ManaCost:B Types:Sorcery A:SP$ ChangeZoneAll | Cost$ B | ValidTgts$ Player | TgtPrompt$ Select target player | Origin$ Graveyard | Destination$ Exile | ChangeType$ Card.withFlashback | SpellDescription$ Target player exiles all cards with flashback from their graveyard. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/tombfire.jpg Oracle:Target player exiles all cards with flashback from their graveyard. diff --git a/forge-gui/res/cardsfolder/t/tombstone_stairwell.txt b/forge-gui/res/cardsfolder/t/tombstone_stairwell.txt index a6ca76695ef..ff355418154 100644 --- a/forge-gui/res/cardsfolder/t/tombstone_stairwell.txt +++ b/forge-gui/res/cardsfolder/t/tombstone_stairwell.txt @@ -10,6 +10,6 @@ T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ Player | TriggerZones$ Battlef T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Any | Execute$ DestroyRemembered | Secondary$ True | TriggerController$ TriggeredCardController | TriggerDescription$ At the beginning of each end step or when CARDNAME leaves the battlefield, destroy all tokens created with CARDNAME. They can't be regenerated. SVar:DestroyRemembered:DB$ DestroyAll | ValidCards$ Card.IsRemembered | NoRegen$ True | SubAbility$ DBCleanUp SVar:DBCleanUp:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/tombstone_stairwell.jpg Oracle:Cumulative upkeep {1}{B} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nAt the beginning of each upkeep, if Tombstone Stairwell is on the battlefield, each player creates a 2/2 black Zombie creature token with haste named Tombspawn for each creature card in their graveyard.\nAt the beginning of each end step or when Tombstone Stairwell leaves the battlefield, destroy all tokens created with Tombstone Stairwell. They can't be regenerated. diff --git a/forge-gui/res/cardsfolder/t/tomorrow_azamis_familiar.txt b/forge-gui/res/cardsfolder/t/tomorrow_azamis_familiar.txt index a6fe4dc1a5a..8b7767d5071 100644 --- a/forge-gui/res/cardsfolder/t/tomorrow_azamis_familiar.txt +++ b/forge-gui/res/cardsfolder/t/tomorrow_azamis_familiar.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Spirit PT:1/5 R:Event$ Draw | ActiveZones$ Battlefield | ValidPlayer$ You | ReplaceWith$ Dig | Description$ If you would draw a card, look at the top three cards of your library instead. Put one of those cards into your hand and the rest on the bottom of your library in any order. SVar:Dig:DB$Dig | DigNum$ 3 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tomorrow_azamis_familiar.jpg Oracle:If you would draw a card, look at the top three cards of your library instead. Put one of those cards into your hand and the rest on the bottom of your library in any order. diff --git a/forge-gui/res/cardsfolder/t/tooth_and_claw.txt b/forge-gui/res/cardsfolder/t/tooth_and_claw.txt index cfa1e837d63..0513f753b48 100644 --- a/forge-gui/res/cardsfolder/t/tooth_and_claw.txt +++ b/forge-gui/res/cardsfolder/t/tooth_and_claw.txt @@ -2,6 +2,6 @@ Name:Tooth and Claw ManaCost:3 R Types:Enchantment A:AB$ Token | Cost$ Sac<2/Creature> | TokenAmount$ 1 | TokenName$ Carnivore | TokenTypes$ Creature,Beast | TokenOwner$ You | TokenColors$ Red | TokenPower$ 3 | TokenToughness$ 1 | SpellDescription$ Create a 3/1 red Beast creature token named Carnivore. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/tooth_and_claw.jpg Oracle:Sacrifice two creatures: Create a 3/1 red Beast creature token named Carnivore. diff --git a/forge-gui/res/cardsfolder/t/tooth_of_ramos.txt b/forge-gui/res/cardsfolder/t/tooth_of_ramos.txt index 0c96d943536..23eafb5f867 100644 --- a/forge-gui/res/cardsfolder/t/tooth_of_ramos.txt +++ b/forge-gui/res/cardsfolder/t/tooth_of_ramos.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. A:AB$ Mana | Cost$ Sac<1/CARDNAME> | Produced$ W | SpellDescription$ Add {W}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tooth_of_ramos.jpg Oracle:{T}: Add {W}.\nSacrifice Tooth of Ramos: Add {W}. diff --git a/forge-gui/res/cardsfolder/t/torchling.txt b/forge-gui/res/cardsfolder/t/torchling.txt index a4110b2d3d5..3ad01a50b9f 100644 --- a/forge-gui/res/cardsfolder/t/torchling.txt +++ b/forge-gui/res/cardsfolder/t/torchling.txt @@ -7,6 +7,6 @@ A:AB$ MustBlock | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creat A:AB$ ChangeTargets | Cost$ R | TargetType$ Spell | ValidTgts$ Card | TargetsSingleTarget$ True | TargetValidTargeting$ Card.Self | SpellDescription$ Change the target of target spell that targets only CARDNAME. A:AB$ Pump | Cost$ 1 | NumAtt$ +1 | NumDef$ -1 | SpellDescription$ CARDNAME gets +1/-1 until end of turn. A:AB$ Pump | Cost$ 1 | NumAtt$ -1 | NumDef$ +1 | SpellDescription$ CARDNAME gets -1/+1 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/torchling.jpg Oracle:{R}: Untap Torchling.\n{R}: Target creature blocks Torchling this turn if able.\n{R}: Change the target of target spell that targets only Torchling.\n{1}: Torchling gets +1/-1 until end of turn.\n{1}: Torchling gets -1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/t/tormods_crypt.txt b/forge-gui/res/cardsfolder/t/tormods_crypt.txt index 6b204a2dcb8..9e97ad829b6 100644 --- a/forge-gui/res/cardsfolder/t/tormods_crypt.txt +++ b/forge-gui/res/cardsfolder/t/tormods_crypt.txt @@ -2,6 +2,6 @@ Name:Tormod's Crypt ManaCost:0 Types:Artifact A:AB$ ChangeZoneAll | Cost$ T Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Player | TgtPrompt$ Select target player | ChangeType$ Card | Shuffle$ True | SpellDescription$ Exile all cards from target player's graveyard. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/tormods_crypt.jpg Oracle:{T}, Sacrifice Tormod's Crypt: Exile all cards from target player's graveyard. diff --git a/forge-gui/res/cardsfolder/t/tornado.txt b/forge-gui/res/cardsfolder/t/tornado.txt index 19f6dacf22a..f3cd4a9ee91 100644 --- a/forge-gui/res/cardsfolder/t/tornado.txt +++ b/forge-gui/res/cardsfolder/t/tornado.txt @@ -5,6 +5,6 @@ K:Cumulative upkeep:G A:AB$ Destroy | Cost$ 2 G PayLife | References$ X | CostDesc$ {2}{G}, Pay 3 life for each velocity counter on Tornado: | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | SubAbility$ Velocity | ActivationLimit$ 1 | SpellDescription$ Destroy target permanent and put a velocity counter on CARDNAME. Activate this ability only once each turn. SVar:Velocity:DB$ PutCounter | Defined$ Self | CounterType$ VELOCITY | CounterNum$ 1 SVar:X:Count$CardCounters.VELOCITY/Times.3 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tornado.jpg Oracle:Cumulative upkeep {G} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\n{2}{G}, Pay 3 life for each velocity counter on Tornado: Destroy target permanent and put a velocity counter on Tornado. Activate this ability only once each turn. diff --git a/forge-gui/res/cardsfolder/t/torpid_moloch.txt b/forge-gui/res/cardsfolder/t/torpid_moloch.txt index 702de583aab..e4328680fc6 100644 --- a/forge-gui/res/cardsfolder/t/torpid_moloch.txt +++ b/forge-gui/res/cardsfolder/t/torpid_moloch.txt @@ -4,6 +4,6 @@ Types:Creature Lizard PT:3/2 K:Defender A:AB$ Debuff | Cost$ Sac<3/Land> | Keywords$ Defender | SpellDescription$ CARDNAME loses defender until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/torpid_moloch.jpg Oracle:Defender (This creature can't attack.)\nSacrifice three lands: Torpid Moloch loses defender until end of turn. diff --git a/forge-gui/res/cardsfolder/t/torpor_orb.txt b/forge-gui/res/cardsfolder/t/torpor_orb.txt index 510d284afcb..742ed345b83 100644 --- a/forge-gui/res/cardsfolder/t/torpor_orb.txt +++ b/forge-gui/res/cardsfolder/t/torpor_orb.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact S:Mode$ Continuous | GlobalRule$ Creatures entering the battlefield don't cause abilities to trigger. | Description$ Creatures entering the battlefield don't cause abilities to trigger. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/torpor_orb.jpg Oracle:Creatures entering the battlefield don't cause abilities to trigger. diff --git a/forge-gui/res/cardsfolder/t/torrent_of_souls.txt b/forge-gui/res/cardsfolder/t/torrent_of_souls.txt index 93742397e07..400f17fc982 100644 --- a/forge-gui/res/cardsfolder/t/torrent_of_souls.txt +++ b/forge-gui/res/cardsfolder/t/torrent_of_souls.txt @@ -4,7 +4,7 @@ Types:Sorcery A:SP$ ChangeZone | Cost$ 4 BR | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Choose target creature card in your graveyard to return | ValidTgts$ Creature.YouCtrl | Origin$ Graveyard | Destination$ Battlefield | ConditionManaSpent$ B | SubAbility$ RPaid | SpellDescription$ Return up to one target creature card from your graveyard to the battlefield if {B} was spent to cast CARDNAME. Creatures target player controls get +2/+0 and gain haste until end of turn if {R} was spent to cast CARDNAME. (Do both if {B}{R} was spent.) SVar:RPaid:DB$ PumpAll | ValidTgts$ Player | TgtPrompt$ Select target player | ValidCards$ Creature | NumAtt$ 2 | KW$ Haste | ConditionManaSpent$ R SVar:ManaNeededToAvoidNegativeEffect:black -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black SVar:Picture:http://www.wizards.com/global/images/magic/general/torrent_of_souls.jpg Oracle:Return up to one target creature card from your graveyard to the battlefield if {B} was spent to cast Torrent of Souls. Creatures target player controls get +2/+0 and gain haste until end of turn if {R} was spent to cast Torrent of Souls. (Do both if {B}{R} was spent.) diff --git a/forge-gui/res/cardsfolder/t/tortoise_formation.txt b/forge-gui/res/cardsfolder/t/tortoise_formation.txt index d2ac622adb8..2350b067d2e 100644 --- a/forge-gui/res/cardsfolder/t/tortoise_formation.txt +++ b/forge-gui/res/cardsfolder/t/tortoise_formation.txt @@ -2,6 +2,6 @@ Name:Tortoise Formation ManaCost:3 U Types:Instant A:SP$ PumpAll | Cost$ 3 U | ValidCards$ Creature.YouCtrl | KW$ Shroud | SpellDescription$ Creatures you control gain shroud until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tortoise_formation.jpg Oracle:Creatures you control gain shroud until end of turn. (They can't be the targets of spells or abilities.) diff --git a/forge-gui/res/cardsfolder/t/torture_chamber.txt b/forge-gui/res/cardsfolder/t/torture_chamber.txt index cbe6f687234..d31c5256be5 100644 --- a/forge-gui/res/cardsfolder/t/torture_chamber.txt +++ b/forge-gui/res/cardsfolder/t/torture_chamber.txt @@ -8,6 +8,6 @@ SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ PAIN | Counter SVar:TrigDealDamage:DB$ DealDamage | Defined$ You | NumDmg$ X | References$ X SVar:X:Count$CardCounters.PAIN SVar:Y:SVar$CostCountersRemoved -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/torture_chamber.jpg Oracle:At the beginning of your upkeep, put a pain counter on Torture Chamber.\nAt the beginning of your end step, Torture Chamber deals damage to you equal to the number of pain counters on it.\n{1}, {T}, Remove all pain counters from Torture Chamber: Torture Chamber deals damage to target creature equal to the number of pain counters removed this way. diff --git a/forge-gui/res/cardsfolder/t/tortured_existence.txt b/forge-gui/res/cardsfolder/t/tortured_existence.txt index d564b5d120b..fb21d7946a1 100644 --- a/forge-gui/res/cardsfolder/t/tortured_existence.txt +++ b/forge-gui/res/cardsfolder/t/tortured_existence.txt @@ -2,6 +2,6 @@ Name:Tortured Existence ManaCost:B Types:Enchantment A:AB$ ChangeZone | Cost$ B Discard<1/Creature> | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target creature card from your graveyard to your hand. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tortured_existence.jpg Oracle:{B}, Discard a creature card: Return target creature card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/t/total_war.txt b/forge-gui/res/cardsfolder/t/total_war.txt index 5079ef628c4..1bc39b0c483 100644 --- a/forge-gui/res/cardsfolder/t/total_war.txt +++ b/forge-gui/res/cardsfolder/t/total_war.txt @@ -3,7 +3,7 @@ ManaCost:3 R Types:Enchantment T:Mode$ AttackersDeclared | Execute$ TrigDestroy | TriggerZones$ Battlefield | AttackingPlayer$ Player | TriggerDescription$ Whenever a player attacks with one or more creatures, destroy all untapped non-Wall creatures that player controls that didn't attack, except for creatures the player hasn't controlled continuously since the beginning of the turn. SVar:TrigDestroy:DB$ DestroyAll | ValidCards$ Creature.nonWall+notFirstTurnControlled+untapped+ActivePlayerCtrl+notattacking -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/total_war.jpg Oracle:Whenever a player attacks with one or more creatures, destroy all untapped non-Wall creatures that player controls that didn't attack, except for creatures the player hasn't controlled continuously since the beginning of the turn. diff --git a/forge-gui/res/cardsfolder/t/totem_guide_hartebeest.txt b/forge-gui/res/cardsfolder/t/totem_guide_hartebeest.txt index 7546ad5e58d..566607dd77b 100644 --- a/forge-gui/res/cardsfolder/t/totem_guide_hartebeest.txt +++ b/forge-gui/res/cardsfolder/t/totem_guide_hartebeest.txt @@ -4,7 +4,7 @@ Types:Creature Antelope PT:2/5 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for an Aura card, reveal it, put it into your hand, then shuffle your library. SVar:TrigChangeZone:DB$ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Card.Aura | ChangeNum$ 1 | ShuffleNonMandatory$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Aura SVar:Picture:http://www.wizards.com/global/images/magic/general/totem_guide_hartebeest.jpg Oracle:When Totem-Guide Hartebeest enters the battlefield, you may search your library for an Aura card, reveal it, put it into your hand, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/t/touch_of_darkness.txt b/forge-gui/res/cardsfolder/t/touch_of_darkness.txt index 49f9abdd1fc..979dfa85cbf 100644 --- a/forge-gui/res/cardsfolder/t/touch_of_darkness.txt +++ b/forge-gui/res/cardsfolder/t/touch_of_darkness.txt @@ -3,7 +3,7 @@ ManaCost:B Types:Instant A:SP$ Animate | Cost$ B | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ MaxTgts | References$ MaxTgts | TgtPrompt$ Select target creatures | Colors$ Black | OverwriteColors$ True | SpellDescription$ Any number of target creatures become black until end of turn. SVar:MaxTgts:Count$Valid Creature -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/touch_of_darkness.jpg Oracle:Any number of target creatures become black until end of turn. diff --git a/forge-gui/res/cardsfolder/t/touch_of_vitae.txt b/forge-gui/res/cardsfolder/t/touch_of_vitae.txt index 3e54226c715..50bd3501681 100644 --- a/forge-gui/res/cardsfolder/t/touch_of_vitae.txt +++ b/forge-gui/res/cardsfolder/t/touch_of_vitae.txt @@ -6,6 +6,6 @@ SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Abilities$ ABUntap | SubAbility SVar:ABUntap:AB$ Untap | Cost$ 0 | Defined$ Self | GameActivationLimit$ 1 | SpellDescription$ Untap this creature. Activate this ability only once. SVar:DelTrigSlowtrip:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ DrawSlowtrip | TriggerDescription$ Draw a card. SVar:DrawSlowtrip:DB$Draw | NumCards$ 1 | Defined$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/touch_of_vitae.jpg Oracle:Until end of turn, target creature gains haste and "{0}: Untap this creature. Activate this ability only once."\nDraw a card at the beginning of the next turn's upkeep. diff --git a/forge-gui/res/cardsfolder/t/touchstone.txt b/forge-gui/res/cardsfolder/t/touchstone.txt index d5a1d85fe3c..4f793cd7b8e 100644 --- a/forge-gui/res/cardsfolder/t/touchstone.txt +++ b/forge-gui/res/cardsfolder/t/touchstone.txt @@ -2,6 +2,6 @@ Name:Touchstone ManaCost:2 Types:Artifact A:AB$ Tap | Cost$ T | ValidTgts$ Artifact.YouDontCtrl | TgtPrompt$ Select target artifact you don't control | SpellDescription$ Tap target artifact you don't control. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/touchstone.jpg Oracle:{T}: Tap target artifact you don't control. diff --git a/forge-gui/res/cardsfolder/t/tourachs_chant.txt b/forge-gui/res/cardsfolder/t/tourachs_chant.txt index a1027371a52..5eac3a8a050 100644 --- a/forge-gui/res/cardsfolder/t/tourachs_chant.txt +++ b/forge-gui/res/cardsfolder/t/tourachs_chant.txt @@ -4,6 +4,6 @@ Types:Enchantment K:UpkeepCost:B T:Mode$ ChangesZone | ValidCard$ Forest | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigDmg | TriggerDescription$ Whenever a player puts a Forest onto the battlefield, CARDNAME deals 3 damage to that player unless they put a -1/-1 counter on a creature they control. SVar:TrigDmg:DB$ DealDamage | Defined$ TriggeredCardController | NumDmg$ 3 | UnlessCost$ AddCounter<1/M1M1/Creature.YouCtrl/a creature you control> | UnlessPayer$ TriggeredCardController -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/tourachs_chant.jpg Oracle:At the beginning of your upkeep, sacrifice Tourach's Chant unless you pay {B}.\nWhenever a player puts a Forest onto the battlefield, Tourach's Chant deals 3 damage to that player unless they put a -1/-1 counter on a creature they control. diff --git a/forge-gui/res/cardsfolder/t/tourachs_gate.txt b/forge-gui/res/cardsfolder/t/tourachs_gate.txt index cd6f3d0b54b..f6ef9cf847c 100644 --- a/forge-gui/res/cardsfolder/t/tourachs_gate.txt +++ b/forge-gui/res/cardsfolder/t/tourachs_gate.txt @@ -8,7 +8,7 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E SVar:TrigSubCounter:DB$ RemoveCounter | Defined$ Self | CounterType$ TIME | CounterNum$ 1 | SubAbility$ Sac SVar:Sac:DB$ Sacrifice | Defined$ Self | ConditionPresent$ Card.Self+counters_EQ0_TIME A:AB$ PumpAll | Cost$ tapXType<1/Land.EnchantedBy/Enchanted Land> | ValidCards$ Creature.attacking+YouCtrl | NumAtt$ 2 | NumDef$ -1 | SpellDescription$ Attacking creatures you control get +2/-1 until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingAttachEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/tourachs_gate.jpg Oracle:Enchant land you control\nSacrifice a Thrull: Put three time counters on Tourach's Gate.\nAt the beginning of your upkeep, remove a time counter from Tourach's Gate. If there are no time counters on Tourach's Gate, sacrifice it.\nTap enchanted land: Attacking creatures you control get +2/-1 until end of turn. Activate this ability only if enchanted land is untapped. diff --git a/forge-gui/res/cardsfolder/t/tower_defense.txt b/forge-gui/res/cardsfolder/t/tower_defense.txt index 37567d030a8..27ffcd71287 100644 --- a/forge-gui/res/cardsfolder/t/tower_defense.txt +++ b/forge-gui/res/cardsfolder/t/tower_defense.txt @@ -2,6 +2,6 @@ Name:Tower Defense ManaCost:1 G Types:Instant A:SP$ PumpAll | Cost$ 1 G | ValidCards$ Creature.YouCtrl | NumDef$ +5 | KW$ Reach | SpellDescription$ Creatures you control get +0/+5 and gain reach until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tower_defense.jpg Oracle:Creatures you control get +0/+5 and gain reach until end of turn. diff --git a/forge-gui/res/cardsfolder/t/tower_of_coireall.txt b/forge-gui/res/cardsfolder/t/tower_of_coireall.txt index 2220a76a264..2f4fa3683dc 100644 --- a/forge-gui/res/cardsfolder/t/tower_of_coireall.txt +++ b/forge-gui/res/cardsfolder/t/tower_of_coireall.txt @@ -3,6 +3,6 @@ ManaCost:2 Types:Artifact A:AB$ Effect | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | RememberObjects$ Targeted | Name$ Tower of Coireall Effect | StaticAbilities$ KWPump | SpellDescription$ Target creature can't be blocked by Walls this turn. SVar:KWPump:Mode$ CantBlockBy | ValidAttacker$ Creature.IsRemembered | ValidBlocker$ Creature.Wall | EffectZone$ Command | Description$ Remembered creature can't be blocked by Walls this turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/tower_of_coireall.jpg Oracle:{T}: Target creature can't be blocked by Walls this turn. diff --git a/forge-gui/res/cardsfolder/t/toxic_deluge.txt b/forge-gui/res/cardsfolder/t/toxic_deluge.txt index ee95b9d19c1..69458c4c8f5 100644 --- a/forge-gui/res/cardsfolder/t/toxic_deluge.txt +++ b/forge-gui/res/cardsfolder/t/toxic_deluge.txt @@ -3,6 +3,6 @@ ManaCost:2 B Types:Sorcery A:SP$ PumpAll | Cost$ 2 B PayLife | ValidCards$ Creature | NumAtt$ -ChosenX | NumDef$ -ChosenX | References$ X | SpellDescription$ All creatures get -X/-X until end of turn. SVar:X:XChoice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/toxic_deluge.jpg Oracle:As an additional cost to cast Toxic Deluge, pay X life.\nAll creatures get -X/-X until end of turn. diff --git a/forge-gui/res/cardsfolder/t/toymaker.txt b/forge-gui/res/cardsfolder/t/toymaker.txt index e44ad6941b6..d9627841078 100644 --- a/forge-gui/res/cardsfolder/t/toymaker.txt +++ b/forge-gui/res/cardsfolder/t/toymaker.txt @@ -4,6 +4,6 @@ Types:Artifact Creature Spellshaper PT:1/1 A:AB$ Animate | Cost$ 1 T Discard<1/Card> | ValidTgts$ Artifact.nonCreature | TgtPrompt$ Select target noncreature artifact | Power$ X | Toughness$ X | Types$ Artifact,Creature | SpellDescription$ Target noncreature artifact becomes an artifact creature with power and toughness each equal to its converted mana cost until end of turn. (It retains its abilities.) SVar:X:Targeted$CardManaCost -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/toymaker.jpg Oracle:{1}, {T}, Discard a card: Target noncreature artifact becomes an artifact creature with power and toughness each equal to its converted mana cost until end of turn. (It retains its abilities.) diff --git a/forge-gui/res/cardsfolder/t/trace_of_abundance.txt b/forge-gui/res/cardsfolder/t/trace_of_abundance.txt index 8236f617b6b..ac1f4869dba 100644 --- a/forge-gui/res/cardsfolder/t/trace_of_abundance.txt +++ b/forge-gui/res/cardsfolder/t/trace_of_abundance.txt @@ -6,6 +6,6 @@ A:SP$ Attach | Cost$ RW G | ValidTgts$ Land | TgtPrompt$ Select target land | AI S:Mode$ Continuous | Affected$ Land.EnchantedBy | AddKeyword$ Shroud | Description$ Enchanted land has shroud. (It can't be the target of spells or abilities.) T:Mode$ TapsForMana | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigMana | Static$ True | TriggerDescription$ Whenever enchanted land is tapped for mana, its controller adds an additional one mana of any color. SVar:TrigMana:DB$ Mana | Produced$ Any | Defined$ TriggeredCardController -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/trace_of_abundance.jpg Oracle:Enchant land\nEnchanted land has shroud. (It can't be the target of spells or abilities.)\nWhenever enchanted land is tapped for mana, its controller adds an additional one mana of any color. diff --git a/forge-gui/res/cardsfolder/t/trade_routes.txt b/forge-gui/res/cardsfolder/t/trade_routes.txt index 0dff6592d9a..763296c2de4 100644 --- a/forge-gui/res/cardsfolder/t/trade_routes.txt +++ b/forge-gui/res/cardsfolder/t/trade_routes.txt @@ -3,7 +3,7 @@ ManaCost:1 U Types:Enchantment A:AB$ ChangeZone | Cost$ 1 | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | SpellDescription$ Return target land you control to its owner's hand. A:AB$ Draw | Cost$ 1 Discard<1/Land> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/trade_routes.jpg Oracle:{1}: Return target land you control to its owner's hand.\n{1}, Discard a land card: Draw a card. diff --git a/forge-gui/res/cardsfolder/t/trading_post.txt b/forge-gui/res/cardsfolder/t/trading_post.txt index b9fe2e71952..e346c291b23 100644 --- a/forge-gui/res/cardsfolder/t/trading_post.txt +++ b/forge-gui/res/cardsfolder/t/trading_post.txt @@ -5,6 +5,6 @@ A:AB$ GainLife | Cost$ 1 T Discard<1/Card> | LifeAmount$ 4 | SpellDescription$ Y A:AB$ Token | Cost$ 1 T PayLife<1> | TokenAmount$ 1 | TokenName$ Goat | TokenTypes$ Creature,Goat | TokenOwner$ You | TokenColors$ White | TokenPower$ 0 | TokenToughness$ 1 | TokenImage$ w 0 1 goat M13 | SpellDescription$ Create a 0/1 white Goat creature token. A:AB$ ChangeZone | Cost$ 1 T Sac<1/Creature> | TgtPrompt$ Choose target artifact card in your graveyard | ValidTgts$ Artifact.YouCtrl | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target artifact card from your graveyard to your hand. A:AB$ Draw | Cost$ 1 T Sac<1/Artifact> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/trading_post.jpg Oracle:{1}, {T}, Discard a card: You gain 4 life.\n{1}, {T}, Pay 1 life: Create a 0/1 white Goat creature token.\n{1}, {T}, Sacrifice a creature: Return target artifact card from your graveyard to your hand.\n{1}, {T}, Sacrifice an artifact: Draw a card. diff --git a/forge-gui/res/cardsfolder/t/tragic_arrogance.txt b/forge-gui/res/cardsfolder/t/tragic_arrogance.txt index 4dde1cc6f21..6dae2a805ba 100644 --- a/forge-gui/res/cardsfolder/t/tragic_arrogance.txt +++ b/forge-gui/res/cardsfolder/t/tragic_arrogance.txt @@ -8,6 +8,6 @@ SVar:ChooseEnch:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Enchantment SVar:ChoosePW:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Planeswalker.RememberedPlayerCtrl | ChoiceTitle$ Choose a planeswalker to keep | RememberChosen$ True | Mandatory$ True SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Permanent.nonLand+IsNotRemembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tragic_arrogance.jpg Oracle:For each player, you choose from among the permanents that player controls an artifact, a creature, an enchantment, and a planeswalker. Then each player sacrifices all other nonland permanents they control. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/t/trail_of_mystery.txt b/forge-gui/res/cardsfolder/t/trail_of_mystery.txt index d4380f9cebc..4982d51d096 100644 --- a/forge-gui/res/cardsfolder/t/trail_of_mystery.txt +++ b/forge-gui/res/cardsfolder/t/trail_of_mystery.txt @@ -5,7 +5,7 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creatu SVar:TrigChange:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeNum$ 1 | ShuffleNonMandatory$ True T:Mode$ TurnFaceUp | ValidCard$ Permanent.Creature+YouCtrl | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever a permanent you control is turned face up, if it's a creature, it gets +2/+2 until end of turn. SVar:TrigPump:DB$ Pump | Defined$ TriggeredCard | NumAtt$ +2 | NumDef$ +2 | ConditionDefined$ TriggeredCard | ConditionPresent$ Creature | ConditionCompare$ GE1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Keyword$Morph SVar:Picture:http://www.wizards.com/global/images/magic/general/trail_of_mystery.jpg Oracle:Whenever a face-down creature enters the battlefield under your control, you may search your library for a basic land card, reveal it, put it into your hand, then shuffle your library.\nWhenever a permanent you control is turned face up, if it's a creature, it gets +2/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/t/training_drone.txt b/forge-gui/res/cardsfolder/t/training_drone.txt index 57189bd7641..b81271e9384 100644 --- a/forge-gui/res/cardsfolder/t/training_drone.txt +++ b/forge-gui/res/cardsfolder/t/training_drone.txt @@ -6,6 +6,6 @@ S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ CARDNAME can't atta SVar:X:Count$Valid Card.Self+unequipped SVar:BuffedBy:Artifact.Equipment SVar:EquipMe:Once -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/training_drone.jpg Oracle:Training Drone can't attack or block unless it's equipped. diff --git a/forge-gui/res/cardsfolder/t/trait_doctoring.txt b/forge-gui/res/cardsfolder/t/trait_doctoring.txt index 5d285a57d70..544683a7d78 100644 --- a/forge-gui/res/cardsfolder/t/trait_doctoring.txt +++ b/forge-gui/res/cardsfolder/t/trait_doctoring.txt @@ -6,8 +6,8 @@ A:SP$ GenericChoice | Cost$ U | ValidTgts$ Permanent | TgtPrompt$ Choose target SVar:ChangeColor:DB$ ChangeText | Defined$ ParentTarget | ChangeColorWord$ Choose Choose | SubAbility$ Cipher | SpellDescription$ Change color SVar:ChangeType:DB$ ChangeText | Defined$ ParentTarget | ChangeTypeWord$ ChooseBasicLandType ChooseBasicLandType | SubAbility$ Cipher | SpellDescription$ Change type SVar:Cipher:DB$ Encode | Defined$ Self -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All DeckNeeds:Type$Creature SVar:Picture:http://www.wizards.com/global/images/magic/general/trait_doctoring.jpg Oracle:Change the text of target permanent by replacing all instances of one color word with another or one basic land type with another until end of turn.\nCipher (Then you may exile this spell card encoded on a creature you control. Whenever that creature deals combat damage to a player, its controller may cast a copy of the encoded card without paying its mana cost.) diff --git a/forge-gui/res/cardsfolder/t/tranquil_grove.txt b/forge-gui/res/cardsfolder/t/tranquil_grove.txt index 36bce34218e..b1800e9bc45 100644 --- a/forge-gui/res/cardsfolder/t/tranquil_grove.txt +++ b/forge-gui/res/cardsfolder/t/tranquil_grove.txt @@ -2,7 +2,7 @@ Name:Tranquil Grove ManaCost:1 G Types:Enchantment A:AB$ DestroyAll | Cost$ 1 G G | ValidCards$ Enchantment.Other | SpellDescription$ Destroy all other enchantments. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/tranquil_grove.jpg Oracle:{1}{G}{G}: Destroy all other enchantments. diff --git a/forge-gui/res/cardsfolder/t/transcendence.txt b/forge-gui/res/cardsfolder/t/transcendence.txt index 525035932cd..2b2adc110be 100644 --- a/forge-gui/res/cardsfolder/t/transcendence.txt +++ b/forge-gui/res/cardsfolder/t/transcendence.txt @@ -7,6 +7,6 @@ T:Mode$ LifeLost | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigL SVar:TrigLoseGame:DB$ LosesGame | Defined$ You SVar:TrigLifeGain:DB$ GainLife | LifeAmount$ X | References$ X SVar:X:TriggerCount$LifeAmount/Times.2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/transcendence.jpg Oracle:You don't lose the game for having 0 or less life.\nWhen you have 20 or more life, you lose the game.\nWhenever you lose life, you gain 2 life for each 1 life you lost. (Damage dealt to you causes you to lose life.) diff --git a/forge-gui/res/cardsfolder/t/transluminant.txt b/forge-gui/res/cardsfolder/t/transluminant.txt index 7d5b7d52a30..a59c006a2ca 100644 --- a/forge-gui/res/cardsfolder/t/transluminant.txt +++ b/forge-gui/res/cardsfolder/t/transluminant.txt @@ -4,8 +4,8 @@ Types:Creature Dryad Shaman PT:2/2 A:AB$ DelayedTrigger | Cost$ W Sac<1/CARDNAME> | Mode$ Phase | Phase$ End of Turn | Execute$ TrigToken | SpellDescription$ Create a 1/1 white Spirit creature token with flying at the beginning of the next end step. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenImage$ w 1 1 spirit RAV | TokenKeywords$ Flying -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All DeckHints:Color$White DeckHas:Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/transluminant.jpg diff --git a/forge-gui/res/cardsfolder/t/transmogrifying_licid.txt b/forge-gui/res/cardsfolder/t/transmogrifying_licid.txt index 881847c36f7..9d6a8e57490 100644 --- a/forge-gui/res/cardsfolder/t/transmogrifying_licid.txt +++ b/forge-gui/res/cardsfolder/t/transmogrifying_licid.txt @@ -6,6 +6,6 @@ A:AB$ Animate | Cost$ 1 T | Defined$ Self | RemoveThisAbility$ True | Permanent$ SVar:DBAttach:DB$ Attach | ValidTgts$ Creature | AILogic$ Pump SVar:SPAttach:SP$ Attach | Cost$ 0 | ValidTgts$ Creature S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 1 | AddType$ Artifact | Description$ Enchanted creature gets +1/+1 and is an artifact in addition to its other types. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/transmogrifying_licid.jpg Oracle:{1}, {T}: Transmogrifying Licid loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {1} to end this effect.\nEnchanted creature gets +1/+1 and is an artifact in addition to its other types. diff --git a/forge-gui/res/cardsfolder/t/transmutation.txt b/forge-gui/res/cardsfolder/t/transmutation.txt index 7d711c28f2d..a44ef908c9d 100644 --- a/forge-gui/res/cardsfolder/t/transmutation.txt +++ b/forge-gui/res/cardsfolder/t/transmutation.txt @@ -2,6 +2,6 @@ Name:Transmutation ManaCost:1 B Types:Instant A:SP$ Pump | Cost$ 1 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch target creature's power and toughness until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/transmutation.jpg Oracle:Switch target creature's power and toughness until end of turn. diff --git a/forge-gui/res/cardsfolder/t/transmute_artifact.txt b/forge-gui/res/cardsfolder/t/transmute_artifact.txt index 88b66115fa9..e50e51028e4 100644 --- a/forge-gui/res/cardsfolder/t/transmute_artifact.txt +++ b/forge-gui/res/cardsfolder/t/transmute_artifact.txt @@ -13,7 +13,7 @@ SVar:PayForTransmute:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield SVar:Y:Remembered$CardManaCost SVar:SackedCMC:Number$0 SVar:X:SVar$Y/Minus.SackedCMC -SVar:RemAIDeck:True +AI:RemoveDeck:All #ChangeType$ Card.IsRemembered SVar:Picture:http://www.wizards.com/global/images/magic/general/transmute_artifact.jpg Oracle:Sacrifice an artifact. If you do, search your library for an artifact card. If that card's converted mana cost is less than or equal to the sacrificed artifact's converted mana cost, put it onto the battlefield. If it's greater, you may pay {X}, where X is the difference. If you do, put it onto the battlefield. If you don't, put it into its owner's graveyard. Then shuffle your library. diff --git a/forge-gui/res/cardsfolder/t/trapfinders_trick.txt b/forge-gui/res/cardsfolder/t/trapfinders_trick.txt index 71eb6d52cf0..3eee945e3e5 100644 --- a/forge-gui/res/cardsfolder/t/trapfinders_trick.txt +++ b/forge-gui/res/cardsfolder/t/trapfinders_trick.txt @@ -2,6 +2,6 @@ Name:Trapfinder's Trick ManaCost:1 U Types:Sorcery A:SP$ Discard | Cost$ 1 U | ValidTgts$ Player | Mode$ RevealDiscardAll | DiscardValid$ Card.Trap | SpellDescription$ Target player reveals their hand and discards all Trap cards. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/trapfinders_trick.jpg Oracle:Target player reveals their hand and discards all Trap cards. diff --git a/forge-gui/res/cardsfolder/t/trapmakers_snare.txt b/forge-gui/res/cardsfolder/t/trapmakers_snare.txt index d7830ecc3a4..b6be80b2933 100644 --- a/forge-gui/res/cardsfolder/t/trapmakers_snare.txt +++ b/forge-gui/res/cardsfolder/t/trapmakers_snare.txt @@ -2,6 +2,6 @@ Name:Trapmaker's Snare ManaCost:1 U Types:Instant A:SP$ ChangeZone | Cost$ 1 U | Origin$ Library | Destination$ Hand | ChangeType$ Trap | ChangeNum$ 1 | SpellDescription$ Search your library for a Trap card, reveal it, put it into your hand, then shuffle your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/trapmakers_snare.jpg Oracle:Search your library for a Trap card, reveal it, put it into your hand, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/t/trash_for_treasure.txt b/forge-gui/res/cardsfolder/t/trash_for_treasure.txt index 0405562ec34..62bf9e11125 100644 --- a/forge-gui/res/cardsfolder/t/trash_for_treasure.txt +++ b/forge-gui/res/cardsfolder/t/trash_for_treasure.txt @@ -2,6 +2,6 @@ Name:Trash for Treasure ManaCost:2 R Types:Sorcery A:SP$ ChangeZone | Cost$ 2 R Sac<1/Artifact> | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target artifact card in your graveyard | ValidTgts$ Artifact.YouCtrl | SpellDescription$ Return target artifact card from your graveyard to the battlefield. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/trash_for_treasure.jpg Oracle:As an additional cost to cast Trash for Treasure, sacrifice an artifact.\nReturn target artifact card from your graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/t/treacherous_link.txt b/forge-gui/res/cardsfolder/t/treacherous_link.txt index 36a03bb8050..c5e8829163a 100644 --- a/forge-gui/res/cardsfolder/t/treacherous_link.txt +++ b/forge-gui/res/cardsfolder/t/treacherous_link.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ 1 B | ValidTgts$ Creature | AILogic$ Curse R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.EnchantedBy | ReplaceWith$ DmgEnchanted | Description$ All damage that would be dealt to enchanted creature is dealt to its controller instead. SVar:DmgEnchanted:DB$ ReplaceEffect | VarName$ Affected | VarValue$ ReplacedTargetController | VarType$ Player -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/treacherous_link.jpg Oracle:Enchant creature\nAll damage that would be dealt to enchanted creature is dealt to its controller instead. diff --git a/forge-gui/res/cardsfolder/t/treacherous_pit_dweller.txt b/forge-gui/res/cardsfolder/t/treacherous_pit_dweller.txt index 4e43b119470..927d0005f1c 100644 --- a/forge-gui/res/cardsfolder/t/treacherous_pit_dweller.txt +++ b/forge-gui/res/cardsfolder/t/treacherous_pit_dweller.txt @@ -5,6 +5,6 @@ PT:4/3 K:Undying T:Mode$ ChangesZone | Origin$ Graveyard | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainControl | TriggerDescription$ When CARDNAME enters the battlefield from a graveyard, target opponent gains control of it. SVar:TrigGainControl:DB$GainControl | Defined$ Self | ValidTgts$ Opponent | TgtPrompt$ Select target opponent -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/treacherous_pit_dweller.jpg Oracle:When Treacherous Pit-Dweller enters the battlefield from a graveyard, target opponent gains control of it.\nUndying (When this creature dies, if it had no +1/+1 counters on it, return it to the battlefield under its owner's control with a +1/+1 counter on it.) diff --git a/forge-gui/res/cardsfolder/t/treacherous_terrain.txt b/forge-gui/res/cardsfolder/t/treacherous_terrain.txt index bbc708f6c79..037415e92b3 100644 --- a/forge-gui/res/cardsfolder/t/treacherous_terrain.txt +++ b/forge-gui/res/cardsfolder/t/treacherous_terrain.txt @@ -6,6 +6,6 @@ SVar:DmgOpp:DB$ DealDamage | Defined$ Remembered | NumDmg$ X | References$ X SVar:X:Count$Valid Land.RememberedPlayerCtrl K:TypeCycling:Basic:2 SVar:AIPlayForSub:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/treacherous_terrain.jpg Oracle:Treacherous Terrain deals damage to each opponent equal to the number of lands that player controls.\nBasic landcycling {2} ({2}, Discard this card: Search your library for a basic land card, reveal it, put it into your hand, then shuffle your library.) diff --git a/forge-gui/res/cardsfolder/t/treacherous_vampire.txt b/forge-gui/res/cardsfolder/t/treacherous_vampire.txt index 93d18bda88f..50a929f094b 100644 --- a/forge-gui/res/cardsfolder/t/treacherous_vampire.txt +++ b/forge-gui/res/cardsfolder/t/treacherous_vampire.txt @@ -9,6 +9,6 @@ SVar:TrigLose:DB$ LoseLife | Defined$ You | LifeAmount$ 6 T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ Whenever CARDNAME attacks or blocks, sacrifice it unless you exile a card from your graveyard. T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigSac | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or blocks, sacrifice it unless you exile a card from your graveyard. SVar:TrigSac:DB$ Sacrifice | Defined$ Self | UnlessCost$ ExileFromGrave<1/Card> | UnlessPayer$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/treacherous_vampire.jpg Oracle:Flying\nWhenever Treacherous Vampire attacks or blocks, sacrifice it unless you exile a card from your graveyard.\nThreshold — As long as seven or more cards are in your graveyard, Treacherous Vampire gets +2/+2 and has "When Treacherous Vampire dies, you lose 6 life." diff --git a/forge-gui/res/cardsfolder/t/treefolk_harbinger.txt b/forge-gui/res/cardsfolder/t/treefolk_harbinger.txt index ab45a5a8d83..0903d948298 100644 --- a/forge-gui/res/cardsfolder/t/treefolk_harbinger.txt +++ b/forge-gui/res/cardsfolder/t/treefolk_harbinger.txt @@ -4,6 +4,6 @@ Types:Creature Treefolk Druid PT:0/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for a Treefolk or Forest card, reveal it, then shuffle your library and put that card on top of it. SVar:TrigChange:DB$ChangeZone | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Card.Treefolk,Card.Forest | ChangeNum$ 1 | ShuffleNonMandatory$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/treefolk_harbinger.jpg Oracle:When Treefolk Harbinger enters the battlefield, you may search your library for a Treefolk or Forest card, reveal it, then shuffle your library and put that card on top of it. diff --git a/forge-gui/res/cardsfolder/t/treefolk_healer.txt b/forge-gui/res/cardsfolder/t/treefolk_healer.txt index affc173e74d..55562b98d1c 100644 --- a/forge-gui/res/cardsfolder/t/treefolk_healer.txt +++ b/forge-gui/res/cardsfolder/t/treefolk_healer.txt @@ -3,7 +3,7 @@ ManaCost:4 G Types:Creature Treefolk Cleric PT:2/3 A:AB$ PreventDamage | Cost$ 2 W T | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | Amount$ 2 | SpellDescription$ Prevent the next 2 damage that would be dealt to any target this turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$white SVar:Picture:http://www.wizards.com/global/images/magic/general/treefolk_healer.jpg Oracle:{2}{W}, {T}: Prevent the next 2 damage that would be dealt to any target this turn. diff --git a/forge-gui/res/cardsfolder/t/treetop_defense.txt b/forge-gui/res/cardsfolder/t/treetop_defense.txt index ae892bfdc50..d1ebfc22e25 100644 --- a/forge-gui/res/cardsfolder/t/treetop_defense.txt +++ b/forge-gui/res/cardsfolder/t/treetop_defense.txt @@ -3,6 +3,6 @@ ManaCost:1 G Types:Instant A:SP$ PumpAll | Cost$ 1 G | ValidCards$ Creature.YouCtrl | KW$ Reach | CheckSVar$ X | SVarCompare$ GE1 | References$ X | OpponentTurn$ True | ActivationPhases$ Declare Attackers | SpellDescription$ Cast CARDNAME only during the declare attackers step and only if you've been attacked this step. Creatures you control gain reach until end of turn. SVar:X:Count$Valid Creature.attackingYou -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/treetop_defense.jpg Oracle:Cast Treetop Defense only during the declare attackers step and only if you've been attacked this step.\nCreatures you control gain reach until end of turn. (They can block creatures with flying.) diff --git a/forge-gui/res/cardsfolder/t/tremble.txt b/forge-gui/res/cardsfolder/t/tremble.txt index 9cb074cb572..8914c219fb4 100644 --- a/forge-gui/res/cardsfolder/t/tremble.txt +++ b/forge-gui/res/cardsfolder/t/tremble.txt @@ -2,6 +2,6 @@ Name:Tremble ManaCost:1 R Types:Sorcery A:SP$ Sacrifice | Cost$ 1 R | SacValid$ Land | Defined$ Player | SpellDescription$ Each player sacrifices a land. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/tremble.jpg Oracle:Each player sacrifices a land. diff --git a/forge-gui/res/cardsfolder/t/trench_gorger.txt b/forge-gui/res/cardsfolder/t/trench_gorger.txt index 99f6761f2d4..77425a9e651 100644 --- a/forge-gui/res/cardsfolder/t/trench_gorger.txt +++ b/forge-gui/res/cardsfolder/t/trench_gorger.txt @@ -9,6 +9,6 @@ SVar:TrenchAnimate:DB$Animate | Power$ Y | Toughness$ Y | References$ Y | Perman SVar:DBCleanUp:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$TypeInYourLibrary.Land SVar:Y:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/trench_gorger.jpg Oracle:Trample\nWhen Trench Gorger enters the battlefield, you may search your library for any number of land cards, exile them, then shuffle your library. If you do, Trench Gorger has base power and base toughness each equal to the number of cards exiled this way. diff --git a/forge-gui/res/cardsfolder/t/trenching_steed.txt b/forge-gui/res/cardsfolder/t/trenching_steed.txt index 136da4ecc78..533d457cd87 100644 --- a/forge-gui/res/cardsfolder/t/trenching_steed.txt +++ b/forge-gui/res/cardsfolder/t/trenching_steed.txt @@ -3,6 +3,6 @@ ManaCost:3 W Types:Creature Horse Rebel PT:2/3 A:AB$ Pump | Cost$ Sac<1/Land> | NumDef$ 3 | SpellDescription$ CARDNAME gets +0/+3 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/trenching_steed.jpg Oracle:Sacrifice a land: Trenching Steed gets +0/+3 until end of turn. diff --git a/forge-gui/res/cardsfolder/t/trevas_attendant.txt b/forge-gui/res/cardsfolder/t/trevas_attendant.txt index 86f5a6219c9..2ef80a8175e 100644 --- a/forge-gui/res/cardsfolder/t/trevas_attendant.txt +++ b/forge-gui/res/cardsfolder/t/trevas_attendant.txt @@ -3,6 +3,6 @@ ManaCost:5 Types:Artifact Creature Golem PT:3/3 A:AB$ Mana | Cost$ 1 Sac<1/CARDNAME> | Produced$ G W U | SpellDescription$ Add {G}{W}{U}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/trevas_attendant.jpg Oracle:{1}, Sacrifice Treva's Attendant: Add {G}{W}{U}. diff --git a/forge-gui/res/cardsfolder/t/trevas_charm.txt b/forge-gui/res/cardsfolder/t/trevas_charm.txt index 5898ed70f2f..484f1d3761b 100644 --- a/forge-gui/res/cardsfolder/t/trevas_charm.txt +++ b/forge-gui/res/cardsfolder/t/trevas_charm.txt @@ -6,6 +6,6 @@ SVar:DBDestroy:DB$ Destroy | ValidTgts$ Enchantment | TgtPrompt$ Select target e SVar:DBChangeZone:DB$ ChangeZone | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target attacking creature. SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 | SubAbility$ DBDiscard | SpellDescription$ Draw a card, then discard a card. SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/trevas_charm.jpg Oracle:Choose one —\n• Destroy target enchantment.\n• Exile target attacking creature.\n• Draw a card, then discard a card. diff --git a/forge-gui/res/cardsfolder/t/triad_of_fates.txt b/forge-gui/res/cardsfolder/t/triad_of_fates.txt index 26f3c92a37d..60cc07dfb66 100644 --- a/forge-gui/res/cardsfolder/t/triad_of_fates.txt +++ b/forge-gui/res/cardsfolder/t/triad_of_fates.txt @@ -8,6 +8,6 @@ SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True A:AB$ ChangeZone | Cost$ B T | ValidTgts$ Creature.counters_GE1_FATE | TgtPrompt$ Select target creature that has a fate counter | Origin$ Battlefield | Destination$ Exile | RememberLKI$ True | SpellDescription$ Exile target creature that has a fate counter on it. Its controller draws two cards. | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | Defined$ RememberedController | NumCards$ 2 | SubAbility$ DBCleanup -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/triad_of_fates.jpg Oracle:{1}, {T}: Put a fate counter on another target creature.\n{W}, {T}: Exile target creature that has a fate counter on it, then return it to the battlefield under its owner's control.\n{B}, {T}: Exile target creature that has a fate counter on it. Its controller draws two cards. diff --git a/forge-gui/res/cardsfolder/t/trial_error.txt b/forge-gui/res/cardsfolder/t/trial_error.txt index de54b13f9f5..939610b5993 100644 --- a/forge-gui/res/cardsfolder/t/trial_error.txt +++ b/forge-gui/res/cardsfolder/t/trial_error.txt @@ -4,7 +4,7 @@ AlternateMode: Split Types:Instant A:SP$ ChangeZoneAll | Cost$ W U | ValidTgts$ Creature | TgtPrompt$ Select target creature | RememberTargets$ True | ChangeType$ Creature.blockingRemembered,Creature.isBlockedByRemembered | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBCleanup | UseAllOriginZones$ True | SpellDescription$ Return all creatures blocking or blocked by target creature to their owner's hand. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/trialerror.jpg Oracle:Return all creatures blocking or blocked by target creature to their owner's hand. diff --git a/forge-gui/res/cardsfolder/t/triangle_of_war.txt b/forge-gui/res/cardsfolder/t/triangle_of_war.txt index 6b598f158ef..06b5bcf7d30 100644 --- a/forge-gui/res/cardsfolder/t/triangle_of_war.txt +++ b/forge-gui/res/cardsfolder/t/triangle_of_war.txt @@ -3,6 +3,6 @@ ManaCost:1 Types:Artifact A:AB$ Pump | Cost$ 2 Sac<1/CARDNAME> | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Choose target creature you control | SubAbility$ DBFight | SpellDescription$ Target creature you control fights target creature an opponent controls. (Each deals damage equal to its power to the other.) SVar:DBFight:DB$ Fight | Defined$ ParentTarget | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/triangle_of_war.jpg Oracle:{2}, Sacrifice Triangle of War: Target creature you control fights target creature an opponent controls. (Each deals damage equal to its power to the other.) diff --git a/forge-gui/res/cardsfolder/t/triassic_egg.txt b/forge-gui/res/cardsfolder/t/triassic_egg.txt index a7c0f003bae..48f03dbe775 100644 --- a/forge-gui/res/cardsfolder/t/triassic_egg.txt +++ b/forge-gui/res/cardsfolder/t/triassic_egg.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ PutCounter | Cost$ 3 T | CounterType$ HATCHLING | CounterNum$ 1 | SpellDescription$ Put a hatchling counter on CARDNAME. A:AB$ ChangeZone | Cost$ Sac<1/CARDNAME> | IsPresent$ Card.Self+counters_GE2_HATCHLING | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature.YouCtrl | ChangeNum$ 1 | SpellDescription$ You may put a creature card from your hand onto the battlefield. Activate this ability only if two or more hatchling counters are on CARDNAME. A:AB$ ChangeZone | Cost$ Sac<1/CARDNAME> | IsPresent$ Card.Self+counters_GE2_HATCHLING | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature from your graveyard | SpellDescription$ Return target creature card from your graveyard to the battlefield. Activate this ability only if two or more hatchling counters are on CARDNAME. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/triassic_egg.jpg Oracle:{3}, {T}: Put a hatchling counter on Triassic Egg.\nSacrifice Triassic Egg: Choose one —\n• You may put a creature card from your hand onto the battlefield. Activate this ability only if two or more hatchling counters are on Triassic Egg.\n• Return target creature card from your graveyard to the battlefield. Activate this ability only if two or more hatchling counters are on Triassic Egg. diff --git a/forge-gui/res/cardsfolder/t/tribal_unity.txt b/forge-gui/res/cardsfolder/t/tribal_unity.txt index c8df1b65f08..cceb977a452 100644 --- a/forge-gui/res/cardsfolder/t/tribal_unity.txt +++ b/forge-gui/res/cardsfolder/t/tribal_unity.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ ChooseType | Cost$ X 2 G | References$ X | Defined$ You | Type$ Creature | AILogic$ MostProminentComputerControls | SubAbility$ TribalPump | SpellDescription$ Creatures of the creature type of your choice get +X/+X until end of turn. SVar:TribalPump:DB$ PumpAll | ValidCards$ Creature.ChosenType | NumAtt$ +X | NumDef$ +X SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tribal_unity.jpg Oracle:Creatures of the creature type of your choice get +X/+X until end of turn. diff --git a/forge-gui/res/cardsfolder/t/trickbind.txt b/forge-gui/res/cardsfolder/t/trickbind.txt index 1a37eb113c1..33bde5b012b 100644 --- a/forge-gui/res/cardsfolder/t/trickbind.txt +++ b/forge-gui/res/cardsfolder/t/trickbind.txt @@ -6,6 +6,6 @@ A:SP$ Counter | Cost$ 1 U | TargetType$ Activated,Triggered | TgtPrompt$ Select SVar:DBEffect:DB$ Effect | Name$ Trickbind Effect | StaticAbilities$ STCantBeActivated | RememberObjects$ Remembered | SubAbility$ DBCleanup | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ1 SVar:STCantBeActivated:Mode$ CantBeActivated | EffectZone$ Command | ValidCard$ Permanent.IsRemembered SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/trickbind.jpg Oracle:Split second (As long as this spell is on the stack, players can't cast spells or activate abilities that aren't mana abilities.)\nCounter target activated or triggered ability. If a permanent's ability is countered this way, activated abilities of that permanent can't be activated this turn. (Mana abilities can't be targeted.) diff --git a/forge-gui/res/cardsfolder/t/trickery_charm.txt b/forge-gui/res/cardsfolder/t/trickery_charm.txt index 861cf054962..ca790aa0fc2 100644 --- a/forge-gui/res/cardsfolder/t/trickery_charm.txt +++ b/forge-gui/res/cardsfolder/t/trickery_charm.txt @@ -6,6 +6,6 @@ SVar:DBPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | SVar:DBChooseType:DB$ ChooseType | Type$ Creature | Defined$ You | SubAbility$ DBAnimate | SpellDescription$ Target creature becomes the creature type of your choice until end of turn. SVar:DBAnimate:DB$ Animate | ValidTgts$ Creature | TgtPrompt$ Select target creature | Types$ ChosenType | RemoveCreatureTypes$ True SVar:DBRearrage:DB$ RearrangeTopOfLibrary | Defined$ You | NumCards$ 4 | SpellDescription$ Look at the top four cards of your library, then put them back in any order. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/trickery_charm.jpg Oracle:Choose one —\n• Target creature gains flying until end of turn.\n• Target creature becomes the creature type of your choice until end of turn.\n• Look at the top four cards of your library, then put them back in any order. diff --git a/forge-gui/res/cardsfolder/t/trickster_mage.txt b/forge-gui/res/cardsfolder/t/trickster_mage.txt index 7b0702cd635..420ab60b45a 100644 --- a/forge-gui/res/cardsfolder/t/trickster_mage.txt +++ b/forge-gui/res/cardsfolder/t/trickster_mage.txt @@ -3,6 +3,6 @@ ManaCost:U Types:Creature Human Spellshaper PT:1/1 A:AB$ TapOrUntap | Cost$ U T Discard<1/Card> | ValidTgts$ Artifact,Creature,Land | TgtPrompt$ Select target artifact, creature, or land | SpellDescription$ You may tap or untap target artifact, creature, or land. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/trickster_mage.jpg Oracle:{U}, {T}, Discard a card: You may tap or untap target artifact, creature, or land. diff --git a/forge-gui/res/cardsfolder/t/trinisphere.txt b/forge-gui/res/cardsfolder/t/trinisphere.txt index e4bbe25c580..6324a0c5bdb 100644 --- a/forge-gui/res/cardsfolder/t/trinisphere.txt +++ b/forge-gui/res/cardsfolder/t/trinisphere.txt @@ -3,7 +3,7 @@ ManaCost:3 Types:Artifact S:Mode$ SetCost | ValidCard$ Card | Type$ Spell | Amount$ Min3 | CheckSVar$ X | SVarCompare$ EQ1 | Description$ As long as CARDNAME is untapped, each spell that would cost less than three mana to cast costs three mana to cast. SVar:X:Count$Valid Card.Self+untapped -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/trinisphere.jpg Oracle:As long as Trinisphere is untapped, each spell that would cost less than three mana to cast costs three mana to cast. diff --git a/forge-gui/res/cardsfolder/t/trip_wire.txt b/forge-gui/res/cardsfolder/t/trip_wire.txt index 59059fe5332..6e08ef26c6c 100644 --- a/forge-gui/res/cardsfolder/t/trip_wire.txt +++ b/forge-gui/res/cardsfolder/t/trip_wire.txt @@ -2,6 +2,6 @@ Name:Trip Wire ManaCost:2 G Types:Sorcery A:SP$ Destroy | Cost$ 2 G | ValidTgts$ Creature.withHorsemanship | TgtPrompt$ Select target creature with horsemanship | SpellDescription$ Destroy target creature with horsemanship. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/trip_wire.jpg Oracle:Destroy target creature with horsemanship. diff --git a/forge-gui/res/cardsfolder/t/triskaidekaphobia.txt b/forge-gui/res/cardsfolder/t/triskaidekaphobia.txt index 90a0385323a..f74c40600a0 100644 --- a/forge-gui/res/cardsfolder/t/triskaidekaphobia.txt +++ b/forge-gui/res/cardsfolder/t/triskaidekaphobia.txt @@ -7,7 +7,7 @@ SVar:DBLoseGame1:DB$ LosesGame | Defined$ Player.LifeEquals_13 | SubAbility$ DBG SVar:DBGainLife:DB$ GainLife | Defined$ Player | LifeAmount$ 1 SVar:DBLoseGame2:DB$ LosesGame | Defined$ Player.LifeEquals_13 | SubAbility$ DBLoseLife | SpellDescription$ Each player with exactly 13 life loses the game, then each player loses 1 life. SVar:DBLoseLife:DB$ LoseLife | Defined$ Player | LifeAmount$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHas:Ability$LifeGain SVar:Picture:http://www.wizards.com/global/images/magic/general/triskaidekaphobia.jpg Oracle:At the beginning of your upkeep, choose one —\n• Each player with exactly 13 life loses the game, then each player gains 1 life.\n• Each player with exactly 13 life loses the game, then each player loses 1 life. diff --git a/forge-gui/res/cardsfolder/t/triton_tactics.txt b/forge-gui/res/cardsfolder/t/triton_tactics.txt index 15646b16ecc..70f9c22e97a 100644 --- a/forge-gui/res/cardsfolder/t/triton_tactics.txt +++ b/forge-gui/res/cardsfolder/t/triton_tactics.txt @@ -8,6 +8,6 @@ SVar:TrigRemember:DB$ Pump | RememberObjects$ DelayTriggerRemembered | SubAbilit SVar:TrigTap:DB$ TapAll | ValidCards$ Creature.blockedByRemembered | SubAbility$ DBPump SVar:DBPump:DB$ PumpAll | ValidCards$ Creature.blockedByRemembered | Permanent$ True | KW$ HIDDEN This card doesn't untap during your next untap step. | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/triton_tactics.jpg Oracle:Up to two target creatures each get +0/+3 until end of turn. Untap those creatures. At this turn's next end of combat, tap each creature that was blocked by one of those creatures this turn and it doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/t/troll_horn_cameo.txt b/forge-gui/res/cardsfolder/t/troll_horn_cameo.txt index 02159dffad7..6cd2ecd6b2a 100644 --- a/forge-gui/res/cardsfolder/t/troll_horn_cameo.txt +++ b/forge-gui/res/cardsfolder/t/troll_horn_cameo.txt @@ -3,7 +3,7 @@ ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Green|Red SVar:Picture:http://www.wizards.com/global/images/magic/general/troll_horn_cameo.jpg Oracle:{T}: Add {R} or {G}. diff --git a/forge-gui/res/cardsfolder/t/tromp_the_domains.txt b/forge-gui/res/cardsfolder/t/tromp_the_domains.txt index e2179bc9ddc..246f2fb8ef4 100644 --- a/forge-gui/res/cardsfolder/t/tromp_the_domains.txt +++ b/forge-gui/res/cardsfolder/t/tromp_the_domains.txt @@ -3,6 +3,6 @@ ManaCost:5 G Types:Sorcery A:SP$ PumpAll | Cost$ 5 G | ValidCards$ Creature.YouCtrl | NumAtt$ +X | NumDef$ +X | References$ X | KW$ Trample | SpellDescription$ Domain — Until end of turn, creatures you control gain trample and get +1/+1 for each basic land type among lands you control. SVar:X:Count$Domain -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://resources.wizards.com/magic/cards/tsp/en-us/card116726.jpg Oracle:Domain — Until end of turn, creatures you control gain trample and get +1/+1 for each basic land type among lands you control. diff --git a/forge-gui/res/cardsfolder/t/tropical_storm.txt b/forge-gui/res/cardsfolder/t/tropical_storm.txt index 50e29742100..b9591e43b4d 100644 --- a/forge-gui/res/cardsfolder/t/tropical_storm.txt +++ b/forge-gui/res/cardsfolder/t/tropical_storm.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ DamageAll | Cost$ X G | ValidCards$ Creature.withFlying | NumDmg$ X | References$ X | SubAbility$ DBDamage | SpellDescription$ CARDNAME deals X damage to each creature with flying and 1 additional damage to each blue creature. SVar:DBDamage:DB$DamageAll | ValidCards$ Creature.Blue | NumDmg$ 1 SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tropical_storm.jpg Oracle:Tropical Storm deals X damage to each creature with flying and 1 additional damage to each blue creature. diff --git a/forge-gui/res/cardsfolder/t/troubled_healer.txt b/forge-gui/res/cardsfolder/t/troubled_healer.txt index 1cb74b6e177..87129303928 100644 --- a/forge-gui/res/cardsfolder/t/troubled_healer.txt +++ b/forge-gui/res/cardsfolder/t/troubled_healer.txt @@ -3,6 +3,6 @@ ManaCost:2 W Types:Creature Human Cleric PT:1/2 A:AB$ PreventDamage | Cost$ Sac<1/Land> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select target any target | Amount$ 2 | SpellDescription$ Prevent the next 2 damage that would be dealt to target permanent or player this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/troubled_healer.jpg Oracle:Sacrifice a land: Prevent the next 2 damage that would be dealt to any target this turn. diff --git a/forge-gui/res/cardsfolder/t/truce.txt b/forge-gui/res/cardsfolder/t/truce.txt index 80d06b86df1..fcaec508a79 100644 --- a/forge-gui/res/cardsfolder/t/truce.txt +++ b/forge-gui/res/cardsfolder/t/truce.txt @@ -8,6 +8,6 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True # Player is remembered here SVar:Y:Count$RememberedSize/NMinus.3 SVar:X:SVar$Y/Twice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/truce.jpg Oracle:Each player may draw up to two cards. For each card less than two a player draws this way, that player gains 2 life. diff --git a/forge-gui/res/cardsfolder/t/trumpeting_armodon.txt b/forge-gui/res/cardsfolder/t/trumpeting_armodon.txt index eddb119fc7a..85fbb34e52e 100644 --- a/forge-gui/res/cardsfolder/t/trumpeting_armodon.txt +++ b/forge-gui/res/cardsfolder/t/trumpeting_armodon.txt @@ -3,6 +3,6 @@ ManaCost:3 G Types:Creature Elephant PT:3/3 A:AB$ MustBlock | Cost$ 1 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Target creature blocks CARDNAME this turn if able. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/trumpeting_armodon.jpg Oracle:{1}{G}: Target creature blocks Trumpeting Armodon this turn if able. diff --git a/forge-gui/res/cardsfolder/t/trusted_advisor.txt b/forge-gui/res/cardsfolder/t/trusted_advisor.txt index ce356445744..7f482e71439 100644 --- a/forge-gui/res/cardsfolder/t/trusted_advisor.txt +++ b/forge-gui/res/cardsfolder/t/trusted_advisor.txt @@ -5,6 +5,6 @@ PT:1/2 S:Mode$ Continuous | Affected$ You | RaiseMaxHandSize$ 2 | Description$ Your maximum hand size is increased by two. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigBounce | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, return a blue creature you control to its owner's hand. SVar:TrigBounce:DB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Mandatory$ True | Hidden$ True | ChangeType$ Creature.Blue+YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/trusted_advisor.jpg Oracle:Your maximum hand size is increased by two.\nAt the beginning of your upkeep, return a blue creature you control to its owner's hand. diff --git a/forge-gui/res/cardsfolder/t/tsabos_decree.txt b/forge-gui/res/cardsfolder/t/tsabos_decree.txt index cb1dbe2902d..83e57e97459 100644 --- a/forge-gui/res/cardsfolder/t/tsabos_decree.txt +++ b/forge-gui/res/cardsfolder/t/tsabos_decree.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ ChooseType | Cost$ 5 B | Defined$ You | Type$ Creature | SubAbility$ TsabosDiscard | StackDescription$ None | SpellDescription$ Choose a creature type. Target player reveals their hand and discards all creature cards of that type. Then destroy all creatures of that type that player controls. They can't be regenerated. SVar:TsabosDiscard:DB$ Discard | ValidTgts$ Player | ForgetOtherTargets$ True | RememberTargets$ True | RememberDiscarder$ True | Mode$ RevealDiscardAll | DiscardValid$ Creature.ChosenType | SubAbility$ TsabosDestroy SVar:TsabosDestroy:DB$ DestroyAll | ValidCards$ Creature.ChosenType+RememberedPlayerCtrl | NoRegen$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tsabos_decree.jpg Oracle:Choose a creature type. Target player reveals their hand and discards all creature cards of that type. Then destroy all creatures of that type that player controls. They can't be regenerated. diff --git a/forge-gui/res/cardsfolder/t/tsabos_web.txt b/forge-gui/res/cardsfolder/t/tsabos_web.txt index 2fb0ec3a8c9..12ac73c4f9f 100644 --- a/forge-gui/res/cardsfolder/t/tsabos_web.txt +++ b/forge-gui/res/cardsfolder/t/tsabos_web.txt @@ -4,6 +4,6 @@ Types:Artifact T:Mode$ ChangesZone | ValidCard$ Card.Self | Destination$ Battlefield | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. SVar:TrigDraw:DB$ Draw | NumCards$ 1 S:Mode$ Continuous | Affected$ Land.hasNonManaActivatedAbility | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Each land with an activated ability that isn't a mana ability doesn't untap during its controller's untap step. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/tsabos_web.jpg Oracle:When Tsabo's Web enters the battlefield, draw a card.\nEach land with an activated ability that isn't a mana ability doesn't untap during its controller's untap step. diff --git a/forge-gui/res/cardsfolder/t/tsunami.txt b/forge-gui/res/cardsfolder/t/tsunami.txt index d5ae847c69f..de7964fbf2b 100644 --- a/forge-gui/res/cardsfolder/t/tsunami.txt +++ b/forge-gui/res/cardsfolder/t/tsunami.txt @@ -2,6 +2,6 @@ Name:Tsunami ManaCost:3 G Types:Sorcery A:SP$ DestroyAll | Cost$ 3 G | ValidCards$ Island | SpellDescription$ Destroy all Islands. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/tsunami.jpg Oracle:Destroy all Islands. diff --git a/forge-gui/res/cardsfolder/t/tumble_magnet.txt b/forge-gui/res/cardsfolder/t/tumble_magnet.txt index 244d088c682..497b737524b 100644 --- a/forge-gui/res/cardsfolder/t/tumble_magnet.txt +++ b/forge-gui/res/cardsfolder/t/tumble_magnet.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact K:etbCounter:CHARGE:3 A:AB$ Tap | Cost$ T SubCounter<1/CHARGE> | ValidTgts$ Creature,Artifact | TgtPrompt$ Select target artifact or creature | SpellDescription$ Tap target artifact or creature. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/tumble_magnet.jpg Oracle:Tumble Magnet enters the battlefield with three charge counters on it.\n{T}, Remove a charge counter from Tumble Magnet: Tap target artifact or creature. diff --git a/forge-gui/res/cardsfolder/t/tundra_kavu.txt b/forge-gui/res/cardsfolder/t/tundra_kavu.txt index 355c92c1a6b..5459c77f192 100644 --- a/forge-gui/res/cardsfolder/t/tundra_kavu.txt +++ b/forge-gui/res/cardsfolder/t/tundra_kavu.txt @@ -6,6 +6,6 @@ A:AB$ Pump | Cost$ T | ValidTgts$ Land | TgtPrompt$ Select target land | SubAbil SVar:TypeChoice:DB$ GenericChoice | Choices$ SVar1,SVar2 | StackDescription$ Plains or an Island until end of turn. SVar:SVar1:DB$ Animate | Defined$ Targeted | Types$ Plains | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | SpellDescription$ Targeted land becomes a Plains until end of turn. SVar:SVar2:DB$ Animate | Defined$ Targeted | Types$ Island | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | SpellDescription$ Targeted land becomes an Island until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tundra_kavu.jpg Oracle:{T}: Target land becomes a Plains or an Island until end of turn. diff --git a/forge-gui/res/cardsfolder/t/tunnel.txt b/forge-gui/res/cardsfolder/t/tunnel.txt index 68c8857f329..94245c462d5 100644 --- a/forge-gui/res/cardsfolder/t/tunnel.txt +++ b/forge-gui/res/cardsfolder/t/tunnel.txt @@ -2,6 +2,6 @@ Name:Tunnel ManaCost:R Types:Instant A:SP$ Destroy | Cost$ R | ValidTgts$ Wall | TgtPrompt$ Select target Wall | NoRegen$ True | SpellDescription$ Destroy target Wall. It can't be regenerated. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/tunnel.jpg Oracle:Destroy target Wall. It can't be regenerated. diff --git a/forge-gui/res/cardsfolder/t/tunnel_vision.txt b/forge-gui/res/cardsfolder/t/tunnel_vision.txt index 10d64deb4d2..87b2aff8fb3 100644 --- a/forge-gui/res/cardsfolder/t/tunnel_vision.txt +++ b/forge-gui/res/cardsfolder/t/tunnel_vision.txt @@ -3,6 +3,6 @@ ManaCost:5 U Types:Sorcery A:SP$ NameCard | Cost$ 5 U | Defined$ You | SubAbility$ FindThePrecious | AILogic$ MostProminentInHumanDeck | SpellDescription$ Choose a card name. Target player reveals cards from the top of their library until a card with that name is revealed. If it is, that player puts the rest of the revealed cards into their graveyard and puts the card with the chosen name on top of their library. Otherwise, the player shuffles their library. SVar:FindThePrecious:DB$ DigUntil | ValidTgts$ Player | TgtPrompt$ Select target player | IsCurse$ True | Valid$ Card.NamedCard | ValidDescription$ the named | RememberFound$ True | NoMoveFound$ True | FoundDestination$ Library | FoundLibraryPosition$ 0 | RevealedDestination$ Graveyard | NoneFoundDestination$ Library | NoneFoundLibraryPosition$ 0 | Shuffle$ True | ShuffleCondition$ NoneFound -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tunnel_vision.jpg Oracle:Choose a card name. Target player reveals cards from the top of their library until a card with that name is revealed. If it is, that player puts the rest of the revealed cards into their graveyard and puts the card with the chosen name on top of their library. Otherwise, the player shuffles their library. diff --git a/forge-gui/res/cardsfolder/t/turbulent_dreams.txt b/forge-gui/res/cardsfolder/t/turbulent_dreams.txt index bd856fd47f3..1908088b897 100644 --- a/forge-gui/res/cardsfolder/t/turbulent_dreams.txt +++ b/forge-gui/res/cardsfolder/t/turbulent_dreams.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ ChangeZone | Cost$ U U Discard | Origin$ Battlefield | Destination$ Hand | TargetMin$ 0 | TargetMax$ MaxTgts | References$ X,MaxTgts | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | SpellDescription$ Return X target nonland permanents to their owners' hands. SVar:X:Targeted$Amount SVar:MaxTgts:Count$Valid Permanent.nonLand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/turbulent_dreams.jpg Oracle:As an additional cost to cast Turbulent Dreams, discard X cards.\nReturn X target nonland permanents to their owners' hands. diff --git a/forge-gui/res/cardsfolder/t/turn_to_dust.txt b/forge-gui/res/cardsfolder/t/turn_to_dust.txt index 57f84ba4c25..aefe271cbb4 100644 --- a/forge-gui/res/cardsfolder/t/turn_to_dust.txt +++ b/forge-gui/res/cardsfolder/t/turn_to_dust.txt @@ -3,6 +3,6 @@ ManaCost:G Types:Instant A:SP$ Destroy | Cost$ G | ValidTgts$ Equipment | TgtPrompt$ Select target Equipment | SubAbility$ DBMana | SpellDescription$ Destroy target Equipment. Add {G}. SVar:DBMana:DB$Mana | Produced$ G | Amount$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/turn_to_dust.jpg Oracle:Destroy target Equipment. Add {G}. diff --git a/forge-gui/res/cardsfolder/t/turn_to_frog.txt b/forge-gui/res/cardsfolder/t/turn_to_frog.txt index 429211e5f8a..e3b2a0fe751 100644 --- a/forge-gui/res/cardsfolder/t/turn_to_frog.txt +++ b/forge-gui/res/cardsfolder/t/turn_to_frog.txt @@ -2,6 +2,6 @@ Name:Turn to Frog ManaCost:1 U Types:Instant A:SP$ Animate | Cost$ 1 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Power$ 1 | Toughness$ 1 | RemoveAllAbilities$ True | Colors$ Blue | OverwriteColors$ True | Types$ Frog | RemoveCreatureTypes$ True | IsCurse$ True | SpellDescription$ Until end of turn, target creature loses all abilities and becomes a blue Frog with base power and toughness 1/1. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/turn_to_frog.jpg Oracle:Until end of turn, target creature loses all abilities and becomes a blue Frog with base power and toughness 1/1. diff --git a/forge-gui/res/cardsfolder/t/turnabout.txt b/forge-gui/res/cardsfolder/t/turnabout.txt index d03680fc4dc..d3e7fd44725 100644 --- a/forge-gui/res/cardsfolder/t/turnabout.txt +++ b/forge-gui/res/cardsfolder/t/turnabout.txt @@ -3,6 +3,6 @@ ManaCost:2 U U Types:Instant A:SP$ ChooseType | Cost$ 2 U U | Type$ Card | ValidTypes$ Artifact,Creature,Land | SubAbility$ DBTapOrUntapAll | SpellDescription$ Choose artifact, creature, or land. Tap all untapped permanents of the chosen type target player controls, or untap all tapped permanents of that type that player controls. SVar:DBTapOrUntapAll:DB$ TapOrUntapAll | ValidTgts$ Player | ValidCards$ Card.ChosenType | ValidMessage$ permanents of the chosen type target player controls -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/turnabout.jpg Oracle:Choose artifact, creature, or land. Tap all untapped permanents of the chosen type target player controls, or untap all tapped permanents of that type that player controls. diff --git a/forge-gui/res/cardsfolder/t/turntimber_sower.txt b/forge-gui/res/cardsfolder/t/turntimber_sower.txt index 972f5da9136..7a8cbabbf9d 100644 --- a/forge-gui/res/cardsfolder/t/turntimber_sower.txt +++ b/forge-gui/res/cardsfolder/t/turntimber_sower.txt @@ -4,6 +4,6 @@ Types:Creature Elf Druid PT:3/3 T:Mode$ ChangesZone | ValidCard$ Land.YouOwn | Origin$ Any | Destination$ Graveyard | Execute$ TrigToken | OncePerEffect$ True | TriggerZones$ Battlefield | TriggerDescription$ Whenever one or more land cards are put into your graveyard from anywhere, create a 0/1 green Plant creature token. SVar:TrigToken:DB$Token | TokenAmount$ 1 | TokenName$ Plant | TokenTypes$ Creature,Plant | TokenOwner$ You | TokenColors$ Green | TokenPower$ 0 | TokenToughness$ 1 | TokenImage$ g 0 1 plant c18 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random A:AB$ ChangeZone | Cost$ G Sac<3/Creature> | TgtPrompt$ Choose target land card in your graveyard | ValidTgts$ Land.YouCtrl | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target land card from your graveyard to your hand. Oracle:Whenever one or more land cards are put into your graveyard from anywhere, create a 0/1 green Plant creature token.\n{G}, Sacrifice three creatures: Return target land card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/t/turtleshell_changeling.txt b/forge-gui/res/cardsfolder/t/turtleshell_changeling.txt index af185e56731..b1ec63f1832 100644 --- a/forge-gui/res/cardsfolder/t/turtleshell_changeling.txt +++ b/forge-gui/res/cardsfolder/t/turtleshell_changeling.txt @@ -4,6 +4,6 @@ Types:Creature Shapeshifter PT:1/4 K:Changeling A:AB$ Pump | Cost$ 1 U | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch CARDNAME's power and toughness until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/turtleshell_changeling.jpg Oracle:Changeling (This card is every creature type.)\n{1}{U}: Switch Turtleshell Changeling's power and toughness until end of turn. diff --git a/forge-gui/res/cardsfolder/t/twiddle.txt b/forge-gui/res/cardsfolder/t/twiddle.txt index 36d66fa14b1..8963b185032 100644 --- a/forge-gui/res/cardsfolder/t/twiddle.txt +++ b/forge-gui/res/cardsfolder/t/twiddle.txt @@ -2,6 +2,6 @@ Name:Twiddle ManaCost:U Types:Instant A:SP$ TapOrUntap | Cost$ U | ValidTgts$ Artifact,Creature,Land | TgtPrompt$ Select target artifact, creature, or land | SpellDescription$ You may tap or untap target artifact, creature, or land. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/twiddle.jpg Oracle:You may tap or untap target artifact, creature, or land. diff --git a/forge-gui/res/cardsfolder/t/twilight_mire.txt b/forge-gui/res/cardsfolder/t/twilight_mire.txt index 19b07be3075..3bfa448b9cb 100644 --- a/forge-gui/res/cardsfolder/t/twilight_mire.txt +++ b/forge-gui/res/cardsfolder/t/twilight_mire.txt @@ -5,6 +5,6 @@ A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ BG T | Produced$ G | Amount$ 2 | SpellDescription$ Add {G}{G}. A:AB$ Mana | Cost$ BG T | Produced$ B G | SpellDescription$ Add {B}{G}. A:AB$ Mana | Cost$ BG T | Produced$ B | Amount$ 2 | SpellDescription$ Add {B}{B}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/twilight_mire.jpg Oracle:{T}: Add {C}.\n{B/G}, {T}: Add {B}{B}, {B}{G}, or {G}{G}. diff --git a/forge-gui/res/cardsfolder/t/twincast.txt b/forge-gui/res/cardsfolder/t/twincast.txt index 7e848f6e289..e7b413c3a05 100644 --- a/forge-gui/res/cardsfolder/t/twincast.txt +++ b/forge-gui/res/cardsfolder/t/twincast.txt @@ -2,6 +2,6 @@ Name:Twincast ManaCost:U U Types:Instant A:SP$ CopySpellAbility | Cost$ U U | ValidTgts$ Instant,Sorcery | TargetType$ Spell | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/twincast.jpg Oracle:Copy target instant or sorcery spell. You may choose new targets for the copy. diff --git a/forge-gui/res/cardsfolder/t/twinning_glass.txt b/forge-gui/res/cardsfolder/t/twinning_glass.txt index fe7f6f2d588..46cb035c7a3 100644 --- a/forge-gui/res/cardsfolder/t/twinning_glass.txt +++ b/forge-gui/res/cardsfolder/t/twinning_glass.txt @@ -2,6 +2,6 @@ Name:Twinning Glass ManaCost:4 Types:Artifact A:AB$ Play | Cost$ 1 T | Valid$ Card.nonLand+sharesNameWith ThisTurnCast | ValidZone$ Hand | Controller$ You | WithoutManaCost$ True | Optional$ True | SpellDescription$ You may cast a nonland card from your hand without paying its mana cost if it has the same name as a spell that was cast this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/twinning_glass.jpg Oracle:{1}, {T}: You may cast a nonland card from your hand without paying its mana cost if it has the same name as a spell that was cast this turn. diff --git a/forge-gui/res/cardsfolder/t/twist_allegiance.txt b/forge-gui/res/cardsfolder/t/twist_allegiance.txt index 223162efd10..ef358053e4d 100644 --- a/forge-gui/res/cardsfolder/t/twist_allegiance.txt +++ b/forge-gui/res/cardsfolder/t/twist_allegiance.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ GainControl | Cost$ 6 R | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | AllValid$ Creature.TargetedPlayerCtrl | RememberTargets$ True | AddKWs$ Haste | Untap$ True | NewController$ You | LoseControl$ EOT | RememberControlled$ True | StackDescription$ SpellDescription | SubAbility$ DBGainCtrlOpp | SpellDescription$ You and target opponent each gain control of all creatures the other controls until end of turn. Untap those creatures. Those creatures gain haste until end of turn. SVar:DBGainCtrlOpp:DB$ GainControl | AllValid$ Creature.IsNotRemembered+YouCtrl | AddKWs$ Haste | NewController$ Player.IsRemembered | Untap$ True | LoseControl$ EOT | StackDescription$ None | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/twist_allegiance.jpg Oracle:You and target opponent each gain control of all creatures the other controls until end of turn. Untap those creatures. Those creatures gain haste until end of turn. diff --git a/forge-gui/res/cardsfolder/t/twisted_image.txt b/forge-gui/res/cardsfolder/t/twisted_image.txt index 689321a32fb..a44785b0c6e 100644 --- a/forge-gui/res/cardsfolder/t/twisted_image.txt +++ b/forge-gui/res/cardsfolder/t/twisted_image.txt @@ -3,6 +3,6 @@ ManaCost:U Types:Instant A:SP$ Pump | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch target creature's power and toughness until end of turn. | SubAbility$ DBDraw SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/twisted_image.jpg Oracle:Switch target creature's power and toughness until end of turn.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/t/twitch.txt b/forge-gui/res/cardsfolder/t/twitch.txt index 913227ef516..6bee508efd1 100644 --- a/forge-gui/res/cardsfolder/t/twitch.txt +++ b/forge-gui/res/cardsfolder/t/twitch.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Instant A:SP$ TapOrUntap | Cost$ 2 U | ValidTgts$ Artifact,Creature,Land | TgtPrompt$ Select target artifact, creature, or land | SubAbility$ DBDraw | SpellDescription$ You may tap or untap target artifact, creature, or land. SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/twitch.jpg Oracle:You may tap or untap target artifact, creature, or land.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/t/typhoon.txt b/forge-gui/res/cardsfolder/t/typhoon.txt index 8f1710a4639..3bd91a4be51 100644 --- a/forge-gui/res/cardsfolder/t/typhoon.txt +++ b/forge-gui/res/cardsfolder/t/typhoon.txt @@ -5,6 +5,6 @@ A:SP$ RepeatEach | Cost$ 2 G | RepeatPlayers$ Player.Opponent | RepeatSubAbility SVar:TyphoonDmg:DB$ DealDamage | Defined$ Remembered | NumDmg$ X | References$ X SVar:X:Count$Valid Island.RememberedPlayerCtrl SVar:AIPlayForSub:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/typhoon.jpg Oracle:Typhoon deals damage to each opponent equal to the number of Islands that player controls. diff --git a/forge-gui/res/cardsfolder/t/tyrants_familiar.txt b/forge-gui/res/cardsfolder/t/tyrants_familiar.txt index c944a764e4a..d8f2c3238f1 100644 --- a/forge-gui/res/cardsfolder/t/tyrants_familiar.txt +++ b/forge-gui/res/cardsfolder/t/tyrants_familiar.txt @@ -9,6 +9,6 @@ SVar:TrigAttacks:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDealDamage SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Creature.DefenderCtrl | TgtPrompt$ Select target creature defending player controls | NumDmg$ 7 SVar:X:Count$Valid Card.IsCommander+YouOwn+YouCtrl SVar:BuffedBy:Card.IsCommander -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/tyrants_familiar.jpg Oracle:Flying, haste\nLieutenant — As long as you control your commander, Tyrant's Familiar gets +2/+2 and has "Whenever Tyrant's Familiar attacks, it deals 7 damage to target creature defending player controls." diff --git a/forge-gui/res/cardsfolder/u/ugins_nexus.txt b/forge-gui/res/cardsfolder/u/ugins_nexus.txt index bde595aed88..95f442e2327 100644 --- a/forge-gui/res/cardsfolder/u/ugins_nexus.txt +++ b/forge-gui/res/cardsfolder/u/ugins_nexus.txt @@ -5,7 +5,7 @@ S:Mode$ Continuous | Affected$ Player | AddKeyword$ If you would begin an extra R:Event$ Moved | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | ReplaceWith$ DBExile | Description$ If CARDNAME would be put into a graveyard from the battlefield, instead exile it and take an extra turn after this one. SVar:DBExile:DB$ ChangeZone | Defined$ ReplacedCard | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBAddTurn SVar:DBAddTurn:DB$ AddTurn | Defined$ ReplacedCardLKIController | NumTurns$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:SacMe:5 SVar:Picture:http://www.wizards.com/global/images/magic/general/ugins_nexus.jpg Oracle:If a player would begin an extra turn, that player skips that turn instead.\nIf Ugin's Nexus would be put into a graveyard from the battlefield, instead exile it and take an extra turn after this one. diff --git a/forge-gui/res/cardsfolder/u/ulvenwald_tracker.txt b/forge-gui/res/cardsfolder/u/ulvenwald_tracker.txt index e652a5eb4ce..87c25c15445 100644 --- a/forge-gui/res/cardsfolder/u/ulvenwald_tracker.txt +++ b/forge-gui/res/cardsfolder/u/ulvenwald_tracker.txt @@ -4,6 +4,6 @@ Types:Creature Human Shaman PT:1/1 A:AB$ Pump | Cost$ 1 G T | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Choose target creature you control | SubAbility$ TrackerFight | StackDescription$ None | SpellDescription$ Target creature you control fights another target creature. SVar:TrackerFight:DB$ Fight | Defined$ ParentTarget | ValidTgts$ Creature | TargetUnique$ True | TgtPrompt$ Choose target creature to fight the first target -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ulvenwald_tracker.jpg Oracle:{1}{G}, {T}: Target creature you control fights another target creature. diff --git a/forge-gui/res/cardsfolder/u/umbilicus.txt b/forge-gui/res/cardsfolder/u/umbilicus.txt index 96b2f17e237..6b4e164fa1e 100644 --- a/forge-gui/res/cardsfolder/u/umbilicus.txt +++ b/forge-gui/res/cardsfolder/u/umbilicus.txt @@ -3,6 +3,6 @@ ManaCost:4 Types:Artifact T:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | Execute$ TrigChangeZone | TriggerDescription$ At the beginning of each player's upkeep, that player returns a permanent they control to its owner's hand unless they pay 2 life. SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | ChangeType$ Permanent | DefinedPlayer$ TriggeredPlayer | ChangeNum$ 1 | Hidden$ True | Mandatory$ True | UnlessCost$ PayLife<2> | UnlessPayer$ TriggeredPlayer -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/umbilicus.jpg Oracle:At the beginning of each player's upkeep, that player returns a permanent they control to its owner's hand unless they pay 2 life. diff --git a/forge-gui/res/cardsfolder/u/unbender_tine.txt b/forge-gui/res/cardsfolder/u/unbender_tine.txt index 8be710a681b..4cb7949b6c2 100644 --- a/forge-gui/res/cardsfolder/u/unbender_tine.txt +++ b/forge-gui/res/cardsfolder/u/unbender_tine.txt @@ -2,6 +2,6 @@ Name:Unbender Tine ManaCost:2 W U Types:Artifact A:AB$ Untap | Cost$ T | ValidTgts$ Permanent.Other | TgtPrompt$ Select another target permanent. | SpellDescription$ Untap another target permanent. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/unbender_tine.jpg Oracle:{T}: Untap another target permanent. diff --git a/forge-gui/res/cardsfolder/u/unbreathing_horde.txt b/forge-gui/res/cardsfolder/u/unbreathing_horde.txt index f53e3234f44..8eea45743b5 100644 --- a/forge-gui/res/cardsfolder/u/unbreathing_horde.txt +++ b/forge-gui/res/cardsfolder/u/unbreathing_horde.txt @@ -8,6 +8,6 @@ SVar:DBRemoveCounters:DB$ RemoveCounter | Defined$ Self | CounterType$ P1P1 | Co SVar:X:Count$LastStateBattlefield Zombie.YouCtrl/Plus.Y SVar:Y:Count$LastStateGraveyard Zombie.YouCtrl SVar:NeedsToPlayVar:X GE1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/unbreathing_horde.jpg Oracle:Unbreathing Horde enters the battlefield with a +1/+1 counter on it for each other Zombie you control and each Zombie card in your graveyard.\nIf Unbreathing Horde would be dealt damage, prevent that damage and remove a +1/+1 counter from it. diff --git a/forge-gui/res/cardsfolder/u/uncage_the_menagerie.txt b/forge-gui/res/cardsfolder/u/uncage_the_menagerie.txt index efc3a521880..4a5efce9bff 100644 --- a/forge-gui/res/cardsfolder/u/uncage_the_menagerie.txt +++ b/forge-gui/res/cardsfolder/u/uncage_the_menagerie.txt @@ -3,6 +3,6 @@ ManaCost:X G G Types:Sorcery A:SP$ ChangeZone | Cost$ X G G | Origin$ Library | Destination$ Hand | ChangeType$ Creature.cmcEQX | ChangeNum$ X | DifferentNames$ True | SpellDescription$ Search your library for up to X creature cards with different names that each have converted mana cost X, reveal them, put them into your hand, then shuffle your library. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/uncage_the_menagerie.jpg Oracle:Search your library for up to X creature cards with different names that each have converted mana cost X, reveal them, put them into your hand, then shuffle your library. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/u/unchecked_growth.txt b/forge-gui/res/cardsfolder/u/unchecked_growth.txt index c6e5c4efefa..7b54c0fdc46 100644 --- a/forge-gui/res/cardsfolder/u/unchecked_growth.txt +++ b/forge-gui/res/cardsfolder/u/unchecked_growth.txt @@ -3,7 +3,7 @@ ManaCost:2 G Types:Instant Arcane A:SP$ Pump | Cost$ 2 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +4 | NumDef$ +4 | SubAbility$ DBTrample | SpellDescription$ Target creature gets +4/+4 until end of turn. If it's a Spirit, it gains trample until end of turn. SVar:DBTrample:DB$ Pump | Defined$ Targeted | KW$ Trample | ConditionDefined$ Targeted | ConditionPresent$ Spirit | ConditionCompare$ GE1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Spirit SVar:Picture:http://www.wizards.com/global/images/magic/general/unchecked_growth.jpg Oracle:Target creature gets +4/+4 until end of turn. If it's a Spirit, it gains trample until end of turn. diff --git a/forge-gui/res/cardsfolder/u/undead_warchief.txt b/forge-gui/res/cardsfolder/u/undead_warchief.txt index c1a1b5e8d3e..5342ab3a833 100644 --- a/forge-gui/res/cardsfolder/u/undead_warchief.txt +++ b/forge-gui/res/cardsfolder/u/undead_warchief.txt @@ -5,6 +5,6 @@ PT:1/1 S:Mode$ ReduceCost | ValidCard$ Zombie | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Zombie spells you cast cost {1} less to cast. S:Mode$ Continuous | Affected$ Creature.Zombie+YouCtrl | AddPower$ 2 | AddToughness$ 1 | Description$ Zombie creatures you control get +2/+1. SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/undead_warchief.jpg Oracle:Zombie spells you cast cost {1} less to cast.\nZombie creatures you control get +2/+1. diff --git a/forge-gui/res/cardsfolder/u/undergrowth.txt b/forge-gui/res/cardsfolder/u/undergrowth.txt index d0d9f221a53..ed45fa0aff2 100644 --- a/forge-gui/res/cardsfolder/u/undergrowth.txt +++ b/forge-gui/res/cardsfolder/u/undergrowth.txt @@ -6,7 +6,7 @@ K:Kicker:2 R:Generic A:SP$ Fog | Cost$ G | Condition$ OptionalCost | ConditionOptionalPaid$ False | SubAbility$ DBEffect | SpellDescription$ Prevent all combat damage that would be dealt this turn. If its additional cost was paid, CARDNAME doesn't affect combat damage that would be dealt by red creatures. | StackDescription$ SpellDescription SVar:DBEffect:DB$ Effect | Condition$ OptionalCost | ConditionOptionalPaid$ True | Name$ Undergrowth Effect | StaticAbilities$ KWPump SVar:KWPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.nonRed | AddKeyword$ Prevent all combat damage that would be dealt by CARDNAME. | Description$ Prevent all combat damage this turn except that from red creatures. -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHints:Color$Red SVar:Picture:http://www.wizards.com/global/images/magic/general/undergrowth.jpg Oracle:As an additional cost to cast Undergrowth, you may pay {2}{R}.\nPrevent all combat damage that would be dealt this turn. If its additional cost was paid, Undergrowth doesn't affect combat damage that would be dealt by red creatures. diff --git a/forge-gui/res/cardsfolder/u/undertow.txt b/forge-gui/res/cardsfolder/u/undertow.txt index 1266780b94d..63ec52c8417 100644 --- a/forge-gui/res/cardsfolder/u/undertow.txt +++ b/forge-gui/res/cardsfolder/u/undertow.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Enchantment S:Mode$ Continuous | Affected$ Creature.withIslandwalk | AddHiddenKeyword$ May be blocked as though it doesn't have Islandwalk. | Description$ Creatures with islandwalk can be blocked as though they didn't have islandwalk. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/undertow.jpg Oracle:Creatures with islandwalk can be blocked as though they didn't have islandwalk. diff --git a/forge-gui/res/cardsfolder/u/undying_beast.txt b/forge-gui/res/cardsfolder/u/undying_beast.txt index f05a68144ce..7b77e56a5d8 100644 --- a/forge-gui/res/cardsfolder/u/undying_beast.txt +++ b/forge-gui/res/cardsfolder/u/undying_beast.txt @@ -4,6 +4,6 @@ Types:Creature Beast PT:3/2 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChange | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, put CARDNAME on top of its owner's library. SVar:TrigChange:DB$ ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Library | LibraryPosition$ 0 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4242.jpg Oracle:When Undying Beast dies, put it on top of its owner's library. diff --git a/forge-gui/res/cardsfolder/u/undying_evil.txt b/forge-gui/res/cardsfolder/u/undying_evil.txt index 6ef2cece7b1..9b12eb09a41 100644 --- a/forge-gui/res/cardsfolder/u/undying_evil.txt +++ b/forge-gui/res/cardsfolder/u/undying_evil.txt @@ -2,6 +2,6 @@ Name:Undying Evil ManaCost:B Types:Instant A:SP$ Pump | Cost$ B | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Undying | SpellDescription$ Target creature gains undying until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/undying_evil.jpg Oracle:Target creature gains undying until end of turn. (When it dies, if it had no +1/+1 counters on it, return it to the battlefield under its owner's control with a +1/+1 counter on it.) diff --git a/forge-gui/res/cardsfolder/u/undying_flames.txt b/forge-gui/res/cardsfolder/u/undying_flames.txt index a167c519787..77d17812b7f 100644 --- a/forge-gui/res/cardsfolder/u/undying_flames.txt +++ b/forge-gui/res/cardsfolder/u/undying_flames.txt @@ -6,6 +6,6 @@ A:SP$ DigUntil | Cost$ 4 R R | Defined$ You | Valid$ Card.nonLand | ValidDescrip SVar:UndyingDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ FlameX | References$ FlameX | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:FlameX:Remembered$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/undying_flames.jpg Oracle:Exile cards from the top of your library until you exile a nonland card. Undying Flames deals damage to any target equal to that card's converted mana cost.\nEpic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability. You may choose a new target for the copy.) diff --git a/forge-gui/res/cardsfolder/u/unearthly_blizzard.txt b/forge-gui/res/cardsfolder/u/unearthly_blizzard.txt index 3f8fbe2815d..c6ada994993 100644 --- a/forge-gui/res/cardsfolder/u/unearthly_blizzard.txt +++ b/forge-gui/res/cardsfolder/u/unearthly_blizzard.txt @@ -2,6 +2,6 @@ Name:Unearthly Blizzard ManaCost:2 R Types:Sorcery Arcane A:SP$ Pump | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | TargetMin$ 0 | TargetMax$ 3 | KW$ CARDNAME can't block. | IsCurse$ True | SpellDescription$ Up to three target creatures can't block this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/unearthly_blizzard.jpg Oracle:Up to three target creatures can't block this turn. diff --git a/forge-gui/res/cardsfolder/u/unerring_sling.txt b/forge-gui/res/cardsfolder/u/unerring_sling.txt index 567666903ef..3c0678e44c9 100644 --- a/forge-gui/res/cardsfolder/u/unerring_sling.txt +++ b/forge-gui/res/cardsfolder/u/unerring_sling.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact A:AB$ DealDamage | Cost$ 3 T tapXType<1/Creature> | ValidTgts$Creature.attacking+withFlying,Creature.blocking+withFlying | TgtPrompt$ Select target attacking or blocking creature with Flying | NumDmg$ X | SpellDescription$ CARDNAME deals damage equal to the tapped creature's power to target attacking or blocking creature with flying. SVar:X:Tapped$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/unerring_sling.jpg Oracle:{3}, {T}, Tap an untapped creature you control: Unerring Sling deals damage equal to the tapped creature's power to target attacking or blocking creature with flying. diff --git a/forge-gui/res/cardsfolder/u/unfulfilled_desires.txt b/forge-gui/res/cardsfolder/u/unfulfilled_desires.txt index 3397917c992..218bddaa665 100644 --- a/forge-gui/res/cardsfolder/u/unfulfilled_desires.txt +++ b/forge-gui/res/cardsfolder/u/unfulfilled_desires.txt @@ -3,7 +3,7 @@ ManaCost:1 U B Types:Enchantment A:AB$ Draw | Cost$ 1 PayLife<1> | NumCards$ 1 | SpellDescription$ Draw a card, then discard a card. | SubAbility$ DBDiscard SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/unfulfilled_desires.jpg Oracle:{1}, Pay 1 life: Draw a card, then discard a card. diff --git a/forge-gui/res/cardsfolder/u/unholy_citadel.txt b/forge-gui/res/cardsfolder/u/unholy_citadel.txt index ea8b3f2e3e0..94e90a2018b 100644 --- a/forge-gui/res/cardsfolder/u/unholy_citadel.txt +++ b/forge-gui/res/cardsfolder/u/unholy_citadel.txt @@ -2,7 +2,7 @@ Name:Unholy Citadel ManaCost:no cost Types:Land S:Mode$ Continuous | Affected$ Creature.Black+Legendary | AddKeyword$ Bands with Other Legendary Creatures | Description$ Black legendary creatures you control have "bands with other legendary creatures." (Any legendary creatures can attack in a band as long as at least one has "bands with other legendary creatures." Bands are blocked as a group. If at least two legendary creatures you control, one of which has "bands with other legendary creatures," are blocking or being blocked by the same creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/unholy_citadel.jpg Oracle:Black legendary creatures you control have "bands with other legendary creatures." (Any legendary creatures can attack in a band as long as at least one has "bands with other legendary creatures." Bands are blocked as a group. If at least two legendary creatures you control, one of which has "bands with other legendary creatures," are blocking or being blocked by the same creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/u/unholy_grotto.txt b/forge-gui/res/cardsfolder/u/unholy_grotto.txt index f6f549559a4..b49c015dbe7 100644 --- a/forge-gui/res/cardsfolder/u/unholy_grotto.txt +++ b/forge-gui/res/cardsfolder/u/unholy_grotto.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ ChangeZone | Cost$ B T | TgtPrompt$ Choose target Zombie card in your graveyard | ValidTgts$ Zombie.YouCtrl | Origin$ Graveyard | Destination$ Library | SpellDescription$ Put target Zombie card from your graveyard on top of your library. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/unholy_grotto.jpg Oracle:{T}: Add {C}.\n{B}, {T}: Put target Zombie card from your graveyard on top of your library. diff --git a/forge-gui/res/cardsfolder/u/unified_strike.txt b/forge-gui/res/cardsfolder/u/unified_strike.txt index 555f3dba27d..500d873079a 100644 --- a/forge-gui/res/cardsfolder/u/unified_strike.txt +++ b/forge-gui/res/cardsfolder/u/unified_strike.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ ChangeZone | Cost$ W | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ1 | References$ X,Y | SpellDescription$ Exile target attacking creature if its power is less than or equal to the number of Soldiers on the battlefield. SVar:Y:Count$Valid Soldier SVar:X:Targeted$Valid Creature.powerLEY -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/unified_strike.jpg Oracle:Exile target attacking creature if its power is less than or equal to the number of Soldiers on the battlefield. diff --git a/forge-gui/res/cardsfolder/u/unifying_theory.txt b/forge-gui/res/cardsfolder/u/unifying_theory.txt index b98d9d833e4..5e2a747927a 100644 --- a/forge-gui/res/cardsfolder/u/unifying_theory.txt +++ b/forge-gui/res/cardsfolder/u/unifying_theory.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Enchantment T:Mode$ SpellCast | ValidCard$ Card | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever a player casts a spell, that player may pay {2}. If the player does, they draw a card. SVar:TrigDraw:DB$ Draw | Defined$ TriggeredActivator | NumCards$ 1 | UnlessCost$ 2 | UnlessPayer$ TriggeredActivator | UnlessSwitched$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/unifying_theory.jpg Oracle:Whenever a player casts a spell, that player may pay {2}. If the player does, they draw a card. diff --git a/forge-gui/res/cardsfolder/u/unknown_shores.txt b/forge-gui/res/cardsfolder/u/unknown_shores.txt index e143bd414eb..8e079d5024b 100644 --- a/forge-gui/res/cardsfolder/u/unknown_shores.txt +++ b/forge-gui/res/cardsfolder/u/unknown_shores.txt @@ -3,7 +3,7 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ 1 T | Produced$ Any | SpellDescription$ Add one mana of any color. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHas:Ability$Mana.Colorless DeckHints:Color$Colorless & Keyword$Devoid SVar:Picture:http://www.wizards.com/global/images/magic/general/unknown_shores.jpg diff --git a/forge-gui/res/cardsfolder/u/unlikely_alliance.txt b/forge-gui/res/cardsfolder/u/unlikely_alliance.txt index 00b5c97f6e7..1b07cc51475 100644 --- a/forge-gui/res/cardsfolder/u/unlikely_alliance.txt +++ b/forge-gui/res/cardsfolder/u/unlikely_alliance.txt @@ -2,6 +2,6 @@ Name:Unlikely Alliance ManaCost:1 W Types:Enchantment A:AB$ Pump | Cost$ 1 W | ValidTgts$ Creature.notattacking+notblocking | TgtPrompt$ Select target nonattacking, nonblocking creature | NumDef$ +2 | SpellDescription$ Target nonattacking, nonblocking creature gets +0/+2 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/unlikely_alliance.jpg Oracle:{1}{W}: Target nonattacking, nonblocking creature gets +0/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/u/unmask.txt b/forge-gui/res/cardsfolder/u/unmask.txt index 31efa29e08a..ca53e91df7c 100644 --- a/forge-gui/res/cardsfolder/u/unmask.txt +++ b/forge-gui/res/cardsfolder/u/unmask.txt @@ -3,6 +3,6 @@ ManaCost:3 B Types:Sorcery A:SP$ Discard | Cost$ 3 B | ValidTgts$ Player | Mode$ RevealYouChoose | DiscardValid$ Card.nonLand | NumCards$ 1 | SpellDescription$ Target player reveals their hand. You choose a nonland card from it. That player discards that card. SVar:AltCost:Cost$ ExileFromHand<1/Card.Black> | Description$ You may exile one black card from your hand rather than pay CARDNAME's mana cost. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/unmask.jpg Oracle:You may exile a black card from your hand rather than pay Unmask's mana cost.\nTarget player reveals their hand. You choose a nonland card from it. That player discards that card. diff --git a/forge-gui/res/cardsfolder/u/unnatural_selection.txt b/forge-gui/res/cardsfolder/u/unnatural_selection.txt index bd0254a1d5b..b64cb964a2b 100644 --- a/forge-gui/res/cardsfolder/u/unnatural_selection.txt +++ b/forge-gui/res/cardsfolder/u/unnatural_selection.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Enchantment A:AB$ ChooseType | Cost$ 1 | Defined$ You | Type$ Creature | InvalidTypes$ Wall | SubAbility$ DBAnimate | SpellDescription$ Choose a creature type other than Wall. Target creature becomes that type until end of turn. SVar:DBAnimate:DB$ Animate | ValidTgts$ Creature | TgtPrompt$ Select target creature | Types$ ChosenType | RemoveCreatureTypes$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/unnatural_selection.jpg Oracle:{1}: Choose a creature type other than Wall. Target creature becomes that type until end of turn. diff --git a/forge-gui/res/cardsfolder/u/unnerving_assault.txt b/forge-gui/res/cardsfolder/u/unnerving_assault.txt index 6c62ff91f9e..4c9522dca0f 100644 --- a/forge-gui/res/cardsfolder/u/unnerving_assault.txt +++ b/forge-gui/res/cardsfolder/u/unnerving_assault.txt @@ -3,6 +3,6 @@ ManaCost:2 UR Types:Instant A:SP$ PumpAll | Cost$ 2 UR | ValidCards$ Creature.OppCtrl | NumAtt$ -1 | IsCurse$ True | ConditionManaSpent$ U | SubAbility$ RPaid | SpellDescription$ Creatures your opponents control get -1/-0 until end of turn if {U} was spent to cast CARDNAME, and creatures you control get +1/+0 until end of turn if {R} was spent to cast it. (Do both if {U}{R} was spent.) SVar:RPaid:DB$ PumpAll | ValidCards$ Creature.YouCtrl | NumAtt$ 1 | ConditionManaSpent$ R -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/unnerving_assault.jpg Oracle:Creatures your opponents control get -1/-0 until end of turn if {U} was spent to cast Unnerving Assault, and creatures you control get +1/+0 until end of turn if {R} was spent to cast it. (Do both if {U}{R} was spent.) diff --git a/forge-gui/res/cardsfolder/u/unspeakable_symbol.txt b/forge-gui/res/cardsfolder/u/unspeakable_symbol.txt index 54641c4d033..f00c559fcba 100644 --- a/forge-gui/res/cardsfolder/u/unspeakable_symbol.txt +++ b/forge-gui/res/cardsfolder/u/unspeakable_symbol.txt @@ -2,6 +2,6 @@ Name:Unspeakable Symbol ManaCost:1 B B Types:Enchantment A:AB$ PutCounter | Cost$ PayLife<3> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/unspeakable_symbol.jpg Oracle:Pay 3 life: Put a +1/+1 counter on target creature. diff --git a/forge-gui/res/cardsfolder/u/unstable_footing.txt b/forge-gui/res/cardsfolder/u/unstable_footing.txt index aaff190f980..3eb6e3c4a4a 100644 --- a/forge-gui/res/cardsfolder/u/unstable_footing.txt +++ b/forge-gui/res/cardsfolder/u/unstable_footing.txt @@ -5,6 +5,6 @@ K:Kicker:3 R A:SP$ Effect | Cost$ R | Name$ Unstable Footing | StaticAbilities$ STCantPrevent | SubAbility$ DBDamage | SpellDescription$ Damage can't be prevented this turn. If CARDNAME was kicked, it deals 5 damage to target player or planeswalker. SVar:STCantPrevent:Mode$ Continuous | EffectZone$ Command | GlobalRule$ Damage can't be prevented. | Description$ Damage can't be prevented. SVar:DBDamage:DB$ DealDamage | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | NumDmg$ 5 | NoPrevention$ True | Condition$ Kicked | ConditionDescription$ If it was kicked, -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/unstable_footing.jpg Oracle:Kicker {3}{R} (You may pay an additional {3}{R} as you cast this spell.)\nDamage can't be prevented this turn. If Unstable Footing was kicked, it deals 5 damage to target player or planeswalker. diff --git a/forge-gui/res/cardsfolder/u/unstable_frontier.txt b/forge-gui/res/cardsfolder/u/unstable_frontier.txt index 0e3276eaf00..73d7f4047ee 100644 --- a/forge-gui/res/cardsfolder/u/unstable_frontier.txt +++ b/forge-gui/res/cardsfolder/u/unstable_frontier.txt @@ -4,6 +4,6 @@ Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ ChooseType | Cost$ T | Defined$ You | Type$ Basic Land | SubAbility$ DBAnimate | SpellDescription$ Target land you control becomes the basic land type of your choice until end of turn. SVar:DBAnimate:DB$ Animate | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | Types$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/unstable_frontier.jpg Oracle:{T}: Add {C}.\n{T}: Target land you control becomes the basic land type of your choice until end of turn. diff --git a/forge-gui/res/cardsfolder/u/unstoppable_ash.txt b/forge-gui/res/cardsfolder/u/unstoppable_ash.txt index 516d2ebfa3b..b70c62bc3ef 100644 --- a/forge-gui/res/cardsfolder/u/unstoppable_ash.txt +++ b/forge-gui/res/cardsfolder/u/unstoppable_ash.txt @@ -6,6 +6,6 @@ K:Trample K:Champion:Treefolk,Warrior T:Mode$ AttackerBlocked | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a creature you control becomes blocked, it gets +0/+5 until end of turn. SVar:TrigPump:DB$Pump | Defined$ TriggeredAttacker | NumDef$ +5 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/unstoppable_ash.jpg Oracle:Trample\nChampion a Treefolk or Warrior (When this enters the battlefield, sacrifice it unless you exile another Treefolk or Warrior you control. When this leaves the battlefield, that card returns to the battlefield.)\nWhenever a creature you control becomes blocked, it gets +0/+5 until end of turn. diff --git a/forge-gui/res/cardsfolder/u/untaidake_the_cloud_keeper.txt b/forge-gui/res/cardsfolder/u/untaidake_the_cloud_keeper.txt index 8283093974f..c75012775d2 100644 --- a/forge-gui/res/cardsfolder/u/untaidake_the_cloud_keeper.txt +++ b/forge-gui/res/cardsfolder/u/untaidake_the_cloud_keeper.txt @@ -3,7 +3,7 @@ ManaCost:no cost Types:Legendary Land K:CARDNAME enters the battlefield tapped. A:AB$ Mana | Cost$ T PayLife<2> | Produced$ C | Amount$ 2 | RestrictValid$ Card.Legendary | SpellDescription$ Add {C}{C}. Spend this mana only to cast legendary spells. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Legendary SVar:Picture:http://www.wizards.com/global/images/magic/general/untaidake_the_cloud_keeper.jpg Oracle:Untaidake, the Cloud Keeper enters the battlefield tapped.\n{T}, Pay 2 life: Add {C}{C}. Spend this mana only to cast legendary spells. diff --git a/forge-gui/res/cardsfolder/u/unwinding_clock.txt b/forge-gui/res/cardsfolder/u/unwinding_clock.txt index c73311fcb46..da9c75a2437 100644 --- a/forge-gui/res/cardsfolder/u/unwinding_clock.txt +++ b/forge-gui/res/cardsfolder/u/unwinding_clock.txt @@ -2,6 +2,6 @@ Name:Unwinding Clock ManaCost:4 Types:Artifact S:Mode$ Continuous | Affected$ Artifact.YouCtrl | AddHiddenKeyword$ CARDNAME untaps during each other player's untap step. | Description$ Untap all artifacts you control during each other player's untap step. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/unwinding_clock.jpg Oracle:Untap all artifacts you control during each other player's untap step. diff --git a/forge-gui/res/cardsfolder/u/upwelling.txt b/forge-gui/res/cardsfolder/u/upwelling.txt index 7b26a1678a1..2ef975ae615 100644 --- a/forge-gui/res/cardsfolder/u/upwelling.txt +++ b/forge-gui/res/cardsfolder/u/upwelling.txt @@ -3,6 +3,6 @@ ManaCost:3 G Types:Enchantment S:Mode$ Continuous | GlobalRule$ Mana pools don't empty as steps and phases end. | Description$ Players don't lose unspent mana as steps and phases end. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/upwelling.jpg Oracle:Players don't lose unspent mana as steps and phases end. diff --git a/forge-gui/res/cardsfolder/u/urborg.txt b/forge-gui/res/cardsfolder/u/urborg.txt index 2b00f04b460..257eacd714d 100644 --- a/forge-gui/res/cardsfolder/u/urborg.txt +++ b/forge-gui/res/cardsfolder/u/urborg.txt @@ -5,6 +5,6 @@ A:AB$ Mana | Cost$ T | Produced$ B | Amount$ 1 | SpellDescription$ Add {B}. A:AB$ GenericChoice | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | Choices$ DebuffFS,DebuffSW | Defined$ You | SpellDescription$ Target creature loses first strike or swampwalk until end of turn. SVar:DebuffFS:DB$ Debuff | Keywords$ First Strike | Defined$ Targeted | SpellDescription$ Target creature loses first strike until end of turn. SVar:DebuffSW:DB$ Debuff | Defined$ Targeted | Keywords$ Swampwalk | SpellDescription$ Target creature loses swampwalk until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/urborg.jpg Oracle:{T}: Add {B}.\n{T}: Target creature loses first strike or swampwalk until end of turn. diff --git a/forge-gui/res/cardsfolder/u/urborg_panther.txt b/forge-gui/res/cardsfolder/u/urborg_panther.txt index 0f3a7d83e0b..68d471116a7 100644 --- a/forge-gui/res/cardsfolder/u/urborg_panther.txt +++ b/forge-gui/res/cardsfolder/u/urborg_panther.txt @@ -4,7 +4,7 @@ Types:Creature Nightstalker Cat PT:2/2 A:AB$ Destroy | Cost$ B Sac<1/CARDNAME> | ValidTgts$ Creature.blockingSource | TgtPrompt$ Destroy target creature blocking this creature | SpellDescription$ Destroy target creature blocking CARDNAME. A:AB$ ChangeZone | Cost$ Sac<1/Creature.namedFeral Shadow/creature named Feral Shadow> Sac<1/Creature.namedBreathstealer/creature named Breathstealer> Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | ChangeType$ Card.namedSpirit of the Night | ChangeNum$ 1 | SpellDescription$ Search your library for a card named Spirit of the Night and put that card onto the battlefield. Then shuffle your library. -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHints:Name$Breathstealer|Feral Shadow|Spirit of the Night|Urborg Panther SVar:Picture:http://www.wizards.com/global/images/magic/general/urborg_panther.jpg Oracle:{B}, Sacrifice Urborg Panther: Destroy target creature blocking Urborg Panther.\nSacrifice a creature named Feral Shadow, a creature named Breathstealer, and Urborg Panther: Search your library for a card named Spirit of the Night and put that card onto the battlefield. Then shuffle your library. diff --git a/forge-gui/res/cardsfolder/u/urborg_shambler.txt b/forge-gui/res/cardsfolder/u/urborg_shambler.txt index 2a200d17c47..1433221094e 100644 --- a/forge-gui/res/cardsfolder/u/urborg_shambler.txt +++ b/forge-gui/res/cardsfolder/u/urborg_shambler.txt @@ -3,6 +3,6 @@ ManaCost:2 B B Types:Creature Horror PT:4/3 S:Mode$ Continuous | Affected$ Creature.Black+Other | AddPower$ -1 | AddToughness$ -1 | Description$ Other black creatures get -1/-1. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/urborg_shambler.jpg Oracle:Other black creatures get -1/-1. diff --git a/forge-gui/res/cardsfolder/u/urborg_tomb_of_yawgmoth.txt b/forge-gui/res/cardsfolder/u/urborg_tomb_of_yawgmoth.txt index ee464cc295e..1cf09fd78c2 100644 --- a/forge-gui/res/cardsfolder/u/urborg_tomb_of_yawgmoth.txt +++ b/forge-gui/res/cardsfolder/u/urborg_tomb_of_yawgmoth.txt @@ -2,6 +2,6 @@ Name:Urborg, Tomb of Yawgmoth ManaCost:no cost Types:Legendary Land S:Mode$ Continuous | Affected$ Land | AddType$ Swamp | Description$ Each land is a Swamp in addition to its other land types. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/urborg_tomb_of_yawgmoth.jpg Oracle:Each land is a Swamp in addition to its other land types. diff --git a/forge-gui/res/cardsfolder/u/urzas_avenger.txt b/forge-gui/res/cardsfolder/u/urzas_avenger.txt index 005a3a98401..9f18ee7abb7 100644 --- a/forge-gui/res/cardsfolder/u/urzas_avenger.txt +++ b/forge-gui/res/cardsfolder/u/urzas_avenger.txt @@ -8,6 +8,6 @@ SVar:DBFlying:DB$ Pump | KW$ Flying | Defined$ Self | SpellDescription$ Target c SVar:DBBanding:DB$ Pump | KW$ Banding | Defined$ Self | SpellDescription$ Target creature gains Banding until end of turn. SVar:DBFirstStrike:DB$ Pump | KW$ First Strike | Defined$ Self | SpellDescription$ Target creature gains First Strike until end of turn. SVar:DBTrample:DB$ Pump | KW$ Trample | Defined$ Self | SpellDescription$ Target creature gains Trample until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/urzas_avenger.jpg Oracle:{0}: Urza's Avenger gets -1/-1 and gains your choice of banding, flying, first strike, or trample until end of turn. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/u/urzas_bauble.txt b/forge-gui/res/cardsfolder/u/urzas_bauble.txt index 0c937a873c1..e8d82f534ff 100644 --- a/forge-gui/res/cardsfolder/u/urzas_bauble.txt +++ b/forge-gui/res/cardsfolder/u/urzas_bauble.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ Reveal | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Player | TgtPrompt$ Select target player | Random$ True | SubAbility$ DelTrigSlowtrip | SpellDescription$ Look at a card at random in target player's hand. You draw a card at the beginning of the next turn's upkeep. SVar:DelTrigSlowtrip:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ DrawSlowtrip | TriggerDescription$ Draw a card. SVar:DrawSlowtrip:DB$Draw | NumCards$ 1 | Defined$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/urzas_bauble.jpg Oracle:{T}, Sacrifice Urza's Bauble: Look at a card at random in target player's hand. You draw a card at the beginning of the next turn's upkeep. diff --git a/forge-gui/res/cardsfolder/u/urzas_chalice.txt b/forge-gui/res/cardsfolder/u/urzas_chalice.txt index a4f6beed7d4..b6ad6c10753 100644 --- a/forge-gui/res/cardsfolder/u/urzas_chalice.txt +++ b/forge-gui/res/cardsfolder/u/urzas_chalice.txt @@ -3,6 +3,6 @@ ManaCost:1 Types:Artifact T:Mode$ SpellCast | ValidCard$ Artifact | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever a player casts an artifact spell, you may pay {1}. If you do, you gain 1 life. SVar:TrigGainLife:AB$GainLife | Cost$ 1 | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/urzas_chalice.jpg Oracle:Whenever a player casts an artifact spell, you may pay {1}. If you do, you gain 1 life. diff --git a/forge-gui/res/cardsfolder/u/urzas_engine.txt b/forge-gui/res/cardsfolder/u/urzas_engine.txt index 5bcc5a63ebe..345166f8c04 100644 --- a/forge-gui/res/cardsfolder/u/urzas_engine.txt +++ b/forge-gui/res/cardsfolder/u/urzas_engine.txt @@ -5,6 +5,6 @@ PT:1/5 K:Trample A:AB$ Pump | Cost$ 3 | Defined$ Self | KW$ Banding | SpellDescription$ CARDNAME gains banding until end of turn. A:AB$ PumpAll | Cost$ 3 | ValidCards$ Creature.attackersBandedWith | KW$ Trample | SpellDescription$ Attacking creatures banded with Urza's Engine gain trample until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/urzas_engine.jpg Oracle:Trample\n{3}: Urza's Engine gains banding until end of turn. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.)\n{3}: Attacking creatures banded with Urza's Engine gain trample until end of turn. diff --git a/forge-gui/res/cardsfolder/u/urzas_incubator.txt b/forge-gui/res/cardsfolder/u/urzas_incubator.txt index 5630a5f23c2..da66f0f3d66 100644 --- a/forge-gui/res/cardsfolder/u/urzas_incubator.txt +++ b/forge-gui/res/cardsfolder/u/urzas_incubator.txt @@ -4,6 +4,6 @@ Types:Artifact K:ETBReplacement:Other:ChooseCT SVar:ChooseCT:DB$ ChooseType | Defined$ You | Type$ Creature | AILogic$ MostProminentInComputerDeck | SpellDescription$ As CARDNAME enters the battlefield, choose a creature type. S:Mode$ ReduceCost | ValidCard$ Creature.ChosenType | Type$ Spell | Activator$ You | Amount$ 2 | Description$ Creature spells of the chosen type cost {2} less to cast. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/urzas_incubator.jpg Oracle:As Urza's Incubator enters the battlefield, choose a creature type.\nCreature spells of the chosen type cost {2} less to cast. diff --git a/forge-gui/res/cardsfolder/u/urzas_mine.txt b/forge-gui/res/cardsfolder/u/urzas_mine.txt index 272c06bdcca..dac61afc558 100644 --- a/forge-gui/res/cardsfolder/u/urzas_mine.txt +++ b/forge-gui/res/cardsfolder/u/urzas_mine.txt @@ -2,6 +2,6 @@ Name:Urza's Mine ManaCost:no cost Types:Land Urza's Mine A:AB$ Mana | Cost$ T | Produced$ C | Bonus$ UrzaLands | BonusProduced$ 1 | SpellDescription$ Add {C}. If you control an Urza's Power-Plant and an Urza's Tower, add {C}{C} instead. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/urzas_mine.jpg Oracle:{T}: Add {C}. If you control an Urza's Power-Plant and an Urza's Tower, add {C}{C} instead. diff --git a/forge-gui/res/cardsfolder/u/urzas_power_plant.txt b/forge-gui/res/cardsfolder/u/urzas_power_plant.txt index 04bae02906e..0cf4980b9a1 100644 --- a/forge-gui/res/cardsfolder/u/urzas_power_plant.txt +++ b/forge-gui/res/cardsfolder/u/urzas_power_plant.txt @@ -2,6 +2,6 @@ Name:Urza's Power Plant ManaCost:no cost Types:Land Urza's Power-Plant A:AB$ Mana | Cost$ T | Produced$ C | Bonus$ UrzaLands | BonusProduced$ 1 | SpellDescription$ Add {C}. If you control an Urza's Mine and an Urza's Tower, add {C}{C} instead. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/urzas_power_plant.jpg Oracle:{T}: Add {C}. If you control an Urza's Mine and an Urza's Tower, add {C}{C} instead. diff --git a/forge-gui/res/cardsfolder/u/urzas_tower.txt b/forge-gui/res/cardsfolder/u/urzas_tower.txt index 0d362d8af1e..c6beb6130e6 100644 --- a/forge-gui/res/cardsfolder/u/urzas_tower.txt +++ b/forge-gui/res/cardsfolder/u/urzas_tower.txt @@ -2,6 +2,6 @@ Name:Urza's Tower ManaCost:no cost Types:Land Urza's Tower A:AB$ Mana | Cost$ T | Produced$ C | Bonus$ UrzaLands | BonusProduced$ 2 | SpellDescription$ Add {C}. If you control an Urza's Mine and an Urza's Power-Plant, add {C}{C}{C} instead. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/urzas_tower.jpg Oracle:{T}: Add {C}. If you control an Urza's Mine and an Urza's Power-Plant, add {C}{C}{C} instead. diff --git a/forge-gui/res/cardsfolder/u/utopia_sprawl.txt b/forge-gui/res/cardsfolder/u/utopia_sprawl.txt index 6623e82cfb1..7ff332f8678 100644 --- a/forge-gui/res/cardsfolder/u/utopia_sprawl.txt +++ b/forge-gui/res/cardsfolder/u/utopia_sprawl.txt @@ -7,6 +7,6 @@ K:ETBReplacement:Other:ChooseColor SVar:ChooseColor:DB$ ChooseColor | Defined$ You | SpellDescription$ As CARDNAME enters the battlefield, choose a color. T:Mode$ TapsForMana | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigMana | Static$ True | TriggerDescription$ Whenever enchanted Forest is tapped for mana, its controller adds an additional one mana of the chosen color. SVar:TrigMana:DB$ Mana | Produced$ Chosen | Defined$ TriggeredCardController -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/utopia_sprawl.jpg Oracle:Enchant Forest\nAs Utopia Sprawl enters the battlefield, choose a color.\nWhenever enchanted Forest is tapped for mana, its controller adds an additional one mana of the chosen color. diff --git a/forge-gui/res/cardsfolder/u/utopia_vow.txt b/forge-gui/res/cardsfolder/u/utopia_vow.txt index 4f78b476db0..75af3d6984c 100644 --- a/forge-gui/res/cardsfolder/u/utopia_vow.txt +++ b/forge-gui/res/cardsfolder/u/utopia_vow.txt @@ -7,6 +7,6 @@ S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddHiddenKeyword$ CARDNAME SVar:AnyMana:AB$Mana | Cost$ T | Produced$ Any | SpellDescription$ Add one mana of any color. SVar:NonStackingAttachEffect:True #TODO: For AI, this acts as a curse spell to lock the opponent's creature while giving the opponent mana advantage (similar to Path to Exile). Could probably be improved to be used on own useless creatures instead when possible. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/utopia_vow.jpg Oracle:Enchant creature\nEnchanted creature can't attack or block.\nEnchanted creature has "{T}: Add one mana of any color." diff --git a/forge-gui/res/cardsfolder/u/uyo_silent_prophet.txt b/forge-gui/res/cardsfolder/u/uyo_silent_prophet.txt index 61ab0ca9fe7..1f3cdf8c376 100644 --- a/forge-gui/res/cardsfolder/u/uyo_silent_prophet.txt +++ b/forge-gui/res/cardsfolder/u/uyo_silent_prophet.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Moonfolk Wizard PT:4/4 K:Flying A:AB$CopySpellAbility | Cost$ 2 Return<2/Land> | ValidTgts$ Instant,Sorcery | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/uyo_silent_prophet.jpg Oracle:Flying\n{2}, Return two lands you control to their owner's hand: Copy target instant or sorcery spell. You may choose new targets for the copy. diff --git a/forge-gui/res/cardsfolder/v/valakut_fireboar.txt b/forge-gui/res/cardsfolder/v/valakut_fireboar.txt index fcb4c6d873c..45905f4285c 100644 --- a/forge-gui/res/cardsfolder/v/valakut_fireboar.txt +++ b/forge-gui/res/cardsfolder/v/valakut_fireboar.txt @@ -4,6 +4,6 @@ Types:Creature Elemental Boar PT:1/7 T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, switch its power and toughness until end of turn. SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ HIDDEN CARDNAME's power and toughness are switched -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/valakut_fireboar.jpg Oracle:Whenever Valakut Fireboar attacks, switch its power and toughness until end of turn. diff --git a/forge-gui/res/cardsfolder/v/valleymaker.txt b/forge-gui/res/cardsfolder/v/valleymaker.txt index 200a04d4b43..9fa853e78c3 100644 --- a/forge-gui/res/cardsfolder/v/valleymaker.txt +++ b/forge-gui/res/cardsfolder/v/valleymaker.txt @@ -5,6 +5,6 @@ PT:5/5 A:AB$ DealDamage | Cost$ T Sac<1/Mountain> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target creature. A:AB$ ChoosePlayer | Cost$ T Sac<1/Forest> | Defined$ You | SubAbility$ DBMana | SpellDescription$ Choose a player. That player adds {G}{G}{G}. SVar:DBMana:DB$ Mana | Produced$ G | Amount$ 3 | Defined$ ChosenPlayer -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/valleymaker.jpg Oracle:{T}, Sacrifice a Mountain: Valleymaker deals 3 damage to target creature.\n{T}, Sacrifice a Forest: Choose a player. That player adds {G}{G}{G}. diff --git a/forge-gui/res/cardsfolder/v/valor_made_real.txt b/forge-gui/res/cardsfolder/v/valor_made_real.txt index 4725aa68ee1..f379a1c3649 100644 --- a/forge-gui/res/cardsfolder/v/valor_made_real.txt +++ b/forge-gui/res/cardsfolder/v/valor_made_real.txt @@ -2,6 +2,6 @@ Name:Valor Made Real ManaCost:W Types:Instant A:SP$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME can block any number of creatures. | SpellDescription$ Target creature can block any number of creatures this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/valor_made_real.jpg Oracle:Target creature can block any number of creatures this turn. diff --git a/forge-gui/res/cardsfolder/v/vampire_lacerator.txt b/forge-gui/res/cardsfolder/v/vampire_lacerator.txt index 11f2a343e17..4d04c406ec7 100644 --- a/forge-gui/res/cardsfolder/v/vampire_lacerator.txt +++ b/forge-gui/res/cardsfolder/v/vampire_lacerator.txt @@ -4,6 +4,6 @@ Types:Creature Vampire Warrior PT:2/2 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigLoseLife | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, you lose 1 life unless an opponent has 10 or less life. SVar:TrigLoseLife:DB$LoseLife | Defined$ You | LifeAmount$ 1 | ConditionLifeTotal$ OpponentSmallest | ConditionLifeAmount$ GE11 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/vampire_lacerator.jpg Oracle:At the beginning of your upkeep, you lose 1 life unless an opponent has 10 or less life. diff --git a/forge-gui/res/cardsfolder/v/vampire_warlord.txt b/forge-gui/res/cardsfolder/v/vampire_warlord.txt index bb051227e02..8acb01ace26 100644 --- a/forge-gui/res/cardsfolder/v/vampire_warlord.txt +++ b/forge-gui/res/cardsfolder/v/vampire_warlord.txt @@ -3,6 +3,6 @@ ManaCost:4 B Types:Creature Vampire Warrior PT:4/2 A:AB$ Regenerate | Cost$ Sac<1/Creature.Other/another creature> | SpellDescription$ Regenerate CARDNAME. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/vampire_warlord.jpg Oracle:Sacrifice another creature: Regenerate Vampire Warlord. (The next time this creature would be destroyed this turn, it isn't. Instead tap it, remove all damage from it, and remove it from combat.) diff --git a/forge-gui/res/cardsfolder/v/vampiric_fury.txt b/forge-gui/res/cardsfolder/v/vampiric_fury.txt index 445af1dc56a..34cfd3d29e9 100644 --- a/forge-gui/res/cardsfolder/v/vampiric_fury.txt +++ b/forge-gui/res/cardsfolder/v/vampiric_fury.txt @@ -2,6 +2,6 @@ Name:Vampiric Fury ManaCost:1 R Types:Instant A:SP$ PumpAll | Cost$ 1 R | NumAtt$ +2 | NumDef$ +0 | KW$ First Strike | ValidCards$ Creature.Vampire+YouCtrl | SpellDescription$ Vampire creatures you control get +2/+0 and gain first strike until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/vampiric_fury.jpg Oracle:Vampire creatures you control get +2/+0 and gain first strike until end of turn. diff --git a/forge-gui/res/cardsfolder/v/vampiric_rites.txt b/forge-gui/res/cardsfolder/v/vampiric_rites.txt index 914a44c0dd3..3acbfff0b99 100644 --- a/forge-gui/res/cardsfolder/v/vampiric_rites.txt +++ b/forge-gui/res/cardsfolder/v/vampiric_rites.txt @@ -4,6 +4,6 @@ Types:Enchantment A:AB$ GainLife | Cost$ 1 B Sac<1/Creature> | Defined$ You | LifeAmount$ 1 | SubAbility$ DBDraw | SpellDescription$ You gain 1 life and draw a card. SVar:DBDraw:DB$ Draw | NumCards$ 1 SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/vampiric_rites.jpg Oracle:{1}{B}, Sacrifice a creature: You gain 1 life and draw a card. diff --git a/forge-gui/res/cardsfolder/v/vampiric_tutor.txt b/forge-gui/res/cardsfolder/v/vampiric_tutor.txt index d80bcfce190..68777f218ed 100644 --- a/forge-gui/res/cardsfolder/v/vampiric_tutor.txt +++ b/forge-gui/res/cardsfolder/v/vampiric_tutor.txt @@ -3,6 +3,6 @@ ManaCost:B Types:Instant A:SP$ ChangeZone | Cost$ B | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Card | ChangeNum$ 1 | Mandatory$ True | SpellDescription$ Search your library for a card, then shuffle your library and put that card on top of it. You lose 2 life. | SubAbility$ DBLoseLife SVar:DBLoseLife:DB$LoseLife | LifeAmount$ 2 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/vampiric_tutor.jpg Oracle:Search your library for a card, then shuffle your library and put that card on top of it. You lose 2 life. diff --git a/forge-gui/res/cardsfolder/v/vampirism.txt b/forge-gui/res/cardsfolder/v/vampirism.txt index 519154dbf55..4357eb79d54 100644 --- a/forge-gui/res/cardsfolder/v/vampirism.txt +++ b/forge-gui/res/cardsfolder/v/vampirism.txt @@ -9,6 +9,6 @@ SVar:DrawSlowtrip:DB$Draw | NumCards$ 1 | Defined$ You S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ X | AddToughness$ X | Description$ Enchanted creature gets +1/+1 for each other creature you control. S:Mode$ Continuous | Affected$ Creature.YouCtrl+Other | AddPower$ -1 | AddToughness$ -1 | Description$ Other creatures you control get -1/-1. SVar:X:Count$Valid Creature.YouCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/vampirism.jpg Oracle:Enchant creature\nWhen Vampirism enters the battlefield, draw a card at the beginning of the next turn's upkeep.\nEnchanted creature gets +1/+1 for each other creature you control.\nOther creatures you control get -1/-1. diff --git a/forge-gui/res/cardsfolder/v/vanish_into_memory.txt b/forge-gui/res/cardsfolder/v/vanish_into_memory.txt index 31f9e3dc962..07ca4db73a1 100644 --- a/forge-gui/res/cardsfolder/v/vanish_into_memory.txt +++ b/forge-gui/res/cardsfolder/v/vanish_into_memory.txt @@ -9,6 +9,6 @@ SVar:DBDiscard:DB$ Discard | NumCards$ Y | References$ Y | Mode$ TgtChoose | Con SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True SVar:X:RememberedLKI$CardPower SVar:Y:Remembered$CardToughness -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/vanish_into_memory.jpg Oracle:Exile target creature. You draw cards equal to that creature's power. At the beginning of your next upkeep, return that card to the battlefield under its owner's control. If you do, discard cards equal to that creature's toughness. diff --git a/forge-gui/res/cardsfolder/v/vanishing.txt b/forge-gui/res/cardsfolder/v/vanishing.txt index a549cf4be2d..4c05fb1a0b2 100644 --- a/forge-gui/res/cardsfolder/v/vanishing.txt +++ b/forge-gui/res/cardsfolder/v/vanishing.txt @@ -4,6 +4,6 @@ Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ U | ValidTgts$ Creature | AILogic$ Curse A:AB$ Phases | Cost$ U U | Defined$ Enchanted | SpellDescription$ Enchanted creature phases out. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/vanishing.jpg Oracle:Enchant creature\n{U}{U}: Enchanted creature phases out. (While it's phased out, it's treated as though it doesn't exist. It phases in before its controller untaps during their next untap step.) diff --git a/forge-gui/res/cardsfolder/v/varchilds_crusader.txt b/forge-gui/res/cardsfolder/v/varchilds_crusader.txt index 62420f73ba2..a557bd962b3 100644 --- a/forge-gui/res/cardsfolder/v/varchilds_crusader.txt +++ b/forge-gui/res/cardsfolder/v/varchilds_crusader.txt @@ -4,6 +4,6 @@ Types:Creature Human Knight PT:3/2 A:AB$ Effect | Cost$ 0 | AtEOT$ Sacrifice | Name$ Varchild's Crusader Effect | StaticAbilities$ KWPump | SpellDescription$ CARDNAME can't be blocked this turn except by Walls. Sacrifice CARDNAME at the beginning of the next end step. SVar:KWPump:Mode$ CantBlockBy | ValidAttacker$ Creature.EffectSource | ValidBlocker$ Creature.nonWall | EffectZone$ Command | Description$ EFFECTSOURCE can't be blocked this turn except by Walls. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/varchilds_crusader.jpg Oracle:{0}: Varchild's Crusader can't be blocked this turn except by Walls. Sacrifice Varchild's Crusader at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/v/varchilds_war_riders.txt b/forge-gui/res/cardsfolder/v/varchilds_war_riders.txt index 0e1a3a47f3f..005ef3a2879 100644 --- a/forge-gui/res/cardsfolder/v/varchilds_war_riders.txt +++ b/forge-gui/res/cardsfolder/v/varchilds_war_riders.txt @@ -11,6 +11,6 @@ SVar:Survivor:DB$Token | TokenAmount$ X | References$ X | TokenName$ Survivor | SVar:X:Count$CardCounters.AGE SVar:TrigAgeSacrifice:DB$PutCounter | Defined$ Self | CounterType$ AGE | CounterNum$ 1 | SubAbility$ Sacrifice SVar:Sacrifice:DB$ Sacrifice | Defined$ Self | SpellDescription$ Sacrifice CARDNAME. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/varchilds_war_riders.jpg Oracle:Cumulative upkeep—Have an opponent create a 1/1 red Survivor creature token. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nTrample, rampage 1 (Whenever this creature becomes blocked, it gets +1/+1 until end of turn for each creature blocking it beyond the first.) diff --git a/forge-gui/res/cardsfolder/v/vassals_duty.txt b/forge-gui/res/cardsfolder/v/vassals_duty.txt index 8db54f0cd42..c147e695547 100644 --- a/forge-gui/res/cardsfolder/v/vassals_duty.txt +++ b/forge-gui/res/cardsfolder/v/vassals_duty.txt @@ -4,6 +4,6 @@ Types:Enchantment A:AB$ Effect | Cost$ 1 | ValidTgts$ Creature.Legendary+YouCtrl | TgtPrompt$ Select target legendary creature to redirect damage from | ReplacementEffects$ DamageEvent | SVars$ DamageEventDmg | References$ DamageEvent,DamageEventDmg | Duration$ HostLeavesOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SpellDescription$ The next 1 damage that would be dealt to target legendary creature you control is dealt to you instead. SVar:DamageEvent:Event$ DamageDone | ValidTarget$ Creature.IsRemembered | ReplaceWith$ DamageEventDmg | Description$ The next 1 damage that would be dealt to target legendary creature you control is dealt to you instead. SVar:DamageEventDmg:DB$ ReplaceSplitDamage | DamageTarget$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/vassals_duty.jpg Oracle:{1}: The next 1 damage that would be dealt to target legendary creature you control this turn is dealt to you instead. diff --git a/forge-gui/res/cardsfolder/v/vastwood_animist.txt b/forge-gui/res/cardsfolder/v/vastwood_animist.txt index 1720adf42fa..df8e01e752c 100644 --- a/forge-gui/res/cardsfolder/v/vastwood_animist.txt +++ b/forge-gui/res/cardsfolder/v/vastwood_animist.txt @@ -5,6 +5,6 @@ PT:1/1 A:AB$ Animate | Cost$ T | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | Power$ X | Toughness$ X | References$ X | Types$ Creature,Elemental | SpellDescription$ Target land you control becomes an X/X Elemental creature until end of turn, where X is the number of Allies you control. It's still a land. SVar:X:Count$Valid Ally.YouCtrl DeckNeeds:Type$Ally -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/vastwood_animist.jpg Oracle:{T}: Target land you control becomes an X/X Elemental creature until end of turn, where X is the number of Allies you control. It's still a land. diff --git a/forge-gui/res/cardsfolder/v/vaultbreaker.txt b/forge-gui/res/cardsfolder/v/vaultbreaker.txt index fb6eb668fea..cd55c8638f0 100644 --- a/forge-gui/res/cardsfolder/v/vaultbreaker.txt +++ b/forge-gui/res/cardsfolder/v/vaultbreaker.txt @@ -5,6 +5,6 @@ PT:4/2 K:Dash:2 R T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ Whenever CARDNAME attacks, you may discard a card. If you do, draw a card. SVar:TrigDiscard:AB$ Draw | Cost$ Discard<1/Card> | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/agrus_kos_wojek_veteran.jpg Oracle:Whenever Vaultbreaker attacks, you may discard a card. If you do, draw a card.\nDash {2}{R} (You may cast this spell for its dash cost. If you do, it gains haste, and it's returned from the battlefield to its owner's hand at the beginning of the next end step.) diff --git a/forge-gui/res/cardsfolder/v/vedalken_archmage.txt b/forge-gui/res/cardsfolder/v/vedalken_archmage.txt index 1bc84a686ff..9735bd4b745 100644 --- a/forge-gui/res/cardsfolder/v/vedalken_archmage.txt +++ b/forge-gui/res/cardsfolder/v/vedalken_archmage.txt @@ -4,7 +4,7 @@ Types:Creature Vedalken Wizard PT:0/2 T:Mode$ SpellCast | ValidCard$ Artifact | ValidActivatingPlayer$ You | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast an artifact spell, draw a card. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Artifact SVar:Picture:http://www.wizards.com/global/images/magic/general/vedalken_archmage.jpg Oracle:Whenever you cast an artifact spell, draw a card. diff --git a/forge-gui/res/cardsfolder/v/vedalken_infuser.txt b/forge-gui/res/cardsfolder/v/vedalken_infuser.txt index ab411847f2b..9b86d0845aa 100644 --- a/forge-gui/res/cardsfolder/v/vedalken_infuser.txt +++ b/forge-gui/res/cardsfolder/v/vedalken_infuser.txt @@ -4,6 +4,6 @@ Types:Creature Vedalken Wizard PT:1/4 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigCounter | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may put a charge counter on target artifact. SVar:TrigCounter:DB$PutCounter | CounterType$ CHARGE | CounterNum$ 1 | ValidTgts$ Artifact | TgtPrompt$ Select target artifact -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/vedalken_infuser.jpg Oracle:At the beginning of your upkeep, you may put a charge counter on target artifact. diff --git a/forge-gui/res/cardsfolder/v/vedalken_plotter.txt b/forge-gui/res/cardsfolder/v/vedalken_plotter.txt index cc4346b4bea..b9da0d126d4 100644 --- a/forge-gui/res/cardsfolder/v/vedalken_plotter.txt +++ b/forge-gui/res/cardsfolder/v/vedalken_plotter.txt @@ -5,6 +5,6 @@ PT:1/1 T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigTarget | TriggerDescription$ When CARDNAME enters the battlefield, exchange control of target land you control and target land an opponent controls. SVar:TrigTarget:DB$ Pump | ValidTgts$ Land.YouCtrl | TgtPrompt$ Choose target land you control | SubAbility$ DBExchange | SpellDescription$ Exchange control of target land you control and target land an opponent controls. SVar:DBExchange:DB$ ExchangeControl | Defined$ ParentTarget | ValidTgts$ Land.OppCtrl | TgtPrompt$ Choose target land an opponent controls -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/vedalken_plotter.jpg Oracle:When Vedalken Plotter enters the battlefield, exchange control of target land you control and target land an opponent controls. diff --git a/forge-gui/res/cardsfolder/v/vedalken_shackles.txt b/forge-gui/res/cardsfolder/v/vedalken_shackles.txt index 3042e3b3d91..cce6c44b9b3 100644 --- a/forge-gui/res/cardsfolder/v/vedalken_shackles.txt +++ b/forge-gui/res/cardsfolder/v/vedalken_shackles.txt @@ -4,7 +4,7 @@ Types:Artifact K:You may choose not to untap CARDNAME during your untap step. A:AB$ GainControl | Cost$ 2 T | ValidTgts$ Creature.powerLEX | References$ X | TgtPrompt$ Select target creature with power less than or equal to the number of Islands you control. | LoseControl$ Untap,LeavesPlay | SpellDescription$ Gain control of target creature with power less than or equal to the number of Islands you control for as long as CARDNAME remains tapped. SVar:X:Count$TypeYouCtrl.Island -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Blue SVar:Picture:http://www.wizards.com/global/images/magic/general/vedalken_shackles.jpg Oracle:You may choose not to untap Vedalken Shackles during your untap step.\n{2}, {T}: Gain control of target creature with power less than or equal to the number of Islands you control for as long as Vedalken Shackles remains tapped. diff --git a/forge-gui/res/cardsfolder/v/veil_of_secrecy.txt b/forge-gui/res/cardsfolder/v/veil_of_secrecy.txt index 8e2ab25715f..b87c6474491 100644 --- a/forge-gui/res/cardsfolder/v/veil_of_secrecy.txt +++ b/forge-gui/res/cardsfolder/v/veil_of_secrecy.txt @@ -3,7 +3,7 @@ ManaCost:1 U Types:Instant Arcane K:Splice:Arcane:Return<1/Creature.Blue/blue creature> A:SP$Pump | Cost$ 1 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Shroud & HIDDEN Unblockable | SpellDescription$ Target creature gains shroud until end of turn and can't be blocked this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHints:Type$Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/veil_of_secrecy.jpg Oracle:Target creature gains shroud until end of turn and can't be blocked this turn. (A creature with shroud can't be the target of spells or abilities.)\nSplice onto Arcane—Return a blue creature you control to its owner's hand. (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) diff --git a/forge-gui/res/cardsfolder/v/veiled_crocodile.txt b/forge-gui/res/cardsfolder/v/veiled_crocodile.txt index 6d0acc07fc2..51d99482a91 100644 --- a/forge-gui/res/cardsfolder/v/veiled_crocodile.txt +++ b/forge-gui/res/cardsfolder/v/veiled_crocodile.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ Always | CheckSVar$ X | SVarCompare$ EQ0 | TriggerZones$ Battlefield | Execute$ TrigVCAnimate | IsPresent$ Card.Self+Enchantment | ResolvingCheck$ IsPresent | TriggerDescription$ When a player has no cards in hand, if CARDNAME is an enchantment, CARDNAME becomes a 4/4 Crocodile creature. SVar:TrigVCAnimate:DB$ Animate | Types$ Creature,Crocodile | Power$ 4 | Toughness$ 4 | RemoveCardTypes$ True | Permanent$ True SVar:X:PlayerCountPlayers$LowestValidHand Card.YouOwn -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/veiled_crocodile.jpg Oracle:When a player has no cards in hand, if Veiled Crocodile is an enchantment, Veiled Crocodile becomes a 4/4 Crocodile creature. diff --git a/forge-gui/res/cardsfolder/v/veilstone_amulet.txt b/forge-gui/res/cardsfolder/v/veilstone_amulet.txt index 308fbd69bf2..6510d150a28 100644 --- a/forge-gui/res/cardsfolder/v/veilstone_amulet.txt +++ b/forge-gui/res/cardsfolder/v/veilstone_amulet.txt @@ -5,6 +5,6 @@ T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ You | TriggerZones$ SVar:TrigEffect:DB$ Effect | Name$ Veilstone Amulet Effect | StaticAbilities$ CantTarget SVar:CantTarget:Mode$ CantTarget | EffectZone$ Command | ValidCard$ Creature.YouCtrl | Activator$ Opponent | Description$ Creatures you control can't be the targets of spells or abilities your opponents control SVar:BuffedBy:Card -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/veilstone_amulet.jpg Oracle:Whenever you cast a spell, creatures you control can't be the targets of spells or abilities your opponents control this turn. diff --git a/forge-gui/res/cardsfolder/v/venarian_glimmer.txt b/forge-gui/res/cardsfolder/v/venarian_glimmer.txt index 0ed63271e2d..4380aa88c79 100644 --- a/forge-gui/res/cardsfolder/v/venarian_glimmer.txt +++ b/forge-gui/res/cardsfolder/v/venarian_glimmer.txt @@ -3,6 +3,6 @@ ManaCost:X U Types:Instant A:SP$ Discard | Cost$ X U | ValidTgts$ Player | TgtPrompt$ Select target player | Mode$ RevealYouChoose | DiscardValid$ Card.nonLand+cmcLEX | References$ X | NumCards$ 1 | SpellDescription$ Target player reveals their hand. You choose a nonland card with converted mana cost X or less from it. That player discards that card. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/venarian_glimmer.jpg Oracle:Target player reveals their hand. You choose a nonland card with converted mana cost X or less from it. That player discards that card. diff --git a/forge-gui/res/cardsfolder/v/venerable_kumo.txt b/forge-gui/res/cardsfolder/v/venerable_kumo.txt index 9062be73b32..ed32252c7a3 100644 --- a/forge-gui/res/cardsfolder/v/venerable_kumo.txt +++ b/forge-gui/res/cardsfolder/v/venerable_kumo.txt @@ -4,7 +4,7 @@ Types:Creature Spirit PT:2/3 K:Reach K:Soulshift:4 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Spirit SVar:Picture:http://www.wizards.com/global/images/magic/general/venerable_kumo.jpg Oracle:Reach (This creature can block creatures with flying.)\nSoulshift 4 (When this creature dies, you may return target Spirit card with converted mana cost 4 or less from your graveyard to your hand.) diff --git a/forge-gui/res/cardsfolder/v/venerated_teacher.txt b/forge-gui/res/cardsfolder/v/venerated_teacher.txt index ee0326b9779..f26a3341a48 100644 --- a/forge-gui/res/cardsfolder/v/venerated_teacher.txt +++ b/forge-gui/res/cardsfolder/v/venerated_teacher.txt @@ -4,6 +4,6 @@ Types:Creature Human Wizard T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigPut | TriggerDescription$ When CARDNAME enters the battlefield, put two level counters on each creature you control with level up. SVar:TrigPut:DB$PutCounterAll | ValidCards$ Creature.YouCtrl+withLevel up | CounterType$ LEVEL | CounterNum$ 2 PT:2/2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/venerated_teacher.jpg Oracle:When Venerated Teacher enters the battlefield, put two level counters on each creature you control with level up. diff --git a/forge-gui/res/cardsfolder/v/vengeful_archon.txt b/forge-gui/res/cardsfolder/v/vengeful_archon.txt index edf5cf00259..2b0ea0c3562 100644 --- a/forge-gui/res/cardsfolder/v/vengeful_archon.txt +++ b/forge-gui/res/cardsfolder/v/vengeful_archon.txt @@ -7,6 +7,6 @@ A:AB$ Pump | Cost$ X | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target SVar:ArchonPrevention:DB$ PreventDamage | Defined$ You | Amount$ X | References$ X | PreventionSubAbility$ ArchonsVengeance | ShieldEffectTarget$ ParentTarget SVar:ArchonsVengeance:DB$ DealDamage | Defined$ ShieldEffectTarget | NumDmg$ PreventedDamage | SpellDescription$ CARDNAME deals that much damage to target player or planeswalker. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/vengeful_archon.jpg Oracle:Flying\n{X}: Prevent the next X damage that would be dealt to you this turn. If damage is prevented this way, Vengeful Archon deals that much damage to target player or planeswalker. diff --git a/forge-gui/res/cardsfolder/v/vengeful_dreams.txt b/forge-gui/res/cardsfolder/v/vengeful_dreams.txt index cef82d2fd75..0b009c68efa 100644 --- a/forge-gui/res/cardsfolder/v/vengeful_dreams.txt +++ b/forge-gui/res/cardsfolder/v/vengeful_dreams.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ ChangeZone | Cost$ W W Discard | Origin$ Battlefield | Destination$ Exile | TargetMin$ 0 | TargetMax$ MaxTgts | References$ X,MaxTgts | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | SpellDescription$ Exile X target attacking creatures. SVar:X:Targeted$Amount SVar:MaxTgts:Count$Valid Creature.attacking -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/vengeful_dreams.jpg Oracle:As an additional cost to cast Vengeful Dreams, discard X cards.\nExile X target attacking creatures. diff --git a/forge-gui/res/cardsfolder/v/venomous_breath.txt b/forge-gui/res/cardsfolder/v/venomous_breath.txt index 39b00125e7e..a03723ca007 100644 --- a/forge-gui/res/cardsfolder/v/venomous_breath.txt +++ b/forge-gui/res/cardsfolder/v/venomous_breath.txt @@ -5,6 +5,6 @@ A:SP$ DelayedTrigger | Cost$ 3 G | ValidTgts$ Creature | TgtPrompt$ Select targe SVar:VenomousBreathTrigDestroy:DB$ Pump | RememberObjects$ DelayTriggerRemembered | SubAbility$ DBDestroy SVar:DBDestroy:DB$ DestroyAll | ValidCards$ Creature.blockedRemembered,Creature.blockedByRemembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/venomous_breath.jpg Oracle:Choose target creature. At this turn's next end of combat, destroy all creatures that blocked or were blocked by it this turn. diff --git a/forge-gui/res/cardsfolder/v/venser_the_sojourner.txt b/forge-gui/res/cardsfolder/v/venser_the_sojourner.txt index 918ab27c0f4..bb19ebe35ea 100644 --- a/forge-gui/res/cardsfolder/v/venser_the_sojourner.txt +++ b/forge-gui/res/cardsfolder/v/venser_the_sojourner.txt @@ -11,6 +11,6 @@ SVar:KWPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | A:AB$ Effect | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Ultimate$ True | Name$ Emblem - Venser, the Sojourner | Image$ emblem_venser_the_sojourner | Triggers$ TrigSpellCast | SVars$ EffSpellCast | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "Whenever you cast a spell, exile target permanent." SVar:TrigSpellCast:Mode$ SpellCast | ValidActivatingPlayer$ You | Execute$ EffSpellCast | TriggerDescription$ Whenever you cast a spell, exile target permanent. SVar:EffSpellCast:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/venser_the_sojourner.jpg Oracle:[+2]: Exile target permanent you own. Return it to the battlefield under your control at the beginning of the next end step.\n[-1]: Creatures can't be blocked this turn.\n[-8]: You get an emblem with "Whenever you cast a spell, exile target permanent." diff --git a/forge-gui/res/cardsfolder/v/ventifact_bottle.txt b/forge-gui/res/cardsfolder/v/ventifact_bottle.txt index 980b77fe19c..5d18149d852 100644 --- a/forge-gui/res/cardsfolder/v/ventifact_bottle.txt +++ b/forge-gui/res/cardsfolder/v/ventifact_bottle.txt @@ -8,6 +8,6 @@ SVar:TrigRemove:DB$ RemoveCounter | CounterType$ CHARGE | CounterNum$ Y | Refere SVar:DBTap:DB$ Tap | Defined$ Self SVar:X:Count$xPaid SVar:Y:Count$CardCounters.CHARGE -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ventifact_bottle.jpg Oracle:{X}{1}, {T}: Put X charge counters on Ventifact Bottle. Activate this ability only any time you could cast a sorcery.\nAt the beginning of your precombat main phase, if Ventifact Bottle has a charge counter on it, tap it and remove all charge counters from it. Add {C} for each charge counter removed this way. diff --git a/forge-gui/res/cardsfolder/v/verdant_eidolon.txt b/forge-gui/res/cardsfolder/v/verdant_eidolon.txt index 672fa9ab612..8185e33f8e2 100644 --- a/forge-gui/res/cardsfolder/v/verdant_eidolon.txt +++ b/forge-gui/res/cardsfolder/v/verdant_eidolon.txt @@ -5,6 +5,6 @@ PT:2/2 A:AB$ Mana | Cost$ G Sac<1/CARDNAME> | Produced$ Any | Amount$ 3 | SpellDescription$ Add three mana of any one color. T:Mode$ SpellCast | ValidCard$ Card.MultiColor | ValidActivatingPlayer$ You | TriggerZones$ Graveyard | OptionalDecider$ You | Execute$ TrigReturn | TriggerDescription$ Whenever you cast a multicolored spell, you may return CARDNAME from your graveyard to your hand. SVar:TrigReturn:DB$ChangeZone | Origin$ Graveyard | Destination$ Hand | Defined$ Self -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/verdant_eidolon.jpg Oracle:{G}, Sacrifice Verdant Eidolon: Add three mana of any one color.\nWhenever you cast a multicolored spell, you may return Verdant Eidolon from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/v/verdant_haven.txt b/forge-gui/res/cardsfolder/v/verdant_haven.txt index 92e17c67d4e..b8f03d3efbc 100644 --- a/forge-gui/res/cardsfolder/v/verdant_haven.txt +++ b/forge-gui/res/cardsfolder/v/verdant_haven.txt @@ -7,6 +7,6 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigGainLife:DB$ GainLife | LifeAmount$ 2 T:Mode$ TapsForMana | ValidCard$ Card.AttachedBy | Execute$ TrigMana | Static$ True | TriggerDescription$ Whenever enchanted land is tapped for mana, its controller adds an additional one mana of any color. SVar:TrigMana:DB$Mana | Produced$ Any | Amount$ 1 | Defined$ TriggeredCardController -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/verdant_haven.jpg Oracle:Enchant land\nWhen Verdant Haven enters the battlefield, you gain 2 life.\nWhenever enchanted land is tapped for mana, its controller adds an additional one mana of any color. diff --git a/forge-gui/res/cardsfolder/v/verdant_rebirth.txt b/forge-gui/res/cardsfolder/v/verdant_rebirth.txt index e14237247fc..c8b4069bbbb 100644 --- a/forge-gui/res/cardsfolder/v/verdant_rebirth.txt +++ b/forge-gui/res/cardsfolder/v/verdant_rebirth.txt @@ -5,6 +5,6 @@ A:SP$ Animate | Cost$ 1 G | ValidTgts$ Creature | TgtPrompt$ Select target creat SVar:VerdantRebirthChangeZone:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ VerdantRebirthTrigChangeZone | TriggerController$ TriggeredCardController | TriggerDescription$ When this creature dies, return it to its owner's hand. SVar:VerdantRebirthTrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | Defined$ TriggeredCard SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/verdant_rebirth.jpg Oracle:Until end of turn, target creature gains "When this creature dies, return it to its owner's hand."\nDraw a card. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/v/verdant_succession.txt b/forge-gui/res/cardsfolder/v/verdant_succession.txt index 9c00b56f345..ef287f07336 100644 --- a/forge-gui/res/cardsfolder/v/verdant_succession.txt +++ b/forge-gui/res/cardsfolder/v/verdant_succession.txt @@ -3,6 +3,6 @@ ManaCost:4 G Types:Enchantment T:Mode$ ChangesZone | ValidCard$ Creature.Green+nonToken | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigSearch | TriggerDescription$ Whenever a green nontoken creature dies, that creature's controller may search their library for a card with the same name as that creature and put it onto the battlefield. If that player does, they shuffle their library. SVar:TrigSearch:DB$ ChangeZone | Optional$ True | DefinedPlayer$ TriggeredCardController | ChangeType$ Triggered.sameName | ChangeNum$ 1 | Origin$ Library | Destination$ Battlefield | Hidden$ True | Optional$ You | ShuffleNonMandatory$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/verdant_succession.jpg Oracle:Whenever a green nontoken creature dies, that creature's controller may search their library for a card with the same name as that creature and put it onto the battlefield. If that player does, they shuffle their library. diff --git a/forge-gui/res/cardsfolder/v/verdant_touch.txt b/forge-gui/res/cardsfolder/v/verdant_touch.txt index 42c57d80f15..d17e78a6b26 100644 --- a/forge-gui/res/cardsfolder/v/verdant_touch.txt +++ b/forge-gui/res/cardsfolder/v/verdant_touch.txt @@ -3,6 +3,6 @@ ManaCost:1 G Types:Sorcery A:SP$ Animate | Cost$ 1 G | ValidTgts$ Land | TgtPrompt$ Select target land | Power$ 2 | Toughness$ 2 | Types$ Creature | Permanent$ True | SpellDescription$ Target land becomes a 2/2 creature that's still a land. (This effect lasts indefinitely.) K:Buyback:3 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/verdant_touch.jpg Oracle:Buyback {3} (You may pay an additional {3} as you cast this spell. If you do, put this card into your hand as it resolves.)\nTarget land becomes a 2/2 creature that's still a land. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/v/verduran_enchantress.txt b/forge-gui/res/cardsfolder/v/verduran_enchantress.txt index a62626b521d..1700c3cb78a 100644 --- a/forge-gui/res/cardsfolder/v/verduran_enchantress.txt +++ b/forge-gui/res/cardsfolder/v/verduran_enchantress.txt @@ -4,7 +4,7 @@ Types:Creature Human Druid PT:0/2 T:Mode$ SpellCast | ValidCard$ Enchantment | ValidActivatingPlayer$ You | Execute$ TrigDraw | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever you cast an enchantment spell, you may draw a card. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Enchantment SVar:Picture:http://www.wizards.com/global/images/magic/general/verduran_enchantress.jpg Oracle:Whenever you cast an enchantment spell, you may draw a card. diff --git a/forge-gui/res/cardsfolder/v/vermiculos.txt b/forge-gui/res/cardsfolder/v/vermiculos.txt index 34e2dc9d0f5..948b13975a3 100644 --- a/forge-gui/res/cardsfolder/v/vermiculos.txt +++ b/forge-gui/res/cardsfolder/v/vermiculos.txt @@ -5,6 +5,6 @@ PT:1/1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Artifact | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever an artifact enters the battlefield, CARDNAME gets +4/+4 until end of turn. SVar:TrigPump:DB$Pump | Defined$ Self | NumAtt$ 4 | NumDef$ 4 SVar:BuffedBy:Artifact -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/vermiculos.jpg Oracle:Whenever an artifact enters the battlefield, Vermiculos gets +4/+4 until end of turn. diff --git a/forge-gui/res/cardsfolder/v/vernal_bloom.txt b/forge-gui/res/cardsfolder/v/vernal_bloom.txt index 576f71dc85b..a4cf93c4071 100644 --- a/forge-gui/res/cardsfolder/v/vernal_bloom.txt +++ b/forge-gui/res/cardsfolder/v/vernal_bloom.txt @@ -3,6 +3,6 @@ ManaCost:3 G Types:Enchantment T:Mode$ TapsForMana | ValidCard$ Forest | Execute$ TrigMana | TriggerZones$ Battlefield | Static$ True | TriggerDescription$ Whenever a Forest is tapped for mana, its controller adds an additional {G}. SVar:TrigMana:DB$ Mana | Produced$ G | Amount$ 1 | Defined$ TriggeredPlayer -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/vernal_bloom.jpg Oracle:Whenever a Forest is tapped for mana, its controller adds an additional {G}. diff --git a/forge-gui/res/cardsfolder/v/vernal_equinox.txt b/forge-gui/res/cardsfolder/v/vernal_equinox.txt index 6aeacd5adb3..7f7c3b21042 100644 --- a/forge-gui/res/cardsfolder/v/vernal_equinox.txt +++ b/forge-gui/res/cardsfolder/v/vernal_equinox.txt @@ -3,6 +3,6 @@ ManaCost:3 G Types:Enchantment S:Mode$ Continuous | Affected$ Creature.nonToken,Enchantment.nonToken | AffectedZone$ Exile,Graveyard,Hand,Library,Command,Stack | WithFlash$ Player | Description$ Any player may cast creature and enchantment spells as though they had flash. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/vernal_equinox.jpg Oracle:Any player may cast creature and enchantment spells as though they had flash. diff --git a/forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt b/forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt index 5412e1a6616..56ff80e3418 100644 --- a/forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt +++ b/forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt @@ -8,6 +8,6 @@ SVar:ChooseCreature:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Creatur 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:VesDopCopy:DB$ Clone | ValidTgts$ Creature | TgtPrompt$ Select target creature to copy. | Optional$ True | Colors$ Blue | OverwriteColors$ True | GainThisAbility$ True | SubAbility$ DBCleanup -SVar:RemAIDeck:True +AI:RemoveDeck:All 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." diff --git a/forge-gui/res/cardsfolder/v/veterans_voice.txt b/forge-gui/res/cardsfolder/v/veterans_voice.txt index ed4136b0f16..e2fcd8c43c0 100644 --- a/forge-gui/res/cardsfolder/v/veterans_voice.txt +++ b/forge-gui/res/cardsfolder/v/veterans_voice.txt @@ -4,7 +4,7 @@ Types:Enchantment Aura K:Enchant creature you control A:SP$ Attach | Cost$ R | ValidTgts$ Creature.YouCtrl | AILogic$ Pump A:AB$ Pump | Cost$ tapXType<1/Creature.EnchantedBy/Enchanted Creature> | ValidTgts$ Creature.NotEnchantedBy | TgtPrompt$ Select target creature other than the creature tapped | NumAtt$ 2 | NumDef$ 1 | CostDesc$ Tap enchanted creature: | SpellDescription$ Target creature other than the creature tapped this way gets +2/+1 until end of turn. Activate this ability only if enchanted creature is untapped. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingAttachEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/veterans_voice.jpg Oracle:Enchant creature you control\nTap enchanted creature: Target creature other than the creature tapped this way gets +2/+1 until end of turn. Activate this ability only if enchanted creature is untapped. diff --git a/forge-gui/res/cardsfolder/v/vexing_arcanix.txt b/forge-gui/res/cardsfolder/v/vexing_arcanix.txt index 4d7f5f4de21..763e5c2d1ec 100644 --- a/forge-gui/res/cardsfolder/v/vexing_arcanix.txt +++ b/forge-gui/res/cardsfolder/v/vexing_arcanix.txt @@ -5,6 +5,6 @@ A:AB$ NameCard | Cost$ 3 T | ValidTgts$ Player | TgtPrompt$ Select target player SVar:DBDig:DB$ Dig | DigNum$ 1 | Defined$ Targeted | ChangeNum$ All | ChangeValid$ Card.NamedCard | DestinationZone2$ Graveyard | Reveal$ True | RememberChanged$ True | SubAbility$ DBDamage SVar:DBDamage:DB$ DealDamage | NumDmg$ 2 | Defined$ Targeted | ConditionDefined$ Remembered | ConditionPresent$ Card.NamedCard | ConditionCompare$ EQ0 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/vexing_arcanix.jpg Oracle:{3}, {T}: Target player chooses a card name, then reveals the top card of their library. If that card has the chosen name, the player puts it into their hand. Otherwise, the player puts it into their graveyard and Vexing Arcanix deals 2 damage to them. diff --git a/forge-gui/res/cardsfolder/v/vexing_shusher.txt b/forge-gui/res/cardsfolder/v/vexing_shusher.txt index 43445325a76..34a06048f19 100644 --- a/forge-gui/res/cardsfolder/v/vexing_shusher.txt +++ b/forge-gui/res/cardsfolder/v/vexing_shusher.txt @@ -5,6 +5,6 @@ PT:2/2 K:CARDNAME can't be countered. A:AB$ Pump | Cost$ RG | ValidTgts$ Card.inZoneStack | TgtZone$ Stack,Battlefield | PumpZone$ Stack | KW$ HIDDEN CARDNAME can't be countered. | SpellDescription$ Target spell can't be countered by spells or abilities. #Should include another zone otherwise the target would not be defined as a card -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/vexing_shusher.jpg Oracle:Vexing Shusher can't be countered.\n{R/G}: Target spell can't be countered by spells or abilities. diff --git a/forge-gui/res/cardsfolder/v/vexing_sphinx.txt b/forge-gui/res/cardsfolder/v/vexing_sphinx.txt index a976bb2d98f..7f8745224e8 100644 --- a/forge-gui/res/cardsfolder/v/vexing_sphinx.txt +++ b/forge-gui/res/cardsfolder/v/vexing_sphinx.txt @@ -9,6 +9,6 @@ SVar:TrigDraw:DB$ Draw | NumCards$ XLKI | References$ XLKI SVar:XLKI:TriggeredCard$CardCounters.AGE SVar:NeedsToPlayVar:Z GE3 SVar:Z:Count$InYourHand -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/vexing_sphinx.jpg Oracle:Flying\nCumulative upkeep—Discard a card. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nWhen Vexing Sphinx dies, draw a card for each age counter on it. diff --git a/forge-gui/res/cardsfolder/v/viashino_sandswimmer.txt b/forge-gui/res/cardsfolder/v/viashino_sandswimmer.txt index cb268bb37eb..8f0260650cd 100644 --- a/forge-gui/res/cardsfolder/v/viashino_sandswimmer.txt +++ b/forge-gui/res/cardsfolder/v/viashino_sandswimmer.txt @@ -5,6 +5,6 @@ PT:3/2 A:AB$ FlipACoin | Cost$ R | WinSubAbility$ DBReturn | LoseSubAbility$ DBSacrifice | SpellDescription$ Flip a coin. If you win the flip, return CARDNAME to its owner's hand. If you lose the flip, sacrifice CARDNAME. SVar:DBReturn:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand SVar:DBSacrifice:DB$ Sacrifice | Defined$ Self -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/viashino_sandswimmer.jpg Oracle:{R}: Flip a coin. If you win the flip, return Viashino Sandswimmer to its owner's hand. If you lose the flip, sacrifice Viashino Sandswimmer. diff --git a/forge-gui/res/cardsfolder/v/viashino_skeleton.txt b/forge-gui/res/cardsfolder/v/viashino_skeleton.txt index 03d23835a41..c3e5dfae2d4 100644 --- a/forge-gui/res/cardsfolder/v/viashino_skeleton.txt +++ b/forge-gui/res/cardsfolder/v/viashino_skeleton.txt @@ -3,6 +3,6 @@ ManaCost:3 R Types:Creature Viashino Skeleton PT:2/1 A:AB$ Regenerate | Cost$ 1 B Discard<1/Card> | SpellDescription$ Regenerate CARDNAME. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/viashino_skeleton.jpg Oracle:{1}{B}, Discard a card: Regenerate Viashino Skeleton. diff --git a/forge-gui/res/cardsfolder/v/vibrating_sphere.txt b/forge-gui/res/cardsfolder/v/vibrating_sphere.txt index aa5cfc7637b..1739e95c44f 100644 --- a/forge-gui/res/cardsfolder/v/vibrating_sphere.txt +++ b/forge-gui/res/cardsfolder/v/vibrating_sphere.txt @@ -3,6 +3,6 @@ ManaCost:4 Types:Artifact S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddPower$ 2 | Condition$ PlayerTurn | Description$ As long as it's your turn, creatures you control get +2/+0. S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddToughness$ -2 | Condition$ NotPlayerTurn | Description$ As long as it's not your turn, creatures you control get -0/-2. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/vibrating_sphere.jpg Oracle:As long as it's your turn, creatures you control get +2/+0.\nAs long as it's not your turn, creatures you control get -0/-2. diff --git a/forge-gui/res/cardsfolder/v/vicious_betrayal.txt b/forge-gui/res/cardsfolder/v/vicious_betrayal.txt index a392e4ae52c..e34393ec1b0 100644 --- a/forge-gui/res/cardsfolder/v/vicious_betrayal.txt +++ b/forge-gui/res/cardsfolder/v/vicious_betrayal.txt @@ -5,6 +5,6 @@ A:SP$ Pump | Cost$ 3 B B Sac | ValidTgts$ Creature | TgtPrompt$ Sele SVar:Y:Sacrificed$Amount SVar:Z:SVar$Y/Times.2 SVar:X:XChoice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/vicious_betrayal.jpg Oracle:As an additional cost to cast Vicious Betrayal, sacrifice any number of creatures.\nTarget creature gets +2/+2 until end of turn for each creature sacrificed this way. diff --git a/forge-gui/res/cardsfolder/v/vicious_shadows.txt b/forge-gui/res/cardsfolder/v/vicious_shadows.txt index e4de050bb89..d263e169603 100644 --- a/forge-gui/res/cardsfolder/v/vicious_shadows.txt +++ b/forge-gui/res/cardsfolder/v/vicious_shadows.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDamage | TriggerDescription$ Whenever a creature dies, you may have CARDNAME deal damage to target player equal to the number of cards in that player's hand. SVar:TrigDamage:DB$DealDamage | ValidTgts$ Player | NumDmg$ X SVar:X:TargetedPlayer$CardsInHand -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/vicious_shadows.jpg Oracle:Whenever a creature dies, you may have Vicious Shadows deal damage to target player equal to the number of cards in that player's hand. diff --git a/forge-gui/res/cardsfolder/v/vigean_intuition.txt b/forge-gui/res/cardsfolder/v/vigean_intuition.txt index 790a744e722..abcff3a628a 100644 --- a/forge-gui/res/cardsfolder/v/vigean_intuition.txt +++ b/forge-gui/res/cardsfolder/v/vigean_intuition.txt @@ -3,6 +3,6 @@ ManaCost:3 G U Types:Instant A:SP$ ChooseType | Cost$ 3 G U | Defined$ You | Type$ Card | SubAbility$ DBDig | SpellDescription$ Choose a card type, then reveal the top four cards of your library. Put all cards of the chosen type revealed this way into your hand and the rest into your graveyard. (Artifact, creature, enchantment, instant, land, planeswalker, sorcery, and tribal are card types.) SVar:DBDig:DB$Dig | DigNum$ 4 | Reveal$ True | ChangeNum$ All | ChangeValid$ Card.ChosenType | DestinationZone2$ Graveyard -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/vigean_intuition.jpg Oracle:Choose a card type, then reveal the top four cards of your library. Put all cards of the chosen type revealed this way into your hand and the rest into your graveyard. (Artifact, creature, enchantment, instant, land, planeswalker, sorcery, and tribal are card types.) diff --git a/forge-gui/res/cardsfolder/v/vigilant_martyr.txt b/forge-gui/res/cardsfolder/v/vigilant_martyr.txt index 230405a1d69..19c648eaefb 100644 --- a/forge-gui/res/cardsfolder/v/vigilant_martyr.txt +++ b/forge-gui/res/cardsfolder/v/vigilant_martyr.txt @@ -4,6 +4,6 @@ Types:Creature Human Cleric PT:1/1 A:AB$ Regenerate | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Regenerate target creature. A:AB$ Counter | Cost$ W W T Sac<1/CARDNAME> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | TargetValidTargeting$ Enchantment.inZoneBattlefield | SpellDescription$ Counter target spell that targets an enchantment. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/vigilant_martyr.jpg Oracle:Sacrifice Vigilant Martyr: Regenerate target creature.\n{W}{W}, {T}, Sacrifice Vigilant Martyr: Counter target spell that targets an enchantment. diff --git a/forge-gui/res/cardsfolder/v/vigilante_justice.txt b/forge-gui/res/cardsfolder/v/vigilante_justice.txt index d2d7b7223d7..5d2bfaa3b88 100644 --- a/forge-gui/res/cardsfolder/v/vigilante_justice.txt +++ b/forge-gui/res/cardsfolder/v/vigilante_justice.txt @@ -3,6 +3,6 @@ ManaCost:3 R Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Human.YouCtrl | TriggerZones$ Battlefield | Execute$ AndJusticeForAll | TriggerDescription$ Whenever a Human enters the battlefield under your control, CARDNAME deals 1 damage to any target. SVar:AndJusticeForAll:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/vigilante_justice.jpg Oracle:Whenever a Human enters the battlefield under your control, Vigilante Justice deals 1 damage to any target. diff --git a/forge-gui/res/cardsfolder/v/vigor_mortis.txt b/forge-gui/res/cardsfolder/v/vigor_mortis.txt index ae73603006a..06371234d63 100644 --- a/forge-gui/res/cardsfolder/v/vigor_mortis.txt +++ b/forge-gui/res/cardsfolder/v/vigor_mortis.txt @@ -5,7 +5,7 @@ A:SP$ ChangeZone | Cost$ 2 B B | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select SVar:DBCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ P1P1 | CounterNum$ 1 | Static$ True | ConditionManaSpent$ G | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:ManaNeededToAvoidNegativeEffect:green -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Green SVar:Picture:http://www.wizards.com/global/images/magic/general/vigor_mortis.jpg Oracle:Return target creature card from your graveyard to the battlefield. If {G} was spent to cast Vigor Mortis, that creature enters the battlefield with an additional +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/v/vigorous_charge.txt b/forge-gui/res/cardsfolder/v/vigorous_charge.txt index dfdaf485b4d..97bec74c5b7 100644 --- a/forge-gui/res/cardsfolder/v/vigorous_charge.txt +++ b/forge-gui/res/cardsfolder/v/vigorous_charge.txt @@ -9,7 +9,7 @@ SVar:VigorousLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X SVar:X:TriggerCount$DamageAmount SVar:EndTrackingEffect:Mode$ ChangesZone | ValidCard$ Card.IsRemembered | Origin$ Battlefield | Destination$ Any | Execute$ ExileEffect | Static$ True SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Color$White SVar:Picture:http://www.wizards.com/global/images/magic/general/vigorous_charge.jpg Oracle:Kicker {W} (You may pay an additional {W} as you cast this spell.)\nTarget creature gains trample until end of turn. Whenever that creature deals combat damage this turn, if Vigorous Charge was kicked, you gain life equal to that damage. diff --git a/forge-gui/res/cardsfolder/v/vile_consumption.txt b/forge-gui/res/cardsfolder/v/vile_consumption.txt index 31c9fd7c3f5..60102ce902f 100644 --- a/forge-gui/res/cardsfolder/v/vile_consumption.txt +++ b/forge-gui/res/cardsfolder/v/vile_consumption.txt @@ -2,6 +2,6 @@ Name:Vile Consumption ManaCost:1 U B Types:Enchantment S:Mode$ Continuous | Affected$ Creature | AddKeyword$ UpkeepCost:PayLife<1> | Description$ All creatures have "At the beginning of your upkeep, sacrifice this creature unless you pay 1 life." -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/vile_consumption.jpg Oracle:All creatures have "At the beginning of your upkeep, sacrifice this creature unless you pay 1 life." diff --git a/forge-gui/res/cardsfolder/v/vindictive_lich.txt b/forge-gui/res/cardsfolder/v/vindictive_lich.txt index b05b44f5f21..6755a847f28 100644 --- a/forge-gui/res/cardsfolder/v/vindictive_lich.txt +++ b/forge-gui/res/cardsfolder/v/vindictive_lich.txt @@ -9,6 +9,6 @@ SVar:DiscardCards:DB$ Discard | ValidTgts$ Opponent | TargetUnique$ True | NumCa SVar:LoseLife:DB$ LoseLife | ValidTgts$ Opponent | TargetUnique$ True | LifeAmount$ 5 | SpellDescription$ Target opponent loses 5 life. SVar:MaxUniqueOpponents:PlayerCountOpponents$Amount #TODO: The AI is able to target the same player with multiple modes, usually all three. This should not happen. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/vindictive_lich.jpg Oracle:When Vindictive Lich dies, choose one or more. Each mode must target a different player.\n• Target opponent sacrifices a creature.\n• Target opponent discards two cards.\n• Target opponent loses 5 life. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/v/vindictive_mob.txt b/forge-gui/res/cardsfolder/v/vindictive_mob.txt index 2e4d098a272..9615210989a 100644 --- a/forge-gui/res/cardsfolder/v/vindictive_mob.txt +++ b/forge-gui/res/cardsfolder/v/vindictive_mob.txt @@ -5,7 +5,7 @@ PT:5/5 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME enters the battlefield, sacrifice a creature. SVar:TrigSac:DB$Sacrifice | Defined$ You | SacValid$ Creature K:CantBeBlockedBy Saproling -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NeedsToPlay:Creature.YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/vindictive_mob.jpg Oracle:When Vindictive Mob enters the battlefield, sacrifice a creature.\nVindictive Mob can't be blocked by Saprolings. diff --git a/forge-gui/res/cardsfolder/v/vine_snare.txt b/forge-gui/res/cardsfolder/v/vine_snare.txt index 482bc87d849..99143fc1b92 100644 --- a/forge-gui/res/cardsfolder/v/vine_snare.txt +++ b/forge-gui/res/cardsfolder/v/vine_snare.txt @@ -3,6 +3,6 @@ ManaCost:2 G Types:Instant A:SP$ Effect | Cost$ 2 G | Name$ Vine Snare Effect | ReplacementEffects$ RPrevent | AILogic$ Fog | SpellDescription$ Prevent all combat damage that would be dealt this turn by creatures with power 4 or less. SVar:RPrevent:Event$ DamageDone | Prevent$ True | ValidSource$ Creature.powerLE4 | IsCombat$ True | ActiveZones$ Command | Description$ Prevent all combat damage that would be dealt this turn by creatures with power 4 or less. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/vine_snare.jpg Oracle:Prevent all combat damage that would be dealt this turn by creatures with power 4 or less. diff --git a/forge-gui/res/cardsfolder/v/viridian_acolyte.txt b/forge-gui/res/cardsfolder/v/viridian_acolyte.txt index 0c87796fe76..34787f6581b 100644 --- a/forge-gui/res/cardsfolder/v/viridian_acolyte.txt +++ b/forge-gui/res/cardsfolder/v/viridian_acolyte.txt @@ -3,6 +3,6 @@ ManaCost:G Types:Creature Elf Shaman PT:1/1 A:AB$ Mana | Cost$ 1 T | Produced$ Any | SpellDescription$ Add one mana of any color. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/viridian_acolyte.jpg Oracle:{1}, {T}: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/v/viridian_harvest.txt b/forge-gui/res/cardsfolder/v/viridian_harvest.txt index f1280377a00..7b58da87b04 100644 --- a/forge-gui/res/cardsfolder/v/viridian_harvest.txt +++ b/forge-gui/res/cardsfolder/v/viridian_harvest.txt @@ -5,6 +5,6 @@ K:Enchant artifact A:SP$ Attach | Cost$ G | ValidTgts$ Artifact | AILogic$ Pump T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.AttachedBy | Execute$ TrigGainLife | TriggerDescription$ When enchanted artifact is put into a graveyard, you gain 6 life. SVar:TrigGainLife:DB$GainLife | Defined$ You | LifeAmount$ 6 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/viridian_harvest.jpg Oracle:Enchant artifact\nWhen enchanted artifact is put into a graveyard, you gain 6 life. diff --git a/forge-gui/res/cardsfolder/v/viridian_joiner.txt b/forge-gui/res/cardsfolder/v/viridian_joiner.txt index 7552d5a6419..29e24de9d28 100644 --- a/forge-gui/res/cardsfolder/v/viridian_joiner.txt +++ b/forge-gui/res/cardsfolder/v/viridian_joiner.txt @@ -4,6 +4,6 @@ Types:Creature Elf Druid PT:1/2 A:AB$ Mana | Cost$ T | Produced$ G | Amount$ X | References$ X | SpellDescription$ Add an amount of {G} equal to CARDNAME's power. SVar:X:Count$CardPower -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/viridian_joiner.jpg Oracle:{T}: Add an amount of {G} equal to Viridian Joiner's power. diff --git a/forge-gui/res/cardsfolder/v/viridian_lorebearers.txt b/forge-gui/res/cardsfolder/v/viridian_lorebearers.txt index 31438ab613b..277deee53bd 100644 --- a/forge-gui/res/cardsfolder/v/viridian_lorebearers.txt +++ b/forge-gui/res/cardsfolder/v/viridian_lorebearers.txt @@ -4,6 +4,6 @@ Types:Creature Elf Shaman PT:3/3 A:AB$ Pump | Cost$ 3 G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | NumDef$ +X | References$ X | SpellDescription$ Target creature gets +X/+X until end of turn, where X is the number of artifacts your opponents control. SVar:X:Count$Valid Artifact.OppCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/viridian_lorebearers.jpg Oracle:{3}{G}, {T}: Target creature gets +X/+X until end of turn, where X is the number of artifacts your opponents control. diff --git a/forge-gui/res/cardsfolder/v/viridian_revel.txt b/forge-gui/res/cardsfolder/v/viridian_revel.txt index ce7ee4b1d93..3875a6a3b2d 100644 --- a/forge-gui/res/cardsfolder/v/viridian_revel.txt +++ b/forge-gui/res/cardsfolder/v/viridian_revel.txt @@ -3,6 +3,6 @@ ManaCost:1 G G Types:Enchantment T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Artifact.OppOwn | Execute$ TrigDraw | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ Whenever an artifact is put into an opponent's graveyard from the battlefield, you may draw a card. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/viridian_revel.jpg Oracle:Whenever an artifact is put into an opponent's graveyard from the battlefield, you may draw a card. diff --git a/forge-gui/res/cardsfolder/v/virtues_ruin.txt b/forge-gui/res/cardsfolder/v/virtues_ruin.txt index 8a82bdc413a..7bb7e2d6e0b 100644 --- a/forge-gui/res/cardsfolder/v/virtues_ruin.txt +++ b/forge-gui/res/cardsfolder/v/virtues_ruin.txt @@ -2,6 +2,6 @@ Name:Virtue's Ruin ManaCost:2 B Types:Sorcery A:SP$ DestroyAll | Cost$ 2 B | ValidCards$ Creature.White | SpellDescription$ Destroy all white creatures. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://serv2.tcgimages.eu/img/cards/Portal/virtues_ruin.jpg Oracle:Destroy all white creatures. diff --git a/forge-gui/res/cardsfolder/v/virulent_plague.txt b/forge-gui/res/cardsfolder/v/virulent_plague.txt index 3e3e2772ee3..333b297ca91 100644 --- a/forge-gui/res/cardsfolder/v/virulent_plague.txt +++ b/forge-gui/res/cardsfolder/v/virulent_plague.txt @@ -3,6 +3,6 @@ ManaCost:2 B Types:Enchantment S:Mode$ Continuous | Affected$ Creature.token | AddPower$ -2 | AddToughness$ -2 | Description$ Creature tokens get -2/-2. SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/virulent_plague.jpg Oracle:Creature tokens get -2/-2. diff --git a/forge-gui/res/cardsfolder/v/viscera_seer.txt b/forge-gui/res/cardsfolder/v/viscera_seer.txt index f20ac64a7b4..da3d3aa3c10 100644 --- a/forge-gui/res/cardsfolder/v/viscera_seer.txt +++ b/forge-gui/res/cardsfolder/v/viscera_seer.txt @@ -3,6 +3,6 @@ ManaCost:B Types:Creature Vampire Wizard PT:1/1 A:AB$ Scry | Cost$ Sac<1/Creature> | ScryNum$ 1 | SpellDescription$ Scry 1. (Look at the top card of your library. You may put that card on the bottom of your library.) -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/viscera_seer.jpg Oracle:Sacrifice a creature: Scry 1. (Look at the top card of your library. You may put that card on the bottom of your library.) diff --git a/forge-gui/res/cardsfolder/v/vish_kal_blood_arbiter.txt b/forge-gui/res/cardsfolder/v/vish_kal_blood_arbiter.txt index 16648010653..aab8240b7e0 100644 --- a/forge-gui/res/cardsfolder/v/vish_kal_blood_arbiter.txt +++ b/forge-gui/res/cardsfolder/v/vish_kal_blood_arbiter.txt @@ -8,6 +8,6 @@ A:AB$PutCounter | Cost$ Sac<1/Creature> | Defined$ Self | CounterType$ P1P1 | Co A:AB$ Pump | Cost$ SubCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -X | NumDef$ -X | References$ X | SpellDescription$ Target creature gets -1/-1 until end of turn for each +1/+1 counter removed this way. SVar:Y:Sacrificed$CardPower SVar:X:SVar$CostCountersRemoved -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/vish_kal_blood_arbiter.jpg Oracle:Flying, lifelink\nSacrifice a creature: Put X +1/+1 counters on Vish Kal, Blood Arbiter, where X is the sacrificed creature's power.\nRemove all +1/+1 counters from Vish Kal: Target creature gets -1/-1 until end of turn for each +1/+1 counter removed this way. diff --git a/forge-gui/res/cardsfolder/v/vision_charm.txt b/forge-gui/res/cardsfolder/v/vision_charm.txt index 0c6e96b7ece..905df13e703 100644 --- a/forge-gui/res/cardsfolder/v/vision_charm.txt +++ b/forge-gui/res/cardsfolder/v/vision_charm.txt @@ -9,6 +9,6 @@ SVar:ChooseType2:DB$ ChooseType | Defined$ You | Type$ Basic Land | AILogic$ Mos SVar:AnimateFirst:DB$ AnimateAll | ValidCards$ Land.IsRemembered | Types$ ChosenType | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:PhaseArtifact:DB$ Phases | ValidTgts$ Artifact | TgtPrompt$ Choose a artifact | SpellDescription$ Target artifact phases out. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/vision_charm.jpg Oracle:Choose one —\n• Target player puts the top four cards of their library into their graveyard.\n• Choose a land type and a basic land type. Each land of the first chosen type becomes the second chosen type until end of turn.\n• Target artifact phases out. (While it's phased out, it's treated as though it doesn't exist. It phases in before its controller untaps during their next untap step.) diff --git a/forge-gui/res/cardsfolder/v/visions.txt b/forge-gui/res/cardsfolder/v/visions.txt index f09981c7e14..fc9a639ec35 100644 --- a/forge-gui/res/cardsfolder/v/visions.txt +++ b/forge-gui/res/cardsfolder/v/visions.txt @@ -3,6 +3,6 @@ ManaCost:W Types:Sorcery A:SP$ Dig | Cost$ W | ValidTgts$ Player | TgtPrompt$ Select target player | DigNum$ 5 | NoMove$ True | SubAbility$ DBShuffle | SpellDescription$ Look at the top five cards of target player's library. You may then have that player shuffle that library. SVar:DBShuffle:DB$Shuffle | Defined$ Targeted | Optional$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/visions.jpg Oracle:Look at the top five cards of target player's library. You may then have that player shuffle that library. diff --git a/forge-gui/res/cardsfolder/v/vitalize.txt b/forge-gui/res/cardsfolder/v/vitalize.txt index 0619731e49d..0accddb85a7 100644 --- a/forge-gui/res/cardsfolder/v/vitalize.txt +++ b/forge-gui/res/cardsfolder/v/vitalize.txt @@ -2,6 +2,6 @@ Name:Vitalize ManaCost:G Types:Instant A:SP$ UntapAll | Cost$ G | ValidCards$ Creature.YouCtrl | SpellDescription$ Untap all creatures you control. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/vitalize.jpg Oracle:Untap all creatures you control. diff --git a/forge-gui/res/cardsfolder/v/vivisection.txt b/forge-gui/res/cardsfolder/v/vivisection.txt index 54c495fbea0..f1c63f06dbc 100644 --- a/forge-gui/res/cardsfolder/v/vivisection.txt +++ b/forge-gui/res/cardsfolder/v/vivisection.txt @@ -2,6 +2,6 @@ Name:Vivisection ManaCost:3 U Types:Sorcery A:SP$ Draw | Cost$ 3 U Sac<1/Creature> | NumCards$ 3 | SpellDescription$ Draw three cards. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/vivisection.jpg Oracle:As an additional cost to cast Vivisection, sacrifice a creature.\nDraw three cards. diff --git a/forge-gui/res/cardsfolder/v/vizier_of_the_anointed.txt b/forge-gui/res/cardsfolder/v/vizier_of_the_anointed.txt index 94392cb367a..e1327b5a432 100644 --- a/forge-gui/res/cardsfolder/v/vizier_of_the_anointed.txt +++ b/forge-gui/res/cardsfolder/v/vizier_of_the_anointed.txt @@ -6,7 +6,7 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:VizierSearch:DB$ ChangeZone | Origin$ Library | Destination$ Graveyard | ChangeNum$ 1 | ChangeType$ Creature.withEmbalm+YouCtrl,Creature.withEternalize+YouCtrl T:Mode$ AbilityCast | ValidCard$ Creature.YouOwn | ValidActivatingPlayer$ You | EternalizeOrEmbalm$ True | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever you activate an eternalize or embalm ability, draw a card. SVar:TrigDraw:DB$ Draw | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Keyword$Eternalize|Embalm SVar:Picture:http://www.wizards.com/global/images/magic/general/vizier_of_the_anointed.jpg Oracle:When Vizier of the Anointed enters the battlefield, search your library for a creature card with eternalize or embalm, put that card into your graveyard, then shuffle your library.\nWhenever you activate an eternalize or embalm ability, draw a card. diff --git a/forge-gui/res/cardsfolder/v/vizier_of_tumbling_sands.txt b/forge-gui/res/cardsfolder/v/vizier_of_tumbling_sands.txt index 7e85a55dc29..05a3f09d01d 100644 --- a/forge-gui/res/cardsfolder/v/vizier_of_tumbling_sands.txt +++ b/forge-gui/res/cardsfolder/v/vizier_of_tumbling_sands.txt @@ -6,6 +6,6 @@ A:AB$ Untap | Cost$ T | ValidTgts$ Permanent.Other | TgtPrompt$ Select another t K:Cycling:1 U T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigUntap | TriggerDescription$ When you cycle CARDNAME, untap target permanent. SVar:TrigUntap:DB$Untap | ValidTgts$ Permanent | TgtPrompt$ Select target permanent -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/vizier_of_tumbling_sands.jpg Oracle:{T}: Untap another target permanent.\nCycling {1}{U} ({1}{U}, Discard this card: Draw a card.)\nWhen you cycle Vizier of Tumbling Sands, untap target permanent. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/v/vodalian_hypnotist.txt b/forge-gui/res/cardsfolder/v/vodalian_hypnotist.txt index a5f9f2de577..46c75d445d3 100644 --- a/forge-gui/res/cardsfolder/v/vodalian_hypnotist.txt +++ b/forge-gui/res/cardsfolder/v/vodalian_hypnotist.txt @@ -3,7 +3,7 @@ ManaCost:1 U Types:Creature Merfolk Wizard PT:1/1 A:AB$ Discard | Cost$ 2 B T | ValidTgts$ Player | SorcerySpeed$ True | NumCards$ 1 | Mode$ TgtChoose | SpellDescription$ Target player discards a card. Activate this ability only any time you could cast a sorcery. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black SVar:Picture:http://www.wizards.com/global/images/magic/general/vodalian_hypnotist.jpg Oracle:{2}{B}, {T}: Target player discards a card. Activate this ability only any time you could cast a sorcery. diff --git a/forge-gui/res/cardsfolder/v/vodalian_illusionist.txt b/forge-gui/res/cardsfolder/v/vodalian_illusionist.txt index ef0bbe7de0a..c824687a390 100644 --- a/forge-gui/res/cardsfolder/v/vodalian_illusionist.txt +++ b/forge-gui/res/cardsfolder/v/vodalian_illusionist.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Creature Merfolk Wizard PT:2/2 A:AB$ Phases | Cost$ U U T | ValidTgts$ Creature | SpellDescription$ Target creature phases out. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/vodalian_illusionist.jpg Oracle:{U}{U}, {T}: Target creature phases out. (While it's phased out, it's treated as though it doesn't exist. It phases in before its controller untaps during their next untap step.) diff --git a/forge-gui/res/cardsfolder/v/vodalian_mystic.txt b/forge-gui/res/cardsfolder/v/vodalian_mystic.txt index 08985d8fe01..84b88975a13 100644 --- a/forge-gui/res/cardsfolder/v/vodalian_mystic.txt +++ b/forge-gui/res/cardsfolder/v/vodalian_mystic.txt @@ -5,7 +5,7 @@ PT:1/1 A:AB$ ChooseColor | Cost$ T | Defined$ You | SubAbility$ Animate | SpellDescription$ Target instant or sorcery spell becomes the color of your choice. SVar:Animate:DB$ Animate | ValidTgts$ Instant.inZoneStack,Sorcery.inZoneStack | TgtPrompt$ Select target instant or sorcery spell to change the color of | TgtZone$ Stack,Battlefield | Colors$ ChosenColor | OverwriteColors$ True | Permanent$ True #For the above part to work, another zone MUST be included because of interaction with regular targeting on the stack that stops the ability from working correctly. Use the inZone targeting restriction to limit it to stack. TODO: Probably need to fix this properly. -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/vodalian_mystic.jpg Oracle:{T}: Target instant or sorcery spell becomes the color of your choice. diff --git a/forge-gui/res/cardsfolder/v/voice_of_the_woods.txt b/forge-gui/res/cardsfolder/v/voice_of_the_woods.txt index 41a3aa834fa..7ca4fdc7ff7 100644 --- a/forge-gui/res/cardsfolder/v/voice_of_the_woods.txt +++ b/forge-gui/res/cardsfolder/v/voice_of_the_woods.txt @@ -3,6 +3,6 @@ ManaCost:3 G G Types:Creature Elf PT:2/2 A:AB$ Token | Cost$ tapXType<5/Elf> | TokenOwner$ You | TokenAmount$ 1 | TokenName$ Elemental | TokenTypes$ Creature,Elemental | TokenColors$ Green | TokenPower$ 7 | TokenToughness$ 7 | TokenKeywords$ Trample |SpellDescription$ Create a 7/7 green Elemental creature token with trample. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/voice_of_the_woods.jpg Oracle:Tap five untapped Elves you control: Create a 7/7 green Elemental creature token with trample. diff --git a/forge-gui/res/cardsfolder/v/voices_from_the_void.txt b/forge-gui/res/cardsfolder/v/voices_from_the_void.txt index 7adb49a1b7a..ed076a5fee5 100644 --- a/forge-gui/res/cardsfolder/v/voices_from_the_void.txt +++ b/forge-gui/res/cardsfolder/v/voices_from_the_void.txt @@ -3,6 +3,6 @@ ManaCost:4 B Types:Sorcery A:SP$ Discard | Cost$ 4 B | ValidTgts$ Player | NumCards$ X | References$ X | Mode$ TgtChoose | SpellDescription$ Domain — Target player discards a card for each basic land type among lands you control. SVar:X:Count$Domain -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/voices_from_the_void.jpg Oracle:Domain — Target player discards a card for each basic land type among lands you control. diff --git a/forge-gui/res/cardsfolder/v/void.txt b/forge-gui/res/cardsfolder/v/void.txt index 925c3d8b87d..ef5dc99767d 100644 --- a/forge-gui/res/cardsfolder/v/void.txt +++ b/forge-gui/res/cardsfolder/v/void.txt @@ -5,6 +5,6 @@ A:SP$ ChooseNumber | Cost$ 3 B R | SubAbility$ DBVoidDestroyAll | SpellDescripti SVar:DBVoidDestroyAll:DB$ DestroyAll | ValidCards$ Artifact.cmcEQX,Creature.cmcEQX | SubAbility$ DBVoidRevealDiscard SVar:DBVoidRevealDiscard:DB$ Discard | ValidTgts$ Player | TgtPrompt$ Select target player | Mode$ RevealDiscardAll | DiscardValid$ Card.nonLand+cmcEQX SVar:X:Number$ChosenNumber -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/void.jpg Oracle:Choose a number. Destroy all artifacts and creatures with converted mana cost equal to that number. Then target player reveals their hand and discards all nonland cards with converted mana cost equal to the number. diff --git a/forge-gui/res/cardsfolder/v/voidmage_apprentice.txt b/forge-gui/res/cardsfolder/v/voidmage_apprentice.txt index 8ee446bec9d..f61eb9dc7af 100644 --- a/forge-gui/res/cardsfolder/v/voidmage_apprentice.txt +++ b/forge-gui/res/cardsfolder/v/voidmage_apprentice.txt @@ -5,6 +5,6 @@ PT:1/1 K:Morph:2 U U T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigCounter | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME is turned face up, counter target spell. SVar:TrigCounter:DB$ Counter | TargetType$ Spell | ValidTgts$ Card | TgtPrompt$ Select target spell -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/voidmage_apprentice.jpg Oracle:Morph {2}{U}{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.)\nWhen Voidmage Apprentice is turned face up, counter target spell. diff --git a/forge-gui/res/cardsfolder/v/voidmage_prodigy.txt b/forge-gui/res/cardsfolder/v/voidmage_prodigy.txt index bbfcb78ee52..e46fe2debe2 100644 --- a/forge-gui/res/cardsfolder/v/voidmage_prodigy.txt +++ b/forge-gui/res/cardsfolder/v/voidmage_prodigy.txt @@ -4,6 +4,6 @@ Types:Creature Human Wizard PT:2/1 K:Morph:U A:AB$ Counter | Cost$ U U Sac<1/Wizard> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SpellDescription$ Counter target spell. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/voidmage_prodigy.jpg Oracle:{U}{U}, Sacrifice a Wizard: Counter target spell.\nMorph {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.) diff --git a/forge-gui/res/cardsfolder/v/voidslime.txt b/forge-gui/res/cardsfolder/v/voidslime.txt index 122e130ce65..b5feb63abbf 100644 --- a/forge-gui/res/cardsfolder/v/voidslime.txt +++ b/forge-gui/res/cardsfolder/v/voidslime.txt @@ -2,6 +2,6 @@ Name:Voidslime ManaCost:G U U Types:Instant A:SP$ Counter | Cost$ G U U | TargetType$ Spell,Activated,Triggered | TgtPrompt$ Select target spell or ability | ValidTgts$ Card | SpellDescription$ Counter target spell, activated ability, or triggered ability. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/voidslime.jpg Oracle:Counter target spell, activated ability, or triggered ability. (Mana abilities can't be targeted.) diff --git a/forge-gui/res/cardsfolder/v/voidstone_gargoyle.txt b/forge-gui/res/cardsfolder/v/voidstone_gargoyle.txt index bddcc0c59c6..2904a586c87 100644 --- a/forge-gui/res/cardsfolder/v/voidstone_gargoyle.txt +++ b/forge-gui/res/cardsfolder/v/voidstone_gargoyle.txt @@ -7,6 +7,6 @@ K:ETBReplacement:Other:DBNameCard SVar:DBNameCard:DB$ NameCard | Defined$ You | ValidCards$ Card.nonLand | ValidDesc$ nonland | SpellDescription$ As CARDNAME enters the battlefield, choose a nonland card name. S:Mode$ CantBeCast | ValidCard$ Card.NamedCard | Description$ Spells with the chosen name can't be cast. S:Mode$ CantBeActivated | ValidCard$ Card.NamedCard | Description$ Activated abilities of sources with the chosen name can't be activated. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/voidstone_gargoyle.jpg Oracle:Flying\nAs Voidstone Gargoyle enters the battlefield, choose a nonland card name.\nSpells with the chosen name can't be cast.\nActivated abilities of sources with the chosen name can't be activated. diff --git a/forge-gui/res/cardsfolder/v/volcanic_eruption.txt b/forge-gui/res/cardsfolder/v/volcanic_eruption.txt index 8d7a283f2bf..df850dbd1a6 100644 --- a/forge-gui/res/cardsfolder/v/volcanic_eruption.txt +++ b/forge-gui/res/cardsfolder/v/volcanic_eruption.txt @@ -6,6 +6,6 @@ SVar:DBDamage:DB$DamageAll | NumDmg$ Y | References$ Y | ValidCards$ Creature | SVar:X:Count$xPaid SVar:Y:Count$ValidGraveyard Mountain.IsRemembered SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/volcanic_eruption.jpg Oracle:Destroy X target Mountains. Volcanic Eruption deals damage to each creature and each player equal to the number of Mountains put into a graveyard this way. diff --git a/forge-gui/res/cardsfolder/v/volcano_hellion.txt b/forge-gui/res/cardsfolder/v/volcano_hellion.txt index bb38ad278e3..790be18c0c8 100644 --- a/forge-gui/res/cardsfolder/v/volcano_hellion.txt +++ b/forge-gui/res/cardsfolder/v/volcano_hellion.txt @@ -10,6 +10,6 @@ SVar:DBDmg:DB$ DealDamage | ValidTgts$ Creature | NumDmg$ Y | References$ Y | No SVar:DmgYou:DB$ DealDamage | Defined$ You | NumDmg$ Y | References$ Y | NoPrevention$ True SVar:X:Count$YourLifeTotal SVar:Y:Count$ChosenNumber -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/volcano_hellion.jpg Oracle:Volcano Hellion has echo {X}, where X is your life total. (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.)\nWhen Volcano Hellion enters the battlefield, it deals an amount of damage of your choice to you and target creature. The damage can't be prevented. diff --git a/forge-gui/res/cardsfolder/v/volraths_dungeon.txt b/forge-gui/res/cardsfolder/v/volraths_dungeon.txt index 8eaeac2b22f..e7a2b30f6a8 100644 --- a/forge-gui/res/cardsfolder/v/volraths_dungeon.txt +++ b/forge-gui/res/cardsfolder/v/volraths_dungeon.txt @@ -3,6 +3,6 @@ ManaCost:2 B B Types:Enchantment A:AB$ Destroy | Cost$ PayLife<5> | Defined$ Self | PlayerTurn$ True | AnyPlayer$ True | SpellDescription$ Destroy CARDNAME. Any player may activate this ability but only during their turn. A:AB$ ChangeZone | Cost$ Discard<1/Card> | ValidTgts$ Player | TgtPrompt$ Select target player | Origin$ Hand | Destination$ Library | ChangeType$ Card | ChangeNum$ 1 | Chooser$ Targeted | LibraryPosition$ 0 | SorcerySpeed$ True | SpellDescription$ Target player puts a card from their hand on top of their library. Activate this ability only any time you could cast a sorcery. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/volraths_dungeon.jpg Oracle:Pay 5 life: Destroy Volrath's Dungeon. Any player may activate this ability but only during their turn.\nDiscard a card: Target player puts a card from their hand on top of their library. Activate this ability only any time you could cast a sorcery. diff --git a/forge-gui/res/cardsfolder/v/volraths_gardens.txt b/forge-gui/res/cardsfolder/v/volraths_gardens.txt index 8aa23ba1e34..a25f699606f 100644 --- a/forge-gui/res/cardsfolder/v/volraths_gardens.txt +++ b/forge-gui/res/cardsfolder/v/volraths_gardens.txt @@ -2,7 +2,7 @@ Name:Volrath's Gardens ManaCost:1 G Types:Enchantment A:AB$ GainLife | Cost$ 2 tapXType<1/Creature> | LifeAmount$ 2 | SorcerySpeed$ True | SpellDescription$ You gain 2 life. Activate this ability only any time you could cast a sorcery. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/volraths_gardens.jpg Oracle:{2}, Tap an untapped creature you control: You gain 2 life. Activate this ability only any time you could cast a sorcery. diff --git a/forge-gui/res/cardsfolder/v/volraths_laboratory.txt b/forge-gui/res/cardsfolder/v/volraths_laboratory.txt index 99939653ff9..e6c62f5cd1f 100644 --- a/forge-gui/res/cardsfolder/v/volraths_laboratory.txt +++ b/forge-gui/res/cardsfolder/v/volraths_laboratory.txt @@ -5,6 +5,6 @@ K:ETBReplacement:Other:ChooseColor SVar:ChooseColor:DB$ ChooseColor | Defined$ You | SubAbility$ ChooseCT | AILogic$ MostProminentInComputerDeck | SpellDescription$ As CARDNAME enters the battlefield, choose a color and a creature type. SVar:ChooseCT:DB$ ChooseType | Defined$ You | AILogic$ MostProminentInComputerDeck | Type$ Creature A:AB$ Token | Cost$ 5 T | TokenAmount$ 1 | TokenName$ ChosenType | TokenTypes$ Creature,ChosenType | TokenOwner$ You | TokenColors$ ChosenColor | TokenPower$ 2 | TokenToughness$ 2 | TokenImage$ c 2 2 volraths laboratory | SpellDescription$ Create a 2/2 creature token of the chosen color and type. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/volraths_laboratory.jpg Oracle:As Volrath's Laboratory enters the battlefield, choose a color and a creature type.\n{5}, {T}: Create a 2/2 creature token of the chosen color and type. diff --git a/forge-gui/res/cardsfolder/v/volraths_stronghold.txt b/forge-gui/res/cardsfolder/v/volraths_stronghold.txt index b031f61b2ee..5f8adcd5a13 100644 --- a/forge-gui/res/cardsfolder/v/volraths_stronghold.txt +++ b/forge-gui/res/cardsfolder/v/volraths_stronghold.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Legendary Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ ChangeZone | Cost$ 1 B T | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | Origin$ Graveyard | Destination$ Library | SpellDescription$ Put target creature card from your graveyard on top of your library. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/volraths_stronghold.jpg Oracle:{T}: Add {C}.\n{1}{B}, {T}: Put target creature card from your graveyard on top of your library. diff --git a/forge-gui/res/cardsfolder/v/voltaic_key.txt b/forge-gui/res/cardsfolder/v/voltaic_key.txt index 2a510ad30b9..21f1ede178a 100644 --- a/forge-gui/res/cardsfolder/v/voltaic_key.txt +++ b/forge-gui/res/cardsfolder/v/voltaic_key.txt @@ -2,6 +2,6 @@ Name:Voltaic Key ManaCost:1 Types:Artifact A:AB$ Untap | Cost$ 1 T | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Untap target artifact. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/voltaic_key.jpg Oracle:{1}, {T}: Untap target artifact. diff --git a/forge-gui/res/cardsfolder/v/volunteer_reserves.txt b/forge-gui/res/cardsfolder/v/volunteer_reserves.txt index 32f72e04768..6bf68eb7b81 100644 --- a/forge-gui/res/cardsfolder/v/volunteer_reserves.txt +++ b/forge-gui/res/cardsfolder/v/volunteer_reserves.txt @@ -4,6 +4,6 @@ Types:Creature Human Soldier PT:2/4 K:Banding K:Cumulative upkeep:1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/volunteer_reserves.jpg Oracle:Banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.)\nCumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) diff --git a/forge-gui/res/cardsfolder/v/vona_butcher_of_magan.txt b/forge-gui/res/cardsfolder/v/vona_butcher_of_magan.txt index edafd9983ee..2d9918f85bd 100644 --- a/forge-gui/res/cardsfolder/v/vona_butcher_of_magan.txt +++ b/forge-gui/res/cardsfolder/v/vona_butcher_of_magan.txt @@ -6,6 +6,6 @@ K:Vigilance K:Lifelink A:AB$ Destroy | Cost$ T PayLife<7> | PlayerTurn$ True | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | AILogic$ AtEOTIfNotAttacking | SpellDescription$ Destroy target nonland permanent. Activate this ability only during your turn. DeckHas:Ability$LifeGain -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/vona_butcher_of_magan.jpg Oracle:Vigilance, lifelink\n{T}, Pay 7 life: Destroy target nonland permanent. Activate this ability only during your turn. diff --git a/forge-gui/res/cardsfolder/v/vonas_hunger.txt b/forge-gui/res/cardsfolder/v/vonas_hunger.txt index 3233c32643e..44bb9be41ca 100644 --- a/forge-gui/res/cardsfolder/v/vonas_hunger.txt +++ b/forge-gui/res/cardsfolder/v/vonas_hunger.txt @@ -7,6 +7,6 @@ SVar:DBRepeatEach:DB$ RepeatEach | RepeatPlayers$ Player.Opponent | ConditionChe SVar:DBSacrifice:DB$ Sacrifice | Amount$ Y | References$ Y | SacValid$ Creature | Defined$ Remembered SVar:X:Count$Blessing.1.0 SVar:Y:Count$Valid Creature.RememberedPlayerCtrl/HalfUp -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/vonas_hunger.jpg Oracle:Ascend (If you control ten or more permanents, you get the city's blessing for the rest of the game.)\nEach opponent sacrifices a creature. If you have the city's blessing, instead each opponent sacrifices half the creatures they control, rounded up. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/v/voodoo_doll.txt b/forge-gui/res/cardsfolder/v/voodoo_doll.txt index fa84cae9150..2a6145a01b5 100644 --- a/forge-gui/res/cardsfolder/v/voodoo_doll.txt +++ b/forge-gui/res/cardsfolder/v/voodoo_doll.txt @@ -8,6 +8,6 @@ SVar:TrigPutCounter:DB$PutCounter | CounterType$ PIN | CounterNum$ 1 | Defined$ SVar:TrigDestroy:DB$Destroy | Defined$ Self | SubAbility$ DBDealDamageYou SVar:DBDealDamageYou:DB$DealDamage | Defined$ You | NumDmg$ X | References$ X SVar:X:Count$CardCounters.PIN -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/voodoo_doll.jpg Oracle:At the beginning of your upkeep, put a pin counter on Voodoo Doll.\nAt the beginning of your end step, if Voodoo Doll is untapped, destroy Voodoo Doll and it deals damage to you equal to the number of pin counters on it.\n{X}{X}, {T}: Voodoo Doll deals damage equal to the number of pin counters on it to any target. X is the number of pin counters on Voodoo Doll. diff --git a/forge-gui/res/cardsfolder/v/vortex_elemental.txt b/forge-gui/res/cardsfolder/v/vortex_elemental.txt index cb6f3cb6323..6970ee17afc 100644 --- a/forge-gui/res/cardsfolder/v/vortex_elemental.txt +++ b/forge-gui/res/cardsfolder/v/vortex_elemental.txt @@ -4,6 +4,6 @@ Types:Creature Elemental PT:0/1 A:AB$ ChangeZoneAll | Cost$ U | ChangeType$ Card.Self,Creature.blockingSource,Creature.blockedBySource | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | Shuffle$ True | SpellDescription$ Put CARDNAME and each creature blocking or blocked by it on top of their owners' libraries, then those players shuffle their libraries. A:AB$ MustBlock | Cost$ 3 U U | ValidTgts$ Creature | TgtPrompt$ Select target creature that must block this creature this turn | SpellDescription$ Target creature blocks CARDNAME this turn if able. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/vortex_elemental.jpg Oracle:{U}: Put Vortex Elemental and each creature blocking or blocked by it on top of their owners' libraries, then those players shuffle their libraries.\n{3}{U}{U}: Target creature blocks Vortex Elemental this turn if able. diff --git a/forge-gui/res/cardsfolder/v/voyager_staff.txt b/forge-gui/res/cardsfolder/v/voyager_staff.txt index 38ee2bd38d4..986e6564896 100644 --- a/forge-gui/res/cardsfolder/v/voyager_staff.txt +++ b/forge-gui/res/cardsfolder/v/voyager_staff.txt @@ -5,6 +5,6 @@ A:AB$ ChangeZone | Cost$ 2 Sac<1/CARDNAME> | ValidTgts$ Creature | Origin$ Battl SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | RememberObjects$ Remembered | TriggerDescription$ Return exiled creatures to the battlefield. | SubAbility$ DBCleanup SVar:TrigReturn:DB$ ChangeZone | Origin$ Exile | Destination$ Battlefield | Defined$ DelayTriggerRemembered SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/voyager_staff.jpg Oracle:{2}, Sacrifice Voyager Staff: Exile target creature. Return the exiled card to the battlefield under its owner's control at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/v/vulshok_war_boar.txt b/forge-gui/res/cardsfolder/v/vulshok_war_boar.txt index bb6ef8ba6ce..95c85f9b77c 100644 --- a/forge-gui/res/cardsfolder/v/vulshok_war_boar.txt +++ b/forge-gui/res/cardsfolder/v/vulshok_war_boar.txt @@ -4,6 +4,6 @@ Types:Creature Boar Beast PT:5/5 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSacUnless | TriggerDescription$ When CARDNAME enters the battlefield, sacrifice it unless you sacrifice an artifact. SVar:TrigSacUnless:DB$ Sacrifice | Defined$ Self | UnlessCost$ Sac<1/Artifact> | UnlessPayer$ You -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/vulshok_war_boar.jpg Oracle:When Vulshok War Boar enters the battlefield, sacrifice it unless you sacrifice an artifact. diff --git a/forge-gui/res/cardsfolder/w/waiting_in_the_weeds.txt b/forge-gui/res/cardsfolder/w/waiting_in_the_weeds.txt index 707d6457a1b..f563833fb50 100644 --- a/forge-gui/res/cardsfolder/w/waiting_in_the_weeds.txt +++ b/forge-gui/res/cardsfolder/w/waiting_in_the_weeds.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ RepeatEach | Cost$ 1 G G | RepeatSubAbility$ DBToken | RepeatPlayers$ Player | SpellDescription$ Each player creates a 1/1 green Cat creature token for each untapped Forest they control. SVar:DBToken:DB$ Token | TokenAmount$ CountForest | References$ CountForest | TokenName$ Cat | TokenTypes$ Creature,Cat | TokenOwner$ Player.IsRemembered | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 SVar:CountForest:Count$Valid Forest.untapped+RememberedPlayerCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/waiting_in_the_weeds.jpg Oracle:Each player creates a 1/1 green Cat creature token for each untapped Forest they control. diff --git a/forge-gui/res/cardsfolder/w/wake_of_destruction.txt b/forge-gui/res/cardsfolder/w/wake_of_destruction.txt index a7e556c53c8..eb42f65c753 100644 --- a/forge-gui/res/cardsfolder/w/wake_of_destruction.txt +++ b/forge-gui/res/cardsfolder/w/wake_of_destruction.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ Destroy | Cost$ 3 R R R | ValidTgts$ Land | TgtPrompt$ Select target land | RememberTargets$ True | SubAbility$ DBWakeofDestructionDestroyThemAll | SpellDescription$ Destroy target land and all other lands with the same name as that land. SVar:DBWakeofDestructionDestroyThemAll:DB$ DestroyAll | ValidCards$ Remembered.sameName | SubAbility$ DBWakeofDestructionCleanup SVar:DBWakeofDestructionCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wake_of_destruction.jpg Oracle:Destroy target land and all other lands with the same name as that land. diff --git a/forge-gui/res/cardsfolder/w/wake_the_dead.txt b/forge-gui/res/cardsfolder/w/wake_the_dead.txt index 1e29f521e6c..8336d084fd9 100644 --- a/forge-gui/res/cardsfolder/w/wake_the_dead.txt +++ b/forge-gui/res/cardsfolder/w/wake_the_dead.txt @@ -6,6 +6,6 @@ A:SP$ ChangeZone | Cost$ X B B | TargetMin$ 0 | TargetMax$ MaxTgts | OpponentTur SVar:X:Targeted$Amount SVar:MaxTgts:Count$TypeInYourYard.Creature SVar:DBPump:DB$ Pump | Defined$ Targeted | AtEOT$ Sacrifice -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wake_the_dead.jpg Oracle:Cast Wake the Dead only during combat on an opponent's turn.\nReturn X target creature cards from your graveyard to the battlefield. Sacrifice those creatures at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/w/walk_the_aeons.txt b/forge-gui/res/cardsfolder/w/walk_the_aeons.txt index e00b1ce29d8..5e9c6a46a03 100644 --- a/forge-gui/res/cardsfolder/w/walk_the_aeons.txt +++ b/forge-gui/res/cardsfolder/w/walk_the_aeons.txt @@ -3,6 +3,6 @@ ManaCost:4 U U Types:Sorcery K:Buyback:Sac<3/Island> A:SP$ AddTurn | Cost$ 4 U U | ValidTgts$ Player | TgtPrompt$ Select target player | NumTurns$ 1 | SpellDescription$ Target player takes an extra turn after this one. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/walk_the_aeons.jpg Oracle:Buyback—Sacrifice three Islands. (You may sacrifice three Islands in addition to any other costs as you cast this spell. If you do, put this card into your hand as it resolves.)\nTarget player takes an extra turn after this one. diff --git a/forge-gui/res/cardsfolder/w/walking_archive.txt b/forge-gui/res/cardsfolder/w/walking_archive.txt index 520a9ef73ae..60450f0364a 100644 --- a/forge-gui/res/cardsfolder/w/walking_archive.txt +++ b/forge-gui/res/cardsfolder/w/walking_archive.txt @@ -8,6 +8,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield A:AB$ PutCounter | Cost$ 2 W U | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on CARDNAME. SVar:TrigDraw:DB$ Draw | NumCards$ X | Defined$ TriggeredPlayer | References$ X SVar:X:Count$CardCounters.P1P1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/walking_archive.jpg Oracle:Defender (This creature can't attack.)\nWalking Archive enters the battlefield with a +1/+1 counter on it.\nAt the beginning of each player's upkeep, that player draws a card for each +1/+1 counter on Walking Archive.\n{2}{W}{U}: Put a +1/+1 counter on Walking Archive. diff --git a/forge-gui/res/cardsfolder/w/walking_desecration.txt b/forge-gui/res/cardsfolder/w/walking_desecration.txt index d6c6b2e8d39..b3da1530bf6 100644 --- a/forge-gui/res/cardsfolder/w/walking_desecration.txt +++ b/forge-gui/res/cardsfolder/w/walking_desecration.txt @@ -4,6 +4,6 @@ Types:Creature Zombie PT:1/1 A:AB$ ChooseType | Cost$ B T | Defined$ You | Type$ Creature | SubAbility$ DBPumpAll | SpellDescription$ Creatures of the creature type of your choice attack this turn if able. SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.ChosenType | IsCurse$ True | KW$ HIDDEN CARDNAME attacks each combat if able. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/walking_desecration.jpg Oracle:{B}, {T}: Creatures of the creature type of your choice attack this turn if able. diff --git a/forge-gui/res/cardsfolder/w/walking_sponge.txt b/forge-gui/res/cardsfolder/w/walking_sponge.txt index aa1c9c5622a..a5a43882e4d 100644 --- a/forge-gui/res/cardsfolder/w/walking_sponge.txt +++ b/forge-gui/res/cardsfolder/w/walking_sponge.txt @@ -7,6 +7,6 @@ SVar:MakeChoice:DB$ GenericChoice | Choices$ SpongeFly,SpongeStrike,SpongeTramp SVar:SpongeFly:DB$Animate | Defined$ Targeted | RemoveKeywords$ Flying | SpellDescription$ Targeted creature loses flying. SVar:SpongeStrike:DB$Animate | Defined$ Targeted | RemoveKeywords$ First Strike | SpellDescription$ Targeted creature loses first strike. SVar:SpongeTramp:DB$Animate | Defined$ Targeted | RemoveKeywords$ Trample | SpellDescription$ Targeted creature loses trample. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/walking_sponge.jpg Oracle:{T}: Target creature loses your choice of flying, first strike, or trample until end of turn. diff --git a/forge-gui/res/cardsfolder/w/wall_of_limbs.txt b/forge-gui/res/cardsfolder/w/wall_of_limbs.txt index 78ef446db08..cc998a36401 100644 --- a/forge-gui/res/cardsfolder/w/wall_of_limbs.txt +++ b/forge-gui/res/cardsfolder/w/wall_of_limbs.txt @@ -7,7 +7,7 @@ T:Mode$ LifeGained | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ Tri SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 A:AB$ LoseLife | Cost$ 5 B B Sac<1/CARDNAME> | LifeAmount$ X | References$ X | ValidTgts$ Player | TgtPrompt$ Select a player | SpellDescription$ Target player loses X life, where X is CARDNAME's power. SVar:X:Sacrificed$CardPower -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_limbs.jpg Oracle:Defender (This creature can't attack.)\nWhenever you gain life, put a +1/+1 counter on Wall of Limbs.\n{5}{B}{B}, Sacrifice Wall of Limbs: Target player loses X life, where X is Wall of Limbs's power. diff --git a/forge-gui/res/cardsfolder/w/wall_of_shadows.txt b/forge-gui/res/cardsfolder/w/wall_of_shadows.txt index c4d25791e79..21edba2701f 100644 --- a/forge-gui/res/cardsfolder/w/wall_of_shadows.txt +++ b/forge-gui/res/cardsfolder/w/wall_of_shadows.txt @@ -5,6 +5,6 @@ PT:0/1 K:Defender R:Event$ DamageDone | Prevent$ True | ValidSource$ Creature.blockedBySource | ValidTarget$ Creature.Self | Description$ Prevent all damage that would be dealt to CARDNAME by creatures it's blocking. S:Mode$ CantTarget | ValidCard$ Card.Self | SourceCanOnlyTarget$ Wall | Description$ CARDNAME can't be the target of spells that can target only Walls or of abilities that can target only Walls. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_shadows.jpg Oracle:Defender (This creature can't attack.)\nPrevent all damage that would be dealt to Wall of Shadows by creatures it's blocking.\nWall of Shadows can't be the target of spells that can target only Walls or of abilities that can target only Walls. diff --git a/forge-gui/res/cardsfolder/w/wall_of_shards.txt b/forge-gui/res/cardsfolder/w/wall_of_shards.txt index 7cfb508159b..a8f27258b48 100644 --- a/forge-gui/res/cardsfolder/w/wall_of_shards.txt +++ b/forge-gui/res/cardsfolder/w/wall_of_shards.txt @@ -5,6 +5,6 @@ PT:1/8 K:Defender K:Flying K:Cumulative upkeep:GainLife<1/Player.Opponent>:An opponent gains 1 life. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_shards.jpg Oracle:Defender, flying\nCumulative upkeep—An opponent gains 1 life. (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.) diff --git a/forge-gui/res/cardsfolder/w/wall_of_shields.txt b/forge-gui/res/cardsfolder/w/wall_of_shields.txt index f876d86beb2..25c2d9cea57 100644 --- a/forge-gui/res/cardsfolder/w/wall_of_shields.txt +++ b/forge-gui/res/cardsfolder/w/wall_of_shields.txt @@ -4,6 +4,6 @@ Types:Artifact Creature Wall PT:0/4 K:Defender K:Banding -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_shields.jpg Oracle:Defender (This creature can't attack.)\nBanding (If any creatures with banding you control are blocking a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by.) diff --git a/forge-gui/res/cardsfolder/w/wall_of_vapor.txt b/forge-gui/res/cardsfolder/w/wall_of_vapor.txt index 76762ca32bb..0f1e04c125f 100644 --- a/forge-gui/res/cardsfolder/w/wall_of_vapor.txt +++ b/forge-gui/res/cardsfolder/w/wall_of_vapor.txt @@ -4,6 +4,6 @@ Types:Creature Wall PT:0/1 K:Defender R:Event$ DamageDone | Prevent$ True | ValidSource$ Creature.blockedBySource | ValidTarget$ Creature.Self | Description$ Prevent all damage that would be dealt to CARDNAME by creatures it's blocking. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_vapor.jpg Oracle:Defender (This creature can't attack.)\nPrevent all damage that would be dealt to Wall of Vapor by creatures it's blocking. diff --git a/forge-gui/res/cardsfolder/w/wall_of_vipers.txt b/forge-gui/res/cardsfolder/w/wall_of_vipers.txt index 08898dbc471..12052c48d26 100644 --- a/forge-gui/res/cardsfolder/w/wall_of_vipers.txt +++ b/forge-gui/res/cardsfolder/w/wall_of_vipers.txt @@ -5,6 +5,6 @@ PT:2/4 K:Defender A:AB$ Destroy | Cost$ 3 | Defined$ Self | AnyPlayer$ True | SubAbility$ SnakeBite | SpellDescription$ Destroy CARDNAME and target creature it's blocking. Any player may activate this ability. SVar:SnakeBite:DB$ Destroy | ValidTgts$ Creature.blockedBySource -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_vipers.jpg Oracle:Defender (This creature can't attack.)\n{3}: Destroy Wall of Vipers and target creature it's blocking. Any player may activate this ability. diff --git a/forge-gui/res/cardsfolder/w/wallop.txt b/forge-gui/res/cardsfolder/w/wallop.txt index f05776b9cfa..453e941f15a 100644 --- a/forge-gui/res/cardsfolder/w/wallop.txt +++ b/forge-gui/res/cardsfolder/w/wallop.txt @@ -2,6 +2,6 @@ Name:Wallop ManaCost:1 G Types:Sorcery A:SP$ Destroy | Cost$ 1 G | ValidTgts$ Creature.Blue+withFlying,Creature.Black+withFlying | TgtPrompt$ Select target blue or black creature with flying | SpellDescription$ Destroy target blue or black creature with flying. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/wallop.jpg Oracle:Destroy target blue or black creature with flying. diff --git a/forge-gui/res/cardsfolder/w/wand_of_denial.txt b/forge-gui/res/cardsfolder/w/wand_of_denial.txt index fd8e230439e..83c3dd7c391 100644 --- a/forge-gui/res/cardsfolder/w/wand_of_denial.txt +++ b/forge-gui/res/cardsfolder/w/wand_of_denial.txt @@ -4,6 +4,6 @@ Types:Artifact A:AB$ Dig | Cost$ T | ValidTgts$ Player | TgtPrompt$ Select target player | DigNum$ 1 | NoMove$ True | RememberRevealed$ True | SubAbility$ DBChangeZone | StackDescription$ SpellDescription | SpellDescription$ Look at the top card of target player's library. If it's a nonland card, you may pay 2 life. If you do, put it into that player's graveyard. SVar:DBChangeZone:DB$ Mill | Defined$ Targeted | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card.nonLand | ConditionCompare$ GE1 | UnlessPayer$ You | UnlessCost$ PayLife<2> | UnlessSwitched$ True | StackDescription$ None | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wand_of_denial.jpg Oracle:{T}: Look at the top card of target player's library. If it's a nonland card, you may pay 2 life. If you do, put it into that player's graveyard. diff --git a/forge-gui/res/cardsfolder/w/wand_of_the_elements.txt b/forge-gui/res/cardsfolder/w/wand_of_the_elements.txt index 43a2bae0498..f57060fd2e9 100644 --- a/forge-gui/res/cardsfolder/w/wand_of_the_elements.txt +++ b/forge-gui/res/cardsfolder/w/wand_of_the_elements.txt @@ -3,6 +3,6 @@ ManaCost:4 Types:Artifact A:AB$ Token | Cost$ T Sac<1/Island> | TokenImage$ u 2 2 elemental flying | TokenAmount$ 1 | TokenName$ Elemental | TokenTypes$ Creature,Elemental | TokenOwner$ You | TokenColors$ Blue | TokenPower$ 2 | TokenToughness$ 2 | TokenKeywords$ Flying| SpellDescription$ Create a 2/2 blue Elemental creature token with flying. A:AB$ Token | Cost$ T Sac<1/Mountain> | TokenImage$ r 3 3 elemental | TokenAmount$ 1 | TokenName$ Elemental | TokenTypes$ Creature,Elemental | TokenOwner$ You | TokenColors$ Red | TokenPower$ 3 | TokenToughness$ 3 | SpellDescription$ Create a 3/3 red Elemental creature token. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/wand_of_the_elements.jpg Oracle:{T}, Sacrifice an Island: Create a 2/2 blue Elemental creature token with flying.\n{T}, Sacrifice a Mountain: Create a 3/3 red Elemental creature token. diff --git a/forge-gui/res/cardsfolder/w/wandering_eye.txt b/forge-gui/res/cardsfolder/w/wandering_eye.txt index 1cdb29408d9..97ee0a511ad 100644 --- a/forge-gui/res/cardsfolder/w/wandering_eye.txt +++ b/forge-gui/res/cardsfolder/w/wandering_eye.txt @@ -4,6 +4,6 @@ Types:Creature Illusion PT:1/3 K:Flying S:Mode$ Continuous | Affected$ Player | AddKeyword$ Play with your hand revealed. | Description$ Players play with their hands revealed. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wandering_eye.jpg Oracle:Flying\nPlayers play with their hands revealed. diff --git a/forge-gui/res/cardsfolder/w/wandering_goblins.txt b/forge-gui/res/cardsfolder/w/wandering_goblins.txt index 653d6146ebb..a0c88395630 100644 --- a/forge-gui/res/cardsfolder/w/wandering_goblins.txt +++ b/forge-gui/res/cardsfolder/w/wandering_goblins.txt @@ -5,6 +5,6 @@ PT:0/3 A:AB$ Pump | Cost$ 3 | NumAtt$ +X | References$ X | PrecostDesc$ Domain — | SpellDescription$ Wandering Goblins gets +1/+0 until end of turn for each basic land type among lands you control. SVar:X:Count$Domain SVar:BuffedBy:Plains,Island,Swamp,Mountain,Forest -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/wandering_goblins.jpg Oracle:Domain — {3}: Wandering Goblins gets +1/+0 until end of turn for each basic land type among lands you control. diff --git a/forge-gui/res/cardsfolder/w/wandering_stream.txt b/forge-gui/res/cardsfolder/w/wandering_stream.txt index 0be18494d29..ce9e9dd01c6 100644 --- a/forge-gui/res/cardsfolder/w/wandering_stream.txt +++ b/forge-gui/res/cardsfolder/w/wandering_stream.txt @@ -3,6 +3,6 @@ ManaCost:2 G Types:Sorcery A:SP$ GainLife | Cost$ 2 G | LifeAmount$ X | References$ X | SpellDescription$ Domain — You gain 2 life for each basic land type among lands you control. SVar:X:Count$Domain/Times.2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://resources.wizards.com/magic/cards/in/en-us/card23119.jpg Oracle:Domain — You gain 2 life for each basic land type among lands you control. diff --git a/forge-gui/res/cardsfolder/w/wanderwine_prophets.txt b/forge-gui/res/cardsfolder/w/wanderwine_prophets.txt index 300381798db..4e034359755 100644 --- a/forge-gui/res/cardsfolder/w/wanderwine_prophets.txt +++ b/forge-gui/res/cardsfolder/w/wanderwine_prophets.txt @@ -8,6 +8,6 @@ SVar:TrigSacrifice:DB$ Sacrifice | SacValid$ Merfolk | RememberSacrificedSVar$ N SVar:DBAddTurn:DB$ AddTurn | NumTurns$ 1 | ConditionCheckSVar$ NumSacrificed | ConditionSVarCompare$ EQ1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ StoreSVar | SVar$ NumSacrificed | Type$ Number | Expression$ 0 SVar:NumSacrificed:0 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/wanderwine_prophets.jpg Oracle:Champion a Merfolk (When this enters the battlefield, sacrifice it unless you exile another Merfolk you control. When this leaves the battlefield, that card returns to the battlefield.)\nWhenever Wanderwine Prophets deals combat damage to a player, you may sacrifice a Merfolk. If you do, take an extra turn after this one. diff --git a/forge-gui/res/cardsfolder/w/war_barge.txt b/forge-gui/res/cardsfolder/w/war_barge.txt index 8e34849069a..c1e7d5e961b 100644 --- a/forge-gui/res/cardsfolder/w/war_barge.txt +++ b/forge-gui/res/cardsfolder/w/war_barge.txt @@ -6,7 +6,7 @@ T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ SVar:TrigDestroy:DB$ DestroyAll | ValidCards$ Card.IsRemembered | NoRegen$ True T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ Player | Execute$ TrigClearRemembered | Static$ True | Secondary$ True | TriggerDescription$ Clear Remembered at the end of any turn. SVar:TrigClearRemembered:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/war_barge.jpg Oracle:{3}: Target creature gains islandwalk until end of turn. When War Barge leaves the battlefield this turn, destroy that creature. A creature destroyed this way can't be regenerated. diff --git a/forge-gui/res/cardsfolder/w/war_cadence.txt b/forge-gui/res/cardsfolder/w/war_cadence.txt index 631a0647da2..957676ed01a 100644 --- a/forge-gui/res/cardsfolder/w/war_cadence.txt +++ b/forge-gui/res/cardsfolder/w/war_cadence.txt @@ -8,6 +8,6 @@ SVar:CadenceStaticAb:Mode$ CantBlockUnless | ValidCard$ Card.IsNotRemembered | C SVar:X:Count$xPaid SVar:PaidNum:Number$0 SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/war_cadence.jpg Oracle:{X}{R}: This turn, creatures can't block unless their controller pays {X} for each blocking creature they control. diff --git a/forge-gui/res/cardsfolder/w/war_elephant.txt b/forge-gui/res/cardsfolder/w/war_elephant.txt index ac0ef8b639c..43fa00fb910 100644 --- a/forge-gui/res/cardsfolder/w/war_elephant.txt +++ b/forge-gui/res/cardsfolder/w/war_elephant.txt @@ -4,6 +4,6 @@ Types:Creature Elephant PT:2/2 K:Trample K:Banding -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/war_elephant.jpg Oracle:Trample, banding (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/w/war_falcon.txt b/forge-gui/res/cardsfolder/w/war_falcon.txt index 09c2c9c05e9..d4e36062463 100644 --- a/forge-gui/res/cardsfolder/w/war_falcon.txt +++ b/forge-gui/res/cardsfolder/w/war_falcon.txt @@ -5,7 +5,7 @@ PT:2/1 K:Flying S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ CARDNAME can't attack. | CheckSVar$ X | SVarCompare$ EQ0 | Description$ CARDNAME can't attack unless you control a Knight or Soldier. SVar:X:Count$Valid Knight.YouCtrl,Soldier.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Knight|Soldier SVar:BuffedBy:Knight,Soldier SVar:Picture:http://www.wizards.com/global/images/magic/general/war_falcon.jpg diff --git a/forge-gui/res/cardsfolder/w/war_tax.txt b/forge-gui/res/cardsfolder/w/war_tax.txt index b5190f868bd..81994e8bedc 100644 --- a/forge-gui/res/cardsfolder/w/war_tax.txt +++ b/forge-gui/res/cardsfolder/w/war_tax.txt @@ -7,6 +7,6 @@ SVar:AttackTax:Mode$ CantAttackUnless | ValidCard$ Creature | EffectZone$ Comman SVar:DBReset:DB$ StoreSVar | SVar$ Y | Type$ Number | Expression$ 0 SVar:X:Count$xPaid SVar:Y:Number$0 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/war_tax.jpg Oracle:{X}{U}: This turn, creatures can't attack unless their controller pays {X} for each attacking creature they control. diff --git a/forge-gui/res/cardsfolder/w/warbreak_trumpeter.txt b/forge-gui/res/cardsfolder/w/warbreak_trumpeter.txt index a59dbee0d46..3c71ecedb76 100644 --- a/forge-gui/res/cardsfolder/w/warbreak_trumpeter.txt +++ b/forge-gui/res/cardsfolder/w/warbreak_trumpeter.txt @@ -6,6 +6,6 @@ K:Morph:X X R T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME is turned face up, create X 1/1 red Goblin creature tokens. SVar:TrigToken:DB$Token | TokenAmount$ X | References$ X | TokenName$ Goblin | TokenTypes$ Creature,Goblin | TokenOwner$ You | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/warbreak_trumpeter.jpg Oracle:Morph {X}{X}{R} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.)\nWhen Warbreak Trumpeter is turned face up, create X 1/1 red Goblin creature tokens. diff --git a/forge-gui/res/cardsfolder/w/ward_of_lights.txt b/forge-gui/res/cardsfolder/w/ward_of_lights.txt index ad77a7a7eb1..b894a18e82d 100644 --- a/forge-gui/res/cardsfolder/w/ward_of_lights.txt +++ b/forge-gui/res/cardsfolder/w/ward_of_lights.txt @@ -7,7 +7,7 @@ K:ETBReplacement:Other:ChooseColor SVar:ChooseColor:DB$ ChooseColor | Defined$ You | SpellDescription$ As CARDNAME enters the battlefield, choose a color. | AILogic$ MostProminentInHumanDeck A:SP$ Attach | Cost$ W W | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Protection:Card.ChosenColor:Protection from ChosenColor:Card.CardUID_HostCardUID | Description$ Enchanted creature has protection from the chosen color. This effect doesn't remove CARDNAME. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:ChosenProtection:True SVar:Picture:http://www.wizards.com/global/images/magic/general/ward_of_lights.jpg Oracle:You may cast Ward of Lights as though it had flash. If you cast it any time a sorcery couldn't have been cast, the controller of the permanent it becomes sacrifices it at the beginning of the next cleanup step.\nEnchant creature\nAs Ward of Lights enters the battlefield, choose a color.\nEnchanted creature has protection from the chosen color. This effect doesn't remove Ward of Lights. diff --git a/forge-gui/res/cardsfolder/w/ward_of_piety.txt b/forge-gui/res/cardsfolder/w/ward_of_piety.txt index 66892afb8aa..a131406f76c 100644 --- a/forge-gui/res/cardsfolder/w/ward_of_piety.txt +++ b/forge-gui/res/cardsfolder/w/ward_of_piety.txt @@ -6,6 +6,6 @@ A:SP$ Attach | Cost$ 1 W | ValidTgts$ Creature | AILogic$ Pump A:AB$ Effect | Cost$ 1 W | Name$ Redirection Ward | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target to redirect the damage to | ReplacementEffects$ WardDamage | SVars$ WardDamage,WardDmg | References$ WardDamage,WardDmg | RememberObjects$ Targeted | ImprintCards$ Enchanted | ExileOnMoved$ Battlefield | SpellDescription$ The next 1 damage that would be dealt to enchanted creature this turn is dealt to any target instead. SVar:WardDamage:Event$ DamageDone | ValidTarget$ Creature.IsImprinted | ReplaceWith$ WardDmg | DamageTarget$ Remembered | Description$ The next 1 damage that would be dealt to enchanted creature this turn is dealt to any target instead. SVar:WardDmg:DB$ ReplaceSplitDamage | DamageTarget$ Remembered -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ward_of_piety.jpg Oracle:Enchant creature\n{1}{W}: The next 1 damage that would be dealt to enchanted creature this turn is dealt to any target instead. diff --git a/forge-gui/res/cardsfolder/w/warmonger.txt b/forge-gui/res/cardsfolder/w/warmonger.txt index cfd5282b61b..f98167c64e8 100644 --- a/forge-gui/res/cardsfolder/w/warmonger.txt +++ b/forge-gui/res/cardsfolder/w/warmonger.txt @@ -3,6 +3,6 @@ ManaCost:3 R Types:Creature Minotaur Monger PT:3/3 A:AB$ DamageAll | Cost$ 2 | NumDmg$ 1 | ValidCards$ Creature.withoutFlying | ValidPlayers$ Player | AnyPlayer$ True | ValidDescription$ each creature without flying and and each player. | SpellDescription$ CARDNAME deals 1 damage to each creature without flying and each player. Any player may activate this ability. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/warmonger.jpg Oracle:{2}: Warmonger deals 1 damage to each creature without flying and each player. Any player may activate this ability. diff --git a/forge-gui/res/cardsfolder/w/warmth.txt b/forge-gui/res/cardsfolder/w/warmth.txt index da3a7ba84d9..52e15193046 100644 --- a/forge-gui/res/cardsfolder/w/warmth.txt +++ b/forge-gui/res/cardsfolder/w/warmth.txt @@ -3,6 +3,6 @@ ManaCost:1 W Types:Enchantment T:Mode$ SpellCast | ValidCard$ Card.Red | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever an opponent casts a red spell, you gain 2 life. SVar:TrigGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/warmth.jpg Oracle:Whenever an opponent casts a red spell, you gain 2 life. diff --git a/forge-gui/res/cardsfolder/w/warped_devotion.txt b/forge-gui/res/cardsfolder/w/warped_devotion.txt index c62f2d20bcd..1ff91809969 100644 --- a/forge-gui/res/cardsfolder/w/warped_devotion.txt +++ b/forge-gui/res/cardsfolder/w/warped_devotion.txt @@ -3,6 +3,6 @@ ManaCost:2 B Types:Enchantment T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Hand | ValidCard$ Permanent | TriggerZones$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ Whenever a permanent is returned to a player's hand, that player discards a card. SVar:TrigDiscard:DB$Discard | NumCards$ 1 | Mode$ TgtChoose | Defined$ TriggeredCardOwner -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/warped_devotion.jpg Oracle:Whenever a permanent is returned to a player's hand, that player discards a card. diff --git a/forge-gui/res/cardsfolder/w/warren_weirding.txt b/forge-gui/res/cardsfolder/w/warren_weirding.txt index 589a13ede61..2e63235b93e 100644 --- a/forge-gui/res/cardsfolder/w/warren_weirding.txt +++ b/forge-gui/res/cardsfolder/w/warren_weirding.txt @@ -5,6 +5,6 @@ A:SP$ Sacrifice | Cost$ 1 B | ValidTgts$ Player | SacValid$ Creature | SacMessag SVar:DBToken:DB$ Token | ConditionDefined$ Remembered | ConditionPresent$ Card.Goblin | ConditionCompare$ GE1 | TokenAmount$ 2 | TokenName$ Goblin Rogue | TokenTypes$ Creature,Goblin,Rogue | TokenOwner$ Targeted | TokenColors$ Black | TokenPower$ 1 | TokenToughness$ 1 | RememberTokens$ True | ForgetOtherRemembered$ True | SubAbility$ AdditionalPump SVar:AdditionalPump:DB$ PumpAll | ValidCards$ Creature.IsRemembered | KW$ Haste | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/warren_weirding.jpg Oracle:Target player sacrifices a creature. If a Goblin is sacrificed this way, that player creates two 1/1 black Goblin Rogue creature tokens, and those tokens gain haste until end of turn. diff --git a/forge-gui/res/cardsfolder/w/warrior_en_kor.txt b/forge-gui/res/cardsfolder/w/warrior_en_kor.txt index 8b46e4bb3a8..3e94298870a 100644 --- a/forge-gui/res/cardsfolder/w/warrior_en_kor.txt +++ b/forge-gui/res/cardsfolder/w/warrior_en_kor.txt @@ -5,6 +5,6 @@ PT:2/2 A:AB$ Effect | Cost$ 0 | Name$ en-Kor Redirection | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control to redirect the damage to | ReplacementEffects$ EnKor | SVars$ EnKorDmg | References$ EnKor,EnKorDmg | Duration$ HostLeavesOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SpellDescription$ The next 1 damage that would be dealt to CARDNAME this turn is dealt to target creature you control instead. SVar:EnKor:Event$ DamageDone | ValidTarget$ Creature.EffectSource | ReplaceWith$ EnKorDmg | DamageTarget$ Remembered | Description$ The next 1 damage that would be dealt to EFFECTSOURCE this turn is dealt to target creature you control instead. SVar:EnKorDmg:DB$ ReplaceSplitDamage | DamageTarget$ Remembered -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/warrior_en_kor.jpg Oracle:{0}: The next 1 damage that would be dealt to Warrior en-Kor this turn is dealt to target creature you control instead. diff --git a/forge-gui/res/cardsfolder/w/warriors_lesson.txt b/forge-gui/res/cardsfolder/w/warriors_lesson.txt index ad7b50b7a56..764077e1e50 100644 --- a/forge-gui/res/cardsfolder/w/warriors_lesson.txt +++ b/forge-gui/res/cardsfolder/w/warriors_lesson.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Animate | Cost$ G | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select up to two target creatures you control | TargetMin$ 0 | TargetMax$ 2 | Triggers$ WarriorLessonDmg | sVars$ WarriorLessonDraw | SpellDescription$ Until end of turn, up to two target creatures you control each gain "Whenever this creature deals combat damage to a player, draw a card." SVar:WarriorLessonDmg:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ WarriorLessonDraw | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, draw a card. SVar:WarriorLessonDraw:DB$ Draw | Defined$ You | NumCards$ 1 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/warriors_lesson.jpg Oracle:Until end of turn, up to two target creatures you control each gain "Whenever this creature deals combat damage to a player, draw a card." diff --git a/forge-gui/res/cardsfolder/w/warriors_oath.txt b/forge-gui/res/cardsfolder/w/warriors_oath.txt index f2c8ab72dfc..4e6c2e77e62 100644 --- a/forge-gui/res/cardsfolder/w/warriors_oath.txt +++ b/forge-gui/res/cardsfolder/w/warriors_oath.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ AddTurn | Cost$ R R | NumTurns$ 1 | ExtraTurnDelayedTrigger$ DBDelTrig | ExtraTurnDelayedTriggerExcute$ TrigLose | References$ DBDelTrig,TrigLose | SpellDescription$ Take an extra turn after this one. At the beginning of that turn's end step, you lose the game. SVar:DBDelTrig:ThisTurn$ True | Mode$ Phase | Phase$ End of Turn | Execute$ TrigLose | TriggerDescription$ At the beginning of that turn's end step, you lose the game. SVar:TrigLose:DB$ LosesGame | Defined$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/warriors_oath.jpg Oracle:Take an extra turn after this one. At the beginning of that turn's end step, you lose the game. diff --git a/forge-gui/res/cardsfolder/w/warriors_stand.txt b/forge-gui/res/cardsfolder/w/warriors_stand.txt index 46e3600224e..b22d04e79fa 100644 --- a/forge-gui/res/cardsfolder/w/warriors_stand.txt +++ b/forge-gui/res/cardsfolder/w/warriors_stand.txt @@ -2,6 +2,6 @@ Name:Warrior's Stand ManaCost:1 W Types:Instant A:SP$ PumpAll | Cost$ 1 W | ValidCards$ Creature.YouCtrl | NumAtt$ +2 | NumDef$ +2 | OpponentTurn$ True | ActivationPhases$ Declare Attackers | SpellDescription$ Cast CARDNAME only during the declare attackers step and only if you've been attacked this step. Creatures you control get +2/+2 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/warriors_stand.jpg Oracle:Cast Warrior's Stand only during the declare attackers step and only if you've been attacked this step.\nCreatures you control get +2/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/w/waste_not.txt b/forge-gui/res/cardsfolder/w/waste_not.txt index 53bd13e5616..933c74ef03c 100644 --- a/forge-gui/res/cardsfolder/w/waste_not.txt +++ b/forge-gui/res/cardsfolder/w/waste_not.txt @@ -7,6 +7,6 @@ T:Mode$ Discarded | ValidCard$ Land.OppOwn | TriggerZones$ Battlefield | Execute SVar:TrigMana:DB$ Mana | Produced$ B | Amount$ 2 | Defined$ You T:Mode$ Discarded | ValidCard$ Card.nonLand+nonCreature+OppOwn | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever an opponent discards a noncreature, nonland card, draw a card. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/waste_not.jpg Oracle:Whenever an opponent discards a creature card, create a 2/2 black Zombie creature token.\nWhenever an opponent discards a land card, add {B}{B}.\nWhenever an opponent discards a noncreature, nonland card, draw a card. diff --git a/forge-gui/res/cardsfolder/w/waterfront_bouncer.txt b/forge-gui/res/cardsfolder/w/waterfront_bouncer.txt index 012ba32e170..c15772d56eb 100644 --- a/forge-gui/res/cardsfolder/w/waterfront_bouncer.txt +++ b/forge-gui/res/cardsfolder/w/waterfront_bouncer.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Creature Merfolk Spellshaper PT:1/1 A:AB$ ChangeZone | Cost$ U T Discard<1/Card> | ValidTgts$ Creature | TgtPrompt$ Select target Creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/waterfront_bouncer.jpg Oracle:{U}, {T}, Discard a card: Return target creature to its owner's hand. diff --git a/forge-gui/res/cardsfolder/w/waterspout_elemental.txt b/forge-gui/res/cardsfolder/w/waterspout_elemental.txt index 015c8ba56b9..69756c7ee7d 100644 --- a/forge-gui/res/cardsfolder/w/waterspout_elemental.txt +++ b/forge-gui/res/cardsfolder/w/waterspout_elemental.txt @@ -7,6 +7,6 @@ K:Kicker: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 all other creatures to their owners' hands and you skip your next turn. SVar:TrigKicker:DB$ChangeZoneAll | ChangeType$ Creature.Other | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBSkipTurn SVar:DBSkipTurn:DB$ SkipTurn | NumTurns$ 1 | Defined$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/waterspout_elemental.jpg Oracle:Kicker {U} (You may pay an additional {U} as you cast this spell.)\nFlying\nWhen Waterspout Elemental enters the battlefield, if it was kicked, return all other creatures to their owners' hands and you skip your next turn. diff --git a/forge-gui/res/cardsfolder/w/waterspout_weavers.txt b/forge-gui/res/cardsfolder/w/waterspout_weavers.txt index 4769e416f0d..91573f4511d 100644 --- a/forge-gui/res/cardsfolder/w/waterspout_weavers.txt +++ b/forge-gui/res/cardsfolder/w/waterspout_weavers.txt @@ -6,6 +6,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigKinship | Trigge SVar:TrigKinship:DB$ PeekAndReveal | PeekAmount$ 1 | RevealValid$ Card.sharesCreatureTypeWith | RevealOptional$ True | RememberRevealed$ True | SubAbility$ DBPump SVar:DBPump:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Flying | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/waterspout_weavers.jpg Oracle:Kinship — At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with Waterspout Weavers, you may reveal it. If you do, each creature you control gains flying until end of turn. diff --git a/forge-gui/res/cardsfolder/w/wave_elemental.txt b/forge-gui/res/cardsfolder/w/wave_elemental.txt index 5adc4683119..805681eb90a 100644 --- a/forge-gui/res/cardsfolder/w/wave_elemental.txt +++ b/forge-gui/res/cardsfolder/w/wave_elemental.txt @@ -3,6 +3,6 @@ ManaCost:2 U U Types:Creature Elemental PT:2/3 A:AB$ Tap | Cost$ U T Sac<1/CARDNAME> | TargetMin$ 0 | TargetMax$ 3 | TgtPrompt$ Choose target creatures without flying | ValidTgts$ Creature.withoutFlying | SpellDescription$ Tap up to three target creatures without flying. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wave_elemental.jpg Oracle:{U}, {T}, Sacrifice Wave Elemental: Tap up to three target creatures without flying. diff --git a/forge-gui/res/cardsfolder/w/wave_of_indifference.txt b/forge-gui/res/cardsfolder/w/wave_of_indifference.txt index d9f9611e0bb..1bc76caf43a 100644 --- a/forge-gui/res/cardsfolder/w/wave_of_indifference.txt +++ b/forge-gui/res/cardsfolder/w/wave_of_indifference.txt @@ -5,6 +5,6 @@ A:SP$ Pump | Cost$ X R | KW$ HIDDEN CARDNAME can't block. | TargetMin$ 0 | Targe # It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) SVar:X:Targeted$Amount SVar:MaxTgts:Count$Valid Creature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wave_of_indifference.jpg Oracle:X target creatures can't block this turn. diff --git a/forge-gui/res/cardsfolder/w/wave_of_reckoning.txt b/forge-gui/res/cardsfolder/w/wave_of_reckoning.txt index 037dd771213..64f320837bd 100644 --- a/forge-gui/res/cardsfolder/w/wave_of_reckoning.txt +++ b/forge-gui/res/cardsfolder/w/wave_of_reckoning.txt @@ -5,7 +5,7 @@ Types:Sorcery A:SP$ EachDamage | Cost$ 4 W | ValidCards$ Creature | NumDmg$ X | References$ X | DamageDesc$ damage equal to its power | DefinedCards$ Self | SpellDescription$ Each creature deals damage to itself equal to its power. #NumDmg isn't really used here. It is left for clarity. The AF pulls Damage straight from "X" hardcoded. SVar:X:Count$CardPower -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/wave_of_reckoning.jpg Oracle:Each creature deals damage to itself equal to its power. diff --git a/forge-gui/res/cardsfolder/w/wave_of_terror.txt b/forge-gui/res/cardsfolder/w/wave_of_terror.txt index e44b28b3eeb..837ad34aa5f 100644 --- a/forge-gui/res/cardsfolder/w/wave_of_terror.txt +++ b/forge-gui/res/cardsfolder/w/wave_of_terror.txt @@ -5,6 +5,6 @@ K:Cumulative upkeep:1 T:Mode$ Phase | Phase$ Draw | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDestroyAll | TriggerDescription$ At the beginning of your draw step, destroy each creature with converted mana cost equal to the number of age counters on CARDNAME. They can't be regenerated. SVar:TrigDestroyAll:DB$DestroyAll | ValidCards$ Creature.cmcEQX | NoRegen$ True | References$ X SVar:X:Count$CardCounters.AGE -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wave_of_terror.jpg Oracle:Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nAt the beginning of your draw step, destroy each creature with converted mana cost equal to the number of age counters on Wave of Terror. They can't be regenerated. diff --git a/forge-gui/res/cardsfolder/w/wave_of_vitriol.txt b/forge-gui/res/cardsfolder/w/wave_of_vitriol.txt index 83d7cd4c86b..615a5e9956c 100644 --- a/forge-gui/res/cardsfolder/w/wave_of_vitriol.txt +++ b/forge-gui/res/cardsfolder/w/wave_of_vitriol.txt @@ -8,6 +8,6 @@ SVar:DBShuffle:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ Shuffl SVar:ShuffleSearched:DB$ Shuffle | Defined$ Player.IsRemembered | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | References$ X SVar:X:Count$Valid Card.IsRemembered+RememberedPlayerCtrl SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/wave_of_vitriol.jpg Oracle:Each player sacrifices all artifacts, enchantments, and nonbasic lands they control. For each land sacrificed this way, its controller may search their library for a basic land card and put it onto the battlefield tapped. Then each player who searched their library this way shuffles it. diff --git a/forge-gui/res/cardsfolder/w/waxing_moon.txt b/forge-gui/res/cardsfolder/w/waxing_moon.txt index 1c36273dc78..17191d22ac8 100644 --- a/forge-gui/res/cardsfolder/w/waxing_moon.txt +++ b/forge-gui/res/cardsfolder/w/waxing_moon.txt @@ -3,7 +3,7 @@ ManaCost:1 G Types:Instant A:SP$ SetState | Cost$ 1 G | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Card.Werewolf+YouCtrl | TgtPrompt$ Select target Werewolf you control | Mode$ Transform | SubAbility$ DBPumpAll | SpellDescription$ Transform up to one target Werewolf you control. Creatures you control gain trample until end of turn. SVar:DBPumpAll:DB$ PumpAll | KW$ Trample | ValidCards$ Creature.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Type$Werewolf SVar:Picture:http://www.wizards.com/global/images/magic/general/waxing_moon.jpg Oracle:Transform up to one target Werewolf you control. Creatures you control gain trample until end of turn. diff --git a/forge-gui/res/cardsfolder/w/waxmane_baku.txt b/forge-gui/res/cardsfolder/w/waxmane_baku.txt index 4358ac8528a..0b5ccd9151b 100644 --- a/forge-gui/res/cardsfolder/w/waxmane_baku.txt +++ b/forge-gui/res/cardsfolder/w/waxmane_baku.txt @@ -7,7 +7,7 @@ SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ KI | CounterNum A:AB$ Tap | Cost$ 1 SubCounter | TargetMin$ 0 | TargetMax$ MaxTgts | ValidTgts$ Creature | IsCurse$ True | AILogic$ TapForXCounters | TgtPrompt$ Select target creature | References$ X,MaxTgts | SpellDescription$ Tap X target creatures. SVar:X:Targeted$Amount SVar:MaxTgts:Count$CardCounters.KI -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/waxmane_baku.jpg Oracle:Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Waxmane Baku.\n{1}, Remove X ki counters from Waxmane Baku: Tap X target creatures. diff --git a/forge-gui/res/cardsfolder/w/wayfaring_giant.txt b/forge-gui/res/cardsfolder/w/wayfaring_giant.txt index 4d621948868..dcab496454d 100644 --- a/forge-gui/res/cardsfolder/w/wayfaring_giant.txt +++ b/forge-gui/res/cardsfolder/w/wayfaring_giant.txt @@ -5,6 +5,6 @@ PT:1/3 S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | AddToughness$ X | Description$ Domain — CARDNAME gets +1/+1 for each basic land type among lands you control. SVar:X:Count$Domain SVar:BuffedBy:Plains,Island,Swamp,Mountain,Forest -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/wayfaring_giant.jpg Oracle:Domain — Wayfaring Giant gets +1/+1 for each basic land type among lands you control. diff --git a/forge-gui/res/cardsfolder/w/waylay.txt b/forge-gui/res/cardsfolder/w/waylay.txt index 4cfdc05cd4d..a59dc77965b 100644 --- a/forge-gui/res/cardsfolder/w/waylay.txt +++ b/forge-gui/res/cardsfolder/w/waylay.txt @@ -3,6 +3,6 @@ ManaCost:2 W Types:Instant A:SP$ Token | Cost$ 2 W | TokenAmount$ 3 | TokenName$ Knight | TokenTypes$ Creature,Knight | TokenOwner$ You | TokenColors$ White | TokenPower$ 2 | TokenToughness$ 2 | TokenSVars$ WaylayEOT | AtEOT$ Exile | SpellDescription$ Create three 2/2 white Knight creature tokens. Exile them at the beginning of the next cleanup step. SVar:WaylayEOT:SVar:EndOfTurnLeavePlay:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/waylay.jpg Oracle:Create three 2/2 white Knight creature tokens. Exile them at the beginning of the next cleanup step. diff --git a/forge-gui/res/cardsfolder/w/weakstone.txt b/forge-gui/res/cardsfolder/w/weakstone.txt index c9213276956..8893bca9069 100644 --- a/forge-gui/res/cardsfolder/w/weakstone.txt +++ b/forge-gui/res/cardsfolder/w/weakstone.txt @@ -2,6 +2,6 @@ Name:Weakstone ManaCost:4 Types:Artifact S:Mode$ Continuous | Affected$ Creature.attacking | AddPower$ -1 | Description$ Attacking creatures get -1/-0. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/weakstone.jpg Oracle:Attacking creatures get -1/-0. diff --git a/forge-gui/res/cardsfolder/w/weaver_of_lies.txt b/forge-gui/res/cardsfolder/w/weaver_of_lies.txt index d94a539ab6a..776d831df2b 100644 --- a/forge-gui/res/cardsfolder/w/weaver_of_lies.txt +++ b/forge-gui/res/cardsfolder/w/weaver_of_lies.txt @@ -6,6 +6,6 @@ K:Morph:4 U T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ DBWeaverofLiesSetState | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME is turned face up, turn any number of target creatures with morph abilities other than CARDNAME face down. SVar:DBWeaverofLiesSetState:DB$ SetState | ValidTgts$ Creature.withMorph+Other,Creature.withMegamorph+Other | TgtPrompt$ Select target creature | TargetMin$ 0 | TargetMax$ WeaverofLiesX | Mode$ TurnFace | References$ WeaverofLiesX | SpellDescription$ Turn CARDNAME face down. SVar:WeaverofLiesX:Count$Valid Creature.withMorph+Other,Creature.withMegamorph+Other -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/weaver_of_lies.jpg Oracle:Morph {4}{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.)\nWhen Weaver of Lies is turned face up, turn any number of target creatures with morph abilities other than Weaver of Lies face down. diff --git a/forge-gui/res/cardsfolder/w/weight_of_spires.txt b/forge-gui/res/cardsfolder/w/weight_of_spires.txt index 5b3a8440765..89755019570 100644 --- a/forge-gui/res/cardsfolder/w/weight_of_spires.txt +++ b/forge-gui/res/cardsfolder/w/weight_of_spires.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Instant A:SP$ DealDamage | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals damage to target creature equal to the number of nonbasic lands that creature's controller controls. SVar:X:Count$Valid Land.nonBasic+TargetedControllerCtrl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/weight_of_spires.jpg Oracle:Weight of Spires deals damage to target creature equal to the number of nonbasic lands that creature's controller controls. diff --git a/forge-gui/res/cardsfolder/w/weird_harvest.txt b/forge-gui/res/cardsfolder/w/weird_harvest.txt index 118f9cfa814..90bd6a74fc1 100644 --- a/forge-gui/res/cardsfolder/w/weird_harvest.txt +++ b/forge-gui/res/cardsfolder/w/weird_harvest.txt @@ -3,6 +3,6 @@ ManaCost:X G G Types:Sorcery A:SP$ ChangeZone | Optional$ True | Cost$ X G G | Origin$ Library | Destination$ Hand | DefinedPlayer$ Player | ChangeType$ Card.Creature | Reveal$ True | Shuffle$ True | ChangeNum$ X | References$ X | SpellDescription$ Each player may search their library for up to X creature cards, reveal those cards, and put them into their hand. Then each player who searched their library this way shuffles it. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/weird_harvest.jpg Oracle:Each player may search their library for up to X creature cards, reveal those cards, and put them into their hand. Then each player who searched their library this way shuffles it. diff --git a/forge-gui/res/cardsfolder/w/welcome_to_the_fold.txt b/forge-gui/res/cardsfolder/w/welcome_to_the_fold.txt index edf8c9e4a8e..3c2ef660c58 100644 --- a/forge-gui/res/cardsfolder/w/welcome_to_the_fold.txt +++ b/forge-gui/res/cardsfolder/w/welcome_to_the_fold.txt @@ -6,7 +6,7 @@ A:SP$ GainControl | Cost$ 2 U U | ValidTgts$ Creature | TgtPrompt$ Select target SVar:Y:Count$Madness.X.2 SVar:X:Count$xPaid SVar:Z:Targeted$Valid Creature.toughnessLEY -SVar:RemAIDeck:True +AI:RemoveDeck:All DeckHints:Ability$Discard SVar:Picture:http://www.wizards.com/global/images/magic/general/welcome_to_the_fold.jpg Oracle:Madness {X}{U}{U} (If you discard this card, discard it into exile. When you do, cast it for its madness cost or put it into your graveyard.)\nGain control of target creature if its toughness is 2 or less. If Welcome to the Fold's madness cost was paid, instead gain control of that creature if its toughness is X or less. diff --git a/forge-gui/res/cardsfolder/w/weldfast_monitor.txt b/forge-gui/res/cardsfolder/w/weldfast_monitor.txt index 1d3d628b59c..54d1378ecb6 100644 --- a/forge-gui/res/cardsfolder/w/weldfast_monitor.txt +++ b/forge-gui/res/cardsfolder/w/weldfast_monitor.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact Creature Lizard PT:3/2 A:AB$ Pump | Cost$ R | KW$ Menace | Defined$ Self | SpellDescription$ CARDNAME gains gains menace until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/weldfast_monitor.jpg Oracle:{R}: Weldfast Monitor gains menace until end of turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/w/well_laid_plans.txt b/forge-gui/res/cardsfolder/w/well_laid_plans.txt index d0a3ad7ba52..061a29980c4 100644 --- a/forge-gui/res/cardsfolder/w/well_laid_plans.txt +++ b/forge-gui/res/cardsfolder/w/well_laid_plans.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Enchantment R:Event$ DamageDone | ActiveZones$ Battlefield | Prevent$ True | ValidTarget$ Creature | ValidSource$ Creature | RelativeToSource$ Creature.SharesColorWith | Description$ Prevent all damage that would be dealt to a creature by another creature if they share a color. SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/well_laid_plans.jpg Oracle:Prevent all damage that would be dealt to a creature by another creature if they share a color. diff --git a/forge-gui/res/cardsfolder/w/well_of_lost_dreams.txt b/forge-gui/res/cardsfolder/w/well_of_lost_dreams.txt index 901ddb871f6..b4548aba065 100644 --- a/forge-gui/res/cardsfolder/w/well_of_lost_dreams.txt +++ b/forge-gui/res/cardsfolder/w/well_of_lost_dreams.txt @@ -7,6 +7,6 @@ SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ X | References$ X | UnlessCost$ SVar:Y:TriggerCount$LifeAmount SVar:X:Count$ChosenNumber DeckNeeds:Ability$LifeGain -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/well_of_lost_dreams.jpg Oracle:Whenever you gain life, you may pay {X}, where X is less than or equal to the amount of life you gained. If you do, draw X cards. diff --git a/forge-gui/res/cardsfolder/w/western_paladin.txt b/forge-gui/res/cardsfolder/w/western_paladin.txt index a2c4d299263..166b9648d24 100644 --- a/forge-gui/res/cardsfolder/w/western_paladin.txt +++ b/forge-gui/res/cardsfolder/w/western_paladin.txt @@ -3,6 +3,6 @@ ManaCost:2 B B Types:Creature Zombie Knight PT:3/3 A:AB$ Destroy | Cost$ B B T | ValidTgts$ Creature.White | TgtPrompt$ Select target white creature | SpellDescription$ Destroy target white creature. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/western_paladin.jpg Oracle:{B}{B}, {T}: Destroy target white creature. diff --git a/forge-gui/res/cardsfolder/w/wheel_of_sun_and_moon.txt b/forge-gui/res/cardsfolder/w/wheel_of_sun_and_moon.txt index 807a7d260e4..8f37f26df66 100644 --- a/forge-gui/res/cardsfolder/w/wheel_of_sun_and_moon.txt +++ b/forge-gui/res/cardsfolder/w/wheel_of_sun_and_moon.txt @@ -5,6 +5,6 @@ K:Enchant player A:SP$ Attach | Cost$ GW GW | ValidTgts$ Player R:Event$ Moved | ActiveZones$ Battlefield | Destination$ Graveyard | ValidCard$ Card.nonToken+OwnedBy Player.EnchantedBy | ReplaceWith$ Reveal | Description$ If a card would be put into enchanted player's graveyard from anywhere, instead that card is revealed and put on the bottom of that player's library. SVar:Reveal:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Library | Defined$ ReplacedCard | LibraryPosition$ -1 | Reveal$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/wheel_of_sun_and_moon.jpg Oracle:Enchant player\nIf a card would be put into enchanted player's graveyard from anywhere, instead that card is revealed and put on the bottom of that player's library. diff --git a/forge-gui/res/cardsfolder/w/whelming_wave.txt b/forge-gui/res/cardsfolder/w/whelming_wave.txt index bb0fa4fdb02..6a18b272a98 100644 --- a/forge-gui/res/cardsfolder/w/whelming_wave.txt +++ b/forge-gui/res/cardsfolder/w/whelming_wave.txt @@ -2,6 +2,6 @@ Name:Whelming Wave ManaCost:2 U U Types:Sorcery A:SP$ ChangeZoneAll | Cost$ 2 U U | ChangeType$ Creature.nonKraken+nonLeviathan+nonOctopus+nonSerpent | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return all creatures to their owners' hands except for Krakens, Leviathans, Octopuses and Serpents. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/whelming_wave.jpg Oracle:Return all creatures to their owners' hands except for Krakens, Leviathans, Octopuses, and Serpents. diff --git a/forge-gui/res/cardsfolder/w/whetstone.txt b/forge-gui/res/cardsfolder/w/whetstone.txt index 5e8aea10dca..27575db0af3 100644 --- a/forge-gui/res/cardsfolder/w/whetstone.txt +++ b/forge-gui/res/cardsfolder/w/whetstone.txt @@ -2,6 +2,6 @@ Name:Whetstone ManaCost:3 Types:Artifact A:AB$ Mill | Cost$ 3 | NumCards$ 2 | Defined$ Player | SpellDescription$ Each player puts the top two cards of their library into their graveyard. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/whetstone.jpg Oracle:{3}: Each player puts the top two cards of their library into their graveyard. diff --git a/forge-gui/res/cardsfolder/w/whetwheel.txt b/forge-gui/res/cardsfolder/w/whetwheel.txt index 5870b152de9..5e8be3765a5 100644 --- a/forge-gui/res/cardsfolder/w/whetwheel.txt +++ b/forge-gui/res/cardsfolder/w/whetwheel.txt @@ -4,6 +4,6 @@ Types:Artifact K:Morph:3 A:AB$ Mill | Cost$ X X T | NumCards$ X | ValidTgts$ Player | TgtPrompt$ Select target player | References$ X | SpellDescription$ Target player puts the top X cards of their library into their graveyard. SVar:X:Count$xPaid -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/whetwheel.jpg Oracle:{X}{X}, {T}: Target player puts the top X cards of their library into their graveyard.\nMorph {3} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) diff --git a/forge-gui/res/cardsfolder/w/whim_of_volrath.txt b/forge-gui/res/cardsfolder/w/whim_of_volrath.txt index a652187fa0e..53a0ba72ab9 100644 --- a/forge-gui/res/cardsfolder/w/whim_of_volrath.txt +++ b/forge-gui/res/cardsfolder/w/whim_of_volrath.txt @@ -5,7 +5,7 @@ K:Buyback:2 A:SP$ GenericChoice | Cost$ U | ValidTgts$ Permanent | TgtPrompt$ Choose target permanent | Choices$ ChangeColor,ChangeType | Defined$ You | StackDescription$ Change the text of target permanent by replacing all instances of one color word with another or one basic land type with another until end of turn. | SpellDescription$ Change the text of target permanent by replacing all instances of one color word with another or one basic land type with another until end of turn. (For example, you may change "nonred creature" to "nongreen creature" or "plainswalk" to "swampwalk.") SVar:ChangeColor:DB$ ChangeText | Defined$ ParentTarget | ChangeColorWord$ Choose Choose | SpellDescription$ Change color SVar:ChangeType:DB$ ChangeText | Defined$ ParentTarget | ChangeTypeWord$ ChooseBasicLandType ChooseBasicLandType | SpellDescription$ Change type -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/whim_of_volrath.jpg Oracle:Buyback {2} (You may pay an additional {2} as you cast this spell. If you do, put this card into your hand as it resolves.)\nChange the text of target permanent by replacing all instances of one color word with another or one basic land type with another until end of turn. (For example, you may change "nonred creature" to "nongreen creature" or "plainswalk" to "swampwalk.") diff --git a/forge-gui/res/cardsfolder/w/whims_of_the_fates.txt b/forge-gui/res/cardsfolder/w/whims_of_the_fates.txt index f6dc18fc4fe..e522d027408 100644 --- a/forge-gui/res/cardsfolder/w/whims_of_the_fates.txt +++ b/forge-gui/res/cardsfolder/w/whims_of_the_fates.txt @@ -3,7 +3,7 @@ ManaCost:5 R Types:Sorcery A:SP$ MultiplePiles | Cost$ 5 R | Defined$ Player | Zone$ Battlefield | ValidCards$ Permanent | RandomChosen$ True | Piles$ 3 | ChosenPile$ DBSacrifice | SpellDescription$ Starting with you, each player separates all permanents they control into three piles. Then each player chooses one of their piles at random and sacrifices those permanents. (Piles can be empty.) SVar:DBSacrifice:DB$ SacrificeAll | ValidCards$ Card.IsRemembered -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/whims_of_the_fates.jpg Oracle:Starting with you, each player separates all permanents they control into three piles. Then each player chooses one of their piles at random and sacrifices those permanents. (Piles can be empty.) diff --git a/forge-gui/res/cardsfolder/w/whip_vine.txt b/forge-gui/res/cardsfolder/w/whip_vine.txt index 61d86ae7dba..a2d3138ad34 100644 --- a/forge-gui/res/cardsfolder/w/whip_vine.txt +++ b/forge-gui/res/cardsfolder/w/whip_vine.txt @@ -9,6 +9,6 @@ A:AB$ Tap | Cost$ T | ValidTgts$ Creature.withFlying+blockedBySource | TgtPrompt S:Mode$ Continuous | Affected$ Creature.IsRemembered | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. T:Mode$ Untaps | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ ClearRemembered | Static$ True SVar:ClearRemembered:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/whip_vine.jpg Oracle:Defender, reach (This creature can block creatures with flying.)\nYou may choose not to untap Whip Vine during your untap step.\n{T}: Tap target creature with flying blocked by Whip Vine. That creature doesn't untap during its controller's untap step for as long as Whip Vine remains tapped. diff --git a/forge-gui/res/cardsfolder/w/whipgrass_entangler.txt b/forge-gui/res/cardsfolder/w/whipgrass_entangler.txt index 05d3a8752b9..418253eafa3 100644 --- a/forge-gui/res/cardsfolder/w/whipgrass_entangler.txt +++ b/forge-gui/res/cardsfolder/w/whipgrass_entangler.txt @@ -6,6 +6,6 @@ A:AB$ Animate | Cost$ 1 W | ValidTgts$ Creature | staticAbilities$ WhipgrassCant SVar:WhipgrassCantAttack:Mode$ CantAttackUnless | ValidCard$ Card.Self | Cost$ WhipgrassClericNum | References$ WhipgrassClericNum | Description$ CARDNAME can't attack or block unless you pay 1 for each Cleric on the battlefield. SVar:WhipgrassCantBlock:Mode$ CantBlockUnless | ValidCard$ Card.Self | Cost$ WhipgrassClericNum | References$ WhipgrassClericNum SVar:WhipgrassClericNum:Count$Valid Cleric -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/whipgrass_entangler.jpg Oracle:{1}{W}: Until end of turn, target creature gains "This creature can't attack or block unless its controller pays {1} for each Cleric on the battlefield." diff --git a/forge-gui/res/cardsfolder/w/whipkeeper.txt b/forge-gui/res/cardsfolder/w/whipkeeper.txt index aa30b46dac9..2438d074126 100644 --- a/forge-gui/res/cardsfolder/w/whipkeeper.txt +++ b/forge-gui/res/cardsfolder/w/whipkeeper.txt @@ -4,6 +4,6 @@ Types:Creature Dwarf PT:1/1 A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals damage to target creature equal to the damage already dealt to it this turn. SVar:X:Targeted$TotalDamageReceivedThisTurn -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/whipkeeper.jpg Oracle:{T}: Whipkeeper deals damage to target creature equal to the damage already dealt to it this turn. diff --git a/forge-gui/res/cardsfolder/w/whiptail_moloch.txt b/forge-gui/res/cardsfolder/w/whiptail_moloch.txt index a9dca760771..d06cd872a36 100644 --- a/forge-gui/res/cardsfolder/w/whiptail_moloch.txt +++ b/forge-gui/res/cardsfolder/w/whiptail_moloch.txt @@ -5,6 +5,6 @@ PT:6/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 3 damage to target creature you control. SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature.YouCtrl | NumDmg$ 3 | TgtPrompt$ Select target creature you control SVar:NeedsToPlay:Creature.YouCtrl+inZoneBattlefield -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/whiptail_moloch.jpg Oracle:When Whiptail Moloch enters the battlefield, it deals 3 damage to target creature you control. diff --git a/forge-gui/res/cardsfolder/w/whirlpool_warrior.txt b/forge-gui/res/cardsfolder/w/whirlpool_warrior.txt index 15e8a4d9cdb..1cee5f1db97 100644 --- a/forge-gui/res/cardsfolder/w/whirlpool_warrior.txt +++ b/forge-gui/res/cardsfolder/w/whirlpool_warrior.txt @@ -12,7 +12,7 @@ SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount # Amount Minus 1 because the Player is also being remembered at this point SVar:Y:Remembered$Amount/Minus.1 -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/whirlpool_warrior.jpg Oracle:When Whirlpool Warrior enters the battlefield, shuffle the cards from your hand into your library, then draw that many cards.\n{R}, Sacrifice Whirlpool Warrior: Each player shuffles the cards from their hand into their library, then draws that many cards. diff --git a/forge-gui/res/cardsfolder/w/whirlpool_whelm.txt b/forge-gui/res/cardsfolder/w/whirlpool_whelm.txt index c7980f89e6a..34260f0e698 100644 --- a/forge-gui/res/cardsfolder/w/whirlpool_whelm.txt +++ b/forge-gui/res/cardsfolder/w/whirlpool_whelm.txt @@ -6,6 +6,6 @@ SVar:DBLibrary:DB$ ChangeZone | Defined$ TargetedController | Origin$ Battlefiel SVar:DBDeclined:DB$ ChangeZone | Defined$ Targeted | Origin$ Battlefield | Destination$ Hand | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ1 SVar:DBHand:DB$ ChangeZone | Defined$ Targeted | Origin$ Battlefield | Destination$ Hand SVar:X:Remembered$Amount -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/whirlpool_whelm.jpg Oracle:Clash with an opponent, then return target creature to its owner's hand. If you win, you may put that creature on top of its owner's library instead. (Each clashing player reveals the top card of their library, then puts that card on the top or bottom. A player wins if their card had a higher converted mana cost.) diff --git a/forge-gui/res/cardsfolder/w/whispering_madness.txt b/forge-gui/res/cardsfolder/w/whispering_madness.txt index 872590e5f52..830a117d0b2 100644 --- a/forge-gui/res/cardsfolder/w/whispering_madness.txt +++ b/forge-gui/res/cardsfolder/w/whispering_madness.txt @@ -11,8 +11,8 @@ SVar:MadnessReset:DB$ StoreSVar | SVar$ MaxDiscard | Type$ Number | Expression$ SVar:Cipher:DB$ Encode | Defined$ Self SVar:NumDiscard:Count$RememberedSize/Minus.1 SVar:MaxDiscard:Number$0 -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random DeckNeeds:Type$Creature SVar:Picture:http://www.wizards.com/global/images/magic/general/whispering_madness.jpg Oracle:Each player discards their hand, then draws cards equal to the greatest number of cards a player discarded this way.\nCipher (Then you may exile this spell card encoded on a creature you control. Whenever that creature deals combat damage to a player, its controller may cast a copy of the encoded card without paying its mana cost.) diff --git a/forge-gui/res/cardsfolder/w/white_mana_battery.txt b/forge-gui/res/cardsfolder/w/white_mana_battery.txt index bbbc33b037e..f1ac19742e2 100644 --- a/forge-gui/res/cardsfolder/w/white_mana_battery.txt +++ b/forge-gui/res/cardsfolder/w/white_mana_battery.txt @@ -6,6 +6,6 @@ A:AB$ Mana | Cost$ T SubCounter | Produced$ W | Amount$ Y | CostDesc$ SVar:Y:Number$1/Plus.ChosenX SVar:X:XChoice #ChosenX SVar created by Cost payment -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/white_mana_battery.jpg Oracle:{2}, {T}: Put a charge counter on White Mana Battery.\n{T}, Remove any number of charge counters from White Mana Battery: Add {W}, then add an additional {W} for each charge counter removed this way. diff --git a/forge-gui/res/cardsfolder/w/white_scarab.txt b/forge-gui/res/cardsfolder/w/white_scarab.txt index 423f81f36c7..7c5d32268de 100644 --- a/forge-gui/res/cardsfolder/w/white_scarab.txt +++ b/forge-gui/res/cardsfolder/w/white_scarab.txt @@ -5,6 +5,6 @@ K:Enchant creature A:SP$ Attach | Cost$ W | ValidTgts$ Creature | AILogic$ Pump S:Mode$ CantBlockBy | ValidAttacker$ Creature.EnchantedBy | ValidBlocker$ Creature.White | Description$ Enchanted creature can't be blocked by white creatures. S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 2 | AddToughness$ 2 | IsPresent$ Permanent.White+OppCtrl | Description$ Enchanted creature gets +2/+2 as long as an opponent controls a white permanent. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/white_scarab.jpg Oracle:Enchant creature\nEnchanted creature can't be blocked by white creatures.\nEnchanted creature gets +2/+2 as long as an opponent controls a white permanent. diff --git a/forge-gui/res/cardsfolder/w/white_ward.txt b/forge-gui/res/cardsfolder/w/white_ward.txt index 1ad1969ce3e..46131c2bdab 100644 --- a/forge-gui/res/cardsfolder/w/white_ward.txt +++ b/forge-gui/res/cardsfolder/w/white_ward.txt @@ -4,6 +4,6 @@ Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ W | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Protection:Card.White:Protection from white:Card.CardUID_HostCardUID | Description$ Enchanted creature has protection from white. This effect doesn't remove CARDNAME. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/white_ward.jpg Oracle:Enchant creature\nEnchanted creature has protection from white. This effect doesn't remove White Ward. diff --git a/forge-gui/res/cardsfolder/w/whiteout.txt b/forge-gui/res/cardsfolder/w/whiteout.txt index eb6df5080fc..6dfa2f775fd 100644 --- a/forge-gui/res/cardsfolder/w/whiteout.txt +++ b/forge-gui/res/cardsfolder/w/whiteout.txt @@ -3,7 +3,7 @@ ManaCost:1 G Types:Instant A:SP$ AnimateAll | Cost$ 1 G | ValidCards$ Creature | RemoveKeywords$ Flying | SpellDescription$ All creatures lose flying until end of turn. A:AB$ ChangeZone | Cost$ Sac<1/Land.Snow/snow land> | ActivationZone$ Graveyard | Defined$ Self | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return CARDNAME from your graveyard to your hand. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/whiteout.jpg Oracle:All creatures lose flying until end of turn.\nSacrifice a snow land: Return Whiteout from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/w/wicked_reward.txt b/forge-gui/res/cardsfolder/w/wicked_reward.txt index 43ee87d8476..23290fddb21 100644 --- a/forge-gui/res/cardsfolder/w/wicked_reward.txt +++ b/forge-gui/res/cardsfolder/w/wicked_reward.txt @@ -3,6 +3,6 @@ ManaCost:1 B Types:Instant A:SP$ Pump | Cost$ 1 B Sac<1/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature. | NumAtt$ +4 | NumDef$ +2 | SpellDescription$ Target creature gets +4/+2 until end of turn. SVar:AIPreference:SacCost$Creature.namedBrood of Cockroaches,Creature.token -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wicked_reward.jpg Oracle:As an additional cost to cast Wicked Reward, sacrifice a creature.\nTarget creature gets +4/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/w/widespread_panic.txt b/forge-gui/res/cardsfolder/w/widespread_panic.txt index 1f78accb76f..eda732bfa19 100644 --- a/forge-gui/res/cardsfolder/w/widespread_panic.txt +++ b/forge-gui/res/cardsfolder/w/widespread_panic.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Enchantment T:Mode$ Shuffled | ValidPlayer$ Player | ShuffleFromEffect$ True | ShuffleBySelfControlled$ True | TriggerZones$ Battlefield | Execute$ TrigChangeZone | TriggerDescription$ Whenever a spell or ability causes its controller to shuffle their library, that player puts a card from their hand on top of their library. SVar:TrigChangeZone:DB$ ChangeZone | DefinedPlayer$ TriggeredPlayer | Chooser$ TriggeredPlayer | ChangeType$ Card | ChangeNum$ 1 | Origin$ Hand | Destination$ Library | LibraryPosition$ 0 | Mandatory$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/widespread_panic.jpg Oracle:Whenever a spell or ability causes its controller to shuffle their library, that player puts a card from their hand on top of their library. diff --git a/forge-gui/res/cardsfolder/w/wild_dogs.txt b/forge-gui/res/cardsfolder/w/wild_dogs.txt index e1411bea816..937df95d186 100644 --- a/forge-gui/res/cardsfolder/w/wild_dogs.txt +++ b/forge-gui/res/cardsfolder/w/wild_dogs.txt @@ -5,6 +5,6 @@ PT:2/1 K:Cycling:2 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | APlayerHasMoreLifeThanEachOther$ True | Execute$ TrigOppControl | TriggerDescription$ At the beginning of your upkeep, if a player has more life than each other player, the player with the most life gains control of CARDNAME. SVar:TrigOppControl:DB$ GainControl | Defined$ Self | NewController$ Player.withMostLife -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wild_dogs.jpg Oracle:At the beginning of your upkeep, if a player has more life than each other player, the player with the most life gains control of Wild Dogs.\nCycling {2} ({2}, Discard this card: Draw a card.) diff --git a/forge-gui/res/cardsfolder/w/wild_evocation.txt b/forge-gui/res/cardsfolder/w/wild_evocation.txt index db28750f29b..c774774f7ef 100644 --- a/forge-gui/res/cardsfolder/w/wild_evocation.txt +++ b/forge-gui/res/cardsfolder/w/wild_evocation.txt @@ -6,6 +6,6 @@ SVar:TrigEvoke:DB$ Reveal | Random$ True | RememberRevealed$ True | Defined$ Tri SVar:DBEvokeLand:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | Defined$ ValidHand Land.IsRemembered | ForgetChanged$ True | SubAbility$ DBEvokePlay SVar:DBEvokePlay:DB$ Play | ValidZone$ Hand | Controller$ TriggeredPlayer | Defined$ Remembered | WithoutManaCost$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/wild_evocation.jpg Oracle:At the beginning of each player's upkeep, that player reveals a card at random from their hand. If it's a land card, the player puts it onto the battlefield. Otherwise, the player casts it without paying its mana cost if able. diff --git a/forge-gui/res/cardsfolder/w/wild_growth.txt b/forge-gui/res/cardsfolder/w/wild_growth.txt index 17b22680a16..3b987cae440 100644 --- a/forge-gui/res/cardsfolder/w/wild_growth.txt +++ b/forge-gui/res/cardsfolder/w/wild_growth.txt @@ -5,6 +5,6 @@ K:Enchant land A:SP$ Attach | Cost$ G | ValidTgts$ Land | AILogic$ Pump T:Mode$ TapsForMana | ValidCard$ Card.AttachedBy | Execute$ TrigMana | Static$ True | TriggerDescription$ Whenever enchanted land is tapped for mana, its controller adds an additional {G}. SVar:TrigMana:DB$ Mana | Produced$ G | Amount$ 1 | Defined$ TriggeredCardController -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wild_growth.jpg Oracle:Enchant land\nWhenever enchanted land is tapped for mana, its controller adds an additional {G}. diff --git a/forge-gui/res/cardsfolder/w/wild_guess.txt b/forge-gui/res/cardsfolder/w/wild_guess.txt index f6320cbfe1d..de72eed689a 100644 --- a/forge-gui/res/cardsfolder/w/wild_guess.txt +++ b/forge-gui/res/cardsfolder/w/wild_guess.txt @@ -2,6 +2,6 @@ Name:Wild Guess ManaCost:R R Types:Sorcery A:SP$ Draw | Cost$ R R Discard<1/Card> | CostDesc$ As an additional cost to cast CARDNAME, discard a card. | NumCards$ 2 | Defined$ You | SpellDescription$ Draw two cards. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wild_guess.jpg Oracle:As an additional cost to cast Wild Guess, discard a card.\nDraw two cards. diff --git a/forge-gui/res/cardsfolder/w/wild_mammoth.txt b/forge-gui/res/cardsfolder/w/wild_mammoth.txt index e218ba83d78..6223cd4964d 100644 --- a/forge-gui/res/cardsfolder/w/wild_mammoth.txt +++ b/forge-gui/res/cardsfolder/w/wild_mammoth.txt @@ -4,6 +4,6 @@ Types:Creature Elephant PT:3/4 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | CheckDefinedPlayer$ Player.withMostTypeCreatureOnly | Execute$ TrigGain | TriggerDescription$ At the beginning of your upkeep, if a player controls more creatures than each other player, the player who controls the most creatures gains control of CARDNAME. SVar:TrigGain:DB$ GainControl | Defined$ Self | NewController$ Player.withMostTypeCreatureOnly -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/wild_mammoth.jpg Oracle:At the beginning of your upkeep, if a player controls more creatures than each other player, the player who controls the most creatures gains control of Wild Mammoth. diff --git a/forge-gui/res/cardsfolder/w/wild_ricochet.txt b/forge-gui/res/cardsfolder/w/wild_ricochet.txt index 5695751df2f..0b584273e8e 100644 --- a/forge-gui/res/cardsfolder/w/wild_ricochet.txt +++ b/forge-gui/res/cardsfolder/w/wild_ricochet.txt @@ -3,6 +3,6 @@ ManaCost:2 R R Types:Instant A:SP$ ChangeTargets | Cost$ 2 R R | TargetType$ Spell | Optional$ True | ValidTgts$ Instant,Sorcery | SubAbility$ DBCopy | SpellDescription$ You may choose new targets for target instant or sorcery spell. Then copy that spell. You may choose new targets for the copy. SVar:DBCopy:DB$ CopySpellAbility | Defined$ Targeted | Controller$ You -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wild_ricochet.jpg Oracle:You may choose new targets for target instant or sorcery spell. Then copy that spell. You may choose new targets for the copy. diff --git a/forge-gui/res/cardsfolder/w/wilderness_hypnotist.txt b/forge-gui/res/cardsfolder/w/wilderness_hypnotist.txt index 0737fb129fa..4e22fc55ec1 100644 --- a/forge-gui/res/cardsfolder/w/wilderness_hypnotist.txt +++ b/forge-gui/res/cardsfolder/w/wilderness_hypnotist.txt @@ -3,6 +3,6 @@ ManaCost:2 U U Types:Creature Merfolk Wizard PT:1/3 A:AB$ Pump | Cost$ T | NumAtt$ -2 | ValidTgts$ Creature.Red,Creature.Green | TgtPrompt$ Select target red or green creature | IsCurse$ True | SpellDescription$ Target red or green creature gets -2/-0 until end of turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/wilderness_hypnotist.jpg Oracle:{T}: Target red or green creature gets -2/-0 until end of turn. diff --git a/forge-gui/res/cardsfolder/w/wildfire.txt b/forge-gui/res/cardsfolder/w/wildfire.txt index 6f2a61c7f0a..2095eff3411 100644 --- a/forge-gui/res/cardsfolder/w/wildfire.txt +++ b/forge-gui/res/cardsfolder/w/wildfire.txt @@ -3,6 +3,6 @@ ManaCost:4 R R Types:Sorcery A:SP$ Sacrifice | Cost$ 4 R R | Defined$ Player | SacValid$ Land | Amount$ 4 | SpellDescription$ Each player sacrifices four lands. CARDNAME deals 4 damage to each creature. | SubAbility$ DBDamage SVar:DBDamage:DB$ DamageAll | NumDmg$ 4 | ValidCards$ Creature -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/wildfire.jpg Oracle:Each player sacrifices four lands. Wildfire deals 4 damage to each creature. diff --git a/forge-gui/res/cardsfolder/w/willbender.txt b/forge-gui/res/cardsfolder/w/willbender.txt index 6c2d0bc1cd0..3f424abc0fc 100644 --- a/forge-gui/res/cardsfolder/w/willbender.txt +++ b/forge-gui/res/cardsfolder/w/willbender.txt @@ -5,6 +5,6 @@ PT:1/2 K:Morph:1 U T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigChange | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME is turned face up, change the target of target spell or ability with a single target. SVar:TrigChange:DB$ ChangeTargets | TargetType$ Spell,Activated,Triggered | ValidTgts$ Card | TargetsSingleTarget$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/willbender.jpg Oracle:Morph {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.)\nWhen Willbender is turned face up, change the target of target spell or ability with a single target. diff --git a/forge-gui/res/cardsfolder/w/windfall.txt b/forge-gui/res/cardsfolder/w/windfall.txt index 4625a1c5bbc..2fb6233da82 100644 --- a/forge-gui/res/cardsfolder/w/windfall.txt +++ b/forge-gui/res/cardsfolder/w/windfall.txt @@ -6,6 +6,6 @@ SVar:WindfallDraw:DB$ Draw | Defined$ Player | NumCards$ X | References$ X | Sub SVar:WindfallCleanup:DB$ Cleanup | ClearRemembered$ True #some cards may allow you to discard to other zones SVar:X:PlayerCountPlayers$HighestValidGraveyard,Library,Exile Card.IsRemembered+YouOwn -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/windfall.jpg Oracle:Each player discards their hand, then draws cards equal to the greatest number of cards a player discarded this way. diff --git a/forge-gui/res/cardsfolder/w/winding_canyons.txt b/forge-gui/res/cardsfolder/w/winding_canyons.txt index ce3198321a8..b02073aa862 100644 --- a/forge-gui/res/cardsfolder/w/winding_canyons.txt +++ b/forge-gui/res/cardsfolder/w/winding_canyons.txt @@ -4,6 +4,6 @@ Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Effect | Cost$ 2 T | Name$ Winding Canyons Effect | StaticAbilities$ GiveFlash | SpellDescription$ Until end of turn, you may cast creature spells as though they had flash. SVar:GiveFlash:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.nonToken | WithFlash$ You | AffectedZone$ Exile,Graveyard,Hand,Library,Command | Description$ Until end of turn, you may cast creature spells as though they had flash. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/winding_canyons.jpg Oracle:{T}: Add {C}.\n{2}, {T}: You may cast creature spells this turn as though they had flash. diff --git a/forge-gui/res/cardsfolder/w/winding_constrictor.txt b/forge-gui/res/cardsfolder/w/winding_constrictor.txt index caf1b8ff925..73d9ec76120 100644 --- a/forge-gui/res/cardsfolder/w/winding_constrictor.txt +++ b/forge-gui/res/cardsfolder/w/winding_constrictor.txt @@ -6,7 +6,7 @@ R:Event$ AddCounter | ActiveZones$ Battlefield | ValidCard$ Artifact.YouCtrl,Cre R:Event$ AddCounter | ActiveZones$ Battlefield | ValidPlayer$ You | ReplaceWith$ AddOneMoreCounters | Description$ If you would get one or more counters, you get that many plus one of each of those kinds of counters instead. SVar:AddOneMoreCounters:DB$ ReplaceEffect | VarName$ CounterNum | VarValue$ X | References$ X SVar:X:ReplaceCount$CounterNum/Plus.1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/winding_constrictor.jpg Oracle:If one or more counters would be put on an artifact or creature you control, that many plus one of each of those kinds of counters are put on that permanent instead.\nIf you would get one or more counters, you get that many plus one of each of those kinds of counters instead. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/w/winds_of_change.txt b/forge-gui/res/cardsfolder/w/winds_of_change.txt index f5d36e9900c..0364179ab00 100644 --- a/forge-gui/res/cardsfolder/w/winds_of_change.txt +++ b/forge-gui/res/cardsfolder/w/winds_of_change.txt @@ -7,7 +7,7 @@ SVar:WindDraw:DB$ Draw | NumCards$ X | Defined$ Player.IsRemembered | References SVar:CleanTheWind:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount/Minus.1 # Amount Minus 1 because the Player is also being remembered at this point -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/winds_of_change.jpg Oracle:Each player shuffles the cards from their hand into their library, then draws that many cards. diff --git a/forge-gui/res/cardsfolder/w/wing_puncture.txt b/forge-gui/res/cardsfolder/w/wing_puncture.txt index 92f65cd23e3..5fdef5e2fdc 100644 --- a/forge-gui/res/cardsfolder/w/wing_puncture.txt +++ b/forge-gui/res/cardsfolder/w/wing_puncture.txt @@ -5,6 +5,6 @@ A:SP$ Pump | Cost$ G | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target cr SVar:SoulsDamage:DB$ DealDamage | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | NumDmg$ X | DamageSource$ Remembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wing_puncture.jpg Oracle:Target creature you control deals damage equal to its power to target creature with flying. diff --git a/forge-gui/res/cardsfolder/w/wing_storm.txt b/forge-gui/res/cardsfolder/w/wing_storm.txt index ea541404417..abc9b8fe11c 100644 --- a/forge-gui/res/cardsfolder/w/wing_storm.txt +++ b/forge-gui/res/cardsfolder/w/wing_storm.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ RepeatEach | Cost$ 2 G | RepeatPlayers$ Player | RepeatSubAbility$ DBDamage | DamageMap$ True | SpellDescription$ CARDNAME deals damage to each player equal to twice the number of creatures with flying that player controls. SVar:DBDamage:DB$ DealDamage | Defined$ Remembered | NumDmg$ X | References$ X SVar:X:Count$Valid Creature.withFlying+RememberedPlayerCtrl/Times.2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/wing_storm.jpg Oracle:Wing Storm deals damage to each player equal to twice the number of creatures with flying that player controls. diff --git a/forge-gui/res/cardsfolder/w/wings_of_velis_vel.txt b/forge-gui/res/cardsfolder/w/wings_of_velis_vel.txt index f7aa24aba13..db3aff63fb4 100644 --- a/forge-gui/res/cardsfolder/w/wings_of_velis_vel.txt +++ b/forge-gui/res/cardsfolder/w/wings_of_velis_vel.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Tribal Instant Shapeshifter K:Changeling A:SP$ Animate | Cost$ 1 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Power$ 4 | Toughness$ 4 | Keywords$ Flying | Types$ AllCreatureTypes | SpellDescription$ Until end of turn, target creature has base power and toughness 4/4, gains all creature types, and gains flying. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wings_of_velis_vel.jpg Oracle:Changeling (This card is every creature type.)\nUntil end of turn, target creature has base power and toughness 4/4, gains all creature types, and gains flying. diff --git a/forge-gui/res/cardsfolder/w/winnow.txt b/forge-gui/res/cardsfolder/w/winnow.txt index b7f723ead90..31d57d49524 100644 --- a/forge-gui/res/cardsfolder/w/winnow.txt +++ b/forge-gui/res/cardsfolder/w/winnow.txt @@ -5,7 +5,7 @@ A:SP$ Destroy | Cost$ 1 W | ValidTgts$ Permanent.nonLand | RememberTargets$ True SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:WinnowCheck:Count$Valid Permanent.sharesNameWith Remembered -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/winnow.jpg Oracle:Destroy target nonland permanent if another permanent with the same name is on the battlefield.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/w/winter_orb.txt b/forge-gui/res/cardsfolder/w/winter_orb.txt index d7f57486198..2826a2a9aec 100644 --- a/forge-gui/res/cardsfolder/w/winter_orb.txt +++ b/forge-gui/res/cardsfolder/w/winter_orb.txt @@ -4,6 +4,6 @@ Types:Artifact S:Mode$ Continuous | Affected$ Player | AddKeyword$ UntapAdjust:Land:1 | CheckSVar$ X | SVarCompare$ EQ1 | Description$ As long as CARDNAME is untapped, players can't untap more than one land during their untap steps. SVar:X:Count$Valid Card.Self+untapped SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/winter_orb.jpg Oracle:As long as Winter Orb is untapped, players can't untap more than one land during their untap steps. diff --git a/forge-gui/res/cardsfolder/w/winter_sky.txt b/forge-gui/res/cardsfolder/w/winter_sky.txt index 066cddb27a4..5d9c562537b 100644 --- a/forge-gui/res/cardsfolder/w/winter_sky.txt +++ b/forge-gui/res/cardsfolder/w/winter_sky.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ FlipACoin | Cost$ R | WinSubAbility$ DBDamageAll | LoseSubAbility$ DBDraw | SpellDescription$ Flip a coin. If you win the flip, CARDNAME deals 1 damage to each creature and each player. If you lose the flip, each player draws a card. SVar:DBDamageAll:DB$DamageAll | NumDmg$ 1 | ValidCards$ Creature | ValidPlayers$ Player | ValidDescription$ each creature and each player. SVar:DBDraw:DB$Draw | Defined$ Player -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/winter_sky.jpg Oracle:Flip a coin. If you win the flip, Winter Sky deals 1 damage to each creature and each player. If you lose the flip, each player draws a card. diff --git a/forge-gui/res/cardsfolder/w/wintermoon_mesa.txt b/forge-gui/res/cardsfolder/w/wintermoon_mesa.txt index 04d49454acc..f2c71eb1983 100644 --- a/forge-gui/res/cardsfolder/w/wintermoon_mesa.txt +++ b/forge-gui/res/cardsfolder/w/wintermoon_mesa.txt @@ -4,6 +4,6 @@ Types:Land K:CARDNAME enters the battlefield tapped. A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Tap | Cost$ 2 T Sac<1/CARDNAME> | TargetMin$ 2 | TargetMax$ 2 | TgtPrompt$ Select target land | ValidTgts$ Land | SpellDescription$ Tap two target lands. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/wintermoon_mesa.jpg Oracle:Wintermoon Mesa enters the battlefield tapped.\n{T}: Add {C}.\n{2}, {T}, Sacrifice Wintermoon Mesa: Tap two target lands. diff --git a/forge-gui/res/cardsfolder/w/winters_chill.txt b/forge-gui/res/cardsfolder/w/winters_chill.txt index f30e6a8901b..b64353afcd0 100644 --- a/forge-gui/res/cardsfolder/w/winters_chill.txt +++ b/forge-gui/res/cardsfolder/w/winters_chill.txt @@ -14,7 +14,7 @@ SVar:ExileSelf:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ E SVar:OutOfSight:Mode$ ChangesZone | TriggerZones$ Command | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.IsRemembered | Execute$ ExileSelf | Static$ True SVar:X:Targeted$Amount SVar:MaxTgts:Count$Valid Land.Snow+YouCtrl -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/winters_chill.jpg Oracle:Cast Winter's Chill only during combat before blockers are declared.\nX can't be greater than the number of snow lands you control.\nChoose X target attacking creatures. For each of those creatures, its controller may pay {1} or {2}. If that player doesn't, destroy that creature at end of combat. If that player pays only {1}, prevent all combat damage that would be dealt to and dealt by that creature this combat. diff --git a/forge-gui/res/cardsfolder/w/winters_night.txt b/forge-gui/res/cardsfolder/w/winters_night.txt index a76b548a1da..b4dc01d6af9 100644 --- a/forge-gui/res/cardsfolder/w/winters_night.txt +++ b/forge-gui/res/cardsfolder/w/winters_night.txt @@ -4,7 +4,7 @@ Types:World Enchantment T:Mode$ TapsForMana | ValidCard$ Land.Snow | Execute$ TrigMana | TriggerZones$ Battlefield | Static$ True | TriggerDescription$ Whenever a player taps a snow land for mana, that player adds one mana of any type that land produced. That land doesn't untap during its controller's next untap step. SVar:TrigMana:DB$ManaReflected | ColorOrType$ Type | Valid$ Defined.Triggered | ReflectProperty$ Produced | Defined$ TriggeredPlayer | SubAbility$ DBPump SVar:DBPump:DB$Pump | Defined$ TriggeredCard | Permanent$ True | KW$ HIDDEN This card doesn't untap during your next untap step. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/winters_night.jpg Oracle:Whenever a player taps a snow land for mana, that player adds one mana of any type that land produced. That land doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/w/wirewood_channeler.txt b/forge-gui/res/cardsfolder/w/wirewood_channeler.txt index f57b73daef4..2a0a4804219 100644 --- a/forge-gui/res/cardsfolder/w/wirewood_channeler.txt +++ b/forge-gui/res/cardsfolder/w/wirewood_channeler.txt @@ -4,7 +4,7 @@ Types:Creature Elf Druid PT:2/2 A:AB$ Mana | Cost$ T | Produced$ Any | Amount$ X | References$ X | SpellDescription$ Add X mana of any one color, where X is the number of Elves on the battlefield. SVar:X:Count$Valid Elf -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/wirewood_channeler.jpg Oracle:{T}: Add X mana of any one color, where X is the number of Elves on the battlefield. diff --git a/forge-gui/res/cardsfolder/w/wirewood_lodge.txt b/forge-gui/res/cardsfolder/w/wirewood_lodge.txt index 68e0983a0ca..461c8834c4b 100644 --- a/forge-gui/res/cardsfolder/w/wirewood_lodge.txt +++ b/forge-gui/res/cardsfolder/w/wirewood_lodge.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Untap | Cost$ G T | ValidTgts$ Elf | TgtPrompt$ Select target Elf | SpellDescription$ Untap target Elf. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/wirewood_lodge.jpg Oracle:{T}: Add {C}.\n{G}, {T}: Untap target Elf. diff --git a/forge-gui/res/cardsfolder/w/wirewood_symbiote.txt b/forge-gui/res/cardsfolder/w/wirewood_symbiote.txt index a37512ce733..0ee8a3fccec 100644 --- a/forge-gui/res/cardsfolder/w/wirewood_symbiote.txt +++ b/forge-gui/res/cardsfolder/w/wirewood_symbiote.txt @@ -3,6 +3,6 @@ ManaCost:G Types:Creature Insect PT:1/1 A:AB$ Untap | Cost$ Return<1/Elf> | ValidTgts$ Creature | AILogic$ Never | TgtPrompt$ Select target creature | ActivationLimit$ 1 | SpellDescription$ Untap target creature. Activate this ability only once each turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wirewood_symbiote.jpg Oracle:Return an Elf you control to its owner's hand: Untap target creature. Activate this ability only once each turn. diff --git a/forge-gui/res/cardsfolder/w/wishmonger.txt b/forge-gui/res/cardsfolder/w/wishmonger.txt index 1f912a6a1e6..eb8d808e114 100644 --- a/forge-gui/res/cardsfolder/w/wishmonger.txt +++ b/forge-gui/res/cardsfolder/w/wishmonger.txt @@ -3,6 +3,6 @@ ManaCost:3 W Types:Creature Unicorn Monger PT:3/3 A:AB$ Protection | Cost$ 2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | Gains$ Choice | Choser$ Controller | AnyPlayer$ True | Choices$ AnyColor | SpellDescription$ Target creature gains protection from the color of its controller's choice until end of turn. Any player may activate this ability. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wishmonger.jpg Oracle:{2}: Target creature gains protection from the color of its controller's choice until end of turn. Any player may activate this ability. diff --git a/forge-gui/res/cardsfolder/w/wistful_thinking.txt b/forge-gui/res/cardsfolder/w/wistful_thinking.txt index 651f4c0d9de..e8b1526d7b9 100644 --- a/forge-gui/res/cardsfolder/w/wistful_thinking.txt +++ b/forge-gui/res/cardsfolder/w/wistful_thinking.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Sorcery A:SP$ Draw | Cost$ 2 U | NumCards$ 2 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player draws two cards, then discards four cards. | SubAbility$ DBDiscard SVar:DBDiscard:DB$Discard | Defined$ Targeted | NumCards$ 4 | Mode$ TgtChoose -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wistful_thinking.jpg Oracle:Target player draws two cards, then discards four cards. diff --git a/forge-gui/res/cardsfolder/w/witch_engine.txt b/forge-gui/res/cardsfolder/w/witch_engine.txt index 10d72bf2637..ab4938dabf4 100644 --- a/forge-gui/res/cardsfolder/w/witch_engine.txt +++ b/forge-gui/res/cardsfolder/w/witch_engine.txt @@ -6,6 +6,6 @@ K:Swampwalk A:AB$ Mana | Cost$ T | Produced$ B | Amount$ 4 | SubAbility$ ChangeControl | SpellDescription$ Add {B}{B}{B}{B}. SVar:ChangeControl:DB$GainControl | Defined$ Self | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | SubAbility$ RemCombat | SpellDescription$ Target opponent gains control of CARDNAME. SVar:RemCombat:DB$ RemoveFromCombat | Defined$ Self -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/witch_engine.jpg Oracle:Swampwalk\n{T}: Add {B}{B}{B}{B}. Target opponent gains control of Witch Engine. (Activate this ability only any time you could cast an instant.) diff --git a/forge-gui/res/cardsfolder/w/withering_gaze.txt b/forge-gui/res/cardsfolder/w/withering_gaze.txt index a6837096797..32d4fcb1555 100644 --- a/forge-gui/res/cardsfolder/w/withering_gaze.txt +++ b/forge-gui/res/cardsfolder/w/withering_gaze.txt @@ -4,6 +4,6 @@ Types:Sorcery A:SP$ RevealHand | Cost$ 2 U | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | SubAbility$ DBDraw | SpellDescription$ Target opponent reveals their hand. You draw a card for each Forest and green card in it. SVar:DBDraw:DB$ Draw | NumCards$ X | References$ X SVar:X:Count$ValidHand Forest.TargetedPlayerCtrl,Card.Green+TargetedPlayerCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/withering_gaze.jpg Oracle:Target opponent reveals their hand. You draw a card for each Forest and green card in it. diff --git a/forge-gui/res/cardsfolder/w/withering_hex.txt b/forge-gui/res/cardsfolder/w/withering_hex.txt index f1c006b28c9..e7aeef329a2 100644 --- a/forge-gui/res/cardsfolder/w/withering_hex.txt +++ b/forge-gui/res/cardsfolder/w/withering_hex.txt @@ -7,6 +7,6 @@ T:Mode$ Cycled | ValidCard$ Card | Execute$ TrigPutCounter | TriggerZones$ Battl SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ PLAGUE | CounterNum$ 1 S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ -X | AddToughness$ -X | References$ X | Description$ Enchanted creature gets -1/-1 for each plague counter on CARDNAME. SVar:X:Count$CardCounters.PLAGUE -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/withering_hex.jpg Oracle:Enchant creature\nWhenever a player cycles a card, put a plague counter on Withering Hex.\nEnchanted creature gets -1/-1 for each plague counter on Withering Hex. diff --git a/forge-gui/res/cardsfolder/w/withering_wisps.txt b/forge-gui/res/cardsfolder/w/withering_wisps.txt index 36706e3acee..0f138c59a50 100644 --- a/forge-gui/res/cardsfolder/w/withering_wisps.txt +++ b/forge-gui/res/cardsfolder/w/withering_wisps.txt @@ -6,7 +6,7 @@ SVar:TrigSac:DB$Sacrifice | Defined$ Self A:AB$ DamageAll | Cost$ B | NumDmg$ 1 | ValidCards$ Creature | ValidPlayers$ Player | ValidDescription$ each creature and each player. | ActivationLimit$ X | References$ X | SpellDescription$ CARDNAME deals 1 damage to each creature and each player. Activate this ability no more times each turn than the number of snow Swamps you control. SVar:X:Count$Valid Swamp.Snow+YouCtrl SVar:NeedsToPlay:Creature -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/withering_wisps.jpg Oracle:At the beginning of the end step, if no creatures are on the battlefield, sacrifice Withering Wisps.\n{B}: Withering Wisps deals 1 damage to each creature and each player. Activate this ability no more times each turn than the number of snow Swamps you control. diff --git a/forge-gui/res/cardsfolder/w/wizard_mentor.txt b/forge-gui/res/cardsfolder/w/wizard_mentor.txt index 0385898a7f4..5d572184c73 100644 --- a/forge-gui/res/cardsfolder/w/wizard_mentor.txt +++ b/forge-gui/res/cardsfolder/w/wizard_mentor.txt @@ -4,6 +4,6 @@ Types:Creature Human Wizard PT:2/2 A:AB$ ChangeZone | Cost$ T | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature. | SubAbility$ DBChangeZone | SpellDescription$ Return CARDNAME and target creature you control to owner's hand. SVar:DBChangeZone:DB$ChangeZone | Origin$ Battlefield | Destination$ Hand -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wizard_mentor.jpg Oracle:{T}: Return Wizard Mentor and target creature you control to their owner's hand. diff --git a/forge-gui/res/cardsfolder/w/wizard_replica.txt b/forge-gui/res/cardsfolder/w/wizard_replica.txt index 4e1da59b2e0..a37f0a1e767 100644 --- a/forge-gui/res/cardsfolder/w/wizard_replica.txt +++ b/forge-gui/res/cardsfolder/w/wizard_replica.txt @@ -4,6 +4,6 @@ Types:Artifact Creature Wizard PT:1/3 K:Flying A:AB$ Counter | Cost$ U Sac<1/CARDNAME> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 2 | SpellDescription$ Counter target spell unless its controller pays {2}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wizard_replica.jpg Oracle:Flying\n{U}, Sacrifice Wizard Replica: Counter target spell unless its controller pays {2}. diff --git a/forge-gui/res/cardsfolder/w/wizards_school.txt b/forge-gui/res/cardsfolder/w/wizards_school.txt index d2fa55c82dc..8c8004b231c 100644 --- a/forge-gui/res/cardsfolder/w/wizards_school.txt +++ b/forge-gui/res/cardsfolder/w/wizards_school.txt @@ -5,7 +5,7 @@ A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ 1 T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Mana | Cost$ 2 T | Produced$ W | SpellDescription$ Add {W}. A:AB$ Mana | Cost$ 2 T | Produced$ B | SpellDescription$ Add {B}. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/wizards_school.jpg Oracle:{T}: Add {C}.\n{1}, {T}: Add {U}.\n{2}, {T}: Add {W} or {B}. diff --git a/forge-gui/res/cardsfolder/w/wizened_snitches.txt b/forge-gui/res/cardsfolder/w/wizened_snitches.txt index a5d61270656..a4f7021b9c2 100644 --- a/forge-gui/res/cardsfolder/w/wizened_snitches.txt +++ b/forge-gui/res/cardsfolder/w/wizened_snitches.txt @@ -4,6 +4,6 @@ Types:Creature Faerie Rogue PT:1/3 K:Flying S:Mode$ Continuous | Affected$ Card.TopLibrary | AffectedZone$ Library | MayLookAt$ Player | Description$ Players play with the top card of their libraries revealed. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/wizened_snitches.jpg Oracle:Flying\nPlayers play with the top card of their libraries revealed. diff --git a/forge-gui/res/cardsfolder/w/wojek_apothecary.txt b/forge-gui/res/cardsfolder/w/wojek_apothecary.txt index fc2a59dcbb5..8ddba97f904 100644 --- a/forge-gui/res/cardsfolder/w/wojek_apothecary.txt +++ b/forge-gui/res/cardsfolder/w/wojek_apothecary.txt @@ -3,6 +3,6 @@ ManaCost:2 W W Types:Creature Human Cleric PT:1/1 A:AB$PreventDamage | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Choose target creature | Amount$ 1 | Radiance$ True | PrecostDesc$ Radiance — | SpellDescription$ Prevent the next 1 damage that would be dealt to target creature and each other creature that shares a color with it this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wojek_apothecary.jpg Oracle:Radiance — {T}: Prevent the next 1 damage that would be dealt to target creature and each other creature that shares a color with it this turn. diff --git a/forge-gui/res/cardsfolder/w/wojek_embermage.txt b/forge-gui/res/cardsfolder/w/wojek_embermage.txt index cd5f937bc19..c671cdcfc83 100644 --- a/forge-gui/res/cardsfolder/w/wojek_embermage.txt +++ b/forge-gui/res/cardsfolder/w/wojek_embermage.txt @@ -3,6 +3,6 @@ ManaCost:3 R Types:Creature Human Wizard PT:1/2 A:AB$DealDamage | Cost$ T | ValidTgts$ Creature | Radiance$ True | PrecostDesc$ Radiance — | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature and each other creature that shares a color with it. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wojek_embermage.jpg Oracle:Radiance — {T}: Wojek Embermage deals 1 damage to target creature and each other creature that shares a color with it. diff --git a/forge-gui/res/cardsfolder/w/wojek_siren.txt b/forge-gui/res/cardsfolder/w/wojek_siren.txt index 722e171b5af..2a13dc484f8 100644 --- a/forge-gui/res/cardsfolder/w/wojek_siren.txt +++ b/forge-gui/res/cardsfolder/w/wojek_siren.txt @@ -2,6 +2,6 @@ Name:Wojek Siren ManaCost:W Types:Instant A:SP$Pump | Cost$ W | ValidTgts$ Creature | Radiance$ True | NumAtt$ 1 | NumDef$ 1 | SpellDescription$ Radiance — Target creature and each other creature that shares a color with it get +1/+1 until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wojek_siren.jpg Oracle:Radiance — Target creature and each other creature that shares a color with it get +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/w/wolfcallers_howl.txt b/forge-gui/res/cardsfolder/w/wolfcallers_howl.txt index 86b15cc5759..5e6206f6494 100644 --- a/forge-gui/res/cardsfolder/w/wolfcallers_howl.txt +++ b/forge-gui/res/cardsfolder/w/wolfcallers_howl.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of your upkeep, create X 2/2 green Wolf creature tokens, where X is the number of your opponents with four or more cards in hand. SVar:TrigToken:DB$ Token | TokenImage$ g 2 2 wolf C14 | TokenAmount$ X | TokenName$ Wolf | TokenTypes$ Creature,Wolf | TokenOwner$ You | TokenPower$ 2 | TokenToughness$ 2 | TokenColors$ Green | References$ X SVar:X:PlayerCountOpponents$HasPropertyWithCardsInHandAtLeast4 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/wolfcallers_howl.jpg Oracle:At the beginning of your upkeep, create X 2/2 green Wolf creature tokens, where X is the number of your opponents with four or more cards in hand. diff --git a/forge-gui/res/cardsfolder/w/wood_elemental.txt b/forge-gui/res/cardsfolder/w/wood_elemental.txt index 04931aab7cf..50840cf1f03 100644 --- a/forge-gui/res/cardsfolder/w/wood_elemental.txt +++ b/forge-gui/res/cardsfolder/w/wood_elemental.txt @@ -10,6 +10,6 @@ SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:SacX:Count$Valid Forest.YouCtrl+untapped SVar:NeedsToPlayVar:SacX GE5 SVar:X:Remembered$Amount -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/wood_elemental.jpg Oracle:As Wood Elemental enters the battlefield, sacrifice any number of untapped Forests.\nWood Elemental's power and toughness are each equal to the number of Forests sacrificed as it entered the battlefield. diff --git a/forge-gui/res/cardsfolder/w/wood_sage.txt b/forge-gui/res/cardsfolder/w/wood_sage.txt index b86a10b3bbf..9a86be2a79c 100644 --- a/forge-gui/res/cardsfolder/w/wood_sage.txt +++ b/forge-gui/res/cardsfolder/w/wood_sage.txt @@ -4,6 +4,6 @@ Types:Creature Human Druid PT:1/1 A:AB$ NameCard | Cost$ T | Defined$ You | ValidCards$ Card.Creature | ValidDesc$ creature | SubAbility$ DBDig | SpellDescription$ Choose a creature card name. Reveal the top four cards of your library and put all of them with that name into your hand. Put the rest into your graveyard. SVar:DBDig:DB$ Dig | DigNum$ 4 | Reveal$ True | ChangeNum$ All | ChangeValid$ Card.NamedCard | DestinationZone2$ Graveyard -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wood_sage.jpg Oracle:{T}: Choose a creature card name. Reveal the top four cards of your library and put all of them with that name into your hand. Put the rest into your graveyard. diff --git a/forge-gui/res/cardsfolder/w/wooded_bastion.txt b/forge-gui/res/cardsfolder/w/wooded_bastion.txt index 1940b52a537..3c9facf6f80 100644 --- a/forge-gui/res/cardsfolder/w/wooded_bastion.txt +++ b/forge-gui/res/cardsfolder/w/wooded_bastion.txt @@ -5,6 +5,6 @@ A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ GW T | Produced$ W | Amount$ 2 | SpellDescription$ Add {W}{W}. A:AB$ Mana | Cost$ GW T | Produced$ G W | SpellDescription$ Add {G}{W}. A:AB$ Mana | Cost$ GW T | Produced$ G | Amount$ 2 | SpellDescription$ Add {G}{G}. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wooded_bastion.jpg Oracle:{T}: Add {C}.\n{G/W}, {T}: Add {G}{G}, {G}{W}, or {W}{W}. diff --git a/forge-gui/res/cardsfolder/w/wooden_sphere.txt b/forge-gui/res/cardsfolder/w/wooden_sphere.txt index f943da9fb31..2b58abc0432 100644 --- a/forge-gui/res/cardsfolder/w/wooden_sphere.txt +++ b/forge-gui/res/cardsfolder/w/wooden_sphere.txt @@ -3,6 +3,6 @@ ManaCost:1 Types:Artifact T:Mode$ SpellCast | ValidCard$ Card.Green | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever a player casts a green spell, you may pay {1}. If you do, you gain 1 life. SVar:TrigGainLife:AB$GainLife | Cost$ 1 | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/wooden_sphere.jpg Oracle:Whenever a player casts a green spell, you may pay {1}. If you do, you gain 1 life. diff --git a/forge-gui/res/cardsfolder/w/word_of_blasting.txt b/forge-gui/res/cardsfolder/w/word_of_blasting.txt index 6757a4c7b21..3305ec89f9d 100644 --- a/forge-gui/res/cardsfolder/w/word_of_blasting.txt +++ b/forge-gui/res/cardsfolder/w/word_of_blasting.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Destroy | Cost$ 1 R | ValidTgts$ Wall | TgtPrompt$ Select target Wall | SubAbility$ DBDamage| SpellDescription$ Destroy target Wall. It can't be regenerated. CARDNAME deals damage equal to that Wall's converted mana cost to the Wall's controller. SVar:DBDamage:DB$DealDamage | NumDmg$ X | Defined$ TargetedController SVar:X:Targeted$CardManaCost -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/word_of_blasting.jpg Oracle:Destroy target Wall. It can't be regenerated. Word of Blasting deals damage equal to that Wall's converted mana cost to the Wall's controller. diff --git a/forge-gui/res/cardsfolder/w/words_of_war.txt b/forge-gui/res/cardsfolder/w/words_of_war.txt index 279762dc0c3..7847bf2f9c5 100644 --- a/forge-gui/res/cardsfolder/w/words_of_war.txt +++ b/forge-gui/res/cardsfolder/w/words_of_war.txt @@ -5,6 +5,6 @@ A:AB$ Effect | Cost$ 1 | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Se SVar:DrawReplace:Event$ Draw | ValidPlayer$ You | ReplaceWith$ WarDamage | Description$ The next time you would draw a card this turn, Words of War deals 2 damage to any target instead. SVar:WarDamage:DB$ DealDamage | Defined$ Remembered | DamageSource$ Imprinted | NumDmg$ 2 | SubAbility$ ExileEffect SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/words_of_war.jpg Oracle:{1}: The next time you would draw a card this turn, Words of War deals 2 damage to any target instead. diff --git a/forge-gui/res/cardsfolder/w/words_of_waste.txt b/forge-gui/res/cardsfolder/w/words_of_waste.txt index ac57c096575..5cd5453825a 100644 --- a/forge-gui/res/cardsfolder/w/words_of_waste.txt +++ b/forge-gui/res/cardsfolder/w/words_of_waste.txt @@ -5,6 +5,6 @@ A:AB$ Effect | Cost$ 1 | Name$ Words of Waste Effect | ReplacementEffects$ DrawR SVar:DrawReplace:Event$ Draw | ValidPlayer$ You | ReplaceWith$ WasteCard | Description$ The next time you would draw a card this turn, each opponent discards a card instead. SVar:WasteCard:DB$ Discard | Defined$ Player.Opponent | NumCards$ 1 | Mode$ TgtChoose | SubAbility$ ExileEffect SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/words_of_waste.jpg Oracle:{1}: The next time you would draw a card this turn, each opponent discards a card instead. diff --git a/forge-gui/res/cardsfolder/w/words_of_wilding.txt b/forge-gui/res/cardsfolder/w/words_of_wilding.txt index 7825f129770..c8b19c6e140 100644 --- a/forge-gui/res/cardsfolder/w/words_of_wilding.txt +++ b/forge-gui/res/cardsfolder/w/words_of_wilding.txt @@ -5,6 +5,6 @@ A:AB$ Effect | Cost$ 1 | Name$ Words of Wilding Effect | ReplacementEffects$ Dra SVar:DrawReplace:Event$ Draw | ValidPlayer$ You | ReplaceWith$ WildToken | Description$ The next time you would draw a card this turn, create a 2/2 green Bear creature token instead. SVar:WildToken:DB$ Token | TokenAmount$ 1 | TokenOwner$ You | TokenName$ Bear | TokenTypes$ Creature,Bear | TokenColors$ Green | TokenPower$ 2 | TokenToughness$ 2 | TokenImage$ g 2 2 bear ONS | SubAbility$ ExileEffect SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/words_of_wilding.jpg Oracle:{1}: The next time you would draw a card this turn, create a 2/2 green Bear creature token instead. diff --git a/forge-gui/res/cardsfolder/w/words_of_wind.txt b/forge-gui/res/cardsfolder/w/words_of_wind.txt index a2e4a8fbcbf..eab9ff25bb5 100644 --- a/forge-gui/res/cardsfolder/w/words_of_wind.txt +++ b/forge-gui/res/cardsfolder/w/words_of_wind.txt @@ -7,6 +7,6 @@ SVar:Repeat:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ PlayChoos SVar:PlayChoose:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Permanent.RememberedPlayerCtrl | Amount$ 1 | Mandatory$ True | AILogic$ WorstCard | ChoiceTitle$ Choose a permanent you control | RememberChosen$ True SVar:BounceAll:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Hand | ChangeType$ Permanent.IsRemembered | SubAbility$ ExileEffect SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/words_of_wind.jpg Oracle:{1}: The next time you would draw a card this turn, each player returns a permanent they control to its owner's hand instead. diff --git a/forge-gui/res/cardsfolder/w/words_of_worship.txt b/forge-gui/res/cardsfolder/w/words_of_worship.txt index b74941804a5..fd916368f94 100644 --- a/forge-gui/res/cardsfolder/w/words_of_worship.txt +++ b/forge-gui/res/cardsfolder/w/words_of_worship.txt @@ -5,7 +5,7 @@ A:AB$ Effect | Cost$ 1 | Name$ Words of Worship Effect | ReplacementEffects$ Dra SVar:DrawReplace:Event$ Draw | ValidPlayer$ You | ReplaceWith$ WordLife | Description$ The next time you would draw a card this turn, you gain 5 life instead. SVar:WordLife:DB$ GainLife | LifeAmount$ 5 | SubAbility$ ExileEffect SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/words_of_worship.jpg Oracle:{1}: The next time you would draw a card this turn, you gain 5 life instead. diff --git a/forge-gui/res/cardsfolder/w/world_queller.txt b/forge-gui/res/cardsfolder/w/world_queller.txt index eba0911faae..d669cc2fe81 100644 --- a/forge-gui/res/cardsfolder/w/world_queller.txt +++ b/forge-gui/res/cardsfolder/w/world_queller.txt @@ -5,6 +5,6 @@ PT:4/4 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ ChooseType | TriggerDescription$ At the beginning of your upkeep, you may choose a card type. If you do, each player sacrifices a permanent of that type. SVar:ChooseType:DB$ChooseType | Defined$ You | Type$ Card | InvalidTypes$ Instant,Sorcery | SubAbility$ TrigSac SVar:TrigSac:DB$Sacrifice | SacValid$ Permanent.ChosenType | Defined$ Player -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/world_queller.jpg Oracle:At the beginning of your upkeep, you may choose a card type. If you do, each player sacrifices a permanent of that type. diff --git a/forge-gui/res/cardsfolder/w/worldgorger_dragon.txt b/forge-gui/res/cardsfolder/w/worldgorger_dragon.txt index ea5c2b96ed2..f64d01cdbe9 100644 --- a/forge-gui/res/cardsfolder/w/worldgorger_dragon.txt +++ b/forge-gui/res/cardsfolder/w/worldgorger_dragon.txt @@ -9,6 +9,6 @@ SVar:TrigExile:DB$ ChangeZoneAll | ChangeType$ Permanent.YouCtrl+Other | Origin$ T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Any | Execute$ TrigReturn | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME leaves the battlefield, return the exiled cards to the battlefield under their owners' control. SVar:TrigReturn:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Exile | Destination$ Battlefield | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/worldgorger_dragon.jpg Oracle:Flying, trample\nWhen Worldgorger Dragon enters the battlefield, exile all other permanents you control.\nWhen Worldgorger Dragon leaves the battlefield, return the exiled cards to the battlefield under their owners' control. diff --git a/forge-gui/res/cardsfolder/w/worldly_counsel.txt b/forge-gui/res/cardsfolder/w/worldly_counsel.txt index f32b45deeb8..fa0110ad68b 100644 --- a/forge-gui/res/cardsfolder/w/worldly_counsel.txt +++ b/forge-gui/res/cardsfolder/w/worldly_counsel.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Instant A:SP$ Dig | Cost$ 1 U | DigNum$ X | References$ X | SpellDescription$ Domain — Look at the top X cards of your library, where X is the number of basic land types among lands you control. Put one of those cards into your hand and the rest on the bottom of your library in any order. SVar:X:Count$Domain -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/worldly_counsel.jpg Oracle:Domain — Look at the top X cards of your library, where X is the number of basic land types among lands you control. Put one of those cards into your hand and the rest on the bottom of your library in any order. diff --git a/forge-gui/res/cardsfolder/w/worldpurge.txt b/forge-gui/res/cardsfolder/w/worldpurge.txt index 3ed08389a69..d96636f976d 100644 --- a/forge-gui/res/cardsfolder/w/worldpurge.txt +++ b/forge-gui/res/cardsfolder/w/worldpurge.txt @@ -7,6 +7,6 @@ SVar:DBChoose:DB$ ChooseCard | Amount$ 7 | Defined$ Remembered | Choices$ Card.R SVar:DBReturn:DB$ ChangeZone | Defined$ ValidHand Card.IsNotRemembered+RememberedPlayerCtrl | Origin$ Hand | Destination$ Library | Shuffle$ True | SubAbility$ DBEmpty SVar:DBEmpty:DB$ DrainMana | Defined$ Remembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/worldpurge.jpg Oracle:Return all permanents to their owners' hands. Each player chooses up to seven cards in their hand, then shuffles the rest into their library. Each player loses all unspent mana. diff --git a/forge-gui/res/cardsfolder/w/worldslayer.txt b/forge-gui/res/cardsfolder/w/worldslayer.txt index a2b45307e19..303a40bd93e 100644 --- a/forge-gui/res/cardsfolder/w/worldslayer.txt +++ b/forge-gui/res/cardsfolder/w/worldslayer.txt @@ -4,6 +4,6 @@ Types:Artifact Equipment K:Equip:5 T:Mode$ DamageDone | ValidSource$ Card.EquippedBy | ValidTarget$ Player | Execute$ TrigDestroyAll | TriggerZones$ Battlefield | CombatDamage$ True | TriggerDescription$ Whenever equipped creature deals combat damage to a player, destroy all permanents other than CARDNAME. SVar:TrigDestroyAll:DB$DestroyAll | ValidCards$ Permanent.Other -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/worldslayer.jpg Oracle:Whenever equipped creature deals combat damage to a player, destroy all permanents other than Worldslayer.\nEquip {5} ({5}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/w/wormfang_behemoth.txt b/forge-gui/res/cardsfolder/w/wormfang_behemoth.txt index 9525c520bc3..112a692da70 100644 --- a/forge-gui/res/cardsfolder/w/wormfang_behemoth.txt +++ b/forge-gui/res/cardsfolder/w/wormfang_behemoth.txt @@ -7,6 +7,6 @@ SVar:TrigExile:DB$ChangeZoneAll | ChangeType$ Card.YouCtrl | Origin$ Hand | Dest T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Any | Execute$ TrigReturn | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME leaves the battlefield, return the exiled cards to their owner's hand. SVar:TrigReturn:DB$ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Hand | SubAbility$ DBCleanup SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wormfang_behemoth.jpg Oracle:When Wormfang Behemoth enters the battlefield, exile all cards from your hand.\nWhen Wormfang Behemoth leaves the battlefield, return the exiled cards to their owner's hand. diff --git a/forge-gui/res/cardsfolder/w/wormfang_crab.txt b/forge-gui/res/cardsfolder/w/wormfang_crab.txt index 1db82bd8b82..49d0c9e2244 100644 --- a/forge-gui/res/cardsfolder/w/wormfang_crab.txt +++ b/forge-gui/res/cardsfolder/w/wormfang_crab.txt @@ -12,6 +12,6 @@ SVar:DBForget:DB$ Pump | Defined$ TriggeredCard | ForgetObjects$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME leaves the battlefield, return the exiled card to the battlefield under its owner's control. SVar:TrigReturn:DB$ ChangeZone | Defined$ Remembered.ExiledWithSource | Origin$ Exile | Destination$ Battlefield | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wormfang_crab.jpg Oracle:Wormfang Crab can't be blocked.\nWhen Wormfang Crab enters the battlefield, an opponent chooses a permanent you control other than Wormfang Crab and exiles it.\nWhen Wormfang Crab leaves the battlefield, return the exiled card to the battlefield under its owner's control. diff --git a/forge-gui/res/cardsfolder/w/wormfang_manta.txt b/forge-gui/res/cardsfolder/w/wormfang_manta.txt index 385f70a997a..5e1e488d6f8 100644 --- a/forge-gui/res/cardsfolder/w/wormfang_manta.txt +++ b/forge-gui/res/cardsfolder/w/wormfang_manta.txt @@ -7,6 +7,6 @@ T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefi T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigAdd | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME leaves the battlefield, you take an extra turn after this one. SVar:TrigAdd:DB$AddTurn | NumTurns$ 1 | Defined$ You SVar:TrigSkip:DB$ SkipTurn | NumTurns$ 1 | Defined$ You -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/wormfang_manta.jpg Oracle:Flying\nWhen Wormfang Manta enters the battlefield, you skip your next turn.\nWhen Wormfang Manta leaves the battlefield, you take an extra turn after this one. diff --git a/forge-gui/res/cardsfolder/w/worms_of_the_earth.txt b/forge-gui/res/cardsfolder/w/worms_of_the_earth.txt index d5aec063668..136b72cdd85 100644 --- a/forge-gui/res/cardsfolder/w/worms_of_the_earth.txt +++ b/forge-gui/res/cardsfolder/w/worms_of_the_earth.txt @@ -9,7 +9,7 @@ SVar:DBChoose:DB$ GenericChoice | Defined$ Player.IsRemembered | Choices$ SacTwo SVar:DealDmg:DB$ Destroy | Defined$ Self | UnlessCost$ DamageYou<5> | UnlessPayer$ Player.IsRemembered | UnlessSwitched$ True | SpellDescription$ Have CARDNAME deal 5 damage to you and destroy CARDNAME. SVar:SacTwoLands:DB$ Destroy | Defined$ Self | UnlessCost$ Sac<2/Permanent.Land/two lands> | UnlessPayer$ Player.IsRemembered | UnlessSwitched$ True | SpellDescription$ Sacrifice two lands to destroy CARDNAME. SVar:AIPreference:SacCost$Land.Basic,Land -SVar:RemRandomDeck:True -SVar:RemAIDeck:True +AI:RemoveDeck:Random +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/worms_of_the_earth.jpg Oracle: Players can't play lands.\nLands can't enter the battlefield.\nAt the beginning of each upkeep, any player may sacrifice two lands or have Worms of the Earth deal 5 damage to that player. If a player does either, destroy Worms of the Earth. diff --git a/forge-gui/res/cardsfolder/w/worry_beads.txt b/forge-gui/res/cardsfolder/w/worry_beads.txt index e534659400c..3b185f81c35 100644 --- a/forge-gui/res/cardsfolder/w/worry_beads.txt +++ b/forge-gui/res/cardsfolder/w/worry_beads.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigMill | TriggerDescription$ At the beginning of each player's upkeep, that player puts the top card of their library into their graveyard. SVar:TrigMill:DB$Mill | Defined$ TriggeredPlayer | NumCards$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/worry_beads.jpg Oracle:At the beginning of each player's upkeep, that player puts the top card of their library into their graveyard. diff --git a/forge-gui/res/cardsfolder/w/worst_fears.txt b/forge-gui/res/cardsfolder/w/worst_fears.txt index 4b059274553..3a4cd228883 100644 --- a/forge-gui/res/cardsfolder/w/worst_fears.txt +++ b/forge-gui/res/cardsfolder/w/worst_fears.txt @@ -3,6 +3,6 @@ ManaCost:7 B Types:Sorcery A:SP$ ControlPlayer | Cost$ 7 B | ValidTgts$ Player | TgtPrompt$ Select target player | SubAbility$ DBChange | SpellDescription$ You control target player during that player's next turn. Exile CARDNAME. (You see all cards that player could see and make all decisions for that player.) SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/worst_fears.jpg Oracle:You control target player during that player's next turn. Exile Worst Fears. (You see all cards that player could see and make all decisions for the player.) diff --git a/forge-gui/res/cardsfolder/w/worthy_cause.txt b/forge-gui/res/cardsfolder/w/worthy_cause.txt index af3274b1b4c..af4936329c5 100644 --- a/forge-gui/res/cardsfolder/w/worthy_cause.txt +++ b/forge-gui/res/cardsfolder/w/worthy_cause.txt @@ -4,6 +4,6 @@ Types:Instant K:Buyback:2 A:SP$ GainLife | Cost$ W Sac<1/Creature> | LifeAmount$ X | SpellDescription$ You gain life equal to the sacrificed creature's toughness. SVar:X:Sacrificed$CardToughness -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/worthy_cause.jpg Oracle:Buyback {2} (You may pay an additional {2} as you cast this spell. If you do, put this card into your hand as it resolves.)\nAs an additional cost to cast Worthy Cause, sacrifice a creature.\nYou gain life equal to the sacrificed creature's toughness. diff --git a/forge-gui/res/cardsfolder/w/wrack_with_madness.txt b/forge-gui/res/cardsfolder/w/wrack_with_madness.txt index 4fe1439391d..590e1109bb3 100644 --- a/forge-gui/res/cardsfolder/w/wrack_with_madness.txt +++ b/forge-gui/res/cardsfolder/w/wrack_with_madness.txt @@ -3,6 +3,6 @@ ManaCost:3 R Types:Sorcery A:SP$ DealDamage | Cost$ 3 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | DamageSource$ Targeted | NumDmg$ X | SpellDescription$ Target creature deals damage to itself equal to its power. SVar:X:Targeted$CardPower -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wrack_with_madness.jpg Oracle:Target creature deals damage to itself equal to its power. diff --git a/forge-gui/res/cardsfolder/w/wrath_of_marit_lage.txt b/forge-gui/res/cardsfolder/w/wrath_of_marit_lage.txt index 316eb4784f5..826728fa83d 100644 --- a/forge-gui/res/cardsfolder/w/wrath_of_marit_lage.txt +++ b/forge-gui/res/cardsfolder/w/wrath_of_marit_lage.txt @@ -5,6 +5,6 @@ S:Mode$ Continuous | Affected$ Creature.Red | AddHiddenKeyword$ CARDNAME doesn't T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTapAll | TriggerDescription$ When CARDNAME enters the battlefield, tap all red creatures. SVar:TrigTapAll:DB$TapAll | ValidCards$ Creature.Red SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/wrath_of_marit_lage.jpg Oracle:When Wrath of Marit Lage enters the battlefield, tap all red creatures.\nRed creatures don't untap during their controllers' untap steps. diff --git a/forge-gui/res/cardsfolder/w/wrens_run_packmaster.txt b/forge-gui/res/cardsfolder/w/wrens_run_packmaster.txt index 6f59be09733..862affa673b 100644 --- a/forge-gui/res/cardsfolder/w/wrens_run_packmaster.txt +++ b/forge-gui/res/cardsfolder/w/wrens_run_packmaster.txt @@ -5,6 +5,6 @@ PT:5/5 K:Champion:Elf S:Mode$ Continuous | Affected$ Permanent.Wolf+YouCtrl | AddKeyword$ Deathtouch | Description$ Wolves you control have deathtouch. A:AB$ Token | Cost$ 2 G | TokenAmount$ 1 | TokenName$ Wolf | TokenTypes$ Creature,Wolf | TokenOwner$ You | TokenColors$ Green | TokenPower$ 2 | TokenToughness$ 2 | SpellDescription$ Create a 2/2 green Wolf creature token. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/wrens_run_packmaster.jpg Oracle:Champion an Elf (When this creature enters the battlefield, sacrifice it unless you exile another Elf you control. When this creature leaves the battlefield, that card returns to the battlefield.)\n{2}{G}: Create a 2/2 green Wolf creature token.\nWolves you control have deathtouch. diff --git a/forge-gui/res/cardsfolder/w/writ_of_passage.txt b/forge-gui/res/cardsfolder/w/writ_of_passage.txt index 5c74a814d75..e4faee72f3b 100644 --- a/forge-gui/res/cardsfolder/w/writ_of_passage.txt +++ b/forge-gui/res/cardsfolder/w/writ_of_passage.txt @@ -7,6 +7,6 @@ T:Mode$ Attacks | ValidCard$ Card.AttachedBy | Execute$ TrigPump | TriggerZones$ SVar:TrigPump:DB$ Pump | Defined$ Enchanted | KW$ HIDDEN Unblockable A:AB$ Pump | Cost$ 1 U | TgtPrompt$ Choose target creature with power 2 or less | ValidTgts$ Creature.powerLE2 | KW$ HIDDEN Unblockable | ActivationZone$ Hand | ActivationLimit$ 1 | PlayerTurn$ True | ActivationPhases$ Upkeep | PrecostDesc$ Forecast — | CostDesc$ {1}{U}, Reveal CARDNAME from your hand: | SpellDescription$ Target creature with power 2 or less can't be blocked this turn. (Activate this ability only during your upkeep and only once each turn.) SVar:NonStackingAttachEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/writ_of_passage.jpg Oracle:Enchant creature\nWhenever enchanted creature attacks, if its power is 2 or less, it can't be blocked this turn.\nForecast — {1}{U}, Reveal Writ of Passage from your hand: Target creature with power 2 or less can't be blocked this turn. (Activate this ability only during your upkeep and only once each turn.) diff --git a/forge-gui/res/cardsfolder/w/wu_spy.txt b/forge-gui/res/cardsfolder/w/wu_spy.txt index 11018d56b5a..ee5e1153d68 100644 --- a/forge-gui/res/cardsfolder/w/wu_spy.txt +++ b/forge-gui/res/cardsfolder/w/wu_spy.txt @@ -4,6 +4,6 @@ Types:Creature Human Soldier Rogue PT:1/1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDig | TriggerDescription$ When CARDNAME enters the battlefield, look at the top two cards of target player's library. Put one of them into their graveyard. SVar:TrigDig:DB$Dig | ValidTgts$ Player | DestinationZone$ Graveyard | DigNum$ 2 | LibraryPosition2$ 0 -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/wu_spy.jpg Oracle:When Wu Spy enters the battlefield, look at the top two cards of target player's library. Put one of them into their graveyard. diff --git a/forge-gui/res/cardsfolder/w/wurms_tooth.txt b/forge-gui/res/cardsfolder/w/wurms_tooth.txt index 740a857ff1a..bb99dc7b128 100644 --- a/forge-gui/res/cardsfolder/w/wurms_tooth.txt +++ b/forge-gui/res/cardsfolder/w/wurms_tooth.txt @@ -3,7 +3,7 @@ ManaCost:2 Types:Artifact T:Mode$ SpellCast | ValidCard$ Card.Green | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever a player casts a green spell, you may gain 1 life. SVar:TrigGainLife:DB$GainLife | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Green SVar:Picture:http://www.wizards.com/global/images/magic/general/wurms_tooth.jpg Oracle:Whenever a player casts a green spell, you may gain 1 life. diff --git a/forge-gui/res/cardsfolder/x/xantcha.txt b/forge-gui/res/cardsfolder/x/xantcha.txt index 5e65605b5a7..9fde169b892 100644 --- a/forge-gui/res/cardsfolder/x/xantcha.txt +++ b/forge-gui/res/cardsfolder/x/xantcha.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Vanguard HandLifeModifier:+1/+3 A:AB$ Regenerate | ActivationZone$ Command | Cost$ Sac<1/Permanent> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Regenerate target creature. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:https://downloads.cardforge.org/images/cards/VAN/Xantcha.full.jpg Oracle:Hand +1, life +3\nSacrifice a permanent: Regenerate target creature. diff --git a/forge-gui/res/cardsfolder/x/xantid_swarm.txt b/forge-gui/res/cardsfolder/x/xantid_swarm.txt index f3b9f17f6e6..c0466ef809f 100644 --- a/forge-gui/res/cardsfolder/x/xantid_swarm.txt +++ b/forge-gui/res/cardsfolder/x/xantid_swarm.txt @@ -7,7 +7,7 @@ T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ Tr SVar:TrigEffect:DB$ Effect | Name$ Xantid Swarm Effect | RememberObjects$ DefendingPlayer | StaticAbilities$ CantBeCast | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:CantBeCast:Mode$ CantBeCast | EffectZone$ Command | ValidCard$ Card | Caster$ Player.IsRemembered | Description$ Defending player can't cast spells. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:HasAttackEffect:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/xantid_swarm.jpg Oracle:Flying\nWhenever Xantid Swarm attacks, defending player can't cast spells this turn. diff --git a/forge-gui/res/cardsfolder/x/xathrid_demon.txt b/forge-gui/res/cardsfolder/x/xathrid_demon.txt index aedf6ef368c..9533b37228f 100644 --- a/forge-gui/res/cardsfolder/x/xathrid_demon.txt +++ b/forge-gui/res/cardsfolder/x/xathrid_demon.txt @@ -14,6 +14,6 @@ SVar:X:RememberedLKI$CardPower SVar:Y:Remembered$Amount SVar:NeedsToPlayVar:Z GE6 SVar:Z:Count$Valid Creature.YouCtrl -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/xathrid_demon.jpg Oracle:Flying, trample\nAt the beginning of your upkeep, sacrifice a creature other than Xathrid Demon, then each opponent loses life equal to the sacrificed creature's power. If you can't sacrifice a creature, tap Xathrid Demon and you lose 7 life. diff --git a/forge-gui/res/cardsfolder/x/xathrid_slyblade.txt b/forge-gui/res/cardsfolder/x/xathrid_slyblade.txt index efe3bb05b94..59188b6c400 100644 --- a/forge-gui/res/cardsfolder/x/xathrid_slyblade.txt +++ b/forge-gui/res/cardsfolder/x/xathrid_slyblade.txt @@ -5,6 +5,6 @@ PT:2/1 K:Hexproof A:AB$ Debuff | Cost$ 3 B | Defined$ Self | Keywords$ Hexproof | SubAbility$ DBPump | SpellDescription$ Until end of turn, CARDNAME loses hexproof and gains first strike and deathtouch. SVar:DBPump:DB$ Pump | KW$ First Strike & Deathtouch | Defined$ Self -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/xathrid_slyblade.jpg Oracle:Hexproof (This creature can't be the target of spells or abilities your opponents control.)\n{3}{B}: Until end of turn, Xathrid Slyblade loses hexproof and gains first strike and deathtouch. (It deals combat damage before creatures without first strike. Any amount of damage it deals to a creature is enough to destroy it.) diff --git a/forge-gui/res/cardsfolder/x/xenagos_the_reveler.txt b/forge-gui/res/cardsfolder/x/xenagos_the_reveler.txt index fcad53c1e39..87917ef3937 100644 --- a/forge-gui/res/cardsfolder/x/xenagos_the_reveler.txt +++ b/forge-gui/res/cardsfolder/x/xenagos_the_reveler.txt @@ -9,6 +9,6 @@ A:AB$ Mill | Cost$ SubCounter<6/LOYALTY> | NumCards$ 7 | Destination$ Exile | Re SVar:DBChangeZone:DB$ ChangeZone | Origin$ Exile | Destination$ Battlefield | ChangeType$ Creature.IsRemembered,Land.IsRemembered | Hidden$ True | ChangeNum$ Y | References$ Y | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Y:Count$ValidExile Creature.IsRemembered,Land.IsRemembered -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/xenagos_the_reveler.jpg Oracle:[+1]: Add X mana in any combination of {R} and/or {G}, where X is the number of creatures you control.\n[0]: Create a 2/2 red and green Satyr creature token with haste.\n[-6]: Exile the top seven cards of your library. You may put any number of creature and/or land cards from among them onto the battlefield. diff --git a/forge-gui/res/cardsfolder/x/xenic_poltergeist.txt b/forge-gui/res/cardsfolder/x/xenic_poltergeist.txt index c2e50042f07..30d58e0f85b 100644 --- a/forge-gui/res/cardsfolder/x/xenic_poltergeist.txt +++ b/forge-gui/res/cardsfolder/x/xenic_poltergeist.txt @@ -4,6 +4,6 @@ Types:Creature Spirit PT:1/1 A:AB$ Animate | Cost$ T | ValidTgts$ Artifact.nonCreature | TgtPrompt$ Select target noncreature artifact | Power$ X | Toughness$ X | References$ X | Types$ Creature,Artifact | UntilYourNextUpkeep$ True | SpellDescription$ Until your next upkeep, target noncreature artifact becomes an artifact creature with power and toughness each equal to its converted mana cost. SVar:X:Targeted$CardManaCost -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/xenic_poltergeist.jpg Oracle:{T}: Until your next upkeep, target noncreature artifact becomes an artifact creature with power and toughness each equal to its converted mana cost. diff --git a/forge-gui/res/cardsfolder/x/xenograft.txt b/forge-gui/res/cardsfolder/x/xenograft.txt index 1dacda10bf0..a52d8e63b56 100644 --- a/forge-gui/res/cardsfolder/x/xenograft.txt +++ b/forge-gui/res/cardsfolder/x/xenograft.txt @@ -4,7 +4,7 @@ Types:Enchantment K:ETBReplacement:Other:ChooseCT SVar:ChooseCT:DB$ ChooseType | Defined$ You | Type$ Creature | SpellDescription$ As CARDNAME enters the battlefield, choose a creature type. S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddType$ ChosenType | Description$ Each creature you control is the chosen type in addition to its other types. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True +AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/xenograft.jpg Oracle:As Xenograft enters the battlefield, choose a creature type.\nEach creature you control is the chosen type in addition to its other types. diff --git a/forge-gui/res/cardsfolder/y/yare.txt b/forge-gui/res/cardsfolder/y/yare.txt index 49bd4cf9549..22465525609 100644 --- a/forge-gui/res/cardsfolder/y/yare.txt +++ b/forge-gui/res/cardsfolder/y/yare.txt @@ -2,6 +2,6 @@ Name:Yare ManaCost:2 W Types:Instant A:SP$ Pump | Cost$ 2 W | ValidTgts$ Creature.DefendingPlayerCtrl | TgtPrompt$ Select target creature defending player controls | NumAtt$ 3 | KW$ HIDDEN CARDNAME can block an additional creature each combat. & HIDDEN CARDNAME can block an additional creature each combat. | SpellDescription$ Target creature defending player controls gets +3/+0 until end of turn. That creature can block up to two additional creatures this turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/yare.jpg Oracle:Target creature defending player controls gets +3/+0 until end of turn. That creature can block up to two additional creatures this turn. diff --git a/forge-gui/res/cardsfolder/y/yawgmoth_demon.txt b/forge-gui/res/cardsfolder/y/yawgmoth_demon.txt index f85dae716de..e41e72109e6 100644 --- a/forge-gui/res/cardsfolder/y/yawgmoth_demon.txt +++ b/forge-gui/res/cardsfolder/y/yawgmoth_demon.txt @@ -11,6 +11,6 @@ SVar:DBElderSpawnDamage:DB$ DealDamage | Defined$ You | NumDmg$ 2 | ConditionDef SVar:DBElderSpawnCleanup:DB$ Cleanup | ClearRemembered$ True SVar:NeedsToPlayVar:Z GE3 SVar:Z:Count$Valid Artifact.YouCtrl+inZoneBattlefield -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/yawgmoth_demon.jpg Oracle:Flying, first strike\nAt the beginning of your upkeep, you may sacrifice an artifact. If you don't, tap Yawgmoth Demon and it deals 2 damage to you. diff --git a/forge-gui/res/cardsfolder/y/yawgmoths_agenda.txt b/forge-gui/res/cardsfolder/y/yawgmoths_agenda.txt index 0a3b8576927..010e6cfba3e 100644 --- a/forge-gui/res/cardsfolder/y/yawgmoths_agenda.txt +++ b/forge-gui/res/cardsfolder/y/yawgmoths_agenda.txt @@ -6,6 +6,6 @@ S:Mode$ Continuous | Affected$ Card.YouCtrl | AffectedZone$ Graveyard | MayPlay$ R:Event$ Moved | ActiveZones$ Battlefield | Destination$ Graveyard | ValidCard$ Card.nonToken+YouOwn | ReplaceWith$ Exile | Description$ If a card would be put into your graveyard from anywhere, exile it instead. SVar:Exile:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Exile | Defined$ ReplacedCard SVar:NonStackingEffect:True -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/yawgmoths_agenda.jpg Oracle:You can't cast more than one spell each turn.\nYou may play cards from your graveyard.\nIf a card would be put into your graveyard from anywhere, exile it instead. diff --git a/forge-gui/res/cardsfolder/y/yawgmoths_bargain.txt b/forge-gui/res/cardsfolder/y/yawgmoths_bargain.txt index 24586095e76..375af58b7b5 100644 --- a/forge-gui/res/cardsfolder/y/yawgmoths_bargain.txt +++ b/forge-gui/res/cardsfolder/y/yawgmoths_bargain.txt @@ -4,7 +4,7 @@ Types:Enchantment S:Mode$ Continuous | Affected$ You | AddKeyword$ Skip your draw step. | Description$ Skip your draw step. A:AB$ Draw | Cost$ PayLife<1> | NumCards$ 1 | AILogic$ YawgmothsBargain | AILifeThreshold$ 1 | SpellDescription$ Draw a card. SVar:AICastPreference:NeverCastIfLifeBelow$ 7 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/yawgmoths_bargain.jpg Oracle:Skip your draw step.\nPay 1 life: Draw a card. diff --git a/forge-gui/res/cardsfolder/y/yawgmoths_edict.txt b/forge-gui/res/cardsfolder/y/yawgmoths_edict.txt index 25d416d2a67..b67f764c85e 100644 --- a/forge-gui/res/cardsfolder/y/yawgmoths_edict.txt +++ b/forge-gui/res/cardsfolder/y/yawgmoths_edict.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ SpellCast | ValidCard$ Card.White | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDrain | TriggerDescription$ Whenever an opponent casts a white spell, that player loses 1 life and you gain 1 life. SVar:TrigDrain:DB$ LoseLife | Defined$ TriggeredActivator | LifeAmount$ 1 | SubAbility$ DBGainLife SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/yawgmoths_edict.jpg Oracle:Whenever an opponent casts a white spell, that player loses 1 life and you gain 1 life. diff --git a/forge-gui/res/cardsfolder/z/zealous_inquisitor.txt b/forge-gui/res/cardsfolder/z/zealous_inquisitor.txt index 6efab6a80ed..31a9cec7863 100644 --- a/forge-gui/res/cardsfolder/z/zealous_inquisitor.txt +++ b/forge-gui/res/cardsfolder/z/zealous_inquisitor.txt @@ -5,6 +5,6 @@ PT:2/2 A:AB$ Effect | Cost$ 1 W | ValidTgts$ Creature | TgtPrompt$ Select target creature to redirect the damage to | ReplacementEffects$ Zealous | SVars$ ZealousDmg | References$ Zealous,ZealousDmg | Duration$ HostLeavesOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SpellDescription$ The next 1 damage that would be dealt to CARDNAME this turn is dealt to target creature instead. SVar:Zealous:Event$ DamageDone | ValidTarget$ Creature.EffectSource | ReplaceWith$ ZealousDmg | DamageTarget$ Remembered | Description$ The next 1 damage that would be dealt to EFFECTSOURCE this turn is dealt to target creature instead. SVar:ZealousDmg:DB$ ReplaceSplitDamage | DamageTarget$ Remembered -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/zealous_inquisitor.jpg Oracle:{1}{W}: The next 1 damage that would be dealt to Zealous Inquisitor this turn is dealt to target creature instead. diff --git a/forge-gui/res/cardsfolder/z/zedruu_the_greathearted.txt b/forge-gui/res/cardsfolder/z/zedruu_the_greathearted.txt index ec371766012..aa13087c1ad 100644 --- a/forge-gui/res/cardsfolder/z/zedruu_the_greathearted.txt +++ b/forge-gui/res/cardsfolder/z/zedruu_the_greathearted.txt @@ -11,6 +11,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E SVar:GainLife:DB$ GainLife | LifeAmount$ X | References$ X | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | NumCards$ X | References$ X SVar:X:Count$Valid Permanent.YouOwn+OwnerDoesntControl -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/zedruu_the_greathearted.jpg Oracle:At the beginning of your upkeep, you gain X life and draw X cards, where X is the number of permanents you own that your opponents control.\n{U}{R}{W}: Target opponent gains control of target permanent you control. diff --git a/forge-gui/res/cardsfolder/z/zephyr_scribe.txt b/forge-gui/res/cardsfolder/z/zephyr_scribe.txt index f50139a5ce1..a4debbd4f2f 100644 --- a/forge-gui/res/cardsfolder/z/zephyr_scribe.txt +++ b/forge-gui/res/cardsfolder/z/zephyr_scribe.txt @@ -7,6 +7,6 @@ SVar:DBDiscard:DB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 T:Mode$ SpellCast | ValidCard$ Card.nonCreature | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigUntap | TriggerDescription$ Whenever you cast a noncreature spell, untap CARDNAME. SVar:TrigUntap:DB$ Untap | Defined$ Self SVar:BuffedBy:Card.nonLand+nonCreature -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/zephyr_scribe.jpg Oracle:{U}, {T}: Draw a card, then discard a card.\nWhenever you cast a noncreature spell, untap Zephyr Scribe. diff --git a/forge-gui/res/cardsfolder/z/zhalfirin_crusader.txt b/forge-gui/res/cardsfolder/z/zhalfirin_crusader.txt index 4034896d8b3..848cde078b5 100644 --- a/forge-gui/res/cardsfolder/z/zhalfirin_crusader.txt +++ b/forge-gui/res/cardsfolder/z/zhalfirin_crusader.txt @@ -6,6 +6,6 @@ K:Flanking A:AB$ Effect | Cost$ 1 W | Name$ Zhalfirin Redirection | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target to redirect the damage to | ReplacementEffects$ Zhalfirin | SVars$ ZhalfirinDmg | References$ Zhalfirin,ZhalfirinDmg | Duration$ HostLeavesOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SpellDescription$ The next 1 damage that would be dealt to CARDNAME this turn is dealt to any target instead. SVar:Zhalfirin:Event$ DamageDone | ValidTarget$ Creature.EffectSource | ReplaceWith$ ZhalfirinDmg | DamageTarget$ Remembered | Description$ The next 1 damage that would be dealt to EFFECTSOURCE this turn is dealt to any target. SVar:ZhalfirinDmg:DB$ ReplaceSplitDamage | DamageTarget$ Remembered -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/zhalfirin_crusader.jpg Oracle:Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.)\n{1}{W}: The next 1 damage that would be dealt to Zhalfirin Crusader this turn is dealt to any target instead. diff --git a/forge-gui/res/cardsfolder/z/zo_zu_the_punisher.txt b/forge-gui/res/cardsfolder/z/zo_zu_the_punisher.txt index ffdaca1be6f..4cf41cbd87d 100644 --- a/forge-gui/res/cardsfolder/z/zo_zu_the_punisher.txt +++ b/forge-gui/res/cardsfolder/z/zo_zu_the_punisher.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Goblin Warrior PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a land enters the battlefield, CARDNAME deals 2 damage to that land's controller. SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredCardController | NumDmg$ 2 -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/zo_zu_the_punisher.jpg Oracle:Whenever a land enters the battlefield, Zo-Zu the Punisher deals 2 damage to that land's controller. diff --git a/forge-gui/res/cardsfolder/z/zombie_apocalypse.txt b/forge-gui/res/cardsfolder/z/zombie_apocalypse.txt index 74b13cc0400..abe0acbfab3 100644 --- a/forge-gui/res/cardsfolder/z/zombie_apocalypse.txt +++ b/forge-gui/res/cardsfolder/z/zombie_apocalypse.txt @@ -3,6 +3,6 @@ ManaCost:3 B B B Types:Sorcery A:SP$ ChangeZoneAll | Cost$ 3 B B B | SubAbility$ DBDestroy | ChangeType$ Creature.Zombie+YouCtrl | Tapped$ True | Origin$ Graveyard | Destination$ Battlefield | SpellDescription$ Return all Zombie creature cards from your graveyard to the battlefield tapped, then destroy all Humans. SVar:DBDestroy:DB$DestroyAll | ValidCards$ Human -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/zombie_apocalypse.jpg Oracle:Return all Zombie creature cards from your graveyard to the battlefield tapped, then destroy all Humans. diff --git a/forge-gui/res/cardsfolder/z/zombie_boa.txt b/forge-gui/res/cardsfolder/z/zombie_boa.txt index b9fd52c64d3..6b30dd88de7 100644 --- a/forge-gui/res/cardsfolder/z/zombie_boa.txt +++ b/forge-gui/res/cardsfolder/z/zombie_boa.txt @@ -6,6 +6,6 @@ A:AB$ ChooseColor | Cost$ 1 B | Defined$ You | AILogic$ MostProminentInHumanDeck SVar:DBEffect:DB$ Effect | Name$ Zombie Boa Effect | Triggers$ TrigBlocked | SVars$ ABDestroy | References$ TrigBlocked,ABDestroy | RememberObjects$ Self SVar:TrigBlocked:Mode$ AttackerBlockedByCreature | ValidCard$ Creature.IsRemembered | ValidBlocker$ Creature.ChosenColor | Execute$ ABDestroy | TriggerDescription$ Whenever Zombie Boa becomes blocked by a creature of the chosen color this turn, destroy that creature. SVar:ABDestroy:DB$ Destroy | Defined$ TriggeredBlocker -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/zombie_boa.jpg Oracle:{1}{B}: Choose a color. Whenever Zombie Boa becomes blocked by a creature of that color this turn, destroy that creature. Activate this ability only any time you could cast a sorcery. diff --git a/forge-gui/res/cardsfolder/z/zombie_infestation.txt b/forge-gui/res/cardsfolder/z/zombie_infestation.txt index 8bd8816c9d5..c251b9226e0 100644 --- a/forge-gui/res/cardsfolder/z/zombie_infestation.txt +++ b/forge-gui/res/cardsfolder/z/zombie_infestation.txt @@ -2,6 +2,6 @@ Name:Zombie Infestation ManaCost:1 B Types:Enchantment A:AB$ Token | Cost$ Discard<2/Card> | TokenImage$ b 2 2 zombie | TokenAmount$ 1 | TokenName$ Zombie | TokenTypes$ Creature,Zombie | TokenOwner$ You | TokenColors$ Black | TokenPower$ 2 | TokenToughness$ 2 | SpellDescription$ Create a 2/2 black Zombie creature token. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/zombie_infestation.jpg Oracle:Discard two cards: Create a 2/2 black Zombie creature token. diff --git a/forge-gui/res/cardsfolder/z/zombie_musher.txt b/forge-gui/res/cardsfolder/z/zombie_musher.txt index e9e8c3e0e6f..4fae16c79e0 100644 --- a/forge-gui/res/cardsfolder/z/zombie_musher.txt +++ b/forge-gui/res/cardsfolder/z/zombie_musher.txt @@ -5,6 +5,6 @@ PT:2/3 K:Snow landwalk A:AB$ Regenerate | Cost$ S | SpellDescription$ Regenerate CARDNAME. # AI can now use snow mana to pay for activated abilities. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/zombie_musher.jpg Oracle:Snow landwalk\n{S}: Regenerate Zombie Musher. ({S} can be paid with one mana from a snow permanent.) diff --git a/forge-gui/res/cardsfolder/z/zombie_trailblazer.txt b/forge-gui/res/cardsfolder/z/zombie_trailblazer.txt index 021324dac57..556350188a3 100644 --- a/forge-gui/res/cardsfolder/z/zombie_trailblazer.txt +++ b/forge-gui/res/cardsfolder/z/zombie_trailblazer.txt @@ -4,6 +4,6 @@ Types:Creature Zombie Scout PT:2/2 A:AB$ Animate | Cost$ tapXType<1/Zombie> | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Swamp | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True | SpellDescription$ Target land becomes a Swamp until end of turn. A:AB$ Pump | Cost$ tapXType<1/Zombie> | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Swampwalk | SpellDescription$ Target creature gains swampwalk until end of turn. -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/zombie_trailblazer.jpg Oracle:Tap an untapped Zombie you control: Target land becomes a Swamp until end of turn.\nTap an untapped Zombie you control: Target creature gains swampwalk until end of turn. (It can't be blocked as long as defending player controls a Swamp.) diff --git a/forge-gui/res/cardsfolder/z/zuran_enchanter.txt b/forge-gui/res/cardsfolder/z/zuran_enchanter.txt index 3fb58a5e839..4a201f5ee3d 100644 --- a/forge-gui/res/cardsfolder/z/zuran_enchanter.txt +++ b/forge-gui/res/cardsfolder/z/zuran_enchanter.txt @@ -3,7 +3,7 @@ ManaCost:1 U Types:Creature Human Wizard PT:1/1 A:AB$ Discard | Cost$ 2 B T | ValidTgts$ Player | PlayerTurn$ True | NumCards$ 1 | Mode$ TgtChoose | SpellDescription$ Target player discards a card. Activate this ability only during your turn. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black SVar:Picture:http://www.wizards.com/global/images/magic/general/zuran_enchanter.jpg Oracle:{2}{B}, {T}: Target player discards a card. Activate this ability only during your turn. diff --git a/forge-gui/res/cardsfolder/z/zurs_weirding.txt b/forge-gui/res/cardsfolder/z/zurs_weirding.txt index 5b7e2b32175..b6b4041149d 100644 --- a/forge-gui/res/cardsfolder/z/zurs_weirding.txt +++ b/forge-gui/res/cardsfolder/z/zurs_weirding.txt @@ -10,7 +10,7 @@ SVar:DBDraw:DB$ Draw | Defined$ ReplacedPlayer | NumCards$ 1 | SubAbility$ DBRes SVar:DBReset:DB$ StoreSVar | SVar$ ZurCheck | Type$ Number | Expression$ 0 SVar:ZurCheck:Number$0 SVar:NonStackingEffect:True -SVar:RemAIDeck:True +AI:RemoveDeck:All SVar:RemMultiplayer:True SVar:Picture:http://www.wizards.com/global/images/magic/general/zurs_weirding.jpg Oracle:Players play with their hands revealed.\nIf a player would draw a card, they reveal it instead. Then any other player may pay 2 life. If a player does, put that card into its owner's graveyard. Otherwise, that player draws a card. From 42c3fd09db29da230977fef14ce8f4dc39c95399 Mon Sep 17 00:00:00 2001 From: swordshine Date: Thu, 18 Oct 2018 10:57:00 +0800 Subject: [PATCH 061/901] Fixed Sentinel Tower --- forge-gui/res/cardsfolder/s/sentinel_tower.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/s/sentinel_tower.txt b/forge-gui/res/cardsfolder/s/sentinel_tower.txt index 50f305c32d6..d3cdad16182 100644 --- a/forge-gui/res/cardsfolder/s/sentinel_tower.txt +++ b/forge-gui/res/cardsfolder/s/sentinel_tower.txt @@ -1,7 +1,7 @@ Name:Sentinel Tower ManaCost:4 Types:Artifact -T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | Execute$ TrigDmg | TriggerZones$ Battlefield | TriggerDescription$ Whenever an instant or sorcery spell is cast during your turn, CARDNAME deals damage to any target equal to 1 plus the number of instant and sorcery spells cast before that spell this turn. +T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | Execute$ TrigDmg | PlayerTurn$ True | TriggerZones$ Battlefield | TriggerDescription$ Whenever an instant or sorcery spell is cast during your turn, CARDNAME deals damage to any target equal to 1 plus the number of instant and sorcery spells cast before that spell this turn. SVar:TrigDmg:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X SVar:X:TriggerObjectsCurrentCastSpells$Valid Sorcery,Instant Oracle:Whenever an instant or sorcery spell is cast during your turn, Sentinel Tower deals damage to any target equal to 1 plus the number of instant and sorcery spells cast before that spell this turn. From 8e018f9c51fffdab11e5fdeb69600102dfbcf286 Mon Sep 17 00:00:00 2001 From: swordshine Date: Thu, 18 Oct 2018 12:15:44 +0800 Subject: [PATCH 062/901] - Fixed Blood Operative --- forge-gui/res/cardsfolder/b/blood_operative.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/b/blood_operative.txt b/forge-gui/res/cardsfolder/b/blood_operative.txt index b2761115dc7..f883882404d 100644 --- a/forge-gui/res/cardsfolder/b/blood_operative.txt +++ b/forge-gui/res/cardsfolder/b/blood_operative.txt @@ -3,7 +3,7 @@ ManaCost:1 B B Types:Creature Vampire Assassin PT:3/1 K:Lifelink -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, you may exile target card from a graveyard. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may exile target card from a graveyard. SVar:TrigChangeZone:DB$ChangeZone | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Card | TgtPrompt$ Select target card in a graveyard T:Mode$ Surveil | ValidPlayer$ You | Execute$ TrigReturn | TriggerZones$ Graveyard | IsPresent$ Card.StrictlySelf | PresentZone$ Graveyard | PresentPlayer$ You | TriggerDescription$ Whenever you surveil, if CARDNAME is in your graveyard, you may pay 3 life. If you do, return CARDNAME to your hand. SVar:TrigReturn:AB$ChangeZone | Cost$ PayLife<3> | Defined$ Self | Origin$ Graveyard | Destination$ Hand From fda3e81d9a0459a5b73b574b82420e1ca7ae7630 Mon Sep 17 00:00:00 2001 From: "Jamin W. Collins" Date: Thu, 18 Oct 2018 17:56:21 -0600 Subject: [PATCH 063/901] ignore deck lines that start with // Signed-off-by: Jamin W. Collins --- forge-gui/src/main/java/forge/deck/DeckImportController.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/forge-gui/src/main/java/forge/deck/DeckImportController.java b/forge-gui/src/main/java/forge/deck/DeckImportController.java index 217115efe5a..d1952f15260 100644 --- a/forge-gui/src/main/java/forge/deck/DeckImportController.java +++ b/forge-gui/src/main/java/forge/deck/DeckImportController.java @@ -78,6 +78,9 @@ public class DeckImportController { final DeckRecognizer.TokenType type = t.getType(); if (type == DeckRecognizer.TokenType.SectionName) { section = t.getText().toLowerCase(); + if (section.startsWith("//")) { + continue; + } // can't use wildcards in switch/case, so if/else it is if (section.startsWith("main")) { deckSection = DeckSection.Main; From 2e81a939b9aa4ddf66925c20a8ba18f1586b6fc9 Mon Sep 17 00:00:00 2001 From: "Jamin W. Collins" Date: Thu, 18 Oct 2018 18:11:45 -0600 Subject: [PATCH 064/901] fix deck import exception message Signed-off-by: Jamin W. Collins --- forge-gui/src/main/java/forge/deck/DeckImportController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/src/main/java/forge/deck/DeckImportController.java b/forge-gui/src/main/java/forge/deck/DeckImportController.java index d1952f15260..d8182d211d0 100644 --- a/forge-gui/src/main/java/forge/deck/DeckImportController.java +++ b/forge-gui/src/main/java/forge/deck/DeckImportController.java @@ -104,7 +104,7 @@ public class DeckImportController { deckSection = DeckSection.Conspiracy; } else { - throw new NotImplementedException("Unexpected section: %s", t.getText()); + throw new NotImplementedException("Unexpected section: " + t.getText()); } } if (type != DeckRecognizer.TokenType.KnownCard) { From 4b52ff05d57ad2a49f0158f46e16ab4acfeb1bea Mon Sep 17 00:00:00 2001 From: Michael Kamensky Date: Fri, 19 Oct 2018 12:13:31 +0000 Subject: [PATCH 065/901] Update direct references to RemAIDeck/RemRandomDeck to use the new format --- forge-ai/src/main/java/forge/ai/AiCostDecision.java | 2 +- forge-ai/src/main/java/forge/ai/ability/AnimateAi.java | 2 +- .../src/main/java/forge/ai/ability/ChangeZoneAi.java | 2 +- .../src/main/java/forge/ai/ability/ChangeZoneAllAi.java | 6 +++--- forge-ai/src/main/java/forge/ai/ability/CloneAi.java | 7 +++---- .../main/java/forge/ai/ability/ControlExchangeAi.java | 2 +- .../src/main/java/forge/ai/ability/ControlGainAi.java | 2 +- .../src/main/java/forge/ai/ability/CopyPermanentAi.java | 2 +- .../src/main/java/forge/ai/ability/PowerExchangeAi.java | 3 +-- forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java | 2 +- .../src/main/java/forge/game/card/CardPredicates.java | 9 +++++++++ forge-gui/res/cardsfolder/b/blood_operative.txt | 2 +- forge-gui/res/cardsfolder/s/sentinel_tower.txt | 2 +- .../src/main/java/forge/deck/DeckImportController.java | 5 ++++- 14 files changed, 29 insertions(+), 19 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiCostDecision.java b/forge-ai/src/main/java/forge/ai/AiCostDecision.java index fe715d5ab2f..b923b38707a 100644 --- a/forge-ai/src/main/java/forge/ai/AiCostDecision.java +++ b/forge-ai/src/main/java/forge/ai/AiCostDecision.java @@ -528,7 +528,7 @@ public class AiCostDecision extends CostDecisionMakerBase { // are currently conventionally flagged with AILogic$ DoSacrifice. c = AbilityUtils.calculateAmount(source, source.getSVar("ChosenX"), null); } else { - // Other cards are assumed to be flagged RemAIDeck for now + // Other cards are assumed to be flagged AI:RemoveDeck:All for now return null; } } else { 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 76fdbbd3d0d..f9c49986042 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java @@ -342,7 +342,7 @@ public class AnimateAi extends SpellAbilityAi { // This is reasonable for now. Kamahl, Fist of Krosa and a sorcery or // two are the only things - // that animate a target. Those can just use SVar:RemAIDeck:True until + // that animate a target. Those can just use AI:RemoveDeck:All until // this can do a reasonably // good job of picking a good target 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 ab2ef609098..04e7cc793b4 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -1459,7 +1459,7 @@ public class ChangeZoneAi extends SpellAbilityAi { fetchList = CardLists.filter(fetchList, new Predicate() { @Override public boolean apply(final Card c) { - if (c.hasSVar("RemAIDeck") || c.hasSVar("RemRandomDeck")) { + if (c.getRules().getAiHints().getRemAIDecks() || c.getRules().getAiHints().getRemRandomDecks()) { return false; } return true; diff --git a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java index ad5de0b33b1..84f81600df8 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java @@ -114,7 +114,7 @@ public class ChangeZoneAllAi extends SpellAbilityAi { // spBounceAll has some AI we can compare to. if (origin.equals(ZoneType.Hand) || origin.equals(ZoneType.Library)) { if (!sa.usesTargeting()) { - // TODO: improve logic for non-targeted SAs of this type (most are currently RemAIDeck, e.g. Memory Jar) + // TODO: improve logic for non-targeted SAs of this type (most are currently AI:RemoveDeck:All, e.g. Memory Jar) return true; } else { // search targetable Opponents @@ -344,8 +344,8 @@ public class ChangeZoneAllAi extends SpellAbilityAi { if (ComputerUtilAbility.getAbilitySourceName(sa).equals("Profaner of the Dead")) { // TODO: this is a stub to prevent the AI from crashing the game when, for instance, playing the opponent's - // Profaner from exile without paying its mana cost. Otherwise the card is marked RemAIDeck and there is no - // specific AI to support playing it in a smarter way. Feel free to expand. + // Profaner from exile without paying its mana cost. Otherwise the card is marked AI:RemoveDeck:All and + // there is no specific AI to support playing it in a smarter way. Feel free to expand. return !CardLists.filter(ai.getOpponents().getCardsIn(origin), CardPredicates.Presets.CREATURES).isEmpty(); } diff --git a/forge-ai/src/main/java/forge/ai/ability/CloneAi.java b/forge-ai/src/main/java/forge/ai/ability/CloneAi.java index 8479bde2c85..9fae432551b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CloneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CloneAi.java @@ -146,10 +146,9 @@ public class CloneAi extends SpellAbilityAi { // Default: // This is reasonable for now. Kamahl, Fist of Krosa and a sorcery or - // two are the only things - // that clone a target. Those can just use SVar:RemAIDeck:True until - // this can do a reasonably - // good job of picking a good target + // two are the only things that clone a target. Those can just use + // AI:RemoveDeck:All until this can do a reasonably good job of picking + // a good target return false; } 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 8f38b905c4c..f002fca63c3 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java @@ -36,7 +36,7 @@ public class ControlExchangeAi extends SpellAbilityAi { list = CardLists.filter(list, new Predicate() { @Override public boolean apply(final Card c) { - return !c.hasSVar("RemAIDeck") && c.canBeTargetedBy(sa); + return !c.getRules().getAiHints().getRemAIDecks() && c.canBeTargetedBy(sa); } }); object1 = ComputerUtilCard.getBestAI(list); diff --git a/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java b/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java index 50bdc533844..a6631ad51bb 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java @@ -171,7 +171,7 @@ public class ControlGainAi extends SpellAbilityAi { } // do not take control on something it doesn't know how to use - return !c.hasSVar("RemAIDeck"); + return !c.getRules().getAiHints().getRemAIDecks(); } }); diff --git a/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java b/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java index a630836d38e..f543b662b3e 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java @@ -83,7 +83,7 @@ public class CopyPermanentAi extends SpellAbilityAi { CardCollection list = new CardCollection(CardUtil.getValidCardsToTarget(sa.getTargetRestrictions(), sa)); - list = CardLists.filter(list, Predicates.not(CardPredicates.hasSVar("RemAIDeck"))); + list = CardLists.filter(list, Predicates.not(CardPredicates.isRemAIDeck())); //Nothing to target 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 dc6deb4ae86..2e24354ca26 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java @@ -38,8 +38,7 @@ public class PowerExchangeAi extends SpellAbilityAi { list = CardLists.filter(list, new Predicate() { @Override public boolean apply(final Card c) { - final Map vars = c.getSVars(); - return !vars.containsKey("RemAIDeck") && c.canBeTargetedBy(sa); + return !c.getRules().getAiHints().getRemAIDecks() && c.canBeTargetedBy(sa); } }); CardLists.sortByPowerAsc(list); 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 b66785bc0ee..4cef29c7ef5 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java @@ -133,7 +133,7 @@ public class SacrificeAi extends SpellAbilityAi { List humanList = CardLists.getValidCards(opp.getCardsIn(ZoneType.Battlefield), valid.split(","), sa.getActivatingPlayer(), sa.getHostCard(), sa); - // Since all of the cards have remAIDeck:True, I enabled 1 for 1 + // Since all of the cards have AI:RemoveDeck:All, I enabled 1 for 1 // (or X for X) trades for special decks if (humanList.size() < amount) { return false; diff --git a/forge-game/src/main/java/forge/game/card/CardPredicates.java b/forge-game/src/main/java/forge/game/card/CardPredicates.java index b30734de635..4809a42da8d 100644 --- a/forge-game/src/main/java/forge/game/card/CardPredicates.java +++ b/forge-game/src/main/java/forge/game/card/CardPredicates.java @@ -413,6 +413,15 @@ public final class CardPredicates { }; } + public static final Predicate isRemAIDeck() { + return new Predicate() { + @Override + public boolean apply(final Card c) { + return c.getRules().getAiHints().getRemAIDecks(); + } + }; + } + public static class Presets { /** diff --git a/forge-gui/res/cardsfolder/b/blood_operative.txt b/forge-gui/res/cardsfolder/b/blood_operative.txt index b2761115dc7..f883882404d 100644 --- a/forge-gui/res/cardsfolder/b/blood_operative.txt +++ b/forge-gui/res/cardsfolder/b/blood_operative.txt @@ -3,7 +3,7 @@ ManaCost:1 B B Types:Creature Vampire Assassin PT:3/1 K:Lifelink -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, you may exile target card from a graveyard. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may exile target card from a graveyard. SVar:TrigChangeZone:DB$ChangeZone | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Card | TgtPrompt$ Select target card in a graveyard T:Mode$ Surveil | ValidPlayer$ You | Execute$ TrigReturn | TriggerZones$ Graveyard | IsPresent$ Card.StrictlySelf | PresentZone$ Graveyard | PresentPlayer$ You | TriggerDescription$ Whenever you surveil, if CARDNAME is in your graveyard, you may pay 3 life. If you do, return CARDNAME to your hand. SVar:TrigReturn:AB$ChangeZone | Cost$ PayLife<3> | Defined$ Self | Origin$ Graveyard | Destination$ Hand diff --git a/forge-gui/res/cardsfolder/s/sentinel_tower.txt b/forge-gui/res/cardsfolder/s/sentinel_tower.txt index 50f305c32d6..d3cdad16182 100644 --- a/forge-gui/res/cardsfolder/s/sentinel_tower.txt +++ b/forge-gui/res/cardsfolder/s/sentinel_tower.txt @@ -1,7 +1,7 @@ Name:Sentinel Tower ManaCost:4 Types:Artifact -T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | Execute$ TrigDmg | TriggerZones$ Battlefield | TriggerDescription$ Whenever an instant or sorcery spell is cast during your turn, CARDNAME deals damage to any target equal to 1 plus the number of instant and sorcery spells cast before that spell this turn. +T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | Execute$ TrigDmg | PlayerTurn$ True | TriggerZones$ Battlefield | TriggerDescription$ Whenever an instant or sorcery spell is cast during your turn, CARDNAME deals damage to any target equal to 1 plus the number of instant and sorcery spells cast before that spell this turn. SVar:TrigDmg:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X SVar:X:TriggerObjectsCurrentCastSpells$Valid Sorcery,Instant Oracle:Whenever an instant or sorcery spell is cast during your turn, Sentinel Tower deals damage to any target equal to 1 plus the number of instant and sorcery spells cast before that spell this turn. diff --git a/forge-gui/src/main/java/forge/deck/DeckImportController.java b/forge-gui/src/main/java/forge/deck/DeckImportController.java index 217115efe5a..d8182d211d0 100644 --- a/forge-gui/src/main/java/forge/deck/DeckImportController.java +++ b/forge-gui/src/main/java/forge/deck/DeckImportController.java @@ -78,6 +78,9 @@ public class DeckImportController { final DeckRecognizer.TokenType type = t.getType(); if (type == DeckRecognizer.TokenType.SectionName) { section = t.getText().toLowerCase(); + if (section.startsWith("//")) { + continue; + } // can't use wildcards in switch/case, so if/else it is if (section.startsWith("main")) { deckSection = DeckSection.Main; @@ -101,7 +104,7 @@ public class DeckImportController { deckSection = DeckSection.Conspiracy; } else { - throw new NotImplementedException("Unexpected section: %s", t.getText()); + throw new NotImplementedException("Unexpected section: " + t.getText()); } } if (type != DeckRecognizer.TokenType.KnownCard) { From 79f580d55a4f7d07e5d08cdfe81dc684fa3c2bb5 Mon Sep 17 00:00:00 2001 From: Sol Date: Fri, 19 Oct 2018 13:37:29 +0000 Subject: [PATCH 066/901] Update PowerExchangeAi.java --- forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java | 1 - 1 file changed, 1 deletion(-) 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 2e24354ca26..028e234f365 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java @@ -17,7 +17,6 @@ import forge.util.MyRandom; import java.util.Collections; import java.util.List; -import java.util.Map; public class PowerExchangeAi extends SpellAbilityAi { From 4c2c1ec86a6499fc4479d8574d40bc0d12bafb78 Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Fri, 19 Oct 2018 22:25:51 +0000 Subject: [PATCH 067/901] historic DCI sanctioned formats M19-GRN. --- forge-gui/res/formats/Historic/DCI/Legacy/2018-07-06.txt | 7 +++++++ forge-gui/res/formats/Historic/DCI/Legacy/2018-07-14.txt | 7 +++++++ forge-gui/res/formats/Historic/DCI/Legacy/2018-10-06.txt | 7 +++++++ forge-gui/res/formats/Historic/DCI/Modern/2018-07-14.txt | 7 +++++++ forge-gui/res/formats/Historic/DCI/Modern/2018-10-06.txt | 7 +++++++ .../res/formats/Historic/DCI/Standard/2018-07-14.txt | 7 +++++++ .../res/formats/Historic/DCI/Standard/2018-10-06.txt | 7 +++++++ forge-gui/res/formats/Historic/DCI/Vintage/2018-07-14.txt | 8 ++++++++ forge-gui/res/formats/Historic/DCI/Vintage/2018-10-06.txt | 8 ++++++++ 9 files changed, 65 insertions(+) create mode 100644 forge-gui/res/formats/Historic/DCI/Legacy/2018-07-06.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Legacy/2018-07-14.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Legacy/2018-10-06.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Modern/2018-07-14.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Modern/2018-10-06.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Standard/2018-07-14.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Standard/2018-10-06.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Vintage/2018-07-14.txt create mode 100644 forge-gui/res/formats/Historic/DCI/Vintage/2018-10-06.txt 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 new file mode 100644 index 00000000000..01766a2b756 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-06.txt @@ -0,0 +1,7 @@ +[format] +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 +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 new file mode 100644 index 00000000000..7e2e6603f0d --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-14.txt @@ -0,0 +1,7 @@ +[format] +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 +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 new file mode 100644 index 00000000000..551753dca8a --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2018-10-06.txt @@ -0,0 +1,7 @@ +[format] +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 +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/Modern/2018-07-14.txt b/forge-gui/res/formats/Historic/DCI/Modern/2018-07-14.txt new file mode 100644 index 00000000000..46c93c8216b --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Modern/2018-07-14.txt @@ -0,0 +1,7 @@ +[format] +Name:Modern, Core Set 2019 +Type:Historic +Subtype:Modern +Effective:2018-07-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 +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/2018-10-06.txt b/forge-gui/res/formats/Historic/DCI/Modern/2018-10-06.txt new file mode 100644 index 00000000000..655edb25cf7 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Modern/2018-10-06.txt @@ -0,0 +1,7 @@ +[format] +Name:Modern, Guilds of Ravnica +Type:Historic +Subtype:Modern +Effective:2018-10-06 +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 +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/Standard/2018-07-14.txt b/forge-gui/res/formats/Historic/DCI/Standard/2018-07-14.txt new file mode 100644 index 00000000000..1fa39763228 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/2018-07-14.txt @@ -0,0 +1,7 @@ +[format] +Name:Standard, Core Set 2019 +Type:Historic +Subtype:Standard +Effective:2018-04-27 +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-10-06.txt b/forge-gui/res/formats/Historic/DCI/Standard/2018-10-06.txt new file mode 100644 index 00000000000..b46d23c5530 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/2018-10-06.txt @@ -0,0 +1,7 @@ +[format] +Name:Standard, Guilds of Ravnica +Type:Historic +Subtype:Standard +Effective:2018-10-06 +Sets:XLN, RIX, DOM, M19, GRN +Banned:Rampaging Ferocidon \ 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 new file mode 100644 index 00000000000..983de9d0a19 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2018-07-14.txt @@ -0,0 +1,8 @@ +[format] +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 +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 new file mode 100644 index 00000000000..f4baed68ee0 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2018-10-06.txt @@ -0,0 +1,8 @@ +[format] +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 +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 e403c9d76484c16e2075c5b7e0657020f9216f7a Mon Sep 17 00:00:00 2001 From: Chris H Date: Fri, 19 Oct 2018 21:48:16 -0400 Subject: [PATCH 068/901] Clear the new column after a quest starts. --- forge-gui/src/main/java/forge/quest/QuestController.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/forge-gui/src/main/java/forge/quest/QuestController.java b/forge-gui/src/main/java/forge/quest/QuestController.java index 0b15c20ccb1..0d306f4431a 100644 --- a/forge-gui/src/main/java/forge/quest/QuestController.java +++ b/forge-gui/src/main/java/forge/quest/QuestController.java @@ -288,6 +288,8 @@ public class QuestController { this.getAssets().setCredits(FModel.getQuestPreferences().getPrefInt(DifficultyPrefs.STARTING_CREDITS, difficulty)); + // Reset starting cards here. + this.myCards.resetNewList(); } /** From ff4622954f6698c8312597f986d033ba5a008dce Mon Sep 17 00:00:00 2001 From: Chris H Date: Sat, 20 Oct 2018 22:07:57 -0400 Subject: [PATCH 069/901] Fix NPEs reported by Sentry --- .../src/main/java/forge/ai/ability/ChangeZoneAi.java | 4 ++++ forge-game/src/main/java/forge/game/GameView.java | 9 +++++---- 2 files changed, 9 insertions(+), 4 deletions(-) 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 04e7cc793b4..47c408d8c79 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -251,6 +251,10 @@ public class ChangeZoneAi extends SpellAbilityAi { if (ai.getGame().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DAMAGE)) { return false; } + + if (ai.getGame().getCombat() == null) { + return false; + } List attackers = ai.getGame().getCombat().getUnblockedAttackers(); boolean lowerCMC = false; for (Card attacker : attackers) { diff --git a/forge-game/src/main/java/forge/game/GameView.java b/forge-game/src/main/java/forge/game/GameView.java index 2e272988890..0aad79f5cba 100644 --- a/forge-game/src/main/java/forge/game/GameView.java +++ b/forge-game/src/main/java/forge/game/GameView.java @@ -1,9 +1,6 @@ package forge.game; -import java.util.List; - import com.google.common.collect.Iterables; - import forge.LobbyPlayer; import forge.deck.Deck; import forge.game.GameOutcome.AnteResult; @@ -22,6 +19,8 @@ import forge.trackable.TrackableObject; import forge.trackable.TrackableProperty; import forge.util.collect.FCollectionView; +import java.util.List; + public class GameView extends TrackableObject { private static final long serialVersionUID = 8522884512960961528L; @@ -127,7 +126,9 @@ public class GameView extends TrackableObject { void updateGameOver(final Game game) { set(TrackableProperty.GameOver, game.isGameOver()); set(TrackableProperty.MatchOver, game.getMatch().isMatchOver()); - set(TrackableProperty.WinningPlayerName, game.getOutcome().getWinningLobbyPlayer().getName()); + if (game.getOutcome() != null && game.getOutcome().getWinningLobbyPlayer() != null) { + set(TrackableProperty.WinningPlayerName, game.getOutcome().getWinningLobbyPlayer().getName()); + } set(TrackableProperty.WinningTeam, game.getOutcome() == null ? -1 : game.getOutcome().getWinningTeam()); } From df52202f6512ad4bc719f1d4540a9425b868cdce Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Sun, 21 Oct 2018 18:21:23 +0000 Subject: [PATCH 070/901] Update Type, Default, and add a PW Deck style sort --- .../main/java/forge/itemmanager/GroupDef.java | 69 ++++++++++++++----- .../forge/itemmanager/SItemManagerUtil.java | 2 +- 2 files changed, 52 insertions(+), 19 deletions(-) diff --git a/forge-gui/src/main/java/forge/itemmanager/GroupDef.java b/forge-gui/src/main/java/forge/itemmanager/GroupDef.java index 559141e5c55..22fd2845c6f 100644 --- a/forge-gui/src/main/java/forge/itemmanager/GroupDef.java +++ b/forge-gui/src/main/java/forge/itemmanager/GroupDef.java @@ -74,12 +74,12 @@ public enum GroupDef { return -1; } }), - DEFAULT("Default", - new String[] { "Creatures", "Spells", "Lands" }, + DEFAULT("Default", //Beginning in DDU, "Artifacts" category is added at top of list + new String[] { "Artifacts", "Creatures", "Other Spells", "Lands" }, new Function() { @Override public ColumnDef apply(final Integer groupIndex) { - if (groupIndex == 2) { + if (groupIndex == 3) { return ColumnDef.NAME; //pile lands by name regardless } return null; @@ -90,21 +90,24 @@ public enum GroupDef { public Integer apply(final InventoryItem item) { if (item instanceof PaperCard) { CardType type = ((PaperCard) item).getRules().getType(); - if (type.isCreature()) { + if (type.isArtifact()) { //artifact lands/creatures, too return 0; } - if (type.isLand()) { //make Artifact Lands appear in Lands group - return 2; - } - if (type.isArtifact() || type.isEnchantment() || type.isPlaneswalker() || type.isInstant() || type.isSorcery()) { + if (type.isCreature()) { return 1; } + if (type.isLand()) { + return 3; + } + if (type.isEnchantment() || type.isPlaneswalker() || type.isInstant() || type.isSorcery()) { + return 2; + } } return -1; } }), CARD_TYPE("Type", - new String[] { "Creatures", "Artifacts", "Enchantments", "Planeswalkers", "Instants", "Sorceries", "Lands" }, + new String[] { "Planeswalker", "Creature", "Sorcery", "Instant", "Artifact", "Enchantment", "Land" }, new Function() { @Override public ColumnDef apply(final Integer groupIndex) { @@ -119,27 +122,57 @@ public enum GroupDef { public Integer apply(final InventoryItem item) { if (item instanceof PaperCard) { CardType type = ((PaperCard) item).getRules().getType(); - if (type.isCreature()) { //make Artifact and Land Creatures appear in Creatures group + if (type.isPlaneswalker()) { return 0; } - if (type.isLand()) { //make Artifact Lands appear in Lands group - return 6; - } - if (type.isArtifact()) { + if (type.isCreature()) { return 1; } - if (type.isEnchantment()) { + if (type.isSorcery()) { return 2; } - if (type.isPlaneswalker()) { + if (type.isInstant()) { return 3; } - if (type.isInstant()) { + if (type.isArtifact()) { return 4; } - if (type.isSorcery()) { + if (type.isEnchantment()) { return 5; } + if (type.isLand()) { + return 6; + } + } + return -1; + } + }), + PW_DECK_SORT("Planeswalker Deck Sort", + new String[] { "Planeswalker", "Rares", "Creature", "Land", "Other Spells" }, + new Function() { + @Override + public ColumnDef apply(final Integer groupIndex) { + return null; + } + }, + new Function() { + @Override + public Integer apply(final InventoryItem item) { + if (item instanceof PaperCard) { + CardType type = ((PaperCard) item).getRules().getType(); + if (type.isPlaneswalker()){ + return 0; + } + if (((PaperCard) item).getRarity().toString() == "R"){ + return 1; + } + if (type.isCreature()){ + return 2; + } + if (type.isLand()){ + return 3; + } + return 4; } return -1; } diff --git a/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java b/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java index 222b3321df9..a5df84f7e1a 100644 --- a/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java +++ b/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java @@ -157,7 +157,7 @@ public final class SItemManagerUtil { return builder.toString(); } - private static final GroupDef[] CARD_GROUPBY_OPTIONS = { GroupDef.DEFAULT, GroupDef.CARD_TYPE, GroupDef.COLOR, GroupDef.COLOR_IDENTITY, GroupDef.SET, GroupDef.CARD_RARITY }; + private static final GroupDef[] CARD_GROUPBY_OPTIONS = { GroupDef.DEFAULT, GroupDef.CARD_TYPE, GroupDef.COLOR, GroupDef.COLOR_IDENTITY, GroupDef.SET, GroupDef.CARD_RARITY, GroupDef.PW_DECK_SORT }; private static final GroupDef[] DECK_GROUPBY_OPTIONS = { GroupDef.COLOR, GroupDef.COLOR_IDENTITY, GroupDef.SET }; private static final ColumnDef[] CARD_PILEBY_OPTIONS = { ColumnDef.CMC, ColumnDef.COLOR, ColumnDef.NAME, ColumnDef.COST, ColumnDef.TYPE, ColumnDef.RARITY, ColumnDef.SET }; private static final ColumnDef[] DECK_PILEBY_OPTIONS = { ColumnDef.DECK_COLOR, ColumnDef.DECK_FOLDER, ColumnDef.NAME, ColumnDef.DECK_FORMAT, ColumnDef.DECK_EDITION }; From b1d62d32ca88665c8077864df0ff375f0ca0f727 Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Sun, 21 Oct 2018 22:54:29 +0000 Subject: [PATCH 071/901] Tribal instant gets its own section --- forge-gui/src/main/java/forge/itemmanager/GroupDef.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/forge-gui/src/main/java/forge/itemmanager/GroupDef.java b/forge-gui/src/main/java/forge/itemmanager/GroupDef.java index 22fd2845c6f..8376b31bf6c 100644 --- a/forge-gui/src/main/java/forge/itemmanager/GroupDef.java +++ b/forge-gui/src/main/java/forge/itemmanager/GroupDef.java @@ -107,7 +107,7 @@ public enum GroupDef { } }), CARD_TYPE("Type", - new String[] { "Planeswalker", "Creature", "Sorcery", "Instant", "Artifact", "Enchantment", "Land" }, + new String[] { "Planeswalker", "Creature", "Sorcery", "Instant", "Artifact", "Enchantment", "Land", "Tribal instant" }, new Function() { @Override public ColumnDef apply(final Integer groupIndex) { @@ -131,6 +131,9 @@ public enum GroupDef { if (type.isSorcery()) { return 2; } + if (type.isTribal() && type.isInstant()) { + return 7; + } if (type.isInstant()) { return 3; } From 7e62fd42fb66c58174fe83c23f9b1c8776eb60ec Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Mon, 22 Oct 2018 00:53:47 +0000 Subject: [PATCH 072/901] Add missing trigger to Skalla Wolf --- forge-gui/res/cardsfolder/s/skalla_wolf.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/s/skalla_wolf.txt b/forge-gui/res/cardsfolder/s/skalla_wolf.txt index ac0332b6967..0f32c2e8b15 100644 --- a/forge-gui/res/cardsfolder/s/skalla_wolf.txt +++ b/forge-gui/res/cardsfolder/s/skalla_wolf.txt @@ -1,6 +1,7 @@ Name:Skalla Wolf ManaCost:3 G G Types:Creature Wolf Spirit -SVar:DBDig:DB$ Dig | DigNum$ 5 | ChangeNum$ 1 | Optional$ True | ForceRevealToController$ True | ChangeValid$ Card.Green | RestRandomOrder$ True +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDig | TriggerDescription$ When CARDNAME enters the battlefield, look at the top five cards of your library. You may reveal a green card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. +SVar:TrigDig:DB$ Dig | DigNum$ 5 | ChangeNum$ 1 | Optional$ True | ForceRevealToController$ True | ChangeValid$ Card.Green | RestRandomOrder$ True Oracle:When Skalla Wolf enters the battlefield, look at the top five cards of your library. You may reveal a green card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. PT:3/3 \ No newline at end of file From 2d7d15193e61e12c3697222513f31ab027c3b8c5 Mon Sep 17 00:00:00 2001 From: Meerkov Date: Tue, 23 Oct 2018 01:18:10 +0000 Subject: [PATCH 073/901] Update ranging_raptors.txt --- forge-gui/res/cardsfolder/r/ranging_raptors.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/r/ranging_raptors.txt b/forge-gui/res/cardsfolder/r/ranging_raptors.txt index b4c8b178b99..490ec574f8d 100644 --- a/forge-gui/res/cardsfolder/r/ranging_raptors.txt +++ b/forge-gui/res/cardsfolder/r/ranging_raptors.txt @@ -3,7 +3,7 @@ ManaCost:2 G Types:Creature Dinosaur PT:2/3 T:Mode$ DamageDoneOnce | Execute$ TrigSearchLand | ValidTarget$ Card.Self | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Enrage — Whenever CARDNAME is dealt damage, you may search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library. -SVar:TrigSearchLand:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | ChangeNum$ 1 | Tapped$ True | ShuffleNonMandatory$ TrueS +SVar:TrigSearchLand:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | ChangeNum$ 1 | Tapped$ True | ShuffleNonMandatory$ True SVar:HasCombatEffect:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/ranging_raptors.jpg Oracle:Enrage — Whenever Ranging Raptors is dealt damage, you may search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library. \ No newline at end of file From 2b4435de2e4925f6b8d40e8bb1da9cc8f8ad6d22 Mon Sep 17 00:00:00 2001 From: Meerkov Date: Tue, 23 Oct 2018 01:19:18 +0000 Subject: [PATCH 074/901] Update trench_gorger.txt --- forge-gui/res/cardsfolder/t/trench_gorger.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/t/trench_gorger.txt b/forge-gui/res/cardsfolder/t/trench_gorger.txt index 77425a9e651..d9945f2c21d 100644 --- a/forge-gui/res/cardsfolder/t/trench_gorger.txt +++ b/forge-gui/res/cardsfolder/t/trench_gorger.txt @@ -4,7 +4,7 @@ Types:Creature Leviathan PT:6/6 K:Trample T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | OptionalDecider$ You | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for any number of land cards, exile them, then shuffle your library. If you do, CARDNAME has base power and base toughness each equal to the number of cards exiled this way. -SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Library | Destination$ Exile | ChangeType$ Land | ChangeNum$ X | References$ X | RememberChanged$ True | SubAbility$ TrenchAnimate | ShuffleNonMandatory$ Trues +SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Library | Destination$ Exile | ChangeType$ Land | ChangeNum$ X | References$ X | RememberChanged$ True | SubAbility$ TrenchAnimate | ShuffleNonMandatory$ True SVar:TrenchAnimate:DB$Animate | Power$ Y | Toughness$ Y | References$ Y | Permanent$ True | SubAbility$ DBCleanUp SVar:DBCleanUp:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$TypeInYourLibrary.Land From 6055f9ddc4148c90ca8c59e9a00d46d39dff99fd Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 23 Oct 2018 08:11:13 +0300 Subject: [PATCH 075/901] - Added puzzle PS_GRN3. --- forge-gui/res/puzzle/PS_GRN3.pzl | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 forge-gui/res/puzzle/PS_GRN3.pzl diff --git a/forge-gui/res/puzzle/PS_GRN3.pzl b/forge-gui/res/puzzle/PS_GRN3.pzl new file mode 100644 index 00000000000..2263c7d4396 --- /dev/null +++ b/forge-gui/res/puzzle/PS_GRN3.pzl @@ -0,0 +1,16 @@ +[metadata] +Name:Possibility Storm - Guilds of Ravnica #03 +URL:https://i0.wp.com/www.possibilitystorm.com/wp-content/uploads/2018/10/085.-GRN3-1.jpg +Goal:Win +Turns:1 +Difficulty:Mythic +Description:Win this turn. +[state] +humanlife=20 +ailife=9 +turn=1 +activeplayer=human +activephase=MAIN1 +humanhand=Justice Strike;Dual Shot;Ashes of the Abhorrent;Silverclad Ferocidons;Hunted Witness +humanbattlefield=Roc Charger|Id:1;Glaive of the Guildpact|Attaching:1;Desecrated Tomb;Pitiless Plunderer;Undercity Necrolisk;Oathsworn Vampire;Boros Guildgate|Set:GRN;Boros Guildgate|Set:GRN;Boros Guildgate|Set:GRN;Boros Guildgate|Set:GRN;Gateway Plaza|NoETBTrigs;Gateway Plaza|NoETBTrigs;Gateway Plaza|NoETBTrigs;Gateway Plaza|NoETBTrigs +aibattlefield=Rekindling Phoenix;Rekindling Phoenix;Aurelia, Exemplar of Justice From 662f6f79ea5af6513b78c5307f921ec2631ab015 Mon Sep 17 00:00:00 2001 From: "Jamin W. Collins" Date: Tue, 23 Oct 2018 17:41:00 -0600 Subject: [PATCH 076/901] allow decks to be stored elsewhere Signed-off-by: Jamin W. Collins --- .../src/forge/screens/settings/FilesPage.java | 22 ++++++++++++++----- .../properties/ForgeProfileProperties.java | 4 ++++ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/forge-gui-mobile/src/forge/screens/settings/FilesPage.java b/forge-gui-mobile/src/forge/screens/settings/FilesPage.java index c2e66c4323a..59947ebf720 100644 --- a/forge-gui-mobile/src/forge/screens/settings/FilesPage.java +++ b/forge-gui-mobile/src/forge/screens/settings/FilesPage.java @@ -68,18 +68,27 @@ public class FilesPage extends TabPage { }, 0); //storage locations - lstItems.addItem(new StorageOption("Data Location (e.g. Settings, Decks, Quests)", ForgeProfileProperties.getUserDir()) { - @Override - protected void onDirectoryChanged(String newDir) { - ForgeProfileProperties.setUserDir(newDir); - } - }, 1); final StorageOption cardPicsOption = new StorageOption("Card Pics Location", ForgeProfileProperties.getCardPicsDir()) { @Override protected void onDirectoryChanged(String newDir) { ForgeProfileProperties.setCardPicsDir(newDir); } }; + final StorageOption decksOption = new StorageOption("Decks Location", ForgeProfileProperties.getDecksDir()) { + @Override + protected void onDirectoryChanged(String newDir) { + ForgeProfileProperties.setDecksDir(newDir); + } + }; + lstItems.addItem(new StorageOption("Data Location (e.g. Settings, Decks, Quests)", ForgeProfileProperties.getUserDir()) { + @Override + protected void onDirectoryChanged(String newDir) { + ForgeProfileProperties.setUserDir(newDir); + + //ensure decks option is updated if needed + decksOption.updateDir(ForgeProfileProperties.getDecksDir()); + } + }, 1); lstItems.addItem(new StorageOption("Image Cache Location", ForgeProfileProperties.getCacheDir()) { @Override protected void onDirectoryChanged(String newDir) { @@ -90,6 +99,7 @@ public class FilesPage extends TabPage { } }, 1); lstItems.addItem(cardPicsOption, 1); + lstItems.addItem(decksOption, 1); } @Override diff --git a/forge-gui/src/main/java/forge/properties/ForgeProfileProperties.java b/forge-gui/src/main/java/forge/properties/ForgeProfileProperties.java index b5210d30179..25a8dbce4dd 100644 --- a/forge-gui/src/main/java/forge/properties/ForgeProfileProperties.java +++ b/forge-gui/src/main/java/forge/properties/ForgeProfileProperties.java @@ -205,6 +205,7 @@ public class ForgeProfileProperties { private static void save() { final Pair defaults = getDefaultDirs(); final String defaultUserDir = defaults.getLeft() + File.separator; + final String defaultDecksDir = defaultUserDir + "decks" + File.separator; final String defaultCacheDir = defaults.getRight() + File.separator; final String defaultCardPicsDir = defaultCacheDir + "pics" + File.separator + "cards" + File.separator; @@ -213,6 +214,9 @@ public class ForgeProfileProperties { if (!userDir.equals(defaultUserDir)) { //ensure backslashes are escaped sb.append(USER_DIR_KEY + "=" + userDir.replace("\\", "\\\\") + "\n"); } + if (!decksDir.equals(defaultDecksDir)) { + sb.append(DECKS_DIR_KEY + "=" + decksDir.replace("\\", "\\\\") + "\n"); + } if (!cacheDir.equals(defaultCacheDir)) { sb.append(CACHE_DIR_KEY + "=" + cacheDir.replace("\\", "\\\\") + "\n"); } From ec5a7903b05678a1b5167056649a0a4ab2532cf6 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Wed, 24 Oct 2018 08:36:35 +0000 Subject: [PATCH 077/901] Update direct_current.txt --- forge-gui/res/cardsfolder/d/direct_current.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/d/direct_current.txt b/forge-gui/res/cardsfolder/d/direct_current.txt index a99a9d71565..6e073cac1e0 100644 --- a/forge-gui/res/cardsfolder/d/direct_current.txt +++ b/forge-gui/res/cardsfolder/d/direct_current.txt @@ -1,7 +1,6 @@ Name:Direct Current ManaCost:1 R R Types:Sorcery -K:Flash K:Jump-start A:SP$ DealDamage | Cost$ 1 R R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to any target. Oracle:Direct Current deals 2 damage to any target.\nJump-start (You may cast this card from your graveyard by discarding a card in addition to paying its other costs. Then exile this card.) From af7c5f7506bc13ba0d510b8fb7ac6b704156f97b Mon Sep 17 00:00:00 2001 From: tjtillmancoag Date: Wed, 24 Oct 2018 19:24:28 -0700 Subject: [PATCH 078/901] Revert Default sort in Deckbuilder to code before !1035 Merge Request --- .../main/java/forge/itemmanager/GroupDef.java | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/forge-gui/src/main/java/forge/itemmanager/GroupDef.java b/forge-gui/src/main/java/forge/itemmanager/GroupDef.java index 8376b31bf6c..fe42da64f71 100644 --- a/forge-gui/src/main/java/forge/itemmanager/GroupDef.java +++ b/forge-gui/src/main/java/forge/itemmanager/GroupDef.java @@ -74,12 +74,12 @@ public enum GroupDef { return -1; } }), - DEFAULT("Default", //Beginning in DDU, "Artifacts" category is added at top of list - new String[] { "Artifacts", "Creatures", "Other Spells", "Lands" }, + DEFAULT("Default", + new String[] { "Creatures", "Spells", "Lands" }, new Function() { @Override public ColumnDef apply(final Integer groupIndex) { - if (groupIndex == 3) { + if (groupIndex == 2) { return ColumnDef.NAME; //pile lands by name regardless } return null; @@ -90,22 +90,20 @@ public enum GroupDef { public Integer apply(final InventoryItem item) { if (item instanceof PaperCard) { CardType type = ((PaperCard) item).getRules().getType(); - if (type.isArtifact()) { //artifact lands/creatures, too + if (type.isCreature()) { return 0; } - if (type.isCreature()) { - return 1; - } - if (type.isLand()) { - return 3; - } - if (type.isEnchantment() || type.isPlaneswalker() || type.isInstant() || type.isSorcery()) { + if (type.isLand()) { //make Artifact Lands appear in Lands group return 2; } + if (type.isArtifact() || type.isEnchantment() || type.isPlaneswalker() || type.isInstant() || type.isSorcery()) { + return 1; + } } return -1; } }), + CARD_TYPE("Type", new String[] { "Planeswalker", "Creature", "Sorcery", "Instant", "Artifact", "Enchantment", "Land", "Tribal instant" }, new Function() { From f4db360265f5df6c9e1a7fc726a1f899234d5749 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 26 Oct 2018 17:16:12 +0300 Subject: [PATCH 079/901] - Prevent NPEs caused by the AI when testing for the new style AI hints from within AI methods on Card objects, which is dangerous because Card.getRules() is not guaranteed to be non-null, and may indeed be null for objects such as tokens (especially noticeable in Momir Basic and MoJhoSto). - Currently relegated 99% of AI calls to those getAIHints tests to a wrapper method which checks for a non-null getRules. - The card predicate has to test for non-null directly to avoid adding an unnecessary dependency on the AI module (the alternative would be to add the wrapper methods to the Card object, but that'll clutter it even more and the AI hints belong to the AI side of things, not the card itself). --- forge-ai/src/main/java/forge/ai/AiController.java | 2 +- forge-ai/src/main/java/forge/ai/ComputerUtilCard.java | 9 +++++++++ .../src/main/java/forge/ai/ability/ChangeZoneAi.java | 2 +- .../src/main/java/forge/ai/ability/ControlGainAi.java | 2 +- .../src/main/java/forge/ai/ability/PowerExchangeAi.java | 2 +- .../src/main/java/forge/game/card/CardPredicates.java | 5 +++-- 6 files changed, 16 insertions(+), 6 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 2314c4867bb..64f14a4c955 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -1705,7 +1705,7 @@ public class AiController { if (!useSimulation) { for (Entry ds : myDeck) { for (Entry cp : ds.getValue()) { - if (cp.getKey().getRules().getAiHints().getRemAIDecks()) + if (cp.getKey().getRules().getAiHints().getRemAIDecks()) result.add(cp.getKey()); } } diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index 115568e4ce4..008da7ec703 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -1844,4 +1844,13 @@ public class ComputerUtilCard { return AiPlayDecision.WillPlay; } + + // Determine if the AI has an AI:RemoveDeck:All or an AI:RemoveDeck:Random hint specified. + // Includes a NPE guard on getRules() which might otherwise be tripped on some cards (e.g. tokens). + public static boolean isCardRemAIDeck(final Card card) { + return card.getRules() != null && card.getRules().getAiHints().getRemAIDecks(); + } + public static boolean isCardRemRandomDeck(final Card card) { + return card.getRules() != null && card.getRules().getAiHints().getRemRandomDecks(); + } } 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 47c408d8c79..7d7a60528fc 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -1463,7 +1463,7 @@ public class ChangeZoneAi extends SpellAbilityAi { fetchList = CardLists.filter(fetchList, new Predicate() { @Override public boolean apply(final Card c) { - if (c.getRules().getAiHints().getRemAIDecks() || c.getRules().getAiHints().getRemRandomDecks()) { + if (ComputerUtilCard.isCardRemAIDeck(c) || ComputerUtilCard.isCardRemRandomDeck(c)) { return false; } return true; diff --git a/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java b/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java index a6631ad51bb..eb6e3ed5d9b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java @@ -171,7 +171,7 @@ public class ControlGainAi extends SpellAbilityAi { } // do not take control on something it doesn't know how to use - return !c.getRules().getAiHints().getRemAIDecks(); + return !ComputerUtilCard.isCardRemAIDeck(c); } }); 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 028e234f365..6dd2e5aa767 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java @@ -37,7 +37,7 @@ public class PowerExchangeAi extends SpellAbilityAi { list = CardLists.filter(list, new Predicate() { @Override public boolean apply(final Card c) { - return !c.getRules().getAiHints().getRemAIDecks() && c.canBeTargetedBy(sa); + return !ComputerUtilCard.isCardRemAIDeck(c) && c.canBeTargetedBy(sa); } }); CardLists.sortByPowerAsc(list); diff --git a/forge-game/src/main/java/forge/game/card/CardPredicates.java b/forge-game/src/main/java/forge/game/card/CardPredicates.java index 4809a42da8d..c6180228a3d 100644 --- a/forge-game/src/main/java/forge/game/card/CardPredicates.java +++ b/forge-game/src/main/java/forge/game/card/CardPredicates.java @@ -416,8 +416,9 @@ public final class CardPredicates { public static final Predicate isRemAIDeck() { return new Predicate() { @Override - public boolean apply(final Card c) { - return c.getRules().getAiHints().getRemAIDecks(); + public boolean apply(final Card c) + { + return c.getRules() != null && c.getRules().getAiHints().getRemAIDecks(); } }; } From 3e91c95dcf93252e11fb84e1a385184ed303441c Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 26 Oct 2018 22:58:16 +0300 Subject: [PATCH 080/901] - When making token copies of permanents, set the copied permanent so that its CMC can be calculated. --- .../java/forge/game/ability/effects/CopyPermanentEffect.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java index b0977f9cee7..cde82b37f68 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java @@ -168,11 +168,13 @@ public class CopyPermanentEffect extends SpellAbilityEffect { for (final Card c : tgtCards) { if (!sa.usesTargeting() || c.canBeTargetedBy(sa)) { - List token = TokenInfo.makeToken(getProtoType(sa, c), controller, true, numCopies); + Card proto = getProtoType(sa, c); + List token = TokenInfo.makeToken(proto, controller, true, numCopies); final List crds = Lists.newArrayListWithCapacity(token.size()); for (final Card t : token) { + t.setCopiedPermanent(proto); // Temporarily register triggers of an object created with CopyPermanent //game.getTriggerHandler().registerActiveTrigger(copy, false); From cfd4aafc35a5772bcb8fd340b7552008958dc715 Mon Sep 17 00:00:00 2001 From: Michael Kamensky Date: Fri, 26 Oct 2018 20:00:00 +0000 Subject: [PATCH 081/901] Improve Omnispell Adept AI --- .../main/java/forge/ai/ability/PlayAi.java | 31 +++++++++++++++++-- .../res/cardsfolder/o/omnispell_adept.txt | 2 +- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/PlayAi.java b/forge-ai/src/main/java/forge/ai/ability/PlayAi.java index 74aa623da32..49fd600f9a4 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PlayAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PlayAi.java @@ -7,15 +7,14 @@ import forge.card.CardTypeView; import forge.game.Game; import forge.game.GameType; import forge.game.ability.AbilityUtils; -import forge.game.card.Card; -import forge.game.card.CardCollection; -import forge.game.card.CardLists; +import forge.game.card.*; import forge.game.cost.Cost; import forge.game.keyword.Keyword; import forge.game.player.Player; import forge.game.player.PlayerActionConfirmMode; import forge.game.spellability.Spell; import forge.game.spellability.SpellAbility; +import forge.game.spellability.SpellPermanent; import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; import forge.util.MyRandom; @@ -71,8 +70,25 @@ public class PlayAi extends SpellAbilityAi { } } + // Ensure that if a ValidZone is specified, there's at least something to choose from in that zone. + CardCollectionView validOpts = new CardCollection(); + if (sa.hasParam("ValidZone")) { + validOpts = AbilityUtils.filterListByType(game.getCardsIn(ZoneType.valueOf(sa.getParam("ValidZone"))), + sa.getParam("Valid"), sa); + if (validOpts.isEmpty()) { + return false; + } + } + if ("ReplaySpell".equals(logic)) { return ComputerUtil.targetPlayableSpellCard(ai, cards, sa, sa.hasParam("WithoutManaCost")); + } else if (logic.startsWith("NeedsChosenCard")) { + int minCMC = 0; + if (sa.getPayCosts() != null && sa.getPayCosts().getCostMana() != null) { + minCMC = sa.getPayCosts().getCostMana().getMana().getCMC(); + } + validOpts = CardLists.filter(validOpts, CardPredicates.greaterCMC(minCMC)); + return chooseSingleCard(ai, sa, validOpts, sa.hasParam("Optional"), null) != null; } if (source != null && source.hasKeyword(Keyword.HIDEAWAY) && source.hasRemembered()) { @@ -138,6 +154,15 @@ public class PlayAi extends SpellAbilityAi { if (!s.getRestrictions().checkTimingRestrictions(c, s)) continue; if (sa.hasParam("WithoutManaCost")) { + // Try to avoid casting instants and sorceries with X in their cost, since X will be assumed to be 0. + if (!(spell instanceof SpellPermanent)) { + if (spell.getPayCosts() != null + && spell.getPayCosts().getCostMana() != null + && spell.getPayCosts().getCostMana().getMana().countX() > 0) { + continue; + } + } + spell = (Spell) spell.copyWithNoManaCost(); } else if (sa.hasParam("PlayCost")) { Cost abCost; diff --git a/forge-gui/res/cardsfolder/o/omnispell_adept.txt b/forge-gui/res/cardsfolder/o/omnispell_adept.txt index dcb319305cd..e352fc583f4 100644 --- a/forge-gui/res/cardsfolder/o/omnispell_adept.txt +++ b/forge-gui/res/cardsfolder/o/omnispell_adept.txt @@ -2,5 +2,5 @@ Name:Omnispell Adept ManaCost:4 U Types:Creature Human Wizard PT:3/4 -A:AB$ Play | Cost$ 2 U T | ValidZone$ Hand | Valid$ Instant.YouOwn,Sorcery.YouOwn | Controller$ You | WithoutManaCost$ True | Optional$ True | SpellDescription$ You may cast an instant or sorcery card from your hand without paying its mana cost. +A:AB$ Play | Cost$ 2 U T | ValidZone$ Hand | Valid$ Instant.YouOwn,Sorcery.YouOwn | Controller$ You | WithoutManaCost$ True | Optional$ True | AILogic$ NeedsChosenCard | SpellDescription$ You may cast an instant or sorcery card from your hand without paying its mana cost. Oracle:{2}{U}, {T}: You may cast an instant or sorcery card from your hand without paying its mana cost. From ec25f31718cffae702d63ef2a6e223b96fba2638 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 29 Oct 2018 09:36:54 +0300 Subject: [PATCH 082/901] - Update file settings description. --- forge-gui-mobile/src/forge/screens/settings/FilesPage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui-mobile/src/forge/screens/settings/FilesPage.java b/forge-gui-mobile/src/forge/screens/settings/FilesPage.java index 59947ebf720..fa076bd56cb 100644 --- a/forge-gui-mobile/src/forge/screens/settings/FilesPage.java +++ b/forge-gui-mobile/src/forge/screens/settings/FilesPage.java @@ -80,7 +80,7 @@ public class FilesPage extends TabPage { ForgeProfileProperties.setDecksDir(newDir); } }; - lstItems.addItem(new StorageOption("Data Location (e.g. Settings, Decks, Quests)", ForgeProfileProperties.getUserDir()) { + lstItems.addItem(new StorageOption("Data Location (e.g. Settings and Quests)", ForgeProfileProperties.getUserDir()) { @Override protected void onDirectoryChanged(String newDir) { ForgeProfileProperties.setUserDir(newDir); From 1ab9f2cae51643398c7225e320579c61ec27aa98 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 30 Oct 2018 13:06:33 +0300 Subject: [PATCH 083/901] - Fixed a stack overflow when the AI is considering Pause for Reflection. - Improved the implementation of AiCardMemory a little, making it a little safer to use as well in routines which may also be used to simulate human behavior. --- .../src/main/java/forge/ai/AiCardMemory.java | 74 +++++++++++-------- .../src/main/java/forge/ai/ComputerUtil.java | 8 ++ 2 files changed, 53 insertions(+), 29 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiCardMemory.java b/forge-ai/src/main/java/forge/ai/AiCardMemory.java index be8593fdefe..e018df8c0e3 100644 --- a/forge-ai/src/main/java/forge/ai/AiCardMemory.java +++ b/forge-ai/src/main/java/forge/ai/AiCardMemory.java @@ -40,6 +40,26 @@ import java.util.Set; */ public class AiCardMemory { + /** + * Defines the memory set in which the card is remembered + * (which, in its turn, defines how the AI utilizes the information + * about remembered cards). + */ + public enum MemorySet { + MANDATORY_ATTACKERS, // These creatures must attack this turn + TRICK_ATTACKERS, // These creatures will attack to try to provoke the opponent to block them into a combat trick + HELD_MANA_SOURCES_FOR_MAIN2, // These mana sources will not be used before Main 2 + HELD_MANA_SOURCES_FOR_DECLBLK, // These mana sources will not be used before Combat - Declare Blockers + HELD_MANA_SOURCES_FOR_ENEMY_DECLBLK, // These mana sources will not be used before the opponent's Combat - Declare Blockers + ATTACHED_THIS_TURN, // These equipments were attached to something already this turn + ANIMATED_THIS_TURN, // These cards had their AF Animate effect activated this turn + BOUNCED_THIS_TURN, // These cards were bounced this turn + ACTIVATED_THIS_TURN, // These cards had their ability activated this turn + CHOSEN_FOG_EFFECT, // These cards are marked as the Fog-like effect the AI is planning to cast this turn + MARKED_TO_AVOID_REENTRY // These cards may cause a stack smash when processed recursively, and are thus marked to avoid a crash + //REVEALED_CARDS // stub, not linked to AI code yet + } + private final Set memMandatoryAttackers; private final Set memTrickAttackers; private final Set memHeldManaSources; @@ -50,6 +70,7 @@ public class AiCardMemory { private final Set memBouncedThisTurn; private final Set memActivatedThisTurn; private final Set memChosenFogEffect; + private final Set memMarkedToAvoidReentry; public AiCardMemory() { this.memMandatoryAttackers = new HashSet<>(); @@ -62,25 +83,7 @@ public class AiCardMemory { this.memActivatedThisTurn = new HashSet<>(); this.memTrickAttackers = new HashSet<>(); this.memChosenFogEffect = new HashSet<>(); - } - - /** - * Defines the memory set in which the card is remembered - * (which, in its turn, defines how the AI utilizes the information - * about remembered cards). - */ - public enum MemorySet { - MANDATORY_ATTACKERS, - TRICK_ATTACKERS, - HELD_MANA_SOURCES_FOR_MAIN2, - HELD_MANA_SOURCES_FOR_DECLBLK, - HELD_MANA_SOURCES_FOR_ENEMY_DECLBLK, - ATTACHED_THIS_TURN, - ANIMATED_THIS_TURN, - BOUNCED_THIS_TURN, - ACTIVATED_THIS_TURN, - CHOSEN_FOG_EFFECT, - //REVEALED_CARDS // stub, not linked to AI code yet + this.memMarkedToAvoidReentry = new HashSet<>(); } private Set getMemorySet(MemorySet set) { @@ -105,6 +108,8 @@ public class AiCardMemory { return memActivatedThisTurn; case CHOSEN_FOG_EFFECT: return memChosenFogEffect; + case MARKED_TO_AVOID_REENTRY: + return memMarkedToAvoidReentry; //case REVEALED_CARDS: // return memRevealedCards; default: @@ -273,35 +278,46 @@ public class AiCardMemory { * Clears all memory sets stored in this card memory for the given player. */ public void clearAllRemembered() { - clearMemorySet(MemorySet.MANDATORY_ATTACKERS); - clearMemorySet(MemorySet.TRICK_ATTACKERS); - clearMemorySet(MemorySet.HELD_MANA_SOURCES_FOR_MAIN2); - clearMemorySet(MemorySet.HELD_MANA_SOURCES_FOR_DECLBLK); - clearMemorySet(MemorySet.HELD_MANA_SOURCES_FOR_ENEMY_DECLBLK); - clearMemorySet(MemorySet.ATTACHED_THIS_TURN); - clearMemorySet(MemorySet.ANIMATED_THIS_TURN); - clearMemorySet(MemorySet.BOUNCED_THIS_TURN); - clearMemorySet(MemorySet.ACTIVATED_THIS_TURN); - clearMemorySet(MemorySet.CHOSEN_FOG_EFFECT); + for (MemorySet memSet : MemorySet.values()) { + clearMemorySet(memSet); + } } // Static functions to simplify access to AI card memory of a given AI player. public static void rememberCard(Player ai, Card c, MemorySet set) { + if (!ai.getController().isAI()) { + return; + } ((PlayerControllerAi)ai.getController()).getAi().getCardMemory().rememberCard(c, set); } public static void forgetCard(Player ai, Card c, MemorySet set) { + if (!ai.getController().isAI()) { + return; + } ((PlayerControllerAi)ai.getController()).getAi().getCardMemory().forgetCard(c, set); } public static boolean isRememberedCard(Player ai, Card c, MemorySet set) { + if (!ai.getController().isAI()) { + return false; + } return ((PlayerControllerAi)ai.getController()).getAi().getCardMemory().isRememberedCard(c, set); } public static boolean isRememberedCardByName(Player ai, String name, MemorySet set) { + if (!ai.getController().isAI()) { + return false; + } return ((PlayerControllerAi)ai.getController()).getAi().getCardMemory().isRememberedCardByName(name, set); } public static void clearMemorySet(Player ai, MemorySet set) { + if (!ai.getController().isAI()) { + return; + } ((PlayerControllerAi)ai.getController()).getAi().getCardMemory().clearMemorySet(set); } public static boolean isMemorySetEmpty(Player ai, MemorySet set) { + if (!ai.getController().isAI()) { + return false; + } return ((PlayerControllerAi)ai.getController()).getAi().getCardMemory().isMemorySetEmpty(set); } } \ No newline at end of file diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index 8afe5ad86fb..64a7e88127b 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -1347,6 +1347,14 @@ public class ComputerUtil { if (sa.getApi() != ApiType.Fog) { continue; } + + // Avoid re-entry for cards already being considered (e.g. in case the AI is considering + // Convoke or Improvise for a Fog-like effect) + if (AiCardMemory.isRememberedCard(ai, c, AiCardMemory.MemorySet.MARKED_TO_AVOID_REENTRY)) { + continue; + } + AiCardMemory.rememberCard(ai, c, AiCardMemory.MemorySet.MARKED_TO_AVOID_REENTRY); + if (!ComputerUtilCost.canPayCost(sa, ai)) { continue; } From 0ab87d46b4ad6dcfcfbac0ec66e76c416505e13c Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 30 Oct 2018 15:04:58 +0300 Subject: [PATCH 084/901] - Improved the implementation: clear the memory set for reentry-susceptible cards when starting to consider a new SA. - Some more improvements in AiCardMemory. --- .../src/main/java/forge/ai/AiCardMemory.java | 20 +++++++++++++++++++ .../src/main/java/forge/ai/AiController.java | 5 +++++ .../src/main/java/forge/ai/ComputerUtil.java | 8 +++++--- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiCardMemory.java b/forge-ai/src/main/java/forge/ai/AiCardMemory.java index e018df8c0e3..47909f5e2e5 100644 --- a/forge-ai/src/main/java/forge/ai/AiCardMemory.java +++ b/forge-ai/src/main/java/forge/ai/AiCardMemory.java @@ -290,34 +290,54 @@ public class AiCardMemory { } ((PlayerControllerAi)ai.getController()).getAi().getCardMemory().rememberCard(c, set); } + public static void rememberCard(AiController aic, Card c, MemorySet set) { + aic.getCardMemory().rememberCard(c, set); + } public static void forgetCard(Player ai, Card c, MemorySet set) { if (!ai.getController().isAI()) { return; } ((PlayerControllerAi)ai.getController()).getAi().getCardMemory().forgetCard(c, set); } + public static void forgetCard(AiController aic, Card c, MemorySet set) { + aic.getCardMemory().forgetCard(c, set); + } public static boolean isRememberedCard(Player ai, Card c, MemorySet set) { if (!ai.getController().isAI()) { return false; } return ((PlayerControllerAi)ai.getController()).getAi().getCardMemory().isRememberedCard(c, set); } + public static boolean isRememberedCard(AiController aic, Card c, MemorySet set) { + return aic.getCardMemory().isRememberedCard(c, set); + } public static boolean isRememberedCardByName(Player ai, String name, MemorySet set) { if (!ai.getController().isAI()) { return false; } return ((PlayerControllerAi)ai.getController()).getAi().getCardMemory().isRememberedCardByName(name, set); } + public static boolean isRememberedCardByName(AiController aic, String name, MemorySet set) { + return aic.getCardMemory().isRememberedCardByName(name, set); + } public static void clearMemorySet(Player ai, MemorySet set) { if (!ai.getController().isAI()) { return; } ((PlayerControllerAi)ai.getController()).getAi().getCardMemory().clearMemorySet(set); } + public static void clearMemorySet(AiController aic, MemorySet set) { + if (!isMemorySetEmpty(aic, set)) { + aic.getCardMemory().clearMemorySet(set); + } + } public static boolean isMemorySetEmpty(Player ai, MemorySet set) { if (!ai.getController().isAI()) { return false; } return ((PlayerControllerAi)ai.getController()).getAi().getCardMemory().isMemorySetEmpty(set); } + public static boolean isMemorySetEmpty(AiController aic, MemorySet set) { + return aic.getCardMemory().isMemorySetEmpty(set); + } } \ No newline at end of file diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 64f14a4c955..658c66fd8ee 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -646,6 +646,11 @@ public class AiController { if (sa instanceof WrappedAbility) { return canPlaySa(((WrappedAbility) sa).getWrappedAbility()); } + + // When processing a new SA, clear the previously remembered cards that have been marked to avoid re-entry + // which might potentially cause a stack overflow. + AiCardMemory.clearMemorySet(this, AiCardMemory.MemorySet.MARKED_TO_AVOID_REENTRY); + if (sa.getApi() != null) { boolean canPlay = SpellApiToAi.Converter.get(sa.getApi()).canPlayAIWithSubs(player, sa); if (!canPlay) { diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index 64a7e88127b..113e0c2bab3 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -1350,10 +1350,12 @@ public class ComputerUtil { // Avoid re-entry for cards already being considered (e.g. in case the AI is considering // Convoke or Improvise for a Fog-like effect) - if (AiCardMemory.isRememberedCard(ai, c, AiCardMemory.MemorySet.MARKED_TO_AVOID_REENTRY)) { - continue; + if (c.hasKeyword("Convoke") || c.hasKeyword("Improvise")) { + if (AiCardMemory.isRememberedCard(ai, c, AiCardMemory.MemorySet.MARKED_TO_AVOID_REENTRY)) { + continue; + } + AiCardMemory.rememberCard(ai, c, AiCardMemory.MemorySet.MARKED_TO_AVOID_REENTRY); } - AiCardMemory.rememberCard(ai, c, AiCardMemory.MemorySet.MARKED_TO_AVOID_REENTRY); if (!ComputerUtilCost.canPayCost(sa, ai)) { continue; From 3561c66b7d3938590d7019b901d5c5cf36b1b523 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 30 Oct 2018 20:34:23 +0300 Subject: [PATCH 085/901] - Added puzzle PS_GRN4. --- forge-gui/res/puzzle/PS_GRN4.pzl | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 forge-gui/res/puzzle/PS_GRN4.pzl diff --git a/forge-gui/res/puzzle/PS_GRN4.pzl b/forge-gui/res/puzzle/PS_GRN4.pzl new file mode 100644 index 00000000000..de1b80516df --- /dev/null +++ b/forge-gui/res/puzzle/PS_GRN4.pzl @@ -0,0 +1,17 @@ +[metadata] +Name:Possibility Storm - Guilds of Ravnica #04 +URL:https://i2.wp.com/www.possibilitystorm.com/wp-content/uploads/2018/10/086.-GRN4.jpg +Goal:Win +Turns:1 +Difficulty:Uncommon +Description:Win this turn. There are nine creatures in your graveyard. Assume your opponent's graveyard is empty. +[state] +humanlife=20 +ailife=15 +turn=1 +activeplayer=human +activephase=MAIN1 +humanhand=Legion Warboss;Voracious Vampire;Jade Bearer;Buccaneer's Bravado +humangraveyard=Mist-Cloaked Herald;Isareth the Awakener;Siege-Gang Commander;Hungering Hydra;Truefire Captain;Ochran Assassin;Elenda, the Dusk Rose;Skirk Prospector;Cavalry Drillmaster +humanbattlefield=Lazav, the Multifarious;t:Goblin,P:1,T:1,Cost:no cost,Color:R,Types:Creature-Goblin,Keywords:,Image:r_1_1_goblin_grn;t:Goblin,P:1,T:1,Cost:no cost,Color:R,Types:Creature-Goblin,Keywords:,Image:r_1_1_goblin_grn;Gateway Plaza|NoETBTrigs;Gateway Plaza|NoETBTrigs;Gateway Plaza|NoETBTrigs;Mountain|Set:GRN;Mountain|Set:GRN;Mountain|Set:GRN;Mountain|Set:GRN +aibattlefield=Amulet of Safekeeping;Windreader Sphinx;Demonlord Belzenlok;Twilight Prophet;Dream Eater From 85aaf5c548ceac46c4aec81f876db56619bb66ab Mon Sep 17 00:00:00 2001 From: Michael Kamensky Date: Wed, 31 Oct 2018 09:10:10 +0000 Subject: [PATCH 086/901] Fixed a double Taps trigger on Convoke/Improvise. --- forge-game/src/main/java/forge/game/cost/CostAdjustment.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java index 1ad50114869..2d2bce6bc36 100644 --- a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java +++ b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java @@ -266,6 +266,7 @@ public class CostAdjustment { // Then again when payment is done(In InputPayManaCost.done()) with suppression cleared. // This is to make sure that triggers go off at the right time // AND that you can't use mana tapabilities of convoked creatures to pay the convoked cost. + sa.getActivatingPlayer().getGame().getTriggerHandler().suppressMode(TriggerType.Taps); for (final Entry conv : convokedCards.entrySet()) { sa.addTappedForConvoke(conv.getKey()); cost.decreaseShard(conv.getValue(), 1); @@ -276,6 +277,7 @@ public class CostAdjustment { } } } + sa.getActivatingPlayer().getGame().getTriggerHandler().clearSuppression(TriggerType.Taps); } private static void adjustCostByOffering(final ManaCostBeingPaid cost, final SpellAbility sa) { From 70e2714cf3d388a2b21205ca37af208eaffef9e1 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Thu, 1 Nov 2018 15:26:48 +0100 Subject: [PATCH 087/901] Affinity as Keyword --- .../src/main/java/forge/game/card/Card.java | 1 + .../java/forge/game/card/CardFactoryUtil.java | 16 ++++++++++++++++ .../java/forge/game/cost/CostAdjustment.java | 4 +--- .../java/forge/game/keyword/KeywordWithType.java | 8 +++++--- .../forge/game/staticability/StaticAbility.java | 4 ++++ 5 files changed, 27 insertions(+), 6 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 1a9ed880a56..301d7432fca 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -1602,6 +1602,7 @@ public class Card extends GameEntity implements Comparable { } else if (keyword.startsWith("Strive") || keyword.startsWith("Escalate") || keyword.startsWith("ETBReplacement") || keyword.startsWith("CantBeBlockedBy ") + || keyword.startsWith("Affinity") || keyword.equals("CARDNAME enters the battlefield tapped.") || keyword.startsWith("UpkeepCost")) { } else if (keyword.equals("Provoke") || keyword.equals("Ingest") || keyword.equals("Unleash") diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index acbefc4d72d..b07ffa1c36d 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -4322,6 +4322,7 @@ public class CardFactoryUtil { public static void addStaticAbility(final KeywordInterface inst, final Card card, final boolean intrinsic) { String keyword = inst.getOriginal(); String effect = null; + Map svars = Maps.newHashMap(); if (keyword.startsWith("Absorb")) { final String[] k = keyword.split(":"); @@ -4332,6 +4333,18 @@ public class CardFactoryUtil { sb.append(n).append("| Secondary$ True | Description$ Absorb ").append(n); sb.append(" (").append(inst.getReminderText()).append(")"); effect = sb.toString(); + } else if (keyword.startsWith("Affinity")) { + final String[] k = keyword.split(":"); + final String t = k[1]; + + String desc = "Artifact".equals(t) ? "artifacts" : CardType.getPluralType(t); + StringBuilder sb = new StringBuilder(); + sb.append("Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ AffinityX | EffectZone$ All"); + sb.append("| Description$ Affinity for ").append(desc); + sb.append(" (").append(inst.getReminderText()).append(")"); + effect = sb.toString(); + + svars.put("AffinityX", "Count$Valid " + t + ".YouCtrl"); } else if (keyword.equals("Changeling")) { effect = "Mode$ Continuous | EffectZone$ All | Affected$ Card.Self" + " | CharacteristicDefining$ True | AddType$ AllCreatureTypes | Secondary$ True" + @@ -4417,6 +4430,9 @@ public class CardFactoryUtil { if (effect != null) { StaticAbility st = new StaticAbility(effect, card); st.setIntrinsic(intrinsic); + for (Map.Entry e : svars.entrySet()) { + st.setSVar(e.getKey(), e.getValue()); + } inst.addStaticAbility(st); } } diff --git a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java index 2d2bce6bc36..c0f0216ead4 100644 --- a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java +++ b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java @@ -390,10 +390,8 @@ public class CostAdjustment { value = CardFactoryUtil.xCount(card, hostCard.getSVar(amount)); } else if ("Undaunted".equals(amount)) { value = card.getController().getOpponents().size(); - } else if ("X".equals(amount)){ - value = CardFactoryUtil.xCount(hostCard, hostCard.getSVar(amount)); } else { - value = AbilityUtils.calculateAmount(hostCard, amount, sa); + value = AbilityUtils.calculateAmount(hostCard, amount, staticAbility); } if (!params.containsKey("Cost") && ! params.containsKey("Color")) { diff --git a/forge-game/src/main/java/forge/game/keyword/KeywordWithType.java b/forge-game/src/main/java/forge/game/keyword/KeywordWithType.java index 328802ea618..3d30c625d9a 100644 --- a/forge-game/src/main/java/forge/game/keyword/KeywordWithType.java +++ b/forge-game/src/main/java/forge/game/keyword/KeywordWithType.java @@ -1,14 +1,16 @@ package forge.game.keyword; +import forge.card.CardType; + public class KeywordWithType extends KeywordInstance { private String type; @Override protected void parse(String details) { - if ("Creature".equals(details)) { - type = "creature"; + if (CardType.isACardType(details)) { + type = details.toLowerCase(); } else if (details.contains(":")) { - type = details.split(":")[1]; + type = details.split(":")[0]; } else { type = details; } diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java index ca173f8171b..b12c30491a4 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java @@ -258,6 +258,10 @@ public class StaticAbility extends CardTraitBase implements Comparable Date: Thu, 1 Nov 2018 15:48:37 +0100 Subject: [PATCH 088/901] Affinity for cards --- forge-gui/res/cardsfolder/a/assert_authority.txt | 3 +-- forge-gui/res/cardsfolder/b/blinkmoth_infusion.txt | 3 +-- forge-gui/res/cardsfolder/b/broodstar.txt | 2 +- forge-gui/res/cardsfolder/c/chromescale_drake.txt | 3 +-- forge-gui/res/cardsfolder/d/dross_golem.txt | 3 +-- forge-gui/res/cardsfolder/f/frogmite.txt | 3 +-- forge-gui/res/cardsfolder/f/furnace_dragon.txt | 3 +-- forge-gui/res/cardsfolder/i/into_thin_air.txt | 3 +-- forge-gui/res/cardsfolder/m/mycosynth_golem.txt | 5 ++--- forge-gui/res/cardsfolder/m/myr_enforcer.txt | 3 +-- forge-gui/res/cardsfolder/o/oxidda_golem.txt | 3 +-- forge-gui/res/cardsfolder/q/quicksilver_behemoth.txt | 3 +-- forge-gui/res/cardsfolder/q/qumulox.txt | 3 +-- forge-gui/res/cardsfolder/r/razor_golem.txt | 3 +-- forge-gui/res/cardsfolder/s/scale_of_chiss_goria.txt | 3 +-- forge-gui/res/cardsfolder/s/somber_hoverguard.txt | 3 +-- forge-gui/res/cardsfolder/s/spire_golem.txt | 3 +-- forge-gui/res/cardsfolder/t/tangle_golem.txt | 3 +-- forge-gui/res/cardsfolder/t/thoughtcast.txt | 3 +-- forge-gui/res/cardsfolder/t/tooth_of_chiss_goria.txt | 3 +-- 20 files changed, 21 insertions(+), 40 deletions(-) diff --git a/forge-gui/res/cardsfolder/a/assert_authority.txt b/forge-gui/res/cardsfolder/a/assert_authority.txt index 2d7bafbd749..7f79fc0f6bd 100644 --- a/forge-gui/res/cardsfolder/a/assert_authority.txt +++ b/forge-gui/res/cardsfolder/a/assert_authority.txt @@ -2,7 +2,6 @@ Name:Assert Authority ManaCost:5 U U Types:Instant A:SP$ Counter | Cost$ 5 U U | TargetType$ Spell | ValidTgts$ Card | Destination$ Exile | SpellDescription$ Counter target spell. If that spell is countered this way, exile it instead of putting it into its owner's graveyard. -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -SVar:X:Count$Valid Artifact.YouCtrl +K:Affinity:Artifact SVar:Picture:http://www.wizards.com/global/images/magic/general/assert_authority.jpg Oracle:Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.)\nCounter target spell. If that spell is countered this way, exile it instead of putting it into its owner's graveyard. diff --git a/forge-gui/res/cardsfolder/b/blinkmoth_infusion.txt b/forge-gui/res/cardsfolder/b/blinkmoth_infusion.txt index 5a12d02d694..b6db3974dd6 100644 --- a/forge-gui/res/cardsfolder/b/blinkmoth_infusion.txt +++ b/forge-gui/res/cardsfolder/b/blinkmoth_infusion.txt @@ -2,8 +2,7 @@ Name:Blinkmoth Infusion ManaCost:12 U U Types:Instant A:SP$ UntapAll | Cost$ 12 U U | ValidCards$ Artifact | SpellDescription$ Untap all artifacts. -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -SVar:X:Count$Valid Artifact.YouCtrl +K:Affinity:Artifact AI:RemoveDeck:All AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/blinkmoth_infusion.jpg diff --git a/forge-gui/res/cardsfolder/b/broodstar.txt b/forge-gui/res/cardsfolder/b/broodstar.txt index 9ef32a9f6bc..ddac3acfd45 100644 --- a/forge-gui/res/cardsfolder/b/broodstar.txt +++ b/forge-gui/res/cardsfolder/b/broodstar.txt @@ -2,9 +2,9 @@ Name:Broodstar ManaCost:8 U U Types:Creature Beast PT:*/* +K:Affinity:Artifact K:Flying S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ CARDNAME's power and toughness are each equal to the number of artifacts you control. -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) SVar:X:Count$Valid Artifact.YouCtrl SVar:NeedsToPlayVar:X GE3 AI:RemoveDeck:Random diff --git a/forge-gui/res/cardsfolder/c/chromescale_drake.txt b/forge-gui/res/cardsfolder/c/chromescale_drake.txt index 9fd89c65440..8871e5d8c3f 100644 --- a/forge-gui/res/cardsfolder/c/chromescale_drake.txt +++ b/forge-gui/res/cardsfolder/c/chromescale_drake.txt @@ -2,11 +2,10 @@ Name:Chromescale Drake ManaCost:6 U U U Types:Creature Drake PT:3/4 +K:Affinity:Artifact K:Flying T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigDig | TriggerDescription$ When CARDNAME enters the battlefield, reveal the top three cards of your library. Put all artifact cards revealed this way into your hand and the rest into your graveyard. SVar:TrigDig:DB$Dig | DigNum$ 3 | Reveal$ True | ChangeNum$ All | ChangeValid$ Artifact | DestinationZone2$ Graveyard -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -SVar:X:Count$Valid Artifact.YouCtrl AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/chromescale_drake.jpg Oracle:Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.)\nFlying\nWhen Chromescale Drake enters the battlefield, reveal the top three cards of your library. Put all artifact cards revealed this way into your hand and the rest into your graveyard. diff --git a/forge-gui/res/cardsfolder/d/dross_golem.txt b/forge-gui/res/cardsfolder/d/dross_golem.txt index fcb41493e57..75c62f2c46a 100644 --- a/forge-gui/res/cardsfolder/d/dross_golem.txt +++ b/forge-gui/res/cardsfolder/d/dross_golem.txt @@ -2,9 +2,8 @@ Name:Dross Golem ManaCost:5 Types:Artifact Creature Golem PT:3/2 +K:Affinity:Swamp K:Fear -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ Affinity for Swamps (This spell costs {1} less to cast for each Swamp you control.) -SVar:X:Count$Valid Swamp.YouCtrl DeckNeeds:Color$Black SVar:Picture:http://www.wizards.com/global/images/magic/general/dross_golem.jpg Oracle:Affinity for Swamps (This spell costs {1} less to cast for each Swamp you control.)\nFear (This creature can't be blocked except by artifact creatures and/or black creatures.) diff --git a/forge-gui/res/cardsfolder/f/frogmite.txt b/forge-gui/res/cardsfolder/f/frogmite.txt index 5c92b8d3c75..8d9f8bd6f40 100644 --- a/forge-gui/res/cardsfolder/f/frogmite.txt +++ b/forge-gui/res/cardsfolder/f/frogmite.txt @@ -2,7 +2,6 @@ Name:Frogmite ManaCost:4 Types:Artifact Creature Frog PT:2/2 -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -SVar:X:Count$Valid Artifact.YouCtrl +K:Affinity:Artifact SVar:Picture:http://www.wizards.com/global/images/magic/general/frogmite.jpg Oracle:Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) diff --git a/forge-gui/res/cardsfolder/f/furnace_dragon.txt b/forge-gui/res/cardsfolder/f/furnace_dragon.txt index 4854a11d1b0..ebda6ac8a7e 100644 --- a/forge-gui/res/cardsfolder/f/furnace_dragon.txt +++ b/forge-gui/res/cardsfolder/f/furnace_dragon.txt @@ -2,10 +2,9 @@ Name:Furnace Dragon ManaCost:6 R R R Types:Creature Dragon PT:5/5 +K:Affinity:Artifact K:Flying T:Mode$ ChangesZone | ValidCard$ Card.wasCastFromHand+Self | Destination$ Battlefield | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it from your hand, exile all artifacts. SVar:TrigExile:DB$ChangeZoneAll | ChangeType$ Artifact | Origin$ Battlefield | Destination$ Exile -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -SVar:X:Count$Valid Artifact.YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/furnace_dragon.jpg Oracle:Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.)\nFlying\nWhen Furnace Dragon enters the battlefield, if you cast it from your hand, exile all artifacts. diff --git a/forge-gui/res/cardsfolder/i/into_thin_air.txt b/forge-gui/res/cardsfolder/i/into_thin_air.txt index e5960b02821..6c3410f433f 100644 --- a/forge-gui/res/cardsfolder/i/into_thin_air.txt +++ b/forge-gui/res/cardsfolder/i/into_thin_air.txt @@ -2,7 +2,6 @@ Name:Into Thin Air ManaCost:5 U Types:Instant A:SP$ ChangeZone | Cost$ 5 U | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target artifact to its owner's hand. -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -SVar:X:Count$Valid Artifact.YouCtrl +K:Affinity:Artifact SVar:Picture:http://www.wizards.com/global/images/magic/general/into_thin_air.jpg Oracle:Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.)\nReturn target artifact to its owner's hand. diff --git a/forge-gui/res/cardsfolder/m/mycosynth_golem.txt b/forge-gui/res/cardsfolder/m/mycosynth_golem.txt index 9b5586de096..161de1e0a9d 100644 --- a/forge-gui/res/cardsfolder/m/mycosynth_golem.txt +++ b/forge-gui/res/cardsfolder/m/mycosynth_golem.txt @@ -2,8 +2,7 @@ Name:Mycosynth Golem ManaCost:11 Types:Artifact Creature Golem PT:4/5 -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -S:Mode$ ReduceCost | ValidCard$ Artifact.Creature | Type$ Spell | Amount$ X | Activator$ You | Description$ Artifact creature spells you cast have affinity for artifacts. (They cost {1} less to cast for each artifact you control.) -SVar:X:Count$Valid Artifact.YouCtrl +K:Affinity:Artifact +S:Mode$ Continuous | Affected$ Artifact.Creature+YouCtrl | AffectedZone$ Stack | AddKeyword$ Affinity:Artifact | Description$ Artifact creature spells you cast have affinity for artifacts. (They cost {1} less to cast for each artifact you control.) SVar:Picture:http://www.wizards.com/global/images/magic/general/mycosynth_golem.jpg Oracle:Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.)\nArtifact creature spells you cast have affinity for artifacts. (They cost {1} less to cast for each artifact you control.) diff --git a/forge-gui/res/cardsfolder/m/myr_enforcer.txt b/forge-gui/res/cardsfolder/m/myr_enforcer.txt index 91be41f673a..1c3a4a6a93a 100644 --- a/forge-gui/res/cardsfolder/m/myr_enforcer.txt +++ b/forge-gui/res/cardsfolder/m/myr_enforcer.txt @@ -2,7 +2,6 @@ Name:Myr Enforcer ManaCost:7 Types:Artifact Creature Myr PT:4/4 -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -SVar:X:Count$Valid Artifact.YouCtrl +K:Affinity:Artifact SVar:Picture:http://www.wizards.com/global/images/magic/general/myr_enforcer.jpg Oracle:Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) diff --git a/forge-gui/res/cardsfolder/o/oxidda_golem.txt b/forge-gui/res/cardsfolder/o/oxidda_golem.txt index 9eaa6310f10..dbddc11dbbf 100644 --- a/forge-gui/res/cardsfolder/o/oxidda_golem.txt +++ b/forge-gui/res/cardsfolder/o/oxidda_golem.txt @@ -2,9 +2,8 @@ Name:Oxidda Golem ManaCost:6 Types:Artifact Creature Golem PT:3/2 +K:Affinity:Mountain K:Haste -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ Affinity for Mountains (This spell costs {1} less to cast for each Mountain you control.) -SVar:X:Count$Valid Mountain.YouCtrl AI:RemoveDeck:Random DeckNeeds:Color$Red SVar:Picture:http://www.wizards.com/global/images/magic/general/oxidda_golem.jpg diff --git a/forge-gui/res/cardsfolder/q/quicksilver_behemoth.txt b/forge-gui/res/cardsfolder/q/quicksilver_behemoth.txt index 689f5934c43..da16bfbe75e 100644 --- a/forge-gui/res/cardsfolder/q/quicksilver_behemoth.txt +++ b/forge-gui/res/cardsfolder/q/quicksilver_behemoth.txt @@ -2,11 +2,10 @@ Name:Quicksilver Behemoth ManaCost:6 U Types:Creature Beast PT:4/5 +K:Affinity:Artifact T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ DelayedTrig | TriggerDescription$ When CARDNAME attacks or blocks, return it to its owner's hand at end of combat. (Return it only if it's on the battlefield.) T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ DelayedTrig | Secondary$ True | TriggerDescription$ When CARDNAME attacks or blocks, return it to its owner's hand at end of combat. (Return it only if it's on the battlefield.) SVar:DelayedTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigReturn | TriggerDescription$ Return CARDNAME to its owner's hand at end of combat. (Return it only if it's on the battlefield.) SVar:TrigReturn:DB$ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Hand -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -SVar:X:Count$Valid Artifact.YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/quicksilver_behemoth.jpg Oracle:Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.)\nWhen Quicksilver Behemoth attacks or blocks, return it to its owner's hand at end of combat. (Return it only if it's on the battlefield.) diff --git a/forge-gui/res/cardsfolder/q/qumulox.txt b/forge-gui/res/cardsfolder/q/qumulox.txt index dc9fec26bec..b917ee5f28d 100644 --- a/forge-gui/res/cardsfolder/q/qumulox.txt +++ b/forge-gui/res/cardsfolder/q/qumulox.txt @@ -2,8 +2,7 @@ Name:Qumulox ManaCost:6 U U Types:Creature Beast PT:5/4 +K:Affinity:Artifact K:Flying -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -SVar:X:Count$Valid Artifact.YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/qumulox.jpg Oracle:Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.)\nFlying diff --git a/forge-gui/res/cardsfolder/r/razor_golem.txt b/forge-gui/res/cardsfolder/r/razor_golem.txt index a84579714dd..efdfac7a541 100644 --- a/forge-gui/res/cardsfolder/r/razor_golem.txt +++ b/forge-gui/res/cardsfolder/r/razor_golem.txt @@ -2,9 +2,8 @@ Name:Razor Golem ManaCost:6 Types:Artifact Creature Golem PT:3/4 +K:Affinity:Plains K:Vigilance -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ Affinity for Plains (This spell costs {1} less to cast for each Plains you control.) -SVar:X:Count$Valid Plains.YouCtrl AI:RemoveDeck:Random DeckNeeds:Color$white SVar:Picture:http://www.wizards.com/global/images/magic/general/razor_golem.jpg diff --git a/forge-gui/res/cardsfolder/s/scale_of_chiss_goria.txt b/forge-gui/res/cardsfolder/s/scale_of_chiss_goria.txt index 73c5d961869..308e1b53fcc 100644 --- a/forge-gui/res/cardsfolder/s/scale_of_chiss_goria.txt +++ b/forge-gui/res/cardsfolder/s/scale_of_chiss_goria.txt @@ -2,8 +2,7 @@ Name:Scale of Chiss-Goria ManaCost:3 Types:Artifact K:Flash +K:Affinity:Artifact A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDef$ +1 | SpellDescription$ Target creature gets +0/+1 until end of turn. -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -SVar:X:Count$Valid Artifact.YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/scale_of_chiss_goria.jpg Oracle:Flash\nAffinity for artifacts (This spell costs {1} less to cast for each artifact you control.)\n{T}: Target creature gets +0/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/s/somber_hoverguard.txt b/forge-gui/res/cardsfolder/s/somber_hoverguard.txt index ee6f830a7fd..ef36b0b80fa 100644 --- a/forge-gui/res/cardsfolder/s/somber_hoverguard.txt +++ b/forge-gui/res/cardsfolder/s/somber_hoverguard.txt @@ -2,8 +2,7 @@ Name:Somber Hoverguard ManaCost:5 U Types:Creature Drone PT:3/2 +K:Affinity:Artifact K:Flying -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -SVar:X:Count$Valid Artifact.YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/somber_hoverguard.jpg Oracle:Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.)\nFlying diff --git a/forge-gui/res/cardsfolder/s/spire_golem.txt b/forge-gui/res/cardsfolder/s/spire_golem.txt index f5e67ba43e1..4468668ea0f 100644 --- a/forge-gui/res/cardsfolder/s/spire_golem.txt +++ b/forge-gui/res/cardsfolder/s/spire_golem.txt @@ -2,9 +2,8 @@ Name:Spire Golem ManaCost:6 Types:Artifact Creature Golem PT:2/4 +K:Affinity:Island K:Flying -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ Affinity for Islands (This spell costs {1} less to cast for each Island you control.) -SVar:X:Count$Valid Island.YouCtrl DeckNeeds:Color$Blue SVar:Picture:http://www.wizards.com/global/images/magic/general/spire_golem.jpg Oracle:Affinity for Islands (This spell costs {1} less to cast for each Island you control.)\nFlying diff --git a/forge-gui/res/cardsfolder/t/tangle_golem.txt b/forge-gui/res/cardsfolder/t/tangle_golem.txt index b32a10df6c4..f787340c039 100644 --- a/forge-gui/res/cardsfolder/t/tangle_golem.txt +++ b/forge-gui/res/cardsfolder/t/tangle_golem.txt @@ -2,8 +2,7 @@ Name:Tangle Golem ManaCost:7 Types:Artifact Creature Golem PT:5/4 -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ Affinity for Forests (This spell costs {1} less to cast for each Forest you control.) -SVar:X:Count$Valid Forest.YouCtrl +K:Affinity:Forest DeckNeeds:Color$Green SVar:Picture:http://www.wizards.com/global/images/magic/general/tangle_golem.jpg Oracle:Affinity for Forests (This spell costs {1} less to cast for each Forest you control.) diff --git a/forge-gui/res/cardsfolder/t/thoughtcast.txt b/forge-gui/res/cardsfolder/t/thoughtcast.txt index 5b45586da43..fcb4e554e3d 100644 --- a/forge-gui/res/cardsfolder/t/thoughtcast.txt +++ b/forge-gui/res/cardsfolder/t/thoughtcast.txt @@ -2,7 +2,6 @@ Name:Thoughtcast ManaCost:4 U Types:Sorcery A:SP$ Draw | Cost$ 4 U | NumCards$ 2 | SpellDescription$ Draw two cards. -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -SVar:X:Count$Valid Artifact.YouCtrl +K:Affinity:Artifact SVar:Picture:http://www.wizards.com/global/images/magic/general/thoughtcast.jpg Oracle:Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.)\nDraw two cards. diff --git a/forge-gui/res/cardsfolder/t/tooth_of_chiss_goria.txt b/forge-gui/res/cardsfolder/t/tooth_of_chiss_goria.txt index b74219fa38e..8328895ee47 100644 --- a/forge-gui/res/cardsfolder/t/tooth_of_chiss_goria.txt +++ b/forge-gui/res/cardsfolder/t/tooth_of_chiss_goria.txt @@ -2,8 +2,7 @@ Name:Tooth of Chiss-Goria ManaCost:3 Types:Artifact K:Flash +K:Affinity:Artifact A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | SpellDescription$ Target creature gets +1/+0 until end of turn. -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.) -SVar:X:Count$Valid Artifact.YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/tooth_of_chiss_goria.jpg Oracle:Flash\nAffinity for artifacts (This spell costs {1} less to cast for each artifact you control.)\n{T}: Target creature gets +1/+0 until end of turn. From d365167c38717266627e90cbcb997c795cae7cdc Mon Sep 17 00:00:00 2001 From: Hanmac Date: Thu, 1 Nov 2018 16:15:44 +0100 Subject: [PATCH 089/901] updated References for ReduceCost --- forge-gui/res/cardsfolder/a/ancient_stone_idol.txt | 2 +- forge-gui/res/cardsfolder/a/animar_soul_of_elements.txt | 2 +- forge-gui/res/cardsfolder/b/bedlam_reveler.txt | 2 +- forge-gui/res/cardsfolder/b/blasphemous_act.txt | 2 +- forge-gui/res/cardsfolder/c/cryptic_serpent.txt | 2 +- forge-gui/res/cardsfolder/d/draco.txt | 2 +- forge-gui/res/cardsfolder/e/emrakul_the_promised_end.txt | 4 ++-- forge-gui/res/cardsfolder/g/gearseeker_serpent.txt | 2 +- forge-gui/res/cardsfolder/g/ghalta_primal_hunger.txt | 4 ++-- forge-gui/res/cardsfolder/g/ghoultree.txt | 2 +- forge-gui/res/cardsfolder/h/herald_of_war.txt | 2 +- forge-gui/res/cardsfolder/k/karador_ghost_chieftain.txt | 2 +- forge-gui/res/cardsfolder/k/khalni_hydra.txt | 2 +- forge-gui/res/cardsfolder/l/licia_sanguine_tribune.txt | 4 ++-- forge-gui/res/cardsfolder/m/marshmist_titan.txt | 2 +- forge-gui/res/cardsfolder/m/metalwork_colossus.txt | 2 +- forge-gui/res/cardsfolder/m/mizzix_of_the_izmagnus.txt | 4 ++-- forge-gui/res/cardsfolder/n/nemesis_of_mortals.txt | 2 +- forge-gui/res/cardsfolder/p/primeval_protector.txt | 4 ++-- forge-gui/res/cardsfolder/r/rakdos_lord_of_riots.txt | 2 +- forge-gui/res/cardsfolder/s/stone_idol_trap.txt | 2 +- forge-gui/res/cardsfolder/s/stratadon.txt | 2 +- 22 files changed, 27 insertions(+), 27 deletions(-) diff --git a/forge-gui/res/cardsfolder/a/ancient_stone_idol.txt b/forge-gui/res/cardsfolder/a/ancient_stone_idol.txt index 5a6864a92ca..93d0e0b56b7 100644 --- a/forge-gui/res/cardsfolder/a/ancient_stone_idol.txt +++ b/forge-gui/res/cardsfolder/a/ancient_stone_idol.txt @@ -3,7 +3,7 @@ ManaCost:10 Types:Artifact Creature Golem PT:12/12 K:Flash -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each attacking creature. +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | References$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each attacking creature. SVar:X:Count$Valid Creature.attacking K:Trample T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, create a 6/12 colorless Construct artifact creature token with trample. diff --git a/forge-gui/res/cardsfolder/a/animar_soul_of_elements.txt b/forge-gui/res/cardsfolder/a/animar_soul_of_elements.txt index 536ceda24f4..3eaa05b56cf 100644 --- a/forge-gui/res/cardsfolder/a/animar_soul_of_elements.txt +++ b/forge-gui/res/cardsfolder/a/animar_soul_of_elements.txt @@ -6,7 +6,7 @@ K:Protection from white K:Protection from black T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a creature spell, put a +1/+1 counter on CARDNAME. SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -S:Mode$ ReduceCost | ValidCard$ Creature | Type$ Spell | Activator$ You | Amount$ X | Description$ Creature spells you cast cost 1 less to cast for each +1/+1 counter on CARDNAME. +S:Mode$ ReduceCost | ValidCard$ Creature | Type$ Spell | Activator$ You | Amount$ X | References$ X | Description$ Creature spells you cast cost 1 less to cast for each +1/+1 counter on CARDNAME. SVar:X:Count$CardCounters.P1P1 SVar:BuffedBy:Creature SVar:Picture:http://www.wizards.com/global/images/magic/general/animar_soul_of_elements.jpg diff --git a/forge-gui/res/cardsfolder/b/bedlam_reveler.txt b/forge-gui/res/cardsfolder/b/bedlam_reveler.txt index f82e7483cf3..e1c692836c4 100644 --- a/forge-gui/res/cardsfolder/b/bedlam_reveler.txt +++ b/forge-gui/res/cardsfolder/b/bedlam_reveler.txt @@ -2,7 +2,7 @@ Name:Bedlam Reveler ManaCost:6 R R Types:Creature Devil Horror PT:3/4 -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each instant and sorcery card in your graveyard. +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | References$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each instant and sorcery card in your graveyard. K:Prowess T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, discard your hand, then draw three cards. SVar:TrigDiscard:DB$ Discard | Mode$ Hand | SubAbility$ DBDraw diff --git a/forge-gui/res/cardsfolder/b/blasphemous_act.txt b/forge-gui/res/cardsfolder/b/blasphemous_act.txt index 8db0190203d..ec302ddd440 100644 --- a/forge-gui/res/cardsfolder/b/blasphemous_act.txt +++ b/forge-gui/res/cardsfolder/b/blasphemous_act.txt @@ -2,7 +2,7 @@ Name:Blasphemous Act ManaCost:8 R Types:Sorcery A:SP$ DamageAll | Cost$ 8 R | NumDmg$ 13 | ValidCards$ Creature | ValidDescription$ each creature. | SpellDescription$ CARDNAME deals 13 damage to each creature. -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each creature on the battlefield. +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | References$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each creature on the battlefield. SVar:X:Count$Valid Creature SVar:Picture:http://www.wizards.com/global/images/magic/general/blasphemous_act.jpg Oracle:This spell costs {1} less to cast for each creature on the battlefield.\nBlasphemous Act deals 13 damage to each creature. diff --git a/forge-gui/res/cardsfolder/c/cryptic_serpent.txt b/forge-gui/res/cardsfolder/c/cryptic_serpent.txt index 20e9be57e6b..91c7dcd9b9f 100644 --- a/forge-gui/res/cardsfolder/c/cryptic_serpent.txt +++ b/forge-gui/res/cardsfolder/c/cryptic_serpent.txt @@ -2,7 +2,7 @@ Name:Cryptic Serpent ManaCost:5 U U Types:Creature Serpent PT:6/5 -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each instant and sorcery card in your graveyard. +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | References$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each instant and sorcery card in your graveyard. SVar:X:Count$ValidGraveyard Instant.YouOwn,Sorcery.YouOwn DeckHints:Ability$Graveyard SVar:Picture:http://www.wizards.com/global/images/magic/general/cryptic_serpent.jpg diff --git a/forge-gui/res/cardsfolder/d/draco.txt b/forge-gui/res/cardsfolder/d/draco.txt index 5ba2727929f..46de3c8287a 100644 --- a/forge-gui/res/cardsfolder/d/draco.txt +++ b/forge-gui/res/cardsfolder/d/draco.txt @@ -3,7 +3,7 @@ ManaCost:16 Types:Artifact Creature Dragon PT:9/9 K:Flying -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ Domain — CARDNAME costs {2} less to cast for each basic land type among lands you control. +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | References$ X | EffectZone$ All | Description$ Domain — CARDNAME costs {2} less to cast for each basic land type among lands you control. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ Domain — At the beginning of your upkeep, sacrifice CARDNAME unless you pay {10}. This cost is reduced by {2} for each basic land type among lands you control. SVar:TrigSac:DB$Sacrifice | Defined$ Self | UnlessCost$ UpkeepX | UnlessPayer$ You | References$ UpkeepX SVar:X:Count$Domain/Twice diff --git a/forge-gui/res/cardsfolder/e/emrakul_the_promised_end.txt b/forge-gui/res/cardsfolder/e/emrakul_the_promised_end.txt index f59631b16b1..9431c709640 100644 --- a/forge-gui/res/cardsfolder/e/emrakul_the_promised_end.txt +++ b/forge-gui/res/cardsfolder/e/emrakul_the_promised_end.txt @@ -5,7 +5,7 @@ PT:13/13 K:Flying K:Trample K:Protection:Instant:Protection from instants -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each card type among cards in your graveyard. +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | References$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each card type among cards in your graveyard. SVar:X:Count$CardControllerTypes.Graveyard T:Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigControlPlayer | TriggerDescription$ When you cast CARDNAME, you gain control of target opponent during that player's next turn. After that turn, that player takes an extra turn. SVar:TrigControlPlayer:DB$ ControlPlayer | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | SubAbility$ DBDelTrig | RememberTargets$ True @@ -14,4 +14,4 @@ SVar:DBAddTurn:DB$ AddTurn | Defined$ Remembered | NumTurns$ 1 | SubAbility$ DBC SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/emrakul_the_promised_end.jpg -Oracle:Emrakul, the Promised End costs {1} less to cast for each card type among cards in your graveyard.\nWhen you cast Emrakul, you gain control of target opponent during that player's next turn. After that turn, that player takes an extra turn.\nFlying, trample, protection from instants \ No newline at end of file +Oracle:Emrakul, the Promised End costs {1} less to cast for each card type among cards in your graveyard.\nWhen you cast Emrakul, you gain control of target opponent during that player's next turn. After that turn, that player takes an extra turn.\nFlying, trample, protection from instants diff --git a/forge-gui/res/cardsfolder/g/gearseeker_serpent.txt b/forge-gui/res/cardsfolder/g/gearseeker_serpent.txt index 63c9d8f9e4d..cc618b3412e 100644 --- a/forge-gui/res/cardsfolder/g/gearseeker_serpent.txt +++ b/forge-gui/res/cardsfolder/g/gearseeker_serpent.txt @@ -2,7 +2,7 @@ Name:Gearseeker Serpent ManaCost:5 U U Types:Creature Serpent PT:5/6 -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each artifact you control. +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | References$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each artifact you control. A:AB$ Pump | Cost$ 5 U | KW$ HIDDEN Unblockable | SpellDescription$ CARDNAME can't be blocked this turn. SVar:X:Count$Valid Artifact.YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/gearseeker_serpent.jpg diff --git a/forge-gui/res/cardsfolder/g/ghalta_primal_hunger.txt b/forge-gui/res/cardsfolder/g/ghalta_primal_hunger.txt index df38f20346a..1254780b762 100644 --- a/forge-gui/res/cardsfolder/g/ghalta_primal_hunger.txt +++ b/forge-gui/res/cardsfolder/g/ghalta_primal_hunger.txt @@ -2,7 +2,7 @@ Name:Ghalta, Primal Hunger ManaCost:10 G G Types:Legendary Creature Elder Dinosaur K:Trample -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ CARDNAME costs {X} less to cast, where X is the total power of creatures you control. +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | References$ X | EffectZone$ All | Description$ CARDNAME costs {X} less to cast, where X is the total power of creatures you control. SVar:X:Count$SumPower_Creature.YouCtrl Oracle:Ghalta, Primal Hunger costs {X} less to cast, where X is the total power of creatures you control.\nTrample -PT:12/12 \ No newline at end of file +PT:12/12 diff --git a/forge-gui/res/cardsfolder/g/ghoultree.txt b/forge-gui/res/cardsfolder/g/ghoultree.txt index 10e295154b3..d96cccb7b92 100644 --- a/forge-gui/res/cardsfolder/g/ghoultree.txt +++ b/forge-gui/res/cardsfolder/g/ghoultree.txt @@ -2,7 +2,7 @@ Name:Ghoultree ManaCost:7 G Types:Creature Zombie Treefolk PT:10/10 -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each creature card in your graveyard. +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | References$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each creature card in your graveyard. SVar:X:Count$TypeInYourYard.Creature SVar:Picture:http://www.wizards.com/global/images/magic/general/ghoultree.jpg Oracle:Ghoultree costs {1} less to cast for each creature card in your graveyard. diff --git a/forge-gui/res/cardsfolder/h/herald_of_war.txt b/forge-gui/res/cardsfolder/h/herald_of_war.txt index c135f4d8d40..c2037cce2b2 100644 --- a/forge-gui/res/cardsfolder/h/herald_of_war.txt +++ b/forge-gui/res/cardsfolder/h/herald_of_war.txt @@ -5,7 +5,7 @@ PT:3/3 K:Flying T:Mode$ Attacks | ValidCard$ Creature.Self | Execute$ HeraldsWarCry | TriggerDescription$ Whenever CARDNAME attacks, put a +1/+1 counter on it. SVar:HeraldsWarCry:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -S:Mode$ ReduceCost | ValidCard$ Angel,Human | Type$ Spell | Activator$ You | Amount$ X | Description$ Angels and Humans you cast cost 1 less for each +1/+1 counter on CARDNAME. +S:Mode$ ReduceCost | ValidCard$ Angel,Human | Type$ Spell | Activator$ You | Amount$ X | References$ X | Description$ Angels and Humans you cast cost 1 less for each +1/+1 counter on CARDNAME. SVar:X:Count$CardCounters.P1P1 SVar:HasAttackEffect:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/herald_of_war.jpg diff --git a/forge-gui/res/cardsfolder/k/karador_ghost_chieftain.txt b/forge-gui/res/cardsfolder/k/karador_ghost_chieftain.txt index ec28eb71c43..78a92a1b8d1 100644 --- a/forge-gui/res/cardsfolder/k/karador_ghost_chieftain.txt +++ b/forge-gui/res/cardsfolder/k/karador_ghost_chieftain.txt @@ -2,7 +2,7 @@ Name:Karador, Ghost Chieftain ManaCost:5 W B G Types:Legendary Creature Centaur Spirit PT:3/4 -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each creature card in your graveyard. +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | References$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each creature card in your graveyard. SVar:X:Count$ValidGraveyard Creature.YouCtrl S:Mode$ Continuous | Affected$ Creature.nonLand+YouCtrl | Condition$ PlayerTurn | MayPlay$ True | MayPlayLimit$ 1 | EffectZone$ Battlefield | AffectedZone$ Graveyard | Description$ During each of your turns, you may cast one creature card from your graveyard. SVar:Picture:http://www.wizards.com/global/images/magic/general/karador_ghost_chieftain.jpg diff --git a/forge-gui/res/cardsfolder/k/khalni_hydra.txt b/forge-gui/res/cardsfolder/k/khalni_hydra.txt index 375503a61c6..2e8f87eb67a 100644 --- a/forge-gui/res/cardsfolder/k/khalni_hydra.txt +++ b/forge-gui/res/cardsfolder/k/khalni_hydra.txt @@ -3,7 +3,7 @@ ManaCost:G G G G G G G G Types:Creature Hydra PT:8/8 K:Trample -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Color$ G | Amount$ X | EffectZone$ All | Description$ CARDNAME costs {G} less to cast for each green creature you control. +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Color$ G | Amount$ X | References$ X | EffectZone$ All | Description$ CARDNAME costs {G} less to cast for each green creature you control. SVar:X:Count$Valid Creature.Green+YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/khalni_hydra.jpg Oracle:Khalni Hydra costs {G} less to cast for each green creature you control.\nTrample diff --git a/forge-gui/res/cardsfolder/l/licia_sanguine_tribune.txt b/forge-gui/res/cardsfolder/l/licia_sanguine_tribune.txt index 1e068d8549d..8f9f661e2f5 100644 --- a/forge-gui/res/cardsfolder/l/licia_sanguine_tribune.txt +++ b/forge-gui/res/cardsfolder/l/licia_sanguine_tribune.txt @@ -2,10 +2,10 @@ Name:Licia, Sanguine Tribune ManaCost:5 R W B Types:Legendary Creature Vampire Soldier PT:4/4 -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each life you gained this turn. +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | References$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each life you gained this turn. K:First Strike K:Lifelink A:AB$ PutCounter | Cost$ PayLife<5> | CounterType$ P1P1 | CounterNum$ 3 | PlayerTurn$ True | ActivationLimit$ 1 | SpellDescription$ Put 3 +1/+1 counters on CARDNAME. Activate this ability only during your turn, and only once each turn. SVar:X:Count$LifeYouGainedThisTurn SVar:Picture:http://www.wizards.com/global/images/magic/general/licia_sanguine_tribune.jpg -Oracle:Licia, Sanguine Tribute costs {1} less to cast for each life you gained this turn.\nFirst strike, lifelink\nPay 5 life: Put 3 +1/+1 counters on Licia. Activate this ability only during your turn, and only once each turn. \ No newline at end of file +Oracle:Licia, Sanguine Tribute costs {1} less to cast for each life you gained this turn.\nFirst strike, lifelink\nPay 5 life: Put 3 +1/+1 counters on Licia. Activate this ability only during your turn, and only once each turn. diff --git a/forge-gui/res/cardsfolder/m/marshmist_titan.txt b/forge-gui/res/cardsfolder/m/marshmist_titan.txt index e920f20f468..3e98774eaca 100644 --- a/forge-gui/res/cardsfolder/m/marshmist_titan.txt +++ b/forge-gui/res/cardsfolder/m/marshmist_titan.txt @@ -2,7 +2,7 @@ Name:Marshmist Titan ManaCost:6 B Types:Creature Giant PT:4/5 -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ CARDNAME costs {X} less to cast, where X is your devotion to black. +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | References$ X | EffectZone$ All | Description$ CARDNAME costs {X} less to cast, where X is your devotion to black. SVar:X:Count$Devotion.Black SVar:Picture:http://www.wizards.com/global/images/magic/general/marshmist_titan.jpg Oracle:Marshmist Titan costs {X} less to cast, where X is your devotion to black. (Each {B} in the mana costs of permanents you control counts toward your devotion to black.) diff --git a/forge-gui/res/cardsfolder/m/metalwork_colossus.txt b/forge-gui/res/cardsfolder/m/metalwork_colossus.txt index 574a1406b13..18b0df6cdf1 100644 --- a/forge-gui/res/cardsfolder/m/metalwork_colossus.txt +++ b/forge-gui/res/cardsfolder/m/metalwork_colossus.txt @@ -2,7 +2,7 @@ Name:Metalwork Colossus ManaCost:11 Types:Artifact Creature Construct PT:10/10 -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ CARDNAME costs {X} less to cast, where X is the total converted mana cost of noncreature artifacts you control. +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | References$ X | EffectZone$ All | Description$ CARDNAME costs {X} less to cast, where X is the total converted mana cost of noncreature artifacts you control. A:AB$ ChangeZone | Cost$Sac<2/Artifact> | Origin$ Graveyard | Destination$ Hand | ActivationZone$ Graveyard | SpellDescription$ Return CARDNAME from your graveyard to your hand. SVar:DiscardMe:1 SVar:X:Count$SumCMC_Artifact.nonCreature+YouCtrl diff --git a/forge-gui/res/cardsfolder/m/mizzix_of_the_izmagnus.txt b/forge-gui/res/cardsfolder/m/mizzix_of_the_izmagnus.txt index e347b916f93..d35731c5246 100644 --- a/forge-gui/res/cardsfolder/m/mizzix_of_the_izmagnus.txt +++ b/forge-gui/res/cardsfolder/m/mizzix_of_the_izmagnus.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Goblin Wizard PT:2/2 T:Mode$ SpellCast | ValidCard$ Instant.cmcGTX,Sorcery.cmcGTX | ValidActivatingPlayer$ You | Execute$ TrigExperience | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast an instant or sorcery spell with converted mana cost greater than the number of experience counters you have, you get an experience counter. SVar:TrigExperience:DB$ PutCounter | Defined$ You | CounterType$ Experience | CounterNum$ 1 -S:Mode$ ReduceCost | ValidCard$ Instant,Sorcery | Type$ Spell | Activator$ You | Amount$ X | Description$ Instant and sorcery spells you cast cost {1} less to cast for each experience counter you have. +S:Mode$ ReduceCost | ValidCard$ Instant,Sorcery | Type$ Spell | Activator$ You | Amount$ X | References$ X | Description$ Instant and sorcery spells you cast cost {1} less to cast for each experience counter you have. SVar:X:Count$YourCountersExperience SVar:Picture:http://www.wizards.com/global/images/magic/general/mizzix_of_the_izmagnus.jpg -Oracle:Whenever you cast an instant or sorcery spell with converted mana cost greater than the number of experience counters you have, you get an experience counter.\nInstant and sorcery spells you cast cost {1} less to cast for each experience counter you have. \ No newline at end of file +Oracle:Whenever you cast an instant or sorcery spell with converted mana cost greater than the number of experience counters you have, you get an experience counter.\nInstant and sorcery spells you cast cost {1} less to cast for each experience counter you have. diff --git a/forge-gui/res/cardsfolder/n/nemesis_of_mortals.txt b/forge-gui/res/cardsfolder/n/nemesis_of_mortals.txt index b0eae081234..a3c16bb7d54 100644 --- a/forge-gui/res/cardsfolder/n/nemesis_of_mortals.txt +++ b/forge-gui/res/cardsfolder/n/nemesis_of_mortals.txt @@ -2,7 +2,7 @@ Name:Nemesis of Mortals ManaCost:4 G G Types:Creature Snake PT:5/5 -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each creature card in your graveyard. +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | References$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each creature card in your graveyard. K:Monstrosity:5:7 G G:X SVar:X:Count$ValidGraveyard Creature.YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/nemesis_of_mortals.jpg diff --git a/forge-gui/res/cardsfolder/p/primeval_protector.txt b/forge-gui/res/cardsfolder/p/primeval_protector.txt index 268a11a55dd..28e225350d1 100644 --- a/forge-gui/res/cardsfolder/p/primeval_protector.txt +++ b/forge-gui/res/cardsfolder/p/primeval_protector.txt @@ -2,11 +2,11 @@ Name:Primeval Protector ManaCost:10 G Types:Creature Avatar PT:10/10 -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each creature your opponents control. +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | References$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each creature your opponents control. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPutCounters | TriggerDescription$ When CARDNAME enters the battlefield, put a +1/+1 counter on each other creature you control. SVar:TrigPutCounters:DB$ PutCounterAll | ValidCards$ Creature.YouCtrl+Other | CounterType$ P1P1 | CounterNum$ 1 SVar:X:Count$Valid Creature.OppCtrl SVar:PlayMain1:TRUE DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/primeval_protector.jpg -Oracle:Primeval Protector costs {1} less to cast for each creature your opponents control.\nWhen Primeval Protector enters the battlefield, put a +1/+1 counter on each other creature you control. \ No newline at end of file +Oracle:Primeval Protector costs {1} less to cast for each creature your opponents control.\nWhen Primeval Protector enters the battlefield, put a +1/+1 counter on each other creature you control. diff --git a/forge-gui/res/cardsfolder/r/rakdos_lord_of_riots.txt b/forge-gui/res/cardsfolder/r/rakdos_lord_of_riots.txt index bde2081c918..50c49d9f984 100644 --- a/forge-gui/res/cardsfolder/r/rakdos_lord_of_riots.txt +++ b/forge-gui/res/cardsfolder/r/rakdos_lord_of_riots.txt @@ -5,7 +5,7 @@ PT:6/6 K:Flying K:Trample S:Mode$ CantBeCast | ValidCard$ Card.Self | CheckSVar$ X | SVarCompare$ EQ0 | EffectZone$ All | Description$ You can't cast CARDNAME unless an opponent lost life this turn. -S:Mode$ ReduceCost | ValidCard$ Creature | Type$ Spell | Activator$ You | Amount$ X | Description$ Creature spells you cast cost {1} less to cast for each 1 life your opponents have lost this turn. +S:Mode$ ReduceCost | ValidCard$ Creature | Type$ Spell | Activator$ You | Amount$ X | References$ X | Description$ Creature spells you cast cost {1} less to cast for each 1 life your opponents have lost this turn. SVar:X:Count$LifeOppsLostThisTurn SVar:Picture:http://www.wizards.com/global/images/magic/general/rakdos_lord_of_riots.jpg Oracle:You can't cast Rakdos, Lord of Riots unless an opponent lost life this turn.\nFlying, trample\nCreature spells you cast cost {1} less to cast for each 1 life your opponents have lost this turn. diff --git a/forge-gui/res/cardsfolder/s/stone_idol_trap.txt b/forge-gui/res/cardsfolder/s/stone_idol_trap.txt index 28c07b4b2de..7b168a63882 100644 --- a/forge-gui/res/cardsfolder/s/stone_idol_trap.txt +++ b/forge-gui/res/cardsfolder/s/stone_idol_trap.txt @@ -2,7 +2,7 @@ Name:Stone Idol Trap ManaCost:5 R Types:Instant Trap A:SP$ Token | Cost$ 5 R | TokenAmount$ 1 | TokenName$ Construct | TokenTypes$ Artifact,Creature,Construct | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 6 | TokenToughness$ 12 | AtEOT$ YourExile | TokenKeywords$ Trample | SpellDescription$ Create a 6/12 colorless Construct artifact creature token with trample. Exile it at the beginning of your next end step. -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each attacking creature. +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | References$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each attacking creature. SVar:X:Count$Valid Creature.attacking SVar:Picture:http://www.wizards.com/global/images/magic/general/stone_idol_trap.jpg Oracle:Stone Idol Trap costs {1} less to cast for each attacking creature.\nCreate a 6/12 colorless Construct artifact creature token with trample. Exile it at the beginning of your next end step. diff --git a/forge-gui/res/cardsfolder/s/stratadon.txt b/forge-gui/res/cardsfolder/s/stratadon.txt index 75644141cb8..77873af40ec 100644 --- a/forge-gui/res/cardsfolder/s/stratadon.txt +++ b/forge-gui/res/cardsfolder/s/stratadon.txt @@ -3,7 +3,7 @@ ManaCost:10 Types:Artifact Creature Beast PT:5/5 K:Trample -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ Domain — CARDNAME costs {1} less to cast for each basic land type among lands you control. +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | References$ X | EffectZone$ All | Description$ Domain — CARDNAME costs {1} less to cast for each basic land type among lands you control. SVar:X:Count$Domain AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/stratadon.jpg From 6ac61e441e14710a5ec73e9415a3e85c8a3cd211 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 1 Nov 2018 18:58:12 +0300 Subject: [PATCH 090/901] - Add AILogic$ ManaRitual and AINoRecursiveCheck$ True to some Mana Ritual cards to avoid stack overflow when the AI is running recursive tests on them. --- forge-gui/res/cardsfolder/a/apex_of_power.txt | 2 +- forge-gui/res/cardsfolder/c/chandra_torch_of_defiance.txt | 2 +- forge-gui/res/cardsfolder/p/petalmane_baku.txt | 2 +- forge-gui/res/cardsfolder/s/satyr_hedonist.txt | 2 +- forge-gui/res/cardsfolder/t/the_first_eruption.txt | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/forge-gui/res/cardsfolder/a/apex_of_power.txt b/forge-gui/res/cardsfolder/a/apex_of_power.txt index a9580c21af1..3ea3591a635 100644 --- a/forge-gui/res/cardsfolder/a/apex_of_power.txt +++ b/forge-gui/res/cardsfolder/a/apex_of_power.txt @@ -5,5 +5,5 @@ A:SP$ Mill | Cost$ 7 R R R | Origin$ Library | Destination$ Exile | NumCards$ 7 SVar:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | StaticAbilities$ EffSModeContinuous | SubAbility$ DBCleanup | ForgetOnMoved$ Exile SVar:EffSModeContinuous:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.nonLand+IsRemembered | AffectedZone$ Exile | Description$ You may cast nonland cards exiled this way. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBMana -SVar:DBMana:DB$ Mana | Produced$ Any | Amount$ 10 | ConditionDefined$ Self | ConditionPresent$ Card.wasCastFromHand | ConditionCompare$ EQ1 +SVar:DBMana:DB$ Mana | Produced$ Any | Amount$ 10 | ConditionDefined$ Self | ConditionPresent$ Card.wasCastFromHand | ConditionCompare$ EQ1 | AILogic$ ManaRitual | AINoRecursiveCheck$ True Oracle:Exile the top seven cards of your library. Until end of turn, you may cast nonland cards exiled this way.\nIf this spell was cast from your hand, add ten mana of any one color. diff --git a/forge-gui/res/cardsfolder/c/chandra_torch_of_defiance.txt b/forge-gui/res/cardsfolder/c/chandra_torch_of_defiance.txt index 8ce11d920c0..2c657677e40 100644 --- a/forge-gui/res/cardsfolder/c/chandra_torch_of_defiance.txt +++ b/forge-gui/res/cardsfolder/c/chandra_torch_of_defiance.txt @@ -6,7 +6,7 @@ A:AB$ Mill | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | Defined$ You | N SVar:DBPlay:DB$ Play | Valid$ Card.nonLand+IsImprinted | ValidZone$ Exile | Controller$ You | Optional$ True | Amount$ All | RememberPlayed$ True | ShowCardToActivator$ True | SubAbility$ DBDamage SVar:DBDamage:DB$ DealDamage | Defined$ Player.Opponent | NumDmg$ 2 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ0 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True -A:AB$ Mana | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | Produced$ R | Amount$ 2 | AILogic$ ManaRitual | SpellDescription$ Add {R}{R}. +A:AB$ Mana | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | Produced$ R | Amount$ 2 | AILogic$ ManaRitual | AINoRecursiveCheck$ True | SpellDescription$ Add {R}{R}. A:AB$ DealDamage | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target creature. A:AB$ Effect | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | Name$ Emblem - Chandra, Torch of Defiance | Image$ emblem_chandra_torch_of_defiance | Triggers$ TrigSpellCast | SVars$ EffSpellCast | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "Whenever you cast a spell, this emblem deals 5 damage to any target." SVar:TrigSpellCast:Mode$ SpellCast | ValidActivatingPlayer$ You | Execute$ EffSpellCast | TriggerDescription$ Whenever you cast a spell, this emblem deals 5 damage to any target. diff --git a/forge-gui/res/cardsfolder/p/petalmane_baku.txt b/forge-gui/res/cardsfolder/p/petalmane_baku.txt index d77be0d23e2..07bbc0fb932 100644 --- a/forge-gui/res/cardsfolder/p/petalmane_baku.txt +++ b/forge-gui/res/cardsfolder/p/petalmane_baku.txt @@ -5,7 +5,7 @@ PT:1/2 T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, you may put a ki counter on CARDNAME. SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ KI | CounterNum$ 1 #ChosenX SVar created by Cost payment -A:AB$ Mana | Cost$ 1 SubCounter | Produced$ Any | Amount$ ChosenX | References$ X | AILogic$ ManaRitual | SpellDescription$ Add X mana of any one color. +A:AB$ Mana | Cost$ 1 SubCounter | Produced$ Any | Amount$ ChosenX | References$ X | AILogic$ ManaRitual | AINoRecursiveCheck$ True | SpellDescription$ Add X mana of any one color. SVar:X:XChoice AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane diff --git a/forge-gui/res/cardsfolder/s/satyr_hedonist.txt b/forge-gui/res/cardsfolder/s/satyr_hedonist.txt index cbe6e2823bd..31fb6e28e8a 100644 --- a/forge-gui/res/cardsfolder/s/satyr_hedonist.txt +++ b/forge-gui/res/cardsfolder/s/satyr_hedonist.txt @@ -2,6 +2,6 @@ Name:Satyr Hedonist ManaCost:1 G Types:Creature Satyr PT:2/1 -A:AB$ Mana | Cost$ R Sac<1/CARDNAME> | Produced$ R | Amount$ 3 | AILogic$ ManaRitual | SpellDescription$ Add {R}{R}{R}. +A:AB$ Mana | Cost$ R Sac<1/CARDNAME> | Produced$ R | Amount$ 3 | AILogic$ ManaRitual | AINoRecursiveCheck$ True | SpellDescription$ Add {R}{R}{R}. SVar:Picture:http://www.wizards.com/global/images/magic/general/satyr_hedonist.jpg Oracle:{R}, Sacrifice Satyr Hedonist: Add {R}{R}{R}. diff --git a/forge-gui/res/cardsfolder/t/the_first_eruption.txt b/forge-gui/res/cardsfolder/t/the_first_eruption.txt index 3f1137121c6..9ce6ea79987 100644 --- a/forge-gui/res/cardsfolder/t/the_first_eruption.txt +++ b/forge-gui/res/cardsfolder/t/the_first_eruption.txt @@ -3,7 +3,7 @@ ManaCost:2 R Types:Enchantment Saga K:Saga:3:TrigDamageAll,TrigMana,TrigSac SVar:TrigDamageAll:DB$ DamageAll | NumDmg$ 1 | ValidCards$ Creature.withoutFlying | ValidDescription$ Each creature without flying. | SpellDescription$ CARDNAME deals 1 damage to each creature without flying. -SVar:TrigMana:DB$ Mana | Produced$ R | Amount$ 2 | AILogic$ ManaRitual | SpellDescription$ Add {R}{R}. +SVar:TrigMana:DB$ Mana | Produced$ R | Amount$ 2 | AILogic$ ManaRitual | AINoRecursiveCheck$ True | SpellDescription$ Add {R}{R}. SVar:TrigSac:DB$ Sacrifice | SacValid$ Mountain | RememberSacrificed$ True | StackDescription$ SpellDescription | SubAbility$ DBDamageAll | SpellDescription$ Sacrifice a Mountain. If you do, CARDNAME deals 3 damage to each creature. SVar:DBDamageAll:DB$ DamageAll | NumDmg$ 3 | ValidCards$ Creature | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | References$ X | StackDescription$ None | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True From 7765ff8b33ff86ef461838f86dfcb59132830812 Mon Sep 17 00:00:00 2001 From: Pedro Ferreira Date: Tue, 30 Oct 2018 23:14:28 +0100 Subject: [PATCH 091/901] Add option to download missing card art on the fly --- forge-gui-android/src/forge/app/Main.java | 10 +++ .../src/main/java/forge/CachedCardImage.java | 7 +- .../src/main/java/forge/GuiDesktop.java | 12 ++-- .../main/java/forge/gui/CardPicturePanel.java | 5 +- .../java/forge/util/SwingImageFetcher.java | 57 +++++++++++++++ forge-gui-ios/src/forge/ios/Main.java | 9 +++ forge-gui-mobile-dev/src/forge/app/Main.java | 11 ++- .../src/forge/CachedCardImage.java | 40 +++++++++++ forge-gui-mobile/src/forge/GuiMobile.java | 12 ++-- .../src/forge/card/CardRenderer.java | 46 ++++++++++-- .../forge/screens/settings/SettingsPage.java | 4 ++ .../src/forge/util/LibGDXImageFetcher.java | 62 ++++++++++++++++ .../java/forge/interfaces/IDeviceAdapter.java | 5 ++ .../main/java/forge/interfaces/IGuiBase.java | 2 + .../main/java/forge/util}/ImageFetcher.java | 70 ++++--------------- 15 files changed, 277 insertions(+), 75 deletions(-) create mode 100644 forge-gui-desktop/src/main/java/forge/util/SwingImageFetcher.java create mode 100644 forge-gui-mobile/src/forge/CachedCardImage.java create mode 100644 forge-gui-mobile/src/forge/util/LibGDXImageFetcher.java rename {forge-gui-desktop/src/main/java/forge => forge-gui/src/main/java/forge/util}/ImageFetcher.java (67%) diff --git a/forge-gui-android/src/forge/app/Main.java b/forge-gui-android/src/forge/app/Main.java index c235fb01ef2..bf4c73e0e4f 100644 --- a/forge-gui-android/src/forge/app/Main.java +++ b/forge-gui-android/src/forge/app/Main.java @@ -9,6 +9,8 @@ import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.res.Configuration; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; @@ -28,6 +30,8 @@ import forge.util.FileUtil; import forge.util.ThreadUtil; import java.io.File; +import java.io.InputStream; +import java.io.OutputStream; import java.util.concurrent.Callable; public class Main extends AndroidApplication { @@ -243,5 +247,11 @@ public class Main extends AndroidApplication { } }); } + + @Override + public void convertToJPEG(InputStream input, OutputStream output) { + Bitmap bmp = BitmapFactory.decodeStream(input); + bmp.compress(Bitmap.CompressFormat.JPEG, 100, output); + } } } diff --git a/forge-gui-desktop/src/main/java/forge/CachedCardImage.java b/forge-gui-desktop/src/main/java/forge/CachedCardImage.java index 8a34907f3d2..67c57a1d1bd 100644 --- a/forge-gui-desktop/src/main/java/forge/CachedCardImage.java +++ b/forge-gui-desktop/src/main/java/forge/CachedCardImage.java @@ -4,6 +4,9 @@ import java.awt.image.BufferedImage; import forge.game.card.CardView; import forge.game.player.PlayerView; +import forge.util.ImageFetcher; +import forge.util.SwingImageFetcher; + public abstract class CachedCardImage implements ImageFetcher.Callback { final CardView card; @@ -11,6 +14,8 @@ public abstract class CachedCardImage implements ImageFetcher.Callback { final int width; final int height; + static final SwingImageFetcher fetcher = new SwingImageFetcher(); + public CachedCardImage(final CardView card, final Iterable viewers, final int width, final int height) { this.card = card; this.viewers = viewers; @@ -19,7 +24,7 @@ public abstract class CachedCardImage implements ImageFetcher.Callback { BufferedImage image = ImageCache.getImageNoDefault(card, viewers, width, height); if (image == null) { String key = card.getCurrentState().getImageKey(viewers); - ImageFetcher.fetchImage(card, key, this); + fetcher.fetchImage(key, this); } } diff --git a/forge-gui-desktop/src/main/java/forge/GuiDesktop.java b/forge-gui-desktop/src/main/java/forge/GuiDesktop.java index 6e4e7f7385a..ae3bc960403 100644 --- a/forge-gui-desktop/src/main/java/forge/GuiDesktop.java +++ b/forge-gui-desktop/src/main/java/forge/GuiDesktop.java @@ -23,10 +23,7 @@ import forge.sound.*; import forge.toolbox.FOptionPane; import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinImage; -import forge.util.BuildInfo; -import forge.util.Callback; -import forge.util.FileUtil; -import forge.util.OperatingSystem; +import forge.util.*; import org.apache.commons.lang3.StringUtils; import javax.swing.*; @@ -42,6 +39,8 @@ import java.util.Collection; import java.util.List; public class GuiDesktop implements IGuiBase { + private ImageFetcher imageFetcher = new SwingImageFetcher(); + @Override public boolean isRunningOnDesktop() { return true; @@ -63,6 +62,11 @@ public class GuiDesktop implements IGuiBase { "../forge-gui/" : ""; } + @Override + public ImageFetcher getImageFetcher() { + return imageFetcher; + } + @Override public void invokeInEdtNow(final Runnable proc) { proc.run(); diff --git a/forge-gui-desktop/src/main/java/forge/gui/CardPicturePanel.java b/forge-gui-desktop/src/main/java/forge/gui/CardPicturePanel.java index 17b1d5ae1d7..17cf49e6e0a 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/CardPicturePanel.java +++ b/forge-gui-desktop/src/main/java/forge/gui/CardPicturePanel.java @@ -24,8 +24,9 @@ import java.awt.image.WritableRaster; import javax.swing.JPanel; +import forge.GuiBase; import forge.ImageCache; -import forge.ImageFetcher; +import forge.util.ImageFetcher; import forge.ImageKeys; import forge.game.card.CardView.CardStateView; import forge.item.InventoryItem; @@ -115,7 +116,7 @@ public final class CardPicturePanel extends JPanel implements ImageFetcher.Callb CardStateView card = (CardStateView) displayed; BufferedImage image = ImageCache.getOriginalImage(card.getImageKey(), false); if (image == null) { - ImageFetcher.fetchImage(card.getCard(), card.getImageKey(), this); + GuiBase.getInterface().getImageFetcher().fetchImage(card.getImageKey(), this); } return FImageUtil.getImage((CardStateView) displayed); } diff --git a/forge-gui-desktop/src/main/java/forge/util/SwingImageFetcher.java b/forge-gui-desktop/src/main/java/forge/util/SwingImageFetcher.java new file mode 100644 index 00000000000..7949a3e1f10 --- /dev/null +++ b/forge-gui-desktop/src/main/java/forge/util/SwingImageFetcher.java @@ -0,0 +1,57 @@ +package forge.util; + +import javax.imageio.ImageIO; +import javax.swing.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.net.URL; + +public class SwingImageFetcher extends ImageFetcher { + + @Override + protected Runnable getDownloadTask(String[] downloadUrls, String destPath, Runnable notifyObservers) { + return new SwingDownloadTask(downloadUrls, destPath, notifyObservers); + } + + private static class SwingDownloadTask implements Runnable { + private final String[] downloadUrls; + private final String destPath; + private final Runnable notifyObservers; + + public SwingDownloadTask(String[] downloadUrls, String destPath, Runnable notifyObservers) { + this.downloadUrls = downloadUrls; + this.destPath = destPath; + this.notifyObservers = notifyObservers; + } + + private void doFetch(String urlToDownload) throws IOException { + URL url = new URL(urlToDownload); + System.out.println("Attempting to fetch: " + url); + java.net.URLConnection c = url.openConnection(); + c.setRequestProperty("User-Agent", ""); + BufferedImage image = ImageIO.read(c.getInputStream()); + // First, save to a temporary file so that nothing tries to read + // a partial download. + File destFile = new File(destPath + ".tmp"); + destFile.mkdirs(); + ImageIO.write(image, "jpg", destFile); + // Now, rename it to the correct name. + destFile.renameTo(new File(destPath)); + System.out.println("Saved image to " + destPath); + SwingUtilities.invokeLater(notifyObservers); + } + + public void run() { + for (String urlToDownload : downloadUrls) { + try { + doFetch(urlToDownload); + break; + } catch (IOException e) { + System.out.println("Failed to download card [" + destPath + "] image: " + e.getMessage()); + } + } + } + } + +} diff --git a/forge-gui-ios/src/forge/ios/Main.java b/forge-gui-ios/src/forge/ios/Main.java index cd1f569eca0..bad9865e574 100644 --- a/forge-gui-ios/src/forge/ios/Main.java +++ b/forge-gui-ios/src/forge/ios/Main.java @@ -13,6 +13,10 @@ import org.robovm.apple.foundation.NSAutoreleasePool; import org.robovm.apple.uikit.UIApplication; import org.robovm.apple.uikit.UIPasteboard; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + public class Main extends IOSApplication.Delegate { @Override @@ -94,5 +98,10 @@ public class Main extends IOSApplication.Delegate { public void exit() { // Not possible on iOS } + + @Override + public void convertToJPEG(InputStream input, OutputStream output) throws IOException { + + } } } \ No newline at end of file diff --git a/forge-gui-mobile-dev/src/forge/app/Main.java b/forge-gui-mobile-dev/src/forge/app/Main.java index 85c0ed08db0..d5a932cefda 100644 --- a/forge-gui-mobile-dev/src/forge/app/Main.java +++ b/forge-gui-mobile-dev/src/forge/app/Main.java @@ -13,9 +13,10 @@ import forge.util.RestartUtil; import forge.util.Utils; import org.apache.commons.cli.*; +import javax.imageio.ImageIO; import java.awt.*; -import java.io.File; -import java.io.IOException; +import java.awt.image.BufferedImage; +import java.io.*; public class Main { public static void main(String[] args) { @@ -162,5 +163,11 @@ public class Main { public void preventSystemSleep(boolean preventSleep) { OperatingSystem.preventSystemSleep(preventSleep); } + + @Override + public void convertToJPEG(InputStream input, OutputStream output) throws IOException { + BufferedImage image = ImageIO.read(input); + ImageIO.write(image, "jpg", output); + } } } diff --git a/forge-gui-mobile/src/forge/CachedCardImage.java b/forge-gui-mobile/src/forge/CachedCardImage.java new file mode 100644 index 00000000000..bb468f27e44 --- /dev/null +++ b/forge-gui-mobile/src/forge/CachedCardImage.java @@ -0,0 +1,40 @@ +package forge; + +import com.badlogic.gdx.graphics.Texture; +import forge.assets.ImageCache; +import forge.game.card.CardView; +import forge.item.InventoryItem; +import forge.util.ImageFetcher; + +public abstract class CachedCardImage implements ImageFetcher.Callback { + protected final String key; + static final ImageFetcher fetcher = GuiBase.getInterface().getImageFetcher(); + + public CachedCardImage(final CardView card) { + key = card.getCurrentState().getImageKey(); + fetch(); + } + + public CachedCardImage(final InventoryItem ii) { + key = ii.getImageKey(false); + fetch(); + } + + public CachedCardImage(String key) { + this.key = key; + fetch(); + } + + public void fetch() { + Texture image = ImageCache.getImage(key, false); + if (image == null) { + fetcher.fetchImage(key, this); + } + } + + public Texture getImage() { + return ImageCache.getImage(key, true); + } + + public abstract void onImageFetched(); +} diff --git a/forge-gui-mobile/src/forge/GuiMobile.java b/forge-gui-mobile/src/forge/GuiMobile.java index 0d5bb9e1552..8cea9560f78 100644 --- a/forge-gui-mobile/src/forge/GuiMobile.java +++ b/forge-gui-mobile/src/forge/GuiMobile.java @@ -37,14 +37,11 @@ import forge.sound.IAudioClip; import forge.sound.IAudioMusic; import forge.toolbox.FOptionPane; import forge.toolbox.GuiChoose; -import forge.util.Callback; -import forge.util.FileUtil; -import forge.util.ThreadUtil; -import forge.util.WaitCallback; -import forge.util.WaitRunnable; +import forge.util.*; public class GuiMobile implements IGuiBase { private final String assetsDir; + private ImageFetcher imageFetcher = new LibGDXImageFetcher(); public GuiMobile(final String assetsDir0) { assetsDir = assetsDir0; @@ -70,6 +67,11 @@ public class GuiMobile implements IGuiBase { return assetsDir; } + @Override + public ImageFetcher getImageFetcher() { + return imageFetcher; + } + @Override public void invokeInEdtNow(final Runnable proc) { proc.run(); diff --git a/forge-gui-mobile/src/forge/card/CardRenderer.java b/forge-gui-mobile/src/forge/card/CardRenderer.java index cc82751f248..c39781e0503 100644 --- a/forge-gui-mobile/src/forge/card/CardRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardRenderer.java @@ -15,6 +15,7 @@ import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator; import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator.FreeTypeFontParameter; import com.badlogic.gdx.graphics.glutils.PixmapTextureData; import com.badlogic.gdx.utils.Array; +import forge.CachedCardImage; import forge.FThreads; import forge.Graphics; import forge.StaticData; @@ -28,6 +29,7 @@ import forge.game.card.CardView.CardStateView; import forge.game.keyword.Keyword; import forge.game.card.CounterType; import forge.item.IPaperCard; +import forge.item.InventoryItem; import forge.item.PaperCard; import forge.model.FModel; import forge.properties.ForgeConstants; @@ -51,6 +53,34 @@ public class CardRenderer { BehindVert } + // class that simplifies the callback logic of CachedCardImage + static class RendererCachedCardImage extends CachedCardImage { + boolean clearCardArtCache = false; + + public RendererCachedCardImage(CardView card, boolean clearArtCache) { + super(card); + this.clearCardArtCache = clearArtCache; + } + + public RendererCachedCardImage(InventoryItem ii, boolean clearArtCache) { + super(ii); + this.clearCardArtCache = clearArtCache; + } + + public RendererCachedCardImage(String key, boolean clearArtCache) { + super(key); + this.clearCardArtCache = clearArtCache; + } + + @Override + public void onImageFetched() { + ImageCache.clear(); + if (clearCardArtCache) { + cardArtCache.remove(key); + } + } + } + private static final FSkinFont NAME_FONT = FSkinFont.get(16); public static final float NAME_BOX_TINT = 0.2f; public static final float TEXT_BOX_TINT = 0.1f; @@ -124,7 +154,7 @@ public class CardRenderer { public static FImageComplex getCardArt(String imageKey, boolean isSplitCard, boolean isHorizontalCard, boolean isAftermathCard) { FImageComplex cardArt = cardArtCache.get(imageKey); if (cardArt == null) { - Texture image = ImageCache.getImage(imageKey, true); + Texture image = new RendererCachedCardImage(imageKey, true).getImage(); if (image != null) { if (image == ImageCache.defaultImage) { cardArt = CardImageRenderer.forgeArt; @@ -186,7 +216,13 @@ public class CardRenderer { public static FImageComplex getAftermathSecondCardArt(String imageKey) { FImageComplex cardArt = cardArtCache.get("Aftermath_second_"+imageKey); if (cardArt == null) { - Texture image = ImageCache.getImage(imageKey, true); + Texture image = new CachedCardImage(imageKey) { + @Override + public void onImageFetched() { + ImageCache.clear(); + cardArtCache.remove("Aftermath_second_" + imageKey); + } + }.getImage(); if (image != null) { if (image == ImageCache.defaultImage) { cardArt = CardImageRenderer.forgeArt; @@ -347,7 +383,8 @@ public class CardRenderer { } public static void drawCard(Graphics g, IPaperCard pc, float x, float y, float w, float h, CardStackPosition pos) { - Texture image = ImageCache.getImage(pc); + Texture image = new RendererCachedCardImage(pc, false).getImage(); + if (image != null) { if (image == ImageCache.defaultImage) { CardImageRenderer.drawCardImage(g, CardView.getCardForUi(pc), false, x, y, w, h, pos); @@ -369,7 +406,8 @@ public class CardRenderer { } public static void drawCard(Graphics g, CardView card, float x, float y, float w, float h, CardStackPosition pos, boolean rotate) { - Texture image = ImageCache.getImage(card); + Texture image = new RendererCachedCardImage(card, false).getImage();; + if (image != null) { if (image == ImageCache.defaultImage) { CardImageRenderer.drawCardImage(g, card, false, x, y, w, h, pos); diff --git a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java index 375e7d94b84..36c95917843 100644 --- a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java +++ b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java @@ -204,6 +204,10 @@ public class SettingsPage extends TabPage { "If turned on, Forge will load all historic format definitions, this may take slightly longer to load at startup."), 3); //Graphic Options + lstSettings.addItem(new BooleanSetting(FPref.UI_ENABLE_ONLINE_IMAGE_FETCHER, + "Download missing card art", + "Automatically download missing card art"), + 4); lstSettings.addItem(new BooleanSetting(FPref.UI_OVERLAY_FOIL_EFFECT, "Display Foil Overlay", "Displays foil cards with the visual foil overlay effect."), diff --git a/forge-gui-mobile/src/forge/util/LibGDXImageFetcher.java b/forge-gui-mobile/src/forge/util/LibGDXImageFetcher.java new file mode 100644 index 00000000000..6e8bc3f7ca5 --- /dev/null +++ b/forge-gui-mobile/src/forge/util/LibGDXImageFetcher.java @@ -0,0 +1,62 @@ +package forge.util; + +import com.badlogic.gdx.files.FileHandle; +import forge.Forge; +import forge.GuiBase; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +public class LibGDXImageFetcher extends ImageFetcher { + @Override + protected Runnable getDownloadTask(String[] downloadUrls, String destPath, Runnable notifyObservers) { + return new LibGDXDownloadTask(downloadUrls, destPath, notifyObservers); + } + + private static class LibGDXDownloadTask implements Runnable { + private final String[] downloadUrls; + private final String destPath; + private final Runnable notifyObservers; + + LibGDXDownloadTask(String[] downloadUrls, String destPath, Runnable notifyObservers) { + this.downloadUrls = downloadUrls; + this.destPath = destPath; + this.notifyObservers = notifyObservers; + } + + private void doFetch(String urlToDownload) throws IOException { + URL url = new URL(urlToDownload); + System.out.println("Attempting to fetch: " + url); + java.net.URLConnection c = url.openConnection(); + c.setRequestProperty("User-Agent", ""); + + InputStream is = c.getInputStream(); + // First, save to a temporary file so that nothing tries to read + // a partial download. + FileHandle destFile = new FileHandle(destPath + ".tmp"); + System.out.println(destPath); + destFile.parent().mkdirs(); + + // Conversion to JPEG will be handled differently depending on the platform + Forge.getDeviceAdapter().convertToJPEG(is, new FileOutputStream(destFile.file())); + destFile.moveTo(new FileHandle(destPath)); + + System.out.println("Saved image to " + destPath); + GuiBase.getInterface().invokeInEdtLater(notifyObservers); + } + + public void run() { + for (String urlToDownload : downloadUrls) { + try { + doFetch(urlToDownload); + break; + } catch (IOException e) { + System.out.println("Failed to download card [" + destPath + "] image: " + e.getMessage()); + } + } + } + } + +} diff --git a/forge-gui/src/main/java/forge/interfaces/IDeviceAdapter.java b/forge-gui/src/main/java/forge/interfaces/IDeviceAdapter.java index 41e00408465..06361f28bc7 100644 --- a/forge-gui/src/main/java/forge/interfaces/IDeviceAdapter.java +++ b/forge-gui/src/main/java/forge/interfaces/IDeviceAdapter.java @@ -1,5 +1,9 @@ package forge.interfaces; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + public interface IDeviceAdapter { boolean isConnectedToInternet(); boolean isConnectedToWifi(); @@ -10,4 +14,5 @@ public interface IDeviceAdapter { void preventSystemSleep(boolean preventSleep); void restart(); void exit(); + void convertToJPEG(InputStream input, OutputStream output) throws IOException; } diff --git a/forge-gui/src/main/java/forge/interfaces/IGuiBase.java b/forge-gui/src/main/java/forge/interfaces/IGuiBase.java index 15f23f41fe2..21802b2717d 100644 --- a/forge-gui/src/main/java/forge/interfaces/IGuiBase.java +++ b/forge-gui/src/main/java/forge/interfaces/IGuiBase.java @@ -16,12 +16,14 @@ import forge.match.HostedMatch; import forge.sound.IAudioClip; import forge.sound.IAudioMusic; import forge.util.Callback; +import forge.util.ImageFetcher; public interface IGuiBase { boolean isRunningOnDesktop(); boolean isLibgdxPort(); String getCurrentVersion(); String getAssetsDir(); + ImageFetcher getImageFetcher(); void invokeInEdtNow(Runnable runnable); void invokeInEdtLater(Runnable runnable); void invokeInEdtAndWait(Runnable proc); diff --git a/forge-gui-desktop/src/main/java/forge/ImageFetcher.java b/forge-gui/src/main/java/forge/util/ImageFetcher.java similarity index 67% rename from forge-gui-desktop/src/main/java/forge/ImageFetcher.java rename to forge-gui/src/main/java/forge/util/ImageFetcher.java index 6b0d878b721..9ab7a134387 100644 --- a/forge-gui-desktop/src/main/java/forge/ImageFetcher.java +++ b/forge-gui/src/main/java/forge/util/ImageFetcher.java @@ -1,34 +1,28 @@ -package forge; +package forge.util; -import java.awt.image.BufferedImage; import java.io.File; -import java.io.IOException; -import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import javax.imageio.ImageIO; -import javax.swing.SwingUtilities; - +import forge.FThreads; +import forge.ImageKeys; +import forge.StaticData; import org.apache.commons.lang3.tuple.Pair; -import forge.game.card.CardView; import forge.item.PaperCard; import forge.model.FModel; import forge.properties.ForgeConstants; import forge.properties.ForgePreferences; -import forge.util.FileUtil; -import forge.util.ImageUtil; -public class ImageFetcher { +public abstract class ImageFetcher { private static final ExecutorService threadPool = Executors.newCachedThreadPool(); - private static HashMap> currentFetches = new HashMap<>(); - private static HashMap tokenImages; + private HashMap> currentFetches = new HashMap<>(); + private HashMap tokenImages; - public static void fetchImage(final CardView card, final String imageKey, final Callback callback) { + public void fetchImage(final String imageKey, final Callback callback) { FThreads.assertExecutedByEdt(true); if (!FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_ENABLE_ONLINE_IMAGE_FETCHER)) @@ -119,50 +113,12 @@ public class ImageFetcher { currentFetches.remove(destPath); } }; - threadPool.submit(new DownloadTask(downloadUrls.toArray(new String[0]), destPath, notifyObservers)); + threadPool.submit(getDownloadTask(downloadUrls.toArray(new String[0]), destPath, notifyObservers)); } - + + protected abstract Runnable getDownloadTask(String[] toArray, String destPath, Runnable notifyObservers); + public static interface Callback { public void onImageFetched(); } - - private static class DownloadTask implements Runnable { - private final String[] downloadUrls; - private final String destPath; - private final Runnable notifyObservers; - - public DownloadTask(String[] downloadUrls, String destPath, Runnable notifyObservers) { - this.downloadUrls = downloadUrls; - this.destPath = destPath; - this.notifyObservers = notifyObservers; - } - - private void doFetch(String urlToDownload) throws IOException { - URL url = new URL(urlToDownload); - System.out.println("Attempting to fetch: " + url); - java.net.URLConnection c = url.openConnection(); - c.setRequestProperty("User-Agent", ""); - BufferedImage image = ImageIO.read(c.getInputStream()); - // First, save to a temporary file so that nothing tries to read - // a partial download. - File destFile = new File(destPath + ".tmp"); - destFile.mkdirs(); - ImageIO.write(image, "jpg", destFile); - // Now, rename it to the correct name. - destFile.renameTo(new File(destPath)); - System.out.println("Saved image to " + destPath); - SwingUtilities.invokeLater(notifyObservers); - } - - public void run() { - for (String urlToDownload : downloadUrls) { - try { - doFetch(urlToDownload); - break; - } catch (IOException e) { - System.out.println("Failed to download card [" + destPath + "] image: " + e.getMessage()); - } - } - } - } - } \ No newline at end of file +} \ No newline at end of file From 37d9dc753f915853ecf1e17e1fea1b5feb7480bd Mon Sep 17 00:00:00 2001 From: Jeremy Pelkala Date: Fri, 2 Nov 2018 18:57:17 -0400 Subject: [PATCH 092/901] -CardPool Added getFilteredPool() to easily get a Predicate applied copy of a CardPool. -GameRules Minor formatting change. -worlds.txt Added Random Commander to the list. -DeckConstructionRules New enum for defining the subformat a quest is using. -QuestAssets getLife() now has a switch for modifying the life for sub-formats. -QuestData New data save version. Includes a DeckConstructionRules enum. -QuestDataIO updateSaveFile will update old saves to have a default DeckConstructionRules complying with the new QuestData save version. -QuestController Updated to include support for DeckConstructionRules and specialized duel managers -QuestEvent Now have boolean to define if this is a "random" match for the duel list. Currently only QuestEventCommanderDuelManager makes use of this feature for Commander quests. -QuestEventCommanderDuel New QuestEventDuel used in the QuestEventCommanderDuelManager which contains a DeckProxy for use in generating random commander decks. -QuestEventCommanderDuelManager New duel manager to generate duels by difficulty for a Commander quest. Currently uses random generation to generate the decks of each opponent. -QuestSpellShop Sell Extras button now has a switch for taking into account special deck construction rules such as Commander only allowing singletons. -QuestUtil Starting a game now checks for various sub-format specific changes including a switch case for which variety of registered player to use. -QuestUtilCards Starting cardpool size is now modified by a switch case for sub-formats such as Commander. -QuestWinLoseController QuestEvents marked as random matches will now award a "Random Opponent Bonus" equal to the credit base. Currently only QuestEventCommanderDuelManager creates QuestEvents marked as such. -QuestWorld Added support for the Commander quest format and world. -CEditorQuest Many changes to add support for Commander in a style that, hopefully, also paths the way for future format support. -CSubmenuQuestData Support for Commander quests. -VSubmenuQuestData Support for Commander quests. --- .../src/main/java/forge/deck/CardPool.java | 14 ++ .../src/main/java/forge/game/GameRules.java | 3 +- .../deckeditor/controllers/CEditorQuest.java | 151 +++++++++++-- .../screens/home/quest/CSubmenuQuestData.java | 10 +- .../screens/home/quest/VSubmenuQuestData.java | 28 ++- forge-gui/res/quest/world/worlds.txt | 1 + .../java/forge/quest/QuestController.java | 14 +- .../src/main/java/forge/quest/QuestEvent.java | 4 + .../forge/quest/QuestEventCommanderDuel.java | 19 ++ .../quest/QuestEventCommanderDuelManager.java | 205 ++++++++++++++++++ .../main/java/forge/quest/QuestSpellShop.java | 17 +- .../src/main/java/forge/quest/QuestUtil.java | 60 ++++- .../main/java/forge/quest/QuestUtilCards.java | 12 +- .../forge/quest/QuestWinLoseController.java | 5 + .../src/main/java/forge/quest/QuestWorld.java | 8 +- .../quest/data/DeckConstructionRules.java | 17 ++ .../java/forge/quest/data/QuestAssets.java | 9 +- .../main/java/forge/quest/data/QuestData.java | 12 +- .../main/java/forge/quest/io/QuestDataIO.java | 8 +- 19 files changed, 561 insertions(+), 36 deletions(-) create mode 100644 forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java create mode 100644 forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java create mode 100644 forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java diff --git a/forge-core/src/main/java/forge/deck/CardPool.java b/forge-core/src/main/java/forge/deck/CardPool.java index 72ab8efb851..b484f31ab98 100644 --- a/forge-core/src/main/java/forge/deck/CardPool.java +++ b/forge-core/src/main/java/forge/deck/CardPool.java @@ -17,6 +17,7 @@ */ package forge.deck; +import com.google.common.base.Predicate; import com.google.common.collect.Lists; import forge.StaticData; import forge.card.CardDb; @@ -216,4 +217,17 @@ public class CardPool extends ItemPool { } return sb.toString(); } + + /** + * Applies a predicate to this CardPool's cards. + * @param predicate the Predicate to apply to this CardPool + * @return a new CardPool made from this CardPool with only the cards that agree with the provided Predicate + */ + public CardPool getFilteredPool(Predicate predicate){ + CardPool filteredPool = new CardPool(); + for(PaperCard pc : this.items.keySet()){ + if(predicate.apply(pc)) filteredPool.add(pc); + } + return filteredPool; + } } diff --git a/forge-game/src/main/java/forge/game/GameRules.java b/forge-game/src/main/java/forge/game/GameRules.java index dc7ed4cddf1..5e6876e9801 100644 --- a/forge-game/src/main/java/forge/game/GameRules.java +++ b/forge-game/src/main/java/forge/game/GameRules.java @@ -78,7 +78,8 @@ public class GameRules { } public boolean hasCommander() { - return appliedVariants.contains(GameType.Commander) || appliedVariants.contains(GameType.TinyLeaders) + return appliedVariants.contains(GameType.Commander) + || appliedVariants.contains(GameType.TinyLeaders) || appliedVariants.contains(GameType.Brawl); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java index c33da12cda7..b7842272e42 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java @@ -18,11 +18,20 @@ package forge.screens.deckeditor.controllers; import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; import com.google.common.base.Supplier; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; import forge.UiCommand; +import forge.card.CardRules; +import forge.card.CardRulesPredicates; +import forge.card.ColorSet; +import forge.card.mana.ManaCost; import forge.deck.CardPool; import forge.deck.Deck; import forge.deck.DeckSection; +import forge.deck.generation.DeckGeneratorBase; import forge.gui.GuiUtils; import forge.gui.framework.DragCell; import forge.gui.framework.FScreen; @@ -35,6 +44,7 @@ import forge.itemmanager.views.ItemTableColumn; import forge.model.FModel; import forge.properties.ForgePreferences.FPref; import forge.quest.QuestController; +import forge.quest.data.DeckConstructionRules; import forge.screens.deckeditor.AddBasicLandsDialog; import forge.screens.deckeditor.SEditorIO; import forge.screens.deckeditor.views.VAllDecks; @@ -48,6 +58,7 @@ import forge.util.ItemPool; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.print.Paper; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -103,6 +114,14 @@ public final class CEditorQuest extends CDeckEditor { allSections.add(DeckSection.Main); allSections.add(DeckSection.Sideboard); + //Add sub-format specific sections + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: + allSections.add(DeckSection.Commander); + break; + } + this.questData = questData0; final CardManager catalogManager = new CardManager(cDetailPicture, false, true); @@ -158,6 +177,10 @@ public final class CEditorQuest extends CDeckEditor { @Override protected CardLimit getCardLimit() { if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) { + //If this is a commander quest, only allow single copies of cards + if(FModel.getQuest().getDeckConstructionRules() == DeckConstructionRules.Commander){ + return CardLimit.Singleton; + } return CardLimit.Default; } return CardLimit.None; //if not enforcing deck legality, don't enforce default limit @@ -245,16 +268,98 @@ public final class CEditorQuest extends CDeckEditor { public void resetTables() { this.sectionMode = DeckSection.Main; - final Deck deck = this.controller.getModel(); - - final CardPool cardpool = getInitialCatalog(); - // remove bottom cards that are in the deck from the card pool - cardpool.removeAll(deck.getMain()); - // remove sideboard cards from the catalog - cardpool.removeAll(deck.getOrCreate(DeckSection.Sideboard)); // show cards, makes this user friendly - this.getCatalogManager().setPool(cardpool); - this.getDeckManager().setPool(deck.getMain()); + this.getCatalogManager().setPool(getRemainingCardPool()); + this.getDeckManager().setPool(getDeck().getMain()); + } + + /*** + * Provides the pool of cards the player has available to add to his or her deck. Also manages showing available cards + * to choose from for special deck construction rules, e.g.: Commander. + * @return CardPool of cards available to add to the player's deck. + */ + private CardPool getRemainingCardPool(){ + final CardPool cardpool = getInitialCatalog(); + + // remove bottom cards that are in the deck from the card pool + cardpool.removeAll(getDeck().getMain()); + + // remove sideboard cards from the catalog + cardpool.removeAll(getDeck().getOrCreate(DeckSection.Sideboard)); + + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: + //remove this deck's currently selected commander(s) from the catalog + cardpool.removeAll(getDeck().getOrCreate(DeckSection.Commander)); + + //TODO: Only thin if deck conformance is being applied + if(getDeck().getOrCreate(DeckSection.Commander).toFlatList().size() > 0) { + Predicate identityPredicate = new MatchCommanderColorIdentity(getDeckColorIdentity()); + CardPool filteredPool = cardpool.getFilteredPool(identityPredicate); + + return filteredPool; + } + break; + } + + return cardpool; + } + + /** + * Predicate that filters out based on a color identity provided upon instantiation. Used to filter the card + * list when a commander is chosen so the user can more easily see what cards are available for his or her deck + * and avoid making additions that are not legal. + */ + public static class MatchCommanderColorIdentity implements Predicate { + private final ColorSet allowedColor; + + public MatchCommanderColorIdentity(ColorSet color) { + allowedColor = color; + } + + @Override + public boolean apply(PaperCard subject) { + CardRules cr = subject.getRules(); + ManaCost mc = cr.getManaCost(); + return !mc.isPureGeneric() && allowedColor.containsAllColorsFrom(cr.getColorIdentity().getColor()); + } + } + + /** + * Compiles the color identity of the loaded deck based on the commanders. + * @return A ColorSet containing the color identity of the currently loaded deck. + */ + public ColorSet getDeckColorIdentity(){ + + List commanders = getDeck().getOrCreate(DeckSection.Commander).toFlatList(); + List colors = new ArrayList<>(); + + //Return early if there are no current commanders + if(commanders.size() == 0) return ColorSet.fromNames(colors); + + //For each commander,add each color of its color identity if not already added + for(PaperCard pc : commanders){ + if(!colors.contains("w") && pc.getRules().getColorIdentity().hasWhite()) colors.add("w"); + if(!colors.contains("u") && pc.getRules().getColorIdentity().hasBlue()) colors.add("u"); + if(!colors.contains("b") && pc.getRules().getColorIdentity().hasBlack()) colors.add("b"); + if(!colors.contains("r") && pc.getRules().getColorIdentity().hasRed()) colors.add("r"); + if(!colors.contains("g") && pc.getRules().getColorIdentity().hasGreen()) colors.add("g"); + } + + return ColorSet.fromNames(colors); + } + + /* + Used to make the code more readable in game terms. + */ + private Deck getDeck(){ + return this.controller.getModel(); + } + + private ItemPool getCommanderCardPool(){ + Predicate commanderPredicate = Predicates.compose(CardRulesPredicates.Presets.CAN_BE_COMMANDER, PaperCard.FN_GET_RULES); + return getRemainingCardPool().getFilteredPool(commanderPredicate); } @Override @@ -280,14 +385,30 @@ public final class CEditorQuest extends CDeckEditor { } /** - * Switch between the main deck and the sideboard editor. + * Switch between the main deck and the sideboard/Command Zone editor. */ public void setEditorMode(DeckSection sectionMode) { - if (sectionMode == DeckSection.Sideboard) { - this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Sideboard)); - } - else { - this.getDeckManager().setPool(this.controller.getModel().getMain()); + //Fixes null pointer error on switching tabs while quest deck editor is open. TODO: Find source of bug possibly? + if(sectionMode == null) sectionMode = DeckSection.Main; + + //Based on which section the editor is in, display the remaining card pool (or applicable card pool if in + //Commander) and the current section's cards + switch(sectionMode){ + case Main : + this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); + this.getCatalogManager().setPool(getRemainingCardPool()); + this.getDeckManager().setPool(this.controller.getModel().getMain()); + break; + case Sideboard : + this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); + this.getCatalogManager().setPool(getRemainingCardPool()); + this.getDeckManager().setPool(getDeck().getOrCreate(DeckSection.Sideboard)); + break; + case Commander : + this.getCatalogManager().setup(ItemManagerConfig.COMMANDER_POOL); + this.getCatalogManager().setPool(getCommanderCardPool()); + this.getDeckManager().setPool(getDeck().getOrCreate(DeckSection.Commander)); + break; } this.sectionMode = sectionMode; diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java index 131805b738b..8aa76293b55 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java @@ -10,6 +10,7 @@ import forge.model.FModel; import forge.properties.ForgeConstants; import forge.quest.*; import forge.quest.StartingPoolPreferences.PoolType; +import forge.quest.data.DeckConstructionRules; import forge.quest.data.GameFormatQuest; import forge.quest.data.QuestData; import forge.quest.data.QuestPreferences.QPref; @@ -340,9 +341,16 @@ public enum CSubmenuQuestData implements ICDoc { break; } + //Apply the appropriate deck construction rules for this quest + DeckConstructionRules dcr = DeckConstructionRules.Default; + + if(VSubmenuQuestData.SINGLETON_INSTANCE.isCommander()){ + dcr = DeckConstructionRules.Commander; + } + final QuestController qc = FModel.getQuest(); - qc.newGame(questName, difficulty, mode, fmtPrizes, view.isUnlockSetsAllowed(), dckStartPool, fmtStartPool, view.getStartingWorldName(), userPrefs); + qc.newGame(questName, difficulty, mode, fmtPrizes, view.isUnlockSetsAllowed(), dckStartPool, fmtStartPool, view.getStartingWorldName(), userPrefs, dcr); FModel.getQuest().save(); // Save in preferences. diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java index 9eee9e58ca3..70e284faf3d 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java @@ -62,6 +62,7 @@ public enum VSubmenuQuestData implements IVSubmenu { private final FRadioButton radHard = new FRadioButton("Hard"); private final FRadioButton radExpert = new FRadioButton("Expert"); private final FCheckBox boxFantasy = new FCheckBox("Fantasy Mode"); + private final FCheckBox boxCommander = new FCheckBox("Commander Subformat"); private final FLabel lblStartingWorld = new FLabel.Builder().text("Starting world:").build(); private final FComboBoxWrapper cbxStartingWorld = new FComboBoxWrapper<>(); @@ -274,9 +275,25 @@ public enum VSubmenuQuestData implements IVSubmenu { } }); - // Fantasy box enabled by Default + // Fantasy box selected by Default boxFantasy.setSelected(true); boxFantasy.setEnabled(true); + + // Commander box unselected by Default + boxCommander.setSelected(false); + boxCommander.setEnabled(true); + + boxCommander.addActionListener( + new ActionListener(){ + public void actionPerformed(ActionEvent e){ + if(!isCommander()) return; //do nothing if unselecting Commander Subformat + //Otherwise, set the starting world to Random Commander + cbxStartingWorld.setSelectedItem(FModel.getWorlds().get("Random Commander")); + } + } + + ); + boxCompleteSet.setEnabled(true); boxAllowDuplicates.setEnabled(true); @@ -286,6 +303,7 @@ public enum VSubmenuQuestData implements IVSubmenu { final JPanel pnlDifficultyMode = new JPanel(new MigLayout("insets 0, gap 1%, flowy")); pnlDifficultyMode.add(difficultyPanel, "gapright 4%"); pnlDifficultyMode.add(boxFantasy, "h 25px!, gapbottom 15, gapright 4%"); + pnlDifficultyMode.add(boxCommander, "h 25px!, gapbottom 15, gapright 4%"); pnlDifficultyMode.add(lblStartingWorld, "h 25px!, hidemode 3"); cbxStartingWorld.addTo(pnlDifficultyMode, "h 27px!, w 40%, pushx, gapbottom 7"); pnlDifficultyMode.setOpaque(false); @@ -487,6 +505,14 @@ public enum VSubmenuQuestData implements IVSubmenu { return boxFantasy.isSelected(); } + /** + * Auth. Imakuni + * @return True if the "Commander Subformat" check box is selected. + */ + public boolean isCommander() { + return boxCommander.isSelected(); + } + public boolean startWithCompleteSet() { return boxCompleteSet.isSelected(); } diff --git a/forge-gui/res/quest/world/worlds.txt b/forge-gui/res/quest/world/worlds.txt index b08931cde59..5d99427d535 100644 --- a/forge-gui/res/quest/world/worlds.txt +++ b/forge-gui/res/quest/world/worlds.txt @@ -1,5 +1,6 @@ Name:Main world Name:Random Standard +Name:Random Commander Name:Amonkhet|Dir:Amonkhet|Sets:AKH, HOU Name:Jamuraa|Dir:jamuraa|Sets:5ED, ARN, MIR, VIS, WTH|Banned:Chaos Orb; Falling Star Name:Kamigawa|Dir:2004 Kamigawa|Sets:CHK, BOK, SOK diff --git a/forge-gui/src/main/java/forge/quest/QuestController.java b/forge-gui/src/main/java/forge/quest/QuestController.java index 0d306f4431a..5366f7200bc 100644 --- a/forge-gui/src/main/java/forge/quest/QuestController.java +++ b/forge-gui/src/main/java/forge/quest/QuestController.java @@ -276,9 +276,10 @@ public class QuestController { public void newGame(final String name, final int difficulty, final QuestMode mode, final GameFormat formatPrizes, final boolean allowSetUnlocks, final Deck startingCards, final GameFormat formatStartingPool, - final String startingWorld, final StartingPoolPreferences userPrefs) { + final String startingWorld, final StartingPoolPreferences userPrefs, + DeckConstructionRules dcr) { - this.load(new QuestData(name, difficulty, mode, formatPrizes, allowSetUnlocks, startingWorld)); // pass awards and unlocks here + this.load(new QuestData(name, difficulty, mode, formatPrizes, allowSetUnlocks, startingWorld, dcr)); // pass awards and unlocks here if (startingCards != null) { this.myCards.addDeck(startingCards); @@ -435,6 +436,12 @@ public class QuestController { QuestWorld world = getWorld(); String path = ForgeConstants.DEFAULT_CHALLENGES_DIR; + //Use a variant specialized duel manager if this is a variant quest + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: this.duelManager = new QuestEventCommanderDuelManager(); return; + } + if (world != null) { if (world.getName().equals(QuestWorld.STANDARDWORLDNAME)) { @@ -449,7 +456,6 @@ public class QuestController { } this.duelManager = new QuestEventDuelManager(new File(path)); - } public HashSet GetRating() { @@ -607,4 +613,6 @@ public class QuestController { public void setCurrentDeck(String s) { model.currentDeck = s; } + + public DeckConstructionRules getDeckConstructionRules(){return model.deckConstructionRules;} } diff --git a/forge-gui/src/main/java/forge/quest/QuestEvent.java b/forge-gui/src/main/java/forge/quest/QuestEvent.java index 00a140c80e2..2a9bf6c1b63 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEvent.java +++ b/forge-gui/src/main/java/forge/quest/QuestEvent.java @@ -48,6 +48,7 @@ public abstract class QuestEvent implements IQuestEvent { private String profile = "Default"; // Opponent name if different from the challenge name private String opponentName = null; + private boolean isRandomMatch = false; public static final Function FN_GET_NAME = new Function() { @@ -174,4 +175,7 @@ public abstract class QuestEvent implements IQuestEvent { this.showDifficulty = showDifficulty; } + public boolean getIsRandomMatch(){return isRandomMatch;} + + public void setIsRandomMatch(boolean b){isRandomMatch = b;} } diff --git a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java new file mode 100644 index 00000000000..1d7924a04d7 --- /dev/null +++ b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java @@ -0,0 +1,19 @@ +package forge.quest; + +import forge.deck.DeckProxy; + +/** + * A QuestEventDuel with a CommanderDeckGenerator used exclusively within QuestEventCommanderDuelManager for the + * creation of randomly generated Commander decks in a Commander variant quest. + * Auth. Imakuni & Forge + */ +public class QuestEventCommanderDuel extends QuestEventDuel{ + /** + * The CommanderDeckGenerator for this duel. + */ + private DeckProxy deckProxy; + + public DeckProxy getDeckProxy() {return deckProxy;} + + public void setDeckProxy(DeckProxy dp) {deckProxy = dp;} +} diff --git a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java new file mode 100644 index 00000000000..384d9d11d77 --- /dev/null +++ b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java @@ -0,0 +1,205 @@ +package forge.quest; + +import forge.deck.*; +import forge.item.PaperCard; +import forge.model.FModel; +import forge.quest.data.QuestPreferences; +import forge.util.CollectionSuppliers; +import forge.util.MyRandom; +import forge.util.maps.EnumMapOfLists; +import forge.util.maps.MapOfLists; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Manages the creation of random Commander duels for a Commander variant quest. Random generation is handled via + * the CommanderDeckGenerator class. + * Auth. Forge & Imakuni#8015 + */ +public class QuestEventCommanderDuelManager implements QuestEventDuelManagerInterface { + /** + * The list of all possible Commander variant duels. + */ + private ArrayList commanderDuels = new ArrayList<>(); + + /** + * Contains the expert deck lists for the commanders. + */ + private List expertCommanderDecks; + + /** + * Immediately calls assembleDuels() to setup the commanderDuels variable. + */ + public QuestEventCommanderDuelManager(){ + assembleDuels(); + } + + /** + * Assembles the list of all possible Commander duels via CommanderDeckGenerator. Should be done within constructor. + */ + private void assembleDuels(){ + //isCardGen = true seemed to make slightly more difficult decks based purely on experience with a very small sample size. + //Gotta work on this more, its making pretty average decks after further testing. + expertCommanderDecks = CommanderDeckGenerator.getCommanderDecks(DeckFormat.Commander, true, true); + + List generatedDuels = CommanderDeckGenerator.getCommanderDecks(DeckFormat.Commander, true, false); + + for(DeckProxy dp : generatedDuels){ + QuestEventCommanderDuel duel = new QuestEventCommanderDuel(); + + duel.setDescription("Randomly generated " + dp.getName() + " commander deck."); + duel.setName(dp.getName()); + duel.setTitle(dp.getName()); + duel.setOpponentName(dp.getName()); + duel.setDifficulty(QuestEventDifficulty.EASY); + duel.setDeckProxy(dp); + + //Setting a blank deck avoids a null pointer exception. The deck is generated in generateDuels() to avoid long load times. + duel.setEventDeck(new Deck()); + + commanderDuels.add(duel); + } + } + + /** + * Retrieve list of all possible Commander duels. + * @return ArrayList containing all possible Commander duels. + */ + public Iterable getAllDuels() { + return commanderDuels; + } + + /** + * Retrieve list of all possible Commander duels. + * @param difficulty Currently unused + * @return ArrayList containing all possible Commander duels. + */ + public Iterable getDuels(QuestEventDifficulty difficulty){ + return commanderDuels; + } + + /** + * Composes an ArrayList containing 4 QuestEventDuels composed with Commander variant decks. One duel will have its + * title replaced as Random. + * @return ArrayList of QuestEventDuels containing 4 duels. + */ + public List generateDuels(){ + final List duelOpponents = new ArrayList<>(); + + //While there are less than 4 duels chosen + while(duelOpponents.size() < 4){ + //Get a random duel from the possible duels list + QuestEventCommanderDuel duel = (QuestEventCommanderDuel)commanderDuels.get(((int) (commanderDuels.size() * MyRandom.getRandom().nextDouble()))); + + //If the chosen duels list already contains this duel, get a different duel to prevent duplicate duels + if(duelOpponents.contains(duel)) continue; + + //Add the randomly chosen duel to the duel list + duelOpponents.add(duel); + + //Here the actual deck for this commander is generated by calling .getDeck() on the saved DeckProxy + duel.setEventDeck(duel.getDeckProxy().getDeck()); + + //Modify deck for difficulty + modifyDuelForDifficulty(duel); + + + } + + //Modify the stats of the final duel to hide the opponent, creating a "random" duel. + //We make a copy of the final duel and overwrite it in the duelOpponents to avoid changing the variables in + //the original duel, which gets reused. + QuestEventCommanderDuel duel = (QuestEventCommanderDuel)duelOpponents.get(duelOpponents.size() - 1); + QuestEventCommanderDuel randomDuel = new QuestEventCommanderDuel(); + + randomDuel.setName(duel.getName()); + randomDuel.setOpponentName(duel.getName()); + randomDuel.setDeckProxy(duel.getDeckProxy()); + randomDuel.setTitle("Random Opponent"); + randomDuel.setShowDifficulty(false); + randomDuel.setDescription("Fight a random generated commander opponent."); + randomDuel.setIsRandomMatch(true); + randomDuel.setEventDeck(duel.getEventDeck()); + + //Replace the final duel with this newly modified "random" duel + duelOpponents.set(duelOpponents.size()-1, randomDuel); + + return duelOpponents; + } + + /** + * Retrieves the expert level deck generation of a deck with the same commander as the provided DeckProxy. + * @param dp The easy generation commander deck + * @return The same commander's expert generation DeckProxy + */ + private Deck getExpertGenDeck(DeckProxy dp){ + for(QuestEventDuel qed : commanderDuels){ + QuestEventCommanderDuel cmdQED = (QuestEventCommanderDuel)qed; + if(cmdQED.getDeckProxy().getName().equals(dp.getName())){ + return cmdQED.getDeckProxy().getDeck(); + } + } + return null; + } + + /** + * Modifies a given duel by replacing a percentage of the deck with random cards from the more difficult generated version + * of the same commander's deck. Medium replaces 30%, Hard replaces 60%, Expert replaces 100%. + * @param duel The QuestEventCommanderDuel to modify + */ + private void modifyDuelForDifficulty(QuestEventCommanderDuel duel){ + final QuestPreferences questPreferences = FModel.getQuestPreferences(); + final int index = FModel.getQuest().getAchievements().getDifficulty(); + final int numberOfWins = FModel.getQuest().getAchievements().getWin(); + Deck expertDeck = getExpertGenDeck(duel.getDeckProxy()); + + int difficultyReplacementPercent = 0; + + //Note: The code is ordered to make the least number of comparisons I could think of at the time for speed reasons. + //In reality, it shouldn't really make much difference, but why not? + if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_EXPERTAI, index)) { + //At expert, the deck is replaced with the entire expert deck, and we can return immediately + duel.setEventDeck(expertDeck); + duel.setDifficulty(QuestEventDifficulty.EXPERT); + return; + } + + if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_MEDIUMAI, index)) { + difficultyReplacementPercent += 30; + duel.setDifficulty(QuestEventDifficulty.MEDIUM); + } else return; //return early here since it would be an easy opponent with no changes + + if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_HARDAI, index)) { + difficultyReplacementPercent += 30; + duel.setDifficulty(QuestEventDifficulty.HARD); + } + + CardPool easyMain = duel.getEventDeck().getMain(); + CardPool expertMain = expertDeck.getMain(); + + List easyList = easyMain.toFlatList(); + List expertList = expertMain.toFlatList(); + + //Replace cards in the easy deck with cards from the expert deck up to the difficulty replacement percent + for(int i = 0; i < difficultyReplacementPercent; i++){ + if(!easyMain.contains(expertList.get(i))) { //ensure that the card being copied over isn't already in the deck + easyMain.remove(easyList.get(i)); + easyMain.add(expertList.get(i)); + } + else{ + expertList.remove(expertList.get(i)); + i--; + if(expertList.size() == 0) break; //break if there are no more cards to copy over + } + } + } + + /** + * Randomizes the list of Commander Duels. + */ + public void randomizeOpponents(){ + Collections.shuffle(commanderDuels); + } +} diff --git a/forge-gui/src/main/java/forge/quest/QuestSpellShop.java b/forge-gui/src/main/java/forge/quest/QuestSpellShop.java index e9196e417df..96eae768963 100644 --- a/forge-gui/src/main/java/forge/quest/QuestSpellShop.java +++ b/forge-gui/src/main/java/forge/quest/QuestSpellShop.java @@ -344,11 +344,24 @@ public class QuestSpellShop { List> cardsToRemove = new LinkedList<>(); for (Entry item : inventoryManager.getPool()) { PaperCard card = (PaperCard)item.getKey(); - int numToKeep = card.getRules().getType().isBasic() ? - FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_BASIC_LAND_SIZE) : FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_SIZE); + //Number of a particular card to keep + int numToKeep = 4; + + if(card.getRules().getType().isBasic()){ + numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_BASIC_LAND_SIZE); + } else{ + //Choose card limit restrictions based on deck construction rules, e.g.: Commander allows only singletons + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_SIZE); break; + case Commander: numToKeep = 1; + } + } + + //If this card has an exception to the card limit, e.g.: Relentless Rats, get the quest preference if (DeckFormat.getLimitExceptions().contains(card.getName())) { numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_ANY_NUMBER_SIZE); } + if (numToKeep < item.getValue()) { cardsToRemove.add(Pair.of(item.getKey(), item.getValue() - numToKeep)); } diff --git a/forge-gui/src/main/java/forge/quest/QuestUtil.java b/forge-gui/src/main/java/forge/quest/QuestUtil.java index c2fe796ef7b..7ad6b6cd335 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtil.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtil.java @@ -41,6 +41,7 @@ import forge.properties.ForgePreferences.FPref; import forge.quest.bazaar.IQuestBazaarItem; import forge.quest.bazaar.QuestItemType; import forge.quest.bazaar.QuestPetController; +import forge.quest.data.DeckConstructionRules; import forge.quest.data.QuestAchievements; import forge.quest.data.QuestAssets; import forge.util.gui.SGuiChoose; @@ -51,6 +52,7 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; +import java.util.TreeSet; /** *

@@ -531,7 +533,17 @@ public class QuestUtil { Integer lifeHuman = null; boolean useBazaar = true; Boolean forceAnte = null; - int lifeAI = 20; + + //Generate a life modifier based on this quest's variant as held in the Quest Controller's DeckConstructionRules + int variantLifeModifier = 0; + + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: variantLifeModifier = 20; break; + } + + int lifeAI = 20 + variantLifeModifier; + if (event instanceof QuestEventChallenge) { final QuestEventChallenge qc = ((QuestEventChallenge) event); lifeAI = qc.getAILife(); @@ -545,8 +557,9 @@ public class QuestUtil { forceAnte = qc.isForceAnte(); } - final RegisteredPlayer humanStart = new RegisteredPlayer(getDeckForNewGame()); - final RegisteredPlayer aiStart = new RegisteredPlayer(event.getEventDeck()); + final RegisteredPlayer humanStart = getRegisteredPlayerByVariant(getDeckForNewGame()); + + final RegisteredPlayer aiStart = getRegisteredPlayerByVariant(event.getEventDeck()); if (lifeHuman != null) { humanStart.setStartingLife(lifeHuman); @@ -581,17 +594,39 @@ public class QuestUtil { rules.setGamesPerMatch(qData.getMatchLength()); rules.setManaBurn(FModel.getPreferences().getPrefBoolean(FPref.UI_MANABURN)); rules.setCanCloneUseTargetsImage(FModel.getPreferences().getPrefBoolean(FPref.UI_CLONE_MODE_SOURCE)); + + TreeSet variant = new TreeSet(); + if(FModel.getQuest().getDeckConstructionRules() == DeckConstructionRules.Commander){ + variant.add(GameType.Commander); + } + final HostedMatch hostedMatch = GuiBase.getInterface().hostMatch(); final IGuiGame gui = GuiBase.getInterface().getNewGuiGame(); gui.setPlayerAvatar(aiPlayer, event); FThreads.invokeInEdtNowOrLater(new Runnable(){ @Override public void run() { - hostedMatch.startMatch(rules, null, starter, ImmutableMap.of(humanStart, gui)); + hostedMatch.startMatch(rules, variant, starter, ImmutableMap.of(humanStart, gui)); } }); } + /** + * Uses the appropriate RegisteredPlayer command for generating a RegisteredPlayer based on this quest's variant as + * held by the QuestController's DeckConstructionRules. + * @param deck The deck to generate the RegisteredPlayer with + * @return A newly made RegisteredPlayer specific to the quest's variant + */ + private static RegisteredPlayer getRegisteredPlayerByVariant(Deck deck){ + switch (FModel.getQuest().getDeckConstructionRules()) { + case Default: + return new RegisteredPlayer(deck); + case Commander: + return RegisteredPlayer.forCommander(deck); + } + return null; + } + private static Deck getDeckForNewGame() { Deck deck = null; if (event instanceof QuestEventChallenge) { @@ -623,7 +658,7 @@ public class QuestUtil { } if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) { - final String errorMessage = GameType.Quest.getDeckFormat().getDeckConformanceProblem(deck); + final String errorMessage = getDeckConformanceProblems(deck); if (null != errorMessage) { SOptionPane.showErrorDialog("Your deck " + errorMessage + " Please edit or choose a different deck.", "Invalid Deck"); return false; @@ -633,6 +668,21 @@ public class QuestUtil { return true; } + public static String getDeckConformanceProblems(Deck deck){ + String errorMessage = GameType.Quest.getDeckFormat().getDeckConformanceProblem(deck);; + + if(errorMessage != null) return errorMessage; //return immediately if the deck does not conform to quest requirements + + //Check for all applicable deck construction rules per this quests's saved DeckConstructionRules enum + switch(FModel.getQuest().getDeckConstructionRules()){ + case Commander: + errorMessage = GameType.Commander.getDeckFormat().getDeckConformanceProblem(deck); + break; + } + + return errorMessage; + } + /** Duplicate in DeckEditorQuestMenu and * probably elsewhere...can streamline at some point * (probably shouldn't be here). diff --git a/forge-gui/src/main/java/forge/quest/QuestUtilCards.java b/forge-gui/src/main/java/forge/quest/QuestUtilCards.java index c8d77d863ad..54a4887ba8a 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtilCards.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtilCards.java @@ -308,10 +308,16 @@ public final class QuestUtilCards { * user preferences */ public void setupNewGameCardPool(final GameFormat formatStartingPool, final int idxDifficulty, final StartingPoolPreferences userPrefs) { + //Add additional cards to the starter card pool based on variant if applicable + double variantModifier = 0; + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: variantModifier = 2; break; + } - final int nC = questPreferences.getPrefInt(DifficultyPrefs.STARTING_COMMONS, idxDifficulty); - final int nU = questPreferences.getPrefInt(DifficultyPrefs.STARTING_UNCOMMONS, idxDifficulty); - final int nR = questPreferences.getPrefInt(DifficultyPrefs.STARTING_RARES, idxDifficulty); + final int nC = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_COMMONS, idxDifficulty) * variantModifier); + final int nU = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_UNCOMMONS, idxDifficulty) * variantModifier); + final int nR = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_RARES, idxDifficulty) * variantModifier); addAllCards(BoosterUtils.getQuestStarterDeck(formatStartingPool, nC, nU, nR, userPrefs)); diff --git a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java index 2e93e7d4fec..265ea61bb58 100644 --- a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java +++ b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java @@ -226,6 +226,11 @@ public class QuestWinLoseController { sb.append(StringUtils.capitalize(qEvent.getDifficulty().getTitle())); sb.append(" opponent: ").append(credBase).append(" credits.\n"); + if(qEvent.getIsRandomMatch()){ + sb.append("Random Opponent Bonus: " + credBase + " credit" + (credBase > 1 ? "s." : ".") + "\n"); + credBase += credBase; + } + final int winMultiplier = Math.min(qData.getAchievements().getWin(), FModel.getQuestPreferences().getPrefInt(QPref.REWARDS_WINS_MULTIPLIER_MAX)); final int creditsForPreviousWins = (int) ((Double.parseDouble(FModel.getQuestPreferences() .getPref(QPref.REWARDS_WINS_MULTIPLIER)) * winMultiplier)); diff --git a/forge-gui/src/main/java/forge/quest/QuestWorld.java b/forge-gui/src/main/java/forge/quest/QuestWorld.java index e20dcf98ce8..4c77b0ec515 100644 --- a/forge-gui/src/main/java/forge/quest/QuestWorld.java +++ b/forge-gui/src/main/java/forge/quest/QuestWorld.java @@ -40,6 +40,7 @@ public class QuestWorld implements Comparable{ private final String dir; private final GameFormatQuest format; public static final String STANDARDWORLDNAME = "Random Standard"; + public static final String RANDOMCOMMANDERWORLDNAME = "Random Commander"; private boolean isCustom; @@ -129,7 +130,6 @@ public class QuestWorld implements Comparable{ /** * TODO: Write javadoc for Constructor. * @param file0 - * @param keySelector0 */ public Reader(String file0) { super(file0, QuestWorld.FN_GET_NAME); @@ -194,6 +194,12 @@ public class QuestWorld implements Comparable{ FModel.getFormats().getStandard().getBannedCardNames(),false); } + if (useName.equalsIgnoreCase(QuestWorld.RANDOMCOMMANDERWORLDNAME)){ + useFormat = new GameFormatQuest(QuestWorld.RANDOMCOMMANDERWORLDNAME, + FModel.getFormats().getFormat("Commander").getAllowedSetCodes(), + FModel.getFormats().getFormat("Commander").getBannedCardNames(),false); + } + // System.out.println("Creating quest world " + useName + " (index " + useIdx + ", dir: " + useDir); // if (useFormat != null) { System.out.println("SETS: " + sets + "\nBANNED: " + bannedCards); } diff --git a/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java b/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java new file mode 100644 index 00000000000..3744beea09d --- /dev/null +++ b/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java @@ -0,0 +1,17 @@ +package forge.quest.data; + +/** + * Used to clarify which subformat a quest is using e.g. Commander. + * Auth. Imakuni + */ +public enum DeckConstructionRules { + /** + * Typically has no effect on Quest gameplay. + */ + Default, + + /** + * Commander ruleset. 99 card deck, no copies other than basic lands, commander(s) in Command zone + */ + Commander +} 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 616c49d937b..8f7b644641b 100644 --- a/forge-gui/src/main/java/forge/quest/data/QuestAssets.java +++ b/forge-gui/src/main/java/forge/quest/data/QuestAssets.java @@ -200,7 +200,14 @@ public class QuestAssets { * @return the life */ public int getLife(final QuestMode mode) { - final int base = mode.equals(QuestMode.Fantasy) ? 15 : 20; + int base = mode.equals(QuestMode.Fantasy) ? 15 : 20; + + //Modify life for the quest's sub-format, e.g.: Commander adds 20 + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: base += 20; + } + return (base + this.getItemLevel(QuestItemType.ELIXIR_OF_LIFE)) - this.getItemLevel(QuestItemType.POUND_FLESH); } diff --git a/forge-gui/src/main/java/forge/quest/data/QuestData.java b/forge-gui/src/main/java/forge/quest/data/QuestData.java index e6a75adef7d..41574634113 100644 --- a/forge-gui/src/main/java/forge/quest/data/QuestData.java +++ b/forge-gui/src/main/java/forge/quest/data/QuestData.java @@ -42,7 +42,7 @@ import java.util.Map; */ public final class QuestData { /** Holds the latest version of the Quest Data. */ - public static final int CURRENT_VERSION_NUMBER = 12; + public static final int CURRENT_VERSION_NUMBER = 13; // This field places the version number into QD instance, // but only when the object is created through the constructor @@ -70,6 +70,11 @@ public final class QuestData { public String currentDeck = "DEFAULT"; + /** + * Holds the subformat for this quest. Defaults to DeckConstructionRules.Default. + */ + public DeckConstructionRules deckConstructionRules = DeckConstructionRules.Default; + public QuestData() { //needed for XML serialization } @@ -87,9 +92,11 @@ public final class QuestData { * allow set unlocking during quest * @param startingWorld * starting world + * @param dcr + * deck construction rules e.g. Commander */ public QuestData(String name0, int diff, QuestMode mode0, GameFormat userFormat, - boolean allowSetUnlocks, final String startingWorld) { + boolean allowSetUnlocks, final String startingWorld, DeckConstructionRules dcr) { this.name = name0; if (userFormat != null) { @@ -99,6 +106,7 @@ public final class QuestData { this.achievements = new QuestAchievements(diff); this.assets = new QuestAssets(format); this.worldId = startingWorld; + this.deckConstructionRules = dcr; } /** diff --git a/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java b/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java index de680502e37..cd232367df9 100644 --- a/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java +++ b/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java @@ -223,10 +223,16 @@ public class QuestDataIO { // Current Deck moved from preferences to quest data - it should not be global for all quests!!! QuestDataIO.setFinalField(QuestData.class, "currentDeck", newData, FModel.getQuestPreferences().getPref(QPref.CURRENT_DECK)); } - if (saveVersion < 13) { + if(saveVersion < 13){ + //Update for quest DeckConstructionRules + //Add a DeckConstructionRules set to Default. + QuestDataIO.setFinalField(QuestData.class, "deckConstructionRules", newData, DeckConstructionRules.Default); + } + if (saveVersion < 14) { // Migrate DraftTournaments to use new Tournament class } + final QuestAssets qS = newData.getAssets(); final QuestAchievements qA = newData.getAchievements(); From f4ba5258ead0ef30b979a008f2d4b20399d42a91 Mon Sep 17 00:00:00 2001 From: imakunee Date: Sat, 3 Nov 2018 00:36:26 +0000 Subject: [PATCH 093/901] Revert "-CardPool" This reverts commit 37d9dc753f915853ecf1e17e1fea1b5feb7480bd --- .../src/main/java/forge/deck/CardPool.java | 14 -- .../src/main/java/forge/game/GameRules.java | 3 +- .../deckeditor/controllers/CEditorQuest.java | 145 +------------ .../screens/home/quest/CSubmenuQuestData.java | 10 +- .../screens/home/quest/VSubmenuQuestData.java | 28 +-- forge-gui/res/quest/world/worlds.txt | 1 - .../java/forge/quest/QuestController.java | 14 +- .../src/main/java/forge/quest/QuestEvent.java | 4 - .../forge/quest/QuestEventCommanderDuel.java | 19 -- .../quest/QuestEventCommanderDuelManager.java | 205 ------------------ .../main/java/forge/quest/QuestSpellShop.java | 17 +- .../src/main/java/forge/quest/QuestUtil.java | 60 +---- .../main/java/forge/quest/QuestUtilCards.java | 12 +- .../forge/quest/QuestWinLoseController.java | 5 - .../src/main/java/forge/quest/QuestWorld.java | 8 +- .../quest/data/DeckConstructionRules.java | 17 -- .../java/forge/quest/data/QuestAssets.java | 9 +- .../main/java/forge/quest/data/QuestData.java | 12 +- .../main/java/forge/quest/io/QuestDataIO.java | 8 +- 19 files changed, 33 insertions(+), 558 deletions(-) delete mode 100644 forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java delete mode 100644 forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java delete mode 100644 forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java diff --git a/forge-core/src/main/java/forge/deck/CardPool.java b/forge-core/src/main/java/forge/deck/CardPool.java index b484f31ab98..72ab8efb851 100644 --- a/forge-core/src/main/java/forge/deck/CardPool.java +++ b/forge-core/src/main/java/forge/deck/CardPool.java @@ -17,7 +17,6 @@ */ package forge.deck; -import com.google.common.base.Predicate; import com.google.common.collect.Lists; import forge.StaticData; import forge.card.CardDb; @@ -217,17 +216,4 @@ public class CardPool extends ItemPool { } return sb.toString(); } - - /** - * Applies a predicate to this CardPool's cards. - * @param predicate the Predicate to apply to this CardPool - * @return a new CardPool made from this CardPool with only the cards that agree with the provided Predicate - */ - public CardPool getFilteredPool(Predicate predicate){ - CardPool filteredPool = new CardPool(); - for(PaperCard pc : this.items.keySet()){ - if(predicate.apply(pc)) filteredPool.add(pc); - } - return filteredPool; - } } diff --git a/forge-game/src/main/java/forge/game/GameRules.java b/forge-game/src/main/java/forge/game/GameRules.java index 5e6876e9801..dc7ed4cddf1 100644 --- a/forge-game/src/main/java/forge/game/GameRules.java +++ b/forge-game/src/main/java/forge/game/GameRules.java @@ -78,8 +78,7 @@ public class GameRules { } public boolean hasCommander() { - return appliedVariants.contains(GameType.Commander) - || appliedVariants.contains(GameType.TinyLeaders) + return appliedVariants.contains(GameType.Commander) || appliedVariants.contains(GameType.TinyLeaders) || appliedVariants.contains(GameType.Brawl); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java index b7842272e42..c33da12cda7 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java @@ -18,20 +18,11 @@ package forge.screens.deckeditor.controllers; import com.google.common.base.Function; -import com.google.common.base.Predicate; -import com.google.common.base.Predicates; import com.google.common.base.Supplier; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; import forge.UiCommand; -import forge.card.CardRules; -import forge.card.CardRulesPredicates; -import forge.card.ColorSet; -import forge.card.mana.ManaCost; import forge.deck.CardPool; import forge.deck.Deck; import forge.deck.DeckSection; -import forge.deck.generation.DeckGeneratorBase; import forge.gui.GuiUtils; import forge.gui.framework.DragCell; import forge.gui.framework.FScreen; @@ -44,7 +35,6 @@ import forge.itemmanager.views.ItemTableColumn; import forge.model.FModel; import forge.properties.ForgePreferences.FPref; import forge.quest.QuestController; -import forge.quest.data.DeckConstructionRules; import forge.screens.deckeditor.AddBasicLandsDialog; import forge.screens.deckeditor.SEditorIO; import forge.screens.deckeditor.views.VAllDecks; @@ -58,7 +48,6 @@ import forge.util.ItemPool; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.awt.print.Paper; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -114,14 +103,6 @@ public final class CEditorQuest extends CDeckEditor { allSections.add(DeckSection.Main); allSections.add(DeckSection.Sideboard); - //Add sub-format specific sections - switch(FModel.getQuest().getDeckConstructionRules()){ - case Default: break; - case Commander: - allSections.add(DeckSection.Commander); - break; - } - this.questData = questData0; final CardManager catalogManager = new CardManager(cDetailPicture, false, true); @@ -177,10 +158,6 @@ public final class CEditorQuest extends CDeckEditor { @Override protected CardLimit getCardLimit() { if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) { - //If this is a commander quest, only allow single copies of cards - if(FModel.getQuest().getDeckConstructionRules() == DeckConstructionRules.Commander){ - return CardLimit.Singleton; - } return CardLimit.Default; } return CardLimit.None; //if not enforcing deck legality, don't enforce default limit @@ -268,98 +245,16 @@ public final class CEditorQuest extends CDeckEditor { public void resetTables() { this.sectionMode = DeckSection.Main; - // show cards, makes this user friendly - this.getCatalogManager().setPool(getRemainingCardPool()); - this.getDeckManager().setPool(getDeck().getMain()); - } + final Deck deck = this.controller.getModel(); - /*** - * Provides the pool of cards the player has available to add to his or her deck. Also manages showing available cards - * to choose from for special deck construction rules, e.g.: Commander. - * @return CardPool of cards available to add to the player's deck. - */ - private CardPool getRemainingCardPool(){ final CardPool cardpool = getInitialCatalog(); - // remove bottom cards that are in the deck from the card pool - cardpool.removeAll(getDeck().getMain()); - + cardpool.removeAll(deck.getMain()); // remove sideboard cards from the catalog - cardpool.removeAll(getDeck().getOrCreate(DeckSection.Sideboard)); - - switch(FModel.getQuest().getDeckConstructionRules()){ - case Default: break; - case Commander: - //remove this deck's currently selected commander(s) from the catalog - cardpool.removeAll(getDeck().getOrCreate(DeckSection.Commander)); - - //TODO: Only thin if deck conformance is being applied - if(getDeck().getOrCreate(DeckSection.Commander).toFlatList().size() > 0) { - Predicate identityPredicate = new MatchCommanderColorIdentity(getDeckColorIdentity()); - CardPool filteredPool = cardpool.getFilteredPool(identityPredicate); - - return filteredPool; - } - break; - } - - return cardpool; - } - - /** - * Predicate that filters out based on a color identity provided upon instantiation. Used to filter the card - * list when a commander is chosen so the user can more easily see what cards are available for his or her deck - * and avoid making additions that are not legal. - */ - public static class MatchCommanderColorIdentity implements Predicate { - private final ColorSet allowedColor; - - public MatchCommanderColorIdentity(ColorSet color) { - allowedColor = color; - } - - @Override - public boolean apply(PaperCard subject) { - CardRules cr = subject.getRules(); - ManaCost mc = cr.getManaCost(); - return !mc.isPureGeneric() && allowedColor.containsAllColorsFrom(cr.getColorIdentity().getColor()); - } - } - - /** - * Compiles the color identity of the loaded deck based on the commanders. - * @return A ColorSet containing the color identity of the currently loaded deck. - */ - public ColorSet getDeckColorIdentity(){ - - List commanders = getDeck().getOrCreate(DeckSection.Commander).toFlatList(); - List colors = new ArrayList<>(); - - //Return early if there are no current commanders - if(commanders.size() == 0) return ColorSet.fromNames(colors); - - //For each commander,add each color of its color identity if not already added - for(PaperCard pc : commanders){ - if(!colors.contains("w") && pc.getRules().getColorIdentity().hasWhite()) colors.add("w"); - if(!colors.contains("u") && pc.getRules().getColorIdentity().hasBlue()) colors.add("u"); - if(!colors.contains("b") && pc.getRules().getColorIdentity().hasBlack()) colors.add("b"); - if(!colors.contains("r") && pc.getRules().getColorIdentity().hasRed()) colors.add("r"); - if(!colors.contains("g") && pc.getRules().getColorIdentity().hasGreen()) colors.add("g"); - } - - return ColorSet.fromNames(colors); - } - - /* - Used to make the code more readable in game terms. - */ - private Deck getDeck(){ - return this.controller.getModel(); - } - - private ItemPool getCommanderCardPool(){ - Predicate commanderPredicate = Predicates.compose(CardRulesPredicates.Presets.CAN_BE_COMMANDER, PaperCard.FN_GET_RULES); - return getRemainingCardPool().getFilteredPool(commanderPredicate); + cardpool.removeAll(deck.getOrCreate(DeckSection.Sideboard)); + // show cards, makes this user friendly + this.getCatalogManager().setPool(cardpool); + this.getDeckManager().setPool(deck.getMain()); } @Override @@ -385,30 +280,14 @@ public final class CEditorQuest extends CDeckEditor { } /** - * Switch between the main deck and the sideboard/Command Zone editor. + * Switch between the main deck and the sideboard editor. */ public void setEditorMode(DeckSection sectionMode) { - //Fixes null pointer error on switching tabs while quest deck editor is open. TODO: Find source of bug possibly? - if(sectionMode == null) sectionMode = DeckSection.Main; - - //Based on which section the editor is in, display the remaining card pool (or applicable card pool if in - //Commander) and the current section's cards - switch(sectionMode){ - case Main : - this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); - this.getCatalogManager().setPool(getRemainingCardPool()); - this.getDeckManager().setPool(this.controller.getModel().getMain()); - break; - case Sideboard : - this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); - this.getCatalogManager().setPool(getRemainingCardPool()); - this.getDeckManager().setPool(getDeck().getOrCreate(DeckSection.Sideboard)); - break; - case Commander : - this.getCatalogManager().setup(ItemManagerConfig.COMMANDER_POOL); - this.getCatalogManager().setPool(getCommanderCardPool()); - this.getDeckManager().setPool(getDeck().getOrCreate(DeckSection.Commander)); - break; + if (sectionMode == DeckSection.Sideboard) { + this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Sideboard)); + } + else { + this.getDeckManager().setPool(this.controller.getModel().getMain()); } this.sectionMode = sectionMode; diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java index 8aa76293b55..131805b738b 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java @@ -10,7 +10,6 @@ import forge.model.FModel; import forge.properties.ForgeConstants; import forge.quest.*; import forge.quest.StartingPoolPreferences.PoolType; -import forge.quest.data.DeckConstructionRules; import forge.quest.data.GameFormatQuest; import forge.quest.data.QuestData; import forge.quest.data.QuestPreferences.QPref; @@ -341,16 +340,9 @@ public enum CSubmenuQuestData implements ICDoc { break; } - //Apply the appropriate deck construction rules for this quest - DeckConstructionRules dcr = DeckConstructionRules.Default; - - if(VSubmenuQuestData.SINGLETON_INSTANCE.isCommander()){ - dcr = DeckConstructionRules.Commander; - } - final QuestController qc = FModel.getQuest(); - qc.newGame(questName, difficulty, mode, fmtPrizes, view.isUnlockSetsAllowed(), dckStartPool, fmtStartPool, view.getStartingWorldName(), userPrefs, dcr); + qc.newGame(questName, difficulty, mode, fmtPrizes, view.isUnlockSetsAllowed(), dckStartPool, fmtStartPool, view.getStartingWorldName(), userPrefs); FModel.getQuest().save(); // Save in preferences. diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java index 70e284faf3d..9eee9e58ca3 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java @@ -62,7 +62,6 @@ public enum VSubmenuQuestData implements IVSubmenu { private final FRadioButton radHard = new FRadioButton("Hard"); private final FRadioButton radExpert = new FRadioButton("Expert"); private final FCheckBox boxFantasy = new FCheckBox("Fantasy Mode"); - private final FCheckBox boxCommander = new FCheckBox("Commander Subformat"); private final FLabel lblStartingWorld = new FLabel.Builder().text("Starting world:").build(); private final FComboBoxWrapper cbxStartingWorld = new FComboBoxWrapper<>(); @@ -275,25 +274,9 @@ public enum VSubmenuQuestData implements IVSubmenu { } }); - // Fantasy box selected by Default + // Fantasy box enabled by Default boxFantasy.setSelected(true); boxFantasy.setEnabled(true); - - // Commander box unselected by Default - boxCommander.setSelected(false); - boxCommander.setEnabled(true); - - boxCommander.addActionListener( - new ActionListener(){ - public void actionPerformed(ActionEvent e){ - if(!isCommander()) return; //do nothing if unselecting Commander Subformat - //Otherwise, set the starting world to Random Commander - cbxStartingWorld.setSelectedItem(FModel.getWorlds().get("Random Commander")); - } - } - - ); - boxCompleteSet.setEnabled(true); boxAllowDuplicates.setEnabled(true); @@ -303,7 +286,6 @@ public enum VSubmenuQuestData implements IVSubmenu { final JPanel pnlDifficultyMode = new JPanel(new MigLayout("insets 0, gap 1%, flowy")); pnlDifficultyMode.add(difficultyPanel, "gapright 4%"); pnlDifficultyMode.add(boxFantasy, "h 25px!, gapbottom 15, gapright 4%"); - pnlDifficultyMode.add(boxCommander, "h 25px!, gapbottom 15, gapright 4%"); pnlDifficultyMode.add(lblStartingWorld, "h 25px!, hidemode 3"); cbxStartingWorld.addTo(pnlDifficultyMode, "h 27px!, w 40%, pushx, gapbottom 7"); pnlDifficultyMode.setOpaque(false); @@ -505,14 +487,6 @@ public enum VSubmenuQuestData implements IVSubmenu { return boxFantasy.isSelected(); } - /** - * Auth. Imakuni - * @return True if the "Commander Subformat" check box is selected. - */ - public boolean isCommander() { - return boxCommander.isSelected(); - } - public boolean startWithCompleteSet() { return boxCompleteSet.isSelected(); } diff --git a/forge-gui/res/quest/world/worlds.txt b/forge-gui/res/quest/world/worlds.txt index 5d99427d535..b08931cde59 100644 --- a/forge-gui/res/quest/world/worlds.txt +++ b/forge-gui/res/quest/world/worlds.txt @@ -1,6 +1,5 @@ Name:Main world Name:Random Standard -Name:Random Commander Name:Amonkhet|Dir:Amonkhet|Sets:AKH, HOU Name:Jamuraa|Dir:jamuraa|Sets:5ED, ARN, MIR, VIS, WTH|Banned:Chaos Orb; Falling Star Name:Kamigawa|Dir:2004 Kamigawa|Sets:CHK, BOK, SOK diff --git a/forge-gui/src/main/java/forge/quest/QuestController.java b/forge-gui/src/main/java/forge/quest/QuestController.java index 5366f7200bc..0d306f4431a 100644 --- a/forge-gui/src/main/java/forge/quest/QuestController.java +++ b/forge-gui/src/main/java/forge/quest/QuestController.java @@ -276,10 +276,9 @@ public class QuestController { public void newGame(final String name, final int difficulty, final QuestMode mode, final GameFormat formatPrizes, final boolean allowSetUnlocks, final Deck startingCards, final GameFormat formatStartingPool, - final String startingWorld, final StartingPoolPreferences userPrefs, - DeckConstructionRules dcr) { + final String startingWorld, final StartingPoolPreferences userPrefs) { - this.load(new QuestData(name, difficulty, mode, formatPrizes, allowSetUnlocks, startingWorld, dcr)); // pass awards and unlocks here + this.load(new QuestData(name, difficulty, mode, formatPrizes, allowSetUnlocks, startingWorld)); // pass awards and unlocks here if (startingCards != null) { this.myCards.addDeck(startingCards); @@ -436,12 +435,6 @@ public class QuestController { QuestWorld world = getWorld(); String path = ForgeConstants.DEFAULT_CHALLENGES_DIR; - //Use a variant specialized duel manager if this is a variant quest - switch(FModel.getQuest().getDeckConstructionRules()){ - case Default: break; - case Commander: this.duelManager = new QuestEventCommanderDuelManager(); return; - } - if (world != null) { if (world.getName().equals(QuestWorld.STANDARDWORLDNAME)) { @@ -456,6 +449,7 @@ public class QuestController { } this.duelManager = new QuestEventDuelManager(new File(path)); + } public HashSet GetRating() { @@ -613,6 +607,4 @@ public class QuestController { public void setCurrentDeck(String s) { model.currentDeck = s; } - - public DeckConstructionRules getDeckConstructionRules(){return model.deckConstructionRules;} } diff --git a/forge-gui/src/main/java/forge/quest/QuestEvent.java b/forge-gui/src/main/java/forge/quest/QuestEvent.java index 2a9bf6c1b63..00a140c80e2 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEvent.java +++ b/forge-gui/src/main/java/forge/quest/QuestEvent.java @@ -48,7 +48,6 @@ public abstract class QuestEvent implements IQuestEvent { private String profile = "Default"; // Opponent name if different from the challenge name private String opponentName = null; - private boolean isRandomMatch = false; public static final Function FN_GET_NAME = new Function() { @@ -175,7 +174,4 @@ public abstract class QuestEvent implements IQuestEvent { this.showDifficulty = showDifficulty; } - public boolean getIsRandomMatch(){return isRandomMatch;} - - public void setIsRandomMatch(boolean b){isRandomMatch = b;} } diff --git a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java deleted file mode 100644 index 1d7924a04d7..00000000000 --- a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java +++ /dev/null @@ -1,19 +0,0 @@ -package forge.quest; - -import forge.deck.DeckProxy; - -/** - * A QuestEventDuel with a CommanderDeckGenerator used exclusively within QuestEventCommanderDuelManager for the - * creation of randomly generated Commander decks in a Commander variant quest. - * Auth. Imakuni & Forge - */ -public class QuestEventCommanderDuel extends QuestEventDuel{ - /** - * The CommanderDeckGenerator for this duel. - */ - private DeckProxy deckProxy; - - public DeckProxy getDeckProxy() {return deckProxy;} - - public void setDeckProxy(DeckProxy dp) {deckProxy = dp;} -} diff --git a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java deleted file mode 100644 index 384d9d11d77..00000000000 --- a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java +++ /dev/null @@ -1,205 +0,0 @@ -package forge.quest; - -import forge.deck.*; -import forge.item.PaperCard; -import forge.model.FModel; -import forge.quest.data.QuestPreferences; -import forge.util.CollectionSuppliers; -import forge.util.MyRandom; -import forge.util.maps.EnumMapOfLists; -import forge.util.maps.MapOfLists; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/** - * Manages the creation of random Commander duels for a Commander variant quest. Random generation is handled via - * the CommanderDeckGenerator class. - * Auth. Forge & Imakuni#8015 - */ -public class QuestEventCommanderDuelManager implements QuestEventDuelManagerInterface { - /** - * The list of all possible Commander variant duels. - */ - private ArrayList commanderDuels = new ArrayList<>(); - - /** - * Contains the expert deck lists for the commanders. - */ - private List expertCommanderDecks; - - /** - * Immediately calls assembleDuels() to setup the commanderDuels variable. - */ - public QuestEventCommanderDuelManager(){ - assembleDuels(); - } - - /** - * Assembles the list of all possible Commander duels via CommanderDeckGenerator. Should be done within constructor. - */ - private void assembleDuels(){ - //isCardGen = true seemed to make slightly more difficult decks based purely on experience with a very small sample size. - //Gotta work on this more, its making pretty average decks after further testing. - expertCommanderDecks = CommanderDeckGenerator.getCommanderDecks(DeckFormat.Commander, true, true); - - List generatedDuels = CommanderDeckGenerator.getCommanderDecks(DeckFormat.Commander, true, false); - - for(DeckProxy dp : generatedDuels){ - QuestEventCommanderDuel duel = new QuestEventCommanderDuel(); - - duel.setDescription("Randomly generated " + dp.getName() + " commander deck."); - duel.setName(dp.getName()); - duel.setTitle(dp.getName()); - duel.setOpponentName(dp.getName()); - duel.setDifficulty(QuestEventDifficulty.EASY); - duel.setDeckProxy(dp); - - //Setting a blank deck avoids a null pointer exception. The deck is generated in generateDuels() to avoid long load times. - duel.setEventDeck(new Deck()); - - commanderDuels.add(duel); - } - } - - /** - * Retrieve list of all possible Commander duels. - * @return ArrayList containing all possible Commander duels. - */ - public Iterable getAllDuels() { - return commanderDuels; - } - - /** - * Retrieve list of all possible Commander duels. - * @param difficulty Currently unused - * @return ArrayList containing all possible Commander duels. - */ - public Iterable getDuels(QuestEventDifficulty difficulty){ - return commanderDuels; - } - - /** - * Composes an ArrayList containing 4 QuestEventDuels composed with Commander variant decks. One duel will have its - * title replaced as Random. - * @return ArrayList of QuestEventDuels containing 4 duels. - */ - public List generateDuels(){ - final List duelOpponents = new ArrayList<>(); - - //While there are less than 4 duels chosen - while(duelOpponents.size() < 4){ - //Get a random duel from the possible duels list - QuestEventCommanderDuel duel = (QuestEventCommanderDuel)commanderDuels.get(((int) (commanderDuels.size() * MyRandom.getRandom().nextDouble()))); - - //If the chosen duels list already contains this duel, get a different duel to prevent duplicate duels - if(duelOpponents.contains(duel)) continue; - - //Add the randomly chosen duel to the duel list - duelOpponents.add(duel); - - //Here the actual deck for this commander is generated by calling .getDeck() on the saved DeckProxy - duel.setEventDeck(duel.getDeckProxy().getDeck()); - - //Modify deck for difficulty - modifyDuelForDifficulty(duel); - - - } - - //Modify the stats of the final duel to hide the opponent, creating a "random" duel. - //We make a copy of the final duel and overwrite it in the duelOpponents to avoid changing the variables in - //the original duel, which gets reused. - QuestEventCommanderDuel duel = (QuestEventCommanderDuel)duelOpponents.get(duelOpponents.size() - 1); - QuestEventCommanderDuel randomDuel = new QuestEventCommanderDuel(); - - randomDuel.setName(duel.getName()); - randomDuel.setOpponentName(duel.getName()); - randomDuel.setDeckProxy(duel.getDeckProxy()); - randomDuel.setTitle("Random Opponent"); - randomDuel.setShowDifficulty(false); - randomDuel.setDescription("Fight a random generated commander opponent."); - randomDuel.setIsRandomMatch(true); - randomDuel.setEventDeck(duel.getEventDeck()); - - //Replace the final duel with this newly modified "random" duel - duelOpponents.set(duelOpponents.size()-1, randomDuel); - - return duelOpponents; - } - - /** - * Retrieves the expert level deck generation of a deck with the same commander as the provided DeckProxy. - * @param dp The easy generation commander deck - * @return The same commander's expert generation DeckProxy - */ - private Deck getExpertGenDeck(DeckProxy dp){ - for(QuestEventDuel qed : commanderDuels){ - QuestEventCommanderDuel cmdQED = (QuestEventCommanderDuel)qed; - if(cmdQED.getDeckProxy().getName().equals(dp.getName())){ - return cmdQED.getDeckProxy().getDeck(); - } - } - return null; - } - - /** - * Modifies a given duel by replacing a percentage of the deck with random cards from the more difficult generated version - * of the same commander's deck. Medium replaces 30%, Hard replaces 60%, Expert replaces 100%. - * @param duel The QuestEventCommanderDuel to modify - */ - private void modifyDuelForDifficulty(QuestEventCommanderDuel duel){ - final QuestPreferences questPreferences = FModel.getQuestPreferences(); - final int index = FModel.getQuest().getAchievements().getDifficulty(); - final int numberOfWins = FModel.getQuest().getAchievements().getWin(); - Deck expertDeck = getExpertGenDeck(duel.getDeckProxy()); - - int difficultyReplacementPercent = 0; - - //Note: The code is ordered to make the least number of comparisons I could think of at the time for speed reasons. - //In reality, it shouldn't really make much difference, but why not? - if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_EXPERTAI, index)) { - //At expert, the deck is replaced with the entire expert deck, and we can return immediately - duel.setEventDeck(expertDeck); - duel.setDifficulty(QuestEventDifficulty.EXPERT); - return; - } - - if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_MEDIUMAI, index)) { - difficultyReplacementPercent += 30; - duel.setDifficulty(QuestEventDifficulty.MEDIUM); - } else return; //return early here since it would be an easy opponent with no changes - - if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_HARDAI, index)) { - difficultyReplacementPercent += 30; - duel.setDifficulty(QuestEventDifficulty.HARD); - } - - CardPool easyMain = duel.getEventDeck().getMain(); - CardPool expertMain = expertDeck.getMain(); - - List easyList = easyMain.toFlatList(); - List expertList = expertMain.toFlatList(); - - //Replace cards in the easy deck with cards from the expert deck up to the difficulty replacement percent - for(int i = 0; i < difficultyReplacementPercent; i++){ - if(!easyMain.contains(expertList.get(i))) { //ensure that the card being copied over isn't already in the deck - easyMain.remove(easyList.get(i)); - easyMain.add(expertList.get(i)); - } - else{ - expertList.remove(expertList.get(i)); - i--; - if(expertList.size() == 0) break; //break if there are no more cards to copy over - } - } - } - - /** - * Randomizes the list of Commander Duels. - */ - public void randomizeOpponents(){ - Collections.shuffle(commanderDuels); - } -} diff --git a/forge-gui/src/main/java/forge/quest/QuestSpellShop.java b/forge-gui/src/main/java/forge/quest/QuestSpellShop.java index 96eae768963..e9196e417df 100644 --- a/forge-gui/src/main/java/forge/quest/QuestSpellShop.java +++ b/forge-gui/src/main/java/forge/quest/QuestSpellShop.java @@ -344,24 +344,11 @@ public class QuestSpellShop { List> cardsToRemove = new LinkedList<>(); for (Entry item : inventoryManager.getPool()) { PaperCard card = (PaperCard)item.getKey(); - //Number of a particular card to keep - int numToKeep = 4; - - if(card.getRules().getType().isBasic()){ - numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_BASIC_LAND_SIZE); - } else{ - //Choose card limit restrictions based on deck construction rules, e.g.: Commander allows only singletons - switch(FModel.getQuest().getDeckConstructionRules()){ - case Default: numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_SIZE); break; - case Commander: numToKeep = 1; - } - } - - //If this card has an exception to the card limit, e.g.: Relentless Rats, get the quest preference + int numToKeep = card.getRules().getType().isBasic() ? + FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_BASIC_LAND_SIZE) : FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_SIZE); if (DeckFormat.getLimitExceptions().contains(card.getName())) { numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_ANY_NUMBER_SIZE); } - if (numToKeep < item.getValue()) { cardsToRemove.add(Pair.of(item.getKey(), item.getValue() - numToKeep)); } diff --git a/forge-gui/src/main/java/forge/quest/QuestUtil.java b/forge-gui/src/main/java/forge/quest/QuestUtil.java index 7ad6b6cd335..c2fe796ef7b 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtil.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtil.java @@ -41,7 +41,6 @@ import forge.properties.ForgePreferences.FPref; import forge.quest.bazaar.IQuestBazaarItem; import forge.quest.bazaar.QuestItemType; import forge.quest.bazaar.QuestPetController; -import forge.quest.data.DeckConstructionRules; import forge.quest.data.QuestAchievements; import forge.quest.data.QuestAssets; import forge.util.gui.SGuiChoose; @@ -52,7 +51,6 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; -import java.util.TreeSet; /** *

@@ -533,17 +531,7 @@ public class QuestUtil { Integer lifeHuman = null; boolean useBazaar = true; Boolean forceAnte = null; - - //Generate a life modifier based on this quest's variant as held in the Quest Controller's DeckConstructionRules - int variantLifeModifier = 0; - - switch(FModel.getQuest().getDeckConstructionRules()){ - case Default: break; - case Commander: variantLifeModifier = 20; break; - } - - int lifeAI = 20 + variantLifeModifier; - + int lifeAI = 20; if (event instanceof QuestEventChallenge) { final QuestEventChallenge qc = ((QuestEventChallenge) event); lifeAI = qc.getAILife(); @@ -557,9 +545,8 @@ public class QuestUtil { forceAnte = qc.isForceAnte(); } - final RegisteredPlayer humanStart = getRegisteredPlayerByVariant(getDeckForNewGame()); - - final RegisteredPlayer aiStart = getRegisteredPlayerByVariant(event.getEventDeck()); + final RegisteredPlayer humanStart = new RegisteredPlayer(getDeckForNewGame()); + final RegisteredPlayer aiStart = new RegisteredPlayer(event.getEventDeck()); if (lifeHuman != null) { humanStart.setStartingLife(lifeHuman); @@ -594,39 +581,17 @@ public class QuestUtil { rules.setGamesPerMatch(qData.getMatchLength()); rules.setManaBurn(FModel.getPreferences().getPrefBoolean(FPref.UI_MANABURN)); rules.setCanCloneUseTargetsImage(FModel.getPreferences().getPrefBoolean(FPref.UI_CLONE_MODE_SOURCE)); - - TreeSet variant = new TreeSet(); - if(FModel.getQuest().getDeckConstructionRules() == DeckConstructionRules.Commander){ - variant.add(GameType.Commander); - } - final HostedMatch hostedMatch = GuiBase.getInterface().hostMatch(); final IGuiGame gui = GuiBase.getInterface().getNewGuiGame(); gui.setPlayerAvatar(aiPlayer, event); FThreads.invokeInEdtNowOrLater(new Runnable(){ @Override public void run() { - hostedMatch.startMatch(rules, variant, starter, ImmutableMap.of(humanStart, gui)); + hostedMatch.startMatch(rules, null, starter, ImmutableMap.of(humanStart, gui)); } }); } - /** - * Uses the appropriate RegisteredPlayer command for generating a RegisteredPlayer based on this quest's variant as - * held by the QuestController's DeckConstructionRules. - * @param deck The deck to generate the RegisteredPlayer with - * @return A newly made RegisteredPlayer specific to the quest's variant - */ - private static RegisteredPlayer getRegisteredPlayerByVariant(Deck deck){ - switch (FModel.getQuest().getDeckConstructionRules()) { - case Default: - return new RegisteredPlayer(deck); - case Commander: - return RegisteredPlayer.forCommander(deck); - } - return null; - } - private static Deck getDeckForNewGame() { Deck deck = null; if (event instanceof QuestEventChallenge) { @@ -658,7 +623,7 @@ public class QuestUtil { } if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) { - final String errorMessage = getDeckConformanceProblems(deck); + final String errorMessage = GameType.Quest.getDeckFormat().getDeckConformanceProblem(deck); if (null != errorMessage) { SOptionPane.showErrorDialog("Your deck " + errorMessage + " Please edit or choose a different deck.", "Invalid Deck"); return false; @@ -668,21 +633,6 @@ public class QuestUtil { return true; } - public static String getDeckConformanceProblems(Deck deck){ - String errorMessage = GameType.Quest.getDeckFormat().getDeckConformanceProblem(deck);; - - if(errorMessage != null) return errorMessage; //return immediately if the deck does not conform to quest requirements - - //Check for all applicable deck construction rules per this quests's saved DeckConstructionRules enum - switch(FModel.getQuest().getDeckConstructionRules()){ - case Commander: - errorMessage = GameType.Commander.getDeckFormat().getDeckConformanceProblem(deck); - break; - } - - return errorMessage; - } - /** Duplicate in DeckEditorQuestMenu and * probably elsewhere...can streamline at some point * (probably shouldn't be here). diff --git a/forge-gui/src/main/java/forge/quest/QuestUtilCards.java b/forge-gui/src/main/java/forge/quest/QuestUtilCards.java index 54a4887ba8a..c8d77d863ad 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtilCards.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtilCards.java @@ -308,16 +308,10 @@ public final class QuestUtilCards { * user preferences */ public void setupNewGameCardPool(final GameFormat formatStartingPool, final int idxDifficulty, final StartingPoolPreferences userPrefs) { - //Add additional cards to the starter card pool based on variant if applicable - double variantModifier = 0; - switch(FModel.getQuest().getDeckConstructionRules()){ - case Default: break; - case Commander: variantModifier = 2; break; - } - final int nC = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_COMMONS, idxDifficulty) * variantModifier); - final int nU = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_UNCOMMONS, idxDifficulty) * variantModifier); - final int nR = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_RARES, idxDifficulty) * variantModifier); + final int nC = questPreferences.getPrefInt(DifficultyPrefs.STARTING_COMMONS, idxDifficulty); + final int nU = questPreferences.getPrefInt(DifficultyPrefs.STARTING_UNCOMMONS, idxDifficulty); + final int nR = questPreferences.getPrefInt(DifficultyPrefs.STARTING_RARES, idxDifficulty); addAllCards(BoosterUtils.getQuestStarterDeck(formatStartingPool, nC, nU, nR, userPrefs)); diff --git a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java index 265ea61bb58..2e93e7d4fec 100644 --- a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java +++ b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java @@ -226,11 +226,6 @@ public class QuestWinLoseController { sb.append(StringUtils.capitalize(qEvent.getDifficulty().getTitle())); sb.append(" opponent: ").append(credBase).append(" credits.\n"); - if(qEvent.getIsRandomMatch()){ - sb.append("Random Opponent Bonus: " + credBase + " credit" + (credBase > 1 ? "s." : ".") + "\n"); - credBase += credBase; - } - final int winMultiplier = Math.min(qData.getAchievements().getWin(), FModel.getQuestPreferences().getPrefInt(QPref.REWARDS_WINS_MULTIPLIER_MAX)); final int creditsForPreviousWins = (int) ((Double.parseDouble(FModel.getQuestPreferences() .getPref(QPref.REWARDS_WINS_MULTIPLIER)) * winMultiplier)); diff --git a/forge-gui/src/main/java/forge/quest/QuestWorld.java b/forge-gui/src/main/java/forge/quest/QuestWorld.java index 4c77b0ec515..e20dcf98ce8 100644 --- a/forge-gui/src/main/java/forge/quest/QuestWorld.java +++ b/forge-gui/src/main/java/forge/quest/QuestWorld.java @@ -40,7 +40,6 @@ public class QuestWorld implements Comparable{ private final String dir; private final GameFormatQuest format; public static final String STANDARDWORLDNAME = "Random Standard"; - public static final String RANDOMCOMMANDERWORLDNAME = "Random Commander"; private boolean isCustom; @@ -130,6 +129,7 @@ public class QuestWorld implements Comparable{ /** * TODO: Write javadoc for Constructor. * @param file0 + * @param keySelector0 */ public Reader(String file0) { super(file0, QuestWorld.FN_GET_NAME); @@ -194,12 +194,6 @@ public class QuestWorld implements Comparable{ FModel.getFormats().getStandard().getBannedCardNames(),false); } - if (useName.equalsIgnoreCase(QuestWorld.RANDOMCOMMANDERWORLDNAME)){ - useFormat = new GameFormatQuest(QuestWorld.RANDOMCOMMANDERWORLDNAME, - FModel.getFormats().getFormat("Commander").getAllowedSetCodes(), - FModel.getFormats().getFormat("Commander").getBannedCardNames(),false); - } - // System.out.println("Creating quest world " + useName + " (index " + useIdx + ", dir: " + useDir); // if (useFormat != null) { System.out.println("SETS: " + sets + "\nBANNED: " + bannedCards); } diff --git a/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java b/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java deleted file mode 100644 index 3744beea09d..00000000000 --- a/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java +++ /dev/null @@ -1,17 +0,0 @@ -package forge.quest.data; - -/** - * Used to clarify which subformat a quest is using e.g. Commander. - * Auth. Imakuni - */ -public enum DeckConstructionRules { - /** - * Typically has no effect on Quest gameplay. - */ - Default, - - /** - * Commander ruleset. 99 card deck, no copies other than basic lands, commander(s) in Command zone - */ - Commander -} 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..616c49d937b 100644 --- a/forge-gui/src/main/java/forge/quest/data/QuestAssets.java +++ b/forge-gui/src/main/java/forge/quest/data/QuestAssets.java @@ -200,14 +200,7 @@ public class QuestAssets { * @return the life */ public int getLife(final QuestMode mode) { - int base = mode.equals(QuestMode.Fantasy) ? 15 : 20; - - //Modify life for the quest's sub-format, e.g.: Commander adds 20 - switch(FModel.getQuest().getDeckConstructionRules()){ - case Default: break; - case Commander: base += 20; - } - + final int base = mode.equals(QuestMode.Fantasy) ? 15 : 20; return (base + this.getItemLevel(QuestItemType.ELIXIR_OF_LIFE)) - this.getItemLevel(QuestItemType.POUND_FLESH); } diff --git a/forge-gui/src/main/java/forge/quest/data/QuestData.java b/forge-gui/src/main/java/forge/quest/data/QuestData.java index 41574634113..e6a75adef7d 100644 --- a/forge-gui/src/main/java/forge/quest/data/QuestData.java +++ b/forge-gui/src/main/java/forge/quest/data/QuestData.java @@ -42,7 +42,7 @@ import java.util.Map; */ public final class QuestData { /** Holds the latest version of the Quest Data. */ - public static final int CURRENT_VERSION_NUMBER = 13; + public static final int CURRENT_VERSION_NUMBER = 12; // This field places the version number into QD instance, // but only when the object is created through the constructor @@ -70,11 +70,6 @@ public final class QuestData { public String currentDeck = "DEFAULT"; - /** - * Holds the subformat for this quest. Defaults to DeckConstructionRules.Default. - */ - public DeckConstructionRules deckConstructionRules = DeckConstructionRules.Default; - public QuestData() { //needed for XML serialization } @@ -92,11 +87,9 @@ public final class QuestData { * allow set unlocking during quest * @param startingWorld * starting world - * @param dcr - * deck construction rules e.g. Commander */ public QuestData(String name0, int diff, QuestMode mode0, GameFormat userFormat, - boolean allowSetUnlocks, final String startingWorld, DeckConstructionRules dcr) { + boolean allowSetUnlocks, final String startingWorld) { this.name = name0; if (userFormat != null) { @@ -106,7 +99,6 @@ public final class QuestData { this.achievements = new QuestAchievements(diff); this.assets = new QuestAssets(format); this.worldId = startingWorld; - this.deckConstructionRules = dcr; } /** diff --git a/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java b/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java index cd232367df9..de680502e37 100644 --- a/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java +++ b/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java @@ -223,16 +223,10 @@ public class QuestDataIO { // Current Deck moved from preferences to quest data - it should not be global for all quests!!! QuestDataIO.setFinalField(QuestData.class, "currentDeck", newData, FModel.getQuestPreferences().getPref(QPref.CURRENT_DECK)); } - if(saveVersion < 13){ - //Update for quest DeckConstructionRules - //Add a DeckConstructionRules set to Default. - QuestDataIO.setFinalField(QuestData.class, "deckConstructionRules", newData, DeckConstructionRules.Default); - } - if (saveVersion < 14) { + if (saveVersion < 13) { // Migrate DraftTournaments to use new Tournament class } - final QuestAssets qS = newData.getAssets(); final QuestAchievements qA = newData.getAchievements(); From 6abd3c45b454d03f7c098c911c50e55dbdb82adc Mon Sep 17 00:00:00 2001 From: Jeremy Pelkala Date: Fri, 2 Nov 2018 18:57:17 -0400 Subject: [PATCH 094/901] Added Commander quest mode and world -CardPool Added getFilteredPool() to easily get a Predicate applied copy of a CardPool. -GameRules Minor formatting change. -worlds.txt Added Random Commander to the list. -DeckConstructionRules New enum for defining the subformat a quest is using. -QuestAssets getLife() now has a switch for modifying the life for sub-formats. -QuestData New data save version. Includes a DeckConstructionRules enum. -QuestDataIO updateSaveFile will update old saves to have a default DeckConstructionRules complying with the new QuestData save version. -QuestController Updated to include support for DeckConstructionRules and specialized duel managers -QuestEvent Now have boolean to define if this is a "random" match for the duel list. Currently only QuestEventCommanderDuelManager makes use of this feature for Commander quests. -QuestEventCommanderDuel New QuestEventDuel used in the QuestEventCommanderDuelManager which contains a DeckProxy for use in generating random commander decks. -QuestEventCommanderDuelManager New duel manager to generate duels by difficulty for a Commander quest. Currently uses random generation to generate the decks of each opponent. -QuestSpellShop Sell Extras button now has a switch for taking into account special deck construction rules such as Commander only allowing singletons. -QuestUtil Starting a game now checks for various sub-format specific changes including a switch case for which variety of registered player to use. -QuestUtilCards Starting cardpool size is now modified by a switch case for sub-formats such as Commander. -QuestWinLoseController QuestEvents marked as random matches will now award a "Random Opponent Bonus" equal to the credit base. Currently only QuestEventCommanderDuelManager creates QuestEvents marked as such. -QuestWorld Added support for the Commander quest format and world. -CEditorQuest Many changes to add support for Commander in a style that, hopefully, also paths the way for future format support. -CSubmenuQuestData Support for Commander quests. -VSubmenuQuestData Support for Commander quests. --- .../src/main/java/forge/deck/CardPool.java | 14 ++ .../src/main/java/forge/game/GameRules.java | 3 +- .../deckeditor/controllers/CEditorQuest.java | 151 +++++++++++-- .../screens/home/quest/CSubmenuQuestData.java | 10 +- .../screens/home/quest/VSubmenuQuestData.java | 28 ++- forge-gui/res/quest/world/worlds.txt | 1 + .../java/forge/quest/QuestController.java | 14 +- .../src/main/java/forge/quest/QuestEvent.java | 4 + .../forge/quest/QuestEventCommanderDuel.java | 19 ++ .../quest/QuestEventCommanderDuelManager.java | 205 ++++++++++++++++++ .../main/java/forge/quest/QuestSpellShop.java | 17 +- .../src/main/java/forge/quest/QuestUtil.java | 60 ++++- .../main/java/forge/quest/QuestUtilCards.java | 12 +- .../forge/quest/QuestWinLoseController.java | 5 + .../src/main/java/forge/quest/QuestWorld.java | 8 +- .../quest/data/DeckConstructionRules.java | 17 ++ .../java/forge/quest/data/QuestAssets.java | 9 +- .../main/java/forge/quest/data/QuestData.java | 12 +- .../main/java/forge/quest/io/QuestDataIO.java | 8 +- 19 files changed, 561 insertions(+), 36 deletions(-) create mode 100644 forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java create mode 100644 forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java create mode 100644 forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java diff --git a/forge-core/src/main/java/forge/deck/CardPool.java b/forge-core/src/main/java/forge/deck/CardPool.java index 72ab8efb851..b484f31ab98 100644 --- a/forge-core/src/main/java/forge/deck/CardPool.java +++ b/forge-core/src/main/java/forge/deck/CardPool.java @@ -17,6 +17,7 @@ */ package forge.deck; +import com.google.common.base.Predicate; import com.google.common.collect.Lists; import forge.StaticData; import forge.card.CardDb; @@ -216,4 +217,17 @@ public class CardPool extends ItemPool { } return sb.toString(); } + + /** + * Applies a predicate to this CardPool's cards. + * @param predicate the Predicate to apply to this CardPool + * @return a new CardPool made from this CardPool with only the cards that agree with the provided Predicate + */ + public CardPool getFilteredPool(Predicate predicate){ + CardPool filteredPool = new CardPool(); + for(PaperCard pc : this.items.keySet()){ + if(predicate.apply(pc)) filteredPool.add(pc); + } + return filteredPool; + } } diff --git a/forge-game/src/main/java/forge/game/GameRules.java b/forge-game/src/main/java/forge/game/GameRules.java index dc7ed4cddf1..5e6876e9801 100644 --- a/forge-game/src/main/java/forge/game/GameRules.java +++ b/forge-game/src/main/java/forge/game/GameRules.java @@ -78,7 +78,8 @@ public class GameRules { } public boolean hasCommander() { - return appliedVariants.contains(GameType.Commander) || appliedVariants.contains(GameType.TinyLeaders) + return appliedVariants.contains(GameType.Commander) + || appliedVariants.contains(GameType.TinyLeaders) || appliedVariants.contains(GameType.Brawl); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java index c33da12cda7..b7842272e42 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java @@ -18,11 +18,20 @@ package forge.screens.deckeditor.controllers; import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; import com.google.common.base.Supplier; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; import forge.UiCommand; +import forge.card.CardRules; +import forge.card.CardRulesPredicates; +import forge.card.ColorSet; +import forge.card.mana.ManaCost; import forge.deck.CardPool; import forge.deck.Deck; import forge.deck.DeckSection; +import forge.deck.generation.DeckGeneratorBase; import forge.gui.GuiUtils; import forge.gui.framework.DragCell; import forge.gui.framework.FScreen; @@ -35,6 +44,7 @@ import forge.itemmanager.views.ItemTableColumn; import forge.model.FModel; import forge.properties.ForgePreferences.FPref; import forge.quest.QuestController; +import forge.quest.data.DeckConstructionRules; import forge.screens.deckeditor.AddBasicLandsDialog; import forge.screens.deckeditor.SEditorIO; import forge.screens.deckeditor.views.VAllDecks; @@ -48,6 +58,7 @@ import forge.util.ItemPool; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.print.Paper; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -103,6 +114,14 @@ public final class CEditorQuest extends CDeckEditor { allSections.add(DeckSection.Main); allSections.add(DeckSection.Sideboard); + //Add sub-format specific sections + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: + allSections.add(DeckSection.Commander); + break; + } + this.questData = questData0; final CardManager catalogManager = new CardManager(cDetailPicture, false, true); @@ -158,6 +177,10 @@ public final class CEditorQuest extends CDeckEditor { @Override protected CardLimit getCardLimit() { if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) { + //If this is a commander quest, only allow single copies of cards + if(FModel.getQuest().getDeckConstructionRules() == DeckConstructionRules.Commander){ + return CardLimit.Singleton; + } return CardLimit.Default; } return CardLimit.None; //if not enforcing deck legality, don't enforce default limit @@ -245,16 +268,98 @@ public final class CEditorQuest extends CDeckEditor { public void resetTables() { this.sectionMode = DeckSection.Main; - final Deck deck = this.controller.getModel(); - - final CardPool cardpool = getInitialCatalog(); - // remove bottom cards that are in the deck from the card pool - cardpool.removeAll(deck.getMain()); - // remove sideboard cards from the catalog - cardpool.removeAll(deck.getOrCreate(DeckSection.Sideboard)); // show cards, makes this user friendly - this.getCatalogManager().setPool(cardpool); - this.getDeckManager().setPool(deck.getMain()); + this.getCatalogManager().setPool(getRemainingCardPool()); + this.getDeckManager().setPool(getDeck().getMain()); + } + + /*** + * Provides the pool of cards the player has available to add to his or her deck. Also manages showing available cards + * to choose from for special deck construction rules, e.g.: Commander. + * @return CardPool of cards available to add to the player's deck. + */ + private CardPool getRemainingCardPool(){ + final CardPool cardpool = getInitialCatalog(); + + // remove bottom cards that are in the deck from the card pool + cardpool.removeAll(getDeck().getMain()); + + // remove sideboard cards from the catalog + cardpool.removeAll(getDeck().getOrCreate(DeckSection.Sideboard)); + + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: + //remove this deck's currently selected commander(s) from the catalog + cardpool.removeAll(getDeck().getOrCreate(DeckSection.Commander)); + + //TODO: Only thin if deck conformance is being applied + if(getDeck().getOrCreate(DeckSection.Commander).toFlatList().size() > 0) { + Predicate identityPredicate = new MatchCommanderColorIdentity(getDeckColorIdentity()); + CardPool filteredPool = cardpool.getFilteredPool(identityPredicate); + + return filteredPool; + } + break; + } + + return cardpool; + } + + /** + * Predicate that filters out based on a color identity provided upon instantiation. Used to filter the card + * list when a commander is chosen so the user can more easily see what cards are available for his or her deck + * and avoid making additions that are not legal. + */ + public static class MatchCommanderColorIdentity implements Predicate { + private final ColorSet allowedColor; + + public MatchCommanderColorIdentity(ColorSet color) { + allowedColor = color; + } + + @Override + public boolean apply(PaperCard subject) { + CardRules cr = subject.getRules(); + ManaCost mc = cr.getManaCost(); + return !mc.isPureGeneric() && allowedColor.containsAllColorsFrom(cr.getColorIdentity().getColor()); + } + } + + /** + * Compiles the color identity of the loaded deck based on the commanders. + * @return A ColorSet containing the color identity of the currently loaded deck. + */ + public ColorSet getDeckColorIdentity(){ + + List commanders = getDeck().getOrCreate(DeckSection.Commander).toFlatList(); + List colors = new ArrayList<>(); + + //Return early if there are no current commanders + if(commanders.size() == 0) return ColorSet.fromNames(colors); + + //For each commander,add each color of its color identity if not already added + for(PaperCard pc : commanders){ + if(!colors.contains("w") && pc.getRules().getColorIdentity().hasWhite()) colors.add("w"); + if(!colors.contains("u") && pc.getRules().getColorIdentity().hasBlue()) colors.add("u"); + if(!colors.contains("b") && pc.getRules().getColorIdentity().hasBlack()) colors.add("b"); + if(!colors.contains("r") && pc.getRules().getColorIdentity().hasRed()) colors.add("r"); + if(!colors.contains("g") && pc.getRules().getColorIdentity().hasGreen()) colors.add("g"); + } + + return ColorSet.fromNames(colors); + } + + /* + Used to make the code more readable in game terms. + */ + private Deck getDeck(){ + return this.controller.getModel(); + } + + private ItemPool getCommanderCardPool(){ + Predicate commanderPredicate = Predicates.compose(CardRulesPredicates.Presets.CAN_BE_COMMANDER, PaperCard.FN_GET_RULES); + return getRemainingCardPool().getFilteredPool(commanderPredicate); } @Override @@ -280,14 +385,30 @@ public final class CEditorQuest extends CDeckEditor { } /** - * Switch between the main deck and the sideboard editor. + * Switch between the main deck and the sideboard/Command Zone editor. */ public void setEditorMode(DeckSection sectionMode) { - if (sectionMode == DeckSection.Sideboard) { - this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Sideboard)); - } - else { - this.getDeckManager().setPool(this.controller.getModel().getMain()); + //Fixes null pointer error on switching tabs while quest deck editor is open. TODO: Find source of bug possibly? + if(sectionMode == null) sectionMode = DeckSection.Main; + + //Based on which section the editor is in, display the remaining card pool (or applicable card pool if in + //Commander) and the current section's cards + switch(sectionMode){ + case Main : + this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); + this.getCatalogManager().setPool(getRemainingCardPool()); + this.getDeckManager().setPool(this.controller.getModel().getMain()); + break; + case Sideboard : + this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); + this.getCatalogManager().setPool(getRemainingCardPool()); + this.getDeckManager().setPool(getDeck().getOrCreate(DeckSection.Sideboard)); + break; + case Commander : + this.getCatalogManager().setup(ItemManagerConfig.COMMANDER_POOL); + this.getCatalogManager().setPool(getCommanderCardPool()); + this.getDeckManager().setPool(getDeck().getOrCreate(DeckSection.Commander)); + break; } this.sectionMode = sectionMode; diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java index 131805b738b..8aa76293b55 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java @@ -10,6 +10,7 @@ import forge.model.FModel; import forge.properties.ForgeConstants; import forge.quest.*; import forge.quest.StartingPoolPreferences.PoolType; +import forge.quest.data.DeckConstructionRules; import forge.quest.data.GameFormatQuest; import forge.quest.data.QuestData; import forge.quest.data.QuestPreferences.QPref; @@ -340,9 +341,16 @@ public enum CSubmenuQuestData implements ICDoc { break; } + //Apply the appropriate deck construction rules for this quest + DeckConstructionRules dcr = DeckConstructionRules.Default; + + if(VSubmenuQuestData.SINGLETON_INSTANCE.isCommander()){ + dcr = DeckConstructionRules.Commander; + } + final QuestController qc = FModel.getQuest(); - qc.newGame(questName, difficulty, mode, fmtPrizes, view.isUnlockSetsAllowed(), dckStartPool, fmtStartPool, view.getStartingWorldName(), userPrefs); + qc.newGame(questName, difficulty, mode, fmtPrizes, view.isUnlockSetsAllowed(), dckStartPool, fmtStartPool, view.getStartingWorldName(), userPrefs, dcr); FModel.getQuest().save(); // Save in preferences. diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java index 9eee9e58ca3..70e284faf3d 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java @@ -62,6 +62,7 @@ public enum VSubmenuQuestData implements IVSubmenu { private final FRadioButton radHard = new FRadioButton("Hard"); private final FRadioButton radExpert = new FRadioButton("Expert"); private final FCheckBox boxFantasy = new FCheckBox("Fantasy Mode"); + private final FCheckBox boxCommander = new FCheckBox("Commander Subformat"); private final FLabel lblStartingWorld = new FLabel.Builder().text("Starting world:").build(); private final FComboBoxWrapper cbxStartingWorld = new FComboBoxWrapper<>(); @@ -274,9 +275,25 @@ public enum VSubmenuQuestData implements IVSubmenu { } }); - // Fantasy box enabled by Default + // Fantasy box selected by Default boxFantasy.setSelected(true); boxFantasy.setEnabled(true); + + // Commander box unselected by Default + boxCommander.setSelected(false); + boxCommander.setEnabled(true); + + boxCommander.addActionListener( + new ActionListener(){ + public void actionPerformed(ActionEvent e){ + if(!isCommander()) return; //do nothing if unselecting Commander Subformat + //Otherwise, set the starting world to Random Commander + cbxStartingWorld.setSelectedItem(FModel.getWorlds().get("Random Commander")); + } + } + + ); + boxCompleteSet.setEnabled(true); boxAllowDuplicates.setEnabled(true); @@ -286,6 +303,7 @@ public enum VSubmenuQuestData implements IVSubmenu { final JPanel pnlDifficultyMode = new JPanel(new MigLayout("insets 0, gap 1%, flowy")); pnlDifficultyMode.add(difficultyPanel, "gapright 4%"); pnlDifficultyMode.add(boxFantasy, "h 25px!, gapbottom 15, gapright 4%"); + pnlDifficultyMode.add(boxCommander, "h 25px!, gapbottom 15, gapright 4%"); pnlDifficultyMode.add(lblStartingWorld, "h 25px!, hidemode 3"); cbxStartingWorld.addTo(pnlDifficultyMode, "h 27px!, w 40%, pushx, gapbottom 7"); pnlDifficultyMode.setOpaque(false); @@ -487,6 +505,14 @@ public enum VSubmenuQuestData implements IVSubmenu { return boxFantasy.isSelected(); } + /** + * Auth. Imakuni + * @return True if the "Commander Subformat" check box is selected. + */ + public boolean isCommander() { + return boxCommander.isSelected(); + } + public boolean startWithCompleteSet() { return boxCompleteSet.isSelected(); } diff --git a/forge-gui/res/quest/world/worlds.txt b/forge-gui/res/quest/world/worlds.txt index b08931cde59..5d99427d535 100644 --- a/forge-gui/res/quest/world/worlds.txt +++ b/forge-gui/res/quest/world/worlds.txt @@ -1,5 +1,6 @@ Name:Main world Name:Random Standard +Name:Random Commander Name:Amonkhet|Dir:Amonkhet|Sets:AKH, HOU Name:Jamuraa|Dir:jamuraa|Sets:5ED, ARN, MIR, VIS, WTH|Banned:Chaos Orb; Falling Star Name:Kamigawa|Dir:2004 Kamigawa|Sets:CHK, BOK, SOK diff --git a/forge-gui/src/main/java/forge/quest/QuestController.java b/forge-gui/src/main/java/forge/quest/QuestController.java index 0d306f4431a..5366f7200bc 100644 --- a/forge-gui/src/main/java/forge/quest/QuestController.java +++ b/forge-gui/src/main/java/forge/quest/QuestController.java @@ -276,9 +276,10 @@ public class QuestController { public void newGame(final String name, final int difficulty, final QuestMode mode, final GameFormat formatPrizes, final boolean allowSetUnlocks, final Deck startingCards, final GameFormat formatStartingPool, - final String startingWorld, final StartingPoolPreferences userPrefs) { + final String startingWorld, final StartingPoolPreferences userPrefs, + DeckConstructionRules dcr) { - this.load(new QuestData(name, difficulty, mode, formatPrizes, allowSetUnlocks, startingWorld)); // pass awards and unlocks here + this.load(new QuestData(name, difficulty, mode, formatPrizes, allowSetUnlocks, startingWorld, dcr)); // pass awards and unlocks here if (startingCards != null) { this.myCards.addDeck(startingCards); @@ -435,6 +436,12 @@ public class QuestController { QuestWorld world = getWorld(); String path = ForgeConstants.DEFAULT_CHALLENGES_DIR; + //Use a variant specialized duel manager if this is a variant quest + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: this.duelManager = new QuestEventCommanderDuelManager(); return; + } + if (world != null) { if (world.getName().equals(QuestWorld.STANDARDWORLDNAME)) { @@ -449,7 +456,6 @@ public class QuestController { } this.duelManager = new QuestEventDuelManager(new File(path)); - } public HashSet GetRating() { @@ -607,4 +613,6 @@ public class QuestController { public void setCurrentDeck(String s) { model.currentDeck = s; } + + public DeckConstructionRules getDeckConstructionRules(){return model.deckConstructionRules;} } diff --git a/forge-gui/src/main/java/forge/quest/QuestEvent.java b/forge-gui/src/main/java/forge/quest/QuestEvent.java index 00a140c80e2..2a9bf6c1b63 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEvent.java +++ b/forge-gui/src/main/java/forge/quest/QuestEvent.java @@ -48,6 +48,7 @@ public abstract class QuestEvent implements IQuestEvent { private String profile = "Default"; // Opponent name if different from the challenge name private String opponentName = null; + private boolean isRandomMatch = false; public static final Function FN_GET_NAME = new Function() { @@ -174,4 +175,7 @@ public abstract class QuestEvent implements IQuestEvent { this.showDifficulty = showDifficulty; } + public boolean getIsRandomMatch(){return isRandomMatch;} + + public void setIsRandomMatch(boolean b){isRandomMatch = b;} } diff --git a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java new file mode 100644 index 00000000000..1d7924a04d7 --- /dev/null +++ b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java @@ -0,0 +1,19 @@ +package forge.quest; + +import forge.deck.DeckProxy; + +/** + * A QuestEventDuel with a CommanderDeckGenerator used exclusively within QuestEventCommanderDuelManager for the + * creation of randomly generated Commander decks in a Commander variant quest. + * Auth. Imakuni & Forge + */ +public class QuestEventCommanderDuel extends QuestEventDuel{ + /** + * The CommanderDeckGenerator for this duel. + */ + private DeckProxy deckProxy; + + public DeckProxy getDeckProxy() {return deckProxy;} + + public void setDeckProxy(DeckProxy dp) {deckProxy = dp;} +} diff --git a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java new file mode 100644 index 00000000000..384d9d11d77 --- /dev/null +++ b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java @@ -0,0 +1,205 @@ +package forge.quest; + +import forge.deck.*; +import forge.item.PaperCard; +import forge.model.FModel; +import forge.quest.data.QuestPreferences; +import forge.util.CollectionSuppliers; +import forge.util.MyRandom; +import forge.util.maps.EnumMapOfLists; +import forge.util.maps.MapOfLists; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Manages the creation of random Commander duels for a Commander variant quest. Random generation is handled via + * the CommanderDeckGenerator class. + * Auth. Forge & Imakuni#8015 + */ +public class QuestEventCommanderDuelManager implements QuestEventDuelManagerInterface { + /** + * The list of all possible Commander variant duels. + */ + private ArrayList commanderDuels = new ArrayList<>(); + + /** + * Contains the expert deck lists for the commanders. + */ + private List expertCommanderDecks; + + /** + * Immediately calls assembleDuels() to setup the commanderDuels variable. + */ + public QuestEventCommanderDuelManager(){ + assembleDuels(); + } + + /** + * Assembles the list of all possible Commander duels via CommanderDeckGenerator. Should be done within constructor. + */ + private void assembleDuels(){ + //isCardGen = true seemed to make slightly more difficult decks based purely on experience with a very small sample size. + //Gotta work on this more, its making pretty average decks after further testing. + expertCommanderDecks = CommanderDeckGenerator.getCommanderDecks(DeckFormat.Commander, true, true); + + List generatedDuels = CommanderDeckGenerator.getCommanderDecks(DeckFormat.Commander, true, false); + + for(DeckProxy dp : generatedDuels){ + QuestEventCommanderDuel duel = new QuestEventCommanderDuel(); + + duel.setDescription("Randomly generated " + dp.getName() + " commander deck."); + duel.setName(dp.getName()); + duel.setTitle(dp.getName()); + duel.setOpponentName(dp.getName()); + duel.setDifficulty(QuestEventDifficulty.EASY); + duel.setDeckProxy(dp); + + //Setting a blank deck avoids a null pointer exception. The deck is generated in generateDuels() to avoid long load times. + duel.setEventDeck(new Deck()); + + commanderDuels.add(duel); + } + } + + /** + * Retrieve list of all possible Commander duels. + * @return ArrayList containing all possible Commander duels. + */ + public Iterable getAllDuels() { + return commanderDuels; + } + + /** + * Retrieve list of all possible Commander duels. + * @param difficulty Currently unused + * @return ArrayList containing all possible Commander duels. + */ + public Iterable getDuels(QuestEventDifficulty difficulty){ + return commanderDuels; + } + + /** + * Composes an ArrayList containing 4 QuestEventDuels composed with Commander variant decks. One duel will have its + * title replaced as Random. + * @return ArrayList of QuestEventDuels containing 4 duels. + */ + public List generateDuels(){ + final List duelOpponents = new ArrayList<>(); + + //While there are less than 4 duels chosen + while(duelOpponents.size() < 4){ + //Get a random duel from the possible duels list + QuestEventCommanderDuel duel = (QuestEventCommanderDuel)commanderDuels.get(((int) (commanderDuels.size() * MyRandom.getRandom().nextDouble()))); + + //If the chosen duels list already contains this duel, get a different duel to prevent duplicate duels + if(duelOpponents.contains(duel)) continue; + + //Add the randomly chosen duel to the duel list + duelOpponents.add(duel); + + //Here the actual deck for this commander is generated by calling .getDeck() on the saved DeckProxy + duel.setEventDeck(duel.getDeckProxy().getDeck()); + + //Modify deck for difficulty + modifyDuelForDifficulty(duel); + + + } + + //Modify the stats of the final duel to hide the opponent, creating a "random" duel. + //We make a copy of the final duel and overwrite it in the duelOpponents to avoid changing the variables in + //the original duel, which gets reused. + QuestEventCommanderDuel duel = (QuestEventCommanderDuel)duelOpponents.get(duelOpponents.size() - 1); + QuestEventCommanderDuel randomDuel = new QuestEventCommanderDuel(); + + randomDuel.setName(duel.getName()); + randomDuel.setOpponentName(duel.getName()); + randomDuel.setDeckProxy(duel.getDeckProxy()); + randomDuel.setTitle("Random Opponent"); + randomDuel.setShowDifficulty(false); + randomDuel.setDescription("Fight a random generated commander opponent."); + randomDuel.setIsRandomMatch(true); + randomDuel.setEventDeck(duel.getEventDeck()); + + //Replace the final duel with this newly modified "random" duel + duelOpponents.set(duelOpponents.size()-1, randomDuel); + + return duelOpponents; + } + + /** + * Retrieves the expert level deck generation of a deck with the same commander as the provided DeckProxy. + * @param dp The easy generation commander deck + * @return The same commander's expert generation DeckProxy + */ + private Deck getExpertGenDeck(DeckProxy dp){ + for(QuestEventDuel qed : commanderDuels){ + QuestEventCommanderDuel cmdQED = (QuestEventCommanderDuel)qed; + if(cmdQED.getDeckProxy().getName().equals(dp.getName())){ + return cmdQED.getDeckProxy().getDeck(); + } + } + return null; + } + + /** + * Modifies a given duel by replacing a percentage of the deck with random cards from the more difficult generated version + * of the same commander's deck. Medium replaces 30%, Hard replaces 60%, Expert replaces 100%. + * @param duel The QuestEventCommanderDuel to modify + */ + private void modifyDuelForDifficulty(QuestEventCommanderDuel duel){ + final QuestPreferences questPreferences = FModel.getQuestPreferences(); + final int index = FModel.getQuest().getAchievements().getDifficulty(); + final int numberOfWins = FModel.getQuest().getAchievements().getWin(); + Deck expertDeck = getExpertGenDeck(duel.getDeckProxy()); + + int difficultyReplacementPercent = 0; + + //Note: The code is ordered to make the least number of comparisons I could think of at the time for speed reasons. + //In reality, it shouldn't really make much difference, but why not? + if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_EXPERTAI, index)) { + //At expert, the deck is replaced with the entire expert deck, and we can return immediately + duel.setEventDeck(expertDeck); + duel.setDifficulty(QuestEventDifficulty.EXPERT); + return; + } + + if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_MEDIUMAI, index)) { + difficultyReplacementPercent += 30; + duel.setDifficulty(QuestEventDifficulty.MEDIUM); + } else return; //return early here since it would be an easy opponent with no changes + + if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_HARDAI, index)) { + difficultyReplacementPercent += 30; + duel.setDifficulty(QuestEventDifficulty.HARD); + } + + CardPool easyMain = duel.getEventDeck().getMain(); + CardPool expertMain = expertDeck.getMain(); + + List easyList = easyMain.toFlatList(); + List expertList = expertMain.toFlatList(); + + //Replace cards in the easy deck with cards from the expert deck up to the difficulty replacement percent + for(int i = 0; i < difficultyReplacementPercent; i++){ + if(!easyMain.contains(expertList.get(i))) { //ensure that the card being copied over isn't already in the deck + easyMain.remove(easyList.get(i)); + easyMain.add(expertList.get(i)); + } + else{ + expertList.remove(expertList.get(i)); + i--; + if(expertList.size() == 0) break; //break if there are no more cards to copy over + } + } + } + + /** + * Randomizes the list of Commander Duels. + */ + public void randomizeOpponents(){ + Collections.shuffle(commanderDuels); + } +} diff --git a/forge-gui/src/main/java/forge/quest/QuestSpellShop.java b/forge-gui/src/main/java/forge/quest/QuestSpellShop.java index e9196e417df..96eae768963 100644 --- a/forge-gui/src/main/java/forge/quest/QuestSpellShop.java +++ b/forge-gui/src/main/java/forge/quest/QuestSpellShop.java @@ -344,11 +344,24 @@ public class QuestSpellShop { List> cardsToRemove = new LinkedList<>(); for (Entry item : inventoryManager.getPool()) { PaperCard card = (PaperCard)item.getKey(); - int numToKeep = card.getRules().getType().isBasic() ? - FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_BASIC_LAND_SIZE) : FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_SIZE); + //Number of a particular card to keep + int numToKeep = 4; + + if(card.getRules().getType().isBasic()){ + numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_BASIC_LAND_SIZE); + } else{ + //Choose card limit restrictions based on deck construction rules, e.g.: Commander allows only singletons + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_SIZE); break; + case Commander: numToKeep = 1; + } + } + + //If this card has an exception to the card limit, e.g.: Relentless Rats, get the quest preference if (DeckFormat.getLimitExceptions().contains(card.getName())) { numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_ANY_NUMBER_SIZE); } + if (numToKeep < item.getValue()) { cardsToRemove.add(Pair.of(item.getKey(), item.getValue() - numToKeep)); } diff --git a/forge-gui/src/main/java/forge/quest/QuestUtil.java b/forge-gui/src/main/java/forge/quest/QuestUtil.java index c2fe796ef7b..7ad6b6cd335 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtil.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtil.java @@ -41,6 +41,7 @@ import forge.properties.ForgePreferences.FPref; import forge.quest.bazaar.IQuestBazaarItem; import forge.quest.bazaar.QuestItemType; import forge.quest.bazaar.QuestPetController; +import forge.quest.data.DeckConstructionRules; import forge.quest.data.QuestAchievements; import forge.quest.data.QuestAssets; import forge.util.gui.SGuiChoose; @@ -51,6 +52,7 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; +import java.util.TreeSet; /** *

@@ -531,7 +533,17 @@ public class QuestUtil { Integer lifeHuman = null; boolean useBazaar = true; Boolean forceAnte = null; - int lifeAI = 20; + + //Generate a life modifier based on this quest's variant as held in the Quest Controller's DeckConstructionRules + int variantLifeModifier = 0; + + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: variantLifeModifier = 20; break; + } + + int lifeAI = 20 + variantLifeModifier; + if (event instanceof QuestEventChallenge) { final QuestEventChallenge qc = ((QuestEventChallenge) event); lifeAI = qc.getAILife(); @@ -545,8 +557,9 @@ public class QuestUtil { forceAnte = qc.isForceAnte(); } - final RegisteredPlayer humanStart = new RegisteredPlayer(getDeckForNewGame()); - final RegisteredPlayer aiStart = new RegisteredPlayer(event.getEventDeck()); + final RegisteredPlayer humanStart = getRegisteredPlayerByVariant(getDeckForNewGame()); + + final RegisteredPlayer aiStart = getRegisteredPlayerByVariant(event.getEventDeck()); if (lifeHuman != null) { humanStart.setStartingLife(lifeHuman); @@ -581,17 +594,39 @@ public class QuestUtil { rules.setGamesPerMatch(qData.getMatchLength()); rules.setManaBurn(FModel.getPreferences().getPrefBoolean(FPref.UI_MANABURN)); rules.setCanCloneUseTargetsImage(FModel.getPreferences().getPrefBoolean(FPref.UI_CLONE_MODE_SOURCE)); + + TreeSet variant = new TreeSet(); + if(FModel.getQuest().getDeckConstructionRules() == DeckConstructionRules.Commander){ + variant.add(GameType.Commander); + } + final HostedMatch hostedMatch = GuiBase.getInterface().hostMatch(); final IGuiGame gui = GuiBase.getInterface().getNewGuiGame(); gui.setPlayerAvatar(aiPlayer, event); FThreads.invokeInEdtNowOrLater(new Runnable(){ @Override public void run() { - hostedMatch.startMatch(rules, null, starter, ImmutableMap.of(humanStart, gui)); + hostedMatch.startMatch(rules, variant, starter, ImmutableMap.of(humanStart, gui)); } }); } + /** + * Uses the appropriate RegisteredPlayer command for generating a RegisteredPlayer based on this quest's variant as + * held by the QuestController's DeckConstructionRules. + * @param deck The deck to generate the RegisteredPlayer with + * @return A newly made RegisteredPlayer specific to the quest's variant + */ + private static RegisteredPlayer getRegisteredPlayerByVariant(Deck deck){ + switch (FModel.getQuest().getDeckConstructionRules()) { + case Default: + return new RegisteredPlayer(deck); + case Commander: + return RegisteredPlayer.forCommander(deck); + } + return null; + } + private static Deck getDeckForNewGame() { Deck deck = null; if (event instanceof QuestEventChallenge) { @@ -623,7 +658,7 @@ public class QuestUtil { } if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) { - final String errorMessage = GameType.Quest.getDeckFormat().getDeckConformanceProblem(deck); + final String errorMessage = getDeckConformanceProblems(deck); if (null != errorMessage) { SOptionPane.showErrorDialog("Your deck " + errorMessage + " Please edit or choose a different deck.", "Invalid Deck"); return false; @@ -633,6 +668,21 @@ public class QuestUtil { return true; } + public static String getDeckConformanceProblems(Deck deck){ + String errorMessage = GameType.Quest.getDeckFormat().getDeckConformanceProblem(deck);; + + if(errorMessage != null) return errorMessage; //return immediately if the deck does not conform to quest requirements + + //Check for all applicable deck construction rules per this quests's saved DeckConstructionRules enum + switch(FModel.getQuest().getDeckConstructionRules()){ + case Commander: + errorMessage = GameType.Commander.getDeckFormat().getDeckConformanceProblem(deck); + break; + } + + return errorMessage; + } + /** Duplicate in DeckEditorQuestMenu and * probably elsewhere...can streamline at some point * (probably shouldn't be here). diff --git a/forge-gui/src/main/java/forge/quest/QuestUtilCards.java b/forge-gui/src/main/java/forge/quest/QuestUtilCards.java index c8d77d863ad..54a4887ba8a 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtilCards.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtilCards.java @@ -308,10 +308,16 @@ public final class QuestUtilCards { * user preferences */ public void setupNewGameCardPool(final GameFormat formatStartingPool, final int idxDifficulty, final StartingPoolPreferences userPrefs) { + //Add additional cards to the starter card pool based on variant if applicable + double variantModifier = 0; + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: variantModifier = 2; break; + } - final int nC = questPreferences.getPrefInt(DifficultyPrefs.STARTING_COMMONS, idxDifficulty); - final int nU = questPreferences.getPrefInt(DifficultyPrefs.STARTING_UNCOMMONS, idxDifficulty); - final int nR = questPreferences.getPrefInt(DifficultyPrefs.STARTING_RARES, idxDifficulty); + final int nC = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_COMMONS, idxDifficulty) * variantModifier); + final int nU = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_UNCOMMONS, idxDifficulty) * variantModifier); + final int nR = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_RARES, idxDifficulty) * variantModifier); addAllCards(BoosterUtils.getQuestStarterDeck(formatStartingPool, nC, nU, nR, userPrefs)); diff --git a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java index 2e93e7d4fec..265ea61bb58 100644 --- a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java +++ b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java @@ -226,6 +226,11 @@ public class QuestWinLoseController { sb.append(StringUtils.capitalize(qEvent.getDifficulty().getTitle())); sb.append(" opponent: ").append(credBase).append(" credits.\n"); + if(qEvent.getIsRandomMatch()){ + sb.append("Random Opponent Bonus: " + credBase + " credit" + (credBase > 1 ? "s." : ".") + "\n"); + credBase += credBase; + } + final int winMultiplier = Math.min(qData.getAchievements().getWin(), FModel.getQuestPreferences().getPrefInt(QPref.REWARDS_WINS_MULTIPLIER_MAX)); final int creditsForPreviousWins = (int) ((Double.parseDouble(FModel.getQuestPreferences() .getPref(QPref.REWARDS_WINS_MULTIPLIER)) * winMultiplier)); diff --git a/forge-gui/src/main/java/forge/quest/QuestWorld.java b/forge-gui/src/main/java/forge/quest/QuestWorld.java index e20dcf98ce8..4c77b0ec515 100644 --- a/forge-gui/src/main/java/forge/quest/QuestWorld.java +++ b/forge-gui/src/main/java/forge/quest/QuestWorld.java @@ -40,6 +40,7 @@ public class QuestWorld implements Comparable{ private final String dir; private final GameFormatQuest format; public static final String STANDARDWORLDNAME = "Random Standard"; + public static final String RANDOMCOMMANDERWORLDNAME = "Random Commander"; private boolean isCustom; @@ -129,7 +130,6 @@ public class QuestWorld implements Comparable{ /** * TODO: Write javadoc for Constructor. * @param file0 - * @param keySelector0 */ public Reader(String file0) { super(file0, QuestWorld.FN_GET_NAME); @@ -194,6 +194,12 @@ public class QuestWorld implements Comparable{ FModel.getFormats().getStandard().getBannedCardNames(),false); } + if (useName.equalsIgnoreCase(QuestWorld.RANDOMCOMMANDERWORLDNAME)){ + useFormat = new GameFormatQuest(QuestWorld.RANDOMCOMMANDERWORLDNAME, + FModel.getFormats().getFormat("Commander").getAllowedSetCodes(), + FModel.getFormats().getFormat("Commander").getBannedCardNames(),false); + } + // System.out.println("Creating quest world " + useName + " (index " + useIdx + ", dir: " + useDir); // if (useFormat != null) { System.out.println("SETS: " + sets + "\nBANNED: " + bannedCards); } diff --git a/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java b/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java new file mode 100644 index 00000000000..3744beea09d --- /dev/null +++ b/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java @@ -0,0 +1,17 @@ +package forge.quest.data; + +/** + * Used to clarify which subformat a quest is using e.g. Commander. + * Auth. Imakuni + */ +public enum DeckConstructionRules { + /** + * Typically has no effect on Quest gameplay. + */ + Default, + + /** + * Commander ruleset. 99 card deck, no copies other than basic lands, commander(s) in Command zone + */ + Commander +} 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 616c49d937b..8f7b644641b 100644 --- a/forge-gui/src/main/java/forge/quest/data/QuestAssets.java +++ b/forge-gui/src/main/java/forge/quest/data/QuestAssets.java @@ -200,7 +200,14 @@ public class QuestAssets { * @return the life */ public int getLife(final QuestMode mode) { - final int base = mode.equals(QuestMode.Fantasy) ? 15 : 20; + int base = mode.equals(QuestMode.Fantasy) ? 15 : 20; + + //Modify life for the quest's sub-format, e.g.: Commander adds 20 + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: base += 20; + } + return (base + this.getItemLevel(QuestItemType.ELIXIR_OF_LIFE)) - this.getItemLevel(QuestItemType.POUND_FLESH); } diff --git a/forge-gui/src/main/java/forge/quest/data/QuestData.java b/forge-gui/src/main/java/forge/quest/data/QuestData.java index e6a75adef7d..41574634113 100644 --- a/forge-gui/src/main/java/forge/quest/data/QuestData.java +++ b/forge-gui/src/main/java/forge/quest/data/QuestData.java @@ -42,7 +42,7 @@ import java.util.Map; */ public final class QuestData { /** Holds the latest version of the Quest Data. */ - public static final int CURRENT_VERSION_NUMBER = 12; + public static final int CURRENT_VERSION_NUMBER = 13; // This field places the version number into QD instance, // but only when the object is created through the constructor @@ -70,6 +70,11 @@ public final class QuestData { public String currentDeck = "DEFAULT"; + /** + * Holds the subformat for this quest. Defaults to DeckConstructionRules.Default. + */ + public DeckConstructionRules deckConstructionRules = DeckConstructionRules.Default; + public QuestData() { //needed for XML serialization } @@ -87,9 +92,11 @@ public final class QuestData { * allow set unlocking during quest * @param startingWorld * starting world + * @param dcr + * deck construction rules e.g. Commander */ public QuestData(String name0, int diff, QuestMode mode0, GameFormat userFormat, - boolean allowSetUnlocks, final String startingWorld) { + boolean allowSetUnlocks, final String startingWorld, DeckConstructionRules dcr) { this.name = name0; if (userFormat != null) { @@ -99,6 +106,7 @@ public final class QuestData { this.achievements = new QuestAchievements(diff); this.assets = new QuestAssets(format); this.worldId = startingWorld; + this.deckConstructionRules = dcr; } /** diff --git a/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java b/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java index de680502e37..cd232367df9 100644 --- a/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java +++ b/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java @@ -223,10 +223,16 @@ public class QuestDataIO { // Current Deck moved from preferences to quest data - it should not be global for all quests!!! QuestDataIO.setFinalField(QuestData.class, "currentDeck", newData, FModel.getQuestPreferences().getPref(QPref.CURRENT_DECK)); } - if (saveVersion < 13) { + if(saveVersion < 13){ + //Update for quest DeckConstructionRules + //Add a DeckConstructionRules set to Default. + QuestDataIO.setFinalField(QuestData.class, "deckConstructionRules", newData, DeckConstructionRules.Default); + } + if (saveVersion < 14) { // Migrate DraftTournaments to use new Tournament class } + final QuestAssets qS = newData.getAssets(); final QuestAchievements qA = newData.getAchievements(); From 976418b89cd9e2574e1c5208abb5c0fc6cab1408 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 3 Nov 2018 08:24:03 +0300 Subject: [PATCH 095/901] - Improve Vivien of the Arkbow +2 AI in absence of creatures. --- .../src/main/java/forge/ai/AiController.java | 7 +++++++ .../java/forge/ai/ability/CountersPutAi.java | 17 +++++++++++++---- .../res/cardsfolder/v/vivien_of_the_arkbow.txt | 2 +- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 658c66fd8ee..f86ed4b3ac7 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -737,6 +737,13 @@ public class AiController { int a1 = a.getPayCosts() == null ? 0 : a.getPayCosts().getTotalMana().getCMC(); int b1 = b.getPayCosts() == null ? 0 : b.getPayCosts().getTotalMana().getCMC(); + // deprioritize SAs explicitly marked as preferred to be activated last compared to all other SAs + if (a.hasParam("AIActivateLast") && !b.hasParam("AIActivateLast")) { + return 1; + } else if (b.hasParam("AIActivateLast") && !a.hasParam("AIActivateLast")) { + return -1; + } + // deprioritize planar die roll marked with AIRollPlanarDieParams:LowPriority$ True if (ApiType.RollPlanarDice == a.getApi() && a.getHostCard() != null && a.getHostCard().hasSVar("AIRollPlanarDieParams") && a.getHostCard().getSVar("AIRollPlanarDieParams").toLowerCase().matches(".*lowpriority\\$\\s*true.*")) { return 1; diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java index 171d3431506..97eefea9ad8 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -12,10 +12,7 @@ import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; import forge.game.card.*; import forge.game.combat.CombatUtil; -import forge.game.cost.Cost; -import forge.game.cost.CostPart; -import forge.game.cost.CostRemoveCounter; -import forge.game.cost.CostSacrifice; +import forge.game.cost.*; import forge.game.keyword.Keyword; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; @@ -433,6 +430,18 @@ public class CountersPutAi extends SpellAbilityAi { return false; } + // Activate +Loyalty planeswalker abilities even if they have no target (e.g. Vivien of the Arkbow), + // but try to do it in Main 2 then so that the AI has a chance to play creatures first. + if (list.isEmpty() + && sa.hasParam("Planeswalker") + && sa.getPayCosts() != null + && sa.getPayCosts().hasOnlySpecificCostType(CostPutCounter.class) + && sa.isTargetNumberValid() + && sa.getTargets().getNumTargeted() == 0 + && ai.getGame().getPhaseHandler().is(PhaseType.MAIN2, ai)) { + return true; + } + if (sourceName.equals("Abzan Charm")) { final TargetRestrictions abTgt = sa.getTargetRestrictions(); // specific AI for instant with distribute two +1/+1 counters diff --git a/forge-gui/res/cardsfolder/v/vivien_of_the_arkbow.txt b/forge-gui/res/cardsfolder/v/vivien_of_the_arkbow.txt index 3fb233b6d82..f570d8b3fb8 100644 --- a/forge-gui/res/cardsfolder/v/vivien_of_the_arkbow.txt +++ b/forge-gui/res/cardsfolder/v/vivien_of_the_arkbow.txt @@ -1,7 +1,7 @@ Name:Vivien of the Arkbow ManaCost:4 G G Types:Legendary Planeswalker Vivien -A:AB$ PutCounter | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | CounterNum$ 2 | CounterType$ P1P1 | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | Planeswalker$ True | SpellDescription$ Put two +1/+1 counters on up to one target creature. +A:AB$ PutCounter | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | CounterNum$ 2 | CounterType$ P1P1 | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | AIActivateLast$ True | SpellDescription$ Put two +1/+1 counters on up to one target creature. A:AB$ Pump | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | | ValidTgts$ Creature.YouCtrl | AILogic$ PowerDmg | TgtPrompt$ Select target creature you control | SubAbility$ TailDamage | StackDescription$ None | SpellDescription$ Target creature you control deals damage equal to its power to target creature you don't control. SVar:TailDamage:DB$ DealDamage | ValidTgts$ Creature.YouDontCtrl | AILogic$ PowerDmg | TgtPrompt$ Select target creature you don't control | NumDmg$ X | References$ X | ConditionDefined$ Targeted | ConditionPresent$ Creature | ConditionCompare$ EQ1 | DamageSource$ ParentTarget SVar:X:ParentTargeted$CardPower From 0f72f0db8aef0d4a6fcfe18ebaffefe521ae314d Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 3 Nov 2018 11:01:15 +0300 Subject: [PATCH 096/901] - Attempt to fix the AI never playing Fight with Fire, kicked or unkicked. --- forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java | 4 +++- forge-gui/res/cardsfolder/f/fight_with_fire.txt | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java index d55ad8aa463..a947d7cbb12 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -494,7 +494,9 @@ public class DamageDealAi extends DamageAiBase { return true; } - if (tgt.getMaxTargets(source, sa) <= 0) { + // AssumeAtLeastOneTarget is used for cards with funky targeting implementation like Fight with Fire which would + // otherwise confuse the AI by returning 0 unexpectedly during SA "AI can play" tests. + if (tgt.getMaxTargets(source, sa) <= 0 && !logic.equals("AssumeAtLeastOneTarget")) { return false; } diff --git a/forge-gui/res/cardsfolder/f/fight_with_fire.txt b/forge-gui/res/cardsfolder/f/fight_with_fire.txt index 8bf91fdea76..b4554c03165 100644 --- a/forge-gui/res/cardsfolder/f/fight_with_fire.txt +++ b/forge-gui/res/cardsfolder/f/fight_with_fire.txt @@ -2,8 +2,8 @@ Name:Fight with Fire ManaCost:2 R Types:Sorcery K:Kicker:5 R -A:SP$ DealDamage | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 5 | TargetMin$ X | TargetMax$ X | References$ X | SubAbility$ DBDealDamage | SpellDescription$ CARDNAME deals 5 damage to target creature. If this spell was kicked, it deals 10 damage divided as you choose among any number of targets instead. -SVar:DBDealDamage:DB$ DealDamage | Condition$ Kicked | ValidTgts$ Creature,Player,Planeswalker | NumDmg$ 10 | TargetMin$ Y | TargetMax$ Z | DividedAsYouChoose$ Z | References$ Y,Z +A:SP$ DealDamage | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 5 | TargetMin$ X | TargetMax$ X | References$ X | SubAbility$ DBDealDamage | AILogic$ AssumeAtLeastOneTarget | SpellDescription$ CARDNAME deals 5 damage to target creature. If this spell was kicked, it deals 10 damage divided as you choose among any number of targets instead. +SVar:DBDealDamage:DB$ DealDamage | Condition$ Kicked | ValidTgts$ Creature,Player,Planeswalker | NumDmg$ 10 | TargetMin$ Y | TargetMax$ Z | DividedAsYouChoose$ Z | References$ Y,Z | AILogic$ AssumeAtLeastOneTarget SVar:X:Count$Kicked.0.1 SVar:Y:Count$Kicked.1.0 SVar:Z:Count$Kicked.10.0 From 877b0abd660c7a0d32cae968a9242a8c2cab68ce Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 3 Nov 2018 18:02:18 +0100 Subject: [PATCH 097/901] add Sentry Breadcrumb --- .../src/main/java/forge/ai/AiController.java | 19 +++++++++++++++++++ .../java/forge/game/ability/AbilityUtils.java | 12 ++++++++++++ 2 files changed, 31 insertions(+) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index f86ed4b3ac7..9714c8fe38a 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -60,6 +60,8 @@ import forge.util.Aggregates; import forge.util.Expressions; import forge.util.MyRandom; import forge.util.collect.FCollectionView; +import io.sentry.Sentry; +import io.sentry.event.BreadcrumbBuilder; import java.security.InvalidParameterException; import java.util.*; @@ -652,7 +654,24 @@ public class AiController { AiCardMemory.clearMemorySet(this, AiCardMemory.MemorySet.MARKED_TO_AVOID_REENTRY); if (sa.getApi() != null) { + + String msg = "AiController:canPlaySa: AI checks for if can PlaySa"; + Sentry.getContext().recordBreadcrumb( + new BreadcrumbBuilder().setMessage(msg) + .withData("Api", sa.getApi().toString()) + .withData("Card", card.getName()).withData("SA", sa.toString()).build() + ); + + // add Extra for debugging + Sentry.getContext().addExtra("Card", card); + Sentry.getContext().addExtra("SA", sa.toString()); + boolean canPlay = SpellApiToAi.Converter.get(sa.getApi()).canPlayAIWithSubs(player, sa); + + // remove added extra + Sentry.getContext().removeExtra("Card"); + Sentry.getContext().removeExtra("SA"); + if (!canPlay) { return AiPlayDecision.CantPlayAi; } diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index 7f5be63dfd4..7995367c674 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -29,6 +29,9 @@ import forge.util.Expressions; import forge.util.TextUtil; import forge.util.collect.FCollection; import forge.util.collect.FCollectionView; +import io.sentry.Sentry; +import io.sentry.event.BreadcrumbBuilder; + import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.text.WordUtils; @@ -1345,6 +1348,15 @@ public class AbilityUtils { } private static void resolveApiAbility(final SpellAbility sa, final Game game) { + final Card card = sa.getHostCard(); + + String msg = "AbilityUtils:resolveApiAbility: try to resolve API ability"; + Sentry.getContext().recordBreadcrumb( + new BreadcrumbBuilder().setMessage(msg) + .withData("Api", sa.getApi().toString()) + .withData("Card", card.getName()).withData("SA", sa.toString()).build() + ); + // check conditions if (sa.getConditions().areMet(sa)) { if (sa.isWrapper() || StringUtils.isBlank(sa.getParam("UnlessCost"))) { From d870a1b0f185b7e5e2e96ebde6f413cfdc839b4e Mon Sep 17 00:00:00 2001 From: Michael Kamensky Date: Sun, 4 Nov 2018 09:12:59 +0000 Subject: [PATCH 098/901] Make the AI account for static abilities granted from the evaluated card in ApplyStaticContPT --- forge-ai/src/main/java/forge/ai/ComputerUtilCard.java | 1 + forge-gui/res/cardsfolder/t/the_mirari_conjecture.txt | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index 008da7ec703..ec142dd9f35 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -1616,6 +1616,7 @@ public class ComputerUtilCard { if (exclude != null) { list.removeAll(exclude); } + list.add(vCard); // account for the static abilities that may be present on the card itself for (final Card c : list) { for (final StaticAbility stAb : c.getStaticAbilities()) { final Map params = stAb.getMapParams(); diff --git a/forge-gui/res/cardsfolder/t/the_mirari_conjecture.txt b/forge-gui/res/cardsfolder/t/the_mirari_conjecture.txt index 692e5a00d4e..c43bdc70132 100644 --- a/forge-gui/res/cardsfolder/t/the_mirari_conjecture.txt +++ b/forge-gui/res/cardsfolder/t/the_mirari_conjecture.txt @@ -7,6 +7,7 @@ SVar:DBChangeZoneII:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | Val SVar:DBEffect:DB$ Effect | Name$ The Mirari Conjecture Effect | Triggers$ InstantSorceryCast | SVars$ TrigCopySpell | SpellDescription$ Until end of turn, whenever you cast an instant or sorcery spell, copy it. You may choose new targets for the copy. SVar:InstantSorceryCast:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | Execute$ TrigCopySpell | TriggerZones$ Command | TriggerDescription$ Until end of turn, whenever you cast an instant or sorcery spell, copy it. You may choose new targets for the copy. SVar:TrigCopySpell:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility -SVar:NeedsToPlay:Instant.YouCtrl+inZoneGraveyard,Sorcery.YouCtrl+inZoneGraveyard +SVar:NeedsToPlayVar:Z GE1 +SVar:Z:Count$ValidGraveyard Instant.YouOwn,Sorcery.YouOwn DeckHints:Type$Instant|Sorcery Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI — Return target instant card from your graveyard to your hand.\nII — Return target sorcery card from your graveyard to your hand.\nIII — Until end of turn, whenever you cast an instant or sorcery spell, copy it. You may choose new targets for the copy. From be86f5be9b73132112609e894e88b38f35b62134 Mon Sep 17 00:00:00 2001 From: Michael Kamensky Date: Sun, 4 Nov 2018 18:34:15 +0000 Subject: [PATCH 099/901] Added several M19-GRN quest opponent decks, fixed the AI for several cards in Standard. --- .../java/forge/ai/ability/CountersPutAi.java | 1 + .../java/forge/ai/ability/DamageDealAi.java | 8 +++++ .../java/forge/game/card/CardFactoryUtil.java | 2 +- .../res/cardsfolder/a/assassins_trophy.txt | 2 +- .../res/cardsfolder/c/chamber_sentry.txt | 2 ++ forge-gui/res/cardsfolder/p/plaguecrafter.txt | 1 + .../res/quest/duels/Amalia Sheran Sharm 1.dck | 23 ++++++++++++++ .../res/quest/duels/Amalia Sheran Sharm 2.dck | 30 +++++++++++++++++++ forge-gui/res/quest/duels/Evangelyne 2.dck | 25 ++++++++++++++++ forge-gui/res/quest/duels/Evangelyne 3.dck | 29 ++++++++++++++++++ forge-gui/res/quest/duels/Grugaloragran 2.dck | 24 +++++++++++++++ .../res/quest/duels/Grugalorasalar 2.dck | 27 +++++++++++++++++ forge-gui/res/quest/duels/Joris Jurgen 2.dck | 28 +++++++++++++++++ forge-gui/res/quest/duels/Nox 2.dck | 29 ++++++++++++++++++ forge-gui/res/quest/duels/Nox 3.dck | 30 +++++++++++++++++++ .../quest/duels/Percedal of Sadlygrove 2.dck | 26 ++++++++++++++++ forge-gui/res/quest/duels/Ruel Stroud 2.dck | 30 +++++++++++++++++++ forge-gui/res/quest/duels/Yugo 2.dck | 23 ++++++++++++++ .../res/quest/precons => }/Rivals.dck | 0 19 files changed, 338 insertions(+), 2 deletions(-) create mode 100644 forge-gui/res/quest/duels/Amalia Sheran Sharm 1.dck create mode 100644 forge-gui/res/quest/duels/Amalia Sheran Sharm 2.dck create mode 100644 forge-gui/res/quest/duels/Evangelyne 2.dck create mode 100644 forge-gui/res/quest/duels/Evangelyne 3.dck create mode 100644 forge-gui/res/quest/duels/Grugaloragran 2.dck create mode 100644 forge-gui/res/quest/duels/Grugalorasalar 2.dck create mode 100644 forge-gui/res/quest/duels/Joris Jurgen 2.dck create mode 100644 forge-gui/res/quest/duels/Nox 2.dck create mode 100644 forge-gui/res/quest/duels/Nox 3.dck create mode 100644 forge-gui/res/quest/duels/Percedal of Sadlygrove 2.dck create mode 100644 forge-gui/res/quest/duels/Ruel Stroud 2.dck create mode 100644 forge-gui/res/quest/duels/Yugo 2.dck rename forge-gui/res/quest/precons/{forge-gui/res/quest/precons => }/Rivals.dck (100%) diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java index 97eefea9ad8..38b1c87d56c 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -724,6 +724,7 @@ public class CountersPutAi extends SpellAbilityAi { int totalTargets = list.size(); + sa.resetTargets(); while (sa.canAddMoreTarget()) { if (mandatory) { // When things are mandatory, gotta handle a little differently 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 a947d7cbb12..473ff354f99 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -562,7 +562,15 @@ public class DamageDealAi extends DamageAiBase { return true; } } + + int totalTargetedSoFar = -1; while (tcs.getNumTargeted() < tgt.getMaxTargets(source, sa)) { + if (totalTargetedSoFar == tcs.getNumTargeted()) { + // Avoid looping endlessly when choosing targets for cards with variable target number and type + // like Jaya's Immolating Inferno + break; + } + totalTargetedSoFar = tcs.getNumTargeted(); if (oppTargetsChoice && sa.getActivatingPlayer().equals(ai) && !sa.isTrigger()) { // canPlayAI (sa activated by ai) Player targetingPlayer = AbilityUtils.getDefinedPlayers(source, sa.getParam("TargetingPlayer"), sa).get(0); diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index b07ffa1c36d..74c724ccca6 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -1375,7 +1375,7 @@ public class CardFactoryUtil { return doXMath(n, m, c); } if (sq[0].startsWith("UniqueManaColorsProduced")) { - boolean untappedOnly = sq[0].contains("ByUntappedSources"); + boolean untappedOnly = sq[1].contains("ByUntappedSources"); int uniqueColors = 0; CardCollectionView otb = cc.getCardsIn(ZoneType.Battlefield); outer: for (byte color : MagicColor.WUBRG) { diff --git a/forge-gui/res/cardsfolder/a/assassins_trophy.txt b/forge-gui/res/cardsfolder/a/assassins_trophy.txt index ed67411a1ff..74957f7e2e2 100644 --- a/forge-gui/res/cardsfolder/a/assassins_trophy.txt +++ b/forge-gui/res/cardsfolder/a/assassins_trophy.txt @@ -1,7 +1,7 @@ Name:Assassin's Trophy ManaCost:B G Types:Instant -A:SP$ Destroy | Cost$ B G | ValidTgts$ Permanent.OppCtrl | TgtPrompt$ Select target permanent an opponent controls | SubAbility$ DBChange | SpellDescription$ Destroy target permanent an opponent controls. Its controller may search their library for a basic land card, put it onto the battlefield, then shuffle their library. +A:SP$ Destroy | Cost$ B G | ValidTgts$ Permanent.OppCtrl | AITgts$ Permanent.nonLand,Land.nonBasic | TgtPrompt$ Select target permanent an opponent controls | SubAbility$ DBChange | SpellDescription$ Destroy target permanent an opponent controls. Its controller may search their library for a basic land card, put it onto the battlefield, then shuffle their library. SVar:DBChange:DB$ ChangeZone | Optional$ True | Origin$ Library | Destination$ Battlefield | DefinedPlayer$ TargetedController | ChangeType$ Land.Basic | ChangeNum$ 1 | DefinedPlayer$ TargetedController | ShuffleNonMandatory$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True Oracle:Destroy target permanent an opponent controls. Its controller may search their library for a basic land card, put it onto the battlefield, then shuffle their library. diff --git a/forge-gui/res/cardsfolder/c/chamber_sentry.txt b/forge-gui/res/cardsfolder/c/chamber_sentry.txt index cbaa7f301cb..f8ca75f1a32 100644 --- a/forge-gui/res/cardsfolder/c/chamber_sentry.txt +++ b/forge-gui/res/cardsfolder/c/chamber_sentry.txt @@ -9,4 +9,6 @@ SVar:X:Count$xPaid A:AB$ ChangeZone | Cost$ W U B R G | Origin$ Graveyard | Destination$ Hand | ActivationZone$ Graveyard | SpellDescription$ Return CARDNAME from your graveyard to your hand. SVar:DiscardMe:1 DeckHas:Ability$Counters +SVar:NeedsToPlayVar:Z GE1 +SVar:Z:Count$UniqueManaColorsProduced.ByUntappedSources Oracle:Chamber Sentry enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it.\n{X}, {T}, Remove X +1/+1 counters from Chamber Sentry: It deals X damage to any target.\n{W}{U}{B}{R}{G}: Return Chamber Sentry from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/p/plaguecrafter.txt b/forge-gui/res/cardsfolder/p/plaguecrafter.txt index d8608316796..7c02effb695 100644 --- a/forge-gui/res/cardsfolder/p/plaguecrafter.txt +++ b/forge-gui/res/cardsfolder/p/plaguecrafter.txt @@ -9,4 +9,5 @@ SVar:RememberSac:DB$ Pump | RememberObjects$ RememberedController | SubAbility$ SVar:TrigSac:DB$ SacrificeAll | Defined$ Remembered | SubAbility$ Discard SVar:Discard:DB$ Discard | Mode$ TgtChoose | NumCards$ 1 | Defined$ Player.IsNotRemembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:NeedsToPlay:Creature.OppCtrl,Planeswalker.OppCtrl Oracle:When Plaguecrafter enters the battlefield, each player sacrifices a creature or planeswalker. Each player who can't discards a card. diff --git a/forge-gui/res/quest/duels/Amalia Sheran Sharm 1.dck b/forge-gui/res/quest/duels/Amalia Sheran Sharm 1.dck new file mode 100644 index 00000000000..3ca2cc34700 --- /dev/null +++ b/forge-gui/res/quest/duels/Amalia Sheran Sharm 1.dck @@ -0,0 +1,23 @@ +[duel] +[metadata] +Name=Amalia Sheran Sharm 1 +Title=Amalia Sheran Sharm +Difficulty=medium +Description=Mono Green Ramp deck with Elves synergy and singleton Gigantosaurus and Aggressive Mammoth. +Deck Type=constructed +Icon=Amalia Sheran Sharm.jpg +[main] +1 Aggressive Mammoth|M19 +4 Devkarin Dissident|GRN +4 District Guide|GRN +4 Druid of the Cowl|M19 +2 Elvish Clancaller|M19 +22 Forest +2 Fountain of Renewal|M19 +1 Gigantosaurus|M19 +4 Golgari Raiders|GRN +4 Llanowar Elves|DOM +3 Marwyn, the Nurturer|DOM +2 Pelt Collector|GRN +4 Song of Freyalise|DOM +3 Sprouting Renewal|GRN diff --git a/forge-gui/res/quest/duels/Amalia Sheran Sharm 2.dck b/forge-gui/res/quest/duels/Amalia Sheran Sharm 2.dck new file mode 100644 index 00000000000..05d8e9e0446 --- /dev/null +++ b/forge-gui/res/quest/duels/Amalia Sheran Sharm 2.dck @@ -0,0 +1,30 @@ +[duel] +[metadata] +Name=Amalia Sheran Sharm 2 +Title=Amalia Sheran Sharm +Difficulty=medium +Description=Mono Green Ramp deck with Elves synergy, Gigantosaurus, and Impervious Greatwurm. +Deck Type=constructed +Icon=Amalia Sheran Sharm.jpg +[main] +2 Aggressive Mammoth|M19 +1 Arboretum Elemental|GRN +4 Beast Whisperer|GRN +2 Blackblade Reforged|DOM +3 Druid of the Cowl|M19 +4 Elvish Clancaller|M19 +5 Forest|DOM|1 +5 Forest|DOM|2 +5 Forest|DOM|3 +5 Forest|DOM|4 +2 Forest|GRN +2 Gigantosaurus|M19 +1 Impervious Greatwurm|GRN +4 Llanowar Elves|DOM +3 Marwyn, the Nurturer|DOM +2 Pelt Collector|GRN +3 Song of Freyalise|DOM +3 Steel Leaf Champion|DOM +2 Vivien of the Arkbow|M19 +2 Vivien Reid|M19 +[sideboard] diff --git a/forge-gui/res/quest/duels/Evangelyne 2.dck b/forge-gui/res/quest/duels/Evangelyne 2.dck new file mode 100644 index 00000000000..8ad21811068 --- /dev/null +++ b/forge-gui/res/quest/duels/Evangelyne 2.dck @@ -0,0 +1,25 @@ +[duel] +[metadata] +Name=Evangelyne 2 +Title=Evangelyne +Difficulty=medium +Description=Selesnya Stompy ramp deck with Elves and Ghalta, Primal Hunger. +Deck Type=constructed +Icon=Evangelyne.jpg +[main] +3 Conclave Tribunal|GRN +4 Emmara, Soul of the Accord|GRN +13 Forest +3 Ghalta, Primal Hunger|RIX +4 Llanowar Elves|M19 +4 Nullhide Ferox|GRN +4 Pelt Collector|GRN +1 Plains +1 Shalai, Voice of Plenty|DOM +4 Steel Leaf Champion|DOM +4 Sunpetal Grove|XLN +4 Temple Garden|GRN +4 Thorn Lieutenant|M19 +3 Thrashing Brontodon|RIX +4 Venerated Loxodon|GRN +[sideboard] diff --git a/forge-gui/res/quest/duels/Evangelyne 3.dck b/forge-gui/res/quest/duels/Evangelyne 3.dck new file mode 100644 index 00000000000..d39d162d6c0 --- /dev/null +++ b/forge-gui/res/quest/duels/Evangelyne 3.dck @@ -0,0 +1,29 @@ +[duel] +[metadata] +Name=Evangelyne 3 +Title=Evangelyne +Difficulty=hard +Description=Selesnya Stompy ramp deck with Primordial Hydra, Nullhide Ferox, Shalai, Voice of Plenty, and Ghalta, Primal Hunger. +Deck Type=constructed +Icon=Evangelyne.jpg +1 Black Lotus|LEA +3 Conclave Tribunal|GRN +2 Emmara, Soul of the Accord|GRN +13 Forest +3 Ghalta, Primal Hunger|RIX +4 Llanowar Elves|M19 +1 Mox Emerald|LEA +1 Mox Jet|LEA +1 Mox Pearl|LEA +1 Mox Ruby|LEA +1 Mox Sapphire|LEA +2 Nullhide Ferox|GRN +1 Plains +4 Primordial Hydra|M13 +4 Savannah|LEA +2 Shalai, Voice of Plenty|DOM +1 Sol Ring|LEA +4 Steel Leaf Champion|DOM +4 Sunpetal Grove|XLN +3 Thorn Lieutenant|M19 +4 Thrashing Brontodon|RIX diff --git a/forge-gui/res/quest/duels/Grugaloragran 2.dck b/forge-gui/res/quest/duels/Grugaloragran 2.dck new file mode 100644 index 00000000000..740198585f2 --- /dev/null +++ b/forge-gui/res/quest/duels/Grugaloragran 2.dck @@ -0,0 +1,24 @@ +[duel] +[metadata] +Name=Grugaloragran 2 +Title=Grugaloragran +Difficulty=medium +Description=Rakdos Burn deck with cheap direct damage spells, small Haste creatures, Sword-Point Diplomacy and The Flame of Keld. +Deck Type=constructed +Icon=Grugaloragran.jpg +[main] +4 Cinder Barrens|M19 +4 Dragonskull Summit|XLN +4 Fanatical Firebrand|RIX +4 Ghitu Lavarunner|DOM +4 Lightning Strike|M19 +11 Mountain +4 Risk Factor|GRN +4 Shock|M19 +4 Sovereign's Bite|M19 +3 Swamp +4 Sword-Point Diplomacy|XLN +2 The Flame of Keld|DOM +4 Viashino Pyromancer|M19 +4 Wizard's Lightning|DOM +[sideboard] diff --git a/forge-gui/res/quest/duels/Grugalorasalar 2.dck b/forge-gui/res/quest/duels/Grugalorasalar 2.dck new file mode 100644 index 00000000000..6e66ae9b7f5 --- /dev/null +++ b/forge-gui/res/quest/duels/Grugalorasalar 2.dck @@ -0,0 +1,27 @@ +[duel] +[metadata] +Name=Grugalorasalar 2 +Title=Grugalorasalar +Difficulty=medium +Description=Izzet Mirari's Conjecture burn deck with many instants and sorceries and multiple ways to replay or copy them. +Deck Type=constructed +Icon=Grugalorasalar.jpg +[main] +4 Banefire|M19 +4 Chandra, Torch of Defiance|KLD +2 Expansion // Explosion|GRN +4 Fight with Fire|DOM +1 Forest +4 Frontier Bivouac|KTK +4 Guttersnipe|M19 +2 Island +2 Jaya Ballard|DOM +2 Jaya's Immolating Inferno|DOM +3 Lightning Strike|M19 +9 Mountain +3 Nature's Spiral|DOM +4 Shock|M19 +4 Sulfur Falls|DOM +4 The Mirari Conjecture|DOM +4 Vivid Crag|LRW +[sideboard] diff --git a/forge-gui/res/quest/duels/Joris Jurgen 2.dck b/forge-gui/res/quest/duels/Joris Jurgen 2.dck new file mode 100644 index 00000000000..c8b571447ed --- /dev/null +++ b/forge-gui/res/quest/duels/Joris Jurgen 2.dck @@ -0,0 +1,28 @@ +[duel] +[metadata] +Name=Joris Jurgen 2 +Title=Joris Jurgen +Difficulty=medium +Description=UG Five Color Gates deck with Gatekeeper Gargoyle and Chamber Sentry. +Deck Type=constructed +Icon=Joris Jurgen.jpg +[main] +3 Arch of Orazca|RIX +4 Chamber Sentry|GRN +4 Circuitous Route|GRN +4 Crucible of Worlds|M19 +3 Dimir Guildgate|GRN +4 Dryad Greenseeker|M19 +2 Elvish Rejuvenator|M19 +3 Forest +4 Gatekeeper Gargoyle|GRN +4 Gateway Plaza|GRN +4 Golgari Guildgate|GRN +2 Guild Summit|GRN +2 Island +4 Selesnya Guildgate|GRN +4 Tatyova, Benthic Druid|DOM +4 The Mending of Dominaria|DOM +4 Wayward Swordtooth|RIX +1 World Shaper|RIX +[sideboard] diff --git a/forge-gui/res/quest/duels/Nox 2.dck b/forge-gui/res/quest/duels/Nox 2.dck new file mode 100644 index 00000000000..2cc9293badf --- /dev/null +++ b/forge-gui/res/quest/duels/Nox 2.dck @@ -0,0 +1,29 @@ +[duel] +[metadata] +Name=Nox 2 +Title=Nox +Difficulty=medium +Description=Mono Blue Artifacts deck with Tezzeret, Artifice Master; Karn, Scion of Urza; and The Antiquities War. +Deck Type=constructed +Icon=Nox.jpg +[main] +2 Arcane Encyclopedia|M19 +1 Arch of Orazca|RIX +2 Chemister's Insight|GRN +3 Diamond Mare|M19 +1 Dream Eater|GRN +3 Essence Scatter|M19 +2 Field of Ruin|XLN +14 Island|GRN +3 Karn, Scion of Urza|DOM +2 Memorial to Genius|DOM +2 Mishra's Self-Replicator|DOM +1 One with the Machine|M19 +3 Sai, Master Thopterist|M19 +2 Search for Azcanta|XLN +4 Sinister Sabotage|GRN +3 Tezzeret, Artifice Master|M19 +3 Thaumatic Compass|XLN +2 The Antiquities War|DOM +3 Treasure Map|XLN +4 Zhalfirin Void|DOM diff --git a/forge-gui/res/quest/duels/Nox 3.dck b/forge-gui/res/quest/duels/Nox 3.dck new file mode 100644 index 00000000000..a122a17c608 --- /dev/null +++ b/forge-gui/res/quest/duels/Nox 3.dck @@ -0,0 +1,30 @@ +[duel] +[metadata] +Name=Nox 3 +Title=Nox +Difficulty=hard +Description=Mono Blue Artifacts deck with Mirror Gallery, Tezzeret, Artifice Master; Tezzeret, Cruel Machinist; and Karn, Scion of Urza. +Deck Type=constructed +Icon=Nox.jpg +[main] +1 Ancestral Recall|LEA +1 Ancestral Vision|TSP +1 Black Lotus|LEA +2 Depths of Desire|XLN +3 Hornswoggle|RIX +18 Island +4 Karn, Scion of Urza|DOM +3 Mirror Gallery|BOK +4 Mishra's Self-Replicator|DOM +1 Mox Emerald|LEA +1 Mox Jet|LEA +1 Mox Pearl|LEA +1 Mox Ruby|LEA +1 Mox Sapphire|LEA +2 One with the Machine|M19 +4 Sai, Master Thopterist|M19 +4 Tezzeret, Artifice Master|M19 +4 Tezzeret, Cruel Machinist|M19 +2 The Antiquities War|DOM +1 Time Walk|LEA +1 Timetwister|LEA diff --git a/forge-gui/res/quest/duels/Percedal of Sadlygrove 2.dck b/forge-gui/res/quest/duels/Percedal of Sadlygrove 2.dck new file mode 100644 index 00000000000..f554a27f04f --- /dev/null +++ b/forge-gui/res/quest/duels/Percedal of Sadlygrove 2.dck @@ -0,0 +1,26 @@ +[duel] +[metadata] +Name=Percedal of Sadlygrove 2 +Title=Percedal of Sadlygrove +Difficulty=medium +Description=Boros Mentor deck with token generators, Tajic, Legion's Edge and Aurelia, Exemplar of Justice. +Deck Type=constructed +Icon=Percedal of Sadlygrove.jpg +[main] +3 Aurelia, Exemplar of Justice|GRN +4 Clifftop Retreat|DOM +3 Goblin Banneret|GRN +2 Goblin Motivator|M19 +3 Heroic Reinforcements|M19 +3 Legion Warboss|GRN +3 Legion's Landing|XLN +3 Militia Bugler|M19 +7 Mountain +7 Plains +3 Risk Factor|GRN +4 Sacred Foundry|GRN +3 Shock|M19 +3 Sunhome Stalwart|GRN +4 Swiftblade Vindicator|GRN +3 Tajic, Legion's Edge|GRN +[sideboard] diff --git a/forge-gui/res/quest/duels/Ruel Stroud 2.dck b/forge-gui/res/quest/duels/Ruel Stroud 2.dck new file mode 100644 index 00000000000..f11f2b9132e --- /dev/null +++ b/forge-gui/res/quest/duels/Ruel Stroud 2.dck @@ -0,0 +1,30 @@ +[duel] +[metadata] +Name=Ruel Stroud 2 +Title=Ruel Stroud +Difficulty=medium +Description=Janky UBG Treasure deck with Karn, Scion of Urza; Vraska, Golgari Queen and Vraska, Relic Seeker. +Deck Type=constructed +Icon=Ruel Stroud.jpg +[main] +2 Assassin's Trophy|GRN +3 Depths of Desire|XLN +4 Drowned Catacomb|XLN +2 Duress|M19 +2 Evolving Wilds|RIX +1 Forest +3 Hinterland Harbor|DOM +3 Hornswoggle|RIX +4 Island +4 Karn, Scion of Urza|DOM +2 Overgrown Tomb|GRN +2 Ritual of Soot|GRN +3 Spell Swindle|XLN +7 Swamp +3 Syncopate|DOM +3 Treasure Map|XLN +4 Twilight Prophet|RIX +4 Vraska, Golgari Queen|GRN +2 Vraska, Relic Seeker|XLN +2 Watery Grave|GRN +[sideboard] diff --git a/forge-gui/res/quest/duels/Yugo 2.dck b/forge-gui/res/quest/duels/Yugo 2.dck new file mode 100644 index 00000000000..cf77becfc66 --- /dev/null +++ b/forge-gui/res/quest/duels/Yugo 2.dck @@ -0,0 +1,23 @@ +[duel] +[metadata] +Name=Yugo 2 +Title=Yugo +Difficulty=medium +Description=Mono Blue Tempo deck with permission, card draw, and Tempest Djinn. +Deck Type=constructed +Icon=Yugo.jpg +[main] +2 Chart a Course|XLN +4 Curious Obsession|RIX +4 Dive Down|XLN +1 Essence Scatter|M19 +20 Island +4 Merfolk Trickster|DOM +4 Mist-Cloaked Herald|M19 +4 Opt|DOM +4 Siren Stormtamer|XLN +1 Sleep|M19 +2 Spell Pierce|XLN +4 Tempest Djinn|DOM +2 Warkite Marauder|RIX +4 Wizard's Retort|DOM diff --git a/forge-gui/res/quest/precons/forge-gui/res/quest/precons/Rivals.dck b/forge-gui/res/quest/precons/Rivals.dck similarity index 100% rename from forge-gui/res/quest/precons/forge-gui/res/quest/precons/Rivals.dck rename to forge-gui/res/quest/precons/Rivals.dck From 904dcec92c06a5fe394ff817cdd79443f55ab652 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 5 Nov 2018 07:55:39 +0300 Subject: [PATCH 100/901] - Tweaked several quest deck descriptions. --- forge-gui/res/quest/duels/Grugalorasalar 2.dck | 2 +- forge-gui/res/quest/duels/Nox 2.dck | 2 +- forge-gui/res/quest/duels/Nox 3.dck | 2 +- forge-gui/res/quest/duels/Percedal of Sadlygrove 2.dck | 2 +- forge-gui/res/quest/duels/Ruel Stroud 2.dck | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/forge-gui/res/quest/duels/Grugalorasalar 2.dck b/forge-gui/res/quest/duels/Grugalorasalar 2.dck index 6e66ae9b7f5..478c5f5bfea 100644 --- a/forge-gui/res/quest/duels/Grugalorasalar 2.dck +++ b/forge-gui/res/quest/duels/Grugalorasalar 2.dck @@ -3,7 +3,7 @@ Name=Grugalorasalar 2 Title=Grugalorasalar Difficulty=medium -Description=Izzet Mirari's Conjecture burn deck with many instants and sorceries and multiple ways to replay or copy them. +Description=Izzet Mirari Conjecture burn deck with many instants and sorceries and multiple ways to replay or copy them. Deck Type=constructed Icon=Grugalorasalar.jpg [main] diff --git a/forge-gui/res/quest/duels/Nox 2.dck b/forge-gui/res/quest/duels/Nox 2.dck index 2cc9293badf..acf61d45b6c 100644 --- a/forge-gui/res/quest/duels/Nox 2.dck +++ b/forge-gui/res/quest/duels/Nox 2.dck @@ -3,7 +3,7 @@ Name=Nox 2 Title=Nox Difficulty=medium -Description=Mono Blue Artifacts deck with Tezzeret, Artifice Master; Karn, Scion of Urza; and The Antiquities War. +Description=Mono Blue Artifacts deck with Tezzeret, Artifice Master, Karn, Scion of Urza, and The Antiquities War. Deck Type=constructed Icon=Nox.jpg [main] diff --git a/forge-gui/res/quest/duels/Nox 3.dck b/forge-gui/res/quest/duels/Nox 3.dck index a122a17c608..ac8db027062 100644 --- a/forge-gui/res/quest/duels/Nox 3.dck +++ b/forge-gui/res/quest/duels/Nox 3.dck @@ -3,7 +3,7 @@ Name=Nox 3 Title=Nox Difficulty=hard -Description=Mono Blue Artifacts deck with Mirror Gallery, Tezzeret, Artifice Master; Tezzeret, Cruel Machinist; and Karn, Scion of Urza. +Description=Mono Blue Artifacts deck with Mirror Gallery, Tezzeret, Artifice Master, Tezzeret, Cruel Machinist, and Karn, Scion of Urza. Deck Type=constructed Icon=Nox.jpg [main] diff --git a/forge-gui/res/quest/duels/Percedal of Sadlygrove 2.dck b/forge-gui/res/quest/duels/Percedal of Sadlygrove 2.dck index f554a27f04f..79637dfd835 100644 --- a/forge-gui/res/quest/duels/Percedal of Sadlygrove 2.dck +++ b/forge-gui/res/quest/duels/Percedal of Sadlygrove 2.dck @@ -3,7 +3,7 @@ Name=Percedal of Sadlygrove 2 Title=Percedal of Sadlygrove Difficulty=medium -Description=Boros Mentor deck with token generators, Tajic, Legion's Edge and Aurelia, Exemplar of Justice. +Description=Boros Mentor deck with token generators, Tajic, Legion's Edge, and Aurelia, Exemplar of Justice. Deck Type=constructed Icon=Percedal of Sadlygrove.jpg [main] diff --git a/forge-gui/res/quest/duels/Ruel Stroud 2.dck b/forge-gui/res/quest/duels/Ruel Stroud 2.dck index f11f2b9132e..15a64e6b43d 100644 --- a/forge-gui/res/quest/duels/Ruel Stroud 2.dck +++ b/forge-gui/res/quest/duels/Ruel Stroud 2.dck @@ -3,7 +3,7 @@ Name=Ruel Stroud 2 Title=Ruel Stroud Difficulty=medium -Description=Janky UBG Treasure deck with Karn, Scion of Urza; Vraska, Golgari Queen and Vraska, Relic Seeker. +Description=Janky UBG Treasure deck with Karn, Scion of Urza; Vraska, Golgari Queen, and Vraska, Relic Seeker. Deck Type=constructed Icon=Ruel Stroud.jpg [main] From 2c63f8d26ac01a384b819d5ae2abe9d3875a026e Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 5 Nov 2018 08:04:06 +0300 Subject: [PATCH 101/901] - Added a couple missing cards to the deck Percedal of Sadlygrove 2. --- forge-gui/res/quest/duels/Percedal of Sadlygrove 2.dck | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/res/quest/duels/Percedal of Sadlygrove 2.dck b/forge-gui/res/quest/duels/Percedal of Sadlygrove 2.dck index 79637dfd835..9437f239d0f 100644 --- a/forge-gui/res/quest/duels/Percedal of Sadlygrove 2.dck +++ b/forge-gui/res/quest/duels/Percedal of Sadlygrove 2.dck @@ -7,6 +7,7 @@ Description=Boros Mentor deck with token generators, Tajic, Legion's Edge, and A Deck Type=constructed Icon=Percedal of Sadlygrove.jpg [main] +2 Ajani, Adversary of Tyrants|M19 3 Aurelia, Exemplar of Justice|GRN 4 Clifftop Retreat|DOM 3 Goblin Banneret|GRN From 65440351c418d2d1cd3d895f27a3a7b926d1b67e Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 5 Nov 2018 09:07:52 +0300 Subject: [PATCH 102/901] - Fixed a reference in Whirlpool Rider. - Added Reckless profile definition to Percedal of Sadlygrove 2. --- forge-gui/res/cardsfolder/w/whirlpool_rider.txt | 2 +- forge-gui/res/quest/duels/Percedal of Sadlygrove 2.dck | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/w/whirlpool_rider.txt b/forge-gui/res/cardsfolder/w/whirlpool_rider.txt index c05c7ac076b..bbbc641b4e6 100644 --- a/forge-gui/res/cardsfolder/w/whirlpool_rider.txt +++ b/forge-gui/res/cardsfolder/w/whirlpool_rider.txt @@ -4,7 +4,7 @@ Types:Creature Merfolk PT:1/1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeAll | TriggerDescription$ When CARDNAME enters the battlefield, shuffle the cards from your hand into your library, then draw that many cards. SVar:TrigChangeAll:DB$ ChangeZoneAll | Defined$ You | Origin$ Hand | Destination$ Library | Shuffle$ True | RememberChanged$ True | ForgetOtherRemembered$ True | SubAbility$ DBDraw -SVar:DBDraw:DB$Draw | NumCards$ X | Defined$ You | SubAbility$ DBCleanup +SVar:DBDraw:DB$Draw | NumCards$ X | References$ X | Defined$ You | SubAbility$ DBCleanup SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount SVar:Picture:http://resources.wizards.com/magic/cards/ap/en-us/card27670.jpg diff --git a/forge-gui/res/quest/duels/Percedal of Sadlygrove 2.dck b/forge-gui/res/quest/duels/Percedal of Sadlygrove 2.dck index 9437f239d0f..b5e955f371c 100644 --- a/forge-gui/res/quest/duels/Percedal of Sadlygrove 2.dck +++ b/forge-gui/res/quest/duels/Percedal of Sadlygrove 2.dck @@ -6,6 +6,7 @@ Difficulty=medium Description=Boros Mentor deck with token generators, Tajic, Legion's Edge, and Aurelia, Exemplar of Justice. Deck Type=constructed Icon=Percedal of Sadlygrove.jpg +Profile=Reckless [main] 2 Ajani, Adversary of Tyrants|M19 3 Aurelia, Exemplar of Justice|GRN From ab3a35bf41ca9a362b9d48887c3818fc5a99a53c Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 5 Nov 2018 09:18:06 +0300 Subject: [PATCH 103/901] - Added PlayMain1:TRUE to Heroic Reinforcements. --- forge-gui/res/cardsfolder/h/heroic_reinforcements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/res/cardsfolder/h/heroic_reinforcements.txt b/forge-gui/res/cardsfolder/h/heroic_reinforcements.txt index 41f4c62f520..cc2748e226d 100644 --- a/forge-gui/res/cardsfolder/h/heroic_reinforcements.txt +++ b/forge-gui/res/cardsfolder/h/heroic_reinforcements.txt @@ -4,5 +4,6 @@ Types:Sorcery A:SP$ Token | Cost$ 2 R W | TokenAmount$ 2 | TokenName$ Soldier | TokenTypes$ Creature,Soldier | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenImage$ w 1 1 soldier M19 | SubAbility$ TrigPump | SpellDescription$ Create two 1/1 white Soldier creature tokens. Until end of turn, creatures you control get +1/+1 and gain haste. SVar:TrigPump:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Haste | NumAtt$ +1 | NumDef$ +1 DeckHas:Ability$Token +SVar:PlayMain1:TRUE SVar:Picture:http://resources.wizards.com/magic/cards/mrd/en-us/heroic_reinforcements.jpg Oracle:Create two 1/1 white Soldier creature tokens. Until end of turn, creatures you control get +1/+1 and gain haste. (They can attack and {T} this turn.) \ No newline at end of file From e2dd52cf1c2fb6953369797df859fc8abb1177b8 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Mon, 5 Nov 2018 08:25:31 +0100 Subject: [PATCH 104/901] PlayerView: should fix ConcurrentModificationException --- .../java/forge/game/player/PlayerView.java | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/forge-game/src/main/java/forge/game/player/PlayerView.java b/forge-game/src/main/java/forge/game/player/PlayerView.java index 33751b10e7d..30235025c54 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerView.java +++ b/forge-game/src/main/java/forge/game/player/PlayerView.java @@ -137,16 +137,22 @@ public class PlayerView extends GameEntityView { final List info = Lists.newArrayListWithExpectedSize(opponents.size()); info.add(TextUtil.concatWithSpace("Commanders:", Lang.joinHomogenous(commanders))); - for (final PlayerView p : Iterables.concat(Collections.singleton(this), opponents)) { + + // own commanders + for (final CardView v : commanders) { + final int damage = getCommanderDamage(v); + if (damage > 0) { + final String text = TextUtil.concatWithSpace("Commander damage from own commander", TextUtil.addSuffix(v.toString(),":")); + info.add(TextUtil.concatWithSpace(text,TextUtil.addSuffix(String.valueOf(damage),"\r\n"))); + } + } + + // opponents commanders + for (final PlayerView p : opponents) { for (final CardView v : p.getCommanders()) { - final int damage = this.getCommanderDamage(v); + final int damage = getCommanderDamage(v); if (damage > 0) { - final String text; - if (p.equals(this)) { - text = TextUtil.concatWithSpace("Commander damage from own commander", TextUtil.addSuffix(v.toString(),":")); - } else { - text = TextUtil.concatWithSpace("Commander damage from", TextUtil.addSuffix(p.toString(),"'s"), TextUtil.addSuffix(v.toString(),":")); - } + final String text = TextUtil.concatWithSpace("Commander damage from", TextUtil.addSuffix(p.toString(),"'s"), TextUtil.addSuffix(v.toString(),":")); info.add(TextUtil.concatWithSpace(text,TextUtil.addSuffix(String.valueOf(damage),"\r\n"))); } } From f2f0e0a2e857395d4b1cbe030a5010b357dab4f8 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 5 Nov 2018 12:00:08 +0300 Subject: [PATCH 105/901] - Fixed references in Eureka. --- forge-gui/res/cardsfolder/e/eureka.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/e/eureka.txt b/forge-gui/res/cardsfolder/e/eureka.txt index 66be4ea0f36..2a744028785 100644 --- a/forge-gui/res/cardsfolder/e/eureka.txt +++ b/forge-gui/res/cardsfolder/e/eureka.txt @@ -1,12 +1,12 @@ Name:Eureka ManaCost:2 G G Types:Sorcery -A:SP$ Repeat | Cost$ 2 G G | RepeatSubAbility$ ResetCheck | RepeatCheckSVar$ NumPlayerGiveup | RepeatSVarCompare$ LTTotalPlayer | SubAbility$ DBChangeZoneAll | StackDescription$ SpellDescription | SpellDescription$ Starting with you, each player may put a permanent card from their hand onto the battlefield. Repeat this process until no one puts a card onto the battlefield. +A:SP$ Repeat | Cost$ 2 G G | RepeatSubAbility$ ResetCheck | RepeatCheckSVar$ NumPlayerGiveup | RepeatSVarCompare$ LTTotalPlayer | References$ TotalPlayer | SubAbility$ DBChangeZoneAll | StackDescription$ SpellDescription | SpellDescription$ Starting with you, each player may put a permanent card from their hand onto the battlefield. Repeat this process until no one puts a card onto the battlefield. SVar:ResetCheck:DB$ StoreSVar | SVar$ NumPlayerGiveup | Type$ Number | Expression$ 0 | SubAbility$ DBRepeatChoice SVar:DBRepeatChoice:DB$ RepeatEach | StartingWithActivator$ True | RepeatSubAbility$ DBChoice | RepeatPlayers$ Player SVar:DBChoice:DB$ GenericChoice | Choices$ DBCheckHand,DBNoChange | Defined$ Player.IsRemembered -SVar:DBCheckHand:DB$ StoreSVar | SVar$ NumPlayerGiveup | Type$ CountSVar | Expression$ NumPlayerGiveup/Plus.1 | ConditionCheckSVar$ CheckHand | ConditionSVarCompare$ EQ0 | SubAbility$ DBChoose | SpellDescription$ Choose a permanent to put onto the battlefield -SVar:DBChoose:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Permanent.IsNotRemembered+RememberedPlayerCtrl | ChoiceZone$ Hand | Amount$ 1 | RememberChosen$ True | Mandatory$ True | ConditionCheckSVar$ CheckHand | ConditionSVarCompare$ GE1 +SVar:DBCheckHand:DB$ StoreSVar | SVar$ NumPlayerGiveup | Type$ CountSVar | Expression$ NumPlayerGiveup/Plus.1 | ConditionCheckSVar$ CheckHand | ConditionSVarCompare$ EQ0 | References$ CheckHand | SubAbility$ DBChoose | SpellDescription$ Choose a permanent to put onto the battlefield +SVar:DBChoose:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Permanent.IsNotRemembered+RememberedPlayerCtrl | ChoiceZone$ Hand | Amount$ 1 | RememberChosen$ True | Mandatory$ True | ConditionCheckSVar$ CheckHand | ConditionSVarCompare$ GE1 | References$ CheckHand SVar:DBNoChange:DB$ StoreSVar | SVar$ NumPlayerGiveup | Type$ CountSVar | Expression$ NumPlayerGiveup/Plus.1 | SpellDescription$ Do not put a permanent onto the battlefield SVar:DBChangeZoneAll:DB$ ChangeZoneAll | Origin$ Hand | Destination$ Battlefield | ChangeType$ Card.IsRemembered | SubAbility$ FinalReset SVar:FinalReset:DB$ StoreSVar | SVar$ NumPlayerGiveup | Type$ Number | Expression$ 0 | SubAbility$ DBCleanup From 3dc438c33207cb7ac69bce5704064f969c5565ef Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Mon, 5 Nov 2018 10:28:38 +0000 Subject: [PATCH 106/901] Update ControlExchangeAi.java Closes #764 --- forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 f002fca63c3..ab3c3465127 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java @@ -36,7 +36,7 @@ public class ControlExchangeAi extends SpellAbilityAi { list = CardLists.filter(list, new Predicate() { @Override public boolean apply(final Card c) { - return !c.getRules().getAiHints().getRemAIDecks() && c.canBeTargetedBy(sa); + return !ComputerUtilCard.isCardRemAIDeck(c) && c.canBeTargetedBy(sa); } }); object1 = ComputerUtilCard.getBestAI(list); From 985599a3b217822bb2eb82de476f2853f3d943a7 Mon Sep 17 00:00:00 2001 From: Michael Kamensky Date: Tue, 6 Nov 2018 11:59:49 +0000 Subject: [PATCH 107/901] Various AI improvements. --- forge-ai/src/main/java/forge/ai/AiProps.java | 2 + .../src/main/java/forge/ai/ComputerUtil.java | 67 ++++++++++++++++++- .../java/forge/ai/ability/DamageDealAi.java | 7 +- .../main/java/forge/ai/ability/DestroyAi.java | 5 ++ .../main/java/forge/ai/ability/PlayAi.java | 7 ++ forge-gui/res/ai/Cautious.ai | 8 +++ forge-gui/res/ai/Default.ai | 8 +++ forge-gui/res/ai/Experimental.ai | 10 ++- forge-gui/res/ai/Reckless.ai | 8 +++ forge-gui/res/cardsfolder/c/charnel_troll.txt | 2 + .../res/cardsfolder/g/gruesome_menagerie.txt | 3 +- 11 files changed, 122 insertions(+), 5 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiProps.java b/forge-ai/src/main/java/forge/ai/AiProps.java index cb3f8d99007..69a6fbddf10 100644 --- a/forge-ai/src/main/java/forge/ai/AiProps.java +++ b/forge-ai/src/main/java/forge/ai/AiProps.java @@ -74,6 +74,8 @@ public enum AiProps { /** */ DESTROY_IMMEDIATELY_UNBLOCKABLE_THRESHOLD ("2"), /** */ DESTROY_IMMEDIATELY_UNBLOCKABLE_ONLY_IN_DNGR ("true"), /** */ DESTROY_IMMEDIATELY_UNBLOCKABLE_LIFE_IN_DNGR ("5"), /** */ + AVOID_TARGETING_CREATS_THAT_WILL_DIE ("true"), /** */ + DONT_EVAL_KILLSPELLS_ON_STACK_WITH_PERMISSION ("true"), /** */ PRIORITY_REDUCTION_FOR_STORM_SPELLS ("0"), /** */ USE_BERSERK_AGGRESSIVELY ("false"), /** */ MIN_COUNT_FOR_STORM_SPELLS ("0"), /** */ diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index 113e0c2bab3..35656ae808e 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -1770,7 +1770,68 @@ public class ComputerUtil { Iterables.addAll(threatened, ComputerUtil.predictThreatenedObjects(aiPlayer, saviour, topStack.getSubAbility())); return threatened; } - + + /** + * Returns true if the specified creature will die this turn either from lethal damage in combat + * or from a killing spell on stack. + * TODO: This currently does not account for the fact that spells on stack can be countered, can be improved. + * + * @param creature + * A creature to check + * @return true if the creature dies according to current board position. + */ + public static boolean predictCreatureWillDieThisTurn(final Player ai, final Card creature) { + final Game game = creature.getGame(); + + // a creature will die as a result of combat + boolean willDieInCombat = game.getPhaseHandler().inCombat() + && ComputerUtilCombat.combatantWouldBeDestroyed(creature.getController(), creature, game.getCombat()); + + // a creature will [hopefully] die from a spell on stack + boolean willDieFromSpell = false; + boolean noStackCheck = false; + AiController aic = ((PlayerControllerAi)ai.getController()).getAi(); + if (aic.getBooleanProperty(AiProps.DONT_EVAL_KILLSPELLS_ON_STACK_WITH_PERMISSION)) { + // See if permission is on stack and ignore this check if there is and the relevant AI flag is set + // TODO: improve this so that this flag is not needed and the AI can properly evaluate spells in presence of counterspells. + for (SpellAbilityStackInstance si : game.getStack()) { + if (si.getSpellAbility(false).getApi() == ApiType.Counter) { + noStackCheck = true; + break; + } + } + } + willDieFromSpell = !noStackCheck && ComputerUtil.predictThreatenedObjects(creature.getController(), null).contains(creature); + + return willDieInCombat || willDieFromSpell; + } + + /** + * Returns a list of cards excluding any creatures that will die in active combat or from a spell on stack. + * Works only on AI profiles which have AVOID_TARGETING_CREATS_THAT_WILL_DIE enabled, otherwise returns + * the original list. + * + * @param ai + * The AI player performing this evaluation + * @param list + * The list of cards to work with + * @return a filtered list with no dying creatures in it + */ + public static CardCollection filterCreaturesThatWillDieThisTurn(final Player ai, final CardCollection list) { + AiController aic = ((PlayerControllerAi)ai.getController()).getAi(); + if (aic.getBooleanProperty(AiProps.AVOID_TARGETING_CREATS_THAT_WILL_DIE)) { + // Try to avoid targeting creatures that are dead on board + List willBeKilled = CardLists.filter(list, new Predicate() { + @Override + public boolean apply(Card card) { + return card.isCreature() && ComputerUtil.predictCreatureWillDieThisTurn(ai, card); + } + }); + list.removeAll(willBeKilled); + } + return list; + } + public static boolean playImmediately(Player ai, SpellAbility sa) { final Card source = sa.getHostCard(); final Zone zone = source.getZone(); @@ -2779,6 +2840,10 @@ public class ComputerUtil { if (ab.getApi() == null) { // only API-based SAs are supported, other things may lead to a NPE (e.g. Ancestral Vision Suspend SA) continue; + } else if (ab.getApi() == ApiType.Mana && "ManaRitual".equals(ab.getParam("AILogic"))) { + // Mana Ritual cards are too complex for the AI to consider casting through a spell effect and will + // lead to a stack overflow. Consider improving. + continue; } SpellAbility abTest = withoutPayingManaCost ? ab.copyWithNoManaCost() : ab.copy(); // at this point, we're assuming that card will be castable from whichever zone it's in by the AI player. 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 473ff354f99..a1502c80c20 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -275,7 +275,7 @@ public class DamageDealAi extends DamageAiBase { final Game game = source.getGame(); List hPlay = getTargetableCards(ai, sa, pl, tgt, activator, source, game); - List killables = CardLists.filter(hPlay, new Predicate() { + CardCollection killables = CardLists.filter(hPlay, new Predicate() { @Override public boolean apply(final Card c) { return c.getSVar("Targeting").equals("Dies") @@ -286,7 +286,10 @@ public class DamageDealAi extends DamageAiBase { }); // Filter AI-specific targets if provided - killables = ComputerUtil.filterAITgts(sa, ai, new CardCollection(killables), true); + killables = ComputerUtil.filterAITgts(sa, ai, killables, true); + + // Try not to target anything which will already be dead by the time the spell resolves + killables = ComputerUtil.filterCreaturesThatWillDieThisTurn(ai, killables); Card targetCard = null; if (pl.isOpponentOf(ai) && activator.equals(ai) && !killables.isEmpty()) { 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 742692e5c1d..40d3aaf4138 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java @@ -178,6 +178,8 @@ public class DestroyAi extends SpellAbilityAi { }); } + // Try to avoid targeting creatures that are dead on board + list = ComputerUtil.filterCreaturesThatWillDieThisTurn(ai, list); if (list.isEmpty()) { return false; } @@ -313,6 +315,9 @@ public class DestroyAi extends SpellAbilityAi { CardCollection list = CardLists.getTargetableCards(ai.getGame().getCardsIn(ZoneType.Battlefield), sa); list = CardLists.getValidCards(list, tgt.getValidTgts(), source.getController(), source, sa); + // Try to avoid targeting creatures that are dead on board + list = ComputerUtil.filterCreaturesThatWillDieThisTurn(ai, list); + if (list.isEmpty() || list.size() < tgt.getMinTargets(sa.getHostCard(), sa)) { return false; } diff --git a/forge-ai/src/main/java/forge/ai/ability/PlayAi.java b/forge-ai/src/main/java/forge/ai/ability/PlayAi.java index 49fd600f9a4..f023a718fb1 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PlayAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PlayAi.java @@ -175,6 +175,13 @@ public class PlayAi extends SpellAbilityAi { spell = (Spell) spell.copyWithDefinedCost(abCost); } if( AiPlayDecision.WillPlay == ((PlayerControllerAi)ai.getController()).getAi().canPlayFromEffectAI(spell, !isOptional, true)) { + // Before accepting, see if the spell has a valid number of targets (it should at this point). + // Proceeding past this point if the spell is not correctly targeted will result + // in "Failed to add to stack" error and the card disappearing from the game completely. + if (!spell.isTargetNumberValid()) { + return false; + } + return true; } } diff --git a/forge-gui/res/ai/Cautious.ai b/forge-gui/res/ai/Cautious.ai index c65e16a652f..b2112e06b01 100644 --- a/forge-gui/res/ai/Cautious.ai +++ b/forge-gui/res/ai/Cautious.ai @@ -66,6 +66,14 @@ THRESHOLD_TOKEN_CHUMP_TO_SAVE_PLANESWALKER=135 # If enabled, the AI will not bother chump blocking to protect a planeswalker unless lethal damage is threatened to it CHUMP_TO_SAVE_PLANESWALKER_ONLY_ON_LETHAL=true +# Options that allow the AI to attempt to optimize targeting for removal and damaging spells. +# If enabled, the AI will try not to target a creature with a damaging spell or spot removal in case +# this creature will die in current combat or to a spell which is currently on stack targeting it. +AVOID_TARGETING_CREATS_THAT_WILL_DIE=true +# If enabled, the AI will not evaluate the stack in case at least one counterspell is present on it, +# since the current AI is not smart enough to predict whether a kill spell on stack is countered or not. +DONT_EVAL_KILLSPELLS_ON_STACK_WITH_PERMISSION=true + # Only works when AI cheating is enabled in preferences, otherwise does nothing CHEAT_WITH_MANA_ON_SHUFFLE=true diff --git a/forge-gui/res/ai/Default.ai b/forge-gui/res/ai/Default.ai index 9029ae5c99b..2f6b99c304e 100644 --- a/forge-gui/res/ai/Default.ai +++ b/forge-gui/res/ai/Default.ai @@ -66,6 +66,14 @@ THRESHOLD_TOKEN_CHUMP_TO_SAVE_PLANESWALKER=135 # If enabled, the AI will not bother chump blocking to protect a planeswalker unless lethal damage is threatened to it CHUMP_TO_SAVE_PLANESWALKER_ONLY_ON_LETHAL=true +# Options that allow the AI to attempt to optimize targeting for removal and damaging spells. +# If enabled, the AI will try not to target a creature with a damaging spell or spot removal in case +# this creature will die in current combat or to a spell which is currently on stack targeting it. +AVOID_TARGETING_CREATS_THAT_WILL_DIE=true +# If enabled, the AI will not evaluate the stack in case at least one counterspell is present on it, +# since the current AI is not smart enough to predict whether a kill spell on stack is countered or not. +DONT_EVAL_KILLSPELLS_ON_STACK_WITH_PERMISSION=true + # Only works when AI cheating is enabled in preferences, otherwise does nothing CHEAT_WITH_MANA_ON_SHUFFLE=true diff --git a/forge-gui/res/ai/Experimental.ai b/forge-gui/res/ai/Experimental.ai index 1829c14890b..d844e5c2925 100644 --- a/forge-gui/res/ai/Experimental.ai +++ b/forge-gui/res/ai/Experimental.ai @@ -66,6 +66,14 @@ THRESHOLD_TOKEN_CHUMP_TO_SAVE_PLANESWALKER=135 # If enabled, the AI will not bother chump blocking to protect a planeswalker unless lethal damage is threatened to it CHUMP_TO_SAVE_PLANESWALKER_ONLY_ON_LETHAL=false +# Options that allow the AI to attempt to optimize targeting for removal and damaging spells. +# If enabled, the AI will try not to target a creature with a damaging spell or spot removal in case +# this creature will die in current combat or to a spell which is currently on stack targeting it. +AVOID_TARGETING_CREATS_THAT_WILL_DIE=true +# If enabled, the AI will not evaluate the stack in case at least one counterspell is present on it, +# since the current AI is not smart enough to predict whether a kill spell on stack is countered or not. +DONT_EVAL_KILLSPELLS_ON_STACK_WITH_PERMISSION=false + # Only works when AI cheating is enabled in preferences, otherwise does nothing CHEAT_WITH_MANA_ON_SHUFFLE=true @@ -219,4 +227,4 @@ AI_IN_DANGER_THRESHOLD=3 # for each evaluation, introducing some unpredictability. AI_IN_DANGER_MAX_THRESHOLD=12 -# <-- there are no options here at the moment --> +# <-- there are no other experimental options here at the moment --> diff --git a/forge-gui/res/ai/Reckless.ai b/forge-gui/res/ai/Reckless.ai index f96968c5056..da788df7ce1 100644 --- a/forge-gui/res/ai/Reckless.ai +++ b/forge-gui/res/ai/Reckless.ai @@ -66,6 +66,14 @@ THRESHOLD_TOKEN_CHUMP_TO_SAVE_PLANESWALKER=135 # If enabled, the AI will not bother chump blocking to protect a planeswalker unless lethal damage is threatened to it CHUMP_TO_SAVE_PLANESWALKER_ONLY_ON_LETHAL=true +# Options that allow the AI to attempt to optimize targeting for removal and damaging spells. +# If enabled, the AI will try not to target a creature with a damaging spell or spot removal in case +# this creature will die in current combat or to a spell which is currently on stack targeting it. +AVOID_TARGETING_CREATS_THAT_WILL_DIE=true +# If enabled, the AI will not evaluate the stack in case at least one counterspell is present on it, +# since the current AI is not smart enough to predict whether a kill spell on stack is countered or not. +DONT_EVAL_KILLSPELLS_ON_STACK_WITH_PERMISSION=true + # Only works when AI cheating is enabled in preferences, otherwise does nothing CHEAT_WITH_MANA_ON_SHUFFLE=true diff --git a/forge-gui/res/cardsfolder/c/charnel_troll.txt b/forge-gui/res/cardsfolder/c/charnel_troll.txt index 260ef6b81fd..cfcdff7459f 100644 --- a/forge-gui/res/cardsfolder/c/charnel_troll.txt +++ b/forge-gui/res/cardsfolder/c/charnel_troll.txt @@ -9,6 +9,8 @@ SVar:DBPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | Condition SVar:DBSac:DB$ Sacrifice | SacValid# Self | ConditionDefined$ Remembered | ConditionPresent$ Card.Creature | ConditionCompare$ EQ0 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True A:AB$ PutCounter | Cost$ B G Discard<1/Creature> | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on CARDNAME. +SVar:NeedsToPlayVar:Z GE1 +SVar:Z:Count$ValidGraveyard Creature.YouCtrl AI:RemoveDeck:Random DeckNeeds:Ability$Graveyard DeckHas:Ability$Counters diff --git a/forge-gui/res/cardsfolder/g/gruesome_menagerie.txt b/forge-gui/res/cardsfolder/g/gruesome_menagerie.txt index 8a28cd52744..38137dc5fa1 100644 --- a/forge-gui/res/cardsfolder/g/gruesome_menagerie.txt +++ b/forge-gui/res/cardsfolder/g/gruesome_menagerie.txt @@ -6,5 +6,6 @@ SVar:DBChoose2:DB$ ChooseCard | Defined$ You | Choices$ Creature.YouOwn+cmcEQ2 | SVar:DBChoose3:DB$ ChooseCard | Defined$ You | Choices$ Creature.YouOwn+cmcEQ3 | ChoiceZone$ Graveyard | Amount$ 1 | SubAbility$ DBReturn | RememberChosen$ True | SpellDescription$ Choose a creature card with converted mana cost 3 in your graveyard. SVar:DBReturn:DB$ ChangeZoneAll | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Card.IsRemembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:NeedsToPlay:Creature.YouCtrl+inZoneGraveyard+cmcLE3 +SVar:NeedsToPlayVar:Z GE1 +SVar:Z:Count$ValidGraveyard Creature.YouCtrl+cmcLE3 Oracle:Choose a creature card with converted mana cost 1 in your graveyard, then do the same for creature cards with converted mana costs 2 and 3. Return those cards to the battlefield. From 8eb39e28b7b92d3bdb84d148105b235b8e6ce4b7 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Tue, 6 Nov 2018 14:12:59 +0000 Subject: [PATCH 108/901] CardUtil:getLKICopy with Breadcrumb --- .../src/main/java/forge/game/card/CardUtil.java | 12 ++++++++++++ 1 file changed, 12 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 8db0b965455..373889feb2a 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -26,6 +26,9 @@ 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 forge.ImageKeys; import forge.card.CardStateName; import forge.card.CardType; @@ -203,6 +206,15 @@ public final class CardUtil { * @return a copy of C with LastKnownInfo stuff retained. */ public static Card getLKICopy(final Card in) { + String msg = "CardUtil:getLKICopy copy object"; + Sentry.getContext().recordBreadcrumb( + new BreadcrumbBuilder().setMessage(msg) + .withData("Card", in.getName()) + .withData("CardState", in.getCurrentStateName().toString()) + .withData("Player", in.getController().getName()) + .build() + ); + final Card newCopy = new Card(in.getId(), in.getPaperCard(), false, in.getGame()); newCopy.setSetCode(in.getSetCode()); newCopy.setOwner(in.getOwner()); From f439a7c0846a13a27cef3230df371fd5b36a0ed1 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 7 Nov 2018 08:55:35 +0300 Subject: [PATCH 109/901] - Added a BuffedBy spec to Forerunner of the Legion, fixed a double BuffedBy spec in Oakheart Dryads. --- forge-gui/res/cardsfolder/f/forerunner_of_the_legion.txt | 1 + forge-gui/res/cardsfolder/o/oakheart_dryads.txt | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/f/forerunner_of_the_legion.txt b/forge-gui/res/cardsfolder/f/forerunner_of_the_legion.txt index d065afcd6b0..272b67134e7 100644 --- a/forge-gui/res/cardsfolder/f/forerunner_of_the_legion.txt +++ b/forge-gui/res/cardsfolder/f/forerunner_of_the_legion.txt @@ -7,5 +7,6 @@ SVar:TrigChange:DB$ ChangeZone | Origin$ Library | Destination$ Library | Librar T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Vampire.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever another Vampire enters the battlefield under your control, target creature gets +1/+1 until end of turn. SVar:TrigPump:DB$Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ 1 | NumDef$ 1 DeckHints:Type$Vampire +SVar:BuffedBy:Vampire SVar:Picture:http://www.wizards.com/global/images/magic/general/forerunner_of_the_legion.jpg Oracle:When Forerunner of the Legion enters the battlefield, you may search your library for a Vampire card, reveal it, then shuffle your library and put that card on top of it.\nWhenever another Vampire enters the battlefield under your control, target creature gets +1/+1 until end of turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/o/oakheart_dryads.txt b/forge-gui/res/cardsfolder/o/oakheart_dryads.txt index 1ca63b18239..01266382762 100644 --- a/forge-gui/res/cardsfolder/o/oakheart_dryads.txt +++ b/forge-gui/res/cardsfolder/o/oakheart_dryads.txt @@ -7,6 +7,5 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchan SVar:TrigPump:DB$ Pump | ValidTgts$ Creature | NumAtt$ +1 | NumDef$ +1 SVar:BuffedBy:Enchantment SVar:PlayMain1:TRUE -SVar:BuffedBy:Enchantment SVar:Picture:http://www.wizards.com/global/images/magic/general/oakheart_dryads.jpg Oracle:Constellation — Whenever Oakheart Dryads or another enchantment enters the battlefield under your control, target creature gets +1/+1 until end of turn. From a5d6ba2530e6742144d4b24cb1ea2a1b81ca6956 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 7 Nov 2018 09:11:22 +0300 Subject: [PATCH 110/901] - Logic fix in prioritizing creatures worth removing. --- .../src/main/java/forge/ai/ComputerUtilCard.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index ec142dd9f35..42c1fec448b 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -1786,15 +1786,20 @@ public class ComputerUtilCard { CardCollection priorityCards = new CardCollection(); for (Card atk : oppCards) { + boolean canBeBlocked = false; if (isUselessCreature(atk.getController(), atk)) { continue; } for (Card blk : aiCreats) { - if (!CombatUtil.canBlock(atk, blk, true)) { - boolean threat = atk.getNetCombatDamage() >= ai.getLife() - lifeInDanger; - if (!priorityRemovalOnlyInDanger || threat) { - priorityCards.add(atk); - } + if (CombatUtil.canBlock(atk, blk, true)) { + canBeBlocked = true; + break; + } + } + if (!canBeBlocked) { + boolean threat = atk.getNetCombatDamage() >= ai.getLife() - lifeInDanger; + if (!priorityRemovalOnlyInDanger || threat) { + priorityCards.add(atk); } } } From c6b6a0b4d2ff78ff43e820b5b83eb61a25c0367e Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 7 Nov 2018 09:27:14 +0300 Subject: [PATCH 111/901] - Added puzzle PS_GRN5. --- forge-gui/res/puzzle/PS_GRN5.pzl | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 forge-gui/res/puzzle/PS_GRN5.pzl diff --git a/forge-gui/res/puzzle/PS_GRN5.pzl b/forge-gui/res/puzzle/PS_GRN5.pzl new file mode 100644 index 00000000000..d351236a007 --- /dev/null +++ b/forge-gui/res/puzzle/PS_GRN5.pzl @@ -0,0 +1,17 @@ +[metadata] +Name:Possibility Storm - Guilds of Ravnica #05 +URL:https://i1.wp.com/www.possibilitystorm.com/wp-content/uploads/2018/11/087.-GRN5.jpg +Goal:Win +Turns:1 +Difficulty:Mythic +Description:Win this turn. Your graveyard starts empty. Your opponent's Aggressive Mammoth is enchanted with One with the Wind. From Dream Eater, you know the two cards of your library, Ghitu Lavarunner and Academy Journeymage. +[state] +humanlife=20 +ailife=7 +turn=1 +activeplayer=human +activephase=MAIN1 +humanhand=Mutiny;Metamorphic Alteration;Direct Current;Maximize Velocity;Enigma Drake +humanlibrary=Ghitu Lavarunner;Academy Journeymage +humanbattlefield=Sparring Construct;Dream Eater;Ral, Izzet Viceroy|Counters:LOYALTY=3;Mountain|Set:GRN;Mountain|Set:GRN;Island|Set:GRN;Island|Set:GRN;Island|Set:GRN;Island|Set:GRN +aibattlefield=Nullhide Ferox;Muldrotha, the Gravetide;Aggressive Mammoth|Id:1;One With the Wind|Attaching:1 From ebbde37929da8f1c43a93f9e76fbe60768d3a0dc Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 8 Nov 2018 07:56:39 +0300 Subject: [PATCH 112/901] - Fixed emblem image name for Vivien Reid. --- forge-gui/res/cardsfolder/v/vivien_reid.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/v/vivien_reid.txt b/forge-gui/res/cardsfolder/v/vivien_reid.txt index 33e78a5e490..2473e35c380 100644 --- a/forge-gui/res/cardsfolder/v/vivien_reid.txt +++ b/forge-gui/res/cardsfolder/v/vivien_reid.txt @@ -3,7 +3,7 @@ ManaCost:3 G G Types:Legendary Planeswalker Vivien A:AB$ Dig | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | DigNum$ 4 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Creature,Land | ForceRevealToController$ True | SpellDescription$ Look at the top four cards of your library. You may reveal a creature or land card from among them and put it into your hand. Put the rest on the bottom of your library in any order. A:AB$ Destroy | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | ValidTgts$ Artifact,Enchantment,Creature.withFlying | TgtPrompt$ Select target artifact, enchantment or creature with flying | SpellDescription$ Destroy target artifact, enchantment or creature with flying. -A:AB$ Effect | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Ultimate$ True | Name$ Emblem - Vivien Reid | Image$ emblem_vivien_ried | Duration$ Permanent | StaticAbilities$ STVivien | AILogic$ Always | SpellDescription$ You get an emblem with "Creatures you control get +2/+2 and have vigilance, trample, and indestructible." +A:AB$ Effect | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Ultimate$ True | Name$ Emblem - Vivien Reid | Image$ emblem_vivien_reid | Duration$ Permanent | StaticAbilities$ STVivien | AILogic$ Always | SpellDescription$ You get an emblem with "Creatures you control get +2/+2 and have vigilance, trample, and indestructible." SVar:STVivien:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl | AffectedZone$ Battlefield | AddPower$ +2 | AddToughness$ +2 | AddKeyword$ Vigilance & Trample & Indestructible Oracle:[+1]: Look at the top four cards of your library. You may reveal a creature or land card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.\n[-3]: Destroy target artifact, enchantment, or creature with flying.\n[-8]: You get an emblem with "Creatures you control get +2/+2 and have vigilance, trample, and indestructible." Loyalty:5 \ No newline at end of file From 44de14d070c7965c7a7da0b18072383c485be914 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 8 Nov 2018 08:47:19 +0300 Subject: [PATCH 113/901] - Minor improvements in Surveil logic. --- forge-ai/src/main/java/forge/ai/AiProps.java | 1 + .../main/java/forge/ai/ability/SurveilAi.java | 21 ++++++++++++++++++- forge-gui-mobile-dev/src/forge/app/Main.java | 6 +++--- forge-gui/res/ai/Cautious.ai | 3 +++ forge-gui/res/ai/Default.ai | 3 +++ forge-gui/res/ai/Experimental.ai | 3 +++ forge-gui/res/ai/Reckless.ai | 3 +++ .../res/cardsfolder/d/doom_whisperer.txt | 2 +- 8 files changed, 37 insertions(+), 5 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiProps.java b/forge-ai/src/main/java/forge/ai/AiProps.java index 69a6fbddf10..b9ee8d741e7 100644 --- a/forge-ai/src/main/java/forge/ai/AiProps.java +++ b/forge-ai/src/main/java/forge/ai/AiProps.java @@ -96,6 +96,7 @@ public enum AiProps { /** */ SCRY_IMMEDIATELY_UNCASTABLE_TO_BOTTOM ("false"), /** */ SCRY_IMMEDIATELY_UNCASTABLE_CMC_DIFF ("1"), /** */ SURVEIL_NUM_CARDS_IN_LIBRARY_TO_BAIL ("10"), /** */ + SURVEIL_LIFEPERC_AFTER_PAYING_LIFE ("75"), /** */ COMBAT_ASSAULT_ATTACK_EVASION_PREDICTION ("true"), /** */ COMBAT_ATTRITION_ATTACK_EVASION_PREDICTION ("true"), /** */ CONSERVATIVE_ENERGY_PAYMENT_ONLY_IN_COMBAT ("true"), /** */ diff --git a/forge-ai/src/main/java/forge/ai/ability/SurveilAi.java b/forge-ai/src/main/java/forge/ai/ability/SurveilAi.java index fe7b1671e67..ab269e00fe5 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SurveilAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SurveilAi.java @@ -1,6 +1,9 @@ package forge.ai.ability; -import forge.ai.SpellAbilityAi; +import forge.ai.*; +import forge.game.card.Card; +import forge.game.cost.Cost; +import forge.game.cost.CostPayLife; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.player.Player; @@ -68,8 +71,14 @@ public class SurveilAi extends SpellAbilityAi { */ @Override protected boolean checkAiLogic(final Player ai, final SpellAbility sa, final String aiLogic) { + final Card source = sa.getHostCard(); + if ("Never".equals(aiLogic)) { return false; + } else if ("Once".equals(aiLogic)) { + if (AiCardMemory.isRememberedCard(ai, source, AiCardMemory.MemorySet.ACTIVATED_THIS_TURN)) { + return false; + } } // TODO: add card-specific Surveil AI logic here when/if necessary @@ -84,6 +93,15 @@ public class SurveilAi extends SpellAbilityAi { return false; } + // Only Surveil for life when at decent amount of life remaining + final Cost cost = sa.getPayCosts(); + if (cost != null && cost.hasSpecificCostType(CostPayLife.class)) { + final int maxLife = ((PlayerControllerAi)ai.getController()).getAi().getIntProperty(AiProps.SURVEIL_LIFEPERC_AFTER_PAYING_LIFE); + if (!ComputerUtilCost.checkLifeCost(ai, cost, sa.getHostCard(), ai.getStartingLife() * maxLife / 100, sa)) { + return false; + } + } + double chance = .4; // 40 percent chance for instant speed if (SpellAbilityAi.isSorcerySpeed(sa)) { chance = .667; // 66.7% chance for sorcery speed (since it will never activate EOT) @@ -99,6 +117,7 @@ public class SurveilAi extends SpellAbilityAi { @Override public boolean confirmAction(Player player, SpellAbility sa, PlayerActionConfirmMode mode, String message) { + AiCardMemory.rememberCard(player, sa.getHostCard(), AiCardMemory.MemorySet.ACTIVATED_THIS_TURN); return true; } } diff --git a/forge-gui-mobile-dev/src/forge/app/Main.java b/forge-gui-mobile-dev/src/forge/app/Main.java index d5a932cefda..03ba4bcc8f2 100644 --- a/forge-gui-mobile-dev/src/forge/app/Main.java +++ b/forge-gui-mobile-dev/src/forge/app/Main.java @@ -41,12 +41,12 @@ public class Main { } // Set this to "true" to make the mobile game port run as a full-screen desktop application - boolean desktopMode = cmd.hasOption("fullscreen"); + boolean desktopMode = true;//cmd.hasOption("fullscreen"); // Set this to the location where you want the mobile game port to look for assets when working as a full-screen desktop application // (uncomment the bottom version and comment the top one to load the res folder from the current folder the .jar is in if you would // like to make the game load from a desktop game folder configuration). - String desktopModeAssetsDir = "../forge-gui/"; - //String desktopModeAssetsDir = "./"; + //String desktopModeAssetsDir = "../forge-gui/"; + String desktopModeAssetsDir = "./"; // Assets directory used when the game fully emulates smartphone/tablet mode (desktopMode = false), useful when debugging from IDE String assetsDir = AssetsDownloader.SHARE_DESKTOP_ASSETS ? "../forge-gui/" : "testAssets/"; diff --git a/forge-gui/res/ai/Cautious.ai b/forge-gui/res/ai/Cautious.ai index b2112e06b01..60888c980ef 100644 --- a/forge-gui/res/ai/Cautious.ai +++ b/forge-gui/res/ai/Cautious.ai @@ -171,6 +171,9 @@ SCRY_IMMEDIATELY_UNCASTABLE_CMC_DIFF=3 # If the AI has this many or fewer cards in the library, it will Surveil to the top of the library in order # not to deplete the library. SURVEIL_NUM_CARDS_IN_LIBRARY_TO_BAIL=10 +# If the AI will have less life than the specified percentage as a result of activating a Surveil ability +# that requires a life playment, it will not pay life to activate it (e.g. Doom Whisperer). +SURVEIL_LIFEPERC_AFTER_PAYING_LIFE=75 # Attempt to predict the number of potential blockers with various forms of evasion when # deciding to do an all-in assault attack diff --git a/forge-gui/res/ai/Default.ai b/forge-gui/res/ai/Default.ai index 2f6b99c304e..ba41dc8e5c8 100644 --- a/forge-gui/res/ai/Default.ai +++ b/forge-gui/res/ai/Default.ai @@ -171,6 +171,9 @@ SCRY_IMMEDIATELY_UNCASTABLE_CMC_DIFF=1 # If the AI has this many or fewer cards in the library, it will Surveil to the top of the library in order # not to deplete the library. SURVEIL_NUM_CARDS_IN_LIBRARY_TO_BAIL=10 +# If the AI will have less life than the specified percentage as a result of activating a Surveil ability +# that requires a life playment, it will not pay life to activate it (e.g. Doom Whisperer). +SURVEIL_LIFEPERC_AFTER_PAYING_LIFE=60 # Attempt to predict the number of potential blockers with various forms of evasion when # deciding to do an all-in assault attack diff --git a/forge-gui/res/ai/Experimental.ai b/forge-gui/res/ai/Experimental.ai index d844e5c2925..c48eedbe7c9 100644 --- a/forge-gui/res/ai/Experimental.ai +++ b/forge-gui/res/ai/Experimental.ai @@ -171,6 +171,9 @@ SCRY_IMMEDIATELY_UNCASTABLE_CMC_DIFF=1 # If the AI has this many or fewer cards in the library, it will Surveil to the top of the library in order # not to deplete the library. SURVEIL_NUM_CARDS_IN_LIBRARY_TO_BAIL=8 +# If the AI will have less life than the specified percentage as a result of activating a Surveil ability +# that requires a life playment, it will not pay life to activate it (e.g. Doom Whisperer). +SURVEIL_LIFEPERC_AFTER_PAYING_LIFE=50 # Attempt to predict the number of potential blockers with various forms of evasion when # deciding to do an all-in assault attack (Experimental!) diff --git a/forge-gui/res/ai/Reckless.ai b/forge-gui/res/ai/Reckless.ai index da788df7ce1..57f13150d73 100644 --- a/forge-gui/res/ai/Reckless.ai +++ b/forge-gui/res/ai/Reckless.ai @@ -171,6 +171,9 @@ SCRY_IMMEDIATELY_UNCASTABLE_CMC_DIFF=1 # If the AI has this many or fewer cards in the library, it will Surveil to the top of the library in order # not to deplete the library. SURVEIL_NUM_CARDS_IN_LIBRARY_TO_BAIL=5 +# If the AI will have less life than the specified percentage as a result of activating a Surveil ability +# that requires a life playment, it will not pay life to activate it (e.g. Doom Whisperer). +SURVEIL_LIFEPERC_AFTER_PAYING_LIFE=35 # Attempt to predict the number of potential blockers with various forms of evasion when # deciding to do an all-in assault attack diff --git a/forge-gui/res/cardsfolder/d/doom_whisperer.txt b/forge-gui/res/cardsfolder/d/doom_whisperer.txt index 469af683112..68c92f036d4 100644 --- a/forge-gui/res/cardsfolder/d/doom_whisperer.txt +++ b/forge-gui/res/cardsfolder/d/doom_whisperer.txt @@ -4,6 +4,6 @@ Types:Creature Nightmare Demon PT:6/6 K:Flying K:Trample -A:AB$ Surveil | Cost$ PayLife<2> | Amount$ 2 | SpellDescription$ Surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on the top of your library in any order.) +A:AB$ Surveil | Cost$ PayLife<2> | Amount$ 2 | AILogic$ Once | SpellDescription$ Surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on the top of your library in any order.) DeckHas:Ability$Surveil & Ability$Graveyard Oracle:Flying, trample\nPay 2 life: Surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on the top of your library in any order.) From e4bf96d5e4fe8f9b2610c2a3014c8d6b4d46b171 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 8 Nov 2018 08:49:49 +0300 Subject: [PATCH 114/901] - Remove an accidental commit of debug test in mobile-dev. --- forge-gui-mobile-dev/src/forge/app/Main.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-gui-mobile-dev/src/forge/app/Main.java b/forge-gui-mobile-dev/src/forge/app/Main.java index 03ba4bcc8f2..d5a932cefda 100644 --- a/forge-gui-mobile-dev/src/forge/app/Main.java +++ b/forge-gui-mobile-dev/src/forge/app/Main.java @@ -41,12 +41,12 @@ public class Main { } // Set this to "true" to make the mobile game port run as a full-screen desktop application - boolean desktopMode = true;//cmd.hasOption("fullscreen"); + boolean desktopMode = cmd.hasOption("fullscreen"); // Set this to the location where you want the mobile game port to look for assets when working as a full-screen desktop application // (uncomment the bottom version and comment the top one to load the res folder from the current folder the .jar is in if you would // like to make the game load from a desktop game folder configuration). - //String desktopModeAssetsDir = "../forge-gui/"; - String desktopModeAssetsDir = "./"; + String desktopModeAssetsDir = "../forge-gui/"; + //String desktopModeAssetsDir = "./"; // Assets directory used when the game fully emulates smartphone/tablet mode (desktopMode = false), useful when debugging from IDE String assetsDir = AssetsDownloader.SHARE_DESKTOP_ASSETS ? "../forge-gui/" : "testAssets/"; From ebdfd94f8536d8315bc1d7f54dfbc84ac08cb710 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Thu, 8 Nov 2018 07:27:34 +0100 Subject: [PATCH 115/901] ExtraTurn in PlayerView --- .../java/forge/game/combat/CombatUtil.java | 2 +- .../java/forge/game/phase/PhaseHandler.java | 36 +++++++++++++++++-- .../main/java/forge/game/player/Player.java | 14 +++++--- .../java/forge/game/player/PlayerView.java | 21 +++++++++++ .../forge/trackable/TrackableProperty.java | 2 ++ 5 files changed, 68 insertions(+), 7 deletions(-) diff --git a/forge-game/src/main/java/forge/game/combat/CombatUtil.java b/forge-game/src/main/java/forge/game/combat/CombatUtil.java index 388990b4ec1..1fbba12389e 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatUtil.java +++ b/forge-game/src/main/java/forge/game/combat/CombatUtil.java @@ -219,7 +219,7 @@ public class CombatUtil { } break; case "CARDNAME can't attack during extra turns.": - if (game.getPhaseHandler().getPlayerTurn().isPlayingExtraTurn()) { + if (game.getPhaseHandler().getPlayerTurn().isExtraTurn()) { return false; } break; diff --git a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java index ba10cde1a85..29e13473533 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java @@ -799,7 +799,12 @@ public class PhaseHandler implements java.io.Serializable { private Player getNextActivePlayer() { ExtraTurn extraTurn = !extraTurns.isEmpty() ? extraTurns.pop() : null; Player nextPlayer = extraTurn != null ? extraTurn.getPlayer() : game.getNextPlayerAfter(playerTurn); - + + // update ExtraTurn Count for all players + for (final Player p : game.getPlayers()) { + p.setExtraTurnCount(getExtraTurnForPlayer(p)); + } + if (extraTurn != null) { // The bottom of the extra turn stack is the normal turn nextPlayer.setExtraTurn(!extraTurns.isEmpty()); @@ -873,7 +878,13 @@ public class PhaseHandler implements java.io.Serializable { if (extraTurns.isEmpty()) { extraTurns.push(new ExtraTurn(game.getNextPlayerAfter(playerTurn))); } - return extraTurns.push(new ExtraTurn(player)); + + ExtraTurn result = extraTurns.push(new ExtraTurn(player)); + // update Extra Turn for all players + for (final Player p : game.getPlayers()) { + p.setExtraTurnCount(getExtraTurnForPlayer(p)); + } + return result; } public final void addExtraPhase(final PhaseType afterPhase, final PhaseType extraPhase) { @@ -1128,4 +1139,25 @@ public class PhaseHandler implements java.io.Serializable { public void setCombat(Combat combat) { this.combat = combat; } + + /** + * returns the continuous extra turn count + * @param PLayer p + * @return int + */ + public int getExtraTurnForPlayer(final Player p) { + if (this.extraTurns.isEmpty() || this.extraTurns.size() < 2) { + return 0; + } + + int count = 0; + // skip the first element + for (final ExtraTurn et : extraTurns.subList(1, extraTurns.size())) { + if (!et.getPlayer().equals(p)) { + break; + } + count += 1; + } + return count; + } } diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index e4e5bfe45ce..ac1f65aff47 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -144,7 +144,6 @@ public class Player extends GameEntity implements Comparable { private Map commanderCast = Maps.newHashMap(); private final Game game; private boolean triedToDrawFromEmptyLibrary = false; - private boolean isPlayingExtraTrun = false; private CardCollection lostOwnership = new CardCollection(); private CardCollection gainedOwnership = new CardCollection(); private int numManaConversion = 0; @@ -2673,11 +2672,18 @@ public class Player extends GameEntity implements Comparable { return result; } - public boolean isPlayingExtraTurn() { - return isPlayingExtraTrun; + public boolean isExtraTurn() { + return view.getIsExtraTurn(); } public void setExtraTurn(boolean b) { - isPlayingExtraTrun = b; + view.setIsExtraTurn(b); + } + + public int getExtraTurnCount() { + return view.getExtraTurnCount(); + } + public void setExtraTurnCount(final int val) { + view.setExtraTurnCount(val); } public void initVariantsZones(RegisteredPlayer registeredPlayer) { diff --git a/forge-game/src/main/java/forge/game/player/PlayerView.java b/forge-game/src/main/java/forge/game/player/PlayerView.java index 30235025c54..989d70ecf38 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerView.java +++ b/forge-game/src/main/java/forge/game/player/PlayerView.java @@ -189,6 +189,22 @@ public class PlayerView extends GameEntityView { set(TrackableProperty.Counters, p.getCounters()); } + public boolean getIsExtraTurn() { + return get(TrackableProperty.IsExtraTurn); + } + + public void setIsExtraTurn(final boolean val) { + set(TrackableProperty.IsExtraTurn, val); + } + + public int getExtraTurnCount() { + return get(TrackableProperty.ExtraTurnCount); + } + + public void setExtraTurnCount(final int val) { + set(TrackableProperty.ExtraTurnCount, val); + } + public int getMaxHandSize() { return get(TrackableProperty.MaxHandSize); } @@ -422,6 +438,11 @@ public class PlayerView extends GameEntityView { details.add(TextUtil.concatNoSpace("Cards in hand: ", TextUtil.addSuffix(String.valueOf(getHandSize()),"/"), getMaxHandString())); details.add(TextUtil.concatWithSpace("Cards drawn this turn:", String.valueOf(getNumDrawnThisTurn()))); details.add(TextUtil.concatWithSpace("Damage prevention:", String.valueOf(getPreventNextDamage()))); + + if (getIsExtraTurn()) { + details.add("Extra Turn: Yes"); + } + details.add(TextUtil.concatWithSpace("Extra Turn Count:", String.valueOf(getExtraTurnCount()))); final String keywords = Lang.joinHomogenous(getDisplayableKeywords()); if (!keywords.isEmpty()) { details.add(keywords); diff --git a/forge-game/src/main/java/forge/trackable/TrackableProperty.java b/forge-game/src/main/java/forge/trackable/TrackableProperty.java index b7772a50791..6c407b678ee 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableProperty.java +++ b/forge-game/src/main/java/forge/trackable/TrackableProperty.java @@ -113,6 +113,8 @@ public enum TrackableProperty { Hand(TrackableTypes.CardViewCollectionType, FreezeMode.IgnoresFreeze), Library(TrackableTypes.CardViewCollectionType, FreezeMode.IgnoresFreeze), Mana(TrackableTypes.ManaMapType, FreezeMode.IgnoresFreeze), + IsExtraTurn(TrackableTypes.BooleanType), + ExtraTurnCount(TrackableTypes.IntegerType), //SpellAbility HostCard(TrackableTypes.CardViewType), From 098569064f4b839c9a2a6d16444ccaf0a2a5a29f Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 8 Nov 2018 09:34:35 +0300 Subject: [PATCH 116/901] - Fixed the Once logic check in SurveilAi. --- forge-ai/src/main/java/forge/ai/ability/SurveilAi.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/SurveilAi.java b/forge-ai/src/main/java/forge/ai/ability/SurveilAi.java index ab269e00fe5..23069294e94 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SurveilAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SurveilAi.java @@ -112,12 +112,15 @@ public class SurveilAi extends SpellAbilityAi { randomReturn = true; } + if (randomReturn) { + AiCardMemory.rememberCard(ai, sa.getHostCard(), AiCardMemory.MemorySet.ACTIVATED_THIS_TURN); + } + return randomReturn; } @Override public boolean confirmAction(Player player, SpellAbility sa, PlayerActionConfirmMode mode, String message) { - AiCardMemory.rememberCard(player, sa.getHostCard(), AiCardMemory.MemorySet.ACTIVATED_THIS_TURN); return true; } } From 2d4174c6d880aa8c084576648ec4f759a830df2b Mon Sep 17 00:00:00 2001 From: Hanmac Date: Thu, 8 Nov 2018 08:28:32 +0100 Subject: [PATCH 117/901] Update ExtraTurn in PlayerView --- .../main/java/forge/game/phase/PhaseHandler.java | 13 +++++++++++++ .../src/main/java/forge/screens/match/CMatchUI.java | 2 ++ 2 files changed, 15 insertions(+) diff --git a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java index 29e13473533..74738a143e0 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java @@ -873,10 +873,13 @@ public class PhaseHandler implements java.io.Serializable { } public final ExtraTurn addExtraTurn(final Player player) { + Player previous = null; // use a stack to handle extra turns, make sure the bottom of the stack // restores original turn order if (extraTurns.isEmpty()) { extraTurns.push(new ExtraTurn(game.getNextPlayerAfter(playerTurn))); + } else { + previous = extraTurns.peek().getPlayer(); } ExtraTurn result = extraTurns.push(new ExtraTurn(player)); @@ -884,6 +887,16 @@ public class PhaseHandler implements java.io.Serializable { for (final Player p : game.getPlayers()) { p.setExtraTurnCount(getExtraTurnForPlayer(p)); } + + // get all players where the view should be updated + List toUpdate = Lists.newArrayList(player); + if (previous != null) { + toUpdate.add(previous); + } + + // fireEvent to update the Details + game.fireEvent(new GameEventPlayerStatsChanged(toUpdate)); + return result; } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index 6d6b6c6f555..f1e70a8cb3e 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -412,6 +412,8 @@ public final class CMatchUI if (vHand != null) { vHand.getLayoutControl().updateHand(); } + // update Cards in Hand + getFieldViewFor(owner).updateDetails(); } if (updateAnte) { cAntes.update(); From da7659d8fd217e4655c0d841ace09cfb29c6219e Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Thu, 8 Nov 2018 07:38:44 +0000 Subject: [PATCH 118/901] Update CMatchUI.java --- .../src/main/java/forge/screens/match/CMatchUI.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index f1e70a8cb3e..0e13b5c3add 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -413,7 +413,7 @@ public final class CMatchUI vHand.getLayoutControl().updateHand(); } // update Cards in Hand - getFieldViewFor(owner).updateDetails(); + vField.updateDetails(); } if (updateAnte) { cAntes.update(); From d1ca6265efb008a25fbf40cf083e281ec0ba747a Mon Sep 17 00:00:00 2001 From: Jeremy Pelkala Date: Fri, 2 Nov 2018 18:57:17 -0400 Subject: [PATCH 119/901] -CardPool Added getFilteredPool() to easily get a Predicate applied copy of a CardPool. -GameRules Minor formatting change. -worlds.txt Added Random Commander to the list. -DeckConstructionRules New enum for defining the subformat a quest is using. -QuestAssets getLife() now has a switch for modifying the life for sub-formats. -QuestData New data save version. Includes a DeckConstructionRules enum. -QuestDataIO updateSaveFile will update old saves to have a default DeckConstructionRules complying with the new QuestData save version. -QuestController Updated to include support for DeckConstructionRules and specialized duel managers -QuestEvent Now have boolean to define if this is a "random" match for the duel list. Currently only QuestEventCommanderDuelManager makes use of this feature for Commander quests. -QuestEventCommanderDuel New QuestEventDuel used in the QuestEventCommanderDuelManager which contains a DeckProxy for use in generating random commander decks. -QuestEventCommanderDuelManager New duel manager to generate duels by difficulty for a Commander quest. Currently uses random generation to generate the decks of each opponent. -QuestSpellShop Sell Extras button now has a switch for taking into account special deck construction rules such as Commander only allowing singletons. -QuestUtil Starting a game now checks for various sub-format specific changes including a switch case for which variety of registered player to use. -QuestUtilCards Starting cardpool size is now modified by a switch case for sub-formats such as Commander. -QuestWinLoseController QuestEvents marked as random matches will now award a "Random Opponent Bonus" equal to the credit base. Currently only QuestEventCommanderDuelManager creates QuestEvents marked as such. -QuestWorld Added support for the Commander quest format and world. -CEditorQuest Many changes to add support for Commander in a style that, hopefully, also paths the way for future format support. -CSubmenuQuestData Support for Commander quests. -VSubmenuQuestData Support for Commander quests. --- .../src/main/java/forge/deck/CardPool.java | 14 ++ .../src/main/java/forge/game/GameRules.java | 3 +- .../deckeditor/controllers/CEditorQuest.java | 151 +++++++++++-- .../screens/home/quest/CSubmenuQuestData.java | 10 +- .../screens/home/quest/VSubmenuQuestData.java | 28 ++- forge-gui/res/quest/world/worlds.txt | 1 + .../java/forge/quest/QuestController.java | 14 +- .../src/main/java/forge/quest/QuestEvent.java | 4 + .../forge/quest/QuestEventCommanderDuel.java | 19 ++ .../quest/QuestEventCommanderDuelManager.java | 205 ++++++++++++++++++ .../main/java/forge/quest/QuestSpellShop.java | 17 +- .../src/main/java/forge/quest/QuestUtil.java | 60 ++++- .../main/java/forge/quest/QuestUtilCards.java | 12 +- .../forge/quest/QuestWinLoseController.java | 5 + .../src/main/java/forge/quest/QuestWorld.java | 8 +- .../quest/data/DeckConstructionRules.java | 17 ++ .../java/forge/quest/data/QuestAssets.java | 9 +- .../main/java/forge/quest/data/QuestData.java | 12 +- .../main/java/forge/quest/io/QuestDataIO.java | 8 +- 19 files changed, 561 insertions(+), 36 deletions(-) create mode 100644 forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java create mode 100644 forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java create mode 100644 forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java diff --git a/forge-core/src/main/java/forge/deck/CardPool.java b/forge-core/src/main/java/forge/deck/CardPool.java index 72ab8efb851..b484f31ab98 100644 --- a/forge-core/src/main/java/forge/deck/CardPool.java +++ b/forge-core/src/main/java/forge/deck/CardPool.java @@ -17,6 +17,7 @@ */ package forge.deck; +import com.google.common.base.Predicate; import com.google.common.collect.Lists; import forge.StaticData; import forge.card.CardDb; @@ -216,4 +217,17 @@ public class CardPool extends ItemPool { } return sb.toString(); } + + /** + * Applies a predicate to this CardPool's cards. + * @param predicate the Predicate to apply to this CardPool + * @return a new CardPool made from this CardPool with only the cards that agree with the provided Predicate + */ + public CardPool getFilteredPool(Predicate predicate){ + CardPool filteredPool = new CardPool(); + for(PaperCard pc : this.items.keySet()){ + if(predicate.apply(pc)) filteredPool.add(pc); + } + return filteredPool; + } } diff --git a/forge-game/src/main/java/forge/game/GameRules.java b/forge-game/src/main/java/forge/game/GameRules.java index dc7ed4cddf1..5e6876e9801 100644 --- a/forge-game/src/main/java/forge/game/GameRules.java +++ b/forge-game/src/main/java/forge/game/GameRules.java @@ -78,7 +78,8 @@ public class GameRules { } public boolean hasCommander() { - return appliedVariants.contains(GameType.Commander) || appliedVariants.contains(GameType.TinyLeaders) + return appliedVariants.contains(GameType.Commander) + || appliedVariants.contains(GameType.TinyLeaders) || appliedVariants.contains(GameType.Brawl); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java index c33da12cda7..b7842272e42 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java @@ -18,11 +18,20 @@ package forge.screens.deckeditor.controllers; import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; import com.google.common.base.Supplier; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; import forge.UiCommand; +import forge.card.CardRules; +import forge.card.CardRulesPredicates; +import forge.card.ColorSet; +import forge.card.mana.ManaCost; import forge.deck.CardPool; import forge.deck.Deck; import forge.deck.DeckSection; +import forge.deck.generation.DeckGeneratorBase; import forge.gui.GuiUtils; import forge.gui.framework.DragCell; import forge.gui.framework.FScreen; @@ -35,6 +44,7 @@ import forge.itemmanager.views.ItemTableColumn; import forge.model.FModel; import forge.properties.ForgePreferences.FPref; import forge.quest.QuestController; +import forge.quest.data.DeckConstructionRules; import forge.screens.deckeditor.AddBasicLandsDialog; import forge.screens.deckeditor.SEditorIO; import forge.screens.deckeditor.views.VAllDecks; @@ -48,6 +58,7 @@ import forge.util.ItemPool; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.print.Paper; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -103,6 +114,14 @@ public final class CEditorQuest extends CDeckEditor { allSections.add(DeckSection.Main); allSections.add(DeckSection.Sideboard); + //Add sub-format specific sections + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: + allSections.add(DeckSection.Commander); + break; + } + this.questData = questData0; final CardManager catalogManager = new CardManager(cDetailPicture, false, true); @@ -158,6 +177,10 @@ public final class CEditorQuest extends CDeckEditor { @Override protected CardLimit getCardLimit() { if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) { + //If this is a commander quest, only allow single copies of cards + if(FModel.getQuest().getDeckConstructionRules() == DeckConstructionRules.Commander){ + return CardLimit.Singleton; + } return CardLimit.Default; } return CardLimit.None; //if not enforcing deck legality, don't enforce default limit @@ -245,16 +268,98 @@ public final class CEditorQuest extends CDeckEditor { public void resetTables() { this.sectionMode = DeckSection.Main; - final Deck deck = this.controller.getModel(); - - final CardPool cardpool = getInitialCatalog(); - // remove bottom cards that are in the deck from the card pool - cardpool.removeAll(deck.getMain()); - // remove sideboard cards from the catalog - cardpool.removeAll(deck.getOrCreate(DeckSection.Sideboard)); // show cards, makes this user friendly - this.getCatalogManager().setPool(cardpool); - this.getDeckManager().setPool(deck.getMain()); + this.getCatalogManager().setPool(getRemainingCardPool()); + this.getDeckManager().setPool(getDeck().getMain()); + } + + /*** + * Provides the pool of cards the player has available to add to his or her deck. Also manages showing available cards + * to choose from for special deck construction rules, e.g.: Commander. + * @return CardPool of cards available to add to the player's deck. + */ + private CardPool getRemainingCardPool(){ + final CardPool cardpool = getInitialCatalog(); + + // remove bottom cards that are in the deck from the card pool + cardpool.removeAll(getDeck().getMain()); + + // remove sideboard cards from the catalog + cardpool.removeAll(getDeck().getOrCreate(DeckSection.Sideboard)); + + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: + //remove this deck's currently selected commander(s) from the catalog + cardpool.removeAll(getDeck().getOrCreate(DeckSection.Commander)); + + //TODO: Only thin if deck conformance is being applied + if(getDeck().getOrCreate(DeckSection.Commander).toFlatList().size() > 0) { + Predicate identityPredicate = new MatchCommanderColorIdentity(getDeckColorIdentity()); + CardPool filteredPool = cardpool.getFilteredPool(identityPredicate); + + return filteredPool; + } + break; + } + + return cardpool; + } + + /** + * Predicate that filters out based on a color identity provided upon instantiation. Used to filter the card + * list when a commander is chosen so the user can more easily see what cards are available for his or her deck + * and avoid making additions that are not legal. + */ + public static class MatchCommanderColorIdentity implements Predicate { + private final ColorSet allowedColor; + + public MatchCommanderColorIdentity(ColorSet color) { + allowedColor = color; + } + + @Override + public boolean apply(PaperCard subject) { + CardRules cr = subject.getRules(); + ManaCost mc = cr.getManaCost(); + return !mc.isPureGeneric() && allowedColor.containsAllColorsFrom(cr.getColorIdentity().getColor()); + } + } + + /** + * Compiles the color identity of the loaded deck based on the commanders. + * @return A ColorSet containing the color identity of the currently loaded deck. + */ + public ColorSet getDeckColorIdentity(){ + + List commanders = getDeck().getOrCreate(DeckSection.Commander).toFlatList(); + List colors = new ArrayList<>(); + + //Return early if there are no current commanders + if(commanders.size() == 0) return ColorSet.fromNames(colors); + + //For each commander,add each color of its color identity if not already added + for(PaperCard pc : commanders){ + if(!colors.contains("w") && pc.getRules().getColorIdentity().hasWhite()) colors.add("w"); + if(!colors.contains("u") && pc.getRules().getColorIdentity().hasBlue()) colors.add("u"); + if(!colors.contains("b") && pc.getRules().getColorIdentity().hasBlack()) colors.add("b"); + if(!colors.contains("r") && pc.getRules().getColorIdentity().hasRed()) colors.add("r"); + if(!colors.contains("g") && pc.getRules().getColorIdentity().hasGreen()) colors.add("g"); + } + + return ColorSet.fromNames(colors); + } + + /* + Used to make the code more readable in game terms. + */ + private Deck getDeck(){ + return this.controller.getModel(); + } + + private ItemPool getCommanderCardPool(){ + Predicate commanderPredicate = Predicates.compose(CardRulesPredicates.Presets.CAN_BE_COMMANDER, PaperCard.FN_GET_RULES); + return getRemainingCardPool().getFilteredPool(commanderPredicate); } @Override @@ -280,14 +385,30 @@ public final class CEditorQuest extends CDeckEditor { } /** - * Switch between the main deck and the sideboard editor. + * Switch between the main deck and the sideboard/Command Zone editor. */ public void setEditorMode(DeckSection sectionMode) { - if (sectionMode == DeckSection.Sideboard) { - this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Sideboard)); - } - else { - this.getDeckManager().setPool(this.controller.getModel().getMain()); + //Fixes null pointer error on switching tabs while quest deck editor is open. TODO: Find source of bug possibly? + if(sectionMode == null) sectionMode = DeckSection.Main; + + //Based on which section the editor is in, display the remaining card pool (or applicable card pool if in + //Commander) and the current section's cards + switch(sectionMode){ + case Main : + this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); + this.getCatalogManager().setPool(getRemainingCardPool()); + this.getDeckManager().setPool(this.controller.getModel().getMain()); + break; + case Sideboard : + this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); + this.getCatalogManager().setPool(getRemainingCardPool()); + this.getDeckManager().setPool(getDeck().getOrCreate(DeckSection.Sideboard)); + break; + case Commander : + this.getCatalogManager().setup(ItemManagerConfig.COMMANDER_POOL); + this.getCatalogManager().setPool(getCommanderCardPool()); + this.getDeckManager().setPool(getDeck().getOrCreate(DeckSection.Commander)); + break; } this.sectionMode = sectionMode; diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java index 131805b738b..8aa76293b55 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java @@ -10,6 +10,7 @@ import forge.model.FModel; import forge.properties.ForgeConstants; import forge.quest.*; import forge.quest.StartingPoolPreferences.PoolType; +import forge.quest.data.DeckConstructionRules; import forge.quest.data.GameFormatQuest; import forge.quest.data.QuestData; import forge.quest.data.QuestPreferences.QPref; @@ -340,9 +341,16 @@ public enum CSubmenuQuestData implements ICDoc { break; } + //Apply the appropriate deck construction rules for this quest + DeckConstructionRules dcr = DeckConstructionRules.Default; + + if(VSubmenuQuestData.SINGLETON_INSTANCE.isCommander()){ + dcr = DeckConstructionRules.Commander; + } + final QuestController qc = FModel.getQuest(); - qc.newGame(questName, difficulty, mode, fmtPrizes, view.isUnlockSetsAllowed(), dckStartPool, fmtStartPool, view.getStartingWorldName(), userPrefs); + qc.newGame(questName, difficulty, mode, fmtPrizes, view.isUnlockSetsAllowed(), dckStartPool, fmtStartPool, view.getStartingWorldName(), userPrefs, dcr); FModel.getQuest().save(); // Save in preferences. diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java index 9eee9e58ca3..70e284faf3d 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java @@ -62,6 +62,7 @@ public enum VSubmenuQuestData implements IVSubmenu { private final FRadioButton radHard = new FRadioButton("Hard"); private final FRadioButton radExpert = new FRadioButton("Expert"); private final FCheckBox boxFantasy = new FCheckBox("Fantasy Mode"); + private final FCheckBox boxCommander = new FCheckBox("Commander Subformat"); private final FLabel lblStartingWorld = new FLabel.Builder().text("Starting world:").build(); private final FComboBoxWrapper cbxStartingWorld = new FComboBoxWrapper<>(); @@ -274,9 +275,25 @@ public enum VSubmenuQuestData implements IVSubmenu { } }); - // Fantasy box enabled by Default + // Fantasy box selected by Default boxFantasy.setSelected(true); boxFantasy.setEnabled(true); + + // Commander box unselected by Default + boxCommander.setSelected(false); + boxCommander.setEnabled(true); + + boxCommander.addActionListener( + new ActionListener(){ + public void actionPerformed(ActionEvent e){ + if(!isCommander()) return; //do nothing if unselecting Commander Subformat + //Otherwise, set the starting world to Random Commander + cbxStartingWorld.setSelectedItem(FModel.getWorlds().get("Random Commander")); + } + } + + ); + boxCompleteSet.setEnabled(true); boxAllowDuplicates.setEnabled(true); @@ -286,6 +303,7 @@ public enum VSubmenuQuestData implements IVSubmenu { final JPanel pnlDifficultyMode = new JPanel(new MigLayout("insets 0, gap 1%, flowy")); pnlDifficultyMode.add(difficultyPanel, "gapright 4%"); pnlDifficultyMode.add(boxFantasy, "h 25px!, gapbottom 15, gapright 4%"); + pnlDifficultyMode.add(boxCommander, "h 25px!, gapbottom 15, gapright 4%"); pnlDifficultyMode.add(lblStartingWorld, "h 25px!, hidemode 3"); cbxStartingWorld.addTo(pnlDifficultyMode, "h 27px!, w 40%, pushx, gapbottom 7"); pnlDifficultyMode.setOpaque(false); @@ -487,6 +505,14 @@ public enum VSubmenuQuestData implements IVSubmenu { return boxFantasy.isSelected(); } + /** + * Auth. Imakuni + * @return True if the "Commander Subformat" check box is selected. + */ + public boolean isCommander() { + return boxCommander.isSelected(); + } + public boolean startWithCompleteSet() { return boxCompleteSet.isSelected(); } diff --git a/forge-gui/res/quest/world/worlds.txt b/forge-gui/res/quest/world/worlds.txt index b08931cde59..5d99427d535 100644 --- a/forge-gui/res/quest/world/worlds.txt +++ b/forge-gui/res/quest/world/worlds.txt @@ -1,5 +1,6 @@ Name:Main world Name:Random Standard +Name:Random Commander Name:Amonkhet|Dir:Amonkhet|Sets:AKH, HOU Name:Jamuraa|Dir:jamuraa|Sets:5ED, ARN, MIR, VIS, WTH|Banned:Chaos Orb; Falling Star Name:Kamigawa|Dir:2004 Kamigawa|Sets:CHK, BOK, SOK diff --git a/forge-gui/src/main/java/forge/quest/QuestController.java b/forge-gui/src/main/java/forge/quest/QuestController.java index 0d306f4431a..5366f7200bc 100644 --- a/forge-gui/src/main/java/forge/quest/QuestController.java +++ b/forge-gui/src/main/java/forge/quest/QuestController.java @@ -276,9 +276,10 @@ public class QuestController { public void newGame(final String name, final int difficulty, final QuestMode mode, final GameFormat formatPrizes, final boolean allowSetUnlocks, final Deck startingCards, final GameFormat formatStartingPool, - final String startingWorld, final StartingPoolPreferences userPrefs) { + final String startingWorld, final StartingPoolPreferences userPrefs, + DeckConstructionRules dcr) { - this.load(new QuestData(name, difficulty, mode, formatPrizes, allowSetUnlocks, startingWorld)); // pass awards and unlocks here + this.load(new QuestData(name, difficulty, mode, formatPrizes, allowSetUnlocks, startingWorld, dcr)); // pass awards and unlocks here if (startingCards != null) { this.myCards.addDeck(startingCards); @@ -435,6 +436,12 @@ public class QuestController { QuestWorld world = getWorld(); String path = ForgeConstants.DEFAULT_CHALLENGES_DIR; + //Use a variant specialized duel manager if this is a variant quest + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: this.duelManager = new QuestEventCommanderDuelManager(); return; + } + if (world != null) { if (world.getName().equals(QuestWorld.STANDARDWORLDNAME)) { @@ -449,7 +456,6 @@ public class QuestController { } this.duelManager = new QuestEventDuelManager(new File(path)); - } public HashSet GetRating() { @@ -607,4 +613,6 @@ public class QuestController { public void setCurrentDeck(String s) { model.currentDeck = s; } + + public DeckConstructionRules getDeckConstructionRules(){return model.deckConstructionRules;} } diff --git a/forge-gui/src/main/java/forge/quest/QuestEvent.java b/forge-gui/src/main/java/forge/quest/QuestEvent.java index 00a140c80e2..2a9bf6c1b63 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEvent.java +++ b/forge-gui/src/main/java/forge/quest/QuestEvent.java @@ -48,6 +48,7 @@ public abstract class QuestEvent implements IQuestEvent { private String profile = "Default"; // Opponent name if different from the challenge name private String opponentName = null; + private boolean isRandomMatch = false; public static final Function FN_GET_NAME = new Function() { @@ -174,4 +175,7 @@ public abstract class QuestEvent implements IQuestEvent { this.showDifficulty = showDifficulty; } + public boolean getIsRandomMatch(){return isRandomMatch;} + + public void setIsRandomMatch(boolean b){isRandomMatch = b;} } diff --git a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java new file mode 100644 index 00000000000..1d7924a04d7 --- /dev/null +++ b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java @@ -0,0 +1,19 @@ +package forge.quest; + +import forge.deck.DeckProxy; + +/** + * A QuestEventDuel with a CommanderDeckGenerator used exclusively within QuestEventCommanderDuelManager for the + * creation of randomly generated Commander decks in a Commander variant quest. + * Auth. Imakuni & Forge + */ +public class QuestEventCommanderDuel extends QuestEventDuel{ + /** + * The CommanderDeckGenerator for this duel. + */ + private DeckProxy deckProxy; + + public DeckProxy getDeckProxy() {return deckProxy;} + + public void setDeckProxy(DeckProxy dp) {deckProxy = dp;} +} diff --git a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java new file mode 100644 index 00000000000..384d9d11d77 --- /dev/null +++ b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java @@ -0,0 +1,205 @@ +package forge.quest; + +import forge.deck.*; +import forge.item.PaperCard; +import forge.model.FModel; +import forge.quest.data.QuestPreferences; +import forge.util.CollectionSuppliers; +import forge.util.MyRandom; +import forge.util.maps.EnumMapOfLists; +import forge.util.maps.MapOfLists; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Manages the creation of random Commander duels for a Commander variant quest. Random generation is handled via + * the CommanderDeckGenerator class. + * Auth. Forge & Imakuni#8015 + */ +public class QuestEventCommanderDuelManager implements QuestEventDuelManagerInterface { + /** + * The list of all possible Commander variant duels. + */ + private ArrayList commanderDuels = new ArrayList<>(); + + /** + * Contains the expert deck lists for the commanders. + */ + private List expertCommanderDecks; + + /** + * Immediately calls assembleDuels() to setup the commanderDuels variable. + */ + public QuestEventCommanderDuelManager(){ + assembleDuels(); + } + + /** + * Assembles the list of all possible Commander duels via CommanderDeckGenerator. Should be done within constructor. + */ + private void assembleDuels(){ + //isCardGen = true seemed to make slightly more difficult decks based purely on experience with a very small sample size. + //Gotta work on this more, its making pretty average decks after further testing. + expertCommanderDecks = CommanderDeckGenerator.getCommanderDecks(DeckFormat.Commander, true, true); + + List generatedDuels = CommanderDeckGenerator.getCommanderDecks(DeckFormat.Commander, true, false); + + for(DeckProxy dp : generatedDuels){ + QuestEventCommanderDuel duel = new QuestEventCommanderDuel(); + + duel.setDescription("Randomly generated " + dp.getName() + " commander deck."); + duel.setName(dp.getName()); + duel.setTitle(dp.getName()); + duel.setOpponentName(dp.getName()); + duel.setDifficulty(QuestEventDifficulty.EASY); + duel.setDeckProxy(dp); + + //Setting a blank deck avoids a null pointer exception. The deck is generated in generateDuels() to avoid long load times. + duel.setEventDeck(new Deck()); + + commanderDuels.add(duel); + } + } + + /** + * Retrieve list of all possible Commander duels. + * @return ArrayList containing all possible Commander duels. + */ + public Iterable getAllDuels() { + return commanderDuels; + } + + /** + * Retrieve list of all possible Commander duels. + * @param difficulty Currently unused + * @return ArrayList containing all possible Commander duels. + */ + public Iterable getDuels(QuestEventDifficulty difficulty){ + return commanderDuels; + } + + /** + * Composes an ArrayList containing 4 QuestEventDuels composed with Commander variant decks. One duel will have its + * title replaced as Random. + * @return ArrayList of QuestEventDuels containing 4 duels. + */ + public List generateDuels(){ + final List duelOpponents = new ArrayList<>(); + + //While there are less than 4 duels chosen + while(duelOpponents.size() < 4){ + //Get a random duel from the possible duels list + QuestEventCommanderDuel duel = (QuestEventCommanderDuel)commanderDuels.get(((int) (commanderDuels.size() * MyRandom.getRandom().nextDouble()))); + + //If the chosen duels list already contains this duel, get a different duel to prevent duplicate duels + if(duelOpponents.contains(duel)) continue; + + //Add the randomly chosen duel to the duel list + duelOpponents.add(duel); + + //Here the actual deck for this commander is generated by calling .getDeck() on the saved DeckProxy + duel.setEventDeck(duel.getDeckProxy().getDeck()); + + //Modify deck for difficulty + modifyDuelForDifficulty(duel); + + + } + + //Modify the stats of the final duel to hide the opponent, creating a "random" duel. + //We make a copy of the final duel and overwrite it in the duelOpponents to avoid changing the variables in + //the original duel, which gets reused. + QuestEventCommanderDuel duel = (QuestEventCommanderDuel)duelOpponents.get(duelOpponents.size() - 1); + QuestEventCommanderDuel randomDuel = new QuestEventCommanderDuel(); + + randomDuel.setName(duel.getName()); + randomDuel.setOpponentName(duel.getName()); + randomDuel.setDeckProxy(duel.getDeckProxy()); + randomDuel.setTitle("Random Opponent"); + randomDuel.setShowDifficulty(false); + randomDuel.setDescription("Fight a random generated commander opponent."); + randomDuel.setIsRandomMatch(true); + randomDuel.setEventDeck(duel.getEventDeck()); + + //Replace the final duel with this newly modified "random" duel + duelOpponents.set(duelOpponents.size()-1, randomDuel); + + return duelOpponents; + } + + /** + * Retrieves the expert level deck generation of a deck with the same commander as the provided DeckProxy. + * @param dp The easy generation commander deck + * @return The same commander's expert generation DeckProxy + */ + private Deck getExpertGenDeck(DeckProxy dp){ + for(QuestEventDuel qed : commanderDuels){ + QuestEventCommanderDuel cmdQED = (QuestEventCommanderDuel)qed; + if(cmdQED.getDeckProxy().getName().equals(dp.getName())){ + return cmdQED.getDeckProxy().getDeck(); + } + } + return null; + } + + /** + * Modifies a given duel by replacing a percentage of the deck with random cards from the more difficult generated version + * of the same commander's deck. Medium replaces 30%, Hard replaces 60%, Expert replaces 100%. + * @param duel The QuestEventCommanderDuel to modify + */ + private void modifyDuelForDifficulty(QuestEventCommanderDuel duel){ + final QuestPreferences questPreferences = FModel.getQuestPreferences(); + final int index = FModel.getQuest().getAchievements().getDifficulty(); + final int numberOfWins = FModel.getQuest().getAchievements().getWin(); + Deck expertDeck = getExpertGenDeck(duel.getDeckProxy()); + + int difficultyReplacementPercent = 0; + + //Note: The code is ordered to make the least number of comparisons I could think of at the time for speed reasons. + //In reality, it shouldn't really make much difference, but why not? + if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_EXPERTAI, index)) { + //At expert, the deck is replaced with the entire expert deck, and we can return immediately + duel.setEventDeck(expertDeck); + duel.setDifficulty(QuestEventDifficulty.EXPERT); + return; + } + + if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_MEDIUMAI, index)) { + difficultyReplacementPercent += 30; + duel.setDifficulty(QuestEventDifficulty.MEDIUM); + } else return; //return early here since it would be an easy opponent with no changes + + if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_HARDAI, index)) { + difficultyReplacementPercent += 30; + duel.setDifficulty(QuestEventDifficulty.HARD); + } + + CardPool easyMain = duel.getEventDeck().getMain(); + CardPool expertMain = expertDeck.getMain(); + + List easyList = easyMain.toFlatList(); + List expertList = expertMain.toFlatList(); + + //Replace cards in the easy deck with cards from the expert deck up to the difficulty replacement percent + for(int i = 0; i < difficultyReplacementPercent; i++){ + if(!easyMain.contains(expertList.get(i))) { //ensure that the card being copied over isn't already in the deck + easyMain.remove(easyList.get(i)); + easyMain.add(expertList.get(i)); + } + else{ + expertList.remove(expertList.get(i)); + i--; + if(expertList.size() == 0) break; //break if there are no more cards to copy over + } + } + } + + /** + * Randomizes the list of Commander Duels. + */ + public void randomizeOpponents(){ + Collections.shuffle(commanderDuels); + } +} diff --git a/forge-gui/src/main/java/forge/quest/QuestSpellShop.java b/forge-gui/src/main/java/forge/quest/QuestSpellShop.java index e9196e417df..96eae768963 100644 --- a/forge-gui/src/main/java/forge/quest/QuestSpellShop.java +++ b/forge-gui/src/main/java/forge/quest/QuestSpellShop.java @@ -344,11 +344,24 @@ public class QuestSpellShop { List> cardsToRemove = new LinkedList<>(); for (Entry item : inventoryManager.getPool()) { PaperCard card = (PaperCard)item.getKey(); - int numToKeep = card.getRules().getType().isBasic() ? - FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_BASIC_LAND_SIZE) : FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_SIZE); + //Number of a particular card to keep + int numToKeep = 4; + + if(card.getRules().getType().isBasic()){ + numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_BASIC_LAND_SIZE); + } else{ + //Choose card limit restrictions based on deck construction rules, e.g.: Commander allows only singletons + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_SIZE); break; + case Commander: numToKeep = 1; + } + } + + //If this card has an exception to the card limit, e.g.: Relentless Rats, get the quest preference if (DeckFormat.getLimitExceptions().contains(card.getName())) { numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_ANY_NUMBER_SIZE); } + if (numToKeep < item.getValue()) { cardsToRemove.add(Pair.of(item.getKey(), item.getValue() - numToKeep)); } diff --git a/forge-gui/src/main/java/forge/quest/QuestUtil.java b/forge-gui/src/main/java/forge/quest/QuestUtil.java index c2fe796ef7b..7ad6b6cd335 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtil.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtil.java @@ -41,6 +41,7 @@ import forge.properties.ForgePreferences.FPref; import forge.quest.bazaar.IQuestBazaarItem; import forge.quest.bazaar.QuestItemType; import forge.quest.bazaar.QuestPetController; +import forge.quest.data.DeckConstructionRules; import forge.quest.data.QuestAchievements; import forge.quest.data.QuestAssets; import forge.util.gui.SGuiChoose; @@ -51,6 +52,7 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; +import java.util.TreeSet; /** *

@@ -531,7 +533,17 @@ public class QuestUtil { Integer lifeHuman = null; boolean useBazaar = true; Boolean forceAnte = null; - int lifeAI = 20; + + //Generate a life modifier based on this quest's variant as held in the Quest Controller's DeckConstructionRules + int variantLifeModifier = 0; + + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: variantLifeModifier = 20; break; + } + + int lifeAI = 20 + variantLifeModifier; + if (event instanceof QuestEventChallenge) { final QuestEventChallenge qc = ((QuestEventChallenge) event); lifeAI = qc.getAILife(); @@ -545,8 +557,9 @@ public class QuestUtil { forceAnte = qc.isForceAnte(); } - final RegisteredPlayer humanStart = new RegisteredPlayer(getDeckForNewGame()); - final RegisteredPlayer aiStart = new RegisteredPlayer(event.getEventDeck()); + final RegisteredPlayer humanStart = getRegisteredPlayerByVariant(getDeckForNewGame()); + + final RegisteredPlayer aiStart = getRegisteredPlayerByVariant(event.getEventDeck()); if (lifeHuman != null) { humanStart.setStartingLife(lifeHuman); @@ -581,17 +594,39 @@ public class QuestUtil { rules.setGamesPerMatch(qData.getMatchLength()); rules.setManaBurn(FModel.getPreferences().getPrefBoolean(FPref.UI_MANABURN)); rules.setCanCloneUseTargetsImage(FModel.getPreferences().getPrefBoolean(FPref.UI_CLONE_MODE_SOURCE)); + + TreeSet variant = new TreeSet(); + if(FModel.getQuest().getDeckConstructionRules() == DeckConstructionRules.Commander){ + variant.add(GameType.Commander); + } + final HostedMatch hostedMatch = GuiBase.getInterface().hostMatch(); final IGuiGame gui = GuiBase.getInterface().getNewGuiGame(); gui.setPlayerAvatar(aiPlayer, event); FThreads.invokeInEdtNowOrLater(new Runnable(){ @Override public void run() { - hostedMatch.startMatch(rules, null, starter, ImmutableMap.of(humanStart, gui)); + hostedMatch.startMatch(rules, variant, starter, ImmutableMap.of(humanStart, gui)); } }); } + /** + * Uses the appropriate RegisteredPlayer command for generating a RegisteredPlayer based on this quest's variant as + * held by the QuestController's DeckConstructionRules. + * @param deck The deck to generate the RegisteredPlayer with + * @return A newly made RegisteredPlayer specific to the quest's variant + */ + private static RegisteredPlayer getRegisteredPlayerByVariant(Deck deck){ + switch (FModel.getQuest().getDeckConstructionRules()) { + case Default: + return new RegisteredPlayer(deck); + case Commander: + return RegisteredPlayer.forCommander(deck); + } + return null; + } + private static Deck getDeckForNewGame() { Deck deck = null; if (event instanceof QuestEventChallenge) { @@ -623,7 +658,7 @@ public class QuestUtil { } if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) { - final String errorMessage = GameType.Quest.getDeckFormat().getDeckConformanceProblem(deck); + final String errorMessage = getDeckConformanceProblems(deck); if (null != errorMessage) { SOptionPane.showErrorDialog("Your deck " + errorMessage + " Please edit or choose a different deck.", "Invalid Deck"); return false; @@ -633,6 +668,21 @@ public class QuestUtil { return true; } + public static String getDeckConformanceProblems(Deck deck){ + String errorMessage = GameType.Quest.getDeckFormat().getDeckConformanceProblem(deck);; + + if(errorMessage != null) return errorMessage; //return immediately if the deck does not conform to quest requirements + + //Check for all applicable deck construction rules per this quests's saved DeckConstructionRules enum + switch(FModel.getQuest().getDeckConstructionRules()){ + case Commander: + errorMessage = GameType.Commander.getDeckFormat().getDeckConformanceProblem(deck); + break; + } + + return errorMessage; + } + /** Duplicate in DeckEditorQuestMenu and * probably elsewhere...can streamline at some point * (probably shouldn't be here). diff --git a/forge-gui/src/main/java/forge/quest/QuestUtilCards.java b/forge-gui/src/main/java/forge/quest/QuestUtilCards.java index c8d77d863ad..54a4887ba8a 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtilCards.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtilCards.java @@ -308,10 +308,16 @@ public final class QuestUtilCards { * user preferences */ public void setupNewGameCardPool(final GameFormat formatStartingPool, final int idxDifficulty, final StartingPoolPreferences userPrefs) { + //Add additional cards to the starter card pool based on variant if applicable + double variantModifier = 0; + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: variantModifier = 2; break; + } - final int nC = questPreferences.getPrefInt(DifficultyPrefs.STARTING_COMMONS, idxDifficulty); - final int nU = questPreferences.getPrefInt(DifficultyPrefs.STARTING_UNCOMMONS, idxDifficulty); - final int nR = questPreferences.getPrefInt(DifficultyPrefs.STARTING_RARES, idxDifficulty); + final int nC = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_COMMONS, idxDifficulty) * variantModifier); + final int nU = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_UNCOMMONS, idxDifficulty) * variantModifier); + final int nR = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_RARES, idxDifficulty) * variantModifier); addAllCards(BoosterUtils.getQuestStarterDeck(formatStartingPool, nC, nU, nR, userPrefs)); diff --git a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java index 2e93e7d4fec..265ea61bb58 100644 --- a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java +++ b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java @@ -226,6 +226,11 @@ public class QuestWinLoseController { sb.append(StringUtils.capitalize(qEvent.getDifficulty().getTitle())); sb.append(" opponent: ").append(credBase).append(" credits.\n"); + if(qEvent.getIsRandomMatch()){ + sb.append("Random Opponent Bonus: " + credBase + " credit" + (credBase > 1 ? "s." : ".") + "\n"); + credBase += credBase; + } + final int winMultiplier = Math.min(qData.getAchievements().getWin(), FModel.getQuestPreferences().getPrefInt(QPref.REWARDS_WINS_MULTIPLIER_MAX)); final int creditsForPreviousWins = (int) ((Double.parseDouble(FModel.getQuestPreferences() .getPref(QPref.REWARDS_WINS_MULTIPLIER)) * winMultiplier)); diff --git a/forge-gui/src/main/java/forge/quest/QuestWorld.java b/forge-gui/src/main/java/forge/quest/QuestWorld.java index e20dcf98ce8..4c77b0ec515 100644 --- a/forge-gui/src/main/java/forge/quest/QuestWorld.java +++ b/forge-gui/src/main/java/forge/quest/QuestWorld.java @@ -40,6 +40,7 @@ public class QuestWorld implements Comparable{ private final String dir; private final GameFormatQuest format; public static final String STANDARDWORLDNAME = "Random Standard"; + public static final String RANDOMCOMMANDERWORLDNAME = "Random Commander"; private boolean isCustom; @@ -129,7 +130,6 @@ public class QuestWorld implements Comparable{ /** * TODO: Write javadoc for Constructor. * @param file0 - * @param keySelector0 */ public Reader(String file0) { super(file0, QuestWorld.FN_GET_NAME); @@ -194,6 +194,12 @@ public class QuestWorld implements Comparable{ FModel.getFormats().getStandard().getBannedCardNames(),false); } + if (useName.equalsIgnoreCase(QuestWorld.RANDOMCOMMANDERWORLDNAME)){ + useFormat = new GameFormatQuest(QuestWorld.RANDOMCOMMANDERWORLDNAME, + FModel.getFormats().getFormat("Commander").getAllowedSetCodes(), + FModel.getFormats().getFormat("Commander").getBannedCardNames(),false); + } + // System.out.println("Creating quest world " + useName + " (index " + useIdx + ", dir: " + useDir); // if (useFormat != null) { System.out.println("SETS: " + sets + "\nBANNED: " + bannedCards); } diff --git a/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java b/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java new file mode 100644 index 00000000000..3744beea09d --- /dev/null +++ b/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java @@ -0,0 +1,17 @@ +package forge.quest.data; + +/** + * Used to clarify which subformat a quest is using e.g. Commander. + * Auth. Imakuni + */ +public enum DeckConstructionRules { + /** + * Typically has no effect on Quest gameplay. + */ + Default, + + /** + * Commander ruleset. 99 card deck, no copies other than basic lands, commander(s) in Command zone + */ + Commander +} 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 616c49d937b..8f7b644641b 100644 --- a/forge-gui/src/main/java/forge/quest/data/QuestAssets.java +++ b/forge-gui/src/main/java/forge/quest/data/QuestAssets.java @@ -200,7 +200,14 @@ public class QuestAssets { * @return the life */ public int getLife(final QuestMode mode) { - final int base = mode.equals(QuestMode.Fantasy) ? 15 : 20; + int base = mode.equals(QuestMode.Fantasy) ? 15 : 20; + + //Modify life for the quest's sub-format, e.g.: Commander adds 20 + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: base += 20; + } + return (base + this.getItemLevel(QuestItemType.ELIXIR_OF_LIFE)) - this.getItemLevel(QuestItemType.POUND_FLESH); } diff --git a/forge-gui/src/main/java/forge/quest/data/QuestData.java b/forge-gui/src/main/java/forge/quest/data/QuestData.java index e6a75adef7d..41574634113 100644 --- a/forge-gui/src/main/java/forge/quest/data/QuestData.java +++ b/forge-gui/src/main/java/forge/quest/data/QuestData.java @@ -42,7 +42,7 @@ import java.util.Map; */ public final class QuestData { /** Holds the latest version of the Quest Data. */ - public static final int CURRENT_VERSION_NUMBER = 12; + public static final int CURRENT_VERSION_NUMBER = 13; // This field places the version number into QD instance, // but only when the object is created through the constructor @@ -70,6 +70,11 @@ public final class QuestData { public String currentDeck = "DEFAULT"; + /** + * Holds the subformat for this quest. Defaults to DeckConstructionRules.Default. + */ + public DeckConstructionRules deckConstructionRules = DeckConstructionRules.Default; + public QuestData() { //needed for XML serialization } @@ -87,9 +92,11 @@ public final class QuestData { * allow set unlocking during quest * @param startingWorld * starting world + * @param dcr + * deck construction rules e.g. Commander */ public QuestData(String name0, int diff, QuestMode mode0, GameFormat userFormat, - boolean allowSetUnlocks, final String startingWorld) { + boolean allowSetUnlocks, final String startingWorld, DeckConstructionRules dcr) { this.name = name0; if (userFormat != null) { @@ -99,6 +106,7 @@ public final class QuestData { this.achievements = new QuestAchievements(diff); this.assets = new QuestAssets(format); this.worldId = startingWorld; + this.deckConstructionRules = dcr; } /** diff --git a/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java b/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java index de680502e37..cd232367df9 100644 --- a/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java +++ b/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java @@ -223,10 +223,16 @@ public class QuestDataIO { // Current Deck moved from preferences to quest data - it should not be global for all quests!!! QuestDataIO.setFinalField(QuestData.class, "currentDeck", newData, FModel.getQuestPreferences().getPref(QPref.CURRENT_DECK)); } - if (saveVersion < 13) { + if(saveVersion < 13){ + //Update for quest DeckConstructionRules + //Add a DeckConstructionRules set to Default. + QuestDataIO.setFinalField(QuestData.class, "deckConstructionRules", newData, DeckConstructionRules.Default); + } + if (saveVersion < 14) { // Migrate DraftTournaments to use new Tournament class } + final QuestAssets qS = newData.getAssets(); final QuestAchievements qA = newData.getAchievements(); From 08bc6604a9037b4893d4d3ce9eb299655fe16c56 Mon Sep 17 00:00:00 2001 From: imakunee Date: Sat, 3 Nov 2018 00:36:26 +0000 Subject: [PATCH 120/901] Revert "-CardPool" This reverts commit 37d9dc753f915853ecf1e17e1fea1b5feb7480bd --- .../src/main/java/forge/deck/CardPool.java | 14 -- .../src/main/java/forge/game/GameRules.java | 3 +- .../deckeditor/controllers/CEditorQuest.java | 145 +------------ .../screens/home/quest/CSubmenuQuestData.java | 10 +- .../screens/home/quest/VSubmenuQuestData.java | 28 +-- forge-gui/res/quest/world/worlds.txt | 1 - .../java/forge/quest/QuestController.java | 14 +- .../src/main/java/forge/quest/QuestEvent.java | 4 - .../forge/quest/QuestEventCommanderDuel.java | 19 -- .../quest/QuestEventCommanderDuelManager.java | 205 ------------------ .../main/java/forge/quest/QuestSpellShop.java | 17 +- .../src/main/java/forge/quest/QuestUtil.java | 60 +---- .../main/java/forge/quest/QuestUtilCards.java | 12 +- .../forge/quest/QuestWinLoseController.java | 5 - .../src/main/java/forge/quest/QuestWorld.java | 8 +- .../quest/data/DeckConstructionRules.java | 17 -- .../java/forge/quest/data/QuestAssets.java | 9 +- .../main/java/forge/quest/data/QuestData.java | 12 +- .../main/java/forge/quest/io/QuestDataIO.java | 8 +- 19 files changed, 33 insertions(+), 558 deletions(-) delete mode 100644 forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java delete mode 100644 forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java delete mode 100644 forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java diff --git a/forge-core/src/main/java/forge/deck/CardPool.java b/forge-core/src/main/java/forge/deck/CardPool.java index b484f31ab98..72ab8efb851 100644 --- a/forge-core/src/main/java/forge/deck/CardPool.java +++ b/forge-core/src/main/java/forge/deck/CardPool.java @@ -17,7 +17,6 @@ */ package forge.deck; -import com.google.common.base.Predicate; import com.google.common.collect.Lists; import forge.StaticData; import forge.card.CardDb; @@ -217,17 +216,4 @@ public class CardPool extends ItemPool { } return sb.toString(); } - - /** - * Applies a predicate to this CardPool's cards. - * @param predicate the Predicate to apply to this CardPool - * @return a new CardPool made from this CardPool with only the cards that agree with the provided Predicate - */ - public CardPool getFilteredPool(Predicate predicate){ - CardPool filteredPool = new CardPool(); - for(PaperCard pc : this.items.keySet()){ - if(predicate.apply(pc)) filteredPool.add(pc); - } - return filteredPool; - } } diff --git a/forge-game/src/main/java/forge/game/GameRules.java b/forge-game/src/main/java/forge/game/GameRules.java index 5e6876e9801..dc7ed4cddf1 100644 --- a/forge-game/src/main/java/forge/game/GameRules.java +++ b/forge-game/src/main/java/forge/game/GameRules.java @@ -78,8 +78,7 @@ public class GameRules { } public boolean hasCommander() { - return appliedVariants.contains(GameType.Commander) - || appliedVariants.contains(GameType.TinyLeaders) + return appliedVariants.contains(GameType.Commander) || appliedVariants.contains(GameType.TinyLeaders) || appliedVariants.contains(GameType.Brawl); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java index b7842272e42..c33da12cda7 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java @@ -18,20 +18,11 @@ package forge.screens.deckeditor.controllers; import com.google.common.base.Function; -import com.google.common.base.Predicate; -import com.google.common.base.Predicates; import com.google.common.base.Supplier; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; import forge.UiCommand; -import forge.card.CardRules; -import forge.card.CardRulesPredicates; -import forge.card.ColorSet; -import forge.card.mana.ManaCost; import forge.deck.CardPool; import forge.deck.Deck; import forge.deck.DeckSection; -import forge.deck.generation.DeckGeneratorBase; import forge.gui.GuiUtils; import forge.gui.framework.DragCell; import forge.gui.framework.FScreen; @@ -44,7 +35,6 @@ import forge.itemmanager.views.ItemTableColumn; import forge.model.FModel; import forge.properties.ForgePreferences.FPref; import forge.quest.QuestController; -import forge.quest.data.DeckConstructionRules; import forge.screens.deckeditor.AddBasicLandsDialog; import forge.screens.deckeditor.SEditorIO; import forge.screens.deckeditor.views.VAllDecks; @@ -58,7 +48,6 @@ import forge.util.ItemPool; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.awt.print.Paper; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -114,14 +103,6 @@ public final class CEditorQuest extends CDeckEditor { allSections.add(DeckSection.Main); allSections.add(DeckSection.Sideboard); - //Add sub-format specific sections - switch(FModel.getQuest().getDeckConstructionRules()){ - case Default: break; - case Commander: - allSections.add(DeckSection.Commander); - break; - } - this.questData = questData0; final CardManager catalogManager = new CardManager(cDetailPicture, false, true); @@ -177,10 +158,6 @@ public final class CEditorQuest extends CDeckEditor { @Override protected CardLimit getCardLimit() { if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) { - //If this is a commander quest, only allow single copies of cards - if(FModel.getQuest().getDeckConstructionRules() == DeckConstructionRules.Commander){ - return CardLimit.Singleton; - } return CardLimit.Default; } return CardLimit.None; //if not enforcing deck legality, don't enforce default limit @@ -268,98 +245,16 @@ public final class CEditorQuest extends CDeckEditor { public void resetTables() { this.sectionMode = DeckSection.Main; - // show cards, makes this user friendly - this.getCatalogManager().setPool(getRemainingCardPool()); - this.getDeckManager().setPool(getDeck().getMain()); - } + final Deck deck = this.controller.getModel(); - /*** - * Provides the pool of cards the player has available to add to his or her deck. Also manages showing available cards - * to choose from for special deck construction rules, e.g.: Commander. - * @return CardPool of cards available to add to the player's deck. - */ - private CardPool getRemainingCardPool(){ final CardPool cardpool = getInitialCatalog(); - // remove bottom cards that are in the deck from the card pool - cardpool.removeAll(getDeck().getMain()); - + cardpool.removeAll(deck.getMain()); // remove sideboard cards from the catalog - cardpool.removeAll(getDeck().getOrCreate(DeckSection.Sideboard)); - - switch(FModel.getQuest().getDeckConstructionRules()){ - case Default: break; - case Commander: - //remove this deck's currently selected commander(s) from the catalog - cardpool.removeAll(getDeck().getOrCreate(DeckSection.Commander)); - - //TODO: Only thin if deck conformance is being applied - if(getDeck().getOrCreate(DeckSection.Commander).toFlatList().size() > 0) { - Predicate identityPredicate = new MatchCommanderColorIdentity(getDeckColorIdentity()); - CardPool filteredPool = cardpool.getFilteredPool(identityPredicate); - - return filteredPool; - } - break; - } - - return cardpool; - } - - /** - * Predicate that filters out based on a color identity provided upon instantiation. Used to filter the card - * list when a commander is chosen so the user can more easily see what cards are available for his or her deck - * and avoid making additions that are not legal. - */ - public static class MatchCommanderColorIdentity implements Predicate { - private final ColorSet allowedColor; - - public MatchCommanderColorIdentity(ColorSet color) { - allowedColor = color; - } - - @Override - public boolean apply(PaperCard subject) { - CardRules cr = subject.getRules(); - ManaCost mc = cr.getManaCost(); - return !mc.isPureGeneric() && allowedColor.containsAllColorsFrom(cr.getColorIdentity().getColor()); - } - } - - /** - * Compiles the color identity of the loaded deck based on the commanders. - * @return A ColorSet containing the color identity of the currently loaded deck. - */ - public ColorSet getDeckColorIdentity(){ - - List commanders = getDeck().getOrCreate(DeckSection.Commander).toFlatList(); - List colors = new ArrayList<>(); - - //Return early if there are no current commanders - if(commanders.size() == 0) return ColorSet.fromNames(colors); - - //For each commander,add each color of its color identity if not already added - for(PaperCard pc : commanders){ - if(!colors.contains("w") && pc.getRules().getColorIdentity().hasWhite()) colors.add("w"); - if(!colors.contains("u") && pc.getRules().getColorIdentity().hasBlue()) colors.add("u"); - if(!colors.contains("b") && pc.getRules().getColorIdentity().hasBlack()) colors.add("b"); - if(!colors.contains("r") && pc.getRules().getColorIdentity().hasRed()) colors.add("r"); - if(!colors.contains("g") && pc.getRules().getColorIdentity().hasGreen()) colors.add("g"); - } - - return ColorSet.fromNames(colors); - } - - /* - Used to make the code more readable in game terms. - */ - private Deck getDeck(){ - return this.controller.getModel(); - } - - private ItemPool getCommanderCardPool(){ - Predicate commanderPredicate = Predicates.compose(CardRulesPredicates.Presets.CAN_BE_COMMANDER, PaperCard.FN_GET_RULES); - return getRemainingCardPool().getFilteredPool(commanderPredicate); + cardpool.removeAll(deck.getOrCreate(DeckSection.Sideboard)); + // show cards, makes this user friendly + this.getCatalogManager().setPool(cardpool); + this.getDeckManager().setPool(deck.getMain()); } @Override @@ -385,30 +280,14 @@ public final class CEditorQuest extends CDeckEditor { } /** - * Switch between the main deck and the sideboard/Command Zone editor. + * Switch between the main deck and the sideboard editor. */ public void setEditorMode(DeckSection sectionMode) { - //Fixes null pointer error on switching tabs while quest deck editor is open. TODO: Find source of bug possibly? - if(sectionMode == null) sectionMode = DeckSection.Main; - - //Based on which section the editor is in, display the remaining card pool (or applicable card pool if in - //Commander) and the current section's cards - switch(sectionMode){ - case Main : - this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); - this.getCatalogManager().setPool(getRemainingCardPool()); - this.getDeckManager().setPool(this.controller.getModel().getMain()); - break; - case Sideboard : - this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); - this.getCatalogManager().setPool(getRemainingCardPool()); - this.getDeckManager().setPool(getDeck().getOrCreate(DeckSection.Sideboard)); - break; - case Commander : - this.getCatalogManager().setup(ItemManagerConfig.COMMANDER_POOL); - this.getCatalogManager().setPool(getCommanderCardPool()); - this.getDeckManager().setPool(getDeck().getOrCreate(DeckSection.Commander)); - break; + if (sectionMode == DeckSection.Sideboard) { + this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Sideboard)); + } + else { + this.getDeckManager().setPool(this.controller.getModel().getMain()); } this.sectionMode = sectionMode; diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java index 8aa76293b55..131805b738b 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java @@ -10,7 +10,6 @@ import forge.model.FModel; import forge.properties.ForgeConstants; import forge.quest.*; import forge.quest.StartingPoolPreferences.PoolType; -import forge.quest.data.DeckConstructionRules; import forge.quest.data.GameFormatQuest; import forge.quest.data.QuestData; import forge.quest.data.QuestPreferences.QPref; @@ -341,16 +340,9 @@ public enum CSubmenuQuestData implements ICDoc { break; } - //Apply the appropriate deck construction rules for this quest - DeckConstructionRules dcr = DeckConstructionRules.Default; - - if(VSubmenuQuestData.SINGLETON_INSTANCE.isCommander()){ - dcr = DeckConstructionRules.Commander; - } - final QuestController qc = FModel.getQuest(); - qc.newGame(questName, difficulty, mode, fmtPrizes, view.isUnlockSetsAllowed(), dckStartPool, fmtStartPool, view.getStartingWorldName(), userPrefs, dcr); + qc.newGame(questName, difficulty, mode, fmtPrizes, view.isUnlockSetsAllowed(), dckStartPool, fmtStartPool, view.getStartingWorldName(), userPrefs); FModel.getQuest().save(); // Save in preferences. diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java index 70e284faf3d..9eee9e58ca3 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java @@ -62,7 +62,6 @@ public enum VSubmenuQuestData implements IVSubmenu { private final FRadioButton radHard = new FRadioButton("Hard"); private final FRadioButton radExpert = new FRadioButton("Expert"); private final FCheckBox boxFantasy = new FCheckBox("Fantasy Mode"); - private final FCheckBox boxCommander = new FCheckBox("Commander Subformat"); private final FLabel lblStartingWorld = new FLabel.Builder().text("Starting world:").build(); private final FComboBoxWrapper cbxStartingWorld = new FComboBoxWrapper<>(); @@ -275,25 +274,9 @@ public enum VSubmenuQuestData implements IVSubmenu { } }); - // Fantasy box selected by Default + // Fantasy box enabled by Default boxFantasy.setSelected(true); boxFantasy.setEnabled(true); - - // Commander box unselected by Default - boxCommander.setSelected(false); - boxCommander.setEnabled(true); - - boxCommander.addActionListener( - new ActionListener(){ - public void actionPerformed(ActionEvent e){ - if(!isCommander()) return; //do nothing if unselecting Commander Subformat - //Otherwise, set the starting world to Random Commander - cbxStartingWorld.setSelectedItem(FModel.getWorlds().get("Random Commander")); - } - } - - ); - boxCompleteSet.setEnabled(true); boxAllowDuplicates.setEnabled(true); @@ -303,7 +286,6 @@ public enum VSubmenuQuestData implements IVSubmenu { final JPanel pnlDifficultyMode = new JPanel(new MigLayout("insets 0, gap 1%, flowy")); pnlDifficultyMode.add(difficultyPanel, "gapright 4%"); pnlDifficultyMode.add(boxFantasy, "h 25px!, gapbottom 15, gapright 4%"); - pnlDifficultyMode.add(boxCommander, "h 25px!, gapbottom 15, gapright 4%"); pnlDifficultyMode.add(lblStartingWorld, "h 25px!, hidemode 3"); cbxStartingWorld.addTo(pnlDifficultyMode, "h 27px!, w 40%, pushx, gapbottom 7"); pnlDifficultyMode.setOpaque(false); @@ -505,14 +487,6 @@ public enum VSubmenuQuestData implements IVSubmenu { return boxFantasy.isSelected(); } - /** - * Auth. Imakuni - * @return True if the "Commander Subformat" check box is selected. - */ - public boolean isCommander() { - return boxCommander.isSelected(); - } - public boolean startWithCompleteSet() { return boxCompleteSet.isSelected(); } diff --git a/forge-gui/res/quest/world/worlds.txt b/forge-gui/res/quest/world/worlds.txt index 5d99427d535..b08931cde59 100644 --- a/forge-gui/res/quest/world/worlds.txt +++ b/forge-gui/res/quest/world/worlds.txt @@ -1,6 +1,5 @@ Name:Main world Name:Random Standard -Name:Random Commander Name:Amonkhet|Dir:Amonkhet|Sets:AKH, HOU Name:Jamuraa|Dir:jamuraa|Sets:5ED, ARN, MIR, VIS, WTH|Banned:Chaos Orb; Falling Star Name:Kamigawa|Dir:2004 Kamigawa|Sets:CHK, BOK, SOK diff --git a/forge-gui/src/main/java/forge/quest/QuestController.java b/forge-gui/src/main/java/forge/quest/QuestController.java index 5366f7200bc..0d306f4431a 100644 --- a/forge-gui/src/main/java/forge/quest/QuestController.java +++ b/forge-gui/src/main/java/forge/quest/QuestController.java @@ -276,10 +276,9 @@ public class QuestController { public void newGame(final String name, final int difficulty, final QuestMode mode, final GameFormat formatPrizes, final boolean allowSetUnlocks, final Deck startingCards, final GameFormat formatStartingPool, - final String startingWorld, final StartingPoolPreferences userPrefs, - DeckConstructionRules dcr) { + final String startingWorld, final StartingPoolPreferences userPrefs) { - this.load(new QuestData(name, difficulty, mode, formatPrizes, allowSetUnlocks, startingWorld, dcr)); // pass awards and unlocks here + this.load(new QuestData(name, difficulty, mode, formatPrizes, allowSetUnlocks, startingWorld)); // pass awards and unlocks here if (startingCards != null) { this.myCards.addDeck(startingCards); @@ -436,12 +435,6 @@ public class QuestController { QuestWorld world = getWorld(); String path = ForgeConstants.DEFAULT_CHALLENGES_DIR; - //Use a variant specialized duel manager if this is a variant quest - switch(FModel.getQuest().getDeckConstructionRules()){ - case Default: break; - case Commander: this.duelManager = new QuestEventCommanderDuelManager(); return; - } - if (world != null) { if (world.getName().equals(QuestWorld.STANDARDWORLDNAME)) { @@ -456,6 +449,7 @@ public class QuestController { } this.duelManager = new QuestEventDuelManager(new File(path)); + } public HashSet GetRating() { @@ -613,6 +607,4 @@ public class QuestController { public void setCurrentDeck(String s) { model.currentDeck = s; } - - public DeckConstructionRules getDeckConstructionRules(){return model.deckConstructionRules;} } diff --git a/forge-gui/src/main/java/forge/quest/QuestEvent.java b/forge-gui/src/main/java/forge/quest/QuestEvent.java index 2a9bf6c1b63..00a140c80e2 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEvent.java +++ b/forge-gui/src/main/java/forge/quest/QuestEvent.java @@ -48,7 +48,6 @@ public abstract class QuestEvent implements IQuestEvent { private String profile = "Default"; // Opponent name if different from the challenge name private String opponentName = null; - private boolean isRandomMatch = false; public static final Function FN_GET_NAME = new Function() { @@ -175,7 +174,4 @@ public abstract class QuestEvent implements IQuestEvent { this.showDifficulty = showDifficulty; } - public boolean getIsRandomMatch(){return isRandomMatch;} - - public void setIsRandomMatch(boolean b){isRandomMatch = b;} } diff --git a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java deleted file mode 100644 index 1d7924a04d7..00000000000 --- a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java +++ /dev/null @@ -1,19 +0,0 @@ -package forge.quest; - -import forge.deck.DeckProxy; - -/** - * A QuestEventDuel with a CommanderDeckGenerator used exclusively within QuestEventCommanderDuelManager for the - * creation of randomly generated Commander decks in a Commander variant quest. - * Auth. Imakuni & Forge - */ -public class QuestEventCommanderDuel extends QuestEventDuel{ - /** - * The CommanderDeckGenerator for this duel. - */ - private DeckProxy deckProxy; - - public DeckProxy getDeckProxy() {return deckProxy;} - - public void setDeckProxy(DeckProxy dp) {deckProxy = dp;} -} diff --git a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java deleted file mode 100644 index 384d9d11d77..00000000000 --- a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java +++ /dev/null @@ -1,205 +0,0 @@ -package forge.quest; - -import forge.deck.*; -import forge.item.PaperCard; -import forge.model.FModel; -import forge.quest.data.QuestPreferences; -import forge.util.CollectionSuppliers; -import forge.util.MyRandom; -import forge.util.maps.EnumMapOfLists; -import forge.util.maps.MapOfLists; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/** - * Manages the creation of random Commander duels for a Commander variant quest. Random generation is handled via - * the CommanderDeckGenerator class. - * Auth. Forge & Imakuni#8015 - */ -public class QuestEventCommanderDuelManager implements QuestEventDuelManagerInterface { - /** - * The list of all possible Commander variant duels. - */ - private ArrayList commanderDuels = new ArrayList<>(); - - /** - * Contains the expert deck lists for the commanders. - */ - private List expertCommanderDecks; - - /** - * Immediately calls assembleDuels() to setup the commanderDuels variable. - */ - public QuestEventCommanderDuelManager(){ - assembleDuels(); - } - - /** - * Assembles the list of all possible Commander duels via CommanderDeckGenerator. Should be done within constructor. - */ - private void assembleDuels(){ - //isCardGen = true seemed to make slightly more difficult decks based purely on experience with a very small sample size. - //Gotta work on this more, its making pretty average decks after further testing. - expertCommanderDecks = CommanderDeckGenerator.getCommanderDecks(DeckFormat.Commander, true, true); - - List generatedDuels = CommanderDeckGenerator.getCommanderDecks(DeckFormat.Commander, true, false); - - for(DeckProxy dp : generatedDuels){ - QuestEventCommanderDuel duel = new QuestEventCommanderDuel(); - - duel.setDescription("Randomly generated " + dp.getName() + " commander deck."); - duel.setName(dp.getName()); - duel.setTitle(dp.getName()); - duel.setOpponentName(dp.getName()); - duel.setDifficulty(QuestEventDifficulty.EASY); - duel.setDeckProxy(dp); - - //Setting a blank deck avoids a null pointer exception. The deck is generated in generateDuels() to avoid long load times. - duel.setEventDeck(new Deck()); - - commanderDuels.add(duel); - } - } - - /** - * Retrieve list of all possible Commander duels. - * @return ArrayList containing all possible Commander duels. - */ - public Iterable getAllDuels() { - return commanderDuels; - } - - /** - * Retrieve list of all possible Commander duels. - * @param difficulty Currently unused - * @return ArrayList containing all possible Commander duels. - */ - public Iterable getDuels(QuestEventDifficulty difficulty){ - return commanderDuels; - } - - /** - * Composes an ArrayList containing 4 QuestEventDuels composed with Commander variant decks. One duel will have its - * title replaced as Random. - * @return ArrayList of QuestEventDuels containing 4 duels. - */ - public List generateDuels(){ - final List duelOpponents = new ArrayList<>(); - - //While there are less than 4 duels chosen - while(duelOpponents.size() < 4){ - //Get a random duel from the possible duels list - QuestEventCommanderDuel duel = (QuestEventCommanderDuel)commanderDuels.get(((int) (commanderDuels.size() * MyRandom.getRandom().nextDouble()))); - - //If the chosen duels list already contains this duel, get a different duel to prevent duplicate duels - if(duelOpponents.contains(duel)) continue; - - //Add the randomly chosen duel to the duel list - duelOpponents.add(duel); - - //Here the actual deck for this commander is generated by calling .getDeck() on the saved DeckProxy - duel.setEventDeck(duel.getDeckProxy().getDeck()); - - //Modify deck for difficulty - modifyDuelForDifficulty(duel); - - - } - - //Modify the stats of the final duel to hide the opponent, creating a "random" duel. - //We make a copy of the final duel and overwrite it in the duelOpponents to avoid changing the variables in - //the original duel, which gets reused. - QuestEventCommanderDuel duel = (QuestEventCommanderDuel)duelOpponents.get(duelOpponents.size() - 1); - QuestEventCommanderDuel randomDuel = new QuestEventCommanderDuel(); - - randomDuel.setName(duel.getName()); - randomDuel.setOpponentName(duel.getName()); - randomDuel.setDeckProxy(duel.getDeckProxy()); - randomDuel.setTitle("Random Opponent"); - randomDuel.setShowDifficulty(false); - randomDuel.setDescription("Fight a random generated commander opponent."); - randomDuel.setIsRandomMatch(true); - randomDuel.setEventDeck(duel.getEventDeck()); - - //Replace the final duel with this newly modified "random" duel - duelOpponents.set(duelOpponents.size()-1, randomDuel); - - return duelOpponents; - } - - /** - * Retrieves the expert level deck generation of a deck with the same commander as the provided DeckProxy. - * @param dp The easy generation commander deck - * @return The same commander's expert generation DeckProxy - */ - private Deck getExpertGenDeck(DeckProxy dp){ - for(QuestEventDuel qed : commanderDuels){ - QuestEventCommanderDuel cmdQED = (QuestEventCommanderDuel)qed; - if(cmdQED.getDeckProxy().getName().equals(dp.getName())){ - return cmdQED.getDeckProxy().getDeck(); - } - } - return null; - } - - /** - * Modifies a given duel by replacing a percentage of the deck with random cards from the more difficult generated version - * of the same commander's deck. Medium replaces 30%, Hard replaces 60%, Expert replaces 100%. - * @param duel The QuestEventCommanderDuel to modify - */ - private void modifyDuelForDifficulty(QuestEventCommanderDuel duel){ - final QuestPreferences questPreferences = FModel.getQuestPreferences(); - final int index = FModel.getQuest().getAchievements().getDifficulty(); - final int numberOfWins = FModel.getQuest().getAchievements().getWin(); - Deck expertDeck = getExpertGenDeck(duel.getDeckProxy()); - - int difficultyReplacementPercent = 0; - - //Note: The code is ordered to make the least number of comparisons I could think of at the time for speed reasons. - //In reality, it shouldn't really make much difference, but why not? - if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_EXPERTAI, index)) { - //At expert, the deck is replaced with the entire expert deck, and we can return immediately - duel.setEventDeck(expertDeck); - duel.setDifficulty(QuestEventDifficulty.EXPERT); - return; - } - - if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_MEDIUMAI, index)) { - difficultyReplacementPercent += 30; - duel.setDifficulty(QuestEventDifficulty.MEDIUM); - } else return; //return early here since it would be an easy opponent with no changes - - if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_HARDAI, index)) { - difficultyReplacementPercent += 30; - duel.setDifficulty(QuestEventDifficulty.HARD); - } - - CardPool easyMain = duel.getEventDeck().getMain(); - CardPool expertMain = expertDeck.getMain(); - - List easyList = easyMain.toFlatList(); - List expertList = expertMain.toFlatList(); - - //Replace cards in the easy deck with cards from the expert deck up to the difficulty replacement percent - for(int i = 0; i < difficultyReplacementPercent; i++){ - if(!easyMain.contains(expertList.get(i))) { //ensure that the card being copied over isn't already in the deck - easyMain.remove(easyList.get(i)); - easyMain.add(expertList.get(i)); - } - else{ - expertList.remove(expertList.get(i)); - i--; - if(expertList.size() == 0) break; //break if there are no more cards to copy over - } - } - } - - /** - * Randomizes the list of Commander Duels. - */ - public void randomizeOpponents(){ - Collections.shuffle(commanderDuels); - } -} diff --git a/forge-gui/src/main/java/forge/quest/QuestSpellShop.java b/forge-gui/src/main/java/forge/quest/QuestSpellShop.java index 96eae768963..e9196e417df 100644 --- a/forge-gui/src/main/java/forge/quest/QuestSpellShop.java +++ b/forge-gui/src/main/java/forge/quest/QuestSpellShop.java @@ -344,24 +344,11 @@ public class QuestSpellShop { List> cardsToRemove = new LinkedList<>(); for (Entry item : inventoryManager.getPool()) { PaperCard card = (PaperCard)item.getKey(); - //Number of a particular card to keep - int numToKeep = 4; - - if(card.getRules().getType().isBasic()){ - numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_BASIC_LAND_SIZE); - } else{ - //Choose card limit restrictions based on deck construction rules, e.g.: Commander allows only singletons - switch(FModel.getQuest().getDeckConstructionRules()){ - case Default: numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_SIZE); break; - case Commander: numToKeep = 1; - } - } - - //If this card has an exception to the card limit, e.g.: Relentless Rats, get the quest preference + int numToKeep = card.getRules().getType().isBasic() ? + FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_BASIC_LAND_SIZE) : FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_SIZE); if (DeckFormat.getLimitExceptions().contains(card.getName())) { numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_ANY_NUMBER_SIZE); } - if (numToKeep < item.getValue()) { cardsToRemove.add(Pair.of(item.getKey(), item.getValue() - numToKeep)); } diff --git a/forge-gui/src/main/java/forge/quest/QuestUtil.java b/forge-gui/src/main/java/forge/quest/QuestUtil.java index 7ad6b6cd335..c2fe796ef7b 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtil.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtil.java @@ -41,7 +41,6 @@ import forge.properties.ForgePreferences.FPref; import forge.quest.bazaar.IQuestBazaarItem; import forge.quest.bazaar.QuestItemType; import forge.quest.bazaar.QuestPetController; -import forge.quest.data.DeckConstructionRules; import forge.quest.data.QuestAchievements; import forge.quest.data.QuestAssets; import forge.util.gui.SGuiChoose; @@ -52,7 +51,6 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; -import java.util.TreeSet; /** *

@@ -533,17 +531,7 @@ public class QuestUtil { Integer lifeHuman = null; boolean useBazaar = true; Boolean forceAnte = null; - - //Generate a life modifier based on this quest's variant as held in the Quest Controller's DeckConstructionRules - int variantLifeModifier = 0; - - switch(FModel.getQuest().getDeckConstructionRules()){ - case Default: break; - case Commander: variantLifeModifier = 20; break; - } - - int lifeAI = 20 + variantLifeModifier; - + int lifeAI = 20; if (event instanceof QuestEventChallenge) { final QuestEventChallenge qc = ((QuestEventChallenge) event); lifeAI = qc.getAILife(); @@ -557,9 +545,8 @@ public class QuestUtil { forceAnte = qc.isForceAnte(); } - final RegisteredPlayer humanStart = getRegisteredPlayerByVariant(getDeckForNewGame()); - - final RegisteredPlayer aiStart = getRegisteredPlayerByVariant(event.getEventDeck()); + final RegisteredPlayer humanStart = new RegisteredPlayer(getDeckForNewGame()); + final RegisteredPlayer aiStart = new RegisteredPlayer(event.getEventDeck()); if (lifeHuman != null) { humanStart.setStartingLife(lifeHuman); @@ -594,39 +581,17 @@ public class QuestUtil { rules.setGamesPerMatch(qData.getMatchLength()); rules.setManaBurn(FModel.getPreferences().getPrefBoolean(FPref.UI_MANABURN)); rules.setCanCloneUseTargetsImage(FModel.getPreferences().getPrefBoolean(FPref.UI_CLONE_MODE_SOURCE)); - - TreeSet variant = new TreeSet(); - if(FModel.getQuest().getDeckConstructionRules() == DeckConstructionRules.Commander){ - variant.add(GameType.Commander); - } - final HostedMatch hostedMatch = GuiBase.getInterface().hostMatch(); final IGuiGame gui = GuiBase.getInterface().getNewGuiGame(); gui.setPlayerAvatar(aiPlayer, event); FThreads.invokeInEdtNowOrLater(new Runnable(){ @Override public void run() { - hostedMatch.startMatch(rules, variant, starter, ImmutableMap.of(humanStart, gui)); + hostedMatch.startMatch(rules, null, starter, ImmutableMap.of(humanStart, gui)); } }); } - /** - * Uses the appropriate RegisteredPlayer command for generating a RegisteredPlayer based on this quest's variant as - * held by the QuestController's DeckConstructionRules. - * @param deck The deck to generate the RegisteredPlayer with - * @return A newly made RegisteredPlayer specific to the quest's variant - */ - private static RegisteredPlayer getRegisteredPlayerByVariant(Deck deck){ - switch (FModel.getQuest().getDeckConstructionRules()) { - case Default: - return new RegisteredPlayer(deck); - case Commander: - return RegisteredPlayer.forCommander(deck); - } - return null; - } - private static Deck getDeckForNewGame() { Deck deck = null; if (event instanceof QuestEventChallenge) { @@ -658,7 +623,7 @@ public class QuestUtil { } if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) { - final String errorMessage = getDeckConformanceProblems(deck); + final String errorMessage = GameType.Quest.getDeckFormat().getDeckConformanceProblem(deck); if (null != errorMessage) { SOptionPane.showErrorDialog("Your deck " + errorMessage + " Please edit or choose a different deck.", "Invalid Deck"); return false; @@ -668,21 +633,6 @@ public class QuestUtil { return true; } - public static String getDeckConformanceProblems(Deck deck){ - String errorMessage = GameType.Quest.getDeckFormat().getDeckConformanceProblem(deck);; - - if(errorMessage != null) return errorMessage; //return immediately if the deck does not conform to quest requirements - - //Check for all applicable deck construction rules per this quests's saved DeckConstructionRules enum - switch(FModel.getQuest().getDeckConstructionRules()){ - case Commander: - errorMessage = GameType.Commander.getDeckFormat().getDeckConformanceProblem(deck); - break; - } - - return errorMessage; - } - /** Duplicate in DeckEditorQuestMenu and * probably elsewhere...can streamline at some point * (probably shouldn't be here). diff --git a/forge-gui/src/main/java/forge/quest/QuestUtilCards.java b/forge-gui/src/main/java/forge/quest/QuestUtilCards.java index 54a4887ba8a..c8d77d863ad 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtilCards.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtilCards.java @@ -308,16 +308,10 @@ public final class QuestUtilCards { * user preferences */ public void setupNewGameCardPool(final GameFormat formatStartingPool, final int idxDifficulty, final StartingPoolPreferences userPrefs) { - //Add additional cards to the starter card pool based on variant if applicable - double variantModifier = 0; - switch(FModel.getQuest().getDeckConstructionRules()){ - case Default: break; - case Commander: variantModifier = 2; break; - } - final int nC = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_COMMONS, idxDifficulty) * variantModifier); - final int nU = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_UNCOMMONS, idxDifficulty) * variantModifier); - final int nR = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_RARES, idxDifficulty) * variantModifier); + final int nC = questPreferences.getPrefInt(DifficultyPrefs.STARTING_COMMONS, idxDifficulty); + final int nU = questPreferences.getPrefInt(DifficultyPrefs.STARTING_UNCOMMONS, idxDifficulty); + final int nR = questPreferences.getPrefInt(DifficultyPrefs.STARTING_RARES, idxDifficulty); addAllCards(BoosterUtils.getQuestStarterDeck(formatStartingPool, nC, nU, nR, userPrefs)); diff --git a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java index 265ea61bb58..2e93e7d4fec 100644 --- a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java +++ b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java @@ -226,11 +226,6 @@ public class QuestWinLoseController { sb.append(StringUtils.capitalize(qEvent.getDifficulty().getTitle())); sb.append(" opponent: ").append(credBase).append(" credits.\n"); - if(qEvent.getIsRandomMatch()){ - sb.append("Random Opponent Bonus: " + credBase + " credit" + (credBase > 1 ? "s." : ".") + "\n"); - credBase += credBase; - } - final int winMultiplier = Math.min(qData.getAchievements().getWin(), FModel.getQuestPreferences().getPrefInt(QPref.REWARDS_WINS_MULTIPLIER_MAX)); final int creditsForPreviousWins = (int) ((Double.parseDouble(FModel.getQuestPreferences() .getPref(QPref.REWARDS_WINS_MULTIPLIER)) * winMultiplier)); diff --git a/forge-gui/src/main/java/forge/quest/QuestWorld.java b/forge-gui/src/main/java/forge/quest/QuestWorld.java index 4c77b0ec515..e20dcf98ce8 100644 --- a/forge-gui/src/main/java/forge/quest/QuestWorld.java +++ b/forge-gui/src/main/java/forge/quest/QuestWorld.java @@ -40,7 +40,6 @@ public class QuestWorld implements Comparable{ private final String dir; private final GameFormatQuest format; public static final String STANDARDWORLDNAME = "Random Standard"; - public static final String RANDOMCOMMANDERWORLDNAME = "Random Commander"; private boolean isCustom; @@ -130,6 +129,7 @@ public class QuestWorld implements Comparable{ /** * TODO: Write javadoc for Constructor. * @param file0 + * @param keySelector0 */ public Reader(String file0) { super(file0, QuestWorld.FN_GET_NAME); @@ -194,12 +194,6 @@ public class QuestWorld implements Comparable{ FModel.getFormats().getStandard().getBannedCardNames(),false); } - if (useName.equalsIgnoreCase(QuestWorld.RANDOMCOMMANDERWORLDNAME)){ - useFormat = new GameFormatQuest(QuestWorld.RANDOMCOMMANDERWORLDNAME, - FModel.getFormats().getFormat("Commander").getAllowedSetCodes(), - FModel.getFormats().getFormat("Commander").getBannedCardNames(),false); - } - // System.out.println("Creating quest world " + useName + " (index " + useIdx + ", dir: " + useDir); // if (useFormat != null) { System.out.println("SETS: " + sets + "\nBANNED: " + bannedCards); } diff --git a/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java b/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java deleted file mode 100644 index 3744beea09d..00000000000 --- a/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java +++ /dev/null @@ -1,17 +0,0 @@ -package forge.quest.data; - -/** - * Used to clarify which subformat a quest is using e.g. Commander. - * Auth. Imakuni - */ -public enum DeckConstructionRules { - /** - * Typically has no effect on Quest gameplay. - */ - Default, - - /** - * Commander ruleset. 99 card deck, no copies other than basic lands, commander(s) in Command zone - */ - Commander -} 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..616c49d937b 100644 --- a/forge-gui/src/main/java/forge/quest/data/QuestAssets.java +++ b/forge-gui/src/main/java/forge/quest/data/QuestAssets.java @@ -200,14 +200,7 @@ public class QuestAssets { * @return the life */ public int getLife(final QuestMode mode) { - int base = mode.equals(QuestMode.Fantasy) ? 15 : 20; - - //Modify life for the quest's sub-format, e.g.: Commander adds 20 - switch(FModel.getQuest().getDeckConstructionRules()){ - case Default: break; - case Commander: base += 20; - } - + final int base = mode.equals(QuestMode.Fantasy) ? 15 : 20; return (base + this.getItemLevel(QuestItemType.ELIXIR_OF_LIFE)) - this.getItemLevel(QuestItemType.POUND_FLESH); } diff --git a/forge-gui/src/main/java/forge/quest/data/QuestData.java b/forge-gui/src/main/java/forge/quest/data/QuestData.java index 41574634113..e6a75adef7d 100644 --- a/forge-gui/src/main/java/forge/quest/data/QuestData.java +++ b/forge-gui/src/main/java/forge/quest/data/QuestData.java @@ -42,7 +42,7 @@ import java.util.Map; */ public final class QuestData { /** Holds the latest version of the Quest Data. */ - public static final int CURRENT_VERSION_NUMBER = 13; + public static final int CURRENT_VERSION_NUMBER = 12; // This field places the version number into QD instance, // but only when the object is created through the constructor @@ -70,11 +70,6 @@ public final class QuestData { public String currentDeck = "DEFAULT"; - /** - * Holds the subformat for this quest. Defaults to DeckConstructionRules.Default. - */ - public DeckConstructionRules deckConstructionRules = DeckConstructionRules.Default; - public QuestData() { //needed for XML serialization } @@ -92,11 +87,9 @@ public final class QuestData { * allow set unlocking during quest * @param startingWorld * starting world - * @param dcr - * deck construction rules e.g. Commander */ public QuestData(String name0, int diff, QuestMode mode0, GameFormat userFormat, - boolean allowSetUnlocks, final String startingWorld, DeckConstructionRules dcr) { + boolean allowSetUnlocks, final String startingWorld) { this.name = name0; if (userFormat != null) { @@ -106,7 +99,6 @@ public final class QuestData { this.achievements = new QuestAchievements(diff); this.assets = new QuestAssets(format); this.worldId = startingWorld; - this.deckConstructionRules = dcr; } /** diff --git a/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java b/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java index cd232367df9..de680502e37 100644 --- a/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java +++ b/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java @@ -223,16 +223,10 @@ public class QuestDataIO { // Current Deck moved from preferences to quest data - it should not be global for all quests!!! QuestDataIO.setFinalField(QuestData.class, "currentDeck", newData, FModel.getQuestPreferences().getPref(QPref.CURRENT_DECK)); } - if(saveVersion < 13){ - //Update for quest DeckConstructionRules - //Add a DeckConstructionRules set to Default. - QuestDataIO.setFinalField(QuestData.class, "deckConstructionRules", newData, DeckConstructionRules.Default); - } - if (saveVersion < 14) { + if (saveVersion < 13) { // Migrate DraftTournaments to use new Tournament class } - final QuestAssets qS = newData.getAssets(); final QuestAchievements qA = newData.getAchievements(); From 3dfcf64d30dcbb682bd09e6b7f292eca1ddd25d4 Mon Sep 17 00:00:00 2001 From: Jeremy Pelkala Date: Fri, 2 Nov 2018 18:57:17 -0400 Subject: [PATCH 121/901] Added Commander quest mode and world -CardPool Added getFilteredPool() to easily get a Predicate applied copy of a CardPool. -GameRules Minor formatting change. -worlds.txt Added Random Commander to the list. -DeckConstructionRules New enum for defining the subformat a quest is using. -QuestAssets getLife() now has a switch for modifying the life for sub-formats. -QuestData New data save version. Includes a DeckConstructionRules enum. -QuestDataIO updateSaveFile will update old saves to have a default DeckConstructionRules complying with the new QuestData save version. -QuestController Updated to include support for DeckConstructionRules and specialized duel managers -QuestEvent Now have boolean to define if this is a "random" match for the duel list. Currently only QuestEventCommanderDuelManager makes use of this feature for Commander quests. -QuestEventCommanderDuel New QuestEventDuel used in the QuestEventCommanderDuelManager which contains a DeckProxy for use in generating random commander decks. -QuestEventCommanderDuelManager New duel manager to generate duels by difficulty for a Commander quest. Currently uses random generation to generate the decks of each opponent. -QuestSpellShop Sell Extras button now has a switch for taking into account special deck construction rules such as Commander only allowing singletons. -QuestUtil Starting a game now checks for various sub-format specific changes including a switch case for which variety of registered player to use. -QuestUtilCards Starting cardpool size is now modified by a switch case for sub-formats such as Commander. -QuestWinLoseController QuestEvents marked as random matches will now award a "Random Opponent Bonus" equal to the credit base. Currently only QuestEventCommanderDuelManager creates QuestEvents marked as such. -QuestWorld Added support for the Commander quest format and world. -CEditorQuest Many changes to add support for Commander in a style that, hopefully, also paths the way for future format support. -CSubmenuQuestData Support for Commander quests. -VSubmenuQuestData Support for Commander quests. --- .../src/main/java/forge/deck/CardPool.java | 14 ++ .../src/main/java/forge/game/GameRules.java | 3 +- .../deckeditor/controllers/CEditorQuest.java | 151 +++++++++++-- .../screens/home/quest/CSubmenuQuestData.java | 10 +- .../screens/home/quest/VSubmenuQuestData.java | 28 ++- forge-gui/res/quest/world/worlds.txt | 1 + .../java/forge/quest/QuestController.java | 14 +- .../src/main/java/forge/quest/QuestEvent.java | 4 + .../forge/quest/QuestEventCommanderDuel.java | 19 ++ .../quest/QuestEventCommanderDuelManager.java | 205 ++++++++++++++++++ .../main/java/forge/quest/QuestSpellShop.java | 17 +- .../src/main/java/forge/quest/QuestUtil.java | 60 ++++- .../main/java/forge/quest/QuestUtilCards.java | 12 +- .../forge/quest/QuestWinLoseController.java | 5 + .../src/main/java/forge/quest/QuestWorld.java | 8 +- .../quest/data/DeckConstructionRules.java | 17 ++ .../java/forge/quest/data/QuestAssets.java | 9 +- .../main/java/forge/quest/data/QuestData.java | 12 +- .../main/java/forge/quest/io/QuestDataIO.java | 8 +- 19 files changed, 561 insertions(+), 36 deletions(-) create mode 100644 forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java create mode 100644 forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java create mode 100644 forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java diff --git a/forge-core/src/main/java/forge/deck/CardPool.java b/forge-core/src/main/java/forge/deck/CardPool.java index 72ab8efb851..b484f31ab98 100644 --- a/forge-core/src/main/java/forge/deck/CardPool.java +++ b/forge-core/src/main/java/forge/deck/CardPool.java @@ -17,6 +17,7 @@ */ package forge.deck; +import com.google.common.base.Predicate; import com.google.common.collect.Lists; import forge.StaticData; import forge.card.CardDb; @@ -216,4 +217,17 @@ public class CardPool extends ItemPool { } return sb.toString(); } + + /** + * Applies a predicate to this CardPool's cards. + * @param predicate the Predicate to apply to this CardPool + * @return a new CardPool made from this CardPool with only the cards that agree with the provided Predicate + */ + public CardPool getFilteredPool(Predicate predicate){ + CardPool filteredPool = new CardPool(); + for(PaperCard pc : this.items.keySet()){ + if(predicate.apply(pc)) filteredPool.add(pc); + } + return filteredPool; + } } diff --git a/forge-game/src/main/java/forge/game/GameRules.java b/forge-game/src/main/java/forge/game/GameRules.java index dc7ed4cddf1..5e6876e9801 100644 --- a/forge-game/src/main/java/forge/game/GameRules.java +++ b/forge-game/src/main/java/forge/game/GameRules.java @@ -78,7 +78,8 @@ public class GameRules { } public boolean hasCommander() { - return appliedVariants.contains(GameType.Commander) || appliedVariants.contains(GameType.TinyLeaders) + return appliedVariants.contains(GameType.Commander) + || appliedVariants.contains(GameType.TinyLeaders) || appliedVariants.contains(GameType.Brawl); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java index c33da12cda7..b7842272e42 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java @@ -18,11 +18,20 @@ package forge.screens.deckeditor.controllers; import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; import com.google.common.base.Supplier; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; import forge.UiCommand; +import forge.card.CardRules; +import forge.card.CardRulesPredicates; +import forge.card.ColorSet; +import forge.card.mana.ManaCost; import forge.deck.CardPool; import forge.deck.Deck; import forge.deck.DeckSection; +import forge.deck.generation.DeckGeneratorBase; import forge.gui.GuiUtils; import forge.gui.framework.DragCell; import forge.gui.framework.FScreen; @@ -35,6 +44,7 @@ import forge.itemmanager.views.ItemTableColumn; import forge.model.FModel; import forge.properties.ForgePreferences.FPref; import forge.quest.QuestController; +import forge.quest.data.DeckConstructionRules; import forge.screens.deckeditor.AddBasicLandsDialog; import forge.screens.deckeditor.SEditorIO; import forge.screens.deckeditor.views.VAllDecks; @@ -48,6 +58,7 @@ import forge.util.ItemPool; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.print.Paper; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -103,6 +114,14 @@ public final class CEditorQuest extends CDeckEditor { allSections.add(DeckSection.Main); allSections.add(DeckSection.Sideboard); + //Add sub-format specific sections + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: + allSections.add(DeckSection.Commander); + break; + } + this.questData = questData0; final CardManager catalogManager = new CardManager(cDetailPicture, false, true); @@ -158,6 +177,10 @@ public final class CEditorQuest extends CDeckEditor { @Override protected CardLimit getCardLimit() { if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) { + //If this is a commander quest, only allow single copies of cards + if(FModel.getQuest().getDeckConstructionRules() == DeckConstructionRules.Commander){ + return CardLimit.Singleton; + } return CardLimit.Default; } return CardLimit.None; //if not enforcing deck legality, don't enforce default limit @@ -245,16 +268,98 @@ public final class CEditorQuest extends CDeckEditor { public void resetTables() { this.sectionMode = DeckSection.Main; - final Deck deck = this.controller.getModel(); - - final CardPool cardpool = getInitialCatalog(); - // remove bottom cards that are in the deck from the card pool - cardpool.removeAll(deck.getMain()); - // remove sideboard cards from the catalog - cardpool.removeAll(deck.getOrCreate(DeckSection.Sideboard)); // show cards, makes this user friendly - this.getCatalogManager().setPool(cardpool); - this.getDeckManager().setPool(deck.getMain()); + this.getCatalogManager().setPool(getRemainingCardPool()); + this.getDeckManager().setPool(getDeck().getMain()); + } + + /*** + * Provides the pool of cards the player has available to add to his or her deck. Also manages showing available cards + * to choose from for special deck construction rules, e.g.: Commander. + * @return CardPool of cards available to add to the player's deck. + */ + private CardPool getRemainingCardPool(){ + final CardPool cardpool = getInitialCatalog(); + + // remove bottom cards that are in the deck from the card pool + cardpool.removeAll(getDeck().getMain()); + + // remove sideboard cards from the catalog + cardpool.removeAll(getDeck().getOrCreate(DeckSection.Sideboard)); + + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: + //remove this deck's currently selected commander(s) from the catalog + cardpool.removeAll(getDeck().getOrCreate(DeckSection.Commander)); + + //TODO: Only thin if deck conformance is being applied + if(getDeck().getOrCreate(DeckSection.Commander).toFlatList().size() > 0) { + Predicate identityPredicate = new MatchCommanderColorIdentity(getDeckColorIdentity()); + CardPool filteredPool = cardpool.getFilteredPool(identityPredicate); + + return filteredPool; + } + break; + } + + return cardpool; + } + + /** + * Predicate that filters out based on a color identity provided upon instantiation. Used to filter the card + * list when a commander is chosen so the user can more easily see what cards are available for his or her deck + * and avoid making additions that are not legal. + */ + public static class MatchCommanderColorIdentity implements Predicate { + private final ColorSet allowedColor; + + public MatchCommanderColorIdentity(ColorSet color) { + allowedColor = color; + } + + @Override + public boolean apply(PaperCard subject) { + CardRules cr = subject.getRules(); + ManaCost mc = cr.getManaCost(); + return !mc.isPureGeneric() && allowedColor.containsAllColorsFrom(cr.getColorIdentity().getColor()); + } + } + + /** + * Compiles the color identity of the loaded deck based on the commanders. + * @return A ColorSet containing the color identity of the currently loaded deck. + */ + public ColorSet getDeckColorIdentity(){ + + List commanders = getDeck().getOrCreate(DeckSection.Commander).toFlatList(); + List colors = new ArrayList<>(); + + //Return early if there are no current commanders + if(commanders.size() == 0) return ColorSet.fromNames(colors); + + //For each commander,add each color of its color identity if not already added + for(PaperCard pc : commanders){ + if(!colors.contains("w") && pc.getRules().getColorIdentity().hasWhite()) colors.add("w"); + if(!colors.contains("u") && pc.getRules().getColorIdentity().hasBlue()) colors.add("u"); + if(!colors.contains("b") && pc.getRules().getColorIdentity().hasBlack()) colors.add("b"); + if(!colors.contains("r") && pc.getRules().getColorIdentity().hasRed()) colors.add("r"); + if(!colors.contains("g") && pc.getRules().getColorIdentity().hasGreen()) colors.add("g"); + } + + return ColorSet.fromNames(colors); + } + + /* + Used to make the code more readable in game terms. + */ + private Deck getDeck(){ + return this.controller.getModel(); + } + + private ItemPool getCommanderCardPool(){ + Predicate commanderPredicate = Predicates.compose(CardRulesPredicates.Presets.CAN_BE_COMMANDER, PaperCard.FN_GET_RULES); + return getRemainingCardPool().getFilteredPool(commanderPredicate); } @Override @@ -280,14 +385,30 @@ public final class CEditorQuest extends CDeckEditor { } /** - * Switch between the main deck and the sideboard editor. + * Switch between the main deck and the sideboard/Command Zone editor. */ public void setEditorMode(DeckSection sectionMode) { - if (sectionMode == DeckSection.Sideboard) { - this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Sideboard)); - } - else { - this.getDeckManager().setPool(this.controller.getModel().getMain()); + //Fixes null pointer error on switching tabs while quest deck editor is open. TODO: Find source of bug possibly? + if(sectionMode == null) sectionMode = DeckSection.Main; + + //Based on which section the editor is in, display the remaining card pool (or applicable card pool if in + //Commander) and the current section's cards + switch(sectionMode){ + case Main : + this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); + this.getCatalogManager().setPool(getRemainingCardPool()); + this.getDeckManager().setPool(this.controller.getModel().getMain()); + break; + case Sideboard : + this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); + this.getCatalogManager().setPool(getRemainingCardPool()); + this.getDeckManager().setPool(getDeck().getOrCreate(DeckSection.Sideboard)); + break; + case Commander : + this.getCatalogManager().setup(ItemManagerConfig.COMMANDER_POOL); + this.getCatalogManager().setPool(getCommanderCardPool()); + this.getDeckManager().setPool(getDeck().getOrCreate(DeckSection.Commander)); + break; } this.sectionMode = sectionMode; diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java index 131805b738b..8aa76293b55 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java @@ -10,6 +10,7 @@ import forge.model.FModel; import forge.properties.ForgeConstants; import forge.quest.*; import forge.quest.StartingPoolPreferences.PoolType; +import forge.quest.data.DeckConstructionRules; import forge.quest.data.GameFormatQuest; import forge.quest.data.QuestData; import forge.quest.data.QuestPreferences.QPref; @@ -340,9 +341,16 @@ public enum CSubmenuQuestData implements ICDoc { break; } + //Apply the appropriate deck construction rules for this quest + DeckConstructionRules dcr = DeckConstructionRules.Default; + + if(VSubmenuQuestData.SINGLETON_INSTANCE.isCommander()){ + dcr = DeckConstructionRules.Commander; + } + final QuestController qc = FModel.getQuest(); - qc.newGame(questName, difficulty, mode, fmtPrizes, view.isUnlockSetsAllowed(), dckStartPool, fmtStartPool, view.getStartingWorldName(), userPrefs); + qc.newGame(questName, difficulty, mode, fmtPrizes, view.isUnlockSetsAllowed(), dckStartPool, fmtStartPool, view.getStartingWorldName(), userPrefs, dcr); FModel.getQuest().save(); // Save in preferences. diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java index 9eee9e58ca3..70e284faf3d 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java @@ -62,6 +62,7 @@ public enum VSubmenuQuestData implements IVSubmenu { private final FRadioButton radHard = new FRadioButton("Hard"); private final FRadioButton radExpert = new FRadioButton("Expert"); private final FCheckBox boxFantasy = new FCheckBox("Fantasy Mode"); + private final FCheckBox boxCommander = new FCheckBox("Commander Subformat"); private final FLabel lblStartingWorld = new FLabel.Builder().text("Starting world:").build(); private final FComboBoxWrapper cbxStartingWorld = new FComboBoxWrapper<>(); @@ -274,9 +275,25 @@ public enum VSubmenuQuestData implements IVSubmenu { } }); - // Fantasy box enabled by Default + // Fantasy box selected by Default boxFantasy.setSelected(true); boxFantasy.setEnabled(true); + + // Commander box unselected by Default + boxCommander.setSelected(false); + boxCommander.setEnabled(true); + + boxCommander.addActionListener( + new ActionListener(){ + public void actionPerformed(ActionEvent e){ + if(!isCommander()) return; //do nothing if unselecting Commander Subformat + //Otherwise, set the starting world to Random Commander + cbxStartingWorld.setSelectedItem(FModel.getWorlds().get("Random Commander")); + } + } + + ); + boxCompleteSet.setEnabled(true); boxAllowDuplicates.setEnabled(true); @@ -286,6 +303,7 @@ public enum VSubmenuQuestData implements IVSubmenu { final JPanel pnlDifficultyMode = new JPanel(new MigLayout("insets 0, gap 1%, flowy")); pnlDifficultyMode.add(difficultyPanel, "gapright 4%"); pnlDifficultyMode.add(boxFantasy, "h 25px!, gapbottom 15, gapright 4%"); + pnlDifficultyMode.add(boxCommander, "h 25px!, gapbottom 15, gapright 4%"); pnlDifficultyMode.add(lblStartingWorld, "h 25px!, hidemode 3"); cbxStartingWorld.addTo(pnlDifficultyMode, "h 27px!, w 40%, pushx, gapbottom 7"); pnlDifficultyMode.setOpaque(false); @@ -487,6 +505,14 @@ public enum VSubmenuQuestData implements IVSubmenu { return boxFantasy.isSelected(); } + /** + * Auth. Imakuni + * @return True if the "Commander Subformat" check box is selected. + */ + public boolean isCommander() { + return boxCommander.isSelected(); + } + public boolean startWithCompleteSet() { return boxCompleteSet.isSelected(); } diff --git a/forge-gui/res/quest/world/worlds.txt b/forge-gui/res/quest/world/worlds.txt index b08931cde59..5d99427d535 100644 --- a/forge-gui/res/quest/world/worlds.txt +++ b/forge-gui/res/quest/world/worlds.txt @@ -1,5 +1,6 @@ Name:Main world Name:Random Standard +Name:Random Commander Name:Amonkhet|Dir:Amonkhet|Sets:AKH, HOU Name:Jamuraa|Dir:jamuraa|Sets:5ED, ARN, MIR, VIS, WTH|Banned:Chaos Orb; Falling Star Name:Kamigawa|Dir:2004 Kamigawa|Sets:CHK, BOK, SOK diff --git a/forge-gui/src/main/java/forge/quest/QuestController.java b/forge-gui/src/main/java/forge/quest/QuestController.java index 0d306f4431a..5366f7200bc 100644 --- a/forge-gui/src/main/java/forge/quest/QuestController.java +++ b/forge-gui/src/main/java/forge/quest/QuestController.java @@ -276,9 +276,10 @@ public class QuestController { public void newGame(final String name, final int difficulty, final QuestMode mode, final GameFormat formatPrizes, final boolean allowSetUnlocks, final Deck startingCards, final GameFormat formatStartingPool, - final String startingWorld, final StartingPoolPreferences userPrefs) { + final String startingWorld, final StartingPoolPreferences userPrefs, + DeckConstructionRules dcr) { - this.load(new QuestData(name, difficulty, mode, formatPrizes, allowSetUnlocks, startingWorld)); // pass awards and unlocks here + this.load(new QuestData(name, difficulty, mode, formatPrizes, allowSetUnlocks, startingWorld, dcr)); // pass awards and unlocks here if (startingCards != null) { this.myCards.addDeck(startingCards); @@ -435,6 +436,12 @@ public class QuestController { QuestWorld world = getWorld(); String path = ForgeConstants.DEFAULT_CHALLENGES_DIR; + //Use a variant specialized duel manager if this is a variant quest + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: this.duelManager = new QuestEventCommanderDuelManager(); return; + } + if (world != null) { if (world.getName().equals(QuestWorld.STANDARDWORLDNAME)) { @@ -449,7 +456,6 @@ public class QuestController { } this.duelManager = new QuestEventDuelManager(new File(path)); - } public HashSet GetRating() { @@ -607,4 +613,6 @@ public class QuestController { public void setCurrentDeck(String s) { model.currentDeck = s; } + + public DeckConstructionRules getDeckConstructionRules(){return model.deckConstructionRules;} } diff --git a/forge-gui/src/main/java/forge/quest/QuestEvent.java b/forge-gui/src/main/java/forge/quest/QuestEvent.java index 00a140c80e2..2a9bf6c1b63 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEvent.java +++ b/forge-gui/src/main/java/forge/quest/QuestEvent.java @@ -48,6 +48,7 @@ public abstract class QuestEvent implements IQuestEvent { private String profile = "Default"; // Opponent name if different from the challenge name private String opponentName = null; + private boolean isRandomMatch = false; public static final Function FN_GET_NAME = new Function() { @@ -174,4 +175,7 @@ public abstract class QuestEvent implements IQuestEvent { this.showDifficulty = showDifficulty; } + public boolean getIsRandomMatch(){return isRandomMatch;} + + public void setIsRandomMatch(boolean b){isRandomMatch = b;} } diff --git a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java new file mode 100644 index 00000000000..1d7924a04d7 --- /dev/null +++ b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java @@ -0,0 +1,19 @@ +package forge.quest; + +import forge.deck.DeckProxy; + +/** + * A QuestEventDuel with a CommanderDeckGenerator used exclusively within QuestEventCommanderDuelManager for the + * creation of randomly generated Commander decks in a Commander variant quest. + * Auth. Imakuni & Forge + */ +public class QuestEventCommanderDuel extends QuestEventDuel{ + /** + * The CommanderDeckGenerator for this duel. + */ + private DeckProxy deckProxy; + + public DeckProxy getDeckProxy() {return deckProxy;} + + public void setDeckProxy(DeckProxy dp) {deckProxy = dp;} +} diff --git a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java new file mode 100644 index 00000000000..384d9d11d77 --- /dev/null +++ b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java @@ -0,0 +1,205 @@ +package forge.quest; + +import forge.deck.*; +import forge.item.PaperCard; +import forge.model.FModel; +import forge.quest.data.QuestPreferences; +import forge.util.CollectionSuppliers; +import forge.util.MyRandom; +import forge.util.maps.EnumMapOfLists; +import forge.util.maps.MapOfLists; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Manages the creation of random Commander duels for a Commander variant quest. Random generation is handled via + * the CommanderDeckGenerator class. + * Auth. Forge & Imakuni#8015 + */ +public class QuestEventCommanderDuelManager implements QuestEventDuelManagerInterface { + /** + * The list of all possible Commander variant duels. + */ + private ArrayList commanderDuels = new ArrayList<>(); + + /** + * Contains the expert deck lists for the commanders. + */ + private List expertCommanderDecks; + + /** + * Immediately calls assembleDuels() to setup the commanderDuels variable. + */ + public QuestEventCommanderDuelManager(){ + assembleDuels(); + } + + /** + * Assembles the list of all possible Commander duels via CommanderDeckGenerator. Should be done within constructor. + */ + private void assembleDuels(){ + //isCardGen = true seemed to make slightly more difficult decks based purely on experience with a very small sample size. + //Gotta work on this more, its making pretty average decks after further testing. + expertCommanderDecks = CommanderDeckGenerator.getCommanderDecks(DeckFormat.Commander, true, true); + + List generatedDuels = CommanderDeckGenerator.getCommanderDecks(DeckFormat.Commander, true, false); + + for(DeckProxy dp : generatedDuels){ + QuestEventCommanderDuel duel = new QuestEventCommanderDuel(); + + duel.setDescription("Randomly generated " + dp.getName() + " commander deck."); + duel.setName(dp.getName()); + duel.setTitle(dp.getName()); + duel.setOpponentName(dp.getName()); + duel.setDifficulty(QuestEventDifficulty.EASY); + duel.setDeckProxy(dp); + + //Setting a blank deck avoids a null pointer exception. The deck is generated in generateDuels() to avoid long load times. + duel.setEventDeck(new Deck()); + + commanderDuels.add(duel); + } + } + + /** + * Retrieve list of all possible Commander duels. + * @return ArrayList containing all possible Commander duels. + */ + public Iterable getAllDuels() { + return commanderDuels; + } + + /** + * Retrieve list of all possible Commander duels. + * @param difficulty Currently unused + * @return ArrayList containing all possible Commander duels. + */ + public Iterable getDuels(QuestEventDifficulty difficulty){ + return commanderDuels; + } + + /** + * Composes an ArrayList containing 4 QuestEventDuels composed with Commander variant decks. One duel will have its + * title replaced as Random. + * @return ArrayList of QuestEventDuels containing 4 duels. + */ + public List generateDuels(){ + final List duelOpponents = new ArrayList<>(); + + //While there are less than 4 duels chosen + while(duelOpponents.size() < 4){ + //Get a random duel from the possible duels list + QuestEventCommanderDuel duel = (QuestEventCommanderDuel)commanderDuels.get(((int) (commanderDuels.size() * MyRandom.getRandom().nextDouble()))); + + //If the chosen duels list already contains this duel, get a different duel to prevent duplicate duels + if(duelOpponents.contains(duel)) continue; + + //Add the randomly chosen duel to the duel list + duelOpponents.add(duel); + + //Here the actual deck for this commander is generated by calling .getDeck() on the saved DeckProxy + duel.setEventDeck(duel.getDeckProxy().getDeck()); + + //Modify deck for difficulty + modifyDuelForDifficulty(duel); + + + } + + //Modify the stats of the final duel to hide the opponent, creating a "random" duel. + //We make a copy of the final duel and overwrite it in the duelOpponents to avoid changing the variables in + //the original duel, which gets reused. + QuestEventCommanderDuel duel = (QuestEventCommanderDuel)duelOpponents.get(duelOpponents.size() - 1); + QuestEventCommanderDuel randomDuel = new QuestEventCommanderDuel(); + + randomDuel.setName(duel.getName()); + randomDuel.setOpponentName(duel.getName()); + randomDuel.setDeckProxy(duel.getDeckProxy()); + randomDuel.setTitle("Random Opponent"); + randomDuel.setShowDifficulty(false); + randomDuel.setDescription("Fight a random generated commander opponent."); + randomDuel.setIsRandomMatch(true); + randomDuel.setEventDeck(duel.getEventDeck()); + + //Replace the final duel with this newly modified "random" duel + duelOpponents.set(duelOpponents.size()-1, randomDuel); + + return duelOpponents; + } + + /** + * Retrieves the expert level deck generation of a deck with the same commander as the provided DeckProxy. + * @param dp The easy generation commander deck + * @return The same commander's expert generation DeckProxy + */ + private Deck getExpertGenDeck(DeckProxy dp){ + for(QuestEventDuel qed : commanderDuels){ + QuestEventCommanderDuel cmdQED = (QuestEventCommanderDuel)qed; + if(cmdQED.getDeckProxy().getName().equals(dp.getName())){ + return cmdQED.getDeckProxy().getDeck(); + } + } + return null; + } + + /** + * Modifies a given duel by replacing a percentage of the deck with random cards from the more difficult generated version + * of the same commander's deck. Medium replaces 30%, Hard replaces 60%, Expert replaces 100%. + * @param duel The QuestEventCommanderDuel to modify + */ + private void modifyDuelForDifficulty(QuestEventCommanderDuel duel){ + final QuestPreferences questPreferences = FModel.getQuestPreferences(); + final int index = FModel.getQuest().getAchievements().getDifficulty(); + final int numberOfWins = FModel.getQuest().getAchievements().getWin(); + Deck expertDeck = getExpertGenDeck(duel.getDeckProxy()); + + int difficultyReplacementPercent = 0; + + //Note: The code is ordered to make the least number of comparisons I could think of at the time for speed reasons. + //In reality, it shouldn't really make much difference, but why not? + if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_EXPERTAI, index)) { + //At expert, the deck is replaced with the entire expert deck, and we can return immediately + duel.setEventDeck(expertDeck); + duel.setDifficulty(QuestEventDifficulty.EXPERT); + return; + } + + if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_MEDIUMAI, index)) { + difficultyReplacementPercent += 30; + duel.setDifficulty(QuestEventDifficulty.MEDIUM); + } else return; //return early here since it would be an easy opponent with no changes + + if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_HARDAI, index)) { + difficultyReplacementPercent += 30; + duel.setDifficulty(QuestEventDifficulty.HARD); + } + + CardPool easyMain = duel.getEventDeck().getMain(); + CardPool expertMain = expertDeck.getMain(); + + List easyList = easyMain.toFlatList(); + List expertList = expertMain.toFlatList(); + + //Replace cards in the easy deck with cards from the expert deck up to the difficulty replacement percent + for(int i = 0; i < difficultyReplacementPercent; i++){ + if(!easyMain.contains(expertList.get(i))) { //ensure that the card being copied over isn't already in the deck + easyMain.remove(easyList.get(i)); + easyMain.add(expertList.get(i)); + } + else{ + expertList.remove(expertList.get(i)); + i--; + if(expertList.size() == 0) break; //break if there are no more cards to copy over + } + } + } + + /** + * Randomizes the list of Commander Duels. + */ + public void randomizeOpponents(){ + Collections.shuffle(commanderDuels); + } +} diff --git a/forge-gui/src/main/java/forge/quest/QuestSpellShop.java b/forge-gui/src/main/java/forge/quest/QuestSpellShop.java index e9196e417df..96eae768963 100644 --- a/forge-gui/src/main/java/forge/quest/QuestSpellShop.java +++ b/forge-gui/src/main/java/forge/quest/QuestSpellShop.java @@ -344,11 +344,24 @@ public class QuestSpellShop { List> cardsToRemove = new LinkedList<>(); for (Entry item : inventoryManager.getPool()) { PaperCard card = (PaperCard)item.getKey(); - int numToKeep = card.getRules().getType().isBasic() ? - FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_BASIC_LAND_SIZE) : FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_SIZE); + //Number of a particular card to keep + int numToKeep = 4; + + if(card.getRules().getType().isBasic()){ + numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_BASIC_LAND_SIZE); + } else{ + //Choose card limit restrictions based on deck construction rules, e.g.: Commander allows only singletons + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_SIZE); break; + case Commander: numToKeep = 1; + } + } + + //If this card has an exception to the card limit, e.g.: Relentless Rats, get the quest preference if (DeckFormat.getLimitExceptions().contains(card.getName())) { numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_ANY_NUMBER_SIZE); } + if (numToKeep < item.getValue()) { cardsToRemove.add(Pair.of(item.getKey(), item.getValue() - numToKeep)); } diff --git a/forge-gui/src/main/java/forge/quest/QuestUtil.java b/forge-gui/src/main/java/forge/quest/QuestUtil.java index c2fe796ef7b..7ad6b6cd335 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtil.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtil.java @@ -41,6 +41,7 @@ import forge.properties.ForgePreferences.FPref; import forge.quest.bazaar.IQuestBazaarItem; import forge.quest.bazaar.QuestItemType; import forge.quest.bazaar.QuestPetController; +import forge.quest.data.DeckConstructionRules; import forge.quest.data.QuestAchievements; import forge.quest.data.QuestAssets; import forge.util.gui.SGuiChoose; @@ -51,6 +52,7 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; +import java.util.TreeSet; /** *

@@ -531,7 +533,17 @@ public class QuestUtil { Integer lifeHuman = null; boolean useBazaar = true; Boolean forceAnte = null; - int lifeAI = 20; + + //Generate a life modifier based on this quest's variant as held in the Quest Controller's DeckConstructionRules + int variantLifeModifier = 0; + + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: variantLifeModifier = 20; break; + } + + int lifeAI = 20 + variantLifeModifier; + if (event instanceof QuestEventChallenge) { final QuestEventChallenge qc = ((QuestEventChallenge) event); lifeAI = qc.getAILife(); @@ -545,8 +557,9 @@ public class QuestUtil { forceAnte = qc.isForceAnte(); } - final RegisteredPlayer humanStart = new RegisteredPlayer(getDeckForNewGame()); - final RegisteredPlayer aiStart = new RegisteredPlayer(event.getEventDeck()); + final RegisteredPlayer humanStart = getRegisteredPlayerByVariant(getDeckForNewGame()); + + final RegisteredPlayer aiStart = getRegisteredPlayerByVariant(event.getEventDeck()); if (lifeHuman != null) { humanStart.setStartingLife(lifeHuman); @@ -581,17 +594,39 @@ public class QuestUtil { rules.setGamesPerMatch(qData.getMatchLength()); rules.setManaBurn(FModel.getPreferences().getPrefBoolean(FPref.UI_MANABURN)); rules.setCanCloneUseTargetsImage(FModel.getPreferences().getPrefBoolean(FPref.UI_CLONE_MODE_SOURCE)); + + TreeSet variant = new TreeSet(); + if(FModel.getQuest().getDeckConstructionRules() == DeckConstructionRules.Commander){ + variant.add(GameType.Commander); + } + final HostedMatch hostedMatch = GuiBase.getInterface().hostMatch(); final IGuiGame gui = GuiBase.getInterface().getNewGuiGame(); gui.setPlayerAvatar(aiPlayer, event); FThreads.invokeInEdtNowOrLater(new Runnable(){ @Override public void run() { - hostedMatch.startMatch(rules, null, starter, ImmutableMap.of(humanStart, gui)); + hostedMatch.startMatch(rules, variant, starter, ImmutableMap.of(humanStart, gui)); } }); } + /** + * Uses the appropriate RegisteredPlayer command for generating a RegisteredPlayer based on this quest's variant as + * held by the QuestController's DeckConstructionRules. + * @param deck The deck to generate the RegisteredPlayer with + * @return A newly made RegisteredPlayer specific to the quest's variant + */ + private static RegisteredPlayer getRegisteredPlayerByVariant(Deck deck){ + switch (FModel.getQuest().getDeckConstructionRules()) { + case Default: + return new RegisteredPlayer(deck); + case Commander: + return RegisteredPlayer.forCommander(deck); + } + return null; + } + private static Deck getDeckForNewGame() { Deck deck = null; if (event instanceof QuestEventChallenge) { @@ -623,7 +658,7 @@ public class QuestUtil { } if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) { - final String errorMessage = GameType.Quest.getDeckFormat().getDeckConformanceProblem(deck); + final String errorMessage = getDeckConformanceProblems(deck); if (null != errorMessage) { SOptionPane.showErrorDialog("Your deck " + errorMessage + " Please edit or choose a different deck.", "Invalid Deck"); return false; @@ -633,6 +668,21 @@ public class QuestUtil { return true; } + public static String getDeckConformanceProblems(Deck deck){ + String errorMessage = GameType.Quest.getDeckFormat().getDeckConformanceProblem(deck);; + + if(errorMessage != null) return errorMessage; //return immediately if the deck does not conform to quest requirements + + //Check for all applicable deck construction rules per this quests's saved DeckConstructionRules enum + switch(FModel.getQuest().getDeckConstructionRules()){ + case Commander: + errorMessage = GameType.Commander.getDeckFormat().getDeckConformanceProblem(deck); + break; + } + + return errorMessage; + } + /** Duplicate in DeckEditorQuestMenu and * probably elsewhere...can streamline at some point * (probably shouldn't be here). diff --git a/forge-gui/src/main/java/forge/quest/QuestUtilCards.java b/forge-gui/src/main/java/forge/quest/QuestUtilCards.java index c8d77d863ad..54a4887ba8a 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtilCards.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtilCards.java @@ -308,10 +308,16 @@ public final class QuestUtilCards { * user preferences */ public void setupNewGameCardPool(final GameFormat formatStartingPool, final int idxDifficulty, final StartingPoolPreferences userPrefs) { + //Add additional cards to the starter card pool based on variant if applicable + double variantModifier = 0; + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: variantModifier = 2; break; + } - final int nC = questPreferences.getPrefInt(DifficultyPrefs.STARTING_COMMONS, idxDifficulty); - final int nU = questPreferences.getPrefInt(DifficultyPrefs.STARTING_UNCOMMONS, idxDifficulty); - final int nR = questPreferences.getPrefInt(DifficultyPrefs.STARTING_RARES, idxDifficulty); + final int nC = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_COMMONS, idxDifficulty) * variantModifier); + final int nU = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_UNCOMMONS, idxDifficulty) * variantModifier); + final int nR = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_RARES, idxDifficulty) * variantModifier); addAllCards(BoosterUtils.getQuestStarterDeck(formatStartingPool, nC, nU, nR, userPrefs)); diff --git a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java index 2e93e7d4fec..265ea61bb58 100644 --- a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java +++ b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java @@ -226,6 +226,11 @@ public class QuestWinLoseController { sb.append(StringUtils.capitalize(qEvent.getDifficulty().getTitle())); sb.append(" opponent: ").append(credBase).append(" credits.\n"); + if(qEvent.getIsRandomMatch()){ + sb.append("Random Opponent Bonus: " + credBase + " credit" + (credBase > 1 ? "s." : ".") + "\n"); + credBase += credBase; + } + final int winMultiplier = Math.min(qData.getAchievements().getWin(), FModel.getQuestPreferences().getPrefInt(QPref.REWARDS_WINS_MULTIPLIER_MAX)); final int creditsForPreviousWins = (int) ((Double.parseDouble(FModel.getQuestPreferences() .getPref(QPref.REWARDS_WINS_MULTIPLIER)) * winMultiplier)); diff --git a/forge-gui/src/main/java/forge/quest/QuestWorld.java b/forge-gui/src/main/java/forge/quest/QuestWorld.java index e20dcf98ce8..4c77b0ec515 100644 --- a/forge-gui/src/main/java/forge/quest/QuestWorld.java +++ b/forge-gui/src/main/java/forge/quest/QuestWorld.java @@ -40,6 +40,7 @@ public class QuestWorld implements Comparable{ private final String dir; private final GameFormatQuest format; public static final String STANDARDWORLDNAME = "Random Standard"; + public static final String RANDOMCOMMANDERWORLDNAME = "Random Commander"; private boolean isCustom; @@ -129,7 +130,6 @@ public class QuestWorld implements Comparable{ /** * TODO: Write javadoc for Constructor. * @param file0 - * @param keySelector0 */ public Reader(String file0) { super(file0, QuestWorld.FN_GET_NAME); @@ -194,6 +194,12 @@ public class QuestWorld implements Comparable{ FModel.getFormats().getStandard().getBannedCardNames(),false); } + if (useName.equalsIgnoreCase(QuestWorld.RANDOMCOMMANDERWORLDNAME)){ + useFormat = new GameFormatQuest(QuestWorld.RANDOMCOMMANDERWORLDNAME, + FModel.getFormats().getFormat("Commander").getAllowedSetCodes(), + FModel.getFormats().getFormat("Commander").getBannedCardNames(),false); + } + // System.out.println("Creating quest world " + useName + " (index " + useIdx + ", dir: " + useDir); // if (useFormat != null) { System.out.println("SETS: " + sets + "\nBANNED: " + bannedCards); } diff --git a/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java b/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java new file mode 100644 index 00000000000..3744beea09d --- /dev/null +++ b/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java @@ -0,0 +1,17 @@ +package forge.quest.data; + +/** + * Used to clarify which subformat a quest is using e.g. Commander. + * Auth. Imakuni + */ +public enum DeckConstructionRules { + /** + * Typically has no effect on Quest gameplay. + */ + Default, + + /** + * Commander ruleset. 99 card deck, no copies other than basic lands, commander(s) in Command zone + */ + Commander +} 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 616c49d937b..8f7b644641b 100644 --- a/forge-gui/src/main/java/forge/quest/data/QuestAssets.java +++ b/forge-gui/src/main/java/forge/quest/data/QuestAssets.java @@ -200,7 +200,14 @@ public class QuestAssets { * @return the life */ public int getLife(final QuestMode mode) { - final int base = mode.equals(QuestMode.Fantasy) ? 15 : 20; + int base = mode.equals(QuestMode.Fantasy) ? 15 : 20; + + //Modify life for the quest's sub-format, e.g.: Commander adds 20 + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: base += 20; + } + return (base + this.getItemLevel(QuestItemType.ELIXIR_OF_LIFE)) - this.getItemLevel(QuestItemType.POUND_FLESH); } diff --git a/forge-gui/src/main/java/forge/quest/data/QuestData.java b/forge-gui/src/main/java/forge/quest/data/QuestData.java index e6a75adef7d..41574634113 100644 --- a/forge-gui/src/main/java/forge/quest/data/QuestData.java +++ b/forge-gui/src/main/java/forge/quest/data/QuestData.java @@ -42,7 +42,7 @@ import java.util.Map; */ public final class QuestData { /** Holds the latest version of the Quest Data. */ - public static final int CURRENT_VERSION_NUMBER = 12; + public static final int CURRENT_VERSION_NUMBER = 13; // This field places the version number into QD instance, // but only when the object is created through the constructor @@ -70,6 +70,11 @@ public final class QuestData { public String currentDeck = "DEFAULT"; + /** + * Holds the subformat for this quest. Defaults to DeckConstructionRules.Default. + */ + public DeckConstructionRules deckConstructionRules = DeckConstructionRules.Default; + public QuestData() { //needed for XML serialization } @@ -87,9 +92,11 @@ public final class QuestData { * allow set unlocking during quest * @param startingWorld * starting world + * @param dcr + * deck construction rules e.g. Commander */ public QuestData(String name0, int diff, QuestMode mode0, GameFormat userFormat, - boolean allowSetUnlocks, final String startingWorld) { + boolean allowSetUnlocks, final String startingWorld, DeckConstructionRules dcr) { this.name = name0; if (userFormat != null) { @@ -99,6 +106,7 @@ public final class QuestData { this.achievements = new QuestAchievements(diff); this.assets = new QuestAssets(format); this.worldId = startingWorld; + this.deckConstructionRules = dcr; } /** diff --git a/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java b/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java index de680502e37..cd232367df9 100644 --- a/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java +++ b/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java @@ -223,10 +223,16 @@ public class QuestDataIO { // Current Deck moved from preferences to quest data - it should not be global for all quests!!! QuestDataIO.setFinalField(QuestData.class, "currentDeck", newData, FModel.getQuestPreferences().getPref(QPref.CURRENT_DECK)); } - if (saveVersion < 13) { + if(saveVersion < 13){ + //Update for quest DeckConstructionRules + //Add a DeckConstructionRules set to Default. + QuestDataIO.setFinalField(QuestData.class, "deckConstructionRules", newData, DeckConstructionRules.Default); + } + if (saveVersion < 14) { // Migrate DraftTournaments to use new Tournament class } + final QuestAssets qS = newData.getAssets(); final QuestAchievements qA = newData.getAchievements(); From ffcc38d8c4dcfce397efb4e56cbf633eb61e3dbb Mon Sep 17 00:00:00 2001 From: Jeremy Pelkala Date: Thu, 8 Nov 2018 11:51:21 -0500 Subject: [PATCH 122/901] Commander Quest checkstyle and bugfixes -QuestEventCommanderDuelManager Removed unused imports -CEditorQuest Fixed colorless cards getting filtered out of deck creation. --- .../screens/deckeditor/controllers/CEditorQuest.java | 9 +++++++-- .../java/forge/quest/QuestEventCommanderDuelManager.java | 3 --- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java index b7842272e42..c09e0a18d48 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java @@ -322,7 +322,7 @@ public final class CEditorQuest extends CDeckEditor { public boolean apply(PaperCard subject) { CardRules cr = subject.getRules(); ManaCost mc = cr.getManaCost(); - return !mc.isPureGeneric() && allowedColor.containsAllColorsFrom(cr.getColorIdentity().getColor()); + return allowedColor.containsAllColorsFrom(cr.getColorIdentity().getColor()); } } @@ -336,7 +336,10 @@ public final class CEditorQuest extends CDeckEditor { List colors = new ArrayList<>(); //Return early if there are no current commanders - if(commanders.size() == 0) return ColorSet.fromNames(colors); + if(commanders.size() == 0){ + colors.add("c"); + return ColorSet.fromNames(colors); + } //For each commander,add each color of its color identity if not already added for(PaperCard pc : commanders){ @@ -347,6 +350,8 @@ public final class CEditorQuest extends CDeckEditor { if(!colors.contains("g") && pc.getRules().getColorIdentity().hasGreen()) colors.add("g"); } + colors.add("c"); + return ColorSet.fromNames(colors); } diff --git a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java index 384d9d11d77..c9fbaa3457c 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java +++ b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java @@ -4,10 +4,7 @@ import forge.deck.*; import forge.item.PaperCard; import forge.model.FModel; import forge.quest.data.QuestPreferences; -import forge.util.CollectionSuppliers; import forge.util.MyRandom; -import forge.util.maps.EnumMapOfLists; -import forge.util.maps.MapOfLists; import java.util.ArrayList; import java.util.Collections; From c5a5ce25e5342a8d9ec8b324bc1a2014a1ca242e Mon Sep 17 00:00:00 2001 From: Jeremy Pelkala Date: Thu, 8 Nov 2018 12:42:15 -0500 Subject: [PATCH 123/901] Removed unused imports from CEditorQuest --- .../forge/screens/deckeditor/controllers/CEditorQuest.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java index c09e0a18d48..84d8477f088 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java @@ -21,8 +21,6 @@ import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.base.Supplier; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; import forge.UiCommand; import forge.card.CardRules; import forge.card.CardRulesPredicates; @@ -31,7 +29,6 @@ import forge.card.mana.ManaCost; import forge.deck.CardPool; import forge.deck.Deck; import forge.deck.DeckSection; -import forge.deck.generation.DeckGeneratorBase; import forge.gui.GuiUtils; import forge.gui.framework.DragCell; import forge.gui.framework.FScreen; @@ -58,7 +55,6 @@ import forge.util.ItemPool; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.awt.print.Paper; import java.util.ArrayList; import java.util.HashMap; import java.util.List; From 6857eadd1105faff6200a25be2aa2ac8620ef7b3 Mon Sep 17 00:00:00 2001 From: Jeremy Pelkala Date: Fri, 2 Nov 2018 18:57:17 -0400 Subject: [PATCH 124/901] -CardPool Added getFilteredPool() to easily get a Predicate applied copy of a CardPool. -GameRules Minor formatting change. -worlds.txt Added Random Commander to the list. -DeckConstructionRules New enum for defining the subformat a quest is using. -QuestAssets getLife() now has a switch for modifying the life for sub-formats. -QuestData New data save version. Includes a DeckConstructionRules enum. -QuestDataIO updateSaveFile will update old saves to have a default DeckConstructionRules complying with the new QuestData save version. -QuestController Updated to include support for DeckConstructionRules and specialized duel managers -QuestEvent Now have boolean to define if this is a "random" match for the duel list. Currently only QuestEventCommanderDuelManager makes use of this feature for Commander quests. -QuestEventCommanderDuel New QuestEventDuel used in the QuestEventCommanderDuelManager which contains a DeckProxy for use in generating random commander decks. -QuestEventCommanderDuelManager New duel manager to generate duels by difficulty for a Commander quest. Currently uses random generation to generate the decks of each opponent. -QuestSpellShop Sell Extras button now has a switch for taking into account special deck construction rules such as Commander only allowing singletons. -QuestUtil Starting a game now checks for various sub-format specific changes including a switch case for which variety of registered player to use. -QuestUtilCards Starting cardpool size is now modified by a switch case for sub-formats such as Commander. -QuestWinLoseController QuestEvents marked as random matches will now award a "Random Opponent Bonus" equal to the credit base. Currently only QuestEventCommanderDuelManager creates QuestEvents marked as such. -QuestWorld Added support for the Commander quest format and world. -CEditorQuest Many changes to add support for Commander in a style that, hopefully, also paths the way for future format support. -CSubmenuQuestData Support for Commander quests. -VSubmenuQuestData Support for Commander quests. --- .../src/main/java/forge/deck/CardPool.java | 14 ++ .../src/main/java/forge/game/GameRules.java | 3 +- .../deckeditor/controllers/CEditorQuest.java | 151 +++++++++++-- .../screens/home/quest/CSubmenuQuestData.java | 10 +- .../screens/home/quest/VSubmenuQuestData.java | 28 ++- forge-gui/res/quest/world/worlds.txt | 1 + .../java/forge/quest/QuestController.java | 14 +- .../src/main/java/forge/quest/QuestEvent.java | 4 + .../forge/quest/QuestEventCommanderDuel.java | 19 ++ .../quest/QuestEventCommanderDuelManager.java | 205 ++++++++++++++++++ .../main/java/forge/quest/QuestSpellShop.java | 17 +- .../src/main/java/forge/quest/QuestUtil.java | 60 ++++- .../main/java/forge/quest/QuestUtilCards.java | 12 +- .../forge/quest/QuestWinLoseController.java | 5 + .../src/main/java/forge/quest/QuestWorld.java | 8 +- .../quest/data/DeckConstructionRules.java | 17 ++ .../java/forge/quest/data/QuestAssets.java | 9 +- .../main/java/forge/quest/data/QuestData.java | 12 +- .../main/java/forge/quest/io/QuestDataIO.java | 8 +- 19 files changed, 561 insertions(+), 36 deletions(-) create mode 100644 forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java create mode 100644 forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java create mode 100644 forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java diff --git a/forge-core/src/main/java/forge/deck/CardPool.java b/forge-core/src/main/java/forge/deck/CardPool.java index 72ab8efb851..b484f31ab98 100644 --- a/forge-core/src/main/java/forge/deck/CardPool.java +++ b/forge-core/src/main/java/forge/deck/CardPool.java @@ -17,6 +17,7 @@ */ package forge.deck; +import com.google.common.base.Predicate; import com.google.common.collect.Lists; import forge.StaticData; import forge.card.CardDb; @@ -216,4 +217,17 @@ public class CardPool extends ItemPool { } return sb.toString(); } + + /** + * Applies a predicate to this CardPool's cards. + * @param predicate the Predicate to apply to this CardPool + * @return a new CardPool made from this CardPool with only the cards that agree with the provided Predicate + */ + public CardPool getFilteredPool(Predicate predicate){ + CardPool filteredPool = new CardPool(); + for(PaperCard pc : this.items.keySet()){ + if(predicate.apply(pc)) filteredPool.add(pc); + } + return filteredPool; + } } diff --git a/forge-game/src/main/java/forge/game/GameRules.java b/forge-game/src/main/java/forge/game/GameRules.java index dc7ed4cddf1..5e6876e9801 100644 --- a/forge-game/src/main/java/forge/game/GameRules.java +++ b/forge-game/src/main/java/forge/game/GameRules.java @@ -78,7 +78,8 @@ public class GameRules { } public boolean hasCommander() { - return appliedVariants.contains(GameType.Commander) || appliedVariants.contains(GameType.TinyLeaders) + return appliedVariants.contains(GameType.Commander) + || appliedVariants.contains(GameType.TinyLeaders) || appliedVariants.contains(GameType.Brawl); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java index c33da12cda7..b7842272e42 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java @@ -18,11 +18,20 @@ package forge.screens.deckeditor.controllers; import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; import com.google.common.base.Supplier; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; import forge.UiCommand; +import forge.card.CardRules; +import forge.card.CardRulesPredicates; +import forge.card.ColorSet; +import forge.card.mana.ManaCost; import forge.deck.CardPool; import forge.deck.Deck; import forge.deck.DeckSection; +import forge.deck.generation.DeckGeneratorBase; import forge.gui.GuiUtils; import forge.gui.framework.DragCell; import forge.gui.framework.FScreen; @@ -35,6 +44,7 @@ import forge.itemmanager.views.ItemTableColumn; import forge.model.FModel; import forge.properties.ForgePreferences.FPref; import forge.quest.QuestController; +import forge.quest.data.DeckConstructionRules; import forge.screens.deckeditor.AddBasicLandsDialog; import forge.screens.deckeditor.SEditorIO; import forge.screens.deckeditor.views.VAllDecks; @@ -48,6 +58,7 @@ import forge.util.ItemPool; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.print.Paper; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -103,6 +114,14 @@ public final class CEditorQuest extends CDeckEditor { allSections.add(DeckSection.Main); allSections.add(DeckSection.Sideboard); + //Add sub-format specific sections + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: + allSections.add(DeckSection.Commander); + break; + } + this.questData = questData0; final CardManager catalogManager = new CardManager(cDetailPicture, false, true); @@ -158,6 +177,10 @@ public final class CEditorQuest extends CDeckEditor { @Override protected CardLimit getCardLimit() { if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) { + //If this is a commander quest, only allow single copies of cards + if(FModel.getQuest().getDeckConstructionRules() == DeckConstructionRules.Commander){ + return CardLimit.Singleton; + } return CardLimit.Default; } return CardLimit.None; //if not enforcing deck legality, don't enforce default limit @@ -245,16 +268,98 @@ public final class CEditorQuest extends CDeckEditor { public void resetTables() { this.sectionMode = DeckSection.Main; - final Deck deck = this.controller.getModel(); - - final CardPool cardpool = getInitialCatalog(); - // remove bottom cards that are in the deck from the card pool - cardpool.removeAll(deck.getMain()); - // remove sideboard cards from the catalog - cardpool.removeAll(deck.getOrCreate(DeckSection.Sideboard)); // show cards, makes this user friendly - this.getCatalogManager().setPool(cardpool); - this.getDeckManager().setPool(deck.getMain()); + this.getCatalogManager().setPool(getRemainingCardPool()); + this.getDeckManager().setPool(getDeck().getMain()); + } + + /*** + * Provides the pool of cards the player has available to add to his or her deck. Also manages showing available cards + * to choose from for special deck construction rules, e.g.: Commander. + * @return CardPool of cards available to add to the player's deck. + */ + private CardPool getRemainingCardPool(){ + final CardPool cardpool = getInitialCatalog(); + + // remove bottom cards that are in the deck from the card pool + cardpool.removeAll(getDeck().getMain()); + + // remove sideboard cards from the catalog + cardpool.removeAll(getDeck().getOrCreate(DeckSection.Sideboard)); + + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: + //remove this deck's currently selected commander(s) from the catalog + cardpool.removeAll(getDeck().getOrCreate(DeckSection.Commander)); + + //TODO: Only thin if deck conformance is being applied + if(getDeck().getOrCreate(DeckSection.Commander).toFlatList().size() > 0) { + Predicate identityPredicate = new MatchCommanderColorIdentity(getDeckColorIdentity()); + CardPool filteredPool = cardpool.getFilteredPool(identityPredicate); + + return filteredPool; + } + break; + } + + return cardpool; + } + + /** + * Predicate that filters out based on a color identity provided upon instantiation. Used to filter the card + * list when a commander is chosen so the user can more easily see what cards are available for his or her deck + * and avoid making additions that are not legal. + */ + public static class MatchCommanderColorIdentity implements Predicate { + private final ColorSet allowedColor; + + public MatchCommanderColorIdentity(ColorSet color) { + allowedColor = color; + } + + @Override + public boolean apply(PaperCard subject) { + CardRules cr = subject.getRules(); + ManaCost mc = cr.getManaCost(); + return !mc.isPureGeneric() && allowedColor.containsAllColorsFrom(cr.getColorIdentity().getColor()); + } + } + + /** + * Compiles the color identity of the loaded deck based on the commanders. + * @return A ColorSet containing the color identity of the currently loaded deck. + */ + public ColorSet getDeckColorIdentity(){ + + List commanders = getDeck().getOrCreate(DeckSection.Commander).toFlatList(); + List colors = new ArrayList<>(); + + //Return early if there are no current commanders + if(commanders.size() == 0) return ColorSet.fromNames(colors); + + //For each commander,add each color of its color identity if not already added + for(PaperCard pc : commanders){ + if(!colors.contains("w") && pc.getRules().getColorIdentity().hasWhite()) colors.add("w"); + if(!colors.contains("u") && pc.getRules().getColorIdentity().hasBlue()) colors.add("u"); + if(!colors.contains("b") && pc.getRules().getColorIdentity().hasBlack()) colors.add("b"); + if(!colors.contains("r") && pc.getRules().getColorIdentity().hasRed()) colors.add("r"); + if(!colors.contains("g") && pc.getRules().getColorIdentity().hasGreen()) colors.add("g"); + } + + return ColorSet.fromNames(colors); + } + + /* + Used to make the code more readable in game terms. + */ + private Deck getDeck(){ + return this.controller.getModel(); + } + + private ItemPool getCommanderCardPool(){ + Predicate commanderPredicate = Predicates.compose(CardRulesPredicates.Presets.CAN_BE_COMMANDER, PaperCard.FN_GET_RULES); + return getRemainingCardPool().getFilteredPool(commanderPredicate); } @Override @@ -280,14 +385,30 @@ public final class CEditorQuest extends CDeckEditor { } /** - * Switch between the main deck and the sideboard editor. + * Switch between the main deck and the sideboard/Command Zone editor. */ public void setEditorMode(DeckSection sectionMode) { - if (sectionMode == DeckSection.Sideboard) { - this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Sideboard)); - } - else { - this.getDeckManager().setPool(this.controller.getModel().getMain()); + //Fixes null pointer error on switching tabs while quest deck editor is open. TODO: Find source of bug possibly? + if(sectionMode == null) sectionMode = DeckSection.Main; + + //Based on which section the editor is in, display the remaining card pool (or applicable card pool if in + //Commander) and the current section's cards + switch(sectionMode){ + case Main : + this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); + this.getCatalogManager().setPool(getRemainingCardPool()); + this.getDeckManager().setPool(this.controller.getModel().getMain()); + break; + case Sideboard : + this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); + this.getCatalogManager().setPool(getRemainingCardPool()); + this.getDeckManager().setPool(getDeck().getOrCreate(DeckSection.Sideboard)); + break; + case Commander : + this.getCatalogManager().setup(ItemManagerConfig.COMMANDER_POOL); + this.getCatalogManager().setPool(getCommanderCardPool()); + this.getDeckManager().setPool(getDeck().getOrCreate(DeckSection.Commander)); + break; } this.sectionMode = sectionMode; diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java index 131805b738b..8aa76293b55 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java @@ -10,6 +10,7 @@ import forge.model.FModel; import forge.properties.ForgeConstants; import forge.quest.*; import forge.quest.StartingPoolPreferences.PoolType; +import forge.quest.data.DeckConstructionRules; import forge.quest.data.GameFormatQuest; import forge.quest.data.QuestData; import forge.quest.data.QuestPreferences.QPref; @@ -340,9 +341,16 @@ public enum CSubmenuQuestData implements ICDoc { break; } + //Apply the appropriate deck construction rules for this quest + DeckConstructionRules dcr = DeckConstructionRules.Default; + + if(VSubmenuQuestData.SINGLETON_INSTANCE.isCommander()){ + dcr = DeckConstructionRules.Commander; + } + final QuestController qc = FModel.getQuest(); - qc.newGame(questName, difficulty, mode, fmtPrizes, view.isUnlockSetsAllowed(), dckStartPool, fmtStartPool, view.getStartingWorldName(), userPrefs); + qc.newGame(questName, difficulty, mode, fmtPrizes, view.isUnlockSetsAllowed(), dckStartPool, fmtStartPool, view.getStartingWorldName(), userPrefs, dcr); FModel.getQuest().save(); // Save in preferences. diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java index 9eee9e58ca3..70e284faf3d 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java @@ -62,6 +62,7 @@ public enum VSubmenuQuestData implements IVSubmenu { private final FRadioButton radHard = new FRadioButton("Hard"); private final FRadioButton radExpert = new FRadioButton("Expert"); private final FCheckBox boxFantasy = new FCheckBox("Fantasy Mode"); + private final FCheckBox boxCommander = new FCheckBox("Commander Subformat"); private final FLabel lblStartingWorld = new FLabel.Builder().text("Starting world:").build(); private final FComboBoxWrapper cbxStartingWorld = new FComboBoxWrapper<>(); @@ -274,9 +275,25 @@ public enum VSubmenuQuestData implements IVSubmenu { } }); - // Fantasy box enabled by Default + // Fantasy box selected by Default boxFantasy.setSelected(true); boxFantasy.setEnabled(true); + + // Commander box unselected by Default + boxCommander.setSelected(false); + boxCommander.setEnabled(true); + + boxCommander.addActionListener( + new ActionListener(){ + public void actionPerformed(ActionEvent e){ + if(!isCommander()) return; //do nothing if unselecting Commander Subformat + //Otherwise, set the starting world to Random Commander + cbxStartingWorld.setSelectedItem(FModel.getWorlds().get("Random Commander")); + } + } + + ); + boxCompleteSet.setEnabled(true); boxAllowDuplicates.setEnabled(true); @@ -286,6 +303,7 @@ public enum VSubmenuQuestData implements IVSubmenu { final JPanel pnlDifficultyMode = new JPanel(new MigLayout("insets 0, gap 1%, flowy")); pnlDifficultyMode.add(difficultyPanel, "gapright 4%"); pnlDifficultyMode.add(boxFantasy, "h 25px!, gapbottom 15, gapright 4%"); + pnlDifficultyMode.add(boxCommander, "h 25px!, gapbottom 15, gapright 4%"); pnlDifficultyMode.add(lblStartingWorld, "h 25px!, hidemode 3"); cbxStartingWorld.addTo(pnlDifficultyMode, "h 27px!, w 40%, pushx, gapbottom 7"); pnlDifficultyMode.setOpaque(false); @@ -487,6 +505,14 @@ public enum VSubmenuQuestData implements IVSubmenu { return boxFantasy.isSelected(); } + /** + * Auth. Imakuni + * @return True if the "Commander Subformat" check box is selected. + */ + public boolean isCommander() { + return boxCommander.isSelected(); + } + public boolean startWithCompleteSet() { return boxCompleteSet.isSelected(); } diff --git a/forge-gui/res/quest/world/worlds.txt b/forge-gui/res/quest/world/worlds.txt index b08931cde59..5d99427d535 100644 --- a/forge-gui/res/quest/world/worlds.txt +++ b/forge-gui/res/quest/world/worlds.txt @@ -1,5 +1,6 @@ Name:Main world Name:Random Standard +Name:Random Commander Name:Amonkhet|Dir:Amonkhet|Sets:AKH, HOU Name:Jamuraa|Dir:jamuraa|Sets:5ED, ARN, MIR, VIS, WTH|Banned:Chaos Orb; Falling Star Name:Kamigawa|Dir:2004 Kamigawa|Sets:CHK, BOK, SOK diff --git a/forge-gui/src/main/java/forge/quest/QuestController.java b/forge-gui/src/main/java/forge/quest/QuestController.java index 0d306f4431a..5366f7200bc 100644 --- a/forge-gui/src/main/java/forge/quest/QuestController.java +++ b/forge-gui/src/main/java/forge/quest/QuestController.java @@ -276,9 +276,10 @@ public class QuestController { public void newGame(final String name, final int difficulty, final QuestMode mode, final GameFormat formatPrizes, final boolean allowSetUnlocks, final Deck startingCards, final GameFormat formatStartingPool, - final String startingWorld, final StartingPoolPreferences userPrefs) { + final String startingWorld, final StartingPoolPreferences userPrefs, + DeckConstructionRules dcr) { - this.load(new QuestData(name, difficulty, mode, formatPrizes, allowSetUnlocks, startingWorld)); // pass awards and unlocks here + this.load(new QuestData(name, difficulty, mode, formatPrizes, allowSetUnlocks, startingWorld, dcr)); // pass awards and unlocks here if (startingCards != null) { this.myCards.addDeck(startingCards); @@ -435,6 +436,12 @@ public class QuestController { QuestWorld world = getWorld(); String path = ForgeConstants.DEFAULT_CHALLENGES_DIR; + //Use a variant specialized duel manager if this is a variant quest + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: this.duelManager = new QuestEventCommanderDuelManager(); return; + } + if (world != null) { if (world.getName().equals(QuestWorld.STANDARDWORLDNAME)) { @@ -449,7 +456,6 @@ public class QuestController { } this.duelManager = new QuestEventDuelManager(new File(path)); - } public HashSet GetRating() { @@ -607,4 +613,6 @@ public class QuestController { public void setCurrentDeck(String s) { model.currentDeck = s; } + + public DeckConstructionRules getDeckConstructionRules(){return model.deckConstructionRules;} } diff --git a/forge-gui/src/main/java/forge/quest/QuestEvent.java b/forge-gui/src/main/java/forge/quest/QuestEvent.java index 00a140c80e2..2a9bf6c1b63 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEvent.java +++ b/forge-gui/src/main/java/forge/quest/QuestEvent.java @@ -48,6 +48,7 @@ public abstract class QuestEvent implements IQuestEvent { private String profile = "Default"; // Opponent name if different from the challenge name private String opponentName = null; + private boolean isRandomMatch = false; public static final Function FN_GET_NAME = new Function() { @@ -174,4 +175,7 @@ public abstract class QuestEvent implements IQuestEvent { this.showDifficulty = showDifficulty; } + public boolean getIsRandomMatch(){return isRandomMatch;} + + public void setIsRandomMatch(boolean b){isRandomMatch = b;} } diff --git a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java new file mode 100644 index 00000000000..1d7924a04d7 --- /dev/null +++ b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java @@ -0,0 +1,19 @@ +package forge.quest; + +import forge.deck.DeckProxy; + +/** + * A QuestEventDuel with a CommanderDeckGenerator used exclusively within QuestEventCommanderDuelManager for the + * creation of randomly generated Commander decks in a Commander variant quest. + * Auth. Imakuni & Forge + */ +public class QuestEventCommanderDuel extends QuestEventDuel{ + /** + * The CommanderDeckGenerator for this duel. + */ + private DeckProxy deckProxy; + + public DeckProxy getDeckProxy() {return deckProxy;} + + public void setDeckProxy(DeckProxy dp) {deckProxy = dp;} +} diff --git a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java new file mode 100644 index 00000000000..384d9d11d77 --- /dev/null +++ b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java @@ -0,0 +1,205 @@ +package forge.quest; + +import forge.deck.*; +import forge.item.PaperCard; +import forge.model.FModel; +import forge.quest.data.QuestPreferences; +import forge.util.CollectionSuppliers; +import forge.util.MyRandom; +import forge.util.maps.EnumMapOfLists; +import forge.util.maps.MapOfLists; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Manages the creation of random Commander duels for a Commander variant quest. Random generation is handled via + * the CommanderDeckGenerator class. + * Auth. Forge & Imakuni#8015 + */ +public class QuestEventCommanderDuelManager implements QuestEventDuelManagerInterface { + /** + * The list of all possible Commander variant duels. + */ + private ArrayList commanderDuels = new ArrayList<>(); + + /** + * Contains the expert deck lists for the commanders. + */ + private List expertCommanderDecks; + + /** + * Immediately calls assembleDuels() to setup the commanderDuels variable. + */ + public QuestEventCommanderDuelManager(){ + assembleDuels(); + } + + /** + * Assembles the list of all possible Commander duels via CommanderDeckGenerator. Should be done within constructor. + */ + private void assembleDuels(){ + //isCardGen = true seemed to make slightly more difficult decks based purely on experience with a very small sample size. + //Gotta work on this more, its making pretty average decks after further testing. + expertCommanderDecks = CommanderDeckGenerator.getCommanderDecks(DeckFormat.Commander, true, true); + + List generatedDuels = CommanderDeckGenerator.getCommanderDecks(DeckFormat.Commander, true, false); + + for(DeckProxy dp : generatedDuels){ + QuestEventCommanderDuel duel = new QuestEventCommanderDuel(); + + duel.setDescription("Randomly generated " + dp.getName() + " commander deck."); + duel.setName(dp.getName()); + duel.setTitle(dp.getName()); + duel.setOpponentName(dp.getName()); + duel.setDifficulty(QuestEventDifficulty.EASY); + duel.setDeckProxy(dp); + + //Setting a blank deck avoids a null pointer exception. The deck is generated in generateDuels() to avoid long load times. + duel.setEventDeck(new Deck()); + + commanderDuels.add(duel); + } + } + + /** + * Retrieve list of all possible Commander duels. + * @return ArrayList containing all possible Commander duels. + */ + public Iterable getAllDuels() { + return commanderDuels; + } + + /** + * Retrieve list of all possible Commander duels. + * @param difficulty Currently unused + * @return ArrayList containing all possible Commander duels. + */ + public Iterable getDuels(QuestEventDifficulty difficulty){ + return commanderDuels; + } + + /** + * Composes an ArrayList containing 4 QuestEventDuels composed with Commander variant decks. One duel will have its + * title replaced as Random. + * @return ArrayList of QuestEventDuels containing 4 duels. + */ + public List generateDuels(){ + final List duelOpponents = new ArrayList<>(); + + //While there are less than 4 duels chosen + while(duelOpponents.size() < 4){ + //Get a random duel from the possible duels list + QuestEventCommanderDuel duel = (QuestEventCommanderDuel)commanderDuels.get(((int) (commanderDuels.size() * MyRandom.getRandom().nextDouble()))); + + //If the chosen duels list already contains this duel, get a different duel to prevent duplicate duels + if(duelOpponents.contains(duel)) continue; + + //Add the randomly chosen duel to the duel list + duelOpponents.add(duel); + + //Here the actual deck for this commander is generated by calling .getDeck() on the saved DeckProxy + duel.setEventDeck(duel.getDeckProxy().getDeck()); + + //Modify deck for difficulty + modifyDuelForDifficulty(duel); + + + } + + //Modify the stats of the final duel to hide the opponent, creating a "random" duel. + //We make a copy of the final duel and overwrite it in the duelOpponents to avoid changing the variables in + //the original duel, which gets reused. + QuestEventCommanderDuel duel = (QuestEventCommanderDuel)duelOpponents.get(duelOpponents.size() - 1); + QuestEventCommanderDuel randomDuel = new QuestEventCommanderDuel(); + + randomDuel.setName(duel.getName()); + randomDuel.setOpponentName(duel.getName()); + randomDuel.setDeckProxy(duel.getDeckProxy()); + randomDuel.setTitle("Random Opponent"); + randomDuel.setShowDifficulty(false); + randomDuel.setDescription("Fight a random generated commander opponent."); + randomDuel.setIsRandomMatch(true); + randomDuel.setEventDeck(duel.getEventDeck()); + + //Replace the final duel with this newly modified "random" duel + duelOpponents.set(duelOpponents.size()-1, randomDuel); + + return duelOpponents; + } + + /** + * Retrieves the expert level deck generation of a deck with the same commander as the provided DeckProxy. + * @param dp The easy generation commander deck + * @return The same commander's expert generation DeckProxy + */ + private Deck getExpertGenDeck(DeckProxy dp){ + for(QuestEventDuel qed : commanderDuels){ + QuestEventCommanderDuel cmdQED = (QuestEventCommanderDuel)qed; + if(cmdQED.getDeckProxy().getName().equals(dp.getName())){ + return cmdQED.getDeckProxy().getDeck(); + } + } + return null; + } + + /** + * Modifies a given duel by replacing a percentage of the deck with random cards from the more difficult generated version + * of the same commander's deck. Medium replaces 30%, Hard replaces 60%, Expert replaces 100%. + * @param duel The QuestEventCommanderDuel to modify + */ + private void modifyDuelForDifficulty(QuestEventCommanderDuel duel){ + final QuestPreferences questPreferences = FModel.getQuestPreferences(); + final int index = FModel.getQuest().getAchievements().getDifficulty(); + final int numberOfWins = FModel.getQuest().getAchievements().getWin(); + Deck expertDeck = getExpertGenDeck(duel.getDeckProxy()); + + int difficultyReplacementPercent = 0; + + //Note: The code is ordered to make the least number of comparisons I could think of at the time for speed reasons. + //In reality, it shouldn't really make much difference, but why not? + if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_EXPERTAI, index)) { + //At expert, the deck is replaced with the entire expert deck, and we can return immediately + duel.setEventDeck(expertDeck); + duel.setDifficulty(QuestEventDifficulty.EXPERT); + return; + } + + if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_MEDIUMAI, index)) { + difficultyReplacementPercent += 30; + duel.setDifficulty(QuestEventDifficulty.MEDIUM); + } else return; //return early here since it would be an easy opponent with no changes + + if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_HARDAI, index)) { + difficultyReplacementPercent += 30; + duel.setDifficulty(QuestEventDifficulty.HARD); + } + + CardPool easyMain = duel.getEventDeck().getMain(); + CardPool expertMain = expertDeck.getMain(); + + List easyList = easyMain.toFlatList(); + List expertList = expertMain.toFlatList(); + + //Replace cards in the easy deck with cards from the expert deck up to the difficulty replacement percent + for(int i = 0; i < difficultyReplacementPercent; i++){ + if(!easyMain.contains(expertList.get(i))) { //ensure that the card being copied over isn't already in the deck + easyMain.remove(easyList.get(i)); + easyMain.add(expertList.get(i)); + } + else{ + expertList.remove(expertList.get(i)); + i--; + if(expertList.size() == 0) break; //break if there are no more cards to copy over + } + } + } + + /** + * Randomizes the list of Commander Duels. + */ + public void randomizeOpponents(){ + Collections.shuffle(commanderDuels); + } +} diff --git a/forge-gui/src/main/java/forge/quest/QuestSpellShop.java b/forge-gui/src/main/java/forge/quest/QuestSpellShop.java index e9196e417df..96eae768963 100644 --- a/forge-gui/src/main/java/forge/quest/QuestSpellShop.java +++ b/forge-gui/src/main/java/forge/quest/QuestSpellShop.java @@ -344,11 +344,24 @@ public class QuestSpellShop { List> cardsToRemove = new LinkedList<>(); for (Entry item : inventoryManager.getPool()) { PaperCard card = (PaperCard)item.getKey(); - int numToKeep = card.getRules().getType().isBasic() ? - FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_BASIC_LAND_SIZE) : FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_SIZE); + //Number of a particular card to keep + int numToKeep = 4; + + if(card.getRules().getType().isBasic()){ + numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_BASIC_LAND_SIZE); + } else{ + //Choose card limit restrictions based on deck construction rules, e.g.: Commander allows only singletons + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_SIZE); break; + case Commander: numToKeep = 1; + } + } + + //If this card has an exception to the card limit, e.g.: Relentless Rats, get the quest preference if (DeckFormat.getLimitExceptions().contains(card.getName())) { numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_ANY_NUMBER_SIZE); } + if (numToKeep < item.getValue()) { cardsToRemove.add(Pair.of(item.getKey(), item.getValue() - numToKeep)); } diff --git a/forge-gui/src/main/java/forge/quest/QuestUtil.java b/forge-gui/src/main/java/forge/quest/QuestUtil.java index c2fe796ef7b..7ad6b6cd335 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtil.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtil.java @@ -41,6 +41,7 @@ import forge.properties.ForgePreferences.FPref; import forge.quest.bazaar.IQuestBazaarItem; import forge.quest.bazaar.QuestItemType; import forge.quest.bazaar.QuestPetController; +import forge.quest.data.DeckConstructionRules; import forge.quest.data.QuestAchievements; import forge.quest.data.QuestAssets; import forge.util.gui.SGuiChoose; @@ -51,6 +52,7 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; +import java.util.TreeSet; /** *

@@ -531,7 +533,17 @@ public class QuestUtil { Integer lifeHuman = null; boolean useBazaar = true; Boolean forceAnte = null; - int lifeAI = 20; + + //Generate a life modifier based on this quest's variant as held in the Quest Controller's DeckConstructionRules + int variantLifeModifier = 0; + + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: variantLifeModifier = 20; break; + } + + int lifeAI = 20 + variantLifeModifier; + if (event instanceof QuestEventChallenge) { final QuestEventChallenge qc = ((QuestEventChallenge) event); lifeAI = qc.getAILife(); @@ -545,8 +557,9 @@ public class QuestUtil { forceAnte = qc.isForceAnte(); } - final RegisteredPlayer humanStart = new RegisteredPlayer(getDeckForNewGame()); - final RegisteredPlayer aiStart = new RegisteredPlayer(event.getEventDeck()); + final RegisteredPlayer humanStart = getRegisteredPlayerByVariant(getDeckForNewGame()); + + final RegisteredPlayer aiStart = getRegisteredPlayerByVariant(event.getEventDeck()); if (lifeHuman != null) { humanStart.setStartingLife(lifeHuman); @@ -581,17 +594,39 @@ public class QuestUtil { rules.setGamesPerMatch(qData.getMatchLength()); rules.setManaBurn(FModel.getPreferences().getPrefBoolean(FPref.UI_MANABURN)); rules.setCanCloneUseTargetsImage(FModel.getPreferences().getPrefBoolean(FPref.UI_CLONE_MODE_SOURCE)); + + TreeSet variant = new TreeSet(); + if(FModel.getQuest().getDeckConstructionRules() == DeckConstructionRules.Commander){ + variant.add(GameType.Commander); + } + final HostedMatch hostedMatch = GuiBase.getInterface().hostMatch(); final IGuiGame gui = GuiBase.getInterface().getNewGuiGame(); gui.setPlayerAvatar(aiPlayer, event); FThreads.invokeInEdtNowOrLater(new Runnable(){ @Override public void run() { - hostedMatch.startMatch(rules, null, starter, ImmutableMap.of(humanStart, gui)); + hostedMatch.startMatch(rules, variant, starter, ImmutableMap.of(humanStart, gui)); } }); } + /** + * Uses the appropriate RegisteredPlayer command for generating a RegisteredPlayer based on this quest's variant as + * held by the QuestController's DeckConstructionRules. + * @param deck The deck to generate the RegisteredPlayer with + * @return A newly made RegisteredPlayer specific to the quest's variant + */ + private static RegisteredPlayer getRegisteredPlayerByVariant(Deck deck){ + switch (FModel.getQuest().getDeckConstructionRules()) { + case Default: + return new RegisteredPlayer(deck); + case Commander: + return RegisteredPlayer.forCommander(deck); + } + return null; + } + private static Deck getDeckForNewGame() { Deck deck = null; if (event instanceof QuestEventChallenge) { @@ -623,7 +658,7 @@ public class QuestUtil { } if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) { - final String errorMessage = GameType.Quest.getDeckFormat().getDeckConformanceProblem(deck); + final String errorMessage = getDeckConformanceProblems(deck); if (null != errorMessage) { SOptionPane.showErrorDialog("Your deck " + errorMessage + " Please edit or choose a different deck.", "Invalid Deck"); return false; @@ -633,6 +668,21 @@ public class QuestUtil { return true; } + public static String getDeckConformanceProblems(Deck deck){ + String errorMessage = GameType.Quest.getDeckFormat().getDeckConformanceProblem(deck);; + + if(errorMessage != null) return errorMessage; //return immediately if the deck does not conform to quest requirements + + //Check for all applicable deck construction rules per this quests's saved DeckConstructionRules enum + switch(FModel.getQuest().getDeckConstructionRules()){ + case Commander: + errorMessage = GameType.Commander.getDeckFormat().getDeckConformanceProblem(deck); + break; + } + + return errorMessage; + } + /** Duplicate in DeckEditorQuestMenu and * probably elsewhere...can streamline at some point * (probably shouldn't be here). diff --git a/forge-gui/src/main/java/forge/quest/QuestUtilCards.java b/forge-gui/src/main/java/forge/quest/QuestUtilCards.java index c8d77d863ad..54a4887ba8a 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtilCards.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtilCards.java @@ -308,10 +308,16 @@ public final class QuestUtilCards { * user preferences */ public void setupNewGameCardPool(final GameFormat formatStartingPool, final int idxDifficulty, final StartingPoolPreferences userPrefs) { + //Add additional cards to the starter card pool based on variant if applicable + double variantModifier = 0; + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: variantModifier = 2; break; + } - final int nC = questPreferences.getPrefInt(DifficultyPrefs.STARTING_COMMONS, idxDifficulty); - final int nU = questPreferences.getPrefInt(DifficultyPrefs.STARTING_UNCOMMONS, idxDifficulty); - final int nR = questPreferences.getPrefInt(DifficultyPrefs.STARTING_RARES, idxDifficulty); + final int nC = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_COMMONS, idxDifficulty) * variantModifier); + final int nU = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_UNCOMMONS, idxDifficulty) * variantModifier); + final int nR = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_RARES, idxDifficulty) * variantModifier); addAllCards(BoosterUtils.getQuestStarterDeck(formatStartingPool, nC, nU, nR, userPrefs)); diff --git a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java index 2e93e7d4fec..265ea61bb58 100644 --- a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java +++ b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java @@ -226,6 +226,11 @@ public class QuestWinLoseController { sb.append(StringUtils.capitalize(qEvent.getDifficulty().getTitle())); sb.append(" opponent: ").append(credBase).append(" credits.\n"); + if(qEvent.getIsRandomMatch()){ + sb.append("Random Opponent Bonus: " + credBase + " credit" + (credBase > 1 ? "s." : ".") + "\n"); + credBase += credBase; + } + final int winMultiplier = Math.min(qData.getAchievements().getWin(), FModel.getQuestPreferences().getPrefInt(QPref.REWARDS_WINS_MULTIPLIER_MAX)); final int creditsForPreviousWins = (int) ((Double.parseDouble(FModel.getQuestPreferences() .getPref(QPref.REWARDS_WINS_MULTIPLIER)) * winMultiplier)); diff --git a/forge-gui/src/main/java/forge/quest/QuestWorld.java b/forge-gui/src/main/java/forge/quest/QuestWorld.java index e20dcf98ce8..4c77b0ec515 100644 --- a/forge-gui/src/main/java/forge/quest/QuestWorld.java +++ b/forge-gui/src/main/java/forge/quest/QuestWorld.java @@ -40,6 +40,7 @@ public class QuestWorld implements Comparable{ private final String dir; private final GameFormatQuest format; public static final String STANDARDWORLDNAME = "Random Standard"; + public static final String RANDOMCOMMANDERWORLDNAME = "Random Commander"; private boolean isCustom; @@ -129,7 +130,6 @@ public class QuestWorld implements Comparable{ /** * TODO: Write javadoc for Constructor. * @param file0 - * @param keySelector0 */ public Reader(String file0) { super(file0, QuestWorld.FN_GET_NAME); @@ -194,6 +194,12 @@ public class QuestWorld implements Comparable{ FModel.getFormats().getStandard().getBannedCardNames(),false); } + if (useName.equalsIgnoreCase(QuestWorld.RANDOMCOMMANDERWORLDNAME)){ + useFormat = new GameFormatQuest(QuestWorld.RANDOMCOMMANDERWORLDNAME, + FModel.getFormats().getFormat("Commander").getAllowedSetCodes(), + FModel.getFormats().getFormat("Commander").getBannedCardNames(),false); + } + // System.out.println("Creating quest world " + useName + " (index " + useIdx + ", dir: " + useDir); // if (useFormat != null) { System.out.println("SETS: " + sets + "\nBANNED: " + bannedCards); } diff --git a/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java b/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java new file mode 100644 index 00000000000..3744beea09d --- /dev/null +++ b/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java @@ -0,0 +1,17 @@ +package forge.quest.data; + +/** + * Used to clarify which subformat a quest is using e.g. Commander. + * Auth. Imakuni + */ +public enum DeckConstructionRules { + /** + * Typically has no effect on Quest gameplay. + */ + Default, + + /** + * Commander ruleset. 99 card deck, no copies other than basic lands, commander(s) in Command zone + */ + Commander +} 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 616c49d937b..8f7b644641b 100644 --- a/forge-gui/src/main/java/forge/quest/data/QuestAssets.java +++ b/forge-gui/src/main/java/forge/quest/data/QuestAssets.java @@ -200,7 +200,14 @@ public class QuestAssets { * @return the life */ public int getLife(final QuestMode mode) { - final int base = mode.equals(QuestMode.Fantasy) ? 15 : 20; + int base = mode.equals(QuestMode.Fantasy) ? 15 : 20; + + //Modify life for the quest's sub-format, e.g.: Commander adds 20 + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: base += 20; + } + return (base + this.getItemLevel(QuestItemType.ELIXIR_OF_LIFE)) - this.getItemLevel(QuestItemType.POUND_FLESH); } diff --git a/forge-gui/src/main/java/forge/quest/data/QuestData.java b/forge-gui/src/main/java/forge/quest/data/QuestData.java index e6a75adef7d..41574634113 100644 --- a/forge-gui/src/main/java/forge/quest/data/QuestData.java +++ b/forge-gui/src/main/java/forge/quest/data/QuestData.java @@ -42,7 +42,7 @@ import java.util.Map; */ public final class QuestData { /** Holds the latest version of the Quest Data. */ - public static final int CURRENT_VERSION_NUMBER = 12; + public static final int CURRENT_VERSION_NUMBER = 13; // This field places the version number into QD instance, // but only when the object is created through the constructor @@ -70,6 +70,11 @@ public final class QuestData { public String currentDeck = "DEFAULT"; + /** + * Holds the subformat for this quest. Defaults to DeckConstructionRules.Default. + */ + public DeckConstructionRules deckConstructionRules = DeckConstructionRules.Default; + public QuestData() { //needed for XML serialization } @@ -87,9 +92,11 @@ public final class QuestData { * allow set unlocking during quest * @param startingWorld * starting world + * @param dcr + * deck construction rules e.g. Commander */ public QuestData(String name0, int diff, QuestMode mode0, GameFormat userFormat, - boolean allowSetUnlocks, final String startingWorld) { + boolean allowSetUnlocks, final String startingWorld, DeckConstructionRules dcr) { this.name = name0; if (userFormat != null) { @@ -99,6 +106,7 @@ public final class QuestData { this.achievements = new QuestAchievements(diff); this.assets = new QuestAssets(format); this.worldId = startingWorld; + this.deckConstructionRules = dcr; } /** diff --git a/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java b/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java index de680502e37..cd232367df9 100644 --- a/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java +++ b/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java @@ -223,10 +223,16 @@ public class QuestDataIO { // Current Deck moved from preferences to quest data - it should not be global for all quests!!! QuestDataIO.setFinalField(QuestData.class, "currentDeck", newData, FModel.getQuestPreferences().getPref(QPref.CURRENT_DECK)); } - if (saveVersion < 13) { + if(saveVersion < 13){ + //Update for quest DeckConstructionRules + //Add a DeckConstructionRules set to Default. + QuestDataIO.setFinalField(QuestData.class, "deckConstructionRules", newData, DeckConstructionRules.Default); + } + if (saveVersion < 14) { // Migrate DraftTournaments to use new Tournament class } + final QuestAssets qS = newData.getAssets(); final QuestAchievements qA = newData.getAchievements(); From 03cd56d2a97c77607d291cc54f9bcdd439fa338b Mon Sep 17 00:00:00 2001 From: imakunee Date: Sat, 3 Nov 2018 00:36:26 +0000 Subject: [PATCH 125/901] Revert "-CardPool" This reverts commit 37d9dc753f915853ecf1e17e1fea1b5feb7480bd --- .../src/main/java/forge/deck/CardPool.java | 14 -- .../src/main/java/forge/game/GameRules.java | 3 +- .../deckeditor/controllers/CEditorQuest.java | 145 +------------ .../screens/home/quest/CSubmenuQuestData.java | 10 +- .../screens/home/quest/VSubmenuQuestData.java | 28 +-- forge-gui/res/quest/world/worlds.txt | 1 - .../java/forge/quest/QuestController.java | 14 +- .../src/main/java/forge/quest/QuestEvent.java | 4 - .../forge/quest/QuestEventCommanderDuel.java | 19 -- .../quest/QuestEventCommanderDuelManager.java | 205 ------------------ .../main/java/forge/quest/QuestSpellShop.java | 17 +- .../src/main/java/forge/quest/QuestUtil.java | 60 +---- .../main/java/forge/quest/QuestUtilCards.java | 12 +- .../forge/quest/QuestWinLoseController.java | 5 - .../src/main/java/forge/quest/QuestWorld.java | 8 +- .../quest/data/DeckConstructionRules.java | 17 -- .../java/forge/quest/data/QuestAssets.java | 9 +- .../main/java/forge/quest/data/QuestData.java | 12 +- .../main/java/forge/quest/io/QuestDataIO.java | 8 +- 19 files changed, 33 insertions(+), 558 deletions(-) delete mode 100644 forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java delete mode 100644 forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java delete mode 100644 forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java diff --git a/forge-core/src/main/java/forge/deck/CardPool.java b/forge-core/src/main/java/forge/deck/CardPool.java index b484f31ab98..72ab8efb851 100644 --- a/forge-core/src/main/java/forge/deck/CardPool.java +++ b/forge-core/src/main/java/forge/deck/CardPool.java @@ -17,7 +17,6 @@ */ package forge.deck; -import com.google.common.base.Predicate; import com.google.common.collect.Lists; import forge.StaticData; import forge.card.CardDb; @@ -217,17 +216,4 @@ public class CardPool extends ItemPool { } return sb.toString(); } - - /** - * Applies a predicate to this CardPool's cards. - * @param predicate the Predicate to apply to this CardPool - * @return a new CardPool made from this CardPool with only the cards that agree with the provided Predicate - */ - public CardPool getFilteredPool(Predicate predicate){ - CardPool filteredPool = new CardPool(); - for(PaperCard pc : this.items.keySet()){ - if(predicate.apply(pc)) filteredPool.add(pc); - } - return filteredPool; - } } diff --git a/forge-game/src/main/java/forge/game/GameRules.java b/forge-game/src/main/java/forge/game/GameRules.java index 5e6876e9801..dc7ed4cddf1 100644 --- a/forge-game/src/main/java/forge/game/GameRules.java +++ b/forge-game/src/main/java/forge/game/GameRules.java @@ -78,8 +78,7 @@ public class GameRules { } public boolean hasCommander() { - return appliedVariants.contains(GameType.Commander) - || appliedVariants.contains(GameType.TinyLeaders) + return appliedVariants.contains(GameType.Commander) || appliedVariants.contains(GameType.TinyLeaders) || appliedVariants.contains(GameType.Brawl); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java index b7842272e42..c33da12cda7 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java @@ -18,20 +18,11 @@ package forge.screens.deckeditor.controllers; import com.google.common.base.Function; -import com.google.common.base.Predicate; -import com.google.common.base.Predicates; import com.google.common.base.Supplier; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; import forge.UiCommand; -import forge.card.CardRules; -import forge.card.CardRulesPredicates; -import forge.card.ColorSet; -import forge.card.mana.ManaCost; import forge.deck.CardPool; import forge.deck.Deck; import forge.deck.DeckSection; -import forge.deck.generation.DeckGeneratorBase; import forge.gui.GuiUtils; import forge.gui.framework.DragCell; import forge.gui.framework.FScreen; @@ -44,7 +35,6 @@ import forge.itemmanager.views.ItemTableColumn; import forge.model.FModel; import forge.properties.ForgePreferences.FPref; import forge.quest.QuestController; -import forge.quest.data.DeckConstructionRules; import forge.screens.deckeditor.AddBasicLandsDialog; import forge.screens.deckeditor.SEditorIO; import forge.screens.deckeditor.views.VAllDecks; @@ -58,7 +48,6 @@ import forge.util.ItemPool; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.awt.print.Paper; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -114,14 +103,6 @@ public final class CEditorQuest extends CDeckEditor { allSections.add(DeckSection.Main); allSections.add(DeckSection.Sideboard); - //Add sub-format specific sections - switch(FModel.getQuest().getDeckConstructionRules()){ - case Default: break; - case Commander: - allSections.add(DeckSection.Commander); - break; - } - this.questData = questData0; final CardManager catalogManager = new CardManager(cDetailPicture, false, true); @@ -177,10 +158,6 @@ public final class CEditorQuest extends CDeckEditor { @Override protected CardLimit getCardLimit() { if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) { - //If this is a commander quest, only allow single copies of cards - if(FModel.getQuest().getDeckConstructionRules() == DeckConstructionRules.Commander){ - return CardLimit.Singleton; - } return CardLimit.Default; } return CardLimit.None; //if not enforcing deck legality, don't enforce default limit @@ -268,98 +245,16 @@ public final class CEditorQuest extends CDeckEditor { public void resetTables() { this.sectionMode = DeckSection.Main; - // show cards, makes this user friendly - this.getCatalogManager().setPool(getRemainingCardPool()); - this.getDeckManager().setPool(getDeck().getMain()); - } + final Deck deck = this.controller.getModel(); - /*** - * Provides the pool of cards the player has available to add to his or her deck. Also manages showing available cards - * to choose from for special deck construction rules, e.g.: Commander. - * @return CardPool of cards available to add to the player's deck. - */ - private CardPool getRemainingCardPool(){ final CardPool cardpool = getInitialCatalog(); - // remove bottom cards that are in the deck from the card pool - cardpool.removeAll(getDeck().getMain()); - + cardpool.removeAll(deck.getMain()); // remove sideboard cards from the catalog - cardpool.removeAll(getDeck().getOrCreate(DeckSection.Sideboard)); - - switch(FModel.getQuest().getDeckConstructionRules()){ - case Default: break; - case Commander: - //remove this deck's currently selected commander(s) from the catalog - cardpool.removeAll(getDeck().getOrCreate(DeckSection.Commander)); - - //TODO: Only thin if deck conformance is being applied - if(getDeck().getOrCreate(DeckSection.Commander).toFlatList().size() > 0) { - Predicate identityPredicate = new MatchCommanderColorIdentity(getDeckColorIdentity()); - CardPool filteredPool = cardpool.getFilteredPool(identityPredicate); - - return filteredPool; - } - break; - } - - return cardpool; - } - - /** - * Predicate that filters out based on a color identity provided upon instantiation. Used to filter the card - * list when a commander is chosen so the user can more easily see what cards are available for his or her deck - * and avoid making additions that are not legal. - */ - public static class MatchCommanderColorIdentity implements Predicate { - private final ColorSet allowedColor; - - public MatchCommanderColorIdentity(ColorSet color) { - allowedColor = color; - } - - @Override - public boolean apply(PaperCard subject) { - CardRules cr = subject.getRules(); - ManaCost mc = cr.getManaCost(); - return !mc.isPureGeneric() && allowedColor.containsAllColorsFrom(cr.getColorIdentity().getColor()); - } - } - - /** - * Compiles the color identity of the loaded deck based on the commanders. - * @return A ColorSet containing the color identity of the currently loaded deck. - */ - public ColorSet getDeckColorIdentity(){ - - List commanders = getDeck().getOrCreate(DeckSection.Commander).toFlatList(); - List colors = new ArrayList<>(); - - //Return early if there are no current commanders - if(commanders.size() == 0) return ColorSet.fromNames(colors); - - //For each commander,add each color of its color identity if not already added - for(PaperCard pc : commanders){ - if(!colors.contains("w") && pc.getRules().getColorIdentity().hasWhite()) colors.add("w"); - if(!colors.contains("u") && pc.getRules().getColorIdentity().hasBlue()) colors.add("u"); - if(!colors.contains("b") && pc.getRules().getColorIdentity().hasBlack()) colors.add("b"); - if(!colors.contains("r") && pc.getRules().getColorIdentity().hasRed()) colors.add("r"); - if(!colors.contains("g") && pc.getRules().getColorIdentity().hasGreen()) colors.add("g"); - } - - return ColorSet.fromNames(colors); - } - - /* - Used to make the code more readable in game terms. - */ - private Deck getDeck(){ - return this.controller.getModel(); - } - - private ItemPool getCommanderCardPool(){ - Predicate commanderPredicate = Predicates.compose(CardRulesPredicates.Presets.CAN_BE_COMMANDER, PaperCard.FN_GET_RULES); - return getRemainingCardPool().getFilteredPool(commanderPredicate); + cardpool.removeAll(deck.getOrCreate(DeckSection.Sideboard)); + // show cards, makes this user friendly + this.getCatalogManager().setPool(cardpool); + this.getDeckManager().setPool(deck.getMain()); } @Override @@ -385,30 +280,14 @@ public final class CEditorQuest extends CDeckEditor { } /** - * Switch between the main deck and the sideboard/Command Zone editor. + * Switch between the main deck and the sideboard editor. */ public void setEditorMode(DeckSection sectionMode) { - //Fixes null pointer error on switching tabs while quest deck editor is open. TODO: Find source of bug possibly? - if(sectionMode == null) sectionMode = DeckSection.Main; - - //Based on which section the editor is in, display the remaining card pool (or applicable card pool if in - //Commander) and the current section's cards - switch(sectionMode){ - case Main : - this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); - this.getCatalogManager().setPool(getRemainingCardPool()); - this.getDeckManager().setPool(this.controller.getModel().getMain()); - break; - case Sideboard : - this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); - this.getCatalogManager().setPool(getRemainingCardPool()); - this.getDeckManager().setPool(getDeck().getOrCreate(DeckSection.Sideboard)); - break; - case Commander : - this.getCatalogManager().setup(ItemManagerConfig.COMMANDER_POOL); - this.getCatalogManager().setPool(getCommanderCardPool()); - this.getDeckManager().setPool(getDeck().getOrCreate(DeckSection.Commander)); - break; + if (sectionMode == DeckSection.Sideboard) { + this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Sideboard)); + } + else { + this.getDeckManager().setPool(this.controller.getModel().getMain()); } this.sectionMode = sectionMode; diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java index 8aa76293b55..131805b738b 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java @@ -10,7 +10,6 @@ import forge.model.FModel; import forge.properties.ForgeConstants; import forge.quest.*; import forge.quest.StartingPoolPreferences.PoolType; -import forge.quest.data.DeckConstructionRules; import forge.quest.data.GameFormatQuest; import forge.quest.data.QuestData; import forge.quest.data.QuestPreferences.QPref; @@ -341,16 +340,9 @@ public enum CSubmenuQuestData implements ICDoc { break; } - //Apply the appropriate deck construction rules for this quest - DeckConstructionRules dcr = DeckConstructionRules.Default; - - if(VSubmenuQuestData.SINGLETON_INSTANCE.isCommander()){ - dcr = DeckConstructionRules.Commander; - } - final QuestController qc = FModel.getQuest(); - qc.newGame(questName, difficulty, mode, fmtPrizes, view.isUnlockSetsAllowed(), dckStartPool, fmtStartPool, view.getStartingWorldName(), userPrefs, dcr); + qc.newGame(questName, difficulty, mode, fmtPrizes, view.isUnlockSetsAllowed(), dckStartPool, fmtStartPool, view.getStartingWorldName(), userPrefs); FModel.getQuest().save(); // Save in preferences. diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java index 70e284faf3d..9eee9e58ca3 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java @@ -62,7 +62,6 @@ public enum VSubmenuQuestData implements IVSubmenu { private final FRadioButton radHard = new FRadioButton("Hard"); private final FRadioButton radExpert = new FRadioButton("Expert"); private final FCheckBox boxFantasy = new FCheckBox("Fantasy Mode"); - private final FCheckBox boxCommander = new FCheckBox("Commander Subformat"); private final FLabel lblStartingWorld = new FLabel.Builder().text("Starting world:").build(); private final FComboBoxWrapper cbxStartingWorld = new FComboBoxWrapper<>(); @@ -275,25 +274,9 @@ public enum VSubmenuQuestData implements IVSubmenu { } }); - // Fantasy box selected by Default + // Fantasy box enabled by Default boxFantasy.setSelected(true); boxFantasy.setEnabled(true); - - // Commander box unselected by Default - boxCommander.setSelected(false); - boxCommander.setEnabled(true); - - boxCommander.addActionListener( - new ActionListener(){ - public void actionPerformed(ActionEvent e){ - if(!isCommander()) return; //do nothing if unselecting Commander Subformat - //Otherwise, set the starting world to Random Commander - cbxStartingWorld.setSelectedItem(FModel.getWorlds().get("Random Commander")); - } - } - - ); - boxCompleteSet.setEnabled(true); boxAllowDuplicates.setEnabled(true); @@ -303,7 +286,6 @@ public enum VSubmenuQuestData implements IVSubmenu { final JPanel pnlDifficultyMode = new JPanel(new MigLayout("insets 0, gap 1%, flowy")); pnlDifficultyMode.add(difficultyPanel, "gapright 4%"); pnlDifficultyMode.add(boxFantasy, "h 25px!, gapbottom 15, gapright 4%"); - pnlDifficultyMode.add(boxCommander, "h 25px!, gapbottom 15, gapright 4%"); pnlDifficultyMode.add(lblStartingWorld, "h 25px!, hidemode 3"); cbxStartingWorld.addTo(pnlDifficultyMode, "h 27px!, w 40%, pushx, gapbottom 7"); pnlDifficultyMode.setOpaque(false); @@ -505,14 +487,6 @@ public enum VSubmenuQuestData implements IVSubmenu { return boxFantasy.isSelected(); } - /** - * Auth. Imakuni - * @return True if the "Commander Subformat" check box is selected. - */ - public boolean isCommander() { - return boxCommander.isSelected(); - } - public boolean startWithCompleteSet() { return boxCompleteSet.isSelected(); } diff --git a/forge-gui/res/quest/world/worlds.txt b/forge-gui/res/quest/world/worlds.txt index 5d99427d535..b08931cde59 100644 --- a/forge-gui/res/quest/world/worlds.txt +++ b/forge-gui/res/quest/world/worlds.txt @@ -1,6 +1,5 @@ Name:Main world Name:Random Standard -Name:Random Commander Name:Amonkhet|Dir:Amonkhet|Sets:AKH, HOU Name:Jamuraa|Dir:jamuraa|Sets:5ED, ARN, MIR, VIS, WTH|Banned:Chaos Orb; Falling Star Name:Kamigawa|Dir:2004 Kamigawa|Sets:CHK, BOK, SOK diff --git a/forge-gui/src/main/java/forge/quest/QuestController.java b/forge-gui/src/main/java/forge/quest/QuestController.java index 5366f7200bc..0d306f4431a 100644 --- a/forge-gui/src/main/java/forge/quest/QuestController.java +++ b/forge-gui/src/main/java/forge/quest/QuestController.java @@ -276,10 +276,9 @@ public class QuestController { public void newGame(final String name, final int difficulty, final QuestMode mode, final GameFormat formatPrizes, final boolean allowSetUnlocks, final Deck startingCards, final GameFormat formatStartingPool, - final String startingWorld, final StartingPoolPreferences userPrefs, - DeckConstructionRules dcr) { + final String startingWorld, final StartingPoolPreferences userPrefs) { - this.load(new QuestData(name, difficulty, mode, formatPrizes, allowSetUnlocks, startingWorld, dcr)); // pass awards and unlocks here + this.load(new QuestData(name, difficulty, mode, formatPrizes, allowSetUnlocks, startingWorld)); // pass awards and unlocks here if (startingCards != null) { this.myCards.addDeck(startingCards); @@ -436,12 +435,6 @@ public class QuestController { QuestWorld world = getWorld(); String path = ForgeConstants.DEFAULT_CHALLENGES_DIR; - //Use a variant specialized duel manager if this is a variant quest - switch(FModel.getQuest().getDeckConstructionRules()){ - case Default: break; - case Commander: this.duelManager = new QuestEventCommanderDuelManager(); return; - } - if (world != null) { if (world.getName().equals(QuestWorld.STANDARDWORLDNAME)) { @@ -456,6 +449,7 @@ public class QuestController { } this.duelManager = new QuestEventDuelManager(new File(path)); + } public HashSet GetRating() { @@ -613,6 +607,4 @@ public class QuestController { public void setCurrentDeck(String s) { model.currentDeck = s; } - - public DeckConstructionRules getDeckConstructionRules(){return model.deckConstructionRules;} } diff --git a/forge-gui/src/main/java/forge/quest/QuestEvent.java b/forge-gui/src/main/java/forge/quest/QuestEvent.java index 2a9bf6c1b63..00a140c80e2 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEvent.java +++ b/forge-gui/src/main/java/forge/quest/QuestEvent.java @@ -48,7 +48,6 @@ public abstract class QuestEvent implements IQuestEvent { private String profile = "Default"; // Opponent name if different from the challenge name private String opponentName = null; - private boolean isRandomMatch = false; public static final Function FN_GET_NAME = new Function() { @@ -175,7 +174,4 @@ public abstract class QuestEvent implements IQuestEvent { this.showDifficulty = showDifficulty; } - public boolean getIsRandomMatch(){return isRandomMatch;} - - public void setIsRandomMatch(boolean b){isRandomMatch = b;} } diff --git a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java deleted file mode 100644 index 1d7924a04d7..00000000000 --- a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java +++ /dev/null @@ -1,19 +0,0 @@ -package forge.quest; - -import forge.deck.DeckProxy; - -/** - * A QuestEventDuel with a CommanderDeckGenerator used exclusively within QuestEventCommanderDuelManager for the - * creation of randomly generated Commander decks in a Commander variant quest. - * Auth. Imakuni & Forge - */ -public class QuestEventCommanderDuel extends QuestEventDuel{ - /** - * The CommanderDeckGenerator for this duel. - */ - private DeckProxy deckProxy; - - public DeckProxy getDeckProxy() {return deckProxy;} - - public void setDeckProxy(DeckProxy dp) {deckProxy = dp;} -} diff --git a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java deleted file mode 100644 index 384d9d11d77..00000000000 --- a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java +++ /dev/null @@ -1,205 +0,0 @@ -package forge.quest; - -import forge.deck.*; -import forge.item.PaperCard; -import forge.model.FModel; -import forge.quest.data.QuestPreferences; -import forge.util.CollectionSuppliers; -import forge.util.MyRandom; -import forge.util.maps.EnumMapOfLists; -import forge.util.maps.MapOfLists; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/** - * Manages the creation of random Commander duels for a Commander variant quest. Random generation is handled via - * the CommanderDeckGenerator class. - * Auth. Forge & Imakuni#8015 - */ -public class QuestEventCommanderDuelManager implements QuestEventDuelManagerInterface { - /** - * The list of all possible Commander variant duels. - */ - private ArrayList commanderDuels = new ArrayList<>(); - - /** - * Contains the expert deck lists for the commanders. - */ - private List expertCommanderDecks; - - /** - * Immediately calls assembleDuels() to setup the commanderDuels variable. - */ - public QuestEventCommanderDuelManager(){ - assembleDuels(); - } - - /** - * Assembles the list of all possible Commander duels via CommanderDeckGenerator. Should be done within constructor. - */ - private void assembleDuels(){ - //isCardGen = true seemed to make slightly more difficult decks based purely on experience with a very small sample size. - //Gotta work on this more, its making pretty average decks after further testing. - expertCommanderDecks = CommanderDeckGenerator.getCommanderDecks(DeckFormat.Commander, true, true); - - List generatedDuels = CommanderDeckGenerator.getCommanderDecks(DeckFormat.Commander, true, false); - - for(DeckProxy dp : generatedDuels){ - QuestEventCommanderDuel duel = new QuestEventCommanderDuel(); - - duel.setDescription("Randomly generated " + dp.getName() + " commander deck."); - duel.setName(dp.getName()); - duel.setTitle(dp.getName()); - duel.setOpponentName(dp.getName()); - duel.setDifficulty(QuestEventDifficulty.EASY); - duel.setDeckProxy(dp); - - //Setting a blank deck avoids a null pointer exception. The deck is generated in generateDuels() to avoid long load times. - duel.setEventDeck(new Deck()); - - commanderDuels.add(duel); - } - } - - /** - * Retrieve list of all possible Commander duels. - * @return ArrayList containing all possible Commander duels. - */ - public Iterable getAllDuels() { - return commanderDuels; - } - - /** - * Retrieve list of all possible Commander duels. - * @param difficulty Currently unused - * @return ArrayList containing all possible Commander duels. - */ - public Iterable getDuels(QuestEventDifficulty difficulty){ - return commanderDuels; - } - - /** - * Composes an ArrayList containing 4 QuestEventDuels composed with Commander variant decks. One duel will have its - * title replaced as Random. - * @return ArrayList of QuestEventDuels containing 4 duels. - */ - public List generateDuels(){ - final List duelOpponents = new ArrayList<>(); - - //While there are less than 4 duels chosen - while(duelOpponents.size() < 4){ - //Get a random duel from the possible duels list - QuestEventCommanderDuel duel = (QuestEventCommanderDuel)commanderDuels.get(((int) (commanderDuels.size() * MyRandom.getRandom().nextDouble()))); - - //If the chosen duels list already contains this duel, get a different duel to prevent duplicate duels - if(duelOpponents.contains(duel)) continue; - - //Add the randomly chosen duel to the duel list - duelOpponents.add(duel); - - //Here the actual deck for this commander is generated by calling .getDeck() on the saved DeckProxy - duel.setEventDeck(duel.getDeckProxy().getDeck()); - - //Modify deck for difficulty - modifyDuelForDifficulty(duel); - - - } - - //Modify the stats of the final duel to hide the opponent, creating a "random" duel. - //We make a copy of the final duel and overwrite it in the duelOpponents to avoid changing the variables in - //the original duel, which gets reused. - QuestEventCommanderDuel duel = (QuestEventCommanderDuel)duelOpponents.get(duelOpponents.size() - 1); - QuestEventCommanderDuel randomDuel = new QuestEventCommanderDuel(); - - randomDuel.setName(duel.getName()); - randomDuel.setOpponentName(duel.getName()); - randomDuel.setDeckProxy(duel.getDeckProxy()); - randomDuel.setTitle("Random Opponent"); - randomDuel.setShowDifficulty(false); - randomDuel.setDescription("Fight a random generated commander opponent."); - randomDuel.setIsRandomMatch(true); - randomDuel.setEventDeck(duel.getEventDeck()); - - //Replace the final duel with this newly modified "random" duel - duelOpponents.set(duelOpponents.size()-1, randomDuel); - - return duelOpponents; - } - - /** - * Retrieves the expert level deck generation of a deck with the same commander as the provided DeckProxy. - * @param dp The easy generation commander deck - * @return The same commander's expert generation DeckProxy - */ - private Deck getExpertGenDeck(DeckProxy dp){ - for(QuestEventDuel qed : commanderDuels){ - QuestEventCommanderDuel cmdQED = (QuestEventCommanderDuel)qed; - if(cmdQED.getDeckProxy().getName().equals(dp.getName())){ - return cmdQED.getDeckProxy().getDeck(); - } - } - return null; - } - - /** - * Modifies a given duel by replacing a percentage of the deck with random cards from the more difficult generated version - * of the same commander's deck. Medium replaces 30%, Hard replaces 60%, Expert replaces 100%. - * @param duel The QuestEventCommanderDuel to modify - */ - private void modifyDuelForDifficulty(QuestEventCommanderDuel duel){ - final QuestPreferences questPreferences = FModel.getQuestPreferences(); - final int index = FModel.getQuest().getAchievements().getDifficulty(); - final int numberOfWins = FModel.getQuest().getAchievements().getWin(); - Deck expertDeck = getExpertGenDeck(duel.getDeckProxy()); - - int difficultyReplacementPercent = 0; - - //Note: The code is ordered to make the least number of comparisons I could think of at the time for speed reasons. - //In reality, it shouldn't really make much difference, but why not? - if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_EXPERTAI, index)) { - //At expert, the deck is replaced with the entire expert deck, and we can return immediately - duel.setEventDeck(expertDeck); - duel.setDifficulty(QuestEventDifficulty.EXPERT); - return; - } - - if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_MEDIUMAI, index)) { - difficultyReplacementPercent += 30; - duel.setDifficulty(QuestEventDifficulty.MEDIUM); - } else return; //return early here since it would be an easy opponent with no changes - - if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_HARDAI, index)) { - difficultyReplacementPercent += 30; - duel.setDifficulty(QuestEventDifficulty.HARD); - } - - CardPool easyMain = duel.getEventDeck().getMain(); - CardPool expertMain = expertDeck.getMain(); - - List easyList = easyMain.toFlatList(); - List expertList = expertMain.toFlatList(); - - //Replace cards in the easy deck with cards from the expert deck up to the difficulty replacement percent - for(int i = 0; i < difficultyReplacementPercent; i++){ - if(!easyMain.contains(expertList.get(i))) { //ensure that the card being copied over isn't already in the deck - easyMain.remove(easyList.get(i)); - easyMain.add(expertList.get(i)); - } - else{ - expertList.remove(expertList.get(i)); - i--; - if(expertList.size() == 0) break; //break if there are no more cards to copy over - } - } - } - - /** - * Randomizes the list of Commander Duels. - */ - public void randomizeOpponents(){ - Collections.shuffle(commanderDuels); - } -} diff --git a/forge-gui/src/main/java/forge/quest/QuestSpellShop.java b/forge-gui/src/main/java/forge/quest/QuestSpellShop.java index 96eae768963..e9196e417df 100644 --- a/forge-gui/src/main/java/forge/quest/QuestSpellShop.java +++ b/forge-gui/src/main/java/forge/quest/QuestSpellShop.java @@ -344,24 +344,11 @@ public class QuestSpellShop { List> cardsToRemove = new LinkedList<>(); for (Entry item : inventoryManager.getPool()) { PaperCard card = (PaperCard)item.getKey(); - //Number of a particular card to keep - int numToKeep = 4; - - if(card.getRules().getType().isBasic()){ - numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_BASIC_LAND_SIZE); - } else{ - //Choose card limit restrictions based on deck construction rules, e.g.: Commander allows only singletons - switch(FModel.getQuest().getDeckConstructionRules()){ - case Default: numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_SIZE); break; - case Commander: numToKeep = 1; - } - } - - //If this card has an exception to the card limit, e.g.: Relentless Rats, get the quest preference + int numToKeep = card.getRules().getType().isBasic() ? + FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_BASIC_LAND_SIZE) : FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_SIZE); if (DeckFormat.getLimitExceptions().contains(card.getName())) { numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_ANY_NUMBER_SIZE); } - if (numToKeep < item.getValue()) { cardsToRemove.add(Pair.of(item.getKey(), item.getValue() - numToKeep)); } diff --git a/forge-gui/src/main/java/forge/quest/QuestUtil.java b/forge-gui/src/main/java/forge/quest/QuestUtil.java index 7ad6b6cd335..c2fe796ef7b 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtil.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtil.java @@ -41,7 +41,6 @@ import forge.properties.ForgePreferences.FPref; import forge.quest.bazaar.IQuestBazaarItem; import forge.quest.bazaar.QuestItemType; import forge.quest.bazaar.QuestPetController; -import forge.quest.data.DeckConstructionRules; import forge.quest.data.QuestAchievements; import forge.quest.data.QuestAssets; import forge.util.gui.SGuiChoose; @@ -52,7 +51,6 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; -import java.util.TreeSet; /** *

@@ -533,17 +531,7 @@ public class QuestUtil { Integer lifeHuman = null; boolean useBazaar = true; Boolean forceAnte = null; - - //Generate a life modifier based on this quest's variant as held in the Quest Controller's DeckConstructionRules - int variantLifeModifier = 0; - - switch(FModel.getQuest().getDeckConstructionRules()){ - case Default: break; - case Commander: variantLifeModifier = 20; break; - } - - int lifeAI = 20 + variantLifeModifier; - + int lifeAI = 20; if (event instanceof QuestEventChallenge) { final QuestEventChallenge qc = ((QuestEventChallenge) event); lifeAI = qc.getAILife(); @@ -557,9 +545,8 @@ public class QuestUtil { forceAnte = qc.isForceAnte(); } - final RegisteredPlayer humanStart = getRegisteredPlayerByVariant(getDeckForNewGame()); - - final RegisteredPlayer aiStart = getRegisteredPlayerByVariant(event.getEventDeck()); + final RegisteredPlayer humanStart = new RegisteredPlayer(getDeckForNewGame()); + final RegisteredPlayer aiStart = new RegisteredPlayer(event.getEventDeck()); if (lifeHuman != null) { humanStart.setStartingLife(lifeHuman); @@ -594,39 +581,17 @@ public class QuestUtil { rules.setGamesPerMatch(qData.getMatchLength()); rules.setManaBurn(FModel.getPreferences().getPrefBoolean(FPref.UI_MANABURN)); rules.setCanCloneUseTargetsImage(FModel.getPreferences().getPrefBoolean(FPref.UI_CLONE_MODE_SOURCE)); - - TreeSet variant = new TreeSet(); - if(FModel.getQuest().getDeckConstructionRules() == DeckConstructionRules.Commander){ - variant.add(GameType.Commander); - } - final HostedMatch hostedMatch = GuiBase.getInterface().hostMatch(); final IGuiGame gui = GuiBase.getInterface().getNewGuiGame(); gui.setPlayerAvatar(aiPlayer, event); FThreads.invokeInEdtNowOrLater(new Runnable(){ @Override public void run() { - hostedMatch.startMatch(rules, variant, starter, ImmutableMap.of(humanStart, gui)); + hostedMatch.startMatch(rules, null, starter, ImmutableMap.of(humanStart, gui)); } }); } - /** - * Uses the appropriate RegisteredPlayer command for generating a RegisteredPlayer based on this quest's variant as - * held by the QuestController's DeckConstructionRules. - * @param deck The deck to generate the RegisteredPlayer with - * @return A newly made RegisteredPlayer specific to the quest's variant - */ - private static RegisteredPlayer getRegisteredPlayerByVariant(Deck deck){ - switch (FModel.getQuest().getDeckConstructionRules()) { - case Default: - return new RegisteredPlayer(deck); - case Commander: - return RegisteredPlayer.forCommander(deck); - } - return null; - } - private static Deck getDeckForNewGame() { Deck deck = null; if (event instanceof QuestEventChallenge) { @@ -658,7 +623,7 @@ public class QuestUtil { } if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) { - final String errorMessage = getDeckConformanceProblems(deck); + final String errorMessage = GameType.Quest.getDeckFormat().getDeckConformanceProblem(deck); if (null != errorMessage) { SOptionPane.showErrorDialog("Your deck " + errorMessage + " Please edit or choose a different deck.", "Invalid Deck"); return false; @@ -668,21 +633,6 @@ public class QuestUtil { return true; } - public static String getDeckConformanceProblems(Deck deck){ - String errorMessage = GameType.Quest.getDeckFormat().getDeckConformanceProblem(deck);; - - if(errorMessage != null) return errorMessage; //return immediately if the deck does not conform to quest requirements - - //Check for all applicable deck construction rules per this quests's saved DeckConstructionRules enum - switch(FModel.getQuest().getDeckConstructionRules()){ - case Commander: - errorMessage = GameType.Commander.getDeckFormat().getDeckConformanceProblem(deck); - break; - } - - return errorMessage; - } - /** Duplicate in DeckEditorQuestMenu and * probably elsewhere...can streamline at some point * (probably shouldn't be here). diff --git a/forge-gui/src/main/java/forge/quest/QuestUtilCards.java b/forge-gui/src/main/java/forge/quest/QuestUtilCards.java index 54a4887ba8a..c8d77d863ad 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtilCards.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtilCards.java @@ -308,16 +308,10 @@ public final class QuestUtilCards { * user preferences */ public void setupNewGameCardPool(final GameFormat formatStartingPool, final int idxDifficulty, final StartingPoolPreferences userPrefs) { - //Add additional cards to the starter card pool based on variant if applicable - double variantModifier = 0; - switch(FModel.getQuest().getDeckConstructionRules()){ - case Default: break; - case Commander: variantModifier = 2; break; - } - final int nC = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_COMMONS, idxDifficulty) * variantModifier); - final int nU = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_UNCOMMONS, idxDifficulty) * variantModifier); - final int nR = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_RARES, idxDifficulty) * variantModifier); + final int nC = questPreferences.getPrefInt(DifficultyPrefs.STARTING_COMMONS, idxDifficulty); + final int nU = questPreferences.getPrefInt(DifficultyPrefs.STARTING_UNCOMMONS, idxDifficulty); + final int nR = questPreferences.getPrefInt(DifficultyPrefs.STARTING_RARES, idxDifficulty); addAllCards(BoosterUtils.getQuestStarterDeck(formatStartingPool, nC, nU, nR, userPrefs)); diff --git a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java index 265ea61bb58..2e93e7d4fec 100644 --- a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java +++ b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java @@ -226,11 +226,6 @@ public class QuestWinLoseController { sb.append(StringUtils.capitalize(qEvent.getDifficulty().getTitle())); sb.append(" opponent: ").append(credBase).append(" credits.\n"); - if(qEvent.getIsRandomMatch()){ - sb.append("Random Opponent Bonus: " + credBase + " credit" + (credBase > 1 ? "s." : ".") + "\n"); - credBase += credBase; - } - final int winMultiplier = Math.min(qData.getAchievements().getWin(), FModel.getQuestPreferences().getPrefInt(QPref.REWARDS_WINS_MULTIPLIER_MAX)); final int creditsForPreviousWins = (int) ((Double.parseDouble(FModel.getQuestPreferences() .getPref(QPref.REWARDS_WINS_MULTIPLIER)) * winMultiplier)); diff --git a/forge-gui/src/main/java/forge/quest/QuestWorld.java b/forge-gui/src/main/java/forge/quest/QuestWorld.java index 4c77b0ec515..e20dcf98ce8 100644 --- a/forge-gui/src/main/java/forge/quest/QuestWorld.java +++ b/forge-gui/src/main/java/forge/quest/QuestWorld.java @@ -40,7 +40,6 @@ public class QuestWorld implements Comparable{ private final String dir; private final GameFormatQuest format; public static final String STANDARDWORLDNAME = "Random Standard"; - public static final String RANDOMCOMMANDERWORLDNAME = "Random Commander"; private boolean isCustom; @@ -130,6 +129,7 @@ public class QuestWorld implements Comparable{ /** * TODO: Write javadoc for Constructor. * @param file0 + * @param keySelector0 */ public Reader(String file0) { super(file0, QuestWorld.FN_GET_NAME); @@ -194,12 +194,6 @@ public class QuestWorld implements Comparable{ FModel.getFormats().getStandard().getBannedCardNames(),false); } - if (useName.equalsIgnoreCase(QuestWorld.RANDOMCOMMANDERWORLDNAME)){ - useFormat = new GameFormatQuest(QuestWorld.RANDOMCOMMANDERWORLDNAME, - FModel.getFormats().getFormat("Commander").getAllowedSetCodes(), - FModel.getFormats().getFormat("Commander").getBannedCardNames(),false); - } - // System.out.println("Creating quest world " + useName + " (index " + useIdx + ", dir: " + useDir); // if (useFormat != null) { System.out.println("SETS: " + sets + "\nBANNED: " + bannedCards); } diff --git a/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java b/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java deleted file mode 100644 index 3744beea09d..00000000000 --- a/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java +++ /dev/null @@ -1,17 +0,0 @@ -package forge.quest.data; - -/** - * Used to clarify which subformat a quest is using e.g. Commander. - * Auth. Imakuni - */ -public enum DeckConstructionRules { - /** - * Typically has no effect on Quest gameplay. - */ - Default, - - /** - * Commander ruleset. 99 card deck, no copies other than basic lands, commander(s) in Command zone - */ - Commander -} 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..616c49d937b 100644 --- a/forge-gui/src/main/java/forge/quest/data/QuestAssets.java +++ b/forge-gui/src/main/java/forge/quest/data/QuestAssets.java @@ -200,14 +200,7 @@ public class QuestAssets { * @return the life */ public int getLife(final QuestMode mode) { - int base = mode.equals(QuestMode.Fantasy) ? 15 : 20; - - //Modify life for the quest's sub-format, e.g.: Commander adds 20 - switch(FModel.getQuest().getDeckConstructionRules()){ - case Default: break; - case Commander: base += 20; - } - + final int base = mode.equals(QuestMode.Fantasy) ? 15 : 20; return (base + this.getItemLevel(QuestItemType.ELIXIR_OF_LIFE)) - this.getItemLevel(QuestItemType.POUND_FLESH); } diff --git a/forge-gui/src/main/java/forge/quest/data/QuestData.java b/forge-gui/src/main/java/forge/quest/data/QuestData.java index 41574634113..e6a75adef7d 100644 --- a/forge-gui/src/main/java/forge/quest/data/QuestData.java +++ b/forge-gui/src/main/java/forge/quest/data/QuestData.java @@ -42,7 +42,7 @@ import java.util.Map; */ public final class QuestData { /** Holds the latest version of the Quest Data. */ - public static final int CURRENT_VERSION_NUMBER = 13; + public static final int CURRENT_VERSION_NUMBER = 12; // This field places the version number into QD instance, // but only when the object is created through the constructor @@ -70,11 +70,6 @@ public final class QuestData { public String currentDeck = "DEFAULT"; - /** - * Holds the subformat for this quest. Defaults to DeckConstructionRules.Default. - */ - public DeckConstructionRules deckConstructionRules = DeckConstructionRules.Default; - public QuestData() { //needed for XML serialization } @@ -92,11 +87,9 @@ public final class QuestData { * allow set unlocking during quest * @param startingWorld * starting world - * @param dcr - * deck construction rules e.g. Commander */ public QuestData(String name0, int diff, QuestMode mode0, GameFormat userFormat, - boolean allowSetUnlocks, final String startingWorld, DeckConstructionRules dcr) { + boolean allowSetUnlocks, final String startingWorld) { this.name = name0; if (userFormat != null) { @@ -106,7 +99,6 @@ public final class QuestData { this.achievements = new QuestAchievements(diff); this.assets = new QuestAssets(format); this.worldId = startingWorld; - this.deckConstructionRules = dcr; } /** diff --git a/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java b/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java index cd232367df9..de680502e37 100644 --- a/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java +++ b/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java @@ -223,16 +223,10 @@ public class QuestDataIO { // Current Deck moved from preferences to quest data - it should not be global for all quests!!! QuestDataIO.setFinalField(QuestData.class, "currentDeck", newData, FModel.getQuestPreferences().getPref(QPref.CURRENT_DECK)); } - if(saveVersion < 13){ - //Update for quest DeckConstructionRules - //Add a DeckConstructionRules set to Default. - QuestDataIO.setFinalField(QuestData.class, "deckConstructionRules", newData, DeckConstructionRules.Default); - } - if (saveVersion < 14) { + if (saveVersion < 13) { // Migrate DraftTournaments to use new Tournament class } - final QuestAssets qS = newData.getAssets(); final QuestAchievements qA = newData.getAchievements(); From cccaf1760d23bd5b8e4b306f88e6e68bd8d0c124 Mon Sep 17 00:00:00 2001 From: Jeremy Pelkala Date: Fri, 2 Nov 2018 18:57:17 -0400 Subject: [PATCH 126/901] Added Commander quest mode and world -CardPool Added getFilteredPool() to easily get a Predicate applied copy of a CardPool. -GameRules Minor formatting change. -worlds.txt Added Random Commander to the list. -DeckConstructionRules New enum for defining the subformat a quest is using. -QuestAssets getLife() now has a switch for modifying the life for sub-formats. -QuestData New data save version. Includes a DeckConstructionRules enum. -QuestDataIO updateSaveFile will update old saves to have a default DeckConstructionRules complying with the new QuestData save version. -QuestController Updated to include support for DeckConstructionRules and specialized duel managers -QuestEvent Now have boolean to define if this is a "random" match for the duel list. Currently only QuestEventCommanderDuelManager makes use of this feature for Commander quests. -QuestEventCommanderDuel New QuestEventDuel used in the QuestEventCommanderDuelManager which contains a DeckProxy for use in generating random commander decks. -QuestEventCommanderDuelManager New duel manager to generate duels by difficulty for a Commander quest. Currently uses random generation to generate the decks of each opponent. -QuestSpellShop Sell Extras button now has a switch for taking into account special deck construction rules such as Commander only allowing singletons. -QuestUtil Starting a game now checks for various sub-format specific changes including a switch case for which variety of registered player to use. -QuestUtilCards Starting cardpool size is now modified by a switch case for sub-formats such as Commander. -QuestWinLoseController QuestEvents marked as random matches will now award a "Random Opponent Bonus" equal to the credit base. Currently only QuestEventCommanderDuelManager creates QuestEvents marked as such. -QuestWorld Added support for the Commander quest format and world. -CEditorQuest Many changes to add support for Commander in a style that, hopefully, also paths the way for future format support. -CSubmenuQuestData Support for Commander quests. -VSubmenuQuestData Support for Commander quests. --- .../src/main/java/forge/deck/CardPool.java | 14 ++ .../src/main/java/forge/game/GameRules.java | 3 +- .../deckeditor/controllers/CEditorQuest.java | 151 +++++++++++-- .../screens/home/quest/CSubmenuQuestData.java | 10 +- .../screens/home/quest/VSubmenuQuestData.java | 28 ++- forge-gui/res/quest/world/worlds.txt | 1 + .../java/forge/quest/QuestController.java | 14 +- .../src/main/java/forge/quest/QuestEvent.java | 4 + .../forge/quest/QuestEventCommanderDuel.java | 19 ++ .../quest/QuestEventCommanderDuelManager.java | 205 ++++++++++++++++++ .../main/java/forge/quest/QuestSpellShop.java | 17 +- .../src/main/java/forge/quest/QuestUtil.java | 60 ++++- .../main/java/forge/quest/QuestUtilCards.java | 12 +- .../forge/quest/QuestWinLoseController.java | 5 + .../src/main/java/forge/quest/QuestWorld.java | 8 +- .../quest/data/DeckConstructionRules.java | 17 ++ .../java/forge/quest/data/QuestAssets.java | 9 +- .../main/java/forge/quest/data/QuestData.java | 12 +- .../main/java/forge/quest/io/QuestDataIO.java | 8 +- 19 files changed, 561 insertions(+), 36 deletions(-) create mode 100644 forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java create mode 100644 forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java create mode 100644 forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java diff --git a/forge-core/src/main/java/forge/deck/CardPool.java b/forge-core/src/main/java/forge/deck/CardPool.java index 72ab8efb851..b484f31ab98 100644 --- a/forge-core/src/main/java/forge/deck/CardPool.java +++ b/forge-core/src/main/java/forge/deck/CardPool.java @@ -17,6 +17,7 @@ */ package forge.deck; +import com.google.common.base.Predicate; import com.google.common.collect.Lists; import forge.StaticData; import forge.card.CardDb; @@ -216,4 +217,17 @@ public class CardPool extends ItemPool { } return sb.toString(); } + + /** + * Applies a predicate to this CardPool's cards. + * @param predicate the Predicate to apply to this CardPool + * @return a new CardPool made from this CardPool with only the cards that agree with the provided Predicate + */ + public CardPool getFilteredPool(Predicate predicate){ + CardPool filteredPool = new CardPool(); + for(PaperCard pc : this.items.keySet()){ + if(predicate.apply(pc)) filteredPool.add(pc); + } + return filteredPool; + } } diff --git a/forge-game/src/main/java/forge/game/GameRules.java b/forge-game/src/main/java/forge/game/GameRules.java index dc7ed4cddf1..5e6876e9801 100644 --- a/forge-game/src/main/java/forge/game/GameRules.java +++ b/forge-game/src/main/java/forge/game/GameRules.java @@ -78,7 +78,8 @@ public class GameRules { } public boolean hasCommander() { - return appliedVariants.contains(GameType.Commander) || appliedVariants.contains(GameType.TinyLeaders) + return appliedVariants.contains(GameType.Commander) + || appliedVariants.contains(GameType.TinyLeaders) || appliedVariants.contains(GameType.Brawl); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java index c33da12cda7..b7842272e42 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java @@ -18,11 +18,20 @@ package forge.screens.deckeditor.controllers; import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; import com.google.common.base.Supplier; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; import forge.UiCommand; +import forge.card.CardRules; +import forge.card.CardRulesPredicates; +import forge.card.ColorSet; +import forge.card.mana.ManaCost; import forge.deck.CardPool; import forge.deck.Deck; import forge.deck.DeckSection; +import forge.deck.generation.DeckGeneratorBase; import forge.gui.GuiUtils; import forge.gui.framework.DragCell; import forge.gui.framework.FScreen; @@ -35,6 +44,7 @@ import forge.itemmanager.views.ItemTableColumn; import forge.model.FModel; import forge.properties.ForgePreferences.FPref; import forge.quest.QuestController; +import forge.quest.data.DeckConstructionRules; import forge.screens.deckeditor.AddBasicLandsDialog; import forge.screens.deckeditor.SEditorIO; import forge.screens.deckeditor.views.VAllDecks; @@ -48,6 +58,7 @@ import forge.util.ItemPool; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.print.Paper; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -103,6 +114,14 @@ public final class CEditorQuest extends CDeckEditor { allSections.add(DeckSection.Main); allSections.add(DeckSection.Sideboard); + //Add sub-format specific sections + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: + allSections.add(DeckSection.Commander); + break; + } + this.questData = questData0; final CardManager catalogManager = new CardManager(cDetailPicture, false, true); @@ -158,6 +177,10 @@ public final class CEditorQuest extends CDeckEditor { @Override protected CardLimit getCardLimit() { if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) { + //If this is a commander quest, only allow single copies of cards + if(FModel.getQuest().getDeckConstructionRules() == DeckConstructionRules.Commander){ + return CardLimit.Singleton; + } return CardLimit.Default; } return CardLimit.None; //if not enforcing deck legality, don't enforce default limit @@ -245,16 +268,98 @@ public final class CEditorQuest extends CDeckEditor { public void resetTables() { this.sectionMode = DeckSection.Main; - final Deck deck = this.controller.getModel(); - - final CardPool cardpool = getInitialCatalog(); - // remove bottom cards that are in the deck from the card pool - cardpool.removeAll(deck.getMain()); - // remove sideboard cards from the catalog - cardpool.removeAll(deck.getOrCreate(DeckSection.Sideboard)); // show cards, makes this user friendly - this.getCatalogManager().setPool(cardpool); - this.getDeckManager().setPool(deck.getMain()); + this.getCatalogManager().setPool(getRemainingCardPool()); + this.getDeckManager().setPool(getDeck().getMain()); + } + + /*** + * Provides the pool of cards the player has available to add to his or her deck. Also manages showing available cards + * to choose from for special deck construction rules, e.g.: Commander. + * @return CardPool of cards available to add to the player's deck. + */ + private CardPool getRemainingCardPool(){ + final CardPool cardpool = getInitialCatalog(); + + // remove bottom cards that are in the deck from the card pool + cardpool.removeAll(getDeck().getMain()); + + // remove sideboard cards from the catalog + cardpool.removeAll(getDeck().getOrCreate(DeckSection.Sideboard)); + + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: + //remove this deck's currently selected commander(s) from the catalog + cardpool.removeAll(getDeck().getOrCreate(DeckSection.Commander)); + + //TODO: Only thin if deck conformance is being applied + if(getDeck().getOrCreate(DeckSection.Commander).toFlatList().size() > 0) { + Predicate identityPredicate = new MatchCommanderColorIdentity(getDeckColorIdentity()); + CardPool filteredPool = cardpool.getFilteredPool(identityPredicate); + + return filteredPool; + } + break; + } + + return cardpool; + } + + /** + * Predicate that filters out based on a color identity provided upon instantiation. Used to filter the card + * list when a commander is chosen so the user can more easily see what cards are available for his or her deck + * and avoid making additions that are not legal. + */ + public static class MatchCommanderColorIdentity implements Predicate { + private final ColorSet allowedColor; + + public MatchCommanderColorIdentity(ColorSet color) { + allowedColor = color; + } + + @Override + public boolean apply(PaperCard subject) { + CardRules cr = subject.getRules(); + ManaCost mc = cr.getManaCost(); + return !mc.isPureGeneric() && allowedColor.containsAllColorsFrom(cr.getColorIdentity().getColor()); + } + } + + /** + * Compiles the color identity of the loaded deck based on the commanders. + * @return A ColorSet containing the color identity of the currently loaded deck. + */ + public ColorSet getDeckColorIdentity(){ + + List commanders = getDeck().getOrCreate(DeckSection.Commander).toFlatList(); + List colors = new ArrayList<>(); + + //Return early if there are no current commanders + if(commanders.size() == 0) return ColorSet.fromNames(colors); + + //For each commander,add each color of its color identity if not already added + for(PaperCard pc : commanders){ + if(!colors.contains("w") && pc.getRules().getColorIdentity().hasWhite()) colors.add("w"); + if(!colors.contains("u") && pc.getRules().getColorIdentity().hasBlue()) colors.add("u"); + if(!colors.contains("b") && pc.getRules().getColorIdentity().hasBlack()) colors.add("b"); + if(!colors.contains("r") && pc.getRules().getColorIdentity().hasRed()) colors.add("r"); + if(!colors.contains("g") && pc.getRules().getColorIdentity().hasGreen()) colors.add("g"); + } + + return ColorSet.fromNames(colors); + } + + /* + Used to make the code more readable in game terms. + */ + private Deck getDeck(){ + return this.controller.getModel(); + } + + private ItemPool getCommanderCardPool(){ + Predicate commanderPredicate = Predicates.compose(CardRulesPredicates.Presets.CAN_BE_COMMANDER, PaperCard.FN_GET_RULES); + return getRemainingCardPool().getFilteredPool(commanderPredicate); } @Override @@ -280,14 +385,30 @@ public final class CEditorQuest extends CDeckEditor { } /** - * Switch between the main deck and the sideboard editor. + * Switch between the main deck and the sideboard/Command Zone editor. */ public void setEditorMode(DeckSection sectionMode) { - if (sectionMode == DeckSection.Sideboard) { - this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Sideboard)); - } - else { - this.getDeckManager().setPool(this.controller.getModel().getMain()); + //Fixes null pointer error on switching tabs while quest deck editor is open. TODO: Find source of bug possibly? + if(sectionMode == null) sectionMode = DeckSection.Main; + + //Based on which section the editor is in, display the remaining card pool (or applicable card pool if in + //Commander) and the current section's cards + switch(sectionMode){ + case Main : + this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); + this.getCatalogManager().setPool(getRemainingCardPool()); + this.getDeckManager().setPool(this.controller.getModel().getMain()); + break; + case Sideboard : + this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); + this.getCatalogManager().setPool(getRemainingCardPool()); + this.getDeckManager().setPool(getDeck().getOrCreate(DeckSection.Sideboard)); + break; + case Commander : + this.getCatalogManager().setup(ItemManagerConfig.COMMANDER_POOL); + this.getCatalogManager().setPool(getCommanderCardPool()); + this.getDeckManager().setPool(getDeck().getOrCreate(DeckSection.Commander)); + break; } this.sectionMode = sectionMode; diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java index 131805b738b..8aa76293b55 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java @@ -10,6 +10,7 @@ import forge.model.FModel; import forge.properties.ForgeConstants; import forge.quest.*; import forge.quest.StartingPoolPreferences.PoolType; +import forge.quest.data.DeckConstructionRules; import forge.quest.data.GameFormatQuest; import forge.quest.data.QuestData; import forge.quest.data.QuestPreferences.QPref; @@ -340,9 +341,16 @@ public enum CSubmenuQuestData implements ICDoc { break; } + //Apply the appropriate deck construction rules for this quest + DeckConstructionRules dcr = DeckConstructionRules.Default; + + if(VSubmenuQuestData.SINGLETON_INSTANCE.isCommander()){ + dcr = DeckConstructionRules.Commander; + } + final QuestController qc = FModel.getQuest(); - qc.newGame(questName, difficulty, mode, fmtPrizes, view.isUnlockSetsAllowed(), dckStartPool, fmtStartPool, view.getStartingWorldName(), userPrefs); + qc.newGame(questName, difficulty, mode, fmtPrizes, view.isUnlockSetsAllowed(), dckStartPool, fmtStartPool, view.getStartingWorldName(), userPrefs, dcr); FModel.getQuest().save(); // Save in preferences. diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java index 9eee9e58ca3..70e284faf3d 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java @@ -62,6 +62,7 @@ public enum VSubmenuQuestData implements IVSubmenu { private final FRadioButton radHard = new FRadioButton("Hard"); private final FRadioButton radExpert = new FRadioButton("Expert"); private final FCheckBox boxFantasy = new FCheckBox("Fantasy Mode"); + private final FCheckBox boxCommander = new FCheckBox("Commander Subformat"); private final FLabel lblStartingWorld = new FLabel.Builder().text("Starting world:").build(); private final FComboBoxWrapper cbxStartingWorld = new FComboBoxWrapper<>(); @@ -274,9 +275,25 @@ public enum VSubmenuQuestData implements IVSubmenu { } }); - // Fantasy box enabled by Default + // Fantasy box selected by Default boxFantasy.setSelected(true); boxFantasy.setEnabled(true); + + // Commander box unselected by Default + boxCommander.setSelected(false); + boxCommander.setEnabled(true); + + boxCommander.addActionListener( + new ActionListener(){ + public void actionPerformed(ActionEvent e){ + if(!isCommander()) return; //do nothing if unselecting Commander Subformat + //Otherwise, set the starting world to Random Commander + cbxStartingWorld.setSelectedItem(FModel.getWorlds().get("Random Commander")); + } + } + + ); + boxCompleteSet.setEnabled(true); boxAllowDuplicates.setEnabled(true); @@ -286,6 +303,7 @@ public enum VSubmenuQuestData implements IVSubmenu { final JPanel pnlDifficultyMode = new JPanel(new MigLayout("insets 0, gap 1%, flowy")); pnlDifficultyMode.add(difficultyPanel, "gapright 4%"); pnlDifficultyMode.add(boxFantasy, "h 25px!, gapbottom 15, gapright 4%"); + pnlDifficultyMode.add(boxCommander, "h 25px!, gapbottom 15, gapright 4%"); pnlDifficultyMode.add(lblStartingWorld, "h 25px!, hidemode 3"); cbxStartingWorld.addTo(pnlDifficultyMode, "h 27px!, w 40%, pushx, gapbottom 7"); pnlDifficultyMode.setOpaque(false); @@ -487,6 +505,14 @@ public enum VSubmenuQuestData implements IVSubmenu { return boxFantasy.isSelected(); } + /** + * Auth. Imakuni + * @return True if the "Commander Subformat" check box is selected. + */ + public boolean isCommander() { + return boxCommander.isSelected(); + } + public boolean startWithCompleteSet() { return boxCompleteSet.isSelected(); } diff --git a/forge-gui/res/quest/world/worlds.txt b/forge-gui/res/quest/world/worlds.txt index b08931cde59..5d99427d535 100644 --- a/forge-gui/res/quest/world/worlds.txt +++ b/forge-gui/res/quest/world/worlds.txt @@ -1,5 +1,6 @@ Name:Main world Name:Random Standard +Name:Random Commander Name:Amonkhet|Dir:Amonkhet|Sets:AKH, HOU Name:Jamuraa|Dir:jamuraa|Sets:5ED, ARN, MIR, VIS, WTH|Banned:Chaos Orb; Falling Star Name:Kamigawa|Dir:2004 Kamigawa|Sets:CHK, BOK, SOK diff --git a/forge-gui/src/main/java/forge/quest/QuestController.java b/forge-gui/src/main/java/forge/quest/QuestController.java index 0d306f4431a..5366f7200bc 100644 --- a/forge-gui/src/main/java/forge/quest/QuestController.java +++ b/forge-gui/src/main/java/forge/quest/QuestController.java @@ -276,9 +276,10 @@ public class QuestController { public void newGame(final String name, final int difficulty, final QuestMode mode, final GameFormat formatPrizes, final boolean allowSetUnlocks, final Deck startingCards, final GameFormat formatStartingPool, - final String startingWorld, final StartingPoolPreferences userPrefs) { + final String startingWorld, final StartingPoolPreferences userPrefs, + DeckConstructionRules dcr) { - this.load(new QuestData(name, difficulty, mode, formatPrizes, allowSetUnlocks, startingWorld)); // pass awards and unlocks here + this.load(new QuestData(name, difficulty, mode, formatPrizes, allowSetUnlocks, startingWorld, dcr)); // pass awards and unlocks here if (startingCards != null) { this.myCards.addDeck(startingCards); @@ -435,6 +436,12 @@ public class QuestController { QuestWorld world = getWorld(); String path = ForgeConstants.DEFAULT_CHALLENGES_DIR; + //Use a variant specialized duel manager if this is a variant quest + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: this.duelManager = new QuestEventCommanderDuelManager(); return; + } + if (world != null) { if (world.getName().equals(QuestWorld.STANDARDWORLDNAME)) { @@ -449,7 +456,6 @@ public class QuestController { } this.duelManager = new QuestEventDuelManager(new File(path)); - } public HashSet GetRating() { @@ -607,4 +613,6 @@ public class QuestController { public void setCurrentDeck(String s) { model.currentDeck = s; } + + public DeckConstructionRules getDeckConstructionRules(){return model.deckConstructionRules;} } diff --git a/forge-gui/src/main/java/forge/quest/QuestEvent.java b/forge-gui/src/main/java/forge/quest/QuestEvent.java index 00a140c80e2..2a9bf6c1b63 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEvent.java +++ b/forge-gui/src/main/java/forge/quest/QuestEvent.java @@ -48,6 +48,7 @@ public abstract class QuestEvent implements IQuestEvent { private String profile = "Default"; // Opponent name if different from the challenge name private String opponentName = null; + private boolean isRandomMatch = false; public static final Function FN_GET_NAME = new Function() { @@ -174,4 +175,7 @@ public abstract class QuestEvent implements IQuestEvent { this.showDifficulty = showDifficulty; } + public boolean getIsRandomMatch(){return isRandomMatch;} + + public void setIsRandomMatch(boolean b){isRandomMatch = b;} } diff --git a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java new file mode 100644 index 00000000000..1d7924a04d7 --- /dev/null +++ b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java @@ -0,0 +1,19 @@ +package forge.quest; + +import forge.deck.DeckProxy; + +/** + * A QuestEventDuel with a CommanderDeckGenerator used exclusively within QuestEventCommanderDuelManager for the + * creation of randomly generated Commander decks in a Commander variant quest. + * Auth. Imakuni & Forge + */ +public class QuestEventCommanderDuel extends QuestEventDuel{ + /** + * The CommanderDeckGenerator for this duel. + */ + private DeckProxy deckProxy; + + public DeckProxy getDeckProxy() {return deckProxy;} + + public void setDeckProxy(DeckProxy dp) {deckProxy = dp;} +} diff --git a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java new file mode 100644 index 00000000000..384d9d11d77 --- /dev/null +++ b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java @@ -0,0 +1,205 @@ +package forge.quest; + +import forge.deck.*; +import forge.item.PaperCard; +import forge.model.FModel; +import forge.quest.data.QuestPreferences; +import forge.util.CollectionSuppliers; +import forge.util.MyRandom; +import forge.util.maps.EnumMapOfLists; +import forge.util.maps.MapOfLists; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Manages the creation of random Commander duels for a Commander variant quest. Random generation is handled via + * the CommanderDeckGenerator class. + * Auth. Forge & Imakuni#8015 + */ +public class QuestEventCommanderDuelManager implements QuestEventDuelManagerInterface { + /** + * The list of all possible Commander variant duels. + */ + private ArrayList commanderDuels = new ArrayList<>(); + + /** + * Contains the expert deck lists for the commanders. + */ + private List expertCommanderDecks; + + /** + * Immediately calls assembleDuels() to setup the commanderDuels variable. + */ + public QuestEventCommanderDuelManager(){ + assembleDuels(); + } + + /** + * Assembles the list of all possible Commander duels via CommanderDeckGenerator. Should be done within constructor. + */ + private void assembleDuels(){ + //isCardGen = true seemed to make slightly more difficult decks based purely on experience with a very small sample size. + //Gotta work on this more, its making pretty average decks after further testing. + expertCommanderDecks = CommanderDeckGenerator.getCommanderDecks(DeckFormat.Commander, true, true); + + List generatedDuels = CommanderDeckGenerator.getCommanderDecks(DeckFormat.Commander, true, false); + + for(DeckProxy dp : generatedDuels){ + QuestEventCommanderDuel duel = new QuestEventCommanderDuel(); + + duel.setDescription("Randomly generated " + dp.getName() + " commander deck."); + duel.setName(dp.getName()); + duel.setTitle(dp.getName()); + duel.setOpponentName(dp.getName()); + duel.setDifficulty(QuestEventDifficulty.EASY); + duel.setDeckProxy(dp); + + //Setting a blank deck avoids a null pointer exception. The deck is generated in generateDuels() to avoid long load times. + duel.setEventDeck(new Deck()); + + commanderDuels.add(duel); + } + } + + /** + * Retrieve list of all possible Commander duels. + * @return ArrayList containing all possible Commander duels. + */ + public Iterable getAllDuels() { + return commanderDuels; + } + + /** + * Retrieve list of all possible Commander duels. + * @param difficulty Currently unused + * @return ArrayList containing all possible Commander duels. + */ + public Iterable getDuels(QuestEventDifficulty difficulty){ + return commanderDuels; + } + + /** + * Composes an ArrayList containing 4 QuestEventDuels composed with Commander variant decks. One duel will have its + * title replaced as Random. + * @return ArrayList of QuestEventDuels containing 4 duels. + */ + public List generateDuels(){ + final List duelOpponents = new ArrayList<>(); + + //While there are less than 4 duels chosen + while(duelOpponents.size() < 4){ + //Get a random duel from the possible duels list + QuestEventCommanderDuel duel = (QuestEventCommanderDuel)commanderDuels.get(((int) (commanderDuels.size() * MyRandom.getRandom().nextDouble()))); + + //If the chosen duels list already contains this duel, get a different duel to prevent duplicate duels + if(duelOpponents.contains(duel)) continue; + + //Add the randomly chosen duel to the duel list + duelOpponents.add(duel); + + //Here the actual deck for this commander is generated by calling .getDeck() on the saved DeckProxy + duel.setEventDeck(duel.getDeckProxy().getDeck()); + + //Modify deck for difficulty + modifyDuelForDifficulty(duel); + + + } + + //Modify the stats of the final duel to hide the opponent, creating a "random" duel. + //We make a copy of the final duel and overwrite it in the duelOpponents to avoid changing the variables in + //the original duel, which gets reused. + QuestEventCommanderDuel duel = (QuestEventCommanderDuel)duelOpponents.get(duelOpponents.size() - 1); + QuestEventCommanderDuel randomDuel = new QuestEventCommanderDuel(); + + randomDuel.setName(duel.getName()); + randomDuel.setOpponentName(duel.getName()); + randomDuel.setDeckProxy(duel.getDeckProxy()); + randomDuel.setTitle("Random Opponent"); + randomDuel.setShowDifficulty(false); + randomDuel.setDescription("Fight a random generated commander opponent."); + randomDuel.setIsRandomMatch(true); + randomDuel.setEventDeck(duel.getEventDeck()); + + //Replace the final duel with this newly modified "random" duel + duelOpponents.set(duelOpponents.size()-1, randomDuel); + + return duelOpponents; + } + + /** + * Retrieves the expert level deck generation of a deck with the same commander as the provided DeckProxy. + * @param dp The easy generation commander deck + * @return The same commander's expert generation DeckProxy + */ + private Deck getExpertGenDeck(DeckProxy dp){ + for(QuestEventDuel qed : commanderDuels){ + QuestEventCommanderDuel cmdQED = (QuestEventCommanderDuel)qed; + if(cmdQED.getDeckProxy().getName().equals(dp.getName())){ + return cmdQED.getDeckProxy().getDeck(); + } + } + return null; + } + + /** + * Modifies a given duel by replacing a percentage of the deck with random cards from the more difficult generated version + * of the same commander's deck. Medium replaces 30%, Hard replaces 60%, Expert replaces 100%. + * @param duel The QuestEventCommanderDuel to modify + */ + private void modifyDuelForDifficulty(QuestEventCommanderDuel duel){ + final QuestPreferences questPreferences = FModel.getQuestPreferences(); + final int index = FModel.getQuest().getAchievements().getDifficulty(); + final int numberOfWins = FModel.getQuest().getAchievements().getWin(); + Deck expertDeck = getExpertGenDeck(duel.getDeckProxy()); + + int difficultyReplacementPercent = 0; + + //Note: The code is ordered to make the least number of comparisons I could think of at the time for speed reasons. + //In reality, it shouldn't really make much difference, but why not? + if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_EXPERTAI, index)) { + //At expert, the deck is replaced with the entire expert deck, and we can return immediately + duel.setEventDeck(expertDeck); + duel.setDifficulty(QuestEventDifficulty.EXPERT); + return; + } + + if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_MEDIUMAI, index)) { + difficultyReplacementPercent += 30; + duel.setDifficulty(QuestEventDifficulty.MEDIUM); + } else return; //return early here since it would be an easy opponent with no changes + + if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_HARDAI, index)) { + difficultyReplacementPercent += 30; + duel.setDifficulty(QuestEventDifficulty.HARD); + } + + CardPool easyMain = duel.getEventDeck().getMain(); + CardPool expertMain = expertDeck.getMain(); + + List easyList = easyMain.toFlatList(); + List expertList = expertMain.toFlatList(); + + //Replace cards in the easy deck with cards from the expert deck up to the difficulty replacement percent + for(int i = 0; i < difficultyReplacementPercent; i++){ + if(!easyMain.contains(expertList.get(i))) { //ensure that the card being copied over isn't already in the deck + easyMain.remove(easyList.get(i)); + easyMain.add(expertList.get(i)); + } + else{ + expertList.remove(expertList.get(i)); + i--; + if(expertList.size() == 0) break; //break if there are no more cards to copy over + } + } + } + + /** + * Randomizes the list of Commander Duels. + */ + public void randomizeOpponents(){ + Collections.shuffle(commanderDuels); + } +} diff --git a/forge-gui/src/main/java/forge/quest/QuestSpellShop.java b/forge-gui/src/main/java/forge/quest/QuestSpellShop.java index e9196e417df..96eae768963 100644 --- a/forge-gui/src/main/java/forge/quest/QuestSpellShop.java +++ b/forge-gui/src/main/java/forge/quest/QuestSpellShop.java @@ -344,11 +344,24 @@ public class QuestSpellShop { List> cardsToRemove = new LinkedList<>(); for (Entry item : inventoryManager.getPool()) { PaperCard card = (PaperCard)item.getKey(); - int numToKeep = card.getRules().getType().isBasic() ? - FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_BASIC_LAND_SIZE) : FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_SIZE); + //Number of a particular card to keep + int numToKeep = 4; + + if(card.getRules().getType().isBasic()){ + numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_BASIC_LAND_SIZE); + } else{ + //Choose card limit restrictions based on deck construction rules, e.g.: Commander allows only singletons + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_SIZE); break; + case Commander: numToKeep = 1; + } + } + + //If this card has an exception to the card limit, e.g.: Relentless Rats, get the quest preference if (DeckFormat.getLimitExceptions().contains(card.getName())) { numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_ANY_NUMBER_SIZE); } + if (numToKeep < item.getValue()) { cardsToRemove.add(Pair.of(item.getKey(), item.getValue() - numToKeep)); } diff --git a/forge-gui/src/main/java/forge/quest/QuestUtil.java b/forge-gui/src/main/java/forge/quest/QuestUtil.java index c2fe796ef7b..7ad6b6cd335 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtil.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtil.java @@ -41,6 +41,7 @@ import forge.properties.ForgePreferences.FPref; import forge.quest.bazaar.IQuestBazaarItem; import forge.quest.bazaar.QuestItemType; import forge.quest.bazaar.QuestPetController; +import forge.quest.data.DeckConstructionRules; import forge.quest.data.QuestAchievements; import forge.quest.data.QuestAssets; import forge.util.gui.SGuiChoose; @@ -51,6 +52,7 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; +import java.util.TreeSet; /** *

@@ -531,7 +533,17 @@ public class QuestUtil { Integer lifeHuman = null; boolean useBazaar = true; Boolean forceAnte = null; - int lifeAI = 20; + + //Generate a life modifier based on this quest's variant as held in the Quest Controller's DeckConstructionRules + int variantLifeModifier = 0; + + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: variantLifeModifier = 20; break; + } + + int lifeAI = 20 + variantLifeModifier; + if (event instanceof QuestEventChallenge) { final QuestEventChallenge qc = ((QuestEventChallenge) event); lifeAI = qc.getAILife(); @@ -545,8 +557,9 @@ public class QuestUtil { forceAnte = qc.isForceAnte(); } - final RegisteredPlayer humanStart = new RegisteredPlayer(getDeckForNewGame()); - final RegisteredPlayer aiStart = new RegisteredPlayer(event.getEventDeck()); + final RegisteredPlayer humanStart = getRegisteredPlayerByVariant(getDeckForNewGame()); + + final RegisteredPlayer aiStart = getRegisteredPlayerByVariant(event.getEventDeck()); if (lifeHuman != null) { humanStart.setStartingLife(lifeHuman); @@ -581,17 +594,39 @@ public class QuestUtil { rules.setGamesPerMatch(qData.getMatchLength()); rules.setManaBurn(FModel.getPreferences().getPrefBoolean(FPref.UI_MANABURN)); rules.setCanCloneUseTargetsImage(FModel.getPreferences().getPrefBoolean(FPref.UI_CLONE_MODE_SOURCE)); + + TreeSet variant = new TreeSet(); + if(FModel.getQuest().getDeckConstructionRules() == DeckConstructionRules.Commander){ + variant.add(GameType.Commander); + } + final HostedMatch hostedMatch = GuiBase.getInterface().hostMatch(); final IGuiGame gui = GuiBase.getInterface().getNewGuiGame(); gui.setPlayerAvatar(aiPlayer, event); FThreads.invokeInEdtNowOrLater(new Runnable(){ @Override public void run() { - hostedMatch.startMatch(rules, null, starter, ImmutableMap.of(humanStart, gui)); + hostedMatch.startMatch(rules, variant, starter, ImmutableMap.of(humanStart, gui)); } }); } + /** + * Uses the appropriate RegisteredPlayer command for generating a RegisteredPlayer based on this quest's variant as + * held by the QuestController's DeckConstructionRules. + * @param deck The deck to generate the RegisteredPlayer with + * @return A newly made RegisteredPlayer specific to the quest's variant + */ + private static RegisteredPlayer getRegisteredPlayerByVariant(Deck deck){ + switch (FModel.getQuest().getDeckConstructionRules()) { + case Default: + return new RegisteredPlayer(deck); + case Commander: + return RegisteredPlayer.forCommander(deck); + } + return null; + } + private static Deck getDeckForNewGame() { Deck deck = null; if (event instanceof QuestEventChallenge) { @@ -623,7 +658,7 @@ public class QuestUtil { } if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) { - final String errorMessage = GameType.Quest.getDeckFormat().getDeckConformanceProblem(deck); + final String errorMessage = getDeckConformanceProblems(deck); if (null != errorMessage) { SOptionPane.showErrorDialog("Your deck " + errorMessage + " Please edit or choose a different deck.", "Invalid Deck"); return false; @@ -633,6 +668,21 @@ public class QuestUtil { return true; } + public static String getDeckConformanceProblems(Deck deck){ + String errorMessage = GameType.Quest.getDeckFormat().getDeckConformanceProblem(deck);; + + if(errorMessage != null) return errorMessage; //return immediately if the deck does not conform to quest requirements + + //Check for all applicable deck construction rules per this quests's saved DeckConstructionRules enum + switch(FModel.getQuest().getDeckConstructionRules()){ + case Commander: + errorMessage = GameType.Commander.getDeckFormat().getDeckConformanceProblem(deck); + break; + } + + return errorMessage; + } + /** Duplicate in DeckEditorQuestMenu and * probably elsewhere...can streamline at some point * (probably shouldn't be here). diff --git a/forge-gui/src/main/java/forge/quest/QuestUtilCards.java b/forge-gui/src/main/java/forge/quest/QuestUtilCards.java index c8d77d863ad..54a4887ba8a 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtilCards.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtilCards.java @@ -308,10 +308,16 @@ public final class QuestUtilCards { * user preferences */ public void setupNewGameCardPool(final GameFormat formatStartingPool, final int idxDifficulty, final StartingPoolPreferences userPrefs) { + //Add additional cards to the starter card pool based on variant if applicable + double variantModifier = 0; + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: variantModifier = 2; break; + } - final int nC = questPreferences.getPrefInt(DifficultyPrefs.STARTING_COMMONS, idxDifficulty); - final int nU = questPreferences.getPrefInt(DifficultyPrefs.STARTING_UNCOMMONS, idxDifficulty); - final int nR = questPreferences.getPrefInt(DifficultyPrefs.STARTING_RARES, idxDifficulty); + final int nC = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_COMMONS, idxDifficulty) * variantModifier); + final int nU = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_UNCOMMONS, idxDifficulty) * variantModifier); + final int nR = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_RARES, idxDifficulty) * variantModifier); addAllCards(BoosterUtils.getQuestStarterDeck(formatStartingPool, nC, nU, nR, userPrefs)); diff --git a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java index 2e93e7d4fec..265ea61bb58 100644 --- a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java +++ b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java @@ -226,6 +226,11 @@ public class QuestWinLoseController { sb.append(StringUtils.capitalize(qEvent.getDifficulty().getTitle())); sb.append(" opponent: ").append(credBase).append(" credits.\n"); + if(qEvent.getIsRandomMatch()){ + sb.append("Random Opponent Bonus: " + credBase + " credit" + (credBase > 1 ? "s." : ".") + "\n"); + credBase += credBase; + } + final int winMultiplier = Math.min(qData.getAchievements().getWin(), FModel.getQuestPreferences().getPrefInt(QPref.REWARDS_WINS_MULTIPLIER_MAX)); final int creditsForPreviousWins = (int) ((Double.parseDouble(FModel.getQuestPreferences() .getPref(QPref.REWARDS_WINS_MULTIPLIER)) * winMultiplier)); diff --git a/forge-gui/src/main/java/forge/quest/QuestWorld.java b/forge-gui/src/main/java/forge/quest/QuestWorld.java index e20dcf98ce8..4c77b0ec515 100644 --- a/forge-gui/src/main/java/forge/quest/QuestWorld.java +++ b/forge-gui/src/main/java/forge/quest/QuestWorld.java @@ -40,6 +40,7 @@ public class QuestWorld implements Comparable{ private final String dir; private final GameFormatQuest format; public static final String STANDARDWORLDNAME = "Random Standard"; + public static final String RANDOMCOMMANDERWORLDNAME = "Random Commander"; private boolean isCustom; @@ -129,7 +130,6 @@ public class QuestWorld implements Comparable{ /** * TODO: Write javadoc for Constructor. * @param file0 - * @param keySelector0 */ public Reader(String file0) { super(file0, QuestWorld.FN_GET_NAME); @@ -194,6 +194,12 @@ public class QuestWorld implements Comparable{ FModel.getFormats().getStandard().getBannedCardNames(),false); } + if (useName.equalsIgnoreCase(QuestWorld.RANDOMCOMMANDERWORLDNAME)){ + useFormat = new GameFormatQuest(QuestWorld.RANDOMCOMMANDERWORLDNAME, + FModel.getFormats().getFormat("Commander").getAllowedSetCodes(), + FModel.getFormats().getFormat("Commander").getBannedCardNames(),false); + } + // System.out.println("Creating quest world " + useName + " (index " + useIdx + ", dir: " + useDir); // if (useFormat != null) { System.out.println("SETS: " + sets + "\nBANNED: " + bannedCards); } diff --git a/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java b/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java new file mode 100644 index 00000000000..3744beea09d --- /dev/null +++ b/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java @@ -0,0 +1,17 @@ +package forge.quest.data; + +/** + * Used to clarify which subformat a quest is using e.g. Commander. + * Auth. Imakuni + */ +public enum DeckConstructionRules { + /** + * Typically has no effect on Quest gameplay. + */ + Default, + + /** + * Commander ruleset. 99 card deck, no copies other than basic lands, commander(s) in Command zone + */ + Commander +} 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 616c49d937b..8f7b644641b 100644 --- a/forge-gui/src/main/java/forge/quest/data/QuestAssets.java +++ b/forge-gui/src/main/java/forge/quest/data/QuestAssets.java @@ -200,7 +200,14 @@ public class QuestAssets { * @return the life */ public int getLife(final QuestMode mode) { - final int base = mode.equals(QuestMode.Fantasy) ? 15 : 20; + int base = mode.equals(QuestMode.Fantasy) ? 15 : 20; + + //Modify life for the quest's sub-format, e.g.: Commander adds 20 + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: base += 20; + } + return (base + this.getItemLevel(QuestItemType.ELIXIR_OF_LIFE)) - this.getItemLevel(QuestItemType.POUND_FLESH); } diff --git a/forge-gui/src/main/java/forge/quest/data/QuestData.java b/forge-gui/src/main/java/forge/quest/data/QuestData.java index e6a75adef7d..41574634113 100644 --- a/forge-gui/src/main/java/forge/quest/data/QuestData.java +++ b/forge-gui/src/main/java/forge/quest/data/QuestData.java @@ -42,7 +42,7 @@ import java.util.Map; */ public final class QuestData { /** Holds the latest version of the Quest Data. */ - public static final int CURRENT_VERSION_NUMBER = 12; + public static final int CURRENT_VERSION_NUMBER = 13; // This field places the version number into QD instance, // but only when the object is created through the constructor @@ -70,6 +70,11 @@ public final class QuestData { public String currentDeck = "DEFAULT"; + /** + * Holds the subformat for this quest. Defaults to DeckConstructionRules.Default. + */ + public DeckConstructionRules deckConstructionRules = DeckConstructionRules.Default; + public QuestData() { //needed for XML serialization } @@ -87,9 +92,11 @@ public final class QuestData { * allow set unlocking during quest * @param startingWorld * starting world + * @param dcr + * deck construction rules e.g. Commander */ public QuestData(String name0, int diff, QuestMode mode0, GameFormat userFormat, - boolean allowSetUnlocks, final String startingWorld) { + boolean allowSetUnlocks, final String startingWorld, DeckConstructionRules dcr) { this.name = name0; if (userFormat != null) { @@ -99,6 +106,7 @@ public final class QuestData { this.achievements = new QuestAchievements(diff); this.assets = new QuestAssets(format); this.worldId = startingWorld; + this.deckConstructionRules = dcr; } /** diff --git a/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java b/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java index de680502e37..cd232367df9 100644 --- a/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java +++ b/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java @@ -223,10 +223,16 @@ public class QuestDataIO { // Current Deck moved from preferences to quest data - it should not be global for all quests!!! QuestDataIO.setFinalField(QuestData.class, "currentDeck", newData, FModel.getQuestPreferences().getPref(QPref.CURRENT_DECK)); } - if (saveVersion < 13) { + if(saveVersion < 13){ + //Update for quest DeckConstructionRules + //Add a DeckConstructionRules set to Default. + QuestDataIO.setFinalField(QuestData.class, "deckConstructionRules", newData, DeckConstructionRules.Default); + } + if (saveVersion < 14) { // Migrate DraftTournaments to use new Tournament class } + final QuestAssets qS = newData.getAssets(); final QuestAchievements qA = newData.getAchievements(); From 3b6bbbac10daa5f6cfc8497f1860f2b9d7aefc01 Mon Sep 17 00:00:00 2001 From: imakunee Date: Sat, 3 Nov 2018 00:36:26 +0000 Subject: [PATCH 127/901] Revert "-CardPool" This reverts commit 37d9dc753f915853ecf1e17e1fea1b5feb7480bd --- .../src/main/java/forge/deck/CardPool.java | 14 -- .../src/main/java/forge/game/GameRules.java | 3 +- .../deckeditor/controllers/CEditorQuest.java | 145 +------------ .../screens/home/quest/CSubmenuQuestData.java | 10 +- .../screens/home/quest/VSubmenuQuestData.java | 28 +-- forge-gui/res/quest/world/worlds.txt | 1 - .../java/forge/quest/QuestController.java | 14 +- .../src/main/java/forge/quest/QuestEvent.java | 4 - .../forge/quest/QuestEventCommanderDuel.java | 19 -- .../quest/QuestEventCommanderDuelManager.java | 205 ------------------ .../main/java/forge/quest/QuestSpellShop.java | 17 +- .../src/main/java/forge/quest/QuestUtil.java | 60 +---- .../main/java/forge/quest/QuestUtilCards.java | 12 +- .../forge/quest/QuestWinLoseController.java | 5 - .../src/main/java/forge/quest/QuestWorld.java | 8 +- .../quest/data/DeckConstructionRules.java | 17 -- .../java/forge/quest/data/QuestAssets.java | 9 +- .../main/java/forge/quest/data/QuestData.java | 12 +- .../main/java/forge/quest/io/QuestDataIO.java | 8 +- 19 files changed, 33 insertions(+), 558 deletions(-) delete mode 100644 forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java delete mode 100644 forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java delete mode 100644 forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java diff --git a/forge-core/src/main/java/forge/deck/CardPool.java b/forge-core/src/main/java/forge/deck/CardPool.java index b484f31ab98..72ab8efb851 100644 --- a/forge-core/src/main/java/forge/deck/CardPool.java +++ b/forge-core/src/main/java/forge/deck/CardPool.java @@ -17,7 +17,6 @@ */ package forge.deck; -import com.google.common.base.Predicate; import com.google.common.collect.Lists; import forge.StaticData; import forge.card.CardDb; @@ -217,17 +216,4 @@ public class CardPool extends ItemPool { } return sb.toString(); } - - /** - * Applies a predicate to this CardPool's cards. - * @param predicate the Predicate to apply to this CardPool - * @return a new CardPool made from this CardPool with only the cards that agree with the provided Predicate - */ - public CardPool getFilteredPool(Predicate predicate){ - CardPool filteredPool = new CardPool(); - for(PaperCard pc : this.items.keySet()){ - if(predicate.apply(pc)) filteredPool.add(pc); - } - return filteredPool; - } } diff --git a/forge-game/src/main/java/forge/game/GameRules.java b/forge-game/src/main/java/forge/game/GameRules.java index 5e6876e9801..dc7ed4cddf1 100644 --- a/forge-game/src/main/java/forge/game/GameRules.java +++ b/forge-game/src/main/java/forge/game/GameRules.java @@ -78,8 +78,7 @@ public class GameRules { } public boolean hasCommander() { - return appliedVariants.contains(GameType.Commander) - || appliedVariants.contains(GameType.TinyLeaders) + return appliedVariants.contains(GameType.Commander) || appliedVariants.contains(GameType.TinyLeaders) || appliedVariants.contains(GameType.Brawl); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java index b7842272e42..c33da12cda7 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java @@ -18,20 +18,11 @@ package forge.screens.deckeditor.controllers; import com.google.common.base.Function; -import com.google.common.base.Predicate; -import com.google.common.base.Predicates; import com.google.common.base.Supplier; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; import forge.UiCommand; -import forge.card.CardRules; -import forge.card.CardRulesPredicates; -import forge.card.ColorSet; -import forge.card.mana.ManaCost; import forge.deck.CardPool; import forge.deck.Deck; import forge.deck.DeckSection; -import forge.deck.generation.DeckGeneratorBase; import forge.gui.GuiUtils; import forge.gui.framework.DragCell; import forge.gui.framework.FScreen; @@ -44,7 +35,6 @@ import forge.itemmanager.views.ItemTableColumn; import forge.model.FModel; import forge.properties.ForgePreferences.FPref; import forge.quest.QuestController; -import forge.quest.data.DeckConstructionRules; import forge.screens.deckeditor.AddBasicLandsDialog; import forge.screens.deckeditor.SEditorIO; import forge.screens.deckeditor.views.VAllDecks; @@ -58,7 +48,6 @@ import forge.util.ItemPool; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.awt.print.Paper; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -114,14 +103,6 @@ public final class CEditorQuest extends CDeckEditor { allSections.add(DeckSection.Main); allSections.add(DeckSection.Sideboard); - //Add sub-format specific sections - switch(FModel.getQuest().getDeckConstructionRules()){ - case Default: break; - case Commander: - allSections.add(DeckSection.Commander); - break; - } - this.questData = questData0; final CardManager catalogManager = new CardManager(cDetailPicture, false, true); @@ -177,10 +158,6 @@ public final class CEditorQuest extends CDeckEditor { @Override protected CardLimit getCardLimit() { if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) { - //If this is a commander quest, only allow single copies of cards - if(FModel.getQuest().getDeckConstructionRules() == DeckConstructionRules.Commander){ - return CardLimit.Singleton; - } return CardLimit.Default; } return CardLimit.None; //if not enforcing deck legality, don't enforce default limit @@ -268,98 +245,16 @@ public final class CEditorQuest extends CDeckEditor { public void resetTables() { this.sectionMode = DeckSection.Main; - // show cards, makes this user friendly - this.getCatalogManager().setPool(getRemainingCardPool()); - this.getDeckManager().setPool(getDeck().getMain()); - } + final Deck deck = this.controller.getModel(); - /*** - * Provides the pool of cards the player has available to add to his or her deck. Also manages showing available cards - * to choose from for special deck construction rules, e.g.: Commander. - * @return CardPool of cards available to add to the player's deck. - */ - private CardPool getRemainingCardPool(){ final CardPool cardpool = getInitialCatalog(); - // remove bottom cards that are in the deck from the card pool - cardpool.removeAll(getDeck().getMain()); - + cardpool.removeAll(deck.getMain()); // remove sideboard cards from the catalog - cardpool.removeAll(getDeck().getOrCreate(DeckSection.Sideboard)); - - switch(FModel.getQuest().getDeckConstructionRules()){ - case Default: break; - case Commander: - //remove this deck's currently selected commander(s) from the catalog - cardpool.removeAll(getDeck().getOrCreate(DeckSection.Commander)); - - //TODO: Only thin if deck conformance is being applied - if(getDeck().getOrCreate(DeckSection.Commander).toFlatList().size() > 0) { - Predicate identityPredicate = new MatchCommanderColorIdentity(getDeckColorIdentity()); - CardPool filteredPool = cardpool.getFilteredPool(identityPredicate); - - return filteredPool; - } - break; - } - - return cardpool; - } - - /** - * Predicate that filters out based on a color identity provided upon instantiation. Used to filter the card - * list when a commander is chosen so the user can more easily see what cards are available for his or her deck - * and avoid making additions that are not legal. - */ - public static class MatchCommanderColorIdentity implements Predicate { - private final ColorSet allowedColor; - - public MatchCommanderColorIdentity(ColorSet color) { - allowedColor = color; - } - - @Override - public boolean apply(PaperCard subject) { - CardRules cr = subject.getRules(); - ManaCost mc = cr.getManaCost(); - return !mc.isPureGeneric() && allowedColor.containsAllColorsFrom(cr.getColorIdentity().getColor()); - } - } - - /** - * Compiles the color identity of the loaded deck based on the commanders. - * @return A ColorSet containing the color identity of the currently loaded deck. - */ - public ColorSet getDeckColorIdentity(){ - - List commanders = getDeck().getOrCreate(DeckSection.Commander).toFlatList(); - List colors = new ArrayList<>(); - - //Return early if there are no current commanders - if(commanders.size() == 0) return ColorSet.fromNames(colors); - - //For each commander,add each color of its color identity if not already added - for(PaperCard pc : commanders){ - if(!colors.contains("w") && pc.getRules().getColorIdentity().hasWhite()) colors.add("w"); - if(!colors.contains("u") && pc.getRules().getColorIdentity().hasBlue()) colors.add("u"); - if(!colors.contains("b") && pc.getRules().getColorIdentity().hasBlack()) colors.add("b"); - if(!colors.contains("r") && pc.getRules().getColorIdentity().hasRed()) colors.add("r"); - if(!colors.contains("g") && pc.getRules().getColorIdentity().hasGreen()) colors.add("g"); - } - - return ColorSet.fromNames(colors); - } - - /* - Used to make the code more readable in game terms. - */ - private Deck getDeck(){ - return this.controller.getModel(); - } - - private ItemPool getCommanderCardPool(){ - Predicate commanderPredicate = Predicates.compose(CardRulesPredicates.Presets.CAN_BE_COMMANDER, PaperCard.FN_GET_RULES); - return getRemainingCardPool().getFilteredPool(commanderPredicate); + cardpool.removeAll(deck.getOrCreate(DeckSection.Sideboard)); + // show cards, makes this user friendly + this.getCatalogManager().setPool(cardpool); + this.getDeckManager().setPool(deck.getMain()); } @Override @@ -385,30 +280,14 @@ public final class CEditorQuest extends CDeckEditor { } /** - * Switch between the main deck and the sideboard/Command Zone editor. + * Switch between the main deck and the sideboard editor. */ public void setEditorMode(DeckSection sectionMode) { - //Fixes null pointer error on switching tabs while quest deck editor is open. TODO: Find source of bug possibly? - if(sectionMode == null) sectionMode = DeckSection.Main; - - //Based on which section the editor is in, display the remaining card pool (or applicable card pool if in - //Commander) and the current section's cards - switch(sectionMode){ - case Main : - this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); - this.getCatalogManager().setPool(getRemainingCardPool()); - this.getDeckManager().setPool(this.controller.getModel().getMain()); - break; - case Sideboard : - this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); - this.getCatalogManager().setPool(getRemainingCardPool()); - this.getDeckManager().setPool(getDeck().getOrCreate(DeckSection.Sideboard)); - break; - case Commander : - this.getCatalogManager().setup(ItemManagerConfig.COMMANDER_POOL); - this.getCatalogManager().setPool(getCommanderCardPool()); - this.getDeckManager().setPool(getDeck().getOrCreate(DeckSection.Commander)); - break; + if (sectionMode == DeckSection.Sideboard) { + this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Sideboard)); + } + else { + this.getDeckManager().setPool(this.controller.getModel().getMain()); } this.sectionMode = sectionMode; diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java index 8aa76293b55..131805b738b 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java @@ -10,7 +10,6 @@ import forge.model.FModel; import forge.properties.ForgeConstants; import forge.quest.*; import forge.quest.StartingPoolPreferences.PoolType; -import forge.quest.data.DeckConstructionRules; import forge.quest.data.GameFormatQuest; import forge.quest.data.QuestData; import forge.quest.data.QuestPreferences.QPref; @@ -341,16 +340,9 @@ public enum CSubmenuQuestData implements ICDoc { break; } - //Apply the appropriate deck construction rules for this quest - DeckConstructionRules dcr = DeckConstructionRules.Default; - - if(VSubmenuQuestData.SINGLETON_INSTANCE.isCommander()){ - dcr = DeckConstructionRules.Commander; - } - final QuestController qc = FModel.getQuest(); - qc.newGame(questName, difficulty, mode, fmtPrizes, view.isUnlockSetsAllowed(), dckStartPool, fmtStartPool, view.getStartingWorldName(), userPrefs, dcr); + qc.newGame(questName, difficulty, mode, fmtPrizes, view.isUnlockSetsAllowed(), dckStartPool, fmtStartPool, view.getStartingWorldName(), userPrefs); FModel.getQuest().save(); // Save in preferences. diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java index 70e284faf3d..9eee9e58ca3 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java @@ -62,7 +62,6 @@ public enum VSubmenuQuestData implements IVSubmenu { private final FRadioButton radHard = new FRadioButton("Hard"); private final FRadioButton radExpert = new FRadioButton("Expert"); private final FCheckBox boxFantasy = new FCheckBox("Fantasy Mode"); - private final FCheckBox boxCommander = new FCheckBox("Commander Subformat"); private final FLabel lblStartingWorld = new FLabel.Builder().text("Starting world:").build(); private final FComboBoxWrapper cbxStartingWorld = new FComboBoxWrapper<>(); @@ -275,25 +274,9 @@ public enum VSubmenuQuestData implements IVSubmenu { } }); - // Fantasy box selected by Default + // Fantasy box enabled by Default boxFantasy.setSelected(true); boxFantasy.setEnabled(true); - - // Commander box unselected by Default - boxCommander.setSelected(false); - boxCommander.setEnabled(true); - - boxCommander.addActionListener( - new ActionListener(){ - public void actionPerformed(ActionEvent e){ - if(!isCommander()) return; //do nothing if unselecting Commander Subformat - //Otherwise, set the starting world to Random Commander - cbxStartingWorld.setSelectedItem(FModel.getWorlds().get("Random Commander")); - } - } - - ); - boxCompleteSet.setEnabled(true); boxAllowDuplicates.setEnabled(true); @@ -303,7 +286,6 @@ public enum VSubmenuQuestData implements IVSubmenu { final JPanel pnlDifficultyMode = new JPanel(new MigLayout("insets 0, gap 1%, flowy")); pnlDifficultyMode.add(difficultyPanel, "gapright 4%"); pnlDifficultyMode.add(boxFantasy, "h 25px!, gapbottom 15, gapright 4%"); - pnlDifficultyMode.add(boxCommander, "h 25px!, gapbottom 15, gapright 4%"); pnlDifficultyMode.add(lblStartingWorld, "h 25px!, hidemode 3"); cbxStartingWorld.addTo(pnlDifficultyMode, "h 27px!, w 40%, pushx, gapbottom 7"); pnlDifficultyMode.setOpaque(false); @@ -505,14 +487,6 @@ public enum VSubmenuQuestData implements IVSubmenu { return boxFantasy.isSelected(); } - /** - * Auth. Imakuni - * @return True if the "Commander Subformat" check box is selected. - */ - public boolean isCommander() { - return boxCommander.isSelected(); - } - public boolean startWithCompleteSet() { return boxCompleteSet.isSelected(); } diff --git a/forge-gui/res/quest/world/worlds.txt b/forge-gui/res/quest/world/worlds.txt index 5d99427d535..b08931cde59 100644 --- a/forge-gui/res/quest/world/worlds.txt +++ b/forge-gui/res/quest/world/worlds.txt @@ -1,6 +1,5 @@ Name:Main world Name:Random Standard -Name:Random Commander Name:Amonkhet|Dir:Amonkhet|Sets:AKH, HOU Name:Jamuraa|Dir:jamuraa|Sets:5ED, ARN, MIR, VIS, WTH|Banned:Chaos Orb; Falling Star Name:Kamigawa|Dir:2004 Kamigawa|Sets:CHK, BOK, SOK diff --git a/forge-gui/src/main/java/forge/quest/QuestController.java b/forge-gui/src/main/java/forge/quest/QuestController.java index 5366f7200bc..0d306f4431a 100644 --- a/forge-gui/src/main/java/forge/quest/QuestController.java +++ b/forge-gui/src/main/java/forge/quest/QuestController.java @@ -276,10 +276,9 @@ public class QuestController { public void newGame(final String name, final int difficulty, final QuestMode mode, final GameFormat formatPrizes, final boolean allowSetUnlocks, final Deck startingCards, final GameFormat formatStartingPool, - final String startingWorld, final StartingPoolPreferences userPrefs, - DeckConstructionRules dcr) { + final String startingWorld, final StartingPoolPreferences userPrefs) { - this.load(new QuestData(name, difficulty, mode, formatPrizes, allowSetUnlocks, startingWorld, dcr)); // pass awards and unlocks here + this.load(new QuestData(name, difficulty, mode, formatPrizes, allowSetUnlocks, startingWorld)); // pass awards and unlocks here if (startingCards != null) { this.myCards.addDeck(startingCards); @@ -436,12 +435,6 @@ public class QuestController { QuestWorld world = getWorld(); String path = ForgeConstants.DEFAULT_CHALLENGES_DIR; - //Use a variant specialized duel manager if this is a variant quest - switch(FModel.getQuest().getDeckConstructionRules()){ - case Default: break; - case Commander: this.duelManager = new QuestEventCommanderDuelManager(); return; - } - if (world != null) { if (world.getName().equals(QuestWorld.STANDARDWORLDNAME)) { @@ -456,6 +449,7 @@ public class QuestController { } this.duelManager = new QuestEventDuelManager(new File(path)); + } public HashSet GetRating() { @@ -613,6 +607,4 @@ public class QuestController { public void setCurrentDeck(String s) { model.currentDeck = s; } - - public DeckConstructionRules getDeckConstructionRules(){return model.deckConstructionRules;} } diff --git a/forge-gui/src/main/java/forge/quest/QuestEvent.java b/forge-gui/src/main/java/forge/quest/QuestEvent.java index 2a9bf6c1b63..00a140c80e2 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEvent.java +++ b/forge-gui/src/main/java/forge/quest/QuestEvent.java @@ -48,7 +48,6 @@ public abstract class QuestEvent implements IQuestEvent { private String profile = "Default"; // Opponent name if different from the challenge name private String opponentName = null; - private boolean isRandomMatch = false; public static final Function FN_GET_NAME = new Function() { @@ -175,7 +174,4 @@ public abstract class QuestEvent implements IQuestEvent { this.showDifficulty = showDifficulty; } - public boolean getIsRandomMatch(){return isRandomMatch;} - - public void setIsRandomMatch(boolean b){isRandomMatch = b;} } diff --git a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java deleted file mode 100644 index 1d7924a04d7..00000000000 --- a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java +++ /dev/null @@ -1,19 +0,0 @@ -package forge.quest; - -import forge.deck.DeckProxy; - -/** - * A QuestEventDuel with a CommanderDeckGenerator used exclusively within QuestEventCommanderDuelManager for the - * creation of randomly generated Commander decks in a Commander variant quest. - * Auth. Imakuni & Forge - */ -public class QuestEventCommanderDuel extends QuestEventDuel{ - /** - * The CommanderDeckGenerator for this duel. - */ - private DeckProxy deckProxy; - - public DeckProxy getDeckProxy() {return deckProxy;} - - public void setDeckProxy(DeckProxy dp) {deckProxy = dp;} -} diff --git a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java deleted file mode 100644 index 384d9d11d77..00000000000 --- a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java +++ /dev/null @@ -1,205 +0,0 @@ -package forge.quest; - -import forge.deck.*; -import forge.item.PaperCard; -import forge.model.FModel; -import forge.quest.data.QuestPreferences; -import forge.util.CollectionSuppliers; -import forge.util.MyRandom; -import forge.util.maps.EnumMapOfLists; -import forge.util.maps.MapOfLists; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/** - * Manages the creation of random Commander duels for a Commander variant quest. Random generation is handled via - * the CommanderDeckGenerator class. - * Auth. Forge & Imakuni#8015 - */ -public class QuestEventCommanderDuelManager implements QuestEventDuelManagerInterface { - /** - * The list of all possible Commander variant duels. - */ - private ArrayList commanderDuels = new ArrayList<>(); - - /** - * Contains the expert deck lists for the commanders. - */ - private List expertCommanderDecks; - - /** - * Immediately calls assembleDuels() to setup the commanderDuels variable. - */ - public QuestEventCommanderDuelManager(){ - assembleDuels(); - } - - /** - * Assembles the list of all possible Commander duels via CommanderDeckGenerator. Should be done within constructor. - */ - private void assembleDuels(){ - //isCardGen = true seemed to make slightly more difficult decks based purely on experience with a very small sample size. - //Gotta work on this more, its making pretty average decks after further testing. - expertCommanderDecks = CommanderDeckGenerator.getCommanderDecks(DeckFormat.Commander, true, true); - - List generatedDuels = CommanderDeckGenerator.getCommanderDecks(DeckFormat.Commander, true, false); - - for(DeckProxy dp : generatedDuels){ - QuestEventCommanderDuel duel = new QuestEventCommanderDuel(); - - duel.setDescription("Randomly generated " + dp.getName() + " commander deck."); - duel.setName(dp.getName()); - duel.setTitle(dp.getName()); - duel.setOpponentName(dp.getName()); - duel.setDifficulty(QuestEventDifficulty.EASY); - duel.setDeckProxy(dp); - - //Setting a blank deck avoids a null pointer exception. The deck is generated in generateDuels() to avoid long load times. - duel.setEventDeck(new Deck()); - - commanderDuels.add(duel); - } - } - - /** - * Retrieve list of all possible Commander duels. - * @return ArrayList containing all possible Commander duels. - */ - public Iterable getAllDuels() { - return commanderDuels; - } - - /** - * Retrieve list of all possible Commander duels. - * @param difficulty Currently unused - * @return ArrayList containing all possible Commander duels. - */ - public Iterable getDuels(QuestEventDifficulty difficulty){ - return commanderDuels; - } - - /** - * Composes an ArrayList containing 4 QuestEventDuels composed with Commander variant decks. One duel will have its - * title replaced as Random. - * @return ArrayList of QuestEventDuels containing 4 duels. - */ - public List generateDuels(){ - final List duelOpponents = new ArrayList<>(); - - //While there are less than 4 duels chosen - while(duelOpponents.size() < 4){ - //Get a random duel from the possible duels list - QuestEventCommanderDuel duel = (QuestEventCommanderDuel)commanderDuels.get(((int) (commanderDuels.size() * MyRandom.getRandom().nextDouble()))); - - //If the chosen duels list already contains this duel, get a different duel to prevent duplicate duels - if(duelOpponents.contains(duel)) continue; - - //Add the randomly chosen duel to the duel list - duelOpponents.add(duel); - - //Here the actual deck for this commander is generated by calling .getDeck() on the saved DeckProxy - duel.setEventDeck(duel.getDeckProxy().getDeck()); - - //Modify deck for difficulty - modifyDuelForDifficulty(duel); - - - } - - //Modify the stats of the final duel to hide the opponent, creating a "random" duel. - //We make a copy of the final duel and overwrite it in the duelOpponents to avoid changing the variables in - //the original duel, which gets reused. - QuestEventCommanderDuel duel = (QuestEventCommanderDuel)duelOpponents.get(duelOpponents.size() - 1); - QuestEventCommanderDuel randomDuel = new QuestEventCommanderDuel(); - - randomDuel.setName(duel.getName()); - randomDuel.setOpponentName(duel.getName()); - randomDuel.setDeckProxy(duel.getDeckProxy()); - randomDuel.setTitle("Random Opponent"); - randomDuel.setShowDifficulty(false); - randomDuel.setDescription("Fight a random generated commander opponent."); - randomDuel.setIsRandomMatch(true); - randomDuel.setEventDeck(duel.getEventDeck()); - - //Replace the final duel with this newly modified "random" duel - duelOpponents.set(duelOpponents.size()-1, randomDuel); - - return duelOpponents; - } - - /** - * Retrieves the expert level deck generation of a deck with the same commander as the provided DeckProxy. - * @param dp The easy generation commander deck - * @return The same commander's expert generation DeckProxy - */ - private Deck getExpertGenDeck(DeckProxy dp){ - for(QuestEventDuel qed : commanderDuels){ - QuestEventCommanderDuel cmdQED = (QuestEventCommanderDuel)qed; - if(cmdQED.getDeckProxy().getName().equals(dp.getName())){ - return cmdQED.getDeckProxy().getDeck(); - } - } - return null; - } - - /** - * Modifies a given duel by replacing a percentage of the deck with random cards from the more difficult generated version - * of the same commander's deck. Medium replaces 30%, Hard replaces 60%, Expert replaces 100%. - * @param duel The QuestEventCommanderDuel to modify - */ - private void modifyDuelForDifficulty(QuestEventCommanderDuel duel){ - final QuestPreferences questPreferences = FModel.getQuestPreferences(); - final int index = FModel.getQuest().getAchievements().getDifficulty(); - final int numberOfWins = FModel.getQuest().getAchievements().getWin(); - Deck expertDeck = getExpertGenDeck(duel.getDeckProxy()); - - int difficultyReplacementPercent = 0; - - //Note: The code is ordered to make the least number of comparisons I could think of at the time for speed reasons. - //In reality, it shouldn't really make much difference, but why not? - if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_EXPERTAI, index)) { - //At expert, the deck is replaced with the entire expert deck, and we can return immediately - duel.setEventDeck(expertDeck); - duel.setDifficulty(QuestEventDifficulty.EXPERT); - return; - } - - if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_MEDIUMAI, index)) { - difficultyReplacementPercent += 30; - duel.setDifficulty(QuestEventDifficulty.MEDIUM); - } else return; //return early here since it would be an easy opponent with no changes - - if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_HARDAI, index)) { - difficultyReplacementPercent += 30; - duel.setDifficulty(QuestEventDifficulty.HARD); - } - - CardPool easyMain = duel.getEventDeck().getMain(); - CardPool expertMain = expertDeck.getMain(); - - List easyList = easyMain.toFlatList(); - List expertList = expertMain.toFlatList(); - - //Replace cards in the easy deck with cards from the expert deck up to the difficulty replacement percent - for(int i = 0; i < difficultyReplacementPercent; i++){ - if(!easyMain.contains(expertList.get(i))) { //ensure that the card being copied over isn't already in the deck - easyMain.remove(easyList.get(i)); - easyMain.add(expertList.get(i)); - } - else{ - expertList.remove(expertList.get(i)); - i--; - if(expertList.size() == 0) break; //break if there are no more cards to copy over - } - } - } - - /** - * Randomizes the list of Commander Duels. - */ - public void randomizeOpponents(){ - Collections.shuffle(commanderDuels); - } -} diff --git a/forge-gui/src/main/java/forge/quest/QuestSpellShop.java b/forge-gui/src/main/java/forge/quest/QuestSpellShop.java index 96eae768963..e9196e417df 100644 --- a/forge-gui/src/main/java/forge/quest/QuestSpellShop.java +++ b/forge-gui/src/main/java/forge/quest/QuestSpellShop.java @@ -344,24 +344,11 @@ public class QuestSpellShop { List> cardsToRemove = new LinkedList<>(); for (Entry item : inventoryManager.getPool()) { PaperCard card = (PaperCard)item.getKey(); - //Number of a particular card to keep - int numToKeep = 4; - - if(card.getRules().getType().isBasic()){ - numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_BASIC_LAND_SIZE); - } else{ - //Choose card limit restrictions based on deck construction rules, e.g.: Commander allows only singletons - switch(FModel.getQuest().getDeckConstructionRules()){ - case Default: numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_SIZE); break; - case Commander: numToKeep = 1; - } - } - - //If this card has an exception to the card limit, e.g.: Relentless Rats, get the quest preference + int numToKeep = card.getRules().getType().isBasic() ? + FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_BASIC_LAND_SIZE) : FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_SIZE); if (DeckFormat.getLimitExceptions().contains(card.getName())) { numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_ANY_NUMBER_SIZE); } - if (numToKeep < item.getValue()) { cardsToRemove.add(Pair.of(item.getKey(), item.getValue() - numToKeep)); } diff --git a/forge-gui/src/main/java/forge/quest/QuestUtil.java b/forge-gui/src/main/java/forge/quest/QuestUtil.java index 7ad6b6cd335..c2fe796ef7b 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtil.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtil.java @@ -41,7 +41,6 @@ import forge.properties.ForgePreferences.FPref; import forge.quest.bazaar.IQuestBazaarItem; import forge.quest.bazaar.QuestItemType; import forge.quest.bazaar.QuestPetController; -import forge.quest.data.DeckConstructionRules; import forge.quest.data.QuestAchievements; import forge.quest.data.QuestAssets; import forge.util.gui.SGuiChoose; @@ -52,7 +51,6 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; -import java.util.TreeSet; /** *

@@ -533,17 +531,7 @@ public class QuestUtil { Integer lifeHuman = null; boolean useBazaar = true; Boolean forceAnte = null; - - //Generate a life modifier based on this quest's variant as held in the Quest Controller's DeckConstructionRules - int variantLifeModifier = 0; - - switch(FModel.getQuest().getDeckConstructionRules()){ - case Default: break; - case Commander: variantLifeModifier = 20; break; - } - - int lifeAI = 20 + variantLifeModifier; - + int lifeAI = 20; if (event instanceof QuestEventChallenge) { final QuestEventChallenge qc = ((QuestEventChallenge) event); lifeAI = qc.getAILife(); @@ -557,9 +545,8 @@ public class QuestUtil { forceAnte = qc.isForceAnte(); } - final RegisteredPlayer humanStart = getRegisteredPlayerByVariant(getDeckForNewGame()); - - final RegisteredPlayer aiStart = getRegisteredPlayerByVariant(event.getEventDeck()); + final RegisteredPlayer humanStart = new RegisteredPlayer(getDeckForNewGame()); + final RegisteredPlayer aiStart = new RegisteredPlayer(event.getEventDeck()); if (lifeHuman != null) { humanStart.setStartingLife(lifeHuman); @@ -594,39 +581,17 @@ public class QuestUtil { rules.setGamesPerMatch(qData.getMatchLength()); rules.setManaBurn(FModel.getPreferences().getPrefBoolean(FPref.UI_MANABURN)); rules.setCanCloneUseTargetsImage(FModel.getPreferences().getPrefBoolean(FPref.UI_CLONE_MODE_SOURCE)); - - TreeSet variant = new TreeSet(); - if(FModel.getQuest().getDeckConstructionRules() == DeckConstructionRules.Commander){ - variant.add(GameType.Commander); - } - final HostedMatch hostedMatch = GuiBase.getInterface().hostMatch(); final IGuiGame gui = GuiBase.getInterface().getNewGuiGame(); gui.setPlayerAvatar(aiPlayer, event); FThreads.invokeInEdtNowOrLater(new Runnable(){ @Override public void run() { - hostedMatch.startMatch(rules, variant, starter, ImmutableMap.of(humanStart, gui)); + hostedMatch.startMatch(rules, null, starter, ImmutableMap.of(humanStart, gui)); } }); } - /** - * Uses the appropriate RegisteredPlayer command for generating a RegisteredPlayer based on this quest's variant as - * held by the QuestController's DeckConstructionRules. - * @param deck The deck to generate the RegisteredPlayer with - * @return A newly made RegisteredPlayer specific to the quest's variant - */ - private static RegisteredPlayer getRegisteredPlayerByVariant(Deck deck){ - switch (FModel.getQuest().getDeckConstructionRules()) { - case Default: - return new RegisteredPlayer(deck); - case Commander: - return RegisteredPlayer.forCommander(deck); - } - return null; - } - private static Deck getDeckForNewGame() { Deck deck = null; if (event instanceof QuestEventChallenge) { @@ -658,7 +623,7 @@ public class QuestUtil { } if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) { - final String errorMessage = getDeckConformanceProblems(deck); + final String errorMessage = GameType.Quest.getDeckFormat().getDeckConformanceProblem(deck); if (null != errorMessage) { SOptionPane.showErrorDialog("Your deck " + errorMessage + " Please edit or choose a different deck.", "Invalid Deck"); return false; @@ -668,21 +633,6 @@ public class QuestUtil { return true; } - public static String getDeckConformanceProblems(Deck deck){ - String errorMessage = GameType.Quest.getDeckFormat().getDeckConformanceProblem(deck);; - - if(errorMessage != null) return errorMessage; //return immediately if the deck does not conform to quest requirements - - //Check for all applicable deck construction rules per this quests's saved DeckConstructionRules enum - switch(FModel.getQuest().getDeckConstructionRules()){ - case Commander: - errorMessage = GameType.Commander.getDeckFormat().getDeckConformanceProblem(deck); - break; - } - - return errorMessage; - } - /** Duplicate in DeckEditorQuestMenu and * probably elsewhere...can streamline at some point * (probably shouldn't be here). diff --git a/forge-gui/src/main/java/forge/quest/QuestUtilCards.java b/forge-gui/src/main/java/forge/quest/QuestUtilCards.java index 54a4887ba8a..c8d77d863ad 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtilCards.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtilCards.java @@ -308,16 +308,10 @@ public final class QuestUtilCards { * user preferences */ public void setupNewGameCardPool(final GameFormat formatStartingPool, final int idxDifficulty, final StartingPoolPreferences userPrefs) { - //Add additional cards to the starter card pool based on variant if applicable - double variantModifier = 0; - switch(FModel.getQuest().getDeckConstructionRules()){ - case Default: break; - case Commander: variantModifier = 2; break; - } - final int nC = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_COMMONS, idxDifficulty) * variantModifier); - final int nU = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_UNCOMMONS, idxDifficulty) * variantModifier); - final int nR = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_RARES, idxDifficulty) * variantModifier); + final int nC = questPreferences.getPrefInt(DifficultyPrefs.STARTING_COMMONS, idxDifficulty); + final int nU = questPreferences.getPrefInt(DifficultyPrefs.STARTING_UNCOMMONS, idxDifficulty); + final int nR = questPreferences.getPrefInt(DifficultyPrefs.STARTING_RARES, idxDifficulty); addAllCards(BoosterUtils.getQuestStarterDeck(formatStartingPool, nC, nU, nR, userPrefs)); diff --git a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java index 265ea61bb58..2e93e7d4fec 100644 --- a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java +++ b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java @@ -226,11 +226,6 @@ public class QuestWinLoseController { sb.append(StringUtils.capitalize(qEvent.getDifficulty().getTitle())); sb.append(" opponent: ").append(credBase).append(" credits.\n"); - if(qEvent.getIsRandomMatch()){ - sb.append("Random Opponent Bonus: " + credBase + " credit" + (credBase > 1 ? "s." : ".") + "\n"); - credBase += credBase; - } - final int winMultiplier = Math.min(qData.getAchievements().getWin(), FModel.getQuestPreferences().getPrefInt(QPref.REWARDS_WINS_MULTIPLIER_MAX)); final int creditsForPreviousWins = (int) ((Double.parseDouble(FModel.getQuestPreferences() .getPref(QPref.REWARDS_WINS_MULTIPLIER)) * winMultiplier)); diff --git a/forge-gui/src/main/java/forge/quest/QuestWorld.java b/forge-gui/src/main/java/forge/quest/QuestWorld.java index 4c77b0ec515..e20dcf98ce8 100644 --- a/forge-gui/src/main/java/forge/quest/QuestWorld.java +++ b/forge-gui/src/main/java/forge/quest/QuestWorld.java @@ -40,7 +40,6 @@ public class QuestWorld implements Comparable{ private final String dir; private final GameFormatQuest format; public static final String STANDARDWORLDNAME = "Random Standard"; - public static final String RANDOMCOMMANDERWORLDNAME = "Random Commander"; private boolean isCustom; @@ -130,6 +129,7 @@ public class QuestWorld implements Comparable{ /** * TODO: Write javadoc for Constructor. * @param file0 + * @param keySelector0 */ public Reader(String file0) { super(file0, QuestWorld.FN_GET_NAME); @@ -194,12 +194,6 @@ public class QuestWorld implements Comparable{ FModel.getFormats().getStandard().getBannedCardNames(),false); } - if (useName.equalsIgnoreCase(QuestWorld.RANDOMCOMMANDERWORLDNAME)){ - useFormat = new GameFormatQuest(QuestWorld.RANDOMCOMMANDERWORLDNAME, - FModel.getFormats().getFormat("Commander").getAllowedSetCodes(), - FModel.getFormats().getFormat("Commander").getBannedCardNames(),false); - } - // System.out.println("Creating quest world " + useName + " (index " + useIdx + ", dir: " + useDir); // if (useFormat != null) { System.out.println("SETS: " + sets + "\nBANNED: " + bannedCards); } diff --git a/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java b/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java deleted file mode 100644 index 3744beea09d..00000000000 --- a/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java +++ /dev/null @@ -1,17 +0,0 @@ -package forge.quest.data; - -/** - * Used to clarify which subformat a quest is using e.g. Commander. - * Auth. Imakuni - */ -public enum DeckConstructionRules { - /** - * Typically has no effect on Quest gameplay. - */ - Default, - - /** - * Commander ruleset. 99 card deck, no copies other than basic lands, commander(s) in Command zone - */ - Commander -} 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..616c49d937b 100644 --- a/forge-gui/src/main/java/forge/quest/data/QuestAssets.java +++ b/forge-gui/src/main/java/forge/quest/data/QuestAssets.java @@ -200,14 +200,7 @@ public class QuestAssets { * @return the life */ public int getLife(final QuestMode mode) { - int base = mode.equals(QuestMode.Fantasy) ? 15 : 20; - - //Modify life for the quest's sub-format, e.g.: Commander adds 20 - switch(FModel.getQuest().getDeckConstructionRules()){ - case Default: break; - case Commander: base += 20; - } - + final int base = mode.equals(QuestMode.Fantasy) ? 15 : 20; return (base + this.getItemLevel(QuestItemType.ELIXIR_OF_LIFE)) - this.getItemLevel(QuestItemType.POUND_FLESH); } diff --git a/forge-gui/src/main/java/forge/quest/data/QuestData.java b/forge-gui/src/main/java/forge/quest/data/QuestData.java index 41574634113..e6a75adef7d 100644 --- a/forge-gui/src/main/java/forge/quest/data/QuestData.java +++ b/forge-gui/src/main/java/forge/quest/data/QuestData.java @@ -42,7 +42,7 @@ import java.util.Map; */ public final class QuestData { /** Holds the latest version of the Quest Data. */ - public static final int CURRENT_VERSION_NUMBER = 13; + public static final int CURRENT_VERSION_NUMBER = 12; // This field places the version number into QD instance, // but only when the object is created through the constructor @@ -70,11 +70,6 @@ public final class QuestData { public String currentDeck = "DEFAULT"; - /** - * Holds the subformat for this quest. Defaults to DeckConstructionRules.Default. - */ - public DeckConstructionRules deckConstructionRules = DeckConstructionRules.Default; - public QuestData() { //needed for XML serialization } @@ -92,11 +87,9 @@ public final class QuestData { * allow set unlocking during quest * @param startingWorld * starting world - * @param dcr - * deck construction rules e.g. Commander */ public QuestData(String name0, int diff, QuestMode mode0, GameFormat userFormat, - boolean allowSetUnlocks, final String startingWorld, DeckConstructionRules dcr) { + boolean allowSetUnlocks, final String startingWorld) { this.name = name0; if (userFormat != null) { @@ -106,7 +99,6 @@ public final class QuestData { this.achievements = new QuestAchievements(diff); this.assets = new QuestAssets(format); this.worldId = startingWorld; - this.deckConstructionRules = dcr; } /** diff --git a/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java b/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java index cd232367df9..de680502e37 100644 --- a/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java +++ b/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java @@ -223,16 +223,10 @@ public class QuestDataIO { // Current Deck moved from preferences to quest data - it should not be global for all quests!!! QuestDataIO.setFinalField(QuestData.class, "currentDeck", newData, FModel.getQuestPreferences().getPref(QPref.CURRENT_DECK)); } - if(saveVersion < 13){ - //Update for quest DeckConstructionRules - //Add a DeckConstructionRules set to Default. - QuestDataIO.setFinalField(QuestData.class, "deckConstructionRules", newData, DeckConstructionRules.Default); - } - if (saveVersion < 14) { + if (saveVersion < 13) { // Migrate DraftTournaments to use new Tournament class } - final QuestAssets qS = newData.getAssets(); final QuestAchievements qA = newData.getAchievements(); From 71eaf70df597d5f090d5098bfc9a161650030957 Mon Sep 17 00:00:00 2001 From: Jeremy Pelkala Date: Fri, 2 Nov 2018 18:57:17 -0400 Subject: [PATCH 128/901] Added Commander quest mode and world -CardPool Added getFilteredPool() to easily get a Predicate applied copy of a CardPool. -GameRules Minor formatting change. -worlds.txt Added Random Commander to the list. -DeckConstructionRules New enum for defining the subformat a quest is using. -QuestAssets getLife() now has a switch for modifying the life for sub-formats. -QuestData New data save version. Includes a DeckConstructionRules enum. -QuestDataIO updateSaveFile will update old saves to have a default DeckConstructionRules complying with the new QuestData save version. -QuestController Updated to include support for DeckConstructionRules and specialized duel managers -QuestEvent Now have boolean to define if this is a "random" match for the duel list. Currently only QuestEventCommanderDuelManager makes use of this feature for Commander quests. -QuestEventCommanderDuel New QuestEventDuel used in the QuestEventCommanderDuelManager which contains a DeckProxy for use in generating random commander decks. -QuestEventCommanderDuelManager New duel manager to generate duels by difficulty for a Commander quest. Currently uses random generation to generate the decks of each opponent. -QuestSpellShop Sell Extras button now has a switch for taking into account special deck construction rules such as Commander only allowing singletons. -QuestUtil Starting a game now checks for various sub-format specific changes including a switch case for which variety of registered player to use. -QuestUtilCards Starting cardpool size is now modified by a switch case for sub-formats such as Commander. -QuestWinLoseController QuestEvents marked as random matches will now award a "Random Opponent Bonus" equal to the credit base. Currently only QuestEventCommanderDuelManager creates QuestEvents marked as such. -QuestWorld Added support for the Commander quest format and world. -CEditorQuest Many changes to add support for Commander in a style that, hopefully, also paths the way for future format support. -CSubmenuQuestData Support for Commander quests. -VSubmenuQuestData Support for Commander quests. --- .../src/main/java/forge/deck/CardPool.java | 14 ++ .../src/main/java/forge/game/GameRules.java | 3 +- .../deckeditor/controllers/CEditorQuest.java | 151 +++++++++++-- .../screens/home/quest/CSubmenuQuestData.java | 10 +- .../screens/home/quest/VSubmenuQuestData.java | 28 ++- forge-gui/res/quest/world/worlds.txt | 1 + .../java/forge/quest/QuestController.java | 14 +- .../src/main/java/forge/quest/QuestEvent.java | 4 + .../forge/quest/QuestEventCommanderDuel.java | 19 ++ .../quest/QuestEventCommanderDuelManager.java | 205 ++++++++++++++++++ .../main/java/forge/quest/QuestSpellShop.java | 17 +- .../src/main/java/forge/quest/QuestUtil.java | 60 ++++- .../main/java/forge/quest/QuestUtilCards.java | 12 +- .../forge/quest/QuestWinLoseController.java | 5 + .../src/main/java/forge/quest/QuestWorld.java | 8 +- .../quest/data/DeckConstructionRules.java | 17 ++ .../java/forge/quest/data/QuestAssets.java | 9 +- .../main/java/forge/quest/data/QuestData.java | 12 +- .../main/java/forge/quest/io/QuestDataIO.java | 8 +- 19 files changed, 561 insertions(+), 36 deletions(-) create mode 100644 forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java create mode 100644 forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java create mode 100644 forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java diff --git a/forge-core/src/main/java/forge/deck/CardPool.java b/forge-core/src/main/java/forge/deck/CardPool.java index 72ab8efb851..b484f31ab98 100644 --- a/forge-core/src/main/java/forge/deck/CardPool.java +++ b/forge-core/src/main/java/forge/deck/CardPool.java @@ -17,6 +17,7 @@ */ package forge.deck; +import com.google.common.base.Predicate; import com.google.common.collect.Lists; import forge.StaticData; import forge.card.CardDb; @@ -216,4 +217,17 @@ public class CardPool extends ItemPool { } return sb.toString(); } + + /** + * Applies a predicate to this CardPool's cards. + * @param predicate the Predicate to apply to this CardPool + * @return a new CardPool made from this CardPool with only the cards that agree with the provided Predicate + */ + public CardPool getFilteredPool(Predicate predicate){ + CardPool filteredPool = new CardPool(); + for(PaperCard pc : this.items.keySet()){ + if(predicate.apply(pc)) filteredPool.add(pc); + } + return filteredPool; + } } diff --git a/forge-game/src/main/java/forge/game/GameRules.java b/forge-game/src/main/java/forge/game/GameRules.java index dc7ed4cddf1..5e6876e9801 100644 --- a/forge-game/src/main/java/forge/game/GameRules.java +++ b/forge-game/src/main/java/forge/game/GameRules.java @@ -78,7 +78,8 @@ public class GameRules { } public boolean hasCommander() { - return appliedVariants.contains(GameType.Commander) || appliedVariants.contains(GameType.TinyLeaders) + return appliedVariants.contains(GameType.Commander) + || appliedVariants.contains(GameType.TinyLeaders) || appliedVariants.contains(GameType.Brawl); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java index c33da12cda7..b7842272e42 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java @@ -18,11 +18,20 @@ package forge.screens.deckeditor.controllers; import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; import com.google.common.base.Supplier; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; import forge.UiCommand; +import forge.card.CardRules; +import forge.card.CardRulesPredicates; +import forge.card.ColorSet; +import forge.card.mana.ManaCost; import forge.deck.CardPool; import forge.deck.Deck; import forge.deck.DeckSection; +import forge.deck.generation.DeckGeneratorBase; import forge.gui.GuiUtils; import forge.gui.framework.DragCell; import forge.gui.framework.FScreen; @@ -35,6 +44,7 @@ import forge.itemmanager.views.ItemTableColumn; import forge.model.FModel; import forge.properties.ForgePreferences.FPref; import forge.quest.QuestController; +import forge.quest.data.DeckConstructionRules; import forge.screens.deckeditor.AddBasicLandsDialog; import forge.screens.deckeditor.SEditorIO; import forge.screens.deckeditor.views.VAllDecks; @@ -48,6 +58,7 @@ import forge.util.ItemPool; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.print.Paper; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -103,6 +114,14 @@ public final class CEditorQuest extends CDeckEditor { allSections.add(DeckSection.Main); allSections.add(DeckSection.Sideboard); + //Add sub-format specific sections + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: + allSections.add(DeckSection.Commander); + break; + } + this.questData = questData0; final CardManager catalogManager = new CardManager(cDetailPicture, false, true); @@ -158,6 +177,10 @@ public final class CEditorQuest extends CDeckEditor { @Override protected CardLimit getCardLimit() { if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) { + //If this is a commander quest, only allow single copies of cards + if(FModel.getQuest().getDeckConstructionRules() == DeckConstructionRules.Commander){ + return CardLimit.Singleton; + } return CardLimit.Default; } return CardLimit.None; //if not enforcing deck legality, don't enforce default limit @@ -245,16 +268,98 @@ public final class CEditorQuest extends CDeckEditor { public void resetTables() { this.sectionMode = DeckSection.Main; - final Deck deck = this.controller.getModel(); - - final CardPool cardpool = getInitialCatalog(); - // remove bottom cards that are in the deck from the card pool - cardpool.removeAll(deck.getMain()); - // remove sideboard cards from the catalog - cardpool.removeAll(deck.getOrCreate(DeckSection.Sideboard)); // show cards, makes this user friendly - this.getCatalogManager().setPool(cardpool); - this.getDeckManager().setPool(deck.getMain()); + this.getCatalogManager().setPool(getRemainingCardPool()); + this.getDeckManager().setPool(getDeck().getMain()); + } + + /*** + * Provides the pool of cards the player has available to add to his or her deck. Also manages showing available cards + * to choose from for special deck construction rules, e.g.: Commander. + * @return CardPool of cards available to add to the player's deck. + */ + private CardPool getRemainingCardPool(){ + final CardPool cardpool = getInitialCatalog(); + + // remove bottom cards that are in the deck from the card pool + cardpool.removeAll(getDeck().getMain()); + + // remove sideboard cards from the catalog + cardpool.removeAll(getDeck().getOrCreate(DeckSection.Sideboard)); + + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: + //remove this deck's currently selected commander(s) from the catalog + cardpool.removeAll(getDeck().getOrCreate(DeckSection.Commander)); + + //TODO: Only thin if deck conformance is being applied + if(getDeck().getOrCreate(DeckSection.Commander).toFlatList().size() > 0) { + Predicate identityPredicate = new MatchCommanderColorIdentity(getDeckColorIdentity()); + CardPool filteredPool = cardpool.getFilteredPool(identityPredicate); + + return filteredPool; + } + break; + } + + return cardpool; + } + + /** + * Predicate that filters out based on a color identity provided upon instantiation. Used to filter the card + * list when a commander is chosen so the user can more easily see what cards are available for his or her deck + * and avoid making additions that are not legal. + */ + public static class MatchCommanderColorIdentity implements Predicate { + private final ColorSet allowedColor; + + public MatchCommanderColorIdentity(ColorSet color) { + allowedColor = color; + } + + @Override + public boolean apply(PaperCard subject) { + CardRules cr = subject.getRules(); + ManaCost mc = cr.getManaCost(); + return !mc.isPureGeneric() && allowedColor.containsAllColorsFrom(cr.getColorIdentity().getColor()); + } + } + + /** + * Compiles the color identity of the loaded deck based on the commanders. + * @return A ColorSet containing the color identity of the currently loaded deck. + */ + public ColorSet getDeckColorIdentity(){ + + List commanders = getDeck().getOrCreate(DeckSection.Commander).toFlatList(); + List colors = new ArrayList<>(); + + //Return early if there are no current commanders + if(commanders.size() == 0) return ColorSet.fromNames(colors); + + //For each commander,add each color of its color identity if not already added + for(PaperCard pc : commanders){ + if(!colors.contains("w") && pc.getRules().getColorIdentity().hasWhite()) colors.add("w"); + if(!colors.contains("u") && pc.getRules().getColorIdentity().hasBlue()) colors.add("u"); + if(!colors.contains("b") && pc.getRules().getColorIdentity().hasBlack()) colors.add("b"); + if(!colors.contains("r") && pc.getRules().getColorIdentity().hasRed()) colors.add("r"); + if(!colors.contains("g") && pc.getRules().getColorIdentity().hasGreen()) colors.add("g"); + } + + return ColorSet.fromNames(colors); + } + + /* + Used to make the code more readable in game terms. + */ + private Deck getDeck(){ + return this.controller.getModel(); + } + + private ItemPool getCommanderCardPool(){ + Predicate commanderPredicate = Predicates.compose(CardRulesPredicates.Presets.CAN_BE_COMMANDER, PaperCard.FN_GET_RULES); + return getRemainingCardPool().getFilteredPool(commanderPredicate); } @Override @@ -280,14 +385,30 @@ public final class CEditorQuest extends CDeckEditor { } /** - * Switch between the main deck and the sideboard editor. + * Switch between the main deck and the sideboard/Command Zone editor. */ public void setEditorMode(DeckSection sectionMode) { - if (sectionMode == DeckSection.Sideboard) { - this.getDeckManager().setPool(this.controller.getModel().getOrCreate(DeckSection.Sideboard)); - } - else { - this.getDeckManager().setPool(this.controller.getModel().getMain()); + //Fixes null pointer error on switching tabs while quest deck editor is open. TODO: Find source of bug possibly? + if(sectionMode == null) sectionMode = DeckSection.Main; + + //Based on which section the editor is in, display the remaining card pool (or applicable card pool if in + //Commander) and the current section's cards + switch(sectionMode){ + case Main : + this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); + this.getCatalogManager().setPool(getRemainingCardPool()); + this.getDeckManager().setPool(this.controller.getModel().getMain()); + break; + case Sideboard : + this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); + this.getCatalogManager().setPool(getRemainingCardPool()); + this.getDeckManager().setPool(getDeck().getOrCreate(DeckSection.Sideboard)); + break; + case Commander : + this.getCatalogManager().setup(ItemManagerConfig.COMMANDER_POOL); + this.getCatalogManager().setPool(getCommanderCardPool()); + this.getDeckManager().setPool(getDeck().getOrCreate(DeckSection.Commander)); + break; } this.sectionMode = sectionMode; diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java index 131805b738b..8aa76293b55 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuQuestData.java @@ -10,6 +10,7 @@ import forge.model.FModel; import forge.properties.ForgeConstants; import forge.quest.*; import forge.quest.StartingPoolPreferences.PoolType; +import forge.quest.data.DeckConstructionRules; import forge.quest.data.GameFormatQuest; import forge.quest.data.QuestData; import forge.quest.data.QuestPreferences.QPref; @@ -340,9 +341,16 @@ public enum CSubmenuQuestData implements ICDoc { break; } + //Apply the appropriate deck construction rules for this quest + DeckConstructionRules dcr = DeckConstructionRules.Default; + + if(VSubmenuQuestData.SINGLETON_INSTANCE.isCommander()){ + dcr = DeckConstructionRules.Commander; + } + final QuestController qc = FModel.getQuest(); - qc.newGame(questName, difficulty, mode, fmtPrizes, view.isUnlockSetsAllowed(), dckStartPool, fmtStartPool, view.getStartingWorldName(), userPrefs); + qc.newGame(questName, difficulty, mode, fmtPrizes, view.isUnlockSetsAllowed(), dckStartPool, fmtStartPool, view.getStartingWorldName(), userPrefs, dcr); FModel.getQuest().save(); // Save in preferences. diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java index 9eee9e58ca3..70e284faf3d 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/VSubmenuQuestData.java @@ -62,6 +62,7 @@ public enum VSubmenuQuestData implements IVSubmenu { private final FRadioButton radHard = new FRadioButton("Hard"); private final FRadioButton radExpert = new FRadioButton("Expert"); private final FCheckBox boxFantasy = new FCheckBox("Fantasy Mode"); + private final FCheckBox boxCommander = new FCheckBox("Commander Subformat"); private final FLabel lblStartingWorld = new FLabel.Builder().text("Starting world:").build(); private final FComboBoxWrapper cbxStartingWorld = new FComboBoxWrapper<>(); @@ -274,9 +275,25 @@ public enum VSubmenuQuestData implements IVSubmenu { } }); - // Fantasy box enabled by Default + // Fantasy box selected by Default boxFantasy.setSelected(true); boxFantasy.setEnabled(true); + + // Commander box unselected by Default + boxCommander.setSelected(false); + boxCommander.setEnabled(true); + + boxCommander.addActionListener( + new ActionListener(){ + public void actionPerformed(ActionEvent e){ + if(!isCommander()) return; //do nothing if unselecting Commander Subformat + //Otherwise, set the starting world to Random Commander + cbxStartingWorld.setSelectedItem(FModel.getWorlds().get("Random Commander")); + } + } + + ); + boxCompleteSet.setEnabled(true); boxAllowDuplicates.setEnabled(true); @@ -286,6 +303,7 @@ public enum VSubmenuQuestData implements IVSubmenu { final JPanel pnlDifficultyMode = new JPanel(new MigLayout("insets 0, gap 1%, flowy")); pnlDifficultyMode.add(difficultyPanel, "gapright 4%"); pnlDifficultyMode.add(boxFantasy, "h 25px!, gapbottom 15, gapright 4%"); + pnlDifficultyMode.add(boxCommander, "h 25px!, gapbottom 15, gapright 4%"); pnlDifficultyMode.add(lblStartingWorld, "h 25px!, hidemode 3"); cbxStartingWorld.addTo(pnlDifficultyMode, "h 27px!, w 40%, pushx, gapbottom 7"); pnlDifficultyMode.setOpaque(false); @@ -487,6 +505,14 @@ public enum VSubmenuQuestData implements IVSubmenu { return boxFantasy.isSelected(); } + /** + * Auth. Imakuni + * @return True if the "Commander Subformat" check box is selected. + */ + public boolean isCommander() { + return boxCommander.isSelected(); + } + public boolean startWithCompleteSet() { return boxCompleteSet.isSelected(); } diff --git a/forge-gui/res/quest/world/worlds.txt b/forge-gui/res/quest/world/worlds.txt index b08931cde59..5d99427d535 100644 --- a/forge-gui/res/quest/world/worlds.txt +++ b/forge-gui/res/quest/world/worlds.txt @@ -1,5 +1,6 @@ Name:Main world Name:Random Standard +Name:Random Commander Name:Amonkhet|Dir:Amonkhet|Sets:AKH, HOU Name:Jamuraa|Dir:jamuraa|Sets:5ED, ARN, MIR, VIS, WTH|Banned:Chaos Orb; Falling Star Name:Kamigawa|Dir:2004 Kamigawa|Sets:CHK, BOK, SOK diff --git a/forge-gui/src/main/java/forge/quest/QuestController.java b/forge-gui/src/main/java/forge/quest/QuestController.java index 0d306f4431a..5366f7200bc 100644 --- a/forge-gui/src/main/java/forge/quest/QuestController.java +++ b/forge-gui/src/main/java/forge/quest/QuestController.java @@ -276,9 +276,10 @@ public class QuestController { public void newGame(final String name, final int difficulty, final QuestMode mode, final GameFormat formatPrizes, final boolean allowSetUnlocks, final Deck startingCards, final GameFormat formatStartingPool, - final String startingWorld, final StartingPoolPreferences userPrefs) { + final String startingWorld, final StartingPoolPreferences userPrefs, + DeckConstructionRules dcr) { - this.load(new QuestData(name, difficulty, mode, formatPrizes, allowSetUnlocks, startingWorld)); // pass awards and unlocks here + this.load(new QuestData(name, difficulty, mode, formatPrizes, allowSetUnlocks, startingWorld, dcr)); // pass awards and unlocks here if (startingCards != null) { this.myCards.addDeck(startingCards); @@ -435,6 +436,12 @@ public class QuestController { QuestWorld world = getWorld(); String path = ForgeConstants.DEFAULT_CHALLENGES_DIR; + //Use a variant specialized duel manager if this is a variant quest + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: this.duelManager = new QuestEventCommanderDuelManager(); return; + } + if (world != null) { if (world.getName().equals(QuestWorld.STANDARDWORLDNAME)) { @@ -449,7 +456,6 @@ public class QuestController { } this.duelManager = new QuestEventDuelManager(new File(path)); - } public HashSet GetRating() { @@ -607,4 +613,6 @@ public class QuestController { public void setCurrentDeck(String s) { model.currentDeck = s; } + + public DeckConstructionRules getDeckConstructionRules(){return model.deckConstructionRules;} } diff --git a/forge-gui/src/main/java/forge/quest/QuestEvent.java b/forge-gui/src/main/java/forge/quest/QuestEvent.java index 00a140c80e2..2a9bf6c1b63 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEvent.java +++ b/forge-gui/src/main/java/forge/quest/QuestEvent.java @@ -48,6 +48,7 @@ public abstract class QuestEvent implements IQuestEvent { private String profile = "Default"; // Opponent name if different from the challenge name private String opponentName = null; + private boolean isRandomMatch = false; public static final Function FN_GET_NAME = new Function() { @@ -174,4 +175,7 @@ public abstract class QuestEvent implements IQuestEvent { this.showDifficulty = showDifficulty; } + public boolean getIsRandomMatch(){return isRandomMatch;} + + public void setIsRandomMatch(boolean b){isRandomMatch = b;} } diff --git a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java new file mode 100644 index 00000000000..1d7924a04d7 --- /dev/null +++ b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuel.java @@ -0,0 +1,19 @@ +package forge.quest; + +import forge.deck.DeckProxy; + +/** + * A QuestEventDuel with a CommanderDeckGenerator used exclusively within QuestEventCommanderDuelManager for the + * creation of randomly generated Commander decks in a Commander variant quest. + * Auth. Imakuni & Forge + */ +public class QuestEventCommanderDuel extends QuestEventDuel{ + /** + * The CommanderDeckGenerator for this duel. + */ + private DeckProxy deckProxy; + + public DeckProxy getDeckProxy() {return deckProxy;} + + public void setDeckProxy(DeckProxy dp) {deckProxy = dp;} +} diff --git a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java new file mode 100644 index 00000000000..384d9d11d77 --- /dev/null +++ b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java @@ -0,0 +1,205 @@ +package forge.quest; + +import forge.deck.*; +import forge.item.PaperCard; +import forge.model.FModel; +import forge.quest.data.QuestPreferences; +import forge.util.CollectionSuppliers; +import forge.util.MyRandom; +import forge.util.maps.EnumMapOfLists; +import forge.util.maps.MapOfLists; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Manages the creation of random Commander duels for a Commander variant quest. Random generation is handled via + * the CommanderDeckGenerator class. + * Auth. Forge & Imakuni#8015 + */ +public class QuestEventCommanderDuelManager implements QuestEventDuelManagerInterface { + /** + * The list of all possible Commander variant duels. + */ + private ArrayList commanderDuels = new ArrayList<>(); + + /** + * Contains the expert deck lists for the commanders. + */ + private List expertCommanderDecks; + + /** + * Immediately calls assembleDuels() to setup the commanderDuels variable. + */ + public QuestEventCommanderDuelManager(){ + assembleDuels(); + } + + /** + * Assembles the list of all possible Commander duels via CommanderDeckGenerator. Should be done within constructor. + */ + private void assembleDuels(){ + //isCardGen = true seemed to make slightly more difficult decks based purely on experience with a very small sample size. + //Gotta work on this more, its making pretty average decks after further testing. + expertCommanderDecks = CommanderDeckGenerator.getCommanderDecks(DeckFormat.Commander, true, true); + + List generatedDuels = CommanderDeckGenerator.getCommanderDecks(DeckFormat.Commander, true, false); + + for(DeckProxy dp : generatedDuels){ + QuestEventCommanderDuel duel = new QuestEventCommanderDuel(); + + duel.setDescription("Randomly generated " + dp.getName() + " commander deck."); + duel.setName(dp.getName()); + duel.setTitle(dp.getName()); + duel.setOpponentName(dp.getName()); + duel.setDifficulty(QuestEventDifficulty.EASY); + duel.setDeckProxy(dp); + + //Setting a blank deck avoids a null pointer exception. The deck is generated in generateDuels() to avoid long load times. + duel.setEventDeck(new Deck()); + + commanderDuels.add(duel); + } + } + + /** + * Retrieve list of all possible Commander duels. + * @return ArrayList containing all possible Commander duels. + */ + public Iterable getAllDuels() { + return commanderDuels; + } + + /** + * Retrieve list of all possible Commander duels. + * @param difficulty Currently unused + * @return ArrayList containing all possible Commander duels. + */ + public Iterable getDuels(QuestEventDifficulty difficulty){ + return commanderDuels; + } + + /** + * Composes an ArrayList containing 4 QuestEventDuels composed with Commander variant decks. One duel will have its + * title replaced as Random. + * @return ArrayList of QuestEventDuels containing 4 duels. + */ + public List generateDuels(){ + final List duelOpponents = new ArrayList<>(); + + //While there are less than 4 duels chosen + while(duelOpponents.size() < 4){ + //Get a random duel from the possible duels list + QuestEventCommanderDuel duel = (QuestEventCommanderDuel)commanderDuels.get(((int) (commanderDuels.size() * MyRandom.getRandom().nextDouble()))); + + //If the chosen duels list already contains this duel, get a different duel to prevent duplicate duels + if(duelOpponents.contains(duel)) continue; + + //Add the randomly chosen duel to the duel list + duelOpponents.add(duel); + + //Here the actual deck for this commander is generated by calling .getDeck() on the saved DeckProxy + duel.setEventDeck(duel.getDeckProxy().getDeck()); + + //Modify deck for difficulty + modifyDuelForDifficulty(duel); + + + } + + //Modify the stats of the final duel to hide the opponent, creating a "random" duel. + //We make a copy of the final duel and overwrite it in the duelOpponents to avoid changing the variables in + //the original duel, which gets reused. + QuestEventCommanderDuel duel = (QuestEventCommanderDuel)duelOpponents.get(duelOpponents.size() - 1); + QuestEventCommanderDuel randomDuel = new QuestEventCommanderDuel(); + + randomDuel.setName(duel.getName()); + randomDuel.setOpponentName(duel.getName()); + randomDuel.setDeckProxy(duel.getDeckProxy()); + randomDuel.setTitle("Random Opponent"); + randomDuel.setShowDifficulty(false); + randomDuel.setDescription("Fight a random generated commander opponent."); + randomDuel.setIsRandomMatch(true); + randomDuel.setEventDeck(duel.getEventDeck()); + + //Replace the final duel with this newly modified "random" duel + duelOpponents.set(duelOpponents.size()-1, randomDuel); + + return duelOpponents; + } + + /** + * Retrieves the expert level deck generation of a deck with the same commander as the provided DeckProxy. + * @param dp The easy generation commander deck + * @return The same commander's expert generation DeckProxy + */ + private Deck getExpertGenDeck(DeckProxy dp){ + for(QuestEventDuel qed : commanderDuels){ + QuestEventCommanderDuel cmdQED = (QuestEventCommanderDuel)qed; + if(cmdQED.getDeckProxy().getName().equals(dp.getName())){ + return cmdQED.getDeckProxy().getDeck(); + } + } + return null; + } + + /** + * Modifies a given duel by replacing a percentage of the deck with random cards from the more difficult generated version + * of the same commander's deck. Medium replaces 30%, Hard replaces 60%, Expert replaces 100%. + * @param duel The QuestEventCommanderDuel to modify + */ + private void modifyDuelForDifficulty(QuestEventCommanderDuel duel){ + final QuestPreferences questPreferences = FModel.getQuestPreferences(); + final int index = FModel.getQuest().getAchievements().getDifficulty(); + final int numberOfWins = FModel.getQuest().getAchievements().getWin(); + Deck expertDeck = getExpertGenDeck(duel.getDeckProxy()); + + int difficultyReplacementPercent = 0; + + //Note: The code is ordered to make the least number of comparisons I could think of at the time for speed reasons. + //In reality, it shouldn't really make much difference, but why not? + if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_EXPERTAI, index)) { + //At expert, the deck is replaced with the entire expert deck, and we can return immediately + duel.setEventDeck(expertDeck); + duel.setDifficulty(QuestEventDifficulty.EXPERT); + return; + } + + if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_MEDIUMAI, index)) { + difficultyReplacementPercent += 30; + duel.setDifficulty(QuestEventDifficulty.MEDIUM); + } else return; //return early here since it would be an easy opponent with no changes + + if (numberOfWins >= questPreferences.getPrefInt(QuestPreferences.DifficultyPrefs.WINS_HARDAI, index)) { + difficultyReplacementPercent += 30; + duel.setDifficulty(QuestEventDifficulty.HARD); + } + + CardPool easyMain = duel.getEventDeck().getMain(); + CardPool expertMain = expertDeck.getMain(); + + List easyList = easyMain.toFlatList(); + List expertList = expertMain.toFlatList(); + + //Replace cards in the easy deck with cards from the expert deck up to the difficulty replacement percent + for(int i = 0; i < difficultyReplacementPercent; i++){ + if(!easyMain.contains(expertList.get(i))) { //ensure that the card being copied over isn't already in the deck + easyMain.remove(easyList.get(i)); + easyMain.add(expertList.get(i)); + } + else{ + expertList.remove(expertList.get(i)); + i--; + if(expertList.size() == 0) break; //break if there are no more cards to copy over + } + } + } + + /** + * Randomizes the list of Commander Duels. + */ + public void randomizeOpponents(){ + Collections.shuffle(commanderDuels); + } +} diff --git a/forge-gui/src/main/java/forge/quest/QuestSpellShop.java b/forge-gui/src/main/java/forge/quest/QuestSpellShop.java index e9196e417df..96eae768963 100644 --- a/forge-gui/src/main/java/forge/quest/QuestSpellShop.java +++ b/forge-gui/src/main/java/forge/quest/QuestSpellShop.java @@ -344,11 +344,24 @@ public class QuestSpellShop { List> cardsToRemove = new LinkedList<>(); for (Entry item : inventoryManager.getPool()) { PaperCard card = (PaperCard)item.getKey(); - int numToKeep = card.getRules().getType().isBasic() ? - FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_BASIC_LAND_SIZE) : FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_SIZE); + //Number of a particular card to keep + int numToKeep = 4; + + if(card.getRules().getType().isBasic()){ + numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_BASIC_LAND_SIZE); + } else{ + //Choose card limit restrictions based on deck construction rules, e.g.: Commander allows only singletons + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_SIZE); break; + case Commander: numToKeep = 1; + } + } + + //If this card has an exception to the card limit, e.g.: Relentless Rats, get the quest preference if (DeckFormat.getLimitExceptions().contains(card.getName())) { numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_ANY_NUMBER_SIZE); } + if (numToKeep < item.getValue()) { cardsToRemove.add(Pair.of(item.getKey(), item.getValue() - numToKeep)); } diff --git a/forge-gui/src/main/java/forge/quest/QuestUtil.java b/forge-gui/src/main/java/forge/quest/QuestUtil.java index c2fe796ef7b..7ad6b6cd335 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtil.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtil.java @@ -41,6 +41,7 @@ import forge.properties.ForgePreferences.FPref; import forge.quest.bazaar.IQuestBazaarItem; import forge.quest.bazaar.QuestItemType; import forge.quest.bazaar.QuestPetController; +import forge.quest.data.DeckConstructionRules; import forge.quest.data.QuestAchievements; import forge.quest.data.QuestAssets; import forge.util.gui.SGuiChoose; @@ -51,6 +52,7 @@ import org.apache.commons.lang3.tuple.ImmutablePair; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; +import java.util.TreeSet; /** *

@@ -531,7 +533,17 @@ public class QuestUtil { Integer lifeHuman = null; boolean useBazaar = true; Boolean forceAnte = null; - int lifeAI = 20; + + //Generate a life modifier based on this quest's variant as held in the Quest Controller's DeckConstructionRules + int variantLifeModifier = 0; + + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: variantLifeModifier = 20; break; + } + + int lifeAI = 20 + variantLifeModifier; + if (event instanceof QuestEventChallenge) { final QuestEventChallenge qc = ((QuestEventChallenge) event); lifeAI = qc.getAILife(); @@ -545,8 +557,9 @@ public class QuestUtil { forceAnte = qc.isForceAnte(); } - final RegisteredPlayer humanStart = new RegisteredPlayer(getDeckForNewGame()); - final RegisteredPlayer aiStart = new RegisteredPlayer(event.getEventDeck()); + final RegisteredPlayer humanStart = getRegisteredPlayerByVariant(getDeckForNewGame()); + + final RegisteredPlayer aiStart = getRegisteredPlayerByVariant(event.getEventDeck()); if (lifeHuman != null) { humanStart.setStartingLife(lifeHuman); @@ -581,17 +594,39 @@ public class QuestUtil { rules.setGamesPerMatch(qData.getMatchLength()); rules.setManaBurn(FModel.getPreferences().getPrefBoolean(FPref.UI_MANABURN)); rules.setCanCloneUseTargetsImage(FModel.getPreferences().getPrefBoolean(FPref.UI_CLONE_MODE_SOURCE)); + + TreeSet variant = new TreeSet(); + if(FModel.getQuest().getDeckConstructionRules() == DeckConstructionRules.Commander){ + variant.add(GameType.Commander); + } + final HostedMatch hostedMatch = GuiBase.getInterface().hostMatch(); final IGuiGame gui = GuiBase.getInterface().getNewGuiGame(); gui.setPlayerAvatar(aiPlayer, event); FThreads.invokeInEdtNowOrLater(new Runnable(){ @Override public void run() { - hostedMatch.startMatch(rules, null, starter, ImmutableMap.of(humanStart, gui)); + hostedMatch.startMatch(rules, variant, starter, ImmutableMap.of(humanStart, gui)); } }); } + /** + * Uses the appropriate RegisteredPlayer command for generating a RegisteredPlayer based on this quest's variant as + * held by the QuestController's DeckConstructionRules. + * @param deck The deck to generate the RegisteredPlayer with + * @return A newly made RegisteredPlayer specific to the quest's variant + */ + private static RegisteredPlayer getRegisteredPlayerByVariant(Deck deck){ + switch (FModel.getQuest().getDeckConstructionRules()) { + case Default: + return new RegisteredPlayer(deck); + case Commander: + return RegisteredPlayer.forCommander(deck); + } + return null; + } + private static Deck getDeckForNewGame() { Deck deck = null; if (event instanceof QuestEventChallenge) { @@ -623,7 +658,7 @@ public class QuestUtil { } if (FModel.getPreferences().getPrefBoolean(FPref.ENFORCE_DECK_LEGALITY)) { - final String errorMessage = GameType.Quest.getDeckFormat().getDeckConformanceProblem(deck); + final String errorMessage = getDeckConformanceProblems(deck); if (null != errorMessage) { SOptionPane.showErrorDialog("Your deck " + errorMessage + " Please edit or choose a different deck.", "Invalid Deck"); return false; @@ -633,6 +668,21 @@ public class QuestUtil { return true; } + public static String getDeckConformanceProblems(Deck deck){ + String errorMessage = GameType.Quest.getDeckFormat().getDeckConformanceProblem(deck);; + + if(errorMessage != null) return errorMessage; //return immediately if the deck does not conform to quest requirements + + //Check for all applicable deck construction rules per this quests's saved DeckConstructionRules enum + switch(FModel.getQuest().getDeckConstructionRules()){ + case Commander: + errorMessage = GameType.Commander.getDeckFormat().getDeckConformanceProblem(deck); + break; + } + + return errorMessage; + } + /** Duplicate in DeckEditorQuestMenu and * probably elsewhere...can streamline at some point * (probably shouldn't be here). diff --git a/forge-gui/src/main/java/forge/quest/QuestUtilCards.java b/forge-gui/src/main/java/forge/quest/QuestUtilCards.java index c8d77d863ad..54a4887ba8a 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtilCards.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtilCards.java @@ -308,10 +308,16 @@ public final class QuestUtilCards { * user preferences */ public void setupNewGameCardPool(final GameFormat formatStartingPool, final int idxDifficulty, final StartingPoolPreferences userPrefs) { + //Add additional cards to the starter card pool based on variant if applicable + double variantModifier = 0; + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: variantModifier = 2; break; + } - final int nC = questPreferences.getPrefInt(DifficultyPrefs.STARTING_COMMONS, idxDifficulty); - final int nU = questPreferences.getPrefInt(DifficultyPrefs.STARTING_UNCOMMONS, idxDifficulty); - final int nR = questPreferences.getPrefInt(DifficultyPrefs.STARTING_RARES, idxDifficulty); + final int nC = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_COMMONS, idxDifficulty) * variantModifier); + final int nU = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_UNCOMMONS, idxDifficulty) * variantModifier); + final int nR = (int)(questPreferences.getPrefInt(DifficultyPrefs.STARTING_RARES, idxDifficulty) * variantModifier); addAllCards(BoosterUtils.getQuestStarterDeck(formatStartingPool, nC, nU, nR, userPrefs)); diff --git a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java index 2e93e7d4fec..265ea61bb58 100644 --- a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java +++ b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java @@ -226,6 +226,11 @@ public class QuestWinLoseController { sb.append(StringUtils.capitalize(qEvent.getDifficulty().getTitle())); sb.append(" opponent: ").append(credBase).append(" credits.\n"); + if(qEvent.getIsRandomMatch()){ + sb.append("Random Opponent Bonus: " + credBase + " credit" + (credBase > 1 ? "s." : ".") + "\n"); + credBase += credBase; + } + final int winMultiplier = Math.min(qData.getAchievements().getWin(), FModel.getQuestPreferences().getPrefInt(QPref.REWARDS_WINS_MULTIPLIER_MAX)); final int creditsForPreviousWins = (int) ((Double.parseDouble(FModel.getQuestPreferences() .getPref(QPref.REWARDS_WINS_MULTIPLIER)) * winMultiplier)); diff --git a/forge-gui/src/main/java/forge/quest/QuestWorld.java b/forge-gui/src/main/java/forge/quest/QuestWorld.java index e20dcf98ce8..4c77b0ec515 100644 --- a/forge-gui/src/main/java/forge/quest/QuestWorld.java +++ b/forge-gui/src/main/java/forge/quest/QuestWorld.java @@ -40,6 +40,7 @@ public class QuestWorld implements Comparable{ private final String dir; private final GameFormatQuest format; public static final String STANDARDWORLDNAME = "Random Standard"; + public static final String RANDOMCOMMANDERWORLDNAME = "Random Commander"; private boolean isCustom; @@ -129,7 +130,6 @@ public class QuestWorld implements Comparable{ /** * TODO: Write javadoc for Constructor. * @param file0 - * @param keySelector0 */ public Reader(String file0) { super(file0, QuestWorld.FN_GET_NAME); @@ -194,6 +194,12 @@ public class QuestWorld implements Comparable{ FModel.getFormats().getStandard().getBannedCardNames(),false); } + if (useName.equalsIgnoreCase(QuestWorld.RANDOMCOMMANDERWORLDNAME)){ + useFormat = new GameFormatQuest(QuestWorld.RANDOMCOMMANDERWORLDNAME, + FModel.getFormats().getFormat("Commander").getAllowedSetCodes(), + FModel.getFormats().getFormat("Commander").getBannedCardNames(),false); + } + // System.out.println("Creating quest world " + useName + " (index " + useIdx + ", dir: " + useDir); // if (useFormat != null) { System.out.println("SETS: " + sets + "\nBANNED: " + bannedCards); } diff --git a/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java b/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java new file mode 100644 index 00000000000..3744beea09d --- /dev/null +++ b/forge-gui/src/main/java/forge/quest/data/DeckConstructionRules.java @@ -0,0 +1,17 @@ +package forge.quest.data; + +/** + * Used to clarify which subformat a quest is using e.g. Commander. + * Auth. Imakuni + */ +public enum DeckConstructionRules { + /** + * Typically has no effect on Quest gameplay. + */ + Default, + + /** + * Commander ruleset. 99 card deck, no copies other than basic lands, commander(s) in Command zone + */ + Commander +} 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 616c49d937b..8f7b644641b 100644 --- a/forge-gui/src/main/java/forge/quest/data/QuestAssets.java +++ b/forge-gui/src/main/java/forge/quest/data/QuestAssets.java @@ -200,7 +200,14 @@ public class QuestAssets { * @return the life */ public int getLife(final QuestMode mode) { - final int base = mode.equals(QuestMode.Fantasy) ? 15 : 20; + int base = mode.equals(QuestMode.Fantasy) ? 15 : 20; + + //Modify life for the quest's sub-format, e.g.: Commander adds 20 + switch(FModel.getQuest().getDeckConstructionRules()){ + case Default: break; + case Commander: base += 20; + } + return (base + this.getItemLevel(QuestItemType.ELIXIR_OF_LIFE)) - this.getItemLevel(QuestItemType.POUND_FLESH); } diff --git a/forge-gui/src/main/java/forge/quest/data/QuestData.java b/forge-gui/src/main/java/forge/quest/data/QuestData.java index e6a75adef7d..41574634113 100644 --- a/forge-gui/src/main/java/forge/quest/data/QuestData.java +++ b/forge-gui/src/main/java/forge/quest/data/QuestData.java @@ -42,7 +42,7 @@ import java.util.Map; */ public final class QuestData { /** Holds the latest version of the Quest Data. */ - public static final int CURRENT_VERSION_NUMBER = 12; + public static final int CURRENT_VERSION_NUMBER = 13; // This field places the version number into QD instance, // but only when the object is created through the constructor @@ -70,6 +70,11 @@ public final class QuestData { public String currentDeck = "DEFAULT"; + /** + * Holds the subformat for this quest. Defaults to DeckConstructionRules.Default. + */ + public DeckConstructionRules deckConstructionRules = DeckConstructionRules.Default; + public QuestData() { //needed for XML serialization } @@ -87,9 +92,11 @@ public final class QuestData { * allow set unlocking during quest * @param startingWorld * starting world + * @param dcr + * deck construction rules e.g. Commander */ public QuestData(String name0, int diff, QuestMode mode0, GameFormat userFormat, - boolean allowSetUnlocks, final String startingWorld) { + boolean allowSetUnlocks, final String startingWorld, DeckConstructionRules dcr) { this.name = name0; if (userFormat != null) { @@ -99,6 +106,7 @@ public final class QuestData { this.achievements = new QuestAchievements(diff); this.assets = new QuestAssets(format); this.worldId = startingWorld; + this.deckConstructionRules = dcr; } /** diff --git a/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java b/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java index de680502e37..cd232367df9 100644 --- a/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java +++ b/forge-gui/src/main/java/forge/quest/io/QuestDataIO.java @@ -223,10 +223,16 @@ public class QuestDataIO { // Current Deck moved from preferences to quest data - it should not be global for all quests!!! QuestDataIO.setFinalField(QuestData.class, "currentDeck", newData, FModel.getQuestPreferences().getPref(QPref.CURRENT_DECK)); } - if (saveVersion < 13) { + if(saveVersion < 13){ + //Update for quest DeckConstructionRules + //Add a DeckConstructionRules set to Default. + QuestDataIO.setFinalField(QuestData.class, "deckConstructionRules", newData, DeckConstructionRules.Default); + } + if (saveVersion < 14) { // Migrate DraftTournaments to use new Tournament class } + final QuestAssets qS = newData.getAssets(); final QuestAchievements qA = newData.getAchievements(); From c8c431398e64950dfc1f3d78c1ce5b1196393eef Mon Sep 17 00:00:00 2001 From: Jeremy Pelkala Date: Thu, 8 Nov 2018 11:51:21 -0500 Subject: [PATCH 129/901] Commander Quest checkstyle and bugfixes -QuestEventCommanderDuelManager Removed unused imports -CEditorQuest Fixed colorless cards getting filtered out of deck creation. --- .../screens/deckeditor/controllers/CEditorQuest.java | 9 +++++++-- .../java/forge/quest/QuestEventCommanderDuelManager.java | 3 --- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java index b7842272e42..c09e0a18d48 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java @@ -322,7 +322,7 @@ public final class CEditorQuest extends CDeckEditor { public boolean apply(PaperCard subject) { CardRules cr = subject.getRules(); ManaCost mc = cr.getManaCost(); - return !mc.isPureGeneric() && allowedColor.containsAllColorsFrom(cr.getColorIdentity().getColor()); + return allowedColor.containsAllColorsFrom(cr.getColorIdentity().getColor()); } } @@ -336,7 +336,10 @@ public final class CEditorQuest extends CDeckEditor { List colors = new ArrayList<>(); //Return early if there are no current commanders - if(commanders.size() == 0) return ColorSet.fromNames(colors); + if(commanders.size() == 0){ + colors.add("c"); + return ColorSet.fromNames(colors); + } //For each commander,add each color of its color identity if not already added for(PaperCard pc : commanders){ @@ -347,6 +350,8 @@ public final class CEditorQuest extends CDeckEditor { if(!colors.contains("g") && pc.getRules().getColorIdentity().hasGreen()) colors.add("g"); } + colors.add("c"); + return ColorSet.fromNames(colors); } diff --git a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java index 384d9d11d77..c9fbaa3457c 100644 --- a/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java +++ b/forge-gui/src/main/java/forge/quest/QuestEventCommanderDuelManager.java @@ -4,10 +4,7 @@ import forge.deck.*; import forge.item.PaperCard; import forge.model.FModel; import forge.quest.data.QuestPreferences; -import forge.util.CollectionSuppliers; import forge.util.MyRandom; -import forge.util.maps.EnumMapOfLists; -import forge.util.maps.MapOfLists; import java.util.ArrayList; import java.util.Collections; From 7b6634544a79496daaf09740a59060db19b9aee2 Mon Sep 17 00:00:00 2001 From: Jeremy Pelkala Date: Thu, 8 Nov 2018 12:42:15 -0500 Subject: [PATCH 130/901] Removed unused imports from CEditorQuest --- .../forge/screens/deckeditor/controllers/CEditorQuest.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java index c09e0a18d48..84d8477f088 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java @@ -21,8 +21,6 @@ import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.base.Supplier; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; import forge.UiCommand; import forge.card.CardRules; import forge.card.CardRulesPredicates; @@ -31,7 +29,6 @@ import forge.card.mana.ManaCost; import forge.deck.CardPool; import forge.deck.Deck; import forge.deck.DeckSection; -import forge.deck.generation.DeckGeneratorBase; import forge.gui.GuiUtils; import forge.gui.framework.DragCell; import forge.gui.framework.FScreen; @@ -58,7 +55,6 @@ import forge.util.ItemPool; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.awt.print.Paper; import java.util.ArrayList; import java.util.HashMap; import java.util.List; From c8f54a686d675de9a85c5ff046e25041a9682b37 Mon Sep 17 00:00:00 2001 From: Jeremy Pelkala Date: Thu, 8 Nov 2018 13:05:52 -0500 Subject: [PATCH 131/901] Fixed mobile compilation error -NewQuestScreen Updated to include DeckConstructionRules set to Default --- .../src/forge/screens/quest/NewQuestScreen.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/forge-gui-mobile/src/forge/screens/quest/NewQuestScreen.java b/forge-gui-mobile/src/forge/screens/quest/NewQuestScreen.java index 856a6a11508..fc8594e652c 100644 --- a/forge-gui-mobile/src/forge/screens/quest/NewQuestScreen.java +++ b/forge-gui-mobile/src/forge/screens/quest/NewQuestScreen.java @@ -20,6 +20,7 @@ import forge.model.FModel; import forge.properties.ForgeConstants; import forge.quest.*; import forge.quest.StartingPoolPreferences.PoolType; +import forge.quest.data.DeckConstructionRules; import forge.quest.data.GameFormatQuest; import forge.quest.data.QuestPreferences.QPref; import forge.screens.FScreen; @@ -632,7 +633,11 @@ public class NewQuestScreen extends FScreen { final StartingPoolPreferences userPrefs = new StartingPoolPreferences(getPoolType(), getPreferredColors(), cbIncludeArtifacts.isSelected(), startWithCompleteSet(), allowDuplicateCards(), numberOfBoostersField.getValue()); QuestController qc = FModel.getQuest(); - qc.newGame(questName, getSelectedDifficulty(), mode, fmtPrizes, isUnlockSetsAllowed(), dckStartPool, fmtStartPool, getStartingWorldName(), userPrefs); + + //DeckConstructionRules are only used for the desktop's commander quest mode + DeckConstructionRules dcr = DeckConstructionRules.Default; + + qc.newGame(questName, getSelectedDifficulty(), mode, fmtPrizes, isUnlockSetsAllowed(), dckStartPool, fmtStartPool, getStartingWorldName(), userPrefs, dcr); qc.save(); // Save in preferences. From 49f8c6a067f0609249e1f2c17faad7a35850f026 Mon Sep 17 00:00:00 2001 From: Sol Date: Fri, 9 Nov 2018 02:00:48 +0000 Subject: [PATCH 132/901] Update hornswoggle.txt --- forge-gui/res/cardsfolder/h/hornswoggle.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/h/hornswoggle.txt b/forge-gui/res/cardsfolder/h/hornswoggle.txt index f35492ffead..58a12b86d73 100644 --- a/forge-gui/res/cardsfolder/h/hornswoggle.txt +++ b/forge-gui/res/cardsfolder/h/hornswoggle.txt @@ -1,7 +1,7 @@ Name:Hornswoggle ManaCost:2 U Types:Instant -A:SP$ Counter | Cost$ 2 U | TargetType$ Spell | TgtPrompt$ Select target Creature spell | ValidTgts$ Creature | SubAbility$ DBTreasure | SpellDescription$ Counter target creature spell. +A:SP$ Counter | Cost$ 2 U | TargetType$ Spell | TgtPrompt$ Select target Creature spell | ValidTgts$ Creature | SubAbility$ DBTreasure | SpellDescription$ Counter target creature spell. You create a colorless Treasure artifact token with "{T}, Sacrifice this artifact: Add one mana of any color." SVar:DBTreasure:DB$ Token | TokenAmount$ 1 | TokenName$ Treasure | TokenTypes$ Artifact,Treasure | TokenOwner$ You | TokenColors$ Colorless | TokenImage$ c treasure | TokenAbilities$ ABTreasureMana | TokenAltImages$ c_treasure2,c_treasure3,c_treasure4 SVar:ABTreasureMana:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ Any | Amount$ 1 | SpellDescription$ Add one mana of any color. SVar:Picture:http://www.wizards.com/global/images/magic/general/hornswoggle.jpg From 218d0f30eca32c50f3b6cd88623e0b063383d958 Mon Sep 17 00:00:00 2001 From: swordshine Date: Fri, 9 Nov 2018 17:00:16 +0800 Subject: [PATCH 133/901] - Fix Chance for Glory --- forge-gui/res/cardsfolder/c/chance_for_glory.txt | 2 +- forge-gui/res/cardsfolder/c/conclaves_blessing.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/c/chance_for_glory.txt b/forge-gui/res/cardsfolder/c/chance_for_glory.txt index 3ffb055f2f4..f0000340948 100644 --- a/forge-gui/res/cardsfolder/c/chance_for_glory.txt +++ b/forge-gui/res/cardsfolder/c/chance_for_glory.txt @@ -1,7 +1,7 @@ Name:Chance for Glory ManaCost:1 R W Types:Instant -A:SP$ PumpAll | Cost$ 1 R W | ValidCards$ Creature.YouCtrl | KW$ Indestructible | SubAbility$ DBAddTurn | SpellDescription$ Creatures you control gain indestructible. Take an extra turn after this one. At the beginning of that turn's end step, you lose the game. +A:SP$ PumpAll | Cost$ 1 R W | ValidCards$ Creature.YouCtrl | KW$ Indestructible | Permanent$ True | SubAbility$ DBAddTurn | SpellDescription$ Creatures you control gain indestructible. Take an extra turn after this one. At the beginning of that turn's end step, you lose the game. SVar:DBAddTurn:DB$ AddTurn | NumTurns$ 1 | ExtraTurnDelayedTrigger$ DBDelTrig | ExtraTurnDelayedTriggerExcute$ TrigLose | References$ DBDelTrig,TrigLose | SpellDescription$ Take an extra turn after this one. At the beginning of that turn's end step, you lose the game. SVar:DBDelTrig:ThisTurn$ True | Mode$ Phase | Phase$ End of Turn | TriggerDescription$ At the beginning of that turn's end step, you lose the game. SVar:TrigLose:DB$ LosesGame | Defined$ You diff --git a/forge-gui/res/cardsfolder/c/conclaves_blessing.txt b/forge-gui/res/cardsfolder/c/conclaves_blessing.txt index 133eb4e383a..932d423a404 100644 --- a/forge-gui/res/cardsfolder/c/conclaves_blessing.txt +++ b/forge-gui/res/cardsfolder/c/conclaves_blessing.txt @@ -3,7 +3,7 @@ ManaCost:3 W Types:Enchantment Aura K:Convoke A:SP$Attach | Cost$ 3 W | ValidTgts$ Creature | AILogic$ Pump -S:Mode$ Continuous | Affected$ Card.AttachedBy | AddToughness$ X | Description$ Enchanted creature gets +0/+2 for each other creature you control. +S:Mode$ Continuous | Affected$ Card.AttachedBy | AddToughness$ X | References$ X | Description$ Enchanted creature gets +0/+2 for each other creature you control. SVar:X:Count$Valid Creature.NotEnchantedBy+YouCtrl/Twice SVar:Picture:http://www.wizards.com/global/images/magic/general/conclaves_blessing.jpg Oracle:Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nEnchant creature\nEnchanted creature gets +0/+2 for each other creature you control. From c1260dd4e1aab249bba118cb20c471dec8d920e6 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 9 Nov 2018 15:42:40 +0300 Subject: [PATCH 134/901] - Some improvements to Momir/MoJhoSto basic land strategy. --- .../src/main/java/forge/ai/AiController.java | 28 +++++++++++++++++++ forge-ai/src/main/java/forge/ai/AiProps.java | 7 +++-- forge-gui/res/ai/Cautious.ai | 9 +++++- forge-gui/res/ai/Default.ai | 9 +++++- forge-gui/res/ai/Experimental.ai | 9 +++++- forge-gui/res/ai/Reckless.ai | 9 +++++- 6 files changed, 64 insertions(+), 7 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 9714c8fe38a..6b00f8122c3 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -436,6 +436,34 @@ public class AiController { if (landList.isEmpty()) { return null; } + + // Some considerations for Momir/MoJhoSto + boolean hasMomir = !CardLists.filter(player.getCardsIn(ZoneType.Command), + CardPredicates.nameEquals("Momir Vig, Simic Visionary Avatar")).isEmpty(); + if (hasMomir) { + String landStrategy = getProperty(AiProps.MOMIR_BASIC_LAND_STRATEGY); + if (landStrategy.equalsIgnoreCase("random")) { + // Pick a completely random basic land + return Aggregates.random(landList); + } else if (landStrategy.toLowerCase().startsWith("preforder:")) { + // Pick a basic land in order of preference, or play a random one if nothing is preferred + String order = landStrategy.substring(10); + for (char c : order.toCharArray()) { + byte color = MagicColor.fromName(c); + for (Card land : landList) { + for (final SpellAbility m : ComputerUtilMana.getAIPlayableMana(land)) { + AbilityManaPart mp = m.getManaPart(); + if (mp.canProduce(MagicColor.toShortString(color), m)) { + return land; + } + } + } + return Aggregates.random(landList); + } + } + // If nothing is done here, proceeds to the default land picking strategy + } + //Skip reflected lands. CardCollection unreflectedLands = new CardCollection(landList); for (Card l : landList) { diff --git a/forge-ai/src/main/java/forge/ai/AiProps.java b/forge-ai/src/main/java/forge/ai/AiProps.java index b9ee8d741e7..aefc58df58e 100644 --- a/forge-ai/src/main/java/forge/ai/AiProps.java +++ b/forge-ai/src/main/java/forge/ai/AiProps.java @@ -108,13 +108,14 @@ public enum AiProps { /** */ INTUITION_ALTERNATIVE_LOGIC ("false"), /** */ EXPLORE_MAX_CMC_DIFF_TO_PUT_IN_GRAVEYARD ("2"), EXPLORE_NUM_LANDS_TO_STILL_NEED_MORE("2"), /** */ + MOMIR_BASIC_LAND_STRATEGY("default"), /** */ MOJHOSTO_NUM_LANDS_TO_ACTIVATE_JHOIRA("5"), /** */ MOJHOSTO_CHANCE_TO_PREFER_JHOIRA_OVER_MOMIR ("50"), /** */ MOJHOSTO_CHANCE_TO_USE_JHOIRA_COPY_INSTANT ("20"), /** */ - // Experimental features, must be removed after extensive testing and, ideally, defaulting + AI_IN_DANGER_THRESHOLD("4"), /** */ + AI_IN_DANGER_MAX_THRESHOLD("4"); /** */ + // Experimental features, must be promoted or removed after extensive testing and, ideally, defaulting // <-- There are no experimental options here --> - AI_IN_DANGER_THRESHOLD("4"), - AI_IN_DANGER_MAX_THRESHOLD("4"); private final String strDefaultVal; diff --git a/forge-gui/res/ai/Cautious.ai b/forge-gui/res/ai/Cautious.ai index 60888c980ef..968fbbe85e0 100644 --- a/forge-gui/res/ai/Cautious.ai +++ b/forge-gui/res/ai/Cautious.ai @@ -211,7 +211,14 @@ EXPLORE_MAX_CMC_DIFF_TO_PUT_IN_GRAVEYARD=2 # doesn't have a land in hand EXPLORE_NUM_LANDS_TO_STILL_NEED_MORE=2 -# MoJhoSto casual variant properties +# Momir/MoJhoSto casual variant properties +# Which lands the AI would prefer to play in Momir Basic and MoJhoSto modes. When set to "default", generally plays +# lands in WUBRG order. When set to "random", will play a completely random basic land from hand. When set to +# "preforder:XXX", where "XXX" is a list of color specifications, will play basic lands in this preferred order, +# and if no preferred land can be found, will play a random one (e.g. "preforder:RB" plays Mountains first, Swamps +# second, and then everything else randomly if no Mountains or Swamps are present). +MOMIR_BASIC_LAND_STRATEGY=preforder:RB +# MoJhoSto only casual variant properties # How many lands the AI needs to have on the battlefield to begin considering activating Jhoira in MoJhoSto MOJHOSTO_NUM_LANDS_TO_ACTIVATE_JHOIRA=5 # The chance that the AI will activate Jhoira instead of activating Momir diff --git a/forge-gui/res/ai/Default.ai b/forge-gui/res/ai/Default.ai index ba41dc8e5c8..d5d4fba548c 100644 --- a/forge-gui/res/ai/Default.ai +++ b/forge-gui/res/ai/Default.ai @@ -211,7 +211,14 @@ EXPLORE_MAX_CMC_DIFF_TO_PUT_IN_GRAVEYARD=2 # doesn't have a land in hand EXPLORE_NUM_LANDS_TO_STILL_NEED_MORE=2 -# MoJhoSto casual variant properties +# Momir/MoJhoSto casual variant properties +# Which lands the AI would prefer to play in Momir Basic and MoJhoSto modes. When set to "default", generally plays +# lands in WUBRG order. When set to "random", will play a completely random basic land from hand. When set to +# "preforder:XXX", where "XXX" is a list of color specifications, will play basic lands in this preferred order, +# and if no preferred land can be found, will play a random one (e.g. "preforder:RB" plays Mountains first, Swamps +# second, and then everything else randomly if no Mountains or Swamps are present). +MOMIR_BASIC_LAND_STRATEGY=default +# MoJhoSto only casual variant properties # How many lands the AI needs to have on the battlefield to begin considering activating Jhoira in MoJhoSto MOJHOSTO_NUM_LANDS_TO_ACTIVATE_JHOIRA=4 # The chance that the AI will activate Jhoira instead of activating Momir diff --git a/forge-gui/res/ai/Experimental.ai b/forge-gui/res/ai/Experimental.ai index c48eedbe7c9..d4d178d700b 100644 --- a/forge-gui/res/ai/Experimental.ai +++ b/forge-gui/res/ai/Experimental.ai @@ -211,7 +211,14 @@ EXPLORE_MAX_CMC_DIFF_TO_PUT_IN_GRAVEYARD=2 # doesn't have a land in hand EXPLORE_NUM_LANDS_TO_STILL_NEED_MORE=3 -# MoJhoSto casual variant properties +# Momir/MoJhoSto casual variant properties +# Which lands the AI would prefer to play in Momir Basic and MoJhoSto modes. When set to "default", generally plays +# lands in WUBRG order. When set to "random", will play a completely random basic land from hand. When set to +# "preforder:XXX", where "XXX" is a list of color specifications, will play basic lands in this preferred order, +# and if no preferred land can be found, will play a random one (e.g. "preforder:RB" plays Mountains first, Swamps +# second, and then everything else randomly if no Mountains or Swamps are present). +MOMIR_BASIC_LAND_STRATEGY=preforder:RB +# MoJhoSto only casual variant properties # How many lands the AI needs to have on the battlefield to begin considering activating Jhoira in MoJhoSto MOJHOSTO_NUM_LANDS_TO_ACTIVATE_JHOIRA=4 # The chance that the AI will activate Jhoira instead of activating Momir diff --git a/forge-gui/res/ai/Reckless.ai b/forge-gui/res/ai/Reckless.ai index 57f13150d73..ae421d52e7a 100644 --- a/forge-gui/res/ai/Reckless.ai +++ b/forge-gui/res/ai/Reckless.ai @@ -211,7 +211,14 @@ EXPLORE_MAX_CMC_DIFF_TO_PUT_IN_GRAVEYARD=1 # doesn't have a land in hand EXPLORE_NUM_LANDS_TO_STILL_NEED_MORE=2 -# MoJhoSto casual variant properties +# Momir/MoJhoSto casual variant properties +# Which lands the AI would prefer to play in Momir Basic and MoJhoSto modes. When set to "default", generally plays +# lands in WUBRG order. When set to "random", will play a completely random basic land from hand. When set to +# "preforder:XXX", where "XXX" is a list of color specifications, will play basic lands in this preferred order, +# and if no preferred land can be found, will play a random one (e.g. "preforder:RB" plays Mountains first, Swamps +# second, and then everything else randomly if no Mountains or Swamps are present). +MOMIR_BASIC_LAND_STRATEGY=random +# MoJhoSto only casual variant properties # How many lands the AI needs to have on the battlefield to begin considering activating Jhoira in MoJhoSto MOJHOSTO_NUM_LANDS_TO_ACTIVATE_JHOIRA=3 # The chance that the AI will activate Jhoira instead of activating Momir From 8ae5a4613a6d0c4ea852f3ece72822fbe3b466f8 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 9 Nov 2018 15:52:31 +0300 Subject: [PATCH 135/901] - Fixed Vivien's Invocation AI. --- forge-gui/res/cardsfolder/v/viviens_invocation.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/v/viviens_invocation.txt b/forge-gui/res/cardsfolder/v/viviens_invocation.txt index f9ce13877ce..5a23885dd5b 100644 --- a/forge-gui/res/cardsfolder/v/viviens_invocation.txt +++ b/forge-gui/res/cardsfolder/v/viviens_invocation.txt @@ -3,6 +3,6 @@ ManaCost:5 G G Types:Sorcery A:SP$ Dig | Cost$ 5 G G | DigNum$ 7 | ChangeNum$ 1 | ChangeValid$ Creature | Optional$ True | RestRandomOrder$ True | DestinationZone$ Battlefield | ForceRevealToController$ True | SpellDescription$ Look at the top seven cards of your library. You may put a creature card from among them onto the battlefield. Put the rest on the bottom of your library in a random order. When a creature is put onto the battlefield this way, it deals damage equals to its power to target creature an opponent controls. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature | ValidCause$ Card.Self | Execute$ DBDealDamage | Secondary$ True | TriggerDescription$ When a creature is put onto the battlefield this way, it deals damage equals to its power to target creature an opponent controls. -SVar:DBDealDamage:DB$ DealDamage | ValidTgts$ Creature.OppCtrl | AILogic$ PowerDmg | TgtPrompt$ Select target creature an opponent controls | NumDmg$ X | References$ X | DamageSource$ TriggeredCard +SVar:DBDealDamage:DB$ DealDamage | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | NumDmg$ X | References$ X | DamageSource$ TriggeredCard SVar:X:TriggeredCard$CardPower Oracle:Look at the top seven cards of your library. You may put a creature card from among them onto the battlefield. Put the rest on the bottom of your library in a random order. When a creature is put onto the battlefield this way, it deals damage equals to its power to target creature an opponent controls. \ No newline at end of file From 1c39671c278e15f51cb3cd0b1c1dc25ba3a6df3f Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Fri, 9 Nov 2018 13:40:01 +0000 Subject: [PATCH 136/901] CardFactoryUtil: update the Nexus of Fate RE --- .../main/java/forge/game/card/CardFactoryUtil.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 74c724ccca6..06365c21ea4 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -3567,7 +3567,15 @@ public class CardFactoryUtil { else if (keyword.startsWith("If CARDNAME would be put into a graveyard " + "from anywhere, reveal CARDNAME and shuffle it into its owner's library instead.")) { - String repeffstr = "Event$ Moved | Destination$ Graveyard | ValidCard$ Card.Self "; + + StringBuilder sb = new StringBuilder("Event$ Moved | Destination$ Graveyard | ValidCard$ Card.Self "); + + // to show it on Nexus + if (!card.isPermanent()) { + sb.append("| Secondary$ True"); + } + sb.append("| Description$ ").append(keyword); + String ab = "DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Library | Defined$ ReplacedCard | Reveal$ True | Shuffle$ True"; SpellAbility sa = AbilityFactory.getAbility(ab, card); @@ -3576,7 +3584,7 @@ public class CardFactoryUtil { sa.setIntrinsic(false); } - ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, card, intrinsic); + ReplacementEffect re = ReplacementHandler.parseReplacement(sb.toString(), card, intrinsic); re.setLayer(ReplacementLayer.Other); re.setOverridingAbility(sa); From 36d6465e49044a8473c53795b22e7e7c0aaa3859 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Fri, 9 Nov 2018 14:05:33 +0000 Subject: [PATCH 137/901] CardFactoryUtil: fixed Nexus --- forge-game/src/main/java/forge/game/card/CardFactoryUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 06365c21ea4..34166adc7c3 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -3571,7 +3571,7 @@ public class CardFactoryUtil { StringBuilder sb = new StringBuilder("Event$ Moved | Destination$ Graveyard | ValidCard$ Card.Self "); // to show it on Nexus - if (!card.isPermanent()) { + if (card.isPermanent()) { sb.append("| Secondary$ True"); } sb.append("| Description$ ").append(keyword); From 530f5c2e35009a580d6929481658781e24993df0 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 9 Nov 2018 22:19:02 +0300 Subject: [PATCH 138/901] - Fixed a logic error in the recent Momir strategy commit. --- forge-ai/src/main/java/forge/ai/AiController.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 6b00f8122c3..0da3b6d1a80 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -437,10 +437,14 @@ public class AiController { return null; } + CardCollection nonLandsInHand = CardLists.filter(player.getCardsIn(ZoneType.Hand), Predicates.not(CardPredicates.Presets.LANDS)); + // Some considerations for Momir/MoJhoSto boolean hasMomir = !CardLists.filter(player.getCardsIn(ZoneType.Command), CardPredicates.nameEquals("Momir Vig, Simic Visionary Avatar")).isEmpty(); - if (hasMomir) { + if (hasMomir && nonLandsInHand.isEmpty()) { + // Only do this if we have an all-basic land hand, which covers both stock Momir and MoJhoSto modes + // and also a custom Vanguard setup with a customized basic land deck and Momir as the avatar. String landStrategy = getProperty(AiProps.MOMIR_BASIC_LAND_STRATEGY); if (landStrategy.equalsIgnoreCase("random")) { // Pick a completely random basic land @@ -458,8 +462,8 @@ public class AiController { } } } - return Aggregates.random(landList); } + return Aggregates.random(landList); } // If nothing is done here, proceeds to the default land picking strategy } @@ -475,7 +479,6 @@ public class AiController { landList = unreflectedLands; } - CardCollection nonLandsInHand = CardLists.filter(player.getCardsIn(ZoneType.Hand), Predicates.not(CardPredicates.Presets.LANDS)); //try to skip lands that enter the battlefield tapped if (!nonLandsInHand.isEmpty()) { From ee0e2d19414eff6c444cc25739ba4309f93e1aa5 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 9 Nov 2018 22:24:43 +0300 Subject: [PATCH 139/901] - Updating CHANGES.txt. --- forge-gui/release-files/CHANGES.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/forge-gui/release-files/CHANGES.txt b/forge-gui/release-files/CHANGES.txt index 05f0bf1829e..69bdb968f47 100644 --- a/forge-gui/release-files/CHANGES.txt +++ b/forge-gui/release-files/CHANGES.txt @@ -1,2 +1,11 @@ +- New Puzzles - +Several new Possibility Storm puzzles have been added, including the latest puzzles from the Guilds of Ravnica season. + +- New Quest Opponents - +Several new quest opponents were added in this release, themed around some of the recent cards from Guilds of Ravnica and Magic Core Set 2019. + +- AI improvements - +There have been some AI fixes and tweaks here and there to improve the quality of AI play. While not major or groundbreaking, hopefully these tweaks will make the current Standard more fun to play against the AI. + - 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 396bb2c5b43a7a3c955ec9d75c44d1baf2b79494 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Fri, 9 Nov 2018 23:25:52 +0100 Subject: [PATCH 140/901] CopyPermanent: the final card need to have the State updated --- .../java/forge/game/ability/effects/CopyPermanentEffect.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java index cde82b37f68..5298ed95005 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java @@ -257,6 +257,8 @@ public class CopyPermanentEffect extends SpellAbilityEffect { continue; } } + // need to be done otherwise the token has no State in Details + copyInPlay.updateStateForView(); } if (sa.hasParam("AtEOT")) { From 72e010ef66e05d734b39b0d4dafdf415136589bf Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 10 Nov 2018 07:23:21 +0300 Subject: [PATCH 141/901] - Updating CHANGES.txt. --- forge-gui/release-files/CHANGES.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/forge-gui/release-files/CHANGES.txt b/forge-gui/release-files/CHANGES.txt index 69bdb968f47..049c450bc74 100644 --- a/forge-gui/release-files/CHANGES.txt +++ b/forge-gui/release-files/CHANGES.txt @@ -7,5 +7,14 @@ Several new quest opponents were added in this release, themed around some of th - AI improvements - There have been some AI fixes and tweaks here and there to improve the quality of AI play. While not major or groundbreaking, hopefully these tweaks will make the current Standard more fun to play against the AI. +- Deck Editor Item Groupings - +A new item grouping was added to the image view in the deck editor, called Planeswalker Deck Sort, which sorts Planeswalkers, then Rares, then Creatures, Lands, and Other Spells. Also, the type-based grouping was updated to show Planeswalkers and Tribal Instants separately. + +- Customizable Decks Folder - +A configuration option was added to Forge profile properties file to set a custom folder for storing decks, separate from other data cache options. An option to set the deck folder was added to mobile Forge interface. + +- Auto-Download Missing Card Art (Mobile) - +An option to automatically download missing card art was added to the mobile Forge interface. It is available under "Graphic Options" in Settings. + - 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 02cca3b8c87570d45aab6bb6500c3b2af0ce3ef3 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 10 Nov 2018 07:30:30 +0300 Subject: [PATCH 142/901] - Finish promoting the life in danger AI profile options from experimental to general use. --- forge-gui/res/ai/Cautious.ai | 6 ++++++ forge-gui/res/ai/Default.ai | 6 ++++++ forge-gui/res/ai/Experimental.ai | 14 +++++++------- forge-gui/res/ai/Reckless.ai | 6 ++++++ 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/forge-gui/res/ai/Cautious.ai b/forge-gui/res/ai/Cautious.ai index 968fbbe85e0..c21c6088247 100644 --- a/forge-gui/res/ai/Cautious.ai +++ b/forge-gui/res/ai/Cautious.ai @@ -74,6 +74,12 @@ AVOID_TARGETING_CREATS_THAT_WILL_DIE=true # since the current AI is not smart enough to predict whether a kill spell on stack is countered or not. DONT_EVAL_KILLSPELLS_ON_STACK_WITH_PERMISSION=true +# If AI would drop to this amount of life in combat, it'll try to defend itself more actively +AI_IN_DANGER_THRESHOLD=4 +# If set to the same value, AI will be predictable. If set to higher, AI will randomly pick a value between the two +# for each evaluation, introducing some unpredictability. +AI_IN_DANGER_MAX_THRESHOLD=6 + # Only works when AI cheating is enabled in preferences, otherwise does nothing CHEAT_WITH_MANA_ON_SHUFFLE=true diff --git a/forge-gui/res/ai/Default.ai b/forge-gui/res/ai/Default.ai index d5d4fba548c..1283e70167e 100644 --- a/forge-gui/res/ai/Default.ai +++ b/forge-gui/res/ai/Default.ai @@ -74,6 +74,12 @@ AVOID_TARGETING_CREATS_THAT_WILL_DIE=true # since the current AI is not smart enough to predict whether a kill spell on stack is countered or not. DONT_EVAL_KILLSPELLS_ON_STACK_WITH_PERMISSION=true +# If AI would drop to this amount of life in combat, it'll try to defend itself more actively +AI_IN_DANGER_THRESHOLD=4 +# If set to the same value, AI will be predictable. If set to higher, AI will randomly pick a value between the two +# for each evaluation, introducing some unpredictability. +AI_IN_DANGER_MAX_THRESHOLD=4 + # Only works when AI cheating is enabled in preferences, otherwise does nothing CHEAT_WITH_MANA_ON_SHUFFLE=true diff --git a/forge-gui/res/ai/Experimental.ai b/forge-gui/res/ai/Experimental.ai index d4d178d700b..8ed24df8f88 100644 --- a/forge-gui/res/ai/Experimental.ai +++ b/forge-gui/res/ai/Experimental.ai @@ -74,6 +74,12 @@ AVOID_TARGETING_CREATS_THAT_WILL_DIE=true # since the current AI is not smart enough to predict whether a kill spell on stack is countered or not. DONT_EVAL_KILLSPELLS_ON_STACK_WITH_PERMISSION=false +# If AI would drop to this amount of life in combat, it'll try to defend itself more actively +AI_IN_DANGER_THRESHOLD=3 +# If set to the same value, AI will be predictable. If set to higher, AI will randomly pick a value between the two +# for each evaluation, introducing some unpredictability. +AI_IN_DANGER_MAX_THRESHOLD=12 + # Only works when AI cheating is enabled in preferences, otherwise does nothing CHEAT_WITH_MANA_ON_SHUFFLE=true @@ -231,10 +237,4 @@ MOJHOSTO_CHANCE_TO_USE_JHOIRA_COPY_INSTANT=20 # -- features is over. These toggles will be removed later, or may be reintroduced under a -- # -- different name if necessary -- -# If AI would drop to this amount of life in combat, it'll try to defend itself more actively -AI_IN_DANGER_THRESHOLD=3 -# If set to the same value, AI will be predictable. If set to higher, AI will randomly pick a value between the two -# for each evaluation, introducing some unpredictability. -AI_IN_DANGER_MAX_THRESHOLD=12 - -# <-- there are no other experimental options here at the moment --> +# <-- there are no experimental options here at the moment --> diff --git a/forge-gui/res/ai/Reckless.ai b/forge-gui/res/ai/Reckless.ai index ae421d52e7a..8c021295bd7 100644 --- a/forge-gui/res/ai/Reckless.ai +++ b/forge-gui/res/ai/Reckless.ai @@ -74,6 +74,12 @@ AVOID_TARGETING_CREATS_THAT_WILL_DIE=true # since the current AI is not smart enough to predict whether a kill spell on stack is countered or not. DONT_EVAL_KILLSPELLS_ON_STACK_WITH_PERMISSION=true +# If AI would drop to this amount of life in combat, it'll try to defend itself more actively +AI_IN_DANGER_THRESHOLD=4 +# If set to the same value, AI will be predictable. If set to higher, AI will randomly pick a value between the two +# for each evaluation, introducing some unpredictability. +AI_IN_DANGER_MAX_THRESHOLD=4 + # Only works when AI cheating is enabled in preferences, otherwise does nothing CHEAT_WITH_MANA_ON_SHUFFLE=true From 4bb6ffec50f9b5ee962ac59661016bffc7b80898 Mon Sep 17 00:00:00 2001 From: Blacksmith Date: Sat, 10 Nov 2018 06:03:58 +0000 Subject: [PATCH 143/901] Update README.txt for release --- forge-gui/README.txt | 95 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 94 insertions(+), 1 deletion(-) diff --git a/forge-gui/README.txt b/forge-gui/README.txt index 11b369846f2..202c93eb092 100644 --- a/forge-gui/README.txt +++ b/forge-gui/README.txt @@ -1 +1,94 @@ -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: 11/10/2018 ver 1.6.18 + +18204 cards in total. + + +-------------- +Release Notes: +-------------- + +- New Puzzles - +Several new Possibility Storm puzzles have been added, including the latest puzzles from the Guilds of Ravnica season. + +- New Quest Opponents - +Several new quest opponents were added in this release, themed around some of the recent cards from Guilds of Ravnica and Magic Core Set 2019. + +- AI improvements - +There have been some AI fixes and tweaks here and there to improve the quality of AI play. While not major or groundbreaking, hopefully these tweaks will make the current Standard more fun to play against the AI. + +- Deck Editor Item Groupings - +A new item grouping was added to the image view in the deck editor, called Planeswalker Deck Sort, which sorts Planeswalkers, then Rares, then Creatures, Lands, and Other Spells. Also, the type-based grouping was updated to show Planeswalkers and Tribal Instants separately. + +- Customizable Decks Folder - +A configuration option was added to Forge profile properties file to set a custom folder for storing decks, separate from other data cache options. An option to set the deck folder was added to mobile Forge interface. + +- Auto-Download Missing Card Art (Mobile) - +An option to automatically download missing card art was added to the mobile Forge interface. It is available under "Graphic Options" in Settings. + +- 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 haven't been able to distribute the OS X Application version of Forge in sometime. We've recently automated our release tools, and will continue to look in the viability of creating this file now that things are autoamted. + + +- 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 +Austinio7116 +Churrufli +DrDev +excessum +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 + +(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 ed1febafe63e225995853cda81a2e37c007355f5 Mon Sep 17 00:00:00 2001 From: Blacksmith Date: Sat, 10 Nov 2018 06:06:11 +0000 Subject: [PATCH 144/901] [maven-release-plugin] prepare release forge-1.6.18 --- 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 b3b53fc120f..c677ed636d7 100644 --- a/forge-ai/pom.xml +++ b/forge-ai/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.18-SNAPSHOT + 1.6.18 forge-ai diff --git a/forge-core/pom.xml b/forge-core/pom.xml index 33171490943..36ddc92302b 100644 --- a/forge-core/pom.xml +++ b/forge-core/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.18-SNAPSHOT + 1.6.18 forge-core diff --git a/forge-game/pom.xml b/forge-game/pom.xml index c9659499c2d..50b5789f404 100644 --- a/forge-game/pom.xml +++ b/forge-game/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.18-SNAPSHOT + 1.6.18 forge-game diff --git a/forge-gui-android/pom.xml b/forge-gui-android/pom.xml index 6e925598a72..9c3b2ba61cb 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -19,7 +19,7 @@ forge forge - 1.6.18-SNAPSHOT + 1.6.18 forge-gui-android diff --git a/forge-gui-desktop/pom.xml b/forge-gui-desktop/pom.xml index 6b78bad350c..a297b104d32 100644 --- a/forge-gui-desktop/pom.xml +++ b/forge-gui-desktop/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.18-SNAPSHOT + 1.6.18 forge-gui-desktop diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index 3a5a9720a78..6d3210994d1 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -12,7 +12,7 @@ forge forge - 1.6.18-SNAPSHOT + 1.6.18 forge-gui-ios diff --git a/forge-gui-mobile-dev/pom.xml b/forge-gui-mobile-dev/pom.xml index 86c59d8ffe0..303a7041e57 100644 --- a/forge-gui-mobile-dev/pom.xml +++ b/forge-gui-mobile-dev/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.18-SNAPSHOT + 1.6.18 forge-gui-mobile-dev diff --git a/forge-gui-mobile/pom.xml b/forge-gui-mobile/pom.xml index cfaebbc7f52..5902873cb63 100644 --- a/forge-gui-mobile/pom.xml +++ b/forge-gui-mobile/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.18-SNAPSHOT + 1.6.18 forge-gui-mobile diff --git a/forge-gui/pom.xml b/forge-gui/pom.xml index 1af393d28a6..64c02eaa275 100644 --- a/forge-gui/pom.xml +++ b/forge-gui/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.18-SNAPSHOT + 1.6.18 forge-gui diff --git a/pom.xml b/pom.xml index f5046bc50ec..2819c27de41 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ forge pom Forge Parent - 1.6.18-SNAPSHOT + 1.6.18 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.18 From 66c7f0745d7e5935476b1a704814c2229fedf3f6 Mon Sep 17 00:00:00 2001 From: Blacksmith Date: Sat, 10 Nov 2018 06:06:16 +0000 Subject: [PATCH 145/901] [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 c677ed636d7..7c67017dfd7 100644 --- a/forge-ai/pom.xml +++ b/forge-ai/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.18 + 1.6.19-SNAPSHOT forge-ai diff --git a/forge-core/pom.xml b/forge-core/pom.xml index 36ddc92302b..74b53c8753a 100644 --- a/forge-core/pom.xml +++ b/forge-core/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.18 + 1.6.19-SNAPSHOT forge-core diff --git a/forge-game/pom.xml b/forge-game/pom.xml index 50b5789f404..9444f1fafd7 100644 --- a/forge-game/pom.xml +++ b/forge-game/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.18 + 1.6.19-SNAPSHOT forge-game diff --git a/forge-gui-android/pom.xml b/forge-gui-android/pom.xml index 9c3b2ba61cb..6b74fecd720 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -19,7 +19,7 @@ forge forge - 1.6.18 + 1.6.19-SNAPSHOT forge-gui-android diff --git a/forge-gui-desktop/pom.xml b/forge-gui-desktop/pom.xml index a297b104d32..513db2c33b9 100644 --- a/forge-gui-desktop/pom.xml +++ b/forge-gui-desktop/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.18 + 1.6.19-SNAPSHOT forge-gui-desktop diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index 6d3210994d1..68e69c8b1fc 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -12,7 +12,7 @@ forge forge - 1.6.18 + 1.6.19-SNAPSHOT forge-gui-ios diff --git a/forge-gui-mobile-dev/pom.xml b/forge-gui-mobile-dev/pom.xml index 303a7041e57..1c5e9e9aa39 100644 --- a/forge-gui-mobile-dev/pom.xml +++ b/forge-gui-mobile-dev/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.18 + 1.6.19-SNAPSHOT forge-gui-mobile-dev diff --git a/forge-gui-mobile/pom.xml b/forge-gui-mobile/pom.xml index 5902873cb63..5ce2359d01b 100644 --- a/forge-gui-mobile/pom.xml +++ b/forge-gui-mobile/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.18 + 1.6.19-SNAPSHOT forge-gui-mobile diff --git a/forge-gui/pom.xml b/forge-gui/pom.xml index 64c02eaa275..4d65a817ed3 100644 --- a/forge-gui/pom.xml +++ b/forge-gui/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.18 + 1.6.19-SNAPSHOT forge-gui diff --git a/pom.xml b/pom.xml index 2819c27de41..245cead9e75 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ forge pom Forge Parent - 1.6.18 + 1.6.19-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.18 + HEAD From 3d706d83d584d370fbaa5d2001157686b0081c8c Mon Sep 17 00:00:00 2001 From: Blacksmith Date: Sat, 10 Nov 2018 06:11:02 +0000 Subject: [PATCH 146/901] Clear out release files in preparation for next release --- forge-gui/README.txt | 95 +---------------------------- forge-gui/release-files/CHANGES.txt | 18 ------ 2 files changed, 1 insertion(+), 112 deletions(-) diff --git a/forge-gui/README.txt b/forge-gui/README.txt index 202c93eb092..11b369846f2 100644 --- a/forge-gui/README.txt +++ b/forge-gui/README.txt @@ -1,94 +1 @@ -Forge: 11/10/2018 ver 1.6.18 - -18204 cards in total. - - --------------- -Release Notes: --------------- - -- New Puzzles - -Several new Possibility Storm puzzles have been added, including the latest puzzles from the Guilds of Ravnica season. - -- New Quest Opponents - -Several new quest opponents were added in this release, themed around some of the recent cards from Guilds of Ravnica and Magic Core Set 2019. - -- AI improvements - -There have been some AI fixes and tweaks here and there to improve the quality of AI play. While not major or groundbreaking, hopefully these tweaks will make the current Standard more fun to play against the AI. - -- Deck Editor Item Groupings - -A new item grouping was added to the image view in the deck editor, called Planeswalker Deck Sort, which sorts Planeswalkers, then Rares, then Creatures, Lands, and Other Spells. Also, the type-based grouping was updated to show Planeswalkers and Tribal Instants separately. - -- Customizable Decks Folder - -A configuration option was added to Forge profile properties file to set a custom folder for storing decks, separate from other data cache options. An option to set the deck folder was added to mobile Forge interface. - -- Auto-Download Missing Card Art (Mobile) - -An option to automatically download missing card art was added to the mobile Forge interface. It is available under "Graphic Options" in Settings. - -- 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 haven't been able to distribute the OS X Application version of Forge in sometime. We've recently automated our release tools, and will continue to look in the viability of creating this file now that things are autoamted. - - -- 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 -Austinio7116 -Churrufli -DrDev -excessum -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 - -(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 049c450bc74..05f0bf1829e 100644 --- a/forge-gui/release-files/CHANGES.txt +++ b/forge-gui/release-files/CHANGES.txt @@ -1,20 +1,2 @@ -- New Puzzles - -Several new Possibility Storm puzzles have been added, including the latest puzzles from the Guilds of Ravnica season. - -- New Quest Opponents - -Several new quest opponents were added in this release, themed around some of the recent cards from Guilds of Ravnica and Magic Core Set 2019. - -- AI improvements - -There have been some AI fixes and tweaks here and there to improve the quality of AI play. While not major or groundbreaking, hopefully these tweaks will make the current Standard more fun to play against the AI. - -- Deck Editor Item Groupings - -A new item grouping was added to the image view in the deck editor, called Planeswalker Deck Sort, which sorts Planeswalkers, then Rares, then Creatures, Lands, and Other Spells. Also, the type-based grouping was updated to show Planeswalkers and Tribal Instants separately. - -- Customizable Decks Folder - -A configuration option was added to Forge profile properties file to set a custom folder for storing decks, separate from other data cache options. An option to set the deck folder was added to mobile Forge interface. - -- Auto-Download Missing Card Art (Mobile) - -An option to automatically download missing card art was added to the mobile Forge interface. It is available under "Graphic Options" in Settings. - - 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 3f31bc9df07539ec307cc1b3f96567c43734f303 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 10 Nov 2018 09:16:03 +0300 Subject: [PATCH 147/901] - Preparing Forge for Android publish 1.6.18.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 6b74fecd720..59af086adca 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -6,7 +6,7 @@ jar -Xms1024m -Xmx1536m - 1.6.17.001 + 1.6.18.001 keystore alias storepass diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index 68e69c8b1fc..99bcee63d28 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -6,7 +6,7 @@ jar -Xms128m -Xmx2048m - 1.6.17.001 + 1.6.18.001 diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index ad9e7363cd6..8594c5a919a 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.17.001"; + public static final String CURRENT_VERSION = "1.6.18.001"; private static final ApplicationListener app = new Forge(); private static Clipboard clipboard; From 0389f8bcb584feafc1926c6fa04a0ffc46835169 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 10 Nov 2018 18:29:46 +0300 Subject: [PATCH 148/901] - Added 5 quest precon decks submitted by nayozzz. --- .../res/quest/precons/Aurochs Stampede.dck | 37 ++++++++++++++++ .../res/quest/precons/Beyond the Grave.dck | 44 +++++++++++++++++++ .../res/quest/precons/Charge of the Boros.dck | 38 ++++++++++++++++ .../res/quest/precons/Dimir Intrigues.dck | 37 ++++++++++++++++ .../res/quest/precons/Kjeldoran Cunning.dck | 41 +++++++++++++++++ 5 files changed, 197 insertions(+) create mode 100644 forge-gui/res/quest/precons/Aurochs Stampede.dck create mode 100644 forge-gui/res/quest/precons/Beyond the Grave.dck create mode 100644 forge-gui/res/quest/precons/Charge of the Boros.dck create mode 100644 forge-gui/res/quest/precons/Dimir Intrigues.dck create mode 100644 forge-gui/res/quest/precons/Kjeldoran Cunning.dck diff --git a/forge-gui/res/quest/precons/Aurochs Stampede.dck b/forge-gui/res/quest/precons/Aurochs Stampede.dck new file mode 100644 index 00000000000..15be51741a6 --- /dev/null +++ b/forge-gui/res/quest/precons/Aurochs Stampede.dck @@ -0,0 +1,37 @@ +[shop] +WinsToUnlock=0 +Credits=1200 +MinDifficulty=0 +MaxDifficulty=5 +[metadata] +Name=Aurochs Stampede +Description=Aurochs Stampede is an aggro red/green theme deck with an Aurochs tribal theme. The Ice Age card Aurochs is a creature with trample that, when it attacks, gets a bonus for each other attacking Aurochs. +Deck Type=constructed +Set=CSP +Image=aurochs_stampede.jpg +[main] +3 Aurochs|ICE +3 Aurochs Herd|CSP +2 Balduvian Rage|CSP +2 Boreal Druid|CSP +1 Bounty of the Hunt|ALL +4 Bull Aurochs|CSP +1 Deadly Insect|ALL|2 +2 Earthen Goo|CSP +2 Frostweb Spider|CSP +1 Giant Trap Door Spider|ICE +1 Gorilla Shaman|ALL|2 +1 Hibernation's End|CSP +2 Highland Weald|CSP +2 Incinerate|ICE +1 Orcish Lumberjack|ICE +1 Resize|CSP +2 Rimehorn Aurochs|CSP +1 Shape of the Wiitigo|CSP +14 Snow-Covered Forest|CSP +8 Snow-Covered Mountain|CSP +1 Stalking Yeti|CSP +2 Tinder Wall|ICE +1 Whalebone Glider|ICE +2 Woolly Mammoths|ICE +[sideboard] diff --git a/forge-gui/res/quest/precons/Beyond the Grave.dck b/forge-gui/res/quest/precons/Beyond the Grave.dck new file mode 100644 index 00000000000..daca85efe24 --- /dev/null +++ b/forge-gui/res/quest/precons/Beyond the Grave.dck @@ -0,0 +1,44 @@ +[shop] +WinsToUnlock=0 +Credits=1200 +MinDifficulty=0 +MaxDifficulty=5 +[metadata] +Name=Beyond the Grave +Description=Beyond the Grave is a black/red/green theme deck with a graveyard theme. To a necromancer, death is the most delicious part of life and when playing the Beyond the Grave deck, you're the necromancer. Don't hesitate to send your minions to their doom, because each death increases your dark powers. The more corpses you produce, the more zombie fodder you'll have, and the more spells you'll return from your graveyard to your hand. +Deck Type=constructed +Set=CSP +Image=beyond_the_grave.jpg +[main] +1 Ashen Ghoul|ICE +2 Balduvian Dead|ALL +2 Barbed Sextant|ICE +2 Casting of Bones|ALL|2 +1 Coldsteel Heart|CSP +2 Dark Banishing|ICE +1 Dark Ritual|ICE +2 Death Spark|ALL +1 Deepfire Elemental|CSP +2 Disciple of Tevesh Szat|CSP +1 Forest|ICE|1 +1 Forest|ICE|2 +1 Forest|ICE|3 +3 Grim Harvest|CSP +2 Gristle Grinner|CSP +3 Gutless Ghoul|CSP +2 Insidious Bookworms|ALL|2 +1 Kjeldoran Dead|ICE +2 Krovikan Rot|CSP +3 Mountain|ICE|1 +3 Mountain|ICE|2 +3 Mountain|ICE|3 +2 Orcish Bloodpainter|CSP +1 Orcish Healer|ICE +1 Sek'Kuar, Deathkeeper|CSP +1 Skull Catapult|ICE +1 Soul Burn|ICE +4 Swamp|ICE|1 +4 Swamp|ICE|2 +4 Swamp|ICE|3 +1 Void Maw|CSP +[sideboard] diff --git a/forge-gui/res/quest/precons/Charge of the Boros.dck b/forge-gui/res/quest/precons/Charge of the Boros.dck new file mode 100644 index 00000000000..e75b24121fa --- /dev/null +++ b/forge-gui/res/quest/precons/Charge of the Boros.dck @@ -0,0 +1,38 @@ +[shop] +WinsToUnlock=0 +Credits=1200 +MinDifficulty=0 +MaxDifficulty=5 +[metadata] +Name=Charge of the Boros +Description=The Charge of the Boros deck shows off what the Boros Legion does well: fight. This fanatical guild merges red's passion and fury with white's battlefield precision to make a sleek fighting force that steamrolls its opposition. +Deck Type=constructed +Set=RAV +Image=charge_of_the_boros.jpg +[main] +1 Agrus Kos, Wojek Veteran|RAV +1 Bathe in Light|RAV +2 Boros Garrison|IMA +1 Boros Guildmage|RAV +3 Boros Recruit|RAV +2 Boros Swiftblade|RAV +2 Cleansing Beam|RAV +1 Cyclopean Snare|RAV +2 Dogpile|RAV +2 Flame-Kin Zealot|RAV +1 Greater Forgeling|RAV +2 Lightning Helix|RAV +10 Mountain|RAV +2 Nightguard Patrol|RAV +2 Ordruun Commando|RAV +10 Plains|RAV +2 Rally the Righteous|RAV +1 Screeching Griffin|RAV +3 Skyknight Legionnaire|RAV +1 Sunforger|RAV +1 Sunhome, Fortress of the Legion|HOP +1 Terrarion|RAV +3 Thundersong Trumpeter|RAV +2 Viashino Slasher|RAV +2 War-Torch Goblin|RAV +[sideboard] diff --git a/forge-gui/res/quest/precons/Dimir Intrigues.dck b/forge-gui/res/quest/precons/Dimir Intrigues.dck new file mode 100644 index 00000000000..e056dde9c5a --- /dev/null +++ b/forge-gui/res/quest/precons/Dimir Intrigues.dck @@ -0,0 +1,37 @@ +[shop] +WinsToUnlock=0 +Credits=1200 +MinDifficulty=0 +MaxDifficulty=5 +[metadata] +Name=Dimir Intrigues +Description=The Dimir Intrigues deck will twist your opponent's head around and around... and maybe even off! Your opponent starts the game with 60 cards and 20 life. By the time the game ends, one of those two totals will be down to zero - and you don't care which one it is. +Deck Type=constructed +Set=GTC +Image=dimir_intrigues.jpg +[main] +2 Belltower Sphinx|RAV +1 Clutch of the Undercity|RAV +3 Consult the Necrosages|RAV +2 Dimir Aqueduct|RAV +1 Dimir Guildmage|RAV +2 Dimir House Guard|RAV +2 Dimir Infiltrator|RAV +1 Dimir Signet|RAV +2 Disembowel|RAV +1 Dream Leash|RAV +1 Duskmantle, House of Shadow|RAV +2 Induce Paranoia|RAV +11 Island|RAV +2 Last Gasp|RAV +2 Lore Broker|RAV +3 Lurking Informant|RAV +1 Mausoleum Turnkey|RAV +2 Psychic Drain|RAV +1 Ribbons of Night|RAV +2 Sewerdreg|RAV +10 Swamp|RAV +1 Szadek, Lord of Secrets|RAV +3 Vedalken Entrancer|RAV +2 Wizened Snitches|RAV +[sideboard] diff --git a/forge-gui/res/quest/precons/Kjeldoran Cunning.dck b/forge-gui/res/quest/precons/Kjeldoran Cunning.dck new file mode 100644 index 00000000000..7f1696d8706 --- /dev/null +++ b/forge-gui/res/quest/precons/Kjeldoran Cunning.dck @@ -0,0 +1,41 @@ +[shop] +WinsToUnlock=0 +Credits=1200 +MinDifficulty=0 +MaxDifficulty=5 +[metadata] +Name=Kjeldoran Cunning +Description=Kjeldoran Cunning is a white/blue theme deck with a Soldier tribal theme. The noble Kjeldoran Soldiers have teamed up with the crafty Zuran Wizards to build an army that can outfight and outthink any foes. With the Kjeldoran Cunning deck, you're the general of that army. You'll need all your wits about you to win the fight. +Deck Type=constructed +Set=CSP +Image=kjeldoran_cunning.jpg +[main] +1 Binding Grasp|ICE +2 Boreal Shelf|CSP +3 Brainstorm|ICE +1 Darien, King of Kjeldor|CSP +1 Disenchant|ICE +1 Field Marshal|CSP +4 Island|ICE|1 +4 Island|ICE|2 +3 Island|ICE|3 +1 Jotun Grunt|CSP +1 Jotun Owl Keeper|CSP +2 Kjeldoran Elite Guard|ICE +1 Kjeldoran Gargoyle|CSP +1 Kjeldoran Home Guard|ALL +3 Kjeldoran Outrider|CSP +1 Kjeldoran Pride|ALL|2 +2 Lat-Nam's Legacy|ALL|2 +4 Plains|ICE|1 +4 Plains|ICE|2 +3 Plains|ICE|3 +2 Portent|ICE +1 Reinforcements|ALL|1 +1 Scars of the Veteran|ALL +4 Surging Aether|CSP +4 Surging Sentinels|CSP +1 Swords to Plowshares|ICE +2 Wings of Aesthir|ICE +2 Zuran Spellcaster|ICE +[sideboard] From 9835e4c277bd2df3c9c638a37063775af7e7a504 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 10 Nov 2018 18:30:47 +0300 Subject: [PATCH 149/901] - Fixed set ID in Dimir Intrigues. --- forge-gui/res/quest/precons/Dimir Intrigues.dck | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/quest/precons/Dimir Intrigues.dck b/forge-gui/res/quest/precons/Dimir Intrigues.dck index e056dde9c5a..b50966b4490 100644 --- a/forge-gui/res/quest/precons/Dimir Intrigues.dck +++ b/forge-gui/res/quest/precons/Dimir Intrigues.dck @@ -7,7 +7,7 @@ MaxDifficulty=5 Name=Dimir Intrigues Description=The Dimir Intrigues deck will twist your opponent's head around and around... and maybe even off! Your opponent starts the game with 60 cards and 20 life. By the time the game ends, one of those two totals will be down to zero - and you don't care which one it is. Deck Type=constructed -Set=GTC +Set=RAV Image=dimir_intrigues.jpg [main] 2 Belltower Sphinx|RAV From 858ade9341f377965351a377a49e03c4f59f8edb Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 10 Nov 2018 19:28:02 +0300 Subject: [PATCH 150/901] - Updating CHANGES.txt. --- forge-gui/release-files/CHANGES.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/forge-gui/release-files/CHANGES.txt b/forge-gui/release-files/CHANGES.txt index 05f0bf1829e..5e2ebfad0a6 100644 --- a/forge-gui/release-files/CHANGES.txt +++ b/forge-gui/release-files/CHANGES.txt @@ -1,2 +1,5 @@ +- Random Commander Quest - +It is now possible to start a quest with Commander rules and randomly generated quest opponents playing Commander decks. This feature is currently exclusive to desktop Forge. + - 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 1a73c6bea52ba6b5b838e1f5621f5c950e9d745f Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 10 Nov 2018 20:41:52 +0300 Subject: [PATCH 151/901] - Attempt to fix the AI transforming Azcanta if a copy of the transformed legendary land already exists on the battlefield. --- .../java/forge/ai/ability/SetStateAi.java | 63 +++++++++++-------- 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java b/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java index 2a2a5d7493e..dc5c4f5e635 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java @@ -29,31 +29,8 @@ public class SetStateAi extends SpellAbilityAi { } // Prevent transform into legendary creature if copy already exists - // Check first if Legend Rule does still apply - if (!aiPlayer.getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noLegendRule)) { - if (!source.hasAlternateState()) { - System.err.println("Warning: SetState without ALTERNATE on " + source.getName() + "."); - return false; - } - - // check if the other side is legendary and if such Card already is in Play - final CardState other = source.getAlternateState(); - - if (other != null && other.getType().isLegendary() && aiPlayer.isCardInPlay(other.getName())) { - if (!other.getType().isCreature()) { - return false; - } - - final Card othercard = aiPlayer.getCardsIn(ZoneType.Battlefield, other.getName()).getFirst(); - - // for legendary KI counter creatures - if (othercard.getCounters(CounterType.KI) >= source.getCounters(CounterType.KI)) { - // if the other legendary is useless try to replace it - if (!ComputerUtilCard.isUselessCreature(aiPlayer, othercard)) { - return false; - } - } - } + if (!isSafeToTransformIntoLegendary(aiPlayer, source)) { + return false; } if("Transform".equals(mode) || "Flip".equals(mode)) { @@ -255,8 +232,44 @@ public class SetStateAi extends SpellAbilityAi { return valueCard <= valueTransformed; } + private boolean isSafeToTransformIntoLegendary(Player aiPlayer, Card source) { + // Prevent transform into legendary creature if copy already exists + // Check first if Legend Rule does still apply + if (!aiPlayer.getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noLegendRule)) { + if (!source.hasAlternateState()) { + System.err.println("Warning: SetState without ALTERNATE on " + source.getName() + "."); + return false; + } + + // check if the other side is legendary and if such Card already is in Play + final CardState other = source.getAlternateState(); + + if (other != null && other.getType().isLegendary() && aiPlayer.isCardInPlay(other.getName())) { + if (!other.getType().isCreature()) { + return false; + } + + final Card othercard = aiPlayer.getCardsIn(ZoneType.Battlefield, other.getName()).getFirst(); + + // for legendary KI counter creatures + if (othercard.getCounters(CounterType.KI) >= source.getCounters(CounterType.KI)) { + // if the other legendary is useless try to replace it + if (!ComputerUtilCard.isUselessCreature(aiPlayer, othercard)) { + return false; + } + } + } + } + + return true; + } + public boolean confirmAction(Player player, SpellAbility sa, PlayerActionConfirmMode mode, String message) { // TODO: improve the AI for when it may want to transform something that's optional to transform + if (!isSafeToTransformIntoLegendary(player, sa.getHostCard())) { + return false; + } + return true; } } From a2dd5c71806ea37ef583806a210c26786838cc16 Mon Sep 17 00:00:00 2001 From: Sol Date: Sun, 11 Nov 2018 01:29:31 +0000 Subject: [PATCH 152/901] Update godsend.txt from Eehoe --- forge-gui/res/cardsfolder/g/godsend.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/g/godsend.txt b/forge-gui/res/cardsfolder/g/godsend.txt index 245fa473617..1477dc83832 100644 --- a/forge-gui/res/cardsfolder/g/godsend.txt +++ b/forge-gui/res/cardsfolder/g/godsend.txt @@ -7,7 +7,7 @@ T:Mode$ AttackerBlocked | ValidCard$ Card.EquippedBy | ValidBlocker$ Creature | SVar:TrigChooseAttackers:DB$ ChooseCard | DefinedCards$ TriggeredAttackers | SubAbility$ DBExile SVar:TrigChooseBlockers:DB$ ChooseCard | DefinedCards$ TriggeredBlockers | SubAbility$ DBExile SVar:DBExile:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True -S:Mode$ CantBeCast | ValidCard$ Card.sharesNameWith Remembered+ExiledWithSource | Caster$ Opponent | Description$ Your opponents can't cast spells with the same name as a card exiled with CARDNAME. +S:Mode$ CantBeCast | ValidCard$ Card.nonLand+sharesNameWith Remembered.ExiledWithSource | Caster$ Opponent | Description$ Your opponents can't cast spells with the same name as a card exiled with CARDNAME. T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered+ExiledWithSource | Execute$ DBForget SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Any | Execute$ DBCleanup | Static$ True | Secondary$ True | TriggerDescription$ Forget all remembered cards. From c7ad075bb30fa1a91a53472a2ce5109005ac172d Mon Sep 17 00:00:00 2001 From: Sol Date: Sun, 11 Nov 2018 01:31:59 +0000 Subject: [PATCH 153/901] Removed counter restriction for generous_patron.txt --- forge-gui/res/cardsfolder/g/generous_patron.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/g/generous_patron.txt b/forge-gui/res/cardsfolder/g/generous_patron.txt index 521fbf9e2c3..350de88434d 100644 --- a/forge-gui/res/cardsfolder/g/generous_patron.txt +++ b/forge-gui/res/cardsfolder/g/generous_patron.txt @@ -4,7 +4,7 @@ Types:Creature Elf Advisor PT:1/4 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPut | TriggerDescription$ When CARDNAME enters the battlefield, support 2. (Put a +1/+1 counter on each of up to two other target creatures.) SVar:TrigPut:DB$PutCounter | ValidTgts$ Creature.Other | TgtPrompt$ Select target creature other than CARDNAME | TargetMin$ 0 | TargetMax$ 2 | CounterType$ P1P1 | CounterNum$ 1 -T:Mode$ CounterAddedOnce | ValidCard$ Creature.YouDontCtrl | ValidSource$ You | TriggerZones$ Battlefield | CounterType$ P1P1 | Execute$ DBDraw | TriggerDescription$ Whenever you put one or more counters on a creature you don't control, draw a card. +T:Mode$ CounterAddedOnce | ValidCard$ Creature.YouDontCtrl | ValidSource$ You | TriggerZones$ Battlefield | Execute$ DBDraw | TriggerDescription$ Whenever you put one or more counters on a creature you don't control, draw a card. SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 DeckHas:Ability$Counters DeckHints:Ability$Counters From 829a82b98f907a64e9fa37d038b1770c450c047c Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 11 Nov 2018 14:18:34 +0300 Subject: [PATCH 154/901] - Fixed a logic error in Surveil AI. - Added a couple card hints. --- forge-ai/src/main/java/forge/ai/PlayerControllerAi.java | 2 +- forge-gui/res/cardsfolder/c/camaraderie.txt | 1 + forge-gui/res/cardsfolder/m/moodmark_painter.txt | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 9edb07ce59c..39bc6ade625 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -303,7 +303,7 @@ public class PlayerControllerAi extends PlayerController { // TODO: Currently this logic uses the same routine as Scry. Possibly differentiate this and implement // a specific logic for Surveil (e.g. maybe to interact better with Reanimator strategies etc.). - if (getPlayer().getCardsIn(ZoneType.Hand).size() <= getAi().getIntProperty(AiProps.SURVEIL_NUM_CARDS_IN_LIBRARY_TO_BAIL)) { + if (getPlayer().getCardsIn(ZoneType.Library).size() <= getAi().getIntProperty(AiProps.SURVEIL_NUM_CARDS_IN_LIBRARY_TO_BAIL)) { toTop.addAll(topN); } else { for (Card c : topN) { diff --git a/forge-gui/res/cardsfolder/c/camaraderie.txt b/forge-gui/res/cardsfolder/c/camaraderie.txt index 84b6367e858..8f35b8b0670 100644 --- a/forge-gui/res/cardsfolder/c/camaraderie.txt +++ b/forge-gui/res/cardsfolder/c/camaraderie.txt @@ -5,4 +5,5 @@ A:SP$ GainLife | Cost$ 4 G W | Defined$ You | LifeAmount$ X | References$ X | Su SVar:DBDraw:DB$ Draw | NumCards$ X | References$ X | SubAbility$ DBPumpAll SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Creatures you control get +1/+1 until end of turn. SVar:X:Count$TypeYouCtrl.Creature +SVar:PlayMain1:TRUE Oracle:You gain X life and draw X cards, where X is the number of creatures you control. Creatures you control get +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/m/moodmark_painter.txt b/forge-gui/res/cardsfolder/m/moodmark_painter.txt index 11dd131d1b5..4b81f4f065f 100644 --- a/forge-gui/res/cardsfolder/m/moodmark_painter.txt +++ b/forge-gui/res/cardsfolder/m/moodmark_painter.txt @@ -5,4 +5,5 @@ PT:2/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature gains menace and gets +X/+0 until end of turn, where X is the number of creature cards in your graveyard. (It can't blocked except by two or more creatures.) SVar:TrigPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ X | NumDef$ 0 | KW$ Menace | References$ X SVar:X:Count$TypeInYourYard.Creature +SVar:PlayMain1:TRUE Oracle:Undergrowth — When Moodmark Painter enters the battlefield, target creature gains menace and gets +X/+0 until end of turn, where X is the number of creature cards in your graveyard. (It can't blocked except by two or more creatures.) From fcc3a28b8637fb2458512e69b203e15de35dc635 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 11 Nov 2018 17:38:32 +0300 Subject: [PATCH 155/901] - Fixed logic in reserving mana for combat tricks. --- forge-ai/src/main/java/forge/ai/AiController.java | 15 +++++++++++---- .../src/main/java/forge/ai/ComputerUtilCard.java | 12 ++++++++---- .../src/main/java/forge/ai/ability/FogAi.java | 6 ++++-- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 0da3b6d1a80..bf52438f8cc 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -628,16 +628,19 @@ public class AiController { return null; } - public void reserveManaSources(SpellAbility sa) { - reserveManaSources(sa, PhaseType.MAIN2, false); + public boolean reserveManaSources(SpellAbility sa) { + return reserveManaSources(sa, PhaseType.MAIN2, false); } - public void reserveManaSources(SpellAbility sa, PhaseType phaseType, boolean enemy) { + public boolean reserveManaSources(SpellAbility sa, PhaseType phaseType, boolean enemy) { ManaCostBeingPaid cost = ComputerUtilMana.calculateManaCost(sa, true, 0); CardCollection manaSources = ComputerUtilMana.getManaSourcesToPayCost(cost, sa, player); - AiCardMemory.MemorySet memSet; + if (manaSources.isEmpty()) { + return false; + } + AiCardMemory.MemorySet memSet; switch (phaseType) { case MAIN2: memSet = AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_MAIN2; @@ -656,6 +659,10 @@ public class AiController { for (Card c : manaSources) { AiCardMemory.rememberCard(player, c, memSet); } + + // This is a simplification, since one mana source can produce more than one mana, + // but should work in most circumstances to ensure safety in whatever the AI is using this for. + return manaSources.size() >= cost.getConvertedManaCost(); } // This is for playing spells regularly (no Cascade/Ripple etc.) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index 42c1fec448b..b2d53e838fb 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -1508,14 +1508,18 @@ public class ComputerUtilCard { // Attempt to hold combat tricks until blockers are declared, and try to lure the opponent into blocking // (The AI will only do it for one attacker at the moment, otherwise it risks running his attackers into // an army of opposing blockers with only one combat trick in hand) - AiCardMemory.rememberCard(ai, c, AiCardMemory.MemorySet.MANDATORY_ATTACKERS); - AiCardMemory.rememberCard(ai, c, AiCardMemory.MemorySet.TRICK_ATTACKERS); // Reserve the mana until Declare Blockers such that the AI doesn't tap out before having a chance to use // the combat trick + boolean reserved = false; if (ai.getController().isAI()) { - ((PlayerControllerAi) ai.getController()).getAi().reserveManaSources(sa, PhaseType.COMBAT_DECLARE_BLOCKERS, false); + reserved = ((PlayerControllerAi) ai.getController()).getAi().reserveManaSources(sa, PhaseType.COMBAT_DECLARE_BLOCKERS, false); + // Only proceed with this if we could actually reserve mana + if (reserved) { + AiCardMemory.rememberCard(ai, c, AiCardMemory.MemorySet.MANDATORY_ATTACKERS); + AiCardMemory.rememberCard(ai, c, AiCardMemory.MemorySet.TRICK_ATTACKERS); + return false; + } } - return false; } else { // Don't try to mix "lure" and "precast" paradigms for combat tricks, since that creates issues with // the AI overextending the attack 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 09034ee8d7a..ecdb0c03b4f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/FogAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/FogAi.java @@ -45,8 +45,10 @@ public class FogAi extends SpellAbilityAi { || (game.getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS))) && (AiCardMemory.isMemorySetEmpty(ai, AiCardMemory.MemorySet.CHOSEN_FOG_EFFECT)) && (ComputerUtil.aiLifeInDanger(ai, false, 0))) { - ((PlayerControllerAi) ai.getController()).getAi().reserveManaSources(sa, PhaseType.COMBAT_DECLARE_BLOCKERS, true); - AiCardMemory.rememberCard(ai, hostCard, AiCardMemory.MemorySet.CHOSEN_FOG_EFFECT); + boolean reserved = ((PlayerControllerAi) ai.getController()).getAi().reserveManaSources(sa, PhaseType.COMBAT_DECLARE_BLOCKERS, true); + if (reserved) { + AiCardMemory.rememberCard(ai, hostCard, AiCardMemory.MemorySet.CHOSEN_FOG_EFFECT); + } } // AI should only activate this during Human's Declare Blockers phase From 03571f3466f7746e3f34a4ec054ad142907ca988 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 11 Nov 2018 17:47:47 +0300 Subject: [PATCH 156/901] - A little bit more work on combat tricks. --- forge-ai/src/main/java/forge/ai/AiController.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index bf52438f8cc..26e7989eb70 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -656,13 +656,16 @@ public class AiController { break; } - for (Card c : manaSources) { - AiCardMemory.rememberCard(player, c, memSet); - } - // This is a simplification, since one mana source can produce more than one mana, // but should work in most circumstances to ensure safety in whatever the AI is using this for. - return manaSources.size() >= cost.getConvertedManaCost(); + if (manaSources.size() >= cost.getConvertedManaCost()) { + for (Card c : manaSources) { + AiCardMemory.rememberCard(player, c, memSet); + } + return true; + } + + return false; } // This is for playing spells regularly (no Cascade/Ripple etc.) From 617f31cd323d419505c63b72028f50324eef1822 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 11 Nov 2018 17:54:27 +0300 Subject: [PATCH 157/901] - Enabled GRN for the Ravnica plane in Planar Conquest. - Added and updated several events to utilize GRN cards. - Fixed a couple Ravnica event avatars. --- .../Aurelia, Exemplar of Justice.dck | 33 +++++++++++++++ .../planes/Ravnica/Boros Garrison/_events.txt | 6 ++- .../Dimir Aqueduct/Etrata, the Silencer.dck | 33 +++++++++++++++ .../planes/Ravnica/Dimir Aqueduct/_events.txt | 6 ++- .../Golgari Rot Farm/Izoni, Thousand-Eyed.dck | 35 ++++++++++++++++ .../Ravnica/Golgari Rot Farm/_events.txt | 3 +- .../Ravnica/Gruul Turf/Borboygmos Enraged.dck | 2 +- .../planes/Ravnica/Gruul Turf/_events.txt | 4 +- .../Izzet Boilerworks/Izzet Overload.dck | 2 +- .../Mizzix of the Izmagus.dck | 2 +- .../Izzet Boilerworks/Niv-Mizzet, Parun.dck | 34 ++++++++++++++++ .../Izzet Boilerworks/Ral, Izzet Viceroy.dck | 40 +++++++++++++++++++ .../Ravnica/Izzet Boilerworks/_events.txt | 10 +++-- .../Ravnica/Rakdos Carnarium/_events.txt | 4 +- .../Emmara, Soul of the Accord.dck | 32 +++++++++++++++ .../Ravnica/Selesnya Sanctuary/_events.txt | 6 ++- .../res/conquest/planes/Ravnica/sets.txt | 3 +- forge-gui/res/conquest/planes/planes.txt | 2 +- 18 files changed, 237 insertions(+), 20 deletions(-) create mode 100644 forge-gui/res/conquest/planes/Ravnica/Boros Garrison/Aurelia, Exemplar of Justice.dck create mode 100644 forge-gui/res/conquest/planes/Ravnica/Dimir Aqueduct/Etrata, the Silencer.dck create mode 100644 forge-gui/res/conquest/planes/Ravnica/Golgari Rot Farm/Izoni, Thousand-Eyed.dck create mode 100644 forge-gui/res/conquest/planes/Ravnica/Izzet Boilerworks/Niv-Mizzet, Parun.dck create mode 100644 forge-gui/res/conquest/planes/Ravnica/Izzet Boilerworks/Ral, Izzet Viceroy.dck create mode 100644 forge-gui/res/conquest/planes/Ravnica/Selesnya Sanctuary/Emmara, Soul of the Accord.dck diff --git a/forge-gui/res/conquest/planes/Ravnica/Boros Garrison/Aurelia, Exemplar of Justice.dck b/forge-gui/res/conquest/planes/Ravnica/Boros Garrison/Aurelia, Exemplar of Justice.dck new file mode 100644 index 00000000000..5905e675503 --- /dev/null +++ b/forge-gui/res/conquest/planes/Ravnica/Boros Garrison/Aurelia, Exemplar of Justice.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Aurelia, Exemplar of Justice +[Commander] +1 Aurelia, Exemplar of Justice|GRN +[Main] +1 Barging Sergeant|GRN +1 Blade Instructor|GRN +1 Boros Challenger|GRN +1 Boros Guildgate|GRN|1 +1 Boros Locket|GRN +1 Chromatic Lantern|GRN +1 Fresh-Faced Recruit|GRN +1 Gird for Battle|GRN +1 Goblin Banneret|GRN +1 Haazda Marshal|GRN +1 Hammer Dropper|GRN +1 Justice Strike|GRN +1 Legion Warboss|GRN +1 Light of the Legion|GRN +1 Maximize Velocity|GRN +7 Mountain|GRN +1 Parhelion Patrol|GRN +7 Plains|GRN +1 Rampaging Monument|GRN +1 Sacred Foundry|GRN +1 Skyknight Legionnaire|GRN +1 Sunhome Stalwart|GRN +1 Sure Strike|GRN +1 Swiftblade Vindicator|GRN +1 Tajic, Legion's Edge|GRN +1 Truefire Captain|GRN +1 Wojek Bodyguard|GRN +[Sideboard] diff --git a/forge-gui/res/conquest/planes/Ravnica/Boros Garrison/_events.txt b/forge-gui/res/conquest/planes/Ravnica/Boros Garrison/_events.txt index 3fe750e4c67..eaeea66e1eb 100644 --- a/forge-gui/res/conquest/planes/Ravnica/Boros Garrison/_events.txt +++ b/forge-gui/res/conquest/planes/Ravnica/Boros Garrison/_events.txt @@ -1,9 +1,11 @@ Name:Boros Battalion|Deck:Boros Battalion.dck|Variant:None|Avatar:Firemane Avenger|Desc: Name:Boros Radiance|Deck:Boros Radiance.dck|Variant:None|Avatar:Wojek Embermage|Desc: -Name:Coin Flip|Deck:Coin Flip.dck|Variant:None|Avatar:Volatile Rig|Desc: Name:Agrus Kos, Wojek Veteran|Deck:Agrus Kos, Wojek Veteran.dck|Variant:Commander|Avatar:Agrus Kos, Wojek Veteran|Desc: Name:Aurelia, the Warleader|Deck:Aurelia, the Warleader.dck|Variant:Commander|Avatar:Aurelia, the Warleader|Desc: Name:Krenko, Mob Boss|Deck:Krenko, Mob Boss.dck|Variant:Commander|Avatar:Krenko, Mob Boss|Desc: Name:Tajic, Blade of the Legion|Deck:Tajic, Blade of the Legion.dck|Variant:Commander|Avatar:Tajic, Blade of the Legion|Desc: +Name:Aurelia, Exemplar of Justice|Deck:Aurelia, Exemplar of Justice.dck|Variant:Commander|Avatar:Aurelia, Exemplar of Justice|Desc: Name:Serra Angel|Deck:Serra Angel.dck|Variant:Vanguard|Avatar:Serra Angel|Desc: -Name:Gideon, Champion of Justice|Deck:Gideon, Champion of Justice.dck|Variant:Planeswalker|Avatar:Gideon, Champion of Justice|Desc: \ No newline at end of file +Name:Gideon, Champion of Justice|Deck:Gideon, Champion of Justice.dck|Variant:Planeswalker|Avatar:Gideon, Champion of Justice|Desc: + +Name:Coin Flip|Deck:Coin Flip.dck|Variant:None|Avatar:Volatile Rig|Desc: diff --git a/forge-gui/res/conquest/planes/Ravnica/Dimir Aqueduct/Etrata, the Silencer.dck b/forge-gui/res/conquest/planes/Ravnica/Dimir Aqueduct/Etrata, the Silencer.dck new file mode 100644 index 00000000000..3f09a13e74c --- /dev/null +++ b/forge-gui/res/conquest/planes/Ravnica/Dimir Aqueduct/Etrata, the Silencer.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Etrata, the Silencer +[Commander] +1 Etrata, the Silencer|GRN +[Main] +1 Barrier of Bones|GRN +1 Citywatch Sphinx|GRN +1 Connive // Concoct|GRN +1 Darkblade Agent|GRN +1 Dazzling Lights|GRN +1 Dimir Guildgate|GRN|1 +1 Dimir Informant|GRN +1 Dimir Locket|GRN +1 Dimir Spybug|GRN +1 Discovery // Dispersal|GRN +1 Disinformation Campaign|GRN +1 Doom Whisperer|GRN +1 Dream Eater|GRN +8 Island|GRN +1 Nightveil Sprite|GRN +1 Notion Rain|GRN +1 Price of Fame|GRN +1 Rampaging Monument|GRN +1 Sinister Sabotage|GRN +6 Swamp|GRN +1 Thought Erasure|GRN +1 Thoughtbound Phantasm|GRN +1 Unexplained Disappearance|GRN +1 Watcher in the Mist|GRN +1 Watery Grave|GRN +1 Whisper Agent|GRN +1 Whispering Snitch|GRN +[Sideboard] diff --git a/forge-gui/res/conquest/planes/Ravnica/Dimir Aqueduct/_events.txt b/forge-gui/res/conquest/planes/Ravnica/Dimir Aqueduct/_events.txt index becc8c1532f..6fdce3f5a64 100644 --- a/forge-gui/res/conquest/planes/Ravnica/Dimir Aqueduct/_events.txt +++ b/forge-gui/res/conquest/planes/Ravnica/Dimir Aqueduct/_events.txt @@ -1,9 +1,11 @@ Name:Dimir Cipher|Deck:Dimir Cipher.dck|Variant:None|Avatar:Stolen Identity|Desc: Name:Dimir Mill|Deck:Dimir Mill.dck|Variant:None|Avatar:Belltower Sphinx|Desc: Name:Dimir Transmute|Deck:Dimir Transmute.dck|Variant:None|Avatar:Dimir House Guard|Desc: -Name:Defender Mill|Deck:Defender Mill.dck|Variant:None|Avatar:Doorkeeper|Desc: Name:Circu, Dimir Lobotomist|Deck:Circu, Dimir Lobotomist.dck|Variant:Commander|Avatar:Circu, Dimir Lobotomist|Desc: Name:Lazav, Dimir Mastermind|Deck:Lazav, Dimir Mastermind.dck|Variant:Commander|Avatar:Lazav, Dimir Mastermind|Desc: Name:Mirko Vosk, Mind Drinker|Deck:Mirko Vosk, Mind Drinker.dck|Variant:Commander|Avatar:Mirko Vosk, Mind Drinker|Desc: Name:Szadek, Lord of Secrets|Deck:Szadek, Lord of Secrets.dck|Variant:Commander|Avatar:Szadek, Lord of Secrets|Desc: -Name:Royal Assassin|Deck:Royal Assassin.dck|Variant:Vanguard|Avatar:Royal Assassin|Desc: \ No newline at end of file +Name:Etrata, the Silencer|Deck:Etrata, the Silencer.dck|Variant:Commander|Avatar:Etrata, the Silencer|Desc: +Name:Royal Assassin|Deck:Royal Assassin.dck|Variant:Vanguard|Avatar:Royal Assassin|Desc: + +Name:Defender Mill|Deck:Defender Mill.dck|Variant:None|Avatar:Doorkeeper|Desc: diff --git a/forge-gui/res/conquest/planes/Ravnica/Golgari Rot Farm/Izoni, Thousand-Eyed.dck b/forge-gui/res/conquest/planes/Ravnica/Golgari Rot Farm/Izoni, Thousand-Eyed.dck new file mode 100644 index 00000000000..0845342b52b --- /dev/null +++ b/forge-gui/res/conquest/planes/Ravnica/Golgari Rot Farm/Izoni, Thousand-Eyed.dck @@ -0,0 +1,35 @@ +[metadata] +Name=Izoni, Thousand-Eyed +[Commander] +1 Izoni, Thousand-Eyed|GRN +[Main] +1 Assassin's Trophy|GRN +1 Attendant of Vraska|GRN +1 Barrier of Bones|GRN +1 Burglar Rat|GRN +1 Chromatic Lantern|GRN +1 Creeping Chill|GRN +1 Doom Whisperer|GRN +1 Erstwhile Trooper|GRN +5 Forest|GRN +1 Glowspore Shaman|GRN +1 Golgari Findbroker|GRN +1 Golgari Guildgate|GRN|1 +1 Golgari Locket|GRN +1 Guildmages' Forum|GRN +1 Kraul Foragers|GRN +1 Kraul Harpooner|GRN +1 Moodmark Painter|GRN +1 Necrotic Wound|GRN +1 Ochran Assassin|GRN +1 Overgrown Tomb|GRN +1 Pitiless Gorgon|GRN +1 Plaguecrafter|GRN +1 Rhizome Lurcher|GRN +7 Swamp|GRN +1 Swarm Guildmage|GRN +1 Underrealm Lich|GRN +1 Vicious Rumors|GRN +1 Vigorspore Wurm|GRN +1 Vraska, Regal Gorgon|GRN +[Sideboard] diff --git a/forge-gui/res/conquest/planes/Ravnica/Golgari Rot Farm/_events.txt b/forge-gui/res/conquest/planes/Ravnica/Golgari Rot Farm/_events.txt index 22eb78cee09..f3b26ce2815 100644 --- a/forge-gui/res/conquest/planes/Ravnica/Golgari Rot Farm/_events.txt +++ b/forge-gui/res/conquest/planes/Ravnica/Golgari Rot Farm/_events.txt @@ -1,8 +1,9 @@ Name:Golgari Dredge|Deck:Golgari Dredge.dck|Variant:None|Avatar:Golgari Grave-Troll|Desc: Name:Golgari Scavenge|Deck:Golgari Scavenge.dck|Variant:None|Avatar:Deadbridge Goliath|Desc: +Name:Izoni, Thousand-Eyed|Deck:Izoni, Thousand-Eyed.dck|Variant:Commander|Avatar:Izoni, Thousand-Eyed|Desc: Name:Mazirek, Kraul Death Priest|Deck:Mazirek, Kraul Death Priest.dck|Variant:Commander|Avatar:Mazirek, Kraul Death Priest|Desc: Name:Jarad, Golgari Lich Lord|Deck:Jarad, Golgari Lich Lord.dck|Variant:Commander|Avatar:Jarad, Golgari Lich Lord|Desc: Name:Savra, Queen of the Golgari|Deck:Savra, Queen of the Golgari.dck|Variant:Commander|Avatar:Savra, Queen of the Golgari|Desc: Name:Varolz, the Scar-Striped|Deck:Varolz, the Scar-Striped.dck|Variant:Commander|Avatar:Varolz, the Scar-Striped|Desc: Name:Sisters of Stone Death|Deck:Sisters of Stone Death.dck|Variant:Vanguard|Avatar:Sisters of Stone Death|Desc: -Name:Vraska the Unseen|Deck:Vraska the Unseen.dck|Variant:Planeswalker|Avatar:Vraska the Unseen|Desc: \ No newline at end of file +Name:Vraska the Unseen|Deck:Vraska the Unseen.dck|Variant:Planeswalker|Avatar:Vraska the Unseen|Desc: diff --git a/forge-gui/res/conquest/planes/Ravnica/Gruul Turf/Borboygmos Enraged.dck b/forge-gui/res/conquest/planes/Ravnica/Gruul Turf/Borboygmos Enraged.dck index 03b16207b46..1cd4af05a6e 100644 --- a/forge-gui/res/conquest/planes/Ravnica/Gruul Turf/Borboygmos Enraged.dck +++ b/forge-gui/res/conquest/planes/Ravnica/Gruul Turf/Borboygmos Enraged.dck @@ -1,5 +1,5 @@ [metadata] -Name=Borboygmos Enraged +Name=Borborygmos Enraged [Commander] 1 Borborygmos Enraged|GTC [Main] diff --git a/forge-gui/res/conquest/planes/Ravnica/Gruul Turf/_events.txt b/forge-gui/res/conquest/planes/Ravnica/Gruul Turf/_events.txt index 18d61b4cb7a..959afc3acec 100644 --- a/forge-gui/res/conquest/planes/Ravnica/Gruul Turf/_events.txt +++ b/forge-gui/res/conquest/planes/Ravnica/Gruul Turf/_events.txt @@ -2,8 +2,8 @@ Name:Gruul Bloodrush|Deck:Gruul Bloodrush.dck|Variant:None|Avatar:Rubblehulk|Des Name:Gruul Bloodthirst|Deck:Gruul Bloodthirst.dck|Variant:None|Avatar:Furyborn Hellkite|Desc: Name:Nephilim of Ravnica|Deck:Nephilim of Ravnica.dck|Variant:None|Avatar:Ink-Treader Nephilim|Desc: Name:Borborygmos|Deck:Borborygmos.dck|Variant:Commander|Avatar:Borborygmos|Desc: -Name:Borboygmos Enraged|Deck:Borboygmos Enraged.dck|Variant:Commander|Avatar:Borboygmos Enraged|Desc: +Name:Borborygmos Enraged|Deck:Borboygmos Enraged.dck|Variant:Commander|Avatar:Borborygmos Enraged|Desc: Name:Ruric Thar, the Unbowed|Deck:Ruric Thar, the Unbowed.dck|Variant:Commander|Avatar:Ruric Thar, the Unbowed|Desc: Name:Ulasht, the Hate Seed|Deck:Ulasht, the Hate Seed.dck|Variant:Commander|Avatar:Ulasht, the Hate Seed|Desc: Name:Rumbling Slum|Deck:Rumbling Slum.dck|Variant:Vanguard|Avatar:Rumbling Slum|Desc: -Name:Domri Rade|Deck:Domri Rade.dck|Variant:Planeswalker|Avatar:Domri Rade|Desc: \ No newline at end of file +Name:Domri Rade|Deck:Domri Rade.dck|Variant:Planeswalker|Avatar:Domri Rade|Desc: diff --git a/forge-gui/res/conquest/planes/Ravnica/Izzet Boilerworks/Izzet Overload.dck b/forge-gui/res/conquest/planes/Ravnica/Izzet Boilerworks/Izzet Overload.dck index 7530d0f785b..78a3561c8df 100644 --- a/forge-gui/res/conquest/planes/Ravnica/Izzet Boilerworks/Izzet Overload.dck +++ b/forge-gui/res/conquest/planes/Ravnica/Izzet Boilerworks/Izzet Overload.dck @@ -36,4 +36,4 @@ Name=Izzet Overload 1 Teleportal|RTR 1 Transguild Promenade|C13 1 Vandalblast|C15 -1 Weapon Surge|DGM \ No newline at end of file +1 Weapon Surge|DGM diff --git a/forge-gui/res/conquest/planes/Ravnica/Izzet Boilerworks/Mizzix of the Izmagus.dck b/forge-gui/res/conquest/planes/Ravnica/Izzet Boilerworks/Mizzix of the Izmagus.dck index d919231fd61..03c9623f976 100644 --- a/forge-gui/res/conquest/planes/Ravnica/Izzet Boilerworks/Mizzix of the Izmagus.dck +++ b/forge-gui/res/conquest/planes/Ravnica/Izzet Boilerworks/Mizzix of the Izmagus.dck @@ -1,5 +1,5 @@ [metadata] -Name=Mizzix of the Izmagus +Name=Mizzix of the Izmagnus [Commander] 1 Mizzix of the Izmagnus|C15 [Main] diff --git a/forge-gui/res/conquest/planes/Ravnica/Izzet Boilerworks/Niv-Mizzet, Parun.dck b/forge-gui/res/conquest/planes/Ravnica/Izzet Boilerworks/Niv-Mizzet, Parun.dck new file mode 100644 index 00000000000..e0ba81e9a8d --- /dev/null +++ b/forge-gui/res/conquest/planes/Ravnica/Izzet Boilerworks/Niv-Mizzet, Parun.dck @@ -0,0 +1,34 @@ +[metadata] +Name=Niv-Mizzet, Parun +[Commander] +1 Niv-Mizzet, Parun|GRN +[Main] +1 Chromatic Lantern|GRN +1 Crackling Drake|GRN +1 Direct Current|GRN +1 Electrostatic Field|GRN +1 Erratic Cyclops|GRN +1 Expansion // Explosion|GRN +1 Gateway Plaza|GRN +1 Goblin Electromancer|GRN +1 Gravitic Punch|GRN +1 Inescapable Blaze|GRN +1 Ionize|GRN +5 Island|GRN +1 Izzet Guildgate|GRN|1 +1 Izzet Locket|GRN +1 Leapfrog|GRN +1 Maximize Altitude|GRN +1 Maximize Velocity|GRN +7 Mountain|GRN +1 Murmuring Mystic|GRN +1 Precision Bolt|GRN +1 Quasiduplicate|GRN +1 Ral, Izzet Viceroy|GRN +1 Risk Factor|GRN +1 Sonic Assault|GRN +1 Steam Vents|GRN +1 Sure Strike|GRN +1 Thousand-Year Storm|GRN +1 Unexplained Disappearance|GRN +1 Wee Dragonauts|GRN diff --git a/forge-gui/res/conquest/planes/Ravnica/Izzet Boilerworks/Ral, Izzet Viceroy.dck b/forge-gui/res/conquest/planes/Ravnica/Izzet Boilerworks/Ral, Izzet Viceroy.dck new file mode 100644 index 00000000000..27ccdf004c5 --- /dev/null +++ b/forge-gui/res/conquest/planes/Ravnica/Izzet Boilerworks/Ral, Izzet Viceroy.dck @@ -0,0 +1,40 @@ +[metadata] +Name=Ral, Izzet Viceroy +[Main] +1 Blustersquall|C15 +1 Chemister's Trick|RTR +1 Counterflux|C15 +1 Cyclonic Rift|C14 +1 Downsize|RTR +1 Dragonshift|DGM +1 Dynacharge|RTR +1 Electrickery|RTR +1 Epic Experiment|C15 +1 Goblin Electromancer|C15 +1 Hypersonic Dragon|RTR +1 Invoke the Firemind|GPT +3 Island|C13|1 +1 Island|C13|2 +1 Island|C13|4 +1 Izzet Boilerworks|C15 +1 Izzet Charm|RTR +1 Izzet Cluestone|DGM +1 Izzet Guildgate|C15 +1 Izzet Guildmage|GPT +1 Izzet Keyrune|RTR +1 Izzet Signet|C15 +1 Mercurial Chemister|RTR +1 Mizzium Mortars|C15 +1 Mizzium Skin|RTR +1 Mizzix of the Izmagnus|C15 +2 Mountain|C13|2 +2 Mountain|C13|4 +1 Nivmagus Elemental|RTR +1 Pillar of the Paruns|DIS +1 Ral, Izzet Viceroy|GRN +1 Steam Vents|RTR +1 Street Spasm|C13 +1 Teleportal|RTR +1 Transguild Promenade|C13 +1 Vandalblast|C15 +1 Weapon Surge|DGM diff --git a/forge-gui/res/conquest/planes/Ravnica/Izzet Boilerworks/_events.txt b/forge-gui/res/conquest/planes/Ravnica/Izzet Boilerworks/_events.txt index 77210473e69..c0109489dba 100644 --- a/forge-gui/res/conquest/planes/Ravnica/Izzet Boilerworks/_events.txt +++ b/forge-gui/res/conquest/planes/Ravnica/Izzet Boilerworks/_events.txt @@ -1,9 +1,11 @@ -Name:Izzet Overload|Deck:Izzet Overload.dck|Variant:None|Avatar:Teleportal|Desc: -Name:Izzet Replicate|Deck:Izzet Replicate.dck|Variant:None|Avatar:Djinn Illuminatus|Desc: +Name:Ral, Izzet Viceroy|Deck:Ral, Izzet Viceroy.dck|Variant:Planeswalker|Avatar:Ral, Izzet Viceroy|Desc: Name:Melek, Izzet Paragon|Deck:Melek, Izzet Paragon.dck|Variant:Commander|Avatar:Melek, Izzet Paragon|Desc: Name:Niv-Mizzet, Dracogenius|Deck:Niv-Mizzet, Dracogenius.dck|Variant:Commander|Avatar:Niv-Mizzet, Dracogenius|Desc: -Name:Mizzix of the Izmagus|Deck:Mizzix of the Izmagus.dck|Variant:Commander|Avatar:Mizzix of the Izmagus|Desc: +Name:Mizzix of the Izmagnus|Deck:Mizzix of the Izmagus.dck|Variant:Commander|Avatar:Mizzix of the Izmagnus|Desc: Name:Niv-Mizzet, the Firemind|Deck:Niv-Mizzet, the Firemind.dck|Variant:Commander|Avatar:Niv-Mizzet, the Firemind|Desc: Name:Tibor and Lumia|Deck:Tibor and Lumia.dck|Variant:Commander|Avatar:Tibor and Lumia|Desc: Name:Jhoira of the Ghitu|Deck:Jhoira of the Ghitu.dck|Variant:Vanguard|Avatar:Jhoira of the Ghitu|Desc: -Name:Ral Zarek|Deck:Ral Zarek.dck|Variant:Planeswalker|Avatar:Ral Zarek|Desc: \ No newline at end of file +Name:Ral Zarek|Deck:Ral Zarek.dck|Variant:Planeswalker|Avatar:Ral Zarek|Desc: +Name:Niv-Mizzet, Parun|Deck:Niv-Mizzet, Parun.dck|Variant:Commander|Avatar:Niv-Mizzet, Parun|Desc: + +Name:Izzet Replicate|Deck:Izzet Replicate.dck|Variant:None|Avatar:Djinn Illuminatus|Desc: diff --git a/forge-gui/res/conquest/planes/Ravnica/Rakdos Carnarium/_events.txt b/forge-gui/res/conquest/planes/Ravnica/Rakdos Carnarium/_events.txt index 0cd8f242983..ddad4e2e503 100644 --- a/forge-gui/res/conquest/planes/Ravnica/Rakdos Carnarium/_events.txt +++ b/forge-gui/res/conquest/planes/Ravnica/Rakdos Carnarium/_events.txt @@ -2,8 +2,8 @@ Name:Rakdos Hellbent|Deck:Rakdos Hellbent.dck|Variant:None|Avatar:Jagged Poppet| Name:Rakdos Unleash|Deck:Rakdos Unleash.dck|Variant:None|Avatar:Hellhole Flailer|Desc: Name:Rakdos Destruction|Deck:Rakdos Destruction.dck|Variant:None|Avatar:Helldozer|Desc: Name:Exava, Rakdos Blood Witch|Deck:Exava, Rakdos Blood Witch.dck|Variant:Commander|Avatar:Exava, Rakdos Blood Witch|Desc: -Name:Lyzolda, the Blood Witch|Deck:Lyzolda, the Blood Witch.dck|Variant:Commander|Avatar:Lyzolda, Blood Witch|Desc: +Name:Lyzolda, the Blood Witch|Deck:Lyzolda, the Blood Witch.dck|Variant:Commander|Avatar:Lyzolda, the Blood Witch|Desc: Name:Rakdos the Defiler|Deck:Rakdos the Defiler.dck|Variant:Commander|Avatar:Rakdos the Defiler|Desc: Name:Rakdos, Lord of Riots|Deck:Rakdos, Lord of Riots.dck|Variant:Commander|Avatar:Rakdos, Lord of Riots|Desc: Name:Shattergang Brothers|Deck:Shattergang Brothers.dck|Variant:Commander|Avatar:Shattergang Brothers|Desc: -Name:Lyzolda, the Blood Witch|Deck:Lyzolda, the Blood Witch Vanguard.dck|Variant:Vanguard|Avatar:Lyzolda, the Blood Witch|Desc: \ No newline at end of file +Name:Lyzolda, the Blood Witch|Deck:Lyzolda, the Blood Witch Vanguard.dck|Variant:Vanguard|Avatar:Lyzolda, the Blood Witch|Desc: diff --git a/forge-gui/res/conquest/planes/Ravnica/Selesnya Sanctuary/Emmara, Soul of the Accord.dck b/forge-gui/res/conquest/planes/Ravnica/Selesnya Sanctuary/Emmara, Soul of the Accord.dck new file mode 100644 index 00000000000..0e1ae5e53bf --- /dev/null +++ b/forge-gui/res/conquest/planes/Ravnica/Selesnya Sanctuary/Emmara, Soul of the Accord.dck @@ -0,0 +1,32 @@ +[metadata] +Name=Emmara, Soul of the Accord +[Commander] +1 Emmara, Soul of the Accord|GRN +[Main] +1 Assure // Assemble|GRN +1 Beast Whisperer|GRN +1 Bounty of Might|GRN +1 Camaraderie|GRN +1 Candlelight Vigil|GRN +1 Circuitous Route|GRN +1 Conclave Cavalier|GRN +1 Conclave Guildmage|GRN +1 Devkarin Dissident|GRN +1 District Guide|GRN +1 Divine Visitation|GRN +1 Flower // Flourish|GRN +8 Forest|GRN +1 Gird for Battle|GRN +1 Impervious Greatwurm|GRN +1 Ledev Champion|GRN +1 March of the Multitudes|GRN +1 Pelt Collector|GRN +7 Plains|GRN +1 Selesnya Guildgate|GRN|1 +1 Selesnya Locket|GRN +1 Siege Wurm|GRN +1 Sworn Companions|GRN +1 Temple Garden|GRN +1 Trostani Discordant|GRN +1 Urban Utopia|GRN +[Sideboard] diff --git a/forge-gui/res/conquest/planes/Ravnica/Selesnya Sanctuary/_events.txt b/forge-gui/res/conquest/planes/Ravnica/Selesnya Sanctuary/_events.txt index 8e978bcd645..14b9e7452c2 100644 --- a/forge-gui/res/conquest/planes/Ravnica/Selesnya Sanctuary/_events.txt +++ b/forge-gui/res/conquest/planes/Ravnica/Selesnya Sanctuary/_events.txt @@ -1,9 +1,11 @@ Name:Selesnya Convoke|Deck:Selesnya Convoke.dck|Variant:None|Avatar:Autochthon Wurm|Desc: Name:Selesnya Populate|Deck:Selesnya Populate.dck|Variant:None|Avatar:Wayfaring Temple|Desc: -Name:Gatherer of Graces Voltron|Deck:Gatherer of Graces Voltron.dck|Variant:None|Avatar:Gatherer of Graces|Desc: +Name:Emmara, Soul of the Accord|Deck:Emmara, Soul of the Accord.dck|Variant:Commander|Avatar:Emmara, Soul of the Accord|Desc: Name:Chorus of the Conclave|Deck:Chorus of the Conclave.dck|Variant:Commander|Avatar:Chorus of the Conclave|Desc: Name:Tolsimir Wolfblood|Deck:Tolsimir Wolfblood.dck|Variant:Commander|Avatar:Tolsimir Wolfblood|Desc: Name:Emmara Tandris|Deck:Emmara Tandris.dck|Variant:Commander|Avatar:Emmara Tandris|Desc: Name:Trostani, Selesnya's Voice|Deck:Trostani, Selesnya's Voice.dck|Variant:Commander|Avatar:Trostani, Selesnya's Voice|Desc: Name:Yeva, Nature's Herald|Deck:Yeva, Nature's Herald.dck|Variant:Commander|Avatar:Yeva, Nature's Herald|Desc: -Name:Loxodon Hierarch|Deck:Loxodon Hierarch.dck|Variant:Vanguard|Avatar:Loxodon Hierarch|Desc: \ No newline at end of file +Name:Loxodon Hierarch|Deck:Loxodon Hierarch.dck|Variant:Vanguard|Avatar:Loxodon Hierarch|Desc: + +Name:Gatherer of Graces Voltron|Deck:Gatherer of Graces Voltron.dck|Variant:None|Avatar:Gatherer of Graces|Desc: diff --git a/forge-gui/res/conquest/planes/Ravnica/sets.txt b/forge-gui/res/conquest/planes/Ravnica/sets.txt index 3c3c83e4d79..772840ca3a2 100644 --- a/forge-gui/res/conquest/planes/Ravnica/sets.txt +++ b/forge-gui/res/conquest/planes/Ravnica/sets.txt @@ -4,4 +4,5 @@ DIS RTR GTC DGM -C15 \ No newline at end of file +C15 +GRN diff --git a/forge-gui/res/conquest/planes/planes.txt b/forge-gui/res/conquest/planes/planes.txt index 989300ed9c0..aa1b0573cb2 100644 --- a/forge-gui/res/conquest/planes/planes.txt +++ b/forge-gui/res/conquest/planes/planes.txt @@ -9,7 +9,7 @@ Name:Lorwyn-Shadowmoor|RegionSize:9|Desc:A sunny utopia with a thriving storyboo Name:Mercadia|RegionSize:6|Unreachable:True|Desc: Name:Mirrodin|RegionSize:9|Desc:A dark contagion is taking over this metal planet, breeding wave after wave of Phyrexian horrors.\nConsists of 63 events. Contains cards from MRD, DST, 5DN, SOM, MBS, NPH, and more. Name:Rath|RegionSize:6|Unreachable:True|Desc: -Name:Ravnica|RegionSize:9|Desc:A worldwide cityscape of grand halls, decrepit slums, and ancient ruins.\nConsists of 88 events. Contains cards from RAV, GPT, DIS, RTR, GTC, DGM, and C15. +Name:Ravnica|RegionSize:9|Desc:A worldwide cityscape of grand halls, decrepit slums, and ancient ruins.\nConsists of 88 events. Contains cards from RAV, GPT, DIS, RTR, GTC, DGM, GRN, and C15. Name:Regatha|RegionSize:6|Unreachable:True|Desc: Name:Shandalar|RegionSize:9|Unreachable:True|Desc: Name:Tarkir|RegionSize:9|Desc:A plane dominated by five powerful clans... or five powerful dragon lords.\nConsists of 45 events. Contains cards from KTK, FRF, DTK, CMD, CNS/CN2, some C17. From 7b18df3730c1fe4609dbbab22c6c04ec19d1709f Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 11 Nov 2018 18:00:29 +0300 Subject: [PATCH 158/901] - A little more work on combat tricks. --- forge-ai/src/main/java/forge/ai/ComputerUtilCard.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index b2d53e838fb..7d45ed46dfd 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -1492,7 +1492,7 @@ public class ComputerUtilCard { } } - boolean wantToHoldTrick = holdCombatTricks; + boolean wantToHoldTrick = holdCombatTricks && !ai.getCardsIn(ZoneType.Hand).isEmpty(); if (chanceToHoldCombatTricks >= 0) { // Obey the chance specified in the AI profile for holding combat tricks wantToHoldTrick &= MyRandom.percentTrue(chanceToHoldCombatTricks); From 18bb200387a1cffe3479c5eb1964469744586a0c Mon Sep 17 00:00:00 2001 From: swordshine Date: Sun, 11 Nov 2018 23:12:49 +0800 Subject: [PATCH 159/901] - Fix two cards' descriptions --- forge-gui/res/cardsfolder/r/resplendent_angel.txt | 4 ++-- forge-gui/res/cardsfolder/s/stitchers_supplier.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/r/resplendent_angel.txt b/forge-gui/res/cardsfolder/r/resplendent_angel.txt index 31d13203be1..3e0a4d0aded 100644 --- a/forge-gui/res/cardsfolder/r/resplendent_angel.txt +++ b/forge-gui/res/cardsfolder/r/resplendent_angel.txt @@ -1,12 +1,12 @@ Name:Resplendent Angel ManaCost:1 W W Types:Creature Angel +PT:3/3 K:Flying T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | CheckSVar$ YouLifeGained | SVarCompare$ GE5 | Execute$ TrigToken | TriggerDescription$ At the beginning of each end step, if you gained 5 or more life this turn, create a 4/4 white Angel creature token with flying and vigilance. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenName$ Angel | TokenTypes$ Creature,Angel | TokenOwner$ You | TokenColors$ White | TokenPower$ 4 | TokenToughness$ 4 | TokenImage$ w 4 4 angel m19 | TokenKeywords$ Flying<>Vigilance SVar:YouLifeGained:Count$LifeYouGainedThisTurn -A:AB$ Pump | Cost$ 3 W W W | ValidCard$ Card.Self | NumAtt$ 2 | NumDef$ 2 | KW$ Lifelink +A:AB$ Pump | Cost$ 3 W W W | ValidCard$ Card.Self | NumAtt$ 2 | NumDef$ 2 | KW$ Lifelink | SpellDescription$ Until end of turn, CARDNAME gets +2/+2 and gains lifelink. DeckHints:Ability$LifeGain DeckHas:Ability$Token Oracle:Flying\nAt the beginning of each end step, if you gained 5 or more life this turn, create a 4/4 white Angel creature token with flying and vigilance.\n{3}{W}{W}{W}: Until end of turn, Resplendent Angel gets +2/+2 and gains lifelink. -PT:3/3 \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/stitchers_supplier.txt b/forge-gui/res/cardsfolder/s/stitchers_supplier.txt index 5df9ea02b86..f614221b5dd 100644 --- a/forge-gui/res/cardsfolder/s/stitchers_supplier.txt +++ b/forge-gui/res/cardsfolder/s/stitchers_supplier.txt @@ -3,6 +3,6 @@ ManaCost:B Types:Creature Zombie PT:1/1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMill | TriggerDescription$ When CARDNAME enters the battlefield or dies, put the top three cards of your library into your graveyard. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigMill | TriggerDescription$ When CARDNAME enters the battlefield or dies, put the top three cards of your library into your graveyard. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Secondary$ True | Execute$ TrigMill | TriggerDescription$ When CARDNAME enters the battlefield or dies, put the top three cards of your library into your graveyard. SVar:TrigMill:DB$Mill | NumCards$ 3 | Defined$ You Oracle:When Stitcher's Supplier enters the battlefield or dies, put the top three cards of your library into your graveyard. \ No newline at end of file From 509b5532b4d527474febd6b6fba08c1a5251713a Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 12 Nov 2018 15:56:05 +0300 Subject: [PATCH 160/901] - Fix the AI overpaying for Syncopate and similar counterspells. --- forge-ai/src/main/java/forge/ai/ability/CounterAi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/CounterAi.java b/forge-ai/src/main/java/forge/ai/ability/CounterAi.java index 33088e22ac4..41edaa0d49a 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CounterAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CounterAi.java @@ -105,7 +105,7 @@ public class CounterAi extends SpellAbilityAi { boolean setPayX = false; if (unlessCost.equals("X") && source.getSVar(unlessCost).equals("Count$xPaid")) { setPayX = true; - toPay = ComputerUtilMana.determineLeftoverMana(sa, ai); + toPay = Math.min(ComputerUtilMana.determineLeftoverMana(sa, ai), usableManaSources + 1); } else { toPay = AbilityUtils.calculateAmount(source, unlessCost, sa); } From 8fbf34fe3dfb6d5fbe39a8b4ee0ec12fde99db1b Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 12 Nov 2018 21:01:33 +0300 Subject: [PATCH 161/901] - Updating CHANGES.txt. --- forge-gui/release-files/CHANGES.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/forge-gui/release-files/CHANGES.txt b/forge-gui/release-files/CHANGES.txt index 5e2ebfad0a6..372e3454bc2 100644 --- a/forge-gui/release-files/CHANGES.txt +++ b/forge-gui/release-files/CHANGES.txt @@ -1,3 +1,6 @@ +- Planar Conquest: Guilds of Ravnica - +Cards from Guilds of Ravnica are now available on the Ravnica plane in Planar Conquest. Several events on this plane have been updated or changed to feature Guilds of Ravnica cards as well. Please note that Planar Conquest is currently only available on Android and the macOS mobile backport. + - Random Commander Quest - It is now possible to start a quest with Commander rules and randomly generated quest opponents playing Commander decks. This feature is currently exclusive to desktop Forge. From 5a83df90252fb1f96ef6ea83de9ceac4eb03b7cc Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 12 Nov 2018 22:22:57 +0300 Subject: [PATCH 162/901] - Added quest opponents Remington Smisse 2 and Remington Smisse 3 (UB Surveil). --- .../res/quest/duels/Remington Smisse 2.dck | 27 +++++++++++++++ .../res/quest/duels/Remington Smisse 3.dck | 33 +++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 forge-gui/res/quest/duels/Remington Smisse 2.dck create mode 100644 forge-gui/res/quest/duels/Remington Smisse 3.dck diff --git a/forge-gui/res/quest/duels/Remington Smisse 2.dck b/forge-gui/res/quest/duels/Remington Smisse 2.dck new file mode 100644 index 00000000000..1f2c686e94c --- /dev/null +++ b/forge-gui/res/quest/duels/Remington Smisse 2.dck @@ -0,0 +1,27 @@ +[duel] +[metadata] +Name=Remington Smisse 2 +Title=Remington Smisse +Difficulty=medium +Description=UB Surveil deck with Etrata, the Silencer. +Icon=Remington Smisse.jpg +Deck Type=constructed +[main] +3 Blink of an Eye|DOM +2 Darkblade Agent|GRN +4 Dimir Spybug|GRN +2 Disinformation Campaign|GRN +4 Drowned Catacomb|XLN +3 Etrata, the Silencer|GRN +8 Island|DOM +2 Island|GRN +2 Murder|M19 +3 Negate|RIX +4 Nightveil Sprite|GRN +4 Notion Rain|GRN +3 Sinister Sabotage|GRN +6 Swamp|DOM +2 Swamp|GRN +4 Thought Erasure|GRN +4 Thoughtbound Phantasm|GRN +[sideboard] diff --git a/forge-gui/res/quest/duels/Remington Smisse 3.dck b/forge-gui/res/quest/duels/Remington Smisse 3.dck new file mode 100644 index 00000000000..62aceafd0b4 --- /dev/null +++ b/forge-gui/res/quest/duels/Remington Smisse 3.dck @@ -0,0 +1,33 @@ +[duel] +[metadata] +Name=Remington Smisse 3 +Title=Remington Smisse +Difficulty=hard +Description=UB Surveil deck with Etrata, the Silencer. +Icon=Remington Smisse.jpg +Deck Type=constructed +[main] +1 Ancestral Recall|LEA +1 Black Lotus|LEA +3 Blink of an Eye|DOM +1 Cruel Tutor|POR +1 Demonic Tutor|LEA +2 Diabolic Tutor|M14 +4 Dimir Spybug|GRN +4 Drowned Catacomb|XLN +4 Etrata, the Silencer|GRN +6 Island|DOM +2 Island|GRN +1 Mox Jet|LEA +1 Mox Sapphire|LEA +2 Murder|M19 +2 Negate|RIX +4 Nightveil Sprite|GRN +4 Sinister Sabotage|GRN +5 Swamp|DOM +2 Swamp|GRN +4 Thought Erasure|GRN +4 Thoughtbound Phantasm|GRN +1 Time Walk|LEA +1 Vampiric Tutor|VIS +[sideboard] From 483fdbee4d652349bbec02d06bad608257051bda Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 14 Nov 2018 08:27:54 +0300 Subject: [PATCH 163/901] - Some extra AI for Evra, Halcyon Witness. --- .../ai/ability/LifeExchangeVariantAi.java | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) 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 633dfadf4e7..33737a66224 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LifeExchangeVariantAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LifeExchangeVariantAi.java @@ -1,15 +1,14 @@ package forge.ai.ability; -import forge.ai.ComputerUtil; -import forge.ai.ComputerUtilAbility; -import forge.ai.ComputerUtilCombat; -import forge.ai.SpellAbilityAi; +import forge.ai.*; import forge.game.Game; import forge.game.card.Card; +import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; import forge.game.zone.MagicStack; +import forge.util.MyRandom; public class LifeExchangeVariantAi extends SpellAbilityAi { @@ -90,12 +89,12 @@ public class LifeExchangeVariantAi extends SpellAbilityAi { int aiLife = ai.getLife(); if (source.getNetPower() > aiLife) { - if (ComputerUtilCombat.lifeInSeriousDanger(ai, ai.getGame().getCombat())) { + if (ComputerUtilCombat.lifeInSeriousDanger(ai, game.getCombat())) { return true; } // check the top of stack - MagicStack stack = ai.getGame().getStack(); + MagicStack stack = game.getStack(); if (!stack.isEmpty()) { SpellAbility saTop = stack.peekAbility(); if (ComputerUtil.predictDamageFromSpell(saTop, ai) >= aiLife) { @@ -103,6 +102,25 @@ public class LifeExchangeVariantAi extends SpellAbilityAi { } } } + + if (game.getCombat() != null && game.getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS) + && game.getCombat().isAttacking(source) && source.getNetPower() > 0 + && source.getNetPower() < ai.getLife()) { + Player def = game.getCombat().getDefenderPlayerByAttacker(source); + if (game.getCombat().isUnblocked(source) && def.canLoseLife() && ai.getLife() >= def.getLife() && source.getNetPower() < def.getLife()) { + // Unblocked Evra which can deal lethal damage + return true; + } else if (ai.getLife() > source.getNetPower()) { + int dangerMin = (((PlayerControllerAi) ai.getController()).getAi().getIntProperty(AiProps.AI_IN_DANGER_THRESHOLD)); + int dangerMax = (((PlayerControllerAi) ai.getController()).getAi().getIntProperty(AiProps.AI_IN_DANGER_MAX_THRESHOLD)); + int dangerDiff = dangerMax - dangerMin; + int lifeInDanger = dangerDiff == 0 ? dangerMin : MyRandom.getRandom().nextInt(dangerDiff) + dangerMin; + if (source.getNetPower() >= lifeInDanger) { + // Blocked or unblocked Evra which will get bigger *and* we're getting our life back through Lifelink + return true; + } + } + } } return false; From b6fb5709446e44f8428fcf9cf12b834e17047d86 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 14 Nov 2018 08:49:21 +0300 Subject: [PATCH 164/901] - Some additional Evra logic. --- .../ai/ability/LifeExchangeVariantAi.java | 40 ++++++++++--------- 1 file changed, 22 insertions(+), 18 deletions(-) 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 33737a66224..38686d589df 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LifeExchangeVariantAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LifeExchangeVariantAi.java @@ -3,6 +3,7 @@ package forge.ai.ability; import forge.ai.*; import forge.game.Game; import forge.game.card.Card; +import forge.game.keyword.Keyword; import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.spellability.SpellAbility; @@ -88,6 +89,27 @@ public class LifeExchangeVariantAi extends SpellAbilityAi { int aiLife = ai.getLife(); + // Offensive use of Evra, try to kill the opponent or deal a lot of damage, and hopefully gain a lot of life too + if (game.getCombat() != null && game.getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS) + && game.getCombat().isAttacking(source) && source.getNetPower() > 0 + && source.getNetPower() < aiLife) { + Player def = game.getCombat().getDefenderPlayerByAttacker(source); + if (game.getCombat().isUnblocked(source) && def.canLoseLife() && aiLife >= def.getLife() && source.getNetPower() < def.getLife()) { + // Unblocked Evra which can deal lethal damage + return true; + } else if (ai.getController().isAI() && aiLife > source.getNetPower() && source.hasKeyword(Keyword.LIFELINK)) { + int dangerMin = (((PlayerControllerAi) ai.getController()).getAi().getIntProperty(AiProps.AI_IN_DANGER_THRESHOLD)); + int dangerMax = (((PlayerControllerAi) ai.getController()).getAi().getIntProperty(AiProps.AI_IN_DANGER_MAX_THRESHOLD)); + int dangerDiff = dangerMax - dangerMin; + int lifeInDanger = dangerDiff <= 0 ? dangerMin : MyRandom.getRandom().nextInt(dangerDiff) + dangerMin; + if (source.getNetPower() >= lifeInDanger && ComputerUtil.lifegainPositive(ai, source)) { + // Blocked or unblocked Evra which will get bigger *and* we're getting our life back through Lifelink + return true; + } + } + } + + // Defensive use of Evra, try to debuff Evra to try to gain some life if (source.getNetPower() > aiLife) { if (ComputerUtilCombat.lifeInSeriousDanger(ai, game.getCombat())) { return true; @@ -103,24 +125,6 @@ public class LifeExchangeVariantAi extends SpellAbilityAi { } } - if (game.getCombat() != null && game.getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS) - && game.getCombat().isAttacking(source) && source.getNetPower() > 0 - && source.getNetPower() < ai.getLife()) { - Player def = game.getCombat().getDefenderPlayerByAttacker(source); - if (game.getCombat().isUnblocked(source) && def.canLoseLife() && ai.getLife() >= def.getLife() && source.getNetPower() < def.getLife()) { - // Unblocked Evra which can deal lethal damage - return true; - } else if (ai.getLife() > source.getNetPower()) { - int dangerMin = (((PlayerControllerAi) ai.getController()).getAi().getIntProperty(AiProps.AI_IN_DANGER_THRESHOLD)); - int dangerMax = (((PlayerControllerAi) ai.getController()).getAi().getIntProperty(AiProps.AI_IN_DANGER_MAX_THRESHOLD)); - int dangerDiff = dangerMax - dangerMin; - int lifeInDanger = dangerDiff == 0 ? dangerMin : MyRandom.getRandom().nextInt(dangerDiff) + dangerMin; - if (source.getNetPower() >= lifeInDanger) { - // Blocked or unblocked Evra which will get bigger *and* we're getting our life back through Lifelink - return true; - } - } - } } return false; From cea32aa83b98914ac9328924f62e8f79dc3bf2ad Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 14 Nov 2018 14:54:21 +0300 Subject: [PATCH 165/901] - Some more Evra logic. --- .../java/forge/ai/ability/LifeExchangeVariantAi.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) 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 38686d589df..144e91ff726 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LifeExchangeVariantAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LifeExchangeVariantAi.java @@ -84,9 +84,6 @@ public class LifeExchangeVariantAi extends SpellAbilityAi { return shouldDo; } else if ("Evra, Halcyon Witness".equals(sourceName)) { - if (!ai.canGainLife()) - return false; - int aiLife = ai.getLife(); // Offensive use of Evra, try to kill the opponent or deal a lot of damage, and hopefully gain a lot of life too @@ -102,7 +99,7 @@ public class LifeExchangeVariantAi extends SpellAbilityAi { int dangerMax = (((PlayerControllerAi) ai.getController()).getAi().getIntProperty(AiProps.AI_IN_DANGER_MAX_THRESHOLD)); int dangerDiff = dangerMax - dangerMin; int lifeInDanger = dangerDiff <= 0 ? dangerMin : MyRandom.getRandom().nextInt(dangerDiff) + dangerMin; - if (source.getNetPower() >= lifeInDanger && ComputerUtil.lifegainPositive(ai, source)) { + if (source.getNetPower() >= lifeInDanger && ai.canGainLife() && ComputerUtil.lifegainPositive(ai, source)) { // Blocked or unblocked Evra which will get bigger *and* we're getting our life back through Lifelink return true; } @@ -111,6 +108,10 @@ public class LifeExchangeVariantAi extends SpellAbilityAi { // Defensive use of Evra, try to debuff Evra to try to gain some life if (source.getNetPower() > aiLife) { + // Only makes sense if the AI can actually gain life from this + if (!ai.canGainLife()) + return false; + if (ComputerUtilCombat.lifeInSeriousDanger(ai, game.getCombat())) { return true; } From f3912e4eb0ba18116a123873d3d68788c1464e01 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 14 Nov 2018 23:14:28 +0300 Subject: [PATCH 166/901] - Account for double damage coming from Mishra Vanguard avatar. --- forge-game/src/main/java/forge/game/card/Card.java | 2 +- forge-game/src/main/java/forge/game/player/Player.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 301d7432fca..93d6129031d 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -4666,7 +4666,7 @@ public class Card extends GameEntity implements Comparable { // TODO: improve such that this can be predicted from the replacement effect itself // (+ move this function out into ComputerUtilCombat?) for (Card c : getGame().getCardsIn(ZoneType.Command)) { - if (c.getName().equals("Insult Effect")) { + if (c.getName().equals("Insult Effect") || c.getName().equals("Mishra")) { if (c.getController().equals(source.getController())) { restDamage *= 2; } diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index ac1f65aff47..b31e58b8fa4 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -723,7 +723,7 @@ public class Player extends GameEntity implements Comparable { // TODO: improve such that this can be predicted from the replacement effect itself // (+ move this function out into ComputerUtilCombat?) for (Card c : game.getCardsIn(ZoneType.Command)) { - if (c.getName().equals("Insult Effect")) { + if (c.getName().equals("Insult Effect") || c.getName().equals("Mishra")) { if (c.getController().equals(source.getController())) { restDamage *= 2; } From e1b18857fe49a408f4755e266d121f5032cd843c Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 14 Nov 2018 23:16:52 +0300 Subject: [PATCH 167/901] - A better implementation for Mishra double damage AI count. --- forge-game/src/main/java/forge/game/card/Card.java | 6 +++++- forge-game/src/main/java/forge/game/player/Player.java | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 93d6129031d..f642fe8c117 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -4666,10 +4666,14 @@ public class Card extends GameEntity implements Comparable { // TODO: improve such that this can be predicted from the replacement effect itself // (+ move this function out into ComputerUtilCombat?) for (Card c : getGame().getCardsIn(ZoneType.Command)) { - if (c.getName().equals("Insult Effect") || c.getName().equals("Mishra")) { + if (c.getName().equals("Insult Effect")) { if (c.getController().equals(source.getController())) { restDamage *= 2; } + } else if (c.getName().equals("Mishra")) { + if (c.isCreature() && c.getController().equals(source.getController())) { + restDamage *= 2; + } } } diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index b31e58b8fa4..cd142b81516 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -723,10 +723,14 @@ public class Player extends GameEntity implements Comparable { // TODO: improve such that this can be predicted from the replacement effect itself // (+ move this function out into ComputerUtilCombat?) for (Card c : game.getCardsIn(ZoneType.Command)) { - if (c.getName().equals("Insult Effect") || c.getName().equals("Mishra")) { + if (c.getName().equals("Insult Effect")) { if (c.getController().equals(source.getController())) { restDamage *= 2; } + } else if (c.getName().equals("Mishra")) { + if (c.isCreature() && c.getController().equals(source.getController())) { + restDamage *= 2; + } } } From b3f66d2b64ef6a2682a46c87df379f94a8333826 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 15 Nov 2018 16:22:19 +0300 Subject: [PATCH 168/901] - Fixed the AI playing Tilonalli's Crown on 1-toughness creatures. --- .../main/java/forge/ai/ability/AttachAi.java | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index cdd19a65318..47c2c2a9257 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -905,6 +905,28 @@ public class AttachAi extends SpellAbilityAi { }); } + // Look for triggers that will damage the creature and remove AI-owned creatures that will die + CardCollection toRemove = new CardCollection(); + for (Trigger t : attachSource.getTriggers()) { + if (t.getMode() == TriggerType.ChangesZone) { + final Map params = t.getMapParams(); + if ("Card.Self".equals(params.get("ValidCard")) && "Battlefield".equals(params.get("Destination"))) { + SpellAbility trigSa = AbilityFactory.getAbility(attachSource.getSVar(params.get("Execute")), attachSource); + if (trigSa.getApi() == ApiType.DealDamage && "Enchanted".equals(trigSa.getParam("Defined"))) { + for (Card target : list) { + if (!target.getController().isOpponentOf(ai)) { + int numDmg = AbilityUtils.calculateAmount(target, trigSa.getParam("NumDmg"), trigSa); + if (target.getNetToughness() <= numDmg) { + toRemove.add(target); + } + } + } + } + } + } + } + list.removeAll(toRemove); + if (magnetList != null) { // Look for Heroic triggers @@ -921,7 +943,7 @@ public class AttachAi extends SpellAbilityAi { } } } - + if (!magnetList.isEmpty()) { // Always choose something from the Magnet List. // Probably want to "weight" the list by amount of Enchantments and From c98ad6a097f2613cffd925e8a0dd7ef0dca5806c Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 15 Nov 2018 17:16:01 +0300 Subject: [PATCH 169/901] - A simpler implementation for Tilonalli, using AITgts. --- .../main/java/forge/ai/ability/AttachAi.java | 26 +++---------------- .../res/cardsfolder/t/tilonallis_crown.txt | 2 +- 2 files changed, 5 insertions(+), 23 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index 47c2c2a9257..d248a4ca60d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -905,28 +905,6 @@ public class AttachAi extends SpellAbilityAi { }); } - // Look for triggers that will damage the creature and remove AI-owned creatures that will die - CardCollection toRemove = new CardCollection(); - for (Trigger t : attachSource.getTriggers()) { - if (t.getMode() == TriggerType.ChangesZone) { - final Map params = t.getMapParams(); - if ("Card.Self".equals(params.get("ValidCard")) && "Battlefield".equals(params.get("Destination"))) { - SpellAbility trigSa = AbilityFactory.getAbility(attachSource.getSVar(params.get("Execute")), attachSource); - if (trigSa.getApi() == ApiType.DealDamage && "Enchanted".equals(trigSa.getParam("Defined"))) { - for (Card target : list) { - if (!target.getController().isOpponentOf(ai)) { - int numDmg = AbilityUtils.calculateAmount(target, trigSa.getParam("NumDmg"), trigSa); - if (target.getNetToughness() <= numDmg) { - toRemove.add(target); - } - } - } - } - } - } - } - list.removeAll(toRemove); - if (magnetList != null) { // Look for Heroic triggers @@ -1014,6 +992,10 @@ public class AttachAi extends SpellAbilityAi { } CardCollection prefList = new CardCollection(list); + + // Filter AI-specific targets if provided + prefList = ComputerUtil.filterAITgts(sa, ai, (CardCollection)list, false); + if (totToughness < 0) { // Don't kill my own stuff with Negative toughness Auras final int tgh = totToughness; diff --git a/forge-gui/res/cardsfolder/t/tilonallis_crown.txt b/forge-gui/res/cardsfolder/t/tilonallis_crown.txt index 5e5c6c76579..602db178f0d 100644 --- a/forge-gui/res/cardsfolder/t/tilonallis_crown.txt +++ b/forge-gui/res/cardsfolder/t/tilonallis_crown.txt @@ -2,7 +2,7 @@ Name:Tilonalli's Crown ManaCost:1 R Types:Enchantment Aura K:Enchant creature -A:SP$ Attach | Cost$ 1 R | ValidTgts$ Creature | AILogic$ Pump +A:SP$ Attach | Cost$ 1 R | ValidTgts$ Creature | AILogic$ Pump | AITgts$ Creature.YouCtrl+toughnessGT1 T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 1 damage to enchanted creature. SVar:TrigDealDamage:DB$ DealDamage | Defined$ Enchanted | NumDmg$ 1 S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 3 | AddKeyword$ Trample | Description$ Enchanted creature gets +3/+0 and has trample. From 68d62b9eb81b0db7ea3e0087a1a9fd4381eb0c02 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 15 Nov 2018 17:59:00 +0300 Subject: [PATCH 170/901] - Account for effective toughness after damage for Tilonalli's Crown. --- forge-game/src/main/java/forge/game/card/CardProperty.java | 6 +++++- forge-gui/res/cardsfolder/t/tilonallis_crown.txt | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index d2be541192c..d0575e1e793 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -1395,7 +1395,8 @@ public class CardProperty { return false; } } else if (property.startsWith("power") || property.startsWith("toughness") - || property.startsWith("cmc") || property.startsWith("totalPT")) { + || property.startsWith("cmc") || property.startsWith("totalPT") + || property.startsWith("effectiveToughness")) { int x; int y = 0; String rhs = ""; @@ -1406,6 +1407,9 @@ public class CardProperty { } else if (property.startsWith("toughness")) { rhs = property.substring(11); y = card.getNetToughness(); + } else if (property.startsWith("effectiveToughness")) { + rhs = property.substring(20); + y = card.getNetToughness() - card.getDamage(); } else if (property.startsWith("cmc")) { rhs = property.substring(5); y = card.getCMC(); diff --git a/forge-gui/res/cardsfolder/t/tilonallis_crown.txt b/forge-gui/res/cardsfolder/t/tilonallis_crown.txt index 602db178f0d..6a30dbc3e03 100644 --- a/forge-gui/res/cardsfolder/t/tilonallis_crown.txt +++ b/forge-gui/res/cardsfolder/t/tilonallis_crown.txt @@ -2,7 +2,7 @@ Name:Tilonalli's Crown ManaCost:1 R Types:Enchantment Aura K:Enchant creature -A:SP$ Attach | Cost$ 1 R | ValidTgts$ Creature | AILogic$ Pump | AITgts$ Creature.YouCtrl+toughnessGT1 +A:SP$ Attach | Cost$ 1 R | ValidTgts$ Creature | AILogic$ Pump | AITgts$ Creature.YouCtrl+effectiveToughnessGT1 T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 1 damage to enchanted creature. SVar:TrigDealDamage:DB$ DealDamage | Defined$ Enchanted | NumDmg$ 1 S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 3 | AddKeyword$ Trample | Description$ Enchanted creature gets +3/+0 and has trample. From ea35e04ba87daf429a1b437f525c96ec3634039c Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 15 Nov 2018 18:48:30 +0300 Subject: [PATCH 171/901] - Back to the more complex yet comprehensive way of figuring out damage on attach, but keep AITgts in AttachAi, might come in handy later. --- .../main/java/forge/ai/ability/AttachAi.java | 22 +++++++++++++++++++ .../java/forge/game/card/CardProperty.java | 6 +---- .../res/cardsfolder/t/tilonallis_crown.txt | 2 +- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index d248a4ca60d..64de7d65a3d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -905,6 +905,28 @@ public class AttachAi extends SpellAbilityAi { }); } + // Look for triggers that will damage the creature and remove AI-owned creatures that will die + CardCollection toRemove = new CardCollection(); + for (Trigger t : attachSource.getTriggers()) { + if (t.getMode() == TriggerType.ChangesZone) { + final Map params = t.getMapParams(); + if ("Card.Self".equals(params.get("ValidCard")) && "Battlefield".equals(params.get("Destination")) && t.hasParam("Execute")) { + SpellAbility trigSa = AbilityFactory.getAbility(attachSource.getSVar(params.get("Execute")), attachSource); + if (trigSa.getApi() == ApiType.DealDamage && "Enchanted".equals(trigSa.getParam("Defined"))) { + for (Card target : list) { + if (!target.getController().isOpponentOf(ai)) { + int numDmg = AbilityUtils.calculateAmount(target, trigSa.getParam("NumDmg"), trigSa); + if (target.getNetToughness() - target.getDamage() <= numDmg && !target.hasKeyword(Keyword.INDESTRUCTIBLE)) { + toRemove.add(target); + } + } + } + } + } + } + } + list.removeAll(toRemove); + if (magnetList != null) { // Look for Heroic triggers diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index d0575e1e793..d2be541192c 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -1395,8 +1395,7 @@ public class CardProperty { return false; } } else if (property.startsWith("power") || property.startsWith("toughness") - || property.startsWith("cmc") || property.startsWith("totalPT") - || property.startsWith("effectiveToughness")) { + || property.startsWith("cmc") || property.startsWith("totalPT")) { int x; int y = 0; String rhs = ""; @@ -1407,9 +1406,6 @@ public class CardProperty { } else if (property.startsWith("toughness")) { rhs = property.substring(11); y = card.getNetToughness(); - } else if (property.startsWith("effectiveToughness")) { - rhs = property.substring(20); - y = card.getNetToughness() - card.getDamage(); } else if (property.startsWith("cmc")) { rhs = property.substring(5); y = card.getCMC(); diff --git a/forge-gui/res/cardsfolder/t/tilonallis_crown.txt b/forge-gui/res/cardsfolder/t/tilonallis_crown.txt index 6a30dbc3e03..5e5c6c76579 100644 --- a/forge-gui/res/cardsfolder/t/tilonallis_crown.txt +++ b/forge-gui/res/cardsfolder/t/tilonallis_crown.txt @@ -2,7 +2,7 @@ Name:Tilonalli's Crown ManaCost:1 R Types:Enchantment Aura K:Enchant creature -A:SP$ Attach | Cost$ 1 R | ValidTgts$ Creature | AILogic$ Pump | AITgts$ Creature.YouCtrl+effectiveToughnessGT1 +A:SP$ Attach | Cost$ 1 R | ValidTgts$ Creature | AILogic$ Pump T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 1 damage to enchanted creature. SVar:TrigDealDamage:DB$ DealDamage | Defined$ Enchanted | NumDmg$ 1 S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 3 | AddKeyword$ Trample | Description$ Enchanted creature gets +3/+0 and has trample. From c539f5d1a3b97112653efdb356b5d355cb6c3e00 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 15 Nov 2018 20:21:44 +0300 Subject: [PATCH 172/901] - Improved damage trigger detection in AttachAi. --- .../src/main/java/forge/ai/ability/AttachAi.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index 64de7d65a3d..0ffb370de21 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -910,9 +910,15 @@ public class AttachAi extends SpellAbilityAi { for (Trigger t : attachSource.getTriggers()) { if (t.getMode() == TriggerType.ChangesZone) { final Map params = t.getMapParams(); - if ("Card.Self".equals(params.get("ValidCard")) && "Battlefield".equals(params.get("Destination")) && t.hasParam("Execute")) { - SpellAbility trigSa = AbilityFactory.getAbility(attachSource.getSVar(params.get("Execute")), attachSource); - if (trigSa.getApi() == ApiType.DealDamage && "Enchanted".equals(trigSa.getParam("Defined"))) { + if ("Card.Self".equals(params.get("ValidCard")) + && "Battlefield".equals(params.get("Destination"))) { + SpellAbility trigSa = null; + if (t.hasParam("Execute") && attachSource.hasSVar(t.getParam("Execute"))) { + trigSa = AbilityFactory.getAbility(attachSource.getSVar(params.get("Execute")), attachSource); + } else if (t.getOverridingAbility() != null) { + trigSa = t.getOverridingAbility(); + } + if (trigSa != null && trigSa.getApi() == ApiType.DealDamage && "Enchanted".equals(trigSa.getParam("Defined"))) { for (Card target : list) { if (!target.getController().isOpponentOf(ai)) { int numDmg = AbilityUtils.calculateAmount(target, trigSa.getParam("NumDmg"), trigSa); From 83f8acd0c73ee6eeb6101e89b32677fdd24a0db3 Mon Sep 17 00:00:00 2001 From: Michael Kamensky Date: Fri, 16 Nov 2018 11:30:03 +0000 Subject: [PATCH 173/901] Revert "Merge branch 'add-mobile-art-download' into 'master'" This reverts merge request !1049 --- forge-gui-android/src/forge/app/Main.java | 10 --- .../src/main/java/forge/CachedCardImage.java | 7 +- .../src/main/java/forge/GuiDesktop.java | 12 ++-- .../src/main/java/forge}/ImageFetcher.java | 70 +++++++++++++++---- .../main/java/forge/gui/CardPicturePanel.java | 5 +- .../java/forge/util/SwingImageFetcher.java | 57 --------------- forge-gui-ios/src/forge/ios/Main.java | 9 --- forge-gui-mobile-dev/src/forge/app/Main.java | 11 +-- .../src/forge/CachedCardImage.java | 40 ----------- forge-gui-mobile/src/forge/GuiMobile.java | 12 ++-- .../src/forge/card/CardRenderer.java | 46 ++---------- .../forge/screens/settings/SettingsPage.java | 4 -- .../src/forge/util/LibGDXImageFetcher.java | 62 ---------------- .../java/forge/interfaces/IDeviceAdapter.java | 5 -- .../main/java/forge/interfaces/IGuiBase.java | 2 - 15 files changed, 75 insertions(+), 277 deletions(-) rename {forge-gui/src/main/java/forge/util => forge-gui-desktop/src/main/java/forge}/ImageFetcher.java (67%) delete mode 100644 forge-gui-desktop/src/main/java/forge/util/SwingImageFetcher.java delete mode 100644 forge-gui-mobile/src/forge/CachedCardImage.java delete mode 100644 forge-gui-mobile/src/forge/util/LibGDXImageFetcher.java diff --git a/forge-gui-android/src/forge/app/Main.java b/forge-gui-android/src/forge/app/Main.java index bf4c73e0e4f..c235fb01ef2 100644 --- a/forge-gui-android/src/forge/app/Main.java +++ b/forge-gui-android/src/forge/app/Main.java @@ -9,8 +9,6 @@ import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.res.Configuration; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; @@ -30,8 +28,6 @@ import forge.util.FileUtil; import forge.util.ThreadUtil; import java.io.File; -import java.io.InputStream; -import java.io.OutputStream; import java.util.concurrent.Callable; public class Main extends AndroidApplication { @@ -247,11 +243,5 @@ public class Main extends AndroidApplication { } }); } - - @Override - public void convertToJPEG(InputStream input, OutputStream output) { - Bitmap bmp = BitmapFactory.decodeStream(input); - bmp.compress(Bitmap.CompressFormat.JPEG, 100, output); - } } } diff --git a/forge-gui-desktop/src/main/java/forge/CachedCardImage.java b/forge-gui-desktop/src/main/java/forge/CachedCardImage.java index 67c57a1d1bd..8a34907f3d2 100644 --- a/forge-gui-desktop/src/main/java/forge/CachedCardImage.java +++ b/forge-gui-desktop/src/main/java/forge/CachedCardImage.java @@ -4,9 +4,6 @@ import java.awt.image.BufferedImage; import forge.game.card.CardView; import forge.game.player.PlayerView; -import forge.util.ImageFetcher; -import forge.util.SwingImageFetcher; - public abstract class CachedCardImage implements ImageFetcher.Callback { final CardView card; @@ -14,8 +11,6 @@ public abstract class CachedCardImage implements ImageFetcher.Callback { final int width; final int height; - static final SwingImageFetcher fetcher = new SwingImageFetcher(); - public CachedCardImage(final CardView card, final Iterable viewers, final int width, final int height) { this.card = card; this.viewers = viewers; @@ -24,7 +19,7 @@ public abstract class CachedCardImage implements ImageFetcher.Callback { BufferedImage image = ImageCache.getImageNoDefault(card, viewers, width, height); if (image == null) { String key = card.getCurrentState().getImageKey(viewers); - fetcher.fetchImage(key, this); + ImageFetcher.fetchImage(card, key, this); } } diff --git a/forge-gui-desktop/src/main/java/forge/GuiDesktop.java b/forge-gui-desktop/src/main/java/forge/GuiDesktop.java index ae3bc960403..6e4e7f7385a 100644 --- a/forge-gui-desktop/src/main/java/forge/GuiDesktop.java +++ b/forge-gui-desktop/src/main/java/forge/GuiDesktop.java @@ -23,7 +23,10 @@ import forge.sound.*; import forge.toolbox.FOptionPane; import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinImage; -import forge.util.*; +import forge.util.BuildInfo; +import forge.util.Callback; +import forge.util.FileUtil; +import forge.util.OperatingSystem; import org.apache.commons.lang3.StringUtils; import javax.swing.*; @@ -39,8 +42,6 @@ import java.util.Collection; import java.util.List; public class GuiDesktop implements IGuiBase { - private ImageFetcher imageFetcher = new SwingImageFetcher(); - @Override public boolean isRunningOnDesktop() { return true; @@ -62,11 +63,6 @@ public class GuiDesktop implements IGuiBase { "../forge-gui/" : ""; } - @Override - public ImageFetcher getImageFetcher() { - return imageFetcher; - } - @Override public void invokeInEdtNow(final Runnable proc) { proc.run(); diff --git a/forge-gui/src/main/java/forge/util/ImageFetcher.java b/forge-gui-desktop/src/main/java/forge/ImageFetcher.java similarity index 67% rename from forge-gui/src/main/java/forge/util/ImageFetcher.java rename to forge-gui-desktop/src/main/java/forge/ImageFetcher.java index 9ab7a134387..6b0d878b721 100644 --- a/forge-gui/src/main/java/forge/util/ImageFetcher.java +++ b/forge-gui-desktop/src/main/java/forge/ImageFetcher.java @@ -1,28 +1,34 @@ -package forge.util; +package forge; +import java.awt.image.BufferedImage; import java.io.File; +import java.io.IOException; +import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import forge.FThreads; -import forge.ImageKeys; -import forge.StaticData; +import javax.imageio.ImageIO; +import javax.swing.SwingUtilities; + import org.apache.commons.lang3.tuple.Pair; +import forge.game.card.CardView; import forge.item.PaperCard; import forge.model.FModel; import forge.properties.ForgeConstants; import forge.properties.ForgePreferences; +import forge.util.FileUtil; +import forge.util.ImageUtil; -public abstract class ImageFetcher { +public class ImageFetcher { private static final ExecutorService threadPool = Executors.newCachedThreadPool(); - private HashMap> currentFetches = new HashMap<>(); - private HashMap tokenImages; + private static HashMap> currentFetches = new HashMap<>(); + private static HashMap tokenImages; - public void fetchImage(final String imageKey, final Callback callback) { + public static void fetchImage(final CardView card, final String imageKey, final Callback callback) { FThreads.assertExecutedByEdt(true); if (!FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_ENABLE_ONLINE_IMAGE_FETCHER)) @@ -113,12 +119,50 @@ public abstract class ImageFetcher { currentFetches.remove(destPath); } }; - threadPool.submit(getDownloadTask(downloadUrls.toArray(new String[0]), destPath, notifyObservers)); + threadPool.submit(new DownloadTask(downloadUrls.toArray(new String[0]), destPath, notifyObservers)); } - - protected abstract Runnable getDownloadTask(String[] toArray, String destPath, Runnable notifyObservers); - + public static interface Callback { public void onImageFetched(); } -} \ No newline at end of file + + private static class DownloadTask implements Runnable { + private final String[] downloadUrls; + private final String destPath; + private final Runnable notifyObservers; + + public DownloadTask(String[] downloadUrls, String destPath, Runnable notifyObservers) { + this.downloadUrls = downloadUrls; + this.destPath = destPath; + this.notifyObservers = notifyObservers; + } + + private void doFetch(String urlToDownload) throws IOException { + URL url = new URL(urlToDownload); + System.out.println("Attempting to fetch: " + url); + java.net.URLConnection c = url.openConnection(); + c.setRequestProperty("User-Agent", ""); + BufferedImage image = ImageIO.read(c.getInputStream()); + // First, save to a temporary file so that nothing tries to read + // a partial download. + File destFile = new File(destPath + ".tmp"); + destFile.mkdirs(); + ImageIO.write(image, "jpg", destFile); + // Now, rename it to the correct name. + destFile.renameTo(new File(destPath)); + System.out.println("Saved image to " + destPath); + SwingUtilities.invokeLater(notifyObservers); + } + + public void run() { + for (String urlToDownload : downloadUrls) { + try { + doFetch(urlToDownload); + break; + } catch (IOException e) { + System.out.println("Failed to download card [" + destPath + "] image: " + e.getMessage()); + } + } + } + } + } \ No newline at end of file diff --git a/forge-gui-desktop/src/main/java/forge/gui/CardPicturePanel.java b/forge-gui-desktop/src/main/java/forge/gui/CardPicturePanel.java index 17cf49e6e0a..17b1d5ae1d7 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/CardPicturePanel.java +++ b/forge-gui-desktop/src/main/java/forge/gui/CardPicturePanel.java @@ -24,9 +24,8 @@ import java.awt.image.WritableRaster; import javax.swing.JPanel; -import forge.GuiBase; import forge.ImageCache; -import forge.util.ImageFetcher; +import forge.ImageFetcher; import forge.ImageKeys; import forge.game.card.CardView.CardStateView; import forge.item.InventoryItem; @@ -116,7 +115,7 @@ public final class CardPicturePanel extends JPanel implements ImageFetcher.Callb CardStateView card = (CardStateView) displayed; BufferedImage image = ImageCache.getOriginalImage(card.getImageKey(), false); if (image == null) { - GuiBase.getInterface().getImageFetcher().fetchImage(card.getImageKey(), this); + ImageFetcher.fetchImage(card.getCard(), card.getImageKey(), this); } return FImageUtil.getImage((CardStateView) displayed); } diff --git a/forge-gui-desktop/src/main/java/forge/util/SwingImageFetcher.java b/forge-gui-desktop/src/main/java/forge/util/SwingImageFetcher.java deleted file mode 100644 index 7949a3e1f10..00000000000 --- a/forge-gui-desktop/src/main/java/forge/util/SwingImageFetcher.java +++ /dev/null @@ -1,57 +0,0 @@ -package forge.util; - -import javax.imageio.ImageIO; -import javax.swing.*; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import java.net.URL; - -public class SwingImageFetcher extends ImageFetcher { - - @Override - protected Runnable getDownloadTask(String[] downloadUrls, String destPath, Runnable notifyObservers) { - return new SwingDownloadTask(downloadUrls, destPath, notifyObservers); - } - - private static class SwingDownloadTask implements Runnable { - private final String[] downloadUrls; - private final String destPath; - private final Runnable notifyObservers; - - public SwingDownloadTask(String[] downloadUrls, String destPath, Runnable notifyObservers) { - this.downloadUrls = downloadUrls; - this.destPath = destPath; - this.notifyObservers = notifyObservers; - } - - private void doFetch(String urlToDownload) throws IOException { - URL url = new URL(urlToDownload); - System.out.println("Attempting to fetch: " + url); - java.net.URLConnection c = url.openConnection(); - c.setRequestProperty("User-Agent", ""); - BufferedImage image = ImageIO.read(c.getInputStream()); - // First, save to a temporary file so that nothing tries to read - // a partial download. - File destFile = new File(destPath + ".tmp"); - destFile.mkdirs(); - ImageIO.write(image, "jpg", destFile); - // Now, rename it to the correct name. - destFile.renameTo(new File(destPath)); - System.out.println("Saved image to " + destPath); - SwingUtilities.invokeLater(notifyObservers); - } - - public void run() { - for (String urlToDownload : downloadUrls) { - try { - doFetch(urlToDownload); - break; - } catch (IOException e) { - System.out.println("Failed to download card [" + destPath + "] image: " + e.getMessage()); - } - } - } - } - -} diff --git a/forge-gui-ios/src/forge/ios/Main.java b/forge-gui-ios/src/forge/ios/Main.java index bad9865e574..cd1f569eca0 100644 --- a/forge-gui-ios/src/forge/ios/Main.java +++ b/forge-gui-ios/src/forge/ios/Main.java @@ -13,10 +13,6 @@ import org.robovm.apple.foundation.NSAutoreleasePool; import org.robovm.apple.uikit.UIApplication; import org.robovm.apple.uikit.UIPasteboard; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - public class Main extends IOSApplication.Delegate { @Override @@ -98,10 +94,5 @@ public class Main extends IOSApplication.Delegate { public void exit() { // Not possible on iOS } - - @Override - public void convertToJPEG(InputStream input, OutputStream output) throws IOException { - - } } } \ No newline at end of file diff --git a/forge-gui-mobile-dev/src/forge/app/Main.java b/forge-gui-mobile-dev/src/forge/app/Main.java index d5a932cefda..85c0ed08db0 100644 --- a/forge-gui-mobile-dev/src/forge/app/Main.java +++ b/forge-gui-mobile-dev/src/forge/app/Main.java @@ -13,10 +13,9 @@ import forge.util.RestartUtil; import forge.util.Utils; import org.apache.commons.cli.*; -import javax.imageio.ImageIO; import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.*; +import java.io.File; +import java.io.IOException; public class Main { public static void main(String[] args) { @@ -163,11 +162,5 @@ public class Main { public void preventSystemSleep(boolean preventSleep) { OperatingSystem.preventSystemSleep(preventSleep); } - - @Override - public void convertToJPEG(InputStream input, OutputStream output) throws IOException { - BufferedImage image = ImageIO.read(input); - ImageIO.write(image, "jpg", output); - } } } diff --git a/forge-gui-mobile/src/forge/CachedCardImage.java b/forge-gui-mobile/src/forge/CachedCardImage.java deleted file mode 100644 index bb468f27e44..00000000000 --- a/forge-gui-mobile/src/forge/CachedCardImage.java +++ /dev/null @@ -1,40 +0,0 @@ -package forge; - -import com.badlogic.gdx.graphics.Texture; -import forge.assets.ImageCache; -import forge.game.card.CardView; -import forge.item.InventoryItem; -import forge.util.ImageFetcher; - -public abstract class CachedCardImage implements ImageFetcher.Callback { - protected final String key; - static final ImageFetcher fetcher = GuiBase.getInterface().getImageFetcher(); - - public CachedCardImage(final CardView card) { - key = card.getCurrentState().getImageKey(); - fetch(); - } - - public CachedCardImage(final InventoryItem ii) { - key = ii.getImageKey(false); - fetch(); - } - - public CachedCardImage(String key) { - this.key = key; - fetch(); - } - - public void fetch() { - Texture image = ImageCache.getImage(key, false); - if (image == null) { - fetcher.fetchImage(key, this); - } - } - - public Texture getImage() { - return ImageCache.getImage(key, true); - } - - public abstract void onImageFetched(); -} diff --git a/forge-gui-mobile/src/forge/GuiMobile.java b/forge-gui-mobile/src/forge/GuiMobile.java index 8cea9560f78..0d5bb9e1552 100644 --- a/forge-gui-mobile/src/forge/GuiMobile.java +++ b/forge-gui-mobile/src/forge/GuiMobile.java @@ -37,11 +37,14 @@ import forge.sound.IAudioClip; import forge.sound.IAudioMusic; import forge.toolbox.FOptionPane; import forge.toolbox.GuiChoose; -import forge.util.*; +import forge.util.Callback; +import forge.util.FileUtil; +import forge.util.ThreadUtil; +import forge.util.WaitCallback; +import forge.util.WaitRunnable; public class GuiMobile implements IGuiBase { private final String assetsDir; - private ImageFetcher imageFetcher = new LibGDXImageFetcher(); public GuiMobile(final String assetsDir0) { assetsDir = assetsDir0; @@ -67,11 +70,6 @@ public class GuiMobile implements IGuiBase { return assetsDir; } - @Override - public ImageFetcher getImageFetcher() { - return imageFetcher; - } - @Override public void invokeInEdtNow(final Runnable proc) { proc.run(); diff --git a/forge-gui-mobile/src/forge/card/CardRenderer.java b/forge-gui-mobile/src/forge/card/CardRenderer.java index c39781e0503..cc82751f248 100644 --- a/forge-gui-mobile/src/forge/card/CardRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardRenderer.java @@ -15,7 +15,6 @@ import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator; import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator.FreeTypeFontParameter; import com.badlogic.gdx.graphics.glutils.PixmapTextureData; import com.badlogic.gdx.utils.Array; -import forge.CachedCardImage; import forge.FThreads; import forge.Graphics; import forge.StaticData; @@ -29,7 +28,6 @@ import forge.game.card.CardView.CardStateView; import forge.game.keyword.Keyword; import forge.game.card.CounterType; import forge.item.IPaperCard; -import forge.item.InventoryItem; import forge.item.PaperCard; import forge.model.FModel; import forge.properties.ForgeConstants; @@ -53,34 +51,6 @@ public class CardRenderer { BehindVert } - // class that simplifies the callback logic of CachedCardImage - static class RendererCachedCardImage extends CachedCardImage { - boolean clearCardArtCache = false; - - public RendererCachedCardImage(CardView card, boolean clearArtCache) { - super(card); - this.clearCardArtCache = clearArtCache; - } - - public RendererCachedCardImage(InventoryItem ii, boolean clearArtCache) { - super(ii); - this.clearCardArtCache = clearArtCache; - } - - public RendererCachedCardImage(String key, boolean clearArtCache) { - super(key); - this.clearCardArtCache = clearArtCache; - } - - @Override - public void onImageFetched() { - ImageCache.clear(); - if (clearCardArtCache) { - cardArtCache.remove(key); - } - } - } - private static final FSkinFont NAME_FONT = FSkinFont.get(16); public static final float NAME_BOX_TINT = 0.2f; public static final float TEXT_BOX_TINT = 0.1f; @@ -154,7 +124,7 @@ public class CardRenderer { public static FImageComplex getCardArt(String imageKey, boolean isSplitCard, boolean isHorizontalCard, boolean isAftermathCard) { FImageComplex cardArt = cardArtCache.get(imageKey); if (cardArt == null) { - Texture image = new RendererCachedCardImage(imageKey, true).getImage(); + Texture image = ImageCache.getImage(imageKey, true); if (image != null) { if (image == ImageCache.defaultImage) { cardArt = CardImageRenderer.forgeArt; @@ -216,13 +186,7 @@ public class CardRenderer { public static FImageComplex getAftermathSecondCardArt(String imageKey) { FImageComplex cardArt = cardArtCache.get("Aftermath_second_"+imageKey); if (cardArt == null) { - Texture image = new CachedCardImage(imageKey) { - @Override - public void onImageFetched() { - ImageCache.clear(); - cardArtCache.remove("Aftermath_second_" + imageKey); - } - }.getImage(); + Texture image = ImageCache.getImage(imageKey, true); if (image != null) { if (image == ImageCache.defaultImage) { cardArt = CardImageRenderer.forgeArt; @@ -383,8 +347,7 @@ public class CardRenderer { } public static void drawCard(Graphics g, IPaperCard pc, float x, float y, float w, float h, CardStackPosition pos) { - Texture image = new RendererCachedCardImage(pc, false).getImage(); - + Texture image = ImageCache.getImage(pc); if (image != null) { if (image == ImageCache.defaultImage) { CardImageRenderer.drawCardImage(g, CardView.getCardForUi(pc), false, x, y, w, h, pos); @@ -406,8 +369,7 @@ public class CardRenderer { } public static void drawCard(Graphics g, CardView card, float x, float y, float w, float h, CardStackPosition pos, boolean rotate) { - Texture image = new RendererCachedCardImage(card, false).getImage();; - + Texture image = ImageCache.getImage(card); if (image != null) { if (image == ImageCache.defaultImage) { CardImageRenderer.drawCardImage(g, card, false, x, y, w, h, pos); diff --git a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java index 36c95917843..375e7d94b84 100644 --- a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java +++ b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java @@ -204,10 +204,6 @@ public class SettingsPage extends TabPage { "If turned on, Forge will load all historic format definitions, this may take slightly longer to load at startup."), 3); //Graphic Options - lstSettings.addItem(new BooleanSetting(FPref.UI_ENABLE_ONLINE_IMAGE_FETCHER, - "Download missing card art", - "Automatically download missing card art"), - 4); lstSettings.addItem(new BooleanSetting(FPref.UI_OVERLAY_FOIL_EFFECT, "Display Foil Overlay", "Displays foil cards with the visual foil overlay effect."), diff --git a/forge-gui-mobile/src/forge/util/LibGDXImageFetcher.java b/forge-gui-mobile/src/forge/util/LibGDXImageFetcher.java deleted file mode 100644 index 6e8bc3f7ca5..00000000000 --- a/forge-gui-mobile/src/forge/util/LibGDXImageFetcher.java +++ /dev/null @@ -1,62 +0,0 @@ -package forge.util; - -import com.badlogic.gdx.files.FileHandle; -import forge.Forge; -import forge.GuiBase; - -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; - -public class LibGDXImageFetcher extends ImageFetcher { - @Override - protected Runnable getDownloadTask(String[] downloadUrls, String destPath, Runnable notifyObservers) { - return new LibGDXDownloadTask(downloadUrls, destPath, notifyObservers); - } - - private static class LibGDXDownloadTask implements Runnable { - private final String[] downloadUrls; - private final String destPath; - private final Runnable notifyObservers; - - LibGDXDownloadTask(String[] downloadUrls, String destPath, Runnable notifyObservers) { - this.downloadUrls = downloadUrls; - this.destPath = destPath; - this.notifyObservers = notifyObservers; - } - - private void doFetch(String urlToDownload) throws IOException { - URL url = new URL(urlToDownload); - System.out.println("Attempting to fetch: " + url); - java.net.URLConnection c = url.openConnection(); - c.setRequestProperty("User-Agent", ""); - - InputStream is = c.getInputStream(); - // First, save to a temporary file so that nothing tries to read - // a partial download. - FileHandle destFile = new FileHandle(destPath + ".tmp"); - System.out.println(destPath); - destFile.parent().mkdirs(); - - // Conversion to JPEG will be handled differently depending on the platform - Forge.getDeviceAdapter().convertToJPEG(is, new FileOutputStream(destFile.file())); - destFile.moveTo(new FileHandle(destPath)); - - System.out.println("Saved image to " + destPath); - GuiBase.getInterface().invokeInEdtLater(notifyObservers); - } - - public void run() { - for (String urlToDownload : downloadUrls) { - try { - doFetch(urlToDownload); - break; - } catch (IOException e) { - System.out.println("Failed to download card [" + destPath + "] image: " + e.getMessage()); - } - } - } - } - -} diff --git a/forge-gui/src/main/java/forge/interfaces/IDeviceAdapter.java b/forge-gui/src/main/java/forge/interfaces/IDeviceAdapter.java index 06361f28bc7..41e00408465 100644 --- a/forge-gui/src/main/java/forge/interfaces/IDeviceAdapter.java +++ b/forge-gui/src/main/java/forge/interfaces/IDeviceAdapter.java @@ -1,9 +1,5 @@ package forge.interfaces; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - public interface IDeviceAdapter { boolean isConnectedToInternet(); boolean isConnectedToWifi(); @@ -14,5 +10,4 @@ public interface IDeviceAdapter { void preventSystemSleep(boolean preventSleep); void restart(); void exit(); - void convertToJPEG(InputStream input, OutputStream output) throws IOException; } diff --git a/forge-gui/src/main/java/forge/interfaces/IGuiBase.java b/forge-gui/src/main/java/forge/interfaces/IGuiBase.java index 21802b2717d..15f23f41fe2 100644 --- a/forge-gui/src/main/java/forge/interfaces/IGuiBase.java +++ b/forge-gui/src/main/java/forge/interfaces/IGuiBase.java @@ -16,14 +16,12 @@ import forge.match.HostedMatch; import forge.sound.IAudioClip; import forge.sound.IAudioMusic; import forge.util.Callback; -import forge.util.ImageFetcher; public interface IGuiBase { boolean isRunningOnDesktop(); boolean isLibgdxPort(); String getCurrentVersion(); String getAssetsDir(); - ImageFetcher getImageFetcher(); void invokeInEdtNow(Runnable runnable); void invokeInEdtLater(Runnable runnable); void invokeInEdtAndWait(Runnable proc); From 7114563027031f1598f36072e320a91305ea4479 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 16 Nov 2018 14:34:44 +0300 Subject: [PATCH 174/901] - Preparing Forge for Android publish 1.6.18.002 [hotfix]. --- 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 59af086adca..c8834d7c089 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -6,7 +6,7 @@ jar -Xms1024m -Xmx1536m - 1.6.18.001 + 1.6.18.002 keystore alias storepass diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index 99bcee63d28..9f5623f5726 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -6,7 +6,7 @@ jar -Xms128m -Xmx2048m - 1.6.18.001 + 1.6.18.002 diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index 8594c5a919a..0702ddb3e42 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.18.001"; + public static final String CURRENT_VERSION = "1.6.18.002"; private static final ApplicationListener app = new Forge(); private static Clipboard clipboard; From 7adb8201c693b62b3b734836dad42b6caca8447e Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 17 Nov 2018 09:23:40 +0300 Subject: [PATCH 175/901] - Simple logic for Enhanced Surveillance. Fix description. --- forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java | 3 +++ forge-gui/res/cardsfolder/e/enhanced_surveillance.txt | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java index 84f81600df8..87f87ccf8a8 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java @@ -220,6 +220,9 @@ public class ChangeZoneAllAi extends SpellAbilityAi { } else { return false; } + } else if (destination.equals(ZoneType.Library) && "Card.YouOwn".equals(sa.getParam("ChangeType"))) { + return (ai.getCardsIn(ZoneType.Graveyard).size() > ai.getCardsIn(ZoneType.Library).size()) + && !ComputerUtil.isPlayingReanimator(ai); } } else if (origin.equals(ZoneType.Exile)) { String logic = sa.getParam("AILogic"); diff --git a/forge-gui/res/cardsfolder/e/enhanced_surveillance.txt b/forge-gui/res/cardsfolder/e/enhanced_surveillance.txt index e1f2f07462c..fbb9d00b425 100644 --- a/forge-gui/res/cardsfolder/e/enhanced_surveillance.txt +++ b/forge-gui/res/cardsfolder/e/enhanced_surveillance.txt @@ -1,9 +1,9 @@ Name:Enhanced Surveillance ManaCost:1 U Types:Enchantment -R:Event$ Surveil | ActiveZones$ Battlefield | ValidPlayer$ You | ReplaceWith$ AddTwoMore | Description$ You may look at an additional two cards each you surveil. +R:Event$ Surveil | ActiveZones$ Battlefield | ValidPlayer$ You | ReplaceWith$ AddTwoMore | Description$ You may look at an additional two cards each time you surveil. SVar:AddTwoMore:DB$ ReplaceEffect | VarName$ SurveilNum | VarValue$ X | References$ X SVar:X:ReplaceCount$SurveilNum/Plus.2 A:AB$ ChangeZoneAll | Cost$ Exile<1/CARDNAME> | ChangeType$ Card.YouOwn | Origin$ Graveyard | Destination$ Library | Shuffle$ True | SpellDescription$ Shuffle your graveyard into your library. DeckNeeds:Ability$Surveil -Oracle:You may look at an additional two cards each you surveil.\nExile Enhanced Surveillance: Shuffle your graveyard into your library. +Oracle:You may look at an additional two cards each time you surveil.\nExile Enhanced Surveillance: Shuffle your graveyard into your library. From d277ba04200b24efcb0bb438afa2c8ab459940e9 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 17 Nov 2018 09:40:54 +0300 Subject: [PATCH 176/901] - Added puzzle PS_GRN6. --- forge-gui/res/puzzle/PS_GRN6.pzl | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 forge-gui/res/puzzle/PS_GRN6.pzl diff --git a/forge-gui/res/puzzle/PS_GRN6.pzl b/forge-gui/res/puzzle/PS_GRN6.pzl new file mode 100644 index 00000000000..b4da1658c06 --- /dev/null +++ b/forge-gui/res/puzzle/PS_GRN6.pzl @@ -0,0 +1,17 @@ +[metadata] +Name:Possibility Storm - Guilds of Ravnica #06 +URL:https://i1.wp.com/www.possibilitystorm.com/wp-content/uploads/2018/11/088.-GRN6.jpg +Goal:Win +Turns:1 +Difficulty:Uncommon +Description:Win this turn. Assume any cards that could be drawn are irrelevant to the puzzle. +[state] +humanlife=20 +ailife=3 +turn=1 +activeplayer=human +activephase=MAIN1 +humanhand=Arcane Flight;Huatli, Warrior Poet;Disperse;Curious Obsession;Sea Legs +humanlibrary=Fog;Fog;Fog;Fog;Fog;Fog;Fog;Fog;Fog;Fog;Fog;Fog;Fog;Fog;Fog;Fog;Fog;Fog;Fog;Fog +humanbattlefield=Surge Mare|Id:5;Helm of the Host|Attaching:5;Valduk, Keeper of the Flame;Divine Visitation;Steam Vents|NoETBTrigs;Steam Vents|NoETBTrigs;Steam Vents|NoETBTrigs;Glacial Fortress;Glacial Fortress;t:Angel,P:4,T:4,Cost:no cost,Color:W,Types:Creature-Angel,Keywords:Flying-Vigilance,Image:w_4_4_angel_flying_vigilance_grn +aibattlefield=Murmuring Mystic;t:Bird Illusion,P:1,T:1,Cost:no cost,Color:U,Types:Creature-Bird-Illusion,Keywords:Flying,Image:u_1_1_bird_illusion_flying_grn;t:Bird Illusion,P:1,T:1,Cost:no cost,Color:U,Types:Creature-Bird-Illusion,Keywords:Flying,Image:u_1_1_bird_illusion_flying_grn;t:Bird Illusion,P:1,T:1,Cost:no cost,Color:U,Types:Creature-Bird-Illusion,Keywords:Flying,Image:u_1_1_bird_illusion_flying_grn;t:Bird Illusion,P:1,T:1,Cost:no cost,Color:U,Types:Creature-Bird-Illusion,Keywords:Flying,Image:u_1_1_bird_illusion_flying_grn;t:Bird Illusion,P:1,T:1,Cost:no cost,Color:U,Types:Creature-Bird-Illusion,Keywords:Flying,Image:u_1_1_bird_illusion_flying_grn;Dreamcaller Siren From 8b566c0bbbdaf6734032e9654c19f1a3421c80b5 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 17 Nov 2018 10:08:11 +0300 Subject: [PATCH 177/901] - Dev mode: added a way to add a card to top of the library instead of the bottom. - Fixed a bug that caused the zone index not to be accounted for during changeZone (not sure how many things were affected by this, but it prevented putting a card on top of the library via moveToLibrary). --- .../src/main/java/forge/game/zone/Zone.java | 2 +- .../forge/player/PlayerControllerHuman.java | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/forge-game/src/main/java/forge/game/zone/Zone.java b/forge-game/src/main/java/forge/game/zone/Zone.java index 6e887369fd2..35f9f785410 100644 --- a/forge-game/src/main/java/forge/game/zone/Zone.java +++ b/forge-game/src/main/java/forge/game/zone/Zone.java @@ -77,7 +77,7 @@ public class Zone implements java.io.Serializable, Iterable { } public final void add(final Card c, final Integer index) { - add(c, null, null); + add(c, index, null); } public void add(final Card c, final Integer index, final Card latestState) { diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 4f12d185493..ad37ec775f2 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -1937,6 +1937,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont private SpellAbility lastAddedSA; private boolean lastTrigs; private boolean lastSummoningSickness; + private boolean lastTopOfTheLibrary; private DevModeCheats() { } @@ -2347,9 +2348,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont game.getAction().invoke(new Runnable() { @Override public void run() { - if (targetZone != ZoneType.Battlefield) { - game.getAction().moveTo(targetZone, forgeCard, null); - } else { + if (targetZone == ZoneType.Battlefield) { if (noTriggers) { if (forgeCard.isPermanent() && !forgeCard.isAura()) { if (forgeCard.isCreature()) { @@ -2405,6 +2404,18 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont // playSa could fire some triggers game.getStack().addAllTriggeredAbilitiesToStack(); } + } else if (targetZone == ZoneType.Library) { + if (!repeatLast) { + lastTopOfTheLibrary = getGui().confirm(forgeCard.getView(), + TextUtil.concatWithSpace("Should", forgeCard.toString(), "be added to the top or to the bottom of the library?"), true, Arrays.asList("Top", "Bottom")); + } + if (lastTopOfTheLibrary) { + game.getAction().moveToLibrary(forgeCard, null, null); + } else { + game.getAction().moveToBottomOfLibrary(forgeCard, null, null); + } + } else { + game.getAction().moveTo(targetZone, forgeCard, null); } lastAdded = f; From 81d3425b03386499cced521c5d8671d7819acf22 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 17 Nov 2018 18:42:20 +0300 Subject: [PATCH 178/901] - Activate Millstone at the end of opponent's turn. --- forge-gui/res/cardsfolder/m/millstone.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/m/millstone.txt b/forge-gui/res/cardsfolder/m/millstone.txt index e833b4937f1..3962621617f 100644 --- a/forge-gui/res/cardsfolder/m/millstone.txt +++ b/forge-gui/res/cardsfolder/m/millstone.txt @@ -1,6 +1,6 @@ Name:Millstone ManaCost:2 Types:Artifact -A:AB$ Mill | Cost$ 2 T | NumCards$ 2 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player puts the top two cards of their library into their graveyard. +A:AB$ Mill | Cost$ 2 T | NumCards$ 2 | ValidTgts$ Player | TgtPrompt$ Choose a player | AILogic$ EndOfOppTurn | SpellDescription$ Target player puts the top two cards of their library into their graveyard. SVar:Picture:http://www.wizards.com/global/images/magic/general/millstone.jpg Oracle:{2}, {T}: Target player puts the top two cards of their library into their graveyard. From 726976f3f6b391acc65b1d33d7ad8e7b44fcb6d7 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 18 Nov 2018 12:51:46 +0300 Subject: [PATCH 179/901] - Fix the AI logic for predicting creatures that are dead to stack (needed to exclude the originating SA). - Optimize the logic for predicting playability of spells: check whether an ability can be paid for before running the full canPlay loop, may benefit performance especially on mobile systems. --- forge-ai/src/main/java/forge/ai/AiController.java | 10 +++++----- forge-ai/src/main/java/forge/ai/ComputerUtil.java | 11 ++++++----- .../src/main/java/forge/ai/ability/DamageDealAi.java | 2 +- .../src/main/java/forge/ai/ability/DestroyAi.java | 4 ++-- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 26e7989eb70..2982df30668 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -670,15 +670,15 @@ public class AiController { // This is for playing spells regularly (no Cascade/Ripple etc.) private AiPlayDecision canPlayAndPayFor(final SpellAbility sa) { + if (!ComputerUtilCost.canPayCost(sa, player)) { + return AiPlayDecision.CantAfford; + } + if (!sa.canPlay()) { return AiPlayDecision.CantPlaySa; } - AiPlayDecision op = canPlaySa(sa); - if (op != AiPlayDecision.WillPlay) { - return op; - } - return ComputerUtilCost.canPayCost(sa, player) ? AiPlayDecision.WillPlay : AiPlayDecision.CantAfford; + return canPlaySa(sa); } public AiPlayDecision canPlaySa(SpellAbility sa) { diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index 35656ae808e..8c085c493d9 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -1780,7 +1780,7 @@ public class ComputerUtil { * A creature to check * @return true if the creature dies according to current board position. */ - public static boolean predictCreatureWillDieThisTurn(final Player ai, final Card creature) { + public static boolean predictCreatureWillDieThisTurn(final Player ai, final Card creature, final SpellAbility excludeSa) { final Game game = creature.getGame(); // a creature will die as a result of combat @@ -1795,13 +1795,14 @@ public class ComputerUtil { // See if permission is on stack and ignore this check if there is and the relevant AI flag is set // TODO: improve this so that this flag is not needed and the AI can properly evaluate spells in presence of counterspells. for (SpellAbilityStackInstance si : game.getStack()) { - if (si.getSpellAbility(false).getApi() == ApiType.Counter) { + SpellAbility sa = si.getSpellAbility(false); + if (sa.getApi() == ApiType.Counter) { noStackCheck = true; break; } } } - willDieFromSpell = !noStackCheck && ComputerUtil.predictThreatenedObjects(creature.getController(), null).contains(creature); + willDieFromSpell = !noStackCheck && ComputerUtil.predictThreatenedObjects(creature.getController(), excludeSa).contains(creature); return willDieInCombat || willDieFromSpell; } @@ -1817,14 +1818,14 @@ public class ComputerUtil { * The list of cards to work with * @return a filtered list with no dying creatures in it */ - public static CardCollection filterCreaturesThatWillDieThisTurn(final Player ai, final CardCollection list) { + public static CardCollection filterCreaturesThatWillDieThisTurn(final Player ai, final CardCollection list, final SpellAbility excludeSa) { AiController aic = ((PlayerControllerAi)ai.getController()).getAi(); if (aic.getBooleanProperty(AiProps.AVOID_TARGETING_CREATS_THAT_WILL_DIE)) { // Try to avoid targeting creatures that are dead on board List willBeKilled = CardLists.filter(list, new Predicate() { @Override public boolean apply(Card card) { - return card.isCreature() && ComputerUtil.predictCreatureWillDieThisTurn(ai, card); + return card.isCreature() && ComputerUtil.predictCreatureWillDieThisTurn(ai, card, excludeSa); } }); list.removeAll(willBeKilled); 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 a1502c80c20..a895415755c 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -289,7 +289,7 @@ public class DamageDealAi extends DamageAiBase { killables = ComputerUtil.filterAITgts(sa, ai, killables, true); // Try not to target anything which will already be dead by the time the spell resolves - killables = ComputerUtil.filterCreaturesThatWillDieThisTurn(ai, killables); + killables = ComputerUtil.filterCreaturesThatWillDieThisTurn(ai, killables, sa); Card targetCard = null; if (pl.isOpponentOf(ai) && activator.equals(ai) && !killables.isEmpty()) { 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 40d3aaf4138..731d9279677 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java @@ -179,7 +179,7 @@ public class DestroyAi extends SpellAbilityAi { } // Try to avoid targeting creatures that are dead on board - list = ComputerUtil.filterCreaturesThatWillDieThisTurn(ai, list); + list = ComputerUtil.filterCreaturesThatWillDieThisTurn(ai, list, sa); if (list.isEmpty()) { return false; } @@ -316,7 +316,7 @@ public class DestroyAi extends SpellAbilityAi { list = CardLists.getValidCards(list, tgt.getValidTgts(), source.getController(), source, sa); // Try to avoid targeting creatures that are dead on board - list = ComputerUtil.filterCreaturesThatWillDieThisTurn(ai, list); + list = ComputerUtil.filterCreaturesThatWillDieThisTurn(ai, list, sa); if (list.isEmpty() || list.size() < tgt.getMinTargets(sa.getHostCard(), sa)) { return false; From eb93999c44562335853db65a3ca70fb955f7c4be Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 18 Nov 2018 13:30:45 +0300 Subject: [PATCH 180/901] - Improve the way the AI uses Retrofitter Foundry. --- forge-gui/res/cardsfolder/r/retrofitter_foundry.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/res/cardsfolder/r/retrofitter_foundry.txt b/forge-gui/res/cardsfolder/r/retrofitter_foundry.txt index ab8c2122ce4..2320f1c6f1b 100644 --- a/forge-gui/res/cardsfolder/r/retrofitter_foundry.txt +++ b/forge-gui/res/cardsfolder/r/retrofitter_foundry.txt @@ -6,4 +6,5 @@ A:AB$ Token | Cost$ 2 T | TokenAmount$ 1 | TokenName$ Servo | TokenTypes$ Artifa A:AB$ Token | Cost$ 1 T Sac<1/Servo> | TokenAmount$ 1 | TokenName$ Thopter | TokenTypes$ Artifact,Creature,Thopter | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | TokenImage$ c 1 1 thopter c18 | SpellDescription$ Create a 1/1 colorless Thopter artifact creature token with flying. DeckHas:Ability$Token A:AB$ Token | Cost$ T Sac<1/Thopter> | TokenAmount$ 1 | TokenName$ Construct | TokenTypes$ Artifact,Creature,Construct | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 4 | TokenToughness$ 4 | TokenImage$ c 4 4 construct c18 | SpellDescription$ Create a 4/4 colorless Construct artifact creature token. +SVar:AIPreference:SacCost$Creature.token Oracle:{3}: Untap Retrofitter Foundry.\n{2}, {T}: Create a 1/1 colorless Servo artifact creature token.\n{1}, {T}, Sacrifice a Servo: Create a 1/1 colorless Thopter artifact creature token with flying.\n{T}, Sacrifice a Thopter: Create a 4/4 colorless Construct artifact creature token. From f941208175b37fbfdef0aedfdf42fd82876c3626 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 18 Nov 2018 16:49:17 +0300 Subject: [PATCH 181/901] - Added and fixed some AI flags. --- forge-gui/res/cardsfolder/f/fungal_plots.txt | 1 + forge-gui/res/cardsfolder/h/harrow.txt | 1 + forge-gui/res/cardsfolder/s/stronghold_biologist.txt | 2 +- forge-gui/res/cardsfolder/t/talon_gates.txt | 2 +- forge-gui/res/cardsfolder/t/thallid_omnivore.txt | 3 ++- forge-gui/res/cardsfolder/w/worm_harvest.txt | 2 ++ 6 files changed, 8 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/f/fungal_plots.txt b/forge-gui/res/cardsfolder/f/fungal_plots.txt index 6a7dbd776cc..4d10311ee28 100644 --- a/forge-gui/res/cardsfolder/f/fungal_plots.txt +++ b/forge-gui/res/cardsfolder/f/fungal_plots.txt @@ -4,6 +4,7 @@ Types:Enchantment A:AB$ Token | Cost$ 1 G ExileFromGrave<1/Creature> | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | TokenImage$ g 1 1 saproling DOM | SpellDescription$ Create a 1/1 green Saproling creature token. A:AB$ GainLife | Cost$ Sac<2/Saproling> | Defined$ You | LifeAmount$ 2 | SubAbility$ DBDraw | SpellDescription$ Gain 2 life and draw a card. SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 +SVar:AIPreference:ExileFromGraveCost$Creature.cmcGE1+inZoneGraveyard AI:RemoveDeck:Random DeckHas:Ability$Token Oracle:{1}{G}, Exile a creature card from your graveyard: Create a 1/1 green Saproling creature token.\nSacrifice two Saprolings: Gain 2 life and draw a card. diff --git a/forge-gui/res/cardsfolder/h/harrow.txt b/forge-gui/res/cardsfolder/h/harrow.txt index 5c76bf0952b..395eb29d121 100644 --- a/forge-gui/res/cardsfolder/h/harrow.txt +++ b/forge-gui/res/cardsfolder/h/harrow.txt @@ -2,5 +2,6 @@ Name:Harrow ManaCost:2 G Types:Instant A:SP$ ChangeZone | Cost$ 2 G Sac<1/Land> | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | ChangeNum$ 2 | SpellDescription$ Search your library for up to two basic land cards, put them onto the battlefield, then shuffle your library. +SVar:AIPreference:SacCost$Land.Basic SVar:Picture:http://www.wizards.com/global/images/magic/general/harrow.jpg Oracle:As an additional cost to cast Harrow, sacrifice a land.\nSearch your library for up to two basic land cards, put them onto the battlefield, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/s/stronghold_biologist.txt b/forge-gui/res/cardsfolder/s/stronghold_biologist.txt index a5901d5f633..0eddf0ba434 100644 --- a/forge-gui/res/cardsfolder/s/stronghold_biologist.txt +++ b/forge-gui/res/cardsfolder/s/stronghold_biologist.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Creature Human Spellshaper PT:1/1 A:AB$ Counter | Cost$ U U T Discard<1/Card> | AILogic$ MinCMC.4 | TargetType$ Spell | TgtPrompt$ Select target Creature spell | ValidTgts$ Card.Creature | SpellDescription$ Counter target creature spell. -SVar:AIPreference:DiscardCost$Card.cmcEQ0,Card.cmcEQ1,DiscardCost$Card.cmcEQ1,DiscardCost$Card.cmcEQ2,DiscardCost$Card.cmcEQ3 +SVar:AIPreference:DiscardCost$Card.cmcEQ0,Card.cmcEQ1,Card.cmcEQ2,Card.cmcEQ3 SVar:Picture:http://www.wizards.com/global/images/magic/general/stronghold_biologist.jpg Oracle:{U}{U}, {T}, Discard a card: Counter target creature spell. diff --git a/forge-gui/res/cardsfolder/t/talon_gates.txt b/forge-gui/res/cardsfolder/t/talon_gates.txt index 875329dc692..d4fd0d828cf 100644 --- a/forge-gui/res/cardsfolder/t/talon_gates.txt +++ b/forge-gui/res/cardsfolder/t/talon_gates.txt @@ -10,5 +10,5 @@ SVar:GateX:Remembered$CardManaCost T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, remove two time counters from each suspended card you own. SVar:RolledChaos:DB$ RemoveCounterAll | ValidCards$ Card.suspended+YouOwn | CounterType$ TIME | CounterNum$ 2 | ValidZone$ Exile SVar:Picture:http://www.wizards.com/global/images/magic/general/talon_gates.jpg -SVar:AIRollPlanarDieParams:Mode$ Always +SVar:AIRollPlanarDieParams:Mode$ Always | RollInMain1$ True | MaxRollsPerTurn$ 9 Oracle:Any time you could cast a sorcery, you may exile a nonland card from your hand with X time counters on it, where X is its converted mana cost. If the exiled card doesn't have suspend, it gains suspend. (At the beginning of its owner's upkeep, they remove a time counter. When the last is removed, the player casts it without paying its mana cost. If it's a creature, it has haste.)\nWhenever you roll {CHAOS}, remove two time counters from each suspended card you own. diff --git a/forge-gui/res/cardsfolder/t/thallid_omnivore.txt b/forge-gui/res/cardsfolder/t/thallid_omnivore.txt index c40645fb8ab..9eafc091c02 100644 --- a/forge-gui/res/cardsfolder/t/thallid_omnivore.txt +++ b/forge-gui/res/cardsfolder/t/thallid_omnivore.txt @@ -2,7 +2,8 @@ Name:Thallid Omnivore ManaCost:3 B Types:Creature Fungus PT:3/3 -A:AB$ Pump | Cost$ 1 Sac<1/Creature.Other/another creature> | NumAtt$ +2 | NumDef$ +2 | SubAbility$ DBGainLife | SpellDescription$ CARDNAME gets +2/+2 until end of turn. If a Saproling was sacrificed this way, you gain 2 life. +A:AB$ Pump | Cost$ 1 Sac<1/Creature.Other/another creature> | NumAtt$ +2 | NumDef$ +2 | AILogic$ Aristocrat | SubAbility$ DBGainLife | SpellDescription$ CARDNAME gets +2/+2 until end of turn. If a Saproling was sacrificed this way, you gain 2 life. SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 | ConditionDefined$ Sacrificed | ConditionPresent$ Card.Saproling | ConditionCompare$ GE1 +SVar:AIPreference:SacCost$Creature.Other DeckHints:Type$Saproling Oracle:{1}, Sacrifice another creature: Thallid Omnivore gets +2/+2 until end of turn. If a Saproling was sacrificed this way, you gain 2 life. diff --git a/forge-gui/res/cardsfolder/w/worm_harvest.txt b/forge-gui/res/cardsfolder/w/worm_harvest.txt index 3dfdcbc2e42..71021cdfad8 100644 --- a/forge-gui/res/cardsfolder/w/worm_harvest.txt +++ b/forge-gui/res/cardsfolder/w/worm_harvest.txt @@ -4,5 +4,7 @@ Types:Sorcery K:Retrace A:SP$ Token | Cost$ 2 BG BG BG | TokenAmount$ X | References$ X | TokenName$ Worm | TokenTypes$ Creature,Worm | TokenOwner$ You | TokenColors$ Black,Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Create a 1/1 black and green Worm creature token for each land card in your graveyard. SVar:X:Count$TypeInYourYard.Land +SVar:NeedsToPlayVar:Z GE2 +SVar:Z:Count$ValidGraveyard Land.YouOwn SVar:Picture:http://magiccards.info/scans/en/eve/131.jpg Oracle:Create a 1/1 black and green Worm creature token for each land card in your graveyard.\nRetrace (You may cast this card from your graveyard by discarding a land card in addition to paying its other costs.) From beb1a9a15cc184f72c058fa9468dd0554f6bed0b Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 18 Nov 2018 16:50:51 +0300 Subject: [PATCH 182/901] - One more AI flag clarification. --- forge-gui/res/cardsfolder/t/thallid_omnivore.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/t/thallid_omnivore.txt b/forge-gui/res/cardsfolder/t/thallid_omnivore.txt index 9eafc091c02..3ac9cdc36b1 100644 --- a/forge-gui/res/cardsfolder/t/thallid_omnivore.txt +++ b/forge-gui/res/cardsfolder/t/thallid_omnivore.txt @@ -4,6 +4,6 @@ Types:Creature Fungus PT:3/3 A:AB$ Pump | Cost$ 1 Sac<1/Creature.Other/another creature> | NumAtt$ +2 | NumDef$ +2 | AILogic$ Aristocrat | SubAbility$ DBGainLife | SpellDescription$ CARDNAME gets +2/+2 until end of turn. If a Saproling was sacrificed this way, you gain 2 life. SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 | ConditionDefined$ Sacrificed | ConditionPresent$ Card.Saproling | ConditionCompare$ GE1 -SVar:AIPreference:SacCost$Creature.Other +SVar:AIPreference:SacCost$Creature.Saproling,Creature.Other DeckHints:Type$Saproling Oracle:{1}, Sacrifice another creature: Thallid Omnivore gets +2/+2 until end of turn. If a Saproling was sacrificed this way, you gain 2 life. From 5f079b3d49e35516c3a31593264147277f34791a Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 18 Nov 2018 22:42:54 +0300 Subject: [PATCH 183/901] - AttachAi: do not play the second copy of a legendary enchantment. --- forge-ai/src/main/java/forge/ai/ability/AttachAi.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index 0ffb370de21..03631d86ce2 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -56,6 +56,11 @@ public class AttachAi extends SpellAbilityAi { } } + if (source.getType().isLegendary() && ai.isCardInPlay(source.getName())) { + // Don't play the second copy of a legendary enchantment already in play + return false; + } + if (ai.getGame().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS) && !"Curse".equals(sa.getParam("AILogic"))) { return false; From c7f6d8b37a46422f33fc7e914a18f58fe2f49f66 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 19 Nov 2018 06:36:02 +0300 Subject: [PATCH 184/901] - Added a Legendary Rule check. --- forge-ai/src/main/java/forge/ai/ability/AttachAi.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index 03631d86ce2..3ff51f33d7d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -4,6 +4,7 @@ import com.google.common.base.Predicate; import com.google.common.base.Predicates; import forge.ai.*; import forge.game.GameObject; +import forge.game.GlobalRuleChange; import forge.game.ability.AbilityFactory; import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; @@ -56,8 +57,13 @@ public class AttachAi extends SpellAbilityAi { } } - if (source.getType().isLegendary() && ai.isCardInPlay(source.getName())) { + if (!ai.getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noLegendRule) + && source.getType().isLegendary() + && ai.isCardInPlay(source.getName())) { // Don't play the second copy of a legendary enchantment already in play + + // TODO: Add some extra checks for where the AI may want to cast a replacement aura + // on another creature and keep it when the original enchanted creature is useless return false; } From 1042329a4b0998004cca099d6e4e27bb596d47c3 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 19 Nov 2018 09:33:36 +0300 Subject: [PATCH 185/901] - Added several AI SacCost hints. --- forge-gui/res/cardsfolder/g/goblin_barrage.txt | 1 + forge-gui/res/cardsfolder/g/goblin_trashmaster.txt | 1 + forge-gui/res/cardsfolder/s/siege_gang_commander.txt | 1 + 3 files changed, 3 insertions(+) diff --git a/forge-gui/res/cardsfolder/g/goblin_barrage.txt b/forge-gui/res/cardsfolder/g/goblin_barrage.txt index 169df15e9b6..401b36ce6e5 100644 --- a/forge-gui/res/cardsfolder/g/goblin_barrage.txt +++ b/forge-gui/res/cardsfolder/g/goblin_barrage.txt @@ -5,5 +5,6 @@ K:Kicker:Sac<1/Artifact;Goblin/artifact or Goblin> A:SP$ DealDamage | Cost$ 3 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 4 | SubAbility$ DBDealDamage | SpellDescription$ CARDNAME deals 4 damage to target creature. If this spell was kicked, it also deals 4 damage to target player or planeswalker. SVar:DBDealDamage:DB$ DealDamage | Condition$ Kicked | ValidTgts$ Player,Planeswalker | NumDmg$ 4 | TargetMin$ X | TargetMax$ X | References$ X | TgtPrompt$ Select target player or planeswalker SVar:X:Count$Kicked.1.0 +SVar:AIPreference:SacCost$Creature.Goblin+token,Creature.Goblin+cmcLE1,Artifact.token,Artifact.cmcEQ1 DeckHints:Type$Goblin|Artifact Oracle:Kicker—Sacrifice an artifact or Goblin. (You may sacrifice an artifact or Goblin in addition to any other costs as you cast this spell.)\nGoblin Barrage deals 4 damage to target creature. If this spell was kicked, it also deals 4 damage to target player or planeswalker. diff --git a/forge-gui/res/cardsfolder/g/goblin_trashmaster.txt b/forge-gui/res/cardsfolder/g/goblin_trashmaster.txt index b60fb5c7842..bb040f413fe 100644 --- a/forge-gui/res/cardsfolder/g/goblin_trashmaster.txt +++ b/forge-gui/res/cardsfolder/g/goblin_trashmaster.txt @@ -3,6 +3,7 @@ ManaCost:2 R R Types:Creature Goblin Warrior S:Mode$ Continuous | AffectedZone$ Battlefield | Affected$ Goblin.Other+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Other Goblins you control get +1/+1. A:AB$ Destroy | Cost$ Sac<1/Goblin> | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy target artifact. +SVar:AIPreference:SacCost$Creature.Goblin+token,Creature.Goblin+cmcLE1 DeckHints:Type$Goblin Oracle:Other Goblins you control get +1/+1.\nSacrifice a Goblin: Destroy target artifact. PT:3/3 \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/siege_gang_commander.txt b/forge-gui/res/cardsfolder/s/siege_gang_commander.txt index f121db4a83e..b3c4332e266 100644 --- a/forge-gui/res/cardsfolder/s/siege_gang_commander.txt +++ b/forge-gui/res/cardsfolder/s/siege_gang_commander.txt @@ -5,6 +5,7 @@ PT:2/2 A:AB$ DealDamage | Cost$ 1 R Sac<1/Goblin> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to any target. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create three 1/1 red Goblin creature tokens. SVar:TrigToken:DB$ Token | TokenAmount$ 3 | TokenName$ Goblin | TokenTypes$ Creature,Goblin | TokenOwner$ You | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 | TokenImage$ r 1 1 goblin 10E +SVar:AIPreference:SacCost$Creature.Goblin+token,Creature.Goblin+cmcLE1 DeckHas:Ability$Token DeckHints:Type$Goblin SVar:Picture:http://www.wizards.com/global/images/magic/general/siege_gang_commander.jpg From 1f70ef7286eb3805517c96358eb949144f870c84 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 19 Nov 2018 20:36:08 +0300 Subject: [PATCH 186/901] - Squee: don't return to Command zone, easier to recast from the grave. --- forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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 7d7a60528fc..839481ced71 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -1733,7 +1733,12 @@ public class ChangeZoneAi extends SpellAbilityAi { Map originalParams = (Map)sa.getReplacingObject("OriginalParams"); SpellAbility causeSa = (SpellAbility)originalParams.get("Cause"); SpellAbility causeSub = null; - + + // Squee, the Immortal: easier to recast it (the call below has to be "contains" since SA is an intrinsic effect) + if (sa.getHostCard().getName().contains("Squee, the Immortal")) { + return false; + } + if (causeSa != null && (causeSub = causeSa.getSubAbility()) != null) { ApiType subApi = causeSub.getApi(); From a5aa83837d278fa7f014faf17c51089210f355a3 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 20 Nov 2018 08:15:23 +0300 Subject: [PATCH 187/901] - Added puzzle PS_GRN7. - Fixed effect cards lingering in the command zone across Setup Game State calls from the dev mode menu. --- forge-ai/src/main/java/forge/ai/GameState.java | 6 ++++++ forge-game/src/main/java/forge/game/zone/Zone.java | 13 +++++++++++++ 2 files changed, 19 insertions(+) diff --git a/forge-ai/src/main/java/forge/ai/GameState.java b/forge-ai/src/main/java/forge/ai/GameState.java index 10fee4a5847..522281d6884 100644 --- a/forge-ai/src/main/java/forge/ai/GameState.java +++ b/forge-ai/src/main/java/forge/ai/GameState.java @@ -1004,6 +1004,12 @@ public abstract class GameState { private void setupPlayerState(int life, Map cardTexts, final Player p, final int landsPlayed, final int landsPlayedLastTurn) { // Lock check static as we setup player state + // Clear all zones first, this ensures that any lingering cards and effects (e.g. in command zone) get cleared up + // before setting up a new state + for (ZoneType zt : ZONES.keySet()) { + p.getZone(zt).removeAllCards(true); + } + Map playerCards = new EnumMap(ZoneType.class); for (Entry kv : cardTexts.entrySet()) { String value = kv.getValue(); diff --git a/forge-game/src/main/java/forge/game/zone/Zone.java b/forge-game/src/main/java/forge/game/zone/Zone.java index 35f9f785410..229efd04468 100644 --- a/forge-game/src/main/java/forge/game/zone/Zone.java +++ b/forge-game/src/main/java/forge/game/zone/Zone.java @@ -141,6 +141,19 @@ public class Zone implements java.io.Serializable, Iterable { game.fireEvent(new GameEventZone(zoneType, getPlayer(), EventValueChangeType.ComplexUpdate, null)); } + public final void removeAllCards(boolean forcedWithoutEvents) { + if (forcedWithoutEvents) { + cardList.clear(); + } else { + for (Card c : cardList) { + if (cardList.remove(c)) { + onChanged(); + game.fireEvent(new GameEventZone(zoneType, getPlayer(), EventValueChangeType.Removed, c)); + } + } + } + } + public final boolean is(final ZoneType zone) { return zone == zoneType; } From fff1cfb737b277008a30387b6e091789c464a08b Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 20 Nov 2018 08:17:00 +0300 Subject: [PATCH 188/901] - Actually add PS_GRN7. --- forge-gui/res/puzzle/PS_GRN7.pzl | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 forge-gui/res/puzzle/PS_GRN7.pzl diff --git a/forge-gui/res/puzzle/PS_GRN7.pzl b/forge-gui/res/puzzle/PS_GRN7.pzl new file mode 100644 index 00000000000..6c98741ecbc --- /dev/null +++ b/forge-gui/res/puzzle/PS_GRN7.pzl @@ -0,0 +1,18 @@ +[metadata] +Name:Possibility Storm - Guilds of Ravnica #07 +URL:http://www.possibilitystorm.com/wp-content/uploads/2018/11/089.-GRN7.jpg +Goal:Win +Turns:1 +Difficulty:Rare +Description:Win this turn. Remember that your answer must satisfy all possible blocking scenarios. Assume the top three cards of your opponent's library are all basic Forests. Titanic Growth and Prying Blade are exiled with your Thief of Sanity. +[state] +humanlife=20 +ailife=14 +turn=1 +activeplayer=human +activephase=MAIN1 +humanhand=Urza's Ruinous Blast;The Eldest Reborn;Demonic Vigor;Switcheroo +humanbattlefield=Thief of Sanity|Id:1|RememberedCards:2,3|ExecuteScript:DBEffect;Etrata, the Silencer;Steadfast Armasaur;Goring Ceratops;Watery Grave|NoETBTrigs;Watery Grave|NoETBTrigs;Watery Grave|NoETBTrigs;Glacial Fortress;Glacial Fortress;Glacial Fortress;Glacial Fortress +ailibrary=Forest;Forest;Forest +aibattlefield=Kraul Harpooner;Primordial Wurm;Trostani Discordant +aiexile=Titanic Growth|Id:2|ExiledWith:1|FaceDown;Prying Blade|Id:3|ExiledWith:1|FaceDown From 957e73304e32bbf1ab0bdc50f808956aebb6107b Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 20 Nov 2018 09:51:25 +0300 Subject: [PATCH 189/901] - A somewhat better logic for Chandra, Bold Pyromancer + ability so the AI doesn't restrict itself in its use. --- forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java | 2 ++ forge-gui/res/cardsfolder/c/chandra_bold_pyromancer.txt | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java b/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java index 12292b4e44e..7b4c27a77a5 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java @@ -31,6 +31,8 @@ public class ManaEffectAi extends SpellAbilityAi { protected boolean checkAiLogic(Player ai, SpellAbility sa, String aiLogic) { if ("ManaRitual".equals(aiLogic)) { return doManaRitualLogic(ai, sa); + } else if ("Always".equals(aiLogic)) { + return true; } return super.checkAiLogic(ai, sa, aiLogic); } diff --git a/forge-gui/res/cardsfolder/c/chandra_bold_pyromancer.txt b/forge-gui/res/cardsfolder/c/chandra_bold_pyromancer.txt index 0e30ca4febc..26fa5b2a709 100644 --- a/forge-gui/res/cardsfolder/c/chandra_bold_pyromancer.txt +++ b/forge-gui/res/cardsfolder/c/chandra_bold_pyromancer.txt @@ -2,7 +2,7 @@ Name:Chandra, Bold Pyromancer ManaCost:4 R R Types:Legendary Planeswalker Chandra Loyalty:5 -A:AB$ Mana | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | Produced$ R | Amount$ 2 | AILogic$ ManaRitual | SubAbility$ DBDealDamage | SpellDescription$ Add {R}{R}. CARDNAME deals 2 damage to target player. +A:AB$ Mana | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | Produced$ R | Amount$ 2 | AILogic$ Always | SubAbility$ DBDealDamage | SpellDescription$ Add {R}{R}. CARDNAME deals 2 damage to target player. SVar:DBDealDamage:DB$ DealDamage | ValidTgts$ Player | TgtPrompt$ Select target player | NumDmg$ 2 A:AB$ DealDamage | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target creature or planeswalker. A:AB$ DamageAll | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | NumDmg$ 10 | ValidTgts$ Player | TgtPrompt$ Select a player | ValidCards$ Creature,Planeswalker | ValidPlayers$ Targeted | ValidDescription$ target player and each creature and planeswalker they control. | SpellDescription$ CARDNAME deals 10 damage to target player and each creature and planeswalker they control. From 06663d8bc98bdd48e311d1139caa7d33dd5a3417 Mon Sep 17 00:00:00 2001 From: Sol Date: Wed, 21 Nov 2018 03:08:00 +0000 Subject: [PATCH 190/901] Update QuestUtilCards.java --- forge-gui/src/main/java/forge/quest/QuestUtilCards.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/src/main/java/forge/quest/QuestUtilCards.java b/forge-gui/src/main/java/forge/quest/QuestUtilCards.java index 54a4887ba8a..c6198dd18e9 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtilCards.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtilCards.java @@ -309,7 +309,7 @@ public final class QuestUtilCards { */ public void setupNewGameCardPool(final GameFormat formatStartingPool, final int idxDifficulty, final StartingPoolPreferences userPrefs) { //Add additional cards to the starter card pool based on variant if applicable - double variantModifier = 0; + double variantModifier = 1; switch(FModel.getQuest().getDeckConstructionRules()){ case Default: break; case Commander: variantModifier = 2; break; From 2f88b45d67a23ceee644b6b6b61b9743e35e94e2 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 21 Nov 2018 09:25:34 +0300 Subject: [PATCH 191/901] - Added several AI hints. --- forge-gui/res/cardsfolder/b/bone_dragon.txt | 1 + forge-gui/res/cardsfolder/d/demon_of_catastrophes.txt | 1 + forge-gui/res/cardsfolder/g/graveyard_marshal.txt | 1 + 3 files changed, 3 insertions(+) diff --git a/forge-gui/res/cardsfolder/b/bone_dragon.txt b/forge-gui/res/cardsfolder/b/bone_dragon.txt index 93d8f97398c..7ad562f5189 100644 --- a/forge-gui/res/cardsfolder/b/bone_dragon.txt +++ b/forge-gui/res/cardsfolder/b/bone_dragon.txt @@ -4,4 +4,5 @@ Types:Creature Dragon Skeleton PT:5/4 K:Flying A:AB$ ChangeZone | Cost$ 3 B B ExileFromGrave<7/Other> | Origin$ Graveyard | Destination$ Battlefield | ActivationZone$ Graveyard | SpellDescription$ Return CARDNAME from your graveyard to the battlefield. +SVar:AIPreference:ExileFromGraveCost$Land.Basic,Land,Card Oracle:Flying\n{3}{B}{B}, Exile 7 other cards from your graveyard: Return CARDNAME from your graveyard to the battlefield. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/d/demon_of_catastrophes.txt b/forge-gui/res/cardsfolder/d/demon_of_catastrophes.txt index 6430b6d7601..585b2035e2f 100644 --- a/forge-gui/res/cardsfolder/d/demon_of_catastrophes.txt +++ b/forge-gui/res/cardsfolder/d/demon_of_catastrophes.txt @@ -5,4 +5,5 @@ PT:6/6 K:Flying K:Trample A:SP$ PermanentCreature | Cost$ 2 B B Sac<1/Creature> +SVar:AIPreference:SacCost$Creature.token,Creature.cmcLE4 Oracle:As an additional cost to cast this spell, sacrifice a creature\n Flying, trample \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/g/graveyard_marshal.txt b/forge-gui/res/cardsfolder/g/graveyard_marshal.txt index b32f827d3cb..c35559839f2 100644 --- a/forge-gui/res/cardsfolder/g/graveyard_marshal.txt +++ b/forge-gui/res/cardsfolder/g/graveyard_marshal.txt @@ -3,5 +3,6 @@ ManaCost:B B Types:Creature Zombie Soldier PT:3/2 A:AB$ Token | Cost$ 2 B ExileFromGrave<1/Creature> | TokenAmount$ 1 | TokenName$ Zombie | TokenTypes$ Creature,Zombie | TokenOwner$ You | TokenColors$ Black | TokenPower$ 2 | TokenToughness$ 2 | TokenImage$ b 2 2 zombie M10 | TokenTapped$ True | SpellDescription$ Exile target creature card from your graveyard: Create a 2/2 black Zombie creature token. +SVar:AIPreference:ExileFromGraveCost$Creature.cmcLE1+inZoneGraveyard DeckHas:Ability$Token Oracle:{2}{B}, Exile target creature card from your graveyard: Create a tapped 2/2 black Zombie creature token. \ No newline at end of file From 94b3ff01954d793016ebfc63204f0047af214c4c Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 21 Nov 2018 11:03:05 +0300 Subject: [PATCH 192/901] - Added edition file for Guilds of Ravnica Guild Kit. - Updated the edition creator tool to use MTGJSONv4. --- .../editions/Guilds of Ravnica Guild Kit.txt | 150 ++++++++++++++++++ forge-gui/tools/editionCreator.py | 10 +- 2 files changed, 155 insertions(+), 5 deletions(-) create mode 100644 forge-gui/res/editions/Guilds of Ravnica Guild Kit.txt diff --git a/forge-gui/res/editions/Guilds of Ravnica Guild Kit.txt b/forge-gui/res/editions/Guilds of Ravnica Guild Kit.txt new file mode 100644 index 00000000000..b141729f228 --- /dev/null +++ b/forge-gui/res/editions/Guilds of Ravnica Guild Kit.txt @@ -0,0 +1,150 @@ +[metadata] +Code=GK1 +Date=2018-11-02 +Name=Guilds of Ravnica Guild Kit +Code2=GK1 +MciCode=gk1 +Type=Other + +[cards] +1 R Etrata, the Silencer +2 R Stolen Identity +3 U Syncopate +4 U Telling Time +5 C Last Gasp +6 U Netherborn Phalanx +7 U Ribbons of Night +8 U Call of the Nightwing +9 R Circu, Dimir Lobotomist +10 R Consuming Aberration +11 U Dimir Charm +12 R Dimir Doppelganger +13 U Dimir Guildmage +14 U Dinrova Horror +15 R Glimpse the Unthinkable +16 M Lazav, Dimir Mastermind +17 R Mirko Vosk, Mind Drinker +18 U Moroii +19 R Nightveil Specter +20 R Szadek, Lord of Secrets +21 U Warped Physique +22 C Dimir Signet +23 C Dimir Aqueduct +24 L Island +25 L Swamp +26 R Niv-Mizzet, the Firemind +27 U Thunderheads +28 R Char +29 C Electrickery +30 U Goblin Rally +31 U Guttersnipe +32 R Mizzium Mortars +33 C Pyromatics +34 U Shattering Spree +35 R Cerebral Vortex +36 R Djinn Illuminatus +37 U Electrolyze +38 U Gelectrode +39 R Hypersonic Dragon +40 R Invoke the Firemind +41 U Izzet Charm +42 U Nivix Guildmage +43 R Stitch in Time +44 R Tibor and Lumia +45 U Turn // Burn +46 C Izzet Signet +47 C Izzet Boilerworks +48 L Island +49 L Mountain +50 R Izoni, Thousand-Eyed +51 U Darkblast +52 U Slum Reaper +53 C Stinkweed Imp +54 U Vigor Mortis +55 R Deadbridge Goliath +56 C Elves of Deep Shadow +57 R Abrupt Decay +58 M Deadbridge Chant +59 R Deathrite Shaman +60 C Drown in Filth +61 R Gaze of Granite +62 U Golgari Charm +63 R Grave-Shell Scarab +64 C Grisly Salvage +65 M Jarad, Golgari Lich Lord +66 U Korozda Guildmage +67 R Lotleth Troll +68 U Putrefy +69 R Savra, Queen of the Golgari +70 C Shambling Shell +71 R Sisters of Stone Death +72 U Treasured Find +73 C Golgari Signet +74 C Golgari Rot Farm +75 L Swamp +76 L Forest +77 M Aurelia, the Warleader +78 U Boros Elite +79 C Daring Skyjek +80 C Bomber Corps +81 U Frenzied Goblin +82 R Legion Loyalist +83 R Agrus Kos, Wojek Veteran +84 U Boros Charm +85 R Boros Reckoner +86 U Boros Swiftblade +87 R Brightflame +88 R Firemane Angel +89 R Firemane Avenger +90 U Lightning Helix +91 C Martial Glory +92 R Master Warcraft +93 R Razia, Boros Archangel +94 R Spark Trooper +95 U Sunhome Guildmage +96 U Boros Keyrune +97 C Boros Signet +98 C Boros Garrison +99 U Sunhome, Fortress of the Legion +100 L Plains +101 L Mountain +102 M Trostani, Selesnya's Voice +103 U Devouring Light +104 R Hour of Reckoning +105 C Gather Courage +106 C Scatter the Seeds +107 R Advent of the Wurm +108 M Armada Wurm +109 U Call of the Conclave +110 C Centaur Healer +111 U Dryad Militant +112 R Glare of Subdual +113 R Growing Ranks +114 R Loxodon Hierarch +115 U Pollenbright Wings +116 R Privileged Position +117 U Selesnya Charm +118 C Selesnya Evangel +119 U Selesnya Guildmage +120 C Sundering Growth +121 R Tolsimir Wolfblood +122 U Watchwolf +123 C Selesnya Signet +124 R Grove of the Guardian +125 C Selesnya Sanctuary +126 L Plains +127 L Forest + +[tokens] +g_1_1_saproling +ub_1_1_horror_flying +r_1_1_goblin +g_5_5_wurm_trample +u_3_3_weird_defender_flying +wg_2_2_voja +wr_1_1_soldier +w_1_1_soldier_lifelink +bg_1_1_insect +wg_2_2_elf_knight_vigilance +wg_8_8_elemental_vigilance +g_3_3_centaur diff --git a/forge-gui/tools/editionCreator.py b/forge-gui/tools/editionCreator.py index 6a29b5fbf31..1a70e313658 100644 --- a/forge-gui/tools/editionCreator.py +++ b/forge-gui/tools/editionCreator.py @@ -16,7 +16,7 @@ if result.setcode is None: print parser.parse_args(['-h']) sys.exit(1) -r = requests.get('http://mtgjson.com/json/%s.json' % result.setcode) +r = requests.get('http://mtgjson.com/v4/json/%s.json' % result.setcode) d = r.json() cards = d['cards'] @@ -35,10 +35,10 @@ for c in cards: l = [] l.append(c['number']) - rarity = c['rarity'][0] - if rarity == 'B': + rarity = c['rarity'][0].upper() + if rarity == 'C' and c['supertypes'].count('Basic') > 0: rarity = 'L' l.append(rarity) - l.append(c['name'].replace(u'\xc6', 'AE')) + l.append(c['name'].replace(u'\xc6', 'Ae')) l.append('\n') - f.write(' '.join(l)) \ No newline at end of file + f.write(' '.join(l)) From 2d2ddac2e8aef16acd295a025485764a1aafef93 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 20 Nov 2018 22:47:54 +0300 Subject: [PATCH 193/901] - Initial setup for advanced Flash. --- forge-ai/src/main/java/forge/ai/AiProps.java | 3 +- .../forge/ai/ability/PermanentCreatureAi.java | 34 ++++++++++++------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiProps.java b/forge-ai/src/main/java/forge/ai/AiProps.java index aefc58df58e..8fa09018fac 100644 --- a/forge-ai/src/main/java/forge/ai/AiProps.java +++ b/forge-ai/src/main/java/forge/ai/AiProps.java @@ -113,7 +113,8 @@ public enum AiProps { /** */ MOJHOSTO_CHANCE_TO_PREFER_JHOIRA_OVER_MOMIR ("50"), /** */ MOJHOSTO_CHANCE_TO_USE_JHOIRA_COPY_INSTANT ("20"), /** */ AI_IN_DANGER_THRESHOLD("4"), /** */ - AI_IN_DANGER_MAX_THRESHOLD("4"); /** */ + AI_IN_DANGER_MAX_THRESHOLD("4"), /** */ + FLASH_ENABLE_ADVANCED_LOGIC("true"); /** */ // Experimental features, must be promoted or removed after extensive testing and, ideally, defaulting // <-- There are no experimental options here --> diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java index 1b5dd90d4b1..ba2ee36c339 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java @@ -1,8 +1,6 @@ package forge.ai.ability; -import forge.ai.ComputerUtil; -import forge.ai.ComputerUtilCard; -import forge.ai.ComputerUtilCost; +import forge.ai.*; import forge.card.mana.ManaCost; import forge.game.Game; import forge.game.card.Card; @@ -79,16 +77,26 @@ public class PermanentCreatureAi extends PermanentAi { return false; } - // save cards with flash for surprise blocking - if (card.withFlash(ai) - && (ai.isUnlimitedHandSize() || ai.getCardsIn(ZoneType.Hand).size() <= ai.getMaxHandSize() - || ph.getPhase().isBefore(PhaseType.END_OF_TURN)) - && ai.getManaPool().totalMana() <= 0 - && (ph.isPlayerTurn(ai) || ph.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS)) - && (!card.hasETBTrigger(true) || card.hasSVar("AmbushAI")) && game.getStack().isEmpty() - && !ComputerUtil.castPermanentInMain1(ai, sa)) { - // AiPlayDecision.AnotherTime; - return false; + // Flash logic + boolean advancedFlash = false; + if (ai.getController().isAI()) { + advancedFlash = ((PlayerControllerAi)ai.getController()).getAi().getBooleanProperty(AiProps.FLASH_ENABLE_ADVANCED_LOGIC); + } + if (advancedFlash) { + + } else { + // save cards with flash for surprise blocking + if (card.withFlash(ai) + && (ai.isUnlimitedHandSize() || ai.getCardsIn(ZoneType.Hand).size() <= ai.getMaxHandSize() + || ph.getPhase().isBefore(PhaseType.END_OF_TURN)) + && ai.getManaPool().totalMana() <= 0 + && (ph.isPlayerTurn(ai) || ph.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS)) + && (!card.hasETBTrigger(true) && !card.hasSVar("AmbushAI")) + && game.getStack().isEmpty() + && !ComputerUtil.castPermanentInMain1(ai, sa)) { + // AiPlayDecision.AnotherTime; + return false; + } } return super.checkPhaseRestrictions(ai, sa, ph); From 81b5feb0f99e47b7f6baaebee46c80404c237829 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 20 Nov 2018 22:56:39 +0300 Subject: [PATCH 194/901] - Added the initial boolean flags for advanced Flash AI. - Refactored the adv Flash logic to its own method. --- .../forge/ai/ability/PermanentCreatureAi.java | 18 +++++++++++++++++- .../res/cardsfolder/h/hixus_prison_warden.txt | 1 + 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java index ba2ee36c339..7362c5d28f0 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java @@ -83,7 +83,7 @@ public class PermanentCreatureAi extends PermanentAi { advancedFlash = ((PlayerControllerAi)ai.getController()).getAi().getBooleanProperty(AiProps.FLASH_ENABLE_ADVANCED_LOGIC); } if (advancedFlash) { - + return doAdvancedFlashLogic(card, ai, sa); } else { // save cards with flash for surprise blocking if (card.withFlash(ai) @@ -102,6 +102,22 @@ public class PermanentCreatureAi extends PermanentAi { return super.checkPhaseRestrictions(ai, sa, ph); } + private boolean doAdvancedFlashLogic(Card card, Player ai, SpellAbility sa) { + PhaseHandler ph = ai.getGame().getPhaseHandler(); + + boolean hasETBTrigger = card.hasETBTrigger(true); + boolean hasAmbushAI = card.hasSVar("AmbushAI"); + boolean hasFloatMana = ai.getManaPool().totalMana() > 0; + boolean willDiscardNow = ph.is(PhaseType.END_OF_TURN, ai) && ai.getCardsIn(ZoneType.Hand).size() > ai.getMaxHandSize(); + boolean wantToCastInMain1 = ph.is(PhaseType.MAIN1, ai) && ComputerUtil.castPermanentInMain1(ai, sa); + boolean valuableBlocker = false; // TODO: implement this + + boolean isOwnEOT = ph.is(PhaseType.END_OF_TURN, ai); + boolean isEOTBeforeMyTurn = ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn().equals(ai); + + return true; + } + @Override protected boolean checkApiLogic(Player ai, SpellAbility sa) { diff --git a/forge-gui/res/cardsfolder/h/hixus_prison_warden.txt b/forge-gui/res/cardsfolder/h/hixus_prison_warden.txt index 7646b5967e5..0030694388a 100644 --- a/forge-gui/res/cardsfolder/h/hixus_prison_warden.txt +++ b/forge-gui/res/cardsfolder/h/hixus_prison_warden.txt @@ -9,5 +9,6 @@ SVar:DBEffect:DB$ Effect | Triggers$ ComeBack | RememberObjects$ TriggeredCard | SVar:ComeBack:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.IsImprinted | Execute$ TrigReturn | TriggerZones$ Command | TriggerController$ You | Static$ True | TriggerDescription$ That creature is exiled until EFFECTSOURCE leaves the battlefield SVar:TrigReturn:DB$ ChangeZoneAll | Origin$ Exile | Destination$ Battlefield | ChangeType$ Card.IsRemembered | SubAbility$ ExileSelf SVar:ExileSelf:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self +SVar:AmbushAI:True SVar:Picture:http://www.wizards.com/global/images/magic/general/hixus_prison_warden.jpg Oracle:Flash (You may cast this spell any time you could cast an instant.)\nWhenever a creature deals combat damage to you, if Hixus, Prison Warden entered the battlefield this turn, exile that creature until Hixus leaves the battlefield. From 05598ac224ac6216906f7e82ea931f407ebf9952 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 21 Nov 2018 16:24:53 +0300 Subject: [PATCH 195/901] - A little bit more work on Advanced Flash Logic. --- .../forge/ai/ability/PermanentCreatureAi.java | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java index 7362c5d28f0..cded0758b42 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java @@ -112,10 +112,35 @@ public class PermanentCreatureAi extends PermanentAi { boolean wantToCastInMain1 = ph.is(PhaseType.MAIN1, ai) && ComputerUtil.castPermanentInMain1(ai, sa); boolean valuableBlocker = false; // TODO: implement this + boolean isOppTurn = ph.getPlayerTurn().isOpponentOf(ai); boolean isOwnEOT = ph.is(PhaseType.END_OF_TURN, ai); boolean isEOTBeforeMyTurn = ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn().equals(ai); + boolean isOppDeclareAttackers = ph.is(PhaseType.COMBAT_DECLARE_ATTACKERS) && isOppTurn && ai.getGame().getCombat() != null; + boolean isMyDeclareAttackers = ph.is(PhaseType.COMBAT_DECLARE_ATTACKERS, ai) && ai.getGame().getCombat() != null; + boolean isMyMain1OrLater = ph.is(PhaseType.MAIN1, ai) || (ph.getPhase().isAfter(PhaseType.MAIN1) && ph.getPlayerTurn().equals(ai)); - return true; + if (hasFloatMana || willDiscardNow) { + // Will lose mana in pool or about to discard a card in cleanup, so use this opportunity + return true; + } else if (wantToCastInMain1 && isMyMain1OrLater) { + // Would rather cast it in Main 1 or as soon as possible anyway, so go for it + return true; + } else if (!hasETBTrigger && !hasAmbushAI) { + // Doesn't have a ETB trigger and doesn't seem to be good as an ambusher, try to surprise the opp before my turn + // TODO: maybe implement a way to reserve mana for this + return isEOTBeforeMyTurn; + } else if (hasAmbushAI) { + // Is an ambusher, so try to hold for combat if possible + // TODO: implement a chance here + return isOppDeclareAttackers; + } else if (hasETBTrigger) { + // Instant speed is good when a card has an ETB trigger, but prolly don't cast in own turn before Main 1 not + // to mana lock ourselves or lose other options + // TODO: implement a chance here + return isMyMain1OrLater || isOppTurn; + } + + return false; } @Override From 874c545a0891e5b3fa8a51d5ed9935569c8a50a9 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 21 Nov 2018 22:51:10 +0300 Subject: [PATCH 196/901] - Added a full advanced Flash logic infrastructure and the basic toggles for it. --- forge-ai/src/main/java/forge/ai/AiProps.java | 8 +- .../main/java/forge/ai/ability/AttachAi.java | 17 +++ .../forge/ai/ability/PermanentCreatureAi.java | 116 ++++++++++++------ forge-gui/res/ai/Cautious.ai | 21 ++++ forge-gui/res/ai/Default.ai | 22 ++++ forge-gui/res/ai/Experimental.ai | 22 ++++ forge-gui/res/ai/Reckless.ai | 22 ++++ 7 files changed, 191 insertions(+), 37 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiProps.java b/forge-ai/src/main/java/forge/ai/AiProps.java index 8fa09018fac..77ba9a66bfd 100644 --- a/forge-ai/src/main/java/forge/ai/AiProps.java +++ b/forge-ai/src/main/java/forge/ai/AiProps.java @@ -114,7 +114,13 @@ public enum AiProps { /** */ MOJHOSTO_CHANCE_TO_USE_JHOIRA_COPY_INSTANT ("20"), /** */ AI_IN_DANGER_THRESHOLD("4"), /** */ AI_IN_DANGER_MAX_THRESHOLD("4"), /** */ - FLASH_ENABLE_ADVANCED_LOGIC("true"); /** */ + FLASH_ENABLE_ADVANCED_LOGIC("true"), /** */ + FLASH_CHANCE_TO_OBEY_AMBUSHAI("100"), /** */ + FLASH_CHANCE_TO_CAST_DUE_TO_ETB_EFFECTS("100"), /** */ + FLASH_CHANCE_TO_CAST_FOR_ETB_BEFORE_MAIN1("10"), /** */ + FLASH_CHANCE_TO_RESPOND_TO_STACK_WITH_ETB("0"), /** */ + FLASH_CHANCE_TO_CAST_AS_VALUABLE_BLOCKER("100"), + FLASH_CHANCE_TO_USE_AURAS_AS_COMBAT_TRICKS("80"); /** */ // Experimental features, must be promoted or removed after extensive testing and, ideally, defaulting // <-- There are no experimental options here --> diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index 3ff51f33d7d..1454d0ff650 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -3,6 +3,7 @@ package forge.ai.ability; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import forge.ai.*; +import forge.game.Game; import forge.game.GameObject; import forge.game.GlobalRuleChange; import forge.game.ability.AbilityFactory; @@ -47,6 +48,22 @@ public class AttachAi extends SpellAbilityAi { return false; } + // Flash logic + boolean advancedFlash = false; + if (ai.getController().isAI()) { + advancedFlash = ((PlayerControllerAi)ai.getController()).getAi().getBooleanProperty(AiProps.FLASH_ENABLE_ADVANCED_LOGIC); + } + if (source.withFlash(ai) && source.isAura()) { + if (advancedFlash) { + Game game = ai.getGame(); + Combat combat = game.getCombat(); + + if (combat == null || game.getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS)) { + return false; + } + } + } + if (abCost != null) { // AI currently disabled for these costs if (!ComputerUtilCost.checkSacrificeCost(ai, abCost, source, sa)) { diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java index cded0758b42..451627d834c 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java @@ -1,17 +1,22 @@ package forge.ai.ability; +import com.google.common.base.Predicate; import forge.ai.*; import forge.card.mana.ManaCost; import forge.game.Game; +import forge.game.ability.ApiType; import forge.game.card.Card; +import forge.game.card.CardLists; import forge.game.card.CardUtil; +import forge.game.combat.Combat; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; +import forge.util.MyRandom; -/** +/** * AbilityFactory for Creature Spells. * */ @@ -82,20 +87,21 @@ public class PermanentCreatureAi extends PermanentAi { if (ai.getController().isAI()) { advancedFlash = ((PlayerControllerAi)ai.getController()).getAi().getBooleanProperty(AiProps.FLASH_ENABLE_ADVANCED_LOGIC); } - if (advancedFlash) { - return doAdvancedFlashLogic(card, ai, sa); - } else { - // save cards with flash for surprise blocking - if (card.withFlash(ai) - && (ai.isUnlimitedHandSize() || ai.getCardsIn(ZoneType.Hand).size() <= ai.getMaxHandSize() - || ph.getPhase().isBefore(PhaseType.END_OF_TURN)) - && ai.getManaPool().totalMana() <= 0 - && (ph.isPlayerTurn(ai) || ph.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS)) - && (!card.hasETBTrigger(true) && !card.hasSVar("AmbushAI")) - && game.getStack().isEmpty() - && !ComputerUtil.castPermanentInMain1(ai, sa)) { - // AiPlayDecision.AnotherTime; - return false; + if (card.withFlash(ai)) { + if (advancedFlash) { + return doAdvancedFlashLogic(card, ai, sa); + } else { + // save cards with flash for surprise blocking + if ((ai.isUnlimitedHandSize() || ai.getCardsIn(ZoneType.Hand).size() <= ai.getMaxHandSize() + || ph.getPhase().isBefore(PhaseType.END_OF_TURN)) + && ai.getManaPool().totalMana() <= 0 + && (ph.isPlayerTurn(ai) || ph.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS)) + && (!card.hasETBTrigger(true) && !card.hasSVar("AmbushAI")) + && game.getStack().isEmpty() + && !ComputerUtil.castPermanentInMain1(ai, sa)) { + // AiPlayDecision.AnotherTime; + return false; + } } } @@ -103,14 +109,10 @@ public class PermanentCreatureAi extends PermanentAi { } private boolean doAdvancedFlashLogic(Card card, Player ai, SpellAbility sa) { - PhaseHandler ph = ai.getGame().getPhaseHandler(); - - boolean hasETBTrigger = card.hasETBTrigger(true); - boolean hasAmbushAI = card.hasSVar("AmbushAI"); - boolean hasFloatMana = ai.getManaPool().totalMana() > 0; - boolean willDiscardNow = ph.is(PhaseType.END_OF_TURN, ai) && ai.getCardsIn(ZoneType.Hand).size() > ai.getMaxHandSize(); - boolean wantToCastInMain1 = ph.is(PhaseType.MAIN1, ai) && ComputerUtil.castPermanentInMain1(ai, sa); - boolean valuableBlocker = false; // TODO: implement this + Game game = ai.getGame(); + PhaseHandler ph = game.getPhaseHandler(); + Combat combat = game.getCombat(); + AiController aic = ((PlayerControllerAi)ai.getController()).getAi(); boolean isOppTurn = ph.getPlayerTurn().isOpponentOf(ai); boolean isOwnEOT = ph.is(PhaseType.END_OF_TURN, ai); @@ -118,29 +120,71 @@ public class PermanentCreatureAi extends PermanentAi { boolean isOppDeclareAttackers = ph.is(PhaseType.COMBAT_DECLARE_ATTACKERS) && isOppTurn && ai.getGame().getCombat() != null; boolean isMyDeclareAttackers = ph.is(PhaseType.COMBAT_DECLARE_ATTACKERS, ai) && ai.getGame().getCombat() != null; boolean isMyMain1OrLater = ph.is(PhaseType.MAIN1, ai) || (ph.getPhase().isAfter(PhaseType.MAIN1) && ph.getPlayerTurn().equals(ai)); + boolean canRespondToStack = false; + if (!game.getStack().isEmpty()) { + SpellAbility peekSa = game.getStack().peekAbility(); + Player activator = peekSa.getActivatingPlayer(); + if (activator != null && activator.isOpponentOf(ai) + && (peekSa.getApi() != ApiType.DestroyAll || peekSa.getApi() == ApiType.Counter)) { + canRespondToStack = true; + } + } + + boolean hasETBTrigger = card.hasETBTrigger(true); + boolean hasAmbushAI = card.hasSVar("AmbushAI"); + boolean hasFloatMana = ai.getManaPool().totalMana() > 0; + boolean willDiscardNow = isOwnEOT && ai.getCardsIn(ZoneType.Hand).size() > ai.getMaxHandSize(); + boolean wantToCastInMain1 = ph.is(PhaseType.MAIN1, ai) && ComputerUtil.castPermanentInMain1(ai, sa); + + // figure out if the card might be a valuable blocker + boolean valuableBlocker = false; + if (combat != null && combat.getDefendingPlayers().contains(ai)) { + // Currently we use a rather simplistic assumption that if we're behind on creature count on board, + // a flashed in creature might prove to be good as an additional defender + int numUntappedPotentialBlockers = CardLists.filter(ai.getCreaturesInPlay(), new Predicate() { + @Override + public boolean apply(final Card card) { + return card.isUntapped() && !ComputerUtilCard.isUselessCreature(ai, card); + } + }).size(); + + if (combat.getAttackersOf(ai).size() > numUntappedPotentialBlockers) { + valuableBlocker = true; + } + } + + int chanceToObeyAmbushAI = aic.getIntProperty(AiProps.FLASH_CHANCE_TO_OBEY_AMBUSHAI); + int chanceToAddBlocker = aic.getIntProperty(AiProps.FLASH_CHANCE_TO_CAST_AS_VALUABLE_BLOCKER); + int chanceToCastForETB = aic.getIntProperty(AiProps.FLASH_CHANCE_TO_CAST_DUE_TO_ETB_EFFECTS); + int chanceToRespondToStack = aic.getIntProperty(AiProps.FLASH_CHANCE_TO_RESPOND_TO_STACK_WITH_ETB); + int chanceToProcETBBeforeMain1 = aic.getIntProperty(AiProps.FLASH_CHANCE_TO_CAST_FOR_ETB_BEFORE_MAIN1); if (hasFloatMana || willDiscardNow) { // Will lose mana in pool or about to discard a card in cleanup, so use this opportunity return true; - } else if (wantToCastInMain1 && isMyMain1OrLater) { + } else if (wantToCastInMain1) { // Would rather cast it in Main 1 or as soon as possible anyway, so go for it + return isMyMain1OrLater; + } else if (hasAmbushAI && MyRandom.percentTrue(chanceToObeyAmbushAI)) { + // Is an ambusher, so try to hold for declare blockers in combat where the AI defends, if possible + return isOppDeclareAttackers; + } else if (valuableBlocker && isOppDeclareAttackers && MyRandom.percentTrue(chanceToAddBlocker)) { + // Might serve as a valuable blocker in a combat where we are behind on untapped blockers return true; - } else if (!hasETBTrigger && !hasAmbushAI) { + } else if (hasETBTrigger && MyRandom.percentTrue(chanceToCastForETB)) { + // Instant speed is good when a card has an ETB trigger, but prolly don't cast in own turn before Main 1 not + // to mana lock the AI or lose the chance to consider other options. Try to utilize it as a response to stack + // if possible. + return isMyMain1OrLater || isOppTurn || MyRandom.percentTrue(chanceToProcETBBeforeMain1); + } else if (hasETBTrigger && canRespondToStack && MyRandom.percentTrue(chanceToRespondToStack)) { + // Try to do something meaningful in response to an opposing effect on stack. Note that this is currently + // too random to likely be meaningful, serious improvement might be needed. + return true; + } else { // Doesn't have a ETB trigger and doesn't seem to be good as an ambusher, try to surprise the opp before my turn // TODO: maybe implement a way to reserve mana for this return isEOTBeforeMyTurn; - } else if (hasAmbushAI) { - // Is an ambusher, so try to hold for combat if possible - // TODO: implement a chance here - return isOppDeclareAttackers; - } else if (hasETBTrigger) { - // Instant speed is good when a card has an ETB trigger, but prolly don't cast in own turn before Main 1 not - // to mana lock ourselves or lose other options - // TODO: implement a chance here - return isMyMain1OrLater || isOppTurn; } - - return false; } @Override diff --git a/forge-gui/res/ai/Cautious.ai b/forge-gui/res/ai/Cautious.ai index c21c6088247..1cd38cea295 100644 --- a/forge-gui/res/ai/Cautious.ai +++ b/forge-gui/res/ai/Cautious.ai @@ -150,6 +150,27 @@ TOKEN_GENERATION_ABILITY_CHANCE=80 # Situations where the AI should always use the token-generation abilities if possible TOKEN_GENERATION_ALWAYS_IF_FROM_PLANESWALKER=true TOKEN_GENERATION_ALWAYS_IF_OPP_ATTACKS=true +# Flash AI toggles +# Master toggle: if enabled, a more advanced Flash consideration logic will be enabled (probably slower), +# which will also enable all the following toggles. +FLASH_ENABLE_ADVANCED_LOGIC=true +# The chance the AI will obey SVar AmbushAI to try to surprise the opponent after the attack is declared +# (e.g. Hixus, Prison Warden) +FLASH_CHANCE_TO_OBEY_AMBUSHAI=100 +# The chance the AI will cast the Flash creature at instant speed purely for the fact that it has a ETB effect. +FLASH_CHANCE_TO_CAST_DUE_TO_ETB_EFFECTS=100 +# The chance the AI may cast the Flash creature with ETB effects even earlier than its own Main 1 to try to benefit +# from the ETB effect (most likely suboptimal and many mana lock the AI, so keep this at a lower chance normally). +FLASH_CHANCE_TO_CAST_FOR_ETB_BEFORE_MAIN1=0 +# The chance the AI may cast the Flash creature with ETB effects in response to an opposing spell on stack. +# Quite basic right now, and may do stupid things more often than not, so better left disabled until improved +# (or at a low chance). +FLASH_CHANCE_TO_RESPOND_TO_STACK_WITH_ETB=0 +# The chance the AI will attempt to add a new blocker in combat where it's low on creature count compared to the +# number of attacking creatures. +FLASH_CHANCE_TO_CAST_AS_VALUABLE_BLOCKER=100 +# The chance that the AI will try to hold off playing auras with Flash until the declare blockers step in combat. +FLASH_CHANCE_TO_USE_AURAS_AS_COMBAT_TRICKS=90 # Scry AI toggles # The total number of mana-producing lands at which the AI will still consider scrying away non-lands diff --git a/forge-gui/res/ai/Default.ai b/forge-gui/res/ai/Default.ai index 1283e70167e..5bbf462354d 100644 --- a/forge-gui/res/ai/Default.ai +++ b/forge-gui/res/ai/Default.ai @@ -151,6 +151,28 @@ TOKEN_GENERATION_ABILITY_CHANCE=80 TOKEN_GENERATION_ALWAYS_IF_FROM_PLANESWALKER=true TOKEN_GENERATION_ALWAYS_IF_OPP_ATTACKS=true +# Flash AI toggles +# Master toggle: if enabled, a more advanced Flash consideration logic will be enabled (probably slower), +# which will also enable all the following toggles. +FLASH_ENABLE_ADVANCED_LOGIC=true +# The chance the AI will obey SVar AmbushAI to try to surprise the opponent after the attack is declared +# (e.g. Hixus, Prison Warden) +FLASH_CHANCE_TO_OBEY_AMBUSHAI=100 +# The chance the AI will cast the Flash creature at instant speed purely for the fact that it has a ETB effect. +FLASH_CHANCE_TO_CAST_DUE_TO_ETB_EFFECTS=100 +# The chance the AI may cast the Flash creature with ETB effects even earlier than its own Main 1 to try to benefit +# from the ETB effect (most likely suboptimal and many mana lock the AI, so keep this at a lower chance normally). +FLASH_CHANCE_TO_CAST_FOR_ETB_BEFORE_MAIN1=10 +# The chance the AI may cast the Flash creature with ETB effects in response to an opposing spell on stack. +# Quite basic right now, and may do stupid things more often than not, so better left disabled until improved +# (or at a low chance). +FLASH_CHANCE_TO_RESPOND_TO_STACK_WITH_ETB=0 +# The chance the AI will attempt to add a new blocker in combat where it's low on creature count compared to the +# number of attacking creatures. +FLASH_CHANCE_TO_CAST_AS_VALUABLE_BLOCKER=100 +# The chance that the AI will try to hold off playing auras with Flash until the declare blockers step in combat. +FLASH_CHANCE_TO_USE_AURAS_AS_COMBAT_TRICKS=80 + # Scry AI toggles # The total number of mana-producing lands at which the AI will still consider scrying away non-lands SCRY_NUM_LANDS_TO_STILL_NEED_MORE=4 diff --git a/forge-gui/res/ai/Experimental.ai b/forge-gui/res/ai/Experimental.ai index 8ed24df8f88..7e7b5337ee9 100644 --- a/forge-gui/res/ai/Experimental.ai +++ b/forge-gui/res/ai/Experimental.ai @@ -151,6 +151,28 @@ TOKEN_GENERATION_ABILITY_CHANCE=100 TOKEN_GENERATION_ALWAYS_IF_FROM_PLANESWALKER=true TOKEN_GENERATION_ALWAYS_IF_OPP_ATTACKS=true +# Flash AI toggles +# Master toggle: if enabled, a more advanced Flash consideration logic will be enabled (probably slower), +# which will also enable all the following toggles. +FLASH_ENABLE_ADVANCED_LOGIC=true +# The chance the AI will obey SVar AmbushAI to try to surprise the opponent after the attack is declared +# (e.g. Hixus, Prison Warden) +FLASH_CHANCE_TO_OBEY_AMBUSHAI=100 +# The chance the AI will cast the Flash creature at instant speed purely for the fact that it has a ETB effect. +FLASH_CHANCE_TO_CAST_DUE_TO_ETB_EFFECTS=100 +# The chance the AI may cast the Flash creature with ETB effects even earlier than its own Main 1 to try to benefit +# from the ETB effect (most likely suboptimal and many mana lock the AI, so keep this at a lower chance normally). +FLASH_CHANCE_TO_CAST_FOR_ETB_BEFORE_MAIN1=20 +# The chance the AI may cast the Flash creature with ETB effects in response to an opposing spell on stack. +# Quite basic right now, and may do stupid things more often than not, so better left disabled until improved +# (or at a low chance). +FLASH_CHANCE_TO_RESPOND_TO_STACK_WITH_ETB=15 +# The chance the AI will attempt to add a new blocker in combat where it's low on creature count compared to the +# number of attacking creatures. +FLASH_CHANCE_TO_CAST_AS_VALUABLE_BLOCKER=100 +# The chance that the AI will try to hold off playing auras with Flash until the declare blockers step in combat. +FLASH_CHANCE_TO_USE_AURAS_AS_COMBAT_TRICKS=100 + # Scry AI toggles # The total number of mana-producing lands at which the AI will still consider scrying away non-lands SCRY_NUM_LANDS_TO_STILL_NEED_MORE=4 diff --git a/forge-gui/res/ai/Reckless.ai b/forge-gui/res/ai/Reckless.ai index 8c021295bd7..d7bdc96c3fb 100644 --- a/forge-gui/res/ai/Reckless.ai +++ b/forge-gui/res/ai/Reckless.ai @@ -151,6 +151,28 @@ TOKEN_GENERATION_ABILITY_CHANCE=80 TOKEN_GENERATION_ALWAYS_IF_FROM_PLANESWALKER=true TOKEN_GENERATION_ALWAYS_IF_OPP_ATTACKS=true +# Flash AI toggles +# Master toggle: if enabled, a more advanced Flash consideration logic will be enabled (probably slower), +# which will also enable all the following toggles. +FLASH_ENABLE_ADVANCED_LOGIC=true +# The chance the AI will obey SVar AmbushAI to try to surprise the opponent after the attack is declared +# (e.g. Hixus, Prison Warden) +FLASH_CHANCE_TO_OBEY_AMBUSHAI=100 +# The chance the AI will cast the Flash creature at instant speed purely for the fact that it has a ETB effect. +FLASH_CHANCE_TO_CAST_DUE_TO_ETB_EFFECTS=100 +# The chance the AI may cast the Flash creature with ETB effects even earlier than its own Main 1 to try to benefit +# from the ETB effect (most likely suboptimal and many mana lock the AI, so keep this at a lower chance normally). +FLASH_CHANCE_TO_CAST_FOR_ETB_BEFORE_MAIN1=30 +# The chance the AI may cast the Flash creature with ETB effects in response to an opposing spell on stack. +# Quite basic right now, and may do stupid things more often than not, so better left disabled until improved +# (or at a low chance). +FLASH_CHANCE_TO_RESPOND_TO_STACK_WITH_ETB=10 +# The chance the AI will attempt to add a new blocker in combat where it's low on creature count compared to the +# number of attacking creatures. +FLASH_CHANCE_TO_CAST_AS_VALUABLE_BLOCKER=100 +# The chance that the AI will try to hold off playing auras with Flash until the declare blockers step in combat. +FLASH_CHANCE_TO_USE_AURAS_AS_COMBAT_TRICKS=30 + # Scry AI toggles # The total number of mana-producing lands at which the AI will still consider scrying away non-lands SCRY_NUM_LANDS_TO_STILL_NEED_MORE=3 From 0b0c08631a64e1fb899cb23777cde100434b799b Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 22 Nov 2018 09:03:15 +0300 Subject: [PATCH 197/901] - Added a full advanced Flash Attach Ai infrastructure and the basic logic and toggles for it. --- forge-ai/src/main/java/forge/ai/AiProps.java | 5 +- .../main/java/forge/ai/ability/AttachAi.java | 50 +++++++++++++++---- .../forge/ai/ability/PermanentCreatureAi.java | 4 +- forge-gui/res/ai/Cautious.ai | 12 ++++- forge-gui/res/ai/Default.ai | 12 ++++- forge-gui/res/ai/Experimental.ai | 10 ++++ forge-gui/res/ai/Reckless.ai | 12 ++++- 7 files changed, 86 insertions(+), 19 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiProps.java b/forge-ai/src/main/java/forge/ai/AiProps.java index 77ba9a66bfd..5594de7300e 100644 --- a/forge-ai/src/main/java/forge/ai/AiProps.java +++ b/forge-ai/src/main/java/forge/ai/AiProps.java @@ -120,7 +120,10 @@ public enum AiProps { /** */ FLASH_CHANCE_TO_CAST_FOR_ETB_BEFORE_MAIN1("10"), /** */ FLASH_CHANCE_TO_RESPOND_TO_STACK_WITH_ETB("0"), /** */ FLASH_CHANCE_TO_CAST_AS_VALUABLE_BLOCKER("100"), - FLASH_CHANCE_TO_USE_AURAS_AS_COMBAT_TRICKS("80"); /** */ + FLASH_USE_AURAS_AS_COMBAT_TRICKS("true"), + FLASH_AURA_CHANCE_TO_CAST_EARLY("0"), + FLASH_AURA_CHANCE_CAST_AT_EOT("10"), + FLASH_AURA_CHANCE_TO_RESPOND_TO_STACK("0"); /** */ // Experimental features, must be promoted or removed after extensive testing and, ideally, defaulting // <-- There are no experimental options here --> diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index 1454d0ff650..7b74dd97518 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -26,6 +26,7 @@ import forge.game.staticability.StaticAbility; import forge.game.trigger.Trigger; import forge.game.trigger.TriggerType; import forge.game.zone.ZoneType; +import forge.util.MyRandom; import java.util.ArrayList; import java.util.Iterator; @@ -53,15 +54,8 @@ public class AttachAi extends SpellAbilityAi { if (ai.getController().isAI()) { advancedFlash = ((PlayerControllerAi)ai.getController()).getAi().getBooleanProperty(AiProps.FLASH_ENABLE_ADVANCED_LOGIC); } - if (source.withFlash(ai) && source.isAura()) { - if (advancedFlash) { - Game game = ai.getGame(); - Combat combat = game.getCombat(); - - if (combat == null || game.getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS)) { - return false; - } - } + if (source.withFlash(ai) && source.isAura() && advancedFlash && !doAdvancedFlashAuraLogic(ai)) { + return false; } if (abCost != null) { @@ -134,6 +128,44 @@ public class AttachAi extends SpellAbilityAi { return true; } + private boolean doAdvancedFlashAuraLogic(Player ai) { + Game game = ai.getGame(); + Combat combat = game.getCombat(); + AiController aic = ((PlayerControllerAi)ai.getController()).getAi(); + boolean canRespondToStack = false; + if (!game.getStack().isEmpty()) { + SpellAbility peekSa = game.getStack().peekAbility(); + Player activator = peekSa.getActivatingPlayer(); + if (activator != null && activator.isOpponentOf(ai) && peekSa.getApi() != ApiType.DestroyAll && + peekSa.getApi() != ApiType.Destroy) { + // TODO: improve this so that the AI predicts how much damage will be dealt to the creature + // so that it can try to save it (and won't bother targeting it if it can't be saved) + canRespondToStack = true; + } + } + + boolean useAurasAsTricks = aic.getBooleanProperty(AiProps.FLASH_USE_AURAS_AS_COMBAT_TRICKS); + int chanceToCastAtEOT = aic.getIntProperty(AiProps.FLASH_AURA_CHANCE_CAST_AT_EOT); + int chanceToCastEarly = aic.getIntProperty(AiProps.FLASH_AURA_CHANCE_TO_CAST_EARLY); + int chanceToRespondToStack = aic.getIntProperty(AiProps.FLASH_AURA_CHANCE_TO_RESPOND_TO_STACK); + + boolean hasFloatMana = ai.getManaPool().totalMana() > 0; + boolean willDiscardNow = game.getPhaseHandler().is(PhaseType.END_OF_TURN, ai) + && ai.getCardsIn(ZoneType.Hand).size() > ai.getMaxHandSize(); + boolean willRespondToStack = canRespondToStack && MyRandom.percentTrue(chanceToRespondToStack); + boolean willCastEarly = MyRandom.percentTrue(chanceToCastEarly); + boolean willCastAtEOT = game.getPhaseHandler().is(PhaseType.END_OF_TURN) + && game.getPhaseHandler().getNextTurn().equals(ai) && MyRandom.percentTrue(chanceToCastAtEOT) || !useAurasAsTricks; + + boolean alternativeConsiderations = hasFloatMana || willDiscardNow || willRespondToStack || willCastAtEOT || willCastEarly; + + if (!alternativeConsiderations && (combat == null || game.getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS))) { + return false; + } + + return true; + } + /** * Acceptable choice. * diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java index 451627d834c..25fd2b80f12 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java @@ -118,14 +118,12 @@ public class PermanentCreatureAi extends PermanentAi { boolean isOwnEOT = ph.is(PhaseType.END_OF_TURN, ai); boolean isEOTBeforeMyTurn = ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn().equals(ai); boolean isOppDeclareAttackers = ph.is(PhaseType.COMBAT_DECLARE_ATTACKERS) && isOppTurn && ai.getGame().getCombat() != null; - boolean isMyDeclareAttackers = ph.is(PhaseType.COMBAT_DECLARE_ATTACKERS, ai) && ai.getGame().getCombat() != null; boolean isMyMain1OrLater = ph.is(PhaseType.MAIN1, ai) || (ph.getPhase().isAfter(PhaseType.MAIN1) && ph.getPlayerTurn().equals(ai)); boolean canRespondToStack = false; if (!game.getStack().isEmpty()) { SpellAbility peekSa = game.getStack().peekAbility(); Player activator = peekSa.getActivatingPlayer(); - if (activator != null && activator.isOpponentOf(ai) - && (peekSa.getApi() != ApiType.DestroyAll || peekSa.getApi() == ApiType.Counter)) { + if (activator != null && activator.isOpponentOf(ai) && peekSa.getApi() != ApiType.DestroyAll) { canRespondToStack = true; } } diff --git a/forge-gui/res/ai/Cautious.ai b/forge-gui/res/ai/Cautious.ai index 1cd38cea295..9c286a738cb 100644 --- a/forge-gui/res/ai/Cautious.ai +++ b/forge-gui/res/ai/Cautious.ai @@ -169,8 +169,16 @@ FLASH_CHANCE_TO_RESPOND_TO_STACK_WITH_ETB=0 # The chance the AI will attempt to add a new blocker in combat where it's low on creature count compared to the # number of attacking creatures. FLASH_CHANCE_TO_CAST_AS_VALUABLE_BLOCKER=100 -# The chance that the AI will try to hold off playing auras with Flash until the declare blockers step in combat. -FLASH_CHANCE_TO_USE_AURAS_AS_COMBAT_TRICKS=90 +# If enabled, the AI will try to hold off playing auras with Flash until the declare blockers step in combat. +# If disabled, but advanced logic is enabled, will generally try to play these auras before its own turn. +FLASH_USE_AURAS_AS_COMBAT_TRICKS=true +# The chance that the AI will cast a flash aura enchantment at the earliest opportunity +FLASH_AURA_CHANCE_TO_CAST_EARLY=0 +# The chance that the AI will cast a flash aura at the end of turn before its own turn +FLASH_AURA_CHANCE_CAST_AT_EOT=5 +# The chance that the AI will respond to stack with a flash aura (may do silly things sometimes, so better left +# disabled or at a low chance until improved) +FLASH_AURA_CHANCE_TO_RESPOND_TO_STACK=0 # Scry AI toggles # The total number of mana-producing lands at which the AI will still consider scrying away non-lands diff --git a/forge-gui/res/ai/Default.ai b/forge-gui/res/ai/Default.ai index 5bbf462354d..fd0f751a028 100644 --- a/forge-gui/res/ai/Default.ai +++ b/forge-gui/res/ai/Default.ai @@ -170,8 +170,16 @@ FLASH_CHANCE_TO_RESPOND_TO_STACK_WITH_ETB=0 # The chance the AI will attempt to add a new blocker in combat where it's low on creature count compared to the # number of attacking creatures. FLASH_CHANCE_TO_CAST_AS_VALUABLE_BLOCKER=100 -# The chance that the AI will try to hold off playing auras with Flash until the declare blockers step in combat. -FLASH_CHANCE_TO_USE_AURAS_AS_COMBAT_TRICKS=80 +# If enabled, the AI will try to hold off playing auras with Flash until the declare blockers step in combat. +# If disabled, but advanced logic is enabled, will generally try to play these auras before its own turn. +FLASH_USE_AURAS_AS_COMBAT_TRICKS=true +# The chance that the AI will cast a flash aura enchantment at the earliest opportunity +FLASH_AURA_CHANCE_TO_CAST_EARLY=5 +# The chance that the AI will cast a flash aura at the end of turn before its own turn +FLASH_AURA_CHANCE_CAST_AT_EOT=10 +# The chance that the AI will respond to stack with a flash aura (may do silly things sometimes, so better left +# disabled or at a low chance until improved) +FLASH_AURA_CHANCE_TO_RESPOND_TO_STACK=0 # Scry AI toggles # The total number of mana-producing lands at which the AI will still consider scrying away non-lands diff --git a/forge-gui/res/ai/Experimental.ai b/forge-gui/res/ai/Experimental.ai index 7e7b5337ee9..addc695a53e 100644 --- a/forge-gui/res/ai/Experimental.ai +++ b/forge-gui/res/ai/Experimental.ai @@ -172,6 +172,16 @@ FLASH_CHANCE_TO_RESPOND_TO_STACK_WITH_ETB=15 FLASH_CHANCE_TO_CAST_AS_VALUABLE_BLOCKER=100 # The chance that the AI will try to hold off playing auras with Flash until the declare blockers step in combat. FLASH_CHANCE_TO_USE_AURAS_AS_COMBAT_TRICKS=100 +# If enabled, the AI will try to hold off playing auras with Flash until the declare blockers step in combat. +# If disabled, but advanced logic is enabled, will generally try to play these auras before its own turn. +FLASH_USE_AURAS_AS_COMBAT_TRICKS=true +# The chance that the AI will cast a flash aura enchantment at the earliest opportunity +FLASH_AURA_CHANCE_TO_CAST_EARLY=0 +# The chance that the AI will cast a flash aura at the end of turn before its own turn +FLASH_AURA_CHANCE_CAST_AT_EOT=10 +# The chance that the AI will respond to stack with a flash aura (may do silly things sometimes, so better left +# disabled or at a low chance until improved) +FLASH_AURA_CHANCE_TO_RESPOND_TO_STACK=100 # Scry AI toggles # The total number of mana-producing lands at which the AI will still consider scrying away non-lands diff --git a/forge-gui/res/ai/Reckless.ai b/forge-gui/res/ai/Reckless.ai index d7bdc96c3fb..173b62fd4b4 100644 --- a/forge-gui/res/ai/Reckless.ai +++ b/forge-gui/res/ai/Reckless.ai @@ -170,8 +170,16 @@ FLASH_CHANCE_TO_RESPOND_TO_STACK_WITH_ETB=10 # The chance the AI will attempt to add a new blocker in combat where it's low on creature count compared to the # number of attacking creatures. FLASH_CHANCE_TO_CAST_AS_VALUABLE_BLOCKER=100 -# The chance that the AI will try to hold off playing auras with Flash until the declare blockers step in combat. -FLASH_CHANCE_TO_USE_AURAS_AS_COMBAT_TRICKS=30 +# If enabled, the AI will try to hold off playing auras with Flash until the declare blockers step in combat. +# If disabled, but advanced logic is enabled, will generally try to play these auras before its own turn. +FLASH_USE_AURAS_AS_COMBAT_TRICKS=true +# The chance that the AI will cast a flash aura enchantment at the earliest opportunity +FLASH_AURA_CHANCE_TO_CAST_EARLY=10 +# The chance that the AI will cast a flash aura at the end of turn before its own turn +FLASH_AURA_CHANCE_CAST_AT_EOT=30 +# The chance that the AI will respond to stack with a flash aura (may do silly things sometimes, so better left +# disabled or at a low chance until improved) +FLASH_AURA_CHANCE_TO_RESPOND_TO_STACK=10 # Scry AI toggles # The total number of mana-producing lands at which the AI will still consider scrying away non-lands From fd8b218e370c1c7c1304da5b8a12ccbd79dc2e4b Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 22 Nov 2018 15:11:00 +0300 Subject: [PATCH 198/901] - Preparing Forge for Android v1.6.18.003 [hotfix]. --- 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 c8834d7c089..7183dcb958b 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -6,7 +6,7 @@ jar -Xms1024m -Xmx1536m - 1.6.18.002 + 1.6.18.003 keystore alias storepass diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index 9f5623f5726..0927ec46729 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -6,7 +6,7 @@ jar -Xms128m -Xmx2048m - 1.6.18.002 + 1.6.18.003 diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index 0702ddb3e42..306b59a3b13 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.18.002"; + public static final String CURRENT_VERSION = "1.6.18.003"; private static final ApplicationListener app = new Forge(); private static Clipboard clipboard; From 12ec6e24a2b7513304a12594e87eb6005c6ec1fc Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 22 Nov 2018 19:06:44 +0300 Subject: [PATCH 199/901] - More work on flash aura logic. --- forge-ai/src/main/java/forge/ai/AiProps.java | 8 +- .../main/java/forge/ai/ability/AttachAi.java | 89 ++++++++++++++----- .../forge/ai/ability/PermanentCreatureAi.java | 3 +- forge-gui/res/ai/Cautious.ai | 11 ++- forge-gui/res/ai/Default.ai | 11 ++- forge-gui/res/ai/Experimental.ai | 13 ++- forge-gui/res/ai/Reckless.ai | 11 ++- 7 files changed, 94 insertions(+), 52 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiProps.java b/forge-ai/src/main/java/forge/ai/AiProps.java index 5594de7300e..05cff5918e4 100644 --- a/forge-ai/src/main/java/forge/ai/AiProps.java +++ b/forge-ai/src/main/java/forge/ai/AiProps.java @@ -120,10 +120,10 @@ public enum AiProps { /** */ FLASH_CHANCE_TO_CAST_FOR_ETB_BEFORE_MAIN1("10"), /** */ FLASH_CHANCE_TO_RESPOND_TO_STACK_WITH_ETB("0"), /** */ FLASH_CHANCE_TO_CAST_AS_VALUABLE_BLOCKER("100"), - FLASH_USE_AURAS_AS_COMBAT_TRICKS("true"), - FLASH_AURA_CHANCE_TO_CAST_EARLY("0"), - FLASH_AURA_CHANCE_CAST_AT_EOT("10"), - FLASH_AURA_CHANCE_TO_RESPOND_TO_STACK("0"); /** */ + FLASH_USE_BUFF_AURAS_AS_COMBAT_TRICKS("true"), + FLASH_BUFF_AURA_CHANCE_TO_CAST_EARLY("0"), + FLASH_BUFF_AURA_CHANCE_CAST_AT_EOT("10"), + FLASH_BUFF_AURA_CHANCE_TO_RESPOND_TO_STACK("0"); /** */ // Experimental features, must be promoted or removed after extensive testing and, ideally, defaulting // <-- There are no experimental options here --> diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index 7b74dd97518..48206f0f303 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -2,6 +2,7 @@ package forge.ai.ability; import com.google.common.base.Predicate; import com.google.common.base.Predicates; +import com.google.common.collect.Lists; import forge.ai.*; import forge.game.Game; import forge.game.GameObject; @@ -49,15 +50,6 @@ public class AttachAi extends SpellAbilityAi { return false; } - // Flash logic - boolean advancedFlash = false; - if (ai.getController().isAI()) { - advancedFlash = ((PlayerControllerAi)ai.getController()).getAi().getBooleanProperty(AiProps.FLASH_ENABLE_ADVANCED_LOGIC); - } - if (source.withFlash(ai) && source.isAura() && advancedFlash && !doAdvancedFlashAuraLogic(ai)) { - return false; - } - if (abCost != null) { // AI currently disabled for these costs if (!ComputerUtilCost.checkSacrificeCost(ai, abCost, source, sa)) { @@ -97,6 +89,15 @@ public class AttachAi extends SpellAbilityAi { } } + // Flash logic + boolean advancedFlash = false; + if (ai.getController().isAI()) { + advancedFlash = ((PlayerControllerAi)ai.getController()).getAi().getBooleanProperty(AiProps.FLASH_ENABLE_ADVANCED_LOGIC); + } + if (source.withFlash(ai) && source.isAura() && advancedFlash && !doAdvancedFlashAuraLogic(ai, sa, sa.getTargetCard())) { + return false; + } + if (abCost.getTotalMana().countX() > 0 && source.getSVar("X").equals("Count$xPaid")) { // Set PayX here to maximum value. (Endless Scream and Venarian // Gold) @@ -128,26 +129,72 @@ public class AttachAi extends SpellAbilityAi { return true; } - private boolean doAdvancedFlashAuraLogic(Player ai) { + private boolean doAdvancedFlashAuraLogic(Player ai, SpellAbility sa, Card attachTarget) { + Card source = sa.getHostCard(); Game game = ai.getGame(); Combat combat = game.getCombat(); AiController aic = ((PlayerControllerAi)ai.getController()).getAi(); + + if (!aic.getBooleanProperty(AiProps.FLASH_USE_BUFF_AURAS_AS_COMBAT_TRICKS)) { + // Currently this only works with buff auras, so if the relevant toggle is disabled, just return true + // for instant speed use. To be improved later. + return true; + } + + int power = 0, toughness = 0; + List keywords = Lists.newArrayList(); + for (StaticAbility stAb : source.getStaticAbilities()) { + if ("Continuous".equals(stAb.getParam("Mode"))) { + if (stAb.hasParam("AddPower")) { + power += AbilityUtils.calculateAmount(source, stAb.getParam("AddPower"), stAb); + } + if (stAb.hasParam("AddToughness")) { + toughness += AbilityUtils.calculateAmount(source, stAb.getParam("AddToughness"), stAb); + } + if (stAb.hasParam("AddKeyword")) { + keywords.addAll(Lists.newArrayList(stAb.getParam("AddKeyword").split(" & "))); + } + } + } + + boolean isBuffAura = !sa.isCurse() && (power > 0 || toughness > 0 || !keywords.isEmpty()); + if (!isBuffAura) { + // Currently only works with buff auras, otherwise returns for instant speed use. To be improved later. + return true; + } + boolean canRespondToStack = false; if (!game.getStack().isEmpty()) { SpellAbility peekSa = game.getStack().peekAbility(); Player activator = peekSa.getActivatingPlayer(); - if (activator != null && activator.isOpponentOf(ai) && peekSa.getApi() != ApiType.DestroyAll && - peekSa.getApi() != ApiType.Destroy) { - // TODO: improve this so that the AI predicts how much damage will be dealt to the creature - // so that it can try to save it (and won't bother targeting it if it can't be saved) - canRespondToStack = true; + if (activator != null && activator.isOpponentOf(ai) + && (!peekSa.usesTargeting() || peekSa.getTargets().getTargetCards().contains(attachTarget))) { + if (peekSa.getApi() == ApiType.DealDamage || peekSa.getApi() == ApiType.DamageAll) { + int dmg = AbilityUtils.calculateAmount(peekSa.getHostCard(), peekSa.getParam("NumDmg"), peekSa); + if (dmg < toughness + attachTarget.getNetToughness()) { + canRespondToStack = true; + } + } else if (peekSa.getApi() == ApiType.Destroy || peekSa.getApi() == ApiType.DestroyAll) { + if (!attachTarget.hasKeyword(Keyword.INDESTRUCTIBLE) && !ComputerUtil.canRegenerate(ai, attachTarget) + && keywords.contains("Indestructible")) { + canRespondToStack = true; + } + } else if (peekSa.getApi() == ApiType.Pump || peekSa.getApi() == ApiType.PumpAll) { + int p = AbilityUtils.calculateAmount(peekSa.getHostCard(), peekSa.getParam("NumAtt"), peekSa); + int t = AbilityUtils.calculateAmount(peekSa.getHostCard(), peekSa.getParam("NumDef"), peekSa); + if (t < 0 && toughness > 0 && attachTarget.getNetToughness() + t + toughness > 0) { + canRespondToStack = true; + } else if (p < 0 && power > 0 && attachTarget.getNetToughness() + t + toughness > 0) { + // Yep, still need to ensure that the net toughness will be positive here even if buffing for power + canRespondToStack = true; + } + } } } - boolean useAurasAsTricks = aic.getBooleanProperty(AiProps.FLASH_USE_AURAS_AS_COMBAT_TRICKS); - int chanceToCastAtEOT = aic.getIntProperty(AiProps.FLASH_AURA_CHANCE_CAST_AT_EOT); - int chanceToCastEarly = aic.getIntProperty(AiProps.FLASH_AURA_CHANCE_TO_CAST_EARLY); - int chanceToRespondToStack = aic.getIntProperty(AiProps.FLASH_AURA_CHANCE_TO_RESPOND_TO_STACK); + int chanceToCastAtEOT = aic.getIntProperty(AiProps.FLASH_BUFF_AURA_CHANCE_CAST_AT_EOT); + int chanceToCastEarly = aic.getIntProperty(AiProps.FLASH_BUFF_AURA_CHANCE_TO_CAST_EARLY); + int chanceToRespondToStack = aic.getIntProperty(AiProps.FLASH_BUFF_AURA_CHANCE_TO_RESPOND_TO_STACK); boolean hasFloatMana = ai.getManaPool().totalMana() > 0; boolean willDiscardNow = game.getPhaseHandler().is(PhaseType.END_OF_TURN, ai) @@ -155,11 +202,11 @@ public class AttachAi extends SpellAbilityAi { boolean willRespondToStack = canRespondToStack && MyRandom.percentTrue(chanceToRespondToStack); boolean willCastEarly = MyRandom.percentTrue(chanceToCastEarly); boolean willCastAtEOT = game.getPhaseHandler().is(PhaseType.END_OF_TURN) - && game.getPhaseHandler().getNextTurn().equals(ai) && MyRandom.percentTrue(chanceToCastAtEOT) || !useAurasAsTricks; + && game.getPhaseHandler().getNextTurn().equals(ai) && MyRandom.percentTrue(chanceToCastAtEOT); boolean alternativeConsiderations = hasFloatMana || willDiscardNow || willRespondToStack || willCastAtEOT || willCastEarly; - if (!alternativeConsiderations && (combat == null || game.getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS))) { + if (!alternativeConsiderations && (combat == null || game.getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS)) || (!combat.isAttacking(attachTarget) && !combat.isBlocking(attachTarget))) { return false; } diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java index 25fd2b80f12..49aaff7b37f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java @@ -123,7 +123,8 @@ public class PermanentCreatureAi extends PermanentAi { if (!game.getStack().isEmpty()) { SpellAbility peekSa = game.getStack().peekAbility(); Player activator = peekSa.getActivatingPlayer(); - if (activator != null && activator.isOpponentOf(ai) && peekSa.getApi() != ApiType.DestroyAll) { + if (activator != null && activator.isOpponentOf(ai) && peekSa.getApi() != ApiType.DestroyAll + && peekSa.getApi() != ApiType.DamageAll) { canRespondToStack = true; } } diff --git a/forge-gui/res/ai/Cautious.ai b/forge-gui/res/ai/Cautious.ai index 9c286a738cb..6c765eeb1a7 100644 --- a/forge-gui/res/ai/Cautious.ai +++ b/forge-gui/res/ai/Cautious.ai @@ -171,14 +171,13 @@ FLASH_CHANCE_TO_RESPOND_TO_STACK_WITH_ETB=0 FLASH_CHANCE_TO_CAST_AS_VALUABLE_BLOCKER=100 # If enabled, the AI will try to hold off playing auras with Flash until the declare blockers step in combat. # If disabled, but advanced logic is enabled, will generally try to play these auras before its own turn. -FLASH_USE_AURAS_AS_COMBAT_TRICKS=true +FLASH_USE_BUFF_AURAS_AS_COMBAT_TRICKS=true # The chance that the AI will cast a flash aura enchantment at the earliest opportunity -FLASH_AURA_CHANCE_TO_CAST_EARLY=0 +FLASH_BUFF_AURA_CHANCE_TO_CAST_EARLY=0 # The chance that the AI will cast a flash aura at the end of turn before its own turn -FLASH_AURA_CHANCE_CAST_AT_EOT=5 -# The chance that the AI will respond to stack with a flash aura (may do silly things sometimes, so better left -# disabled or at a low chance until improved) -FLASH_AURA_CHANCE_TO_RESPOND_TO_STACK=0 +FLASH_BUFF_AURA_CHANCE_CAST_AT_EOT=5 +# The chance that the AI will respond to stack with a flash aura which makes sense in context +FLASH_BUFF_AURA_CHANCE_TO_RESPOND_TO_STACK=100 # Scry AI toggles # The total number of mana-producing lands at which the AI will still consider scrying away non-lands diff --git a/forge-gui/res/ai/Default.ai b/forge-gui/res/ai/Default.ai index fd0f751a028..e4844b9eeac 100644 --- a/forge-gui/res/ai/Default.ai +++ b/forge-gui/res/ai/Default.ai @@ -172,14 +172,13 @@ FLASH_CHANCE_TO_RESPOND_TO_STACK_WITH_ETB=0 FLASH_CHANCE_TO_CAST_AS_VALUABLE_BLOCKER=100 # If enabled, the AI will try to hold off playing auras with Flash until the declare blockers step in combat. # If disabled, but advanced logic is enabled, will generally try to play these auras before its own turn. -FLASH_USE_AURAS_AS_COMBAT_TRICKS=true +FLASH_USE_BUFF_AURAS_AS_COMBAT_TRICKS=true # The chance that the AI will cast a flash aura enchantment at the earliest opportunity -FLASH_AURA_CHANCE_TO_CAST_EARLY=5 +FLASH_BUFF_AURA_CHANCE_TO_CAST_EARLY=1 # The chance that the AI will cast a flash aura at the end of turn before its own turn -FLASH_AURA_CHANCE_CAST_AT_EOT=10 -# The chance that the AI will respond to stack with a flash aura (may do silly things sometimes, so better left -# disabled or at a low chance until improved) -FLASH_AURA_CHANCE_TO_RESPOND_TO_STACK=0 +FLASH_BUFF_AURA_CHANCE_CAST_AT_EOT=5 +# The chance that the AI will respond to stack with a flash aura which makes sense in context +FLASH_BUFF_AURA_CHANCE_TO_RESPOND_TO_STACK=100 # Scry AI toggles # The total number of mana-producing lands at which the AI will still consider scrying away non-lands diff --git a/forge-gui/res/ai/Experimental.ai b/forge-gui/res/ai/Experimental.ai index addc695a53e..aa49163c7bb 100644 --- a/forge-gui/res/ai/Experimental.ai +++ b/forge-gui/res/ai/Experimental.ai @@ -170,18 +170,15 @@ FLASH_CHANCE_TO_RESPOND_TO_STACK_WITH_ETB=15 # The chance the AI will attempt to add a new blocker in combat where it's low on creature count compared to the # number of attacking creatures. FLASH_CHANCE_TO_CAST_AS_VALUABLE_BLOCKER=100 -# The chance that the AI will try to hold off playing auras with Flash until the declare blockers step in combat. -FLASH_CHANCE_TO_USE_AURAS_AS_COMBAT_TRICKS=100 # If enabled, the AI will try to hold off playing auras with Flash until the declare blockers step in combat. # If disabled, but advanced logic is enabled, will generally try to play these auras before its own turn. -FLASH_USE_AURAS_AS_COMBAT_TRICKS=true +FLASH_USE_BUFF_AURAS_AS_COMBAT_TRICKS=true # The chance that the AI will cast a flash aura enchantment at the earliest opportunity -FLASH_AURA_CHANCE_TO_CAST_EARLY=0 +FLASH_BUFF_AURA_CHANCE_TO_CAST_EARLY=0 # The chance that the AI will cast a flash aura at the end of turn before its own turn -FLASH_AURA_CHANCE_CAST_AT_EOT=10 -# The chance that the AI will respond to stack with a flash aura (may do silly things sometimes, so better left -# disabled or at a low chance until improved) -FLASH_AURA_CHANCE_TO_RESPOND_TO_STACK=100 +FLASH_BUFF_AURA_CHANCE_CAST_AT_EOT=10 +# The chance that the AI will respond to stack with a flash aura which makes sense in context +FLASH_BUFF_AURA_CHANCE_TO_RESPOND_TO_STACK=100 # Scry AI toggles # The total number of mana-producing lands at which the AI will still consider scrying away non-lands diff --git a/forge-gui/res/ai/Reckless.ai b/forge-gui/res/ai/Reckless.ai index 173b62fd4b4..186c1cf1c7e 100644 --- a/forge-gui/res/ai/Reckless.ai +++ b/forge-gui/res/ai/Reckless.ai @@ -172,14 +172,13 @@ FLASH_CHANCE_TO_RESPOND_TO_STACK_WITH_ETB=10 FLASH_CHANCE_TO_CAST_AS_VALUABLE_BLOCKER=100 # If enabled, the AI will try to hold off playing auras with Flash until the declare blockers step in combat. # If disabled, but advanced logic is enabled, will generally try to play these auras before its own turn. -FLASH_USE_AURAS_AS_COMBAT_TRICKS=true +FLASH_USE_BUFF_AURAS_AS_COMBAT_TRICKS=true # The chance that the AI will cast a flash aura enchantment at the earliest opportunity -FLASH_AURA_CHANCE_TO_CAST_EARLY=10 +FLASH_BUFF_AURA_CHANCE_TO_CAST_EARLY=3 # The chance that the AI will cast a flash aura at the end of turn before its own turn -FLASH_AURA_CHANCE_CAST_AT_EOT=30 -# The chance that the AI will respond to stack with a flash aura (may do silly things sometimes, so better left -# disabled or at a low chance until improved) -FLASH_AURA_CHANCE_TO_RESPOND_TO_STACK=10 +FLASH_BUFF_AURA_CHANCE_CAST_AT_EOT=10 +# The chance that the AI will respond to stack with a flash aura which makes sense in context +FLASH_BUFF_AURA_CHANCE_TO_RESPOND_TO_STACK=100 # Scry AI toggles # The total number of mana-producing lands at which the AI will still consider scrying away non-lands From 64d47560dc90ff19945b55e914ecc119fcc32897 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 22 Nov 2018 19:26:00 +0300 Subject: [PATCH 200/901] - More work on creature flash logic. --- .../src/main/java/forge/ai/ability/PermanentCreatureAi.java | 4 +++- forge-gui/res/cardsfolder/h/hixus_prison_warden.txt | 2 +- forge-gui/res/cardsfolder/t/traxos_scourge_of_kroog.txt | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java index 49aaff7b37f..89100753700 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java @@ -117,6 +117,7 @@ public class PermanentCreatureAi extends PermanentAi { boolean isOppTurn = ph.getPlayerTurn().isOpponentOf(ai); boolean isOwnEOT = ph.is(PhaseType.END_OF_TURN, ai); boolean isEOTBeforeMyTurn = ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn().equals(ai); + boolean isMyDeclareBlockers = ph.is(PhaseType.COMBAT_DECLARE_BLOCKERS, ai) && ai.getGame().getCombat() != null; boolean isOppDeclareAttackers = ph.is(PhaseType.COMBAT_DECLARE_ATTACKERS) && isOppTurn && ai.getGame().getCombat() != null; boolean isMyMain1OrLater = ph.is(PhaseType.MAIN1, ai) || (ph.getPhase().isAfter(PhaseType.MAIN1) && ph.getPlayerTurn().equals(ai)); boolean canRespondToStack = false; @@ -131,6 +132,7 @@ public class PermanentCreatureAi extends PermanentAi { boolean hasETBTrigger = card.hasETBTrigger(true); boolean hasAmbushAI = card.hasSVar("AmbushAI"); + boolean defOnlyAmbushAI = hasAmbushAI && "BlockOnly".equals(card.getSVar("AmbushAI")); boolean hasFloatMana = ai.getManaPool().totalMana() > 0; boolean willDiscardNow = isOwnEOT && ai.getCardsIn(ZoneType.Hand).size() > ai.getMaxHandSize(); boolean wantToCastInMain1 = ph.is(PhaseType.MAIN1, ai) && ComputerUtil.castPermanentInMain1(ai, sa); @@ -166,7 +168,7 @@ public class PermanentCreatureAi extends PermanentAi { return isMyMain1OrLater; } else if (hasAmbushAI && MyRandom.percentTrue(chanceToObeyAmbushAI)) { // Is an ambusher, so try to hold for declare blockers in combat where the AI defends, if possible - return isOppDeclareAttackers; + return defOnlyAmbushAI ? isOppDeclareAttackers : (isOppDeclareAttackers || isMyDeclareBlockers); } else if (valuableBlocker && isOppDeclareAttackers && MyRandom.percentTrue(chanceToAddBlocker)) { // Might serve as a valuable blocker in a combat where we are behind on untapped blockers return true; diff --git a/forge-gui/res/cardsfolder/h/hixus_prison_warden.txt b/forge-gui/res/cardsfolder/h/hixus_prison_warden.txt index 0030694388a..bbdad36ecb2 100644 --- a/forge-gui/res/cardsfolder/h/hixus_prison_warden.txt +++ b/forge-gui/res/cardsfolder/h/hixus_prison_warden.txt @@ -9,6 +9,6 @@ SVar:DBEffect:DB$ Effect | Triggers$ ComeBack | RememberObjects$ TriggeredCard | SVar:ComeBack:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.IsImprinted | Execute$ TrigReturn | TriggerZones$ Command | TriggerController$ You | Static$ True | TriggerDescription$ That creature is exiled until EFFECTSOURCE leaves the battlefield SVar:TrigReturn:DB$ ChangeZoneAll | Origin$ Exile | Destination$ Battlefield | ChangeType$ Card.IsRemembered | SubAbility$ ExileSelf SVar:ExileSelf:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self -SVar:AmbushAI:True +SVar:AmbushAI:BlockOnly SVar:Picture:http://www.wizards.com/global/images/magic/general/hixus_prison_warden.jpg Oracle:Flash (You may cast this spell any time you could cast an instant.)\nWhenever a creature deals combat damage to you, if Hixus, Prison Warden entered the battlefield this turn, exile that creature until Hixus leaves the battlefield. diff --git a/forge-gui/res/cardsfolder/t/traxos_scourge_of_kroog.txt b/forge-gui/res/cardsfolder/t/traxos_scourge_of_kroog.txt index 822f5e72471..7d5fa2d92a7 100644 --- a/forge-gui/res/cardsfolder/t/traxos_scourge_of_kroog.txt +++ b/forge-gui/res/cardsfolder/t/traxos_scourge_of_kroog.txt @@ -7,4 +7,5 @@ K:CARDNAME enters the battlefield tapped. K:CARDNAME doesn't untap during your untap step. T:Mode$ SpellCast | ValidCard$ Card.Historic | ValidActivatingPlayer$ You | Execute$ TrigUntap | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a historic spell, untap Traxos. (Artifacts, legendaries, and Sagas are historic.) SVar:TrigUntap:DB$ Untap | Defined$ Self +SVar:BuffedBy:Card.Historic Oracle:Trample\nTraxos, Scourge of Kroog enters the battlefield tapped and doesn't untap during your untap step.\nWhenever you cast a historic spell, untap Traxos. (Artifacts, legendaries, and Sagas are historic.) From 2e0177fc08ef3312eb8e4886b4c0e0f5e15b94d5 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 22 Nov 2018 19:39:45 +0300 Subject: [PATCH 201/901] - Improved detection of combat death in AttachAi for flash auras. --- .../main/java/forge/ai/ability/AttachAi.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index 48206f0f303..b1e3c9a5984 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -27,6 +27,7 @@ import forge.game.staticability.StaticAbility; import forge.game.trigger.Trigger; import forge.game.trigger.TriggerType; import forge.game.zone.ZoneType; +import forge.util.Aggregates; import forge.util.MyRandom; import java.util.ArrayList; @@ -192,6 +193,29 @@ public class AttachAi extends SpellAbilityAi { } } + boolean canSurviveCombat = true; + if (combat != null && combat.isBlocked(attachTarget)) { + if (!attachTarget.hasKeyword(Keyword.INDESTRUCTIBLE) && !ComputerUtil.canRegenerate(ai, attachTarget)) { + boolean dangerous = false; + int totalAtkPower = 0; + for (Card attacker : combat.getBlockers(attachTarget)) { + if (attacker.hasKeyword(Keyword.DEATHTOUCH) || attacker.hasKeyword(Keyword.INFECT) + || attacker.hasKeyword(Keyword.WITHER)) { + dangerous = true; + } + totalAtkPower += attacker.getNetPower(); + } + if (totalAtkPower > attachTarget.getNetToughness() + toughness || dangerous) { + canSurviveCombat = false; + } + } + } + + if (!canSurviveCombat) { + // don't buff anything that will die or get seriously crippled in combat + return false; + } + int chanceToCastAtEOT = aic.getIntProperty(AiProps.FLASH_BUFF_AURA_CHANCE_CAST_AT_EOT); int chanceToCastEarly = aic.getIntProperty(AiProps.FLASH_BUFF_AURA_CHANCE_TO_CAST_EARLY); int chanceToRespondToStack = aic.getIntProperty(AiProps.FLASH_BUFF_AURA_CHANCE_TO_RESPOND_TO_STACK); From 79f9eb0f997de5ccf6632d3e9a7865efe2858398 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 22 Nov 2018 19:46:10 +0300 Subject: [PATCH 202/901] - More death prediction in Flash logic. --- forge-ai/src/main/java/forge/ai/ability/AttachAi.java | 5 +++-- .../src/main/java/forge/ai/ability/PermanentCreatureAi.java | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index b1e3c9a5984..fd56686bca3 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -212,7 +212,7 @@ public class AttachAi extends SpellAbilityAi { } if (!canSurviveCombat) { - // don't buff anything that will die or get seriously crippled in combat + // don't buff anything that will die or get seriously crippled in combat, it's pointless anyway return false; } @@ -223,12 +223,13 @@ public class AttachAi extends SpellAbilityAi { boolean hasFloatMana = ai.getManaPool().totalMana() > 0; boolean willDiscardNow = game.getPhaseHandler().is(PhaseType.END_OF_TURN, ai) && ai.getCardsIn(ZoneType.Hand).size() > ai.getMaxHandSize(); + boolean willDieNow = combat != null && ComputerUtilCombat.lifeInSeriousDanger(ai, combat); boolean willRespondToStack = canRespondToStack && MyRandom.percentTrue(chanceToRespondToStack); boolean willCastEarly = MyRandom.percentTrue(chanceToCastEarly); boolean willCastAtEOT = game.getPhaseHandler().is(PhaseType.END_OF_TURN) && game.getPhaseHandler().getNextTurn().equals(ai) && MyRandom.percentTrue(chanceToCastAtEOT); - boolean alternativeConsiderations = hasFloatMana || willDiscardNow || willRespondToStack || willCastAtEOT || willCastEarly; + boolean alternativeConsiderations = hasFloatMana || willDiscardNow || willDieNow || willRespondToStack || willCastAtEOT || willCastEarly; if (!alternativeConsiderations && (combat == null || game.getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_BLOCKERS)) || (!combat.isAttacking(attachTarget) && !combat.isBlocking(attachTarget))) { return false; diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java index 89100753700..e46445f3688 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java @@ -135,6 +135,7 @@ public class PermanentCreatureAi extends PermanentAi { boolean defOnlyAmbushAI = hasAmbushAI && "BlockOnly".equals(card.getSVar("AmbushAI")); boolean hasFloatMana = ai.getManaPool().totalMana() > 0; boolean willDiscardNow = isOwnEOT && ai.getCardsIn(ZoneType.Hand).size() > ai.getMaxHandSize(); + boolean willDieNow = combat != null && ComputerUtilCombat.lifeInSeriousDanger(ai, combat); boolean wantToCastInMain1 = ph.is(PhaseType.MAIN1, ai) && ComputerUtil.castPermanentInMain1(ai, sa); // figure out if the card might be a valuable blocker @@ -160,8 +161,8 @@ public class PermanentCreatureAi extends PermanentAi { int chanceToRespondToStack = aic.getIntProperty(AiProps.FLASH_CHANCE_TO_RESPOND_TO_STACK_WITH_ETB); int chanceToProcETBBeforeMain1 = aic.getIntProperty(AiProps.FLASH_CHANCE_TO_CAST_FOR_ETB_BEFORE_MAIN1); - if (hasFloatMana || willDiscardNow) { - // Will lose mana in pool or about to discard a card in cleanup, so use this opportunity + if (hasFloatMana || willDiscardNow || willDieNow) { + // Will lose mana in pool or about to discard a card in cleanup or about to die in combat, so use this opportunity return true; } else if (wantToCastInMain1) { // Would rather cast it in Main 1 or as soon as possible anyway, so go for it From 1f712f96a6f7eaaa6917e2dd322342e4262df78a Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 22 Nov 2018 19:53:02 +0300 Subject: [PATCH 203/901] - Fix imports. --- forge-ai/src/main/java/forge/ai/ability/AttachAi.java | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index fd56686bca3..71851a58197 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -27,7 +27,6 @@ import forge.game.staticability.StaticAbility; import forge.game.trigger.Trigger; import forge.game.trigger.TriggerType; import forge.game.zone.ZoneType; -import forge.util.Aggregates; import forge.util.MyRandom; import java.util.ArrayList; From c36b1a4a6316a2fa424ffda7aced2af600d96186 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 22 Nov 2018 19:54:04 +0300 Subject: [PATCH 204/901] - Changed the defaults in AiProps. --- forge-ai/src/main/java/forge/ai/AiProps.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiProps.java b/forge-ai/src/main/java/forge/ai/AiProps.java index 05cff5918e4..50a8413dff6 100644 --- a/forge-ai/src/main/java/forge/ai/AiProps.java +++ b/forge-ai/src/main/java/forge/ai/AiProps.java @@ -121,9 +121,9 @@ public enum AiProps { /** */ FLASH_CHANCE_TO_RESPOND_TO_STACK_WITH_ETB("0"), /** */ FLASH_CHANCE_TO_CAST_AS_VALUABLE_BLOCKER("100"), FLASH_USE_BUFF_AURAS_AS_COMBAT_TRICKS("true"), - FLASH_BUFF_AURA_CHANCE_TO_CAST_EARLY("0"), - FLASH_BUFF_AURA_CHANCE_CAST_AT_EOT("10"), - FLASH_BUFF_AURA_CHANCE_TO_RESPOND_TO_STACK("0"); /** */ + FLASH_BUFF_AURA_CHANCE_TO_CAST_EARLY("1"), + FLASH_BUFF_AURA_CHANCE_CAST_AT_EOT("5"), + FLASH_BUFF_AURA_CHANCE_TO_RESPOND_TO_STACK("100"); /** */ // Experimental features, must be promoted or removed after extensive testing and, ideally, defaulting // <-- There are no experimental options here --> From b021e13d86e67355cb55b6c06c5a0f8e2d910ad4 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 23 Nov 2018 07:33:44 +0300 Subject: [PATCH 205/901] - A couple minor tweaks in AttachAi. --- forge-ai/src/main/java/forge/ai/ability/AttachAi.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index 71851a58197..828103b71b5 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -159,7 +159,7 @@ public class AttachAi extends SpellAbilityAi { boolean isBuffAura = !sa.isCurse() && (power > 0 || toughness > 0 || !keywords.isEmpty()); if (!isBuffAura) { - // Currently only works with buff auras, otherwise returns for instant speed use. To be improved later. + // Currently only works with buff auras, otherwise returns true for instant speed use. To be improved later. return true; } @@ -184,7 +184,8 @@ public class AttachAi extends SpellAbilityAi { int t = AbilityUtils.calculateAmount(peekSa.getHostCard(), peekSa.getParam("NumDef"), peekSa); if (t < 0 && toughness > 0 && attachTarget.getNetToughness() + t + toughness > 0) { canRespondToStack = true; - } else if (p < 0 && power > 0 && attachTarget.getNetToughness() + t + toughness > 0) { + } else if (p < 0 && power > 0 && attachTarget.getNetPower() + p + power > 0 + && attachTarget.getNetToughness() + t + toughness > 0) { // Yep, still need to ensure that the net toughness will be positive here even if buffing for power canRespondToStack = true; } @@ -210,7 +211,7 @@ public class AttachAi extends SpellAbilityAi { } } - if (!canSurviveCombat) { + if (!canSurviveCombat || (attachTarget.isCreature() && ComputerUtilCard.isUselessCreature(ai, attachTarget))) { // don't buff anything that will die or get seriously crippled in combat, it's pointless anyway return false; } From 19dad31da3fa52481dbf4d19abc37dc8b256d9f5 Mon Sep 17 00:00:00 2001 From: Michael Kamensky Date: Fri, 23 Nov 2018 05:45:21 +0000 Subject: [PATCH 206/901] AI for Rallying Roar and several similar cards. --- forge-ai/src/main/java/forge/ai/ComputerUtilCard.java | 10 +++++++++- forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java | 10 ++++++++++ forge-gui/res/cardsfolder/g/gleam_of_resistance.txt | 5 ++--- forge-gui/res/cardsfolder/r/rallying_roar.txt | 2 +- forge-gui/res/cardsfolder/t/tenacity.txt | 2 +- forge-gui/res/cardsfolder/w/war_flare.txt | 2 +- 6 files changed, 24 insertions(+), 7 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index 7d45ed46dfd..8d1883aaafc 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -1479,7 +1479,15 @@ public class ComputerUtilCard { } } } - + + if ("UntapCombatTrick".equals(sa.getParam("AILogic")) && c.isTapped()) { + if (phase.is(PhaseType.COMBAT_DECLARE_ATTACKERS) && phase.getPlayerTurn().isOpponentOf(ai)) { + chance += 0.5f; // this creature will untap to become a potential blocker + } else if (phase.is(PhaseType.COMBAT_DECLARE_BLOCKERS, ai)) { + chance += 1.0f; // untap after tapping for attack + } + } + if (isBerserk) { // if we got here, Berserk will result in the pumped creature dying at EOT and the opponent will not lose // (other similar cards with AILogic$ Berserk that do not die only when attacking are excluded from consideration) 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 662ffc10a4c..dfa5db11642 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java @@ -15,6 +15,7 @@ import forge.game.card.CardLists; import forge.game.combat.Combat; import forge.game.cost.Cost; import forge.game.keyword.Keyword; +import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.spellability.SpellAbility; @@ -37,6 +38,15 @@ public class PumpAllAi extends PumpAiBase { final Game game = ai.getGame(); final Combat combat = game.getCombat(); final Cost abCost = sa.getPayCosts(); + final String logic = sa.getParamOrDefault("AILogic", ""); + + if (logic.equals("UntapCombatTrick")) { + PhaseHandler ph = ai.getGame().getPhaseHandler(); + if (!(ph.is(PhaseType.COMBAT_DECLARE_BLOCKERS, ai) + || (!ph.getPlayerTurn().equals(ai) && ph.is(PhaseType.COMBAT_DECLARE_ATTACKERS)))) { + return false; + } + } final int power = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("NumAtt"), sa); final int defense = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("NumDef"), sa); diff --git a/forge-gui/res/cardsfolder/g/gleam_of_resistance.txt b/forge-gui/res/cardsfolder/g/gleam_of_resistance.txt index 6bd8be08fea..faade9d9e72 100644 --- a/forge-gui/res/cardsfolder/g/gleam_of_resistance.txt +++ b/forge-gui/res/cardsfolder/g/gleam_of_resistance.txt @@ -1,9 +1,8 @@ Name:Gleam of Resistance ManaCost:4 W Types:Instant -A:SP$ UntapAll | Cost$ 4 W | ValidCards$ Creature.YouCtrl | SpellDescription$ Creatures you control get +1/+2 until end of turn. Untap those creatures. | SubAbility$ DBPumpYourCreatures -SVar:DBPumpYourCreatures:DB$ PumpAll | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +2 +A:SP$ PumpAll | Cost$ 4 W | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +2 | AILogic$ UntapCombatTrick | SubAbility$ DBUntapAll | SpellDescription$ Creatures you control get +1/+2 until end of turn. Untap those creatures. +SVar:DBUntapAll:DB$ UntapAll | ValidCards$ Creature.YouCtrl K:TypeCycling:Basic:1 W -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gleam_of_resistance.jpg Oracle:Creatures you control get +1/+2 until end of turn. Untap those creatures.\nBasic landcycling {1}{W} ({1}{W}, Discard this card: Search your library for a basic land card, reveal it, put it into your hand, then shuffle your library.) diff --git a/forge-gui/res/cardsfolder/r/rallying_roar.txt b/forge-gui/res/cardsfolder/r/rallying_roar.txt index cb22e12190a..dc59593bff8 100644 --- a/forge-gui/res/cardsfolder/r/rallying_roar.txt +++ b/forge-gui/res/cardsfolder/r/rallying_roar.txt @@ -1,7 +1,7 @@ Name:Rallying Roar ManaCost:2 W Types:Instant -A:SP$ PumpAll | Cost$ 2 W | ValidCards$ Creature.YouCtrl | NumAtt$ 1 | NumDef$ 1 | SubAbility$ DBUntapAll | SpellDescription$ Creatures you control get +1/+1 until end of turn. Untap them. +A:SP$ PumpAll | Cost$ 2 W | ValidCards$ Creature.YouCtrl | NumAtt$ 1 | NumDef$ 1 | AILogic$ UntapCombatTrick | SubAbility$ DBUntapAll | SpellDescription$ Creatures you control get +1/+1 until end of turn. Untap them. SVar:DBUntapAll:DB$ UntapAll | ValidCards$ Creature.YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/rallying_roar.jpg Oracle:Creatures you control get +1/+1 until end of turn. Untap them. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/t/tenacity.txt b/forge-gui/res/cardsfolder/t/tenacity.txt index 155889cba47..9348d576db9 100644 --- a/forge-gui/res/cardsfolder/t/tenacity.txt +++ b/forge-gui/res/cardsfolder/t/tenacity.txt @@ -1,7 +1,7 @@ Name:Tenacity ManaCost:3 W Types:Instant -A:SP$ PumpAll | Cost$ 3 W | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | KW$ Lifelink | SubAbility$ DBUntapAll | SpellDescription$ Creatures you control get +1/+1 and gain lifelink until end of turn. Untap those creatures. +A:SP$ PumpAll | Cost$ 3 W | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | KW$ Lifelink | AILogic$ UntapCombatTrick | SubAbility$ DBUntapAll | SpellDescription$ Creatures you control get +1/+1 and gain lifelink until end of turn. Untap those creatures. SVar:DBUntapAll:DB$ UntapAll | ValidCards$ Creature.YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/tenacity.jpg Oracle:Creatures you control get +1/+1 and gain lifelink until end of turn. Untap those creatures. diff --git a/forge-gui/res/cardsfolder/w/war_flare.txt b/forge-gui/res/cardsfolder/w/war_flare.txt index d37c9513d3a..ccff1422312 100644 --- a/forge-gui/res/cardsfolder/w/war_flare.txt +++ b/forge-gui/res/cardsfolder/w/war_flare.txt @@ -1,7 +1,7 @@ Name:War Flare ManaCost:2 R W Types:Instant -A:SP$ PumpAll | Cost$ 2 R W | ValidCards$ Creature.YouCtrl | NumAtt$ +2 | NumDef$ +1 | SubAbility$ DBUntapAll | SpellDescription$ Creatures you control get +2/+1 until end of turn. Untap those creatures. +A:SP$ PumpAll | Cost$ 2 R W | ValidCards$ Creature.YouCtrl | NumAtt$ +2 | NumDef$ +1 | SubAbility$ DBUntapAll | AILogic$ UntapCombatTrick | SpellDescription$ Creatures you control get +2/+1 until end of turn. Untap those creatures. SVar:DBUntapAll:DB$ UntapAll | ValidCards$ Creature.YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/war_flare.jpg Oracle:Creatures you control get +2/+1 until end of turn. Untap those creatures. From 152eedd1b80f53a4aea1a12b3adfb8acf86c7ea9 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 23 Nov 2018 09:29:27 +0300 Subject: [PATCH 207/901] - Fixed Isareth the Awakener. - Added an AI hint to Blood Divination. --- forge-gui/res/cardsfolder/b/blood_divination.txt | 1 + forge-gui/res/cardsfolder/i/isareth_the_awakener.txt | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/b/blood_divination.txt b/forge-gui/res/cardsfolder/b/blood_divination.txt index 4fbd5ee5aa0..405c5568df5 100644 --- a/forge-gui/res/cardsfolder/b/blood_divination.txt +++ b/forge-gui/res/cardsfolder/b/blood_divination.txt @@ -2,4 +2,5 @@ Name:Blood Divination ManaCost:3 B Types:Sorcery A:SP$ Draw | Cost$ 3 B Sac<1/Creature> | NumCards$ 3 | SpellDescription$ As an additional cost to cast this spell, sacrifice a creature. Draw three cards. +SVar:AIPreference:SacCost$Creature.token,Creature.cmcLE3 Oracle:As an additional cost to cast this spell, sacrifice a creature.\nDraw three cards. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/i/isareth_the_awakener.txt b/forge-gui/res/cardsfolder/i/isareth_the_awakener.txt index 33cee6ea334..060c25783fb 100644 --- a/forge-gui/res/cardsfolder/i/isareth_the_awakener.txt +++ b/forge-gui/res/cardsfolder/i/isareth_the_awakener.txt @@ -4,7 +4,8 @@ Types:Legendary Creature Human Wizard K:Deathtouch PT:3/3 T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigChange | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME attacks, you may pay {X}. If you do, return target creature card with converted mana cost X from your graveyard to the battlefield with a corpse counter on it. If that creature would leave the battlefield, exile it instead of putting it anywhere else. -SVar:TrigChange:AB$ ChangeZone | Cost$ X | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouOwn | TgtPromp$ Choose target creature with CMC equal to X. | References$ X | RememberTargets$ True | AILogic$ BeforeCombat | SubAbility$ DBPump |SpellDescription$ Return target creature card with converted mana cost X from your graveyard to the battlefield. +SVar:TrigChange:AB$ ChangeZone | Cost$ X | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouOwn | TgtPrompt$ Choose target creature with CMC equal to X. | References$ X | RememberTargets$ True | AILogic$ BeforeCombat | SubAbility$ DBPutCounter | SpellDescription$ Return target creature card with converted mana cost X from your graveyard to the battlefield. +SVar:DBPutCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ CORPSE | CounterNum$ 1 | SubAbility$ DBPump SVar:DBPump:DB$ Pump | Defined$ Remembered | LeaveBattlefield$ Exile SVar:X:Targeted$CardManaCost SVar:HasAttackEffect:TRUE From 1ab462f949b3b3a8ec6fc07f429fefa04c9f1557 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 17 Nov 2018 18:26:54 +0100 Subject: [PATCH 208/901] TriggerType: rename Unequip to Unattach --- .../java/forge/game/trigger/TriggerType.java | 2 +- ...iggerUnequip.java => TriggerUnattach.java} | 32 +++++++++---------- 2 files changed, 17 insertions(+), 17 deletions(-) rename forge-game/src/main/java/forge/game/trigger/{TriggerUnequip.java => TriggerUnattach.java} (61%) diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerType.java b/forge-game/src/main/java/forge/game/trigger/TriggerType.java index f5119f70fd8..3dc4cbf9052 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerType.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerType.java @@ -85,7 +85,7 @@ public enum TriggerType { Transformed(TriggerTransformed.class), TurnBegin(TriggerTurnBegin.class), TurnFaceUp(TriggerTurnFaceUp.class), - Unequip(TriggerUnequip.class), + Unattach(TriggerUnattach.class), Untaps(TriggerUntaps.class), Vote(TriggerVote.class); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerUnequip.java b/forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java similarity index 61% rename from forge-game/src/main/java/forge/game/trigger/TriggerUnequip.java rename to forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java index ba2f52ae518..8b96b06fd3f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerUnequip.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java @@ -17,18 +17,18 @@ */ package forge.game.trigger; +import forge.game.GameEntity; import forge.game.card.Card; import forge.game.spellability.SpellAbility; /** *

- * Trigger_Unequip class. + * Trigger_Unattach class. *

* * @author Forge - * @version $Id$ */ -public class TriggerUnequip extends Trigger { +public class TriggerUnattach extends Trigger { /** *

@@ -42,26 +42,26 @@ public class TriggerUnequip extends Trigger { * @param intrinsic * the intrinsic */ - public TriggerUnequip(final java.util.Map params, final Card host, final boolean intrinsic) { + public TriggerUnattach(final java.util.Map params, final Card host, final boolean intrinsic) { super(params, host, intrinsic); } /** {@inheritDoc} */ @Override public final boolean performTest(final java.util.Map runParams2) { - final Card equipped = (Card) runParams2.get("Card"); - final Card equipment = (Card) runParams2.get("Equipment"); + final GameEntity object = (GameEntity) runParams2.get("Object"); + final Card attach = (Card) runParams2.get("Attach"); - if (this.mapParams.containsKey("ValidCard")) { - if (!equipped.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard(), null)) { + if (hasParam("ValidObject")) { + if (!object.isValid(getParam("ValidObject").split(","), getHostCard().getController(), + getHostCard(), null)) { return false; } } - if (this.mapParams.containsKey("ValidEquipment")) { - if (!equipment.isValid(this.mapParams.get("ValidEquipment").split(","), this.getHostCard() - .getController(), this.getHostCard(), null)) { + if (hasParam("ValidAttachment")) { + if (!attach.isValid(getParam("ValidAttachment").split(","), getHostCard() + .getController(), getHostCard(), null)) { return false; } } @@ -72,15 +72,15 @@ public class TriggerUnequip extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject("Card", this.getRunParams().get("Card")); - sa.setTriggeringObject("Equipment", this.getRunParams().get("Equipment")); + sa.setTriggeringObject("Object", getRunParams().get("Object")); + sa.setTriggeringObject("Attach", getRunParams().get("Attach")); } @Override public String getImportantStackObjects(SpellAbility sa) { StringBuilder sb = new StringBuilder(); - sb.append("Equippee: ").append(sa.getTriggeringObject("Card")).append(", "); - sb.append("Equipment: ").append(sa.getTriggeringObject("Equipment")); + sb.append("Object: ").append(sa.getTriggeringObject("Object")).append(", "); + sb.append("Attachment: ").append(sa.getTriggeringObject("Attach")); return sb.toString(); } From 382e78536fa81e99e9c9cc636458bedd2dac90e3 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 17 Nov 2018 18:27:27 +0100 Subject: [PATCH 209/901] cards: updated Unattach trigger --- forge-gui/res/cardsfolder/c/captains_hook.txt | 4 ++-- forge-gui/res/cardsfolder/g/grafted_exoskeleton.txt | 4 ++-- forge-gui/res/cardsfolder/g/grafted_wargear.txt | 4 ++-- forge-gui/res/cardsfolder/s/stitchers_graft.txt | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/forge-gui/res/cardsfolder/c/captains_hook.txt b/forge-gui/res/cardsfolder/c/captains_hook.txt index 9ef9fda98f0..1a506bdc074 100644 --- a/forge-gui/res/cardsfolder/c/captains_hook.txt +++ b/forge-gui/res/cardsfolder/c/captains_hook.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact Equipment K:Equip:1 S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddToughness$ 0 | AddType$ Pirate | AddKeyword$ Menace | Description$ Equipped creature gets +2/+0, has menace, and is a Pirate in addition to its other creature types. -T:Mode$ Unequip | ValidEquipment$ Card.Self | ValidCard$ Permanent | Execute$ TrigDestroy | TriggerDescription$ Whenever CARDNAME becomes unattached from a permanent, destroy that permanent. -SVar:TrigDestroy:DB$Destroy | Defined$ TriggeredCard +T:Mode$ Unequip | ValidAttachment$ Card.Self | ValidObject$ Permanent | Execute$ TrigDestroy | TriggerDescription$ Whenever CARDNAME becomes unattached from a permanent, destroy that permanent. +SVar:TrigDestroy:DB$Destroy | Defined$ TriggeredObject Oracle:Equipped creature gets +2/+0, has menace, and is a Pirate in addition to its other creature types.\nWhenever Captain's Hook becomes unattached from a permanent, destroy that permanent.\nEquip {1} diff --git a/forge-gui/res/cardsfolder/g/grafted_exoskeleton.txt b/forge-gui/res/cardsfolder/g/grafted_exoskeleton.txt index bac21cc7ee6..14da4f33036 100644 --- a/forge-gui/res/cardsfolder/g/grafted_exoskeleton.txt +++ b/forge-gui/res/cardsfolder/g/grafted_exoskeleton.txt @@ -3,7 +3,7 @@ ManaCost:4 Types:Artifact Equipment K:Equip:2 S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Infect | Description$ Equipped creature gets +2/+2 and has infect. (It deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -T:Mode$ Unequip | ValidEquipment$ Card.Self | ValidCard$ Permanent | Execute$ TrigSac | TriggerDescription$ Whenever CARDNAME becomes unattached from a permanent, sacrifice that permanent. -SVar:TrigSac:DB$Sacrifice | Defined$ You | SacValid$ TriggeredCard +T:Mode$ Unattach | ValidAttachment$ Card.Self | ValidObject$ Permanent | Execute$ TrigSac | TriggerDescription$ Whenever CARDNAME becomes unattached from a permanent, sacrifice that permanent. +SVar:TrigSac:DB$Sacrifice | Defined$ You | SacValid$ TriggeredObject SVar:Picture:http://www.wizards.com/global/images/magic/general/grafted_exoskeleton.jpg Oracle:Equipped creature gets +2/+2 and has infect. (It deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.)\nWhenever Grafted Exoskeleton becomes unattached from a permanent, sacrifice that permanent.\nEquip {2} diff --git a/forge-gui/res/cardsfolder/g/grafted_wargear.txt b/forge-gui/res/cardsfolder/g/grafted_wargear.txt index 4451d735778..b3a9905b342 100644 --- a/forge-gui/res/cardsfolder/g/grafted_wargear.txt +++ b/forge-gui/res/cardsfolder/g/grafted_wargear.txt @@ -3,7 +3,7 @@ ManaCost:3 Types:Artifact Equipment K:Equip:0 S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 3 | AddToughness$ 2 | Description$ Equipped creature gets +3/+2. -T:Mode$ Unequip | ValidEquipment$ Card.Self | ValidCard$ Permanent | Execute$ TrigSac | TriggerDescription$ Whenever CARDNAME becomes unattached from a permanent, sacrifice that permanent. -SVar:TrigSac:DB$Sacrifice | Defined$ You | SacValid$ TriggeredCard +T:Mode$ Unattach | ValidAttachment$ Card.Self | ValidObject$ Permanent | Execute$ TrigSac | TriggerDescription$ Whenever CARDNAME becomes unattached from a permanent, sacrifice that permanent. +SVar:TrigSac:DB$Sacrifice | Defined$ You | SacValid$ TriggeredObject SVar:Picture:http://www.wizards.com/global/images/magic/general/grafted_wargear.jpg Oracle:Equipped creature gets +3/+2.\nWhenever Grafted Wargear becomes unattached from a permanent, sacrifice that permanent.\nEquip {0} ({0}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/s/stitchers_graft.txt b/forge-gui/res/cardsfolder/s/stitchers_graft.txt index 57171f5ffee..1aaf83ba533 100644 --- a/forge-gui/res/cardsfolder/s/stitchers_graft.txt +++ b/forge-gui/res/cardsfolder/s/stitchers_graft.txt @@ -4,8 +4,8 @@ Types:Artifact Equipment S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 3 | AddToughness$ 3 | Description$ Equipped creature gets +3/+3. T:Mode$ Attacks | ValidCard$ Card.EquippedBy | Execute$ StayTapped | TriggerDescription$ Whenever equipped creature attacks, it doesn't untap during its controller's next untap step. SVar:StayTapped:DB$Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ TriggeredAttacker | Permanent$ True -T:Mode$ Unequip | ValidEquipment$ Card.Self | ValidCard$ Permanent | Execute$ TrigSac | TriggerDescription$ Whenever CARDNAME becomes unattached from a permanent, sacrifice that permanent. -SVar:TrigSac:DB$SacrificeAll | Defined$ TriggeredCard +T:Mode$ Unattach | ValidAttachment$ Card.Self | ValidObject$ Permanent | Execute$ TrigSac | TriggerDescription$ Whenever CARDNAME becomes unattached from a permanent, sacrifice that permanent. +SVar:TrigSac:DB$Sacrifice | Defined$ You | SacValid$ TriggeredObject K:Equip:2 SVar:Picture:http://www.wizards.com/global/images/magic/general/stitchers_graft.jpg Oracle:Equipped creature gets +3/+3.\nWhenever equipped creature attacks, it doesn't untap during its controller's next untap step.\nWhenever Stitcher's Graft becomes unattached from a permanent, sacrifice that permanent.\nEquip {2} From 2f913724cbee93b12226394745c81773ddfe054d Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 17 Nov 2018 18:50:43 +0100 Subject: [PATCH 210/901] Attached: combine Enchant+Equip+Fortify --- .../src/main/java/forge/ai/AiController.java | 2 +- .../src/main/java/forge/ai/ComputerUtil.java | 4 +- .../main/java/forge/ai/ComputerUtilCard.java | 8 +- .../main/java/forge/ai/ComputerUtilCost.java | 2 +- .../src/main/java/forge/ai/GameState.java | 34 +- .../main/java/forge/ai/ability/AttachAi.java | 6 +- .../java/forge/ai/ability/ChangeZoneAi.java | 6 +- .../java/forge/ai/ability/CountersPutAi.java | 2 +- .../java/forge/ai/ability/DamageAiBase.java | 2 +- .../main/java/forge/ai/ability/DestroyAi.java | 2 +- .../java/forge/ai/ability/PermanentAi.java | 4 +- .../java/forge/ai/simulation/GameCopier.java | 14 +- .../src/main/java/forge/game/GameAction.java | 159 +------ .../src/main/java/forge/game/GameEntity.java | 169 ++++--- .../main/java/forge/game/GameEntityView.java | 19 +- .../game/ability/effects/AttachEffect.java | 30 +- .../ability/effects/ChangeZoneEffect.java | 83 +--- .../ability/effects/CopyPermanentEffect.java | 21 +- .../game/ability/effects/DestroyEffect.java | 4 +- .../game/ability/effects/TokenEffect.java | 43 +- .../ability/effects/UnattachAllEffect.java | 21 +- .../game/ability/effects/UnattachEffect.java | 10 +- .../ability/effects/ZoneExchangeEffect.java | 4 +- .../src/main/java/forge/game/card/Card.java | 437 +++++++++--------- .../java/forge/game/card/CardFactory.java | 8 +- .../java/forge/game/card/CardPredicates.java | 11 +- .../java/forge/game/card/CardProperty.java | 16 +- .../main/java/forge/game/card/CardUtil.java | 42 +- .../main/java/forge/game/card/CardView.java | 40 +- .../main/java/forge/game/combat/Combat.java | 5 +- .../java/forge/game/cost/CostUnattach.java | 6 +- .../game/event/GameEventCardAttachment.java | 12 +- .../src/main/java/forge/game/phase/Untap.java | 11 +- .../main/java/forge/game/player/Player.java | 80 ++-- .../forge/trackable/TrackableProperty.java | 8 +- .../forge/screens/match/TargetingOverlay.java | 48 +- .../main/java/forge/view/arcane/PlayArea.java | 46 +- .../ai/simulation/GameSimulatorTest.java | 10 +- .../gamesimulationtests/util/GameWrapper.java | 26 +- .../main/java/forge/card/CardDetailUtil.java | 38 +- .../src/main/java/forge/quest/QuestUtil.java | 2 +- 41 files changed, 576 insertions(+), 919 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 2982df30668..f06378720bd 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -767,7 +767,7 @@ public class AiController { // will need actual logic that determines if the enchantment is able // to disable the permanent or it's still functional and a duplicate is unneeded. boolean disabledByEnemy = false; - for (Card card2 : card.getEnchantedBy(false)) { + for (Card card2 : card.getEnchantedBy()) { if (card2.getOwner() != player) { disabledByEnemy = true; } diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index 8c085c493d9..703016b4c81 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -823,7 +823,7 @@ public class ComputerUtil { if (c != null && c.isEnchanted()) { // TODO: choose "worst" controlled enchanting Aura - for (Card aura : c.getEnchantedBy(false)) { + for (Card aura : c.getEnchantedBy()) { if (aura.getController().equals(c.getController()) && remaining.contains(aura)) { return aura; } @@ -2924,7 +2924,7 @@ public class ComputerUtil { if (sa.getParam("AITgts").equals("BetterThanSource")) { int value = ComputerUtilCard.evaluateCreature(source); if (source.isEnchanted()) { - for (Card enc : source.getEnchantedBy(false)) { + for (Card enc : source.getEnchantedBy()) { if (enc.getController().equals(ai)) { value += 100; // is 100 per AI's own aura enough? } diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index 8d1883aaafc..1eb1fd6913e 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -585,7 +585,7 @@ public class ComputerUtilCard { // Add all cost of all auras with the same controller if (card.isEnchanted()) { - final List auras = CardLists.filterControlledBy(card.getEnchantedBy(false), card.getController()); + final List auras = CardLists.filterControlledBy(card.getEnchantedBy(), card.getController()); curCMC += Aggregates.sum(auras, CardPredicates.Accessors.fnGetCmc) + auras.size(); } @@ -833,7 +833,7 @@ public class ComputerUtilCard { int score = tmp.isTapped() ? 2 : 0; score += tmp.isBasicLand() ? 1 : 0; score -= tmp.isCreature() ? 4 : 0; - for (Card aura : tmp.getEnchantedBy(false)) { + for (Card aura : tmp.getEnchantedBy()) { if (aura.getController().isOpponentOf(tmp.getController())) { score += 5; } else { @@ -857,7 +857,7 @@ public class ComputerUtilCard { int score = tmp.isTapped() ? 0 : 2; score += tmp.isBasicLand() ? 2 : 0; score -= tmp.isCreature() ? 4 : 0; - score -= 5 * tmp.getEnchantedBy(false).size(); + score -= 5 * tmp.getEnchantedBy().size(); if (score >= maxScore) { land = tmp; @@ -1033,7 +1033,7 @@ public class ComputerUtilCard { // interrupt 3: two for one = good if (c.isEnchanted()) { boolean myEnchants = false; - for (Card enc : c.getEnchantedBy(false)) { + for (Card enc : c.getEnchantedBy()) { if (enc.getOwner().equals(ai)) { myEnchants = true; break; diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java index e9a0ccee4e8..dd1a4541c33 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java @@ -300,7 +300,7 @@ public class ComputerUtilCost { if (!important) { return false; } - if (!CardLists.filterControlledBy(source.getEnchantedBy(false), source.getController()).isEmpty()) { + if (!CardLists.filterControlledBy(source.getEnchantedBy(), source.getController()).isEmpty()) { return false; } continue; diff --git a/forge-ai/src/main/java/forge/ai/GameState.java b/forge-ai/src/main/java/forge/ai/GameState.java index 522281d6884..cd93143f61d 100644 --- a/forge-ai/src/main/java/forge/ai/GameState.java +++ b/forge-ai/src/main/java/forge/ai/GameState.java @@ -196,9 +196,7 @@ public abstract class GameState { cardsReferencedByID.add(card.getExiledWith()); } if (zone == ZoneType.Battlefield) { - if (!card.getEnchantedBy(false).isEmpty() - || !card.getEquippedBy(false).isEmpty() - || !card.getFortifiedBy(false).isEmpty()) { + if (!card.getAttachedBy().isEmpty()) { // Remember the ID of cards that have attachments cardsReferencedByID.add(card); } @@ -290,12 +288,8 @@ public abstract class GameState { } else if (c.getCurrentStateName().equals(CardStateName.Meld)) { newText.append("|Meld"); } - if (c.getEquipping() != null) { - newText.append("|Attaching:").append(c.getEquipping().getId()); - } else if (c.getFortifying() != null) { - newText.append("|Attaching:").append(c.getFortifying().getId()); - } else if (c.getEnchantingCard() != null) { - newText.append("|Attaching:").append(c.getEnchantingCard().getId()); + if (c.isAttaching()) { + newText.append("|Attaching:").append(c.getAttaching().getId()); } if (c.getEnchantingPlayer() != null) { // TODO: improve this for game states with more than two players @@ -959,25 +953,15 @@ public abstract class GameState { // Unattach all permanents first for(Entry entry : cardToAttachId.entrySet()) { Card attachedTo = idToCard.get(entry.getValue()); - - attachedTo.unEnchantAllCards(); - attachedTo.unEquipAllCards(); - for (Card c : attachedTo.getFortifiedBy(true)) { - attachedTo.unFortifyCard(c); - } + attachedTo.unAttachAllCards(); } // Attach permanents by ID for(Entry entry : cardToAttachId.entrySet()) { Card attachedTo = idToCard.get(entry.getValue()); Card attacher = entry.getKey(); - - if (attacher.isEquipment()) { - attacher.equipCard(attachedTo); - } else if (attacher.isAura()) { - attacher.enchantEntity(attachedTo); - } else if (attacher.isFortified()) { - attacher.fortifyCard(attachedTo); + if (attacher.isAttachment()) { + attacher.attachEntity(attachedTo); } } @@ -988,7 +972,7 @@ public abstract class GameState { Game game = attacher.getGame(); Player attachedTo = entry.getValue() == TARGET_AI ? game.getPlayers().get(1) : game.getPlayers().get(0); - attacher.enchantEntity(attachedTo); + attacher.attachEntity(attachedTo); } } @@ -1043,7 +1027,9 @@ public abstract class GameState { if (c.isAura()) { // dummy "enchanting" to indicate that the card will be force-attached elsewhere // (will be overridden later, so the actual value shouldn't matter) - c.setEnchanting(c); + + //FIXME it shouldn't be able to attach itself + c.setAttaching(c); } if (cardsWithoutETBTrigs.contains(c)) { diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index 828103b71b5..6deb3089770 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -408,7 +408,7 @@ public class AttachAi extends SpellAbilityAi { return true; } - final Iterable auras = c.getEnchantedBy(false); + final Iterable auras = c.getEnchantedBy(); final Iterator itr = auras.iterator(); while (itr.hasNext()) { final Card aura = itr.next(); @@ -1276,7 +1276,7 @@ public class AttachAi extends SpellAbilityAi { return null; } // Don't fortify if already fortifying - if (attachSource.getFortifying() != null && attachSource.getFortifying().getController() == aiPlayer) { + if (attachSource.getAttachingCard() != null && attachSource.getAttachingCard().getController() == aiPlayer) { return null; } @@ -1491,7 +1491,7 @@ public class AttachAi extends SpellAbilityAi { return false; } // Also don't play if it would destroy own Aura - for (Card c : card.getEnchantedBy(false)) { + for (Card c : card.getEnchantedBy()) { if ((c.getController().equals(ai)) && (c.isOfColor(cc))) { 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 839481ced71..e5c52128bef 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -159,7 +159,7 @@ public class ChangeZoneAi extends SpellAbilityAi { return true; // debuffed by opponent's auras to the level that it becomes useless } int delta = 0; - for (Card enc : sa.getHostCard().getEnchantedBy(false)) { + for (Card enc : sa.getHostCard().getEnchantedBy()) { if (enc.getController().isOpponentOf(aiPlayer)) { delta--; } else { @@ -961,7 +961,7 @@ public class ChangeZoneAi extends SpellAbilityAi { list = CardLists.filter(list, new Predicate() { @Override public boolean apply(final Card c) { - for (Card aura : c.getEnchantedBy(false)) { + for (Card aura : c.getEnchantedBy()) { if (aura.getController().isOpponentOf(ai)) { return true; } else { @@ -1054,7 +1054,7 @@ public class ChangeZoneAi extends SpellAbilityAi { list = CardLists.filter(list, new Predicate() { @Override public boolean apply(final Card c) { - for (Card aura : c.getEnchantedBy(false)) { + for (Card aura : c.getEnchantedBy()) { if (c.getOwner().isOpponentOf(ai) && aura.getController().equals(ai)) { return false; } diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java index 38b1c87d56c..920146771ff 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -99,7 +99,7 @@ public class CountersPutAi extends SpellAbilityAi { if (sa.hasParam("LevelUp")) { // creatures enchanted by curse auras have low priority if (ph.getPhase().isBefore(PhaseType.MAIN2)) { - for (Card aura : source.getEnchantedBy(false)) { + for (Card aura : source.getEnchantedBy()) { if (aura.getController().isOpponentOf(ai)) { return false; } 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 49f864cd4e5..1b2dc7ee7fd 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java @@ -27,7 +27,7 @@ public abstract class DamageAiBase extends SpellAbilityAi { Card hostcard = sa.getHostCard(); boolean lifelink = hostcard.hasKeyword(Keyword.LIFELINK); if (!lifelink) { - for (Card ench : hostcard.getEnchantedBy(false)) { + for (Card ench : hostcard.getEnchantedBy()) { // Treat cards enchanted by older cards with "when enchanted creature deals damage, gain life" as if they had lifelink. if (ench.hasSVar("LikeLifeLink")) { if ("True".equals(ench.getSVar("LikeLifeLink"))) { 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 731d9279677..06705baf8bf 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java @@ -273,7 +273,7 @@ public class DestroyAi extends SpellAbilityAi { } else { // Don't destroy stolen permanents when the stealing aura can be destroyed if (choice.getOwner() == ai) { - for (Card aura : choice.getEnchantedBy(false)) { + for (Card aura : choice.getEnchantedBy()) { SpellAbility sp = aura.getFirstSpellAbility(); if (sp != null && "GainControl".equals(sp.getParam("AILogic")) && aura.getController() != ai && sa.canTarget(aura)) { diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java index ad7f587a88a..d0579d313ad 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java @@ -192,10 +192,10 @@ public class PermanentAi extends SpellAbilityAi { // be better to have a pristine copy of the card - might not always be a correct assumption, but sounds // like a reasonable default for some cards). for (Card c : ctrld) { - if (c.getEnchantedBy(false).isEmpty()) { + if (c.getEnchantedBy().isEmpty()) { numControlled++; } else { - for (Card att : c.getEnchantedBy(false)) { + for (Card att : c.getEnchantedBy()) { if (!att.getController().isOpponentOf(ai)) { numControlled++; } 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 6324ff494e1..d81bf84bdb9 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java +++ b/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java @@ -13,6 +13,7 @@ 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; @@ -204,19 +205,16 @@ public class GameCopier { } } gameObjectMap = new CopiedGameObjectMap(newGame); + for (Card card : origGame.getCardsIn(ZoneType.Battlefield)) { Card otherCard = cardMap.get(card); otherCard.setTimestamp(card.getTimestamp()); otherCard.setSickness(card.hasSickness()); otherCard.setState(card.getCurrentStateName(), false); - if (card.isEnchanting()) { - otherCard.setEnchanting(gameObjectMap.map(card.getEnchanting())); - } - if (card.isEquipping()) { - otherCard.equipCard(cardMap.get(card.getEquipping())); - } - if (card.isFortifying()) { - otherCard.setFortifying(cardMap.get(card.getFortifying())); + if (card.isAttaching()) { + GameEntity ge = gameObjectMap.map(card.getAttaching()); + otherCard.setAttaching(ge); + ge.addAttachedBy(otherCard); } if (card.getCloneOrigin() != null) { otherCard.setCloneOrigin(cardMap.get(card.getCloneOrigin())); diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 076aa493db5..c36cf6ed7a3 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -36,7 +36,6 @@ import forge.game.replacement.ReplacementResult; import forge.game.spellability.AbilitySub; import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbilityPredicates; -import forge.game.spellability.TargetRestrictions; import forge.game.staticability.StaticAbility; import forge.game.staticability.StaticAbilityLayer; import forge.game.trigger.Trigger; @@ -504,45 +503,12 @@ public class GameAction { } private static void unattachCardLeavingBattlefield(final Card copied) { - // Handle unequipping creatures - if (copied.isEquipped()) { - for (final Card equipment : copied.getEquippedBy(true)) { - if (equipment.isInPlay()) { - equipment.unEquipCard(copied); - } - } - } - // Handle unfortifying lands - if (copied.isFortified()) { - for (final Card f : copied.getFortifiedBy(true)) { - if (f.isInPlay()) { - f.unFortifyCard(copied); - } - } - } - // equipment moving off battlefield - if (copied.isEquipping()) { - final Card equippedCreature = copied.getEquipping(); - if (equippedCreature.isInPlay()) { - copied.unEquipCard(equippedCreature); - } - } - // fortifications moving off battlefield - if (copied.isFortifying()) { - final Card fortifiedLand = copied.getFortifying(); - if (fortifiedLand.isInPlay()) { - copied.unFortifyCard(fortifiedLand); - } - } - // remove enchantments from creatures - if (copied.isEnchanted()) { - for (final Card aura : copied.getEnchantedBy(true)) { - aura.unEnchantEntity(copied); - } - } + // remove attachments from creatures + copied.unAttachAllCards(); + // unenchant creature if moving aura - if (copied.isEnchanting()) { - copied.unEnchantEntity(copied.getEnchanting()); + if (copied.isAttaching()) { + copied.unAttachEntity(copied.getAttaching()); } } @@ -1006,11 +972,10 @@ public class GameAction { } checkAgain |= stateBasedAction_Saga(c); - checkAgain |= stateBasedAction704_5n(c); // Auras attached to illegal or not attached go to graveyard - checkAgain |= stateBasedAction704_5p(c); // Equipment and Fortifications + checkAgain |= stateBasedAction704_attach(c); // Attachment - if (c.isCreature() && c.isEnchanting()) { // Rule 704.5q - Creature attached to an object or player, becomes unattached - c.unEnchantEntity(c.getEnchanting()); + if (c.isCreature() && c.isAttaching()) { // Rule 704.5q - Creature attached to an object or player, becomes unattached + c.unAttachEntity(c.getAttaching()); checkAgain = true; } @@ -1124,110 +1089,34 @@ public class GameAction { return checkAgain; } - private boolean stateBasedAction704_5n(Card c) { + private boolean stateBasedAction704_attach(Card c) { boolean checkAgain = false; - if (!c.isAura()) { - return false; - } - // Check if Card Aura is attached to is a legal target - final GameEntity entity = c.getEnchanting(); - SpellAbility sa = c.getFirstAttachSpell(); - - TargetRestrictions tgt = null; - if (sa != null) { - tgt = sa.getTargetRestrictions(); - } - - if (entity instanceof Card) { - final Card perm = (Card) entity; - final ZoneType tgtZone = tgt.getZone().get(0); - - if (!perm.isInZone(tgtZone) || !perm.canBeEnchantedBy(c, true) || (perm.isPhasedOut() && !c.isPhasedOut())) { - c.unEnchantEntity(perm); - moveToGraveyard(c, null, null); - checkAgain = true; - } - } else if (entity instanceof Player) { - final Player pl = (Player) entity; - boolean invalid = false; - - if (!game.getPlayers().contains(pl)) { - // lost player can't have Aura on it - invalid = true; - } else if (tgt.canOnlyTgtOpponent() && !c.getController().isOpponentOf(pl)) { - invalid = true; - } - else if (pl.hasProtectionFrom(c)) { - invalid = true; - } - if (invalid) { - c.unEnchantEntity(pl); - moveToGraveyard(c, null, null); + if (c.isAttaching()) { + final GameEntity ge = c.getAttaching(); + if (!ge.canBeAttachedBy(c)) { + c.unAttachEntity(ge); checkAgain = true; } } - if (c.isInPlay() && !c.isEnchanting()) { + if (c.isAttachedBy()) { + for (final Card attach : Lists.newArrayList(c.getAttachedBy())) { + if (!attach.isInPlay()) { + attach.unAttachEntity(c); + checkAgain = true; + } + } + } + + // cleanup aura + if (c.isAura() && c.isInPlay() && !c.isEnchanting()) { moveToGraveyard(c, null, null); checkAgain = true; } return checkAgain; } - private boolean stateBasedAction704_5p(Card c) { - boolean checkAgain = false; - if (c.isEquipped()) { - for (final Card equipment : c.getEquippedBy(true)) { - if (!equipment.isInPlay()) { - equipment.unEquipCard(c); - checkAgain = true; - } - } - } - - if (c.isFortified()) { - for (final Card f : c.getFortifiedBy(true)) { - if (!f.isInPlay()) { - f.unFortifyCard(c); - checkAgain = true; - } - } - } - - if (c.isEquipping()) { - final Card equippedCreature = c.getEquipping(); - if (!equippedCreature.isCreature() || !equippedCreature.isInPlay() - || !equippedCreature.canBeEquippedBy(c) - || (equippedCreature.isPhasedOut() && !c.isPhasedOut()) - || !c.isEquipment()) { - c.unEquipCard(equippedCreature); - checkAgain = true; - } - // make sure any equipment that has become a creature stops equipping - if (c.isCreature()) { - c.unEquipCard(equippedCreature); - checkAgain = true; - } - } - - if (c.isFortifying()) { - final Card fortifiedLand = c.getFortifying(); - if (!fortifiedLand.isLand() || !fortifiedLand.isInPlay() - || (fortifiedLand.isPhasedOut() && !c.isPhasedOut()) - || !c.isFortification()) { - c.unFortifyCard(fortifiedLand); - checkAgain = true; - } - // make sure any fortification that has become a creature stops fortifying - if (c.isCreature()) { - c.unFortifyCard(fortifiedLand); - checkAgain = true; - } - } - return checkAgain; - } - private boolean stateBasedAction704_5r(Card c) { boolean checkAgain = false; int plusOneCounters = c.getCounters(CounterType.P1P1); diff --git a/forge-game/src/main/java/forge/game/GameEntity.java b/forge-game/src/main/java/forge/game/GameEntity.java index 37a27344866..e040040f2c6 100644 --- a/forge-game/src/main/java/forge/game/GameEntity.java +++ b/forge-game/src/main/java/forge/game/GameEntity.java @@ -6,12 +6,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ @@ -21,9 +21,10 @@ import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; import forge.game.card.CardDamageMap; +import forge.game.card.CardLists; +import forge.game.card.CardPredicates; import forge.game.card.CounterType; import forge.game.event.GameEventCardAttachment; -import forge.game.event.GameEventCardAttachment.AttachMethod; import forge.game.keyword.Keyword; import forge.game.player.Player; import forge.game.spellability.SpellAbility; @@ -33,6 +34,7 @@ import forge.util.collect.FCollection; import java.util.Map; +import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -40,7 +42,7 @@ public abstract class GameEntity extends GameObject implements IIdentifiable { protected final int id; private String name = ""; private int preventNextDamage = 0; - private CardCollection enchantedBy; + protected CardCollection attachedBy; private Map> preventionShieldsWithEffects = Maps.newTreeMap(); protected Map counters = Maps.newEnumMap(CounterType.class); @@ -93,7 +95,7 @@ public abstract class GameEntity extends GameObject implements IIdentifiable { source.getDamageHistory().registerCombatDamage(this); } // damage prevention is already checked - return addCombatDamageBase(damageToDo, source, damageMap); + return addCombatDamageBase(damageToDo, source, damageMap); } protected int addCombatDamageBase(final int damage, final Card source, CardDamageMap damageMap) { @@ -204,17 +206,17 @@ public abstract class GameEntity extends GameObject implements IIdentifiable { restDamage = 0; } - // if damage is greater than restDamage, damage was prevented + // if damage is greater than restDamage, damage was prevented if (damage > restDamage) { int prevent = damage - restDamage; preventMap.put(source, this, damage - restDamage); - + final Map runParams = Maps.newHashMap(); runParams.put("DamageTarget", this); runParams.put("DamageAmount", prevent); runParams.put("DamageSource", source); runParams.put("IsCombatDamage", isCombat); - + getGame().getTriggerHandler().runTrigger(TriggerType.DamagePrevented, runParams, false); } @@ -280,77 +282,140 @@ public abstract class GameEntity extends GameObject implements IIdentifiable { public abstract boolean hasKeyword(final String keyword); public abstract boolean hasKeyword(final Keyword keyword); - // GameEntities can now be Enchanted - public final CardCollectionView getEnchantedBy(boolean allowModify) { - return CardCollection.getView(enchantedBy, allowModify); + public final CardCollectionView getEnchantedBy() { + if (attachedBy == null) { + return CardCollection.EMPTY; + } + // enchanted means attached by Aura + return CardLists.filter(attachedBy, CardPredicates.Presets.AURA); } - public final void setEnchantedBy(final CardCollection cards) { - enchantedBy = cards; - getView().updateEnchantedBy(this); + + public final CardCollectionView getAttachedBy() { + return CardCollection.getView(attachedBy); } - public final void setEnchantedBy(final Iterable cards) { + + public final void setAttachedBy(final Iterable cards) { if (cards == null) { - enchantedBy = null; + attachedBy = null; } else { - enchantedBy = new CardCollection(cards); + attachedBy = new CardCollection(cards); } - getView().updateEnchantedBy(this); + + getView().updateAttachedBy(this); } + + public final boolean isAttachedBy() { + return FCollection.hasElements(attachedBy); + } + public final boolean isEnchanted() { - return FCollection.hasElements(enchantedBy); + if (attachedBy == null) { + return false; + } + + // enchanted means attached by Aura + return CardLists.count(attachedBy, CardPredicates.Presets.AURA) > 0; + } + + public final boolean isAttachedBy(Card c) { + return FCollection.hasElement(attachedBy, c); } public final boolean isEnchantedBy(Card c) { - return FCollection.hasElement(enchantedBy, c); + // Rule 303.4k Even if c is no Aura it still counts + return isAttachedBy(c); + } + + public final boolean isAttachedBy(final String cardName) { + if (attachedBy == null) { + return false; + } + return CardLists.count(getAttachedBy(), CardPredicates.nameEquals(cardName)) > 0; } public final boolean isEnchantedBy(final String cardName) { - for (final Card aura : getEnchantedBy(false)) { - if (aura.getName().equals(cardName)) { - return true; - } + // Rule 303.4k Even if c is no Aura it still counts + return isAttachedBy(cardName); + } + + public final void addAttachedBy(final Card c) { + if (attachedBy == null) { + attachedBy = new CardCollection(); } + + if (attachedBy.add(c)) { + getView().updateAttachedBy(this); + getGame().fireEvent(new GameEventCardAttachment(c, null, this)); + } + } + + public final void removeAttachedBy(final Card c) { + if (attachedBy == null) { return; } + + if (attachedBy.remove(c)) { + if (attachedBy.isEmpty()) { + attachedBy = null; + } + getView().updateAttachedBy(this); + getGame().fireEvent(new GameEventCardAttachment(c, this, null)); + } + } + + public final void unAttachAllCards() { + for (Card c : Lists.newArrayList(getAttachedBy())) { + c.unAttachEntity(this); + } + } + + public boolean canBeAttachedBy(final Card attach) { + return canBeAttachedBy(attach, false); + } + + public boolean canBeAttachedBy(final Card attach, boolean checkSBA) { + // master mode + if (!attach.isAttachment()) { + return false; + } + + if (attach.isAura() && !canBeEnchantedBy(attach, checkSBA)) { + return false; + } + if (attach.isEquipment() && !canBeEquippedBy(attach)) { + return false; + } + if (attach.isFortification() && !canBeFortifiedBy(attach)) { + return false; + } + return true; + } + + public boolean canBeEquippedBy(final Card aura) { return false; } - public final void addEnchantedBy(final Card c) { - if (enchantedBy == null) { - enchantedBy = new CardCollection(); - } - if (enchantedBy.add(c)) { - getView().updateEnchantedBy(this); - getGame().fireEvent(new GameEventCardAttachment(c, null, this, AttachMethod.Enchant)); - } - } - public final void removeEnchantedBy(final Card c) { - if (enchantedBy == null) { return; } - if (enchantedBy.remove(c)) { - if (enchantedBy.isEmpty()) { - enchantedBy = null; - } - getView().updateEnchantedBy(this); - getGame().fireEvent(new GameEventCardAttachment(c, this, null, AttachMethod.Enchant)); - } - } - public final void unEnchantAllCards() { - if (isEnchanted()) { - for (Card c : getEnchantedBy(true)) { - c.unEnchantEntity(this); - } - } + public boolean canBeFortifiedBy(final Card aura) { + return false; } - public boolean canBeEnchantedBy(final Card aura) { + public boolean canBeEnchantedBy(final Card aura, final boolean checkSBA) { + if (!aura.isAura()) { + return false; + } + SpellAbility sa = aura.getFirstAttachSpell(); TargetRestrictions tgt = null; if (sa != null) { tgt = sa.getTargetRestrictions(); } - return !(hasProtectionFrom(aura) + return !(hasProtectionFrom(aura, checkSBA) || ((tgt != null) && !isValid(tgt.getValidTgts(), aura.getController(), aura, sa))); } - public abstract boolean hasProtectionFrom(final Card source); + public boolean hasProtectionFrom(final Card source) { + return hasProtectionFrom(source, false); + } + + public abstract boolean hasProtectionFrom(final Card source, final boolean checkSBA); // Counters! public boolean hasCounters() { diff --git a/forge-game/src/main/java/forge/game/GameEntityView.java b/forge-game/src/main/java/forge/game/GameEntityView.java index 6e97e5a68b0..46a8995ca3f 100644 --- a/forge-game/src/main/java/forge/game/GameEntityView.java +++ b/forge-game/src/main/java/forge/game/GameEntityView.java @@ -42,18 +42,19 @@ public abstract class GameEntityView extends TrackableObject { set(TrackableProperty.PreventNextDamage, e.getPreventNextDamageTotalShields()); } - public Iterable getEnchantedBy() { - return get(TrackableProperty.EnchantedBy); + public Iterable getAttachedBy() { + return get(TrackableProperty.AttachedBy); } - protected void updateEnchantedBy(GameEntity e) { - if (e.isEnchanted()) { - set(TrackableProperty.EnchantedBy, CardView.getCollection(e.getEnchantedBy(false))); + public boolean isAttached() { + return getAttachedBy() != null; + } + + protected void updateAttachedBy(GameEntity e) { + if (e.isAttachedBy()) { + set(TrackableProperty.AttachedBy, CardView.getCollection(e.getAttachedBy())); } else { - set(TrackableProperty.EnchantedBy, null); + set(TrackableProperty.AttachedBy, null); } } - public boolean isEnchanted() { - return getEnchantedBy() != null; - } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java index 952fb155e4f..9c3d1a72cba 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java @@ -27,7 +27,7 @@ public class AttachEffect extends SpellAbilityEffect { final Player ap = sa.getActivatingPlayer(); // The Spell_Permanent (Auras) version of this AF needs to // move the card into play before Attaching - + sa.getHostCard().setController(ap, 0); final Card c = ap.getGame().getAction().moveTo(ap.getZone(ZoneType.Battlefield), sa.getHostCard(), sa); sa.setHostCard(c); @@ -82,7 +82,7 @@ public class AttachEffect extends SpellAbilityEffect { /** * Handle attachment. - * + * * @param card * the card * @param o @@ -104,12 +104,8 @@ public class AttachEffect extends SpellAbilityEffect { if (c.canBeEnchantedBy(card)) { handleAura(card, c); } - } else if (card.isEquipment()) { - if(c.canBeEquippedBy(card)) { - card.equipCard(c); - } - } else if (card.isFortification()) { - card.fortifyCard(c); + } else { + card.attachEntity(c); } } else if (o instanceof Player) { // Currently, a few cards can enchant players @@ -124,42 +120,34 @@ public class AttachEffect extends SpellAbilityEffect { /** * Handle aura. - * + * * @param card * the card * @param tgt * the tgt */ public static void handleAura(final Card card, final GameEntity tgt) { - if (card.isEnchanting()) { - // If this Card is already Enchanting something - // Need to unenchant it, then clear out the commands - final GameEntity oldEnchanted = card.getEnchanting(); - oldEnchanted.removeEnchantedBy(card); - card.removeEnchanting(oldEnchanted); - } - final GameCommand onLeavesPlay = new GameCommand() { private static final long serialVersionUID = -639204333673364477L; @Override public void run() { - final GameEntity entity = card.getEnchanting(); + final GameEntity entity = card.getAttaching(); if (entity == null) { return; } - card.unEnchantEntity(entity); + card.unAttachEntity(entity); } }; // Command card.addLeavesPlayCommand(onLeavesPlay); - card.enchantEntity(tgt); + card.attachEntity(tgt); } /** * Attach aura on indirect enter battlefield. - * + * * @param source * the source * @return true, if successful diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index 0c0d1be8836..b67298bcc58 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -504,29 +504,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { } if (!list.isEmpty()) { Card attachedTo = player.getController().chooseSingleEntityForEffect(list, sa, tgtC + " - Select a card to attach to."); - if (tgtC.isAura()) { - if (tgtC.isEnchanting()) { - // If this Card is already Enchanting something, need - // to unenchant it, then clear out the commands - final GameEntity oldEnchanted = tgtC.getEnchanting(); - tgtC.removeEnchanting(oldEnchanted); - } - tgtC.enchantEntity(attachedTo); - } else if (tgtC.isEquipment()) { //Equipment - if (tgtC.isEquipping()) { - final Card oldEquiped = tgtC.getEquipping(); - if ( null != oldEquiped ) - tgtC.unEquipCard(oldEquiped); - } - tgtC.equipCard(attachedTo); - } else { // fortification - if (tgtC.isFortifying()) { - final Card oldFortified = tgtC.getFortifying(); - if( oldFortified != null ) - tgtC.unFortifyCard(oldFortified); - } - tgtC.fortifyCard(attachedTo); - } + tgtC.attachEntity(attachedTo); } else { // When it should enter the battlefield attached to an illegal permanent it fails continue; } @@ -536,15 +514,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { FCollectionView list = AbilityUtils.getDefinedPlayers(hostCard, sa.getParam("AttachedToPlayer"), sa); if (!list.isEmpty()) { Player attachedTo = player.getController().chooseSingleEntityForEffect(list, sa, tgtC + " - Select a player to attach to."); - if (tgtC.isAura()) { - if (tgtC.isEnchanting()) { - // If this Card is already Enchanting something, need - // to unenchant it, then clear out the commands - final GameEntity oldEnchanted = tgtC.getEnchanting(); - tgtC.removeEnchanting(oldEnchanted); - } - tgtC.enchantEntity(attachedTo); - } + tgtC.attachEntity(attachedTo); } else { // When it should enter the battlefield attached to an illegal player it fails continue; @@ -1022,42 +992,9 @@ public class ChangeZoneEffect extends SpellAbilityEffect { else { attachedTo = list.get(0); } - if (c.isAura()) { - if (c.isEnchanting()) { - // If this Card is already Enchanting something, need - // to unenchant it, then clear out the commands - final GameEntity oldEnchanted = c.getEnchanting(); - c.removeEnchanting(oldEnchanted); - } - // TODO: this should ideally be handled with !attachedTo.canBeEnchantedBy(c), but the relevant function is not adapted - // for corner cases tested here and modifying it to accomodate these situations (e.g. Boonweaver Giant + Animate Dead) - // tends to break other things. - if (!checkCanIndirectlyAttachTo(c, attachedTo)) { - // if an aura can't enchant the source, it shouldn't move (303.4i, 303.4j) - continue; - } - if ( ((c.hasKeyword("Enchant creature card in a graveyard") || c.hasKeyword("Enchant instant card in a graveyard")) && !attachedTo.getZone().is(ZoneType.Graveyard)) - || !attachedTo.getZone().is(ZoneType.Battlefield)) { - // if the source of the effect is no longer in the zone where it can be enchanted, aura does not move - continue; - } - c.enchantEntity(attachedTo); - } - else if (c.isEquipment()) { //Equipment - if (c.isEquipping()) { - final Card oldEquiped = c.getEquipping(); - if ( null != oldEquiped ) - c.unEquipCard(oldEquiped); - } - c.equipCard(attachedTo); - } - else { - if (c.isFortifying()) { - final Card oldFortified = c.getFortifying(); - if ( null != oldFortified ) - c.unFortifyCard(oldFortified); - } - c.fortifyCard(attachedTo); + + if (c.isAttachment()) { + c.attachEntity(attachedTo); } } else { // When it should enter the battlefield attached to an illegal permanent it fails @@ -1069,15 +1006,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { FCollectionView list = AbilityUtils.getDefinedPlayers(source, sa.getParam("AttachedToPlayer"), sa); if (!list.isEmpty()) { Player attachedTo = player.getController().chooseSingleEntityForEffect(list, sa, c + " - Select a player to attach to."); - if (c.isAura()) { - if (c.isEnchanting()) { - // If this Card is already Enchanting something, need - // to unenchant it, then clear out the commands - final GameEntity oldEnchanted = c.getEnchanting(); - c.removeEnchanting(oldEnchanted); - } - c.enchantEntity(attachedTo); - } + c.attachEntity(attachedTo); } else { // When it should enter the battlefield attached to an illegal permanent it fails continue; diff --git a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java index 5298ed95005..504ebad7e4b 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java @@ -154,9 +154,9 @@ public class CopyPermanentEffect extends SpellAbilityEffect { choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, host); if (!choices.isEmpty()) { String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : "Choose a card "; - + Card choosen = chooser.getController().chooseSingleEntityForEffect(choices, sa, title, false); - + if (choosen != null) { tgtCards.add(choosen); } @@ -238,21 +238,8 @@ public class CopyPermanentEffect extends SpellAbilityEffect { } if (!list.isEmpty()) { Card attachedTo = activator.getController().chooseSingleEntityForEffect(list, sa, copyInPlay + " - Select a card to attach to."); - if (copyInPlay.isAura()) { - if (attachedTo.canBeEnchantedBy(copyInPlay)) { - copyInPlay.enchantEntity(attachedTo); - } else {//can't enchant - continue; - } - } else if (copyInPlay.isEquipment()) { //Equipment - if (attachedTo.canBeEquippedBy(copyInPlay)) { - copyInPlay.equipCard(attachedTo); - } else { - continue; - } - } else { // Fortification - copyInPlay.fortifyCard(attachedTo); - } + + copyInPlay.attachEntity(attachedTo); } else { continue; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java index ab0e2a0b826..8faf7474655 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java @@ -95,9 +95,7 @@ public class DestroyEffect extends SpellAbilityEffect { boolean destroyed = false; final Card lki = CardUtil.getLKICopy(tgtC); if (remAttached) { - card.addRemembered(tgtC.getEnchantedBy(false)); - card.addRemembered(tgtC.getEquippedBy(false)); - card.addRemembered(tgtC.getFortifiedBy(false)); + card.addRemembered(tgtC.getAttachedBy()); } if (sac) { destroyed = game.getAction().sacrifice(tgtC, sa) != null; diff --git a/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java b/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java index effe1d5784a..abec8e52996 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java @@ -495,32 +495,10 @@ public class TokenEffect extends SpellAbilityEffect { game.getAction().checkStaticAbilities(false, Sets.newHashSet(lki), preList); // TODO update when doing Attach Update - boolean canAttach = lki.isAura() || lki.isEquipment() || lki.isFortification(); + boolean canAttach = lki.isAttachment(); - if (lki.isAura()) { - if (!ge.canBeEnchantedBy(lki)) { - canAttach = false; - } - } - if (lki.isEquipment()) { - if (ge instanceof Card) { - Card gc = (Card) ge; - if (!gc.canBeEquippedBy(lki)) { - canAttach = false; - } - } else { - canAttach = false; - } - } - if (lki.isFortification()) { - if (ge instanceof Card) { - Card gc = (Card) ge; - if (!gc.isLand()) { - canAttach = false; - } - } else { - canAttach = false; - } + if (canAttach && ge.canBeAttachedBy(lki)) { + canAttach = false; } // reset static abilities @@ -531,20 +509,7 @@ public class TokenEffect extends SpellAbilityEffect { return false; } - // TODO update when doing Attach Update - if (lki.isAura()) { - tok.enchantEntity(ge); - } else if (lki.isEquipment()) { - if (ge instanceof Card) { - Card gc = (Card) ge; - tok.equipCard(gc); - } - } else if (lki.isFortification()) { - if (ge instanceof Card) { - Card gc = (Card) ge; - tok.fortifyCard(gc); - } - } + tok.attachEntity(ge); return true; } else { // not a GameEntity, cant be attach diff --git a/forge-game/src/main/java/forge/game/ability/effects/UnattachAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/UnattachAllEffect.java index 9d301e059b2..33cca9dcbed 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/UnattachAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/UnattachAllEffect.java @@ -17,25 +17,8 @@ import java.util.List; public class UnattachAllEffect extends SpellAbilityEffect { private static void handleUnattachment(final GameEntity o, final Card cardToUnattach) { - if (o instanceof Card) { - final Card c = (Card) o; - if (cardToUnattach.isAura()) { - //final boolean gainControl = "GainControl".equals(af.parseParams().get("AILogic")); - //AbilityFactoryAttach.handleUnattachAura(cardToUnattach, c, gainControl); - } else if (cardToUnattach.isEquipment()) { - if (cardToUnattach.isEquipping() && c.isEquippedBy(cardToUnattach)) { - cardToUnattach.unEquipCard(cardToUnattach.getEquipping()); - } - } else if (cardToUnattach.isFortification()) { - if (cardToUnattach.isFortifying() && c.isFortifiedBy(cardToUnattach)) { - cardToUnattach.unFortifyCard(cardToUnattach.getFortifying()); - } - } - } else if (o instanceof Player) { - final Player p = (Player) o; - if (cardToUnattach.isAura() && p.isEnchantedBy(cardToUnattach)) { - //AbilityFactoryAttach.handleUnattachAura(cardToUnattach, p, false); - } + if (cardToUnattach.isAttachment() && o.isAttachedBy(cardToUnattach)) { + cardToUnattach.unAttachEntity(cardToUnattach.getAttaching()); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/UnattachEffect.java b/forge-game/src/main/java/forge/game/ability/effects/UnattachEffect.java index ba6635ee1b2..28d11ca6e9c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/UnattachEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/UnattachEffect.java @@ -31,13 +31,9 @@ public class UnattachEffect extends SpellAbilityEffect { if (cardToUnattach.isAura()) { //final boolean gainControl = "GainControl".equals(af.parseParams().get("AILogic")); //AbilityFactoryAttach.handleUnattachAura(cardToUnattach, c, gainControl); - } else if (cardToUnattach.isEquipment()) { - if (cardToUnattach.isEquipping()) { - cardToUnattach.unEquipCard(cardToUnattach.getEquipping()); - } - } else if (cardToUnattach.isFortification()) { - if (cardToUnattach.isFortifying()) { - cardToUnattach.unFortifyCard(cardToUnattach.getFortifying()); + } else if (cardToUnattach.isAttachment()) { + if (cardToUnattach.isAttaching()) { + cardToUnattach.unAttachEntity(cardToUnattach.getAttaching()); } } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ZoneExchangeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ZoneExchangeEffect.java index 1b5359d09bc..bef78d2e537 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ZoneExchangeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ZoneExchangeEffect.java @@ -83,8 +83,8 @@ public class ZoneExchangeEffect extends SpellAbilityEffect { } // Enchant first if (c != null) { - object1.unEnchantEntity(c); - object2.enchantEntity(c); + object1.unAttachEntity(c); + object2.attachEntity(c); } // Exchange Zone game.getAction().moveTo(zone2, object1, sa); diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index f642fe8c117..ae16fd3dfd3 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -37,7 +37,6 @@ import forge.game.combat.Combat; import forge.game.cost.Cost; import forge.game.cost.CostSacrifice; import forge.game.event.*; -import forge.game.event.GameEventCardAttachment.AttachMethod; import forge.game.event.GameEventCardDamaged.DamageType; import forge.game.keyword.Keyword; import forge.game.keyword.KeywordCollection; @@ -98,14 +97,13 @@ public class Card extends GameEntity implements Comparable { private final KeywordCollection hiddenExtrinsicKeyword = new KeywordCollection(); // cards attached or otherwise linked to this card - private CardCollection equippedBy, fortifiedBy, hauntedBy, devouredCards, delvedCards, convokedCards, imprintedCards, encodedCards; + private CardCollection hauntedBy, devouredCards, delvedCards, convokedCards, imprintedCards, encodedCards; private CardCollection mustBlockCards, clones, gainControlTargets, chosenCards, blockedThisTurn, blockedByThisTurn; // if this card is attached or linked to something, what card is it currently attached to - private Card equipping, encoding, fortifying, cloneOrigin, haunting, effectSource, pairedWith, meldedWith; + private Card encoding, cloneOrigin, haunting, effectSource, pairedWith, meldedWith; - // if this card is an Aura, what Entity is it enchanting? - private GameEntity enchanting = null; + private GameEntity attaching = null; private GameEntity mustAttackEntity = null; private GameEntity mustAttackEntityThisTurn = null; @@ -176,7 +174,7 @@ public class Card extends GameEntity implements Comparable { // for Vanguard / Manapool / Emblems etc. private boolean isImmutable = false; - + private int exertThisTurn = 0; private PlayerCollection exertedByPlayer = new PlayerCollection(); @@ -413,7 +411,7 @@ public class Card extends GameEntity implements Comparable { if (!changedCardKeywords.isEmpty()) { currentState.getView().updateKeywords(this, currentState); } - + if (state == CardStateName.FaceDown) { view.updateHiddenId(game.nextHiddenCardId()); } @@ -902,7 +900,7 @@ public class Card extends GameEntity implements Comparable { public final void clearTriggersNew() { currentState.clearTriggers(); } - + public final boolean hasTrigger(final Trigger t) { return currentState.hasTrigger(t); } @@ -1064,7 +1062,7 @@ public class Card extends GameEntity implements Comparable { public final boolean hasSecondStrike() { return hasDoubleStrike() || !hasFirstStrike(); } - + public final boolean hasConverge() { return "Count$Converge".equals(getSVar("X")) || "Count$Converge".equals(getSVar("Y")) || hasKeyword("Sunburst"); } @@ -1290,7 +1288,7 @@ public class Card extends GameEntity implements Comparable { public final void removeSVar(final String var) { currentState.removeSVar(var); } - + public final int sumAllCounters() { int count = 0; for (final Integer value2 : counters.values()) { @@ -1519,7 +1517,7 @@ public class Card extends GameEntity implements Comparable { sbLong.append(parts[0]).append(" ").append(ManaCostParser.parse(parts[1])).append("\r\n"); } } else if (keyword.startsWith("Morph") || keyword.startsWith("Megamorph")) { - String[] k = keyword.split(":"); + String[] k = keyword.split(":"); sbLong.append(k[0]); if (k.length > 1) { final Cost mCost = new Cost(k[1], true); @@ -1704,7 +1702,7 @@ public class Card extends GameEntity implements Comparable { if (sbLong.length() > 0) { sbLong.append("\r\n"); } - + i++; } if (sb.length() > 0) { @@ -2223,7 +2221,7 @@ public class Card extends GameEntity implements Comparable { public final FCollectionView getNonManaAbilities() { return currentState.getNonManaAbilities(); } - + public final boolean hasSpellAbility(final SpellAbility sa) { return currentState.hasSpellAbility(sa); } @@ -2410,7 +2408,7 @@ public class Card extends GameEntity implements Comparable { public final void addUntapCommand(final GameCommand c) { untapCommandList.add(c); } - + public final void addUnattachCommand(final GameCommand c) { unattachCommandList.add(c); } @@ -2472,7 +2470,7 @@ public class Card extends GameEntity implements Comparable { public void setStartedTheTurnUntapped(boolean untapped) { startedTheTurnUntapped = untapped; } - + public boolean cameUnderControlSinceLastUpkeep() { return cameUnderControlSinceLastUpkeep; } @@ -2585,186 +2583,126 @@ public class Card extends GameEntity implements Comparable { } } - public final CardCollectionView getEquippedBy(boolean allowModify) { - return CardCollection.getView(equippedBy, allowModify); - } - public final void setEquippedBy(final CardCollection cards) { - equippedBy = view.setCards(equippedBy, cards, TrackableProperty.EquippedBy); - } - public final void setEquippedBy(final Iterable cards) { - equippedBy = view.setCards(equippedBy, cards, TrackableProperty.EquippedBy); - } - public final boolean isEquipped() { - return FCollection.hasElements(equippedBy); - } - public final boolean isEquippedBy(Card c) { - return FCollection.hasElement(equippedBy, c); - } - public final boolean isEquippedBy(final String cardName) { - for (final Card card : getEquippedBy(false)) { - if (card.getName().equals(cardName)) { - return true; - } + public final CardCollectionView getEquippedBy() { + if (this.attachedBy == null) { + return CardCollection.EMPTY; } - return false; + + return CardLists.filter(attachedBy, CardPredicates.Presets.EQUIPMENT); } - public final CardCollectionView getFortifiedBy(boolean allowModify) { - return CardCollection.getView(fortifiedBy, allowModify); + public final boolean isEquipped() { + if (this.attachedBy == null) { + return false; + } + + return CardLists.count(attachedBy, CardPredicates.Presets.EQUIPMENT) > 0; } - public final void setFortifiedBy(final CardCollection cards) { - fortifiedBy = view.setCards(fortifiedBy, cards, TrackableProperty.FortifiedBy); + public final boolean isEquippedBy(Card c) { + return this.isAttachedBy(c); } - public final void setFortifiedBy(final Iterable cards) { - fortifiedBy = view.setCards(fortifiedBy, cards, TrackableProperty.FortifiedBy); + public final boolean isEquippedBy(final String cardName) { + return this.isAttachedBy(cardName); } + + public final CardCollectionView getFortifiedBy() { + if (this.attachedBy == null) { + return CardCollection.EMPTY; + } + + return CardLists.filter(attachedBy, CardPredicates.Presets.FORTIFICATION); + } + public final boolean isFortified() { - return FCollection.hasElements(fortifiedBy); + if (this.attachedBy == null) { + return false; + } + + return CardLists.count(attachedBy, CardPredicates.Presets.FORTIFICATION) > 0; } public final boolean isFortifiedBy(Card c) { - return FCollection.hasElement(fortifiedBy, c); + // 301.5e + 301.6 + return isAttachedBy(c); } public final Card getEquipping() { - return equipping; - } - public final void setEquipping(final Card card) { - equipping = view.setCard(equipping, card, TrackableProperty.Equipping); + return this.getAttachingCard(); } public final boolean isEquipping() { - return equipping != null; + return this.isAttaching(); } - public final Card getFortifying() { - return fortifying; - } - public final void setFortifying(final Card card) { - fortifying = view.setCard(fortifying, card, TrackableProperty.Fortifying); - } public final boolean isFortifying() { - return fortifying != null; + return this.isAttaching(); } public final void equipCard(final Card c) { - if (c.hasKeyword("CARDNAME can't be equipped.")) { - getGame().getGameLog().add(GameLogEntryType.STACK_RESOLVE, "Trying to equip " + c.getName() + " but it can't be equipped."); + if (!isEquipment()) { return; } - - for(KeywordInterface inst : c.getKeywords()) { - String kw = inst.getOriginal(); - if (!kw.startsWith("CantEquip")) { - continue; - } - final String[] k = kw.split(" ", 2); - final String[] restrictions = k[1].split(","); - if (c.isValid(restrictions, getController(), this, null)) { - getGame().getGameLog().add(GameLogEntryType.STACK_RESOLVE, "Trying to equip " + c.getName() + " but it can't be equipped."); - return; - } - } - Card oldTarget = null; - if (isEquipping()) { - oldTarget = equipping; - if (oldTarget.equals(c)) { - // If attempting to reattach to the same object, don't do anything. - return; - } - unEquipCard(oldTarget); - } - - // They use double links... it's doubtful - setEquipping(c); - setTimestamp(getGame().getNextTimestamp()); - c.equippedBy = c.view.addCard(c.equippedBy, this, TrackableProperty.EquippedBy); - - // Play the Equip sound - getGame().fireEvent(new GameEventCardAttachment(this, oldTarget, c, AttachMethod.Equip)); - - // run trigger - final Map runParams = Maps.newHashMap(); - runParams.put("AttachSource", this); - runParams.put("AttachTarget", c); - getController().getGame().getTriggerHandler().runTrigger(TriggerType.Attached, runParams, false); + this.attachEntity(c); } public final void fortifyCard(final Card c) { - Card oldTarget = null; - if (isFortifying()) { - oldTarget = fortifying; - unFortifyCard(oldTarget); + if (!isFortification()) { + return; } - setFortifying(c); - setTimestamp(getGame().getNextTimestamp()); - c.fortifiedBy = c.view.addCard(c.fortifiedBy, this, TrackableProperty.FortifiedBy); - - // Play the Equip sound - getGame().fireEvent(new GameEventCardAttachment(this, oldTarget, c, AttachMethod.Fortify)); - // run trigger - final Map runParams = Maps.newHashMap(); - runParams.put("AttachSource", this); - runParams.put("AttachTarget", c); - getController().getGame().getTriggerHandler().runTrigger(TriggerType.Attached, runParams, false); + this.attachEntity(c); } public final void unEquipCard(final Card c) { // equipment.unEquipCard(equippedCard); - if (equipping != null && equipping.getId() == c.getId()) { - setEquipping(null); - } - c.equippedBy = c.view.removeCard(c.equippedBy, this, TrackableProperty.EquippedBy); - - getGame().fireEvent(new GameEventCardAttachment(this, c, null, AttachMethod.Equip)); - - // Run triggers - final Map runParams = Maps.newTreeMap(); - runParams.put("Equipment", this); - runParams.put("Card", c); - getGame().getTriggerHandler().runTrigger(TriggerType.Unequip, runParams, false); - runUnattachCommands(); - } - - public final void unFortifyCard(final Card c) { // fortification.unEquipCard(fortifiedCard); - if (fortifying == c) { - setFortifying(null); - } - c.fortifiedBy = c.view.removeCard(c.fortifiedBy, this, TrackableProperty.FortifiedBy); - - getGame().fireEvent(new GameEventCardAttachment(this, c, null, AttachMethod.Fortify)); - runUnattachCommands(); + this.unAttachEntity(c); } public final void unEquipAllCards() { if (isEquipped()) { - for (Card c : getEquippedBy(true)) { - c.unEquipCard(this); + for (Card c : Lists.newArrayList(getEquippedBy())) { + c.unAttachEntity(this); } } } - public final GameEntity getEnchanting() { - return enchanting; + public final GameEntity getAttaching() { + return attaching; } - public final void setEnchanting(final GameEntity e) { - if (enchanting == e) { return; } - enchanting = e; - view.updateEnchanting(this); + public final void setAttaching(final GameEntity e) { + if (attaching == e) { return; } + attaching = e; + view.updateAttaching(this); } - public final Card getEnchantingCard() { - if (enchanting instanceof Card) { - return (Card) enchanting; + public final void removeAttaching(final GameEntity e) { + if (attaching == e) { + setAttaching(null); + } + } + public final boolean isAttaching() { + return attaching != null; + } + + public final Card getAttachingCard() { + if (attaching instanceof Card) { + return (Card) attaching; } return null; } + + public final GameEntity getEnchanting() { + return getAttaching(); + } + + public final Card getEnchantingCard() { + return getAttachingCard(); + } public final Player getEnchantingPlayer() { - if (enchanting instanceof Player) { - return (Player) enchanting; + if (attaching instanceof Player) { + return (Player) attaching; } return null; } public final boolean isEnchanting() { - return enchanting != null; + return isAttaching(); } public final boolean isEnchantingCard() { return getEnchantingCard() != null; @@ -2773,43 +2711,63 @@ public class Card extends GameEntity implements Comparable { return getEnchantingPlayer() != null; } - public final void removeEnchanting(final GameEntity e) { - if (enchanting == e) { - setEnchanting(null); - } - } - - public final void enchantEntity(final GameEntity entity) { - if (entity.hasKeyword("CARDNAME can't be enchanted.") - || entity.hasKeyword("CARDNAME can't be enchanted in the future.")) { - getGame().getGameLog().add(GameLogEntryType.STACK_RESOLVE, "Trying to enchant " + entity.getName() - + " but it can't be enchanted."); + public final void attachEntity(final GameEntity entity) { + if (!entity.canBeAttachedBy(this)) { return; } - setEnchanting(entity); - setTimestamp(getGame().getNextTimestamp()); - entity.addEnchantedBy(this); - getGame().fireEvent(new GameEventCardAttachment(this, null, entity, AttachMethod.Enchant)); + GameEntity oldTarget = null; + if (isAttaching()) { + oldTarget = getAttaching(); + // If attempting to reattach to the same object, don't do anything. + if (oldTarget.equals(entity)) { + return; + } + unAttachEntity(oldTarget); + } + + // They use double links... it's doubtful + setAttaching(entity); + setTimestamp(getGame().getNextTimestamp()); + entity.addAttachedBy(this); + + // Play the Equip sound + getGame().fireEvent(new GameEventCardAttachment(this, oldTarget, entity)); // run trigger final Map runParams = Maps.newHashMap(); runParams.put("AttachSource", this); runParams.put("AttachTarget", entity); getController().getGame().getTriggerHandler().runTrigger(TriggerType.Attached, runParams, false); + } - public final void unEnchantEntity(final GameEntity entity) { - if (enchanting == null || !enchanting.equals(entity)) { + public final void enchantEntity(final GameEntity entity) { + if (!isAura()) { + return; + } + this.attachEntity(entity); + } + + public final void unAttachEntity(final GameEntity entity) { + if (attaching == null || !attaching.equals(entity)) { return; } - setEnchanting(null); - entity.removeEnchantedBy(this); + setAttaching(null); + entity.removeAttachedBy(this); + + // Handle Bestowed Aura part if (isBestowed()) { unanimateBestow(); } - getGame().fireEvent(new GameEventCardAttachment(this, entity, null, AttachMethod.Enchant)); + getGame().fireEvent(new GameEventCardAttachment(this, entity, null)); + + // Run triggers + final Map runParams = Maps.newTreeMap(); + runParams.put("Attach", this); + runParams.put("Object", entity); + getGame().getTriggerHandler().runTrigger(TriggerType.Unattach, runParams, false); runUnattachCommands(); } @@ -2820,11 +2778,11 @@ public class Card extends GameEntity implements Comparable { public final void addType(final String type0) { currentState.addType(type0); } - + public final void removeType(final CardType.Supertype st) { currentState.removeType(st); } - + public final void setCreatureTypes(Collection ctypes) { currentState.setCreatureTypes(ctypes); } @@ -2832,7 +2790,7 @@ public class Card extends GameEntity implements Comparable { public final CardTypeView getType() { return getType(currentState); } - + public final CardTypeView getType(CardState state) { if (changedCardTypes.isEmpty()) { return state.getType(); @@ -2843,7 +2801,7 @@ public class Card extends GameEntity implements Comparable { public Iterable getChangedCardTypes() { return Iterables.unmodifiableIterable(changedCardTypes.values()); } - + public Map getChangedCardTypesMap() { return Collections.unmodifiableMap(changedCardTypes); } @@ -3050,7 +3008,7 @@ public class Card extends GameEntity implements Comparable { public final void addNewPT(final Integer power, final Integer toughness, final long timestamp) { addNewPT(power, toughness, timestamp, false); } - + public final void addNewPT(final Integer power, final Integer toughness, final long timestamp, final boolean cda) { if (cda) { newPTCharacterDefining.put(timestamp, Pair.of(power, toughness)); @@ -3063,10 +3021,10 @@ public class Card extends GameEntity implements Comparable { public final void removeNewPT(final long timestamp) { boolean removed = false; - + removed |= newPT.remove(timestamp) != null; removed |= newPTCharacterDefining.remove(timestamp) != null; - + if (removed) { currentState.getView().updatePower(this); currentState.getView().updateToughness(this); @@ -3358,7 +3316,7 @@ public class Card extends GameEntity implements Comparable { final boolean removeAllKeywords, final boolean removeIntrinsicKeywords, final long timestamp) { addChangedCardKeywords(keywords, removeKeywords, removeAllKeywords, removeIntrinsicKeywords, timestamp, true); } - + public final void addChangedCardKeywords(final List keywords, final List removeKeywords, final boolean removeAllKeywords, final boolean removeIntrinsicKeywords, final long timestamp, final boolean updateView) { @@ -3377,12 +3335,12 @@ public class Card extends GameEntity implements Comparable { newCks.addKeywordsToCard(this); changedCardKeywords.put(timestamp, newCks); } - + if (updateView) { updateKeywords(); } } - + public final void addChangedCardKeywordsInternal( final List keywords, final List removeKeywords, final boolean removeAllKeywords, final boolean removeIntrinsicKeywords, @@ -3404,7 +3362,7 @@ public class Card extends GameEntity implements Comparable { newCks.addKeywordsToCard(this); changedCardKeywords.put(timestamp, newCks); } - + if (updateView) { updateKeywords(); } @@ -3432,7 +3390,7 @@ public class Card extends GameEntity implements Comparable { public final KeywordsChange removeChangedCardKeywords(final long timestamp, final boolean updateView) { KeywordsChange change = changedCardKeywords.remove(timestamp); - if (change != null && updateView) { + if (change != null && updateView) { updateKeywords(); } return change; @@ -3445,10 +3403,10 @@ public class Card extends GameEntity implements Comparable { public final Collection getUnhiddenKeywords(CardState state) { return state.getCachedKeywords(); } - + public final void updateKeywordsCache(final CardState state) { KeywordCollection keywords = new KeywordCollection(); - + //final List keywords = Lists.newArrayList(); boolean removeIntrinsic = false; for (final KeywordsChange ck : changedCardKeywords.values()) { @@ -3568,7 +3526,7 @@ public class Card extends GameEntity implements Comparable { String oldtxt = kw.getOriginal(); final String newtxt = AbilityUtils.applyKeywordTextChangeEffects(oldtxt, this); if (!newtxt.equals(oldtxt)) { - KeywordInterface newKw = Keyword.getInstance(newtxt); + KeywordInterface newKw = Keyword.getInstance(newtxt); addKeywords.add(newKw); removeKeywords.add(kw); keywordsGrantedByTextChanges.add(newKw); @@ -3733,7 +3691,7 @@ public class Card extends GameEntity implements Comparable { currentState.getView().updateKeywords(this, currentState); } } - + public final void addHiddenExtrinsicKeyword(KeywordInterface k) { if (hiddenExtrinsicKeyword.insert(k)) { view.updateNonAbilityText(this); @@ -3788,7 +3746,7 @@ public class Card extends GameEntity implements Comparable { public final void removeStaticAbility(StaticAbility stAb) { currentState.removeStaticAbility(stAb); } - + public void updateStaticAbilities(List list, CardState state) { for (KeywordInterface kw : getUnhiddenKeywords(state)) { list.addAll(kw.getStaticAbilities()); @@ -3820,7 +3778,9 @@ public class Card extends GameEntity implements Comparable { public final boolean isPlaneswalker() { return getType().isPlaneswalker(); } public final boolean isEnchantment() { return getType().isEnchantment(); } public final boolean isAura() { return getType().hasSubtype("Aura"); } - public final boolean isHistoric() {return getType().isLegendary() || getType().isArtifact() || getType().hasSubtype("Saga");} + + public final boolean isAttachment() { return isAura() || isEquipment() || isFortification(); } + public final boolean isHistoric() {return getType().isLegendary() || isArtifact() || getType().hasSubtype("Saga");} public final boolean isScheme() { return getType().isScheme(); } public final boolean isPhenomenon() { return getType().isPhenomenon(); } @@ -3886,27 +3846,13 @@ public class Card extends GameEntity implements Comparable { setDirectlyPhasedOut(direct); } - if (isEquipped()) { - for (final Card eq : getEquippedBy(false)) { + if (isAttachedBy()) { + for (final Card eq : getAttachedBy()) { if (eq.isPhasedOut() == phasingIn) { eq.phase(false); } } } - if (isFortified()) { - for (final Card f : getFortifiedBy(false)) { - if (f.isPhasedOut() == phasingIn) { - f.phase(false); - } - } - } - if (isEnchanted()) { - for (final Card aura : getEnchantedBy(false)) { - if (aura.isPhasedOut() == phasingIn) { - aura.phase(false); - } - } - } getGame().fireEvent(new GameEventCardPhased(this, isPhasedOut())); } @@ -4181,7 +4127,7 @@ public class Card extends GameEntity implements Comparable { //do not check for SplitCard anymore return host.getCMC() == n; } - + public final boolean sharesCMCWith(final Card c1) { //need to get GameState for Discarded Cards final Card host = game.getCardState(this); @@ -4784,7 +4730,7 @@ public class Card extends GameEntity implements Comparable { return (c != null ? c.getImageKey() : ""); } - + public final boolean isTributed() { return tributed; } public final void setTributed(final boolean b) { @@ -4808,7 +4754,7 @@ public class Card extends GameEntity implements Comparable { public final int getExertedThisTurn() { return exertThisTurn; } - + public void exert() { exertedByPlayer.add(getController()); exertThisTurn++; @@ -4818,16 +4764,16 @@ public class Card extends GameEntity implements Comparable { runParams.put("Player", getController()); game.getTriggerHandler().runTrigger(TriggerType.Exerted, runParams, false); } - + public boolean isExertedBy(final Player player) { return exertedByPlayer.contains(player); } - + public void removeExertedBy(final Player player) { exertedByPlayer.remove(player); view.updateExertedThisTurn(this, getExertedThisTurn() > 0); } - + protected void resetExtertedThisTurn() { exertThisTurn = 0; view.updateExertedThisTurn(this, false); @@ -4917,8 +4863,8 @@ public class Card extends GameEntity implements Comparable { public final CardCollectionView getDevouredCards() { return CardCollection.getView(devouredCards); - } - + } + public final CardCollectionView getHauntedBy() { return CardCollection.getView(hauntedBy); } @@ -4997,7 +4943,7 @@ public class Card extends GameEntity implements Comparable { return sum; } - @Override + public boolean hasProtectionFrom(final Card source) { return hasProtectionFrom(source, false, false); } @@ -5006,6 +4952,7 @@ public class Card extends GameEntity implements Comparable { return hasProtectionFrom(source, false, true); } + @Override public boolean hasProtectionFrom(final Card source, final boolean checkSBA) { return hasProtectionFrom(source, checkSBA, false); } @@ -5019,6 +4966,11 @@ public class Card extends GameEntity implements Comparable { return true; } + // Protection only works on the Battlefield + if (isInZone(ZoneType.Battlefield)) { + return false; + } + final boolean colorlessDamage = damageSource && source.hasKeyword("Colorless Damage Source"); for (final KeywordInterface inst : getKeywords()) { @@ -5078,11 +5030,11 @@ public class Card extends GameEntity implements Comparable { // if colorlessDamage then it does only check damage color.. if (colorlessDamage) { - if (characteristic.endsWith("White") || characteristic.endsWith("Blue") - || characteristic.endsWith("Black") || characteristic.endsWith("Red") + if (characteristic.endsWith("White") || characteristic.endsWith("Blue") + || characteristic.endsWith("Black") || characteristic.endsWith("Red") || characteristic.endsWith("Green") || characteristic.endsWith("Colorless") || characteristic.endsWith("ChosenColor")) { - characteristic += "Source"; + characteristic += "Source"; } } @@ -5221,14 +5173,50 @@ public class Card extends GameEntity implements Comparable { tgt = sa.getTargetRestrictions(); } + if (aura.isCreature()) { + return false; + } + + // phase check there + if (isPhasedOut() && !aura.isPhasedOut()) { + return false; + } + + if (tgt != null) { + boolean zoneValid = false; + // check the zone types + for (final ZoneType zt : tgt.getZone()) { + if (isInZone(zt)) { + zoneValid = true; + break; + } + } + if (!zoneValid) { + return false; + } + + // check valid + if (!isValid(tgt.getValidTgts(), aura.getController(), aura, sa)) { + return false; + } + } + return !(hasProtectionFrom(aura, checkSBA) || (hasKeyword("CARDNAME can't be enchanted in the future.") && !isEnchantedBy(aura)) || (hasKeyword("CARDNAME can't be enchanted.") && !aura.getName().equals("Anti-Magic Aura") - && !(aura.getName().equals("Consecrate Land") && aura.isInZone(ZoneType.Battlefield))) - || ((tgt != null) && !isValid(tgt.getValidTgts(), aura.getController(), aura, sa))); + && !(aura.getName().equals("Consecrate Land") && aura.isInZone(ZoneType.Battlefield)))); } public final boolean canBeEquippedBy(final Card equip) { + if (!isCreature() || !isInPlay() || equip.isCreature()) { + return false; + } + + // phase check there + if (isPhasedOut() && !equip.isPhasedOut()) { + return false; + } + for(KeywordInterface inst : equip.getKeywords()) { String kw = inst.getOriginal(); if(!kw.startsWith("CantEquip")) { @@ -5241,8 +5229,19 @@ public class Card extends GameEntity implements Comparable { } } return !(hasProtectionFrom(equip) - || hasKeyword("CARDNAME can't be equipped.") - || !isValid("Creature", equip.getController(), equip, null)); + || hasKeyword("CARDNAME can't be equipped.")); + } + + public boolean canBeFortifiedBy(final Card fort) { + if (!isLand() || !isInPlay() || fort.isCreature() || fort.isLand()) { + return false; + } + + // phase check there + if (isPhasedOut() && !fort.isPhasedOut()) { + return false; + } + return !hasProtectionFrom(fort); } public FCollectionView getReplacementEffects() { @@ -5265,7 +5264,7 @@ public class Card extends GameEntity implements Comparable { public void removeReplacementEffect(ReplacementEffect replacementEffect) { currentState.removeReplacementEffect(replacementEffect); } - + public void updateReplacementEffects(List list, CardState state) { for (KeywordInterface kw : getUnhiddenKeywords(state)) { list.addAll(kw.getReplacements()); @@ -5449,7 +5448,7 @@ public class Card extends GameEntity implements Comparable { public final void setLKICMC(final int cmc) { this.lkiCMC = cmc; } - + public final boolean isLKI() { return this.lkiCMC >= 0; } @@ -5758,7 +5757,7 @@ public class Card extends GameEntity implements Comparable { public final void addGoad(Long timestamp, final Player p) { goad.put(timestamp, p); } - + public final void removeGoad(Long timestamp) { goad.remove(timestamp); } diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index 42df8d6e1f7..691b0565988 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -92,12 +92,8 @@ public class CardFactory { out.setState(in.getCurrentStateName(), true); // this's necessary for forge.game.GameAction.unattachCardLeavingBattlefield(Card) - out.setEquipping(in.getEquipping()); - out.setEquippedBy(in.getEquippedBy(false)); - out.setFortifying(in.getFortifying()); - out.setFortifiedBy(in.getFortifiedBy(false)); - out.setEnchantedBy(in.getEnchantedBy(false)); - out.setEnchanting(in.getEnchanting()); + out.setAttachedBy(in.getAttachedBy()); + out.setAttaching(in.getAttaching()); out.setClones(in.getClones()); out.setCastSA(in.getCastSA()); diff --git a/forge-game/src/main/java/forge/game/card/CardPredicates.java b/forge-game/src/main/java/forge/game/card/CardPredicates.java index c6180228a3d..a3eeb8dd5b6 100644 --- a/forge-game/src/main/java/forge/game/card/CardPredicates.java +++ b/forge-game/src/main/java/forge/game/card/CardPredicates.java @@ -470,6 +470,15 @@ public final class CardPredicates { return c.isEnchantment(); } }; + /** + * a Predicate to get all aura. + */ + public static final Predicate AURA = new Predicate() { + @Override + public boolean apply(Card c) { + return c.isAura(); + } + }; /** * a Predicate to get all equipment. */ @@ -482,7 +491,7 @@ public final class CardPredicates { /** * a Predicate to get all fortification. */ - public static final Predicate Fortification = new Predicate() { + public static final Predicate FORTIFICATION = new Predicate() { @Override public boolean apply(Card c) { return c.isFortification(); diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index d2be541192c..f58d8b63f95 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -405,7 +405,7 @@ public class CardProperty { return false; } } else if (property.equals("Attached")) { - if (card.getEquipping() != source && !source.equals(card.getEnchanting()) && card.getFortifying() != source) { + if (card.getEquipping() != source && !source.equals(card.getAttaching())) { return false; } } else if (property.startsWith("AttachedTo")) { @@ -433,9 +433,8 @@ public class CardProperty { return false; } } else { - if ((card.getEnchanting() == null || !card.getEnchanting().isValid(restriction, sourceController, source, spellAbility)) - && (card.getEquipping() == null || !card.getEquipping().isValid(restriction, sourceController, source, spellAbility)) - && (card.getFortifying() == null || !card.getFortifying().isValid(restriction, sourceController, source, spellAbility))) { + if ((card.getAttaching() == null || !card.getAttaching().isValid(restriction, sourceController, source, spellAbility)) + && (card.getEquipping() == null || !card.getEquipping().isValid(restriction, sourceController, source, spellAbility))) { return false; } } @@ -445,7 +444,7 @@ public class CardProperty { return false; } } else if (property.equals("NotAttachedTo")) { - if (card.getEquipping() == source || source.equals(card.getEnchanting()) || card.getFortifying() == source) { + if (card.getEquipping() == source || source.equals(card.getAttaching())) { return false; } } else if (property.startsWith("EnchantedBy")) { @@ -476,7 +475,7 @@ public class CardProperty { } break; default: // EnchantedBy Aura.Other - for (final Card aura : card.getEnchantedBy(false)) { + for (final Card aura : card.getEnchantedBy()) { if (aura.isValid(restriction, sourceController, source, spellAbility)) { return true; } @@ -572,11 +571,12 @@ public class CardProperty { return false; } } else if (property.startsWith("Equipped")) { - if (card.getEquipping() != source) { + if (!source.isAttachedBy(card)) { return false; } } else if (property.startsWith("Fortified")) { - if (card.getFortifying() != source) { + // FIXME TODO what property has this? + if (!source.isAttachedBy(card)) { return false; } } else if (property.startsWith("HauntedBy")) { 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 373889feb2a..821025b66fc 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -6,12 +6,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ @@ -93,8 +93,8 @@ public final class CardUtil { if (kw.startsWith("HIDDEN")) { kw = kw.substring(7); } - - return !kw.startsWith("Protection") && !kw.startsWith("CantBeBlockedBy") + + return !kw.startsWith("Protection") && !kw.startsWith("CantBeBlockedBy") && !NON_STACKING_LIST.contains(kw); } @@ -108,7 +108,7 @@ public final class CardUtil { /** * getThisTurnEntered. - * + * * @param to zone going to * @param from zone coming from * @param valid a isValid expression @@ -121,7 +121,7 @@ public final class CardUtil { /** * getThisTurnEntered. - * + * * @param to zone going to * @param from zone coming from * @param valid a isValid expression @@ -146,7 +146,7 @@ public final class CardUtil { /** * getLastTurnEntered. - * + * * @param to zone going to * @param from zone coming from * @param valid a isValid expression @@ -159,7 +159,7 @@ public final class CardUtil { /** * getLastTurnEntered. - * + * * @param to zone going to * @param from zone coming from * @param valid a isValid expression @@ -222,7 +222,7 @@ public final class CardUtil { // needed to ensure that the LKI object has correct CMC info no matter what state the original card was in // (e.g. Scrap Trawler + transformed Harvest Hand) - newCopy.setLKICMC(in.getCMC()); + newCopy.setLKICMC(in.getCMC()); // used for the purpose of cards that care about the zone the card was known to be in last newCopy.setLastKnownZone(in.getLastKnownZone()); @@ -264,12 +264,10 @@ public final class CardUtil { newCopy.setReceivedDamageFromThisTurn(in.getReceivedDamageFromThisTurn()); newCopy.setReceivedDamageFromPlayerThisTurn(in.getReceivedDamageFromPlayerThisTurn()); newCopy.getDamageHistory().setCreatureGotBlockedThisTurn(in.getDamageHistory().getCreatureGotBlockedThisTurn()); - newCopy.setEnchanting(in.getEnchanting()); - newCopy.setEnchantedBy(in.getEnchantedBy(false)); - newCopy.setEquipping(in.getEquipping()); - newCopy.setEquippedBy(in.getEquippedBy(false)); - newCopy.setFortifying(in.getFortifying()); - newCopy.setFortifiedBy(in.getFortifiedBy(false)); + + newCopy.setAttachedBy(in.getAttachedBy()); + newCopy.setAttaching(in.getAttaching()); + newCopy.setClones(in.getClones()); newCopy.setHaunting(in.getHaunting()); newCopy.setCopiedPermanent(in.getCopiedPermanent()); @@ -313,9 +311,9 @@ public final class CardUtil { final Game game = source.getGame(); ColorSet cs = CardUtil.getColors(origin); for (byte color : MagicColor.WUBRG) { - if(!cs.hasAnyColor(color)) + if(!cs.hasAnyColor(color)) continue; - + for(final Card c : game.getColoredCardsInPlay(MagicColor.toLongString(color))) { if (!res.contains(c) && c.isValid(valid, source.getController(), source, null) && !c.equals(origin)) { res.add(c); @@ -344,7 +342,7 @@ public final class CardUtil { public static Set getReflectableManaColors(final SpellAbility sa) { return getReflectableManaColors(sa, sa, Sets.newHashSet(), new CardCollection()); } - + private static Set getReflectableManaColors(final SpellAbility abMana, final SpellAbility sa, Set colors, final CardCollection parents) { // Here's the problem with reflectable Mana. If more than one is out, @@ -352,7 +350,7 @@ public final class CardUtil { // so we basically need to have a recursive list that send the parents // so we don't infinite recurse. final Card card = abMana.getHostCard(); - + if (abMana.getApi() != ApiType.ManaReflected) { return colors; } @@ -361,7 +359,7 @@ public final class CardUtil { parents.add(card); } - final String colorOrType = sa.getParam("ColorOrType"); + final String colorOrType = sa.getParam("ColorOrType"); // currently Color or Type, Type is colors + colorless final String validCard = sa.getParam("Valid"); final String reflectProperty = sa.getParam("ReflectProperty"); @@ -459,7 +457,7 @@ public final class CardUtil { } return colors; } - + public static Set canProduce(final int maxChoices, final AbilityManaPart ab, final Set colors) { if (ab == null) { @@ -512,7 +510,7 @@ public final class CardUtil { if (ability.hasParam("MaxTotalTargetCMC")) { int totalCMCTargeted = 0; for (final Card c : targeted) { - totalCMCTargeted += c.getCMC(); + totalCMCTargeted += c.getCMC(); } final List choicesCopy = Lists.newArrayList(choices); diff --git a/forge-game/src/main/java/forge/game/card/CardView.java b/forge-game/src/main/java/forge/game/card/CardView.java index 4dcd3896218..f45e925cb53 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -438,56 +438,32 @@ public class CardView extends GameEntityView { return false; } - public CardView getEquipping() { - return get(TrackableProperty.Equipping); - } - - public FCollectionView getEquippedBy() { - return get(TrackableProperty.EquippedBy); - } - - public boolean isEquipped() { - return getEquippedBy() != null; //isEmpty check not needed since we won't keep an empty collection around - } - public FCollectionView getEncodedCards() { return get(TrackableProperty.EncodedCards); } - public GameEntityView getEnchanting() { - return get(TrackableProperty.Enchanting); + public GameEntityView getAttaching() { + return get(TrackableProperty.Attaching); } - void updateEnchanting(Card c) { - set(TrackableProperty.Enchanting, GameEntityView.get(c.getEnchanting())); + void updateAttaching(Card c) { + set(TrackableProperty.Attaching, GameEntityView.get(c.getAttaching())); } - public CardView getEnchantingCard() { - GameEntityView enchanting = getEnchanting(); + public CardView getAttachingCard() { + GameEntityView enchanting = getAttaching(); if (enchanting instanceof CardView) { return (CardView) enchanting; } return null; } - public PlayerView getEnchantingPlayer() { - GameEntityView enchanting = getEnchanting(); + public PlayerView getAttachingPlayer() { + GameEntityView enchanting = getAttaching(); if (enchanting instanceof PlayerView) { return (PlayerView) enchanting; } return null; } - public CardView getFortifying() { - return get(TrackableProperty.Fortifying); - } - - public FCollectionView getFortifiedBy() { - return get(TrackableProperty.FortifiedBy); - } - - public boolean isFortified() { - return getFortifiedBy() != null; - } - public FCollectionView getGainControlTargets() { return get(TrackableProperty.GainControlTargets); } diff --git a/forge-game/src/main/java/forge/game/combat/Combat.java b/forge-game/src/main/java/forge/game/combat/Combat.java index 7bb0f1bda06..ccfa0a948f9 100644 --- a/forge-game/src/main/java/forge/game/combat/Combat.java +++ b/forge-game/src/main/java/forge/game/combat/Combat.java @@ -424,15 +424,12 @@ public class Combat { public Player getDefendingPlayerRelatedTo(final Card source) { Card attacker = source; - if (source.isAura()) { + if (source.isAura() || source.isFortification()) { attacker = source.getEnchantingCard(); } else if (source.isEquipment()) { attacker = source.getEquipping(); } - else if (source.isFortification()) { - attacker = source.getFortifying(); - } // return the corresponding defender return getDefenderPlayerByAttacker(attacker); diff --git a/forge-game/src/main/java/forge/game/cost/CostUnattach.java b/forge-game/src/main/java/forge/game/cost/CostUnattach.java index a443541daa0..194d97ae060 100644 --- a/forge-game/src/main/java/forge/game/cost/CostUnattach.java +++ b/forge-game/src/main/java/forge/game/cost/CostUnattach.java @@ -83,7 +83,7 @@ public class CostUnattach extends CostPartWithList { return true; } } else { - if (CardLists.getValidCards(source.getEquippedBy(false), type, payer, source).size() > 0) { + if (CardLists.getValidCards(source.getEquippedBy(), type, payer, source).size() > 0) { return true; } } @@ -102,7 +102,7 @@ public class CostUnattach extends CostPartWithList { return originalEquipment; } } else { - List attachees = CardLists.getValidCards(source.getEquippedBy(false), this.getType(), activator, source); + List attachees = CardLists.getValidCards(source.getEquippedBy(), this.getType(), activator, source); if (attachees.size() > 0) { // Just pick the first one, although maybe give a dialog return attachees.get(0); @@ -116,7 +116,7 @@ public class CostUnattach extends CostPartWithList { */ @Override protected Card doPayment(SpellAbility ability, Card targetCard) { - targetCard.unEquipCard(targetCard.getEquipping()); + targetCard.unAttachEntity(targetCard.getAttaching()); return targetCard; } diff --git a/forge-game/src/main/java/forge/game/event/GameEventCardAttachment.java b/forge-game/src/main/java/forge/game/event/GameEventCardAttachment.java index c8df7647cfb..567e9208d48 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventCardAttachment.java +++ b/forge-game/src/main/java/forge/game/event/GameEventCardAttachment.java @@ -4,23 +4,15 @@ import forge.game.GameEntity; import forge.game.card.Card; public class GameEventCardAttachment extends GameEvent { - public enum AttachMethod { - Equip, - Fortify, - Enchant; - } - - + public final Card equipment; public final GameEntity newTarget; // can enchant player, I'm ssaving a class to enchants - it could be incorrect. public final GameEntity oldEntiy; - public final AttachMethod method; - public GameEventCardAttachment(Card attachment, GameEntity formerEntity, GameEntity newEntity, AttachMethod method) { + public GameEventCardAttachment(Card attachment, GameEntity formerEntity, GameEntity newEntity) { this.equipment = attachment; this.newTarget = newEntity; this.oldEntiy = formerEntity; - this.method = method; } @Override diff --git a/forge-game/src/main/java/forge/game/phase/Untap.java b/forge-game/src/main/java/forge/game/phase/Untap.java index e06f7ad7252..d256711e719 100644 --- a/forge-game/src/main/java/forge/game/phase/Untap.java +++ b/forge-game/src/main/java/forge/game/phase/Untap.java @@ -272,20 +272,15 @@ public class Untap extends Phase { } else if (c.hasKeyword(Keyword.PHASING)) { // 702.23g If an object would simultaneously phase out directly // and indirectly, it just phases out indirectly. - if (c.isAura()) { - final GameEntity ent = c.getEnchanting(); - - if ((ent instanceof Card) && list.contains(ent)) { + if (c.isAura() || c.isFortification()) { + final Card ent = c.getAttachingCard(); + if (ent != null && list.contains(ent)) { continue; } } else if (c.isEquipment() && c.isEquipping()) { if (list.contains(c.getEquipping())) { continue; } - } else if (c.isFortification() && c.isFortifying()) { - if (list.contains(c.getFortifying())) { - continue; - } } c.phase(); } diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index cd142b81516..eb5ac5885b5 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -6,12 +6,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ @@ -67,7 +67,7 @@ import java.util.concurrent.ConcurrentSkipListMap; *

* Abstract Player class. *

- * + * * @author Forge * @version $Id$ */ @@ -109,7 +109,7 @@ public class Player extends GameEntity implements Comparable { private CardCollection sacrificedThisTurn = new CardCollection(); private Map countersAddedtoPermThisTurn = Maps.newEnumMap(CounterType.class); - + /** A list of tokens not in play, but on their way. * This list is kept in order to not break ETB-replacement * on tokens. */ @@ -293,7 +293,7 @@ public class Player extends GameEntity implements Comparable { public final int getOpponentsGreatestLifeTotal() { return Aggregates.max(getOpponents(), Accessors.FN_GET_LIFE_TOTAL); } - + /** * Get the total number of poison counters amongst this player's opponents. */ @@ -382,7 +382,7 @@ public class Player extends GameEntity implements Comparable { } public final boolean gainLife(int lifeGain, final Card source, final SpellAbility sa) { - + // Run any applicable replacement effects. final Map repParams = Maps.newHashMap(); repParams.put("Event", "GainLife"); @@ -410,7 +410,7 @@ public class Player extends GameEntity implements Comparable { return false; } break; - default: + default: return false; } @@ -509,10 +509,10 @@ public class Player extends GameEntity implements Comparable { if (!canPayLife(lifePayment)) { return false; } - - if (lifePayment <= 0) + + if (lifePayment <= 0) return true; - + // rule 118.8 if (life >= lifePayment) { return (loseLife(lifePayment) > 0); @@ -624,7 +624,7 @@ public class Player extends GameEntity implements Comparable { return 0; } - if (hasProtectionFrom(source, true)) { + if (hasProtectionFromDamage(source)) { return 0; } @@ -826,7 +826,7 @@ public class Player extends GameEntity implements Comparable { } return num; } - + public final int getAssignedCombatDamage() { int num = 0; for (final Integer value : assignedCombatDamage.values()) { @@ -852,14 +852,14 @@ public class Player extends GameEntity implements Comparable { } return num; } - + /** * Get the total damage assigned to this player's opponents this turn. */ public final int getOpponentsAssignedDamage() { return Aggregates.sum(getOpponents(), Accessors.FN_GET_ASSIGNED_DAMAGE); } - + /** * Get the greatest amount of damage assigned to a single opponent this turn. */ @@ -1011,8 +1011,7 @@ public class Player extends GameEntity implements Comparable { // if the key already exists - merge entries if (changedKeywords.containsKey(timestamp)) { final KeywordsChange cks = changedKeywords.get(timestamp); - - ; + changedKeywords.put(timestamp, cks.merge(addKeywords, removeKeywords, cks.isRemoveAllKeywords(), cks.isRemoveIntrinsicKeywords())); updateKeywords(); @@ -1061,14 +1060,14 @@ public class Player extends GameEntity implements Comparable { /** * Remove all keyword changes which grant this {@link Player} the specified - * keyword. + * keyword. * @param keyword the keyword to remove. */ public final void removeKeyword(final String keyword) { removeKeyword(keyword, true); } - - + + public final void removeKeyword(final String keyword, final boolean allInstances) { boolean keywordRemoved = false; @@ -1134,7 +1133,7 @@ public class Player extends GameEntity implements Comparable { } return result; } - + public final StaticAbility addStaticAbility(final Card host, final String s) { PlayerZone com = getZone(ZoneType.Command); @@ -1195,12 +1194,17 @@ public class Player extends GameEntity implements Comparable { return true; } - @Override - public boolean hasProtectionFrom(final Card source) { - return hasProtectionFrom(source, false); + + public boolean hasProtectionFromDamage(final Card source) { + return hasProtectionFrom(source, false, false); } - public boolean hasProtectionFrom(final Card source, final boolean damageSource) { + @Override + public boolean hasProtectionFrom(final Card source, final boolean checkSBA) { + return hasProtectionFrom(source, checkSBA, false); + } + + public boolean hasProtectionFrom(final Card source, final boolean checkSBA, final boolean damageSource) { for (String kw : keywords) { if (kw.startsWith("Protection")) { if (kw.startsWith("Protection:")) { // uses isValid @@ -1418,7 +1422,7 @@ public class Player extends GameEntity implements Comparable { if (topCardRevealed) { revealed.add(c); - } + } if (numDrawnThisTurn == 0) { boolean reveal = false; @@ -1436,7 +1440,7 @@ public class Player extends GameEntity implements Comparable { revealed.remove(c); } } - } + } setLastDrawnCard(c); c.setDrawnThisTurn(true); @@ -1654,7 +1658,7 @@ public class Player extends GameEntity implements Comparable { public final CardCollectionView mill(final int n) { return mill(n, ZoneType.Graveyard, false); } - public final CardCollectionView mill(final int n, final ZoneType zone, + public final CardCollectionView mill(final int n, final ZoneType zone, final boolean bottom) { final CardCollectionView lib = getCardsIn(ZoneType.Library); final CardCollection milled = new CardCollection(); @@ -2204,7 +2208,7 @@ public class Player extends GameEntity implements Comparable { public final void resetSacrificedThisTurn() { sacrificedThisTurn.clear(); } - + public final void addCounterToPermThisTurn(final CounterType type, final int x) { countersAddedtoPermThisTurn.put(type, getCounterToPermThisTurn(type) + x); } @@ -2270,7 +2274,7 @@ public class Player extends GameEntity implements Comparable { /** * get the Player object or Card (Planeswalker) object that this Player must * attack this combat. - * + * * @return the Player or Card (Planeswalker) * @since 1.1.01 */ @@ -2625,7 +2629,7 @@ public class Player extends GameEntity implements Comparable { public CardCollectionView getInboundTokens() { return inboundTokens; } - + public void addInboundToken(Card c) { inboundTokens.add(c); } @@ -2710,7 +2714,7 @@ public class Player extends GameEntity implements Comparable { com.add(Card.fromPaperCard(avatar, this)); } } - + // Schemes CardCollection sd = new CardCollection(); for (IPaperCard cp : registeredPlayer.getSchemes()) { @@ -2773,7 +2777,7 @@ public class Player extends GameEntity implements Comparable { eff.setSVar("CommanderMoveReplacement", "DB$ ChangeZone | Origin$ Battlefield,Graveyard,Exile,Library,Hand | Destination$ Command | Defined$ ReplacedCard"); - String moved = "Event$ Moved | ValidCard$ Card.EffectSource+YouOwn | Secondary$ True | Optional$ True | OptionalDecider$ You | ReplaceWith$ CommanderMoveReplacement "; + String moved = "Event$ Moved | ValidCard$ Card.EffectSource+YouOwn | Secondary$ True | Optional$ True | OptionalDecider$ You | ReplaceWith$ CommanderMoveReplacement "; if (game.getRules().hasAppliedVariant(GameType.TinyLeaders)) { moved += " | Destination$ Graveyard,Exile | Description$ If a commander would be put into its owner's graveyard or exile from anywhere, that player may put it into the command zone instead."; } else { @@ -2837,7 +2841,7 @@ public class Player extends GameEntity implements Comparable { monarchEffect.addType("Effect"); { - final String drawTrig = "Mode$ Phase | Phase$ End of Turn | TriggerZones$ Command | " + + final String drawTrig = "Mode$ Phase | Phase$ End of Turn | TriggerZones$ Command | " + "ValidPlayer$ You | TriggerDescription$ At the beginning of your end step, draw a card."; final String drawEff = "AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1"; @@ -2870,11 +2874,11 @@ public class Player extends GameEntity implements Comparable { this.updateZoneForView(com); } } - + public boolean hasBlessing() { return blessingEffect != null; } - + public void setBlessing(boolean bless) { // no need to to change if ((blessingEffect != null) == bless) { @@ -2882,14 +2886,14 @@ public class Player extends GameEntity implements Comparable { } final PlayerZone com = getZone(ZoneType.Command); - + if(bless) { blessingEffect = new Card(-1, game); blessingEffect.setOwner(this); blessingEffect.setImageKey("t:blessing"); blessingEffect.setName("City's Blessing"); blessingEffect.addType("Effect"); - + blessingEffect.updateStateForView(); @@ -2898,7 +2902,7 @@ public class Player extends GameEntity implements Comparable { com.remove(blessingEffect); blessingEffect = null; } - + this.updateZoneForView(com); } diff --git a/forge-game/src/main/java/forge/trackable/TrackableProperty.java b/forge-game/src/main/java/forge/trackable/TrackableProperty.java index 6c407b678ee..30ae35818e1 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableProperty.java +++ b/forge-game/src/main/java/forge/trackable/TrackableProperty.java @@ -11,7 +11,7 @@ public enum TrackableProperty { //Shared Text(TrackableTypes.StringType), PreventNextDamage(TrackableTypes.IntegerType), - EnchantedBy(TrackableTypes.CardViewCollectionType), + AttachedBy(TrackableTypes.CardViewCollectionType), Counters(TrackableTypes.CounterMapType), CurrentPlane(TrackableTypes.StringType), PlanarPlayer(TrackableTypes.PlayerViewType), @@ -43,11 +43,7 @@ public enum TrackableProperty { NamedCard(TrackableTypes.StringType), PlayerMayLook(TrackableTypes.PlayerViewCollectionType, FreezeMode.IgnoresFreeze), PlayerMayLookTemp(TrackableTypes.PlayerViewCollectionType, FreezeMode.IgnoresFreeze), - Equipping(TrackableTypes.CardViewType), - EquippedBy(TrackableTypes.CardViewCollectionType), - Enchanting(TrackableTypes.GameEntityViewType), - Fortifying(TrackableTypes.CardViewType), - FortifiedBy(TrackableTypes.CardViewCollectionType), + Attaching(TrackableTypes.GameEntityViewType), EncodedCards(TrackableTypes.CardViewCollectionType), GainControlTargets(TrackableTypes.CardViewCollectionType), CloneOrigin(TrackableTypes.CardViewType), diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java b/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java index 06ff52f9f03..039f4bb85e3 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java @@ -404,56 +404,24 @@ public class TargetingOverlay { return; //don't add arcs for cards if card already visualized } - final CardView enchanting = c.getEnchantingCard(); - final CardView equipping = c.getEquipping(); - final CardView fortifying = c.getFortifying(); - final Iterable enchantedBy = c.getEnchantedBy(); - final Iterable equippedBy = c.getEquippedBy(); - final Iterable fortifiedBy = c.getFortifiedBy(); + final CardView attaching = c.getAttachingCard(); + final Iterable attachedBy = c.getAttachedBy(); final CardView paired = c.getPairedWith(); - if (null != enchanting) { - if (enchanting.getController() != null && !enchanting.getController().equals(c.getController())) { - addArc(endpoints.get(enchanting.getId()), endpoints.get(c.getId()), ArcConnection.Friends); - cardsVisualized.add(enchanting); + if (null != attaching) { + if (attaching.getController() != null && !attaching.getController().equals(c.getController())) { + addArc(endpoints.get(attaching.getId()), endpoints.get(c.getId()), ArcConnection.Friends); + cardsVisualized.add(attaching); } } - if (null != equipping) { - if (equipping.getController() != null && !equipping.getController().equals(c.getController())) { - addArc(endpoints.get(equipping.getId()), endpoints.get(c.getId()), ArcConnection.Friends); - cardsVisualized.add(equipping); - } - } - if (null != fortifying) { - if (fortifying.getController() != null && !fortifying.getController().equals(c.getController())) { - addArc(endpoints.get(fortifying.getId()), endpoints.get(c.getId()), ArcConnection.Friends); - cardsVisualized.add(fortifying); - } - } - if (null != enchantedBy) { - for (final CardView enc : enchantedBy) { + if (null != attachedBy) { + for (final CardView enc : attachedBy) { if (enc.getController() != null && !enc.getController().equals(c.getController())) { addArc(endpoints.get(c.getId()), endpoints.get(enc.getId()), ArcConnection.Friends); cardsVisualized.add(enc); } } } - if (null != equippedBy) { - for (final CardView eq : equippedBy) { - if (eq.getController() != null && !eq.getController().equals(c.getController())) { - addArc(endpoints.get(c.getId()), endpoints.get(eq.getId()), ArcConnection.Friends); - cardsVisualized.add(eq); - } - } - } - if (null != fortifiedBy) { - for (final CardView eq : fortifiedBy) { - if (eq.getController() != null && !eq.getController().equals(c.getController())) { - addArc(endpoints.get(c.getId()), endpoints.get(eq.getId()), ArcConnection.Friends); - cardsVisualized.add(eq); - } - } - } if (null != paired) { addArc(endpoints.get(paired.getId()), endpoints.get(c.getId()), ArcConnection.Friends); cardsVisualized.add(paired); diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/PlayArea.java b/forge-gui-desktop/src/main/java/forge/view/arcane/PlayArea.java index 434b62f10a7..42defe2a9bd 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/PlayArea.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/PlayArea.java @@ -106,7 +106,7 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen final CardStack stack = allLands.get(i); final CardPanel firstPanel = stack.get(0); if (firstPanel.getCard().getCurrentState().getName().equals(state.getName())) { - if (!firstPanel.getAttachedPanels().isEmpty() || firstPanel.getCard().isEnchanted()) { + if (!firstPanel.getAttachedPanels().isEmpty() || firstPanel.getCard().isAttached()) { // Put this land to the left of lands with the same name // and attachments. insertIndex = i; @@ -114,7 +114,7 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen } if (!panel.getAttachedPanels().isEmpty() || !panel.getCard().hasSameCounters(firstPanel.getCard()) - || firstPanel.getCard().isEnchanted() || (stack.size() == this.landStackMax)) { + || firstPanel.getCard().isAttached() || (stack.size() == this.landStackMax)) { // If this land has attachments or the stack is full, // put it to the right. insertIndex = i + 1; @@ -683,8 +683,8 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen } toPanel.getAttachedPanels().clear(); - if (card.isEnchanted()) { - final Iterable enchants = card.getEnchantedBy(); + if (card.isAttached()) { + final Iterable enchants = card.getAttachedBy(); for (final CardView e : enchants) { final CardPanel cardE = getCardPanel(e.getId()); if (cardE != null) { @@ -697,43 +697,9 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen } } - if (card.isEquipped()) { - final Iterable equips = card.getEquippedBy(); - for (final CardView e : equips) { - final CardPanel cardE = getCardPanel(e.getId()); - if (cardE != null) { - if (cardE.getAttachedToPanel() != toPanel) { - cardE.setAttachedToPanel(toPanel); - needLayoutRefresh = true; //ensure layout refreshed if any attachments change - } - toPanel.getAttachedPanels().add(cardE); - } - } - } - - if (card.isFortified()) { - final Iterable fortifications = card.getFortifiedBy(); - for (final CardView f : fortifications) { - final CardPanel cardE = getCardPanel(f.getId()); - if (cardE != null) { - if (cardE.getAttachedToPanel() != toPanel) { - cardE.setAttachedToPanel(toPanel); - needLayoutRefresh = true; //ensure layout refreshed if any attachments change - } - toPanel.getAttachedPanels().add(cardE); - } - } - } - CardPanel attachedToPanel; - if (card.getEnchantingCard() != null) { - attachedToPanel = getCardPanel(card.getEnchantingCard().getId()); - } - else if (card.getEquipping() != null) { - attachedToPanel = getCardPanel(card.getEquipping().getId()); - } - else if (card.getFortifying() != null) { - attachedToPanel = getCardPanel(card.getFortifying().getId()); + if (card.getAttachingCard() != null) { + attachedToPanel = getCardPanel(card.getAttachingCard().getId()); } else { attachedToPanel = null; 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 8508b594ac1..55a18ccfcbe 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 @@ -115,7 +115,7 @@ public class GameSimulatorTest extends SimulationTestCase { Card bear = addCard(bearCardName, p); bear.setSickness(false); Card cloak = addCard("Whispersilk Cloak", p); - cloak.equipCard(bear); + cloak.attachEntity(bear); game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); game.getAction().checkStateEffects(true); assertEquals(1, bear.getAmountOfKeyword("Unblockable")); @@ -133,7 +133,7 @@ public class GameSimulatorTest extends SimulationTestCase { Card bear = addCard(bearCardName, p); bear.setSickness(false); Card lifelink = addCard("Lifelink", p); - lifelink.enchantEntity(bear); + lifelink.attachEntity(bear); game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); game.getAction().checkStateEffects(true); assertEquals(1, bear.getAmountOfKeyword("Lifelink")); @@ -661,7 +661,7 @@ public class GameSimulatorTest extends SimulationTestCase { Card pridemate = addCard(pridemateName, p1); Card indestructibility = addCard(indestructibilityName, p1); - indestructibility.enchantEntity(pridemate); + indestructibility.attachEntity(pridemate); Card ignition = addCardToZone(ignitionName, p1, ZoneType.Hand); SpellAbility ignitionSA = ignition.getFirstSpellAbility(); @@ -681,6 +681,7 @@ public class GameSimulatorTest extends SimulationTestCase { // because it was destroyed assertNull(simBrood); + assertNotNull(simPridemate); assertEquals(0, simKalitas.getDamage()); assertEquals(3, simPridemate.getDamage()); @@ -774,7 +775,7 @@ public class GameSimulatorTest extends SimulationTestCase { Card pridemate = addCard(pridemateName, p1); Card indestructibility = addCard(indestructibilityName, p1); - indestructibility.enchantEntity(pridemate); + indestructibility.attachEntity(pridemate); Card ignition = addCardToZone(ignitionName, p1, ZoneType.Hand); SpellAbility ignitionSA = ignition.getFirstSpellAbility(); @@ -800,6 +801,7 @@ public class GameSimulatorTest extends SimulationTestCase { //destoryed because of to much redirected damage assertNull(simPalisade); + assertNotNull(simPridemate); assertEquals(0, simKalitas.getDamage()); assertEquals(3, simPridemate.getDamage()); diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java index 0af6bbac10f..4cdfa37511b 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java @@ -102,22 +102,16 @@ public class GameWrapper { actualController.getZone( zoneType ).add( actualCard ); if( card.getTarget() != null ) { - Card target = CardSpecificationHandler.INSTANCE.find( game, card.getTarget() ); - if( actualCard.isEnchantment() ) { - if( target.canBeEnchantedBy( actualCard ) ) { - actualCard.enchantEntity( target ); - } else { - throw new IllegalStateException( actualCard + " can't enchant " + target ); - } - } else if( actualCard.isEquipment() ) { - if( target.canBeEquippedBy( actualCard ) ) { - actualCard.equipCard( target ); - } else { - throw new IllegalStateException( actualCard + " can't equip " + target ); - } - } else { - throw new IllegalStateException( "Don't know how to make " + actualCard + " target anything" ); - } + Card target = CardSpecificationHandler.INSTANCE.find( game, card.getTarget() ); + if (actualCard.isAttachment()) { + if (target.canBeAttachedBy(actualCard)) { + actualCard.attachEntity(target); + } else { + throw new IllegalStateException( actualCard + " can't attach " + target ); + } + } else { + throw new IllegalStateException( "Don't know how to make " + actualCard + " target anything" ); + } } diff --git a/forge-gui/src/main/java/forge/card/CardDetailUtil.java b/forge-gui/src/main/java/forge/card/CardDetailUtil.java index 6e94eb844e2..aa7af823f87 100644 --- a/forge-gui/src/main/java/forge/card/CardDetailUtil.java +++ b/forge-gui/src/main/java/forge/card/CardDetailUtil.java @@ -441,48 +441,28 @@ public class CardDetailUtil { area.append(")"); } - // equipping - if (card.getEquipping() != null) { + // attached by + if (card.isAttached()) { if (area.length() != 0) { area.append("\n"); } - area.append("=Equipping "); - area.append(card.getEquipping()); + area.append("=Attached by "); + area.append(StringUtils.join(card.getAttachedBy(), ", ")); area.append("="); } - // equipped by - if (card.isEquipped()) { + // attaching + if (card.getAttachingCard() != null) { if (area.length() != 0) { area.append("\n"); } - area.append("=Equipped by "); - area.append(StringUtils.join(card.getEquippedBy(), ", ")); - area.append("="); + area.append("*Attaching ").append(card.getAttachingCard()).append("*"); } - - // enchanting - if (card.getEnchantingCard() != null) { + if (card.getAttachingPlayer() != null) { if (area.length() != 0) { area.append("\n"); } - area.append("*Enchanting ").append(card.getEnchantingCard()).append("*"); - } - if (card.getEnchantingPlayer() != null) { - if (area.length() != 0) { - area.append("\n"); - } - area.append("*Enchanting ").append(card.getEnchantingPlayer()).append("*"); - } - - // enchanted by - if (card.isEnchanted()) { - if (area.length() != 0) { - area.append("\n"); - } - area.append("*Enchanted by "); - area.append(StringUtils.join(card.getEnchantedBy(), ", ")); - area.append("*"); + area.append("*Enchanting ").append(card.getAttachingPlayer()).append("*"); } // controlling diff --git a/forge-gui/src/main/java/forge/quest/QuestUtil.java b/forge-gui/src/main/java/forge/quest/QuestUtil.java index 7ad6b6cd335..f9989979a51 100644 --- a/forge-gui/src/main/java/forge/quest/QuestUtil.java +++ b/forge-gui/src/main/java/forge/quest/QuestUtil.java @@ -595,7 +595,7 @@ public class QuestUtil { rules.setManaBurn(FModel.getPreferences().getPrefBoolean(FPref.UI_MANABURN)); rules.setCanCloneUseTargetsImage(FModel.getPreferences().getPrefBoolean(FPref.UI_CLONE_MODE_SOURCE)); - TreeSet variant = new TreeSet(); + final TreeSet variant = new TreeSet<>(); if(FModel.getQuest().getDeckConstructionRules() == DeckConstructionRules.Commander){ variant.add(GameType.Commander); } From 6bd06999f3358c7770835f3a0a7dad6bb1da1eed Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 17 Nov 2018 19:32:53 +0100 Subject: [PATCH 211/901] CI stylefix --- .../main/java/forge/game/ability/effects/UnattachAllEffect.java | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/UnattachAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/UnattachAllEffect.java index 33cca9dcbed..aec909dd3e7 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/UnattachAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/UnattachAllEffect.java @@ -7,7 +7,6 @@ import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; import forge.game.card.CardCollectionView; import forge.game.card.CardLists; -import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; From 7eda172ef729e51beb566b17e37020fed9f95000 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 17 Nov 2018 22:15:48 +0300 Subject: [PATCH 212/901] - Fix compile for mobile Forge, update imports. --- .../src/main/java/forge/game/phase/Untap.java | 14 ++++---- .../screens/match/views/VCardDisplayArea.java | 34 +++---------------- .../src/forge/screens/match/views/VField.java | 4 +-- 3 files changed, 12 insertions(+), 40 deletions(-) diff --git a/forge-game/src/main/java/forge/game/phase/Untap.java b/forge-game/src/main/java/forge/game/phase/Untap.java index d256711e719..0ed7990fc3e 100644 --- a/forge-game/src/main/java/forge/game/phase/Untap.java +++ b/forge-game/src/main/java/forge/game/phase/Untap.java @@ -17,20 +17,12 @@ */ package forge.game.phase; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Lists; import com.google.common.collect.Maps; - import forge.card.CardType; import forge.game.Game; -import forge.game.GameEntity; import forge.game.ability.ApiType; import forge.game.card.Card; import forge.game.card.CardCollection; @@ -42,6 +34,12 @@ import forge.game.player.PlayerController.BinaryChoiceType; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + /** *

* Untap class. diff --git a/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java b/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java index 81070fcc75f..7c3a3ca1eaa 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java @@ -279,8 +279,8 @@ public abstract class VCardDisplayArea extends VDisplayArea implements ActivateH attachedPanels.clear(); - if (card.isEnchanted()) { - final Iterable enchants = card.getEnchantedBy(); + if (card.isAttached()) { + final Iterable enchants = card.getAttachedBy(); for (final CardView e : enchants) { final CardAreaPanel cardE = CardAreaPanel.get(e); if (cardE != null) { @@ -289,34 +289,8 @@ public abstract class VCardDisplayArea extends VDisplayArea implements ActivateH } } - if (card.isEquipped()) { - final Iterable enchants = card.getEquippedBy(); - for (final CardView e : enchants) { - final CardAreaPanel cardE = CardAreaPanel.get(e); - if (cardE != null) { - attachedPanels.add(cardE); - } - } - } - - if (card.isFortified()) { - final Iterable fortifications = card.getFortifiedBy(); - for (final CardView e : fortifications) { - final CardAreaPanel cardE = CardAreaPanel.get(e); - if (cardE != null) { - attachedPanels.add(cardE); - } - } - } - - if (card.getEnchantingCard() != null) { - setAttachedToPanel(CardAreaPanel.get(card.getEnchantingCard())); - } - else if (card.getEquipping() != null) { - setAttachedToPanel(CardAreaPanel.get(card.getEquipping())); - } - else if (card.getFortifying() != null) { - setAttachedToPanel(CardAreaPanel.get(card.getFortifying())); + if (card.getAttachingCard() != null) { + setAttachedToPanel(CardAreaPanel.get(card.getAttachingCard())); } else { setAttachedToPanel(null); diff --git a/forge-gui-mobile/src/forge/screens/match/views/VField.java b/forge-gui-mobile/src/forge/screens/match/views/VField.java index 379fa140876..c49c128f2d9 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VField.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VField.java @@ -99,7 +99,7 @@ public class VField extends FContainer { }; private boolean tryStackCard(CardView card, List cardsOfType) { - if (card.isEnchanted() || card.isEquipped()) { + if (card.isAttached()) { return false; //can stack with enchanted or equipped card } if (card.getCurrentState().isCreature() && !card.isToken()) { @@ -107,7 +107,7 @@ public class VField extends FContainer { } final String cardName = card.getCurrentState().getName(); for (CardView c : cardsOfType) { - if (!c.isEnchanted() && !c.isEquipped() && + if (!c.isAttached() && cardName.equals(c.getCurrentState().getName()) && card.hasSameCounters(c) && card.isToken() == c.isToken()) { //don't stack tokens on top of non-tokens From 9eaa749ab29ef22ad4b337e2ebbed49eee29d141 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 17 Nov 2018 22:22:09 +0300 Subject: [PATCH 213/901] - Phrasing correction in texts (still think we need to update the method names...) --- .../test/java/forge/gamesimulationtests/util/GameWrapper.java | 2 +- forge-gui/src/main/java/forge/card/CardDetailUtil.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java index 4cdfa37511b..a296d1e0c54 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java @@ -107,7 +107,7 @@ public class GameWrapper { if (target.canBeAttachedBy(actualCard)) { actualCard.attachEntity(target); } else { - throw new IllegalStateException( actualCard + " can't attach " + target ); + throw new IllegalStateException( actualCard + " can't attach to " + target ); } } else { throw new IllegalStateException( "Don't know how to make " + actualCard + " target anything" ); diff --git a/forge-gui/src/main/java/forge/card/CardDetailUtil.java b/forge-gui/src/main/java/forge/card/CardDetailUtil.java index aa7af823f87..c145f459e59 100644 --- a/forge-gui/src/main/java/forge/card/CardDetailUtil.java +++ b/forge-gui/src/main/java/forge/card/CardDetailUtil.java @@ -446,7 +446,7 @@ public class CardDetailUtil { if (area.length() != 0) { area.append("\n"); } - area.append("=Attached by "); + area.append("=Attached: "); area.append(StringUtils.join(card.getAttachedBy(), ", ")); area.append("="); } @@ -456,7 +456,7 @@ public class CardDetailUtil { if (area.length() != 0) { area.append("\n"); } - area.append("*Attaching ").append(card.getAttachingCard()).append("*"); + area.append("*Attached to ").append(card.getAttachingCard()).append("*"); } if (card.getAttachingPlayer() != null) { if (area.length() != 0) { From 8588cf03101c725fdaa67f5d22f3533046421622 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sun, 18 Nov 2018 19:49:34 +0100 Subject: [PATCH 214/901] TestCase: test cards get new Timestamp --- .../src/test/java/forge/ai/simulation/SimulationTestCase.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/forge-gui-desktop/src/test/java/forge/ai/simulation/SimulationTestCase.java b/forge-gui-desktop/src/test/java/forge/ai/simulation/SimulationTestCase.java index e3aee9cb6f5..7b7a8bfe108 100644 --- a/forge-gui-desktop/src/test/java/forge/ai/simulation/SimulationTestCase.java +++ b/forge-gui-desktop/src/test/java/forge/ai/simulation/SimulationTestCase.java @@ -126,6 +126,8 @@ public class SimulationTestCase extends TestCase { protected Card addCardToZone(String name, Player p, ZoneType zone) { Card c = createCard(name, p); + // card need a new Timestamp otherwise Static Abilities might collide + c.setTimestamp(p.getGame().getNextTimestamp()); p.getZone(zone).add(c); return c; } From 52438170ac99160ca781ba911188d64cc716a10d Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sun, 18 Nov 2018 19:51:41 +0100 Subject: [PATCH 215/901] Bludgeon Brawl TestCases --- .../ai/simulation/GameSimulatorTest.java | 300 +++++++++++++----- 1 file changed, 226 insertions(+), 74 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 55a18ccfcbe..af6c42d9566 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 @@ -8,6 +8,7 @@ import forge.game.Game; import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CounterType; +import forge.game.keyword.Keyword; import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.spellability.SpellAbility; @@ -35,7 +36,7 @@ public class GameSimulatorTest extends SimulationTestCase { GameSimulator sim = createSimulator(game, p); int score = sim.simulateSpellAbility(outlastSA).value; - assertTrue(score > 0); + assertTrue(score > 0); Game simGame = sim.getSimulatedGameState(); Card heraldCopy = findCardWithName(simGame, heraldCardName); @@ -65,7 +66,7 @@ public class GameSimulatorTest extends SimulationTestCase { addCard("Plains", p); addCard("Plains", p); addCard("Spear of Heliod", p); - + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); game.getAction().checkStateEffects(true); game.getAction().checkStateEffects(true); @@ -79,7 +80,7 @@ public class GameSimulatorTest extends SimulationTestCase { GameSimulator sim = createSimulator(game, p); int score = sim.simulateSpellAbility(outlastSA).value; - assertTrue(score > 0); + assertTrue(score > 0); Game simGame = sim.getSimulatedGameState(); Card sliverCopy = findCardWithName(simGame, sliverCardName); assertEquals(1, sliverCopy.getAmountOfKeyword("Flanking")); @@ -143,7 +144,7 @@ public class GameSimulatorTest extends SimulationTestCase { Card bearCopy = findCardWithName(simGame, bearCardName); assertEquals(1, bearCopy.getAmountOfKeyword("Lifelink")); } - + public void testEtbTriggers() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); @@ -162,12 +163,12 @@ public class GameSimulatorTest extends SimulationTestCase { GameSimulator sim = createSimulator(game, p); int origScore = sim.getScoreForOrigGame().value; int score = sim.simulateSpellAbility(playMerchantSa).value; - assertTrue(String.format("score=%d vs. origScore=%d", score, origScore), score > origScore); + assertTrue(String.format("score=%d vs. origScore=%d", score, origScore), score > origScore); Game simGame = sim.getSimulatedGameState(); assertEquals(24, simGame.getPlayers().get(1).getLife()); assertEquals(16, simGame.getPlayers().get(0).getLife()); } - + public void testSimulateUnmorph() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); @@ -179,7 +180,7 @@ public class GameSimulatorTest extends SimulationTestCase { game.getAction().checkStateEffects(true); assertEquals(20, game.getPlayers().get(0).getLife()); - + GameSimulator sim = createSimulator(game, p); Game simGame = sim.getSimulatedGameState(); @@ -188,7 +189,7 @@ public class GameSimulatorTest extends SimulationTestCase { sim.simulateSpellAbility(unmorphSA); assertEquals(18, simGame.getPlayers().get(0).getLife()); } - + public void testFindingOwnCard() { Game game = initAndCreateGame(); Player p0 = game.getPlayers().get(0); @@ -199,7 +200,7 @@ public class GameSimulatorTest extends SimulationTestCase { addCard("Swamp", p1); game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p1); game.getAction().checkStateEffects(true); - + GameSimulator sim = createSimulator(game, p1); Game simGame = sim.getSimulatedGameState(); @@ -210,7 +211,7 @@ public class GameSimulatorTest extends SimulationTestCase { assertEquals(1, simGame.getPlayers().get(0).getCardsIn(ZoneType.Hand).size()); assertEquals(0, simGame.getPlayers().get(1).getCardsIn(ZoneType.Hand).size()); } - + public void testPlaneswalkerAbilities() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); @@ -241,7 +242,7 @@ public class GameSimulatorTest extends SimulationTestCase { minusTwoSim.setActivatingPlayer(simP); assertFalse(minusTwoSim.canPlay()); assertEquals(1, minusTwoSim.getActivationsThisTurn()); - + GameCopier copier = new GameCopier(simGame); Game copy = copier.makeCopy(); Player copyP = copy.getPlayers().get(1); @@ -290,12 +291,12 @@ public class GameSimulatorTest extends SimulationTestCase { addCard("Plains", p); Card soulSummons = addCardToZone("Soul Summons", p, ZoneType.Hand); addCardToZone("Ornithopter", p, ZoneType.Library); - + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); game.getAction().checkStateEffects(true); SpellAbility manifestSA = soulSummons.getSpellAbilities().get(0); - + GameSimulator sim = createSimulator(game, p); sim.simulateSpellAbility(manifestSA); Game simGame = sim.getSimulatedGameState(); @@ -328,12 +329,12 @@ public class GameSimulatorTest extends SimulationTestCase { addCard("Plains", p); Card soulSummons = addCardToZone("Soul Summons", p, ZoneType.Hand); addCardToZone("Plains", p, ZoneType.Library); - + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); game.getAction().checkStateEffects(true); SpellAbility manifestSA = soulSummons.getSpellAbilities().get(0); - + GameSimulator sim = createSimulator(game, p); sim.simulateSpellAbility(manifestSA); Game simGame = sim.getSimulatedGameState(); @@ -354,12 +355,12 @@ public class GameSimulatorTest extends SimulationTestCase { addCard("Plains", p); Card soulSummons = addCardToZone("Soul Summons", p, ZoneType.Hand); addCardToZone("Dryad Arbor", p, ZoneType.Library); - + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); game.getAction().checkStateEffects(true); SpellAbility manifestSA = soulSummons.getSpellAbilities().get(0); - + GameSimulator sim = createSimulator(game, p); sim.simulateSpellAbility(manifestSA); Game simGame = sim.getSimulatedGameState(); @@ -401,7 +402,7 @@ public class GameSimulatorTest extends SimulationTestCase { assertTrue(sarkhanCopy.isCreature()); assertFalse(sarkhanCopy.isPlaneswalker()); } - + public void testDistributeCountersAbility() { String ajaniCardName = "Ajani, Mentor of Heroes"; String ornithoperCardName = "Ornithopter"; @@ -430,7 +431,7 @@ public class GameSimulatorTest extends SimulationTestCase { assertEquals(3, thopterSim.getCounters(CounterType.P1P1) + bearSim.getCounters(CounterType.P1P1)); } } - + public void testDamagePreventedTrigger() { String ajaniCardName = "Ajani Steadfast"; String selflessCardName = "Selfless Squire"; @@ -446,7 +447,6 @@ public class GameSimulatorTest extends SimulationTestCase { ajani.addCounter(CounterType.LOYALTY, 8, p, false); game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); game.getAction().checkStateEffects(true); - SpellAbility sa = findSAWithPrefix(ajani, "-7:"); assertNotNull(sa); @@ -480,7 +480,7 @@ public class GameSimulatorTest extends SimulationTestCase { game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); game.getAction().checkStateEffects(true); assertEquals(3, bear.getNetToughness()); - + GameCopier copier = new GameCopier(game); Game copy = copier.makeCopy(); Card bearCopy = findCardWithName(copy, bearCardName); @@ -498,8 +498,9 @@ public class GameSimulatorTest extends SimulationTestCase { game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); game.getAction().checkStateEffects(true); assertTrue(depths.hasCounters()); - - SpellAbility sa = findSAWithPrefix(thespian, "{2}, {T}: CARDNAME becomes a copy of target land and gains this ability."); + + SpellAbility sa = findSAWithPrefix(thespian, + "{2}, {T}: CARDNAME becomes a copy of target land and gains this ability."); assertNotNull(sa); sa.getTargets().add(depths); @@ -512,7 +513,7 @@ public class GameSimulatorTest extends SimulationTestCase { assertNull(strSimGame, findCardWithName(simGame, "Thespian's Stage")); assertNotNull(strSimGame, findCardWithName(simGame, "Marit Lage")); } - + public void testThespianStageSelfCopy() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); @@ -522,8 +523,9 @@ public class GameSimulatorTest extends SimulationTestCase { assertTrue(thespian.isLand()); game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); game.getAction().checkStateEffects(true); - - SpellAbility sa = findSAWithPrefix(thespian, "{2}, {T}: CARDNAME becomes a copy of target land and gains this ability."); + + SpellAbility sa = findSAWithPrefix(thespian, + "{2}, {T}: CARDNAME becomes a copy of target land and gains this ability."); assertNotNull(sa); sa.getTargets().add(thespian); @@ -551,7 +553,7 @@ public class GameSimulatorTest extends SimulationTestCase { GameSimulator sim = createSimulator(game, p); int score = sim.simulateSpellAbility(dashSA).value; - assertTrue(score > 0); + assertTrue(score > 0); Game simGame = sim.getSimulatedGameState(); Card berserker = findCardWithName(simGame, berserkerCardName); @@ -559,7 +561,7 @@ public class GameSimulatorTest extends SimulationTestCase { assertEquals(1, berserker.getNetPower()); assertEquals(1, berserker.getNetToughness()); assertFalse(berserker.isSick()); - + SpellAbility pumpSA = findSAWithPrefix(berserker, "{R}: CARDNAME gets +1/+0 until end of turn."); assertNotNull(pumpSA); GameSimulator sim2 = createSimulator(simGame, (Player) sim.getGameCopier().find(p)); @@ -588,7 +590,7 @@ public class GameSimulatorTest extends SimulationTestCase { GameSimulator sim = createSimulator(game, p); int score = sim.simulateSpellAbility(callTheScionsSA).value; - assertTrue(score > 0); + assertTrue(score > 0); Game simGame = sim.getSimulatedGameState(); Card scion = findCardWithName(simGame, "Eldrazi Scion"); @@ -609,8 +611,10 @@ public class GameSimulatorTest extends SimulationTestCase { } public void testMarkedDamage() { - // Marked damage is important, as it's used during the AI declare attackers logic - // which affects game state score - since P/T boosts are evaluated differently for + // Marked damage is important, as it's used during the AI declare + // attackers logic + // which affects game state score - since P/T boosts are evaluated + // differently for // creatures participating in combat. Game game = initAndCreateGame(); @@ -623,24 +627,24 @@ public class GameSimulatorTest extends SimulationTestCase { game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); game.getAction().checkStateEffects(true); - + assertEquals(3, giant.getNetPower()); assertEquals(3, giant.getNetToughness()); assertEquals(0, giant.getDamage()); - + GameSimulator sim = createSimulator(game, p); shockSA.setTargetCard(giant); sim.simulateSpellAbility(shockSA); Game simGame = sim.getSimulatedGameState(); Card simGiant = findCardWithName(simGame, giantCardName); assertEquals(2, simGiant.getDamage()); - + GameCopier copier = new GameCopier(simGame); Game copy = copier.makeCopy(); Card giantCopy = findCardWithName(copy, giantCardName); assertEquals(2, giantCopy.getDamage()); } - + public void testLifelinkDamageSpell() { Game game = initAndCreateGame(); Player p1 = game.getPlayers().get(0); @@ -799,7 +803,7 @@ public class GameSimulatorTest extends SimulationTestCase { assertNotNull(simBrood); assertEquals(0, simBrood.getDamage()); - //destoryed because of to much redirected damage + // destoryed because of to much redirected damage assertNull(simPalisade); assertNotNull(simPridemate); @@ -848,7 +852,10 @@ public class GameSimulatorTest extends SimulationTestCase { coneSA.setTargetCard(bearCard); // one damage to bear coneSA.getSubAbility().setTargetCard(giantCard); // two damage to giant - coneSA.getSubAbility().getSubAbility().getTargets().add(p2); // three damage to player + coneSA.getSubAbility().getSubAbility().getTargets().add(p2); // three + // damage + // to + // player game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p1); game.getAction().checkStateEffects(true); @@ -861,7 +868,8 @@ public class GameSimulatorTest extends SimulationTestCase { Card simGiant = findCardWithName(simGame, giantCardName); Card simPridemate = findCardWithName(simGame, pridemateName); - // spell deals multiple damages to multiple targets, only one cause of lifegain + // spell deals multiple damages to multiple targets, only one cause of + // lifegain assertNotNull(simPridemate); assertTrue(simPridemate.hasCounters()); assertEquals(1, simPridemate.getCounters(CounterType.P1P1)); @@ -877,7 +885,7 @@ public class GameSimulatorTest extends SimulationTestCase { // 1 + 2 + 3 lifegain assertEquals(26, simGame.getPlayers().get(0).getLife()); assertEquals(17, simGame.getPlayers().get(1).getLife()); - + // second pard with Everlasting Torment addCard(tormentName, p2); @@ -914,7 +922,7 @@ public class GameSimulatorTest extends SimulationTestCase { assertEquals(20, simGame2.getPlayers().get(0).getLife()); assertEquals(17, simGame2.getPlayers().get(1).getLife()); - // third pard with Melira prevents wither + // third pard with Melira prevents wither addCard(meliraName, p2); GameSimulator sim3 = createSimulator(game, p1); @@ -964,11 +972,11 @@ public class GameSimulatorTest extends SimulationTestCase { game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); game.getAction().checkStateEffects(true); - + assertTrue(lilianaInPlay.isCreature()); assertEquals(2, lilianaInPlay.getNetPower()); assertEquals(3, lilianaInPlay.getNetToughness()); - + SpellAbility playLiliana = lilianaInHand.getSpellAbilities().get(0); GameSimulator sim = createSimulator(game, p); sim.simulateSpellAbility(playLiliana); @@ -1004,7 +1012,7 @@ public class GameSimulatorTest extends SimulationTestCase { Game simGame = sim.getSimulatedGameState(); Player simP = simGame.getPlayers().get(1); assertEquals(2, simP.getCounters(CounterType.ENERGY)); - + GameCopier copier = new GameCopier(simGame); Game copy = copier.makeCopy(); Player copyP = copy.getPlayers().get(1); @@ -1034,7 +1042,7 @@ public class GameSimulatorTest extends SimulationTestCase { Card darkConfidantCard2 = (Card) sim.getGameCopier().find(darkConfidantCard); SpellAbility playDarkConfidant2 = darkConfidantCard2.getSpellAbilities().get(0); Card deathriteCard2 = (Card) sim.getGameCopier().find(deathriteCard); - + GameSimulator sim2 = createSimulator(simGame, simP); sim2.simulateSpellAbility(playDarkConfidant2); Game sim2Game = sim2.getSimulatedGameState(); @@ -1056,40 +1064,40 @@ public class GameSimulatorTest extends SimulationTestCase { public void testEnKor() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(0); - + String soulfireName = "Soulfire Grand Master"; String pridemateName = "Ajani's Pridemate"; - + String enKorName = "Spirit en-Kor"; String bearName = "Runeclaw Bear"; String shockName = "Shock"; - + addCard("Mountain", p); addCard(soulfireName, p); addCard(pridemateName, p); Card shockCard = addCardToZone(shockName, p, ZoneType.Hand); - + Card enKor = addCard(enKorName, p); - + SpellAbility enKorSA = findSAWithPrefix(enKor, "{0}:"); - + Card bear = addCard(bearName, p); - + SpellAbility shockSA = shockCard.getFirstSpellAbility(); game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); game.getAction().checkStateEffects(true); - + assertEquals(2, enKor.getNetPower()); assertEquals(2, enKor.getNetToughness()); assertEquals(0, enKor.getDamage()); - + assertEquals(2, bear.getNetPower()); assertEquals(2, bear.getNetToughness()); assertEquals(0, bear.getDamage()); - + GameSimulator sim = createSimulator(game, p); enKorSA.setTargetCard(bear); shockSA.setTargetCard(enKor); @@ -1098,13 +1106,13 @@ public class GameSimulatorTest extends SimulationTestCase { Game simGame = sim.getSimulatedGameState(); Card simEnKor = findCardWithName(simGame, enKorName); Card simBear = findCardWithName(simGame, bearName); - + assertNotNull(simEnKor); assertEquals(1, simEnKor.getDamage()); assertNotNull(simBear); assertEquals(1, simBear.getDamage()); - + Card simPridemate = findCardWithName(simGame, pridemateName); // only triggered once @@ -1115,7 +1123,7 @@ public class GameSimulatorTest extends SimulationTestCase { assertEquals(22, simGame.getPlayers().get(0).getLife()); } - + public void testRazia() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(0); @@ -1183,14 +1191,14 @@ public class GameSimulatorTest extends SimulationTestCase { public void testRazia2() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(0); - + String soulfireName = "Soulfire Grand Master"; String pridemateName = "Ajani's Pridemate"; - + String raziaName = "Razia, Boros Archangel"; String elementalName = "Air Elemental"; String shockName = "Shock"; - + for (int i = 0; i < 2; ++i) { addCard("Mountain", p); } @@ -1200,13 +1208,13 @@ public class GameSimulatorTest extends SimulationTestCase { Card shockCard1 = addCardToZone(shockName, p, ZoneType.Hand); Card shockCard2 = addCardToZone(shockName, p, ZoneType.Hand); - + Card razia = addCard(raziaName, p); - + SpellAbility preventSA = findSAWithPrefix(razia, "{T}:"); - + Card elemental = addCard(elementalName, p); - + SpellAbility shockSA1 = shockCard1.getFirstSpellAbility(); SpellAbility shockSA2 = shockCard2.getFirstSpellAbility(); @@ -1214,11 +1222,11 @@ public class GameSimulatorTest extends SimulationTestCase { game.getAction().checkStateEffects(true); assertEquals(0, razia.getDamage()); - + assertEquals(4, elemental.getNetPower()); assertEquals(4, elemental.getNetToughness()); assertEquals(0, elemental.getDamage()); - + GameSimulator sim = createSimulator(game, p); preventSA.setTargetCard(razia); preventSA.getSubAbility().setTargetCard(elemental); @@ -1230,14 +1238,14 @@ public class GameSimulatorTest extends SimulationTestCase { Game simGame = sim.getSimulatedGameState(); Card simRazia = findCardWithName(simGame, raziaName); Card simElemental = findCardWithName(simGame, elementalName); - + assertNotNull(simRazia); assertEquals(1, simRazia.getDamage()); // elemental not destroyed assertNotNull(simElemental); assertEquals(3, simElemental.getDamage()); - + Card simPridemate = findCardWithName(simGame, pridemateName); // only triggered twice @@ -1317,8 +1325,10 @@ public class GameSimulatorTest extends SimulationTestCase { } public void testPlayerXCount() { - // If playerXCount is operational, then conditions that count something about the player (e.g. - // cards in hand, life total) should work, similar to the Bloodghast "Haste" condition. + // If playerXCount is operational, then conditions that count something + // about the player (e.g. + // cards in hand, life total) should work, similar to the Bloodghast + // "Haste" condition. Game game = initAndCreateGame(); Player p = game.getPlayers().get(0); Player opp = game.getPlayers().get(1); @@ -1327,12 +1337,12 @@ public class GameSimulatorTest extends SimulationTestCase { Card bloodghast = addCardToZone("Bloodghast", p, ZoneType.Battlefield); game.getAction().checkStateEffects(true); - assert(!bloodghast.hasKeyword("Haste")); + assert (!bloodghast.hasKeyword("Haste")); opp.setLife(5, null); game.getAction().checkStateEffects(true); - assert(bloodghast.hasKeyword("Haste")); + assert (bloodghast.hasKeyword("Haste")); } public void testDeathsShadow() { @@ -1345,10 +1355,152 @@ public class GameSimulatorTest extends SimulationTestCase { p.setLife(1, null); game.getAction().checkStateEffects(true); - assert(deathsShadow.getNetPower() == 12); + assert (deathsShadow.getNetPower() == 12); p.setLife(-1, null); game.getAction().checkStateEffects(true); - assert(deathsShadow.getNetPower() == 13); // on negative life, should always be 13/13 + assert (deathsShadow.getNetPower() == 13); // on negative life, should + // always be 13/13 } + + public void testBludgeonBrawlLatticeAura() { + // Enchantment Aura are with Mycosynth Lattice turned into Artifact Enchantment - Aura Equipment + // Creature Auras should stay on + String bearCardName = "Runeclaw Bear"; + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + + Card bear = addCard(bearCardName, p); + bear.setSickness(false); + Card lifelink = addCard("Lifelink", p); + lifelink.attachEntity(bear); + + assertTrue(bear.isEnchanted()); + assertTrue(bear.isAttachedBy(lifelink)); + + // this adds Artifact Type + addCardToZone("Mycosynth Lattice", p, ZoneType.Battlefield); + + game.getAction().checkStateEffects(true); + assertTrue(bear.isEnchanted()); + assertFalse(bear.isEquipped()); + + assertTrue(lifelink.isArtifact()); + assertFalse(lifelink.isEquipment()); + + // this add Equipment and causes it to fall off + addCardToZone("Bludgeon Brawl", p, ZoneType.Battlefield); + game.getAction().checkStateEffects(true); + assertTrue(bear.isEnchanted()); + assertTrue(bear.isEquipped()); + + assertTrue(lifelink.isArtifact()); + assertTrue(lifelink.isEquipment()); + + // still in battlefield + assertTrue(lifelink.isInPlay()); + } + + public void testBludgeonBrawlLatticeCurse() { + // Enchantment Aura are with Mycosynth Lattice turned into Artifact Enchantment - Aura Equipment + // Curses can only attach Player, but Equipment can only attach to Creature so it does fall off + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + + final String curseName = "Cruel Reality"; + + Card curse = addCard(curseName, p); + curse.attachEntity(p); + game.getAction().checkStateEffects(true); + assertTrue(p.isEnchanted()); + assertTrue(p.isAttachedBy(curse)); + + // this adds Artifact Type + addCardToZone("Mycosynth Lattice", p, ZoneType.Battlefield); + + game.getAction().checkStateEffects(true); + assertTrue(p.isEnchanted()); + assertTrue(curse.isArtifact()); + + // this add Equipment and causes it to fall off + addCardToZone("Bludgeon Brawl", p, ZoneType.Battlefield); + game.getAction().checkStateEffects(true); + assertFalse(p.isEnchanted()); + + // not in Battlefield anymore + assertFalse(curse.isInPlay()); + assertTrue(curse.isInZone(ZoneType.Graveyard)); + } + + public void testBludgeonBrawlFortification() { + // Bludgeon Brawl makes Fortification into Equipment + // that means it can't attach a Land anymore if the Land is no Creature + + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + + Card mountain = addCardToZone("Mountain", p, ZoneType.Battlefield); + Card fortification = addCardToZone("Darksteel Garrison", p, ZoneType.Battlefield); + + fortification.attachEntity(mountain); + game.getAction().checkStateEffects(true); + + assertTrue(fortification.isFortification()); + assertFalse(fortification.isEquipment()); + + assertTrue(mountain.isFortified()); + assertTrue(mountain.isAttachedBy(fortification)); + assertTrue(mountain.hasKeyword(Keyword.INDESTRUCTIBLE)); + + // adding Brawl will cause the Fortification into Equipment and it to + // fall off + addCardToZone("Bludgeon Brawl", p, ZoneType.Battlefield); + game.getAction().checkStateEffects(true); + + assertFalse(fortification.isFortification()); + assertTrue(fortification.isEquipment()); + + assertFalse(mountain.isAttachedBy(fortification)); + assertFalse(mountain.hasKeyword(Keyword.INDESTRUCTIBLE)); + } + + public void testBludgeonBrawlFortificationDryad() { + // Bludgeon Brawl makes Fortification into Equipment + // that means it can't attach a Land anymore if the Land is no Creature too + // Dryad Arbor is both a Land and a Creature so it stays attached + + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + + Card dryad = addCardToZone("Dryad Arbor", p, ZoneType.Battlefield); + Card fortification = addCardToZone("Darksteel Garrison", p, ZoneType.Battlefield); + + fortification.attachEntity(dryad); + game.getAction().checkStateEffects(true); + + assertTrue(dryad.isFortified()); + assertFalse(dryad.isEquipped()); + + assertTrue(dryad.isAttachedBy(fortification)); + assertTrue(dryad.hasKeyword(Keyword.INDESTRUCTIBLE)); + + // adding Brawl will cause the Fortification into Equipment + // because Dryad Arbor is a Creature it stays attached + addCardToZone("Bludgeon Brawl", p, ZoneType.Battlefield); + game.getAction().checkStateEffects(true); + + // switched from Fortification to Equipment + assertFalse(dryad.isFortified()); + assertTrue(dryad.isEquipped()); + + assertTrue(dryad.isAttachedBy(fortification)); + assertTrue(dryad.hasKeyword(Keyword.INDESTRUCTIBLE)); + } + + } From df83e7c7839ab322d568f73d87c6c108cd66748f Mon Sep 17 00:00:00 2001 From: Hanmac Date: Tue, 20 Nov 2018 23:36:41 +0100 Subject: [PATCH 216/901] ST: CantAttach begins to replace other cases --- .../src/main/java/forge/ai/ComputerUtil.java | 2 +- .../main/java/forge/ai/ability/AttachAi.java | 78 ++++++++++--------- .../java/forge/ai/ability/ZoneExchangeAi.java | 2 +- .../src/main/java/forge/game/GameEntity.java | 33 +++++--- .../game/ability/effects/AttachEffect.java | 2 +- .../ability/effects/ZoneExchangeEffect.java | 2 +- .../src/main/java/forge/game/card/Card.java | 50 +++++------- .../java/forge/game/card/CardPredicates.java | 13 +--- .../java/forge/game/card/CardProperty.java | 14 ++-- .../game/staticability/StaticAbility.java | 2 + .../StaticAbilityCantAttach.java | 22 ++++++ .../res/cardsfolder/g/goblin_brawler.txt | 2 +- .../res/cardsfolder/g/grifters_blade.txt | 2 +- 13 files changed, 123 insertions(+), 101 deletions(-) create mode 100644 forge-game/src/main/java/forge/game/staticability/StaticAbilityCantAttach.java diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index 703016b4c81..4c3d29267f7 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -975,7 +975,7 @@ public class ComputerUtil { playNow = false; break; } - if (!playNow && c.isCreature() && ComputerUtilCombat.canAttackNextTurn(c) && c.canBeEquippedBy(card)) { + if (!playNow && c.isCreature() && ComputerUtilCombat.canAttackNextTurn(c) && c.canBeAttachedBy(card)) { playNow = true; } } diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index 6deb3089770..82cd94d0621 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -125,7 +125,7 @@ public class AttachAi extends SpellAbilityAi { return false; } } - + return true; } @@ -240,7 +240,7 @@ public class AttachAi extends SpellAbilityAi { /** * Acceptable choice. - * + * * @param c * the c * @param mandatory @@ -265,7 +265,7 @@ public class AttachAi extends SpellAbilityAi { /** * Choose unpreferred. - * + * * @param mandatory * the mandatory * @param list @@ -282,7 +282,7 @@ public class AttachAi extends SpellAbilityAi { /** * Choose less preferred. - * + * * @param mandatory * the mandatory * @param list @@ -299,7 +299,7 @@ public class AttachAi extends SpellAbilityAi { /** * Attach ai change type preference. - * + * * @param sa * the sa * @param list @@ -330,7 +330,7 @@ public class AttachAi extends SpellAbilityAi { } list = CardLists.getNotType(list, type); // Filter out Basic Lands that have the same type as the changing type - + // Don't target fetchlands list = CardLists.filter(list, new Predicate() { @Override @@ -371,7 +371,7 @@ public class AttachAi extends SpellAbilityAi { /** * Attach ai keep tapped preference. - * + * * @param sa * the sa * @param list @@ -499,7 +499,7 @@ public class AttachAi extends SpellAbilityAi { /** * Attach ai control preference. - * + * * @param sa * the sa * @param list @@ -570,7 +570,7 @@ public class AttachAi extends SpellAbilityAi { } c = ComputerUtilCard.getWorstAI(betterList); } - + // If Mandatory (brought directly into play without casting) gotta // choose something @@ -583,7 +583,7 @@ public class AttachAi extends SpellAbilityAi { /** * Attach ai reanimate preference. - * + * * @param sa * the sa * @param list @@ -670,7 +670,7 @@ public class AttachAi extends SpellAbilityAi { } /** * Attach ai specific card preference. - * + * * @param sa * the sa * @param list @@ -687,7 +687,7 @@ public class AttachAi extends SpellAbilityAi { final Player ai = sa.getActivatingPlayer(); final String sourceName = ComputerUtilAbility.getAbilitySourceName(sa); Card chosen = null; - + if ("Guilty Conscience".equals(sourceName)) { chosen = SpecialCardAi.GuiltyConscience.getBestAttachTarget(ai, sa, list); } else if ("Bonds of Faith".equals(sourceName)) { @@ -746,7 +746,7 @@ public class AttachAi extends SpellAbilityAi { // Should generalize this code a bit since they all have similar structures /** * Attach ai control preference. - * + * * @param sa * the sa * @param list @@ -782,7 +782,7 @@ public class AttachAi extends SpellAbilityAi { /** * Attach ai highest evaluated preference. - * + * * @param list the initial valid list * @return the card */ @@ -792,7 +792,7 @@ public class AttachAi extends SpellAbilityAi { /** * Attach ai curse preference. - * + * * @param sa * the sa * @param list @@ -916,7 +916,7 @@ public class AttachAi extends SpellAbilityAi { * the sa * @param mandatory * the mandatory - * + * * @return true, if successful */ @Override @@ -986,7 +986,7 @@ public class AttachAi extends SpellAbilityAi { /** * Attach ai pump preference. - * + * * @param sa * the sa * @param list @@ -1066,7 +1066,7 @@ public class AttachAi extends SpellAbilityAi { list.removeAll(toRemove); if (magnetList != null) { - + // Look for Heroic triggers if (magnetList.isEmpty() && sa.isSpell()) { for (Card target : list) { @@ -1256,7 +1256,7 @@ public class AttachAi extends SpellAbilityAi { /** * Attach to card ai preferences. - * + * * @param sa * the sa * @param sa @@ -1275,6 +1275,12 @@ public class AttachAi extends SpellAbilityAi { if (attachSource.hasSVar("DontEquip")) { return null; } + + // is no attachment so no using attach + if (!attachSource.isAttachment()) { + return null; + } + // Don't fortify if already fortifying if (attachSource.getAttachingCard() != null && attachSource.getAttachingCard().getController() == aiPlayer) { return null; @@ -1286,11 +1292,7 @@ public class AttachAi extends SpellAbilityAi { } else { list = CardLists.getValidCards(aiPlayer.getGame().getCardsIn(tgt.getZone()), tgt.getValidTgts(), sa.getActivatingPlayer(), attachSource, sa); - if (attachSource.isAura()) { - list = CardLists.filter(list, CardPredicates.canBeEnchantedBy(attachSource)); - } else if (attachSource.isEquipment()) { - list = CardLists.filter(list, CardPredicates.canBeEquippedBy(attachSource)); - } + list = CardLists.filter(list, CardPredicates.canBeAttachedBy(attachSource)); // TODO If Attaching without casting, don't need to actually target. // I believe this is the only case where mandatory will be true, so just @@ -1314,7 +1316,7 @@ public class AttachAi extends SpellAbilityAi { Card c = attachGeneralAI(aiPlayer, sa, prefList, mandatory, attachSource, sa.getParam("AILogic")); AiController aic = ((PlayerControllerAi)aiPlayer.getController()).getAi(); - if (c != null && attachSource.isEquipment() + if (c != null && attachSource.isEquipment() && attachSource.isEquipping() && attachSource.getEquipping().getController() == aiPlayer) { if (c.equals(attachSource.getEquipping())) { @@ -1338,7 +1340,7 @@ public class AttachAi extends SpellAbilityAi { return null; } } - + // make sure to prioritize casting spells in main 2 (creatures, other equipment, etc.) rather than moving equipment around boolean decideMoveFromUseless = uselessCreature && aic.getBooleanProperty(AiProps.PRIORITIZE_MOVE_EQUIPMENT_IF_USELESS); @@ -1352,7 +1354,7 @@ public class AttachAi extends SpellAbilityAi { // avoid randomly moving the equipment back and forth between several creatures in one turn if (AiCardMemory.isRememberedCard(aiPlayer, sa.getHostCard(), AiCardMemory.MemorySet.ATTACHED_THIS_TURN)) { return null; - } + } // do not equip if the new creature is not significantly better than the previous one (evaluates at least better by evalT) int evalT = aic.getIntProperty(AiProps.MOVE_EQUIPMENT_CREATURE_EVAL_THRESHOLD); @@ -1360,7 +1362,7 @@ public class AttachAi extends SpellAbilityAi { return null; } } - + AiCardMemory.rememberCard(aiPlayer, sa.getHostCard(), AiCardMemory.MemorySet.ATTACHED_THIS_TURN); if (c == null && mandatory) { @@ -1372,7 +1374,7 @@ public class AttachAi extends SpellAbilityAi { /** * Attach general ai. - * + * * @param sa * the sa * @param list @@ -1448,7 +1450,7 @@ public class AttachAi extends SpellAbilityAi { /** * Contains useful curse keyword. - * + * * @param keywords * the keywords * @param card @@ -1467,7 +1469,7 @@ public class AttachAi extends SpellAbilityAi { /** * Checks if is useful keyword. - * + * * @param keyword * the keyword * @param card @@ -1478,7 +1480,7 @@ public class AttachAi extends SpellAbilityAi { private static boolean isUsefulAttachKeyword(final String keyword, final Card card, final SpellAbility sa, final int powerBonus) { final Player ai = sa.getActivatingPlayer(); final PhaseHandler ph = ai.getGame().getPhaseHandler(); - + if (!CardUtil.isStackingKeyword(keyword) && card.hasKeyword(keyword)) { return false; } @@ -1597,7 +1599,7 @@ public class AttachAi extends SpellAbilityAi { /** * Checks if is useful curse keyword. - * + * * @param keyword * the keyword * @param card @@ -1650,15 +1652,15 @@ public class AttachAi extends SpellAbilityAi { /** * Checks if it is useful to execute the attach action given the current context. - * + * * @param c * the card * @param sa SpellAbility - * @return true, if the action is useful (beneficial) in the current minimal context (Card vs. Attach SpellAbility) + * @return true, if the action is useful (beneficial) in the current minimal context (Card vs. Attach SpellAbility) */ private static boolean isUsefulAttachAction(Player ai, Card c, SpellAbility sa) { if (c == null) { - return false; + return false; } if (sa.getHostCard() == null) { // FIXME: Not sure what should the resolution be if a SpellAbility has no host card. This should @@ -1716,12 +1718,12 @@ public class AttachAi extends SpellAbilityAi { public boolean confirmAction(Player player, SpellAbility sa, PlayerActionConfirmMode mode, String message) { return true; } - + @Override protected Card chooseSingleCard(Player ai, SpellAbility sa, Iterable options, boolean isOptional, Player targetedPlayer) { return attachToCardAIPreferences(ai, sa, true); } - + @Override protected Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable options) { return attachToPlayerAIPreferences(ai, sa, true); diff --git a/forge-ai/src/main/java/forge/ai/ability/ZoneExchangeAi.java b/forge-ai/src/main/java/forge/ai/ability/ZoneExchangeAi.java index 952314a35f4..709ceff6ac2 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ZoneExchangeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ZoneExchangeAi.java @@ -39,7 +39,7 @@ public class ZoneExchangeAi extends SpellAbilityAi { } if (type.equals("Aura")) { Card c = object1.getEnchantingCard(); - if (!c.canBeEnchantedBy(object2)) { + if (!c.canBeAttachedBy(object2)) { return false; } } diff --git a/forge-game/src/main/java/forge/game/GameEntity.java b/forge-game/src/main/java/forge/game/GameEntity.java index e040040f2c6..ce2ddd3030b 100644 --- a/forge-game/src/main/java/forge/game/GameEntity.java +++ b/forge-game/src/main/java/forge/game/GameEntity.java @@ -29,7 +29,9 @@ import forge.game.keyword.Keyword; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; +import forge.game.staticability.StaticAbility; import forge.game.trigger.TriggerType; +import forge.game.zone.ZoneType; import forge.util.collect.FCollection; import java.util.Map; @@ -372,11 +374,20 @@ public abstract class GameEntity extends GameObject implements IIdentifiable { public boolean canBeAttachedBy(final Card attach, boolean checkSBA) { // master mode - if (!attach.isAttachment()) { + if (!attach.isAttachment() || attach.isCreature()) { return false; } - if (attach.isAura() && !canBeEnchantedBy(attach, checkSBA)) { + // CantTarget static abilities + for (final Card ca : getGame().getCardsIn(ZoneType.listValueOf("Battlefield,Command"))) { + for (final StaticAbility stAb : ca.getStaticAbilities()) { + if (stAb.applyAbility("CantAttach", attach, this)) { + return false; + } + } + } + + if (attach.isAura() && !canBeEnchantedBy(attach)) { return false; } if (attach.isEquipment() && !canBeEquippedBy(attach)) { @@ -385,21 +396,24 @@ public abstract class GameEntity extends GameObject implements IIdentifiable { if (attach.isFortification() && !canBeFortifiedBy(attach)) { return false; } + + // true for all + if (hasProtectionFrom(attach, checkSBA)) { + return false; + } + return true; } - public boolean canBeEquippedBy(final Card aura) { + protected boolean canBeEquippedBy(final Card aura) { return false; } - public boolean canBeFortifiedBy(final Card aura) { + protected boolean canBeFortifiedBy(final Card aura) { return false; } - public boolean canBeEnchantedBy(final Card aura, final boolean checkSBA) { - if (!aura.isAura()) { - return false; - } + protected boolean canBeEnchantedBy(final Card aura) { SpellAbility sa = aura.getFirstAttachSpell(); TargetRestrictions tgt = null; @@ -407,8 +421,7 @@ public abstract class GameEntity extends GameObject implements IIdentifiable { tgt = sa.getTargetRestrictions(); } - return !(hasProtectionFrom(aura, checkSBA) - || ((tgt != null) && !isValid(tgt.getValidTgts(), aura.getController(), aura, sa))); + return !((tgt != null) && !isValid(tgt.getValidTgts(), aura.getController(), aura, sa)); } public boolean hasProtectionFrom(final Card source) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java index 9c3d1a72cba..356c600c49f 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java @@ -101,7 +101,7 @@ public class AttachEffect extends SpellAbilityEffect { // Although honestly, I'm not sure if the three of those could // handle being scripted // 303.4h: If the card can't be enchanted, the aura doesn't move - if (c.canBeEnchantedBy(card)) { + if (c.canBeAttachedBy(card)) { handleAura(card, c); } } else { diff --git a/forge-game/src/main/java/forge/game/ability/effects/ZoneExchangeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ZoneExchangeEffect.java index bef78d2e537..74fa45df551 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ZoneExchangeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ZoneExchangeEffect.java @@ -77,7 +77,7 @@ public class ZoneExchangeEffect extends SpellAbilityEffect { Card c = null; if (type != null && type.equals("Aura") && object1.getEnchantingCard() != null) { c = object1.getEnchantingCard(); - if (!c.canBeEnchantedBy(object2)) { + if (!c.canBeAttachedBy(object2)) { return; } } diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index ae16fd3dfd3..66fc5aadb37 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -5162,26 +5162,14 @@ public class Card extends GameEntity implements Comparable { return !(hasKeyword("Other players can't gain control of CARDNAME.") && !getController().equals(newController)); } - public final boolean canBeEnchantedBy(final Card aura) { - return canBeEnchantedBy(aura, false); - } - - public final boolean canBeEnchantedBy(final Card aura, final boolean checkSBA) { + @Override + protected final boolean canBeEnchantedBy(final Card aura) { SpellAbility sa = aura.getFirstAttachSpell(); TargetRestrictions tgt = null; if (sa != null) { tgt = sa.getTargetRestrictions(); } - if (aura.isCreature()) { - return false; - } - - // phase check there - if (isPhasedOut() && !aura.isPhasedOut()) { - return false; - } - if (tgt != null) { boolean zoneValid = false; // check the zone types @@ -5201,19 +5189,14 @@ public class Card extends GameEntity implements Comparable { } } - return !(hasProtectionFrom(aura, checkSBA) - || (hasKeyword("CARDNAME can't be enchanted in the future.") && !isEnchantedBy(aura)) + return !((hasKeyword("CARDNAME can't be enchanted in the future.") && !isEnchantedBy(aura)) || (hasKeyword("CARDNAME can't be enchanted.") && !aura.getName().equals("Anti-Magic Aura") && !(aura.getName().equals("Consecrate Land") && aura.isInZone(ZoneType.Battlefield)))); } - public final boolean canBeEquippedBy(final Card equip) { - if (!isCreature() || !isInPlay() || equip.isCreature()) { - return false; - } - - // phase check there - if (isPhasedOut() && !equip.isPhasedOut()) { + @Override + protected final boolean canBeEquippedBy(final Card equip) { + if (!isCreature() || !isInPlay()) { return false; } @@ -5228,20 +5211,29 @@ public class Card extends GameEntity implements Comparable { return false; } } - return !(hasProtectionFrom(equip) - || hasKeyword("CARDNAME can't be equipped.")); + return true; } - public boolean canBeFortifiedBy(final Card fort) { - if (!isLand() || !isInPlay() || fort.isCreature() || fort.isLand()) { + @Override + protected boolean canBeFortifiedBy(final Card fort) { + if (!isLand() || !isInPlay() || fort.isLand()) { return false; } + return true; + } + + /* (non-Javadoc) + * @see forge.game.GameEntity#canBeAttachedBy(forge.game.card.Card, boolean) + */ + @Override + public boolean canBeAttachedBy(Card attach, boolean checkSBA) { // phase check there - if (isPhasedOut() && !fort.isPhasedOut()) { + if (isPhasedOut() && !attach.isPhasedOut()) { return false; } - return !hasProtectionFrom(fort); + + return super.canBeAttachedBy(attach, checkSBA); } public FCollectionView getReplacementEffects() { diff --git a/forge-game/src/main/java/forge/game/card/CardPredicates.java b/forge-game/src/main/java/forge/game/card/CardPredicates.java index a3eeb8dd5b6..a733609abd0 100644 --- a/forge-game/src/main/java/forge/game/card/CardPredicates.java +++ b/forge-game/src/main/java/forge/game/card/CardPredicates.java @@ -216,20 +216,11 @@ public final class CardPredicates { }; }; - public static final Predicate canBeEnchantedBy(final Card aura) { + public static final Predicate canBeAttachedBy(final Card aura) { return new Predicate() { @Override public boolean apply(final Card c) { - return c.canBeEnchantedBy(aura); - } - }; - }; - - public static final Predicate canBeEquippedBy(final Card eq) { - return new Predicate() { - @Override - public boolean apply(final Card c) { - return c.canBeEquippedBy(eq); + return c.canBeAttachedBy(aura); } }; }; diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index f58d8b63f95..32c55e45a86 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -508,11 +508,11 @@ public class CardProperty { final String restriction = property.substring(10); if (restriction.equals("Remembered")) { for (final Object rem : source.getRemembered()) { - if (!(rem instanceof Card) || !((Card) rem).canBeEnchantedBy(card)) + if (!(rem instanceof Card) || !((Card) rem).canBeAttachedBy(card)) return false; } } else if (restriction.equals("Source")) { - if (!source.canBeEnchantedBy(card)) return false; + if (!source.canBeAttachedBy(card)) return false; } } else if (property.startsWith("CanBeEnchantedBy")) { if (property.substring(16).equals("Targeted")) { @@ -520,7 +520,7 @@ public class CardProperty { final SpellAbility saTargeting = sa.getSATargetingCard(); if (saTargeting != null) { for (final Card c : saTargeting.getTargets().getTargetCards()) { - if (!card.canBeEnchantedBy(c)) { + if (!card.canBeAttachedBy(c)) { return false; } } @@ -530,13 +530,13 @@ public class CardProperty { for (final Object rem : source.getRemembered()) { if (rem instanceof Card) { final Card c = (Card) rem; - if (!card.canBeEnchantedBy(c)) { + if (!card.canBeAttachedBy(c)) { return false; } } } } else { - if (!card.canBeEnchantedBy(source)) { + if (!card.canBeAttachedBy(source)) { return false; } } @@ -566,8 +566,8 @@ public class CardProperty { if (!card.isFortifiedBy(source)) { return false; } - } else if (property.startsWith("CanBeEquippedBy")) { - if (!card.canBeEquippedBy(source)) { + } else if (property.startsWith("CanBeAttachedBy")) { + if (!card.canBeAttachedBy(source)) { return false; } } else if (property.startsWith("Equipped")) { diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java index b12c30491a4..517f1f7b0db 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java @@ -462,6 +462,8 @@ public class StaticAbility extends CardTraitBase implements Comparable Date: Wed, 21 Nov 2018 10:39:08 +0100 Subject: [PATCH 217/901] Card: remove CantEquip --- .../src/main/java/forge/game/card/Card.java | 16 +--------------- forge-gui/res/cardsfolder/g/gate_smasher.txt | 3 +-- forge-gui/res/cardsfolder/k/kondas_banner.txt | 3 +-- forge-gui/res/cardsfolder/o/o_naginata.txt | 3 +-- 4 files changed, 4 insertions(+), 21 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 66fc5aadb37..8df76117295 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -1460,8 +1460,7 @@ public class Card extends GameEntity implements Comparable { int i = 0; for (KeywordInterface inst : keywords) { String keyword = inst.getOriginal(); - if (keyword.startsWith("CantEquip") - || keyword.startsWith("SpellCantTarget")) { + if (keyword.startsWith("SpellCantTarget")) { continue; } // format text changes @@ -5199,18 +5198,6 @@ public class Card extends GameEntity implements Comparable { if (!isCreature() || !isInPlay()) { return false; } - - for(KeywordInterface inst : equip.getKeywords()) { - String kw = inst.getOriginal(); - if(!kw.startsWith("CantEquip")) { - continue; - } - final String[] k = kw.split(":"); - final String[] restrictions = k[1].split(","); - if (isValid(restrictions, equip.getController(), equip, null)) { - return false; - } - } return true; } @@ -5219,7 +5206,6 @@ public class Card extends GameEntity implements Comparable { if (!isLand() || !isInPlay() || fort.isLand()) { return false; } - return true; } diff --git a/forge-gui/res/cardsfolder/g/gate_smasher.txt b/forge-gui/res/cardsfolder/g/gate_smasher.txt index 212b19472a4..d1429cb30f7 100644 --- a/forge-gui/res/cardsfolder/g/gate_smasher.txt +++ b/forge-gui/res/cardsfolder/g/gate_smasher.txt @@ -1,9 +1,8 @@ Name:Gate Smasher ManaCost:3 Types:Artifact Equipment -Text:CARDNAME can be attached only to a creature with toughness 4 or greater. K:Equip:3 -K:CantEquip:Creature.toughnessLT4 +S:Mode$ CantAttach | ValidCard$ Card.Self | Target$ Creature.toughnessLT4 | Description$ CARDNAME can be attached only to a creature with toughness 4 or greater. S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 3 | AddKeyword$ Trample | Description$ Equipped creature gets +3/+0 and has trample. AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/gate_smasher.jpg diff --git a/forge-gui/res/cardsfolder/k/kondas_banner.txt b/forge-gui/res/cardsfolder/k/kondas_banner.txt index ac73ead1a79..47ff7eb36fc 100644 --- a/forge-gui/res/cardsfolder/k/kondas_banner.txt +++ b/forge-gui/res/cardsfolder/k/kondas_banner.txt @@ -1,9 +1,8 @@ Name:Konda's Banner ManaCost:2 Types:Legendary Artifact Equipment -Text:CARDNAME can be attached only to a legendary creature. -K:CantEquip:Creature.nonLegendary K:Equip:2 +S:Mode$ CantAttach | ValidCard$ Card.Self | Target$ Creature.nonLegendary | Description$ CARDNAME can be attached only to a legendary creature. S:Mode$ Continuous | Affected$ Creature.SharesColorWith Equipped | AddPower$ 1 | AddToughness$ 1 | Description$ Creatures that share a color with equipped creature get +1/+1. S:Mode$ Continuous | Affected$ Creature.sharesCreatureTypeWith Equipped | AddPower$ 1 | AddToughness$ 1 | Description$ Creatures that share a creature type with equipped creature get +1/+1. AI:RemoveDeck:Random diff --git a/forge-gui/res/cardsfolder/o/o_naginata.txt b/forge-gui/res/cardsfolder/o/o_naginata.txt index 7e011d54025..f539a4b5d09 100644 --- a/forge-gui/res/cardsfolder/o/o_naginata.txt +++ b/forge-gui/res/cardsfolder/o/o_naginata.txt @@ -1,9 +1,8 @@ Name:O-Naginata ManaCost:1 Types:Artifact Equipment -Text:CARDNAME can be attached only to a creature with power 3 or greater. K:Equip:2 -K:CantEquip:Creature.powerLT3 +S:Mode$ CantAttach | ValidCard$ Card.Self | Target$ Creature.powerLT3 | Description$ CARDNAME can be attached only to a creature with power 3 or greater. S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 3 | AddKeyword$ Trample | Description$ Equipped creature gets +3/+0 and has trample. SVar:Picture:http://www.wizards.com/global/images/magic/general/o_naginata.jpg Oracle:O-Naginata can be attached only to a creature with power 3 or greater.\nEquipped creature gets +3/+0 and has trample.\nEquip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.) From 66ceaacf4dbfe2fdcfb0cf627733f9acf4f0be5c Mon Sep 17 00:00:00 2001 From: Hanmac Date: Wed, 21 Nov 2018 11:47:52 +0100 Subject: [PATCH 218/901] Tetravite: add token script --- forge-gui/res/cardsfolder/t/tetravus.txt | 2 +- forge-gui/res/tokenscripts/tetravite.txt | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/tokenscripts/tetravite.txt diff --git a/forge-gui/res/cardsfolder/t/tetravus.txt b/forge-gui/res/cardsfolder/t/tetravus.txt index ed8fd7a00f2..d8105a99729 100644 --- a/forge-gui/res/cardsfolder/t/tetravus.txt +++ b/forge-gui/res/cardsfolder/t/tetravus.txt @@ -5,7 +5,7 @@ PT:1/1 K:etbCounter:P1P1:3 K:Flying T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of your upkeep, you may remove any number of +1/+1 counters from CARDNAME. If you do, create that many 1/1 colorless Tetravite artifact creature tokens. They each have flying and "This creature can't be enchanted." -SVar:TrigToken:AB$Token | Cost$ SubCounter | References$ X | TokenAmount$ ChosenX | TokenName$ Tetravite | TokenTypes$ Artifact,Creature,Tetravite | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying<>CARDNAME can't be enchanted. | RememberTokens$ True | SubAbility$ DBClearXChoice +SVar:TrigToken:AB$Token | Cost$ SubCounter | References$ X | TokenAmount$ ChosenX | LegacyImage$ c 1 1 tetravite | TokenScript$ tetravite | RememberTokens$ True | SubAbility$ DBClearXChoice SVar:DBClearXChoice:DB$ Cleanup | ClearChosenX$ True SVar:X:XChoice T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounters | TriggerDescription$ At the beginning of your upkeep, you may exile any number of tokens created with CARDNAME. If you do, put that many +1/+1 counters on CARDNAME. diff --git a/forge-gui/res/tokenscripts/tetravite.txt b/forge-gui/res/tokenscripts/tetravite.txt new file mode 100644 index 00000000000..b475dbc6fba --- /dev/null +++ b/forge-gui/res/tokenscripts/tetravite.txt @@ -0,0 +1,7 @@ +Name:Tetravite +ManaCost:no cost +Types:Artifact Creature Tetravite +PT:1/1 +K:Flying +S:Mode$ CantAttach | ValidCard$ Card.Aura | Target$ Card.Self | Description$ CARDNAME can't be enchanted. +Oracle:Flying\nCARDNAME can't be enchanted. From f2f34bc4db7af308d7bf9bcbbf1518a410de1f5d Mon Sep 17 00:00:00 2001 From: Hanmac Date: Wed, 21 Nov 2018 18:27:01 +0100 Subject: [PATCH 219/901] CantAttach: remove 'can't be enchanted in the future' --- .../src/main/java/forge/game/GameEntity.java | 2 +- .../src/main/java/forge/game/card/Card.java | 4 +--- .../main/java/forge/game/card/CardProperty.java | 17 ++++++++--------- .../staticability/StaticAbilityCantAttach.java | 12 ++++++++++++ 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameEntity.java b/forge-game/src/main/java/forge/game/GameEntity.java index ce2ddd3030b..5920b4b30e5 100644 --- a/forge-game/src/main/java/forge/game/GameEntity.java +++ b/forge-game/src/main/java/forge/game/GameEntity.java @@ -374,7 +374,7 @@ public abstract class GameEntity extends GameObject implements IIdentifiable { public boolean canBeAttachedBy(final Card attach, boolean checkSBA) { // master mode - if (!attach.isAttachment() || attach.isCreature()) { + if (!attach.isAttachment() || attach.isCreature() || equals(attach)) { return false; } diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 8df76117295..2e83dffab89 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -5188,9 +5188,7 @@ public class Card extends GameEntity implements Comparable { } } - return !((hasKeyword("CARDNAME can't be enchanted in the future.") && !isEnchantedBy(aura)) - || (hasKeyword("CARDNAME can't be enchanted.") && !aura.getName().equals("Anti-Magic Aura") - && !(aura.getName().equals("Consecrate Land") && aura.isInZone(ZoneType.Battlefield)))); + return true; } @Override diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index 32c55e45a86..bbd7149c7f6 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -401,11 +401,11 @@ public class CardProperty { return false; } } else if (property.startsWith("AttachedBy")) { - if (!card.isEquippedBy(source) && !card.isEnchantedBy(source) && !card.isFortifiedBy(source)) { + if (!card.isAttachedBy(source)) { return false; } } else if (property.equals("Attached")) { - if (card.getEquipping() != source && !source.equals(card.getAttaching())) { + if (!source.isAttachedBy(card)) { return false; } } else if (property.startsWith("AttachedTo")) { @@ -433,8 +433,7 @@ public class CardProperty { return false; } } else { - if ((card.getAttaching() == null || !card.getAttaching().isValid(restriction, sourceController, source, spellAbility)) - && (card.getEquipping() == null || !card.getEquipping().isValid(restriction, sourceController, source, spellAbility))) { + if ((card.getAttaching() == null || !card.getAttaching().isValid(restriction, sourceController, source, spellAbility))) { return false; } } @@ -444,7 +443,7 @@ public class CardProperty { return false; } } else if (property.equals("NotAttachedTo")) { - if (card.getEquipping() == source || source.equals(card.getAttaching())) { + if (source.isAttachedBy(card)) { return false; } } else if (property.startsWith("EnchantedBy")) { @@ -546,7 +545,7 @@ public class CardProperty { final SpellAbility saTargeting = sa.getSATargetingCard(); if (saTargeting != null) { for (final Card c : saTargeting.getTargets().getTargetCards()) { - if (!card.isEquippedBy(c)) { + if (!card.isAttachedBy(c)) { return false; } } @@ -554,16 +553,16 @@ public class CardProperty { } } else if (property.substring(10).equals("Enchanted")) { if (source.getEnchantingCard() == null || - !card.isEquippedBy(source.getEnchantingCard())) { + !card.isAttachedBy(source.getEnchantingCard())) { return false; } } else { - if (!card.isEquippedBy(source)) { + if (!card.isAttachedBy(source)) { return false; } } } else if (property.startsWith("FortifiedBy")) { - if (!card.isFortifiedBy(source)) { + if (!card.isAttachedBy(source)) { return false; } } else if (property.startsWith("CanBeAttachedBy")) { diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantAttach.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantAttach.java index f6dc94c31e2..bbf9781fac1 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantAttach.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantAttach.java @@ -17,6 +17,18 @@ public class StaticAbilityCantAttach { && !target.isValid(stAb.getParam("Target").split(","), hostCard.getController(), hostCard, null)) { return false; } + + if (stAb.hasParam("ValidCardToTarget")) { + if (!(target instanceof Card)) { + return false; + } + Card tcard = (Card) target; + + if (!card.isValid(stAb.getParam("ValidCardToTarget").split(","), tcard.getController(), tcard, null)) { + return false; + } + } + return true; } } From 596ad849dcc823b48b07e2dbf607983139377734 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Fri, 23 Nov 2018 08:21:17 +0100 Subject: [PATCH 220/901] Attach: refactor names --- .../src/main/java/forge/ai/GameState.java | 16 +-- .../java/forge/ai/simulation/GameCopier.java | 8 +- .../src/main/java/forge/game/GameAction.java | 20 ++-- .../src/main/java/forge/game/GameEntity.java | 80 +++++++------ .../main/java/forge/game/GameEntityView.java | 16 +-- .../java/forge/game/ability/AbilityUtils.java | 4 +- .../game/ability/effects/AttachEffect.java | 8 +- .../ability/effects/ChangeZoneEffect.java | 8 +- .../ability/effects/CopyPermanentEffect.java | 2 +- .../game/ability/effects/DestroyEffect.java | 2 +- .../game/ability/effects/TokenEffect.java | 2 +- .../ability/effects/UnattachAllEffect.java | 4 +- .../game/ability/effects/UnattachEffect.java | 4 +- .../ability/effects/ZoneExchangeEffect.java | 4 +- .../src/main/java/forge/game/card/Card.java | 110 ++++++++---------- .../java/forge/game/card/CardFactory.java | 4 +- .../java/forge/game/card/CardFactoryUtil.java | 4 +- .../java/forge/game/card/CardPredicates.java | 11 ++ .../java/forge/game/card/CardProperty.java | 38 +++--- .../main/java/forge/game/card/CardUtil.java | 4 +- .../main/java/forge/game/card/CardView.java | 2 +- .../java/forge/game/cost/CostUnattach.java | 2 +- .../main/java/forge/game/player/Player.java | 13 ++- .../forge/trackable/TrackableProperty.java | 2 +- .../forge/screens/match/TargetingOverlay.java | 2 +- .../main/java/forge/view/arcane/PlayArea.java | 8 +- .../ai/simulation/GameSimulatorTest.java | 28 ++--- .../gamesimulationtests/util/GameWrapper.java | 2 +- .../main/java/forge/card/CardDetailUtil.java | 4 +- 29 files changed, 217 insertions(+), 195 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/GameState.java b/forge-ai/src/main/java/forge/ai/GameState.java index cd93143f61d..507ed1c8c1d 100644 --- a/forge-ai/src/main/java/forge/ai/GameState.java +++ b/forge-ai/src/main/java/forge/ai/GameState.java @@ -196,7 +196,7 @@ public abstract class GameState { cardsReferencedByID.add(card.getExiledWith()); } if (zone == ZoneType.Battlefield) { - if (!card.getAttachedBy().isEmpty()) { + if (!card.getAttachedCards().isEmpty()) { // Remember the ID of cards that have attachments cardsReferencedByID.add(card); } @@ -288,13 +288,13 @@ public abstract class GameState { } else if (c.getCurrentStateName().equals(CardStateName.Meld)) { newText.append("|Meld"); } - if (c.isAttaching()) { - newText.append("|Attaching:").append(c.getAttaching().getId()); + if (c.isAttachedToEntity()) { + newText.append("|Attaching:").append(c.getAttachingEntity().getId()); } - if (c.getEnchantingPlayer() != null) { + if (c.getAttachingPlayer() != null) { // TODO: improve this for game states with more than two players newText.append("|EnchantingPlayer:"); - Player p = c.getEnchantingPlayer(); + Player p = c.getAttachingPlayer(); newText.append(p.getController().isAI() ? "AI" : "HUMAN"); } @@ -961,7 +961,7 @@ public abstract class GameState { Card attachedTo = idToCard.get(entry.getValue()); Card attacher = entry.getKey(); if (attacher.isAttachment()) { - attacher.attachEntity(attachedTo); + attacher.attachToEntity(attachedTo); } } @@ -972,7 +972,7 @@ public abstract class GameState { Game game = attacher.getGame(); Player attachedTo = entry.getValue() == TARGET_AI ? game.getPlayers().get(1) : game.getPlayers().get(0); - attacher.attachEntity(attachedTo); + attacher.attachToEntity(attachedTo); } } @@ -1029,7 +1029,7 @@ public abstract class GameState { // (will be overridden later, so the actual value shouldn't matter) //FIXME it shouldn't be able to attach itself - c.setAttaching(c); + c.setAttachingEntity(c); } if (cardsWithoutETBTrigs.contains(c)) { 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 d81bf84bdb9..2a58ab4b3f3 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java +++ b/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java @@ -211,10 +211,10 @@ public class GameCopier { otherCard.setTimestamp(card.getTimestamp()); otherCard.setSickness(card.hasSickness()); otherCard.setState(card.getCurrentStateName(), false); - if (card.isAttaching()) { - GameEntity ge = gameObjectMap.map(card.getAttaching()); - otherCard.setAttaching(ge); - ge.addAttachedBy(otherCard); + if (card.isAttachedToEntity()) { + GameEntity ge = gameObjectMap.map(card.getAttachingEntity()); + otherCard.setAttachingEntity(ge); + ge.addAttachedCard(otherCard); } if (card.getCloneOrigin() != null) { otherCard.setCloneOrigin(cardMap.get(card.getCloneOrigin())); diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index c36cf6ed7a3..aa28d75f215 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -507,8 +507,8 @@ public class GameAction { copied.unAttachAllCards(); // unenchant creature if moving aura - if (copied.isAttaching()) { - copied.unAttachEntity(copied.getAttaching()); + if (copied.isAttachedToEntity()) { + copied.unattachFromEntity(copied.getAttachingEntity()); } } @@ -974,8 +974,8 @@ public class GameAction { checkAgain |= stateBasedAction_Saga(c); checkAgain |= stateBasedAction704_attach(c); // Attachment - if (c.isCreature() && c.isAttaching()) { // Rule 704.5q - Creature attached to an object or player, becomes unattached - c.unAttachEntity(c.getAttaching()); + if (c.isCreature() && c.isAttachedToEntity()) { // Rule 704.5q - Creature attached to an object or player, becomes unattached + c.unattachFromEntity(c.getAttachingEntity()); checkAgain = true; } @@ -1092,18 +1092,18 @@ public class GameAction { private boolean stateBasedAction704_attach(Card c) { boolean checkAgain = false; - if (c.isAttaching()) { - final GameEntity ge = c.getAttaching(); + if (c.isAttachedToEntity()) { + final GameEntity ge = c.getAttachingEntity(); if (!ge.canBeAttachedBy(c)) { - c.unAttachEntity(ge); + c.unattachFromEntity(ge); checkAgain = true; } } - if (c.isAttachedBy()) { - for (final Card attach : Lists.newArrayList(c.getAttachedBy())) { + if (c.isAttachedByCards()) { + for (final Card attach : Lists.newArrayList(c.getAttachedCards())) { if (!attach.isInPlay()) { - attach.unAttachEntity(c); + attach.unattachFromEntity(c); checkAgain = true; } } diff --git a/forge-game/src/main/java/forge/game/GameEntity.java b/forge-game/src/main/java/forge/game/GameEntity.java index 5920b4b30e5..23520f46275 100644 --- a/forge-game/src/main/java/forge/game/GameEntity.java +++ b/forge-game/src/main/java/forge/game/GameEntity.java @@ -44,7 +44,7 @@ public abstract class GameEntity extends GameObject implements IIdentifiable { protected final int id; private String name = ""; private int preventNextDamage = 0; - protected CardCollection attachedBy; + protected CardCollection attachedCards; private Map> preventionShieldsWithEffects = Maps.newTreeMap(); protected Map counters = Maps.newEnumMap(CounterType.class); @@ -285,86 +285,94 @@ public abstract class GameEntity extends GameObject implements IIdentifiable { public abstract boolean hasKeyword(final Keyword keyword); public final CardCollectionView getEnchantedBy() { - if (attachedBy == null) { + if (attachedCards == null) { return CardCollection.EMPTY; } // enchanted means attached by Aura - return CardLists.filter(attachedBy, CardPredicates.Presets.AURA); + return CardLists.filter(attachedCards, CardPredicates.Presets.AURA); } - public final CardCollectionView getAttachedBy() { - return CardCollection.getView(attachedBy); + public final CardCollectionView getAttachedCards() { + return CardCollection.getView(attachedCards); } - public final void setAttachedBy(final Iterable cards) { + public final void setAttachedCards(final Iterable cards) { if (cards == null) { - attachedBy = null; + attachedCards = null; } else { - attachedBy = new CardCollection(cards); + attachedCards = new CardCollection(cards); } - getView().updateAttachedBy(this); + getView().updateAttachedCards(this); } - public final boolean isAttachedBy() { - return FCollection.hasElements(attachedBy); + public final boolean isAttachedByCards() { + return FCollection.hasElements(attachedCards); } public final boolean isEnchanted() { - if (attachedBy == null) { + if (attachedCards == null) { return false; } // enchanted means attached by Aura - return CardLists.count(attachedBy, CardPredicates.Presets.AURA) > 0; + return CardLists.count(attachedCards, CardPredicates.Presets.AURA) > 0; } - public final boolean isAttachedBy(Card c) { - return FCollection.hasElement(attachedBy, c); + public final boolean isAttachedByCard(Card c) { + return FCollection.hasElement(attachedCards, c); } public final boolean isEnchantedBy(Card c) { // Rule 303.4k Even if c is no Aura it still counts - return isAttachedBy(c); + return isAttachedByCard(c); } - public final boolean isAttachedBy(final String cardName) { - if (attachedBy == null) { + public final boolean isAttachedByCard(final String cardName) { + if (attachedCards == null) { return false; } - return CardLists.count(getAttachedBy(), CardPredicates.nameEquals(cardName)) > 0; + return CardLists.count(getAttachedCards(), CardPredicates.nameEquals(cardName)) > 0; } public final boolean isEnchantedBy(final String cardName) { // Rule 303.4k Even if c is no Aura it still counts - return isAttachedBy(cardName); + return isAttachedByCard(cardName); } - public final void addAttachedBy(final Card c) { - if (attachedBy == null) { - attachedBy = new CardCollection(); + /** + * internal method + * @param Card c + */ + public final void addAttachedCard(final Card c) { + if (attachedCards == null) { + attachedCards = new CardCollection(); } - if (attachedBy.add(c)) { - getView().updateAttachedBy(this); + if (attachedCards.add(c)) { + getView().updateAttachedCards(this); getGame().fireEvent(new GameEventCardAttachment(c, null, this)); } } - public final void removeAttachedBy(final Card c) { - if (attachedBy == null) { return; } + /** + * internal method + * @param Card c + */ + public final void removeAttachedCard(final Card c) { + if (attachedCards == null) { return; } - if (attachedBy.remove(c)) { - if (attachedBy.isEmpty()) { - attachedBy = null; + if (attachedCards.remove(c)) { + if (attachedCards.isEmpty()) { + attachedCards = null; } - getView().updateAttachedBy(this); + getView().updateAttachedCards(this); getGame().fireEvent(new GameEventCardAttachment(c, this, null)); } } public final void unAttachAllCards() { - for (Card c : Lists.newArrayList(getAttachedBy())) { - c.unAttachEntity(this); + for (Card c : Lists.newArrayList(getAttachedCards())) { + c.unattachFromEntity(this); } } @@ -406,10 +414,16 @@ public abstract class GameEntity extends GameObject implements IIdentifiable { } protected boolean canBeEquippedBy(final Card aura) { + /** + * Equip only to Creatures which are cards + */ return false; } protected boolean canBeFortifiedBy(final Card aura) { + /** + * Equip only to Lands which are cards + */ return false; } diff --git a/forge-game/src/main/java/forge/game/GameEntityView.java b/forge-game/src/main/java/forge/game/GameEntityView.java index 46a8995ca3f..dc0c7f914fc 100644 --- a/forge-game/src/main/java/forge/game/GameEntityView.java +++ b/forge-game/src/main/java/forge/game/GameEntityView.java @@ -42,19 +42,19 @@ public abstract class GameEntityView extends TrackableObject { set(TrackableProperty.PreventNextDamage, e.getPreventNextDamageTotalShields()); } - public Iterable getAttachedBy() { - return get(TrackableProperty.AttachedBy); + public Iterable getAttachedCards() { + return get(TrackableProperty.AttachedCards); } - public boolean isAttached() { - return getAttachedBy() != null; + public boolean isAttachedByCards() { + return getAttachedCards() != null; } - protected void updateAttachedBy(GameEntity e) { - if (e.isAttachedBy()) { - set(TrackableProperty.AttachedBy, CardView.getCollection(e.getAttachedBy())); + protected void updateAttachedCards(GameEntity e) { + if (e.isAttachedByCards()) { + set(TrackableProperty.AttachedCards, CardView.getCollection(e.getAttachedCards())); } else { - set(TrackableProperty.AttachedBy, null); + set(TrackableProperty.AttachedCards, null); } } } diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index 7995367c674..aab86a0cab9 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -545,7 +545,7 @@ public class AbilityUtils { // Add whole Enchanted list to handlePaid final CardCollection list = new CardCollection(); if (card.isEnchanting()) { - Object o = card.getEnchanting(); + Object o = card.getAttachingEntity(); if (o instanceof Card) { list.add(game.getCardState((Card) o)); } @@ -1114,7 +1114,7 @@ public class AbilityUtils { } } else if (defined.equals("EnchantedPlayer")) { - final Object o = sa.getHostCard().getEnchanting(); + final Object o = sa.getHostCard().getAttachingEntity(); if (o instanceof Player) { if (!players.contains(o)) { players.add((Player) o); diff --git a/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java index 356c600c49f..70b471bbc16 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java @@ -105,7 +105,7 @@ public class AttachEffect extends SpellAbilityEffect { handleAura(card, c); } } else { - card.attachEntity(c); + card.attachToEntity(c); } } else if (o instanceof Player) { // Currently, a few cards can enchant players @@ -132,17 +132,17 @@ public class AttachEffect extends SpellAbilityEffect { @Override public void run() { - final GameEntity entity = card.getAttaching(); + final GameEntity entity = card.getAttachingEntity(); if (entity == null) { return; } - card.unAttachEntity(entity); + card.unattachFromEntity(entity); } }; // Command card.addLeavesPlayCommand(onLeavesPlay); - card.attachEntity(tgt); + card.attachToEntity(tgt); } /** diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index b67298bcc58..3100c48cb32 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -504,7 +504,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { } if (!list.isEmpty()) { Card attachedTo = player.getController().chooseSingleEntityForEffect(list, sa, tgtC + " - Select a card to attach to."); - tgtC.attachEntity(attachedTo); + tgtC.attachToEntity(attachedTo); } else { // When it should enter the battlefield attached to an illegal permanent it fails continue; } @@ -514,7 +514,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { FCollectionView list = AbilityUtils.getDefinedPlayers(hostCard, sa.getParam("AttachedToPlayer"), sa); if (!list.isEmpty()) { Player attachedTo = player.getController().chooseSingleEntityForEffect(list, sa, tgtC + " - Select a player to attach to."); - tgtC.attachEntity(attachedTo); + tgtC.attachToEntity(attachedTo); } else { // When it should enter the battlefield attached to an illegal player it fails continue; @@ -994,7 +994,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { } if (c.isAttachment()) { - c.attachEntity(attachedTo); + c.attachToEntity(attachedTo); } } else { // When it should enter the battlefield attached to an illegal permanent it fails @@ -1006,7 +1006,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { FCollectionView list = AbilityUtils.getDefinedPlayers(source, sa.getParam("AttachedToPlayer"), sa); if (!list.isEmpty()) { Player attachedTo = player.getController().chooseSingleEntityForEffect(list, sa, c + " - Select a player to attach to."); - c.attachEntity(attachedTo); + c.attachToEntity(attachedTo); } else { // When it should enter the battlefield attached to an illegal permanent it fails continue; diff --git a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java index 504ebad7e4b..a534d296e96 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java @@ -239,7 +239,7 @@ public class CopyPermanentEffect extends SpellAbilityEffect { if (!list.isEmpty()) { Card attachedTo = activator.getController().chooseSingleEntityForEffect(list, sa, copyInPlay + " - Select a card to attach to."); - copyInPlay.attachEntity(attachedTo); + copyInPlay.attachToEntity(attachedTo); } else { continue; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java index 8faf7474655..e6ac2829e45 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java @@ -95,7 +95,7 @@ public class DestroyEffect extends SpellAbilityEffect { boolean destroyed = false; final Card lki = CardUtil.getLKICopy(tgtC); if (remAttached) { - card.addRemembered(tgtC.getAttachedBy()); + card.addRemembered(tgtC.getAttachedCards()); } if (sac) { destroyed = game.getAction().sacrifice(tgtC, sa) != null; diff --git a/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java b/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java index abec8e52996..2a32db441af 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java @@ -509,7 +509,7 @@ public class TokenEffect extends SpellAbilityEffect { return false; } - tok.attachEntity(ge); + tok.attachToEntity(ge); return true; } else { // not a GameEntity, cant be attach diff --git a/forge-game/src/main/java/forge/game/ability/effects/UnattachAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/UnattachAllEffect.java index aec909dd3e7..83549261ec4 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/UnattachAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/UnattachAllEffect.java @@ -16,8 +16,8 @@ import java.util.List; public class UnattachAllEffect extends SpellAbilityEffect { private static void handleUnattachment(final GameEntity o, final Card cardToUnattach) { - if (cardToUnattach.isAttachment() && o.isAttachedBy(cardToUnattach)) { - cardToUnattach.unAttachEntity(cardToUnattach.getAttaching()); + if (cardToUnattach.isAttachment() && o.isAttachedByCard(cardToUnattach)) { + cardToUnattach.unattachFromEntity(cardToUnattach.getAttachingEntity()); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/UnattachEffect.java b/forge-game/src/main/java/forge/game/ability/effects/UnattachEffect.java index 28d11ca6e9c..0b0e81a7f9e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/UnattachEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/UnattachEffect.java @@ -32,8 +32,8 @@ public class UnattachEffect extends SpellAbilityEffect { //final boolean gainControl = "GainControl".equals(af.parseParams().get("AILogic")); //AbilityFactoryAttach.handleUnattachAura(cardToUnattach, c, gainControl); } else if (cardToUnattach.isAttachment()) { - if (cardToUnattach.isAttaching()) { - cardToUnattach.unAttachEntity(cardToUnattach.getAttaching()); + if (cardToUnattach.isAttachedToEntity()) { + cardToUnattach.unattachFromEntity(cardToUnattach.getAttachingEntity()); } } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ZoneExchangeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ZoneExchangeEffect.java index 74fa45df551..07201c35835 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ZoneExchangeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ZoneExchangeEffect.java @@ -83,8 +83,8 @@ public class ZoneExchangeEffect extends SpellAbilityEffect { } // Enchant first if (c != null) { - object1.unAttachEntity(c); - object2.attachEntity(c); + object1.unattachFromEntity(c); + object2.attachToEntity(c); } // Exchange Zone game.getAction().moveTo(zone2, object1, sa); diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 2e83dffab89..cd76d3cdd20 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -103,7 +103,7 @@ public class Card extends GameEntity implements Comparable { // if this card is attached or linked to something, what card is it currently attached to private Card encoding, cloneOrigin, haunting, effectSource, pairedWith, meldedWith; - private GameEntity attaching = null; + private GameEntity attachingEntity = null; private GameEntity mustAttackEntity = null; private GameEntity mustAttackEntityThisTurn = null; @@ -2583,56 +2583,56 @@ public class Card extends GameEntity implements Comparable { } public final CardCollectionView getEquippedBy() { - if (this.attachedBy == null) { + if (this.attachedCards == null) { return CardCollection.EMPTY; } - return CardLists.filter(attachedBy, CardPredicates.Presets.EQUIPMENT); + return CardLists.filter(attachedCards, CardPredicates.Presets.EQUIPMENT); } public final boolean isEquipped() { - if (this.attachedBy == null) { + if (this.attachedCards == null) { return false; } - return CardLists.count(attachedBy, CardPredicates.Presets.EQUIPMENT) > 0; + return CardLists.count(attachedCards, CardPredicates.Presets.EQUIPMENT) > 0; } public final boolean isEquippedBy(Card c) { - return this.isAttachedBy(c); + return this.isAttachedByCard(c); } public final boolean isEquippedBy(final String cardName) { - return this.isAttachedBy(cardName); + return this.isAttachedByCard(cardName); } public final CardCollectionView getFortifiedBy() { - if (this.attachedBy == null) { + if (this.attachedCards == null) { return CardCollection.EMPTY; } - return CardLists.filter(attachedBy, CardPredicates.Presets.FORTIFICATION); + return CardLists.filter(attachedCards, CardPredicates.Presets.FORTIFICATION); } public final boolean isFortified() { - if (this.attachedBy == null) { + if (this.attachedCards == null) { return false; } - return CardLists.count(attachedBy, CardPredicates.Presets.FORTIFICATION) > 0; + return CardLists.count(attachedCards, CardPredicates.Presets.FORTIFICATION) > 0; } public final boolean isFortifiedBy(Card c) { // 301.5e + 301.6 - return isAttachedBy(c); + return isAttachedByCard(c); } public final Card getEquipping() { return this.getAttachingCard(); } public final boolean isEquipping() { - return this.isAttaching(); + return this.isAttachedToEntity(); } public final boolean isFortifying() { - return this.isAttaching(); + return this.isAttachedToEntity(); } public final void equipCard(final Card c) { @@ -2640,7 +2640,7 @@ public class Card extends GameEntity implements Comparable { return; } - this.attachEntity(c); + this.attachToEntity(c); } public final void fortifyCard(final Card c) { @@ -2648,87 +2648,80 @@ public class Card extends GameEntity implements Comparable { return; } - this.attachEntity(c); + this.attachToEntity(c); } public final void unEquipCard(final Card c) { // equipment.unEquipCard(equippedCard); - this.unAttachEntity(c); + this.unattachFromEntity(c); } public final void unEquipAllCards() { if (isEquipped()) { for (Card c : Lists.newArrayList(getEquippedBy())) { - c.unAttachEntity(this); + c.unattachFromEntity(this); } } } - public final GameEntity getAttaching() { - return attaching; + public final GameEntity getAttachingEntity() { + return attachingEntity; } - public final void setAttaching(final GameEntity e) { - if (attaching == e) { return; } - attaching = e; + public final void setAttachingEntity(final GameEntity e) { + if (attachingEntity == e) { return; } + attachingEntity = e; view.updateAttaching(this); } public final void removeAttaching(final GameEntity e) { - if (attaching == e) { - setAttaching(null); + if (attachingEntity == e) { + setAttachingEntity(null); } } - public final boolean isAttaching() { - return attaching != null; + public final boolean isAttachedToEntity() { + return attachingEntity != null; } public final Card getAttachingCard() { - if (attaching instanceof Card) { - return (Card) attaching; + if (attachingEntity instanceof Card) { + return (Card) attachingEntity; } return null; } - public final GameEntity getEnchanting() { - return getAttaching(); - } - public final Card getEnchantingCard() { return getAttachingCard(); } - public final Player getEnchantingPlayer() { - if (attaching instanceof Player) { - return (Player) attaching; + public final Player getAttachingPlayer() { + if (attachingEntity instanceof Player) { + return (Player) attachingEntity; } return null; } public final boolean isEnchanting() { - return isAttaching(); + return isAttachedToEntity(); } public final boolean isEnchantingCard() { return getEnchantingCard() != null; } - public final boolean isEnchantingPlayer() { - return getEnchantingPlayer() != null; - } - public final void attachEntity(final GameEntity entity) { + public final void attachToEntity(final GameEntity entity) { if (!entity.canBeAttachedBy(this)) { return; } GameEntity oldTarget = null; - if (isAttaching()) { - oldTarget = getAttaching(); + if (isAttachedToEntity()) { + oldTarget = getAttachingEntity(); // If attempting to reattach to the same object, don't do anything. if (oldTarget.equals(entity)) { return; } - unAttachEntity(oldTarget); + unattachFromEntity(oldTarget); } // They use double links... it's doubtful - setAttaching(entity); + setAttachingEntity(entity); setTimestamp(getGame().getNextTimestamp()); - entity.addAttachedBy(this); + entity.addAttachedCard(this); // Play the Equip sound getGame().fireEvent(new GameEventCardAttachment(this, oldTarget, entity)); @@ -2741,20 +2734,13 @@ public class Card extends GameEntity implements Comparable { } - public final void enchantEntity(final GameEntity entity) { - if (!isAura()) { - return; - } - this.attachEntity(entity); - } - - public final void unAttachEntity(final GameEntity entity) { - if (attaching == null || !attaching.equals(entity)) { + public final void unattachFromEntity(final GameEntity entity) { + if (attachingEntity == null || !attachingEntity.equals(entity)) { return; } - setAttaching(null); - entity.removeAttachedBy(this); + setAttachingEntity(null); + entity.removeAttachedCard(this); // Handle Bestowed Aura part if (isBestowed()) { @@ -3772,10 +3758,12 @@ public class Card extends GameEntity implements Comparable { public final boolean isCreature() { return getType().isCreature(); } public final boolean isArtifact() { return getType().isArtifact(); } - public final boolean isEquipment() { return getType().hasSubtype("Equipment"); } - public final boolean isFortification() { return getType().hasSubtype("Fortification"); } public final boolean isPlaneswalker() { return getType().isPlaneswalker(); } public final boolean isEnchantment() { return getType().isEnchantment(); } + + public final boolean isEquipment() { return getType().hasSubtype("Equipment"); } + public final boolean isFortification() { return getType().hasSubtype("Fortification"); } + public final boolean isCurse() { return getType().hasSubtype("Curse"); } public final boolean isAura() { return getType().hasSubtype("Aura"); } public final boolean isAttachment() { return isAura() || isEquipment() || isFortification(); } @@ -3845,8 +3833,8 @@ public class Card extends GameEntity implements Comparable { setDirectlyPhasedOut(direct); } - if (isAttachedBy()) { - for (final Card eq : getAttachedBy()) { + if (isAttachedByCards()) { + for (final Card eq : getAttachedCards()) { if (eq.isPhasedOut() == phasingIn) { eq.phase(false); } diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index 691b0565988..a3080b08925 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -92,8 +92,8 @@ public class CardFactory { out.setState(in.getCurrentStateName(), true); // this's necessary for forge.game.GameAction.unattachCardLeavingBattlefield(Card) - out.setAttachedBy(in.getAttachedBy()); - out.setAttaching(in.getAttaching()); + out.setAttachedCards(in.getAttachedCards()); + out.setAttachingEntity(in.getAttachingEntity()); out.setClones(in.getClones()); out.setCastSA(in.getCastSA()); diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 34166adc7c3..d544aea59f6 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -1526,7 +1526,7 @@ public class CardFactoryUtil { // Count$InTargetedHand (targeted player's cards in hand) if (sq[0].contains("InEnchantedHand")) { - GameEntity o = c.getEnchanting(); + GameEntity o = c.getAttachingEntity(); Player controller = null; if (o instanceof Card) { controller = ((Card) o).getController(); @@ -1539,7 +1539,7 @@ public class CardFactoryUtil { } } if (sq[0].contains("InEnchantedYard")) { - GameEntity o = c.getEnchanting(); + GameEntity o = c.getAttachingEntity(); Player controller = null; if (o instanceof Card) { controller = ((Card) o).getController(); diff --git a/forge-game/src/main/java/forge/game/card/CardPredicates.java b/forge-game/src/main/java/forge/game/card/CardPredicates.java index a733609abd0..829856dda24 100644 --- a/forge-game/src/main/java/forge/game/card/CardPredicates.java +++ b/forge-game/src/main/java/forge/game/card/CardPredicates.java @@ -488,6 +488,17 @@ public final class CardPredicates { return c.isFortification(); } }; + + /** + * a Predicate to get all curse. + */ + public static final Predicate CURSE = new Predicate() { + @Override + public boolean apply(Card c) { + return c.isCurse(); + } + }; + /** * a Predicate to get all unenchanted cards in a list. */ diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index bbd7149c7f6..8dc3dda80e7 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -175,7 +175,7 @@ public class CardProperty { } } else if (property.startsWith("EnchantedPlayer")) { Player p = property.endsWith("Ctrl") ? controller : card.getOwner(); - final Object o = source.getEnchanting(); + final Object o = source.getAttachingEntity(); if (o instanceof Player) { if (!p.equals(o)) { return false; @@ -185,7 +185,7 @@ public class CardProperty { } } else if (property.startsWith("EnchantedController")) { Player p = property.endsWith("Ctrl") ? controller : card.getOwner(); - final Object o = source.getEnchanting(); + final Object o = source.getAttachingEntity(); if (o instanceof Card) { if (!p.equals(((Card) o).getController())) { return false; @@ -401,11 +401,11 @@ public class CardProperty { return false; } } else if (property.startsWith("AttachedBy")) { - if (!card.isAttachedBy(source)) { + if (!card.isAttachedByCard(source)) { return false; } } else if (property.equals("Attached")) { - if (!source.isAttachedBy(card)) { + if (!source.isAttachedByCard(card)) { return false; } } else if (property.startsWith("AttachedTo")) { @@ -416,7 +416,7 @@ public class CardProperty { final SpellAbility sa = t.getTriggeredSA(); final CardCollectionView cards = AbilityUtils.getDefinedCards(source, "Targeted", sa); for (final Card c : cards) { - if (card.getEquipping() != c && !c.equals(card.getEnchanting())) { + if (card.getEquipping() != c && !c.equals(card.getAttachingEntity())) { return false; } } @@ -425,7 +425,7 @@ public class CardProperty { for (final SpellAbility sa : source.getCurrentState().getNonManaAbilities()) { final CardCollectionView cards = AbilityUtils.getDefinedCards(source, "Targeted", sa); for (final Card c : cards) { - if (card.getEquipping() == c || c.equals(card.getEnchanting())) { // handle multiple targets + if (card.getEquipping() == c || c.equals(card.getAttachingEntity())) { // handle multiple targets return true; } } @@ -433,22 +433,22 @@ public class CardProperty { return false; } } else { - if ((card.getAttaching() == null || !card.getAttaching().isValid(restriction, sourceController, source, spellAbility))) { + if ((card.getAttachingEntity() == null || !card.getAttachingEntity().isValid(restriction, sourceController, source, spellAbility))) { return false; } } } else if (property.equals("NameNotEnchantingEnchantedPlayer")) { - Player enchantedPlayer = source.getEnchantingPlayer(); + Player enchantedPlayer = source.getAttachingPlayer(); if (enchantedPlayer == null || enchantedPlayer.isEnchantedBy(card.getName())) { return false; } } else if (property.equals("NotAttachedTo")) { - if (source.isAttachedBy(card)) { + if (source.isAttachedByCard(card)) { return false; } } else if (property.startsWith("EnchantedBy")) { if (property.equals("EnchantedBy")) { - if (!card.isEnchantedBy(source) && !card.equals(source.getEnchanting())) { + if (!card.isEnchantedBy(source) && !card.equals(source.getAttachingEntity())) { return false; } } else { @@ -456,7 +456,7 @@ public class CardProperty { switch (restriction) { case "Imprinted": for (final Card c : source.getImprintedCards()) { - if (!card.isEnchantedBy(c) && !card.equals(c.getEnchanting())) { + if (!card.isEnchantedBy(c) && !card.equals(c.getAttachingEntity())) { return false; } } @@ -466,7 +466,7 @@ public class CardProperty { final SpellAbility saTargeting = sa.getSATargetingCard(); if (saTargeting != null) { for (final Card c : saTargeting.getTargets().getTargetCards()) { - if (!card.isEnchantedBy(c) && !card.equals(c.getEnchanting())) { + if (!card.isEnchantedBy(c) && !card.equals(c.getAttachingEntity())) { return false; } } @@ -500,7 +500,7 @@ public class CardProperty { } } } else if (property.startsWith("Enchanted")) { - if (!source.equals(card.getEnchanting())) { + if (!source.equals(card.getAttachingEntity())) { return false; } } else if (property.startsWith("CanEnchant")) { @@ -545,7 +545,7 @@ public class CardProperty { final SpellAbility saTargeting = sa.getSATargetingCard(); if (saTargeting != null) { for (final Card c : saTargeting.getTargets().getTargetCards()) { - if (!card.isAttachedBy(c)) { + if (!card.isAttachedByCard(c)) { return false; } } @@ -553,16 +553,16 @@ public class CardProperty { } } else if (property.substring(10).equals("Enchanted")) { if (source.getEnchantingCard() == null || - !card.isAttachedBy(source.getEnchantingCard())) { + !card.isAttachedByCard(source.getEnchantingCard())) { return false; } } else { - if (!card.isAttachedBy(source)) { + if (!card.isAttachedByCard(source)) { return false; } } } else if (property.startsWith("FortifiedBy")) { - if (!card.isAttachedBy(source)) { + if (!card.isAttachedByCard(source)) { return false; } } else if (property.startsWith("CanBeAttachedBy")) { @@ -570,12 +570,12 @@ public class CardProperty { return false; } } else if (property.startsWith("Equipped")) { - if (!source.isAttachedBy(card)) { + if (!source.isAttachedByCard(card)) { return false; } } else if (property.startsWith("Fortified")) { // FIXME TODO what property has this? - if (!source.isAttachedBy(card)) { + if (!source.isAttachedByCard(card)) { return false; } } else if (property.startsWith("HauntedBy")) { 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 821025b66fc..548358664ae 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -265,8 +265,8 @@ public final class CardUtil { newCopy.setReceivedDamageFromPlayerThisTurn(in.getReceivedDamageFromPlayerThisTurn()); newCopy.getDamageHistory().setCreatureGotBlockedThisTurn(in.getDamageHistory().getCreatureGotBlockedThisTurn()); - newCopy.setAttachedBy(in.getAttachedBy()); - newCopy.setAttaching(in.getAttaching()); + newCopy.setAttachedCards(in.getAttachedCards()); + newCopy.setAttachingEntity(in.getAttachingEntity()); newCopy.setClones(in.getClones()); newCopy.setHaunting(in.getHaunting()); diff --git a/forge-game/src/main/java/forge/game/card/CardView.java b/forge-game/src/main/java/forge/game/card/CardView.java index f45e925cb53..ed41f247b36 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -446,7 +446,7 @@ public class CardView extends GameEntityView { return get(TrackableProperty.Attaching); } void updateAttaching(Card c) { - set(TrackableProperty.Attaching, GameEntityView.get(c.getAttaching())); + set(TrackableProperty.Attaching, GameEntityView.get(c.getAttachingEntity())); } public CardView getAttachingCard() { diff --git a/forge-game/src/main/java/forge/game/cost/CostUnattach.java b/forge-game/src/main/java/forge/game/cost/CostUnattach.java index 194d97ae060..dbb9bab6118 100644 --- a/forge-game/src/main/java/forge/game/cost/CostUnattach.java +++ b/forge-game/src/main/java/forge/game/cost/CostUnattach.java @@ -116,7 +116,7 @@ public class CostUnattach extends CostPartWithList { */ @Override protected Card doPayment(SpellAbility ability, Card targetCard) { - targetCard.unAttachEntity(targetCard.getAttaching()); + targetCard.unattachFromEntity(targetCard.getAttachingEntity()); return targetCard; } diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index eb5ac5885b5..c9bd1056aa1 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -684,7 +684,7 @@ public class Player extends GameEntity implements Comparable { restDamage *= 2; } } else if (c.getName().equals("Curse of Bloodletting")) { - if (c.getEnchanting().equals(this)) { + if (c.getAttachingEntity().equals(this)) { restDamage *= 2; } } else if (c.getName().equals("Gisela, Blade of Goldnight")) { @@ -2098,7 +2098,7 @@ public class Player extends GameEntity implements Comparable { return false; } } else if (incR[0].equals("EnchantedController")) { - final GameEntity enchanted = source.getEnchanting(); + final GameEntity enchanted = source.getAttachingEntity(); if ((enchanted == null) || !(enchanted instanceof Card)) { return false; } @@ -2934,4 +2934,13 @@ public class Player extends GameEntity implements Comparable { removeKeyword("Skip the untap step of this turn."); removeKeyword("Schemes can't be set in motion this turn."); } + + public final boolean isCursed() { + if (this.attachedCards == null) { + return false; + } + + return CardLists.count(attachedCards, CardPredicates.Presets.CURSE) > 0; + } + } diff --git a/forge-game/src/main/java/forge/trackable/TrackableProperty.java b/forge-game/src/main/java/forge/trackable/TrackableProperty.java index 30ae35818e1..e324887f40b 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableProperty.java +++ b/forge-game/src/main/java/forge/trackable/TrackableProperty.java @@ -11,7 +11,7 @@ public enum TrackableProperty { //Shared Text(TrackableTypes.StringType), PreventNextDamage(TrackableTypes.IntegerType), - AttachedBy(TrackableTypes.CardViewCollectionType), + AttachedCards(TrackableTypes.CardViewCollectionType), Counters(TrackableTypes.CounterMapType), CurrentPlane(TrackableTypes.StringType), PlanarPlayer(TrackableTypes.PlayerViewType), diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java b/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java index 039f4bb85e3..34b7fe0e0dd 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java @@ -405,7 +405,7 @@ public class TargetingOverlay { } final CardView attaching = c.getAttachingCard(); - final Iterable attachedBy = c.getAttachedBy(); + final Iterable attachedBy = c.getAttachedCards(); final CardView paired = c.getPairedWith(); if (null != attaching) { diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/PlayArea.java b/forge-gui-desktop/src/main/java/forge/view/arcane/PlayArea.java index 42defe2a9bd..e0a03bb2794 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/PlayArea.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/PlayArea.java @@ -106,7 +106,7 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen final CardStack stack = allLands.get(i); final CardPanel firstPanel = stack.get(0); if (firstPanel.getCard().getCurrentState().getName().equals(state.getName())) { - if (!firstPanel.getAttachedPanels().isEmpty() || firstPanel.getCard().isAttached()) { + if (!firstPanel.getAttachedPanels().isEmpty() || firstPanel.getCard().isAttachedByCards()) { // Put this land to the left of lands with the same name // and attachments. insertIndex = i; @@ -114,7 +114,7 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen } if (!panel.getAttachedPanels().isEmpty() || !panel.getCard().hasSameCounters(firstPanel.getCard()) - || firstPanel.getCard().isAttached() || (stack.size() == this.landStackMax)) { + || firstPanel.getCard().isAttachedByCards() || (stack.size() == this.landStackMax)) { // If this land has attachments or the stack is full, // put it to the right. insertIndex = i + 1; @@ -683,8 +683,8 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen } toPanel.getAttachedPanels().clear(); - if (card.isAttached()) { - final Iterable enchants = card.getAttachedBy(); + if (card.isAttachedByCards()) { + final Iterable enchants = card.getAttachedCards(); for (final CardView e : enchants) { final CardPanel cardE = getCardPanel(e.getId()); if (cardE != null) { 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 af6c42d9566..a7b96e9705e 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 @@ -116,7 +116,7 @@ public class GameSimulatorTest extends SimulationTestCase { Card bear = addCard(bearCardName, p); bear.setSickness(false); Card cloak = addCard("Whispersilk Cloak", p); - cloak.attachEntity(bear); + cloak.attachToEntity(bear); game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); game.getAction().checkStateEffects(true); assertEquals(1, bear.getAmountOfKeyword("Unblockable")); @@ -134,7 +134,7 @@ public class GameSimulatorTest extends SimulationTestCase { Card bear = addCard(bearCardName, p); bear.setSickness(false); Card lifelink = addCard("Lifelink", p); - lifelink.attachEntity(bear); + lifelink.attachToEntity(bear); game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); game.getAction().checkStateEffects(true); assertEquals(1, bear.getAmountOfKeyword("Lifelink")); @@ -665,7 +665,7 @@ public class GameSimulatorTest extends SimulationTestCase { Card pridemate = addCard(pridemateName, p1); Card indestructibility = addCard(indestructibilityName, p1); - indestructibility.attachEntity(pridemate); + indestructibility.attachToEntity(pridemate); Card ignition = addCardToZone(ignitionName, p1, ZoneType.Hand); SpellAbility ignitionSA = ignition.getFirstSpellAbility(); @@ -779,7 +779,7 @@ public class GameSimulatorTest extends SimulationTestCase { Card pridemate = addCard(pridemateName, p1); Card indestructibility = addCard(indestructibilityName, p1); - indestructibility.attachEntity(pridemate); + indestructibility.attachToEntity(pridemate); Card ignition = addCardToZone(ignitionName, p1, ZoneType.Hand); SpellAbility ignitionSA = ignition.getFirstSpellAbility(); @@ -1375,10 +1375,10 @@ public class GameSimulatorTest extends SimulationTestCase { Card bear = addCard(bearCardName, p); bear.setSickness(false); Card lifelink = addCard("Lifelink", p); - lifelink.attachEntity(bear); + lifelink.attachToEntity(bear); assertTrue(bear.isEnchanted()); - assertTrue(bear.isAttachedBy(lifelink)); + assertTrue(bear.isAttachedByCard(lifelink)); // this adds Artifact Type addCardToZone("Mycosynth Lattice", p, ZoneType.Battlefield); @@ -1413,10 +1413,10 @@ public class GameSimulatorTest extends SimulationTestCase { final String curseName = "Cruel Reality"; Card curse = addCard(curseName, p); - curse.attachEntity(p); + curse.attachToEntity(p); game.getAction().checkStateEffects(true); assertTrue(p.isEnchanted()); - assertTrue(p.isAttachedBy(curse)); + assertTrue(p.isAttachedByCard(curse)); // this adds Artifact Type addCardToZone("Mycosynth Lattice", p, ZoneType.Battlefield); @@ -1446,14 +1446,14 @@ public class GameSimulatorTest extends SimulationTestCase { Card mountain = addCardToZone("Mountain", p, ZoneType.Battlefield); Card fortification = addCardToZone("Darksteel Garrison", p, ZoneType.Battlefield); - fortification.attachEntity(mountain); + fortification.attachToEntity(mountain); game.getAction().checkStateEffects(true); assertTrue(fortification.isFortification()); assertFalse(fortification.isEquipment()); assertTrue(mountain.isFortified()); - assertTrue(mountain.isAttachedBy(fortification)); + assertTrue(mountain.isAttachedByCard(fortification)); assertTrue(mountain.hasKeyword(Keyword.INDESTRUCTIBLE)); // adding Brawl will cause the Fortification into Equipment and it to @@ -1464,7 +1464,7 @@ public class GameSimulatorTest extends SimulationTestCase { assertFalse(fortification.isFortification()); assertTrue(fortification.isEquipment()); - assertFalse(mountain.isAttachedBy(fortification)); + assertFalse(mountain.isAttachedByCard(fortification)); assertFalse(mountain.hasKeyword(Keyword.INDESTRUCTIBLE)); } @@ -1480,13 +1480,13 @@ public class GameSimulatorTest extends SimulationTestCase { Card dryad = addCardToZone("Dryad Arbor", p, ZoneType.Battlefield); Card fortification = addCardToZone("Darksteel Garrison", p, ZoneType.Battlefield); - fortification.attachEntity(dryad); + fortification.attachToEntity(dryad); game.getAction().checkStateEffects(true); assertTrue(dryad.isFortified()); assertFalse(dryad.isEquipped()); - assertTrue(dryad.isAttachedBy(fortification)); + assertTrue(dryad.isAttachedByCard(fortification)); assertTrue(dryad.hasKeyword(Keyword.INDESTRUCTIBLE)); // adding Brawl will cause the Fortification into Equipment @@ -1498,7 +1498,7 @@ public class GameSimulatorTest extends SimulationTestCase { assertFalse(dryad.isFortified()); assertTrue(dryad.isEquipped()); - assertTrue(dryad.isAttachedBy(fortification)); + assertTrue(dryad.isAttachedByCard(fortification)); assertTrue(dryad.hasKeyword(Keyword.INDESTRUCTIBLE)); } diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java index a296d1e0c54..d13703433f5 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java @@ -105,7 +105,7 @@ public class GameWrapper { Card target = CardSpecificationHandler.INSTANCE.find( game, card.getTarget() ); if (actualCard.isAttachment()) { if (target.canBeAttachedBy(actualCard)) { - actualCard.attachEntity(target); + actualCard.attachToEntity(target); } else { throw new IllegalStateException( actualCard + " can't attach to " + target ); } diff --git a/forge-gui/src/main/java/forge/card/CardDetailUtil.java b/forge-gui/src/main/java/forge/card/CardDetailUtil.java index c145f459e59..0015a9410b8 100644 --- a/forge-gui/src/main/java/forge/card/CardDetailUtil.java +++ b/forge-gui/src/main/java/forge/card/CardDetailUtil.java @@ -442,12 +442,12 @@ public class CardDetailUtil { } // attached by - if (card.isAttached()) { + if (card.isAttachedByCards()) { if (area.length() != 0) { area.append("\n"); } area.append("=Attached: "); - area.append(StringUtils.join(card.getAttachedBy(), ", ")); + area.append(StringUtils.join(card.getAttachedCards(), ", ")); area.append("="); } From a838228008d378b193057d455e2ecc2f1b00a20d Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 23 Nov 2018 22:45:06 +0300 Subject: [PATCH 221/901] - Improved AI card choice for Phylactery Lich. --- .../java/forge/ai/ability/ChooseCardAi.java | 17 +++++++++++++++++ forge-gui/res/cardsfolder/p/phylactery_lich.txt | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) 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 dc23c4cdb7c..db861634ebe 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java @@ -4,6 +4,7 @@ import java.util.Collections; import java.util.List; import com.google.common.base.Predicate; +import com.google.common.base.Predicates; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; @@ -274,6 +275,22 @@ public class ChooseCardAi extends SpellAbilityAi { if (ai.equals(sa.getActivatingPlayer())) { choice = ComputerUtilCard.getBestAI(options); } // TODO: improve ai + } else if (logic.equals("Phylactery")) { + CardCollection aiArtifacts = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), Presets.ARTIFACTS); + CardCollection indestructibles = CardLists.filter(aiArtifacts, CardPredicates.hasKeyword(Keyword.INDESTRUCTIBLE)); + CardCollection nonCreatures = CardLists.filter(aiArtifacts, Predicates.not(Presets.CREATURES)); + CardCollection creatures = CardLists.filter(aiArtifacts, Presets.CREATURES); + if (!indestructibles.isEmpty()) { + // Choose the worst (smallest) indestructible artifact so that the opponent would have to waste + // removal on something unpreferred + choice = ComputerUtilCard.getWorstAI(indestructibles); + } else if (!nonCreatures.isEmpty()) { + // The same as above, but for non-indestructible non-creature artifacts (they can't die in combat) + choice = ComputerUtilCard.getWorstAI(nonCreatures); + } else if (!creatures.isEmpty()) { + // Choose the best (hopefully the fattest, whatever) creature so that hopefully it won't die too easily + choice = ComputerUtilCard.getBestAI(creatures); + } } else { choice = ComputerUtilCard.getBestAI(options); } diff --git a/forge-gui/res/cardsfolder/p/phylactery_lich.txt b/forge-gui/res/cardsfolder/p/phylactery_lich.txt index 58f0915bf74..704f26ae557 100644 --- a/forge-gui/res/cardsfolder/p/phylactery_lich.txt +++ b/forge-gui/res/cardsfolder/p/phylactery_lich.txt @@ -4,7 +4,7 @@ Types:Creature Zombie PT:5/5 K:Indestructible K:ETBReplacement:Other:TrigChooseArtifact -SVar:TrigChooseArtifact:DB$ ChooseCard | Choices$ Artifact.YouCtrl | RememberChosen$ True | SubAbility$ DBPutCounter | SpellDescription$ As CARDNAME enters the battlefield, put a phylactery counter on an artifact you control. +SVar:TrigChooseArtifact:DB$ ChooseCard | Choices$ Artifact.YouCtrl | RememberChosen$ True | SubAbility$ DBPutCounter | AILogic$ Phylactery | SpellDescription$ As CARDNAME enters the battlefield, put a phylactery counter on an artifact you control. SVar:DBPutCounter:DB$ PutCounter | CounterType$ PHYLACTERY | CounterNum$ 1 | Defined$ Remembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Permanent.counters_GE1_PHYLACTERY+YouCtrl | PresentCompare$ EQ0 | Execute$ TrigSac | TriggerDescription$ When you control no permanents with phylactery counters on them, sacrifice CARDNAME. From 3b283b14a70d8efc6b8c8e7dd1e64423666966cb Mon Sep 17 00:00:00 2001 From: Hanmac Date: Fri, 23 Nov 2018 20:53:26 +0100 Subject: [PATCH 222/901] cards: add updated cards again --- forge-gui/res/cardsfolder/a/anti_magic_aura.txt | 4 ++-- forge-gui/res/cardsfolder/c/consecrate_land.txt | 3 ++- forge-gui/res/cardsfolder/g/guardian_beast.txt | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/forge-gui/res/cardsfolder/a/anti_magic_aura.txt b/forge-gui/res/cardsfolder/a/anti_magic_aura.txt index 3ca05c7ab63..a9cf653b3b5 100644 --- a/forge-gui/res/cardsfolder/a/anti_magic_aura.txt +++ b/forge-gui/res/cardsfolder/a/anti_magic_aura.txt @@ -3,7 +3,7 @@ ManaCost:2 U Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ 2 U | ValidTgts$ Creature | AILogic$ Pump -S:Mode$ CantTarget | ValidCard$ Creature.EnchantedBy | ValidSA$ Spell | Description$ Enchanted creature can't be the target of spells and can't be enchanted by other Auras. -S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddHiddenKeyword$ CARDNAME can't be enchanted. +S:Mode$ CantTarget | ValidCard$ Creature.EnchantedBy | ValidSA$ Spell | Description$ Enchanted creature can't be the target of spells. +S:Mode$ CantAttach | ValidCard$ Aura.Other | Target$ Creature.EnchantedBy | Description$ Enchanted creature can't be enchanted by other Auras. SVar:Picture:http://www.wizards.com/global/images/magic/general/anti_magic_aura.jpg Oracle:Enchant creature\nEnchanted creature can't be the target of spells and can't be enchanted by other Auras. diff --git a/forge-gui/res/cardsfolder/c/consecrate_land.txt b/forge-gui/res/cardsfolder/c/consecrate_land.txt index 1bb3819858f..3ffed7d272c 100644 --- a/forge-gui/res/cardsfolder/c/consecrate_land.txt +++ b/forge-gui/res/cardsfolder/c/consecrate_land.txt @@ -3,7 +3,8 @@ ManaCost:W Types:Enchantment Aura K:Enchant land A:SP$ Attach | Cost$ W | ValidTgts$ Land | AILogic$ Pump -S:Mode$ Continuous | Affected$ Land.EnchantedBy | AddHiddenKeyword$ CARDNAME can't be enchanted. | AddKeyword$ Indestructible | Description$ Enchanted land has indestructible and can't be enchanted by other Auras. +S:Mode$ Continuous | Affected$ Land.EnchantedBy | AddKeyword$ Indestructible | Description$ Enchanted land has indestructible. +S:Mode$ CantAttach | ValidCard$ Aura.Other | Target$ Land.EnchantedBy | Description$ Enchanted land can't be enchanted by other Auras. AI:RemoveDeck:Random SVar:NonStackingAttachEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/consecrate_land.jpg diff --git a/forge-gui/res/cardsfolder/g/guardian_beast.txt b/forge-gui/res/cardsfolder/g/guardian_beast.txt index 987fca6f839..f1cbcaf8ca7 100644 --- a/forge-gui/res/cardsfolder/g/guardian_beast.txt +++ b/forge-gui/res/cardsfolder/g/guardian_beast.txt @@ -2,7 +2,7 @@ Name:Guardian Beast ManaCost:3 B Types:Creature Beast PT:2/4 -S:Mode$ Continuous | Affected$ Artifact.nonCreature+YouCtrl | AddKeyword$ Indestructible | AddHiddenKeyword$ Other players can't gain control of CARDNAME. & CARDNAME can't be enchanted in the future. | CheckSVar$ X | Description$ As long as CARDNAME is untapped, noncreature artifacts you control can't be enchanted, they have indestructible, and other players can't gain control of them. This effect doesn't remove Auras already attached to those artifacts. -SVar:X:Count$Valid Card.Self+untapped +S:Mode$ Continuous | Affected$ Artifact.nonCreature+YouCtrl | AddKeyword$ Indestructible | AddHiddenKeyword$ Other players can't gain control of CARDNAME. | IsPresent$ Card.Self+untapped | Description$ As long as CARDNAME is untapped, noncreature artifacts you control have indestructible, and other players can't gain control of them. +S:Mode$ CantAttach | ValidCardToTarget$ Aura.NotAttachedTo | Target$ Artifact.nonCreature+YouCtrl | IsPresent$ Card.Self+untapped | Description$ As long as CARDNAME is untapped, noncreature artifacts you control can't be enchanted, This effect doesn't remove Auras already attached to those artifacts. SVar:Picture:http://www.wizards.com/global/images/magic/general/guardian_beast.jpg Oracle:As long as Guardian Beast is untapped, noncreature artifacts you control can't be enchanted, they have indestructible, and other players can't gain control of them. This effect doesn't remove Auras already attached to those artifacts. From d0857ad6968e1df7bf9c07eecfdd4faeff99842b Mon Sep 17 00:00:00 2001 From: Hanmac Date: Fri, 23 Nov 2018 22:24:57 +0100 Subject: [PATCH 223/901] attach: rework attaching names --- forge-game/src/main/java/forge/game/card/CardView.java | 10 +++++----- .../main/java/forge/trackable/TrackableProperty.java | 2 +- .../src/forge/screens/match/views/VField.java | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/CardView.java b/forge-game/src/main/java/forge/game/card/CardView.java index ed41f247b36..3c2519d9136 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -442,22 +442,22 @@ public class CardView extends GameEntityView { return get(TrackableProperty.EncodedCards); } - public GameEntityView getAttaching() { - return get(TrackableProperty.Attaching); + public GameEntityView getAttachingEntity() { + return get(TrackableProperty.AttachingEntity); } void updateAttaching(Card c) { - set(TrackableProperty.Attaching, GameEntityView.get(c.getAttachingEntity())); + set(TrackableProperty.AttachingEntity, GameEntityView.get(c.getAttachingEntity())); } public CardView getAttachingCard() { - GameEntityView enchanting = getAttaching(); + GameEntityView enchanting = getAttachingEntity(); if (enchanting instanceof CardView) { return (CardView) enchanting; } return null; } public PlayerView getAttachingPlayer() { - GameEntityView enchanting = getAttaching(); + GameEntityView enchanting = getAttachingEntity(); if (enchanting instanceof PlayerView) { return (PlayerView) enchanting; } diff --git a/forge-game/src/main/java/forge/trackable/TrackableProperty.java b/forge-game/src/main/java/forge/trackable/TrackableProperty.java index e324887f40b..a8d05db057a 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableProperty.java +++ b/forge-game/src/main/java/forge/trackable/TrackableProperty.java @@ -43,7 +43,7 @@ public enum TrackableProperty { NamedCard(TrackableTypes.StringType), PlayerMayLook(TrackableTypes.PlayerViewCollectionType, FreezeMode.IgnoresFreeze), PlayerMayLookTemp(TrackableTypes.PlayerViewCollectionType, FreezeMode.IgnoresFreeze), - Attaching(TrackableTypes.GameEntityViewType), + AttachingEntity(TrackableTypes.GameEntityViewType), EncodedCards(TrackableTypes.CardViewCollectionType), GainControlTargets(TrackableTypes.CardViewCollectionType), CloneOrigin(TrackableTypes.CardViewType), diff --git a/forge-gui-mobile/src/forge/screens/match/views/VField.java b/forge-gui-mobile/src/forge/screens/match/views/VField.java index c49c128f2d9..4c7d6482307 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VField.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VField.java @@ -99,7 +99,7 @@ public class VField extends FContainer { }; private boolean tryStackCard(CardView card, List cardsOfType) { - if (card.isAttached()) { + if (card.isAttachedByCards()) { return false; //can stack with enchanted or equipped card } if (card.getCurrentState().isCreature() && !card.isToken()) { @@ -107,7 +107,7 @@ public class VField extends FContainer { } final String cardName = card.getCurrentState().getName(); for (CardView c : cardsOfType) { - if (!c.isAttached() && + if (!c.isAttachedByCards() && cardName.equals(c.getCurrentState().getName()) && card.hasSameCounters(c) && card.isToken() == c.isToken()) { //don't stack tokens on top of non-tokens From 00253aaa6de73f06d0b86e19a3c8651167b3ce4e Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 24 Nov 2018 09:25:37 +0300 Subject: [PATCH 224/901] - Fixed Otaria. --- forge-gui/res/cardsfolder/o/otaria.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/res/cardsfolder/o/otaria.txt b/forge-gui/res/cardsfolder/o/otaria.txt index 48f39e3257d..544b7275567 100644 --- a/forge-gui/res/cardsfolder/o/otaria.txt +++ b/forge-gui/res/cardsfolder/o/otaria.txt @@ -2,6 +2,7 @@ Name:Otaria ManaCost:no cost Types:Plane Dominaria S:Mode$ Continuous | Affected$ Instant,Sorcery | EffectZone$ Command | AffectedZone$ Graveyard | AddKeyword$ Flashback | Description$ Instant and sorcery cards in graveyards have flashback. The flashback cost is equal to the card's mana cost. (Its owner may cast the card from their graveyard for its mana cost. Then they exile it.) +S:Mode$ Continuous | Affected$ Instant.wasCastFromGraveyard,Sorcery.wasCastFromGraveyard | EffectZone$ Command | AffectedZone$ Stack | AddKeyword$ Flashback | Secondary$ True T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, take an extra turn after this one. SVar:RolledChaos:DB$ AddTurn | NumTurns$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/otaria.jpg From 05ac8b0b53d82b1de4aaef9adab884ec932428ee Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 24 Nov 2018 10:53:06 +0300 Subject: [PATCH 225/901] - Attempting to refactor names to not be ambiguous/confusing. --- .../src/main/java/forge/ai/ComputerUtil.java | 2 +- .../src/main/java/forge/ai/GameState.java | 10 +-- .../main/java/forge/ai/ability/AttachAi.java | 4 +- .../java/forge/ai/ability/ZoneExchangeAi.java | 2 +- .../java/forge/ai/simulation/GameCopier.java | 4 +- .../src/main/java/forge/game/GameAction.java | 10 +-- .../src/main/java/forge/game/GameEntity.java | 16 ++--- .../main/java/forge/game/GameEntityView.java | 4 +- .../java/forge/game/ability/AbilityUtils.java | 4 +- .../game/ability/effects/AttachEffect.java | 4 +- .../game/ability/effects/TokenEffect.java | 2 +- .../ability/effects/UnattachAllEffect.java | 4 +- .../game/ability/effects/UnattachEffect.java | 2 +- .../ability/effects/ZoneExchangeEffect.java | 2 +- .../src/main/java/forge/game/card/Card.java | 62 +++++++++---------- .../java/forge/game/card/CardFactory.java | 2 +- .../java/forge/game/card/CardFactoryUtil.java | 4 +- .../java/forge/game/card/CardPredicates.java | 4 +- .../java/forge/game/card/CardProperty.java | 50 +++++++-------- .../main/java/forge/game/card/CardUtil.java | 2 +- .../main/java/forge/game/card/CardView.java | 16 ++--- .../java/forge/game/cost/CostUnattach.java | 2 +- .../src/main/java/forge/game/phase/Untap.java | 2 +- .../main/java/forge/game/player/Player.java | 4 +- .../forge/trackable/TrackableProperty.java | 2 +- .../forge/screens/match/TargetingOverlay.java | 16 ++--- .../main/java/forge/view/arcane/PlayArea.java | 10 +-- .../ai/simulation/GameSimulatorTest.java | 12 ++-- .../gamesimulationtests/util/GameWrapper.java | 2 +- .../screens/match/views/VCardDisplayArea.java | 8 +-- .../src/forge/screens/match/views/VField.java | 4 +- forge-gui/res/puzzle/INQ02.pzl | 2 +- forge-gui/res/puzzle/PC_020816.pzl | 4 +- forge-gui/res/puzzle/PC_033115.pzl | 2 +- forge-gui/res/puzzle/PC_040715.pzl | 2 +- forge-gui/res/puzzle/PC_042815.pzl | 2 +- forge-gui/res/puzzle/PC_051215.pzl | 2 +- forge-gui/res/puzzle/PC_051915.pzl | 2 +- forge-gui/res/puzzle/PC_052615.pzl | 2 +- forge-gui/res/puzzle/PC_060215.pzl | 2 +- forge-gui/res/puzzle/PC_060915.pzl | 2 +- forge-gui/res/puzzle/PC_062315.pzl | 2 +- forge-gui/res/puzzle/PC_063015.pzl | 2 +- forge-gui/res/puzzle/PC_070715.pzl | 2 +- forge-gui/res/puzzle/PC_071415.pzl | 2 +- forge-gui/res/puzzle/PC_072115.pzl | 4 +- forge-gui/res/puzzle/PC_072815.pzl | 2 +- forge-gui/res/puzzle/PC_081115.pzl | 2 +- forge-gui/res/puzzle/PC_081815.pzl | 4 +- forge-gui/res/puzzle/PC_082515.pzl | 2 +- forge-gui/res/puzzle/PC_090115.pzl | 4 +- forge-gui/res/puzzle/PC_090815.pzl | 2 +- forge-gui/res/puzzle/PC_092215.pzl | 4 +- forge-gui/res/puzzle/PC_101315.pzl | 2 +- forge-gui/res/puzzle/PC_102015.pzl | 2 +- forge-gui/res/puzzle/PC_111715.pzl | 2 +- forge-gui/res/puzzle/PC_112415.pzl | 2 +- forge-gui/res/puzzle/PC_120815.pzl | 2 +- forge-gui/res/puzzle/PC_121515.pzl | 4 +- forge-gui/res/puzzle/PC_122915.pzl | 2 +- forge-gui/res/puzzle/PC_44.pzl | 4 +- forge-gui/res/puzzle/PM03.pzl | 4 +- forge-gui/res/puzzle/PP04.pzl | 4 +- forge-gui/res/puzzle/PP05.pzl | 2 +- forge-gui/res/puzzle/PP09.pzl | 2 +- forge-gui/res/puzzle/PP13.pzl | 2 +- forge-gui/res/puzzle/PP14.pzl | 4 +- forge-gui/res/puzzle/PP15.pzl | 4 +- forge-gui/res/puzzle/PP16.pzl | 2 +- forge-gui/res/puzzle/PP17.pzl | 2 +- forge-gui/res/puzzle/PP22.pzl | 2 +- forge-gui/res/puzzle/PP24.pzl | 2 +- forge-gui/res/puzzle/PP30.pzl | 2 +- forge-gui/res/puzzle/PS_AKH5.pzl | 2 +- forge-gui/res/puzzle/PS_AKH6.pzl | 2 +- forge-gui/res/puzzle/PS_DOM0.pzl | 2 +- forge-gui/res/puzzle/PS_DOM3.pzl | 2 +- forge-gui/res/puzzle/PS_DOM6.pzl | 2 +- forge-gui/res/puzzle/PS_DOM9.pzl | 2 +- forge-gui/res/puzzle/PS_GRN2.pzl | 4 +- forge-gui/res/puzzle/PS_GRN3.pzl | 2 +- forge-gui/res/puzzle/PS_GRN5.pzl | 2 +- forge-gui/res/puzzle/PS_GRN6.pzl | 2 +- forge-gui/res/puzzle/PS_HOU0.pzl | 2 +- forge-gui/res/puzzle/PS_M191.pzl | 2 +- forge-gui/res/puzzle/PS_M193.pzl | 2 +- forge-gui/res/puzzle/PS_M199.pzl | 2 +- forge-gui/res/puzzle/PS_RIX1.pzl | 2 +- forge-gui/res/puzzle/PS_RIX5.pzl | 2 +- forge-gui/res/puzzle/PS_RIX6.pzl | 2 +- forge-gui/res/puzzle/PS_XLN3.pzl | 2 +- forge-gui/res/puzzle/PS_XLN7.pzl | 2 +- forge-gui/res/puzzle/PS_XLN9.pzl | 2 +- forge-gui/res/puzzle/forge_tutorial02.pzl | 2 +- .../main/java/forge/card/CardDetailUtil.java | 14 ++--- 95 files changed, 218 insertions(+), 218 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index 4c3d29267f7..f65c345cc38 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -975,7 +975,7 @@ public class ComputerUtil { playNow = false; break; } - if (!playNow && c.isCreature() && ComputerUtilCombat.canAttackNextTurn(c) && c.canBeAttachedBy(card)) { + if (!playNow && c.isCreature() && ComputerUtilCombat.canAttackNextTurn(c) && c.canBeTargetedByAttachment(card)) { playNow = true; } } diff --git a/forge-ai/src/main/java/forge/ai/GameState.java b/forge-ai/src/main/java/forge/ai/GameState.java index 507ed1c8c1d..db79263a93e 100644 --- a/forge-ai/src/main/java/forge/ai/GameState.java +++ b/forge-ai/src/main/java/forge/ai/GameState.java @@ -289,12 +289,12 @@ public abstract class GameState { newText.append("|Meld"); } if (c.isAttachedToEntity()) { - newText.append("|Attaching:").append(c.getAttachingEntity().getId()); + newText.append("|AttachedTo:").append(c.getEntityAttachedTo().getId()); } - if (c.getAttachingPlayer() != null) { + if (c.getPlayerAttachedTo() != null) { // TODO: improve this for game states with more than two players newText.append("|EnchantingPlayer:"); - Player p = c.getAttachingPlayer(); + Player p = c.getPlayerAttachedTo(); newText.append(p.getController().isAI() ? "AI" : "HUMAN"); } @@ -1029,7 +1029,7 @@ public abstract class GameState { // (will be overridden later, so the actual value shouldn't matter) //FIXME it shouldn't be able to attach itself - c.setAttachingEntity(c); + c.setEntityAttachedTo(c); } if (cardsWithoutETBTrigs.contains(c)) { @@ -1126,7 +1126,7 @@ public abstract class GameState { } else if (info.startsWith("Id:")) { int id = Integer.parseInt(info.substring(3)); idToCard.put(id, c); - } else if (info.startsWith("Attaching:")) { + } else if (info.startsWith("Attaching:") /*deprecated*/ || info.startsWith("AttachedTo:")) { int id = Integer.parseInt(info.substring(info.indexOf(':') + 1)); cardToAttachId.put(c, id); } else if (info.startsWith("EnchantingPlayer:")) { diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index 82cd94d0621..b66f9678310 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -1282,7 +1282,7 @@ public class AttachAi extends SpellAbilityAi { } // Don't fortify if already fortifying - if (attachSource.getAttachingCard() != null && attachSource.getAttachingCard().getController() == aiPlayer) { + if (attachSource.getAttachedTo() != null && attachSource.getAttachedTo().getController() == aiPlayer) { return null; } @@ -1292,7 +1292,7 @@ public class AttachAi extends SpellAbilityAi { } else { list = CardLists.getValidCards(aiPlayer.getGame().getCardsIn(tgt.getZone()), tgt.getValidTgts(), sa.getActivatingPlayer(), attachSource, sa); - list = CardLists.filter(list, CardPredicates.canBeAttachedBy(attachSource)); + list = CardLists.filter(list, CardPredicates.canBeTargetedByAttachment(attachSource)); // TODO If Attaching without casting, don't need to actually target. // I believe this is the only case where mandatory will be true, so just diff --git a/forge-ai/src/main/java/forge/ai/ability/ZoneExchangeAi.java b/forge-ai/src/main/java/forge/ai/ability/ZoneExchangeAi.java index 709ceff6ac2..05e8eeb705f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ZoneExchangeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ZoneExchangeAi.java @@ -39,7 +39,7 @@ public class ZoneExchangeAi extends SpellAbilityAi { } if (type.equals("Aura")) { Card c = object1.getEnchantingCard(); - if (!c.canBeAttachedBy(object2)) { + if (!c.canBeTargetedByAttachment(object2)) { return false; } } 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 2a58ab4b3f3..b1fe62567bf 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java +++ b/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java @@ -212,8 +212,8 @@ public class GameCopier { otherCard.setSickness(card.hasSickness()); otherCard.setState(card.getCurrentStateName(), false); if (card.isAttachedToEntity()) { - GameEntity ge = gameObjectMap.map(card.getAttachingEntity()); - otherCard.setAttachingEntity(ge); + GameEntity ge = gameObjectMap.map(card.getEntityAttachedTo()); + otherCard.setEntityAttachedTo(ge); ge.addAttachedCard(otherCard); } if (card.getCloneOrigin() != null) { diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index aa28d75f215..780d70a8ae4 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -508,7 +508,7 @@ public class GameAction { // unenchant creature if moving aura if (copied.isAttachedToEntity()) { - copied.unattachFromEntity(copied.getAttachingEntity()); + copied.unattachFromEntity(copied.getEntityAttachedTo()); } } @@ -975,7 +975,7 @@ public class GameAction { checkAgain |= stateBasedAction704_attach(c); // Attachment if (c.isCreature() && c.isAttachedToEntity()) { // Rule 704.5q - Creature attached to an object or player, becomes unattached - c.unattachFromEntity(c.getAttachingEntity()); + c.unattachFromEntity(c.getEntityAttachedTo()); checkAgain = true; } @@ -1093,14 +1093,14 @@ public class GameAction { boolean checkAgain = false; if (c.isAttachedToEntity()) { - final GameEntity ge = c.getAttachingEntity(); - if (!ge.canBeAttachedBy(c)) { + final GameEntity ge = c.getEntityAttachedTo(); + if (!ge.canBeTargetedByAttachment(c)) { c.unattachFromEntity(ge); checkAgain = true; } } - if (c.isAttachedByCards()) { + if (c.hasCardAttachments()) { for (final Card attach : Lists.newArrayList(c.getAttachedCards())) { if (!attach.isInPlay()) { attach.unattachFromEntity(c); diff --git a/forge-game/src/main/java/forge/game/GameEntity.java b/forge-game/src/main/java/forge/game/GameEntity.java index 23520f46275..e31b3a7e47f 100644 --- a/forge-game/src/main/java/forge/game/GameEntity.java +++ b/forge-game/src/main/java/forge/game/GameEntity.java @@ -307,7 +307,7 @@ public abstract class GameEntity extends GameObject implements IIdentifiable { getView().updateAttachedCards(this); } - public final boolean isAttachedByCards() { + public final boolean hasCardAttachments() { return FCollection.hasElements(attachedCards); } @@ -320,15 +320,15 @@ public abstract class GameEntity extends GameObject implements IIdentifiable { return CardLists.count(attachedCards, CardPredicates.Presets.AURA) > 0; } - public final boolean isAttachedByCard(Card c) { + public final boolean hasCardAttachment(Card c) { return FCollection.hasElement(attachedCards, c); } public final boolean isEnchantedBy(Card c) { // Rule 303.4k Even if c is no Aura it still counts - return isAttachedByCard(c); + return hasCardAttachment(c); } - public final boolean isAttachedByCard(final String cardName) { + public final boolean hasCardAttachment(final String cardName) { if (attachedCards == null) { return false; } @@ -336,7 +336,7 @@ public abstract class GameEntity extends GameObject implements IIdentifiable { } public final boolean isEnchantedBy(final String cardName) { // Rule 303.4k Even if c is no Aura it still counts - return isAttachedByCard(cardName); + return hasCardAttachment(cardName); } /** @@ -376,11 +376,11 @@ public abstract class GameEntity extends GameObject implements IIdentifiable { } } - public boolean canBeAttachedBy(final Card attach) { - return canBeAttachedBy(attach, false); + public boolean canBeTargetedByAttachment(final Card attach) { + return canBeTargetedByAttachment(attach, false); } - public boolean canBeAttachedBy(final Card attach, boolean checkSBA) { + public boolean canBeTargetedByAttachment(final Card attach, boolean checkSBA) { // master mode if (!attach.isAttachment() || attach.isCreature() || equals(attach)) { return false; diff --git a/forge-game/src/main/java/forge/game/GameEntityView.java b/forge-game/src/main/java/forge/game/GameEntityView.java index dc0c7f914fc..0e769a8cf56 100644 --- a/forge-game/src/main/java/forge/game/GameEntityView.java +++ b/forge-game/src/main/java/forge/game/GameEntityView.java @@ -45,12 +45,12 @@ public abstract class GameEntityView extends TrackableObject { public Iterable getAttachedCards() { return get(TrackableProperty.AttachedCards); } - public boolean isAttachedByCards() { + public boolean hasCardAttachments() { return getAttachedCards() != null; } protected void updateAttachedCards(GameEntity e) { - if (e.isAttachedByCards()) { + if (e.hasCardAttachments()) { set(TrackableProperty.AttachedCards, CardView.getCollection(e.getAttachedCards())); } else { diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index aab86a0cab9..dec83a646c8 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -545,7 +545,7 @@ public class AbilityUtils { // Add whole Enchanted list to handlePaid final CardCollection list = new CardCollection(); if (card.isEnchanting()) { - Object o = card.getAttachingEntity(); + Object o = card.getEntityAttachedTo(); if (o instanceof Card) { list.add(game.getCardState((Card) o)); } @@ -1114,7 +1114,7 @@ public class AbilityUtils { } } else if (defined.equals("EnchantedPlayer")) { - final Object o = sa.getHostCard().getAttachingEntity(); + final Object o = sa.getHostCard().getEntityAttachedTo(); if (o instanceof Player) { if (!players.contains(o)) { players.add((Player) o); diff --git a/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java index 70b471bbc16..7c9d1c838a9 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java @@ -101,7 +101,7 @@ public class AttachEffect extends SpellAbilityEffect { // Although honestly, I'm not sure if the three of those could // handle being scripted // 303.4h: If the card can't be enchanted, the aura doesn't move - if (c.canBeAttachedBy(card)) { + if (c.canBeTargetedByAttachment(card)) { handleAura(card, c); } } else { @@ -132,7 +132,7 @@ public class AttachEffect extends SpellAbilityEffect { @Override public void run() { - final GameEntity entity = card.getAttachingEntity(); + final GameEntity entity = card.getEntityAttachedTo(); if (entity == null) { return; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java b/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java index 2a32db441af..0f9de3ec43e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java @@ -497,7 +497,7 @@ public class TokenEffect extends SpellAbilityEffect { // TODO update when doing Attach Update boolean canAttach = lki.isAttachment(); - if (canAttach && ge.canBeAttachedBy(lki)) { + if (canAttach && ge.canBeTargetedByAttachment(lki)) { canAttach = false; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/UnattachAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/UnattachAllEffect.java index 83549261ec4..708e267ae48 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/UnattachAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/UnattachAllEffect.java @@ -16,8 +16,8 @@ import java.util.List; public class UnattachAllEffect extends SpellAbilityEffect { private static void handleUnattachment(final GameEntity o, final Card cardToUnattach) { - if (cardToUnattach.isAttachment() && o.isAttachedByCard(cardToUnattach)) { - cardToUnattach.unattachFromEntity(cardToUnattach.getAttachingEntity()); + if (cardToUnattach.isAttachment() && o.hasCardAttachment(cardToUnattach)) { + cardToUnattach.unattachFromEntity(cardToUnattach.getEntityAttachedTo()); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/UnattachEffect.java b/forge-game/src/main/java/forge/game/ability/effects/UnattachEffect.java index 0b0e81a7f9e..d70af3567f2 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/UnattachEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/UnattachEffect.java @@ -33,7 +33,7 @@ public class UnattachEffect extends SpellAbilityEffect { //AbilityFactoryAttach.handleUnattachAura(cardToUnattach, c, gainControl); } else if (cardToUnattach.isAttachment()) { if (cardToUnattach.isAttachedToEntity()) { - cardToUnattach.unattachFromEntity(cardToUnattach.getAttachingEntity()); + cardToUnattach.unattachFromEntity(cardToUnattach.getEntityAttachedTo()); } } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ZoneExchangeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ZoneExchangeEffect.java index 07201c35835..387481adfd8 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ZoneExchangeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ZoneExchangeEffect.java @@ -77,7 +77,7 @@ public class ZoneExchangeEffect extends SpellAbilityEffect { Card c = null; if (type != null && type.equals("Aura") && object1.getEnchantingCard() != null) { c = object1.getEnchantingCard(); - if (!c.canBeAttachedBy(object2)) { + if (!c.canBeTargetedByAttachment(object2)) { return; } } diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index cd76d3cdd20..6b2555cf8cd 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -103,7 +103,7 @@ public class Card extends GameEntity implements Comparable { // if this card is attached or linked to something, what card is it currently attached to private Card encoding, cloneOrigin, haunting, effectSource, pairedWith, meldedWith; - private GameEntity attachingEntity = null; + private GameEntity entityAttachedTo = null; private GameEntity mustAttackEntity = null; private GameEntity mustAttackEntityThisTurn = null; @@ -2598,10 +2598,10 @@ public class Card extends GameEntity implements Comparable { return CardLists.count(attachedCards, CardPredicates.Presets.EQUIPMENT) > 0; } public final boolean isEquippedBy(Card c) { - return this.isAttachedByCard(c); + return this.hasCardAttachment(c); } public final boolean isEquippedBy(final String cardName) { - return this.isAttachedByCard(cardName); + return this.hasCardAttachment(cardName); } public final CardCollectionView getFortifiedBy() { @@ -2621,11 +2621,11 @@ public class Card extends GameEntity implements Comparable { } public final boolean isFortifiedBy(Card c) { // 301.5e + 301.6 - return isAttachedByCard(c); + return hasCardAttachment(c); } public final Card getEquipping() { - return this.getAttachingCard(); + return this.getAttachedTo(); } public final boolean isEquipping() { return this.isAttachedToEntity(); @@ -2663,36 +2663,36 @@ public class Card extends GameEntity implements Comparable { } } - public final GameEntity getAttachingEntity() { - return attachingEntity; + public final GameEntity getEntityAttachedTo() { + return entityAttachedTo; } - public final void setAttachingEntity(final GameEntity e) { - if (attachingEntity == e) { return; } - attachingEntity = e; - view.updateAttaching(this); + public final void setEntityAttachedTo(final GameEntity e) { + if (entityAttachedTo == e) { return; } + entityAttachedTo = e; + view.updateAttachedTo(this); } - public final void removeAttaching(final GameEntity e) { - if (attachingEntity == e) { - setAttachingEntity(null); + public final void removeAttachedTo(final GameEntity e) { + if (entityAttachedTo == e) { + setEntityAttachedTo(null); } } public final boolean isAttachedToEntity() { - return attachingEntity != null; + return entityAttachedTo != null; } - public final Card getAttachingCard() { - if (attachingEntity instanceof Card) { - return (Card) attachingEntity; + public final Card getAttachedTo() { + if (entityAttachedTo instanceof Card) { + return (Card) entityAttachedTo; } return null; } public final Card getEnchantingCard() { - return getAttachingCard(); + return getAttachedTo(); } - public final Player getAttachingPlayer() { - if (attachingEntity instanceof Player) { - return (Player) attachingEntity; + public final Player getPlayerAttachedTo() { + if (entityAttachedTo instanceof Player) { + return (Player) entityAttachedTo; } return null; } @@ -2704,13 +2704,13 @@ public class Card extends GameEntity implements Comparable { } public final void attachToEntity(final GameEntity entity) { - if (!entity.canBeAttachedBy(this)) { + if (!entity.canBeTargetedByAttachment(this)) { return; } GameEntity oldTarget = null; if (isAttachedToEntity()) { - oldTarget = getAttachingEntity(); + oldTarget = getEntityAttachedTo(); // If attempting to reattach to the same object, don't do anything. if (oldTarget.equals(entity)) { return; @@ -2719,7 +2719,7 @@ public class Card extends GameEntity implements Comparable { } // They use double links... it's doubtful - setAttachingEntity(entity); + setEntityAttachedTo(entity); setTimestamp(getGame().getNextTimestamp()); entity.addAttachedCard(this); @@ -2735,11 +2735,11 @@ public class Card extends GameEntity implements Comparable { } public final void unattachFromEntity(final GameEntity entity) { - if (attachingEntity == null || !attachingEntity.equals(entity)) { + if (entityAttachedTo == null || !entityAttachedTo.equals(entity)) { return; } - setAttachingEntity(null); + setEntityAttachedTo(null); entity.removeAttachedCard(this); // Handle Bestowed Aura part @@ -3833,7 +3833,7 @@ public class Card extends GameEntity implements Comparable { setDirectlyPhasedOut(direct); } - if (isAttachedByCards()) { + if (hasCardAttachments()) { for (final Card eq : getAttachedCards()) { if (eq.isPhasedOut() == phasingIn) { eq.phase(false); @@ -5196,16 +5196,16 @@ public class Card extends GameEntity implements Comparable { } /* (non-Javadoc) - * @see forge.game.GameEntity#canBeAttachedBy(forge.game.card.Card, boolean) + * @see forge.game.GameEntity#canBeTargetedByAttachment(forge.game.card.Card, boolean) */ @Override - public boolean canBeAttachedBy(Card attach, boolean checkSBA) { + public boolean canBeTargetedByAttachment(Card attach, boolean checkSBA) { // phase check there if (isPhasedOut() && !attach.isPhasedOut()) { return false; } - return super.canBeAttachedBy(attach, checkSBA); + return super.canBeTargetedByAttachment(attach, checkSBA); } public FCollectionView getReplacementEffects() { diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index a3080b08925..2f9114b4143 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -93,7 +93,7 @@ public class CardFactory { // this's necessary for forge.game.GameAction.unattachCardLeavingBattlefield(Card) out.setAttachedCards(in.getAttachedCards()); - out.setAttachingEntity(in.getAttachingEntity()); + out.setEntityAttachedTo(in.getEntityAttachedTo()); out.setClones(in.getClones()); out.setCastSA(in.getCastSA()); diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index d544aea59f6..88150d20f27 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -1526,7 +1526,7 @@ public class CardFactoryUtil { // Count$InTargetedHand (targeted player's cards in hand) if (sq[0].contains("InEnchantedHand")) { - GameEntity o = c.getAttachingEntity(); + GameEntity o = c.getEntityAttachedTo(); Player controller = null; if (o instanceof Card) { controller = ((Card) o).getController(); @@ -1539,7 +1539,7 @@ public class CardFactoryUtil { } } if (sq[0].contains("InEnchantedYard")) { - GameEntity o = c.getAttachingEntity(); + GameEntity o = c.getEntityAttachedTo(); Player controller = null; if (o instanceof Card) { controller = ((Card) o).getController(); diff --git a/forge-game/src/main/java/forge/game/card/CardPredicates.java b/forge-game/src/main/java/forge/game/card/CardPredicates.java index 829856dda24..623b046d2da 100644 --- a/forge-game/src/main/java/forge/game/card/CardPredicates.java +++ b/forge-game/src/main/java/forge/game/card/CardPredicates.java @@ -216,11 +216,11 @@ public final class CardPredicates { }; }; - public static final Predicate canBeAttachedBy(final Card aura) { + public static final Predicate canBeTargetedByAttachment(final Card aura) { return new Predicate() { @Override public boolean apply(final Card c) { - return c.canBeAttachedBy(aura); + return c.canBeTargetedByAttachment(aura); } }; }; diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index 8dc3dda80e7..0a5a45fccb5 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -175,7 +175,7 @@ public class CardProperty { } } else if (property.startsWith("EnchantedPlayer")) { Player p = property.endsWith("Ctrl") ? controller : card.getOwner(); - final Object o = source.getAttachingEntity(); + final Object o = source.getEntityAttachedTo(); if (o instanceof Player) { if (!p.equals(o)) { return false; @@ -185,7 +185,7 @@ public class CardProperty { } } else if (property.startsWith("EnchantedController")) { Player p = property.endsWith("Ctrl") ? controller : card.getOwner(); - final Object o = source.getAttachingEntity(); + final Object o = source.getEntityAttachedTo(); if (o instanceof Card) { if (!p.equals(((Card) o).getController())) { return false; @@ -401,11 +401,11 @@ public class CardProperty { return false; } } else if (property.startsWith("AttachedBy")) { - if (!card.isAttachedByCard(source)) { + if (!card.hasCardAttachment(source)) { return false; } } else if (property.equals("Attached")) { - if (!source.isAttachedByCard(card)) { + if (!source.hasCardAttachment(card)) { return false; } } else if (property.startsWith("AttachedTo")) { @@ -416,7 +416,7 @@ public class CardProperty { final SpellAbility sa = t.getTriggeredSA(); final CardCollectionView cards = AbilityUtils.getDefinedCards(source, "Targeted", sa); for (final Card c : cards) { - if (card.getEquipping() != c && !c.equals(card.getAttachingEntity())) { + if (card.getEquipping() != c && !c.equals(card.getEntityAttachedTo())) { return false; } } @@ -425,7 +425,7 @@ public class CardProperty { for (final SpellAbility sa : source.getCurrentState().getNonManaAbilities()) { final CardCollectionView cards = AbilityUtils.getDefinedCards(source, "Targeted", sa); for (final Card c : cards) { - if (card.getEquipping() == c || c.equals(card.getAttachingEntity())) { // handle multiple targets + if (card.getEquipping() == c || c.equals(card.getEntityAttachedTo())) { // handle multiple targets return true; } } @@ -433,22 +433,22 @@ public class CardProperty { return false; } } else { - if ((card.getAttachingEntity() == null || !card.getAttachingEntity().isValid(restriction, sourceController, source, spellAbility))) { + if ((card.getEntityAttachedTo() == null || !card.getEntityAttachedTo().isValid(restriction, sourceController, source, spellAbility))) { return false; } } } else if (property.equals("NameNotEnchantingEnchantedPlayer")) { - Player enchantedPlayer = source.getAttachingPlayer(); + Player enchantedPlayer = source.getPlayerAttachedTo(); if (enchantedPlayer == null || enchantedPlayer.isEnchantedBy(card.getName())) { return false; } } else if (property.equals("NotAttachedTo")) { - if (source.isAttachedByCard(card)) { + if (source.hasCardAttachment(card)) { return false; } } else if (property.startsWith("EnchantedBy")) { if (property.equals("EnchantedBy")) { - if (!card.isEnchantedBy(source) && !card.equals(source.getAttachingEntity())) { + if (!card.isEnchantedBy(source) && !card.equals(source.getEntityAttachedTo())) { return false; } } else { @@ -456,7 +456,7 @@ public class CardProperty { switch (restriction) { case "Imprinted": for (final Card c : source.getImprintedCards()) { - if (!card.isEnchantedBy(c) && !card.equals(c.getAttachingEntity())) { + if (!card.isEnchantedBy(c) && !card.equals(c.getEntityAttachedTo())) { return false; } } @@ -466,7 +466,7 @@ public class CardProperty { final SpellAbility saTargeting = sa.getSATargetingCard(); if (saTargeting != null) { for (final Card c : saTargeting.getTargets().getTargetCards()) { - if (!card.isEnchantedBy(c) && !card.equals(c.getAttachingEntity())) { + if (!card.isEnchantedBy(c) && !card.equals(c.getEntityAttachedTo())) { return false; } } @@ -500,18 +500,18 @@ public class CardProperty { } } } else if (property.startsWith("Enchanted")) { - if (!source.equals(card.getAttachingEntity())) { + if (!source.equals(card.getEntityAttachedTo())) { return false; } } else if (property.startsWith("CanEnchant")) { final String restriction = property.substring(10); if (restriction.equals("Remembered")) { for (final Object rem : source.getRemembered()) { - if (!(rem instanceof Card) || !((Card) rem).canBeAttachedBy(card)) + if (!(rem instanceof Card) || !((Card) rem).canBeTargetedByAttachment(card)) return false; } } else if (restriction.equals("Source")) { - if (!source.canBeAttachedBy(card)) return false; + if (!source.canBeTargetedByAttachment(card)) return false; } } else if (property.startsWith("CanBeEnchantedBy")) { if (property.substring(16).equals("Targeted")) { @@ -519,7 +519,7 @@ public class CardProperty { final SpellAbility saTargeting = sa.getSATargetingCard(); if (saTargeting != null) { for (final Card c : saTargeting.getTargets().getTargetCards()) { - if (!card.canBeAttachedBy(c)) { + if (!card.canBeTargetedByAttachment(c)) { return false; } } @@ -529,13 +529,13 @@ public class CardProperty { for (final Object rem : source.getRemembered()) { if (rem instanceof Card) { final Card c = (Card) rem; - if (!card.canBeAttachedBy(c)) { + if (!card.canBeTargetedByAttachment(c)) { return false; } } } } else { - if (!card.canBeAttachedBy(source)) { + if (!card.canBeTargetedByAttachment(source)) { return false; } } @@ -545,7 +545,7 @@ public class CardProperty { final SpellAbility saTargeting = sa.getSATargetingCard(); if (saTargeting != null) { for (final Card c : saTargeting.getTargets().getTargetCards()) { - if (!card.isAttachedByCard(c)) { + if (!card.hasCardAttachment(c)) { return false; } } @@ -553,29 +553,29 @@ public class CardProperty { } } else if (property.substring(10).equals("Enchanted")) { if (source.getEnchantingCard() == null || - !card.isAttachedByCard(source.getEnchantingCard())) { + !card.hasCardAttachment(source.getEnchantingCard())) { return false; } } else { - if (!card.isAttachedByCard(source)) { + if (!card.hasCardAttachment(source)) { return false; } } } else if (property.startsWith("FortifiedBy")) { - if (!card.isAttachedByCard(source)) { + if (!card.hasCardAttachment(source)) { return false; } } else if (property.startsWith("CanBeAttachedBy")) { - if (!card.canBeAttachedBy(source)) { + if (!card.canBeTargetedByAttachment(source)) { return false; } } else if (property.startsWith("Equipped")) { - if (!source.isAttachedByCard(card)) { + if (!source.hasCardAttachment(card)) { return false; } } else if (property.startsWith("Fortified")) { // FIXME TODO what property has this? - if (!source.isAttachedByCard(card)) { + if (!source.hasCardAttachment(card)) { return false; } } else if (property.startsWith("HauntedBy")) { 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 548358664ae..d63834e9ffe 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -266,7 +266,7 @@ public final class CardUtil { newCopy.getDamageHistory().setCreatureGotBlockedThisTurn(in.getDamageHistory().getCreatureGotBlockedThisTurn()); newCopy.setAttachedCards(in.getAttachedCards()); - newCopy.setAttachingEntity(in.getAttachingEntity()); + newCopy.setEntityAttachedTo(in.getEntityAttachedTo()); newCopy.setClones(in.getClones()); newCopy.setHaunting(in.getHaunting()); diff --git a/forge-game/src/main/java/forge/game/card/CardView.java b/forge-game/src/main/java/forge/game/card/CardView.java index 3c2519d9136..4da63486f80 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -442,22 +442,22 @@ public class CardView extends GameEntityView { return get(TrackableProperty.EncodedCards); } - public GameEntityView getAttachingEntity() { - return get(TrackableProperty.AttachingEntity); + public GameEntityView getEntityAttachedTo() { + return get(TrackableProperty.EntityAttachedTo); } - void updateAttaching(Card c) { - set(TrackableProperty.AttachingEntity, GameEntityView.get(c.getAttachingEntity())); + void updateAttachedTo(Card c) { + set(TrackableProperty.EntityAttachedTo, GameEntityView.get(c.getEntityAttachedTo())); } - public CardView getAttachingCard() { - GameEntityView enchanting = getAttachingEntity(); + public CardView getAttachedTo() { + GameEntityView enchanting = getEntityAttachedTo(); if (enchanting instanceof CardView) { return (CardView) enchanting; } return null; } - public PlayerView getAttachingPlayer() { - GameEntityView enchanting = getAttachingEntity(); + public PlayerView getEnchantedPlayer() { + GameEntityView enchanting = getEntityAttachedTo(); if (enchanting instanceof PlayerView) { return (PlayerView) enchanting; } diff --git a/forge-game/src/main/java/forge/game/cost/CostUnattach.java b/forge-game/src/main/java/forge/game/cost/CostUnattach.java index dbb9bab6118..fb33a53ebf3 100644 --- a/forge-game/src/main/java/forge/game/cost/CostUnattach.java +++ b/forge-game/src/main/java/forge/game/cost/CostUnattach.java @@ -116,7 +116,7 @@ public class CostUnattach extends CostPartWithList { */ @Override protected Card doPayment(SpellAbility ability, Card targetCard) { - targetCard.unattachFromEntity(targetCard.getAttachingEntity()); + targetCard.unattachFromEntity(targetCard.getEntityAttachedTo()); return targetCard; } diff --git a/forge-game/src/main/java/forge/game/phase/Untap.java b/forge-game/src/main/java/forge/game/phase/Untap.java index 0ed7990fc3e..7c3106b9364 100644 --- a/forge-game/src/main/java/forge/game/phase/Untap.java +++ b/forge-game/src/main/java/forge/game/phase/Untap.java @@ -271,7 +271,7 @@ public class Untap extends Phase { // 702.23g If an object would simultaneously phase out directly // and indirectly, it just phases out indirectly. if (c.isAura() || c.isFortification()) { - final Card ent = c.getAttachingCard(); + final Card ent = c.getAttachedTo(); if (ent != null && list.contains(ent)) { continue; } diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index c9bd1056aa1..9494b1136c7 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -684,7 +684,7 @@ public class Player extends GameEntity implements Comparable { restDamage *= 2; } } else if (c.getName().equals("Curse of Bloodletting")) { - if (c.getAttachingEntity().equals(this)) { + if (c.getEntityAttachedTo().equals(this)) { restDamage *= 2; } } else if (c.getName().equals("Gisela, Blade of Goldnight")) { @@ -2098,7 +2098,7 @@ public class Player extends GameEntity implements Comparable { return false; } } else if (incR[0].equals("EnchantedController")) { - final GameEntity enchanted = source.getAttachingEntity(); + final GameEntity enchanted = source.getEntityAttachedTo(); if ((enchanted == null) || !(enchanted instanceof Card)) { return false; } diff --git a/forge-game/src/main/java/forge/trackable/TrackableProperty.java b/forge-game/src/main/java/forge/trackable/TrackableProperty.java index a8d05db057a..53672257efb 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableProperty.java +++ b/forge-game/src/main/java/forge/trackable/TrackableProperty.java @@ -43,7 +43,7 @@ public enum TrackableProperty { NamedCard(TrackableTypes.StringType), PlayerMayLook(TrackableTypes.PlayerViewCollectionType, FreezeMode.IgnoresFreeze), PlayerMayLookTemp(TrackableTypes.PlayerViewCollectionType, FreezeMode.IgnoresFreeze), - AttachingEntity(TrackableTypes.GameEntityViewType), + EntityAttachedTo(TrackableTypes.GameEntityViewType), EncodedCards(TrackableTypes.CardViewCollectionType), GainControlTargets(TrackableTypes.CardViewCollectionType), CloneOrigin(TrackableTypes.CardViewType), diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java b/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java index 34b7fe0e0dd..c726449d79b 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java @@ -404,18 +404,18 @@ public class TargetingOverlay { return; //don't add arcs for cards if card already visualized } - final CardView attaching = c.getAttachingCard(); - final Iterable attachedBy = c.getAttachedCards(); + final CardView attachedTo = c.getAttachedTo(); + final Iterable attachedCards = c.getAttachedCards(); final CardView paired = c.getPairedWith(); - if (null != attaching) { - if (attaching.getController() != null && !attaching.getController().equals(c.getController())) { - addArc(endpoints.get(attaching.getId()), endpoints.get(c.getId()), ArcConnection.Friends); - cardsVisualized.add(attaching); + if (null != attachedTo) { + if (attachedTo.getController() != null && !attachedTo.getController().equals(c.getController())) { + addArc(endpoints.get(attachedTo.getId()), endpoints.get(c.getId()), ArcConnection.Friends); + cardsVisualized.add(attachedTo); } } - if (null != attachedBy) { - for (final CardView enc : attachedBy) { + if (null != attachedCards) { + for (final CardView enc : attachedCards) { if (enc.getController() != null && !enc.getController().equals(c.getController())) { addArc(endpoints.get(c.getId()), endpoints.get(enc.getId()), ArcConnection.Friends); cardsVisualized.add(enc); diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/PlayArea.java b/forge-gui-desktop/src/main/java/forge/view/arcane/PlayArea.java index e0a03bb2794..0cecda66dd1 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/PlayArea.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/PlayArea.java @@ -106,7 +106,7 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen final CardStack stack = allLands.get(i); final CardPanel firstPanel = stack.get(0); if (firstPanel.getCard().getCurrentState().getName().equals(state.getName())) { - if (!firstPanel.getAttachedPanels().isEmpty() || firstPanel.getCard().isAttachedByCards()) { + if (!firstPanel.getAttachedPanels().isEmpty() || firstPanel.getCard().hasCardAttachments()) { // Put this land to the left of lands with the same name // and attachments. insertIndex = i; @@ -114,7 +114,7 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen } if (!panel.getAttachedPanels().isEmpty() || !panel.getCard().hasSameCounters(firstPanel.getCard()) - || firstPanel.getCard().isAttachedByCards() || (stack.size() == this.landStackMax)) { + || firstPanel.getCard().hasCardAttachments() || (stack.size() == this.landStackMax)) { // If this land has attachments or the stack is full, // put it to the right. insertIndex = i + 1; @@ -683,7 +683,7 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen } toPanel.getAttachedPanels().clear(); - if (card.isAttachedByCards()) { + if (card.hasCardAttachments()) { final Iterable enchants = card.getAttachedCards(); for (final CardView e : enchants) { final CardPanel cardE = getCardPanel(e.getId()); @@ -698,8 +698,8 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen } CardPanel attachedToPanel; - if (card.getAttachingCard() != null) { - attachedToPanel = getCardPanel(card.getAttachingCard().getId()); + if (card.getAttachedTo() != null) { + attachedToPanel = getCardPanel(card.getAttachedTo().getId()); } else { attachedToPanel = null; 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 a7b96e9705e..afe72a09fc3 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 @@ -1378,7 +1378,7 @@ public class GameSimulatorTest extends SimulationTestCase { lifelink.attachToEntity(bear); assertTrue(bear.isEnchanted()); - assertTrue(bear.isAttachedByCard(lifelink)); + assertTrue(bear.hasCardAttachment(lifelink)); // this adds Artifact Type addCardToZone("Mycosynth Lattice", p, ZoneType.Battlefield); @@ -1416,7 +1416,7 @@ public class GameSimulatorTest extends SimulationTestCase { curse.attachToEntity(p); game.getAction().checkStateEffects(true); assertTrue(p.isEnchanted()); - assertTrue(p.isAttachedByCard(curse)); + assertTrue(p.hasCardAttachment(curse)); // this adds Artifact Type addCardToZone("Mycosynth Lattice", p, ZoneType.Battlefield); @@ -1453,7 +1453,7 @@ public class GameSimulatorTest extends SimulationTestCase { assertFalse(fortification.isEquipment()); assertTrue(mountain.isFortified()); - assertTrue(mountain.isAttachedByCard(fortification)); + assertTrue(mountain.hasCardAttachment(fortification)); assertTrue(mountain.hasKeyword(Keyword.INDESTRUCTIBLE)); // adding Brawl will cause the Fortification into Equipment and it to @@ -1464,7 +1464,7 @@ public class GameSimulatorTest extends SimulationTestCase { assertFalse(fortification.isFortification()); assertTrue(fortification.isEquipment()); - assertFalse(mountain.isAttachedByCard(fortification)); + assertFalse(mountain.hasCardAttachment(fortification)); assertFalse(mountain.hasKeyword(Keyword.INDESTRUCTIBLE)); } @@ -1486,7 +1486,7 @@ public class GameSimulatorTest extends SimulationTestCase { assertTrue(dryad.isFortified()); assertFalse(dryad.isEquipped()); - assertTrue(dryad.isAttachedByCard(fortification)); + assertTrue(dryad.hasCardAttachment(fortification)); assertTrue(dryad.hasKeyword(Keyword.INDESTRUCTIBLE)); // adding Brawl will cause the Fortification into Equipment @@ -1498,7 +1498,7 @@ public class GameSimulatorTest extends SimulationTestCase { assertFalse(dryad.isFortified()); assertTrue(dryad.isEquipped()); - assertTrue(dryad.isAttachedByCard(fortification)); + assertTrue(dryad.hasCardAttachment(fortification)); assertTrue(dryad.hasKeyword(Keyword.INDESTRUCTIBLE)); } diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java index d13703433f5..7231071a260 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java @@ -104,7 +104,7 @@ public class GameWrapper { if( card.getTarget() != null ) { Card target = CardSpecificationHandler.INSTANCE.find( game, card.getTarget() ); if (actualCard.isAttachment()) { - if (target.canBeAttachedBy(actualCard)) { + if (target.canBeTargetedByAttachment(actualCard)) { actualCard.attachToEntity(target); } else { throw new IllegalStateException( actualCard + " can't attach to " + target ); diff --git a/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java b/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java index 7c3a3ca1eaa..fb26aaccf8e 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java @@ -279,8 +279,8 @@ public abstract class VCardDisplayArea extends VDisplayArea implements ActivateH attachedPanels.clear(); - if (card.isAttached()) { - final Iterable enchants = card.getAttachedBy(); + if (card.hasCardAttachments()) { + final Iterable enchants = card.getAttachedCards(); for (final CardView e : enchants) { final CardAreaPanel cardE = CardAreaPanel.get(e); if (cardE != null) { @@ -289,8 +289,8 @@ public abstract class VCardDisplayArea extends VDisplayArea implements ActivateH } } - if (card.getAttachingCard() != null) { - setAttachedToPanel(CardAreaPanel.get(card.getAttachingCard())); + if (card.getAttachedTo() != null) { + setAttachedToPanel(CardAreaPanel.get(card.getAttachedTo())); } else { setAttachedToPanel(null); diff --git a/forge-gui-mobile/src/forge/screens/match/views/VField.java b/forge-gui-mobile/src/forge/screens/match/views/VField.java index 4c7d6482307..b4aabc6c657 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VField.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VField.java @@ -99,7 +99,7 @@ public class VField extends FContainer { }; private boolean tryStackCard(CardView card, List cardsOfType) { - if (card.isAttachedByCards()) { + if (card.hasCardAttachments()) { return false; //can stack with enchanted or equipped card } if (card.getCurrentState().isCreature() && !card.isToken()) { @@ -107,7 +107,7 @@ public class VField extends FContainer { } final String cardName = card.getCurrentState().getName(); for (CardView c : cardsOfType) { - if (!c.isAttachedByCards() && + if (!c.hasCardAttachments() && cardName.equals(c.getCurrentState().getName()) && card.hasSameCounters(c) && card.isToken() == c.isToken()) { //don't stack tokens on top of non-tokens diff --git a/forge-gui/res/puzzle/INQ02.pzl b/forge-gui/res/puzzle/INQ02.pzl index 3a94554ac86..a4f7a8280c8 100644 --- a/forge-gui/res/puzzle/INQ02.pzl +++ b/forge-gui/res/puzzle/INQ02.pzl @@ -14,7 +14,7 @@ activephase=CLEANUP humanhand=Copy Enchantment;Peel from Reality;Shinen of Fear's Chill;Dimir Aqueduct humanlibrary=Dream Leash humangraveyard= -humanbattlefield=Blood Funnel;Cyclopean Snare;Dimir Doppelganger|Id:14;Followed Footsteps|Attaching:14;Halcyon Glaze;Heartstone;Mindleech Mass;Spawnbroker;Dimir Aqueduct;Dimir Aqueduct;Dimir Aqueduct;Dimir Aqueduct;Island;Island;Island;Island +humanbattlefield=Blood Funnel;Cyclopean Snare;Dimir Doppelganger|Id:14;Followed Footsteps|AttachedTo:14;Halcyon Glaze;Heartstone;Mindleech Mass;Spawnbroker;Dimir Aqueduct;Dimir Aqueduct;Dimir Aqueduct;Dimir Aqueduct;Island;Island;Island;Island humanexile= humancommand= aihand= diff --git a/forge-gui/res/puzzle/PC_020816.pzl b/forge-gui/res/puzzle/PC_020816.pzl index 47b63e315c6..10c73721489 100644 --- a/forge-gui/res/puzzle/PC_020816.pzl +++ b/forge-gui/res/puzzle/PC_020816.pzl @@ -13,8 +13,8 @@ AILife=11 humanhand= humangraveyard=Soul Snare; Zektar Shrine Expedition; Call to Arms; Pursuit of Knowledge; Seal of Fire; humanlibrary=Fell the Mighty -humanbattlefield=Mountain|Set:C15; Mountain|Set:C15; Mountain|Set:C15; Mountain|Set:C15; Plains|Set:C15; Plains|Set:C15; Plains|Set:C15; Plains|Set:C15; Plains|Set:C15; Boros Garrison; Temple of Triumph; Perilous Myr; Circle of Flame; Battle Strain; Burning Earth; Blockbuster|Id:420; Starfield of Nyx; Cage of Hands|Attaching:422; -aibattlefield=Island|Set:C15; Island|Tapped|Set:C15; Island|Tapped|Set:C15; Island|Tapped|Set:C15; Swamp|Tapped|Set:C15; Swamp|Tapped|Set:C15; Swamp|Tapped|Set:C15; Piranha Marsh; Underground Sea; Dismal Backwater; Radiant Fountain; Vampire Nighthawk|Id:422; Fallowsage; Whirlwind Adept; Air Servant; Argentum Armor; Greel's Caress|Attaching:420; +humanbattlefield=Mountain|Set:C15; Mountain|Set:C15; Mountain|Set:C15; Mountain|Set:C15; Plains|Set:C15; Plains|Set:C15; Plains|Set:C15; Plains|Set:C15; Plains|Set:C15; Boros Garrison; Temple of Triumph; Perilous Myr; Circle of Flame; Battle Strain; Burning Earth; Blockbuster|Id:420; Starfield of Nyx; Cage of Hands|AttachedTo:422; +aibattlefield=Island|Set:C15; Island|Tapped|Set:C15; Island|Tapped|Set:C15; Island|Tapped|Set:C15; Swamp|Tapped|Set:C15; Swamp|Tapped|Set:C15; Swamp|Tapped|Set:C15; Piranha Marsh; Underground Sea; Dismal Backwater; Radiant Fountain; Vampire Nighthawk|Id:422; Fallowsage; Whirlwind Adept; Air Servant; Argentum Armor; Greel's Caress|AttachedTo:420; aigraveyard= ailibrary= aiexile= diff --git a/forge-gui/res/puzzle/PC_033115.pzl b/forge-gui/res/puzzle/PC_033115.pzl index ebda4712946..eafaa7df959 100644 --- a/forge-gui/res/puzzle/PC_033115.pzl +++ b/forge-gui/res/puzzle/PC_033115.pzl @@ -11,5 +11,5 @@ ActivePhase=Main1 HumanLife=4 AILife=4 humanhand=Glaring Aegis|Set:DTK; Jeskai Barricade|Set:FRF; Epic Confrontation|Set:DTK; Dromoka's Gift|Set:DTK -humanbattlefield=Forest|Set:DTK; Forest|Set:DTK; Forest|Set:DTK; Forest|Set:DTK; Plains|Set:DTK; Plains|Set:DTK; Plains|Set:DTK; Plains|Set:DTK; Plains|Set:DTK; Lightwalker|Set:DTK; Dragon-Scarred Bear|Set:DTK; Abzan Skycaptain|Set:FRF|Tapped|Id:420; Battlefront Krushok|Set:FRF; Ambush Krotiq|Set:FRF; Dromoka Monument|Set:DTK; Stormrider Rig|Attaching:420|Set:DTK +humanbattlefield=Forest|Set:DTK; Forest|Set:DTK; Forest|Set:DTK; Forest|Set:DTK; Plains|Set:DTK; Plains|Set:DTK; Plains|Set:DTK; Plains|Set:DTK; Plains|Set:DTK; Lightwalker|Set:DTK; Dragon-Scarred Bear|Set:DTK; Abzan Skycaptain|Set:FRF|Tapped|Id:420; Battlefront Krushok|Set:FRF; Ambush Krotiq|Set:FRF; Dromoka Monument|Set:DTK; Stormrider Rig|AttachedTo:420|Set:DTK aibattlefield=Plains|Set:DTK|Tapped; Plains|Set:DTK|Tapped; Plains|Set:DTK|Tapped; Island|Set:DTK|Tapped; Island|Set:DTK|Tapped; Island|Set:DTK|Tapped; Island|Set:DTK|Tapped; Dromoka Dunecaster|Set:DTK; Territorial Roc|Set:DTK; Orator of Ojutai|Set:DTK; Updraft Elemental|Set:DTK; Ancient Carp|Set:DTK; Strongarm Monk|Set:DTK; Ojutai, Soul of Winter|Set:FRF; Cunning Breezedancer|Tapped|Set:DTK diff --git a/forge-gui/res/puzzle/PC_040715.pzl b/forge-gui/res/puzzle/PC_040715.pzl index 318222cc7a3..00e80ff4299 100644 --- a/forge-gui/res/puzzle/PC_040715.pzl +++ b/forge-gui/res/puzzle/PC_040715.pzl @@ -14,4 +14,4 @@ humanhand=Mountain|Set:DTK; Collateral Damage|Set:FRF; Twin Bolt|Set:DTK; Gravep humangraveyard=Gurmag Angler|Set:FRF; Atarka Efreet|Set:DTK humanlibrary=Mountain|Set:DTK humanbattlefield=Swamp|Set:DTK; Swamp|Set:DTK; Swamp|Set:DTK; Swamp|Set:DTK; Mountain|Set:DTK; Mountain|Set:DTK; Mountain|Set:DTK; Shambling Goblin|Set:DTK; Kolaghan Stormsinger|Counters:P1P1=1|Set:DTK; Qarsi High Priest|Set:FRF; Qal Sisma Behemoth|Id:420|Set:DTK; Deadly Wanderings|Set:DTK -aibattlefield=Pacifism|Set:DTK|Attaching:420|Set:DTK; Forest|Set:DTK|Tapped; Forest|Set:DTK|Tapped; Forest|Set:DTK|Tapped; Forest|Set:DTK|Tapped; Plains|Set:DTK|Tapped; Plains|Set:DTK|Tapped; Blossoming Sands|Tapped|Set:FRF; Glade Watcher|Set:DTK; Champion of Arashin|Set:DTK; Segmented Krotiq|Counters:P1P1=1|Set:DTK; Segmented Krotiq|Counters:P1P1=1|Tapped|Set:DTK +aibattlefield=Pacifism|Set:DTK|AttachedTo:420|Set:DTK; Forest|Set:DTK|Tapped; Forest|Set:DTK|Tapped; Forest|Set:DTK|Tapped; Forest|Set:DTK|Tapped; Plains|Set:DTK|Tapped; Plains|Set:DTK|Tapped; Blossoming Sands|Tapped|Set:FRF; Glade Watcher|Set:DTK; Champion of Arashin|Set:DTK; Segmented Krotiq|Counters:P1P1=1|Set:DTK; Segmented Krotiq|Counters:P1P1=1|Tapped|Set:DTK diff --git a/forge-gui/res/puzzle/PC_042815.pzl b/forge-gui/res/puzzle/PC_042815.pzl index 4d0ff5410d2..91720e8484c 100644 --- a/forge-gui/res/puzzle/PC_042815.pzl +++ b/forge-gui/res/puzzle/PC_042815.pzl @@ -15,7 +15,7 @@ humanhand=Sidisi's Faithful|Set:DTK; Sudden Reclamation|Set:FRF; Trap Essence|Se humangraveyard=Servant of the Scale|Set:DTK; Naturalize|Set:DTK; Savage Punch|Set:KTK; Sultai Skullkeeper|Set:FRF; Bathe in Dragonfire|Set:FRF; Write into Being|Set:FRF humanlibrary=Windstorm|Set:KTK humanbattlefield=Island|Set:DTK; Island|Set:DTK; Island|Set:DTK; Mountain|Set:DTK; Mountain|Set:DTK; Forest|Set:DTK; Forest|Set:DTK; Rugged Highlands|Set:FRF; Whisperer of the Wilds|Set:FRF; Heir of the Wilds|Set:KTK; Roar of Challenge|Set:KTK|FaceDown; Den Protector|Set:DTK|FaceDown; Herdchaser Dragon|Set:DTK; Briber's Purse|Set:KTK -aibattlefield=t:Dragon,P:4,T:4,Cost:no cost,Color:R,Types:Creature-Dragon,Keywords:Flying,Image:r_4_4_dragon_dtk|Id:420; t:Dragon,P:4,T:4,Cost:no cost,Color:R,Types:Creature-Dragon,Keywords:Flying,Image:r_4_4_dragon_dtk|Id:421; t:Dragon,P:4,T:4,Cost:no cost,Color:R,Types:Creature-Dragon,Keywords:Flying,Image:r_4_4_dragon_dtk|Id:422; t:Dragon,P:4,T:4,Cost:no cost,Color:R,Types:Creature-Dragon,Keywords:Flying,Image:r_4_4_dragon_dtk|Id:423; Sultai Runemark|Attaching:424|Set:FRF; Herdchaser Dragon|Set:DTK|Counters:P1P1=1|Id:424; Plains|Set:DTK|Tapped; Island|Set:DTK|Tapped; Swamp|Set:DTK|Tapped; Mountain|Set:DTK|Tapped; Mountain|Set:DTK|Tapped; Forest|Set:DTK|Tapped; Forest|Set:DTK|Tapped; Scoured Barrens|Set:KTK|Tapped; Swiftwater Cliffs|Set:FRF|Tapped; Thornwood Falls|Set:FRF|Tapped +aibattlefield=t:Dragon,P:4,T:4,Cost:no cost,Color:R,Types:Creature-Dragon,Keywords:Flying,Image:r_4_4_dragon_dtk|Id:420; t:Dragon,P:4,T:4,Cost:no cost,Color:R,Types:Creature-Dragon,Keywords:Flying,Image:r_4_4_dragon_dtk|Id:421; t:Dragon,P:4,T:4,Cost:no cost,Color:R,Types:Creature-Dragon,Keywords:Flying,Image:r_4_4_dragon_dtk|Id:422; t:Dragon,P:4,T:4,Cost:no cost,Color:R,Types:Creature-Dragon,Keywords:Flying,Image:r_4_4_dragon_dtk|Id:423; Sultai Runemark|AttachedTo:424|Set:FRF; Herdchaser Dragon|Set:DTK|Counters:P1P1=1|Id:424; Plains|Set:DTK|Tapped; Island|Set:DTK|Tapped; Swamp|Set:DTK|Tapped; Mountain|Set:DTK|Tapped; Mountain|Set:DTK|Tapped; Forest|Set:DTK|Tapped; Forest|Set:DTK|Tapped; Scoured Barrens|Set:KTK|Tapped; Swiftwater Cliffs|Set:FRF|Tapped; Thornwood Falls|Set:FRF|Tapped aihand= aigraveyard= ailibrary= diff --git a/forge-gui/res/puzzle/PC_051215.pzl b/forge-gui/res/puzzle/PC_051215.pzl index 58f333ceaa6..f0e25352f93 100644 --- a/forge-gui/res/puzzle/PC_051215.pzl +++ b/forge-gui/res/puzzle/PC_051215.pzl @@ -14,6 +14,6 @@ humanhand=Provoke|Set:TPR; Needle Storm|Set:TPR; Tranquility|Set:TPR; Legerdemai humanbattlefield=Forest|Set:TPR; Forest|Set:TPR; Forest|Set:TPR; Forest|Set:TPR; Forest|Set:TPR; Forest|Set:TPR; Island|Set:TPR; Island|Set:TPR; Island|Set:TPR; Island|Set:TPR; Island|Set:TPR; Wind Dancer|Set:TPR; Rootwater Hunter|Set:TPR; Telethopter|Set:TPR; Thalakos Drifters|Set:TPR humangraveyard= humanlibrary=Island|Set:TPR; Forest|Set:TPR -aibattlefield=Plains|Tapped|Set:TPR; Plains|Tapped|Set:TPR; Plains|Tapped|Set:TPR; Plains|Tapped|Set:TPR; Island|Tapped|Set:TPR; Island|Tapped|Set:TPR; Island|Tapped|Set:TPR; Island|Tapped|Set:TPR; Armored Pegasus|Set:TPR; Soltari Priest|Set:TPR; Horned Turtle|Set:TPR; Thalakos Scout|Set:TPR; Wayward Soul|Id:420|Tapped|Set:TPR; Sea Monster|Tapped|Set:TPR; Conviction|Attaching:420|Set:TPR; +aibattlefield=Plains|Tapped|Set:TPR; Plains|Tapped|Set:TPR; Plains|Tapped|Set:TPR; Plains|Tapped|Set:TPR; Island|Tapped|Set:TPR; Island|Tapped|Set:TPR; Island|Tapped|Set:TPR; Island|Tapped|Set:TPR; Armored Pegasus|Set:TPR; Soltari Priest|Set:TPR; Horned Turtle|Set:TPR; Thalakos Scout|Set:TPR; Wayward Soul|Id:420|Tapped|Set:TPR; Sea Monster|Tapped|Set:TPR; Conviction|AttachedTo:420|Set:TPR; aigraveyard= ailibrary=Shadow Rift|Set:TPR; Repentance|Set:TPR diff --git a/forge-gui/res/puzzle/PC_051915.pzl b/forge-gui/res/puzzle/PC_051915.pzl index 243e61211a3..379bb7e0e76 100644 --- a/forge-gui/res/puzzle/PC_051915.pzl +++ b/forge-gui/res/puzzle/PC_051915.pzl @@ -14,6 +14,6 @@ humanhand=Flayer Husk; Darksteel Axe; Nameless Inversion humanbattlefield=Plains|Set:CHK; Plains|Set:CHK; Plains|Set:CHK; Plains|Set:CHK; Swamp|Set:CHK; Swamp|Set:CHK; Swamp|Set:CHK; Kor Duelist; Scavenger Drake; Moonlit Strider; Copper Carapace humangraveyard=Thief of Hope humanlibrary= -aibattlefield=Mountain|Set:ZEN|Tapped; Mountain|Set:ZEN|Tapped; Mountain|Set:ZEN|Tapped; Mountain|Set:ZEN|Tapped; Forest|Set:ZEN|Tapped; Forest|Set:ZEN|Tapped; Forest|Set:ZEN|Tapped; Forest|Set:ZEN|Tapped; Bloodshot Trainee; Kozilek's Predator|Id:420; Kitesail|Attaching:420; Gorehorn Minotaurs|Counters:P1P1=2; Kavu Primarch|Counters:P1P1=4|Tapped +aibattlefield=Mountain|Set:ZEN|Tapped; Mountain|Set:ZEN|Tapped; Mountain|Set:ZEN|Tapped; Mountain|Set:ZEN|Tapped; Forest|Set:ZEN|Tapped; Forest|Set:ZEN|Tapped; Forest|Set:ZEN|Tapped; Forest|Set:ZEN|Tapped; Bloodshot Trainee; Kozilek's Predator|Id:420; Kitesail|AttachedTo:420; Gorehorn Minotaurs|Counters:P1P1=2; Kavu Primarch|Counters:P1P1=4|Tapped aigraveyard= ailibrary= diff --git a/forge-gui/res/puzzle/PC_052615.pzl b/forge-gui/res/puzzle/PC_052615.pzl index 4123f203f02..a1aef243e7c 100644 --- a/forge-gui/res/puzzle/PC_052615.pzl +++ b/forge-gui/res/puzzle/PC_052615.pzl @@ -11,7 +11,7 @@ ActivePhase=Main2 HumanLife=1 AILife=5 humanhand=Burst of Energy; Last Breath; Victimize; Spinning Darkness -humanbattlefield=Plains|Set:ZEN; Plains|Set:ZEN; Plains|Set:ZEN; Plains|Set:ZEN|Tapped; Swamp|Set:ZEN; Swamp|Set:ZEN|Tapped; Sengir Bats|Id:421|Damage:2; Necromancer's Magemark|Attaching:421; Mosquito Guard|Id:422|Damage:2; Krovikan Fetish|Attaching:422; Kithkin Spellduster|Damage:2; Archdemon of Greed|Tapped|Transformed|Damage:2; Soul Net; Aeolipile +humanbattlefield=Plains|Set:ZEN; Plains|Set:ZEN; Plains|Set:ZEN; Plains|Set:ZEN|Tapped; Swamp|Set:ZEN; Swamp|Set:ZEN|Tapped; Sengir Bats|Id:421|Damage:2; Necromancer's Magemark|AttachedTo:421; Mosquito Guard|Id:422|Damage:2; Krovikan Fetish|AttachedTo:422; Kithkin Spellduster|Damage:2; Archdemon of Greed|Tapped|Transformed|Damage:2; Soul Net; Aeolipile humangraveyard=Venerable Monk; Flickering Spirit humanlibrary=Soul Net aihand=Evincar's Justice diff --git a/forge-gui/res/puzzle/PC_060215.pzl b/forge-gui/res/puzzle/PC_060215.pzl index cce9d3c561e..8f1be936b26 100644 --- a/forge-gui/res/puzzle/PC_060215.pzl +++ b/forge-gui/res/puzzle/PC_060215.pzl @@ -14,6 +14,6 @@ humanhand=Blades of Velis Vel|Set:MM2; Smash to Smithereens|Set:MM2; Thrive|Set: humanbattlefield=Island|Set:M15; Island|Set:M15; Mountain|Set:M15; Mountain|Set:M15; Mountain|Set:M15; Forest|Set:M15; Forest|Set:M15; Forest|Set:M15; Forest|Set:M15; Noble Hierarch|Set:MM2; Thrummingbird|Set:MM2; Smokebraider|Set:MM2; Soulbright Flamekin|Set:MM2; Vigean Graftmage|Set:MM2|Counters:P1P1=2; Bloodshot Trainee|Set:MM2 humangraveyard= humanlibrary= -aibattlefield=Mountain|Set:M15|Tapped; Mountain|Set:M15|Tapped; Mountain|Set:M15|Tapped; Plains|Set:M15|Tapped; Plains|Set:M15|Tapped; Plains|Set:M15|Tapped; Plains|Set:M15|Tapped; Boros Garrison|Set:MM2|Tapped; Goblin Fireslinger|Set:MM2; Skyhunter Skirmisher|Set|MM2|Tapped|Id:420; Goblin War Paint|Set:MM2|Attaching:420; Taj-Nar Swordsmith|Set:MM2|Id:421; Sickleslicer|Set:MM2|Attaching:421; Conclave Phalanx|Set:MM2; Iona, Shield of Emeria|Set:MM2|ChosenColor:red +aibattlefield=Mountain|Set:M15|Tapped; Mountain|Set:M15|Tapped; Mountain|Set:M15|Tapped; Plains|Set:M15|Tapped; Plains|Set:M15|Tapped; Plains|Set:M15|Tapped; Plains|Set:M15|Tapped; Boros Garrison|Set:MM2|Tapped; Goblin Fireslinger|Set:MM2; Skyhunter Skirmisher|Set|MM2|Tapped|Id:420; Goblin War Paint|Set:MM2|AttachedTo:420; Taj-Nar Swordsmith|Set:MM2|Id:421; Sickleslicer|Set:MM2|AttachedTo:421; Conclave Phalanx|Set:MM2; Iona, Shield of Emeria|Set:MM2|ChosenColor:red aigraveyard= ailibrary= diff --git a/forge-gui/res/puzzle/PC_060915.pzl b/forge-gui/res/puzzle/PC_060915.pzl index 7955e2e0878..fb3dc4a309f 100644 --- a/forge-gui/res/puzzle/PC_060915.pzl +++ b/forge-gui/res/puzzle/PC_060915.pzl @@ -11,7 +11,7 @@ ActivePhase=Main1 HumanLife=9 AILife=6 humanhand=Mountain|Set:M15; Bone Splinters|Set:MM2; Brute Force|Set:MM2; Stormblood Berserker|Set:MM2; Goblin War Paint|Set:MM2; Chimeric Mass|Set:MM2 -humanbattlefield=Swamp|Set:M15; Swamp|Set:M15; Mountain|Set:M15; Mountain|Set:M15|Tapped; Rakdos Carnarium; Mortarpod|Attaching:420|Set:MM2; t:Germ,P:0,T:0,Cost:no cost,Color:B,Types:Creature-Germ,Keywords:,Image:b_0_0_germ|Id:420; Sickle Ripper|Set:MM2; Necroskitter|Set:MM2 +humanbattlefield=Swamp|Set:M15; Swamp|Set:M15; Mountain|Set:M15; Mountain|Set:M15|Tapped; Rakdos Carnarium; Mortarpod|AttachedTo:420|Set:MM2; t:Germ,P:0,T:0,Cost:no cost,Color:B,Types:Creature-Germ,Keywords:,Image:b_0_0_germ|Id:420; Sickle Ripper|Set:MM2; Necroskitter|Set:MM2 humangraveyard= humanlibrary= diff --git a/forge-gui/res/puzzle/PC_062315.pzl b/forge-gui/res/puzzle/PC_062315.pzl index 425fe822e87..c9df2b27158 100644 --- a/forge-gui/res/puzzle/PC_062315.pzl +++ b/forge-gui/res/puzzle/PC_062315.pzl @@ -11,7 +11,7 @@ ActivePhase=Main1 HumanLife=2 AILife=6 humanhand=Dismal Backwater|Set:FRF; Evolving Wilds|Set:DTK; Despise|Set:KTK; Grave Strength|Set:FRF; Rite of Undoing|Set:FRF; Set Adrift|Set:KTK -humanbattlefield=Island|Set:DTK; Island|Set:DTK; Island|Set:DTK; Island|Set:DTK; Swamp|Set:DTK; Swamp|Set:DTK; Swamp|Set:DTK; Swamp|Set:DTK; Qarsi Sadist|Set:DTK; Heart-Piercer Bow|Set:KTK; Illusory Gains|Set:DTK|Attaching:420 +humanbattlefield=Island|Set:DTK; Island|Set:DTK; Island|Set:DTK; Island|Set:DTK; Swamp|Set:DTK; Swamp|Set:DTK; Swamp|Set:DTK; Swamp|Set:DTK; Qarsi Sadist|Set:DTK; Heart-Piercer Bow|Set:KTK; Illusory Gains|Set:DTK|AttachedTo:420 humangraveyard=Douse in Gloom|Set:FRF; Treasure Cruise|Set:KTK humanlibrary= aihand=Sprinting Warbrute|Set:DTK diff --git a/forge-gui/res/puzzle/PC_063015.pzl b/forge-gui/res/puzzle/PC_063015.pzl index a6dd1b5d066..fc6fe418540 100644 --- a/forge-gui/res/puzzle/PC_063015.pzl +++ b/forge-gui/res/puzzle/PC_063015.pzl @@ -14,7 +14,7 @@ humanhand=Emerald Charm; Hornet Sting; Mercy Killing; Pouncing Wurm; Argothian W humanbattlefield=Forest|Set:ZEN; Forest|Set:ZEN; Forest|Set:ZEN; Forest|Set:ZEN; Forest|Set:ZEN; Mistveil Plains; Sunpetal Grove; Pelakka Wurm|Id:420; Novablast Wurm; Symbiotic Wurm; Cream of the Crop; Urza's Incubator|ChosenType:Wurm; Jar of Eyeballs; Heartbeat of Spring humangraveyard=Ravaging Riftwurm humanlibrary=Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN;Forest|Set:ZEN -aibattlefield=Plains|Set:ZEN|Tapped; Plains|Set:ZEN|Tapped; Plains|Set:ZEN|Tapped; Plains|Set:ZEN|Tapped; Swamp|Set:ZEN; Swamp|Set:ZEN|Tapped; Swamp|Set:ZEN|Tapped; Swamp|Set:ZEN|Tapped; Pillory of the Sleepless|Attaching:420; t:Soldier,P:1,T:1,Cost:no cost,Color:W,Types:Creature-Soldier,Keywords:,Image:w_1_1_soldier_m13; t:Soldier,P:1,T:1,Cost:no cost,Color:W,Types:Creature-Soldier,Keywords:,Image:w_1_1_soldier_m13; Pentarch Ward|ChosenColor:white|Attaching:422; Peacekeeper|Id:422; Seizan, Perverter of Truth; Mobilization; Baneful Omen +aibattlefield=Plains|Set:ZEN|Tapped; Plains|Set:ZEN|Tapped; Plains|Set:ZEN|Tapped; Plains|Set:ZEN|Tapped; Swamp|Set:ZEN; Swamp|Set:ZEN|Tapped; Swamp|Set:ZEN|Tapped; Swamp|Set:ZEN|Tapped; Pillory of the Sleepless|AttachedTo:420; t:Soldier,P:1,T:1,Cost:no cost,Color:W,Types:Creature-Soldier,Keywords:,Image:w_1_1_soldier_m13; t:Soldier,P:1,T:1,Cost:no cost,Color:W,Types:Creature-Soldier,Keywords:,Image:w_1_1_soldier_m13; Pentarch Ward|ChosenColor:white|AttachedTo:422; Peacekeeper|Id:422; Seizan, Perverter of Truth; Mobilization; Baneful Omen aihand= aigraveyard= ailibrary=Debt to the Deathless diff --git a/forge-gui/res/puzzle/PC_070715.pzl b/forge-gui/res/puzzle/PC_070715.pzl index 25f15356870..0c6366fe9f8 100644 --- a/forge-gui/res/puzzle/PC_070715.pzl +++ b/forge-gui/res/puzzle/PC_070715.pzl @@ -14,7 +14,7 @@ humanhand=Kitesail|Set:MM2; Wings of Velis Vel|Set:MM2; Nameless Inversion|Set:M humanbattlefield=Island|Set:M15; Island|Set:M15; Swamp|Set:M15; Swamp|Set:M15; Swamp|Set:M15; Darksteel Citadel|Set:MM2; Plagued Rusalka|Set:MM2; Alloy Myr|Set:MM2; Cathodion|Set:MM2; Thief of Hope|Set:MM2; Rusted Relic|Set:MM2|Id:420 humangraveyard= humanlibrary= -aibattlefield=Forest|Set:M15; Forest|Set:M15|Tapped; Forest|Set:M15|Tapped; Forest|Set:M15|Tapped; Forest|Set:M15|Tapped; Plains|Set:M15|Tapped; Plains|Set:M15|Tapped; Plains|Set:M15|Tapped; Plains|Set:M15|Tapped; Arrest|Set:MM2|Attaching:420; t:Eldrazi Spawn,P:0,T:1,Cost:no cost,Types:Creature-Eldrazi-Spawn,Keywords:,Image:c_0_1_eldrazi_spawn3; Aquastrand Spider|Set:MM2|Counters:P1P1=1; Algae Gharial|Set:MM2; Precursor Golem|Set:MM2|Counters:P1P1=1; Flayer Husk|Set:MM2|Attaching:422; t:Golem,P:3,T:3,Cost:no cost,Types:Artifact-Creature-Golem,Keywords:,Image:c_3_3_golem|Id:422; Copper Carapace|Set:MM2|Attaching:424; Battlegrace Angel|Set:MM2|Id:424|Tapped +aibattlefield=Forest|Set:M15; Forest|Set:M15|Tapped; Forest|Set:M15|Tapped; Forest|Set:M15|Tapped; Forest|Set:M15|Tapped; Plains|Set:M15|Tapped; Plains|Set:M15|Tapped; Plains|Set:M15|Tapped; Plains|Set:M15|Tapped; Arrest|Set:MM2|AttachedTo:420; t:Eldrazi Spawn,P:0,T:1,Cost:no cost,Types:Creature-Eldrazi-Spawn,Keywords:,Image:c_0_1_eldrazi_spawn3; Aquastrand Spider|Set:MM2|Counters:P1P1=1; Algae Gharial|Set:MM2; Precursor Golem|Set:MM2|Counters:P1P1=1; Flayer Husk|Set:MM2|AttachedTo:422; t:Golem,P:3,T:3,Cost:no cost,Types:Artifact-Creature-Golem,Keywords:,Image:c_3_3_golem|Id:422; Copper Carapace|Set:MM2|AttachedTo:424; Battlegrace Angel|Set:MM2|Id:424|Tapped aihand= aigraveyard= ailibrary= diff --git a/forge-gui/res/puzzle/PC_071415.pzl b/forge-gui/res/puzzle/PC_071415.pzl index 4e7b9c082d5..3a5eca8cdfc 100644 --- a/forge-gui/res/puzzle/PC_071415.pzl +++ b/forge-gui/res/puzzle/PC_071415.pzl @@ -13,7 +13,7 @@ AILife=13 humanhand=Might of the Masses|Set:ORI; Reclaim|Set:ORI; Subterranean Scout|Set:ORI humangraveyard=Timberpack Wolf|Set:ORI; Titanic Growth|Set:ORI; Act of Treason|Set:ORI; Chandra's Fury|Set:ORI humanlibrary= -humanbattlefield=Mountain|Set:ORI; Mountain|Set:ORI; Mountain|Set:ORI; Forest|Set:ORI; Forest|Set:ORI; Forest|Set:ORI; Bellows Lizard|Set:ORI; Valeron Wardens|Set:ORI; Akroan Sergeant|Set:ORI; Call of the Full Moon|Set:ORI|Attaching:420; Llanowar Empath|Set:ORI|Id:420 +humanbattlefield=Mountain|Set:ORI; Mountain|Set:ORI; Mountain|Set:ORI; Forest|Set:ORI; Forest|Set:ORI; Forest|Set:ORI; Bellows Lizard|Set:ORI; Valeron Wardens|Set:ORI; Akroan Sergeant|Set:ORI; Call of the Full Moon|Set:ORI|AttachedTo:420; Llanowar Empath|Set:ORI|Id:420 aibattlefield=Plains|Set:ORI; Plains|Set:ORI; Plains|Set:ORI|Tapped; Island|Set:ORI; Island|Set:ORI; Island|Set:ORI|Tapped; Island|Set:ORI|Tapped; Anointer of Champions|Set:ORI|Tapped; Maritime Guard|Set:ORI; Ampryn Tactician|Set:ORI; Ringwarden Owl|Set:ORI|Tapped; Heavy Infantry|Set:ORI aihand= aigraveyard= diff --git a/forge-gui/res/puzzle/PC_072115.pzl b/forge-gui/res/puzzle/PC_072115.pzl index 7fd164670e7..28951a814f0 100644 --- a/forge-gui/res/puzzle/PC_072115.pzl +++ b/forge-gui/res/puzzle/PC_072115.pzl @@ -13,8 +13,8 @@ AILife=9 humanhand=Touch of Moonglove|Set:ORI; Celestial Flare|Set:ORI humangraveyard=Fetid Imp|Set:ORI; Fleshbag Marauder|Set:ORI; Eyeblight Assassin|Set:ORI; Blood-Cursed Knight|Set:ORI humanlibrary=Plains|Set:ORI; -humanbattlefield=Plains|Set:ORI; Plains|Set:ORI; Plains|Set:ORI|Tapped; Plains|Set:ORI|Tapped; Swamp|Set:ORI; Swamp|Set:ORI|Tapped; Swamp|Set:ORI|Tapped; Swamp|Set:ORI|Tapped; Anointer of Champions|Set:ORI; Topan Freeblade|Set:ORI|Counters:P1P1=1|Renowned; Guardian Automaton|Set:ORI; Undead Servant|Set:ORI; Murder Investigation|Set:ORI|Attaching:421; Catacomb Slug|Set:ORI|Id:421; Revenant|Set:ORI; Valor in Akros|Set:ORI -aibattlefield=Forest|Set:ORI; Forest|Set:ORI|Tapped; Forest|Set:ORI|Tapped; Forest|Set:ORI|Tapped; Plains|Set:ORI; Plains|Set:ORI|Tapped; Plains|Set:ORI|Tapped; Plains|Set:ORI|Tapped; Consul's Lieutenant|Set:ORI|Attacking|Tapped; Knightly Valor|Set:ORI|Attaching:420; Charging Griffin|Set:ORI|Id:420|Attacking; t:Knight,P:2,T:2,Cost:no cost,Color:W,Types:Creature-Knight,Keywords:Vigilance,Image:w_2_2_knight_rtr|Attacking; Rhox Maulers|Set:ORI|Counters:P1P1=2|Renowned|Attacking|Tapped; Skysnare Spider|Set:ORI|Attacking +humanbattlefield=Plains|Set:ORI; Plains|Set:ORI; Plains|Set:ORI|Tapped; Plains|Set:ORI|Tapped; Swamp|Set:ORI; Swamp|Set:ORI|Tapped; Swamp|Set:ORI|Tapped; Swamp|Set:ORI|Tapped; Anointer of Champions|Set:ORI; Topan Freeblade|Set:ORI|Counters:P1P1=1|Renowned; Guardian Automaton|Set:ORI; Undead Servant|Set:ORI; Murder Investigation|Set:ORI|AttachedTo:421; Catacomb Slug|Set:ORI|Id:421; Revenant|Set:ORI; Valor in Akros|Set:ORI +aibattlefield=Forest|Set:ORI; Forest|Set:ORI|Tapped; Forest|Set:ORI|Tapped; Forest|Set:ORI|Tapped; Plains|Set:ORI; Plains|Set:ORI|Tapped; Plains|Set:ORI|Tapped; Plains|Set:ORI|Tapped; Consul's Lieutenant|Set:ORI|Attacking|Tapped; Knightly Valor|Set:ORI|AttachedTo:420; Charging Griffin|Set:ORI|Id:420|Attacking; t:Knight,P:2,T:2,Cost:no cost,Color:W,Types:Creature-Knight,Keywords:Vigilance,Image:w_2_2_knight_rtr|Attacking; Rhox Maulers|Set:ORI|Counters:P1P1=2|Renowned|Attacking|Tapped; Skysnare Spider|Set:ORI|Attacking aiprecast=Joraga Invocation aihand= aigraveyard=Joraga Invocation|Set:ORI diff --git a/forge-gui/res/puzzle/PC_072815.pzl b/forge-gui/res/puzzle/PC_072815.pzl index 6b0e89e6b73..b768d76d993 100644 --- a/forge-gui/res/puzzle/PC_072815.pzl +++ b/forge-gui/res/puzzle/PC_072815.pzl @@ -13,7 +13,7 @@ AILife=12 humanhand=Island|Set:ORI; Rogue's Passage|Set:ORI; Bonded Construct|Set:ORI; Disperse|Set:ORI; Calculated Dismissal|Set:ORI; Tormented Thoughts|Set:ORI; Rabid Bloodsucker|Set:ORI; Necromantic Summons|Set:ORI humangraveyard= humanlibrary= -humanbattlefield=Mage-Ring Network|Counters:STORAGE=4; Island|Set:ORI; Island|Set:ORI; Island|Set:ORI; Island|Set:ORI; Swamp|Set:ORI; Swamp|Set:ORI; Swamp|Set:ORI; Claustrophobia|Set:ORI|Attaching:420; Nantuko Husk|Set:ORI|Tapped|Id:420; Whirler Rogue|Set:ORI; Willbreaker|Set:ORI; Deep-Sea Terror|Set:ORI; Alchemist's Vial|Set:ORI; t:Thopter,P:1,T:1,Cost:no cost,Types:Artifact-Creature-Thopter,Keywords:Flying,Image:c_1_1_thopter_ori +humanbattlefield=Mage-Ring Network|Counters:STORAGE=4; Island|Set:ORI; Island|Set:ORI; Island|Set:ORI; Island|Set:ORI; Swamp|Set:ORI; Swamp|Set:ORI; Swamp|Set:ORI; Claustrophobia|Set:ORI|AttachedTo:420; Nantuko Husk|Set:ORI|Tapped|Id:420; Whirler Rogue|Set:ORI; Willbreaker|Set:ORI; Deep-Sea Terror|Set:ORI; Alchemist's Vial|Set:ORI; t:Thopter,P:1,T:1,Cost:no cost,Types:Artifact-Creature-Thopter,Keywords:Flying,Image:c_1_1_thopter_ori aibattlefield=Island|Set:ORI|Tapped; Island|Set:ORI|Tapped; Island|Set:ORI|Tapped; Island|Set:ORI|Tapped; Mountain|Set:ORI|Tapped; Mountain|Set:ORI|Tapped; Mountain|Set:ORI|Tapped; Mountain|Set:ORI|Tapped; Mountain|Set:ORI|Tapped; Subterranean Scout|Set:ORI; Watercourser|Set:ORI; Thopter Engineer|Set:ORI; Guardian Automaton|Set:ORI; Reclusive Artificer|Set:ORI; Gold-Forged Sentinel|Set:ORI|Tapped aihand=Island; Island; Island; Island; Island; Island; Island aigraveyard= diff --git a/forge-gui/res/puzzle/PC_081115.pzl b/forge-gui/res/puzzle/PC_081115.pzl index 94e63fc5361..ffc80904fca 100644 --- a/forge-gui/res/puzzle/PC_081115.pzl +++ b/forge-gui/res/puzzle/PC_081115.pzl @@ -14,7 +14,7 @@ humanhand=Noxious Revival; Pit Fight; Briarhorn humangraveyard= humanlibrary=Wayfarer's Bauble humanbattlefield=Mountain|Set:ORI; Mountain|Set:ORI; Mountain|Set:ORI; Mountain|Set:ORI; Forest|Set:ORI; Forest|Set:ORI|Tapped; Raging Ravine; Yavimaya Hollow; Sunflare Shaman; Generator Servant; Grinning Ignus; Flame-Kin War Scout; Flame Elemental; Cytoplast Root-Kin|Counters:P1P1=4; Hollowhenge Scavenger -aibattlefield=Plains|Set:ORI; Plains|Set:ORI; Plains|Set:ORI; Plains|Set:ORI; Island|Set:ORI; Island|Set:ORI; Island|Set:ORI; Wall of Glare; Wall of Denial; Moat; Indentured Djinn|Tapped; Holy Mantle|Attaching:420; Angel of Finality|Tapped|Id:420 +aibattlefield=Plains|Set:ORI; Plains|Set:ORI; Plains|Set:ORI; Plains|Set:ORI; Island|Set:ORI; Island|Set:ORI; Island|Set:ORI; Wall of Glare; Wall of Denial; Moat; Indentured Djinn|Tapped; Holy Mantle|AttachedTo:420; Angel of Finality|Tapped|Id:420 aihand= aigraveyard= ailibrary= diff --git a/forge-gui/res/puzzle/PC_081815.pzl b/forge-gui/res/puzzle/PC_081815.pzl index 347c3abfc5f..75799a82d80 100644 --- a/forge-gui/res/puzzle/PC_081815.pzl +++ b/forge-gui/res/puzzle/PC_081815.pzl @@ -13,8 +13,8 @@ AILife=5 humanhand=Stratus Walk|Set:ORI; Fiery Conclusion|Set:ORI; Helm of the Gods|Set:ORI humangraveyard= humanlibrary=Act of Treason|Set:ORI; Infectious Bloodlust|Set:ORI -humanbattlefield=Island|Set:ORI; Island|Set:ORI; Island|Set:ORI; Island|Set:ORI; Mountain|Set:ORI; Mountain|Set:ORI; Mountain|Set:ORI; Mountain|Set:ORI; Infectious Bloodlust|Set:ORI|Attaching:420; Aspiring Aeronaut|Set:ORI|Id:420; Reclusive Artificer|Set:ORI; Ghirapur Aether Grid|Set:ORI; Jayemdae Tome|Set:ORI -aibattlefield=Swamp|Set:ORI|Tapped; Swamp|Set:ORI|Tapped; Swamp|Set:ORI|Tapped; Swamp|Set:ORI|Tapped; Swamp|Set:ORI|Tapped; Forest|Set:ORI|Tapped; Forest|Set:ORI|Tapped; Forest|Set:ORI|Tapped; Forest|Set:ORI|Tapped; Forest|Set:ORI|Tapped; Forest|Set:ORI|Tapped; Forest|Set:ORI|Tapped; Mantle of Webs|Set:ORI|Attaching:421; Thornbow Archer|Set:ORI|Id:421; Dwynen's Elite|Set:ORI; Scrapskin Drake|Set:ORI|Counters:P1P1=2; Deadbridge Shaman|Set:ORI; Hitchclaw Recluse|Set:ORI +humanbattlefield=Island|Set:ORI; Island|Set:ORI; Island|Set:ORI; Island|Set:ORI; Mountain|Set:ORI; Mountain|Set:ORI; Mountain|Set:ORI; Mountain|Set:ORI; Infectious Bloodlust|Set:ORI|AttachedTo:420; Aspiring Aeronaut|Set:ORI|Id:420; Reclusive Artificer|Set:ORI; Ghirapur Aether Grid|Set:ORI; Jayemdae Tome|Set:ORI +aibattlefield=Swamp|Set:ORI|Tapped; Swamp|Set:ORI|Tapped; Swamp|Set:ORI|Tapped; Swamp|Set:ORI|Tapped; Swamp|Set:ORI|Tapped; Forest|Set:ORI|Tapped; Forest|Set:ORI|Tapped; Forest|Set:ORI|Tapped; Forest|Set:ORI|Tapped; Forest|Set:ORI|Tapped; Forest|Set:ORI|Tapped; Forest|Set:ORI|Tapped; Mantle of Webs|Set:ORI|AttachedTo:421; Thornbow Archer|Set:ORI|Id:421; Dwynen's Elite|Set:ORI; Scrapskin Drake|Set:ORI|Counters:P1P1=2; Deadbridge Shaman|Set:ORI; Hitchclaw Recluse|Set:ORI aihand= aigraveyard= ailibrary= diff --git a/forge-gui/res/puzzle/PC_082515.pzl b/forge-gui/res/puzzle/PC_082515.pzl index eed0c9d55d2..ee59f7109aa 100644 --- a/forge-gui/res/puzzle/PC_082515.pzl +++ b/forge-gui/res/puzzle/PC_082515.pzl @@ -13,7 +13,7 @@ AILife=8 humanhand=Fling; To Arms!; Warleader's Helix humangraveyard= humanlibrary= -humanbattlefield=Mountain|Set:ORI; Mountain|Set:ORI; Mountain|Set:ORI; Mountain|Set:ORI; Plains|Set:ORI; Plains|Set:ORI; Plains|Set:ORI; Plains|Set:ORI; Plains|Set:ORI; Haunted Angel|Tapped; Serra Advocate; Avenging Angel|Tapped; Basandra, Battle Seraph|Tapped; Pledge of Loyalty|Attaching:420; Twilight Shepherd|Id:420; Akroma, Angel of Fury|Tapped; Mass Hysteria +humanbattlefield=Mountain|Set:ORI; Mountain|Set:ORI; Mountain|Set:ORI; Mountain|Set:ORI; Plains|Set:ORI; Plains|Set:ORI; Plains|Set:ORI; Plains|Set:ORI; Plains|Set:ORI; Haunted Angel|Tapped; Serra Advocate; Avenging Angel|Tapped; Basandra, Battle Seraph|Tapped; Pledge of Loyalty|AttachedTo:420; Twilight Shepherd|Id:420; Akroma, Angel of Fury|Tapped; Mass Hysteria aibattlefield=Plains|Set:ORI; Plains|Set:ORI|Tapped; Plains|Set:ORI|Tapped; Plains|Set:ORI|Tapped; Island|Set:ORI; Island|Set:ORI|Tapped; Island|Set:ORI|Tapped; Island|Set:ORI|Tapped; Sejiri Refuge; Doorkeeper|Tapped; Guard Gomazoa; Guard Gomazoa; Hover Barrier; Wall of Denial; Sunweb; Meekstone; Temple Bell|Tapped; Leyline of Sanctity aihand= aigraveyard= diff --git a/forge-gui/res/puzzle/PC_090115.pzl b/forge-gui/res/puzzle/PC_090115.pzl index 5ad0472e444..febf669a545 100644 --- a/forge-gui/res/puzzle/PC_090115.pzl +++ b/forge-gui/res/puzzle/PC_090115.pzl @@ -13,8 +13,8 @@ AILife=8 humanhand=Enshrouding Mist|Set:ORI; Touch of Moonglove|Set:ORI; Grasp of the Hieromancer|Set:ORI; Auramancer|Set:ORI humangraveyard= humanlibrary=Evolving Wilds|Set:ORI; Evolving Wilds|Set:ORI; Evolving Wilds|Set:ORI; Evolving Wilds|Set:ORI; Evolving Wilds|Set:ORI; Evolving Wilds|Set:ORI -humanbattlefield=Plains|Set:ORI; Plains|Set:ORI; Plains|Set:ORI; Plains|Set:ORI; Plains|Set:ORI; Plains|Set:ORI; Swamp|Set:ORI; Swamp|Set:ORI; Swamp|Set:ORI; Swamp|Set:ORI; Swamp|Set:ORI; Bonded Construct|Set:ORI; Fleshbag Marauder|Set:ORI; Knight of the Pilgrim's Road|Set:ORI; Undead Servant|Set:ORI; Grasp of the Hieromancer|Set:ORI|Attaching:420; Blightcaster|Set:ORI|Tapped|Id:420; Kothophed, Soul Hoarder|Set:ORI; Demonic Pact|Set:ORI; Weight of the Underworld|Set:ORI|Attaching:422 -aibattlefield=Forest|Set:ORI; Forest|Set:ORI; Forest|Set:ORI|Tapped; Forest|Set:ORI|Tapped; Forest|Set:ORI|Tapped; Island|Set:ORI; Island|Set:ORI; Island|Set:ORI|Tapped; Island|Set:ORI|Tapped; Island|Set:ORI|Tapped; Island|Set:ORI|Tapped; Tower Geist|Set:ORI; Willbreaker|Set:ORI; Woodland Bellower|Id:422; Skysnare Spider|Set:ORI; Claustrophobia|Set:ORI|Attaching:420 +humanbattlefield=Plains|Set:ORI; Plains|Set:ORI; Plains|Set:ORI; Plains|Set:ORI; Plains|Set:ORI; Plains|Set:ORI; Swamp|Set:ORI; Swamp|Set:ORI; Swamp|Set:ORI; Swamp|Set:ORI; Swamp|Set:ORI; Bonded Construct|Set:ORI; Fleshbag Marauder|Set:ORI; Knight of the Pilgrim's Road|Set:ORI; Undead Servant|Set:ORI; Grasp of the Hieromancer|Set:ORI|AttachedTo:420; Blightcaster|Set:ORI|Tapped|Id:420; Kothophed, Soul Hoarder|Set:ORI; Demonic Pact|Set:ORI; Weight of the Underworld|Set:ORI|AttachedTo:422 +aibattlefield=Forest|Set:ORI; Forest|Set:ORI; Forest|Set:ORI|Tapped; Forest|Set:ORI|Tapped; Forest|Set:ORI|Tapped; Island|Set:ORI; Island|Set:ORI; Island|Set:ORI|Tapped; Island|Set:ORI|Tapped; Island|Set:ORI|Tapped; Island|Set:ORI|Tapped; Tower Geist|Set:ORI; Willbreaker|Set:ORI; Woodland Bellower|Id:422; Skysnare Spider|Set:ORI; Claustrophobia|Set:ORI|AttachedTo:420 aihand=Nivix Barrier|Set:ORI aigraveyard= ailibrary=Evolving Wilds|Set:ORI; Evolving Wilds|Set:ORI; Evolving Wilds|Set:ORI; Evolving Wilds|Set:ORI; Evolving Wilds|Set:ORI; Evolving Wilds|Set:ORI diff --git a/forge-gui/res/puzzle/PC_090815.pzl b/forge-gui/res/puzzle/PC_090815.pzl index b87cca1798e..5b6944ffe8b 100644 --- a/forge-gui/res/puzzle/PC_090815.pzl +++ b/forge-gui/res/puzzle/PC_090815.pzl @@ -13,7 +13,7 @@ AILife=6 humanhand=Blazing Torch|Set:ZEN; Wind Zendikon|Set:WWK humangraveyard= humanlibrary= -humanbattlefield=Island|Set:ZEN; Island|Set:ZEN; Mountain|Set:ZEN; Mountain|Set:ZEN; Quicksand|Set:WWK; Goblin War Paint|Set:ZEN|Attaching:420; Cunning Sparkmage|Set:WWK|Id:420; Tideforce Elemental|Set:WWK; Shatterskull Giant|Set:ZEN; Surrakar Banisher|Set:WWK +humanbattlefield=Island|Set:ZEN; Island|Set:ZEN; Mountain|Set:ZEN; Mountain|Set:ZEN; Quicksand|Set:WWK; Goblin War Paint|Set:ZEN|AttachedTo:420; Cunning Sparkmage|Set:WWK|Id:420; Tideforce Elemental|Set:WWK; Shatterskull Giant|Set:ZEN; Surrakar Banisher|Set:WWK aibattlefield=Swamp|Set:ZEN|Tapped; Swamp|Set:ZEN|Tapped; Swamp|Set:ZEN|Tapped; Swamp|Set:ZEN|Tapped; Swamp|Set:ZEN|Tapped; Swamp|Set:ZEN|Tapped; Giant Scorpion|Set:ZEN; Vampire Nighthawk|Set:ZEN; Vampire Nighthawk|Set:ZEN; Jagwasp Swarm|Set:WWK|Tapped; Crypt Ripper|Set:ZEN|Tapped aihand= aigraveyard= diff --git a/forge-gui/res/puzzle/PC_092215.pzl b/forge-gui/res/puzzle/PC_092215.pzl index 567deda31a5..bc6cd3ee562 100644 --- a/forge-gui/res/puzzle/PC_092215.pzl +++ b/forge-gui/res/puzzle/PC_092215.pzl @@ -13,8 +13,8 @@ AILife=5 humanhand= humangraveyard= humanlibrary= -humanbattlefield=Swamp|Set:ZEN; Swamp|Set:ZEN; Swamp|Set:ZEN; Swamp|Set:ZEN; Mountain|Set:ZEN; Mountain|Set:ZEN; Mountain|Set:ZEN; Mountain|Set:ZEN; Coffin Queen; Silverskin Armor|Attaching:420; Krark-Clan Stoker|Id:420; Dross Scorpion; Firemaw Kavu; Liquimetal Coating -aibattlefield=Forest|Set:ZEN|Tapped; Forest|Set:ZEN|Tapped; Forest|Set:ZEN|Tapped; Forest|Set:ZEN|Tapped; Plains|Set:ZEN|Tapped; Plains|Set:ZEN|Tapped; Plains|Set:ZEN|Tapped; Llanowar Elves|Tapped; Beacon Hawk|Tapped; Canopy Cover|Attaching:422; Scavenging Ooze|Id:422|Counters:P1P1=5|Tapped; Blessed Orator; t:Rhino,P:4,T:4,Cost:no cost,Color:G,Types:Creature-Rhino,Keywords:Trample,Image:g_4_4_rhino_rtr; t:Rhino,P:4,T:4,Cost:no cost,Color:G,Types:Creature-Rhino,Keywords:Trample,Image:g_4_4_rhino_rtr +humanbattlefield=Swamp|Set:ZEN; Swamp|Set:ZEN; Swamp|Set:ZEN; Swamp|Set:ZEN; Mountain|Set:ZEN; Mountain|Set:ZEN; Mountain|Set:ZEN; Mountain|Set:ZEN; Coffin Queen; Silverskin Armor|AttachedTo:420; Krark-Clan Stoker|Id:420; Dross Scorpion; Firemaw Kavu; Liquimetal Coating +aibattlefield=Forest|Set:ZEN|Tapped; Forest|Set:ZEN|Tapped; Forest|Set:ZEN|Tapped; Forest|Set:ZEN|Tapped; Plains|Set:ZEN|Tapped; Plains|Set:ZEN|Tapped; Plains|Set:ZEN|Tapped; Llanowar Elves|Tapped; Beacon Hawk|Tapped; Canopy Cover|AttachedTo:422; Scavenging Ooze|Id:422|Counters:P1P1=5|Tapped; Blessed Orator; t:Rhino,P:4,T:4,Cost:no cost,Color:G,Types:Creature-Rhino,Keywords:Trample,Image:g_4_4_rhino_rtr; t:Rhino,P:4,T:4,Cost:no cost,Color:G,Types:Creature-Rhino,Keywords:Trample,Image:g_4_4_rhino_rtr aihand= aigraveyard= ailibrary= diff --git a/forge-gui/res/puzzle/PC_101315.pzl b/forge-gui/res/puzzle/PC_101315.pzl index c3e84eee944..22a5765bd74 100644 --- a/forge-gui/res/puzzle/PC_101315.pzl +++ b/forge-gui/res/puzzle/PC_101315.pzl @@ -14,7 +14,7 @@ humanhand=Lithomancer's Focus|Set:BFZ; Tandem Tactics|Set:BFZ; Unnatural Aggress humangraveyard= humanlibrary= humanbattlefield=Forest|Set:BFZ; Forest|Set:BFZ; Forest|Set:BFZ; Forest|Set:BFZ; Forest|Set:BFZ; Plains|Set:BFZ; Plains|Set:BFZ; Plains|Set:BFZ; Plains|Set:BFZ; Plains|Set:BFZ; Shrine of the Forsaken Gods|Set:BFZ; Blisterpod|Set:BFZ; Fortified Rampart|Set:BFZ; Stone Haven Medic|Set:BFZ; Snapping Gnarlid|Set:BFZ; Felidar Cub|Set:BFZ; Tajuru Warcaller|Set:BFZ; Hedron Archive|Set:BFZ -aibattlefield=Swamp|Set:BFZ|Tapped; Swamp|Set:BFZ|Tapped; Swamp|Set:BFZ|Tapped; Swamp|Set:BFZ|Tapped; Swamp|Set:BFZ|Tapped; Swamp|Set:BFZ|Tapped; Mountain|Set:BFZ|Tapped; Mountain|Set:BFZ|Tapped; Mountain|Set:BFZ|Tapped; Mountain|Set:BFZ|Tapped; Mountain|Set:BFZ|Tapped; Mountain|Set:BFZ|Tapped; Mortuary Mire|Set:BFZ|Tapped; Hedron Blade|Set:BFZ|Attaching:420; Silent Skimmer|Set:BFZ|Tapped|Id:420; Skitterskin|Set:BFZ; Goblin War Paint|Set:BFZ|Attaching:422; Shatterskull Recruit|Set:BFZ|Id:422|Tapped; Endless One|Set:BFZ|Counters:P1P1=13; Mountain|Set:BFZ|Id:424; Retreat to Hagra|Set:BFZ +aibattlefield=Swamp|Set:BFZ|Tapped; Swamp|Set:BFZ|Tapped; Swamp|Set:BFZ|Tapped; Swamp|Set:BFZ|Tapped; Swamp|Set:BFZ|Tapped; Swamp|Set:BFZ|Tapped; Mountain|Set:BFZ|Tapped; Mountain|Set:BFZ|Tapped; Mountain|Set:BFZ|Tapped; Mountain|Set:BFZ|Tapped; Mountain|Set:BFZ|Tapped; Mountain|Set:BFZ|Tapped; Mortuary Mire|Set:BFZ|Tapped; Hedron Blade|Set:BFZ|AttachedTo:420; Silent Skimmer|Set:BFZ|Tapped|Id:420; Skitterskin|Set:BFZ; Goblin War Paint|Set:BFZ|AttachedTo:422; Shatterskull Recruit|Set:BFZ|Id:422|Tapped; Endless One|Set:BFZ|Counters:P1P1=13; Mountain|Set:BFZ|Id:424; Retreat to Hagra|Set:BFZ # Precast Ondu Rising with Awaken for the AI, targeting mountain - requires KW Awaken implementation # with the target for Awaken set in its first subability. aiprecast=Ondu Rising:KW#AwakenOnly->424 diff --git a/forge-gui/res/puzzle/PC_102015.pzl b/forge-gui/res/puzzle/PC_102015.pzl index f828e9f10b9..6ccb1c9b820 100644 --- a/forge-gui/res/puzzle/PC_102015.pzl +++ b/forge-gui/res/puzzle/PC_102015.pzl @@ -14,7 +14,7 @@ humanhand=Gods Willing; Mogg War Marshal; Temporal Isolation; War Flare humangraveyard= humanlibrary= humanbattlefield=Mountain|Set:MIR; Mountain|Set:MIR; Mountain|Set:MIR; Mountain|Set:MIR; Plains|Set:MIR; Plains|Set:MIR; Plains|Set:MIR; Plains|Set:MIR; Plains|Set:MIR; Mogg Fanatic; Sparksmith; Hissing Iguanar; Daring Skyjek -aibattlefield=Island|Set:MIR|Tapped; Island|Set:MIR|Tapped; Island|Set:MIR|Tapped; Island|Set:MIR|Tapped; Swamp|Set:MIR|Tapped; Swamp|Set:MIR|Tapped; Swamp|Set:MIR|Tapped; Swamp|Set:MIR|Tapped; Swamp|Set:MIR|Tapped; Halimar Wavewatch|Counters:LEVEL=2; Vulshok Morningstar|Attaching:420; Dauthi Horror|Id:420|Tapped; Dauthi Slayer; Flayer Husk|Attaching:422; Yotian Soldier|Id:422; Lotus Path Djinn; Gray Merchant of Asphodel +aibattlefield=Island|Set:MIR|Tapped; Island|Set:MIR|Tapped; Island|Set:MIR|Tapped; Island|Set:MIR|Tapped; Swamp|Set:MIR|Tapped; Swamp|Set:MIR|Tapped; Swamp|Set:MIR|Tapped; Swamp|Set:MIR|Tapped; Swamp|Set:MIR|Tapped; Halimar Wavewatch|Counters:LEVEL=2; Vulshok Morningstar|AttachedTo:420; Dauthi Horror|Id:420|Tapped; Dauthi Slayer; Flayer Husk|AttachedTo:422; Yotian Soldier|Id:422; Lotus Path Djinn; Gray Merchant of Asphodel aihand= aigraveyard= ailibrary= diff --git a/forge-gui/res/puzzle/PC_111715.pzl b/forge-gui/res/puzzle/PC_111715.pzl index 03f226a680f..d81b1211ed2 100644 --- a/forge-gui/res/puzzle/PC_111715.pzl +++ b/forge-gui/res/puzzle/PC_111715.pzl @@ -14,7 +14,7 @@ humanhand=Mutant's Prey; Remember the Fallen; Feral Contest humangraveyard=Conch Horn; Veteran Armorer; Zealous Inquisitor; Rustspore Ram humanlibrary= humanbattlefield=Mountain|Set:MRD; Forest|Set:MRD; Forest|Set:MRD; Forest|Set:MRD; Forest|Set:MRD; Plains|Set:MRD; Plains|Set:MRD; Plains|Set:MRD; Plains|Set:MRD; Gruul Turf; Frostling; Arcbound Hybrid|Counters:P1P1=2; Raven's Run Dragoon; Fangren Firstborn; Rakeclaw Gargantuan|Id:420; Ashnod's Transmogrant -aibattlefield=Island|Set:MRD; Island|Set:MRD; Island|Set:MRD; Island|Set:MRD; Island|Set:MRD; Island|Set:MRD; Island|Set:MRD|Tapped; Swamp|Set:MRD|Tapped; Swamp|Set:MRD|Tapped; Swamp|Set:MRD|Tapped; Swamp|Set:MRD|Tapped; Pin to the Earth|Attaching:420; Grafted Wargear|Attaching:422; Brood of Cockroaches|Id:422; Dream Fighter; Escaped Null; Midnight Covenant|Attaching:424; Ghost Ship|Id:424|Tapped; Scion of Glaciers +aibattlefield=Island|Set:MRD; Island|Set:MRD; Island|Set:MRD; Island|Set:MRD; Island|Set:MRD; Island|Set:MRD; Island|Set:MRD|Tapped; Swamp|Set:MRD|Tapped; Swamp|Set:MRD|Tapped; Swamp|Set:MRD|Tapped; Swamp|Set:MRD|Tapped; Pin to the Earth|AttachedTo:420; Grafted Wargear|AttachedTo:422; Brood of Cockroaches|Id:422; Dream Fighter; Escaped Null; Midnight Covenant|AttachedTo:424; Ghost Ship|Id:424|Tapped; Scion of Glaciers aihand= aigraveyard= ailibrary= diff --git a/forge-gui/res/puzzle/PC_112415.pzl b/forge-gui/res/puzzle/PC_112415.pzl index f3cb4e32fa2..81c98201364 100644 --- a/forge-gui/res/puzzle/PC_112415.pzl +++ b/forge-gui/res/puzzle/PC_112415.pzl @@ -14,7 +14,7 @@ humanhand=Sky Hussar humangraveyard=Sea Gate Oracle; Weathered Wayfarer; Azorius Guildmage; Wall of Omens humanlibrary=Plains|Set:C15; Plains|Set:C15; Plains|Set:C15; Plains|Set:C15; Plains|Set:C15; humanbattlefield=Plains|Set:C15; Plains|Set:C15; Plains|Set:C15; Plains|Set:C15; Island|Set:C15; Island|Set:C15; Island|Set:C15; Island|Set:C15; Grixis Illusionist; True Believer; Kitsune Palliator; Courtly Provocateur; Headless Skaab; Djinn of Infinite Deceits; Hot Soup -aibattlefield=Swamp|Set:C15|Tapped; Swamp|Set:C15|Tapped; Swamp|Set:C15|Tapped; Swamp|Set:C15|Tapped; Swamp|Set:C15|Tapped; Gaea's Cradle|Tapped; Quirion Ranger; Wight of Precinct Six; Plague Spitter; Tiger Claws|Attaching:420; Corpse Augur|Id:420; Thrashing Wumpus; Primeval Force|Tapped; Jungle Weaver +aibattlefield=Swamp|Set:C15|Tapped; Swamp|Set:C15|Tapped; Swamp|Set:C15|Tapped; Swamp|Set:C15|Tapped; Swamp|Set:C15|Tapped; Gaea's Cradle|Tapped; Quirion Ranger; Wight of Precinct Six; Plague Spitter; Tiger Claws|AttachedTo:420; Corpse Augur|Id:420; Thrashing Wumpus; Primeval Force|Tapped; Jungle Weaver aihand= aigraveyard=Fleshbag Marauder; Acidic Slime ailibrary=Swamp|Set:C15; Swamp|Set:C15; Swamp|Set:C15; Swamp|Set:C15; Swamp|Set:C15; Swamp|Set:C15; Swamp|Set:C15; Swamp|Set:C15; Swamp|Set:C15; Swamp|Set:C15; Swamp|Set:C15; Swamp|Set:C15; diff --git a/forge-gui/res/puzzle/PC_120815.pzl b/forge-gui/res/puzzle/PC_120815.pzl index 26eb5082750..355d3623191 100644 --- a/forge-gui/res/puzzle/PC_120815.pzl +++ b/forge-gui/res/puzzle/PC_120815.pzl @@ -14,7 +14,7 @@ humanhand=Nameless Inversion; Gigantoplasm humangraveyard=Riptide Shapeshifter; Dimir Doppelganger; Chimeric Staff humanlibrary= humanbattlefield=Island|Set:USG; Island|Set:USG; Island|Set:USG; Island|Set:USG; Island|Set:USG; Island|Set:USG; Swamp|Set:USG; Swamp|Set:USG; Swamp|Set:USG; Temple of Deceit; Reflecting Pool; Mothdust Changeling; Lazav, Dimir Mastermind|ExecuteScript:LazavCopy->420; Cairn Wanderer; Sol Ring; Urza's Incubator|ChosenType:Shapeshifter -aibattlefield=Plains|Set:USG|Tapped; Island|Set:USG|Tapped; Island|Set:USG|Tapped; Swamp|Set:USG|Tapped; Arcane Sanctum; Arcane Sanctum|Tapped; Urza's Tower|Set:8ED|Tapped; Urza's Power Plant|Set:8ED|Tapped; Urza's Power Plant|Set:8ED|Tapped; Urza's Mine|Set:8ED|Tapped; Sydri, Galvanic Genius; Sanctum Gargoyle; Shield of the Righteous|Attaching:420; Sanctum Gargoyle|Id:420; Solemn Simulacrum|Tapped; Salvage Titan|Tapped; Goblin Boom Keg; Sword of Kaldra; Spine of Ish Sah +aibattlefield=Plains|Set:USG|Tapped; Island|Set:USG|Tapped; Island|Set:USG|Tapped; Swamp|Set:USG|Tapped; Arcane Sanctum; Arcane Sanctum|Tapped; Urza's Tower|Set:8ED|Tapped; Urza's Power Plant|Set:8ED|Tapped; Urza's Power Plant|Set:8ED|Tapped; Urza's Mine|Set:8ED|Tapped; Sydri, Galvanic Genius; Sanctum Gargoyle; Shield of the Righteous|AttachedTo:420; Sanctum Gargoyle|Id:420; Solemn Simulacrum|Tapped; Salvage Titan|Tapped; Goblin Boom Keg; Sword of Kaldra; Spine of Ish Sah aihand= aigraveyard= ailibrary= diff --git a/forge-gui/res/puzzle/PC_121515.pzl b/forge-gui/res/puzzle/PC_121515.pzl index 613755e10b8..0ed82b637db 100644 --- a/forge-gui/res/puzzle/PC_121515.pzl +++ b/forge-gui/res/puzzle/PC_121515.pzl @@ -14,8 +14,8 @@ AILife=6 humanhand=Vertigo; Sacred Boon; Blaze|Set:5ED humangraveyard= humanlibrary=Hematatite Talisman -humanbattlefield=Mountain|Set:IA; Mountain|Set:IA|Tapped; Mountain|Set:IA|Tapped; Plains|Set:IA; Plains|Set:IA; Plains|Set:IA|Tapped; Snow-Covered Mountain|Set:IA; Snow-Covered Forest|Set:IA; Phyrexian War Beast; Bestial Fury|Attaching:420; Phyrexian War Beast|Tapped|Id:420; Orcish Bloodpainter; Armor of Faith|Attaching:422; Blinking Spirit|Id:422; Darien, King of Kjeldor; Hematite Talisman -aibattlefield=Swamp|Set:IA; Swamp|Set:IA|Tapped; Swamp|Set:IA|Tapped; Forest|Set:IA; Forest|Set:IA; Forest|Set:IA|Tapped; Forest|Set:IA|Tapped; Snow-Covered Island|Set:IA; Fyndhorn Elves; Lim-Dul's Cohort; Phobian Phantasm|Attacking|Tapped; Surging Might|Attaching:424; Zombie Musher|Tapped|Attacking|Id:424; Deadly Insect|Tapped|Attacking; Surging Might|Attaching:426; Gorilla Berserkers|Tapped|Attacking|Id:426 +humanbattlefield=Mountain|Set:IA; Mountain|Set:IA|Tapped; Mountain|Set:IA|Tapped; Plains|Set:IA; Plains|Set:IA; Plains|Set:IA|Tapped; Snow-Covered Mountain|Set:IA; Snow-Covered Forest|Set:IA; Phyrexian War Beast; Bestial Fury|AttachedTo:420; Phyrexian War Beast|Tapped|Id:420; Orcish Bloodpainter; Armor of Faith|AttachedTo:422; Blinking Spirit|Id:422; Darien, King of Kjeldor; Hematite Talisman +aibattlefield=Swamp|Set:IA; Swamp|Set:IA|Tapped; Swamp|Set:IA|Tapped; Forest|Set:IA; Forest|Set:IA; Forest|Set:IA|Tapped; Forest|Set:IA|Tapped; Snow-Covered Island|Set:IA; Fyndhorn Elves; Lim-Dul's Cohort; Phobian Phantasm|Attacking|Tapped; Surging Might|AttachedTo:424; Zombie Musher|Tapped|Attacking|Id:424; Deadly Insect|Tapped|Attacking; Surging Might|AttachedTo:426; Gorilla Berserkers|Tapped|Attacking|Id:426 aihand= aigraveyard= ailibrary= diff --git a/forge-gui/res/puzzle/PC_122915.pzl b/forge-gui/res/puzzle/PC_122915.pzl index 872bed8377c..3abf0e6d3f7 100644 --- a/forge-gui/res/puzzle/PC_122915.pzl +++ b/forge-gui/res/puzzle/PC_122915.pzl @@ -15,7 +15,7 @@ humangraveyard= humanlibrary= humanprecast= humanbattlefield=Plains|Set:ZEN; Plains|Set:ZEN; Plains|Set:ZEN; Island|Set:ZEN; Island|Set:ZEN; Island|Set:ZEN; Aven Riftwatcher|Counters:TIME=1; Brago, King Eternal; Heavy Infantry|Id:422; Runed Halo|NamedCard:Lightning Bolt|NoETBTrigs; Angelic Shield; Clone|ExecuteScript:DBCopy->420|NoETBTrigs -aibattlefield=Swamp|Tapped|Set:ZEN; Swamp|Tapped|Set:ZEN; Swamp|Tapped|Set:ZEN; Mountain|Set:ZEN; Mountain|Tapped|Set:ZEN; Mountain|Tapped|Set:ZEN; Volcanic Dragon|Id:420; Typhoid Rats; Skulking Fugitive; Vulshok Refugee; Mindslicer|Id:424; Accorder's Shield|Attaching:424; Torment|Attaching:422; +aibattlefield=Swamp|Tapped|Set:ZEN; Swamp|Tapped|Set:ZEN; Swamp|Tapped|Set:ZEN; Mountain|Set:ZEN; Mountain|Tapped|Set:ZEN; Mountain|Tapped|Set:ZEN; Volcanic Dragon|Id:420; Typhoid Rats; Skulking Fugitive; Vulshok Refugee; Mindslicer|Id:424; Accorder's Shield|AttachedTo:424; Torment|AttachedTo:422; aihand=Lightning Bolt; Guerrilla Tactics; Skullcrack; Pyrotechnics aigraveyard= ailibrary= diff --git a/forge-gui/res/puzzle/PC_44.pzl b/forge-gui/res/puzzle/PC_44.pzl index bf3eed6916e..2e42e7f4c8a 100644 --- a/forge-gui/res/puzzle/PC_44.pzl +++ b/forge-gui/res/puzzle/PC_44.pzl @@ -8,10 +8,10 @@ ActivePlayer=Human ActivePhase=Main1 HumanLife=1 AILife=33 -HumanPlay=Perilous Myr|Id:80; Grafted Exoskeleton|Attaching:80; Priests of Norn|Counters:M1M1=1; Mycosynth Fiend; Core Prowler|Id:6; Viridian Betrayers; Forest; Forest; Plains; Plains; Phyrexia's Core +HumanPlay=Perilous Myr|Id:80; Grafted Exoskeleton|AttachedTo:80; Priests of Norn|Counters:M1M1=1; Mycosynth Fiend; Core Prowler|Id:6; Viridian Betrayers; Forest; Forest; Plains; Plains; Phyrexia's Core HumanHand=Seize the Initiative HumanLibrary= HumanGraveyard= -AIPlay=Suture Priest|Id:83; Loxodon Wayfarer|Tapped; Mortis Dogs|Tapped; Victory's Herald|Tapped; Plains; Plains|Tapped; Plains|Tapped; Swamp; Swamp|Tapped; Swamp|Tapped; Darksteel Axe|Attaching:83; Arrest|Attaching:6 +AIPlay=Suture Priest|Id:83; Loxodon Wayfarer|Tapped; Mortis Dogs|Tapped; Victory's Herald|Tapped; Plains; Plains|Tapped; Plains|Tapped; Swamp; Swamp|Tapped; Swamp|Tapped; Darksteel Axe|AttachedTo:83; Arrest|AttachedTo:6 AIGraveyard= diff --git a/forge-gui/res/puzzle/PM03.pzl b/forge-gui/res/puzzle/PM03.pzl index 59991a8f603..61b67f35bbe 100644 --- a/forge-gui/res/puzzle/PM03.pzl +++ b/forge-gui/res/puzzle/PM03.pzl @@ -10,8 +10,8 @@ ActivePhase=Main1 HumanLife=7 AILife=5 HumanHand=Gut Shot; Karn Liberated; Noxious Revival; Phyrexian Metamorph -HumanPlay=Shrine of Boundless Growth|Counters:CHARGE=7|Id:5;Viridian Harvest|Attaching:5;Mortis Dogs|Id:7;Strider Harness|Attaching:7;Blind Zealot;Plains;Forest;Swamp;Swamp -AIPlay=Caustic Hound|Id:14;Batterskull|Attaching:14;Alpha Tyrranax;Fangren Marauder|Tapped;Soul Conduit;Forest;Forest;Forest;Mountain;Mountain;Mountain +HumanPlay=Shrine of Boundless Growth|Counters:CHARGE=7|Id:5;Viridian Harvest|AttachedTo:5;Mortis Dogs|Id:7;Strider Harness|AttachedTo:7;Blind Zealot;Plains;Forest;Swamp;Swamp +AIPlay=Caustic Hound|Id:14;Batterskull|AttachedTo:14;Alpha Tyrranax;Fangren Marauder|Tapped;Soul Conduit;Forest;Forest;Forest;Mountain;Mountain;Mountain # Ramp difficulty by changing # A) Noxious Revival => Surgical Extraction # B) Blind Zealot => Pro Artifacts, Apostle's Blessing => Your graveyard diff --git a/forge-gui/res/puzzle/PP04.pzl b/forge-gui/res/puzzle/PP04.pzl index 8b5123d3c28..5bea28fb955 100644 --- a/forge-gui/res/puzzle/PP04.pzl +++ b/forge-gui/res/puzzle/PP04.pzl @@ -10,6 +10,6 @@ ActivePhase=Main1 HumanLife=1 AILife=5 humanhand=Kor Skyfisher;Oblivion Ring;Chainer's Edict;Holy Light -humanbattlefield=Swamp;Swamp;Swamp;Plains;Plains;Plains;Plains;Plains;Thraben Inspector;Foundry Screecher;Kor Sanctifiers;Lone Missionary;Pacifism|Attaching:18 +humanbattlefield=Swamp;Swamp;Swamp;Plains;Plains;Plains;Plains;Plains;Thraben Inspector;Foundry Screecher;Kor Sanctifiers;Lone Missionary;Pacifism|AttachedTo:18 humanlibrary=Leave No Trace -aibattlefield=Aura Gnarlid|Id:18;Slippery Bogle|Id:19;Ethereal Armor|Attaching:19;Armadillo Cloak|Attaching:19;Ancestral Mask|Attaching:19;Children of Korlis +aibattlefield=Aura Gnarlid|Id:18;Slippery Bogle|Id:19;Ethereal Armor|AttachedTo:19;Armadillo Cloak|AttachedTo:19;Ancestral Mask|AttachedTo:19;Children of Korlis diff --git a/forge-gui/res/puzzle/PP05.pzl b/forge-gui/res/puzzle/PP05.pzl index b8a53a56b91..35b33674e8f 100644 --- a/forge-gui/res/puzzle/PP05.pzl +++ b/forge-gui/res/puzzle/PP05.pzl @@ -13,4 +13,4 @@ AILife=52 humanhand=Twin Bolt;Hydroblast;Borrowed Hostility;Gush humanbattlefield=Mountain;Mountain;Island;Island;Insectile Aberration|Transformed;Kiln Fiend;Nivix Cyclops humanlibrary=Brainstorm;Apostle's Blessing;Mutagenic Growth;Temur Battle Rage;Echoing Truth;Swiftwater Cliffs -aibattlefield=Gurmag Angler|Id:18|Counters:P1P0=1|Attacking;Dragon Scales|Attaching:18;Goblin Bushwhacker|Tapped|Counters:P1P0=1|Attacking;Perilous Myr|Tapped|Counters:P1P0=1|Attacking;Perilous Myr|Tapped|Counters:P1P0=1|Attacking +aibattlefield=Gurmag Angler|Id:18|Counters:P1P0=1|Attacking;Dragon Scales|AttachedTo:18;Goblin Bushwhacker|Tapped|Counters:P1P0=1|Attacking;Perilous Myr|Tapped|Counters:P1P0=1|Attacking;Perilous Myr|Tapped|Counters:P1P0=1|Attacking diff --git a/forge-gui/res/puzzle/PP09.pzl b/forge-gui/res/puzzle/PP09.pzl index 9eb85f0e477..75f466d3037 100644 --- a/forge-gui/res/puzzle/PP09.pzl +++ b/forge-gui/res/puzzle/PP09.pzl @@ -12,4 +12,4 @@ AILife=20 humanhand=Mountain;Keldon Marauders;Rites of Initiation;Giantbaiting humanbattlefield=Forest;Forest;Forest;Swamp;Swamp;Swamp;Swamp;Rugged Highlands;Rugged Highlands;Crypt Rats;Quirion Ranger;Battlefield Scrounger humangraveyard=Flame Jab;Viscera Dragger;Lava Dart -aibattlefield=Young Wolf|Id:20;Favor of the Overbeing|Attaching:20;Aura Gnarlid|Id:22;Rancor|Attaching:22;Slippery Bogle|Id:24;Lifelink|Attaching:24;Ancestral Mask|Attaching:24 +aibattlefield=Young Wolf|Id:20;Favor of the Overbeing|AttachedTo:20;Aura Gnarlid|Id:22;Rancor|AttachedTo:22;Slippery Bogle|Id:24;Lifelink|AttachedTo:24;Ancestral Mask|AttachedTo:24 diff --git a/forge-gui/res/puzzle/PP13.pzl b/forge-gui/res/puzzle/PP13.pzl index 7c12a3f0e59..366daffd07e 100644 --- a/forge-gui/res/puzzle/PP13.pzl +++ b/forge-gui/res/puzzle/PP13.pzl @@ -12,7 +12,7 @@ HumanLife=1 AILife=20 humanhand=Azorius Chancery;Ghostly Flicker;Pestermite;Explore;Sundering Vitae humanlibrary=Dream's Grip;Ghostly Flicker -humanbattlefield=Kabira Crossroads;Secluded Steppe;Island;Forest;Essence Warden|Id:12;Curse of Chains|Attaching:12;Pestermite;Quirion Ranger +humanbattlefield=Kabira Crossroads;Secluded Steppe;Island;Forest;Essence Warden|Id:12;Curse of Chains|AttachedTo:12;Pestermite;Quirion Ranger aihand=Groundswell aibattlefield=Shinen of Life's Roar;Nest Invader;Skarrgan Pit-Skulk;River Boa;Silhana Ledgewalker|Counters:P1P1=1;Tangle Golem;Elite Cat Warrior;Vault Skirge ailibrary=Forest diff --git a/forge-gui/res/puzzle/PP14.pzl b/forge-gui/res/puzzle/PP14.pzl index b939d057382..5d1b8b7805d 100644 --- a/forge-gui/res/puzzle/PP14.pzl +++ b/forge-gui/res/puzzle/PP14.pzl @@ -12,5 +12,5 @@ HumanLife=1 AILife=8 humanhand=Rites of Initiation;Smash to Smithereens;Pulse of Murasa humanlibrary=Aerial Volley;Death Spark;Lightning Bolt;Vithian Stinger -humanbattlefield=Forest|Tapped;Plains|Tapped;Mountain;Mountain;Mountain|Id:12;Unbridled Growth|Attaching:12;Auramancer;Shambling Shell;Aerie Ouphes|Id:16;Stupefying Touch|Attaching:16;Angelic Renewal -aibattlefield=Dawnfeather Eagle|Tapped|Attacking;War Falcon|Tapped|Attacking;War Falcon|Tapped|Attacking;Daru Cavalier|Tapped|Attacking;Veteran Cathar|Id:22|Attacking;Bonesplitter|Attaching:22;Lifelink|Attaching:22 +humanbattlefield=Forest|Tapped;Plains|Tapped;Mountain;Mountain;Mountain|Id:12;Unbridled Growth|AttachedTo:12;Auramancer;Shambling Shell;Aerie Ouphes|Id:16;Stupefying Touch|AttachedTo:16;Angelic Renewal +aibattlefield=Dawnfeather Eagle|Tapped|Attacking;War Falcon|Tapped|Attacking;War Falcon|Tapped|Attacking;Daru Cavalier|Tapped|Attacking;Veteran Cathar|Id:22|Attacking;Bonesplitter|AttachedTo:22;Lifelink|AttachedTo:22 diff --git a/forge-gui/res/puzzle/PP15.pzl b/forge-gui/res/puzzle/PP15.pzl index a40ed3ab8e1..61b8fa190ce 100644 --- a/forge-gui/res/puzzle/PP15.pzl +++ b/forge-gui/res/puzzle/PP15.pzl @@ -11,5 +11,5 @@ HumanLife=1 AILife=5 humanhand=Cho-Manno's Blessing;Aurora Eidolon humangraveyard=Qarsi Sadist;Agent of Shauku;Blind Hunter;Monk Realist -humanbattlefield=Swamp;Swamp;Swamp;Plains;Plains;Master of Diversion|Id:12;Lashknife|Attaching:12;Sultai Scavenger;Tortured Existence -aibattlefield=Vampiric Link|Attaching:12;Seraph of Dawn;Gurmag Angler|Id:18;Nimbus Wings|Attaching:18 \ No newline at end of file +humanbattlefield=Swamp;Swamp;Swamp;Plains;Plains;Master of Diversion|Id:12;Lashknife|AttachedTo:12;Sultai Scavenger;Tortured Existence +aibattlefield=Vampiric Link|AttachedTo:12;Seraph of Dawn;Gurmag Angler|Id:18;Nimbus Wings|AttachedTo:18 \ No newline at end of file diff --git a/forge-gui/res/puzzle/PP16.pzl b/forge-gui/res/puzzle/PP16.pzl index 02efefaf799..28431b2ae50 100644 --- a/forge-gui/res/puzzle/PP16.pzl +++ b/forge-gui/res/puzzle/PP16.pzl @@ -12,4 +12,4 @@ AILife=6 humanhand=Carrion Feeder;Faerie Macabre;Doom Blade;Rite of Consumption;Dark Dabbling humanlibrary=Gurmag Angler humanbattlefield=Swamp;Swamp;Swamp;Forest;Forest;Forest;Forest;Arrogant Wurm;Gorgon Recluse -aibattlefield=Stinkweed Imp|Id:16;Demonic Appetite|Attaching:16 \ No newline at end of file +aibattlefield=Stinkweed Imp|Id:16;Demonic Appetite|AttachedTo:16 \ No newline at end of file diff --git a/forge-gui/res/puzzle/PP17.pzl b/forge-gui/res/puzzle/PP17.pzl index 4ef68b736af..d4371c8150b 100644 --- a/forge-gui/res/puzzle/PP17.pzl +++ b/forge-gui/res/puzzle/PP17.pzl @@ -14,4 +14,4 @@ humanlibrary=Jund Hackblade;Otherworldly Journey;Kor Skyfisher;Firebolt humanbattlefield=Secluded Steppe;Forgotten Cave;Boros Garrison;Mountain;Mountain;Mountain;Foundry Street Denizen;Cerodon Yearling|Id:17 aihand=Goblin Bushwhacker;Burning-Tree Emissary;Burning-Tree Emissary;Burning-Tree Emissary;Burning-Tree Emissary;Manamorphose ailibrary=Thunderous Wrath;Mountain -aibattlefield=Greel's Caress|Attaching:17;Mountain|Tapped;Mountain|Tapped;Swamp|Tapped;Swamp|Tapped;Chittering Rats +aibattlefield=Greel's Caress|AttachedTo:17;Mountain|Tapped;Mountain|Tapped;Swamp|Tapped;Swamp|Tapped;Chittering Rats diff --git a/forge-gui/res/puzzle/PP22.pzl b/forge-gui/res/puzzle/PP22.pzl index 8740917e34d..d26c7600bce 100644 --- a/forge-gui/res/puzzle/PP22.pzl +++ b/forge-gui/res/puzzle/PP22.pzl @@ -10,5 +10,5 @@ ActivePhase=Main1 HumanLife=2 AILife=14 humanhand=Wings of Velis Vel;Ebony Charm;Shrivel;Twin Bolt -humanbattlefield=Thornbow Archer|Id:5;Crown of Suspicion|Attaching:5;Mountain;Mountain;Island;Island;Swamp;Swamp;Swamp;Plague Witch;Scarred Vinebreeder +humanbattlefield=Thornbow Archer|Id:5;Crown of Suspicion|AttachedTo:5;Mountain;Mountain;Island;Island;Swamp;Swamp;Swamp;Plague Witch;Scarred Vinebreeder aibattlefield=Slippery Bogle;Silhana Ledgewalker;t:Plant,P:0,T:1,Cost:no cost,Color:G,Types:Creature-Plant,Keywords:,Image:g_0_1_plant;Valeron Outlander diff --git a/forge-gui/res/puzzle/PP24.pzl b/forge-gui/res/puzzle/PP24.pzl index 43777408eb6..545af71c38d 100644 --- a/forge-gui/res/puzzle/PP24.pzl +++ b/forge-gui/res/puzzle/PP24.pzl @@ -10,5 +10,5 @@ ActivePhase=Main1 HumanLife=1 AILife=6 humanhand=Nourish;Pit Fight;Mutagenic Growth;Elemental Uprising -humanbattlefield=Vault Skirge|Id:5;Rancor|Attaching:5;Quirion Ranger;Skarrgan Pit-Skulk|Id:6;Bonesplitter|Attaching:6;Forest;Forest;Forest +humanbattlefield=Vault Skirge|Id:5;Rancor|AttachedTo:5;Quirion Ranger;Skarrgan Pit-Skulk|Id:6;Bonesplitter|AttachedTo:6;Forest;Forest;Forest aibattlefield=Twisted Abomination;Falkenrath Noble;Sultai Scavenger \ No newline at end of file diff --git a/forge-gui/res/puzzle/PP30.pzl b/forge-gui/res/puzzle/PP30.pzl index fbde5f5eb51..d64e1f401c8 100644 --- a/forge-gui/res/puzzle/PP30.pzl +++ b/forge-gui/res/puzzle/PP30.pzl @@ -12,4 +12,4 @@ AILife=1000 humanhand=Simic Growth Chamber;Pulse of Murasa;Freed from the Real;Crop Rotation;Hoodwink;Adventuring Gear humanlibrary=Sejiri Steppe;Saprazzan Skerry;Island;Tinder Farm humanbattlefield=Sakura-Tribe Scout;Stone-Seeder Hierophant -aibattlefield=Midnight Guard|Id:13;Presence of Gond|Attaching:13;Essence Warden;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI +aibattlefield=Midnight Guard|Id:13;Presence of Gond|AttachedTo:13;Essence Warden;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI;t:Elf Warrior,P:1,T:1,Cost:no cost,Color:G,Types:Creature-Elf-Warrior,Keywords:,Image:g_1_1_elf_warrior_ORI diff --git a/forge-gui/res/puzzle/PS_AKH5.pzl b/forge-gui/res/puzzle/PS_AKH5.pzl index 5a372d5a6bf..875f1a1d133 100644 --- a/forge-gui/res/puzzle/PS_AKH5.pzl +++ b/forge-gui/res/puzzle/PS_AKH5.pzl @@ -10,6 +10,6 @@ ActivePhase=Main1 HumanLife=20 AILife=10 humanhand=Djeru's Resolve;Disperse;Invocation of Saint Traft;True-Faith Censer;Consuming Fervor -humanbattlefield=Irrigated Farmland;Irrigated Farmland;Spirebluff Canal;Spirebluff Canal;Spirebluff Canal;Sigarda's Aid;Kari Zev, Skyship Raider|Id:420;Hedron Blade|Attaching:420;Pathmaker Initiate;Glory-Bound Initiate|Tapped +humanbattlefield=Irrigated Farmland;Irrigated Farmland;Spirebluff Canal;Spirebluff Canal;Spirebluff Canal;Sigarda's Aid;Kari Zev, Skyship Raider|Id:420;Hedron Blade|AttachedTo:420;Pathmaker Initiate;Glory-Bound Initiate|Tapped humanlibrary=Plains;Plains;Plains;Plains;Plains;Plains;Plains;Plains;Plains;Plains aibattlefield=Shimmerscale Drake;Labyrinth Guardian;Labyrinth Guardian diff --git a/forge-gui/res/puzzle/PS_AKH6.pzl b/forge-gui/res/puzzle/PS_AKH6.pzl index 3f7ae763aed..33f5e17ce31 100644 --- a/forge-gui/res/puzzle/PS_AKH6.pzl +++ b/forge-gui/res/puzzle/PS_AKH6.pzl @@ -11,5 +11,5 @@ HumanLife=20 humancounters=ENERGY=1 AILife=12 humanhand=Rhonas the Indomitable;Rhonas the Indomitable;Aviary Mechanic;Khenra Charioteer -humanbattlefield=Longtusk Cub|Id:5;Cartouche of Strength|Attaching:5;Scattered Groves;Scattered Groves;Scattered Groves;Scattered Groves;Aether Hub;Rhonas's Monument;Rhonas the Indomitable;Greenbelt Rampager +humanbattlefield=Longtusk Cub|Id:5;Cartouche of Strength|AttachedTo:5;Scattered Groves;Scattered Groves;Scattered Groves;Scattered Groves;Aether Hub;Rhonas's Monument;Rhonas the Indomitable;Greenbelt Rampager aibattlefield=Channeler Initiate;Champion of Rhonas;Naga Vitalist diff --git a/forge-gui/res/puzzle/PS_DOM0.pzl b/forge-gui/res/puzzle/PS_DOM0.pzl index 364239ff6bc..caeeeb1d5c7 100644 --- a/forge-gui/res/puzzle/PS_DOM0.pzl +++ b/forge-gui/res/puzzle/PS_DOM0.pzl @@ -12,6 +12,6 @@ turn=1 activeplayer=human activephase=MAIN1 humanhand=Giant Spectacle;Plummet;Overcome;Gift of Strength -humanbattlefield=Gaea's Protector|Id:4;Cartouche of Knowledge|Attaching:4;Ghalta, Primal Hunger;Frontline Devastator;Island|Set:XLN;Mountain|Set:XLN;Mountain|Set:XLN;Forest|Set:XLN;Forest|Set:XLN +humanbattlefield=Gaea's Protector|Id:4;Cartouche of Knowledge|AttachedTo:4;Ghalta, Primal Hunger;Frontline Devastator;Island|Set:XLN;Mountain|Set:XLN;Mountain|Set:XLN;Forest|Set:XLN;Forest|Set:XLN aibattlefield=Ancient Brontodon;Rekindling Phoenix;Renegade Wheelsmith diff --git a/forge-gui/res/puzzle/PS_DOM3.pzl b/forge-gui/res/puzzle/PS_DOM3.pzl index 0d528a17cdb..6d56b5f664e 100644 --- a/forge-gui/res/puzzle/PS_DOM3.pzl +++ b/forge-gui/res/puzzle/PS_DOM3.pzl @@ -12,5 +12,5 @@ turn=1 activeplayer=human activephase=MAIN1 humanhand=Captain's Hook;Shatter;Sorcerer's Wand;Reckless Rage;Saheeli Rai -humanbattlefield=Tiana, Ship's Caretaker|Id:4;Forebear's Blade|Attaching:4;Forebear's Blade|Attaching:4;Traxos, Scourge of Kroog|Tapped;Storm Fleet Pyromancer;Sulfur Falls|Set:DOM;Sulfur Falls|Set:DOM;Clifftop Retreat|Set:DOM;Clifftop Retreat|Set:DOM;Mountain|Set:DOM +humanbattlefield=Tiana, Ship's Caretaker|Id:4;Forebear's Blade|AttachedTo:4;Forebear's Blade|AttachedTo:4;Traxos, Scourge of Kroog|Tapped;Storm Fleet Pyromancer;Sulfur Falls|Set:DOM;Sulfur Falls|Set:DOM;Clifftop Retreat|Set:DOM;Clifftop Retreat|Set:DOM;Mountain|Set:DOM aibattlefield=Serra Disciple;Teshar, Ancestor's Apostle;Pardic Wanderer diff --git a/forge-gui/res/puzzle/PS_DOM6.pzl b/forge-gui/res/puzzle/PS_DOM6.pzl index 57f722223e1..caa30ff11c5 100644 --- a/forge-gui/res/puzzle/PS_DOM6.pzl +++ b/forge-gui/res/puzzle/PS_DOM6.pzl @@ -13,4 +13,4 @@ activeplayer=human activephase=MAIN1 humanhand=Shivan Fire;Jaya's Immolating Inferno;Squee, the Immortal;Goblin Chainwhirler humanbattlefield=Skirk Prospector|Set:DOM;Siege-Gang Commander|Set:DOM;t:Goblin,P:1,T:1,Cost:no cost,Color:R,Types:Creature-Goblin,Keywords:,Image:r_1_1_goblin_dom;t:Goblin,P:1,T:1,Cost:no cost,Color:R,Types:Creature-Goblin,Keywords:,Image:r_1_1_goblin_dom;t:Goblin,P:1,T:1,Cost:no cost,Color:R,Types:Creature-Goblin,Keywords:,Image:r_1_1_goblin_dom;t:Goblin,P:1,T:1,Cost:no cost,Color:R,Types:Creature-Goblin,Keywords:,Image:r_1_1_goblin_dom;Bloodstone Goblin;Mountain|Set:DOM;Mountain|Set:DOM;Mountain|Set:DOM;Mountain|Set:DOM;Mountain|Set:DOM -aibattlefield=Arvad the Cursed|Id:1;Short Sword|Attaching:1;Vona, Butcher of Magan;Dusk Legion Zealot;Hope of Ghirapur +aibattlefield=Arvad the Cursed|Id:1;Short Sword|AttachedTo:1;Vona, Butcher of Magan;Dusk Legion Zealot;Hope of Ghirapur diff --git a/forge-gui/res/puzzle/PS_DOM9.pzl b/forge-gui/res/puzzle/PS_DOM9.pzl index 099742f9755..4f49bdcceba 100644 --- a/forge-gui/res/puzzle/PS_DOM9.pzl +++ b/forge-gui/res/puzzle/PS_DOM9.pzl @@ -13,5 +13,5 @@ turn=1 activeplayer=human activephase=MAIN1 humanhand=Demystify;Ixalan's Binding;Nissa, Vital Force;Dive Down -humanbattlefield=Thrashing Brontodon|Id:999;Deep Freeze|Attaching:3;Slippery Scoundrel;Rhonas's Stalwart;Plains|Set:DOM;Hinterland Harbor;Hinterland Harbor;Hinterland Harbor;Glacial Fortress;Glacial Fortress;Glacial Fortress +humanbattlefield=Thrashing Brontodon|Id:999;Deep Freeze|AttachedTo:3;Slippery Scoundrel;Rhonas's Stalwart;Plains|Set:DOM;Hinterland Harbor;Hinterland Harbor;Hinterland Harbor;Glacial Fortress;Glacial Fortress;Glacial Fortress aibattlefield=Evra, Halcyon Witness;Ninth Bridge Patrol|Counters:P1P1=1;Lyra Dawnbringer|Id:3;Cast Out|ExecuteScript:TrigExile->999 diff --git a/forge-gui/res/puzzle/PS_GRN2.pzl b/forge-gui/res/puzzle/PS_GRN2.pzl index 84bfbcde0d8..943ea653ba8 100644 --- a/forge-gui/res/puzzle/PS_GRN2.pzl +++ b/forge-gui/res/puzzle/PS_GRN2.pzl @@ -13,5 +13,5 @@ activeplayer=human activephase=MAIN1 humanhand=Arclight Phoenix;Sonic Assault;Invert // Invent;Response // Resurgence humanlibrary=Plains|Set:GRN;Island|Set:GRN;Swamp|Set:GRN;Mountain|Set:GRN;Forest|Set:GRN -humanbattlefield=Runaway Steam-Kin|Counters:P1P1=1|Id:1;Tilonalli's Crown|Attaching:1;Rampaging Monument|Counters:P1P1=3;Sacred Foundry|Set:GRN|NoETBTrigs;Sacred Foundry|Set:GRN|NoETBTrigs;Steam Vents|Set:GRN|NoETBTrigs;Steam Vents|Set:GRN|NoETBTrigs;Izzet Guildgate|Set:GRN;Izzet Guildgate|Set:GRN -aibattlefield=Looming Altisaur;Territorial Allosaurus;Verdant Sun's Avatar;Polyraptor;Emissary of Sunrise|Id:2;Forebear's Blade|Attaching:2 +humanbattlefield=Runaway Steam-Kin|Counters:P1P1=1|Id:1;Tilonalli's Crown|AttachedTo:1;Rampaging Monument|Counters:P1P1=3;Sacred Foundry|Set:GRN|NoETBTrigs;Sacred Foundry|Set:GRN|NoETBTrigs;Steam Vents|Set:GRN|NoETBTrigs;Steam Vents|Set:GRN|NoETBTrigs;Izzet Guildgate|Set:GRN;Izzet Guildgate|Set:GRN +aibattlefield=Looming Altisaur;Territorial Allosaurus;Verdant Sun's Avatar;Polyraptor;Emissary of Sunrise|Id:2;Forebear's Blade|AttachedTo:2 diff --git a/forge-gui/res/puzzle/PS_GRN3.pzl b/forge-gui/res/puzzle/PS_GRN3.pzl index 2263c7d4396..2ffd38685ce 100644 --- a/forge-gui/res/puzzle/PS_GRN3.pzl +++ b/forge-gui/res/puzzle/PS_GRN3.pzl @@ -12,5 +12,5 @@ turn=1 activeplayer=human activephase=MAIN1 humanhand=Justice Strike;Dual Shot;Ashes of the Abhorrent;Silverclad Ferocidons;Hunted Witness -humanbattlefield=Roc Charger|Id:1;Glaive of the Guildpact|Attaching:1;Desecrated Tomb;Pitiless Plunderer;Undercity Necrolisk;Oathsworn Vampire;Boros Guildgate|Set:GRN;Boros Guildgate|Set:GRN;Boros Guildgate|Set:GRN;Boros Guildgate|Set:GRN;Gateway Plaza|NoETBTrigs;Gateway Plaza|NoETBTrigs;Gateway Plaza|NoETBTrigs;Gateway Plaza|NoETBTrigs +humanbattlefield=Roc Charger|Id:1;Glaive of the Guildpact|AttachedTo:1;Desecrated Tomb;Pitiless Plunderer;Undercity Necrolisk;Oathsworn Vampire;Boros Guildgate|Set:GRN;Boros Guildgate|Set:GRN;Boros Guildgate|Set:GRN;Boros Guildgate|Set:GRN;Gateway Plaza|NoETBTrigs;Gateway Plaza|NoETBTrigs;Gateway Plaza|NoETBTrigs;Gateway Plaza|NoETBTrigs aibattlefield=Rekindling Phoenix;Rekindling Phoenix;Aurelia, Exemplar of Justice diff --git a/forge-gui/res/puzzle/PS_GRN5.pzl b/forge-gui/res/puzzle/PS_GRN5.pzl index d351236a007..c1f8032f870 100644 --- a/forge-gui/res/puzzle/PS_GRN5.pzl +++ b/forge-gui/res/puzzle/PS_GRN5.pzl @@ -14,4 +14,4 @@ activephase=MAIN1 humanhand=Mutiny;Metamorphic Alteration;Direct Current;Maximize Velocity;Enigma Drake humanlibrary=Ghitu Lavarunner;Academy Journeymage humanbattlefield=Sparring Construct;Dream Eater;Ral, Izzet Viceroy|Counters:LOYALTY=3;Mountain|Set:GRN;Mountain|Set:GRN;Island|Set:GRN;Island|Set:GRN;Island|Set:GRN;Island|Set:GRN -aibattlefield=Nullhide Ferox;Muldrotha, the Gravetide;Aggressive Mammoth|Id:1;One With the Wind|Attaching:1 +aibattlefield=Nullhide Ferox;Muldrotha, the Gravetide;Aggressive Mammoth|Id:1;One With the Wind|AttachedTo:1 diff --git a/forge-gui/res/puzzle/PS_GRN6.pzl b/forge-gui/res/puzzle/PS_GRN6.pzl index b4da1658c06..47fbe746dd0 100644 --- a/forge-gui/res/puzzle/PS_GRN6.pzl +++ b/forge-gui/res/puzzle/PS_GRN6.pzl @@ -13,5 +13,5 @@ activeplayer=human activephase=MAIN1 humanhand=Arcane Flight;Huatli, Warrior Poet;Disperse;Curious Obsession;Sea Legs humanlibrary=Fog;Fog;Fog;Fog;Fog;Fog;Fog;Fog;Fog;Fog;Fog;Fog;Fog;Fog;Fog;Fog;Fog;Fog;Fog;Fog -humanbattlefield=Surge Mare|Id:5;Helm of the Host|Attaching:5;Valduk, Keeper of the Flame;Divine Visitation;Steam Vents|NoETBTrigs;Steam Vents|NoETBTrigs;Steam Vents|NoETBTrigs;Glacial Fortress;Glacial Fortress;t:Angel,P:4,T:4,Cost:no cost,Color:W,Types:Creature-Angel,Keywords:Flying-Vigilance,Image:w_4_4_angel_flying_vigilance_grn +humanbattlefield=Surge Mare|Id:5;Helm of the Host|AttachedTo:5;Valduk, Keeper of the Flame;Divine Visitation;Steam Vents|NoETBTrigs;Steam Vents|NoETBTrigs;Steam Vents|NoETBTrigs;Glacial Fortress;Glacial Fortress;t:Angel,P:4,T:4,Cost:no cost,Color:W,Types:Creature-Angel,Keywords:Flying-Vigilance,Image:w_4_4_angel_flying_vigilance_grn aibattlefield=Murmuring Mystic;t:Bird Illusion,P:1,T:1,Cost:no cost,Color:U,Types:Creature-Bird-Illusion,Keywords:Flying,Image:u_1_1_bird_illusion_flying_grn;t:Bird Illusion,P:1,T:1,Cost:no cost,Color:U,Types:Creature-Bird-Illusion,Keywords:Flying,Image:u_1_1_bird_illusion_flying_grn;t:Bird Illusion,P:1,T:1,Cost:no cost,Color:U,Types:Creature-Bird-Illusion,Keywords:Flying,Image:u_1_1_bird_illusion_flying_grn;t:Bird Illusion,P:1,T:1,Cost:no cost,Color:U,Types:Creature-Bird-Illusion,Keywords:Flying,Image:u_1_1_bird_illusion_flying_grn;t:Bird Illusion,P:1,T:1,Cost:no cost,Color:U,Types:Creature-Bird-Illusion,Keywords:Flying,Image:u_1_1_bird_illusion_flying_grn;Dreamcaller Siren diff --git a/forge-gui/res/puzzle/PS_HOU0.pzl b/forge-gui/res/puzzle/PS_HOU0.pzl index 280914dbb4e..e4dc49efd44 100644 --- a/forge-gui/res/puzzle/PS_HOU0.pzl +++ b/forge-gui/res/puzzle/PS_HOU0.pzl @@ -13,7 +13,7 @@ activephase=MAIN1 humanhand=Precise Strike humanlibrary=Swamp|Set:ZEN;Swamp|Set:ZEN;Swamp|Set:ZEN;Swamp|Set:ZEN;Swamp|Set:ZEN;Swamp|Set:ZEN; humangraveyard= -humanbattlefield=Swamp|Set:ZEN;Swamp|Set:ZEN;Canyon Slough;Canyon Slough;Canyon Slough;Key to the City;The Scorpion God;Furyblade Vampire|Id:420;Stitcher's Graft|Attaching:420;Skirsdag Supplicant; +humanbattlefield=Swamp|Set:ZEN;Swamp|Set:ZEN;Canyon Slough;Canyon Slough;Canyon Slough;Key to the City;The Scorpion God;Furyblade Vampire|Id:420;Stitcher's Graft|AttachedTo:420;Skirsdag Supplicant; humanexile= humancommand= aihand= diff --git a/forge-gui/res/puzzle/PS_M191.pzl b/forge-gui/res/puzzle/PS_M191.pzl index 11e3715ce15..f52262fdb04 100644 --- a/forge-gui/res/puzzle/PS_M191.pzl +++ b/forge-gui/res/puzzle/PS_M191.pzl @@ -13,4 +13,4 @@ activeplayer=human activephase=MAIN1 humanhand=Switcheroo;Atzocan Archer;Strider Harness;Recollect humanbattlefield=Overwhelming Splendor|EnchantingPlayer:AI;Daybreak Chaplain;Aggressive Mammoth;Thrashing Brontodon;Sunpetal Grove;Sunpetal Grove;Sunpetal Grove;Sunpetal Grove;Hinterland Harbor;Hinterland Harbor;Hinterland Harbor;Hinterland Harbor -aibattlefield=Hungering Hydra|Id:1|Counters:P1P1=3;Oakenform|Attaching:1;Darigaaz Reincarnated|SummonSick;Glorybringer|SummonSick;Guttersnipe +aibattlefield=Hungering Hydra|Id:1|Counters:P1P1=3;Oakenform|AttachedTo:1;Darigaaz Reincarnated|SummonSick;Glorybringer|SummonSick;Guttersnipe diff --git a/forge-gui/res/puzzle/PS_M193.pzl b/forge-gui/res/puzzle/PS_M193.pzl index 0cdf3dc29cd..961760ea5ef 100644 --- a/forge-gui/res/puzzle/PS_M193.pzl +++ b/forge-gui/res/puzzle/PS_M193.pzl @@ -12,4 +12,4 @@ activeplayer=human activephase=MAIN1 humanhand=Metamorphic Alteration;Metamorphic Alteration;Metamorphic Alteration;Strider Harness humanbattlefield=Thallid Omnivore;Dragon Egg;Slither Blade;Powerstone Shard;Powerstone Shard;Spirebluff Canal;Spirebluff Canal;Spirebluff Canal;Swamp|Set:M19;Swamp|Set:M19;Swamp|Set:M19 -aibattlefield=Hungering Hydra|Counters:P1P1=6;Boggart Brute|Id:1;Cobbled Wings|Attaching:1 +aibattlefield=Hungering Hydra|Counters:P1P1=6;Boggart Brute|Id:1;Cobbled Wings|AttachedTo:1 diff --git a/forge-gui/res/puzzle/PS_M199.pzl b/forge-gui/res/puzzle/PS_M199.pzl index 6fd370a2d0d..04aad47b1b5 100644 --- a/forge-gui/res/puzzle/PS_M199.pzl +++ b/forge-gui/res/puzzle/PS_M199.pzl @@ -16,4 +16,4 @@ humanlibrary=One with Nothing;One with Nothing;One with Nothing;One with Nothing humanbattlefield=Sai, Master Thopterist;Cunning Survivor;Captain Lannery Storm;Mox Amber;Powerstone Shard;Powerstone Shard;Cultivator's Caravan;Spirebluff Canal;Spirebluff Canal;Spirebluff Canal aihand=Wastes;Wastes ailibrary=One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing;One with Nothing -aibattlefield=Perpetual Timepiece;Nezahal, Primal Tide|Id:2;Desert's Hold|Attaching:2;Ripjaw Raptor;Oasis Ritualist;Anointer Priest +aibattlefield=Perpetual Timepiece;Nezahal, Primal Tide|Id:2;Desert's Hold|AttachedTo:2;Ripjaw Raptor;Oasis Ritualist;Anointer Priest diff --git a/forge-gui/res/puzzle/PS_RIX1.pzl b/forge-gui/res/puzzle/PS_RIX1.pzl index 6b9bbdb681d..821bccd7202 100644 --- a/forge-gui/res/puzzle/PS_RIX1.pzl +++ b/forge-gui/res/puzzle/PS_RIX1.pzl @@ -19,6 +19,6 @@ humancommand= aihand= ailibrary= aigraveyard= -aibattlefield=Compulsory Rest|Attaching:1;Protection of the Hekma;Rampaging Ferocidon;Gifted Aetherborn;Regal Caracal;t:Cat,P:1,T:1,Cost:no cost,Color:W,Types:Creature-Cat,Keywords:Lifelink,Image:w_1_1_cat;t:Cat,P:1,T:1,Cost:no cost,Color:W,Types:Creature-Cat,Keywords:Lifelink,Image:w_1_1_cat; +aibattlefield=Compulsory Rest|AttachedTo:1;Protection of the Hekma;Rampaging Ferocidon;Gifted Aetherborn;Regal Caracal;t:Cat,P:1,T:1,Cost:no cost,Color:W,Types:Creature-Cat,Keywords:Lifelink,Image:w_1_1_cat;t:Cat,P:1,T:1,Cost:no cost,Color:W,Types:Creature-Cat,Keywords:Lifelink,Image:w_1_1_cat; aiexile= aicommand= diff --git a/forge-gui/res/puzzle/PS_RIX5.pzl b/forge-gui/res/puzzle/PS_RIX5.pzl index d4a51bcadca..c5161c2fc8a 100644 --- a/forge-gui/res/puzzle/PS_RIX5.pzl +++ b/forge-gui/res/puzzle/PS_RIX5.pzl @@ -21,6 +21,6 @@ humancommand= aihand= ailibrary= aigraveyard= -aibattlefield=Labyrinth Guardian;Ornithopter;Deadlock Trap;Captured by the Consulate|Attaching:4 +aibattlefield=Labyrinth Guardian;Ornithopter;Deadlock Trap;Captured by the Consulate|AttachedTo:4 aiexile= aicommand= diff --git a/forge-gui/res/puzzle/PS_RIX6.pzl b/forge-gui/res/puzzle/PS_RIX6.pzl index 715e5fe2f28..a47c69eb4c5 100644 --- a/forge-gui/res/puzzle/PS_RIX6.pzl +++ b/forge-gui/res/puzzle/PS_RIX6.pzl @@ -14,7 +14,7 @@ activephase=MAIN1 humanhand=Vizier of Deferment;Siren's Ruse;Rallying Roar;Aether Tradewinds humanlibrary=Harnessed Lightning;Harnessed Lightning;Harnessed Lightning;Harnessed Lightning;Harnessed Lightning;Harnessed Lightning;Harnessed Lightning;Harnessed Lightning;Harnessed Lightning;Harnessed Lightning;Harnessed Lightning;Harnessed Lightning;Harnessed Lightning;Harnessed Lightning;Harnessed Lightning;Harnessed Lightning;Harnessed Lightning;Harnessed Lightning;Harnessed Lightning;Harnessed Lightning humangraveyard= -humanbattlefield=Deadeye Brawler;Angel of Condemnation;Dire Fleet Ravager|Id:6;Inventor's Goggles|Attaching:6;Fetid Pools;Fetid Pools;Fetid Pools;Plains|Set:XLN;Plains|Set:XLN +humanbattlefield=Deadeye Brawler;Angel of Condemnation;Dire Fleet Ravager|Id:6;Inventor's Goggles|AttachedTo:6;Fetid Pools;Fetid Pools;Fetid Pools;Plains|Set:XLN;Plains|Set:XLN humanexile= humancommand= aihand= diff --git a/forge-gui/res/puzzle/PS_XLN3.pzl b/forge-gui/res/puzzle/PS_XLN3.pzl index 4fda48594fb..7d7d7fe207b 100644 --- a/forge-gui/res/puzzle/PS_XLN3.pzl +++ b/forge-gui/res/puzzle/PS_XLN3.pzl @@ -14,7 +14,7 @@ humanhand=Captain Lannery Storm; Mountain|Set:XLN; Chandra's Pyrohelix; Angrath' humangraveyard= humanlibrary= humanbattlefield=Pathmaker Initiate; Combat Celebrant; Tilonalli's Skinshifter; Burning Sun's Avatar|Tapped|Id:420; Carrion Screecher; Dragonskull Summit|Set:XLN; Dragonskull Summit|Set:XLN; Dragonskull Summit|Set:XLN; Mountain|Set:XLN; Mountain|Set:XLN; Mountain|Set:XLN; -aibattlefield=Seraph of the Suns; Nimble Obstructionist; Protection of the Hekma; Unquenchable Thirst|Attaching:420; +aibattlefield=Seraph of the Suns; Nimble Obstructionist; Protection of the Hekma; Unquenchable Thirst|AttachedTo:420; aiprecast=Deeproot Waters:TrigToken;Deeproot Waters:TrigToken;Deeproot Waters:TrigToken; aigraveyard= ailibrary= diff --git a/forge-gui/res/puzzle/PS_XLN7.pzl b/forge-gui/res/puzzle/PS_XLN7.pzl index 4fa4777adb0..0d9bd9ff23e 100644 --- a/forge-gui/res/puzzle/PS_XLN7.pzl +++ b/forge-gui/res/puzzle/PS_XLN7.pzl @@ -14,7 +14,7 @@ humanhand=Duskborne Skymarcher; Gilded Sentinel; Regisaur Alpha; Merciless Javel humanprecast= humangraveyard=Reckless Fireweaver; Gearseeker Serpent; Storm Sculptor; Temmet, Vizier of Naktamun; humanlibrary= -humanbattlefield=Mechanized Production|Attaching:420; God-Pharaoh's Gift|Id:420; God-Pharaoh's Gift; Huatli, Warrior Poet|Counters:LOYALTY=3; Pia Nalaar; Anointed Procession; Spire of Industry; Spire of Industry; Spire of Industry; Inspiring Vantage|Set:KLD; Inspiring Vantage|Set:KLD; Inspiring Vantage|Set:KLD; Inspiring Vantage|Set:KLD; +humanbattlefield=Mechanized Production|AttachedTo:420; God-Pharaoh's Gift|Id:420; God-Pharaoh's Gift; Huatli, Warrior Poet|Counters:LOYALTY=3; Pia Nalaar; Anointed Procession; Spire of Industry; Spire of Industry; Spire of Industry; Inspiring Vantage|Set:KLD; Inspiring Vantage|Set:KLD; Inspiring Vantage|Set:KLD; Inspiring Vantage|Set:KLD; aibattlefield=Trueheart Duelist; Trueheart Duelist; Trueheart Duelist; Trueheart Duelist; Queen's Agent|Counters:P1P1=1; Queen's Agent|Counters:P1P1=1; Queen's Agent|Counters:P1P1=1; Queen's Agent|Counters:P1P1=1; Ashes of the Abhorrent; aiprecast=Trespasser's Curse; aigraveyard= diff --git a/forge-gui/res/puzzle/PS_XLN9.pzl b/forge-gui/res/puzzle/PS_XLN9.pzl index f1657f191ae..f9d7e17097c 100644 --- a/forge-gui/res/puzzle/PS_XLN9.pzl +++ b/forge-gui/res/puzzle/PS_XLN9.pzl @@ -14,7 +14,7 @@ humanhand=Disallow; Sand Strangler; Siren's Ruse; Exemplar of Strength; Harnesse humanprecast= humangraveyard= humanlibrary= -humanbattlefield=Consuming Fervor|Attaching:420; Spontaneous Artist|Counters:M1M1=4|Id:420; Chaos Maw; Nef-Crop Entangler; Ramunap Ruins; Sheltered Thicket|Set:AKH; Sheltered Thicket|Set:AKH; Sheltered Thicket|Set:AKH; Spirebluff Canal|Set:KLD; Spirebluff Canal|Set:KLD; Spirebluff Canal|Set:KLD; +humanbattlefield=Consuming Fervor|AttachedTo:420; Spontaneous Artist|Counters:M1M1=4|Id:420; Chaos Maw; Nef-Crop Entangler; Ramunap Ruins; Sheltered Thicket|Set:AKH; Sheltered Thicket|Set:AKH; Sheltered Thicket|Set:AKH; Spirebluff Canal|Set:KLD; Spirebluff Canal|Set:KLD; Spirebluff Canal|Set:KLD; aibattlefield=Island|Set:XLN; Adanto Vanguard; Raptor Hatchling; Siren Stormtamer|Tapped; Aethergeode Miner; aiprecast=Aether Chaser:TrigEnergy; aigraveyard= diff --git a/forge-gui/res/puzzle/forge_tutorial02.pzl b/forge-gui/res/puzzle/forge_tutorial02.pzl index 736794af35f..7b9d5e376a2 100644 --- a/forge-gui/res/puzzle/forge_tutorial02.pzl +++ b/forge-gui/res/puzzle/forge_tutorial02.pzl @@ -25,7 +25,7 @@ humanlibrary= humangraveyard= -humanbattlefield=Llanowar Druid|Set:WTH; Gustrider Exuberant|Set:ALA; Herd Gnarr|Set:TSP; Waker of the Wilds|Set:XLN; Plains|Set:AKH; Plains|Set:AKH; Plains|Set:AKH; Plains|Set:AKH; Plains|Set:AKH|Id:141; Wild Growth|Set:7ED|Attaching:141; Forest|Set:AKH; Forest|Set:AKH; Forest|Set:AKH +humanbattlefield=Llanowar Druid|Set:WTH; Gustrider Exuberant|Set:ALA; Herd Gnarr|Set:TSP; Waker of the Wilds|Set:XLN; Plains|Set:AKH; Plains|Set:AKH; Plains|Set:AKH; Plains|Set:AKH; Plains|Set:AKH|Id:141; Wild Growth|Set:7ED|AttachedTo:141; Forest|Set:AKH; Forest|Set:AKH; Forest|Set:AKH humanexile= diff --git a/forge-gui/src/main/java/forge/card/CardDetailUtil.java b/forge-gui/src/main/java/forge/card/CardDetailUtil.java index 0015a9410b8..77ee49fc0d6 100644 --- a/forge-gui/src/main/java/forge/card/CardDetailUtil.java +++ b/forge-gui/src/main/java/forge/card/CardDetailUtil.java @@ -441,8 +441,8 @@ public class CardDetailUtil { area.append(")"); } - // attached by - if (card.isAttachedByCards()) { + // a card has something attached to it + if (card.hasCardAttachments()) { if (area.length() != 0) { area.append("\n"); } @@ -451,18 +451,18 @@ public class CardDetailUtil { area.append("="); } - // attaching - if (card.getAttachingCard() != null) { + // a card is attached to smth. + if (card.getAttachedTo() != null) { if (area.length() != 0) { area.append("\n"); } - area.append("*Attached to ").append(card.getAttachingCard()).append("*"); + area.append("*Attached to ").append(card.getAttachedTo()).append("*"); } - if (card.getAttachingPlayer() != null) { + if (card.getEnchantedPlayer() != null) { if (area.length() != 0) { area.append("\n"); } - area.append("*Enchanting ").append(card.getAttachingPlayer()).append("*"); + area.append("*Enchanting ").append(card.getEnchantedPlayer()).append("*"); } // controlling From 3fff9efa3951d7053118e824856963e4dd6c9d78 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 24 Nov 2018 11:22:12 +0300 Subject: [PATCH 226/901] - Attempting to refactor names to not be ambiguous/confusing. --- forge-ai/src/main/java/forge/ai/ComputerUtil.java | 2 +- .../src/main/java/forge/ai/ability/AttachAi.java | 2 +- .../main/java/forge/ai/ability/ZoneExchangeAi.java | 2 +- forge-game/src/main/java/forge/game/GameAction.java | 2 +- forge-game/src/main/java/forge/game/GameEntity.java | 6 +++--- .../forge/game/ability/effects/AttachEffect.java | 2 +- .../java/forge/game/ability/effects/TokenEffect.java | 2 +- .../game/ability/effects/ZoneExchangeEffect.java | 2 +- forge-game/src/main/java/forge/game/card/Card.java | 8 ++++---- .../main/java/forge/game/card/CardPredicates.java | 4 ++-- .../src/main/java/forge/game/card/CardProperty.java | 12 ++++++------ .../forge/gamesimulationtests/util/GameWrapper.java | 2 +- .../src/main/java/forge/card/CardDetailUtil.java | 2 +- 13 files changed, 24 insertions(+), 24 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index f65c345cc38..bd641d635c9 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -975,7 +975,7 @@ public class ComputerUtil { playNow = false; break; } - if (!playNow && c.isCreature() && ComputerUtilCombat.canAttackNextTurn(c) && c.canBeTargetedByAttachment(card)) { + if (!playNow && c.isCreature() && ComputerUtilCombat.canAttackNextTurn(c) && c.canBeAttached(card)) { playNow = true; } } diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index b66f9678310..d40c2cf9c07 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -1292,7 +1292,7 @@ public class AttachAi extends SpellAbilityAi { } else { list = CardLists.getValidCards(aiPlayer.getGame().getCardsIn(tgt.getZone()), tgt.getValidTgts(), sa.getActivatingPlayer(), attachSource, sa); - list = CardLists.filter(list, CardPredicates.canBeTargetedByAttachment(attachSource)); + list = CardLists.filter(list, CardPredicates.canBeAttached(attachSource)); // TODO If Attaching without casting, don't need to actually target. // I believe this is the only case where mandatory will be true, so just diff --git a/forge-ai/src/main/java/forge/ai/ability/ZoneExchangeAi.java b/forge-ai/src/main/java/forge/ai/ability/ZoneExchangeAi.java index 05e8eeb705f..613ad8d8af9 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ZoneExchangeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ZoneExchangeAi.java @@ -39,7 +39,7 @@ public class ZoneExchangeAi extends SpellAbilityAi { } if (type.equals("Aura")) { Card c = object1.getEnchantingCard(); - if (!c.canBeTargetedByAttachment(object2)) { + if (!c.canBeAttached(object2)) { return false; } } diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 780d70a8ae4..cabed4c186a 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -1094,7 +1094,7 @@ public class GameAction { if (c.isAttachedToEntity()) { final GameEntity ge = c.getEntityAttachedTo(); - if (!ge.canBeTargetedByAttachment(c)) { + if (!ge.canBeAttached(c)) { c.unattachFromEntity(ge); checkAgain = true; } diff --git a/forge-game/src/main/java/forge/game/GameEntity.java b/forge-game/src/main/java/forge/game/GameEntity.java index e31b3a7e47f..0bf288d9e25 100644 --- a/forge-game/src/main/java/forge/game/GameEntity.java +++ b/forge-game/src/main/java/forge/game/GameEntity.java @@ -376,11 +376,11 @@ public abstract class GameEntity extends GameObject implements IIdentifiable { } } - public boolean canBeTargetedByAttachment(final Card attach) { - return canBeTargetedByAttachment(attach, false); + public boolean canBeAttached(final Card attach) { + return canBeAttached(attach, false); } - public boolean canBeTargetedByAttachment(final Card attach, boolean checkSBA) { + public boolean canBeAttached(final Card attach, boolean checkSBA) { // master mode if (!attach.isAttachment() || attach.isCreature() || equals(attach)) { return false; diff --git a/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java index 7c9d1c838a9..44643d555d2 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java @@ -101,7 +101,7 @@ public class AttachEffect extends SpellAbilityEffect { // Although honestly, I'm not sure if the three of those could // handle being scripted // 303.4h: If the card can't be enchanted, the aura doesn't move - if (c.canBeTargetedByAttachment(card)) { + if (c.canBeAttached(card)) { handleAura(card, c); } } else { diff --git a/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java b/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java index 0f9de3ec43e..6ff9d2e7d4e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java @@ -497,7 +497,7 @@ public class TokenEffect extends SpellAbilityEffect { // TODO update when doing Attach Update boolean canAttach = lki.isAttachment(); - if (canAttach && ge.canBeTargetedByAttachment(lki)) { + if (canAttach && ge.canBeAttached(lki)) { canAttach = false; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ZoneExchangeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ZoneExchangeEffect.java index 387481adfd8..c30045f9314 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ZoneExchangeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ZoneExchangeEffect.java @@ -77,7 +77,7 @@ public class ZoneExchangeEffect extends SpellAbilityEffect { Card c = null; if (type != null && type.equals("Aura") && object1.getEnchantingCard() != null) { c = object1.getEnchantingCard(); - if (!c.canBeTargetedByAttachment(object2)) { + if (!c.canBeAttached(object2)) { return; } } diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 6b2555cf8cd..7ca8e45317b 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -2704,7 +2704,7 @@ public class Card extends GameEntity implements Comparable { } public final void attachToEntity(final GameEntity entity) { - if (!entity.canBeTargetedByAttachment(this)) { + if (!entity.canBeAttached(this)) { return; } @@ -5196,16 +5196,16 @@ public class Card extends GameEntity implements Comparable { } /* (non-Javadoc) - * @see forge.game.GameEntity#canBeTargetedByAttachment(forge.game.card.Card, boolean) + * @see forge.game.GameEntity#canBeAttached(forge.game.card.Card, boolean) */ @Override - public boolean canBeTargetedByAttachment(Card attach, boolean checkSBA) { + public boolean canBeAttached(Card attach, boolean checkSBA) { // phase check there if (isPhasedOut() && !attach.isPhasedOut()) { return false; } - return super.canBeTargetedByAttachment(attach, checkSBA); + return super.canBeAttached(attach, checkSBA); } public FCollectionView getReplacementEffects() { diff --git a/forge-game/src/main/java/forge/game/card/CardPredicates.java b/forge-game/src/main/java/forge/game/card/CardPredicates.java index 623b046d2da..3c049e64788 100644 --- a/forge-game/src/main/java/forge/game/card/CardPredicates.java +++ b/forge-game/src/main/java/forge/game/card/CardPredicates.java @@ -216,11 +216,11 @@ public final class CardPredicates { }; }; - public static final Predicate canBeTargetedByAttachment(final Card aura) { + public static final Predicate canBeAttached(final Card aura) { return new Predicate() { @Override public boolean apply(final Card c) { - return c.canBeTargetedByAttachment(aura); + return c.canBeAttached(aura); } }; }; diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index 0a5a45fccb5..aac65619027 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -507,11 +507,11 @@ public class CardProperty { final String restriction = property.substring(10); if (restriction.equals("Remembered")) { for (final Object rem : source.getRemembered()) { - if (!(rem instanceof Card) || !((Card) rem).canBeTargetedByAttachment(card)) + if (!(rem instanceof Card) || !((Card) rem).canBeAttached(card)) return false; } } else if (restriction.equals("Source")) { - if (!source.canBeTargetedByAttachment(card)) return false; + if (!source.canBeAttached(card)) return false; } } else if (property.startsWith("CanBeEnchantedBy")) { if (property.substring(16).equals("Targeted")) { @@ -519,7 +519,7 @@ public class CardProperty { final SpellAbility saTargeting = sa.getSATargetingCard(); if (saTargeting != null) { for (final Card c : saTargeting.getTargets().getTargetCards()) { - if (!card.canBeTargetedByAttachment(c)) { + if (!card.canBeAttached(c)) { return false; } } @@ -529,13 +529,13 @@ public class CardProperty { for (final Object rem : source.getRemembered()) { if (rem instanceof Card) { final Card c = (Card) rem; - if (!card.canBeTargetedByAttachment(c)) { + if (!card.canBeAttached(c)) { return false; } } } } else { - if (!card.canBeTargetedByAttachment(source)) { + if (!card.canBeAttached(source)) { return false; } } @@ -566,7 +566,7 @@ public class CardProperty { return false; } } else if (property.startsWith("CanBeAttachedBy")) { - if (!card.canBeTargetedByAttachment(source)) { + if (!card.canBeAttached(source)) { return false; } } else if (property.startsWith("Equipped")) { diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java index 7231071a260..628b9b6b160 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/GameWrapper.java @@ -104,7 +104,7 @@ public class GameWrapper { if( card.getTarget() != null ) { Card target = CardSpecificationHandler.INSTANCE.find( game, card.getTarget() ); if (actualCard.isAttachment()) { - if (target.canBeTargetedByAttachment(actualCard)) { + if (target.canBeAttached(actualCard)) { actualCard.attachToEntity(target); } else { throw new IllegalStateException( actualCard + " can't attach to " + target ); diff --git a/forge-gui/src/main/java/forge/card/CardDetailUtil.java b/forge-gui/src/main/java/forge/card/CardDetailUtil.java index 77ee49fc0d6..54e92455c8d 100644 --- a/forge-gui/src/main/java/forge/card/CardDetailUtil.java +++ b/forge-gui/src/main/java/forge/card/CardDetailUtil.java @@ -451,7 +451,7 @@ public class CardDetailUtil { area.append("="); } - // a card is attached to smth. + // a card is attached to something if (card.getAttachedTo() != null) { if (area.length() != 0) { area.append("\n"); From 79b7b1f9353b3cee74a1f3a5557b6f6dcd3ca023 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 24 Nov 2018 22:15:10 +0300 Subject: [PATCH 227/901] - Added a ReorderTopOfLibrary AI logic. - Marked the relevant cards AI playable. --- .../java/forge/ai/PlayerControllerAi.java | 61 +++++++++- .../main/java/forge/ai/ability/DrawAi.java | 3 + .../ai/ability/RearrangeTopOfLibraryAi.java | 104 +++++++++++++++--- .../effects/RearrangeTopOfLibraryEffect.java | 1 - .../res/cardsfolder/a/architects_of_will.txt | 1 - forge-gui/res/cardsfolder/c/crystal_seer.txt | 1 - .../res/cardsfolder/d/discombobulate.txt | 1 - .../res/cardsfolder/e/elemental_augury.txt | 1 - forge-gui/res/cardsfolder/i/index.txt | 1 - forge-gui/res/cardsfolder/m/mirris_guile.txt | 1 - .../res/cardsfolder/n/natural_selection.txt | 1 - forge-gui/res/cardsfolder/o/omen.txt | 1 - forge-gui/res/cardsfolder/p/ponder.txt | 1 - forge-gui/res/cardsfolder/p/portent.txt | 1 - forge-gui/res/cardsfolder/s/second_sight.txt | 1 - .../cardsfolder/s/senseis_divining_top.txt | 5 +- forge-gui/res/cardsfolder/s/spire_owl.txt | 1 - .../res/cardsfolder/t/tahngarths_glare.txt | 1 - 18 files changed, 152 insertions(+), 35 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 39bc6ade625..7cc53529839 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -331,8 +331,12 @@ public class PlayerControllerAi extends PlayerController { public CardCollectionView orderMoveToZoneList(CardCollectionView cards, ZoneType destinationZone, SpellAbility source) { //TODO Add more logic for AI ordering here - // In presence of Volrath's Shapeshifter in deck, try to place the best creature on top of the graveyard + if (cards.isEmpty()) { + return cards; + } + if (destinationZone == ZoneType.Graveyard) { + // In presence of Volrath's Shapeshifter in deck, try to place the best creature on top of the graveyard if (!CardLists.filter(game.getCardsInGame(), new Predicate() { @Override public boolean apply(Card card) { @@ -362,6 +366,61 @@ public class PlayerControllerAi extends PlayerController { return reordered; } } + } else if (destinationZone == ZoneType.Library) { + // Ponder and similar cards + Player p = cards.getFirst().getController(); // whose library are we reordering? + CardCollection reordered = new CardCollection(); + + // Try to use the Scry logic to figure out what should be closer to the top and what should be closer to the bottom + CardCollection topLands = new CardCollection(), topNonLands = new CardCollection(), bottom = new CardCollection(); + for (Card c : cards) { + if (ComputerUtil.scryWillMoveCardToBottomOfLibrary(p, c)) { + bottom.add(c); + } else { + if (c.isLand()) { + topLands.add(c); + } else { + topNonLands.add(c); + } + } + } + + int landsOTB = CardLists.filter(p.getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.LANDS_PRODUCING_MANA).size(); + + if (!p.isOpponentOf(player)) { + if (landsOTB <= 2) { + // too few lands, add all the lands from the "top" category first + reordered.addAll(topLands); + topLands.clear(); + } else { + // we would have scried a land to top, so add one land from the "top" category if it's available there, but not more + if (!topLands.isEmpty()) { + Card first = topLands.getFirst(); + reordered.add(first); + topLands.remove(first); + } + } + // add everything that was deemed playable + reordered.addAll(topNonLands); + // then all the land extras that may be there + reordered.addAll(topLands); + // and then everything else that was deemed unplayable and thus scriable to the bottom + reordered.addAll(bottom); + } else { + // try to screw the opponent up as much as possible by placing the uncastables first + reordered.addAll(bottom); + if (landsOTB <= 5) { + reordered.addAll(topNonLands); + reordered.addAll(topLands); + } else { + reordered.addAll(topLands); + reordered.addAll(topNonLands); + } + } + + assert(reordered.size() == cards.size()); + + return reordered; } // Default: return with the same order as was passed into this method diff --git a/forge-ai/src/main/java/forge/ai/ability/DrawAi.java b/forge-ai/src/main/java/forge/ai/ability/DrawAi.java index 2a2967f317b..3f16073a7a7 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DrawAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DrawAi.java @@ -131,6 +131,9 @@ public class DrawAi extends SpellAbilityAi { return true; } else if (logic.equals("AlwaysAtOppEOT")) { return ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn().equals(ai); + } else if (logic.equals("AtEOTIfActivatedBefore")) { + return AiCardMemory.isRememberedCard(ai, sa.getHostCard(), AiCardMemory.MemorySet.ACTIVATED_THIS_TURN) + && ph.is(PhaseType.END_OF_TURN); } // Don't use draw abilities before main 2 if possible 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 13b30869d33..e4486ed4e17 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RearrangeTopOfLibraryAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RearrangeTopOfLibraryAi.java @@ -1,11 +1,20 @@ package forge.ai.ability; -import forge.ai.ComputerUtil; -import forge.ai.SpellAbilityAi; +import forge.ai.*; +import forge.game.ability.AbilityUtils; +import forge.game.card.Card; +import forge.game.card.CardLists; +import forge.game.card.CardPredicates; +import forge.game.phase.PhaseHandler; +import forge.game.phase.PhaseType; import forge.game.player.Player; +import forge.game.player.PlayerActionConfirmMode; +import forge.game.player.PlayerCollection; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; +import forge.game.zone.ZoneType; +import forge.util.MyRandom; public class RearrangeTopOfLibraryAi extends SpellAbilityAi { /* (non-Javadoc) @@ -13,14 +22,24 @@ public class RearrangeTopOfLibraryAi extends SpellAbilityAi { */ @Override protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) { - return sa.isMandatory(); // AI doesn't do anything with this SA yet, but at least it shouldn't miss mandatory triggers - } + // Specific details of ordering cards are handled by PlayerControllerAi#orderMoveToZoneList - /* (non-Javadoc) - * @see forge.card.abilityfactory.SpellAiLogic#doTriggerAINoCost(forge.game.player.Player, java.util.Map, forge.card.spellability.SpellAbility, boolean) - */ - @Override - protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { + final PhaseHandler ph = aiPlayer.getGame().getPhaseHandler(); + if (sa.getHostCard().isPermanent() && sa.getPayCosts() != null + && (sa.getPayCosts().hasTapCost() || sa.getPayCosts().hasManaCost())) { + // If it has an associated cost, try to only do this before own turn unless there are special logic considerations + if ("Main2BeforeOwnTurn".equals(sa.getParam("AILogic")) && !(ph.is(PhaseType.MAIN2) && ph.getNextTurn() == aiPlayer)) { + return false; + } else if (!sa.hasParam("AILogic") && !(ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn() == aiPlayer)) { + return false; + } + } + + // Do it once per turn, generally (may be improved later) + if (AiCardMemory.isRememberedCard(aiPlayer, sa.getHostCard(), AiCardMemory.MemorySet.ACTIVATED_THIS_TURN)) { + return false; + } + AiCardMemory.rememberCard(aiPlayer, sa.getHostCard(), AiCardMemory.MemorySet.ACTIVATED_THIS_TURN); final TargetRestrictions tgt = sa.getTargetRestrictions(); @@ -28,21 +47,72 @@ public class RearrangeTopOfLibraryAi extends SpellAbilityAi { // ability is targeted sa.resetTargets(); - Player opp = ComputerUtil.getOpponentFor(ai); + Player opp = ComputerUtil.getOpponentFor(aiPlayer); + final boolean canTgtAI = aiPlayer.canBeTargetedBy(sa); final boolean canTgtHuman = opp.canBeTargetedBy(sa); - if (!canTgtHuman) { - return false; - } else { + if (canTgtHuman && canTgtAI) { + // TODO: maybe some other consideration rather than random? + Player preferredTarget = MyRandom.percentTrue(50) ? aiPlayer : opp; + sa.getTargets().add(preferredTarget); + } else if (canTgtAI) { + sa.getTargets().add(aiPlayer); + } else if (canTgtHuman) { sa.getTargets().add(opp); + } else { + return false; // could not find a valid target } } else { // if it's just defined, no big deal } - // TODO: the AI currently doesn't do anything with this ability, consider improving. - // For now, "true" is returned (without any action) if the SA is mandatory in order - // not to miss triggers. - return sa.isMandatory(); + return true; + } + + /* (non-Javadoc) + * @see forge.card.abilityfactory.SpellAiLogic#doTriggerAINoCost(forge.game.player.Player, java.util.Map, forge.card.spellability.SpellAbility, boolean) + */ + @Override + protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { + // Specific details of ordering cards are handled by PlayerControllerAi#orderMoveToZoneList + return mandatory || canPlayAI(ai, sa); + } + + /* (non-Javadoc) + * @see forge.card.ability.SpellAbilityAi#confirmAction(forge.game.player.Player, forge.card.spellability.SpellAbility, forge.game.player.PlayerActionConfirmMode, java.lang.String) + */ + @Override + public boolean confirmAction(Player player, SpellAbility sa, PlayerActionConfirmMode mode, String message) { + // Confirming this action means shuffling the library if asked. + + // First, let's check if we can play the top card of the library + PlayerCollection pc = sa.usesTargeting() ? new PlayerCollection(sa.getTargets().getTargetPlayers()) + : AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("Defined"), sa); + + int uncastableCMCThreshold = 2; + int minLandsToScryLandsAway = 4; + if (player.getController().isAI()) { + AiController aic = ((PlayerControllerAi)player.getController()).getAi(); + minLandsToScryLandsAway = aic.getIntProperty(AiProps.SCRY_NUM_LANDS_TO_NOT_NEED_MORE); + uncastableCMCThreshold = aic.getIntProperty(AiProps.SCRY_IMMEDIATELY_UNCASTABLE_CMC_DIFF); + } + + Player p = pc.getFirst(); // FIXME: is this always a single target spell? + Card top = p.getCardsIn(ZoneType.Library).getFirst(); + int landsOTB = CardLists.filter(p.getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.LANDS_PRODUCING_MANA).size(); + int cmc = top.isSplitCard() ? Math.min(top.getCMC(Card.SplitCMCMode.LeftSplitCMC), top.getCMC(Card.SplitCMCMode.RightSplitCMC)) + : top.getCMC(); + int maxCastable = ComputerUtilMana.getAvailableManaEstimate(p, false); + + if (!top.isLand() && cmc - maxCastable >= uncastableCMCThreshold) { + // Can't cast in the foreseeable future. Shuffle if doing it to ourselves or an ally, otherwise keep it + return !p.isOpponentOf(player); + } else if (top.isLand() && landsOTB <= minLandsToScryLandsAway){ + // We don't want to give the opponent a free land if his land count is low + return p.isOpponentOf(player); + } + + // Usually we don't want to shuffle if we arranged things carefully + return false; } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/RearrangeTopOfLibraryEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RearrangeTopOfLibraryEffect.java index 2794da67bbb..eb3c8c1ae23 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RearrangeTopOfLibraryEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RearrangeTopOfLibraryEffect.java @@ -75,7 +75,6 @@ public class RearrangeTopOfLibraryEffect extends SpellAbilityEffect { final TargetRestrictions tgt = sa.getTargetRestrictions(); - numCards = AbilityUtils.calculateAmount(host, sa.getParam("NumCards"), sa); shuffle = sa.hasParam("MayShuffle"); diff --git a/forge-gui/res/cardsfolder/a/architects_of_will.txt b/forge-gui/res/cardsfolder/a/architects_of_will.txt index 7ff522fce1e..8395de36f40 100644 --- a/forge-gui/res/cardsfolder/a/architects_of_will.txt +++ b/forge-gui/res/cardsfolder/a/architects_of_will.txt @@ -5,6 +5,5 @@ PT:3/3 K:Cycling:UB T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigRearrange | TriggerDescription$ When CARDNAME enters the battlefield, look at the top three cards of target player's library, then put them back in any order. SVar:TrigRearrange:DB$RearrangeTopOfLibrary | ValidTgts$ Player | TgtPrompt$ Choose target player. | NumCards$ 3 -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/architects_of_will.jpg Oracle:When Architects of Will enters the battlefield, look at the top three cards of target player's library, then put them back in any order.\nCycling {U/B} ({U/B}, Discard this card: Draw a card.) diff --git a/forge-gui/res/cardsfolder/c/crystal_seer.txt b/forge-gui/res/cardsfolder/c/crystal_seer.txt index 256ea8438cf..b2e52b49389 100644 --- a/forge-gui/res/cardsfolder/c/crystal_seer.txt +++ b/forge-gui/res/cardsfolder/c/crystal_seer.txt @@ -5,6 +5,5 @@ PT:2/2 A:AB$ ChangeZone | Cost$ 4 U | Origin$ Battlefield | Destination$ Hand | Defined$ Self | SpellDescription$ Return CARDNAME to it's owner's hand. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigRearrange | TriggerDescription$ When CARDNAME enters the battlefield, look at the top four cards of your library, then put them back in any order. SVar:TrigRearrange:DB$ RearrangeTopOfLibrary | Defined$ You | NumCards$ 4 -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/crystal_seer.jpg Oracle:When Crystal Seer enters the battlefield, look at the top four cards of your library, then put them back in any order.\n{4}{U}: Return Crystal Seer to its owner's hand. diff --git a/forge-gui/res/cardsfolder/d/discombobulate.txt b/forge-gui/res/cardsfolder/d/discombobulate.txt index b2f16a187f5..aa302e53ca0 100644 --- a/forge-gui/res/cardsfolder/d/discombobulate.txt +++ b/forge-gui/res/cardsfolder/d/discombobulate.txt @@ -3,6 +3,5 @@ ManaCost:2 U U Types:Instant A:SP$ Counter | Cost$ 2 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | Destination$ Graveyard | SubAbility$ DBRearrange | SpellDescription$ Counter target spell. Look at the top four cards of your library, then put them back in any order. SVar:DBRearrange:DB$RearrangeTopOfLibrary | Defined$ You | NumCards$ 4 -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/discombobulate.jpg Oracle:Counter target spell. Look at the top four cards of your library, then put them back in any order. diff --git a/forge-gui/res/cardsfolder/e/elemental_augury.txt b/forge-gui/res/cardsfolder/e/elemental_augury.txt index 26ce73f50aa..26fffddb961 100644 --- a/forge-gui/res/cardsfolder/e/elemental_augury.txt +++ b/forge-gui/res/cardsfolder/e/elemental_augury.txt @@ -3,6 +3,5 @@ ManaCost:U B R Types:Enchantment A:AB$ RearrangeTopOfLibrary | Cost$ 3 | ValidTgts$ Player | TgtPrompt$ Choose target player. | NumCards$ 3 | SpellDescription$ Look at the top three cards of target player's library, then put them back in any order. SVar:NonStackingEffect:True -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/elemental_augury.jpg Oracle:{3}: Look at the top three cards of target player's library, then put them back in any order. diff --git a/forge-gui/res/cardsfolder/i/index.txt b/forge-gui/res/cardsfolder/i/index.txt index 395f8de160c..35d21daa0ee 100644 --- a/forge-gui/res/cardsfolder/i/index.txt +++ b/forge-gui/res/cardsfolder/i/index.txt @@ -2,6 +2,5 @@ Name:Index ManaCost:U Types:Sorcery A:SP$ RearrangeTopOfLibrary | Cost$ U | Defined$ You | NumCards$ 5 | SpellDescription$ Look at the top five cards of your library, then put them back in any order. -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/index.jpg Oracle:Look at the top five cards of your library, then put them back in any order. diff --git a/forge-gui/res/cardsfolder/m/mirris_guile.txt b/forge-gui/res/cardsfolder/m/mirris_guile.txt index 52505709527..e2fd76a6a35 100644 --- a/forge-gui/res/cardsfolder/m/mirris_guile.txt +++ b/forge-gui/res/cardsfolder/m/mirris_guile.txt @@ -3,7 +3,6 @@ ManaCost:G Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigRearrange | TriggerDescription$ At the beginning of your upkeep, you may look at the top three cards of your library, then put them back in any order. SVar:TrigRearrange:DB$RearrangeTopOfLibrary | Defined$ You | NumCards$ 3 -AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/mirris_guile.jpg Oracle:At the beginning of your upkeep, you may look at the top three cards of your library, then put them back in any order. diff --git a/forge-gui/res/cardsfolder/n/natural_selection.txt b/forge-gui/res/cardsfolder/n/natural_selection.txt index c6aac13b557..cd7291652fa 100644 --- a/forge-gui/res/cardsfolder/n/natural_selection.txt +++ b/forge-gui/res/cardsfolder/n/natural_selection.txt @@ -2,6 +2,5 @@ Name:Natural Selection ManaCost:G Types:Instant A:SP$ RearrangeTopOfLibrary | Cost$ G | ValidTgts$ Player | TgtPrompt$ Choose target player. | NumCards$ 3 | MayShuffle$ True | SpellDescription$ Look at the top 3 cards of target player's library and put them back in any order. You may have that player shuffle their library. -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/natural_selection.jpg Oracle:Look at the top three cards of target player's library, then put them back in any order. You may have that player shuffle their library. diff --git a/forge-gui/res/cardsfolder/o/omen.txt b/forge-gui/res/cardsfolder/o/omen.txt index fd0a0b8f67b..3cf3f4c67ae 100644 --- a/forge-gui/res/cardsfolder/o/omen.txt +++ b/forge-gui/res/cardsfolder/o/omen.txt @@ -3,6 +3,5 @@ ManaCost:1 U Types:Sorcery A:SP$ RearrangeTopOfLibrary | Cost$ 1 U | Defined$ You | NumCards$ 3 | MayShuffle$ True | SubAbility$ DBDraw | SpellDescription$ Look at the top three cards of your library, then put them back in any order. You may shuffle your library. Draw a card. SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 1 -AI:RemoveDeck:All SVar:Picture:http://serv4.tcgimages.eu/img/cards/Portal/omen.jpg Oracle:Look at the top three cards of your library, then put them back in any order. You may shuffle your library.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/p/ponder.txt b/forge-gui/res/cardsfolder/p/ponder.txt index 01915ca2486..72166280e8d 100644 --- a/forge-gui/res/cardsfolder/p/ponder.txt +++ b/forge-gui/res/cardsfolder/p/ponder.txt @@ -3,6 +3,5 @@ ManaCost:U Types:Sorcery A:SP$ RearrangeTopOfLibrary | Cost$ U | Defined$ You | NumCards$ 3 | MayShuffle$ True | SubAbility$ DBDraw | SpellDescription$ Look at the top three cards of your library, then put them back in any order. You may shuffle your library. Draw a card. SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 1 -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/ponder.jpg Oracle:Look at the top three cards of your library, then put them back in any order. You may shuffle your library.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/p/portent.txt b/forge-gui/res/cardsfolder/p/portent.txt index 513d6375f86..91a9b0517b5 100644 --- a/forge-gui/res/cardsfolder/p/portent.txt +++ b/forge-gui/res/cardsfolder/p/portent.txt @@ -4,6 +4,5 @@ Types:Sorcery A:SP$ RearrangeTopOfLibrary | Cost$ U | ValidTgts$ Player | TgtPrompt$ Choose target player. | NumCards$ 3 | MayShuffle$ True | SubAbility$ DelTrigSlowtrip | SpellDescription$ Look at the top three cards of target player's library, then put them back in any order. You may have that player shuffle their library. Draw a card at the beginning of the next turn's upkeep. SVar:DelTrigSlowtrip:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ DrawSlowtrip | TriggerDescription$ Draw a card. SVar:DrawSlowtrip:DB$Draw | NumCards$ 1 | Defined$ You -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/portent.jpg Oracle:Look at the top three cards of target player's library, then put them back in any order. You may have that player shuffle their library.\nDraw a card at the beginning of the next turn's upkeep. diff --git a/forge-gui/res/cardsfolder/s/second_sight.txt b/forge-gui/res/cardsfolder/s/second_sight.txt index 42a59990396..bef5a1b5fd3 100644 --- a/forge-gui/res/cardsfolder/s/second_sight.txt +++ b/forge-gui/res/cardsfolder/s/second_sight.txt @@ -5,6 +5,5 @@ K:Entwine:U A:SP$ Charm | Cost$ 2 U | Choices$ DBRearrange,DBRearrange2 | CharmNum$ 1 SVar:DBRearrange:DB$ RearrangeTopOfLibrary | ValidTgts$ Opponent | TgtPrompt$ Choose target opponent. | NumCards$ 5 | SpellDescription$ Look at the top five cards of target opponent's library, then put them back in any order. SVar:DBRearrange2:DB$ RearrangeTopOfLibrary | Defined$ You | NumCards$ 5 | SpellDescription$ look at the top five cards of your library, then put them back in any order. -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/second_sight.jpg Oracle:Choose one —\n• Look at the top five cards of target opponent's library, then put them back in any order.\n• Look at the top five cards of your library, then put them back in any order.\nEntwine {U} (Choose both if you pay the entwine cost.) diff --git a/forge-gui/res/cardsfolder/s/senseis_divining_top.txt b/forge-gui/res/cardsfolder/s/senseis_divining_top.txt index c8a798ccf24..33f4cf1bca1 100644 --- a/forge-gui/res/cardsfolder/s/senseis_divining_top.txt +++ b/forge-gui/res/cardsfolder/s/senseis_divining_top.txt @@ -1,9 +1,8 @@ Name:Sensei's Divining Top ManaCost:1 Types:Artifact -A:AB$ RearrangeTopOfLibrary | Cost$ 1 | Defined$ You | NumCards$ 3 | SpellDescription$ Look at the top three cards of your library, then put them back in any order. -A:AB$ Draw | Cost$ T | Defined$ You | NumCards$ 1 | SubAbility$ DBChangeZone | SpellDescription$ Draw a card, then put CARDNAME on top of its owner's library. +A:AB$ RearrangeTopOfLibrary | Cost$ 1 | Defined$ You | NumCards$ 3 | AILogic$ Main2BeforeOwnTurn | SpellDescription$ Look at the top three cards of your library, then put them back in any order. +A:AB$ Draw | Cost$ T | Defined$ You | NumCards$ 1 | SubAbility$ DBChangeZone | AILogic$ AtEOTIfActivatedBefore | SpellDescription$ Draw a card, then put CARDNAME on top of its owner's library. SVar:DBChangeZone:DB$ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/senseis_divining_top.jpg Oracle:{1}: Look at the top three cards of your library, then put them back in any order.\n{T}: Draw a card, then put Sensei's Divining Top on top of its owner's library. diff --git a/forge-gui/res/cardsfolder/s/spire_owl.txt b/forge-gui/res/cardsfolder/s/spire_owl.txt index 2f00e0eb4ca..a2a3492f6b4 100644 --- a/forge-gui/res/cardsfolder/s/spire_owl.txt +++ b/forge-gui/res/cardsfolder/s/spire_owl.txt @@ -5,6 +5,5 @@ PT:1/1 K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigRearrange | TriggerDescription$ When CARDNAME enters the battlefield, look at the top four cards of your library, then put them back in any order. SVar:TrigRearrange:DB$RearrangeTopOfLibrary | Defined$ You | NumCards$ 4 -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/spire_owl.jpg Oracle:Flying\nWhen Spire Owl enters the battlefield, look at the top four cards of your library, then put them back in any order. diff --git a/forge-gui/res/cardsfolder/t/tahngarths_glare.txt b/forge-gui/res/cardsfolder/t/tahngarths_glare.txt index 8956e352816..4a93cd22383 100644 --- a/forge-gui/res/cardsfolder/t/tahngarths_glare.txt +++ b/forge-gui/res/cardsfolder/t/tahngarths_glare.txt @@ -3,6 +3,5 @@ ManaCost:R Types:Sorcery A:SP$ RearrangeTopOfLibrary | Cost$ R | ValidTgts$ Opponent | NumCards$ 3 | SubAbility$ DBRearange | SpellDescription$ Look at the top three cards of target opponent's library, then put them back in any order. That player looks at the top three cards of your library, then puts them back in any order. SVar:DBRearange:DB$ RearrangeTopOfLibrary | Defined$ You | RearrangePlayer$ Targeted | NumCards$ 3 -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tahngarths_glare.jpg Oracle:Look at the top three cards of target opponent's library, then put them back in any order. That player looks at the top three cards of your library, then puts them back in any order. From 25e3d17cdf338ff064f1d60842eb4e075cb55b85 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 25 Nov 2018 07:42:23 +0300 Subject: [PATCH 228/901] - Tweaked RearrangeTopOfLibraryAI a little. --- .../forge/ai/ability/RearrangeTopOfLibraryAi.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) 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 e4486ed4e17..78790fbcdba 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RearrangeTopOfLibraryAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RearrangeTopOfLibraryAi.java @@ -23,9 +23,10 @@ public class RearrangeTopOfLibraryAi extends SpellAbilityAi { @Override protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) { // Specific details of ordering cards are handled by PlayerControllerAi#orderMoveToZoneList - final PhaseHandler ph = aiPlayer.getGame().getPhaseHandler(); - if (sa.getHostCard().isPermanent() && sa.getPayCosts() != null + final Card source = sa.getHostCard(); + + if (source.isPermanent() && sa.getPayCosts() != null && (sa.getPayCosts().hasTapCost() || sa.getPayCosts().hasManaCost())) { // If it has an associated cost, try to only do this before own turn unless there are special logic considerations if ("Main2BeforeOwnTurn".equals(sa.getParam("AILogic")) && !(ph.is(PhaseType.MAIN2) && ph.getNextTurn() == aiPlayer)) { @@ -36,10 +37,9 @@ public class RearrangeTopOfLibraryAi extends SpellAbilityAi { } // Do it once per turn, generally (may be improved later) - if (AiCardMemory.isRememberedCard(aiPlayer, sa.getHostCard(), AiCardMemory.MemorySet.ACTIVATED_THIS_TURN)) { + if (AiCardMemory.isRememberedCardByName(aiPlayer, source.getName(), AiCardMemory.MemorySet.ACTIVATED_THIS_TURN)) { return false; } - AiCardMemory.rememberCard(aiPlayer, sa.getHostCard(), AiCardMemory.MemorySet.ACTIVATED_THIS_TURN); final TargetRestrictions tgt = sa.getTargetRestrictions(); @@ -62,8 +62,14 @@ public class RearrangeTopOfLibraryAi extends SpellAbilityAi { } else { return false; // could not find a valid target } + + if (!canTgtHuman || !canTgtAI) { + // can't target another player anyway, remember for no second activation this turn + AiCardMemory.rememberCard(aiPlayer, source, AiCardMemory.MemorySet.ACTIVATED_THIS_TURN); + } } else { // if it's just defined, no big deal + AiCardMemory.rememberCard(aiPlayer, source, AiCardMemory.MemorySet.ACTIVATED_THIS_TURN); } return true; From 0f384047899ff0a5f21e7278f1ddd5d1c884573a Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 25 Nov 2018 13:49:27 +0300 Subject: [PATCH 229/901] - Updating CHANGES.txt --- forge-gui/release-files/CHANGES.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/forge-gui/release-files/CHANGES.txt b/forge-gui/release-files/CHANGES.txt index 372e3454bc2..2a0aa537709 100644 --- a/forge-gui/release-files/CHANGES.txt +++ b/forge-gui/release-files/CHANGES.txt @@ -1,3 +1,6 @@ +- AI Improvements - +A new round of AI improvements went into the game, hopefully making the game a little more interesting and exciting to play. In particular, certain improvements regarding Flash were implemented, the AI is now able to use cards which reorder the top of the library, such as Ponder or Portent, and several logic-related bugs were fixed. Also, the AI has been optimized a little, hopefully making it a bit faster, especially on mobile platforms, in situations where there are a lot of cards on the battlefield but the AI has little or nothing to do. + - Planar Conquest: Guilds of Ravnica - Cards from Guilds of Ravnica are now available on the Ravnica plane in Planar Conquest. Several events on this plane have been updated or changed to feature Guilds of Ravnica cards as well. Please note that Planar Conquest is currently only available on Android and the macOS mobile backport. From fc2ba648c66aafb2cfcbb530c8b0cdb09ed2660f Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 25 Nov 2018 20:32:45 +0300 Subject: [PATCH 230/901] - Fix Protection from X mechanic. --- forge-game/src/main/java/forge/game/card/Card.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 7ca8e45317b..7374f78f137 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -4954,7 +4954,7 @@ public class Card extends GameEntity implements Comparable { } // Protection only works on the Battlefield - if (isInZone(ZoneType.Battlefield)) { + if (!isInZone(ZoneType.Battlefield)) { return false; } From 69259367f500bc20b96ee0f540ad4cb554cad477 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 25 Nov 2018 21:53:47 +0300 Subject: [PATCH 231/901] - Fixed Chaos Wand. --- forge-gui/res/cardsfolder/c/chaos_wand.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/c/chaos_wand.txt b/forge-gui/res/cardsfolder/c/chaos_wand.txt index c97d34838cd..6c22e253f0a 100644 --- a/forge-gui/res/cardsfolder/c/chaos_wand.txt +++ b/forge-gui/res/cardsfolder/c/chaos_wand.txt @@ -2,7 +2,7 @@ Name:Chaos Wand ManaCost:3 Types:Artifact A:AB$ DigUntil | Cost$ 4 T | ValidTgts$ Opponent | Valid$ Instant,Sorcery | ValidDescription$ instant or sorcery | FoundDestination$ Exile | RevealedDestination$ Exile | RememberFound$ True | RememberRevealed$ True | IsCurse$ True | SubAbility$ DBPlay | SpellDescription$ Target opponent exiles cards from the top of their library until they exile an instant or sorcery card. You may cast that card without paying its mana cost. -SVar:DBPlay:DB$ Play | Defined$ Remembered | ValidZone$ Exile | Valid$ Instant.IsRemembered,Sorcery.IsRemembered | WithoutManaCost$ True | RememberObjects$ Remembered | Optional$ True | SubAbility$ DBRestRandomOrder +SVar:DBPlay:DB$ Play | Defined$ Remembered | ValidZone$ Exile | Valid$ Instant.IsRemembered,Sorcery.IsRemembered | WithoutManaCost$ True | RememberObjects$ Remembered | Optional$ True | ForgetTargetRemembered$ True | SubAbility$ DBRestRandomOrder SVar:DBRestRandomOrder:DB$ ChangeZone | Defined$ Remembered | AtRandom$ True | Origin$ Library | Destination$ Library | LibraryPosition$ -1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/chaos_wand.jpg From 5a9e9f74c0d400855690a9245fb586dae3624717 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 26 Nov 2018 09:09:32 +0300 Subject: [PATCH 232/901] - Fixed a logic error which caused the AI not to equip legendary equipments. --- forge-ai/src/main/java/forge/ai/ability/AttachAi.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index d40c2cf9c07..839f6c60bd7 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -22,6 +22,7 @@ import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.player.PlayerActionConfirmMode; import forge.game.spellability.SpellAbility; +import forge.game.spellability.SpellPermanent; import forge.game.spellability.TargetRestrictions; import forge.game.staticability.StaticAbility; import forge.game.trigger.Trigger; @@ -61,7 +62,7 @@ public class AttachAi extends SpellAbilityAi { } if (!ai.getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noLegendRule) - && source.getType().isLegendary() + && source.getType().isLegendary() && sa instanceof SpellPermanent && ai.isCardInPlay(source.getName())) { // Don't play the second copy of a legendary enchantment already in play From 8e527bd08f779db99049d4c5b54707de563ba0f4 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 26 Nov 2018 09:10:19 +0300 Subject: [PATCH 233/901] - Preparing Forge for Android publish 1.6.18.004 [hotfix]. --- 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 7183dcb958b..2da90f8fa28 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -6,7 +6,7 @@ jar -Xms1024m -Xmx1536m - 1.6.18.003 + 1.6.18.004 keystore alias storepass diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index 0927ec46729..91453102f8e 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -6,7 +6,7 @@ jar -Xms128m -Xmx2048m - 1.6.18.003 + 1.6.18.004 diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index 306b59a3b13..73f4c8a2ed3 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.18.003"; + public static final String CURRENT_VERSION = "1.6.18.004"; private static final ApplicationListener app = new Forge(); private static Clipboard clipboard; From 6e85f816d1e4f07be5fbb812bc9639ff25285b70 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 26 Nov 2018 09:46:38 +0300 Subject: [PATCH 234/901] - Fixed a NPE when planeswalking to Interplanar Tunnel in Planechase mode (also affects other corner cases when picking from an exotic game zone with no defined icon). --- forge-gui-mobile/src/forge/screens/match/MatchController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/forge-gui-mobile/src/forge/screens/match/MatchController.java b/forge-gui-mobile/src/forge/screens/match/MatchController.java index cc0af8a78e0..4e7fb644f00 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchController.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchController.java @@ -492,7 +492,8 @@ public class MatchController extends AbstractGuiGame { final Collection revealList = delayedReveal.getCards(); final String revealListCaption = StringUtils.capitalize(MessageUtil.formatMessage("{player's} " + delayedReveal.getZone().name(), delayedReveal.getOwner(), delayedReveal.getOwner())); - final FImage revealListImage = MatchController.getView().getPlayerPanels().values().iterator().next().getZoneTab(delayedReveal.getZone()).getIcon(); + final InfoTab revealListTab = MatchController.getView().getPlayerPanels().values().iterator().next().getZoneTab(delayedReveal.getZone()); + final FImage revealListImage = revealListTab != null ? revealListTab.getIcon() : null; //use special dialog for choosing card and offering ability to see all revealed cards at the same time return new WaitCallback() { From 0555cf65360eb95cfdf5952374d7fb49d3d81797 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 26 Nov 2018 19:31:20 +0300 Subject: [PATCH 235/901] - Better AI logic for Sensei's Divining Top. --- forge-ai/src/main/java/forge/ai/AiController.java | 7 +++++-- forge-ai/src/main/java/forge/ai/ability/DrawAi.java | 5 ++--- .../java/forge/ai/ability/RearrangeTopOfLibraryAi.java | 6 ++---- forge-gui/res/cardsfolder/s/senseis_divining_top.txt | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index f06378720bd..3a6febb3944 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -1392,8 +1392,11 @@ public class AiController { private final SpellAbility getSpellAbilityToPlay() { // if top of stack is owned by me if (!game.getStack().isEmpty() && game.getStack().peekAbility().getActivatingPlayer().equals(player)) { - // probably should let my stuff resolve - return null; + boolean canRespondToSelf = game.getStack().peekAbility().hasParam("AIRespondsToOwnAbility"); + if (!canRespondToSelf) { + // probably should let my stuff resolve + return null; + } } final CardCollection cards = ComputerUtilAbility.getAvailableCards(game, player); diff --git a/forge-ai/src/main/java/forge/ai/ability/DrawAi.java b/forge-ai/src/main/java/forge/ai/ability/DrawAi.java index 3f16073a7a7..df7ac314437 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DrawAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DrawAi.java @@ -131,9 +131,8 @@ public class DrawAi extends SpellAbilityAi { return true; } else if (logic.equals("AlwaysAtOppEOT")) { return ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn().equals(ai); - } else if (logic.equals("AtEOTIfActivatedBefore")) { - return AiCardMemory.isRememberedCard(ai, sa.getHostCard(), AiCardMemory.MemorySet.ACTIVATED_THIS_TURN) - && ph.is(PhaseType.END_OF_TURN); + } else if (logic.equals("RespondToOwnActivation")) { + return !ai.getGame().getStack().isEmpty() && ai.getGame().getStack().peekAbility().getHostCard().equals(sa.getHostCard()); } // Don't use draw abilities before main 2 if possible 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 78790fbcdba..20f92caa50c 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RearrangeTopOfLibraryAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RearrangeTopOfLibraryAi.java @@ -28,10 +28,8 @@ public class RearrangeTopOfLibraryAi extends SpellAbilityAi { if (source.isPermanent() && sa.getPayCosts() != null && (sa.getPayCosts().hasTapCost() || sa.getPayCosts().hasManaCost())) { - // If it has an associated cost, try to only do this before own turn unless there are special logic considerations - if ("Main2BeforeOwnTurn".equals(sa.getParam("AILogic")) && !(ph.is(PhaseType.MAIN2) && ph.getNextTurn() == aiPlayer)) { - return false; - } else if (!sa.hasParam("AILogic") && !(ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn() == aiPlayer)) { + // If it has an associated cost, try to only do this before own turn + if (!(ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn() == aiPlayer)) { return false; } } diff --git a/forge-gui/res/cardsfolder/s/senseis_divining_top.txt b/forge-gui/res/cardsfolder/s/senseis_divining_top.txt index 33f4cf1bca1..653ee4e6030 100644 --- a/forge-gui/res/cardsfolder/s/senseis_divining_top.txt +++ b/forge-gui/res/cardsfolder/s/senseis_divining_top.txt @@ -1,8 +1,8 @@ Name:Sensei's Divining Top ManaCost:1 Types:Artifact -A:AB$ RearrangeTopOfLibrary | Cost$ 1 | Defined$ You | NumCards$ 3 | AILogic$ Main2BeforeOwnTurn | SpellDescription$ Look at the top three cards of your library, then put them back in any order. -A:AB$ Draw | Cost$ T | Defined$ You | NumCards$ 1 | SubAbility$ DBChangeZone | AILogic$ AtEOTIfActivatedBefore | SpellDescription$ Draw a card, then put CARDNAME on top of its owner's library. +A:AB$ RearrangeTopOfLibrary | Cost$ 1 | Defined$ You | NumCards$ 3 | AILogic$ EOTBeforeOwnTurn | AIRespondsToOwnAbility$ True | SpellDescription$ Look at the top three cards of your library, then put them back in any order. +A:AB$ Draw | Cost$ T | Defined$ You | NumCards$ 1 | SubAbility$ DBChangeZone | AILogic$ RespondToOwnActivation | SpellDescription$ Draw a card, then put CARDNAME on top of its owner's library. SVar:DBChangeZone:DB$ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 SVar:Picture:http://www.wizards.com/global/images/magic/general/senseis_divining_top.jpg Oracle:{1}: Look at the top three cards of your library, then put them back in any order.\n{T}: Draw a card, then put Sensei's Divining Top on top of its owner's library. From c4cf1236260a568d0cd77d78fc97e8b9699e896f Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 26 Nov 2018 20:22:31 +0300 Subject: [PATCH 236/901] - Fixed AnimateAi logic for cards like Genju of the Falls. Added an AI logic param to Azami, Lady of Scrolls. --- forge-ai/src/main/java/forge/ai/ability/AnimateAi.java | 6 +++--- forge-gui/res/cardsfolder/a/azami_lady_of_scrolls.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) 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 f9c49986042..494c10c10c8 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java @@ -149,15 +149,15 @@ public class AnimateAi extends SpellAbilityAi { if (!bFlag && c.isCreature() && (sa.hasParam("Permanent") || (!c.isTapped() && !c.isSick()))) { int power = -5; if (sa.hasParam("Power")) { - power = AbilityUtils.calculateAmount(source, sa.getParam("Power"), sa); + power = AbilityUtils.calculateAmount(c, sa.getParam("Power"), sa); } int toughness = -5; if (sa.hasParam("Toughness")) { - toughness = AbilityUtils.calculateAmount(source, sa.getParam("Toughness"), sa); + toughness = AbilityUtils.calculateAmount(c, sa.getParam("Toughness"), sa); } if (sa.hasParam("Keywords")) { for (String keyword : sa.getParam("Keywords").split(" & ")) { - if (!source.hasKeyword(keyword)) { + if (!c.hasKeyword(keyword)) { bFlag = true; } } diff --git a/forge-gui/res/cardsfolder/a/azami_lady_of_scrolls.txt b/forge-gui/res/cardsfolder/a/azami_lady_of_scrolls.txt index 476b1766003..aa6f5c1997c 100644 --- a/forge-gui/res/cardsfolder/a/azami_lady_of_scrolls.txt +++ b/forge-gui/res/cardsfolder/a/azami_lady_of_scrolls.txt @@ -2,7 +2,7 @@ Name:Azami, Lady of Scrolls ManaCost:2 U U U Types:Legendary Creature Human Wizard PT:0/2 -A:AB$ Draw | Cost$ tapXType<1/Wizard> | NumCards$ 1 | SpellDescription$ Draw a card. +A:AB$ Draw | Cost$ tapXType<1/Wizard> | NumCards$ 1 | AILogic$ AlwaysAtOppEOT | SpellDescription$ Draw a card. AI:RemoveDeck:Random DeckHints:Type$Wizard SVar:Picture:http://www.wizards.com/global/images/magic/general/azami_lady_of_scrolls.jpg From e38a17c844c470c8cb69a5dee8d221bb838ff0ca Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 26 Nov 2018 21:13:32 +0300 Subject: [PATCH 237/901] - Added puzzle PS_GRN8. --- forge-gui/res/puzzle/PS_GRN8.pzl | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 forge-gui/res/puzzle/PS_GRN8.pzl diff --git a/forge-gui/res/puzzle/PS_GRN8.pzl b/forge-gui/res/puzzle/PS_GRN8.pzl new file mode 100644 index 00000000000..a8a1346d985 --- /dev/null +++ b/forge-gui/res/puzzle/PS_GRN8.pzl @@ -0,0 +1,18 @@ +[metadata] +Name:Possibility Storm - Guilds of Ravnica #08 +URL:https://i2.wp.com/www.possibilitystorm.com/wp-content/uploads/2018/11/090.-GRB8.jpg +Goal:Win +Turns:1 +Difficulty:Uncommon +Description:Win this turn. There are nine cards in your graveyard. Your opponent's graveyard is empty. Assume your opponent has {4}{G}{G} available. +[state] +humanlife=20 +ailife=7 +turn=1 +aipersistentmana=C C C C G G +activeplayer=human +activephase=MAIN1 +humanhand=Find // Finality;Dead Weight;Gruesome Menagerie;March of the Drowned +humangraveyard=Chamber Sentry;Crucible of Worlds;Detection Tower;Centaur Courser;Sailor of Means;Mox Amber;Talons of Wildwood;Diamond Mare;Vicious Conquistador +humanbattlefield=Mistcaller;Muldrotha, the Gravetide;Epicure of Blood;Memorial to Folly;Memorial to Folly;Memorial to Folly;Watery Grave|NoETBTrigs;Watery Grave|NoETBTrigs;Watery Grave|NoETBTrigs;Watery Grave|NoETBTrigs;Overgrown Tomb|NoETBTrigs;Overgrown Tomb|NoETBTrigs;Overgrown Tomb|NoETBTrigs;Overgrown Tomb|NoETBTrigs +aibattlefield=Adeliz, the Cinder Wind;Rekindling Phoenix;Rekindling Phoenix;Shalai, Voice of Plenty;Hunted Witness From 770472c34e98270442f2ff17e8599d455b1b4a74 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Tue, 27 Nov 2018 07:08:14 +0100 Subject: [PATCH 238/901] Captains Hook: fix Trigger --- forge-gui/res/cardsfolder/c/captains_hook.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/c/captains_hook.txt b/forge-gui/res/cardsfolder/c/captains_hook.txt index 1a506bdc074..966dbaeb751 100644 --- a/forge-gui/res/cardsfolder/c/captains_hook.txt +++ b/forge-gui/res/cardsfolder/c/captains_hook.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact Equipment K:Equip:1 S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddToughness$ 0 | AddType$ Pirate | AddKeyword$ Menace | Description$ Equipped creature gets +2/+0, has menace, and is a Pirate in addition to its other creature types. -T:Mode$ Unequip | ValidAttachment$ Card.Self | ValidObject$ Permanent | Execute$ TrigDestroy | TriggerDescription$ Whenever CARDNAME becomes unattached from a permanent, destroy that permanent. +T:Mode$ Unattach | ValidAttachment$ Card.Self | ValidObject$ Permanent | Execute$ TrigDestroy | TriggerDescription$ Whenever CARDNAME becomes unattached from a permanent, destroy that permanent. SVar:TrigDestroy:DB$Destroy | Defined$ TriggeredObject Oracle:Equipped creature gets +2/+0, has menace, and is a Pirate in addition to its other creature types.\nWhenever Captain's Hook becomes unattached from a permanent, destroy that permanent.\nEquip {1} From ed556ba2a76d596276f8accac747f7a3ab168e01 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 27 Nov 2018 10:53:44 +0300 Subject: [PATCH 239/901] - Implemented logic for CopySpellAbilityAi. --- .../src/main/java/forge/ai/AiController.java | 45 ++++++++++++++++--- forge-ai/src/main/java/forge/ai/AiProps.java | 1 + .../java/forge/ai/ComputerUtilAbility.java | 11 +++++ .../forge/ai/ability/CopySpellAbilityAi.java | 45 +++++++++++++++++-- forge-gui/res/ai/Cautious.ai | 4 ++ forge-gui/res/ai/Default.ai | 4 ++ forge-gui/res/ai/Experimental.ai | 4 ++ forge-gui/res/ai/Reckless.ai | 4 ++ 8 files changed, 107 insertions(+), 11 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 3a6febb3944..bc24e69de07 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -1390,15 +1390,40 @@ public class AiController { } private final SpellAbility getSpellAbilityToPlay() { - // if top of stack is owned by me - if (!game.getStack().isEmpty() && game.getStack().peekAbility().getActivatingPlayer().equals(player)) { - boolean canRespondToSelf = game.getStack().peekAbility().hasParam("AIRespondsToOwnAbility"); - if (!canRespondToSelf) { - // probably should let my stuff resolve + final CardCollection cards = ComputerUtilAbility.getAvailableCards(game, player); + List saList = Lists.newArrayList(); + + SpellAbility top = null; + if (!game.getStack().isEmpty()) { + top = game.getStack().peekAbility(); + } + final boolean topOwnedByAI = top != null && top.getActivatingPlayer().equals(player); + + if (topOwnedByAI) { + final boolean mustRespond = top.hasParam("AIRespondsToOwnAbility"); + final int chanceToCopy = getIntProperty(AiProps.CHANCE_TO_COPY_OWN_SPELL_WHILE_ON_STACK); + + if (!mustRespond) { + if (chanceToCopy == 0) { + // The AI profile asks not to respond to own spells on stack (MustRespond is a script-defined exception). + return null; + } else { + saList = ComputerUtilAbility.getSpellAbilities(cards, player); // get the SA list early to check for copy SAs + if (ComputerUtilAbility.getFirstCopySASpell(saList) == null) { + // The AI currently responds to its own spell on stack only with copy spells (e.g. Twincast). + // If there are none, don't respond. + return null; + } + } + } + + // if top of the stack is owned by me, probably should let my stuff resolve unless I want to copy my spell on stack + // or if there are special considerations (e.g. scripted response for Sensei's Divining Top) + boolean wantToRespondToStack = mustRespond || MyRandom.percentTrue(chanceToCopy); + if (!wantToRespondToStack) { return null; } } - final CardCollection cards = ComputerUtilAbility.getAvailableCards(game, player); if (!game.getStack().isEmpty()) { SpellAbility counter = chooseCounterSpell(getPlayableCounters(cards)); @@ -1409,7 +1434,13 @@ public class AiController { return counterETB; } - return chooseSpellAbilityToPlayFromList(ComputerUtilAbility.getSpellAbilities(cards, player), true); + if (saList.isEmpty()) { + saList = ComputerUtilAbility.getSpellAbilities(cards, player); + } + + SpellAbility chosenSa = chooseSpellAbilityToPlayFromList(saList, true); + + return chosenSa; } private SpellAbility chooseSpellAbilityToPlayFromList(final List all, boolean skipCounter) { diff --git a/forge-ai/src/main/java/forge/ai/AiProps.java b/forge-ai/src/main/java/forge/ai/AiProps.java index 50a8413dff6..dd43168d764 100644 --- a/forge-ai/src/main/java/forge/ai/AiProps.java +++ b/forge-ai/src/main/java/forge/ai/AiProps.java @@ -69,6 +69,7 @@ public enum AiProps { /** */ ALWAYS_COUNTER_PUMP_SPELLS ("true"), /** */ ALWAYS_COUNTER_AURAS ("true"), /** */ ALWAYS_COUNTER_SPELLS_FROM_NAMED_CARDS (""), /** */ + CHANCE_TO_COPY_OWN_SPELL_WHILE_ON_STACK ("30"), /** */ ACTIVELY_DESTROY_ARTS_AND_NONAURA_ENCHS ("true"), /** */ ACTIVELY_DESTROY_IMMEDIATELY_UNBLOCKABLE ("false"), /** */ DESTROY_IMMEDIATELY_UNBLOCKABLE_THRESHOLD ("2"), /** */ diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java index b4c88471be3..b1df18b97ce 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java @@ -128,6 +128,17 @@ public class ComputerUtilAbility { return tgtSA; } + public static SpellAbility getFirstCopySASpell(List spells) { + SpellAbility sa = null; + for (SpellAbility spell : spells) { + if (spell.getApi() == ApiType.CopySpellAbility) { + sa = spell; + break; + } + } + return sa; + } + public static Card getAbilitySource(SpellAbility sa) { return sa.getOriginalHost() != null ? sa.getOriginalHost() : sa.getHostCard(); } diff --git a/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java b/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java index 55a0804a562..f3f32acf5f7 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java @@ -1,10 +1,17 @@ package forge.ai.ability; +import forge.ai.AiPlayDecision; +import forge.ai.PlayerControllerAi; import forge.ai.SpecialCardAi; import forge.ai.SpellAbilityAi; +import forge.game.Game; +import forge.game.ability.ApiType; import forge.game.player.Player; import forge.game.player.PlayerActionConfirmMode; +import forge.game.spellability.AbilityActivated; +import forge.game.spellability.Spell; import forge.game.spellability.SpellAbility; +import forge.game.spellability.TargetRestrictions; import java.util.List; import java.util.Map; @@ -13,7 +20,39 @@ public class CopySpellAbilityAi extends SpellAbilityAi { @Override protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) { - // the AI should not miss mandatory activations (e.g. Precursor Golem trigger) + Game game = aiPlayer.getGame(); + if (game.getStack().isEmpty()) { + return sa.isMandatory(); // FIXME: Are mandatory activations possible in the canPlayAI code path? + } + + final TargetRestrictions tgt = sa.getTargetRestrictions(); + if (tgt != null) { + final SpellAbility top = game.getStack().peekAbility(); + if (top.getApi() == ApiType.CopySpellAbility) { + // Don't try to copy a copy ability, too complex for the AI to handle + return false; + } + + // A copy is necessary to properly test the SA before targeting the copied spell, otherwise the copy SA will fizzle. + final SpellAbility topCopy = top.copy(aiPlayer); + topCopy.resetTargets(); + + if (top.canBeTargetedBy(sa)) { + AiPlayDecision decision = AiPlayDecision.CantPlaySa; + if (top instanceof Spell) { + decision = ((PlayerControllerAi) aiPlayer.getController()).getAi().canPlayFromEffectAI((Spell) topCopy, true, true); + } else if (top instanceof AbilityActivated && top.getActivatingPlayer().equals(aiPlayer) + && "CopyActivatedAbilities".equals(sa.getParam("AILogic"))) { + decision = AiPlayDecision.WillPlay; // FIXME: we activated it once, why not again? Or bad idea? + } + if (decision == AiPlayDecision.WillPlay) { + sa.getTargets().add(top); + return true; + } + } + } + + // the AI should not miss mandatory activations return sa.isMandatory() || "Always".equals(sa.getParam("AILogic")); } @@ -25,15 +64,13 @@ public class CopySpellAbilityAi extends SpellAbilityAi { @Override public boolean chkAIDrawback(final SpellAbility sa, final Player aiPlayer) { - // NOTE: Other SAs that use CopySpellAbilityAi (e.g. Chain Lightning) are currently routed through - // generic method SpellAbilityAi#chkDrawbackWithSubs and are handled there. if ("ChainOfSmog".equals(sa.getParam("AILogic"))) { return SpecialCardAi.ChainOfSmog.consider(aiPlayer, sa); } else if ("ChainOfAcid".equals(sa.getParam("AILogic"))) { return SpecialCardAi.ChainOfAcid.consider(aiPlayer, sa); } - return super.chkAIDrawback(sa, aiPlayer); + return canPlayAI(aiPlayer, sa); } @Override diff --git a/forge-gui/res/ai/Cautious.ai b/forge-gui/res/ai/Cautious.ai index 6c765eeb1a7..5a350cd968c 100644 --- a/forge-gui/res/ai/Cautious.ai +++ b/forge-gui/res/ai/Cautious.ai @@ -133,6 +133,10 @@ ALWAYS_COUNTER_PUMP_SPELLS=false ALWAYS_COUNTER_AURAS=true ALWAYS_COUNTER_SPELLS_FROM_NAMED_CARDS=None +# Copy spell on stack logic +# The chance that the AI will copy its own stack right after placing it there while it has priority +CHANCE_TO_COPY_OWN_SPELL_WHILE_ON_STACK=0 + # Storm spell logic PRIORITY_REDUCTION_FOR_STORM_SPELLS=9 MIN_COUNT_FOR_STORM_SPELLS=1 diff --git a/forge-gui/res/ai/Default.ai b/forge-gui/res/ai/Default.ai index e4844b9eeac..61dc79aa939 100644 --- a/forge-gui/res/ai/Default.ai +++ b/forge-gui/res/ai/Default.ai @@ -133,6 +133,10 @@ ALWAYS_COUNTER_PUMP_SPELLS=true ALWAYS_COUNTER_AURAS=true ALWAYS_COUNTER_SPELLS_FROM_NAMED_CARDS=None +# Copy spell on stack logic +# The chance that the AI will copy its own stack right after placing it there while it has priority +CHANCE_TO_COPY_OWN_SPELL_WHILE_ON_STACK=30 + # Storm spell logic PRIORITY_REDUCTION_FOR_STORM_SPELLS=0 MIN_COUNT_FOR_STORM_SPELLS=0 diff --git a/forge-gui/res/ai/Experimental.ai b/forge-gui/res/ai/Experimental.ai index aa49163c7bb..ba82a3d6ae3 100644 --- a/forge-gui/res/ai/Experimental.ai +++ b/forge-gui/res/ai/Experimental.ai @@ -133,6 +133,10 @@ ALWAYS_COUNTER_PUMP_SPELLS=true ALWAYS_COUNTER_AURAS=true ALWAYS_COUNTER_SPELLS_FROM_NAMED_CARDS=None +# Copy spell on stack logic +# The chance that the AI will copy its own stack right after placing it there while it has priority +CHANCE_TO_COPY_OWN_SPELL_WHILE_ON_STACK=30 + # Storm spell logic PRIORITY_REDUCTION_FOR_STORM_SPELLS=9 MIN_COUNT_FOR_STORM_SPELLS=1 diff --git a/forge-gui/res/ai/Reckless.ai b/forge-gui/res/ai/Reckless.ai index 186c1cf1c7e..b5b308473a4 100644 --- a/forge-gui/res/ai/Reckless.ai +++ b/forge-gui/res/ai/Reckless.ai @@ -133,6 +133,10 @@ ALWAYS_COUNTER_PUMP_SPELLS=true ALWAYS_COUNTER_AURAS=true ALWAYS_COUNTER_SPELLS_FROM_NAMED_CARDS=None +# Copy spell on stack logic +# The chance that the AI will copy its own stack right after placing it there while it has priority +CHANCE_TO_COPY_OWN_SPELL_WHILE_ON_STACK=50 + # Storm spell logic PRIORITY_REDUCTION_FOR_STORM_SPELLS=0 MIN_COUNT_FOR_STORM_SPELLS=0 From 2c106e9f04b0e2cd6524f8bdbd300d37b2ba183f Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 27 Nov 2018 11:34:41 +0300 Subject: [PATCH 240/901] - Move the chance-based logic out of AiController, implement several AI logic flags for cards. --- .../src/main/java/forge/ai/AiController.java | 22 ++++------------ .../forge/ai/ability/CopySpellAbilityAi.java | 26 ++++++++++++++----- .../res/cardsfolder/i/izzet_guildmage.txt | 5 ++-- 3 files changed, 26 insertions(+), 27 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index bc24e69de07..e864ce31dcd 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -1400,29 +1400,17 @@ public class AiController { final boolean topOwnedByAI = top != null && top.getActivatingPlayer().equals(player); if (topOwnedByAI) { + // AI's own spell: should probably let my stuff resolve first, but may want to copy the SA or respond to it + // in a scripted timed fashion. final boolean mustRespond = top.hasParam("AIRespondsToOwnAbility"); - final int chanceToCopy = getIntProperty(AiProps.CHANCE_TO_COPY_OWN_SPELL_WHILE_ON_STACK); if (!mustRespond) { - if (chanceToCopy == 0) { - // The AI profile asks not to respond to own spells on stack (MustRespond is a script-defined exception). + saList = ComputerUtilAbility.getSpellAbilities(cards, player); // get the SA list early to check for copy SAs + if (ComputerUtilAbility.getFirstCopySASpell(saList) == null) { + // Nothing to copy the spell with, so do nothing. return null; - } else { - saList = ComputerUtilAbility.getSpellAbilities(cards, player); // get the SA list early to check for copy SAs - if (ComputerUtilAbility.getFirstCopySASpell(saList) == null) { - // The AI currently responds to its own spell on stack only with copy spells (e.g. Twincast). - // If there are none, don't respond. - return null; - } } } - - // if top of the stack is owned by me, probably should let my stuff resolve unless I want to copy my spell on stack - // or if there are special considerations (e.g. scripted response for Sensei's Divining Top) - boolean wantToRespondToStack = mustRespond || MyRandom.percentTrue(chanceToCopy); - if (!wantToRespondToStack) { - return null; - } } if (!game.getStack().isEmpty()) { diff --git a/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java b/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java index f3f32acf5f7..12879a36a9f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java @@ -1,9 +1,6 @@ package forge.ai.ability; -import forge.ai.AiPlayDecision; -import forge.ai.PlayerControllerAi; -import forge.ai.SpecialCardAi; -import forge.ai.SpellAbilityAi; +import forge.ai.*; import forge.game.Game; import forge.game.ability.ApiType; import forge.game.player.Player; @@ -12,6 +9,7 @@ import forge.game.spellability.AbilityActivated; import forge.game.spellability.Spell; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; +import forge.util.MyRandom; import java.util.List; import java.util.Map; @@ -21,14 +19,27 @@ public class CopySpellAbilityAi extends SpellAbilityAi { @Override protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) { Game game = aiPlayer.getGame(); - if (game.getStack().isEmpty()) { - return sa.isMandatory(); // FIXME: Are mandatory activations possible in the canPlayAI code path? + final int chance = ((PlayerControllerAi)aiPlayer.getController()).getAi().getIntProperty(AiProps.CHANCE_TO_COPY_OWN_SPELL_WHILE_ON_STACK); + + if (game.getStack().isEmpty() + || (!MyRandom.percentTrue(chance) && !"AlwaysIfViable".equals(sa.getParam("AILogic"))) + && !"OnceIfViable".equals(sa.getParam("AILogic"))) { + return false; + } + + if ("OnceIfViable".equals(sa.getParam("AILogic"))) { + if (AiCardMemory.isRememberedCard(aiPlayer, sa.getHostCard(), AiCardMemory.MemorySet.ACTIVATED_THIS_TURN)) { + return false; + } } final TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt != null) { final SpellAbility top = game.getStack().peekAbility(); - if (top.getApi() == ApiType.CopySpellAbility) { + if (top.isWrapper() || !(top instanceof SpellAbility || top instanceof AbilityActivated)) { + // Should even try with triggered or wrapped abilities first, will crash + return false; + } else if (top.getApi() == ApiType.CopySpellAbility) { // Don't try to copy a copy ability, too complex for the AI to handle return false; } @@ -47,6 +58,7 @@ public class CopySpellAbilityAi extends SpellAbilityAi { } if (decision == AiPlayDecision.WillPlay) { sa.getTargets().add(top); + AiCardMemory.rememberCard(aiPlayer, sa.getHostCard(), AiCardMemory.MemorySet.ACTIVATED_THIS_TURN); return true; } } diff --git a/forge-gui/res/cardsfolder/i/izzet_guildmage.txt b/forge-gui/res/cardsfolder/i/izzet_guildmage.txt index 963e1177204..39c32abfe50 100644 --- a/forge-gui/res/cardsfolder/i/izzet_guildmage.txt +++ b/forge-gui/res/cardsfolder/i/izzet_guildmage.txt @@ -2,8 +2,7 @@ Name:Izzet Guildmage ManaCost:UR UR Types:Creature Human Wizard PT:2/2 -A:AB$ CopySpellAbility | Cost$ 2 U | ValidTgts$ Instant.YouCtrl+cmcLE2 | TargetType$ Spell | SpellDescription$ Copy target instant spell you control with converted mana cost 2 or less. You may choose new targets for the copy. -A:AB$ CopySpellAbility | Cost$ 2 R | ValidTgts$ Sorcery.YouCtrl+cmcLE2 | TargetType$ Spell | SpellDescription$ Copy target sorcery spell you control with converted mana cost 2 or less. You may choose new targets for the copy. -AI:RemoveDeck:All +A:AB$ CopySpellAbility | Cost$ 2 U | ValidTgts$ Instant.YouCtrl+cmcLE2 | TargetType$ Spell | AILogic$ OnceIfViable | SpellDescription$ Copy target instant spell you control with converted mana cost 2 or less. You may choose new targets for the copy. +A:AB$ CopySpellAbility | Cost$ 2 R | ValidTgts$ Sorcery.YouCtrl+cmcLE2 | TargetType$ Spell | AILogic$ OnceIfViable | SpellDescription$ Copy target sorcery spell you control with converted mana cost 2 or less. You may choose new targets for the copy. SVar:Picture:http://www.wizards.com/global/images/magic/general/izzet_guildmage.jpg Oracle:{2}{U}: Copy target instant spell you control with converted mana cost 2 or less. You may choose new targets for the copy.\n{2}{R}: Copy target sorcery spell you control with converted mana cost 2 or less. You may choose new targets for the copy. From 8b90c787aafd17026d2104e70efe58e03b712e72 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 27 Nov 2018 12:18:17 +0300 Subject: [PATCH 241/901] - Marking the relevant cards as AI-playable. --- .../main/java/forge/ai/ability/CopySpellAbilityAi.java | 8 ++++++++ forge-gui/res/cardsfolder/d/dual_casting.txt | 1 - forge-gui/res/cardsfolder/e/echo_mage.txt | 1 - forge-gui/res/cardsfolder/f/fork.txt | 1 - forge-gui/res/cardsfolder/i/increasing_vengeance.txt | 3 +-- forge-gui/res/cardsfolder/m/meletis_charlatan.txt | 1 - forge-gui/res/cardsfolder/n/nivix_guildmage.txt | 2 +- forge-gui/res/cardsfolder/r/radiate.txt | 2 +- forge-gui/res/cardsfolder/r/refuse_cooperate.txt | 1 - forge-gui/res/cardsfolder/r/reiterate.txt | 1 - forge-gui/res/cardsfolder/r/reverberate.txt | 1 - forge-gui/res/cardsfolder/s/sigil_tracer.txt | 3 +-- forge-gui/res/cardsfolder/t/twincast.txt | 1 - forge-gui/res/cardsfolder/u/uyo_silent_prophet.txt | 2 +- 14 files changed, 13 insertions(+), 15 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java b/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java index 12879a36a9f..8cd24cadbf2 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java @@ -36,6 +36,14 @@ public class CopySpellAbilityAi extends SpellAbilityAi { final TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt != null) { final SpellAbility top = game.getStack().peekAbility(); + + // Filter AI-specific targets if provided + if ("OnlyOwned".equals(sa.getParam("AITgts"))) { + if (!top.getActivatingPlayer().equals(aiPlayer)) { + return false; + } + } + if (top.isWrapper() || !(top instanceof SpellAbility || top instanceof AbilityActivated)) { // Should even try with triggered or wrapped abilities first, will crash return false; diff --git a/forge-gui/res/cardsfolder/d/dual_casting.txt b/forge-gui/res/cardsfolder/d/dual_casting.txt index 769e07679a5..bf905034d4e 100644 --- a/forge-gui/res/cardsfolder/d/dual_casting.txt +++ b/forge-gui/res/cardsfolder/d/dual_casting.txt @@ -5,6 +5,5 @@ K:Enchant creature A:SP$ Attach | Cost$ 1 R | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddAbility$ ForkStick | Description$ Enchanted creature has "{R}, {T}: Copy target instant or sorcery spell you control. You may choose new targets for the copy." SVar:ForkStick:AB$ CopySpellAbility | Cost$ R T | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | SpellDescription$ Copy target instant or sorcery spell you control. You may choose new targets for the copy. -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/dual_casting.jpg Oracle:Enchant creature\nEnchanted creature has "{R}, {T}: Copy target instant or sorcery spell you control. You may choose new targets for the copy." diff --git a/forge-gui/res/cardsfolder/e/echo_mage.txt b/forge-gui/res/cardsfolder/e/echo_mage.txt index 3159807fef8..1cd692a4dcb 100644 --- a/forge-gui/res/cardsfolder/e/echo_mage.txt +++ b/forge-gui/res/cardsfolder/e/echo_mage.txt @@ -10,6 +10,5 @@ SVar:CopyOnce:AB$CopySpellAbility | Cost$ U U T | ValidTgts$ Instant,Sorcery | S SVar:CopyTwice:AB$CopySpellAbility | Cost$ U U T | ValidTgts$ Instant,Sorcery | Amount$ 2 | SpellDescription$ Copy target instant or sorcery spell twice. You may choose new targets for the copies. SVar:X:Count$Valid Card.Self+counters_GE2_LEVEL+counters_LT4_LEVEL SVar:Y:Count$Valid Card.Self+counters_GE4_LEVEL -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/echo_mage.jpg Oracle:Level up {1}{U} ({1}{U}: Put a level counter on this. Level up only as a sorcery.)\nLEVEL 2-3\n2/4\n{U}{U}, {T}: Copy target instant or sorcery spell. You may choose new targets for the copy.\nLEVEL 4+\n2/5\n{U}{U}, {T}: Copy target instant or sorcery spell twice. You may choose new targets for the copies. diff --git a/forge-gui/res/cardsfolder/f/fork.txt b/forge-gui/res/cardsfolder/f/fork.txt index 9a3295a242f..84dd0f13fc4 100644 --- a/forge-gui/res/cardsfolder/f/fork.txt +++ b/forge-gui/res/cardsfolder/f/fork.txt @@ -2,6 +2,5 @@ Name:Fork ManaCost:R R Types:Instant A:SP$ CopySpellAbility | Cost$ R R | ValidTgts$ Instant,Sorcery | TargetType$ Spell | CopyIsColor$ Red | OverwriteColors$ True | SpellDescription$ Copy target instant or sorcery spell, except that the copy is red. You may choose new targets for the copy. -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fork.jpg Oracle:Copy target instant or sorcery spell, except that the copy is red. You may choose new targets for the copy. diff --git a/forge-gui/res/cardsfolder/i/increasing_vengeance.txt b/forge-gui/res/cardsfolder/i/increasing_vengeance.txt index ccbe03d5390..ae45627bd04 100644 --- a/forge-gui/res/cardsfolder/i/increasing_vengeance.txt +++ b/forge-gui/res/cardsfolder/i/increasing_vengeance.txt @@ -3,8 +3,7 @@ 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. -SVar:DBCopy2:DB$ CopySpellAbility | Defined$ Targeted | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | References$ X +SVar:DBCopy2:DB$ CopySpellAbility | Defined$ Targeted | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | References$ X | AILogic$ Always SVar:X:Count$wasCastFromGraveyard.1.0 -AI:RemoveDeck:All 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.) diff --git a/forge-gui/res/cardsfolder/m/meletis_charlatan.txt b/forge-gui/res/cardsfolder/m/meletis_charlatan.txt index d7029d6c6c1..02cf1a61ceb 100644 --- a/forge-gui/res/cardsfolder/m/meletis_charlatan.txt +++ b/forge-gui/res/cardsfolder/m/meletis_charlatan.txt @@ -3,6 +3,5 @@ ManaCost:2 U Types:Creature Human Wizard PT:2/3 A:AB$ CopySpellAbility | Cost$ 2 U T | ValidTgts$ Instant,Sorcery | TargetType$ Spell | Controller$ TargetedController | SpellDescription$ The controller of target instant or sorcery spell copies it. That player may choose new targets for the copy. -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/meletis_charlatan.jpg Oracle:{2}{U}, {T}: The controller of target instant or sorcery spell copies it. That player may choose new targets for the copy. diff --git a/forge-gui/res/cardsfolder/n/nivix_guildmage.txt b/forge-gui/res/cardsfolder/n/nivix_guildmage.txt index f2612353836..4d82d00d093 100644 --- a/forge-gui/res/cardsfolder/n/nivix_guildmage.txt +++ b/forge-gui/res/cardsfolder/n/nivix_guildmage.txt @@ -4,7 +4,7 @@ Types:Creature Human Wizard PT:2/2 A:AB$ Draw | Cost$ 1 U R | NumCards$ 1 | SpellDescription$ Draw a card, then discard a card. | SubAbility$ DBDiscard SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose -A:AB$ CopySpellAbility | Cost$ 2 U R | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TargetType$ Spell | SpellDescription$ Copy target instant or sorcery spell you control. You may choose new targets for the copy. +A:AB$ CopySpellAbility | Cost$ 2 U R | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TargetType$ Spell | AILogic$ OnceIfViable | SpellDescription$ Copy target instant or sorcery spell you control. You may choose new targets for the copy. DeckHints:Type$Instant|Sorcery SVar:Picture:http://www.wizards.com/global/images/magic/general/nivix_guildmage.jpg Oracle:{1}{U}{R}: Draw a card, then discard a card.\n{2}{U}{R}: Copy target instant or sorcery spell you control. You may choose new targets for the copy. diff --git a/forge-gui/res/cardsfolder/r/radiate.txt b/forge-gui/res/cardsfolder/r/radiate.txt index 6d3f57c4da2..808ca8df4e8 100644 --- a/forge-gui/res/cardsfolder/r/radiate.txt +++ b/forge-gui/res/cardsfolder/r/radiate.txt @@ -2,6 +2,6 @@ Name:Radiate ManaCost:3 R R Types:Instant A:SP$ CopySpellAbility | Cost$ 3 R R | ValidTgts$ Instant,Sorcery | TargetType$ Spell | TargetsSingleTarget$ True | TargetValidTargeting$ Permanent,Player | Controller$ You | CopyForEachCanTarget$ True | CanTargetPlayer$ True | SpellDescription$ Choose target instant or sorcery spell that targets only a single permanent or player. Copy that spell for each other permanent or player the spell could target. Each copy targets a different one of those permanents and players. -AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/radiate.jpg Oracle:Choose target instant or sorcery spell that targets only a single permanent or player. Copy that spell for each other permanent or player the spell could target. Each copy targets a different one of those permanents and players. diff --git a/forge-gui/res/cardsfolder/r/refuse_cooperate.txt b/forge-gui/res/cardsfolder/r/refuse_cooperate.txt index 3faa79eb7d1..64ac6296b4c 100644 --- a/forge-gui/res/cardsfolder/r/refuse_cooperate.txt +++ b/forge-gui/res/cardsfolder/r/refuse_cooperate.txt @@ -6,7 +6,6 @@ A:SP$ Pump | Cost$ 3 R | ValidTgts$ Card | TgtZone$ Stack | TgtPrompt$ Select ta SVar:DBDmg:DB$ DealDamage | Defined$ TargetedController | NumDmg$ X | References$ X SVar:X:Targeted$CardManaCost -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/refuse_cooperate.jpg Oracle:Refuse deals damage to target spell's controller equal to that spell's converted mana cost. diff --git a/forge-gui/res/cardsfolder/r/reiterate.txt b/forge-gui/res/cardsfolder/r/reiterate.txt index 5636ba43cc9..3fcbd34eb41 100644 --- a/forge-gui/res/cardsfolder/r/reiterate.txt +++ b/forge-gui/res/cardsfolder/r/reiterate.txt @@ -3,6 +3,5 @@ ManaCost:1 R R Types:Instant K:Buyback:3 A:SP$ CopySpellAbility | Cost$ 1 R R | ValidTgts$ Instant,Sorcery | TargetType$ Spell | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy. -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/reiterate.jpg Oracle:Buyback {3} (You may pay an additional {3} as you cast this spell. If you do, put this card into your hand as it resolves.)\nCopy target instant or sorcery spell. You may choose new targets for the copy. diff --git a/forge-gui/res/cardsfolder/r/reverberate.txt b/forge-gui/res/cardsfolder/r/reverberate.txt index 7bc69bba3cc..2cea6ba32d5 100644 --- a/forge-gui/res/cardsfolder/r/reverberate.txt +++ b/forge-gui/res/cardsfolder/r/reverberate.txt @@ -2,6 +2,5 @@ Name:Reverberate ManaCost:R R Types:Instant A:SP$ CopySpellAbility | Cost$ R R | ValidTgts$ Instant,Sorcery | TargetType$ Spell | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy. -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/reverberate.jpg Oracle:Copy target instant or sorcery spell. You may choose new targets for the copy. diff --git a/forge-gui/res/cardsfolder/s/sigil_tracer.txt b/forge-gui/res/cardsfolder/s/sigil_tracer.txt index 5cc76b81d14..1cdca3526fe 100644 --- a/forge-gui/res/cardsfolder/s/sigil_tracer.txt +++ b/forge-gui/res/cardsfolder/s/sigil_tracer.txt @@ -2,7 +2,6 @@ Name:Sigil Tracer ManaCost:1 U U Types:Creature Merfolk Wizard PT:2/2 -A:AB$CopySpellAbility | Cost$ 1 U tapXType<2/Wizard> | ValidTgts$ Instant,Sorcery | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy. -AI:RemoveDeck:All +A:AB$CopySpellAbility | Cost$ 1 U tapXType<2/Wizard> | ValidTgts$ Instant,Sorcery | AILogic$ OnceIfViable | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy. SVar:Picture:http://www.wizards.com/global/images/magic/general/sigil_tracer.jpg Oracle:{1}{U}, Tap two untapped Wizards you control: Copy target instant or sorcery spell. You may choose new targets for the copy. diff --git a/forge-gui/res/cardsfolder/t/twincast.txt b/forge-gui/res/cardsfolder/t/twincast.txt index e7b413c3a05..a7f995a1afa 100644 --- a/forge-gui/res/cardsfolder/t/twincast.txt +++ b/forge-gui/res/cardsfolder/t/twincast.txt @@ -2,6 +2,5 @@ Name:Twincast ManaCost:U U Types:Instant A:SP$ CopySpellAbility | Cost$ U U | ValidTgts$ Instant,Sorcery | TargetType$ Spell | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy. -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/twincast.jpg Oracle:Copy target instant or sorcery spell. You may choose new targets for the copy. diff --git a/forge-gui/res/cardsfolder/u/uyo_silent_prophet.txt b/forge-gui/res/cardsfolder/u/uyo_silent_prophet.txt index 1f3cdf8c376..9474f574879 100644 --- a/forge-gui/res/cardsfolder/u/uyo_silent_prophet.txt +++ b/forge-gui/res/cardsfolder/u/uyo_silent_prophet.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Moonfolk Wizard PT:4/4 K:Flying A:AB$CopySpellAbility | Cost$ 2 Return<2/Land> | ValidTgts$ Instant,Sorcery | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy. -AI:RemoveDeck:All +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/uyo_silent_prophet.jpg Oracle:Flying\n{2}, Return two lands you control to their owner's hand: Copy target instant or sorcery spell. You may choose new targets for the copy. From 06b00c2dfdb8a644a64429913b3c24006569b315 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 27 Nov 2018 12:22:46 +0300 Subject: [PATCH 242/901] - Refuse // Cooperate is not yet playable by the AI, can't target AF Pump on stack. --- forge-gui/res/cardsfolder/r/refuse_cooperate.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/res/cardsfolder/r/refuse_cooperate.txt b/forge-gui/res/cardsfolder/r/refuse_cooperate.txt index 64ac6296b4c..3faa79eb7d1 100644 --- a/forge-gui/res/cardsfolder/r/refuse_cooperate.txt +++ b/forge-gui/res/cardsfolder/r/refuse_cooperate.txt @@ -6,6 +6,7 @@ A:SP$ Pump | Cost$ 3 R | ValidTgts$ Card | TgtZone$ Stack | TgtPrompt$ Select ta SVar:DBDmg:DB$ DealDamage | Defined$ TargetedController | NumDmg$ X | References$ X SVar:X:Targeted$CardManaCost +AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/refuse_cooperate.jpg Oracle:Refuse deals damage to target spell's controller equal to that spell's converted mana cost. From c9c5a443efe85798d309577a36ed2a9c392c6087 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 27 Nov 2018 12:43:08 +0300 Subject: [PATCH 243/901] - More work on AI logic. --- forge-ai/src/main/java/forge/ai/AiProps.java | 1 + .../forge/ai/ability/CopySpellAbilityAi.java | 21 +++++++++++++++---- forge-gui/res/ai/Cautious.ai | 2 ++ forge-gui/res/ai/Default.ai | 2 ++ forge-gui/res/ai/Experimental.ai | 2 ++ forge-gui/res/ai/Reckless.ai | 2 ++ forge-gui/res/cardsfolder/e/echo_mage.txt | 4 ++-- forge-gui/res/cardsfolder/g/geistblast.txt | 3 ++- .../res/cardsfolder/l/league_guildmage.txt | 2 +- .../res/cardsfolder/m/meletis_charlatan.txt | 2 +- forge-gui/res/cardsfolder/m/mirror_sheen.txt | 2 +- .../cardsfolder/t/tawnos_urzas_apprentice.txt | 2 +- 12 files changed, 34 insertions(+), 11 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiProps.java b/forge-ai/src/main/java/forge/ai/AiProps.java index dd43168d764..23b3b791fe6 100644 --- a/forge-ai/src/main/java/forge/ai/AiProps.java +++ b/forge-ai/src/main/java/forge/ai/AiProps.java @@ -70,6 +70,7 @@ public enum AiProps { /** */ ALWAYS_COUNTER_AURAS ("true"), /** */ ALWAYS_COUNTER_SPELLS_FROM_NAMED_CARDS (""), /** */ CHANCE_TO_COPY_OWN_SPELL_WHILE_ON_STACK ("30"), /** */ + ALWAYS_COPY_SPELL_IF_CMC_DIFF ("2"), /** */ ACTIVELY_DESTROY_ARTS_AND_NONAURA_ENCHS ("true"), /** */ ACTIVELY_DESTROY_IMMEDIATELY_UNBLOCKABLE ("false"), /** */ DESTROY_IMMEDIATELY_UNBLOCKABLE_THRESHOLD ("2"), /** */ diff --git a/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java b/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java index 8cd24cadbf2..68243a9489c 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java @@ -19,10 +19,24 @@ public class CopySpellAbilityAi extends SpellAbilityAi { @Override protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) { Game game = aiPlayer.getGame(); - final int chance = ((PlayerControllerAi)aiPlayer.getController()).getAi().getIntProperty(AiProps.CHANCE_TO_COPY_OWN_SPELL_WHILE_ON_STACK); + int chance = ((PlayerControllerAi)aiPlayer.getController()).getAi().getIntProperty(AiProps.CHANCE_TO_COPY_OWN_SPELL_WHILE_ON_STACK); + int diff = ((PlayerControllerAi)aiPlayer.getController()).getAi().getIntProperty(AiProps.ALWAYS_COPY_SPELL_IF_CMC_DIFF); - if (game.getStack().isEmpty() - || (!MyRandom.percentTrue(chance) && !"AlwaysIfViable".equals(sa.getParam("AILogic"))) + if (game.getStack().isEmpty()) { + return sa.isMandatory(); + } + + final SpellAbility top = game.getStack().peekAbility(); + if (top != null + && top.getPayCosts() != null && top.getPayCosts().getCostMana() != null + && sa.getPayCosts() != null && sa.getPayCosts().getCostMana() != null + && top.getPayCosts().getCostMana().getMana().getCMC() >= sa.getPayCosts().getCostMana().getMana().getCMC() + diff) { + // The copied spell has a significantly higher CMC than the copy spell, consider copying + chance = 100; + } + + if (!MyRandom.percentTrue(chance) + && !"AlwaysIfViable".equals(sa.getParam("AILogic")) && !"OnceIfViable".equals(sa.getParam("AILogic"))) { return false; } @@ -35,7 +49,6 @@ public class CopySpellAbilityAi extends SpellAbilityAi { final TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt != null) { - final SpellAbility top = game.getStack().peekAbility(); // Filter AI-specific targets if provided if ("OnlyOwned".equals(sa.getParam("AITgts"))) { diff --git a/forge-gui/res/ai/Cautious.ai b/forge-gui/res/ai/Cautious.ai index 5a350cd968c..0e732f97963 100644 --- a/forge-gui/res/ai/Cautious.ai +++ b/forge-gui/res/ai/Cautious.ai @@ -136,6 +136,8 @@ ALWAYS_COUNTER_SPELLS_FROM_NAMED_CARDS=None # Copy spell on stack logic # The chance that the AI will copy its own stack right after placing it there while it has priority CHANCE_TO_COPY_OWN_SPELL_WHILE_ON_STACK=0 +# If the copied spell costs this much more than the copy spell, the chance to copy the spell will become 100 +ALWAYS_COPY_SPELL_IF_CMC_DIFF=4 # Storm spell logic PRIORITY_REDUCTION_FOR_STORM_SPELLS=9 diff --git a/forge-gui/res/ai/Default.ai b/forge-gui/res/ai/Default.ai index 61dc79aa939..8e03095a670 100644 --- a/forge-gui/res/ai/Default.ai +++ b/forge-gui/res/ai/Default.ai @@ -136,6 +136,8 @@ ALWAYS_COUNTER_SPELLS_FROM_NAMED_CARDS=None # Copy spell on stack logic # The chance that the AI will copy its own stack right after placing it there while it has priority CHANCE_TO_COPY_OWN_SPELL_WHILE_ON_STACK=30 +# If the copied spell costs this much more than the copy spell, the chance to copy the spell will become 100 +ALWAYS_COPY_SPELL_IF_CMC_DIFF=2 # Storm spell logic PRIORITY_REDUCTION_FOR_STORM_SPELLS=0 diff --git a/forge-gui/res/ai/Experimental.ai b/forge-gui/res/ai/Experimental.ai index ba82a3d6ae3..b5f8624f8a2 100644 --- a/forge-gui/res/ai/Experimental.ai +++ b/forge-gui/res/ai/Experimental.ai @@ -136,6 +136,8 @@ ALWAYS_COUNTER_SPELLS_FROM_NAMED_CARDS=None # Copy spell on stack logic # The chance that the AI will copy its own stack right after placing it there while it has priority CHANCE_TO_COPY_OWN_SPELL_WHILE_ON_STACK=30 +# If the copied spell costs this much more than the copy spell, the chance to copy the spell will become 100 +ALWAYS_COPY_SPELL_IF_CMC_DIFF=2 # Storm spell logic PRIORITY_REDUCTION_FOR_STORM_SPELLS=9 diff --git a/forge-gui/res/ai/Reckless.ai b/forge-gui/res/ai/Reckless.ai index b5b308473a4..188cf8199a9 100644 --- a/forge-gui/res/ai/Reckless.ai +++ b/forge-gui/res/ai/Reckless.ai @@ -136,6 +136,8 @@ ALWAYS_COUNTER_SPELLS_FROM_NAMED_CARDS=None # Copy spell on stack logic # The chance that the AI will copy its own stack right after placing it there while it has priority CHANCE_TO_COPY_OWN_SPELL_WHILE_ON_STACK=50 +# If the copied spell costs this much more than the copy spell, the chance to copy the spell will become 100 +ALWAYS_COPY_SPELL_IF_CMC_DIFF=1 # Storm spell logic PRIORITY_REDUCTION_FOR_STORM_SPELLS=0 diff --git a/forge-gui/res/cardsfolder/e/echo_mage.txt b/forge-gui/res/cardsfolder/e/echo_mage.txt index 1cd692a4dcb..755a94da0ba 100644 --- a/forge-gui/res/cardsfolder/e/echo_mage.txt +++ b/forge-gui/res/cardsfolder/e/echo_mage.txt @@ -6,8 +6,8 @@ K:Level up:1 U SVar:maxLevel:4 S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 4 | AddAbility$ CopyOnce | CheckSVar$ X | SVarCompare$ EQ1 | Description$ LEVEL 2-3 2/4 CARDNAME gets U U,tap: Copy target instant or sorcery spell. You may choose new targets for the copy. S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 5 | AddAbility$ CopyTwice | CheckSVar$ Y | SVarCompare$ EQ1 | Description$ LEVEL 4+ 2/5 CARDNAME gets U U,tap:Copy target instant or sorcery spell twice. You may choose new targets for the copies. -SVar:CopyOnce:AB$CopySpellAbility | Cost$ U U T | ValidTgts$ Instant,Sorcery | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy. -SVar:CopyTwice:AB$CopySpellAbility | Cost$ U U T | ValidTgts$ Instant,Sorcery | Amount$ 2 | SpellDescription$ Copy target instant or sorcery spell twice. You may choose new targets for the copies. +SVar:CopyOnce:AB$CopySpellAbility | Cost$ U U T | ValidTgts$ Instant,Sorcery | AILogic$ OnceIfViable | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy. +SVar:CopyTwice:AB$CopySpellAbility | Cost$ U U T | ValidTgts$ Instant,Sorcery | Amount$ 2 | AILogic$ OnceIfViable | SpellDescription$ Copy target instant or sorcery spell twice. You may choose new targets for the copies. SVar:X:Count$Valid Card.Self+counters_GE2_LEVEL+counters_LT4_LEVEL SVar:Y:Count$Valid Card.Self+counters_GE4_LEVEL SVar:Picture:http://www.wizards.com/global/images/magic/general/echo_mage.jpg diff --git a/forge-gui/res/cardsfolder/g/geistblast.txt b/forge-gui/res/cardsfolder/g/geistblast.txt index f9771cd0695..4be13b50adf 100644 --- a/forge-gui/res/cardsfolder/g/geistblast.txt +++ b/forge-gui/res/cardsfolder/g/geistblast.txt @@ -2,6 +2,7 @@ Name:Geistblast ManaCost:2 R Types:Instant A:SP$ DealDamage | Cost$ 2 R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to any target. -A:AB$ CopySpellAbility | Cost$ 2 U ExileFromGrave<1/CARDNAME> | ActivationZone$ Graveyard | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TargetType$ Spell | SpellDescription$ Copy target instant or sorcery spell you control. You may choose new targets for the copy. +A:AB$ CopySpellAbility | Cost$ 2 U ExileFromGrave<1/CARDNAME> | ActivationZone$ Graveyard | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TargetType$ Spell | SpellDescription$ Copy target instant or sorcery spell you control. You may choose new targets for the copy. +SVar:AIPreference:ExileFromGraveCost$Card.Self SVar:Picture:http://www.wizards.com/global/images/magic/general/geistblast.jpg Oracle:Geistblast deals 2 damage to any target.\n{2}{U}, Exile Geistblast from your graveyard: Copy target instant or sorcery spell you control. You may choose new targets for the copy. diff --git a/forge-gui/res/cardsfolder/l/league_guildmage.txt b/forge-gui/res/cardsfolder/l/league_guildmage.txt index c0cdc4c664c..d8b6669129b 100644 --- a/forge-gui/res/cardsfolder/l/league_guildmage.txt +++ b/forge-gui/res/cardsfolder/l/league_guildmage.txt @@ -3,7 +3,7 @@ ManaCost:U R Types:Creature Human Wizard PT:2/2 A:AB$ Draw | Cost$ 3 U T | NumCards$ 1 | SpellDescription$ Draw a card. -A:AB$ CopySpellAbility | Cost$ X R T | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TargetType$ Spell | SpellDescription$ Copy target instant or sorcery spell you control with converted mana cost X. You may choose new targets for the copy. +A:AB$ CopySpellAbility | Cost$ X R T | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TargetType$ Spell | AILogic$ OnceIfViable | SpellDescription$ Copy target instant or sorcery spell you control with converted mana cost X. You may choose new targets for the copy. SVar:X:Targeted$CardManaCost DeckHints:Type$Instant|Sorcery Oracle:{3}{U}, {T}: Draw a card.\n{X}{R}, {T}: Copy target instant or sorcery spell you control with converted mana cost X. You may choose new targets for the copy. diff --git a/forge-gui/res/cardsfolder/m/meletis_charlatan.txt b/forge-gui/res/cardsfolder/m/meletis_charlatan.txt index 02cf1a61ceb..debe3fbbc08 100644 --- a/forge-gui/res/cardsfolder/m/meletis_charlatan.txt +++ b/forge-gui/res/cardsfolder/m/meletis_charlatan.txt @@ -2,6 +2,6 @@ Name:Meletis Charlatan ManaCost:2 U Types:Creature Human Wizard PT:2/3 -A:AB$ CopySpellAbility | Cost$ 2 U T | ValidTgts$ Instant,Sorcery | TargetType$ Spell | Controller$ TargetedController | SpellDescription$ The controller of target instant or sorcery spell copies it. That player may choose new targets for the copy. +A:AB$ CopySpellAbility | Cost$ 2 U T | ValidTgts$ Instant,Sorcery | TargetType$ Spell | Controller$ TargetedController | AILogic$ OnceIfViable | AITgts$ OwnedOnly | SpellDescription$ The controller of target instant or sorcery spell copies it. That player may choose new targets for the copy. SVar:Picture:http://www.wizards.com/global/images/magic/general/meletis_charlatan.jpg Oracle:{2}{U}, {T}: The controller of target instant or sorcery spell copies it. That player may choose new targets for the copy. diff --git a/forge-gui/res/cardsfolder/m/mirror_sheen.txt b/forge-gui/res/cardsfolder/m/mirror_sheen.txt index 4cf65e9c34c..490e40e5ba2 100644 --- a/forge-gui/res/cardsfolder/m/mirror_sheen.txt +++ b/forge-gui/res/cardsfolder/m/mirror_sheen.txt @@ -1,6 +1,6 @@ Name:Mirror Sheen ManaCost:1 UR UR Types:Enchantment -A:AB$ CopySpellAbility | Cost$ 1 UR UR | ValidTgts$ Instant,Sorcery | TargetType$ Spell | TargetValidTargeting$ You | SpellDescription$ Copy target instant or sorcery spell that targets you. You may choose new targets for the copy. +A:AB$ CopySpellAbility | Cost$ 1 UR UR | ValidTgts$ Instant,Sorcery | TargetType$ Spell | TargetValidTargeting$ You | AILogic$ AlwaysIfViable | SpellDescription$ Copy target instant or sorcery spell that targets you. You may choose new targets for the copy. SVar:Picture:http://www.wizards.com/global/images/magic/general/mirror_sheen.jpg Oracle:{1}{U/R}{U/R}: Copy target instant or sorcery spell that targets you. You may choose new targets for the copy. diff --git a/forge-gui/res/cardsfolder/t/tawnos_urzas_apprentice.txt b/forge-gui/res/cardsfolder/t/tawnos_urzas_apprentice.txt index f370baa2447..5aa503852fe 100644 --- a/forge-gui/res/cardsfolder/t/tawnos_urzas_apprentice.txt +++ b/forge-gui/res/cardsfolder/t/tawnos_urzas_apprentice.txt @@ -3,5 +3,5 @@ ManaCost:U R Types:Legendary Creature Human Artificer PT:1/3 K:Haste -A:AB$ CopySpellAbility | Cost$ U R T | TargetType$ Activated.YouCtrl,Triggered.YouCtrl | ValidTgts$ Artifact | SpellDescription$ Copy target activated or triggered ability you control from an artifact source. You may choose new targets for the copy. (Mana abilities can't be targeted.) +A:AB$ CopySpellAbility | Cost$ U R T | TargetType$ Activated.YouCtrl,Triggered.YouCtrl | ValidTgts$ Artifact | AILogic$ OnceIfViable | SpellDescription$ Copy target activated or triggered ability you control from an artifact source. You may choose new targets for the copy. (Mana abilities can't be targeted.) Oracle:Haste\n{U}{R}, {T}: Copy target activated or triggered ability you control from an artifact source. You may choose new targets for the copy. (Mana abilities can't be targeted.) From 67e6e90f368bba6d7f3d6ca21595ace9531113b1 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 27 Nov 2018 12:50:56 +0300 Subject: [PATCH 244/901] - Observe mandatory activations when checking via chkAIDrawback. --- .../src/main/java/forge/ai/ability/CopySpellAbilityAi.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java b/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java index 68243a9489c..25ef17b54c9 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java @@ -103,7 +103,9 @@ public class CopySpellAbilityAi extends SpellAbilityAi { return SpecialCardAi.ChainOfAcid.consider(aiPlayer, sa); } - return canPlayAI(aiPlayer, sa); + boolean wantToPlay = canPlayAI(aiPlayer, sa); + + return wantToPlay || (sa.isMandatory() && super.chkAIDrawback(sa, aiPlayer)); } @Override From 90cb927f6c18dc4ca0ec4f6612ad7ef96c0538ce Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 27 Nov 2018 12:52:07 +0300 Subject: [PATCH 245/901] - Simpler fix for mandatory activations. --- .../src/main/java/forge/ai/ability/CopySpellAbilityAi.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java b/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java index 25ef17b54c9..915713d5705 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java @@ -103,9 +103,7 @@ public class CopySpellAbilityAi extends SpellAbilityAi { return SpecialCardAi.ChainOfAcid.consider(aiPlayer, sa); } - boolean wantToPlay = canPlayAI(aiPlayer, sa); - - return wantToPlay || (sa.isMandatory() && super.chkAIDrawback(sa, aiPlayer)); + return canPlayAI(aiPlayer, sa) || (sa.isMandatory() && super.chkAIDrawback(sa, aiPlayer)); } @Override From 1ad132e0a32ab5e7e75705c0b9aab21e06f72809 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 27 Nov 2018 12:57:02 +0300 Subject: [PATCH 246/901] - More work on AI logic, fixed Tawnos, Urza's Apprentice. --- .../java/forge/ai/ability/CopySpellAbilityAi.java | 12 +++++++----- .../res/cardsfolder/t/tawnos_urzas_apprentice.txt | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java b/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java index 915713d5705..872f4f7d38f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java @@ -21,6 +21,7 @@ public class CopySpellAbilityAi extends SpellAbilityAi { Game game = aiPlayer.getGame(); int chance = ((PlayerControllerAi)aiPlayer.getController()).getAi().getIntProperty(AiProps.CHANCE_TO_COPY_OWN_SPELL_WHILE_ON_STACK); int diff = ((PlayerControllerAi)aiPlayer.getController()).getAi().getIntProperty(AiProps.ALWAYS_COPY_SPELL_IF_CMC_DIFF); + String logic = sa.getParamOrDefault("AILogic", ""); if (game.getStack().isEmpty()) { return sa.isMandatory(); @@ -36,12 +37,13 @@ public class CopySpellAbilityAi extends SpellAbilityAi { } if (!MyRandom.percentTrue(chance) - && !"AlwaysIfViable".equals(sa.getParam("AILogic")) - && !"OnceIfViable".equals(sa.getParam("AILogic"))) { + && !"AlwaysIfViable".equals(logic) + && !"OnceIfViable".equals(logic) + && !"AlwaysCopyActivatedAbilities".equals(logic)) { return false; } - if ("OnceIfViable".equals(sa.getParam("AILogic"))) { + if ("OnceIfViable".equals(logic)) { if (AiCardMemory.isRememberedCard(aiPlayer, sa.getHostCard(), AiCardMemory.MemorySet.ACTIVATED_THIS_TURN)) { return false; } @@ -74,7 +76,7 @@ public class CopySpellAbilityAi extends SpellAbilityAi { if (top instanceof Spell) { decision = ((PlayerControllerAi) aiPlayer.getController()).getAi().canPlayFromEffectAI((Spell) topCopy, true, true); } else if (top instanceof AbilityActivated && top.getActivatingPlayer().equals(aiPlayer) - && "CopyActivatedAbilities".equals(sa.getParam("AILogic"))) { + && logic.contains("CopyActivatedAbilities")) { decision = AiPlayDecision.WillPlay; // FIXME: we activated it once, why not again? Or bad idea? } if (decision == AiPlayDecision.WillPlay) { @@ -86,7 +88,7 @@ public class CopySpellAbilityAi extends SpellAbilityAi { } // the AI should not miss mandatory activations - return sa.isMandatory() || "Always".equals(sa.getParam("AILogic")); + return sa.isMandatory() || "Always".equals(logic); } @Override diff --git a/forge-gui/res/cardsfolder/t/tawnos_urzas_apprentice.txt b/forge-gui/res/cardsfolder/t/tawnos_urzas_apprentice.txt index 5aa503852fe..ced32fa9770 100644 --- a/forge-gui/res/cardsfolder/t/tawnos_urzas_apprentice.txt +++ b/forge-gui/res/cardsfolder/t/tawnos_urzas_apprentice.txt @@ -3,5 +3,5 @@ ManaCost:U R Types:Legendary Creature Human Artificer PT:1/3 K:Haste -A:AB$ CopySpellAbility | Cost$ U R T | TargetType$ Activated.YouCtrl,Triggered.YouCtrl | ValidTgts$ Artifact | AILogic$ OnceIfViable | SpellDescription$ Copy target activated or triggered ability you control from an artifact source. You may choose new targets for the copy. (Mana abilities can't be targeted.) +A:AB$ CopySpellAbility | Cost$ U R T | TargetType$ Activated.YouCtrl,Triggered.YouCtrl | ValidTgts$ Artifact | AILogic$ AlwaysCopyActivatedAbilities | SpellDescription$ Copy target activated or triggered ability you control from an artifact source. You may choose new targets for the copy. (Mana abilities can't be targeted.) Oracle:Haste\n{U}{R}, {T}: Copy target activated or triggered ability you control from an artifact source. You may choose new targets for the copy. (Mana abilities can't be targeted.) From 937ae087d9da1e4833a0f9621725e030a2526298 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 27 Nov 2018 15:24:56 +0300 Subject: [PATCH 247/901] - Updating CHANGES.txt. --- forge-gui/release-files/CHANGES.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/release-files/CHANGES.txt b/forge-gui/release-files/CHANGES.txt index 2a0aa537709..12ab45e9203 100644 --- a/forge-gui/release-files/CHANGES.txt +++ b/forge-gui/release-files/CHANGES.txt @@ -1,5 +1,5 @@ - AI Improvements - -A new round of AI improvements went into the game, hopefully making the game a little more interesting and exciting to play. In particular, certain improvements regarding Flash were implemented, the AI is now able to use cards which reorder the top of the library, such as Ponder or Portent, and several logic-related bugs were fixed. Also, the AI has been optimized a little, hopefully making it a bit faster, especially on mobile platforms, in situations where there are a lot of cards on the battlefield but the AI has little or nothing to do. +A new round of AI improvements went into the game, hopefully making the game a little more interesting and exciting to play. In particular, certain improvements regarding Flash were implemented, the AI is now able to use cards which reorder the top of the library, such as Ponder or Portent, as well as cards which copy spells and/or activated abilities, such as Twincast or Fork. On top of that, several logic-related bugs were fixed. Also, the AI has been optimized a little, hopefully making it a bit faster, especially on mobile platforms, in situations where there are a lot of cards on the battlefield but the AI has little or nothing to do. - Planar Conquest: Guilds of Ravnica - Cards from Guilds of Ravnica are now available on the Ravnica plane in Planar Conquest. Several events on this plane have been updated or changed to feature Guilds of Ravnica cards as well. Please note that Planar Conquest is currently only available on Android and the macOS mobile backport. From 88aedb8cba3a0afc9e549aa167d7b1bb66d27130 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 28 Nov 2018 20:20:31 +0300 Subject: [PATCH 248/901] - Fixed Cryptoplasm, added some simple AI logic to it. --- .../src/main/java/forge/ai/ability/CloneAi.java | 13 ++++++++++++- forge-gui/res/cardsfolder/c/cryptoplasm.txt | 3 +-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/CloneAi.java b/forge-ai/src/main/java/forge/ai/ability/CloneAi.java index 9fae432551b..494632f1f50 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CloneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CloneAi.java @@ -142,6 +142,10 @@ public class CloneAi extends SpellAbilityAi { CardCollection valid = CardLists.getValidCards(sa.getHostCard().getController().getCardsIn(ZoneType.Battlefield), sa.getParam("ValidTgts"), sa.getHostCard().getController(), sa.getHostCard()); sa.getTargets().add(ComputerUtilCard.getBestCreatureAI(valid)); return true; + } else if ("CloneBestCreature".equals(sa.getParam("AILogic"))) { + CardCollection valid = CardLists.getValidCards(sa.getHostCard().getController().getGame().getCardsIn(ZoneType.Battlefield), sa.getParam("ValidTgts"), sa.getHostCard().getController(), sa.getHostCard()); + sa.getTargets().add(ComputerUtilCard.getBestCreatureAI(valid)); + return true; } // Default: @@ -157,7 +161,14 @@ public class CloneAi extends SpellAbilityAi { */ @Override public boolean confirmAction(Player player, SpellAbility sa, PlayerActionConfirmMode mode, String message) { - // Didn't confirm in the original code + if (sa.hasParam("AILogic") && sa.usesTargeting() && sa.isTargetNumberValid()) { + // Had a special logic for it and managed to target, so confirm if viable + if ("CloneBestCreature".equals(sa.getParam("AILogic"))) { + return ComputerUtilCard.evaluateCreature(sa.getTargets().getFirstTargetedCard()) > ComputerUtilCard.evaluateCreature(sa.getHostCard()); + } + } + + // Currently doesn't confirm anything that's not defined by AI logic return false; } diff --git a/forge-gui/res/cardsfolder/c/cryptoplasm.txt b/forge-gui/res/cardsfolder/c/cryptoplasm.txt index d5c52244cae..3b1c6947d17 100644 --- a/forge-gui/res/cardsfolder/c/cryptoplasm.txt +++ b/forge-gui/res/cardsfolder/c/cryptoplasm.txt @@ -4,7 +4,6 @@ Types:Creature Shapeshifter PT:2/2 # Make Svars for granting abilities and triggers on clones distinct to avoid SVars getting overwritten when cloning a clone T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ CryptoplasmCopy | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may have CARDNAME become a copy of another target creature. If you do, CARDNAME gains this ability. -SVar:CryptoplasmCopy:DB$ Clone | ValidTgts$ Creature.Other | TgtPrompt$ Select another target creature to copy. | Optional$ True | GainThisAbility$ True -AI:RemoveDeck:All +SVar:CryptoplasmCopy:DB$ Clone | ValidTgts$ Creature.Other | TgtPrompt$ Select another target creature to copy. | Optional$ True | GainThisAbility$ True | AddSVars$ CryptoplasmCopy | AILogic$ CloneBestCreature SVar:Picture:http://www.wizards.com/global/images/magic/general/cryptoplasm.jpg Oracle:At the beginning of your upkeep, you may have Cryptoplasm become a copy of another target creature. If you do, Cryptoplasm gains this ability. From a3f1eb940f505d99b069807199a65fde1d267480 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 28 Nov 2018 20:51:32 +0300 Subject: [PATCH 249/901] - Fixed more cards cloning creatures and added additional logic for the AI. --- forge-ai/src/main/java/forge/ai/ability/CloneAi.java | 6 +++++- forge-gui/res/cardsfolder/a/artisan_of_forms.txt | 3 +-- forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt | 2 +- forge-gui/res/cardsfolder/r/renegade_doppelganger.txt | 2 +- forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt | 3 +-- 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/CloneAi.java b/forge-ai/src/main/java/forge/ai/ability/CloneAi.java index 494632f1f50..c9ab77868ab 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CloneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CloneAi.java @@ -161,10 +161,14 @@ public class CloneAi extends SpellAbilityAi { */ @Override public boolean confirmAction(Player player, SpellAbility sa, PlayerActionConfirmMode mode, String message) { - if (sa.hasParam("AILogic") && sa.usesTargeting() && sa.isTargetNumberValid()) { + if (sa.hasParam("AILogic") && (!sa.usesTargeting() || sa.isTargetNumberValid())) { // Had a special logic for it and managed to target, so confirm if viable if ("CloneBestCreature".equals(sa.getParam("AILogic"))) { return ComputerUtilCard.evaluateCreature(sa.getTargets().getFirstTargetedCard()) > ComputerUtilCard.evaluateCreature(sa.getHostCard()); + } else if ("BetterThanTriggered".equals(sa.getParam("AILogic"))) { + List defined = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("Defined"), sa); + Card bestDefined = ComputerUtilCard.getBestCreatureAI(defined); + return ComputerUtilCard.evaluateCreature(bestDefined) > ComputerUtilCard.evaluateCreature(sa.getHostCard()); } } diff --git a/forge-gui/res/cardsfolder/a/artisan_of_forms.txt b/forge-gui/res/cardsfolder/a/artisan_of_forms.txt index 1263e6df041..5168bc73c30 100644 --- a/forge-gui/res/cardsfolder/a/artisan_of_forms.txt +++ b/forge-gui/res/cardsfolder/a/artisan_of_forms.txt @@ -3,7 +3,6 @@ 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. -SVar:TrigArtisanCopy:DB$ Clone | ValidTgts$ Creature | TgtPrompt$ Select target creature to copy | Optional$ True | GainThisAbility$ True -AI:RemoveDeck:All +SVar:TrigArtisanCopy:DB$ Clone | ValidTgts$ Creature | TgtPrompt$ Select target creature to copy | Optional$ True | GainThisAbility$ True | AddSVars$ TrigArtisanCopy | AILogic$ CloneBestCreature 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. diff --git a/forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt b/forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt index da736302f56..d198dfc52e2 100644 --- a/forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt +++ b/forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt @@ -4,7 +4,7 @@ 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 Lazav, Dimir Mastermind become a copy of that card, except its name is Lazav, Dimir Mastermind, it's legendary in addition to its other types, and it has hexproof and this ability. -SVar:LazavCopy:DB$ Clone | Defined$ TriggeredCard | NewName$ Lazav, Dimir Mastermind | AddTypes$ Legendary | AddKeywords$ Hexproof | GainThisAbility$ True +SVar:LazavCopy:DB$ Clone | Defined$ TriggeredCard | NewName$ Lazav, Dimir Mastermind | AddTypes$ Legendary | AddKeywords$ Hexproof | GainThisAbility$ True | Optional$ True | AddSVars$ LazavCopy | AILogic$ BetterThanTriggered AI:RemoveDeck:All 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 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/r/renegade_doppelganger.txt b/forge-gui/res/cardsfolder/r/renegade_doppelganger.txt index 98b32fecbf8..0881f7c4f77 100644 --- a/forge-gui/res/cardsfolder/r/renegade_doppelganger.txt +++ b/forge-gui/res/cardsfolder/r/renegade_doppelganger.txt @@ -4,6 +4,6 @@ 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+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ RDCopy | TriggerDescription$ Whenever another creature enters the battlefield under your control, you may have CARDNAME become a copy of that creature until end of turn. (If it does, it loses this ability for the rest of the turn.) -SVar:RDCopy:DB$ Clone | Defined$ TriggeredCard | Duration$ UntilEndOfTurn +SVar:RDCopy:DB$ Clone | Defined$ TriggeredCard | Duration$ UntilEndOfTurn | AILogic$ BetterThanTriggered SVar:Picture:http://www.wizards.com/global/images/magic/general/renegade_doppelganger.jpg Oracle:Whenever another creature enters the battlefield under your control, you may have Renegade Doppelganger become a copy of that creature until end of turn. (If it does, it loses this ability for the rest of the turn.) diff --git a/forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt b/forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt index 56ff80e3418..2e0eac3b014 100644 --- a/forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt +++ b/forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt @@ -7,7 +7,6 @@ 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: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:VesDopCopy:DB$ Clone | ValidTgts$ Creature | TgtPrompt$ Select target creature to copy. | Optional$ True | Colors$ Blue | OverwriteColors$ True | GainThisAbility$ True | SubAbility$ DBCleanup -AI:RemoveDeck:All +SVar:VesDopCopy:DB$ Clone | ValidTgts$ Creature | TgtPrompt$ Select target creature to copy. | Optional$ True | Colors$ Blue | OverwriteColors$ True | GainThisAbility$ True | AddSVars$ VesDopCopy | AILogic$ CloneBestCreature | SubAbility$ DBCleanup 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." From af8f4786045b9b006781e0b832e88c54c76088e0 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 28 Nov 2018 20:52:47 +0300 Subject: [PATCH 250/901] - Marking Lazav AI-playable. --- forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt b/forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt index d198dfc52e2..392830382d8 100644 --- a/forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt +++ b/forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt @@ -5,6 +5,5 @@ 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 Lazav, Dimir Mastermind become a copy of that card, except its name is Lazav, Dimir Mastermind, it's legendary in addition to its other types, and it has hexproof and this ability. SVar:LazavCopy:DB$ Clone | Defined$ TriggeredCard | NewName$ Lazav, Dimir Mastermind | AddTypes$ Legendary | AddKeywords$ Hexproof | GainThisAbility$ True | Optional$ True | AddSVars$ LazavCopy | AILogic$ BetterThanTriggered -AI:RemoveDeck:All 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 Lazav, Dimir Mastermind, it's legendary in addition to its other types, and it has hexproof and this ability. From a030a61e52f743bdb034eaaa632da5389bafcb24 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 28 Nov 2018 21:21:07 +0300 Subject: [PATCH 251/901] - Some CopySpellAbilityAi improvements. --- .../src/main/java/forge/ai/ability/CopySpellAbilityAi.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java b/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java index 872f4f7d38f..e23df4de018 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java @@ -36,6 +36,10 @@ public class CopySpellAbilityAi extends SpellAbilityAi { chance = 100; } + if (top.getActivatingPlayer().isOpponentOf(aiPlayer)) { + chance = 100; // currently the AI will always copy the opponent's spell if viable + } + if (!MyRandom.percentTrue(chance) && !"AlwaysIfViable".equals(logic) && !"OnceIfViable".equals(logic) @@ -73,7 +77,7 @@ public class CopySpellAbilityAi extends SpellAbilityAi { if (top.canBeTargetedBy(sa)) { AiPlayDecision decision = AiPlayDecision.CantPlaySa; - if (top instanceof Spell) { + if (top instanceof Spell && !top.hasParam("ConditionManaSpent") /* mana spent is not copied */ ) { decision = ((PlayerControllerAi) aiPlayer.getController()).getAi().canPlayFromEffectAI((Spell) topCopy, true, true); } else if (top instanceof AbilityActivated && top.getActivatingPlayer().equals(aiPlayer) && logic.contains("CopyActivatedAbilities")) { From a9811298258e711220f19c82e384d9c1413908b6 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 29 Nov 2018 08:08:28 +0300 Subject: [PATCH 252/901] - Updated CopySpellAbilityAi to account for some more cases the AI shouldn't copy a spell. --- .../main/java/forge/ai/ability/CopySpellAbilityAi.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java b/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java index e23df4de018..dab2a41052a 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java @@ -64,11 +64,17 @@ public class CopySpellAbilityAi extends SpellAbilityAi { } if (top.isWrapper() || !(top instanceof SpellAbility || top instanceof AbilityActivated)) { - // Should even try with triggered or wrapped abilities first, will crash + // Shouldn't even try with triggered or wrapped abilities at this time, will crash return false; } else if (top.getApi() == ApiType.CopySpellAbility) { // Don't try to copy a copy ability, too complex for the AI to handle return false; + } else if (top.hasParam("ConditionManaSpent")) { + // Mana spent is not copied, so these spells generally do nothing when copied. + return false; + } else if (ComputerUtilCard.isCardRemAIDeck(top.getHostCard())) { + // Don't try to copy anything you can't understand how to handle + return false; } // A copy is necessary to properly test the SA before targeting the copied spell, otherwise the copy SA will fizzle. @@ -77,7 +83,7 @@ public class CopySpellAbilityAi extends SpellAbilityAi { if (top.canBeTargetedBy(sa)) { AiPlayDecision decision = AiPlayDecision.CantPlaySa; - if (top instanceof Spell && !top.hasParam("ConditionManaSpent") /* mana spent is not copied */ ) { + if (top instanceof Spell) { decision = ((PlayerControllerAi) aiPlayer.getController()).getAi().canPlayFromEffectAI((Spell) topCopy, true, true); } else if (top instanceof AbilityActivated && top.getActivatingPlayer().equals(aiPlayer) && logic.contains("CopyActivatedAbilities")) { From ca7b1309002181bf087a7eae48695e8174428a25 Mon Sep 17 00:00:00 2001 From: "Jamin W. Collins" Date: Fri, 23 Nov 2018 09:21:16 -0700 Subject: [PATCH 253/901] stop passing manaCost around, it's a class attribute Signed-off-by: Jamin W. Collins --- .../src/main/java/forge/match/input/InputPayMana.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/forge-gui/src/main/java/forge/match/input/InputPayMana.java b/forge-gui/src/main/java/forge/match/input/InputPayMana.java index 6fcaca649eb..07acf233a6a 100644 --- a/forge-gui/src/main/java/forge/match/input/InputPayMana.java +++ b/forge-gui/src/main/java/forge/match/input/InputPayMana.java @@ -105,7 +105,7 @@ public abstract class InputPayMana extends InputSyncronizedBase { delaySelectCards.clear(); //clear delayed cards if mana cost already paid return false; } - if (activateManaAbility(delaySelectCards.poll(), manaCost)) { + if (activateManaAbility(delaySelectCards.poll())) { return true; } return activateDelayedCard(); @@ -114,7 +114,7 @@ public abstract class InputPayMana extends InputSyncronizedBase { @Override public boolean selectAbility(final SpellAbility ab) { if (ab != null && ab.isManaAbility()) { - return activateManaAbility(ab.getHostCard(), manaCost, ab); + return activateManaAbility(ab.getHostCard(), ab); } return false; } @@ -165,10 +165,10 @@ public abstract class InputPayMana extends InputSyncronizedBase { } } - protected boolean activateManaAbility(final Card card, ManaCostBeingPaid manaCost) { - return activateManaAbility(card, manaCost, null); + protected boolean activateManaAbility(final Card card) { + return activateManaAbility(card, null); } - protected boolean activateManaAbility(final Card card, ManaCostBeingPaid manaCost, SpellAbility chosenAbility) { + protected boolean activateManaAbility(final Card card, SpellAbility chosenAbility) { if (locked) { System.err.print("Should wait till previous call to playAbility finishes."); return false; From c9c95db7162bd21bf87d7876e192b5dde41a6b4d Mon Sep 17 00:00:00 2001 From: "Jamin W. Collins" Date: Fri, 23 Nov 2018 09:29:15 -0700 Subject: [PATCH 254/901] use floating dialog for mana payment during spell cast Signed-off-by: Jamin W. Collins --- .../java/forge/match/input/InputPayMana.java | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/forge-gui/src/main/java/forge/match/input/InputPayMana.java b/forge-gui/src/main/java/forge/match/input/InputPayMana.java index 07acf233a6a..c0cdd42e0fc 100644 --- a/forge-gui/src/main/java/forge/match/input/InputPayMana.java +++ b/forge-gui/src/main/java/forge/match/input/InputPayMana.java @@ -71,20 +71,21 @@ public abstract class InputPayMana extends InputSyncronizedBase { @Override protected boolean onCardSelected(final Card card, final List otherCardsToSelect, final ITriggerEvent triggerEvent) { - if (otherCardsToSelect != null) { - for (Card c : otherCardsToSelect) { - for (SpellAbility sa : c.getManaAbilities()) { - if (sa.canPlay()) { - delaySelectCards.add(c); - break; - } - } + if (card.getManaAbilities().size() == 1) { + activateManaAbility(card, card.getManaAbilities().get(0)); + } else { + SpellAbilityView spellAbilityView; + HashMap spellAbilityViewMap = new HashMap<>(); + for (SpellAbility sa : card.getManaAbilities()) { + spellAbilityViewMap.put(sa.getView(), sa); + } + List choices = new ArrayList<>(spellAbilityViewMap.keySet()); + spellAbilityView = getController().getGui().getAbilityToPlay(card.getView(), choices, triggerEvent); + if (spellAbilityView != null) { + activateManaAbility(card, spellAbilityViewMap.get(spellAbilityView)); } } - if (!card.getManaAbilities().isEmpty() && activateManaAbility(card, manaCost)) { - return true; - } - return activateDelayedCard(); + return true; } @Override @@ -231,7 +232,7 @@ public abstract class InputPayMana extends InputSyncronizedBase { } } - if (abilitiesMap.isEmpty() || (chosenAbility != null && !abilitiesMap.containsKey(chosenAbility))) { + if (abilitiesMap.isEmpty() || (chosenAbility != null && !abilitiesMap.containsKey(chosenAbility.getView()))) { return false; } From 74ae604fe7c573f89bd6df62a95ad05e3f03b328 Mon Sep 17 00:00:00 2001 From: "Jamin W. Collins" Date: Fri, 23 Nov 2018 09:37:53 -0700 Subject: [PATCH 255/901] use nested menus for folder filter The existing folder filter UI can easily fill a users screen, listing one full path per line. With this change, only one level of directories are shown for each menu level. Signed-off-by: Jamin W. Collins --- .../java/forge/itemmanager/DeckManager.java | 67 ++++++++++++++++--- 1 file changed, 56 insertions(+), 11 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/DeckManager.java b/forge-gui-desktop/src/main/java/forge/itemmanager/DeckManager.java index 9843f97c683..2bc3df3459f 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/DeckManager.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/DeckManager.java @@ -147,27 +147,72 @@ public final class DeckManager extends ItemManager implements IHasGam return new DeckSearchFilter(this); } + private Map buildHierarchy(String path) { + if (path.startsWith("/")) { + path = path.substring(1); + } + Map hierarchy = new HashMap(); + String[] components = path.split("/", 2); + Map value = new HashMap(); + if (components.length > 1) { + value = buildHierarchy(components[1]); + } + hierarchy.put("/" + components[0], value); + return hierarchy; + } + + // borrowed from: https://stackoverflow.com/a/46052477 + private void merge(Map mapLeft, Map mapRight) { + // go over all the keys of the right map + for (String key : mapRight.keySet()) { + // if the left map already has this key, merge the maps that are behind that key + if (mapLeft.containsKey(key)) { + merge(mapLeft.get(key), mapRight.get(key)); + } else { + // otherwise just add the map under that key + mapLeft.put(key, mapRight.get(key)); + } + } + } + + private void buildNestedMenu(Map tree, JMenu menu, String parentPath) { + if (tree.size() > 0) { + for (final Object key : tree.keySet()) { + String fullPath = key.toString(); + if (parentPath != null) { + fullPath = parentPath + key.toString(); + } + String finalFullPath = fullPath; + GuiUtils.addMenuItem(menu, key.toString(), null, new Runnable() { + @Override + public void run() { + addFilter(new DeckFolderFilter(DeckManager.this, finalFullPath)); + } + }, true); + Map value = (Map) tree.get(key); + if (value.size() > 0) { + final JMenu submenu = GuiUtils.createMenu(key.toString()); + buildNestedMenu(value, submenu, finalFullPath); + menu.add(submenu); + } + } + } + } + @Override protected void buildAddFilterMenu(final JMenu menu) { GuiUtils.addSeparator(menu); //separate from current search item - final SortedSet folders = new TreeSet(); + Map hierarchy = new HashMap(); for (final Entry deckEntry : getPool()) { final String path = deckEntry.getKey().getPath(); if (StringUtils.isNotEmpty(path)) { //don't include root folder as option - folders.add(path); + merge(hierarchy, buildHierarchy(path)); } } final JMenu folder = GuiUtils.createMenu("Folder"); - if (folders.size() > 0) { - for (final String f : folders) { - GuiUtils.addMenuItem(folder, f, null, new Runnable() { - @Override - public void run() { - addFilter(new DeckFolderFilter(DeckManager.this, f)); - } - }, true); - } + if (hierarchy.size() > 0) { + buildNestedMenu(hierarchy, folder, null); } else { folder.setEnabled(false); From 290cdc09d3b248f97b5309dcb5e4733e4e3bc762 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 29 Nov 2018 09:21:28 +0300 Subject: [PATCH 256/901] - Improved DamageDealAi when counting damage by cards in hand. --- forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java index a895415755c..f3ca5cecf38 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -93,8 +93,8 @@ public class DamageDealAi extends DamageAiBase { // Set PayX here to maximum value. dmg = ComputerUtilMana.determineLeftoverMana(sa, ai); source.setSVar("PayX", Integer.toString(dmg)); - } else if (sa.getSVar(damage).equals("Count$CardsInYourHand") && source.getZone().is(ZoneType.Hand)) { - dmg--; // the card will be spent casting the spell, so actual damage is 1 less + } else if (sa.getSVar(damage).contains("InYourHand") && source.getZone().is(ZoneType.Hand)) { + dmg = CardFactoryUtil.xCount(source, sa.getSVar(damage)) - 1; // the card will be spent casting the spell, so actual damage is 1 less } else if (sa.getSVar(damage).equals("TargetedPlayer$CardsInHand")) { // cards that deal damage by the number of cards in target player's hand, e.g. Sudden Impact if (sa.getTargetRestrictions().canTgtPlayer()) { From 309f10a1cf54c72032aaf71deb075ac531055839 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 29 Nov 2018 10:41:41 +0300 Subject: [PATCH 257/901] - Better name for the AI logic. --- forge-ai/src/main/java/forge/ai/ability/CloneAi.java | 2 +- forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt | 2 +- forge-gui/res/cardsfolder/r/renegade_doppelganger.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/CloneAi.java b/forge-ai/src/main/java/forge/ai/ability/CloneAi.java index c9ab77868ab..6d2618ee7f0 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CloneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CloneAi.java @@ -165,7 +165,7 @@ public class CloneAi extends SpellAbilityAi { // Had a special logic for it and managed to target, so confirm if viable if ("CloneBestCreature".equals(sa.getParam("AILogic"))) { return ComputerUtilCard.evaluateCreature(sa.getTargets().getFirstTargetedCard()) > ComputerUtilCard.evaluateCreature(sa.getHostCard()); - } else if ("BetterThanTriggered".equals(sa.getParam("AILogic"))) { + } else if ("IfDefinedCreatureIsBetter".equals(sa.getParam("AILogic"))) { List defined = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("Defined"), sa); Card bestDefined = ComputerUtilCard.getBestCreatureAI(defined); return ComputerUtilCard.evaluateCreature(bestDefined) > ComputerUtilCard.evaluateCreature(sa.getHostCard()); diff --git a/forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt b/forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt index 392830382d8..ff0fdfc5df1 100644 --- a/forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt +++ b/forge-gui/res/cardsfolder/l/lazav_dimir_mastermind.txt @@ -4,6 +4,6 @@ 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 Lazav, Dimir Mastermind become a copy of that card, except its name is Lazav, Dimir Mastermind, it's legendary in addition to its other types, and it has hexproof and this ability. -SVar:LazavCopy:DB$ Clone | Defined$ TriggeredCard | NewName$ Lazav, Dimir Mastermind | AddTypes$ Legendary | AddKeywords$ Hexproof | GainThisAbility$ True | Optional$ True | AddSVars$ LazavCopy | AILogic$ BetterThanTriggered +SVar:LazavCopy:DB$ Clone | Defined$ TriggeredCard | NewName$ Lazav, Dimir Mastermind | AddTypes$ Legendary | AddKeywords$ Hexproof | GainThisAbility$ True | Optional$ True | AddSVars$ LazavCopy | AILogic$ IfDefinedCreatureIsBetter 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 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/r/renegade_doppelganger.txt b/forge-gui/res/cardsfolder/r/renegade_doppelganger.txt index 0881f7c4f77..75d620cb03d 100644 --- a/forge-gui/res/cardsfolder/r/renegade_doppelganger.txt +++ b/forge-gui/res/cardsfolder/r/renegade_doppelganger.txt @@ -4,6 +4,6 @@ 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+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ RDCopy | TriggerDescription$ Whenever another creature enters the battlefield under your control, you may have CARDNAME become a copy of that creature until end of turn. (If it does, it loses this ability for the rest of the turn.) -SVar:RDCopy:DB$ Clone | Defined$ TriggeredCard | Duration$ UntilEndOfTurn | AILogic$ BetterThanTriggered +SVar:RDCopy:DB$ Clone | Defined$ TriggeredCard | Duration$ UntilEndOfTurn | AILogic$ IfDefinedCreatureIsBetter SVar:Picture:http://www.wizards.com/global/images/magic/general/renegade_doppelganger.jpg Oracle:Whenever another creature enters the battlefield under your control, you may have Renegade Doppelganger become a copy of that creature until end of turn. (If it does, it loses this ability for the rest of the turn.) From daad7c254a913e726b3363897d9d85a8ee86f477 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 29 Nov 2018 11:11:39 +0300 Subject: [PATCH 258/901] - Improved CopySpellAbilityAI on spells affecting multiple cards (e.g. mass removal). --- .../src/main/java/forge/ai/ability/CopySpellAbilityAi.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java b/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java index dab2a41052a..85ccadaec65 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java @@ -69,6 +69,12 @@ public class CopySpellAbilityAi extends SpellAbilityAi { } else if (top.getApi() == ApiType.CopySpellAbility) { // Don't try to copy a copy ability, too complex for the AI to handle return false; + } else if (top.getApi() == ApiType.DestroyAll || top.getApi() == ApiType.SacrificeAll || top.getApi() == ApiType.ChangeZoneAll || top.getApi() == ApiType.TapAll || top.getApi() == ApiType.UnattachAll) { + if (!top.usesTargeting() || top.getActivatingPlayer().equals(aiPlayer)) { + // If we activated a mass removal / mass tap / mass bounce / etc. spell, or if the opponent activated it but + // it can't be retargeted, no reason to copy this spell since it'll probably do the same thing and is useless as a copy + return false; + } } else if (top.hasParam("ConditionManaSpent")) { // Mana spent is not copied, so these spells generally do nothing when copied. return false; From 31d887301b8bb2418080cb35e5f739534b27c7b0 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 29 Nov 2018 15:02:19 +0300 Subject: [PATCH 259/901] - Improved the AI logic for MustBlock a little. - Enabled several cards for the AI. - Implemented Sisters of Stone Death's 3rd ability similar to Tomb of the Dusk Rose which the AI can properly work with (seems functionally identical). - Fixed the AI logic spec for Tomb of the Dusk Rose. --- .../java/forge/ai/ability/MustBlockAi.java | 103 +++++++++++++----- forge-gui/res/cardsfolder/l/lurking_arynx.txt | 1 - .../res/cardsfolder/m/matsu_tribe_decoy.txt | 2 +- ...ofane_procession_tomb_of_the_dusk_rose.txt | 3 +- .../res/cardsfolder/r/rampant_elephant.txt | 2 - .../cardsfolder/s/sisters_of_stone_death.txt | 5 +- forge-gui/res/cardsfolder/t/tangle_angler.txt | 3 +- .../res/cardsfolder/t/trumpeting_armodon.txt | 1 - 8 files changed, 80 insertions(+), 40 deletions(-) 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 79c3cbbad0e..306566477c1 100644 --- a/forge-ai/src/main/java/forge/ai/ability/MustBlockAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/MustBlockAi.java @@ -2,15 +2,16 @@ package forge.ai.ability; import com.google.common.base.Predicate; -import forge.ai.ComputerUtil; -import forge.ai.ComputerUtilCard; -import forge.ai.ComputerUtilCombat; -import forge.ai.SpellAbilityAi; +import com.google.common.collect.Lists; +import forge.ai.*; +import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.card.CardLists; import forge.game.card.CardPredicates; +import forge.game.combat.Combat; import forge.game.combat.CombatUtil; +import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.spellability.SpellAbility; @@ -23,14 +24,45 @@ public class MustBlockAi extends SpellAbilityAi { @Override protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) { - // disabled for the AI until he/she can make decisions about who to make - // block + final Card source = sa.getHostCard(); + final Game game = aiPlayer.getGame(); + final Combat combat = game.getCombat(); + final PhaseHandler ph = game.getPhaseHandler(); + final boolean onlyLethal = !"AllowNonLethal".equals(sa.getParam("AILogic")); + + if (combat == null || !combat.isAttacking(source)) { + return false; + } else if (AiCardMemory.isRememberedCard(aiPlayer, source, AiCardMemory.MemorySet.ACTIVATED_THIS_TURN)) { + // The AI can meaningfully do it only to one creature per card yet, trying to do it to multiple cards + // may result in overextending and losing the attacker + return false; + } + + final TargetRestrictions abTgt = sa.getTargetRestrictions(); + final List list = determineGoodBlockers(source, aiPlayer, combat.getDefenderPlayerByAttacker(source), sa, onlyLethal,false); + + if (!list.isEmpty()) { + final Card blocker = ComputerUtilCard.getBestCreatureAI(list); + if (blocker == null) { + return false; + } + sa.getTargets().add(blocker); + AiCardMemory.rememberCard(aiPlayer, source, AiCardMemory.MemorySet.ACTIVATED_THIS_TURN); + return true; + } + return false; } @Override public boolean chkAIDrawback(SpellAbility sa, Player aiPlayer) { - return false; + if (sa.hasParam("DefinedAttacker")) { + // The AI can't handle "target creature blocks another target creature" abilities yet + return false; + } + + // Otherwise it's a standard targeted "target creature blocks CARDNAME" ability, so use the main canPlayAI code path + return canPlayAI(aiPlayer, sa); } @Override @@ -62,27 +94,7 @@ public class MustBlockAi extends SpellAbilityAi { boolean chance = false; if (abTgt != null) { - List list = CardLists.filter(ComputerUtil.getOpponentFor(ai).getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.CREATURES); - list = CardLists.getTargetableCards(list, sa); - list = CardLists.getValidCards(list, abTgt.getValidTgts(), source.getController(), source, sa); - list = CardLists.filter(list, new Predicate() { - @Override - public boolean apply(final Card c) { - boolean tapped = c.isTapped(); - c.setTapped(false); - if (!CombatUtil.canBlock(definedAttacker, c)) { - return false; - } - if (ComputerUtilCombat.canDestroyAttacker(ai, definedAttacker, c, null, false)) { - return false; - } - if (!ComputerUtilCombat.canDestroyBlocker(ai, c, definedAttacker, null, false)) { - return false; - } - c.setTapped(tapped); - return true; - } - }); + final List list = determineGoodBlockers(definedAttacker, ai, ComputerUtil.getOpponentFor(ai), sa, true,true); if (list.isEmpty()) { return false; } @@ -98,4 +110,39 @@ public class MustBlockAi extends SpellAbilityAi { return chance; } + + private List determineGoodBlockers(Card attacker, Player ai, Player defender, SpellAbility sa, boolean onlyLethal, boolean testTapped) { + final Card source = sa.getHostCard(); + final TargetRestrictions abTgt = sa.getTargetRestrictions(); + + List list = Lists.newArrayList(); + list = CardLists.filter(defender.getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.CREATURES); + list = CardLists.getTargetableCards(list, sa); + list = CardLists.getValidCards(list, abTgt.getValidTgts(), source.getController(), source, sa); + list = CardLists.filter(list, new Predicate() { + @Override + public boolean apply(final Card c) { + boolean tapped = c.isTapped(); + if (testTapped) { + c.setTapped(false); + } + if (!CombatUtil.canBlock(attacker, c)) { + return false; + } + if (ComputerUtilCombat.canDestroyAttacker(ai, attacker, c, null, false)) { + return false; + } + if (onlyLethal && !ComputerUtilCombat.canDestroyBlocker(ai, c, attacker, null, false)) { + return false; + } + if (testTapped) { + c.setTapped(tapped); + } + return true; + } + + }); + + return list; + } } diff --git a/forge-gui/res/cardsfolder/l/lurking_arynx.txt b/forge-gui/res/cardsfolder/l/lurking_arynx.txt index 9498d2f6353..6acacbc0584 100644 --- a/forge-gui/res/cardsfolder/l/lurking_arynx.txt +++ b/forge-gui/res/cardsfolder/l/lurking_arynx.txt @@ -4,6 +4,5 @@ Types:Creature Cat Beast PT:3/5 A:AB$ MustBlock | Cost$ 2 G | ValidTgts$ Creature | CheckSVar$ FormidableTest | SVarCompare$ GE8 | References$ FormidableTest | PrecostDesc$ Formidable — | TgtPrompt$ Select target creature that must block this creature this turn | SpellDescription$ Target creature blocks CARDNAME this turn if able. Activate this ability only if creatures you control have total power 8 or greater. SVar:FormidableTest:Count$SumPower_Creature.YouCtrl -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/lurking_arynx.jpg Oracle:Formidable — {2}{G}: Target creature blocks Lurking Arynx this turn if able. Activate this ability only if creatures you control have total power 8 or greater. diff --git a/forge-gui/res/cardsfolder/m/matsu_tribe_decoy.txt b/forge-gui/res/cardsfolder/m/matsu_tribe_decoy.txt index dcb5193cb12..66fabaec30f 100644 --- a/forge-gui/res/cardsfolder/m/matsu_tribe_decoy.txt +++ b/forge-gui/res/cardsfolder/m/matsu_tribe_decoy.txt @@ -2,7 +2,7 @@ Name:Matsu-Tribe Decoy ManaCost:2 G Types:Creature Snake Warrior PT:1/3 -A:AB$ MustBlock | Cost$ 2 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Target creature blocks CARDNAME this turn if able. +A:AB$ MustBlock | Cost$ 2 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | AILogic$ AllowNonLethal | SpellDescription$ Target creature blocks CARDNAME this turn if able. T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ Whenever CARDNAME deals combat damage to a creature, tap that creature and it doesn't untap during its controller's next untap step. SVar:TrigTap:DB$ Tap | Defined$ TriggeredTarget | SubAbility$ DBPump SVar:DBPump:DB$ Pump | Defined$ TriggeredTarget | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | IsCurse$ True diff --git a/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt b/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt index 2b2dc12afa6..5c2e1124067 100644 --- a/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt +++ b/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt @@ -7,14 +7,13 @@ AlternateMode:DoubleFaced SVar:Picture:http://www.wizards.com/global/images/magic/general/profane_procession.jpg Oracle:{3}{W}{B}: Exile target creature. Then if there are three or more cards exiled with Profane Procession, transform it. -//Not sure if ExiledWithSource and IsRemembered persist through transformation, but for this card, it's absolutely vital that they do. ALTERNATE Name:Tomb of the Dusk Rose ManaCost:no cost Types:Legendary Land A:AB$ Mana | Cost$ T | Produced$ Any | Amount$ 1 | SpellDescription$ Add one mana of any color. -A:AB$ ChooseCard | Cost$ 2 W B T | Choices$ Creature.IsRemembered+ExiledWithSource | ChoiceZone$ Exile | SubAbility$ DBChangeZone | SpellDescription$ Put a creature card exiled with this permanent onto the battlefield under your control. +A:AB$ ChooseCard | Cost$ 2 W B T | Choices$ Creature.IsRemembered+ExiledWithSource | ChoiceZone$ Exile | SubAbility$ DBChangeZone | AILogic$ AtLeast1 | Mandatory$ True | SpellDescription$ Put a creature card exiled with this permanent onto the battlefield under your control. SVar:DBChangeZone:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Exile | Destination$ Battlefield | ChangeType$ Creature.IsRemembered+ExiledWithSource | ChangeNum$ 1 | GainControl$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/tomb_of_the_dusk_rose.jpg Oracle:(Transforms from Profane Procession.)\n{T}: Add one mana of any color.\n{2}{W}{B},{T}: Put a creature card exiled with this permanent onto the battlefield under your control. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/r/rampant_elephant.txt b/forge-gui/res/cardsfolder/r/rampant_elephant.txt index 62851a275c6..175a4ad8d1e 100644 --- a/forge-gui/res/cardsfolder/r/rampant_elephant.txt +++ b/forge-gui/res/cardsfolder/r/rampant_elephant.txt @@ -3,7 +3,5 @@ ManaCost:3 W Types:Creature Elephant PT:2/2 A:AB$ MustBlock | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Target creature blocks CARDNAME this turn if able. -AI:RemoveDeck:All -AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rampant_elephant.jpg Oracle:{G}: Target creature blocks Rampant Elephant this turn if able. diff --git a/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt b/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt index aec478cc53a..3e326007894 100644 --- a/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt +++ b/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt @@ -4,12 +4,11 @@ Types:Legendary Creature Gorgon PT:7/5 A:AB$ MustBlock | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Target creature blocks CARDNAME this turn if able. A:AB$ ChangeZone | Cost$ B G | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.blockingSource,Creature.blockedBySource | TgtPrompt$ Select target creature blocking Sisters of Stone Death | RememberTargets$ True | SpellDescription$ Exile target creature blocking or blocked by CARDNAME. -A:AB$ ChangeZone | Cost$ 2 B | Origin$ Exile | Destination$ Battlefield | ChangeType$ Creature.IsRemembered+ExiledWithSource | Hidden$ True | GainControl$ True | SpellDescription$ Put a creature card exiled with CARDNAME onto the battlefield under your control. +A:AB$ ChooseCard | Cost$ 2 B | Choices$ Creature.IsRemembered+ExiledWithSource | ChoiceZone$ Exile | AILogic$ AtLeast1 | Mandatory$ True | SubAbility$ DBChangeZone | SpellDescription$ Put a creature card exiled with CARDNAME onto the battlefield under your control. +SVar:DBChangeZone:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Exile | Destination$ Battlefield | ChangeType$ Creature.IsRemembered+ExiledWithSource | ChangeNum$ 1 | GainControl$ True T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered+ExiledWithSource | Execute$ DBForget SVar:DBForget:DB$ Pump | ForgetImprinted$ TriggeredCard T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Any | Execute$ DBCleanup | Static$ True | Secondary$ True | TriggerDescription$ Forget all remembered cards. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -AI:RemoveDeck:All -AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/sisters_of_stone_death.jpg Oracle:{G}: Target creature blocks Sisters of Stone Death this turn if able.\n{B}{G}: Exile target creature blocking or blocked by Sisters of Stone Death.\n{2}{B}: Put a creature card exiled with Sisters of Stone Death onto the battlefield under your control. diff --git a/forge-gui/res/cardsfolder/t/tangle_angler.txt b/forge-gui/res/cardsfolder/t/tangle_angler.txt index e409e592c9a..89dc8dcb781 100644 --- a/forge-gui/res/cardsfolder/t/tangle_angler.txt +++ b/forge-gui/res/cardsfolder/t/tangle_angler.txt @@ -3,7 +3,6 @@ ManaCost:3 G Types:Creature Horror PT:1/5 K:Infect -A:AB$ MustBlock | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Target creature blocks CARDNAME this turn if able. -AI:RemoveDeck:All +A:AB$ MustBlock | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | AILogic$ AllowNonLethal | SpellDescription$ Target creature blocks CARDNAME this turn if able. SVar:Picture:http://www.wizards.com/global/images/magic/general/tangle_angler.jpg Oracle:Infect (This creature deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.)\n{G}: Target creature blocks Tangle Angler this turn if able. diff --git a/forge-gui/res/cardsfolder/t/trumpeting_armodon.txt b/forge-gui/res/cardsfolder/t/trumpeting_armodon.txt index 85fbb34e52e..fb533f42605 100644 --- a/forge-gui/res/cardsfolder/t/trumpeting_armodon.txt +++ b/forge-gui/res/cardsfolder/t/trumpeting_armodon.txt @@ -3,6 +3,5 @@ ManaCost:3 G Types:Creature Elephant PT:3/3 A:AB$ MustBlock | Cost$ 1 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Target creature blocks CARDNAME this turn if able. -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/trumpeting_armodon.jpg Oracle:{1}{G}: Target creature blocks Trumpeting Armodon this turn if able. From 9b99314e5148a7305fc735c5a53142feb8199939 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 29 Nov 2018 15:22:44 +0300 Subject: [PATCH 260/901] - Somewhat better logic for Provoke. --- .../src/main/java/forge/ai/ability/MustBlockAi.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) 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 306566477c1..5774856259e 100644 --- a/forge-ai/src/main/java/forge/ai/ability/MustBlockAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/MustBlockAi.java @@ -11,6 +11,7 @@ import forge.game.card.CardLists; import forge.game.card.CardPredicates; import forge.game.combat.Combat; import forge.game.combat.CombatUtil; +import forge.game.keyword.Keyword; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.player.Player; @@ -102,6 +103,18 @@ public class MustBlockAi extends SpellAbilityAi { if (blocker == null) { return false; } + + if (source.hasKeyword(Keyword.PROVOKE) && blocker.isTapped()) { + // Don't provoke if the attack is potentially lethal + Combat combat = ai.getGame().getCombat(); + Player defender = combat.getDefenderPlayerByAttacker(source); + if (combat != null && combat.getAttackingPlayer().equals(ai) + && defender.canLoseLife() && !defender.cantLoseForZeroOrLessLife() + && ComputerUtilCombat.lifeThatWouldRemain(defender, combat) <= 0) { + return false; + } + } + sa.getTargets().add(blocker); chance = true; } else { From e9bcd254c3387871afbbff2fa200798b0ffc0ab4 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 29 Nov 2018 16:17:33 +0300 Subject: [PATCH 261/901] - NPE guard. --- .../src/main/java/forge/ai/ability/MustBlockAi.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) 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 5774856259e..c29ddc1b72c 100644 --- a/forge-ai/src/main/java/forge/ai/ability/MustBlockAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/MustBlockAi.java @@ -107,11 +107,13 @@ public class MustBlockAi extends SpellAbilityAi { if (source.hasKeyword(Keyword.PROVOKE) && blocker.isTapped()) { // Don't provoke if the attack is potentially lethal Combat combat = ai.getGame().getCombat(); - Player defender = combat.getDefenderPlayerByAttacker(source); - if (combat != null && combat.getAttackingPlayer().equals(ai) - && defender.canLoseLife() && !defender.cantLoseForZeroOrLessLife() - && ComputerUtilCombat.lifeThatWouldRemain(defender, combat) <= 0) { - return false; + if (combat != null) { + Player defender = combat.getDefenderPlayerByAttacker(source); + if (defender != null && combat.getAttackingPlayer().equals(ai) + && defender.canLoseLife() && !defender.cantLoseForZeroOrLessLife() + && ComputerUtilCombat.lifeThatWouldRemain(defender, combat) <= 0) { + return false; + } } } From dec0c56a2d04f175dabfedb3140645af186b4514 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 29 Nov 2018 17:13:24 +0300 Subject: [PATCH 262/901] - Updated Tomb of the Dusk Rose and Sisters of Stone Death for a simpler and AI-compatible implementation. --- .../cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt | 3 +-- forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt b/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt index 5c2e1124067..eb3b894f579 100644 --- a/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt +++ b/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt @@ -13,7 +13,6 @@ Name:Tomb of the Dusk Rose ManaCost:no cost Types:Legendary Land A:AB$ Mana | Cost$ T | Produced$ Any | Amount$ 1 | SpellDescription$ Add one mana of any color. -A:AB$ ChooseCard | Cost$ 2 W B T | Choices$ Creature.IsRemembered+ExiledWithSource | ChoiceZone$ Exile | SubAbility$ DBChangeZone | AILogic$ AtLeast1 | Mandatory$ True | SpellDescription$ Put a creature card exiled with this permanent onto the battlefield under your control. -SVar:DBChangeZone:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Exile | Destination$ Battlefield | ChangeType$ Creature.IsRemembered+ExiledWithSource | ChangeNum$ 1 | GainControl$ True +A:AB$ ChangeZone | Cost$ 2 W B T | Origin$ Exile | Destination$ Battlefield | ValidTgts$ Creature.IsRemembered+ExiledWithSource | GainControl$ True | SpellDescription$ Put a creature card exiled with this permanent onto the battlefield under your control. SVar:Picture:http://www.wizards.com/global/images/magic/general/tomb_of_the_dusk_rose.jpg Oracle:(Transforms from Profane Procession.)\n{T}: Add one mana of any color.\n{2}{W}{B},{T}: Put a creature card exiled with this permanent onto the battlefield under your control. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt b/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt index 3e326007894..04840d1cef6 100644 --- a/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt +++ b/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt @@ -4,8 +4,7 @@ Types:Legendary Creature Gorgon PT:7/5 A:AB$ MustBlock | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Target creature blocks CARDNAME this turn if able. A:AB$ ChangeZone | Cost$ B G | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.blockingSource,Creature.blockedBySource | TgtPrompt$ Select target creature blocking Sisters of Stone Death | RememberTargets$ True | SpellDescription$ Exile target creature blocking or blocked by CARDNAME. -A:AB$ ChooseCard | Cost$ 2 B | Choices$ Creature.IsRemembered+ExiledWithSource | ChoiceZone$ Exile | AILogic$ AtLeast1 | Mandatory$ True | SubAbility$ DBChangeZone | SpellDescription$ Put a creature card exiled with CARDNAME onto the battlefield under your control. -SVar:DBChangeZone:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Exile | Destination$ Battlefield | ChangeType$ Creature.IsRemembered+ExiledWithSource | ChangeNum$ 1 | GainControl$ True +A:AB$ ChangeZone | Cost$ 2 B | Origin$ Exile | Destination$ Battlefield | ValidTgts$ Creature.IsRemembered+ExiledWithSource | GainControl$ True | SpellDescription$ Put a creature card exiled with CARDNAME onto the battlefield under your control. T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered+ExiledWithSource | Execute$ DBForget SVar:DBForget:DB$ Pump | ForgetImprinted$ TriggeredCard T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Any | Execute$ DBCleanup | Static$ True | Secondary$ True | TriggerDescription$ Forget all remembered cards. From 6a6e429f829387c475a0e0fb23bc94f71dfd814b Mon Sep 17 00:00:00 2001 From: swordshine Date: Fri, 30 Nov 2018 12:44:42 +0800 Subject: [PATCH 263/901] - Fix Sisters of Stone Death --- .../cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt | 2 +- forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt b/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt index eb3b894f579..af1d5798391 100644 --- a/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt +++ b/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt @@ -13,6 +13,6 @@ Name:Tomb of the Dusk Rose ManaCost:no cost Types:Legendary Land A:AB$ Mana | Cost$ T | Produced$ Any | Amount$ 1 | SpellDescription$ Add one mana of any color. -A:AB$ ChangeZone | Cost$ 2 W B T | Origin$ Exile | Destination$ Battlefield | ValidTgts$ Creature.IsRemembered+ExiledWithSource | GainControl$ True | SpellDescription$ Put a creature card exiled with this permanent onto the battlefield under your control. +A:AB$ ChangeZone | Cost$ 2 W B T | Origin$ Exile | Destination$ Battlefield | ChangeType$ Creature.IsRemembered+ExiledWithSource | Hidden$ True | Mandatory$ True | GainControl$ True | SpellDescription$ Put a creature card exiled with this permanent onto the battlefield under your control. SVar:Picture:http://www.wizards.com/global/images/magic/general/tomb_of_the_dusk_rose.jpg Oracle:(Transforms from Profane Procession.)\n{T}: Add one mana of any color.\n{2}{W}{B},{T}: Put a creature card exiled with this permanent onto the battlefield under your control. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt b/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt index 04840d1cef6..071b98ba579 100644 --- a/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt +++ b/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Gorgon PT:7/5 A:AB$ MustBlock | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Target creature blocks CARDNAME this turn if able. A:AB$ ChangeZone | Cost$ B G | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.blockingSource,Creature.blockedBySource | TgtPrompt$ Select target creature blocking Sisters of Stone Death | RememberTargets$ True | SpellDescription$ Exile target creature blocking or blocked by CARDNAME. -A:AB$ ChangeZone | Cost$ 2 B | Origin$ Exile | Destination$ Battlefield | ValidTgts$ Creature.IsRemembered+ExiledWithSource | GainControl$ True | SpellDescription$ Put a creature card exiled with CARDNAME onto the battlefield under your control. +A:AB$ ChangeZone | Cost$ 2 B | Origin$ Exile | Destination$ Battlefield | ChangeType$ Creature.IsRemembered+ExiledWithSource | Hidden$ True | Mandatory$ True | GainControl$ True | SpellDescription$ Put a creature card exiled with CARDNAME onto the battlefield under your control. T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered+ExiledWithSource | Execute$ DBForget SVar:DBForget:DB$ Pump | ForgetImprinted$ TriggeredCard T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Any | Execute$ DBCleanup | Static$ True | Secondary$ True | TriggerDescription$ Forget all remembered cards. From d5d08b2443a834bbaf5d2aec5ea5ee588f3a532b Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 30 Nov 2018 08:21:54 +0300 Subject: [PATCH 264/901] - Use ChooseCard to pick a card for the change zone (AI-compatible implementation, should be functionally identical). --- .../p/profane_procession_tomb_of_the_dusk_rose.txt | 5 +++-- forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt b/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt index af1d5798391..25f4f6061a6 100644 --- a/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt +++ b/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt @@ -13,6 +13,7 @@ Name:Tomb of the Dusk Rose ManaCost:no cost Types:Legendary Land A:AB$ Mana | Cost$ T | Produced$ Any | Amount$ 1 | SpellDescription$ Add one mana of any color. -A:AB$ ChangeZone | Cost$ 2 W B T | Origin$ Exile | Destination$ Battlefield | ChangeType$ Creature.IsRemembered+ExiledWithSource | Hidden$ True | Mandatory$ True | GainControl$ True | SpellDescription$ Put a creature card exiled with this permanent onto the battlefield under your control. +A:AB$ ChooseCard | Cost$ 2 W B T | Choices$ Creature.IsRemembered+ExiledWithSource | ChoiceZone$ Exile | SubAbility$ DBChangeZone | AILogic$ AtLeast1 | Mandatory$ True | SpellDescription$ Put a creature card exiled with this permanent onto the battlefield under your control. +SVar:DBChangeZone:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Exile | Destination$ Battlefield | ChangeType$ Creature.IsRemembered+ExiledWithSource | ChangeNum$ 1 | GainControl$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/tomb_of_the_dusk_rose.jpg -Oracle:(Transforms from Profane Procession.)\n{T}: Add one mana of any color.\n{2}{W}{B},{T}: Put a creature card exiled with this permanent onto the battlefield under your control. \ No newline at end of file +Oracle:(Transforms from Profane Procession.)\n{T}: Add one mana of any color.\n{2}{W}{B},{T}: Put a creature card exiled with this permanent onto the battlefield under your control. diff --git a/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt b/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt index 071b98ba579..cf74812459a 100644 --- a/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt +++ b/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt @@ -4,10 +4,12 @@ Types:Legendary Creature Gorgon PT:7/5 A:AB$ MustBlock | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Target creature blocks CARDNAME this turn if able. A:AB$ ChangeZone | Cost$ B G | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.blockingSource,Creature.blockedBySource | TgtPrompt$ Select target creature blocking Sisters of Stone Death | RememberTargets$ True | SpellDescription$ Exile target creature blocking or blocked by CARDNAME. -A:AB$ ChangeZone | Cost$ 2 B | Origin$ Exile | Destination$ Battlefield | ChangeType$ Creature.IsRemembered+ExiledWithSource | Hidden$ True | Mandatory$ True | GainControl$ True | SpellDescription$ Put a creature card exiled with CARDNAME onto the battlefield under your control. +A:AB$ ChooseCard | Cost$ 2 B | Choices$ Creature.IsRemembered+ExiledWithSource | ChoiceZone$ Exile | AILogic$ AtLeast1 | Mandatory$ True | SubAbility$ DBChangeZone | SpellDescription$ Put a creature card exiled with CARDNAME onto the battlefield under your control. +SVar:DBChangeZone:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Exile | Destination$ Battlefield | ChangeType$ Creature.IsRemembered+ExiledWithSource | ChangeNum$ 1 | GainControl$ True T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered+ExiledWithSource | Execute$ DBForget SVar:DBForget:DB$ Pump | ForgetImprinted$ TriggeredCard T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Any | Execute$ DBCleanup | Static$ True | Secondary$ True | TriggerDescription$ Forget all remembered cards. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/sisters_of_stone_death.jpg Oracle:{G}: Target creature blocks Sisters of Stone Death this turn if able.\n{B}{G}: Exile target creature blocking or blocked by Sisters of Stone Death.\n{2}{B}: Put a creature card exiled with Sisters of Stone Death onto the battlefield under your control. + From 6da3fd898fe308c903054b5cbc8af8af0d331f73 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 30 Nov 2018 09:10:55 +0300 Subject: [PATCH 265/901] - Attempting to implement a more concise and correct code for Sisters of Stone Death which would also work for the AI. --- forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java | 6 +++++- .../p/profane_procession_tomb_of_the_dusk_rose.txt | 4 ++-- forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt | 3 +-- 3 files changed, 8 insertions(+), 5 deletions(-) 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..ee8c766f31b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -314,7 +314,11 @@ public class ChangeZoneAi extends SpellAbilityAi { } for (final Player p : pDefined) { - CardCollectionView list = p.getCardsIn(origin); + // TODO: figure out how to make the AI properly establish which zones to look in for cards like Sisters of Stone Death + // without needing a separate AI logic for it (the issue is that there's no Defined/DefinedPlayer in cards like that, and + // the AI normally defaults to its own zone in these cases) + CardCollectionView list = "CheckAllPlayerZones".equals(sa.getParam("AILogic")) ? p.getGame().getCardsIn(origin) + : p.getCardsIn(origin); if (type != null && p == ai) { // AI only "knows" about his information diff --git a/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt b/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt index 25f4f6061a6..89b778373c4 100644 --- a/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt +++ b/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt @@ -13,7 +13,7 @@ Name:Tomb of the Dusk Rose ManaCost:no cost Types:Legendary Land A:AB$ Mana | Cost$ T | Produced$ Any | Amount$ 1 | SpellDescription$ Add one mana of any color. -A:AB$ ChooseCard | Cost$ 2 W B T | Choices$ Creature.IsRemembered+ExiledWithSource | ChoiceZone$ Exile | SubAbility$ DBChangeZone | AILogic$ AtLeast1 | Mandatory$ True | SpellDescription$ Put a creature card exiled with this permanent onto the battlefield under your control. -SVar:DBChangeZone:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Exile | Destination$ Battlefield | ChangeType$ Creature.IsRemembered+ExiledWithSource | ChangeNum$ 1 | GainControl$ True +A:AB$ ChangeZone | Cost$ 2 W B T | Origin$ Exile | Destination$ Battlefield | ChangeType$ Creature.IsRemembered+ExiledWithSource | Hidden$ True | Mandatory$ True | GainControl$ True | AILogic$ CheckAllPlayerZones | SpellDescription$ Put a creature card exiled with this permanent onto the battlefield under your control. | StackDescription$ SpellDescription SVar:Picture:http://www.wizards.com/global/images/magic/general/tomb_of_the_dusk_rose.jpg Oracle:(Transforms from Profane Procession.)\n{T}: Add one mana of any color.\n{2}{W}{B},{T}: Put a creature card exiled with this permanent onto the battlefield under your control. + diff --git a/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt b/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt index cf74812459a..c6243e10d9f 100644 --- a/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt +++ b/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt @@ -4,8 +4,7 @@ Types:Legendary Creature Gorgon PT:7/5 A:AB$ MustBlock | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Target creature blocks CARDNAME this turn if able. A:AB$ ChangeZone | Cost$ B G | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.blockingSource,Creature.blockedBySource | TgtPrompt$ Select target creature blocking Sisters of Stone Death | RememberTargets$ True | SpellDescription$ Exile target creature blocking or blocked by CARDNAME. -A:AB$ ChooseCard | Cost$ 2 B | Choices$ Creature.IsRemembered+ExiledWithSource | ChoiceZone$ Exile | AILogic$ AtLeast1 | Mandatory$ True | SubAbility$ DBChangeZone | SpellDescription$ Put a creature card exiled with CARDNAME onto the battlefield under your control. -SVar:DBChangeZone:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Exile | Destination$ Battlefield | ChangeType$ Creature.IsRemembered+ExiledWithSource | ChangeNum$ 1 | GainControl$ True +A:AB$ ChangeZone | Cost$ 2 B | Origin$ Exile | Destination$ Battlefield | ChangeType$ Creature.IsRemembered+ExiledWithSource | Hidden$ True | Mandatory$ True | GainControl$ True | AILogic$ CheckAllPlayerZones | SpellDescription$ Put a creature card exiled with CARDNAME onto the battlefield under your control. | StackDescription$ SpellDescription T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered+ExiledWithSource | Execute$ DBForget SVar:DBForget:DB$ Pump | ForgetImprinted$ TriggeredCard T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Any | Execute$ DBCleanup | Static$ True | Secondary$ True | TriggerDescription$ Forget all remembered cards. From 770317805c5dd008343d4adbf80e5fb061c209f4 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 30 Nov 2018 09:21:44 +0300 Subject: [PATCH 266/901] - Attempting to avoid an AI logic spec (needs testing). --- .../src/main/java/forge/ai/ability/ChangeZoneAi.java | 10 ++++------ .../p/profane_procession_tomb_of_the_dusk_rose.txt | 2 +- forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt | 2 +- 3 files changed, 6 insertions(+), 8 deletions(-) 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 ee8c766f31b..05cbe47bdcf 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -298,8 +298,10 @@ public class ChangeZoneAi extends SpellAbilityAi { } else { if (sa.hasParam("DefinedPlayer")) { pDefined = AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("DefinedPlayer"), sa); - } else { + } else if (sa.hasParam("Defined")) { pDefined = AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("Defined"), sa); + } else { + pDefined = ai.getGame().getPlayers(); // no Defined players, assume all player zones } } @@ -314,11 +316,7 @@ public class ChangeZoneAi extends SpellAbilityAi { } for (final Player p : pDefined) { - // TODO: figure out how to make the AI properly establish which zones to look in for cards like Sisters of Stone Death - // without needing a separate AI logic for it (the issue is that there's no Defined/DefinedPlayer in cards like that, and - // the AI normally defaults to its own zone in these cases) - CardCollectionView list = "CheckAllPlayerZones".equals(sa.getParam("AILogic")) ? p.getGame().getCardsIn(origin) - : p.getCardsIn(origin); + CardCollectionView list = p.getCardsIn(origin); if (type != null && p == ai) { // AI only "knows" about his information diff --git a/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt b/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt index 89b778373c4..9f64f74533a 100644 --- a/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt +++ b/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt @@ -13,7 +13,7 @@ Name:Tomb of the Dusk Rose ManaCost:no cost Types:Legendary Land A:AB$ Mana | Cost$ T | Produced$ Any | Amount$ 1 | SpellDescription$ Add one mana of any color. -A:AB$ ChangeZone | Cost$ 2 W B T | Origin$ Exile | Destination$ Battlefield | ChangeType$ Creature.IsRemembered+ExiledWithSource | Hidden$ True | Mandatory$ True | GainControl$ True | AILogic$ CheckAllPlayerZones | SpellDescription$ Put a creature card exiled with this permanent onto the battlefield under your control. | StackDescription$ SpellDescription +A:AB$ ChangeZone | Cost$ 2 W B T | Origin$ Exile | Destination$ Battlefield | ChangeType$ Creature.IsRemembered+ExiledWithSource | Hidden$ True | Mandatory$ True | GainControl$ True | SpellDescription$ Put a creature card exiled with this permanent onto the battlefield under your control. | StackDescription$ SpellDescription SVar:Picture:http://www.wizards.com/global/images/magic/general/tomb_of_the_dusk_rose.jpg Oracle:(Transforms from Profane Procession.)\n{T}: Add one mana of any color.\n{2}{W}{B},{T}: Put a creature card exiled with this permanent onto the battlefield under your control. diff --git a/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt b/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt index c6243e10d9f..b424ae91b2d 100644 --- a/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt +++ b/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Gorgon PT:7/5 A:AB$ MustBlock | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Target creature blocks CARDNAME this turn if able. A:AB$ ChangeZone | Cost$ B G | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.blockingSource,Creature.blockedBySource | TgtPrompt$ Select target creature blocking Sisters of Stone Death | RememberTargets$ True | SpellDescription$ Exile target creature blocking or blocked by CARDNAME. -A:AB$ ChangeZone | Cost$ 2 B | Origin$ Exile | Destination$ Battlefield | ChangeType$ Creature.IsRemembered+ExiledWithSource | Hidden$ True | Mandatory$ True | GainControl$ True | AILogic$ CheckAllPlayerZones | SpellDescription$ Put a creature card exiled with CARDNAME onto the battlefield under your control. | StackDescription$ SpellDescription +A:AB$ ChangeZone | Cost$ 2 B | Origin$ Exile | Destination$ Battlefield | ChangeType$ Creature.IsRemembered+ExiledWithSource | Hidden$ True | Mandatory$ True | GainControl$ True | SpellDescription$ Put a creature card exiled with CARDNAME onto the battlefield under your control. | StackDescription$ SpellDescription T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered+ExiledWithSource | Execute$ DBForget SVar:DBForget:DB$ Pump | ForgetImprinted$ TriggeredCard T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Any | Execute$ DBCleanup | Static$ True | Secondary$ True | TriggerDescription$ Forget all remembered cards. From 01f7297159af17244eefa2799cbba14bc45b903d Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 30 Nov 2018 09:41:16 +0300 Subject: [PATCH 267/901] Revert "- Attempting to implement a more concise and correct code for Sisters of Stone Death which would also work for the AI." This reverts commit 6da3fd8 --- .../p/profane_procession_tomb_of_the_dusk_rose.txt | 4 ++-- forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt b/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt index 9f64f74533a..25f4f6061a6 100644 --- a/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt +++ b/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt @@ -13,7 +13,7 @@ Name:Tomb of the Dusk Rose ManaCost:no cost Types:Legendary Land A:AB$ Mana | Cost$ T | Produced$ Any | Amount$ 1 | SpellDescription$ Add one mana of any color. -A:AB$ ChangeZone | Cost$ 2 W B T | Origin$ Exile | Destination$ Battlefield | ChangeType$ Creature.IsRemembered+ExiledWithSource | Hidden$ True | Mandatory$ True | GainControl$ True | SpellDescription$ Put a creature card exiled with this permanent onto the battlefield under your control. | StackDescription$ SpellDescription +A:AB$ ChooseCard | Cost$ 2 W B T | Choices$ Creature.IsRemembered+ExiledWithSource | ChoiceZone$ Exile | SubAbility$ DBChangeZone | AILogic$ AtLeast1 | Mandatory$ True | SpellDescription$ Put a creature card exiled with this permanent onto the battlefield under your control. +SVar:DBChangeZone:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Exile | Destination$ Battlefield | ChangeType$ Creature.IsRemembered+ExiledWithSource | ChangeNum$ 1 | GainControl$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/tomb_of_the_dusk_rose.jpg Oracle:(Transforms from Profane Procession.)\n{T}: Add one mana of any color.\n{2}{W}{B},{T}: Put a creature card exiled with this permanent onto the battlefield under your control. - diff --git a/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt b/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt index b424ae91b2d..cf74812459a 100644 --- a/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt +++ b/forge-gui/res/cardsfolder/s/sisters_of_stone_death.txt @@ -4,7 +4,8 @@ Types:Legendary Creature Gorgon PT:7/5 A:AB$ MustBlock | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Target creature blocks CARDNAME this turn if able. A:AB$ ChangeZone | Cost$ B G | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.blockingSource,Creature.blockedBySource | TgtPrompt$ Select target creature blocking Sisters of Stone Death | RememberTargets$ True | SpellDescription$ Exile target creature blocking or blocked by CARDNAME. -A:AB$ ChangeZone | Cost$ 2 B | Origin$ Exile | Destination$ Battlefield | ChangeType$ Creature.IsRemembered+ExiledWithSource | Hidden$ True | Mandatory$ True | GainControl$ True | SpellDescription$ Put a creature card exiled with CARDNAME onto the battlefield under your control. | StackDescription$ SpellDescription +A:AB$ ChooseCard | Cost$ 2 B | Choices$ Creature.IsRemembered+ExiledWithSource | ChoiceZone$ Exile | AILogic$ AtLeast1 | Mandatory$ True | SubAbility$ DBChangeZone | SpellDescription$ Put a creature card exiled with CARDNAME onto the battlefield under your control. +SVar:DBChangeZone:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Exile | Destination$ Battlefield | ChangeType$ Creature.IsRemembered+ExiledWithSource | ChangeNum$ 1 | GainControl$ True T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered+ExiledWithSource | Execute$ DBForget SVar:DBForget:DB$ Pump | ForgetImprinted$ TriggeredCard T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Any | Execute$ DBCleanup | Static$ True | Secondary$ True | TriggerDescription$ Forget all remembered cards. From 36d2b4573a164d5166ccf26b705eb3069badf697 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 30 Nov 2018 09:41:45 +0300 Subject: [PATCH 268/901] Revert "- Attempting to avoid an AI logic spec (needs testing)." This reverts commit 7703178 --- .../src/main/java/forge/ai/ability/ChangeZoneAi.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) 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 05cbe47bdcf..ee8c766f31b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -298,10 +298,8 @@ public class ChangeZoneAi extends SpellAbilityAi { } else { if (sa.hasParam("DefinedPlayer")) { pDefined = AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("DefinedPlayer"), sa); - } else if (sa.hasParam("Defined")) { - pDefined = AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("Defined"), sa); } else { - pDefined = ai.getGame().getPlayers(); // no Defined players, assume all player zones + pDefined = AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("Defined"), sa); } } @@ -316,7 +314,11 @@ public class ChangeZoneAi extends SpellAbilityAi { } for (final Player p : pDefined) { - CardCollectionView list = p.getCardsIn(origin); + // TODO: figure out how to make the AI properly establish which zones to look in for cards like Sisters of Stone Death + // without needing a separate AI logic for it (the issue is that there's no Defined/DefinedPlayer in cards like that, and + // the AI normally defaults to its own zone in these cases) + CardCollectionView list = "CheckAllPlayerZones".equals(sa.getParam("AILogic")) ? p.getGame().getCardsIn(origin) + : p.getCardsIn(origin); if (type != null && p == ai) { // AI only "knows" about his information From c01d4d695a6906af214e2b91ce086c131f1911b7 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 30 Nov 2018 09:47:53 +0300 Subject: [PATCH 269/901] - Fixed Profane Procession not forgetting cards when it changes zone. --- .../cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt b/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt index 25f4f6061a6..7f3bbed3494 100644 --- a/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt +++ b/forge-gui/res/cardsfolder/p/profane_procession_tomb_of_the_dusk_rose.txt @@ -3,6 +3,8 @@ ManaCost:1 W B Types:Legendary Enchantment A:AB$ ChangeZone | Cost$ 3 W B | ValidTgts$ Creature | TgtPrompt$ Choose target creature. | Origin$ Battlefield | Destination$ Exile | RememberTargets$ True | SubAbility$ DBTransform | SpellDescription$ Exile target creature. Then if there are three or more cards exiled with CARDNAME, transform it. SVar:DBTransform:DB$ SetState | ConditionDefined$ Remembered | ConditionPresent$ Card.ExiledWithSource | ConditionCompare$ GE3 | Defined$ Self | Mode$ Transform +T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Any | Execute$ DBCleanup | Static$ True | Secondary$ True | TriggerDescription$ Forget all remembered cards. +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True AlternateMode:DoubleFaced SVar:Picture:http://www.wizards.com/global/images/magic/general/profane_procession.jpg Oracle:{3}{W}{B}: Exile target creature. Then if there are three or more cards exiled with Profane Procession, transform it. From ea8fb9870a7f1461427a2347bed71fac94845978 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 30 Nov 2018 09:48:40 +0300 Subject: [PATCH 270/901] - Reverted ChangeZoneAi. --- forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 ee8c766f31b..c3e7d7f42dd 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -317,8 +317,7 @@ public class ChangeZoneAi extends SpellAbilityAi { // TODO: figure out how to make the AI properly establish which zones to look in for cards like Sisters of Stone Death // without needing a separate AI logic for it (the issue is that there's no Defined/DefinedPlayer in cards like that, and // the AI normally defaults to its own zone in these cases) - CardCollectionView list = "CheckAllPlayerZones".equals(sa.getParam("AILogic")) ? p.getGame().getCardsIn(origin) - : p.getCardsIn(origin); + CardCollectionView list = p.getCardsIn(origin); if (type != null && p == ai) { // AI only "knows" about his information From ad990ae68b833f16c40b9e598deedd2e0966ad57 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 30 Nov 2018 09:49:17 +0300 Subject: [PATCH 271/901] - Reverted ChangeZoneAi, part 2. --- forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java | 3 --- 1 file changed, 3 deletions(-) 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 c3e7d7f42dd..e5c52128bef 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -314,9 +314,6 @@ public class ChangeZoneAi extends SpellAbilityAi { } for (final Player p : pDefined) { - // TODO: figure out how to make the AI properly establish which zones to look in for cards like Sisters of Stone Death - // without needing a separate AI logic for it (the issue is that there's no Defined/DefinedPlayer in cards like that, and - // the AI normally defaults to its own zone in these cases) CardCollectionView list = p.getCardsIn(origin); if (type != null && p == ai) { From f4475bff376f864f5268c4d2fff6169ee2cfa518 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 30 Nov 2018 10:49:01 +0300 Subject: [PATCH 272/901] - Improved Flash AI logic. --- .../java/forge/ai/ability/PermanentCreatureAi.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java index e46445f3688..717e69d4c9e 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java @@ -13,6 +13,7 @@ import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.spellability.SpellAbility; +import forge.game.staticability.StaticAbility; import forge.game.zone.ZoneType; import forge.util.MyRandom; @@ -183,9 +184,19 @@ public class PermanentCreatureAi extends PermanentAi { // too random to likely be meaningful, serious improvement might be needed. return true; } else { + boolean canCastAtOppEOT = true; + for (Card c : ai.getGame().getCardsIn(ZoneType.Battlefield)) { + for (StaticAbility s : c.getStaticAbilities()) { + if ("CantBeCast".equals(s.getParam("Mode")) && "True".equals(s.getParam("NonCasterTurn"))) { + canCastAtOppEOT = false; + } + } + + } + // Doesn't have a ETB trigger and doesn't seem to be good as an ambusher, try to surprise the opp before my turn // TODO: maybe implement a way to reserve mana for this - return isEOTBeforeMyTurn; + return canCastAtOppEOT ? isEOTBeforeMyTurn : isOwnEOT; } } From 5c047b3849d8ce88a5dfc6d5a54889d086d1ca73 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 30 Nov 2018 22:12:44 +0300 Subject: [PATCH 273/901] - Some updates to Flash and PermanentCreatureAi logic. --- .../src/main/java/forge/ai/ComputerUtil.java | 16 ++++++++++++ .../forge/ai/ability/PermanentCreatureAi.java | 25 +++++++++---------- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index bd641d635c9..3ab921871c7 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -958,6 +958,22 @@ public class ComputerUtil { return true; } + // if we have non-persistent mana in our pool, would be good to try to use it and not waste it + if (ai.getManaPool().willManaBeLostAtEndOfPhase()) { + boolean canUseToPayCost = false; + for (byte color : MagicColor.WUBRGC) { + if (ai.getManaPool().getAmountOfColor(color) > 0 + && ((card.getManaCost().getColorProfile() & color) == color)) { + canUseToPayCost = true; + break; + } + } + + if (canUseToPayCost) { + return true; + } + } + if (card.isCreature() && !card.hasKeyword(Keyword.DEFENDER) && (card.hasKeyword(Keyword.HASTE) || ComputerUtil.hasACardGivingHaste(ai, true) || sa.isDash())) { return true; diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java index 717e69d4c9e..25993d5c7ce 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java @@ -161,6 +161,15 @@ public class PermanentCreatureAi extends PermanentAi { int chanceToCastForETB = aic.getIntProperty(AiProps.FLASH_CHANCE_TO_CAST_DUE_TO_ETB_EFFECTS); int chanceToRespondToStack = aic.getIntProperty(AiProps.FLASH_CHANCE_TO_RESPOND_TO_STACK_WITH_ETB); int chanceToProcETBBeforeMain1 = aic.getIntProperty(AiProps.FLASH_CHANCE_TO_CAST_FOR_ETB_BEFORE_MAIN1); + boolean canCastAtOppTurn = true; + for (Card c : ai.getGame().getCardsIn(ZoneType.Battlefield)) { + for (StaticAbility s : c.getStaticAbilities()) { + if ("CantBeCast".equals(s.getParam("Mode")) && "True".equals(s.getParam("NonCasterTurn"))) { + canCastAtOppTurn = false; + } + } + } + if (hasFloatMana || willDiscardNow || willDieNow) { // Will lose mana in pool or about to discard a card in cleanup or about to die in combat, so use this opportunity @@ -170,7 +179,7 @@ public class PermanentCreatureAi extends PermanentAi { return isMyMain1OrLater; } else if (hasAmbushAI && MyRandom.percentTrue(chanceToObeyAmbushAI)) { // Is an ambusher, so try to hold for declare blockers in combat where the AI defends, if possible - return defOnlyAmbushAI ? isOppDeclareAttackers : (isOppDeclareAttackers || isMyDeclareBlockers); + return defOnlyAmbushAI && canCastAtOppTurn ? isOppDeclareAttackers : (isOppDeclareAttackers || isMyDeclareBlockers); } else if (valuableBlocker && isOppDeclareAttackers && MyRandom.percentTrue(chanceToAddBlocker)) { // Might serve as a valuable blocker in a combat where we are behind on untapped blockers return true; @@ -182,21 +191,11 @@ public class PermanentCreatureAi extends PermanentAi { } else if (hasETBTrigger && canRespondToStack && MyRandom.percentTrue(chanceToRespondToStack)) { // Try to do something meaningful in response to an opposing effect on stack. Note that this is currently // too random to likely be meaningful, serious improvement might be needed. - return true; + return canCastAtOppTurn || ph.getPlayerTurn().equals(ai); } else { - boolean canCastAtOppEOT = true; - for (Card c : ai.getGame().getCardsIn(ZoneType.Battlefield)) { - for (StaticAbility s : c.getStaticAbilities()) { - if ("CantBeCast".equals(s.getParam("Mode")) && "True".equals(s.getParam("NonCasterTurn"))) { - canCastAtOppEOT = false; - } - } - - } - // Doesn't have a ETB trigger and doesn't seem to be good as an ambusher, try to surprise the opp before my turn // TODO: maybe implement a way to reserve mana for this - return canCastAtOppEOT ? isEOTBeforeMyTurn : isOwnEOT; + return canCastAtOppTurn ? isEOTBeforeMyTurn : isOwnEOT; } } From c064ec3860e42305dba3407a602393044a782da5 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 30 Nov 2018 22:57:29 +0300 Subject: [PATCH 274/901] - Improved UntapAllAi a little, modified AmbushAI flag for Angel of the Dire Hour. --- .../src/main/java/forge/ai/ability/UntapAllAi.java | 10 ++++++++++ forge-gui/res/cardsfolder/a/angel_of_the_dire_hour.txt | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/UntapAllAi.java b/forge-ai/src/main/java/forge/ai/ability/UntapAllAi.java index 355c8989ac1..9c43797bcd5 100644 --- a/forge-ai/src/main/java/forge/ai/ability/UntapAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/UntapAllAi.java @@ -5,6 +5,7 @@ import forge.game.ability.ApiType; import forge.game.card.Card; import forge.game.card.CardCollectionView; import forge.game.card.CardLists; +import forge.game.card.CardPredicates; import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.spellability.AbilitySub; @@ -35,6 +36,15 @@ public class UntapAllAi extends SpellAbilityAi { @Override protected boolean doTriggerAINoCost(Player aiPlayer, SpellAbility sa, boolean mandatory) { + Card source = sa.getHostCard(); + + if (sa.hasParam("ValidCards")) { + String valid = sa.getParam("ValidCards"); + CardCollectionView list = CardLists.filter(aiPlayer.getGame().getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.TAPPED); + list = CardLists.getValidCards(list, valid.split(","), source.getController(), source, sa); + return mandatory || !list.isEmpty(); + } + return mandatory; } } diff --git a/forge-gui/res/cardsfolder/a/angel_of_the_dire_hour.txt b/forge-gui/res/cardsfolder/a/angel_of_the_dire_hour.txt index 38d43b78ba6..61710ba4e11 100644 --- a/forge-gui/res/cardsfolder/a/angel_of_the_dire_hour.txt +++ b/forge-gui/res/cardsfolder/a/angel_of_the_dire_hour.txt @@ -6,6 +6,6 @@ K:Flash K:Flying T:Mode$ ChangesZone | ValidCard$ Card.wasCastFromHand+Self | Destination$ Battlefield | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it from your hand, exile all attacking creatures. SVar:TrigExile:DB$ ChangeZoneAll | ChangeType$ Creature.attacking | Origin$ Battlefield | Destination$ Exile -SVar:AmbushAI:True +SVar:AmbushAI:BlockOnly SVar:Picture:http://www.wizards.com/global/images/magic/general/angel_of_the_dire_hour.jpg Oracle:Flash\nFlying\nWhen Angel of the Dire Hour enters the battlefield, if you cast it from your hand, exile all attacking creatures. From 33268e1b0be241fbfd3b9de58f82b21b568a7ff3 Mon Sep 17 00:00:00 2001 From: Pedro Ferreira Date: Sat, 1 Dec 2018 18:52:12 +0100 Subject: [PATCH 275/901] Add option to download missing card art on the fly --- forge-gui-android/src/forge/app/Main.java | 10 +++ .../src/main/java/forge/CachedCardImage.java | 7 +- .../src/main/java/forge/GuiDesktop.java | 12 ++-- .../main/java/forge/gui/CardPicturePanel.java | 5 +- .../java/forge/util/SwingImageFetcher.java | 57 +++++++++++++++ forge-gui-ios/src/forge/ios/Main.java | 9 +++ forge-gui-mobile-dev/src/forge/app/Main.java | 11 ++- .../src/forge/CachedCardImage.java | 41 +++++++++++ forge-gui-mobile/src/forge/GuiMobile.java | 12 ++-- .../src/forge/assets/ImageCache.java | 7 -- .../src/forge/card/CardRenderer.java | 46 ++++++++++-- .../forge/screens/settings/SettingsPage.java | 4 ++ .../src/forge/util/LibGDXImageFetcher.java | 62 ++++++++++++++++ .../java/forge/interfaces/IDeviceAdapter.java | 5 ++ .../main/java/forge/interfaces/IGuiBase.java | 2 + .../main/java/forge/util}/ImageFetcher.java | 70 ++++--------------- 16 files changed, 278 insertions(+), 82 deletions(-) create mode 100644 forge-gui-desktop/src/main/java/forge/util/SwingImageFetcher.java create mode 100644 forge-gui-mobile/src/forge/CachedCardImage.java create mode 100644 forge-gui-mobile/src/forge/util/LibGDXImageFetcher.java rename {forge-gui-desktop/src/main/java/forge => forge-gui/src/main/java/forge/util}/ImageFetcher.java (67%) diff --git a/forge-gui-android/src/forge/app/Main.java b/forge-gui-android/src/forge/app/Main.java index c235fb01ef2..bf4c73e0e4f 100644 --- a/forge-gui-android/src/forge/app/Main.java +++ b/forge-gui-android/src/forge/app/Main.java @@ -9,6 +9,8 @@ import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.res.Configuration; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; @@ -28,6 +30,8 @@ import forge.util.FileUtil; import forge.util.ThreadUtil; import java.io.File; +import java.io.InputStream; +import java.io.OutputStream; import java.util.concurrent.Callable; public class Main extends AndroidApplication { @@ -243,5 +247,11 @@ public class Main extends AndroidApplication { } }); } + + @Override + public void convertToJPEG(InputStream input, OutputStream output) { + Bitmap bmp = BitmapFactory.decodeStream(input); + bmp.compress(Bitmap.CompressFormat.JPEG, 100, output); + } } } diff --git a/forge-gui-desktop/src/main/java/forge/CachedCardImage.java b/forge-gui-desktop/src/main/java/forge/CachedCardImage.java index 8a34907f3d2..67c57a1d1bd 100644 --- a/forge-gui-desktop/src/main/java/forge/CachedCardImage.java +++ b/forge-gui-desktop/src/main/java/forge/CachedCardImage.java @@ -4,6 +4,9 @@ import java.awt.image.BufferedImage; import forge.game.card.CardView; import forge.game.player.PlayerView; +import forge.util.ImageFetcher; +import forge.util.SwingImageFetcher; + public abstract class CachedCardImage implements ImageFetcher.Callback { final CardView card; @@ -11,6 +14,8 @@ public abstract class CachedCardImage implements ImageFetcher.Callback { final int width; final int height; + static final SwingImageFetcher fetcher = new SwingImageFetcher(); + public CachedCardImage(final CardView card, final Iterable viewers, final int width, final int height) { this.card = card; this.viewers = viewers; @@ -19,7 +24,7 @@ public abstract class CachedCardImage implements ImageFetcher.Callback { BufferedImage image = ImageCache.getImageNoDefault(card, viewers, width, height); if (image == null) { String key = card.getCurrentState().getImageKey(viewers); - ImageFetcher.fetchImage(card, key, this); + fetcher.fetchImage(key, this); } } diff --git a/forge-gui-desktop/src/main/java/forge/GuiDesktop.java b/forge-gui-desktop/src/main/java/forge/GuiDesktop.java index 6e4e7f7385a..ae3bc960403 100644 --- a/forge-gui-desktop/src/main/java/forge/GuiDesktop.java +++ b/forge-gui-desktop/src/main/java/forge/GuiDesktop.java @@ -23,10 +23,7 @@ import forge.sound.*; import forge.toolbox.FOptionPane; import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinImage; -import forge.util.BuildInfo; -import forge.util.Callback; -import forge.util.FileUtil; -import forge.util.OperatingSystem; +import forge.util.*; import org.apache.commons.lang3.StringUtils; import javax.swing.*; @@ -42,6 +39,8 @@ import java.util.Collection; import java.util.List; public class GuiDesktop implements IGuiBase { + private ImageFetcher imageFetcher = new SwingImageFetcher(); + @Override public boolean isRunningOnDesktop() { return true; @@ -63,6 +62,11 @@ public class GuiDesktop implements IGuiBase { "../forge-gui/" : ""; } + @Override + public ImageFetcher getImageFetcher() { + return imageFetcher; + } + @Override public void invokeInEdtNow(final Runnable proc) { proc.run(); diff --git a/forge-gui-desktop/src/main/java/forge/gui/CardPicturePanel.java b/forge-gui-desktop/src/main/java/forge/gui/CardPicturePanel.java index 17b1d5ae1d7..17cf49e6e0a 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/CardPicturePanel.java +++ b/forge-gui-desktop/src/main/java/forge/gui/CardPicturePanel.java @@ -24,8 +24,9 @@ import java.awt.image.WritableRaster; import javax.swing.JPanel; +import forge.GuiBase; import forge.ImageCache; -import forge.ImageFetcher; +import forge.util.ImageFetcher; import forge.ImageKeys; import forge.game.card.CardView.CardStateView; import forge.item.InventoryItem; @@ -115,7 +116,7 @@ public final class CardPicturePanel extends JPanel implements ImageFetcher.Callb CardStateView card = (CardStateView) displayed; BufferedImage image = ImageCache.getOriginalImage(card.getImageKey(), false); if (image == null) { - ImageFetcher.fetchImage(card.getCard(), card.getImageKey(), this); + GuiBase.getInterface().getImageFetcher().fetchImage(card.getImageKey(), this); } return FImageUtil.getImage((CardStateView) displayed); } diff --git a/forge-gui-desktop/src/main/java/forge/util/SwingImageFetcher.java b/forge-gui-desktop/src/main/java/forge/util/SwingImageFetcher.java new file mode 100644 index 00000000000..7949a3e1f10 --- /dev/null +++ b/forge-gui-desktop/src/main/java/forge/util/SwingImageFetcher.java @@ -0,0 +1,57 @@ +package forge.util; + +import javax.imageio.ImageIO; +import javax.swing.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.net.URL; + +public class SwingImageFetcher extends ImageFetcher { + + @Override + protected Runnable getDownloadTask(String[] downloadUrls, String destPath, Runnable notifyObservers) { + return new SwingDownloadTask(downloadUrls, destPath, notifyObservers); + } + + private static class SwingDownloadTask implements Runnable { + private final String[] downloadUrls; + private final String destPath; + private final Runnable notifyObservers; + + public SwingDownloadTask(String[] downloadUrls, String destPath, Runnable notifyObservers) { + this.downloadUrls = downloadUrls; + this.destPath = destPath; + this.notifyObservers = notifyObservers; + } + + private void doFetch(String urlToDownload) throws IOException { + URL url = new URL(urlToDownload); + System.out.println("Attempting to fetch: " + url); + java.net.URLConnection c = url.openConnection(); + c.setRequestProperty("User-Agent", ""); + BufferedImage image = ImageIO.read(c.getInputStream()); + // First, save to a temporary file so that nothing tries to read + // a partial download. + File destFile = new File(destPath + ".tmp"); + destFile.mkdirs(); + ImageIO.write(image, "jpg", destFile); + // Now, rename it to the correct name. + destFile.renameTo(new File(destPath)); + System.out.println("Saved image to " + destPath); + SwingUtilities.invokeLater(notifyObservers); + } + + public void run() { + for (String urlToDownload : downloadUrls) { + try { + doFetch(urlToDownload); + break; + } catch (IOException e) { + System.out.println("Failed to download card [" + destPath + "] image: " + e.getMessage()); + } + } + } + } + +} diff --git a/forge-gui-ios/src/forge/ios/Main.java b/forge-gui-ios/src/forge/ios/Main.java index cd1f569eca0..bad9865e574 100644 --- a/forge-gui-ios/src/forge/ios/Main.java +++ b/forge-gui-ios/src/forge/ios/Main.java @@ -13,6 +13,10 @@ import org.robovm.apple.foundation.NSAutoreleasePool; import org.robovm.apple.uikit.UIApplication; import org.robovm.apple.uikit.UIPasteboard; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + public class Main extends IOSApplication.Delegate { @Override @@ -94,5 +98,10 @@ public class Main extends IOSApplication.Delegate { public void exit() { // Not possible on iOS } + + @Override + public void convertToJPEG(InputStream input, OutputStream output) throws IOException { + + } } } \ No newline at end of file diff --git a/forge-gui-mobile-dev/src/forge/app/Main.java b/forge-gui-mobile-dev/src/forge/app/Main.java index 85c0ed08db0..d5a932cefda 100644 --- a/forge-gui-mobile-dev/src/forge/app/Main.java +++ b/forge-gui-mobile-dev/src/forge/app/Main.java @@ -13,9 +13,10 @@ import forge.util.RestartUtil; import forge.util.Utils; import org.apache.commons.cli.*; +import javax.imageio.ImageIO; import java.awt.*; -import java.io.File; -import java.io.IOException; +import java.awt.image.BufferedImage; +import java.io.*; public class Main { public static void main(String[] args) { @@ -162,5 +163,11 @@ public class Main { public void preventSystemSleep(boolean preventSleep) { OperatingSystem.preventSystemSleep(preventSleep); } + + @Override + public void convertToJPEG(InputStream input, OutputStream output) throws IOException { + BufferedImage image = ImageIO.read(input); + ImageIO.write(image, "jpg", output); + } } } diff --git a/forge-gui-mobile/src/forge/CachedCardImage.java b/forge-gui-mobile/src/forge/CachedCardImage.java new file mode 100644 index 00000000000..a58ffff4a27 --- /dev/null +++ b/forge-gui-mobile/src/forge/CachedCardImage.java @@ -0,0 +1,41 @@ +package forge; + +import com.badlogic.gdx.graphics.Texture; +import forge.assets.ImageCache; +import forge.game.card.CardView; +import forge.item.InventoryItem; +import forge.screens.match.MatchController; +import forge.util.ImageFetcher; + +public abstract class CachedCardImage implements ImageFetcher.Callback { + protected final String key; + static final ImageFetcher fetcher = GuiBase.getInterface().getImageFetcher(); + + public CachedCardImage(final CardView card) { + key = card.getCurrentState().getImageKey(MatchController.instance.getLocalPlayers()); + fetch(); + } + + public CachedCardImage(final InventoryItem ii) { + key = ii.getImageKey(false); + fetch(); + } + + public CachedCardImage(String key) { + this.key = key; + fetch(); + } + + public void fetch() { + Texture image = ImageCache.getImage(key, false); + if (image == null) { + fetcher.fetchImage(key, this); + } + } + + public Texture getImage() { + return ImageCache.getImage(key, true); + } + + public abstract void onImageFetched(); +} diff --git a/forge-gui-mobile/src/forge/GuiMobile.java b/forge-gui-mobile/src/forge/GuiMobile.java index 0d5bb9e1552..8cea9560f78 100644 --- a/forge-gui-mobile/src/forge/GuiMobile.java +++ b/forge-gui-mobile/src/forge/GuiMobile.java @@ -37,14 +37,11 @@ import forge.sound.IAudioClip; import forge.sound.IAudioMusic; import forge.toolbox.FOptionPane; import forge.toolbox.GuiChoose; -import forge.util.Callback; -import forge.util.FileUtil; -import forge.util.ThreadUtil; -import forge.util.WaitCallback; -import forge.util.WaitRunnable; +import forge.util.*; public class GuiMobile implements IGuiBase { private final String assetsDir; + private ImageFetcher imageFetcher = new LibGDXImageFetcher(); public GuiMobile(final String assetsDir0) { assetsDir = assetsDir0; @@ -70,6 +67,11 @@ public class GuiMobile implements IGuiBase { return assetsDir; } + @Override + public ImageFetcher getImageFetcher() { + return imageFetcher; + } + @Override public void invokeInEdtNow(final Runnable proc) { proc.run(); diff --git a/forge-gui-mobile/src/forge/assets/ImageCache.java b/forge-gui-mobile/src/forge/assets/ImageCache.java index de1c7490d53..1cab15dc9da 100644 --- a/forge-gui-mobile/src/forge/assets/ImageCache.java +++ b/forge-gui-mobile/src/forge/assets/ImageCache.java @@ -24,11 +24,9 @@ import com.google.common.cache.CacheBuilder; import com.google.common.cache.LoadingCache; import forge.ImageKeys; -import forge.game.card.CardView; import forge.game.player.IHasIcon; import forge.item.InventoryItem; import forge.properties.ForgeConstants; -import forge.screens.match.MatchController; import forge.util.ImageUtil; import org.apache.commons.lang3.StringUtils; @@ -80,11 +78,6 @@ public class ImageCache { missingIconKeys.clear(); } - public static Texture getImage(final CardView card) { - final String key = card.getCurrentState().getImageKey(MatchController.instance.getLocalPlayers()); - return getImage(key, true); - } - public static Texture getImage(InventoryItem ii) { return getImage(ii.getImageKey(false), true); } diff --git a/forge-gui-mobile/src/forge/card/CardRenderer.java b/forge-gui-mobile/src/forge/card/CardRenderer.java index cc82751f248..5e34e757ca9 100644 --- a/forge-gui-mobile/src/forge/card/CardRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardRenderer.java @@ -15,6 +15,7 @@ import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator; import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator.FreeTypeFontParameter; import com.badlogic.gdx.graphics.glutils.PixmapTextureData; import com.badlogic.gdx.utils.Array; +import forge.CachedCardImage; import forge.FThreads; import forge.Graphics; import forge.StaticData; @@ -28,6 +29,7 @@ import forge.game.card.CardView.CardStateView; import forge.game.keyword.Keyword; import forge.game.card.CounterType; import forge.item.IPaperCard; +import forge.item.InventoryItem; import forge.item.PaperCard; import forge.model.FModel; import forge.properties.ForgeConstants; @@ -51,6 +53,34 @@ public class CardRenderer { BehindVert } + // class that simplifies the callback logic of CachedCardImage + static class RendererCachedCardImage extends CachedCardImage { + boolean clearCardArtCache = false; + + public RendererCachedCardImage(CardView card, boolean clearArtCache) { + super(card); + this.clearCardArtCache = clearArtCache; + } + + public RendererCachedCardImage(InventoryItem ii, boolean clearArtCache) { + super(ii); + this.clearCardArtCache = clearArtCache; + } + + public RendererCachedCardImage(String key, boolean clearArtCache) { + super(key); + this.clearCardArtCache = clearArtCache; + } + + @Override + public void onImageFetched() { + ImageCache.clear(); + if (clearCardArtCache) { + cardArtCache.remove(key); + } + } + } + private static final FSkinFont NAME_FONT = FSkinFont.get(16); public static final float NAME_BOX_TINT = 0.2f; public static final float TEXT_BOX_TINT = 0.1f; @@ -124,7 +154,7 @@ public class CardRenderer { public static FImageComplex getCardArt(String imageKey, boolean isSplitCard, boolean isHorizontalCard, boolean isAftermathCard) { FImageComplex cardArt = cardArtCache.get(imageKey); if (cardArt == null) { - Texture image = ImageCache.getImage(imageKey, true); + Texture image = new RendererCachedCardImage(imageKey, true).getImage(); if (image != null) { if (image == ImageCache.defaultImage) { cardArt = CardImageRenderer.forgeArt; @@ -186,7 +216,13 @@ public class CardRenderer { public static FImageComplex getAftermathSecondCardArt(String imageKey) { FImageComplex cardArt = cardArtCache.get("Aftermath_second_"+imageKey); if (cardArt == null) { - Texture image = ImageCache.getImage(imageKey, true); + Texture image = new CachedCardImage(imageKey) { + @Override + public void onImageFetched() { + ImageCache.clear(); + cardArtCache.remove("Aftermath_second_" + imageKey); + } + }.getImage(); if (image != null) { if (image == ImageCache.defaultImage) { cardArt = CardImageRenderer.forgeArt; @@ -347,7 +383,8 @@ public class CardRenderer { } public static void drawCard(Graphics g, IPaperCard pc, float x, float y, float w, float h, CardStackPosition pos) { - Texture image = ImageCache.getImage(pc); + Texture image = new RendererCachedCardImage(pc, false).getImage(); + if (image != null) { if (image == ImageCache.defaultImage) { CardImageRenderer.drawCardImage(g, CardView.getCardForUi(pc), false, x, y, w, h, pos); @@ -369,7 +406,8 @@ public class CardRenderer { } public static void drawCard(Graphics g, CardView card, float x, float y, float w, float h, CardStackPosition pos, boolean rotate) { - Texture image = ImageCache.getImage(card); + Texture image = new RendererCachedCardImage(card, false).getImage(); + if (image != null) { if (image == ImageCache.defaultImage) { CardImageRenderer.drawCardImage(g, card, false, x, y, w, h, pos); diff --git a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java index 375e7d94b84..36c95917843 100644 --- a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java +++ b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java @@ -204,6 +204,10 @@ public class SettingsPage extends TabPage { "If turned on, Forge will load all historic format definitions, this may take slightly longer to load at startup."), 3); //Graphic Options + lstSettings.addItem(new BooleanSetting(FPref.UI_ENABLE_ONLINE_IMAGE_FETCHER, + "Download missing card art", + "Automatically download missing card art"), + 4); lstSettings.addItem(new BooleanSetting(FPref.UI_OVERLAY_FOIL_EFFECT, "Display Foil Overlay", "Displays foil cards with the visual foil overlay effect."), diff --git a/forge-gui-mobile/src/forge/util/LibGDXImageFetcher.java b/forge-gui-mobile/src/forge/util/LibGDXImageFetcher.java new file mode 100644 index 00000000000..6e8bc3f7ca5 --- /dev/null +++ b/forge-gui-mobile/src/forge/util/LibGDXImageFetcher.java @@ -0,0 +1,62 @@ +package forge.util; + +import com.badlogic.gdx.files.FileHandle; +import forge.Forge; +import forge.GuiBase; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +public class LibGDXImageFetcher extends ImageFetcher { + @Override + protected Runnable getDownloadTask(String[] downloadUrls, String destPath, Runnable notifyObservers) { + return new LibGDXDownloadTask(downloadUrls, destPath, notifyObservers); + } + + private static class LibGDXDownloadTask implements Runnable { + private final String[] downloadUrls; + private final String destPath; + private final Runnable notifyObservers; + + LibGDXDownloadTask(String[] downloadUrls, String destPath, Runnable notifyObservers) { + this.downloadUrls = downloadUrls; + this.destPath = destPath; + this.notifyObservers = notifyObservers; + } + + private void doFetch(String urlToDownload) throws IOException { + URL url = new URL(urlToDownload); + System.out.println("Attempting to fetch: " + url); + java.net.URLConnection c = url.openConnection(); + c.setRequestProperty("User-Agent", ""); + + InputStream is = c.getInputStream(); + // First, save to a temporary file so that nothing tries to read + // a partial download. + FileHandle destFile = new FileHandle(destPath + ".tmp"); + System.out.println(destPath); + destFile.parent().mkdirs(); + + // Conversion to JPEG will be handled differently depending on the platform + Forge.getDeviceAdapter().convertToJPEG(is, new FileOutputStream(destFile.file())); + destFile.moveTo(new FileHandle(destPath)); + + System.out.println("Saved image to " + destPath); + GuiBase.getInterface().invokeInEdtLater(notifyObservers); + } + + public void run() { + for (String urlToDownload : downloadUrls) { + try { + doFetch(urlToDownload); + break; + } catch (IOException e) { + System.out.println("Failed to download card [" + destPath + "] image: " + e.getMessage()); + } + } + } + } + +} diff --git a/forge-gui/src/main/java/forge/interfaces/IDeviceAdapter.java b/forge-gui/src/main/java/forge/interfaces/IDeviceAdapter.java index 41e00408465..06361f28bc7 100644 --- a/forge-gui/src/main/java/forge/interfaces/IDeviceAdapter.java +++ b/forge-gui/src/main/java/forge/interfaces/IDeviceAdapter.java @@ -1,5 +1,9 @@ package forge.interfaces; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + public interface IDeviceAdapter { boolean isConnectedToInternet(); boolean isConnectedToWifi(); @@ -10,4 +14,5 @@ public interface IDeviceAdapter { void preventSystemSleep(boolean preventSleep); void restart(); void exit(); + void convertToJPEG(InputStream input, OutputStream output) throws IOException; } diff --git a/forge-gui/src/main/java/forge/interfaces/IGuiBase.java b/forge-gui/src/main/java/forge/interfaces/IGuiBase.java index 15f23f41fe2..21802b2717d 100644 --- a/forge-gui/src/main/java/forge/interfaces/IGuiBase.java +++ b/forge-gui/src/main/java/forge/interfaces/IGuiBase.java @@ -16,12 +16,14 @@ import forge.match.HostedMatch; import forge.sound.IAudioClip; import forge.sound.IAudioMusic; import forge.util.Callback; +import forge.util.ImageFetcher; public interface IGuiBase { boolean isRunningOnDesktop(); boolean isLibgdxPort(); String getCurrentVersion(); String getAssetsDir(); + ImageFetcher getImageFetcher(); void invokeInEdtNow(Runnable runnable); void invokeInEdtLater(Runnable runnable); void invokeInEdtAndWait(Runnable proc); diff --git a/forge-gui-desktop/src/main/java/forge/ImageFetcher.java b/forge-gui/src/main/java/forge/util/ImageFetcher.java similarity index 67% rename from forge-gui-desktop/src/main/java/forge/ImageFetcher.java rename to forge-gui/src/main/java/forge/util/ImageFetcher.java index 6b0d878b721..9ab7a134387 100644 --- a/forge-gui-desktop/src/main/java/forge/ImageFetcher.java +++ b/forge-gui/src/main/java/forge/util/ImageFetcher.java @@ -1,34 +1,28 @@ -package forge; +package forge.util; -import java.awt.image.BufferedImage; import java.io.File; -import java.io.IOException; -import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import javax.imageio.ImageIO; -import javax.swing.SwingUtilities; - +import forge.FThreads; +import forge.ImageKeys; +import forge.StaticData; import org.apache.commons.lang3.tuple.Pair; -import forge.game.card.CardView; import forge.item.PaperCard; import forge.model.FModel; import forge.properties.ForgeConstants; import forge.properties.ForgePreferences; -import forge.util.FileUtil; -import forge.util.ImageUtil; -public class ImageFetcher { +public abstract class ImageFetcher { private static final ExecutorService threadPool = Executors.newCachedThreadPool(); - private static HashMap> currentFetches = new HashMap<>(); - private static HashMap tokenImages; + private HashMap> currentFetches = new HashMap<>(); + private HashMap tokenImages; - public static void fetchImage(final CardView card, final String imageKey, final Callback callback) { + public void fetchImage(final String imageKey, final Callback callback) { FThreads.assertExecutedByEdt(true); if (!FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_ENABLE_ONLINE_IMAGE_FETCHER)) @@ -119,50 +113,12 @@ public class ImageFetcher { currentFetches.remove(destPath); } }; - threadPool.submit(new DownloadTask(downloadUrls.toArray(new String[0]), destPath, notifyObservers)); + threadPool.submit(getDownloadTask(downloadUrls.toArray(new String[0]), destPath, notifyObservers)); } - + + protected abstract Runnable getDownloadTask(String[] toArray, String destPath, Runnable notifyObservers); + public static interface Callback { public void onImageFetched(); } - - private static class DownloadTask implements Runnable { - private final String[] downloadUrls; - private final String destPath; - private final Runnable notifyObservers; - - public DownloadTask(String[] downloadUrls, String destPath, Runnable notifyObservers) { - this.downloadUrls = downloadUrls; - this.destPath = destPath; - this.notifyObservers = notifyObservers; - } - - private void doFetch(String urlToDownload) throws IOException { - URL url = new URL(urlToDownload); - System.out.println("Attempting to fetch: " + url); - java.net.URLConnection c = url.openConnection(); - c.setRequestProperty("User-Agent", ""); - BufferedImage image = ImageIO.read(c.getInputStream()); - // First, save to a temporary file so that nothing tries to read - // a partial download. - File destFile = new File(destPath + ".tmp"); - destFile.mkdirs(); - ImageIO.write(image, "jpg", destFile); - // Now, rename it to the correct name. - destFile.renameTo(new File(destPath)); - System.out.println("Saved image to " + destPath); - SwingUtilities.invokeLater(notifyObservers); - } - - public void run() { - for (String urlToDownload : downloadUrls) { - try { - doFetch(urlToDownload); - break; - } catch (IOException e) { - System.out.println("Failed to download card [" + destPath + "] image: " + e.getMessage()); - } - } - } - } - } \ No newline at end of file +} \ No newline at end of file From 67cac41d3e765f5ed1eb34789a60fe8d1af6aed8 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 1 Dec 2018 21:19:44 +0300 Subject: [PATCH 276/901] - Fixed the AI trying to cast Animate Dead/Dance of the Dead on cards which will have Protection from Black once they hit the battlefield. --- .../src/main/java/forge/ai/ability/AttachAi.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index 839f6c60bd7..3af7196eacf 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -4,6 +4,7 @@ import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Lists; import forge.ai.*; +import forge.card.MagicColor; import forge.game.Game; import forge.game.GameObject; import forge.game.GlobalRuleChange; @@ -88,6 +89,19 @@ public class AttachAi extends SpellAbilityAi { if (!attachPreference(sa, tgt, false)) { return false; } + + // Don't try to attach an aura to a card which will have protection from the relevant color + Card targeted = sa.getTargets().getFirstTargetedCard(); + if (targeted != null && !targeted.getZone().is(ZoneType.Battlefield)) { + byte color = sa.getTargets().getFirstTargetedCard().getCurrentState().getColor(); + for (byte c : MagicColor.WUBRG) { + if ((color & c) == c) { + if (targeted.hasKeyword("Protection from " + MagicColor.toLongString(c))) { + return false; + } + } + } + } } // Flash logic From b67a4839e0d1720d27d5d51d43d06eb52ab53024 Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Sat, 1 Dec 2018 23:03:32 +0000 Subject: [PATCH 277/901] Ultimate masters editions file --- forge-gui/res/editions/Ultimate Masters.txt | 263 ++++++++++++++++++++ 1 file changed, 263 insertions(+) create mode 100644 forge-gui/res/editions/Ultimate Masters.txt diff --git a/forge-gui/res/editions/Ultimate Masters.txt b/forge-gui/res/editions/Ultimate Masters.txt new file mode 100644 index 00000000000..e879d81eed9 --- /dev/null +++ b/forge-gui/res/editions/Ultimate Masters.txt @@ -0,0 +1,263 @@ +[metadata] +Code=UMA +Date=2018-12-07 +Name=Ultimate Masters +Code2=UMA +MciCode=uma +Type=Other + +[cards] +1 R All Is Dust +2 U Artisan of Kozilek +3 R Eldrazi Conscription +4 M Emrakul, the Aeons Torn +5 M Karn Liberated +6 M Kozilek, Butcher of Truth +7 M Ulamog, the Infinite Gyre +8 C Ulamog's Crusher +9 U Ancestor's Chosen +10 C Angelic Renewal +11 R Containment Priest +12 C Conviction +13 U Dawn Charm +14 R Daybreak Coronet +15 U Emancipation Angel +16 C Faith's Fetters +17 U Fiend Hunter +18 C Gods Willing +19 C Heliod's Pilgrim +20 U Hero of Iroas +21 C Hyena Umbra +22 C Icatian Crier +23 C Lotus-Eye Mystics +24 C Mammoth Umbra +25 C Martyr of Sands +26 U Miraculous Recovery +27 U Phalanx Leader +28 U Rally the Peasants +29 C Repel the Darkness +30 C Resurrection +31 R Reveillark +32 R Reya Dawnbringer +33 C Ronom Unicorn +34 R Runed Halo +35 U Sigil of the New Dawn +36 C Skyspear Cavalry +37 U Spirit Cairn +38 R Sublime Archangel +39 U Swift Reckoning +40 C Tethmos High Priest +41 R Wall of Reverence +42 C Wandering Champion +43 C Wingsteed Rider +44 C Aethersnipe +45 C Archaeomancer +46 R Back to Basics +47 U Circular Logic +48 C Defy Gravity +49 C Deranged Assistant +50 R Dig Through Time +51 R Disrupting Shoal +52 U Dreamscape Artist +53 C Eel Umbra +54 C Flight of Fancy +55 C Foil +56 U Forbidden Alchemy +57 C Frantic Search +58 R Glen Elendra Archmage +59 U Iridescent Drake +60 C Just the Wind +61 U Laboratory Maniac +62 U Living Lore +63 R Magus of the Bazaar +64 U Mahamoti Djinn +65 U Marang River Prowler +66 U Mystic Retrieval +67 U Rise from the Tides +68 C Rune Snag +69 C Skywing Aven +70 U Sleight of Hand +71 M Snapcaster Mage +72 C Stitched Drake +73 C Stitcher's Apprentice +74 U Stream of Consciousness +75 C Sultai Skullkeeper +76 R Talrand, Sky Summoner +77 M Temporal Manipulation +78 C Think Twice +79 C Treasure Cruise +80 U Unstable Mutation +81 R Visions of Beyond +82 C Whirlwind Adept +83 U Appetite for Brains +84 U Apprentice Necromancer +85 M Bitterblossom +86 C Bloodflow Connoisseur +87 R Bridge from Below +88 U Buried Alive +89 U Chainer's Edict +90 C Crow of Dark Tidings +91 C Dark Dabbling +92 C Death Denied +93 R Demonic Tutor +94 R Entomb +95 C Fume Spitter +96 C Ghoulcaller's Accomplice +97 U Ghoulsteed +98 U Golgari Thug +99 R Goryo's Vengeance +100 C Grave Scrabbler +101 U Grave Strength +102 C Gurmag Angler +103 C Last Gasp +104 M Liliana of the Veil +105 C Mark of the Vampire +106 M Mikaeus, the Unhallowed +107 C Moan of the Unhallowed +108 C Offalsnout +109 C Olivia's Dragoon +110 R Reanimate +111 C Sanitarium Skeleton +112 U Shirei, Shizo's Caretaker +113 U Shriekmaw +114 C Slum Reaper +115 U Songs of the Damned +116 R Spoils of the Vault +117 R Tasigur, the Golden Fang +118 C Twins of Maurer Estate +119 U Unburial Rites +120 C Unholy Hunger +121 C Akroan Crusader +122 U Anger +123 C Arena Athlete +124 M Balefire Dragon +125 U Brazen Scourge +126 U Conflagrate +127 U Desperate Ritual +128 C Faithless Looting +129 C Fiery Temper +130 U Firewing Phoenix +131 U Furnace Celebration +132 R Gamble +133 C Generator Servant +134 C Hissing Iguanar +135 C Ingot Chewer +136 U Lava Spike +137 C Mad Prophet +138 U Magmaw +139 U Malevolent Whispers +140 C Molten Birth +141 C Nightbird's Clutches +142 C Raid Bombardment +143 C Reckless Charge +144 C Reckless Wurm +145 U Rolling Temblor +146 R Seismic Assault +147 R Seize the Day +148 C Soul's Fire +149 C Sparkspitter +150 R Squee, Goblin Nabob +151 C Thermo-Alchemist +152 R Through the Breach +153 C Undying Rage +154 R Vexing Devil +155 U Young Pyromancer +156 C Basking Rootwalla +157 U Become Immense +158 U Boar Umbra +159 U Boneyard Wurm +160 U Brawn +161 C Crushing Canopy +162 U Devoted Druid +163 U Eternal Witness +164 R Fauna Shaman +165 U Fecundity +166 C Golgari Brownscale +167 R Golgari Grave-Troll +168 C Groundskeeper +169 U Hero of Leina Tower +170 C Hooting Mandrills +171 C Kodama's Reach +172 R Life from the Loam +173 C Miming Slime +174 R Noble Hierarch +175 R Nourishing Shoal +176 R Pattern of Rebirth +177 U Penumbra Wurm +178 C Prey Upon +179 C Pulse of Murasa +180 C Satyr Wayfinder +181 C Shed Weakness +182 U Snake Umbra +183 U Spider Spawning +184 C Spider Umbra +185 C Staunch-Hearted Warrior +186 U Stingerfling Spider +187 M Tarmogoyf +188 U Travel Preparations +189 M Vengevine +190 C Verdant Eidolon +191 C Walker of the Grove +192 C Wickerbough Elder +193 U Wild Hunger +194 C Wild Mongrel +195 R Woodfall Primus +196 U Angel of Despair +197 U Blast of Genius +198 U Countersquall +199 R Gaddock Teeg +200 U Garna, the Bloodflame +201 U Golgari Charm +202 M Leovold, Emissary of Trest +203 M Lord of Extinction +204 R Maelstrom Pulse +205 U Reviving Vapors +206 M Sigarda, Host of Herons +207 R Sovereigns of Lost Alara +208 U Urban Evolution +209 U Vengeful Rebirth +210 U Warleader's Helix +211 C Beckon Apparition +212 C Canker Abomination +213 C Dimir Guildmage +214 C Double Cleave +215 R Fulminator Mage +216 U Kitchen Finks +217 U Murderous Redcap +218 U Plumeveil +219 C Rakdos Shred-Freak +220 C Safehold Elite +221 C Scuzzback Marauders +222 C Shielding Plax +223 U Slippery Bogle +224 C Turn to Mist +225 C Fire // Ice +226 C Cathodion +227 R Engineered Explosives +228 U Heap Doll +229 M Mana Vault +230 C Myr Servitor +231 C Patchwork Gnomes +232 R Phyrexian Altar +233 M Platinum Emperion +234 U Prismatic Lens +235 C Vessel of Endless Rest +236 R Ancient Tomb +237 M Cavern of Souls +238 R Celestial Colonnade +239 R Creeping Tar Pit +240 U Dakmor Salvage +241 M Dark Depths +242 R Desolate Lighthouse +243 R Flagstones of Trokair +244 M Karakas +245 R Lavaclaw Reaches +246 U Mage-Ring Network +247 U Mistveil Plains +248 R Phyrexian Tower +249 R Raging Ravine +250 U Rogue's Passage +251 R Stirring Wildwood +252 C Terramorphic Expanse +253 R Thespian's Stage +254 R Urborg, Tomb of Yawgmoth \ No newline at end of file From 00c4cc712ae1ffe5be15efd465a722deb9ea6f68 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 2 Dec 2018 07:49:01 +0300 Subject: [PATCH 278/901] - Added initial UMA draft rankings. - Fixed RankingScraper to work again. --- forge-gui/res/draft/rankings.txt | 255 ++++++++++++++++++++++++++++++ forge-gui/tools/RankingScraper.py | 6 +- 2 files changed, 258 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/draft/rankings.txt b/forge-gui/res/draft/rankings.txt index 2db72e86828..38ffbc8508a 100644 --- a/forge-gui/res/draft/rankings.txt +++ b/forge-gui/res/draft/rankings.txt @@ -1,4 +1,259 @@ //Rank|Name|Rarity|Set +#1|Karn Liberated|M|UMA +#2|Sigarda, Host of Herons|M|UMA +#3|Bitterblossom|M|UMA +#4|Balefire Dragon|M|UMA +#5|Sublime Archangel|R|UMA +#6|Liliana of the Veil|M|UMA +#7|Tasigur, the Golden Fang|R|UMA +#8|Mana Vault|M|UMA +#9|Maelstrom Pulse|R|UMA +#10|Ancient Tomb|R|UMA +#11|Talrand, Sky Summoner|R|UMA +#12|Mikaeus, the Unhallowed|M|UMA +#13|Snapcaster Mage|M|UMA +#14|Leovold, Emissary of Trest|M|UMA +#15|Golgari Grave-Troll|R|UMA +#16|Reveillark|R|UMA +#17|Demonic Tutor|R|UMA +#18|Woodfall Primus|R|UMA +#19|Noble Hierarch|R|UMA +#20|Glen Elendra Archmage|R|UMA +#21|Shriekmaw|U|UMA +#22|Eternal Witness|U|UMA +#23|Kitchen Finks|U|UMA +#24|Sovereigns of Lost Alara|R|UMA +#25|Fauna Shaman|R|UMA +#26|Faith's Fetters|C|UMA +#27|Wall of Reverence|R|UMA +#28|Eldrazi Conscription|R|UMA +#29|Engineered Explosives|R|UMA +#30|Celestial Colonnade|R|UMA +#31|Lavaclaw Reaches|R|UMA +#32|Raging Ravine|R|UMA +#33|Creeping Tar Pit|R|UMA +#34|Stirring Wildwood|R|UMA +#35|Fire Ice|C|UMA +#36|All Is Dust|R|UMA +#37|Warleader's Helix|U|UMA +#38|Fiend Hunter|U|UMA +#39|Vengevine|M|UMA +#40|Dig Through Time|R|UMA +#41|Murderous Redcap|U|UMA +#42|Sigil of the New Dawn|U|UMA +#43|Fiery Temper|C|UMA +#44|Travel Preparations|U|UMA +#45|Spider Spawning|U|UMA +#46|Young Pyromancer|U|UMA +#47|Unburial Rites|U|UMA +#48|Chainer's Edict|U|UMA +#49|Firewing Phoenix|U|UMA +#50|Devoted Druid|U|UMA +#51|Vengeful Rebirth|U|UMA +#52|Urban Evolution|U|UMA +#53|Garna, the Bloodflame|U|UMA +#54|Blast of Genius|U|UMA +#55|Penumbra Wurm|U|UMA +#56|Unholy Hunger|C|UMA +#57|Last Gasp|C|UMA +#58|Mahamoti Djinn|U|UMA +#59|Swift Reckoning|U|UMA +#60|Gurmag Angler|C|UMA +#61|Magmaw|U|UMA +#62|Golgari Charm|U|UMA +#63|Soul's Fire|C|UMA +#64|Aethersnipe|C|UMA +#65|Phalanx Leader|U|UMA +#66|Tarmogoyf|M|UMA +#67|Squee, Goblin Nabob|R|UMA +#68|Shirei, Shizo's Caretaker|U|UMA +#69|Treasure Cruise|C|UMA +#70|Runed Halo|R|UMA +#71|Rune Snag|C|UMA +#72|Resurrection|C|UMA +#73|Dimir Guildmage|C|UMA +#74|Slippery Bogle|U|UMA +#75|Seize the Day|R|UMA +#76|Prismatic Lens|U|UMA +#77|Reviving Vapors|U|UMA +#78|Boar Umbra|U|UMA +#79|Reckless Charge|C|UMA +#80|Brazen Scourge|U|UMA +#81|Moan of the Unhallowed|C|UMA +#82|Wingsteed Rider|C|UMA +#83|Hero of Iroas|U|UMA +#84|Desolate Lighthouse|R|UMA +#85|Reanimate|R|UMA +#86|Lord of Extinction|M|UMA +#87|Gaddock Teeg|R|UMA +#88|Wild Mongrel|C|UMA +#89|Reckless Wurm|C|UMA +#90|Seismic Assault|R|UMA +#91|Become Immense|U|UMA +#92|Daybreak Coronet|R|UMA +#93|Angel of Despair|U|UMA +#94|Wild Hunger|U|UMA +#95|Satyr Wayfinder|C|UMA +#96|Brawn|U|UMA +#97|Thermo-Alchemist|C|UMA +#98|Rolling Temblor|U|UMA +#99|Golgari Thug|U|UMA +#100|Sleight of Hand|U|UMA +#101|Iridescent Drake|U|UMA +#102|Forbidden Alchemy|U|UMA +#103|Cavern of Souls|M|UMA +#104|Life from the Loam|R|UMA +#105|Gamble|R|UMA +#106|Living Lore|U|UMA +#107|Reya Dawnbringer|R|UMA +#108|Pattern of Rebirth|R|UMA +#109|Conflagrate|U|UMA +#110|Terramorphic Expanse|C|UMA +#111|Cathodion|C|UMA +#112|Artisan of Kozilek|U|UMA +#113|Countersquall|U|UMA +#114|Prey Upon|C|UMA +#115|Kodama's Reach|C|UMA +#116|Boneyard Wurm|U|UMA +#117|Furnace Celebration|U|UMA +#118|Ghoulsteed|U|UMA +#119|Buried Alive|U|UMA +#120|Bloodflow Connoisseur|C|UMA +#121|Rise from the Tides|U|UMA +#122|Deranged Assistant|C|UMA +#123|Archaeomancer|C|UMA +#124|Rally the Peasants|U|UMA +#125|Miraculous Recovery|U|UMA +#126|Mammoth Umbra|C|UMA +#127|Emancipation Angel|U|UMA +#128|Karakas|M|UMA +#129|Fulminator Mage|R|UMA +#130|Vexing Devil|R|UMA +#131|Faithless Looting|C|UMA +#132|Containment Priest|R|UMA +#133|Hero of Leina Tower|U|UMA +#134|Rogue's Passage|U|UMA +#135|Scuzzback Marauders|C|UMA +#136|Plumeveil|U|UMA +#137|Stingerfling Spider|U|UMA +#138|Snake Umbra|U|UMA +#139|Hooting Mandrills|C|UMA +#140|Malevolent Whispers|U|UMA +#141|Anger|U|UMA +#142|Ghoulcaller's Accomplice|C|UMA +#143|Death Denied|C|UMA +#144|Unstable Mutation|U|UMA +#145|Mystic Retrieval|U|UMA +#146|Marang River Prowler|U|UMA +#147|Dreamscape Artist|U|UMA +#148|Spirit Cairn|U|UMA +#149|Icatian Crier|C|UMA +#150|Dawn Charm|U|UMA +#151|Ancestor's Chosen|U|UMA +#152|Urborg, Tomb of Yawgmoth|R|UMA +#153|Fecundity|U|UMA +#154|Visions of Beyond|R|UMA +#155|Circular Logic|U|UMA +#156|Apprentice Necromancer|U|UMA +#157|Hyena Umbra|C|UMA +#158|Spider Umbra|C|UMA +#159|Dakmor Salvage|U|UMA +#160|Ulamog's Crusher|C|UMA +#161|Wickerbough Elder|C|UMA +#162|Walker of the Grove|C|UMA +#163|Sparkspitter|C|UMA +#164|Molten Birth|C|UMA +#165|Mad Prophet|C|UMA +#166|Twins of Maurer Estate|C|UMA +#167|Mark of the Vampire|C|UMA +#168|Crow of Dark Tidings|C|UMA +#169|Think Twice|C|UMA +#170|Skywing Aven|C|UMA +#171|Just the Wind|C|UMA +#172|Flight of Fancy|C|UMA +#173|Skyspear Cavalry|C|UMA +#174|Gods Willing|C|UMA +#175|Platinum Emperion|M|UMA +#176|Temporal Manipulation|M|UMA +#177|Frantic Search|C|UMA +#178|Magus of the Bazaar|R|UMA +#179|Slum Reaper|C|UMA +#180|Miming Slime|C|UMA +#181|Tethmos High Priest|C|UMA +#182|Disrupting Shoal|R|UMA +#183|Mage-Ring Network|U|UMA +#184|Safehold Elite|C|UMA +#185|Canker Abomination|C|UMA +#186|Verdant Eidolon|C|UMA +#187|Shed Weakness|C|UMA +#188|Basking Rootwalla|C|UMA +#189|Raid Bombardment|C|UMA +#190|Nightbird's Clutches|C|UMA +#191|Generator Servant|C|UMA +#192|Arena Athlete|C|UMA +#193|Olivia's Dragoon|C|UMA +#194|Appetite for Brains|U|UMA +#195|Whirlwind Adept|C|UMA +#196|Stitcher's Apprentice|C|UMA +#197|Stitched Drake|C|UMA +#198|Eel Umbra|C|UMA +#199|Defy Gravity|C|UMA +#200|Wandering Champion|C|UMA +#201|Conviction|C|UMA +#202|Vessel of Endless Rest|C|UMA +#203|Martyr of Sands|C|UMA +#204|Phyrexian Altar|R|UMA +#205|Phyrexian Tower|R|UMA +#206|Nourishing Shoal|R|UMA +#207|Foil|C|UMA +#208|Laboratory Maniac|U|UMA +#209|Lava Spike|U|UMA +#210|Heliod's Pilgrim|C|UMA +#211|Patchwork Gnomes|C|UMA +#212|Turn to Mist|C|UMA +#213|Shielding Plax|C|UMA +#214|Rakdos Shred-Freak|C|UMA +#215|Double Cleave|C|UMA +#216|Staunch-Hearted Warrior|C|UMA +#217|Golgari Brownscale|C|UMA +#218|Hissing Iguanar|C|UMA +#219|Sanitarium Skeleton|C|UMA +#220|Grave Scrabbler|C|UMA +#221|Sultai Skullkeeper|C|UMA +#222|Repel the Darkness|C|UMA +#223|Lotus-Eye Mystics|C|UMA +#224|Angelic Renewal|C|UMA +#225|Entomb|R|UMA +#226|Goryo's Vengeance|R|UMA +#227|Through the Breach|R|UMA +#228|Flagstones of Trokair|R|UMA +#229|Thespian's Stage|R|UMA +#230|Desperate Ritual|U|UMA +#231|Spoils of the Vault|R|UMA +#232|Mistveil Plains|U|UMA +#233|Pulse of Murasa|C|UMA +#234|Groundskeeper|C|UMA +#235|Crushing Canopy|C|UMA +#236|Undying Rage|C|UMA +#237|Ingot Chewer|C|UMA +#238|Akroan Crusader|C|UMA +#239|Grave Strength|U|UMA +#240|Fume Spitter|C|UMA +#241|Ronom Unicorn|C|UMA +#242|Myr Servitor|C|UMA +#243|Back to Basics|R|UMA +#244|Bridge from Below|R|UMA +#245|Beckon Apparition|C|UMA +#246|Offalsnout|C|UMA +#247|Dark Dabbling|C|UMA +#248|Stream of Consciousness|U|UMA +#249|Heap Doll|U|UMA +#250|Songs of the Damned|U|UMA +#251|Dark Depths|M|UMA +#252|Kozilek, Butcher of Truth|M|UMA +#253|Ulamog, the Infinite Gyre|M|UMA +#254|Emrakul, the Aeons Torn|M|UMA +//Rank|Name|Rarity|Set #1|Doom Whisperer|M|GRN #2|Aurelia, Exemplar of Justice|M|GRN #3|Light of the Legion|R|GRN diff --git a/forge-gui/tools/RankingScraper.py b/forge-gui/tools/RankingScraper.py index c22455d3e06..f1711462b09 100644 --- a/forge-gui/tools/RankingScraper.py +++ b/forge-gui/tools/RankingScraper.py @@ -7,7 +7,7 @@ import BeautifulSoup BESTIAIRE = False SMDS = True -def bestiaireRanking(code='EMN', name='Magic Origins'): +def bestiaireRanking(code='EMN', name='Eldritch Moon'): # POST http://draft.bestiaire.org/ranking.php # Params: # edition: ORI @@ -16,7 +16,7 @@ def bestiaireRanking(code='EMN', name='Magic Origins'): pass # Output to file -def smdsRankings(edition='EldritchMoom', name='Eldritch Moon'): +def smdsRankings(edition='EldritchMoon', name='Eldritch Moon'): # get http://syunakira.com/smd/pointranking/index.php?packname=MAGICORIGINS&language=English r = requests.get("http://syunakira.com/smd/pointranking/index.php?packname=%s&language=English" % edition) bs = BeautifulSoup.BeautifulSoup(r.text) @@ -52,7 +52,7 @@ def draftsimRankings(edition='SOI', name='Shadows over Innistrad'): end = tx.rfind(']') # Deal with illegal JSON :( - replaceList = ['name', 'castingcost1', 'castingcost2', 'type', 'rarity', 'myrating', 'image', 'cmc', 'colors', 'creaturesort', 'colorsort'] + replaceList = ['name', 'castingcost1', 'castingcost2', 'type', 'rarity', 'myrating', 'image', 'cmc', 'colors', 'creaturesort', 'colorsort', 'chase_card'] # Has an extra comma that json loader doesn't like txt = tx[start:end-1]+']' for rpl in replaceList: From 685a297c51f168a7331ff1b711af7f479f86aca3 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 11 Nov 2018 18:22:45 +0300 Subject: [PATCH 279/901] - 4 Dominaria regions - Several tweaks to Alara and Ravnica - Enabled GRN and GK1 in Ravnica. Added some GRN events. - Fixed a bug which caused the region art not to load correctly in some rare cases. --- forge-gui/release-files/CHANGES.txt | 3 ++ .../Ice Age/_events.txt | 0 .../Invasion/_events.txt | 0 .../Mirage/_events.txt | 0 .../Odyssey/_events.txt | 0 .../Onslaught/_events.txt | 0 .../Time Spiral/_events.txt | 0 .../Urza's Saga/_events.txt | 0 .../planes/Classic Dominaria/cards.txt | 26 ++++++++++++ .../planes/Classic Dominaria/plane_cards.txt | 7 ++++ .../planes/Classic Dominaria/regions.txt | 7 ++++ .../planes/Classic Dominaria/sets.txt | 21 ++++++++++ .../Llanowar/Grunn, the Lonely King.dck | 33 +++++++++++++++ .../Llanowar/Hallar, the Firefletcher.dck | 36 ++++++++++++++++ .../Llanowar/Marwyn, the Nurturer.dck | 33 +++++++++++++++ .../Llanowar/Multani, Yavimayas Avatar.dck | 34 +++++++++++++++ .../Llanowar/Shanna, Sisay's Legacy.dck | 35 ++++++++++++++++ .../Llanowar/Slimefoot, the Stowaway.dck | 37 ++++++++++++++++ .../planes/Dominaria/Llanowar/Titania.dck | 32 ++++++++++++++ .../planes/Dominaria/Llanowar/Vivien Reid.dck | 30 +++++++++++++ .../planes/Dominaria/Llanowar/_events.txt | 9 ++++ .../New Benalia/Ajani, Wise Counselor.dck | 30 +++++++++++++ .../New Benalia/Baird, Steward of Argive.dck | 30 +++++++++++++ .../New Benalia/Danitha Capashen, Paragon.dck | 30 +++++++++++++ .../New Benalia/Evra, Halcyon Witness.dck | 30 +++++++++++++ .../New Benalia/Kwende, Pride of Femeref.dck | 28 +++++++++++++ .../New Benalia/Lena, Selfless Champion.dck | 30 +++++++++++++ .../New Benalia/Lyra Dawnbringer.dck | 30 +++++++++++++ .../planes/Dominaria/New Benalia/Mishra.dck | 36 ++++++++++++++++ .../planes/Dominaria/New Benalia/_events.txt | 9 ++++ .../Shiv/Chandra, Bold Pyromancer.dck | 39 +++++++++++++++++ .../Shiv/Firesong and Sunspeaker.dck | 36 ++++++++++++++++ .../planes/Dominaria/Shiv/Goblin Warchief.dck | 32 ++++++++++++++ .../planes/Dominaria/Shiv/Jaya Ballard.dck | 32 ++++++++++++++ .../Shiv/Jhoira, Weatherlight Captain.dck | 42 +++++++++++++++++++ .../Dominaria/Shiv/Squee, the Immortal.dck | 32 ++++++++++++++ .../Dominaria/Shiv/Tiana, Ships Caretaker.dck | 38 +++++++++++++++++ .../planes/Dominaria/Shiv/Verix Bladewing.dck | 32 ++++++++++++++ .../planes/Dominaria/Shiv/_events.txt | 9 ++++ .../Tolaria West/Adeliz, the Cinder Wind.dck | 38 +++++++++++++++++ .../Tolaria West/Naban, Dean of Iteration.dck | 33 +++++++++++++++ .../Tolaria West/Niambi, Faithful Healer.dck | 34 +++++++++++++++ .../Raff Capashen, Ships Mage.dck | 38 +++++++++++++++++ .../Slinn Voda, the Rising Deep.dck | 31 ++++++++++++++ .../Teferi, Hero of Dominaria.dck | 36 ++++++++++++++++ .../Tetsuko Umezawa, Fugitive.dck | 32 ++++++++++++++ .../planes/Dominaria/Tolaria West/Urza.dck | 38 +++++++++++++++++ .../Tolaria West/Zahid, Djinn of the Lamp.dck | 34 +++++++++++++++ .../planes/Dominaria/Tolaria West/_events.txt | 9 ++++ .../Urborg/Josu Vess, Lich Knight.dck | 31 ++++++++++++++ .../Urborg/Urgoros, the Empty One.dck | 33 +++++++++++++++ .../planes/Dominaria/Urborg/_events.txt | 9 ++++ .../planes/Dominaria/banned_cards.txt | 37 ++++++++++++++++ .../res/conquest/planes/Dominaria/cards.txt | 26 ------------ .../conquest/planes/Dominaria/plane_cards.txt | 2 +- .../res/conquest/planes/Dominaria/regions.txt | 12 +++--- .../res/conquest/planes/Dominaria/sets.txt | 24 ++--------- .../planes/Kamigawa/Jukai Forest/_events.txt | 15 ++++--- .../Kamigawa/Minamo Academy/_events.txt | 15 ++++--- .../Kamigawa/Sokenzan Mountains/_events.txt | 15 ++++--- .../planes/Kamigawa/Takenuma/_events.txt | 15 ++++--- .../planes/Kamigawa/Towabara/_events.txt | 15 ++++--- .../Ravnica/Orzhov Basilica/_events.txt | 3 +- .../res/conquest/planes/Ravnica/sets.txt | 1 + .../conquest/planes/Theros/Akros/_events.txt | 3 +- .../planes/Theros/Meletis/_events.txt | 3 +- .../conquest/planes/Theros/Nyx/_events.txt | 5 ++- .../planes/Theros/Setessa/_events.txt | 3 +- .../planes/Theros/The Underworld/_events.txt | 1 + .../conquest/planes/Theros/plane_cards.txt | 2 +- forge-gui/res/conquest/planes/planes.txt | 6 +-- .../forge/planarconquest/ConquestRegion.java | 2 + 72 files changed, 1395 insertions(+), 94 deletions(-) rename forge-gui/res/conquest/planes/{Dominaria => Classic Dominaria}/Ice Age/_events.txt (100%) rename forge-gui/res/conquest/planes/{Dominaria => Classic Dominaria}/Invasion/_events.txt (100%) rename forge-gui/res/conquest/planes/{Dominaria => Classic Dominaria}/Mirage/_events.txt (100%) rename forge-gui/res/conquest/planes/{Dominaria => Classic Dominaria}/Odyssey/_events.txt (100%) rename forge-gui/res/conquest/planes/{Dominaria => Classic Dominaria}/Onslaught/_events.txt (100%) rename forge-gui/res/conquest/planes/{Dominaria => Classic Dominaria}/Time Spiral/_events.txt (100%) rename forge-gui/res/conquest/planes/{Dominaria => Classic Dominaria}/Urza's Saga/_events.txt (100%) create mode 100644 forge-gui/res/conquest/planes/Classic Dominaria/cards.txt create mode 100644 forge-gui/res/conquest/planes/Classic Dominaria/plane_cards.txt create mode 100644 forge-gui/res/conquest/planes/Classic Dominaria/regions.txt create mode 100644 forge-gui/res/conquest/planes/Classic Dominaria/sets.txt create mode 100644 forge-gui/res/conquest/planes/Dominaria/Llanowar/Grunn, the Lonely King.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/Llanowar/Hallar, the Firefletcher.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/Llanowar/Marwyn, the Nurturer.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/Llanowar/Multani, Yavimayas Avatar.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/Llanowar/Shanna, Sisay's Legacy.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/Llanowar/Slimefoot, the Stowaway.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/Llanowar/Titania.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/Llanowar/Vivien Reid.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/Llanowar/_events.txt create mode 100644 forge-gui/res/conquest/planes/Dominaria/New Benalia/Ajani, Wise Counselor.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/New Benalia/Baird, Steward of Argive.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/New Benalia/Danitha Capashen, Paragon.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/New Benalia/Evra, Halcyon Witness.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/New Benalia/Kwende, Pride of Femeref.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/New Benalia/Lena, Selfless Champion.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/New Benalia/Lyra Dawnbringer.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/New Benalia/Mishra.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/New Benalia/_events.txt create mode 100644 forge-gui/res/conquest/planes/Dominaria/Shiv/Chandra, Bold Pyromancer.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/Shiv/Firesong and Sunspeaker.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/Shiv/Goblin Warchief.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/Shiv/Jaya Ballard.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/Shiv/Jhoira, Weatherlight Captain.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/Shiv/Squee, the Immortal.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/Shiv/Tiana, Ships Caretaker.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/Shiv/Verix Bladewing.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/Shiv/_events.txt create mode 100644 forge-gui/res/conquest/planes/Dominaria/Tolaria West/Adeliz, the Cinder Wind.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/Tolaria West/Naban, Dean of Iteration.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/Tolaria West/Niambi, Faithful Healer.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/Tolaria West/Raff Capashen, Ships Mage.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/Tolaria West/Slinn Voda, the Rising Deep.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/Tolaria West/Teferi, Hero of Dominaria.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/Tolaria West/Tetsuko Umezawa, Fugitive.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/Tolaria West/Urza.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/Tolaria West/Zahid, Djinn of the Lamp.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/Tolaria West/_events.txt create mode 100644 forge-gui/res/conquest/planes/Dominaria/Urborg/Josu Vess, Lich Knight.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/Urborg/Urgoros, the Empty One.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt create mode 100644 forge-gui/res/conquest/planes/Dominaria/banned_cards.txt diff --git a/forge-gui/release-files/CHANGES.txt b/forge-gui/release-files/CHANGES.txt index 12ab45e9203..54b1c1c0dee 100644 --- a/forge-gui/release-files/CHANGES.txt +++ b/forge-gui/release-files/CHANGES.txt @@ -1,3 +1,6 @@ +- Planar Conquest: Dominaria - +A new plane is now available in Planar Conquest, set in Dominaria. This plane features cards from Dominaria, Magic Core Set 2019, as well as most (but not all) cards from Commander 2018. There are 45 events available for your enjoyment. Traditional Commander and Planeswalker events represent the majority of the events on the plane, but as a special feature Dominaria also features Planechase variant matches instead of Vanguard ones, with the planar decks consisting of plane cards representing regions of Dominaria and various randomly inserted phenomena. Please note that Planar Conquest is currently only available on Android and in the macOS mobile backport. + - AI Improvements - A new round of AI improvements went into the game, hopefully making the game a little more interesting and exciting to play. In particular, certain improvements regarding Flash were implemented, the AI is now able to use cards which reorder the top of the library, such as Ponder or Portent, as well as cards which copy spells and/or activated abilities, such as Twincast or Fork. On top of that, several logic-related bugs were fixed. Also, the AI has been optimized a little, hopefully making it a bit faster, especially on mobile platforms, in situations where there are a lot of cards on the battlefield but the AI has little or nothing to do. diff --git a/forge-gui/res/conquest/planes/Dominaria/Ice Age/_events.txt b/forge-gui/res/conquest/planes/Classic Dominaria/Ice Age/_events.txt similarity index 100% rename from forge-gui/res/conquest/planes/Dominaria/Ice Age/_events.txt rename to forge-gui/res/conquest/planes/Classic Dominaria/Ice Age/_events.txt diff --git a/forge-gui/res/conquest/planes/Dominaria/Invasion/_events.txt b/forge-gui/res/conquest/planes/Classic Dominaria/Invasion/_events.txt similarity index 100% rename from forge-gui/res/conquest/planes/Dominaria/Invasion/_events.txt rename to forge-gui/res/conquest/planes/Classic Dominaria/Invasion/_events.txt diff --git a/forge-gui/res/conquest/planes/Dominaria/Mirage/_events.txt b/forge-gui/res/conquest/planes/Classic Dominaria/Mirage/_events.txt similarity index 100% rename from forge-gui/res/conquest/planes/Dominaria/Mirage/_events.txt rename to forge-gui/res/conquest/planes/Classic Dominaria/Mirage/_events.txt diff --git a/forge-gui/res/conquest/planes/Dominaria/Odyssey/_events.txt b/forge-gui/res/conquest/planes/Classic Dominaria/Odyssey/_events.txt similarity index 100% rename from forge-gui/res/conquest/planes/Dominaria/Odyssey/_events.txt rename to forge-gui/res/conquest/planes/Classic Dominaria/Odyssey/_events.txt diff --git a/forge-gui/res/conquest/planes/Dominaria/Onslaught/_events.txt b/forge-gui/res/conquest/planes/Classic Dominaria/Onslaught/_events.txt similarity index 100% rename from forge-gui/res/conquest/planes/Dominaria/Onslaught/_events.txt rename to forge-gui/res/conquest/planes/Classic Dominaria/Onslaught/_events.txt diff --git a/forge-gui/res/conquest/planes/Dominaria/Time Spiral/_events.txt b/forge-gui/res/conquest/planes/Classic Dominaria/Time Spiral/_events.txt similarity index 100% rename from forge-gui/res/conquest/planes/Dominaria/Time Spiral/_events.txt rename to forge-gui/res/conquest/planes/Classic Dominaria/Time Spiral/_events.txt diff --git a/forge-gui/res/conquest/planes/Dominaria/Urza's Saga/_events.txt b/forge-gui/res/conquest/planes/Classic Dominaria/Urza's Saga/_events.txt similarity index 100% rename from forge-gui/res/conquest/planes/Dominaria/Urza's Saga/_events.txt rename to forge-gui/res/conquest/planes/Classic Dominaria/Urza's Saga/_events.txt diff --git a/forge-gui/res/conquest/planes/Classic Dominaria/cards.txt b/forge-gui/res/conquest/planes/Classic Dominaria/cards.txt new file mode 100644 index 00000000000..1f4febf286b --- /dev/null +++ b/forge-gui/res/conquest/planes/Classic Dominaria/cards.txt @@ -0,0 +1,26 @@ +Crown of Empires +Scepter of Empires +Throne of Empires +Roc Egg +Brindle Boar +Armored Cancrix +Academy Raider +Alaborn Cavalier +Prossh, Skyraider of Kher +Balance of Power +Beetleback Chief +Crimson Mage +Cruel Edict +Dakmor Lancer +Famine +Firewing Phoenix +Flesh to Dust +Flusterstorm +Freyalise, Llanowar's Fury +Gaea's Revenge +Ice Cage +Liliana, Heretical Healer +Mwonvuli Beast Tracker +Teferi, Temporal Archmage +Titania, Protector of Argoth +Onyx Mage \ No newline at end of file diff --git a/forge-gui/res/conquest/planes/Classic Dominaria/plane_cards.txt b/forge-gui/res/conquest/planes/Classic Dominaria/plane_cards.txt new file mode 100644 index 00000000000..9e81f892561 --- /dev/null +++ b/forge-gui/res/conquest/planes/Classic Dominaria/plane_cards.txt @@ -0,0 +1,7 @@ +Academy at Tolaria West +Isle of Vesuva +Krosa +Llanowar +Otaria +Shiv +Talon Gates \ No newline at end of file diff --git a/forge-gui/res/conquest/planes/Classic Dominaria/regions.txt b/forge-gui/res/conquest/planes/Classic Dominaria/regions.txt new file mode 100644 index 00000000000..379b7ad0b05 --- /dev/null +++ b/forge-gui/res/conquest/planes/Classic Dominaria/regions.txt @@ -0,0 +1,7 @@ +Name:Ice Age|Art:Dark Depths|Sets:ICE,ALL,CSP +Name:Mirage|Art:Teferi's Isle|Sets:MIR,VIS,WTH +Name:Urza's Saga|Art:Tolarian Academy|Sets:USG,ULG,UDS +Name:Invasion|Art:Legacy Weapon|Sets:INV,PLS,APC +Name:Odyssey|Art:Cabal Coffers|Sets:ODY,TOR,JUD +Name:Onslaught|Art:Grand Coliseum|Sets:ONS,LGN,SCG +Name:Time Spiral|Art:Vesuva|Sets:TSP,TSB,PLC,FUT \ No newline at end of file diff --git a/forge-gui/res/conquest/planes/Classic Dominaria/sets.txt b/forge-gui/res/conquest/planes/Classic Dominaria/sets.txt new file mode 100644 index 00000000000..9f80ee8f007 --- /dev/null +++ b/forge-gui/res/conquest/planes/Classic Dominaria/sets.txt @@ -0,0 +1,21 @@ +ICE +ALL +CSP +MIR +VIS +WTH +USG +ULG +UDS +INV +PLS +APC +ODY +TOR +JUD +ONS +LGN +SCG +TSP +PLC +FUT \ No newline at end of file diff --git a/forge-gui/res/conquest/planes/Dominaria/Llanowar/Grunn, the Lonely King.dck b/forge-gui/res/conquest/planes/Dominaria/Llanowar/Grunn, the Lonely King.dck new file mode 100644 index 00000000000..85b0054f99c --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Llanowar/Grunn, the Lonely King.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Grunn, the Lonely King +[Commander] +1 Grunn, the Lonely King|DOM +[Main] +1 Adventurous Impulse|DOM +1 Baloth Gorger|DOM +1 Blighted Woodland|C18 +1 Centaur Courser|M19 +1 Cultivate|C18 +1 Druid of the Cowl|M19 +1 Elfhame Druid|DOM +14 Forest|M19|2 +1 Gift of Growth|DOM +1 Gigantosaurus|M19 +1 Gilded Lotus|DOM +1 Grow from the Ashes|DOM +1 Hunting Wilds|C18 +1 Llanowar Elves|M19 +1 Marwyn, the Nurturer|DOM +1 Multani, Yavimaya's Avatar|DOM +1 Myth Unbound|C18 +1 Scute Mob|C18 +1 Sol Ring|C18 +1 Steel Leaf Champion|DOM +1 Talons of Wildwood|M19 +1 Territorial Allosaurus|DOM +1 Titanic Growth|M19 +1 Untamed Kavu|DOM +1 Wall of Vines|M19 +1 Wild Onslaught|DOM +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Dominaria/Llanowar/Hallar, the Firefletcher.dck b/forge-gui/res/conquest/planes/Dominaria/Llanowar/Hallar, the Firefletcher.dck new file mode 100644 index 00000000000..8a061d1ea03 --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Llanowar/Hallar, the Firefletcher.dck @@ -0,0 +1,36 @@ +[metadata] +Name=Hallar, the Firefletcher +[Commander] +1 Hallar, the Firefletcher|DOM +[Main] +1 Baloth Gorger|DOM +1 Draconic Disciple|M19 +1 Druid of the Cowl|M19 +1 Elfhame Druid|DOM +1 Fight with Fire|DOM +9 Forest|DOM|3 +1 Ghitu Chronicler|DOM +1 Gift of Growth|DOM +1 Gilded Lotus|DOM +1 Grow from the Ashes|DOM +1 Grunn, the Lonely King|DOM +1 Hunting Wilds|C18 +1 Kazandu Refuge|C18 +1 Keldon Overseer|DOM +1 Krosan Druid|DOM +1 Llanowar Elves|M19 +1 Manalith|M19 +3 Mountain|DOM|3 +1 Saproling Migration|DOM +1 Shivan Fire|DOM +1 Skizzik|DOM +1 Sol Ring|C18 +1 Song of Freyalise|DOM +1 Territorial Allosaurus|DOM +1 The Mending of Dominaria|DOM +1 Timber Gorge|M19 +1 Untamed Kavu|DOM +1 Wild Onslaught|DOM +1 Worn Powerstone|C18 +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Dominaria/Llanowar/Marwyn, the Nurturer.dck b/forge-gui/res/conquest/planes/Dominaria/Llanowar/Marwyn, the Nurturer.dck new file mode 100644 index 00000000000..635abd8d073 --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Llanowar/Marwyn, the Nurturer.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Marwyn, the Nurturer +[Commander] +1 Marwyn, the Nurturer|DOM +[Main] +1 Adventurous Impulse|DOM +1 Blanchwood Armor|M19 +1 Borderland Explorer|C18 +1 Diamond Mare|M19 +1 Druid of the Cowl|M19 +1 Elfhame Druid|DOM +1 Elvish Clancaller|M19 +1 Elvish Rejuvenator|M19 +1 Farhaven Elf|C18 +14 Forest|DOM +1 Giant Spider|M19 +1 Gift of Growth|DOM +1 Gigantosaurus|M19 +1 Greenwood Sentinel|M19 +1 Llanowar Elves|M19 +1 Llanowar Scout|DOM +1 Mammoth Spider|DOM +1 Prodigious Growth|M19 +1 Reclamation Sage|C18 +1 Steel Leaf Champion|DOM +1 Thorn Lieutenant|M19 +1 Titanic Growth|M19 +1 Turntimber Sower|C18 +1 Vivien of the Arkbow|M19 +1 Wall of Vines|M19 +1 Wild Onslaught|DOM +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Dominaria/Llanowar/Multani, Yavimayas Avatar.dck b/forge-gui/res/conquest/planes/Dominaria/Llanowar/Multani, Yavimayas Avatar.dck new file mode 100644 index 00000000000..c9612f7a2f1 --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Llanowar/Multani, Yavimayas Avatar.dck @@ -0,0 +1,34 @@ +[metadata] +Name=Multani, Yavimaya's Avatar +[Commander] +1 Multani, Yavimaya's Avatar|DOM +[Main] +1 Adventurous Impulse|DOM +1 Baloth Woodcrasher|C18 +1 Blighted Woodland|C18 +1 Borderland Explorer|C18 +1 Centaur Vinecrasher|C18 +1 Crash of Rhino Beetles|C18 +1 Cultivate|C18 +1 Druid of the Cowl|M19 +1 Dryad Greenseeker|M19 +1 Elfhame Druid|DOM +1 Elvish Rejuvenator|M19 +1 Explosive Vegetation|C18 +1 Far Wanderings|C18 +1 Farhaven Elf|C18 +13 Forest|C18|1 +1 Gift of Paradise|M19 +1 Grapple with the Past|C18 +1 Hunting Wilds|C18 +1 Khalni Heart Expedition|C18 +1 Llanowar Elves|M19 +1 Memorial to Unity|DOM +1 Moldgraf Monstrosity|C18 +1 Myriad Landscape|C18 +1 Rampaging Baloths|C18 +1 Scute Mob|C18 +1 The Mending of Dominaria|DOM +1 Yavimaya Elder|C18 +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Dominaria/Llanowar/Shanna, Sisay's Legacy.dck b/forge-gui/res/conquest/planes/Dominaria/Llanowar/Shanna, Sisay's Legacy.dck new file mode 100644 index 00000000000..9abbecb260f --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Llanowar/Shanna, Sisay's Legacy.dck @@ -0,0 +1,35 @@ +[metadata] +Name=Shanna, Sisay's Legacy +[Commander] +1 Shanna, Sisay's Legacy|DOM +[Main] +1 Blossoming Sands|C18 +1 Call the Cavalry|DOM +1 Command Tower|C18 +1 Druid of the Cowl|M19 +1 Elfhame Druid|DOM +9 Forest|DOM +1 Fungal Plots|DOM +1 Gift of Growth|DOM +1 Inspired Charge|M19 +1 Khalni Garden|C18 +1 Knightly Valor|M19 +1 Llanowar Elves|DOM +1 Memorial to Unity|DOM +2 Plains|DOM +1 Rampaging Baloths|C18 +1 Saproling Migration|DOM +1 Sergeant-at-Arms|DOM +1 Shalai, Voice of Plenty|DOM +1 Sigiled Sword of Valeron|M19 +1 Song of Freyalise|DOM +1 Spawning Grounds|C18 +1 Spore Swarm|DOM +1 The Mending of Dominaria|DOM +1 Thorn Lieutenant|M19 +1 Titanic Growth|M19 +1 Tranquil Expanse|C18 +1 Verdant Force|DOM +1 Vessel of Endless Rest|C18 +1 Wild Onslaught|DOM +1 Yavimaya Sapherd|DOM diff --git a/forge-gui/res/conquest/planes/Dominaria/Llanowar/Slimefoot, the Stowaway.dck b/forge-gui/res/conquest/planes/Dominaria/Llanowar/Slimefoot, the Stowaway.dck new file mode 100644 index 00000000000..edadfc4702d --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Llanowar/Slimefoot, the Stowaway.dck @@ -0,0 +1,37 @@ +[metadata] +Name=Slimefoot, the Stowaway +[Commander] +1 Slimefoot, the Stowaway|DOM +[Main] +1 Deathbloom Thallid|DOM +1 Druid of the Cowl|M19 +1 Elfhame Druid|DOM +9 Forest|DOM|1 +1 Foul Orchard|M19 +1 Fungal Infection|DOM +1 Fungal Plots|DOM +1 Grapple with the Past|C18 +1 Jungle Hollow|C18 +1 Khalni Garden|C18 +1 Llanowar Elves|M19 +1 Manalith|M19 +1 Putrefy|C18 +1 Root Snare|M19 +1 Saproling Migration|DOM +1 Song of Freyalise|DOM +1 Spawning Grounds|C18 +1 Spore Swarm|DOM +1 Sporecrown Thallid|DOM +2 Swamp|DOM|2 +1 Thallid Omnivore|DOM +1 The Eldest Reborn|DOM +1 The Mending of Dominaria|DOM +1 Titanic Growth|M19 +1 Verdant Force|DOM +1 Wild Onslaught|DOM +1 Woodland Cemetery|DOM +1 Worm Harvest|C18 +1 Worn Powerstone|C18 +1 Yavimaya Sapherd|DOM +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Dominaria/Llanowar/Titania.dck b/forge-gui/res/conquest/planes/Dominaria/Llanowar/Titania.dck new file mode 100644 index 00000000000..18d4b7173b9 --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Llanowar/Titania.dck @@ -0,0 +1,32 @@ +[metadata] +Name=Titania +[Avatar] +1 Titania|VAN +[Main] +1 Bear Umbra|C18 +1 Blanchwood Armor|M19 +1 Blighted Woodland|C18 +1 Bristling Boar|M19 +1 Colossal Majesty|M19 +1 Crash of Rhino Beetles|C18 +1 Daggerback Basilisk|M19 +1 Druid of Horns|M19 +1 Druid of the Cowl|M19 +1 Enchantress's Presence|C18 +1 Epic Proportions|C18 +14 Forest|DOM|4 +1 Greenwood Sentinel|M19 +1 Llanowar Elves|M19 +1 Mammoth Spider|DOM +1 Memorial to Unity|DOM +1 Oakenform|M19 +1 Prodigious Growth|M19 +1 Scute Mob|C18 +1 Snake Umbra|C18 +1 Song of Freyalise|DOM +1 Spawning Grounds|C18 +1 Steel Leaf Champion|DOM +1 Talons of Wildwood|M19 +1 Vow of Wildness|C18 +1 Wall of Vines|M19 +1 Yavimaya Enchantress|C18 diff --git a/forge-gui/res/conquest/planes/Dominaria/Llanowar/Vivien Reid.dck b/forge-gui/res/conquest/planes/Dominaria/Llanowar/Vivien Reid.dck new file mode 100644 index 00000000000..257780a4ec7 --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Llanowar/Vivien Reid.dck @@ -0,0 +1,30 @@ +[metadata] +Name=Vivien Reid +[Main] +1 Adventurous Impulse|DOM +1 Aggressive Mammoth|M19 +1 Bear Umbra|C18 +1 Blighted Woodland|C18 +1 Diamond Mare|M19 +1 Druid of the Cowl|M19 +1 Elfhame Druid|DOM +1 Explosive Vegetation|C18 +1 Forebear's Blade|DOM +14 Forest|DOM|1 +1 Giant Spider|M19 +1 Gigantosaurus|M19 +1 Jousting Lance|DOM +1 Llanowar Elves|M19 +1 Marwyn, the Nurturer|DOM +1 Moldgraf Monstrosity|C18 +1 Pelakka Wurm|M19 +1 Scute Mob|C18 +1 Sol Ring|C18 +1 Song of Freyalise|DOM +1 Steel Leaf Champion|DOM +1 Thorn Elemental|DOM +1 Titanic Growth|M19 +1 Vivien of the Arkbow|M19 +1 Vivien Reid|M19 +1 Vivien's Invocation|M19 +1 Vivien's Jaguar|M19 diff --git a/forge-gui/res/conquest/planes/Dominaria/Llanowar/_events.txt b/forge-gui/res/conquest/planes/Dominaria/Llanowar/_events.txt new file mode 100644 index 00000000000..2a1c4f600e2 --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Llanowar/_events.txt @@ -0,0 +1,9 @@ +Name:Shanna, Sisay's Legacy|Deck:Shanna, Sisay's Legacy.dck|Variant:Commander|Avatar:Shanna, Sisay's Legacy|Desc: +Name:Marwyn, the Nurturer|Deck:Marwyn, the Nurturer.dck|Variant:Commander|Avatar:Marwyn, the Nurturer|Desc: +Name:Slimefoot, the Stowaway|Deck:Slimefoot, the Stowaway.dck|Variant:Commander|Avatar:Slimefoot, the Stowaway|Desc: +Name:Hallar, the Firefletcher|Deck:Hallar, the Firefletcher.dck|Variant:Commander|Avatar:Hallar, the Firefletcher|Desc: +Name:Vivien Reid|Deck:Vivien Reid.dck|Variant:Planeswalker|Avatar:Vivien Reid|Desc: +Name:Grunn, the Lonely King|Deck:Grunn, the Lonely King.dck|Variant:Commander|Avatar:Grunn, the Lonely King|Desc: +Name:Multani, Yavimaya's Avatar|Deck:Multani, Yavimayas Avatar.dck|Variant:Commander|Avatar:Multani, Yavimaya's Avatar|Desc: +Name:Titania|Deck:Titania.dck|Variant:Vanguard|Avatar:Titania|Desc: +Name:Random Llanowar|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: diff --git a/forge-gui/res/conquest/planes/Dominaria/New Benalia/Ajani, Wise Counselor.dck b/forge-gui/res/conquest/planes/Dominaria/New Benalia/Ajani, Wise Counselor.dck new file mode 100644 index 00000000000..33f99ed3cc5 --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/New Benalia/Ajani, Wise Counselor.dck @@ -0,0 +1,30 @@ +[metadata] +Name=Ajani, Wise Counselor +[Main] +1 Ajani's Influence|M19 +1 Ajani's Last Stand|M19 +1 Ajani's Pridemate|M19 +1 Ajani's Welcome|M19 +1 Ajani, Wise Counselor|M19 +1 Benalish Marshal|DOM +1 Charge|DOM +1 Court Cleric|M19 +1 Dwarven Priest|M19 +1 Fountain of Renewal|M19 +1 Gideon's Reproach|DOM +1 Inspired Charge|M19 +1 Leonin Vanguard|M19 +1 Leonin Warleader|M19 +1 Luminous Bonds|M19 +1 Make a Stand|M19 +1 Memorial to Glory|DOM +1 Mentor of the Meek|M19 +1 Mesa Unicorn|DOM +1 Mighty Leap|M19 +14 Plains|DOM +1 Revitalize|M19 +1 Seal Away|DOM +1 Sergeant-at-Arms|DOM +1 Sigiled Sword of Valeron|M19 +1 Take Vengeance|M19 +1 Triumph of Gerrard|DOM diff --git a/forge-gui/res/conquest/planes/Dominaria/New Benalia/Baird, Steward of Argive.dck b/forge-gui/res/conquest/planes/Dominaria/New Benalia/Baird, Steward of Argive.dck new file mode 100644 index 00000000000..951b0529914 --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/New Benalia/Baird, Steward of Argive.dck @@ -0,0 +1,30 @@ +[metadata] +Name=Baird, Steward of Argive +[Commander] +1 Baird, Steward of Argive|DOM +[Main] +1 Aven Sentry|DOM +1 Benalish Honor Guard|DOM +1 Benalish Marshal|DOM +1 Call the Cavalry|DOM +1 D'Avenant Trapper|DOM +1 Danitha Capashen, Paragon|DOM +1 Daring Archaeologist|DOM +1 Dauntless Bodyguard|DOM +1 Dub|DOM +1 Forebear's Blade|DOM +1 Gallant Cavalry|M19 +1 History of Benalia|DOM +1 Jousting Lance|DOM +1 Juggernaut|DOM +1 Knight of Grace|DOM +1 Knight of New Benalia|DOM +1 Lena, Selfless Champion|M19 +1 Memorial to Glory|DOM +15 Plains|M19 +1 Serra Disciple|DOM +1 Shield of the Realm|DOM +1 Short Sword|DOM +1 Sparring Construct|DOM +1 Tragic Poet|DOM +1 Triumph of Gerrard|DOM diff --git a/forge-gui/res/conquest/planes/Dominaria/New Benalia/Danitha Capashen, Paragon.dck b/forge-gui/res/conquest/planes/Dominaria/New Benalia/Danitha Capashen, Paragon.dck new file mode 100644 index 00000000000..683ac9b2184 --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/New Benalia/Danitha Capashen, Paragon.dck @@ -0,0 +1,30 @@ +[metadata] +Name=Danitha Capashen, Paragon +[Commander] +1 Danitha Capashen, Paragon|DOM +[Main] +1 Ajani's Chosen|C18 +1 Baird, Steward of Argive|DOM +1 Benalish Honor Guard|DOM +1 Blackblade Reforged|DOM +1 Celestial Archon|C18 +1 Dub|DOM +1 Forebear's Blade|DOM +1 Heavenly Blademaster|C18 +1 Helm of the Host|DOM +1 History of Benalia|DOM +1 Jousting Lance|DOM +1 Knightly Valor|M19 +1 Lena, Selfless Champion|M19 +1 Memorial to Glory|DOM +1 Novice Knight|M19 +15 Plains|M19 +1 Sage's Reverie|C18 +1 Short Sword|DOM +1 Sigiled Sword of Valeron|M19 +1 Teshar, Ancestor's Apostle|DOM +1 Traxos, Scourge of Kroog|DOM +1 Triumph of Gerrard|DOM +1 Unquestioned Authority|C18 +1 Urza's Ruinous Blast|DOM +1 Weatherlight|DOM diff --git a/forge-gui/res/conquest/planes/Dominaria/New Benalia/Evra, Halcyon Witness.dck b/forge-gui/res/conquest/planes/Dominaria/New Benalia/Evra, Halcyon Witness.dck new file mode 100644 index 00000000000..6fea04d05a1 --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/New Benalia/Evra, Halcyon Witness.dck @@ -0,0 +1,30 @@ +[metadata] +Name=Evra, Halcyon Witness +[Commander] +1 Evra, Halcyon Witness|DOM +[Main] +1 Adamant Will|DOM +1 Aegis of the Heavens|M19 +1 Aesthir Glider|DOM +1 Ajani's Pridemate|M19 +1 Ajani's Welcome|M19 +1 Ajani, Adversary of Tyrants|M19 +1 Ajani, Wise Counselor|M19 +1 Ancient Stone Idol|C18 +1 Aven Sentry|DOM +1 Benalish Marshal|DOM +1 Boreas Charger|C18 +1 Call the Cavalry|DOM +1 Cavalry Drillmaster|M19 +1 Celestial Archon|C18 +1 Danitha Capashen, Paragon|DOM +1 Daybreak Chaplain|M19 +1 Dwarven Priest|M19 +1 Fountain of Renewal|M19 +1 Geode Golem|C18 +1 Gideon's Reproach|DOM +1 Lightform|C18 +1 Memorial to Glory|DOM +1 Mesa Unicorn|DOM +15 Plains|DOM +1 Sanctum Spirit|DOM diff --git a/forge-gui/res/conquest/planes/Dominaria/New Benalia/Kwende, Pride of Femeref.dck b/forge-gui/res/conquest/planes/Dominaria/New Benalia/Kwende, Pride of Femeref.dck new file mode 100644 index 00000000000..acd8b8fdd95 --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/New Benalia/Kwende, Pride of Femeref.dck @@ -0,0 +1,28 @@ +[metadata] +Name=Kwende, Pride of Femeref +[Commander] +1 Kwende, Pride of Femeref|DOM +[Main] +1 Banishing Stroke|C18 +1 Call the Cavalry|DOM +1 Cleansing Nova|M19 +1 Danitha Capashen, Paragon|DOM +1 Dauntless Bodyguard|DOM +1 Dub|DOM +1 Forebear's Blade|DOM +1 Jousting Lance|DOM +1 Knight of Grace|DOM +1 Knight's Pledge|M19 +1 Luminous Bonds|M19 +1 Lyra Dawnbringer|DOM +1 Make a Stand|M19 +1 Marauder's Axe|M19 +1 Novice Knight|M19 +16 Plains|DOM +1 Seal Away|DOM +2 Serra Disciple|DOM +1 Short Sword|DOM +1 Sigiled Sword of Valeron|M19 +1 Sun Sentinel|M19 +1 Triumph of Gerrard|DOM +1 Valiant Knight|M19 diff --git a/forge-gui/res/conquest/planes/Dominaria/New Benalia/Lena, Selfless Champion.dck b/forge-gui/res/conquest/planes/Dominaria/New Benalia/Lena, Selfless Champion.dck new file mode 100644 index 00000000000..d1758762517 --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/New Benalia/Lena, Selfless Champion.dck @@ -0,0 +1,30 @@ +[metadata] +Name=Lena, Selfless Champion +[Commander] +1 Lena, Selfless Champion|M19 +[Main] +1 Ajani's Last Stand|M19 +1 Ajani's Welcome|M19 +1 Ajani, Adversary of Tyrants|M19 +1 Ajani, Wise Counselor|M19 +1 Benalish Marshal|DOM +1 Blessed Light|DOM +1 Call the Cavalry|DOM +1 Court Cleric|M19 +1 Gallant Cavalry|M19 +1 History of Benalia|DOM +1 Knightly Valor|M19 +1 Leonin Vanguard|M19 +1 Leonin Warleader|M19 +1 Magistrate's Scepter|M19 +1 Martial Coup|C18 +1 Memorial to Glory|DOM +1 Mesa Unicorn|DOM +1 Militia Bugler|M19 +15 Plains|M19 +1 Sergeant-at-Arms|DOM +1 Sigiled Sword of Valeron|M19 +1 Steel Hellkite|C18 +1 Sun Sentinel|M19 +1 Suncleanser|M19 +1 Teferi's Sentinel|DOM diff --git a/forge-gui/res/conquest/planes/Dominaria/New Benalia/Lyra Dawnbringer.dck b/forge-gui/res/conquest/planes/Dominaria/New Benalia/Lyra Dawnbringer.dck new file mode 100644 index 00000000000..e5982c5f791 --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/New Benalia/Lyra Dawnbringer.dck @@ -0,0 +1,30 @@ +[metadata] +Name=Lyra Dawnbringer +[Commander] +1 Lyra Dawnbringer|DOM +[Main] +1 Adarkar Valkyrie|C18 +1 Ajani's Influence|M19 +1 Ajani's Welcome|M19 +1 Angel of the Dawn|M19 +1 Aven Sentry|DOM +1 Baird, Steward of Argive|DOM +1 Daring Archaeologist|DOM +1 Entreat the Angels|C18 +1 Forebear's Blade|DOM +1 Gideon's Reproach|DOM +1 Heavenly Blademaster|C18 +1 Herald of Faith|M19 +1 Jousting Lance|DOM +1 Knight's Pledge|M19 +1 Memorial to Glory|DOM +15 Plains|M19 +1 Resplendent Angel|M19 +1 Seal Away|DOM +1 Serra Angel|DOM +1 Serra's Guardian|M19 +1 Short Sword|DOM +1 Sol Ring|C18 +1 Soul Snare|C18 +1 Take Vengeance|M19 +1 Worn Powerstone|C18 diff --git a/forge-gui/res/conquest/planes/Dominaria/New Benalia/Mishra.dck b/forge-gui/res/conquest/planes/Dominaria/New Benalia/Mishra.dck new file mode 100644 index 00000000000..eee02568f89 --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/New Benalia/Mishra.dck @@ -0,0 +1,36 @@ +[metadata] +Name=Mishra +[Avatar] +1 Mishra|VAN +[Main] +1 Aethershield Artificer|M19 +1 Ancient Stone Idol|C18 +1 Blinkmoth Urn|C18 +1 Buried Ruin|C18 +1 Chief of the Foundry|C18 +1 Darksteel Citadel|C18 +1 Darksteel Juggernaut|C18 +1 Field Creeper|M19 +1 Foundry of the Consuls|C18 +1 Isolated Watchtower|C18 +1 Jhoira's Familiar|DOM +1 Juggernaut|DOM +1 Karn, Scion of Urza|DOM +1 Mirrorworks|C18 +1 Mishra's Self-Replicator|DOM +1 Pardic Wanderer|DOM +1 Pilgrim's Eye|C18 +10 Plains|DOM +1 Retrofitter Foundry|C18 +1 Scuttling Doom Engine|C18 +1 Skittering Surveyor|DOM +1 Sol Ring|C18 +1 Sparring Construct|DOM +1 Suspicious Bookcase|M19 +1 Thopter Assembly|C18 +1 Thran Temporal Gateway|DOM +1 Traxos, Scourge of Kroog|DOM +1 Unwinding Clock|C18 +1 Voltaic Servant|DOM +1 Weatherlight|DOM +1 Zhalfirin Void|DOM diff --git a/forge-gui/res/conquest/planes/Dominaria/New Benalia/_events.txt b/forge-gui/res/conquest/planes/Dominaria/New Benalia/_events.txt new file mode 100644 index 00000000000..346bed38458 --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/New Benalia/_events.txt @@ -0,0 +1,9 @@ +Name:Lena, Selfless Champion|Deck:Lena, Selfless Champion.dck|Variant:Commander|Avatar:Lena, Selfless Champion|Desc: +Name:Baird, Steward of Argive|Deck:Baird, Steward of Argive.dck|Variant:Commander|Avatar:Baird, Steward of Argive|Desc: +Name:Lyra Dawnbringer|Deck:Lyra Dawnbringer.dck|Variant:Commander|Avatar:Lyra Dawnbringer|Desc: +Name:Kwende, Pride of Femeref|Deck:Kwende, Pride of Femeref.dck|Variant:Commander|Avatar:Kwende, Pride of Femeref|Desc: +Name:Ajani, Wise Counselor|Deck:Ajani, Wise Counselor.dck|Variant:Planeswalker|Avatar:Ajani, Wise Counselor|Desc: +Name:Danitha Capashen, Paragon|Deck:Danitha Capashen, Paragon.dck|Variant:Commander|Avatar:Danitha Capashen, Paragon|Desc: +Name:Evra, Halcyon Witness|Deck:Evra, Halcyon Witness.dck|Variant:Commander|Avatar:Evra, Halcyon Witness|Desc: +Name:Mishra|Deck:Mishra.dck|Variant:Vanguard|Avatar:Mishra|Desc: +Name:Random New Benalia|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: diff --git a/forge-gui/res/conquest/planes/Dominaria/Shiv/Chandra, Bold Pyromancer.dck b/forge-gui/res/conquest/planes/Dominaria/Shiv/Chandra, Bold Pyromancer.dck new file mode 100644 index 00000000000..4a05507ce2f --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Shiv/Chandra, Bold Pyromancer.dck @@ -0,0 +1,39 @@ +[metadata] +Name=Chandra, Bold Pyromancer +[Avatar] + +[Main] +1 Banefire|M19 +1 Boggart Brute|M19 +1 Chandra, Bold Pyromancer|DOM +1 Dragon Egg|M19 +1 Electrify|M19 +1 Explosive Apparatus|M19 +1 Fight with Fire|DOM +1 Ghitu Lavarunner|DOM +1 Goblin Chainwhirler|DOM +1 Goblin Instigator|M19 +1 Guttersnipe|M19 +1 Hostile Minotaur|M19 +1 Inferno Hellion|M19 +1 Jaya's Immolating Inferno|DOM +1 Karplusan Hound|DOM +1 Lava Axe|M19 +1 Lightning Mare|M19 +1 Lightning Strike|M19 +15 Mountain|M19|4 +1 Radiating Lightning|DOM +1 Scuttling Doom Engine|C18 +1 Shivan Fire|DOM +1 Shock|M19 +1 Squee, the Immortal|DOM +1 Viashino Pyromancer|M19 +1 Wizard's Lightning|DOM +[Sideboard] + +[Planes] + +[Schemes] + +[Conspiracy] + diff --git a/forge-gui/res/conquest/planes/Dominaria/Shiv/Firesong and Sunspeaker.dck b/forge-gui/res/conquest/planes/Dominaria/Shiv/Firesong and Sunspeaker.dck new file mode 100644 index 00000000000..f2615ffc608 --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Shiv/Firesong and Sunspeaker.dck @@ -0,0 +1,36 @@ +[metadata] +Name=Firesong and Sunspeaker +[Commander] +1 Firesong and Sunspeaker|DOM +[Main] +1 Ajani's Pridemate|M19 +1 Ajani, Adversary of Tyrants|M19 +1 Banefire|M19 +1 Clifftop Retreat|DOM +1 Command Tower|C18 +1 Daybreak Chaplain|M19 +1 Electrify|M19 +1 Evolving Wilds|C18 +1 Fight with Fire|DOM +1 Fountain of Renewal|M19 +1 Ghitu Lavarunner|DOM +1 Gideon's Reproach|DOM +1 Hostile Minotaur|M19 +1 Invoke the Divine|DOM +1 Jaya's Immolating Inferno|DOM +1 Lava Axe|M19 +1 Leonin Warleader|M19 +1 Lightning Strike|M19 +6 Mountain|DOM +4 Plains|DOM +1 Radiating Lightning|DOM +1 Revitalize|M19 +1 Rupture Spire|M19 +1 Sanctum Spirit|DOM +1 Sarkhan, Fireblood|M19 +1 Shield Mare|M19 +1 Shivan Fire|DOM +1 Shock|M19 +1 Stone Quarry|M19 +1 Varchild, Betrayer of Kjeldor|C18 +1 Wizard's Lightning|DOM diff --git a/forge-gui/res/conquest/planes/Dominaria/Shiv/Goblin Warchief.dck b/forge-gui/res/conquest/planes/Dominaria/Shiv/Goblin Warchief.dck new file mode 100644 index 00000000000..0eec11f66ac --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Shiv/Goblin Warchief.dck @@ -0,0 +1,32 @@ +[metadata] +Name=Goblin Warchief +[Avatar] +1 Goblin Warchief Avatar|VAN +[Main] +1 Banefire|M19 +1 Bloodstone Goblin|DOM +1 Boggart Brute|M19 +1 Forebear's Blade|DOM +1 Frenzied Rage|DOM +1 Goblin Chainwhirler|DOM +1 Goblin Instigator|M19 +1 Goblin Motivator|M19 +1 Goblin Trashmaster|M19 +1 Goblin Warchief|DOM +1 Guttersnipe|M19 +1 Hostile Minotaur|M19 +1 Jaya's Immolating Inferno|DOM +1 Lightning Strike|M19 +15 Mountain|DOM +1 Shivan Dragon|M19 +1 Shock|M19 +1 Short Sword|DOM +1 Siege-Gang Commander|DOM +1 Skizzik|DOM +1 Squee, the Immortal|DOM +1 Sure Strike|M19 +1 Swiftfoot Boots|C18 +1 Trumpet Blast|M19 +1 Volley Veteran|M19 +1 Warcry Phoenix|DOM +[Sideboard] diff --git a/forge-gui/res/conquest/planes/Dominaria/Shiv/Jaya Ballard.dck b/forge-gui/res/conquest/planes/Dominaria/Shiv/Jaya Ballard.dck new file mode 100644 index 00000000000..e72ed9e132e --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Shiv/Jaya Ballard.dck @@ -0,0 +1,32 @@ +[metadata] +Name=Jaya Ballard +[Main] +1 Banefire|M19 +1 Blasphemous Act|C18 +1 Chandra's Outburst|DOM +1 Chandra, Bold Pyromancer|DOM +1 Electrify|M19 +1 Fight with Fire|DOM +1 Firefist Adept|DOM +1 Ghitu Chronicler|DOM +1 Ghitu Journeymage|DOM +1 Ghitu Lavarunner|DOM +1 Guttersnipe|M19 +1 Jaya Ballard|DOM +1 Jaya's Immolating Inferno|DOM +1 Karplusan Hound|DOM +1 Lava Axe|M19 +1 Lightning Strike|M19 +16 Mountain|DOM +1 Pyromantic Pilgrim|DOM +1 Radiating Lightning|DOM +1 Run Amok|DOM +1 Shivan Fire|DOM +1 Shock|M19 +1 Viashino Pyromancer|M19 +1 Warcry Phoenix|DOM +1 Wizard's Lightning|DOM +[Sideboard] +1 Fervent Strike|DOM +1 Trumpet Blast|M19 +1 Warlord's Fury|DOM diff --git a/forge-gui/res/conquest/planes/Dominaria/Shiv/Jhoira, Weatherlight Captain.dck b/forge-gui/res/conquest/planes/Dominaria/Shiv/Jhoira, Weatherlight Captain.dck new file mode 100644 index 00000000000..332d5c71a2d --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Shiv/Jhoira, Weatherlight Captain.dck @@ -0,0 +1,42 @@ +[metadata] +Name=Jhoira, Weatherlight Captain +[Commander] +1 Jhoira, Weatherlight Captain|DOM +[Main] +1 Aesthir Glider|DOM +1 Artificer's Assistant|DOM +1 Buried Ruin|C18 +1 Command Tower|C18 +1 Curator's Ward|DOM +1 Darksteel Citadel|C18 +1 Demanding Dragon|M19 +1 Dragon Egg|M19 +1 Evolving Wilds|C18 +1 Gilded Lotus|DOM +1 Hellkite Igniter|C18 +1 Highland Lake|C18 +2 Island|C18|1 +1 Jaya's Immolating Inferno|DOM +1 Jhoira's Familiar|DOM +1 Loyal Apprentice|C18 +1 Magmaquake|C18 +1 Memorial to Genius|DOM +1 Memorial to War|DOM +4 Mountain|C18|1 +1 Retrofitter Foundry|C18 +1 Rupture Spire|M19 +1 Sai, Master Thopterist|M19 +1 Sol Ring|C18 +1 Sparktongue Dragon|M19 +1 Steel Hellkite|C18 +1 Sulfur Falls|DOM +1 Swiftwater Cliffs|C18 +1 Tetsuko Umezawa, Fugitive|DOM +1 Thopter Assembly|C18 +1 Thopter Engineer|C18 +1 Thran Temporal Gateway|DOM +1 Traxos, Scourge of Kroog|DOM +1 Warcry Phoenix|DOM +1 Weatherlight|DOM +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Dominaria/Shiv/Squee, the Immortal.dck b/forge-gui/res/conquest/planes/Dominaria/Shiv/Squee, the Immortal.dck new file mode 100644 index 00000000000..acd4132eadf --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Shiv/Squee, the Immortal.dck @@ -0,0 +1,32 @@ +[metadata] +Name=Squee, the Immortal +[Commander] +1 Squee, the Immortal|DOM +[Main] +1 Bloodstone Goblin|DOM +1 Boggart Brute|M19 +1 Chandra, Bold Pyromancer|DOM +1 Electrify|M19 +1 Fervent Strike|DOM +1 Goblin Barrage|DOM +1 Goblin Chainwhirler|DOM +1 Goblin Instigator|M19 +1 Goblin Motivator|M19 +1 Goblin Trashmaster|M19 +1 Goblin Warchief|DOM +1 Guttersnipe|M19 +1 Jousting Lance|DOM +1 Lightning Strike|M19 +15 Mountain|C18|3 +1 Radiating Lightning|DOM +1 Run Amok|DOM +1 Shivan Fire|DOM +1 Shock|M19 +1 Siege-Gang Commander|DOM +1 Sure Strike|M19 +1 Swiftfoot Boots|C18 +1 Treasure Nabber|C18 +1 Trumpet Blast|M19 +1 Volley Veteran|M19 +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Dominaria/Shiv/Tiana, Ships Caretaker.dck b/forge-gui/res/conquest/planes/Dominaria/Shiv/Tiana, Ships Caretaker.dck new file mode 100644 index 00000000000..97a6bf726fd --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Shiv/Tiana, Ships Caretaker.dck @@ -0,0 +1,38 @@ +[metadata] +Name=Tiana, Ship's Caretaker +[Commander] +1 Tiana, Ship's Caretaker|DOM +[Main] +1 Ajani's Chosen|C18 +1 Boggart Brute|M19 +1 Champion of the Flame|DOM +1 Clifftop Retreat|DOM +1 Command Tower|C18 +1 Danitha Capashen, Paragon|DOM +1 Explosive Apparatus|M19 +1 Forebear's Blade|DOM +1 Frenzied Rage|DOM +1 Goblin Instigator|M19 +1 Goblin Motivator|M19 +1 Heavenly Blademaster|C18 +1 Jousting Lance|DOM +1 Keldon Raider|DOM +1 Keldon Warcaller|DOM +1 Knight's Pledge|M19 +1 Knightly Valor|M19 +6 Mountain|M19|1 +1 On Serra's Wings|DOM +1 Onakke Ogre|M19 +4 Plains|M19|1 +1 Pyromantic Pilgrim|DOM +1 Rupture Spire|M19 +1 Sage's Reverie|C18 +1 Short Sword|DOM +1 Squee, the Immortal|DOM +1 Stone Quarry|M19 +1 Terramorphic Expanse|C18 +1 Two-Headed Giant|DOM +1 Unquestioned Authority|C18 +1 Valduk, Keeper of the Flame|DOM +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Dominaria/Shiv/Verix Bladewing.dck b/forge-gui/res/conquest/planes/Dominaria/Shiv/Verix Bladewing.dck new file mode 100644 index 00000000000..a63a381e889 --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Shiv/Verix Bladewing.dck @@ -0,0 +1,32 @@ +[metadata] +Name=Verix Bladewing +[Commander] +1 Verix Bladewing|DOM +[Main] +1 Boggart Brute|M19 +1 Demanding Dragon|M19 +1 Dragon Egg|M19 +1 Dragon's Hoard|M19 +1 Flameblast Dragon|C18 +1 Gilded Lotus|DOM +1 Goblin Motivator|M19 +1 Hostile Minotaur|M19 +1 Inferno Hellion|M19 +1 Jhoira's Familiar|DOM +1 Kargan Dragonrider|M19 +1 Keldon Warcaller|DOM +1 Lathliss, Dragon Queen|M19 +15 Mountain|M19|3 +1 Nesting Dragon|C18 +1 Sarkhan's Unsealing|M19 +1 Sarkhan's Whelp|M19 +1 Sarkhan, Fireblood|M19 +1 Shivan Dragon|M19 +1 Sol Ring|C18 +1 Sparktongue Dragon|M19 +1 Spit Flame|M19 +1 Volcanic Dragon|M19 +1 Warcry Phoenix|DOM +1 Worn Powerstone|C18 +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Dominaria/Shiv/_events.txt b/forge-gui/res/conquest/planes/Dominaria/Shiv/_events.txt new file mode 100644 index 00000000000..76954aae6d6 --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Shiv/_events.txt @@ -0,0 +1,9 @@ +Name:Squee, the Immortal|Deck:Squee, the Immortal.dck|Variant:Commander|Avatar:Squee, the Immortal|Desc: +Name:Jaya Ballard|Deck:Jaya Ballard.dck|Variant:Planeswalker|Avatar:Jaya Ballard|Desc: +Name:Tiana, Ship's Caretaker|Deck:Tiana, Ships Caretaker.dck|Variant:Commander|Avatar:Tiana, Ship's Caretaker|Desc: +Name:Verix Bladewing|Deck:Verix Bladewing.dck|Variant:Commander|Avatar:Verix Bladewing|Desc: +Name:Jhoira, Weatherlight Captain|Deck:Jhoira, Weatherlight Captain.dck|Variant:Commander|Avatar:Jhoira, Weatherlight Captain|Desc: +Name:Chandra, Bold Pyromancer|Deck:Chandra, Bold Pyromancer.dck|Variant:Planeswalker|Avatar:Chandra, Bold Pyromancer|Desc: +Name:Goblin Warchief|Deck:Goblin Warchief.dck|Variant:Vanguard|Avatar:Goblin Warchief|Desc: +Name:Firesong and Sunspeaker|Deck:Firesong and Sunspeaker.dck|Variant:Commander|Avatar:Firesong and Sunspeaker|Desc: +Name:Random Shiv|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: diff --git a/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Adeliz, the Cinder Wind.dck b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Adeliz, the Cinder Wind.dck new file mode 100644 index 00000000000..91b565a2c33 --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Adeliz, the Cinder Wind.dck @@ -0,0 +1,38 @@ +[metadata] +Name=Adeliz, the Cinder Wind +[Commander] +1 Adeliz, the Cinder Wind|DOM +[Main] +1 Academy Journeymage|DOM +1 Aven Wind Mage|M19 +1 Banefire|M19 +1 Command Tower|C18 +1 Darksteel Citadel|C18 +1 Enigma Drake|M19 +1 Exclusion Mage|M19 +1 Firefist Adept|DOM +1 Ghitu Chronicler|DOM +1 Ghitu Journeymage|DOM +1 Ghitu Lavarunner|DOM +1 Great Furnace|C18 +1 Highland Lake|M19 +4 Island|DOM +1 Jaya's Immolating Inferno|DOM +1 Karn's Temporal Sundering|DOM +1 Lightning Strike|M19 +1 Merfolk Trickster|DOM +5 Mountain|DOM +1 Naban, Dean of Iteration|DOM +1 Naru Meha, Master Wizard|DOM +1 Pyromantic Pilgrim|DOM +1 Run Amok|DOM +1 Seat of the Synod|C18 +1 Shock|M19 +1 Sorcerer's Wand|DOM +1 Sulfur Falls|DOM +1 Swiftwater Cliffs|C18 +1 Trumpet Blast|M19 +1 Vedalken Humiliator|C18 +1 Viashino Pyromancer|M19 +1 Wizard's Lightning|DOM +1 Wizard's Retort|DOM diff --git a/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Naban, Dean of Iteration.dck b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Naban, Dean of Iteration.dck new file mode 100644 index 00000000000..176993dfaed --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Naban, Dean of Iteration.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Naban, Dean of Iteration +[Commander] +1 Naban, Dean of Iteration|DOM +[Main] +1 Academy Journeymage|DOM +1 Aether Gale|C18 +1 Archetype of Imagination|C18 +1 Aven Wind Mage|M19 +1 Blink of an Eye|DOM +1 Cancel|M19 +1 Disperse|M19 +1 Divination|M19 +1 Essence Scatter|M19 +1 Exclusion Mage|M19 +1 Into the Roil|C18 +14 Island|DOM +1 Memorial to Genius|DOM +1 Merfolk Trickster|DOM +1 Omenspeaker|M19 +1 Opt|DOM +1 Salvager of Secrets|M19 +1 Sleep|M19 +1 Sol Ring|C18 +1 Syncopate|DOM +1 The Mirari Conjecture|DOM +1 Time of Ice|DOM +1 Tolarian Scholar|M19 +1 Unwind|DOM +1 Vodalian Arcanist|DOM +1 Wizard's Retort|DOM +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Niambi, Faithful Healer.dck b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Niambi, Faithful Healer.dck new file mode 100644 index 00000000000..45c9e477fab --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Niambi, Faithful Healer.dck @@ -0,0 +1,34 @@ +[metadata] +Name=Niambi, Faithful Healer +[Commander] +1 Niambi, Faithful Healer|DOM +[Main] +1 Arcane Flight|DOM +1 Artificer's Assistant|DOM +1 Benalish Honor Guard|DOM +1 Blink of an Eye|DOM +1 Cloudreader Sphinx|DOM +1 Command Tower|C18 +1 Curator's Ward|DOM +1 Diligent Excavator|DOM +10 Island|DOM +1 Jhoira's Familiar|DOM +1 Meandering River|DOM +1 Memorial to Genius|DOM +1 Memorial to Glory|DOM +1 Mox Amber|DOM +1 Oath of Teferi|DOM +1 Opt|DOM +1 Pardic Wanderer|DOM +1 Pegasus Courser|DOM +3 Plains|DOM +1 Raff Capashen, Ship's Mage|DOM +1 Relic Runner|DOM +1 Syncopate|DOM +1 Teferi's Sentinel|DOM +1 Teferi, Timebender|DOM +1 Tempest Djinn|DOM +1 The Antiquities War|DOM +1 Time of Ice|DOM +1 Tolarian Scholar|DOM +1 Weatherlight|DOM diff --git a/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Raff Capashen, Ships Mage.dck b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Raff Capashen, Ships Mage.dck new file mode 100644 index 00000000000..73e94928c7d --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Raff Capashen, Ships Mage.dck @@ -0,0 +1,38 @@ +[metadata] +Name=Raff Capashen, Ship's Mage +[Commander] +1 Raff Capashen, Ship's Mage|DOM +[Main] +1 Arcane Encyclopedia|M19 +1 Artificer's Assistant|DOM +1 Azorius Guildgate|C18 +1 Blackblade Reforged|DOM +1 Board the Weatherlight|DOM +1 Command Tower|C18 +1 Curator's Ward|DOM +1 D'Avenant Trapper|DOM +1 Daring Archaeologist|DOM +1 Diamond Mare|M19 +1 Diligent Excavator|DOM +1 Forebear's Blade|DOM +1 Gearsmith Guardian|M19 +1 Geode Golem|C18 +1 Helm of the Host|DOM +1 History of Benalia|DOM +4 Island|DOM +1 Jhoira's Familiar|DOM +1 Meandering River|M19 +1 Memorial to Genius|DOM +1 Memorial to Glory|DOM +1 Mimic Vat|C18 +6 Plains|DOM +1 Relic Runner|DOM +1 Sanctum Spirit|DOM +1 Serra Disciple|DOM +1 Sigiled Sword of Valeron|M19 +1 Teshar, Ancestor's Apostle|DOM +1 Time of Ice|DOM +1 Tranquil Cove|C18 +1 Triumph of Gerrard|DOM +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Slinn Voda, the Rising Deep.dck b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Slinn Voda, the Rising Deep.dck new file mode 100644 index 00000000000..c94a57de8cc --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Slinn Voda, the Rising Deep.dck @@ -0,0 +1,31 @@ +[metadata] +Name=Slinn Voda, the Rising Deep +[Commander] +1 Slinn Voda, the Rising Deep|DOM +[Main] +1 Academy Drake|DOM +1 Ancient Stone Idol|C18 +1 Archetype of Imagination|C18 +1 Aven Wind Mage|M19 +1 Blink of an Eye|DOM +1 Essence Scatter|M19 +1 Exclusion Mage|M19 +1 Frilled Sea Serpent|M19 +1 Geode Golem|C18 +1 Gilded Lotus|DOM +1 Inkwell Leviathan|C18 +1 Into the Roil|C18 +16 Island|DOM +1 Merfolk Trickster|DOM +1 Mist-Cloaked Herald|M19 +1 Riddlemaster Sphinx|M19 +1 Sol Ring|C18 +1 Syncopate|DOM +1 Temple of the False God|C18 +1 Temporal Machinations|DOM +1 Time of Ice|DOM +1 Vodalian Arcanist|DOM +1 Wizard's Retort|DOM +1 Worn Powerstone|C18 +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Teferi, Hero of Dominaria.dck b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Teferi, Hero of Dominaria.dck new file mode 100644 index 00000000000..77c5d59eb5d --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Teferi, Hero of Dominaria.dck @@ -0,0 +1,36 @@ +[metadata] +Name=Teferi, Hero of Dominaria +[Main] +1 Blink of an Eye|DOM +1 Disperse|M19 +1 Empyrial Storm|C18 +1 Entreat the Angels|C18 +1 Essence Scatter|M19 +1 Fall of the Thran|DOM +1 Homarid Explorer|DOM +1 In Bolas's Clutches|DOM +6 Island|DOM|2 +1 Luminous Bonds|M19 +1 Meandering River|DOM +1 Memorial to Genius|DOM +1 Memorial to Glory|DOM +1 Millstone|M19 +1 Oath of Teferi|DOM +1 Patient Rebuilding|M19 +5 Plains|DOM|4 +1 Psychic Corrosion|M19 +1 Seal Away|DOM +1 Sigil of the Empty Throne|C18 +1 Sleep|M19 +1 Sol Ring|C18 +1 Soul Snare|C18 +1 Syncopate|DOM +1 Take Vengeance|M19 +1 Teferi, Hero of Dominaria|DOM +1 Teferi, Timebender|DOM +1 Time of Ice|DOM +1 Tranquil Cove|C18 +1 Unquestioned Authority|C18 +1 Waterknot|M19 +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Tetsuko Umezawa, Fugitive.dck b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Tetsuko Umezawa, Fugitive.dck new file mode 100644 index 00000000000..766a077c71b --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Tetsuko Umezawa, Fugitive.dck @@ -0,0 +1,32 @@ +[metadata] +Name=Testuko Umezawa, Fugitive +[Commander] +1 Tetsuko Umezawa, Fugitive|DOM +[Main] +1 Artificer's Assistant|DOM +1 Aviation Pioneer|M19 +1 Diamond Mare|M19 +1 Diligent Excavator|DOM +1 Field Creeper|M19 +1 Helm of the Host|DOM +1 Icy Manipulator|DOM +14 Island|DOM +1 Magistrate's Scepter|M19 +1 Mist-Cloaked Herald|M19 +1 Mistcaller|M19 +1 Mystic Archaeologist|M19 +1 Naban, Dean of Iteration|DOM +1 Omenspeaker|M19 +1 Pilgrim's Eye|C18 +1 Relic Runner|DOM +1 Retrofitter Foundry|C18 +1 Sai, Master Thopterist|M19 +1 Seat of the Synod|C18 +1 Sigiled Starfish|C18 +1 Skilled Animator|M19 +1 Tempest Djinn|DOM +1 Tezzeret's Strider|M19 +1 Tezzeret, Artifice Master|M19 +1 Time of Ice|DOM +1 Vodalian Arcanist|DOM +[Sideboard] diff --git a/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Urza.dck b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Urza.dck new file mode 100644 index 00000000000..03fc8e6f658 --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Urza.dck @@ -0,0 +1,38 @@ +[metadata] +Name=Urza +[Avatar] +1 Urza|VAN +[Main] +1 Aviation Pioneer|M19 +1 Blackblade Reforged|DOM +1 Danitha Capashen, Paragon|DOM +1 Darksteel Citadel|C18 +1 Darksteel Juggernaut|C18 +1 Etherium Sculptor|C18 +1 Forebear's Blade|DOM +7 Island|DOM +1 Karn, Scion of Urza|DOM +1 Meandering River|C18 +1 Memorial to Genius|DOM +1 Mirrorworks|C18 +1 Mox Amber|DOM +1 Myr Battlesphere|C18 +1 On Serra's Wings|DOM +3 Plains|DOM +1 Prototype Portal|C18 +1 Retrofitter Foundry|C18 +1 Sai, Master Thopterist|M19 +1 Seat of the Synod|C18 +1 Sorcerer's Wand|DOM +1 Swiftfoot Boots|C18 +1 Teferi, Timebender|DOM +1 Tetsuko Umezawa, Fugitive|DOM +1 Tezzeret, Artifice Master|M19 +1 Thopter Assembly|C18 +1 Tranquil Cove|C18 +1 Urza's Ruinous Blast|DOM +1 Urza's Tome|DOM +1 Whirler Rogue|C18 +1 Worn Powerstone|C18 +1 Zahid, Djinn of the Lamp|DOM +[Sideboard] diff --git a/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Zahid, Djinn of the Lamp.dck b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Zahid, Djinn of the Lamp.dck new file mode 100644 index 00000000000..86b5b41f942 --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Zahid, Djinn of the Lamp.dck @@ -0,0 +1,34 @@ +[metadata] +Name=Zahid, Djinn of the Lamp +[Commander] +1 Zahid, Djinn of the Lamp|DOM +[Main] +1 Artificer's Assistant|DOM +1 Darksteel Citadel|C18 +1 Darksteel Juggernaut|C18 +1 Echo Storm|C18 +1 Etherium Sculptor|C18 +1 Forebear's Blade|DOM +1 Fountain of Renewal|M19 +1 Gearsmith Guardian|M19 +1 Gearsmith Prodigy|M19 +1 Geode Golem|C18 +13 Island|DOM|3 +1 One with the Machine|M19 +1 Relic Runner|DOM +1 Sai, Master Thopterist|M19 +1 Seat of the Synod|C18 +1 Sharding Sphinx|C18 +1 Skilled Animator|M19 +1 Sol Ring|C18 +1 Tezzeret, Cruel Machinist|M19 +1 The Antiquities War|DOM +1 Thopter Assembly|C18 +1 Thopter Spy Network|C18 +1 Traxos, Scourge of Kroog|DOM +1 Unwinding Clock|C18 +1 Voltaic Servant|DOM +1 Weatherlight|DOM +1 Worn Powerstone|C18 +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Dominaria/Tolaria West/_events.txt b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/_events.txt new file mode 100644 index 00000000000..57e8079c15f --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/_events.txt @@ -0,0 +1,9 @@ +Name:Niambi, Faithful Healer|Deck:Niambi, Faithful Healer.dck|Variant:Commander|Avatar:Niambi, Faithful Healer|Desc: +Name:Raff Capashen, Ship's Mage|Deck:Raff Capashen, Ships Mage.dck|Variant:Commander|Avatar:Raff Capashen, Ship's Mage|Desc: +Name:Adeliz, the Cinder Wind|Deck:Adeliz, the Cinder Wind.dck|Variant:Commander|Avatar:Adeliz, the Cinder Wind|Desc: +Name:Tetsuko Umezawa, Fugitive|Deck:Tetsuko Umezawa, Fugitive.dck|Variant:Commander|Avatar:Tetsuko Umezawa, Fugitive|Desc: +Name:Slinn Voda, the Rising Deep|Deck:Slinn Voda, the Rising Deep.dck|Variant:Commander|Avatar:Slinn Voda, the Rising Deep|Desc: +Name:Zahid, Djinn of the Lamp|Deck:Zahid, Djinn of the Lamp.dck|Variant:Commander|Avatar:Zahid, Djinn of the Lamp|Desc: +Name:Teferi, Hero of Dominaria|Deck:Teferi, Hero of Dominaria.dck|Variant:Planeswalker|Avatar:Teferi, Hero of Dominaria|Desc: +Name:Urza|Deck:Urza.dck|Variant:Vanguard|Avatar:Urza|Desc: +Name:Random Tolaria West|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: diff --git a/forge-gui/res/conquest/planes/Dominaria/Urborg/Josu Vess, Lich Knight.dck b/forge-gui/res/conquest/planes/Dominaria/Urborg/Josu Vess, Lich Knight.dck new file mode 100644 index 00000000000..54d357abb80 --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Urborg/Josu Vess, Lich Knight.dck @@ -0,0 +1,31 @@ +[metadata] +Name=Josu Vess, Lich Knight +[Commander] +1 Josu Vess, Lich Knight|DOM +[Main] +1 Arisen Gorgon|M19 +1 Army of the Damned|C18 +1 Cast Down|DOM +1 Death Baron|M19 +1 Desecrated Tomb|M19 +1 Diregraf Ghoul|M19 +1 Doomed Dissenter|M19 +1 Gilded Lotus|DOM +1 Graveyard Marshal|M19 +1 Infectious Horror|M19 +1 Infernal Scarring|M19 +1 Liliana, Untouched by Death|M19 +1 Loyal Subordinate|C18 +1 Memorial to Folly|DOM +1 Murder|M19 +1 Open the Graves|M19 +1 Reassembling Skeleton|M19 +1 Rise from the Grave|M19 +1 Ruinous Path|C18 +1 Sol Ring|C18 +1 Stitcher's Supplier|M19 +14 Swamp|DOM +1 Tattered Mummy|M19 +1 The Eldest Reborn|DOM +1 Two-Headed Zombie|M19 +1 Walking Corpse|M19 diff --git a/forge-gui/res/conquest/planes/Dominaria/Urborg/Urgoros, the Empty One.dck b/forge-gui/res/conquest/planes/Dominaria/Urborg/Urgoros, the Empty One.dck new file mode 100644 index 00000000000..620378f2a78 --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Urborg/Urgoros, the Empty One.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Urgoros, the Empty One +[Commander] +1 Urgoros, the Empty One|DOM +[Main] +1 Arisen Gorgon|M19 +1 Cabal Paladin|DOM +1 Caligo Skin-Witch|DOM +1 Chainer's Torment|DOM +1 Child of Night|M19 +1 Diamond Mare|M19 +1 Divest|DOM +1 Dread Shade|DOM +1 Duress|M19 +1 Epicure of Blood|M19 +1 Fell Specter|M19 +1 Jhoira's Familiar|DOM +1 Liliana's Spoils|M19 +1 Liliana, the Necromancer|M19 +1 Loyal Subordinate|C18 +1 Macabre Waltz|M19 +1 Memorial to Folly|DOM +1 Mind Rot|M19 +1 Rite of Belzenlok|DOM +1 Skymarch Bloodletter|M19 +1 Sol Ring|C18 +14 Swamp|DOM|1 +1 The Eldest Reborn|DOM +1 Vampire Neonate|M19 +1 Vampire Sovereign|M19 +1 Windgrace Acolyte|DOM +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt b/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt new file mode 100644 index 00000000000..258b2e37f51 --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt @@ -0,0 +1,9 @@ +Name:Urgoros, the Empty One|Deck:Urgoros, the Empty One.dck|Variant:Commander|Avatar:Urgoros, the Empty One|Desc: +Name:Josu Vess, Lich Knight|Deck:Josu Vess, Lich Knight.dck|Variant:Commander|Avatar:Josu Vess, Lich Knight|Desc: +Name:EVENT3|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT4|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT5|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT7|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT8|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Random Urborg|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: diff --git a/forge-gui/res/conquest/planes/Dominaria/banned_cards.txt b/forge-gui/res/conquest/planes/Dominaria/banned_cards.txt new file mode 100644 index 00000000000..d2d6967239a --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/banned_cards.txt @@ -0,0 +1,37 @@ +Avenger of Zendikar +Azorius Guildgate +Azorius Signet +Azorius Chancery +Bant Charm +Budoka Gardener +Daxos of Meletis +Dictate of Kruphix +Dimir Aqueduct +Dimir Guildgate +Dimir Signet +Dreamstone Hedron +Esper Charm +Gaze of Granite +Ghirapur Guide +Golgari Rot Farm +Goreclaw, Terror of Qal Sisma +Grisly Savage +Gruul Turf +Hedron Archive +Herald of the Pantheon +Izzet Boilerworks +Izzet Guildgate +Izzet Signet +Jeskai Infiltrator +Jund Panorama +Kruphix's Insight +Orzhov Basilica +Orzhov Guildgate +Orzhov Signet +Rakdos Carnarium +Selesnya Sanctuary +Simic Growth Chamber +Soul of New Phyrexia +Soul of Innistrad +Turntimber Sower +Zendikar Incarnate diff --git a/forge-gui/res/conquest/planes/Dominaria/cards.txt b/forge-gui/res/conquest/planes/Dominaria/cards.txt index 1f4febf286b..e69de29bb2d 100644 --- a/forge-gui/res/conquest/planes/Dominaria/cards.txt +++ b/forge-gui/res/conquest/planes/Dominaria/cards.txt @@ -1,26 +0,0 @@ -Crown of Empires -Scepter of Empires -Throne of Empires -Roc Egg -Brindle Boar -Armored Cancrix -Academy Raider -Alaborn Cavalier -Prossh, Skyraider of Kher -Balance of Power -Beetleback Chief -Crimson Mage -Cruel Edict -Dakmor Lancer -Famine -Firewing Phoenix -Flesh to Dust -Flusterstorm -Freyalise, Llanowar's Fury -Gaea's Revenge -Ice Cage -Liliana, Heretical Healer -Mwonvuli Beast Tracker -Teferi, Temporal Archmage -Titania, Protector of Argoth -Onyx Mage \ No newline at end of file diff --git a/forge-gui/res/conquest/planes/Dominaria/plane_cards.txt b/forge-gui/res/conquest/planes/Dominaria/plane_cards.txt index 9e81f892561..4d01968b95c 100644 --- a/forge-gui/res/conquest/planes/Dominaria/plane_cards.txt +++ b/forge-gui/res/conquest/planes/Dominaria/plane_cards.txt @@ -4,4 +4,4 @@ Krosa Llanowar Otaria Shiv -Talon Gates \ No newline at end of file +Talon Gates diff --git a/forge-gui/res/conquest/planes/Dominaria/regions.txt b/forge-gui/res/conquest/planes/Dominaria/regions.txt index 379b7ad0b05..ce7408b71a4 100644 --- a/forge-gui/res/conquest/planes/Dominaria/regions.txt +++ b/forge-gui/res/conquest/planes/Dominaria/regions.txt @@ -1,7 +1,5 @@ -Name:Ice Age|Art:Dark Depths|Sets:ICE,ALL,CSP -Name:Mirage|Art:Teferi's Isle|Sets:MIR,VIS,WTH -Name:Urza's Saga|Art:Tolarian Academy|Sets:USG,ULG,UDS -Name:Invasion|Art:Legacy Weapon|Sets:INV,PLS,APC -Name:Odyssey|Art:Cabal Coffers|Sets:ODY,TOR,JUD -Name:Onslaught|Art:Grand Coliseum|Sets:ONS,LGN,SCG -Name:Time Spiral|Art:Vesuva|Sets:TSP,TSB,PLC,FUT \ No newline at end of file +Name:New Benalia|Art:New Benalia|Colors:W +Name:Tolaria West|Art:Tolaria West|Colors:U +Name:Llanowar|Art:Llanowar Reborn|Colors:G +Name:Shiv|Art:Shivan Gorge|Colors:R +Name:Urborg|Art:Cabal Stronghold|Colors:B diff --git a/forge-gui/res/conquest/planes/Dominaria/sets.txt b/forge-gui/res/conquest/planes/Dominaria/sets.txt index 9f80ee8f007..ce571293009 100644 --- a/forge-gui/res/conquest/planes/Dominaria/sets.txt +++ b/forge-gui/res/conquest/planes/Dominaria/sets.txt @@ -1,21 +1,3 @@ -ICE -ALL -CSP -MIR -VIS -WTH -USG -ULG -UDS -INV -PLS -APC -ODY -TOR -JUD -ONS -LGN -SCG -TSP -PLC -FUT \ No newline at end of file +DOM +M19 +C18 diff --git a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/_events.txt index ea4ce8f28c6..1ae5b504fa3 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/_events.txt @@ -1,6 +1,9 @@ -Name:Name1|Deck:Deck1.dck|Variant:None|Avatar:Avatar1|Desc: -Name:Name2|Deck:Deck2.dck|Variant:None|Avatar:Avatar2|Desc: -Name:Name3|Deck:Deck3.dck|Variant:None|Avatar:Avatar3|Desc: -Name:Name4|Deck:Deck4.dck|Variant:Commander|Avatar:Avatar4|Desc: -Name:Name5|Deck:Deck5.dck|Variant:Vanguard|Avatar:Avatar5|Desc: -Name:Name6|Deck:Deck6.dck|Variant:Planeswalker|Avatar:Avatar6|Desc: \ No newline at end of file +Name:EVENT1|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT2|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT3|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT4|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT5|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT7|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT8|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Random Planechase|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: diff --git a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt index ea4ce8f28c6..1ae5b504fa3 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt @@ -1,6 +1,9 @@ -Name:Name1|Deck:Deck1.dck|Variant:None|Avatar:Avatar1|Desc: -Name:Name2|Deck:Deck2.dck|Variant:None|Avatar:Avatar2|Desc: -Name:Name3|Deck:Deck3.dck|Variant:None|Avatar:Avatar3|Desc: -Name:Name4|Deck:Deck4.dck|Variant:Commander|Avatar:Avatar4|Desc: -Name:Name5|Deck:Deck5.dck|Variant:Vanguard|Avatar:Avatar5|Desc: -Name:Name6|Deck:Deck6.dck|Variant:Planeswalker|Avatar:Avatar6|Desc: \ No newline at end of file +Name:EVENT1|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT2|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT3|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT4|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT5|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT7|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT8|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Random Planechase|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: diff --git a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt index ea4ce8f28c6..1ae5b504fa3 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt @@ -1,6 +1,9 @@ -Name:Name1|Deck:Deck1.dck|Variant:None|Avatar:Avatar1|Desc: -Name:Name2|Deck:Deck2.dck|Variant:None|Avatar:Avatar2|Desc: -Name:Name3|Deck:Deck3.dck|Variant:None|Avatar:Avatar3|Desc: -Name:Name4|Deck:Deck4.dck|Variant:Commander|Avatar:Avatar4|Desc: -Name:Name5|Deck:Deck5.dck|Variant:Vanguard|Avatar:Avatar5|Desc: -Name:Name6|Deck:Deck6.dck|Variant:Planeswalker|Avatar:Avatar6|Desc: \ No newline at end of file +Name:EVENT1|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT2|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT3|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT4|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT5|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT7|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT8|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Random Planechase|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: diff --git a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/_events.txt index ea4ce8f28c6..1ae5b504fa3 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/_events.txt @@ -1,6 +1,9 @@ -Name:Name1|Deck:Deck1.dck|Variant:None|Avatar:Avatar1|Desc: -Name:Name2|Deck:Deck2.dck|Variant:None|Avatar:Avatar2|Desc: -Name:Name3|Deck:Deck3.dck|Variant:None|Avatar:Avatar3|Desc: -Name:Name4|Deck:Deck4.dck|Variant:Commander|Avatar:Avatar4|Desc: -Name:Name5|Deck:Deck5.dck|Variant:Vanguard|Avatar:Avatar5|Desc: -Name:Name6|Deck:Deck6.dck|Variant:Planeswalker|Avatar:Avatar6|Desc: \ No newline at end of file +Name:EVENT1|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT2|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT3|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT4|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT5|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT7|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT8|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Random Planechase|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: diff --git a/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt index ea4ce8f28c6..1ae5b504fa3 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt @@ -1,6 +1,9 @@ -Name:Name1|Deck:Deck1.dck|Variant:None|Avatar:Avatar1|Desc: -Name:Name2|Deck:Deck2.dck|Variant:None|Avatar:Avatar2|Desc: -Name:Name3|Deck:Deck3.dck|Variant:None|Avatar:Avatar3|Desc: -Name:Name4|Deck:Deck4.dck|Variant:Commander|Avatar:Avatar4|Desc: -Name:Name5|Deck:Deck5.dck|Variant:Vanguard|Avatar:Avatar5|Desc: -Name:Name6|Deck:Deck6.dck|Variant:Planeswalker|Avatar:Avatar6|Desc: \ No newline at end of file +Name:EVENT1|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT2|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT3|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT4|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT5|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT7|Deck:Random|Variant:None|Avatar:None|Desc: +Name:EVENT8|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Random Planechase|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: diff --git a/forge-gui/res/conquest/planes/Ravnica/Orzhov Basilica/_events.txt b/forge-gui/res/conquest/planes/Ravnica/Orzhov Basilica/_events.txt index b61b05f2800..0129162d782 100644 --- a/forge-gui/res/conquest/planes/Ravnica/Orzhov Basilica/_events.txt +++ b/forge-gui/res/conquest/planes/Ravnica/Orzhov Basilica/_events.txt @@ -5,4 +5,5 @@ Name:Ghost Council of Orzhova|Deck:Ghost Council of Orzhova.dck|Variant:Commande Name:Karlov of the Ghost Council|Deck:Karlov of the Ghost Council.dck|Variant:Commander|Avatar:Karlov of the Ghost Council|Desc: Name:Obzedat, Ghost Council|Deck:Obzedat, Ghost Council.dck|Variant:Commander|Avatar:Obzedat, Ghost Council|Desc: Name:Teysa, Envoy of Ghosts|Deck:Teysa, Envoy of Ghosts.dck|Variant:Commander|Avatar:Teysa, Envoy of Ghosts|Desc: -Name:Teysa, Orzhov Scion|Deck:Teysa, Orzhov Scion Vanguard.dck|Variant:Vanguard|Avatar:Teysa, Orzhov Scion|Desc: \ No newline at end of file +Name:Teysa, Orzhov Scion|Deck:Teysa, Orzhov Scion Vanguard.dck|Variant:Vanguard|Avatar:Teysa, Orzhov Scion|Desc: +Name:Random Orzhov|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: diff --git a/forge-gui/res/conquest/planes/Ravnica/sets.txt b/forge-gui/res/conquest/planes/Ravnica/sets.txt index 772840ca3a2..25c06ea4114 100644 --- a/forge-gui/res/conquest/planes/Ravnica/sets.txt +++ b/forge-gui/res/conquest/planes/Ravnica/sets.txt @@ -6,3 +6,4 @@ GTC DGM C15 GRN +GK1 diff --git a/forge-gui/res/conquest/planes/Theros/Akros/_events.txt b/forge-gui/res/conquest/planes/Theros/Akros/_events.txt index 29ac3fe1df3..30889a542ba 100644 --- a/forge-gui/res/conquest/planes/Theros/Akros/_events.txt +++ b/forge-gui/res/conquest/planes/Theros/Akros/_events.txt @@ -5,4 +5,5 @@ Name:Akroan Soldiers|Deck:WRSoldiers.dck|Variant:None|Avatar:Akroan Hoplite|Desc Name:Iroas|Deck:Iroas.dck|Variant:Commander|Avatar:Iroas, God of Victory|Desc: Name:Kalemne|Deck:Kalemne.dck|Variant:Commander|Avatar:Kalemne, Disciple of Iroas|Desc: Name:Mogis|Deck:Mogis.dck|Variant:Commander|Avatar:Mogis, God of Slaughter|Desc: -Name:Elspeth|Deck:ElspethPW.dck|Variant:Planeswalker|Avatar:Elspeth, Sun's Champion|Desc: \ No newline at end of file +Name:Elspeth|Deck:ElspethPW.dck|Variant:Planeswalker|Avatar:Elspeth, Sun's Champion|Desc: +Name:Random Akros|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: diff --git a/forge-gui/res/conquest/planes/Theros/Meletis/_events.txt b/forge-gui/res/conquest/planes/Theros/Meletis/_events.txt index 717151241f6..a3e59a601dc 100644 --- a/forge-gui/res/conquest/planes/Theros/Meletis/_events.txt +++ b/forge-gui/res/conquest/planes/Theros/Meletis/_events.txt @@ -5,4 +5,5 @@ Name:Ephara|Deck:Ephara.dck|Variant:Commander|Avatar:Ephara, God of the Polis|De Name:Control your Nightmares|Deck:UWControl.dck|Variant:None|Avatar:Prognostic Sphinx|Desc: Name:Keranos|Deck:Keranos.dck|Variant:Commander|Avatar:Keranos, God of Storms|Desc: Name:Medomai|Deck:Medomai.dck|Variant:Commander|Avatar:Medomai the Ageless|Desc: -Name:Kiora|Deck:KioraPW.dck|Variant:Planeswalker|Avatar:Kiora, the Crashing Wave|Desc: \ No newline at end of file +Name:Kiora|Deck:KioraPW.dck|Variant:Planeswalker|Avatar:Kiora, the Crashing Wave|Desc: +Name:Random Meletis|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: diff --git a/forge-gui/res/conquest/planes/Theros/Nyx/_events.txt b/forge-gui/res/conquest/planes/Theros/Nyx/_events.txt index 2480d021156..180a473e90c 100644 --- a/forge-gui/res/conquest/planes/Theros/Nyx/_events.txt +++ b/forge-gui/res/conquest/planes/Theros/Nyx/_events.txt @@ -3,4 +3,7 @@ Name:Nylea|Deck:Nylea.dck|Variant:Commander|Avatar:Nylea, God of the Hunt|Desc: Name:Thassa|Deck:Thassa.dck|Variant:Commander|Avatar:Thassa, God of the Sea|Desc: Name:Erebos|Deck:Erebos.dck|Variant:Commander|Avatar:Erebos, God of the Dead|Desc: Name:Heliod|Deck:Heliod.dck|Variant:Commander|Avatar:Heliod, God of the Sun|Desc: -Name:Defeat a God|Deck:XenagosPW.dck|Variant:Planeswalker|Avatar:Xenagos, the Reveler|Desc: \ No newline at end of file +Name:Defeat a God|Deck:XenagosPW.dck|Variant:Planeswalker|Avatar:Xenagos, the Reveler|Desc: +Name:Random Nyx I|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: +Name:Random Nyx II|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: +Name:Random Nyx III|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: diff --git a/forge-gui/res/conquest/planes/Theros/Setessa/_events.txt b/forge-gui/res/conquest/planes/Theros/Setessa/_events.txt index 059a1580d49..85249e6d927 100644 --- a/forge-gui/res/conquest/planes/Theros/Setessa/_events.txt +++ b/forge-gui/res/conquest/planes/Theros/Setessa/_events.txt @@ -5,4 +5,5 @@ Name:Karametra|Deck:Karametra.dck|Variant:Commander|Avatar:Karametra, God of Har Name:Dark Setessan Night|Deck:BGConstellation.dck|Variant:None|Avatar:Doomwake Giant|Desc: Name:Pharika|Deck:Pharika.dck|Variant:Commander|Avatar:Pharika, God of Affliction|Desc: Name:Polukranos|Deck:Hydra.dck|Variant:None|Avatar:Polukranos, World Eater|Desc: -Name:Ajani, Mentor of Heroes|Deck:AjaniPW.dck|Variant:Planeswalker|Avatar:Ajani, Mentor of Heroes|Desc: \ No newline at end of file +Name:Ajani, Mentor of Heroes|Deck:AjaniPW.dck|Variant:Planeswalker|Avatar:Ajani, Mentor of Heroes|Desc: +Name:Random Setessa|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: diff --git a/forge-gui/res/conquest/planes/Theros/The Underworld/_events.txt b/forge-gui/res/conquest/planes/Theros/The Underworld/_events.txt index 0eb8ebfc956..b83819310a3 100644 --- a/forge-gui/res/conquest/planes/Theros/The Underworld/_events.txt +++ b/forge-gui/res/conquest/planes/Theros/The Underworld/_events.txt @@ -6,3 +6,4 @@ Name:Mind Drain|Deck:UBMilling.dck|Variant:None|Avatar:Phenax, God of Deception| Name:Athreos|Deck:Athreos.dck|Variant:Commander|Avatar:Athreos, God of Passage|Desc: Name:Daxos the Returned|Deck:DaxosReturned.dck|Variant:Commander|Avatar:Daxos the Returned|Desc: Name:Ashiok|Deck:AshiokPW.dck|Variant:Planeswalker|Avatar:Ashiok, Nightmare Weaver|Desc: +Name:Random Underworld|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: diff --git a/forge-gui/res/conquest/planes/Theros/plane_cards.txt b/forge-gui/res/conquest/planes/Theros/plane_cards.txt index dffedf5ded6..95a74cdf1ed 100644 --- a/forge-gui/res/conquest/planes/Theros/plane_cards.txt +++ b/forge-gui/res/conquest/planes/Theros/plane_cards.txt @@ -1 +1 @@ -Lethe Lake \ No newline at end of file +Lethe Lake diff --git a/forge-gui/res/conquest/planes/planes.txt b/forge-gui/res/conquest/planes/planes.txt index aa1b0573cb2..988a3005c6a 100644 --- a/forge-gui/res/conquest/planes/planes.txt +++ b/forge-gui/res/conquest/planes/planes.txt @@ -1,15 +1,15 @@ Name:Alara|RegionSize:9|Desc:As the boundaries between the shards dissolve, cultures clash and wars ensue.\nConsists of 54 events. Contains cards from ALA, CON, ARB, C13, and more. Name:Amonkhet|RegionSize:9|Desc:On the surface, Amonkhet seems like a marvelous place to live, but something unsettling and nefarious lurks behind the grand facade.\nConsists of 45 events. Contains cards from AKH, HOU, some C17, and Amonkhet Invocations. -Name:Dominaria|RegionSize:9|Unreachable:True|Desc: +Name:Dominaria|RegionSize:9|Desc:The legendary plane, once the Nexus of the Multiverse. With the last Time Rift closed, Dominaria's mana flowed back into the land instantaneously, and the world healed and rejuvenated quickly with that infusion of power. After generations of peaceful development, much of Dominaria has managed to rebuild the cultures of its past. Yet, shortly after the Mending, the Cabal began to grow in strength and came under the control of the Demonlord Belzenlok.\nConsists of 45 events. Contains cards from DOM and most of M19 and C18. Name:Innistrad|RegionSize:9|Desc:On this plane, humanity is terrorized by vampires, werewolves, zombies, and ghouls.\nConsists of 45 events. Contains cards from ISD, DKA, AVR, SOI, EMN, and C14. Name:Ixalan|RegionSize:9|Desc:On Ixalan, the untamed jungles have hidden a coveted secret: Orazca, the city of gold, and rivals embark on a journey to claim the plane's greatest fortune for themselves.\nConsists of 45 events. Contains cards from XLN, RIX. Name:Kaladesh|RegionSize:9|Desc:Kaladesh is a living work of art. Aether is inextricably woven into the world's culture of inspired invention.\nConsists of 45 events. Contains cards from KLD, AER, some C17, and Kaladesh Inventions. -Name:Kamigawa|RegionSize:6|Unreachable:True|Desc:For hundreds of years, Kamigawa's denizens peacefully worshipped the spirits of their world. Then suddenly their gods attacked, forcing the world into brutal war.\nContains cards from CHK, BOK, and SOK. +Name:Kamigawa|RegionSize:6|Unreachable:True|Desc:For hundreds of years, Kamigawa's denizens peacefully worshipped the spirits of their world. Then suddenly their gods attacked, forcing the world into brutal war.\nConsists of 45 events. Contains cards from CHK, BOK, and SOK. Name:Lorwyn-Shadowmoor|RegionSize:9|Desc:A sunny utopia with a thriving storybook community, or a battle-wrought land cursed to perpetual gloom.\nConsists of 72 events. Contains cards from LRW, MOR, SHM, EVE, CNS/CN2, and C14. Name:Mercadia|RegionSize:6|Unreachable:True|Desc: Name:Mirrodin|RegionSize:9|Desc:A dark contagion is taking over this metal planet, breeding wave after wave of Phyrexian horrors.\nConsists of 63 events. Contains cards from MRD, DST, 5DN, SOM, MBS, NPH, and more. Name:Rath|RegionSize:6|Unreachable:True|Desc: -Name:Ravnica|RegionSize:9|Desc:A worldwide cityscape of grand halls, decrepit slums, and ancient ruins.\nConsists of 88 events. Contains cards from RAV, GPT, DIS, RTR, GTC, DGM, GRN, and C15. +Name:Ravnica|RegionSize:9|Desc:A worldwide cityscape of grand halls, decrepit slums, and ancient ruins.\nConsists of 88 events. Contains cards from RAV, GPT, DIS, RTR, GTC, DGM, GRN, GK1, and C15. Name:Regatha|RegionSize:6|Unreachable:True|Desc: Name:Shandalar|RegionSize:9|Unreachable:True|Desc: Name:Tarkir|RegionSize:9|Desc:A plane dominated by five powerful clans... or five powerful dragon lords.\nConsists of 45 events. Contains cards from KTK, FRF, DTK, CMD, CNS/CN2, some C17. diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestRegion.java b/forge-gui/src/main/java/forge/planarconquest/ConquestRegion.java index cafb49bb2b6..4dbd9cdeb0a 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestRegion.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestRegion.java @@ -53,6 +53,8 @@ public class ConquestRegion { pc = FModel.getMagicDb().getCommonCards().getCard(artCardName); if (!pc.getName().equals(artCardName) && Card.fromPaperCard(pc, null).hasAlternateState()) { art = GuiBase.getInterface().getCardArt(pc, true); + } else { + art = GuiBase.getInterface().getCardArt(pc); } } else { art = GuiBase.getInterface().getCardArt(pc); From d3bc2ac23ed16bfc2ab60603f98cc19c4feae502 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 22 Nov 2018 14:01:21 +0300 Subject: [PATCH 280/901] - Added a deck to Urborg. --- .../Urborg/Kazarov, Sengir Pureblood.dck | 35 +++++++++++++++++++ .../planes/Dominaria/Urborg/_events.txt | 2 +- 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/conquest/planes/Dominaria/Urborg/Kazarov, Sengir Pureblood.dck diff --git a/forge-gui/res/conquest/planes/Dominaria/Urborg/Kazarov, Sengir Pureblood.dck b/forge-gui/res/conquest/planes/Dominaria/Urborg/Kazarov, Sengir Pureblood.dck new file mode 100644 index 00000000000..420e43ebe3c --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Urborg/Kazarov, Sengir Pureblood.dck @@ -0,0 +1,35 @@ +[metadata] +Name=Kazarov, Sengir Pureblood +[Commander] +1 Kazarov, Sengir Pureblood|DOM +[Main] +1 Akoum Refuge|C18 +1 Arisen Gorgon|M19 +1 Blackblade Reforged|DOM +1 Bone Dragon|M19 +1 Chainer's Torment|DOM +1 Child of Night|M19 +1 Cinder Barrens|M19 +1 Demon of Catastrophes|M19 +1 Electrify|M19 +1 Fight with Fire|DOM +1 Lightning Strike|M19 +1 Liliana, the Necromancer|M19 +1 Loyal Subordinate|C18 +5 Mountain|DOM|3 +1 Nesting Dragon|C18 +1 Radiating Lightning|DOM +1 Reassembling Skeleton|M19 +1 Rite of Belzenlok|DOM +1 Sarkhan, Dragonsoul|M19 +1 Sarkhan, Fireblood|M19 +1 Shivan Fire|DOM +1 Shock|M19 +1 Skymarch Bloodletter|M19 +1 Sol Ring|C18 +8 Swamp|DOM|3 +1 Vampire Neonate|M19 +1 Vampire Sovereign|M19 +1 Yawgmoth's Vile Offering|DOM +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt b/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt index 258b2e37f51..53a2ee94714 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt +++ b/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt @@ -1,6 +1,6 @@ Name:Urgoros, the Empty One|Deck:Urgoros, the Empty One.dck|Variant:Commander|Avatar:Urgoros, the Empty One|Desc: Name:Josu Vess, Lich Knight|Deck:Josu Vess, Lich Knight.dck|Variant:Commander|Avatar:Josu Vess, Lich Knight|Desc: -Name:EVENT3|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Kazarov, Sengir Pureblood|Deck:Kazarov, Sengir Pureblood.dck|Variant:Commander|Avatar:Kazarov, Sengir Pureblood|Desc: Name:EVENT4|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT5|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: From 9e4244b4a53b919d5e89824269135d8a75a26aa6 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 22 Nov 2018 16:50:08 +0300 Subject: [PATCH 281/901] - Added an Urborg event. --- .../Dominaria/Urborg/Arvad the Cursed.dck | 41 +++++++++++++++++++ .../planes/Dominaria/Urborg/_events.txt | 2 +- 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/conquest/planes/Dominaria/Urborg/Arvad the Cursed.dck diff --git a/forge-gui/res/conquest/planes/Dominaria/Urborg/Arvad the Cursed.dck b/forge-gui/res/conquest/planes/Dominaria/Urborg/Arvad the Cursed.dck new file mode 100644 index 00000000000..22a2d635471 --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Urborg/Arvad the Cursed.dck @@ -0,0 +1,41 @@ +[metadata] +Name=Arvad the Cursed +[Commander] +1 Arvad the Cursed|DOM +[Main] +1 Blackblade Reforged|DOM +1 Blessing of Belzenlok|DOM +1 Cast Down|DOM +1 Command Tower|C18 +1 Desecrated Tomb|M19 +1 Evolving Wilds|C18 +1 Evra, Halcyon Witness|DOM +1 Forsaken Sanctuary|M19 +1 Gilded Lotus|DOM +1 Isareth the Awakener|M19 +1 Isolated Chapel|DOM +1 Josu Vess, Lich Knight|DOM +1 Knight of Grace|DOM +1 Knight of Malice|DOM +1 Kwende, Pride of Femeref|DOM +1 Memorial to Folly|DOM +1 Mortify|C18 +1 Mox Amber|DOM +1 Murder|M19 +1 Phylactery Lich|M19 +2 Plains|DOM|1 +1 Primevals' Glorious Rebirth|DOM +1 Scoured Barrens|C18 +1 Serra Disciple|DOM +1 Sol Ring|C18 +1 Soul Salvage|DOM +5 Swamp|DOM|1 +1 Terramorphic Expanse|C18 +1 The Eldest Reborn|DOM +1 Thran Temporal Gateway|DOM +1 Traxos, Scourge of Kroog|DOM +1 Urgoros, the Empty One|DOM +1 Urza's Ruinous Blast|DOM +1 Yawgmoth's Vile Offering|DOM +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt b/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt index 53a2ee94714..891cf44d692 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt +++ b/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt @@ -1,7 +1,7 @@ Name:Urgoros, the Empty One|Deck:Urgoros, the Empty One.dck|Variant:Commander|Avatar:Urgoros, the Empty One|Desc: Name:Josu Vess, Lich Knight|Deck:Josu Vess, Lich Knight.dck|Variant:Commander|Avatar:Josu Vess, Lich Knight|Desc: Name:Kazarov, Sengir Pureblood|Deck:Kazarov, Sengir Pureblood.dck|Variant:Commander|Avatar:Kazarov, Sengir Pureblood|Desc: -Name:EVENT4|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Arvad the Cursed|Deck:Arvad the Cursed.dck|Variant:Commander|Avatar:Arvad the Cursed|Desc: Name:EVENT5|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT7|Deck:Random|Variant:None|Avatar:None|Desc: From 7001902cc65c770e92a2fd83f79395abbddfb734 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 22 Nov 2018 17:13:02 +0300 Subject: [PATCH 282/901] - Added an Urborg event. --- .../Urborg/Liliana, the Necromancer.dck | 30 +++++++++++++++++++ .../planes/Dominaria/Urborg/_events.txt | 2 +- 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/conquest/planes/Dominaria/Urborg/Liliana, the Necromancer.dck diff --git a/forge-gui/res/conquest/planes/Dominaria/Urborg/Liliana, the Necromancer.dck b/forge-gui/res/conquest/planes/Dominaria/Urborg/Liliana, the Necromancer.dck new file mode 100644 index 00000000000..1b4ed89aa85 --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Urborg/Liliana, the Necromancer.dck @@ -0,0 +1,30 @@ +[metadata] +Name=Liliana, the Necromancer +[Main] +1 Abnormal Endurance|M19 +1 Arisen Gorgon|M19 +1 Bloodtallow Candle|DOM +1 Death Baron|M19 +1 Demon of Catastrophes|M19 +1 Demonic Vigor|DOM +1 Demonlord Belzenlok|DOM +1 Diregraf Ghoul|M19 +1 Dread Shade|DOM +1 Entreat the Dead|C18 +1 Josu Vess, Lich Knight|DOM +1 Liliana's Contract|M19 +1 Liliana's Spoils|M19 +1 Liliana, the Necromancer|M19 +1 Mortuary Mire|C18 +1 Open the Graves|M19 +1 Phyrexian Delver|C18 +1 Rise from the Grave|M19 +1 Rite of Belzenlok|DOM +1 Sol Ring|C18 +1 Soul Salvage|DOM +1 Sower of Discord|C18 +1 Stitch Together|C18 +14 Swamp|DOM|1 +1 Tattered Mummy|M19 +1 Two-Headed Zombie|M19 +1 Walking Corpse|M19 diff --git a/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt b/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt index 891cf44d692..234a7b9e03c 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt +++ b/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt @@ -2,7 +2,7 @@ Name:Urgoros, the Empty One|Deck:Urgoros, the Empty One.dck|Variant:Commander|Av Name:Josu Vess, Lich Knight|Deck:Josu Vess, Lich Knight.dck|Variant:Commander|Avatar:Josu Vess, Lich Knight|Desc: Name:Kazarov, Sengir Pureblood|Deck:Kazarov, Sengir Pureblood.dck|Variant:Commander|Avatar:Kazarov, Sengir Pureblood|Desc: Name:Arvad the Cursed|Deck:Arvad the Cursed.dck|Variant:Commander|Avatar:Arvad the Cursed|Desc: -Name:EVENT5|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Liliana, the Necromancer|Deck:Liliana, the Necromancer.dck|Variant:Planeswalker|Avatar:Liliana, the Necromancer|Desc: Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT7|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT8|Deck:Random|Variant:None|Avatar:None|Desc: From c61278124fd8e10ecc64743f14bc3b2fabc9f734 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 23 Nov 2018 09:28:49 +0300 Subject: [PATCH 283/901] - Added an Urborg event. --- .../Dominaria/Urborg/Isareth the Awakener.dck | 31 +++++++++++++++++++ .../planes/Dominaria/Urborg/_events.txt | 2 +- 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/conquest/planes/Dominaria/Urborg/Isareth the Awakener.dck diff --git a/forge-gui/res/conquest/planes/Dominaria/Urborg/Isareth the Awakener.dck b/forge-gui/res/conquest/planes/Dominaria/Urborg/Isareth the Awakener.dck new file mode 100644 index 00000000000..b10d00badb7 --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Urborg/Isareth the Awakener.dck @@ -0,0 +1,31 @@ +[metadata] +Name=Isareth the Awakener +[Commander] +1 Isareth the Awakener|M19 +[Main] +1 Amulet of Safekeeping|M19 +1 Arisen Gorgon|M19 +1 Crucible of Worlds|M19 +1 Dark Bargain|DOM +1 Death Baron|M19 +1 Demon of Catastrophes|M19 +1 Desecrated Tomb|M19 +1 Diregraf Ghoul|M19 +1 Final Parting|DOM +1 Gravewaker|M19 +1 Liliana, Untouched by Death|M19 +1 Macabre Waltz|M19 +1 Reassembling Skeleton|M19 +1 Rise from the Grave|M19 +1 Rite of Belzenlok|DOM +1 Settle the Score|DOM +1 Soul Salvage|DOM +1 Stitcher's Supplier|M19 +1 Strangling Spores|M19 +16 Swamp|M19|1 +1 Tattered Mummy|M19 +1 The Eldest Reborn|DOM +1 Windgrace Acolyte|DOM +1 Yawgmoth's Vile Offering|DOM +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt b/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt index 234a7b9e03c..9696eca7885 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt +++ b/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt @@ -3,7 +3,7 @@ Name:Josu Vess, Lich Knight|Deck:Josu Vess, Lich Knight.dck|Variant:Commander|Av Name:Kazarov, Sengir Pureblood|Deck:Kazarov, Sengir Pureblood.dck|Variant:Commander|Avatar:Kazarov, Sengir Pureblood|Desc: Name:Arvad the Cursed|Deck:Arvad the Cursed.dck|Variant:Commander|Avatar:Arvad the Cursed|Desc: Name:Liliana, the Necromancer|Deck:Liliana, the Necromancer.dck|Variant:Planeswalker|Avatar:Liliana, the Necromancer|Desc: -Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Isareth the Awakener|Deck:Isareth the Awakener.dck|Variant:Commander|Avatar:Isareth the Awakener|Desc: Name:EVENT7|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT8|Deck:Random|Variant:None|Avatar:None|Desc: Name:Random Urborg|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: From c844851324aafc98596ec935053efb5e1e7e2f66 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 23 Nov 2018 10:00:48 +0300 Subject: [PATCH 284/901] - Added an Urborg event. Fixed a few events. --- .../Dominaria/Urborg/Isareth the Awakener.dck | 2 +- .../Urborg/Kazarov, Sengir Pureblood.dck | 2 +- .../Urborg/Liliana, the Necromancer.dck | 2 +- .../planes/Dominaria/Urborg/Necropotence.dck | 31 +++++++++++++++++++ .../Urborg/Urgoros, the Empty One.dck | 2 +- .../planes/Dominaria/Urborg/_events.txt | 2 +- 6 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 forge-gui/res/conquest/planes/Dominaria/Urborg/Necropotence.dck diff --git a/forge-gui/res/conquest/planes/Dominaria/Urborg/Isareth the Awakener.dck b/forge-gui/res/conquest/planes/Dominaria/Urborg/Isareth the Awakener.dck index b10d00badb7..d8ba70fb521 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Urborg/Isareth the Awakener.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Urborg/Isareth the Awakener.dck @@ -22,7 +22,7 @@ Name=Isareth the Awakener 1 Soul Salvage|DOM 1 Stitcher's Supplier|M19 1 Strangling Spores|M19 -16 Swamp|M19|1 +16 Swamp|DOM 1 Tattered Mummy|M19 1 The Eldest Reborn|DOM 1 Windgrace Acolyte|DOM diff --git a/forge-gui/res/conquest/planes/Dominaria/Urborg/Kazarov, Sengir Pureblood.dck b/forge-gui/res/conquest/planes/Dominaria/Urborg/Kazarov, Sengir Pureblood.dck index 420e43ebe3c..da77bda9bce 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Urborg/Kazarov, Sengir Pureblood.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Urborg/Kazarov, Sengir Pureblood.dck @@ -27,7 +27,7 @@ Name=Kazarov, Sengir Pureblood 1 Shock|M19 1 Skymarch Bloodletter|M19 1 Sol Ring|C18 -8 Swamp|DOM|3 +8 Swamp|DOM 1 Vampire Neonate|M19 1 Vampire Sovereign|M19 1 Yawgmoth's Vile Offering|DOM diff --git a/forge-gui/res/conquest/planes/Dominaria/Urborg/Liliana, the Necromancer.dck b/forge-gui/res/conquest/planes/Dominaria/Urborg/Liliana, the Necromancer.dck index 1b4ed89aa85..4d962552e44 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Urborg/Liliana, the Necromancer.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Urborg/Liliana, the Necromancer.dck @@ -24,7 +24,7 @@ Name=Liliana, the Necromancer 1 Soul Salvage|DOM 1 Sower of Discord|C18 1 Stitch Together|C18 -14 Swamp|DOM|1 +14 Swamp|DOM 1 Tattered Mummy|M19 1 Two-Headed Zombie|M19 1 Walking Corpse|M19 diff --git a/forge-gui/res/conquest/planes/Dominaria/Urborg/Necropotence.dck b/forge-gui/res/conquest/planes/Dominaria/Urborg/Necropotence.dck new file mode 100644 index 00000000000..09a5d782ab4 --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Urborg/Necropotence.dck @@ -0,0 +1,31 @@ +[metadata] +Name=Necropotence +[Avatar] +1 Necropotence Avatar|VAN +[Main] +1 Arisen Gorgon|M19 +1 Cabal Paladin|DOM +1 Chainer's Torment|DOM +1 Child of Night|M19 +1 Divest|DOM +1 Dread Shade|DOM +1 Epicure of Blood|M19 +1 Gilded Lotus|DOM +1 Infectious Horror|M19 +1 Liliana, the Necromancer|M19 +1 Liliana, Untouched by Death|M19 +1 Phyrexian Scriptures|DOM +1 Plague Mare|M19 +1 Psychosis Crawler|C18 +1 Retreat to Hagra|C18 +1 Skymarch Bloodletter|M19 +1 Sol Ring|C18 +1 Sovereign's Bite|M19 +1 Sower of Discord|C18 +15 Swamp|DOM +1 Tattered Mummy|M19 +1 The Eldest Reborn|DOM +1 Torgaar, Famine Incarnate|DOM +1 Vampire Neonate|M19 +1 Vampire Sovereign|M19 +1 Worn Powerstone|C18 diff --git a/forge-gui/res/conquest/planes/Dominaria/Urborg/Urgoros, the Empty One.dck b/forge-gui/res/conquest/planes/Dominaria/Urborg/Urgoros, the Empty One.dck index 620378f2a78..0a0d5cf0c37 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Urborg/Urgoros, the Empty One.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Urborg/Urgoros, the Empty One.dck @@ -24,7 +24,7 @@ Name=Urgoros, the Empty One 1 Rite of Belzenlok|DOM 1 Skymarch Bloodletter|M19 1 Sol Ring|C18 -14 Swamp|DOM|1 +14 Swamp|DOM 1 The Eldest Reborn|DOM 1 Vampire Neonate|M19 1 Vampire Sovereign|M19 diff --git a/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt b/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt index 9696eca7885..a6ac2ba1f9a 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt +++ b/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt @@ -5,5 +5,5 @@ Name:Arvad the Cursed|Deck:Arvad the Cursed.dck|Variant:Commander|Avatar:Arvad t Name:Liliana, the Necromancer|Deck:Liliana, the Necromancer.dck|Variant:Planeswalker|Avatar:Liliana, the Necromancer|Desc: Name:Isareth the Awakener|Deck:Isareth the Awakener.dck|Variant:Commander|Avatar:Isareth the Awakener|Desc: Name:EVENT7|Deck:Random|Variant:None|Avatar:None|Desc: -Name:EVENT8|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Necropotence|Deck:Necropotence.dck|Variant:Vanguard|Avatar:Necropotence|Desc: Name:Random Urborg|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: From 612ac6532abaf23ad93ffa947099dafecc6102a3 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 23 Nov 2018 10:28:11 +0300 Subject: [PATCH 285/901] - Added GK1 to Ravnica events. - Unlocked GK1 in quest mode for unlocking GRN. --- .../Ravnica/Boros Garrison/Aurelia, Exemplar of Justice.dck | 6 ++++-- .../planes/Ravnica/Dimir Aqueduct/Etrata, the Silencer.dck | 6 ++++-- .../Ravnica/Golgari Rot Farm/Izoni, Thousand-Eyed.dck | 6 ++++-- .../planes/Ravnica/Izzet Boilerworks/Niv-Mizzet, Parun.dck | 6 ++++-- .../Selesnya Sanctuary/Emmara, Soul of the Accord.dck | 6 ++++-- forge-gui/res/editions/Guilds of Ravnica.txt | 1 + 6 files changed, 21 insertions(+), 10 deletions(-) diff --git a/forge-gui/res/conquest/planes/Ravnica/Boros Garrison/Aurelia, Exemplar of Justice.dck b/forge-gui/res/conquest/planes/Ravnica/Boros Garrison/Aurelia, Exemplar of Justice.dck index 5905e675503..8ff3ff0a5b0 100644 --- a/forge-gui/res/conquest/planes/Ravnica/Boros Garrison/Aurelia, Exemplar of Justice.dck +++ b/forge-gui/res/conquest/planes/Ravnica/Boros Garrison/Aurelia, Exemplar of Justice.dck @@ -18,9 +18,11 @@ Name=Aurelia, Exemplar of Justice 1 Legion Warboss|GRN 1 Light of the Legion|GRN 1 Maximize Velocity|GRN -7 Mountain|GRN +4 Mountain|GRN +3 Mountain|GK1 1 Parhelion Patrol|GRN -7 Plains|GRN +4 Plains|GRN +3 Plains|GK1 1 Rampaging Monument|GRN 1 Sacred Foundry|GRN 1 Skyknight Legionnaire|GRN diff --git a/forge-gui/res/conquest/planes/Ravnica/Dimir Aqueduct/Etrata, the Silencer.dck b/forge-gui/res/conquest/planes/Ravnica/Dimir Aqueduct/Etrata, the Silencer.dck index 3f09a13e74c..f55b77f30b1 100644 --- a/forge-gui/res/conquest/planes/Ravnica/Dimir Aqueduct/Etrata, the Silencer.dck +++ b/forge-gui/res/conquest/planes/Ravnica/Dimir Aqueduct/Etrata, the Silencer.dck @@ -16,13 +16,15 @@ Name=Etrata, the Silencer 1 Disinformation Campaign|GRN 1 Doom Whisperer|GRN 1 Dream Eater|GRN -8 Island|GRN +4 Island|GRN +4 Island|GK1 1 Nightveil Sprite|GRN 1 Notion Rain|GRN 1 Price of Fame|GRN 1 Rampaging Monument|GRN 1 Sinister Sabotage|GRN -6 Swamp|GRN +3 Swamp|GRN +3 Swamp|GK1 1 Thought Erasure|GRN 1 Thoughtbound Phantasm|GRN 1 Unexplained Disappearance|GRN diff --git a/forge-gui/res/conquest/planes/Ravnica/Golgari Rot Farm/Izoni, Thousand-Eyed.dck b/forge-gui/res/conquest/planes/Ravnica/Golgari Rot Farm/Izoni, Thousand-Eyed.dck index 0845342b52b..d7462a6b618 100644 --- a/forge-gui/res/conquest/planes/Ravnica/Golgari Rot Farm/Izoni, Thousand-Eyed.dck +++ b/forge-gui/res/conquest/planes/Ravnica/Golgari Rot Farm/Izoni, Thousand-Eyed.dck @@ -11,7 +11,8 @@ Name=Izoni, Thousand-Eyed 1 Creeping Chill|GRN 1 Doom Whisperer|GRN 1 Erstwhile Trooper|GRN -5 Forest|GRN +3 Forest|GRN +2 Forest|GK1 1 Glowspore Shaman|GRN 1 Golgari Findbroker|GRN 1 Golgari Guildgate|GRN|1 @@ -26,7 +27,8 @@ Name=Izoni, Thousand-Eyed 1 Pitiless Gorgon|GRN 1 Plaguecrafter|GRN 1 Rhizome Lurcher|GRN -7 Swamp|GRN +4 Swamp|GRN +3 Swamp|GK1 1 Swarm Guildmage|GRN 1 Underrealm Lich|GRN 1 Vicious Rumors|GRN diff --git a/forge-gui/res/conquest/planes/Ravnica/Izzet Boilerworks/Niv-Mizzet, Parun.dck b/forge-gui/res/conquest/planes/Ravnica/Izzet Boilerworks/Niv-Mizzet, Parun.dck index e0ba81e9a8d..cb0e421b8bf 100644 --- a/forge-gui/res/conquest/planes/Ravnica/Izzet Boilerworks/Niv-Mizzet, Parun.dck +++ b/forge-gui/res/conquest/planes/Ravnica/Izzet Boilerworks/Niv-Mizzet, Parun.dck @@ -14,13 +14,15 @@ Name=Niv-Mizzet, Parun 1 Gravitic Punch|GRN 1 Inescapable Blaze|GRN 1 Ionize|GRN -5 Island|GRN +3 Island|GRN +2 Island|GK1 1 Izzet Guildgate|GRN|1 1 Izzet Locket|GRN 1 Leapfrog|GRN 1 Maximize Altitude|GRN 1 Maximize Velocity|GRN -7 Mountain|GRN +4 Mountain|GRN +3 Mountain|GK1 1 Murmuring Mystic|GRN 1 Precision Bolt|GRN 1 Quasiduplicate|GRN diff --git a/forge-gui/res/conquest/planes/Ravnica/Selesnya Sanctuary/Emmara, Soul of the Accord.dck b/forge-gui/res/conquest/planes/Ravnica/Selesnya Sanctuary/Emmara, Soul of the Accord.dck index 0e1ae5e53bf..d3f8eabdf80 100644 --- a/forge-gui/res/conquest/planes/Ravnica/Selesnya Sanctuary/Emmara, Soul of the Accord.dck +++ b/forge-gui/res/conquest/planes/Ravnica/Selesnya Sanctuary/Emmara, Soul of the Accord.dck @@ -15,13 +15,15 @@ Name=Emmara, Soul of the Accord 1 District Guide|GRN 1 Divine Visitation|GRN 1 Flower // Flourish|GRN -8 Forest|GRN +4 Forest|GRN +4 Forest|GK1 1 Gird for Battle|GRN 1 Impervious Greatwurm|GRN 1 Ledev Champion|GRN 1 March of the Multitudes|GRN 1 Pelt Collector|GRN -7 Plains|GRN +4 Plains|GRN +4 Plains|GK1 1 Selesnya Guildgate|GRN|1 1 Selesnya Locket|GRN 1 Siege Wurm|GRN diff --git a/forge-gui/res/editions/Guilds of Ravnica.txt b/forge-gui/res/editions/Guilds of Ravnica.txt index b915ce7245c..445777b054d 100644 --- a/forge-gui/res/editions/Guilds of Ravnica.txt +++ b/forge-gui/res/editions/Guilds of Ravnica.txt @@ -7,6 +7,7 @@ MciCode=grn Type=Expansion BoosterCovers=5 Booster=10 Common:!fromSheet("GRN Secret Cards"), 3 Uncommon:!fromSheet("GRN Secret Cards"), 1 RareMythic:!fromSheet("GRN Secret Cards"), 1 fromSheet("GRN Lands") +AdditionalSetUnlockedInQuest=GK1 [cards] 1 C Blade Instructor From 248513b3a3fd788a38d762367ad63b3b2e6d9df7 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 23 Nov 2018 22:44:29 +0300 Subject: [PATCH 286/901] - Finished Urborg events. --- .../Dominaria/Urborg/Demonlord Belzenlok.dck | 31 +++++++++++ .../Urborg/Yargle, Glutton of Urborg.dck | 34 +++++++++++++ .../planes/Dominaria/Urborg/_events.txt | 4 +- .../res/quest/precons/Boros Guild Kit.dck | 50 ++++++++++++++++++ .../res/quest/precons/Dimir Guild Kit.dck | 51 +++++++++++++++++++ .../res/quest/precons/Golgari Guild Kit.dck | 50 ++++++++++++++++++ .../res/quest/precons/Izzet Guild Kit.dck | 50 ++++++++++++++++++ .../res/quest/precons/Selesnya Guild Kit.dck | 48 +++++++++++++++++ 8 files changed, 316 insertions(+), 2 deletions(-) create mode 100644 forge-gui/res/conquest/planes/Dominaria/Urborg/Demonlord Belzenlok.dck create mode 100644 forge-gui/res/conquest/planes/Dominaria/Urborg/Yargle, Glutton of Urborg.dck create mode 100644 forge-gui/res/quest/precons/Boros Guild Kit.dck create mode 100644 forge-gui/res/quest/precons/Dimir Guild Kit.dck create mode 100644 forge-gui/res/quest/precons/Golgari Guild Kit.dck create mode 100644 forge-gui/res/quest/precons/Izzet Guild Kit.dck create mode 100644 forge-gui/res/quest/precons/Selesnya Guild Kit.dck diff --git a/forge-gui/res/conquest/planes/Dominaria/Urborg/Demonlord Belzenlok.dck b/forge-gui/res/conquest/planes/Dominaria/Urborg/Demonlord Belzenlok.dck new file mode 100644 index 00000000000..4f3d2614865 --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Urborg/Demonlord Belzenlok.dck @@ -0,0 +1,31 @@ +[metadata] +Name=Demonlord Belzenlok +[Main] +1 Blackblade Reforged|DOM +1 Cast Down|DOM +1 Child of Night|M19 +1 Demon of Catastrophes|M19 +1 Demonlord Belzenlok|DOM +1 Isareth the Awakener|M19 +1 Josu Vess, Lich Knight|DOM +1 Kazarov, Sengir Pureblood|DOM +1 Liliana's Contract|M19 +1 Liliana's Spoils|M19 +1 Liliana, the Necromancer|M19 +1 Memorial to Folly|DOM +1 Murder|M19 +1 Plague Mare|M19 +1 Rise from the Grave|M19 +1 Rite of Belzenlok|DOM +1 Sol Ring|C18 +1 Sower of Discord|C18 +1 Stitcher's Supplier|M19 +1 Strangling Spores|M19 +15 Swamp|DOM +1 The Eldest Reborn|DOM +1 Torgaar, Famine Incarnate|DOM +1 Urgoros, the Empty One|DOM +1 Worn Powerstone|C18 +1 Yawgmoth's Vile Offering|DOM +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Dominaria/Urborg/Yargle, Glutton of Urborg.dck b/forge-gui/res/conquest/planes/Dominaria/Urborg/Yargle, Glutton of Urborg.dck new file mode 100644 index 00000000000..8b6c0b0a3a2 --- /dev/null +++ b/forge-gui/res/conquest/planes/Dominaria/Urborg/Yargle, Glutton of Urborg.dck @@ -0,0 +1,34 @@ +[metadata] +Name=Yargle, Glutton of Urborg +[Commander] +1 Yargle, Glutton of Urborg|DOM +[Main] +1 Aesthir Glider|DOM +1 Buried Ruin|C18 +1 Cabal Paladin|DOM +1 Cast Down|DOM +1 Chainer's Torment|DOM +1 Chief of the Foundry|C18 +1 Darksteel Citadel|C18 +1 Darksteel Juggernaut|C18 +1 Divest|DOM +1 Dread Shade|DOM +1 Duplicant|C18 +1 Entreat the Dead|C18 +1 Field Creeper|M19 +1 Geode Golem|C18 +1 Jhoira's Familiar|DOM +1 Lingering Phantom|DOM +1 Murder|M19 +1 Phylactery Lich|M19 +1 Phyrexian Scriptures|DOM +1 Sol Ring|C18 +1 Sparring Construct|DOM +1 Suspicious Bookcase|M19 +13 Swamp|DOM +1 The Eldest Reborn|DOM +1 Traxos, Scourge of Kroog|DOM +1 Voltaic Servant|DOM +1 Zhalfirin Void|DOM +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt b/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt index a6ac2ba1f9a..a7df923d827 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt +++ b/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt @@ -4,6 +4,6 @@ Name:Kazarov, Sengir Pureblood|Deck:Kazarov, Sengir Pureblood.dck|Variant:Comman Name:Arvad the Cursed|Deck:Arvad the Cursed.dck|Variant:Commander|Avatar:Arvad the Cursed|Desc: Name:Liliana, the Necromancer|Deck:Liliana, the Necromancer.dck|Variant:Planeswalker|Avatar:Liliana, the Necromancer|Desc: Name:Isareth the Awakener|Deck:Isareth the Awakener.dck|Variant:Commander|Avatar:Isareth the Awakener|Desc: -Name:EVENT7|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Yargle, Glutton of Urborg|Deck:Yargle, Glutton of Urborg.dck|Variant:Commander|Avatar:Yargle, Glutton of Urborg|Desc: Name:Necropotence|Deck:Necropotence.dck|Variant:Vanguard|Avatar:Necropotence|Desc: -Name:Random Urborg|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: +Name:Demonlord Belzenlok|Deck:Demonlord Belzenlok.dck|Variant:Planechase|Avatar:Demonlord Belzenlok|Desc: diff --git a/forge-gui/res/quest/precons/Boros Guild Kit.dck b/forge-gui/res/quest/precons/Boros Guild Kit.dck new file mode 100644 index 00000000000..7ff0f975dc7 --- /dev/null +++ b/forge-gui/res/quest/precons/Boros Guild Kit.dck @@ -0,0 +1,50 @@ +[shop] +WinsToUnlock=20 +Credits=3000 +MinDifficulty=0 +MaxDifficulty=5 +[metadata] +Name=Boros Guild Kit +Description=Guilds of Ravnica: Boros Guild Kit +Set=GK1 +Image=boros_guild_kit.jpg +[main] +1 Agrus Kos, Wojek Veteran|GK1 +1 Aurelia, the Warleader+|GK1 +1 Blade Instructor|GRN +1 Bomber Corps|GK1 +1 Boros Charm|GK1 +1 Boros Elite|GK1 +4 Boros Garrison|GK1 +2 Boros Guildgate|GRN|1 +2 Boros Guildgate|GRN|2 +1 Boros Keyrune|GK1 +1 Boros Reckoner|GK1 +2 Boros Signet|GK1 +2 Boros Swiftblade|GK1 +1 Brightflame|GK1 +1 Daring Skyjek|GK1 +1 Firemane Angel|GK1 +1 Firemane Avenger|GK1 +1 Frenzied Goblin|GK1 +1 Gird for Battle|GRN +1 Hammer Dropper|GRN +1 Legion Loyalist|GK1 +1 Legion Warboss|GRN +1 Light of the Legion|GRN +1 Lightning Helix|GK1 +1 Martial Glory|GK1 +1 Master Warcraft|GK1 +4 Mountain|GK1|1 +4 Mountain|GK1|2 +4 Plains|GK1|1 +4 Plains|GK1|2 +1 Razia, Boros Archangel|GK1 +2 Skyknight Legionnaire|GRN +1 Spark Trooper|GK1 +2 Sunhome Guildmage|GK1 +1 Sunhome Stalwart|GRN +1 Sunhome, Fortress of the Legion|GK1 +1 Swiftblade Vindicator|GRN +1 Sworn Companions|GRN +1 Wojek Bodyguard|GRN diff --git a/forge-gui/res/quest/precons/Dimir Guild Kit.dck b/forge-gui/res/quest/precons/Dimir Guild Kit.dck new file mode 100644 index 00000000000..a27f009202c --- /dev/null +++ b/forge-gui/res/quest/precons/Dimir Guild Kit.dck @@ -0,0 +1,51 @@ +[shop] +WinsToUnlock=20 +Credits=3000 +MinDifficulty=0 +MaxDifficulty=5 +[metadata] +Name=Dimir Guild Kit +Description=Guilds of Ravnica: Dimir Guild Kit +Set=GK1 +Image=dimir_guild_kit.jpg +[main] +1 Barrier of Bones|GRN +1 Blood Operative|GRN +1 Call of the Nightwing|GK1 +1 Circu, Dimir Lobotomist|GK1 +1 Consuming Aberration|GK1 +4 Dimir Aqueduct|GK1 +1 Dimir Charm|GK1 +1 Dimir Doppelganger|GK1 +2 Dimir Guildgate|GRN|1 +2 Dimir Guildgate|GRN|2 +2 Dimir Guildmage|GK1 +2 Dimir Signet|GK1 +1 Dinrova Horror|GK1 +1 Discovery // Dispersal|GRN +1 Disdainful Stroke|GRN +1 Etrata, the Silencer+|GK1 +1 Glimpse the Unthinkable|GK1 +4 Island|GK1|1 +4 Island|GK1|2 +1 Last Gasp|GK1 +1 Lazav, Dimir Mastermind|GK1 +1 Mephitic Vapors|GRN +1 Mirko Vosk, Mind Drinker|GK1 +1 Mission Briefing|GRN +1 Moroii|GK1 +1 Netherborn Phalanx|GK1 +1 Nightveil Predator|GRN +1 Nightveil Specter|GK1 +1 Notion Rain|GRN +1 Price of Fame|GRN +2 Ribbons of Night|GK1 +1 Stolen Identity|GK1 +4 Swamp|GK1|1 +4 Swamp|GK1|2 +1 Syncopate|GK1 +1 Szadek, Lord of Secrets|GK1 +1 Telling Time|GK1 +1 Unexplained Disappearance|GRN +1 Wall of Mist|GRN +1 Warped Physique|GK1 diff --git a/forge-gui/res/quest/precons/Golgari Guild Kit.dck b/forge-gui/res/quest/precons/Golgari Guild Kit.dck new file mode 100644 index 00000000000..0074af9c76d --- /dev/null +++ b/forge-gui/res/quest/precons/Golgari Guild Kit.dck @@ -0,0 +1,50 @@ +[shop] +WinsToUnlock=20 +Credits=3000 +MinDifficulty=0 +MaxDifficulty=5 +[metadata] +Name=Golgari Guild Kit +Description=Guilds of Ravnica: Golgari Guild Kit +Set=GK1 +Image=golgari_guild_kit.jpg +[main] +1 Abrupt Decay|GK1 +1 Charnel Troll|GRN +2 Darkblast|GK1 +1 Deadbridge Chant|GK1 +1 Deadbridge Goliath|GK1 +1 Deathrite Shaman|GK1 +1 Drown in Filth|GK1 +2 Elves of Deep Shadow|GK1 +4 Forest|GK1|1 +4 Forest|GK1|2 +1 Gaze of Granite|GK1 +1 Glowspore Shaman|GRN +1 Golgari Charm|GK1 +1 Golgari Findbroker|GRN +2 Golgari Guildgate|GRN|1 +2 Golgari Guildgate|GRN|2 +4 Golgari Rot Farm|GK1 +2 Golgari Signet|GK1 +1 Grave-Shell Scarab|GK1 +1 Grisly Salvage|GK1 +1 Hatchery Spider|GRN +1 Izoni, Thousand-Eyed+|GK1 +1 Jarad, Golgari Lich Lord|GK1 +2 Korozda Guildmage|GK1 +1 Lotleth Troll|GK1 +1 Necrotic Wound|GRN +1 Plaguecrafter|GRN +1 Putrefy|GK1 +1 Rhizome Lurcher|GRN +1 Savra, Queen of the Golgari|GK1 +1 Shambling Shell|GK1 +1 Sisters of Stone Death|GK1 +1 Slum Reaper|GK1 +1 Status // Statue|GRN +1 Stinkweed Imp|GK1 +4 Swamp|GK1|1 +4 Swamp|GK1|2 +1 Treasured Find|GK1 +1 Vigor Mortis|GK1 diff --git a/forge-gui/res/quest/precons/Izzet Guild Kit.dck b/forge-gui/res/quest/precons/Izzet Guild Kit.dck new file mode 100644 index 00000000000..e596ac83342 --- /dev/null +++ b/forge-gui/res/quest/precons/Izzet Guild Kit.dck @@ -0,0 +1,50 @@ +[shop] +WinsToUnlock=20 +Credits=3000 +MinDifficulty=0 +MaxDifficulty=5 +[metadata] +Name=Izzet Guild Kit +Description=Guilds of Ravnica: Izzet Guild Kit +Set=GK1 +Image=izzet_guild_kit.jpg +[main] +1 Beacon Bolt|GRN +1 Cerebral Vortex|GK1 +1 Char|GK1 +1 Chemister's Insight|GRN +1 Crackling Drake|GRN +1 Direct Current|GRN +1 Djinn Illuminatus|GK1 +1 Electrickery|GK1 +1 Electrolyze|GK1 +1 Electrostatic Field|GRN +1 Erratic Cyclops|GRN +1 Firemind's Research|GRN +1 Gelectrode|GK1 +1 Goblin Electromancer|GRN +1 Goblin Rally|GK1 +2 Guttersnipe|GK1 +1 Hypersonic Dragon|GK1 +1 Invoke the Firemind|GK1 +4 Island|GK1|1 +4 Island|GK1|2 +4 Izzet Boilerworks|GK1 +1 Izzet Charm|GK1 +2 Izzet Guildgate|GRN|1 +2 Izzet Guildgate|GRN|2 +2 Izzet Signet|GK1 +1 Mizzium Mortars|GK1 +4 Mountain|GK1|1 +4 Mountain|GK1|2 +1 Niv-Mizzet, the Firemind+|GK1 +2 Nivix Guildmage|GK1 +1 Pyromatics|GK1 +1 Quasiduplicate|GRN +1 Radical Idea|GRN +1 Shattering Spree|GK1 +1 Stitch in Time|GK1 +1 Thunderheads|GK1 +1 Tibor and Lumia|GK1 +1 Turn // Burn|GK1 +2 Wee Dragonauts|DDJ diff --git a/forge-gui/res/quest/precons/Selesnya Guild Kit.dck b/forge-gui/res/quest/precons/Selesnya Guild Kit.dck new file mode 100644 index 00000000000..8a8382ccdac --- /dev/null +++ b/forge-gui/res/quest/precons/Selesnya Guild Kit.dck @@ -0,0 +1,48 @@ +[shop] +WinsToUnlock=20 +Credits=3000 +MinDifficulty=0 +MaxDifficulty=5 +[metadata] +Name=Selesnya Guild Kit +Description=Guilds of Ravnica: Selesnya Guild Kit +Set=GK1 +Image=selesnya_guild_kit.jpg +[main] +1 Advent of the Wurm|GK1 +1 Armada Wurm|GK1 +1 Bounty of Might|GRN +1 Call of the Conclave|GK1 +1 Camaraderie|GRN +1 Centaur Healer|GK1 +1 Conclave Cavalier|GRN +1 Conclave Tribunal|GRN +2 Devouring Light|GK1 +1 Dryad Militant|GK1 +4 Forest|GK1|1 +4 Forest|GK1|2 +1 Gather Courage|GK1 +1 Glare of Subdual|GK1 +1 Grove of the Guardian|GK1 +1 Growing Ranks|GK1 +1 Hour of Reckoning|GK1 +1 Loxodon Hierarch|GK1 +4 Plains|GK1|1 +4 Plains|GK1|2 +1 Pollenbright Wings|GK1 +1 Privileged Position|GK1 +2 Scatter the Seeds|GK1 +1 Selesnya Charm|GK1 +2 Selesnya Evangel|GK1 +2 Selesnya Guildgate|GRN|1 +2 Selesnya Guildgate|GRN|2 +2 Selesnya Guildmage|GK1 +4 Selesnya Sanctuary|GK1 +2 Selesnya Signet|GK1 +1 Siege Wurm|GRN +1 Sundering Growth|GK1 +1 Tolsimir Wolfblood|GK1 +1 Trostani, Selesnya's Voice+|GK1 +1 Venerated Loxodon|GRN +1 Vernadi Shieldmate|GRN +2 Watchwolf|GK1 From 2cc8100d10260482a09ffe404d426e627197a06c Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 23 Nov 2018 22:53:59 +0300 Subject: [PATCH 287/901] - Art update for Dominaria region Tolaria West. - Shuffled Theros/Setessa events a little bit to avoid starting on a non-singleton event or mandatorily encountering one early. --- forge-gui/res/conquest/planes/Dominaria/regions.txt | 2 +- forge-gui/res/conquest/planes/Theros/Setessa/_events.txt | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/forge-gui/res/conquest/planes/Dominaria/regions.txt b/forge-gui/res/conquest/planes/Dominaria/regions.txt index ce7408b71a4..bf410a806fc 100644 --- a/forge-gui/res/conquest/planes/Dominaria/regions.txt +++ b/forge-gui/res/conquest/planes/Dominaria/regions.txt @@ -1,5 +1,5 @@ Name:New Benalia|Art:New Benalia|Colors:W -Name:Tolaria West|Art:Tolaria West|Colors:U +Name:Tolaria West|Art:Memorial to Genius|Colors:U Name:Llanowar|Art:Llanowar Reborn|Colors:G Name:Shiv|Art:Shivan Gorge|Colors:R Name:Urborg|Art:Cabal Stronghold|Colors:B diff --git a/forge-gui/res/conquest/planes/Theros/Setessa/_events.txt b/forge-gui/res/conquest/planes/Theros/Setessa/_events.txt index 85249e6d927..4a5151dbbb0 100644 --- a/forge-gui/res/conquest/planes/Theros/Setessa/_events.txt +++ b/forge-gui/res/conquest/planes/Theros/Setessa/_events.txt @@ -1,9 +1,9 @@ -Name:Devotion to the Hunt|Deck:MonoGDev.dck|Variant:None|Avatar:Courser of Kruphix|Desc: Name:Anthousa|Deck:Anthousa.dck|Variant:Commander|Avatar:Anthousa, Setessan Hero|Desc: -Name:Wild Monsters|Deck:WildMonsters.dck|Variant:None|Avatar:Fleecemane Lion|Desc: -Name:Karametra|Deck:Karametra.dck|Variant:Commander|Avatar:Karametra, God of Harvests|Desc: -Name:Dark Setessan Night|Deck:BGConstellation.dck|Variant:None|Avatar:Doomwake Giant|Desc: Name:Pharika|Deck:Pharika.dck|Variant:Commander|Avatar:Pharika, God of Affliction|Desc: +Name:Devotion to the Hunt|Deck:MonoGDev.dck|Variant:None|Avatar:Courser of Kruphix|Desc: +Name:Karametra|Deck:Karametra.dck|Variant:Commander|Avatar:Karametra, God of Harvests|Desc: +Name:Wild Monsters|Deck:WildMonsters.dck|Variant:None|Avatar:Fleecemane Lion|Desc: +Name:Dark Setessan Night|Deck:BGConstellation.dck|Variant:None|Avatar:Doomwake Giant|Desc: Name:Polukranos|Deck:Hydra.dck|Variant:None|Avatar:Polukranos, World Eater|Desc: Name:Ajani, Mentor of Heroes|Deck:AjaniPW.dck|Variant:Planeswalker|Avatar:Ajani, Mentor of Heroes|Desc: Name:Random Setessa|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: From 37c195efe242fac30a0af2657b30d7ca722b664b Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 24 Nov 2018 09:04:10 +0300 Subject: [PATCH 288/901] - A little bit more shuffle in Theros initial events. --- forge-gui/res/conquest/planes/Theros/Setessa/_events.txt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/conquest/planes/Theros/Setessa/_events.txt b/forge-gui/res/conquest/planes/Theros/Setessa/_events.txt index 4a5151dbbb0..ce21507c943 100644 --- a/forge-gui/res/conquest/planes/Theros/Setessa/_events.txt +++ b/forge-gui/res/conquest/planes/Theros/Setessa/_events.txt @@ -1,9 +1,10 @@ Name:Anthousa|Deck:Anthousa.dck|Variant:Commander|Avatar:Anthousa, Setessan Hero|Desc: -Name:Pharika|Deck:Pharika.dck|Variant:Commander|Avatar:Pharika, God of Affliction|Desc: -Name:Devotion to the Hunt|Deck:MonoGDev.dck|Variant:None|Avatar:Courser of Kruphix|Desc: Name:Karametra|Deck:Karametra.dck|Variant:Commander|Avatar:Karametra, God of Harvests|Desc: Name:Wild Monsters|Deck:WildMonsters.dck|Variant:None|Avatar:Fleecemane Lion|Desc: -Name:Dark Setessan Night|Deck:BGConstellation.dck|Variant:None|Avatar:Doomwake Giant|Desc: +Name:Pharika|Deck:Pharika.dck|Variant:Commander|Avatar:Pharika, God of Affliction|Desc: Name:Polukranos|Deck:Hydra.dck|Variant:None|Avatar:Polukranos, World Eater|Desc: +Name:Devotion to the Hunt|Deck:MonoGDev.dck|Variant:None|Avatar:Courser of Kruphix|Desc: +Name:Dark Setessan Night|Deck:BGConstellation.dck|Variant:None|Avatar:Doomwake Giant|Desc: Name:Ajani, Mentor of Heroes|Deck:AjaniPW.dck|Variant:Planeswalker|Avatar:Ajani, Mentor of Heroes|Desc: Name:Random Setessa|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: + From 144656fe09fcadfb9a5796da92d0a698bfd24a7d Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 24 Nov 2018 09:40:04 +0300 Subject: [PATCH 289/901] - Unlock Kamigawa. --- forge-gui/res/conquest/planes/planes.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/conquest/planes/planes.txt b/forge-gui/res/conquest/planes/planes.txt index 988a3005c6a..46642d91e0d 100644 --- a/forge-gui/res/conquest/planes/planes.txt +++ b/forge-gui/res/conquest/planes/planes.txt @@ -4,7 +4,7 @@ Name:Dominaria|RegionSize:9|Desc:The legendary plane, once the Nexus of the Mult Name:Innistrad|RegionSize:9|Desc:On this plane, humanity is terrorized by vampires, werewolves, zombies, and ghouls.\nConsists of 45 events. Contains cards from ISD, DKA, AVR, SOI, EMN, and C14. Name:Ixalan|RegionSize:9|Desc:On Ixalan, the untamed jungles have hidden a coveted secret: Orazca, the city of gold, and rivals embark on a journey to claim the plane's greatest fortune for themselves.\nConsists of 45 events. Contains cards from XLN, RIX. Name:Kaladesh|RegionSize:9|Desc:Kaladesh is a living work of art. Aether is inextricably woven into the world's culture of inspired invention.\nConsists of 45 events. Contains cards from KLD, AER, some C17, and Kaladesh Inventions. -Name:Kamigawa|RegionSize:6|Unreachable:True|Desc:For hundreds of years, Kamigawa's denizens peacefully worshipped the spirits of their world. Then suddenly their gods attacked, forcing the world into brutal war.\nConsists of 45 events. Contains cards from CHK, BOK, and SOK. +Name:Kamigawa|RegionSize:9|Desc:For hundreds of years, Kamigawa's denizens peacefully worshipped the spirits of their world. Then suddenly their gods attacked, forcing the world into brutal war.\nConsists of 45 events. Contains cards from CHK, BOK, and SOK. Name:Lorwyn-Shadowmoor|RegionSize:9|Desc:A sunny utopia with a thriving storybook community, or a battle-wrought land cursed to perpetual gloom.\nConsists of 72 events. Contains cards from LRW, MOR, SHM, EVE, CNS/CN2, and C14. Name:Mercadia|RegionSize:6|Unreachable:True|Desc: Name:Mirrodin|RegionSize:9|Desc:A dark contagion is taking over this metal planet, breeding wave after wave of Phyrexian horrors.\nConsists of 63 events. Contains cards from MRD, DST, 5DN, SOM, MBS, NPH, and more. From 271d707a466bbdea5e559b2473e62259bbd9121e Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 25 Nov 2018 09:08:36 +0300 Subject: [PATCH 290/901] - Added a Kamigawa event. - Reconsidering RemRandomDeck on Kamigawa cards. --- forge-gui/res/cardsfolder/b/baku_altar.txt | 1 - forge-gui/res/cardsfolder/c/call_to_glory.txt | 3 +- .../res/cardsfolder/d/day_of_destiny.txt | 3 +- .../res/cardsfolder/e/eiganjo_free_riders.txt | 1 - .../h/hikari_twilight_guardian.txt | 2 +- forge-gui/res/cardsfolder/h/horizon_seed.txt | 1 - .../res/cardsfolder/i/innocence_kami.txt | 1 - forge-gui/res/cardsfolder/j/jade_idol.txt | 1 - .../k/kami_of_the_painted_road.txt | 1 - forge-gui/res/cardsfolder/k/kondas_banner.txt | 1 - .../cardsfolder/l/long_forgotten_gohei.txt | 3 +- .../res/cardsfolder/n/nine_ringed_bo.txt | 1 - .../o/oathkeeper_takenos_daisho.txt | 3 +- .../o/oyobi_who_split_the_heavens.txt | 1 - forge-gui/res/cardsfolder/s/shuriken.txt | 3 +- .../res/cardsfolder/t/tenza_godos_maul.txt | 1 - forge-gui/res/cardsfolder/w/waxmane_baku.txt | 1 - .../Towabara/Nagao, Bound by Honor.dck | 33 +++++++++++++++++++ .../planes/Kamigawa/Towabara/_events.txt | 2 +- 19 files changed, 40 insertions(+), 23 deletions(-) create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Towabara/Nagao, Bound by Honor.dck diff --git a/forge-gui/res/cardsfolder/b/baku_altar.txt b/forge-gui/res/cardsfolder/b/baku_altar.txt index 245efa85b5e..d93a71c3360 100644 --- a/forge-gui/res/cardsfolder/b/baku_altar.txt +++ b/forge-gui/res/cardsfolder/b/baku_altar.txt @@ -4,7 +4,6 @@ Types:Artifact T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, you may put a ki counter on CARDNAME. A:AB$ Token | Cost$ 2 T SubCounter<1/KI> | TokenAmount$ 1 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | TokenOwner$ You | SpellDescription$ Create a 1/1 colorless Spirit creature token. SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ KI | CounterNum$ 1 -AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/baku_altar.jpg Oracle:Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Baku Altar.\n{2}, {T}, Remove a ki counter from Baku Altar: Create a 1/1 colorless Spirit creature token. diff --git a/forge-gui/res/cardsfolder/c/call_to_glory.txt b/forge-gui/res/cardsfolder/c/call_to_glory.txt index 8a51a45d283..76bffeaa0ae 100644 --- a/forge-gui/res/cardsfolder/c/call_to_glory.txt +++ b/forge-gui/res/cardsfolder/c/call_to_glory.txt @@ -2,8 +2,7 @@ Name:Call to Glory ManaCost:1 W Types:Instant A:SP$ UntapAll | Cost$ 1 W | ValidCards$ Creature.YouCtrl | SpellDescription$ Untap all creatures you control. Samurai creatures you control get +1/+1 until end of turn. | SubAbility$ DBPumpYourSamurai -SVar:DBPumpYourSamurai:DB$ PumpAll | ValidCards$ Creature.Samurai+YouCtrl | NumAtt$+1 | NumDef$ +1 -AI:RemoveDeck:Random +SVar:DBPumpYourSamurai:DB$ PumpAll | ValidCards$ Creature.Samurai+YouCtrl | NumAtt$ +1 | NumDef$ +1 | AILogic$ UntapCombatTrick DeckNeeds:Type$Samurai SVar:Picture:http://www.wizards.com/global/images/magic/general/call_to_glory.jpg Oracle:Untap all creatures you control. Samurai creatures you control get +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/d/day_of_destiny.txt b/forge-gui/res/cardsfolder/d/day_of_destiny.txt index c52df17f7b2..141cb8814ae 100644 --- a/forge-gui/res/cardsfolder/d/day_of_destiny.txt +++ b/forge-gui/res/cardsfolder/d/day_of_destiny.txt @@ -2,8 +2,7 @@ Name:Day of Destiny ManaCost:3 W Types:Legendary Enchantment S:Mode$ Continuous | Affected$ Creature.Legendary+YouCtrl | AddPower$ 2 | AddToughness$ 2 | Description$ Legendary creatures you control get +2/+2. -AI:RemoveDeck:Random SVar:PlayMain1:TRUE -DeckHints:Type$Legendary +DeckNeeds:Type$Legendary SVar:Picture:http://www.wizards.com/global/images/magic/general/day_of_destiny.jpg Oracle:Legendary creatures you control get +2/+2. diff --git a/forge-gui/res/cardsfolder/e/eiganjo_free_riders.txt b/forge-gui/res/cardsfolder/e/eiganjo_free_riders.txt index 852d9c8c0ce..af087a0b5c6 100644 --- a/forge-gui/res/cardsfolder/e/eiganjo_free_riders.txt +++ b/forge-gui/res/cardsfolder/e/eiganjo_free_riders.txt @@ -7,6 +7,5 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Creature.White | P SVar:TrigBounce:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Mandatory$ True | Hidden$ True | ChangeType$ Creature.White+YouCtrl SVar:NeedsToPlayVar:Z GE2 SVar:Z:Count$Valid Creature.White+YouCtrl+cmcLE4 -AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/eiganjo_free_riders.jpg Oracle:Flying\nAt the beginning of your upkeep, return a white creature you control to its owner's hand. diff --git a/forge-gui/res/cardsfolder/h/hikari_twilight_guardian.txt b/forge-gui/res/cardsfolder/h/hikari_twilight_guardian.txt index f10454fc8d8..60223fdc855 100644 --- a/forge-gui/res/cardsfolder/h/hikari_twilight_guardian.txt +++ b/forge-gui/res/cardsfolder/h/hikari_twilight_guardian.txt @@ -7,6 +7,6 @@ T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | Trig SVar:TrigExile:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Exile | AILogic$ IfNotBuffed | SubAbility$ DelTrig SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | TriggerDescription$ Return CARDNAME to the battlefield. SVar:TrigReturn:DB$ ChangeZone | Defined$ Self | Origin$ Exile | Destination$ Battlefield -AI:RemoveDeck:Random +DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/hikari_twilight_guardian.jpg Oracle:Flying\nWhenever you cast a Spirit or Arcane spell, you may exile Hikari, Twilight Guardian. If you do, return it to the battlefield under its owner's control at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/h/horizon_seed.txt b/forge-gui/res/cardsfolder/h/horizon_seed.txt index 0734cd01774..67e4f29cfe0 100644 --- a/forge-gui/res/cardsfolder/h/horizon_seed.txt +++ b/forge-gui/res/cardsfolder/h/horizon_seed.txt @@ -5,7 +5,6 @@ PT:2/1 T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRegenerate | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, regenerate target creature. SVar:TrigRegenerate:DB$ Regenerate | ValidTgts$ Creature | TgtPrompt$ Select target creature SVar:BuffedBy:Spirit,Arcane -AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/horizon_seed.jpg Oracle:Whenever you cast a Spirit or Arcane spell, regenerate target creature. diff --git a/forge-gui/res/cardsfolder/i/innocence_kami.txt b/forge-gui/res/cardsfolder/i/innocence_kami.txt index 0089ccd1d07..18e2ef4d6e3 100644 --- a/forge-gui/res/cardsfolder/i/innocence_kami.txt +++ b/forge-gui/res/cardsfolder/i/innocence_kami.txt @@ -5,7 +5,6 @@ PT:2/3 T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigUntap | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, untap CARDNAME. A:AB$ Tap | Cost$ W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. SVar:TrigUntap:DB$Untap | Defined$ Self -AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/innocence_kami.jpg Oracle:{W}, {T}: Tap target creature.\nWhenever you cast a Spirit or Arcane spell, untap Innocence Kami. diff --git a/forge-gui/res/cardsfolder/j/jade_idol.txt b/forge-gui/res/cardsfolder/j/jade_idol.txt index 69d68b1d121..a54d4f90ddb 100644 --- a/forge-gui/res/cardsfolder/j/jade_idol.txt +++ b/forge-gui/res/cardsfolder/j/jade_idol.txt @@ -4,7 +4,6 @@ Types:Artifact T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAnimate | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, CARDNAME becomes a 4/4 Spirit artifact creature until end of turn. SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 4 | Toughness$ 4 | Types$ Creature,Artifact,Spirit SVar:BuffedBy:Arcane,Spirit -AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/jade_idol.jpg Oracle:Whenever you cast a Spirit or Arcane spell, Jade Idol becomes a 4/4 Spirit artifact creature until end of turn. diff --git a/forge-gui/res/cardsfolder/k/kami_of_the_painted_road.txt b/forge-gui/res/cardsfolder/k/kami_of_the_painted_road.txt index 0e188dae3f7..eb35ba12c15 100644 --- a/forge-gui/res/cardsfolder/k/kami_of_the_painted_road.txt +++ b/forge-gui/res/cardsfolder/k/kami_of_the_painted_road.txt @@ -4,7 +4,6 @@ Types:Creature Spirit PT:3/3 T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigProtect | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, CARDNAME gains protection from the color of your choice until end of turn. SVar:TrigProtect:DB$ Protection | Defined$ Self | Gains$ Choice | Choices$ AnyColor -AI:RemoveDeck:Random SVar:BuffedBy:Arcane,Spirit DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/kami_of_the_painted_road.jpg diff --git a/forge-gui/res/cardsfolder/k/kondas_banner.txt b/forge-gui/res/cardsfolder/k/kondas_banner.txt index 47ff7eb36fc..bf8903cc07d 100644 --- a/forge-gui/res/cardsfolder/k/kondas_banner.txt +++ b/forge-gui/res/cardsfolder/k/kondas_banner.txt @@ -5,7 +5,6 @@ K:Equip:2 S:Mode$ CantAttach | ValidCard$ Card.Self | Target$ Creature.nonLegendary | Description$ CARDNAME can be attached only to a legendary creature. S:Mode$ Continuous | Affected$ Creature.SharesColorWith Equipped | AddPower$ 1 | AddToughness$ 1 | Description$ Creatures that share a color with equipped creature get +1/+1. S:Mode$ Continuous | Affected$ Creature.sharesCreatureTypeWith Equipped | AddPower$ 1 | AddToughness$ 1 | Description$ Creatures that share a creature type with equipped creature get +1/+1. -AI:RemoveDeck:Random DeckHints:Type$Legendary SVar:Picture:http://www.wizards.com/global/images/magic/general/kondas_banner.jpg Oracle:Konda's Banner can be attached only to a legendary creature.\nCreatures that share a color with equipped creature get +1/+1.\nCreatures that share a creature type with equipped creature get +1/+1.\nEquip {2} diff --git a/forge-gui/res/cardsfolder/l/long_forgotten_gohei.txt b/forge-gui/res/cardsfolder/l/long_forgotten_gohei.txt index 1d5c7215a8f..deb1c755615 100644 --- a/forge-gui/res/cardsfolder/l/long_forgotten_gohei.txt +++ b/forge-gui/res/cardsfolder/l/long_forgotten_gohei.txt @@ -3,8 +3,7 @@ ManaCost:3 Types:Artifact S:Mode$ Continuous | Affected$ Creature.Spirit+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Spirit creatures you control get +1/+1. S:Mode$ ReduceCost | ValidCard$ Arcane | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Arcane spells you cast cost {1} less to cast. -AI:RemoveDeck:Random SVar:PlayMain1:TRUE -DeckHints:Type$Arcane|Spirit +DeckNeeds:Type$Arcane|Spirit SVar:Picture:http://www.wizards.com/global/images/magic/general/long_forgotten_gohei.jpg Oracle:Arcane spells you cast cost {1} less to cast.\nSpirit creatures you control get +1/+1. diff --git a/forge-gui/res/cardsfolder/n/nine_ringed_bo.txt b/forge-gui/res/cardsfolder/n/nine_ringed_bo.txt index 520995e5945..2aca0d1ece3 100644 --- a/forge-gui/res/cardsfolder/n/nine_ringed_bo.txt +++ b/forge-gui/res/cardsfolder/n/nine_ringed_bo.txt @@ -2,6 +2,5 @@ Name:Nine-Ringed Bo ManaCost:3 Types:Artifact A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature.Spirit | NumDmg$ 1 | ReplaceDyingDefined$ Targeted | SpellDescription$ CARDNAME deals 1 damage to target Spirit creature. If that creature would die this turn, exile it instead. -AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/nine_ringed_bo.jpg Oracle:{T}: Nine-Ringed Bo deals 1 damage to target Spirit creature. If that creature would die this turn, exile it instead. diff --git a/forge-gui/res/cardsfolder/o/oathkeeper_takenos_daisho.txt b/forge-gui/res/cardsfolder/o/oathkeeper_takenos_daisho.txt index ed56bc0c0b5..857b3fb7625 100644 --- a/forge-gui/res/cardsfolder/o/oathkeeper_takenos_daisho.txt +++ b/forge-gui/res/cardsfolder/o/oathkeeper_takenos_daisho.txt @@ -10,7 +10,6 @@ T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | Defined$ Remembered T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.EquippedBy | Execute$ TrigReturn | TriggerController$ TriggeredCardController | TriggerDescription$ Whenever equipped creature dies, return that card to the battlefield under your control if it's a Samurai card. SVar:TrigReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ TriggeredCard | GainControl$ True | ConditionDefined$ TriggeredCard | ConditionPresent$ Card.Samurai | ConditionCompare$ GE1 -AI:RemoveDeck:Random -DeckNeeds:Type$Samurai +DeckHints:Type$Samurai SVar:Picture:http://www.wizards.com/global/images/magic/general/oathkeeper_takenos_daisho.jpg Oracle:Equipped creature gets +3/+1.\nWhenever equipped creature dies, return that card to the battlefield under your control if it's a Samurai card.\nWhen Oathkeeper, Takeno's Daisho is put into a graveyard from the battlefield, exile equipped creature.\nEquip {2} diff --git a/forge-gui/res/cardsfolder/o/oyobi_who_split_the_heavens.txt b/forge-gui/res/cardsfolder/o/oyobi_who_split_the_heavens.txt index 4e987b1ce51..0291378a295 100644 --- a/forge-gui/res/cardsfolder/o/oyobi_who_split_the_heavens.txt +++ b/forge-gui/res/cardsfolder/o/oyobi_who_split_the_heavens.txt @@ -5,7 +5,6 @@ PT:3/6 K:Flying T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, create a 3/3 white Spirit creature token with flying. SVar:TrigToken:DB$Token | TokenImage$ w 3 3 spirit | TokenAmount$ 1 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenOwner$ You | TokenColors$ White | TokenPower$ 3 | TokenToughness$ 3 | TokenKeywords$ Flying -AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/oyobi_who_split_the_heavens.jpg Oracle:Flying\nWhenever you cast a Spirit or Arcane spell, create a 3/3 white Spirit creature token with flying. diff --git a/forge-gui/res/cardsfolder/s/shuriken.txt b/forge-gui/res/cardsfolder/s/shuriken.txt index b1215e95126..8e14884af37 100644 --- a/forge-gui/res/cardsfolder/s/shuriken.txt +++ b/forge-gui/res/cardsfolder/s/shuriken.txt @@ -6,8 +6,7 @@ S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddAbility$ ShurikenDamage SVar:ShurikenDamage:AB$ DealDamage | Cost$ T Unattach | NumDmg$ 2 | DamageSource$ OriginalHost | RememberCostCards$ True | ValidTgts$ Creature | SubAbility$ ShurikenGainCtrl | SpellDescription$ Shuriken deals 2 damage to target creature. That creature's controller gains control of Shuriken unless it was unattached from a Ninja SVar:ShurikenGainCtrl:DB$ GainControl | NewController$ TargetedController | Defined$ Valid Card.IsRemembered+namedShuriken | ConditionDefined$ Self | ConditionPresent$ Ninja | ConditionCompare$ EQ0 | SubAbility$ ShurikenForget SVar:ShurikenForget:DB$ Pump | ForgetObjects$ Valid Card.IsRemembered+namedShuriken | StackDescription$ None -AI:RemoveDeck:Random SVar:NonStackingAttachEffect:True -DeckHints:Type$Ninja +DeckNeeds:Type$Ninja SVar:Picture:http://www.wizards.com/global/images/magic/general/shuriken.jpg Oracle:Equipped creature has "{T}, Unattach Shuriken: Shuriken deals 2 damage to target creature. That creature's controller gains control of Shuriken unless it was unattached from a Ninja."\nEquip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/t/tenza_godos_maul.txt b/forge-gui/res/cardsfolder/t/tenza_godos_maul.txt index 47881156d77..b7363632aa4 100644 --- a/forge-gui/res/cardsfolder/t/tenza_godos_maul.txt +++ b/forge-gui/res/cardsfolder/t/tenza_godos_maul.txt @@ -5,7 +5,6 @@ K:Equip:1 S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 1 | AddToughness$ 1 | Description$ Equipped creature gets +1/+1. S:Mode$ Continuous | Affected$ Card.EquippedBy+Legendary | AddPower$ 2 | AddToughness$ 2 | Description$ As long as it's legendary, it gets an additional +2/+2. S:Mode$ Continuous | Affected$ Card.EquippedBy+Red | AddKeyword$ Trample | Description$ As long as it's red, it has trample. -AI:RemoveDeck:Random SVar:AttachAi:AITgts$ Card.Red,Card.Legendary DeckNeeds:Color$red SVar:Picture:http://www.wizards.com/global/images/magic/general/tenza_godos_maul.jpg diff --git a/forge-gui/res/cardsfolder/w/waxmane_baku.txt b/forge-gui/res/cardsfolder/w/waxmane_baku.txt index 0b5ccd9151b..02297bdd948 100644 --- a/forge-gui/res/cardsfolder/w/waxmane_baku.txt +++ b/forge-gui/res/cardsfolder/w/waxmane_baku.txt @@ -7,7 +7,6 @@ SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ KI | CounterNum A:AB$ Tap | Cost$ 1 SubCounter | TargetMin$ 0 | TargetMax$ MaxTgts | ValidTgts$ Creature | IsCurse$ True | AILogic$ TapForXCounters | TgtPrompt$ Select target creature | References$ X,MaxTgts | SpellDescription$ Tap X target creatures. SVar:X:Targeted$Amount SVar:MaxTgts:Count$CardCounters.KI -AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/waxmane_baku.jpg Oracle:Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Waxmane Baku.\n{1}, Remove X ki counters from Waxmane Baku: Tap X target creatures. diff --git a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Nagao, Bound by Honor.dck b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Nagao, Bound by Honor.dck new file mode 100644 index 00000000000..61cbf72d46f --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Nagao, Bound by Honor.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Nagao, Bound by Honor +[Commander] +1 Nagao, Bound by Honor|CHK +[Main] +1 Araba Mothrider|SOK +1 Bushi Tenderfoot|CHK +1 Call to Glory|CHK +1 Devoted Retainer|CHK +1 Eiganjo Castle|CHK +1 Genju of the Fields|BOK +1 Ghostly Prison|CHK +1 Hand of Honor|SOK +1 Indebted Samurai|BOK +1 Indomitable Will|CHK +1 Kabuto Moth|CHK +1 Kentaro, the Smiling Cat|BOK +1 Kitsune Blademaster|CHK +1 Kitsune Dawnblade|SOK +1 Konda's Banner|CHK +1 Konda's Hatamoto|CHK +1 Mothrider Samurai|CHK +1 Nagao, Bound by Honor|CHK +1 No-Dachi|CHK +1 O-Naginata|SOK +1 Oathkeeper, Takeno's Daisho|CHK +14 Plains|CHK|4 +1 Reverence|SOK +1 Samurai Enforcers|CHK +1 Takeno, Samurai General|CHK +1 Vigilance|CHK +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt index 1ae5b504fa3..2a12827789f 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt @@ -1,4 +1,4 @@ -Name:EVENT1|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Nagao, Bound by Honor|Deck:Nagao, Bound by Honor.dck|Variant:Commander|Avatar:Nagao, Bound by Honor|Desc: Name:EVENT2|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT3|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT4|Deck:Random|Variant:None|Avatar:None|Desc: From 38a54385362bc151677d4a8bf0d7688292c37269 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 25 Nov 2018 13:45:20 +0300 Subject: [PATCH 291/901] - Tweaked a deck. --- .../planes/Kamigawa/Towabara/Nagao, Bound by Honor.dck | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Nagao, Bound by Honor.dck b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Nagao, Bound by Honor.dck index 61cbf72d46f..4dcd2ecdd87 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Nagao, Bound by Honor.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Nagao, Bound by Honor.dck @@ -9,8 +9,8 @@ Name=Nagao, Bound by Honor 1 Devoted Retainer|CHK 1 Eiganjo Castle|CHK 1 Genju of the Fields|BOK -1 Ghostly Prison|CHK 1 Hand of Honor|SOK +1 Hold the Line|CHK 1 Indebted Samurai|BOK 1 Indomitable Will|CHK 1 Kabuto Moth|CHK @@ -24,10 +24,8 @@ Name=Nagao, Bound by Honor 1 No-Dachi|CHK 1 O-Naginata|SOK 1 Oathkeeper, Takeno's Daisho|CHK -14 Plains|CHK|4 +14 Plains|CHK 1 Reverence|SOK 1 Samurai Enforcers|CHK 1 Takeno, Samurai General|CHK 1 Vigilance|CHK -[Sideboard] - From 3930609cf4ce65048cc5dfa5296165fa2ef222b8 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 25 Nov 2018 13:57:30 +0300 Subject: [PATCH 292/901] - Updating CHANGES.txt. --- forge-gui/release-files/CHANGES.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/release-files/CHANGES.txt b/forge-gui/release-files/CHANGES.txt index 54b1c1c0dee..af3585bcaf9 100644 --- a/forge-gui/release-files/CHANGES.txt +++ b/forge-gui/release-files/CHANGES.txt @@ -1,5 +1,5 @@ -- Planar Conquest: Dominaria - -A new plane is now available in Planar Conquest, set in Dominaria. This plane features cards from Dominaria, Magic Core Set 2019, as well as most (but not all) cards from Commander 2018. There are 45 events available for your enjoyment. Traditional Commander and Planeswalker events represent the majority of the events on the plane, but as a special feature Dominaria also features Planechase variant matches instead of Vanguard ones, with the planar decks consisting of plane cards representing regions of Dominaria and various randomly inserted phenomena. Please note that Planar Conquest is currently only available on Android and in the macOS mobile backport. +- Planar Conquest 25th MTG Anniversary / Christmas 2018 Update - +A rather serious and massive content update has happened in Planar Conquest. First of all, there are two new planes available, Dominaria and Kamigawa. Dominaria is a plane which features cards from the eponymous set Dominaria as well as most (but not all) cards from Magic Core Set 2019 and Commander 2018. There are 45 events available for your enjoyment. Traditional Commander, Planeswalker, and Vanguard events represent the majority of the events on the plane, but Dominaria also features Planechase variant matches, with the planar decks consisting of plane cards representing regions of Dominaria and various randomly inserted phenomena. Kamigawa is a plane consisting of 45 events and containing the cards from Champions of Kamigawa, Betrayers of Kamigawa, and Saviors of Kamigawa. Commander, Vanguard, and the new Planechase events are available on this plane, but no Planeswalker events since no planeswalker cards existed in this period of Magic: the Gathering. In addition to that, several other planes were tweaked. In particular, Theros, Alara and Ravnica feature random Planechase matches replacing random non-variant matches. Also, Theros has been tweaked not to start with a hard non-singleton non-variant duel, as well as to allow to ignore non-singleton duels (walk around them) if need be. Please note that Planar Conquest is currently only available on Android and in the mobile backport. - AI Improvements - A new round of AI improvements went into the game, hopefully making the game a little more interesting and exciting to play. In particular, certain improvements regarding Flash were implemented, the AI is now able to use cards which reorder the top of the library, such as Ponder or Portent, as well as cards which copy spells and/or activated abilities, such as Twincast or Fork. On top of that, several logic-related bugs were fixed. Also, the AI has been optimized a little, hopefully making it a bit faster, especially on mobile platforms, in situations where there are a lot of cards on the battlefield but the AI has little or nothing to do. From 7a26ff8b04d9a1575cdf58d93f26120906ed57e8 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 25 Nov 2018 16:26:23 +0300 Subject: [PATCH 293/901] - Added 2 events to Towabara. --- .../cardsfolder/p/presence_of_the_wise.txt | 2 ++ .../Towabara/Oyobi, Who Split the Heavens.dck | 31 +++++++++++++++++++ .../Towabara/Rune-Tail, Kitsune Ascendant.dck | 30 ++++++++++++++++++ .../planes/Kamigawa/Towabara/_events.txt | 4 +-- 4 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Towabara/Oyobi, Who Split the Heavens.dck create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Towabara/Rune-Tail, Kitsune Ascendant.dck diff --git a/forge-gui/res/cardsfolder/p/presence_of_the_wise.txt b/forge-gui/res/cardsfolder/p/presence_of_the_wise.txt index 0707bc07ead..aad7e5e0c8d 100644 --- a/forge-gui/res/cardsfolder/p/presence_of_the_wise.txt +++ b/forge-gui/res/cardsfolder/p/presence_of_the_wise.txt @@ -3,5 +3,7 @@ ManaCost:2 W W Types:Sorcery A:SP$ GainLife | Cost$ 2 W W | LifeAmount$ X | References$ X | SpellDescription$ You gain 2 life for each card in your hand. SVar:X:Count$CardsInYourHand/Times.2 +SVar:NeedsToPlayVar:Z GE3 +SVar:Z:Count$InYourHand SVar:Picture:http://www.wizards.com/global/images/magic/general/presence_of_the_wise.jpg Oracle:You gain 2 life for each card in your hand. diff --git a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Oyobi, Who Split the Heavens.dck b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Oyobi, Who Split the Heavens.dck new file mode 100644 index 00000000000..f619d94d5eb --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Oyobi, Who Split the Heavens.dck @@ -0,0 +1,31 @@ +[metadata] +Name=Oyobi, Who Split the Heavens +[Commander] +1 Oyobi, Who Split the Heavens|BOK +[Main] +1 Baku Altar|BOK +1 Blessed Breath|CHK +1 Candles' Glow|CHK +1 Day of Destiny|BOK +1 Eiganjo Castle|CHK +1 Ethereal Haze|CHK +1 Faithful Squire|BOK +1 Hundred-Talon Kami|CHK +1 Indomitable Will|CHK +1 Jade Idol|CHK +1 Kabuto Moth|CHK +1 Kami of Ancient Law|CHK +1 Kami of Old Stone|CHK +1 Kami of Tattered Shoji|BOK +1 Kami of the Honored Dead|BOK +1 Kami of the Palace Fields|CHK +1 Lantern Kami|CHK +1 Long-Forgotten Gohei|CHK +1 Moonlit Strider|BOK +14 Plains|CHK +1 Promise of Bunrei|SOK +1 Terashi's Verdict|BOK +1 Untaidake, the Cloud Keeper|CHK +1 Vigilance|CHK +1 Waxmane Baku|BOK +1 Yosei, the Morning Star|CHK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Rune-Tail, Kitsune Ascendant.dck b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Rune-Tail, Kitsune Ascendant.dck new file mode 100644 index 00000000000..b0ff1131a1b --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Rune-Tail, Kitsune Ascendant.dck @@ -0,0 +1,30 @@ +[metadata] +Name=Rune-Tail, Kitsune Ascendant +[Commander] +1 Rune-Tail, Kitsune Ascendant|SOK +[Main] +1 Descendant of Kiyomaro|SOK +1 Eiganjo Castle|CHK +1 General's Kabuto|CHK +1 Genju of the Fields|BOK +1 Ghost-Lit Redeemer|SOK +1 Ghostly Prison|CHK +1 Honden of Cleansing Fire|CHK +1 Kami of the Honored Dead|BOK +1 Kitsune Blademaster|CHK +1 Kitsune Dawnblade|SOK +1 Kitsune Healer|CHK +1 Kitsune Riftwalker|CHK +1 Mothrider Samurai|CHK +1 No-Dachi|CHK +1 Patron of the Kitsune|BOK +15 Plains|CHK +1 Presence of the Wise|SOK +1 Reverence|SOK +1 Ronin Warclub|BOK +1 Samurai of the Pale Curtain|CHK +1 Silent-Chant Zubera|CHK +1 Split-Tail Miko|BOK +1 Terashi's Grasp|BOK +1 That Which Was Taken|BOK +1 Umezawa's Jitte|BOK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt index 2a12827789f..834a34eef18 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt @@ -1,6 +1,6 @@ Name:Nagao, Bound by Honor|Deck:Nagao, Bound by Honor.dck|Variant:Commander|Avatar:Nagao, Bound by Honor|Desc: -Name:EVENT2|Deck:Random|Variant:None|Avatar:None|Desc: -Name:EVENT3|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Oyobi, Who Split the Heavens|Deck:Oyobi, Who Split the Heavens.dck|Variant:Commander|Avatar:Oyobi, Who Split the Heavens|Desc: +Name:Rune-Tail, Kitsune Ascendant|Deck:Rune-Tail, Kitsune Ascendant.dck|Variant:Commander|Avatar:Rune-Tail, Kitsune Ascendant|Desc: Name:EVENT4|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT5|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: From a1ad23a999052b8e50b74e3584d2cb20601495d6 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 25 Nov 2018 17:55:14 +0300 Subject: [PATCH 294/901] Revert "- Added a Kamigawa event. - Reconsidering RemRandomDeck on Kamigawa cards." This reverts commit 1015e47 --- forge-gui/res/cardsfolder/b/baku_altar.txt | 1 + forge-gui/res/cardsfolder/c/call_to_glory.txt | 3 ++- forge-gui/res/cardsfolder/d/day_of_destiny.txt | 3 ++- forge-gui/res/cardsfolder/e/eiganjo_free_riders.txt | 1 + forge-gui/res/cardsfolder/h/hikari_twilight_guardian.txt | 2 +- forge-gui/res/cardsfolder/h/horizon_seed.txt | 1 + forge-gui/res/cardsfolder/i/innocence_kami.txt | 1 + forge-gui/res/cardsfolder/j/jade_idol.txt | 1 + forge-gui/res/cardsfolder/k/kami_of_the_painted_road.txt | 1 + forge-gui/res/cardsfolder/k/kondas_banner.txt | 1 + forge-gui/res/cardsfolder/l/long_forgotten_gohei.txt | 3 ++- forge-gui/res/cardsfolder/n/nine_ringed_bo.txt | 1 + forge-gui/res/cardsfolder/o/oathkeeper_takenos_daisho.txt | 3 ++- forge-gui/res/cardsfolder/o/oyobi_who_split_the_heavens.txt | 1 + forge-gui/res/cardsfolder/s/shuriken.txt | 3 ++- forge-gui/res/cardsfolder/t/tenza_godos_maul.txt | 1 + forge-gui/res/cardsfolder/w/waxmane_baku.txt | 1 + 17 files changed, 22 insertions(+), 6 deletions(-) diff --git a/forge-gui/res/cardsfolder/b/baku_altar.txt b/forge-gui/res/cardsfolder/b/baku_altar.txt index d93a71c3360..245efa85b5e 100644 --- a/forge-gui/res/cardsfolder/b/baku_altar.txt +++ b/forge-gui/res/cardsfolder/b/baku_altar.txt @@ -4,6 +4,7 @@ Types:Artifact T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, you may put a ki counter on CARDNAME. A:AB$ Token | Cost$ 2 T SubCounter<1/KI> | TokenAmount$ 1 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | TokenOwner$ You | SpellDescription$ Create a 1/1 colorless Spirit creature token. SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ KI | CounterNum$ 1 +AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/baku_altar.jpg Oracle:Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Baku Altar.\n{2}, {T}, Remove a ki counter from Baku Altar: Create a 1/1 colorless Spirit creature token. diff --git a/forge-gui/res/cardsfolder/c/call_to_glory.txt b/forge-gui/res/cardsfolder/c/call_to_glory.txt index 76bffeaa0ae..8a51a45d283 100644 --- a/forge-gui/res/cardsfolder/c/call_to_glory.txt +++ b/forge-gui/res/cardsfolder/c/call_to_glory.txt @@ -2,7 +2,8 @@ Name:Call to Glory ManaCost:1 W Types:Instant A:SP$ UntapAll | Cost$ 1 W | ValidCards$ Creature.YouCtrl | SpellDescription$ Untap all creatures you control. Samurai creatures you control get +1/+1 until end of turn. | SubAbility$ DBPumpYourSamurai -SVar:DBPumpYourSamurai:DB$ PumpAll | ValidCards$ Creature.Samurai+YouCtrl | NumAtt$ +1 | NumDef$ +1 | AILogic$ UntapCombatTrick +SVar:DBPumpYourSamurai:DB$ PumpAll | ValidCards$ Creature.Samurai+YouCtrl | NumAtt$+1 | NumDef$ +1 +AI:RemoveDeck:Random DeckNeeds:Type$Samurai SVar:Picture:http://www.wizards.com/global/images/magic/general/call_to_glory.jpg Oracle:Untap all creatures you control. Samurai creatures you control get +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/d/day_of_destiny.txt b/forge-gui/res/cardsfolder/d/day_of_destiny.txt index 141cb8814ae..c52df17f7b2 100644 --- a/forge-gui/res/cardsfolder/d/day_of_destiny.txt +++ b/forge-gui/res/cardsfolder/d/day_of_destiny.txt @@ -2,7 +2,8 @@ Name:Day of Destiny ManaCost:3 W Types:Legendary Enchantment S:Mode$ Continuous | Affected$ Creature.Legendary+YouCtrl | AddPower$ 2 | AddToughness$ 2 | Description$ Legendary creatures you control get +2/+2. +AI:RemoveDeck:Random SVar:PlayMain1:TRUE -DeckNeeds:Type$Legendary +DeckHints:Type$Legendary SVar:Picture:http://www.wizards.com/global/images/magic/general/day_of_destiny.jpg Oracle:Legendary creatures you control get +2/+2. diff --git a/forge-gui/res/cardsfolder/e/eiganjo_free_riders.txt b/forge-gui/res/cardsfolder/e/eiganjo_free_riders.txt index af087a0b5c6..852d9c8c0ce 100644 --- a/forge-gui/res/cardsfolder/e/eiganjo_free_riders.txt +++ b/forge-gui/res/cardsfolder/e/eiganjo_free_riders.txt @@ -7,5 +7,6 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Creature.White | P SVar:TrigBounce:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Mandatory$ True | Hidden$ True | ChangeType$ Creature.White+YouCtrl SVar:NeedsToPlayVar:Z GE2 SVar:Z:Count$Valid Creature.White+YouCtrl+cmcLE4 +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/eiganjo_free_riders.jpg Oracle:Flying\nAt the beginning of your upkeep, return a white creature you control to its owner's hand. diff --git a/forge-gui/res/cardsfolder/h/hikari_twilight_guardian.txt b/forge-gui/res/cardsfolder/h/hikari_twilight_guardian.txt index 60223fdc855..f10454fc8d8 100644 --- a/forge-gui/res/cardsfolder/h/hikari_twilight_guardian.txt +++ b/forge-gui/res/cardsfolder/h/hikari_twilight_guardian.txt @@ -7,6 +7,6 @@ T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | Trig SVar:TrigExile:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Exile | AILogic$ IfNotBuffed | SubAbility$ DelTrig SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | TriggerDescription$ Return CARDNAME to the battlefield. SVar:TrigReturn:DB$ ChangeZone | Defined$ Self | Origin$ Exile | Destination$ Battlefield -DeckHints:Type$Spirit|Arcane +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/hikari_twilight_guardian.jpg Oracle:Flying\nWhenever you cast a Spirit or Arcane spell, you may exile Hikari, Twilight Guardian. If you do, return it to the battlefield under its owner's control at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/h/horizon_seed.txt b/forge-gui/res/cardsfolder/h/horizon_seed.txt index 67e4f29cfe0..0734cd01774 100644 --- a/forge-gui/res/cardsfolder/h/horizon_seed.txt +++ b/forge-gui/res/cardsfolder/h/horizon_seed.txt @@ -5,6 +5,7 @@ PT:2/1 T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRegenerate | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, regenerate target creature. SVar:TrigRegenerate:DB$ Regenerate | ValidTgts$ Creature | TgtPrompt$ Select target creature SVar:BuffedBy:Spirit,Arcane +AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/horizon_seed.jpg Oracle:Whenever you cast a Spirit or Arcane spell, regenerate target creature. diff --git a/forge-gui/res/cardsfolder/i/innocence_kami.txt b/forge-gui/res/cardsfolder/i/innocence_kami.txt index 18e2ef4d6e3..0089ccd1d07 100644 --- a/forge-gui/res/cardsfolder/i/innocence_kami.txt +++ b/forge-gui/res/cardsfolder/i/innocence_kami.txt @@ -5,6 +5,7 @@ PT:2/3 T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigUntap | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, untap CARDNAME. A:AB$ Tap | Cost$ W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. SVar:TrigUntap:DB$Untap | Defined$ Self +AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/innocence_kami.jpg Oracle:{W}, {T}: Tap target creature.\nWhenever you cast a Spirit or Arcane spell, untap Innocence Kami. diff --git a/forge-gui/res/cardsfolder/j/jade_idol.txt b/forge-gui/res/cardsfolder/j/jade_idol.txt index a54d4f90ddb..69d68b1d121 100644 --- a/forge-gui/res/cardsfolder/j/jade_idol.txt +++ b/forge-gui/res/cardsfolder/j/jade_idol.txt @@ -4,6 +4,7 @@ Types:Artifact T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAnimate | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, CARDNAME becomes a 4/4 Spirit artifact creature until end of turn. SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 4 | Toughness$ 4 | Types$ Creature,Artifact,Spirit SVar:BuffedBy:Arcane,Spirit +AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/jade_idol.jpg Oracle:Whenever you cast a Spirit or Arcane spell, Jade Idol becomes a 4/4 Spirit artifact creature until end of turn. diff --git a/forge-gui/res/cardsfolder/k/kami_of_the_painted_road.txt b/forge-gui/res/cardsfolder/k/kami_of_the_painted_road.txt index eb35ba12c15..0e188dae3f7 100644 --- a/forge-gui/res/cardsfolder/k/kami_of_the_painted_road.txt +++ b/forge-gui/res/cardsfolder/k/kami_of_the_painted_road.txt @@ -4,6 +4,7 @@ Types:Creature Spirit PT:3/3 T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigProtect | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, CARDNAME gains protection from the color of your choice until end of turn. SVar:TrigProtect:DB$ Protection | Defined$ Self | Gains$ Choice | Choices$ AnyColor +AI:RemoveDeck:Random SVar:BuffedBy:Arcane,Spirit DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/kami_of_the_painted_road.jpg diff --git a/forge-gui/res/cardsfolder/k/kondas_banner.txt b/forge-gui/res/cardsfolder/k/kondas_banner.txt index bf8903cc07d..47ff7eb36fc 100644 --- a/forge-gui/res/cardsfolder/k/kondas_banner.txt +++ b/forge-gui/res/cardsfolder/k/kondas_banner.txt @@ -5,6 +5,7 @@ K:Equip:2 S:Mode$ CantAttach | ValidCard$ Card.Self | Target$ Creature.nonLegendary | Description$ CARDNAME can be attached only to a legendary creature. S:Mode$ Continuous | Affected$ Creature.SharesColorWith Equipped | AddPower$ 1 | AddToughness$ 1 | Description$ Creatures that share a color with equipped creature get +1/+1. S:Mode$ Continuous | Affected$ Creature.sharesCreatureTypeWith Equipped | AddPower$ 1 | AddToughness$ 1 | Description$ Creatures that share a creature type with equipped creature get +1/+1. +AI:RemoveDeck:Random DeckHints:Type$Legendary SVar:Picture:http://www.wizards.com/global/images/magic/general/kondas_banner.jpg Oracle:Konda's Banner can be attached only to a legendary creature.\nCreatures that share a color with equipped creature get +1/+1.\nCreatures that share a creature type with equipped creature get +1/+1.\nEquip {2} diff --git a/forge-gui/res/cardsfolder/l/long_forgotten_gohei.txt b/forge-gui/res/cardsfolder/l/long_forgotten_gohei.txt index deb1c755615..1d5c7215a8f 100644 --- a/forge-gui/res/cardsfolder/l/long_forgotten_gohei.txt +++ b/forge-gui/res/cardsfolder/l/long_forgotten_gohei.txt @@ -3,7 +3,8 @@ ManaCost:3 Types:Artifact S:Mode$ Continuous | Affected$ Creature.Spirit+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Spirit creatures you control get +1/+1. S:Mode$ ReduceCost | ValidCard$ Arcane | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Arcane spells you cast cost {1} less to cast. +AI:RemoveDeck:Random SVar:PlayMain1:TRUE -DeckNeeds:Type$Arcane|Spirit +DeckHints:Type$Arcane|Spirit SVar:Picture:http://www.wizards.com/global/images/magic/general/long_forgotten_gohei.jpg Oracle:Arcane spells you cast cost {1} less to cast.\nSpirit creatures you control get +1/+1. diff --git a/forge-gui/res/cardsfolder/n/nine_ringed_bo.txt b/forge-gui/res/cardsfolder/n/nine_ringed_bo.txt index 2aca0d1ece3..520995e5945 100644 --- a/forge-gui/res/cardsfolder/n/nine_ringed_bo.txt +++ b/forge-gui/res/cardsfolder/n/nine_ringed_bo.txt @@ -2,5 +2,6 @@ Name:Nine-Ringed Bo ManaCost:3 Types:Artifact A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature.Spirit | NumDmg$ 1 | ReplaceDyingDefined$ Targeted | SpellDescription$ CARDNAME deals 1 damage to target Spirit creature. If that creature would die this turn, exile it instead. +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/nine_ringed_bo.jpg Oracle:{T}: Nine-Ringed Bo deals 1 damage to target Spirit creature. If that creature would die this turn, exile it instead. diff --git a/forge-gui/res/cardsfolder/o/oathkeeper_takenos_daisho.txt b/forge-gui/res/cardsfolder/o/oathkeeper_takenos_daisho.txt index 857b3fb7625..ed56bc0c0b5 100644 --- a/forge-gui/res/cardsfolder/o/oathkeeper_takenos_daisho.txt +++ b/forge-gui/res/cardsfolder/o/oathkeeper_takenos_daisho.txt @@ -10,6 +10,7 @@ T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | Defined$ Remembered T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.EquippedBy | Execute$ TrigReturn | TriggerController$ TriggeredCardController | TriggerDescription$ Whenever equipped creature dies, return that card to the battlefield under your control if it's a Samurai card. SVar:TrigReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ TriggeredCard | GainControl$ True | ConditionDefined$ TriggeredCard | ConditionPresent$ Card.Samurai | ConditionCompare$ GE1 -DeckHints:Type$Samurai +AI:RemoveDeck:Random +DeckNeeds:Type$Samurai SVar:Picture:http://www.wizards.com/global/images/magic/general/oathkeeper_takenos_daisho.jpg Oracle:Equipped creature gets +3/+1.\nWhenever equipped creature dies, return that card to the battlefield under your control if it's a Samurai card.\nWhen Oathkeeper, Takeno's Daisho is put into a graveyard from the battlefield, exile equipped creature.\nEquip {2} diff --git a/forge-gui/res/cardsfolder/o/oyobi_who_split_the_heavens.txt b/forge-gui/res/cardsfolder/o/oyobi_who_split_the_heavens.txt index 0291378a295..4e987b1ce51 100644 --- a/forge-gui/res/cardsfolder/o/oyobi_who_split_the_heavens.txt +++ b/forge-gui/res/cardsfolder/o/oyobi_who_split_the_heavens.txt @@ -5,6 +5,7 @@ PT:3/6 K:Flying T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, create a 3/3 white Spirit creature token with flying. SVar:TrigToken:DB$Token | TokenImage$ w 3 3 spirit | TokenAmount$ 1 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenOwner$ You | TokenColors$ White | TokenPower$ 3 | TokenToughness$ 3 | TokenKeywords$ Flying +AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/oyobi_who_split_the_heavens.jpg Oracle:Flying\nWhenever you cast a Spirit or Arcane spell, create a 3/3 white Spirit creature token with flying. diff --git a/forge-gui/res/cardsfolder/s/shuriken.txt b/forge-gui/res/cardsfolder/s/shuriken.txt index 8e14884af37..b1215e95126 100644 --- a/forge-gui/res/cardsfolder/s/shuriken.txt +++ b/forge-gui/res/cardsfolder/s/shuriken.txt @@ -6,7 +6,8 @@ S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddAbility$ ShurikenDamage SVar:ShurikenDamage:AB$ DealDamage | Cost$ T Unattach | NumDmg$ 2 | DamageSource$ OriginalHost | RememberCostCards$ True | ValidTgts$ Creature | SubAbility$ ShurikenGainCtrl | SpellDescription$ Shuriken deals 2 damage to target creature. That creature's controller gains control of Shuriken unless it was unattached from a Ninja SVar:ShurikenGainCtrl:DB$ GainControl | NewController$ TargetedController | Defined$ Valid Card.IsRemembered+namedShuriken | ConditionDefined$ Self | ConditionPresent$ Ninja | ConditionCompare$ EQ0 | SubAbility$ ShurikenForget SVar:ShurikenForget:DB$ Pump | ForgetObjects$ Valid Card.IsRemembered+namedShuriken | StackDescription$ None +AI:RemoveDeck:Random SVar:NonStackingAttachEffect:True -DeckNeeds:Type$Ninja +DeckHints:Type$Ninja SVar:Picture:http://www.wizards.com/global/images/magic/general/shuriken.jpg Oracle:Equipped creature has "{T}, Unattach Shuriken: Shuriken deals 2 damage to target creature. That creature's controller gains control of Shuriken unless it was unattached from a Ninja."\nEquip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/t/tenza_godos_maul.txt b/forge-gui/res/cardsfolder/t/tenza_godos_maul.txt index b7363632aa4..47881156d77 100644 --- a/forge-gui/res/cardsfolder/t/tenza_godos_maul.txt +++ b/forge-gui/res/cardsfolder/t/tenza_godos_maul.txt @@ -5,6 +5,7 @@ K:Equip:1 S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 1 | AddToughness$ 1 | Description$ Equipped creature gets +1/+1. S:Mode$ Continuous | Affected$ Card.EquippedBy+Legendary | AddPower$ 2 | AddToughness$ 2 | Description$ As long as it's legendary, it gets an additional +2/+2. S:Mode$ Continuous | Affected$ Card.EquippedBy+Red | AddKeyword$ Trample | Description$ As long as it's red, it has trample. +AI:RemoveDeck:Random SVar:AttachAi:AITgts$ Card.Red,Card.Legendary DeckNeeds:Color$red SVar:Picture:http://www.wizards.com/global/images/magic/general/tenza_godos_maul.jpg diff --git a/forge-gui/res/cardsfolder/w/waxmane_baku.txt b/forge-gui/res/cardsfolder/w/waxmane_baku.txt index 02297bdd948..0b5ccd9151b 100644 --- a/forge-gui/res/cardsfolder/w/waxmane_baku.txt +++ b/forge-gui/res/cardsfolder/w/waxmane_baku.txt @@ -7,6 +7,7 @@ SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ KI | CounterNum A:AB$ Tap | Cost$ 1 SubCounter | TargetMin$ 0 | TargetMax$ MaxTgts | ValidTgts$ Creature | IsCurse$ True | AILogic$ TapForXCounters | TgtPrompt$ Select target creature | References$ X,MaxTgts | SpellDescription$ Tap X target creatures. SVar:X:Targeted$Amount SVar:MaxTgts:Count$CardCounters.KI +AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/waxmane_baku.jpg Oracle:Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Waxmane Baku.\n{1}, Remove X ki counters from Waxmane Baku: Tap X target creatures. From 91c7b9be35f91d06bc289a87dd941693d07f702d Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 25 Nov 2018 19:59:56 +0300 Subject: [PATCH 295/901] - Added a few events to Towabara. - Tweaked some AI hints for Kamigawa cards. --- .../res/cardsfolder/e/eiganjo_free_riders.txt | 1 + .../h/hikari_twilight_guardian.txt | 1 + .../Kamigawa/Towabara/Celestial Kirin.dck | 30 ++++++++++++++++ .../Towabara/Eight-and-a-Half-Tails.dck | 34 +++++++++++++++++++ .../Towabara/Michiko Konda, Truth Seeker.dck | 33 ++++++++++++++++++ .../planes/Kamigawa/Towabara/_events.txt | 6 ++-- 6 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Towabara/Celestial Kirin.dck create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Towabara/Eight-and-a-Half-Tails.dck create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Towabara/Michiko Konda, Truth Seeker.dck diff --git a/forge-gui/res/cardsfolder/e/eiganjo_free_riders.txt b/forge-gui/res/cardsfolder/e/eiganjo_free_riders.txt index 852d9c8c0ce..cc7213fd923 100644 --- a/forge-gui/res/cardsfolder/e/eiganjo_free_riders.txt +++ b/forge-gui/res/cardsfolder/e/eiganjo_free_riders.txt @@ -8,5 +8,6 @@ SVar:TrigBounce:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Manda SVar:NeedsToPlayVar:Z GE2 SVar:Z:Count$Valid Creature.White+YouCtrl+cmcLE4 AI:RemoveDeck:Random +DeckNeeds:Color$white SVar:Picture:http://www.wizards.com/global/images/magic/general/eiganjo_free_riders.jpg Oracle:Flying\nAt the beginning of your upkeep, return a white creature you control to its owner's hand. diff --git a/forge-gui/res/cardsfolder/h/hikari_twilight_guardian.txt b/forge-gui/res/cardsfolder/h/hikari_twilight_guardian.txt index f10454fc8d8..803dbab2f25 100644 --- a/forge-gui/res/cardsfolder/h/hikari_twilight_guardian.txt +++ b/forge-gui/res/cardsfolder/h/hikari_twilight_guardian.txt @@ -8,5 +8,6 @@ SVar:TrigExile:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destinatio SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | TriggerDescription$ Return CARDNAME to the battlefield. SVar:TrigReturn:DB$ ChangeZone | Defined$ Self | Origin$ Exile | Destination$ Battlefield AI:RemoveDeck:Random +DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/hikari_twilight_guardian.jpg Oracle:Flying\nWhenever you cast a Spirit or Arcane spell, you may exile Hikari, Twilight Guardian. If you do, return it to the battlefield under its owner's control at the beginning of the next end step. diff --git a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Celestial Kirin.dck b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Celestial Kirin.dck new file mode 100644 index 00000000000..2788820ec6c --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Celestial Kirin.dck @@ -0,0 +1,30 @@ +[metadata] +Name=Celestial Kirin +[Commander] +1 Celestial Kirin|CHK +[Main] +1 Blessed Breath|CHK +1 Candles' Glow|CHK +1 Cleanfall|CHK +1 Eiganjo Castle|CHK +1 Genju of the Fields|BOK +1 Hail of Arrows|SOK +1 Hold the Line|CHK +1 Hundred-Talon Kami|CHK +1 Journeyer's Kite|CHK +1 Kabuto Moth|CHK +1 Kami of Ancient Law|CHK +1 Kami of the Honored Dead|BOK +1 Kami of the Palace Fields|CHK +1 Lantern Kami|CHK +1 Moonlit Strider|BOK +1 Nikko-Onna|SOK +1 Otherworldly Journey|CHK +15 Plains|CHK +1 Reciprocate|CHK +1 Scour|BOK +1 Spiritual Visit|SOK +1 Terashi's Cry|CHK +1 Terashi's Verdict|BOK +1 That Which Was Taken|BOK +1 Torii Watchward|SOK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Eight-and-a-Half-Tails.dck b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Eight-and-a-Half-Tails.dck new file mode 100644 index 00000000000..e9e39a61457 --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Eight-and-a-Half-Tails.dck @@ -0,0 +1,34 @@ +[metadata] +Name=Eight-and-a-Half-Tails +[Avatar] +1 Eight-and-a-Half-Tails Avatar|VAN +[Main] +1 Baku Altar|BOK +1 Cloudcrest Lake|CHK +1 Faithful Squire|BOK +1 Floating-Dream Zubera|CHK +1 Genju of the Fields|BOK +1 Hail of Arrows|SOK +1 Heed the Mists|BOK +1 Honden of Seeing Winds|CHK +7 Island|CHK|3 +1 Jade Idol|CHK +1 Jushi Apprentice|CHK +1 Kami of Ancient Law|CHK +1 Kami of the Crescent Moon|SOK +1 Kitsune Riftwalker|CHK +1 Lantern Kami|CHK +1 Long-Forgotten Gohei|CHK +1 Mikokoro, Center of the Sea|SOK +1 Minamo, School at Water's Edge|CHK +1 Nine-Ringed Bo|CHK +7 Plains|CHK|3 +1 Promise of Bunrei|SOK +1 Ribbons of the Reikai|BOK +1 Rushing-Tide Zubera|SOK +1 Secretkeeper|SOK +1 Sensei's Divining Top|CHK +1 Silent-Chant Zubera|CHK +1 Tatsumasa, the Dragon's Fang|CHK +1 Waxmane Baku|BOK +[Sideboard] diff --git a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Michiko Konda, Truth Seeker.dck b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Michiko Konda, Truth Seeker.dck new file mode 100644 index 00000000000..bf6e8c0c82d --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Michiko Konda, Truth Seeker.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Michiko Konda, Truth Seeker +[Commander] +1 Michiko Konda, Truth Seeker|SOK +[Main] +1 Araba Mothrider|SOK +1 Bushi Tenderfoot|CHK +1 Descendant of Kiyomaro|SOK +1 Eiganjo Castle|CHK +1 Eiganjo Free-Riders|SOK +1 Empty-Shrine Kannushi|BOK +1 General's Kabuto|CHK +1 Hand of Honor|SOK +1 Inner-Chamber Guard|SOK +1 Kitsune Dawnblade|SOK +1 Konda's Banner|CHK +1 Konda's Hatamoto|CHK +1 Konda, Lord of Eiganjo|CHK +1 Manriki-Gusari|SOK +1 Masako the Humorless|CHK +1 Nagao, Bound by Honor|CHK +1 No-Dachi|CHK +1 O-Naginata|SOK +1 Oathkeeper, Takeno's Daisho|CHK +14 Plains|CHK +1 Samurai Enforcers|CHK +1 Shuko|BOK +1 Takeno, Samurai General|CHK +1 Tenza, Godo's Maul|CHK +1 That Which Was Taken|BOK +1 Untaidake, the Cloud Keeper|CHK +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt index 834a34eef18..7675ce4e7ca 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt @@ -1,9 +1,9 @@ Name:Nagao, Bound by Honor|Deck:Nagao, Bound by Honor.dck|Variant:Commander|Avatar:Nagao, Bound by Honor|Desc: Name:Oyobi, Who Split the Heavens|Deck:Oyobi, Who Split the Heavens.dck|Variant:Commander|Avatar:Oyobi, Who Split the Heavens|Desc: Name:Rune-Tail, Kitsune Ascendant|Deck:Rune-Tail, Kitsune Ascendant.dck|Variant:Commander|Avatar:Rune-Tail, Kitsune Ascendant|Desc: -Name:EVENT4|Deck:Random|Variant:None|Avatar:None|Desc: -Name:EVENT5|Deck:Random|Variant:None|Avatar:None|Desc: -Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Michiko Konda, Truth Seeker|Deck:Michiko Konda, Truth Seeker.dck|Variant:Commander|Avatar:Michiko Konda, Truth Seeker|Desc: +Name:Eight-and-a-Half-Tails|Deck:Eight-and-a-Half-Tails.dck|Variant:Vanguard|Avatar:Eight-and-a-Half-Tails Avatar|Desc: +Name:Celestial Kirin|Deck:Celestial Kirin.dck|Variant:Commander|Avatar:Celestial Kirin|Desc: Name:EVENT7|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT8|Deck:Random|Variant:None|Avatar:None|Desc: Name:Random Planechase|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: From 8756728b4dd44eb0cd15f00b4436c8b215e31e75 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 25 Nov 2018 20:32:01 +0300 Subject: [PATCH 296/901] - Tweaked some events. --- forge-gui/res/cardsfolder/c/celestial_kirin.txt | 3 ++- .../res/conquest/planes/Kamigawa/Towabara/Celestial Kirin.dck | 2 +- .../planes/Kamigawa/Towabara/Eight-and-a-Half-Tails.dck | 4 ++-- forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/forge-gui/res/cardsfolder/c/celestial_kirin.txt b/forge-gui/res/cardsfolder/c/celestial_kirin.txt index eaf03aea033..424ba4b4936 100644 --- a/forge-gui/res/cardsfolder/c/celestial_kirin.txt +++ b/forge-gui/res/cardsfolder/c/celestial_kirin.txt @@ -6,7 +6,8 @@ K:Flying T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDestroyAll | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, destroy all permanents with that spell's converted mana cost. SVar:TrigDestroyAll:DB$DestroyAll | ValidCards$ Permanent.cmcEQX | References$ X SVar:X:TriggerCount$CastSACMC -AI:RemoveDeck:Random AI:RemoveDeck:All +DeckHints:Type$Spirit|Arcane +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/celestial_kirin.jpg Oracle:Flying\nWhenever you cast a Spirit or Arcane spell, destroy all permanents with that spell's converted mana cost. diff --git a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Celestial Kirin.dck b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Celestial Kirin.dck index 2788820ec6c..f611b83ca17 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Celestial Kirin.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Celestial Kirin.dck @@ -1,7 +1,7 @@ [metadata] Name=Celestial Kirin [Commander] -1 Celestial Kirin|CHK +1 Celestial Kirin|SOK [Main] 1 Blessed Breath|CHK 1 Candles' Glow|CHK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Eight-and-a-Half-Tails.dck b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Eight-and-a-Half-Tails.dck index e9e39a61457..5cbc31346b5 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Eight-and-a-Half-Tails.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Eight-and-a-Half-Tails.dck @@ -11,7 +11,7 @@ Name=Eight-and-a-Half-Tails 1 Hail of Arrows|SOK 1 Heed the Mists|BOK 1 Honden of Seeing Winds|CHK -7 Island|CHK|3 +7 Island|CHK 1 Jade Idol|CHK 1 Jushi Apprentice|CHK 1 Kami of Ancient Law|CHK @@ -22,7 +22,7 @@ Name=Eight-and-a-Half-Tails 1 Mikokoro, Center of the Sea|SOK 1 Minamo, School at Water's Edge|CHK 1 Nine-Ringed Bo|CHK -7 Plains|CHK|3 +7 Plains|CHK 1 Promise of Bunrei|SOK 1 Ribbons of the Reikai|BOK 1 Rushing-Tide Zubera|SOK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt index 7675ce4e7ca..e831f48cb22 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt @@ -1,7 +1,7 @@ +Name:Michiko Konda, Truth Seeker|Deck:Michiko Konda, Truth Seeker.dck|Variant:Commander|Avatar:Michiko Konda, Truth Seeker|Desc: Name:Nagao, Bound by Honor|Deck:Nagao, Bound by Honor.dck|Variant:Commander|Avatar:Nagao, Bound by Honor|Desc: Name:Oyobi, Who Split the Heavens|Deck:Oyobi, Who Split the Heavens.dck|Variant:Commander|Avatar:Oyobi, Who Split the Heavens|Desc: Name:Rune-Tail, Kitsune Ascendant|Deck:Rune-Tail, Kitsune Ascendant.dck|Variant:Commander|Avatar:Rune-Tail, Kitsune Ascendant|Desc: -Name:Michiko Konda, Truth Seeker|Deck:Michiko Konda, Truth Seeker.dck|Variant:Commander|Avatar:Michiko Konda, Truth Seeker|Desc: Name:Eight-and-a-Half-Tails|Deck:Eight-and-a-Half-Tails.dck|Variant:Vanguard|Avatar:Eight-and-a-Half-Tails Avatar|Desc: Name:Celestial Kirin|Deck:Celestial Kirin.dck|Variant:Commander|Avatar:Celestial Kirin|Desc: Name:EVENT7|Deck:Random|Variant:None|Avatar:None|Desc: From 131f88b34b08a700de662adb20179d13470e139e Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 25 Nov 2018 20:51:33 +0300 Subject: [PATCH 297/901] - Fixed Orochi Colony. --- forge-gui/res/cardsfolder/o/orochi_colony.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/o/orochi_colony.txt b/forge-gui/res/cardsfolder/o/orochi_colony.txt index aa74499d2ee..7363c8d3630 100644 --- a/forge-gui/res/cardsfolder/o/orochi_colony.txt +++ b/forge-gui/res/cardsfolder/o/orochi_colony.txt @@ -6,5 +6,5 @@ SVar:TrigRamp:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | Tapp T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, target creature can't be blocked this turn. SVar:RolledChaos:DB$ Pump | ValidTgts$ Creature | KW$ HIDDEN Unblockable SVar:Picture:http://www.wizards.com/global/images/magic/general/orochi_colony.jpg -SVar:AIRollPlanarDieParams:Mode$ Always | HasCreatureInPlay$ True +SVar:AIRollPlanarDieParams:Mode$ Always | HasCreatureInPlay$ True | RollInMain1$ True Oracle:Whenever a creature you control deals combat damage to a player, you may search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library.\nWhenever you roll {CHAOS}, target creature can't be blocked this turn. From eaa7e577bfc19ac5a53f05c6419caf9d41095187 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 26 Nov 2018 09:09:06 +0300 Subject: [PATCH 298/901] - Added a Towabara event. --- .../Towabara/Takeno, Samurai General.dck | 33 +++++++++++++++++++ .../planes/Kamigawa/Towabara/_events.txt | 2 +- 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Towabara/Takeno, Samurai General.dck diff --git a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Takeno, Samurai General.dck b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Takeno, Samurai General.dck new file mode 100644 index 00000000000..7073d40d8ac --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Takeno, Samurai General.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Takeno, Samurai General +[Commander] +1 Takeno, Samurai General|CHK +[Main] +1 Araba Mothrider|SOK +1 Cloudcrest Lake|CHK +1 Devoted Retainer|CHK +1 Eiganjo Castle|CHK +1 Genju of the Fields|BOK +1 Ghostly Prison|CHK +1 Hand of Honor|SOK +1 Indebted Samurai|BOK +1 Kentaro, the Smiling Cat|BOK +1 Kitsune Blademaster|CHK +1 Konda's Banner|CHK +1 Konda's Hatamoto|CHK +1 Konda, Lord of Eiganjo|CHK +1 Mothrider Samurai|CHK +1 Nagao, Bound by Honor|CHK +1 No-Dachi|CHK +1 O-Naginata|SOK +1 Oathkeeper, Takeno's Daisho|CHK +14 Plains|CHK|2 +1 Promise of Bunrei|SOK +1 Reverence|SOK +1 Samurai Enforcers|CHK +1 Silverstorm Samurai|BOK +1 Umezawa's Jitte|BOK +1 Untaidake, the Cloud Keeper|CHK +1 Vigilance|CHK +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt index e831f48cb22..550e7dc0af2 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt @@ -4,6 +4,6 @@ Name:Oyobi, Who Split the Heavens|Deck:Oyobi, Who Split the Heavens.dck|Variant: Name:Rune-Tail, Kitsune Ascendant|Deck:Rune-Tail, Kitsune Ascendant.dck|Variant:Commander|Avatar:Rune-Tail, Kitsune Ascendant|Desc: Name:Eight-and-a-Half-Tails|Deck:Eight-and-a-Half-Tails.dck|Variant:Vanguard|Avatar:Eight-and-a-Half-Tails Avatar|Desc: Name:Celestial Kirin|Deck:Celestial Kirin.dck|Variant:Commander|Avatar:Celestial Kirin|Desc: -Name:EVENT7|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Takeno, Samurai General|Deck:Takeno, Samurai General.dck|Variant:Commander|Avatar:Takeno, Samurai General|Desc: Name:EVENT8|Deck:Random|Variant:None|Avatar:None|Desc: Name:Random Planechase|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: From 1cc6fe69f62801961467d90caebb0b01f00b641b Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 26 Nov 2018 10:47:07 +0300 Subject: [PATCH 299/901] - Finish Towabara. --- .../Towabara/Spirits of the Plane.dck | 37 +++++++++++++++++++ .../planes/Kamigawa/Towabara/_events.txt | 2 +- 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Towabara/Spirits of the Plane.dck diff --git a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Spirits of the Plane.dck b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Spirits of the Plane.dck new file mode 100644 index 00000000000..89bf7da07b8 --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Spirits of the Plane.dck @@ -0,0 +1,37 @@ +[metadata] +Name=Spirits of the Plane +[Main] +1 Ashen-Skin Zubera|CHK +1 Baku Altar|BOK +1 Crawling Filth|BOK +1 Dripping-Tongue Zubera|CHK +1 Eiganjo Castle|CHK +1 Faithful Squire|BOK +1 Forbidden Orchard|CHK +2 Forest|CHK +1 Ghost-Lit Redeemer|SOK +1 Gibbering Kami|CHK +1 Hundred-Talon Kami|CHK +1 Kami of Ancient Law|CHK +1 Kami of the Honored Dead|BOK +1 Kami of the Palace Fields|CHK +1 Kami of the Tended Garden|SOK +1 Kodama of the Center Tree|BOK +1 Lantern Kami|CHK +1 Loam Dweller|BOK +1 Long-Forgotten Gohei|CHK +1 Masako the Humorless|CHK +1 Mikokoro, Center of the Sea|SOK +1 Moonlit Strider|BOK +1 Okina, Temple to the Grandfathers|CHK +5 Plains|CHK +1 Promise of Bunrei|SOK +1 Promised Kannushi|SOK +1 Shizo, Death's Storehouse|CHK +1 Silent-Chant Zubera|CHK +2 Swamp|CHK +1 Tendo Ice Bridge|BOK +1 Thief of Hope|CHK +1 Torii Watchward|SOK +1 Tranquil Garden|CHK +1 Untaidake, the Cloud Keeper|CHK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt index 550e7dc0af2..b8af9047680 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt @@ -5,5 +5,5 @@ Name:Rune-Tail, Kitsune Ascendant|Deck:Rune-Tail, Kitsune Ascendant.dck|Variant: Name:Eight-and-a-Half-Tails|Deck:Eight-and-a-Half-Tails.dck|Variant:Vanguard|Avatar:Eight-and-a-Half-Tails Avatar|Desc: Name:Celestial Kirin|Deck:Celestial Kirin.dck|Variant:Commander|Avatar:Celestial Kirin|Desc: Name:Takeno, Samurai General|Deck:Takeno, Samurai General.dck|Variant:Commander|Avatar:Takeno, Samurai General|Desc: -Name:EVENT8|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Spirits of the Plane|Deck:Spirits of the Plane.dck|Variant:Planechase|Avatar:Kami of the Honored Dead|Desc: Name:Random Planechase|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: From dc0784237b8baa926d1d219c13db8307e8c220eb Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 26 Nov 2018 10:56:02 +0300 Subject: [PATCH 300/901] - Start mapping out Minamo Academy. --- .../res/conquest/planes/Kamigawa/Minamo Academy/_events.txt | 2 +- forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt index 1ae5b504fa3..50db1ce89ed 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt @@ -6,4 +6,4 @@ Name:EVENT5|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT7|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT8|Deck:Random|Variant:None|Avatar:None|Desc: -Name:Random Planechase|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: +Name:Random Minamo Academy|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: diff --git a/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt index b8af9047680..4486db583a7 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt @@ -6,4 +6,4 @@ Name:Eight-and-a-Half-Tails|Deck:Eight-and-a-Half-Tails.dck|Variant:Vanguard|Ava Name:Celestial Kirin|Deck:Celestial Kirin.dck|Variant:Commander|Avatar:Celestial Kirin|Desc: Name:Takeno, Samurai General|Deck:Takeno, Samurai General.dck|Variant:Commander|Avatar:Takeno, Samurai General|Desc: Name:Spirits of the Plane|Deck:Spirits of the Plane.dck|Variant:Planechase|Avatar:Kami of the Honored Dead|Desc: -Name:Random Planechase|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: +Name:Random Towabara|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: From 4f92b9e9dd61172723ec600aada3efb5feeec266 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 26 Nov 2018 19:29:38 +0300 Subject: [PATCH 301/901] - Added an event to Minamo Academy. --- .../Minamo Academy/Higure, the Still Wind.dck | 32 +++++++++++++++++++ .../Kamigawa/Minamo Academy/_events.txt | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Higure, the Still Wind.dck diff --git a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Higure, the Still Wind.dck b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Higure, the Still Wind.dck new file mode 100644 index 00000000000..80fd71217e1 --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Higure, the Still Wind.dck @@ -0,0 +1,32 @@ +[metadata] +Name=Higure, the Still Wind +[Commander] +1 Higure, the Still Wind|BOK +[Main] +1 Ebony Owl Netsuke|SOK +1 Eternal Dominion|SOK +1 Eye of Nowhere|CHK +1 Floating-Dream Zubera|CHK +1 Genju of the Falls|BOK +1 Hinder|CHK +1 Honden of Seeing Winds|CHK +13 Island|CHK|1 +1 Jetting Glasskite|BOK +1 Kaijin of the Vanishing Touch|BOK +1 Kami of the Crescent Moon|SOK +1 Kira, Great Glass-Spinner|BOK +1 Kusari-Gama|CHK +1 Mikokoro, Center of the Sea|SOK +1 Minamo, School at Water's Edge|CHK +1 Mistblade Shinobi|BOK +1 Mystic Restraints|CHK +1 Ninja of the Deep Hours|BOK +1 Oboro, Palace in the Clouds|SOK +1 Reduce to Dreams|BOK +1 Ronin Warclub|BOK +1 Shimmering Glasskite|BOK +1 Soratami Mirror-Guard|CHK +1 Teardrop Kami|BOK +1 Thoughtbind|CHK +1 Threads of Disloyalty|BOK +1 Walker of Secret Ways|BOK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt index 50db1ce89ed..dee5891c37d 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt @@ -1,4 +1,4 @@ -Name:EVENT1|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Higure, the Still Wind|Deck:Higure, the Still Wind.dck|Variant:Commander|Avatar:Higure, the Still Wind|Desc: Name:EVENT2|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT3|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT4|Deck:Random|Variant:None|Avatar:None|Desc: From 4993043e88cb7745d644e95bf3f2371570c9baf0 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 26 Nov 2018 20:21:45 +0300 Subject: [PATCH 302/901] - Added 2 events to Minamo Academy. --- .../Minamo Academy/Azami, Lady of Scrolls.dck | 31 +++++++++++++++++ .../Minamo Academy/Ninjas of Kamigawa.dck | 33 +++++++++++++++++++ .../Kamigawa/Minamo Academy/_events.txt | 4 +-- 3 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Azami, Lady of Scrolls.dck create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Ninjas of Kamigawa.dck diff --git a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Azami, Lady of Scrolls.dck b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Azami, Lady of Scrolls.dck new file mode 100644 index 00000000000..d18da2a4b48 --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Azami, Lady of Scrolls.dck @@ -0,0 +1,31 @@ +[metadata] +Name=Azami, Lady of Scrolls +[Commander] +1 Azami, Lady of Scrolls|CHK +[Main] +1 Callow Jushi|BOK +1 Consuming Vortex|CHK +1 Cut the Earthly Bond|SOK +1 Dampen Thought|CHK +1 Eternal Dominion|SOK +1 Eye of Nowhere|CHK +1 Genju of the Falls|BOK +1 Graceful Adept|CHK +1 Hinder|CHK +1 Honden of Seeing Winds|CHK +14 Island|CHK +1 Meloku the Clouded Mirror|CHK +1 Mikokoro, Center of the Sea|SOK +1 Minamo Scrollkeeper|SOK +1 Minamo, School at Water's Edge|CHK +1 Phantom Wings|BOK +1 Reach Through Mists|CHK +1 Sift Through Sands|CHK +1 Soratami Mindsweeper|BOK +1 Soratami Mirror-Guard|CHK +1 Soratami Mirror-Mage|CHK +1 Soratami Savant|CHK +1 Student of Elements|CHK +1 The Unspeakable|CHK +1 Thoughtbind|CHK +1 Untaidake, the Cloud Keeper|CHK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Ninjas of Kamigawa.dck b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Ninjas of Kamigawa.dck new file mode 100644 index 00000000000..2da0f259fce --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Ninjas of Kamigawa.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Ninjas of Kamigawa +[Main] +1 Consuming Vortex|CHK +1 Field of Reality|CHK +1 Genju of the Falls|BOK +1 Genju of the Fens|BOK +1 Gifts Ungiven|CHK +1 Higure, the Still Wind|BOK +1 Ink-Eyes, Servant of Oni|BOK +9 Island|CHK +1 Kira, Great Glass-Spinner|BOK +1 Kusari-Gama|CHK +1 Lifted by Clouds|CHK +1 Mikokoro, Center of the Sea|SOK +1 Minamo, School at Water's Edge|CHK +1 Mistblade Shinobi|BOK +1 Mystic Restraints|CHK +1 Neko-Te|BOK +1 Ninja of the Deep Hours|BOK +1 No-Dachi|CHK +1 Okiba-Gang Shinobi|BOK +1 Phantom Wings|BOK +1 Shizo, Death's Storehouse|CHK +1 Shuriken|BOK +1 Skullsnatcher|BOK +1 Soratami Savant|CHK +1 Student of Elements|CHK +3 Swamp|CHK +1 Throat Slitter|BOK +1 Umezawa's Jitte|BOK +1 Walker of Secret Ways|BOK +1 Waterveil Cavern|CHK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt index dee5891c37d..6778c1d89f0 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt @@ -1,6 +1,6 @@ Name:Higure, the Still Wind|Deck:Higure, the Still Wind.dck|Variant:Commander|Avatar:Higure, the Still Wind|Desc: -Name:EVENT2|Deck:Random|Variant:None|Avatar:None|Desc: -Name:EVENT3|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Azami, Lady of Scrolls|Deck:Azami, Lady of Scrolls.dck|Variant:Commander|Avatar:Azami, Lady of Scrolls|Desc: +Name:Ninjas of Kamigawa|Deck:Ninjas of Kamigawa.dck|Variant:Planechase|Avatar:Ninjas of Kamigawa|Desc: Name:EVENT4|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT5|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: From 9502042d8c6b04e2c6a104a800c15455ebfe1f6c Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 26 Nov 2018 20:44:17 +0300 Subject: [PATCH 303/901] - Improve the AI use of Sokenzan, tweak the deck a little. --- forge-ai/src/main/java/forge/ai/ComputerUtil.java | 12 ++++++++++++ .../Kamigawa/Minamo Academy/Ninjas of Kamigawa.dck | 6 +++--- .../planes/Kamigawa/Minamo Academy/_events.txt | 2 +- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index 3ab921871c7..45e690b2288 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -1041,6 +1041,18 @@ public class ComputerUtil { } } // AntiBuffedBy + // Plane cards that give Haste (e.g. Sokenzan) + for (Card c : ai.getGame().getActivePlanes()) { + for (StaticAbility s : c.getStaticAbilities()) { + if (s.hasParam("AddKeyword") + && s.getParam("AddKeyword").contains("Haste") + && "Creature".equals(s.getParam("Affected")) + && card.isCreature()) { + return true; + } + } + } + final CardCollectionView vengevines = ai.getCardsIn(ZoneType.Graveyard, "Vengevine"); if (!vengevines.isEmpty()) { final CardCollectionView creatures = ai.getCardsIn(ZoneType.Hand); diff --git a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Ninjas of Kamigawa.dck b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Ninjas of Kamigawa.dck index 2da0f259fce..efe9f4f8261 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Ninjas of Kamigawa.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Ninjas of Kamigawa.dck @@ -8,7 +8,7 @@ Name=Ninjas of Kamigawa 1 Gifts Ungiven|CHK 1 Higure, the Still Wind|BOK 1 Ink-Eyes, Servant of Oni|BOK -9 Island|CHK +8 Island|CHK 1 Kira, Great Glass-Spinner|BOK 1 Kusari-Gama|CHK 1 Lifted by Clouds|CHK @@ -23,10 +23,10 @@ Name=Ninjas of Kamigawa 1 Phantom Wings|BOK 1 Shizo, Death's Storehouse|CHK 1 Shuriken|BOK +1 Silent-Blade Oni|PCA 1 Skullsnatcher|BOK -1 Soratami Savant|CHK 1 Student of Elements|CHK -3 Swamp|CHK +4 Swamp|CHK 1 Throat Slitter|BOK 1 Umezawa's Jitte|BOK 1 Walker of Secret Ways|BOK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt index 6778c1d89f0..2dba393d155 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt @@ -1,6 +1,6 @@ Name:Higure, the Still Wind|Deck:Higure, the Still Wind.dck|Variant:Commander|Avatar:Higure, the Still Wind|Desc: Name:Azami, Lady of Scrolls|Deck:Azami, Lady of Scrolls.dck|Variant:Commander|Avatar:Azami, Lady of Scrolls|Desc: -Name:Ninjas of Kamigawa|Deck:Ninjas of Kamigawa.dck|Variant:Planechase|Avatar:Ninjas of Kamigawa|Desc: +Name:Ninjas of Kamigawa|Deck:Ninjas of Kamigawa.dck|Variant:Planechase|Avatar:Silent-Blade Oni|Desc: Name:EVENT4|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT5|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: From 43074a5de142aa9207d18ed458b911a8f8b06160 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 26 Nov 2018 21:05:49 +0300 Subject: [PATCH 304/901] - Added a Minamo Academy event. - Improved the way the AI uses Sokenzan. --- .../src/main/java/forge/ai/ComputerUtil.java | 17 ++++++---- .../Minamo Academy/Keiga, the Tide Star.dck | 33 +++++++++++++++++++ .../Kamigawa/Minamo Academy/_events.txt | 2 +- 3 files changed, 44 insertions(+), 8 deletions(-) create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Keiga, the Tide Star.dck diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index 45e690b2288..51bf306bb19 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -28,6 +28,7 @@ import forge.card.mana.ManaCostShard; import forge.game.CardTraitPredicates; import forge.game.Game; import forge.game.GameObject; +import forge.game.GameType; import forge.game.ability.AbilityFactory; import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; @@ -1042,13 +1043,15 @@ public class ComputerUtil { } // AntiBuffedBy // Plane cards that give Haste (e.g. Sokenzan) - for (Card c : ai.getGame().getActivePlanes()) { - for (StaticAbility s : c.getStaticAbilities()) { - if (s.hasParam("AddKeyword") - && s.getParam("AddKeyword").contains("Haste") - && "Creature".equals(s.getParam("Affected")) - && card.isCreature()) { - return true; + if (ai.getGame().getRules().hasAppliedVariant(GameType.Planechase)) { + for (Card c : ai.getGame().getActivePlanes()) { + for (StaticAbility s : c.getStaticAbilities()) { + if (s.hasParam("AddKeyword") + && s.getParam("AddKeyword").contains("Haste") + && "Creature".equals(s.getParam("Affected")) + && card.isCreature()) { + return true; + } } } } diff --git a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Keiga, the Tide Star.dck b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Keiga, the Tide Star.dck new file mode 100644 index 00000000000..c0c71c7be40 --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Keiga, the Tide Star.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Keiga, the Tide Star +[Commander] +1 Keiga, the Tide Star|CHK +[Main] +1 Baku Altar|BOK +1 Cloudhoof Kirin|SOK +1 Dreamcatcher|SOK +1 Floating-Dream Zubera|CHK +1 Genju of the Falls|BOK +1 Guardian of Solitude|CHK +13 Island|CHK +1 Jade Idol|CHK +1 Jetting Glasskite|BOK +1 Kaijin of the Vanishing Touch|BOK +1 Konda's Banner|CHK +1 Long-Forgotten Gohei|CHK +1 Mikokoro, Center of the Sea|SOK +1 Minamo, School at Water's Edge|CHK +1 Murmurs from Beyond|SOK +1 Oboro, Palace in the Clouds|SOK +1 Ribbons of the Reikai|BOK +1 River Kaijin|CHK +1 Rushing-Tide Zubera|SOK +1 Secretkeeper|SOK +1 Shape Stealer|SOK +1 Shimmering Glasskite|BOK +1 Shinen of Flight's Wings|SOK +1 Sire of the Storm|CHK +1 Tatsumasa, the Dragon's Fang|CHK +1 Teller of Tales|CHK +1 The Unspeakable|CHK +1 Untaidake, the Cloud Keeper|CHK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt index 2dba393d155..cd7bf69f1da 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt @@ -1,7 +1,7 @@ Name:Higure, the Still Wind|Deck:Higure, the Still Wind.dck|Variant:Commander|Avatar:Higure, the Still Wind|Desc: Name:Azami, Lady of Scrolls|Deck:Azami, Lady of Scrolls.dck|Variant:Commander|Avatar:Azami, Lady of Scrolls|Desc: Name:Ninjas of Kamigawa|Deck:Ninjas of Kamigawa.dck|Variant:Planechase|Avatar:Silent-Blade Oni|Desc: -Name:EVENT4|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Keiga, the Tide Star|Deck:Keiga, the Tide Star.dck|Variant:Commander|Avatar:Keiga, the Tide Star|Desc: Name:EVENT5|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT7|Deck:Random|Variant:None|Avatar:None|Desc: From 22f82a7204fe245a87703995bb30a64cb5cf59f8 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 27 Nov 2018 14:08:11 +0300 Subject: [PATCH 305/901] - Added an event to Minamo Academy. --- forge-gui/res/cardsfolder/k/kiri_onna.txt | 1 + .../Minamo Academy/Cloudhoof Kirin.dck | 33 +++++++++++++++++++ .../Kamigawa/Minamo Academy/_events.txt | 2 +- 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Cloudhoof Kirin.dck diff --git a/forge-gui/res/cardsfolder/k/kiri_onna.txt b/forge-gui/res/cardsfolder/k/kiri_onna.txt index e0d4217a98c..2a3e98c0cb2 100644 --- a/forge-gui/res/cardsfolder/k/kiri_onna.txt +++ b/forge-gui/res/cardsfolder/k/kiri_onna.txt @@ -7,5 +7,6 @@ T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | Trig SVar:TrigReturnOther:DB$ ChangeZone | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand SVar:TrigReturnThis:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Hand AI:RemoveDeck:Random +SVar:NeedsToPlay:Creature.OppCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/kiri_onna.jpg Oracle:When Kiri-Onna enters the battlefield, return target creature to its owner's hand.\nWhenever you cast a Spirit or Arcane spell, you may return Kiri-Onna to its owner's hand. diff --git a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Cloudhoof Kirin.dck b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Cloudhoof Kirin.dck new file mode 100644 index 00000000000..1d845d91700 --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Cloudhoof Kirin.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Cloudhoof Kirin +[Commander] +1 Cloudhoof Kirin|SOK +[Main] +1 Baku Altar|BOK +1 Consuming Vortex|CHK +1 Cut the Earthly Bond|SOK +1 Dampen Thought|CHK +1 Erayo, Soratami Ascendant|SOK +1 Eye of Nowhere|CHK +1 Genju of the Falls|BOK +2 Guardian of Solitude|CHK +1 Hair-Strung Koto|CHK +1 Hinder|CHK +1 Hisoka's Defiance|CHK +14 Island|CHK|1 +1 Jetting Glasskite|BOK +1 Kami of the Crescent Moon|SOK +1 Kira, Great Glass-Spinner|BOK +1 Lifted by Clouds|CHK +1 Mikokoro, Center of the Sea|SOK +1 Oboro Breezecaller|SOK +1 Oboro, Palace in the Clouds|SOK +1 Orb of Dreams|BOK +1 Sensei's Divining Top|CHK +1 Shimmering Glasskite|BOK +1 Soratami Mindsweeper|BOK +1 Soratami Savant|CHK +1 Thoughtbind|CHK +1 Threads of Disloyalty|BOK +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt index cd7bf69f1da..6f783e4ce58 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt @@ -2,7 +2,7 @@ Name:Higure, the Still Wind|Deck:Higure, the Still Wind.dck|Variant:Commander|Av Name:Azami, Lady of Scrolls|Deck:Azami, Lady of Scrolls.dck|Variant:Commander|Avatar:Azami, Lady of Scrolls|Desc: Name:Ninjas of Kamigawa|Deck:Ninjas of Kamigawa.dck|Variant:Planechase|Avatar:Silent-Blade Oni|Desc: Name:Keiga, the Tide Star|Deck:Keiga, the Tide Star.dck|Variant:Commander|Avatar:Keiga, the Tide Star|Desc: -Name:EVENT5|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Cloudhoof Kirin|Deck:Cloudhoof Kirin.dck|Variant:Commander|Avatar:Cloudhoof Kirin|Desc: Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT7|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT8|Deck:Random|Variant:None|Avatar:None|Desc: From 7086d86de893b9b6788d754d33874f0b54d81a95 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 27 Nov 2018 15:20:50 +0300 Subject: [PATCH 306/901] - Added an event to Minamo Academy. --- .../Meloku the Clouded Mirror.dck | 34 +++++++++++++++++++ .../Kamigawa/Minamo Academy/_events.txt | 2 +- 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Meloku the Clouded Mirror.dck diff --git a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Meloku the Clouded Mirror.dck b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Meloku the Clouded Mirror.dck new file mode 100644 index 00000000000..d0342827442 --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Meloku the Clouded Mirror.dck @@ -0,0 +1,34 @@ +[metadata] +Name=Meloku the Clouded Mirror +[Commander] +1 Meloku the Clouded Mirror|CHK +[Main] +1 Cloudhoof Kirin|SOK +1 Counsel of the Soratami|CHK +1 Dreamcatcher|SOK +1 Floating-Dream Zubera|CHK +1 Genju of the Falls|BOK +1 Honden of Seeing Winds|CHK +13 Island|CHK|1 +1 Ivory Crane Netsuke|SOK +1 Kami of the Crescent Moon|SOK +1 Keiga, the Tide Star|CHK +1 Kira, Great Glass-Spinner|BOK +1 Mikokoro, Center of the Sea|SOK +1 Minamo, School at Water's Edge|CHK +1 Oboro Envoy|SOK +1 Patron of the Moon|BOK +1 Peer Through Depths|CHK +1 Reach Through Mists|CHK +1 Ribbons of the Reikai|BOK +1 Rushing-Tide Zubera|SOK +1 Secretkeeper|SOK +1 Sift Through Sands|CHK +1 Soramaro, First to Dream|SOK +1 Soratami Rainshaper|CHK +1 Soratami Savant|CHK +1 Teller of Tales|CHK +1 The Unspeakable|CHK +1 Untaidake, the Cloud Keeper|CHK +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt index 6f783e4ce58..2b55816ed8f 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt @@ -3,7 +3,7 @@ Name:Azami, Lady of Scrolls|Deck:Azami, Lady of Scrolls.dck|Variant:Commander|Av Name:Ninjas of Kamigawa|Deck:Ninjas of Kamigawa.dck|Variant:Planechase|Avatar:Silent-Blade Oni|Desc: Name:Keiga, the Tide Star|Deck:Keiga, the Tide Star.dck|Variant:Commander|Avatar:Keiga, the Tide Star|Desc: Name:Cloudhoof Kirin|Deck:Cloudhoof Kirin.dck|Variant:Commander|Avatar:Cloudhoof Kirin|Desc: -Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Meloku the Clouded Mirror|Deck:Meloku the Clouded Mirror.dck|Variant:Commander|Avatar:Meloku the Clouded Mirror|Desc: Name:EVENT7|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT8|Deck:Random|Variant:None|Avatar:None|Desc: Name:Random Minamo Academy|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: From cf6d58d1e279353a26fc406254c16cb9c0b0bd15 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 27 Nov 2018 20:17:49 +0300 Subject: [PATCH 307/901] - Finished Minamo Academy events. --- .../cardsfolder/c/chisei_heart_of_oceans.txt | 1 + ...rochi_eggwatcher_shidako_broodmistress.txt | 1 + .../Chisei, Heart of Oceans.dck | 33 +++++++++++++++++ .../Minamo Academy/Cloudhoof Kirin.dck | 7 ++-- .../Minamo Academy/Higure, the Still Wind.dck | 2 +- .../Meloku the Clouded Mirror.dck | 6 ++-- .../Minamo Academy/Oni of Wild Places.dck | 35 +++++++++++++++++++ .../Kamigawa/Minamo Academy/_events.txt | 4 +-- 8 files changed, 78 insertions(+), 11 deletions(-) create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Chisei, Heart of Oceans.dck create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Oni of Wild Places.dck diff --git a/forge-gui/res/cardsfolder/c/chisei_heart_of_oceans.txt b/forge-gui/res/cardsfolder/c/chisei_heart_of_oceans.txt index b8d36dcb10d..3abbb3ec535 100644 --- a/forge-gui/res/cardsfolder/c/chisei_heart_of_oceans.txt +++ b/forge-gui/res/cardsfolder/c/chisei_heart_of_oceans.txt @@ -6,5 +6,6 @@ K:Flying T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ At the beginning of your upkeep, sacrifice CARDNAME unless you remove a counter from a permanent you control. SVar:TrigSac:DB$ Sacrifice | Defined$ Self | UnlessPayer$ You | UnlessCost$ RemoveAnyCounter<1/Permanent.YouCtrl/a permanent you control> DeckNeeds:Ability$Counters +SVar:NeedsToPlay:Creature.YouCtrl+HasCounters SVar:Picture:http://www.wizards.com/global/images/magic/general/chisei_heart_of_oceans.jpg Oracle:Flying\nAt the beginning of your upkeep, sacrifice Chisei, Heart of Oceans unless you remove a counter from a permanent you control. diff --git a/forge-gui/res/cardsfolder/o/orochi_eggwatcher_shidako_broodmistress.txt b/forge-gui/res/cardsfolder/o/orochi_eggwatcher_shidako_broodmistress.txt index cc4c1253e7f..422ca6be5b8 100644 --- a/forge-gui/res/cardsfolder/o/orochi_eggwatcher_shidako_broodmistress.txt +++ b/forge-gui/res/cardsfolder/o/orochi_eggwatcher_shidako_broodmistress.txt @@ -17,5 +17,6 @@ Colors:green Types:Legendary Creature Snake Shaman PT:3/3 A:AB$ Pump | Cost$ G Sac<1/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ 3 | NumDef$ 3 | SpellDescription$ Target creature gets +3/+3 until end of turn. +SVar:AIPreference:SacCost$Creature.token,Creature.cmcLE2 SVar:Picture:http://www.wizards.com/global/images/magic/general/shidako_broodmistress.jpg Oracle:{G}, Sacrifice a creature: Target creature gets +3/+3 until end of turn. diff --git a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Chisei, Heart of Oceans.dck b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Chisei, Heart of Oceans.dck new file mode 100644 index 00000000000..913192e0382 --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Chisei, Heart of Oceans.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Chisei, Heart of Oceans +[Commander] +1 Chisei, Heart of Oceans|BOK +[Main] +1 Baku Altar|BOK +1 Callow Jushi|BOK +1 Cloudhoof Kirin|SOK +1 Counsel of the Soratami|CHK +1 Dreamcatcher|SOK +1 Floating-Dream Zubera|CHK +1 Gifts Ungiven|CHK +1 Guardian of Solitude|CHK +1 Hinder|CHK +14 Island|CHK +1 Jade Idol|CHK +1 Kaijin of the Vanishing Touch|BOK +1 Kami of the Crescent Moon|SOK +1 Lifted by Clouds|CHK +1 Long-Forgotten Gohei|CHK +1 Minamo, School at Water's Edge|CHK +1 Murmurs from Beyond|SOK +1 Oboro, Palace in the Clouds|SOK +1 Quillmane Baku|BOK +1 Ribbons of the Reikai|BOK +1 Rushing-Tide Zubera|SOK +1 Secretkeeper|SOK +1 Sire of the Storm|CHK +1 Teller of Tales|CHK +1 Thoughtbind|CHK +1 Umezawa's Jitte|BOK +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Cloudhoof Kirin.dck b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Cloudhoof Kirin.dck index 1d845d91700..d3f2022b82e 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Cloudhoof Kirin.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Cloudhoof Kirin.dck @@ -4,17 +4,18 @@ Name=Cloudhoof Kirin 1 Cloudhoof Kirin|SOK [Main] 1 Baku Altar|BOK +1 Callow Jushi|BOK 1 Consuming Vortex|CHK 1 Cut the Earthly Bond|SOK 1 Dampen Thought|CHK 1 Erayo, Soratami Ascendant|SOK 1 Eye of Nowhere|CHK 1 Genju of the Falls|BOK -2 Guardian of Solitude|CHK +1 Guardian of Solitude|CHK 1 Hair-Strung Koto|CHK 1 Hinder|CHK 1 Hisoka's Defiance|CHK -14 Island|CHK|1 +14 Island|CHK 1 Jetting Glasskite|BOK 1 Kami of the Crescent Moon|SOK 1 Kira, Great Glass-Spinner|BOK @@ -29,5 +30,3 @@ Name=Cloudhoof Kirin 1 Soratami Savant|CHK 1 Thoughtbind|CHK 1 Threads of Disloyalty|BOK -[Sideboard] - diff --git a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Higure, the Still Wind.dck b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Higure, the Still Wind.dck index 80fd71217e1..3017d411cf7 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Higure, the Still Wind.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Higure, the Still Wind.dck @@ -10,7 +10,7 @@ Name=Higure, the Still Wind 1 Genju of the Falls|BOK 1 Hinder|CHK 1 Honden of Seeing Winds|CHK -13 Island|CHK|1 +13 Island|CHK 1 Jetting Glasskite|BOK 1 Kaijin of the Vanishing Touch|BOK 1 Kami of the Crescent Moon|SOK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Meloku the Clouded Mirror.dck b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Meloku the Clouded Mirror.dck index d0342827442..96a2a6dd921 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Meloku the Clouded Mirror.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Meloku the Clouded Mirror.dck @@ -8,8 +8,9 @@ Name=Meloku the Clouded Mirror 1 Dreamcatcher|SOK 1 Floating-Dream Zubera|CHK 1 Genju of the Falls|BOK +1 Graceful Adept|CHK 1 Honden of Seeing Winds|CHK -13 Island|CHK|1 +13 Island|CHK 1 Ivory Crane Netsuke|SOK 1 Kami of the Crescent Moon|SOK 1 Keiga, the Tide Star|CHK @@ -28,7 +29,4 @@ Name=Meloku the Clouded Mirror 1 Soratami Rainshaper|CHK 1 Soratami Savant|CHK 1 Teller of Tales|CHK -1 The Unspeakable|CHK 1 Untaidake, the Cloud Keeper|CHK -[Sideboard] - diff --git a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Oni of Wild Places.dck b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Oni of Wild Places.dck new file mode 100644 index 00000000000..ecb1c98fa88 --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Oni of Wild Places.dck @@ -0,0 +1,35 @@ +[metadata] +Name=Oni of Wild Places +[Avatar] +1 Oni of Wild Places Avatar|VAN +[Main] +1 Baku Altar|BOK +1 Briarknit Kami|SOK +1 Counsel of the Soratami|CHK +1 Dreamcatcher|SOK +1 Dripping-Tongue Zubera|CHK +1 Floating-Dream Zubera|CHK +7 Forest|CHK +1 Genju of the Cedars|BOK +1 Genju of the Falls|BOK +1 Gnarled Mass|BOK +1 Guardian of Solitude|CHK +1 Honden of Life's Web|CHK +6 Island|CHK +1 Jade Idol|CHK +1 Kami of the Crescent Moon|SOK +1 Long-Forgotten Gohei|CHK +1 Meloku the Clouded Mirror|CHK +1 Mikokoro, Center of the Sea|SOK +1 Minamo, School at Water's Edge|CHK +1 Oboro, Palace in the Clouds|SOK +1 Okina, Temple to the Grandfathers|CHK +1 Orochi Eggwatcher|CHK +1 Orochi Hatchery|CHK +1 Rushing-Tide Zubera|SOK +1 Seed the Land|SOK +1 Sosuke's Summons|BOK +1 Tatsumasa, the Dragon's Fang|CHK +1 Unchecked Growth|BOK +1 Wandering Ones|CHK +[Sideboard] diff --git a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt index 2b55816ed8f..2b0568baea9 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/_events.txt @@ -4,6 +4,6 @@ Name:Ninjas of Kamigawa|Deck:Ninjas of Kamigawa.dck|Variant:Planechase|Avatar:Si Name:Keiga, the Tide Star|Deck:Keiga, the Tide Star.dck|Variant:Commander|Avatar:Keiga, the Tide Star|Desc: Name:Cloudhoof Kirin|Deck:Cloudhoof Kirin.dck|Variant:Commander|Avatar:Cloudhoof Kirin|Desc: Name:Meloku the Clouded Mirror|Deck:Meloku the Clouded Mirror.dck|Variant:Commander|Avatar:Meloku the Clouded Mirror|Desc: -Name:EVENT7|Deck:Random|Variant:None|Avatar:None|Desc: -Name:EVENT8|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Chisei, Heart of Oceans|Deck:Chisei, Heart of Oceans.dck|Variant:Commander|Avatar:Chisei, Heart of Oceans|Desc: +Name:Oni of Wild Places|Deck:Oni of Wild Places.dck|Variant:Vanguard|Avatar:Oni of Wild Places Avatar|Desc: Name:Random Minamo Academy|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: From c02f529c90cadb87c1eb7ada880749c5be0b5142 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 28 Nov 2018 09:12:14 +0300 Subject: [PATCH 308/901] - Added 3 events to Takenuma. --- .../res/cardsfolder/h/he_who_hungers.txt | 1 + forge-gui/res/cardsfolder/m/marrow_gnawer.txt | 1 + .../res/cardsfolder/n/nezumi_bone_reader.txt | 2 +- .../Kamigawa/Takenuma/Infernal Kirin.dck | 30 +++++++++++++++++ .../Kamigawa/Takenuma/Kuro, Pitlord.dck | 33 +++++++++++++++++++ .../Kamigawa/Takenuma/Marrow-Gnawer.dck | 33 +++++++++++++++++++ .../planes/Kamigawa/Takenuma/_events.txt | 6 ++-- 7 files changed, 102 insertions(+), 4 deletions(-) create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Takenuma/Infernal Kirin.dck create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Takenuma/Kuro, Pitlord.dck create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Takenuma/Marrow-Gnawer.dck diff --git a/forge-gui/res/cardsfolder/h/he_who_hungers.txt b/forge-gui/res/cardsfolder/h/he_who_hungers.txt index 4f91ab07f96..26ee77c5f06 100644 --- a/forge-gui/res/cardsfolder/h/he_who_hungers.txt +++ b/forge-gui/res/cardsfolder/h/he_who_hungers.txt @@ -5,6 +5,7 @@ PT:3/2 K:Flying A:AB$ Discard | Cost$ 1 Sac<1/Spirit> | ValidTgts$ Opponent | SorcerySpeed$ True | NumCards$ 1 | Mode$ RevealYouChoose | SpellDescription$ Target opponent reveals their hand. You choose a card from it. That player discards that card. Activate this ability only any time you could cast a sorcery. K:Soulshift:4 +SVar:AIPreference:SacCost$Creature.Spirit+token,Creature.Spirit+cmcLE2 AI:RemoveDeck:Random DeckHints:Type$Spirit SVar:Picture:http://www.wizards.com/global/images/magic/general/he_who_hungers.jpg diff --git a/forge-gui/res/cardsfolder/m/marrow_gnawer.txt b/forge-gui/res/cardsfolder/m/marrow_gnawer.txt index 15642f90171..98ce0c6d3b9 100644 --- a/forge-gui/res/cardsfolder/m/marrow_gnawer.txt +++ b/forge-gui/res/cardsfolder/m/marrow_gnawer.txt @@ -5,6 +5,7 @@ PT:2/3 S:Mode$ Continuous | Affected$ Creature.Rat | AddKeyword$ Fear | Description$ Rat creatures have fear. (They can't be blocked except by artifact creatures and/or black creatures.) A:AB$ Token | Cost$ T Sac<1/Rat> | TokenAmount$ X | References$ X | TokenName$ Rat | TokenTypes$ Creature,Rat | TokenOwner$ You | TokenColors$ Black | TokenPower$ 1 | TokenToughness$ 1 | TokenImage$ b 1 1 rat CHK | SpellDescription$ Create X 1/1 black Rat creature tokens, where X is the number of Rats you control. SVar:X:Count$TypeYouCtrl.Rat +SVar:AIPreference:SacCost$Creature.Rat+token,Creature.Rat+cmcLE3 AI:RemoveDeck:Random DeckHints:Type$Rat SVar:Picture:http://www.wizards.com/global/images/magic/general/marrow_gnawer.jpg diff --git a/forge-gui/res/cardsfolder/n/nezumi_bone_reader.txt b/forge-gui/res/cardsfolder/n/nezumi_bone_reader.txt index 2e07b247e2b..06c6f400b13 100644 --- a/forge-gui/res/cardsfolder/n/nezumi_bone_reader.txt +++ b/forge-gui/res/cardsfolder/n/nezumi_bone_reader.txt @@ -3,6 +3,6 @@ ManaCost:1 B Types:Creature Rat Shaman PT:1/1 A:AB$ Discard | Cost$ B Sac<1/Creature> | ValidTgts$ Player | SorcerySpeed$ True | NumCards$ 1 | Mode$ TgtChoose | SpellDescription$ Target player discards a card. Activate this ability only any time you could cast a sorcery. -AI:RemoveDeck:All +SVar:AIPreference:SacCost$Creature.token,Creature.cmcLE1 SVar:Picture:http://www.wizards.com/global/images/magic/general/nezumi_bone_reader.jpg Oracle:{B}, Sacrifice a creature: Target player discards a card. Activate this ability only any time you could cast a sorcery. diff --git a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Infernal Kirin.dck b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Infernal Kirin.dck new file mode 100644 index 00000000000..62b300db1d7 --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Infernal Kirin.dck @@ -0,0 +1,30 @@ +[metadata] +Name=Infernal Kirin +[Commander] +1 Infernal Kirin|SOK +[Main] +1 Ashen-Skin Zubera|CHK +1 Death Denied|SOK +1 Death of a Thousand Stings|SOK +1 Distress|CHK +1 Exile into Darkness|SOK +1 Genju of the Fens|BOK +1 Ghost-Lit Stalker|SOK +1 Gnat Miser|SOK +1 He Who Hungers|CHK +1 Honden of Night's Reach|CHK +1 Ink-Eyes, Servant of Oni|BOK +1 Kemuri-Onna|SOK +1 Kuon, Ogre Ascendant|SOK +1 Kusari-Gama|CHK +1 Kyoki, Sanity's Eclipse|BOK +1 Locust Miser|SOK +1 Nezumi Shortfang|CHK +1 Ogre Marauder|BOK +1 Okiba-Gang Shinobi|BOK +1 Psychic Spear|BOK +1 Shizo, Death's Storehouse|CHK +1 Struggle for Sanity|CHK +15 Swamp|CHK +1 Three Tragedies|BOK +1 Waking Nightmare|CHK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Kuro, Pitlord.dck b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Kuro, Pitlord.dck new file mode 100644 index 00000000000..8ff18a7492e --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Kuro, Pitlord.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Kuro, Pitlord +[Commander] +1 Kuro, Pitlord|CHK +[Main] +1 Ashen-Skin Zubera|CHK +1 Blood Speaker|CHK +1 Bloodthirsty Ogre|CHK +1 Ghost-Lit Stalker|SOK +1 Gnat Miser|SOK +1 Gutwrencher Oni|CHK +1 Hand of Cruelty|SOK +1 Honden of Night's Reach|CHK +1 Konda's Banner|CHK +1 Kyoki, Sanity's Eclipse|BOK +1 Mark of the Oni|BOK +1 Midnight Covenant|CHK +1 Mikokoro, Center of the Sea|SOK +1 Nezumi Shadow-Watcher|BOK +1 O-Naginata|SOK +1 Painwracker Oni|CHK +1 Raving Oni-Slave|SOK +1 Seizan, Perverter of Truth|CHK +1 Shizo, Death's Storehouse|CHK +1 Stir the Grave|BOK +14 Swamp|CHK +1 Takenuma Bleeder|BOK +1 Umezawa's Jitte|BOK +1 Untaidake, the Cloud Keeper|CHK +1 Villainous Ogre|CHK +1 Yukora, the Prisoner|BOK +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Marrow-Gnawer.dck b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Marrow-Gnawer.dck new file mode 100644 index 00000000000..093da594b65 --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Marrow-Gnawer.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Marrow-Gnawer +[Commander] +1 Marrow-Gnawer|CHK +[Main] +1 Befoul|CHK +1 Death Denied|SOK +1 Deathmask Nezumi|SOK +1 Genju of the Fens|BOK +1 Gnat Miser|SOK +1 Horobi's Whisper|BOK +1 Ink-Eyes, Servant of Oni|BOK +1 Kuro's Taken|SOK +1 Locust Miser|SOK +1 Mikokoro, Center of the Sea|SOK +1 Neko-Te|BOK +1 Nezumi Bone-Reader|CHK +1 Nezumi Cutthroat|CHK +1 Nezumi Graverobber|CHK +1 Nezumi Ronin|CHK +1 Nezumi Shadow-Watcher|BOK +1 Nezumi Shortfang|CHK +1 O-Naginata|SOK +1 Okiba-Gang Shinobi|BOK +1 Patron of the Nezumi|BOK +1 Rend Flesh|CHK +1 Shizo, Death's Storehouse|CHK +1 Skullsnatcher|BOK +1 Stir the Grave|BOK +14 Swamp|CHK +1 Throat Slitter|BOK +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/_events.txt index 1ae5b504fa3..ee1dd3c20d7 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/_events.txt @@ -1,6 +1,6 @@ -Name:EVENT1|Deck:Random|Variant:None|Avatar:None|Desc: -Name:EVENT2|Deck:Random|Variant:None|Avatar:None|Desc: -Name:EVENT3|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Infernal Kirin|Deck:Infernal Kirin.dck|Variant:Commander|Avatar:Infernal Kirin|Desc: +Name:Marrow-Gnawer|Deck:Marrow-Gnawer.dck|Variant:Commander|Avatar:Marrow-Gnawer|Desc: +Name:Kuro, Pitlord|Deck:Kuro, Pitlord.dck|Variant:Commander|Avatar:Kuro, Pitlord|Desc: Name:EVENT4|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT5|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: From 2868d11539036be5cccb463a2192cd632122bb0e Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 28 Nov 2018 09:36:37 +0300 Subject: [PATCH 309/901] - Added a Takenuma event. --- .../Takenuma/Maga, Traitor to Mortals.dck | 34 +++++++++++++++++++ .../planes/Kamigawa/Takenuma/_events.txt | 2 +- 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Takenuma/Maga, Traitor to Mortals.dck diff --git a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Maga, Traitor to Mortals.dck b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Maga, Traitor to Mortals.dck new file mode 100644 index 00000000000..156267af94f --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Maga, Traitor to Mortals.dck @@ -0,0 +1,34 @@ +[metadata] +Name=Maga, Traitor to Mortals +[Commander] +1 Maga, Traitor to Mortals|SOK +[Main] +1 Befoul|CHK +1 Bile Urchin|BOK +1 Exile into Darkness|SOK +1 General's Kabuto|CHK +1 Gibbering Kami|CHK +1 Hero's Demise|BOK +1 Hired Muscle|BOK +1 Honden of Night's Reach|CHK +1 Horobi's Whisper|BOK +1 Ink-Eyes, Servant of Oni|BOK +1 Kami of the Waning Moon|CHK +1 Kokusho, the Evening Star|CHK +1 Mikokoro, Center of the Sea|SOK +1 Neko-Te|BOK +1 Nezumi Shadow-Watcher|BOK +1 Okiba-Gang Shinobi|BOK +1 Ragged Veins|CHK +1 Seizan, Perverter of Truth|CHK +1 Shizo, Death's Storehouse|CHK +1 Shuriken|BOK +1 Skullsnatcher|BOK +1 Swallowing Plague|CHK +13 Swamp|CHK|4 +1 Thief of Hope|CHK +1 Throat Slitter|BOK +1 Untaidake, the Cloud Keeper|CHK +1 Wicked Akuba|CHK +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/_events.txt index ee1dd3c20d7..9c3674b4015 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/_events.txt @@ -1,7 +1,7 @@ Name:Infernal Kirin|Deck:Infernal Kirin.dck|Variant:Commander|Avatar:Infernal Kirin|Desc: Name:Marrow-Gnawer|Deck:Marrow-Gnawer.dck|Variant:Commander|Avatar:Marrow-Gnawer|Desc: Name:Kuro, Pitlord|Deck:Kuro, Pitlord.dck|Variant:Commander|Avatar:Kuro, Pitlord|Desc: -Name:EVENT4|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Maga, Traitor to Mortals|Deck:Maga, Traitor to Mortals.dck|Variant:Commander|Avatar:Maga, Traitor to Mortals|Desc: Name:EVENT5|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT7|Deck:Random|Variant:None|Avatar:None|Desc: From f5e9ab5fd8d0ffac6f1d8de938c471991a960ed5 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 28 Nov 2018 10:36:44 +0300 Subject: [PATCH 310/901] - Added 2 events to Takenuma. --- .../res/cardsfolder/d/devouring_greed.txt | 1 + .../conquest/planes/Kamigawa/Takenuma/Gix.dck | 33 +++++++++++++++++ .../Takenuma/Lantern-Lit Graveyard.dck | 36 +++++++++++++++++++ .../planes/Kamigawa/Takenuma/_events.txt | 4 +-- 4 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Takenuma/Gix.dck create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Takenuma/Lantern-Lit Graveyard.dck diff --git a/forge-gui/res/cardsfolder/d/devouring_greed.txt b/forge-gui/res/cardsfolder/d/devouring_greed.txt index 9db08ba1d84..0a960cec4c1 100644 --- a/forge-gui/res/cardsfolder/d/devouring_greed.txt +++ b/forge-gui/res/cardsfolder/d/devouring_greed.txt @@ -7,6 +7,7 @@ SVar:X:XChoice SVar:A:Sacrificed$Amount SVar:B:SVar$A/Times.2 SVar:C:SVar$B/Plus.2 +SVar:AIPreference:SacCost$Creature.Spirit+token,Creature.Spirit+cmcLE2 AI:RemoveDeck:All AI:RemoveDeck:Random DeckHints:Type$Spirit diff --git a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Gix.dck b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Gix.dck new file mode 100644 index 00000000000..b00b912fe40 --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Gix.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Gix +[Avatar] +1 Gix|VAN +[Main] +1 Ashen-Skin Zubera|CHK +1 Death Denied|SOK +1 Distress|CHK +1 Eiganjo Castle|CHK +1 Genju of the Fens|BOK +1 Genju of the Fields|BOK +1 Ghost-Lit Redeemer|SOK +1 Honden of Cleansing Fire|CHK +1 Honden of Night's Reach|CHK +1 Infernal Kirin|SOK +1 Ink-Eyes, Servant of Oni|BOK +1 Kokusho, the Evening Star|CHK +1 Okiba-Gang Shinobi|BOK +1 Patron of the Kitsune|BOK +3 Plains|CHK|1 +1 Shirei, Shizo's Caretaker|BOK +1 Shizo, Death's Storehouse|CHK +1 Silent-Chant Zubera|CHK +1 Soulless Revival|CHK +1 Stir the Grave|BOK +1 Swallowing Plague|CHK +10 Swamp|CHK|1 +2 Thief of Hope|CHK +1 Three Tragedies|BOK +1 Toshiro Umezawa|BOK +1 Umezawa's Jitte|BOK +1 Untaidake, the Cloud Keeper|CHK +1 Waking Nightmare|CHK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Lantern-Lit Graveyard.dck b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Lantern-Lit Graveyard.dck new file mode 100644 index 00000000000..ead07085b1d --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Lantern-Lit Graveyard.dck @@ -0,0 +1,36 @@ +[metadata] +Name=Lantern-Lit Graveyard +[Main] +1 Adamaro, First to Desire|SOK +1 Ashen-Skin Zubera|CHK +1 Baku Altar|BOK +1 Blademane Baku|BOK +1 Cunning Bandit|BOK +1 Ember-Fist Zubera|CHK +1 Forbidden Orchard|CHK +1 Frostling|BOK +1 Genju of the Fens|BOK +1 Genju of the Spires|BOK +1 Gibbering Kami|CHK +1 Hired Muscle|BOK +1 Ishi-Ishi, Akki Crackshot|BOK +1 Jade Idol|CHK +1 Kami of Empty Graves|SOK +1 Kami of Fire's Roar|CHK +1 Kokusho, the Evening Star|CHK +1 Lantern-Lit Graveyard|CHK +1 Long-Forgotten Gohei|CHK +1 Mikokoro, Center of the Sea|SOK +5 Mountain|CHK +1 Path of Anger's Flame|SOK +1 Seizan, Perverter of Truth|CHK +1 Shinka, the Bloodsoaked Keep|CHK +1 Shizo, Death's Storehouse|CHK +1 Skullmane Baku|BOK +1 Skyfire Kirin|SOK +5 Swamp|CHK +1 Tatsumasa, the Dragon's Fang|CHK +1 Thief of Hope|CHK +1 Unnatural Speed|CHK +1 Untaidake, the Cloud Keeper|CHK +[Sideboard] diff --git a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/_events.txt index 9c3674b4015..b49d5f83cae 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/_events.txt @@ -2,8 +2,8 @@ Name:Infernal Kirin|Deck:Infernal Kirin.dck|Variant:Commander|Avatar:Infernal Ki Name:Marrow-Gnawer|Deck:Marrow-Gnawer.dck|Variant:Commander|Avatar:Marrow-Gnawer|Desc: Name:Kuro, Pitlord|Deck:Kuro, Pitlord.dck|Variant:Commander|Avatar:Kuro, Pitlord|Desc: Name:Maga, Traitor to Mortals|Deck:Maga, Traitor to Mortals.dck|Variant:Commander|Avatar:Maga, Traitor to Mortals|Desc: -Name:EVENT5|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Lantern-Lit Graveyard|Deck:Lantern-Lit Graveyard.dck|Variant:Planechase|Avatar:Lantern-Lit Graveyard|Desc: Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT7|Deck:Random|Variant:None|Avatar:None|Desc: -Name:EVENT8|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Gix|Deck:Gix.dck|Variant:Vanguard|Avatar:Gix|Desc: Name:Random Planechase|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: From 5595267588b8918376de4a5015d0e3f1dc7f4902 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 28 Nov 2018 11:30:02 +0300 Subject: [PATCH 311/901] - Finished Takenuma. --- .../Takenuma/Lantern-Lit Graveyard.dck | 3 +- .../Kamigawa/Takenuma/Toshiro Umezawa.dck | 33 ++++++++++++++++++ .../Takenuma/Yukora, the Prisoner.dck | 34 +++++++++++++++++++ .../planes/Kamigawa/Takenuma/_events.txt | 4 +-- 4 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Takenuma/Toshiro Umezawa.dck create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Takenuma/Yukora, the Prisoner.dck diff --git a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Lantern-Lit Graveyard.dck b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Lantern-Lit Graveyard.dck index ead07085b1d..17fb4866c5f 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Lantern-Lit Graveyard.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Lantern-Lit Graveyard.dck @@ -14,7 +14,6 @@ Name=Lantern-Lit Graveyard 1 Gibbering Kami|CHK 1 Hired Muscle|BOK 1 Ishi-Ishi, Akki Crackshot|BOK -1 Jade Idol|CHK 1 Kami of Empty Graves|SOK 1 Kami of Fire's Roar|CHK 1 Kokusho, the Evening Star|CHK @@ -30,7 +29,7 @@ Name=Lantern-Lit Graveyard 1 Skyfire Kirin|SOK 5 Swamp|CHK 1 Tatsumasa, the Dragon's Fang|CHK +1 Tenza, Godo's Maul|CHK 1 Thief of Hope|CHK 1 Unnatural Speed|CHK 1 Untaidake, the Cloud Keeper|CHK -[Sideboard] diff --git a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Toshiro Umezawa.dck b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Toshiro Umezawa.dck new file mode 100644 index 00000000000..59fb944c514 --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Toshiro Umezawa.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Toshiro Umezawa +[Commander] +1 Toshiro Umezawa|BOK +[Main] +1 Befoul|CHK +1 Boseiju, Who Shelters All|CHK +1 Death of a Thousand Stings|SOK +1 Distress|CHK +1 Exile into Darkness|SOK +1 Genju of the Fens|BOK +1 Hero's Demise|BOK +1 Hideous Laughter|CHK +1 Honden of Night's Reach|CHK +1 Horobi's Whisper|BOK +1 Infernal Kirin|SOK +1 Kemuri-Onna|SOK +1 Mikokoro, Center of the Sea|SOK +1 Neverending Torment|SOK +1 Psychic Spear|BOK +1 Pull Under|CHK +1 Rend Flesh|CHK +1 Rend Spirit|CHK +1 Seizan, Perverter of Truth|CHK +1 Sensei's Divining Top|CHK +1 Shizo, Death's Storehouse|CHK +1 Struggle for Sanity|CHK +1 Swallowing Plague|CHK +12 Swamp|CHK +1 Tatsumasa, the Dragon's Fang|CHK +1 Three Tragedies|BOK +1 Umezawa's Jitte|BOK +1 Waking Nightmare|CHK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Yukora, the Prisoner.dck b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Yukora, the Prisoner.dck new file mode 100644 index 00000000000..1b9153624c1 --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Yukora, the Prisoner.dck @@ -0,0 +1,34 @@ +[metadata] +Name=Yukora, the Prisoner +[Commander] +1 Yukora, the Prisoner|BOK +[Main] +1 Bloodthirsty Ogre|CHK +1 Deathcurse Ogre|CHK +1 Deathknell Kami|SOK +1 General's Kabuto|CHK +1 Gibbering Kami|CHK +1 Gutwrencher Oni|CHK +1 He Who Hungers|CHK +1 Infernal Kirin|SOK +1 Kami of Lunacy|CHK +1 Kokusho, the Evening Star|CHK +1 Konda's Banner|CHK +1 Mikokoro, Center of the Sea|SOK +1 No-Dachi|CHK +1 O-Naginata|SOK +1 Ogre Marauder|BOK +1 Painwracker Oni|CHK +1 Raving Oni-Slave|SOK +1 Ronin Warclub|BOK +1 Scourge of Numai|BOK +1 Sensei's Divining Top|CHK +1 Shizo, Death's Storehouse|CHK +13 Swamp|CHK|2 +1 Takenuma Bleeder|BOK +1 Tatsumasa, the Dragon's Fang|CHK +1 That Which Was Taken|BOK +1 Untaidake, the Cloud Keeper|CHK +1 Villainous Ogre|CHK +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/_events.txt index b49d5f83cae..bf96cf935b1 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/_events.txt @@ -3,7 +3,7 @@ Name:Marrow-Gnawer|Deck:Marrow-Gnawer.dck|Variant:Commander|Avatar:Marrow-Gnawer Name:Kuro, Pitlord|Deck:Kuro, Pitlord.dck|Variant:Commander|Avatar:Kuro, Pitlord|Desc: Name:Maga, Traitor to Mortals|Deck:Maga, Traitor to Mortals.dck|Variant:Commander|Avatar:Maga, Traitor to Mortals|Desc: Name:Lantern-Lit Graveyard|Deck:Lantern-Lit Graveyard.dck|Variant:Planechase|Avatar:Lantern-Lit Graveyard|Desc: -Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: -Name:EVENT7|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Toshiro Umezawa|Deck:Toshiro Umezawa.dck|Variant:Commander|Avatar:Toshiro Umezawa|Desc: +Name:Yukora, the Prisoner|Deck:Yukora, the Prisoner.dck|Variant:Commander|Avatar:Yukora, the Prisoner|Desc: Name:Gix|Deck:Gix.dck|Variant:Vanguard|Avatar:Gix|Desc: Name:Random Planechase|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: From e219d142c7dde028cd4eb25b6fdb7ff99af7c9c7 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 28 Nov 2018 14:43:11 +0300 Subject: [PATCH 312/901] - Added an event to Sokenzan Mountains. --- .../res/cardsfolder/i/iizuka_the_ruthless.txt | 1 + .../Fumiko the Lowblood.dck | 33 +++++++++++++++++++ .../Kamigawa/Sokenzan Mountains/_events.txt | 4 +-- 3 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Fumiko the Lowblood.dck diff --git a/forge-gui/res/cardsfolder/i/iizuka_the_ruthless.txt b/forge-gui/res/cardsfolder/i/iizuka_the_ruthless.txt index 05fead83d4b..71dccbe2df2 100644 --- a/forge-gui/res/cardsfolder/i/iizuka_the_ruthless.txt +++ b/forge-gui/res/cardsfolder/i/iizuka_the_ruthless.txt @@ -4,6 +4,7 @@ Types:Legendary Creature Human Samurai PT:3/3 K:Bushido:2 A:AB$ PumpAll | Cost$ 2 R Sac<1/Samurai> | ValidCards$ Creature.Samurai+YouCtrl | KW$ Double Strike | SpellDescription$ Samurai creatures you control gain double strike until end of turn. +SVar:AIPreference:SacCost$Creature.Samurai+token,Creature.Samurai+cmcLE3 AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/iizuka_the_ruthless.jpg Oracle:Bushido 2 (When this blocks or becomes blocked, it gets +2/+2 until end of turn.)\n{2}{R}, Sacrifice a Samurai: Samurai creatures you control gain double strike until end of turn. diff --git a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Fumiko the Lowblood.dck b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Fumiko the Lowblood.dck new file mode 100644 index 00000000000..e22c3a0994e --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Fumiko the Lowblood.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Fumiko the Lowblood +[Commander] +1 Fumiko the Lowblood|BOK +[Main] +1 Battle-Mad Ronin|CHK +1 Blind with Anger|CHK +1 Brothers Yamazaki|CHK|1 +1 Brothers Yamazaki|CHK|2 +1 Captive Flame|SOK +1 First Volley|BOK +1 Genju of the Spires|BOK +1 Glacial Ray|CHK +1 Honden of Infinite Rage|CHK +1 In the Web of War|BOK +1 Konda's Banner|CHK +1 Lava Spike|CHK +1 Mikokoro, Center of the Sea|SOK +14 Mountain|CHK|1 +1 No-Dachi|CHK +1 Oathkeeper, Takeno's Daisho|CHK +1 Path of Anger's Flame|SOK +1 Ronin Cavekeeper|SOK +1 Ronin Cliffrider|BOK +1 Ronin Houndmaster|CHK +1 Shinka, the Bloodsoaked Keep|CHK +1 Sokenzan Spellblade|SOK +1 Tenza, Godo's Maul|CHK +1 Torrent of Stone|BOK +1 Unnatural Speed|CHK +1 Yamabushi's Flame|CHK +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt index 1ae5b504fa3..63c081a547e 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt @@ -1,4 +1,4 @@ -Name:EVENT1|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Fumiko the Lowblood|Deck:Fumiko the Lowblood.dck|Variant:Commander|Avatar:Fumiko the Lowblood|Desc: Name:EVENT2|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT3|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT4|Deck:Random|Variant:None|Avatar:None|Desc: @@ -6,4 +6,4 @@ Name:EVENT5|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT7|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT8|Deck:Random|Variant:None|Avatar:None|Desc: -Name:Random Planechase|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: +Name:Random Sokenzan Mountains|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: From 0a1f2f6670ba6476ca94f677669f63d6acb4eafb Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 28 Nov 2018 15:31:16 +0300 Subject: [PATCH 313/901] - Improve AI for Brothers Yamazaki. --- .../java/forge/ai/ability/PermanentAi.java | 19 +++++++++++++++++-- .../res/cardsfolder/b/brothers_yamazaki.txt | 2 ++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java index d0579d313ad..e89c9e87d3e 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java @@ -61,8 +61,23 @@ public class PermanentAi extends SpellAbilityAi { if (card.getType().isLegendary() && !game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noLegendRule)) { if (ai.isCardInPlay(card.getName())) { - // AiPlayDecision.WouldDestroyLegend - return false; + if (!card.hasSVar("AILegendaryException")) { + // AiPlayDecision.WouldDestroyLegend + return false; + } else { + String specialRule = card.getSVar("AILegendaryException"); + if ("TwoCopiesAllowed".equals(specialRule)) { + // One extra copy allowed on the battlefield, e.g. Brothers Yamazaki + if (CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.nameEquals(card.getName())).size() > 1) { + return false; + } + } else if ("AlwaysAllowed".equals(specialRule)) { + // Nothing to do here, check for Legendary is disabled + } else { + // Unknown hint, assume two copies not allowed + return false; + } + } } } diff --git a/forge-gui/res/cardsfolder/b/brothers_yamazaki.txt b/forge-gui/res/cardsfolder/b/brothers_yamazaki.txt index 36da0aff1c4..0204b134bf5 100644 --- a/forge-gui/res/cardsfolder/b/brothers_yamazaki.txt +++ b/forge-gui/res/cardsfolder/b/brothers_yamazaki.txt @@ -7,5 +7,7 @@ S:Mode$ Continuous | Affected$ Permanent.namedBrothers Yamazaki | CheckSVar$ X | SVar:X:Count$Valid Permanent.namedBrothers Yamazaki S:Mode$ Continuous | Affected$ Creature.Other+namedBrothers Yamazaki | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Haste | Description$ Each other creature named CARDNAME gets +2/+2 and has haste. DeckHints:Name$Brothers Yamazaki +SVar:AILegendaryException:TwoCopiesAllowed +SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/brothers_yamazaki.jpg Oracle:Bushido 1 (Whenever this creature blocks or becomes blocked, it gets +1/+1 until end of turn.)\nIf there are exactly two permanents named Brothers Yamazaki on the battlefield, the "legend rule" doesn't apply to them.\nEach other creature named Brothers Yamazaki gets +2/+2 and has haste. From 662e47bd7ac56c2d5dff2d0de4908511b7eec28a Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 28 Nov 2018 21:40:22 +0300 Subject: [PATCH 314/901] - Added an event to Sokenzan Mountains. --- .../Godo, Bandit Warlord.dck | 35 +++++++++++++++++++ .../Kamigawa/Sokenzan Mountains/_events.txt | 2 +- 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Godo, Bandit Warlord.dck diff --git a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Godo, Bandit Warlord.dck b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Godo, Bandit Warlord.dck new file mode 100644 index 00000000000..197167a533f --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Godo, Bandit Warlord.dck @@ -0,0 +1,35 @@ +[metadata] +Name=Godo, Bandit Warlord +[Commander] +1 Godo, Bandit Warlord|CHK +[Main] +1 Battle-Mad Ronin|CHK +1 Brothers Yamazaki|CHK|1 +1 Brothers Yamazaki|CHK|2 +1 Fumiko the Lowblood|BOK +1 General's Kabuto|CHK +1 Genju of the Spires|BOK +1 Godo, Bandit Warlord|CHK +1 Konda's Banner|CHK +1 Kusari-Gama|CHK +1 Lava Spike|CHK +1 Manriki-Gusari|SOK +1 Mikokoro, Center of the Sea|SOK +12 Mountain|CHK|1 +1 Neko-Te|BOK +1 No-Dachi|CHK +1 O-Naginata|SOK +1 Oathkeeper, Takeno's Daisho|CHK +1 Ronin Cavekeeper|SOK +1 Ronin Cliffrider|BOK +1 Ronin Houndmaster|CHK +1 Ronin Warclub|BOK +1 Shinka, the Bloodsoaked Keep|CHK +1 Sokenzan Spellblade|SOK +1 Tatsumasa, the Dragon's Fang|CHK +1 Tenza, Godo's Maul|CHK +1 Umezawa's Jitte|BOK +1 Unnatural Speed|CHK +1 Untaidake, the Cloud Keeper|CHK +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt index 63c081a547e..dbf83177bc6 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt @@ -1,5 +1,5 @@ Name:Fumiko the Lowblood|Deck:Fumiko the Lowblood.dck|Variant:Commander|Avatar:Fumiko the Lowblood|Desc: -Name:EVENT2|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Godo, Bandit Warlord|Deck:Godo, Bandit Warlord.dck|Variant:Commander|Avatar:Godo, Bandit Warlord|Desc: Name:EVENT3|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT4|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT5|Deck:Random|Variant:None|Avatar:None|Desc: From 19f9cb9df6fcb489dfd49c9eb922c4ec1e85f042 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 28 Nov 2018 22:13:37 +0300 Subject: [PATCH 315/901] - Added an event to Sokenzan Mountiains. --- .../Fumiko the Lowblood.dck | 2 +- .../Godo, Bandit Warlord.dck | 2 +- .../Sokenzan Mountains/Patron of the Akki.dck | 33 +++++++++++++++++++ .../Kamigawa/Sokenzan Mountains/_events.txt | 2 +- 4 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Patron of the Akki.dck diff --git a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Fumiko the Lowblood.dck b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Fumiko the Lowblood.dck index e22c3a0994e..305af19ccf0 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Fumiko the Lowblood.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Fumiko the Lowblood.dck @@ -16,7 +16,7 @@ Name=Fumiko the Lowblood 1 Konda's Banner|CHK 1 Lava Spike|CHK 1 Mikokoro, Center of the Sea|SOK -14 Mountain|CHK|1 +14 Mountain|CHK 1 No-Dachi|CHK 1 Oathkeeper, Takeno's Daisho|CHK 1 Path of Anger's Flame|SOK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Godo, Bandit Warlord.dck b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Godo, Bandit Warlord.dck index 197167a533f..310639cbc66 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Godo, Bandit Warlord.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Godo, Bandit Warlord.dck @@ -15,7 +15,7 @@ Name=Godo, Bandit Warlord 1 Lava Spike|CHK 1 Manriki-Gusari|SOK 1 Mikokoro, Center of the Sea|SOK -12 Mountain|CHK|1 +12 Mountain|CHK 1 Neko-Te|BOK 1 No-Dachi|CHK 1 O-Naginata|SOK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Patron of the Akki.dck b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Patron of the Akki.dck new file mode 100644 index 00000000000..4ad3e974047 --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Patron of the Akki.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Patron of the Akki +[Commander] +1 Patron of the Akki|BOK +[Main] +1 Akki Avalanchers|CHK +1 Akki Blizzard-Herder|BOK +1 Akki Coalflinger|CHK +1 Akki Drillmaster|SOK +1 Akki Lavarunner|CHK +1 Akki Raider|BOK +1 Akki Rockspeaker|CHK +1 Akki Underling|SOK +1 Akki Underminer|CHK +1 Ben-Ben, Akki Hermit|CHK +1 Captive Flame|SOK +1 Genju of the Spires|BOK +1 Goblin Cohort|BOK +1 Honden of Infinite Rage|CHK +1 In the Web of War|BOK +1 Ishi-Ishi, Akki Crackshot|BOK +1 Kiki-Jiki, Mirror Breaker|CHK +1 Kumano's Blessing|BOK +1 Mikokoro, Center of the Sea|SOK +14 Mountain|CHK +1 No-Dachi|CHK +1 Path of Anger's Flame|SOK +1 Patron of the Akki|BOK +1 Shinka, the Bloodsoaked Keep|CHK +1 Shuko|BOK +1 Uncontrollable Anger|CHK +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt index dbf83177bc6..9c5f600f4a0 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt @@ -1,6 +1,6 @@ Name:Fumiko the Lowblood|Deck:Fumiko the Lowblood.dck|Variant:Commander|Avatar:Fumiko the Lowblood|Desc: Name:Godo, Bandit Warlord|Deck:Godo, Bandit Warlord.dck|Variant:Commander|Avatar:Godo, Bandit Warlord|Desc: -Name:EVENT3|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Patron of the Akki|Deck:Patron of the Akki.dck|Variant:Commander|Avatar:Patron of the Akki|Desc: Name:EVENT4|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT5|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: From 7cbc0baf995618576549b5c5f87e235801f820c4 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 29 Nov 2018 08:07:08 +0300 Subject: [PATCH 316/901] - Updated a deck. --- .../planes/Kamigawa/Sokenzan Mountains/Patron of the Akki.dck | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Patron of the Akki.dck b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Patron of the Akki.dck index 4ad3e974047..8b19f6ac742 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Patron of the Akki.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Patron of the Akki.dck @@ -14,13 +14,13 @@ Name=Patron of the Akki 1 Akki Underminer|CHK 1 Ben-Ben, Akki Hermit|CHK 1 Captive Flame|SOK +1 Flames of the Blood Hand|BOK 1 Genju of the Spires|BOK 1 Goblin Cohort|BOK 1 Honden of Infinite Rage|CHK 1 In the Web of War|BOK 1 Ishi-Ishi, Akki Crackshot|BOK 1 Kiki-Jiki, Mirror Breaker|CHK -1 Kumano's Blessing|BOK 1 Mikokoro, Center of the Sea|SOK 14 Mountain|CHK 1 No-Dachi|CHK @@ -29,5 +29,3 @@ Name=Patron of the Akki 1 Shinka, the Bloodsoaked Keep|CHK 1 Shuko|BOK 1 Uncontrollable Anger|CHK -[Sideboard] - From c6d713269c46a7b44729c2a30c11c1c866e399ae Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 29 Nov 2018 09:20:30 +0300 Subject: [PATCH 317/901] - Added an event to Sokenzan. --- .../Jiwari, the Earth Aflame.dck | 34 +++++++++++++++++++ .../Kamigawa/Sokenzan Mountains/_events.txt | 2 +- 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Jiwari, the Earth Aflame.dck diff --git a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Jiwari, the Earth Aflame.dck b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Jiwari, the Earth Aflame.dck new file mode 100644 index 00000000000..85bd6fefaf6 --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Jiwari, the Earth Aflame.dck @@ -0,0 +1,34 @@ +[metadata] +Name=Jiwari, the Earth Aflame +[Commander] +1 Jiwari, the Earth Aflame|SOK +[Main] +1 Akki Lavarunner|CHK +1 Burning-Eye Zubera|SOK +1 Crushing Pain|CHK +1 Ember-Fist Zubera|CHK +1 First Volley|BOK +1 Flames of the Blood Hand|BOK +1 Frostling|BOK +1 Frostwielder|CHK +1 Gaze of Adamaro|SOK +1 Ghost-Lit Raider|SOK +1 Glacial Ray|CHK +1 Hanabi Blast|CHK +1 Honden of Infinite Rage|CHK +1 Initiate of Blood|CHK +1 Ishi-Ishi, Akki Crackshot|BOK +1 Konda's Banner|CHK +1 Lava Spike|CHK +13 Mountain|CHK +1 No-Dachi|CHK +1 Pain Kami|CHK +1 Ronin Warclub|BOK +1 Shinka, the Bloodsoaked Keep|CHK +1 Shuko|BOK +1 Spiraling Embers|SOK +1 Tenza, Godo's Maul|CHK +1 Yamabushi's Flame|CHK +1 Zo-Zu the Punisher|CHK +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt index 9c5f600f4a0..b2cda5a1912 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt @@ -1,7 +1,7 @@ Name:Fumiko the Lowblood|Deck:Fumiko the Lowblood.dck|Variant:Commander|Avatar:Fumiko the Lowblood|Desc: Name:Godo, Bandit Warlord|Deck:Godo, Bandit Warlord.dck|Variant:Commander|Avatar:Godo, Bandit Warlord|Desc: Name:Patron of the Akki|Deck:Patron of the Akki.dck|Variant:Commander|Avatar:Patron of the Akki|Desc: -Name:EVENT4|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Jiwari, the Earth Aflame|Deck:Jiwari, the Earth Aflame.dck|Variant:Commander|Avatar:Jiwari, the Earth Aflame|Desc: Name:EVENT5|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT7|Deck:Random|Variant:None|Avatar:None|Desc: From 4298faeabbea1b9d1f34c9f628e5ecfb3f7ca3a5 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 29 Nov 2018 10:37:45 +0300 Subject: [PATCH 318/901] - Added an event to Sokenzan Mountains. --- .../s/seshiro_the_anointed_avatar.txt | 2 +- .../Seshiro the Anointed.dck | 39 +++++++++++++++++++ .../Kamigawa/Sokenzan Mountains/_events.txt | 4 +- 3 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Seshiro the Anointed.dck diff --git a/forge-gui/res/cardsfolder/s/seshiro_the_anointed_avatar.txt b/forge-gui/res/cardsfolder/s/seshiro_the_anointed_avatar.txt index 9df1b632be0..c2ec8d58520 100644 --- a/forge-gui/res/cardsfolder/s/seshiro_the_anointed_avatar.txt +++ b/forge-gui/res/cardsfolder/s/seshiro_the_anointed_avatar.txt @@ -3,7 +3,7 @@ ManaCost:no cost Types:Vanguard HandLifeModifier:+0/-1 T:Mode$ NewGame | Execute$ TrigChooseCT | TriggerZones$ Command | TriggerDescription$ At the beginning of the game, choose a creature type. Creatures you control, creature spells you control, and creature cards you own in any zone other than the battlefield or the stack have the chosen type in addition to their other types. -SVar:TrigChooseCT:DB$ ChooseType | Defined$ You | Type$ Creature +SVar:TrigChooseCT:DB$ ChooseType | Defined$ You | Type$ Creature | AILogic$ MostProminentInComputerDeck S:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl | AffectedZone$ Battlefield,Hand,Library,Graveyard,Exile,Stack,Command | AddType$ ChosenType SVar:Picture:https://downloads.cardforge.org/images/cards/VAN/Seshiro the Anointed Avatar.full.jpg Oracle:Hand +0, life -1\nAt the beginning of the game, choose a creature type. Creatures you control, creature spells you control, and creature cards you own in any zone other than the battlefield or the stack have the chosen type in addition to their other types. diff --git a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Seshiro the Anointed.dck b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Seshiro the Anointed.dck new file mode 100644 index 00000000000..a685bf91226 --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Seshiro the Anointed.dck @@ -0,0 +1,39 @@ +[metadata] +Name=Pinecrest Ridge +[Avatar] +1 Seshiro the Anointed Avatar|VAN +[Main] +1 Araba Mothrider|SOK +1 Battle-Mad Ronin|CHK +1 Brothers Yamazaki|CHK|1 +1 Brothers Yamazaki|CHK|2 +1 Eiganjo Castle|CHK +1 Forbidden Orchard|CHK +3 Forest|CHK +1 Fumiko the Lowblood|BOK +1 Indebted Samurai|BOK +1 Isao, Enlightened Bushi|BOK +1 Iwamori of the Open Fist|BOK +1 Kentaro, the Smiling Cat|BOK +1 Kitsune Blademaster|CHK +1 Konda's Banner|CHK +1 Konda's Hatamoto|CHK +1 Lantern Kami|CHK +1 Mikokoro, Center of the Sea|SOK +4 Mountain|CHK +1 Nagao, Bound by Honor|CHK +1 No-Dachi|CHK +1 O-Naginata|SOK +1 Oathkeeper, Takeno's Daisho|CHK +1 Okina, Temple to the Grandfathers|CHK +1 Orochi Sustainer|CHK +1 Path of Anger's Flame|SOK +1 Pinecrest Ridge|CHK +2 Plains|CHK +1 Ronin Cliffrider|BOK +1 Ronin Houndmaster|CHK +1 Sakura-Tribe Springcaller|BOK +1 Shinka, the Bloodsoaked Keep|CHK +1 Sokenzan Spellblade|SOK +1 Takeno, Samurai General|CHK +1 Tranquil Garden|CHK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt index b2cda5a1912..0d0f8032d43 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt @@ -2,8 +2,8 @@ Name:Fumiko the Lowblood|Deck:Fumiko the Lowblood.dck|Variant:Commander|Avatar:F Name:Godo, Bandit Warlord|Deck:Godo, Bandit Warlord.dck|Variant:Commander|Avatar:Godo, Bandit Warlord|Desc: Name:Patron of the Akki|Deck:Patron of the Akki.dck|Variant:Commander|Avatar:Patron of the Akki|Desc: Name:Jiwari, the Earth Aflame|Deck:Jiwari, the Earth Aflame.dck|Variant:Commander|Avatar:Jiwari, the Earth Aflame|Desc: -Name:EVENT5|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Pinecrest Ridge|Deck:Pinecrest Ridge.dck|Variant:Planechase|Avatar:Pinecrest Ridge|Desc: Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT7|Deck:Random|Variant:None|Avatar:None|Desc: -Name:EVENT8|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Seshiro the Anointed|Deck:Seshiro the Anointed.dck|Variant:Vanguard|Avatar:Seshiro the Anointed Avatar|Desc: Name:Random Sokenzan Mountains|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: From e0357573584f0fd41fe2430181695d64299a9c56 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 29 Nov 2018 11:49:50 +0300 Subject: [PATCH 319/901] - Added an event to Sokenzan Mountains. Tweaked an event in Towabara. --- .../Sokenzan Mountains/Pinecrest Ridge.dck | 36 +++++++++++++++++++ ...of the Plane.dck => Forbidden Orchard.dck} | 0 .../planes/Kamigawa/Towabara/_events.txt | 2 +- 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Pinecrest Ridge.dck rename forge-gui/res/conquest/planes/Kamigawa/Towabara/{Spirits of the Plane.dck => Forbidden Orchard.dck} (100%) diff --git a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Pinecrest Ridge.dck b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Pinecrest Ridge.dck new file mode 100644 index 00000000000..7bd4b25d1d2 --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Pinecrest Ridge.dck @@ -0,0 +1,36 @@ +[metadata] +Name=Pinecrest Ridge +[Main] +1 Adamaro, First to Desire|SOK +1 Baku Altar|BOK +1 Blademane Baku|BOK +1 Budoka Pupil|BOK +1 Burning-Eye Zubera|SOK +1 Cunning Bandit|BOK +1 Dripping-Tongue Zubera|CHK +1 Ember-Fist Zubera|CHK +5 Forest|CHK +1 Frostling|BOK +1 Genju of the Cedars|BOK +1 Genju of the Spires|BOK +1 Ghost-Lit Nourisher|SOK +1 Ghost-Lit Raider|SOK +1 Hearth Kami|CHK +1 Jiwari, the Earth Aflame|SOK +1 Kami of Fire's Roar|CHK +1 Kodama of the South Tree|CHK +1 Loam Dweller|BOK +1 Long-Forgotten Gohei|CHK +1 Mikokoro, Center of the Sea|SOK +5 Mountain|CHK +1 Okina, Temple to the Grandfathers|CHK +1 Petalmane Baku|BOK +1 Pinecrest Ridge|CHK +1 Promised Kannushi|SOK +1 Ryusei, the Falling Star|CHK +1 Shinka, the Bloodsoaked Keep|CHK +1 Skyfire Kirin|SOK +1 Soilshaper|CHK +1 Tendo Ice Bridge|BOK +1 Unchecked Growth|BOK +[Sideboard] diff --git a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Spirits of the Plane.dck b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Forbidden Orchard.dck similarity index 100% rename from forge-gui/res/conquest/planes/Kamigawa/Towabara/Spirits of the Plane.dck rename to forge-gui/res/conquest/planes/Kamigawa/Towabara/Forbidden Orchard.dck diff --git a/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt index 4486db583a7..91ff5fc223e 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Towabara/_events.txt @@ -5,5 +5,5 @@ Name:Rune-Tail, Kitsune Ascendant|Deck:Rune-Tail, Kitsune Ascendant.dck|Variant: Name:Eight-and-a-Half-Tails|Deck:Eight-and-a-Half-Tails.dck|Variant:Vanguard|Avatar:Eight-and-a-Half-Tails Avatar|Desc: Name:Celestial Kirin|Deck:Celestial Kirin.dck|Variant:Commander|Avatar:Celestial Kirin|Desc: Name:Takeno, Samurai General|Deck:Takeno, Samurai General.dck|Variant:Commander|Avatar:Takeno, Samurai General|Desc: -Name:Spirits of the Plane|Deck:Spirits of the Plane.dck|Variant:Planechase|Avatar:Kami of the Honored Dead|Desc: +Name:Forbidden Orchard|Deck:Forbidden Orchard.dck|Variant:Planechase|Avatar:Forbidden Orchard|Desc: Name:Random Towabara|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: From 1d46a5dbc4c2a0c540a70c3a306ef6454c1030ed Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 29 Nov 2018 12:26:25 +0300 Subject: [PATCH 320/901] - Finished Sokenzan Mountains events. --- .../Kiki-Jiki, Mirror Breaker.dck | 33 +++++++++++++++++++ .../Ryusei, the Falling Star.dck | 32 ++++++++++++++++++ .../Kamigawa/Sokenzan Mountains/_events.txt | 4 +-- 3 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Kiki-Jiki, Mirror Breaker.dck create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Ryusei, the Falling Star.dck diff --git a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Kiki-Jiki, Mirror Breaker.dck b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Kiki-Jiki, Mirror Breaker.dck new file mode 100644 index 00000000000..0f058bfc376 --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Kiki-Jiki, Mirror Breaker.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Kiki-Jiki, Mirror Breaker +[Commander] +1 Kiki-Jiki, Mirror Breaker|CHK +[Main] +1 Akki Coalflinger|CHK +1 Akki Lavarunner|CHK +1 Akki Rockspeaker|CHK +1 Akki Underling|SOK +1 Akki Underminer|CHK +1 Blind with Anger|CHK +1 Captive Flame|SOK +1 Frostling|BOK +1 Genju of the Spires|BOK +1 Goblin Cohort|BOK +1 Godo's Irregulars|SOK +1 In the Web of War|BOK +1 Ishi-Ishi, Akki Crackshot|BOK +1 Kusari-Gama|CHK +1 Manriki-Gusari|SOK +1 Mikokoro, Center of the Sea|SOK +14 Mountain|CHK|1 +1 No-Dachi|CHK +1 Oathkeeper, Takeno's Daisho|CHK +1 Patron of the Akki|BOK +1 Ronin Warclub|BOK +1 Shinka, the Bloodsoaked Keep|CHK +1 Shuko|BOK +1 Tenza, Godo's Maul|CHK +1 Uncontrollable Anger|CHK +1 Wine of Blood and Iron|SOK +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Ryusei, the Falling Star.dck b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Ryusei, the Falling Star.dck new file mode 100644 index 00000000000..fd5b24cd729 --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Ryusei, the Falling Star.dck @@ -0,0 +1,32 @@ +[metadata] +Name=Ryusei, the Falling Star +[Commander] +1 Ryusei, the Falling Star|CHK +[Main] +1 Adamaro, First to Desire|SOK +1 Baku Altar|BOK +1 Blademane Baku|BOK +1 Burning-Eye Zubera|SOK +1 Captive Flame|SOK +1 Cunning Bandit|BOK +1 Desperate Ritual|CHK +1 Ember-Fist Zubera|CHK +1 Frostling|BOK +1 Genju of the Spires|BOK +1 Ghost-Lit Raider|SOK +1 Honden of Infinite Rage|CHK +1 In the Web of War|BOK +1 Jade Idol|CHK +1 Jiwari, the Earth Aflame|SOK +1 Kami of Fire's Roar|CHK +1 Long-Forgotten Gohei|CHK +1 Mikokoro, Center of the Sea|SOK +13 Mountain|CHK|1 +1 Myojin of Infinite Rage|CHK +1 Nine-Ringed Bo|CHK +1 Oni of Wild Places|SOK +1 Ore Gorger|CHK +1 Shinka, the Bloodsoaked Keep|CHK +1 Skyfire Kirin|SOK +1 Tatsumasa, the Dragon's Fang|CHK +1 Untaidake, the Cloud Keeper|CHK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt index 0d0f8032d43..ec64f75f88d 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt @@ -3,7 +3,7 @@ Name:Godo, Bandit Warlord|Deck:Godo, Bandit Warlord.dck|Variant:Commander|Avatar Name:Patron of the Akki|Deck:Patron of the Akki.dck|Variant:Commander|Avatar:Patron of the Akki|Desc: Name:Jiwari, the Earth Aflame|Deck:Jiwari, the Earth Aflame.dck|Variant:Commander|Avatar:Jiwari, the Earth Aflame|Desc: Name:Pinecrest Ridge|Deck:Pinecrest Ridge.dck|Variant:Planechase|Avatar:Pinecrest Ridge|Desc: -Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: -Name:EVENT7|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Ryusei, the Falling Star|Deck:Ryusei, the Falling Star.dck|Variant:Commander|Avatar:Ryusei, the Falling Star|Desc: +Name:Kiki-Jiki, Mirror Breaker|Deck:Kiki-Jiki, Mirror Breaker.dck|Variant:Commander|Avatar:Kiki-Jiki, Mirror Breaker|Desc: Name:Seshiro the Anointed|Deck:Seshiro the Anointed.dck|Variant:Vanguard|Avatar:Seshiro the Anointed Avatar|Desc: Name:Random Sokenzan Mountains|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: From 719ae4717c13cccb1818b6c99350e1bc7212ce0a Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 29 Nov 2018 12:49:42 +0300 Subject: [PATCH 321/901] - Updated a deck. --- ..., Mirror Breaker.dck => Ben-Ben, Akki Hermit.dck} | 12 +++++------- .../planes/Kamigawa/Sokenzan Mountains/_events.txt | 2 +- 2 files changed, 6 insertions(+), 8 deletions(-) rename forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/{Kiki-Jiki, Mirror Breaker.dck => Ben-Ben, Akki Hermit.dck} (85%) diff --git a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Kiki-Jiki, Mirror Breaker.dck b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Ben-Ben, Akki Hermit.dck similarity index 85% rename from forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Kiki-Jiki, Mirror Breaker.dck rename to forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Ben-Ben, Akki Hermit.dck index 0f058bfc376..2e31d7e7926 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Kiki-Jiki, Mirror Breaker.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Ben-Ben, Akki Hermit.dck @@ -1,7 +1,7 @@ [metadata] -Name=Kiki-Jiki, Mirror Breaker +Name=Ben-Ben, Akki Hermit [Commander] -1 Kiki-Jiki, Mirror Breaker|CHK +1 Ben-Ben, Akki Hermit|CHK [Main] 1 Akki Coalflinger|CHK 1 Akki Lavarunner|CHK @@ -10,24 +10,22 @@ Name=Kiki-Jiki, Mirror Breaker 1 Akki Underminer|CHK 1 Blind with Anger|CHK 1 Captive Flame|SOK -1 Frostling|BOK +1 Fumiko the Lowblood|BOK 1 Genju of the Spires|BOK 1 Goblin Cohort|BOK 1 Godo's Irregulars|SOK 1 In the Web of War|BOK 1 Ishi-Ishi, Akki Crackshot|BOK +1 Kiki-Jiki, Mirror Breaker|CHK 1 Kusari-Gama|CHK 1 Manriki-Gusari|SOK 1 Mikokoro, Center of the Sea|SOK -14 Mountain|CHK|1 +14 Mountain|CHK 1 No-Dachi|CHK 1 Oathkeeper, Takeno's Daisho|CHK -1 Patron of the Akki|BOK 1 Ronin Warclub|BOK 1 Shinka, the Bloodsoaked Keep|CHK 1 Shuko|BOK 1 Tenza, Godo's Maul|CHK 1 Uncontrollable Anger|CHK 1 Wine of Blood and Iron|SOK -[Sideboard] - diff --git a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt index ec64f75f88d..b82f65b8e84 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt @@ -4,6 +4,6 @@ Name:Patron of the Akki|Deck:Patron of the Akki.dck|Variant:Commander|Avatar:Pat Name:Jiwari, the Earth Aflame|Deck:Jiwari, the Earth Aflame.dck|Variant:Commander|Avatar:Jiwari, the Earth Aflame|Desc: Name:Pinecrest Ridge|Deck:Pinecrest Ridge.dck|Variant:Planechase|Avatar:Pinecrest Ridge|Desc: Name:Ryusei, the Falling Star|Deck:Ryusei, the Falling Star.dck|Variant:Commander|Avatar:Ryusei, the Falling Star|Desc: -Name:Kiki-Jiki, Mirror Breaker|Deck:Kiki-Jiki, Mirror Breaker.dck|Variant:Commander|Avatar:Kiki-Jiki, Mirror Breaker|Desc: +Name:Ben-Ben, Akki Hermit|Deck:Ben-Ben, Akki Hermit.dck|Variant:Commander|Avatar:Ben-Ben, Akki Hermit|Desc: Name:Seshiro the Anointed|Deck:Seshiro the Anointed.dck|Variant:Vanguard|Avatar:Seshiro the Anointed Avatar|Desc: Name:Random Sokenzan Mountains|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: From eab8bf3660461138865b51134926492673bb3798 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 29 Nov 2018 17:12:19 +0300 Subject: [PATCH 322/901] - Added an event to Jukai Forest. --- .../s/shisato_whispering_hunter.txt | 3 ++ .../Jukai Forest/Seshiro the Anointed.dck | 35 +++++++++++++++++++ .../planes/Kamigawa/Jukai Forest/_events.txt | 4 +-- 3 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Seshiro the Anointed.dck diff --git a/forge-gui/res/cardsfolder/s/shisato_whispering_hunter.txt b/forge-gui/res/cardsfolder/s/shisato_whispering_hunter.txt index 20bc3b78ac0..7dc31d185ad 100644 --- a/forge-gui/res/cardsfolder/s/shisato_whispering_hunter.txt +++ b/forge-gui/res/cardsfolder/s/shisato_whispering_hunter.txt @@ -6,6 +6,9 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E SVar:TrigSac:DB$Sacrifice | Defined$ You | SacValid$ Snake T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player skips their next untap step. SVar:TrigPump:DB$Pump | Defined$ TriggeredTarget | KW$ Skip your next untap step. | Permanent$ True +SVar:NeedsToPlayVar:Z GE2 +SVar:Z:Count$Valid Creature.Snake+YouCtrl+cmcLE2 +DeckNeeds:Type$Snake AI:RemoveDeck:All AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/shisato_whispering_hunter.jpg diff --git a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Seshiro the Anointed.dck b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Seshiro the Anointed.dck new file mode 100644 index 00000000000..47f8110be92 --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Seshiro the Anointed.dck @@ -0,0 +1,35 @@ +[metadata] +Name=Seshiro the Anointed +[Commander] +1 Seshiro the Anointed|CHK +[Main] +1 Commune with Nature|CHK +1 Endless Swarm|SOK +1 Enshrined Memories|BOK +12 Forest|CHK|4 +1 Jukai Messenger|CHK +1 Kashi-Tribe Elite|SOK +1 Kashi-Tribe Reaver|CHK +1 Kashi-Tribe Warriors|CHK +1 Kodama's Reach|CHK +1 Konda's Banner|CHK +1 Matsu-Tribe Birdstalker|SOK +1 Matsu-Tribe Decoy|CHK +1 Matsu-Tribe Sniper|BOK +1 Mikokoro, Center of the Sea|SOK +1 Okina, Temple to the Grandfathers|CHK +1 Orochi Eggwatcher|CHK +1 Orochi Hatchery|CHK +1 Orochi Ranger|CHK +1 Orochi Sustainer|CHK +1 Sachi, Daughter of Seshiro|CHK +1 Sakiko, Mother of Summer|BOK +1 Sakura-Tribe Scout|SOK +1 Sakura-Tribe Springcaller|BOK +1 Seed the Land|SOK +1 Shisato, Whispering Hunter|CHK +1 Sosuke's Summons|BOK +1 Sosuke, Son of Seshiro|CHK +1 Untaidake, the Cloud Keeper|CHK +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/_events.txt index 1ae5b504fa3..b3d575692eb 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/_events.txt @@ -1,4 +1,4 @@ -Name:EVENT1|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Seshiro the Anointed|Deck:Seshiro the Anointed.dck|Variant:Commander|Avatar:Seshiro the Anointed|Desc: Name:EVENT2|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT3|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT4|Deck:Random|Variant:None|Avatar:None|Desc: @@ -6,4 +6,4 @@ Name:EVENT5|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT7|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT8|Deck:Random|Variant:None|Avatar:None|Desc: -Name:Random Planechase|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: +Name:Random Jukai Forest|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: From 650d74b413d9bea683d04db49a439bb186775d9d Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 29 Nov 2018 18:27:42 +0300 Subject: [PATCH 323/901] - Added an event to Jukai Forest. --- .../Seshiro the Anointed Avatar.dck | 39 +++++++++++++++++++ .../Jukai Forest/Seshiro the Anointed.dck | 2 +- .../planes/Kamigawa/Jukai Forest/_events.txt | 2 +- .../Seshiro the Anointed.dck | 2 +- 4 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Seshiro the Anointed Avatar.dck diff --git a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Seshiro the Anointed Avatar.dck b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Seshiro the Anointed Avatar.dck new file mode 100644 index 00000000000..a8f2710c5ba --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Seshiro the Anointed Avatar.dck @@ -0,0 +1,39 @@ +[metadata] +Name=Seshiro the Anointed Avatar +[Avatar] +1 Seshiro the Anointed Avatar|VAN +[Main] +1 Araba Mothrider|SOK +1 Ayumi, the Last Visitor|SOK +1 Brothers Yamazaki|CHK|1 +1 Brothers Yamazaki|CHK|2 +1 Eiganjo Castle|CHK +1 Forbidden Orchard|CHK +3 Forest|CHK +1 Fumiko the Lowblood|BOK +1 Indebted Samurai|BOK +1 Isao, Enlightened Bushi|BOK +1 Iwamori of the Open Fist|BOK +1 Kentaro, the Smiling Cat|BOK +1 Kodama's Reach|CHK +1 Konda's Banner|CHK +1 Konda's Hatamoto|CHK +1 Lantern Kami|CHK +1 Mikokoro, Center of the Sea|SOK +3 Mountain|CHK +1 Nagao, Bound by Honor|CHK +1 No-Dachi|CHK +1 O-Naginata|SOK +1 Oathkeeper, Takeno's Daisho|CHK +1 Okina, Temple to the Grandfathers|CHK +1 Orochi Sustainer|CHK +1 Path of Anger's Flame|SOK +1 Pinecrest Ridge|CHK +3 Plains|CHK +1 Ronin Cliffrider|BOK +1 Ronin Houndmaster|CHK +1 Sakura-Tribe Springcaller|BOK +1 Shinka, the Bloodsoaked Keep|CHK +1 Sokenzan Spellblade|SOK +1 Takeno, Samurai General|CHK +1 Tranquil Garden|CHK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Seshiro the Anointed.dck b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Seshiro the Anointed.dck index 47f8110be92..c2e7a5a8233 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Seshiro the Anointed.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Seshiro the Anointed.dck @@ -6,7 +6,7 @@ Name=Seshiro the Anointed 1 Commune with Nature|CHK 1 Endless Swarm|SOK 1 Enshrined Memories|BOK -12 Forest|CHK|4 +12 Forest|CHK 1 Jukai Messenger|CHK 1 Kashi-Tribe Elite|SOK 1 Kashi-Tribe Reaver|CHK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/_events.txt index b3d575692eb..920553e2bd2 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/_events.txt @@ -5,5 +5,5 @@ Name:EVENT4|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT5|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT7|Deck:Random|Variant:None|Avatar:None|Desc: -Name:EVENT8|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Seshiro the Anointed Avatar|Deck:Seshiro the Anointed Avatar.dck|Variant:Vanguard|Avatar:Seshiro the Anointed Avatar|Desc: Name:Random Jukai Forest|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: diff --git a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Seshiro the Anointed.dck b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Seshiro the Anointed.dck index a685bf91226..bcb65ae5b7c 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Seshiro the Anointed.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Seshiro the Anointed.dck @@ -1,5 +1,5 @@ [metadata] -Name=Pinecrest Ridge +Name=Seshiro the Anointed [Avatar] 1 Seshiro the Anointed Avatar|VAN [Main] From 395178aa83bbd5c4e3ec84732203a8bafe38b075 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 29 Nov 2018 19:40:33 +0300 Subject: [PATCH 324/901] - More work on Sokenzan Mountains and Jukai Forest. --- .../Seshiro the Anointed Avatar.dck | 2 +- .../Seshiro the Anointed.dck | 39 ------------------- .../Sokenzan Mountains/Stonehewer Giant.dck | 32 +++++++++++++++ .../Kamigawa/Sokenzan Mountains/_events.txt | 2 +- 4 files changed, 34 insertions(+), 41 deletions(-) delete mode 100644 forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Seshiro the Anointed.dck create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Stonehewer Giant.dck diff --git a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Seshiro the Anointed Avatar.dck b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Seshiro the Anointed Avatar.dck index a8f2710c5ba..ac541d84352 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Seshiro the Anointed Avatar.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Seshiro the Anointed Avatar.dck @@ -13,7 +13,7 @@ Name=Seshiro the Anointed Avatar 1 Fumiko the Lowblood|BOK 1 Indebted Samurai|BOK 1 Isao, Enlightened Bushi|BOK -1 Iwamori of the Open Fist|BOK +1 Kashi-Tribe Reaver|CHK 1 Kentaro, the Smiling Cat|BOK 1 Kodama's Reach|CHK 1 Konda's Banner|CHK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Seshiro the Anointed.dck b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Seshiro the Anointed.dck deleted file mode 100644 index bcb65ae5b7c..00000000000 --- a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Seshiro the Anointed.dck +++ /dev/null @@ -1,39 +0,0 @@ -[metadata] -Name=Seshiro the Anointed -[Avatar] -1 Seshiro the Anointed Avatar|VAN -[Main] -1 Araba Mothrider|SOK -1 Battle-Mad Ronin|CHK -1 Brothers Yamazaki|CHK|1 -1 Brothers Yamazaki|CHK|2 -1 Eiganjo Castle|CHK -1 Forbidden Orchard|CHK -3 Forest|CHK -1 Fumiko the Lowblood|BOK -1 Indebted Samurai|BOK -1 Isao, Enlightened Bushi|BOK -1 Iwamori of the Open Fist|BOK -1 Kentaro, the Smiling Cat|BOK -1 Kitsune Blademaster|CHK -1 Konda's Banner|CHK -1 Konda's Hatamoto|CHK -1 Lantern Kami|CHK -1 Mikokoro, Center of the Sea|SOK -4 Mountain|CHK -1 Nagao, Bound by Honor|CHK -1 No-Dachi|CHK -1 O-Naginata|SOK -1 Oathkeeper, Takeno's Daisho|CHK -1 Okina, Temple to the Grandfathers|CHK -1 Orochi Sustainer|CHK -1 Path of Anger's Flame|SOK -1 Pinecrest Ridge|CHK -2 Plains|CHK -1 Ronin Cliffrider|BOK -1 Ronin Houndmaster|CHK -1 Sakura-Tribe Springcaller|BOK -1 Shinka, the Bloodsoaked Keep|CHK -1 Sokenzan Spellblade|SOK -1 Takeno, Samurai General|CHK -1 Tranquil Garden|CHK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Stonehewer Giant.dck b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Stonehewer Giant.dck new file mode 100644 index 00000000000..b32f60140d8 --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Stonehewer Giant.dck @@ -0,0 +1,32 @@ +[metadata] +Name=Stonehewer Giant +[Avatar] +1 Stonehewer Giant Avatar|VAN +[Main] +1 Akki Blizzard-Herder|BOK +1 Akki Coalflinger|CHK +1 Akki Drillmaster|SOK +1 Akki Lavarunner|CHK +1 Akki Raider|BOK +1 Akki Rockspeaker|CHK +1 Akki Underling|SOK +1 Akki Underminer|CHK +1 Ben-Ben, Akki Hermit|CHK +1 Frost Ogre|BOK +1 Genju of the Spires|BOK +1 Goblin Cohort|BOK +1 Initiate of Blood|CHK +1 Ishi-Ishi, Akki Crackshot|BOK +1 Kiki-Jiki, Mirror Breaker|CHK +1 Mikokoro, Center of the Sea|SOK +14 Mountain|CHK +1 Path of Anger's Flame|SOK +1 Patron of the Akki|BOK +1 Shinka Gatekeeper|BOK +1 Shinka, the Bloodsoaked Keep|CHK +1 Sokenzan Bruiser|CHK +1 Sokenzan Spellblade|SOK +1 Spiraling Embers|SOK +1 Tenza, Godo's Maul|CHK +1 That Which Was Taken|BOK +1 Wine of Blood and Iron|SOK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt index b82f65b8e84..83227725c39 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/_events.txt @@ -5,5 +5,5 @@ Name:Jiwari, the Earth Aflame|Deck:Jiwari, the Earth Aflame.dck|Variant:Commande Name:Pinecrest Ridge|Deck:Pinecrest Ridge.dck|Variant:Planechase|Avatar:Pinecrest Ridge|Desc: Name:Ryusei, the Falling Star|Deck:Ryusei, the Falling Star.dck|Variant:Commander|Avatar:Ryusei, the Falling Star|Desc: Name:Ben-Ben, Akki Hermit|Deck:Ben-Ben, Akki Hermit.dck|Variant:Commander|Avatar:Ben-Ben, Akki Hermit|Desc: -Name:Seshiro the Anointed|Deck:Seshiro the Anointed.dck|Variant:Vanguard|Avatar:Seshiro the Anointed Avatar|Desc: +Name:Stonehewer Giant|Deck:Stonehewer Giant.dck|Variant:Vanguard|Avatar:Stonehewer Giant Avatar|Desc: Name:Random Sokenzan Mountains|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: From f98aba16d4ca423358603d84c06fe755f2babfdb Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 29 Nov 2018 20:24:44 +0300 Subject: [PATCH 325/901] - Added an event to Jukai Forest. --- .../Shizuko, Caller of Autumn.dck | 33 +++++++++++++++++++ .../planes/Kamigawa/Jukai Forest/_events.txt | 2 +- 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Shizuko, Caller of Autumn.dck diff --git a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Shizuko, Caller of Autumn.dck b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Shizuko, Caller of Autumn.dck new file mode 100644 index 00000000000..3c54a0045fa --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Shizuko, Caller of Autumn.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Shizuko, Caller of Autumn +[Commander] +1 Shizuko, Caller of Autumn|BOK +[Main] +1 Body of Jukai|BOK +14 Forest|CHK|1 +1 Genju of the Cedars|BOK +1 Jugan, the Rising Star|CHK +1 Kodama's Might|CHK +1 Kodama's Reach|CHK +1 Loam Dweller|BOK +1 Mark of Sakiko|BOK +1 Moss Kami|CHK +1 Nightsoil Kami|SOK +1 No-Dachi|CHK +1 O-Naginata|SOK +1 Okina, Temple to the Grandfathers|CHK +1 Orochi Hatchery|CHK +1 Orochi Sustainer|CHK +1 Reki, the History of Kamigawa|SOK +1 Sachi, Daughter of Seshiro|CHK +1 Sakura-Tribe Scout|SOK +1 Sakura-Tribe Springcaller|BOK +1 Sekki, Seasons' Guide|SOK +1 Seshiro the Anointed|CHK +1 Strength of Cedars|CHK +1 Thousand-legged Kami|CHK +1 Traproot Kami|BOK +1 Unchecked Growth|BOK +1 Untaidake, the Cloud Keeper|CHK +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/_events.txt index 920553e2bd2..586b72925fa 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/_events.txt @@ -1,5 +1,5 @@ Name:Seshiro the Anointed|Deck:Seshiro the Anointed.dck|Variant:Commander|Avatar:Seshiro the Anointed|Desc: -Name:EVENT2|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Shizuko, Caller of Autumn|Deck:Shizuko, Caller of Autumn.dck|Variant:Commander|Avatar:Shizuko, Caller of Autumn|Desc: Name:EVENT3|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT4|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT5|Deck:Random|Variant:None|Avatar:None|Desc: From ee1ca415015c5adacee196615096ee8bc045c175 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 30 Nov 2018 10:48:19 +0300 Subject: [PATCH 326/901] - Added 2 events to Jukai Forest. --- .../Jukai Forest/Iwamori of the Open Fist.dck | 33 +++++++++++++++++++ .../Kamigawa/Jukai Forest/Tranquil Garden.dck | 33 +++++++++++++++++++ .../planes/Kamigawa/Jukai Forest/_events.txt | 4 +-- 3 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Iwamori of the Open Fist.dck create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Tranquil Garden.dck diff --git a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Iwamori of the Open Fist.dck b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Iwamori of the Open Fist.dck new file mode 100644 index 00000000000..8f41777aaf1 --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Iwamori of the Open Fist.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Iwamori of the Open Fist +[Commander] +1 Iwamori of the Open Fist|BOK +[Main] +1 Azusa, Lost but Seeking|CHK +1 Budoka Gardener|CHK +1 Commune with Nature|CHK +1 Dosan the Falling Leaf|CHK +1 Dosan's Oldest Chant|SOK +14 Forest|CHK +1 Humble Budoka|CHK +1 Inner Calm, Outer Strength|SOK +1 Journeyer's Kite|CHK +1 Jugan, the Rising Star|CHK +1 Jukai Messenger|CHK +1 Kodama's Reach|CHK +1 Konda's Banner|CHK +1 Masumaro, First to Live|SOK +1 Mikokoro, Center of the Sea|SOK +1 Okina Nightwatch|SOK +1 Okina, Temple to the Grandfathers|CHK +1 Order of the Sacred Bell|CHK +1 Reki, the History of Kamigawa|SOK +1 Rending Vines|SOK +1 Sasaya, Orochi Ascendant|SOK +1 Seek the Horizon|SOK +1 Sensei's Divining Top|CHK +1 Time of Need|CHK +1 Umezawa's Jitte|BOK +1 Unchecked Growth|BOK +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Tranquil Garden.dck b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Tranquil Garden.dck new file mode 100644 index 00000000000..ea8ed88f63e --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Tranquil Garden.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Tranquil Garden +[Main] +1 Blessed Breath|CHK +1 Body of Jukai|BOK +1 Eiganjo Castle|CHK +1 Elder Pine of Jukai|SOK +9 Forest|CHK +1 Forked-Branch Garami|BOK +1 Ghostly Prison|CHK +1 Harbinger of Spring|BOK +1 Hundred-Talon Kami|CHK +1 Jugan, the Rising Star|CHK +1 Kami of the Palace Fields|CHK +1 Kami of the Tended Garden|SOK +1 Kodama of the Center Tree|BOK +1 Kodama's Might|CHK +1 Long-Forgotten Gohei|CHK +1 Mark of Sakiko|BOK +1 Mikokoro, Center of the Sea|SOK +1 Nightsoil Kami|SOK +1 Okina, Temple to the Grandfathers|CHK +1 Orochi Sustainer|CHK +1 Otherworldly Journey|CHK +1 Petalmane Baku|BOK +3 Plains|CHK +1 Promised Kannushi|SOK +1 Reverence|SOK +1 Sachi, Daughter of Seshiro|CHK +1 Sakura-Tribe Springcaller|BOK +1 Shizuko, Caller of Autumn|BOK +1 Tranquil Garden|CHK +1 Unchecked Growth|BOK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/_events.txt index 586b72925fa..ce922a93874 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/_events.txt @@ -1,9 +1,9 @@ Name:Seshiro the Anointed|Deck:Seshiro the Anointed.dck|Variant:Commander|Avatar:Seshiro the Anointed|Desc: Name:Shizuko, Caller of Autumn|Deck:Shizuko, Caller of Autumn.dck|Variant:Commander|Avatar:Shizuko, Caller of Autumn|Desc: -Name:EVENT3|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Tranquil Garden|Deck:Tranquil Garden.dck|Variant:Planechase|Avatar:Tranquil Garden|Desc: Name:EVENT4|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT5|Deck:Random|Variant:None|Avatar:None|Desc: Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: -Name:EVENT7|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Iwamori of the Open Fist|Deck:Iwamori of the Open Fist.dck|Variant:Commander|Avatar:Iwamori of the Open Fist|Desc: Name:Seshiro the Anointed Avatar|Deck:Seshiro the Anointed Avatar.dck|Variant:Vanguard|Avatar:Seshiro the Anointed Avatar|Desc: Name:Random Jukai Forest|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: From 81a84307146e75099b9cf8120c2510223001f71a Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 30 Nov 2018 11:25:22 +0300 Subject: [PATCH 327/901] - Finished Jukai Forest. --- .../Kodama of the Center Tree.dck | 34 +++++++++++++++++++ .../Jukai Forest/Kodama of the North Tree.dck | 34 +++++++++++++++++++ .../Jukai Forest/Kodama of the South Tree.dck | 32 +++++++++++++++++ .../planes/Kamigawa/Jukai Forest/_events.txt | 6 ++-- 4 files changed, 103 insertions(+), 3 deletions(-) create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Kodama of the Center Tree.dck create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Kodama of the North Tree.dck create mode 100644 forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Kodama of the South Tree.dck diff --git a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Kodama of the Center Tree.dck b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Kodama of the Center Tree.dck new file mode 100644 index 00000000000..a4156be1403 --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Kodama of the Center Tree.dck @@ -0,0 +1,34 @@ +[metadata] +Name=Kodama of the Center Tree +[Commander] +1 Kodama of the Center Tree|BOK +[Main] +1 Arashi, the Sky Asunder|SOK +1 Bounteous Kirin|SOK +1 Dripping-Tongue Zubera|CHK +13 Forest|CHK +1 Forked-Branch Garami|BOK +1 Genju of the Cedars|BOK +1 Ghost-Lit Nourisher|SOK +1 Harbinger of Spring|BOK +1 Honden of Life's Web|CHK +1 Iname, Life Aspect|CHK +1 Kami of the Hunt|CHK +1 Kusari-Gama|CHK +1 Loam Dweller|BOK +1 Long-Forgotten Gohei|CHK +1 Mark of Sakiko|BOK +1 Mikokoro, Center of the Sea|SOK +1 Moss Kami|CHK +1 Okina, Temple to the Grandfathers|CHK +1 Orochi Sustainer|CHK +1 Petalmane Baku|BOK +1 Sakura-Tribe Springcaller|BOK +1 Sekki, Seasons' Guide|SOK +1 Traproot Kami|BOK +1 Unchecked Growth|BOK +1 Untaidake, the Cloud Keeper|CHK +1 Venerable Kumo|CHK +1 Wine of Blood and Iron|SOK +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Kodama of the North Tree.dck b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Kodama of the North Tree.dck new file mode 100644 index 00000000000..0395b8985f6 --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Kodama of the North Tree.dck @@ -0,0 +1,34 @@ +[metadata] +Name=Kodama of the North Tree +[Commander] +1 Kodama of the North Tree|CHK +[Main] +1 Arashi, the Sky Asunder|SOK +1 Ayumi, the Last Visitor|SOK +1 Body of Jukai|BOK +1 Briarknit Kami|SOK +13 Forest|CHK +1 Forked-Branch Garami|BOK +1 Iwamori of the Open Fist|BOK +1 Joyous Respite|CHK +1 Kodama's Might|CHK +1 Long-Forgotten Gohei|CHK +1 Mark of Sakiko|BOK +1 Mikokoro, Center of the Sea|SOK +1 Moss Kami|CHK +1 Nightsoil Kami|SOK +1 No-Dachi|CHK +1 O-Naginata|SOK +1 Okina, Temple to the Grandfathers|CHK +1 Orochi Sustainer|CHK +1 Roar of Jukai|BOK +1 Sachi, Daughter of Seshiro|CHK +1 Sakiko, Mother of Summer|BOK +1 Sakura-Tribe Springcaller|BOK +1 Tatsumasa, the Dragon's Fang|CHK +1 That Which Was Taken|BOK +1 Unchecked Growth|BOK +1 Untaidake, the Cloud Keeper|CHK +1 Wine of Blood and Iron|SOK +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Kodama of the South Tree.dck b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Kodama of the South Tree.dck new file mode 100644 index 00000000000..5b13f01a29d --- /dev/null +++ b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Kodama of the South Tree.dck @@ -0,0 +1,32 @@ +[metadata] +Name=Kodama of the South Tree +[Commander] +1 Kodama of the South Tree|CHK +[Main] +1 Ayumi, the Last Visitor|SOK +1 Baku Altar|BOK +1 Briarknit Kami|SOK +1 Budoka Pupil|BOK +1 Dripping-Tongue Zubera|CHK +1 Elder Pine of Jukai|SOK +1 Feast of Worms|CHK +1 Fiddlehead Kami|SOK +15 Forest|CHK +1 Genju of the Cedars|BOK +1 Harbinger of Spring|BOK +1 Honden of Life's Web|CHK +1 Jade Idol|CHK +1 Joyous Respite|CHK +1 Kodama's Might|CHK +1 Kodama's Reach|CHK +1 Loam Dweller|BOK +1 Long-Forgotten Gohei|CHK +1 Okina, Temple to the Grandfathers|CHK +1 Petalmane Baku|BOK +1 Soilshaper|CHK +1 Strength of Cedars|CHK +1 Traproot Kami|BOK +1 Unchecked Growth|BOK +1 Uproot|BOK +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/_events.txt index ce922a93874..f10316381a5 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/_events.txt @@ -1,9 +1,9 @@ Name:Seshiro the Anointed|Deck:Seshiro the Anointed.dck|Variant:Commander|Avatar:Seshiro the Anointed|Desc: Name:Shizuko, Caller of Autumn|Deck:Shizuko, Caller of Autumn.dck|Variant:Commander|Avatar:Shizuko, Caller of Autumn|Desc: Name:Tranquil Garden|Deck:Tranquil Garden.dck|Variant:Planechase|Avatar:Tranquil Garden|Desc: -Name:EVENT4|Deck:Random|Variant:None|Avatar:None|Desc: -Name:EVENT5|Deck:Random|Variant:None|Avatar:None|Desc: -Name:EVENT6|Deck:Random|Variant:None|Avatar:None|Desc: +Name:Kodama of the South Tree|Deck:Kodama of the South Tree.dck|Variant:Commander|Avatar:Kodama of the South Tree|Desc: +Name:Kodama of the Center Tree|Deck:Kodama of the Center Tree.dck|Variant:Commander|Avatar:Kodama of the Center Tree|Desc: +Name:Kodama of the North Tree|Deck:Kodama of the North Tree.dck|Variant:Commander|Avatar:Kodama of the North Tree|Desc: Name:Iwamori of the Open Fist|Deck:Iwamori of the Open Fist.dck|Variant:Commander|Avatar:Iwamori of the Open Fist|Desc: Name:Seshiro the Anointed Avatar|Deck:Seshiro the Anointed Avatar.dck|Variant:Vanguard|Avatar:Seshiro the Anointed Avatar|Desc: Name:Random Jukai Forest|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: From e245b7e5fae65ee5e51fd843703abdfd0398a6a0 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 30 Nov 2018 11:50:17 +0300 Subject: [PATCH 328/901] - Replaced Umezawa's Jitte with a less broken card in a couple events. --- .../res/conquest/planes/Kamigawa/Takenuma/Kuro, Pitlord.dck | 2 +- .../planes/Kamigawa/Towabara/Rune-Tail, Kitsune Ascendant.dck | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Kuro, Pitlord.dck b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Kuro, Pitlord.dck index 8ff18a7492e..7052215affc 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Kuro, Pitlord.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Kuro, Pitlord.dck @@ -17,6 +17,7 @@ Name=Kuro, Pitlord 1 Midnight Covenant|CHK 1 Mikokoro, Center of the Sea|SOK 1 Nezumi Shadow-Watcher|BOK +1 No-Dachi|CHK 1 O-Naginata|SOK 1 Painwracker Oni|CHK 1 Raving Oni-Slave|SOK @@ -25,7 +26,6 @@ Name=Kuro, Pitlord 1 Stir the Grave|BOK 14 Swamp|CHK 1 Takenuma Bleeder|BOK -1 Umezawa's Jitte|BOK 1 Untaidake, the Cloud Keeper|CHK 1 Villainous Ogre|CHK 1 Yukora, the Prisoner|BOK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Rune-Tail, Kitsune Ascendant.dck b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Rune-Tail, Kitsune Ascendant.dck index b0ff1131a1b..5e09d1cd8b7 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Rune-Tail, Kitsune Ascendant.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Rune-Tail, Kitsune Ascendant.dck @@ -15,6 +15,7 @@ Name=Rune-Tail, Kitsune Ascendant 1 Kitsune Dawnblade|SOK 1 Kitsune Healer|CHK 1 Kitsune Riftwalker|CHK +1 Manriki-Gusari|SOK 1 Mothrider Samurai|CHK 1 No-Dachi|CHK 1 Patron of the Kitsune|BOK @@ -27,4 +28,3 @@ Name=Rune-Tail, Kitsune Ascendant 1 Split-Tail Miko|BOK 1 Terashi's Grasp|BOK 1 That Which Was Taken|BOK -1 Umezawa's Jitte|BOK From b05effdc4c4ec8c647050c71ca833e4951d57f7c Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 1 Dec 2018 10:48:46 +0300 Subject: [PATCH 329/901] - Initial work on the Time Vault hidden plane. --- .../planarconquest/ConquestPlaneSelector.java | 15 ++++++++--- .../ConquestPlaneswalkScreen.java | 1 + .../planes/Dominaria/Urborg/_events.txt | 4 +-- .../Time_Vault/Chronicle of Ages/_events.txt | 9 +++++++ .../Time_Vault/The Memory Lane/_events.txt | 9 +++++++ .../res/conquest/planes/Time_Vault/cards.txt | 26 +++++++++++++++++++ .../planes/Time_Vault/plane_cards.txt | 1 + .../conquest/planes/Time_Vault/regions.txt | 2 ++ .../res/conquest/planes/Time_Vault/sets.txt | 21 +++++++++++++++ forge-gui/res/conquest/planes/planes.txt | 3 ++- .../forge/planarconquest/ConquestBattle.java | 3 +++ .../planarconquest/ConquestCommander.java | 2 +- .../forge/planarconquest/ConquestEvent.java | 12 +++++++-- .../forge/planarconquest/ConquestPlane.java | 8 ++++-- .../forge/planarconquest/ConquestRegion.java | 2 +- .../forge/planarconquest/ConquestUtil.java | 18 +++++++++++++ 16 files changed, 124 insertions(+), 12 deletions(-) create mode 100644 forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/_events.txt create mode 100644 forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/_events.txt create mode 100644 forge-gui/res/conquest/planes/Time_Vault/cards.txt create mode 100644 forge-gui/res/conquest/planes/Time_Vault/plane_cards.txt create mode 100644 forge-gui/res/conquest/planes/Time_Vault/regions.txt create mode 100644 forge-gui/res/conquest/planes/Time_Vault/sets.txt diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestPlaneSelector.java b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestPlaneSelector.java index b3a1405ff17..fb8b43dd606 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestPlaneSelector.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestPlaneSelector.java @@ -34,7 +34,7 @@ public class ConquestPlaneSelector extends FDisplayObject { private static final float MONITOR_LEFT_MULTIPLIER = 19f / 443f; private static final float ARROW_THICKNESS = Utils.scale(3); - private static final List planes = ImmutableList.copyOf(Iterables.filter(FModel.getPlanes(), new Predicate() { + private static List planes = ImmutableList.copyOf(Iterables.filter(FModel.getPlanes(), new Predicate() { @Override public boolean apply(ConquestPlane plane) { return !plane.isUnreachable(); //filter out unreachable planes @@ -131,7 +131,7 @@ public class ConquestPlaneSelector extends FDisplayObject { ConquestPlane plane = getSelectedPlane(); String desc = plane.getDescription(); if (!desc.isEmpty()) { - GuiDialog.message(plane.getDescription().replace("\\n", "\n"), plane.getName()); + GuiDialog.message(plane.getDescription().replace("\\n", "\n"), plane.getName().replace("_", " ")); } else { GuiDialog.message("This plane has no description.", plane.getName()); } @@ -206,7 +206,7 @@ public class ConquestPlaneSelector extends FDisplayObject { float monitorBottom = monitorTop + monitorHeight; float remainingHeight = h - monitorBottom; ConquestPlane plane = getSelectedPlane(); - g.drawText(plane.getName(), PLANE_NAME_FONT, Color.WHITE, textLeft, monitorBottom, w - 2 * textLeft, remainingHeight, false, HAlignment.CENTER, true); + g.drawText(plane.getName().replace("_", " " ), PLANE_NAME_FONT, Color.WHITE, textLeft, monitorBottom, w - 2 * textLeft, remainingHeight, false, HAlignment.CENTER, true); //draw left/right arrows float yMid = monitorBottom + remainingHeight / 2; @@ -224,4 +224,13 @@ public class ConquestPlaneSelector extends FDisplayObject { g.drawLine(ARROW_THICKNESS, Color.WHITE, xMid + offsetX, yMid - 1, xMid - offsetX, yMid + offsetY); rightArrowBounds = new Rectangle(w - leftArrowBounds.width, monitorBottom, leftArrowBounds.width, remainingHeight); } + + public void updateReachablePlanes() { + planes = ImmutableList.copyOf(Iterables.filter(FModel.getPlanes(), new Predicate() { + @Override + public boolean apply(ConquestPlane plane) { + return !plane.isUnreachable(); + } + })); + } } diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestPlaneswalkScreen.java b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestPlaneswalkScreen.java index 02d691189cb..ff613b75e56 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestPlaneswalkScreen.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestPlaneswalkScreen.java @@ -38,6 +38,7 @@ public class ConquestPlaneswalkScreen extends FScreen { public void onActivate() { ConquestData model = FModel.getConquest().getModel(); setHeaderCaption(model.getName()); + planeSelector.updateReachablePlanes(); planeSelector.setCurrentPlane(model.getCurrentPlane()); planeSelector.activate(); } diff --git a/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt b/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt index a7df923d827..08560d9b8d7 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt +++ b/forge-gui/res/conquest/planes/Dominaria/Urborg/_events.txt @@ -3,7 +3,7 @@ Name:Josu Vess, Lich Knight|Deck:Josu Vess, Lich Knight.dck|Variant:Commander|Av Name:Kazarov, Sengir Pureblood|Deck:Kazarov, Sengir Pureblood.dck|Variant:Commander|Avatar:Kazarov, Sengir Pureblood|Desc: Name:Arvad the Cursed|Deck:Arvad the Cursed.dck|Variant:Commander|Avatar:Arvad the Cursed|Desc: Name:Liliana, the Necromancer|Deck:Liliana, the Necromancer.dck|Variant:Planeswalker|Avatar:Liliana, the Necromancer|Desc: -Name:Isareth the Awakener|Deck:Isareth the Awakener.dck|Variant:Commander|Avatar:Isareth the Awakener|Desc: +Name:Demonlord Belzenlok|Deck:Demonlord Belzenlok.dck|Variant:Planechase|Avatar:Demonlord Belzenlok|TemporaryUnlock:Time_Vault|Desc: Name:Yargle, Glutton of Urborg|Deck:Yargle, Glutton of Urborg.dck|Variant:Commander|Avatar:Yargle, Glutton of Urborg|Desc: +Name:Isareth the Awakener|Deck:Isareth the Awakener.dck|Variant:Commander|Avatar:Isareth the Awakener|Desc: Name:Necropotence|Deck:Necropotence.dck|Variant:Vanguard|Avatar:Necropotence|Desc: -Name:Demonlord Belzenlok|Deck:Demonlord Belzenlok.dck|Variant:Planechase|Avatar:Demonlord Belzenlok|Desc: diff --git a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/_events.txt b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/_events.txt new file mode 100644 index 00000000000..66c69ba92d0 --- /dev/null +++ b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/_events.txt @@ -0,0 +1,9 @@ +Name:EVENT1|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT2|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT3|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT4|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT5|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT6|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT7|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT8|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT9|Deck:Random.dck|Variant:None|Avatar:None|Desc: diff --git a/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/_events.txt b/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/_events.txt new file mode 100644 index 00000000000..66c69ba92d0 --- /dev/null +++ b/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/_events.txt @@ -0,0 +1,9 @@ +Name:EVENT1|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT2|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT3|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT4|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT5|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT6|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT7|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT8|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:EVENT9|Deck:Random.dck|Variant:None|Avatar:None|Desc: diff --git a/forge-gui/res/conquest/planes/Time_Vault/cards.txt b/forge-gui/res/conquest/planes/Time_Vault/cards.txt new file mode 100644 index 00000000000..1f4febf286b --- /dev/null +++ b/forge-gui/res/conquest/planes/Time_Vault/cards.txt @@ -0,0 +1,26 @@ +Crown of Empires +Scepter of Empires +Throne of Empires +Roc Egg +Brindle Boar +Armored Cancrix +Academy Raider +Alaborn Cavalier +Prossh, Skyraider of Kher +Balance of Power +Beetleback Chief +Crimson Mage +Cruel Edict +Dakmor Lancer +Famine +Firewing Phoenix +Flesh to Dust +Flusterstorm +Freyalise, Llanowar's Fury +Gaea's Revenge +Ice Cage +Liliana, Heretical Healer +Mwonvuli Beast Tracker +Teferi, Temporal Archmage +Titania, Protector of Argoth +Onyx Mage \ No newline at end of file diff --git a/forge-gui/res/conquest/planes/Time_Vault/plane_cards.txt b/forge-gui/res/conquest/planes/Time_Vault/plane_cards.txt new file mode 100644 index 00000000000..53738fc9aff --- /dev/null +++ b/forge-gui/res/conquest/planes/Time_Vault/plane_cards.txt @@ -0,0 +1 @@ +Time Vault diff --git a/forge-gui/res/conquest/planes/Time_Vault/regions.txt b/forge-gui/res/conquest/planes/Time_Vault/regions.txt new file mode 100644 index 00000000000..4d358fd794e --- /dev/null +++ b/forge-gui/res/conquest/planes/Time_Vault/regions.txt @@ -0,0 +1,2 @@ +Name:Chronicle of Ages|Art:Time Vault|Colors:WUBRG +Name:The Memory Lane|Art:Cast Through Time|Colors:WUBRG diff --git a/forge-gui/res/conquest/planes/Time_Vault/sets.txt b/forge-gui/res/conquest/planes/Time_Vault/sets.txt new file mode 100644 index 00000000000..9f80ee8f007 --- /dev/null +++ b/forge-gui/res/conquest/planes/Time_Vault/sets.txt @@ -0,0 +1,21 @@ +ICE +ALL +CSP +MIR +VIS +WTH +USG +ULG +UDS +INV +PLS +APC +ODY +TOR +JUD +ONS +LGN +SCG +TSP +PLC +FUT \ No newline at end of file diff --git a/forge-gui/res/conquest/planes/planes.txt b/forge-gui/res/conquest/planes/planes.txt index 46642d91e0d..fd14c390922 100644 --- a/forge-gui/res/conquest/planes/planes.txt +++ b/forge-gui/res/conquest/planes/planes.txt @@ -1,6 +1,6 @@ Name:Alara|RegionSize:9|Desc:As the boundaries between the shards dissolve, cultures clash and wars ensue.\nConsists of 54 events. Contains cards from ALA, CON, ARB, C13, and more. Name:Amonkhet|RegionSize:9|Desc:On the surface, Amonkhet seems like a marvelous place to live, but something unsettling and nefarious lurks behind the grand facade.\nConsists of 45 events. Contains cards from AKH, HOU, some C17, and Amonkhet Invocations. -Name:Dominaria|RegionSize:9|Desc:The legendary plane, once the Nexus of the Multiverse. With the last Time Rift closed, Dominaria's mana flowed back into the land instantaneously, and the world healed and rejuvenated quickly with that infusion of power. After generations of peaceful development, much of Dominaria has managed to rebuild the cultures of its past. Yet, shortly after the Mending, the Cabal began to grow in strength and came under the control of the Demonlord Belzenlok.\nConsists of 45 events. Contains cards from DOM and most of M19 and C18. +Name:Dominaria|RegionSize:9|Desc:The legendary plane, once the Nexus of the Multiverse. With the last Time Rift closed, Dominaria's mana flowed back into the land instantaneously, and the world healed and rejuvenated quickly with that infusion of power. After generations of peaceful development, much of Dominaria has managed to rebuild the cultures of its past. Yet, shortly after the Mending, the Cabal began to grow in strength and came under the control of the Demonlord Belzenlok. Legends say that a mysterious Time Vault is hidden somewhere deep in this plane, though no one knows if this rumor is true...\nConsists of 45 events. Contains cards from DOM and most of M19 and C18. Name:Innistrad|RegionSize:9|Desc:On this plane, humanity is terrorized by vampires, werewolves, zombies, and ghouls.\nConsists of 45 events. Contains cards from ISD, DKA, AVR, SOI, EMN, and C14. Name:Ixalan|RegionSize:9|Desc:On Ixalan, the untamed jungles have hidden a coveted secret: Orazca, the city of gold, and rivals embark on a journey to claim the plane's greatest fortune for themselves.\nConsists of 45 events. Contains cards from XLN, RIX. Name:Kaladesh|RegionSize:9|Desc:Kaladesh is a living work of art. Aether is inextricably woven into the world's culture of inspired invention.\nConsists of 45 events. Contains cards from KLD, AER, some C17, and Kaladesh Inventions. @@ -14,5 +14,6 @@ Name:Regatha|RegionSize:6|Unreachable:True|Desc: Name:Shandalar|RegionSize:9|Unreachable:True|Desc: Name:Tarkir|RegionSize:9|Desc:A plane dominated by five powerful clans... or five powerful dragon lords.\nConsists of 45 events. Contains cards from KTK, FRF, DTK, CMD, CNS/CN2, some C17. Name:Theros|RegionSize:9|Desc:Mortals tremble before an awe-inspiring pantheon of gods.\nConsists of 45 events. Contains cards from THS, BNG, JOU, HOP, PCA, and more. +Name:Time_Vault|RegionSize:9|Unreachable:True|Desc:A mysterious and legendary Time Vault, allowing one to travel back in time and revisit the ages long past and experience the history of Dominaria.\nConsists of 18 events. Contains cards from ICE, ALL, CSP, MIR, VIS, WTH, USG, ULG, UDS, INV, PLS, APC, ODY, TOR, JUD, ONS, LGN, SCG, TSP, PLC, and FUT.\n\nThe portal to this plane is unstable and will close soon, so hasten your step, planeswalker, while you have the chance... Name:Ulgrotha|RegionSize:6|Unreachable:True|Desc: Name:Zendikar|RegionSize:9|Desc:This land of primal mana was lethal even before its Eldrazi prisoners escaped.\nConsists of 60 events. Contains cards from ZEN, WWK, ROE, BFZ, OGW, and C16. diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestBattle.java b/forge-gui/src/main/java/forge/planarconquest/ConquestBattle.java index f0c3b53550c..08c5adba2c5 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestBattle.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestBattle.java @@ -50,6 +50,9 @@ public abstract class ConquestBattle { view.getBtnRestart().setVisible(false); view.getBtnQuit().setText("Great!"); model.addWin(this); + if (location.getEvent().getTemporaryUnlock() != null) { + ConquestUtil.makePlaneTemporarilyAccessible(location.getEvent().getTemporaryUnlock()); + } } else { view.getBtnRestart().setVisible(true); diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestCommander.java b/forge-gui/src/main/java/forge/planarconquest/ConquestCommander.java index 293cb05e675..74048caf5b2 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestCommander.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestCommander.java @@ -113,7 +113,7 @@ public class ConquestCommander implements InventoryItem, IXmlWritable { if (originPlane == null) { return ""; } - return originPlane.getName() + " - " + originRegionName; + return originPlane.getName().replace("_", " ") + " - " + originRegionName; } public ConquestPlane getOriginPlane() { diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestEvent.java b/forge-gui/src/main/java/forge/planarconquest/ConquestEvent.java index ce31befc4dd..c6429798245 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestEvent.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestEvent.java @@ -25,16 +25,18 @@ public class ConquestEvent { private final String deckPath; private final Set variants; private final String avatar; + private final String tempUnlock; private PaperCard avatarCard; private Deck deck; - public ConquestEvent(ConquestRegion region0, String name0, String description0, String deckPath0, Set variants0, String avatar0) { + public ConquestEvent(ConquestRegion region0, String name0, String description0, String deckPath0, Set variants0, String avatar0, String tempUnlock0) { region = region0; name = name0; description = description0; deckPath = deckPath0; variants = variants0; avatar = avatar0; + tempUnlock = tempUnlock0; } public String getName() { @@ -73,6 +75,8 @@ public class ConquestEvent { return avatar; } + public String getTemporaryUnlock() { return tempUnlock; } + public PaperCard getAvatarCard() { if (avatarCard == null && avatar != null) { //attempt to load card from plane's card pool @@ -120,6 +124,7 @@ public class ConquestEvent { Set variants = EnumSet.noneOf(GameType.class); String avatar = null; String description = null; + String tempUnlock = null; String key, value; String[] pieces = line.split("\\|"); @@ -159,6 +164,9 @@ public class ConquestEvent { case "desc": description = value; break; + case "temporaryunlock": + tempUnlock = value; + break; default: alertInvalidLine(line, "Invalid event definition."); break; @@ -168,7 +176,7 @@ public class ConquestEvent { deck = name + ".dck"; //assume deck file has same name if not specified } deck = file.getParent() + ForgeConstants.PATH_SEPARATOR + deck; - return new ConquestEvent(region, name, description, deck, variants, avatar); + return new ConquestEvent(region, name, description, deck, variants, avatar, tempUnlock); } } diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestPlane.java b/forge-gui/src/main/java/forge/planarconquest/ConquestPlane.java index f8cc1ca59ca..0e67a770e08 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestPlane.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestPlane.java @@ -43,7 +43,7 @@ public class ConquestPlane { private final String name; private final String directory; private final String description; - private final boolean unreachable; + private boolean unreachable; private final int rowsPerRegion; private final int cols; @@ -93,6 +93,10 @@ public class ConquestPlane { return unreachable; } + public void setTemporarilyReachable(boolean reachable) { + unreachable = !reachable; + } + public FCollectionView getRegions() { ensureRegionsLoaded(); return regions; @@ -173,7 +177,7 @@ public class ConquestPlane { } //if not enough events defined, create random events for remaining while (eventIndex < regionEndIndex) { - events[eventIndex++] = new ConquestEvent(region, region.getName() + " - Random " + ((eventIndex % eventsPerRegion) + 1), null, null, EnumSet.noneOf(GameType.class), null); + events[eventIndex++] = new ConquestEvent(region, region.getName() + " - Random " + ((eventIndex % eventsPerRegion) + 1), null, null, EnumSet.noneOf(GameType.class), null, null); } regionEndIndex += eventsPerRegion; } diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestRegion.java b/forge-gui/src/main/java/forge/planarconquest/ConquestRegion.java index 4dbd9cdeb0a..ed1904e2136 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestRegion.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestRegion.java @@ -86,7 +86,7 @@ public class ConquestRegion { } public String toString() { - return plane.getName() + " - " + name; + return plane.getName().replace("_", " ") + " - " + name; } public static class Reader extends FCollectionReader { diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestUtil.java b/forge-gui/src/main/java/forge/planarconquest/ConquestUtil.java index 65b177d2b39..d81a3899b62 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestUtil.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestUtil.java @@ -154,6 +154,24 @@ public class ConquestUtil { return pool; } + public static ConquestPlane getPlaneByName(String planeName) { + for (ConquestPlane plane : FModel.getPlanes()) { + if (plane.getName().equals(planeName)) { + return plane; + } + } + return null; + } + + public static void makePlaneTemporarilyAccessible(String planeName) { + ConquestPlane plane = getPlaneByName(planeName); + if (plane != null && plane.isUnreachable()) { + plane.setTemporarilyReachable(true); + } else { + System.err.println("Could not find plane to mark as temporarily accessible: " + planeName); + } + } + public static Iterable getStartingPlaneswalkerOptions(final PaperCard startingCommander) { final byte colorIdentity = startingCommander.getRules().getColorIdentity().getColor(); return Iterables.filter(FModel.getMagicDb().getCommonCards().getUniqueCards(), new Predicate() { From e8229508f885a78b478081c92f789a52761ad9c5 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 1 Dec 2018 21:18:03 +0300 Subject: [PATCH 330/901] - More work on the Time Vault realm. Several AI flag fixes. --- .../res/cardsfolder/i/infinite_hourglass.txt | 3 +- .../cardsfolder/m/magus_of_the_coffers.txt | 3 +- .../res/cardsfolder/s/songs_of_the_damned.txt | 3 +- .../res/cardsfolder/w/withering_wisps.txt | 2 +- .../Chronicle of Ages/Mirri the Cursed.dck | 29 ++++++++++++++ .../Teneb, the Harvester.dck | 39 +++++++++++++++++++ .../Time_Vault/Chronicle of Ages/_events.txt | 4 +- .../res/conquest/planes/Time_Vault/sets.txt | 3 +- forge-gui/res/conquest/planes/planes.txt | 2 +- 9 files changed, 78 insertions(+), 10 deletions(-) create mode 100644 forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Mirri the Cursed.dck create mode 100644 forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Teneb, the Harvester.dck diff --git a/forge-gui/res/cardsfolder/i/infinite_hourglass.txt b/forge-gui/res/cardsfolder/i/infinite_hourglass.txt index 35f12c0b512..33c2264e429 100644 --- a/forge-gui/res/cardsfolder/i/infinite_hourglass.txt +++ b/forge-gui/res/cardsfolder/i/infinite_hourglass.txt @@ -5,7 +5,8 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ TIME | CounterNum$ 1 S:Mode$ Continuous | Affected$ Creature | AddPower$ X | Description$ All creatures get +1/+0 for each time counter on CARDNAME. SVar:X:Count$CardCounters.TIME -A:AB$ RemoveCounter | Cost$ 3 | CounterType$ TIME | CounterNum$ 1 | ActivationPhases$ Upkeep | AnyPlayer$ True | SpellDescription$ Remove a time counter from CARDNAME. Any player may activate this ability but only during any upkeep step. +#TODO: Improve the AI for this +A:AB$ RemoveCounter | Cost$ 3 | CounterType$ TIME | CounterNum$ 1 | ActivationPhases$ Upkeep | AnyPlayer$ True | AILogic$ Never | SpellDescription$ Remove a time counter from CARDNAME. Any player may activate this ability but only during any upkeep step. AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/infinite_hourglass.jpg Oracle:At the beginning of your upkeep, put a time counter on Infinite Hourglass.\nAll creatures get +1/+0 for each time counter on Infinite Hourglass.\n{3}: Remove a time counter from Infinite Hourglass. Any player may activate this ability but only during any upkeep step. diff --git a/forge-gui/res/cardsfolder/m/magus_of_the_coffers.txt b/forge-gui/res/cardsfolder/m/magus_of_the_coffers.txt index 3cb6233625c..3d3657d373b 100644 --- a/forge-gui/res/cardsfolder/m/magus_of_the_coffers.txt +++ b/forge-gui/res/cardsfolder/m/magus_of_the_coffers.txt @@ -2,8 +2,7 @@ Name:Magus of the Coffers ManaCost:4 B Types:Creature Human Wizard PT:4/4 -A:AB$ Mana | Cost$ 2 T | Produced$ B | Amount$ X | References$ X | SpellDescription$ Add {B} for each Swamp you control. +A:AB$ Mana | Cost$ 2 T | Produced$ B | Amount$ X | References$ X | AILogic$ ManaRitual | AINoRecursiveCheck$ True | SpellDescription$ Add {B} for each Swamp you control. SVar:X:Count$Valid Swamp.YouCtrl -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/magus_of_the_coffers.jpg Oracle:{2}, {T}: Add {B} for each Swamp you control. diff --git a/forge-gui/res/cardsfolder/s/songs_of_the_damned.txt b/forge-gui/res/cardsfolder/s/songs_of_the_damned.txt index d1427b86bf2..a44175f7fea 100644 --- a/forge-gui/res/cardsfolder/s/songs_of_the_damned.txt +++ b/forge-gui/res/cardsfolder/s/songs_of_the_damned.txt @@ -1,8 +1,7 @@ Name:Songs of the Damned ManaCost:B Types:Instant -A:SP$ Mana | Cost$ B | Produced$ B | Amount$ X | References$ X | SpellDescription$ Add {B} for each creature card in your graveyard. +A:SP$ Mana | Cost$ B | Produced$ B | Amount$ X | References$ X | AILogic$ ManaRitual | AINoRecursiveCheck$ True | SpellDescription$ Add {B} for each creature card in your graveyard. SVar:X:Count$TypeInYourYard.Creature -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/songs_of_the_damned.jpg Oracle:Add {B} for each creature card in your graveyard. diff --git a/forge-gui/res/cardsfolder/w/withering_wisps.txt b/forge-gui/res/cardsfolder/w/withering_wisps.txt index 0f138c59a50..90a0b47b2b1 100644 --- a/forge-gui/res/cardsfolder/w/withering_wisps.txt +++ b/forge-gui/res/cardsfolder/w/withering_wisps.txt @@ -3,7 +3,7 @@ ManaCost:1 B B Types:Enchantment T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | IsPresent$ Creature | PresentCompare$ EQ0 | Execute$ TrigSac | TriggerDescription$ At the beginning of the end step, if no creatures are on the battlefield, sacrifice CARDNAME. SVar:TrigSac:DB$Sacrifice | Defined$ Self -A:AB$ DamageAll | Cost$ B | NumDmg$ 1 | ValidCards$ Creature | ValidPlayers$ Player | ValidDescription$ each creature and each player. | ActivationLimit$ X | References$ X | SpellDescription$ CARDNAME deals 1 damage to each creature and each player. Activate this ability no more times each turn than the number of snow Swamps you control. +A:AB$ DamageAll | Cost$ B | NumDmg$ 1 | ValidCards$ Creature | ValidPlayers$ Player | ValidDescription$ each creature and each player. | ActivationLimit$ X | References$ X | AILogic$ DmgAllCreaturesAndPlayers | SpellDescription$ CARDNAME deals 1 damage to each creature and each player. Activate this ability no more times each turn than the number of snow Swamps you control. SVar:X:Count$Valid Swamp.Snow+YouCtrl SVar:NeedsToPlay:Creature AI:RemoveDeck:Random diff --git a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Mirri the Cursed.dck b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Mirri the Cursed.dck new file mode 100644 index 00000000000..4ba2847e0d7 --- /dev/null +++ b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Mirri the Cursed.dck @@ -0,0 +1,29 @@ +[metadata] +Name=Mirri the Cursed +[Commander] +1 Mirri the Cursed|PLC +[Main] +1 Abyssal Specter|ICE +1 Bridge from Below|FUT +1 Dark Ritual|ICE +1 Deepcavern Imp|FUT +1 Enslave|PLC +1 Frenzy Sliver|FUT +1 Herald of Leshrac|CSP +1 Hivestone|TSP +1 Lim-Dul the Necromancer|TSP +1 Magus of the Coffers|PLC +1 Necropotence|ICE +1 Nether Traitor|TSP +1 Paradise Plume|TSP +1 Phobian Phantasm|CSP +1 Shimian Specter|FUT +1 Spitting Sliver|PLC +1 Stromgald Crusader|CSP +1 Stronghold Overseer|TSP +1 Sudden Death|TSP +16 Swamp|TSP +1 Temporal Extortion|PLC +1 Tombstalker|FUT +1 Vampiric Sliver|TSP +1 Veilstone Amulet|FUT diff --git a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Teneb, the Harvester.dck b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Teneb, the Harvester.dck new file mode 100644 index 00000000000..87f1358589d --- /dev/null +++ b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Teneb, the Harvester.dck @@ -0,0 +1,39 @@ +[metadata] +Name=Teneb, the Harvester +[Commander] +1 Teneb, the Harvester|PLC +[Main] +1 Aspect of Mongoose|TSP +1 Bridge from Below|FUT +1 Brushland|ICE +1 Buried Alive|ODY +1 Cabal Ritual|TOR +1 Caves of Koilos|APC +1 Dance of the Dead|ICE +1 Dark Ritual|USG +1 Dread Return|TSP +1 Dryad Arbor|FUT +1 Earsplitting Rats|JUD +1 Entomb|ODY +1 Forest|TSP +1 Hymn of Rebirth|ICE +1 Hypnotic Specter|4ED +1 Hypnox|TOR +1 Living Death|COM +1 Living End|TSP +1 Llanowar Wastes|APC +1 Lotus Bloom|TSP +1 Lotus Vale|WTH +1 Panglacial Wurm|CSP +1 Phantasmagorian|PLC +1 Plains|TSP +1 Pox|ICE +1 Reya Dawnbringer|INV +1 Silver Seraph|JUD +1 Smallpox|TSP +1 Spirit of the Night|MIR +1 Stronghold Rats|FUT +6 Swamp|TSP +1 Thran Quarry|USG +1 Undiscovered Paradise|VIS +1 Yawgmoth's Will|USG diff --git a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/_events.txt b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/_events.txt index 66c69ba92d0..21f1e200673 100644 --- a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/_events.txt +++ b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/_events.txt @@ -1,5 +1,5 @@ -Name:EVENT1|Deck:Random.dck|Variant:None|Avatar:None|Desc: -Name:EVENT2|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:Mirri the Cursed|Deck:Mirri the Cursed.dck|Variant:Commander|Avatar:Mirri the Cursed|Desc: +Name:Teneb, the Harvester|Deck:Teneb, the Harvester.dck|Variant:Commander|Avatar:Teneb, the Harvester|Desc: Name:EVENT3|Deck:Random.dck|Variant:None|Avatar:None|Desc: Name:EVENT4|Deck:Random.dck|Variant:None|Avatar:None|Desc: Name:EVENT5|Deck:Random.dck|Variant:None|Avatar:None|Desc: diff --git a/forge-gui/res/conquest/planes/Time_Vault/sets.txt b/forge-gui/res/conquest/planes/Time_Vault/sets.txt index 9f80ee8f007..b5e136bebac 100644 --- a/forge-gui/res/conquest/planes/Time_Vault/sets.txt +++ b/forge-gui/res/conquest/planes/Time_Vault/sets.txt @@ -18,4 +18,5 @@ LGN SCG TSP PLC -FUT \ No newline at end of file +FUT +COM diff --git a/forge-gui/res/conquest/planes/planes.txt b/forge-gui/res/conquest/planes/planes.txt index fd14c390922..2a2d1ab4b5c 100644 --- a/forge-gui/res/conquest/planes/planes.txt +++ b/forge-gui/res/conquest/planes/planes.txt @@ -14,6 +14,6 @@ Name:Regatha|RegionSize:6|Unreachable:True|Desc: Name:Shandalar|RegionSize:9|Unreachable:True|Desc: Name:Tarkir|RegionSize:9|Desc:A plane dominated by five powerful clans... or five powerful dragon lords.\nConsists of 45 events. Contains cards from KTK, FRF, DTK, CMD, CNS/CN2, some C17. Name:Theros|RegionSize:9|Desc:Mortals tremble before an awe-inspiring pantheon of gods.\nConsists of 45 events. Contains cards from THS, BNG, JOU, HOP, PCA, and more. -Name:Time_Vault|RegionSize:9|Unreachable:True|Desc:A mysterious and legendary Time Vault, allowing one to travel back in time and revisit the ages long past and experience the history of Dominaria.\nConsists of 18 events. Contains cards from ICE, ALL, CSP, MIR, VIS, WTH, USG, ULG, UDS, INV, PLS, APC, ODY, TOR, JUD, ONS, LGN, SCG, TSP, PLC, and FUT.\n\nThe portal to this plane is unstable and will close soon, so hasten your step, planeswalker, while you have the chance... +Name:Time_Vault|RegionSize:9|Unreachable:True|Desc:A mysterious and legendary Time Vault, allowing one to travel back in time and revisit the ages long past and experience the history of Dominaria.\nConsists of 18 events. Contains cards from ICE, ALL, CSP, MIR, VIS, WTH, USG, ULG, UDS, INV, PLS, APC, ODY, TOR, JUD, ONS, LGN, SCG, TSP, PLC, FUT, and COM.\n\nThe portal to this plane is unstable and will close soon, so hasten your step, planeswalker, while you have the chance... Name:Ulgrotha|RegionSize:6|Unreachable:True|Desc: Name:Zendikar|RegionSize:9|Desc:This land of primal mana was lethal even before its Eldrazi prisoners escaped.\nConsists of 60 events. Contains cards from ZEN, WWK, ROE, BFZ, OGW, and C16. From 6b780497868b06c409c5ccbddde86e74b67eb605 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 1 Dec 2018 21:29:46 +0300 Subject: [PATCH 331/901] - Tweaked the Teneb event. --- .../Time_Vault/Chronicle of Ages/Teneb, the Harvester.dck | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Teneb, the Harvester.dck b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Teneb, the Harvester.dck index 87f1358589d..11804795867 100644 --- a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Teneb, the Harvester.dck +++ b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Teneb, the Harvester.dck @@ -3,6 +3,7 @@ Name=Teneb, the Harvester [Commander] 1 Teneb, the Harvester|PLC [Main] +1 Akroma, Angel of Wrath|LGN 1 Aspect of Mongoose|TSP 1 Bridge from Below|FUT 1 Brushland|ICE @@ -18,7 +19,6 @@ Name=Teneb, the Harvester 1 Forest|TSP 1 Hymn of Rebirth|ICE 1 Hypnotic Specter|4ED -1 Hypnox|TOR 1 Living Death|COM 1 Living End|TSP 1 Llanowar Wastes|APC From 5e4fe05c0d9c1a277019abc65d8c51d93e37f1ae Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 1 Dec 2018 22:14:08 +0300 Subject: [PATCH 332/901] - Added an event to Time Vault. --- .../res/cardsfolder/l/lovisa_coldeyes.txt | 1 + .../Chronicle of Ages/Lovisa Coldeyes.dck | 34 +++++++++++++++++++ .../Time_Vault/Chronicle of Ages/_events.txt | 2 +- 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Lovisa Coldeyes.dck diff --git a/forge-gui/res/cardsfolder/l/lovisa_coldeyes.txt b/forge-gui/res/cardsfolder/l/lovisa_coldeyes.txt index 55d920e9627..7a724f56be9 100644 --- a/forge-gui/res/cardsfolder/l/lovisa_coldeyes.txt +++ b/forge-gui/res/cardsfolder/l/lovisa_coldeyes.txt @@ -4,5 +4,6 @@ Types:Legendary Creature Human PT:3/3 S:Mode$ Continuous | Affected$ Creature.Warrior,Creature.Berserker,Creature.Barbarian | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Haste | Description$ Each creature that's a Barbarian, a Warrior, or a Berserker gets +2/+2 and has haste. SVar:PlayMain1:TRUE +SVar:BuffedBy:Creature.Warrior,Creature.Berserker,Creature.Barbarian SVar:Picture:http://www.wizards.com/global/images/magic/general/lovisa_coldeyes.jpg Oracle:Each creature that's a Barbarian, a Warrior, or a Berserker gets +2/+2 and has haste. diff --git a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Lovisa Coldeyes.dck b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Lovisa Coldeyes.dck new file mode 100644 index 00000000000..768fafff577 --- /dev/null +++ b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Lovisa Coldeyes.dck @@ -0,0 +1,34 @@ +[metadata] +Name=Lovisa Coldeyes +[Commander] +1 Lovisa Coldeyes|CSP +[Main] +1 Balduvian Barbarians|ICE +1 Balduvian Rage|CSP +1 Bloodshot Trainee|FUT +1 Bravado|USG +1 Brute Force|PLC +1 Cave Sense|MMQ +1 Dust Corona|PLC +1 Fatal Frenzy|PLC +1 Fiery Mantle|USG +1 Gathan Raiders|FUT +1 Ghitu Encampment|ULG +1 Ghitu Firebreathing|TSP +1 Ghitu War Cry|ULG +1 Goblin Berserker|UDS +1 Goblin Raider|USG +1 Goblin Spelunkers|USG +1 Granite Grip|ULG +1 Keldon Champion|UDS +1 Keldon Halberdier|TSP +1 Keldon Marauders|PLC +1 Keldon Megaliths|FUT +1 Mogg Sentry|PLS +13 Mountain|TSP +1 Power Matrix|MMQ +1 Shiv's Embrace|USG +1 Tahngarth, Talruum Hero|PLS|1 +1 Thran Golem|UDS +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/_events.txt b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/_events.txt index 21f1e200673..956dd8b42f1 100644 --- a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/_events.txt +++ b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/_events.txt @@ -1,6 +1,6 @@ Name:Mirri the Cursed|Deck:Mirri the Cursed.dck|Variant:Commander|Avatar:Mirri the Cursed|Desc: Name:Teneb, the Harvester|Deck:Teneb, the Harvester.dck|Variant:Commander|Avatar:Teneb, the Harvester|Desc: -Name:EVENT3|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:Lovisa Coldeyes|Deck:Lovisa Coldeyes.dck|Variant:Commander|Avatar:Lovisa Coldeyes|Desc: Name:EVENT4|Deck:Random.dck|Variant:None|Avatar:None|Desc: Name:EVENT5|Deck:Random.dck|Variant:None|Avatar:None|Desc: Name:EVENT6|Deck:Random.dck|Variant:None|Avatar:None|Desc: From 72cbeef71cf8b1e7d70723e5cbb37608533d5bd1 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 2 Dec 2018 14:10:31 +0300 Subject: [PATCH 333/901] - Added 4 events to Time Vault. --- .../Akroma, Angel of Wrath.dck | 32 +++++++++++++++ .../Chronicle of Ages/Birds of Paradise.dck | 35 ++++++++++++++++ .../Rofellos, Llanowar Emissary.dck | 34 +++++++++++++++ .../Chronicle of Ages/Zur the Enchanter.dck | 41 +++++++++++++++++++ .../Time_Vault/Chronicle of Ages/_events.txt | 8 ++-- 5 files changed, 146 insertions(+), 4 deletions(-) create mode 100644 forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Akroma, Angel of Wrath.dck create mode 100644 forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Birds of Paradise.dck create mode 100644 forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Rofellos, Llanowar Emissary.dck create mode 100644 forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Zur the Enchanter.dck diff --git a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Akroma, Angel of Wrath.dck b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Akroma, Angel of Wrath.dck new file mode 100644 index 00000000000..8489c188d4f --- /dev/null +++ b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Akroma, Angel of Wrath.dck @@ -0,0 +1,32 @@ +[metadata] +Name=Akroma, Angel of Wrath +[Commander] +1 Akroma, Angel of Wrath|LGN +[Main] +1 Adarkar Valkyrie|CSP +1 Akroma's Memorial|FUT +1 Angel of Retribution|TOR +1 Angel's Trumpet|ULG +1 Angelic Page|USG +1 Aven Riftwatcher|PLC +1 Battle Screech|JUD +1 Exalted Angel|ONS +1 Guided Strike|JUD +1 Herald of Serra|USG +1 Malach of the Dawn|PLC +1 Mana Tithe|PLC +1 Opal Archangel|USG +1 Opal Guardian|TSP +1 Pegasus Charger|USG +15 Plains|USG +1 Radiant, Archangel|ULG +1 Reya Dawnbringer|INV +1 Serra Avenger|TSP +1 Silver Seraph|JUD +1 Soulcatcher|ODY +1 Suntail Hawk|JUD +1 Swords to Plowshares|ICE +1 Thunder Totem|TSP +1 Voice of All|PLS +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Birds of Paradise.dck b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Birds of Paradise.dck new file mode 100644 index 00000000000..a71d72181b8 --- /dev/null +++ b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Birds of Paradise.dck @@ -0,0 +1,35 @@ +[metadata] +Name=Birds of Paradise +[Avatar] +1 Birds of Paradise Avatar|VAN|1 +[Main] +1 Arcane Denial|ALL|1 +1 Cancel|TSP +1 Complicate|ONS +1 Counterspell|ICE +1 Cromat|APC +1 Darigaaz, the Igniter|INV +1 Delay|FUT +1 Destructive Flow|PLS +1 Dissipate|MIR +1 Exclude|INV +1 Force Void|ICE +3 Forest|ONS +1 Guided Passage|APC +1 Intet, the Dreamer|PLC +4 Island|ONS +1 Memory Lapse|MIR +1 Miscalculation|ULG +3 Mountain|ONS|1 +1 Opaline Sliver|TSP +3 Plains|ONS +1 Power Sink|USG +1 Rith, the Awakener|INV +1 Sliver Legion|FUT +1 Sliver Overlord|SCG +1 Spell Burst|TSP +3 Swamp|ONS|1 +1 Syncopate|ODY +1 Teneb, the Harvester|PLC +1 Vorosh, the Hunter|PLC +[Sideboard] diff --git a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Rofellos, Llanowar Emissary.dck b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Rofellos, Llanowar Emissary.dck new file mode 100644 index 00000000000..8c4616831e5 --- /dev/null +++ b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Rofellos, Llanowar Emissary.dck @@ -0,0 +1,34 @@ +[metadata] +Name=Rofellos, Llanowar Emissary +[Commander] +1 Rofellos, Llanowar Emissary|UDS +[Main] +1 Anurid Swarmsnapper|JUD +1 Dark Depths|CSP +1 Decree of Savagery|SCG +1 Dryad Arbor|FUT +1 Explosive Growth|INV +13 Forest|USG +1 Fyndhorn Elder|ICE +1 Fyndhorn Elves|ICE +1 Gaea's Cradle|USG +1 Giant Growth|ICE +1 Havenwood Wurm|TSP +1 Magus of the Vineyard|FUT +1 Might of Oaks|ULG +1 Molimo, Maro-Sorcerer|INV +1 Mythic Proportions|ONS +1 Panglacial Wurm|CSP +1 Priest of Titania|USG +1 Quirion Elves|INV +1 Shape of the Wiitigo|CSP +1 Silvos, Rogue Elemental|ONS +1 Sylvan Might|ODY +1 Thorn Elemental|UDS +1 Thriss, Nantuko Primus|JUD +1 Werebear|ODY +1 Wirewood Elf|ONS +1 Wirewood Pride|ONS +1 Yavimaya Wurm|ULG +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Zur the Enchanter.dck b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Zur the Enchanter.dck new file mode 100644 index 00000000000..a998124e5dc --- /dev/null +++ b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Zur the Enchanter.dck @@ -0,0 +1,41 @@ +[metadata] +Name=Zur the Enchanter +[Commander] +1 Zur the Enchanter|CSP +[Main] +1 Academy Researchers|USG +1 Adarkar Wastes|ICE +1 Auramancer|ODY +1 Cloak of Mists|USG +1 Crypt Sliver|LGN +1 Dromar's Cavern|PLS +1 Empyrial Armor|WTH +1 Fear|ICE +1 Gemstone Caverns|TSP +1 Ghostly Wings|TOR +1 Grand Coliseum|ONS +1 Griffin Guide|TSP +3 Island|INV +1 Lotus Vale|WTH +1 Nomad Mythmaker|JUD +1 Opaline Sliver|TSP +3 Plains|INV +1 Plated Sliver|LGN +1 Rime Transfusion|CSP +1 Screeching Sliver|TSP +1 Shadow Sliver|TSP +1 Sidewinder Sliver|TSP +1 Sinew Sliver|PLC +1 Sinister Strength|PLS +1 Sleeper's Robe|INV +1 Snow Devil|ICE +1 Spectral Sliver|LGN +1 Strength of Lunacy|TOR +2 Swamp|INV +1 Thran Quarry|USG +1 Twisted Experiment|UDS +1 Vampiric Link|PLC +1 Wings of Aesthir|ICE +1 Wings of Hope|INV +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/_events.txt b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/_events.txt index 956dd8b42f1..bb9b17ddb6a 100644 --- a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/_events.txt +++ b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/_events.txt @@ -1,9 +1,9 @@ Name:Mirri the Cursed|Deck:Mirri the Cursed.dck|Variant:Commander|Avatar:Mirri the Cursed|Desc: Name:Teneb, the Harvester|Deck:Teneb, the Harvester.dck|Variant:Commander|Avatar:Teneb, the Harvester|Desc: Name:Lovisa Coldeyes|Deck:Lovisa Coldeyes.dck|Variant:Commander|Avatar:Lovisa Coldeyes|Desc: -Name:EVENT4|Deck:Random.dck|Variant:None|Avatar:None|Desc: -Name:EVENT5|Deck:Random.dck|Variant:None|Avatar:None|Desc: -Name:EVENT6|Deck:Random.dck|Variant:None|Avatar:None|Desc: -Name:EVENT7|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:Zur the Enchanter|Deck:Zur the Enchanter.dck|Variant:Commander|Avatar:Zur the Enchanter|Desc: +Name:Birds of Paradise|Deck:Birds of Paradise.dck|Variant:Vanguard|Avatar:Birds of Paradise|Desc: +Name:Rofellos, Llanowar Emissary|Deck:Rofellos, Llanowar Emissary.dck|Variant:Commander|Avatar:Rofellos, Llanowar Emissary|Desc: +Name:Akroma, Angel of Wrath|Deck:Akroma, Angel of Wrath.dck|Variant:Commander|Avatar:Akroma, Angel of Wrath|Desc: Name:EVENT8|Deck:Random.dck|Variant:None|Avatar:None|Desc: Name:EVENT9|Deck:Random.dck|Variant:None|Avatar:None|Desc: From 1698ea5bf1e75e8b18fbc3a1bef8f97e239952d3 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 2 Dec 2018 16:18:48 +0300 Subject: [PATCH 334/901] - Secret areas in Planar Conquest are now locked once the player moves out of the event location. --- .../planarconquest/ConquestMultiverseScreen.java | 15 +++++---------- .../java/forge/planarconquest/ConquestBattle.java | 3 ++- .../java/forge/planarconquest/ConquestUtil.java | 8 ++++---- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestMultiverseScreen.java b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestMultiverseScreen.java index 06d4cc47f0d..5185152569a 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestMultiverseScreen.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestMultiverseScreen.java @@ -2,6 +2,7 @@ package forge.screens.planarconquest; import java.util.List; +import forge.planarconquest.*; import org.apache.commons.lang3.StringUtils; import com.badlogic.gdx.graphics.Color; @@ -28,19 +29,9 @@ import forge.card.ColorSet; import forge.card.CardDetailUtil.DetailColors; import forge.item.PaperCard; import forge.model.FModel; -import forge.planarconquest.ConquestAwardPool; -import forge.planarconquest.ConquestData; -import forge.planarconquest.ConquestBattle; -import forge.planarconquest.ConquestChaosBattle; -import forge.planarconquest.ConquestEvent; import forge.planarconquest.ConquestEvent.ChaosWheelOutcome; import forge.planarconquest.ConquestEvent.ConquestEventRecord; -import forge.planarconquest.ConquestLocation; -import forge.planarconquest.ConquestPlane; import forge.planarconquest.ConquestPreferences.CQPref; -import forge.planarconquest.ConquestPlaneData; -import forge.planarconquest.ConquestReward; -import forge.planarconquest.ConquestRegion; import forge.screens.FScreen; import forge.screens.LoadingOverlay; import forge.toolbox.FButton; @@ -547,6 +538,10 @@ public class ConquestMultiverseScreen extends FScreen { @Override protected void onEnd(boolean endingAll) { + String secretArea = model.getCurrentLocation().getEvent().getTemporaryUnlock(); + if (secretArea != null) { + ConquestUtil.setPlaneTemporarilyAccessible(secretArea, false); + } model.setCurrentLocation(path.get(path.size() - 1)); model.saveData(); //save new location activeMoveAnimation = null; diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestBattle.java b/forge-gui/src/main/java/forge/planarconquest/ConquestBattle.java index 08c5adba2c5..de045ebf130 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestBattle.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestBattle.java @@ -51,7 +51,8 @@ public abstract class ConquestBattle { view.getBtnQuit().setText("Great!"); model.addWin(this); if (location.getEvent().getTemporaryUnlock() != null) { - ConquestUtil.makePlaneTemporarilyAccessible(location.getEvent().getTemporaryUnlock()); + // secret area for this event, unlock it until the player moves + ConquestUtil.setPlaneTemporarilyAccessible(location.getEvent().getTemporaryUnlock(), true); } } else { diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestUtil.java b/forge-gui/src/main/java/forge/planarconquest/ConquestUtil.java index d81a3899b62..0d309ff71f8 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestUtil.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestUtil.java @@ -163,12 +163,12 @@ public class ConquestUtil { return null; } - public static void makePlaneTemporarilyAccessible(String planeName) { + public static void setPlaneTemporarilyAccessible(String planeName, boolean accessible) { ConquestPlane plane = getPlaneByName(planeName); - if (plane != null && plane.isUnreachable()) { - plane.setTemporarilyReachable(true); + if (plane != null && accessible != !plane.isUnreachable()) { + plane.setTemporarilyReachable(accessible); } else { - System.err.println("Could not find plane to mark as temporarily accessible: " + planeName); + System.err.println("Could not find plane to set the accessibility flag: " + planeName); } } From a7989737d9250f33f8c8d07abb53e6921cf44f95 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 2 Dec 2018 22:34:15 +0300 Subject: [PATCH 335/901] - Added 6 events to Time Vault. - Fixed some minor AI issues. --- .../src/main/java/forge/ai/SpecialCardAi.java | 8 ++++ .../forge/ai/ability/CopySpellAbilityAi.java | 3 +- .../main/java/forge/ai/ability/ShuffleAi.java | 8 +++- .../planarconquest/LoadConquestScreen.java | 2 +- forge-gui/res/cardsfolder/l/lotus_vale.txt | 4 +- forge-gui/res/cardsfolder/m/minds_desire.txt | 2 +- forge-gui/res/cardsfolder/m/mirari.txt | 2 +- .../Time_Vault/Chronicle of Ages/_events.txt | 3 -- .../The Memory Lane/Akroma, Angel of Fury.dck | 33 ++++++++++++++ .../Akroma, Angel of Wrath.dck | 0 .../The Memory Lane/Diamond Faerie.dck | 36 +++++++++++++++ .../Time_Vault/The Memory Lane/Kaysa.dck | 35 +++++++++++++++ .../The Memory Lane/Red Deck Wins.dck | 32 ++++++++++++++ .../Time_Vault/The Memory Lane/Storm.dck | 44 +++++++++++++++++++ .../Time_Vault/The Memory Lane/_events.txt | 15 +++---- forge-gui/res/conquest/planes/planes.txt | 2 +- 16 files changed, 209 insertions(+), 20 deletions(-) create mode 100644 forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Akroma, Angel of Fury.dck rename forge-gui/res/conquest/planes/Time_Vault/{Chronicle of Ages => The Memory Lane}/Akroma, Angel of Wrath.dck (100%) create mode 100644 forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Diamond Faerie.dck create mode 100644 forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Kaysa.dck create mode 100644 forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Red Deck Wins.dck create mode 100644 forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Storm.dck diff --git a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java index db77d699d3e..69b5081e164 100644 --- a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java +++ b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java @@ -821,6 +821,10 @@ public class SpecialCardAi { int computerHandSize = ai.getZone(ZoneType.Hand).size(); int maxHandSize = ai.getMaxHandSize(); + if (ai.getCardsIn(ZoneType.Library).isEmpty()) { + return false; // nothing to draw from the library + } + if (!CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.nameEquals("Yawgmoth's Bargain")).isEmpty()) { // Prefer Yawgmoth's Bargain because AI is generally better with it @@ -1337,6 +1341,10 @@ public class SpecialCardAi { Game game = ai.getGame(); PhaseHandler ph = game.getPhaseHandler(); + if (ai.getCardsIn(ZoneType.Library).isEmpty()) { + return false; // nothing to draw from the library + } + int computerHandSize = ai.getZone(ZoneType.Hand).size(); int maxHandSize = ai.getMaxHandSize(); diff --git a/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java b/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java index 85ccadaec65..d130c18a666 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java @@ -110,7 +110,8 @@ public class CopySpellAbilityAi extends SpellAbilityAi { @Override protected boolean doTriggerAINoCost(Player aiPlayer, SpellAbility sa, boolean mandatory) { // the AI should not miss mandatory activations (e.g. Precursor Golem trigger) - return mandatory || "Always".equals(sa.getParam("AILogic")); + String logic = sa.getParamOrDefault("AILogic", ""); + return mandatory || logic.contains("Always"); // this includes logic like AlwaysIfViable } @Override diff --git a/forge-ai/src/main/java/forge/ai/ability/ShuffleAi.java b/forge-ai/src/main/java/forge/ai/ability/ShuffleAi.java index 30435464eb2..4f6bd05d10a 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ShuffleAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ShuffleAi.java @@ -8,6 +8,12 @@ import forge.game.spellability.SpellAbility; public class ShuffleAi extends SpellAbilityAi { @Override protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) { + String logic = sa.getParamOrDefault("AILogic", ""); + if (logic.equals("Always")) { + // We may want to play this for the subability, e.g. Mind's Desire + return true; + } + // not really sure when the compy would use this; maybe only after a // human // deliberately put a card on top of their library @@ -47,7 +53,7 @@ public class ShuffleAi extends SpellAbilityAi { @Override public boolean confirmAction(Player player, SpellAbility sa, PlayerActionConfirmMode mode, String message) { - // ai could analyze parameter denoting the player to shuffle + // ai could analyze parameter denoting the player to shuffle return true; } } diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/LoadConquestScreen.java b/forge-gui-mobile/src/forge/screens/planarconquest/LoadConquestScreen.java index 5694541e2e3..1115a2f4ec1 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/LoadConquestScreen.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/LoadConquestScreen.java @@ -315,7 +315,7 @@ public class LoadConquestScreen extends LaunchScreen { font = FSkinFont.get(12); float cardsWidth = font.getBounds(cards).width + iconSize + SettingsScreen.SETTING_PADDING; float shardsWidth = font.getBounds(shards).width + iconSize + SettingsScreen.SETTING_PADDING; - g.drawText(value.getPlaneswalker().getName() + " - " + value.getCurrentPlane().getName(), font, SettingsScreen.DESC_COLOR, x, y, w - shardsWidth - cardsWidth, h, false, HAlignment.LEFT, false); + g.drawText(value.getPlaneswalker().getName() + " - " + value.getCurrentPlane().getName().replace("_", " "), font, SettingsScreen.DESC_COLOR, x, y, w - shardsWidth - cardsWidth, h, false, HAlignment.LEFT, false); g.drawImage(FSkinImage.SPELLBOOK, x + w - shardsWidth - cardsWidth + iconOffset, y - SettingsScreen.SETTING_PADDING, iconSize, iconSize); g.drawText(cards, font, SettingsScreen.DESC_COLOR, x + w - shardsWidth - cardsWidth + iconSize + SettingsScreen.SETTING_PADDING, y, w, h, false, HAlignment.LEFT, false); g.drawImage(FSkinImage.AETHER_SHARD, x + w - shardsWidth + iconOffset, y - SettingsScreen.SETTING_PADDING, iconSize, iconSize); diff --git a/forge-gui/res/cardsfolder/l/lotus_vale.txt b/forge-gui/res/cardsfolder/l/lotus_vale.txt index 0b60ee818ea..1ad25b249b7 100644 --- a/forge-gui/res/cardsfolder/l/lotus_vale.txt +++ b/forge-gui/res/cardsfolder/l/lotus_vale.txt @@ -4,8 +4,8 @@ Types:Land A:AB$ Mana | Cost$ T | Produced$ Any | Amount$ 3 | SpellDescription$ Add three mana of any one color. R:Event$ Moved | Destination$ Battlefield | ValidCard$ Card.Self | ReplaceWith$ PayBeforeETB | Description$ If CARDNAME would enter the battlefield, sacrifice two untapped lands instead. If you do, put CARDNAME onto the battlefield. If you don't, put it into its owner's graveyard. SVar:PayBeforeETB:DB$ Sacrifice | SacValid$ Land.untapped | Defined$ You | RememberSacrificed$ True | Amount$ 2 | StrictAmount$ True | SubAbility$ MoveToGraveyard -SVar:MoveToGraveyard:DB$ ChangeZone | Origin$ All | Destination$ Graveyard | Defined$ ReplacedCard | ConditionCheckSVar$ X | ConditionSVarCompare$ LT2 | SubAbility$ MoveToBattlefield -SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard | ConditionCheckSVar$ X | ConditionSVarCompare$ GE2 | SubAbility$ DBCleanup +SVar:MoveToGraveyard:DB$ ChangeZone | Origin$ All | Destination$ Graveyard | Defined$ ReplacedCard | ConditionCheckSVar$ X | ConditionSVarCompare$ LT2 | References$ X | SubAbility$ MoveToBattlefield +SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard | ConditionCheckSVar$ X | ConditionSVarCompare$ GE2 | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount SVar:NeedsToPlayVar:Z GE2 diff --git a/forge-gui/res/cardsfolder/m/minds_desire.txt b/forge-gui/res/cardsfolder/m/minds_desire.txt index cfb68eb87f2..db16d6a4b53 100644 --- a/forge-gui/res/cardsfolder/m/minds_desire.txt +++ b/forge-gui/res/cardsfolder/m/minds_desire.txt @@ -2,7 +2,7 @@ Name:Mind's Desire ManaCost:4 U U Types:Sorcery K:Storm -A:SP$ Shuffle | Cost$ 4 U U | SubAbility$ DBExile | SpellDescription$ Shuffle your library. Then exile the top card of your library. Until end of turn, you may play that card without paying its mana cost. (If it has X in its mana cost, X is 0.) +A:SP$ Shuffle | Cost$ 4 U U | SubAbility$ DBExile | AILogic$ Always | SpellDescription$ Shuffle your library. Then exile the top card of your library. Until end of turn, you may play that card without paying its mana cost. (If it has X in its mana cost, X is 0.) SVar:DBExile:DB$ ChangeZone | Defined$ TopOfLibrary | Origin$ Library | Destination$ Exile | RememberChanged$ True | SubAbility$ DBEffect SVar:DBEffect:DB$Effect | RememberObjects$ Remembered | StaticAbilities$ Play | SubAbility$ DBCleanup | ExileOnMoved$ Exile SVar:Play:Mode$ Continuous | MayPlay$ True | MayPlayWithoutManaCost$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may play remembered card. diff --git a/forge-gui/res/cardsfolder/m/mirari.txt b/forge-gui/res/cardsfolder/m/mirari.txt index 80784279ed2..c1b674b58c3 100644 --- a/forge-gui/res/cardsfolder/m/mirari.txt +++ b/forge-gui/res/cardsfolder/m/mirari.txt @@ -2,6 +2,6 @@ Name:Mirari ManaCost:5 Types:Legendary Artifact T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigCopy | TriggerDescription$ Whenever you cast an instant or sorcery spell, you may pay {3}. If you do, copy that spell. You may choose new targets for the copy. -SVar:TrigCopy:AB$CopySpellAbility | Cost$ 3 | Defined$ TriggeredSpellAbility +SVar:TrigCopy:AB$CopySpellAbility | Cost$ 3 | Defined$ TriggeredSpellAbility | AILogic$ AlwaysIfViable SVar:Picture:http://www.wizards.com/global/images/magic/general/mirari.jpg Oracle:Whenever you cast an instant or sorcery spell, you may pay {3}. If you do, copy that spell. You may choose new targets for the copy. diff --git a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/_events.txt b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/_events.txt index bb9b17ddb6a..3635b658f8b 100644 --- a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/_events.txt +++ b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/_events.txt @@ -4,6 +4,3 @@ Name:Lovisa Coldeyes|Deck:Lovisa Coldeyes.dck|Variant:Commander|Avatar:Lovisa Co Name:Zur the Enchanter|Deck:Zur the Enchanter.dck|Variant:Commander|Avatar:Zur the Enchanter|Desc: Name:Birds of Paradise|Deck:Birds of Paradise.dck|Variant:Vanguard|Avatar:Birds of Paradise|Desc: Name:Rofellos, Llanowar Emissary|Deck:Rofellos, Llanowar Emissary.dck|Variant:Commander|Avatar:Rofellos, Llanowar Emissary|Desc: -Name:Akroma, Angel of Wrath|Deck:Akroma, Angel of Wrath.dck|Variant:Commander|Avatar:Akroma, Angel of Wrath|Desc: -Name:EVENT8|Deck:Random.dck|Variant:None|Avatar:None|Desc: -Name:EVENT9|Deck:Random.dck|Variant:None|Avatar:None|Desc: diff --git a/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Akroma, Angel of Fury.dck b/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Akroma, Angel of Fury.dck new file mode 100644 index 00000000000..ebeb8aa1052 --- /dev/null +++ b/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Akroma, Angel of Fury.dck @@ -0,0 +1,33 @@ +[metadata] +Name=Akroma, Angel of Fury +[Commander] +1 Akroma, Angel of Fury|PLC +[Main] +1 Basalt Gargoyle|TSP +1 Carbonize|SCG +1 Dragon Roost|ONS +1 Dragonspeaker Shaman|SCG +1 Fault Line|USG +1 Fledgling Dragon|JUD +1 Gemstone Caverns|TSP +1 Goblin Sky Raider|ONS +1 Grim Monolith|ULG +1 Heat Ray|USG +1 Imperial Hellkite|LGN +1 Lightning Axe|TSP +1 Lightning Dragon|USG +1 Pardic Dragon|TSP +1 Rimescale Dragon|CSP +1 Rock Slide|VIS +1 Rorix Bladewing|ONS +1 Shock|ONS +14 Snow-Covered Mountain|ICE +1 Spitting Drake|VIS +1 Starstorm|ONS +1 Tarox Bladewing|FUT +1 Thran Dynamo|UDS +1 Thunderbolt|WTH +1 Volcanic Geyser|MIR +1 Worn Powerstone|USG +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Akroma, Angel of Wrath.dck b/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Akroma, Angel of Wrath.dck similarity index 100% rename from forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Akroma, Angel of Wrath.dck rename to forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Akroma, Angel of Wrath.dck diff --git a/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Diamond Faerie.dck b/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Diamond Faerie.dck new file mode 100644 index 00000000000..749126c1059 --- /dev/null +++ b/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Diamond Faerie.dck @@ -0,0 +1,36 @@ +[metadata] +Name=Diamond Faerie +[Main] +1 Adarkar Valkyrie|CSP +1 Arctic Flats|CSP +1 Balduvian Frostwaker|CSP +1 Boreal Centaur|CSP +1 Boreal Druid|CSP +1 Boreal Griffin|CSP +1 Boreal Shelf|CSP +1 Centaur Omenreader|FUT +1 Coldsteel Heart|CSP +1 Counterspell|ICE +1 Diamond Faerie|CSP +4 Snow-Covered Forest|CSP +1 Frost Raptor|CSP +1 Frostweb Spider|CSP +1 Glacial Plating|CSP +1 Grand Coliseum|ONS +1 Heidar, Rimewind Master|CSP +1 Into the North|CSP +4 Snow-Covered Island|CSP +1 Ohran Viper|CSP +1 Phyrexian Ironfoot|CSP +1 Phyrexian Snowcrusher|CSP +4 Snow-Covered Plains|CSP +1 Power Sink|USG +1 Rimefeather Owl|CSP +1 Squall Drifter|CSP +1 Swords to Plowshares|ICE +1 Syncopate|ODY +1 Terramorphic Expanse|TSP +1 Thawing Glaciers|ALL +1 Woolly Mammoths|ICE +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Kaysa.dck b/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Kaysa.dck new file mode 100644 index 00000000000..1a4640aab17 --- /dev/null +++ b/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Kaysa.dck @@ -0,0 +1,35 @@ +[metadata] +Name=Kaysa +[Commander] +1 Kaysa|ALL +[Main] +1 Decree of Savagery|SCG +1 Defiant Elf|LGN +1 Dryad Arbor|FUT +1 Elvish Aberration|SCG +1 Elvish Champion|INV +1 Elvish Vanguard|ONS +1 Essence Warden|PLC +1 Explosive Growth|INV +11 Forest|INV +1 Gaea's Cradle|USG +1 Heedless One|ONS +1 Llanowar Reborn|FUT +1 Mythic Proportions|ONS +1 Priest of Titania|USG +1 Rancor|ULG +1 Rofellos, Llanowar Emissary|UDS +1 Strength in Numbers|TSP +1 Sylvan Messenger|APC +1 Sylvan Might|ODY +1 Thornweald Archer|FUT +1 Timberwatch Elf|LGN +1 Titania's Chosen|USG +1 Voice of the Woods|ONS +1 Wellwisher|ONS +1 Wirewood Channeler|LGN +1 Wirewood Elf|ONS +1 Wirewood Lodge|ONS +1 Wirewood Pride|ONS +1 Yavimaya Hollow|UDS +[Sideboard] diff --git a/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Red Deck Wins.dck b/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Red Deck Wins.dck new file mode 100644 index 00000000000..2b7a488e552 --- /dev/null +++ b/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Red Deck Wins.dck @@ -0,0 +1,32 @@ +[metadata] +Name=Burn +[Main] +1 Arc Lightning|USG +1 Blazing Salvo|ODY +1 Blistering Firecat|ONS +1 Empty the Warrens|TSP +1 Fault Line|USG +1 Firebolt|ODY +1 Flame Jet|UDS +1 Ghitu Encampment|ULG +1 Grapeshot|TSP +1 Heat Ray|USG +1 Incinerate|MIR +1 Kaervek's Torch|MIR +1 Keldon Megaliths|FUT +1 Lava Blister|ODY +1 Lightning Axe|TSP +1 Lightning Serpent|CSP +1 Molten Disaster|FUT +1 Rift Bolt|TSP +1 Rock Slide|VIS +1 Shock|ONS +1 Shower of Sparks|USG +1 Skred|CSP +13 Snow-Covered Mountain|CSP +1 Starstorm|ONS +1 Steam Blast|USG +1 Sudden Shock|TSP +1 Thunderbolt|WTH +1 Volcanic Geyser|MIR +[Sideboard] diff --git a/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Storm.dck b/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Storm.dck new file mode 100644 index 00000000000..05ff11e9880 --- /dev/null +++ b/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Storm.dck @@ -0,0 +1,44 @@ +[metadata] +Name=Storm +[Avatar] +1 Titania|VAN +[Main] +1 Ancestral Recall|LEA +1 Ancestral Vision|TSP +1 Arcane Denial|ALL|1 +1 Black Lotus|LEA +1 Brain Freeze|SCG +1 Brainstorm|ICE +1 Cloud of Faeries|ULG +1 Empty the Warrens|TSP +1 Frantic Search|ULG +1 Grand Coliseum|ONS +1 Grapeshot|TSP +1 Helm of Awakening|VIS +2 Island|ICE +1 Lotus Bloom|TSP +1 Lotus Vale|WTH +1 Mind's Desire|SCG +1 Mountain|USG +1 Mox Jet|LEA +1 Mox Ruby|LEA +1 Mox Sapphire|LEA +1 Necropotence|ICE +1 Obsessive Search|TOR +1 Ornithopter|3ED +1 Perilous Research|CSP +1 Phyrexian Walker|VIS +1 Shield Sphere|ALL +1 Snap|ULG +1 Sol Ring|LEA +3 Swamp|USG +1 Tendrils of Agony|SCG +1 Time Spiral|USG +1 Time Walk|LEA +1 Timetwister|LEA +1 Tolarian Academy|USG +1 Treachery|UDS +1 Worn Powerstone|USG +1 Yawgmoth's Will|USG +[Sideboard] + diff --git a/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/_events.txt b/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/_events.txt index 66c69ba92d0..5f766ca74ba 100644 --- a/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/_events.txt +++ b/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/_events.txt @@ -1,9 +1,6 @@ -Name:EVENT1|Deck:Random.dck|Variant:None|Avatar:None|Desc: -Name:EVENT2|Deck:Random.dck|Variant:None|Avatar:None|Desc: -Name:EVENT3|Deck:Random.dck|Variant:None|Avatar:None|Desc: -Name:EVENT4|Deck:Random.dck|Variant:None|Avatar:None|Desc: -Name:EVENT5|Deck:Random.dck|Variant:None|Avatar:None|Desc: -Name:EVENT6|Deck:Random.dck|Variant:None|Avatar:None|Desc: -Name:EVENT7|Deck:Random.dck|Variant:None|Avatar:None|Desc: -Name:EVENT8|Deck:Random.dck|Variant:None|Avatar:None|Desc: -Name:EVENT9|Deck:Random.dck|Variant:None|Avatar:None|Desc: +Name:Akroma, Angel of Wrath|Deck:Akroma, Angel of Wrath.dck|Variant:Commander|Avatar:Akroma, Angel of Wrath|Desc: +Name:Akroma, Angel of Fury|Deck:Akroma, Angel of Fury.dck|Variant:Commander|Avatar:Akroma, Angel of Fury|Desc: +Name:Diamond Faerie|Deck:Diamond Faerie.dck|Variant:Planechase|Avatar:Diamond Faerie|Desc: +Name:Storm|Deck:Storm.dck|Variant:Vanguard|Avatar:Titania|Desc: +Name:Red Deck Wins|Deck:Red Deck Wins.dck|Variant:Planechase|Avatar:Blistering Firecat|Desc: +Name:Kaysa|Deck:Kaysa.dck|Variant:Commander|Avatar:Kaysa|Desc: diff --git a/forge-gui/res/conquest/planes/planes.txt b/forge-gui/res/conquest/planes/planes.txt index 2a2d1ab4b5c..591662ecd43 100644 --- a/forge-gui/res/conquest/planes/planes.txt +++ b/forge-gui/res/conquest/planes/planes.txt @@ -14,6 +14,6 @@ Name:Regatha|RegionSize:6|Unreachable:True|Desc: Name:Shandalar|RegionSize:9|Unreachable:True|Desc: Name:Tarkir|RegionSize:9|Desc:A plane dominated by five powerful clans... or five powerful dragon lords.\nConsists of 45 events. Contains cards from KTK, FRF, DTK, CMD, CNS/CN2, some C17. Name:Theros|RegionSize:9|Desc:Mortals tremble before an awe-inspiring pantheon of gods.\nConsists of 45 events. Contains cards from THS, BNG, JOU, HOP, PCA, and more. -Name:Time_Vault|RegionSize:9|Unreachable:True|Desc:A mysterious and legendary Time Vault, allowing one to travel back in time and revisit the ages long past and experience the history of Dominaria.\nConsists of 18 events. Contains cards from ICE, ALL, CSP, MIR, VIS, WTH, USG, ULG, UDS, INV, PLS, APC, ODY, TOR, JUD, ONS, LGN, SCG, TSP, PLC, FUT, and COM.\n\nThe portal to this plane is unstable and will close soon, so hasten your step, planeswalker, while you have the chance... +Name:Time_Vault|RegionSize:6|Unreachable:True|Desc:A mysterious and legendary Time Vault, allowing one to travel back in time and revisit the ages long past and challenge the legends of Dominaria.\nConsists of 12 events. Contains cards from ICE, ALL, CSP, MIR, VIS, WTH, USG, ULG, UDS, INV, PLS, APC, ODY, TOR, JUD, ONS, LGN, SCG, TSP, PLC, FUT, and COM.\n\nThe portal to this plane is unstable and will close soon, so hasten your step, planeswalker, while you have the chance... Name:Ulgrotha|RegionSize:6|Unreachable:True|Desc: Name:Zendikar|RegionSize:9|Desc:This land of primal mana was lethal even before its Eldrazi prisoners escaped.\nConsists of 60 events. Contains cards from ZEN, WWK, ROE, BFZ, OGW, and C16. From d15e08217a31127266c90a60c94b91e4931d10f7 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 2 Dec 2018 22:49:36 +0300 Subject: [PATCH 336/901] - Updating CHANGES.txt. --- forge-gui/release-files/CHANGES.txt | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/forge-gui/release-files/CHANGES.txt b/forge-gui/release-files/CHANGES.txt index af3585bcaf9..03107555030 100644 --- a/forge-gui/release-files/CHANGES.txt +++ b/forge-gui/release-files/CHANGES.txt @@ -1,11 +1,18 @@ - Planar Conquest 25th MTG Anniversary / Christmas 2018 Update - -A rather serious and massive content update has happened in Planar Conquest. First of all, there are two new planes available, Dominaria and Kamigawa. Dominaria is a plane which features cards from the eponymous set Dominaria as well as most (but not all) cards from Magic Core Set 2019 and Commander 2018. There are 45 events available for your enjoyment. Traditional Commander, Planeswalker, and Vanguard events represent the majority of the events on the plane, but Dominaria also features Planechase variant matches, with the planar decks consisting of plane cards representing regions of Dominaria and various randomly inserted phenomena. Kamigawa is a plane consisting of 45 events and containing the cards from Champions of Kamigawa, Betrayers of Kamigawa, and Saviors of Kamigawa. Commander, Vanguard, and the new Planechase events are available on this plane, but no Planeswalker events since no planeswalker cards existed in this period of Magic: the Gathering. In addition to that, several other planes were tweaked. In particular, Theros, Alara and Ravnica feature random Planechase matches replacing random non-variant matches. Also, Theros has been tweaked not to start with a hard non-singleton non-variant duel, as well as to allow to ignore non-singleton duels (walk around them) if need be. Please note that Planar Conquest is currently only available on Android and in the mobile backport. +A rather serious and massive content update has happened in Planar Conquest. There are two new planes available, Dominaria and Kamigawa. +(Please note that Planar Conquest is currently only available on Android and in the mobile backport.) + +** Dominaria ** +Dominaria is a plane which features cards from the eponymous set, Dominaria, as well as most (but not all) cards from Magic Core Set 2019 and Commander 2018. There are 45 events available for your enjoyment. Traditional Commander, Planeswalker, and Vanguard events represent the majority of the events on the plane, but Dominaria also features Planechase variant matches, with the planar decks consisting of plane cards representing regions of Dominaria and various randomly inserted phenomena. There is a rumor claiming that somewhere on Dominaria there is a hidden secret portal leading to the legendary Time Vault which allows a planeswalker to travel to the past, yet it is unknown if these rumors are true. + +** Kamigawa ** +Kamigawa is a plane consisting of 45 events and containing the cards from Champions of Kamigawa, Betrayers of Kamigawa, and Saviors of Kamigawa. Even though this block is notorious for being underpowered and probably contains the biggest number of weenies and bears, it also presents you with a chance to get some of the most broken cards in the game. For example, you can grab Umezawa's Jitte without having to rely on randomly finding one in Chaos Battles. Commander, Vanguard, and the new Planechase events are available on the Kamigawa plane, but no Planeswalker events since no planeswalker cards existed in this period of Magic: the Gathering. + +** Other changes ** +In addition to that, several other planes were tweaked. In particular, Theros, Alara and Ravnica feature random Planechase matches replacing random non-variant matches. Ravnica has been updated to feature several new events featuring Guilds of Ravnica cards, and some old events on this plane were also updated with the new cards as well. Guilds of Ravnica has been fully enabled on this plane, so you can grab the relevant cards in The Aether or from randomly won booster packs. Also, Theros has been tweaked not to start with a hard non-singleton non-variant duel, as well as to allow to ignore non-singleton duels (walk around them) if need be. - AI Improvements - -A new round of AI improvements went into the game, hopefully making the game a little more interesting and exciting to play. In particular, certain improvements regarding Flash were implemented, the AI is now able to use cards which reorder the top of the library, such as Ponder or Portent, as well as cards which copy spells and/or activated abilities, such as Twincast or Fork. On top of that, several logic-related bugs were fixed. Also, the AI has been optimized a little, hopefully making it a bit faster, especially on mobile platforms, in situations where there are a lot of cards on the battlefield but the AI has little or nothing to do. - -- Planar Conquest: Guilds of Ravnica - -Cards from Guilds of Ravnica are now available on the Ravnica plane in Planar Conquest. Several events on this plane have been updated or changed to feature Guilds of Ravnica cards as well. Please note that Planar Conquest is currently only available on Android and the macOS mobile backport. +A new round of AI improvements went into the game, hopefully making the game a little more interesting and exciting to play. In particular, certain improvements regarding Flash were implemented, the AI is now able to use cards which reorder the top of the library, such as Ponder or Portent, as well as cards which copy spells and/or activated abilities, such as Twincast or Fork. Some other cards were improved for the AI and some were marked as AI playable. On top of that, several logic-related bugs were fixed. Also, the AI has been optimized a little, hopefully making it a bit faster, especially on mobile platforms, in situations where there are a lot of cards on the battlefield but the AI has little or nothing to do. - Random Commander Quest - It is now possible to start a quest with Commander rules and randomly generated quest opponents playing Commander decks. This feature is currently exclusive to desktop Forge. From a0e9d9a616f995af4b37cfa8ed24fd9d0f85dc58 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 2 Dec 2018 22:55:33 +0300 Subject: [PATCH 337/901] - Updating CHANGES.txt, part 2. --- forge-gui/release-files/CHANGES.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/release-files/CHANGES.txt b/forge-gui/release-files/CHANGES.txt index 03107555030..51d39ae9595 100644 --- a/forge-gui/release-files/CHANGES.txt +++ b/forge-gui/release-files/CHANGES.txt @@ -3,7 +3,7 @@ A rather serious and massive content update has happened in Planar Conquest. The (Please note that Planar Conquest is currently only available on Android and in the mobile backport.) ** Dominaria ** -Dominaria is a plane which features cards from the eponymous set, Dominaria, as well as most (but not all) cards from Magic Core Set 2019 and Commander 2018. There are 45 events available for your enjoyment. Traditional Commander, Planeswalker, and Vanguard events represent the majority of the events on the plane, but Dominaria also features Planechase variant matches, with the planar decks consisting of plane cards representing regions of Dominaria and various randomly inserted phenomena. There is a rumor claiming that somewhere on Dominaria there is a hidden secret portal leading to the legendary Time Vault which allows a planeswalker to travel to the past, yet it is unknown if these rumors are true. +It's the 25th anniversary year for Magic: the Gathering, and one of the key events this year was going back to Dominaria with a brand new set. So, at the end of the year, why not visit Dominaria once more? Dominaria is a plane which features cards from the eponymous set, Dominaria, as well as most (but not all) cards from Magic Core Set 2019 and Commander 2018. There are 45 events available for your enjoyment. Traditional Commander, Planeswalker, and Vanguard events represent the majority of the events on the plane, but Dominaria also features Planechase variant matches, with the planar decks consisting of plane cards representing regions of Dominaria and various randomly inserted phenomena. There is a rumor claiming that somewhere on Dominaria there is a hidden secret portal leading to the legendary Time Vault which allows a planeswalker to travel to the past, yet it is unknown if these rumors are true. ** Kamigawa ** Kamigawa is a plane consisting of 45 events and containing the cards from Champions of Kamigawa, Betrayers of Kamigawa, and Saviors of Kamigawa. Even though this block is notorious for being underpowered and probably contains the biggest number of weenies and bears, it also presents you with a chance to get some of the most broken cards in the game. For example, you can grab Umezawa's Jitte without having to rely on randomly finding one in Chaos Battles. Commander, Vanguard, and the new Planechase events are available on the Kamigawa plane, but no Planeswalker events since no planeswalker cards existed in this period of Magic: the Gathering. From db209a24e9f8b22a8b462c22be7ad62b36b9b83e Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 2 Dec 2018 22:58:21 +0300 Subject: [PATCH 338/901] - Final update to CHANGES.txt. --- forge-gui/release-files/CHANGES.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/forge-gui/release-files/CHANGES.txt b/forge-gui/release-files/CHANGES.txt index 51d39ae9595..7a7cc1d25bc 100644 --- a/forge-gui/release-files/CHANGES.txt +++ b/forge-gui/release-files/CHANGES.txt @@ -3,7 +3,8 @@ A rather serious and massive content update has happened in Planar Conquest. The (Please note that Planar Conquest is currently only available on Android and in the mobile backport.) ** Dominaria ** -It's the 25th anniversary year for Magic: the Gathering, and one of the key events this year was going back to Dominaria with a brand new set. So, at the end of the year, why not visit Dominaria once more? Dominaria is a plane which features cards from the eponymous set, Dominaria, as well as most (but not all) cards from Magic Core Set 2019 and Commander 2018. There are 45 events available for your enjoyment. Traditional Commander, Planeswalker, and Vanguard events represent the majority of the events on the plane, but Dominaria also features Planechase variant matches, with the planar decks consisting of plane cards representing regions of Dominaria and various randomly inserted phenomena. There is a rumor claiming that somewhere on Dominaria there is a hidden secret portal leading to the legendary Time Vault which allows a planeswalker to travel to the past, yet it is unknown if these rumors are true. +It's the 25th anniversary year for Magic: the Gathering, and one of the key events this year was going back to Dominaria with a brand new set. So, at the end of the year, why not visit Dominaria once more? Dominaria is a plane which features cards from the eponymous set, Dominaria, as well as most (but not all) cards from Magic Core Set 2019 and Commander 2018. There are 45 events available for your enjoyment. Traditional Commander, Planeswalker, and Vanguard events represent the majority of the events on the plane, but Dominaria also features Planechase variant matches, with the planar decks consisting of plane cards representing regions of Dominaria (and sometimes, by the whim of fate, various other locations of the Multiverse) and various randomly inserted phenomena. + There is a rumor circulating in the taverns claiming that somewhere on Dominaria there is a hidden secret portal leading to the legendary Time Vault which allows a planeswalker to travel to the past, yet it is unknown if these rumors are true. ** Kamigawa ** Kamigawa is a plane consisting of 45 events and containing the cards from Champions of Kamigawa, Betrayers of Kamigawa, and Saviors of Kamigawa. Even though this block is notorious for being underpowered and probably contains the biggest number of weenies and bears, it also presents you with a chance to get some of the most broken cards in the game. For example, you can grab Umezawa's Jitte without having to rely on randomly finding one in Chaos Battles. Commander, Vanguard, and the new Planechase events are available on the Kamigawa plane, but no Planeswalker events since no planeswalker cards existed in this period of Magic: the Gathering. From 72e50fdf2be621a0f83b51ffd2bb35f8806a4bd3 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 3 Dec 2018 08:01:00 +0300 Subject: [PATCH 339/901] - Minor logic improvement for AILogic LivingDeath. - Renamed Classic Dominaria to Classic_Dominaria for naming consistency. - Minor tweak to plane and set definitions. - Updated CHANGES.txt. --- forge-ai/src/main/java/forge/ai/SpecialCardAi.java | 8 ++++++++ forge-gui/release-files/CHANGES.txt | 2 +- .../Ice Age/_events.txt | 0 .../Invasion/_events.txt | 0 .../Mirage/_events.txt | 0 .../Odyssey/_events.txt | 0 .../Onslaught/_events.txt | 0 .../Time Spiral/_events.txt | 0 .../Urza's Saga/_events.txt | 0 .../{Classic Dominaria => Classic_Dominaria}/cards.txt | 0 .../plane_cards.txt | 0 .../regions.txt | 0 .../{Classic Dominaria => Classic_Dominaria}/sets.txt | 0 forge-gui/res/conquest/planes/Time_Vault/sets.txt | 10 ++++++++++ forge-gui/res/conquest/planes/planes.txt | 2 +- 15 files changed, 20 insertions(+), 2 deletions(-) rename forge-gui/res/conquest/planes/{Classic Dominaria => Classic_Dominaria}/Ice Age/_events.txt (100%) rename forge-gui/res/conquest/planes/{Classic Dominaria => Classic_Dominaria}/Invasion/_events.txt (100%) rename forge-gui/res/conquest/planes/{Classic Dominaria => Classic_Dominaria}/Mirage/_events.txt (100%) rename forge-gui/res/conquest/planes/{Classic Dominaria => Classic_Dominaria}/Odyssey/_events.txt (100%) rename forge-gui/res/conquest/planes/{Classic Dominaria => Classic_Dominaria}/Onslaught/_events.txt (100%) rename forge-gui/res/conquest/planes/{Classic Dominaria => Classic_Dominaria}/Time Spiral/_events.txt (100%) rename forge-gui/res/conquest/planes/{Classic Dominaria => Classic_Dominaria}/Urza's Saga/_events.txt (100%) rename forge-gui/res/conquest/planes/{Classic Dominaria => Classic_Dominaria}/cards.txt (100%) rename forge-gui/res/conquest/planes/{Classic Dominaria => Classic_Dominaria}/plane_cards.txt (100%) rename forge-gui/res/conquest/planes/{Classic Dominaria => Classic_Dominaria}/regions.txt (100%) rename forge-gui/res/conquest/planes/{Classic Dominaria => Classic_Dominaria}/sets.txt (100%) diff --git a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java index 69b5081e164..e091a2462e9 100644 --- a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java +++ b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java @@ -677,6 +677,14 @@ public class SpecialCardAi { // Living Death (and other similar cards using AILogic LivingDeath or AILogic ReanimateAll) public static class LivingDeath { public static boolean consider(final Player ai, final SpellAbility sa) { + // if there's another reanimator card currently suspended, don't cast a new one until the previous + // one resolves, otherwise the reanimation attempt will be ruined (e.g. Living End) + for (Card ex : ai.getCardsIn(ZoneType.Exile)) { + if (ex.hasSVar("IsReanimatorCard") && ex.getCounters(CounterType.TIME) > 0) { + return false; + } + } + int aiBattlefieldPower = 0, aiGraveyardPower = 0; int threshold = 320; // approximately a 4/4 Flying creature worth of extra value diff --git a/forge-gui/release-files/CHANGES.txt b/forge-gui/release-files/CHANGES.txt index 7a7cc1d25bc..1e10f593eaa 100644 --- a/forge-gui/release-files/CHANGES.txt +++ b/forge-gui/release-files/CHANGES.txt @@ -4,7 +4,7 @@ A rather serious and massive content update has happened in Planar Conquest. The ** Dominaria ** It's the 25th anniversary year for Magic: the Gathering, and one of the key events this year was going back to Dominaria with a brand new set. So, at the end of the year, why not visit Dominaria once more? Dominaria is a plane which features cards from the eponymous set, Dominaria, as well as most (but not all) cards from Magic Core Set 2019 and Commander 2018. There are 45 events available for your enjoyment. Traditional Commander, Planeswalker, and Vanguard events represent the majority of the events on the plane, but Dominaria also features Planechase variant matches, with the planar decks consisting of plane cards representing regions of Dominaria (and sometimes, by the whim of fate, various other locations of the Multiverse) and various randomly inserted phenomena. - There is a rumor circulating in the taverns claiming that somewhere on Dominaria there is a hidden secret portal leading to the legendary Time Vault which allows a planeswalker to travel to the past, yet it is unknown if these rumors are true. + There is a rumor circulating in the taverns claiming that somewhere on Dominaria there is a hidden secret portal leading to the legendary Time Vault which allows a planeswalker to travel to the past, yet it is unknown if this rumor is true. ** Kamigawa ** Kamigawa is a plane consisting of 45 events and containing the cards from Champions of Kamigawa, Betrayers of Kamigawa, and Saviors of Kamigawa. Even though this block is notorious for being underpowered and probably contains the biggest number of weenies and bears, it also presents you with a chance to get some of the most broken cards in the game. For example, you can grab Umezawa's Jitte without having to rely on randomly finding one in Chaos Battles. Commander, Vanguard, and the new Planechase events are available on the Kamigawa plane, but no Planeswalker events since no planeswalker cards existed in this period of Magic: the Gathering. diff --git a/forge-gui/res/conquest/planes/Classic Dominaria/Ice Age/_events.txt b/forge-gui/res/conquest/planes/Classic_Dominaria/Ice Age/_events.txt similarity index 100% rename from forge-gui/res/conquest/planes/Classic Dominaria/Ice Age/_events.txt rename to forge-gui/res/conquest/planes/Classic_Dominaria/Ice Age/_events.txt diff --git a/forge-gui/res/conquest/planes/Classic Dominaria/Invasion/_events.txt b/forge-gui/res/conquest/planes/Classic_Dominaria/Invasion/_events.txt similarity index 100% rename from forge-gui/res/conquest/planes/Classic Dominaria/Invasion/_events.txt rename to forge-gui/res/conquest/planes/Classic_Dominaria/Invasion/_events.txt diff --git a/forge-gui/res/conquest/planes/Classic Dominaria/Mirage/_events.txt b/forge-gui/res/conquest/planes/Classic_Dominaria/Mirage/_events.txt similarity index 100% rename from forge-gui/res/conquest/planes/Classic Dominaria/Mirage/_events.txt rename to forge-gui/res/conquest/planes/Classic_Dominaria/Mirage/_events.txt diff --git a/forge-gui/res/conquest/planes/Classic Dominaria/Odyssey/_events.txt b/forge-gui/res/conquest/planes/Classic_Dominaria/Odyssey/_events.txt similarity index 100% rename from forge-gui/res/conquest/planes/Classic Dominaria/Odyssey/_events.txt rename to forge-gui/res/conquest/planes/Classic_Dominaria/Odyssey/_events.txt diff --git a/forge-gui/res/conquest/planes/Classic Dominaria/Onslaught/_events.txt b/forge-gui/res/conquest/planes/Classic_Dominaria/Onslaught/_events.txt similarity index 100% rename from forge-gui/res/conquest/planes/Classic Dominaria/Onslaught/_events.txt rename to forge-gui/res/conquest/planes/Classic_Dominaria/Onslaught/_events.txt diff --git a/forge-gui/res/conquest/planes/Classic Dominaria/Time Spiral/_events.txt b/forge-gui/res/conquest/planes/Classic_Dominaria/Time Spiral/_events.txt similarity index 100% rename from forge-gui/res/conquest/planes/Classic Dominaria/Time Spiral/_events.txt rename to forge-gui/res/conquest/planes/Classic_Dominaria/Time Spiral/_events.txt diff --git a/forge-gui/res/conquest/planes/Classic Dominaria/Urza's Saga/_events.txt b/forge-gui/res/conquest/planes/Classic_Dominaria/Urza's Saga/_events.txt similarity index 100% rename from forge-gui/res/conquest/planes/Classic Dominaria/Urza's Saga/_events.txt rename to forge-gui/res/conquest/planes/Classic_Dominaria/Urza's Saga/_events.txt diff --git a/forge-gui/res/conquest/planes/Classic Dominaria/cards.txt b/forge-gui/res/conquest/planes/Classic_Dominaria/cards.txt similarity index 100% rename from forge-gui/res/conquest/planes/Classic Dominaria/cards.txt rename to forge-gui/res/conquest/planes/Classic_Dominaria/cards.txt diff --git a/forge-gui/res/conquest/planes/Classic Dominaria/plane_cards.txt b/forge-gui/res/conquest/planes/Classic_Dominaria/plane_cards.txt similarity index 100% rename from forge-gui/res/conquest/planes/Classic Dominaria/plane_cards.txt rename to forge-gui/res/conquest/planes/Classic_Dominaria/plane_cards.txt diff --git a/forge-gui/res/conquest/planes/Classic Dominaria/regions.txt b/forge-gui/res/conquest/planes/Classic_Dominaria/regions.txt similarity index 100% rename from forge-gui/res/conquest/planes/Classic Dominaria/regions.txt rename to forge-gui/res/conquest/planes/Classic_Dominaria/regions.txt diff --git a/forge-gui/res/conquest/planes/Classic Dominaria/sets.txt b/forge-gui/res/conquest/planes/Classic_Dominaria/sets.txt similarity index 100% rename from forge-gui/res/conquest/planes/Classic Dominaria/sets.txt rename to forge-gui/res/conquest/planes/Classic_Dominaria/sets.txt diff --git a/forge-gui/res/conquest/planes/Time_Vault/sets.txt b/forge-gui/res/conquest/planes/Time_Vault/sets.txt index b5e136bebac..3fcef5cceb1 100644 --- a/forge-gui/res/conquest/planes/Time_Vault/sets.txt +++ b/forge-gui/res/conquest/planes/Time_Vault/sets.txt @@ -1,3 +1,13 @@ +LEA +LEB +2ED +3ED +4ED +5ED +6ED +7ED +8ED +9ED ICE ALL CSP diff --git a/forge-gui/res/conquest/planes/planes.txt b/forge-gui/res/conquest/planes/planes.txt index 591662ecd43..94c4906faa4 100644 --- a/forge-gui/res/conquest/planes/planes.txt +++ b/forge-gui/res/conquest/planes/planes.txt @@ -14,6 +14,6 @@ Name:Regatha|RegionSize:6|Unreachable:True|Desc: Name:Shandalar|RegionSize:9|Unreachable:True|Desc: Name:Tarkir|RegionSize:9|Desc:A plane dominated by five powerful clans... or five powerful dragon lords.\nConsists of 45 events. Contains cards from KTK, FRF, DTK, CMD, CNS/CN2, some C17. Name:Theros|RegionSize:9|Desc:Mortals tremble before an awe-inspiring pantheon of gods.\nConsists of 45 events. Contains cards from THS, BNG, JOU, HOP, PCA, and more. -Name:Time_Vault|RegionSize:6|Unreachable:True|Desc:A mysterious and legendary Time Vault, allowing one to travel back in time and revisit the ages long past and challenge the legends of Dominaria.\nConsists of 12 events. Contains cards from ICE, ALL, CSP, MIR, VIS, WTH, USG, ULG, UDS, INV, PLS, APC, ODY, TOR, JUD, ONS, LGN, SCG, TSP, PLC, FUT, and COM.\n\nThe portal to this plane is unstable and will close soon, so hasten your step, planeswalker, while you have the chance... +Name:Time_Vault|RegionSize:6|Unreachable:True|Desc:A mysterious and legendary Time Vault, allowing one to travel back in time and revisit the ages long past and challenge the legends of Dominaria.\nConsists of 12 events. Contains cards from the early core sets up to 9th edition, Dominaria-themed expansions (Ice Age, Mirage, Urza's Saga, Invasion, Odyssey, Onslaught, and Time Spiral blocks), and the original Commander.\n\nThe portal to this plane is unstable and will close soon, so hasten your step, planeswalker, while you have the chance... Name:Ulgrotha|RegionSize:6|Unreachable:True|Desc: Name:Zendikar|RegionSize:9|Desc:This land of primal mana was lethal even before its Eldrazi prisoners escaped.\nConsists of 60 events. Contains cards from ZEN, WWK, ROE, BFZ, OGW, and C16. From b238172934696b44b71075e8d2a18c677ecc68a4 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 3 Dec 2018 09:31:42 +0300 Subject: [PATCH 340/901] - Tweaked Lena's event. --- .../planes/Dominaria/New Benalia/Lena, Selfless Champion.dck | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/conquest/planes/Dominaria/New Benalia/Lena, Selfless Champion.dck b/forge-gui/res/conquest/planes/Dominaria/New Benalia/Lena, Selfless Champion.dck index d1758762517..70ddf841b21 100644 --- a/forge-gui/res/conquest/planes/Dominaria/New Benalia/Lena, Selfless Champion.dck +++ b/forge-gui/res/conquest/planes/Dominaria/New Benalia/Lena, Selfless Champion.dck @@ -23,8 +23,8 @@ Name=Lena, Selfless Champion 1 Militia Bugler|M19 15 Plains|M19 1 Sergeant-at-Arms|DOM +1 Serra Angel|DOM 1 Sigiled Sword of Valeron|M19 1 Steel Hellkite|C18 1 Sun Sentinel|M19 1 Suncleanser|M19 -1 Teferi's Sentinel|DOM From 60421f503356e0a7ed778218fc5328b34044aa3a Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 3 Dec 2018 09:58:11 +0300 Subject: [PATCH 341/901] - Request rendering on mobile Forge when selecting a card. Ensures that the overlay (e.g. attack icons etc.) is correctly updated on click and the screen is redrawn, otherwise missing icons are possible. --- .../src/forge/screens/match/views/VCardDisplayArea.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java b/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java index fb26aaccf8e..9978aec28c2 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java @@ -5,6 +5,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import com.badlogic.gdx.Gdx; import com.badlogic.gdx.math.Vector2; import forge.FThreads; @@ -349,15 +350,18 @@ public abstract class VCardDisplayArea extends VDisplayArea implements ActivateH public boolean selectCard(boolean selectEntireStack) { if (MatchController.instance.getGameController().selectCard(getCard(), getOtherCardsToSelect(selectEntireStack), null)) { + Gdx.graphics.requestRendering(); return true; } //if panel can't do anything with card selection, try selecting previous panel in stack if (prevPanelInStack != null && prevPanelInStack.selectCard(selectEntireStack)) { + Gdx.graphics.requestRendering(); return true; } //as a last resort try to select attached panels for (CardAreaPanel panel : attachedPanels) { if (panel.selectCard(selectEntireStack)) { + Gdx.graphics.requestRendering(); return true; } } From b1a07edc812bca3cc0490ee7728bb4f104c05f5a Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 3 Dec 2018 16:45:18 +0300 Subject: [PATCH 342/901] - Don't add an extra newline after the last message in prompt, makes things easier to read on mobile. --- forge-gui/src/main/java/forge/match/input/InputBase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/src/main/java/forge/match/input/InputBase.java b/forge-gui/src/main/java/forge/match/input/InputBase.java index 4b38092acfb..fb51f0c1afb 100644 --- a/forge-gui/src/main/java/forge/match/input/InputBase.java +++ b/forge-gui/src/main/java/forge/match/input/InputBase.java @@ -144,7 +144,7 @@ public abstract class InputBase implements java.io.Serializable, Input { if (FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_SHOW_STORM_COUNT_IN_PROMPT)) { int stormCount = game.getView().getStormCount(); if (stormCount > 0) { - sb.append("\n").append("Storm Count: ").append(stormCount).append("\n"); + sb.append("\n").append("Storm Count: ").append(stormCount); } } return sb.toString(); From b2cc17738ae5e72b546935aca0db05a24480aff6 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 3 Dec 2018 20:22:41 +0300 Subject: [PATCH 343/901] - Made Quillmane Baku AI-playable. --- forge-ai/src/main/java/forge/ai/AiCostDecision.java | 9 +++++++++ forge-ai/src/main/java/forge/ai/ComputerUtilCost.java | 2 +- forge-ai/src/main/java/forge/ai/SpellAbilityAi.java | 7 +++++++ forge-gui/res/cardsfolder/q/quillmane_baku.txt | 4 ++-- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiCostDecision.java b/forge-ai/src/main/java/forge/ai/AiCostDecision.java index b923b38707a..3b380c5f679 100644 --- a/forge-ai/src/main/java/forge/ai/AiCostDecision.java +++ b/forge-ai/src/main/java/forge/ai/AiCostDecision.java @@ -789,6 +789,15 @@ public class AiCostDecision extends CostDecisionMakerBase { c = AbilityUtils.calculateAmount(source, "ChosenX", ability); } else if (amount.equals("All")) { c = source.getCounters(cost.counter); + } else if (sVar.equals("Targeted$CardManaCost")) { + c = 0; + if (ability.getTargets().getNumTargeted() > 0) { + for (Card tgt : ability.getTargets().getTargetCards()) { + if (tgt.getManaCost() != null) { + c += tgt.getManaCost().getCMC(); + } + } + } } else { c = AbilityUtils.calculateAmount(source, amount, ability); } diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java index dd1a4541c33..713ff8f27b0 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java @@ -92,7 +92,7 @@ public class ComputerUtilCost { // value later as the AI decides what to do (in checkApiLogic / checkAiLogic) if (sa != null && sa.hasSVar(remCounter.getAmount())) { final String sVar = sa.getSVar(remCounter.getAmount()); - if (sVar.equals("XChoice")) { + if (sVar.equals("XChoice") || sVar.equals("Targeted$CardManaCost")) { sa.setSVar("ChosenX", String.valueOf(source.getCounters(type))); } } diff --git a/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java b/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java index 93168edf512..4f08eb0e0e0 100644 --- a/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java +++ b/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java @@ -76,6 +76,13 @@ public abstract class SpellAbilityAi { return false; } } + + if (sa.hasParam("AITgtBeforeCostEval")) { + // Cost payment requires a valid target to be specified, e.g. Quillmane Baku, so run the API logic first + // to set the target, then decide on paying costs (slower, so only use for cards where it matters) + return checkApiLogic(ai, sa) && (cost == null || willPayCosts(ai, sa, cost, source)); + } + if (cost != null && !willPayCosts(ai, sa, cost, source)) { return false; } diff --git a/forge-gui/res/cardsfolder/q/quillmane_baku.txt b/forge-gui/res/cardsfolder/q/quillmane_baku.txt index b850e7b3c3d..ddf79d3bf5e 100644 --- a/forge-gui/res/cardsfolder/q/quillmane_baku.txt +++ b/forge-gui/res/cardsfolder/q/quillmane_baku.txt @@ -4,9 +4,9 @@ Types:Creature Spirit PT:3/3 T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, you may put a ki counter on CARDNAME. SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ KI | CounterNum$ 1 -A:AB$ ChangeZone | Cost$ 1 T SubCounter | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Creature | ChangeNum$ 1 | References$ X | SpellDescription$ Return target creature with converted mana cost X or less to its owner's hand. +A:AB$ ChangeZone | Cost$ 1 T SubCounter | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Creature | ChangeNum$ 1 | References$ X | AITgtBeforeCostEval$ True | SpellDescription$ Return target creature with converted mana cost X or less to its owner's hand. SVar:X:Targeted$CardManaCost +AI:RemoveDeck:Random # We'll need to improve the script at some stage, especially if we add Hunter of Eyeblights or Razorfin Abolisher. -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/quillmane_baku.jpg Oracle:Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Quillmane Baku.\n{1}, {T}, Remove X ki counters from Quillmane Baku: Return target creature with converted mana cost X or less to its owner's hand. From 8a38e62aa6c8d1ae6b105e4879a5a56c942bfa94 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 3 Dec 2018 20:23:48 +0300 Subject: [PATCH 344/901] - Removed a test line. --- forge-ai/src/main/java/forge/ai/ComputerUtilCost.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java index 713ff8f27b0..dd1a4541c33 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java @@ -92,7 +92,7 @@ public class ComputerUtilCost { // value later as the AI decides what to do (in checkApiLogic / checkAiLogic) if (sa != null && sa.hasSVar(remCounter.getAmount())) { final String sVar = sa.getSVar(remCounter.getAmount()); - if (sVar.equals("XChoice") || sVar.equals("Targeted$CardManaCost")) { + if (sVar.equals("XChoice")) { sa.setSVar("ChosenX", String.valueOf(source.getCounters(type))); } } From c7df69999c6cfad60f06625d9842a48856b99d9e Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 3 Dec 2018 20:30:10 +0300 Subject: [PATCH 345/901] - Tweaked a deck in Kamigawa. --- .../planes/Kamigawa/Minamo Academy/Oni of Wild Places.dck | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Oni of Wild Places.dck b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Oni of Wild Places.dck index ecb1c98fa88..03cb503efe0 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Oni of Wild Places.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Oni of Wild Places.dck @@ -19,13 +19,13 @@ Name=Oni of Wild Places 1 Jade Idol|CHK 1 Kami of the Crescent Moon|SOK 1 Long-Forgotten Gohei|CHK -1 Meloku the Clouded Mirror|CHK 1 Mikokoro, Center of the Sea|SOK 1 Minamo, School at Water's Edge|CHK 1 Oboro, Palace in the Clouds|SOK 1 Okina, Temple to the Grandfathers|CHK 1 Orochi Eggwatcher|CHK 1 Orochi Hatchery|CHK +1 Quillmane Baku|BOK 1 Rushing-Tide Zubera|SOK 1 Seed the Land|SOK 1 Sosuke's Summons|BOK From d971a21552d1deb758e3b6b52d5e63fb8c378950 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 3 Dec 2018 21:16:52 +0300 Subject: [PATCH 346/901] - Predict combat damage reduction from static effects like Loyal Unicorn. --- .../src/main/java/forge/ai/ComputerUtilCombat.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java index f27d3dc6e77..897be168b58 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java @@ -2104,6 +2104,16 @@ public class ComputerUtilCombat { defenderDamage = predictDamageTo(attacker, defenderDamage, possibleAttackerPrevention, blocker, true); attackerDamage = predictDamageTo(blocker, attackerDamage, possibleDefenderPrevention, attacker, true); + // Damage prevention might come from a static effect + if (!ai.getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noPrevention)) { + if (isCombatDamagePrevented(attacker, blocker, attackerDamage)) { + attackerDamage = 0; + } + if (isCombatDamagePrevented(blocker, attacker, defenderDamage)) { + defenderDamage = 0; + } + } + if (combat != null) { for (Card atkr : combat.getAttackersBlockedBy(blocker)) { if (!atkr.equals(attacker)) { From 486265cbebd59fe744947b641320d5f440837c89 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 4 Dec 2018 07:17:18 +0300 Subject: [PATCH 347/901] - Fixed a bug which caused the AI not to play X-dependent targeting spells like Repeal anymore. --- .../src/main/java/forge/ai/AiController.java | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index e864ce31dcd..51126c4c884 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -670,7 +670,12 @@ public class AiController { // This is for playing spells regularly (no Cascade/Ripple etc.) private AiPlayDecision canPlayAndPayFor(final SpellAbility sa) { - if (!ComputerUtilCost.canPayCost(sa, player)) { + boolean XCost = sa.getHostCard() != null && sa.getHostCard().getManaCost() != null + && sa.getHostCard().getManaCost().countX() > 0; + + if (!XCost && !ComputerUtilCost.canPayCost(sa, player)) { + // for most costs, it's OK to check if they can be paid early in order to avoid running a heavy API check + // when the AI won't even be able to play the spell in the first place (even if it could afford it) return AiPlayDecision.CantAfford; } @@ -678,7 +683,20 @@ public class AiController { return AiPlayDecision.CantPlaySa; } - return canPlaySa(sa); + AiPlayDecision canPlay = canPlaySa(sa); // this is the "heaviest" check, which also sets up targets, defines X, etc. + if (canPlay != AiPlayDecision.WillPlay) { + return canPlay; + } + + if (XCost && !ComputerUtilCost.canPayCost(sa, player)) { + // for dependent costs with X, e.g. Repeal, which require a valid target to be specified before a decision can be made + // on whether the cost can be paid + return AiPlayDecision.CantAfford; + } + + // if we got here, looks like we can play the final cost and we could properly set up and target the API and + // are willing to play the SA + return AiPlayDecision.WillPlay; } public AiPlayDecision canPlaySa(SpellAbility sa) { From fdcccf4669832d35d63e1d4e7ebf72d1f1479a37 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 4 Dec 2018 07:19:39 +0300 Subject: [PATCH 348/901] - Comment tweak. --- forge-ai/src/main/java/forge/ai/AiController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 51126c4c884..148d287c516 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -690,7 +690,7 @@ public class AiController { if (XCost && !ComputerUtilCost.canPayCost(sa, player)) { // for dependent costs with X, e.g. Repeal, which require a valid target to be specified before a decision can be made - // on whether the cost can be paid + // on whether the cost can be paid, this can only be checked late after canPlaySa has been run (or the AI will misplay) return AiPlayDecision.CantAfford; } From f0f9e26ed19dd52a5dfccf83adaf504fa03bec0d Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 4 Dec 2018 07:28:42 +0300 Subject: [PATCH 349/901] - Check the amount of X on the SA, not necessarily on the card itself. --- forge-ai/src/main/java/forge/ai/AiController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 148d287c516..3a67fdd31fd 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -670,8 +670,8 @@ public class AiController { // This is for playing spells regularly (no Cascade/Ripple etc.) private AiPlayDecision canPlayAndPayFor(final SpellAbility sa) { - boolean XCost = sa.getHostCard() != null && sa.getHostCard().getManaCost() != null - && sa.getHostCard().getManaCost().countX() > 0; + boolean XCost = sa.getPayCosts() != null && sa.getPayCosts().getCostMana() != null + && sa.getPayCosts().getCostMana().getAmountOfX() > 0; if (!XCost && !ComputerUtilCost.canPayCost(sa, player)) { // for most costs, it's OK to check if they can be paid early in order to avoid running a heavy API check From 02d1b28124f489a724d6d3827a7d1f959caa670d Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 4 Dec 2018 08:12:06 +0300 Subject: [PATCH 350/901] - More thorough check for X in SA cost parts. --- .../src/main/java/forge/ai/AiController.java | 7 +++--- .../main/java/forge/ai/ComputerUtilMana.java | 24 +++++++++++++++---- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 3a67fdd31fd..edab1ee7792 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -670,10 +670,9 @@ public class AiController { // This is for playing spells regularly (no Cascade/Ripple etc.) private AiPlayDecision canPlayAndPayFor(final SpellAbility sa) { - boolean XCost = sa.getPayCosts() != null && sa.getPayCosts().getCostMana() != null - && sa.getPayCosts().getCostMana().getAmountOfX() > 0; + boolean xCost = ComputerUtilMana.hasXInAnyCostPart(sa); - if (!XCost && !ComputerUtilCost.canPayCost(sa, player)) { + if (!xCost && !ComputerUtilCost.canPayCost(sa, player)) { // for most costs, it's OK to check if they can be paid early in order to avoid running a heavy API check // when the AI won't even be able to play the spell in the first place (even if it could afford it) return AiPlayDecision.CantAfford; @@ -688,7 +687,7 @@ public class AiController { return canPlay; } - if (XCost && !ComputerUtilCost.canPayCost(sa, player)) { + if (xCost && !ComputerUtilCost.canPayCost(sa, player)) { // for dependent costs with X, e.g. Repeal, which require a valid target to be specified before a decision can be made // on whether the cost can be paid, this can only be checked late after canPlaySa has been run (or the AI will misplay) return AiPlayDecision.CantAfford; diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java index 02ffc322634..faaae9b1859 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java @@ -16,11 +16,7 @@ import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; import forge.game.card.*; import forge.game.combat.CombatUtil; -import forge.game.cost.Cost; -import forge.game.cost.CostAdjustment; -import forge.game.cost.CostPartMana; -import forge.game.cost.CostPayEnergy; -import forge.game.cost.CostPayment; +import forge.game.cost.*; import forge.game.mana.Mana; import forge.game.mana.ManaCostBeingPaid; import forge.game.mana.ManaPool; @@ -1560,6 +1556,24 @@ public class ComputerUtilMana { return convoke; } + public static boolean hasXInAnyCostPart(SpellAbility sa) { + boolean xCost = false; + if (sa.getPayCosts() != null) { + for (CostPart p : sa.getPayCosts().getCostParts()) { + if (p instanceof CostPartMana) { + if (((CostPartMana) p).getAmountOfX() > 0) { + xCost = true; + break; + } + } else if (p.getAmount().equals("X")) { + xCost = true; + break; + } + } + } + return xCost; + } + public static int determineMaxAffordableX(Player ai, SpellAbility sa) { if (sa.getPayCosts() == null || sa.getPayCosts().getCostMana() == null) { return -1; From b591380241aefc1d3ee0d7822847879508abd814 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 4 Dec 2018 10:09:44 +0300 Subject: [PATCH 351/901] - Restored AI playability for the old mana batteries. --- .../src/main/java/forge/ai/AiCostDecision.java | 1 + .../main/java/forge/ai/ComputerUtilCost.java | 2 +- .../main/java/forge/ai/ability/AttachAi.java | 2 ++ .../java/forge/ai/ability/ManaEffectAi.java | 18 +++++++++++++++--- .../res/cardsfolder/b/black_mana_battery.txt | 2 +- .../res/cardsfolder/b/blue_mana_battery.txt | 2 +- .../res/cardsfolder/g/green_mana_battery.txt | 2 +- .../res/cardsfolder/r/red_mana_battery.txt | 2 +- .../res/cardsfolder/w/white_mana_battery.txt | 2 +- 9 files changed, 24 insertions(+), 9 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiCostDecision.java b/forge-ai/src/main/java/forge/ai/AiCostDecision.java index 3b380c5f679..4c538e5d4d3 100644 --- a/forge-ai/src/main/java/forge/ai/AiCostDecision.java +++ b/forge-ai/src/main/java/forge/ai/AiCostDecision.java @@ -787,6 +787,7 @@ public class AiCostDecision extends CostDecisionMakerBase { final String sVar = ability.getSVar(amount); if (sVar.equals("XChoice")) { c = AbilityUtils.calculateAmount(source, "ChosenX", ability); + source.setSVar("ChosenX", "Number$" + String.valueOf(c)); } else if (amount.equals("All")) { c = source.getCounters(cost.counter); } else if (sVar.equals("Targeted$CardManaCost")) { diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java index dd1a4541c33..dcde5ed1b96 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java @@ -92,7 +92,7 @@ public class ComputerUtilCost { // value later as the AI decides what to do (in checkApiLogic / checkAiLogic) if (sa != null && sa.hasSVar(remCounter.getAmount())) { final String sVar = sa.getSVar(remCounter.getAmount()); - if (sVar.equals("XChoice")) { + if (sVar.equals("XChoice") && !sa.hasSVar("ChosenX")) { sa.setSVar("ChosenX", String.valueOf(source.getCounters(type))); } } diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index 3af7196eacf..3de3a7b20e9 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -91,6 +91,8 @@ public class AttachAi extends SpellAbilityAi { } // Don't try to attach an aura to a card which will have protection from the relevant color + // TODO: Fix this not to be dependent on "Protection from Color" wording and to be flexible to account for + // other possibilities like "protection from all colors" etc. Card targeted = sa.getTargets().getFirstTargetedCard(); if (targeted != null && !targeted.getZone().is(ZoneType.Battlefield)) { byte color = sa.getTargets().getFirstTargetedCard().getCurrentState().getColor(); diff --git a/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java b/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java index 7b4c27a77a5..535b4c34f74 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java @@ -15,6 +15,7 @@ import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; +import forge.util.Aggregates; import java.util.Arrays; import java.util.List; @@ -29,7 +30,7 @@ public class ManaEffectAi extends SpellAbilityAi { */ @Override protected boolean checkAiLogic(Player ai, SpellAbility sa, String aiLogic) { - if ("ManaRitual".equals(aiLogic)) { + if (aiLogic.startsWith("ManaRitual")) { return doManaRitualLogic(ai, sa); } else if ("Always".equals(aiLogic)) { return true; @@ -117,7 +118,8 @@ public class ManaEffectAi extends SpellAbilityAi { String produced = sa.getParam("Produced"); byte producedColor = produced.equals("Any") ? MagicColor.ALL_COLORS : MagicColor.fromName(produced); - if ("ChosenX".equals(sa.getParam("Amount")) + int numCounters = 0; + if ("XChoice".equals(host.getSVar("X")) && sa.getPayCosts() != null && sa.getPayCosts().hasSpecificCostType(CostRemoveCounter.class)) { CounterType ctrType = CounterType.KI; // Petalmane Baku for (CostPart part : sa.getPayCosts().getCostParts()) { @@ -126,7 +128,11 @@ public class ManaEffectAi extends SpellAbilityAi { break; } } - manaReceived = host.getCounters(ctrType); + numCounters = host.getCounters(ctrType); + manaReceived = numCounters; + if ("ManaRitualBattery".equals(sa.getParam("AILogic"))) { + manaReceived++; // adds an extra mana even if no counters removed + } } int searchCMC = numManaSrcs - selfCost + manaReceived; @@ -196,6 +202,12 @@ public class ManaEffectAi extends SpellAbilityAi { CardPredicates.lessCMC(searchCMC), Predicates.or(CardPredicates.isColorless(), CardPredicates.isColor(producedColor)))); + if ("ManaRitualBattery".equals(sa.getParam("AILogic"))) { + // Don't remove more counters than would be needed to cast everything we want to cast + int maxCtrs = Aggregates.sum(castableSpells, CardPredicates.Accessors.fnGetCmc); + sa.setSVar("ChosenX", "Number$" + Math.min(numCounters, maxCtrs)); + } + // TODO: this will probably still waste the card from time to time. Somehow improve detection of castable material. return castableSpells.size() > 0; } diff --git a/forge-gui/res/cardsfolder/b/black_mana_battery.txt b/forge-gui/res/cardsfolder/b/black_mana_battery.txt index e4eb26d5990..6b158ba4b8a 100644 --- a/forge-gui/res/cardsfolder/b/black_mana_battery.txt +++ b/forge-gui/res/cardsfolder/b/black_mana_battery.txt @@ -2,7 +2,7 @@ Name:Black Mana Battery ManaCost:4 Types:Artifact A:AB$ PutCounter | Cost$ 2 T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -A:AB$ Mana | Cost$ T SubCounter | References$ X,Y | Produced$ B | Amount$ Y | CostDesc$ {T}, Remove any number of charge counters from CARDNAME: | SpellDescription$ Add {B}, then add an additional {B} for each charge counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | References$ X,Y | Produced$ B | Amount$ Y | CostDesc$ {T}, Remove any number of charge counters from CARDNAME: | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {B}, then add an additional {B} for each charge counter removed this way. SVar:Y:Number$1/Plus.ChosenX SVar:X:XChoice #ChosenX SVar created by Cost payment diff --git a/forge-gui/res/cardsfolder/b/blue_mana_battery.txt b/forge-gui/res/cardsfolder/b/blue_mana_battery.txt index d5a592473f8..f8eaa9f6c92 100644 --- a/forge-gui/res/cardsfolder/b/blue_mana_battery.txt +++ b/forge-gui/res/cardsfolder/b/blue_mana_battery.txt @@ -2,7 +2,7 @@ Name:Blue Mana Battery ManaCost:4 Types:Artifact A:AB$ PutCounter | Cost$ 2 T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -A:AB$ Mana | Cost$ T SubCounter | Produced$ U | Amount$ Y | CostDesc$ {T}, Remove any number of charge counters from CARDNAME: | References$ X,Y | SpellDescription$ Add {U}, then add an additional {U} for each charge counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | Produced$ U | Amount$ Y | CostDesc$ {T}, Remove any number of charge counters from CARDNAME: | References$ X,Y | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {U}, then add an additional {U} for each charge counter removed this way. SVar:Y:Number$1/Plus.ChosenX SVar:X:XChoice #ChosenX SVar created by Cost payment diff --git a/forge-gui/res/cardsfolder/g/green_mana_battery.txt b/forge-gui/res/cardsfolder/g/green_mana_battery.txt index 24c156d0ea2..69a72d9d9e1 100644 --- a/forge-gui/res/cardsfolder/g/green_mana_battery.txt +++ b/forge-gui/res/cardsfolder/g/green_mana_battery.txt @@ -2,7 +2,7 @@ Name:Green Mana Battery ManaCost:4 Types:Artifact A:AB$ PutCounter | Cost$ 2 T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -A:AB$ Mana | Cost$ T SubCounter | Produced$ G | Amount$ Y | CostDesc$ {T}, Remove any number of charge counters from CARDNAME: | References$ X,Y | SpellDescription$ Add {G}, then add an additional {G} for each charge counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | Produced$ G | Amount$ Y | CostDesc$ {T}, Remove any number of charge counters from CARDNAME: | References$ X,Y | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {G}, then add an additional {G} for each charge counter removed this way. SVar:Y:Number$1/Plus.ChosenX SVar:X:XChoice #ChosenX SVar created by Cost payment diff --git a/forge-gui/res/cardsfolder/r/red_mana_battery.txt b/forge-gui/res/cardsfolder/r/red_mana_battery.txt index b6c2b5319fd..770054db1ca 100644 --- a/forge-gui/res/cardsfolder/r/red_mana_battery.txt +++ b/forge-gui/res/cardsfolder/r/red_mana_battery.txt @@ -2,7 +2,7 @@ Name:Red Mana Battery ManaCost:4 Types:Artifact A:AB$ PutCounter | Cost$ 2 T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -A:AB$ Mana | Cost$ T SubCounter | Produced$ R | Amount$ Y | References$ X,Y | CostDesc$ {T}, Remove any number of charge counters from CARDNAME: | SpellDescription$ Add {R}, then add an additional {R} for each charge counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | Produced$ R | Amount$ Y | References$ X,Y | CostDesc$ {T}, Remove any number of charge counters from CARDNAME: | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {R}, then add an additional {R} for each charge counter removed this way. SVar:Y:Number$1/Plus.ChosenX SVar:X:XChoice #ChosenX SVar created by Cost payment diff --git a/forge-gui/res/cardsfolder/w/white_mana_battery.txt b/forge-gui/res/cardsfolder/w/white_mana_battery.txt index f1ac19742e2..280c4e35d52 100644 --- a/forge-gui/res/cardsfolder/w/white_mana_battery.txt +++ b/forge-gui/res/cardsfolder/w/white_mana_battery.txt @@ -2,7 +2,7 @@ Name:White Mana Battery ManaCost:4 Types:Artifact A:AB$ PutCounter | Cost$ 2 T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -A:AB$ Mana | Cost$ T SubCounter | Produced$ W | Amount$ Y | CostDesc$ {T}, Remove any number of charge counters from CARDNAME: | SpellDescription$ Add {W}, then add an additional {W} for each charge counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | Produced$ W | Amount$ Y | CostDesc$ {T}, Remove any number of charge counters from CARDNAME: | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {W}, then add an additional {W} for each charge counter removed this way. SVar:Y:Number$1/Plus.ChosenX SVar:X:XChoice #ChosenX SVar created by Cost payment From d5d70cd17da5aa35ebbdbd6221b7f4affe2f02df Mon Sep 17 00:00:00 2001 From: Seravy Date: Tue, 13 Feb 2018 23:23:33 +0100 Subject: [PATCH 352/901] When a card that allows "free cast" is in play, do not prefer to discard "unplayable" cards based on CMS, instead discard worst as normal. ...but AI still isn't very eager to actually play them for some reason. --- .../src/main/java/forge/ai/AiController.java | 35 +++++++++++++------ .../main/java/forge/ai/AiCostDecision.java | 14 ++++++++ forge-gui/res/cardsfolder/d/dream_halls.txt | 1 + forge-gui/res/cardsfolder/o/omniscience.txt | 1 + 4 files changed, 41 insertions(+), 10 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index edab1ee7792..0228faf5a05 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -1046,17 +1046,32 @@ public class AiController { numLandsAvailable++; } - //Discard unplayable card + // Discard unplayable card boolean discardedUnplayable = false; - for (int j = 0; j < validCards.size(); j++) { - if (validCards.get(j).getCMC() > numLandsAvailable && !validCards.get(j).hasSVar("DoNotDiscardIfAble")) { - discardList.add(validCards.get(j)); - validCards.remove(validCards.get(j)); - discardedUnplayable = true; - break; - } else if (validCards.get(j).getCMC() <= numLandsAvailable) { - // cut short to avoid looping over cards which are guaranteed not to fit the criteria - break; + // But check if there is a card in play that allows casting spells for free! + // if yes, nothing is unplayable, at least based on CMC + boolean dreamHalls = false; + for (Card cardInPlay : game.getCardsIn(ZoneType.Battlefield)) { + if (cardInPlay.hasSVar("AllowFreeCast")) { + if ("Everyone".equals((cardInPlay.getSVar("AllowFreeCast")))) { + dreamHalls = true; + } else if (("Owner".equals((cardInPlay.getSVar("AllowFreeCast")))) + && (cardInPlay.getOwner().equals(player))) { + dreamHalls = true; + } + } + } + if (!dreamHalls) { + for (int j = 0; j < validCards.size(); j++) { + if (validCards.get(j).getCMC() > numLandsAvailable && !validCards.get(j).hasSVar("DoNotDiscardIfAble")) { + discardList.add(validCards.get(j)); + validCards.remove(validCards.get(j)); + discardedUnplayable = true; + break; + } else if (validCards.get(j).getCMC() <= numLandsAvailable) { + // cut short to avoid looping over cards which are guaranteed not to fit the criteria + break; + } } } diff --git a/forge-ai/src/main/java/forge/ai/AiCostDecision.java b/forge-ai/src/main/java/forge/ai/AiCostDecision.java index 4c538e5d4d3..68bc9e5f1c8 100644 --- a/forge-ai/src/main/java/forge/ai/AiCostDecision.java +++ b/forge-ai/src/main/java/forge/ai/AiCostDecision.java @@ -65,6 +65,20 @@ public class AiCostDecision extends CostDecisionMakerBase { final String type = cost.getType(); CardCollectionView hand = player.getCardsIn(ZoneType.Hand); +/* // Dream Halls + if (type.equals("Card.SharesColorWith")) { + Card bestfound= null; + for (Card card : hand) { + if ((card.sharesColorWith(source)) + && (!card.equals(source))) { + if (bestfound==null) { bestfound=card; } + if (card.getCMC() | AffectedZone$ Hand,Graveyard,Exile,Library,Command | Description$ Rather than pay the mana cost for a spell, its controller may discard a card that shares a color with that spell. SVar:NonStackingEffect:True AI:RemoveDeck:Random +SVar:AllowFreeCast:Everyone SVar:Picture:http://www.wizards.com/global/images/magic/general/dream_halls.jpg Oracle:Rather than pay the mana cost for a spell, its controller may discard a card that shares a color with that spell. diff --git a/forge-gui/res/cardsfolder/o/omniscience.txt b/forge-gui/res/cardsfolder/o/omniscience.txt index dcbed941b4f..0b308bd636e 100644 --- a/forge-gui/res/cardsfolder/o/omniscience.txt +++ b/forge-gui/res/cardsfolder/o/omniscience.txt @@ -2,6 +2,7 @@ Name:Omniscience ManaCost:7 U U U Types:Enchantment S:Mode$ Continuous | Affected$ Card.nonLand+YouOwn | MayPlay$ True | MayPlayWithoutManaCost$ True | AffectedZone$ Hand | Description$ You may cast spells from your hand without paying their mana costs. +SVar:AllowFreeCast:Owner AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/omniscience.jpg Oracle:You may cast spells from your hand without paying their mana costs. From e3e29d2c810450325b994d27e561a4f489081b0d Mon Sep 17 00:00:00 2001 From: Seravy Date: Wed, 14 Feb 2018 00:40:25 +0100 Subject: [PATCH 353/901] This makes the AI willing to actually discard for getting spells cast it cannot afford otherwise. --- .../src/main/java/forge/ai/AiCostDecision.java | 14 -------------- .../src/main/java/forge/ai/ComputerUtilCost.java | 13 +++++++++++++ 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiCostDecision.java b/forge-ai/src/main/java/forge/ai/AiCostDecision.java index 68bc9e5f1c8..4c538e5d4d3 100644 --- a/forge-ai/src/main/java/forge/ai/AiCostDecision.java +++ b/forge-ai/src/main/java/forge/ai/AiCostDecision.java @@ -65,20 +65,6 @@ public class AiCostDecision extends CostDecisionMakerBase { final String type = cost.getType(); CardCollectionView hand = player.getCardsIn(ZoneType.Hand); -/* // Dream Halls - if (type.equals("Card.SharesColorWith")) { - Card bestfound= null; - for (Card card : hand) { - if ((card.sharesColorWith(source)) - && (!card.equals(source))) { - if (bestfound==null) { bestfound=card; } - if (card.getCMC() lands + 1) + // Don't discard more than 1 card + && (num == 1) + )) { + return true; + } return false; } else { typeList.remove(pref); From d4da736813405330b1730f125be0e70e9c24054f Mon Sep 17 00:00:00 2001 From: Seravy Date: Wed, 14 Feb 2018 11:24:55 +0100 Subject: [PATCH 354/901] Also allow playing by discard if don't have the correct color of mana in play --- forge-ai/src/main/java/forge/ai/ComputerUtilCost.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java index 0a648ff7cbd..84cfe0bf0f1 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java @@ -152,10 +152,12 @@ public class ComputerUtilCost { // Dream Halls allows to discard 1 worthless card to cast 1 expensive for free // Do it even if nothing marked for discard in hand, if it's worth doing! int lands = ai.getCardsIn(ZoneType.Battlefield).size(); + // Don't do it for abilities on cards in play, we want it to play spells! if ((!source.isInPlay() - // We can't pay for this spell even if we play another land - && (source.getCMC() > lands + 1) + // We can't pay for this spell even if we play another land, or have wrong colors + // TODO this is ugly, is there a procedure that can determine available mana instead of land count? Otherwise this ignores moxes and other sources! + && ((source.getCMC() > lands + 1) || (source.determineColor().hasNoColorsExcept(ColorSet.fromNames(getAvailableManaColors(ai, Lists.newArrayList())).getColor()))) // Don't discard more than 1 card && (num == 1) )) { From 7aa9f7d32420055619087cb0577552e306aa5c1c Mon Sep 17 00:00:00 2001 From: Seravy Date: Wed, 14 Feb 2018 12:16:36 +0100 Subject: [PATCH 355/901] Missing ! --- forge-ai/src/main/java/forge/ai/ComputerUtilCost.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java index 84cfe0bf0f1..4e1a85c2a30 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java @@ -157,7 +157,7 @@ public class ComputerUtilCost { if ((!source.isInPlay() // We can't pay for this spell even if we play another land, or have wrong colors // TODO this is ugly, is there a procedure that can determine available mana instead of land count? Otherwise this ignores moxes and other sources! - && ((source.getCMC() > lands + 1) || (source.determineColor().hasNoColorsExcept(ColorSet.fromNames(getAvailableManaColors(ai, Lists.newArrayList())).getColor()))) + && ((source.getCMC() > lands + 1) || (!source.determineColor().hasNoColorsExcept(ColorSet.fromNames(getAvailableManaColors(ai, Lists.newArrayList())).getColor()))) // Don't discard more than 1 card && (num == 1) )) { From 0921fa3e67bd71121834e631975bcc8692d0f444 Mon Sep 17 00:00:00 2001 From: Seravy Date: Mon, 19 Feb 2018 16:52:53 +0100 Subject: [PATCH 356/901] Proper check of available mana sources --- forge-ai/src/main/java/forge/ai/ComputerUtilCost.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java index 4e1a85c2a30..8b3de9eada1 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java @@ -151,13 +151,12 @@ public class ComputerUtilCost { if (pref == null) { // Dream Halls allows to discard 1 worthless card to cast 1 expensive for free // Do it even if nothing marked for discard in hand, if it's worth doing! - int lands = ai.getCardsIn(ZoneType.Battlefield).size(); + int mana = ComputerUtilMana.getAvailableManaEstimate(ai, false); // Don't do it for abilities on cards in play, we want it to play spells! if ((!source.isInPlay() // We can't pay for this spell even if we play another land, or have wrong colors - // TODO this is ugly, is there a procedure that can determine available mana instead of land count? Otherwise this ignores moxes and other sources! - && ((source.getCMC() > lands + 1) || (!source.determineColor().hasNoColorsExcept(ColorSet.fromNames(getAvailableManaColors(ai, Lists.newArrayList())).getColor()))) + && ((source.getCMC() > mana + 1) || (!source.determineColor().hasNoColorsExcept(ColorSet.fromNames(getAvailableManaColors(ai, Lists.newArrayList())).getColor()))) // Don't discard more than 1 card && (num == 1) )) { From de3d60e9c5cb832e1069ea540b22255ff1824d02 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 4 Dec 2018 10:27:11 +0300 Subject: [PATCH 357/901] - Allow AI priority modification (may be useful for more cards, will update later). --- forge-ai/src/main/java/forge/ai/AiController.java | 3 +++ forge-gui/res/cardsfolder/a/angelic_chorus.txt | 2 ++ forge-gui/res/cardsfolder/p/pandemonium.txt | 2 ++ 3 files changed, 7 insertions(+) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 0228faf5a05..8ac9e40d793 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -881,6 +881,9 @@ public class AiController { if (source.isCreature()) { p += 1; } + if (source.hasSVar("AIPriorityModifier")) { + p += Integer.parseInt(source.getSVar("AIPriorityModifier")); + } // don't play equipments before having any creatures if (source.isEquipment() && noCreatures) { p -= 9; diff --git a/forge-gui/res/cardsfolder/a/angelic_chorus.txt b/forge-gui/res/cardsfolder/a/angelic_chorus.txt index d2cb5ebe1ba..ddf32254ee5 100644 --- a/forge-gui/res/cardsfolder/a/angelic_chorus.txt +++ b/forge-gui/res/cardsfolder/a/angelic_chorus.txt @@ -4,5 +4,7 @@ Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever a creature enters the battlefield under your control, you gain life equal to its toughness. SVar:TrigGainLife:DB$GainLife | Defined$ You | LifeAmount$ X | References$ X SVar:X:TriggeredCard$CardToughness +SVar:PlayMain1:TRUE +SVar:AIPriorityModifier:9 SVar:Picture:http://www.wizards.com/global/images/magic/general/angelic_chorus.jpg Oracle:Whenever a creature enters the battlefield under your control, you gain life equal to its toughness. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/p/pandemonium.txt b/forge-gui/res/cardsfolder/p/pandemonium.txt index 4c23ada2711..c653308b53f 100644 --- a/forge-gui/res/cardsfolder/p/pandemonium.txt +++ b/forge-gui/res/cardsfolder/p/pandemonium.txt @@ -4,6 +4,8 @@ Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigDamage | OptionalDecider$ TriggeredCardController | TriggerDescription$ Whenever a creature enters the battlefield, that creature's controller may have it deal damage equal to its power to any target of their choice. SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X | DamageSource$ TriggeredCard | TargetingPlayer$ TriggeredCardController SVar:X:TriggeredCard$CardPower +SVar:PlayMain1:TRUE +SVar:AIPriorityModifier:9 AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/pandemonium.jpg Oracle:Whenever a creature enters the battlefield, that creature's controller may have it deal damage equal to its power to any target of their choice. From 82ff6c020a2dd9d80a63b40d538c3ed79f22451f Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 4 Dec 2018 11:57:16 +0300 Subject: [PATCH 358/901] - Attempting to offer a reasonable implementation for Dream Halls AI, based on Seravy's original idea from a while ago. --- .../src/main/java/forge/ai/AiController.java | 39 ++++----- .../src/main/java/forge/ai/ComputerUtil.java | 30 +++++++ .../main/java/forge/ai/ComputerUtilCost.java | 81 +++++++++---------- forge-gui/res/cardsfolder/d/dream_halls.txt | 2 +- forge-gui/res/cardsfolder/o/omniscience.txt | 2 +- 5 files changed, 84 insertions(+), 70 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 8ac9e40d793..0cc505a855c 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -1049,32 +1049,21 @@ public class AiController { numLandsAvailable++; } - // Discard unplayable card - boolean discardedUnplayable = false; + // Discard unplayable card (checks by CMC) // But check if there is a card in play that allows casting spells for free! - // if yes, nothing is unplayable, at least based on CMC - boolean dreamHalls = false; - for (Card cardInPlay : game.getCardsIn(ZoneType.Battlefield)) { - if (cardInPlay.hasSVar("AllowFreeCast")) { - if ("Everyone".equals((cardInPlay.getSVar("AllowFreeCast")))) { - dreamHalls = true; - } else if (("Owner".equals((cardInPlay.getSVar("AllowFreeCast")))) - && (cardInPlay.getOwner().equals(player))) { - dreamHalls = true; - } - } - } - if (!dreamHalls) { - for (int j = 0; j < validCards.size(); j++) { - if (validCards.get(j).getCMC() > numLandsAvailable && !validCards.get(j).hasSVar("DoNotDiscardIfAble")) { - discardList.add(validCards.get(j)); - validCards.remove(validCards.get(j)); - discardedUnplayable = true; - break; - } else if (validCards.get(j).getCMC() <= numLandsAvailable) { - // cut short to avoid looping over cards which are guaranteed not to fit the criteria - break; - } + // if yes, nothing is unplayable based on CMC alone + boolean discardedUnplayable = false; + boolean freeCastAllowed = ComputerUtilCost.isFreeCastAllowedByPermanent(player, null); + + for (int j = 0; j < validCards.size(); j++) { + if ((validCards.get(j).getCMC() > numLandsAvailable || freeCastAllowed) && !validCards.get(j).hasSVar("DoNotDiscardIfAble")) { + discardList.add(validCards.get(j)); + validCards.remove(validCards.get(j)); + discardedUnplayable = true; + break; + } else if (validCards.get(j).getCMC() <= numLandsAvailable) { + // cut short to avoid looping over cards which are guaranteed not to fit the criteria + break; } } diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index 51bf306bb19..eb75fc8b9e6 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -23,6 +23,7 @@ import com.google.common.collect.*; import forge.ai.ability.ProtectAi; import forge.ai.ability.TokenAi; import forge.card.CardType; +import forge.card.ColorSet; import forge.card.MagicColor; import forge.card.mana.ManaCostShard; import forge.game.CardTraitPredicates; @@ -409,6 +410,35 @@ public class ComputerUtil { } } + if (ComputerUtilCost.isFreeCastAllowedByPermanent(ai, "Discard")) { + // Dream Halls allows to discard 1 worthless card to cast 1 expensive for free + // Do it even if nothing marked for discard in hand, if it's worth doing! + int mana = ComputerUtilMana.getAvailableManaEstimate(ai, false); + + boolean cantAffordSoon = activate.getCMC() > mana + 1; + boolean wrongColor = !activate.determineColor().hasNoColorsExcept(ColorSet.fromNames(ComputerUtilCost.getAvailableManaColors(ai, Lists.newArrayList())).getColor()); + + // Only do this for spells, not activated abilities + // We can't pay for this spell even if we play another land, or have wrong colors + if (!activate.isInPlay() && (cantAffordSoon || wrongColor)) { + CardCollection options = new CardCollection(); + for (Card c : typeList) { + // Try to avoid stupidity by playing cheap spells and paying for them with expensive spells + // while the intention was to do things the other way around + if (c.isCreature() && activate.isCreature()) { + if (ComputerUtilCard.evaluateCreature(c) < ComputerUtilCard.evaluateCreature(activate)) { + options.add(c); + } + } else if (c.getCMC() <= activate.getCMC()) { + options.add(c); + } + } + if (!options.isEmpty()) { + return ComputerUtilCard.getWorstAI(options); + } + } + } + // Survival of the Fittest logic if (prefDef.contains("DiscardCost$Special:SurvivalOfTheFittest")) { return SpecialCardAi.SurvivalOfTheFittest.considerDiscardTarget(ai); diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java index 8b3de9eada1..aa89e0261e3 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java @@ -5,19 +5,15 @@ import com.google.common.collect.Lists; import com.google.common.collect.Sets; import forge.ai.ability.AnimateAi; import forge.card.ColorSet; +import forge.game.Game; import forge.game.ability.AbilityUtils; -import forge.game.card.Card; -import forge.game.card.CardCollection; -import forge.game.card.CardFactoryUtil; -import forge.game.card.CardLists; +import forge.game.card.*; import forge.game.card.CardPredicates.Presets; -import forge.game.card.CounterType; import forge.game.combat.Combat; import forge.game.cost.*; import forge.game.player.Player; import forge.game.spellability.Spell; import forge.game.spellability.SpellAbility; -import forge.game.zone.PlayerZoneBattlefield; import forge.game.zone.ZoneType; import forge.util.MyRandom; import forge.util.TextUtil; @@ -32,7 +28,7 @@ public class ComputerUtilCost { /** * Check add m1 m1 counter cost. - * + * * @param cost * the cost * @param source @@ -47,7 +43,7 @@ public class ComputerUtilCost { if (part instanceof CostPutCounter) { final CostPutCounter addCounter = (CostPutCounter) part; final CounterType type = addCounter.getCounter(); - + if (type.equals(CounterType.M1M1)) { return false; } @@ -61,7 +57,7 @@ public class ComputerUtilCost { } /** * Check remove counter cost. - * + * * @param cost * the cost * @param source @@ -75,7 +71,7 @@ public class ComputerUtilCost { for (final CostPart part : cost.getCostParts()) { if (part instanceof CostRemoveCounter) { final CostRemoveCounter remCounter = (CostRemoveCounter) part; - + final CounterType type = remCounter.counter; if (!part.payCostFromSource()) { if (type.name().equals("P1P1")) { @@ -119,7 +115,7 @@ public class ComputerUtilCost { /** * Check discard cost. - * + * * @param cost * the cost * @param source @@ -136,7 +132,7 @@ public class ComputerUtilCost { for (final CostPart part : cost.getCostParts()) { if (part instanceof CostDiscard) { final CostDiscard disc = (CostDiscard) part; - + final String type = disc.getType(); if (type.equals("CARDNAME") && source.getAbilityText().contains("Bloodrush")) { continue; @@ -146,22 +142,10 @@ public class ComputerUtilCost { continue; } int num = AbilityUtils.calculateAmount(source, disc.getAmount(), null); + for (int i = 0; i < num; i++) { Card pref = ComputerUtil.getCardPreference(ai, source, "DiscardCost", typeList); if (pref == null) { - // Dream Halls allows to discard 1 worthless card to cast 1 expensive for free - // Do it even if nothing marked for discard in hand, if it's worth doing! - int mana = ComputerUtilMana.getAvailableManaEstimate(ai, false); - - // Don't do it for abilities on cards in play, we want it to play spells! - if ((!source.isInPlay() - // We can't pay for this spell even if we play another land, or have wrong colors - && ((source.getCMC() > mana + 1) || (!source.determineColor().hasNoColorsExcept(ColorSet.fromNames(getAvailableManaColors(ai, Lists.newArrayList())).getColor()))) - // Don't discard more than 1 card - && (num == 1) - )) { - return true; - } return false; } else { typeList.remove(pref); @@ -175,7 +159,7 @@ public class ComputerUtilCost { /** * Check life cost. - * + * * @param cost * the cost * @param source @@ -207,7 +191,7 @@ public class ComputerUtilCost { /** * Check life cost. - * + * * @param cost * the cost * @param source @@ -224,12 +208,12 @@ public class ComputerUtilCost { for (final CostPart part : cost.getCostParts()) { if (part instanceof CostPayLife) { final CostPayLife payLife = (CostPayLife) part; - + Integer amount = payLife.convertAmount(); if (amount == null) { amount = AbilityUtils.calculateAmount(source, payLife.getAmount(), sourceAbility); } - + // check if there's override for the remainingLife threshold if (sourceAbility != null && sourceAbility.hasParam("AILifeThreshold")) { remainingLife = Integer.parseInt(sourceAbility.getParam("AILifeThreshold")); @@ -245,7 +229,7 @@ public class ComputerUtilCost { /** * Check creature sacrifice cost. - * + * * @param cost * the cost * @param source @@ -265,7 +249,7 @@ public class ComputerUtilCost { return false; } final String type = sac.getType(); - + if (type.equals("CARDNAME")) { continue; } @@ -290,7 +274,7 @@ public class ComputerUtilCost { /** * Check sacrifice cost. - * + * * @param cost * the cost * @param source @@ -337,7 +321,7 @@ public class ComputerUtilCost { } return true; } - + public static boolean isSacrificeSelfCost(final Cost cost) { if (cost == null) { return false; @@ -354,7 +338,7 @@ public class ComputerUtilCost { /** * Check creature sacrifice cost. - * + * * @param cost * the cost * @param source @@ -400,7 +384,7 @@ public class ComputerUtilCost { /** * Check sacrifice cost. - * + * * @param cost * the cost * @param source @@ -415,14 +399,14 @@ public class ComputerUtilCost { *

* shouldPayCost. *

- * + * * @param hostCard * a {@link forge.game.card.Card} object. * @param cost * @return a boolean. */ public static boolean shouldPayCost(final Player ai, final Card hostCard, final Cost cost) { - + for (final CostPart part : cost.getCostParts()) { if (part instanceof CostPayLife) { if (!ai.cantLoseForZeroOrLessLife()) { @@ -437,7 +421,7 @@ public class ComputerUtilCost { } } } - + return true; } // shouldPayCost() @@ -445,7 +429,7 @@ public class ComputerUtilCost { *

* canPayCost. *

- * + * * @param sa * a {@link forge.game.spellability.SpellAbility} object. * @param player @@ -493,7 +477,7 @@ public class ComputerUtilCost { } } } - + // Try not to lose Planeswalker if not threatened if (sa.getRestrictions().isPwAbility()) { for (final CostPart part : sa.getPayCosts().getCostParts()) { @@ -518,7 +502,7 @@ public class ComputerUtilCost { } } - return ComputerUtilMana.canPayManaCost(sa, player, extraManaNeeded) + return ComputerUtilMana.canPayManaCost(sa, player, extraManaNeeded) && CostPayment.canPayAdditionalCosts(sa.getPayCosts(), sa); } // canPayCost() @@ -530,7 +514,7 @@ public class ComputerUtilCost { boolean payNever = "Never".equals(aiLogic); boolean shockland = "Shockland".equals(aiLogic); boolean isMine = sa.getActivatingPlayer().equals(payer); - + if (payNever) { return false; } if (payForOwnOnly && !isMine) { return false; } if (payOwner) { @@ -550,7 +534,7 @@ public class ComputerUtilCost { // if the new land size would equal the CMC of a card in AIs hand, consider playing it untapped, // otherwise don't bother running other checks if (landsize != c.getCMC()) { - continue; + continue; } // try to determine in the AI is actually planning to play a spell ability from the card boolean willPlay = ComputerUtil.hasReasonToPlayCardThisTurn(payer, c); @@ -634,4 +618,15 @@ public class ComputerUtilCost { return colorsAvailable; } + + public static boolean isFreeCastAllowedByPermanent(Player player, String altCost) { + Game game = player.getGame(); + for (Card cardInPlay : game.getCardsIn(ZoneType.Battlefield)) { + if (cardInPlay.hasSVar("AllowFreeCast")) { + return altCost == null ? "Always".equals(cardInPlay.getSVar("AllowFreeCast")) + : altCost.equals(cardInPlay.getSVar("AllowFreeCast")); + } + } + return false; + } } diff --git a/forge-gui/res/cardsfolder/d/dream_halls.txt b/forge-gui/res/cardsfolder/d/dream_halls.txt index 2e176e48502..4f9252203a0 100644 --- a/forge-gui/res/cardsfolder/d/dream_halls.txt +++ b/forge-gui/res/cardsfolder/d/dream_halls.txt @@ -4,6 +4,6 @@ Types:Enchantment S:Mode$ Continuous | Affected$ Card.nonToken | AddKeyword$ Alternative Cost:Discard<1/Card.SharesColorWith/color sharing> | AffectedZone$ Hand,Graveyard,Exile,Library,Command | Description$ Rather than pay the mana cost for a spell, its controller may discard a card that shares a color with that spell. SVar:NonStackingEffect:True AI:RemoveDeck:Random -SVar:AllowFreeCast:Everyone +SVar:AllowFreeCast:Discard SVar:Picture:http://www.wizards.com/global/images/magic/general/dream_halls.jpg Oracle:Rather than pay the mana cost for a spell, its controller may discard a card that shares a color with that spell. diff --git a/forge-gui/res/cardsfolder/o/omniscience.txt b/forge-gui/res/cardsfolder/o/omniscience.txt index 0b308bd636e..61adb2f4d15 100644 --- a/forge-gui/res/cardsfolder/o/omniscience.txt +++ b/forge-gui/res/cardsfolder/o/omniscience.txt @@ -2,7 +2,7 @@ Name:Omniscience ManaCost:7 U U U Types:Enchantment S:Mode$ Continuous | Affected$ Card.nonLand+YouOwn | MayPlay$ True | MayPlayWithoutManaCost$ True | AffectedZone$ Hand | Description$ You may cast spells from your hand without paying their mana costs. -SVar:AllowFreeCast:Owner AI:RemoveDeck:Random +SVar:AllowFreeCast:Always SVar:Picture:http://www.wizards.com/global/images/magic/general/omniscience.jpg Oracle:You may cast spells from your hand without paying their mana costs. From 9e6b1acf89652e4b3010683d314d199dd765718e Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 4 Dec 2018 12:02:32 +0300 Subject: [PATCH 359/901] - Minor style fix. --- forge-gui/res/cardsfolder/d/dream_halls.txt | 2 +- forge-gui/res/cardsfolder/o/omniscience.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/d/dream_halls.txt b/forge-gui/res/cardsfolder/d/dream_halls.txt index 4f9252203a0..53608641036 100644 --- a/forge-gui/res/cardsfolder/d/dream_halls.txt +++ b/forge-gui/res/cardsfolder/d/dream_halls.txt @@ -3,7 +3,7 @@ ManaCost:3 U U Types:Enchantment S:Mode$ Continuous | Affected$ Card.nonToken | AddKeyword$ Alternative Cost:Discard<1/Card.SharesColorWith/color sharing> | AffectedZone$ Hand,Graveyard,Exile,Library,Command | Description$ Rather than pay the mana cost for a spell, its controller may discard a card that shares a color with that spell. SVar:NonStackingEffect:True -AI:RemoveDeck:Random SVar:AllowFreeCast:Discard +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dream_halls.jpg Oracle:Rather than pay the mana cost for a spell, its controller may discard a card that shares a color with that spell. diff --git a/forge-gui/res/cardsfolder/o/omniscience.txt b/forge-gui/res/cardsfolder/o/omniscience.txt index 61adb2f4d15..8a4b812a90e 100644 --- a/forge-gui/res/cardsfolder/o/omniscience.txt +++ b/forge-gui/res/cardsfolder/o/omniscience.txt @@ -2,7 +2,7 @@ Name:Omniscience ManaCost:7 U U U Types:Enchantment S:Mode$ Continuous | Affected$ Card.nonLand+YouOwn | MayPlay$ True | MayPlayWithoutManaCost$ True | AffectedZone$ Hand | Description$ You may cast spells from your hand without paying their mana costs. -AI:RemoveDeck:Random SVar:AllowFreeCast:Always +AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/omniscience.jpg Oracle:You may cast spells from your hand without paying their mana costs. From 373cd9bd24d07993c1dcf75cd3e72006503a864f Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 4 Dec 2018 12:21:04 +0300 Subject: [PATCH 360/901] - Further updated mana ritual cards to properly account for Battery effect. --- .../src/main/java/forge/ai/AiController.java | 2 +- .../main/java/forge/ai/ComputerUtilMana.java | 18 ------------------ .../java/forge/ai/ability/ManaEffectAi.java | 5 +++-- .../src/main/java/forge/game/cost/Cost.java | 18 ++++++++++++++++++ 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 0cc505a855c..35b666e0781 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -670,7 +670,7 @@ public class AiController { // This is for playing spells regularly (no Cascade/Ripple etc.) private AiPlayDecision canPlayAndPayFor(final SpellAbility sa) { - boolean xCost = ComputerUtilMana.hasXInAnyCostPart(sa); + boolean xCost = sa.getPayCosts().hasXInAnyCostPart(sa); if (!xCost && !ComputerUtilCost.canPayCost(sa, player)) { // for most costs, it's OK to check if they can be paid early in order to avoid running a heavy API check diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java index faaae9b1859..1330e32a0f3 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java @@ -1556,24 +1556,6 @@ public class ComputerUtilMana { return convoke; } - public static boolean hasXInAnyCostPart(SpellAbility sa) { - boolean xCost = false; - if (sa.getPayCosts() != null) { - for (CostPart p : sa.getPayCosts().getCostParts()) { - if (p instanceof CostPartMana) { - if (((CostPartMana) p).getAmountOfX() > 0) { - xCost = true; - break; - } - } else if (p.getAmount().equals("X")) { - xCost = true; - break; - } - } - } - return xCost; - } - public static int determineMaxAffordableX(Player ai, SpellAbility sa) { if (sa.getPayCosts() == null || sa.getPayCosts().getCostMana() == null) { return -1; diff --git a/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java b/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java index 535b4c34f74..d01e1ca4683 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java @@ -203,8 +203,9 @@ public class ManaEffectAi extends SpellAbilityAi { Predicates.or(CardPredicates.isColorless(), CardPredicates.isColor(producedColor)))); if ("ManaRitualBattery".equals(sa.getParam("AILogic"))) { - // Don't remove more counters than would be needed to cast everything we want to cast - int maxCtrs = Aggregates.sum(castableSpells, CardPredicates.Accessors.fnGetCmc); + // Don't remove more counters than would be needed to cast the more expensive thing we want to cast, + // otherwise the AI grabs too many counters at once. + int maxCtrs = Aggregates.max(castableSpells, CardPredicates.Accessors.fnGetCmc) - 1; sa.setSVar("ChosenX", "Number$" + Math.min(numCounters, maxCtrs)); } diff --git a/forge-game/src/main/java/forge/game/cost/Cost.java b/forge-game/src/main/java/forge/game/cost/Cost.java index c4c31aff270..5a48859876a 100644 --- a/forge-game/src/main/java/forge/game/cost/Cost.java +++ b/forge-game/src/main/java/forge/game/cost/Cost.java @@ -935,5 +935,23 @@ public class Cost implements Serializable { return true; } + public boolean hasXInAnyCostPart(SpellAbility sa) { + boolean xCost = false; + if (sa.getPayCosts() != null) { + for (CostPart p : sa.getPayCosts().getCostParts()) { + if (p instanceof CostPartMana) { + if (((CostPartMana) p).getAmountOfX() > 0) { + xCost = true; + break; + } + } else if (p.getAmount().equals("X")) { + xCost = true; + break; + } + } + } + return xCost; + } + public static final Cost Zero = new Cost(0); } From 4b060e59bf5fc134770e89b1f0259b2047ed4ebe Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 4 Dec 2018 12:30:32 +0300 Subject: [PATCH 361/901] - Expanded ManaRitualBattery for basic storage land support. --- .../src/main/java/forge/ai/ability/ManaEffectAi.java | 11 +++++++---- forge-gui/res/cardsfolder/b/black_mana_battery.txt | 2 +- forge-gui/res/cardsfolder/b/blue_mana_battery.txt | 2 +- forge-gui/res/cardsfolder/f/fountain_of_cho.txt | 3 +-- forge-gui/res/cardsfolder/g/green_mana_battery.txt | 2 +- forge-gui/res/cardsfolder/m/mage_ring_network.txt | 3 +-- forge-gui/res/cardsfolder/m/mercadian_bazaar.txt | 3 +-- forge-gui/res/cardsfolder/r/red_mana_battery.txt | 2 +- forge-gui/res/cardsfolder/r/rushwood_grove.txt | 3 +-- forge-gui/res/cardsfolder/s/saprazzan_cove.txt | 3 +-- forge-gui/res/cardsfolder/s/subterranean_hangar.txt | 3 +-- forge-gui/res/cardsfolder/w/white_mana_battery.txt | 2 +- 12 files changed, 18 insertions(+), 21 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java b/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java index d01e1ca4683..868f69fd185 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java @@ -107,6 +107,7 @@ public class ManaEffectAi extends SpellAbilityAi { // Dark Ritual and other similar instants/sorceries that add mana to mana pool private boolean doManaRitualLogic(Player ai, SpellAbility sa) { final Card host = sa.getHostCard(); + final String logic = sa.getParamOrDefault("AILogic", ""); CardCollection manaSources = ComputerUtilMana.getAvailableManaSources(ai, true); int numManaSrcs = manaSources.size(); @@ -119,6 +120,7 @@ public class ManaEffectAi extends SpellAbilityAi { byte producedColor = produced.equals("Any") ? MagicColor.ALL_COLORS : MagicColor.fromName(produced); int numCounters = 0; + int manaSurplus = 0; if ("XChoice".equals(host.getSVar("X")) && sa.getPayCosts() != null && sa.getPayCosts().hasSpecificCostType(CostRemoveCounter.class)) { CounterType ctrType = CounterType.KI; // Petalmane Baku @@ -130,8 +132,9 @@ public class ManaEffectAi extends SpellAbilityAi { } numCounters = host.getCounters(ctrType); manaReceived = numCounters; - if ("ManaRitualBattery".equals(sa.getParam("AILogic"))) { - manaReceived++; // adds an extra mana even if no counters removed + if (logic.startsWith("ManaRitualBattery.")) { + manaSurplus = Integer.valueOf(logic.substring(18)); // adds an extra mana even if no counters removed + manaReceived += manaSurplus; } } @@ -202,10 +205,10 @@ public class ManaEffectAi extends SpellAbilityAi { CardPredicates.lessCMC(searchCMC), Predicates.or(CardPredicates.isColorless(), CardPredicates.isColor(producedColor)))); - if ("ManaRitualBattery".equals(sa.getParam("AILogic"))) { + if (logic.startsWith("ManaRitualBattery")) { // Don't remove more counters than would be needed to cast the more expensive thing we want to cast, // otherwise the AI grabs too many counters at once. - int maxCtrs = Aggregates.max(castableSpells, CardPredicates.Accessors.fnGetCmc) - 1; + int maxCtrs = Aggregates.max(castableSpells, CardPredicates.Accessors.fnGetCmc) - manaSurplus; sa.setSVar("ChosenX", "Number$" + Math.min(numCounters, maxCtrs)); } diff --git a/forge-gui/res/cardsfolder/b/black_mana_battery.txt b/forge-gui/res/cardsfolder/b/black_mana_battery.txt index 6b158ba4b8a..1a7dd97c617 100644 --- a/forge-gui/res/cardsfolder/b/black_mana_battery.txt +++ b/forge-gui/res/cardsfolder/b/black_mana_battery.txt @@ -2,7 +2,7 @@ Name:Black Mana Battery ManaCost:4 Types:Artifact A:AB$ PutCounter | Cost$ 2 T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -A:AB$ Mana | Cost$ T SubCounter | References$ X,Y | Produced$ B | Amount$ Y | CostDesc$ {T}, Remove any number of charge counters from CARDNAME: | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {B}, then add an additional {B} for each charge counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | References$ X,Y | Produced$ B | Amount$ Y | CostDesc$ {T}, Remove any number of charge counters from CARDNAME: | AILogic$ ManaRitualBattery.1 | AINoRecursiveCheck$ True | SpellDescription$ Add {B}, then add an additional {B} for each charge counter removed this way. SVar:Y:Number$1/Plus.ChosenX SVar:X:XChoice #ChosenX SVar created by Cost payment diff --git a/forge-gui/res/cardsfolder/b/blue_mana_battery.txt b/forge-gui/res/cardsfolder/b/blue_mana_battery.txt index f8eaa9f6c92..08def6bf791 100644 --- a/forge-gui/res/cardsfolder/b/blue_mana_battery.txt +++ b/forge-gui/res/cardsfolder/b/blue_mana_battery.txt @@ -2,7 +2,7 @@ Name:Blue Mana Battery ManaCost:4 Types:Artifact A:AB$ PutCounter | Cost$ 2 T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -A:AB$ Mana | Cost$ T SubCounter | Produced$ U | Amount$ Y | CostDesc$ {T}, Remove any number of charge counters from CARDNAME: | References$ X,Y | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {U}, then add an additional {U} for each charge counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | Produced$ U | Amount$ Y | CostDesc$ {T}, Remove any number of charge counters from CARDNAME: | References$ X,Y | AILogic$ ManaRitualBattery.1 | AINoRecursiveCheck$ True | SpellDescription$ Add {U}, then add an additional {U} for each charge counter removed this way. SVar:Y:Number$1/Plus.ChosenX SVar:X:XChoice #ChosenX SVar created by Cost payment diff --git a/forge-gui/res/cardsfolder/f/fountain_of_cho.txt b/forge-gui/res/cardsfolder/f/fountain_of_cho.txt index a8cf43e3bb8..a3181ca8392 100644 --- a/forge-gui/res/cardsfolder/f/fountain_of_cho.txt +++ b/forge-gui/res/cardsfolder/f/fountain_of_cho.txt @@ -3,9 +3,8 @@ ManaCost:no cost Types:Land K:CARDNAME enters the battlefield tapped. A:AB$ PutCounter | Cost$ T | Defined$ Self | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME. -A:AB$ Mana | Cost$ T SubCounter | Produced$ W | Amount$ ChosenX | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | References$ X | SpellDescription$ Add {W} for each storage counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | Produced$ W | Amount$ ChosenX | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | References$ X | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {W} for each storage counter removed this way. SVar:X:XChoice #ChosenX SVar created by Cost payment -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/fountain_of_cho.jpg Oracle:Fountain of Cho enters the battlefield tapped.\n{T}: Put a storage counter on Fountain of Cho.\n{T}, Remove any number of storage counters from Fountain of Cho: Add {W} for each storage counter removed this way. diff --git a/forge-gui/res/cardsfolder/g/green_mana_battery.txt b/forge-gui/res/cardsfolder/g/green_mana_battery.txt index 69a72d9d9e1..008c1da35ac 100644 --- a/forge-gui/res/cardsfolder/g/green_mana_battery.txt +++ b/forge-gui/res/cardsfolder/g/green_mana_battery.txt @@ -2,7 +2,7 @@ Name:Green Mana Battery ManaCost:4 Types:Artifact A:AB$ PutCounter | Cost$ 2 T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -A:AB$ Mana | Cost$ T SubCounter | Produced$ G | Amount$ Y | CostDesc$ {T}, Remove any number of charge counters from CARDNAME: | References$ X,Y | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {G}, then add an additional {G} for each charge counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | Produced$ G | Amount$ Y | CostDesc$ {T}, Remove any number of charge counters from CARDNAME: | References$ X,Y | AILogic$ ManaRitualBattery.1 | AINoRecursiveCheck$ True | SpellDescription$ Add {G}, then add an additional {G} for each charge counter removed this way. SVar:Y:Number$1/Plus.ChosenX SVar:X:XChoice #ChosenX SVar created by Cost payment diff --git a/forge-gui/res/cardsfolder/m/mage_ring_network.txt b/forge-gui/res/cardsfolder/m/mage_ring_network.txt index 6ab0a5de275..15b353f6398 100644 --- a/forge-gui/res/cardsfolder/m/mage_ring_network.txt +++ b/forge-gui/res/cardsfolder/m/mage_ring_network.txt @@ -3,8 +3,7 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ PutCounter | Cost$ 1 T | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME. -A:AB$ Mana | Cost$ T SubCounter | Produced$ C | Amount$ ChosenX | CostDesc$ {T}, Remove X storage counters from CARDNAME: | References$ X | SpellDescription$ Add {C} equal to the amount of counters removed. +A:AB$ Mana | Cost$ T SubCounter | Produced$ C | Amount$ ChosenX | CostDesc$ {T}, Remove X storage counters from CARDNAME: | References$ X | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {C} equal to the amount of counters removed. SVar:X:XChoice -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mage_ring_network.jpg Oracle:{T}: Add {C}.\n{1}, {T}: Put a storage counter on Mage-Ring Network.\n{T}, Remove X storage counters from Mage-Ring Network: Add {C} equal to the amount of counters removed. diff --git a/forge-gui/res/cardsfolder/m/mercadian_bazaar.txt b/forge-gui/res/cardsfolder/m/mercadian_bazaar.txt index da26bff1f16..a333982d008 100644 --- a/forge-gui/res/cardsfolder/m/mercadian_bazaar.txt +++ b/forge-gui/res/cardsfolder/m/mercadian_bazaar.txt @@ -3,9 +3,8 @@ ManaCost:no cost Types:Land K:CARDNAME enters the battlefield tapped. A:AB$ PutCounter | Cost$ T | Defined$ Self | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME. -A:AB$ Mana | Cost$ T SubCounter | Produced$ R | Amount$ ChosenX | References$ X | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | SpellDescription$ Add {R} for each storage counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | Produced$ R | Amount$ ChosenX | References$ X | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {R} for each storage counter removed this way. SVar:X:XChoice #ChosenX SVar created by Cost payment -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mercadian_bazaar.jpg Oracle:Mercadian Bazaar enters the battlefield tapped.\n{T}: Put a storage counter on Mercadian Bazaar.\n{T}, Remove any number of storage counters from Mercadian Bazaar: Add {R} for each storage counter removed this way. diff --git a/forge-gui/res/cardsfolder/r/red_mana_battery.txt b/forge-gui/res/cardsfolder/r/red_mana_battery.txt index 770054db1ca..082facea057 100644 --- a/forge-gui/res/cardsfolder/r/red_mana_battery.txt +++ b/forge-gui/res/cardsfolder/r/red_mana_battery.txt @@ -2,7 +2,7 @@ Name:Red Mana Battery ManaCost:4 Types:Artifact A:AB$ PutCounter | Cost$ 2 T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -A:AB$ Mana | Cost$ T SubCounter | Produced$ R | Amount$ Y | References$ X,Y | CostDesc$ {T}, Remove any number of charge counters from CARDNAME: | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {R}, then add an additional {R} for each charge counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | Produced$ R | Amount$ Y | References$ X,Y | CostDesc$ {T}, Remove any number of charge counters from CARDNAME: | AILogic$ ManaRitualBattery.1 | AINoRecursiveCheck$ True | SpellDescription$ Add {R}, then add an additional {R} for each charge counter removed this way. SVar:Y:Number$1/Plus.ChosenX SVar:X:XChoice #ChosenX SVar created by Cost payment diff --git a/forge-gui/res/cardsfolder/r/rushwood_grove.txt b/forge-gui/res/cardsfolder/r/rushwood_grove.txt index 2fdb4972cd3..3b3ba846c3b 100644 --- a/forge-gui/res/cardsfolder/r/rushwood_grove.txt +++ b/forge-gui/res/cardsfolder/r/rushwood_grove.txt @@ -3,9 +3,8 @@ ManaCost:no cost Types:Land K:CARDNAME enters the battlefield tapped. A:AB$ PutCounter | Cost$ T | Defined$ Self | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME. -A:AB$ Mana | Cost$ T SubCounter | Produced$ G | Amount$ ChosenX | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | References$ X | SpellDescription$ Add {G} for each storage counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | Produced$ G | Amount$ ChosenX | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | References$ X | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {G} for each storage counter removed this way. SVar:X:XChoice #ChosenX SVar created by Cost payment -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/rushwood_grove.jpg Oracle:Rushwood Grove enters the battlefield tapped.\n{T}: Put a storage counter on Rushwood Grove.\n{T}, Remove any number of storage counters from Rushwood Grove: Add {G} for each storage counter removed this way. diff --git a/forge-gui/res/cardsfolder/s/saprazzan_cove.txt b/forge-gui/res/cardsfolder/s/saprazzan_cove.txt index 661555ad76f..d1fa6c9effc 100644 --- a/forge-gui/res/cardsfolder/s/saprazzan_cove.txt +++ b/forge-gui/res/cardsfolder/s/saprazzan_cove.txt @@ -3,9 +3,8 @@ ManaCost:no cost Types:Land K:CARDNAME enters the battlefield tapped. A:AB$ PutCounter | Cost$ T | Defined$ Self | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME. -A:AB$ Mana | Cost$ T SubCounter | Produced$ U | Amount$ ChosenX | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | References$ X | SpellDescription$ Add {U} for each storage counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | Produced$ U | Amount$ ChosenX | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | References$ X | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {U} for each storage counter removed this way. SVar:X:XChoice #ChosenX SVar created by Cost payment -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/saprazzan_cove.jpg Oracle:Saprazzan Cove enters the battlefield tapped.\n{T}: Put a storage counter on Saprazzan Cove.\n{T}, Remove any number of storage counters from Saprazzan Cove: Add {U} for each storage counter removed this way. diff --git a/forge-gui/res/cardsfolder/s/subterranean_hangar.txt b/forge-gui/res/cardsfolder/s/subterranean_hangar.txt index 8e66ea7b7d7..baa0831bfa9 100644 --- a/forge-gui/res/cardsfolder/s/subterranean_hangar.txt +++ b/forge-gui/res/cardsfolder/s/subterranean_hangar.txt @@ -3,9 +3,8 @@ ManaCost:no cost Types:Land K:CARDNAME enters the battlefield tapped. A:AB$ PutCounter | Cost$ T | Defined$ Self | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME. -A:AB$ Mana | Cost$ T SubCounter | Produced$ B | Amount$ ChosenX | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | References$ X | SpellDescription$ Add {B} for each storage counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | Produced$ B | Amount$ ChosenX | CostDesc$ {T}, Remove any number of storage counters from CARDNAME: | References$ X | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {B} for each storage counter removed this way. SVar:X:XChoice #ChosenX SVar created by Cost payment -AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/subterranean_hangar.jpg Oracle:Subterranean Hangar enters the battlefield tapped.\n{T}: Put a storage counter on Subterranean Hangar.\n{T}, Remove any number of storage counters from Subterranean Hangar: Add {B} for each storage counter removed this way. diff --git a/forge-gui/res/cardsfolder/w/white_mana_battery.txt b/forge-gui/res/cardsfolder/w/white_mana_battery.txt index 280c4e35d52..b8b0ca8bf2a 100644 --- a/forge-gui/res/cardsfolder/w/white_mana_battery.txt +++ b/forge-gui/res/cardsfolder/w/white_mana_battery.txt @@ -2,7 +2,7 @@ Name:White Mana Battery ManaCost:4 Types:Artifact A:AB$ PutCounter | Cost$ 2 T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -A:AB$ Mana | Cost$ T SubCounter | Produced$ W | Amount$ Y | CostDesc$ {T}, Remove any number of charge counters from CARDNAME: | AILogic$ ManaRitualBattery | AINoRecursiveCheck$ True | SpellDescription$ Add {W}, then add an additional {W} for each charge counter removed this way. +A:AB$ Mana | Cost$ T SubCounter | Produced$ W | Amount$ Y | CostDesc$ {T}, Remove any number of charge counters from CARDNAME: | AILogic$ ManaRitualBattery.1 | AINoRecursiveCheck$ True | SpellDescription$ Add {W}, then add an additional {W} for each charge counter removed this way. SVar:Y:Number$1/Plus.ChosenX SVar:X:XChoice #ChosenX SVar created by Cost payment From ae5090a69a05d46a96e85e2282d3a3747ca9fec7 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 4 Dec 2018 14:33:46 +0300 Subject: [PATCH 362/901] - More careful use of Buyback spells without Buyback. --- .../src/main/java/forge/ai/AiController.java | 86 +++++++++++-------- 1 file changed, 50 insertions(+), 36 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 4b708ec5863..537a7666e93 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -801,48 +801,62 @@ public class AiController { if ("True".equals(card.getSVar("NonStackingEffect")) && isNonDisabledCardInPlay(card.getName())) { return AiPlayDecision.NeedsToPlayCriteriaNotMet; } + // Trying to play a card that has Buyback without a Buyback cost - - if (card.hasStartOfKeyword("Buyback")) { - //if (card.getBuybackAbility()!=null) { - if (!sa.isBuyBackAbility()) { - boolean wasteBuybackAllowed = false; - // About to lose game : allow - if (ComputerUtil.aiLifeInDanger(player, true, 0)) { - wasteBuybackAllowed = true; - } - int copies = CardLists.filter(player.getCardsIn(ZoneType.Hand), CardPredicates.nameEquals(card.getName())).size(); - // Have two copies : allow - if (copies >= 2) { - wasteBuybackAllowed = true; - } - // Won't be able to afford buyback any time soon - // If Buyback cost includes sacrifice, life, discard - int neededMana = 0; - for (SpellAbility sa2 : GameActionUtil.getOptionalCosts(sa)) { - if (sa2.isOptionalCostPaid(OptionalCost.Buyback)) { - Cost sac = sa2.getPayCosts(); - CostAdjustment.adjust(sac, sa2); // Does not recognize Memory Crystal anyway??? - neededMana = sac.getCostMana().getMana().getCMC(); - if (sac.hasSpecificCostType(CostPayLife.class) - || (sac.hasSpecificCostType(CostDiscard.class)) || - (sac.hasSpecificCostType(CostSacrifice.class))) { - neededMana = 999; - } - } - } - int hasMana = ComputerUtilMana.getAvailableManaEstimate(player, false); - if (hasMana < neededMana - 1) { - wasteBuybackAllowed = true; - } - - if (!wasteBuybackAllowed) return AiPlayDecision.NeedsToPlayCriteriaNotMet; - } + if (card.hasKeyword(Keyword.BUYBACK) && !sa.isBuyBackAbility() && !canPlaySpellWithoutBuyback(card, sa)) { + return AiPlayDecision.NeedsToPlayCriteriaNotMet; } + // add any other necessary logic to play a basic spell here return ComputerUtilCard.checkNeedsToPlayReqs(card, sa); } + private boolean canPlaySpellWithoutBuyback(Card card, SpellAbility sa) { + boolean wasteBuybackAllowed = false; + + // About to lose game : allow + if (ComputerUtil.aiLifeInDanger(player, true, 0)) { + wasteBuybackAllowed = true; + } + + int copies = CardLists.filter(player.getCardsIn(ZoneType.Hand), CardPredicates.nameEquals(card.getName())).size(); + // Have two copies : allow + if (copies >= 2) { + wasteBuybackAllowed = true; + + } + + int neededMana = 0; + boolean dangerousRecurringCost = false; + for (SpellAbility sa2 : GameActionUtil.getOptionalCosts(sa)) { + if (sa2.isOptionalCostPaid(OptionalCost.Buyback)) { + Cost sac = sa2.getPayCosts(); + CostAdjustment.adjust(sac, sa2); // TODO: Does not recognize Memory Crystal + if (sac.getCostMana() != null) { + neededMana = sac.getCostMana().getMana().getCMC(); + } + if (sac.hasSpecificCostType(CostPayLife.class) + || sac.hasSpecificCostType(CostDiscard.class) + || sac.hasSpecificCostType(CostSacrifice.class)) { + dangerousRecurringCost = true; + } + } + } + + // won't be able to afford buyback any time soon + // if Buyback cost includes sacrifice, life, discard + if (dangerousRecurringCost) { + wasteBuybackAllowed = true; + } + + int hasMana = ComputerUtilMana.getAvailableManaEstimate(player, false); + if (hasMana < neededMana - 1) { + wasteBuybackAllowed = true; + } + + return wasteBuybackAllowed; + } + // not sure "playing biggest spell" matters? private final static Comparator saComparator = new Comparator() { @Override From 4d1b7a9aec47634647320d46aa917544d607a3b3 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 4 Dec 2018 14:51:30 +0300 Subject: [PATCH 363/901] - Logic improvement (Buyback) --- .../src/main/java/forge/ai/AiController.java | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 537a7666e93..68a5cc08e52 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -51,6 +51,7 @@ import forge.game.player.PlayerActionConfirmMode; import forge.game.replacement.ReplaceMoved; import forge.game.replacement.ReplacementEffect; import forge.game.spellability.*; +import forge.game.staticability.StaticAbility; import forge.game.trigger.Trigger; import forge.game.trigger.TriggerType; import forge.game.trigger.WrappedAbility; @@ -707,6 +708,11 @@ public class AiController { return canPlaySa(((WrappedAbility) sa).getWrappedAbility()); } + // Trying to play a card that has Buyback without a Buyback cost + if (card.hasKeyword(Keyword.BUYBACK) && !sa.isBuyBackAbility() && !canPlaySpellWithoutBuyback(card, sa)) { + return AiPlayDecision.NeedsToPlayCriteriaNotMet; + } + // When processing a new SA, clear the previously remembered cards that have been marked to avoid re-entry // which might potentially cause a stack overflow. AiCardMemory.clearMemorySet(this, AiCardMemory.MemorySet.MARKED_TO_AVOID_REENTRY); @@ -802,11 +808,6 @@ public class AiController { return AiPlayDecision.NeedsToPlayCriteriaNotMet; } - // Trying to play a card that has Buyback without a Buyback cost - if (card.hasKeyword(Keyword.BUYBACK) && !sa.isBuyBackAbility() && !canPlaySpellWithoutBuyback(card, sa)) { - return AiPlayDecision.NeedsToPlayCriteriaNotMet; - } - // add any other necessary logic to play a basic spell here return ComputerUtilCard.checkNeedsToPlayReqs(card, sa); } @@ -823,7 +824,6 @@ public class AiController { // Have two copies : allow if (copies >= 2) { wasteBuybackAllowed = true; - } int neededMana = 0; @@ -831,7 +831,7 @@ public class AiController { for (SpellAbility sa2 : GameActionUtil.getOptionalCosts(sa)) { if (sa2.isOptionalCostPaid(OptionalCost.Buyback)) { Cost sac = sa2.getPayCosts(); - CostAdjustment.adjust(sac, sa2); // TODO: Does not recognize Memory Crystal + CostAdjustment.adjust(sac, sa2); if (sac.getCostMana() != null) { neededMana = sac.getCostMana().getMana().getCMC(); } @@ -849,6 +849,19 @@ public class AiController { wasteBuybackAllowed = true; } + // Memory Crystal-like effects need special handling + for (Card c : game.getCardsIn(ZoneType.Battlefield)) { + for (StaticAbility s : c.getStaticAbilities()) { + if ("ReduceCost".equals(s.getParam("Mode")) + && "Spell.Buyback".equals(s.getParam("ValidSpell"))) { + neededMana -= AbilityUtils.calculateAmount(c, s.getParam("Amount"), s); + } + } + } + if (neededMana < 0) { + neededMana = 0; + } + int hasMana = ComputerUtilMana.getAvailableManaEstimate(player, false); if (hasMana < neededMana - 1) { wasteBuybackAllowed = true; From a2ca811136f038185117f5cea9356aeaaeeb857d Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 4 Dec 2018 16:11:08 +0300 Subject: [PATCH 364/901] - Minor logic tweak (Buyback) - hasXInAnyCostPart doesn't need a SA parameter now that it's in Cost. - Fixed a minor mistype on mobile Forge. --- .../src/main/java/forge/ai/AiController.java | 4 ++-- .../src/main/java/forge/game/cost/Cost.java | 16 +++++++--------- .../main/java/forge/match/input/InputAttack.java | 2 +- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 68a5cc08e52..cdc86dd4c0f 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -671,7 +671,7 @@ public class AiController { // This is for playing spells regularly (no Cascade/Ripple etc.) private AiPlayDecision canPlayAndPayFor(final SpellAbility sa) { - boolean xCost = sa.getPayCosts().hasXInAnyCostPart(sa); + boolean xCost = sa.getPayCosts().hasXInAnyCostPart(); if (!xCost && !ComputerUtilCost.canPayCost(sa, player)) { // for most costs, it's OK to check if they can be paid early in order to avoid running a heavy API check @@ -708,7 +708,7 @@ public class AiController { return canPlaySa(((WrappedAbility) sa).getWrappedAbility()); } - // Trying to play a card that has Buyback without a Buyback cost + // Trying to play a card that has Buyback without a Buyback cost, look for possible additional considerations if (card.hasKeyword(Keyword.BUYBACK) && !sa.isBuyBackAbility() && !canPlaySpellWithoutBuyback(card, sa)) { return AiPlayDecision.NeedsToPlayCriteriaNotMet; } diff --git a/forge-game/src/main/java/forge/game/cost/Cost.java b/forge-game/src/main/java/forge/game/cost/Cost.java index 5a48859876a..1d7606922c0 100644 --- a/forge-game/src/main/java/forge/game/cost/Cost.java +++ b/forge-game/src/main/java/forge/game/cost/Cost.java @@ -935,19 +935,17 @@ public class Cost implements Serializable { return true; } - public boolean hasXInAnyCostPart(SpellAbility sa) { + public boolean hasXInAnyCostPart() { boolean xCost = false; - if (sa.getPayCosts() != null) { - for (CostPart p : sa.getPayCosts().getCostParts()) { - if (p instanceof CostPartMana) { - if (((CostPartMana) p).getAmountOfX() > 0) { - xCost = true; - break; - } - } else if (p.getAmount().equals("X")) { + for (CostPart p : this.getCostParts()) { + if (p instanceof CostPartMana) { + if (((CostPartMana) p).getAmountOfX() > 0) { xCost = true; break; } + } else if (p.getAmount().equals("X")) { + xCost = true; + break; } } return xCost; diff --git a/forge-gui/src/main/java/forge/match/input/InputAttack.java b/forge-gui/src/main/java/forge/match/input/InputAttack.java index cf46d7c3e17..d8955dcfafe 100644 --- a/forge-gui/src/main/java/forge/match/input/InputAttack.java +++ b/forge-gui/src/main/java/forge/match/input/InputAttack.java @@ -84,7 +84,7 @@ public class InputAttack extends InputSyncronizedBase { } private void updatePrompt() { - String alphaLabel = canCallBackAttackers() ? "Call Back" : "AlphaStrike"; + String alphaLabel = canCallBackAttackers() ? "Call Back" : "Alpha Strike"; getController().getGui().updateButtons(getOwner(), "OK", alphaLabel, true, true, true); } From 1d7188b8f5471202bcc9c5918378dadb6750d7ea Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 4 Dec 2018 16:17:03 +0300 Subject: [PATCH 365/901] - Minor logic tweak (Buyback) + AI property - hasXInAnyCostPart doesn't need a SA parameter now that it's in Cost. - Fixed a minor mistype on mobile Forge. --- forge-ai/src/main/java/forge/ai/AiController.java | 6 ++++-- forge-ai/src/main/java/forge/ai/AiProps.java | 1 + forge-gui/res/ai/Cautious.ai | 4 ++++ forge-gui/res/ai/Default.ai | 4 ++++ forge-gui/res/ai/Experimental.ai | 4 ++++ forge-gui/res/ai/Reckless.ai | 4 ++++ 6 files changed, 21 insertions(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index cdc86dd4c0f..36bbf6542b8 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -709,8 +709,10 @@ public class AiController { } // Trying to play a card that has Buyback without a Buyback cost, look for possible additional considerations - if (card.hasKeyword(Keyword.BUYBACK) && !sa.isBuyBackAbility() && !canPlaySpellWithoutBuyback(card, sa)) { - return AiPlayDecision.NeedsToPlayCriteriaNotMet; + if (getBooleanProperty(AiProps.TRY_TO_PRESERVE_BUYBACK_SPELLS)) { + if (card.hasKeyword(Keyword.BUYBACK) && !sa.isBuyBackAbility() && !canPlaySpellWithoutBuyback(card, sa)) { + return AiPlayDecision.NeedsToPlayCriteriaNotMet; + } } // When processing a new SA, clear the previously remembered cards that have been marked to avoid re-entry diff --git a/forge-ai/src/main/java/forge/ai/AiProps.java b/forge-ai/src/main/java/forge/ai/AiProps.java index 23b3b791fe6..1f8b56a9720 100644 --- a/forge-ai/src/main/java/forge/ai/AiProps.java +++ b/forge-ai/src/main/java/forge/ai/AiProps.java @@ -58,6 +58,7 @@ public enum AiProps { /** */ THRESHOLD_TOKEN_CHUMP_TO_SAVE_PLANESWALKER ("135"), /** */ THRESHOLD_NONTOKEN_CHUMP_TO_SAVE_PLANESWALKER ("110"), /** */ CHUMP_TO_SAVE_PLANESWALKER_ONLY_ON_LETHAL ("true"), /** */ + TRY_TO_PRESERVE_BUYBACK_SPELLS ("true"), /** */ MIN_SPELL_CMC_TO_COUNTER ("0"), /** */ CHANCE_TO_COUNTER_CMC_1 ("50"), /** */ CHANCE_TO_COUNTER_CMC_2 ("75"), /** */ diff --git a/forge-gui/res/ai/Cautious.ai b/forge-gui/res/ai/Cautious.ai index 0e732f97963..05b1d3460d7 100644 --- a/forge-gui/res/ai/Cautious.ai +++ b/forge-gui/res/ai/Cautious.ai @@ -244,6 +244,10 @@ BOUNCE_ALL_ELSEWHERE_NONCREAT_EVAL_DIFF=3 # library to put some into the graveyard. INTUITION_ALTERNATIVE_LOGIC=true +# If enabled, the AI will run some additional checks in order to try to preserve spells that have Buyback and not +# use them unless absolutely necessary (or unless multiple copies are in hand). +TRY_TO_PRESERVE_BUYBACK_SPELLS=true + # How big of a difference is allowed between the revealed card CMC and the currently castable CMC to still put the # card on top of the library EXPLORE_MAX_CMC_DIFF_TO_PUT_IN_GRAVEYARD=2 diff --git a/forge-gui/res/ai/Default.ai b/forge-gui/res/ai/Default.ai index 8e03095a670..e00c218cdf6 100644 --- a/forge-gui/res/ai/Default.ai +++ b/forge-gui/res/ai/Default.ai @@ -245,6 +245,10 @@ BOUNCE_ALL_ELSEWHERE_NONCREAT_EVAL_DIFF=3 # library to put some into the graveyard. INTUITION_ALTERNATIVE_LOGIC=true +# If enabled, the AI will run some additional checks in order to try to preserve spells that have Buyback and not +# use them unless absolutely necessary (or unless multiple copies are in hand). +TRY_TO_PRESERVE_BUYBACK_SPELLS=true + # How big of a difference is allowed between the revealed card CMC and the currently castable CMC to still put the # card on top of the library EXPLORE_MAX_CMC_DIFF_TO_PUT_IN_GRAVEYARD=2 diff --git a/forge-gui/res/ai/Experimental.ai b/forge-gui/res/ai/Experimental.ai index b5f8624f8a2..5b9048770f5 100644 --- a/forge-gui/res/ai/Experimental.ai +++ b/forge-gui/res/ai/Experimental.ai @@ -245,6 +245,10 @@ BOUNCE_ALL_ELSEWHERE_NONCREAT_EVAL_DIFF=5 # library to put some into the graveyard. INTUITION_ALTERNATIVE_LOGIC=true +# If enabled, the AI will run some additional checks in order to try to preserve spells that have Buyback and not +# use them unless absolutely necessary (or unless multiple copies are in hand). +TRY_TO_PRESERVE_BUYBACK_SPELLS=true + # How big of a difference is allowed between the revealed card CMC and the currently castable CMC to still put the # card on top of the library EXPLORE_MAX_CMC_DIFF_TO_PUT_IN_GRAVEYARD=2 diff --git a/forge-gui/res/ai/Reckless.ai b/forge-gui/res/ai/Reckless.ai index 188cf8199a9..4641fe37b0b 100644 --- a/forge-gui/res/ai/Reckless.ai +++ b/forge-gui/res/ai/Reckless.ai @@ -245,6 +245,10 @@ BOUNCE_ALL_ELSEWHERE_NONCREAT_EVAL_DIFF=3 # library to put some into the graveyard. INTUITION_ALTERNATIVE_LOGIC=true +# If enabled, the AI will run some additional checks in order to try to preserve spells that have Buyback and not +# use them unless absolutely necessary (or unless multiple copies are in hand). +TRY_TO_PRESERVE_BUYBACK_SPELLS=false + # How big of a difference is allowed between the revealed card CMC and the currently castable CMC to still put the # card on top of the library EXPLORE_MAX_CMC_DIFF_TO_PUT_IN_GRAVEYARD=1 From 9fc3348d4a679f25ddfe96c7536d27256df8f6ad Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Tue, 4 Dec 2018 17:00:59 +0000 Subject: [PATCH 366/901] Update fire_omen_crane Closes #773 --- forge-gui/res/cardsfolder/f/fire_omen_crane.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/cardsfolder/f/fire_omen_crane.txt b/forge-gui/res/cardsfolder/f/fire_omen_crane.txt index 2aff82f31c6..d99ea02024c 100644 --- a/forge-gui/res/cardsfolder/f/fire_omen_crane.txt +++ b/forge-gui/res/cardsfolder/f/fire_omen_crane.txt @@ -1,8 +1,8 @@ Name:Fire-Omen Crane ManaCost:3 R R Types:Creature Bird Spirit -K:Flying -T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ Trig | TriggerDescription$ Whenever CARDNAME attacks, it deals 1 damage to target creature an opponent controls. -SVar:TrigDealDamage:DB$DealDamage | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | NumDmg$ 1 -Oracle:Flying (This creature can't be blocked except by creatures with flying or reach.)\nWhenever Fire-Omen Crane attacks, it deals 1 damage to target creature an opponent controls. PT:3/3 +K:Flying +T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever CARDNAME attacks, it deals 1 damage to target creature an opponent controls. +SVar:TrigDealDamage:DB$DealDamage | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | NumDmg$ 1 +Oracle:Flying (This creature can't be blocked except by creatures with flying or reach.)\nWhenever Fire-Omen Crane attacks, it deals 1 damage to target creature an opponent controls. \ No newline at end of file From 3925001cb12ab7c79bff953185e7724a3318c5e1 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 4 Dec 2018 23:00:13 +0300 Subject: [PATCH 367/901] - Tweak the card count and some other stuff in new Planar Conquest event decks. --- .../Dominaria/Llanowar/Grunn, the Lonely King.dck | 2 +- .../Dominaria/Llanowar/Hallar, the Firefletcher.dck | 2 +- .../Dominaria/Llanowar/Marwyn, the Nurturer.dck | 2 +- .../Dominaria/Llanowar/Multani, Yavimayas Avatar.dck | 2 +- .../Dominaria/Llanowar/Shanna, Sisay's Legacy.dck | 2 +- .../Dominaria/Llanowar/Slimefoot, the Stowaway.dck | 4 ++-- .../New Benalia/Baird, Steward of Argive.dck | 2 +- .../New Benalia/Danitha Capashen, Paragon.dck | 2 +- .../Dominaria/New Benalia/Evra, Halcyon Witness.dck | 2 +- .../New Benalia/Kwende, Pride of Femeref.dck | 2 +- .../Dominaria/New Benalia/Lena, Selfless Champion.dck | 2 +- .../planes/Dominaria/New Benalia/Lyra Dawnbringer.dck | 2 +- .../Dominaria/Shiv/Chandra, Bold Pyromancer.dck | 11 +---------- .../planes/Dominaria/Shiv/Firesong and Sunspeaker.dck | 2 +- .../conquest/planes/Dominaria/Shiv/Jaya Ballard.dck | 3 --- .../Dominaria/Shiv/Jhoira, Weatherlight Captain.dck | 4 ++-- .../planes/Dominaria/Shiv/Squee, the Immortal.dck | 2 +- .../planes/Dominaria/Shiv/Tiana, Ships Caretaker.dck | 4 ++-- .../planes/Dominaria/Shiv/Verix Bladewing.dck | 2 +- .../Tolaria West/Adeliz, the Cinder Wind.dck | 2 +- .../Tolaria West/Naban, Dean of Iteration.dck | 2 +- .../Tolaria West/Niambi, Faithful Healer.dck | 2 +- .../Tolaria West/Raff Capashen, Ships Mage.dck | 2 +- .../Tolaria West/Slinn Voda, the Rising Deep.dck | 2 +- .../Tolaria West/Teferi, Hero of Dominaria.dck | 4 ++-- .../Tolaria West/Tetsuko Umezawa, Fugitive.dck | 2 +- .../Tolaria West/Zahid, Djinn of the Lamp.dck | 2 +- .../planes/Dominaria/Urborg/Arvad the Cursed.dck | 4 ++-- .../planes/Dominaria/Urborg/Demonlord Belzenlok.dck | 2 +- .../planes/Dominaria/Urborg/Isareth the Awakener.dck | 2 +- .../Dominaria/Urborg/Josu Vess, Lich Knight.dck | 2 +- .../Dominaria/Urborg/Kazarov, Sengir Pureblood.dck | 4 ++-- .../Dominaria/Urborg/Urgoros, the Empty One.dck | 2 +- .../Dominaria/Urborg/Yargle, Glutton of Urborg.dck | 2 +- .../Jukai Forest/Iwamori of the Open Fist.dck | 2 +- .../Jukai Forest/Kodama of the Center Tree.dck | 2 +- .../Jukai Forest/Kodama of the North Tree.dck | 2 +- .../Jukai Forest/Kodama of the South Tree.dck | 2 +- .../Kamigawa/Jukai Forest/Seshiro the Anointed.dck | 2 +- .../Jukai Forest/Shizuko, Caller of Autumn.dck | 2 +- .../Minamo Academy/Azami, Lady of Scrolls.dck | 2 +- .../Minamo Academy/Chisei, Heart of Oceans.dck | 2 +- .../Kamigawa/Minamo Academy/Cloudhoof Kirin.dck | 2 +- .../Minamo Academy/Higure, the Still Wind.dck | 2 +- .../Kamigawa/Minamo Academy/Keiga, the Tide Star.dck | 2 +- .../Minamo Academy/Meloku the Clouded Mirror.dck | 2 +- .../Kamigawa/Minamo Academy/Ninjas of Kamigawa.dck | 2 +- .../Sokenzan Mountains/Ben-Ben, Akki Hermit.dck | 2 +- .../Sokenzan Mountains/Fumiko the Lowblood.dck | 2 +- .../Sokenzan Mountains/Godo, Bandit Warlord.dck | 2 +- .../Sokenzan Mountains/Jiwari, the Earth Aflame.dck | 2 +- .../Sokenzan Mountains/Patron of the Akki.dck | 2 +- .../Sokenzan Mountains/Ryusei, the Falling Star.dck | 2 +- .../planes/Kamigawa/Takenuma/Infernal Kirin.dck | 2 +- .../planes/Kamigawa/Takenuma/Kuro, Pitlord.dck | 2 +- .../Kamigawa/Takenuma/Maga, Traitor to Mortals.dck | 2 +- .../planes/Kamigawa/Takenuma/Marrow-Gnawer.dck | 2 +- .../planes/Kamigawa/Takenuma/Toshiro Umezawa.dck | 2 +- .../planes/Kamigawa/Takenuma/Yukora, the Prisoner.dck | 2 +- .../planes/Kamigawa/Towabara/Celestial Kirin.dck | 2 +- .../Kamigawa/Towabara/Michiko Konda, Truth Seeker.dck | 2 +- .../Kamigawa/Towabara/Nagao, Bound by Honor.dck | 2 +- .../Towabara/Oyobi, Who Split the Heavens.dck | 2 +- .../Towabara/Rune-Tail, Kitsune Ascendant.dck | 2 +- .../Kamigawa/Towabara/Takeno, Samurai General.dck | 2 +- .../Time_Vault/Chronicle of Ages/Lovisa Coldeyes.dck | 2 +- .../Time_Vault/Chronicle of Ages/Mirri the Cursed.dck | 2 +- .../Chronicle of Ages/Rofellos, Llanowar Emissary.dck | 2 +- .../Chronicle of Ages/Teneb, the Harvester.dck | 2 +- .../Chronicle of Ages/Zur the Enchanter.dck | 2 +- .../The Memory Lane/Akroma, Angel of Fury.dck | 2 +- .../The Memory Lane/Akroma, Angel of Wrath.dck | 2 +- .../planes/Time_Vault/The Memory Lane/Kaysa.dck | 2 +- .../Time_Vault/The Memory Lane/Red Deck Wins.dck | 2 +- 74 files changed, 79 insertions(+), 91 deletions(-) diff --git a/forge-gui/res/conquest/planes/Dominaria/Llanowar/Grunn, the Lonely King.dck b/forge-gui/res/conquest/planes/Dominaria/Llanowar/Grunn, the Lonely King.dck index 85b0054f99c..14f160b7e46 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Llanowar/Grunn, the Lonely King.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Llanowar/Grunn, the Lonely King.dck @@ -10,7 +10,7 @@ Name=Grunn, the Lonely King 1 Cultivate|C18 1 Druid of the Cowl|M19 1 Elfhame Druid|DOM -14 Forest|M19|2 +15 Forest|M19|2 1 Gift of Growth|DOM 1 Gigantosaurus|M19 1 Gilded Lotus|DOM diff --git a/forge-gui/res/conquest/planes/Dominaria/Llanowar/Hallar, the Firefletcher.dck b/forge-gui/res/conquest/planes/Dominaria/Llanowar/Hallar, the Firefletcher.dck index 8a061d1ea03..8012fec51ce 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Llanowar/Hallar, the Firefletcher.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Llanowar/Hallar, the Firefletcher.dck @@ -20,7 +20,7 @@ Name=Hallar, the Firefletcher 1 Krosan Druid|DOM 1 Llanowar Elves|M19 1 Manalith|M19 -3 Mountain|DOM|3 +4 Mountain|DOM|3 1 Saproling Migration|DOM 1 Shivan Fire|DOM 1 Skizzik|DOM diff --git a/forge-gui/res/conquest/planes/Dominaria/Llanowar/Marwyn, the Nurturer.dck b/forge-gui/res/conquest/planes/Dominaria/Llanowar/Marwyn, the Nurturer.dck index 635abd8d073..f50e5cae283 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Llanowar/Marwyn, the Nurturer.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Llanowar/Marwyn, the Nurturer.dck @@ -12,7 +12,7 @@ Name=Marwyn, the Nurturer 1 Elvish Clancaller|M19 1 Elvish Rejuvenator|M19 1 Farhaven Elf|C18 -14 Forest|DOM +15 Forest|DOM 1 Giant Spider|M19 1 Gift of Growth|DOM 1 Gigantosaurus|M19 diff --git a/forge-gui/res/conquest/planes/Dominaria/Llanowar/Multani, Yavimayas Avatar.dck b/forge-gui/res/conquest/planes/Dominaria/Llanowar/Multani, Yavimayas Avatar.dck index c9612f7a2f1..76c100aa899 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Llanowar/Multani, Yavimayas Avatar.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Llanowar/Multani, Yavimayas Avatar.dck @@ -17,7 +17,7 @@ Name=Multani, Yavimaya's Avatar 1 Explosive Vegetation|C18 1 Far Wanderings|C18 1 Farhaven Elf|C18 -13 Forest|C18|1 +14 Forest|C18 1 Gift of Paradise|M19 1 Grapple with the Past|C18 1 Hunting Wilds|C18 diff --git a/forge-gui/res/conquest/planes/Dominaria/Llanowar/Shanna, Sisay's Legacy.dck b/forge-gui/res/conquest/planes/Dominaria/Llanowar/Shanna, Sisay's Legacy.dck index 9abbecb260f..33787ea84c3 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Llanowar/Shanna, Sisay's Legacy.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Llanowar/Shanna, Sisay's Legacy.dck @@ -16,7 +16,7 @@ Name=Shanna, Sisay's Legacy 1 Knightly Valor|M19 1 Llanowar Elves|DOM 1 Memorial to Unity|DOM -2 Plains|DOM +3 Plains|DOM 1 Rampaging Baloths|C18 1 Saproling Migration|DOM 1 Sergeant-at-Arms|DOM diff --git a/forge-gui/res/conquest/planes/Dominaria/Llanowar/Slimefoot, the Stowaway.dck b/forge-gui/res/conquest/planes/Dominaria/Llanowar/Slimefoot, the Stowaway.dck index edadfc4702d..ff8e9f8ea6d 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Llanowar/Slimefoot, the Stowaway.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Llanowar/Slimefoot, the Stowaway.dck @@ -6,7 +6,7 @@ Name=Slimefoot, the Stowaway 1 Deathbloom Thallid|DOM 1 Druid of the Cowl|M19 1 Elfhame Druid|DOM -9 Forest|DOM|1 +9 Forest|DOM 1 Foul Orchard|M19 1 Fungal Infection|DOM 1 Fungal Plots|DOM @@ -22,7 +22,7 @@ Name=Slimefoot, the Stowaway 1 Spawning Grounds|C18 1 Spore Swarm|DOM 1 Sporecrown Thallid|DOM -2 Swamp|DOM|2 +3 Swamp|DOM 1 Thallid Omnivore|DOM 1 The Eldest Reborn|DOM 1 The Mending of Dominaria|DOM diff --git a/forge-gui/res/conquest/planes/Dominaria/New Benalia/Baird, Steward of Argive.dck b/forge-gui/res/conquest/planes/Dominaria/New Benalia/Baird, Steward of Argive.dck index 951b0529914..c043af1d449 100644 --- a/forge-gui/res/conquest/planes/Dominaria/New Benalia/Baird, Steward of Argive.dck +++ b/forge-gui/res/conquest/planes/Dominaria/New Benalia/Baird, Steward of Argive.dck @@ -21,7 +21,7 @@ Name=Baird, Steward of Argive 1 Knight of New Benalia|DOM 1 Lena, Selfless Champion|M19 1 Memorial to Glory|DOM -15 Plains|M19 +16 Plains|M19 1 Serra Disciple|DOM 1 Shield of the Realm|DOM 1 Short Sword|DOM diff --git a/forge-gui/res/conquest/planes/Dominaria/New Benalia/Danitha Capashen, Paragon.dck b/forge-gui/res/conquest/planes/Dominaria/New Benalia/Danitha Capashen, Paragon.dck index 683ac9b2184..fcf4add3d31 100644 --- a/forge-gui/res/conquest/planes/Dominaria/New Benalia/Danitha Capashen, Paragon.dck +++ b/forge-gui/res/conquest/planes/Dominaria/New Benalia/Danitha Capashen, Paragon.dck @@ -18,7 +18,7 @@ Name=Danitha Capashen, Paragon 1 Lena, Selfless Champion|M19 1 Memorial to Glory|DOM 1 Novice Knight|M19 -15 Plains|M19 +16 Plains|M19 1 Sage's Reverie|C18 1 Short Sword|DOM 1 Sigiled Sword of Valeron|M19 diff --git a/forge-gui/res/conquest/planes/Dominaria/New Benalia/Evra, Halcyon Witness.dck b/forge-gui/res/conquest/planes/Dominaria/New Benalia/Evra, Halcyon Witness.dck index 6fea04d05a1..a5643585b82 100644 --- a/forge-gui/res/conquest/planes/Dominaria/New Benalia/Evra, Halcyon Witness.dck +++ b/forge-gui/res/conquest/planes/Dominaria/New Benalia/Evra, Halcyon Witness.dck @@ -26,5 +26,5 @@ Name=Evra, Halcyon Witness 1 Lightform|C18 1 Memorial to Glory|DOM 1 Mesa Unicorn|DOM -15 Plains|DOM +16 Plains|DOM 1 Sanctum Spirit|DOM diff --git a/forge-gui/res/conquest/planes/Dominaria/New Benalia/Kwende, Pride of Femeref.dck b/forge-gui/res/conquest/planes/Dominaria/New Benalia/Kwende, Pride of Femeref.dck index acd8b8fdd95..abab69d7ed7 100644 --- a/forge-gui/res/conquest/planes/Dominaria/New Benalia/Kwende, Pride of Femeref.dck +++ b/forge-gui/res/conquest/planes/Dominaria/New Benalia/Kwende, Pride of Femeref.dck @@ -18,7 +18,7 @@ Name=Kwende, Pride of Femeref 1 Make a Stand|M19 1 Marauder's Axe|M19 1 Novice Knight|M19 -16 Plains|DOM +17 Plains|DOM 1 Seal Away|DOM 2 Serra Disciple|DOM 1 Short Sword|DOM diff --git a/forge-gui/res/conquest/planes/Dominaria/New Benalia/Lena, Selfless Champion.dck b/forge-gui/res/conquest/planes/Dominaria/New Benalia/Lena, Selfless Champion.dck index 70ddf841b21..eb3d39502d9 100644 --- a/forge-gui/res/conquest/planes/Dominaria/New Benalia/Lena, Selfless Champion.dck +++ b/forge-gui/res/conquest/planes/Dominaria/New Benalia/Lena, Selfless Champion.dck @@ -21,7 +21,7 @@ Name=Lena, Selfless Champion 1 Memorial to Glory|DOM 1 Mesa Unicorn|DOM 1 Militia Bugler|M19 -15 Plains|M19 +16 Plains|M19 1 Sergeant-at-Arms|DOM 1 Serra Angel|DOM 1 Sigiled Sword of Valeron|M19 diff --git a/forge-gui/res/conquest/planes/Dominaria/New Benalia/Lyra Dawnbringer.dck b/forge-gui/res/conquest/planes/Dominaria/New Benalia/Lyra Dawnbringer.dck index e5982c5f791..9463fe0d59d 100644 --- a/forge-gui/res/conquest/planes/Dominaria/New Benalia/Lyra Dawnbringer.dck +++ b/forge-gui/res/conquest/planes/Dominaria/New Benalia/Lyra Dawnbringer.dck @@ -18,7 +18,7 @@ Name=Lyra Dawnbringer 1 Jousting Lance|DOM 1 Knight's Pledge|M19 1 Memorial to Glory|DOM -15 Plains|M19 +16 Plains|M19 1 Resplendent Angel|M19 1 Seal Away|DOM 1 Serra Angel|DOM diff --git a/forge-gui/res/conquest/planes/Dominaria/Shiv/Chandra, Bold Pyromancer.dck b/forge-gui/res/conquest/planes/Dominaria/Shiv/Chandra, Bold Pyromancer.dck index 4a05507ce2f..5c60325a817 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Shiv/Chandra, Bold Pyromancer.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Shiv/Chandra, Bold Pyromancer.dck @@ -1,7 +1,5 @@ [metadata] Name=Chandra, Bold Pyromancer -[Avatar] - [Main] 1 Banefire|M19 1 Boggart Brute|M19 @@ -21,7 +19,7 @@ Name=Chandra, Bold Pyromancer 1 Lava Axe|M19 1 Lightning Mare|M19 1 Lightning Strike|M19 -15 Mountain|M19|4 +15 Mountain|M19 1 Radiating Lightning|DOM 1 Scuttling Doom Engine|C18 1 Shivan Fire|DOM @@ -30,10 +28,3 @@ Name=Chandra, Bold Pyromancer 1 Viashino Pyromancer|M19 1 Wizard's Lightning|DOM [Sideboard] - -[Planes] - -[Schemes] - -[Conspiracy] - diff --git a/forge-gui/res/conquest/planes/Dominaria/Shiv/Firesong and Sunspeaker.dck b/forge-gui/res/conquest/planes/Dominaria/Shiv/Firesong and Sunspeaker.dck index f2615ffc608..394446be161 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Shiv/Firesong and Sunspeaker.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Shiv/Firesong and Sunspeaker.dck @@ -22,7 +22,7 @@ Name=Firesong and Sunspeaker 1 Leonin Warleader|M19 1 Lightning Strike|M19 6 Mountain|DOM -4 Plains|DOM +5 Plains|DOM 1 Radiating Lightning|DOM 1 Revitalize|M19 1 Rupture Spire|M19 diff --git a/forge-gui/res/conquest/planes/Dominaria/Shiv/Jaya Ballard.dck b/forge-gui/res/conquest/planes/Dominaria/Shiv/Jaya Ballard.dck index e72ed9e132e..034e2d2b805 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Shiv/Jaya Ballard.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Shiv/Jaya Ballard.dck @@ -27,6 +27,3 @@ Name=Jaya Ballard 1 Warcry Phoenix|DOM 1 Wizard's Lightning|DOM [Sideboard] -1 Fervent Strike|DOM -1 Trumpet Blast|M19 -1 Warlord's Fury|DOM diff --git a/forge-gui/res/conquest/planes/Dominaria/Shiv/Jhoira, Weatherlight Captain.dck b/forge-gui/res/conquest/planes/Dominaria/Shiv/Jhoira, Weatherlight Captain.dck index 332d5c71a2d..3260ad5a926 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Shiv/Jhoira, Weatherlight Captain.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Shiv/Jhoira, Weatherlight Captain.dck @@ -15,14 +15,14 @@ Name=Jhoira, Weatherlight Captain 1 Gilded Lotus|DOM 1 Hellkite Igniter|C18 1 Highland Lake|C18 -2 Island|C18|1 +3 Island|C18 1 Jaya's Immolating Inferno|DOM 1 Jhoira's Familiar|DOM 1 Loyal Apprentice|C18 1 Magmaquake|C18 1 Memorial to Genius|DOM 1 Memorial to War|DOM -4 Mountain|C18|1 +4 Mountain|C18 1 Retrofitter Foundry|C18 1 Rupture Spire|M19 1 Sai, Master Thopterist|M19 diff --git a/forge-gui/res/conquest/planes/Dominaria/Shiv/Squee, the Immortal.dck b/forge-gui/res/conquest/planes/Dominaria/Shiv/Squee, the Immortal.dck index acd4132eadf..28a17881132 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Shiv/Squee, the Immortal.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Shiv/Squee, the Immortal.dck @@ -17,7 +17,7 @@ Name=Squee, the Immortal 1 Guttersnipe|M19 1 Jousting Lance|DOM 1 Lightning Strike|M19 -15 Mountain|C18|3 +16 Mountain|C18 1 Radiating Lightning|DOM 1 Run Amok|DOM 1 Shivan Fire|DOM diff --git a/forge-gui/res/conquest/planes/Dominaria/Shiv/Tiana, Ships Caretaker.dck b/forge-gui/res/conquest/planes/Dominaria/Shiv/Tiana, Ships Caretaker.dck index 97a6bf726fd..606731b2dff 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Shiv/Tiana, Ships Caretaker.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Shiv/Tiana, Ships Caretaker.dck @@ -20,10 +20,10 @@ Name=Tiana, Ship's Caretaker 1 Keldon Warcaller|DOM 1 Knight's Pledge|M19 1 Knightly Valor|M19 -6 Mountain|M19|1 +6 Mountain|M19 1 On Serra's Wings|DOM 1 Onakke Ogre|M19 -4 Plains|M19|1 +5 Plains|M19 1 Pyromantic Pilgrim|DOM 1 Rupture Spire|M19 1 Sage's Reverie|C18 diff --git a/forge-gui/res/conquest/planes/Dominaria/Shiv/Verix Bladewing.dck b/forge-gui/res/conquest/planes/Dominaria/Shiv/Verix Bladewing.dck index a63a381e889..daa06bb4220 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Shiv/Verix Bladewing.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Shiv/Verix Bladewing.dck @@ -16,7 +16,7 @@ Name=Verix Bladewing 1 Kargan Dragonrider|M19 1 Keldon Warcaller|DOM 1 Lathliss, Dragon Queen|M19 -15 Mountain|M19|3 +16 Mountain|M19 1 Nesting Dragon|C18 1 Sarkhan's Unsealing|M19 1 Sarkhan's Whelp|M19 diff --git a/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Adeliz, the Cinder Wind.dck b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Adeliz, the Cinder Wind.dck index 91b565a2c33..880d6306916 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Adeliz, the Cinder Wind.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Adeliz, the Cinder Wind.dck @@ -16,7 +16,7 @@ Name=Adeliz, the Cinder Wind 1 Ghitu Lavarunner|DOM 1 Great Furnace|C18 1 Highland Lake|M19 -4 Island|DOM +5 Island|DOM 1 Jaya's Immolating Inferno|DOM 1 Karn's Temporal Sundering|DOM 1 Lightning Strike|M19 diff --git a/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Naban, Dean of Iteration.dck b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Naban, Dean of Iteration.dck index 176993dfaed..ae0c9ee1757 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Naban, Dean of Iteration.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Naban, Dean of Iteration.dck @@ -14,7 +14,7 @@ Name=Naban, Dean of Iteration 1 Essence Scatter|M19 1 Exclusion Mage|M19 1 Into the Roil|C18 -14 Island|DOM +15 Island|DOM 1 Memorial to Genius|DOM 1 Merfolk Trickster|DOM 1 Omenspeaker|M19 diff --git a/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Niambi, Faithful Healer.dck b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Niambi, Faithful Healer.dck index 45c9e477fab..f94b2a13324 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Niambi, Faithful Healer.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Niambi, Faithful Healer.dck @@ -21,7 +21,7 @@ Name=Niambi, Faithful Healer 1 Opt|DOM 1 Pardic Wanderer|DOM 1 Pegasus Courser|DOM -3 Plains|DOM +4 Plains|DOM 1 Raff Capashen, Ship's Mage|DOM 1 Relic Runner|DOM 1 Syncopate|DOM diff --git a/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Raff Capashen, Ships Mage.dck b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Raff Capashen, Ships Mage.dck index 73e94928c7d..7ae3aa9b170 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Raff Capashen, Ships Mage.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Raff Capashen, Ships Mage.dck @@ -19,7 +19,7 @@ Name=Raff Capashen, Ship's Mage 1 Geode Golem|C18 1 Helm of the Host|DOM 1 History of Benalia|DOM -4 Island|DOM +5 Island|DOM 1 Jhoira's Familiar|DOM 1 Meandering River|M19 1 Memorial to Genius|DOM diff --git a/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Slinn Voda, the Rising Deep.dck b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Slinn Voda, the Rising Deep.dck index c94a57de8cc..ee37da573b5 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Slinn Voda, the Rising Deep.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Slinn Voda, the Rising Deep.dck @@ -15,7 +15,7 @@ Name=Slinn Voda, the Rising Deep 1 Gilded Lotus|DOM 1 Inkwell Leviathan|C18 1 Into the Roil|C18 -16 Island|DOM +17 Island|DOM 1 Merfolk Trickster|DOM 1 Mist-Cloaked Herald|M19 1 Riddlemaster Sphinx|M19 diff --git a/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Teferi, Hero of Dominaria.dck b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Teferi, Hero of Dominaria.dck index 77c5d59eb5d..0c46238eb59 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Teferi, Hero of Dominaria.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Teferi, Hero of Dominaria.dck @@ -9,7 +9,7 @@ Name=Teferi, Hero of Dominaria 1 Fall of the Thran|DOM 1 Homarid Explorer|DOM 1 In Bolas's Clutches|DOM -6 Island|DOM|2 +6 Island|DOM 1 Luminous Bonds|M19 1 Meandering River|DOM 1 Memorial to Genius|DOM @@ -17,7 +17,7 @@ Name=Teferi, Hero of Dominaria 1 Millstone|M19 1 Oath of Teferi|DOM 1 Patient Rebuilding|M19 -5 Plains|DOM|4 +6 Plains|DOM 1 Psychic Corrosion|M19 1 Seal Away|DOM 1 Sigil of the Empty Throne|C18 diff --git a/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Tetsuko Umezawa, Fugitive.dck b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Tetsuko Umezawa, Fugitive.dck index 766a077c71b..a8fd18fc625 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Tetsuko Umezawa, Fugitive.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Tetsuko Umezawa, Fugitive.dck @@ -10,7 +10,7 @@ Name=Testuko Umezawa, Fugitive 1 Field Creeper|M19 1 Helm of the Host|DOM 1 Icy Manipulator|DOM -14 Island|DOM +15 Island|DOM 1 Magistrate's Scepter|M19 1 Mist-Cloaked Herald|M19 1 Mistcaller|M19 diff --git a/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Zahid, Djinn of the Lamp.dck b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Zahid, Djinn of the Lamp.dck index 86b5b41f942..650d9cefcee 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Zahid, Djinn of the Lamp.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Tolaria West/Zahid, Djinn of the Lamp.dck @@ -13,7 +13,7 @@ Name=Zahid, Djinn of the Lamp 1 Gearsmith Guardian|M19 1 Gearsmith Prodigy|M19 1 Geode Golem|C18 -13 Island|DOM|3 +14 Island|DOM 1 One with the Machine|M19 1 Relic Runner|DOM 1 Sai, Master Thopterist|M19 diff --git a/forge-gui/res/conquest/planes/Dominaria/Urborg/Arvad the Cursed.dck b/forge-gui/res/conquest/planes/Dominaria/Urborg/Arvad the Cursed.dck index 22a2d635471..027248e5aff 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Urborg/Arvad the Cursed.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Urborg/Arvad the Cursed.dck @@ -23,13 +23,13 @@ Name=Arvad the Cursed 1 Mox Amber|DOM 1 Murder|M19 1 Phylactery Lich|M19 -2 Plains|DOM|1 +3 Plains|DOM 1 Primevals' Glorious Rebirth|DOM 1 Scoured Barrens|C18 1 Serra Disciple|DOM 1 Sol Ring|C18 1 Soul Salvage|DOM -5 Swamp|DOM|1 +5 Swamp|DOM 1 Terramorphic Expanse|C18 1 The Eldest Reborn|DOM 1 Thran Temporal Gateway|DOM diff --git a/forge-gui/res/conquest/planes/Dominaria/Urborg/Demonlord Belzenlok.dck b/forge-gui/res/conquest/planes/Dominaria/Urborg/Demonlord Belzenlok.dck index 4f3d2614865..8e554df7f87 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Urborg/Demonlord Belzenlok.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Urborg/Demonlord Belzenlok.dck @@ -21,7 +21,7 @@ Name=Demonlord Belzenlok 1 Sower of Discord|C18 1 Stitcher's Supplier|M19 1 Strangling Spores|M19 -15 Swamp|DOM +16 Swamp|DOM 1 The Eldest Reborn|DOM 1 Torgaar, Famine Incarnate|DOM 1 Urgoros, the Empty One|DOM diff --git a/forge-gui/res/conquest/planes/Dominaria/Urborg/Isareth the Awakener.dck b/forge-gui/res/conquest/planes/Dominaria/Urborg/Isareth the Awakener.dck index d8ba70fb521..19d52a654fb 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Urborg/Isareth the Awakener.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Urborg/Isareth the Awakener.dck @@ -22,7 +22,7 @@ Name=Isareth the Awakener 1 Soul Salvage|DOM 1 Stitcher's Supplier|M19 1 Strangling Spores|M19 -16 Swamp|DOM +17 Swamp|DOM 1 Tattered Mummy|M19 1 The Eldest Reborn|DOM 1 Windgrace Acolyte|DOM diff --git a/forge-gui/res/conquest/planes/Dominaria/Urborg/Josu Vess, Lich Knight.dck b/forge-gui/res/conquest/planes/Dominaria/Urborg/Josu Vess, Lich Knight.dck index 54d357abb80..f6e804be3ef 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Urborg/Josu Vess, Lich Knight.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Urborg/Josu Vess, Lich Knight.dck @@ -24,7 +24,7 @@ Name=Josu Vess, Lich Knight 1 Ruinous Path|C18 1 Sol Ring|C18 1 Stitcher's Supplier|M19 -14 Swamp|DOM +15 Swamp|DOM 1 Tattered Mummy|M19 1 The Eldest Reborn|DOM 1 Two-Headed Zombie|M19 diff --git a/forge-gui/res/conquest/planes/Dominaria/Urborg/Kazarov, Sengir Pureblood.dck b/forge-gui/res/conquest/planes/Dominaria/Urborg/Kazarov, Sengir Pureblood.dck index da77bda9bce..326405aa493 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Urborg/Kazarov, Sengir Pureblood.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Urborg/Kazarov, Sengir Pureblood.dck @@ -16,7 +16,7 @@ Name=Kazarov, Sengir Pureblood 1 Lightning Strike|M19 1 Liliana, the Necromancer|M19 1 Loyal Subordinate|C18 -5 Mountain|DOM|3 +6 Mountain|DOM 1 Nesting Dragon|C18 1 Radiating Lightning|DOM 1 Reassembling Skeleton|M19 @@ -27,7 +27,7 @@ Name=Kazarov, Sengir Pureblood 1 Shock|M19 1 Skymarch Bloodletter|M19 1 Sol Ring|C18 -8 Swamp|DOM +7 Swamp|DOM 1 Vampire Neonate|M19 1 Vampire Sovereign|M19 1 Yawgmoth's Vile Offering|DOM diff --git a/forge-gui/res/conquest/planes/Dominaria/Urborg/Urgoros, the Empty One.dck b/forge-gui/res/conquest/planes/Dominaria/Urborg/Urgoros, the Empty One.dck index 0a0d5cf0c37..0d2e4ff3e69 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Urborg/Urgoros, the Empty One.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Urborg/Urgoros, the Empty One.dck @@ -24,7 +24,7 @@ Name=Urgoros, the Empty One 1 Rite of Belzenlok|DOM 1 Skymarch Bloodletter|M19 1 Sol Ring|C18 -14 Swamp|DOM +15 Swamp|DOM 1 The Eldest Reborn|DOM 1 Vampire Neonate|M19 1 Vampire Sovereign|M19 diff --git a/forge-gui/res/conquest/planes/Dominaria/Urborg/Yargle, Glutton of Urborg.dck b/forge-gui/res/conquest/planes/Dominaria/Urborg/Yargle, Glutton of Urborg.dck index 8b6c0b0a3a2..58cbf00b737 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Urborg/Yargle, Glutton of Urborg.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Urborg/Yargle, Glutton of Urborg.dck @@ -25,7 +25,7 @@ Name=Yargle, Glutton of Urborg 1 Sol Ring|C18 1 Sparring Construct|DOM 1 Suspicious Bookcase|M19 -13 Swamp|DOM +14 Swamp|DOM 1 The Eldest Reborn|DOM 1 Traxos, Scourge of Kroog|DOM 1 Voltaic Servant|DOM diff --git a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Iwamori of the Open Fist.dck b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Iwamori of the Open Fist.dck index 8f41777aaf1..b67ce42554d 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Iwamori of the Open Fist.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Iwamori of the Open Fist.dck @@ -8,7 +8,7 @@ Name=Iwamori of the Open Fist 1 Commune with Nature|CHK 1 Dosan the Falling Leaf|CHK 1 Dosan's Oldest Chant|SOK -14 Forest|CHK +15 Forest|CHK 1 Humble Budoka|CHK 1 Inner Calm, Outer Strength|SOK 1 Journeyer's Kite|CHK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Kodama of the Center Tree.dck b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Kodama of the Center Tree.dck index a4156be1403..e1535bb7aba 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Kodama of the Center Tree.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Kodama of the Center Tree.dck @@ -6,7 +6,7 @@ Name=Kodama of the Center Tree 1 Arashi, the Sky Asunder|SOK 1 Bounteous Kirin|SOK 1 Dripping-Tongue Zubera|CHK -13 Forest|CHK +14 Forest|CHK 1 Forked-Branch Garami|BOK 1 Genju of the Cedars|BOK 1 Ghost-Lit Nourisher|SOK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Kodama of the North Tree.dck b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Kodama of the North Tree.dck index 0395b8985f6..6865c5c74df 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Kodama of the North Tree.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Kodama of the North Tree.dck @@ -7,7 +7,7 @@ Name=Kodama of the North Tree 1 Ayumi, the Last Visitor|SOK 1 Body of Jukai|BOK 1 Briarknit Kami|SOK -13 Forest|CHK +14 Forest|CHK 1 Forked-Branch Garami|BOK 1 Iwamori of the Open Fist|BOK 1 Joyous Respite|CHK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Kodama of the South Tree.dck b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Kodama of the South Tree.dck index 5b13f01a29d..9478a97febf 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Kodama of the South Tree.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Kodama of the South Tree.dck @@ -11,7 +11,7 @@ Name=Kodama of the South Tree 1 Elder Pine of Jukai|SOK 1 Feast of Worms|CHK 1 Fiddlehead Kami|SOK -15 Forest|CHK +16 Forest|CHK 1 Genju of the Cedars|BOK 1 Harbinger of Spring|BOK 1 Honden of Life's Web|CHK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Seshiro the Anointed.dck b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Seshiro the Anointed.dck index c2e7a5a8233..86deeabddcf 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Seshiro the Anointed.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Seshiro the Anointed.dck @@ -6,7 +6,7 @@ Name=Seshiro the Anointed 1 Commune with Nature|CHK 1 Endless Swarm|SOK 1 Enshrined Memories|BOK -12 Forest|CHK +13 Forest|CHK 1 Jukai Messenger|CHK 1 Kashi-Tribe Elite|SOK 1 Kashi-Tribe Reaver|CHK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Shizuko, Caller of Autumn.dck b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Shizuko, Caller of Autumn.dck index 3c54a0045fa..eb80b2e1bb1 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Shizuko, Caller of Autumn.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Jukai Forest/Shizuko, Caller of Autumn.dck @@ -4,7 +4,7 @@ Name=Shizuko, Caller of Autumn 1 Shizuko, Caller of Autumn|BOK [Main] 1 Body of Jukai|BOK -14 Forest|CHK|1 +15 Forest|CHK 1 Genju of the Cedars|BOK 1 Jugan, the Rising Star|CHK 1 Kodama's Might|CHK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Azami, Lady of Scrolls.dck b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Azami, Lady of Scrolls.dck index d18da2a4b48..2e7308dee03 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Azami, Lady of Scrolls.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Azami, Lady of Scrolls.dck @@ -13,7 +13,7 @@ Name=Azami, Lady of Scrolls 1 Graceful Adept|CHK 1 Hinder|CHK 1 Honden of Seeing Winds|CHK -14 Island|CHK +15 Island|CHK 1 Meloku the Clouded Mirror|CHK 1 Mikokoro, Center of the Sea|SOK 1 Minamo Scrollkeeper|SOK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Chisei, Heart of Oceans.dck b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Chisei, Heart of Oceans.dck index 913192e0382..d77519c9ca2 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Chisei, Heart of Oceans.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Chisei, Heart of Oceans.dck @@ -12,7 +12,7 @@ Name=Chisei, Heart of Oceans 1 Gifts Ungiven|CHK 1 Guardian of Solitude|CHK 1 Hinder|CHK -14 Island|CHK +15 Island|CHK 1 Jade Idol|CHK 1 Kaijin of the Vanishing Touch|BOK 1 Kami of the Crescent Moon|SOK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Cloudhoof Kirin.dck b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Cloudhoof Kirin.dck index d3f2022b82e..70d0a9fc076 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Cloudhoof Kirin.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Cloudhoof Kirin.dck @@ -15,7 +15,7 @@ Name=Cloudhoof Kirin 1 Hair-Strung Koto|CHK 1 Hinder|CHK 1 Hisoka's Defiance|CHK -14 Island|CHK +15 Island|CHK 1 Jetting Glasskite|BOK 1 Kami of the Crescent Moon|SOK 1 Kira, Great Glass-Spinner|BOK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Higure, the Still Wind.dck b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Higure, the Still Wind.dck index 3017d411cf7..fb942e930f3 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Higure, the Still Wind.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Higure, the Still Wind.dck @@ -10,7 +10,7 @@ Name=Higure, the Still Wind 1 Genju of the Falls|BOK 1 Hinder|CHK 1 Honden of Seeing Winds|CHK -13 Island|CHK +14 Island|CHK 1 Jetting Glasskite|BOK 1 Kaijin of the Vanishing Touch|BOK 1 Kami of the Crescent Moon|SOK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Keiga, the Tide Star.dck b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Keiga, the Tide Star.dck index c0c71c7be40..38acb4237db 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Keiga, the Tide Star.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Keiga, the Tide Star.dck @@ -9,7 +9,7 @@ Name=Keiga, the Tide Star 1 Floating-Dream Zubera|CHK 1 Genju of the Falls|BOK 1 Guardian of Solitude|CHK -13 Island|CHK +14 Island|CHK 1 Jade Idol|CHK 1 Jetting Glasskite|BOK 1 Kaijin of the Vanishing Touch|BOK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Meloku the Clouded Mirror.dck b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Meloku the Clouded Mirror.dck index 96a2a6dd921..0762cfb11de 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Meloku the Clouded Mirror.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Meloku the Clouded Mirror.dck @@ -10,7 +10,7 @@ Name=Meloku the Clouded Mirror 1 Genju of the Falls|BOK 1 Graceful Adept|CHK 1 Honden of Seeing Winds|CHK -13 Island|CHK +14 Island|CHK 1 Ivory Crane Netsuke|SOK 1 Kami of the Crescent Moon|SOK 1 Keiga, the Tide Star|CHK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Ninjas of Kamigawa.dck b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Ninjas of Kamigawa.dck index efe9f4f8261..145c49343f8 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Ninjas of Kamigawa.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Minamo Academy/Ninjas of Kamigawa.dck @@ -26,7 +26,7 @@ Name=Ninjas of Kamigawa 1 Silent-Blade Oni|PCA 1 Skullsnatcher|BOK 1 Student of Elements|CHK -4 Swamp|CHK +5 Swamp|CHK 1 Throat Slitter|BOK 1 Umezawa's Jitte|BOK 1 Walker of Secret Ways|BOK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Ben-Ben, Akki Hermit.dck b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Ben-Ben, Akki Hermit.dck index 2e31d7e7926..c173b24d5f7 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Ben-Ben, Akki Hermit.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Ben-Ben, Akki Hermit.dck @@ -20,7 +20,7 @@ Name=Ben-Ben, Akki Hermit 1 Kusari-Gama|CHK 1 Manriki-Gusari|SOK 1 Mikokoro, Center of the Sea|SOK -14 Mountain|CHK +15 Mountain|CHK 1 No-Dachi|CHK 1 Oathkeeper, Takeno's Daisho|CHK 1 Ronin Warclub|BOK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Fumiko the Lowblood.dck b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Fumiko the Lowblood.dck index 305af19ccf0..47c97f469d9 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Fumiko the Lowblood.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Fumiko the Lowblood.dck @@ -16,7 +16,7 @@ Name=Fumiko the Lowblood 1 Konda's Banner|CHK 1 Lava Spike|CHK 1 Mikokoro, Center of the Sea|SOK -14 Mountain|CHK +15 Mountain|CHK 1 No-Dachi|CHK 1 Oathkeeper, Takeno's Daisho|CHK 1 Path of Anger's Flame|SOK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Godo, Bandit Warlord.dck b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Godo, Bandit Warlord.dck index 310639cbc66..eff3d697b78 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Godo, Bandit Warlord.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Godo, Bandit Warlord.dck @@ -15,7 +15,7 @@ Name=Godo, Bandit Warlord 1 Lava Spike|CHK 1 Manriki-Gusari|SOK 1 Mikokoro, Center of the Sea|SOK -12 Mountain|CHK +13 Mountain|CHK 1 Neko-Te|BOK 1 No-Dachi|CHK 1 O-Naginata|SOK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Jiwari, the Earth Aflame.dck b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Jiwari, the Earth Aflame.dck index 85bd6fefaf6..618030c9274 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Jiwari, the Earth Aflame.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Jiwari, the Earth Aflame.dck @@ -20,7 +20,7 @@ Name=Jiwari, the Earth Aflame 1 Ishi-Ishi, Akki Crackshot|BOK 1 Konda's Banner|CHK 1 Lava Spike|CHK -13 Mountain|CHK +14 Mountain|CHK 1 No-Dachi|CHK 1 Pain Kami|CHK 1 Ronin Warclub|BOK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Patron of the Akki.dck b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Patron of the Akki.dck index 8b19f6ac742..980c3de0693 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Patron of the Akki.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Patron of the Akki.dck @@ -22,7 +22,7 @@ Name=Patron of the Akki 1 Ishi-Ishi, Akki Crackshot|BOK 1 Kiki-Jiki, Mirror Breaker|CHK 1 Mikokoro, Center of the Sea|SOK -14 Mountain|CHK +15 Mountain|CHK 1 No-Dachi|CHK 1 Path of Anger's Flame|SOK 1 Patron of the Akki|BOK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Ryusei, the Falling Star.dck b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Ryusei, the Falling Star.dck index fd5b24cd729..3cbb0610b66 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Ryusei, the Falling Star.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Sokenzan Mountains/Ryusei, the Falling Star.dck @@ -21,7 +21,7 @@ Name=Ryusei, the Falling Star 1 Kami of Fire's Roar|CHK 1 Long-Forgotten Gohei|CHK 1 Mikokoro, Center of the Sea|SOK -13 Mountain|CHK|1 +14 Mountain|CHK 1 Myojin of Infinite Rage|CHK 1 Nine-Ringed Bo|CHK 1 Oni of Wild Places|SOK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Infernal Kirin.dck b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Infernal Kirin.dck index 62b300db1d7..f598f161221 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Infernal Kirin.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Infernal Kirin.dck @@ -25,6 +25,6 @@ Name=Infernal Kirin 1 Psychic Spear|BOK 1 Shizo, Death's Storehouse|CHK 1 Struggle for Sanity|CHK -15 Swamp|CHK +16 Swamp|CHK 1 Three Tragedies|BOK 1 Waking Nightmare|CHK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Kuro, Pitlord.dck b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Kuro, Pitlord.dck index 7052215affc..0b052da8566 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Kuro, Pitlord.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Kuro, Pitlord.dck @@ -24,7 +24,7 @@ Name=Kuro, Pitlord 1 Seizan, Perverter of Truth|CHK 1 Shizo, Death's Storehouse|CHK 1 Stir the Grave|BOK -14 Swamp|CHK +15 Swamp|CHK 1 Takenuma Bleeder|BOK 1 Untaidake, the Cloud Keeper|CHK 1 Villainous Ogre|CHK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Maga, Traitor to Mortals.dck b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Maga, Traitor to Mortals.dck index 156267af94f..84c65d0ecfe 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Maga, Traitor to Mortals.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Maga, Traitor to Mortals.dck @@ -25,7 +25,7 @@ Name=Maga, Traitor to Mortals 1 Shuriken|BOK 1 Skullsnatcher|BOK 1 Swallowing Plague|CHK -13 Swamp|CHK|4 +14 Swamp|CHK 1 Thief of Hope|CHK 1 Throat Slitter|BOK 1 Untaidake, the Cloud Keeper|CHK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Marrow-Gnawer.dck b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Marrow-Gnawer.dck index 093da594b65..3e80f59f94f 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Marrow-Gnawer.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Marrow-Gnawer.dck @@ -27,7 +27,7 @@ Name=Marrow-Gnawer 1 Shizo, Death's Storehouse|CHK 1 Skullsnatcher|BOK 1 Stir the Grave|BOK -14 Swamp|CHK +15 Swamp|CHK 1 Throat Slitter|BOK [Sideboard] diff --git a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Toshiro Umezawa.dck b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Toshiro Umezawa.dck index 59fb944c514..c11c39e7986 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Toshiro Umezawa.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Toshiro Umezawa.dck @@ -26,7 +26,7 @@ Name=Toshiro Umezawa 1 Shizo, Death's Storehouse|CHK 1 Struggle for Sanity|CHK 1 Swallowing Plague|CHK -12 Swamp|CHK +13 Swamp|CHK 1 Tatsumasa, the Dragon's Fang|CHK 1 Three Tragedies|BOK 1 Umezawa's Jitte|BOK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Yukora, the Prisoner.dck b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Yukora, the Prisoner.dck index 1b9153624c1..444669f5ae2 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Yukora, the Prisoner.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/Yukora, the Prisoner.dck @@ -24,7 +24,7 @@ Name=Yukora, the Prisoner 1 Scourge of Numai|BOK 1 Sensei's Divining Top|CHK 1 Shizo, Death's Storehouse|CHK -13 Swamp|CHK|2 +14 Swamp|CHK 1 Takenuma Bleeder|BOK 1 Tatsumasa, the Dragon's Fang|CHK 1 That Which Was Taken|BOK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Celestial Kirin.dck b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Celestial Kirin.dck index f611b83ca17..4fd23893fa6 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Celestial Kirin.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Celestial Kirin.dck @@ -20,7 +20,7 @@ Name=Celestial Kirin 1 Moonlit Strider|BOK 1 Nikko-Onna|SOK 1 Otherworldly Journey|CHK -15 Plains|CHK +16 Plains|CHK 1 Reciprocate|CHK 1 Scour|BOK 1 Spiritual Visit|SOK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Michiko Konda, Truth Seeker.dck b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Michiko Konda, Truth Seeker.dck index bf6e8c0c82d..628c9d64e13 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Michiko Konda, Truth Seeker.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Michiko Konda, Truth Seeker.dck @@ -22,7 +22,7 @@ Name=Michiko Konda, Truth Seeker 1 No-Dachi|CHK 1 O-Naginata|SOK 1 Oathkeeper, Takeno's Daisho|CHK -14 Plains|CHK +15 Plains|CHK 1 Samurai Enforcers|CHK 1 Shuko|BOK 1 Takeno, Samurai General|CHK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Nagao, Bound by Honor.dck b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Nagao, Bound by Honor.dck index 4dcd2ecdd87..b8cebf0d0c9 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Nagao, Bound by Honor.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Nagao, Bound by Honor.dck @@ -24,7 +24,7 @@ Name=Nagao, Bound by Honor 1 No-Dachi|CHK 1 O-Naginata|SOK 1 Oathkeeper, Takeno's Daisho|CHK -14 Plains|CHK +15 Plains|CHK 1 Reverence|SOK 1 Samurai Enforcers|CHK 1 Takeno, Samurai General|CHK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Oyobi, Who Split the Heavens.dck b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Oyobi, Who Split the Heavens.dck index f619d94d5eb..ae2b10bd41d 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Oyobi, Who Split the Heavens.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Oyobi, Who Split the Heavens.dck @@ -22,7 +22,7 @@ Name=Oyobi, Who Split the Heavens 1 Lantern Kami|CHK 1 Long-Forgotten Gohei|CHK 1 Moonlit Strider|BOK -14 Plains|CHK +15 Plains|CHK 1 Promise of Bunrei|SOK 1 Terashi's Verdict|BOK 1 Untaidake, the Cloud Keeper|CHK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Rune-Tail, Kitsune Ascendant.dck b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Rune-Tail, Kitsune Ascendant.dck index 5e09d1cd8b7..29b3e6c4ce0 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Rune-Tail, Kitsune Ascendant.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Rune-Tail, Kitsune Ascendant.dck @@ -19,7 +19,7 @@ Name=Rune-Tail, Kitsune Ascendant 1 Mothrider Samurai|CHK 1 No-Dachi|CHK 1 Patron of the Kitsune|BOK -15 Plains|CHK +16 Plains|CHK 1 Presence of the Wise|SOK 1 Reverence|SOK 1 Ronin Warclub|BOK diff --git a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Takeno, Samurai General.dck b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Takeno, Samurai General.dck index 7073d40d8ac..cc872bd950a 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Takeno, Samurai General.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Takeno, Samurai General.dck @@ -21,7 +21,7 @@ Name=Takeno, Samurai General 1 No-Dachi|CHK 1 O-Naginata|SOK 1 Oathkeeper, Takeno's Daisho|CHK -14 Plains|CHK|2 +15 Plains|CHK 1 Promise of Bunrei|SOK 1 Reverence|SOK 1 Samurai Enforcers|CHK diff --git a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Lovisa Coldeyes.dck b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Lovisa Coldeyes.dck index 768fafff577..e51f1267937 100644 --- a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Lovisa Coldeyes.dck +++ b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Lovisa Coldeyes.dck @@ -25,7 +25,7 @@ Name=Lovisa Coldeyes 1 Keldon Marauders|PLC 1 Keldon Megaliths|FUT 1 Mogg Sentry|PLS -13 Mountain|TSP +14 Mountain|TSP 1 Power Matrix|MMQ 1 Shiv's Embrace|USG 1 Tahngarth, Talruum Hero|PLS|1 diff --git a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Mirri the Cursed.dck b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Mirri the Cursed.dck index 4ba2847e0d7..51f7eee48e0 100644 --- a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Mirri the Cursed.dck +++ b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Mirri the Cursed.dck @@ -22,7 +22,7 @@ Name=Mirri the Cursed 1 Stromgald Crusader|CSP 1 Stronghold Overseer|TSP 1 Sudden Death|TSP -16 Swamp|TSP +17 Swamp|TSP 1 Temporal Extortion|PLC 1 Tombstalker|FUT 1 Vampiric Sliver|TSP diff --git a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Rofellos, Llanowar Emissary.dck b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Rofellos, Llanowar Emissary.dck index 8c4616831e5..33eae3b68d6 100644 --- a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Rofellos, Llanowar Emissary.dck +++ b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Rofellos, Llanowar Emissary.dck @@ -8,7 +8,7 @@ Name=Rofellos, Llanowar Emissary 1 Decree of Savagery|SCG 1 Dryad Arbor|FUT 1 Explosive Growth|INV -13 Forest|USG +14 Forest|USG 1 Fyndhorn Elder|ICE 1 Fyndhorn Elves|ICE 1 Gaea's Cradle|USG diff --git a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Teneb, the Harvester.dck b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Teneb, the Harvester.dck index 11804795867..fd0dd84ab06 100644 --- a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Teneb, the Harvester.dck +++ b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Teneb, the Harvester.dck @@ -26,7 +26,7 @@ Name=Teneb, the Harvester 1 Lotus Vale|WTH 1 Panglacial Wurm|CSP 1 Phantasmagorian|PLC -1 Plains|TSP +2 Plains|TSP 1 Pox|ICE 1 Reya Dawnbringer|INV 1 Silver Seraph|JUD diff --git a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Zur the Enchanter.dck b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Zur the Enchanter.dck index a998124e5dc..52734dc8143 100644 --- a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Zur the Enchanter.dck +++ b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Zur the Enchanter.dck @@ -31,7 +31,7 @@ Name=Zur the Enchanter 1 Snow Devil|ICE 1 Spectral Sliver|LGN 1 Strength of Lunacy|TOR -2 Swamp|INV +3 Swamp|INV 1 Thran Quarry|USG 1 Twisted Experiment|UDS 1 Vampiric Link|PLC diff --git a/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Akroma, Angel of Fury.dck b/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Akroma, Angel of Fury.dck index ebeb8aa1052..b2cc37da1c7 100644 --- a/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Akroma, Angel of Fury.dck +++ b/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Akroma, Angel of Fury.dck @@ -21,7 +21,7 @@ Name=Akroma, Angel of Fury 1 Rock Slide|VIS 1 Rorix Bladewing|ONS 1 Shock|ONS -14 Snow-Covered Mountain|ICE +15 Snow-Covered Mountain|ICE 1 Spitting Drake|VIS 1 Starstorm|ONS 1 Tarox Bladewing|FUT diff --git a/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Akroma, Angel of Wrath.dck b/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Akroma, Angel of Wrath.dck index 8489c188d4f..bdc80754429 100644 --- a/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Akroma, Angel of Wrath.dck +++ b/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Akroma, Angel of Wrath.dck @@ -18,7 +18,7 @@ Name=Akroma, Angel of Wrath 1 Opal Archangel|USG 1 Opal Guardian|TSP 1 Pegasus Charger|USG -15 Plains|USG +16 Plains|USG 1 Radiant, Archangel|ULG 1 Reya Dawnbringer|INV 1 Serra Avenger|TSP diff --git a/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Kaysa.dck b/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Kaysa.dck index 1a4640aab17..e57e083ea81 100644 --- a/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Kaysa.dck +++ b/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Kaysa.dck @@ -11,7 +11,7 @@ Name=Kaysa 1 Elvish Vanguard|ONS 1 Essence Warden|PLC 1 Explosive Growth|INV -11 Forest|INV +12 Forest|INV 1 Gaea's Cradle|USG 1 Heedless One|ONS 1 Llanowar Reborn|FUT diff --git a/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Red Deck Wins.dck b/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Red Deck Wins.dck index 2b7a488e552..4fac13e15cf 100644 --- a/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Red Deck Wins.dck +++ b/forge-gui/res/conquest/planes/Time_Vault/The Memory Lane/Red Deck Wins.dck @@ -23,7 +23,7 @@ Name=Burn 1 Shock|ONS 1 Shower of Sparks|USG 1 Skred|CSP -13 Snow-Covered Mountain|CSP +14 Snow-Covered Mountain|CSP 1 Starstorm|ONS 1 Steam Blast|USG 1 Sudden Shock|TSP From 732a81ac884311b19f0888b908bbfc77b0819d4c Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Tue, 4 Dec 2018 20:28:23 +0000 Subject: [PATCH 368/901] AttachAI Reanimate Logic --- .../main/java/forge/ai/ability/AttachAi.java | 53 ++++++++++++------- 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index 3de3a7b20e9..a4e1cb4d004 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -3,8 +3,8 @@ package forge.ai.ability; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Lists; +import com.google.common.collect.Sets; import forge.ai.*; -import forge.card.MagicColor; import forge.game.Game; import forge.game.GameObject; import forge.game.GlobalRuleChange; @@ -89,21 +89,6 @@ public class AttachAi extends SpellAbilityAi { if (!attachPreference(sa, tgt, false)) { return false; } - - // Don't try to attach an aura to a card which will have protection from the relevant color - // TODO: Fix this not to be dependent on "Protection from Color" wording and to be flexible to account for - // other possibilities like "protection from all colors" etc. - Card targeted = sa.getTargets().getFirstTargetedCard(); - if (targeted != null && !targeted.getZone().is(ZoneType.Battlefield)) { - byte color = sa.getTargets().getFirstTargetedCard().getCurrentState().getColor(); - for (byte c : MagicColor.WUBRG) { - if ((color & c) == c) { - if (targeted.hasKeyword("Protection from " + MagicColor.toLongString(c))) { - return false; - } - } - } - } } // Flash logic @@ -614,8 +599,40 @@ public class AttachAi extends SpellAbilityAi { private static Card attachAIReanimatePreference(final SpellAbility sa, final List list, final boolean mandatory, final Card attachSource) { // AI For choosing a Card to Animate. - // TODO Add some more restrictions for Reanimation Auras - final Card c = ComputerUtilCard.getBestCreatureAI(list); + final Player ai = sa.getActivatingPlayer(); + final Card attachSourceLki = CardUtil.getLKICopy(attachSource); + attachSourceLki.setLastKnownZone(ai.getZone(ZoneType.Battlefield)); + // Suppress original attach Spell to replace it with another + attachSourceLki.getFirstAttachSpell().setSuppressed(true); + + //TODO for Reanimate Auras i need the new Attach Spell, in later versions it might be part of the Enchant Keyword + attachSourceLki.addSpellAbility(AbilityFactory.getAbility(attachSourceLki, "NewAttach")); + List betterList = CardLists.filter(list, new Predicate() { + @Override + public boolean apply(final Card c) { + final Card lki = CardUtil.getLKICopy(c); + // need to fake it as if lki would be on the battlefield + lki.setLastKnownZone(ai.getZone(ZoneType.Battlefield)); + + // Reanimate Auras use "Enchant creature put onto the battlefield with CARDNAME" with Remembered + attachSourceLki.clearRemembered(); + attachSourceLki.addRemembered(lki); + + // need to check what the cards would be on the battlefield + // do not attach yet, that would cause Events + CardCollection preList = new CardCollection(lki); + preList.add(attachSourceLki); + c.getGame().getAction().checkStaticAbilities(false, Sets.newHashSet(preList), preList); + boolean result = lki.canBeAttached(attachSourceLki); + + //reset static abilities + c.getGame().getAction().checkStaticAbilities(false); + + return result; + } + }); + + final Card c = ComputerUtilCard.getBestCreatureAI(betterList); // If Mandatory (brought directly into play without casting) gotta // choose something From fb77b652a7af29442daad11e9024406a6967f682 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Wed, 5 Dec 2018 10:53:38 +0000 Subject: [PATCH 369/901] Update CardFactoryUtil Closes #775 --- forge-game/src/main/java/forge/game/card/CardFactoryUtil.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 88150d20f27..cd3220da18b 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -2190,8 +2190,8 @@ public class CardFactoryUtil { inst.addTrigger(bushidoTrigger2); } else if (keyword.equals("Cascade")) { final StringBuilder trigScript = new StringBuilder( - "Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigCascade | Secondary$ " + - "True | TriggerDescription$ Cascade - CARDNAME"); + "Mode$ SpellCast | ValidCard$ Card.Self | Secondary$ True | " + + "TriggerDescription$ Cascade - CARDNAME"); final String abString = "DB$ DigUntil | Defined$ You | Amount$ 1 | Valid$ " + "Card.nonLand+cmcLTCascadeX | FoundDestination$ Exile | RevealedDestination$" From d4ee65f9373e84b0fa4016ec6f40e8f8eb6e93e5 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 5 Dec 2018 16:44:20 +0300 Subject: [PATCH 370/901] - Fixed the AI trying to gang-block and kill an attacker which can't be killed because combat damage to it would be prevented. - Added a couple AI hints to Ajani's Welcome. --- .../src/main/java/forge/ai/AiBlockController.java | 11 +++++++++++ .../src/main/java/forge/ai/ComputerUtilCombat.java | 2 +- forge-gui/res/cardsfolder/a/ajanis_welcome.txt | 2 ++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/AiBlockController.java b/forge-ai/src/main/java/forge/ai/AiBlockController.java index d674d866cec..e948d3cebfc 100644 --- a/forge-ai/src/main/java/forge/ai/AiBlockController.java +++ b/forge-ai/src/main/java/forge/ai/AiBlockController.java @@ -22,6 +22,7 @@ import com.google.common.base.Predicates; import forge.card.CardStateName; import forge.game.CardTraitBase; import forge.game.GameEntity; +import forge.game.GlobalRuleChange; import forge.game.card.*; import forge.game.combat.Combat; import forge.game.combat.CombatUtil; @@ -771,6 +772,16 @@ public class AiBlockController { blockers = getPossibleBlockers(combat, attacker, blockersLeft, false); blockers.removeAll(combat.getBlockers(attacker)); + // Don't add any blockers that won't kill the attacker because the damage would be prevented by a static effect + if (!ai.getGame().getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noPrevention)) { + blockers = CardLists.filter(blockers, new Predicate() { + @Override + public boolean apply(Card blocker) { + return !ComputerUtilCombat.isCombatDamagePrevented(blocker, attacker, blocker.getNetCombatDamage()); + } + }); + } + // Try to use safe blockers first if (blockers.size() > 0) { safeBlockers = getSafeBlockers(combat, attacker, blockers); diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java index 897be168b58..a6f3475e5f9 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java @@ -2560,7 +2560,7 @@ public class ComputerUtilCombat { return original; } - private static boolean isCombatDamagePrevented(final Card attacker, final GameEntity target, final int damage) { + public static boolean isCombatDamagePrevented(final Card attacker, final GameEntity target, final int damage) { final Game game = attacker.getGame(); // first try to replace the damage diff --git a/forge-gui/res/cardsfolder/a/ajanis_welcome.txt b/forge-gui/res/cardsfolder/a/ajanis_welcome.txt index 21dd08c4849..a8527351f95 100644 --- a/forge-gui/res/cardsfolder/a/ajanis_welcome.txt +++ b/forge-gui/res/cardsfolder/a/ajanis_welcome.txt @@ -3,4 +3,6 @@ ManaCost:W Types:Enchantment T:Mode$ ChangesZone | TriggerZones$ Battlefield | ValidCard$ Creature.YouCtrl | Origin$ Any | Destination$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever a creature enters the battlefield under your control, you gain 1 life. SVar:TrigGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 +SVar:PlayMain1:TRUE +SVar:AIPriorityModifier:9 Oracle:Whenever a creature enters the battlefield under your control, you gain 1 life. \ No newline at end of file From c2a1508ed6bad81847a9d9f3165b8c8250f72dc0 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 5 Dec 2018 18:20:56 +0300 Subject: [PATCH 371/901] - Attempting to fix Venerated Loxodon not giving counters to creatures that helped convoke it. --- forge-game/src/main/java/forge/game/cost/CostAdjustment.java | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java index c0f0216ead4..e9d96f08468 100644 --- a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java +++ b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java @@ -237,7 +237,6 @@ public class CostAdjustment { } } if (sa.getHostCard().hasKeyword(Keyword.CONVOKE)) { - sa.getHostCard().clearConvoked(); adjustCostByConvokeOrImprovise(cost, sa, false, test); } if (sa.getHostCard().hasKeyword(Keyword.IMPROVISE)) { From 1905ff30ddea7ad0b3048db2258926a6f223d80f Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 5 Dec 2018 20:28:50 +0300 Subject: [PATCH 372/901] - --- forge-ai/src/main/java/forge/ai/SpellAbilityAi.java | 2 +- forge-game/src/main/java/forge/game/cost/CostAdjustment.java | 4 +--- forge-gui/res/cardsfolder/v/venerated_loxodon.txt | 2 +- forge-gui/src/main/java/forge/player/HumanPlay.java | 2 ++ 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java b/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java index 4f08eb0e0e0..928cdb3b384 100644 --- a/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java +++ b/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java @@ -176,7 +176,7 @@ public abstract class SpellAbilityAi { public final boolean doTriggerNoCostWithSubs(final Player aiPlayer, final SpellAbility sa, final boolean mandatory) { - if (!doTriggerAINoCost(aiPlayer, sa, mandatory)) { + if (!doTriggerAINoCost(aiPlayer, sa, mandatory) && !"Always".equals(sa.getParam("AILogic"))) { return false; } final AbilitySub subAb = sa.getSubAbility(); diff --git a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java index e9d96f08468..ff5291f94d3 100644 --- a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java +++ b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java @@ -262,10 +262,9 @@ public class CostAdjustment { Map convokedCards = sa.getActivatingPlayer().getController().chooseCardsForConvokeOrImprovise(sa, cost.toManaCost(), untappedCards, improvise); // Convoked creats are tapped here with triggers suppressed, - // Then again when payment is done(In InputPayManaCost.done()) with suppression cleared. + // Then again when payment is done(In InputPayManaCost.done()) with suppression of Taps triggers. // This is to make sure that triggers go off at the right time // AND that you can't use mana tapabilities of convoked creatures to pay the convoked cost. - sa.getActivatingPlayer().getGame().getTriggerHandler().suppressMode(TriggerType.Taps); for (final Entry conv : convokedCards.entrySet()) { sa.addTappedForConvoke(conv.getKey()); cost.decreaseShard(conv.getValue(), 1); @@ -276,7 +275,6 @@ public class CostAdjustment { } } } - sa.getActivatingPlayer().getGame().getTriggerHandler().clearSuppression(TriggerType.Taps); } private static void adjustCostByOffering(final ManaCostBeingPaid cost, final SpellAbility sa) { diff --git a/forge-gui/res/cardsfolder/v/venerated_loxodon.txt b/forge-gui/res/cardsfolder/v/venerated_loxodon.txt index 09f861fd655..0c3e6b477cf 100644 --- a/forge-gui/res/cardsfolder/v/venerated_loxodon.txt +++ b/forge-gui/res/cardsfolder/v/venerated_loxodon.txt @@ -4,6 +4,6 @@ Types:Creature Elephant Cleric PT:4/4 K:Convoke T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPutCounterAll | TriggerDescription$ When CARDNAME enters the battlefield, put a +1/+1 counter on each creature that convoked it. -SVar:TrigPutCounterAll:DB$ PutCounterAll | ValidCards$ Creature.convoked | CounterType$ P1P1 | CounterNum$ 1 +SVar:TrigPutCounterAll:DB$ PutCounterAll | ValidCards$ Creature.convoked | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ Always DeckHas:Ability$Counters Oracle:Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of the creature's color.)\nWhen Venerated Loxodon enters the battlefield, put a +1/+1 counter on each creature that convoked it. diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index 8e7b84f42e3..cd5ab73816e 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -903,10 +903,12 @@ public class HumanPlay { } } if (ability.getTappedForConvoke() != null) { + activator.getGame().getTriggerHandler().suppressMode(TriggerType.Taps); for (final Card c : ability.getTappedForConvoke()) { c.setTapped(false); c.tap(); } + activator.getGame().getTriggerHandler().clearSuppression(TriggerType.Taps); ability.clearTappedForConvoke(); } return handleOfferingConvokeAndDelve(ability, cardsToDelve, false); From 17a922ae5a0922783256496349b828c95ff71f1f Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 5 Dec 2018 21:30:21 +0300 Subject: [PATCH 373/901] - Basic logic for fake counter move on Spikes from Tempest. --- .../java/forge/ai/ability/CountersPutAi.java | 35 ++++++++++++++++++- forge-gui/res/cardsfolder/s/spike_breeder.txt | 2 +- forge-gui/res/cardsfolder/s/spike_colony.txt | 2 +- forge-gui/res/cardsfolder/s/spike_drone.txt | 2 +- forge-gui/res/cardsfolder/s/spike_feeder.txt | 2 +- forge-gui/res/cardsfolder/s/spike_hatcher.txt | 2 +- forge-gui/res/cardsfolder/s/spike_rogue.txt | 2 +- forge-gui/res/cardsfolder/s/spike_soldier.txt | 2 +- forge-gui/res/cardsfolder/s/spike_tiller.txt | 2 +- forge-gui/res/cardsfolder/s/spike_weaver.txt | 2 +- forge-gui/res/cardsfolder/s/spike_worker.txt | 2 +- 11 files changed, 44 insertions(+), 11 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java index 920146771ff..e494dbb4179 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -11,6 +11,7 @@ import forge.game.GameEntity; import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; import forge.game.card.*; +import forge.game.combat.Combat; import forge.game.combat.CombatUtil; import forge.game.cost.*; import forge.game.keyword.Keyword; @@ -43,6 +44,8 @@ public class CountersPutAi extends SpellAbilityAi { protected boolean willPayCosts(Player ai, SpellAbility sa, Cost cost, Card source) { final String type = sa.getParam("CounterType"); + final String aiLogic = sa.getParamOrDefault("AILogic", ""); + // TODO Auto-generated method stub if (!super.willPayCosts(ai, sa, cost, source)) { return false; @@ -53,7 +56,7 @@ public class CountersPutAi extends SpellAbilityAi { if (part instanceof CostRemoveCounter) { final CostRemoveCounter remCounter = (CostRemoveCounter) part; final CounterType counterType = remCounter.counter; - if (counterType.name().equals(type)) { + if (counterType.name().equals(type) && !aiLogic.startsWith("MoveCounter")) { return false; } if (!part.payCostFromSource()) { @@ -279,6 +282,36 @@ public class CountersPutAi extends SpellAbilityAi { if (!source.canTransform()) { return false; } + } else if (logic.equals("MoveCounterSpike")) { + // Spikes (Tempest) + + // Try not to do it unless at the end of opponent's turn or the creature is threatened + Combat combat = ai.getGame().getCombat(); + boolean threatened = ComputerUtil.predictThreatenedObjects(ai, null, true).contains(sa.getHostCard()); + + if (!(threatened || (ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn() == ai))) { + return false; + } + + CardCollection targets = CardLists.getTargetableCards(ai.getCreaturesInPlay(), sa); + targets.remove(sa.getHostCard()); + + targets = CardLists.filter(targets, new Predicate() { + @Override + public boolean apply(Card card) { + // when threatened, any target is good to preserve the counter + return threatened || ComputerUtilCard.evaluateCreature(card, false, false) > ComputerUtilCard.evaluateCreature(sa.getHostCard(), false, false); + } + }); + + Card bestTgt = ComputerUtilCard.getBestCreatureAI(targets); + + if (bestTgt != null) { + sa.getTargets().add(bestTgt); + return true; + } + + return false; } if (sa.getConditions() != null && !sa.getConditions().areMet(sa) && sa.getSubAbility() == null) { diff --git a/forge-gui/res/cardsfolder/s/spike_breeder.txt b/forge-gui/res/cardsfolder/s/spike_breeder.txt index 68bc18a3bd2..ed8a550c3ff 100644 --- a/forge-gui/res/cardsfolder/s/spike_breeder.txt +++ b/forge-gui/res/cardsfolder/s/spike_breeder.txt @@ -3,7 +3,7 @@ ManaCost:3 G Types:Creature Spike PT:0/0 K:etbCounter:P1P1:3 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. +A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike | SpellDescription$ Put a +1/+1 counter on target creature. A:AB$ Token | Cost$ 2 SubCounter<1/P1P1> | TokenAmount$ 1 | TokenName$ Spike | TokenTypes$ Creature,Spike | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Create a 1/1 green Spike creature token. SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_breeder.jpg Oracle:Spike Breeder enters the battlefield with three +1/+1 counters on it.\n{2}, Remove a +1/+1 counter from Spike Breeder: Put a +1/+1 counter on target creature.\n{2}, Remove a +1/+1 counter from Spike Breeder: Create a 1/1 green Spike creature token. diff --git a/forge-gui/res/cardsfolder/s/spike_colony.txt b/forge-gui/res/cardsfolder/s/spike_colony.txt index dfb1573e10f..afcd2b32c48 100644 --- a/forge-gui/res/cardsfolder/s/spike_colony.txt +++ b/forge-gui/res/cardsfolder/s/spike_colony.txt @@ -3,6 +3,6 @@ ManaCost:4 G Types:Creature Spike PT:0/0 K:etbCounter:P1P1:4 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. +A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike | SpellDescription$ Put a +1/+1 counter on target creature. SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_colony.jpg Oracle:Spike Colony enters the battlefield with four +1/+1 counters on it.\n{2}, Remove a +1/+1 counter from Spike Colony: Put a +1/+1 counter on target creature. diff --git a/forge-gui/res/cardsfolder/s/spike_drone.txt b/forge-gui/res/cardsfolder/s/spike_drone.txt index 3e06e6ca6f4..511c6892116 100644 --- a/forge-gui/res/cardsfolder/s/spike_drone.txt +++ b/forge-gui/res/cardsfolder/s/spike_drone.txt @@ -3,6 +3,6 @@ ManaCost:G Types:Creature Spike Drone PT:0/0 K:etbCounter:P1P1:1 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. +A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike | SpellDescription$ Put a +1/+1 counter on target creature. SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_drone.jpg Oracle:Spike Drone enters the battlefield with a +1/+1 counter on it.\n{2}, Remove a +1/+1 counter from Spike Drone: Put a +1/+1 counter on target creature. diff --git a/forge-gui/res/cardsfolder/s/spike_feeder.txt b/forge-gui/res/cardsfolder/s/spike_feeder.txt index 9eb9c25d30f..5cfd12ab571 100644 --- a/forge-gui/res/cardsfolder/s/spike_feeder.txt +++ b/forge-gui/res/cardsfolder/s/spike_feeder.txt @@ -3,7 +3,7 @@ ManaCost:1 G G Types:Creature Spike PT:0/0 K:etbCounter:P1P1:2 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. +A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike | SpellDescription$ Put a +1/+1 counter on target creature. A:AB$ GainLife | Cost$ SubCounter<1/P1P1> | LifeAmount$ 2 | SpellDescription$ You gain 2 life. SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_feeder.jpg Oracle:Spike Feeder enters the battlefield with two +1/+1 counters on it.\n{2}, Remove a +1/+1 counter from Spike Feeder: Put a +1/+1 counter on target creature.\nRemove a +1/+1 counter from Spike Feeder: You gain 2 life. diff --git a/forge-gui/res/cardsfolder/s/spike_hatcher.txt b/forge-gui/res/cardsfolder/s/spike_hatcher.txt index 3c17a232f4e..a5ecaa56a45 100644 --- a/forge-gui/res/cardsfolder/s/spike_hatcher.txt +++ b/forge-gui/res/cardsfolder/s/spike_hatcher.txt @@ -3,7 +3,7 @@ ManaCost:6 G Types:Creature Spike PT:0/0 K:etbCounter:P1P1:6 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. +A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike | SpellDescription$ Put a +1/+1 counter on target creature. A:AB$ Regenerate | Cost$ 1 SubCounter<1/P1P1> | SpellDescription$ Regenerate Spike Hatcher. SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_hatcher.jpg Oracle:Spike Hatcher enters the battlefield with six +1/+1 counters on it.\n{2}, Remove a +1/+1 counter from Spike Hatcher: Put a +1/+1 counter on target creature.\n{1}, Remove a +1/+1 counter from Spike Hatcher: Regenerate Spike Hatcher. diff --git a/forge-gui/res/cardsfolder/s/spike_rogue.txt b/forge-gui/res/cardsfolder/s/spike_rogue.txt index 26e18ab754b..2c79de74c9a 100644 --- a/forge-gui/res/cardsfolder/s/spike_rogue.txt +++ b/forge-gui/res/cardsfolder/s/spike_rogue.txt @@ -3,7 +3,7 @@ ManaCost:1 G G Types:Creature Spike PT:0/0 K:etbCounter:P1P1:2 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. +A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike | SpellDescription$ Put a +1/+1 counter on target creature. A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1/Creature.YouCtrl/Creature you Control> | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on CARDNAME. AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_rogue.jpg diff --git a/forge-gui/res/cardsfolder/s/spike_soldier.txt b/forge-gui/res/cardsfolder/s/spike_soldier.txt index d57c54688eb..20454d45538 100644 --- a/forge-gui/res/cardsfolder/s/spike_soldier.txt +++ b/forge-gui/res/cardsfolder/s/spike_soldier.txt @@ -3,7 +3,7 @@ ManaCost:2 G G Types:Creature Spike Soldier PT:0/0 K:etbCounter:P1P1:3 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. +A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike | SpellDescription$ Put a +1/+1 counter on target creature. A:AB$ Pump | Cost$ SubCounter<1/P1P1> | Defined$ Self | NumAtt$ 2 | NumDef$ 2 | SpellDescription$ CARDNAME gets +2/+2 until end of turn. SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_soldier.jpg Oracle:Spike Soldier enters the battlefield with three +1/+1 counters on it.\n{2}, Remove a +1/+1 counter from Spike Soldier: Put a +1/+1 counter on target creature.\nRemove a +1/+1 counter from Spike Soldier: Spike Soldier gets +2/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/s/spike_tiller.txt b/forge-gui/res/cardsfolder/s/spike_tiller.txt index d8544eb7173..eeecb2191da 100644 --- a/forge-gui/res/cardsfolder/s/spike_tiller.txt +++ b/forge-gui/res/cardsfolder/s/spike_tiller.txt @@ -3,7 +3,7 @@ ManaCost:3 G G Types:Creature Spike PT:0/0 K:etbCounter:P1P1:3 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. +A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike | SpellDescription$ Put a +1/+1 counter on target creature. A:AB$ Animate | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Land | TgtPrompt$ Choose target land. | Power$ 2 | Toughness$ 2 | Types$ Creature | Permanent$ True | SubAbility$ DBPutCounter | SpellDescription$ Target land becomes a 2/2 creature that's still a land. Put a +1/+1 counter on it. SVar:DBPutCounter:DB$PutCounter | Defined$ Targeted | CounterType$ P1P1 | CounterNum$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_tiller.jpg diff --git a/forge-gui/res/cardsfolder/s/spike_weaver.txt b/forge-gui/res/cardsfolder/s/spike_weaver.txt index 5937873b693..788f373bdc5 100644 --- a/forge-gui/res/cardsfolder/s/spike_weaver.txt +++ b/forge-gui/res/cardsfolder/s/spike_weaver.txt @@ -3,7 +3,7 @@ ManaCost:2 G G Types:Creature Spike PT:0/0 K:etbCounter:P1P1:3 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. +A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike | SpellDescription$ Put a +1/+1 counter on target creature. A:AB$ Fog | Cost$ 1 SubCounter<1/P1P1> | AILogic$ SeriousDamage | SpellDescription$ Prevent all combat damage that would be dealt this turn. SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_weaver.jpg Oracle:Spike Weaver enters the battlefield with three +1/+1 counters on it.\n{2}, Remove a +1/+1 counter from Spike Weaver: Put a +1/+1 counter on target creature.\n{1}, Remove a +1/+1 counter from Spike Weaver: Prevent all combat damage that would be dealt this turn. diff --git a/forge-gui/res/cardsfolder/s/spike_worker.txt b/forge-gui/res/cardsfolder/s/spike_worker.txt index 70223734d96..1fba05ca944 100644 --- a/forge-gui/res/cardsfolder/s/spike_worker.txt +++ b/forge-gui/res/cardsfolder/s/spike_worker.txt @@ -3,6 +3,6 @@ ManaCost:2 G Types:Creature Spike PT:0/0 K:etbCounter:P1P1:2 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. +A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike | SpellDescription$ Put a +1/+1 counter on target creature. SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_worker.jpg Oracle:Spike Worker enters the battlefield with two +1/+1 counters on it.\n{2}, Remove a +1/+1 counter from Spike Worker: Put a +1/+1 counter on target creature. From f588038ac990f62123914c8f1ea59a2e7403e59d Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 5 Dec 2018 21:39:43 +0300 Subject: [PATCH 374/901] - Predict lethal combat. --- forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java index e494dbb4179..b6429340df7 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -287,7 +287,8 @@ public class CountersPutAi extends SpellAbilityAi { // Try not to do it unless at the end of opponent's turn or the creature is threatened Combat combat = ai.getGame().getCombat(); - boolean threatened = ComputerUtil.predictThreatenedObjects(ai, null, true).contains(sa.getHostCard()); + boolean threatened = ComputerUtil.predictThreatenedObjects(ai, null, true).contains(sa.getHostCard()) + || (combat != null && combat.isBlocked(sa.getHostCard()) && ComputerUtilCombat.attackerWouldBeDestroyed(ai, sa.getHostCard(), combat)); if (!(threatened || (ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn() == ai))) { return false; From 8e7a9d46cd052f27c132134fc644f4394c46a6ce Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 5 Dec 2018 21:53:49 +0300 Subject: [PATCH 375/901] - Account for tapped diff in evaluation. --- forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java index b6429340df7..817e1fe568a 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -301,7 +301,7 @@ public class CountersPutAi extends SpellAbilityAi { @Override public boolean apply(Card card) { // when threatened, any target is good to preserve the counter - return threatened || ComputerUtilCard.evaluateCreature(card, false, false) > ComputerUtilCard.evaluateCreature(sa.getHostCard(), false, false); + return threatened || ComputerUtilCard.evaluateCreature(card, false, false) > ComputerUtilCard.evaluateCreature(sa.getHostCard(), false, false) + 1; } }); From 498237a65ec9f1406e2ef189a7e2aaa82f973cf5 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 5 Dec 2018 21:55:27 +0300 Subject: [PATCH 376/901] - Comment fix --- forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java index 817e1fe568a..459c7564fa3 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -51,7 +51,7 @@ public class CountersPutAi extends SpellAbilityAi { return false; } - // disable moving counters + // disable moving counters (unless a specialized AI logic supports it) for (final CostPart part : cost.getCostParts()) { if (part instanceof CostRemoveCounter) { final CostRemoveCounter remCounter = (CostRemoveCounter) part; From 3719812889919a1aabd7eae815b0608499164c3f Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 5 Dec 2018 21:57:17 +0300 Subject: [PATCH 377/901] - Refactor the method for the logic. --- .../java/forge/ai/ability/CountersPutAi.java | 65 ++++++++++--------- 1 file changed, 35 insertions(+), 30 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java index 459c7564fa3..7a38e503055 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -283,36 +283,7 @@ public class CountersPutAi extends SpellAbilityAi { return false; } } else if (logic.equals("MoveCounterSpike")) { - // Spikes (Tempest) - - // Try not to do it unless at the end of opponent's turn or the creature is threatened - Combat combat = ai.getGame().getCombat(); - boolean threatened = ComputerUtil.predictThreatenedObjects(ai, null, true).contains(sa.getHostCard()) - || (combat != null && combat.isBlocked(sa.getHostCard()) && ComputerUtilCombat.attackerWouldBeDestroyed(ai, sa.getHostCard(), combat)); - - if (!(threatened || (ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn() == ai))) { - return false; - } - - CardCollection targets = CardLists.getTargetableCards(ai.getCreaturesInPlay(), sa); - targets.remove(sa.getHostCard()); - - targets = CardLists.filter(targets, new Predicate() { - @Override - public boolean apply(Card card) { - // when threatened, any target is good to preserve the counter - return threatened || ComputerUtilCard.evaluateCreature(card, false, false) > ComputerUtilCard.evaluateCreature(sa.getHostCard(), false, false) + 1; - } - }); - - Card bestTgt = ComputerUtilCard.getBestCreatureAI(targets); - - if (bestTgt != null) { - sa.getTargets().add(bestTgt); - return true; - } - - return false; + return doMoveCounterSpikeLogic(ai, sa, ph); } if (sa.getConditions() != null && !sa.getConditions().areMet(sa) && sa.getSubAbility() == null) { @@ -1033,4 +1004,38 @@ public class CountersPutAi extends SpellAbilityAi { } return Iterables.getFirst(options, null); } + + private boolean doMoveCounterSpikeLogic(Player ai, SpellAbility sa, PhaseHandler ph) { + // Spikes (Tempest) + + // Try not to do it unless at the end of opponent's turn or the creature is threatened + Combat combat = ai.getGame().getCombat(); + boolean threatened = ComputerUtil.predictThreatenedObjects(ai, null, true).contains(sa.getHostCard()) + || (combat != null && combat.isBlocked(sa.getHostCard()) && ComputerUtilCombat.attackerWouldBeDestroyed(ai, sa.getHostCard(), combat)); + + if (!(threatened || (ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn() == ai))) { + return false; + } + + CardCollection targets = CardLists.getTargetableCards(ai.getCreaturesInPlay(), sa); + targets.remove(sa.getHostCard()); + + targets = CardLists.filter(targets, new Predicate() { + @Override + public boolean apply(Card card) { + // when threatened, any target is good to preserve the counter + return threatened || ComputerUtilCard.evaluateCreature(card, false, false) > ComputerUtilCard.evaluateCreature(sa.getHostCard(), false, false) + 1; + } + }); + + Card bestTgt = ComputerUtilCard.getBestCreatureAI(targets); + + if (bestTgt != null) { + sa.getTargets().add(bestTgt); + return true; + } + + return false; + } + } From 41f505e636e5d141bb86c5e08f9d8bcb2f1eccf4 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 5 Dec 2018 22:12:28 +0300 Subject: [PATCH 378/901] - Don't move counters to a threatened creature. --- forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java index 7a38e503055..0069153eb4b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -1023,8 +1023,9 @@ public class CountersPutAi extends SpellAbilityAi { targets = CardLists.filter(targets, new Predicate() { @Override public boolean apply(Card card) { - // when threatened, any target is good to preserve the counter - return threatened || ComputerUtilCard.evaluateCreature(card, false, false) > ComputerUtilCard.evaluateCreature(sa.getHostCard(), false, false) + 1; + boolean tgtThreatened = ComputerUtil.predictThreatenedObjects(ai, null, true).contains(card) || (combat != null && combat.isBlocked(card) && ComputerUtilCombat.attackerWouldBeDestroyed(ai, card, combat)); + // when threatened, any non-threatened target is good to preserve the counter + return !tgtThreatened && (threatened || ComputerUtilCard.evaluateCreature(card, false, false) > ComputerUtilCard.evaluateCreature(sa.getHostCard(), false, false) + 1); } }); From 27527e09f757855453848325ab76d742f3ec645a Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 5 Dec 2018 22:33:12 +0300 Subject: [PATCH 379/901] - Don't move counters away from spikes with extra counter effects too zealously. --- .../src/main/java/forge/ai/ability/CountersPutAi.java | 9 +++++---- forge-gui/res/cardsfolder/s/spike_breeder.txt | 2 +- forge-gui/res/cardsfolder/s/spike_feeder.txt | 2 +- forge-gui/res/cardsfolder/s/spike_hatcher.txt | 2 +- forge-gui/res/cardsfolder/s/spike_soldier.txt | 2 +- forge-gui/res/cardsfolder/s/spike_tiller.txt | 2 +- forge-gui/res/cardsfolder/s/spike_weaver.txt | 2 +- 7 files changed, 11 insertions(+), 10 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java index 0069153eb4b..43aa378d212 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -282,7 +282,7 @@ public class CountersPutAi extends SpellAbilityAi { if (!source.canTransform()) { return false; } - } else if (logic.equals("MoveCounterSpike")) { + } else if (logic.startsWith("MoveCounterSpike")) { return doMoveCounterSpikeLogic(ai, sa, ph); } @@ -1009,8 +1009,9 @@ public class CountersPutAi extends SpellAbilityAi { // Spikes (Tempest) // Try not to do it unless at the end of opponent's turn or the creature is threatened - Combat combat = ai.getGame().getCombat(); - boolean threatened = ComputerUtil.predictThreatenedObjects(ai, null, true).contains(sa.getHostCard()) + final int creatDiff = sa.getParam("AILogic").contains("ExtraEff") ? 450 : 1; + final Combat combat = ai.getGame().getCombat(); + final boolean threatened = ComputerUtil.predictThreatenedObjects(ai, null, true).contains(sa.getHostCard()) || (combat != null && combat.isBlocked(sa.getHostCard()) && ComputerUtilCombat.attackerWouldBeDestroyed(ai, sa.getHostCard(), combat)); if (!(threatened || (ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn() == ai))) { @@ -1025,7 +1026,7 @@ public class CountersPutAi extends SpellAbilityAi { public boolean apply(Card card) { boolean tgtThreatened = ComputerUtil.predictThreatenedObjects(ai, null, true).contains(card) || (combat != null && combat.isBlocked(card) && ComputerUtilCombat.attackerWouldBeDestroyed(ai, card, combat)); // when threatened, any non-threatened target is good to preserve the counter - return !tgtThreatened && (threatened || ComputerUtilCard.evaluateCreature(card, false, false) > ComputerUtilCard.evaluateCreature(sa.getHostCard(), false, false) + 1); + return !tgtThreatened && (threatened || ComputerUtilCard.evaluateCreature(card, false, false) > ComputerUtilCard.evaluateCreature(sa.getHostCard(), false, false) + creatDiff); } }); diff --git a/forge-gui/res/cardsfolder/s/spike_breeder.txt b/forge-gui/res/cardsfolder/s/spike_breeder.txt index ed8a550c3ff..f65b59c5cd5 100644 --- a/forge-gui/res/cardsfolder/s/spike_breeder.txt +++ b/forge-gui/res/cardsfolder/s/spike_breeder.txt @@ -3,7 +3,7 @@ ManaCost:3 G Types:Creature Spike PT:0/0 K:etbCounter:P1P1:3 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike | SpellDescription$ Put a +1/+1 counter on target creature. +A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike.ExtraEff | SpellDescription$ Put a +1/+1 counter on target creature. A:AB$ Token | Cost$ 2 SubCounter<1/P1P1> | TokenAmount$ 1 | TokenName$ Spike | TokenTypes$ Creature,Spike | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Create a 1/1 green Spike creature token. SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_breeder.jpg Oracle:Spike Breeder enters the battlefield with three +1/+1 counters on it.\n{2}, Remove a +1/+1 counter from Spike Breeder: Put a +1/+1 counter on target creature.\n{2}, Remove a +1/+1 counter from Spike Breeder: Create a 1/1 green Spike creature token. diff --git a/forge-gui/res/cardsfolder/s/spike_feeder.txt b/forge-gui/res/cardsfolder/s/spike_feeder.txt index 5cfd12ab571..1cdfc52aea6 100644 --- a/forge-gui/res/cardsfolder/s/spike_feeder.txt +++ b/forge-gui/res/cardsfolder/s/spike_feeder.txt @@ -3,7 +3,7 @@ ManaCost:1 G G Types:Creature Spike PT:0/0 K:etbCounter:P1P1:2 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike | SpellDescription$ Put a +1/+1 counter on target creature. +A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike.ExtraEff | SpellDescription$ Put a +1/+1 counter on target creature. A:AB$ GainLife | Cost$ SubCounter<1/P1P1> | LifeAmount$ 2 | SpellDescription$ You gain 2 life. SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_feeder.jpg Oracle:Spike Feeder enters the battlefield with two +1/+1 counters on it.\n{2}, Remove a +1/+1 counter from Spike Feeder: Put a +1/+1 counter on target creature.\nRemove a +1/+1 counter from Spike Feeder: You gain 2 life. diff --git a/forge-gui/res/cardsfolder/s/spike_hatcher.txt b/forge-gui/res/cardsfolder/s/spike_hatcher.txt index a5ecaa56a45..b3199edf6da 100644 --- a/forge-gui/res/cardsfolder/s/spike_hatcher.txt +++ b/forge-gui/res/cardsfolder/s/spike_hatcher.txt @@ -3,7 +3,7 @@ ManaCost:6 G Types:Creature Spike PT:0/0 K:etbCounter:P1P1:6 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike | SpellDescription$ Put a +1/+1 counter on target creature. +A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike.ExtraEff | SpellDescription$ Put a +1/+1 counter on target creature. A:AB$ Regenerate | Cost$ 1 SubCounter<1/P1P1> | SpellDescription$ Regenerate Spike Hatcher. SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_hatcher.jpg Oracle:Spike Hatcher enters the battlefield with six +1/+1 counters on it.\n{2}, Remove a +1/+1 counter from Spike Hatcher: Put a +1/+1 counter on target creature.\n{1}, Remove a +1/+1 counter from Spike Hatcher: Regenerate Spike Hatcher. diff --git a/forge-gui/res/cardsfolder/s/spike_soldier.txt b/forge-gui/res/cardsfolder/s/spike_soldier.txt index 20454d45538..cf5afd3066e 100644 --- a/forge-gui/res/cardsfolder/s/spike_soldier.txt +++ b/forge-gui/res/cardsfolder/s/spike_soldier.txt @@ -3,7 +3,7 @@ ManaCost:2 G G Types:Creature Spike Soldier PT:0/0 K:etbCounter:P1P1:3 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike | SpellDescription$ Put a +1/+1 counter on target creature. +A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike.ExtraEff | SpellDescription$ Put a +1/+1 counter on target creature. A:AB$ Pump | Cost$ SubCounter<1/P1P1> | Defined$ Self | NumAtt$ 2 | NumDef$ 2 | SpellDescription$ CARDNAME gets +2/+2 until end of turn. SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_soldier.jpg Oracle:Spike Soldier enters the battlefield with three +1/+1 counters on it.\n{2}, Remove a +1/+1 counter from Spike Soldier: Put a +1/+1 counter on target creature.\nRemove a +1/+1 counter from Spike Soldier: Spike Soldier gets +2/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/s/spike_tiller.txt b/forge-gui/res/cardsfolder/s/spike_tiller.txt index eeecb2191da..d9898079035 100644 --- a/forge-gui/res/cardsfolder/s/spike_tiller.txt +++ b/forge-gui/res/cardsfolder/s/spike_tiller.txt @@ -3,7 +3,7 @@ ManaCost:3 G G Types:Creature Spike PT:0/0 K:etbCounter:P1P1:3 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike | SpellDescription$ Put a +1/+1 counter on target creature. +A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike.ExtraEff | SpellDescription$ Put a +1/+1 counter on target creature. A:AB$ Animate | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Land | TgtPrompt$ Choose target land. | Power$ 2 | Toughness$ 2 | Types$ Creature | Permanent$ True | SubAbility$ DBPutCounter | SpellDescription$ Target land becomes a 2/2 creature that's still a land. Put a +1/+1 counter on it. SVar:DBPutCounter:DB$PutCounter | Defined$ Targeted | CounterType$ P1P1 | CounterNum$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_tiller.jpg diff --git a/forge-gui/res/cardsfolder/s/spike_weaver.txt b/forge-gui/res/cardsfolder/s/spike_weaver.txt index 788f373bdc5..38a2cea77c9 100644 --- a/forge-gui/res/cardsfolder/s/spike_weaver.txt +++ b/forge-gui/res/cardsfolder/s/spike_weaver.txt @@ -3,7 +3,7 @@ ManaCost:2 G G Types:Creature Spike PT:0/0 K:etbCounter:P1P1:3 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike | SpellDescription$ Put a +1/+1 counter on target creature. +A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike.ExtraEff | SpellDescription$ Put a +1/+1 counter on target creature. A:AB$ Fog | Cost$ 1 SubCounter<1/P1P1> | AILogic$ SeriousDamage | SpellDescription$ Prevent all combat damage that would be dealt this turn. SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_weaver.jpg Oracle:Spike Weaver enters the battlefield with three +1/+1 counters on it.\n{2}, Remove a +1/+1 counter from Spike Weaver: Put a +1/+1 counter on target creature.\n{1}, Remove a +1/+1 counter from Spike Weaver: Prevent all combat damage that would be dealt this turn. From 05672bb174ce3e0bf4649fc8294af038e26e9428 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 6 Dec 2018 07:17:31 +0300 Subject: [PATCH 380/901] - Better name for the MoveCounter logic for Spikes. --- forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java | 2 +- forge-gui/res/cardsfolder/s/spike_breeder.txt | 2 +- forge-gui/res/cardsfolder/s/spike_colony.txt | 2 +- forge-gui/res/cardsfolder/s/spike_drone.txt | 2 +- forge-gui/res/cardsfolder/s/spike_feeder.txt | 2 +- forge-gui/res/cardsfolder/s/spike_hatcher.txt | 2 +- forge-gui/res/cardsfolder/s/spike_rogue.txt | 2 +- forge-gui/res/cardsfolder/s/spike_soldier.txt | 2 +- forge-gui/res/cardsfolder/s/spike_tiller.txt | 2 +- forge-gui/res/cardsfolder/s/spike_weaver.txt | 2 +- forge-gui/res/cardsfolder/s/spike_worker.txt | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java index 43aa378d212..161b16466ba 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -1009,7 +1009,7 @@ public class CountersPutAi extends SpellAbilityAi { // Spikes (Tempest) // Try not to do it unless at the end of opponent's turn or the creature is threatened - final int creatDiff = sa.getParam("AILogic").contains("ExtraEff") ? 450 : 1; + final int creatDiff = sa.getParam("AILogic").contains("IsCounterUser") ? 450 : 1; final Combat combat = ai.getGame().getCombat(); final boolean threatened = ComputerUtil.predictThreatenedObjects(ai, null, true).contains(sa.getHostCard()) || (combat != null && combat.isBlocked(sa.getHostCard()) && ComputerUtilCombat.attackerWouldBeDestroyed(ai, sa.getHostCard(), combat)); diff --git a/forge-gui/res/cardsfolder/s/spike_breeder.txt b/forge-gui/res/cardsfolder/s/spike_breeder.txt index f65b59c5cd5..42aff44b17a 100644 --- a/forge-gui/res/cardsfolder/s/spike_breeder.txt +++ b/forge-gui/res/cardsfolder/s/spike_breeder.txt @@ -3,7 +3,7 @@ ManaCost:3 G Types:Creature Spike PT:0/0 K:etbCounter:P1P1:3 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike.ExtraEff | SpellDescription$ Put a +1/+1 counter on target creature. +A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounter.IsCounterUser | SpellDescription$ Put a +1/+1 counter on target creature. A:AB$ Token | Cost$ 2 SubCounter<1/P1P1> | TokenAmount$ 1 | TokenName$ Spike | TokenTypes$ Creature,Spike | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Create a 1/1 green Spike creature token. SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_breeder.jpg Oracle:Spike Breeder enters the battlefield with three +1/+1 counters on it.\n{2}, Remove a +1/+1 counter from Spike Breeder: Put a +1/+1 counter on target creature.\n{2}, Remove a +1/+1 counter from Spike Breeder: Create a 1/1 green Spike creature token. diff --git a/forge-gui/res/cardsfolder/s/spike_colony.txt b/forge-gui/res/cardsfolder/s/spike_colony.txt index afcd2b32c48..6d14efeabed 100644 --- a/forge-gui/res/cardsfolder/s/spike_colony.txt +++ b/forge-gui/res/cardsfolder/s/spike_colony.txt @@ -3,6 +3,6 @@ ManaCost:4 G Types:Creature Spike PT:0/0 K:etbCounter:P1P1:4 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike | SpellDescription$ Put a +1/+1 counter on target creature. +A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounter | SpellDescription$ Put a +1/+1 counter on target creature. SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_colony.jpg Oracle:Spike Colony enters the battlefield with four +1/+1 counters on it.\n{2}, Remove a +1/+1 counter from Spike Colony: Put a +1/+1 counter on target creature. diff --git a/forge-gui/res/cardsfolder/s/spike_drone.txt b/forge-gui/res/cardsfolder/s/spike_drone.txt index 511c6892116..4776106597e 100644 --- a/forge-gui/res/cardsfolder/s/spike_drone.txt +++ b/forge-gui/res/cardsfolder/s/spike_drone.txt @@ -3,6 +3,6 @@ ManaCost:G Types:Creature Spike Drone PT:0/0 K:etbCounter:P1P1:1 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike | SpellDescription$ Put a +1/+1 counter on target creature. +A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounter | SpellDescription$ Put a +1/+1 counter on target creature. SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_drone.jpg Oracle:Spike Drone enters the battlefield with a +1/+1 counter on it.\n{2}, Remove a +1/+1 counter from Spike Drone: Put a +1/+1 counter on target creature. diff --git a/forge-gui/res/cardsfolder/s/spike_feeder.txt b/forge-gui/res/cardsfolder/s/spike_feeder.txt index 1cdfc52aea6..2e012f50cae 100644 --- a/forge-gui/res/cardsfolder/s/spike_feeder.txt +++ b/forge-gui/res/cardsfolder/s/spike_feeder.txt @@ -3,7 +3,7 @@ ManaCost:1 G G Types:Creature Spike PT:0/0 K:etbCounter:P1P1:2 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike.ExtraEff | SpellDescription$ Put a +1/+1 counter on target creature. +A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounter.IsCounterUser | SpellDescription$ Put a +1/+1 counter on target creature. A:AB$ GainLife | Cost$ SubCounter<1/P1P1> | LifeAmount$ 2 | SpellDescription$ You gain 2 life. SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_feeder.jpg Oracle:Spike Feeder enters the battlefield with two +1/+1 counters on it.\n{2}, Remove a +1/+1 counter from Spike Feeder: Put a +1/+1 counter on target creature.\nRemove a +1/+1 counter from Spike Feeder: You gain 2 life. diff --git a/forge-gui/res/cardsfolder/s/spike_hatcher.txt b/forge-gui/res/cardsfolder/s/spike_hatcher.txt index b3199edf6da..a99eeb96069 100644 --- a/forge-gui/res/cardsfolder/s/spike_hatcher.txt +++ b/forge-gui/res/cardsfolder/s/spike_hatcher.txt @@ -3,7 +3,7 @@ ManaCost:6 G Types:Creature Spike PT:0/0 K:etbCounter:P1P1:6 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike.ExtraEff | SpellDescription$ Put a +1/+1 counter on target creature. +A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounter.IsCounterUser | SpellDescription$ Put a +1/+1 counter on target creature. A:AB$ Regenerate | Cost$ 1 SubCounter<1/P1P1> | SpellDescription$ Regenerate Spike Hatcher. SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_hatcher.jpg Oracle:Spike Hatcher enters the battlefield with six +1/+1 counters on it.\n{2}, Remove a +1/+1 counter from Spike Hatcher: Put a +1/+1 counter on target creature.\n{1}, Remove a +1/+1 counter from Spike Hatcher: Regenerate Spike Hatcher. diff --git a/forge-gui/res/cardsfolder/s/spike_rogue.txt b/forge-gui/res/cardsfolder/s/spike_rogue.txt index 2c79de74c9a..a4f330c3eb3 100644 --- a/forge-gui/res/cardsfolder/s/spike_rogue.txt +++ b/forge-gui/res/cardsfolder/s/spike_rogue.txt @@ -3,7 +3,7 @@ ManaCost:1 G G Types:Creature Spike PT:0/0 K:etbCounter:P1P1:2 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike | SpellDescription$ Put a +1/+1 counter on target creature. +A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounter | SpellDescription$ Put a +1/+1 counter on target creature. A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1/Creature.YouCtrl/Creature you Control> | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on CARDNAME. AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_rogue.jpg diff --git a/forge-gui/res/cardsfolder/s/spike_soldier.txt b/forge-gui/res/cardsfolder/s/spike_soldier.txt index cf5afd3066e..16ff0f5aa3d 100644 --- a/forge-gui/res/cardsfolder/s/spike_soldier.txt +++ b/forge-gui/res/cardsfolder/s/spike_soldier.txt @@ -3,7 +3,7 @@ ManaCost:2 G G Types:Creature Spike Soldier PT:0/0 K:etbCounter:P1P1:3 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike.ExtraEff | SpellDescription$ Put a +1/+1 counter on target creature. +A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounter.IsCounterUser | SpellDescription$ Put a +1/+1 counter on target creature. A:AB$ Pump | Cost$ SubCounter<1/P1P1> | Defined$ Self | NumAtt$ 2 | NumDef$ 2 | SpellDescription$ CARDNAME gets +2/+2 until end of turn. SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_soldier.jpg Oracle:Spike Soldier enters the battlefield with three +1/+1 counters on it.\n{2}, Remove a +1/+1 counter from Spike Soldier: Put a +1/+1 counter on target creature.\nRemove a +1/+1 counter from Spike Soldier: Spike Soldier gets +2/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/s/spike_tiller.txt b/forge-gui/res/cardsfolder/s/spike_tiller.txt index d9898079035..e233409e36a 100644 --- a/forge-gui/res/cardsfolder/s/spike_tiller.txt +++ b/forge-gui/res/cardsfolder/s/spike_tiller.txt @@ -3,7 +3,7 @@ ManaCost:3 G G Types:Creature Spike PT:0/0 K:etbCounter:P1P1:3 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike.ExtraEff | SpellDescription$ Put a +1/+1 counter on target creature. +A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounter.IsCounterUser | SpellDescription$ Put a +1/+1 counter on target creature. A:AB$ Animate | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Land | TgtPrompt$ Choose target land. | Power$ 2 | Toughness$ 2 | Types$ Creature | Permanent$ True | SubAbility$ DBPutCounter | SpellDescription$ Target land becomes a 2/2 creature that's still a land. Put a +1/+1 counter on it. SVar:DBPutCounter:DB$PutCounter | Defined$ Targeted | CounterType$ P1P1 | CounterNum$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_tiller.jpg diff --git a/forge-gui/res/cardsfolder/s/spike_weaver.txt b/forge-gui/res/cardsfolder/s/spike_weaver.txt index 38a2cea77c9..f2e5da05879 100644 --- a/forge-gui/res/cardsfolder/s/spike_weaver.txt +++ b/forge-gui/res/cardsfolder/s/spike_weaver.txt @@ -3,7 +3,7 @@ ManaCost:2 G G Types:Creature Spike PT:0/0 K:etbCounter:P1P1:3 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike.ExtraEff | SpellDescription$ Put a +1/+1 counter on target creature. +A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounter.IsCounterUser | SpellDescription$ Put a +1/+1 counter on target creature. A:AB$ Fog | Cost$ 1 SubCounter<1/P1P1> | AILogic$ SeriousDamage | SpellDescription$ Prevent all combat damage that would be dealt this turn. SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_weaver.jpg Oracle:Spike Weaver enters the battlefield with three +1/+1 counters on it.\n{2}, Remove a +1/+1 counter from Spike Weaver: Put a +1/+1 counter on target creature.\n{1}, Remove a +1/+1 counter from Spike Weaver: Prevent all combat damage that would be dealt this turn. diff --git a/forge-gui/res/cardsfolder/s/spike_worker.txt b/forge-gui/res/cardsfolder/s/spike_worker.txt index 1fba05ca944..6ea8143405a 100644 --- a/forge-gui/res/cardsfolder/s/spike_worker.txt +++ b/forge-gui/res/cardsfolder/s/spike_worker.txt @@ -3,6 +3,6 @@ ManaCost:2 G Types:Creature Spike PT:0/0 K:etbCounter:P1P1:2 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounterSpike | SpellDescription$ Put a +1/+1 counter on target creature. +A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounter | SpellDescription$ Put a +1/+1 counter on target creature. SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_worker.jpg Oracle:Spike Worker enters the battlefield with two +1/+1 counters on it.\n{2}, Remove a +1/+1 counter from Spike Worker: Put a +1/+1 counter on target creature. From e8ebfebaca76a2dde186d1db770d9092f03eccaa Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 6 Dec 2018 07:44:01 +0300 Subject: [PATCH 381/901] - Unbreak the MoveCounter logic. --- forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java index 161b16466ba..0c72c7d61de 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -282,8 +282,8 @@ public class CountersPutAi extends SpellAbilityAi { if (!source.canTransform()) { return false; } - } else if (logic.startsWith("MoveCounterSpike")) { - return doMoveCounterSpikeLogic(ai, sa, ph); + } else if (logic.startsWith("MoveCounter")) { + return doMoveCounterLogic(ai, sa, ph); } if (sa.getConditions() != null && !sa.getConditions().areMet(sa) && sa.getSubAbility() == null) { @@ -1005,7 +1005,7 @@ public class CountersPutAi extends SpellAbilityAi { return Iterables.getFirst(options, null); } - private boolean doMoveCounterSpikeLogic(Player ai, SpellAbility sa, PhaseHandler ph) { + private boolean doMoveCounterLogic(Player ai, SpellAbility sa, PhaseHandler ph) { // Spikes (Tempest) // Try not to do it unless at the end of opponent's turn or the creature is threatened From 7f7a033f12a1fc5c557e467dd2b7317325f07a5c Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 6 Dec 2018 08:03:00 +0300 Subject: [PATCH 382/901] - Support detecting blocking threatened creatures in AILogic$ MoveCounter. --- forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java | 4 ++-- forge-gui/res/cardsfolder/s/salt_road_quartermasters.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java index 0c72c7d61de..e2a6253beb5 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -1012,7 +1012,7 @@ public class CountersPutAi extends SpellAbilityAi { final int creatDiff = sa.getParam("AILogic").contains("IsCounterUser") ? 450 : 1; final Combat combat = ai.getGame().getCombat(); final boolean threatened = ComputerUtil.predictThreatenedObjects(ai, null, true).contains(sa.getHostCard()) - || (combat != null && combat.isBlocked(sa.getHostCard()) && ComputerUtilCombat.attackerWouldBeDestroyed(ai, sa.getHostCard(), combat)); + || (combat != null && ((combat.isBlocked(sa.getHostCard()) && ComputerUtilCombat.attackerWouldBeDestroyed(ai, sa.getHostCard(), combat)) || (combat.isBlocking(sa.getHostCard()) && ComputerUtilCombat.blockerWouldBeDestroyed(ai, sa.getHostCard(), combat)))); if (!(threatened || (ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn() == ai))) { return false; @@ -1024,7 +1024,7 @@ public class CountersPutAi extends SpellAbilityAi { targets = CardLists.filter(targets, new Predicate() { @Override public boolean apply(Card card) { - boolean tgtThreatened = ComputerUtil.predictThreatenedObjects(ai, null, true).contains(card) || (combat != null && combat.isBlocked(card) && ComputerUtilCombat.attackerWouldBeDestroyed(ai, card, combat)); + boolean tgtThreatened = ComputerUtil.predictThreatenedObjects(ai, null, true).contains(card) || (combat != null && ((combat.isBlocked(card) && ComputerUtilCombat.attackerWouldBeDestroyed(ai, card, combat)) || (combat.isBlocking(card) && ComputerUtilCombat.blockerWouldBeDestroyed(ai, card, combat)))); // when threatened, any non-threatened target is good to preserve the counter return !tgtThreatened && (threatened || ComputerUtilCard.evaluateCreature(card, false, false) > ComputerUtilCard.evaluateCreature(sa.getHostCard(), false, false) + creatDiff); } diff --git a/forge-gui/res/cardsfolder/s/salt_road_quartermasters.txt b/forge-gui/res/cardsfolder/s/salt_road_quartermasters.txt index 40e55cc2a1b..d38f6a30e2a 100644 --- a/forge-gui/res/cardsfolder/s/salt_road_quartermasters.txt +++ b/forge-gui/res/cardsfolder/s/salt_road_quartermasters.txt @@ -3,6 +3,6 @@ ManaCost:2 G Types:Creature Human Soldier PT:1/1 K:etbCounter:P1P1:2 -A:AB$ PutCounter | Cost$ 2 G SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. +A:AB$ PutCounter | Cost$ 2 G SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounter | SpellDescription$ Put a +1/+1 counter on target creature. SVar:Picture:http://www.wizards.com/global/images/magic/general/salt_road_quartermasters.jpg Oracle:Salt Road Quartermasters enters the battlefield with two +1/+1 counters on it.\n{2}{G}, Remove a +1/+1 counter from Salt Road Quartermasters: Put a +1/+1 counter on target creature. From 281b56fba349228e6a800be754c14ada640a4e72 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 6 Dec 2018 08:37:10 +0300 Subject: [PATCH 383/901] - AI shouldn't move the counters if it can trade with the opposing creature, otherwise it'll lose material. --- .../java/forge/ai/ComputerUtilCombat.java | 24 +++++++++++++++++++ .../java/forge/ai/ability/CountersPutAi.java | 11 ++++++--- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java index a6f3475e5f9..9fbd2ab58bc 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java @@ -2665,6 +2665,30 @@ public class ComputerUtilCombat { return attackerAfterTrigs; } + + public static boolean willKillAtLeastOne(final Player ai, final Card c, final Combat combat) { + // This method detects if the attacking or blocking group the card "c" belongs to will kill + // at least one creature it's in combat with (either profitably or as a trade), + if (combat == null) { + return false; + } + + if (combat.isBlocked(c)) { + for (Card blk : combat.getBlockers(c)) { + if (ComputerUtilCombat.blockerWouldBeDestroyed(ai, blk, combat)) { + return true; + } + } + } else if (combat.isBlocking(c)) { + for (Card atk : combat.getAttackersBlockedBy(c)) { + if (ComputerUtilCombat.attackerWouldBeDestroyed(ai, atk, combat)) { + return true; + } + } + } + + return false; + } } diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java index e2a6253beb5..35047d3ba4e 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -1011,8 +1011,11 @@ public class CountersPutAi extends SpellAbilityAi { // Try not to do it unless at the end of opponent's turn or the creature is threatened final int creatDiff = sa.getParam("AILogic").contains("IsCounterUser") ? 450 : 1; final Combat combat = ai.getGame().getCombat(); - final boolean threatened = ComputerUtil.predictThreatenedObjects(ai, null, true).contains(sa.getHostCard()) - || (combat != null && ((combat.isBlocked(sa.getHostCard()) && ComputerUtilCombat.attackerWouldBeDestroyed(ai, sa.getHostCard(), combat)) || (combat.isBlocking(sa.getHostCard()) && ComputerUtilCombat.blockerWouldBeDestroyed(ai, sa.getHostCard(), combat)))); + final Card source = sa.getHostCard(); + + final boolean threatened = ComputerUtil.predictThreatenedObjects(ai, null, true).contains(source) + || (combat != null && (((combat.isBlocked(source) && ComputerUtilCombat.attackerWouldBeDestroyed(ai, source, combat)) && !ComputerUtilCombat.willKillAtLeastOne(ai, source, combat)) + || (combat.isBlocking(source) && ComputerUtilCombat.blockerWouldBeDestroyed(ai, source, combat) && !ComputerUtilCombat.willKillAtLeastOne(ai, source, combat)))); if (!(threatened || (ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn() == ai))) { return false; @@ -1024,7 +1027,9 @@ public class CountersPutAi extends SpellAbilityAi { targets = CardLists.filter(targets, new Predicate() { @Override public boolean apply(Card card) { - boolean tgtThreatened = ComputerUtil.predictThreatenedObjects(ai, null, true).contains(card) || (combat != null && ((combat.isBlocked(card) && ComputerUtilCombat.attackerWouldBeDestroyed(ai, card, combat)) || (combat.isBlocking(card) && ComputerUtilCombat.blockerWouldBeDestroyed(ai, card, combat)))); + boolean tgtThreatened = ComputerUtil.predictThreatenedObjects(ai, null, true).contains(card) + || (combat != null && ((combat.isBlocked(card) && ComputerUtilCombat.attackerWouldBeDestroyed(ai, card, combat)) + || (combat.isBlocking(card) && ComputerUtilCombat.blockerWouldBeDestroyed(ai, card, combat)))); // when threatened, any non-threatened target is good to preserve the counter return !tgtThreatened && (threatened || ComputerUtilCard.evaluateCreature(card, false, false) > ComputerUtilCard.evaluateCreature(sa.getHostCard(), false, false) + creatDiff); } From 879084bec29411467ffdb09f71bb19ef15a19a7f Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 6 Dec 2018 08:39:45 +0300 Subject: [PATCH 384/901] - Replace sa.getHostCard() with source --- forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java index 35047d3ba4e..a2a7cff05f9 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -1022,7 +1022,7 @@ public class CountersPutAi extends SpellAbilityAi { } CardCollection targets = CardLists.getTargetableCards(ai.getCreaturesInPlay(), sa); - targets.remove(sa.getHostCard()); + targets.remove(source); targets = CardLists.filter(targets, new Predicate() { @Override @@ -1031,7 +1031,7 @@ public class CountersPutAi extends SpellAbilityAi { || (combat != null && ((combat.isBlocked(card) && ComputerUtilCombat.attackerWouldBeDestroyed(ai, card, combat)) || (combat.isBlocking(card) && ComputerUtilCombat.blockerWouldBeDestroyed(ai, card, combat)))); // when threatened, any non-threatened target is good to preserve the counter - return !tgtThreatened && (threatened || ComputerUtilCard.evaluateCreature(card, false, false) > ComputerUtilCard.evaluateCreature(sa.getHostCard(), false, false) + creatDiff); + return !tgtThreatened && (threatened || ComputerUtilCard.evaluateCreature(card, false, false) > ComputerUtilCard.evaluateCreature(source, false, false) + creatDiff); } }); From d867af4b45d67bd176a4c60dda090a4583bd01c6 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 6 Dec 2018 09:57:13 +0300 Subject: [PATCH 385/901] - Added an Aether filter to Planar Conquest which allows to search for cards playable in colorless decks (useful for colorless commanders). --- forge-gui/src/main/java/forge/planarconquest/ConquestUtil.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestUtil.java b/forge-gui/src/main/java/forge/planarconquest/ConquestUtil.java index 0d309ff71f8..8a2256eb8c8 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestUtil.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestUtil.java @@ -207,6 +207,7 @@ public class ConquestUtil { } public static enum AEtherFilter implements IHasSkinProp { + C (null, new ColorFilter(MagicColor.COLORLESS), "Playable in {C}"), W (null, new ColorFilter(MagicColor.WHITE), "Playable in {W}"), U (null, new ColorFilter(MagicColor.BLUE), "Playable in {U}"), B (null, new ColorFilter(MagicColor.BLACK), "Playable in {B}"), @@ -351,6 +352,7 @@ public class ConquestUtil { } public static final AEtherFilter[] COLOR_FILTERS = new AEtherFilter[] { + AEtherFilter.C, AEtherFilter.W, AEtherFilter.U, AEtherFilter.B, From fb5a20a5beb604b1daebd11188cb9a07fe8a8206 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 6 Dec 2018 10:20:51 +0300 Subject: [PATCH 386/901] - Added puzzle PS_GRN9. --- forge-gui/release-files/CHANGES.txt | 3 +++ forge-gui/res/puzzle/PS_GRN9.pzl | 16 ++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 forge-gui/res/puzzle/PS_GRN9.pzl diff --git a/forge-gui/release-files/CHANGES.txt b/forge-gui/release-files/CHANGES.txt index 1e10f593eaa..9e0b6a6e88a 100644 --- a/forge-gui/release-files/CHANGES.txt +++ b/forge-gui/release-files/CHANGES.txt @@ -12,6 +12,9 @@ Kamigawa is a plane consisting of 45 events and containing the cards from Champi ** Other changes ** In addition to that, several other planes were tweaked. In particular, Theros, Alara and Ravnica feature random Planechase matches replacing random non-variant matches. Ravnica has been updated to feature several new events featuring Guilds of Ravnica cards, and some old events on this plane were also updated with the new cards as well. Guilds of Ravnica has been fully enabled on this plane, so you can grab the relevant cards in The Aether or from randomly won booster packs. Also, Theros has been tweaked not to start with a hard non-singleton non-variant duel, as well as to allow to ignore non-singleton duels (walk around them) if need be. +- Possibility Storm Puzzles - +For all of you puzzle mode fans, the complete Guilds of Ravnica season of Possibility Storm puzzles is now implemented in Forge. + - AI Improvements - A new round of AI improvements went into the game, hopefully making the game a little more interesting and exciting to play. In particular, certain improvements regarding Flash were implemented, the AI is now able to use cards which reorder the top of the library, such as Ponder or Portent, as well as cards which copy spells and/or activated abilities, such as Twincast or Fork. Some other cards were improved for the AI and some were marked as AI playable. On top of that, several logic-related bugs were fixed. Also, the AI has been optimized a little, hopefully making it a bit faster, especially on mobile platforms, in situations where there are a lot of cards on the battlefield but the AI has little or nothing to do. diff --git a/forge-gui/res/puzzle/PS_GRN9.pzl b/forge-gui/res/puzzle/PS_GRN9.pzl new file mode 100644 index 00000000000..3f3d303047f --- /dev/null +++ b/forge-gui/res/puzzle/PS_GRN9.pzl @@ -0,0 +1,16 @@ +[metadata] +Name:Possibility Storm - Guilds of Ravnica #09 +URL:http://www.possibilitystorm.com/091-guilds-of-ravnica-season-puzzle-9/ +Goal:Win +Turns:1 +Difficulty:Mythic +Description:Win this turn. Assume your opponent has no mana available. +[state] +humanlife=20 +ailife=12 +turn=1 +activeplayer=human +activephase=MAIN1 +humanhand=Plummet;Torgaar, Famine Incarnate;Quasiduplicate;Doublecast;Undercity Uprising;Waterknot +humanbattlefield=Thousand-Year Storm;Adeliz, the Cinder Wind|Id:13;Maniacal Rage|AttachedTo:13;Atzocan Archer;Primal Amulet;Submerged Boneyard;Submerged Boneyard;Submerged Boneyard;Submerged Boneyard;Highland Lake;Highland Lake;Highland Lake;Highland Lake;Timber Gorge;Timber Gorge;Timber Gorge;Timber Gorge +aibattlefield=t:Angel,P:4,T:4,Cost:no cost,Color:W,Types:Creature-Angel,Keywords:Flying-Hexproof-Lifelink-Vigilance,Image:w_4_4_angel_flying_vigilance_grn;t:Angel,P:4,T:4,Cost:no cost,Color:W,Types:Creature-Angel,Keywords:Flying-Hexproof-Lifelink-Vigilance,Image:w_4_4_angel_flying_vigilance_grn;t:Angel,P:4,T:4,Cost:no cost,Color:W,Types:Creature-Angel,Keywords:Flying-Hexproof-Lifelink-Vigilance,Image:w_4_4_angel_flying_vigilance_grn;Kopala, Warden of Waves;Merfolk Mistbinder;Merfolk Mistbinder|Counters:P1P1=1;Lyra Dawnbringer;Shalai, Voice of Plenty From e23790fd90f5170120fe1e3092e0f7208f2de6a7 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 5 Dec 2018 18:20:56 +0300 Subject: [PATCH 387/901] - Attempting to fix Venerated Loxodon not giving counters to creatures that helped convoke it. --- forge-game/src/main/java/forge/game/cost/CostAdjustment.java | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java index c0f0216ead4..e9d96f08468 100644 --- a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java +++ b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java @@ -237,7 +237,6 @@ public class CostAdjustment { } } if (sa.getHostCard().hasKeyword(Keyword.CONVOKE)) { - sa.getHostCard().clearConvoked(); adjustCostByConvokeOrImprovise(cost, sa, false, test); } if (sa.getHostCard().hasKeyword(Keyword.IMPROVISE)) { From 9cbada32aad67f4461a023de6742a32d1c6dbd2b Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 5 Dec 2018 20:28:50 +0300 Subject: [PATCH 388/901] - --- forge-ai/src/main/java/forge/ai/SpellAbilityAi.java | 2 +- forge-game/src/main/java/forge/game/cost/CostAdjustment.java | 4 +--- forge-gui/res/cardsfolder/v/venerated_loxodon.txt | 2 +- forge-gui/src/main/java/forge/player/HumanPlay.java | 2 ++ 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java b/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java index 4f08eb0e0e0..928cdb3b384 100644 --- a/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java +++ b/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java @@ -176,7 +176,7 @@ public abstract class SpellAbilityAi { public final boolean doTriggerNoCostWithSubs(final Player aiPlayer, final SpellAbility sa, final boolean mandatory) { - if (!doTriggerAINoCost(aiPlayer, sa, mandatory)) { + if (!doTriggerAINoCost(aiPlayer, sa, mandatory) && !"Always".equals(sa.getParam("AILogic"))) { return false; } final AbilitySub subAb = sa.getSubAbility(); diff --git a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java index e9d96f08468..ff5291f94d3 100644 --- a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java +++ b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java @@ -262,10 +262,9 @@ public class CostAdjustment { Map convokedCards = sa.getActivatingPlayer().getController().chooseCardsForConvokeOrImprovise(sa, cost.toManaCost(), untappedCards, improvise); // Convoked creats are tapped here with triggers suppressed, - // Then again when payment is done(In InputPayManaCost.done()) with suppression cleared. + // Then again when payment is done(In InputPayManaCost.done()) with suppression of Taps triggers. // This is to make sure that triggers go off at the right time // AND that you can't use mana tapabilities of convoked creatures to pay the convoked cost. - sa.getActivatingPlayer().getGame().getTriggerHandler().suppressMode(TriggerType.Taps); for (final Entry conv : convokedCards.entrySet()) { sa.addTappedForConvoke(conv.getKey()); cost.decreaseShard(conv.getValue(), 1); @@ -276,7 +275,6 @@ public class CostAdjustment { } } } - sa.getActivatingPlayer().getGame().getTriggerHandler().clearSuppression(TriggerType.Taps); } private static void adjustCostByOffering(final ManaCostBeingPaid cost, final SpellAbility sa) { diff --git a/forge-gui/res/cardsfolder/v/venerated_loxodon.txt b/forge-gui/res/cardsfolder/v/venerated_loxodon.txt index 09f861fd655..0c3e6b477cf 100644 --- a/forge-gui/res/cardsfolder/v/venerated_loxodon.txt +++ b/forge-gui/res/cardsfolder/v/venerated_loxodon.txt @@ -4,6 +4,6 @@ Types:Creature Elephant Cleric PT:4/4 K:Convoke T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPutCounterAll | TriggerDescription$ When CARDNAME enters the battlefield, put a +1/+1 counter on each creature that convoked it. -SVar:TrigPutCounterAll:DB$ PutCounterAll | ValidCards$ Creature.convoked | CounterType$ P1P1 | CounterNum$ 1 +SVar:TrigPutCounterAll:DB$ PutCounterAll | ValidCards$ Creature.convoked | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ Always DeckHas:Ability$Counters Oracle:Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of the creature's color.)\nWhen Venerated Loxodon enters the battlefield, put a +1/+1 counter on each creature that convoked it. diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index 8e7b84f42e3..cd5ab73816e 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -903,10 +903,12 @@ public class HumanPlay { } } if (ability.getTappedForConvoke() != null) { + activator.getGame().getTriggerHandler().suppressMode(TriggerType.Taps); for (final Card c : ability.getTappedForConvoke()) { c.setTapped(false); c.tap(); } + activator.getGame().getTriggerHandler().clearSuppression(TriggerType.Taps); ability.clearTappedForConvoke(); } return handleOfferingConvokeAndDelve(ability, cardsToDelve, false); From 74c7dd030539bdac41ba9d71e0feae1963cb3600 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 6 Dec 2018 17:28:13 +0300 Subject: [PATCH 389/901] - Tweaked the comment. --- forge-game/src/main/java/forge/game/cost/CostAdjustment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java index ff5291f94d3..a76e47054e7 100644 --- a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java +++ b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java @@ -261,7 +261,7 @@ public class CostAdjustment { Map convokedCards = sa.getActivatingPlayer().getController().chooseCardsForConvokeOrImprovise(sa, cost.toManaCost(), untappedCards, improvise); - // Convoked creats are tapped here with triggers suppressed, + // Convoked creats are tapped here, setting up their taps triggers, // Then again when payment is done(In InputPayManaCost.done()) with suppression of Taps triggers. // This is to make sure that triggers go off at the right time // AND that you can't use mana tapabilities of convoked creatures to pay the convoked cost. From c8fc73e471c7578a89512ee4f08822f23dbd2221 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 6 Dec 2018 20:11:18 +0300 Subject: [PATCH 390/901] - Adding booster definition to Ultimate Masters, enabling it for drafting. --- forge-gui/res/blockdata/blocks.txt | 3 ++- forge-gui/res/blockdata/boosterboxes.txt | 3 ++- forge-gui/res/editions/Ultimate Masters.txt | 7 +++++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/blockdata/blocks.txt b/forge-gui/res/blockdata/blocks.txt index 88653e50acb..b711675ec89 100644 --- a/forge-gui/res/blockdata/blocks.txt +++ b/forge-gui/res/blockdata/blocks.txt @@ -76,4 +76,5 @@ Iconic Masters, 3/6/XLN, IMA Masters 25, 3/6/XLN, A25 Dominaria, 3/6/DOM, DOM Core Set 2019, 3/6/M19, M19 -Guilds of Ravnica, 3/6/GRN, GRN \ No newline at end of file +Guilds of Ravnica, 3/6/GRN, GRN +Ultimate Masters, 3/6/M19, UMA diff --git a/forge-gui/res/blockdata/boosterboxes.txt b/forge-gui/res/blockdata/boosterboxes.txt index 2762a984941..2dd96e386da 100644 --- a/forge-gui/res/blockdata/boosterboxes.txt +++ b/forge-gui/res/blockdata/boosterboxes.txt @@ -103,4 +103,5 @@ A25: 24 Boosters DOM: 36 Boosters BBD: 36 Boosters M19: 36 Boosters -GRN: 36 Boosters \ No newline at end of file +GRN: 36 Boosters +UMA: 24 Boosters diff --git a/forge-gui/res/editions/Ultimate Masters.txt b/forge-gui/res/editions/Ultimate Masters.txt index e879d81eed9..b8b20cf122a 100644 --- a/forge-gui/res/editions/Ultimate Masters.txt +++ b/forge-gui/res/editions/Ultimate Masters.txt @@ -4,7 +4,10 @@ Date=2018-12-07 Name=Ultimate Masters Code2=UMA MciCode=uma -Type=Other +Type=Reprint +BoosterCovers=3 +Booster=11 Common, 3 Uncommon, 1 RareMythic +FoilChanceInBooster=100 [cards] 1 R All Is Dust @@ -260,4 +263,4 @@ Type=Other 251 R Stirring Wildwood 252 C Terramorphic Expanse 253 R Thespian's Stage -254 R Urborg, Tomb of Yawgmoth \ No newline at end of file +254 R Urborg, Tomb of Yawgmoth From 6b7088e04c4cf4a40d0b75abc6f76a3b33ece409 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 6 Dec 2018 20:11:40 +0300 Subject: [PATCH 391/901] - Added AI spec to Skilled Animator. --- forge-gui/res/cardsfolder/s/skilled_animator.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/res/cardsfolder/s/skilled_animator.txt b/forge-gui/res/cardsfolder/s/skilled_animator.txt index 5df7e80f373..b96090f7e67 100644 --- a/forge-gui/res/cardsfolder/s/skilled_animator.txt +++ b/forge-gui/res/cardsfolder/s/skilled_animator.txt @@ -3,5 +3,6 @@ ManaCost:2 U Types:Creature Human Artificer T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigAnimate | TriggerDescription$ When CARDNAME enters the battlefield, target artifact you control becomes an artifact creature with base power and toughness 5/5 for as long as CARDNAME remains on the battlefield. SVar:TrigAnimate:DB$ Animate | ValidTgts$ Artifact.YouCtrl | TgtPrompt$ Select target artifact you control | Power$ 5 | Toughness$ 5 | Types$ Artifact,Creature | UntilHostLeavesPlay$ True +SVar:PlayMain1:TRUE Oracle:When Skilled Animator enters the battlefield, target artifact you control becomes an artifact creature with base power and toughness 5/5 for as long as Skilled Animator remains on the battlefield. PT:1/3 \ No newline at end of file From 788dfbcb384c3b04a0abcb6e4dea7b2ad40d66c9 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 6 Dec 2018 20:48:26 +0300 Subject: [PATCH 392/901] - Fix deck descriptions. --- forge-gui/res/quest/world/Tempest/duels/CloudSpirit2.dck | 2 +- forge-gui/res/quest/world/Tempest/duels/Furnace4.dck | 2 +- forge-gui/res/quest/world/Tempest/duels/Rage.dck | 2 +- forge-gui/res/quest/world/Tempest/duels/Rage2.dck | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/forge-gui/res/quest/world/Tempest/duels/CloudSpirit2.dck b/forge-gui/res/quest/world/Tempest/duels/CloudSpirit2.dck index 26734c438f1..be472af1496 100644 --- a/forge-gui/res/quest/world/Tempest/duels/CloudSpirit2.dck +++ b/forge-gui/res/quest/world/Tempest/duels/CloudSpirit2.dck @@ -3,7 +3,7 @@ Title=Cloud Spirit Icon=Dungeon Crawling Blue.jpg Difficulty=medium -Description=Mono blue arrgo +Description=Mono blue aggro Name=CloudSpirit2 [Main] 4 Cloud Spirit|STH diff --git a/forge-gui/res/quest/world/Tempest/duels/Furnace4.dck b/forge-gui/res/quest/world/Tempest/duels/Furnace4.dck index 1e037d710fc..bfe9f400a98 100644 --- a/forge-gui/res/quest/world/Tempest/duels/Furnace4.dck +++ b/forge-gui/res/quest/world/Tempest/duels/Furnace4.dck @@ -3,7 +3,7 @@ Title=Furnace Icon=Dungeon Crawling Red.jpg Difficulty=very hard -Description=Red aggo deck with goblins, furnace, burn spells. +Description=Red aggro deck with goblins, furnace, burn spells. Deck Type=constructed Profile=Reckless Name=Furnace4 diff --git a/forge-gui/res/quest/world/Tempest/duels/Rage.dck b/forge-gui/res/quest/world/Tempest/duels/Rage.dck index d15e5f2119a..d02be7ba0d2 100644 --- a/forge-gui/res/quest/world/Tempest/duels/Rage.dck +++ b/forge-gui/res/quest/world/Tempest/duels/Rage.dck @@ -3,7 +3,7 @@ Title=Rage of the Mountains Icon=Dungeon Crawling Red.jpg Difficulty=easy -Description=Red creature based aggo deck +Description=Red creature based aggro deck Deck Type=constructed Name=Rage [Main] diff --git a/forge-gui/res/quest/world/Tempest/duels/Rage2.dck b/forge-gui/res/quest/world/Tempest/duels/Rage2.dck index 449b5186c11..3d64d17ca04 100644 --- a/forge-gui/res/quest/world/Tempest/duels/Rage2.dck +++ b/forge-gui/res/quest/world/Tempest/duels/Rage2.dck @@ -4,7 +4,7 @@ Profile=Reckless Title=Rage of the Mountains Icon=Dungeon Crawling Red.jpg Difficulty=medium -Description=Red creature based aggo deck +Description=Red creature based aggro deck Deck Type=constructed Name=Rage2 [Main] @@ -23,4 +23,4 @@ Name=Rage2 4 Rathi Dragon|TMP 4 Wasteland|TMP 4 Cursed Scroll|TMP -4 Kindle|TMP \ No newline at end of file +4 Kindle|TMP From 463cc7675ada713f6e71cde7a7a3d4418091bf10 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 6 Dec 2018 20:53:54 +0300 Subject: [PATCH 393/901] - Updating CHANGES.txt. --- forge-gui/release-files/CHANGES.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/forge-gui/release-files/CHANGES.txt b/forge-gui/release-files/CHANGES.txt index 9e0b6a6e88a..fabaab118a7 100644 --- a/forge-gui/release-files/CHANGES.txt +++ b/forge-gui/release-files/CHANGES.txt @@ -12,6 +12,9 @@ Kamigawa is a plane consisting of 45 events and containing the cards from Champi ** Other changes ** In addition to that, several other planes were tweaked. In particular, Theros, Alara and Ravnica feature random Planechase matches replacing random non-variant matches. Ravnica has been updated to feature several new events featuring Guilds of Ravnica cards, and some old events on this plane were also updated with the new cards as well. Guilds of Ravnica has been fully enabled on this plane, so you can grab the relevant cards in The Aether or from randomly won booster packs. Also, Theros has been tweaked not to start with a hard non-singleton non-variant duel, as well as to allow to ignore non-singleton duels (walk around them) if need be. +- New Quest World: Tempest - +This release features a new quest world based on the Tempest block. This quest world was submitted by Seravy, it has now been fully tested and the AI support for the cards has reached the level where the duels in this world can be enjoyed as interesting, unusual, and challenging. This world contains 41 duels and 12 challenges. If you would like to revisit the older Magic experience, this may be just the quest world for you to try out. + - Possibility Storm Puzzles - For all of you puzzle mode fans, the complete Guilds of Ravnica season of Possibility Storm puzzles is now implemented in Forge. From 718732c7f077fdf40254958765ba2f29aed0e932 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 6 Dec 2018 21:00:08 +0300 Subject: [PATCH 394/901] - Updating CHANGES.TXT: Ultimate Masters. --- forge-gui/release-files/CHANGES.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/forge-gui/release-files/CHANGES.txt b/forge-gui/release-files/CHANGES.txt index fabaab118a7..fa902c77d07 100644 --- a/forge-gui/release-files/CHANGES.txt +++ b/forge-gui/release-files/CHANGES.txt @@ -1,3 +1,6 @@ +- Ultimate Masters - +This release fully supports Ultimate Masters, you can draft this brand new set in Booster Draft mode. Booster box toppers are not yet supported as a separate sealed product (the options for supporting them are currently being discussed), but otherwise the set is fully playable. + - Planar Conquest 25th MTG Anniversary / Christmas 2018 Update - A rather serious and massive content update has happened in Planar Conquest. There are two new planes available, Dominaria and Kamigawa. (Please note that Planar Conquest is currently only available on Android and in the mobile backport.) From ea34b4dd7bbb99e288c9268cd4da03e57d691e7e Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 6 Dec 2018 22:19:14 +0300 Subject: [PATCH 395/901] - Added MTGO Core Cube 2018 submitted by dolphi5. --- .../cube/MTGO Core Cube 2018 (540 cards).dck | 543 ++++++++++++++++++ .../MTGO Core Cube 2018 (540 cards).draft | 6 + 2 files changed, 549 insertions(+) create mode 100644 forge-gui/res/cube/MTGO Core Cube 2018 (540 cards).dck create mode 100644 forge-gui/res/draft/MTGO Core Cube 2018 (540 cards).draft diff --git a/forge-gui/res/cube/MTGO Core Cube 2018 (540 cards).dck b/forge-gui/res/cube/MTGO Core Cube 2018 (540 cards).dck new file mode 100644 index 00000000000..0ce41cd58cc --- /dev/null +++ b/forge-gui/res/cube/MTGO Core Cube 2018 (540 cards).dck @@ -0,0 +1,543 @@ +[metadata] +Name=MTGO Core Cube 2018 (540 cards) +[main] +1 Abbot of Keral Keep|ORI +1 Acidic Slime|M13 +1 Adaptive Automaton|M12 +1 Adarkar Wastes|10E +1 Aether Adept|M12 +1 Aetherspouts|M15 +1 Ajani Goldmane|M11 +1 Ajani Steadfast|M15 +1 Ajani's Chosen|M14 +1 Ajani, Adversary of Tyrants|M19 +1 Ajani, Caller of the Pride|M14 +1 Alchemist's Vial|ORI +1 Alhammarret's Archive|ORI +1 Ambassador Laquatus|10E +1 Angelic Accord|IMA +1 Angelic Destiny|M12 +1 Ant Queen|MM2 +1 Arachnus Web|MM3 +1 Arbor Elf|A25 +1 Archaeomancer|M14 +1 Archangel of Thune|IMA +1 Archangel of Tithes|ORI +1 Armored Ascension|M11 +1 Arms Dealer|M13 +1 Assassinate|M11 +1 Attended Knight|MM3 +1 Augur of Bolas|MM3 +1 Augury Owl|M11 +1 Auramancer|A25 +1 Avaricious Dragon|ORI +1 Aviation Pioneer|M19 +1 Baneslayer Angel|M11 +1 Banisher Priest|M14 +1 Battlefield Forge|ORI +1 Beacon of Destruction|10E +1 Beacon of Immortality|10E +1 Beacon of Unrest|10E +1 Birds of Paradise|M12 +1 Black Cat|M15 +1 Blackmail|9ED +1 Blanchwood Armor|M19 +1 Blessed Spirits|ORI +1 Blinding Angel|9ED +1 Blood Seeker|M12 +1 Bloodfire Colossus|10E +1 Bloodthrone Vampire|MM2 +1 Bogardan Hellkite|IMA +1 Bone Dragon|M19 +1 Boomerang|10E +1 Borderland Marauder|IMA +1 Bottle Gnomes|10E +1 Bramblecrush|M14 +1 Brave the Elements|M14 +1 Bribery|8ED +1 Brittle Effigy|M11 +1 Brushland|10E +1 Buried Ruin|M12 +1 Call to Mind|M11 +1 Captain of the Watch|M13 +1 Captain's Call|M13 +1 Catalog|SOI +1 Caustic Caterpillar|ORI +1 Caves of Koilos|ORI +1 Celestial Flare|ORI +1 Chandra Nalaar|M11 +1 Chandra's Phoenix|M14 +1 Chandra, Fire of Kaladesh|ORI +1 Chandra, Pyromaster|M15 +1 Chandra, the Firebrand|M13 +1 Charcoal Diamond|7ED +1 Chasm Skulker|M15 +1 Chastise|9ED +1 Chief Engineer|M15 +1 Chord of Calling|M15 +1 Chromatic Star|10E +1 City of Brass|MMA +1 Claustrophobia|IMA +1 Cleansing Nova|M19 +1 Clone|M14 +1 Coat of Arms|M10 +1 Concentrate|8ED +1 Conclave Naturalists|ORI +1 Condemn|M11 +1 Cone of Flame|M15 +1 Confiscate|9ED +1 Consul's Lieutenant|ORI +1 Consume Spirit|M12 +1 Corrupt|M14 +1 Counterspell|SS1 +1 Covenant of Blood|M15 +1 Cruel Edict|10E +1 Crusader of Odric|M13 +1 Crypt Rats|7ED +1 Cultivate|A25 +1 Daring Apprentice|9ED +1 Dark-Dweller Oracle|M19 +1 Darksteel Citadel|MM2 +1 Darksteel Colossus|M10 +1 Darksteel Ingot|M14 +1 Day of Judgment|M12 +1 Deadly Recluse|M14 +1 Demon of Catastrophes|M19 +1 Demon of Death's Gate|M11 +1 Demonic Pact|ORI +1 Destructive Force|M11 +1 Devouring Light|M15 +1 Disciple of Bolas|M13 +1 Disciple of the Ring|ORI +1 Disenchant|A25 +1 Disperse|M19 +1 Displacement Wave|ORI +1 Dissipate|M15 +1 Divination|M19 +1 Doom Blade|IMA +1 Doomed Dissenter|M19 +1 Doomed Necromancer|10E +1 Door to Nothingness|M13 +1 Dragon Egg|M19 +1 Dragon Fodder|MM3 +1 Dragonskull Summit|XLN +1 Drowned Catacomb|XLN +1 Druid of the Cowl|M19 +1 Druidic Satchel|M12 +1 Duress|M19 +1 Dwynen's Elite|ORI +1 Dwynen, Gilt-Leaf Daen|ORI +1 Earthquake|M10 +1 Elite Arcanist|M14 +1 Elite Vanguard|EMA +1 Elixir of Immortality|M14 +1 Elvish Archdruid|M13 +1 Elvish Champion|10E +1 Elvish Mystic|M15 +1 Elvish Piper|A25 +1 Elvish Rejuvenator|M19 +1 Elvish Visionary|ORI +1 Ember Hauler|M11 +1 Encrust|M15 +1 Enigma Drake|M19 +1 Ensoul Artifact|M15 +1 Enthralling Victor|A25 +1 Equilibrium|7ED +1 Essence Scatter|M19 +1 Eternal Thirst|IMA +1 Evacuation|10E +1 Evolutionary Leap|ORI +1 Evolving Wilds|RIX +1 Exclusion Mage|M19 +1 Exquisite Firecraft|ORI +1 Faerie Conclave|10E +1 Fallen Angel|A25 +1 Farseek|M13 +1 Fauna Shaman|M11 +1 Fell Specter|M19 +1 Fellwar Stone|9ED +1 Fertile Ground|LRW +1 Festering Goblin|MMA +1 Fiendslayer Paladin|M14 +1 Fiery Conclusion|ORI +1 Fiery Impulse|ORI +1 Fire Diamond|7ED +1 Fireball|IMA +1 First Response|M15 +1 Flames of the Firebrand|M14 +1 Fleshbag Marauder|ORI +1 Fling|AKH +1 Flinthoof Boar|EMA +1 Force Spike|7ED +1 Forsaken Sanctuary|M19 +1 Fortify|MM2 +1 Foul Orchard|M19 +1 Foundry Street Denizen|M15 +1 Frenzied Goblin|A25 +1 Frost Lynx|IMA +1 Frost Titan|M12 +1 Garruk Wildspeaker|M11 +1 Garruk, Apex Predator|M15 +1 Gather the Pack|ORI +1 Generator Servant|M15 +1 Genesis Hydra|IMA +1 Ghirapur Gearcrafter|ORI +1 Giant Growth|A25 +1 Gideon Jura|M12 +1 Gideon's Lawkeeper|MM3 +1 Gift of Paradise|M19 +1 Gilded Lotus|DOM +1 Glacial Fortress|XLN +1 Gladecover Scout|M14 +1 Glorious Anthem|10E +1 Goblin Arsonist|M13 +1 Goblin Chieftain|M12 +1 Goblin Glory Chaser|ORI +1 Goblin Grenade|M12 +1 Goblin Instigator|M19 +1 Goblin Kaboomist|M15 +1 Goblin King|10E +1 Goblin Matron|7ED +1 Goblin Piledriver|ORI +1 Goblin Rabblemaster|M15 +1 Goblin Shortcutter|M14 +1 Goblin Trashmaster|M19 +1 Grand Abolisher|M12 +1 Grave Pact|10E +1 Grave Titan|M12 +1 Graveblade Marauder|ORI +1 Graveborn Muse|10E +1 Gravedigger|M19 +1 Great Sable Stag|M10 +1 Greater Good|9ED +1 Grim Lavamancer|M12 +1 Guttersnipe|M19 +#1 Harm's Way +1 Hammer of Bogardan|8ED +1 Hangarback Walker|ORI +1 Harbinger of the Tides|ORI +1 Heliod's Pilgrim|M15 +1 Hell's Caretaker|A25 +1 Heroic Reinforcements|M19 +1 Hieromancer's Cage|M19 +1 Highland Lake|M19 +1 Hoarding Dragon|IMA +1 Honor of the Pure|M12 +1 Honored Hierarch|ORI +1 Hornet Nest|M15 +1 Hornet Queen|M15 +1 Hurricane|10E +1 Hushwing Gryff|M15 +1 Hypnotic Specter|M10 +1 Icy Manipulator|DOM +1 Imposing Sovereign|M14 +1 Incinerate|M12 +1 Inferno|8ED +1 Inferno Titan|M12 +1 Intruder Alarm|8ED +1 Invoke the Divine|M19 +1 Isareth the Awakener|M19 +1 Jace Beleren|SS1 +1 Jace's Ingenuity|M15 +1 Jace's Mindseeker|M14 +1 Jace's Sanctum|ORI +1 Jace, the Living Guildpact|M15 +1 Jace, Vryn's Prodigy|ORI +1 Jade Mage|M12 +1 Joiner Adept|10E +1 Kalonian Hydra|M14 +1 Karplusan Forest|10E +1 Kird Ape|EMA +1 Knight of Glory|M13 +1 Knight of Infamy|M13 +1 Knight of the White Orchid|ORI +1 Krenko's Command|M13 +1 Krenko, Mob Boss|M13 +1 Kytheon, Hero of Akros|ORI +1 Languish|ORI +1 Leaf Gilder|ORI +1 Leonin Warleader|M19 +1 Lhurgoyf|8ED +1 Lifebane Zombie|M14 +1 Lightning Bolt|A25 +1 Lightning Strike|M19 +1 Liliana of the Dark Realms|M14 +1 Liliana Vess|M15 +1 Liliana's Contract|M19 +1 Liliana's Specter|M11 +1 Liliana, Heretical Healer|ORI +1 Llanowar Elves|M19 +1 Llanowar Wastes|ORI +1 Loxodon Warhammer|10E +1 Loyal Sentry|A25 +1 Macabre Waltz|M19 +1 Magma Phoenix|M11 +1 Mana Leak|IMA +1 Manalith|M19 +1 Manic Vandal|M12 +1 Marble Diamond|7ED +1 March of the Machines|10E +1 Mark of Mutiny|IMA +1 Mark of the Vampire|XLN +1 Master Decoy|9ED +1 Master of the Wild Hunt|A25 +1 Memory Lapse|EMA +1 Mentor of the Meek|M19 +1 Merfolk Looter|A25 +1 Mesa Enchantress|EMA +1 Might of Oaks|M10 +1 Militia Bugler|M19 +1 Mind Control|M12 +1 Mind Shatter|MM3 +1 Mind Spring|M10 +1 Mind Stone|IMA +1 Mindclaw Shaman|M13 +1 Mindslicer|9ED +1 Mirror Image|M19 +1 Mitotic Slime|M11 +1 Mobilization|10E +1 Mogg Fanatic|EMA +1 Mogg Flunkies|A25 +1 Molten Birth|M14 +1 Mortivore|10E +1 Moss Diamond|7ED +1 Murder|M19 +1 Mutavault|M14 +1 Mutilate|M13 +1 Mystifying Maze|M11 +1 Nantuko Husk|ORI +1 Nantuko Shade|M11 +1 Nature's Spiral|DOM +1 Necromantic Summons|ORI +1 Negate|SS1 +1 Nekrataal|EMA +1 Nexus of Fate|M19 +1 Nicol Bolas, Planeswalker|M13 +1 Nicol Bolas, the Ravager|M19 +1 Nightmare|ORI +1 Nightmare's Thirst|M19 +1 Nissa, Vastwood Seer|ORI +1 Nissa, Worldwaker|M15 +1 Obelisk of Urd|M15 +1 Oblivion Ring|MM2 +1 Obstinate Baloth|IMA +1 Ogre Battledriver|M14 +1 Opportunity|MM3 +1 Oppressive Rays|M15 +1 Ostracize|7ED +1 Overgrowth|10E +1 Overrun|M12 +1 Pacifism|A25 +1 Paragon of New Dawns|M15 +1 Pariah|10E +1 Path of Bravery|IMA +1 Peek|10E +1 Peel from Reality|M15 +1 Pelakka Wurm|M19 +1 Pentavus|M12 +1 Perilous Vault|M15 +1 Phantasmal Image|MM3 +1 Phyrexian Arena|9ED +1 Phyrexian Plaguelord|8ED +1 Phyrexian Rager|IMA +1 Phyrexian Revoker|M15 +1 Pia and Kiran Nalaar|ORI +1 Pithing Needle|RTR +1 Plague Mare|M19 +1 Platinum Angel|M11 +1 Plow Under|8ED +1 Plummet|M19 +1 Polymorph|M10 +1 Ponder|M12 +1 Possessed Skaab|ORI +1 Preordain|M11 +1 Prey Upon|GRN +1 Priest of the Blood Rite|ORI +1 Primeval Bounty|M14 +1 Primeval Titan|IMA +1 Primordial Hydra|M13 +1 Prodigious Growth|M19 +1 Pyroclasm|A25 +1 Pyrotechnics|FRF +1 Quag Sickness|M14 +1 Quicken|M14 +1 Quickling|M15 +1 Quicksilver Amulet|M12 +1 Rabid Bite|M19 +1 Raise Dead|9ED +1 Raise the Alarm|EMA +1 Rampant Growth|MM2 +1 Rancor|A25 +1 Ranger's Guile|M15 +1 Ratchet Bomb|M14 +1 Ravaging Blaze|ORI +1 Ravenous Rats|M13 +1 Read the Bones|ORI +1 Reassembling Skeleton|M19 +1 Reclamation Sage|M19 +1 Relic Seeker|ORI +1 Remorseful Cleric|M19 +1 Remove Soul|10E +1 Reprisal|JOU +1 Resplendent Angel|M19 +1 Returned Centaur|ORI +1 Revenant|ORI +1 Reverberate|M13 +1 Rewind|MM3 +1 Rhox Faithmender|M13 +1 Righteousness|M10 +1 Rise from the Grave|M19 +1 Roaring Primadox|M15 +1 Rootbound Crag|XLN +1 Rukh Egg|9ED +1 Rune-Scarred Demon|IMA +1 Rupture Spire|M19 +1 Safe Passage|M13 +1 Sai, Master Thopterist|M19 +1 Salvager of Secrets|M19 +1 Sands of Delirium|M13 +1 Sanguine Bond|IMA +1 Satyr Enchanter|M19 +1 Satyr Wayfinder|M15 +1 Savannah Lions|A25 +1 Scab-Clan Berserker|ORI +1 Scavenging Ooze|MM3 +1 Sculpting Steel|10E +1 Scuttling Doom Engine|M15 +1 Searing Spear|M13 +1 Seedborn Muse|10E +1 Sentinel of the Eternal Watch|ORI +1 Serra Angel|DOM +1 Serra Ascendant|IMA +1 Serra Avatar|M13 +1 Shadowborn Demon|M14 +1 Shivan Dragon|M19 +1 Shivan Reef|ORI +1 Shock|M19 +1 Shrapnel Blast|M15 +1 Siege-Gang Commander|DOM +1 Sift|M19 +1 Sigil of the Empty Throne|ORI +1 Sign in Blood|MM2 +1 Silklash Spider|M13 +1 Sisay's Ring|7ED +1 Skilled Animator|M19 +1 Skinshifter|M12 +1 Sky Diamond|7ED +1 Skyscanner|M19 +1 Sleep|M19 +1 Sleight of Hand|9ED +1 Smallpox|M12 +1 Smash|10E +1 Smash to Smithereens|ORI +1 Solemn Simulacrum|M12 +1 Sorin Markov|M12 +1 Sorin's Vengeance|M12 +1 Soul of Innistrad|M15 +1 Soul of New Phyrexia|M15 +1 Soul of Ravnica|M15 +1 Soul of Shandalar|M15 +1 Soul of Theros|M15 +1 Soul of Zendikar|M15 +1 Soul Warden|MM3 +1 Soulblade Djinn|ORI +1 Spectra Ward|M15 +1 Spelltwine|M13 +1 Sphinx of Uthuun|IMA +1 Sphinx's Tutelage|ORI +1 Spiketail Hatchling|10E +1 Spirit Link|10E +1 Squee, Goblin Nabob|MMA +1 Stab Wound|M15 +1 Staff of Nin|M13 +1 Stampeding Wildebeests|10E +1 Star Compass|IMA +1 Steel Overseer|M11 +1 Stitcher's Supplier|M19 +1 Stoke the Flames|M15 +1 Stone Quarry|M19 +1 Stormblood Berserker|MM2 +1 Stormtide Leviathan|M15 +1 Strands of Night|7ED +1 Sublime Archangel|M13 +1 Sulfurous Springs|10E +1 Sun Titan|M12 +1 Sunken Hope|10E +1 Sunpetal Grove|XLN +1 Swift Reckoning|ORI +1 Sword of the Animist|ORI +1 Sword of Vengeance|M11 +1 Sylvan Ranger|MM3 +1 Talent of the Telepath|ORI +1 Talons of Wildwood|M19 +1 Talrand's Invocation|M13 +1 Talrand, Sky Summoner|M13 +1 Telling Time|MM2 +1 Temple Bell|M11 +1 Tenacious Dead|M14 +1 Tendrils of Corruption|M10 +1 Terramorphic Expanse|MMA +1 Terror|10E +1 Tezzeret, Artifice Master|M19 +1 Thopter Engineer|ORI +1 Thopter Spy Network|ORI +1 Thorn Lieutenant|M19 +1 Thought Courier|9ED +1 Thragtusk|MM3 +1 Threaten|10E +1 Thud|M19 +1 Thundermaw Hellkite|IMA +1 Tidebinder Mage|M14 +1 Time Stop|10E +1 Time Warp|M10 +1 Timely Reinforcements|M12 +1 Topan Freeblade|IMA +1 Torch Fiend|M15 +1 Tormenting Voice|M19 +1 Touch of Moonglove|ORI +1 Tower Geist|ORI +1 Trading Post|M14 +1 Treetop Bracers|10E +1 Treetop Village|10E +1 Triplicate Spirits|M15 +1 Triskelion|M11 +1 Troll Ascetic|10E +1 True Believer|10E +1 Trumpet Blast|M19 +1 Turn to Frog|ORI +1 Twincast|M10 +1 Typhoid Rats|FRF +1 Ulcerate|IMA +1 Underground River|10E +1 Undergrowth Scavenger|M15 +1 Unsummon|HOU +1 Urborg, Tomb of Yawgmoth|M15 +1 Vampire Nighthawk|MM3 +1 Vengeful Pharaoh|M12 +1 Verdant Haven|M15 +1 Verduran Enchantress|9ED +1 Vernal Bloom|8ED +1 Veteran Swordsmith|M10 +1 Vine Trellis|8ED +1 Viscera Seer|M11 +1 Vivien Reid|M19 +1 Volcanic Hammer|9ED +1 Vryn Wingmare|ORI +1 War Falcon|M13 +1 War Priest of Thune|EMA +1 Warp World|M10 +1 Whirler Rogue|ORI +1 Wild Growth|7ED +1 Wildfire|MM2 +1 Windborn Muse|10E +1 Wood Elves|9ED +1 Woodland Bellower|ORI +1 Woodland Stream|M19 +1 Wrath of God|EMA +1 Xathrid Necromancer|M14 +1 Yavimaya Coast|ORI +1 Yavimaya Enchantress|EMA +1 Yeva, Nature's Herald|M13 +1 Young Pyromancer|EMA +1 Zombie Infestation|M12 +1 Zombify|A25 diff --git a/forge-gui/res/draft/MTGO Core Cube 2018 (540 cards).draft b/forge-gui/res/draft/MTGO Core Cube 2018 (540 cards).draft new file mode 100644 index 00000000000..c3f978d6e86 --- /dev/null +++ b/forge-gui/res/draft/MTGO Core Cube 2018 (540 cards).draft @@ -0,0 +1,6 @@ +Name:MTGO Core Cube (540 cards) +DeckFile:MTGO Core Cube 2018 (540 cards) +Singleton:True + +Booster: 15 Any +NumPacks: 3 From 171c8e8d7f51db729d931d0141459217373a111a Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 7 Dec 2018 10:04:06 +0300 Subject: [PATCH 396/901] - Fixed the AI cheating by tapping a mana source artifact both for mana and for the tap cost when paying the alternate cost for Zahid, Djinn of the Lamp. - Will likely need a more generic solution which would work for other potential similar costs, including the ones which may come from other cards. --- .../main/java/forge/ai/AiCostDecision.java | 28 +++++++++++++++-- .../main/java/forge/ai/ComputerUtilCost.java | 31 +++++++++++++++++++ .../cardsfolder/z/zahid_djinn_of_the_lamp.txt | 1 + 3 files changed, 57 insertions(+), 3 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiCostDecision.java b/forge-ai/src/main/java/forge/ai/AiCostDecision.java index 4c538e5d4d3..c6c16bb2dad 100644 --- a/forge-ai/src/main/java/forge/ai/AiCostDecision.java +++ b/forge-ai/src/main/java/forge/ai/AiCostDecision.java @@ -459,6 +459,10 @@ public class AiCostDecision extends CostDecisionMakerBase { Integer c = cost.convertAmount(); String type = cost.getType(); boolean isVehicle = type.contains("+withTotalPowerGE"); + + CardCollection exclude = new CardCollection(); + exclude.addAll(tapped); + if (c == null) { final String sVar = ability.getSVar(amount); if (sVar.equals("XChoice")) { @@ -482,18 +486,36 @@ public class AiCostDecision extends CostDecisionMakerBase { return null; } + if ("AvoidTappingManaSources".equals(source.getSVar("AIPaymentPreference"))) { + CardCollectionView toExclude = + CardLists.getValidCards(player.getCardsIn(ZoneType.Battlefield), type.split(";"), + ability.getActivatingPlayer(), ability.getHostCard(), ability); + toExclude = CardLists.filter(toExclude, new Predicate() { + @Override + public boolean apply(Card card) { + for (final SpellAbility sa : card.getSpellAbilities()) { + if (sa.isManaAbility() && sa.getPayCosts() != null && sa.getPayCosts().hasTapCost()) { + return true; + } + } + return false; + } + }); + exclude.addAll(toExclude); + } + String totalP = ""; CardCollectionView totap; if (isVehicle) { totalP = type.split("withTotalPowerGE")[1]; type = TextUtil.fastReplace(type, "+withTotalPowerGE", ""); - totap = ComputerUtil.chooseTapTypeAccumulatePower(player, type, ability, !cost.canTapSource, Integer.parseInt(totalP), tapped); + totap = ComputerUtil.chooseTapTypeAccumulatePower(player, type, ability, !cost.canTapSource, Integer.parseInt(totalP), exclude); } else { - totap = ComputerUtil.chooseTapType(player, type, source, !cost.canTapSource, c, tapped); + totap = ComputerUtil.chooseTapType(player, type, source, !cost.canTapSource, c, exclude); } if (totap == null) { -// System.out.println("Couldn't find a valid card(s) to tap for: " + source.getName()); + //System.out.println("Couldn't find a valid card(s) to tap for: " + source.getName()); return null; } tapped.addAll(totap); diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java index aa89e0261e3..97a6442c41f 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java @@ -493,6 +493,7 @@ public class ComputerUtilCost { } } } + // KLD vehicle if (sa.hasParam("Crew")) { // put under checkTapTypeCost? for (final CostPart part : sa.getPayCosts().getCostParts()) { @@ -502,6 +503,36 @@ public class ComputerUtilCost { } } + // TODO: Alternate costs which involve both paying mana and tapping a card, e.g. Zahid, Djinn of the Lamp + // Current AI decides on each part separately, thus making it possible for the AI to cheat by + // tapping a mana source for mana and for the tap cost at the same time. Until this is improved, AI + // will not consider mana sources valid for paying the tap cost to avoid this exact situation. + if ("AvoidTappingManaSources".equals(sa.getHostCard().getSVar("AIPaymentPreference"))) { + for (final CostPart part : sa.getPayCosts().getCostParts()) { + if (part instanceof CostTapType) { + CardCollectionView nonManaSources = + CardLists.getValidCards(player.getCardsIn(ZoneType.Battlefield), part.getType().split(";"), + sa.getActivatingPlayer(), sa.getHostCard(), sa); + nonManaSources = CardLists.filter(nonManaSources, new Predicate() { + @Override + public boolean apply(Card card) { + boolean hasManaSa = false; + for (final SpellAbility sa : card.getSpellAbilities()) { + if (sa.isManaAbility() && sa.getPayCosts() != null && sa.getPayCosts().hasTapCost()) { + hasManaSa = true; + break; + } + } + return !hasManaSa; + } + }); + if (nonManaSources.size() < part.convertAmount()) { + return false; + } + } + } + } + return ComputerUtilMana.canPayManaCost(sa, player, extraManaNeeded) && CostPayment.canPayAdditionalCosts(sa.getPayCosts(), sa); } // canPayCost() diff --git a/forge-gui/res/cardsfolder/z/zahid_djinn_of_the_lamp.txt b/forge-gui/res/cardsfolder/z/zahid_djinn_of_the_lamp.txt index 6d958a04051..526b272f3fd 100644 --- a/forge-gui/res/cardsfolder/z/zahid_djinn_of_the_lamp.txt +++ b/forge-gui/res/cardsfolder/z/zahid_djinn_of_the_lamp.txt @@ -4,4 +4,5 @@ Types:Legendary Creature Djinn PT:5/6 K:Flying SVar:AltCost:Cost$ 3 U tapXType<1/Artifact> | Description$ You may pay {3}{U} and tap an untapped artifact you control rather than pay this spell's mana cost. +SVar:AIPaymentPreference:AvoidTappingManaSources Oracle:You may pay {3}{U} and tap an untapped artifact you control rather than pay this spell's mana cost.\nFlying From 2f35377b8aec3a644333537c7e9b8c2cb306cf71 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 8 Dec 2018 08:25:07 +0300 Subject: [PATCH 397/901] - Better name for the payment preference spec. --- forge-ai/src/main/java/forge/ai/AiCostDecision.java | 2 +- forge-ai/src/main/java/forge/ai/ComputerUtilCost.java | 2 +- forge-gui/res/cardsfolder/z/zahid_djinn_of_the_lamp.txt | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiCostDecision.java b/forge-ai/src/main/java/forge/ai/AiCostDecision.java index c6c16bb2dad..c773211a914 100644 --- a/forge-ai/src/main/java/forge/ai/AiCostDecision.java +++ b/forge-ai/src/main/java/forge/ai/AiCostDecision.java @@ -486,7 +486,7 @@ public class AiCostDecision extends CostDecisionMakerBase { return null; } - if ("AvoidTappingManaSources".equals(source.getSVar("AIPaymentPreference"))) { + if ("DontPayTapCostWithManaSources".equals(source.getSVar("AIPaymentPreference"))) { CardCollectionView toExclude = CardLists.getValidCards(player.getCardsIn(ZoneType.Battlefield), type.split(";"), ability.getActivatingPlayer(), ability.getHostCard(), ability); diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java index 97a6442c41f..32d12449bdd 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java @@ -507,7 +507,7 @@ public class ComputerUtilCost { // Current AI decides on each part separately, thus making it possible for the AI to cheat by // tapping a mana source for mana and for the tap cost at the same time. Until this is improved, AI // will not consider mana sources valid for paying the tap cost to avoid this exact situation. - if ("AvoidTappingManaSources".equals(sa.getHostCard().getSVar("AIPaymentPreference"))) { + if ("DontPayTapCostWithManaSources".equals(sa.getHostCard().getSVar("AIPaymentPreference"))) { for (final CostPart part : sa.getPayCosts().getCostParts()) { if (part instanceof CostTapType) { CardCollectionView nonManaSources = diff --git a/forge-gui/res/cardsfolder/z/zahid_djinn_of_the_lamp.txt b/forge-gui/res/cardsfolder/z/zahid_djinn_of_the_lamp.txt index 526b272f3fd..c8a36925f44 100644 --- a/forge-gui/res/cardsfolder/z/zahid_djinn_of_the_lamp.txt +++ b/forge-gui/res/cardsfolder/z/zahid_djinn_of_the_lamp.txt @@ -4,5 +4,7 @@ Types:Legendary Creature Djinn PT:5/6 K:Flying SVar:AltCost:Cost$ 3 U tapXType<1/Artifact> | Description$ You may pay {3}{U} and tap an untapped artifact you control rather than pay this spell's mana cost. -SVar:AIPaymentPreference:AvoidTappingManaSources +# TODO: Currently the AI may cheat without the following flag by tapping the same artifact for mana and for the tap cost, e.g. +# 2 Islands + Sol Ring. Remove this flag once the AI is smart enough not to do that. +SVar:AIPaymentPreference:DontPayTapCostWithManaSources Oracle:You may pay {3}{U} and tap an untapped artifact you control rather than pay this spell's mana cost.\nFlying From d3c81779ab5ee4155668f35d8d292c0457a587ed Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 8 Dec 2018 10:29:53 +0300 Subject: [PATCH 398/901] - Tweaked a Planar Conquest deck. --- .../conquest/planes/Dominaria/Urborg/Isareth the Awakener.dck | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/conquest/planes/Dominaria/Urborg/Isareth the Awakener.dck b/forge-gui/res/conquest/planes/Dominaria/Urborg/Isareth the Awakener.dck index 19d52a654fb..b2aa2083c22 100644 --- a/forge-gui/res/conquest/planes/Dominaria/Urborg/Isareth the Awakener.dck +++ b/forge-gui/res/conquest/planes/Dominaria/Urborg/Isareth the Awakener.dck @@ -3,8 +3,8 @@ Name=Isareth the Awakener [Commander] 1 Isareth the Awakener|M19 [Main] -1 Amulet of Safekeeping|M19 1 Arisen Gorgon|M19 +1 Cast Down|DOM 1 Crucible of Worlds|M19 1 Dark Bargain|DOM 1 Death Baron|M19 From 129f6ddc7570d0d1d182bd2de394dd7fcc6fa72f Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 8 Dec 2018 09:12:26 +0300 Subject: [PATCH 399/901] - Set the original host on subabilities and additional abilities, fixes a crash with Myr Welder + Ornate Kanzashi. --- .../main/java/forge/game/spellability/SpellAbility.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index 3e866b91fb1..b06759ea044 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -400,6 +400,14 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit } public void setOriginalHost(final Card c) { grantorCard = c; + for (List addSaList : this.getAdditionalAbilityLists().values()) { + for (SpellAbility addSa : addSaList) { + addSa.setOriginalHost(c); + } + } + if (this.getSubAbility() != null) { + this.getSubAbility().setOriginalHost(c); + } } From 3f4c3d2945e9daced5f89b148f828595887022e6 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 8 Dec 2018 10:36:18 +0300 Subject: [PATCH 400/901] - Fix Myr Welder + Ornate Kanzashi, make Myr Welder use the Imprint mechanism. --- .../forge/game/spellability/SpellAbility.java | 15 +++++++++------ forge-gui/res/cardsfolder/m/myr_welder.txt | 6 +++--- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index b06759ea044..a1cf5a993fa 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -400,13 +400,16 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit } public void setOriginalHost(final Card c) { grantorCard = c; - for (List addSaList : this.getAdditionalAbilityLists().values()) { - for (SpellAbility addSa : addSaList) { - addSa.setOriginalHost(c); - } + if (subAbility != null) { + subAbility.setOriginalHost(c); } - if (this.getSubAbility() != null) { - this.getSubAbility().setOriginalHost(c); + for (AbilitySub sa : additionalAbilities.values()) { + sa.setOriginalHost(c); + } + for (List list : additionalAbilityLists.values()) { + for (AbilitySub sa : list) { + sa.setOriginalHost(c); + } } } diff --git a/forge-gui/res/cardsfolder/m/myr_welder.txt b/forge-gui/res/cardsfolder/m/myr_welder.txt index a63ac712047..9a238f12976 100644 --- a/forge-gui/res/cardsfolder/m/myr_welder.txt +++ b/forge-gui/res/cardsfolder/m/myr_welder.txt @@ -2,11 +2,11 @@ Name:Myr Welder ManaCost:3 Types:Artifact Creature Myr PT:1/4 -S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ Battlefield | GainsAbilitiesOf$ Card.IsRemembered+ExiledWithSource | GainsAbilitiesOfZones$ Exile | Description$ CARDNAME has all activated abilities of all cards exiled with it. -A:AB$ ChangeZone | Cost$ T | ValidTgts$ Artifact | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Select target artifact | RememberChanged$ True | PrecostDesc$ Imprint — | SpellDescription$ Exile target artifact card from a graveyard. +S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ Battlefield | GainsAbilitiesOf$ Card.IsImprinted+ExiledWithSource | GainsAbilitiesOfZones$ Exile | Description$ CARDNAME has all activated abilities of all cards exiled with it. +A:AB$ ChangeZone | Cost$ T | ValidTgts$ Artifact | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Select target artifact | Imprint$ True | PrecostDesc$ Imprint — | SpellDescription$ Exile target artifact card from a graveyard. T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered+ExiledWithSource | Execute$ DBForget SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Card.Self | Destination$ Any | Execute$ DBCleanup | Static$ True -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/myr_welder.jpg Oracle:Imprint — {T}: Exile target artifact card from a graveyard.\nMyr Welder has all activated abilities of all cards exiled with it. From 4cf5159d2c19042eaefcd963107b7f0a9f348ed7 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 8 Dec 2018 10:41:46 +0300 Subject: [PATCH 401/901] - Fix Liliana, Untouched by Death Mill ability for the AI. --- forge-ai/src/main/java/forge/ai/ability/MillAi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/MillAi.java b/forge-ai/src/main/java/forge/ai/ability/MillAi.java index 5250f543a82..d06a8c2b261 100644 --- a/forge-ai/src/main/java/forge/ai/ability/MillAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/MillAi.java @@ -56,7 +56,7 @@ public class MillAi extends SpellAbilityAi { return (ph.is(PhaseType.MAIN1) || ph.is(PhaseType.MAIN2)) && ph.isPlayerTurn(ai); // Chandra, Torch of Defiance and similar } if ("You".equals(sa.getParam("Defined")) && !(!SpellAbilityAi.isSorcerySpeed(sa) && ph.is(PhaseType.END_OF_TURN) - && ph.getNextTurn().equals(ai))) { + && ph.getNextTurn().equals(ai)) && !sa.hasParam("Planeswalker")) { return false; // only self-mill at opponent EOT } if (sa.getHostCard().isCreature() && sa.getPayCosts().hasTapCost()) { From 7c584d5df7e72437d0604287d55ef8c9bf3329d5 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 8 Dec 2018 10:45:13 +0300 Subject: [PATCH 402/901] - Fix Liliana, Untouched by Death Mill ability for the AI. --- forge-ai/src/main/java/forge/ai/ability/MillAi.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/MillAi.java b/forge-ai/src/main/java/forge/ai/ability/MillAi.java index 5250f543a82..c975d894c29 100644 --- a/forge-ai/src/main/java/forge/ai/ability/MillAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/MillAi.java @@ -55,9 +55,11 @@ public class MillAi extends SpellAbilityAi { } else if ("ExileAndPlayOrDealDamage".equals(sa.getParam("AILogic"))) { return (ph.is(PhaseType.MAIN1) || ph.is(PhaseType.MAIN2)) && ph.isPlayerTurn(ai); // Chandra, Torch of Defiance and similar } - if ("You".equals(sa.getParam("Defined")) && !(!SpellAbilityAi.isSorcerySpeed(sa) && ph.is(PhaseType.END_OF_TURN) - && ph.getNextTurn().equals(ai))) { - return false; // only self-mill at opponent EOT + if (!sa.hasParam("Planeswalker")) { // Planeswalker abilities are only activated at sorcery speed + if ("You".equals(sa.getParam("Defined")) && !(!SpellAbilityAi.isSorcerySpeed(sa) && ph.is(PhaseType.END_OF_TURN) + && ph.getNextTurn().equals(ai))) { + return false; // only self-mill at opponent EOT + } } if (sa.getHostCard().isCreature() && sa.getPayCosts().hasTapCost()) { if (!(ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn().equals(ai))) { From 087b8844128eb808984b7c27ab3df48f260c30f6 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 8 Dec 2018 09:12:26 +0300 Subject: [PATCH 403/901] - Set the original host on subabilities and additional abilities, fixes a crash with Myr Welder + Ornate Kanzashi. --- .../main/java/forge/game/spellability/SpellAbility.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index 3e866b91fb1..b06759ea044 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -400,6 +400,14 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit } public void setOriginalHost(final Card c) { grantorCard = c; + for (List addSaList : this.getAdditionalAbilityLists().values()) { + for (SpellAbility addSa : addSaList) { + addSa.setOriginalHost(c); + } + } + if (this.getSubAbility() != null) { + this.getSubAbility().setOriginalHost(c); + } } From e96f5819849f3ca6a6fbecb70bf206f69ff0df38 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 8 Dec 2018 10:36:18 +0300 Subject: [PATCH 404/901] - Fix Myr Welder + Ornate Kanzashi, make Myr Welder use the Imprint mechanism. --- .../forge/game/spellability/SpellAbility.java | 15 +++++++++------ forge-gui/res/cardsfolder/m/myr_welder.txt | 6 +++--- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index b06759ea044..a1cf5a993fa 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -400,13 +400,16 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit } public void setOriginalHost(final Card c) { grantorCard = c; - for (List addSaList : this.getAdditionalAbilityLists().values()) { - for (SpellAbility addSa : addSaList) { - addSa.setOriginalHost(c); - } + if (subAbility != null) { + subAbility.setOriginalHost(c); } - if (this.getSubAbility() != null) { - this.getSubAbility().setOriginalHost(c); + for (AbilitySub sa : additionalAbilities.values()) { + sa.setOriginalHost(c); + } + for (List list : additionalAbilityLists.values()) { + for (AbilitySub sa : list) { + sa.setOriginalHost(c); + } } } diff --git a/forge-gui/res/cardsfolder/m/myr_welder.txt b/forge-gui/res/cardsfolder/m/myr_welder.txt index a63ac712047..9a238f12976 100644 --- a/forge-gui/res/cardsfolder/m/myr_welder.txt +++ b/forge-gui/res/cardsfolder/m/myr_welder.txt @@ -2,11 +2,11 @@ Name:Myr Welder ManaCost:3 Types:Artifact Creature Myr PT:1/4 -S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ Battlefield | GainsAbilitiesOf$ Card.IsRemembered+ExiledWithSource | GainsAbilitiesOfZones$ Exile | Description$ CARDNAME has all activated abilities of all cards exiled with it. -A:AB$ ChangeZone | Cost$ T | ValidTgts$ Artifact | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Select target artifact | RememberChanged$ True | PrecostDesc$ Imprint — | SpellDescription$ Exile target artifact card from a graveyard. +S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ Battlefield | GainsAbilitiesOf$ Card.IsImprinted+ExiledWithSource | GainsAbilitiesOfZones$ Exile | Description$ CARDNAME has all activated abilities of all cards exiled with it. +A:AB$ ChangeZone | Cost$ T | ValidTgts$ Artifact | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Select target artifact | Imprint$ True | PrecostDesc$ Imprint — | SpellDescription$ Exile target artifact card from a graveyard. T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered+ExiledWithSource | Execute$ DBForget SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Card.Self | Destination$ Any | Execute$ DBCleanup | Static$ True -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/myr_welder.jpg Oracle:Imprint — {T}: Exile target artifact card from a graveyard.\nMyr Welder has all activated abilities of all cards exiled with it. From 357f84882c93a3af8461231438ec55ce9ea49177 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 8 Dec 2018 10:50:49 +0300 Subject: [PATCH 405/901] - Fix the trigger. --- forge-gui/res/cardsfolder/m/myr_welder.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/m/myr_welder.txt b/forge-gui/res/cardsfolder/m/myr_welder.txt index 9a238f12976..8c0baa346ed 100644 --- a/forge-gui/res/cardsfolder/m/myr_welder.txt +++ b/forge-gui/res/cardsfolder/m/myr_welder.txt @@ -4,7 +4,7 @@ Types:Artifact Creature Myr PT:1/4 S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ Battlefield | GainsAbilitiesOf$ Card.IsImprinted+ExiledWithSource | GainsAbilitiesOfZones$ Exile | Description$ CARDNAME has all activated abilities of all cards exiled with it. A:AB$ ChangeZone | Cost$ T | ValidTgts$ Artifact | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Select target artifact | Imprint$ True | PrecostDesc$ Imprint — | SpellDescription$ Exile target artifact card from a graveyard. -T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered+ExiledWithSource | Execute$ DBForget +T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsImprinted+ExiledWithSource | Execute$ DBForget SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Card.Self | Destination$ Any | Execute$ DBCleanup | Static$ True SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True From 5143505bd4f0b743b3b0cf660603d6826bdc5dce Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 8 Dec 2018 09:12:26 +0300 Subject: [PATCH 406/901] - Set the original host on subabilities and additional abilities, fixes a crash with Myr Welder + Ornate Kanzashi. --- .../main/java/forge/game/spellability/SpellAbility.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index 3e866b91fb1..b06759ea044 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -400,6 +400,14 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit } public void setOriginalHost(final Card c) { grantorCard = c; + for (List addSaList : this.getAdditionalAbilityLists().values()) { + for (SpellAbility addSa : addSaList) { + addSa.setOriginalHost(c); + } + } + if (this.getSubAbility() != null) { + this.getSubAbility().setOriginalHost(c); + } } From e10f90cf4966174c4a6ab4123c9ee9169abd6cdc Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 8 Dec 2018 10:36:18 +0300 Subject: [PATCH 407/901] - Fix Myr Welder + Ornate Kanzashi, make Myr Welder use the Imprint mechanism. --- .../forge/game/spellability/SpellAbility.java | 15 +++++++++------ forge-gui/res/cardsfolder/m/myr_welder.txt | 6 +++--- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index b06759ea044..a1cf5a993fa 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -400,13 +400,16 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit } public void setOriginalHost(final Card c) { grantorCard = c; - for (List addSaList : this.getAdditionalAbilityLists().values()) { - for (SpellAbility addSa : addSaList) { - addSa.setOriginalHost(c); - } + if (subAbility != null) { + subAbility.setOriginalHost(c); } - if (this.getSubAbility() != null) { - this.getSubAbility().setOriginalHost(c); + for (AbilitySub sa : additionalAbilities.values()) { + sa.setOriginalHost(c); + } + for (List list : additionalAbilityLists.values()) { + for (AbilitySub sa : list) { + sa.setOriginalHost(c); + } } } diff --git a/forge-gui/res/cardsfolder/m/myr_welder.txt b/forge-gui/res/cardsfolder/m/myr_welder.txt index a63ac712047..9a238f12976 100644 --- a/forge-gui/res/cardsfolder/m/myr_welder.txt +++ b/forge-gui/res/cardsfolder/m/myr_welder.txt @@ -2,11 +2,11 @@ Name:Myr Welder ManaCost:3 Types:Artifact Creature Myr PT:1/4 -S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ Battlefield | GainsAbilitiesOf$ Card.IsRemembered+ExiledWithSource | GainsAbilitiesOfZones$ Exile | Description$ CARDNAME has all activated abilities of all cards exiled with it. -A:AB$ ChangeZone | Cost$ T | ValidTgts$ Artifact | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Select target artifact | RememberChanged$ True | PrecostDesc$ Imprint — | SpellDescription$ Exile target artifact card from a graveyard. +S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ Battlefield | GainsAbilitiesOf$ Card.IsImprinted+ExiledWithSource | GainsAbilitiesOfZones$ Exile | Description$ CARDNAME has all activated abilities of all cards exiled with it. +A:AB$ ChangeZone | Cost$ T | ValidTgts$ Artifact | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Select target artifact | Imprint$ True | PrecostDesc$ Imprint — | SpellDescription$ Exile target artifact card from a graveyard. T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered+ExiledWithSource | Execute$ DBForget SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Card.Self | Destination$ Any | Execute$ DBCleanup | Static$ True -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/myr_welder.jpg Oracle:Imprint — {T}: Exile target artifact card from a graveyard.\nMyr Welder has all activated abilities of all cards exiled with it. From 1bd38f91aa5b35738b9a0508a4bf477e9411b283 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 8 Dec 2018 10:50:49 +0300 Subject: [PATCH 408/901] - Fix the trigger. --- forge-gui/res/cardsfolder/m/myr_welder.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/m/myr_welder.txt b/forge-gui/res/cardsfolder/m/myr_welder.txt index 9a238f12976..8c0baa346ed 100644 --- a/forge-gui/res/cardsfolder/m/myr_welder.txt +++ b/forge-gui/res/cardsfolder/m/myr_welder.txt @@ -4,7 +4,7 @@ Types:Artifact Creature Myr PT:1/4 S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ Battlefield | GainsAbilitiesOf$ Card.IsImprinted+ExiledWithSource | GainsAbilitiesOfZones$ Exile | Description$ CARDNAME has all activated abilities of all cards exiled with it. A:AB$ ChangeZone | Cost$ T | ValidTgts$ Artifact | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Select target artifact | Imprint$ True | PrecostDesc$ Imprint — | SpellDescription$ Exile target artifact card from a graveyard. -T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered+ExiledWithSource | Execute$ DBForget +T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsImprinted+ExiledWithSource | Execute$ DBForget SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Card.Self | Destination$ Any | Execute$ DBCleanup | Static$ True SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True From 54ced3332c2148d2c97d8cedab738a878f494c07 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 8 Dec 2018 10:53:58 +0300 Subject: [PATCH 409/901] - Revert an accidental merge update. --- forge-ai/src/main/java/forge/ai/ability/MillAi.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/MillAi.java b/forge-ai/src/main/java/forge/ai/ability/MillAi.java index d06a8c2b261..c975d894c29 100644 --- a/forge-ai/src/main/java/forge/ai/ability/MillAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/MillAi.java @@ -55,9 +55,11 @@ public class MillAi extends SpellAbilityAi { } else if ("ExileAndPlayOrDealDamage".equals(sa.getParam("AILogic"))) { return (ph.is(PhaseType.MAIN1) || ph.is(PhaseType.MAIN2)) && ph.isPlayerTurn(ai); // Chandra, Torch of Defiance and similar } - if ("You".equals(sa.getParam("Defined")) && !(!SpellAbilityAi.isSorcerySpeed(sa) && ph.is(PhaseType.END_OF_TURN) - && ph.getNextTurn().equals(ai)) && !sa.hasParam("Planeswalker")) { - return false; // only self-mill at opponent EOT + if (!sa.hasParam("Planeswalker")) { // Planeswalker abilities are only activated at sorcery speed + if ("You".equals(sa.getParam("Defined")) && !(!SpellAbilityAi.isSorcerySpeed(sa) && ph.is(PhaseType.END_OF_TURN) + && ph.getNextTurn().equals(ai))) { + return false; // only self-mill at opponent EOT + } } if (sa.getHostCard().isCreature() && sa.getPayCosts().hasTapCost()) { if (!(ph.is(PhaseType.END_OF_TURN) && ph.getNextTurn().equals(ai))) { From 65021e7f9ba693dd70af757db276863753c33371 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 8 Dec 2018 10:57:45 +0300 Subject: [PATCH 410/901] - ForgetImprinted on DB Pump. --- forge-gui/res/cardsfolder/m/myr_welder.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/m/myr_welder.txt b/forge-gui/res/cardsfolder/m/myr_welder.txt index 8c0baa346ed..49212d18ca5 100644 --- a/forge-gui/res/cardsfolder/m/myr_welder.txt +++ b/forge-gui/res/cardsfolder/m/myr_welder.txt @@ -5,7 +5,7 @@ PT:1/4 S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ Battlefield | GainsAbilitiesOf$ Card.IsImprinted+ExiledWithSource | GainsAbilitiesOfZones$ Exile | Description$ CARDNAME has all activated abilities of all cards exiled with it. A:AB$ ChangeZone | Cost$ T | ValidTgts$ Artifact | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Select target artifact | Imprint$ True | PrecostDesc$ Imprint — | SpellDescription$ Exile target artifact card from a graveyard. T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsImprinted+ExiledWithSource | Execute$ DBForget -SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard +SVar:DBForget:DB$ Pump | ForgetImprinted$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Card.Self | Destination$ Any | Execute$ DBCleanup | Static$ True SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/myr_welder.jpg From b6f6ee1098fbfafd147a41d7787c57c70d59274c Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 8 Dec 2018 19:41:09 +0300 Subject: [PATCH 411/901] - Fixed Liliana, Untouched by Death. --- .../res/cardsfolder/l/liliana_untouched_by_death.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/cardsfolder/l/liliana_untouched_by_death.txt b/forge-gui/res/cardsfolder/l/liliana_untouched_by_death.txt index c44f387538d..8741485be55 100644 --- a/forge-gui/res/cardsfolder/l/liliana_untouched_by_death.txt +++ b/forge-gui/res/cardsfolder/l/liliana_untouched_by_death.txt @@ -2,10 +2,10 @@ Name:Liliana, Untouched by Death ManaCost:2 B B Types:Legendary Planeswalker Liliana Loyalty:4 -A:AB$ Mill | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | NumCards$ 3 | Defined$ You | Triggers$ ZombieMill | SpellDescription$ Put the top three cards of your library into your graveyard. If at least one of them is a Zombie card, each opponent loses 2 life and you gain 2 life. -SVar:ZombieMIll:Mode$ ChangesZone | ValidCard$ Zombie | Origin$ Library | Destination$ Graveyard | Execute$ DBLifeDrain | TriggerDescription$ If at least one of them is a Zombie card, each opponent loses 2 life and you gain 2 life. -SVar:DBLifeDrain:DB$ LoseLife | Defined$ Player.Opponent | LifeAmount$ 2 | SubAbility$ DBGainLife -SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 +A:AB$ Mill | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | NumCards$ 3 | Defined$ You | RememberMilled$ True | SubAbility$ DBLifeDrain | SpellDescription$ Put the top three cards of your library into your graveyard. If at least one of them is a Zombie card, each opponent loses 2 life and you gain 2 life. +SVar:DBLifeDrain:DB$ LoseLife | Defined$ Player.Opponent | LifeAmount$ 2 | ConditionDefined$ Remembered | ConditionPresent$ Zombie | ConditionCompare$ GE1 | SubAbility$ DBGainLife +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 | ConditionDefined$ Remembered | ConditionPresent$ Zombie | ConditionCompare$ GE1 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True A:AB$ Pump | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | IsCurse$ True | NumAtt$ -X | NumDef$ -X | References$ X | SpellDescription$ Target creature gets -X/-X until end of turn, where X is the number of Zombies you control. SVar:X:Count$Valid Zombie.YouCtrl A:AB$ Effect | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | Ultimate$ True | Stackable$ False | StaticAbilities$ ZombieCast | SpellDescription$ Until end of turn you may cast Zombie cards from your graveyard. From 879caa89330c9812c9aea056414548a06f4c1ed3 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 8 Dec 2018 20:25:03 +0300 Subject: [PATCH 412/901] - AI shouldn't grant Haste to creatures which won't attack this turn anyway. --- forge-ai/src/main/java/forge/ai/ComputerUtilCard.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index 1eb1fd6913e..c7d15bf3e6b 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -1311,7 +1311,7 @@ public class ComputerUtilCard { //2. grant haste if (keywords.contains("Haste") && c.hasSickness() && !c.isTapped()) { - chance += 0.5f; + //chance += 0.5f; if (ComputerUtilCard.doesSpecifiedCreatureAttackAI(ai, pumped)) { chance += 0.5f * ComputerUtilCombat.damageIfUnblocked(pumped, opp, combat, true) / opp.getLife(); } From 46963167065de2b200871799f882bea78d773d92 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 8 Dec 2018 20:29:09 +0300 Subject: [PATCH 413/901] - Factor in the original chance boost for granting haste to creatures. --- forge-ai/src/main/java/forge/ai/ComputerUtilCard.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index c7d15bf3e6b..d9a0b0ab1e2 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -1313,7 +1313,7 @@ public class ComputerUtilCard { if (keywords.contains("Haste") && c.hasSickness() && !c.isTapped()) { //chance += 0.5f; if (ComputerUtilCard.doesSpecifiedCreatureAttackAI(ai, pumped)) { - chance += 0.5f * ComputerUtilCombat.damageIfUnblocked(pumped, opp, combat, true) / opp.getLife(); + chance += 0.5f + (0.5f * ComputerUtilCombat.damageIfUnblocked(pumped, opp, combat, true) / opp.getLife()); } } From b5340eade503cb15757da746e0c56d76892e5397 Mon Sep 17 00:00:00 2001 From: Blacksmith Date: Sun, 9 Dec 2018 06:49:35 +0000 Subject: [PATCH 414/901] Update README.txt for release --- forge-gui/README.txt | 106 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 105 insertions(+), 1 deletion(-) diff --git a/forge-gui/README.txt b/forge-gui/README.txt index 11b369846f2..ab3ad223544 100644 --- a/forge-gui/README.txt +++ b/forge-gui/README.txt @@ -1 +1,105 @@ -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: 12/09/2018 ver 1.6.19 + +18205 cards in total. + + +-------------- +Release Notes: +-------------- + +- Ultimate Masters - +This release fully supports Ultimate Masters, you can draft this brand new set in Booster Draft mode. Booster box toppers are not yet supported as a separate sealed product (the options for supporting them are currently being discussed), but otherwise the set is fully playable. + +- Planar Conquest 25th MTG Anniversary / Christmas 2018 Update - +A rather serious and massive content update has happened in Planar Conquest. There are two new planes available, Dominaria and Kamigawa. +(Please note that Planar Conquest is currently only available on Android and in the mobile backport.) + +** Dominaria ** +It's the 25th anniversary year for Magic: the Gathering, and one of the key events this year was going back to Dominaria with a brand new set. So, at the end of the year, why not visit Dominaria once more? Dominaria is a plane which features cards from the eponymous set, Dominaria, as well as most (but not all) cards from Magic Core Set 2019 and Commander 2018. There are 45 events available for your enjoyment. Traditional Commander, Planeswalker, and Vanguard events represent the majority of the events on the plane, but Dominaria also features Planechase variant matches, with the planar decks consisting of plane cards representing regions of Dominaria (and sometimes, by the whim of fate, various other locations of the Multiverse) and various randomly inserted phenomena. + There is a rumor circulating in the taverns claiming that somewhere on Dominaria there is a hidden secret portal leading to the legendary Time Vault which allows a planeswalker to travel to the past, yet it is unknown if this rumor is true. + +** Kamigawa ** +Kamigawa is a plane consisting of 45 events and containing the cards from Champions of Kamigawa, Betrayers of Kamigawa, and Saviors of Kamigawa. Even though this block is notorious for being underpowered and probably contains the biggest number of weenies and bears, it also presents you with a chance to get some of the most broken cards in the game. For example, you can grab Umezawa's Jitte without having to rely on randomly finding one in Chaos Battles. Commander, Vanguard, and the new Planechase events are available on the Kamigawa plane, but no Planeswalker events since no planeswalker cards existed in this period of Magic: the Gathering. + +** Other changes ** +In addition to that, several other planes were tweaked. In particular, Theros, Alara and Ravnica feature random Planechase matches replacing random non-variant matches. Ravnica has been updated to feature several new events featuring Guilds of Ravnica cards, and some old events on this plane were also updated with the new cards as well. Guilds of Ravnica has been fully enabled on this plane, so you can grab the relevant cards in The Aether or from randomly won booster packs. Also, Theros has been tweaked not to start with a hard non-singleton non-variant duel, as well as to allow to ignore non-singleton duels (walk around them) if need be. + +- New Quest World: Tempest - +This release features a new quest world based on the Tempest block. This quest world was submitted by Seravy, it has now been fully tested and the AI support for the cards has reached the level where the duels in this world can be enjoyed as interesting, unusual, and challenging. This world contains 41 duels and 12 challenges. If you would like to revisit the older Magic experience, this may be just the quest world for you to try out. + +- Possibility Storm Puzzles - +For all of you puzzle mode fans, the complete Guilds of Ravnica season of Possibility Storm puzzles is now implemented in Forge. + +- AI Improvements - +A new round of AI improvements went into the game, hopefully making the game a little more interesting and exciting to play. In particular, certain improvements regarding Flash were implemented, the AI is now able to use cards which reorder the top of the library, such as Ponder or Portent, as well as cards which copy spells and/or activated abilities, such as Twincast or Fork. Some other cards were improved for the AI and some were marked as AI playable. On top of that, several logic-related bugs were fixed. Also, the AI has been optimized a little, hopefully making it a bit faster, especially on mobile platforms, in situations where there are a lot of cards on the battlefield but the AI has little or nothing to do. + +- Random Commander Quest - +It is now possible to start a quest with Commander rules and randomly generated quest opponents playing Commander decks. This feature is currently exclusive to desktop Forge. + +- 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 haven't been able to distribute the OS X Application version of Forge in sometime. We've recently automated our release tools, and will continue to look in the viability of creating this file now that things are autoamted. + + +- 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 +Austinio7116 +Churrufli +DrDev +excessum +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 + +(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 a990b9ff690cb231a4bfa1382e5ac7d5f1c5ee2e Mon Sep 17 00:00:00 2001 From: Blacksmith Date: Sun, 9 Dec 2018 06:52:07 +0000 Subject: [PATCH 415/901] [maven-release-plugin] prepare release forge-1.6.19 --- 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 7c67017dfd7..b8377e655ac 100644 --- a/forge-ai/pom.xml +++ b/forge-ai/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.19-SNAPSHOT + 1.6.19 forge-ai diff --git a/forge-core/pom.xml b/forge-core/pom.xml index 74b53c8753a..231480e0dc3 100644 --- a/forge-core/pom.xml +++ b/forge-core/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.19-SNAPSHOT + 1.6.19 forge-core diff --git a/forge-game/pom.xml b/forge-game/pom.xml index 9444f1fafd7..31f664dfd22 100644 --- a/forge-game/pom.xml +++ b/forge-game/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.19-SNAPSHOT + 1.6.19 forge-game diff --git a/forge-gui-android/pom.xml b/forge-gui-android/pom.xml index 2da90f8fa28..65893df1bd2 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -19,7 +19,7 @@ forge forge - 1.6.19-SNAPSHOT + 1.6.19 forge-gui-android diff --git a/forge-gui-desktop/pom.xml b/forge-gui-desktop/pom.xml index 513db2c33b9..3d07472aa28 100644 --- a/forge-gui-desktop/pom.xml +++ b/forge-gui-desktop/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.19-SNAPSHOT + 1.6.19 forge-gui-desktop diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index 91453102f8e..1619d050cad 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -12,7 +12,7 @@ forge forge - 1.6.19-SNAPSHOT + 1.6.19 forge-gui-ios diff --git a/forge-gui-mobile-dev/pom.xml b/forge-gui-mobile-dev/pom.xml index 1c5e9e9aa39..f475875d0f8 100644 --- a/forge-gui-mobile-dev/pom.xml +++ b/forge-gui-mobile-dev/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.19-SNAPSHOT + 1.6.19 forge-gui-mobile-dev diff --git a/forge-gui-mobile/pom.xml b/forge-gui-mobile/pom.xml index 5ce2359d01b..2cb43a10b30 100644 --- a/forge-gui-mobile/pom.xml +++ b/forge-gui-mobile/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.19-SNAPSHOT + 1.6.19 forge-gui-mobile diff --git a/forge-gui/pom.xml b/forge-gui/pom.xml index 4d65a817ed3..ab66dc9f148 100644 --- a/forge-gui/pom.xml +++ b/forge-gui/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.19-SNAPSHOT + 1.6.19 forge-gui diff --git a/pom.xml b/pom.xml index 245cead9e75..f6f5efe1282 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ forge pom Forge Parent - 1.6.19-SNAPSHOT + 1.6.19 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.19 From e8c581b40273b53d9976a10d2c3a0b07ecf8e39b Mon Sep 17 00:00:00 2001 From: Blacksmith Date: Sun, 9 Dec 2018 06:52:11 +0000 Subject: [PATCH 416/901] [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 b8377e655ac..47ed2d96af7 100644 --- a/forge-ai/pom.xml +++ b/forge-ai/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.19 + 1.6.20-SNAPSHOT forge-ai diff --git a/forge-core/pom.xml b/forge-core/pom.xml index 231480e0dc3..092a40ddec6 100644 --- a/forge-core/pom.xml +++ b/forge-core/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.19 + 1.6.20-SNAPSHOT forge-core diff --git a/forge-game/pom.xml b/forge-game/pom.xml index 31f664dfd22..52604f41da9 100644 --- a/forge-game/pom.xml +++ b/forge-game/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.19 + 1.6.20-SNAPSHOT forge-game diff --git a/forge-gui-android/pom.xml b/forge-gui-android/pom.xml index 65893df1bd2..1468e0ec6c3 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -19,7 +19,7 @@ forge forge - 1.6.19 + 1.6.20-SNAPSHOT forge-gui-android diff --git a/forge-gui-desktop/pom.xml b/forge-gui-desktop/pom.xml index 3d07472aa28..f9529e775c5 100644 --- a/forge-gui-desktop/pom.xml +++ b/forge-gui-desktop/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.19 + 1.6.20-SNAPSHOT forge-gui-desktop diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index 1619d050cad..6b4e2904f91 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -12,7 +12,7 @@ forge forge - 1.6.19 + 1.6.20-SNAPSHOT forge-gui-ios diff --git a/forge-gui-mobile-dev/pom.xml b/forge-gui-mobile-dev/pom.xml index f475875d0f8..315100b4a43 100644 --- a/forge-gui-mobile-dev/pom.xml +++ b/forge-gui-mobile-dev/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.19 + 1.6.20-SNAPSHOT forge-gui-mobile-dev diff --git a/forge-gui-mobile/pom.xml b/forge-gui-mobile/pom.xml index 2cb43a10b30..7a125f1368d 100644 --- a/forge-gui-mobile/pom.xml +++ b/forge-gui-mobile/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.19 + 1.6.20-SNAPSHOT forge-gui-mobile diff --git a/forge-gui/pom.xml b/forge-gui/pom.xml index ab66dc9f148..4b4ed1c8ee7 100644 --- a/forge-gui/pom.xml +++ b/forge-gui/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.19 + 1.6.20-SNAPSHOT forge-gui diff --git a/pom.xml b/pom.xml index f6f5efe1282..5b0f1f1a303 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ forge pom Forge Parent - 1.6.19 + 1.6.20-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.19 + HEAD From abe1ab26e3a0c89e2238814ed51da1b7059cbdb5 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 9 Dec 2018 09:56:16 +0300 Subject: [PATCH 417/901] - Preparing Forge for Android publish v1.6.19.001 [incremental]. --- forge-ai/src/main/java/forge/ai/ComputerUtilCard.java | 1 - forge-gui-android/pom.xml | 2 +- forge-gui-ios/pom.xml | 2 +- forge-gui-mobile/src/forge/Forge.java | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index d9a0b0ab1e2..cbac89b2e0c 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -1311,7 +1311,6 @@ public class ComputerUtilCard { //2. grant haste if (keywords.contains("Haste") && c.hasSickness() && !c.isTapped()) { - //chance += 0.5f; if (ComputerUtilCard.doesSpecifiedCreatureAttackAI(ai, pumped)) { chance += 0.5f + (0.5f * ComputerUtilCombat.damageIfUnblocked(pumped, opp, combat, true) / opp.getLife()); } diff --git a/forge-gui-android/pom.xml b/forge-gui-android/pom.xml index 1468e0ec6c3..01e57e88c43 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -6,7 +6,7 @@ jar -Xms1024m -Xmx1536m - 1.6.18.004 + 1.6.19.001 keystore alias storepass diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index 6b4e2904f91..38092d85331 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -6,7 +6,7 @@ jar -Xms128m -Xmx2048m - 1.6.18.004 + 1.6.19.001
diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index 73f4c8a2ed3..89f79e3df58 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.18.004"; + public static final String CURRENT_VERSION = "1.6.19.001"; private static final ApplicationListener app = new Forge(); private static Clipboard clipboard; From 2e36bc862d518d27e4af3f7edc8756b67f8e3acf Mon Sep 17 00:00:00 2001 From: Blacksmith Date: Sun, 9 Dec 2018 06:56:52 +0000 Subject: [PATCH 418/901] Clear out release files in preparation for next release --- forge-gui/README.txt | 106 +--------------------------- forge-gui/release-files/CHANGES.txt | 29 -------- 2 files changed, 1 insertion(+), 134 deletions(-) diff --git a/forge-gui/README.txt b/forge-gui/README.txt index ab3ad223544..11b369846f2 100644 --- a/forge-gui/README.txt +++ b/forge-gui/README.txt @@ -1,105 +1 @@ -Forge: 12/09/2018 ver 1.6.19 - -18205 cards in total. - - --------------- -Release Notes: --------------- - -- Ultimate Masters - -This release fully supports Ultimate Masters, you can draft this brand new set in Booster Draft mode. Booster box toppers are not yet supported as a separate sealed product (the options for supporting them are currently being discussed), but otherwise the set is fully playable. - -- Planar Conquest 25th MTG Anniversary / Christmas 2018 Update - -A rather serious and massive content update has happened in Planar Conquest. There are two new planes available, Dominaria and Kamigawa. -(Please note that Planar Conquest is currently only available on Android and in the mobile backport.) - -** Dominaria ** -It's the 25th anniversary year for Magic: the Gathering, and one of the key events this year was going back to Dominaria with a brand new set. So, at the end of the year, why not visit Dominaria once more? Dominaria is a plane which features cards from the eponymous set, Dominaria, as well as most (but not all) cards from Magic Core Set 2019 and Commander 2018. There are 45 events available for your enjoyment. Traditional Commander, Planeswalker, and Vanguard events represent the majority of the events on the plane, but Dominaria also features Planechase variant matches, with the planar decks consisting of plane cards representing regions of Dominaria (and sometimes, by the whim of fate, various other locations of the Multiverse) and various randomly inserted phenomena. - There is a rumor circulating in the taverns claiming that somewhere on Dominaria there is a hidden secret portal leading to the legendary Time Vault which allows a planeswalker to travel to the past, yet it is unknown if this rumor is true. - -** Kamigawa ** -Kamigawa is a plane consisting of 45 events and containing the cards from Champions of Kamigawa, Betrayers of Kamigawa, and Saviors of Kamigawa. Even though this block is notorious for being underpowered and probably contains the biggest number of weenies and bears, it also presents you with a chance to get some of the most broken cards in the game. For example, you can grab Umezawa's Jitte without having to rely on randomly finding one in Chaos Battles. Commander, Vanguard, and the new Planechase events are available on the Kamigawa plane, but no Planeswalker events since no planeswalker cards existed in this period of Magic: the Gathering. - -** Other changes ** -In addition to that, several other planes were tweaked. In particular, Theros, Alara and Ravnica feature random Planechase matches replacing random non-variant matches. Ravnica has been updated to feature several new events featuring Guilds of Ravnica cards, and some old events on this plane were also updated with the new cards as well. Guilds of Ravnica has been fully enabled on this plane, so you can grab the relevant cards in The Aether or from randomly won booster packs. Also, Theros has been tweaked not to start with a hard non-singleton non-variant duel, as well as to allow to ignore non-singleton duels (walk around them) if need be. - -- New Quest World: Tempest - -This release features a new quest world based on the Tempest block. This quest world was submitted by Seravy, it has now been fully tested and the AI support for the cards has reached the level where the duels in this world can be enjoyed as interesting, unusual, and challenging. This world contains 41 duels and 12 challenges. If you would like to revisit the older Magic experience, this may be just the quest world for you to try out. - -- Possibility Storm Puzzles - -For all of you puzzle mode fans, the complete Guilds of Ravnica season of Possibility Storm puzzles is now implemented in Forge. - -- AI Improvements - -A new round of AI improvements went into the game, hopefully making the game a little more interesting and exciting to play. In particular, certain improvements regarding Flash were implemented, the AI is now able to use cards which reorder the top of the library, such as Ponder or Portent, as well as cards which copy spells and/or activated abilities, such as Twincast or Fork. Some other cards were improved for the AI and some were marked as AI playable. On top of that, several logic-related bugs were fixed. Also, the AI has been optimized a little, hopefully making it a bit faster, especially on mobile platforms, in situations where there are a lot of cards on the battlefield but the AI has little or nothing to do. - -- Random Commander Quest - -It is now possible to start a quest with Commander rules and randomly generated quest opponents playing Commander decks. This feature is currently exclusive to desktop Forge. - -- 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 haven't been able to distribute the OS X Application version of Forge in sometime. We've recently automated our release tools, and will continue to look in the viability of creating this file now that things are autoamted. - - -- 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 -Austinio7116 -Churrufli -DrDev -excessum -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 - -(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 fa902c77d07..05f0bf1829e 100644 --- a/forge-gui/release-files/CHANGES.txt +++ b/forge-gui/release-files/CHANGES.txt @@ -1,31 +1,2 @@ -- Ultimate Masters - -This release fully supports Ultimate Masters, you can draft this brand new set in Booster Draft mode. Booster box toppers are not yet supported as a separate sealed product (the options for supporting them are currently being discussed), but otherwise the set is fully playable. - -- Planar Conquest 25th MTG Anniversary / Christmas 2018 Update - -A rather serious and massive content update has happened in Planar Conquest. There are two new planes available, Dominaria and Kamigawa. -(Please note that Planar Conquest is currently only available on Android and in the mobile backport.) - -** Dominaria ** -It's the 25th anniversary year for Magic: the Gathering, and one of the key events this year was going back to Dominaria with a brand new set. So, at the end of the year, why not visit Dominaria once more? Dominaria is a plane which features cards from the eponymous set, Dominaria, as well as most (but not all) cards from Magic Core Set 2019 and Commander 2018. There are 45 events available for your enjoyment. Traditional Commander, Planeswalker, and Vanguard events represent the majority of the events on the plane, but Dominaria also features Planechase variant matches, with the planar decks consisting of plane cards representing regions of Dominaria (and sometimes, by the whim of fate, various other locations of the Multiverse) and various randomly inserted phenomena. - There is a rumor circulating in the taverns claiming that somewhere on Dominaria there is a hidden secret portal leading to the legendary Time Vault which allows a planeswalker to travel to the past, yet it is unknown if this rumor is true. - -** Kamigawa ** -Kamigawa is a plane consisting of 45 events and containing the cards from Champions of Kamigawa, Betrayers of Kamigawa, and Saviors of Kamigawa. Even though this block is notorious for being underpowered and probably contains the biggest number of weenies and bears, it also presents you with a chance to get some of the most broken cards in the game. For example, you can grab Umezawa's Jitte without having to rely on randomly finding one in Chaos Battles. Commander, Vanguard, and the new Planechase events are available on the Kamigawa plane, but no Planeswalker events since no planeswalker cards existed in this period of Magic: the Gathering. - -** Other changes ** -In addition to that, several other planes were tweaked. In particular, Theros, Alara and Ravnica feature random Planechase matches replacing random non-variant matches. Ravnica has been updated to feature several new events featuring Guilds of Ravnica cards, and some old events on this plane were also updated with the new cards as well. Guilds of Ravnica has been fully enabled on this plane, so you can grab the relevant cards in The Aether or from randomly won booster packs. Also, Theros has been tweaked not to start with a hard non-singleton non-variant duel, as well as to allow to ignore non-singleton duels (walk around them) if need be. - -- New Quest World: Tempest - -This release features a new quest world based on the Tempest block. This quest world was submitted by Seravy, it has now been fully tested and the AI support for the cards has reached the level where the duels in this world can be enjoyed as interesting, unusual, and challenging. This world contains 41 duels and 12 challenges. If you would like to revisit the older Magic experience, this may be just the quest world for you to try out. - -- Possibility Storm Puzzles - -For all of you puzzle mode fans, the complete Guilds of Ravnica season of Possibility Storm puzzles is now implemented in Forge. - -- AI Improvements - -A new round of AI improvements went into the game, hopefully making the game a little more interesting and exciting to play. In particular, certain improvements regarding Flash were implemented, the AI is now able to use cards which reorder the top of the library, such as Ponder or Portent, as well as cards which copy spells and/or activated abilities, such as Twincast or Fork. Some other cards were improved for the AI and some were marked as AI playable. On top of that, several logic-related bugs were fixed. Also, the AI has been optimized a little, hopefully making it a bit faster, especially on mobile platforms, in situations where there are a lot of cards on the battlefield but the AI has little or nothing to do. - -- Random Commander Quest - -It is now possible to start a quest with Commander rules and randomly generated quest opponents playing Commander decks. This feature is currently exclusive to desktop Forge. - - 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 5a32588f267314abf0ce50b0ca108f24f7f02a39 Mon Sep 17 00:00:00 2001 From: Meerkov Date: Sun, 9 Dec 2018 08:19:43 +0000 Subject: [PATCH 419/901] Removing suspicious check (untested). --- forge-gui/res/cardsfolder/g/genesis_chamber.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/g/genesis_chamber.txt b/forge-gui/res/cardsfolder/g/genesis_chamber.txt index 28885615f26..16956992f98 100644 --- a/forge-gui/res/cardsfolder/g/genesis_chamber.txt +++ b/forge-gui/res/cardsfolder/g/genesis_chamber.txt @@ -1,7 +1,7 @@ Name:Genesis Chamber ManaCost:2 Types:Artifact -T:Mode$ ChangesZone | ValidPlayer$ Player | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonToken | TriggerZones$ Battlefield | Execute$ TrigToken | IsPresent$ Card.Self+untapped | TriggerDescription$ Whenever a nontoken creature enters the battlefield, if CARDNAME is untapped, that creature's controller creates a 1/1 colorless Myr artifact creature token. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonToken | TriggerZones$ Battlefield | Execute$ TrigToken | IsPresent$ Card.Self+untapped | TriggerDescription$ Whenever a nontoken creature enters the battlefield, if CARDNAME is untapped, that creature's controller creates a 1/1 colorless Myr artifact creature token. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenOwner$ TriggeredCardController | TokenName$ Myr | TokenTypes$ Artifact,Creature,Myr | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Create a 1/1 Myr artifact creature token. AI:RemoveDeck:Random DeckHas:Ability$Token From bcfae4ba400c400f8d84f4f4be0c65fe1d306c6f Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 9 Dec 2018 14:19:39 +0300 Subject: [PATCH 420/901] - Removed an off-color land from a deck on Kamigawa plane. --- .../planes/Kamigawa/Towabara/Takeno, Samurai General.dck | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Takeno, Samurai General.dck b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Takeno, Samurai General.dck index cc872bd950a..e189992ac9e 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Takeno, Samurai General.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Takeno, Samurai General.dck @@ -4,7 +4,6 @@ Name=Takeno, Samurai General 1 Takeno, Samurai General|CHK [Main] 1 Araba Mothrider|SOK -1 Cloudcrest Lake|CHK 1 Devoted Retainer|CHK 1 Eiganjo Castle|CHK 1 Genju of the Fields|BOK @@ -21,7 +20,7 @@ Name=Takeno, Samurai General 1 No-Dachi|CHK 1 O-Naginata|SOK 1 Oathkeeper, Takeno's Daisho|CHK -15 Plains|CHK +16 Plains|CHK 1 Promise of Bunrei|SOK 1 Reverence|SOK 1 Samurai Enforcers|CHK From 031d0b4d3cbdd8a6ff5cef6f1ca0dbe647687d6b Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 9 Dec 2018 14:48:08 +0300 Subject: [PATCH 421/901] - Fixed a logic error in AnimateAi which made the AI animate things like Plains via Genju of the Fields when the Plains was tapped. --- forge-ai/src/main/java/forge/ai/ability/AnimateAi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 494c10c10c8..671b567c2af 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java @@ -188,7 +188,7 @@ public class AnimateAi extends SpellAbilityAi { if (animatedCopy.getCurrentPower() + animatedCopy.getCurrentToughness() > c.getCurrentPower() + c.getCurrentToughness()) { if (!isAnimatedThisTurn(aiPlayer, sa.getHostCard())) { - if (!sa.getHostCard().isTapped() || (game.getCombat() != null && game.getCombat().isAttacking(sa.getHostCard()))) { + if (!c.isTapped() || (game.getCombat() != null && game.getCombat().isAttacking(sa.getHostCard()))) { bFlag = true; } } From 156683cddb352debed1ee33dade2115fe1f1425a Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 9 Dec 2018 14:49:53 +0300 Subject: [PATCH 422/901] - Fixed a logic error in AnimateAi which made the AI animate things like Plains via Genju of the Fields when the Plains was tapped, part 2. --- forge-ai/src/main/java/forge/ai/ability/AnimateAi.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 671b567c2af..61bb20e7b71 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java @@ -187,8 +187,8 @@ public class AnimateAi extends SpellAbilityAi { // (e.g. Myth Realized) if (animatedCopy.getCurrentPower() + animatedCopy.getCurrentToughness() > c.getCurrentPower() + c.getCurrentToughness()) { - if (!isAnimatedThisTurn(aiPlayer, sa.getHostCard())) { - if (!c.isTapped() || (game.getCombat() != null && game.getCombat().isAttacking(sa.getHostCard()))) { + if (!isAnimatedThisTurn(aiPlayer, c)) { + if (!c.isTapped() || (game.getCombat() != null && game.getCombat().isAttacking(c))) { bFlag = true; } } From c0806714fcf7982a51c73c527896a8bc0c304332 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 9 Dec 2018 14:51:38 +0300 Subject: [PATCH 423/901] - Fixed a logic error in AnimateAi which made the AI animate things like Plains via Genju of the Fields when the Plains was tapped, part 3. --- forge-ai/src/main/java/forge/ai/ability/AnimateAi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 61bb20e7b71..0537a2cf21f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java @@ -187,7 +187,7 @@ public class AnimateAi extends SpellAbilityAi { // (e.g. Myth Realized) if (animatedCopy.getCurrentPower() + animatedCopy.getCurrentToughness() > c.getCurrentPower() + c.getCurrentToughness()) { - if (!isAnimatedThisTurn(aiPlayer, c)) { + if (!isAnimatedThisTurn(aiPlayer, sa.getHostCard())) { if (!c.isTapped() || (game.getCombat() != null && game.getCombat().isAttacking(c))) { bFlag = true; } From 76331cb30c7bfbcef0f9b7a2b880375c088ebe1c Mon Sep 17 00:00:00 2001 From: Michael Kamensky Date: Sun, 9 Dec 2018 11:52:46 +0000 Subject: [PATCH 424/901] Fixed an AI logic error which caused the AI to attempt to animate tapped lands with Genju cards --- forge-ai/src/main/java/forge/ai/ability/AnimateAi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 494c10c10c8..0537a2cf21f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java @@ -188,7 +188,7 @@ public class AnimateAi extends SpellAbilityAi { if (animatedCopy.getCurrentPower() + animatedCopy.getCurrentToughness() > c.getCurrentPower() + c.getCurrentToughness()) { if (!isAnimatedThisTurn(aiPlayer, sa.getHostCard())) { - if (!sa.getHostCard().isTapped() || (game.getCombat() != null && game.getCombat().isAttacking(sa.getHostCard()))) { + if (!c.isTapped() || (game.getCombat() != null && game.getCombat().isAttacking(c))) { bFlag = true; } } From 976aa831e971f0768cf266153cfd7c742027e27b Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 9 Dec 2018 15:28:56 +0300 Subject: [PATCH 425/901] - Planar Conquest should always allow to see stats for the current plane, even if it's temporarily unreachable. --- .../src/forge/screens/planarconquest/ConquestStatsScreen.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestStatsScreen.java b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestStatsScreen.java index ee124970446..ca95bf4195c 100644 --- a/forge-gui-mobile/src/forge/screens/planarconquest/ConquestStatsScreen.java +++ b/forge-gui-mobile/src/forge/screens/planarconquest/ConquestStatsScreen.java @@ -53,7 +53,7 @@ public class ConquestStatsScreen extends FScreen implements IVConquestStats { cbPlanes.addItem("All Planes"); for (ConquestPlane plane : FModel.getPlanes()) { - if (!plane.isUnreachable()) { + if (!plane.isUnreachable() || FModel.getConquest().getModel().getCurrentPlane().equals(plane)) { cbPlanes.addItem(plane); } } From 5f71ee469457f2961ac723a3bff7c6381956d726 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 9 Dec 2018 16:57:10 +0300 Subject: [PATCH 426/901] - Fixed UntapAllAi not checking for the tapped state. --- forge-ai/src/main/java/forge/ai/ability/UntapAllAi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/UntapAllAi.java b/forge-ai/src/main/java/forge/ai/ability/UntapAllAi.java index 9c43797bcd5..a0166598ed1 100644 --- a/forge-ai/src/main/java/forge/ai/ability/UntapAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/UntapAllAi.java @@ -24,7 +24,7 @@ public class UntapAllAi extends SpellAbilityAi { return false; } String valid = ""; - CardCollectionView list = aiPlayer.getGame().getCardsIn(ZoneType.Battlefield); + CardCollectionView list = CardLists.filter(aiPlayer.getGame().getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.TAPPED); if (sa.hasParam("ValidCards")) { valid = sa.getParam("ValidCards"); } From d4a582e1d4ebe2e98166611025b58d37d063e1be Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 9 Dec 2018 17:18:22 +0300 Subject: [PATCH 427/901] - Preparing Forge for Android publish 1.6.19.002 [hotfix]. --- 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 01e57e88c43..3ba3a83286f 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -6,7 +6,7 @@ jar -Xms1024m -Xmx1536m - 1.6.19.001 + 1.6.19.002 keystore alias storepass diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index 38092d85331..7db3fff3431 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -6,7 +6,7 @@ jar -Xms128m -Xmx2048m - 1.6.19.001 + 1.6.19.002 diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index 89f79e3df58..c4619cf285e 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.19.001"; + public static final String CURRENT_VERSION = "1.6.19.002"; private static final ApplicationListener app = new Forge(); private static Clipboard clipboard; From 9669df5cb0b14d2f33df52dee87da8b69e2ba08c Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 9 Dec 2018 22:41:21 +0300 Subject: [PATCH 428/901] - Removed an extra copy of Nagao from a deck in Kamigawa plane. --- .../conquest/planes/Kamigawa/Towabara/Nagao, Bound by Honor.dck | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Nagao, Bound by Honor.dck b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Nagao, Bound by Honor.dck index b8cebf0d0c9..5a71b45d883 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Towabara/Nagao, Bound by Honor.dck +++ b/forge-gui/res/conquest/planes/Kamigawa/Towabara/Nagao, Bound by Honor.dck @@ -5,6 +5,7 @@ Name=Nagao, Bound by Honor [Main] 1 Araba Mothrider|SOK 1 Bushi Tenderfoot|CHK +1 Cage of Hands|CHK 1 Call to Glory|CHK 1 Devoted Retainer|CHK 1 Eiganjo Castle|CHK @@ -20,7 +21,6 @@ Name=Nagao, Bound by Honor 1 Konda's Banner|CHK 1 Konda's Hatamoto|CHK 1 Mothrider Samurai|CHK -1 Nagao, Bound by Honor|CHK 1 No-Dachi|CHK 1 O-Naginata|SOK 1 Oathkeeper, Takeno's Daisho|CHK From 56cdf52f0b282e8fce63b56729eb56fc0a95bdfe Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 10 Dec 2018 07:11:14 +0300 Subject: [PATCH 429/901] - AI Haste: grant to cards with affordable activated abilities with a tap cost. --- .../main/java/forge/ai/ComputerUtilCard.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index cbac89b2e0c..253c8ace216 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -21,6 +21,7 @@ import forge.game.ability.ApiType; import forge.game.card.*; import forge.game.combat.Combat; import forge.game.combat.CombatUtil; +import forge.game.cost.Cost; import forge.game.cost.CostPayEnergy; import forge.game.keyword.Keyword; import forge.game.keyword.KeywordCollection; @@ -1311,9 +1312,21 @@ public class ComputerUtilCard { //2. grant haste if (keywords.contains("Haste") && c.hasSickness() && !c.isTapped()) { - if (ComputerUtilCard.doesSpecifiedCreatureAttackAI(ai, pumped)) { - chance += 0.5f + (0.5f * ComputerUtilCombat.damageIfUnblocked(pumped, opp, combat, true) / opp.getLife()); + double baseChance = 0.0f; + // non-combat Haste: has an activated ability with tap cost + for (SpellAbility ab : c.getSpellAbilities()) { + Cost abCost = ab.getPayCosts(); + if (abCost != null && abCost.hasTapCost() + && (!abCost.hasManaCost() || ComputerUtilMana.canPayManaCost(ab, ai, 0))) { + baseChance += 0.5f; + } } + // combat Haste: only grant it if the creature will attack + if (ComputerUtilCard.doesSpecifiedCreatureAttackAI(ai, pumped)) { + if (baseChance < 0.5f) { baseChance = 0.5f; } + chance += 0.5f * ComputerUtilCombat.damageIfUnblocked(pumped, opp, combat, true) / opp.getLife(); + } + chance += baseChance; } //3. grant evasive From 027b912199c895c2c9efc49a077e5e7cf5a8fcd8 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 10 Dec 2018 07:47:14 +0300 Subject: [PATCH 430/901] - Refactored AI Haste chance calculation to make more sense. --- forge-ai/src/main/java/forge/ai/ComputerUtilCard.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index 253c8ace216..4931d5a1c34 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -1312,21 +1312,21 @@ public class ComputerUtilCard { //2. grant haste if (keywords.contains("Haste") && c.hasSickness() && !c.isTapped()) { - double baseChance = 0.0f; + double nonCombatChance = 0.0f; + double combatChance = 0.0f; // non-combat Haste: has an activated ability with tap cost for (SpellAbility ab : c.getSpellAbilities()) { Cost abCost = ab.getPayCosts(); if (abCost != null && abCost.hasTapCost() && (!abCost.hasManaCost() || ComputerUtilMana.canPayManaCost(ab, ai, 0))) { - baseChance += 0.5f; + nonCombatChance += 0.5f; } } // combat Haste: only grant it if the creature will attack if (ComputerUtilCard.doesSpecifiedCreatureAttackAI(ai, pumped)) { - if (baseChance < 0.5f) { baseChance = 0.5f; } - chance += 0.5f * ComputerUtilCombat.damageIfUnblocked(pumped, opp, combat, true) / opp.getLife(); + combatChance += 0.5f + (0.5f * ComputerUtilCombat.damageIfUnblocked(pumped, opp, combat, true) / opp.getLife()); } - chance += baseChance; + chance += nonCombatChance + combatChance; } //3. grant evasive From 38831e11bfbe51a6350b6286bf7d9cf111007668 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 10 Dec 2018 07:48:01 +0300 Subject: [PATCH 431/901] - Don't evaluate non-combat Haste more than once. --- forge-ai/src/main/java/forge/ai/ComputerUtilCard.java | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index 4931d5a1c34..af09e275ed6 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -1320,6 +1320,7 @@ public class ComputerUtilCard { if (abCost != null && abCost.hasTapCost() && (!abCost.hasManaCost() || ComputerUtilMana.canPayManaCost(ab, ai, 0))) { nonCombatChance += 0.5f; + break; } } // combat Haste: only grant it if the creature will attack From bc463d800c7dc5967b947e4feb4da894c7b5333f Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 10 Dec 2018 07:55:36 +0300 Subject: [PATCH 432/901] - Fixed Act of Heroism. --- forge-gui/res/cardsfolder/a/act_of_heroism.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/a/act_of_heroism.txt b/forge-gui/res/cardsfolder/a/act_of_heroism.txt index a579aee9405..2052d53734a 100644 --- a/forge-gui/res/cardsfolder/a/act_of_heroism.txt +++ b/forge-gui/res/cardsfolder/a/act_of_heroism.txt @@ -2,6 +2,6 @@ Name:Act of Heroism ManaCost:1 W Types:Instant A:SP$ Untap | Cost$ 1 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBPump | SpellDescription$ Untap target creature. It gets +2/+2 until end of turn and can block an additional creature this turn. -SVar:DBPump:DB$ Pump | Defined$ Targeted | NumAtt$ +2 | NumDef$ +2 | AddHiddenKeyword$ CARDNAME can block an additional creature each combat. +SVar:DBPump:DB$ Pump | Defined$ Targeted | NumAtt$ +2 | NumDef$ +2 | KW$ CARDNAME can block an additional creature each combat. SVar:Picture:http://www.wizards.com/global/images/magic/general/act_of_heroism.jpg Oracle:Untap target creature. It gets +2/+2 until end of turn and can block an additional creature this turn. From ea8e63d79ecb28a08766032f7cb64c2cbfb7ea04 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 10 Dec 2018 08:35:45 +0300 Subject: [PATCH 433/901] - Fix a regression which made it impossible to select lands under tapped lands by clicking on any of the lands in stack on mobile Forge. --- .../java/forge/match/input/InputPayMana.java | 44 ++++++++++++++----- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/forge-gui/src/main/java/forge/match/input/InputPayMana.java b/forge-gui/src/main/java/forge/match/input/InputPayMana.java index c0cdd42e0fc..809bf29ce0a 100644 --- a/forge-gui/src/main/java/forge/match/input/InputPayMana.java +++ b/forge-gui/src/main/java/forge/match/input/InputPayMana.java @@ -6,6 +6,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Queue; +import forge.GuiBase; import forge.game.GameActionUtil; import forge.game.spellability.SpellAbilityView; import forge.util.TextUtil; @@ -71,21 +72,40 @@ public abstract class InputPayMana extends InputSyncronizedBase { @Override protected boolean onCardSelected(final Card card, final List otherCardsToSelect, final ITriggerEvent triggerEvent) { - if (card.getManaAbilities().size() == 1) { - activateManaAbility(card, card.getManaAbilities().get(0)); + if (GuiBase.getInterface().isLibgdxPort()) { + // Mobile Forge allows to tap cards underneath the current card even if the current one is tapped + if (otherCardsToSelect != null) { + for (Card c : otherCardsToSelect) { + for (SpellAbility sa : c.getManaAbilities()) { + if (sa.canPlay()) { + delaySelectCards.add(c); + break; + } + } + } + } + if (!card.getManaAbilities().isEmpty() && activateManaAbility(card)) { + return true; + } + return activateDelayedCard(); } else { - SpellAbilityView spellAbilityView; - HashMap spellAbilityViewMap = new HashMap<>(); - for (SpellAbility sa : card.getManaAbilities()) { - spellAbilityViewMap.put(sa.getView(), sa); - } - List choices = new ArrayList<>(spellAbilityViewMap.keySet()); - spellAbilityView = getController().getGui().getAbilityToPlay(card.getView(), choices, triggerEvent); - if (spellAbilityView != null) { - activateManaAbility(card, spellAbilityViewMap.get(spellAbilityView)); + // Desktop Forge floating menu functionality + if (card.getManaAbilities().size() == 1) { + activateManaAbility(card, card.getManaAbilities().get(0)); + } else { + SpellAbilityView spellAbilityView; + HashMap spellAbilityViewMap = new HashMap<>(); + for (SpellAbility sa : card.getManaAbilities()) { + spellAbilityViewMap.put(sa.getView(), sa); + } + List choices = new ArrayList<>(spellAbilityViewMap.keySet()); + spellAbilityView = getController().getGui().getAbilityToPlay(card.getView(), choices, triggerEvent); + if (spellAbilityView != null) { + activateManaAbility(card, spellAbilityViewMap.get(spellAbilityView)); + } } + return true; } - return true; } @Override From 348f60a1eb04257bddad127d40e8bf08160411f5 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 10 Dec 2018 08:38:07 +0300 Subject: [PATCH 434/901] - Preparing Forge for Android publish 1.6.19.003 [hotfix]. --- 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 3ba3a83286f..563f719d6c9 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -6,7 +6,7 @@ jar -Xms1024m -Xmx1536m - 1.6.19.002 + 1.6.19.003 keystore alias storepass diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index 7db3fff3431..93a0250c242 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -6,7 +6,7 @@ jar -Xms128m -Xmx2048m - 1.6.19.002 + 1.6.19.003 diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index c4619cf285e..902526fe43a 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.19.002"; + public static final String CURRENT_VERSION = "1.6.19.003"; private static final ApplicationListener app = new Forge(); private static Clipboard clipboard; From 381a94a5e4f9ec1a0b8015ed4ae931ebdc184e74 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 10 Dec 2018 18:27:37 +0300 Subject: [PATCH 435/901] - Fixed the AI trying to pay for abilities it doesn't control, causing weird side effects and slowdowns. --- forge-ai/src/main/java/forge/ai/AiController.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 36bbf6542b8..30230fe9ee6 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -673,16 +673,16 @@ public class AiController { private AiPlayDecision canPlayAndPayFor(final SpellAbility sa) { boolean xCost = sa.getPayCosts().hasXInAnyCostPart(); + if (!sa.canPlay()) { + return AiPlayDecision.CantPlaySa; + } + if (!xCost && !ComputerUtilCost.canPayCost(sa, player)) { // for most costs, it's OK to check if they can be paid early in order to avoid running a heavy API check // when the AI won't even be able to play the spell in the first place (even if it could afford it) return AiPlayDecision.CantAfford; } - if (!sa.canPlay()) { - return AiPlayDecision.CantPlaySa; - } - AiPlayDecision canPlay = canPlaySa(sa); // this is the "heaviest" check, which also sets up targets, defines X, etc. if (canPlay != AiPlayDecision.WillPlay) { return canPlay; From bb825989a942c48bd491888adde1a3c1964c48f2 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 10 Dec 2018 18:30:14 +0300 Subject: [PATCH 436/901] - Preparing Forge for Android v1.6.19.004 [hotfix]. --- 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 563f719d6c9..4f266d3efc9 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -6,7 +6,7 @@ jar -Xms1024m -Xmx1536m - 1.6.19.003 + 1.6.19.004 keystore alias storepass diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index 93a0250c242..29d996ee1b3 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -6,7 +6,7 @@ jar -Xms128m -Xmx2048m - 1.6.19.003 + 1.6.19.004 diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index 902526fe43a..f854dbffcd5 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.19.003"; + public static final String CURRENT_VERSION = "1.6.19.004"; private static final ApplicationListener app = new Forge(); private static Clipboard clipboard; From 0be13468bc390dc3c51d6a083f0b13352fa12efd Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 10 Dec 2018 18:31:56 +0300 Subject: [PATCH 437/901] - Determine X Cost only if canPlay returns true. --- forge-ai/src/main/java/forge/ai/AiController.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 30230fe9ee6..5e777707bc8 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -671,12 +671,11 @@ public class AiController { // This is for playing spells regularly (no Cascade/Ripple etc.) private AiPlayDecision canPlayAndPayFor(final SpellAbility sa) { - boolean xCost = sa.getPayCosts().hasXInAnyCostPart(); - if (!sa.canPlay()) { return AiPlayDecision.CantPlaySa; } + boolean xCost = sa.getPayCosts().hasXInAnyCostPart(); if (!xCost && !ComputerUtilCost.canPayCost(sa, player)) { // for most costs, it's OK to check if they can be paid early in order to avoid running a heavy API check // when the AI won't even be able to play the spell in the first place (even if it could afford it) From dcd2fade4a19ffa30b092aa618f5814c2abebca6 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 10 Dec 2018 19:24:53 +0300 Subject: [PATCH 438/901] - Fixed Vaevictis Asmadi, the Dire AI targeting logic. --- .../src/main/java/forge/ai/ability/PumpAi.java | 15 +++++++++++++++ .../cardsfolder/v/vaevictis_asmadi_the_dire.txt | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java index 78d11c5cd30..90f5e2a02a7 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java @@ -481,6 +481,21 @@ public class PumpAi extends PumpAiBase { } else if (sa.getParam("AILogic").equals("DonateTargetPerm")) { // Donate step 2 - target a donatable permanent. return SpecialCardAi.Donate.considerDonatingPermanent(ai, sa); + } else if (sa.getParam("AILogic").equals("SacOneEach")) { + // each player sacrifices one permanent, e.g. Vaevictis, Asmadi the Dire - grab the worst for allied and + // the best for opponents + sa.resetTargets(); + for (Player p : game.getPlayers()) { + CardCollection targetable = CardLists.filter(p.getCardsIn(ZoneType.Battlefield), CardPredicates.isTargetableBy(sa)); + if (!targetable.isEmpty()) { + if (p.isOpponentOf(ai)) { + sa.getTargets().add(ComputerUtilCard.getBestAI(targetable)); + } else { + sa.getTargets().add(ComputerUtilCard.getWorstAI(targetable)); + } + } + } + return true; } if (isFight) { return FightAi.canFightAi(ai, sa, attack, defense); diff --git a/forge-gui/res/cardsfolder/v/vaevictis_asmadi_the_dire.txt b/forge-gui/res/cardsfolder/v/vaevictis_asmadi_the_dire.txt index d7dfe53b72b..b98c46183dd 100644 --- a/forge-gui/res/cardsfolder/v/vaevictis_asmadi_the_dire.txt +++ b/forge-gui/res/cardsfolder/v/vaevictis_asmadi_the_dire.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Elder Dragon PT:6/6 K:Flying T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigTarget | TriggerDescription$ Whenever CARDNAME attacks, for each player, choose target permanent that player controls. Those players sacrifice those permanents. Each player who sacrificed a permanent this way reveals the top card of their library, then puts it onto the battlefield if it's a permanent card. -SVar:TrigTarget:DB$ Pump | ValidTgts$ Permanent | TgtPrompt$ Select target permanent a players controls to be sacrificed. | TargetMin$ OneEach | TargetMax$ OneEach | References$ OneEach | TargetsWithDifferentControllers$ True | SubAbility$ DBSacrificeAll +SVar:TrigTarget:DB$ Pump | ValidTgts$ Permanent | TgtPrompt$ Select target permanent a player controls to be sacrificed. | TargetMin$ OneEach | TargetMax$ OneEach | References$ OneEach | TargetsWithDifferentControllers$ True | SubAbility$ DBSacrificeAll | AILogic$ SacOneEach SVar:DBSacrificeAll:DB$ SacrificeAll | Defined$ Targeted | RememberSacrificed$ True | SubAbility$ DBRepeatEach SVar:DBRepeatEach:DB$ RepeatEach | DefinedCards$ Remembered | UseImprinted$ True | RepeatSubAbility$ DBDig | SubAbility$ DBCleanup SVar:DBDig:DB$ Dig | Defined$ ImprintedController | DigNum$ 1 | Reveal$ True | DestinationZone$ Battlefield | DestinationZone2$ Library | LibraryPosition2$ 0 | ChangeNum$ All | ChangeValid$ Permanent From ec1566f169b117eb3fbce8c2eaf3154feb23b605 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 10 Dec 2018 20:02:38 +0300 Subject: [PATCH 439/901] - Somewhat more detailed logic for allied sac on Vaevictis. --- forge-ai/src/main/java/forge/ai/ability/PumpAi.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java index 90f5e2a02a7..6270bf05049 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java @@ -491,7 +491,17 @@ public class PumpAi extends PumpAiBase { if (p.isOpponentOf(ai)) { sa.getTargets().add(ComputerUtilCard.getBestAI(targetable)); } else { - sa.getTargets().add(ComputerUtilCard.getWorstAI(targetable)); + CardCollection priorityTgts = new CardCollection(); + for (Card c : targetable) { + if (c.hasSVar("SacMe") || (c.isCreature() && ComputerUtilCard.evaluateCreature(c) <= 135)) { + priorityTgts.add(c); + } + } + if (!priorityTgts.isEmpty()) { + sa.getTargets().add(priorityTgts.getFirst()); + } else { + sa.getTargets().add(ComputerUtilCard.getWorstPermanentAI(targetable, true, true, true, false)); + } } } } From 9fec411bd5aec118b9b9fbb0658dcdb1c7d4fd55 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 10 Dec 2018 20:24:53 +0300 Subject: [PATCH 440/901] - More logic for Vaevictis. --- forge-ai/src/main/java/forge/ai/ability/PumpAi.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java index 6270bf05049..cc7e82b6501 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java @@ -493,14 +493,19 @@ public class PumpAi extends PumpAiBase { } else { CardCollection priorityTgts = new CardCollection(); for (Card c : targetable) { - if (c.hasSVar("SacMe") || (c.isCreature() && ComputerUtilCard.evaluateCreature(c) <= 135)) { + if (c.canBeSacrificed() && (c.hasSVar("SacMe") || (c.isCreature() && ComputerUtilCard.evaluateCreature(c) <= 135)) && !c.equals(sa.getHostCard())) { priorityTgts.add(c); } } if (!priorityTgts.isEmpty()) { sa.getTargets().add(priorityTgts.getFirst()); } else { - sa.getTargets().add(ComputerUtilCard.getWorstPermanentAI(targetable, true, true, true, false)); + targetable.remove(sa.getHostCard()); + if (!targetable.isEmpty()) { + sa.getTargets().add(ComputerUtilCard.getWorstPermanentAI(targetable, true, true, true, false)); + } else { + sa.getTargets().add(sa.getHostCard()); // sac self only as a last resort + } } } } From d362f275e5223d73994df9ee4dd50ed58321aef1 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 11 Dec 2018 08:35:01 +0300 Subject: [PATCH 441/901] - More logic for Vaevictis, moved the relevant logic to SacrificeAi for clarity, only called from Pump now. --- .../main/java/forge/ai/ability/PumpAi.java | 28 +------------ .../java/forge/ai/ability/SacrificeAi.java | 39 +++++++++++++++++++ 2 files changed, 40 insertions(+), 27 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java index cc7e82b6501..fc824738fb9 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java @@ -484,33 +484,7 @@ public class PumpAi extends PumpAiBase { } else if (sa.getParam("AILogic").equals("SacOneEach")) { // each player sacrifices one permanent, e.g. Vaevictis, Asmadi the Dire - grab the worst for allied and // the best for opponents - sa.resetTargets(); - for (Player p : game.getPlayers()) { - CardCollection targetable = CardLists.filter(p.getCardsIn(ZoneType.Battlefield), CardPredicates.isTargetableBy(sa)); - if (!targetable.isEmpty()) { - if (p.isOpponentOf(ai)) { - sa.getTargets().add(ComputerUtilCard.getBestAI(targetable)); - } else { - CardCollection priorityTgts = new CardCollection(); - for (Card c : targetable) { - if (c.canBeSacrificed() && (c.hasSVar("SacMe") || (c.isCreature() && ComputerUtilCard.evaluateCreature(c) <= 135)) && !c.equals(sa.getHostCard())) { - priorityTgts.add(c); - } - } - if (!priorityTgts.isEmpty()) { - sa.getTargets().add(priorityTgts.getFirst()); - } else { - targetable.remove(sa.getHostCard()); - if (!targetable.isEmpty()) { - sa.getTargets().add(ComputerUtilCard.getWorstPermanentAI(targetable, true, true, true, false)); - } else { - sa.getTargets().add(sa.getHostCard()); // sac self only as a last resort - } - } - } - } - } - return true; + return SacrificeAi.doSacOneEachLogic(ai, sa); } if (isFight) { return FightAi.canFightAi(ai, sa, attack, defense); 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 4cef29c7ef5..97ebb3004df 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java @@ -4,8 +4,10 @@ import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCard; import forge.ai.ComputerUtilMana; import forge.ai.SpellAbilityAi; +import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.card.Card; +import forge.game.card.CardCollection; import forge.game.card.CardLists; import forge.game.card.CardPredicates; import forge.game.keyword.Keyword; @@ -157,4 +159,41 @@ public class SacrificeAi extends SpellAbilityAi { return true; } + public static boolean doSacOneEachLogic(Player ai, SpellAbility sa) { + Game game = ai.getGame(); + + sa.resetTargets(); + for (Player p : game.getPlayers()) { + CardCollection targetable = CardLists.filter(p.getCardsIn(ZoneType.Battlefield), CardPredicates.isTargetableBy(sa)); + if (!targetable.isEmpty()) { + CardCollection priorityTgts = new CardCollection(); + if (p.isOpponentOf(ai)) { + priorityTgts.addAll(CardLists.filter(targetable, CardPredicates.canBeSacrificedBy(sa))); + if (!priorityTgts.isEmpty()) { + sa.getTargets().add(ComputerUtilCard.getBestAI(priorityTgts)); + } else { + sa.getTargets().add(ComputerUtilCard.getBestAI(targetable)); + } + } else { + for (Card c : targetable) { + if (c.canBeSacrificedBy(sa) && (c.hasSVar("SacMe") || (c.isCreature() && ComputerUtilCard.evaluateCreature(c) <= 135)) && !c.equals(sa.getHostCard())) { + priorityTgts.add(c); + } + } + if (!priorityTgts.isEmpty()) { + sa.getTargets().add(ComputerUtilCard.getWorstPermanentAI(priorityTgts, false, false, false, false)); + } else { + targetable.remove(sa.getHostCard()); + if (!targetable.isEmpty()) { + sa.getTargets().add(ComputerUtilCard.getWorstPermanentAI(targetable, true, true, true, false)); + } else { + sa.getTargets().add(sa.getHostCard()); // sac self only as a last resort + } + } + } + } + } + return true; + } + } From 35a7af2a5e4e361e7fd50c3fb9b0cd2d1165b974 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 11 Dec 2018 08:36:59 +0300 Subject: [PATCH 442/901] - Fixed Hollow One cost reduction (currently uses a fixed check on PropertyYou, not sure how to make it work better since it's not coming from a SpellAbility with checkable activator). --- .../src/main/java/forge/game/ability/AbilityUtils.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index dec83a646c8..dd5503e5b79 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -472,10 +472,16 @@ public class AbilityUtils { players.remove(game.getPhaseHandler().getPlayerTurn()); val = CardFactoryUtil.playerXCount(players, calcX[1], card); } + else if (hType.startsWith("PropertyYou")) { + // Related to the controller of the card with ability, works for all kinds of abilities, e.g. static (Hollow One), + // as opposed to the generic one below which only works for SpellAbilities + players.add(card.getController()); + val = CardFactoryUtil.playerXCount(players, calcX[1], card); + } else if (hType.startsWith("Property") && ability instanceof SpellAbility) { String defined = hType.split("Property")[1]; for (Player p : game.getPlayersInTurnOrder()) { - if (p.hasProperty(defined, ((SpellAbility)ability).getActivatingPlayer(), ability.getHostCard(), (SpellAbility)ability)) { + if (p.hasProperty(defined, ((SpellAbility) ability).getActivatingPlayer(), ability.getHostCard(), (SpellAbility) ability)) { players.add(p); } } From 366c836d3a1a7cdb2837cbb529da68d809fcaeaa Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 11 Dec 2018 08:38:37 +0300 Subject: [PATCH 443/901] - Make the local check for Hollow One work for static abilities only. --- .../src/main/java/forge/game/ability/AbilityUtils.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index dd5503e5b79..2eb8da9bacf 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -472,9 +472,8 @@ public class AbilityUtils { players.remove(game.getPhaseHandler().getPlayerTurn()); val = CardFactoryUtil.playerXCount(players, calcX[1], card); } - else if (hType.startsWith("PropertyYou")) { - // Related to the controller of the card with ability, works for all kinds of abilities, e.g. static (Hollow One), - // as opposed to the generic one below which only works for SpellAbilities + else if (hType.startsWith("PropertyYou") && !(ability instanceof SpellAbility)) { + // Related to the controller of the card with ability when the ability is static (or otherwise not a SpellAbility) players.add(card.getController()); val = CardFactoryUtil.playerXCount(players, calcX[1], card); } From 5695e7295009678146fc8418a418cee1f5b323d0 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 11 Dec 2018 13:51:38 +0300 Subject: [PATCH 444/901] - Added puzzle PS_GRND (Guilds of Ravnica: How much damage can you deal?) --- forge-gui/res/puzzle/PS_GRND.pzl | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 forge-gui/res/puzzle/PS_GRND.pzl diff --git a/forge-gui/res/puzzle/PS_GRND.pzl b/forge-gui/res/puzzle/PS_GRND.pzl new file mode 100644 index 00000000000..077730ac138 --- /dev/null +++ b/forge-gui/res/puzzle/PS_GRND.pzl @@ -0,0 +1,18 @@ +[metadata] +Name:Possibility Storm - Guilds of Ravnica Special (How much damage can you deal?) +URL:https://www.flexiquiz.com/Uploads/Questions/s2bb84d22-1f95-4d3b-807a-f4e42c8c32ac_q47f2399d-9c48-4354-ae23-b1605ed3559c +Goal:Win +Turns:1 +Difficulty:Special +Description:Start the puzzle at the beginning of your main phase, and deal as MUCH DAMAGE AS POSSIBLE RAAARGGH!!1 Assume you have access to unlimited mana of any color. Go nuts! (Note that for the purpose of this Forge implementation, you will be given 999 mana of every type and color, which is not unlimited, but plenty. This mana does not empty from your mana pool as phases end). There are nine cards in your graveyard. Assume your opponent's graveyard is empty. Assume you start this puzzle with 20 life. +[state] +humanlife=20 +ailife=1 +turn=1 +humanpersistentmana=W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C +activeplayer=human +activephase=MAIN1 +humanhand=Legion Warboss;Kwende, Pride of Femeref;Switcheroo;Buccaneer's Bravado +humangraveyard=Adanto Vanguard;Isareth the Awakener;Siege-Gang Commander;Vigorspore Wurm;Truefire Captain;Ochran Assassin;Lazav, the Multifarious;Whisper, Blood Liturgist;Swiftblade Vindicator +humanbattlefield=Lazav, the Multifarious;t:Goblin,P:1,T:1,Cost:no cost,Color:R,Types:Creature-Goblin,Keywords:,Image:r_1_1_goblin_grn;t:Goblin,P:1,T:1,Cost:no cost,Color:R,Types:Creature-Goblin,Keywords:,Image:r_1_1_goblin_grn +aibattlefield=Zetalpa, Primal Dawn;Angrath's Marauders;Goblin Chainwhirler;Garna, the Bloodflame From 16aca8150815b366ca66a195af714e5eb89d8f30 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 11 Dec 2018 13:54:33 +0300 Subject: [PATCH 445/901] - Added a TODO entry for future rework. --- forge-game/src/main/java/forge/game/ability/AbilityUtils.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index 2eb8da9bacf..22b4bba4797 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -474,6 +474,9 @@ public class AbilityUtils { } else if (hType.startsWith("PropertyYou") && !(ability instanceof SpellAbility)) { // Related to the controller of the card with ability when the ability is static (or otherwise not a SpellAbility) + // TODO: This doesn't work in situations when the controller of the card is different from the spell caster + // (e.g. opponent's Hollow One exiled by Hostage Taker - cost reduction will not work in this scenario, requires + // a more significant rework). players.add(card.getController()); val = CardFactoryUtil.playerXCount(players, calcX[1], card); } From 685a0daa71b9e08fa614a3402bcd2f28f2234ce0 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 10 Dec 2018 18:26:16 +0300 Subject: [PATCH 446/901] - Basic implementation for chaining two damage spells, supports damage+damage or damage+debuff. --- .../src/main/java/forge/ai/AiCardMemory.java | 5 ++ .../src/main/java/forge/ai/AiController.java | 48 +++++++++---- .../java/forge/ai/ComputerUtilAbility.java | 67 +++++++++++++++++++ .../main/java/forge/ai/ComputerUtilMana.java | 5 ++ .../java/forge/ai/ability/DamageDealAi.java | 25 ++++++- 5 files changed, 134 insertions(+), 16 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiCardMemory.java b/forge-ai/src/main/java/forge/ai/AiCardMemory.java index 47909f5e2e5..a94287e549e 100644 --- a/forge-ai/src/main/java/forge/ai/AiCardMemory.java +++ b/forge-ai/src/main/java/forge/ai/AiCardMemory.java @@ -51,6 +51,7 @@ public class AiCardMemory { HELD_MANA_SOURCES_FOR_MAIN2, // These mana sources will not be used before Main 2 HELD_MANA_SOURCES_FOR_DECLBLK, // These mana sources will not be used before Combat - Declare Blockers HELD_MANA_SOURCES_FOR_ENEMY_DECLBLK, // These mana sources will not be used before the opponent's Combat - Declare Blockers + HELD_MANA_SOURCES_FOR_NEXT_PRIORITY, // These mana sources will not be used until the next time the AI receives priority ATTACHED_THIS_TURN, // These equipments were attached to something already this turn ANIMATED_THIS_TURN, // These cards had their AF Animate effect activated this turn BOUNCED_THIS_TURN, // These cards were bounced this turn @@ -65,6 +66,7 @@ public class AiCardMemory { private final Set memHeldManaSources; private final Set memHeldManaSourcesForCombat; private final Set memHeldManaSourcesForEnemyCombat; + private final Set memHeldManaSourcesForNextPriority; private final Set memAttachedThisTurn; private final Set memAnimatedThisTurn; private final Set memBouncedThisTurn; @@ -84,6 +86,7 @@ public class AiCardMemory { this.memTrickAttackers = new HashSet<>(); this.memChosenFogEffect = new HashSet<>(); this.memMarkedToAvoidReentry = new HashSet<>(); + this.memHeldManaSourcesForNextPriority = new HashSet<>(); } private Set getMemorySet(MemorySet set) { @@ -98,6 +101,8 @@ public class AiCardMemory { return memHeldManaSourcesForCombat; case HELD_MANA_SOURCES_FOR_ENEMY_DECLBLK: return memHeldManaSourcesForEnemyCombat; + case HELD_MANA_SOURCES_FOR_NEXT_PRIORITY: + return memHeldManaSourcesForNextPriority; case ATTACHED_THIS_TURN: return memAttachedThisTurn; case ANIMATED_THIS_TURN: diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 5e777707bc8..bf60b900916 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -630,31 +630,48 @@ public class AiController { } public boolean reserveManaSources(SpellAbility sa) { - return reserveManaSources(sa, PhaseType.MAIN2, false); + return reserveManaSources(sa, PhaseType.MAIN2, false, false, null); + } + + public boolean reserveManaSourcesTillNextPriority(SpellAbility sa, SpellAbility exceptForSa) { + return reserveManaSources(sa, null, false, true, exceptForSa); } public boolean reserveManaSources(SpellAbility sa, PhaseType phaseType, boolean enemy) { + return reserveManaSources(sa, phaseType, enemy, true, null); + } + + public boolean reserveManaSources(SpellAbility sa, PhaseType phaseType, boolean enemy, boolean nextPriority, SpellAbility exceptForThisSa) { ManaCostBeingPaid cost = ComputerUtilMana.calculateManaCost(sa, true, 0); CardCollection manaSources = ComputerUtilMana.getManaSourcesToPayCost(cost, sa, player); + // used for chained spells where two spells need to be cast in succession + if (exceptForThisSa != null) { + manaSources.removeAll(ComputerUtilMana.getManaSourcesToPayCost(ComputerUtilMana.calculateManaCost(exceptForThisSa, true, 0), exceptForThisSa, player)); + } + if (manaSources.isEmpty()) { return false; } AiCardMemory.MemorySet memSet; - switch (phaseType) { - case MAIN2: - memSet = AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_MAIN2; - break; - case COMBAT_DECLARE_BLOCKERS: - memSet = enemy ? AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_ENEMY_DECLBLK - : AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_DECLBLK; - break; - default: - System.out.println("Warning: unsupported mana reservation phase specified for reserveManaSources: " - + phaseType.name() + ", reserving until Main 2 instead. Consider adding support for the phase if needed."); - memSet = AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_MAIN2; - break; + if (phaseType == null && nextPriority) { + memSet = AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_NEXT_PRIORITY; + } else { + switch (phaseType) { + case MAIN2: + memSet = AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_MAIN2; + break; + case COMBAT_DECLARE_BLOCKERS: + memSet = enemy ? AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_ENEMY_DECLBLK + : AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_DECLBLK; + break; + default: + System.out.println("Warning: unsupported mana reservation phase specified for reserveManaSources: " + + phaseType.name() + ", reserving until Main 2 instead. Consider adding support for the phase if needed."); + memSet = AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_MAIN2; + break; + } } // This is a simplification, since one mana source can produce more than one mana, @@ -1317,6 +1334,9 @@ public class AiController { // re-created if needed and used for any AI logic that needs it. predictedCombat = null; + // Reset priority mana reservation + AiCardMemory.clearMemorySet(player, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_NEXT_PRIORITY); + if (useSimulation) { return singleSpellAbilityList(simPicker.chooseSpellAbilityToPlay(null)); } diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java index b1df18b97ce..aaf6bbae40c 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java @@ -7,6 +7,7 @@ import com.google.common.base.Predicate; import com.google.common.collect.Lists; import forge.card.CardStateName; +import forge.card.mana.ManaCost; import forge.game.Game; import forge.game.GameActionUtil; import forge.game.ability.ApiType; @@ -15,10 +16,15 @@ import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; import forge.game.card.CardLists; import forge.game.card.CardPredicates.Presets; +import forge.game.cost.Cost; +import forge.game.cost.CostPartMana; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbilityStackInstance; +import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.Pair; public class ComputerUtilAbility { public static CardCollection getAvailableLandsToPlay(final Game game, final Player player) { @@ -182,4 +188,65 @@ public class ComputerUtilAbility { return targeted; } + + public static Pair getDamageAfterChainingSpells(Player ai, SpellAbility sa, String damage) { + if (sa.getSubAbility() != null || sa.getParent() != null) { + // Doesn't work yet for complex decisions where damage is only a part of the decision process + return null; + } + + // Try to chain damage/debuff effects + if (StringUtils.isNumeric(damage) || (damage.startsWith("-") && StringUtils.isNumeric(damage.substring(1)))) { + // currently only works for predictable numeric damage + CardCollection cards = new CardCollection(); + cards.addAll(ai.getCardsIn(ZoneType.Hand)); + cards.addAll(ai.getCardsIn(ZoneType.Battlefield)); + cards.addAll(ai.getCardsActivableInExternalZones(true)); + for (Card c : cards) { + for (SpellAbility ab : c.getSpellAbilities()) { + if (ab.equals(sa) || ab.getSubAbility() != null) { // decisions for complex SAs with subs are not supported yet + continue; + } + // currently works only with cards that don't have additional costs (only mana is supported) + if (ab.getPayCosts() != null && (ab.getPayCosts().hasNoManaCost() || ab.getPayCosts().hasOnlySpecificCostType(CostPartMana.class))) { + String dmgDef = "0"; + if (ab.getApi() == ApiType.DealDamage) { + dmgDef = ab.getParamOrDefault("NumDmg", "0"); + } else if (ab.getApi() == ApiType.Pump) { + dmgDef = ab.getParamOrDefault("NumDef", "0"); + if (dmgDef.startsWith("-")) { + dmgDef = dmgDef.substring(1); + } else { + continue; // not a toughness debuff + } + } + if (StringUtils.isNumeric(dmgDef) && ab.canPlay()) { // currently doesn't work for X and other dependent costs + if (sa.usesTargeting() && ab.usesTargeting()) { + // Ensure that the chained spell can target at least the same things (or more) as the current one + TargetRestrictions tgtSa = sa.getTargetRestrictions(); + TargetRestrictions tgtAb = sa.getTargetRestrictions(); + if (tgtSa.canTgtCreature() && !tgtAb.canTgtCreature()) { + continue; + } else if (tgtSa.canTgtPlaneswalker() && !tgtAb.canTgtPlaneswalker()) { + continue; + } + // FIXME: should it also check restrictions for targeting players? + ManaCost costSa = sa.getPayCosts() != null ? sa.getPayCosts().getTotalMana() : ManaCost.NO_COST; + ManaCost costAb = ab.getPayCosts().getTotalMana(); // checked for null above + ManaCost total = ManaCost.combine(costSa, costAb); + SpellAbility combinedAb = ab.copyWithDefinedCost(new Cost(total, false)); + // can we pay both costs? + if (ComputerUtilMana.canPayManaCost(combinedAb, ai, 0)) { + //aic.reserveManaSourcesTillNextPriority(ab); // reserve mana for the second spell + return Pair.of(ab, Integer.parseInt(dmgDef)); + } + } + } + } + } + } + } + + return null; + } } diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java index 1330e32a0f3..9bbdc3a56a6 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java @@ -856,6 +856,11 @@ public class ComputerUtilMana { AiController aic = ((PlayerControllerAi)ai.getController()).getAi(); int chanceToReserve = aic.getIntProperty(AiProps.RESERVE_MANA_FOR_MAIN2_CHANCE); + // Mana reserved for spell synchronization + if (AiCardMemory.isRememberedCard(ai, sourceCard, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_NEXT_PRIORITY)) { + return true; + } + PhaseType curPhase = ai.getGame().getPhaseHandler().getPhase(); // For combat tricks, always obey mana reservation 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 f3ca5cecf38..9cc402cd28b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -21,6 +21,7 @@ import forge.game.spellability.TargetChoices; import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; import forge.util.Aggregates; +import org.apache.commons.lang3.tuple.Pair; import java.util.List; import java.util.Map; @@ -195,6 +196,9 @@ public class DamageDealAi extends DamageAiBase { return false; } + // Try to chain damage/debuff effects + Pair chainDmg = ComputerUtilAbility.getDamageAfterChainingSpells(ai, sa, damage); + // temporarily disabled until better AI if (!ComputerUtilCost.checkLifeCost(ai, abCost, source, 4, sa)) { return false; @@ -216,8 +220,24 @@ public class DamageDealAi extends DamageAiBase { return false; } - if (!this.damageTargetAI(ai, sa, dmg, false)) { - return false; + // test what happens if we chain this to another damaging spell + if (chainDmg != null && ai.getController().isAI()) { + int extraDmg = chainDmg.getValue(); + if (!this.damageTargetAI(ai, sa, dmg + extraDmg, false)) { + return false; // won't play it even in chain + } else { + // we are about to decide to play this damage spell; if there's something chained to it, reserve mana for + // the second spell so we don't misplay + if (chainDmg != null && ai.getController().isAI()) { + AiController aic = ((PlayerControllerAi)ai.getController()).getAi(); + aic.reserveManaSourcesTillNextPriority(chainDmg.getKey(), sa); + } + } + } else { + // simple targeting when there is no spell chaining plan + if (!this.damageTargetAI(ai, sa, dmg, false)) { + return false; + } } if ((damage.equals("X") && source.getSVar(damage).equals("Count$xPaid")) || @@ -238,6 +258,7 @@ public class DamageDealAi extends DamageAiBase { source.setSVar("PayX", Integer.toString(actualPay)); } } + return true; } From cb29ae319e8528d31f22b36db419a301d82b9a0b Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 10 Dec 2018 19:37:26 +0300 Subject: [PATCH 447/901] - Added an experimental AI property controlling damage chaining. --- forge-ai/src/main/java/forge/ai/AiProps.java | 3 ++- forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java | 6 ++++++ forge-gui/res/ai/Experimental.ai | 5 +++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/AiProps.java b/forge-ai/src/main/java/forge/ai/AiProps.java index 1f8b56a9720..ae344feaf1c 100644 --- a/forge-ai/src/main/java/forge/ai/AiProps.java +++ b/forge-ai/src/main/java/forge/ai/AiProps.java @@ -126,9 +126,10 @@ public enum AiProps { /** */ FLASH_USE_BUFF_AURAS_AS_COMBAT_TRICKS("true"), FLASH_BUFF_AURA_CHANCE_TO_CAST_EARLY("1"), FLASH_BUFF_AURA_CHANCE_CAST_AT_EOT("5"), - FLASH_BUFF_AURA_CHANCE_TO_RESPOND_TO_STACK("100"); /** */ + FLASH_BUFF_AURA_CHANCE_TO_RESPOND_TO_STACK("100"), /** */ // Experimental features, must be promoted or removed after extensive testing and, ideally, defaulting // <-- There are no experimental options here --> + CHANCE_TO_CHAIN_TWO_DAMAGE_SPELLS("0"); /** */ private final String strDefaultVal; diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java index aaf6bbae40c..a79418b623b 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java @@ -23,6 +23,7 @@ import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbilityStackInstance; import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; +import forge.util.MyRandom; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; @@ -190,6 +191,11 @@ public class ComputerUtilAbility { } public static Pair getDamageAfterChainingSpells(Player ai, SpellAbility sa, String damage) { + int chance = ((PlayerControllerAi)ai.getController()).getAi().getIntProperty(AiProps.CHANCE_TO_CHAIN_TWO_DAMAGE_SPELLS); + if (!MyRandom.percentTrue(chance)) { + return null; + } + if (sa.getSubAbility() != null || sa.getParent() != null) { // Doesn't work yet for complex decisions where damage is only a part of the decision process return null; diff --git a/forge-gui/res/ai/Experimental.ai b/forge-gui/res/ai/Experimental.ai index 5b9048770f5..48b4e967fe9 100644 --- a/forge-gui/res/ai/Experimental.ai +++ b/forge-gui/res/ai/Experimental.ai @@ -277,3 +277,8 @@ MOJHOSTO_CHANCE_TO_USE_JHOIRA_COPY_INSTANT=20 # -- different name if necessary -- # <-- there are no experimental options here at the moment --> + +# The chance that the AI will try to chain two damage spells or a damage spell and a debuffing pump spell to try to +# kill a bigger creature or a planeswalker. +CHANCE_TO_CHAIN_TWO_DAMAGE_SPELLS=100 + From 45abd2f3c9a41b1bb94ff7627883971e5a1bbb25 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 11 Dec 2018 15:12:41 +0300 Subject: [PATCH 448/901] - Tweaking a method name. --- forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java | 5 ++++- forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java index a79418b623b..057dc96252a 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java @@ -190,7 +190,10 @@ public class ComputerUtilAbility { return targeted; } - public static Pair getDamageAfterChainingSpells(Player ai, SpellAbility sa, String damage) { + // Returns a pair of a SpellAbility (APIType DealDamage or Pump) and damage/debuff amount + // The returned spell ability can be chained to "sa" to deal more damage (enough mana is available to cast both + // and can be properly reserved). + public static Pair getDamagingSAToChain(Player ai, SpellAbility sa, String damage) { int chance = ((PlayerControllerAi)ai.getController()).getAi().getIntProperty(AiProps.CHANCE_TO_CHAIN_TWO_DAMAGE_SPELLS); if (!MyRandom.percentTrue(chance)) { return null; 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 9cc402cd28b..6f49103fe14 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -197,7 +197,7 @@ public class DamageDealAi extends DamageAiBase { } // Try to chain damage/debuff effects - Pair chainDmg = ComputerUtilAbility.getDamageAfterChainingSpells(ai, sa, damage); + Pair chainDmg = ComputerUtilAbility.getDamagingSAToChain(ai, sa, damage); // temporarily disabled until better AI if (!ComputerUtilCost.checkLifeCost(ai, abCost, source, 4, sa)) { From 2b4838a15f69c2041bfb6892e4ad24e00087d4da Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 11 Dec 2018 21:06:59 +0300 Subject: [PATCH 449/901] - Removed a commented out line (mana is reserved elsewhere). --- forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java index 057dc96252a..69a58434b2f 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java @@ -246,7 +246,6 @@ public class ComputerUtilAbility { SpellAbility combinedAb = ab.copyWithDefinedCost(new Cost(total, false)); // can we pay both costs? if (ComputerUtilMana.canPayManaCost(combinedAb, ai, 0)) { - //aic.reserveManaSourcesTillNextPriority(ab); // reserve mana for the second spell return Pair.of(ab, Integer.parseInt(dmgDef)); } } From ac0181583728812d7c57cc5b0beb11ce19686d73 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 11 Dec 2018 22:06:56 +0300 Subject: [PATCH 450/901] - Fixed Desecrated Tomb. --- forge-gui/res/cardsfolder/d/desecrated_tomb.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/d/desecrated_tomb.txt b/forge-gui/res/cardsfolder/d/desecrated_tomb.txt index d5e17a434fd..43405369c52 100644 --- a/forge-gui/res/cardsfolder/d/desecrated_tomb.txt +++ b/forge-gui/res/cardsfolder/d/desecrated_tomb.txt @@ -1,7 +1,7 @@ Name:Desecrated Tomb ManaCost:3 Types:Artifact -T:Mode$ ChangesZoneAll | Origin$ Graveyard | Destination$ Any | ValidCards$ Creature.YouOwn | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ Whenever one or more creature cards leave your graveyard, create a 1/1 black Bat creature token with flying. +T:Mode$ ChangesZone | ValidCard$ Creature.YouOwn | OncePerEffect$ True | Origin$ Graveyard | Destination$ Any | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever one or more creature cards leave your graveyard, create a 1/1 black Bat creature token with flying. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ b_1_1_bat_flying | LegacyImage$ b 1 1 bat M19 | TokenOwner$ You DeckHints:Ability$Graveyard DeckHas:Ability$Token From c79ed8b609b1e2201cddb6b7d242e37db70bc3d4 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 10 Dec 2018 18:26:16 +0300 Subject: [PATCH 451/901] - Basic implementation for chaining two damage spells, supports damage+damage or damage+debuff. --- .../src/main/java/forge/ai/AiCardMemory.java | 5 ++ .../src/main/java/forge/ai/AiController.java | 48 +++++++++---- .../java/forge/ai/ComputerUtilAbility.java | 67 +++++++++++++++++++ .../main/java/forge/ai/ComputerUtilMana.java | 5 ++ .../java/forge/ai/ability/DamageDealAi.java | 25 ++++++- 5 files changed, 134 insertions(+), 16 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiCardMemory.java b/forge-ai/src/main/java/forge/ai/AiCardMemory.java index 47909f5e2e5..a94287e549e 100644 --- a/forge-ai/src/main/java/forge/ai/AiCardMemory.java +++ b/forge-ai/src/main/java/forge/ai/AiCardMemory.java @@ -51,6 +51,7 @@ public class AiCardMemory { HELD_MANA_SOURCES_FOR_MAIN2, // These mana sources will not be used before Main 2 HELD_MANA_SOURCES_FOR_DECLBLK, // These mana sources will not be used before Combat - Declare Blockers HELD_MANA_SOURCES_FOR_ENEMY_DECLBLK, // These mana sources will not be used before the opponent's Combat - Declare Blockers + HELD_MANA_SOURCES_FOR_NEXT_PRIORITY, // These mana sources will not be used until the next time the AI receives priority ATTACHED_THIS_TURN, // These equipments were attached to something already this turn ANIMATED_THIS_TURN, // These cards had their AF Animate effect activated this turn BOUNCED_THIS_TURN, // These cards were bounced this turn @@ -65,6 +66,7 @@ public class AiCardMemory { private final Set memHeldManaSources; private final Set memHeldManaSourcesForCombat; private final Set memHeldManaSourcesForEnemyCombat; + private final Set memHeldManaSourcesForNextPriority; private final Set memAttachedThisTurn; private final Set memAnimatedThisTurn; private final Set memBouncedThisTurn; @@ -84,6 +86,7 @@ public class AiCardMemory { this.memTrickAttackers = new HashSet<>(); this.memChosenFogEffect = new HashSet<>(); this.memMarkedToAvoidReentry = new HashSet<>(); + this.memHeldManaSourcesForNextPriority = new HashSet<>(); } private Set getMemorySet(MemorySet set) { @@ -98,6 +101,8 @@ public class AiCardMemory { return memHeldManaSourcesForCombat; case HELD_MANA_SOURCES_FOR_ENEMY_DECLBLK: return memHeldManaSourcesForEnemyCombat; + case HELD_MANA_SOURCES_FOR_NEXT_PRIORITY: + return memHeldManaSourcesForNextPriority; case ATTACHED_THIS_TURN: return memAttachedThisTurn; case ANIMATED_THIS_TURN: diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 5e777707bc8..bf60b900916 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -630,31 +630,48 @@ public class AiController { } public boolean reserveManaSources(SpellAbility sa) { - return reserveManaSources(sa, PhaseType.MAIN2, false); + return reserveManaSources(sa, PhaseType.MAIN2, false, false, null); + } + + public boolean reserveManaSourcesTillNextPriority(SpellAbility sa, SpellAbility exceptForSa) { + return reserveManaSources(sa, null, false, true, exceptForSa); } public boolean reserveManaSources(SpellAbility sa, PhaseType phaseType, boolean enemy) { + return reserveManaSources(sa, phaseType, enemy, true, null); + } + + public boolean reserveManaSources(SpellAbility sa, PhaseType phaseType, boolean enemy, boolean nextPriority, SpellAbility exceptForThisSa) { ManaCostBeingPaid cost = ComputerUtilMana.calculateManaCost(sa, true, 0); CardCollection manaSources = ComputerUtilMana.getManaSourcesToPayCost(cost, sa, player); + // used for chained spells where two spells need to be cast in succession + if (exceptForThisSa != null) { + manaSources.removeAll(ComputerUtilMana.getManaSourcesToPayCost(ComputerUtilMana.calculateManaCost(exceptForThisSa, true, 0), exceptForThisSa, player)); + } + if (manaSources.isEmpty()) { return false; } AiCardMemory.MemorySet memSet; - switch (phaseType) { - case MAIN2: - memSet = AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_MAIN2; - break; - case COMBAT_DECLARE_BLOCKERS: - memSet = enemy ? AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_ENEMY_DECLBLK - : AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_DECLBLK; - break; - default: - System.out.println("Warning: unsupported mana reservation phase specified for reserveManaSources: " - + phaseType.name() + ", reserving until Main 2 instead. Consider adding support for the phase if needed."); - memSet = AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_MAIN2; - break; + if (phaseType == null && nextPriority) { + memSet = AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_NEXT_PRIORITY; + } else { + switch (phaseType) { + case MAIN2: + memSet = AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_MAIN2; + break; + case COMBAT_DECLARE_BLOCKERS: + memSet = enemy ? AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_ENEMY_DECLBLK + : AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_DECLBLK; + break; + default: + System.out.println("Warning: unsupported mana reservation phase specified for reserveManaSources: " + + phaseType.name() + ", reserving until Main 2 instead. Consider adding support for the phase if needed."); + memSet = AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_MAIN2; + break; + } } // This is a simplification, since one mana source can produce more than one mana, @@ -1317,6 +1334,9 @@ public class AiController { // re-created if needed and used for any AI logic that needs it. predictedCombat = null; + // Reset priority mana reservation + AiCardMemory.clearMemorySet(player, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_NEXT_PRIORITY); + if (useSimulation) { return singleSpellAbilityList(simPicker.chooseSpellAbilityToPlay(null)); } diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java index b1df18b97ce..aaf6bbae40c 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java @@ -7,6 +7,7 @@ import com.google.common.base.Predicate; import com.google.common.collect.Lists; import forge.card.CardStateName; +import forge.card.mana.ManaCost; import forge.game.Game; import forge.game.GameActionUtil; import forge.game.ability.ApiType; @@ -15,10 +16,15 @@ import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; import forge.game.card.CardLists; import forge.game.card.CardPredicates.Presets; +import forge.game.cost.Cost; +import forge.game.cost.CostPartMana; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbilityStackInstance; +import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.Pair; public class ComputerUtilAbility { public static CardCollection getAvailableLandsToPlay(final Game game, final Player player) { @@ -182,4 +188,65 @@ public class ComputerUtilAbility { return targeted; } + + public static Pair getDamageAfterChainingSpells(Player ai, SpellAbility sa, String damage) { + if (sa.getSubAbility() != null || sa.getParent() != null) { + // Doesn't work yet for complex decisions where damage is only a part of the decision process + return null; + } + + // Try to chain damage/debuff effects + if (StringUtils.isNumeric(damage) || (damage.startsWith("-") && StringUtils.isNumeric(damage.substring(1)))) { + // currently only works for predictable numeric damage + CardCollection cards = new CardCollection(); + cards.addAll(ai.getCardsIn(ZoneType.Hand)); + cards.addAll(ai.getCardsIn(ZoneType.Battlefield)); + cards.addAll(ai.getCardsActivableInExternalZones(true)); + for (Card c : cards) { + for (SpellAbility ab : c.getSpellAbilities()) { + if (ab.equals(sa) || ab.getSubAbility() != null) { // decisions for complex SAs with subs are not supported yet + continue; + } + // currently works only with cards that don't have additional costs (only mana is supported) + if (ab.getPayCosts() != null && (ab.getPayCosts().hasNoManaCost() || ab.getPayCosts().hasOnlySpecificCostType(CostPartMana.class))) { + String dmgDef = "0"; + if (ab.getApi() == ApiType.DealDamage) { + dmgDef = ab.getParamOrDefault("NumDmg", "0"); + } else if (ab.getApi() == ApiType.Pump) { + dmgDef = ab.getParamOrDefault("NumDef", "0"); + if (dmgDef.startsWith("-")) { + dmgDef = dmgDef.substring(1); + } else { + continue; // not a toughness debuff + } + } + if (StringUtils.isNumeric(dmgDef) && ab.canPlay()) { // currently doesn't work for X and other dependent costs + if (sa.usesTargeting() && ab.usesTargeting()) { + // Ensure that the chained spell can target at least the same things (or more) as the current one + TargetRestrictions tgtSa = sa.getTargetRestrictions(); + TargetRestrictions tgtAb = sa.getTargetRestrictions(); + if (tgtSa.canTgtCreature() && !tgtAb.canTgtCreature()) { + continue; + } else if (tgtSa.canTgtPlaneswalker() && !tgtAb.canTgtPlaneswalker()) { + continue; + } + // FIXME: should it also check restrictions for targeting players? + ManaCost costSa = sa.getPayCosts() != null ? sa.getPayCosts().getTotalMana() : ManaCost.NO_COST; + ManaCost costAb = ab.getPayCosts().getTotalMana(); // checked for null above + ManaCost total = ManaCost.combine(costSa, costAb); + SpellAbility combinedAb = ab.copyWithDefinedCost(new Cost(total, false)); + // can we pay both costs? + if (ComputerUtilMana.canPayManaCost(combinedAb, ai, 0)) { + //aic.reserveManaSourcesTillNextPriority(ab); // reserve mana for the second spell + return Pair.of(ab, Integer.parseInt(dmgDef)); + } + } + } + } + } + } + } + + return null; + } } diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java index 1330e32a0f3..9bbdc3a56a6 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java @@ -856,6 +856,11 @@ public class ComputerUtilMana { AiController aic = ((PlayerControllerAi)ai.getController()).getAi(); int chanceToReserve = aic.getIntProperty(AiProps.RESERVE_MANA_FOR_MAIN2_CHANCE); + // Mana reserved for spell synchronization + if (AiCardMemory.isRememberedCard(ai, sourceCard, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_NEXT_PRIORITY)) { + return true; + } + PhaseType curPhase = ai.getGame().getPhaseHandler().getPhase(); // For combat tricks, always obey mana reservation 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 f3ca5cecf38..9cc402cd28b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -21,6 +21,7 @@ import forge.game.spellability.TargetChoices; import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; import forge.util.Aggregates; +import org.apache.commons.lang3.tuple.Pair; import java.util.List; import java.util.Map; @@ -195,6 +196,9 @@ public class DamageDealAi extends DamageAiBase { return false; } + // Try to chain damage/debuff effects + Pair chainDmg = ComputerUtilAbility.getDamageAfterChainingSpells(ai, sa, damage); + // temporarily disabled until better AI if (!ComputerUtilCost.checkLifeCost(ai, abCost, source, 4, sa)) { return false; @@ -216,8 +220,24 @@ public class DamageDealAi extends DamageAiBase { return false; } - if (!this.damageTargetAI(ai, sa, dmg, false)) { - return false; + // test what happens if we chain this to another damaging spell + if (chainDmg != null && ai.getController().isAI()) { + int extraDmg = chainDmg.getValue(); + if (!this.damageTargetAI(ai, sa, dmg + extraDmg, false)) { + return false; // won't play it even in chain + } else { + // we are about to decide to play this damage spell; if there's something chained to it, reserve mana for + // the second spell so we don't misplay + if (chainDmg != null && ai.getController().isAI()) { + AiController aic = ((PlayerControllerAi)ai.getController()).getAi(); + aic.reserveManaSourcesTillNextPriority(chainDmg.getKey(), sa); + } + } + } else { + // simple targeting when there is no spell chaining plan + if (!this.damageTargetAI(ai, sa, dmg, false)) { + return false; + } } if ((damage.equals("X") && source.getSVar(damage).equals("Count$xPaid")) || @@ -238,6 +258,7 @@ public class DamageDealAi extends DamageAiBase { source.setSVar("PayX", Integer.toString(actualPay)); } } + return true; } From 96f941aeae3d90443096a19b7b7a7618d7b4c4a9 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 10 Dec 2018 19:37:26 +0300 Subject: [PATCH 452/901] - Added an experimental AI property controlling damage chaining. --- forge-ai/src/main/java/forge/ai/AiProps.java | 3 ++- forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java | 6 ++++++ forge-gui/res/ai/Experimental.ai | 5 +++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/AiProps.java b/forge-ai/src/main/java/forge/ai/AiProps.java index 1f8b56a9720..ae344feaf1c 100644 --- a/forge-ai/src/main/java/forge/ai/AiProps.java +++ b/forge-ai/src/main/java/forge/ai/AiProps.java @@ -126,9 +126,10 @@ public enum AiProps { /** */ FLASH_USE_BUFF_AURAS_AS_COMBAT_TRICKS("true"), FLASH_BUFF_AURA_CHANCE_TO_CAST_EARLY("1"), FLASH_BUFF_AURA_CHANCE_CAST_AT_EOT("5"), - FLASH_BUFF_AURA_CHANCE_TO_RESPOND_TO_STACK("100"); /** */ + FLASH_BUFF_AURA_CHANCE_TO_RESPOND_TO_STACK("100"), /** */ // Experimental features, must be promoted or removed after extensive testing and, ideally, defaulting // <-- There are no experimental options here --> + CHANCE_TO_CHAIN_TWO_DAMAGE_SPELLS("0"); /** */ private final String strDefaultVal; diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java index aaf6bbae40c..a79418b623b 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java @@ -23,6 +23,7 @@ import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbilityStackInstance; import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; +import forge.util.MyRandom; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; @@ -190,6 +191,11 @@ public class ComputerUtilAbility { } public static Pair getDamageAfterChainingSpells(Player ai, SpellAbility sa, String damage) { + int chance = ((PlayerControllerAi)ai.getController()).getAi().getIntProperty(AiProps.CHANCE_TO_CHAIN_TWO_DAMAGE_SPELLS); + if (!MyRandom.percentTrue(chance)) { + return null; + } + if (sa.getSubAbility() != null || sa.getParent() != null) { // Doesn't work yet for complex decisions where damage is only a part of the decision process return null; diff --git a/forge-gui/res/ai/Experimental.ai b/forge-gui/res/ai/Experimental.ai index 5b9048770f5..48b4e967fe9 100644 --- a/forge-gui/res/ai/Experimental.ai +++ b/forge-gui/res/ai/Experimental.ai @@ -277,3 +277,8 @@ MOJHOSTO_CHANCE_TO_USE_JHOIRA_COPY_INSTANT=20 # -- different name if necessary -- # <-- there are no experimental options here at the moment --> + +# The chance that the AI will try to chain two damage spells or a damage spell and a debuffing pump spell to try to +# kill a bigger creature or a planeswalker. +CHANCE_TO_CHAIN_TWO_DAMAGE_SPELLS=100 + From 0c5e5288b8c58f2e146e2ac25a5b4ea943080551 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 11 Dec 2018 15:12:41 +0300 Subject: [PATCH 453/901] - Tweaking a method name. --- forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java | 5 ++++- forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java index a79418b623b..057dc96252a 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java @@ -190,7 +190,10 @@ public class ComputerUtilAbility { return targeted; } - public static Pair getDamageAfterChainingSpells(Player ai, SpellAbility sa, String damage) { + // Returns a pair of a SpellAbility (APIType DealDamage or Pump) and damage/debuff amount + // The returned spell ability can be chained to "sa" to deal more damage (enough mana is available to cast both + // and can be properly reserved). + public static Pair getDamagingSAToChain(Player ai, SpellAbility sa, String damage) { int chance = ((PlayerControllerAi)ai.getController()).getAi().getIntProperty(AiProps.CHANCE_TO_CHAIN_TWO_DAMAGE_SPELLS); if (!MyRandom.percentTrue(chance)) { return null; 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 9cc402cd28b..6f49103fe14 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -197,7 +197,7 @@ public class DamageDealAi extends DamageAiBase { } // Try to chain damage/debuff effects - Pair chainDmg = ComputerUtilAbility.getDamageAfterChainingSpells(ai, sa, damage); + Pair chainDmg = ComputerUtilAbility.getDamagingSAToChain(ai, sa, damage); // temporarily disabled until better AI if (!ComputerUtilCost.checkLifeCost(ai, abCost, source, 4, sa)) { From 602226f4160be1a1186c3cd257a56d4042fab7c4 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 11 Dec 2018 21:06:59 +0300 Subject: [PATCH 454/901] - Removed a commented out line (mana is reserved elsewhere). --- forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java index 057dc96252a..69a58434b2f 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java @@ -246,7 +246,6 @@ public class ComputerUtilAbility { SpellAbility combinedAb = ab.copyWithDefinedCost(new Cost(total, false)); // can we pay both costs? if (ComputerUtilMana.canPayManaCost(combinedAb, ai, 0)) { - //aic.reserveManaSourcesTillNextPriority(ab); // reserve mana for the second spell return Pair.of(ab, Integer.parseInt(dmgDef)); } } From 95db50f07be6a57ce1b720ab7deb6fbf712978df Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 12 Dec 2018 08:47:36 +0300 Subject: [PATCH 455/901] - Renamed a few things for clarity. --- forge-ai/src/main/java/forge/ai/AiCardMemory.java | 10 +++++----- forge-ai/src/main/java/forge/ai/AiController.java | 10 +++++----- forge-ai/src/main/java/forge/ai/ComputerUtilMana.java | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiCardMemory.java b/forge-ai/src/main/java/forge/ai/AiCardMemory.java index a94287e549e..17a58d5eaf1 100644 --- a/forge-ai/src/main/java/forge/ai/AiCardMemory.java +++ b/forge-ai/src/main/java/forge/ai/AiCardMemory.java @@ -51,7 +51,7 @@ public class AiCardMemory { HELD_MANA_SOURCES_FOR_MAIN2, // These mana sources will not be used before Main 2 HELD_MANA_SOURCES_FOR_DECLBLK, // These mana sources will not be used before Combat - Declare Blockers HELD_MANA_SOURCES_FOR_ENEMY_DECLBLK, // These mana sources will not be used before the opponent's Combat - Declare Blockers - HELD_MANA_SOURCES_FOR_NEXT_PRIORITY, // These mana sources will not be used until the next time the AI receives priority + HELD_MANA_SOURCES_FOR_NEXT_SPELL, // These mana sources will not be used until the next time the AI chooses a spell to cast ATTACHED_THIS_TURN, // These equipments were attached to something already this turn ANIMATED_THIS_TURN, // These cards had their AF Animate effect activated this turn BOUNCED_THIS_TURN, // These cards were bounced this turn @@ -66,7 +66,7 @@ public class AiCardMemory { private final Set memHeldManaSources; private final Set memHeldManaSourcesForCombat; private final Set memHeldManaSourcesForEnemyCombat; - private final Set memHeldManaSourcesForNextPriority; + private final Set memHeldManaSourcesForNextSpell; private final Set memAttachedThisTurn; private final Set memAnimatedThisTurn; private final Set memBouncedThisTurn; @@ -86,7 +86,7 @@ public class AiCardMemory { this.memTrickAttackers = new HashSet<>(); this.memChosenFogEffect = new HashSet<>(); this.memMarkedToAvoidReentry = new HashSet<>(); - this.memHeldManaSourcesForNextPriority = new HashSet<>(); + this.memHeldManaSourcesForNextSpell = new HashSet<>(); } private Set getMemorySet(MemorySet set) { @@ -101,8 +101,8 @@ public class AiCardMemory { return memHeldManaSourcesForCombat; case HELD_MANA_SOURCES_FOR_ENEMY_DECLBLK: return memHeldManaSourcesForEnemyCombat; - case HELD_MANA_SOURCES_FOR_NEXT_PRIORITY: - return memHeldManaSourcesForNextPriority; + case HELD_MANA_SOURCES_FOR_NEXT_SPELL: + return memHeldManaSourcesForNextSpell; case ATTACHED_THIS_TURN: return memAttachedThisTurn; case ANIMATED_THIS_TURN: diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index bf60b900916..1c6e1a00276 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -641,7 +641,7 @@ public class AiController { return reserveManaSources(sa, phaseType, enemy, true, null); } - public boolean reserveManaSources(SpellAbility sa, PhaseType phaseType, boolean enemy, boolean nextPriority, SpellAbility exceptForThisSa) { + public boolean reserveManaSources(SpellAbility sa, PhaseType phaseType, boolean enemy, boolean forNextSpell, SpellAbility exceptForThisSa) { ManaCostBeingPaid cost = ComputerUtilMana.calculateManaCost(sa, true, 0); CardCollection manaSources = ComputerUtilMana.getManaSourcesToPayCost(cost, sa, player); @@ -655,8 +655,8 @@ public class AiController { } AiCardMemory.MemorySet memSet; - if (phaseType == null && nextPriority) { - memSet = AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_NEXT_PRIORITY; + if (phaseType == null && forNextSpell) { + memSet = AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_NEXT_SPELL; } else { switch (phaseType) { case MAIN2: @@ -1334,8 +1334,8 @@ public class AiController { // re-created if needed and used for any AI logic that needs it. predictedCombat = null; - // Reset priority mana reservation - AiCardMemory.clearMemorySet(player, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_NEXT_PRIORITY); + // Reset priority mana reservation that's meant to work for one spell only + AiCardMemory.clearMemorySet(player, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_NEXT_SPELL); if (useSimulation) { return singleSpellAbilityList(simPicker.chooseSpellAbilityToPlay(null)); diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java index 9bbdc3a56a6..7ad1d8a9a3e 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java @@ -857,7 +857,7 @@ public class ComputerUtilMana { int chanceToReserve = aic.getIntProperty(AiProps.RESERVE_MANA_FOR_MAIN2_CHANCE); // Mana reserved for spell synchronization - if (AiCardMemory.isRememberedCard(ai, sourceCard, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_NEXT_PRIORITY)) { + if (AiCardMemory.isRememberedCard(ai, sourceCard, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_NEXT_SPELL)) { return true; } From 789f9eecb4bdc87239c58274f0645194a274cbf0 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 12 Dec 2018 08:54:31 +0300 Subject: [PATCH 456/901] - Maximize the chance to chain spells to kill threats when in danger (unless the option is disabled). --- forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java index 69a58434b2f..b0283a76d37 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java @@ -194,7 +194,13 @@ public class ComputerUtilAbility { // The returned spell ability can be chained to "sa" to deal more damage (enough mana is available to cast both // and can be properly reserved). public static Pair getDamagingSAToChain(Player ai, SpellAbility sa, String damage) { + Game game = ai.getGame(); int chance = ((PlayerControllerAi)ai.getController()).getAi().getIntProperty(AiProps.CHANCE_TO_CHAIN_TWO_DAMAGE_SPELLS); + + if (chance > 0 && (ComputerUtilCombat.lifeInDanger(ai, game.getCombat()) || ComputerUtil.aiLifeInDanger(ai, true, 0))) { + chance = 100; // in danger, do it even if normally the chance is low (unless chaining is completely disabled) + } + if (!MyRandom.percentTrue(chance)) { return null; } From 3b5015e9b6f986b9285d7ebbf03aa0bdc504b723 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 12 Dec 2018 08:57:23 +0300 Subject: [PATCH 457/901] - Moved the chain SA prediction routine to DamageDealAi, where it belongs more. --- .../java/forge/ai/ComputerUtilAbility.java | 88 +------------------ .../java/forge/ai/ability/DamageDealAi.java | 82 ++++++++++++++++- 2 files changed, 84 insertions(+), 86 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java index b0283a76d37..790e571852d 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java @@ -1,13 +1,8 @@ package forge.ai; -import java.util.Iterator; -import java.util.List; - import com.google.common.base.Predicate; import com.google.common.collect.Lists; - import forge.card.CardStateName; -import forge.card.mana.ManaCost; import forge.game.Game; import forge.game.GameActionUtil; import forge.game.ability.ApiType; @@ -16,16 +11,13 @@ import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; import forge.game.card.CardLists; import forge.game.card.CardPredicates.Presets; -import forge.game.cost.Cost; -import forge.game.cost.CostPartMana; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbilityStackInstance; -import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; -import forge.util.MyRandom; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.tuple.Pair; + +import java.util.Iterator; +import java.util.List; public class ComputerUtilAbility { public static CardCollection getAvailableLandsToPlay(final Game game, final Player player) { @@ -189,78 +181,4 @@ public class ComputerUtilAbility { return targeted; } - - // Returns a pair of a SpellAbility (APIType DealDamage or Pump) and damage/debuff amount - // The returned spell ability can be chained to "sa" to deal more damage (enough mana is available to cast both - // and can be properly reserved). - public static Pair getDamagingSAToChain(Player ai, SpellAbility sa, String damage) { - Game game = ai.getGame(); - int chance = ((PlayerControllerAi)ai.getController()).getAi().getIntProperty(AiProps.CHANCE_TO_CHAIN_TWO_DAMAGE_SPELLS); - - if (chance > 0 && (ComputerUtilCombat.lifeInDanger(ai, game.getCombat()) || ComputerUtil.aiLifeInDanger(ai, true, 0))) { - chance = 100; // in danger, do it even if normally the chance is low (unless chaining is completely disabled) - } - - if (!MyRandom.percentTrue(chance)) { - return null; - } - - if (sa.getSubAbility() != null || sa.getParent() != null) { - // Doesn't work yet for complex decisions where damage is only a part of the decision process - return null; - } - - // Try to chain damage/debuff effects - if (StringUtils.isNumeric(damage) || (damage.startsWith("-") && StringUtils.isNumeric(damage.substring(1)))) { - // currently only works for predictable numeric damage - CardCollection cards = new CardCollection(); - cards.addAll(ai.getCardsIn(ZoneType.Hand)); - cards.addAll(ai.getCardsIn(ZoneType.Battlefield)); - cards.addAll(ai.getCardsActivableInExternalZones(true)); - for (Card c : cards) { - for (SpellAbility ab : c.getSpellAbilities()) { - if (ab.equals(sa) || ab.getSubAbility() != null) { // decisions for complex SAs with subs are not supported yet - continue; - } - // currently works only with cards that don't have additional costs (only mana is supported) - if (ab.getPayCosts() != null && (ab.getPayCosts().hasNoManaCost() || ab.getPayCosts().hasOnlySpecificCostType(CostPartMana.class))) { - String dmgDef = "0"; - if (ab.getApi() == ApiType.DealDamage) { - dmgDef = ab.getParamOrDefault("NumDmg", "0"); - } else if (ab.getApi() == ApiType.Pump) { - dmgDef = ab.getParamOrDefault("NumDef", "0"); - if (dmgDef.startsWith("-")) { - dmgDef = dmgDef.substring(1); - } else { - continue; // not a toughness debuff - } - } - if (StringUtils.isNumeric(dmgDef) && ab.canPlay()) { // currently doesn't work for X and other dependent costs - if (sa.usesTargeting() && ab.usesTargeting()) { - // Ensure that the chained spell can target at least the same things (or more) as the current one - TargetRestrictions tgtSa = sa.getTargetRestrictions(); - TargetRestrictions tgtAb = sa.getTargetRestrictions(); - if (tgtSa.canTgtCreature() && !tgtAb.canTgtCreature()) { - continue; - } else if (tgtSa.canTgtPlaneswalker() && !tgtAb.canTgtPlaneswalker()) { - continue; - } - // FIXME: should it also check restrictions for targeting players? - ManaCost costSa = sa.getPayCosts() != null ? sa.getPayCosts().getTotalMana() : ManaCost.NO_COST; - ManaCost costAb = ab.getPayCosts().getTotalMana(); // checked for null above - ManaCost total = ManaCost.combine(costSa, costAb); - SpellAbility combinedAb = ab.copyWithDefinedCost(new Cost(total, false)); - // can we pay both costs? - if (ComputerUtilMana.canPayManaCost(combinedAb, ai, 0)) { - return Pair.of(ab, Integer.parseInt(dmgDef)); - } - } - } - } - } - } - } - - return null; - } } 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 6f49103fe14..4911228edaa 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -4,11 +4,14 @@ import com.google.common.base.Predicate; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import forge.ai.*; +import forge.card.mana.ManaCost; import forge.game.Game; import forge.game.GameObject; import forge.game.ability.AbilityUtils; +import forge.game.ability.ApiType; import forge.game.card.*; import forge.game.cost.Cost; +import forge.game.cost.CostPartMana; import forge.game.cost.CostRemoveCounter; import forge.game.keyword.Keyword; import forge.game.phase.PhaseHandler; @@ -21,6 +24,8 @@ import forge.game.spellability.TargetChoices; import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; import forge.util.Aggregates; +import forge.util.MyRandom; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import java.util.List; @@ -197,7 +202,7 @@ public class DamageDealAi extends DamageAiBase { } // Try to chain damage/debuff effects - Pair chainDmg = ComputerUtilAbility.getDamagingSAToChain(ai, sa, damage); + Pair chainDmg = getDamagingSAToChain(ai, sa, damage); // temporarily disabled until better AI if (!ComputerUtilCost.checkLifeCost(ai, abCost, source, 4, sa)) { @@ -996,4 +1001,79 @@ public class DamageDealAi extends DamageAiBase { source.setSVar("PayX", Integer.toString(dmg)); return true; } + + // Returns a pair of a SpellAbility (APIType DealDamage or Pump) and damage/debuff amount + // The returned spell ability can be chained to "sa" to deal more damage (enough mana is available to cast both + // and can be properly reserved). + public static Pair getDamagingSAToChain(Player ai, SpellAbility sa, String damage) { + Game game = ai.getGame(); + int chance = ((PlayerControllerAi)ai.getController()).getAi().getIntProperty(AiProps.CHANCE_TO_CHAIN_TWO_DAMAGE_SPELLS); + + if (chance > 0 && (ComputerUtilCombat.lifeInDanger(ai, game.getCombat()) || ComputerUtil.aiLifeInDanger(ai, true, 0))) { + chance = 100; // in danger, do it even if normally the chance is low (unless chaining is completely disabled) + } + + if (!MyRandom.percentTrue(chance)) { + return null; + } + + if (sa.getSubAbility() != null || sa.getParent() != null) { + // Doesn't work yet for complex decisions where damage is only a part of the decision process + return null; + } + + // Try to chain damage/debuff effects + if (StringUtils.isNumeric(damage) || (damage.startsWith("-") && StringUtils.isNumeric(damage.substring(1)))) { + // currently only works for predictable numeric damage + CardCollection cards = new CardCollection(); + cards.addAll(ai.getCardsIn(ZoneType.Hand)); + cards.addAll(ai.getCardsIn(ZoneType.Battlefield)); + cards.addAll(ai.getCardsActivableInExternalZones(true)); + for (Card c : cards) { + for (SpellAbility ab : c.getSpellAbilities()) { + if (ab.equals(sa) || ab.getSubAbility() != null) { // decisions for complex SAs with subs are not supported yet + continue; + } + // currently works only with cards that don't have additional costs (only mana is supported) + if (ab.getPayCosts() != null + && (ab.getPayCosts().hasNoManaCost() || ab.getPayCosts().hasOnlySpecificCostType(CostPartMana.class))) { + String dmgDef = "0"; + if (ab.getApi() == ApiType.DealDamage) { + dmgDef = ab.getParamOrDefault("NumDmg", "0"); + } else if (ab.getApi() == ApiType.Pump) { + dmgDef = ab.getParamOrDefault("NumDef", "0"); + if (dmgDef.startsWith("-")) { + dmgDef = dmgDef.substring(1); + } else { + continue; // not a toughness debuff + } + } + if (StringUtils.isNumeric(dmgDef) && ab.canPlay()) { // currently doesn't work for X and other dependent costs + if (sa.usesTargeting() && ab.usesTargeting()) { + // Ensure that the chained spell can target at least the same things (or more) as the current one + TargetRestrictions tgtSa = sa.getTargetRestrictions(); + TargetRestrictions tgtAb = sa.getTargetRestrictions(); + if (tgtSa.canTgtCreature() && !tgtAb.canTgtCreature()) { + continue; + } else if (tgtSa.canTgtPlaneswalker() && !tgtAb.canTgtPlaneswalker()) { + continue; + } + // FIXME: should it also check restrictions for targeting players? + ManaCost costSa = sa.getPayCosts() != null ? sa.getPayCosts().getTotalMana() : ManaCost.NO_COST; + ManaCost costAb = ab.getPayCosts().getTotalMana(); // checked for null above + ManaCost total = ManaCost.combine(costSa, costAb); + SpellAbility combinedAb = ab.copyWithDefinedCost(new Cost(total, false)); + // can we pay both costs? + if (ComputerUtilMana.canPayManaCost(combinedAb, ai, 0)) { + return Pair.of(ab, Integer.parseInt(dmgDef)); + } + } + } + } + } + } + } + + return null; + } } From 1b6b7f8af45cb9aa727c1f8b0e9e1c562b76dada Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 12 Dec 2018 09:03:41 +0300 Subject: [PATCH 458/901] - Move chainDmg closer to where it's used, avoid calling it when not planning to cast the spell for other reasons. --- forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java index 4911228edaa..08b62005392 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -201,9 +201,6 @@ public class DamageDealAi extends DamageAiBase { return false; } - // Try to chain damage/debuff effects - Pair chainDmg = getDamagingSAToChain(ai, sa, damage); - // temporarily disabled until better AI if (!ComputerUtilCost.checkLifeCost(ai, abCost, source, 4, sa)) { return false; @@ -225,6 +222,9 @@ public class DamageDealAi extends DamageAiBase { return false; } + // Try to chain damage/debuff effects + Pair chainDmg = getDamagingSAToChain(ai, sa, damage); + // test what happens if we chain this to another damaging spell if (chainDmg != null && ai.getController().isAI()) { int extraDmg = chainDmg.getValue(); From 4cbb50483a0fa5856ef8071bfcc366b5dbba20ff Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 12 Dec 2018 09:04:46 +0300 Subject: [PATCH 459/901] - Renamed a method. --- forge-ai/src/main/java/forge/ai/AiController.java | 2 +- forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 1c6e1a00276..bac130006bd 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -633,7 +633,7 @@ public class AiController { return reserveManaSources(sa, PhaseType.MAIN2, false, false, null); } - public boolean reserveManaSourcesTillNextPriority(SpellAbility sa, SpellAbility exceptForSa) { + public boolean reserveManaSourcesForNextSpell(SpellAbility sa, SpellAbility exceptForSa) { return reserveManaSources(sa, null, false, true, exceptForSa); } 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 08b62005392..58df2e8cc7b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -235,7 +235,7 @@ public class DamageDealAi extends DamageAiBase { // the second spell so we don't misplay if (chainDmg != null && ai.getController().isAI()) { AiController aic = ((PlayerControllerAi)ai.getController()).getAi(); - aic.reserveManaSourcesTillNextPriority(chainDmg.getKey(), sa); + aic.reserveManaSourcesForNextSpell(chainDmg.getKey(), sa); } } } else { From 99ba59067630ed079197af697455deb6435990c4 Mon Sep 17 00:00:00 2001 From: Michael Kamensky Date: Wed, 12 Dec 2018 06:14:32 +0000 Subject: [PATCH 460/901] Revert "Merge branch 'fix-desecrated-tomb' into 'master'" This reverts merge request !1212 --- forge-gui/res/cardsfolder/d/desecrated_tomb.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/d/desecrated_tomb.txt b/forge-gui/res/cardsfolder/d/desecrated_tomb.txt index 43405369c52..d5e17a434fd 100644 --- a/forge-gui/res/cardsfolder/d/desecrated_tomb.txt +++ b/forge-gui/res/cardsfolder/d/desecrated_tomb.txt @@ -1,7 +1,7 @@ Name:Desecrated Tomb ManaCost:3 Types:Artifact -T:Mode$ ChangesZone | ValidCard$ Creature.YouOwn | OncePerEffect$ True | Origin$ Graveyard | Destination$ Any | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever one or more creature cards leave your graveyard, create a 1/1 black Bat creature token with flying. +T:Mode$ ChangesZoneAll | Origin$ Graveyard | Destination$ Any | ValidCards$ Creature.YouOwn | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ Whenever one or more creature cards leave your graveyard, create a 1/1 black Bat creature token with flying. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ b_1_1_bat_flying | LegacyImage$ b 1 1 bat M19 | TokenOwner$ You DeckHints:Ability$Graveyard DeckHas:Ability$Token From 709e04d9add5aaf4224d86d8dc5a88494eadf3e7 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 12 Dec 2018 10:08:00 +0300 Subject: [PATCH 461/901] - Don't try to chain a pump spell to a damage spell targeting a player. --- .../src/main/java/forge/ai/ability/DamageDealAi.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) 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 58df2e8cc7b..bf247dfb109 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -228,8 +228,16 @@ public class DamageDealAi extends DamageAiBase { // test what happens if we chain this to another damaging spell if (chainDmg != null && ai.getController().isAI()) { int extraDmg = chainDmg.getValue(); - if (!this.damageTargetAI(ai, sa, dmg + extraDmg, false)) { + boolean willTargetIfChained = this.damageTargetAI(ai, sa, dmg + extraDmg, false); + if (!willTargetIfChained) { return false; // won't play it even in chain + } else if (willTargetIfChained && chainDmg.getKey().getApi() == ApiType.Pump && sa.getTargets().isTargetingAnyPlayer()) { + // we're trying to chain a pump spell to a damage spell targeting a player, that won't work + // so run an additional check to ensure that we want to cast the current spell separately + sa.resetTargets(); + if (!this.damageTargetAI(ai, sa, dmg, false)) { + return false; + } } else { // we are about to decide to play this damage spell; if there's something chained to it, reserve mana for // the second spell so we don't misplay From 7b6ad78ba28f9b12a31e9f4bfc9ed6e4ae293c32 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 12 Dec 2018 12:43:21 +0300 Subject: [PATCH 462/901] - Don't use damage chaining for simulated AI. --- forge-ai/src/main/java/forge/ai/AiController.java | 3 +++ forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index bac130006bd..d1ac0f4deac 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -93,6 +93,9 @@ public class AiController { this.cheatShuffle = canCheatShuffle; } + public boolean usesSimulation() { + return this.useSimulation; + } public void setUseSimulation(boolean value) { this.useSimulation = value; } 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 bf247dfb109..ded374079b1 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -1017,6 +1017,11 @@ public class DamageDealAi extends DamageAiBase { Game game = ai.getGame(); int chance = ((PlayerControllerAi)ai.getController()).getAi().getIntProperty(AiProps.CHANCE_TO_CHAIN_TWO_DAMAGE_SPELLS); + if (((PlayerControllerAi)ai.getController()).getAi().usesSimulation()) { + // simulated AI shouldn't use paired decisions, it tries to find complex decisions on its own + return null; + } + if (chance > 0 && (ComputerUtilCombat.lifeInDanger(ai, game.getCombat()) || ComputerUtil.aiLifeInDanger(ai, true, 0))) { chance = 100; // in danger, do it even if normally the chance is low (unless chaining is completely disabled) } From 7a7b461e0dd96e80726fe2d71e29c6a90b8bdf6b Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 12 Dec 2018 14:41:39 +0300 Subject: [PATCH 463/901] - Set the damage chaining defaults for the AI profiles. --- forge-ai/src/main/java/forge/ai/AiProps.java | 4 ++-- forge-gui/res/ai/Cautious.ai | 5 +++++ forge-gui/res/ai/Default.ai | 5 +++++ forge-gui/res/ai/Experimental.ai | 10 +++++----- forge-gui/res/ai/Reckless.ai | 5 +++++ .../res/conquest/planes/Kamigawa/Takenuma/_events.txt | 2 +- 6 files changed, 23 insertions(+), 8 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiProps.java b/forge-ai/src/main/java/forge/ai/AiProps.java index ae344feaf1c..5e976bbfbb0 100644 --- a/forge-ai/src/main/java/forge/ai/AiProps.java +++ b/forge-ai/src/main/java/forge/ai/AiProps.java @@ -79,6 +79,7 @@ public enum AiProps { /** */ DESTROY_IMMEDIATELY_UNBLOCKABLE_LIFE_IN_DNGR ("5"), /** */ AVOID_TARGETING_CREATS_THAT_WILL_DIE ("true"), /** */ DONT_EVAL_KILLSPELLS_ON_STACK_WITH_PERMISSION ("true"), /** */ + CHANCE_TO_CHAIN_TWO_DAMAGE_SPELLS("50"), /** */ PRIORITY_REDUCTION_FOR_STORM_SPELLS ("0"), /** */ USE_BERSERK_AGGRESSIVELY ("false"), /** */ MIN_COUNT_FOR_STORM_SPELLS ("0"), /** */ @@ -126,10 +127,9 @@ public enum AiProps { /** */ FLASH_USE_BUFF_AURAS_AS_COMBAT_TRICKS("true"), FLASH_BUFF_AURA_CHANCE_TO_CAST_EARLY("1"), FLASH_BUFF_AURA_CHANCE_CAST_AT_EOT("5"), - FLASH_BUFF_AURA_CHANCE_TO_RESPOND_TO_STACK("100"), /** */ + FLASH_BUFF_AURA_CHANCE_TO_RESPOND_TO_STACK("100"); /** */ // Experimental features, must be promoted or removed after extensive testing and, ideally, defaulting // <-- There are no experimental options here --> - CHANCE_TO_CHAIN_TWO_DAMAGE_SPELLS("0"); /** */ private final String strDefaultVal; diff --git a/forge-gui/res/ai/Cautious.ai b/forge-gui/res/ai/Cautious.ai index 05b1d3460d7..ee2ab585a38 100644 --- a/forge-gui/res/ai/Cautious.ai +++ b/forge-gui/res/ai/Cautious.ai @@ -120,6 +120,11 @@ DESTROY_IMMEDIATELY_UNBLOCKABLE_ONLY_IN_DNGR=true # for the purpose of previous option DESTROY_IMMEDIATELY_UNBLOCKABLE_LIFE_IN_DNGR=5 +# The chance that the AI will try to chain two damage spells or a damage spell and a debuffing pump spell to try to +# kill a bigger creature or a planeswalker. If set to 0, will be disabled. When enabled, will automatically become 100 +# if the AI is in danger of dying. +CHANCE_TO_CHAIN_TWO_DAMAGE_SPELLS=25 + # Permission timings MIN_SPELL_CMC_TO_COUNTER=2 CHANCE_TO_COUNTER_CMC_1=0 diff --git a/forge-gui/res/ai/Default.ai b/forge-gui/res/ai/Default.ai index e00c218cdf6..1e3510af48f 100644 --- a/forge-gui/res/ai/Default.ai +++ b/forge-gui/res/ai/Default.ai @@ -120,6 +120,11 @@ DESTROY_IMMEDIATELY_UNBLOCKABLE_ONLY_IN_DNGR=true # for the purpose of previous option DESTROY_IMMEDIATELY_UNBLOCKABLE_LIFE_IN_DNGR=5 +# The chance that the AI will try to chain two damage spells or a damage spell and a debuffing pump spell to try to +# kill a bigger creature or a planeswalker. If set to 0, will be disabled. When enabled, will automatically become 100 +# if the AI is in danger of dying. +CHANCE_TO_CHAIN_TWO_DAMAGE_SPELLS=50 + # Permission timings MIN_SPELL_CMC_TO_COUNTER=0 CHANCE_TO_COUNTER_CMC_1=30 diff --git a/forge-gui/res/ai/Experimental.ai b/forge-gui/res/ai/Experimental.ai index 48b4e967fe9..e7ea101aaba 100644 --- a/forge-gui/res/ai/Experimental.ai +++ b/forge-gui/res/ai/Experimental.ai @@ -120,6 +120,11 @@ DESTROY_IMMEDIATELY_UNBLOCKABLE_ONLY_IN_DNGR=false # for the purpose of previous option DESTROY_IMMEDIATELY_UNBLOCKABLE_LIFE_IN_DNGR=5 +# The chance that the AI will try to chain two damage spells or a damage spell and a debuffing pump spell to try to +# kill a bigger creature or a planeswalker. If set to 0, will be disabled. When enabled, will automatically become 100 +# if the AI is in danger of dying. +CHANCE_TO_CHAIN_TWO_DAMAGE_SPELLS=100 + # Permission timings MIN_SPELL_CMC_TO_COUNTER=2 CHANCE_TO_COUNTER_CMC_1=30 @@ -277,8 +282,3 @@ MOJHOSTO_CHANCE_TO_USE_JHOIRA_COPY_INSTANT=20 # -- different name if necessary -- # <-- there are no experimental options here at the moment --> - -# The chance that the AI will try to chain two damage spells or a damage spell and a debuffing pump spell to try to -# kill a bigger creature or a planeswalker. -CHANCE_TO_CHAIN_TWO_DAMAGE_SPELLS=100 - diff --git a/forge-gui/res/ai/Reckless.ai b/forge-gui/res/ai/Reckless.ai index 4641fe37b0b..b31835947a5 100644 --- a/forge-gui/res/ai/Reckless.ai +++ b/forge-gui/res/ai/Reckless.ai @@ -120,6 +120,11 @@ DESTROY_IMMEDIATELY_UNBLOCKABLE_ONLY_IN_DNGR=true # for the purpose of previous option DESTROY_IMMEDIATELY_UNBLOCKABLE_LIFE_IN_DNGR=5 +# The chance that the AI will try to chain two damage spells or a damage spell and a debuffing pump spell to try to +# kill a bigger creature or a planeswalker. If set to 0, will be disabled. When enabled, will automatically become 100 +# if the AI is in danger of dying. +CHANCE_TO_CHAIN_TWO_DAMAGE_SPELLS=75 + # Permission timings MIN_SPELL_CMC_TO_COUNTER=0 CHANCE_TO_COUNTER_CMC_1=80 diff --git a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/_events.txt b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/_events.txt index bf96cf935b1..8a79f913daa 100644 --- a/forge-gui/res/conquest/planes/Kamigawa/Takenuma/_events.txt +++ b/forge-gui/res/conquest/planes/Kamigawa/Takenuma/_events.txt @@ -6,4 +6,4 @@ Name:Lantern-Lit Graveyard|Deck:Lantern-Lit Graveyard.dck|Variant:Planechase|Ava Name:Toshiro Umezawa|Deck:Toshiro Umezawa.dck|Variant:Commander|Avatar:Toshiro Umezawa|Desc: Name:Yukora, the Prisoner|Deck:Yukora, the Prisoner.dck|Variant:Commander|Avatar:Yukora, the Prisoner|Desc: Name:Gix|Deck:Gix.dck|Variant:Vanguard|Avatar:Gix|Desc: -Name:Random Planechase|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: +Name:Random Takenuma|Deck:Random|Variant:Planechase|Avatar:Planar Warden|Desc: From b718365a39bb506b8966265db7d184f25d669489 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 12 Dec 2018 19:42:28 +0300 Subject: [PATCH 464/901] - getDamagingSAToChain should only work for actual AI players, not when simulating human decisions. --- .../src/main/java/forge/ai/ability/DamageDealAi.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java index ded374079b1..13569ef19b5 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -1014,14 +1014,16 @@ public class DamageDealAi extends DamageAiBase { // The returned spell ability can be chained to "sa" to deal more damage (enough mana is available to cast both // and can be properly reserved). public static Pair getDamagingSAToChain(Player ai, SpellAbility sa, String damage) { - Game game = ai.getGame(); - int chance = ((PlayerControllerAi)ai.getController()).getAi().getIntProperty(AiProps.CHANCE_TO_CHAIN_TWO_DAMAGE_SPELLS); - - if (((PlayerControllerAi)ai.getController()).getAi().usesSimulation()) { + if (!ai.getController().isAI()) { + return null; // should only work for the actual AI player + } else if (((PlayerControllerAi)ai.getController()).getAi().usesSimulation()) { // simulated AI shouldn't use paired decisions, it tries to find complex decisions on its own return null; } + Game game = ai.getGame(); + int chance = ((PlayerControllerAi)ai.getController()).getAi().getIntProperty(AiProps.CHANCE_TO_CHAIN_TWO_DAMAGE_SPELLS); + if (chance > 0 && (ComputerUtilCombat.lifeInDanger(ai, game.getCombat()) || ComputerUtil.aiLifeInDanger(ai, true, 0))) { chance = 100; // in danger, do it even if normally the chance is low (unless chaining is completely disabled) } From 5db2dd74b8f0189f5622ed0b9c83eaa78c177a1c Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 12 Dec 2018 20:19:15 +0300 Subject: [PATCH 465/901] - Prevent a NPE on cloning a flipped card, ensure that the original image is loaded after cloning if the card is not flipped. --- .../java/forge/game/ability/effects/CloneEffect.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java index 0dccc07d374..39c1a9637d4 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java @@ -116,7 +116,7 @@ public class CloneEffect extends SpellAbilityEffect { final String newName = sa.getParamOrDefault("NewName", null); final String originalName = tgtCard.getName(); final boolean copyingSelf = (tgtCard == cardToCopy); - final boolean isTransformed = cardToCopy.getCurrentStateName() == CardStateName.Transformed || cardToCopy.getCurrentStateName() == CardStateName.Meld; + final boolean isTransformed = cardToCopy.getCurrentStateName() == CardStateName.Transformed || cardToCopy.getCurrentStateName() == CardStateName.Meld || cardToCopy.getCurrentStateName() == CardStateName.Flipped; final CardStateName origState = isTransformed || cardToCopy.isFaceDown() ? CardStateName.Original : cardToCopy.getCurrentStateName(); if (!copyingSelf) { @@ -188,7 +188,12 @@ public class CloneEffect extends SpellAbilityEffect { //game.getTriggerHandler().registerActiveTrigger(tgtCard, false); //keep the Clone card image for the cloned card - tgtCard.setImageKey(imageFileName); + if (cardToCopy.isFlipCard() && tgtCard.getCurrentStateName() != CardStateName.Flipped) { + //for a flip card that isn't flipped, load the original image + tgtCard.setImageKey(cardToCopy.getImageKey(CardStateName.Original)); + } else { + tgtCard.setImageKey(imageFileName); + } tgtCard.updateStateForView(); From 9bcdfad726ecfb934d8216d49b8a62afe044fa65 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 12 Dec 2018 20:37:25 +0300 Subject: [PATCH 466/901] - Removed a superfluous isAI check, handled inside getDamagingSAToChain. --- forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 13569ef19b5..f106e197fb2 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -226,7 +226,7 @@ public class DamageDealAi extends DamageAiBase { Pair chainDmg = getDamagingSAToChain(ai, sa, damage); // test what happens if we chain this to another damaging spell - if (chainDmg != null && ai.getController().isAI()) { + if (chainDmg != null) { int extraDmg = chainDmg.getValue(); boolean willTargetIfChained = this.damageTargetAI(ai, sa, dmg + extraDmg, false); if (!willTargetIfChained) { From adec6c720f0b12c1c66152a5fe438f5f87f0311a Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 12 Dec 2018 20:39:49 +0300 Subject: [PATCH 467/901] - Removed a superfluous isAI check, handled inside getDamagingSAToChain (one more). --- forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 f106e197fb2..af6b3583679 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -241,7 +241,7 @@ public class DamageDealAi extends DamageAiBase { } else { // we are about to decide to play this damage spell; if there's something chained to it, reserve mana for // the second spell so we don't misplay - if (chainDmg != null && ai.getController().isAI()) { + if (chainDmg != null) { AiController aic = ((PlayerControllerAi)ai.getController()).getAi(); aic.reserveManaSourcesForNextSpell(chainDmg.getKey(), sa); } From f45bccf71dd844dd002020c83843d16f0bec0cc0 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 12 Dec 2018 20:40:26 +0300 Subject: [PATCH 468/901] - chainDmg not null is already ensured on top --- forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java index af6b3583679..f147a2015b9 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -241,10 +241,8 @@ public class DamageDealAi extends DamageAiBase { } else { // we are about to decide to play this damage spell; if there's something chained to it, reserve mana for // the second spell so we don't misplay - if (chainDmg != null) { - AiController aic = ((PlayerControllerAi)ai.getController()).getAi(); - aic.reserveManaSourcesForNextSpell(chainDmg.getKey(), sa); - } + AiController aic = ((PlayerControllerAi)ai.getController()).getAi(); + aic.reserveManaSourcesForNextSpell(chainDmg.getKey(), sa); } } else { // simple targeting when there is no spell chaining plan From f09ec1342891cfdf8a7fab083883ac1557773484 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 12 Dec 2018 21:54:14 +0300 Subject: [PATCH 469/901] - Restore the "move equipment" functionality for the AI --- forge-ai/src/main/java/forge/ai/ability/AttachAi.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index a4e1cb4d004..edc95abd172 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -1316,7 +1316,8 @@ public class AttachAi extends SpellAbilityAi { } // Don't fortify if already fortifying - if (attachSource.getAttachedTo() != null && attachSource.getAttachedTo().getController() == aiPlayer) { + if (attachSource.isFortification() && attachSource.getAttachedTo() != null + && attachSource.getAttachedTo().getController() == aiPlayer) { return null; } From ec77e89516e127d41a2ce907c31c5d0897143ea9 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 13 Dec 2018 13:25:10 +0300 Subject: [PATCH 470/901] - Fixed an issue with loading quest challenges from the wrong folder. --- forge-gui/src/main/java/forge/quest/QuestController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/src/main/java/forge/quest/QuestController.java b/forge-gui/src/main/java/forge/quest/QuestController.java index 5366f7200bc..6ed03c1fb62 100644 --- a/forge-gui/src/main/java/forge/quest/QuestController.java +++ b/forge-gui/src/main/java/forge/quest/QuestController.java @@ -477,9 +477,9 @@ public class QuestController { allChallenges = QuestChallengeGenerator.generateChallenges(); return; } else if (world.isCustom()) { - path = world.getChallengesDir() == null ? ForgeConstants.DEFAULT_CHALLENGES_DIR : ForgeConstants.QUEST_WORLD_DIR + world.getChallengesDir(); - } else { path = world.getChallengesDir() == null ? ForgeConstants.DEFAULT_CHALLENGES_DIR : ForgeConstants.USER_QUEST_WORLD_DIR + world.getChallengesDir(); + } else { + path = world.getChallengesDir() == null ? ForgeConstants.DEFAULT_CHALLENGES_DIR : ForgeConstants.QUEST_WORLD_DIR + world.getChallengesDir(); } } From ee960c9c0882c9865c459c9e2012a617048cf49e Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 13 Dec 2018 15:55:42 +0300 Subject: [PATCH 471/901] - Fixed an issue which caused DamageReceivedCondition not to work and always return 0 (looks like it needs an internal LKI check). --- .../src/main/java/forge/game/trigger/TriggerChangesZone.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java index fb0f1497997..85259cd4a5a 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java @@ -160,7 +160,10 @@ public class TriggerChangesZone extends Trigger { return false; } - final boolean expr = Expressions.compare(card.getTotalDamageRecievedThisTurn(), cond, rightSide); + // need to check the ChangeZone LKI copy for damage, otherwise it'll return 0 for a new object in the new zone + Card lkiCard = card.getGame().getChangeZoneLKIInfo(card); + + final boolean expr = Expressions.compare(lkiCard.getTotalDamageRecievedThisTurn(), cond, rightSide); if (!expr) { return false; } From 3896a79cfa8b47147c8b27b0c699fd2120f1efe9 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 13 Dec 2018 20:08:01 +0300 Subject: [PATCH 472/901] - Improve damage chaining so that the AI doesn't try to chain a spell with restricted targeting to a general use spell (e.g. a spell that targets only attacking creatures to a Lightning Strike outside of combat). --- forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java | 8 ++++++++ 1 file changed, 8 insertions(+) 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 f147a2015b9..4763a134cf5 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -1070,6 +1070,14 @@ public class DamageDealAi extends DamageAiBase { continue; } else if (tgtSa.canTgtPlaneswalker() && !tgtAb.canTgtPlaneswalker()) { continue; + } else if ((tgtSa.getSAValidTargeting() != null && tgtSa.getSAValidTargeting().contains(".")) + || (tgtAb.getSAValidTargeting() != null && tgtAb.getSAValidTargeting().contains("."))) { + if (!tgtAb.getSAValidTargeting().contains(tgtSa.getSAValidTargeting())) { + // if the targeting has additional conditions, make sure that the chained spell + // contains the same condition specifications (or at least these specs are a part + // of what SA can target, hopefully) + continue; + } } // FIXME: should it also check restrictions for targeting players? ManaCost costSa = sa.getPayCosts() != null ? sa.getPayCosts().getTotalMana() : ManaCost.NO_COST; From 36154db24d6accdf06b4d7bc531522d1b038b237 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 13 Dec 2018 21:57:01 +0300 Subject: [PATCH 473/901] - A more reliable check for Valid Targeting in damage chaining. --- .../java/forge/ai/ability/DamageDealAi.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java index 4763a134cf5..1f95899bc69 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -28,6 +28,7 @@ import forge.util.MyRandom; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; +import java.util.Arrays; import java.util.List; import java.util.Map; @@ -1070,15 +1071,16 @@ public class DamageDealAi extends DamageAiBase { continue; } else if (tgtSa.canTgtPlaneswalker() && !tgtAb.canTgtPlaneswalker()) { continue; - } else if ((tgtSa.getSAValidTargeting() != null && tgtSa.getSAValidTargeting().contains(".")) - || (tgtAb.getSAValidTargeting() != null && tgtAb.getSAValidTargeting().contains("."))) { - if (!tgtAb.getSAValidTargeting().contains(tgtSa.getSAValidTargeting())) { - // if the targeting has additional conditions, make sure that the chained spell - // contains the same condition specifications (or at least these specs are a part - // of what SA can target, hopefully) - continue; - } } + + // Check that "ab" has a ValidTgts specification that includes everything "sa" includes, or + // the AI can misplay + String[] validTgtsSa = sa.getTargetRestrictions().getValidTgts(); + String[] validTgtsAb = ab.getTargetRestrictions().getValidTgts(); + if (!Arrays.asList(validTgtsSa).containsAll(Arrays.asList(validTgtsAb))) { + continue; + } + // FIXME: should it also check restrictions for targeting players? ManaCost costSa = sa.getPayCosts() != null ? sa.getPayCosts().getTotalMana() : ManaCost.NO_COST; ManaCost costAb = ab.getPayCosts().getTotalMana(); // checked for null above From 7fd2a5fa0405abb04c4bdf21d4da36c010e2386a Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 13 Dec 2018 22:02:17 +0300 Subject: [PATCH 474/901] - Code cleanup. --- forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java index 1f95899bc69..b189fe99eec 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -1075,8 +1075,8 @@ public class DamageDealAi extends DamageAiBase { // Check that "ab" has a ValidTgts specification that includes everything "sa" includes, or // the AI can misplay - String[] validTgtsSa = sa.getTargetRestrictions().getValidTgts(); - String[] validTgtsAb = ab.getTargetRestrictions().getValidTgts(); + String[] validTgtsSa = tgtSa.getValidTgts(); + String[] validTgtsAb = tgtAb.getValidTgts(); if (!Arrays.asList(validTgtsSa).containsAll(Arrays.asList(validTgtsAb))) { continue; } From ad5ece5242e274d8570422150da80b1542eeeb5f Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 13 Dec 2018 22:09:46 +0300 Subject: [PATCH 475/901] - Code simplification/cleanup. --- forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java index b189fe99eec..b1e2089a820 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -1067,14 +1067,6 @@ public class DamageDealAi extends DamageAiBase { // Ensure that the chained spell can target at least the same things (or more) as the current one TargetRestrictions tgtSa = sa.getTargetRestrictions(); TargetRestrictions tgtAb = sa.getTargetRestrictions(); - if (tgtSa.canTgtCreature() && !tgtAb.canTgtCreature()) { - continue; - } else if (tgtSa.canTgtPlaneswalker() && !tgtAb.canTgtPlaneswalker()) { - continue; - } - - // Check that "ab" has a ValidTgts specification that includes everything "sa" includes, or - // the AI can misplay String[] validTgtsSa = tgtSa.getValidTgts(); String[] validTgtsAb = tgtAb.getValidTgts(); if (!Arrays.asList(validTgtsSa).containsAll(Arrays.asList(validTgtsAb))) { From 5b7f18405386b8771d8823a6259ca71f40010824 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 14 Dec 2018 08:55:50 +0300 Subject: [PATCH 476/901] - A sturdier logic for Doublecast-like card AI. --- .../java/forge/ai/ability/DamageDealAi.java | 2 +- .../main/java/forge/ai/ability/EffectAi.java | 37 +++++++++++++++---- forge-gui/res/cardsfolder/d/doublecast.txt | 1 + .../res/cardsfolder/h/howl_of_the_horde.txt | 1 + 4 files changed, 33 insertions(+), 8 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java index b1e2089a820..08b8ea6b888 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -1044,7 +1044,7 @@ public class DamageDealAi extends DamageAiBase { cards.addAll(ai.getCardsIn(ZoneType.Battlefield)); cards.addAll(ai.getCardsActivableInExternalZones(true)); for (Card c : cards) { - for (SpellAbility ab : c.getSpellAbilities()) { + for (SpellAbility ab : c.getAllPossibleAbilities(ai, true)) { if (ab.equals(sa) || ab.getSubAbility() != null) { // decisions for complex SAs with subs are not supported yet continue; } diff --git a/forge-ai/src/main/java/forge/ai/ability/EffectAi.java b/forge-ai/src/main/java/forge/ai/ability/EffectAi.java index 59978ac5bee..4e1d31aa9ab 100644 --- a/forge-ai/src/main/java/forge/ai/ability/EffectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/EffectAi.java @@ -6,17 +6,14 @@ import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Iterables; -import forge.ai.ComputerUtil; -import forge.ai.ComputerUtilCard; -import forge.ai.ComputerUtilCombat; -import forge.ai.SpecialCardAi; -import forge.ai.SpellAbilityAi; -import forge.ai.SpellApiToAi; +import forge.ai.*; +import forge.card.mana.ManaCost; import forge.game.Game; import forge.game.GlobalRuleChange; import forge.game.ability.ApiType; import forge.game.card.*; import forge.game.combat.CombatUtil; +import forge.game.cost.Cost; import forge.game.keyword.Keyword; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; @@ -116,10 +113,36 @@ public class EffectAi extends SpellAbilityAi { } else if (logic.equals("SpellCopy")) { // fetch Instant or Sorcery and AI has reason to play this turn // does not try to get itself + ManaCost costSa = sa.getPayCosts() != null ? sa.getPayCosts().getTotalMana() : ManaCost.NO_COST; final int count = CardLists.count(ai.getCardsIn(ZoneType.Hand), new Predicate() { @Override public boolean apply(final Card c) { - return (c.isInstant() || c.isSorcery()) && c != sa.getHostCard() && ComputerUtil.hasReasonToPlayCardThisTurn(ai, c); + if (!(c.isInstant() || c.isSorcery()) || c.equals(sa.getHostCard())) { + return false; + } + for (SpellAbility ab : c.getAllPossibleAbilities(ai, true)) { + if (ComputerUtilAbility.getAbilitySourceName(sa).equals(ComputerUtilAbility.getAbilitySourceName(ab)) + || ab.hasParam("AINoRecursiveCheck")) { + // prevent infinitely recursing mana ritual and other abilities with reentry + continue; + } else if ("SpellCopy".equals(ab.getParam("AILogic")) && ab.getApi() == ApiType.Effect) { + // don't copy another copy spell, too complex for the AI + continue; + } + AiPlayDecision decision = ((PlayerControllerAi)ai.getController()).getAi().canPlaySa(ab); + // see if we can pay both for this spell and for the Effect spell we're considering + if (decision == AiPlayDecision.WillPlay || decision == AiPlayDecision.WaitForMain2) { + ManaCost costAb = ab.getPayCosts() != null ? ab.getPayCosts().getTotalMana() : ManaCost.NO_COST; + ManaCost total = ManaCost.combine(costSa, costAb); + SpellAbility combinedAb = ab.copyWithDefinedCost(new Cost(total, false)); + // can we pay both costs? + if (ComputerUtilMana.canPayManaCost(combinedAb, ai, 0)) { + return true; + } + } + } + + return false; } }); diff --git a/forge-gui/res/cardsfolder/d/doublecast.txt b/forge-gui/res/cardsfolder/d/doublecast.txt index 2a8c480025b..a985e86df03 100644 --- a/forge-gui/res/cardsfolder/d/doublecast.txt +++ b/forge-gui/res/cardsfolder/d/doublecast.txt @@ -5,4 +5,5 @@ A:SP$ Effect | Cost$ R R | AILogic$ SpellCopy | Name$ Doublecast Effect | Trigge SVar:EffTModeSpellCast:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | OneOff$ True | Execute$ EffTrigCopy | TriggerZones$ Command | TriggerDescription$ When you cast your next instant or sorcery spell this turn, copy that spell. You may choose new targets for the copy. SVar:EffTrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | SubAbility$ EffDBCleanup SVar:EffDBCleanup:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile +SVar:AIPriorityModifier:9 Oracle:When you cast your next instant or sorcery spell this turn, copy that spell. You may choose new targets for that copy. diff --git a/forge-gui/res/cardsfolder/h/howl_of_the_horde.txt b/forge-gui/res/cardsfolder/h/howl_of_the_horde.txt index 577a5c5206d..5b809676fcb 100644 --- a/forge-gui/res/cardsfolder/h/howl_of_the_horde.txt +++ b/forge-gui/res/cardsfolder/h/howl_of_the_horde.txt @@ -7,5 +7,6 @@ SVar:RaidTest:Count$AttackersDeclared SVar:TrigCopy:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | OneOff$ True | Execute$ TrigCopyMain | TriggerZones$ Command | TriggerDescription$ When you cast your next instant or sorcery spell this turn, copy that spell. You may choose new targets for the copy. SVar:TrigCopyMain:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | SubAbility$ DBCleanup SVar:DBCleanup:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile +SVar:AIPriorityModifier:9 SVar:Picture:http://www.wizards.com/global/images/magic/general/howl_of_the_horde.jpg Oracle:When you cast your next instant or sorcery spell this turn, copy that spell. You may choose new targets for the copy.\nRaid — If you attacked with a creature this turn, when you cast your next instant or sorcery spell this turn, copy that spell an additional time. You may choose new targets for the copy. From 091fe36b2bc313d7848afa30cb6635d3dfc10f9a Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 14 Dec 2018 13:51:23 +0300 Subject: [PATCH 477/901] - Basic logic to try not to be very wasteful with X-based direct damage spells (and the AI properties for it). Currently in Experimental profile. --- forge-ai/src/main/java/forge/ai/AiProps.java | 6 ++++-- .../java/forge/ai/ability/DamageDealAi.java | 17 ++++++++++++++++- forge-gui/res/ai/Experimental.ai | 15 ++++++++++++--- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiProps.java b/forge-ai/src/main/java/forge/ai/AiProps.java index 5e976bbfbb0..26ff72aeb7a 100644 --- a/forge-ai/src/main/java/forge/ai/AiProps.java +++ b/forge-ai/src/main/java/forge/ai/AiProps.java @@ -127,9 +127,11 @@ public enum AiProps { /** */ FLASH_USE_BUFF_AURAS_AS_COMBAT_TRICKS("true"), FLASH_BUFF_AURA_CHANCE_TO_CAST_EARLY("1"), FLASH_BUFF_AURA_CHANCE_CAST_AT_EOT("5"), - FLASH_BUFF_AURA_CHANCE_TO_RESPOND_TO_STACK("100"); /** */ + FLASH_BUFF_AURA_CHANCE_TO_RESPOND_TO_STACK("100"), /** */ // Experimental features, must be promoted or removed after extensive testing and, ideally, defaulting - // <-- There are no experimental options here --> + HOLD_X_DAMAGE_SPELLS_FOR_MORE_DAMAGE_CHANCE("0"), + HOLD_X_DAMAGE_SPELLS_THRESHOLD("0"); /** */ + // <-- There are no other experimental options here --> private final String strDefaultVal; 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 08b8ea6b888..74e8b285728 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -97,8 +97,23 @@ public class DamageDealAi extends DamageAiBase { if (damage.equals("X")) { if (sa.getSVar(damage).equals("Count$xPaid") || sourceName.equals("Crater's Claws")) { - // Set PayX here to maximum value. dmg = ComputerUtilMana.determineLeftoverMana(sa, ai); + + // Try not to waste spells like Blaze or Fireball on early targets, try to do more damage with them if possible + if (ai.getController().isAI()) { + AiController aic = ((PlayerControllerAi)ai.getController()).getAi(); + int holdChance = aic.getIntProperty(AiProps.HOLD_X_DAMAGE_SPELLS_FOR_MORE_DAMAGE_CHANCE); + if (MyRandom.percentTrue(holdChance)) { + int threshold = aic.getIntProperty(AiProps.HOLD_X_DAMAGE_SPELLS_THRESHOLD); + boolean inDanger = ComputerUtil.aiLifeInDanger(ai, false, 0); + boolean isLethal = sa.getTargetRestrictions().canTgtPlayer() && dmg >= ai.getWeakestOpponent().getLife() && !ai.getWeakestOpponent().cantLoseForZeroOrLessLife(); + if (dmg < threshold && ai.getGame().getPhaseHandler().getTurn() / 2 < threshold && !inDanger && !isLethal) { + return false; + } + } + } + + // Set PayX here to maximum value. It will be adjusted later depending on the target. source.setSVar("PayX", Integer.toString(dmg)); } else if (sa.getSVar(damage).contains("InYourHand") && source.getZone().is(ZoneType.Hand)) { dmg = CardFactoryUtil.xCount(source, sa.getSVar(damage)) - 1; // the card will be spent casting the spell, so actual damage is 1 less diff --git a/forge-gui/res/ai/Experimental.ai b/forge-gui/res/ai/Experimental.ai index e7ea101aaba..80306b55205 100644 --- a/forge-gui/res/ai/Experimental.ai +++ b/forge-gui/res/ai/Experimental.ai @@ -222,10 +222,10 @@ SURVEIL_NUM_CARDS_IN_LIBRARY_TO_BAIL=8 SURVEIL_LIFEPERC_AFTER_PAYING_LIFE=50 # Attempt to predict the number of potential blockers with various forms of evasion when -# deciding to do an all-in assault attack (Experimental!) +# deciding to do an all-in assault attack COMBAT_ASSAULT_ATTACK_EVASION_PREDICTION=true # Attempt to predict the number of potential blockers with various forms of evasion when -# deciding to do an attrition race attack (Experimental!) +# deciding to do an attrition race attack COMBAT_ATTRITION_ATTACK_EVASION_PREDICTION=true # AILogic$ PayEnergyConservatively (used for Britsling Hydra and Longtusk Cub) will only @@ -281,4 +281,13 @@ MOJHOSTO_CHANCE_TO_USE_JHOIRA_COPY_INSTANT=20 # -- features is over. These toggles will be removed later, or may be reintroduced under a -- # -- different name if necessary -- -# <-- there are no experimental options here at the moment --> +# The chance that the AI will try to hold on to a direct damage spell with X in its cost (e.g. Blaze, Fireball, etc.) +# so that it doesn't cast it too early in the game against an early game target. Note that when in danger or when the +# AI has a chance to finish the opponent off with such a spell, it will not hold back the spells. +HOLD_X_DAMAGE_SPELLS_FOR_MORE_DAMAGE_CHANCE=100 +# This threshold defines the minimum amount of damage *or* the minimum number of the AI's turn in order to play a +# direct damage spell with X without holding it back. For example, if set to 5, the AI will prefer to hold the spell +# back (unless lethal/in danger) unless it can deal 5 or more damage with it or unless it's the AI's 5th turn or later. +HOLD_X_DAMAGE_SPELLS_THRESHOLD=5 + +# <-- there are no other experimental options here at the moment --> From 5ff5ce0556817432f500ed8bb969c113d6d3d6e2 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 14 Dec 2018 13:51:55 +0300 Subject: [PATCH 478/901] - PumpAI should account for spending a card cast from hand when counting P/T (fixes Inner Calm, Outer Strength AI assumptions). --- forge-ai/src/main/java/forge/ai/ability/PumpAi.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java index fc824738fb9..928a2ed77c9 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java @@ -316,6 +316,9 @@ public class PumpAi extends PumpAiBase { } } else { defense = AbilityUtils.calculateAmount(sa.getHostCard(), numDefense, sa); + if (numDefense.contains("X") && sa.getSVar("X").equals("Count$CardsInYourHand") && source.getZone().is(ZoneType.Hand)) { + defense--; // the card will be spent casting the spell, so actual toughness is 1 less + } } int attack; @@ -332,6 +335,9 @@ public class PumpAi extends PumpAiBase { } } else { attack = AbilityUtils.calculateAmount(sa.getHostCard(), numAttack, sa); + if (numAttack.contains("X") && sa.getSVar("X").equals("Count$CardsInYourHand") && source.getZone().is(ZoneType.Hand)) { + attack--; // the card will be spent casting the spell, so actual power is 1 less + } } if ("ContinuousBonus".equals(aiLogic)) { From 08ead5b5e256072f57a763f0ee7ad824a870e599 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 15 Dec 2018 08:09:01 +0300 Subject: [PATCH 479/901] - Tweaked Risk Factor to be AI-playable. --- forge-gui/res/cardsfolder/r/risk_factor.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/r/risk_factor.txt b/forge-gui/res/cardsfolder/r/risk_factor.txt index 6451e0530c0..63230a5641a 100644 --- a/forge-gui/res/cardsfolder/r/risk_factor.txt +++ b/forge-gui/res/cardsfolder/r/risk_factor.txt @@ -2,6 +2,6 @@ Name:Risk Factor ManaCost:2 R Types:Instant K:Jump-start -A:SP$ Pump | StackDescription$ {p:Targeted} may have CARDNAME deal 4 damage to them. If {p:Targeted} doesn't, | Cost$ 2 R | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | UnlessCost$ DamageYou<4> | UnlessPayer$ Targeted | UnlessResolveSubs$ WhenNotPaid | SubAbility$ DBDraw | SpellDescription$ Target opponent may have CARDNAME deal 4 damage to them. If that player doesn't, you draw three cards. +A:SP$ Pump | StackDescription$ {p:Targeted} may have CARDNAME deal 4 damage to them. If {p:Targeted} doesn't, | Cost$ 2 R | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | UnlessCost$ DamageYou<4> | UnlessPayer$ Targeted | UnlessResolveSubs$ WhenNotPaid | SubAbility$ DBDraw | IsCurse$ True | SpellDescription$ Target opponent may have CARDNAME deal 4 damage to them. If that player doesn't, you draw three cards. SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 3 Oracle:Target opponent may have Risk Factor deal 4 damage to them. If that player doesn't, you draw three cards.\nJump-start (You may cast this card from your graveyard by discarding a card in addition to paying its other costs. Then exile this card.) From 134b4a7d77faa1c4a00e9a8ddc9abd3fb2a2f265 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 15 Dec 2018 08:52:59 +0300 Subject: [PATCH 480/901] - Added basic AI support for Jump-start (the old-fashioned way for now). --- .../main/java/forge/game/GameActionUtil.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameActionUtil.java b/forge-game/src/main/java/forge/game/GameActionUtil.java index 79824f924f7..6fa0a5a9667 100644 --- a/forge-game/src/main/java/forge/game/GameActionUtil.java +++ b/forge-game/src/main/java/forge/game/GameActionUtil.java @@ -381,7 +381,7 @@ public final class GameActionUtil { } } else if (keyword.startsWith("MayFlashCost")) { // this is there for the AI - if ( source.getGame().getPhaseHandler().isPlayerTurn(source.getController())) { + if (source.getGame().getPhaseHandler().isPlayerTurn(source.getController())) { continue; // don't cast it with additional flash cost during AI's own turn, commonly a waste of mana } final String[] k = keyword.split(":"); @@ -426,7 +426,7 @@ public final class GameActionUtil { newSA.setBasicSpell(false); final Cost cost1 = new Cost(sCosts[0], false); final Cost cost2 = new Cost(sCosts[1], false); - newSA.setDescription(TextUtil.addSuffix(newSA.getDescription(), TextUtil.concatWithSpace(" (Both kickers:", cost1.toSimpleString(),"and",TextUtil.addSuffix(cost2.toSimpleString(),")")))); + newSA.setDescription(TextUtil.addSuffix(newSA.getDescription(), TextUtil.concatWithSpace(" (Both kickers:", cost1.toSimpleString(), "and", TextUtil.addSuffix(cost2.toSimpleString(), ")")))); newSA.setPayCosts(cost2.add(cost1.add(newSA.getPayCosts()))); newSA.addOptionalCost(OptionalCost.Kicker1); newSA.addOptionalCost(OptionalCost.Kicker2); @@ -457,6 +457,22 @@ public final class GameActionUtil { } } } + + if (source.hasKeyword(Keyword.JUMP_START)) { + for (int i = 0; i < abilities.size(); i++) { + final SpellAbility newSA = abilities.get(i).copy(); + newSA.setBasicSpell(false); + final String jumpstartCost = "Discard<1/Card>"; + newSA.setPayCosts(new Cost(jumpstartCost, false).add(newSA.getPayCosts())); + newSA.getRestrictions().setZone(ZoneType.Graveyard); + newSA.setDescription(newSA.getDescription() + " (Jump-start)"); + if (newSA.canPlay()) { + abilities.add(i, newSA); + i++; + } + } + } + return abilities; } From f9cd1734055e827acf71d2f81568707615f4d8cb Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 15 Dec 2018 09:10:55 +0300 Subject: [PATCH 481/901] - Prevent the AI from relying on the ability to play a spell with an optional cost when deciding to do an assault attack with possible non-combat damage (prevents certain silly suicidal chump-attacks) --- forge-ai/src/main/java/forge/ai/ComputerUtil.java | 8 ++++---- forge-game/src/main/java/forge/game/GameActionUtil.java | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index eb75fc8b9e6..a0b46aebb42 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -26,10 +26,7 @@ import forge.card.CardType; import forge.card.ColorSet; import forge.card.MagicColor; import forge.card.mana.ManaCostShard; -import forge.game.CardTraitPredicates; -import forge.game.Game; -import forge.game.GameObject; -import forge.game.GameType; +import forge.game.*; import forge.game.ability.AbilityFactory; import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; @@ -1454,6 +1451,9 @@ public class ComputerUtil { if (!ComputerUtilCost.canPayCost(sa, ai)) { continue; } + if (!GameActionUtil.getOptionalCostValues(sa).isEmpty()) { + continue; // we can't rely on the AI being always willing and able to pay the optional cost to deal extra damage + } damage = dmg; } diff --git a/forge-game/src/main/java/forge/game/GameActionUtil.java b/forge-game/src/main/java/forge/game/GameActionUtil.java index 6fa0a5a9667..8c098e516e4 100644 --- a/forge-game/src/main/java/forge/game/GameActionUtil.java +++ b/forge-game/src/main/java/forge/game/GameActionUtil.java @@ -466,6 +466,7 @@ public final class GameActionUtil { newSA.setPayCosts(new Cost(jumpstartCost, false).add(newSA.getPayCosts())); newSA.getRestrictions().setZone(ZoneType.Graveyard); newSA.setDescription(newSA.getDescription() + " (Jump-start)"); + newSA.addOptionalCost(OptionalCost.Jumpstart); if (newSA.canPlay()) { abilities.add(i, newSA); i++; From c6515bdf4af0f746b87e5bb09234cb00dfd1ca5f Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 15 Dec 2018 09:58:02 +0300 Subject: [PATCH 482/901] - Some tweaks to damage chaining. - Improved Narset Transcendent AI logic for -2. --- .../java/forge/ai/ability/DamageDealAi.java | 5 +++- .../main/java/forge/ai/ability/EffectAi.java | 27 ++++++++++++++++--- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java index 74e8b285728..b5f604d2ea4 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -1059,10 +1059,13 @@ public class DamageDealAi extends DamageAiBase { cards.addAll(ai.getCardsIn(ZoneType.Battlefield)); cards.addAll(ai.getCardsActivableInExternalZones(true)); for (Card c : cards) { - for (SpellAbility ab : c.getAllPossibleAbilities(ai, true)) { + for (SpellAbility ab : c.getSpellAbilities()) { if (ab.equals(sa) || ab.getSubAbility() != null) { // decisions for complex SAs with subs are not supported yet continue; } + if (!ab.canPlay()) { + continue; + } // currently works only with cards that don't have additional costs (only mana is supported) if (ab.getPayCosts() != null && (ab.getPayCosts().hasNoManaCost() || ab.getPayCosts().hasOnlySpecificCostType(CostPartMana.class))) { diff --git a/forge-ai/src/main/java/forge/ai/ability/EffectAi.java b/forge-ai/src/main/java/forge/ai/ability/EffectAi.java index 4e1d31aa9ab..0296cc100a8 100644 --- a/forge-ai/src/main/java/forge/ai/ability/EffectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/EffectAi.java @@ -120,7 +120,7 @@ public class EffectAi extends SpellAbilityAi { if (!(c.isInstant() || c.isSorcery()) || c.equals(sa.getHostCard())) { return false; } - for (SpellAbility ab : c.getAllPossibleAbilities(ai, true)) { + for (SpellAbility ab : c.getSpellAbilities()) { if (ComputerUtilAbility.getAbilitySourceName(sa).equals(ComputerUtilAbility.getAbilitySourceName(ab)) || ab.hasParam("AINoRecursiveCheck")) { // prevent infinitely recursing mana ritual and other abilities with reentry @@ -129,6 +129,9 @@ public class EffectAi extends SpellAbilityAi { // don't copy another copy spell, too complex for the AI continue; } + if (!ab.canPlay()) { + continue; + } AiPlayDecision decision = ((PlayerControllerAi)ai.getController()).getAi().canPlaySa(ab); // see if we can pay both for this spell and for the Effect spell we're considering if (decision == AiPlayDecision.WillPlay || decision == AiPlayDecision.WaitForMain2) { @@ -162,8 +165,26 @@ public class EffectAi extends SpellAbilityAi { final int count = CardLists.count(ai.getCardsIn(ZoneType.Hand), new Predicate() { @Override public boolean apply(final Card c) { - return (c.isInstant() || c.isSorcery()) && !c.hasKeyword(Keyword.REBOUND) - && ComputerUtil.hasReasonToPlayCardThisTurn(ai, c); + if (!(c.isInstant() || c.isSorcery()) || c.hasKeyword(Keyword.REBOUND)) { + return false; + } + for (SpellAbility ab : c.getSpellAbilities()) { + if (ComputerUtilAbility.getAbilitySourceName(sa).equals(ComputerUtilAbility.getAbilitySourceName(ab)) + || ab.hasParam("AINoRecursiveCheck")) { + // prevent infinitely recursing mana ritual and other abilities with reentry + continue; + } + if (!ab.canPlay()) { + continue; + } + AiPlayDecision decision = ((PlayerControllerAi)ai.getController()).getAi().canPlaySa(ab); + if (decision == AiPlayDecision.WillPlay || decision == AiPlayDecision.WaitForMain2) { + if (ComputerUtilMana.canPayManaCost(ab, ai, 0)) { + return true; + } + } + } + return false; } }); From f2e9d5913ef06dbc876daf3d98521a82d43d9f95 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 15 Dec 2018 10:01:29 +0300 Subject: [PATCH 483/901] - Default settings for holding back X damage spells. --- forge-ai/src/main/java/forge/ai/AiProps.java | 8 ++++---- forge-gui/res/ai/Cautious.ai | 9 +++++++++ forge-gui/res/ai/Default.ai | 9 +++++++++ forge-gui/res/ai/Experimental.ai | 20 ++++++++++---------- forge-gui/res/ai/Reckless.ai | 9 +++++++++ 5 files changed, 41 insertions(+), 14 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiProps.java b/forge-ai/src/main/java/forge/ai/AiProps.java index 26ff72aeb7a..290744383e4 100644 --- a/forge-ai/src/main/java/forge/ai/AiProps.java +++ b/forge-ai/src/main/java/forge/ai/AiProps.java @@ -80,6 +80,8 @@ public enum AiProps { /** */ AVOID_TARGETING_CREATS_THAT_WILL_DIE ("true"), /** */ DONT_EVAL_KILLSPELLS_ON_STACK_WITH_PERMISSION ("true"), /** */ CHANCE_TO_CHAIN_TWO_DAMAGE_SPELLS("50"), /** */ + HOLD_X_DAMAGE_SPELLS_FOR_MORE_DAMAGE_CHANCE("100"), + HOLD_X_DAMAGE_SPELLS_THRESHOLD("5"), /** */ PRIORITY_REDUCTION_FOR_STORM_SPELLS ("0"), /** */ USE_BERSERK_AGGRESSIVELY ("false"), /** */ MIN_COUNT_FOR_STORM_SPELLS ("0"), /** */ @@ -127,11 +129,9 @@ public enum AiProps { /** */ FLASH_USE_BUFF_AURAS_AS_COMBAT_TRICKS("true"), FLASH_BUFF_AURA_CHANCE_TO_CAST_EARLY("1"), FLASH_BUFF_AURA_CHANCE_CAST_AT_EOT("5"), - FLASH_BUFF_AURA_CHANCE_TO_RESPOND_TO_STACK("100"), /** */ + FLASH_BUFF_AURA_CHANCE_TO_RESPOND_TO_STACK("100"); /** */ // Experimental features, must be promoted or removed after extensive testing and, ideally, defaulting - HOLD_X_DAMAGE_SPELLS_FOR_MORE_DAMAGE_CHANCE("0"), - HOLD_X_DAMAGE_SPELLS_THRESHOLD("0"); /** */ - // <-- There are no other experimental options here --> + // <-- There are no experimental options here --> private final String strDefaultVal; diff --git a/forge-gui/res/ai/Cautious.ai b/forge-gui/res/ai/Cautious.ai index ee2ab585a38..2cc850ed726 100644 --- a/forge-gui/res/ai/Cautious.ai +++ b/forge-gui/res/ai/Cautious.ai @@ -125,6 +125,15 @@ DESTROY_IMMEDIATELY_UNBLOCKABLE_LIFE_IN_DNGR=5 # if the AI is in danger of dying. CHANCE_TO_CHAIN_TWO_DAMAGE_SPELLS=25 +# The chance that the AI will try to hold on to a direct damage spell with X in its cost (e.g. Blaze, Fireball, etc.) +# so that it doesn't cast it too early in the game against an early game target. Note that when in danger or when the +# AI has a chance to finish the opponent off with such a spell, it will not hold back the spells. +HOLD_X_DAMAGE_SPELLS_FOR_MORE_DAMAGE_CHANCE=100 +# This threshold defines the minimum amount of damage *or* the minimum number of the AI's turn in order to play a +# direct damage spell with X without holding it back. For example, if set to 5, the AI will prefer to hold the spell +# back (unless lethal/in danger) unless it can deal 5 or more damage with it or unless it's the AI's 5th turn or later. +HOLD_X_DAMAGE_SPELLS_THRESHOLD=6 + # Permission timings MIN_SPELL_CMC_TO_COUNTER=2 CHANCE_TO_COUNTER_CMC_1=0 diff --git a/forge-gui/res/ai/Default.ai b/forge-gui/res/ai/Default.ai index 1e3510af48f..2801deae8af 100644 --- a/forge-gui/res/ai/Default.ai +++ b/forge-gui/res/ai/Default.ai @@ -125,6 +125,15 @@ DESTROY_IMMEDIATELY_UNBLOCKABLE_LIFE_IN_DNGR=5 # if the AI is in danger of dying. CHANCE_TO_CHAIN_TWO_DAMAGE_SPELLS=50 +# The chance that the AI will try to hold on to a direct damage spell with X in its cost (e.g. Blaze, Fireball, etc.) +# so that it doesn't cast it too early in the game against an early game target. Note that when in danger or when the +# AI has a chance to finish the opponent off with such a spell, it will not hold back the spells. +HOLD_X_DAMAGE_SPELLS_FOR_MORE_DAMAGE_CHANCE=100 +# This threshold defines the minimum amount of damage *or* the minimum number of the AI's turn in order to play a +# direct damage spell with X without holding it back. For example, if set to 5, the AI will prefer to hold the spell +# back (unless lethal/in danger) unless it can deal 5 or more damage with it or unless it's the AI's 5th turn or later. +HOLD_X_DAMAGE_SPELLS_THRESHOLD=5 + # Permission timings MIN_SPELL_CMC_TO_COUNTER=0 CHANCE_TO_COUNTER_CMC_1=30 diff --git a/forge-gui/res/ai/Experimental.ai b/forge-gui/res/ai/Experimental.ai index 80306b55205..17744a3c4a1 100644 --- a/forge-gui/res/ai/Experimental.ai +++ b/forge-gui/res/ai/Experimental.ai @@ -125,6 +125,15 @@ DESTROY_IMMEDIATELY_UNBLOCKABLE_LIFE_IN_DNGR=5 # if the AI is in danger of dying. CHANCE_TO_CHAIN_TWO_DAMAGE_SPELLS=100 +# The chance that the AI will try to hold on to a direct damage spell with X in its cost (e.g. Blaze, Fireball, etc.) +# so that it doesn't cast it too early in the game against an early game target. Note that when in danger or when the +# AI has a chance to finish the opponent off with such a spell, it will not hold back the spells. +HOLD_X_DAMAGE_SPELLS_FOR_MORE_DAMAGE_CHANCE=100 +# This threshold defines the minimum amount of damage *or* the minimum number of the AI's turn in order to play a +# direct damage spell with X without holding it back. For example, if set to 5, the AI will prefer to hold the spell +# back (unless lethal/in danger) unless it can deal 5 or more damage with it or unless it's the AI's 5th turn or later. +HOLD_X_DAMAGE_SPELLS_THRESHOLD=5 + # Permission timings MIN_SPELL_CMC_TO_COUNTER=2 CHANCE_TO_COUNTER_CMC_1=30 @@ -281,13 +290,4 @@ MOJHOSTO_CHANCE_TO_USE_JHOIRA_COPY_INSTANT=20 # -- features is over. These toggles will be removed later, or may be reintroduced under a -- # -- different name if necessary -- -# The chance that the AI will try to hold on to a direct damage spell with X in its cost (e.g. Blaze, Fireball, etc.) -# so that it doesn't cast it too early in the game against an early game target. Note that when in danger or when the -# AI has a chance to finish the opponent off with such a spell, it will not hold back the spells. -HOLD_X_DAMAGE_SPELLS_FOR_MORE_DAMAGE_CHANCE=100 -# This threshold defines the minimum amount of damage *or* the minimum number of the AI's turn in order to play a -# direct damage spell with X without holding it back. For example, if set to 5, the AI will prefer to hold the spell -# back (unless lethal/in danger) unless it can deal 5 or more damage with it or unless it's the AI's 5th turn or later. -HOLD_X_DAMAGE_SPELLS_THRESHOLD=5 - -# <-- there are no other experimental options here at the moment --> +# <-- there are no experimental options here at the moment --> diff --git a/forge-gui/res/ai/Reckless.ai b/forge-gui/res/ai/Reckless.ai index b31835947a5..e2771362cd8 100644 --- a/forge-gui/res/ai/Reckless.ai +++ b/forge-gui/res/ai/Reckless.ai @@ -125,6 +125,15 @@ DESTROY_IMMEDIATELY_UNBLOCKABLE_LIFE_IN_DNGR=5 # if the AI is in danger of dying. CHANCE_TO_CHAIN_TWO_DAMAGE_SPELLS=75 +# The chance that the AI will try to hold on to a direct damage spell with X in its cost (e.g. Blaze, Fireball, etc.) +# so that it doesn't cast it too early in the game against an early game target. Note that when in danger or when the +# AI has a chance to finish the opponent off with such a spell, it will not hold back the spells. +HOLD_X_DAMAGE_SPELLS_FOR_MORE_DAMAGE_CHANCE=85 +# This threshold defines the minimum amount of damage *or* the minimum number of the AI's turn in order to play a +# direct damage spell with X without holding it back. For example, if set to 5, the AI will prefer to hold the spell +# back (unless lethal/in danger) unless it can deal 5 or more damage with it or unless it's the AI's 5th turn or later. +HOLD_X_DAMAGE_SPELLS_THRESHOLD=3 + # Permission timings MIN_SPELL_CMC_TO_COUNTER=0 CHANCE_TO_COUNTER_CMC_1=80 From 498f7325c9ca49925cf3f828df20c3aa1b9aa03c Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 15 Dec 2018 11:58:43 +0300 Subject: [PATCH 484/901] - Fix the AI logic for Expansion // Explosion (casting for 0, underdrawing). --- forge-ai/src/main/java/forge/ai/ability/DrawAi.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/forge-ai/src/main/java/forge/ai/ability/DrawAi.java b/forge-ai/src/main/java/forge/ai/ability/DrawAi.java index df7ac314437..3fd77edf9fc 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DrawAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DrawAi.java @@ -365,6 +365,10 @@ public class DrawAi extends SpellAbilityAi { if (numCards >= computerLibrarySize) { if (xPaid) { numCards = computerLibrarySize - 1; + if (numCards <= 0 && !mandatory) { + // not drawing anything, so don't do it + return false; + } } else if (!ai.isCardInPlay("Laboratory Maniac")) { aiTarget = false; } @@ -398,6 +402,9 @@ public class DrawAi extends SpellAbilityAi { if (computerHandSize + numCards > computerMaxHandSize && game.getPhaseHandler().isPlayerTurn(ai)) { if (xPaid) { numCards = computerMaxHandSize - computerHandSize; + if (sa.getHostCard().getZone().is(ZoneType.Hand)) { + numCards++; // the card will be spent + } source.setSVar("PayX", Integer.toString(numCards)); } else { // Don't draw too many cards and then risk discarding From fc966a6ad4ce1da536d74156a0c96c4d53e20fd4 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 15 Dec 2018 20:27:07 +0300 Subject: [PATCH 485/901] - Tweaked AI logic for Llanowar Scout. --- forge-gui/res/cardsfolder/l/llanowar_scout.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/l/llanowar_scout.txt b/forge-gui/res/cardsfolder/l/llanowar_scout.txt index 001357e4d78..b16a58bb41a 100644 --- a/forge-gui/res/cardsfolder/l/llanowar_scout.txt +++ b/forge-gui/res/cardsfolder/l/llanowar_scout.txt @@ -2,6 +2,6 @@ Name:Llanowar Scout ManaCost:1 G Types:Creature Elf Scout PT:1/3 -A:AB$ ChangeZone | Cost$ T | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land | ChangeNum$ 1 | SpellDescription$ You may put a land card from your hand onto the battlefield. +A:AB$ ChangeZone | Cost$ T | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land | ChangeNum$ 1 | AILogic$ AtOppEOT | SpellDescription$ You may put a land card from your hand onto the battlefield. SVar:Picture:http://www.wizards.com/global/images/magic/general/llanowar_scout.jpg Oracle:{T}: You may put a land card from your hand onto the battlefield. From 0628ebcb5486e5017cbf071d02b76ec3f1a25a74 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 15 Dec 2018 20:43:57 +0300 Subject: [PATCH 486/901] - First steps in figuring out the infrastructure for AI chooseOptionalCosts and implementing Entwine. --- .../main/java/forge/ai/ComputerUtilAbility.java | 10 ++++++++++ .../main/java/forge/ai/PlayerControllerAi.java | 15 +++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java index 790e571852d..7b011d36c30 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java @@ -12,6 +12,7 @@ import forge.game.card.CardCollectionView; import forge.game.card.CardLists; import forge.game.card.CardPredicates.Presets; import forge.game.player.Player; +import forge.game.spellability.OptionalCostValue; import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbilityStackInstance; import forge.game.zone.ZoneType; @@ -104,8 +105,17 @@ public class ComputerUtilAbility { final List result = Lists.newArrayList(); for (SpellAbility sa : newAbilities) { sa.setActivatingPlayer(player); + // TODO: remove this once all optional costs are ported over to chooseOptionalCosts result.addAll(GameActionUtil.getOptionalCosts(sa)); + + // Optional cost selection through the AI controller + List list = GameActionUtil.getOptionalCostValues(sa); + if (!list.isEmpty()) { + list = player.getController().chooseOptionalCosts(sa, list); + } + result.add(GameActionUtil.addOptionalCosts(sa, list)); } + return result; } diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 7cc53529839..55e255f58e9 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -1149,7 +1149,18 @@ public class PlayerControllerAi extends PlayerController { @Override public List chooseOptionalCosts(SpellAbility choosen, List optionalCostValues) { - // TODO Auto-generated method stub - return null; + List chosen = Lists.newArrayList(); + + for (OptionalCostValue opt : optionalCostValues) { + if (opt.getType() == OptionalCost.Entwine) { + // Test implementation: just always choose Entwine + chosen.add(opt); + } + else { + System.out.println("Skipping unported optional cost: " + opt.getType()); + } + } + + return chosen; } } From 7a53a0fb3681495b774f3e1256133cb1475ebfc0 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 15 Dec 2018 22:08:16 +0300 Subject: [PATCH 487/901] - Improve implementation for Entwine AI. - Fixed an issue which made the SpellAbilityAi#isSorcerySpeed not to work correctly when checking from subabilities. --- .../java/forge/ai/ComputerUtilAbility.java | 4 +++- .../main/java/forge/ai/PlayerControllerAi.java | 18 ++++++++++-------- .../src/main/java/forge/ai/SpellAbilityAi.java | 4 ++-- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java index 7b011d36c30..96ab2e19a88 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java @@ -112,8 +112,10 @@ public class ComputerUtilAbility { List list = GameActionUtil.getOptionalCostValues(sa); if (!list.isEmpty()) { list = player.getController().chooseOptionalCosts(sa, list); + if (!list.isEmpty()) { + result.add(GameActionUtil.addOptionalCosts(sa, list)); + } } - result.add(GameActionUtil.addOptionalCosts(sa, list)); } return result; diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 55e255f58e9..245d10f472e 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -15,10 +15,7 @@ import forge.card.MagicColor; import forge.card.mana.ManaCost; import forge.card.mana.ManaCostShard; import forge.deck.Deck; -import forge.game.Game; -import forge.game.GameEntity; -import forge.game.GameObject; -import forge.game.GameType; +import forge.game.*; import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; import forge.game.card.*; @@ -1147,20 +1144,25 @@ public class PlayerControllerAi extends PlayerController { } @Override - public List chooseOptionalCosts(SpellAbility choosen, + public List chooseOptionalCosts(SpellAbility chosen, List optionalCostValues) { - List chosen = Lists.newArrayList(); + List chosenOptCosts = Lists.newArrayList(); + Cost cost = chosen.getPayCosts(); for (OptionalCostValue opt : optionalCostValues) { if (opt.getType() == OptionalCost.Entwine) { // Test implementation: just always choose Entwine - chosen.add(opt); + Cost fullCost = opt.getCost().copy().add(cost); + SpellAbility fullCostSa = chosen.copyWithDefinedCost(fullCost); + if (ComputerUtilCost.canPayCost(fullCostSa, player)) { + chosenOptCosts.add(opt); + } } else { System.out.println("Skipping unported optional cost: " + opt.getType()); } } - return chosen; + return chosenOptCosts; } } diff --git a/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java b/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java index 928cdb3b384..03c96209a0c 100644 --- a/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java +++ b/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java @@ -245,8 +245,8 @@ public abstract class SpellAbilityAi { * @return a boolean. */ protected static boolean isSorcerySpeed(final SpellAbility sa) { - return (sa.isSpell() && sa.getHostCard().isSorcery()) - || (sa.isAbility() && sa.getRestrictions().isSorcerySpeed()) + return (sa.getRootAbility().isSpell() && sa.getHostCard().isSorcery()) + || (sa.getRootAbility().isAbility() && sa.getRestrictions().isSorcerySpeed()) || (sa.getRestrictions().isPwAbility() && !sa.getHostCard().hasKeyword("CARDNAME's loyalty abilities can be activated at instant speed.")); } From 14799ccd62b55779f6771ce1eeb887cc2f62f339 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 16 Dec 2018 09:11:54 +0300 Subject: [PATCH 488/901] - Complete the basic implementation of AI optional cost choice, remove getOptionalCosts. --- .../src/main/java/forge/ai/AiController.java | 28 ++-- .../java/forge/ai/ComputerUtilAbility.java | 9 +- .../java/forge/ai/PlayerControllerAi.java | 19 +-- .../main/java/forge/game/GameActionUtil.java | 132 ------------------ 4 files changed, 32 insertions(+), 156 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index d1ac0f4deac..64e38102def 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -849,20 +849,22 @@ public class AiController { int neededMana = 0; boolean dangerousRecurringCost = false; - for (SpellAbility sa2 : GameActionUtil.getOptionalCosts(sa)) { - if (sa2.isOptionalCostPaid(OptionalCost.Buyback)) { - Cost sac = sa2.getPayCosts(); - CostAdjustment.adjust(sac, sa2); - if (sac.getCostMana() != null) { - neededMana = sac.getCostMana().getMana().getCMC(); - } - if (sac.hasSpecificCostType(CostPayLife.class) - || sac.hasSpecificCostType(CostDiscard.class) - || sac.hasSpecificCostType(CostSacrifice.class)) { - dangerousRecurringCost = true; - } + + Cost costWithBuyback = sa.getPayCosts().copy(); + for (OptionalCostValue opt : GameActionUtil.getOptionalCostValues(sa)) { + if (opt.getType() == OptionalCost.Buyback) { + costWithBuyback.add(opt.getCost()); } } + CostAdjustment.adjust(costWithBuyback, sa); + if (costWithBuyback.getCostMana() != null) { + neededMana = costWithBuyback.getCostMana().getMana().getCMC(); + } + if (costWithBuyback.hasSpecificCostType(CostPayLife.class) + || costWithBuyback.hasSpecificCostType(CostDiscard.class) + || costWithBuyback.hasSpecificCostType(CostSacrifice.class)) { + dangerousRecurringCost = true; + } // won't be able to afford buyback any time soon // if Buyback cost includes sacrifice, life, discard @@ -1568,7 +1570,7 @@ public class AiController { sa.setActivatingPlayer(player); sa.setLastStateBattlefield(game.getLastStateBattlefield()); sa.setLastStateGraveyard(game.getLastStateGraveyard()); - + AiPlayDecision opinion = canPlayAndPayFor(sa); // PhaseHandler ph = game.getPhaseHandler(); // System.out.printf("Ai thinks '%s' of %s -> %s @ %s %s >>> \n", opinion, sa.getHostCard(), sa, Lang.getPossesive(ph.getPlayerTurn().getName()), ph.getPhase()); diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java index 96ab2e19a88..366e53865a4 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java @@ -105,17 +105,22 @@ public class ComputerUtilAbility { final List result = Lists.newArrayList(); for (SpellAbility sa : newAbilities) { sa.setActivatingPlayer(player); - // TODO: remove this once all optional costs are ported over to chooseOptionalCosts - result.addAll(GameActionUtil.getOptionalCosts(sa)); // Optional cost selection through the AI controller + boolean choseOptCost = false; List list = GameActionUtil.getOptionalCostValues(sa); if (!list.isEmpty()) { list = player.getController().chooseOptionalCosts(sa, list); if (!list.isEmpty()) { + choseOptCost = true; result.add(GameActionUtil.addOptionalCosts(sa, list)); } } + + // Add only one ability: either the one with preferred optional costs, or the original one if there are none + if (!choseOptCost) { + result.add(sa); + } } return result; diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 245d10f472e..18370eb882a 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -1147,19 +1147,20 @@ public class PlayerControllerAi extends PlayerController { public List chooseOptionalCosts(SpellAbility chosen, List optionalCostValues) { List chosenOptCosts = Lists.newArrayList(); - Cost cost = chosen.getPayCosts(); + Cost costSoFar = chosen.getPayCosts() != null ? chosen.getPayCosts().copy() : Cost.Zero; for (OptionalCostValue opt : optionalCostValues) { if (opt.getType() == OptionalCost.Entwine) { - // Test implementation: just always choose Entwine - Cost fullCost = opt.getCost().copy().add(cost); - SpellAbility fullCostSa = chosen.copyWithDefinedCost(fullCost); - if (ComputerUtilCost.canPayCost(fullCostSa, player)) { - chosenOptCosts.add(opt); - } + // Specific code for optional costs should be made conditional here } - else { - System.out.println("Skipping unported optional cost: " + opt.getType()); + + // Generic code: for now, chooses the optional cost if it can be paid (and later - played) + Cost fullCost = opt.getCost().copy().add(costSoFar); + SpellAbility fullCostSa = chosen.copyWithDefinedCost(fullCost); + if (ComputerUtilCost.canPayCost(fullCostSa, player)) { + chosenOptCosts.add(opt); + costSoFar.add(opt.getCost()); + System.out.println("Chosen: " + opt + " for total cost of " + costSoFar.toSimpleString()); } } diff --git a/forge-game/src/main/java/forge/game/GameActionUtil.java b/forge-game/src/main/java/forge/game/GameActionUtil.java index 8c098e516e4..2661c66a038 100644 --- a/forge-game/src/main/java/forge/game/GameActionUtil.java +++ b/forge-game/src/main/java/forge/game/GameActionUtil.java @@ -345,138 +345,6 @@ public final class GameActionUtil { return abilities; } - - /** - * get optional additional costs. - * - * @param original - * the original sa - * @return an ArrayList. - * - * @deprecated only used by AI, replace it with new functions in AI - */ - @Deprecated public static List getOptionalCosts(final SpellAbility original) { - final List abilities = getAdditionalCostSpell(original); - - final Card source = original.getHostCard(); - - if (!original.isSpell()) { - return abilities; - } - - // Buyback, Kicker - for (KeywordInterface inst : source.getKeywords()) { - final String keyword = inst.getOriginal(); - if (keyword.startsWith("Buyback")) { - for (int i = 0; i < abilities.size(); i++) { - final SpellAbility newSA = abilities.get(i).copy(); - newSA.setBasicSpell(false); - newSA.setPayCosts(new Cost(keyword.substring(8), false).add(newSA.getPayCosts())); - newSA.setDescription(newSA.getDescription() + " (with Buyback)"); - newSA.addOptionalCost(OptionalCost.Buyback); - if (newSA.canPlay()) { - abilities.add(i, newSA); - i++; - } - } - } else if (keyword.startsWith("MayFlashCost")) { - // this is there for the AI - if (source.getGame().getPhaseHandler().isPlayerTurn(source.getController())) { - continue; // don't cast it with additional flash cost during AI's own turn, commonly a waste of mana - } - final String[] k = keyword.split(":"); - for (int i = 0; i < abilities.size(); i++) { - final SpellAbility newSA = abilities.get(i).copy(); - newSA.setBasicSpell(false); - newSA.setPayCosts(new Cost(k[1], false).add(newSA.getPayCosts())); - newSA.setDescription(newSA.getDescription() + " (as though it had flash)"); - newSA.getRestrictions().setInstantSpeed(true); - if (newSA.canPlay()) { - abilities.add(i, newSA); - i++; - } - } - } else if (keyword.startsWith("Kicker")) { - String[] sCosts = TextUtil.split(keyword.substring(6), ':'); - boolean generic = "Generic".equals(sCosts[sCosts.length - 1]); - // If this is a "generic kicker" (Undergrowth), ignore value for kicker creations - int numKickers = sCosts.length - (generic ? 1 : 0); - for (int i = 0; i < abilities.size(); i++) { - int iUnKicked = i; - for (int j = 0; j < numKickers; j++) { - final SpellAbility newSA = abilities.get(iUnKicked).copy(); - newSA.setBasicSpell(false); - final Cost cost = new Cost(sCosts[j], false); - newSA.setPayCosts(cost.add(newSA.getPayCosts())); - if (!generic) { - newSA.setDescription(newSA.getDescription() + " (Kicker " + cost.toSimpleString() + ")"); - newSA.addOptionalCost(j == 0 ? OptionalCost.Kicker1 : OptionalCost.Kicker2); - } else { - newSA.setDescription(newSA.getDescription() + " (Optional " + cost.toSimpleString() + ")"); - newSA.addOptionalCost(OptionalCost.Generic); - } - if (newSA.canPlay()) { - abilities.add(i, newSA); - i++; - iUnKicked++; - } - } - if (numKickers == 2) { // case for both kickers - it's hardcoded since they never have more than 2 kickers - final SpellAbility newSA = abilities.get(iUnKicked).copy(); - newSA.setBasicSpell(false); - final Cost cost1 = new Cost(sCosts[0], false); - final Cost cost2 = new Cost(sCosts[1], false); - newSA.setDescription(TextUtil.addSuffix(newSA.getDescription(), TextUtil.concatWithSpace(" (Both kickers:", cost1.toSimpleString(), "and", TextUtil.addSuffix(cost2.toSimpleString(), ")")))); - newSA.setPayCosts(cost2.add(cost1.add(newSA.getPayCosts()))); - newSA.addOptionalCost(OptionalCost.Kicker1); - newSA.addOptionalCost(OptionalCost.Kicker2); - if (newSA.canPlay()) { - abilities.add(i, newSA); - i++; - } - } - } - } - } - - if (source.hasKeyword(Keyword.CONSPIRE)) { - int amount = source.getAmountOfKeyword(Keyword.CONSPIRE); - for (int kwInstance = 1; kwInstance <= amount; kwInstance++) { - for (int i = 0; i < abilities.size(); i++) { - final SpellAbility newSA = abilities.get(i).copy(); - newSA.setBasicSpell(false); - final String conspireCost = "tapXType<2/Creature.SharesColorWith/untapped creature you control that shares a color with " + source.getName() + ">"; - newSA.setPayCosts(new Cost(conspireCost, false).add(newSA.getPayCosts())); - final String tag = kwInstance > 1 ? " (Conspire " + kwInstance + ")" : " (Conspire)"; - newSA.setDescription(newSA.getDescription() + tag); - newSA.addOptionalCost(OptionalCost.Conspire); - newSA.addConspireInstance(); - if (newSA.canPlay()) { - abilities.add(++i, newSA); - } - } - } - } - - if (source.hasKeyword(Keyword.JUMP_START)) { - for (int i = 0; i < abilities.size(); i++) { - final SpellAbility newSA = abilities.get(i).copy(); - newSA.setBasicSpell(false); - final String jumpstartCost = "Discard<1/Card>"; - newSA.setPayCosts(new Cost(jumpstartCost, false).add(newSA.getPayCosts())); - newSA.getRestrictions().setZone(ZoneType.Graveyard); - newSA.setDescription(newSA.getDescription() + " (Jump-start)"); - newSA.addOptionalCost(OptionalCost.Jumpstart); - if (newSA.canPlay()) { - abilities.add(i, newSA); - i++; - } - } - } - - return abilities; - } - private static boolean hasUrzaLands(final Player p) { final CardCollectionView landsControlled = p.getCardsIn(ZoneType.Battlefield); return Iterables.any(landsControlled, Predicates.and(CardPredicates.isType("Urza's"), CardPredicates.isType("Mine"))) From 81c76952ea6d55dd69a67475c0a0aa887f116a7c Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 16 Dec 2018 09:43:52 +0300 Subject: [PATCH 489/901] - Code cleanup. --- .../src/main/java/forge/ai/PlayerControllerAi.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 18370eb882a..83ebcbdae44 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -15,7 +15,10 @@ import forge.card.MagicColor; import forge.card.mana.ManaCost; import forge.card.mana.ManaCostShard; import forge.deck.Deck; -import forge.game.*; +import forge.game.Game; +import forge.game.GameEntity; +import forge.game.GameObject; +import forge.game.GameType; import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; import forge.game.card.*; @@ -1150,17 +1153,12 @@ public class PlayerControllerAi extends PlayerController { Cost costSoFar = chosen.getPayCosts() != null ? chosen.getPayCosts().copy() : Cost.Zero; for (OptionalCostValue opt : optionalCostValues) { - if (opt.getType() == OptionalCost.Entwine) { - // Specific code for optional costs should be made conditional here - } - - // Generic code: for now, chooses the optional cost if it can be paid (and later - played) + // 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); if (ComputerUtilCost.canPayCost(fullCostSa, player)) { chosenOptCosts.add(opt); costSoFar.add(opt.getCost()); - System.out.println("Chosen: " + opt + " for total cost of " + costSoFar.toSimpleString()); } } From 767e13c5479890491f2e7adf2c608f8336879ca7 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 16 Dec 2018 09:50:18 +0300 Subject: [PATCH 490/901] - NPE guard. --- forge-ai/src/main/java/forge/ai/AiController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 64e38102def..d9b8f9fefab 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -850,7 +850,7 @@ public class AiController { int neededMana = 0; boolean dangerousRecurringCost = false; - Cost costWithBuyback = sa.getPayCosts().copy(); + Cost costWithBuyback = sa.getPayCosts() != null ? sa.getPayCosts().copy() : Cost.Zero; for (OptionalCostValue opt : GameActionUtil.getOptionalCostValues(sa)) { if (opt.getType() == OptionalCost.Buyback) { costWithBuyback.add(opt.getCost()); From 6bc46c2e56861e38b43c18976831787ac26e9f31 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 16 Dec 2018 15:06:26 +0300 Subject: [PATCH 491/901] - Fix imports. --- forge-game/src/main/java/forge/game/GameActionUtil.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameActionUtil.java b/forge-game/src/main/java/forge/game/GameActionUtil.java index 2661c66a038..3c3eae53dd9 100644 --- a/forge-game/src/main/java/forge/game/GameActionUtil.java +++ b/forge-game/src/main/java/forge/game/GameActionUtil.java @@ -21,14 +21,12 @@ import com.google.common.base.Predicates; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Sets; - import forge.card.mana.ManaCostParser; import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; import forge.game.card.*; import forge.game.card.CardPlayOption.PayManaCost; import forge.game.cost.Cost; -import forge.game.keyword.Keyword; import forge.game.keyword.KeywordInterface; import forge.game.player.Player; import forge.game.spellability.*; From 69446cd5a23a58d5b2e7c50734818ff5ceefdc24 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 16 Dec 2018 22:54:03 +0300 Subject: [PATCH 492/901] - Fixed Bone Dragon. --- forge-gui/res/cardsfolder/b/bone_dragon.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/b/bone_dragon.txt b/forge-gui/res/cardsfolder/b/bone_dragon.txt index 7ad562f5189..cbf987c9e7a 100644 --- a/forge-gui/res/cardsfolder/b/bone_dragon.txt +++ b/forge-gui/res/cardsfolder/b/bone_dragon.txt @@ -3,6 +3,6 @@ ManaCost:3 B B Types:Creature Dragon Skeleton PT:5/4 K:Flying -A:AB$ ChangeZone | Cost$ 3 B B ExileFromGrave<7/Other> | Origin$ Graveyard | Destination$ Battlefield | ActivationZone$ Graveyard | SpellDescription$ Return CARDNAME from your graveyard to the battlefield. +A:AB$ ChangeZone | Cost$ 3 B B ExileFromGrave<7/Card.Other> | Origin$ Graveyard | Destination$ Battlefield | ActivationZone$ Graveyard | SpellDescription$ Return CARDNAME from your graveyard to the battlefield. SVar:AIPreference:ExileFromGraveCost$Land.Basic,Land,Card -Oracle:Flying\n{3}{B}{B}, Exile 7 other cards from your graveyard: Return CARDNAME from your graveyard to the battlefield. \ No newline at end of file +Oracle:Flying\n{3}{B}{B}, Exile 7 other cards from your graveyard: Return Bone Dragon from your graveyard to the battlefield. \ No newline at end of file From 7875707f3c77bf22f29b3467d4d559952c630666 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 16 Dec 2018 23:47:17 +0300 Subject: [PATCH 493/901] - Fixed Bogardan Phoenix. --- forge-gui/res/cardsfolder/b/bogardan_phoenix.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/forge-gui/res/cardsfolder/b/bogardan_phoenix.txt b/forge-gui/res/cardsfolder/b/bogardan_phoenix.txt index f96dea5e4e2..f46050d5e62 100644 --- a/forge-gui/res/cardsfolder/b/bogardan_phoenix.txt +++ b/forge-gui/res/cardsfolder/b/bogardan_phoenix.txt @@ -3,10 +3,10 @@ ManaCost:2 R R R Types:Creature Phoenix PT:3/3 K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, exile it if it had a death counter on it. Otherwise, return it to the battlefield under your control and put a death counter on it. -SVar:TrigReturn:DB$ ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Exile | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | SubAbility$ DBReturn | References$ X -SVar:DBReturn:DB$ ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Battlefield | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | SubAbility$ DBPutCounter | References$ X -SVar:DBPutCounter:DB$ PutCounter | Defined$ TriggeredCardLKICopy | CounterType$ DEATH | CounterNum$ 1 | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | References$ X -SVar:X:TriggeredCard$CardCounters.DEATH +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self+counters_EQ0_DEATH | Execute$ DBReturn | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, exile it if it had a death counter on it. Otherwise, return it to the battlefield under your control and put a death counter on it. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self+counters_GE1_DEATH | Execute$ TrigReturn | TriggerController$ TriggeredCardController | Secondary$ True | TriggerDescription$ When CARDNAME dies, exile it if it had a death counter on it. Otherwise, return it to the battlefield under your control and put a death counter on it. +SVar:TrigReturn:DB$ ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Exile +SVar:DBReturn:DB$ ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Battlefield | SubAbility$ DBPutCounter | References$ X +SVar:DBPutCounter:DB$ PutCounter | Defined$ TriggeredCard | CounterType$ DEATH | CounterNum$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/bogardan_phoenix.jpg Oracle:Flying\nWhen Bogardan Phoenix dies, exile it if it had a death counter on it. Otherwise, return it to the battlefield under your control and put a death counter on it. From c1c7147f002820d46232cff38ea3bc9f80904535 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 17 Dec 2018 08:04:55 +0300 Subject: [PATCH 494/901] - More meaningful names in Bogardan Phoenix script. --- forge-gui/res/cardsfolder/b/bogardan_phoenix.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/b/bogardan_phoenix.txt b/forge-gui/res/cardsfolder/b/bogardan_phoenix.txt index f46050d5e62..27cd69d5d66 100644 --- a/forge-gui/res/cardsfolder/b/bogardan_phoenix.txt +++ b/forge-gui/res/cardsfolder/b/bogardan_phoenix.txt @@ -4,8 +4,8 @@ Types:Creature Phoenix PT:3/3 K:Flying T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self+counters_EQ0_DEATH | Execute$ DBReturn | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, exile it if it had a death counter on it. Otherwise, return it to the battlefield under your control and put a death counter on it. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self+counters_GE1_DEATH | Execute$ TrigReturn | TriggerController$ TriggeredCardController | Secondary$ True | TriggerDescription$ When CARDNAME dies, exile it if it had a death counter on it. Otherwise, return it to the battlefield under your control and put a death counter on it. -SVar:TrigReturn:DB$ ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Exile +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self+counters_GE1_DEATH | Execute$ DBExile | TriggerController$ TriggeredCardController | Secondary$ True | TriggerDescription$ When CARDNAME dies, exile it if it had a death counter on it. Otherwise, return it to the battlefield under your control and put a death counter on it. +SVar:DBExile:DB$ ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Exile SVar:DBReturn:DB$ ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Battlefield | SubAbility$ DBPutCounter | References$ X SVar:DBPutCounter:DB$ PutCounter | Defined$ TriggeredCard | CounterType$ DEATH | CounterNum$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/bogardan_phoenix.jpg From 4efc697c4f18f3b63956fbd0eaad6a4ca978e6d4 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 17 Dec 2018 08:38:26 +0300 Subject: [PATCH 495/901] - Removed an unnecessary reference. --- forge-gui/res/cardsfolder/b/bogardan_phoenix.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/b/bogardan_phoenix.txt b/forge-gui/res/cardsfolder/b/bogardan_phoenix.txt index 27cd69d5d66..561e34b7a2d 100644 --- a/forge-gui/res/cardsfolder/b/bogardan_phoenix.txt +++ b/forge-gui/res/cardsfolder/b/bogardan_phoenix.txt @@ -6,7 +6,7 @@ K:Flying T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self+counters_EQ0_DEATH | Execute$ DBReturn | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, exile it if it had a death counter on it. Otherwise, return it to the battlefield under your control and put a death counter on it. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self+counters_GE1_DEATH | Execute$ DBExile | TriggerController$ TriggeredCardController | Secondary$ True | TriggerDescription$ When CARDNAME dies, exile it if it had a death counter on it. Otherwise, return it to the battlefield under your control and put a death counter on it. SVar:DBExile:DB$ ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Exile -SVar:DBReturn:DB$ ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Battlefield | SubAbility$ DBPutCounter | References$ X +SVar:DBReturn:DB$ ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Battlefield | SubAbility$ DBPutCounter SVar:DBPutCounter:DB$ PutCounter | Defined$ TriggeredCard | CounterType$ DEATH | CounterNum$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/bogardan_phoenix.jpg Oracle:Flying\nWhen Bogardan Phoenix dies, exile it if it had a death counter on it. Otherwise, return it to the battlefield under your control and put a death counter on it. From 0bd8e3a9a2f42da7605eaec33a56aef83ff69fa3 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 17 Dec 2018 16:17:13 +0300 Subject: [PATCH 496/901] - Added a previously unoverridden method to WrappedAbility which is needed for checking AttachedTo on triggers properly (fixes Street Sweeper). --- .../src/main/java/forge/game/trigger/WrappedAbility.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java b/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java index b59580cd366..6712d379832 100644 --- a/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java +++ b/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java @@ -175,6 +175,11 @@ public class WrappedAbility extends Ability { return sa.getRestrictions(); } + @Override + public SpellAbility getSATargetingCard() { + return sa.getSATargetingCard(); + } + @Override public Card getHostCard() { return sa.getHostCard(); From f703a903f5ce67ce491352be2f304cc26cf7bfa4 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 17 Dec 2018 17:21:34 +0300 Subject: [PATCH 497/901] - Transformed objects must be reset to Original before they go through CardFactory.copyCard, or they end up in a mixed state, at least visually (since the transformed state is set on the copied object). --- forge-game/src/main/java/forge/game/GameAction.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index cabed4c186a..1639ba7b241 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -213,14 +213,18 @@ public class GameAction { c.updateStateForView(); } + if (fromBattlefield && c.getCurrentStateName() != CardStateName.Original) { + // when a card leaves the battlefield, ensure it's in its original state + // (we need to do this on the object before copying it, or it won't work correctly e.g. + // on Transformed objects) + c.setState(CardStateName.Original, false); + } + copied = CardFactory.copyCard(c, false); copied.setUnearthed(c.isUnearthed()); copied.setTapped(false); - if (fromBattlefield) { - // when a card leaves the battlefield, ensure it's in its original state - copied.setState(CardStateName.Original, false); - } + for (final Trigger trigger : copied.getTriggers()) { trigger.setHostCard(copied); } From 01026e5d743f817d3216174ce6b9e8a6264dde75 Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 17 Dec 2018 18:44:45 +0300 Subject: [PATCH 498/901] - Assorted fixes: * Fixed ConcurrentModificationException when controlling something with Old Man of the Sea * Added an AI hint to River Sneak. * Fixed The Scorpion God. --- forge-game/src/main/java/forge/game/GameAction.java | 4 +--- forge-gui/res/cardsfolder/r/river_sneak.txt | 1 + forge-gui/res/cardsfolder/t/the_scorpion_god.txt | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 1639ba7b241..8c5b3454343 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -842,9 +842,7 @@ public class GameAction { affectedCards.add(c); } } - for (Object[] staticCheck : c.getStaticCommandList()) { - c.getStaticCommandList().remove(staticCheck); - } + c.getStaticCommandList().removeAll(toRemove); } // Exclude cards in hidden zones from update Iterator it = affectedCards.iterator(); diff --git a/forge-gui/res/cardsfolder/r/river_sneak.txt b/forge-gui/res/cardsfolder/r/river_sneak.txt index 7713a2e531c..8ec985fcdca 100644 --- a/forge-gui/res/cardsfolder/r/river_sneak.txt +++ b/forge-gui/res/cardsfolder/r/river_sneak.txt @@ -5,5 +5,6 @@ PT:1/1 K:Unblockable T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Merfolk+YouCtrl+Other | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever another Merfolk enters the battlefield under your control, CARDNAME gets +1/+1 until end of turn. SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ 1 | NumDef$ 1 +SVar:BuffedBy:Merfolk SVar:Picture:http://www.wizards.com/global/images/magic/general/river_sneak.jpg Oracle:River Sneak can't be blocked.\nWhenever another Merfolk enters the battlefield under your control, River Sneak gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/t/the_scorpion_god.txt b/forge-gui/res/cardsfolder/t/the_scorpion_god.txt index e83595ec52a..f2076133cf7 100644 --- a/forge-gui/res/cardsfolder/t/the_scorpion_god.txt +++ b/forge-gui/res/cardsfolder/t/the_scorpion_god.txt @@ -6,7 +6,7 @@ T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 A:AB$ PutCounter | Cost$ 1 B R | IsCurse$ True | ValidTgts$ Creature.Other | TgtPrompt$ Select another target creature | CounterType$ M1M1 | CounterNum$ 1 | SpellDescription$ Put a -1/-1 counter on target creature. T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | TriggerController$ TriggeredCardController | Execute$ TrigDelay | TriggerDescription$ When CARDNAME dies, return it to its owner's hand at the beginning of the next end step. -SVar:TrigDelay:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | RememberObjects$ Self | Execute$ TrigReturn | SpellDescription$ Return that creature to its owner's hand at the beginning of the next end step. +SVar:TrigDelay:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | RememberObjects$ TriggeredCard | Execute$ TrigReturn | SpellDescription$ Return that creature to its owner's hand at the beginning of the next end step. SVar:TrigReturn:DB$ ChangeZone | Defined$ DelayTriggerRemembered | Origin$ Graveyard | Destination$ Hand DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/the_scorpion_god.jpg From 988d0559aa6285626f22cc801edf4025b2b914c7 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 18 Dec 2018 10:01:52 +0300 Subject: [PATCH 499/901] - Improved the Teneb event in Time Vault to be more consistent. --- .../Teneb, the Harvester.dck | 44 +++++++++---------- 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Teneb, the Harvester.dck b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Teneb, the Harvester.dck index fd0dd84ab06..9ee2512d3b9 100644 --- a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Teneb, the Harvester.dck +++ b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Teneb, the Harvester.dck @@ -3,37 +3,33 @@ Name=Teneb, the Harvester [Commander] 1 Teneb, the Harvester|PLC [Main] -1 Akroma, Angel of Wrath|LGN -1 Aspect of Mongoose|TSP -1 Bridge from Below|FUT -1 Brushland|ICE +1 Animate Dead|LEB +1 Black Lotus|LEA 1 Buried Alive|ODY 1 Cabal Ritual|TOR -1 Caves of Koilos|APC -1 Dance of the Dead|ICE 1 Dark Ritual|USG -1 Dread Return|TSP -1 Dryad Arbor|FUT -1 Earsplitting Rats|JUD 1 Entomb|ODY -1 Forest|TSP -1 Hymn of Rebirth|ICE -1 Hypnotic Specter|4ED +1 Forest|ICE +1 Howling Mine|LEA +1 Hypnox|TOR +1 Last Rites|ODY 1 Living Death|COM -1 Living End|TSP -1 Llanowar Wastes|APC 1 Lotus Bloom|TSP -1 Lotus Vale|WTH +1 Mind Twist|LEA +1 Mox Emerald|LEA +1 Mox Jet|LEA +1 Mox Pearl|LEA +1 Necravolver|APC +1 Necromancy|VIS 1 Panglacial Wurm|CSP -1 Phantasmagorian|PLC -2 Plains|TSP -1 Pox|ICE +1 Phantom Nishoba|JUD +1 Plains|ICE 1 Reya Dawnbringer|INV +1 Scion of Darkness|LGN 1 Silver Seraph|JUD -1 Smallpox|TSP -1 Spirit of the Night|MIR -1 Stronghold Rats|FUT -6 Swamp|TSP -1 Thran Quarry|USG -1 Undiscovered Paradise|VIS +1 Stronghold Overseer|TSP +11 Swamp|ICE +1 Terror|LEA +1 Vampiric Link|PLC +1 Yawgmoth's Bargain|UDS 1 Yawgmoth's Will|USG From c12d7a055bcc95f16b5ed9e41b357b9910b947b3 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 18 Dec 2018 10:03:19 +0300 Subject: [PATCH 500/901] - Added Game Night definition. --- forge-gui/res/editions/Game Night.txt | 77 +++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 forge-gui/res/editions/Game Night.txt diff --git a/forge-gui/res/editions/Game Night.txt b/forge-gui/res/editions/Game Night.txt new file mode 100644 index 00000000000..81995153fa6 --- /dev/null +++ b/forge-gui/res/editions/Game Night.txt @@ -0,0 +1,77 @@ +[metadata] +Code=GNT +Date=2018-11-16 +Name=Game Night +Code2=GNT +MciCode=gnt +Type=Other + +[cards] +1 M Militant Angel +2 M Inspired Sphinx +3 M Rot Hulk +4 M Goblin Goliath +5 M Avatar of Growth +6 U Aerial Responder +7 R Always Watching +8 R Benalish Marshal +9 U Bright Reprisal +10 C Call the Cavalry +11 U Everdawn Champion +12 C Fan Bearer +13 C Inspired Charge +14 C Inspiring Captain +15 C Mesa Unicorn +16 U Serra Angel +17 U Subjugator Angel +18 U Advanced Stitchwing +19 U Air Elemental +20 C Claustrophobia +21 U Favorable Winds +22 U Hydrolash +23 U Reckless Scholar +24 R Soulblade Djinn +25 U Whirler Rogue +26 R Zahid, Djinn of the Lamp +27 C Bone Splinters +28 U Cruel Revival +29 U Fleshbag Marauder +30 C Gruesome Fate +31 R Languish +32 R Liliana's Mastery +33 U Lord of the Accursed +34 C Tattered Mummy +35 U Thallid Soothsayer +36 U Zulaport Cutthroat +37 C Bombard +38 R Captivating Crew +39 C Dragon Fodder +40 U Rolling Thunder +41 U Seismic Elemental +42 R Siege-Gang Commander +43 C Tormenting Voice +44 R Ghalta, Primal Hunger +45 C Jungle Delver +46 C Llanowar Elves +47 R Nissa's Revelation +48 U Overcome +49 C Seek the Wilds +50 U Thrashing Brontodon +51 C Eager Construct +52 U Filigree Familiar +53 U Howling Golem +54 C Manalith +55 U Pilgrim's Eye +56 U Rhonas's Monument +57 U Snare Thopter +58 C Welder Automaton +59 L Plains +60 L Plains +61 L Island +62 L Island +63 L Swamp +64 L Swamp +65 L Mountain +66 L Mountain +67 L Forest +68 L Forest From cf0b007961591607e2cbf4a7c89d964a92261558 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 18 Dec 2018 10:27:13 +0300 Subject: [PATCH 501/901] - Added 5 Gift Pack cards. --- forge-gui/res/cardsfolder/a/angelic_guardian.txt | 9 +++++++++ forge-gui/res/cardsfolder/a/angler_turtle.txt | 7 +++++++ forge-gui/res/cardsfolder/i/immortal_phoenix.txt | 8 ++++++++ forge-gui/res/cardsfolder/r/rampaging_brontodon.txt | 9 +++++++++ forge-gui/res/cardsfolder/v/vengeant_vampire.txt | 9 +++++++++ 5 files changed, 42 insertions(+) create mode 100644 forge-gui/res/cardsfolder/a/angelic_guardian.txt create mode 100644 forge-gui/res/cardsfolder/a/angler_turtle.txt create mode 100644 forge-gui/res/cardsfolder/i/immortal_phoenix.txt create mode 100644 forge-gui/res/cardsfolder/r/rampaging_brontodon.txt create mode 100644 forge-gui/res/cardsfolder/v/vengeant_vampire.txt diff --git a/forge-gui/res/cardsfolder/a/angelic_guardian.txt b/forge-gui/res/cardsfolder/a/angelic_guardian.txt new file mode 100644 index 00000000000..df75ed6859e --- /dev/null +++ b/forge-gui/res/cardsfolder/a/angelic_guardian.txt @@ -0,0 +1,9 @@ +Name:Angelic Guardian +ManaCost:4 W W +Types:Creature Angel +PT:5/5 +K:Flying +T:Mode$ AttackersDeclared | AttackingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigIndestructible | TriggerDescription$ Whenever one or more creatures you control attack, they gain indestructible until end of turn. +SVar:TrigIndestructible:DB$ PumpAll | ValidCards$ Creature.YouCtrl+attacking | KW$ Indestructible +SVar:HasAttackEffect:TRUE +Oracle:Flying\nWhenever one or more creatures you control attack, they gain indestructible until end of turn. diff --git a/forge-gui/res/cardsfolder/a/angler_turtle.txt b/forge-gui/res/cardsfolder/a/angler_turtle.txt new file mode 100644 index 00000000000..401ef1f0b30 --- /dev/null +++ b/forge-gui/res/cardsfolder/a/angler_turtle.txt @@ -0,0 +1,7 @@ +Name:Angler Turtle +ManaCost:5 U U +Types:Creature Turtle +PT:5/7 +K:Hexproof +S:Mode$ Continuous | Affected$ Creature.OppCtrl | AddHiddenKeyword$ CARDNAME attacks each combat if able. | Description$ Creatures your opponents control attack each combat if able. +Oracle:Hexproof\nCreatures your opponents control attack each combat if able. diff --git a/forge-gui/res/cardsfolder/i/immortal_phoenix.txt b/forge-gui/res/cardsfolder/i/immortal_phoenix.txt new file mode 100644 index 00000000000..4cd893b2a33 --- /dev/null +++ b/forge-gui/res/cardsfolder/i/immortal_phoenix.txt @@ -0,0 +1,8 @@ +Name:Immortal Phoenix +ManaCost:4 R R +Types:Creature Phoenix +PT:5/3 +K:Flying +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | TriggerController$ TriggeredCardController | Execute$ TrigReturn | TriggerDescription$ When CARDNAME dies, return it to its owner's hand. +SVar:TrigReturn:DB$ ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Hand +Oracle:Flying\nWhen Immortal Phoenix dies, return it to its owner's hand. diff --git a/forge-gui/res/cardsfolder/r/rampaging_brontodon.txt b/forge-gui/res/cardsfolder/r/rampaging_brontodon.txt new file mode 100644 index 00000000000..44d0e487c7f --- /dev/null +++ b/forge-gui/res/cardsfolder/r/rampaging_brontodon.txt @@ -0,0 +1,9 @@ +Name:Rampaging Brontodon +ManaCost:5 G G +Types:Creature Dinosaur +PT:7/7 +K:Trample +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, it gets +1/+1 until end of turn for each land you control. +SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ X | NumDef$ X | References$ X +SVar:X:Count$Valid Land.YouCtrl +Oracle:Trample\nWhenever Rampaging Brontodon attacks, it gets +1/+1 until end of turn for each land you control. diff --git a/forge-gui/res/cardsfolder/v/vengeant_vampire.txt b/forge-gui/res/cardsfolder/v/vengeant_vampire.txt new file mode 100644 index 00000000000..92e9185a2bc --- /dev/null +++ b/forge-gui/res/cardsfolder/v/vengeant_vampire.txt @@ -0,0 +1,9 @@ +Name:Vengeant Vampire +ManaCost:4 B B +Types:Creature Vampire +PT:4/4 +K:Lifelink +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, destroy target creature an opponent controls and you gain 4 life. +SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Permanent.Creature+OppCtrl | TgtPrompt$ Select target creature an opponent controls | SubAbility$ DBGainLife +SVar:DBGainLife:DB$ GainLife | Defined$ TriggeredCardController | LifeAmount$ 4 +Oracle:Lifelink\nWhen Vengeant Vampire dies, destroy target creature an opponent controls and you gain 4 life. From 1a6401797a6a5f249773f033ce1c8b37390d3267 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 18 Dec 2018 11:52:07 +0300 Subject: [PATCH 502/901] - Added 5 deck-exclusive cards. --- .../main/java/forge/game/card/CardFactoryUtil.java | 4 ++++ .../src/main/java/forge/game/combat/CombatUtil.java | 4 ++++ .../src/main/java/forge/game/player/Player.java | 6 ++++++ forge-gui/res/cardsfolder/a/avatar_of_growth.txt | 10 ++++++++++ forge-gui/res/cardsfolder/g/goblin_goliath.txt | 12 ++++++++++++ forge-gui/res/cardsfolder/i/inspired_sphinx.txt | 12 ++++++++++++ forge-gui/res/cardsfolder/m/militant_angel.txt | 10 ++++++++++ forge-gui/res/cardsfolder/r/rot_hulk.txt | 9 +++++++++ forge-gui/res/tokenscripts/c_1_1_thopter_flying.txt | 7 +++++++ 9 files changed, 74 insertions(+) create mode 100644 forge-gui/res/cardsfolder/a/avatar_of_growth.txt create mode 100644 forge-gui/res/cardsfolder/g/goblin_goliath.txt create mode 100644 forge-gui/res/cardsfolder/i/inspired_sphinx.txt create mode 100644 forge-gui/res/cardsfolder/m/militant_angel.txt create mode 100644 forge-gui/res/cardsfolder/r/rot_hulk.txt create mode 100644 forge-gui/res/tokenscripts/c_1_1_thopter_flying.txt diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index cd3220da18b..0ce4bc73b87 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -624,6 +624,10 @@ public class CardFactoryUtil { } return doXMath(oppDmg, m, source); } + + if (value.equals("OpponentsAttackedThisTurn")) { + return doXMath(player.getAttackedOpponentsThisTurn().size(), m, source); + } return doXMath(0, m, source); } diff --git a/forge-game/src/main/java/forge/game/combat/CombatUtil.java b/forge-game/src/main/java/forge/game/combat/CombatUtil.java index 1fbba12389e..0d6630e300b 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatUtil.java +++ b/forge-game/src/main/java/forge/game/combat/CombatUtil.java @@ -320,6 +320,10 @@ public class CombatUtil { c.getDamageHistory().clearNotAttackedSinceLastUpkeepOf(); c.getController().setAttackedWithCreatureThisTurn(true); c.getController().incrementAttackersDeclaredThisTurn(); + + if (combat.getDefenderPlayerByAttacker(c) != null) { + c.getController().addAttackedOpponentThisTurn(combat.getDefenderPlayerByAttacker(c)); + } } // checkDeclareAttackers /** diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 9494b1136c7..98dbbe2edf9 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -127,6 +127,7 @@ public class Player extends GameEntity implements Comparable { private boolean activateLoyaltyAbilityThisTurn = false; private boolean tappedLandForManaThisTurn = false; private int attackersDeclaredThisTurn = 0; + private PlayerCollection attackedOpponentsThisTurn = new PlayerCollection(); private final Map zones = Maps.newEnumMap(ZoneType.class); @@ -1877,6 +1878,10 @@ public class Player extends GameEntity implements Comparable { attackersDeclaredThisTurn = 0; } + public final PlayerCollection getAttackedOpponentsThisTurn() { return attackedOpponentsThisTurn; } + public final void addAttackedOpponentThisTurn(Player p) { attackedOpponentsThisTurn.add(p); } + public final void resetAttackedOpponentsThisTurn() { attackedOpponentsThisTurn.clear(); } + public final void altWinBySpellEffect(final String sourceName) { if (cantWin()) { System.out.println("Tried to win, but currently can't."); @@ -2425,6 +2430,7 @@ public class Player extends GameEntity implements Comparable { resetCounterToPermThisTurn(); clearAssignedDamage(); resetAttackersDeclaredThisTurn(); + resetAttackedOpponentsThisTurn(); setRevolt(false); } diff --git a/forge-gui/res/cardsfolder/a/avatar_of_growth.txt b/forge-gui/res/cardsfolder/a/avatar_of_growth.txt new file mode 100644 index 00000000000..6801ae61347 --- /dev/null +++ b/forge-gui/res/cardsfolder/a/avatar_of_growth.txt @@ -0,0 +1,10 @@ +Name:Avatar of Growth +ManaCost:4 G G +Types:Creature Elemental Avatar +PT:4/4 +K:Trample +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | References$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each opponent you have. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | TriggerDescription$ When CARDNAME enters the battlefield, each player searches their library for up to two basic land cards, puts them onto the battlefield, then shuffles their library. +SVar:TrigSearch:DB$ ChangeZone | Optional$ True | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | DefinedPlayer$ Player | ChangeNum$ 2 | Shuffle$ True +SVar:X:PlayerCountOpponents$Amount +Oracle:Avatar of Growth costs {1} less to cast for each opponent you have.\nWhen Avatar of Growth enters the battlefield, each player searches their library for up to two basic land cards, puts them onto the battlefield, then shuffles their library. diff --git a/forge-gui/res/cardsfolder/g/goblin_goliath.txt b/forge-gui/res/cardsfolder/g/goblin_goliath.txt new file mode 100644 index 00000000000..1ffda5501b5 --- /dev/null +++ b/forge-gui/res/cardsfolder/g/goblin_goliath.txt @@ -0,0 +1,12 @@ +Name:Goblin Goliath +ManaCost:4 R R +Types:Creature Goblin Mutant +PT:5/4 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a number of 1/1 red Goblin creature tokens equal to the number of opponents you have. +SVar:TrigToken:DB$ Token | TokenOwner$ You | TokenAmount$ X | TokenScript$ r_1_1_goblin | LegacyImage$ r 1 1 goblin grn | References$ X +A:AB$ Effect | Cost$ 3 R T | Name$ Goblin Goliath Effect | ReplacementEffects$ RDoubleDamage | SVars$ DmgTwice,Y | SpellDescription$ If a source you control would deal damage to an opponent this turn, it deals double that damage to that player instead. +SVar:RDoubleDamage:Event$ DamageDone | ActiveZones$ Command | ValidSource$ Card.YouCtrl,Emblem.YouCtrl | ValidTarget$ Opponent | ReplaceWith$ DmgTwice | Description$ If a source you control would deal damage to an opponent this turn, it deals double that damage to that player instead. +SVar:DmgTwice:DB$ ReplaceEffect | VarName$ DamageAmount | VarValue$ Y | References$ Y +SVar:X:PlayerCountOpponents$Amount +SVar:Y:ReplaceCount$DamageAmount/Twice +Oracle:When Goblin Goliath enters the battlefield, create a number of 1/1 red Goblin creature tokens equal to the number of opponents you have.\n{3}{R}, {T}: If a source you control would deal damage to an opponent this turn, it deals double that damage to that player instead. diff --git a/forge-gui/res/cardsfolder/i/inspired_sphinx.txt b/forge-gui/res/cardsfolder/i/inspired_sphinx.txt new file mode 100644 index 00000000000..33aab170df7 --- /dev/null +++ b/forge-gui/res/cardsfolder/i/inspired_sphinx.txt @@ -0,0 +1,12 @@ +Name:Inspired Sphinx +ManaCost:5 U U +Types:Creature Sphinx +PT:5/5 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw cards equal to the number of opponents you have. +SVar:TrigDraw:DB$ Draw | NumCards$ X | References$ X +# TODO: Migrate this to the new TokenScript format (but probably needs LegacyImage to work first? It tries to search for a GNT token image, which probably doesn't exist, and doesn't fall back to other token pictures) +# TODO: A:AB$ Token | Cost$ 3 U | TokenOwner$ You | TokenAmount$ 1 | TokenScript$ c_1_1_thopter_flying | LegacyImage$ c 1 1 thopter m19 +A:AB$ Token | Cost$ 3 U | TokenOwner$ You | TokenAmount$ 1 | TokenPower$ 1 | TokenToughness$ 1 | TokenColors$ Colorless | TokenName$ Thopter | TokenTypes$ Thopter,Artifact,Creature | TokenKeywords$ Flying | TokenImage$ c 1 1 thopter m19 | SpellDescription$ Create a 1/1 colorless Thopter artifact creature token with flying. +SVar:X:PlayerCountOpponents$Amount +Oracle:Flying\nWhen Inspired Sphinx enters the battlefield, draw cards equal to the number of opponents you have.\n{3}{U}: Create a 1/1 colorless Thopter artifact creature token with flying. diff --git a/forge-gui/res/cardsfolder/m/militant_angel.txt b/forge-gui/res/cardsfolder/m/militant_angel.txt new file mode 100644 index 00000000000..6fa57bb5aa8 --- /dev/null +++ b/forge-gui/res/cardsfolder/m/militant_angel.txt @@ -0,0 +1,10 @@ +Name:Militant Angel +ManaCost:3 W W +Types:Creature Angel +PT:3/4 +K:Flying +K:Lifelink +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a number of 2/2 white Knight creature tokens with vigilance equal to the number of opponents you attacked this turn. +SVar:TrigToken:DB$ Token | TokenOwner$ You | TokenAmount$ X | TokenPower$ 2 | TokenToughness$ 2 | TokenColors$ White | TokenName$ Knight | TokenTypes$ Creature,Knight | TokenKeywords$ Vigilance | TokenImage$ w 2 2 knight m19 | References$ X | SpellDescription$ Create a number of 2/2 white Knight creature tokens with vigilance equal to the number of opponents you attacked this turn. +SVar:X:TriggeredCardController$OpponentsAttackedThisTurn +Oracle:Flying, lifelink\nWhen Militant Angel enters the battlefield, create a number of 2/2 white Knight creature tokens with vigilance equal to the number of opponents you attacked this turn. diff --git a/forge-gui/res/cardsfolder/r/rot_hulk.txt b/forge-gui/res/cardsfolder/r/rot_hulk.txt new file mode 100644 index 00000000000..64a0a0a2361 --- /dev/null +++ b/forge-gui/res/cardsfolder/r/rot_hulk.txt @@ -0,0 +1,9 @@ +Name:Rot Hulk +ManaCost:5 B B +Types:Creature Zombie +PT:5/5 +K:Menace +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME enters the battlefield, return up to X target Zombie cards from your graveyard to the battlefield, where X is the number of opponents you have. +SVar:TrigReturn:DB$ ChangeZone | ValidTgts$ Card.Zombie | TargetMin$ 0 | TargetMax$ X | TgtPrompt$ Select target Zombie card | Origin$ Graveyard | Destination$ Battlefield | References$ X | SpellDescription$ Return up to X target Zombie cards from your graveyard to the battlefield, where X is the number of opponents you have. +SVar:X:PlayerCountOpponents$Amount +Oracle:When Goblin Goliath enters the battlefield, create a number of 1/1 red Goblin creature tokens equal to the number of opponents you have.\n{3}{R}, {T}: If a source you control would deal damage to an opponent this turn, it deals double that damage to that player instead. diff --git a/forge-gui/res/tokenscripts/c_1_1_thopter_flying.txt b/forge-gui/res/tokenscripts/c_1_1_thopter_flying.txt new file mode 100644 index 00000000000..3a93b1302f9 --- /dev/null +++ b/forge-gui/res/tokenscripts/c_1_1_thopter_flying.txt @@ -0,0 +1,7 @@ +Name:Thopter +ManaCost:no cost +Types:Artifact Creature Thopter +Colors:colorless +PT:1/1 +K:Flying +Oracle:Flying From a794313ba9250726c64e24adb47f68bca97824b4 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 18 Dec 2018 11:55:10 +0300 Subject: [PATCH 503/901] - TODO entry for TokenScript. --- forge-gui/res/cardsfolder/m/militant_angel.txt | 2 ++ forge-gui/res/tokenscripts/w_2_2_knight_vigilance.txt | 7 +++++++ 2 files changed, 9 insertions(+) create mode 100644 forge-gui/res/tokenscripts/w_2_2_knight_vigilance.txt diff --git a/forge-gui/res/cardsfolder/m/militant_angel.txt b/forge-gui/res/cardsfolder/m/militant_angel.txt index 6fa57bb5aa8..c39a889aedb 100644 --- a/forge-gui/res/cardsfolder/m/militant_angel.txt +++ b/forge-gui/res/cardsfolder/m/militant_angel.txt @@ -5,6 +5,8 @@ PT:3/4 K:Flying K:Lifelink T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a number of 2/2 white Knight creature tokens with vigilance equal to the number of opponents you attacked this turn. +# TODO: Migrate this to the new TokenScript format (but probably needs LegacyImage to work first? It tries to search for a GNT token image, which probably doesn't exist, and doesn't fall back to other token pictures) +# TODO: SVar:TrigToken:DB$ Token | TokenOwner$ You | TokenAmount$ X | TokenScript$ w_2_2_knight_vigilance | LegacyImage$ w 2 2 knight m19 | References$ X | SpellDescription$ Create a number of 2/2 white Knight creature tokens with vigilance equal to the number of opponents you attacked this turn. SVar:TrigToken:DB$ Token | TokenOwner$ You | TokenAmount$ X | TokenPower$ 2 | TokenToughness$ 2 | TokenColors$ White | TokenName$ Knight | TokenTypes$ Creature,Knight | TokenKeywords$ Vigilance | TokenImage$ w 2 2 knight m19 | References$ X | SpellDescription$ Create a number of 2/2 white Knight creature tokens with vigilance equal to the number of opponents you attacked this turn. SVar:X:TriggeredCardController$OpponentsAttackedThisTurn Oracle:Flying, lifelink\nWhen Militant Angel enters the battlefield, create a number of 2/2 white Knight creature tokens with vigilance equal to the number of opponents you attacked this turn. diff --git a/forge-gui/res/tokenscripts/w_2_2_knight_vigilance.txt b/forge-gui/res/tokenscripts/w_2_2_knight_vigilance.txt new file mode 100644 index 00000000000..f48acd0d058 --- /dev/null +++ b/forge-gui/res/tokenscripts/w_2_2_knight_vigilance.txt @@ -0,0 +1,7 @@ +Name:Knight +ManaCost:no cost +Types:Creature Knight +Colors:white +PT:2/2 +K:Vigilance +Oracle:Vigilance From fd70b921f29c1135ddff46c6e372884ce1564e93 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 18 Dec 2018 13:07:44 +0300 Subject: [PATCH 504/901] - Added puzzle PS_UMA. --- forge-gui/res/puzzle/PS_UMA.pzl | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 forge-gui/res/puzzle/PS_UMA.pzl diff --git a/forge-gui/res/puzzle/PS_UMA.pzl b/forge-gui/res/puzzle/PS_UMA.pzl new file mode 100644 index 00000000000..87be81299ed --- /dev/null +++ b/forge-gui/res/puzzle/PS_UMA.pzl @@ -0,0 +1,17 @@ +[metadata] +Name:Possibility Storm - Ultimate Masters Puzzle +URL:https://i0.wp.com/www.possibilitystorm.com/wp-content/uploads/2018/12/093.-UMA1.jpg +Goal:Win +Turns:1 +Difficulty:Mythic +Description:Win this turn. Your opponent starts the puzzle with Bridge from Below in the graveyard. +[state] +humanlife=20 +ailife=20 +turn=1 +activeplayer=human +activephase=MAIN1 +humanhand=Through the Breach;Vengeful Rebirth;Emrakul, the Aeons Torn;Goryo's Vengeance;Stingerfling Spider;Reanimate +humanbattlefield=Engineered Explosives|Counters:CHARGE=5;Liliana of the Veil|Counters:LOYALTY=3;Vengevine|Counters:P1P1=1;Mikaeus, the Unhallowed;Phyrexian Altar;Mountain|Set:UST;Mountain|Set:UST;Mountain|Set:UST;Mountain|Set:UST;Mountain|Set:UST;Mountain|Set:UST;Swamp|Set:UST;Swamp|Set:UST;Swamp|Set:UST;Swamp|Set:UST;Swamp|Set:UST;Swamp|Set:UST +aigraveyard=Bridge from Below +aibattlefield=Sigarda, Host of Herons;Reya Dawnbringer;Sublime Archangel;Dark Depths|Counters:ICE=3;Plains|Set:UST;Plains|Set:UST;Plains|Set:UST;Plains|Set:UST;Plains|Set:UST;Plains|Set:UST;Plains|Set:UST;Forest|Set:UST;Forest|Set:UST From d5c576274a53668c4df79aca750d3d28a4b90cba Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 18 Dec 2018 13:56:22 +0300 Subject: [PATCH 505/901] - Updating CHANGES.txt. --- forge-gui/release-files/CHANGES.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/forge-gui/release-files/CHANGES.txt b/forge-gui/release-files/CHANGES.txt index 05f0bf1829e..d0b2b5f36a3 100644 --- a/forge-gui/release-files/CHANGES.txt +++ b/forge-gui/release-files/CHANGES.txt @@ -1,2 +1,8 @@ +- Game Night - +Support was added for the Game Night box set, including all 10 exclusive cards. + +- AI improvements - +More AI improvements were implemented, hopefully making the game a little more interesting and challenging to play. + - 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 d898ef0ddcef8d38ed71e5238705143beb8cf0fe Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 18 Dec 2018 14:55:23 +0300 Subject: [PATCH 506/901] - Added a missing part of Oracle. --- forge-gui/res/cardsfolder/a/avatar_of_growth.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/a/avatar_of_growth.txt b/forge-gui/res/cardsfolder/a/avatar_of_growth.txt index 6801ae61347..16193d233dc 100644 --- a/forge-gui/res/cardsfolder/a/avatar_of_growth.txt +++ b/forge-gui/res/cardsfolder/a/avatar_of_growth.txt @@ -7,4 +7,4 @@ S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | References T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | TriggerDescription$ When CARDNAME enters the battlefield, each player searches their library for up to two basic land cards, puts them onto the battlefield, then shuffles their library. SVar:TrigSearch:DB$ ChangeZone | Optional$ True | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | DefinedPlayer$ Player | ChangeNum$ 2 | Shuffle$ True SVar:X:PlayerCountOpponents$Amount -Oracle:Avatar of Growth costs {1} less to cast for each opponent you have.\nWhen Avatar of Growth enters the battlefield, each player searches their library for up to two basic land cards, puts them onto the battlefield, then shuffles their library. +Oracle:Trample\nAvatar of Growth costs {1} less to cast for each opponent you have.\nWhen Avatar of Growth enters the battlefield, each player searches their library for up to two basic land cards, puts them onto the battlefield, then shuffles their library. From 9fdc972704cf346aa18086cf72c7025ad1657d70 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 18 Dec 2018 14:56:05 +0300 Subject: [PATCH 507/901] - Added missing part of Oracle. --- forge-gui/res/cardsfolder/r/rot_hulk.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/r/rot_hulk.txt b/forge-gui/res/cardsfolder/r/rot_hulk.txt index 64a0a0a2361..2542fc83c9f 100644 --- a/forge-gui/res/cardsfolder/r/rot_hulk.txt +++ b/forge-gui/res/cardsfolder/r/rot_hulk.txt @@ -6,4 +6,4 @@ K:Menace T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME enters the battlefield, return up to X target Zombie cards from your graveyard to the battlefield, where X is the number of opponents you have. SVar:TrigReturn:DB$ ChangeZone | ValidTgts$ Card.Zombie | TargetMin$ 0 | TargetMax$ X | TgtPrompt$ Select target Zombie card | Origin$ Graveyard | Destination$ Battlefield | References$ X | SpellDescription$ Return up to X target Zombie cards from your graveyard to the battlefield, where X is the number of opponents you have. SVar:X:PlayerCountOpponents$Amount -Oracle:When Goblin Goliath enters the battlefield, create a number of 1/1 red Goblin creature tokens equal to the number of opponents you have.\n{3}{R}, {T}: If a source you control would deal damage to an opponent this turn, it deals double that damage to that player instead. +Oracle:Menace\nWhen Goblin Goliath enters the battlefield, create a number of 1/1 red Goblin creature tokens equal to the number of opponents you have.\n{3}{R}, {T}: If a source you control would deal damage to an opponent this turn, it deals double that damage to that player instead. From 7604e8c5245bf61b9ace86d8ace974e11707930e Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 18 Dec 2018 15:55:59 +0300 Subject: [PATCH 508/901] - Added token specs to Game Night edition file (not yet used). --- forge-gui/res/editions/Game Night.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/forge-gui/res/editions/Game Night.txt b/forge-gui/res/editions/Game Night.txt index 81995153fa6..6ede2776f42 100644 --- a/forge-gui/res/editions/Game Night.txt +++ b/forge-gui/res/editions/Game Night.txt @@ -75,3 +75,7 @@ Type=Other 66 L Mountain 67 L Forest 68 L Forest + +[tokens] +c_1_1_thopter_flying +w_2_2_knight_vigilance \ No newline at end of file From 6ca217cc533101b8b156e24516a2d3f3434cd3c4 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 18 Dec 2018 16:11:41 +0300 Subject: [PATCH 509/901] - Attacking a planeswalker shouldn't count as attacking the opponent. --- forge-game/src/main/java/forge/game/combat/CombatUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/combat/CombatUtil.java b/forge-game/src/main/java/forge/game/combat/CombatUtil.java index 0d6630e300b..f29ec286894 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatUtil.java +++ b/forge-game/src/main/java/forge/game/combat/CombatUtil.java @@ -321,7 +321,7 @@ public class CombatUtil { c.getController().setAttackedWithCreatureThisTurn(true); c.getController().incrementAttackersDeclaredThisTurn(); - if (combat.getDefenderPlayerByAttacker(c) != null) { + if (combat.getDefenderByAttacker(c) != null && combat.getDefenderByAttacker(c) instanceof Player) { c.getController().addAttackedOpponentThisTurn(combat.getDefenderPlayerByAttacker(c)); } } // checkDeclareAttackers From d2ae58fdebe587bc45b7a8cb3c17ecaecc5ae6c8 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 18 Dec 2018 22:36:51 +0300 Subject: [PATCH 510/901] - Tweaked the Teneb event a little more. --- .../Chronicle of Ages/Teneb, the Harvester.dck | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Teneb, the Harvester.dck b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Teneb, the Harvester.dck index 9ee2512d3b9..134260c1d8e 100644 --- a/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Teneb, the Harvester.dck +++ b/forge-gui/res/conquest/planes/Time_Vault/Chronicle of Ages/Teneb, the Harvester.dck @@ -6,30 +6,33 @@ Name=Teneb, the Harvester 1 Animate Dead|LEB 1 Black Lotus|LEA 1 Buried Alive|ODY -1 Cabal Ritual|TOR 1 Dark Ritual|USG +1 Death Stroke|STH +1 Diabolic Servitude|USG +1 Doomed Necromancer|ONS 1 Entomb|ODY +1 Exhume|USG 1 Forest|ICE -1 Howling Mine|LEA -1 Hypnox|TOR +1 Grand Coliseum|ONS +1 Hypnotic Specter|LEA 1 Last Rites|ODY 1 Living Death|COM 1 Lotus Bloom|TSP -1 Mind Twist|LEA 1 Mox Emerald|LEA 1 Mox Jet|LEA 1 Mox Pearl|LEA 1 Necravolver|APC -1 Necromancy|VIS 1 Panglacial Wurm|CSP 1 Phantom Nishoba|JUD 1 Plains|ICE 1 Reya Dawnbringer|INV +1 Royal Assassin|LEA 1 Scion of Darkness|LGN 1 Silver Seraph|JUD +1 Spirit of the Night|MIR 1 Stronghold Overseer|TSP -11 Swamp|ICE +8 Swamp|ICE 1 Terror|LEA +1 Thran Quarry|USG 1 Vampiric Link|PLC -1 Yawgmoth's Bargain|UDS 1 Yawgmoth's Will|USG From 6880596ca57c631af5036f763a6a53dd0f879baf Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 19 Dec 2018 18:07:22 +0300 Subject: [PATCH 511/901] - Fixed Lazav, the Multifarious ability description. --- forge-gui/res/cardsfolder/l/lazav_the_multifarious.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/l/lazav_the_multifarious.txt b/forge-gui/res/cardsfolder/l/lazav_the_multifarious.txt index 374c88202d1..4dbdce78960 100644 --- a/forge-gui/res/cardsfolder/l/lazav_the_multifarious.txt +++ b/forge-gui/res/cardsfolder/l/lazav_the_multifarious.txt @@ -2,7 +2,7 @@ Name:Lazav, the Multifarious ManaCost:U B Types:Legendary Creature Shapeshifter PT:1/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSurveil | TriggerDescription$ When CARDNAME enters the battlefield, scry 1. (To scry 1, look at the top card of your library. You may put that card into your graveyard.) +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSurveil | TriggerDescription$ When CARDNAME enters the battlefield, surveil 1. (Look at the top card of your library. You may put that card into your graveyard.) SVar:TrigSurveil:DB$ Surveil | Amount$ 1 A:AB$ Clone | Cost$ X | ValidTgts$ Creature.YouOwn | References$ X | TgtZone$ Graveyard | TgtPrompt$ Select target creature card in your graveyard | AddTypes$ Legendary | NewName$ Lazav, the Multifarious | GainThisAbility$ True | SpellDescription$ CARDNAME becomes a copy of target creature card in your graveyard with converted mana cost X, except its name is CARDNAME, it's legendary in addition to it's other types, and it has this ability. SVar:X:Targeted$CardManaCost From 382d3f7752309e3e0242533de7c664ccc58b525d Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 20 Dec 2018 08:27:02 +0300 Subject: [PATCH 512/901] - Unfreeze the tracker to update SpellAbilityViews for Charm, otherwise it may crash (fixes Vindictive Lich). --- .../src/main/java/forge/player/PlayerControllerHuman.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index ad37ec775f2..b26a3954f65 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -1432,11 +1432,19 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont @Override public List chooseModeForAbility(final SpellAbility sa, final int min, final int num, boolean allowRepeat) { + boolean trackerFrozen = game.getTracker().isFrozen(); + if (trackerFrozen) { + // The view tracker needs to be unfrozen to update the SpellAbilityViews at this point, or it may crash + game.getTracker().unfreeze(); + } final List possible = CharmEffect.makePossibleOptions(sa); HashMap spellViewCache = new HashMap<>(); for (AbilitySub spellAbility : possible) { spellViewCache.put(spellAbility.getView(), spellAbility); } + if (trackerFrozen) { + game.getTracker().freeze(); // refreeze if the tracker was frozen prior to this update + } final List choices = new ArrayList<>(spellViewCache.keySet()); final String modeTitle = TextUtil.concatNoSpace(sa.getActivatingPlayer().toString(), " activated ", sa.getHostCard().toString(), " - Choose a mode"); From b792f13c709915c011cb52ffd302f471a5937bb6 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 20 Dec 2018 08:33:25 +0300 Subject: [PATCH 513/901] - Flashback zone needs to be updated when the Stack changes, useful e.g. for Lightning Storm. --- .../src/forge/screens/match/views/VPlayerPanel.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java b/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java index fd8fa096e66..9e982f071f2 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java @@ -187,11 +187,12 @@ public class VPlayerPanel extends FContainer { zoneTab.update(); } - //update flashback zone when graveyard, library, or exile zones updated + //update flashback zone when graveyard, library, exile, or stack zones updated switch (zoneType) { case Graveyard: case Library: case Exile: + case Stack: zoneTabs.get(ZoneType.Flashback).update(); break; default: From c83a364e41896018912da74893d1e7235d80757e Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 20 Dec 2018 08:51:17 +0300 Subject: [PATCH 514/901] - Fixed a bug which made the Qty and New columns disappear when switching between Main and Sideboard in quest deck editor. --- .../forge/screens/deckeditor/controllers/CEditorQuest.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java index 84d8477f088..1d4bc47c248 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorQuest.java @@ -392,16 +392,19 @@ public final class CEditorQuest extends CDeckEditor { //Fixes null pointer error on switching tabs while quest deck editor is open. TODO: Find source of bug possibly? if(sectionMode == null) sectionMode = DeckSection.Main; + final Map colOverridesCatalog = new HashMap(); + ItemTableColumn.addColOverride(ItemManagerConfig.QUEST_EDITOR_POOL, colOverridesCatalog, ColumnDef.NEW, this.questData.getCards().getFnNewCompare(), this.questData.getCards().getFnNewGet()); + //Based on which section the editor is in, display the remaining card pool (or applicable card pool if in //Commander) and the current section's cards switch(sectionMode){ case Main : - this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); + this.getCatalogManager().setup(ItemManagerConfig.QUEST_EDITOR_POOL, colOverridesCatalog); this.getCatalogManager().setPool(getRemainingCardPool()); this.getDeckManager().setPool(this.controller.getModel().getMain()); break; case Sideboard : - this.getCatalogManager().setup(ItemManagerConfig.CARD_CATALOG); + this.getCatalogManager().setup(ItemManagerConfig.QUEST_EDITOR_POOL, colOverridesCatalog); this.getCatalogManager().setPool(getRemainingCardPool()); this.getDeckManager().setPool(getDeck().getOrCreate(DeckSection.Sideboard)); break; From 8c710a16187ebee8b7753e45e2b1afce3e4245fe Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 20 Dec 2018 15:31:08 +0300 Subject: [PATCH 515/901] - Fixed the +0 ability of Tezzeret, Cruel Machinist not being marked as Planeswalker ability. --- forge-gui/res/cardsfolder/t/tezzeret_cruel_machinist.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/t/tezzeret_cruel_machinist.txt b/forge-gui/res/cardsfolder/t/tezzeret_cruel_machinist.txt index c24d77aad20..031ff369be5 100644 --- a/forge-gui/res/cardsfolder/t/tezzeret_cruel_machinist.txt +++ b/forge-gui/res/cardsfolder/t/tezzeret_cruel_machinist.txt @@ -3,7 +3,7 @@ ManaCost:4 U U Loyalty:4 Types:Legendary Planeswalker Tezzeret A:AB$ Draw | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | NumCards$ 1 | Defined$ You | SpellDescription$ Draw a card. -A:AB$ Animate | Cost$ AddCounter<0/LOYALTY> | ValidTgts$ Artifact.YouCtrl | TgtPrompt$ Select target artifact you control | Power$ 5 | Toughness$ 5 | Types$ Artifact | SpellDescription$ Until your next turn, target artifact you control becomes a 5/5 creature in addition to its other types. +A:AB$ Animate | Cost$ AddCounter<0/LOYALTY> | Planeswalker$ True | ValidTgts$ Artifact.YouCtrl | TgtPrompt$ Select target artifact you control | Power$ 5 | Toughness$ 5 | Types$ Artifact | SpellDescription$ Until your next turn, target artifact you control becomes a 5/5 creature in addition to its other types. A:AB$ ChangeZone | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | Origin$ Hand | Destination$ Battlefield | ChangeType$ Card | ChangeNum$ X | References$ X | FaceDown$ True | FaceDownPower$ 5 | FaceDownToughness$ 5 | FaceDownAddType$ Artifact,Creature | StackDescription$ SpellDescription | SpellDescription$ Put any number of cards from your hand onto the battlefield face down. They're 5/5 artifact creatures. SVar:X:Count$InYourHand Oracle:[+1]: Draw a card.\n[0]: Until your next turn, target artifact you control becomes a 5/5 creature in addition to its other types.\n[-7]: Put any number of cards from your hand onto the battlefield face down. They're 5/5 artifact creatures. From 34273c6ce9ca24a803076b7e6bcef16b5344f723 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Thu, 20 Dec 2018 14:25:53 +0000 Subject: [PATCH 516/901] Fix Reyhan, Last of the Abzan --- forge-gui/res/cardsfolder/r/reyhan_last_of_the_abzan.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/r/reyhan_last_of_the_abzan.txt b/forge-gui/res/cardsfolder/r/reyhan_last_of_the_abzan.txt index 04f39fd77cc..770e8295371 100644 --- a/forge-gui/res/cardsfolder/r/reyhan_last_of_the_abzan.txt +++ b/forge-gui/res/cardsfolder/r/reyhan_last_of_the_abzan.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Human Warrior PT:0/0 K:etbCounter:P1P1:3 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard,Command | ValidCard$ Creature.YouCtrl+counters_GE1_P1P1 | TriggerZones$ Battlefield | TriggerController$ TriggeredCardController | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever a creature you control dies or is put into the command zone, if it had one or more +1/+1 counters on it, you may put that many +1/+1 counters on target creature. -SVar:TrigPutCounter:DB$PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ X | References$ X +SVar:TrigPutCounter:DB$PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ X | References$ X SVar:X:TriggeredCard$CardCounters.P1P1 K:Partner DeckHints:Ability$Counters From 976d51b77739ecb86a8336c5c2e16531be418b41 Mon Sep 17 00:00:00 2001 From: Computica Date: Fri, 21 Dec 2018 13:38:10 +0000 Subject: [PATCH 517/901] Update rot_hulk.txt --- forge-gui/res/cardsfolder/r/rot_hulk.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/r/rot_hulk.txt b/forge-gui/res/cardsfolder/r/rot_hulk.txt index 2542fc83c9f..cd90c11affb 100644 --- a/forge-gui/res/cardsfolder/r/rot_hulk.txt +++ b/forge-gui/res/cardsfolder/r/rot_hulk.txt @@ -6,4 +6,4 @@ K:Menace T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME enters the battlefield, return up to X target Zombie cards from your graveyard to the battlefield, where X is the number of opponents you have. SVar:TrigReturn:DB$ ChangeZone | ValidTgts$ Card.Zombie | TargetMin$ 0 | TargetMax$ X | TgtPrompt$ Select target Zombie card | Origin$ Graveyard | Destination$ Battlefield | References$ X | SpellDescription$ Return up to X target Zombie cards from your graveyard to the battlefield, where X is the number of opponents you have. SVar:X:PlayerCountOpponents$Amount -Oracle:Menace\nWhen Goblin Goliath enters the battlefield, create a number of 1/1 red Goblin creature tokens equal to the number of opponents you have.\n{3}{R}, {T}: If a source you control would deal damage to an opponent this turn, it deals double that damage to that player instead. +Oracle:Menace\nWhen Rot Hulk enters the battlefield, return up to X target Zombie cards from your graveyard to the battlefield, where X is the number of opponents you have. From 946115c2a68f7acdea03ec860ceacf8b211cf152 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Sun, 23 Dec 2018 17:44:51 +0000 Subject: [PATCH 518/901] Update Etrata the Silencer --- forge-gui/res/cardsfolder/e/etrata_the_silencer.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/e/etrata_the_silencer.txt b/forge-gui/res/cardsfolder/e/etrata_the_silencer.txt index 0921a004649..a9694a52e26 100644 --- a/forge-gui/res/cardsfolder/e/etrata_the_silencer.txt +++ b/forge-gui/res/cardsfolder/e/etrata_the_silencer.txt @@ -1,6 +1,6 @@ Name:Etrata, the Silencer ManaCost:2 U B -Types:Legendary Creature Vampire Assasin +Types:Legendary Creature Vampire Assassin PT:3/5 K:Unblockable T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigExile | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, exile target creature that player controls and put a hit counter on that card. That player loses the game if they own three or more exiled card with counters on them. CARDNAME's owner shuffles CARDNAME into their library. From 9b991635fb614e3571d0aa361451479a8eec8d80 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Sun, 23 Dec 2018 17:46:57 +0000 Subject: [PATCH 519/901] Sentry exception rework --- .../src/main/java/forge/ai/ComputerUtil.java | 2 +- .../java/forge/ai/ability/CountersPutAi.java | 2 +- .../main/java/forge/ai/ability/EffectAi.java | 2 +- .../java/forge/ai/ability/MustBlockAi.java | 2 +- .../forge/ai/ability/PermanentCreatureAi.java | 2 +- .../src/main/java/forge/game/card/Card.java | 243 +++++++++--------- .../java/forge/game/card/CardFactoryUtil.java | 21 +- .../forge/game/keyword/KeywordInstance.java | 41 +-- .../forge/game/trigger/TriggerHandler.java | 49 +++- 9 files changed, 213 insertions(+), 151 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index a0b46aebb42..ebfd378dfce 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -413,7 +413,7 @@ public class ComputerUtil { int mana = ComputerUtilMana.getAvailableManaEstimate(ai, false); boolean cantAffordSoon = activate.getCMC() > mana + 1; - boolean wrongColor = !activate.determineColor().hasNoColorsExcept(ColorSet.fromNames(ComputerUtilCost.getAvailableManaColors(ai, Lists.newArrayList())).getColor()); + boolean wrongColor = !activate.determineColor().hasNoColorsExcept(ColorSet.fromNames(ComputerUtilCost.getAvailableManaColors(ai, ImmutableList.of())).getColor()); // Only do this for spells, not activated abilities // We can't pay for this spell even if we play another land, or have wrong colors diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java index a2a7cff05f9..cb7d60ce4e5 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -1005,7 +1005,7 @@ public class CountersPutAi extends SpellAbilityAi { return Iterables.getFirst(options, null); } - private boolean doMoveCounterLogic(Player ai, SpellAbility sa, PhaseHandler ph) { + private boolean doMoveCounterLogic(final Player ai, SpellAbility sa, PhaseHandler ph) { // Spikes (Tempest) // Try not to do it unless at the end of opponent's turn or the creature is threatened diff --git a/forge-ai/src/main/java/forge/ai/ability/EffectAi.java b/forge-ai/src/main/java/forge/ai/ability/EffectAi.java index 0296cc100a8..4b83190cc6f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/EffectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/EffectAi.java @@ -113,7 +113,7 @@ public class EffectAi extends SpellAbilityAi { } else if (logic.equals("SpellCopy")) { // fetch Instant or Sorcery and AI has reason to play this turn // does not try to get itself - ManaCost costSa = sa.getPayCosts() != null ? sa.getPayCosts().getTotalMana() : ManaCost.NO_COST; + final ManaCost costSa = sa.getPayCosts() != null ? sa.getPayCosts().getTotalMana() : ManaCost.NO_COST; final int count = CardLists.count(ai.getCardsIn(ZoneType.Hand), new Predicate() { @Override public boolean apply(final Card c) { 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 c29ddc1b72c..98021672d3f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/MustBlockAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/MustBlockAi.java @@ -126,7 +126,7 @@ public class MustBlockAi extends SpellAbilityAi { return chance; } - private List determineGoodBlockers(Card attacker, Player ai, Player defender, SpellAbility sa, boolean onlyLethal, boolean testTapped) { + private List determineGoodBlockers(final Card attacker,final Player ai,final Player defender, SpellAbility sa, final boolean onlyLethal, final boolean testTapped) { final Card source = sa.getHostCard(); final TargetRestrictions abTgt = sa.getTargetRestrictions(); diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java index 25993d5c7ce..1fa1a224098 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java @@ -109,7 +109,7 @@ public class PermanentCreatureAi extends PermanentAi { return super.checkPhaseRestrictions(ai, sa, ph); } - private boolean doAdvancedFlashLogic(Card card, Player ai, SpellAbility sa) { + private boolean doAdvancedFlashLogic(Card card, final Player ai, SpellAbility sa) { Game game = ai.getGame(); PhaseHandler ph = game.getPhaseHandler(); Combat combat = game.getCombat(); diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 7374f78f137..70b7dd66a2d 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -67,6 +67,9 @@ import org.apache.commons.lang3.tuple.Pair; import java.util.*; import java.util.Map.Entry; +import io.sentry.Sentry; +import io.sentry.event.BreadcrumbBuilder; + /** *

* Card class. @@ -1962,124 +1965,134 @@ public class Card extends GameEntity implements Comparable { for (final KeywordInterface inst : getKeywords(state)) { final String keyword = inst.getOriginal(); - if (keyword.equals("Ascend") || keyword.equals("Changeling") - || keyword.equals("Aftermath") || keyword.equals("Wither") - || keyword.equals("Convoke") || keyword.equals("Delve") - || keyword.equals("Improvise") || keyword.equals("Retrace") - || keyword.equals("Undaunted") || keyword.equals("Cascade") - || keyword.equals("Devoid") || keyword.equals("Lifelink") - || keyword.equals("Split second")) { - sbBefore.append(keyword + " (" + inst.getReminderText() + ")"); - sbBefore.append("\r\n"); - } else if(keyword.equals("Conspire") || keyword.equals("Epic") - || keyword.equals("Suspend") || keyword.equals("Jump-start")) { - sbAfter.append(keyword + " (" + inst.getReminderText() + ")"); - sbAfter.append("\r\n"); - } else if (keyword.startsWith("Ripple")) { - sbBefore.append(TextUtil.fastReplace(keyword, ":", " ") + " (" + inst.getReminderText() + ")"); - sbBefore.append("\r\n"); - } else if (keyword.startsWith("Dredge")) { - sbAfter.append(TextUtil.fastReplace(keyword, ":", " ") + " (" + inst.getReminderText() + ")"); - sbAfter.append("\r\n"); - } else if (keyword.startsWith("Escalate") || keyword.startsWith("Buyback") - || keyword.startsWith("Prowl")) { - final String[] k = keyword.split(":"); - final String manacost = k[1]; - final Cost cost = new Cost(manacost, false); - - StringBuilder sbCost = new StringBuilder(k[0]); - if (!cost.isOnlyManaCost()) { - sbCost.append("—"); - } else { - sbCost.append(" "); - } - sbCost.append(cost.toSimpleString()); - sbBefore.append(sbCost + " (" + inst.getReminderText() + ")"); - sbBefore.append("\r\n"); - } else if (keyword.startsWith("Multikicker")) { - if (!keyword.endsWith("Generic")) { - final String[] n = keyword.split(":"); - final Cost cost = new Cost(n[1], false); - sbBefore.append("Multikicker ").append(cost.toSimpleString()) - .append(" (" + inst.getReminderText() + ")").append("\r\n"); - } - } else if (keyword.startsWith("Kicker")) { - if (!keyword.endsWith("Generic")) { - final StringBuilder sbx = new StringBuilder(); - final String[] n = keyword.split(":"); - sbx.append("Kicker "); - final Cost cost = new Cost(n[1], false); - sbx.append(cost.toSimpleString()); - if (Lists.newArrayList(n).size() > 2) { - sbx.append(" and/or "); - final Cost cost2 = new Cost(n[2], false); - sbx.append(cost2.toSimpleString()); + try { + if (keyword.equals("Ascend") || keyword.equals("Changeling") + || keyword.equals("Aftermath") || keyword.equals("Wither") + || keyword.equals("Convoke") || keyword.equals("Delve") + || keyword.equals("Improvise") || keyword.equals("Retrace") + || keyword.equals("Undaunted") || keyword.equals("Cascade") + || keyword.equals("Devoid") || keyword.equals("Lifelink") + || keyword.equals("Split second")) { + sbBefore.append(keyword + " (" + inst.getReminderText() + ")"); + sbBefore.append("\r\n"); + } else if(keyword.equals("Conspire") || keyword.equals("Epic") + || keyword.equals("Suspend") || keyword.equals("Jump-start")) { + sbAfter.append(keyword + " (" + inst.getReminderText() + ")"); + sbAfter.append("\r\n"); + } else if (keyword.startsWith("Ripple")) { + sbBefore.append(TextUtil.fastReplace(keyword, ":", " ") + " (" + inst.getReminderText() + ")"); + sbBefore.append("\r\n"); + } else if (keyword.startsWith("Dredge")) { + sbAfter.append(TextUtil.fastReplace(keyword, ":", " ") + " (" + inst.getReminderText() + ")"); + sbAfter.append("\r\n"); + } else if (keyword.startsWith("Escalate") || keyword.startsWith("Buyback") + || keyword.startsWith("Prowl")) { + final String[] k = keyword.split(":"); + final String manacost = k[1]; + final Cost cost = new Cost(manacost, false); + + StringBuilder sbCost = new StringBuilder(k[0]); + if (!cost.isOnlyManaCost()) { + sbCost.append("—"); + } else { + sbCost.append(" "); } - sbx.append(" (" + inst.getReminderText() + ")"); - sbBefore.append(sbx).append("\r\n"); + sbCost.append(cost.toSimpleString()); + sbBefore.append(sbCost + " (" + inst.getReminderText() + ")"); + sbBefore.append("\r\n"); + } else if (keyword.startsWith("Multikicker")) { + if (!keyword.endsWith("Generic")) { + final String[] n = keyword.split(":"); + final Cost cost = new Cost(n[1], false); + sbBefore.append("Multikicker ").append(cost.toSimpleString()) + .append(" (" + inst.getReminderText() + ")").append("\r\n"); + } + } else if (keyword.startsWith("Kicker")) { + if (!keyword.endsWith("Generic")) { + final StringBuilder sbx = new StringBuilder(); + final String[] n = keyword.split(":"); + sbx.append("Kicker "); + final Cost cost = new Cost(n[1], false); + sbx.append(cost.toSimpleString()); + if (Lists.newArrayList(n).size() > 2) { + sbx.append(" and/or "); + final Cost cost2 = new Cost(n[2], false); + sbx.append(cost2.toSimpleString()); + } + sbx.append(" (" + inst.getReminderText() + ")"); + sbBefore.append(sbx).append("\r\n"); + } + }else if (keyword.startsWith("AlternateAdditionalCost")) { + final String[] k = keyword.split(":"); + final Cost cost1 = new Cost(k[1], false); + final Cost cost2 = new Cost(k[2], false); + sbBefore.append("As an additional cost to cast ") + .append(state.getName()).append(", ") + .append(cost1.toSimpleString()) + .append(" or pay ") + .append(cost2.toSimpleString()) + .append(".\r\n"); + } else if (keyword.startsWith("Presence") || keyword.startsWith("MayFlash")) { + // Pseudo keywords, only print Reminder + sbBefore.append(inst.getReminderText()); + sbBefore.append("\r\n"); + } else if (keyword.startsWith("Entwine") || keyword.startsWith("Madness") + || keyword.startsWith("Miracle") || keyword.startsWith("Recover")) { + final String[] k = keyword.split(":"); + final Cost cost = new Cost(k[1], false); + + StringBuilder sbCost = new StringBuilder(k[0]); + if (!cost.isOnlyManaCost()) { + sbCost.append("—"); + } else { + sbCost.append(" "); + } + sbCost.append(cost.toSimpleString()); + sbAfter.append(sbCost + " (" + inst.getReminderText() + ")"); + sbAfter.append("\r\n"); + } else if (keyword.equals("CARDNAME can't be countered.") || + keyword.equals("Remove CARDNAME from your deck before playing if you're not playing for ante.")) { + sbBefore.append(keyword); + } else if (keyword.startsWith("Haunt")) { + sbAfter.append("Haunt ("); + sbAfter.append("When this spell card is put into a graveyard after resolving, "); + sbAfter.append("exile it haunting target creature."); + sbAfter.append(")"); + sbAfter.append("\r\n"); + } else if (keyword.startsWith("Splice")) { + final String[] n = keyword.split(":"); + final Cost cost = new Cost(n[2], false); + sbAfter.append("Splice onto ").append(n[1]).append(" ").append(cost.toSimpleString()); + sbAfter.append(" (" + inst.getReminderText() + ")").append("\r\n"); + } else if (keyword.equals("Storm")) { + sbAfter.append("Storm ("); + + sbAfter.append("When you cast this spell, copy it for each spell cast before it this turn."); + + if (strSpell.contains("Target") || strSpell.contains("target")) { + sbAfter.append(" You may choose new targets for the copies."); + } + + sbAfter.append(")"); + sbAfter.append("\r\n"); + } else if (keyword.startsWith("Replicate")) { + final String[] n = keyword.split(":"); + final Cost cost = new Cost(n[1], false); + sbBefore.append("Replicate ").append(cost.toSimpleString()); + sbBefore.append(" (When you cast this spell, copy it for each time you paid its replicate cost."); + if (strSpell.contains("Target") || strSpell.contains("target")) { + sbBefore.append(" You may choose new targets for the copies."); + } + sbBefore.append(")\r\n"); } - }else if (keyword.startsWith("AlternateAdditionalCost")) { - final String[] k = keyword.split(":"); - final Cost cost1 = new Cost(k[1], false); - final Cost cost2 = new Cost(k[2], false); - sbBefore.append("As an additional cost to cast ") - .append(state.getName()).append(", ") - .append(cost1.toSimpleString()) - .append(" or pay ") - .append(cost2.toSimpleString()) - .append(".\r\n"); - } else if (keyword.startsWith("Presence") || keyword.startsWith("MayFlash")) { - // Pseudo keywords, only print Reminder - sbBefore.append(inst.getReminderText()); - sbBefore.append("\r\n"); - } else if (keyword.startsWith("Entwine") || keyword.startsWith("Madness") - || keyword.startsWith("Miracle") || keyword.startsWith("Recover")) { - final String[] k = keyword.split(":"); - final Cost cost = new Cost(k[1], false); + } catch (Exception e) { + String msg = "Card:abilityTextInstantSorcery: crash in Keyword parsing"; + Sentry.getContext().recordBreadcrumb( + new BreadcrumbBuilder().setMessage(msg) + .withData("Card", this.getName()).withData("Keyword", keyword).build() + ); - StringBuilder sbCost = new StringBuilder(k[0]); - if (!cost.isOnlyManaCost()) { - sbCost.append("—"); - } else { - sbCost.append(" "); - } - sbCost.append(cost.toSimpleString()); - sbAfter.append(sbCost + " (" + inst.getReminderText() + ")"); - sbAfter.append("\r\n"); - } else if (keyword.equals("CARDNAME can't be countered.") || - keyword.equals("Remove CARDNAME from your deck before playing if you're not playing for ante.")) { - sbBefore.append(keyword); - } else if (keyword.startsWith("Haunt")) { - sbAfter.append("Haunt ("); - sbAfter.append("When this spell card is put into a graveyard after resolving, "); - sbAfter.append("exile it haunting target creature."); - sbAfter.append(")"); - sbAfter.append("\r\n"); - } else if (keyword.startsWith("Splice")) { - final String[] n = keyword.split(":"); - final Cost cost = new Cost(n[2], false); - sbAfter.append("Splice onto ").append(n[1]).append(" ").append(cost.toSimpleString()); - sbAfter.append(" (" + inst.getReminderText() + ")").append("\r\n"); - } else if (keyword.equals("Storm")) { - sbAfter.append("Storm ("); - - sbAfter.append("When you cast this spell, copy it for each spell cast before it this turn."); - - if (strSpell.contains("Target") || strSpell.contains("target")) { - sbAfter.append(" You may choose new targets for the copies."); - } - - sbAfter.append(")"); - sbAfter.append("\r\n"); - } else if (keyword.startsWith("Replicate")) { - final String[] n = keyword.split(":"); - final Cost cost = new Cost(n[1], false); - sbBefore.append("Replicate ").append(cost.toSimpleString()); - sbBefore.append(" (When you cast this spell, copy it for each time you paid its replicate cost."); - if (strSpell.contains("Target") || strSpell.contains("target")) { - sbBefore.append(" You may choose new targets for the copies."); - } - sbBefore.append(")\r\n"); + throw new RuntimeException("Error in Card " + this.getName() + " with Keyword " + keyword, e); } } diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 0ce4bc73b87..9dcf81f51a9 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -63,6 +63,10 @@ import org.apache.commons.lang3.tuple.Pair; import java.util.*; import java.util.Map.Entry; +import io.sentry.Sentry; +import io.sentry.event.BreadcrumbBuilder; + + /** *

* CardFactoryUtil class. @@ -1994,9 +1998,20 @@ public class CardFactoryUtil { // ************************************************** // AbilityFactory cards for (String rawAbility : abilities) { - final SpellAbility intrinsicAbility = AbilityFactory.getAbility(rawAbility, card); - card.addSpellAbility(intrinsicAbility); - intrinsicAbility.setIntrinsic(true); + try { + final SpellAbility intrinsicAbility = AbilityFactory.getAbility(rawAbility, card); + card.addSpellAbility(intrinsicAbility); + intrinsicAbility.setIntrinsic(true); + } catch (Exception e) { + String msg = "CardFactoryUtil:addAbilityFactoryAbilities: crash in raw Ability"; + Sentry.getContext().recordBreadcrumb( + new BreadcrumbBuilder().setMessage(msg) + .withData("Card", card.getName()).withData("Ability", rawAbility).build() + ); + + // rethrow the exception with card Name for the user + throw new RuntimeException("crash in raw Ability, check card script of " + card.getName(), e); + } } } diff --git a/forge-game/src/main/java/forge/game/keyword/KeywordInstance.java b/forge-game/src/main/java/forge/game/keyword/KeywordInstance.java index 5d335d39bc7..6c0d1072085 100644 --- a/forge-game/src/main/java/forge/game/keyword/KeywordInstance.java +++ b/forge-game/src/main/java/forge/game/keyword/KeywordInstance.java @@ -95,23 +95,34 @@ public abstract class KeywordInstance> implements K staticAbilities.clear(); } - String msg = "KeywordInstance:createTraits: make Traits for Keyword"; - Sentry.getContext().recordBreadcrumb( - new BreadcrumbBuilder().setMessage(msg) - .withData("Card", host.getName()).withData("Keyword", this.original).build() - ); - // add Extra for debugging - Sentry.getContext().addExtra("Card", host); - Sentry.getContext().addExtra("Keyword", this.original); + try { + String msg = "KeywordInstance:createTraits: make Traits for Keyword"; + Sentry.getContext().recordBreadcrumb( + new BreadcrumbBuilder().setMessage(msg) + .withData("Card", host.getName()).withData("Keyword", this.original).build() + ); - CardFactoryUtil.addTriggerAbility(this, host, intrinsic); - CardFactoryUtil.addReplacementEffect(this, host, intrinsic); - CardFactoryUtil.addSpellAbility(this, host, intrinsic); - CardFactoryUtil.addStaticAbility(this, host, intrinsic); + // add Extra for debugging + Sentry.getContext().addExtra("Card", host); + Sentry.getContext().addExtra("Keyword", this.original); - // remove added extra - Sentry.getContext().removeExtra("Card"); - Sentry.getContext().removeExtra("Keyword"); + CardFactoryUtil.addTriggerAbility(this, host, intrinsic); + CardFactoryUtil.addReplacementEffect(this, host, intrinsic); + CardFactoryUtil.addSpellAbility(this, host, intrinsic); + CardFactoryUtil.addStaticAbility(this, host, intrinsic); + } catch (Exception e) { + String msg = "KeywordInstance:createTraits: failed Traits for Keyword"; + Sentry.getContext().recordBreadcrumb( + new BreadcrumbBuilder().setMessage(msg) + .withData("Card", host.getName()).withData("Keyword", this.original).build() + ); + //rethrow + throw new RuntimeException("Error in Keyword " + this.original + " for card " + host.getName(), e); + } finally { + // remove added extra + Sentry.getContext().removeExtra("Card"); + Sentry.getContext().removeExtra("Keyword"); + } } /* diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java index 44dfb9fead2..d3d810bfefe 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -36,12 +36,15 @@ import forge.game.spellability.TargetRestrictions; import forge.game.zone.Zone; import forge.game.zone.ZoneType; import forge.util.Visitor; +import io.sentry.Sentry; +import io.sentry.event.BreadcrumbBuilder; import java.util.*; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ListMultimap; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import com.google.common.collect.Multimaps; public class TriggerHandler { @@ -156,31 +159,51 @@ public class TriggerHandler { } public static Trigger parseTrigger(final String trigParse, final Card host, final boolean intrinsic) { - final HashMap mapParams = TriggerHandler.parseParams(trigParse); - return TriggerHandler.parseTrigger(mapParams, host, intrinsic); + try { + final Map mapParams = TriggerHandler.parseParams(trigParse); + return TriggerHandler.parseTrigger(mapParams, host, intrinsic); + } catch (Exception e) { + String msg = "TriggerHandler:parseTrigger failed to parse"; + Sentry.getContext().recordBreadcrumb( + new BreadcrumbBuilder().setMessage(msg) + .withData("Card", host.getName()).withData("Trigger", trigParse).build() + ); + //rethrow + throw new RuntimeException("Error in Trigger for Card: " + host.getName(), e); + } } public static Trigger parseTrigger(final Map mapParams, final Card host, final boolean intrinsic) { Trigger ret = null; - final TriggerType type = TriggerType.smartValueOf(mapParams.get("Mode")); - ret = type.createTrigger(mapParams, host, intrinsic); + try { + final TriggerType type = TriggerType.smartValueOf(mapParams.get("Mode")); + ret = type.createTrigger(mapParams, host, intrinsic); - String triggerZones = mapParams.get("TriggerZones"); - if (null != triggerZones) { - ret.setActiveZone(EnumSet.copyOf(ZoneType.listValueOf(triggerZones))); - } + String triggerZones = mapParams.get("TriggerZones"); + if (null != triggerZones) { + ret.setActiveZone(EnumSet.copyOf(ZoneType.listValueOf(triggerZones))); + } - String triggerPhases = mapParams.get("Phase"); - if (null != triggerPhases) { - ret.setTriggerPhases(PhaseType.parseRange(triggerPhases)); + String triggerPhases = mapParams.get("Phase"); + if (null != triggerPhases) { + ret.setTriggerPhases(PhaseType.parseRange(triggerPhases)); + } + } catch (Exception e) { + String msg = "TriggerHandler:parseTrigger failed to parse"; + Sentry.getContext().recordBreadcrumb( + new BreadcrumbBuilder().setMessage(msg) + .withData("Card", host.getName()).withData("Params", mapParams.toString()).build() + ); + //rethrow + throw new RuntimeException("Error in Trigger for Card: " + host.getName(), e); } return ret; } - private static HashMap parseParams(final String trigParse) { - final HashMap mapParams = new HashMap(); + private static Map parseParams(final String trigParse) { + final Map mapParams = Maps.newHashMap(); if (trigParse.length() == 0) { throw new RuntimeException("TriggerFactory : registerTrigger -- trigParse too short"); From e85f9e08be83c29aaa8ff3c5fbb69d1328a9da93 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 22 Dec 2018 08:27:53 +0100 Subject: [PATCH 520/901] Keyword: add Afterlife --- .../src/main/java/forge/item/PaperToken.java | 6 ++++-- forge-core/src/main/java/forge/token/TokenDb.java | 2 +- .../forge/game/ability/effects/TokenEffect.java | 2 ++ forge-game/src/main/java/forge/game/card/Card.java | 3 ++- .../main/java/forge/game/card/CardFactoryUtil.java | 14 ++++++++++++++ .../src/main/java/forge/game/keyword/Keyword.java | 1 + .../cardsfolder/upcoming/imperious_oligarch.txt | 7 +++++++ .../res/tokenscripts/wb_1_1_spirit_flying.txt | 7 +++++++ 8 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/imperious_oligarch.txt create mode 100644 forge-gui/res/tokenscripts/wb_1_1_spirit_flying.txt diff --git a/forge-core/src/main/java/forge/item/PaperToken.java b/forge-core/src/main/java/forge/item/PaperToken.java index 59e2e0015ae..bc709dace7a 100644 --- a/forge-core/src/main/java/forge/item/PaperToken.java +++ b/forge-core/src/main/java/forge/item/PaperToken.java @@ -96,7 +96,9 @@ public class PaperToken implements InventoryItemFromSet, IPaperCard { build.add(keyword); } - build.add(edition.getCode()); + if (edition != null) { + build.add(edition.getCode()); + } // Should future image file names be all lower case? Instead of Up case sets? return StringUtils.join(build, "_").toLowerCase(); @@ -121,7 +123,7 @@ public class PaperToken implements InventoryItemFromSet, IPaperCard { @Override public String getName() { return name; } @Override public String toString() { return name; } - @Override public String getEdition() { return edition.getCode(); } + @Override public String getEdition() { return edition != null ? edition.getCode() : "???"; } @Override public int getArtIndex() { return 0; } // This might change however @Override public boolean isFoil() { return false; } @Override public CardRules getRules() { return card; } diff --git a/forge-core/src/main/java/forge/token/TokenDb.java b/forge-core/src/main/java/forge/token/TokenDb.java index f4275e4c86b..9c0ab01bec6 100644 --- a/forge-core/src/main/java/forge/token/TokenDb.java +++ b/forge-core/src/main/java/forge/token/TokenDb.java @@ -47,7 +47,7 @@ public class TokenDb implements ITokenDatabase { tokensByName.put(fullName, pt); return pt; } catch(Exception e) { - return null; + throw e; } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java b/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java index 6ff9d2e7d4e..1636c8f6cc7 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java @@ -207,6 +207,8 @@ public class TokenEffect extends SpellAbilityEffect { if (result != null) { tokenName = result.getName(); + } else { + throw new RuntimeException("don't find Token for TokenScript: " + sa.getParam("TokenScript")); } return result; diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 70b7dd66a2d..4463c639640 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -1622,7 +1622,8 @@ public class Card extends GameEntity implements Comparable { || keyword.startsWith("Fabricate") || keyword.startsWith("Soulshift") || keyword.startsWith("Bushido") || keyword.startsWith("Crew") || keyword.startsWith("Tribute") || keyword.startsWith("Absorb") || keyword.startsWith("Graft") || keyword.startsWith("Fading") || keyword.startsWith("Vanishing") - || keyword.startsWith ("Afflict") || keyword.startsWith ("Poisonous") || keyword.startsWith("Rampage") + || keyword.startsWith("Afterlife") + || keyword.startsWith("Afflict") || keyword.startsWith ("Poisonous") || keyword.startsWith("Rampage") || keyword.startsWith("Renown") || keyword.startsWith("Annihilator") || keyword.startsWith("Devour")) { final String[] k = keyword.split(":"); sbLong.append(k[0] + " " + k[1] + " (" + inst.getReminderText() + ")"); diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 9dcf81f51a9..2fba1dfd121 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -2137,6 +2137,20 @@ public class CardFactoryUtil { afflictTrigger.setOverridingAbility(AbilityFactory.getAbility(abStringAfflict, card)); inst.addTrigger(afflictTrigger); + } else if (keyword.startsWith("Afterlife")) { + final String k[] = keyword.split(":"); + final String name = StringUtils.join(k, " "); + + final StringBuilder sb = new StringBuilder(); + sb.append("Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self "); + sb.append("| Secondary$ True | TriggerDescription$ ").append(name); + sb.append(" (").append(inst.getReminderText()).append(")"); + final String effect = "DB$ Token | TokenAmount$ " + k[1] + " | TokenScript$ wb_1_1_spirit_flying"; + + final Trigger trigger = TriggerHandler.parseTrigger(sb.toString(), card, intrinsic); + + trigger.setOverridingAbility(AbilityFactory.getAbility(effect, card)); + inst.addTrigger(trigger); } else if (keyword.startsWith("Annihilator")) { final String[] k = keyword.split(":"); final String n = k[1]; diff --git a/forge-game/src/main/java/forge/game/keyword/Keyword.java b/forge-game/src/main/java/forge/game/keyword/Keyword.java index 72c45bc8589..b5272d5199d 100644 --- a/forge-game/src/main/java/forge/game/keyword/Keyword.java +++ b/forge-game/src/main/java/forge/game/keyword/Keyword.java @@ -15,6 +15,7 @@ public enum Keyword { ABSORB(KeywordWithAmount.class, false, "If a source would deal damage to this creature, prevent %d of that damage."), AFFINITY(KeywordWithType.class, false, "This spell costs you {1} less to cast for each %s you control."), AFFLICT(KeywordWithAmount.class, false, "Whenever this creature becomes blocked, defending player loses %d life."), + AFTERLIFE(KeywordWithAmount.class, false, "When this creature dies, create {%1$d:1/1 white and black Spirit creature token} with flying."), AFTERMATH(SimpleKeyword.class, false, "Cast this spell only from your graveyard. Then exile it."), AMPLIFY(KeywordWithAmountAndType.class, false, "As this creature enters the battlefield, put {%d:+1/+1 counter} on it for each %s card you reveal in your hand."), ANNIHILATOR(KeywordWithAmount.class, false, "Whenever this creature attacks, defending player sacrifices {%d:permanent}."), diff --git a/forge-gui/res/cardsfolder/upcoming/imperious_oligarch.txt b/forge-gui/res/cardsfolder/upcoming/imperious_oligarch.txt new file mode 100644 index 00000000000..13e0bc6549e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/imperious_oligarch.txt @@ -0,0 +1,7 @@ +Name:Imperious Oligarch +ManaCost:W B +Types:Creature Human Cleric +PT:2/1 +K:Vigilance +K:Afterlife:1 +Oracle:Vigilance\nAfterlife 1 (When this creature dies, create a 1/1 white and black Spirit creature token with flying.) diff --git a/forge-gui/res/tokenscripts/wb_1_1_spirit_flying.txt b/forge-gui/res/tokenscripts/wb_1_1_spirit_flying.txt new file mode 100644 index 00000000000..9fe27496ea8 --- /dev/null +++ b/forge-gui/res/tokenscripts/wb_1_1_spirit_flying.txt @@ -0,0 +1,7 @@ +Name:Spirit +ManaCost:no cost +Types:Creature Spirit +Colors:white,black +PT:1/1 +K:Flying +Oracle:Flying From dd759352de3161c7f73d893148b38b6e81deec8f Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 22 Dec 2018 09:04:05 +0100 Subject: [PATCH 521/901] Keyword: add Adapt --- .../java/forge/ai/ComputerUtilCombat.java | 40 +++++++++++++------ .../java/forge/ai/ability/CountersPutAi.java | 4 ++ .../src/main/java/forge/game/card/Card.java | 2 +- .../java/forge/game/card/CardFactoryUtil.java | 18 +++++++++ .../main/java/forge/game/keyword/Keyword.java | 1 + .../res/cardsfolder/upcoming/aeromunculus.txt | 8 ++++ 6 files changed, 60 insertions(+), 13 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/aeromunculus.txt diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java index 9fbd2ab58bc..481cab38688 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java @@ -1052,11 +1052,15 @@ public class ComputerUtilCombat { if (!ability.hasParam("CounterType") || !ability.getParam("CounterType").equals("P1P1")) { continue; } - + if (ability.hasParam("Monstrosity") && blocker.isMonstrous()) { - continue; + continue; } - + + if (ability.hasParam("Adapt") && blocker.getCounters(CounterType.P1P1) > 0) { + continue; + } + if (ComputerUtilCost.canPayCost(ability, blocker.getController())) { int pBonus = AbilityUtils.calculateAmount(ability.getHostCard(), ability.getParam("CounterNum"), ability); if (pBonus > 0) { @@ -1224,11 +1228,15 @@ public class ComputerUtilCombat { if (!ability.hasParam("CounterType") || !ability.getParam("CounterType").equals("P1P1")) { continue; } - + if (ability.hasParam("Monstrosity") && blocker.isMonstrous()) { - continue; + continue; } - + + if (ability.hasParam("Adapt") && blocker.getCounters(CounterType.P1P1) > 0) { + continue; + } + if (ComputerUtilCost.canPayCost(ability, blocker.getController())) { int tBonus = AbilityUtils.calculateAmount(ability.getHostCard(), ability.getParam("CounterNum"), ability); if (tBonus > 0) { @@ -1442,11 +1450,15 @@ public class ComputerUtilCombat { if (!ability.hasParam("CounterType") || !ability.getParam("CounterType").equals("P1P1")) { continue; } - + if (ability.hasParam("Monstrosity") && attacker.isMonstrous()) { - continue; + continue; } - + + if (ability.hasParam("Adapt") && blocker.getCounters(CounterType.P1P1) > 0) { + continue; + } + if (!ability.getPayCosts().hasTapCost() && ComputerUtilCost.canPayCost(ability, attacker.getController())) { int pBonus = AbilityUtils.calculateAmount(ability.getHostCard(), ability.getParam("CounterNum"), ability); if (pBonus > 0) { @@ -1675,11 +1687,15 @@ public class ComputerUtilCombat { if (!ability.hasParam("CounterType") || !ability.getParam("CounterType").equals("P1P1")) { continue; } - + if (ability.hasParam("Monstrosity") && attacker.isMonstrous()) { - continue; + continue; } - + + if (ability.hasParam("Adapt") && blocker.getCounters(CounterType.P1P1) > 0) { + continue; + } + if (!ability.getPayCosts().hasTapCost() && ComputerUtilCost.canPayCost(ability, attacker.getController())) { int tBonus = AbilityUtils.calculateAmount(ability.getHostCard(), ability.getParam("CounterNum"), ability); if (tBonus > 0) { diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java index cb7d60ce4e5..8499e2921de 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -311,6 +311,10 @@ public class CountersPutAi extends SpellAbilityAi { return false; } + if (sa.hasParam("Adapt") && source.getCounters(CounterType.P1P1) > 0) { + return false; + } + // TODO handle proper calculation of X values based on Cost int amount = AbilityUtils.calculateAmount(source, amountStr, sa); diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 4463c639640..205b82422ae 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -1662,7 +1662,7 @@ public class Card extends GameEntity implements Comparable { || keyword.equals("Undaunted") || keyword.startsWith("Monstrosity") || keyword.startsWith("Embalm") || keyword.startsWith("Level up") || keyword.equals("Prowess") || keyword.startsWith("Eternalize") || keyword.startsWith("Reinforce") || keyword.startsWith("Champion") || keyword.startsWith("Prowl") - || keyword.startsWith("Amplify") || keyword.startsWith("Ninjutsu") + || keyword.startsWith("Amplify") || keyword.startsWith("Ninjutsu") || keyword.startsWith("Adapt") || keyword.startsWith("Cycling") || keyword.startsWith("TypeCycling")) { // keyword parsing takes care of adding a proper description } else if (keyword.startsWith("CantBeBlockedByAmount")) { diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 2fba1dfd121..7c94bf77427 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -3676,6 +3676,24 @@ public class CardFactoryUtil { inst.addSpellAbility(newSA); } + } else if (keyword.startsWith("Adapt")) { + final String[] k = keyword.split(":"); + final String magnitude = k[1]; + final String manacost = k[2]; + + String desc = "Adapt " + magnitude; + + String effect = "AB$ PutCounter | Cost$ " + manacost + " | ConditionPresent$ " + + "Card.Self+counters_EQ0_P1P1 | Adapt$ True | CounterNum$ " + magnitude + + " | CounterType$ P1P1 | StackDescription$ SpellDescription"; + + effect += "| SpellDescription$ " + desc + " (" + inst.getReminderText() + ")"; + + final SpellAbility sa = AbilityFactory.getAbility(effect, card); + sa.setIntrinsic(intrinsic); + + sa.setTemporary(!intrinsic); + inst.addSpellAbility(sa); } else if (keyword.equals("Aftermath") && card.getCurrentStateName().equals(CardStateName.RightSplit)) { // Aftermath does modify existing SA, and does not add new one diff --git a/forge-game/src/main/java/forge/game/keyword/Keyword.java b/forge-game/src/main/java/forge/game/keyword/Keyword.java index b5272d5199d..d4f02e84311 100644 --- a/forge-game/src/main/java/forge/game/keyword/Keyword.java +++ b/forge-game/src/main/java/forge/game/keyword/Keyword.java @@ -13,6 +13,7 @@ import forge.util.TextUtil; public enum Keyword { UNDEFINED(SimpleKeyword.class, false, ""), ABSORB(KeywordWithAmount.class, false, "If a source would deal damage to this creature, prevent %d of that damage."), + ADAPT(KeywordWithCostAndAmount.class, false, "If this creature has no +1/+1 counters on it, put {%2$d:+1/+1 counter} on it."), AFFINITY(KeywordWithType.class, false, "This spell costs you {1} less to cast for each %s you control."), AFFLICT(KeywordWithAmount.class, false, "Whenever this creature becomes blocked, defending player loses %d life."), AFTERLIFE(KeywordWithAmount.class, false, "When this creature dies, create {%1$d:1/1 white and black Spirit creature token} with flying."), diff --git a/forge-gui/res/cardsfolder/upcoming/aeromunculus.txt b/forge-gui/res/cardsfolder/upcoming/aeromunculus.txt new file mode 100644 index 00000000000..a0028624591 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/aeromunculus.txt @@ -0,0 +1,8 @@ +Name:Aeromunculus +ManaCost:1 G U +Types:Creature Homunculus Mutant +PT:2/3 +K:Flying +K:Adapt:1:2 G U +DeckHas:Ability$Counters +Oracle:Flying\n{2}{G}{U}: Adapt 1. (If this creature has no +1/+1 counters on it, put a +1/+1 counter on it.) From d3395e95bc928560b139104821a8d23851b348d1 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 22 Dec 2018 17:09:39 +0100 Subject: [PATCH 522/901] Keyword: add Spectacle --- forge-game/src/main/java/forge/game/Game.java | 2 +- .../src/main/java/forge/game/card/Card.java | 2 +- .../java/forge/game/card/CardFactoryUtil.java | 31 +++++++++++++++---- .../java/forge/game/card/CardProperty.java | 5 +++ .../src/main/java/forge/game/cost/Cost.java | 2 ++ .../main/java/forge/game/keyword/Keyword.java | 1 + .../main/java/forge/game/player/Player.java | 15 +++++++-- .../forge/game/spellability/SpellAbility.java | 10 ++++++ .../spellability/SpellAbilityRestriction.java | 5 +++ .../res/cardsfolder/upcoming/rafter_demon.txt | 8 +++++ 10 files changed, 71 insertions(+), 10 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/rafter_demon.txt diff --git a/forge-game/src/main/java/forge/game/Game.java b/forge-game/src/main/java/forge/game/Game.java index 83e0e5e9396..36657751ce2 100644 --- a/forge-game/src/main/java/forge/game/Game.java +++ b/forge-game/src/main/java/forge/game/Game.java @@ -326,7 +326,7 @@ public class Game { * Gets the players who participated in match (regardless of outcome). * Use this in UI and after match calculations */ - public final List getRegisteredPlayers() { + public final PlayerCollection getRegisteredPlayers() { return allPlayers; } diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 205b82422ae..9df3c41e0c3 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -1656,7 +1656,7 @@ public class Card extends GameEntity implements Comparable { sbLong.append(keyword); sbLong.append(" (" + Keyword.getInstance("Offering:"+ offeringType).getReminderText() + ")"); } else if (keyword.startsWith("Equip") || keyword.startsWith("Fortify") || keyword.startsWith("Outlast") - || keyword.startsWith("Unearth") || keyword.startsWith("Scavenge") + || keyword.startsWith("Unearth") || keyword.startsWith("Scavenge") || keyword.startsWith("Spectacle") || keyword.startsWith("Evoke") || keyword.startsWith("Bestow") || keyword.startsWith("Dash") || keyword.startsWith("Surge") || keyword.startsWith("Transmute") || keyword.startsWith("Suspend") || keyword.equals("Undaunted") || keyword.startsWith("Monstrosity") || keyword.startsWith("Embalm") diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 7c94bf77427..87fe006c8e0 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -985,11 +985,7 @@ public class CardFactoryUtil { return doXMath(cc.getLifeGainedByTeamThisTurn(), m, c); } if (sq[0].contains("LifeOppsLostThisTurn")) { - int lost = 0; - for (Player opp : cc.getOpponents()) { - lost += opp.getLifeLostThisTurn(); - } - return doXMath(lost, m, c); + return doXMath(cc.getOpponentLostLifeThisTurn(), m, c); } if (sq[0].equals("TotalDamageDoneByThisTurn")) { return doXMath(c.getTotalDamageDoneBy(), m, c); @@ -2047,6 +2043,12 @@ public class CardFactoryUtil { final String effect, final boolean optional, final boolean secondary, final boolean intrinsic, final String valid, final String zone) { SpellAbility repAb = AbilityFactory.getAbility(effect, card); + return createETBReplacement(card, layer, repAb, optional, secondary, intrinsic, valid, zone); + } + + private static ReplacementEffect createETBReplacement(final Card card, ReplacementLayer layer, + final SpellAbility repAb, final boolean optional, final boolean secondary, + final boolean intrinsic, final String valid, final String zone) { String desc = repAb.getDescription(); setupETBReplacementAbility(repAb); if (!intrinsic) { @@ -3526,7 +3528,7 @@ public class CardFactoryUtil { inst.addReplacement(cardre); } else if (keyword.equals("Unleash")) { - String effect = "DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Unleash (" + inst.getReminderText() + ")"; + String effect = "DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | ETB$ True | CounterNum$ 1 | SpellDescription$ Unleash (" + inst.getReminderText() + ")"; ReplacementEffect cardre = createETBReplacement(card, ReplacementLayer.Other, effect, true, true, intrinsic, "Card.Self", ""); @@ -4170,6 +4172,23 @@ public class CardFactoryUtil { sa.setTemporary(!intrinsic); inst.addSpellAbility(sa); + } else if (keyword.startsWith("Spectacle")) { + final String[] k = keyword.split(":"); + final Cost cost = new Cost(k[1], false); + final SpellAbility newSA = card.getFirstSpellAbility().copyWithDefinedCost(cost); + + newSA.setBasicSpell(false); + newSA.setSpectacle(true); + + String desc = "Spectacle " + cost.toSimpleString() + " (" + inst.getReminderText() + + ")"; + newSA.setDescription(desc); + + newSA.setIntrinsic(intrinsic); + + newSA.setTemporary(!intrinsic); + inst.addSpellAbility(newSA); + } else if (keyword.equals("Sunburst") && intrinsic) { final GameCommand sunburstCIP = new GameCommand() { private static final long serialVersionUID = 1489845860231758299L; diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index aac65619027..06cab7f3747 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -1632,6 +1632,11 @@ public class CardProperty { return false; } return card.getCastSA().isProwl(); + } else if (property.startsWith("spectacle")) { + if (card.getCastSA() == null) { + return false; + } + return card.getCastSA().isSpectacle(); } else if (property.equals("HasDevoured")) { if (card.getDevouredCards().isEmpty()) { return false; diff --git a/forge-game/src/main/java/forge/game/cost/Cost.java b/forge-game/src/main/java/forge/game/cost/Cost.java index 1d7606922c0..09f0b69b4d9 100644 --- a/forge-game/src/main/java/forge/game/cost/Cost.java +++ b/forge-game/src/main/java/forge/game/cost/Cost.java @@ -98,6 +98,8 @@ public class Cost implements Serializable { return true; } + + @SuppressWarnings("unchecked") public T getCostPartByType(Class costType) { for (CostPart p : getCostParts()) { if (costType.isInstance(p)) { diff --git a/forge-game/src/main/java/forge/game/keyword/Keyword.java b/forge-game/src/main/java/forge/game/keyword/Keyword.java index d4f02e84311..dd04919164e 100644 --- a/forge-game/src/main/java/forge/game/keyword/Keyword.java +++ b/forge-game/src/main/java/forge/game/keyword/Keyword.java @@ -131,6 +131,7 @@ public enum Keyword { SCAVENGE(KeywordWithCost.class, false, "%s, Exile this card from your graveyard: Put a number of +1/+1 counters equal to this card's power on target creature. Scavenge only as a sorcery."), SOULBOND(SimpleKeyword.class, true, "You may pair this creature with another unpaired creature when either enters the battlefield. They remain paired for as long as you control both of them"), SOULSHIFT(KeywordWithAmount.class, false, "When this creature dies, you may return target Spirit card with converted mana cost %d or less from your graveyard to your hand."), + SPECTACLE(KeywordWithCost.class, true, "You may cast this spell for its spectacle cost rather than its mana cost if an opponent lost life this turn."), SPLICE(KeywordWithCostAndType.class, false, "As you cast an %2$s spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell."), SPLIT_SECOND(SimpleKeyword.class, true, "As long as this spell is on the stack, players can't cast other spells or activate abilities that aren't mana abilities."), STORM(SimpleKeyword.class, false, "When you cast this spell, copy it for each other spell that was cast before it this turn. You may choose new targets for the copies."), diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 98dbbe2edf9..bd00fca5986 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -260,6 +260,10 @@ public class Player extends GameEntity implements Comparable { return game.getPlayers().filter(PlayerPredicates.isOpponentOf(this)); } + public final PlayerCollection getRegisteredOpponents() { + return game.getRegisteredPlayers().filter(PlayerPredicates.isOpponentOf(this)); + } + public void updateOpponentsForView() { view.updateOpponents(this); } @@ -2037,8 +2041,7 @@ public class Player extends GameEntity implements Comparable { } public final int getBloodthirstAmount() { - return Aggregates.sum(Iterables.filter( - game.getRegisteredPlayers(), PlayerPredicates.isOpponentOf(this)), Accessors.FN_GET_ASSIGNED_DAMAGE); + return Aggregates.sum(getRegisteredOpponents(), Accessors.FN_GET_ASSIGNED_DAMAGE); } public final boolean hasSurge() { @@ -2047,6 +2050,14 @@ public class Player extends GameEntity implements Comparable { return !CardLists.filterControlledBy(game.getStack().getSpellsCastThisTurn(), list).isEmpty(); } + public final int getOpponentLostLifeThisTurn() { + int lost = 0; + for (Player opp : getRegisteredOpponents()) { + lost += opp.getLifeLostThisTurn(); + } + return lost; + } + public final boolean hasProwl(final String type) { if (prowl.contains("AllCreatureTypes")) { return true; diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index a1cf5a993fa..853c29b21f4 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -96,6 +96,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit private int sourceTrigger = -1; private List triggerRemembered = Lists.newArrayList(); + // TODO use enum for the flags private boolean flashBackAbility = false; private boolean aftermath = false; private boolean cycling = false; @@ -103,6 +104,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit private boolean evoke = false; private boolean prowl = false; private boolean surge = false; + private boolean spectacle = false; private boolean offering = false; private boolean emerge = false; private boolean morphup = false; @@ -1121,6 +1123,14 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit surge = isSurge; } + public final boolean isSpectacle() { + return spectacle; + } + + public final void setSpectacle(final boolean isSpectacle) { + spectacle = isSpectacle; + } + public CardCollection getTappedForConvoke() { return tappedForConvoke; } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java index 111659b7e03..e992a95a90c 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java @@ -419,6 +419,11 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { return false; } } + if (sa.isSpectacle()) { + if (activator.getOpponentLostLifeThisTurn() <= 0) { + return false; + } + } if (isDesert()) { if (!activator.hasDesert()) { return false; diff --git a/forge-gui/res/cardsfolder/upcoming/rafter_demon.txt b/forge-gui/res/cardsfolder/upcoming/rafter_demon.txt new file mode 100644 index 00000000000..a052536a4b1 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rafter_demon.txt @@ -0,0 +1,8 @@ +Name:Rafter Demon +ManaCost:2 B R +Types:Creature Demon +PT:4/2 +K:Spectacle:3 B R +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+spectacle | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, if its spectacle cost was paid, each opponent discards a card. +SVar:TrigDiscard:DB$ Discard | Defined$ Player.Opponent | NumCards$ 1 | Mode$ TgtChoose +Oracle:Spectacle {3}{B}{R} (You may cast this spell for its spectacle cost rather than its mana cost if an opponent lost life this turn.)\nWhen Rafter Demon enters the battlefield, if its spectacle cost was paid, each opponent discards a card. From b87f247c098ec75a5c28dbfe3c5c11ed586af9e4 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 22 Dec 2018 17:28:55 +0100 Subject: [PATCH 523/901] Keyword: add Riot --- .../ai/ability/ChooseGenericEffectAi.java | 49 ++++++++++++++++++- .../src/main/java/forge/game/card/Card.java | 2 +- .../java/forge/game/card/CardFactoryUtil.java | 17 +++++++ .../main/java/forge/game/keyword/Keyword.java | 1 + .../cardsfolder/upcoming/frenzied_arynx.txt | 8 +++ 5 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/frenzied_arynx.txt diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java index af986809b36..da6ea137f92 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java @@ -6,6 +6,8 @@ import java.util.Map; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; +import com.google.common.collect.Sets; + import forge.ai.ComputerUtilAbility; import forge.ai.ComputerUtilCard; @@ -24,6 +26,8 @@ import forge.game.card.CounterType; import forge.game.combat.Combat; import forge.game.combat.CombatUtil; import forge.game.cost.Cost; +import forge.game.keyword.Keyword; +import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.spellability.AbilitySub; import forge.game.spellability.SpellAbility; @@ -38,7 +42,7 @@ public class ChooseGenericEffectAi extends SpellAbilityAi { protected boolean checkAiLogic(final Player ai, final SpellAbility sa, final String aiLogic) { if ("Khans".equals(aiLogic) || "Dragons".equals(aiLogic)) { return true; - } else if (aiLogic.startsWith("Fabricate")) { + } else if (aiLogic.startsWith("Fabricate") || "Riot".equals(aiLogic)) { return true; } else if ("Pump".equals(aiLogic) || "BestOption".equals(aiLogic)) { for (AbilitySub sb : sa.getAdditionalAbilityList("Choices")) { @@ -344,6 +348,49 @@ public class ChooseGenericEffectAi extends SpellAbilityAi { if (!filtered.isEmpty()) { return filtered.get(0); } + } else if ("Riot".equals(logic)) { + SpellAbility counterSA = spells.get(0), hasteSA = spells.get(1); + + final Card copy = CardUtil.getLKICopy(host); + copy.setLastKnownZone(player.getZone(ZoneType.Battlefield)); + + // check state it would have on the battlefield + CardCollection preList = new CardCollection(copy); + game.getAction().checkStaticAbilities(false, Sets.newHashSet(copy), preList); + // reset again? + game.getAction().checkStaticAbilities(false); + + // can't gain counters, use Haste + if (!copy.canReceiveCounters(CounterType.P1P1)) { + return hasteSA; + } + + // already has Haste, use counter + if (copy.hasKeyword(Keyword.HASTE)) { + return counterSA; + } + + // not AI turn + if (!game.getPhaseHandler().isPlayerTurn(player)) { + return counterSA; + } + + // not before Combat + if (!game.getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS)) { + return counterSA; + } + + // TODO check other opponents too if able + final Player opp = player.getWeakestOpponent(); + if (opp != null) { + // TODO add predict Combat Damage? + if (opp.getLife() < copy.getNetPower()) { + return hasteSA; + } + } + + // haste might not be good enough? + return counterSA; } return spells.get(0); // return first choice if no logic found } diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 9df3c41e0c3..cd54eab13f7 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -1613,7 +1613,7 @@ public class Card extends GameEntity implements Comparable { || keyword.equals("Suspend") // for the ones without amounnt || keyword.equals("Hideaway") || keyword.equals("Ascend") || keyword.equals("Totem armor") || keyword.equals("Battle cry") - || keyword.equals("Devoid")){ + || keyword.equals("Devoid") || keyword.equals("Riot")){ sbLong.append(keyword + " (" + inst.getReminderText() + ")"); } else if (keyword.startsWith("Partner:")) { final String[] k = keyword.split(":"); diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 87fe006c8e0..b9197847f12 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -3487,6 +3487,23 @@ public class CardFactoryUtil { re.setOverridingAbility(saExile); inst.addReplacement(re); + } else if (keyword.startsWith("Riot")) { + final String choose = "DB$ GenericChoice | AILogic$ Riot | SpellDescription$ Riot"; + + final String counter = "DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | ETB$ True | CounterNum$ 1" + + " | SpellDescription$ Put a +1/+1 counter on it."; + final String haste = "DB$ Animate | Defined$ Self | Keywords$ Haste | Permanent$ True | SpellDescription$ Haste"; + + SpellAbility saChoose = AbilityFactory.getAbility(choose, card); + + List list = Lists.newArrayList(); + list.add((AbilitySub)AbilityFactory.getAbility(counter, card)); + list.add((AbilitySub)AbilityFactory.getAbility(haste, card)); + saChoose.setAdditionalAbilityList("Choices", list); + + ReplacementEffect cardre = createETBReplacement(card, ReplacementLayer.Other, saChoose, false, true, intrinsic, "Card.Self", ""); + + inst.addReplacement(cardre); } else if (keyword.startsWith("Saga")) { String sb = "etbCounter:LORE:1:no Condition:no desc"; final ReplacementEffect re = makeEtbCounter(sb, card, intrinsic); diff --git a/forge-game/src/main/java/forge/game/keyword/Keyword.java b/forge-game/src/main/java/forge/game/keyword/Keyword.java index dd04919164e..ead951daf98 100644 --- a/forge-game/src/main/java/forge/game/keyword/Keyword.java +++ b/forge-game/src/main/java/forge/game/keyword/Keyword.java @@ -124,6 +124,7 @@ public enum Keyword { RENOWN(KeywordWithAmount.class, true, "When this creature deals combat damage to a player, if it isn't renowned, put {%d:+1/+1 counter} on it and it becomes renowned."), REPLICATE(KeywordWithCost.class, false, "As an additional cost to cast this spell, you may pay %s any number of times. If you do, copy it that many times. You may choose new targets for the copies."), RETRACE(SimpleKeyword.class, true, "You may cast this card from your graveyard by discarding a land card in addition to paying its other costs."), + RIOT(SimpleKeyword.class, false, "This creature enters the battlefield with your choice of a +1/+1 counter or haste."), RIPPLE(KeywordWithAmount.class, false, "When you cast this spell, you may reveal the top {%d:card} of your library. You may cast any of those cards with the same name as this spell without paying their mana costs. Put the rest on the bottom of your library in any order."), SHADOW(SimpleKeyword.class, true, "This creature can block or be blocked by only creatures with shadow."), SHROUD(SimpleKeyword.class, true, "This can't be the target of spells or abilities."), diff --git a/forge-gui/res/cardsfolder/upcoming/frenzied_arynx.txt b/forge-gui/res/cardsfolder/upcoming/frenzied_arynx.txt new file mode 100644 index 00000000000..b9169b6b113 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/frenzied_arynx.txt @@ -0,0 +1,8 @@ +Name:Frenzied Arynx +ManaCost:2 R G +Types:Creature Cat Beast +PT:3/3 +K:Riot +K:Trample +A:AB$ Pump | Cost$ 4 R G | NumAtt$ +3 | SpellDescription$ CARDNAME gets +3/+0 until end of turn. +Oracle:Riot (This creature enters the battlefield with your choice of a +1/+1 counter or haste.)\nTrample\n{4}{R}{G}: Frenzied Arynx gets +3/+0 until end of turn. From 2a02fd124e05668a477b62ab56d34fda7214012c Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 22 Dec 2018 20:30:54 +0300 Subject: [PATCH 524/901] - Some work on the AI for new keywords. - NPE prevention in AI code. --- .../src/main/java/forge/ai/ComputerUtil.java | 6 ++ .../java/forge/ai/ComputerUtilCombat.java | 2 +- .../ai/ability/ChooseGenericEffectAi.java | 90 ++++++++++--------- 3 files changed, 55 insertions(+), 43 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index ebfd378dfce..96ec1f25169 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -20,6 +20,7 @@ package forge.ai; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.*; +import forge.ai.ability.ChooseGenericEffectAi; import forge.ai.ability.ProtectAi; import forge.ai.ability.TokenAi; import forge.card.CardType; @@ -986,6 +987,11 @@ public class ComputerUtil { return true; } + if (card.hasKeyword(Keyword.RIOT) && ChooseGenericEffectAi.preferHasteForRiot(sa, ai)) { + // Planning to choose Haste for Riot, so do this in Main 1 + return true; + } + // if we have non-persistent mana in our pool, would be good to try to use it and not waste it if (ai.getManaPool().willManaBeLostAtEndOfPhase()) { boolean canUseToPayCost = false; diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java index 481cab38688..e2393972f59 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java @@ -1455,7 +1455,7 @@ public class ComputerUtilCombat { continue; } - if (ability.hasParam("Adapt") && blocker.getCounters(CounterType.P1P1) > 0) { + if (ability.hasParam("Adapt") && blocker != null && blocker.getCounters(CounterType.P1P1) > 0) { continue; } diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java index da6ea137f92..39541df0f28 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java @@ -350,48 +350,54 @@ public class ChooseGenericEffectAi extends SpellAbilityAi { } } else if ("Riot".equals(logic)) { SpellAbility counterSA = spells.get(0), hasteSA = spells.get(1); - - final Card copy = CardUtil.getLKICopy(host); - copy.setLastKnownZone(player.getZone(ZoneType.Battlefield)); - - // check state it would have on the battlefield - CardCollection preList = new CardCollection(copy); - game.getAction().checkStaticAbilities(false, Sets.newHashSet(copy), preList); - // reset again? - game.getAction().checkStaticAbilities(false); - - // can't gain counters, use Haste - if (!copy.canReceiveCounters(CounterType.P1P1)) { - return hasteSA; - } - - // already has Haste, use counter - if (copy.hasKeyword(Keyword.HASTE)) { - return counterSA; - } - - // not AI turn - if (!game.getPhaseHandler().isPlayerTurn(player)) { - return counterSA; - } - - // not before Combat - if (!game.getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS)) { - return counterSA; - } - - // TODO check other opponents too if able - final Player opp = player.getWeakestOpponent(); - if (opp != null) { - // TODO add predict Combat Damage? - if (opp.getLife() < copy.getNetPower()) { - return hasteSA; - } - } - - // haste might not be good enough? - return counterSA; + return preferHasteForRiot(sa, player) ? hasteSA : counterSA; } return spells.get(0); // return first choice if no logic found } -} \ No newline at end of file + + public static boolean preferHasteForRiot(SpellAbility sa, Player player) { + // returning true means preferring Haste, returning false means preferring a +1/+1 counter + final Card host = sa.getHostCard(); + final Game game = host.getGame(); + final Card copy = CardUtil.getLKICopy(host); + copy.setLastKnownZone(player.getZone(ZoneType.Battlefield)); + + // check state it would have on the battlefield + CardCollection preList = new CardCollection(copy); + game.getAction().checkStaticAbilities(false, Sets.newHashSet(copy), preList); + // reset again? + game.getAction().checkStaticAbilities(false); + + // can't gain counters, use Haste + if (!copy.canReceiveCounters(CounterType.P1P1)) { + return true; + } + + // already has Haste, use counter + if (copy.hasKeyword(Keyword.HASTE)) { + return false; + } + + // not AI turn + if (!game.getPhaseHandler().isPlayerTurn(player)) { + return false; + } + + // not before Combat + if (!game.getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS)) { + return false; + } + + // TODO check other opponents too if able + final Player opp = player.getWeakestOpponent(); + if (opp != null) { + // TODO add predict Combat Damage? + if (opp.getLife() < copy.getNetPower()) { + return true; + } + } + + // haste might not be good enough? + return false; + } +} From 0123ba78198f2eff8739d049d936e6beba2ee264 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 22 Dec 2018 21:14:30 +0300 Subject: [PATCH 525/901] - CountersRemoveAi: try to target Adapt creatures when removing +1/+1 counters mandatorily. --- .../src/main/java/forge/ai/ability/CountersRemoveAi.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersRemoveAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersRemoveAi.java index 5c500ecd7f2..90a32c16ada 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersRemoveAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersRemoveAi.java @@ -308,6 +308,15 @@ public class CountersRemoveAi extends SpellAbilityAi { } } if (mandatory) { + if (type.equals("P1P1")) { + // Try to target creatures with Adapt + CardCollection adaptCreats = CardLists.filter(list, CardPredicates.hasKeyword(Keyword.ADAPT)); + if (!adaptCreats.isEmpty()) { + sa.getTargets().add(ComputerUtilCard.getWorstAI(adaptCreats)); + return true; + } + } + sa.getTargets().add(ComputerUtilCard.getWorstAI(list)); return true; } From 59e3995bae156bcd27af0bdb5f05c717491187ad Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 22 Dec 2018 20:08:06 +0100 Subject: [PATCH 526/901] more AI for Counter Remove --- .../main/java/forge/ai/ComputerUtilCost.java | 6 ++++-- .../java/forge/ai/ability/CountersMoveAi.java | 9 +++++---- .../java/forge/ai/ability/CountersRemoveAi.java | 17 ++++++++++++++++- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java index 32d12449bdd..fb44ff4e31c 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java @@ -11,6 +11,7 @@ import forge.game.card.*; import forge.game.card.CardPredicates.Presets; import forge.game.combat.Combat; import forge.game.cost.*; +import forge.game.keyword.Keyword; import forge.game.player.Player; import forge.game.spellability.Spell; import forge.game.spellability.SpellAbility; @@ -74,7 +75,7 @@ public class ComputerUtilCost { final CounterType type = remCounter.counter; if (!part.payCostFromSource()) { - if (type.name().equals("P1P1")) { + if (CounterType.P1P1.equals(type)) { return false; } continue; @@ -105,7 +106,8 @@ public class ComputerUtilCost { } //don't kill the creature - if (type.name().equals("P1P1") && source.getLethalDamage() <= 1) { + if (CounterType.P1P1.equals(type) && source.getLethalDamage() <= 1 + && !source.hasKeyword(Keyword.UNDYING)) { return false; } } diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java index cd82c59a5e5..72c917ebcf8 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java @@ -333,11 +333,12 @@ public class CountersMoveAi extends SpellAbilityAi { // try to remove P1P1 from undying or evolve if (CounterType.P1P1.equals(cType)) { - if (card.hasKeyword("Undying") || card.hasKeyword("Evolve")) { + if (card.hasKeyword(Keyword.UNDYING) || card.hasKeyword(Keyword.EVOLVE) + || card.hasKeyword(Keyword.ADAPT)) { return true; } } - if (CounterType.M1M1.equals(cType) && card.hasKeyword("Persist")) { + if (CounterType.M1M1.equals(cType) && card.hasKeyword(Keyword.PERSIST)) { return true; } @@ -392,10 +393,10 @@ public class CountersMoveAi extends SpellAbilityAi { } if (cType != null) { - if (CounterType.P1P1.equals(cType) && card.hasKeyword("Undying")) { + if (CounterType.P1P1.equals(cType) && card.hasKeyword(Keyword.UNDYING)) { return false; } - if (CounterType.M1M1.equals(cType) && card.hasKeyword("Persist")) { + if (CounterType.M1M1.equals(cType) && card.hasKeyword(Keyword.PERSIST)) { return false; } diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersRemoveAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersRemoveAi.java index 90a32c16ada..67b835ffc8a 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersRemoveAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersRemoveAi.java @@ -309,12 +309,27 @@ public class CountersRemoveAi extends SpellAbilityAi { } if (mandatory) { if (type.equals("P1P1")) { - // Try to target creatures with Adapt + // Try to target creatures with Adapt or similar CardCollection adaptCreats = CardLists.filter(list, CardPredicates.hasKeyword(Keyword.ADAPT)); if (!adaptCreats.isEmpty()) { sa.getTargets().add(ComputerUtilCard.getWorstAI(adaptCreats)); return true; } + + // Outlast nice target + CardCollection outlastCreats = CardLists.filter(list, CardPredicates.hasKeyword(Keyword.OUTLAST)); + if (!outlastCreats.isEmpty()) { + // outlast cards often benefit from having +1/+1 counters, try not to remove last one + CardCollection betterTargets = CardLists.filter(outlastCreats, CardPredicates.hasCounter(CounterType.P1P1, 2)); + + if (!betterTargets.isEmpty()) { + sa.getTargets().add(ComputerUtilCard.getWorstAI(betterTargets)); + return true; + } + + sa.getTargets().add(ComputerUtilCard.getWorstAI(outlastCreats)); + return true; + } } sa.getTargets().add(ComputerUtilCard.getWorstAI(list)); From de2c0aa0735180f839727ea320c1a0667a2101b2 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 22 Dec 2018 20:51:00 +0100 Subject: [PATCH 527/901] Graft: moved AIGraftPreference --- .../main/java/forge/ai/ability/CountersMoveAi.java | 2 +- .../main/java/forge/game/card/CardFactoryUtil.java | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java index 72c917ebcf8..34827a4a273 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java @@ -192,7 +192,7 @@ public class CountersMoveAi extends SpellAbilityAi { } // check for some specific AI preferences - if (src.hasStartOfKeyword("Graft") && "DontMoveCounterIfLethal".equals(src.getSVar("AIGraftPreference"))) { + if ("DontMoveCounterIfLethal".equals(sa.getParam("AILogic"))) { if (cType == CounterType.P1P1 && src.getNetToughness() - src.getTempToughnessBoost() - 1 <= 0) { return false; } diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index b9197847f12..65cebaa7191 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -2478,8 +2478,13 @@ public class CardFactoryUtil { inst.addTrigger(trigger); } else if (keyword.startsWith("Graft")) { - final String abStr = "DB$ MoveCounter | Source$ Self | " - + "Defined$ TriggeredCardLKICopy | CounterType$ P1P1 | CounterNum$ 1"; + final StringBuilder sb = new StringBuilder(); + sb.append("DB$ MoveCounter | Source$ Self | Defined$ TriggeredCardLKICopy"); + sb.append(" | CounterType$ P1P1 | CounterNum$ 1"); + + if (card.hasSVar("AIGraftPreference")) { + sb.append(" | AILogic$ ").append(card.getSVar("AIGraftPreference")); + } String trigStr = "Mode$ ChangesZone | ValidCard$ Creature.Other" + "| Origin$ Any | Destination$ Battlefield " @@ -2490,7 +2495,7 @@ public class CardFactoryUtil { + "may move a +1/+1 counter from this creature onto it."; final Trigger trigger = TriggerHandler.parseTrigger(trigStr, card, intrinsic); - trigger.setOverridingAbility(AbilityFactory.getAbility(abStr, card)); + trigger.setOverridingAbility(AbilityFactory.getAbility(sb.toString(), card)); inst.addTrigger(trigger); } else if (keyword.startsWith("Haunt")) { From 556d858a04db4deacbdd7cebb3dc510b9a25eb54 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 22 Dec 2018 23:59:15 +0100 Subject: [PATCH 528/901] cards: Gruul Spellbreaker and Tithe Taker --- forge-game/src/main/java/forge/game/ForgeScript.java | 10 +++++++++- .../res/cardsfolder/upcoming/gruul_spellbreaker.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/tithe_taker.txt | 7 +++++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/gruul_spellbreaker.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/tithe_taker.txt diff --git a/forge-game/src/main/java/forge/game/ForgeScript.java b/forge-game/src/main/java/forge/game/ForgeScript.java index 59870a830de..92f9e5311ce 100644 --- a/forge-game/src/main/java/forge/game/ForgeScript.java +++ b/forge-game/src/main/java/forge/game/ForgeScript.java @@ -152,7 +152,15 @@ public class ForgeScript { public static boolean spellAbilityHasProperty(SpellAbility sa, String property, Player sourceController, Card source, SpellAbility spellAbility) { - if (property.equals("Buyback")) { + if (property.equals("ManaAbility")) { + if (!sa.isManaAbility()) { + return false; + } + } else if (property.equals("nonManaAbility")) { + if (sa.isManaAbility()) { + return false; + } + } else if (property.equals("Buyback")) { if (!sa.isBuyBackAbility()) { return false; } diff --git a/forge-gui/res/cardsfolder/upcoming/gruul_spellbreaker.txt b/forge-gui/res/cardsfolder/upcoming/gruul_spellbreaker.txt new file mode 100644 index 00000000000..77eb6feaeeb --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/gruul_spellbreaker.txt @@ -0,0 +1,8 @@ +Name:Gruul Spellbreaker +ManaCost:1 R G +Types:Creature Ogre Warrior +PT:3/3 +K:Riot +K:Trample +S:Mode$ Continuous | Affected$ You,Self | AddKeyword$ Hexproof | Condition$ PlayerTurn | Description$ As long as it's your turn, you and CARDNAME have hexproof. +Oracle:Riot (This creature enters the battlefield with your choice of a +1/+1 counter or haste.)\nTrample\nAs long as it's your turn, you and Gruul Spellbreaker have hexproof. diff --git a/forge-gui/res/cardsfolder/upcoming/tithe_taker.txt b/forge-gui/res/cardsfolder/upcoming/tithe_taker.txt new file mode 100644 index 00000000000..5de300d42f5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tithe_taker.txt @@ -0,0 +1,7 @@ +Name:Tithe Taker +ManaCost:1 W +Types:Creature Human Soldier +PT:2/1 +K:Afterlife:1 +S:Mode$ RaiseCost | ValidCard$ Card | Activator$ Opponent | ValidSpell$ Spell,Activated.nonManaAbility | Amount$ 1 | Condition$ PlayerTurn | Description$ During your turn, spells your opponents cast cost {1} more to cast and abilities your opponents activate cost {1} more to activate unless they're mana abilities. +Oracle:During your turn, spells your opponents cast cost {1} more to cast and abilities your opponents activate cost {1} more to activate unless they're mana abilities.\nAfterlife 1 (When this creature dies, create a 1/1 white and black Spirit creature token with flying.) From 0b33ac6fd8563fd433f8bd1a38e3146a73b8a24c Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sun, 23 Dec 2018 00:31:27 +0100 Subject: [PATCH 529/901] cards: Sphinx's Insight --- forge-gui/res/cardsfolder/upcoming/sphinxs_insight.txt | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/sphinxs_insight.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sphinxs_insight.txt b/forge-gui/res/cardsfolder/upcoming/sphinxs_insight.txt new file mode 100644 index 00000000000..ecd8f6980d0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sphinxs_insight.txt @@ -0,0 +1,6 @@ +Name:Sphinx's Insight +ManaCost:2 W U +Types:Instant +A:SP$ Draw | Cost$ 2 W U | NumCards$ 2 | SubAbility$ DBLife | StackDescription$ SpellDescription | SpellDescription$ Draw two cards. +SVar:DBLife:DB$ GainLife | LifeAmount$ 2 | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SpellDescription$ Addendum - If you cast this spell during your main phase, you gain 2 life. +Oracle:Draw two cards.\nAddendum - If you cast this spell during your main phase, you gain 2 life. From 660887794bf73f0099d5ca07b6f1ed55b651495d Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 23 Dec 2018 09:35:34 +0300 Subject: [PATCH 530/901] - AI: Always prefer cheaper Spectacle costs (maybe a better way is possible?) - AI: Prefer cheaper alternative mana costs in general (e.g. Omniscience). --- .../src/main/java/forge/ai/AiController.java | 14 ++++++++++++ .../java/forge/ai/ComputerUtilAbility.java | 22 +++++++++++++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index d9b8f9fefab..29ab83127dc 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -948,6 +948,20 @@ public class AiController { return 1; } + if (a.getHostCard().equals(b.getHostCard()) && a.getApi() == b.getApi() + && a.getPayCosts() != null && b.getPayCosts() != null) { + // Cheaper Spectacle costs should be preferred + // FIXME: Any better way to identify that these are the same ability, one with Spectacle and one not? + // (looks like it's not a full-fledged alternative cost as such, and is not processed with other alt costs) + if (a.isSpectacle() && !b.isSpectacle() + && a.getPayCosts().getTotalMana().getCMC() < b.getPayCosts().getTotalMana().getCMC()) { + return 1; + } else if (b.isSpectacle() && !a.isSpectacle() + && b.getPayCosts().getTotalMana().getCMC() < a.getPayCosts().getTotalMana().getCMC()) { + return 1; + } + } + a1 += getSpellAbilityPriority(a); b1 += getSpellAbilityPriority(b); diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java index 366e53865a4..ba42c31cf9e 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java @@ -97,9 +97,27 @@ public class ComputerUtilAbility { final List newAbilities = Lists.newArrayList(); for (SpellAbility sa : originList) { sa.setActivatingPlayer(player); - //add alternative costs as additional spell abilities + + // determine which alternative costs are cheaper than the original and prioritize them + List saAltCosts = GameActionUtil.getAlternativeCosts(sa, player); + List priorityAltSa = Lists.newArrayList(); + List otherAltSa = Lists.newArrayList(); + for (SpellAbility altSa : saAltCosts) { + if (altSa.getPayCosts() == null || sa.getPayCosts() == null) { + otherAltSa.add(altSa); + } else if (sa.getPayCosts().isOnlyManaCost() + && altSa.getPayCosts().isOnlyManaCost() && sa.getPayCosts().getTotalMana().compareTo(altSa.getPayCosts().getTotalMana()) == 1) { + // the alternative cost is strictly cheaper, so why not? (e.g. Omniscience etc.) + priorityAltSa.add(altSa); + } else { + otherAltSa.add(altSa); + } + } + + // add alternative costs as additional spell abilities + newAbilities.addAll(priorityAltSa); newAbilities.add(sa); - newAbilities.addAll(GameActionUtil.getAlternativeCosts(sa, player)); + newAbilities.addAll(otherAltSa); } final List result = Lists.newArrayList(); From 6e2e86d782edf8d6f2121740a772ec7c5943123e Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sun, 23 Dec 2018 14:26:25 +0100 Subject: [PATCH 531/901] cards: add Zegana and Ascendancy --- .../res/cardsfolder/upcoming/simic_ascendancy.txt | 12 ++++++++++++ .../cardsfolder/upcoming/zegana_utopian_speaker.txt | 11 +++++++++++ 2 files changed, 23 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/simic_ascendancy.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/zegana_utopian_speaker.txt diff --git a/forge-gui/res/cardsfolder/upcoming/simic_ascendancy.txt b/forge-gui/res/cardsfolder/upcoming/simic_ascendancy.txt new file mode 100644 index 00000000000..087d3fcee62 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/simic_ascendancy.txt @@ -0,0 +1,12 @@ +Name:Simic Ascendancy +ManaCost:G U +Types:Enchantment +A:AB$ PutCounter | Cost$ 1 G U | CounterType$ P1P1 | CounterNum$ 1 | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | SpellDescription$ Put a +1/+1 counter on target creature you control. +T:Mode$ CounterAddedOnce | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | CounterType$ P1P1 | Execute$ TrigPutCounter | TriggerDescription$ Whenever one or more +1/+1 counters are put on a creature you control, put that many growth counters on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | CounterType$ GROWTH | CounterNum$ X | References$ X +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Card.Self+counters_GE20_GROWTH | Execute$ TrigWinGame | TriggerDescription$ At the beginning of your upkeep, if CARDNAME has twenty or more growth counters on it, you win the game. +SVar:TrigWinGame:DB$WinsGame | Defined$ You +SVar:X:TriggerCount$Amount +DeckHints:Ability$Counters +DeckHas:Ability$Counters +Oracle:{1}{G}{U}: Put a +1/+1 counter on target creature you control.\nWhenever one or more +1/+1 counters are put on a creature you control, put that many growth counters on Simic Ascendancy.\nAt the beginning of your upkeep, if Simic Ascendancy has twenty or more growth counters on it, you win the game. diff --git a/forge-gui/res/cardsfolder/upcoming/zegana_utopian_speaker.txt b/forge-gui/res/cardsfolder/upcoming/zegana_utopian_speaker.txt new file mode 100644 index 00000000000..d859b1721d3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/zegana_utopian_speaker.txt @@ -0,0 +1,11 @@ +Name:Zegana, Utopian Speaker +ManaCost:2 G U +Types:Legendary Creature Merfolk Wizard +PT:4/4 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | IsPresent$ Creature.Other+YouCtrl+counters_GE1_P1P1 | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, if you control another creature with a +1/+1 counter on it, draw a card. +SVar:TrigDraw:DB$ Draw | NumCards$ 1 +K:Adapt:4:4 G U +S:Mode$ Continuous | Affected$ Creature.YouCtrl+counters_GE1_P1P1 | AddKeyword$ Trample | Description$ Each creature you control with a +1/+1 counter on it has trample. +DeckHas:Ability$Counters +DeckHints:Ability$Counters +Oracle:When Zegana, Utopian Speaker enters the battlefield, if you control another creature with a +1/+1 counter on it, draw a card.\n{4}{G}{U}: Adapt 4. (If this creature has no +1/+1 counters on it, put four +1/+1 counters on it.)\nEach creature you control with a +1/+1 counter on it has trample. From 44e181981decbe4d7181b0b8066d97c7bcc8b274 Mon Sep 17 00:00:00 2001 From: Tim Scott Date: Mon, 24 Dec 2018 16:44:01 -0600 Subject: [PATCH 532/901] Update targeting overlay to draw target arrow for stack top when "On" (no initial mouse over required). Prevent identical target arrows from being added to the arc lists which was causing a minor graphics glitch. --- .../forge/screens/match/TargetingOverlay.java | 43 +++++++++++++++---- .../forge/screens/match/views/VStack.java | 37 +++++++++++++--- 2 files changed, 67 insertions(+), 13 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java b/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java index c726449d79b..ed75f7f21a9 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java @@ -79,6 +79,13 @@ public class TargetingOverlay { x2 = end.x; y2 = end.y; } + + @Override + public boolean equals(Object obj) + { + Arc arc = (Arc)obj; + return ((arc.x1 == x1) && (arc.x2 == x2) && (arc.y1 == y1) && (arc.y2 == y2)); + } } private final Set cardsVisualized = new HashSet(); @@ -331,13 +338,24 @@ public class TargetingOverlay { activeStackItem.addMouseListener(new MouseAdapter() { @Override public void mouseEntered(final MouseEvent e) { - assembleStackArrows(); - FView.SINGLETON_INSTANCE.getFrame().repaint(); + if (matchUI.getCDock().getArcState() == ArcState.MOUSEOVER) { + assembleStackArrows(); + FView.SINGLETON_INSTANCE.getFrame().repaint(); + } } @Override public void mouseExited(final MouseEvent e) { - assembleStackArrows(); - FView.SINGLETON_INSTANCE.getFrame().repaint(); + if (matchUI.getCDock().getArcState() == ArcState.MOUSEOVER) { + assembleStackArrows(); + FView.SINGLETON_INSTANCE.getFrame().repaint(); + } + } + @Override + public void mouseClicked(final MouseEvent e) { + if (matchUI.getCDock().getArcState() == ArcState.ON) { + assembleStackArrows(); + FView.SINGLETON_INSTANCE.getFrame().repaint(); + } } }); } @@ -384,18 +402,27 @@ public class TargetingOverlay { if (start == null || end == null) { return; } - + + Arc newArc = new Arc(end,start); + switch (connects) { case Friends: case FriendsStackTargeting: - arcsFriend.add(new Arc(end, start)); + if (!arcsFriend.contains(newArc)) { + arcsFriend.add(newArc); + } break; case FoesAttacking: - arcsFoeAtk.add(new Arc(end, start)); + if (!arcsFoeAtk.contains(newArc)) { + arcsFoeAtk.add(newArc); + } break; case FoesBlocking: case FoesStackTargeting: - arcsFoeDef.add(new Arc(end, start)); + if (!arcsFoeDef.contains(newArc)) { + arcsFoeDef.add(newArc); + } + break; } } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VStack.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VStack.java index 0f78f73589a..8a4dea07365 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VStack.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VStack.java @@ -47,6 +47,7 @@ import forge.gui.framework.DragTab; import forge.gui.framework.EDocID; import forge.gui.framework.IVDoc; import forge.screens.match.controllers.CStack; +import forge.screens.match.controllers.CDock.ArcState; import forge.toolbox.FMouseAdapter; import forge.toolbox.FScrollPanel; import forge.toolbox.FSkin; @@ -194,19 +195,45 @@ public class VStack implements IVDoc { setFont(FSkin.getFont()); setWrapStyleWord(true); setMinimumSize(new Dimension(CARD_WIDTH + 2 * PADDING, CARD_HEIGHT + 2 * PADDING)); + + // if the top of the stack is not assigned yet... + if (hoveredItem == null) + { + // set things up to draw an arc from it... + hoveredItem = StackInstanceTextArea.this; + controller.getMatchUI().setCard(item.getSourceCard()); + } addMouseListener(new MouseAdapter() { @Override public void mouseEntered(final MouseEvent e) { - hoveredItem = StackInstanceTextArea.this; - controller.getMatchUI().setCard(item.getSourceCard()); + if (controller.getMatchUI().getCDock().getArcState() == ArcState.MOUSEOVER) { + hoveredItem = StackInstanceTextArea.this; + controller.getMatchUI().setCard(item.getSourceCard()); + } } @Override public void mouseExited(final MouseEvent e) { - if (hoveredItem == StackInstanceTextArea.this) { - hoveredItem = null; - } + if (controller.getMatchUI().getCDock().getArcState() == ArcState.MOUSEOVER) { + if (hoveredItem == StackInstanceTextArea.this) { + hoveredItem = null; + } + } + } + + @Override + public void mouseClicked(final MouseEvent e) { + if (controller.getMatchUI().getCDock().getArcState() == ArcState.ON) { + if (hoveredItem == StackInstanceTextArea.this) { + hoveredItem = null; + } + else + { + hoveredItem = StackInstanceTextArea.this; + controller.getMatchUI().setCard(item.getSourceCard()); + } + } } }); From 5ff8298b62b26fb129c34a57a08824d5b22b3b80 Mon Sep 17 00:00:00 2001 From: Tim Scott Date: Tue, 25 Dec 2018 10:04:19 -0600 Subject: [PATCH 533/901] Fix issue with missing foe blocking arcs for a foe that is targeted by friendly enchantment and arcs are set to "ON" (vs MOUSEOVER). --- .../src/main/java/forge/screens/match/TargetingOverlay.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java b/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java index ed75f7f21a9..be3f8c4545b 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java @@ -470,8 +470,8 @@ public class TargetingOverlay { if (!attackingCard.equals(c) && !blockingCard.equals(c)) { continue; } addArc(endpoints.get(attackingCard.getId()), endpoints.get(blockingCard.getId()), ArcConnection.FoesBlocking); cardsVisualized.add(blockingCard); + cardsVisualized.add(attackingCard); } - cardsVisualized.add(attackingCard); } } } From dadf1b12d385b4c1a2044a5c48041c7af59c744c Mon Sep 17 00:00:00 2001 From: Tim Scott Date: Tue, 25 Dec 2018 10:55:00 -0600 Subject: [PATCH 534/901] Add README file. --- README.md | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 00000000000..26d7dad1cd0 --- /dev/null +++ b/README.md @@ -0,0 +1,69 @@ +# Forge + +Dev instructions here: [Getting Started](https://www.slightlymagic.net/wiki/Forge:How_to_Get_Started_Developing_Forge) (Somewhat outdated) + +Discord channel [here](https://discordapp.com/channels/267367946135928833/267742313390931968) + +# Requirements / Tools + +- Java IDE such as IntelliJ or Eclipse +- Git +- Maven +- Android dev kit (optional: for Android releases) +- Xamarin (optional: for iOS development) +- Gitlab account + +# Project Quick Setup + +- Log in to gitlab with your user account and fork the project. + +- Clone your forked project to your local machine + +- Go to the project location on your machine. Run Maven to download all dependencies and build a snapshot. Example for Windows & Linux: `mvn -U -B clean -P windows-linux install` + +# Eclipse + +## Project Setup + +- Follow the instructions for cloning from Gitlab. You'll need a Gitlab account setup and an SSH key defined. I'm on a + windows machine and use Putty with TortoiseGit. Run puttygen.exe to generate the key -- save the private key and export + the OpenSSH public key. If you just leave the dialog open, you can copy and paste the key from it to your Gitlab profile under + "SSH keys". + + Run pageant.exe and add the private key generated earlier. TortoiseGit will use this for accessing Gitlab. + +- Fork the Forge git repo to your Gitlab account. + +- Clone your forked repo to your local machine. + +- You need maven to load in dependencies and build. Install that. `mvn -U -B clean -P windows-linux install` from the root repo dir will create everything needed. + +- Make sure the Java SDK is installed -- not just the JRE. Java 8 or newer required. I'm personally running 11. + +- Install Eclipse for Java. Launch it. I'm using Eclipse 2018-12. + +- Create a workspace. Go to the workbench. Right-click inside of Package Explorer > Import... > General > Existing Projects into Workspace > Navigate to local forge repo > + Check "Search for nested projects" > Uncheck 'forge', check the rest > Finish. + +- Let Eclipse run through building the project. + +## Project Launch + +### Desktop + +- Right-click on forge-gui-desktop > Run As... > Java Application > "Main - forge.view" > Proceed + +### Mobile (Desktop dev) + +- Right-click on forge-gui-mobile-dev > Run As... > Java Application > "Main - forge.app" > Proceed + +# General Notes + +## Desktop + +The desktop GUI is based off of Java Swing. + +## Mobile + +The mobile GUI is based off of [libgdx](https://libgdx.badlogicgames.com/). As with many other libgdx projects, there is a mobile-dev version that runs on the desktop but is separate and distinct from the 'desktop GUI' mentioned above. + From 986c4a8d5cc894bea6d9e8105dd6dd514b2a9cee Mon Sep 17 00:00:00 2001 From: Hanmac Date: Mon, 24 Dec 2018 12:11:00 +0100 Subject: [PATCH 535/901] Fix Myth Unbound --- forge-game/src/main/java/forge/game/card/CardUtil.java | 1 + forge-gui/res/cardsfolder/m/myth_unbound.txt | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) 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 d63834e9ffe..d8f143470a6 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -219,6 +219,7 @@ public final class CardUtil { newCopy.setSetCode(in.getSetCode()); newCopy.setOwner(in.getOwner()); newCopy.setController(in.getController(), 0); + newCopy.setCommander(in.isCommander()); // needed to ensure that the LKI object has correct CMC info no matter what state the original card was in // (e.g. Scrap Trawler + transformed Harvest Hand) diff --git a/forge-gui/res/cardsfolder/m/myth_unbound.txt b/forge-gui/res/cardsfolder/m/myth_unbound.txt index c206ac6e92a..7b8021880a2 100644 --- a/forge-gui/res/cardsfolder/m/myth_unbound.txt +++ b/forge-gui/res/cardsfolder/m/myth_unbound.txt @@ -2,7 +2,7 @@ Name:Myth Unbound ManaCost:2 G Types:Enchantment S:Mode$ ReduceCost | ValidCard$ Card.IsCommander+YouOwn | Type$ Spell | Amount$ AffectedX | Description$ Your commander costs {1} less to cast for each time it's been cast from the command zone this game. -T:Mode$ ChangesZoneAll | ValidCard$ Card.IsCommander+YouOwn | Origin$ Any | Destination$ Command | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever your commander is put into the command zone from anywhere, draw a card. +T:Mode$ ChangesZone | ValidCard$ Card.IsCommander+YouOwn | Origin$ Any | Destination$ Command | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever your commander is put into the command zone from anywhere, draw a card. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 SVar:AffectedX:Count$CommanderCastFromCommandZone AI:RemoveDeck:Random From af38b9b0e4a7ecdad8d33f7b9cc43595e7017636 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Wed, 12 Dec 2018 10:02:04 +0000 Subject: [PATCH 536/901] Update Trigger ChangesZoneAll CardZoneTable: for Origin + Destination => CardCollection Tables GameAction: Refactor HumanPlay: use executePayment List if able --- .../main/java/forge/ai/ComputerUtilMana.java | 4 +- .../java/forge/ai/ability/MustBlockAi.java | 3 +- .../src/main/java/forge/game/GameAction.java | 70 +++++------ .../effects/ActivateAbilityEffect.java | 2 +- .../game/ability/effects/BalanceEffect.java | 7 +- .../ability/effects/ChangeZoneAllEffect.java | 14 +-- .../ability/effects/ChangeZoneEffect.java | 51 ++------ .../ability/effects/ControlGainEffect.java | 7 +- .../game/ability/effects/CounterEffect.java | 2 +- .../ability/effects/DestroyAllEffect.java | 27 ++--- .../game/ability/effects/DestroyEffect.java | 21 ++-- .../forge/game/ability/effects/DigEffect.java | 21 +++- .../game/ability/effects/DigUntilEffect.java | 32 +++-- .../game/ability/effects/DiscardEffect.java | 38 +++--- .../game/ability/effects/MillEffect.java | 26 ++-- .../ability/effects/SacrificeAllEffect.java | 4 +- .../game/ability/effects/SacrificeEffect.java | 17 +-- .../java/forge/game/card/CardZoneTable.java | 48 ++++++++ .../java/forge/game/cost/CostAdjustment.java | 21 ++-- .../java/forge/game/cost/CostDiscard.java | 2 +- .../forge/game/cost/CostPartWithList.java | 28 ++++- .../java/forge/game/cost/CostSacrifice.java | 3 +- .../java/forge/game/phase/PhaseHandler.java | 23 +++- .../main/java/forge/game/player/Player.java | 20 ++-- .../game/trigger/TriggerChangesZoneAll.java | 111 ++++++++---------- .../res/cardsfolder/s/sidisi_brood_tyrant.txt | 7 +- .../res/cardsfolder/t/the_gitrog_monster.txt | 5 +- .../res/cardsfolder/t/turntimber_sower.txt | 7 +- forge-gui/res/tokenscripts/b_2_2_zombie.txt | 6 + forge-gui/res/tokenscripts/g_0_1_plant.txt | 6 + .../src/main/java/forge/player/HumanPlay.java | 85 +++++--------- 31 files changed, 384 insertions(+), 334 deletions(-) create mode 100644 forge-game/src/main/java/forge/game/card/CardZoneTable.java create mode 100644 forge-gui/res/tokenscripts/b_2_2_zombie.txt create mode 100644 forge-gui/res/tokenscripts/g_0_1_plant.txt diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java index 7ad1d8a9a3e..a672d60af0f 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java @@ -1514,7 +1514,7 @@ public class ComputerUtilMana { final Card offering = sa.getSacrificedAsOffering(); offering.setUsedToPay(false); if (costIsPaid && !test) { - sa.getHostCard().getController().getGame().getAction().sacrifice(offering, sa); + sa.getHostCard().getGame().getAction().sacrifice(offering, sa, null); } sa.resetSacrificedAsOffering(); } @@ -1522,7 +1522,7 @@ public class ComputerUtilMana { final Card emerge = sa.getSacrificedAsEmerge(); emerge.setUsedToPay(false); if (costIsPaid && !test) { - sa.getHostCard().getController().getGame().getAction().sacrifice(emerge, sa); + sa.getHostCard().getGame().getAction().sacrifice(emerge, sa, null); } sa.resetSacrificedAsEmerge(); } 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 98021672d3f..e01d0b38943 100644 --- a/forge-ai/src/main/java/forge/ai/ability/MustBlockAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/MustBlockAi.java @@ -126,7 +126,8 @@ public class MustBlockAi extends SpellAbilityAi { return chance; } - private List determineGoodBlockers(final Card attacker,final Player ai,final Player defender, SpellAbility sa, final boolean onlyLethal, final boolean testTapped) { + private List determineGoodBlockers(final Card attacker, final Player ai, Player defender, SpellAbility sa, + final boolean onlyLethal, final boolean testTapped) { final Card source = sa.getHostCard(); final TargetRestrictions abTgt = sa.getTargetRestrictions(); diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 8c5b3454343..6a7fbd7e4e2 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -926,6 +926,8 @@ public class GameAction { checkStaticAbilities(false, affectedCards, CardCollection.EMPTY); boolean checkAgain = false; + CardZoneTable table = new CardZoneTable(); + for (final Player p : game.getPlayers()) { for (final ZoneType zt : ZoneType.values()) { if (zt == ZoneType.Battlefield) { @@ -973,8 +975,8 @@ public class GameAction { } } - checkAgain |= stateBasedAction_Saga(c); - checkAgain |= stateBasedAction704_attach(c); // Attachment + checkAgain |= stateBasedAction_Saga(c, table); + checkAgain |= stateBasedAction704_attach(c, table); // Attachment if (c.isCreature() && c.isAttachedToEntity()) { // Rule 704.5q - Creature attached to an object or player, becomes unattached c.unattachFromEntity(c.getEntityAttachedTo()); @@ -999,24 +1001,19 @@ public class GameAction { orderedNoRegCreats = true; } for (Card c : noRegCreats) { - sacrificeDestroy(c, null); + sacrificeDestroy(c, null, table); } } if (desCreats != null) { if (desCreats.size() > 1 && !orderedDesCreats) { - desCreats = CardLists.filter(desCreats, new Predicate() { - @Override - public boolean apply(Card card) { - return card.canBeDestroyed(); - } - }); + desCreats = CardLists.filter(desCreats, CardPredicates.Presets.CAN_BE_DESTROYED); if (!desCreats.isEmpty()) { desCreats = (CardCollection) GameActionUtil.orderCardsByTheirOwners(game, desCreats, ZoneType.Graveyard); } orderedDesCreats = true; } for (Card c : desCreats) { - destroy(c, null); + destroy(c, null, true, table); } } setHoldCheckingStaticAbilities(false); @@ -1026,20 +1023,21 @@ public class GameAction { } for (Player p : game.getPlayers()) { - if (handleLegendRule(p)) { + if (handleLegendRule(p, table)) { checkAgain = true; } - if (handlePlaneswalkerRule(p)) { + if (handlePlaneswalkerRule(p, table)) { checkAgain = true; } } // 704.5m World rule - checkAgain |= handleWorldRule(); + checkAgain |= handleWorldRule(table); if (game.getCombat() != null) { game.getCombat().removeAbsentCombatants(); } + table.triggerChangesZoneAll(game); if (!checkAgain) { break; // do not continue the loop } @@ -1072,7 +1070,7 @@ public class GameAction { } } - private boolean stateBasedAction_Saga(Card c) { + private boolean stateBasedAction_Saga(Card c, CardZoneTable table) { boolean checkAgain = false; if (!c.getType().hasSubtype("Saga")) { return false; @@ -1085,13 +1083,13 @@ public class GameAction { } if (!game.getStack().hasSimultaneousStackEntries() && !game.getStack().hasSourceOnStack(c, SpellAbilityPredicates.isChapter())) { - sacrifice(c, null); + sacrifice(c, null, table); checkAgain = true; } return checkAgain; } - private boolean stateBasedAction704_attach(Card c) { + private boolean stateBasedAction704_attach(Card c, CardZoneTable table) { boolean checkAgain = false; if (c.isAttachedToEntity()) { @@ -1113,7 +1111,7 @@ public class GameAction { // cleanup aura if (c.isAura() && c.isInPlay() && !c.isEnchanting()) { - moveToGraveyard(c, null, null); + sacrificeDestroy(c, null, table); checkAgain = true; } return checkAgain; @@ -1243,7 +1241,7 @@ public class GameAction { game.getStack().clearSimultaneousStack(); } - private boolean handlePlaneswalkerRule(Player p) { + private boolean handlePlaneswalkerRule(Player p, CardZoneTable table) { // get all Planeswalkers final List list = CardLists.filter(p.getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.PLANESWALKERS); boolean recheck = false; @@ -1252,7 +1250,7 @@ public class GameAction { for (Card c : list) { if (c.getCounters(CounterType.LOYALTY) <= 0) { - moveToGraveyard(c, null, null); + sacrificeDestroy(c, null, table); // Play the Destroy sound game.fireEvent(new GameEventCardDestroyed()); recheck = true; @@ -1286,7 +1284,7 @@ public class GameAction { return recheck; } - private boolean handleLegendRule(Player p) { + private boolean handleLegendRule(Player p, CardZoneTable table) { final List a = CardLists.getType(p.getCardsIn(ZoneType.Battlefield), "Legendary"); if (a.isEmpty() || game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noLegendRule)) { return false; @@ -1314,7 +1312,7 @@ public class GameAction { Card toKeep = p.getController().chooseSingleEntityForEffect(new CardCollection(cc), new AbilitySub(ApiType.InternalLegendaryRule, null, null, null), "You have multiple legendary permanents named \""+name+"\" in play.\n\nChoose the one to stay on battlefield (the rest will be moved to graveyard)"); for (Card c: cc) { if (c != toKeep) { - sacrificeDestroy(c, null); + sacrificeDestroy(c, null, table); } } game.fireEvent(new GameEventCardDestroyed()); @@ -1323,7 +1321,7 @@ public class GameAction { return recheck; } - private boolean handleWorldRule() { + private boolean handleWorldRule(CardZoneTable table) { final List worlds = CardLists.getType(game.getCardsIn(ZoneType.Battlefield), "World"); if (worlds.size() <= 1) { return false; @@ -1348,35 +1346,28 @@ public class GameAction { } for (Card c : worlds) { - sacrificeDestroy(c, null); + sacrificeDestroy(c, null, table); game.fireEvent(new GameEventCardDestroyed()); } return true; } + @Deprecated public final Card sacrifice(final Card c, final SpellAbility source) { + return sacrifice(c, source, null); + } + public final Card sacrifice(final Card c, final SpellAbility source, CardZoneTable table) { if (!c.canBeSacrificedBy(source)) { return null; } c.getController().addSacrificedThisTurn(c, source); - return sacrificeDestroy(c, source); + return sacrificeDestroy(c, source, table); } - public final boolean destroy(final Card c, final SpellAbility sa) { - if (!c.canBeDestroyed()) { - return false; - } - - return destroy(c, sa, true); - } - public final boolean destroyNoRegeneration(final Card c, final SpellAbility sa) { - return destroy(c, sa, false); - } - - public final boolean destroy(final Card c, final SpellAbility sa, final boolean regenerate) { + public final boolean destroy(final Card c, final SpellAbility sa, final boolean regenerate, CardZoneTable table) { Player activator = null; if (!c.canBeDestroyed()) { return false; @@ -1408,7 +1399,7 @@ public class GameAction { runParams.put("Causer", activator); game.getTriggerHandler().runTrigger(TriggerType.Destroyed, runParams, false); - final Card sacrificed = sacrificeDestroy(c, sa); + final Card sacrificed = sacrificeDestroy(c, sa, table); return sacrificed != null; } @@ -1416,12 +1407,15 @@ public class GameAction { * @return the sacrificed Card in its new location, or {@code null} if the * sacrifice wasn't successful. */ - public final Card sacrificeDestroy(final Card c, SpellAbility cause) { + protected final Card sacrificeDestroy(final Card c, SpellAbility cause, CardZoneTable table) { if (!c.isInPlay()) { return null; } final Card newCard = moveToGraveyard(c, cause, null); + if (table != null) { + table.put(ZoneType.Battlefield, newCard.getZone().getZoneType(), newCard); + } return newCard; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ActivateAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ActivateAbilityEffect.java index 3114cf48501..2811591354c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ActivateAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ActivateAbilityEffect.java @@ -51,7 +51,7 @@ public class ActivateAbilityEffect extends SpellAbilityEffect { continue; } SpellAbility manaAb = p.getController().chooseSingleSpellForEffect( - possibleAb, sa, "Choose a mana ability:", ImmutableMap.of()); + possibleAb, sa, "Choose a mana ability:", ImmutableMap.of()); p.getController().playChosenSpellAbility(manaAb); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/BalanceEffect.java b/forge-game/src/main/java/forge/game/ability/effects/BalanceEffect.java index 6e120a29453..27821b41b89 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/BalanceEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/BalanceEffect.java @@ -5,6 +5,7 @@ import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardLists; +import forge.game.card.CardZoneTable; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; @@ -41,6 +42,7 @@ public class BalanceEffect extends SpellAbilityEffect { min = Math.min(min, validCards.get(i).size()); } + CardZoneTable table = new CardZoneTable(); for(int i = 0; i < players.size(); i++) { Player p = players.get(i); int numToBalance = validCards.get(i).size() - min; @@ -50,15 +52,16 @@ public class BalanceEffect extends SpellAbilityEffect { if (zone.equals(ZoneType.Hand)) { for (Card card : p.getController().chooseCardsToDiscardFrom(p, sa, validCards.get(i), numToBalance, numToBalance)) { if ( null == card ) continue; - p.discard(card, sa); + p.discard(card, sa, table); } } else { // Battlefield // TODO: "can'e be sacrificed" for(Card card : p.getController().choosePermanentsToSacrifice(sa, numToBalance, numToBalance, validCards.get(i), valid)) { if ( null == card ) continue; - game.getAction().sacrifice(card, sa); + game.getAction().sacrifice(card, sa, table); } } } + table.triggerChangesZoneAll(game); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneAllEffect.java index 4ed23fa7392..dac590fefe5 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneAllEffect.java @@ -141,7 +141,7 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect { } // movedCards should have same timestamp long ts = game.getNextTimestamp(); - final Map triggerList = Maps.newEnumMap(ZoneType.class); + final CardZoneTable triggerList = new CardZoneTable(); for (final Card c : cards) { final Zone originZone = game.getZoneOf(c); @@ -209,21 +209,13 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect { } if (!movedCard.getZone().equals(originZone)) { - if (!triggerList.containsKey(originZone.getZoneType())) { - triggerList.put(originZone.getZoneType(), new CardCollection()); - } - triggerList.get(originZone.getZoneType()).add(movedCard); + triggerList.put(originZone.getZoneType(), movedCard.getZone().getZoneType(), movedCard); } } game.getTriggerHandler().resetActiveTriggers(false); - if (!triggerList.isEmpty()) { - final Map runParams = Maps.newHashMap(); - runParams.put("Cards", triggerList); - runParams.put("Destination", destination); - game.getTriggerHandler().runTrigger(TriggerType.ChangesZoneAll, runParams, false); - } + triggerList.triggerChangesZoneAll(game); // if Shuffle parameter exists, and any amount of cards were owned by // that player, then shuffle that library diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index 3100c48cb32..b0ef097496b 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -429,7 +429,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { final boolean optional = sa.hasParam("Optional"); final long ts = game.getNextTimestamp(); - final Map triggerList = Maps.newEnumMap(ZoneType.class); + final CardZoneTable triggerList = new CardZoneTable(); for (final Card tgtC : tgtCards) { if (tgt != null && tgtC.isInPlay() && !tgtC.canBeTargetedBy(sa)) { @@ -602,10 +602,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { } } if (!movedCard.getZone().equals(originZone)) { - if (!triggerList.containsKey(originZone.getZoneType())) { - triggerList.put(originZone.getZoneType(), new CardCollection()); - } - triggerList.get(originZone.getZoneType()).add(movedCard); + triggerList.put(originZone.getZoneType(), movedCard.getZone().getZoneType(), movedCard); if (remember != null) { hostCard.addRemembered(movedCard); @@ -619,12 +616,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { } } - if (!triggerList.isEmpty()) { - final Map runParams = Maps.newHashMap(); - runParams.put("Cards", triggerList); - runParams.put("Destination", destination); - game.getTriggerHandler().runTrigger(TriggerType.ChangesZoneAll, runParams, false); - } + triggerList.triggerChangesZoneAll(game); // for things like Gaea's Blessing if (destination.equals(ZoneType.Library) && sa.hasParam("Shuffle") && "True".equals(sa.getParam("Shuffle"))) { @@ -951,8 +943,8 @@ public class ChangeZoneEffect extends SpellAbilityEffect { CardCollection movedCards = new CardCollection(); long ts = game.getNextTimestamp(); - final Map triggerList = Maps.newEnumMap(ZoneType.class); - for (Card c : chosenCards) { + final CardZoneTable triggerList = new CardZoneTable(); + for (final Card c : chosenCards) { Card movedCard = null; final Zone originZone = game.getZoneOf(c); if (destination.equals(ZoneType.Library)) { @@ -1117,10 +1109,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { movedCards.add(movedCard); if (originZone != null) { - if (!triggerList.containsKey(originZone.getZoneType())) { - triggerList.put(originZone.getZoneType(), new CardCollection()); - } - triggerList.get(originZone.getZoneType()).add(movedCard); + triggerList.put(originZone.getZoneType(), movedCard.getZone().getZoneType(), movedCard); } if (champion) { @@ -1152,13 +1141,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { player.shuffle(sa); } - if (!triggerList.isEmpty()) { - final Map runParams = Maps.newHashMap(); - runParams.put("Cards", triggerList); - runParams.put("Destination", destination); - game.getTriggerHandler().runTrigger(TriggerType.ChangesZoneAll, runParams, false); - } - + triggerList.triggerChangesZoneAll(game); } private static boolean allowMultiSelect(Player decider, SpellAbility sa) { @@ -1231,24 +1214,4 @@ public class ChangeZoneEffect extends SpellAbilityEffect { } } } - - private static boolean checkCanIndirectlyAttachTo(final Card source, final Card target) { - final SpellAbility attachEff = source.getFirstAttachSpell(); - - if (attachEff == null) { - return false; - } - - final Game game = source.getGame(); - final TargetRestrictions tgt = attachEff.getTargetRestrictions(); - - Player attachEffCtrl = attachEff.getActivatingPlayer(); - if (attachEffCtrl == null && attachEff.getHostCard() != null) { - attachEffCtrl = attachEff.getHostCard().getController(); - } - - CardCollectionView list = game.getCardsIn(tgt.getZone()); - list = CardLists.getValidCards(list, tgt.getValidTgts(), attachEffCtrl, source, attachEff); - return list.contains(target); - } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java index 83ed95b96b8..d0d5836f06f 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java @@ -206,12 +206,7 @@ public class ControlGainEffect extends SpellAbilityEffect { final Ability ability = new Ability(hostCard, ManaCost.ZERO) { @Override public void resolve() { - - if (bNoRegen) { - game.getAction().destroyNoRegeneration(c, null); - } else { - game.getAction().destroy(c, null); - } + game.getAction().destroy(c, null, !bNoRegen, null); } }; final StringBuilder sb = new StringBuilder(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/CounterEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CounterEffect.java index 9970a9001e7..c72323f4776 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CounterEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CounterEffect.java @@ -119,7 +119,7 @@ public class CounterEffect extends SpellAbilityEffect { // Destroy Permanent may be able to be turned into a SubAbility if (tgtSA.isAbility() && sa.hasParam("DestroyPermanent")) { - game.getAction().destroy(tgtSACard, sa); + game.getAction().destroy(tgtSACard, sa, true, null); } if (sa.hasParam("RememberCountered")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/DestroyAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DestroyAllEffect.java index b1153d558fb..258654c4f77 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DestroyAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DestroyAllEffect.java @@ -1,6 +1,5 @@ package forge.game.ability.effects; -import com.google.common.base.Predicate; import forge.game.Game; import forge.game.GameActionUtil; import forge.game.ability.AbilityUtils; @@ -8,7 +7,9 @@ import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; import forge.game.card.CardCollectionView; import forge.game.card.CardLists; +import forge.game.card.CardPredicates; import forge.game.card.CardUtil; +import forge.game.card.CardZoneTable; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; @@ -78,30 +79,20 @@ public class DestroyAllEffect extends SpellAbilityEffect { } // exclude cards that can't be destroyed at this moment - list = CardLists.filter(list, new Predicate() { - @Override - public boolean apply(Card card) { - return card.canBeDestroyed(); - } - }); + list = CardLists.filter(list, CardPredicates.Presets.CAN_BE_DESTROYED); if (list.size() > 1) { list = GameActionUtil.orderCardsByTheirOwners(game, list, ZoneType.Graveyard); } - if (noRegen) { - for (Card c : list) { - if (game.getAction().destroyNoRegeneration(c, sa) && remDestroyed) { - card.addRemembered(CardUtil.getLKICopy(c)); - } - } - } else { - for (Card c : list) { - if (game.getAction().destroy(c, sa) && remDestroyed) { - card.addRemembered(CardUtil.getLKICopy(c)); - } + CardZoneTable table = new CardZoneTable(); + + for (Card c : list) { + if (game.getAction().destroy(c, sa, !noRegen, table) && remDestroyed) { + card.addRemembered(CardUtil.getLKICopy(c)); } } + table.triggerChangesZoneAll(game); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java index e6ac2829e45..b8d71057e54 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java @@ -6,8 +6,8 @@ import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardUtil; +import forge.game.card.CardZoneTable; import forge.game.spellability.SpellAbility; -import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; import java.util.Iterator; @@ -77,8 +77,6 @@ public class DestroyEffect extends SpellAbilityEffect { CardCollection tgtCards = getTargetCards(sa); CardCollection untargetedCards = new CardCollection(); - final TargetRestrictions tgt = sa.getTargetRestrictions(); - if (sa.hasParam("Radiance")) { for (final Card c : CardUtil.getRadiance(card, tgtCards.get(0), sa.getParam("ValidTgts").split(","))) { @@ -90,19 +88,18 @@ public class DestroyEffect extends SpellAbilityEffect { tgtCards = (CardCollection) GameActionUtil.orderCardsByTheirOwners(game, tgtCards, ZoneType.Graveyard); } + CardZoneTable table = new CardZoneTable(); for (final Card tgtC : tgtCards) { - if (tgtC.isInPlay() && ((tgt == null) || tgtC.canBeTargetedBy(sa))) { + if (tgtC.isInPlay() && (!sa.usesTargeting() || tgtC.canBeTargetedBy(sa))) { boolean destroyed = false; final Card lki = CardUtil.getLKICopy(tgtC); if (remAttached) { card.addRemembered(tgtC.getAttachedCards()); } if (sac) { - destroyed = game.getAction().sacrifice(tgtC, sa) != null; - } else if (noRegen) { - destroyed = game.getAction().destroyNoRegeneration(tgtC, sa); + destroyed = game.getAction().sacrifice(tgtC, sa, table) != null; } else { - destroyed = game.getAction().destroy(tgtC, sa); + destroyed = game.getAction().destroy(tgtC, sa, !noRegen, table); } if (destroyed && remDestroyed) { card.addRemembered(tgtC); @@ -121,16 +118,16 @@ public class DestroyEffect extends SpellAbilityEffect { if (unTgtC.isInPlay()) { boolean destroyed = false; if (sac) { - destroyed = game.getAction().sacrifice(unTgtC, sa) != null; - } else if (noRegen) { - destroyed = game.getAction().destroyNoRegeneration(unTgtC, sa); + destroyed = game.getAction().sacrifice(unTgtC, sa, table) != null; } else { - destroyed = game.getAction().destroy(unTgtC, sa); + destroyed = game.getAction().destroy(unTgtC, sa, !noRegen, table); } if (destroyed && remDestroyed) { card.addRemembered(unTgtC); } } } + + table.triggerChangesZoneAll(game); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java index efa91cea1d2..9d3fd658b19 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java @@ -9,6 +9,7 @@ import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; import forge.game.card.CardLists; +import forge.game.card.CardZoneTable; import forge.game.card.CounterType; import forge.game.player.DelayedReveal; import forge.game.player.Player; @@ -109,6 +110,7 @@ public class DigEffect extends SpellAbilityEffect { } } + CardZoneTable table = new CardZoneTable(); for (final Player p : tgtPlayers) { if (tgt != null && !p.canBeTargetedBy(sa)) { continue; @@ -301,6 +303,7 @@ public class DigEffect extends SpellAbilityEffect { effectHost = sa.getHostCard(); } for (Card c : movedCards) { + final ZoneType origin = c.getZone().getZoneType(); final PlayerZone zone = c.getOwner().getZone(destZone1); if (zone.is(ZoneType.Library) || zone.is(ZoneType.PlanarDeck) || zone.is(ZoneType.SchemeDeck)) { @@ -322,6 +325,9 @@ public class DigEffect extends SpellAbilityEffect { c.setExiledWith(effectHost); } } + if (!origin.equals(c.getZone().getZoneType())) { + table.put(origin, c.getZone().getZoneType(), c); + } if (sa.hasParam("ExileFaceDown")) { c.setState(CardStateName.FaceDown, true); @@ -357,11 +363,16 @@ public class DigEffect extends SpellAbilityEffect { Collections.reverse(afterOrder); } for (final Card c : afterOrder) { + final ZoneType origin = c.getZone().getZoneType(); + Card m; if (destZone2 == ZoneType.Library) { - game.getAction().moveToLibrary(c, libraryPosition2, sa); + m = game.getAction().moveToLibrary(c, libraryPosition2, sa); } else { - game.getAction().moveToVariantDeck(c, destZone2, libraryPosition2, sa); + m = game.getAction().moveToVariantDeck(c, destZone2, libraryPosition2, sa); + } + if (m != null && !origin.equals(m.getZone().getZoneType())) { + table.put(origin, m.getZone().getZoneType(), m); } } } @@ -369,8 +380,12 @@ public class DigEffect extends SpellAbilityEffect { // just move them randomly for (int i = 0; i < rest.size(); i++) { Card c = rest.get(i); + final ZoneType origin = c.getZone().getZoneType(); final PlayerZone toZone = c.getOwner().getZone(destZone2); c = game.getAction().moveTo(toZone, c, sa); + if (!origin.equals(c.getZone().getZoneType())) { + table.put(origin, c.getZone().getZoneType(), c); + } if (destZone2 == ZoneType.Battlefield && !keywords.isEmpty()) { for (final String kw : keywords) { c.addExtrinsicKeyword(kw); @@ -386,6 +401,8 @@ public class DigEffect extends SpellAbilityEffect { } } } + //table trigger there + table.triggerChangesZoneAll(game); } // TODO This should be somewhere else, maybe like CardUtil or something like that diff --git a/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java index 46935002a90..57d5303a45e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java @@ -5,9 +5,9 @@ import forge.game.ability.AbilityUtils; import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; import forge.game.card.CardCollection; +import forge.game.card.CardZoneTable; import forge.game.player.Player; import forge.game.spellability.SpellAbility; -import forge.game.spellability.TargetRestrictions; import forge.game.zone.PlayerZone; import forge.game.zone.ZoneType; import forge.util.MyRandom; @@ -76,6 +76,7 @@ public class DigUntilEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { final Card host = sa.getHostCard(); + final Game game = host.getGame(); String[] type = new String[]{"Card"}; if (sa.hasParam("Valid")) { @@ -94,8 +95,6 @@ public class DigUntilEffect extends SpellAbilityEffect { final boolean remember = sa.hasParam("RememberFound"); - final TargetRestrictions tgt = sa.getTargetRestrictions(); - final ZoneType foundDest = ZoneType.smartValueOf(sa.getParam("FoundDestination")); final int foundLibPos = AbilityUtils.calculateAmount(host, sa.getParam("FoundLibraryPosition"), sa); final ZoneType revealedDest = ZoneType.smartValueOf(sa.getParam("RevealedDestination")); @@ -107,11 +106,13 @@ public class DigUntilEffect extends SpellAbilityEffect { final boolean optional = sa.hasParam("Optional"); final boolean optionalFound = sa.hasParam("OptionalFoundMove"); + CardZoneTable table = new CardZoneTable(); + for (final Player p : getTargetPlayers(sa)) { if (p == null) { continue; } - if ((tgt == null) || p.canBeTargetedBy(sa)) { + if (!sa.usesTargeting() || p.canBeTargetedBy(sa)) { if (optional && !p.getController().confirmAction(sa, null, "Do you want to dig your library?")) { continue; } @@ -142,7 +143,6 @@ public class DigUntilEffect extends SpellAbilityEffect { } } - final Game game = p.getGame(); if (revealed.size() > 0) { game.getAction().reveal(revealed, p, false); } @@ -157,19 +157,24 @@ public class DigUntilEffect extends SpellAbilityEffect { final Iterator itr = found.iterator(); while (itr.hasNext()) { final Card c = itr.next(); + final ZoneType origin = c.getZone().getZoneType(); if (optionalFound && !p.getController().confirmAction(sa, null, "Do you want to put that card to " + foundDest.name() + "?")) { continue; } else { + Card m = null; if (sa.hasParam("GainControl") && foundDest.equals(ZoneType.Battlefield)) { c.setController(sa.getActivatingPlayer(), game.getNextTimestamp()); - game.getAction().moveTo(c.getController().getZone(foundDest), c, sa); + m = game.getAction().moveTo(c.getController().getZone(foundDest), c, sa); } else if (sa.hasParam("NoMoveFound") && foundDest.equals(ZoneType.Library)) { //Don't do anything } else { - game.getAction().moveTo(foundDest, c, foundLibPos, sa); + m = game.getAction().moveTo(foundDest, c, foundLibPos, sa); } revealed.remove(c); + if (m != null && !origin.equals(m.getZone().getZoneType())) { + table.put(origin, m.getZone().getZoneType(), m); + } } } } @@ -201,7 +206,11 @@ public class DigUntilEffect extends SpellAbilityEffect { final Iterator itr = revealed.iterator(); while (itr.hasNext()) { final Card c = itr.next(); - game.getAction().moveTo(noneFoundDest, c, noneFoundLibPos, sa); + final ZoneType origin = c.getZone().getZoneType(); + final Card m = game.getAction().moveTo(noneFoundDest, c, noneFoundLibPos, sa); + if (m != null && !origin.equals(m.getZone().getZoneType())) { + table.put(origin, m.getZone().getZoneType(), m); + } } } else { // Allow ordering the rest of the revealed cards @@ -216,7 +225,11 @@ public class DigUntilEffect extends SpellAbilityEffect { final Iterator itr = revealed.iterator(); while (itr.hasNext()) { final Card c = itr.next(); - game.getAction().moveTo(revealedDest, c, revealedLibPos, sa); + final ZoneType origin = c.getZone().getZoneType(); + final Card m = game.getAction().moveTo(revealedDest, c, revealedLibPos, sa); + if (m != null && !origin.equals(m.getZone().getZoneType())) { + table.put(origin, m.getZone().getZoneType(), m); + } } } @@ -225,6 +238,7 @@ public class DigUntilEffect extends SpellAbilityEffect { } } // end foreach player } + table.triggerChangesZoneAll(game); } // end resolve } diff --git a/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java index b2ebcb304bc..69faad97074 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java @@ -1,7 +1,5 @@ package forge.game.ability.effects; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; import forge.game.GameActionUtil; import forge.game.ability.AbilityUtils; import forge.game.ability.SpellAbilityEffect; @@ -10,12 +8,17 @@ import forge.game.card.CardPredicates.Presets; import forge.game.player.Player; import forge.game.player.PlayerActionConfirmMode; import forge.game.spellability.SpellAbility; -import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; + +import forge.util.Lang; import forge.util.Aggregates; import forge.util.TextUtil; + import org.apache.commons.lang3.StringUtils; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; + import java.util.ArrayList; import java.util.List; @@ -29,10 +32,7 @@ public class DiscardEffect extends SpellAbilityEffect { final List tgtPlayers = getTargetPlayers(sa); if (!tgtPlayers.isEmpty()) { - - for (final Player p : tgtPlayers) { - sb.append(p.toString()).append(" "); - } + sb.append(Lang.joinHomogenous(tgtPlayers)).append(" "); if (mode.equals("RevealYouChoose")) { sb.append("reveals their hand.").append(" You choose ("); @@ -105,8 +105,6 @@ public class DiscardEffect extends SpellAbilityEffect { final String mode = sa.getParam("Mode"); //final boolean anyNumber = sa.hasParam("AnyNumber"); - final TargetRestrictions tgt = sa.getTargetRestrictions(); - final List discarded = new ArrayList(); final List targets = getTargetPlayers(sa), discarders; @@ -115,7 +113,7 @@ public class DiscardEffect extends SpellAbilityEffect { // In this case the target need not be the discarding player discarders = getDefinedPlayersOrTargeted(sa); firstTarget = Iterables.getFirst(targets, null); - if (tgt != null && !firstTarget.canBeTargetedBy(sa)) { + if (sa.usesTargeting() && !firstTarget.canBeTargetedBy(sa)) { firstTarget = null; } } else { @@ -123,8 +121,9 @@ public class DiscardEffect extends SpellAbilityEffect { } + final CardZoneTable table = new CardZoneTable(); for (final Player p : discarders) { - if ((mode.equals("RevealTgtChoose") && firstTarget != null) || tgt == null || p.canBeTargetedBy(sa)) { + if ((mode.equals("RevealTgtChoose") && firstTarget != null) || !sa.usesTargeting() || p.canBeTargetedBy(sa)) { if (sa.hasParam("RememberDiscarder")) { source.addRemembered(p); } @@ -140,7 +139,7 @@ public class DiscardEffect extends SpellAbilityEffect { } for (final Card c : toDiscard) { - boolean hasDiscarded = p.discard(c, sa) != null; + boolean hasDiscarded = p.discard(c, sa, table) != null; if (hasDiscarded) { discarded.add(c); } @@ -164,7 +163,7 @@ public class DiscardEffect extends SpellAbilityEffect { } for(Card c : toDiscard) { // without copying will get concurrent modification exception - boolean hasDiscarded = p.discard(c, sa) != null; + boolean hasDiscarded = p.discard(c, sa, table) != null; if( hasDiscarded && shouldRemember ) source.addRemembered(c); } @@ -178,7 +177,7 @@ public class DiscardEffect extends SpellAbilityEffect { } for (final Card c : dPHand) { - p.discard(c, sa); + p.discard(c, sa, table); discarded.add(c); } } @@ -216,7 +215,7 @@ public class DiscardEffect extends SpellAbilityEffect { } for (Card c : toDiscardView) { - if (p.discard(c, sa) != null) { + if (p.discard(c, sa, table) != null) { discarded.add(c); } } @@ -233,7 +232,7 @@ public class DiscardEffect extends SpellAbilityEffect { } for (Card c : toDiscard) { - c.getController().discard(c, sa); + c.getController().discard(c, sa, table); } } } @@ -260,7 +259,7 @@ public class DiscardEffect extends SpellAbilityEffect { // Reveal cards that will be discarded? for (final Card c : dPChHand) { - p.discard(c, sa); + p.discard(c, sa, table); discarded.add(c); } } else if (mode.equals("RevealYouChoose") || mode.equals("RevealTgtChoose") || mode.equals("TgtChoose")) { @@ -304,7 +303,7 @@ public class DiscardEffect extends SpellAbilityEffect { } for (Card card : toBeDiscarded) { if (card == null) { continue; } - p.discard(card, sa); + p.discard(card, sa, table); discarded.add(card); } } @@ -317,5 +316,8 @@ public class DiscardEffect extends SpellAbilityEffect { source.addRemembered(c); } } + + // run trigger if something got milled + table.triggerChangesZoneAll(source.getGame()); } // discardResolve() } diff --git a/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java index 68676c4fe77..51de7cf354b 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java @@ -1,23 +1,25 @@ package forge.game.ability.effects; import forge.card.CardStateName; +import forge.game.Game; import forge.game.GameLogEntryType; import forge.game.ability.AbilityUtils; import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; import forge.game.card.CardCollectionView; +import forge.game.card.CardZoneTable; import forge.game.player.Player; import forge.game.spellability.SpellAbility; -import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; -import forge.util.TextUtil; -import java.util.List; +import forge.util.Lang; +import forge.util.TextUtil; public class MillEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { final Card source = sa.getHostCard(); + final Game game = source.getGame(); final int numCards = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("NumCards"), sa); final boolean bottom = sa.hasParam("FromBottom"); final boolean facedown = sa.hasParam("ExileFaceDown"); @@ -28,27 +30,27 @@ public class MillEffect extends SpellAbilityEffect { source.clearRemembered(); } - final TargetRestrictions tgt = sa.getTargetRestrictions(); - ZoneType destination = ZoneType.smartValueOf(sa.getParam("Destination")); if (destination == null) { destination = ZoneType.Graveyard; } + final CardZoneTable table = new CardZoneTable(); + for (final Player p : getTargetPlayers(sa)) { - if ((tgt == null) || p.canBeTargetedBy(sa)) { + if (!sa.usesTargeting() || p.canBeTargetedBy(sa)) { if (sa.hasParam("Optional")) { final String prompt = TextUtil.concatWithSpace("Do you want to put card(s) from library to", TextUtil.addSuffix(destination.toString(),"?")); if (!p.getController().confirmAction(sa, null, prompt)) { continue; } } - final CardCollectionView milled = p.mill(numCards, destination, bottom); + final CardCollectionView milled = p.mill(numCards, destination, bottom, sa, table); // Reveal the milled cards, so players don't have to manually inspect the // graveyard to figure out which ones were milled. if (!facedown && reveal) { // do not reveal when exiling face down if (showRevealDialog) { - p.getGame().getAction().reveal(milled, p, false); + game.getAction().reveal(milled, p, false); } StringBuilder sb = new StringBuilder(); sb.append(p).append(" milled ").append(milled).append(" to ").append(destination); @@ -78,6 +80,9 @@ public class MillEffect extends SpellAbilityEffect { } } } + + // run trigger if something got milled + table.triggerChangesZoneAll(game); } @Override @@ -85,10 +90,7 @@ public class MillEffect extends SpellAbilityEffect { final StringBuilder sb = new StringBuilder(); final int numCards = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("NumCards"), sa); - final List tgtPlayers = getTargetPlayers(sa); - for (final Player p : tgtPlayers) { - sb.append(p.toString()).append(" "); - } + sb.append(Lang.joinHomogenous(getTargetPlayers(sa))).append(" "); final ZoneType dest = ZoneType.smartValueOf(sa.getParam("Destination")); if ((dest == null) || dest.equals(ZoneType.Graveyard)) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/SacrificeAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/SacrificeAllEffect.java index 98b07da16d6..7dd12a4bfbc 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/SacrificeAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/SacrificeAllEffect.java @@ -63,12 +63,14 @@ public class SacrificeAllEffect extends SpellAbilityEffect { list = GameActionUtil.orderCardsByTheirOwners(game, list, ZoneType.Graveyard); } + CardZoneTable table = new CardZoneTable(); for (Card sac : list) { final Card lKICopy = CardUtil.getLKICopy(sac); - if (game.getAction().sacrifice(sac, sa) != null && remSacrificed) { + if (game.getAction().sacrifice(sac, sa, table) != null && remSacrificed) { card.addRemembered(lKICopy); } } + table.triggerChangesZoneAll(game); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java index 7b371dc58c4..d45e8617977 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java @@ -91,14 +91,15 @@ public class SacrificeEffect extends SpellAbilityEffect { final boolean remSacrificed = sa.hasParam("RememberSacrificed"); final String remSVar = sa.getParam("RememberSacrificedSVar"); int countSacrificed = 0; + CardZoneTable table = new CardZoneTable(); if (valid.equals("Self") && game.getZoneOf(card) != null) { if (game.getZoneOf(card).is(ZoneType.Battlefield)) { - if (game.getAction().sacrifice(card, sa) != null) { - countSacrificed++; - if (remSacrificed) { - card.addRemembered(card); - } + if (game.getAction().sacrifice(card, sa, table) != null) { + countSacrificed++; + if (remSacrificed) { + card.addRemembered(card); + } } } } @@ -135,8 +136,8 @@ public class SacrificeEffect extends SpellAbilityEffect { for (Card sac : choosenToSacrifice) { final Card lKICopy = CardUtil.getLKICopy(sac); - boolean wasSacrificed = !destroy && game.getAction().sacrifice(sac, sa) != null; - boolean wasDestroyed = destroy && game.getAction().destroy(sac, sa); + boolean wasSacrificed = !destroy && game.getAction().sacrifice(sac, sa, table) != null; + boolean wasDestroyed = destroy && game.getAction().destroy(sac, sa, true, table); // Run Devour Trigger if (devour) { card.addDevoured(lKICopy); @@ -168,6 +169,8 @@ public class SacrificeEffect extends SpellAbilityEffect { } while (root != null); } } + + table.triggerChangesZoneAll(game); } @Override diff --git a/forge-game/src/main/java/forge/game/card/CardZoneTable.java b/forge-game/src/main/java/forge/game/card/CardZoneTable.java new file mode 100644 index 00000000000..fbec5fa601e --- /dev/null +++ b/forge-game/src/main/java/forge/game/card/CardZoneTable.java @@ -0,0 +1,48 @@ +/** + * + */ +package forge.game.card; + +import java.util.Map; + +import com.google.common.collect.ForwardingTable; +import com.google.common.collect.HashBasedTable; +import com.google.common.collect.Maps; +import com.google.common.collect.Table; + +import forge.game.Game; +import forge.game.trigger.TriggerType; +import forge.game.zone.ZoneType; + +public class CardZoneTable extends ForwardingTable { + // TODO use EnumBasedTable if exist + private Table dataMap = HashBasedTable.create(); + + /** + * special put logic, add Card to Card Collection + */ + public CardCollection put(ZoneType rowKey, ZoneType columnKey, Card value) { + CardCollection old; + if (contains(rowKey, columnKey)) { + old = get(rowKey, columnKey); + old.add(value); + } else { + old = new CardCollection(value); + dataMap.put(rowKey, columnKey, old); + } + return old; + } + + @Override + protected Table delegate() { + return dataMap; + } + + public void triggerChangesZoneAll(final Game game) { + if (!isEmpty()) { + final Map runParams = Maps.newHashMap(); + runParams.put("Cards", this); + game.getTriggerHandler().runTrigger(TriggerType.ChangesZoneAll, runParams, false); + } + } +} diff --git a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java index a76e47054e7..763af4cf279 100644 --- a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java +++ b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java @@ -1,7 +1,5 @@ package forge.game.cost; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; import forge.card.CardStateName; import forge.card.mana.ManaAtom; import forge.card.mana.ManaCost; @@ -19,14 +17,15 @@ import forge.game.spellability.Spell; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetChoices; import forge.game.staticability.StaticAbility; -import forge.game.trigger.TriggerType; import forge.game.zone.ZoneType; -import org.apache.commons.lang3.StringUtils; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import com.google.common.collect.Lists; +import org.apache.commons.lang3.StringUtils; + public class CostAdjustment { public static Cost adjust(final Cost cost, final SpellAbility sa) { @@ -214,7 +213,7 @@ public class CostAdjustment { if (sa.getHostCard().hasKeyword(Keyword.DELVE)) { sa.getHostCard().clearDelved(); - final CardCollection delved = new CardCollection(); + final CardZoneTable table = new CardZoneTable(); final Player pc = sa.getActivatingPlayer(); final CardCollection mutableGrave = new CardCollection(pc.getCardsIn(ZoneType.Graveyard)); final CardCollectionView toExile = pc.getController().chooseCardsToDelve(cost.getUnpaidShards(ManaCostShard.GENERIC), mutableGrave); @@ -224,17 +223,11 @@ public class CostAdjustment { cardsToDelveOut.add(c); } else if (!test) { sa.getHostCard().addDelved(c); - delved.add(game.getAction().exile(c, null, null)); + final Card d = game.getAction().exile(c, null, null); + table.put(ZoneType.Graveyard, d.getZone().getZoneType(), d); } } - if (!delved.isEmpty()) { - final Map triggerList = Maps.newEnumMap(ZoneType.class); - triggerList.put(ZoneType.Graveyard, delved); - final Map runParams = Maps.newHashMap(); - runParams.put("Cards", triggerList); - runParams.put("Destination", ZoneType.Exile); - game.getTriggerHandler().runTrigger(TriggerType.ChangesZoneAll, runParams, false); - } + table.triggerChangesZoneAll(game); } if (sa.getHostCard().hasKeyword(Keyword.CONVOKE)) { adjustCostByConvokeOrImprovise(cost, sa, false, test); diff --git a/forge-game/src/main/java/forge/game/cost/CostDiscard.java b/forge-game/src/main/java/forge/game/cost/CostDiscard.java index 5bf55a720ab..d12fd106041 100644 --- a/forge-game/src/main/java/forge/game/cost/CostDiscard.java +++ b/forge-game/src/main/java/forge/game/cost/CostDiscard.java @@ -164,7 +164,7 @@ public class CostDiscard extends CostPartWithList { */ @Override protected Card doPayment(SpellAbility ability, Card targetCard) { - return targetCard.getController().discard(targetCard, ability); + return targetCard.getController().discard(targetCard, ability, null); } /* (non-Javadoc) diff --git a/forge-game/src/main/java/forge/game/cost/CostPartWithList.java b/forge-game/src/main/java/forge/game/cost/CostPartWithList.java index cb7ac9cb074..787afda62dd 100644 --- a/forge-game/src/main/java/forge/game/cost/CostPartWithList.java +++ b/forge-game/src/main/java/forge/game/cost/CostPartWithList.java @@ -21,8 +21,10 @@ import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; import forge.game.card.CardUtil; +import forge.game.card.CardZoneTable; import forge.game.player.Player; import forge.game.spellability.SpellAbility; +import forge.game.zone.Zone; /** * The Class CostPartWithList. @@ -35,6 +37,8 @@ public abstract class CostPartWithList extends CostPart { /** The lists: one for LKI, one for the actual cards. */ private final CardCollection lkiList = new CardCollection(); protected final CardCollection cardList = new CardCollection(); + + protected final CardZoneTable table = new CardZoneTable(); // set is here because executePayment() adds card to list, while ai's decide payment does the same thing. // set allows to avoid duplication @@ -52,6 +56,7 @@ public abstract class CostPartWithList extends CostPart { public final void resetLists() { lkiList.clear(); cardList.clear(); + table.clear(); } /** @@ -97,13 +102,21 @@ public abstract class CostPartWithList extends CostPart { public final boolean executePayment(SpellAbility ability, Card targetCard) { lkiList.add(CardUtil.getLKICopy(targetCard)); + final Zone origin = targetCard.getZone(); final Card newCard = doPayment(ability, targetCard); - cardList.add(newCard); // need to update the LKI info to ensure correct interaction with cards which may trigger on this // (e.g. Necroskitter + a creature dying from a -1/-1 counter on a cost payment). targetCard.getGame().updateLastStateForCard(targetCard); + if (newCard != null) { + final Zone newZone = newCard.getZone(); + cardList.add(newCard); + + if (!origin.equals(newZone)) { + table.put(origin.getZoneType(), newZone.getZoneType(), newCard); + } + } return true; } @@ -112,11 +125,13 @@ public abstract class CostPartWithList extends CostPart { if (canPayListAtOnce()) { // This is used by reveal. Without it when opponent would reveal hand, you'll get N message boxes. lkiList.addAll(targetCards); cardList.addAll(doListPayment(ability, targetCards)); + handleChangeZoneTrigger(ability); return true; } for (Card c: targetCards) { executePayment(ability, c); } + handleChangeZoneTrigger(ability); return true; } @@ -145,4 +160,15 @@ public abstract class CostPartWithList extends CostPart { return true; } + protected void handleChangeZoneTrigger(SpellAbility ability) { + if (table.isEmpty()) { + return; + } + + // copy table because the original get cleaned after the cost is done + final CardZoneTable copyTable = new CardZoneTable(); + copyTable.putAll(table); + copyTable.triggerChangesZoneAll(ability.getHostCard().getGame()); + } + } diff --git a/forge-game/src/main/java/forge/game/cost/CostSacrifice.java b/forge-game/src/main/java/forge/game/cost/CostSacrifice.java index e5cd9c1e9e3..f7e57a6a2a6 100644 --- a/forge-game/src/main/java/forge/game/cost/CostSacrifice.java +++ b/forge-game/src/main/java/forge/game/cost/CostSacrifice.java @@ -116,7 +116,8 @@ public class CostSacrifice extends CostPartWithList { @Override protected Card doPayment(SpellAbility ability, Card targetCard) { - return targetCard.getGame().getAction().sacrifice(targetCard, ability); + // no table there, it is already handled by CostPartWithList + return targetCard.getGame().getAction().sacrifice(targetCard, ability, null); } /* (non-Javadoc) diff --git a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java index 74738a143e0..13995f9f4eb 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java @@ -29,6 +29,7 @@ import forge.game.card.CardCollectionView; import forge.game.card.CardLists; import forge.game.card.CounterType; import forge.game.card.CardPredicates.Presets; +import forge.game.card.CardZoneTable; import forge.game.combat.Combat; import forge.game.combat.CombatUtil; import forge.game.cost.Cost; @@ -38,9 +39,11 @@ import forge.game.player.Player; import forge.game.player.PlayerController.BinaryChoiceType; import forge.game.player.PlayerController.ManaPaymentPurpose; import forge.game.spellability.SpellAbility; +import forge.game.spellability.LandAbility; import forge.game.staticability.StaticAbility; import forge.game.trigger.Trigger; import forge.game.trigger.TriggerType; +import forge.game.zone.Zone; import forge.game.zone.ZoneType; import forge.util.CollectionSuppliers; import forge.util.TextUtil; @@ -359,9 +362,11 @@ public class PhaseHandler implements java.io.Serializable { int numDiscard = playerTurn.isUnlimitedHandSize() || handSize <= max || handSize == 0 ? 0 : handSize - max; if (numDiscard > 0) { + final CardZoneTable table = new CardZoneTable(); for (Card c : playerTurn.getController().chooseCardsToDiscardToMaximumHandSize(numDiscard)){ - playerTurn.discard(c, null); + playerTurn.discard(c, null, table); } + table.triggerChangesZoneAll(game); } // Rule 514.2 @@ -983,7 +988,23 @@ public class PhaseHandler implements java.io.Serializable { } pFirstPriority = pPlayerPriority; // all opponents have to pass before stack is allowed to resolve for (SpellAbility sa : chosenSa) { + Card saHost = sa.getHostCard(); + final Zone originZone = saHost.getZone(); + + // TODO it has no return value if successful pPlayerPriority.getController().playChosenSpellAbility(sa); + + saHost = game.getCardState(saHost); + final Zone currentZone = saHost.getZone(); + + // Need to check if Zone did change + if (currentZone != null && originZone != null && !currentZone.equals(originZone) && (sa.isSpell() || sa instanceof LandAbility)) { + // currently there can be only one Spell put on the Stack at once, or Land Abilities be played + final CardZoneTable triggerList = new CardZoneTable(); + triggerList.put(originZone.getZoneType(), currentZone.getZoneType(), saHost); + triggerList.triggerChangesZoneAll(game); + } + } loopCount++; } while (loopCount < 999 || !pPlayerPriority.getController().isAI()); diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index bd00fca5986..cf3843b7b20 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -1581,12 +1581,13 @@ public class Player extends GameEntity implements Comparable { return numDrawnThisDrawStep; } - public final Card discard(final Card c, final SpellAbility sa) { + public final Card discard(final Card c, final SpellAbility sa, CardZoneTable table) { // TODO: This line should be moved inside CostPayment somehow /*if (sa != null) { sa.addCostToHashList(c, "Discarded"); }*/ final Card source = sa != null ? sa.getHostCard() : null; + final ZoneType origin = c.getZone().getZoneType(); boolean discardToTopOfLibrary = null != sa && sa.hasParam("DiscardToTopOfLibrary"); boolean discardMadness = sa != null && sa.hasParam("Madness"); @@ -1622,6 +1623,9 @@ public class Player extends GameEntity implements Comparable { newCard = game.getAction().moveToGraveyard(c, sa, null); // Play the Discard sound } + if (table != null) { + table.put(origin, newCard.getZone().getZoneType(), newCard); + } sb.append("."); numDiscardedThisTurn++; // Run triggers @@ -1660,18 +1664,13 @@ public class Player extends GameEntity implements Comparable { numCardsInHandStartedThisTurnWith = num; } - public final CardCollectionView mill(final int n) { - return mill(n, ZoneType.Graveyard, false); - } - public final CardCollectionView mill(final int n, final ZoneType zone, - final boolean bottom) { + public final CardCollectionView mill(final int n, final ZoneType destination, + final boolean bottom, SpellAbility sa, CardZoneTable table) { final CardCollectionView lib = getCardsIn(ZoneType.Library); final CardCollection milled = new CardCollection(); final int max = Math.min(n, lib.size()); - final ZoneType destination = getZone(zone).getZoneType(); - for (int i = 0; i < max; i++) { if (bottom) { milled.add(lib.get(lib.size() - i - 1)); @@ -1682,12 +1681,15 @@ public class Player extends GameEntity implements Comparable { } CardCollectionView milledView = milled; + if (destination == ZoneType.Graveyard && milled.size() > 1) { milledView = GameActionUtil.orderCardsByTheirOwners(game, milled, ZoneType.Graveyard); } for (Card m : milledView) { - game.getAction().moveTo(destination, m, null, null); + final ZoneType origin = m.getZone().getZoneType(); + final Card d = game.getAction().moveTo(destination, m, sa, null); + table.put(origin, d.getZone().getZoneType(), d); } return milled; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java index 528b6172210..3651c3d9ae7 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java @@ -15,44 +15,10 @@ public class TriggerChangesZoneAll extends Trigger { @Override public boolean performTest(Map runParams2) { - @SuppressWarnings("unchecked") - final Map moved = (Map) runParams2.get("Cards"); + final CardZoneTable table = (CardZoneTable) runParams2.get("Cards"); - if (hasParam("Destination")) { - if (!getParam("Destination").equals("Any")) { - if (!runParams2.get("Destination").equals(ZoneType.valueOf(getParam("Destination")))) { - return false; - } - } - } - - final CardCollection allCards = new CardCollection(); - - if (hasParam("Origin")) { - if (!getParam("Origin").equals("Any")) { - if (getParam("Origin") == null) { - return false; - } - final List origin = ZoneType.listValueOf((String)getParam("Origin")); - for (ZoneType z : origin) { - if (moved.containsKey(z)) { - allCards.addAll(moved.get(z)); - } - } - } - } else { - for (CardCollection c : moved.values()) { - allCards.addAll(c); - } - } - - if (hasParam("ValidCards")) { - - int count = CardLists.getValidCardCount(allCards, getParam("ValidCards").split(","),this.getHostCard().getController(), - this.getHostCard()); - if (count == 0) { - return false; - } + if (filterCards(table).isEmpty()) { + return false; } return true; @@ -60,30 +26,9 @@ public class TriggerChangesZoneAll extends Trigger { @Override public void setTriggeringObjects(SpellAbility sa) { - @SuppressWarnings("unchecked") - final Map moved = (Map) getRunParams().get("Cards"); + final CardZoneTable table = (CardZoneTable) getRunParams().get("Cards"); - CardCollection allCards = new CardCollection(); - - if (hasParam("Origin")) { - if (!getParam("Origin").equals("Any") && getParam("Origin") != null) { - final List origin = ZoneType.listValueOf((String)getParam("Origin")); - for (ZoneType z : origin) { - if (moved.containsKey(z)) { - allCards.addAll(moved.get(z)); - } - } - } - } else { - for (CardCollection c : moved.values()) { - allCards.addAll(c); - } - } - - if (hasParam("ValidCards")) { - allCards = CardLists.getValidCards(allCards, getParam("ValidCards").split(","),this.getHostCard().getController(), - this.getHostCard(), sa); - } + CardCollection allCards = this.filterCards(table); sa.setTriggeringObject("Cards", allCards); sa.setTriggeringObject("Amount", allCards.size()); @@ -95,4 +40,50 @@ public class TriggerChangesZoneAll extends Trigger { sb.append("Amount: ").append(sa.getTriggeringObject("Amount")); return sb.toString(); } + + private CardCollection filterCards(CardZoneTable table) { + CardCollection allCards = new CardCollection(); + ZoneType destination = null; + + if (hasParam("Destination")) { + if (!getParam("Destination").equals("Any")) { + destination = ZoneType.valueOf(getParam("Destination")); + if (!table.containsColumn(destination)) { + return allCards; + } + } + } + + if (hasParam("Origin") && !getParam("Origin").equals("Any")) { + if (getParam("Origin") == null) { + return allCards; + } + final List origin = ZoneType.listValueOf(getParam("Origin")); + for (ZoneType z : origin) { + if (table.containsRow(z)) { + if (destination != null) { + allCards.addAll(table.row(z).get(destination)); + } else { + for (CardCollection c : table.row(z).values()) { + allCards.addAll(c); + } + } + } + } + } else if (destination != null) { + for (CardCollection c : table.column(destination).values()) { + allCards.addAll(c); + } + } else { + for (CardCollection c : table.values()) { + allCards.addAll(c); + } + } + + if (hasParam("ValidCards")) { + allCards = CardLists.getValidCards(allCards, getParam("ValidCards").split(","), + getHostCard().getController(), getHostCard(), null); + } + return allCards; + } } diff --git a/forge-gui/res/cardsfolder/s/sidisi_brood_tyrant.txt b/forge-gui/res/cardsfolder/s/sidisi_brood_tyrant.txt index a0545dd8a14..b5f12180c15 100644 --- a/forge-gui/res/cardsfolder/s/sidisi_brood_tyrant.txt +++ b/forge-gui/res/cardsfolder/s/sidisi_brood_tyrant.txt @@ -4,8 +4,9 @@ Types:Legendary Creature Naga Shaman PT:3/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMill | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, put the top three cards of your library into your graveyard. T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigMill | Secondary$ True | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, put the top three cards of your library into your graveyard. -T:Mode$ ChangesZone | ValidCard$ Creature.YouCtrl | OncePerEffect$ True | Origin$ Library | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever one or more creature cards are put into your graveyard from your library, create a 2/2 black Zombie creature token. +T:Mode$ ChangesZoneAll | ValidCards$ Creature.YouOwn | Origin$ Library | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever one or more creature cards are put into your graveyard from your library, create a 2/2 black Zombie creature token. SVar:TrigMill:DB$Mill | NumCards$ 3 | Defined$ You -SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenName$ Zombie | TokenTypes$ Creature,Zombie | TokenOwner$ You | TokenColors$ Black | TokenPower$ 2 | TokenToughness$ 2 | TokenImage$ b 2 2 zombie KTK | +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ b_2_2_zombie | TokenOwner$ You +DeckHas:Ability$Token & Ability$Graveyard SVar:Picture:http://www.wizards.com/global/images/magic/general/sidisi_brood_tyrant.jpg -Oracle:Whenever Sidisi, Brood Tyrant enters the battlefield or attacks, put the top three cards of your library into your graveyard.\nWhenever one or more creature cards are put into your graveyard from your library, create a 2/2 black Zombie creature token. \ No newline at end of file +Oracle:Whenever Sidisi, Brood Tyrant enters the battlefield or attacks, put the top three cards of your library into your graveyard.\nWhenever one or more creature cards are put into your graveyard from your library, create a 2/2 black Zombie creature token. diff --git a/forge-gui/res/cardsfolder/t/the_gitrog_monster.txt b/forge-gui/res/cardsfolder/t/the_gitrog_monster.txt index c8816bee9c9..39c6c894a3e 100644 --- a/forge-gui/res/cardsfolder/t/the_gitrog_monster.txt +++ b/forge-gui/res/cardsfolder/t/the_gitrog_monster.txt @@ -5,7 +5,8 @@ PT:6/6 K:Deathtouch K:UpkeepCost:Sac<1/Land> S:Mode$ Continuous | Affected$ You | AddKeyword$ AdjustLandPlays:1 | Description$ You may play an additional land on each of your turns. -T:Mode$ ChangesZone | ValidCard$ Land.YouOwn | OncePerEffect$ True | Origin$ Any | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever one or more land cards are put into your graveyard from anywhere, draw a card. -SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 +T:Mode$ ChangesZoneAll | ValidCards$ Land.YouOwn | Origin$ Any | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever one or more land cards are put into your graveyard from anywhere, draw a card. +SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 +DeckHas:Ability$Graveyard SVar:Picture:http://www.wizards.com/global/images/magic/general/the_gitrog_monster.jpg Oracle:Deathtouch\nAt the beginning of your upkeep, sacrifice The Gitrog Monster unless you sacrifice a land.\nYou may play an additional land on each of your turns.\nWhenever one or more land cards are put into your graveyard from anywhere, draw a card. diff --git a/forge-gui/res/cardsfolder/t/turntimber_sower.txt b/forge-gui/res/cardsfolder/t/turntimber_sower.txt index 7a8cbabbf9d..522ef4a93c4 100644 --- a/forge-gui/res/cardsfolder/t/turntimber_sower.txt +++ b/forge-gui/res/cardsfolder/t/turntimber_sower.txt @@ -2,8 +2,9 @@ Name:Turntimber Sower ManaCost:2 G Types:Creature Elf Druid PT:3/3 -T:Mode$ ChangesZone | ValidCard$ Land.YouOwn | Origin$ Any | Destination$ Graveyard | Execute$ TrigToken | OncePerEffect$ True | TriggerZones$ Battlefield | TriggerDescription$ Whenever one or more land cards are put into your graveyard from anywhere, create a 0/1 green Plant creature token. -SVar:TrigToken:DB$Token | TokenAmount$ 1 | TokenName$ Plant | TokenTypes$ Creature,Plant | TokenOwner$ You | TokenColors$ Green | TokenPower$ 0 | TokenToughness$ 1 | TokenImage$ g 0 1 plant c18 -AI:RemoveDeck:Random +T:Mode$ ChangesZoneAll | ValidCards$ Land.YouOwn | Origin$ Any | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever one or more land cards are put into your graveyard from anywhere, create a 0/1 green Plant creature token. +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ g_0_1_plant | TokenOwner$ You A:AB$ ChangeZone | Cost$ G Sac<3/Creature> | TgtPrompt$ Choose target land card in your graveyard | ValidTgts$ Land.YouCtrl | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target land card from your graveyard to your hand. +DeckHas:Ability$Token & Ability$Graveyard +AI:RemoveDeck:Random Oracle:Whenever one or more land cards are put into your graveyard from anywhere, create a 0/1 green Plant creature token.\n{G}, Sacrifice three creatures: Return target land card from your graveyard to your hand. diff --git a/forge-gui/res/tokenscripts/b_2_2_zombie.txt b/forge-gui/res/tokenscripts/b_2_2_zombie.txt new file mode 100644 index 00000000000..dc060486fbe --- /dev/null +++ b/forge-gui/res/tokenscripts/b_2_2_zombie.txt @@ -0,0 +1,6 @@ +Name:Zombie +ManaCost:no cost +Types:Creature Zombie +Colors:black +PT:2/2 +Oracle: \ No newline at end of file diff --git a/forge-gui/res/tokenscripts/g_0_1_plant.txt b/forge-gui/res/tokenscripts/g_0_1_plant.txt new file mode 100644 index 00000000000..76c1b8f7958 --- /dev/null +++ b/forge-gui/res/tokenscripts/g_0_1_plant.txt @@ -0,0 +1,6 @@ +Name:Plant +ManaCost:no cost +Types:Creature Plant +Colors:green +PT:0/1 +Oracle: diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index cd5ab73816e..3f634a2e499 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -2,7 +2,6 @@ package forge.player; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; -import com.google.common.collect.Maps; import forge.FThreads; import forge.card.mana.ManaCost; import forge.game.Game; @@ -34,7 +33,6 @@ import forge.util.gui.SGuiChoose; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -310,7 +308,7 @@ public class HumanPlay { final HumanCostDecision hcd = new HumanCostDecision(controller, p, sourceAbility, source); boolean mandatory = cost.isMandatory(); - + //the following costs do not need inputs for (CostPart part : parts) { boolean mayRemovePart = true; @@ -355,7 +353,7 @@ public class HumanPlay { } else if (part instanceof CostGainLife) { PaymentDecision pd = part.accept(hcd); - + if (pd == null) return false; else @@ -369,7 +367,7 @@ public class HumanPlay { return false; } PaymentDecision pd = part.accept(hcd); - + if (pd == null) return false; else @@ -520,22 +518,19 @@ public class HumanPlay { } } else if (part instanceof CostExile) { - final CardCollection exiledList = new CardCollection(); + CostExile costExile = (CostExile) part; + ZoneType from = ZoneType.Graveyard; if ("All".equals(part.getType())) { if (!p.getController().confirmPayment(part, "Do you want to exile all cards in your graveyard?", sourceAbility)) { return false; } - CardCollection cards = new CardCollection(p.getCardsIn(ZoneType.Graveyard)); - for (final Card card : cards) { - exiledList.add(p.getGame().getAction().exile(card, null)); - } + costExile.executePayment(sourceAbility, p.getCardsIn(ZoneType.Graveyard)); } else { - CostExile costExile = (CostExile) part; from = costExile.getFrom(); - List list = CardLists.getValidCards(p.getCardsIn(from), part.getType().split(";"), p, source, sourceAbility); + CardCollection list = CardLists.getValidCards(p.getCardsIn(from), part.getType().split(";"), p, source, sourceAbility); final int nNeeded = getAmountFromPart(costPart, source, sourceAbility); if (list.size() < nNeeded) { return false; @@ -546,11 +541,10 @@ public class HumanPlay { return false; } list = list.subList(0, nNeeded); - for (Card c : list) { - exiledList.add(p.getGame().getAction().exile(c, null)); - } + costExile.executePayment(sourceAbility, list); } else { // replace this with input + CardCollection newList = new CardCollection(); for (int i = 0; i < nNeeded; i++) { final Card c = p.getGame().getCard(SGuiChoose.oneOrNone("Exile from " + from, CardView.getCollection(list))); if (c == null) { @@ -558,19 +552,11 @@ public class HumanPlay { } list.remove(c); - exiledList.add(p.getGame().getAction().exile(c, null)); + newList.add(c); } + costExile.executePayment(sourceAbility, newList); } } - - if (!exiledList.isEmpty()) { - final HashMap runParams = new HashMap(); - final Map triggerList = Maps.newEnumMap(ZoneType.class); - triggerList.put(from, exiledList); - runParams.put("Cards", triggerList); - runParams.put("Destination", ZoneType.Exile); - p.getGame().getTriggerHandler().runTrigger(TriggerType.ChangesZoneAll, runParams, false); - } } else if (part instanceof CostPutCardToLib) { int amount = Integer.parseInt(((CostPutCardToLib) part).getAmount()); @@ -651,10 +637,7 @@ public class HumanPlay { return false; } - CardCollection cards = new CardCollection(p.getCardsIn(ZoneType.Hand)); - for (final Card card : cards) { - p.discard(card, sourceAbility); - } + ((CostDiscard)part).executePayment(sourceAbility, p.getCardsIn(ZoneType.Hand)); } else { CardCollectionView list = CardLists.getValidCards(p.getCardsIn(ZoneType.Hand), part.getType(), p, source); int amount = getAmountFromPartX(part, source, sourceAbility); @@ -722,7 +705,7 @@ public class HumanPlay { String promptCurrent = current == null ? "" : "Current Card: " + current; prompt = source + "\n" + promptCurrent; } - + sourceAbility.clearManaPaid(); boolean paid = p.getController().payManaCost(cost.getCostMana(), sourceAbility, prompt, false); if (!paid) { @@ -743,42 +726,33 @@ public class HumanPlay { return false; } - for (Card c : inp.getSelected()) { - cpl.executePayment(sourceAbility, c); - } + cpl.executePayment(sourceAbility, new CardCollection(inp.getSelected())); + if (sourceAbility != null) { cpl.reportPaidCardsTo(sourceAbility); } return true; } - + private static boolean handleOfferingConvokeAndDelve(final SpellAbility ability, CardCollection cardsToDelve, boolean manaInputCancelled) { + Card hostCard = ability.getHostCard(); + final Game game = hostCard.getGame(); + + final CardZoneTable table = new CardZoneTable(); if (!manaInputCancelled && !cardsToDelve.isEmpty()) { - Card hostCard = ability.getHostCard(); - final Game game = hostCard.getGame(); - - final CardCollection delved = new CardCollection(); - final Map triggerList = Maps.newEnumMap(ZoneType.class); - for (final Card c : cardsToDelve) { hostCard.addDelved(c); - delved.add(game.getAction().exile(c, null)); - } - - if (!delved.isEmpty()) { - triggerList.put(ZoneType.Graveyard, delved); - final Map runParams = Maps.newHashMap(); - runParams.put("Cards", triggerList); - runParams.put("Destination", ZoneType.Exile); - game.getTriggerHandler().runTrigger(TriggerType.ChangesZoneAll, runParams, false); + final ZoneType o = c.getZone().getZoneType(); + final Card d = game.getAction().exile(c, null); + table.put(o, d.getZone().getZoneType(), d); } } if (ability.isOffering() && ability.getSacrificedAsOffering() != null) { final Card offering = ability.getSacrificedAsOffering(); offering.setUsedToPay(false); if (!manaInputCancelled) { - ability.getHostCard().getGame().getAction().sacrifice(offering, ability); + game.getAction().sacrifice(offering, ability, table); } ability.resetSacrificedAsOffering(); } @@ -786,7 +760,7 @@ public class HumanPlay { final Card emerge = ability.getSacrificedAsEmerge(); emerge.setUsedToPay(false); if (!manaInputCancelled) { - ability.getHostCard().getGame().getAction().sacrifice(emerge, ability); + game.getAction().sacrifice(emerge, ability, table); } ability.resetSacrificedAsEmerge(); } @@ -799,9 +773,12 @@ public class HumanPlay { } ability.clearTappedForConvoke(); } + if (!table.isEmpty() && !manaInputCancelled) { + table.triggerChangesZoneAll(game); + } return !manaInputCancelled; } - + public static boolean payManaCost(final PlayerControllerHuman controller, final ManaCost realCost, final CostPartMana mc, final SpellAbility ability, final Player activator, String prompt, ManaConversionMatrix matrix, boolean isActivatedSa) { final Card source = ability.getHostCard(); ManaCostBeingPaid toPay = new ManaCostBeingPaid(realCost, mc.getRestiction()); @@ -887,7 +864,7 @@ public class HumanPlay { if (ability.getSacrificedAsOffering() != null) { System.out.println("Finishing up Offering"); offering.setUsedToPay(false); - activator.getGame().getAction().sacrifice(offering, ability); + activator.getGame().getAction().sacrifice(offering, ability, null); ability.resetSacrificedAsOffering(); } } @@ -898,7 +875,7 @@ public class HumanPlay { if (ability.getSacrificedAsEmerge() != null) { System.out.println("Finishing up Emerge"); emerge.setUsedToPay(false); - activator.getGame().getAction().sacrifice(emerge, ability); + activator.getGame().getAction().sacrifice(emerge, ability, null); ability.resetSacrificedAsEmerge(); } } From fee83e0db42f0d2f1dab2589a63af80688770d3f Mon Sep 17 00:00:00 2001 From: Hanmac Date: Wed, 26 Dec 2018 11:19:23 +0100 Subject: [PATCH 537/901] Fix 'You may put' 'land card from your hand onto the battlefield' cards --- forge-gui/res/cardsfolder/b/broken_bond.txt | 2 +- .../cardsfolder/b/budoka_gardener_dokai_weaver_of_life.txt | 5 ++--- forge-gui/res/cardsfolder/f/firebrand_ranger.txt | 2 +- forge-gui/res/cardsfolder/l/llanowar_scout.txt | 2 +- forge-gui/res/cardsfolder/s/sakura_tribe_scout.txt | 2 +- forge-gui/res/cardsfolder/s/skyshroud_ranger.txt | 2 +- forge-gui/res/cardsfolder/s/swell_of_growth.txt | 2 +- forge-gui/res/cardsfolder/upcoming/growth_spiral.txt | 7 +++++++ forge-gui/res/cardsfolder/w/walking_atlas.txt | 2 +- 9 files changed, 16 insertions(+), 10 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/growth_spiral.txt diff --git a/forge-gui/res/cardsfolder/b/broken_bond.txt b/forge-gui/res/cardsfolder/b/broken_bond.txt index d90a2e10da4..e08ee236352 100644 --- a/forge-gui/res/cardsfolder/b/broken_bond.txt +++ b/forge-gui/res/cardsfolder/b/broken_bond.txt @@ -2,5 +2,5 @@ Name:Broken Bond ManaCost:1 G Types:Sorcery A:SP$ Destroy | Cost$ 1 G | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SubAbility$ DBChangeZone | SpellDescription$ Destroy target artifact or enchantment. You may put a land card from your hand onto the battlefield. -SVar:DBChangeZone:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land | ChangeNum$ 1 +SVar:DBChangeZone:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land | ChangeNum$ 1 | Optional$ You Oracle:Destroy target artifact or enchantment. You may put a land card from your hand onto the battlefield. diff --git a/forge-gui/res/cardsfolder/b/budoka_gardener_dokai_weaver_of_life.txt b/forge-gui/res/cardsfolder/b/budoka_gardener_dokai_weaver_of_life.txt index 14f02fb0b71..ae10c36218a 100644 --- a/forge-gui/res/cardsfolder/b/budoka_gardener_dokai_weaver_of_life.txt +++ b/forge-gui/res/cardsfolder/b/budoka_gardener_dokai_weaver_of_life.txt @@ -2,9 +2,8 @@ Name:Budoka Gardener ManaCost:1 G Types:Creature Human Monk PT:2/1 -A:AB$ChangeZone | Cost$ T | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land | ChangeNum$ 1 | OptionalDecider$ You | SubAbility$ DBFlip | SpellDescription$ You may put a land card from your hand onto the battlefield. If you control ten or more lands, flip CARDNAME. -SVar:DBFlip:DB$SetState | Defined$ Self | ConditionCheckSVar$ X | ConditionSVarCompare$ GE10 | Mode$ Flip -SVar:X:Count$Valid Land.YouCtrl +A:AB$ChangeZone | Cost$ T | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land | ChangeNum$ 1 | Optional$ You | SubAbility$ DBFlip | SpellDescription$ You may put a land card from your hand onto the battlefield. If you control ten or more lands, flip CARDNAME. +SVar:DBFlip:DB$SetState | Defined$ Self | ConditionPresent$ Land.YouCtrl | ConditionCompare$ GE10 | Mode$ Flip AlternateMode:Flip SVar:Picture:http://www.wizards.com/global/images/magic/general/budoka_gardener.jpg Oracle:{T}: You may put a land card from your hand onto the battlefield. If you control ten or more lands, flip Budoka Gardener. diff --git a/forge-gui/res/cardsfolder/f/firebrand_ranger.txt b/forge-gui/res/cardsfolder/f/firebrand_ranger.txt index 38558448f2f..49675cdcfb6 100644 --- a/forge-gui/res/cardsfolder/f/firebrand_ranger.txt +++ b/forge-gui/res/cardsfolder/f/firebrand_ranger.txt @@ -2,6 +2,6 @@ Name:Firebrand Ranger ManaCost:1 R Types:Creature Human Soldier PT:2/1 -A:AB$ ChangeZone | Cost$ G T | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land.Basic | ChangeNum$ 1 | SpellDescription$ You may put a basic land card from your hand onto the battlefield. +A:AB$ ChangeZone | Cost$ G T | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land.Basic | ChangeNum$ 1 | Optional$ You | AILogic$ AtOppEOT | SpellDescription$ You may put a basic land card from your hand onto the battlefield. SVar:Picture:http://www.wizards.com/global/images/magic/general/firebrand_ranger.jpg Oracle:{G}, {T}: You may put a basic land card from your hand onto the battlefield. diff --git a/forge-gui/res/cardsfolder/l/llanowar_scout.txt b/forge-gui/res/cardsfolder/l/llanowar_scout.txt index b16a58bb41a..822ee91f1cf 100644 --- a/forge-gui/res/cardsfolder/l/llanowar_scout.txt +++ b/forge-gui/res/cardsfolder/l/llanowar_scout.txt @@ -2,6 +2,6 @@ Name:Llanowar Scout ManaCost:1 G Types:Creature Elf Scout PT:1/3 -A:AB$ ChangeZone | Cost$ T | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land | ChangeNum$ 1 | AILogic$ AtOppEOT | SpellDescription$ You may put a land card from your hand onto the battlefield. +A:AB$ ChangeZone | Cost$ T | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land | ChangeNum$ 1 | Optional$ You | AILogic$ AtOppEOT | SpellDescription$ You may put a land card from your hand onto the battlefield. SVar:Picture:http://www.wizards.com/global/images/magic/general/llanowar_scout.jpg Oracle:{T}: You may put a land card from your hand onto the battlefield. diff --git a/forge-gui/res/cardsfolder/s/sakura_tribe_scout.txt b/forge-gui/res/cardsfolder/s/sakura_tribe_scout.txt index 33bf615dcbd..d7d15121fe2 100644 --- a/forge-gui/res/cardsfolder/s/sakura_tribe_scout.txt +++ b/forge-gui/res/cardsfolder/s/sakura_tribe_scout.txt @@ -2,6 +2,6 @@ Name:Sakura-Tribe Scout ManaCost:G Types:Creature Snake Shaman Scout PT:1/1 -A:AB$ ChangeZone | Cost$ T | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land | ChangeNum$ 1 | SpellDescription$ You may put a land card from your hand onto the battlefield. +A:AB$ ChangeZone | Cost$ T | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land | ChangeNum$ 1 | Optional$ You | AILogic$ AtOppEOT | SpellDescription$ You may put a land card from your hand onto the battlefield. SVar:Picture:http://www.wizards.com/global/images/magic/general/sakura_tribe_scout.jpg Oracle:{T}: You may put a land card from your hand onto the battlefield. diff --git a/forge-gui/res/cardsfolder/s/skyshroud_ranger.txt b/forge-gui/res/cardsfolder/s/skyshroud_ranger.txt index e4a7ad029a7..668309e20c0 100644 --- a/forge-gui/res/cardsfolder/s/skyshroud_ranger.txt +++ b/forge-gui/res/cardsfolder/s/skyshroud_ranger.txt @@ -2,6 +2,6 @@ Name:Skyshroud Ranger ManaCost:G Types:Creature Elf PT:1/1 -A:AB$ ChangeZone | Cost$ T | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land | ChangeNum$ 1 | SorcerySpeed$ True | SpellDescription$ You may put a land card from your hand onto the battlefield. Activate this ability only any time you could cast a sorcery. +A:AB$ ChangeZone | Cost$ T | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land | ChangeNum$ 1 | Optional$ You | SorcerySpeed$ True | SpellDescription$ You may put a land card from your hand onto the battlefield. Activate this ability only any time you could cast a sorcery. SVar:Picture:http://www.wizards.com/global/images/magic/general/skyshroud_ranger.jpg Oracle:{T}: You may put a land card from your hand onto the battlefield. Activate this ability only any time you could cast a sorcery. diff --git a/forge-gui/res/cardsfolder/s/swell_of_growth.txt b/forge-gui/res/cardsfolder/s/swell_of_growth.txt index b4c2a58b251..e4553ca6841 100644 --- a/forge-gui/res/cardsfolder/s/swell_of_growth.txt +++ b/forge-gui/res/cardsfolder/s/swell_of_growth.txt @@ -2,6 +2,6 @@ Name:Swell of Growth ManaCost:1 G Types:Instant A:SP$ Pump | Cost$ 1 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ 2 | NumDef$ 2 | SpellDescription$ Target creature gets +2/+2 until end of turn. You may put a land card from your hand onto the battlefield. | SubAbility$ DBChangeZone -SVar:DBChangeZone:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | $OptionalDecider You | ChangeType$ Land | ChangeNum$ 1 +SVar:DBChangeZone:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | Optional$ You | ChangeType$ Land | ChangeNum$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/swell_of_growth.jpg Oracle:Target creature gets +2/+2 until end of turn. You may put a land card from your hand onto the battlefield. diff --git a/forge-gui/res/cardsfolder/upcoming/growth_spiral.txt b/forge-gui/res/cardsfolder/upcoming/growth_spiral.txt new file mode 100644 index 00000000000..f4a787222fb --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/growth_spiral.txt @@ -0,0 +1,7 @@ +Name:Growth Spiral +ManaCost:G U +Types:Instant +A:SP$ DB$Draw | Cost$ G U | Defined$ You | NumCards$ 1 | SubAbility$ DBChangeZone | SpellDescription$ Draw a card. +SVar:DBChangeZone:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | Optional$ You | ChangeType$ Land | ChangeNum$ 1 | SpellDescription$ You may put a land card from your hand onto the battlefield. +Oracle:Draw a card. You may put a land card from your hand onto the battlefield. + diff --git a/forge-gui/res/cardsfolder/w/walking_atlas.txt b/forge-gui/res/cardsfolder/w/walking_atlas.txt index c5b1b6832e4..df285331123 100644 --- a/forge-gui/res/cardsfolder/w/walking_atlas.txt +++ b/forge-gui/res/cardsfolder/w/walking_atlas.txt @@ -2,6 +2,6 @@ Name:Walking Atlas ManaCost:2 Types:Artifact Creature Construct PT:1/1 -A:AB$ ChangeZone | Cost$ T | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land | ChangeNum$ 1 | Optional$ You | SpellDescription$ You may put a land card from your hand onto the battlefield. +A:AB$ ChangeZone | Cost$ T | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land | ChangeNum$ 1 | Optional$ You | AILogic$ AtOppEOT | SpellDescription$ You may put a land card from your hand onto the battlefield. SVar:Picture:http://www.wizards.com/global/images/magic/general/Walking_Atlas.jpg Oracle:{T}: You may put a land card from your hand onto the battlefield. From e2224448092665cf9b2452f99d790655b451b1bc Mon Sep 17 00:00:00 2001 From: Tim Scott Date: Wed, 26 Dec 2018 09:32:22 -0600 Subject: [PATCH 538/901] Update readme with build info. --- README.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 26d7dad1cd0..bb1de30b31d 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,8 @@ Discord channel [here](https://discordapp.com/channels/267367946135928833/267742 - Go to the project location on your machine. Run Maven to download all dependencies and build a snapshot. Example for Windows & Linux: `mvn -U -B clean -P windows-linux install` +- + # Eclipse ## Project Setup @@ -61,9 +63,13 @@ Discord channel [here](https://discordapp.com/channels/267367946135928833/267742 ## Desktop -The desktop GUI is based off of Java Swing. +- The desktop GUI is based off of Java Swing. + +- Use the following build command to create and populate `forge-gui-desktop/target/forge-gui-desktop-` for Linux and Windows: + + `mvn -U -B clean -P windows-linux install` ## Mobile -The mobile GUI is based off of [libgdx](https://libgdx.badlogicgames.com/). As with many other libgdx projects, there is a mobile-dev version that runs on the desktop but is separate and distinct from the 'desktop GUI' mentioned above. +The mobile GUI is based off of [libgdx](https://libgdx.badlogicgames.com/). As with many other libgdx projects, there is a mobile-dev version "forge-gui-mobile-dev" that runs on the desktop but is separate and distinct from the 'desktop GUI' mentioned above. From 3f55b9f503e25800f9ab020bffd68032d4fb56ab Mon Sep 17 00:00:00 2001 From: Tim Scott Date: Wed, 26 Dec 2018 10:18:40 -0600 Subject: [PATCH 539/901] Flesh out README. --- README.md | 74 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 59 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index bb1de30b31d..da37c24b7a4 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Forge +Gitlab repo is found [here](https://git.cardforge.org/core-developers/forge). + Dev instructions here: [Getting Started](https://www.slightlymagic.net/wiki/Forge:How_to_Get_Started_Developing_Forge) (Somewhat outdated) Discord channel [here](https://discordapp.com/channels/267367946135928833/267742313390931968) @@ -9,9 +11,10 @@ Discord channel [here](https://discordapp.com/channels/267367946135928833/267742 - Java IDE such as IntelliJ or Eclipse - Git - Maven -- Android dev kit (optional: for Android releases) -- Xamarin (optional: for iOS development) - Gitlab account +- Libgdx (optional: familiarity with this library is helpful for mobile platform development) +- Android SDK (optional: for Android releases) +- RoboVM (optional: for iOS releases) (TBD: Current status of support by libgdx) # Project Quick Setup @@ -21,14 +24,12 @@ Discord channel [here](https://discordapp.com/channels/267367946135928833/267742 - Go to the project location on your machine. Run Maven to download all dependencies and build a snapshot. Example for Windows & Linux: `mvn -U -B clean -P windows-linux install` -- - # Eclipse ## Project Setup -- Follow the instructions for cloning from Gitlab. You'll need a Gitlab account setup and an SSH key defined. I'm on a - windows machine and use Putty with TortoiseGit. Run puttygen.exe to generate the key -- save the private key and export +- Follow the instructions for cloning from Gitlab. You'll need a Gitlab account setup and an SSH key defined. If you are on a + Windows machine you can use Putty with TortoiseGit. Run puttygen.exe to generate the key -- save the private key and export the OpenSSH public key. If you just leave the dialog open, you can copy and paste the key from it to your Gitlab profile under "SSH keys". @@ -38,11 +39,15 @@ Discord channel [here](https://discordapp.com/channels/267367946135928833/267742 - Clone your forked repo to your local machine. -- You need maven to load in dependencies and build. Install that. `mvn -U -B clean -P windows-linux install` from the root repo dir will create everything needed. +- Make sure the Java SDK is installed -- not just the JRE. Java 8 or newer required. At the time of this writing, JDK 11 works as expected. -- Make sure the Java SDK is installed -- not just the JRE. Java 8 or newer required. I'm personally running 11. +- You need maven to load in dependencies and build. Obtain that [from here](https://maven.apache.org/download.cgi). Execute the following from the root repo dir to download dependencies, etc: -- Install Eclipse for Java. Launch it. I'm using Eclipse 2018-12. + `mvn -U -B clean -P windows-linux install` + + For the desktop, this will create a populated directory at `forge-gui-desktop/target/forge-gui-desktop-` containing typical release files such as the jar, Windows executable, resource files, etc. + +- Install Eclipse for Java. Launch it. At the time of this writing, Eclipse 2018-12 works as expected. YMMV for other versions. - Create a workspace. Go to the workbench. Right-click inside of Package Explorer > Import... > General > Existing Projects into Workspace > Navigate to local forge repo > Check "Search for nested projects" > Uncheck 'forge', check the rest > Finish. @@ -59,17 +64,56 @@ Discord channel [here](https://discordapp.com/channels/267367946135928833/267742 - Right-click on forge-gui-mobile-dev > Run As... > Java Application > "Main - forge.app" > Proceed +# IntelliJ + +TBD + # General Notes -## Desktop +## Project Hierarchy -- The desktop GUI is based off of Java Swing. +Forge is divided into 4 primary projects with additional projects that target specific platform releases. The primary projects are: -- Use the following build command to create and populate `forge-gui-desktop/target/forge-gui-desktop-` for Linux and Windows: +- forge-ai +- forge-core +- forge-game +- forge-gui - `mvn -U -B clean -P windows-linux install` +The platform-specific projects are: -## Mobile +- forge-gui-android +- forge-gui-desktop +- forge-gui-ios +- forge-gui-mobile +- forge-gui-mobile-dev -The mobile GUI is based off of [libgdx](https://libgdx.badlogicgames.com/). As with many other libgdx projects, there is a mobile-dev version "forge-gui-mobile-dev" that runs on the desktop but is separate and distinct from the 'desktop GUI' mentioned above. +### forge-ai + +### forge-core + +### forge-game + +### forge-gui + +### forge-gui-android + +Libgdx-based backend targeting Android. Requires Android SDK and relies on forge-gui-mobile for GUI logic. + +### forge-gui-desktop + +Java Swing based GUI targeting desktop machines. + +Screen layout and game logic revolving around the GUI is found here. For example, the overlay arrows (when enabled) that indicate attackers and blockers, or the targets of the stack are defined and drawn by this. + +### forge-gui-ios + +Libgdx-based backend targeting iOS. Relies on forge-gui-mobile for GUI logic. + +### forge-gui-mobile + +Mobile GUI game logic utilizing [libgdx](https://libgdx.badlogicgames.com/) library. Screen layout and game logic revolving around the GUI for the mobile platforms is found here. + +### forge-gui-mobile-dev + +Libgdx backend for desktop development for mobile backends. Utilizes LWJGL. Relies on forge-gui-mobile for GUI logic. From 23d67ab0cf4f1ad7ab4ee513a86afc99734ecb83 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 27 Dec 2018 08:21:28 +0300 Subject: [PATCH 540/901] - Fixed the AI misplaying with Chamber Sentry. --- forge-ai/src/main/java/forge/ai/AiCostDecision.java | 2 ++ .../main/java/forge/ai/ability/DamageDealAi.java | 13 +++++++++++++ forge-gui/res/cardsfolder/c/chamber_sentry.txt | 2 +- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/AiCostDecision.java b/forge-ai/src/main/java/forge/ai/AiCostDecision.java index c773211a914..c5ae2738f94 100644 --- a/forge-ai/src/main/java/forge/ai/AiCostDecision.java +++ b/forge-ai/src/main/java/forge/ai/AiCostDecision.java @@ -821,6 +821,8 @@ public class AiCostDecision extends CostDecisionMakerBase { } } } + } else if (sVar.equals("Count$xPaid")) { + c = AbilityUtils.calculateAmount(source, "PayX", null); } else { c = AbilityUtils.calculateAmount(source, amount, ability); } 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 b5f604d2ea4..97b2166c72a 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -11,6 +11,7 @@ import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; import forge.game.card.*; import forge.game.cost.Cost; +import forge.game.cost.CostPart; import forge.game.cost.CostPartMana; import forge.game.cost.CostRemoveCounter; import forge.game.keyword.Keyword; @@ -286,6 +287,18 @@ public class DamageDealAi extends DamageAiBase { } } + if ("XCountersDamage".equals(logic) && sa.getPayCosts() != null) { + // Check to ensure that we have enough counters to remove per the defined PayX + for (CostPart part : sa.getPayCosts().getCostParts()) { + if (part instanceof CostRemoveCounter) { + if (source.getCounters(((CostRemoveCounter) part).counter) < Integer.valueOf(source.getSVar("PayX"))) { + return false; + } + break; + } + } + } + return true; } diff --git a/forge-gui/res/cardsfolder/c/chamber_sentry.txt b/forge-gui/res/cardsfolder/c/chamber_sentry.txt index f8ca75f1a32..476a1d5715a 100644 --- a/forge-gui/res/cardsfolder/c/chamber_sentry.txt +++ b/forge-gui/res/cardsfolder/c/chamber_sentry.txt @@ -4,7 +4,7 @@ Types:Artifact Creature Construct PT:0/0 K:etbCounter:P1P1:Y:no Condition:CARDNAME enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it. SVar:Y:Count$Converge -A:AB$ DealDamage | Announce$ X | Cost$ X T SubCounter | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals X damage to any target. +A:AB$ DealDamage | Announce$ X | Cost$ X T SubCounter | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X | AILogic$ XCountersDamage | SpellDescription$ CARDNAME deals X damage to any target. SVar:X:Count$xPaid A:AB$ ChangeZone | Cost$ W U B R G | Origin$ Graveyard | Destination$ Hand | ActivationZone$ Graveyard | SpellDescription$ Return CARDNAME from your graveyard to your hand. SVar:DiscardMe:1 From d4476cbd2b3e8d48a009de57b8e92959867e0d31 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 27 Dec 2018 13:17:49 +0300 Subject: [PATCH 541/901] - Eliminated a redundant call to canPlay (already tested above). --- forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 97b2166c72a..580df1f592f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -1093,7 +1093,7 @@ public class DamageDealAi extends DamageAiBase { continue; // not a toughness debuff } } - if (StringUtils.isNumeric(dmgDef) && ab.canPlay()) { // currently doesn't work for X and other dependent costs + if (StringUtils.isNumeric(dmgDef)) { // currently doesn't work for X and other dependent costs if (sa.usesTargeting() && ab.usesTargeting()) { // Ensure that the chained spell can target at least the same things (or more) as the current one TargetRestrictions tgtSa = sa.getTargetRestrictions(); From 5a81cace02d290ce3ab5420c22b521a925f1bcf9 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Thu, 27 Dec 2018 16:21:28 +0000 Subject: [PATCH 542/901] Update growth_spiral.txt --- forge-gui/res/cardsfolder/upcoming/growth_spiral.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/growth_spiral.txt b/forge-gui/res/cardsfolder/upcoming/growth_spiral.txt index f4a787222fb..56c8c2833bb 100644 --- a/forge-gui/res/cardsfolder/upcoming/growth_spiral.txt +++ b/forge-gui/res/cardsfolder/upcoming/growth_spiral.txt @@ -1,7 +1,7 @@ Name:Growth Spiral ManaCost:G U Types:Instant -A:SP$ DB$Draw | Cost$ G U | Defined$ You | NumCards$ 1 | SubAbility$ DBChangeZone | SpellDescription$ Draw a card. +A:SP$ Draw | Cost$ G U | Defined$ You | NumCards$ 1 | SubAbility$ DBChangeZone | SpellDescription$ Draw a card. SVar:DBChangeZone:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | Optional$ You | ChangeType$ Land | ChangeNum$ 1 | SpellDescription$ You may put a land card from your hand onto the battlefield. Oracle:Draw a card. You may put a land card from your hand onto the battlefield. From 7f0f62abb66322bf0a34eef028db287e64b97c64 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Thu, 27 Dec 2018 16:41:10 +0100 Subject: [PATCH 543/901] Seance: use AddTypes and AtEOT instead of extra Clones defined --- .../java/forge/game/ability/AbilityUtils.java | 4 ---- .../ability/effects/CopyPermanentEffect.java | 2 -- .../src/main/java/forge/game/card/Card.java | 18 +----------------- .../main/java/forge/game/card/CardFactory.java | 1 - .../main/java/forge/game/card/CardUtil.java | 1 - .../main/java/forge/game/zone/MagicStack.java | 7 ------- forge-gui/res/cardsfolder/s/seance.txt | 5 +---- 7 files changed, 2 insertions(+), 36 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index 22b4bba4797..1629ce8167d 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -225,10 +225,6 @@ public class AbilityUtils { if (o != null && o instanceof Card) { cards.add(game.getCardState((Card) o)); } - } else if (defined.equals("Clones")) { - for (final Card clone : hostCard.getClones()) { - cards.add(game.getCardState(clone)); - } } else if (defined.equals("Imprinted")) { for (final Card imprint : hostCard.getImprintedCards()) { cards.add(game.getCardState(imprint)); diff --git a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java index a534d296e96..54e96418b11 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java @@ -164,7 +164,6 @@ public class CopyPermanentEffect extends SpellAbilityEffect { } else { tgtCards = getTargetCards(sa); } - host.clearClones(); for (final Card c : tgtCards) { if (!sa.usesTargeting() || c.canBeTargetedBy(sa)) { @@ -184,7 +183,6 @@ public class CopyPermanentEffect extends SpellAbilityEffect { //copyInPlay.setSetCode(c.getSetCode()); copyInPlay.setCloneOrigin(host); - sa.getHostCard().addClone(copyInPlay); if (!pumpKeywords.isEmpty()) { copyInPlay.addChangedCardKeywords(pumpKeywords, Lists.newArrayList(), false, false, timestamp); } diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index cd54eab13f7..ece24a74a2f 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -101,7 +101,7 @@ public class Card extends GameEntity implements Comparable { // cards attached or otherwise linked to this card private CardCollection hauntedBy, devouredCards, delvedCards, convokedCards, imprintedCards, encodedCards; - private CardCollection mustBlockCards, clones, gainControlTargets, chosenCards, blockedThisTurn, blockedByThisTurn; + private CardCollection mustBlockCards, gainControlTargets, chosenCards, blockedThisTurn, blockedByThisTurn; // if this card is attached or linked to something, what card is it currently attached to private Card encoding, cloneOrigin, haunting, effectSource, pairedWith, meldedWith; @@ -1031,22 +1031,6 @@ public class Card extends GameEntity implements Comparable { public final GameEntity getMustAttackEntityThisTurn() { return mustAttackEntityThisTurn; } public final void setMustAttackEntityThisTurn(GameEntity entThisTurn) { mustAttackEntityThisTurn = entThisTurn; } - public final CardCollectionView getClones() { - return CardCollection.getView(clones); - } - public final void setClones(final Iterable clones0) { - clones = clones0 == null ? null : new CardCollection(clones0); - } - public final void addClone(final Card c) { - if (clones == null) { - clones = new CardCollection(); - } - clones.add(c); - } - public final void clearClones() { - clones = null; - } - public final Card getCloneOrigin() { return cloneOrigin; } diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index 2f9114b4143..e353efe0382 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -95,7 +95,6 @@ public class CardFactory { out.setAttachedCards(in.getAttachedCards()); out.setEntityAttachedTo(in.getEntityAttachedTo()); - out.setClones(in.getClones()); out.setCastSA(in.getCastSA()); for (final Object o : in.getRemembered()) { out.addRemembered(o); 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 d8f143470a6..b6db1c2e940 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -269,7 +269,6 @@ public final class CardUtil { newCopy.setAttachedCards(in.getAttachedCards()); newCopy.setEntityAttachedTo(in.getEntityAttachedTo()); - newCopy.setClones(in.getClones()); newCopy.setHaunting(in.getHaunting()); newCopy.setCopiedPermanent(in.getCopiedPermanent()); for (final Card haunter : in.getHauntedBy()) { diff --git a/forge-game/src/main/java/forge/game/zone/MagicStack.java b/forge-game/src/main/java/forge/game/zone/MagicStack.java index 53e8e676291..a449a07789f 100644 --- a/forge-game/src/main/java/forge/game/zone/MagicStack.java +++ b/forge-game/src/main/java/forge/game/zone/MagicStack.java @@ -569,13 +569,6 @@ public class MagicStack /* extends MyObservable */ implements Iterable 0) { - for (final Card c : game.getCardsIn(ZoneType.Battlefield)) { - if (c.equals(tmp)) { - c.setClones(tmp.getClones()); - } - } - } // xManaCostPaid will reset when cast the spell, comment out to fix Venarian Gold // sa.getHostCard().setXManaCostPaid(0); } diff --git a/forge-gui/res/cardsfolder/s/seance.txt b/forge-gui/res/cardsfolder/s/seance.txt index b90424950a9..c0411422466 100644 --- a/forge-gui/res/cardsfolder/s/seance.txt +++ b/forge-gui/res/cardsfolder/s/seance.txt @@ -3,10 +3,7 @@ ManaCost:2 W W Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigExile | TriggerDescription$ At the beginning of each upkeep, you may exile target creature card from your graveyard. If you do, create a token that's a copy of that card, except it's a Spirit in addition to its other types. Exile it at the beginning of the next end step. SVar:TrigExile:DB$ ChangeZone | RememberChanged$ True | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Creature.YouCtrl | ChangeNum$ 1 | SubAbility$ DBCopy -SVar:DBCopy:DB$ CopyPermanent | Defined$ Remembered | SubAbility$ DBAnimate | SpellDescription$ Create a token that's a copy of that card, except it's a Spirit in addition to its other types. Exile it at the beginning of the next end step. -SVar:DBAnimate:DB$ Animate | Defined$ Clones | Types$ Spirit | sVars$ SneakAttackEOT | SubAbility$ DelTrig -SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End Of Turn | Execute$ DBExile | RememberObjects$ Clones | TriggerDescription$ CARDNAME - Exile the token at the beginning of the next end step. | SubAbility$ DBCleanup | AILogic$ Always -SVar:DBExile:DB$ ChangeZone | Defined$ DelayTriggerRemembered | Origin$ Battlefield | Destination$ Exile +SVar:DBCopy:DB$ CopyPermanent | Defined$ Remembered | AddTypes$ Spirit | AtEOT$ Exile | AddSVars$ SneakAttackEOT | SubAbility$ DBCleanup | SpellDescription$ Create a token that's a copy of that card, except it's a Spirit in addition to its other types. Exile it at the beginning of the next end step. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True AI:RemoveDeck:All SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True From 765b0e4625efe839e83737375ad28186df2baa73 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 27 Dec 2018 21:19:45 +0300 Subject: [PATCH 544/901] - XMage cube ports update (2 new cubes). --- .../cube/Adam Styborkski's Pauper Cube.dck | 150 +++-- forge-gui/res/cube/Ben's Cube (720 cards).dck | 164 +++--- forge-gui/res/cube/Cube Tutor 360 Pauper.dck | 72 +-- forge-gui/res/cube/Cube Tutor 720.dck | 144 ++--- .../res/cube/Eric Klug's Pro Tour Cube.dck | 86 +-- ...laume Matignon's Jenny's-Johnny's Cube.dck | 114 ++-- .../res/cube/Jim Davis's Cube (469 cards).dck | 102 ++-- .../res/cube/Jospeh Vasoli's Peasant Cube.dck | 84 +-- .../res/cube/Legendary Cube (598 cards).dck | 70 +-- .../Legendary Cube April 2016 (566 cards).dck | 62 +- forge-gui/res/cube/MTGO Cube March 2014.dck | 126 ++-- .../res/cube/MTGO Legacy Cube (600 cards).dck | 116 ++-- ...TGO Legacy Cube April 2017 (600 cards).dck | 112 ++-- ... Legacy Cube February 2018 (600 cards).dck | 110 ++-- ...O Legacy Cube January 2016 (600 cards).dck | 110 ++-- ...O Legacy Cube January 2017 (600 cards).dck | 106 ++-- ...TGO Legacy Cube March 2015 (600 cards).dck | 118 ++-- ...Legacy Cube September 2015 (600 cards).dck | 114 ++-- ...Legacy Cube September 2016 (600 cards).dck | 104 ++-- forge-gui/res/cube/MTGO Vintage Cube 2013.dck | 90 +-- forge-gui/res/cube/MTGO Vintage Cube 2014.dck | 112 ++-- forge-gui/res/cube/MTGO Vintage Cube 2015.dck | 114 ++-- forge-gui/res/cube/MTGO Vintage Cube 2016.dck | 112 ++-- .../cube/MTGO Vintage Cube December 2017.dck | 110 ++-- .../cube/MTGO Vintage Cube December 2018.dck | 543 ++++++++++++++++++ .../res/cube/MTGO Vintage Cube June 2016.dck | 108 ++-- .../res/cube/MTGO Vintage Cube June 2017.dck | 108 ++-- .../res/cube/MTGO Vintage Cube June 2018.dck | 542 +++++++++++++++++ .../cube/MTGO Vintage Cube November 2016.dck | 108 ++-- forge-gui/res/cube/Modern Cube 2017.dck | 100 ++-- forge-gui/res/cube/Mono Blue Cube.dck | 40 +- .../res/cube/Sam Black's No Search Cube.dck | 100 ++-- forge-gui/res/cube/The Peasant's Toolbox.dck | 102 ++-- ...othee Simonot's Twisted Color Pie Cube.dck | 98 ++-- .../res/cube/www.mtgcube.com (502 cards).dck | 100 ++-- .../MTGO Vintage Cube December 2018.draft | 6 + .../draft/MTGO Vintage Cube June 2018.draft | 6 + 37 files changed, 2826 insertions(+), 1737 deletions(-) create mode 100644 forge-gui/res/cube/MTGO Vintage Cube December 2018.dck create mode 100644 forge-gui/res/cube/MTGO Vintage Cube June 2018.dck create mode 100644 forge-gui/res/draft/MTGO Vintage Cube December 2018.draft create mode 100644 forge-gui/res/draft/MTGO Vintage Cube June 2018.draft diff --git a/forge-gui/res/cube/Adam Styborkski's Pauper Cube.dck b/forge-gui/res/cube/Adam Styborkski's Pauper Cube.dck index a1a7e888f58..27e970d7ab3 100644 --- a/forge-gui/res/cube/Adam Styborkski's Pauper Cube.dck +++ b/forge-gui/res/cube/Adam Styborkski's Pauper Cube.dck @@ -1,14 +1,14 @@ [metadata] Name=Adam Styborkski's Pauper Cube [main] -1 Act of Treason|A25 +1 Academy Journeymage|DOM +1 Act of Treason|M19 1 Adventuring Gear|ZEN +1 Aerie Bowmasters|DTK 1 Aerie Ouphes|EVE 1 Aether Adept|M12 -1 Aethersnipe|MM2 +1 Aethersnipe|UMA 1 Agony Warp|MM3 -1 Aim High|SOI -1 Ambuscade|HOU 1 Ambush Viper|ISD 1 Angelic Purge|SOI 1 Arachnus Web|MM3 @@ -24,9 +24,9 @@ Name=Adam Styborkski's Pauper Cube 1 Aven Riftwatcher|EMA 1 Aven Surveyor|FRF 1 Azorius Guildgate|MM3 -1 Baleful Eidolon|THS +1 Baloth Gorger|DOM 1 Barbed Lightning|DST -1 Basking Rootwalla|VMA +1 Basking Rootwalla|UMA 1 Battle Screech|VMA 1 Beetleback Chief|EMA 1 Beetleform Mage|DGM @@ -35,33 +35,30 @@ Name=Adam Styborkski's Pauper Cube 1 Blazing Torch|ISD 1 Blightning|A25 1 Blinding Beam|MMA +1 Blink of an Eye|DOM 1 Bloodfell Caves|EMA 1 Blossoming Sands|EMA 1 Bonded Construct|ORI 1 Bonds of Faith|ISD 1 Bonesplitter|MMA -1 Borderland Marauder|IMA -1 Boros Guildgate|MM3 +1 Boros Guildgate|GRN 1 Borrowed Grace|EMN 1 Branching Bolt|ALA -1 Brazen Buccaneers|XLN 1 Brazen Wolves|EMN 1 Burning-Tree Emissary|MM3 1 Burst Lightning|MM2 1 Butcher Ghoul|AVR -1 Byway Courier|SOI 1 Cage of Hands|CHK 1 Calcite Snapper|WWK 1 Call of the Conclave|MM3 +1 Call the Cavalry|DOM 1 Capsize|TPR 1 Cartouche of Strength|AKH -1 Cathodion|MM2 1 Cavern Harpy|PLS 1 Centaur Healer|MM3 1 Chain Lightning|EMA -1 Chainer's Edict|TOR -1 Chatter of the Squirrel|ODY -1 Cinder Barrens|OGW +1 Chainer's Edict|UMA +1 Cinder Barrens|M19 1 Citanul Woodreaders|MMA 1 Claustrophobia|IMA 1 Clay Statue|5ED @@ -73,8 +70,8 @@ Name=Adam Styborkski's Pauper Cube 1 Consume Strength|APC 1 Corrupted Zendikon|WWK 1 Counterspell|A25 +1 Court Hussar|A25 1 Crippling Fatigue|TOR -1 Crow of Dark Tidings|SOI 1 Crypt Rats|7ED 1 Crystallization|ARB 1 Cunning Strike|FRF @@ -83,27 +80,26 @@ Name=Adam Styborkski's Pauper Cube 1 Daring Skyjek|GTC 1 Dauntless Cathar|A25 1 Dead Reveler|IMA -1 Dead Weight|SOI +1 Dead Weight|GRN 1 Deadeye Tormentor|XLN -1 Death Denied|MM2 +1 Death Denied|UMA +1 Deathbloom Thallid|DOM 1 Deep Analysis|EMA 1 Deprive|ROE 1 Depths of Desire|XLN 1 Deputy of Acquittals|MM3 1 Desert|TSB -1 Desperate Sentry|EMN 1 Devour Flesh|GTC 1 Diabolic Edict|A25 -1 Dimir Guildgate|MM3 +1 Dimir Guildgate|GRN 1 Dinrova Horror|MM3 -1 Dire Fleet Hoarder|XLN 1 Disfigure|A25 1 Dismal Backwater|EMA 1 Disowned Ancestor|KTK 1 Doom Blade|IMA 1 Doomed Traveler|IMA -1 Drag Under|EMN 1 Dragon Fodder|MM3 +1 Dusk Legion Zealot|A25 1 Dynacharge|MM3 1 Eager Construct|KLD 1 Eldrazi Devastator|BFZ @@ -114,12 +110,12 @@ Name=Adam Styborkski's Pauper Cube 1 Emperor Crocodile|EMA 1 Epic Confrontation|A25 1 Errant Ephemeron|MMA -1 Esper Cormorants|CFX 1 Evincar's Justice|TMP 1 Evolving Wilds|RIX 1 Faceless Butcher|TSB -1 Faith's Fetters|EMA +1 Faith's Fetters|UMA 1 Falkenrath Noble|MM3 +1 Fanatical Firebrand|RIX 1 Feeling of Dread|ISD 1 Fervent Cathar|EMA 1 Firebolt|EMA @@ -127,28 +123,29 @@ Name=Adam Styborkski's Pauper Cube 1 Flayer Husk|MM2 1 Flurry of Horns|JOU 1 Forked Bolt|ROE -1 Forsaken Sanctuary|RIX +1 Forsaken Sanctuary|M19 1 Fortify|MM2 -1 Foul Orchard|RIX +1 Foul Orchard|M19 +1 Frenzied Goblin|A25 +1 Frilled Deathspitter|RIX 1 Frilled Oculus|GTC 1 Frostburn Weird|RTR +1 Fungal Infection|DOM 1 Gathan Raiders|FUT 1 Gather the Townsfolk|DKA -1 Ghastly Demise|ODY 1 Ghirapur Gearcrafter|ORI -1 Ghitu Slinger|EMA 1 Giant Growth|A25 1 Gideon's Lawkeeper|MM3 1 Glint-Sleeve Artisan|KLD 1 Gnawing Zombie|MM3 1 Goblin Freerunner|OGW 1 Goblin Heelcutter|FRF -1 Gods Willing|A25 +1 Goblin Trailblazer|RIX +1 Gods Willing|UMA 1 Goldmeadow Harrier|LRW -1 Golgari Guildgate|MM3 -1 Gravedigger|AKH +1 Golgari Guildgate|GRN +1 Gravedigger|M19 1 Gray Merchant of Asphodel|THS -1 Grazing Whiptail|XLN 1 Grim Contest|FRF 1 Grisly Salvage|RTR 1 Grixis Slavedriver|MM3 @@ -157,53 +154,54 @@ Name=Adam Styborkski's Pauper Cube 1 Guardian Automaton|ORI 1 Guardian Idol|IMA 1 Guardian of the Guildpact|DIS -1 Gurmag Angler|FRF +1 Gurmag Angler|UMA 1 Halimar Wavewatch|ROE 1 Harrow|TPR 1 Harsh Sustenance|FRF -1 Highland Lake|RIX -1 Hissing Iguanar|ALA -1 Hooting Mandrills|KTK -1 Humble|EMA +1 Highland Lake|M19 +1 Hissing Iguanar|UMA +1 Hooting Mandrills|UMA +1 Hordeling Outburst|A25 1 Imperiosaur|MMA -1 Incinerate|M12 1 Inner-Flame Acolyte|LRW 1 Insolent Neonate|SOI 1 Into the Roil|ZEN 1 Isolation Zone|OGW 1 Ivy Elemental|IMA 1 Izzet Chronarch|GPT -1 Izzet Guildgate|MM3 +1 Izzet Guildgate|GRN +1 Jackal Pup|A25 1 Jilt|APC 1 Journey to Nowhere|ZEN 1 Jungle Hollow|EMA -1 Kabuto Moth|CHK +1 Jungleborn Pioneer|RIX 1 Keldon Marauders|EMA +1 Keldon Overseer|DOM +1 Keldon Raider|DOM 1 Kingpin's Pet|GTC +1 Kitesail Corsair|RIX 1 Kor Skyfisher|MM3 1 Kozilek's Channeler|BFZ 1 Krenko's Command|M13 1 Krosan Tusker|A25 -1 Kruin Striker|AVR 1 Lash Out|LRW -1 Last Gasp|RAV +1 Last Gasp|UMA 1 Leave in the Dust|AER 1 Leonin Bola|DST 1 Lifecraft Cavalry|AER 1 Lightning Bolt|A25 1 Liliana's Specter|CNS -1 Lotus Path Djinn|FRF 1 Loyal Pegasus|BNG 1 Magma Jet|MM3 1 Makeshift Mauler|ISD 1 Man-o'-War|A25 1 Mana Leak|IMA -1 Manticore of the Gauntlet|AKH 1 Mardu Hordechief|KTK 1 Mardu Skullhunter|KTK +1 Martyr of Dusk|RIX 1 Maul Splicer|NPH 1 Maze of Ith|EMA -1 Meandering River|OGW +1 Meandering River|M19 1 Mental Note|JUD 1 Midnight Scavengers|EMN 1 Mind Stone|IMA @@ -222,7 +220,6 @@ Name=Adam Styborkski's Pauper Cube 1 Mulldrifter|MM2 1 Nameless Inversion|MM2 1 Narcolepsy|MM2 -1 Necromancer's Assistant|M15 1 Nessian Asp|THS 1 Nest Robber|XLN 1 Nezumi Cutthroat|A25 @@ -233,45 +230,41 @@ Name=Adam Styborkski's Pauper Cube 1 Oona's Grace|EMA 1 Orzhov Guildgate|MM3 1 Otherworldly Journey|MM2 +1 Overgrown Armasaur|RIX 1 Pacifism|A25 1 Paladin of the Bloodstained|XLN 1 Peema Outrider|KLD 1 Penumbra Spider|MM3 -1 Peregrine Drake|EMA 1 Perilous Myr|A25 1 Pestermite|MMA 1 Pestilence|6ED -1 Phantom Nomad|VMA -1 Phantom Tiger|IMA -1 Pharika's Chosen|JOU 1 Phyrexian Rager|IMA 1 Pillory of the Sleepless|A25 1 Pit Fight|GTC 1 Pit Keeper|MM3 1 Plated Geopede|ZEN -1 Plover Knights|LRW 1 Porcelain Legionnaire|NPH 1 Pounce|XLN 1 Predatory Nightstalker|VMA 1 Preordain|M11 -1 Prey Upon|AER +1 Prey Upon|UMA 1 Prismatic Strands|JUD 1 Pristine Talisman|IMA 1 Prophetic Prism|A25 -1 Pulse of Murasa|OGW +1 Pulse of Murasa|UMA 1 Pursue Glory|AKH 1 Putrid Leech|ARB 1 Pyrotechnics|FRF 1 Qasali Pridemage|ARB 1 Raise the Alarm|EMA 1 Rakdos Guildgate|MM3 -1 Rally the Peasants|EMA +1 Rally the Peasants|UMA 1 Rampant Growth|MM2 1 Rancor|A25 1 Ranger's Guile|M14 1 Ray of Command|5ED 1 Razorfin Hunter|APC -1 Reckless Charge|EMA +1 Reckless Charge|UMA 1 Recoil|INV 1 Remove Soul|10E 1 Rend Flesh|CHK @@ -279,31 +272,33 @@ Name=Adam Styborkski's Pauper Cube 1 Renegade Freighter|KLD 1 Rift Bolt|IMA 1 Rishadan Airship|MMQ -1 Ronin Houndmaster|CHK 1 Rugged Highlands|EMA 1 Runed Servitor|IMA 1 Rushing River|PLS +1 Ruthless Ripper|A25 1 Sailor of Means|RIX 1 Sakura-Tribe Elder|CNS 1 Sandsteppe Outcast|FRF 1 Sangrite Backlash|ARB +1 Saproling Migration|DOM 1 Sarkhan's Rage|DTK 1 Savage Punch|KTK +1 Savannah Lions|A25 1 Scatter the Seeds|MM2 1 Scion Summoner|OGW 1 Scion of the Wild|MM2 1 Scoured Barrens|EMA 1 Scourge Devil|MM3 1 Screeching Skaab|EMA -1 Scuzzback Marauders|SHM +1 Scuzzback Marauders|UMA 1 Search for Tomorrow|IMA 1 Searing Blaze|WWK 1 Seeker of Insight|AKH 1 Seeker of the Way|IMA -1 Selesnya Guildgate|MM3 -1 Sentinel Spider|EMA +1 Selesnya Guildgate|GRN 1 Separatist Voidmage|ORI 1 Seraph of Dawn|AVR +1 Sergeant-at-Arms|DOM 1 Serrated Arrows|TSB 1 Shaper Parasite|PLC 1 Sheer Drop|BFZ @@ -313,37 +308,35 @@ Name=Adam Styborkski's Pauper Cube 1 Silent Departure|EMA 1 Simic Guildgate|MM3 1 Skirk Marauder|LGN -1 Skyknight Legionnaire|MM3 +1 Skyknight Legionnaire|GRN 1 Slash Panther|NPH 1 Snakeform|EVE 1 Snap|ULG 1 Soul Manipulation|MM3 +1 Soul of the Rapids|RIX 1 Soulstinger|AKH +1 Sparring Construct|DOM 1 Sphere of the Suns|MM2 1 Spike Jester|MM3 -1 Spined Thopter|NPH -1 Splatter Thug|IMA 1 Staggershock|IMA 1 Star Compass|IMA -1 Stitched Drake|ISD -1 Stone Quarry|RIX +1 Stitched Drake|UMA +1 Stone Quarry|M19 1 Storm Fleet Pyromancer|XLN 1 Stormfront Pegasus|M12 1 Stormscape Apprentice|INV -1 Strip Mine|VMA 1 Striped Riverwinder|HOU -1 Submerged Boneyard|OGW +1 Stronghold Confessor|DOM +1 Submerged Boneyard|M19 1 Sultai Scavenger|KTK 1 Suppression Bonds|ORI 1 Swiftwater Cliffs|EMA 1 Sylvan Might|EMA 1 Sylvok Lifestaff|SOM -1 Tah-Crop Elite|AKH 1 Temporal Isolation|TSP 1 Tenement Crasher|RTR 1 Terminate|MM3 -1 Terramorphic Expanse|MMA -1 Test of Faith|MMA +1 Terramorphic Expanse|UMA 1 Thorn of the Black Rose 1 Thornweald Archer|EMA 1 Thornwood Falls|EMA @@ -351,22 +344,20 @@ Name=Adam Styborkski's Pauper Cube 1 Thraben Inspector|SOI 1 Thrill-Kill Assassin|IMA 1 Thundering Giant|M15 -1 Thundering Tanadon|NPH 1 Thunderous Wrath|MM3 -1 Timber Gorge|OGW +1 Timber Gorge|M19 1 Time to Feed|THS 1 Tithe Drinker|DGM 1 Totem-Guide Hartebeest|ORI 1 Tragic Slip|EMA 1 Tranquil Cove|EMA -1 Tranquil Expanse|OGW -1 Travel Preparations|ISD -1 Treasure Cruise|KTK +1 Tranquil Expanse|M19 +1 Travel Preparations|UMA +1 Treasure Cruise|UMA 1 Triplicate Spirits|M15 1 Typhoid Rats|FRF -1 Ulamog's Crusher|MM2 +1 Ulamog's Crusher|UMA 1 Ulvenwald Captive|EMN -1 Undying Rage|EMA 1 Unearth|A25 1 Unmake|EVE 1 Vampire Interloper|ISD @@ -378,27 +369,28 @@ Name=Adam Styborkski's Pauper Cube 1 Vulshok Sorcerer|5DN 1 Vulturous Aven|DTK 1 Wakedancer|EMA -1 Walker of the Grove|MMA +1 Walker of the Grove|UMA 1 Wall of Roots|IMA 1 War Flare|FRF 1 Warden of Evos Isle|EMA 1 Warped Landscape|SOI 1 Warren Pilferers|MMA 1 Wasteland Scorpion|AKH +1 Waterknot|RIX 1 Wayfarer's Bauble|MM2 1 Werebear|EMA 1 Whitemane Lion|A25 1 Wild Instincts|ORI -1 Wild Mongrel|VMA +1 Wild Mongrel|UMA 1 Wild Nacatl|ALA 1 Wildsize|IMA 1 Will-Forged Golem|M15 1 Wind-Scarred Crag|EMA -1 Winds of Rebuke|AKH 1 Winged Coatl|ARB 1 Wojek Halberdiers|GTC -1 Woodland Stream|RIX +1 Woodland Stream|M19 1 Wrecking Ball|MM2 1 Wretched Gryff|EMN 1 Yavimaya Elder|VMA +1 Yavimaya Sapherd|DOM 1 Yotian Soldier|MRD diff --git a/forge-gui/res/cube/Ben's Cube (720 cards).dck b/forge-gui/res/cube/Ben's Cube (720 cards).dck index 6d975b47012..cdf40305a54 100644 --- a/forge-gui/res/cube/Ben's Cube (720 cards).dck +++ b/forge-gui/res/cube/Ben's Cube (720 cards).dck @@ -17,12 +17,12 @@ Name=Ben's Cube (720 cards) 1 Ajani, Caller of the Pride|M14 1 Akroma, Angel of Wrath|TSB 1 Akroma's Vengeance|A25 -1 All Is Dust|MM2 +1 All Is Dust|UMA 1 Ambition's Cost|8ED 1 Ancestral Recall|VMA 1 Ancestral Vision|IMA 1 Ancient Grudge|MM3 -1 Ancient Tomb|VMA +1 Ancient Tomb|UMA 1 Angel of Serenity|RTR 1 Anger of the Gods|IMA 1 Animate Dead|EMA @@ -46,7 +46,7 @@ Name=Ben's Cube (720 cards) 1 Badlands|VMA 1 Balance|EMA 1 Baleful Strix|EMA -1 Banefire|MM2 +1 Banefire|M19 1 Baneslayer Angel|M11 1 Basalt Monolith|3ED 1 Basilisk Collar|MM3 @@ -55,7 +55,7 @@ Name=Ben's Cube (720 cards) 1 Beast Within|NPH 1 Birds of Paradise|M12 1 Birthing Pod|NPH -1 Bitterblossom|MM2 +1 Bitterblossom|UMA 1 Bituminous Blast|ARB 1 Black Lotus|VMA 1 Black Sun's Zenith|MBS @@ -86,7 +86,7 @@ Name=Ben's Cube (720 cards) 1 Bribery|8ED 1 Brimaz, King of Oreskos|BNG 1 Brimstone Volley|CNS -1 Buried Alive|ODY +1 Buried Alive|UMA 1 Burning-Tree Emissary|MM3 1 Burst Lightning|MM2 1 Cabal Coffers|TOR @@ -95,10 +95,10 @@ Name=Ben's Cube (720 cards) 1 Careful Consideration|MMA 1 Carnophage|TPR 1 Cataclysm|TPR -1 Celestial Colonnade|WWK +1 Celestial Colonnade|UMA 1 Chain Lightning|EMA 1 Chained to the Rocks|THS -1 Chainer's Edict|TOR +1 Chainer's Edict|UMA 1 Chameleon Colossus|MOR 1 Chandra, the Firebrand|M13 1 Chandra's Phoenix|M14 @@ -108,7 +108,7 @@ Name=Ben's Cube (720 cards) 1 Chrome Mox|EMA 1 City of Brass|MMA 1 City of Traitors|TPR -1 Clifftop Retreat|ISD +1 Clifftop Retreat|DOM 1 Cloudgoat Ranger|MMA 1 Cloudthresher|LRW 1 Coalition Relic|A25 @@ -118,7 +118,7 @@ Name=Ben's Cube (720 cards) 1 Condemn|M11 1 Consecrated Sphinx|IMA 1 Consuming Vapors|ROE -1 Containment Priest +1 Containment Priest|UMA 1 Control Magic|EMA 1 Corpse Dance|TPR 1 Council's Judgment|CNS @@ -126,8 +126,8 @@ Name=Ben's Cube (720 cards) 1 Countryside Crusher|MMA 1 Courser of Kruphix|A25 1 Craterhoof Behemoth|MM3 -1 Creeping Tar Pit|WWK -1 Crucible of Worlds|10E +1 Creeping Tar Pit|UMA +1 Crucible of Worlds|M19 1 Crypt Ghast|GTC 1 Cryptic Command|IMA 1 Crystal Shard|MRD @@ -148,16 +148,16 @@ Name=Ben's Cube (720 cards) 1 Decree of Justice|A25 1 Deep Analysis|EMA 1 Defense of the Heart|ULG -1 Demonic Tutor|VMA +1 Demonic Tutor|UMA 1 Deranged Hermit|VMA 1 Desecration Demon|MM3 1 Desertion|6ED 1 Detention Sphere|RTR 1 Devil's Play|ISD -1 Devoted Druid|SHM +1 Devoted Druid|UMA 1 Diabolic Servitude|USG -1 Dig Through Time|KTK -1 Diregraf Ghoul|ISD +1 Dig Through Time|UMA +1 Diregraf Ghoul|M19 1 Disciple of Bolas|M13 1 Disenchant|A25 1 Disfigure|A25 @@ -171,7 +171,7 @@ Name=Ben's Cube (720 cards) 1 Drowned Catacomb|XLN 1 Dryad Militant|RTR 1 Dualcaster Mage|EMA -1 Duress|IMA +1 Duress|M19 1 Duskmantle Seer|GTC 1 Earthquake|M10 1 Edric, Spymaster of Trest|VMA @@ -186,34 +186,34 @@ Name=Ben's Cube (720 cards) 1 Ember Hauler|M11 1 Emeria Angel|IMA 1 Empty the Warrens|MMA -1 Emrakul, the Aeons Torn|MM2 +1 Emrakul, the Aeons Torn|UMA 1 Enclave Cryptologist|ROE -1 Engineered Explosives|MMA +1 Engineered Explosives|UMA 1 Enlightened Tutor|EMA -1 Entomb|EMA +1 Entomb|UMA 1 Entreat the Angels|MM3 1 Epochrasite|MMA -1 Essence Scatter|AKH +1 Essence Scatter|M19 1 Eternal Dragon|VMA -1 Eternal Witness|MMA +1 Eternal Witness|UMA 1 Everflowing Chalice|MM2 1 Evolving Wilds|RIX 1 Exhume|USG 1 Experiment One|GTC 1 Explore|MM3 1 Fact or Fiction|EMA -1 Faithless Looting|EMA -1 Faith's Fetters|EMA +1 Faithless Looting|UMA +1 Faith's Fetters|UMA 1 Falkenrath Aristocrat|MM3 1 Far // Away|DGM 1 Farseek|M13 1 Fastbond|VMA 1 Fathom Seer|A25 -1 Fauna Shaman|M11 +1 Fauna Shaman|UMA 1 Fellwar Stone|9ED -1 Fiend Hunter|A25 +1 Fiend Hunter|UMA 1 Figure of Destiny|MMA -1 Fire // Ice|APC +1 Fire // Ice|UMA 1 Fireblast|VMA 1 Firebolt|EMA 1 Firedrinker Satyr|THS @@ -223,15 +223,15 @@ Name=Ben's Cube (720 cards) 1 Flickerwisp|MM3 1 Flooded Strand|KTK 1 Forbid|TPR -1 Forbidden Alchemy|MM3 +1 Forbidden Alchemy|UMA 1 Force of Will|EMA -1 Frantic Search|VMA +1 Frantic Search|UMA 1 Frenzied Goblin|A25 1 Frost Titan|M12 1 Future Sight|EMA 1 Fyndhorn Elves|VMA 1 Gaea's Cradle|USG -1 Gamble|EMA +1 Gamble|UMA 1 Garruk Relentless|ISD 1 Garruk Wildspeaker|M11 1 Garruk, Primal Hunter|M13 @@ -245,10 +245,10 @@ Name=Ben's Cube (720 cards) 1 Gideon's Lawkeeper|MM3 1 Gifts Ungiven|MM3 1 Gilded Drake|USG -1 Gilded Lotus|M13 +1 Gilded Lotus|DOM 1 Gitaxian Probe|NPH 1 Glacial Fortress|XLN -1 Glen Elendra Archmage|MMA +1 Glen Elendra Archmage|UMA 1 Gnarled Scarhide|JOU 1 Go for the Throat|MBS 1 Goblin Bushwhacker|ZEN @@ -281,7 +281,7 @@ Name=Ben's Cube (720 cards) 1 Hero of Bladehold|MBS 1 Hero of Oxid Ridge|MBS 1 Hero's Downfall|THS -1 Hinterland Harbor|ISD +1 Hinterland Harbor|DOM 1 Hokori, Dust Drinker|BOK 1 Honor of the Pure|M12 1 Huntmaster of the Fells|DKA @@ -301,7 +301,7 @@ Name=Ben's Cube (720 cards) 1 Iona, Shield of Emeria|MM2 1 Isamaru, Hound of Konda|CHK 1 Isochron Scepter|EMA -1 Isolated Chapel|ISD +1 Isolated Chapel|DOM 1 Izzet Charm|MM3 1 Jace Beleren|M11 1 Jace, Architect of Thought|RTR @@ -311,43 +311,43 @@ Name=Ben's Cube (720 cards) 1 Joraga Treespeaker|ROE 1 Journey to Nowhere|ZEN 1 Kami of Ancient Law|MM2 -1 Karakas|EMA +1 Karakas|UMA 1 Kargan Dragonlord|ROE 1 Karmic Guide|EMA -1 Karn Liberated|MM2 +1 Karn Liberated|UMA 1 Keldon Champion|EMA 1 Keldon Marauders|EMA 1 Kiki-Jiki, Mirror Breaker|IMA 1 Kiora, the Crashing Wave|BNG 1 Kiora's Follower|BNG 1 Kira, Great Glass-Spinner|MMA -1 Kitchen Finks|MMA +1 Kitchen Finks|UMA 1 Kjeldoran Outpost|VMA 1 Knight of Infamy|M13 1 Knight of Meadowgrain|LRW 1 Knight of the Reliquary|IMA -1 Kodama's Reach|MMA +1 Kodama's Reach|UMA 1 Kokusho, the Evening Star|MMA 1 Kolaghan's Command|DTK 1 Kor Sanctifiers|ZEN 1 Kor Skyfisher|MM3 1 Koth of the Hammer|SOM -1 Kozilek, Butcher of Truth|MM2 +1 Kozilek, Butcher of Truth|UMA 1 Land Tax|4ED -1 Lavaclaw Reaches|WWK +1 Lavaclaw Reaches|UMA 1 Legacy's Allure|TMP 1 Library of Alexandria|VMA -1 Life from the Loam|MMA +1 Life from the Loam|UMA 1 Lightning Bolt|A25 1 Lightning Greaves|MRD 1 Lightning Helix|IMA 1 Lightning Mauler|AVR -1 Lightning Strike|XLN -1 Liliana of the Veil|MM3 +1 Lightning Strike|M19 +1 Liliana of the Veil|UMA 1 Liliana Vess|M15 1 Lingering Souls|MM3 1 Living Death|A25 -1 Llanowar Elves|EMA +1 Llanowar Elves|DOM 1 Lodestone Golem|MM2 1 Looter il-Kor|TSP 1 Lotus Bloom|MMA @@ -356,14 +356,14 @@ Name=Ben's Cube (720 cards) 1 Loyal Cathar|DKA 1 Loyal Retainers|PTK 1 Luminarch Ascension|A25 -1 Maelstrom Pulse|MMA +1 Maelstrom Pulse|UMA 1 Magma Jet|MM3 1 Makeshift Mannequin|LRW 1 Mana Confluence|JOU 1 Mana Crypt|EMA 1 Mana Drain|IMA 1 Mana Leak|IMA -1 Mana Vault|VMA +1 Mana Vault|UMA 1 Manamorphose|MMA 1 Man-o'-War|A25 1 Mardu Woe-Reaper|FRF @@ -377,7 +377,7 @@ Name=Ben's Cube (720 cards) 1 Meloku the Clouded Mirror|MMA 1 Memory Jar|VMA 1 Memory Lapse|EMA -1 Mentor of the Meek|ISD +1 Mentor of the Meek|M19 1 Mesmeric Fiend|A25 1 Mikaeus, the Lunarch|ISD 1 Mimic Vat|SOM @@ -410,7 +410,7 @@ Name=Ben's Cube (720 cards) 1 Mox Sapphire|VMA 1 Mulldrifter|MM2 1 Murderous Cut|KTK -1 Murderous Redcap|MMA +1 Murderous Redcap|UMA 1 Mutavault|M14 1 Myr Battlesphere|SOM 1 Mystic Snake|A25 @@ -418,7 +418,7 @@ Name=Ben's Cube (720 cards) 1 Nantuko Shade|M11 1 Narcolepsy|MM2 1 Natural Order|EMA -1 Naturalize|RIX +1 Naturalize|M19 1 Necromancy|VIS 1 Necropotence|IMA 1 Negate|RIX @@ -431,20 +431,20 @@ Name=Ben's Cube (720 cards) 1 Night's Whisper|EMA 1 Nightscape Familiar|VMA 1 Nissa, Worldwaker|M15 -1 Noble Hierarch|MM2 +1 Noble Hierarch|UMA 1 Oath of Druids|TPR 1 Oblivion Ring|MM2 1 Obstinate Baloth|IMA 1 Obzedat, Ghost Council|GTC 1 Ohran Viper|CSP -1 Omenspeaker|THS -1 Omniscience|M13 +1 Omenspeaker|M19 +1 Omniscience|M19 1 Oona's Prowler|LRW 1 Opposition|7ED -1 Opt|XLN +1 Opt|DOM 1 Oracle of Mul Daya|ZEN 1 Overgrown Battlement|IMA -1 Overgrown Tomb|RTR +1 Overgrown Tomb|GRN 1 Overrun|TPR 1 Pack Rat|RTR 1 Pact of Negation|A25 @@ -464,7 +464,7 @@ Name=Ben's Cube (720 cards) 1 Plateau|VMA 1 Plated Geopede|ZEN 1 Plow Under|8ED -1 Plumeveil|MMA +1 Plumeveil|UMA 1 Polluted Delta|KTK 1 Polukranos, World Eater|THS 1 Ponder|M12 @@ -474,7 +474,7 @@ Name=Ben's Cube (720 cards) 1 Primal Command|MM3 1 Primeval Titan|IMA 1 Primordial Hydra|M13 -1 Prismatic Lens|EMA +1 Prismatic Lens|UMA 1 Pristine Talisman|IMA 1 Profane Command|MM2 1 Prognostic Sphinx|THS @@ -487,7 +487,7 @@ Name=Ben's Cube (720 cards) 1 Putrid Leech|ARB 1 Pyroclasm|A25 1 Qasali Pridemage|ARB -1 Raging Ravine|WWK +1 Raging Ravine|UMA 1 Rakdos Cackler|RTR 1 Ral Zarek|DGM 1 Rampant Growth|MM2 @@ -495,17 +495,17 @@ Name=Ben's Cube (720 cards) 1 Ranger of Eos|MM3 1 Ravages of War|PTK 1 Ravenous Baboons|EXO -1 Reanimate|TPR -1 Reckless Charge|EMA +1 Reanimate|UMA +1 Reckless Charge|UMA 1 Reckless Waif|ISD -1 Reclamation Sage|M15 +1 Reclamation Sage|M19 1 Recurring Nightmare|TPR 1 Regrowth|A25 1 Relic of Progenitus|EMA 1 Remand|MM2 1 Repeal|IMA 1 Restoration Angel|IMA -1 Reveillark|MMA +1 Reveillark|UMA 1 Rift Bolt|IMA 1 Riftwing Cloudskate|MMA 1 Rishadan Port|A25 @@ -514,7 +514,7 @@ Name=Ben's Cube (720 cards) 1 Rootbound Crag|XLN 1 Rout|CNS 1 Rude Awakening|MMA -1 Sacred Foundry|GTC +1 Sacred Foundry|GRN 1 Sakura-Tribe Elder|CNS 1 Sarkhan, the Dragonspeaker|KTK 1 Savannah|VMA @@ -533,9 +533,9 @@ Name=Ben's Cube (720 cards) 1 Shelldock Isle|LRW 1 Sheoldred, Whispering One|IMA 1 Show and Tell|USG -1 Shriekmaw|LRW +1 Shriekmaw|UMA 1 Shrine of Burning Rage|NPH -1 Siege-Gang Commander|EMA +1 Siege-Gang Commander|DOM 1 Sign in Blood|MM2 1 Silverblade Paladin|AVR 1 Simic Sky Swallower|IMA @@ -546,7 +546,7 @@ Name=Ben's Cube (720 cards) 1 Slagstorm|MBS 1 Slaughter Pact|MMA 1 Smokestack|VMA -1 Snapcaster Mage|MM3 +1 Snapcaster Mage|UMA 1 Sneak Attack|EMA 1 Sol Ring|VMA 1 Soldier of the Pantheon|THS @@ -570,9 +570,9 @@ Name=Ben's Cube (720 cards) 1 Squee, Goblin Nabob|MMA 1 Staggershock|IMA 1 Steam Augury|THS -1 Steam Vents|RTR +1 Steam Vents|GRN 1 Stillmoon Cavalier|EVE -1 Stirring Wildwood|WWK +1 Stirring Wildwood|UMA 1 Stoke the Flames|M15 1 Stomping Ground|GTC 1 Stone Rain|9ED @@ -585,8 +585,8 @@ Name=Ben's Cube (720 cards) 1 Strip Mine|VMA 1 Stromkirk Noble|ISD 1 Student of Warfare|ROE -1 Sublime Archangel|M13 -1 Sulfur Falls|ISD +1 Sublime Archangel|UMA +1 Sulfur Falls|DOM 1 Sulfuric Vortex|EMA 1 Summoning Trap|MM3 1 Sun Titan|M12 @@ -607,16 +607,16 @@ Name=Ben's Cube (720 cards) 1 Talrand, Sky Summoner|M13 1 Tamiyo, the Moon Sage|AVR 1 Tangle Wire|NMS -1 Tarmogoyf|MM3 +1 Tarmogoyf|UMA 1 Tectonic Edge|WWK 1 Teetering Peaks|ZEN -1 Temple Garden|RTR +1 Temple Garden|GRN 1 Temporal Isolation|TSP 1 Tendrils of Agony|VMA 1 Terastodon|CNS 1 Terminate|MM3 1 Terminus|MM3 -1 Terramorphic Expanse|MMA +1 Terramorphic Expanse|UMA 1 Terror|10E 1 Tezzeret the Seeker|MM2 1 Tezzeret, Agent of Bolas|MBS @@ -629,7 +629,7 @@ Name=Ben's Cube (720 cards) 1 Thoughtseize|IMA 1 Thragtusk|MM3 1 Thran Dynamo|IMA -1 Through the Breach|CHK +1 Through the Breach|UMA 1 Thrun, the Last Troll|MBS 1 Thundermaw Hellkite|IMA 1 Tidehollow Sculler|MMA @@ -645,7 +645,7 @@ Name=Ben's Cube (720 cards) 1 Tormented Hero|THS 1 Tradewind Rider|TPR 1 Treachery|UDS -1 Treasure Cruise|KTK +1 Treasure Cruise|UMA 1 Treetop Village|10E 1 Trinket Mage|SOM 1 Triplicate Spirits|M15 @@ -654,7 +654,7 @@ Name=Ben's Cube (720 cards) 1 Tundra|VMA 1 Turnabout|VMA 1 Ugin, the Spirit Dragon|FRF -1 Ulamog, the Infinite Gyre|MM2 +1 Ulamog, the Infinite Gyre|UMA 1 Ultimate Price|DTK 1 Ulvenwald Tracker|MM3 1 Umezawa's Jitte|BOK @@ -670,11 +670,11 @@ Name=Ben's Cube (720 cards) 1 Vault of the Archangel|DKA 1 Vedalken Shackles|MMA 1 Vendilion Clique|A25 -1 Vengevine|ROE +1 Vengevine|UMA 1 Venser, Shaper Savant|MM3 1 Venser, the Sojourner|SOM 1 Verdant Catacombs|MM3 -1 Vexing Devil|AVR +1 Vexing Devil|UMA 1 Vindicate|A25 1 Voice of Resurgence|MM3 1 Voidslime|DIS @@ -687,23 +687,23 @@ Name=Ben's Cube (720 cards) 1 Wall of Blossoms|TPR 1 Wall of Denial|MM3 1 Wall of Omens|EMA -1 Wall of Reverence|CFX +1 Wall of Reverence|UMA 1 Wall of Roots|IMA 1 Wasteland|EMA 1 Waterfront Bouncer|VMA -1 Watery Grave|GTC +1 Watery Grave|GRN 1 Weathered Wayfarer|9ED 1 Werebear|EMA 1 Wheel of Fortune|VMA -1 Wickerbough Elder|EVE +1 Wickerbough Elder|UMA 1 Wildfire|MM2 1 Windbrisk Heights|LRW 1 Windswept Heath|KTK 1 Wolfir Avenger|AVR 1 Wood Elves|9ED 1 Wooded Foothills|KTK -1 Woodfall Primus|MMA -1 Woodland Cemetery|ISD +1 Woodfall Primus|UMA +1 Woodland Cemetery|DOM 1 Worn Powerstone|EMA 1 Worship|9ED 1 Wrath of God|EMA @@ -714,7 +714,7 @@ Name=Ben's Cube (720 cards) 1 Yawgmoth's Will|USG 1 Yeva, Nature's Herald|M13 1 Yosei, the Morning Star|MMA -1 Young Pyromancer|EMA +1 Young Pyromancer|UMA 1 Zealous Conscripts|MM3 1 Zo-Zu the Punisher|CHK 1 Zurgo Bellstriker|DTK diff --git a/forge-gui/res/cube/Cube Tutor 360 Pauper.dck b/forge-gui/res/cube/Cube Tutor 360 Pauper.dck index f5d452c7a98..d143fdc11e1 100644 --- a/forge-gui/res/cube/Cube Tutor 360 Pauper.dck +++ b/forge-gui/res/cube/Cube Tutor 360 Pauper.dck @@ -44,7 +44,7 @@ Name=Cube Tutor 360 Pauper 1 Sunlance|MM2 1 Gather the Townsfolk|DKA 1 Cenn's Enlistment|MMA -1 Hyena Umbra|ROE +1 Hyena Umbra|UMA 1 Bonds of Faith|ISD 1 Journey to Nowhere|ZEN 1 Pacifism|A25 @@ -52,7 +52,7 @@ Name=Cube Tutor 360 Pauper 1 Arrest|MM2 1 Cage of Hands|CHK 1 Oblivion Ring|MM2 -1 Faith's Fetters|EMA +1 Faith's Fetters|UMA 1 Cloudfin Raptor|GTC 1 Delver of Secrets|ISD 1 Wingcrafter|MM3 @@ -69,9 +69,9 @@ Name=Cube Tutor 360 Pauper 1 Sea Gate Oracle|MM3 1 Shaper Parasite|PLC 1 Stealer of Secrets|RTR -1 Stitched Drake|ISD +1 Stitched Drake|UMA 1 Stormbound Geist|DKA -1 Archaeomancer|M14 +1 Archaeomancer|UMA 1 Makeshift Mauler|ISD 1 Mist Raven|MM3 1 Ninja of the Deep Hours|BOK @@ -79,7 +79,7 @@ Name=Cube Tutor 360 Pauper 1 Gryff Vanguard|AVR 1 Mnemonic Wall|IMA 1 Mulldrifter|MM2 -1 Aethersnipe|MM2 +1 Aethersnipe|UMA 1 Errant Ephemeron|MMA 1 Spined Thopter|NPH 1 Brainstorm|A25 @@ -92,11 +92,11 @@ Name=Cube Tutor 360 Pauper 1 Mana Leak|IMA 1 Miscalculation|ULG 1 Remove Soul|10E -1 Think Twice|ISD +1 Think Twice|UMA 1 Withdraw|PCY 1 Capsize|TPR 1 Exclude|A25 -1 Forbidden Alchemy|MM3 +1 Forbidden Alchemy|UMA 1 Repulse|INV 1 Rushing River|PLS 1 Ray of Command|5ED @@ -112,7 +112,7 @@ Name=Cube Tutor 360 Pauper 1 Narcolepsy|MM2 1 Claustrophobia|IMA 1 Carnophage|TPR -1 Fume Spitter|SOM +1 Fume Spitter|UMA 1 Typhoid Rats|FRF 1 Vampire Lacerator|A25 1 Basilica Screecher|GTC @@ -132,7 +132,7 @@ Name=Cube Tutor 360 Pauper 1 Soulcage Fiend|AVR 1 Driver of the Dead|AVR 1 Faceless Butcher|TSB -1 Gravedigger|AKH +1 Gravedigger|M19 1 Mortis Dogs|NPH 1 Okiba-Gang Shinobi|BOK 1 Warren Pilferers|MMA @@ -147,13 +147,13 @@ Name=Cube Tutor 360 Pauper 1 Diabolic Edict|A25 1 Doom Blade|IMA 1 Grim Harvest|CSP -1 Last Gasp|RAV +1 Last Gasp|UMA 1 Nameless Inversion|MM2 1 Terror|10E 1 Rend Flesh|CHK 1 Snuff Out|MMQ -1 Death Denied|MM2 -1 Duress|IMA +1 Death Denied|UMA +1 Duress|M19 1 Unearth|A25 1 Disturbed Burial|TMP 1 Hymn to Tourach|EMA @@ -162,7 +162,7 @@ Name=Cube Tutor 360 Pauper 1 Crippling Fatigue|TOR 1 Read the Bones|ORI 1 Evincar's Justice|TMP -1 Dead Weight|SOI +1 Dead Weight|GRN 1 Stab Wound|M15 1 Pestilence|6ED 1 Goblin Bushwhacker|ZEN @@ -199,13 +199,13 @@ Name=Cube Tutor 360 Pauper 1 Staggershock|IMA 1 Fireblast|VMA 1 Chain Lightning|EMA -1 Faithless Looting|EMA +1 Faithless Looting|UMA 1 Firebolt|EMA 1 Flame Slash|ROE -1 Reckless Charge|EMA +1 Reckless Charge|UMA 1 Krenko's Command|M13 1 Volcanic Hammer|9ED -1 Act of Treason|A25 +1 Act of Treason|M19 1 Arc Lightning|KTK 1 Rift Bolt|IMA 1 Traitorous Instinct|MM3 @@ -214,9 +214,9 @@ Name=Cube Tutor 360 Pauper 1 Rolling Thunder|BFZ 1 Madcap Skills|MM3 1 Arbor Elf|A25 -1 Basking Rootwalla|VMA +1 Basking Rootwalla|UMA 1 Fyndhorn Elves|VMA -1 Llanowar Elves|EMA +1 Llanowar Elves|DOM 1 Wild Nacatl|ALA 1 Young Wolf|DKA 1 Ambush Viper|ISD @@ -230,7 +230,7 @@ Name=Cube Tutor 360 Pauper 1 Thornweald Archer|EMA 1 Viridian Emissary|MBS 1 Wall of Roots|IMA -1 Wild Mongrel|VMA +1 Wild Mongrel|UMA 1 Citanul Woodreaders|MMA 1 Crocanura|GTC 1 Simian Grunts|VMA @@ -243,12 +243,12 @@ Name=Cube Tutor 360 Pauper 1 Nantuko Vigilante|LGN 1 Penumbra Spider|MM3 1 Primal Huntbeast|M13 -1 Wickerbough Elder|EVE +1 Wickerbough Elder|UMA 1 Nessian Asp|THS 1 Sentinel Spider|EMA 1 Krosan Tusker|A25 1 Maul Splicer|NPH -1 Walker of the Grove|MMA +1 Walker of the Grove|UMA 1 Thundering Tanadon|NPH 1 Giant Growth|A25 1 Groundswell|WWK @@ -257,12 +257,12 @@ Name=Cube Tutor 360 Pauper 1 Crushing Vines|DKA 1 Harrow|TPR 1 Elephant Ambush|ODY -1 Prey Upon|AER +1 Prey Upon|UMA 1 Edge of Autumn|FUT 1 Rampant Growth|MM2 -1 Travel Preparations|ISD +1 Travel Preparations|UMA 1 Cultivate|A25 -1 Kodama's Reach|MMA +1 Kodama's Reach|UMA 1 Rancor|A25 1 Arachnus Web|MM3 1 Moldervine Cloak|MMA @@ -271,7 +271,7 @@ Name=Cube Tutor 360 Pauper 1 Agony Warp|MM3 1 Recoil|INV 1 Soul Manipulation|MM3 -1 Rakdos Shred-Freak|RTR +1 Rakdos Shred-Freak|UMA 1 Terminate|MM3 1 Auger Spree|MM3 1 Wrecking Ball|MM2 @@ -297,14 +297,14 @@ Name=Cube Tutor 360 Pauper 1 Assault Zeppelid|DIS 1 Snakeform|EVE 1 Frostburn Weird|RTR -1 Goblin Electromancer|MM3 +1 Goblin Electromancer|GRN 1 Izzet Chronarch|GPT 1 Goblin Legionnaire|APC 1 Wojek Halberdiers|GTC -1 Skyknight Legionnaire|MM3 +1 Skyknight Legionnaire|GRN 1 Viashino Firstblade|DGM 1 Martial Glory|GTC -1 Ulamog's Crusher|MM2 +1 Ulamog's Crusher|UMA 1 Perilous Myr|A25 1 Pilgrim's Eye|EMA 1 Adventuring Gear|ZEN @@ -322,7 +322,7 @@ Name=Cube Tutor 360 Pauper 1 Izzet Signet|MM3 1 Mind Stone|IMA 1 Orzhov Signet|MM3 -1 Prismatic Lens|EMA +1 Prismatic Lens|UMA 1 Prophetic Prism|A25 1 Vulshok Morningstar|9ED 1 Pristine Talisman|IMA @@ -333,30 +333,30 @@ Name=Cube Tutor 360 Pauper 1 Azorius Chancery|IMA 1 Azorius Guildgate|MM3 1 Boros Garrison|IMA -1 Boros Guildgate|MM3 +1 Boros Guildgate|GRN 1 Desert|TSB 1 Dimir Aqueduct|IMA -1 Dimir Guildgate|MM3 +1 Dimir Guildgate|GRN 1 Evolving Wilds|RIX -1 Golgari Guildgate|MM3 +1 Golgari Guildgate|GRN 1 Golgari Rot Farm|IMA 1 Gruul Guildgate|MM3 1 Gruul Turf|IMA 1 Halimar Depths|WWK 1 Haunted Fengraf|A25 1 Izzet Boilerworks|IMA -1 Izzet Guildgate|MM3 +1 Izzet Guildgate|GRN 1 Khalni Garden|WWK 1 Orzhov Basilica|IMA 1 Orzhov Guildgate|MM3 1 Quicksand|A25 1 Rakdos Carnarium|IMA 1 Rakdos Guildgate|MM3 -1 Rupture Spire|CFX -1 Selesnya Guildgate|MM3 +1 Rupture Spire|M19 +1 Selesnya Guildgate|GRN 1 Selesnya Sanctuary|IMA 1 Simic Growth Chamber|IMA 1 Simic Guildgate|MM3 1 Teetering Peaks|ZEN -1 Terramorphic Expanse|MMA +1 Terramorphic Expanse|UMA 1 Transguild Promenade|RTR diff --git a/forge-gui/res/cube/Cube Tutor 720.dck b/forge-gui/res/cube/Cube Tutor 720.dck index f5598bd56f0..f0d1aad9fb9 100644 --- a/forge-gui/res/cube/Cube Tutor 720.dck +++ b/forge-gui/res/cube/Cube Tutor 720.dck @@ -29,11 +29,11 @@ Name=Cube Tutor 720 1 Wall of Omens|EMA 1 Banisher Priest|M14 1 Blade Splicer|MM3 -1 Fiend Hunter|A25 +1 Fiend Hunter|UMA 1 Flickerwisp|MM3 1 Frontline Medic|GTC 1 Kor Sanctifiers|ZEN -1 Mentor of the Meek|ISD +1 Mentor of the Meek|M19 1 Mirran Crusader|MM2 1 Mirror Entity|MM2 1 Silverblade Paladin|AVR @@ -43,12 +43,12 @@ Name=Cube Tutor 720 1 Hero of Bladehold|MBS 1 Ranger of Eos|MM3 1 Restoration Angel|IMA -1 Sublime Archangel|M13 +1 Sublime Archangel|UMA 1 Baneslayer Angel|M11 1 Cloudgoat Ranger|MMA 1 Geist-Honored Monk|ISD 1 Karmic Guide|EMA -1 Reveillark|MMA +1 Reveillark|UMA 1 Exalted Angel|ONS 1 Mikaeus, the Lunarch|ISD 1 Sun Titan|M12 @@ -91,7 +91,7 @@ Name=Cube Tutor 720 1 Glorious Anthem|10E 1 Oblivion Ring|MM2 1 Angelic Destiny|M12 -1 Faith's Fetters|EMA +1 Faith's Fetters|UMA 1 Parallax Wave|VMA 1 Spear of Heliod|THS 1 Delver of Secrets|ISD @@ -101,7 +101,7 @@ Name=Cube Tutor 720 1 Looter il-Kor|TSP 1 Merfolk Looter|A25 1 Phantasmal Image|MM3 -1 Snapcaster Mage|MM3 +1 Snapcaster Mage|UMA 1 Waterfront Bouncer|VMA 1 Willbender|A25 1 Aether Adept|M12 @@ -114,7 +114,7 @@ Name=Cube Tutor 720 1 Vendilion Clique|A25 1 Clone|M14 1 Dungeon Geists|DKA -1 Glen Elendra Archmage|MMA +1 Glen Elendra Archmage|UMA 1 Ninja of the Deep Hours|BOK 1 Sower of Temptation|LRW 1 Talrand, Sky Summoner|M13 @@ -155,8 +155,8 @@ Name=Cube Tutor 720 1 Capsize|TPR 1 Dissipate|M15 1 Forbid|TPR -1 Forbidden Alchemy|MM3 -1 Frantic Search|VMA +1 Forbidden Alchemy|UMA +1 Frantic Search|UMA 1 Psionic Blast|TSB 1 Thirst for Knowledge|MMA 1 Cryptic Command|IMA @@ -184,7 +184,7 @@ Name=Cube Tutor 720 1 Thassa, God of the Sea|THS 1 Carnophage|TPR 1 Carrion Feeder|EMA -1 Diregraf Ghoul|ISD +1 Diregraf Ghoul|M19 1 Gravecrawler|DKA 1 Tormented Hero|THS 1 Vampire Lacerator|A25 @@ -199,7 +199,7 @@ Name=Cube Tutor 720 1 Nezumi Graverobber|CHK 1 Oona's Prowler|LRW 1 Pack Rat|RTR -1 Reassembling Skeleton|MM2 +1 Reassembling Skeleton|M19 1 Vampire Hexmage|CNS 1 Bone Shredder|ULG 1 Fleshbag Marauder|ORI @@ -218,7 +218,7 @@ Name=Cube Tutor 720 1 Nekrataal|EMA 1 Skinrender|SOM 1 Bloodgift Demon|ISD -1 Shriekmaw|LRW +1 Shriekmaw|UMA 1 Grave Titan|M12 1 Ink-Eyes, Servant of Oni|BOK 1 Kokusho, the Evening Star|MMA @@ -226,11 +226,11 @@ Name=Cube Tutor 720 1 Sheoldred, Whispering One|IMA 1 Griselbrand|MM3 1 Tombstalker|MMA -1 Liliana of the Veil|MM3 +1 Liliana of the Veil|UMA 1 Liliana Vess|M15 1 Sorin Markov|M12 1 Dark Ritual|A25 -1 Entomb|EMA +1 Entomb|UMA 1 Tragic Slip|EMA 1 Vampiric Tutor|EMA 1 Diabolic Edict|A25 @@ -242,32 +242,32 @@ Name=Cube Tutor 720 1 Slaughter Pact|MMA 1 Makeshift Mannequin|LRW 1 Snuff Out|MMQ -1 Duress|IMA +1 Duress|M19 1 Innocent Blood|EMA 1 Inquisition of Kozilek|MM3 -1 Reanimate|TPR +1 Reanimate|UMA 1 Thoughtseize|IMA -1 Chainer's Edict|TOR -1 Demonic Tutor|VMA +1 Chainer's Edict|UMA +1 Demonic Tutor|UMA 1 Exhume|USG 1 Hymn to Tourach|EMA 1 Night's Whisper|EMA 1 Sign in Blood|MM2 1 Sinkhole|EMA 1 Smallpox|CNS -1 Buried Alive|ODY +1 Buried Alive|UMA 1 Yawgmoth's Will|USG 1 Barter in Blood|AVR 1 Consuming Vapors|ROE 1 Damnation|MM3 1 Living Death|A25 -1 Unburial Rites|MM3 +1 Unburial Rites|UMA 1 Mind Twist|4ED 1 Black Sun's Zenith|MBS 1 Profane Command|MM2 1 Sarcomancy|TPR 1 Animate Dead|EMA -1 Bitterblossom|MM2 +1 Bitterblossom|UMA 1 Necromancy|VIS 1 Necropotence|IMA 1 Phyrexian Arena|9ED @@ -295,12 +295,12 @@ Name=Cube Tutor 720 1 Plated Geopede|ZEN 1 Stormblood Berserker|MM2 1 Torch Fiend|M15 -1 Young Pyromancer|EMA +1 Young Pyromancer|UMA 1 Ball Lightning|A25 1 Chandra's Phoenix|M14 1 Countryside Crusher|MMA 1 Goblin Ruinblaster|ZEN -1 Guttersnipe|IMA +1 Guttersnipe|M19 1 Hell's Thunder|ALA 1 Manic Vandal|M12 1 Squee, Goblin Nabob|MMA @@ -312,7 +312,7 @@ Name=Cube Tutor 720 1 Hero of Oxid Ridge|MBS 1 Keldon Champion|EMA 1 Kiki-Jiki, Mirror Breaker|IMA -1 Siege-Gang Commander|EMA +1 Siege-Gang Commander|DOM 1 Thundermaw Hellkite|IMA 1 Zealous Conscripts|MM3 1 Inferno Titan|M12 @@ -326,7 +326,7 @@ Name=Cube Tutor 720 1 Lightning Bolt|A25 1 Ancient Grudge|MM3 1 Incinerate|M12 -1 Lightning Strike|XLN +1 Lightning Strike|M19 1 Magma Jet|MM3 1 Searing Blaze|WWK 1 Searing Spear|M13 @@ -338,9 +338,9 @@ Name=Cube Tutor 720 1 Staggershock|IMA 1 Fireblast|VMA 1 Chain Lightning|EMA -1 Faithless Looting|EMA +1 Faithless Looting|UMA 1 Firebolt|EMA -1 Reckless Charge|EMA +1 Reckless Charge|UMA 1 Arc Trail|SOM 1 Mizzium Mortars|MM3 1 Pyroclasm|A25 @@ -352,7 +352,7 @@ Name=Cube Tutor 720 1 Slagstorm|MBS 1 Stone Rain|9ED 1 Wheel of Fortune|VMA -1 Banefire|MM2 +1 Banefire|M19 1 Devil's Play|ISD 1 Earthquake|M10 1 Fireball|IMA @@ -368,11 +368,11 @@ Name=Cube Tutor 720 1 Experiment One|GTC 1 Fyndhorn Elves|VMA 1 Joraga Treespeaker|ROE -1 Llanowar Elves|EMA -1 Noble Hierarch|MM2 +1 Llanowar Elves|DOM +1 Noble Hierarch|UMA 1 Ulvenwald Tracker|MM3 1 Wild Nacatl|ALA -1 Fauna Shaman|M11 +1 Fauna Shaman|UMA 1 Lotus Cobra|IMA 1 Mayor of Avabruck|ISD 1 River Boa|ZEN @@ -381,11 +381,11 @@ Name=Cube Tutor 720 1 Scavenging Ooze|MM3 1 Strangleroot Geist|DKA 1 Sylvan Caryatid|THS -1 Tarmogoyf|MM3 +1 Tarmogoyf|UMA 1 Wall of Blossoms|TPR 1 Wall of Roots|IMA -1 Wild Mongrel|VMA -1 Eternal Witness|MMA +1 Wild Mongrel|UMA +1 Eternal Witness|UMA 1 Ohran Viper|CSP 1 Troll Ascetic|10E 1 Uktabi Orangutan|6ED @@ -400,8 +400,8 @@ Name=Cube Tutor 720 1 Oracle of Mul Daya|ZEN 1 Polukranos, World Eater|THS 1 Thrun, the Last Troll|MBS -1 Vengevine|ROE -1 Wickerbough Elder|EVE +1 Vengevine|UMA +1 Wickerbough Elder|UMA 1 Acidic Slime|M13 1 Deranged Hermit|VMA 1 Genesis|VMA @@ -417,7 +417,7 @@ Name=Cube Tutor 720 1 Krosan Tusker|A25 1 Craterhoof Behemoth|MM3 1 Terastodon|CNS -1 Woodfall Primus|MMA +1 Woodfall Primus|UMA 1 Garruk Relentless|ISD 1 Garruk Wildspeaker|M11 1 Garruk, Primal Hunter|M13 @@ -425,19 +425,19 @@ Name=Cube Tutor 720 1 Giant Growth|A25 1 Vines of Vastwood|MM2 1 Worldly Tutor|6ED -1 Naturalize|RIX +1 Naturalize|M19 1 Beast Within|NPH 1 Harrow|TPR 1 Krosan Grip|MMA 1 Channel|IMA 1 Explore|MM3 1 Farseek|M13 -1 Life from the Loam|MMA +1 Life from the Loam|UMA 1 Rampant Growth|MM2 1 Regrowth|A25 1 Call of the Herd|MM3 1 Cultivate|A25 -1 Kodama's Reach|MMA +1 Kodama's Reach|UMA 1 Search for Tomorrow|IMA 1 Harmonize|MM3 1 Natural Order|EMA @@ -468,7 +468,7 @@ Name=Cube Tutor 720 1 Rakdos Cackler|RTR 1 Spike Jester|MM3 1 Falkenrath Aristocrat|MM3 -1 Murderous Redcap|MMA +1 Murderous Redcap|UMA 1 Olivia Voldaren|MM3 1 Terminate|MM3 1 Bituminous Blast|ARB @@ -485,14 +485,14 @@ Name=Cube Tutor 720 1 Dryad Militant|RTR 1 Qasali Pridemage|ARB 1 Voice of Resurgence|MM3 -1 Kitchen Finks|MMA +1 Kitchen Finks|UMA 1 Knight of the Reliquary|IMA 1 Loxodon Smiter|RTR 1 Armada Wurm|RTR 1 Selesnya Charm|RTR 1 Mirari's Wake|CNS 1 Obzedat, Ghost Council|GTC -1 Angel of Despair|GPT +1 Angel of Despair|UMA 1 Sorin, Lord of Innistrad|DKA 1 Tidehollow Sculler|MMA 1 Mortify|CNS @@ -505,7 +505,7 @@ Name=Cube Tutor 720 1 Vraska the Unseen|RTR 1 Abrupt Decay|MM3 1 Putrefy|MM3 -1 Maelstrom Pulse|MMA +1 Maelstrom Pulse|UMA 1 Pernicious Deed|A25 1 Coiling Oracle|MM3 1 Edric, Spymaster of Trest|VMA @@ -517,7 +517,7 @@ Name=Cube Tutor 720 1 Simic Charm|GTC 1 Niv-Mizzet, Dracogenius|RTR 1 Ral Zarek|DGM -1 Fire // Ice|APC +1 Fire // Ice|UMA 1 Izzet Charm|MM3 1 Turn // Burn|DGM 1 Electrolyze|IMA @@ -531,9 +531,9 @@ Name=Cube Tutor 720 1 Assemble the Legion|GTC 1 Sphinx of the Steel Wind|EMA 1 Nicol Bolas, Planeswalker|M13 -1 Kozilek, Butcher of Truth|MM2 -1 Ulamog, the Infinite Gyre|MM2 -1 Karn Liberated|MM2 +1 Kozilek, Butcher of Truth|UMA +1 Ulamog, the Infinite Gyre|UMA +1 Karn Liberated|UMA 1 Epochrasite|MMA 1 Perilous Myr|A25 1 Phyrexian Revoker|M15 @@ -567,7 +567,7 @@ Name=Cube Tutor 720 1 Black Vise|4ED 1 Bonesplitter|MMA 1 Cursed Scroll|TPR -1 Mana Vault|VMA +1 Mana Vault|UMA 1 Pithing Needle|RTR 1 Relic of Progenitus|EMA 1 Sensei's Divining Top|EMA @@ -597,9 +597,9 @@ Name=Cube Tutor 720 1 Umezawa's Jitte|BOK 1 Winter Orb|EMA 1 Basalt Monolith|3ED -1 Chromatic Lantern|RTR +1 Chromatic Lantern|GRN 1 Coalition Relic|A25 -1 Crucible of Worlds|10E +1 Crucible of Worlds|M19 1 Crystal Shard|MRD 1 Darksteel Ingot|M14 1 Grafted Wargear|5DN @@ -615,18 +615,18 @@ Name=Cube Tutor 720 1 Vedalken Shackles|MMA 1 Worn Powerstone|EMA 1 Erratic Portal|TPR -1 Icy Manipulator|10E +1 Icy Manipulator|DOM 1 Nevinyrral's Disk|EMA 1 Smokestack|VMA 1 Thran Dynamo|IMA 1 Batterskull|NPH -1 Engineered Explosives|MMA -1 Gilded Lotus|M13 +1 Engineered Explosives|UMA +1 Gilded Lotus|DOM 1 Memory Jar|VMA 1 Mindslaver|SOM -1 All Is Dust|MM2 +1 All Is Dust|UMA 1 Academy Ruins|MMA -1 Ancient Tomb|VMA +1 Ancient Tomb|UMA 1 Arcane Sanctum|MM3 1 Arid Mesa|MM3 1 Azorius Chancery|IMA @@ -639,10 +639,10 @@ Name=Cube Tutor 720 1 Breeding Pool|GTC 1 Cascade Bluffs|A25 1 Caves of Koilos|ORI -1 Celestial Colonnade|WWK +1 Celestial Colonnade|UMA 1 City of Brass|MMA -1 Clifftop Retreat|ISD -1 Creeping Tar Pit|WWK +1 Clifftop Retreat|DOM +1 Creeping Tar Pit|UMA 1 Crumbling Necropolis|MM3 1 Dimir Aqueduct|IMA 1 Dragonskull Summit|XLN @@ -660,12 +660,12 @@ Name=Cube Tutor 720 1 Grand Coliseum|VMA 1 Gruul Turf|IMA 1 Hallowed Fountain|RTR -1 Hinterland Harbor|ISD -1 Isolated Chapel|ISD +1 Hinterland Harbor|DOM +1 Isolated Chapel|DOM 1 Izzet Boilerworks|IMA 1 Jungle Shrine|MM3 1 Kessig Wolf Run|ISD -1 Lavaclaw Reaches|WWK +1 Lavaclaw Reaches|UMA 1 Library of Alexandria|VMA 1 Llanowar Wastes|ORI 1 Marsh Flats|MM3 @@ -674,16 +674,16 @@ Name=Cube Tutor 720 1 Misty Rainforest|MM3 1 Mutavault|M14 1 Orzhov Basilica|IMA -1 Overgrown Tomb|RTR +1 Overgrown Tomb|GRN 1 Plateau|VMA 1 Polluted Delta|KTK -1 Raging Ravine|WWK +1 Raging Ravine|UMA 1 Rakdos Carnarium|IMA 1 Reflecting Pool|CNS 1 Rishadan Port|A25 1 Rootbound Crag|XLN 1 Rugged Prairie|A25 -1 Sacred Foundry|GTC +1 Sacred Foundry|GRN 1 Savage Lands|MM3 1 Savannah|VMA 1 Scalding Tarn|MM3 @@ -692,16 +692,16 @@ Name=Cube Tutor 720 1 Selesnya Sanctuary|IMA 1 Shelldock Isle|LRW 1 Simic Growth Chamber|IMA -1 Steam Vents|RTR -1 Stirring Wildwood|WWK +1 Steam Vents|GRN +1 Stirring Wildwood|UMA 1 Stomping Ground|GTC 1 Strip Mine|VMA -1 Sulfur Falls|ISD +1 Sulfur Falls|DOM 1 Sunpetal Grove|XLN 1 Taiga|VMA 1 Tectonic Edge|WWK -1 Temple Garden|RTR -1 Terramorphic Expanse|MMA +1 Temple Garden|GRN +1 Terramorphic Expanse|UMA 1 Treetop Village|10E 1 Tropical Island|VMA 1 Tundra|VMA @@ -716,8 +716,8 @@ Name=Cube Tutor 720 1 Volcanic Island|VMA 1 Volrath's Stronghold|TPR 1 Wasteland|EMA -1 Watery Grave|GTC +1 Watery Grave|GRN 1 Windswept Heath|KTK 1 Wooded Foothills|KTK -1 Woodland Cemetery|ISD +1 Woodland Cemetery|DOM 1 Yavimaya Coast|ORI diff --git a/forge-gui/res/cube/Eric Klug's Pro Tour Cube.dck b/forge-gui/res/cube/Eric Klug's Pro Tour Cube.dck index a7b9430250b..a32b8d270ee 100644 --- a/forge-gui/res/cube/Eric Klug's Pro Tour Cube.dck +++ b/forge-gui/res/cube/Eric Klug's Pro Tour Cube.dck @@ -11,8 +11,8 @@ Name=Eric Klug's Pro Tour Cube 1 Ajani, Mentor of Heroes|JOU 1 Akroma's Blessing|ONS 1 Akroma's Vengeance|A25 -1 Ancient Tomb|VMA -1 Angel of Despair|GPT +1 Ancient Tomb|UMA +1 Angel of Despair|UMA 1 Aquamoeba|VMA 1 Arashi, the Sky Asunder|SOK 1 Arc Lightning|KTK @@ -32,11 +32,11 @@ Name=Eric Klug's Pro Tour Cube 1 Baneslayer Angel|M11 1 Banishing Light|JOU 1 Barbed Lightning|DST -1 Basking Rootwalla|VMA -1 Become Immense|KTK +1 Basking Rootwalla|UMA +1 Become Immense|UMA 1 Bident of Thassa|A25 1 Birds of Paradise|M12 -1 Bitterblossom|MM2 +1 Bitterblossom|UMA 1 Bituminous Blast|ARB 1 Black Knight|M11 1 Blazing Specter|VMA @@ -61,11 +61,11 @@ Name=Eric Klug's Pro Tour Cube 1 Careful Consideration|MMA 1 Carven Caryatid|IMA 1 Cascade Bluffs|A25 -1 Cavern of Souls|MM3 +1 Cavern of Souls|UMA 1 Caves of Koilos|ORI -1 Celestial Colonnade|WWK +1 Celestial Colonnade|UMA 1 Celestial Purge|MM2 -1 Chainer's Edict|TOR +1 Chainer's Edict|UMA 1 Chameleon Colossus|MOR 1 Champion of the Parish|ISD 1 Char|RAV @@ -76,7 +76,7 @@ Name=Eric Klug's Pro Tour Cube 1 City of Brass|MMA 1 Civic Saber|RTR 1 Civic Wayfinder|EMA -1 Clifftop Retreat|ISD +1 Clifftop Retreat|DOM 1 Cloudfin Raptor|GTC 1 Cognivore|ODY 1 Comet Storm|MM2 @@ -93,7 +93,7 @@ Name=Eric Klug's Pro Tour Cube 1 Covetous Dragon|UDS 1 Cranial Plating|MM2 1 Crater Hellion|EMA -1 Creeping Tar Pit|WWK +1 Creeping Tar Pit|UMA 1 Cruel Ultimatum|MM3 1 Crypt Angel|INV 1 Cryptic Command|IMA @@ -132,7 +132,7 @@ Name=Eric Klug's Pro Tour Cube 1 Drowner of Hope|BFZ 1 Dryad Militant|RTR 1 Dryad Sophisticate|GPT -1 Duress|IMA +1 Duress|M19 1 Earthquake|M10 1 Eldrazi Mimic|OGW 1 Eldrazi Obligator|OGW @@ -147,7 +147,7 @@ Name=Eric Klug's Pro Tour Cube 1 Enlightened Tutor|EMA 1 Entreat the Angels|MM3 1 Eternal Dragon|VMA -1 Eternal Witness|MMA +1 Eternal Witness|UMA 1 Ethersworn Canonist|MMA 1 Evolutionary Leap|ORI 1 Evolving Wilds|RIX @@ -162,7 +162,7 @@ Name=Eric Klug's Pro Tour Cube 1 Farseek|M13 1 Feeling of Dread|ISD 1 Figure of Destiny|MMA -1 Fire // Ice|APC +1 Fire // Ice|UMA 1 Fire Diamond|7ED 1 Fireball|IMA 1 Fireslinger|TMP @@ -188,7 +188,7 @@ Name=Eric Klug's Pro Tour Cube 1 Giant Solifuge|EMA 1 Gideon Jura|M12 1 Gideon, Ally of Zendikar|BFZ -1 Gilded Lotus|M13 +1 Gilded Lotus|DOM 1 Glimpse of Nature|CHK 1 Glint Hawk|SOM 1 Goblin Rabblemaster|M15 @@ -217,7 +217,7 @@ Name=Eric Klug's Pro Tour Cube 1 Huntmaster of the Fells|DKA 1 Hymn to Tourach|EMA 1 Hypnotic Specter|M10 -1 Icy Manipulator|10E +1 Icy Manipulator|DOM 1 Ihsan's Shade|A25 1 Illusions of Grandeur|ICE 1 Imperious Perfect|EMA @@ -246,33 +246,33 @@ Name=Eric Klug's Pro Tour Cube 1 Knight of the Reliquary|IMA 1 Knight of the White Orchid|ORI 1 Kodama of the North Tree|CHK -1 Kodama's Reach|MMA +1 Kodama's Reach|UMA 1 Kokusho, the Evening Star|MMA 1 Land Tax|4ED 1 Languish|ORI 1 Last Breath|THS -1 Lavaclaw Reaches|WWK +1 Lavaclaw Reaches|UMA 1 Leonin Relic-Warder|MBS 1 Lightning Berserker|DTK 1 Lightning Bolt|A25 1 Lightning Greaves|MRD 1 Lightning Helix|IMA -1 Lightning Strike|XLN +1 Lightning Strike|M19 1 Liliana Vess|M15 1 Liliana, the Last Hope|EMN 1 Lingering Souls|MM3 1 Linvala, the Preserver|OGW -1 Llanowar Elves|EMA +1 Llanowar Elves|DOM 1 Llanowar Wastes|ORI 1 Longbow Archer|7ED 1 Lotus Bloom|MMA 1 Lotus Cobra|IMA 1 Lotus Petal|TPR -1 Maelstrom Pulse|MMA +1 Maelstrom Pulse|UMA 1 Man-o'-War|A25 1 Mana Leak|IMA 1 Mana Tithe|PLC -1 Mana Vault|VMA +1 Mana Vault|UMA 1 Marsh Flats|MM3 1 Master of Waves|THS 1 Masticore|VMA @@ -280,7 +280,7 @@ Name=Eric Klug's Pro Tour Cube 1 Memnite|SOM 1 Merchant Scroll|8ED 1 Metalworker|UDS -1 Millstone|M14 +1 Millstone|M19 1 Mindslaver|SOM 1 Mirari|TSB 1 Mirari's Wake|CNS @@ -311,19 +311,19 @@ Name=Eric Klug's Pro Tour Cube 1 Nightscape Familiar|VMA 1 Nightveil Specter|GTC 1 Nissa, Voice of Zendikar|OGW -1 Noble Hierarch|MM2 +1 Noble Hierarch|UMA 1 Oath of Druids|TPR 1 Oath of Nissa|OGW 1 Ob Nixilis Reignited|BFZ 1 Ohran Viper|CSP -1 Omenspeaker|THS +1 Omenspeaker|M19 1 Oracle of Mul Daya|ZEN 1 Orcish Cannoneers|ICE 1 Orcish Settlers|WTH 1 Order of Leitbur|FEM 1 Order of the Ebon Hand|FEM 1 Order of the White Shield|5ED -1 Overgrown Tomb|RTR +1 Overgrown Tomb|GRN 1 Parallax Wave|VMA 1 Path to Exile|MM3 1 Pentavus|M12 @@ -339,14 +339,14 @@ Name=Eric Klug's Pro Tour Cube 1 Planar Cleansing|M14 1 Platinum Angel|M11 1 Plow Under|8ED -1 Plumeveil|MMA +1 Plumeveil|UMA 1 Polluted Delta|KTK 1 Polukranos, World Eater|THS 1 Ponder|M12 1 Powder Keg|UDS 1 Preordain|M11 1 Primeval Titan|IMA -1 Prismatic Lens|EMA +1 Prismatic Lens|UMA 1 Profane Command|MM2 1 Psychatog|VMA 1 Pulse of the Forge|DST @@ -356,7 +356,7 @@ Name=Eric Klug's Pro Tour Cube 1 Putrid Leech|ARB 1 Pyrite Spellbomb|MMA 1 Pyroclasm|A25 -1 Raging Ravine|WWK +1 Raging Ravine|UMA 1 Rakdos Guildmage|DIS 1 Rampant Growth|MM2 1 Ranger of Eos|MM3 @@ -374,7 +374,7 @@ Name=Eric Klug's Pro Tour Cube 1 Rootborn Defenses|MM3 1 Ruination Guide|BFZ 1 Ruinous Path|BFZ -1 Sacred Foundry|GTC +1 Sacred Foundry|GRN 1 Sakura-Tribe Elder|CNS 1 Sandsteppe Citadel|KTK 1 Savage Lands|MM3 @@ -393,28 +393,28 @@ Name=Eric Klug's Pro Tour Cube 1 Seething Song|9ED 1 Sengir Vampire|M14 1 Sensei's Divining Top|EMA -1 Serra Angel|IMA +1 Serra Angel|DOM 1 Serrated Arrows|TSB 1 Shadow Guildmage|TSB 1 Shambling Vent|BFZ 1 Shard Phoenix|TPR 1 Shivan Reef|ORI -1 Shock|AER +1 Shock|M19 1 Shrapnel Blast|M15 -1 Shriekmaw|LRW +1 Shriekmaw|UMA 1 Sickening Shoal|BOK -1 Siege-Gang Commander|EMA +1 Siege-Gang Commander|DOM 1 Silence the Believers|JOU 1 Silverblade Paladin|AVR 1 Simic Signet|MM3 1 Simic Sky Swallower|IMA 1 Skeletal Vampire|MMA 1 Skirsdag High Priest|ISD -1 Skizzik|INV -1 Skyknight Legionnaire|MM3 +1 Skizzik|DOM +1 Skyknight Legionnaire|GRN 1 Slagstorm|MBS 1 Smoldering Marsh|BFZ -1 Snapcaster Mage|MM3 +1 Snapcaster Mage|UMA 1 Solemn Simulacrum|M12 1 Somber Hoverguard|MM2 1 Sorin, Grim Nemesis|SOI @@ -432,7 +432,7 @@ Name=Eric Klug's Pro Tour Cube 1 Squirrel Nest|CNS 1 Starstorm|VMA 1 Stasis Snare|BFZ -1 Steam Vents|RTR +1 Steam Vents|GRN 1 Steppe Lynx|ZEN 1 Stir the Grave|BOK 1 Stoke the Flames|M15 @@ -457,9 +457,9 @@ Name=Eric Klug's Pro Tour Cube 1 Sylvok Lifestaff|SOM 1 Tamiyo, the Moon Sage|AVR 1 Tangle Wire|NMS -1 Tarmogoyf|MM3 +1 Tarmogoyf|UMA 1 Teferi, Mage of Zhalfir|IMA -1 Temple Garden|RTR +1 Temple Garden|GRN 1 Temple of Malady|JOU 1 Temple of Triumph|THS 1 Temporal Aperture|USG @@ -503,7 +503,7 @@ Name=Eric Klug's Pro Tour Cube 1 Vengeful Dreams|TOR 1 Venser, Shaper Savant|MM3 1 Verdant Catacombs|MM3 -1 Verdant Force|TPR +1 Verdant Force|DOM 1 Vile Aggregate|BFZ 1 Viridian Shaman|10E 1 Voice of All|10E @@ -513,17 +513,17 @@ Name=Eric Klug's Pro Tour Cube 1 Volcanic Island|VMA 1 Voltaic Key|M11 1 Wall of Blossoms|TPR -1 Wall of Reverence|CFX +1 Wall of Reverence|UMA 1 Wall of Roots|IMA 1 Warden of the First Tree|FRF 1 Wasteland|EMA 1 Waterfront Bouncer|VMA -1 Watery Grave|GTC +1 Watery Grave|GRN 1 Wax // Wane|INV 1 Werebear|EMA 1 Westvale Abbey|SOI 1 White Knight|M11 -1 Wild Mongrel|VMA +1 Wild Mongrel|UMA 1 Wild Nacatl|ALA 1 Wild Slash|FRF 1 Wildfire|MM2 diff --git a/forge-gui/res/cube/Guillaume Matignon's Jenny's-Johnny's Cube.dck b/forge-gui/res/cube/Guillaume Matignon's Jenny's-Johnny's Cube.dck index fec56b8f60e..3907f6a0458 100644 --- a/forge-gui/res/cube/Guillaume Matignon's Jenny's-Johnny's Cube.dck +++ b/forge-gui/res/cube/Guillaume Matignon's Jenny's-Johnny's Cube.dck @@ -10,8 +10,8 @@ Name=Guillaume Matignon's Jenny's-Johnny's Cube 1 Aether Adept|M12 1 Ajani Goldmane|M11 1 Ajani's Chosen|M14 -1 Ajani's Pridemate|IMA -1 All Is Dust|MM2 +1 Ajani's Pridemate|M19 +1 All Is Dust|UMA 1 Always Watching|SOI 1 Ambassador Laquatus|10E 1 Ancestor's Prophet|ONS @@ -65,19 +65,19 @@ Name=Guillaume Matignon's Jenny's-Johnny's Cube 1 Call to the Grave|M12 1 Carnophage|TPR 1 Carrion Feeder|EMA -1 Cavern of Souls|MM3 +1 Cavern of Souls|UMA 1 Caves of Koilos|ORI 1 Celestial Ancient|DIS 1 Celestial Archon|THS 1 Cemetery Reaper|M12 1 Centaur Vinecrasher -1 Chainer's Edict|TOR +1 Chainer's Edict|UMA 1 Champion of the Parish|ISD 1 Chandra, Flamecaller|OGW -1 Circular Logic|VMA +1 Circular Logic|UMA 1 City of Brass|MMA 1 Cliffhaven Vampire|OGW -1 Clifftop Retreat|ISD +1 Clifftop Retreat|DOM 1 Coiling Oracle|MM3 1 Coldsteel Heart|CSP 1 Collected Company|DTK @@ -91,7 +91,7 @@ Name=Guillaume Matignon's Jenny's-Johnny's Cube 1 Courser of Kruphix|A25 1 Cradle of Vitality|ALA 1 Crippling Fatigue|TOR -1 Crucible of Worlds|10E +1 Crucible of Worlds|M19 1 Cryptbreaker|EMN 1 Curious Homunculus|EMN 1 Curse of Predation|IMA @@ -100,7 +100,7 @@ Name=Guillaume Matignon's Jenny's-Johnny's Cube 1 Dark Salvation|EMN 1 Darksteel Mutation 1 Daxos's Torment -1 Dead Weight|SOI +1 Dead Weight|GRN 1 Deathrite Shaman|EMA 1 Declaration in Stone|SOI 1 Deep Analysis|EMA @@ -112,7 +112,7 @@ Name=Guillaume Matignon's Jenny's-Johnny's Cube 1 Diabolic Servitude|USG 1 Dictate of Erebos|JOU 1 Diregraf Colossus|SOI -1 Diregraf Ghoul|ISD +1 Diregraf Ghoul|M19 1 Dismember|MM2 1 Distended Mindbender|EMN 1 Docent of Perfection|EMN @@ -126,7 +126,7 @@ Name=Guillaume Matignon's Jenny's-Johnny's Cube 1 Drogskol Reaver|DKA 1 Dromoka's Command|DTK 1 Duplicant|EMA -1 Duress|IMA +1 Duress|M19 1 Dwynen, Gilt-Leaf Daen|ORI 1 Edge of Autumn|FUT 1 Edric, Spymaster of Trest|VMA @@ -142,9 +142,9 @@ Name=Guillaume Matignon's Jenny's-Johnny's Cube 1 Emrakul, the Promised End|EMN 1 Enchantress's Presence|ONS 1 Enclave Cryptologist|ROE -1 Engineered Explosives|MMA +1 Engineered Explosives|UMA 1 Enlightened Tutor|EMA -1 Entomb|EMA +1 Entomb|UMA 1 Entomber Exarch|MM3 1 Essence Warden|PLC 1 Ethereal Armor|RTR @@ -153,17 +153,17 @@ Name=Guillaume Matignon's Jenny's-Johnny's Cube 1 Exploration|CNS 1 Extinguish All Hope|JOU 1 Ezuri, Renegade Leader|SOM -1 Faith's Fetters|EMA -1 Faithless Looting|EMA +1 Faith's Fetters|UMA +1 Faithless Looting|UMA 1 Falkenrath Aristocrat|MM3 1 Fatestitcher|ALA -1 Fauna Shaman|M11 +1 Fauna Shaman|UMA 1 Feldon of the Third Path 1 Felidar Umbra 1 Fertile Ground|LRW -1 Fiend Hunter|A25 +1 Fiend Hunter|UMA 1 Fiery Confluence -1 Fire // Ice|APC +1 Fire // Ice|UMA 1 Firebolt|EMA 1 Flame Jab|EMA 1 Flash of Insight|JUD @@ -172,11 +172,11 @@ Name=Guillaume Matignon's Jenny's-Johnny's Cube 1 Flooded Strand|KTK 1 Flux|WTH 1 Foundry Street Denizen|M15 -1 Frantic Search|VMA +1 Frantic Search|UMA 1 Frenzied Goblin|A25 1 Freyalise, Llanowar's Fury 1 Fyndhorn Elves|VMA -1 Gamble|EMA +1 Gamble|UMA 1 Garruk Wildspeaker|M11 1 Gauntlet of Might|2ED 1 Gavony Township|ISD @@ -204,7 +204,7 @@ Name=Guillaume Matignon's Jenny's-Johnny's Cube 1 Goblin Wardriver|MBS 1 Goblin Welder|ULG 1 Godless Shrine|GTC -1 Golgari Grave-Troll|RAV +1 Golgari Grave-Troll|UMA 1 Grafted Wargear|5DN 1 Grand Architect|SOM 1 Grand Coliseum|VMA @@ -220,8 +220,8 @@ Name=Guillaume Matignon's Jenny's-Johnny's Cube 1 Grim Lavamancer|M12 1 Grisly Salvage|RTR 1 Grove of the Burnwillows|IMA -1 Gurmag Angler|FRF -1 Guttersnipe|IMA +1 Gurmag Angler|UMA +1 Guttersnipe|M19 1 Hallowed Fountain|RTR 1 Hammer of Purphoros|THS 1 Hangarback Walker|ORI @@ -230,12 +230,12 @@ Name=Guillaume Matignon's Jenny's-Johnny's Cube 1 Havengul Lich|DKA 1 Healer of the Pride|M13 1 Hedron Archive|BFZ -1 Heliod's Pilgrim|M15 +1 Heliod's Pilgrim|UMA 1 Heliod, God of the Sun|THS 1 Herald of the Pantheon|ORI 1 Hero's Downfall|THS 1 High Market|MMQ -1 Hinterland Harbor|ISD +1 Hinterland Harbor|DOM 1 Hopeful Eidolon|THS 1 Hordeling Outburst|A25 1 Idyllic Tutor|MOR @@ -246,7 +246,7 @@ Name=Guillaume Matignon's Jenny's-Johnny's Cube 1 Inquisition of Kozilek|MM3 1 Intuition|TPR 1 Ishkanah, Grafwidow|EMN -1 Isolated Chapel|ISD +1 Isolated Chapel|DOM 1 Izzet Charm|MM3 1 Jace, Vryn's Prodigy|ORI 1 Jeskai Ascendancy|KTK @@ -260,15 +260,15 @@ Name=Guillaume Matignon's Jenny's-Johnny's Cube 1 Kor Sanctifiers|ZEN 1 Kor Spiritdancer|ROE 1 Kozilek's Return|OGW -1 Kozilek, Butcher of Truth|MM2 +1 Kozilek, Butcher of Truth|UMA 1 Krenko's Command|M13 1 Krenko, Mob Boss|M13 1 Kytheon, Hero of Akros|ORI -1 Laboratory Maniac|ISD +1 Laboratory Maniac|UMA 1 Lava Dart|JUD 1 Legacy's Allure|TMP 1 Leonin Relic-Warder|MBS -1 Life from the Loam|MMA +1 Life from the Loam|UMA 1 Lightning Bolt|A25 1 Lightning Greaves|MRD 1 Lightning Helix|IMA @@ -276,18 +276,18 @@ Name=Guillaume Matignon's Jenny's-Johnny's Cube 1 Lignify|LRW 1 Liliana, Heretical Healer|ORI 1 Liliana, the Last Hope|EMN -1 Llanowar Elves|EMA +1 Llanowar Elves|DOM 1 Llanowar Wastes|ORI 1 Lone Rider|EMN 1 Maelstrom Nexus|ARB -1 Maelstrom Pulse|MMA +1 Maelstrom Pulse|UMA 1 Magma Jet|MM3 1 Magmatic Force 1 Magmatic Insight|ORI 1 Manic Vandal|M12 1 Mardu Woe-Reaper|FRF 1 Marsh Flats|MM3 -1 Martyr of Sands|CSP +1 Martyr of Sands|UMA 1 Master Apothecary|ODY 1 Master of Waves|THS 1 Maze of Ith|EMA @@ -335,11 +335,11 @@ Name=Guillaume Matignon's Jenny's-Johnny's Cube 1 Oona's Grace|EMA 1 Opalescence|UDS 1 Open the Vaults|M10 -1 Opt|XLN +1 Opt|DOM 1 Oracle of Mul Daya|ZEN 1 Oracle of Nectars|SHM 1 Outpost Siege|FRF -1 Overgrown Tomb|RTR +1 Overgrown Tomb|GRN 1 Palace Siege|FRF 1 Parallax Wave|VMA 1 Path of Bravery|IMA @@ -358,7 +358,7 @@ Name=Guillaume Matignon's Jenny's-Johnny's Cube 1 Porphyry Nodes|PLC 1 Portent|5ED 1 Priest of Titania|USG -1 Prismatic Lens|EMA +1 Prismatic Lens|UMA 1 Pristine Talisman|IMA 1 Prized Amalgam|SOI 1 Prophetic Bolt|VMA @@ -371,26 +371,26 @@ Name=Guillaume Matignon's Jenny's-Johnny's Cube 1 Ranger of Eos|MM3 1 Raven's Crime|MMA 1 Read the Bones|ORI -1 Reassembling Skeleton|MM2 -1 Reclamation Sage|M15 +1 Reassembling Skeleton|M19 +1 Reclamation Sage|M19 1 Recoup|ODY 1 Regal Force|EMA 1 Relentless Dead|SOI 1 Repeal|IMA 1 Replenish|UDS -1 Reveillark|MMA +1 Reveillark|UMA 1 Riptide Laboratory|ONS -1 Rise from the Tides|SOI +1 Rise from the Tides|UMA 1 River Kelpie|SHM 1 Rocky Tar Pit|VMA 1 Rotlung Reanimator|ONS 1 Runechanter's Pike|ISD -1 Sacred Foundry|GTC +1 Sacred Foundry|GRN 1 Sage of Fables|MOR 1 Sage's Dousing|MOR 1 Sanguine Bond|IMA 1 Sarcomancy|TPR -1 Satyr Wayfinder|M15 +1 Satyr Wayfinder|UMA 1 Savannah|VMA 1 Scalding Tarn|MM3 1 Scavenging Ooze|MM3 @@ -402,7 +402,7 @@ Name=Guillaume Matignon's Jenny's-Johnny's Cube 1 Seal of Primordium|MM3 1 Searing Meditation|RAV 1 Secrets of the Dead|DKA -1 Seismic Assault|10E +1 Seismic Assault|UMA 1 Sensei's Divining Top|EMA 1 Serene Steward|BFZ 1 Serra Ascendant|IMA @@ -414,8 +414,8 @@ Name=Guillaume Matignon's Jenny's-Johnny's Cube 1 Shaman of the Pack|EMA 1 Shepherd of Rot|ONS 1 Shivan Reef|ORI -1 Shriekmaw|LRW -1 Siege-Gang Commander|EMA +1 Shriekmaw|UMA +1 Siege-Gang Commander|DOM 1 Sigil of the Empty Throne|ORI 1 Silent Departure|EMA 1 Silhana Ledgewalker|GPT @@ -424,7 +424,7 @@ Name=Guillaume Matignon's Jenny's-Johnny's Cube 1 Skirsdag High Priest|ISD 1 Skywise Teachings|IMA 1 Smokestack|VMA -1 Snapcaster Mage|MM3 +1 Snapcaster Mage|UMA 1 Soldier of the Pantheon|THS 1 Solemn Simulacrum|M12 1 Song of the Dryads @@ -443,14 +443,14 @@ Name=Guillaume Matignon's Jenny's-Johnny's Cube 1 Starfield of Nyx|ORI 1 Starstorm|VMA 1 Stasis Snare|BFZ -1 Steam Vents|RTR +1 Steam Vents|GRN 1 Steel Hellkite|SOM 1 Stitcher Geralf 1 Stomping Ground|GTC 1 Stormbind|TSB 1 Stromkirk Noble|ISD 1 Stronghold Assassin|TPR -1 Sulfur Falls|ISD +1 Sulfur Falls|DOM 1 Sulfurous Springs|10E 1 Sunlance|MM2 1 Sword of Light and Shadow|MMA @@ -460,17 +460,17 @@ Name=Guillaume Matignon's Jenny's-Johnny's Cube 1 Taiga|VMA 1 Talrand, Sky Summoner|M13 1 Tarfire|LRW -1 Tarmogoyf|MM3 +1 Tarmogoyf|UMA 1 Taurean Mauler|MOR 1 Teferi, Temporal Archmage -1 Temple Garden|RTR +1 Temple Garden|GRN 1 Temporal Isolation|TSP 1 Terminate|MM3 1 Tezzeret the Seeker|MM2 1 Thalia's Lieutenant|SOI -1 Thermo-Alchemist|EMN +1 Thermo-Alchemist|UMA 1 Thing in the Ice|SOI -1 Think Twice|ISD +1 Think Twice|UMA 1 Thopter Spy Network|ORI 1 Thought Courier|9ED 1 Thought Scour|IMA @@ -478,7 +478,7 @@ Name=Guillaume Matignon's Jenny's-Johnny's Cube 1 Tireless Tracker|SOI 1 Titania, Protector of Argoth 1 To the Slaughter|SOI -1 Tormenting Voice|IMA +1 Tormenting Voice|M19 1 Tracker's Instincts|DKA 1 Trade Routes|9ED 1 Trading Post|M14 @@ -487,7 +487,7 @@ Name=Guillaume Matignon's Jenny's-Johnny's Cube 1 Tropical Island|VMA 1 Tundra|VMA 1 Twisted Abomination|A25 -1 Ulamog, the Infinite Gyre|MM2 +1 Ulamog, the Infinite Gyre|UMA 1 Ulvenwald Hydra|SOI 1 Undead Alchemist|ISD 1 Undercity Informer|GTC @@ -498,7 +498,7 @@ Name=Guillaume Matignon's Jenny's-Johnny's Cube 1 Utopia Sprawl|A25 1 Vapor Snag|MM2 1 Vendilion Clique|A25 -1 Vengevine|ROE +1 Vengevine|UMA 1 Venser, Shaper Savant|MM3 1 Verdant Catacombs|MM3 1 Vessel of Nascency|A25 @@ -512,7 +512,7 @@ Name=Guillaume Matignon's Jenny's-Johnny's Cube 1 War Priest of Thune|EMA 1 Warren Instigator|ZEN 1 Wasteland|EMA -1 Watery Grave|GTC +1 Watery Grave|GRN 1 Wayfarer's Bauble|MM2 1 Weathered Wayfarer|9ED 1 Weaver of Lightning|EMN @@ -521,7 +521,7 @@ Name=Guillaume Matignon's Jenny's-Johnny's Cube 1 Werebear|EMA 1 Westvale Abbey|SOI 1 Whip of Erebos|THS -1 Wickerbough Elder|EVE +1 Wickerbough Elder|UMA 1 Wild Research|APC 1 Winds of Rath|TPR 1 Windswept Heath|KTK @@ -530,13 +530,13 @@ Name=Guillaume Matignon's Jenny's-Johnny's Cube 1 Wood Elves|9ED 1 Wood Sage|TPR 1 Wooded Foothills|KTK -1 Woodland Cemetery|ISD +1 Woodland Cemetery|DOM 1 World Breaker|OGW 1 Worm Harvest|MMA 1 Worn Powerstone|EMA 1 Wort, Boggart Auntie|LRW 1 Yavimaya Coast|ORI 1 Yavimaya Enchantress|EMA -1 Young Pyromancer|EMA +1 Young Pyromancer|UMA 1 Zealous Conscripts|MM3 1 Zur the Enchanter|MM3 diff --git a/forge-gui/res/cube/Jim Davis's Cube (469 cards).dck b/forge-gui/res/cube/Jim Davis's Cube (469 cards).dck index cb46bf4a225..ac4223a0371 100644 --- a/forge-gui/res/cube/Jim Davis's Cube (469 cards).dck +++ b/forge-gui/res/cube/Jim Davis's Cube (469 cards).dck @@ -10,7 +10,7 @@ Name=Jim Davis's Cube (469 cards) 1 Aether Vial|IMA 1 Ajani Vengeant|ALA 1 Ancient Den|MRD -1 Ancient Tomb|VMA +1 Ancient Tomb|UMA 1 Animate Dead|EMA 1 Ankh of Mishra|VMA 1 Arcbound Ravager|MMA @@ -31,7 +31,7 @@ Name=Jim Davis's Cube (469 cards) 1 Bazaar of Baghdad|VMA 1 Birds of Paradise|M12 1 Birthing Pod|NPH -1 Bitterblossom|MM2 +1 Bitterblossom|UMA 1 Blackcleave Cliffs|SOM 1 Blade Splicer|MM3 1 Blightning|A25 @@ -57,7 +57,7 @@ Name=Jim Davis's Cube (469 cards) 1 Careful Study|ODY 1 Carrion Feeder|EMA 1 Catacomb Sifter|BFZ -1 Celestial Colonnade|WWK +1 Celestial Colonnade|UMA 1 Chained to the Rocks|THS 1 Chain Lightning|EMA 1 Champion of the Parish|ISD @@ -68,7 +68,7 @@ Name=Jim Davis's Cube (469 cards) 1 Chrome Mox|EMA 1 City of Brass|MMA 1 City of Traitors|TPR -1 Clifftop Retreat|ISD +1 Clifftop Retreat|DOM 1 Coalition Relic|A25 1 Coercive Portal|VMA 1 Collected Company|DTK @@ -77,9 +77,9 @@ Name=Jim Davis's Cube (469 cards) 1 Council's Judgment|CNS 1 Counterspell|A25 1 Cranial Plating|MM2 -1 Creeping Tar Pit|WWK +1 Creeping Tar Pit|UMA 1 Crop Rotation|ULG -1 Crucible of Worlds|10E +1 Crucible of Worlds|M19 1 Cruel Ultimatum|MM3 1 Cryptic Command|IMA 1 Curse of Shallow Graves @@ -93,11 +93,11 @@ Name=Jim Davis's Cube (469 cards) 1 Deathrite Shaman|EMA 1 Declaration in Stone|SOI 1 Delver of Secrets|ISD -1 Demonic Tutor|VMA +1 Demonic Tutor|UMA 1 Detention Sphere|RTR -1 Dig Through Time|KTK +1 Dig Through Time|UMA 1 Dimir Signet|MM3 -1 Diregraf Ghoul|ISD +1 Diregraf Ghoul|M19 1 Dismember|MM2 1 Dragon Hunter|DTK 1 Dragonlord Atarka|DTK @@ -109,12 +109,12 @@ Name=Jim Davis's Cube (469 cards) 1 Edric, Spymaster of Trest|VMA 1 Eidolon of the Great Revel|A25 1 Electrolyze|IMA -1 Emrakul, the Aeons Torn|MM2 -1 Engineered Explosives|MMA +1 Emrakul, the Aeons Torn|UMA +1 Engineered Explosives|UMA 1 Enlightened Tutor|EMA -1 Entomb|EMA +1 Entomb|UMA 1 Etched Champion|MM2 -1 Eternal Witness|MMA +1 Eternal Witness|UMA 1 Etherium Sculptor|MMA 1 Ethersworn Canonist|MMA 1 Eureka|VMA @@ -123,18 +123,18 @@ Name=Jim Davis's Cube (469 cards) 1 Experiment One|GTC 1 Explore|MM3 1 Fact or Fiction|EMA -1 Faithless Looting|EMA +1 Faithless Looting|UMA 1 Falkenrath Aristocrat|MM3 1 Falkenrath Gorger|SOI 1 Far // Away|DGM 1 Fastbond|VMA -1 Fauna Shaman|M11 +1 Fauna Shaman|UMA 1 Figure of Destiny|MMA -1 Fire // Ice|APC +1 Fire // Ice|UMA 1 Fireblast|VMA 1 Firebolt|EMA 1 Firestorm|WTH -1 Flagstones of Trokair|TSP +1 Flagstones of Trokair|UMA 1 Flametongue Kavu|VMA 1 Flesh Carver 1 Flickerwisp|MM3 @@ -142,12 +142,12 @@ Name=Jim Davis's Cube (469 cards) 1 Flooded Strand|KTK 1 Force of Will|EMA 1 Forgotten Cave|VMA -1 Frantic Search|VMA +1 Frantic Search|UMA 1 Frogmite|MM2 -1 Fulminator Mage|MM2 +1 Fulminator Mage|UMA 1 Gaea's Cradle|USG 1 Galvanic Blast|SOM -1 Gamble|EMA +1 Gamble|UMA 1 Garruk Wildspeaker|M11 1 Geist of Saint Traft|ISD 1 Gemstone Mine|TSB @@ -155,7 +155,7 @@ Name=Jim Davis's Cube (469 cards) 1 Ghor-Clan Rampager|MM3 1 Gideon, Ally of Zendikar|BFZ 1 Gifts Ungiven|MM3 -1 Gilded Lotus|M13 +1 Gilded Lotus|DOM 1 Gitaxian Probe|NPH 1 Gnarled Scarhide|JOU 1 Go for the Throat|MBS @@ -184,9 +184,9 @@ Name=Jim Davis's Cube (469 cards) 1 Helm of Awakening|VIS 1 Hero of Bladehold|MBS 1 Hex Parasite|NPH -1 Hinterland Harbor|ISD +1 Hinterland Harbor|DOM 1 Hokori, Dust Drinker|BOK -1 Hooting Mandrills|KTK +1 Hooting Mandrills|UMA 1 Horizon Canopy|IMA 1 Hymn to Tourach|EMA 1 Imperial Recruiter|A25 @@ -195,39 +195,39 @@ Name=Jim Davis's Cube (469 cards) 1 Inquisition of Kozilek|MM3 1 Isamaru, Hound of Konda|CHK 1 Isochron Scepter|EMA -1 Isolated Chapel|ISD +1 Isolated Chapel|DOM 1 Izzet Signet|MM3 1 Jace, the Mind Sculptor|VMA 1 Jace, Vryn's Prodigy|ORI 1 Jeskai Ascendancy|KTK 1 Joraga Treespeaker|ROE 1 Jori En, Ruin Diver|OGW -1 Karakas|EMA -1 Karn Liberated|MM2 +1 Karakas|UMA +1 Karn Liberated|UMA 1 Keranos, God of Storms|JOU 1 Kessig Wolf Run|ISD 1 Kiki-Jiki, Mirror Breaker|IMA 1 Kira, Great Glass-Spinner|MMA 1 Kird Ape|EMA -1 Kitchen Finks|MMA +1 Kitchen Finks|UMA 1 Knight of the Reliquary|IMA 1 Kolaghan's Command|DTK 1 Kytheon, Hero of Akros|ORI 1 Land Tax|4ED -1 Life from the Loam|MMA +1 Life from the Loam|UMA 1 Lightning Bolt|A25 1 Lightning Helix|IMA 1 Lightning Mauler|AVR -1 Liliana of the Veil|MM3 +1 Liliana of the Veil|UMA 1 Lim-Dul's Vault|ALL 1 Lingering Souls|MM3 1 Lion's Eye Diamond|MIR -1 Llanowar Elves|EMA +1 Llanowar Elves|DOM 1 Loam Lion|WWK 1 Lodestone Golem|MM2 1 Lotus Cobra|IMA 1 Lotus Petal|TPR -1 Maelstrom Pulse|MMA +1 Maelstrom Pulse|UMA 1 Magma Jet|MM3 1 Makindi Sliderunner|BFZ 1 Mana Confluence|JOU @@ -241,7 +241,7 @@ Name=Jim Davis's Cube (469 cards) 1 Memnite|SOM 1 Memory Jar|VMA 1 Memory Lapse|EMA -1 Mentor of the Meek|ISD +1 Mentor of the Meek|M19 1 Metalworker|UDS 1 Mind Stone|IMA 1 Mindslaver|SOM @@ -263,7 +263,7 @@ Name=Jim Davis's Cube (469 cards) 1 Mystical Tutor|EMA 1 Necropotence|IMA 1 Nether Void|LEG -1 Noble Hierarch|MM2 +1 Noble Hierarch|UMA 1 Oath of Druids|TPR 1 Oblivion Ring|MM2 1 Ohran Viper|CSP @@ -273,7 +273,7 @@ Name=Jim Davis's Cube (469 cards) 1 Oracle of Mul Daya|ZEN 1 Orzhov Signet|MM3 1 Outpost Siege|FRF -1 Overgrown Tomb|RTR +1 Overgrown Tomb|GRN 1 Pack Rat|RTR 1 Painful Truths|BFZ 1 Path to Exile|MM3 @@ -282,7 +282,7 @@ Name=Jim Davis's Cube (469 cards) 1 Phyrexian Arena|9ED 1 Phyrexian Metamorph|NPH 1 Phyrexian Revoker|M15 -1 Phyrexian Tower|USG +1 Phyrexian Tower|UMA 1 Pia and Kiran Nalaar|ORI 1 Plateau|VMA 1 Plow Under|8ED @@ -294,7 +294,7 @@ Name=Jim Davis's Cube (469 cards) 1 Precursor Golem|MM2 1 Preordain|M11 1 Primeval Titan|IMA -1 Prismatic Lens|EMA +1 Prismatic Lens|UMA 1 Putrid Imp|VMA 1 Qasali Pridemage|ARB 1 Rakdos Cackler|RTR @@ -303,20 +303,20 @@ Name=Jim Davis's Cube (469 cards) 1 Ratchet Bomb|M14 1 Ravenous Baboons|EXO 1 Razorverge Thicket|SOM -1 Reanimate|TPR -1 Reckless Charge|EMA -1 Reclamation Sage|M15 +1 Reanimate|UMA +1 Reckless Charge|UMA +1 Reclamation Sage|M19 1 Recurring Nightmare|TPR 1 Reflector Mage|OGW 1 Regrowth|A25 1 Relic Seeker|ORI 1 Remand|MM2 1 Restoration Angel|IMA -1 Reveillark|MMA +1 Reveillark|UMA 1 Rishadan Port|A25 1 Rofellos, Llanowar Emissary|VMA 1 Rude Awakening|MMA -1 Sacred Foundry|GTC +1 Sacred Foundry|GRN 1 Sakura-Tribe Elder|CNS 1 Savannah|VMA 1 Scalding Tarn|MM3 @@ -344,7 +344,7 @@ Name=Jim Davis's Cube (469 cards) 1 Skyshroud Elite|EXO 1 Smallpox|CNS 1 Smokestack|VMA -1 Snapcaster Mage|MM3 +1 Snapcaster Mage|UMA 1 Sneak Attack|EMA 1 Soldier of the Pantheon|THS 1 Solemn Simulacrum|M12 @@ -356,7 +356,7 @@ Name=Jim Davis's Cube (469 cards) 1 Sphinx's Revelation|MM3 1 Squee, Goblin Nabob|MMA 1 Standstill|ODY -1 Steam Vents|RTR +1 Steam Vents|GRN 1 Steel Overseer|M11 1 Steppe Lynx|ZEN 1 Stoke the Flames|M15 @@ -368,7 +368,7 @@ Name=Jim Davis's Cube (469 cards) 1 Stromkirk Noble|ISD 1 Sudden Demise 1 Sudden Shock|MMA -1 Sulfur Falls|ISD +1 Sulfur Falls|DOM 1 Sulfuric Vortex|EMA 1 Sun Titan|M12 1 Sundering Titan|A25 @@ -379,10 +379,10 @@ Name=Jim Davis's Cube (469 cards) 1 Sylvan Library|EMA 1 Taiga|VMA 1 Tangle Wire|NMS -1 Tarmogoyf|MM3 +1 Tarmogoyf|UMA 1 Tasigur, the Golden Fang|FRF 1 Teetering Peaks|ZEN -1 Temple Garden|RTR +1 Temple Garden|GRN 1 Temple of Epiphany|JOU 1 Temple of Malice|BNG 1 Tendrils of Agony|VMA @@ -414,7 +414,7 @@ Name=Jim Davis's Cube (469 cards) 1 Tranquil Thicket|VMA 1 Traverse the Ulvenwald|SOI 1 Treachery|UDS -1 Treasure Cruise|KTK +1 Treasure Cruise|UMA 1 Tree of Tales|MRD 1 Treetop Village|10E 1 Trinket Mage|SOM @@ -434,7 +434,7 @@ Name=Jim Davis's Cube (469 cards) 1 Vault Skirge|NPH 1 Vedalken Shackles|MMA 1 Vendilion Clique|A25 -1 Vengevine|ROE +1 Vengevine|UMA 1 Venser, Shaper Savant|MM3 1 Verdant Catacombs|MM3 1 Village Messenger|SOI @@ -447,7 +447,7 @@ Name=Jim Davis's Cube (469 cards) 1 Wall of Roots|IMA 1 Wasteland|EMA 1 Waterfront Bouncer|VMA -1 Watery Grave|GTC +1 Watery Grave|GRN 1 Wheel of Fortune|VMA 1 Whisperwood Elemental|FRF 1 Wild Nacatl|ALA @@ -456,11 +456,11 @@ Name=Jim Davis's Cube (469 cards) 1 Windswept Heath|KTK 1 Winter Orb|EMA 1 Wooded Foothills|KTK -1 Woodland Cemetery|ISD +1 Woodland Cemetery|DOM 1 Worm Harvest|MMA 1 Wrath of God|EMA 1 Wurmcoil Engine|SOM 1 Xathrid Necromancer|M14 1 Yawgmoth's Will|USG -1 Young Pyromancer|EMA +1 Young Pyromancer|UMA 1 Zurgo Bellstriker|DTK diff --git a/forge-gui/res/cube/Jospeh Vasoli's Peasant Cube.dck b/forge-gui/res/cube/Jospeh Vasoli's Peasant Cube.dck index 16e0d375afe..655196d2235 100644 --- a/forge-gui/res/cube/Jospeh Vasoli's Peasant Cube.dck +++ b/forge-gui/res/cube/Jospeh Vasoli's Peasant Cube.dck @@ -12,7 +12,7 @@ Name=Jospeh Vasoli's Peasant Cube 1 Ambush Viper|ISD 1 Ana Battlemage|PLC 1 Ancient Ziggurat|CFX -1 Anticipate|BFZ +1 Anticipate|M19 1 Arachnogenesis 1 Arbor Elf|A25 1 Arc Lightning|KTK @@ -20,7 +20,7 @@ Name=Jospeh Vasoli's Peasant Cube 1 Arcane Sanctum|MM3 1 Archetype of Courage|BNG 1 Arrest|MM2 -1 Artisan of Kozilek|MM2 +1 Artisan of Kozilek|UMA 1 Augur of Bolas|MM3 1 Avacyn's Pilgrim|MM3 1 Avalanche Riders|TSB @@ -54,7 +54,7 @@ Name=Jospeh Vasoli's Peasant Cube 1 Borderland Marauder|IMA 1 Borderland Ranger|AVR 1 Boros Charm|A25 -1 Boros Guildgate|MM3 +1 Boros Guildgate|GRN 1 Branching Bolt|ALA 1 Briarhorn|LRW 1 Briarpack Alpha|M14 @@ -72,7 +72,7 @@ Name=Jospeh Vasoli's Peasant Cube 1 Celestial Crusader|TSP 1 Cenn's Tactician|MOR 1 Chain Lightning|EMA -1 Chainer's Edict|TOR +1 Chainer's Edict|UMA 1 Chittering Rats|DST 1 Chronomaton|M13 1 City of Brass|MMA @@ -110,7 +110,7 @@ Name=Jospeh Vasoli's Peasant Cube 1 Diabolic Servitude|USG 1 Dimir Aqueduct|IMA 1 Dimir Signet|MM3 -1 Diregraf Ghoul|ISD +1 Diregraf Ghoul|M19 1 Disfigure|A25 1 Dismember|MM2 1 Dismiss|TPR @@ -123,7 +123,7 @@ Name=Jospeh Vasoli's Peasant Cube 1 Dromoka Warrior|DTK 1 Drown in Sorrow|BNG 1 Dryad Militant|RTR -1 Duress|IMA +1 Duress|M19 1 Duskwatch Recruiter|SOI 1 Eldrazi Skyspawner|BFZ 1 Electrolyze|IMA @@ -143,15 +143,15 @@ Name=Jospeh Vasoli's Peasant Cube 1 Epochrasite|MMA 1 Errant Ephemeron|MMA 1 Esper Charm|ALA -1 Essence Scatter|AKH -1 Eternal Witness|MMA +1 Essence Scatter|M19 +1 Eternal Witness|UMA 1 Everflowing Chalice|MM2 1 Evolving Wilds|RIX 1 Exclude|A25 1 Expedition Envoy|BFZ 1 Explore|MM3 1 Fact or Fiction|EMA -1 Faith's Fetters|EMA +1 Faith's Fetters|UMA 1 Falkenrath Noble|MM3 1 False Summoning|PO2 1 Fanatic of Xenagos|BNG @@ -159,7 +159,7 @@ Name=Jospeh Vasoli's Peasant Cube 1 Fencer Clique|MOR 1 Fervent Cathar|EMA 1 Feudkiller's Verdict|MMA -1 Fiend Hunter|A25 +1 Fiend Hunter|UMA 1 Fire Covenant|ICE 1 Fire Imp|POR 1 Fireblast|VMA @@ -195,7 +195,7 @@ Name=Jospeh Vasoli's Peasant Cube 1 Gore-House Chainwalker|RTR 1 Grafted Wargear|5DN 1 Grasp of Fate -1 Gravedigger|AKH +1 Gravedigger|M19 1 Gray Merchant of Asphodel|THS 1 Graypelt Refuge|ZEN 1 Great Oak Guardian @@ -203,8 +203,8 @@ Name=Jospeh Vasoli's Peasant Cube 1 Grizzly Fate|VMA 1 Gryff Vanguard|AVR 1 Guardian of the Guildpact|DIS -1 Gurmag Angler|FRF -1 Guttersnipe|IMA +1 Gurmag Angler|UMA +1 Guttersnipe|M19 1 Halimar Wavewatch|ROE 1 Harmonize|MM3 1 Harrow|TPR @@ -216,7 +216,7 @@ Name=Jospeh Vasoli's Peasant Cube 1 Hordeling Outburst|A25 1 Hymn to Tourach|EMA 1 Hypnotic Specter|M10 -1 Icy Manipulator|10E +1 Icy Manipulator|DOM 1 Incendiary Flow|EMN 1 Incinerate|M12 1 Incremental Blight|SHM @@ -235,16 +235,16 @@ Name=Jospeh Vasoli's Peasant Cube 1 Jhessian Thief|IMA 1 Joraga Treespeaker|ROE 1 Journey to Nowhere|ZEN -1 Juggernaut|EMA +1 Juggernaut|DOM 1 Jungle Hollow|EMA 1 Jungle Shrine|MM3 1 Jwar Isle Refuge|ZEN 1 Kazandu Refuge|ZEN 1 Keldon Champion|EMA 1 Kiln Fiend|IMA -1 Kitchen Finks|MMA +1 Kitchen Finks|UMA 1 Knight of Glory|M13 -1 Kodama's Reach|MMA +1 Kodama's Reach|UMA 1 Kor Castigator|BFZ 1 Kor Hookmaster|MM3 1 Kozilek's Predator|MM2 @@ -255,10 +255,10 @@ Name=Jospeh Vasoli's Peasant Cube 1 Lightning Bolt|A25 1 Lightning Greaves|MRD 1 Lightning Helix|IMA -1 Lightning Strike|XLN +1 Lightning Strike|M19 1 Liliana's Specter|CNS 1 Lingering Souls|MM3 -1 Llanowar Elves|EMA +1 Llanowar Elves|DOM 1 Looter il-Kor|TSP 1 Loxodon Warhammer|10E 1 Lu Xun, Scholar General|PTK @@ -289,7 +289,7 @@ Name=Jospeh Vasoli's Peasant Cube 1 Mishra's Factory|A25 1 Mist Raven|MM3 1 Mistral Charger|EMA -1 Moan of the Unhallowed|ISD +1 Moan of the Unhallowed|UMA 1 Mogis's Marauder|THS 1 Monastery Swiftspear|IMA 1 Mortarpod|MM2 @@ -297,7 +297,7 @@ Name=Jospeh Vasoli's Peasant Cube 1 Mulldrifter|MM2 1 Murder of Crows|A25 1 Murderous Cut|KTK -1 Murderous Redcap|MMA +1 Murderous Redcap|UMA 1 Mwonvuli Beast Tracker|M13 1 Mystic Monastery|KTK 1 Nantuko Husk|ORI @@ -314,16 +314,16 @@ Name=Jospeh Vasoli's Peasant Cube 1 Nylea's Disciple|THS 1 Nyx Weaver|JOU 1 Oblivion Ring|MM2 -1 Omenspeaker|THS +1 Omenspeaker|M19 1 Opulent Palace|KTK 1 Oreskos Explorer 1 Ornitharch|BNG 1 Overrun|TPR 1 Pacifism|A25 1 Path to Exile|MM3 -1 Pelakka Wurm|MM2 +1 Pelakka Wurm|M19 1 Penumbra Spider|MM3 -1 Penumbra Wurm|VMA +1 Penumbra Wurm|UMA 1 Perilous Myr|A25 1 Persuasion|10E 1 Pestermite|MMA @@ -344,8 +344,8 @@ Name=Jospeh Vasoli's Peasant Cube 1 Porcelain Legionnaire|NPH 1 Possessed Skaab|ORI 1 Preordain|M11 -1 Prey Upon|AER -1 Prismatic Lens|EMA +1 Prey Upon|UMA +1 Prismatic Lens|UMA 1 Pristine Talisman|IMA 1 Psionic Blast|TSB 1 Psychatog|VMA @@ -355,7 +355,7 @@ Name=Jospeh Vasoli's Peasant Cube 1 Qarsi High Priest|FRF 1 Qasali Pridemage|ARB 1 Quarry Colossus|JOU -1 Rabid Bite|SOI +1 Rabid Bite|M19 1 Radiant, Archangel|VMA 1 Rakdos Cackler|RTR 1 Rakshasa Gravecaller|DTK @@ -365,9 +365,9 @@ Name=Jospeh Vasoli's Peasant Cube 1 Ravenous Rats|M13 1 Ray of Command|5ED 1 Read the Bones|ORI -1 Reassembling Skeleton|MM2 +1 Reassembling Skeleton|M19 1 Reckless Waif|ISD -1 Reclamation Sage|M15 +1 Reclamation Sage|M19 1 Reflector Mage|OGW 1 Regrowth|A25 1 Relief Captain|OGW @@ -378,7 +378,7 @@ Name=Jospeh Vasoli's Peasant Cube 1 Ribbons of Night|RAV 1 Riftwing Cloudskate|MMA 1 Rise // Fall|DIS -1 Rise from the Tides|SOI +1 Rise from the Tides|UMA 1 Rite of the Raging Storm 1 Roar of the Wurm|EMA 1 Roast|DTK @@ -386,7 +386,7 @@ Name=Jospeh Vasoli's Peasant Cube 1 Rolling Thunder|BFZ 1 Rubblebelt Maaka|MM3 1 Rugged Highlands|EMA -1 Rupture Spire|CFX +1 Rupture Spire|M19 1 Sadistic Hypnotist|ODY 1 Sakura-Tribe Elder|CNS 1 Sandsteppe Citadel|KTK @@ -412,13 +412,13 @@ Name=Jospeh Vasoli's Peasant Cube 1 Sentinel of the Eternal Watch|ORI 1 Seraph of Dawn|AVR 1 Serendib Efreet|EMA -1 Serra Angel|IMA +1 Serra Angel|DOM 1 Serrated Arrows|TSB 1 Serum Visions|MM3 1 Shardless Agent|EMA 1 Shimmering Glasskite|BOK 1 Shower of Coals|ODY -1 Shriekmaw|LRW +1 Shriekmaw|UMA 1 Shrine of Burning Rage|NPH 1 Shrine of Loyal Legions|NPH 1 Sigiled Starfish|ORI @@ -466,9 +466,9 @@ Name=Jospeh Vasoli's Peasant Cube 1 Temporal Isolation|TSP 1 Temur Charm|KTK 1 Temur Sabertooth|FRF -1 Terramorphic Expanse|MMA +1 Terramorphic Expanse|UMA 1 Thassa's Emissary|THS -1 Thermo-Alchemist|EMN +1 Thermo-Alchemist|UMA 1 Thieving Magpie|10E 1 Thirst for Knowledge|MMA 1 Thornscape Battlemage|MM3 @@ -483,16 +483,16 @@ Name=Jospeh Vasoli's Peasant Cube 1 Tormented Hero|THS 1 Tower Geist|ORI 1 Transguild Promenade|RTR -1 Treasure Cruise|KTK +1 Treasure Cruise|UMA 1 Treetop Village|10E 1 Triplicate Spirits|M15 1 Triumph of Ferocity|AVR 1 Trostani's Summoner|DGM 1 Trusty Machete|ZEN 1 Trygon Predator|EMA -1 Ulamog's Crusher|MM2 +1 Ulamog's Crusher|UMA 1 Ultimate Price|DTK -1 Unburial Rites|MM3 +1 Unburial Rites|UMA 1 Undercity Informer|GTC 1 Undercity Troll|IMA 1 Undo|VIS @@ -521,13 +521,13 @@ Name=Jospeh Vasoli's Peasant Cube 1 Wall of Blossoms|TPR 1 Wall of Omens|EMA 1 Wall of Roots|IMA -1 Wandering Champion|FRF +1 Wandering Champion|UMA 1 War-Name Aspirant|KTK 1 Wash Out|INV 1 Weaver of Lightning|EMN -1 Wee Dragonauts|EMA +1 Wee Dragonauts|GRN 1 Whirler Rogue|ORI -1 Wickerbough Elder|EVE +1 Wickerbough Elder|UMA 1 Wight of Precinct Six|IMA 1 Wind-Scarred Crag|EMA 1 Wing Shards|IMA @@ -536,6 +536,6 @@ Name=Jospeh Vasoli's Peasant Cube 1 Wrench Mind|IMA 1 Xiahou Dun, the One-Eyed 1 Yavimaya Elder|VMA -1 Young Pyromancer|EMA +1 Young Pyromancer|UMA 1 Zealous Persecution|EMA 1 Zulaport Cutthroat|A25 diff --git a/forge-gui/res/cube/Legendary Cube (598 cards).dck b/forge-gui/res/cube/Legendary Cube (598 cards).dck index 347eb174518..df56c8cc5ee 100644 --- a/forge-gui/res/cube/Legendary Cube (598 cards).dck +++ b/forge-gui/res/cube/Legendary Cube (598 cards).dck @@ -12,7 +12,7 @@ Name=Legendary Cube (598 cards) 1 All Suns' Dawn|MM2 1 Anafenza, Kin-Tree Spirit|DTK 1 Anger of the Gods|IMA -1 Anticipate|BFZ +1 Anticipate|M19 1 Arashi, the Sky Asunder|SOK 1 Arcane Denial|A25 1 Arcane Sanctum|MM3 @@ -65,16 +65,16 @@ Name=Legendary Cube (598 cards) 1 Catch // Release|DGM 1 Cauldron of Souls|SHM 1 Chain Reaction|WWK -1 Chainer's Edict|TOR +1 Chainer's Edict|UMA 1 Champion's Helm 1 Chandra, Fire of Kaladesh|ORI 1 Charcoal Diamond|7ED 1 Cho-Manno, Revolutionary -1 Chromatic Lantern|RTR +1 Chromatic Lantern|GRN 1 Chromatic Sphere|MRD 1 Chromatic Star|10E 1 Cinder Glade|BFZ -1 Clifftop Retreat|ISD +1 Clifftop Retreat|DOM 1 Coalition Relic|A25 1 Coalition Victory|TSB 1 Coldsteel Heart|CSP @@ -95,10 +95,10 @@ Name=Legendary Cube (598 cards) 1 Cultivate|A25 1 Cyclonic Rift|MM3 1 Daretti, Scrap Savant -1 Dark Depths|CSP +1 Dark Depths|UMA 1 Daxos of Meletis|THS 1 Day of Destiny|BOK -1 Death Denied|MM2 +1 Death Denied|UMA 1 Detention Sphere|RTR 1 Devour Flesh|GTC 1 Devour in Shadow @@ -123,7 +123,7 @@ Name=Legendary Cube (598 cards) 1 Dreadship Reef|TSP 1 Dromoka's Command|DTK 1 Drowned Catacomb|XLN -1 Duress|IMA +1 Duress|M19 1 Dwynen, Gilt-Leaf Daen|ORI 1 Edric, Spymaster of Trest|VMA 1 Eiganjo Castle|CHK @@ -132,9 +132,9 @@ Name=Legendary Cube (598 cards) 1 Eladamri, Lord of Leaves|TMP 1 Elbrus, the Binding Blade|DKA 1 Elesh Norn, Grand Cenobite|IMA -1 Emrakul, the Aeons Torn|MM2 +1 Emrakul, the Aeons Torn|UMA 1 Endrek Sahr, Master Breeder|MM2 -1 Engineered Explosives|MMA +1 Engineered Explosives|UMA 1 Enlightened Tutor|EMA 1 Esper Charm|ALA 1 Everflowing Chalice|MM2 @@ -146,8 +146,8 @@ Name=Legendary Cube (598 cards) 1 Expunge|VMA 1 Ezuri, Claw of Progress 1 Fact or Fiction|EMA -1 Faith's Fetters|EMA -1 Faithless Looting|EMA +1 Faith's Fetters|UMA +1 Faithless Looting|UMA 1 Far // Away|DGM 1 Farseek|M13 1 Fellwar Stone|9ED @@ -162,7 +162,7 @@ Name=Legendary Cube (598 cards) 1 Flood Plain|VMA 1 Flooded Grove|A25 1 Flooded Strand|KTK -1 Forbidden Alchemy|MM3 +1 Forbidden Alchemy|UMA 1 Foresee|M11 1 Frontier Bivouac|KTK 1 Fungal Reaches|TSP @@ -172,7 +172,7 @@ Name=Legendary Cube (598 cards) 1 Ghoulcaller Gisa 1 Gift of the Gargantuan|ALA 1 Gilded Light|VMA -1 Gilded Lotus|M13 +1 Gilded Lotus|DOM 1 Gisela, Blade of Goldnight|AVR 1 Glacial Fortress|XLN 1 Gleam of Resistance|MMA @@ -180,7 +180,7 @@ Name=Legendary Cube (598 cards) 1 Glissa, the Traitor|MBS 1 Godless Shrine|GTC 1 Godo, Bandit Warlord|CHK -1 Gods Willing|A25 +1 Gods Willing|UMA 1 Golgari Rot Farm|IMA 1 Golgari Signet|MM3 1 Grasslands|VMA @@ -201,7 +201,7 @@ Name=Legendary Cube (598 cards) 1 Heroes' Podium|BNG 1 Hide // Seek|DIS 1 Hidetsugu's Second Rite|SOK -1 Hinterland Harbor|ISD +1 Hinterland Harbor|DOM 1 Homicidal Seclusion|AVR 1 Honden of Cleansing Fire|EMA 1 Honden of Infinite Rage|EMA @@ -218,7 +218,7 @@ Name=Legendary Cube (598 cards) 1 Into the Roil|ZEN 1 Isamaru, Hound of Konda|CHK 1 Isao, Enlightened Bushi|BOK -1 Isolated Chapel|ISD +1 Isolated Chapel|DOM 1 Ith, High Arcanist|TSP 1 Izzet Boilerworks|IMA 1 Izzet Signet|MM3 @@ -250,13 +250,13 @@ Name=Legendary Cube (598 cards) 1 Keranos, God of Storms|JOU 1 Kira, Great Glass-Spinner|MMA 1 Kodama of the North Tree|CHK -1 Kodama's Reach|MMA +1 Kodama's Reach|UMA 1 Kokusho, the Evening Star|MMA 1 Kolaghan's Command|DTK 1 Kolaghan, the Storm's Fury|FRF 1 Konda's Banner|CHK 1 Kongming, "Sleeping Dragon"|A25 -1 Kozilek, Butcher of Truth|MM2 +1 Kozilek, Butcher of Truth|UMA 1 Krenko, Mob Boss|M13 1 Kresh the Bloodbraided|ALA 1 Krosan Grip|MMA @@ -293,7 +293,7 @@ Name=Legendary Cube (598 cards) 1 Meng Huo, Barbarian King|PTK 1 Meren of Clan Nel Toth 1 Mikaeus, the Lunarch|ISD -1 Mikaeus, the Unhallowed|DKA +1 Mikaeus, the Unhallowed|UMA 1 Mikokoro, Center of the Sea|A25 1 Minamo, School at Water's Edge|CHK 1 Mind Stone|IMA @@ -326,7 +326,7 @@ Name=Legendary Cube (598 cards) 1 Mystic Monastery|KTK 1 Nagao, Bound by Honor|CHK 1 Nath of the Gilt-Leaf|LRW -1 Naturalize|RIX +1 Naturalize|M19 1 Negate|RIX 1 Night's Whisper|EMA 1 Nissa's Revelation|ORI @@ -352,7 +352,7 @@ Name=Legendary Cube (598 cards) 1 Orzhov Basilica|IMA 1 Orzhov Signet|MM3 1 Outpost Siege|FRF -1 Overgrown Tomb|RTR +1 Overgrown Tomb|GRN 1 Panoptic Mirror|DST 1 Pariah|10E 1 Path to Exile|MM3 @@ -369,7 +369,7 @@ Name=Legendary Cube (598 cards) 1 Prairie Stream|BFZ 1 Prime Speaker Zegana|GTC 1 Primeval Bounty|M14 -1 Prismatic Lens|EMA +1 Prismatic Lens|UMA 1 Progenitus|MMA 1 Prophetic Prism|A25 1 Psychotic Fury|DIS @@ -394,7 +394,7 @@ Name=Legendary Cube (598 cards) 1 Repeal|IMA 1 Repulse|INV 1 Rescind|VMA -1 Reya Dawnbringer|CNS +1 Reya Dawnbringer|UMA 1 Rhys the Redeemed|SHM 1 Righteous Confluence 1 Rings of Brighthearth|LRW @@ -403,12 +403,12 @@ Name=Legendary Cube (598 cards) 1 Rootbound Crag|XLN 1 Rorix Bladewing|EMA 1 Rugged Prairie|A25 -1 Rupture Spire|CFX +1 Rupture Spire|M19 1 Ruric Thar, the Unbowed|DGM 1 Rush of Knowledge|SCG 1 Ryusei, the Falling Star|MMA 1 Sachi, Daughter of Seshiro|CHK -1 Sacred Foundry|GTC +1 Sacred Foundry|GRN 1 Saffi Eriksdotter|TSP 1 Sakashima the Impostor|SOK 1 Saltcrusted Steppe|TSP @@ -449,7 +449,7 @@ Name=Legendary Cube (598 cards) 1 Smoldering Marsh|BFZ 1 Song of the Dryads 1 Sorin's Vengeance|M12 -1 Soul's Fire|ALA +1 Soul's Fire|UMA 1 Sphere of the Suns|MM2 1 Sphinx-Bone Wand|ROE 1 Spine of Ish Sah|MBS @@ -457,11 +457,11 @@ Name=Legendary Cube (598 cards) 1 Spite // Malice|INV 1 Squee, Goblin Nabob|MMA 1 Staff of Nin|M13 -1 Steam Vents|RTR +1 Steam Vents|GRN 1 Stitcher Geralf 1 Stomping Ground|GTC 1 Stubborn Denial|KTK -1 Sulfur Falls|ISD +1 Sulfur Falls|DOM 1 Sultai Charm|KTK 1 Sun Ce, Young Conquerer 1 Sun Quan, Lord of Wu|PTK @@ -490,7 +490,7 @@ Name=Legendary Cube (598 cards) 1 Tasigur, the Golden Fang|FRF 1 Tatsumasa, the Dragon's Fang|CHK 1 Teferi, Mage of Zhalfir|IMA -1 Temple Garden|RTR +1 Temple Garden|GRN 1 Temple of Abandon|THS 1 Temple of Deceit|THS 1 Temple of Enlightenment|BNG @@ -506,7 +506,7 @@ Name=Legendary Cube (598 cards) 1 Temur Battle Rage|FRF 1 Tenza, Godo's Maul|CHK 1 Terminate|MM3 -1 Terramorphic Expanse|MMA +1 Terramorphic Expanse|UMA 1 Terrarion|EMN 1 Teysa, Envoy of Ghosts|DGM 1 Tezzeret the Seeker|MM2 @@ -524,7 +524,7 @@ Name=Legendary Cube (598 cards) 1 Tithe|VIS 1 Tolsimir Wolfblood|RAV 1 Tomorrow, Azami's Familiar|BOK -1 Tormenting Voice|IMA +1 Tormenting Voice|M19 1 Toshiro Umezawa|BOK 1 Toxic Deluge|EMA 1 Trading Post|M14 @@ -542,14 +542,14 @@ Name=Legendary Cube (598 cards) 1 Twilight Mire|A25 1 Tymaret, the Murder King|THS 1 Ugin's Insight|BFZ -1 Ulamog, the Infinite Gyre|MM2 +1 Ulamog, the Infinite Gyre|UMA 1 Ultimate Price|DTK 1 Underground Sea|VMA 1 Unexpectedly Absent|EMA 1 Unstable Obelisk 1 Untaidake, the Cloud Keeper|CHK 1 Urabrask the Hidden|IMA -1 Urban Evolution|MM3 +1 Urban Evolution|UMA 1 Urza's Rage|INV 1 Utter End|KTK 1 Uyo, Silent Prophet|CHK @@ -570,7 +570,7 @@ Name=Legendary Cube (598 cards) 1 Vorel of the Hull Clade|DGM 1 Vorinclex, Voice of Hunger|IMA 1 Warstorm Surge|M12 -1 Watery Grave|GTC +1 Watery Grave|GRN 1 Wayfarer's Bauble|MM2 1 Wear // Tear|DGM 1 Whispers of the Muse|TPR @@ -578,7 +578,7 @@ Name=Legendary Cube (598 cards) 1 Windswept Heath|KTK 1 Wooded Bastion|SHM 1 Wooded Foothills|KTK -1 Woodland Cemetery|ISD +1 Woodland Cemetery|DOM 1 Word of Seizing|TSP 1 Worldly Tutor|6ED 1 Worn Powerstone|EMA diff --git a/forge-gui/res/cube/Legendary Cube April 2016 (566 cards).dck b/forge-gui/res/cube/Legendary Cube April 2016 (566 cards).dck index a3cb6f63d33..ed8b6b0c7ad 100644 --- a/forge-gui/res/cube/Legendary Cube April 2016 (566 cards).dck +++ b/forge-gui/res/cube/Legendary Cube April 2016 (566 cards).dck @@ -76,7 +76,7 @@ Name=Legendary Cube April 2016 (566 cards) 1 Charmbreaker Devils|IMA 1 Cho-Manno, Revolutionary 1 Citadel Siege|FRF -1 Clifftop Retreat|ISD +1 Clifftop Retreat|DOM 1 Coldsteel Heart|CSP 1 Commune with the Gods|EMA 1 Compulsive Research|MM3 @@ -102,7 +102,7 @@ Name=Legendary Cube April 2016 (566 cards) 1 Darksteel Myr|SOM 1 Daxos the Returned 1 Day of Destiny|BOK -1 Death Denied|MM2 +1 Death Denied|UMA 1 Deathbringer Regent|DTK 1 Deep Analysis|EMA 1 Devour in Shadow @@ -126,7 +126,7 @@ Name=Legendary Cube April 2016 (566 cards) 1 Dromoka, the Eternal|FRF 1 Drowned Catacomb|XLN 1 Druidic Satchel|M12 -1 Duress|IMA +1 Duress|M19 1 Dwynen, Gilt-Leaf Daen|ORI 1 Edric, Spymaster of Trest|VMA 1 Eidolon of Blossoms|JOU @@ -137,11 +137,11 @@ Name=Legendary Cube April 2016 (566 cards) 1 Elsewhere Flask|SHM 1 Elvish Harbinger|LRW 1 Empty the Catacombs|RAV -1 Emrakul, the Aeons Torn|MM2 +1 Emrakul, the Aeons Torn|UMA 1 Enchantress's Presence|ONS 1 Endrek Sahr, Master Breeder|MM2 1 Enduring Ideal|SOK -1 Engineered Explosives|MMA +1 Engineered Explosives|UMA 1 Epic Proportions|LRW 1 Eternal Dragon|VMA 1 Everflowing Chalice|MM2 @@ -157,8 +157,8 @@ Name=Legendary Cube April 2016 (566 cards) 1 Fable of Wolf and Owl|EVE 1 Fact or Fiction|EMA 1 Faerie Mechanist|MM2 -1 Faith's Fetters|EMA -1 Faithless Looting|EMA +1 Faith's Fetters|UMA +1 Faithless Looting|UMA 1 Farhaven Elf|SHM 1 Fated Retribution|BNG 1 Fellwar Stone|9ED @@ -167,7 +167,7 @@ Name=Legendary Cube April 2016 (566 cards) 1 Fiery Fall|MM2 1 Fire Diamond|7ED 1 Flamekin Village -1 Forbidden Alchemy|MM3 +1 Forbidden Alchemy|UMA 1 Forced March|MMQ 1 Forgotten Cave|VMA 1 Foul Renewal|DTK @@ -181,13 +181,13 @@ Name=Legendary Cube April 2016 (566 cards) 1 Ghoulcaller Gisa 1 Ghoultree|DKA 1 Gild|BNG -1 Gilded Lotus|M13 +1 Gilded Lotus|DOM 1 Glacial Fortress|XLN 1 Glimmerpoint Stag|EMA 1 Glissa Sunseeker|MRD 1 Godless Shrine|GTC 1 Godo, Bandit Warlord|CHK -1 Golgari Grave-Troll|RAV +1 Golgari Grave-Troll|UMA 1 Golgari Rot Farm|IMA 1 Graveblade Marauder|ORI 1 Grenzo, Dungeon Warden|VMA @@ -208,7 +208,7 @@ Name=Legendary Cube April 2016 (566 cards) 1 Hero's Blade|FRF 1 Heroes' Podium|BNG 1 Hide // Seek|DIS -1 Hinterland Harbor|ISD +1 Hinterland Harbor|DOM 1 Hoarding Dragon|IMA 1 Honden of Cleansing Fire|EMA 1 Honden of Infinite Rage|EMA @@ -228,7 +228,7 @@ Name=Legendary Cube April 2016 (566 cards) 1 Interpret the Signs|JOU 1 Into the Roil|ZEN 1 Isamaru, Hound of Konda|CHK -1 Isolated Chapel|ISD +1 Isolated Chapel|DOM 1 Izzet Boilerworks|IMA 1 Jace's Sanctum|ORI 1 Jace, Vryn's Prodigy|ORI @@ -271,13 +271,13 @@ Name=Legendary Cube April 2016 (566 cards) 1 Kytheon, Hero of Akros|ORI 1 Lavalanche|ARB 1 Lavinia of the Tenth|DGM -1 Life from the Loam|MMA +1 Life from the Loam|UMA 1 Lightning Greaves|MRD 1 Lightning Surge|JUD 1 Linvala, Keeper of Silence|MM3 1 Linvala, the Preserver|OGW 1 Lonely Sandbar|VMA -1 Lord of Extinction|ARB +1 Lord of Extinction|UMA 1 Lotus Vale|WTH 1 Lu Xun, Scholar General|PTK 1 Lyzolda, the Blood Witch|DIS @@ -296,7 +296,7 @@ Name=Legendary Cube April 2016 (566 cards) 1 Meren of Clan Nel Toth 1 Mesa Enchantress|EMA 1 Mikaeus, the Lunarch|ISD -1 Mikaeus, the Unhallowed|DKA +1 Mikaeus, the Unhallowed|UMA 1 Mikokoro, Center of the Sea|A25 1 Millikin|EMA 1 Mimic Vat|SOM @@ -349,7 +349,7 @@ Name=Legendary Cube April 2016 (566 cards) 1 Orim, Samite Healer|TPR 1 Orzhov Basilica|IMA 1 Outpost Siege|FRF -1 Overgrown Tomb|RTR +1 Overgrown Tomb|GRN 1 Pacifism|A25 1 Pariah|10E 1 Perilous Vault|M15 @@ -370,7 +370,7 @@ Name=Legendary Cube April 2016 (566 cards) 1 Priest of Titania|USG 1 Prime Speaker Zegana|GTC 1 Primeval Bounty|M14 -1 Prismatic Lens|EMA +1 Prismatic Lens|UMA 1 Pristine Talisman|IMA 1 Prohibit|INV 1 Prophetic Bolt|VMA @@ -382,7 +382,7 @@ Name=Legendary Cube April 2016 (566 cards) 1 Rakdos Carnarium|IMA 1 Rakka Mar|CFX 1 Read the Bones|ORI -1 Reclamation Sage|M15 +1 Reclamation Sage|M19 1 Recumbent Bliss|EVE 1 Reflecting Pool|CNS 1 Regrowth|A25 @@ -390,7 +390,7 @@ Name=Legendary Cube April 2016 (566 cards) 1 Reki, the History of Kamigawa|SOK 1 Repeal|IMA 1 Resounding Thunder|ALA -1 Reya Dawnbringer|CNS +1 Reya Dawnbringer|UMA 1 Rhys the Redeemed|SHM 1 Rhys the Exiled|MOR 1 Rings of Brighthearth|LRW @@ -400,10 +400,10 @@ Name=Legendary Cube April 2016 (566 cards) 1 Rootbound Crag|XLN 1 Ruinous Path|BFZ 1 Runechanter's Pike|ISD -1 Rupture Spire|CFX +1 Rupture Spire|M19 1 Rush of Knowledge|SCG 1 Ryusei, the Falling Star|MMA -1 Sacred Foundry|GTC +1 Sacred Foundry|GRN 1 Sakashima the Impostor|SOK 1 Sandsteppe Citadel|KTK 1 Sarkhan's Triumph|DTK @@ -447,7 +447,7 @@ Name=Legendary Cube April 2016 (566 cards) 1 Song of the Dryads 1 Sphinx-Bone Wand|ROE 1 Sphinx of Uthuun|IMA -1 Spider Spawning|ISD +1 Spider Spawning|UMA 1 Spine of Ish Sah|MBS 1 Spite // Malice|INV 1 Splinterfright|ISD @@ -455,13 +455,13 @@ Name=Legendary Cube April 2016 (566 cards) 1 Squee, Goblin Nabob|MMA 1 Staff of Nin|M13 1 Starfield of Nyx|ORI -1 Steam Vents|RTR +1 Steam Vents|GRN 1 Stitcher Geralf 1 Stomping Ground|GTC 1 Strategic Planning|HOU 1 Stubborn Denial|KTK 1 Sudden Reclamation|FRF -1 Sulfur Falls|ISD +1 Sulfur Falls|DOM 1 Sultai Charm|KTK 1 Sun Ce, Young Conquerer 1 Sun Quan, Lord of Wu|PTK @@ -479,7 +479,7 @@ Name=Legendary Cube April 2016 (566 cards) 1 Tasigur, the Golden Fang|FRF 1 Tatsumasa, the Dragon's Fang|CHK 1 Teferi, Mage of Zhalfir|IMA -1 Temple Garden|RTR +1 Temple Garden|GRN 1 Temple of Abandon|THS 1 Temple of Deceit|THS 1 Temple of Enlightenment|BNG @@ -494,7 +494,7 @@ Name=Legendary Cube April 2016 (566 cards) 1 Temur Ascendancy|KTK 1 Tenza, Godo's Maul|CHK 1 Terashi's Grasp|MM2 -1 Terramorphic Expanse|MMA +1 Terramorphic Expanse|UMA 1 Tezzeret the Seeker|MM2 1 Thada Adel, Acquisitor|WWK 1 Thirst for Knowledge|MMA @@ -507,7 +507,7 @@ Name=Legendary Cube April 2016 (566 cards) 1 Titania, Protector of Argoth 1 Tithe|VIS 1 Tombstone Stairwell|MIR -1 Tormenting Voice|IMA +1 Tormenting Voice|M19 1 Toshiro Umezawa|BOK 1 Toxic Deluge|EMA 1 Tracker's Instincts|DKA @@ -526,7 +526,7 @@ Name=Legendary Cube April 2016 (566 cards) 1 Underground Sea|VMA 1 Unstable Obelisk 1 Urabrask the Hidden|IMA -1 Urban Evolution|MM3 +1 Urban Evolution|UMA 1 Urza's Rage|INV 1 Utter End|KTK 1 Utvara Hellkite|RTR @@ -545,15 +545,15 @@ Name=Legendary Cube April 2016 (566 cards) 1 Volley of Boulders|ODY 1 Vorinclex, Voice of Hunger|IMA 1 Wall of Omens|EMA -1 Warleader's Helix|DGM +1 Warleader's Helix|UMA 1 Warstorm Surge|M12 -1 Watery Grave|GTC +1 Watery Grave|GRN 1 Wayfarer's Bauble|MM2 1 Wear // Tear|DGM 1 Where Ancients Tread|ALA 1 Wild Ricochet|M14 1 Wood Elves|9ED -1 Woodland Cemetery|ISD +1 Woodland Cemetery|DOM 1 Word of Seizing|TSP 1 Wort, the Raidmother|MM3 1 Wrexial, the Risen Deep|WWK diff --git a/forge-gui/res/cube/MTGO Cube March 2014.dck b/forge-gui/res/cube/MTGO Cube March 2014.dck index d0ca3d800b9..7e658ee2b5d 100644 --- a/forge-gui/res/cube/MTGO Cube March 2014.dck +++ b/forge-gui/res/cube/MTGO Cube March 2014.dck @@ -12,10 +12,10 @@ Name=MTGO Cube March 2014 1 Ajani, Caller of the Pride|M14 1 Akroma, Angel of Wrath|TSB 1 Akroma's Vengeance|A25 -1 All Is Dust|MM2 +1 All Is Dust|UMA 1 Ancestral Vision|IMA 1 Ancient Grudge|MM3 -1 Ancient Tomb|VMA +1 Ancient Tomb|UMA 1 Angel of Serenity|RTR 1 Animate Dead|EMA 1 Arbor Elf|A25 @@ -51,7 +51,7 @@ Name=MTGO Cube March 2014 1 Beast Within|NPH 1 Birds of Paradise|M12 1 Birthing Pod|NPH -1 Bitterblossom|MM2 +1 Bitterblossom|UMA 1 Black Sun's Zenith|MBS 1 Blade Splicer|MM3 1 Blastoderm|VMA @@ -82,7 +82,7 @@ Name=MTGO Cube March 2014 1 Brooding Saurian|CSP 1 Broodmate Dragon|MM3 1 Brushland|10E -1 Buried Alive|ODY +1 Buried Alive|UMA 1 Burning of Xinye|VMA 1 Burst Lightning|MM2 1 Calciderm|EMA @@ -92,11 +92,11 @@ Name=MTGO Cube March 2014 1 Cascade Bluffs|A25 1 Catastrophe|USG 1 Caves of Koilos|ORI -1 Celestial Colonnade|WWK +1 Celestial Colonnade|UMA 1 Celestial Flare|ORI 1 Celestial Purge|MM2 1 Chain Lightning|EMA -1 Chainer's Edict|TOR +1 Chainer's Edict|UMA 1 Chandra, Pyromaster|M15 1 Chandra, the Firebrand|M13 1 Chandra's Phoenix|M14 @@ -106,7 +106,7 @@ Name=MTGO Cube March 2014 1 Chord of Calling|M15 1 Chrome Mox|EMA 1 City of Brass|MMA -1 Clifftop Retreat|ISD +1 Clifftop Retreat|DOM 1 Cloudgoat Ranger|MMA 1 Coalition Relic|A25 1 Compulsive Research|MM3 @@ -120,8 +120,8 @@ Name=MTGO Cube March 2014 1 Countryside Crusher|MMA 1 Courser of Kruphix|A25 1 Court Hussar|A25 -1 Creeping Tar Pit|WWK -1 Crucible of Worlds|10E +1 Creeping Tar Pit|UMA +1 Crucible of Worlds|M19 1 Crumbling Necropolis|MM3 1 Cryptic Command|IMA 1 Cultivate|A25 @@ -139,7 +139,7 @@ Name=MTGO Cube March 2014 1 Decree of Justice|A25 1 Deep Analysis|EMA 1 Delver of Secrets|ISD -1 Demonic Tutor|VMA +1 Demonic Tutor|UMA 1 Deranged Hermit|VMA 1 Descendant of Kiyomaro|SOK 1 Desperate Ravings|EMA @@ -148,7 +148,7 @@ Name=MTGO Cube March 2014 1 Diabolic Servitude|USG 1 Dimir Aqueduct|IMA 1 Dimir Charm|GTC -1 Diregraf Ghoul|ISD +1 Diregraf Ghoul|M19 1 Disenchant|A25 1 Disfigure|A25 1 Dismantling Blow|INV @@ -162,7 +162,7 @@ Name=MTGO Cube March 2014 1 Drowned Catacomb|XLN 1 Dryad Sophisticate|GPT 1 Dungeon Geists|DKA -1 Duress|IMA +1 Duress|M19 1 Earthquake|M10 1 Edric, Spymaster of Trest|VMA 1 Eight-and-a-Half-Tails|EMA @@ -178,18 +178,18 @@ Name=MTGO Cube March 2014 1 Ember Hauler|M11 1 Emeria Angel|IMA 1 Empty the Warrens|MMA -1 Emrakul, the Aeons Torn|MM2 +1 Emrakul, the Aeons Torn|UMA 1 Enclave Cryptologist|ROE -1 Engineered Explosives|MMA +1 Engineered Explosives|UMA 1 Enlightened Tutor|EMA -1 Entomb|EMA +1 Entomb|UMA 1 Entreat the Angels|MM3 1 Epochrasite|MMA 1 Erebos, God of the Dead|THS 1 Esper Charm|ALA -1 Essence Scatter|AKH +1 Essence Scatter|M19 1 Etched Oracle|MM2 -1 Eternal Witness|MMA +1 Eternal Witness|UMA 1 Eureka|VMA 1 Everflowing Chalice|MM2 1 Exalted Angel|ONS @@ -199,12 +199,12 @@ Name=MTGO Cube March 2014 1 Explore|MM3 1 Fact or Fiction|EMA 1 Faerie Conclave|10E -1 Faithless Looting|EMA -1 Faith's Fetters|EMA +1 Faithless Looting|UMA +1 Faith's Fetters|UMA 1 Falkenrath Aristocrat|MM3 1 Farseek|M13 1 Fathom Seer|A25 -1 Fauna Shaman|M11 +1 Fauna Shaman|UMA 1 Fertile Ground|LRW 1 Fetid Heath|A25 1 Figure of Destiny|MMA @@ -214,7 +214,7 @@ Name=MTGO Cube March 2014 1 Fire-Lit Thicket|SHM 1 Firespout|SHM 1 Firestorm|WTH -1 Flagstones of Trokair|TSP +1 Flagstones of Trokair|UMA 1 Flame Javelin|SHM 1 Flametongue Kavu|VMA 1 Flashfreeze|MM2 @@ -228,13 +228,13 @@ Name=MTGO Cube March 2014 1 Force of Will|EMA 1 Force Spike|7ED 1 Forked Bolt|ROE -1 Frantic Search|VMA +1 Frantic Search|UMA 1 Frenzied Goblin|A25 1 Frost Titan|M12 1 Future Sight|EMA 1 Fyndhorn Elves|VMA 1 Gaea's Cradle|USG -1 Gamble|EMA +1 Gamble|UMA 1 Garruk Relentless|ISD 1 Garruk Wildspeaker|M11 1 Garruk, Primal Hunter|M13 @@ -249,9 +249,9 @@ Name=MTGO Cube March 2014 1 Gideon Jura|M12 1 Gideon, Champion of Justice|GTC 1 Gifts Ungiven|MM3 -1 Gilded Lotus|M13 +1 Gilded Lotus|DOM 1 Glacial Fortress|XLN -1 Glen Elendra Archmage|MMA +1 Glen Elendra Archmage|UMA 1 Go for the Throat|MBS 1 Goblin Cadets|USG 1 Goblin Guide|MM3 @@ -290,7 +290,7 @@ Name=MTGO Cube March 2014 1 Hero of Oxid Ridge|MBS 1 Hero's Downfall|THS 1 Hinder|CHK -1 Hinterland Harbor|ISD +1 Hinterland Harbor|DOM 1 Hokori, Dust Drinker|BOK 1 Honor of the Pure|M12 1 Huntmaster of the Fells|DKA @@ -306,7 +306,7 @@ Name=MTGO Cube March 2014 1 Into the Roil|ZEN 1 Iona, Shield of Emeria|MM2 1 Isamaru, Hound of Konda|CHK -1 Isolated Chapel|ISD +1 Isolated Chapel|DOM 1 Izzet Boilerworks|IMA 1 Izzet Charm|MM3 1 Jace Beleren|M11 @@ -319,9 +319,9 @@ Name=MTGO Cube March 2014 1 Jungle Shrine|MM3 1 Jushi Apprentice|CHK 1 Kami of Ancient Law|MM2 -1 Karakas|EMA +1 Karakas|UMA 1 Kargan Dragonlord|ROE -1 Karn Liberated|MM2 +1 Karn Liberated|UMA 1 Karplusan Forest|10E 1 Keiga, the Tide Star|MMA 1 Keldon Champion|EMA @@ -329,38 +329,38 @@ Name=MTGO Cube March 2014 1 Kiora, the Crashing Wave|BNG 1 Kira, Great Glass-Spinner|MMA 1 Kird Ape|EMA -1 Kitchen Finks|MMA +1 Kitchen Finks|UMA 1 Knight of Glory|M13 1 Knight of Infamy|M13 1 Kokusho, the Evening Star|MMA 1 Koth of the Hammer|SOM -1 Kozilek, Butcher of Truth|MM2 +1 Kozilek, Butcher of Truth|UMA 1 Krosan Grip|MMA 1 Lake of the Dead|VMA 1 Land Tax|4ED -1 Lavaclaw Reaches|WWK +1 Lavaclaw Reaches|UMA 1 Legacy's Allure|TMP 1 Leonin Relic-Warder|MBS -1 Life from the Loam|MMA +1 Life from the Loam|UMA 1 Lifebane Zombie|M14 1 Lightning Bolt|A25 1 Lightning Helix|IMA 1 Lightning Mauler|AVR -1 Liliana of the Veil|MM3 +1 Liliana of the Veil|UMA 1 Liliana Vess|M15 1 Liliana's Reaver|M14 1 Lingering Souls|MM3 1 Linvala, Keeper of Silence|MM3 1 Lion's Eye Diamond|MIR 1 Living Death|A25 -1 Llanowar Elves|EMA +1 Llanowar Elves|DOM 1 Llanowar Wastes|ORI 1 Loam Lion|WWK 1 Lodestone Golem|MM2 1 Looter il-Kor|TSP 1 Lotus Bloom|MMA 1 Lotus Cobra|IMA -1 Maelstrom Pulse|MMA +1 Maelstrom Pulse|UMA 1 Magma Jet|MM3 1 Magus of the Moon|IMA 1 Makeshift Mannequin|LRW @@ -376,7 +376,7 @@ Name=MTGO Cube March 2014 1 Maze of Ith|EMA 1 Meloku the Clouded Mirror|MMA 1 Memory Jar|VMA -1 Mentor of the Meek|ISD +1 Mentor of the Meek|M19 1 Merciless Eviction|GTC 1 Mesmeric Fiend|A25 1 Mind Stone|IMA @@ -409,7 +409,7 @@ Name=MTGO Cube March 2014 1 Nantuko Vigilante|LGN 1 Narcolepsy|MM2 1 Natural Order|EMA -1 Naturalize|RIX +1 Naturalize|M19 1 Nature's Claim|IMA 1 Nature's Lore|5ED 1 Nearheath Pilgrim|AVR @@ -424,7 +424,7 @@ Name=MTGO Cube March 2014 1 Night's Whisper|EMA 1 Nightscape Familiar|VMA 1 Nightveil Specter|GTC -1 Noble Hierarch|MM2 +1 Noble Hierarch|UMA 1 Nostalgic Dreams|VMA 1 Oblivion Ring|MM2 1 Oblivion Stone|IMA @@ -439,14 +439,14 @@ Name=MTGO Cube March 2014 1 Orcish Lumberjack|VMA 1 Orzhov Basilica|IMA 1 Oust|ROE -1 Overgrown Tomb|RTR +1 Overgrown Tomb|GRN 1 Pact of Negation|A25 1 Pain Seer|BNG 1 Palinchron|VMA 1 Palladium Myr|IMA 1 Parallax Wave|VMA 1 Path to Exile|MM3 -1 Pattern of Rebirth|UDS +1 Pattern of Rebirth|UMA 1 Pentad Prism|5DN 1 Pernicious Deed|A25 1 Persecute|9ED @@ -483,7 +483,7 @@ Name=MTGO Cube March 2014 1 Putrid Leech|ARB 1 Pyroclasm|A25 1 Qasali Pridemage|ARB -1 Raging Ravine|WWK +1 Raging Ravine|UMA 1 Rakdos Cackler|RTR 1 Rakdos Carnarium|IMA 1 Ral Zarek|DGM @@ -493,8 +493,8 @@ Name=MTGO Cube March 2014 1 Ratchet Bomb|M14 1 Ravages of War|PTK 1 Ravenous Baboons|EXO -1 Reanimate|TPR -1 Reckless Charge|EMA +1 Reanimate|UMA +1 Reckless Charge|UMA 1 Recurring Nightmare|TPR 1 Red Elemental Blast|A25 1 Reflecting Pool|CNS @@ -504,7 +504,7 @@ Name=MTGO Cube March 2014 1 Repeal|IMA 1 Restock|M15 1 Restoration Angel|IMA -1 Reveillark|MMA +1 Reveillark|UMA 1 Rift Bolt|IMA 1 Riftwing Cloudskate|MMA 1 Rishadan Port|A25 @@ -515,7 +515,7 @@ Name=MTGO Cube March 2014 1 Rout|CNS 1 Rude Awakening|MMA 1 Rugged Prairie|A25 -1 Sacred Foundry|GTC +1 Sacred Foundry|GRN 1 Sakashima's Student 1 Sakura-Tribe Elder|CNS 1 Sarcomancy|TPR @@ -542,9 +542,9 @@ Name=MTGO Cube March 2014 1 Shivan Reef|ORI 1 Show and Tell|USG 1 Shrieking Grotesque|GPT -1 Shriekmaw|LRW +1 Shriekmaw|UMA 1 Shrine of Burning Rage|NPH -1 Siege-Gang Commander|EMA +1 Siege-Gang Commander|DOM 1 Sign in Blood|MM2 1 Silent Specter|ONS 1 Silver Knight|SCG @@ -561,7 +561,7 @@ Name=MTGO Cube March 2014 1 Smash to Smithereens|ORI 1 Smokestack|VMA 1 Smother|WWK -1 Snapcaster Mage|MM3 +1 Snapcaster Mage|UMA 1 Sneak Attack|EMA 1 Snuff Out|MMQ 1 Soldier of the Pantheon|THS @@ -579,9 +579,9 @@ Name=MTGO Cube March 2014 1 Spinning Darkness|WTH 1 Spreading Seas|ZEN 1 Steam Augury|THS -1 Steam Vents|RTR +1 Steam Vents|GRN 1 Steppe Lynx|ZEN -1 Stirring Wildwood|WWK +1 Stirring Wildwood|UMA 1 Stomping Ground|GTC 1 Stonecloaker|PLC 1 Stoneforge Mystic|WWK @@ -592,8 +592,8 @@ Name=MTGO Cube March 2014 1 Student of Warfare|ROE 1 Stunted Growth|ICE 1 Stupor|TSB -1 Sublime Archangel|M13 -1 Sulfur Falls|ISD +1 Sublime Archangel|UMA +1 Sulfur Falls|DOM 1 Sulfuric Vortex|EMA 1 Sulfurous Springs|10E 1 Sun Titan|M12 @@ -613,12 +613,12 @@ Name=MTGO Cube March 2014 1 Talrand, Sky Summoner|M13 1 Tamiyo, the Moon Sage|AVR 1 Tangle Wire|NMS -1 Tarmogoyf|MM3 +1 Tarmogoyf|UMA 1 Taurean Mauler|MOR 1 Tectonic Edge|WWK 1 Teetering Peaks|ZEN 1 Teferi, Mage of Zhalfir|IMA -1 Temple Garden|RTR +1 Temple Garden|GRN 1 Tendrils of Agony|VMA 1 Tendrils of Corruption|M10 1 Terastodon|CNS @@ -656,11 +656,11 @@ Name=MTGO Cube March 2014 1 Tundra|VMA 1 Turnabout|VMA 1 Twilight Mire|A25 -1 Ulamog, the Infinite Gyre|MM2 +1 Ulamog, the Infinite Gyre|UMA 1 Ultimate Price|DTK 1 Ulvenwald Tracker|MM3 1 Umezawa's Jitte|BOK -1 Unburial Rites|MM3 +1 Unburial Rites|UMA 1 Underground River|10E 1 Underground Sea|VMA 1 Undermine|INV @@ -673,7 +673,7 @@ Name=MTGO Cube March 2014 1 Vampiric Tutor|EMA 1 Vedalken Shackles|MMA 1 Vendilion Clique|A25 -1 Vengevine|ROE +1 Vengevine|UMA 1 Venser, Shaper Savant|MM3 1 Verdant Catacombs|MM3 1 Vesuvan Shapeshifter|A25 @@ -688,15 +688,15 @@ Name=MTGO Cube March 2014 1 Wake Thrasher|EVE 1 Wall of Blossoms|TPR 1 Wall of Omens|EMA -1 Wall of Reverence|CFX +1 Wall of Reverence|UMA 1 Wall of Roots|IMA 1 Wasteland|EMA -1 Watery Grave|GTC +1 Watery Grave|GRN 1 Wear // Tear|DGM 1 Weathered Wayfarer|9ED 1 Wheel of Fortune|VMA 1 Whipcorder|ONS -1 Wickerbough Elder|EVE +1 Wickerbough Elder|UMA 1 Wild Nacatl|ALA 1 Wildfire|MM2 1 Willbender|A25 @@ -707,8 +707,8 @@ Name=MTGO Cube March 2014 1 Wood Elves|9ED 1 Wooded Bastion|SHM 1 Wooded Foothills|KTK -1 Woodfall Primus|MMA -1 Woodland Cemetery|ISD +1 Woodfall Primus|UMA +1 Woodland Cemetery|DOM 1 Woolly Thoctar|MM3 1 Worn Powerstone|EMA 1 Wrath of God|EMA diff --git a/forge-gui/res/cube/MTGO Legacy Cube (600 cards).dck b/forge-gui/res/cube/MTGO Legacy Cube (600 cards).dck index ac967560820..d49f8869906 100644 --- a/forge-gui/res/cube/MTGO Legacy Cube (600 cards).dck +++ b/forge-gui/res/cube/MTGO Legacy Cube (600 cards).dck @@ -14,7 +14,7 @@ Name=MTGO Legacy Cube (600 cards) 1 Ajani, Mentor of Heroes|JOU 1 Ancestral Vision|IMA 1 Ancient Grudge|MM3 -1 Ancient Tomb|VMA +1 Ancient Tomb|UMA 1 Angel of Serenity|RTR 1 Angelic Destiny|M12 1 Anger of the Gods|IMA @@ -47,7 +47,7 @@ Name=MTGO Legacy Cube (600 cards) 1 Bident of Thassa|A25 1 Birds of Paradise|M12 1 Birthing Pod|NPH -1 Bitterblossom|MM2 +1 Bitterblossom|UMA 1 Black Sun's Zenith|MBS 1 Blade Splicer|MM3 1 Blood Crypt|RTR @@ -77,7 +77,7 @@ Name=MTGO Legacy Cube (600 cards) 1 Carnophage|TPR 1 Caves of Koilos|ORI 1 Chain Lightning|EMA -1 Chainer's Edict|TOR +1 Chainer's Edict|UMA 1 Chameleon Colossus|MOR 1 Champion of the Parish|ISD 1 Chandra, Pyromaster|M15 @@ -87,7 +87,7 @@ Name=MTGO Legacy Cube (600 cards) 1 Chord of Calling|M15 1 Chrome Mox|EMA 1 City of Brass|MMA -1 Clifftop Retreat|ISD +1 Clifftop Retreat|DOM 1 Cloudfin Raptor|GTC 1 Cloudgoat Ranger|MMA 1 Coalition Relic|A25 @@ -127,8 +127,8 @@ Name=MTGO Legacy Cube (600 cards) 1 Devil's Play|ISD 1 Diabolic Servitude|USG 1 Dictate of Heliod|JOU -1 Dig Through Time|KTK -1 Diregraf Ghoul|ISD +1 Dig Through Time|UMA +1 Diregraf Ghoul|M19 1 Disciple of Bolas|M13 1 Disenchant|A25 1 Disfigure|A25 @@ -146,7 +146,7 @@ Name=MTGO Legacy Cube (600 cards) 1 Dualcaster Mage|EMA 1 Dungeon Geists|DKA 1 Duplicant|EMA -1 Duress|IMA +1 Duress|M19 1 Edric, Spymaster of Trest|VMA 1 Eight-and-a-Half-Tails|EMA 1 Electrolyze|IMA @@ -158,25 +158,25 @@ Name=MTGO Legacy Cube (600 cards) 1 Elves of Deep Shadow|RAV 1 Elvish Mystic|M15 1 Emeria Angel|IMA -1 Emrakul, the Aeons Torn|MM2 -1 Entomb|EMA +1 Emrakul, the Aeons Torn|UMA +1 Entomb|UMA 1 Entreat the Angels|MM3 -1 Essence Scatter|AKH +1 Essence Scatter|M19 1 Eternal Dragon|VMA -1 Eternal Witness|MMA +1 Eternal Witness|UMA 1 Eureka|VMA 1 Everflowing Chalice|MM2 1 Exalted Angel|ONS 1 Exhume|USG 1 Explore|MM3 1 Fact or Fiction|EMA -1 Faith's Fetters|EMA +1 Faith's Fetters|UMA 1 Falkenrath Aristocrat|MM3 1 Far // Away|DGM 1 Farseek|M13 -1 Fauna Shaman|M11 +1 Fauna Shaman|UMA 1 Figure of Destiny|MMA -1 Fire // Ice|APC +1 Fire // Ice|UMA 1 Fireblast|VMA 1 Firebolt|EMA 1 Firedrinker Satyr|THS @@ -187,7 +187,7 @@ Name=MTGO Legacy Cube (600 cards) 1 Flickerwisp|MM3 1 Flooded Strand|KTK 1 Forbid|TPR -1 Forbidden Alchemy|MM3 +1 Forbidden Alchemy|UMA 1 Force of Will|EMA 1 Force Spike|7ED 1 Frenzied Goblin|A25 @@ -211,15 +211,15 @@ Name=MTGO Legacy Cube (600 cards) 1 Ghor-Clan Rampager|MM3 1 Gideon Jura|M12 1 Gifts Ungiven|MM3 -1 Gilded Lotus|M13 +1 Gilded Lotus|DOM 1 Glacial Fortress|XLN -1 Glen Elendra Archmage|MMA +1 Glen Elendra Archmage|UMA 1 Glorious Anthem|10E 1 Gnarled Scarhide|JOU 1 Go for the Throat|MBS 1 Goblin Bombardment|TPR 1 Goblin Bushwhacker|ZEN -1 Goblin Electromancer|MM3 +1 Goblin Electromancer|GRN 1 Goblin Guide|MM3 1 Goblin Rabblemaster|M15 1 Goblin Wardriver|MBS @@ -236,7 +236,7 @@ Name=MTGO Legacy Cube (600 cards) 1 Grim Monolith|ULG 1 Griselbrand|MM3 1 Grisly Salvage|RTR -1 Guttersnipe|IMA +1 Guttersnipe|M19 1 Hall of Triumph|JOU 1 Hallowed Fountain|RTR 1 Hallowed Spiritkeeper @@ -247,7 +247,7 @@ Name=MTGO Legacy Cube (600 cards) 1 Hero of Bladehold|MBS 1 Hero of Oxid Ridge|MBS 1 Hero's Downfall|THS -1 Hinterland Harbor|ISD +1 Hinterland Harbor|DOM 1 Honor of the Pure|M12 1 Hordeling Outburst|A25 1 Hornet Queen|M15 @@ -265,7 +265,7 @@ Name=MTGO Legacy Cube (600 cards) 1 Intuition|TPR 1 Isamaru, Hound of Konda|CHK 1 Isochron Scepter|EMA -1 Isolated Chapel|ISD +1 Isolated Chapel|DOM 1 Jace Beleren|M11 1 Jace, Architect of Thought|RTR 1 Jace, the Mind Sculptor|VMA @@ -274,7 +274,7 @@ Name=MTGO Legacy Cube (600 cards) 1 Journey to Nowhere|ZEN 1 Kami of Ancient Law|MM2 1 Karmic Guide|EMA -1 Karn Liberated|MM2 +1 Karn Liberated|UMA 1 Karplusan Forest|10E 1 Keiga, the Tide Star|MMA 1 Keranos, God of Storms|JOU @@ -282,13 +282,13 @@ Name=MTGO Legacy Cube (600 cards) 1 Kiln Fiend|IMA 1 Kiora, the Crashing Wave|BNG 1 Kira, Great Glass-Spinner|MMA -1 Kitchen Finks|MMA +1 Kitchen Finks|UMA 1 Knight of Infamy|M13 -1 Kodama's Reach|MMA +1 Kodama's Reach|UMA 1 Kokusho, the Evening Star|MMA 1 Kor Skyfisher|MM3 1 Koth of the Hammer|SOM -1 Kozilek, Butcher of Truth|MM2 +1 Kozilek, Butcher of Truth|UMA 1 Krenko's Command|M13 1 Krosan Grip|MMA 1 Land Tax|4ED @@ -298,20 +298,20 @@ Name=MTGO Legacy Cube (600 cards) 1 Lightning Greaves|MRD 1 Lightning Helix|IMA 1 Lightning Mauler|AVR -1 Lightning Strike|XLN -1 Liliana of the Veil|MM3 +1 Lightning Strike|M19 +1 Liliana of the Veil|UMA 1 Liliana Vess|M15 1 Lingering Souls|MM3 1 Linvala, Keeper of Silence|MM3 1 Living Death|A25 -1 Llanowar Elves|EMA +1 Llanowar Elves|DOM 1 Llanowar Wastes|ORI 1 Looter il-Kor|TSP 1 Lotleth Troll|RTR 1 Lotus Cobra|IMA 1 Loxodon Warhammer|10E 1 Madcap Skills|MM3 -1 Maelstrom Pulse|MMA +1 Maelstrom Pulse|UMA 1 Magma Jet|MM3 1 Man-o'-War|A25 1 Mana Confluence|JOU @@ -324,7 +324,7 @@ Name=MTGO Legacy Cube (600 cards) 1 Master of the Wild Hunt|A25 1 Master of Waves|THS 1 Meloku the Clouded Mirror|MMA -1 Mentor of the Meek|ISD +1 Mentor of the Meek|M19 1 Merfolk Looter|A25 1 Mesmeric Fiend|A25 1 Mind Stone|IMA @@ -344,7 +344,7 @@ Name=MTGO Legacy Cube (600 cards) 1 Mulch|TPR 1 Mulldrifter|MM2 1 Murderous Cut|KTK -1 Murderous Redcap|MMA +1 Murderous Redcap|UMA 1 Mutagenic Growth|MM2 1 Mutavault|M14 1 Myr Battlesphere|SOM @@ -352,7 +352,7 @@ Name=MTGO Legacy Cube (600 cards) 1 Mystical Teachings|MM3 1 Nantuko Shade|M11 1 Natural Order|EMA -1 Naturalize|RIX +1 Naturalize|M19 1 Negate|RIX 1 Nekrataal|EMA 1 Nicol Bolas, Planeswalker|M13 @@ -360,7 +360,7 @@ Name=MTGO Legacy Cube (600 cards) 1 Nighthowler|THS 1 Nightveil Specter|GTC 1 Nissa, Worldwaker|M15 -1 Noble Hierarch|MM2 +1 Noble Hierarch|UMA 1 Nykthos, Shrine to Nyx|THS 1 Oblivion Ring|MM2 1 Obstinate Baloth|IMA @@ -371,7 +371,7 @@ Name=MTGO Legacy Cube (600 cards) 1 Oracle of Mul Daya|ZEN 1 Oust|ROE 1 Overgrown Battlement|IMA -1 Overgrown Tomb|RTR +1 Overgrown Tomb|GRN 1 Pact of Negation|A25 1 Pain Seer|BNG 1 Parallax Wave|VMA @@ -410,8 +410,8 @@ Name=MTGO Legacy Cube (600 cards) 1 Rancor|A25 1 Ranger of Eos|MM3 1 Ravages of War|PTK -1 Reanimate|TPR -1 Reclamation Sage|M15 +1 Reanimate|UMA +1 Reclamation Sage|M19 1 Recurring Nightmare|TPR 1 Reflecting Pool|CNS 1 Regrowth|A25 @@ -419,19 +419,19 @@ Name=MTGO Legacy Cube (600 cards) 1 Remove Soul|10E 1 Repeal|IMA 1 Restoration Angel|IMA -1 Reveillark|MMA +1 Reveillark|UMA 1 Rift Bolt|IMA 1 Riftwing Cloudskate|MMA 1 Riptide Laboratory|ONS 1 Rishadan Port|A25 1 Rofellos, Llanowar Emissary|VMA 1 Rootbound Crag|XLN -1 Sacred Foundry|GTC +1 Sacred Foundry|GRN 1 Sakashima's Student 1 Sakura-Tribe Elder|CNS 1 Sarcomancy|TPR 1 Sarkhan, the Dragonspeaker|KTK -1 Satyr Wayfinder|M15 +1 Satyr Wayfinder|UMA 1 Savannah|VMA 1 Savannah Lions|A25 1 Scalding Tarn|MM3 @@ -455,9 +455,9 @@ Name=MTGO Legacy Cube (600 cards) 1 Sheoldred, Whispering One|IMA 1 Shivan Reef|ORI 1 Show and Tell|USG -1 Shriekmaw|LRW +1 Shriekmaw|UMA 1 Shrine of Burning Rage|NPH -1 Siege-Gang Commander|EMA +1 Siege-Gang Commander|DOM 1 Silverblade Paladin|AVR 1 Sin Collector|MM3 1 Sinkhole|EMA @@ -466,7 +466,7 @@ Name=MTGO Legacy Cube (600 cards) 1 Slagstorm|MBS 1 Slaughter Pact|MMA 1 Smash to Smithereens|ORI -1 Snapcaster Mage|MM3 +1 Snapcaster Mage|UMA 1 Sneak Attack|EMA 1 Soldier of the Pantheon|THS 1 Solemn Simulacrum|M12 @@ -485,7 +485,7 @@ Name=MTGO Legacy Cube (600 cards) 1 Spiteful Returned|BNG 1 Splinter Twin|MM2 1 Staggershock|IMA -1 Steam Vents|RTR +1 Steam Vents|GRN 1 Stinkweed Imp|MMA 1 Stoke the Flames|M15 1 Stomping Ground|GTC @@ -493,8 +493,8 @@ Name=MTGO Legacy Cube (600 cards) 1 Stroke of Genius|VMA 1 Stromkirk Noble|ISD 1 Student of Warfare|ROE -1 Sublime Archangel|M13 -1 Sulfur Falls|ISD +1 Sublime Archangel|UMA +1 Sulfur Falls|DOM 1 Sulfuric Vortex|EMA 1 Sulfurous Springs|10E 1 Summoning Trap|MM3 @@ -509,11 +509,11 @@ Name=MTGO Legacy Cube (600 cards) 1 Talrand, Sky Summoner|M13 1 Tamiyo, the Moon Sage|AVR 1 Tangle Wire|NMS -1 Tarmogoyf|MM3 +1 Tarmogoyf|UMA 1 Tectonic Edge|WWK 1 Teetering Peaks|ZEN 1 Teferi, Mage of Zhalfir|IMA -1 Temple Garden|RTR +1 Temple Garden|GRN 1 Temple of Abandon|THS 1 Temple of Deceit|THS 1 Temple of Enlightenment|BNG @@ -531,11 +531,11 @@ Name=MTGO Legacy Cube (600 cards) 1 Terminus|MM3 1 Thalia, Guardian of Thraben|A25 1 Thassa, God of the Sea|THS -1 Think Twice|ISD +1 Think Twice|UMA 1 Thoughtseize|IMA 1 Thragtusk|MM3 1 Thran Dynamo|IMA -1 Through the Breach|CHK +1 Through the Breach|UMA 1 Thrun, the Last Troll|MBS 1 Thundermaw Hellkite|IMA 1 Tidehollow Sculler|MMA @@ -549,10 +549,10 @@ Name=MTGO Legacy Cube (600 cards) 1 Tropical Island|VMA 1 Trygon Predator|EMA 1 Tundra|VMA -1 Ulamog, the Infinite Gyre|MM2 +1 Ulamog, the Infinite Gyre|UMA 1 Ultimate Price|DTK 1 Umezawa's Jitte|BOK -1 Unburial Rites|MM3 +1 Unburial Rites|UMA 1 Underground River|10E 1 Underground Sea|VMA 1 Underworld Connections|RTR @@ -563,7 +563,7 @@ Name=MTGO Legacy Cube (600 cards) 1 Vampire Nighthawk|MM3 1 Vedalken Shackles|MMA 1 Vendilion Clique|A25 -1 Vengevine|ROE +1 Vengevine|UMA 1 Venser, Shaper Savant|MM3 1 Venser, the Sojourner|SOM 1 Verdant Catacombs|MM3 @@ -577,20 +577,20 @@ Name=MTGO Legacy Cube (600 cards) 1 Wall of Blossoms|TPR 1 Wall of Omens|EMA 1 Wall of Roots|IMA -1 Warleader's Helix|DGM +1 Warleader's Helix|UMA 1 Wasteland|EMA 1 Waterfront Bouncer|VMA -1 Watery Grave|GTC +1 Watery Grave|GRN 1 Whip of Erebos|THS -1 Wild Mongrel|VMA +1 Wild Mongrel|UMA 1 Windbrisk Heights|LRW 1 Windswept Heath|KTK 1 Winter Orb|EMA 1 Wolfir Silverheart|AVR 1 Wood Elves|9ED 1 Wooded Foothills|KTK -1 Woodfall Primus|MMA -1 Woodland Cemetery|ISD +1 Woodfall Primus|UMA +1 Woodland Cemetery|DOM 1 Worn Powerstone|EMA 1 Wrath of God|EMA 1 Wurmcoil Engine|SOM @@ -599,5 +599,5 @@ Name=MTGO Legacy Cube (600 cards) 1 Yavimaya Coast|ORI 1 Yavimaya Elder|VMA 1 Yosei, the Morning Star|MMA -1 Young Pyromancer|EMA +1 Young Pyromancer|UMA 1 Zealous Conscripts|MM3 diff --git a/forge-gui/res/cube/MTGO Legacy Cube April 2017 (600 cards).dck b/forge-gui/res/cube/MTGO Legacy Cube April 2017 (600 cards).dck index 83a6209089f..eaea3a78be0 100644 --- a/forge-gui/res/cube/MTGO Legacy Cube April 2017 (600 cards).dck +++ b/forge-gui/res/cube/MTGO Legacy Cube April 2017 (600 cards).dck @@ -12,7 +12,7 @@ Name=MTGO Legacy Cube April 2017 (600 cards) 1 Ajani, Caller of the Pride|M14 1 Anafenza, Kin-Tree Spirit|DTK 1 Ancestral Vision|IMA -1 Ancient Tomb|VMA +1 Ancient Tomb|UMA 1 Angel of Invention|KLD 1 Angel of Serenity|RTR 1 Anger of the Gods|IMA @@ -31,7 +31,7 @@ Name=MTGO Legacy Cube April 2017 (600 cards) 1 Avenger of Zendikar|WWK 1 Badlands|VMA 1 Baleful Strix|EMA -1 Banefire|MM2 +1 Banefire|M19 1 Baneslayer Angel|M11 1 Banisher Priest|M14 1 Banishing Light|JOU @@ -43,7 +43,7 @@ Name=MTGO Legacy Cube April 2017 (600 cards) 1 Beetleback Chief|EMA 1 Birds of Paradise|M12 1 Birthing Pod|NPH -1 Bitterblossom|MM2 +1 Bitterblossom|UMA 1 Blackcleave Cliffs|SOM 1 Blade Splicer|MM3 1 Blood Artist|EMA @@ -65,14 +65,14 @@ Name=MTGO Legacy Cube April 2017 (600 cards) 1 Brimaz, King of Oreskos|BNG 1 Brimstone Volley|CNS 1 Bruna, the Fading Light|EMN -1 Buried Alive|ODY +1 Buried Alive|UMA 1 Burst Lightning|MM2 1 Careful Consideration|MMA 1 Careful Study|ODY 1 Cathartic Reunion|KLD -1 Celestial Colonnade|WWK +1 Celestial Colonnade|UMA 1 Chain Lightning|EMA -1 Chainer's Edict|TOR +1 Chainer's Edict|UMA 1 Champion of the Parish|ISD 1 Chandra's Phoenix|M14 1 Chandra, Fire of Kaladesh|ORI @@ -81,9 +81,9 @@ Name=MTGO Legacy Cube April 2017 (600 cards) 1 Chandra, Torch of Defiance|KLD 1 Char|RAV 1 Chord of Calling|M15 -1 Chromatic Lantern|RTR +1 Chromatic Lantern|GRN 1 City of Brass|MMA -1 Clifftop Retreat|ISD +1 Clifftop Retreat|DOM 1 Cloudgoat Ranger|MMA 1 Coalition Relic|A25 1 Coldsteel Heart|CSP @@ -101,7 +101,7 @@ Name=MTGO Legacy Cube April 2017 (600 cards) 1 Courser of Kruphix|A25 1 Crater's Claws|KTK 1 Craterhoof Behemoth|MM3 -1 Creeping Tar Pit|WWK +1 Creeping Tar Pit|UMA 1 Crux of Fate|FRF 1 Cryptic Command|IMA 1 Cultivate|A25 @@ -123,7 +123,7 @@ Name=MTGO Legacy Cube April 2017 (600 cards) 1 Deranged Hermit|VMA 1 Desecration Demon|MM3 1 Devil's Play|ISD -1 Devoted Druid|SHM +1 Devoted Druid|UMA 1 Disallow|AER 1 Disfigure|A25 1 Dismember|MM2 @@ -146,7 +146,7 @@ Name=MTGO Legacy Cube April 2017 (600 cards) 1 Dualcaster Mage|EMA 1 Dungeon Geists|DKA 1 Duplicant|EMA -1 Duress|IMA +1 Duress|M19 1 Duskwatch Recruiter|SOI 1 Edric, Spymaster of Trest|VMA 1 Elder Deep-Fiend|EMN @@ -158,28 +158,28 @@ Name=MTGO Legacy Cube April 2017 (600 cards) 1 Elves of Deep Shadow|RAV 1 Elvish Mystic|M15 1 Emeria Angel|IMA -1 Emrakul, the Aeons Torn|MM2 +1 Emrakul, the Aeons Torn|UMA 1 Emrakul, the Promised End|EMN -1 Engineered Explosives|MMA -1 Entomb|EMA +1 Engineered Explosives|UMA +1 Entomb|UMA 1 Entreat the Angels|MM3 1 Erebos, God of the Dead|THS -1 Eternal Witness|MMA +1 Eternal Witness|UMA 1 Ever After|SOI 1 Exhume|USG 1 Explore|MM3 1 Exquisite Firecraft|ORI 1 Fact or Fiction|EMA -1 Faith's Fetters|EMA +1 Faith's Fetters|UMA 1 Falkenrath Gorger|SOI 1 Far // Away|DGM 1 Farseek|M13 1 Fatal Push|AER -1 Fauna Shaman|M11 +1 Fauna Shaman|UMA 1 Fertile Ground|LRW -1 Fiend Hunter|A25 +1 Fiend Hunter|UMA 1 Fiery Confluence -1 Fire // Ice|APC +1 Fire // Ice|UMA 1 Firebolt|EMA 1 Firefist Striker|GTC 1 Flame Slash|ROE @@ -207,12 +207,12 @@ Name=MTGO Legacy Cube April 2017 (600 cards) 1 Gideon, Ally of Zendikar|BFZ 1 Gifted Aetherborn|AER 1 Gifts Ungiven|MM3 -1 Gilded Lotus|M13 +1 Gilded Lotus|DOM 1 Gilt-Leaf Winnower|ORI 1 Gisela, the Broken Blade|EMN 1 Gitaxian Probe|NPH 1 Glacial Fortress|XLN -1 Glen Elendra Archmage|MMA +1 Glen Elendra Archmage|UMA 1 Glorious Anthem|10E 1 Go for the Throat|MBS 1 Goblin Bombardment|TPR @@ -230,7 +230,7 @@ Name=MTGO Legacy Cube April 2017 (600 cards) 1 Greenwarden of Murasa|BFZ 1 Grim Lavamancer|M12 1 Griselbrand|MM3 -1 Gurmag Angler|FRF +1 Gurmag Angler|UMA 1 Hallowed Fountain|RTR 1 Hallowed Spiritkeeper 1 Hangarback Walker|ORI @@ -240,7 +240,7 @@ Name=MTGO Legacy Cube April 2017 (600 cards) 1 Hero of Bladehold|MBS 1 Hero's Downfall|THS 1 Hidden Dragonslayer|DTK -1 Hinterland Harbor|ISD +1 Hinterland Harbor|DOM 1 Hissing Quagmire|OGW 1 Honor of the Pure|M12 1 Hordeling Outburst|A25 @@ -259,7 +259,7 @@ Name=MTGO Legacy Cube April 2017 (600 cards) 1 Into the Roil|ZEN 1 Ire Shaman|A25 1 Isamaru, Hound of Konda|CHK -1 Isolated Chapel|ISD +1 Isolated Chapel|DOM 1 Izzet Charm|MM3 1 Jace Beleren|M11 1 Jace, Architect of Thought|RTR @@ -270,7 +270,7 @@ Name=MTGO Legacy Cube April 2017 (600 cards) 1 Journey to Nowhere|ZEN 1 Kalitas, Traitor of Ghet|OGW 1 Karmic Guide|EMA -1 Karn Liberated|MM2 +1 Karn Liberated|UMA 1 Keiga, the Tide Star|MMA 1 Keranos, God of Storms|JOU 1 Kiki-Jiki, Mirror Breaker|IMA @@ -278,24 +278,24 @@ Name=MTGO Legacy Cube April 2017 (600 cards) 1 Kiora's Follower|BNG 1 Kiora, the Crashing Wave|BNG 1 Kira, Great Glass-Spinner|MMA -1 Kitchen Finks|MMA +1 Kitchen Finks|UMA 1 Knight of the Reliquary|IMA -1 Kodama's Reach|MMA +1 Kodama's Reach|UMA 1 Kokusho, the Evening Star|MMA 1 Kolaghan's Command|DTK 1 Koth of the Hammer|SOM 1 Kytheon, Hero of Akros|ORI 1 Land Tax|4ED 1 Languish|ORI -1 Lavaclaw Reaches|WWK +1 Lavaclaw Reaches|UMA 1 Legacy's Allure|TMP 1 Leonin Relic-Warder|MBS 1 Lightning Bolt|A25 1 Lightning Greaves|MRD 1 Lightning Helix|IMA 1 Lightning Mauler|AVR -1 Lightning Strike|XLN -1 Liliana of the Veil|MM3 +1 Lightning Strike|M19 +1 Liliana of the Veil|UMA 1 Liliana Vess|M15 1 Liliana, Heretical Healer|ORI 1 Liliana, the Last Hope|EMN @@ -303,11 +303,11 @@ Name=MTGO Legacy Cube April 2017 (600 cards) 1 Linvala, Keeper of Silence|MM3 1 Linvala, the Preserver|OGW 1 Living Death|A25 -1 Llanowar Elves|EMA +1 Llanowar Elves|DOM 1 Looter il-Kor|TSP 1 Lotus Cobra|IMA 1 Lumbering Falls|BFZ -1 Maelstrom Pulse|MMA +1 Maelstrom Pulse|UMA 1 Magma Jet|MM3 1 Magus of the Wheel|A25 1 Makeshift Mannequin|LRW @@ -324,7 +324,7 @@ Name=MTGO Legacy Cube April 2017 (600 cards) 1 Master of Waves|THS 1 Maze of Ith|EMA 1 Meloku the Clouded Mirror|MMA -1 Mentor of the Meek|ISD +1 Mentor of the Meek|M19 1 Merfolk Looter|A25 1 Mimic Vat|SOM 1 Mind Stone|IMA @@ -341,7 +341,7 @@ Name=MTGO Legacy Cube April 2017 (600 cards) 1 Mother of Runes|EMA 1 Mulldrifter|MM2 1 Murderous Cut|KTK -1 Murderous Redcap|MMA +1 Murderous Redcap|UMA 1 Mutavault|M14 1 Myr Battlesphere|SOM 1 Mystic Snake|A25 @@ -359,7 +359,7 @@ Name=MTGO Legacy Cube April 2017 (600 cards) 1 Nissa, Vital Force|KLD 1 Nissa, Voice of Zendikar|OGW 1 Nissa, Worldwaker|M15 -1 Noble Hierarch|MM2 +1 Noble Hierarch|UMA 1 Noxious Gearhulk|KLD 1 Nykthos, Shrine to Nyx|THS 1 Oath of Nissa|OGW @@ -376,7 +376,7 @@ Name=MTGO Legacy Cube April 2017 (600 cards) 1 Oust|ROE 1 Outpost Siege|FRF 1 Overgrown Battlement|IMA -1 Overgrown Tomb|RTR +1 Overgrown Tomb|GRN 1 Pack Rat|RTR 1 Pact of Negation|A25 1 Panharmonicon|KLD @@ -407,7 +407,7 @@ Name=MTGO Legacy Cube April 2017 (600 cards) 1 Pyroclasm|A25 1 Qasali Pridemage|ARB 1 Quarantine Field|BFZ -1 Raging Ravine|WWK +1 Raging Ravine|UMA 1 Raise the Alarm|EMA 1 Rakdos's Return|RTR 1 Ral Zarek|DGM @@ -418,9 +418,9 @@ Name=MTGO Legacy Cube April 2017 (600 cards) 1 Ravages of War|PTK 1 Razorverge Thicket|SOM 1 Read the Bones|ORI -1 Reanimate|TPR +1 Reanimate|UMA 1 Reckless Bushwhacker|OGW -1 Reclamation Sage|M15 +1 Reclamation Sage|M19 1 Recruiter of the Guard 1 Recurring Nightmare|TPR 1 Reflecting Pool|CNS @@ -431,7 +431,7 @@ Name=MTGO Legacy Cube April 2017 (600 cards) 1 Remove Soul|10E 1 Repeal|IMA 1 Restoration Angel|IMA -1 Reveillark|MMA +1 Reveillark|UMA 1 Rift Bolt|IMA 1 Riftwing Cloudskate|MMA 1 Rishadan Port|A25 @@ -440,7 +440,7 @@ Name=MTGO Legacy Cube April 2017 (600 cards) 1 Rofellos, Llanowar Emissary|VMA 1 Rootbound Crag|XLN 1 Rune-Scarred Demon|IMA -1 Sacred Foundry|GTC +1 Sacred Foundry|GRN 1 Sakura-Tribe Elder|CNS 1 Sarkhan, the Dragonspeaker|KTK 1 Savannah|VMA @@ -467,15 +467,15 @@ Name=MTGO Legacy Cube April 2017 (600 cards) 1 Shelldock Isle|LRW 1 Sheoldred, Whispering One|IMA 1 Show and Tell|USG -1 Shriekmaw|LRW +1 Shriekmaw|UMA 1 Sidisi, Undead Vizier|DTK -1 Siege-Gang Commander|EMA +1 Siege-Gang Commander|DOM 1 Silverblade Paladin|AVR 1 Skinrender|SOM 1 Slagstorm|MBS 1 Slaughter Pact|MMA 1 Smuggler's Copter|KLD -1 Snapcaster Mage|MM3 +1 Snapcaster Mage|UMA 1 Sneak Attack|EMA 1 Soldier of the Pantheon|THS 1 Solemn Simulacrum|M12 @@ -493,8 +493,8 @@ Name=MTGO Legacy Cube April 2017 (600 cards) 1 Spirebluff Canal|KLD 1 Splinter Twin|MM2 1 Staggershock|IMA -1 Steam Vents|RTR -1 Stirring Wildwood|WWK +1 Steam Vents|GRN +1 Stirring Wildwood|UMA 1 Stoke the Flames|M15 1 Stomping Ground|GTC 1 Stoneforge Mystic|WWK @@ -504,8 +504,8 @@ Name=MTGO Legacy Cube April 2017 (600 cards) 1 Stroke of Genius|VMA 1 Stromkirk Noble|ISD 1 Student of Warfare|ROE -1 Sublime Archangel|M13 -1 Sulfur Falls|ISD +1 Sublime Archangel|UMA +1 Sulfur Falls|DOM 1 Summoning Trap|MM3 1 Sun Titan|M12 1 Sundering Titan|A25 @@ -525,10 +525,10 @@ Name=MTGO Legacy Cube April 2017 (600 cards) 1 Talrand, Sky Summoner|M13 1 Tamiyo, the Moon Sage|AVR 1 Tangle Wire|NMS -1 Tarmogoyf|MM3 +1 Tarmogoyf|UMA 1 Tasigur, the Golden Fang|FRF 1 Teferi, Mage of Zhalfir|IMA -1 Temple Garden|RTR +1 Temple Garden|GRN 1 Terastodon|CNS 1 Terminate|MM3 1 Terminus|MM3 @@ -557,7 +557,7 @@ Name=MTGO Legacy Cube April 2017 (600 cards) 1 Ulamog, the Ceaseless Hunger|BFZ 1 Ultimate Price|DTK 1 Umezawa's Jitte|BOK -1 Unburial Rites|MM3 +1 Unburial Rites|UMA 1 Underground Sea|VMA 1 Underworld Connections|RTR 1 Unexpectedly Absent|EMA @@ -581,23 +581,23 @@ Name=MTGO Legacy Cube April 2017 (600 cards) 1 Wall of Omens|EMA 1 Wandering Fumarole|OGW 1 Wasteland|EMA -1 Watery Grave|GTC +1 Watery Grave|GRN 1 Whip of Erebos|THS 1 Whirler Rogue|ORI 1 Whisperwood Elemental|FRF -1 Wickerbough Elder|EVE +1 Wickerbough Elder|UMA 1 Windbrisk Heights|LRW 1 Windswept Heath|KTK 1 Wolfir Silverheart|AVR 1 Wood Elves|9ED 1 Wooded Foothills|KTK -1 Woodfall Primus|MMA -1 Woodland Cemetery|ISD +1 Woodfall Primus|UMA +1 Woodland Cemetery|DOM 1 Wrath of God|EMA 1 Wretched Confluence 1 Wurmcoil Engine|SOM 1 Xenagos, the Reveler|THS 1 Yavimaya Elder|VMA 1 Yosei, the Morning Star|MMA -1 Young Pyromancer|EMA +1 Young Pyromancer|UMA 1 Zealous Conscripts|MM3 diff --git a/forge-gui/res/cube/MTGO Legacy Cube February 2018 (600 cards).dck b/forge-gui/res/cube/MTGO Legacy Cube February 2018 (600 cards).dck index a5be69cc1f0..3e724c7557b 100644 --- a/forge-gui/res/cube/MTGO Legacy Cube February 2018 (600 cards).dck +++ b/forge-gui/res/cube/MTGO Legacy Cube February 2018 (600 cards).dck @@ -12,7 +12,7 @@ Name=MTGO Legacy Cube February 2018 (600 cards) 1 Ajani Vengeant|ALA 1 Anafenza, Kin-Tree Spirit|DTK 1 Ancestral Vision|IMA -1 Ancient Tomb|VMA +1 Ancient Tomb|UMA 1 Angel of Invention|KLD 1 Angel of Serenity|RTR 1 Anger of the Gods|IMA @@ -32,7 +32,7 @@ Name=MTGO Legacy Cube February 2018 (600 cards) 1 Avenger of Zendikar|WWK 1 Badlands|VMA 1 Baleful Strix|EMA -1 Banefire|MM2 +1 Banefire|M19 1 Baneslayer Angel|M11 1 Banisher Priest|M14 1 Banishing Light|JOU @@ -43,7 +43,7 @@ Name=MTGO Legacy Cube February 2018 (600 cards) 1 Bedlam Reveler|EMN 1 Birds of Paradise|M12 1 Birthing Pod|NPH -1 Bitterblossom|MM2 +1 Bitterblossom|UMA 1 Blackcleave Cliffs|SOM 1 Blade Splicer|MM3 1 Blood Crypt|RTR @@ -64,16 +64,16 @@ Name=MTGO Legacy Cube February 2018 (600 cards) 1 Brimaz, King of Oreskos|BNG 1 Brimstone Volley|CNS 1 Bruna, the Fading Light|EMN -1 Buried Alive|ODY +1 Buried Alive|UMA 1 Burst Lightning|MM2 1 Careful Consideration|MMA 1 Careful Study|ODY 1 Carnage Tyrant|XLN 1 Cathartic Reunion|KLD -1 Celestial Colonnade|WWK +1 Celestial Colonnade|UMA 1 Censor|AKH 1 Chain Lightning|EMA -1 Chainer's Edict|TOR +1 Chainer's Edict|UMA 1 Chandra's Phoenix|M14 1 Chandra, Fire of Kaladesh|ORI 1 Chandra, Flamecaller|OGW @@ -82,9 +82,9 @@ Name=MTGO Legacy Cube February 2018 (600 cards) 1 Char|RAV 1 Chart a Course|XLN 1 Chord of Calling|M15 -1 Chromatic Lantern|RTR +1 Chromatic Lantern|GRN 1 City of Brass|MMA -1 Clifftop Retreat|ISD +1 Clifftop Retreat|DOM 1 Cloudgoat Ranger|MMA 1 Coalition Relic|A25 1 Coldsteel Heart|CSP @@ -102,7 +102,7 @@ Name=MTGO Legacy Cube February 2018 (600 cards) 1 Courser of Kruphix|A25 1 Crater's Claws|KTK 1 Craterhoof Behemoth|MM3 -1 Creeping Tar Pit|WWK +1 Creeping Tar Pit|UMA 1 Crux of Fate|FRF 1 Cryptic Command|IMA 1 Cultivate|A25 @@ -122,7 +122,7 @@ Name=MTGO Legacy Cube February 2018 (600 cards) 1 Deranged Hermit|VMA 1 Desecration Demon|MM3 1 Devil's Play|ISD -1 Devoted Druid|SHM +1 Devoted Druid|UMA 1 Disallow|AER 1 Disfigure|A25 1 Dismember|MM2 @@ -145,7 +145,7 @@ Name=MTGO Legacy Cube February 2018 (600 cards) 1 Dualcaster Mage|EMA 1 Dungeon Geists|DKA 1 Duplicant|EMA -1 Duress|IMA +1 Duress|M19 1 Duskwatch Recruiter|SOI 1 Edric, Spymaster of Trest|VMA 1 Elder Deep-Fiend|EMN @@ -157,26 +157,26 @@ Name=MTGO Legacy Cube February 2018 (600 cards) 1 Elves of Deep Shadow|RAV 1 Elvish Mystic|M15 1 Emeria Angel|IMA -1 Emrakul, the Aeons Torn|MM2 +1 Emrakul, the Aeons Torn|UMA 1 Emrakul, the Promised End|EMN -1 Entomb|EMA +1 Entomb|UMA 1 Entreat the Angels|MM3 1 Erebos, God of the Dead|THS -1 Eternal Witness|MMA +1 Eternal Witness|UMA 1 Exhume|USG 1 Explore|MM3 1 Exquisite Firecraft|ORI 1 Fact or Fiction|EMA -1 Faith's Fetters|EMA +1 Faith's Fetters|UMA 1 Falkenrath Gorger|SOI 1 Farseek|M13 1 Fatal Push|AER -1 Fauna Shaman|M11 +1 Fauna Shaman|UMA 1 Fertile Ground|LRW 1 Field of Ruin|XLN -1 Fiend Hunter|A25 +1 Fiend Hunter|UMA 1 Fiery Confluence -1 Fire // Ice|APC +1 Fire // Ice|UMA 1 Firebolt|EMA 1 Flame Slash|ROE 1 Flametongue Kavu|VMA @@ -203,11 +203,11 @@ Name=MTGO Legacy Cube February 2018 (600 cards) 1 Gideon, Ally of Zendikar|BFZ 1 Gifted Aetherborn|AER 1 Gifts Ungiven|MM3 -1 Gilded Lotus|M13 +1 Gilded Lotus|DOM 1 Gisela, the Broken Blade|EMN 1 Gitaxian Probe|NPH 1 Glacial Fortress|XLN -1 Glen Elendra Archmage|MMA +1 Glen Elendra Archmage|UMA 1 Glorious Anthem|10E 1 Glorybringer|AKH 1 Go for the Throat|MBS @@ -234,7 +234,7 @@ Name=MTGO Legacy Cube February 2018 (600 cards) 1 Hero of Bladehold|MBS 1 Hero's Downfall|THS 1 Hidden Dragonslayer|DTK -1 Hinterland Harbor|ISD +1 Hinterland Harbor|DOM 1 Hissing Quagmire|OGW 1 Honor of the Pure|M12 1 Hordeling Outburst|A25 @@ -255,7 +255,7 @@ Name=MTGO Legacy Cube February 2018 (600 cards) 1 Into the Roil|ZEN 1 Ire Shaman|A25 1 Isamaru, Hound of Konda|CHK -1 Isolated Chapel|ISD +1 Isolated Chapel|DOM 1 Izzet Charm|MM3 1 Jace Beleren|M11 1 Jace, Architect of Thought|RTR @@ -267,7 +267,7 @@ Name=MTGO Legacy Cube February 2018 (600 cards) 1 Journey to Nowhere|ZEN 1 Kalitas, Traitor of Ghet|OGW 1 Karmic Guide|EMA -1 Karn Liberated|MM2 +1 Karn Liberated|UMA 1 Keiga, the Tide Star|MMA 1 Keranos, God of Storms|JOU 1 Kiki-Jiki, Mirror Breaker|IMA @@ -275,17 +275,17 @@ Name=MTGO Legacy Cube February 2018 (600 cards) 1 Kiora's Follower|BNG 1 Kiora, the Crashing Wave|BNG 1 Kira, Great Glass-Spinner|MMA -1 Kitchen Finks|MMA +1 Kitchen Finks|UMA 1 Kitesail Freebooter|XLN 1 Knight of the Reliquary|IMA -1 Kodama's Reach|MMA +1 Kodama's Reach|UMA 1 Kokusho, the Evening Star|MMA 1 Kolaghan's Command|DTK 1 Koth of the Hammer|SOM 1 Kytheon, Hero of Akros|ORI 1 Land Tax|4ED 1 Languish|ORI -1 Lavaclaw Reaches|WWK +1 Lavaclaw Reaches|UMA 1 Legacy's Allure|TMP 1 Legion's Landing|XLN 1 Leonin Relic-Warder|MBS @@ -293,8 +293,8 @@ Name=MTGO Legacy Cube February 2018 (600 cards) 1 Lightning Greaves|MRD 1 Lightning Helix|IMA 1 Lightning Mauler|AVR -1 Lightning Strike|XLN -1 Liliana of the Veil|MM3 +1 Lightning Strike|M19 +1 Liliana of the Veil|UMA 1 Liliana Vess|M15 1 Liliana, Death's Majesty|AKH 1 Liliana, Heretical Healer|ORI @@ -303,12 +303,12 @@ Name=MTGO Legacy Cube February 2018 (600 cards) 1 Linvala, Keeper of Silence|MM3 1 Linvala, the Preserver|OGW 1 Living Death|A25 -1 Llanowar Elves|EMA +1 Llanowar Elves|DOM 1 Looter il-Kor|TSP 1 Lotus Cobra|IMA 1 Loxodon Warhammer|10E 1 Lumbering Falls|BFZ -1 Maelstrom Pulse|MMA +1 Maelstrom Pulse|UMA 1 Magma Jet|MM3 1 Makeshift Mannequin|LRW 1 Malicious Affliction|EMA @@ -323,7 +323,7 @@ Name=MTGO Legacy Cube February 2018 (600 cards) 1 Master of the Wild Hunt|A25 1 Master of Waves|THS 1 Maze of Ith|EMA -1 Mentor of the Meek|ISD +1 Mentor of the Meek|M19 1 Merfolk Looter|A25 1 Mimic Vat|SOM 1 Mind Stone|IMA @@ -340,7 +340,7 @@ Name=MTGO Legacy Cube February 2018 (600 cards) 1 Mother of Runes|EMA 1 Mulldrifter|MM2 1 Murderous Cut|KTK -1 Murderous Redcap|MMA +1 Murderous Redcap|UMA 1 Mutavault|M14 1 Myr Battlesphere|SOM 1 Mystic Snake|A25 @@ -360,7 +360,7 @@ Name=MTGO Legacy Cube February 2018 (600 cards) 1 Nissa, Vital Force|KLD 1 Nissa, Voice of Zendikar|OGW 1 Nissa, Worldwaker|M15 -1 Noble Hierarch|MM2 +1 Noble Hierarch|UMA 1 Noxious Gearhulk|KLD 1 Nykthos, Shrine to Nyx|THS 1 Oath of Nissa|OGW @@ -373,12 +373,12 @@ Name=MTGO Legacy Cube February 2018 (600 cards) 1 Oona's Prowler|LRW 1 Ophiomancer 1 Opposition|7ED -1 Opt|XLN +1 Opt|DOM 1 Oracle of Mul Daya|ZEN 1 Oust|ROE 1 Outpost Siege|FRF 1 Overgrown Battlement|IMA -1 Overgrown Tomb|RTR +1 Overgrown Tomb|GRN 1 Pack Rat|RTR 1 Pact of Negation|A25 1 Parallax Wave|VMA @@ -408,7 +408,7 @@ Name=MTGO Legacy Cube February 2018 (600 cards) 1 Pyroclasm|A25 1 Qasali Pridemage|ARB 1 Quarantine Field|BFZ -1 Raging Ravine|WWK +1 Raging Ravine|UMA 1 Raise the Alarm|EMA 1 Rakdos's Return|RTR 1 Ral Zarek|DGM @@ -420,9 +420,9 @@ Name=MTGO Legacy Cube February 2018 (600 cards) 1 Razaketh, the Foulblooded|HOU 1 Razorverge Thicket|SOM 1 Read the Bones|ORI -1 Reanimate|TPR +1 Reanimate|UMA 1 Reckless Bushwhacker|OGW -1 Reclamation Sage|M15 +1 Reclamation Sage|M19 1 Recruiter of the Guard 1 Recurring Nightmare|TPR 1 Reflecting Pool|CNS @@ -434,7 +434,7 @@ Name=MTGO Legacy Cube February 2018 (600 cards) 1 Remove Soul|10E 1 Repeal|IMA 1 Restoration Angel|IMA -1 Reveillark|MMA +1 Reveillark|UMA 1 Rift Bolt|IMA 1 Riftwing Cloudskate|MMA 1 Rishadan Port|A25 @@ -443,7 +443,7 @@ Name=MTGO Legacy Cube February 2018 (600 cards) 1 Rofellos, Llanowar Emissary|VMA 1 Rootbound Crag|XLN 1 Rune-Scarred Demon|IMA -1 Sacred Foundry|GTC +1 Sacred Foundry|GRN 1 Sakura-Tribe Elder|CNS 1 Sarkhan, the Dragonspeaker|KTK 1 Savannah|VMA @@ -471,15 +471,15 @@ Name=MTGO Legacy Cube February 2018 (600 cards) 1 Shelldock Isle|LRW 1 Sheoldred, Whispering One|IMA 1 Show and Tell|USG -1 Shriekmaw|LRW -1 Siege-Gang Commander|EMA +1 Shriekmaw|UMA +1 Siege-Gang Commander|DOM 1 Silverblade Paladin|AVR 1 Skinrender|SOM 1 Skymarcher Aspirant|RIX 1 Slagstorm|MBS 1 Slaughter Pact|MMA 1 Smuggler's Copter|KLD -1 Snapcaster Mage|MM3 +1 Snapcaster Mage|UMA 1 Sneak Attack|EMA 1 Solemn Simulacrum|M12 1 Song of the Dryads @@ -495,8 +495,8 @@ Name=MTGO Legacy Cube February 2018 (600 cards) 1 Spirebluff Canal|KLD 1 Splinter Twin|MM2 1 Staggershock|IMA -1 Steam Vents|RTR -1 Stirring Wildwood|WWK +1 Steam Vents|GRN +1 Stirring Wildwood|UMA 1 Stoke the Flames|M15 1 Stomping Ground|GTC 1 Stoneforge Mystic|WWK @@ -506,8 +506,8 @@ Name=MTGO Legacy Cube February 2018 (600 cards) 1 Stroke of Genius|VMA 1 Stromkirk Noble|ISD 1 Student of Warfare|ROE -1 Sublime Archangel|M13 -1 Sulfur Falls|ISD +1 Sublime Archangel|UMA +1 Sulfur Falls|DOM 1 Sun Titan|M12 1 Sundering Titan|A25 1 Sunpetal Grove|XLN @@ -526,10 +526,10 @@ Name=MTGO Legacy Cube February 2018 (600 cards) 1 Talrand, Sky Summoner|M13 1 Tamiyo, the Moon Sage|AVR 1 Tangle Wire|NMS -1 Tarmogoyf|MM3 +1 Tarmogoyf|UMA 1 Tasigur, the Golden Fang|FRF 1 Teferi, Mage of Zhalfir|IMA -1 Temple Garden|RTR +1 Temple Garden|GRN 1 Terastodon|CNS 1 Terminate|MM3 1 Terminus|MM3 @@ -560,7 +560,7 @@ Name=MTGO Legacy Cube February 2018 (600 cards) 1 Ulamog, the Ceaseless Hunger|BFZ 1 Ultimate Price|DTK 1 Umezawa's Jitte|BOK -1 Unburial Rites|MM3 +1 Unburial Rites|UMA 1 Underground Sea|VMA 1 Underworld Connections|RTR 1 Unexpectedly Absent|EMA @@ -582,22 +582,22 @@ Name=MTGO Legacy Cube February 2018 (600 cards) 1 Wall of Omens|EMA 1 Wandering Fumarole|OGW 1 Wasteland|EMA -1 Watery Grave|GTC +1 Watery Grave|GRN 1 Whip of Erebos|THS 1 Whirler Rogue|ORI 1 Whisperwood Elemental|FRF -1 Wickerbough Elder|EVE +1 Wickerbough Elder|UMA 1 Windbrisk Heights|LRW 1 Windswept Heath|KTK 1 Wolfir Silverheart|AVR 1 Wood Elves|9ED 1 Wooded Foothills|KTK -1 Woodfall Primus|MMA -1 Woodland Cemetery|ISD +1 Woodfall Primus|UMA +1 Woodland Cemetery|DOM 1 Wrath of God|EMA 1 Wretched Confluence 1 Wurmcoil Engine|SOM 1 Xenagos, the Reveler|THS 1 Yavimaya Elder|VMA -1 Young Pyromancer|EMA +1 Young Pyromancer|UMA 1 Zealous Conscripts|MM3 diff --git a/forge-gui/res/cube/MTGO Legacy Cube January 2016 (600 cards).dck b/forge-gui/res/cube/MTGO Legacy Cube January 2016 (600 cards).dck index a6b7d63b3ed..b2bd8cc4d60 100644 --- a/forge-gui/res/cube/MTGO Legacy Cube January 2016 (600 cards).dck +++ b/forge-gui/res/cube/MTGO Legacy Cube January 2016 (600 cards).dck @@ -15,7 +15,7 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Ajani, Caller of the Pride|M14 1 Anafenza, Kin-Tree Spirit|DTK 1 Ancestral Vision|IMA -1 Ancient Tomb|VMA +1 Ancient Tomb|UMA 1 Angel of Serenity|RTR 1 Anger of the Gods|IMA 1 Animate Dead|EMA @@ -36,7 +36,7 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Avenger of Zendikar|WWK 1 Badlands|VMA 1 Baleful Strix|EMA -1 Banefire|MM2 +1 Banefire|M19 1 Baneslayer Angel|M11 1 Banisher Priest|M14 1 Banishing Light|JOU @@ -47,7 +47,7 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Beetleback Chief|EMA 1 Birds of Paradise|M12 1 Birthing Pod|NPH -1 Bitterblossom|MM2 +1 Bitterblossom|UMA 1 Blade Splicer|MM3 1 Blood Artist|EMA 1 Blood Crypt|RTR @@ -69,7 +69,7 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Brimstone Volley|CNS 1 Brushland|10E 1 Brutal Expulsion|BFZ -1 Buried Alive|ODY +1 Buried Alive|UMA 1 Burst Lightning|MM2 1 Careful Study|ODY 1 Carrier Thrall|BFZ @@ -77,7 +77,7 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Catacomb Sifter|BFZ 1 Caves of Koilos|ORI 1 Chain Lightning|EMA -1 Chainer's Edict|TOR +1 Chainer's Edict|UMA 1 Chameleon Colossus|MOR 1 Champion of the Parish|ISD 1 Chandra Nalaar|M11 @@ -87,9 +87,9 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Char|RAV 1 Chasm Skulker|M15 1 Chord of Calling|M15 -1 Chromatic Lantern|RTR +1 Chromatic Lantern|GRN 1 City of Brass|MMA -1 Clifftop Retreat|ISD +1 Clifftop Retreat|DOM 1 Cloudgoat Ranger|MMA 1 Collected Company|DTK 1 Compulsive Research|MM3 @@ -112,7 +112,7 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Damnation|MM3 1 Dance of the Dead|ICE 1 Dark Confidant|MM2 -1 Dark Depths|CSP +1 Dark Depths|UMA 1 Dark Petition|ORI 1 Dark Ritual|A25 1 Day of Judgment|M12 @@ -150,7 +150,7 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Dualcaster Mage|EMA 1 Dungeon Geists|DKA 1 Duplicant|EMA -1 Duress|IMA +1 Duress|M19 1 Eldrazi Monument|ZEN 1 Edric, Spymaster of Trest|VMA 1 Electrolyze|IMA @@ -163,12 +163,12 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Elves of Deep Shadow|RAV 1 Elvish Mystic|M15 1 Emeria Angel|IMA -1 Emrakul, the Aeons Torn|MM2 -1 Entomb|EMA +1 Emrakul, the Aeons Torn|UMA +1 Entomb|UMA 1 Entreat the Angels|MM3 1 Erebos, God of the Dead|THS 1 Eternal Dragon|VMA -1 Eternal Witness|MMA +1 Eternal Witness|UMA 1 Eureka|VMA 1 Evolutionary Leap|ORI 1 Exalted Angel|ONS @@ -177,14 +177,14 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Explore|MM3 1 Exquisite Firecraft|ORI 1 Fact or Fiction|EMA -1 Faith's Fetters|EMA +1 Faith's Fetters|UMA 1 Falkenrath Aristocrat|MM3 1 Farseek|M13 -1 Fauna Shaman|M11 +1 Fauna Shaman|UMA 1 Fertile Ground|LRW -1 Fiend Hunter|A25 +1 Fiend Hunter|UMA 1 Fiery Confluence -1 Fire // Ice|APC +1 Fire // Ice|UMA 1 Firebolt|EMA 1 Firefist Striker|GTC 1 Flame Slash|ROE @@ -193,7 +193,7 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Flickerwisp|MM3 1 Flooded Strand|KTK 1 Forbid|TPR -1 Forbidden Alchemy|MM3 +1 Forbidden Alchemy|UMA 1 Force of Will|EMA 1 Force Spike|7ED 1 Forked Bolt|ROE @@ -204,7 +204,7 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Frost Titan|M12 1 Future Sight|EMA 1 Fyndhorn Elves|VMA -1 Gaddock Teeg|LRW +1 Gaddock Teeg|UMA 1 Gaea's Cradle|USG 1 Garruk Relentless|ISD 1 Garruk Wildspeaker|M11 @@ -220,11 +220,11 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Gideon, Ally of Zendikar|BFZ 1 Gideon Jura|M12 1 Gifts Ungiven|MM3 -1 Gilded Lotus|M13 +1 Gilded Lotus|DOM 1 Gilt-Leaf Winnower|ORI 1 Gitaxian Probe|NPH 1 Glacial Fortress|XLN -1 Glen Elendra Archmage|MMA +1 Glen Elendra Archmage|UMA 1 Glorious Anthem|10E 1 Go for the Throat|MBS 1 Goblin Bombardment|TPR @@ -254,7 +254,7 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Hero's Downfall|THS 1 Hidden Dragonslayer|DTK 1 High Market|MMQ -1 Hinterland Harbor|ISD +1 Hinterland Harbor|DOM 1 Honor of the Pure|M12 1 Hordeling Outburst|A25 1 Hornet Queen|M15 @@ -271,7 +271,7 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Ire Shaman|A25 1 Isamaru, Hound of Konda|CHK 1 Isochron Scepter|EMA -1 Isolated Chapel|ISD +1 Isolated Chapel|DOM 1 Izzet Charm|MM3 1 Jace Beleren|M11 1 Jace, Architect of Thought|RTR @@ -282,7 +282,7 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Journey to Nowhere|ZEN 1 Kami of Ancient Law|MM2 1 Karmic Guide|EMA -1 Karn Liberated|MM2 +1 Karn Liberated|UMA 1 Karplusan Forest|10E 1 Keiga, the Tide Star|MMA 1 Keranos, God of Storms|JOU @@ -291,12 +291,12 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Kiora, the Crashing Wave|BNG 1 Kiora's Follower|BNG 1 Kira, Great Glass-Spinner|MMA -1 Kitchen Finks|MMA -1 Kodama's Reach|MMA +1 Kitchen Finks|UMA +1 Kodama's Reach|UMA 1 Kokusho, the Evening Star|MMA 1 Kor Skyfisher|MM3 1 Koth of the Hammer|SOM -1 Kozilek, Butcher of Truth|MM2 +1 Kozilek, Butcher of Truth|UMA 1 Krenko's Command|M13 1 Kytheon, Hero of Akros|ORI 1 Land Tax|4ED @@ -306,19 +306,19 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Lightning Greaves|MRD 1 Lightning Helix|IMA 1 Lightning Mauler|AVR -1 Lightning Strike|XLN -1 Liliana of the Veil|MM3 +1 Lightning Strike|M19 +1 Liliana of the Veil|UMA 1 Liliana Vess|M15 1 Liliana, Heretical Healer|ORI 1 Lingering Souls|MM3 1 Linvala, Keeper of Silence|MM3 1 Living Death|A25 -1 Llanowar Elves|EMA +1 Llanowar Elves|DOM 1 Llanowar Wastes|ORI 1 Looter il-Kor|TSP 1 Lotus Cobra|IMA 1 Loxodon Warhammer|10E -1 Maelstrom Pulse|MMA +1 Maelstrom Pulse|UMA 1 Magma Jet|MM3 1 Makeshift Mannequin|LRW 1 Malicious Affliction|EMA @@ -333,7 +333,7 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Master of the Wild Hunt|A25 1 Master of Waves|THS 1 Meloku the Clouded Mirror|MMA -1 Mentor of the Meek|ISD +1 Mentor of the Meek|M19 1 Merfolk Looter|A25 1 Meteor Blast 1 Mimic Vat|SOM @@ -364,7 +364,7 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Nightveil Specter|GTC 1 Nissa, Vastwood Seer|ORI 1 Nissa, Worldwaker|M15 -1 Noble Hierarch|MM2 +1 Noble Hierarch|UMA 1 Nykthos, Shrine to Nyx|THS 1 Ob Nixilis Reignited|BFZ 1 Oblivion Ring|MM2 @@ -380,7 +380,7 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Oust|ROE 1 Outpost Siege|FRF 1 Overgrown Battlement|IMA -1 Overgrown Tomb|RTR +1 Overgrown Tomb|GRN 1 Pack Rat|RTR 1 Pact of Negation|A25 1 Parallax Wave|VMA @@ -420,8 +420,8 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Ratchet Bomb|M14 1 Ravages of War|PTK 1 Read the Bones|ORI -1 Reanimate|TPR -1 Reclamation Sage|M15 +1 Reanimate|UMA +1 Reclamation Sage|M19 1 Recurring Nightmare|TPR 1 Reflecting Pool|CNS 1 Regrowth|A25 @@ -430,7 +430,7 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Remove Soul|10E 1 Repeal|IMA 1 Restoration Angel|IMA -1 Reveillark|MMA +1 Reveillark|UMA 1 Rift Bolt|IMA 1 Riftwing Cloudskate|MMA 1 Righteous Confluence @@ -439,7 +439,7 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Rofellos, Llanowar Emissary|VMA 1 Rootbound Crag|XLN 1 Rune-Scarred Demon|IMA -1 Sacred Foundry|GTC +1 Sacred Foundry|GRN 1 Sakura-Tribe Elder|CNS 1 Sarkhan, the Dragonspeaker|KTK 1 Savannah|VMA @@ -462,16 +462,16 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Sheoldred, Whispering One|IMA 1 Shivan Reef|ORI 1 Show and Tell|USG -1 Shriekmaw|LRW +1 Shriekmaw|UMA 1 Sidisi, Undead Vizier|DTK -1 Siege-Gang Commander|EMA +1 Siege-Gang Commander|DOM 1 Silverblade Paladin|AVR 1 Sin Collector|MM3 1 Skinrender|SOM 1 Skullcrack|GTC 1 Slagstorm|MBS 1 Slaughter Pact|MMA -1 Snapcaster Mage|MM3 +1 Snapcaster Mage|UMA 1 Sneak Attack|EMA 1 Soldier of the Pantheon|THS 1 Solemn Simulacrum|M12 @@ -488,7 +488,7 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Spikeshot Elder|MM2 1 Splinter Twin|MM2 1 Staggershock|IMA -1 Steam Vents|RTR +1 Steam Vents|GRN 1 Stoke the Flames|M15 1 Stomping Ground|GTC 1 Stormbreath Dragon|THS @@ -497,8 +497,8 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Stroke of Genius|VMA 1 Stromkirk Noble|ISD 1 Student of Warfare|ROE -1 Sublime Archangel|M13 -1 Sulfur Falls|ISD +1 Sublime Archangel|UMA +1 Sulfur Falls|DOM 1 Sulfurous Springs|10E 1 Summoning Trap|MM3 1 Sun Titan|M12 @@ -513,11 +513,11 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Talrand, Sky Summoner|M13 1 Tamiyo, the Moon Sage|AVR 1 Tangle Wire|NMS -1 Tarmogoyf|MM3 +1 Tarmogoyf|UMA 1 Tasigur, the Golden Fang|FRF 1 Tectonic Edge|WWK 1 Teferi, Mage of Zhalfir|IMA -1 Temple Garden|RTR +1 Temple Garden|GRN 1 Temple of Abandon|THS 1 Temple of Deceit|THS 1 Temple of Enlightenment|BNG @@ -533,11 +533,11 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Terminus|MM3 1 Thalia, Guardian of Thraben|A25 1 Thassa, God of the Sea|THS -1 Thespian's Stage|GTC +1 Thespian's Stage|UMA 1 Thoughtseize|IMA 1 Thragtusk|MM3 1 Threads of Disloyalty|BOK -1 Through the Breach|CHK +1 Through the Breach|UMA 1 Thrun, the Last Troll|MBS 1 Thunderbreak Regent|DTK 1 Thundermaw Hellkite|IMA @@ -551,9 +551,9 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Tundra|VMA 1 Ugin, the Spirit Dragon|FRF 1 Ulamog, the Ceaseless Hunger|BFZ -1 Ulamog, the Infinite Gyre|MM2 +1 Ulamog, the Infinite Gyre|UMA 1 Ultimate Price|DTK -1 Unburial Rites|MM3 +1 Unburial Rites|UMA 1 Underground River|10E 1 Underground Sea|VMA 1 Underworld Connections|RTR @@ -563,7 +563,7 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Vampire Hexmage|CNS 1 Vampire Nighthawk|MM3 1 Vendilion Clique|A25 -1 Vengevine|ROE +1 Vengevine|UMA 1 Venser, Shaper Savant|MM3 1 Venser, the Sojourner|SOM 1 Verdant Catacombs|MM3 @@ -577,9 +577,9 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Wall of Blossoms|TPR 1 Wall of Omens|EMA 1 Wall of Roots|IMA -1 Warleader's Helix|DGM +1 Warleader's Helix|UMA 1 Waterfront Bouncer|VMA -1 Watery Grave|GTC +1 Watery Grave|GRN 1 Whip of Erebos|THS 1 Whirler Rogue|ORI 1 Whisperwood Elemental|FRF @@ -589,8 +589,8 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Wolfir Silverheart|AVR 1 Wood Elves|9ED 1 Wooded Foothills|KTK -1 Woodfall Primus|MMA -1 Woodland Cemetery|ISD +1 Woodfall Primus|UMA +1 Woodland Cemetery|DOM 1 Wrath of God|EMA 1 Wretched Confluence 1 Wurmcoil Engine|SOM @@ -598,6 +598,6 @@ Name=MTGO Legacy Cube January 2016 (600 cards) 1 Yavimaya Coast|ORI 1 Yavimaya Elder|VMA 1 Yosei, the Morning Star|MMA -1 Young Pyromancer|EMA +1 Young Pyromancer|UMA 1 Zealous Conscripts|MM3 1 Zulaport Cutthroat|A25 diff --git a/forge-gui/res/cube/MTGO Legacy Cube January 2017 (600 cards).dck b/forge-gui/res/cube/MTGO Legacy Cube January 2017 (600 cards).dck index 02ebfd237eb..ea2ebd894af 100644 --- a/forge-gui/res/cube/MTGO Legacy Cube January 2017 (600 cards).dck +++ b/forge-gui/res/cube/MTGO Legacy Cube January 2017 (600 cards).dck @@ -12,7 +12,7 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Ajani, Caller of the Pride|M14 1 Anafenza, Kin-Tree Spirit|DTK 1 Ancestral Vision|IMA -1 Ancient Tomb|VMA +1 Ancient Tomb|UMA 1 Angel of Invention|KLD 1 Angel of Serenity|RTR 1 Anger of the Gods|IMA @@ -34,7 +34,7 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Avenger of Zendikar|WWK 1 Badlands|VMA 1 Baleful Strix|EMA -1 Banefire|MM2 +1 Banefire|M19 1 Baneslayer Angel|M11 1 Banisher Priest|M14 1 Banishing Light|JOU @@ -45,7 +45,7 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Beetleback Chief|EMA 1 Birds of Paradise|M12 1 Birthing Pod|NPH -1 Bitterblossom|MM2 +1 Bitterblossom|UMA 1 Blade Splicer|MM3 1 Blood Artist|EMA 1 Blood Crypt|RTR @@ -65,15 +65,15 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Brimaz, King of Oreskos|BNG 1 Brimstone Volley|CNS 1 Bruna, the Fading Light|EMN -1 Buried Alive|ODY +1 Buried Alive|UMA 1 Burst Lightning|MM2 1 Careful Consideration|MMA 1 Careful Study|ODY 1 Catacomb Sifter|BFZ 1 Cathartic Reunion|KLD -1 Celestial Colonnade|WWK +1 Celestial Colonnade|UMA 1 Chain Lightning|EMA -1 Chainer's Edict|TOR +1 Chainer's Edict|UMA 1 Chameleon Colossus|MOR 1 Champion of the Parish|ISD 1 Chandra, Fire of Kaladesh|ORI @@ -83,9 +83,9 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Chandra's Phoenix|M14 1 Char|RAV 1 Chord of Calling|M15 -1 Chromatic Lantern|RTR +1 Chromatic Lantern|GRN 1 City of Brass|MMA -1 Clifftop Retreat|ISD +1 Clifftop Retreat|DOM 1 Cloudgoat Ranger|MMA 1 Collective Brutality|EMN 1 Collective Defiance|EMN @@ -100,7 +100,7 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Courser of Kruphix|A25 1 Crater's Claws|KTK 1 Craterhoof Behemoth|MM3 -1 Creeping Tar Pit|WWK +1 Creeping Tar Pit|UMA 1 Crux of Fate|FRF 1 Cryptic Command|IMA 1 Cultivate|A25 @@ -121,7 +121,7 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Deranged Hermit|VMA 1 Desecration Demon|MM3 1 Devil's Play|ISD -1 Devoted Druid|SHM +1 Devoted Druid|UMA 1 Disfigure|A25 1 Dismember|MM2 1 Dismiss|TPR @@ -144,7 +144,7 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Dualcaster Mage|EMA 1 Dungeon Geists|DKA 1 Duplicant|EMA -1 Duress|IMA +1 Duress|M19 1 Duskwatch Recruiter|SOI 1 Edric, Spymaster of Trest|VMA 1 Elder Deep-Fiend|EMN @@ -159,24 +159,24 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Elvish Mystic|M15 1 Emeria Angel|IMA 1 Emrakul, the Promised End|EMN -1 Entomb|EMA +1 Entomb|UMA 1 Entreat the Angels|MM3 1 Erebos, God of the Dead|THS -1 Eternal Witness|MMA +1 Eternal Witness|UMA 1 Ever After|SOI 1 Exhume|USG 1 Explore|MM3 1 Exquisite Firecraft|ORI 1 Fact or Fiction|EMA -1 Faith's Fetters|EMA +1 Faith's Fetters|UMA 1 Falkenrath Gorger|SOI 1 Far // Away|DGM 1 Farseek|M13 -1 Fauna Shaman|M11 +1 Fauna Shaman|UMA 1 Fertile Ground|LRW -1 Fiend Hunter|A25 +1 Fiend Hunter|UMA 1 Fiery Confluence -1 Fire // Ice|APC +1 Fire // Ice|UMA 1 Firebolt|EMA 1 Firefist Striker|GTC 1 Flame Slash|ROE @@ -192,9 +192,9 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Frost Titan|M12 1 Future Sight|EMA 1 Fyndhorn Elves|VMA -1 Gaddock Teeg|LRW +1 Gaddock Teeg|UMA 1 Gaea's Cradle|USG -1 Gamble|EMA +1 Gamble|UMA 1 Garruk Relentless|ISD 1 Garruk Wildspeaker|M11 1 Garruk, Apex Predator|M15 @@ -208,12 +208,12 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Gideon, Ally of Zendikar|BFZ 1 Gideon Jura|M12 1 Gifts Ungiven|MM3 -1 Gilded Lotus|M13 +1 Gilded Lotus|DOM 1 Gilt-Leaf Winnower|ORI 1 Gisela, the Broken Blade|EMN 1 Gitaxian Probe|NPH 1 Glacial Fortress|XLN -1 Glen Elendra Archmage|MMA +1 Glen Elendra Archmage|UMA 1 Glorious Anthem|10E 1 Go for the Throat|MBS 1 Goblin Bombardment|TPR @@ -240,7 +240,7 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Hero of Bladehold|MBS 1 Hero's Downfall|THS 1 Hidden Dragonslayer|DTK -1 Hinterland Harbor|ISD +1 Hinterland Harbor|DOM 1 Hissing Quagmire|OGW 1 Honor of the Pure|M12 1 Hordeling Outburst|A25 @@ -258,7 +258,7 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Ire Shaman|A25 1 Isamaru, Hound of Konda|CHK 1 Isochron Scepter|EMA -1 Isolated Chapel|ISD +1 Isolated Chapel|DOM 1 Izzet Charm|MM3 1 Jace Beleren|M11 1 Jace, Architect of Thought|RTR @@ -270,7 +270,7 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Kalitas, Traitor of Ghet|OGW 1 Kami of Ancient Law|MM2 1 Karmic Guide|EMA -1 Karn Liberated|MM2 +1 Karn Liberated|UMA 1 Keiga, the Tide Star|MMA 1 Keranos, God of Storms|JOU 1 Kiki-Jiki, Mirror Breaker|IMA @@ -278,8 +278,8 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Kiora, the Crashing Wave|BNG 1 Kiora's Follower|BNG 1 Kira, Great Glass-Spinner|MMA -1 Kitchen Finks|MMA -1 Kodama's Reach|MMA +1 Kitchen Finks|UMA +1 Kodama's Reach|UMA 1 Kokusho, the Evening Star|MMA 1 Kolaghan's Command|DTK 1 Koth of the Hammer|SOM @@ -287,15 +287,15 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Kytheon, Hero of Akros|ORI 1 Land Tax|4ED 1 Languish|ORI -1 Lavaclaw Reaches|WWK +1 Lavaclaw Reaches|UMA 1 Legacy's Allure|TMP 1 Leonin Relic-Warder|MBS 1 Lightning Bolt|A25 1 Lightning Greaves|MRD 1 Lightning Helix|IMA 1 Lightning Mauler|AVR -1 Lightning Strike|XLN -1 Liliana of the Veil|MM3 +1 Lightning Strike|M19 +1 Liliana of the Veil|UMA 1 Liliana Vess|M15 1 Liliana, Heretical Healer|ORI 1 Liliana, the Last Hope|EMN @@ -303,12 +303,12 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Linvala, Keeper of Silence|MM3 1 Linvala, the Preserver|OGW 1 Living Death|A25 -1 Llanowar Elves|EMA +1 Llanowar Elves|DOM 1 Looter il-Kor|TSP 1 Lotus Cobra|IMA 1 Loxodon Warhammer|10E 1 Lumbering Falls|BFZ -1 Maelstrom Pulse|MMA +1 Maelstrom Pulse|UMA 1 Magma Jet|MM3 1 Magus of the Will 1 Makeshift Mannequin|LRW @@ -324,7 +324,7 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Master of the Wild Hunt|A25 1 Master of Waves|THS 1 Meloku the Clouded Mirror|MMA -1 Mentor of the Meek|ISD +1 Mentor of the Meek|M19 1 Merfolk Looter|A25 1 Mimic Vat|SOM 1 Mindslaver|SOM @@ -356,7 +356,7 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Nissa, Vastwood Seer|ORI 1 Nissa, Voice of Zendikar|OGW 1 Nissa, Worldwaker|M15 -1 Noble Hierarch|MM2 +1 Noble Hierarch|UMA 1 Noxious Gearhulk|KLD 1 Nykthos, Shrine to Nyx|THS 1 Oath of Nissa|OGW @@ -374,7 +374,7 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Oust|ROE 1 Outpost Siege|FRF 1 Overgrown Battlement|IMA -1 Overgrown Tomb|RTR +1 Overgrown Tomb|GRN 1 Pack Rat|RTR 1 Pact of Negation|A25 1 Panharmonicon|KLD @@ -405,7 +405,7 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Pyroclasm|A25 1 Qasali Pridemage|ARB 1 Quarantine Field|BFZ -1 Raging Ravine|WWK +1 Raging Ravine|UMA 1 Raise the Alarm|EMA 1 Rakdos's Return|RTR 1 Ral Zarek|DGM @@ -415,9 +415,9 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Ratchet Bomb|M14 1 Ravages of War|PTK 1 Read the Bones|ORI -1 Reanimate|TPR +1 Reanimate|UMA 1 Reckless Bushwhacker|OGW -1 Reclamation Sage|M15 +1 Reclamation Sage|M19 1 Recruiter of the Guard 1 Recurring Nightmare|TPR 1 Reflecting Pool|CNS @@ -429,7 +429,7 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Remove Soul|10E 1 Repeal|IMA 1 Restoration Angel|IMA -1 Reveillark|MMA +1 Reveillark|UMA 1 Rift Bolt|IMA 1 Riftwing Cloudskate|MMA 1 Rishadan Port|A25 @@ -437,7 +437,7 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Rofellos, Llanowar Emissary|VMA 1 Rootbound Crag|XLN 1 Rune-Scarred Demon|IMA -1 Sacred Foundry|GTC +1 Sacred Foundry|GRN 1 Sakura-Tribe Elder|CNS 1 Sarkhan, the Dragonspeaker|KTK 1 Savannah|VMA @@ -464,15 +464,15 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Shardless Agent|EMA 1 Shelldock Isle|LRW 1 Sheoldred, Whispering One|IMA -1 Shriekmaw|LRW +1 Shriekmaw|UMA 1 Sidisi, Undead Vizier|DTK -1 Siege-Gang Commander|EMA +1 Siege-Gang Commander|DOM 1 Silverblade Paladin|AVR 1 Skinrender|SOM 1 Slagstorm|MBS 1 Slaughter Pact|MMA 1 Smuggler's Copter|KLD -1 Snapcaster Mage|MM3 +1 Snapcaster Mage|UMA 1 Soldier of the Pantheon|THS 1 Solemn Simulacrum|M12 1 Song of the Dryads @@ -488,8 +488,8 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Sphinx's Revelation|MM3 1 Splinter Twin|MM2 1 Staggershock|IMA -1 Steam Vents|RTR -1 Stirring Wildwood|WWK +1 Steam Vents|GRN +1 Stirring Wildwood|UMA 1 Stoke the Flames|M15 1 Stomping Ground|GTC 1 Stormbreath Dragon|THS @@ -498,8 +498,8 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Stroke of Genius|VMA 1 Stromkirk Noble|ISD 1 Student of Warfare|ROE -1 Sublime Archangel|M13 -1 Sulfur Falls|ISD +1 Sublime Archangel|UMA +1 Sulfur Falls|DOM 1 Summoning Trap|MM3 1 Sun Titan|M12 1 Sundering Titan|A25 @@ -514,11 +514,11 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Talrand, Sky Summoner|M13 1 Tamiyo, the Moon Sage|AVR 1 Tangle Wire|NMS -1 Tarmogoyf|MM3 +1 Tarmogoyf|UMA 1 Tasigur, the Golden Fang|FRF 1 Tectonic Edge|WWK 1 Teferi, Mage of Zhalfir|IMA -1 Temple Garden|RTR +1 Temple Garden|GRN 1 Temple of Abandon|THS 1 Temple of Deceit|THS 1 Temple of Enlightenment|BNG @@ -555,7 +555,7 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Ugin, the Spirit Dragon|FRF 1 Ulamog, the Ceaseless Hunger|BFZ 1 Ultimate Price|DTK -1 Unburial Rites|MM3 +1 Unburial Rites|UMA 1 Underground Sea|VMA 1 Underworld Connections|RTR 1 Unexpectedly Absent|EMA @@ -579,7 +579,7 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Wall of Omens|EMA 1 Wandering Fumarole|OGW 1 Wasteland|EMA -1 Watery Grave|GTC +1 Watery Grave|GRN 1 Westvale Abbey|SOI 1 Wharf Infiltrator|EMN 1 Whip of Erebos|THS @@ -590,13 +590,13 @@ Name=MTGO Legacy Cube January 2017 (600 cards) 1 Wolfir Silverheart|AVR 1 Wood Elves|9ED 1 Wooded Foothills|KTK -1 Woodfall Primus|MMA -1 Woodland Cemetery|ISD +1 Woodfall Primus|UMA +1 Woodland Cemetery|DOM 1 Wrath of God|EMA 1 Wretched Confluence 1 Wurmcoil Engine|SOM 1 Xenagos, the Reveler|THS 1 Yavimaya Elder|VMA 1 Yosei, the Morning Star|MMA -1 Young Pyromancer|EMA +1 Young Pyromancer|UMA 1 Zealous Conscripts|MM3 diff --git a/forge-gui/res/cube/MTGO Legacy Cube March 2015 (600 cards).dck b/forge-gui/res/cube/MTGO Legacy Cube March 2015 (600 cards).dck index e18948de762..55179d25450 100644 --- a/forge-gui/res/cube/MTGO Legacy Cube March 2015 (600 cards).dck +++ b/forge-gui/res/cube/MTGO Legacy Cube March 2015 (600 cards).dck @@ -12,7 +12,7 @@ Name=MTGO Legacy Cube March 2015 (600 cards) 1 Ajani, Caller of the Pride|M14 1 Akroma's Vengeance|A25 1 Ancestral Vision|IMA -1 Ancient Tomb|VMA +1 Ancient Tomb|UMA 1 Angel of Serenity|RTR 1 Angelic Destiny|M12 1 Anger of the Gods|IMA @@ -34,7 +34,7 @@ Name=MTGO Legacy Cube March 2015 (600 cards) 1 Avenger of Zendikar|WWK 1 Badlands|VMA 1 Baleful Strix|EMA -1 Banefire|MM2 +1 Banefire|M19 1 Baneslayer Angel|M11 1 Banisher Priest|M14 1 Banishing Light|JOU @@ -48,7 +48,7 @@ Name=MTGO Legacy Cube March 2015 (600 cards) 1 Bident of Thassa|A25 1 Birds of Paradise|M12 1 Birthing Pod|NPH -1 Bitterblossom|MM2 +1 Bitterblossom|UMA 1 Blade of the Bloodchief|ZEN 1 Blade Splicer|MM3 1 Blood Artist|EMA @@ -73,13 +73,13 @@ Name=MTGO Legacy Cube March 2015 (600 cards) 1 Brimaz, King of Oreskos|BNG 1 Brimstone Volley|CNS 1 Brushland|10E -1 Buried Alive|ODY +1 Buried Alive|UMA 1 Burst Lightning|MM2 1 Call of the Herd|MM3 1 Captivating Vampire|M11 1 Caves of Koilos|ORI 1 Chain Lightning|EMA -1 Chainer's Edict|TOR +1 Chainer's Edict|UMA 1 Chameleon Colossus|MOR 1 Champion of the Parish|ISD 1 Chandra Nalaar|M11 @@ -88,10 +88,10 @@ Name=MTGO Legacy Cube March 2015 (600 cards) 1 Char|RAV 1 Chasm Skulker|M15 1 Chord of Calling|M15 -1 Chromatic Lantern|RTR +1 Chromatic Lantern|GRN 1 Chrome Mox|EMA 1 City of Brass|MMA -1 Clifftop Retreat|ISD +1 Clifftop Retreat|DOM 1 Cloudgoat Ranger|MMA 1 Coalition Relic|A25 1 Compulsive Research|MM3 @@ -129,7 +129,7 @@ Name=MTGO Legacy Cube March 2015 (600 cards) 1 Devil's Play|ISD 1 Diabolic Servitude|USG 1 Dictate of Heliod|JOU -1 Dig Through Time|KTK +1 Dig Through Time|UMA 1 Disciple of Bolas|M13 1 Disfigure|A25 1 Dismember|MM2 @@ -147,7 +147,7 @@ Name=MTGO Legacy Cube March 2015 (600 cards) 1 Dualcaster Mage|EMA 1 Dungeon Geists|DKA 1 Duplicant|EMA -1 Duress|IMA +1 Duress|M19 1 Edric, Spymaster of Trest|VMA 1 Eight-and-a-Half-Tails|EMA 1 Electrolyze|IMA @@ -160,26 +160,26 @@ Name=MTGO Legacy Cube March 2015 (600 cards) 1 Elves of Deep Shadow|RAV 1 Elvish Mystic|M15 1 Emeria Angel|IMA -1 Emrakul, the Aeons Torn|MM2 +1 Emrakul, the Aeons Torn|UMA 1 Empty the Warrens|MMA -1 Entomb|EMA +1 Entomb|UMA 1 Entreat the Angels|MM3 -1 Essence Scatter|AKH +1 Essence Scatter|M19 1 Eternal Dragon|VMA -1 Eternal Witness|MMA +1 Eternal Witness|UMA 1 Everflowing Chalice|MM2 1 Exalted Angel|ONS 1 Exhume|USG 1 Explore|MM3 1 Fact or Fiction|EMA -1 Faith's Fetters|EMA +1 Faith's Fetters|UMA 1 Falkenrath Aristocrat|MM3 1 Far // Away|DGM 1 Farseek|M13 -1 Fauna Shaman|M11 +1 Fauna Shaman|UMA 1 Fertile Ground|LRW -1 Fiend Hunter|A25 -1 Fire // Ice|APC +1 Fiend Hunter|UMA +1 Fire // Ice|UMA 1 Firebolt|EMA 1 Fires of Yavimaya|VMA 1 Firefist Striker|GTC @@ -190,7 +190,7 @@ Name=MTGO Legacy Cube March 2015 (600 cards) 1 Flickerwisp|MM3 1 Flooded Strand|KTK 1 Forbid|TPR -1 Forbidden Alchemy|MM3 +1 Forbidden Alchemy|UMA 1 Force of Will|EMA 1 Force Spike|7ED 1 Form of the Dragon|9ED @@ -215,10 +215,10 @@ Name=MTGO Legacy Cube March 2015 (600 cards) 1 Ghor-Clan Rampager|MM3 1 Gideon Jura|M12 1 Gifts Ungiven|MM3 -1 Gilded Lotus|M13 +1 Gilded Lotus|DOM 1 Gitaxian Probe|NPH 1 Glacial Fortress|XLN -1 Glen Elendra Archmage|MMA +1 Glen Elendra Archmage|UMA 1 Glorious Anthem|10E 1 Go for the Throat|MBS 1 Goblin Bombardment|TPR @@ -249,7 +249,7 @@ Name=MTGO Legacy Cube March 2015 (600 cards) 1 Hero of Bladehold|MBS 1 Hero of Oxid Ridge|MBS 1 Hero's Downfall|THS -1 Hinterland Harbor|ISD +1 Hinterland Harbor|DOM 1 Honor of the Pure|M12 1 Hordeling Outburst|A25 1 Hornet Queen|M15 @@ -264,7 +264,7 @@ Name=MTGO Legacy Cube March 2015 (600 cards) 1 Into the Roil|ZEN 1 Isamaru, Hound of Konda|CHK 1 Isochron Scepter|EMA -1 Isolated Chapel|ISD +1 Isolated Chapel|DOM 1 Izzet Charm|MM3 1 Jace Beleren|M11 1 Jace, Architect of Thought|RTR @@ -275,7 +275,7 @@ Name=MTGO Legacy Cube March 2015 (600 cards) 1 Kalastria Highborn|WWK 1 Kami of Ancient Law|MM2 1 Karmic Guide|EMA -1 Karn Liberated|MM2 +1 Karn Liberated|UMA 1 Karplusan Forest|10E 1 Keiga, the Tide Star|MMA 1 Keranos, God of Storms|JOU @@ -284,36 +284,36 @@ Name=MTGO Legacy Cube March 2015 (600 cards) 1 Kiora, the Crashing Wave|BNG 1 Kiora's Follower|BNG 1 Kira, Great Glass-Spinner|MMA -1 Kitchen Finks|MMA -1 Kodama's Reach|MMA +1 Kitchen Finks|UMA +1 Kodama's Reach|UMA 1 Kokusho, the Evening Star|MMA 1 Kolaghan, the Storm's Fury|FRF 1 Kor Skyfisher|MM3 1 Koth of the Hammer|SOM -1 Kozilek, Butcher of Truth|MM2 +1 Kozilek, Butcher of Truth|UMA 1 Krenko's Command|M13 1 Land Tax|4ED 1 Legacy's Allure|TMP 1 Leonin Relic-Warder|MBS -1 Life from the Loam|MMA +1 Life from the Loam|UMA 1 Lightning Bolt|A25 1 Lightning Greaves|MRD 1 Lightning Helix|IMA 1 Lightning Mauler|AVR -1 Lightning Strike|XLN -1 Liliana of the Veil|MM3 +1 Lightning Strike|M19 +1 Liliana of the Veil|UMA 1 Liliana Vess|M15 1 Lingering Souls|MM3 1 Linvala, Keeper of Silence|MM3 1 Living Death|A25 -1 Llanowar Elves|EMA +1 Llanowar Elves|DOM 1 Llanowar Wastes|ORI 1 Looter il-Kor|TSP 1 Lotleth Troll|RTR 1 Lotus Cobra|IMA 1 Loxodon Warhammer|10E 1 Madcap Skills|MM3 -1 Maelstrom Pulse|MMA +1 Maelstrom Pulse|UMA 1 Magma Jet|MM3 1 Malakir Bloodwitch|ZEN 1 Malicious Affliction|EMA @@ -329,7 +329,7 @@ Name=MTGO Legacy Cube March 2015 (600 cards) 1 Master of the Wild Hunt|A25 1 Master of Waves|THS 1 Meloku the Clouded Mirror|MMA -1 Mentor of the Meek|ISD +1 Mentor of the Meek|M19 1 Merfolk Looter|A25 1 Mind Stone|IMA 1 Mirari's Wake|CNS @@ -361,7 +361,7 @@ Name=MTGO Legacy Cube March 2015 (600 cards) 1 Night's Whisper|EMA 1 Nightveil Specter|GTC 1 Nissa, Worldwaker|M15 -1 Noble Hierarch|MM2 +1 Noble Hierarch|UMA 1 Nykthos, Shrine to Nyx|THS 1 Oblivion Ring|MM2 1 Obstinate Baloth|IMA @@ -374,7 +374,7 @@ Name=MTGO Legacy Cube March 2015 (600 cards) 1 Oracle of Mul Daya|ZEN 1 Oust|ROE 1 Overgrown Battlement|IMA -1 Overgrown Tomb|RTR +1 Overgrown Tomb|GRN 1 Overrun|TPR 1 Pack Rat|RTR 1 Pact of Negation|A25 @@ -411,8 +411,8 @@ Name=MTGO Legacy Cube March 2015 (600 cards) 1 Ranger of Eos|MM3 1 Ratchet Bomb|M14 1 Ravages of War|PTK -1 Reanimate|TPR -1 Reclamation Sage|M15 +1 Reanimate|UMA +1 Reclamation Sage|M19 1 Recurring Nightmare|TPR 1 Reflecting Pool|CNS 1 Regrowth|A25 @@ -421,7 +421,7 @@ Name=MTGO Legacy Cube March 2015 (600 cards) 1 Remove Soul|10E 1 Repeal|IMA 1 Restoration Angel|IMA -1 Reveillark|MMA +1 Reveillark|UMA 1 Rift Bolt|IMA 1 Riftwing Cloudskate|MMA 1 Riptide Laboratory|ONS @@ -429,14 +429,14 @@ Name=MTGO Legacy Cube March 2015 (600 cards) 1 River Boa|ZEN 1 Rofellos, Llanowar Emissary|VMA 1 Rootbound Crag|XLN -1 Sacred Foundry|GTC +1 Sacred Foundry|GRN 1 Sakashima's Student 1 Sakura-Tribe Elder|CNS 1 Sangromancer|MBS 1 Sarkhan, the Dragonspeaker|KTK 1 Savannah|VMA 1 Scalding Tarn|MM3 -1 Scapeshift|MOR +1 Scapeshift|M19 1 Scavenging Ooze|MM3 1 Scorched Rusalka|MM3 1 Scrubland|VMA @@ -452,8 +452,8 @@ Name=MTGO Legacy Cube March 2015 (600 cards) 1 Shardless Agent|EMA 1 Sheoldred, Whispering One|IMA 1 Shivan Reef|ORI -1 Shriekmaw|LRW -1 Siege-Gang Commander|EMA +1 Shriekmaw|UMA +1 Siege-Gang Commander|DOM 1 Silverblade Paladin|AVR 1 Sin Collector|MM3 1 Sinkhole|EMA @@ -461,7 +461,7 @@ Name=MTGO Legacy Cube March 2015 (600 cards) 1 Skullcrack|GTC 1 Slagstorm|MBS 1 Slaughter Pact|MMA -1 Snapcaster Mage|MM3 +1 Snapcaster Mage|UMA 1 Sneak Attack|EMA 1 Soldier of the Pantheon|THS 1 Solemn Simulacrum|M12 @@ -479,7 +479,7 @@ Name=MTGO Legacy Cube March 2015 (600 cards) 1 Spikeshot Elder|MM2 1 Splinter Twin|MM2 1 Staggershock|IMA -1 Steam Vents|RTR +1 Steam Vents|GRN 1 Steppe Lynx|ZEN 1 Stoke the Flames|M15 1 Stomping Ground|GTC @@ -488,8 +488,8 @@ Name=MTGO Legacy Cube March 2015 (600 cards) 1 Stromkirk Captain|DKA 1 Stromkirk Noble|ISD 1 Student of Warfare|ROE -1 Sublime Archangel|M13 -1 Sulfur Falls|ISD +1 Sublime Archangel|UMA +1 Sulfur Falls|DOM 1 Sulfurous Springs|10E 1 Summoning Trap|MM3 1 Sun Titan|M12 @@ -503,11 +503,11 @@ Name=MTGO Legacy Cube March 2015 (600 cards) 1 Talrand, Sky Summoner|M13 1 Tamiyo, the Moon Sage|AVR 1 Tangle Wire|NMS -1 Tarmogoyf|MM3 +1 Tarmogoyf|UMA 1 Taurean Mauler|MOR 1 Tectonic Edge|WWK 1 Teferi, Mage of Zhalfir|IMA -1 Temple Garden|RTR +1 Temple Garden|GRN 1 Temple of Abandon|THS 1 Temple of Deceit|THS 1 Temple of Enlightenment|BNG @@ -525,11 +525,11 @@ Name=MTGO Legacy Cube March 2015 (600 cards) 1 Thalia, Guardian of Thraben|A25 1 Thassa, God of the Sea|THS 1 Thieving Magpie|10E -1 Think Twice|ISD +1 Think Twice|UMA 1 Thoughtseize|IMA 1 Thragtusk|MM3 1 Thran Dynamo|IMA -1 Through the Breach|CHK +1 Through the Breach|UMA 1 Thrun, the Last Troll|MBS 1 Thundermaw Hellkite|IMA 1 Tidehollow Sculler|MMA @@ -543,9 +543,9 @@ Name=MTGO Legacy Cube March 2015 (600 cards) 1 Trygon Predator|EMA 1 Tundra|VMA 1 Ugin, the Spirit Dragon|FRF -1 Ulamog, the Infinite Gyre|MM2 +1 Ulamog, the Infinite Gyre|UMA 1 Ultimate Price|DTK -1 Unburial Rites|MM3 +1 Unburial Rites|UMA 1 Underground River|10E 1 Underground Sea|VMA 1 Underworld Connections|RTR @@ -561,7 +561,7 @@ Name=MTGO Legacy Cube March 2015 (600 cards) 1 Vampire Nocturnus|M13 1 Vedalken Shackles|MMA 1 Vendilion Clique|A25 -1 Vengevine|ROE +1 Vengevine|UMA 1 Venser, Shaper Savant|MM3 1 Venser, the Sojourner|SOM 1 Verdant Catacombs|MM3 @@ -576,21 +576,21 @@ Name=MTGO Legacy Cube March 2015 (600 cards) 1 Wall of Omens|EMA 1 Wall of Roots|IMA 1 Warden of the First Tree|FRF -1 Warleader's Helix|DGM +1 Warleader's Helix|UMA 1 Waterfront Bouncer|VMA -1 Watery Grave|GTC +1 Watery Grave|GRN 1 Whip of Erebos|THS 1 Whisperwood Elemental|FRF -1 Wickerbough Elder|EVE -1 Wild Mongrel|VMA +1 Wickerbough Elder|UMA +1 Wild Mongrel|UMA 1 Windbrisk Heights|LRW 1 Windswept Heath|KTK 1 Winter Orb|EMA 1 Wolfir Silverheart|AVR 1 Wood Elves|9ED 1 Wooded Foothills|KTK -1 Woodfall Primus|MMA -1 Woodland Cemetery|ISD +1 Woodfall Primus|UMA +1 Woodland Cemetery|DOM 1 Worn Powerstone|EMA 1 Wrath of God|EMA 1 Wurmcoil Engine|SOM @@ -599,5 +599,5 @@ Name=MTGO Legacy Cube March 2015 (600 cards) 1 Yavimaya Coast|ORI 1 Yavimaya Elder|VMA 1 Yosei, the Morning Star|MMA -1 Young Pyromancer|EMA +1 Young Pyromancer|UMA 1 Zealous Conscripts|MM3 diff --git a/forge-gui/res/cube/MTGO Legacy Cube September 2015 (600 cards).dck b/forge-gui/res/cube/MTGO Legacy Cube September 2015 (600 cards).dck index 14f731eba0e..72252cb8edc 100644 --- a/forge-gui/res/cube/MTGO Legacy Cube September 2015 (600 cards).dck +++ b/forge-gui/res/cube/MTGO Legacy Cube September 2015 (600 cards).dck @@ -16,7 +16,7 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Ajani, Caller of the Pride|M14 1 Akroma's Vengeance|A25 1 Ancestral Vision|IMA -1 Ancient Tomb|VMA +1 Ancient Tomb|UMA 1 Angel of Serenity|RTR 1 Angelic Destiny|M12 1 Anger of the Gods|IMA @@ -38,7 +38,7 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Avenger of Zendikar|WWK 1 Badlands|VMA 1 Baleful Strix|EMA -1 Banefire|MM2 +1 Banefire|M19 1 Baneslayer Angel|M11 1 Banisher Priest|M14 1 Banishing Light|JOU @@ -51,7 +51,7 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Beetleback Chief|EMA 1 Birds of Paradise|M12 1 Birthing Pod|NPH -1 Bitterblossom|MM2 +1 Bitterblossom|UMA 1 Blade Splicer|MM3 1 Blood Crypt|RTR 1 Bloodbraid Elf|EMA @@ -70,13 +70,13 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Brimaz, King of Oreskos|BNG 1 Brimstone Volley|CNS 1 Brushland|10E -1 Buried Alive|ODY +1 Buried Alive|UMA 1 Burst Lightning|MM2 1 Careful Study|ODY 1 Carrion Feeder|EMA 1 Caves of Koilos|ORI 1 Chain Lightning|EMA -1 Chainer's Edict|TOR +1 Chainer's Edict|UMA 1 Chameleon Colossus|MOR 1 Champion of the Parish|ISD 1 Chandra Nalaar|M11 @@ -86,10 +86,10 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Char|RAV 1 Chasm Skulker|M15 1 Chord of Calling|M15 -1 Chromatic Lantern|RTR +1 Chromatic Lantern|GRN 1 Chrome Mox|EMA 1 City of Brass|MMA -1 Clifftop Retreat|ISD +1 Clifftop Retreat|DOM 1 Cloudgoat Ranger|MMA 1 Coalition Relic|A25 1 Collected Company|DTK @@ -114,7 +114,7 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Damnation|MM3 1 Dance of the Dead|ICE 1 Dark Confidant|MM2 -1 Dark Depths|CSP +1 Dark Depths|UMA 1 Dark Petition|ORI 1 Dark Ritual|A25 1 Day of Judgment|M12 @@ -130,7 +130,7 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Devil's Play|ISD 1 Diabolic Servitude|USG 1 Dictate of Heliod|JOU -1 Dig Through Time|KTK +1 Dig Through Time|UMA 1 Disciple of Bolas|M13 1 Disfigure|A25 1 Dismember|MM2 @@ -154,7 +154,7 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Dualcaster Mage|EMA 1 Dungeon Geists|DKA 1 Duplicant|EMA -1 Duress|IMA +1 Duress|M19 1 Edric, Spymaster of Trest|VMA 1 Eight-and-a-Half-Tails|EMA 1 Electrolyze|IMA @@ -167,14 +167,14 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Elves of Deep Shadow|RAV 1 Elvish Mystic|M15 1 Emeria Angel|IMA -1 Emrakul, the Aeons Torn|MM2 -1 Entomb|EMA +1 Emrakul, the Aeons Torn|UMA +1 Entomb|UMA 1 Entreat the Angels|MM3 1 Erebos, God of the Dead|THS 1 Erebos's Titan|ORI -1 Essence Scatter|AKH +1 Essence Scatter|M19 1 Eternal Dragon|VMA -1 Eternal Witness|MMA +1 Eternal Witness|UMA 1 Eureka|VMA 1 Everflowing Chalice|MM2 1 Exalted Angel|ONS @@ -182,13 +182,13 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Explore|MM3 1 Exquisite Firecraft|ORI 1 Fact or Fiction|EMA -1 Faith's Fetters|EMA +1 Faith's Fetters|UMA 1 Falkenrath Aristocrat|MM3 1 Farseek|M13 -1 Fauna Shaman|M11 +1 Fauna Shaman|UMA 1 Fertile Ground|LRW -1 Fiend Hunter|A25 -1 Fire // Ice|APC +1 Fiend Hunter|UMA +1 Fire // Ice|UMA 1 Firebolt|EMA 1 Firefist Striker|GTC 1 Flame Slash|ROE @@ -198,7 +198,7 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Flickerwisp|MM3 1 Flooded Strand|KTK 1 Forbid|TPR -1 Forbidden Alchemy|MM3 +1 Forbidden Alchemy|UMA 1 Force of Will|EMA 1 Force Spike|7ED 1 Forked Bolt|ROE @@ -222,11 +222,11 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Ghor-Clan Rampager|MM3 1 Gideon Jura|M12 1 Gifts Ungiven|MM3 -1 Gilded Lotus|M13 +1 Gilded Lotus|DOM 1 Gilt-Leaf Winnower|ORI 1 Gitaxian Probe|NPH 1 Glacial Fortress|XLN -1 Glen Elendra Archmage|MMA +1 Glen Elendra Archmage|UMA 1 Glorious Anthem|10E 1 Go for the Throat|MBS 1 Goblin Bushwhacker|ZEN @@ -255,7 +255,7 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Hero of Bladehold|MBS 1 Hero's Downfall|THS 1 Hidden Dragonslayer|DTK -1 Hinterland Harbor|ISD +1 Hinterland Harbor|DOM 1 Honor of the Pure|M12 1 Hordeling Outburst|A25 1 Hornet Queen|M15 @@ -272,7 +272,7 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Ire Shaman|A25 1 Isamaru, Hound of Konda|CHK 1 Isochron Scepter|EMA -1 Isolated Chapel|ISD +1 Isolated Chapel|DOM 1 Izzet Charm|MM3 1 Jace Beleren|M11 1 Jace, Architect of Thought|RTR @@ -283,7 +283,7 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Journey to Nowhere|ZEN 1 Kami of Ancient Law|MM2 1 Karmic Guide|EMA -1 Karn Liberated|MM2 +1 Karn Liberated|UMA 1 Karplusan Forest|10E 1 Keiga, the Tide Star|MMA 1 Keranos, God of Storms|JOU @@ -292,12 +292,12 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Kiora, the Crashing Wave|BNG 1 Kiora's Follower|BNG 1 Kira, Great Glass-Spinner|MMA -1 Kitchen Finks|MMA -1 Kodama's Reach|MMA +1 Kitchen Finks|UMA +1 Kodama's Reach|UMA 1 Kokusho, the Evening Star|MMA 1 Kor Skyfisher|MM3 1 Koth of the Hammer|SOM -1 Kozilek, Butcher of Truth|MM2 +1 Kozilek, Butcher of Truth|UMA 1 Krenko's Command|M13 1 Kytheon, Hero of Akros|ORI 1 Land Tax|4ED @@ -307,21 +307,21 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Lightning Greaves|MRD 1 Lightning Helix|IMA 1 Lightning Mauler|AVR -1 Lightning Strike|XLN -1 Liliana of the Veil|MM3 +1 Lightning Strike|M19 +1 Liliana of the Veil|UMA 1 Liliana Vess|M15 1 Liliana, Heretical Healer|ORI 1 Lingering Souls|MM3 1 Linvala, Keeper of Silence|MM3 1 Living Death|A25 -1 Llanowar Elves|EMA +1 Llanowar Elves|DOM 1 Llanowar Mentor|FUT 1 Llanowar Wastes|ORI 1 Looter il-Kor|TSP 1 Lotleth Troll|RTR 1 Lotus Cobra|IMA 1 Loxodon Warhammer|10E -1 Maelstrom Pulse|MMA +1 Maelstrom Pulse|UMA 1 Magma Jet|MM3 1 Makeshift Mannequin|LRW 1 Malicious Affliction|EMA @@ -337,7 +337,7 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Master of the Wild Hunt|A25 1 Master of Waves|THS 1 Meloku the Clouded Mirror|MMA -1 Mentor of the Meek|ISD +1 Mentor of the Meek|M19 1 Merfolk Looter|A25 1 Midnight Banshee|MM2 1 Mind Stone|IMA @@ -368,7 +368,7 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Nightveil Specter|GTC 1 Nissa, Vastwood Seer|ORI 1 Nissa, Worldwaker|M15 -1 Noble Hierarch|MM2 +1 Noble Hierarch|UMA 1 Nykthos, Shrine to Nyx|THS 1 Oblivion Ring|MM2 1 Obstinate Baloth|IMA @@ -382,7 +382,7 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Oust|ROE 1 Outpost Siege|FRF 1 Overgrown Battlement|IMA -1 Overgrown Tomb|RTR +1 Overgrown Tomb|GRN 1 Overrun|TPR 1 Pack Rat|RTR 1 Pact of Negation|A25 @@ -421,8 +421,8 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Ratchet Bomb|M14 1 Ravages of War|PTK 1 Read the Bones|ORI -1 Reanimate|TPR -1 Reclamation Sage|M15 +1 Reanimate|UMA +1 Reclamation Sage|M19 1 Recurring Nightmare|TPR 1 Reflecting Pool|CNS 1 Regrowth|A25 @@ -430,7 +430,7 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Remove Soul|10E 1 Repeal|IMA 1 Restoration Angel|IMA -1 Reveillark|MMA +1 Reveillark|UMA 1 Rift Bolt|IMA 1 Riftwing Cloudskate|MMA 1 Rishadan Port|A25 @@ -439,7 +439,7 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Rootbound Crag|XLN 1 Rotting Rats|CFX 1 Rune-Scarred Demon|IMA -1 Sacred Foundry|GTC +1 Sacred Foundry|GRN 1 Sakura-Tribe Elder|CNS 1 Sarkhan, the Dragonspeaker|KTK 1 Savannah|VMA @@ -461,16 +461,16 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Sheoldred, Whispering One|IMA 1 Shivan Reef|ORI 1 Show and Tell|USG -1 Shriekmaw|LRW +1 Shriekmaw|UMA 1 Sidisi, Undead Vizier|DTK -1 Siege-Gang Commander|EMA +1 Siege-Gang Commander|DOM 1 Silverblade Paladin|AVR 1 Sin Collector|MM3 1 Skinrender|SOM 1 Skullcrack|GTC 1 Slagstorm|MBS 1 Slaughter Pact|MMA -1 Snapcaster Mage|MM3 +1 Snapcaster Mage|UMA 1 Sneak Attack|EMA 1 Soldier of the Pantheon|THS 1 Solemn Simulacrum|M12 @@ -488,7 +488,7 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Spikeshot Elder|MM2 1 Splinter Twin|MM2 1 Staggershock|IMA -1 Steam Vents|RTR +1 Steam Vents|GRN 1 Stoke the Flames|M15 1 Stomping Ground|GTC 1 Stormbreath Dragon|THS @@ -497,8 +497,8 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Stroke of Genius|VMA 1 Stromkirk Noble|ISD 1 Student of Warfare|ROE -1 Sublime Archangel|M13 -1 Sulfur Falls|ISD +1 Sublime Archangel|UMA +1 Sulfur Falls|DOM 1 Sulfurous Springs|10E 1 Summoning Trap|MM3 1 Sun Titan|M12 @@ -513,11 +513,11 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Talrand, Sky Summoner|M13 1 Tamiyo, the Moon Sage|AVR 1 Tangle Wire|NMS -1 Tarmogoyf|MM3 +1 Tarmogoyf|UMA 1 Tasigur, the Golden Fang|FRF 1 Tectonic Edge|WWK 1 Teferi, Mage of Zhalfir|IMA -1 Temple Garden|RTR +1 Temple Garden|GRN 1 Temple of Abandon|THS 1 Temple of Deceit|THS 1 Temple of Enlightenment|BNG @@ -534,11 +534,11 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Terminus|MM3 1 Thalia, Guardian of Thraben|A25 1 Thassa, God of the Sea|THS -1 Thespian's Stage|GTC +1 Thespian's Stage|UMA 1 Thoughtseize|IMA 1 Thragtusk|MM3 1 Thran Dynamo|IMA -1 Through the Breach|CHK +1 Through the Breach|UMA 1 Thrun, the Last Troll|MBS 1 Thunderbreak Regent|DTK 1 Thundermaw Hellkite|IMA @@ -551,9 +551,9 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Trygon Predator|EMA 1 Tundra|VMA 1 Ugin, the Spirit Dragon|FRF -1 Ulamog, the Infinite Gyre|MM2 +1 Ulamog, the Infinite Gyre|UMA 1 Ultimate Price|DTK -1 Unburial Rites|MM3 +1 Unburial Rites|UMA 1 Underground River|10E 1 Underground Sea|VMA 1 Underworld Connections|RTR @@ -564,7 +564,7 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Vampire Nighthawk|MM3 1 Vedalken Shackles|MMA 1 Vendilion Clique|A25 -1 Vengevine|ROE +1 Vengevine|UMA 1 Venser, Shaper Savant|MM3 1 Venser, the Sojourner|SOM 1 Verdant Catacombs|MM3 @@ -577,21 +577,21 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Wall of Blossoms|TPR 1 Wall of Omens|EMA 1 Wall of Roots|IMA -1 Warleader's Helix|DGM +1 Warleader's Helix|UMA 1 Waterfront Bouncer|VMA -1 Watery Grave|GTC +1 Watery Grave|GRN 1 Whip of Erebos|THS 1 Whisperwood Elemental|FRF -1 Wild Mongrel|VMA +1 Wild Mongrel|UMA 1 Windbrisk Heights|LRW 1 Windswept Heath|KTK 1 Winter Orb|EMA 1 Wolfir Silverheart|AVR 1 Wood Elves|9ED 1 Wooded Foothills|KTK -1 Woodfall Primus|MMA +1 Woodfall Primus|UMA 1 Woodland Bellower|ORI -1 Woodland Cemetery|ISD +1 Woodland Cemetery|DOM 1 Worn Powerstone|EMA 1 Wrath of God|EMA 1 Wurmcoil Engine|SOM @@ -599,5 +599,5 @@ Name=MTGO Legacy Cube September 2015 (600 cards) 1 Yavimaya Coast|ORI 1 Yavimaya Elder|VMA 1 Yosei, the Morning Star|MMA -1 Young Pyromancer|EMA +1 Young Pyromancer|UMA 1 Zealous Conscripts|MM3 diff --git a/forge-gui/res/cube/MTGO Legacy Cube September 2016 (600 cards).dck b/forge-gui/res/cube/MTGO Legacy Cube September 2016 (600 cards).dck index 665dc98a5f0..cc790e74f12 100644 --- a/forge-gui/res/cube/MTGO Legacy Cube September 2016 (600 cards).dck +++ b/forge-gui/res/cube/MTGO Legacy Cube September 2016 (600 cards).dck @@ -13,7 +13,7 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Ajani, Caller of the Pride|M14 1 Anafenza, Kin-Tree Spirit|DTK 1 Ancestral Vision|IMA -1 Ancient Tomb|VMA +1 Ancient Tomb|UMA 1 Angel of Serenity|RTR 1 Anger of the Gods|IMA 1 Anguished Unmaking|SOI @@ -34,7 +34,7 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Avenger of Zendikar|WWK 1 Badlands|VMA 1 Baleful Strix|EMA -1 Banefire|MM2 +1 Banefire|M19 1 Baneslayer Angel|M11 1 Banisher Priest|M14 1 Banishing Light|JOU @@ -45,7 +45,7 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Beetleback Chief|EMA 1 Birds of Paradise|M12 1 Birthing Pod|NPH -1 Bitterblossom|MM2 +1 Bitterblossom|UMA 1 Blade Splicer|MM3 1 Blood Artist|EMA 1 Blood Crypt|RTR @@ -64,14 +64,14 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Brimaz, King of Oreskos|BNG 1 Brimstone Volley|CNS 1 Bruna, the Fading Light|EMN -1 Buried Alive|ODY +1 Buried Alive|UMA 1 Burst Lightning|MM2 1 Careful Consideration|MMA 1 Careful Study|ODY 1 Catacomb Sifter|BFZ -1 Celestial Colonnade|WWK +1 Celestial Colonnade|UMA 1 Chain Lightning|EMA -1 Chainer's Edict|TOR +1 Chainer's Edict|UMA 1 Chameleon Colossus|MOR 1 Champion of the Parish|ISD 1 Chandra, Fire of Kaladesh|ORI @@ -81,9 +81,9 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Chaos Warp|VMA 1 Char|RAV 1 Chord of Calling|M15 -1 Chromatic Lantern|RTR +1 Chromatic Lantern|GRN 1 City of Brass|MMA -1 Clifftop Retreat|ISD +1 Clifftop Retreat|DOM 1 Cloudgoat Ranger|MMA 1 Collective Brutality|EMN 1 Collective Defiance|EMN @@ -98,7 +98,7 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Courser of Kruphix|A25 1 Crater's Claws|KTK 1 Craterhoof Behemoth|MM3 -1 Creeping Tar Pit|WWK +1 Creeping Tar Pit|UMA 1 Crux of Fate|FRF 1 Cryptic Command|IMA 1 Cultivate|A25 @@ -120,7 +120,7 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Deranged Hermit|VMA 1 Desecration Demon|MM3 1 Devil's Play|ISD -1 Devoted Druid|SHM +1 Devoted Druid|UMA 1 Dictate of Heliod|JOU 1 Disciple of Bolas|M13 1 Disfigure|A25 @@ -145,7 +145,7 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Dualcaster Mage|EMA 1 Dungeon Geists|DKA 1 Duplicant|EMA -1 Duress|IMA +1 Duress|M19 1 Duskwatch Recruiter|SOI 1 Edric, Spymaster of Trest|VMA 1 Elder Deep-Fiend|EMN @@ -161,10 +161,10 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Elvish Mystic|M15 1 Emeria Angel|IMA 1 Emrakul, the Promised End|EMN -1 Entomb|EMA +1 Entomb|UMA 1 Entreat the Angels|MM3 1 Erebos, God of the Dead|THS -1 Eternal Witness|MMA +1 Eternal Witness|UMA 1 Ever After|SOI 1 Evolutionary Leap|ORI 1 Exclude|A25 @@ -172,16 +172,16 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Explore|MM3 1 Exquisite Firecraft|ORI 1 Fact or Fiction|EMA -1 Faith's Fetters|EMA +1 Faith's Fetters|UMA 1 Falkenrath Aristocrat|MM3 1 Falkenrath Gorger|SOI 1 Far // Away|DGM 1 Farseek|M13 -1 Fauna Shaman|M11 +1 Fauna Shaman|UMA 1 Fertile Ground|LRW -1 Fiend Hunter|A25 +1 Fiend Hunter|UMA 1 Fiery Confluence -1 Fire // Ice|APC +1 Fire // Ice|UMA 1 Firebolt|EMA 1 Firefist Striker|GTC 1 Flame Slash|ROE @@ -196,7 +196,7 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Frost Titan|M12 1 Future Sight|EMA 1 Fyndhorn Elves|VMA -1 Gaddock Teeg|LRW +1 Gaddock Teeg|UMA 1 Gaea's Cradle|USG 1 Garruk Relentless|ISD 1 Garruk Wildspeaker|M11 @@ -211,12 +211,12 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Gideon, Ally of Zendikar|BFZ 1 Gideon Jura|M12 1 Gifts Ungiven|MM3 -1 Gilded Lotus|M13 +1 Gilded Lotus|DOM 1 Gilt-Leaf Winnower|ORI 1 Gisela, the Broken Blade|EMN 1 Gitaxian Probe|NPH 1 Glacial Fortress|XLN -1 Glen Elendra Archmage|MMA +1 Glen Elendra Archmage|UMA 1 Glorious Anthem|10E 1 Go for the Throat|MBS 1 Goblin Bombardment|TPR @@ -246,7 +246,7 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Hero of Bladehold|MBS 1 Hero's Downfall|THS 1 Hidden Dragonslayer|DTK -1 Hinterland Harbor|ISD +1 Hinterland Harbor|DOM 1 Hissing Quagmire|OGW 1 Honor of the Pure|M12 1 Hordeling Outburst|A25 @@ -266,7 +266,7 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Ire Shaman|A25 1 Isamaru, Hound of Konda|CHK 1 Isochron Scepter|EMA -1 Isolated Chapel|ISD +1 Isolated Chapel|DOM 1 Izzet Charm|MM3 1 Jace Beleren|M11 1 Jace, Architect of Thought|RTR @@ -278,7 +278,7 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Kalitas, Traitor of Ghet|OGW 1 Kami of Ancient Law|MM2 1 Karmic Guide|EMA -1 Karn Liberated|MM2 +1 Karn Liberated|UMA 1 Keiga, the Tide Star|MMA 1 Keranos, God of Storms|JOU 1 Kiki-Jiki, Mirror Breaker|IMA @@ -286,8 +286,8 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Kiora, the Crashing Wave|BNG 1 Kiora's Follower|BNG 1 Kira, Great Glass-Spinner|MMA -1 Kitchen Finks|MMA -1 Kodama's Reach|MMA +1 Kitchen Finks|UMA +1 Kodama's Reach|UMA 1 Kokusho, the Evening Star|MMA 1 Kor Skyfisher|MM3 1 Koth of the Hammer|SOM @@ -295,15 +295,15 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Kytheon, Hero of Akros|ORI 1 Land Tax|4ED 1 Languish|ORI -1 Lavaclaw Reaches|WWK +1 Lavaclaw Reaches|UMA 1 Legacy's Allure|TMP 1 Leonin Relic-Warder|MBS 1 Lightning Bolt|A25 1 Lightning Greaves|MRD 1 Lightning Helix|IMA 1 Lightning Mauler|AVR -1 Lightning Strike|XLN -1 Liliana of the Veil|MM3 +1 Lightning Strike|M19 +1 Liliana of the Veil|UMA 1 Liliana Vess|M15 1 Liliana, Heretical Healer|ORI 1 Liliana, the Last Hope|EMN @@ -311,12 +311,12 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Linvala, Keeper of Silence|MM3 1 Linvala, the Preserver|OGW 1 Living Death|A25 -1 Llanowar Elves|EMA +1 Llanowar Elves|DOM 1 Looter il-Kor|TSP 1 Lotus Cobra|IMA 1 Loxodon Warhammer|10E 1 Lumbering Falls|BFZ -1 Maelstrom Pulse|MMA +1 Maelstrom Pulse|UMA 1 Magma Jet|MM3 1 Makeshift Mannequin|LRW 1 Malicious Affliction|EMA @@ -331,7 +331,7 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Master of the Wild Hunt|A25 1 Master of Waves|THS 1 Meloku the Clouded Mirror|MMA -1 Mentor of the Meek|ISD +1 Mentor of the Meek|M19 1 Merfolk Looter|A25 1 Mimic Vat|SOM 1 Mindslaver|SOM @@ -364,7 +364,7 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Nissa, Vastwood Seer|ORI 1 Nissa, Voice of Zendikar|OGW 1 Nissa, Worldwaker|M15 -1 Noble Hierarch|MM2 +1 Noble Hierarch|UMA 1 Nykthos, Shrine to Nyx|THS 1 Oath of Nissa|OGW 1 Ob Nixilis Reignited|BFZ @@ -382,7 +382,7 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Oust|ROE 1 Outpost Siege|FRF 1 Overgrown Battlement|IMA -1 Overgrown Tomb|RTR +1 Overgrown Tomb|GRN 1 Pack Rat|RTR 1 Pact of Negation|A25 1 Parallax Wave|VMA @@ -412,7 +412,7 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Pyroclasm|A25 1 Qasali Pridemage|ARB 1 Quarantine Field|BFZ -1 Raging Ravine|WWK +1 Raging Ravine|UMA 1 Raise the Alarm|EMA 1 Rakdos's Return|RTR 1 Ral Zarek|DGM @@ -422,9 +422,9 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Ratchet Bomb|M14 1 Ravages of War|PTK 1 Read the Bones|ORI -1 Reanimate|TPR +1 Reanimate|UMA 1 Reckless Bushwhacker|OGW -1 Reclamation Sage|M15 +1 Reclamation Sage|M19 1 Recurring Nightmare|TPR 1 Reflecting Pool|CNS 1 Reflector Mage|OGW @@ -435,7 +435,7 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Remove Soul|10E 1 Repeal|IMA 1 Restoration Angel|IMA -1 Reveillark|MMA +1 Reveillark|UMA 1 Rift Bolt|IMA 1 Riftwing Cloudskate|MMA 1 Rishadan Port|A25 @@ -443,7 +443,7 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Rofellos, Llanowar Emissary|VMA 1 Rootbound Crag|XLN 1 Rune-Scarred Demon|IMA -1 Sacred Foundry|GTC +1 Sacred Foundry|GRN 1 Sakura-Tribe Elder|CNS 1 Sarkhan, the Dragonspeaker|KTK 1 Savannah|VMA @@ -468,14 +468,14 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Shardless Agent|EMA 1 Shelldock Isle|LRW 1 Sheoldred, Whispering One|IMA -1 Shriekmaw|LRW +1 Shriekmaw|UMA 1 Sidisi, Undead Vizier|DTK -1 Siege-Gang Commander|EMA +1 Siege-Gang Commander|DOM 1 Silverblade Paladin|AVR 1 Skinrender|SOM 1 Slagstorm|MBS 1 Slaughter Pact|MMA -1 Snapcaster Mage|MM3 +1 Snapcaster Mage|UMA 1 Soldier of the Pantheon|THS 1 Solemn Simulacrum|M12 1 Song of the Dryads @@ -491,8 +491,8 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Sphinx's Revelation|MM3 1 Splinter Twin|MM2 1 Staggershock|IMA -1 Steam Vents|RTR -1 Stirring Wildwood|WWK +1 Steam Vents|GRN +1 Stirring Wildwood|UMA 1 Stoke the Flames|M15 1 Stomping Ground|GTC 1 Stormbreath Dragon|THS @@ -501,8 +501,8 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Stroke of Genius|VMA 1 Stromkirk Noble|ISD 1 Student of Warfare|ROE -1 Sublime Archangel|M13 -1 Sulfur Falls|ISD +1 Sublime Archangel|UMA +1 Sulfur Falls|DOM 1 Summoning Trap|MM3 1 Sun Titan|M12 1 Sundering Titan|A25 @@ -517,11 +517,11 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Talrand, Sky Summoner|M13 1 Tamiyo, the Moon Sage|AVR 1 Tangle Wire|NMS -1 Tarmogoyf|MM3 +1 Tarmogoyf|UMA 1 Tasigur, the Golden Fang|FRF 1 Tectonic Edge|WWK 1 Teferi, Mage of Zhalfir|IMA -1 Temple Garden|RTR +1 Temple Garden|GRN 1 Temple of Abandon|THS 1 Temple of Deceit|THS 1 Temple of Enlightenment|BNG @@ -557,7 +557,7 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Ugin, the Spirit Dragon|FRF 1 Ulamog, the Ceaseless Hunger|BFZ 1 Ultimate Price|DTK -1 Unburial Rites|MM3 +1 Unburial Rites|UMA 1 Underground Sea|VMA 1 Underworld Connections|RTR 1 Unexpectedly Absent|EMA @@ -579,7 +579,7 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Wall of Omens|EMA 1 Wandering Fumarole|OGW 1 Wasteland|EMA -1 Watery Grave|GTC +1 Watery Grave|GRN 1 Westvale Abbey|SOI 1 Wharf Infiltrator|EMN 1 Whip of Erebos|THS @@ -590,8 +590,8 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Wolfir Silverheart|AVR 1 Wood Elves|9ED 1 Wooded Foothills|KTK -1 Woodfall Primus|MMA -1 Woodland Cemetery|ISD +1 Woodfall Primus|UMA +1 Woodland Cemetery|DOM 1 Wrath of God|EMA 1 Wretched Confluence 1 Wurmcoil Engine|SOM @@ -599,5 +599,5 @@ Name=MTGO Legacy Cube September 2016 (600 cards) 1 Xiahou Dun, the One-Eyed 1 Yavimaya Elder|VMA 1 Yosei, the Morning Star|MMA -1 Young Pyromancer|EMA +1 Young Pyromancer|UMA 1 Zealous Conscripts|MM3 diff --git a/forge-gui/res/cube/MTGO Vintage Cube 2013.dck b/forge-gui/res/cube/MTGO Vintage Cube 2013.dck index b6296aaf623..9a7cd3887b6 100644 --- a/forge-gui/res/cube/MTGO Vintage Cube 2013.dck +++ b/forge-gui/res/cube/MTGO Vintage Cube 2013.dck @@ -39,7 +39,7 @@ Name=MTGO Vintage Cube 2013 1 Wrath of God|EMA 1 Cloudgoat Ranger|MMA 1 Mirror Entity|MM2 -1 Reveillark|MMA +1 Reveillark|UMA 1 Flickerwisp|MM3 1 Ranger of Eos|MM3 1 Elspeth, Knight-Errant|MMA @@ -58,7 +58,7 @@ Name=MTGO Vintage Cube 2013 1 Spear of Heliod|THS 1 Unexpectedly Absent|EMA 1 Armageddon|A25 -1 Faith's Fetters|EMA +1 Faith's Fetters|UMA 1 Stoneforge Mystic|WWK 1 Linvala, Keeper of Silence|MM3 1 Baneslayer Angel|M11 @@ -71,7 +71,7 @@ Name=MTGO Vintage Cube 2013 1 Loam Lion|WWK 1 Gideon Jura|M12 1 Mana Drain|IMA -1 Frantic Search|VMA +1 Frantic Search|UMA 1 Treachery|UDS 1 Brainstorm|A25 1 Brain Freeze|VMA @@ -80,7 +80,7 @@ Name=MTGO Vintage Cube 2013 1 Sower of Temptation|LRW 1 Wake Thrasher|EVE 1 Consecrated Sphinx|IMA -1 Snapcaster Mage|MM3 +1 Snapcaster Mage|UMA 1 True-Name Nemesis 1 Intuition|TPR 1 Forbid|TPR @@ -91,7 +91,7 @@ Name=MTGO Vintage Cube 2013 1 Gifts Ungiven|MM3 1 Compulsive Research|MM3 1 Riftwing Cloudskate|MMA -1 Glen Elendra Archmage|MMA +1 Glen Elendra Archmage|UMA 1 Inkwell Leviathan|EMA 1 Tinker|ULG 1 Jace, the Mind Sculptor|VMA @@ -140,9 +140,9 @@ Name=MTGO Vintage Cube 2013 1 Miscalculation|ULG 1 Trinket Mage|SOM 1 Recurring Nightmare|TPR -1 Buried Alive|ODY +1 Buried Alive|UMA 1 Tendrils of Agony|VMA -1 Unburial Rites|MM3 +1 Unburial Rites|UMA 1 Mesmeric Fiend|A25 1 Slaughter Pact|MMA 1 Gatekeeper of Malakir|ZEN @@ -167,10 +167,10 @@ Name=MTGO Vintage Cube 2013 1 Toxic Deluge|EMA 1 Vampiric Tutor|EMA 1 Living Death|A25 -1 Reanimate|TPR +1 Reanimate|UMA 1 Bone Shredder|ULG 1 Braids, Cabal Minion|EMA -1 Entomb|EMA +1 Entomb|UMA 1 Putrid Imp|VMA 1 Nezumi Graverobber|CHK 1 Ink-Eyes, Servant of Oni|BOK @@ -178,19 +178,19 @@ Name=MTGO Vintage Cube 2013 1 Plague Sliver|TSP 1 Damnation|MM3 1 Nekrataal|EMA -1 Shriekmaw|LRW -1 Bitterblossom|MM2 -1 Demonic Tutor|VMA +1 Shriekmaw|UMA +1 Bitterblossom|UMA +1 Demonic Tutor|UMA 1 Necropotence|IMA 1 Disfigure|A25 1 Vampire Nighthawk|MM3 1 Guul Draz Assassin|ROE 1 Consuming Vapors|ROE -1 Duress|IMA +1 Duress|M19 1 Skinrender|SOM 1 Dismember|MM2 -1 Diregraf Ghoul|ISD -1 Liliana of the Veil|MM3 +1 Diregraf Ghoul|M19 +1 Liliana of the Veil|UMA 1 Hymn to Tourach|EMA 1 Ultimate Price|DTK 1 Nether Void|LEG @@ -238,7 +238,7 @@ Name=MTGO Vintage Cube 2013 1 Ravenous Baboons|EXO 1 Wildfire|MM2 1 Sneak Attack|EMA -1 Reckless Charge|EMA +1 Reckless Charge|UMA 1 Molten Rain|MM3 1 Char|RAV 1 Tin Street Hooligan|GPT @@ -250,7 +250,7 @@ Name=MTGO Vintage Cube 2013 1 Smash to Smithereens|ORI 1 Hellspark Elemental|CFX 1 Ball Lightning|A25 -1 Siege-Gang Commander|EMA +1 Siege-Gang Commander|DOM 1 Burning of Xinye|VMA 1 Goblin Guide|MM3 1 Searing Blaze|WWK @@ -265,7 +265,7 @@ Name=MTGO Vintage Cube 2013 1 Kird Ape|EMA 1 Brimstone Volley|CNS 1 Devil's Play|ISD -1 Faithless Looting|EMA +1 Faithless Looting|UMA 1 Orcish Lumberjack|VMA 1 Zealous Conscripts|MM3 1 Mizzium Mortars|MM3 @@ -289,10 +289,10 @@ Name=MTGO Vintage Cube 2013 1 Wall of Blossoms|TPR 1 Restock|M15 1 Tooth and Nail|MMA -1 Eternal Witness|MMA +1 Eternal Witness|UMA 1 Primal Command|MM3 1 Stunted Growth|ICE -1 Wickerbough Elder|EVE +1 Wickerbough Elder|UMA 1 Master of the Wild Hunt|A25 1 Harmonize|MM3 1 Terastodon|CNS @@ -310,26 +310,26 @@ Name=MTGO Vintage Cube 2013 1 Genesis|VMA 1 Plow Under|8ED 1 Heartbeat of Spring|CHK -1 Woodfall Primus|MMA -1 Noble Hierarch|MM2 +1 Woodfall Primus|UMA +1 Noble Hierarch|UMA 1 Channel|IMA 1 Oracle of Mul Daya|ZEN 1 Arbor Elf|A25 1 Joraga Treespeaker|ROE 1 Awakening Zone|ROE -1 Vengevine|ROE -1 Fauna Shaman|M11 +1 Vengevine|UMA +1 Fauna Shaman|UMA 1 Genesis Wave|IMA 1 Thrun, the Last Troll|MBS 1 Beast Within|NPH -1 Naturalize|RIX +1 Naturalize|M19 1 Garruk Relentless|ISD 1 Ulvenwald Tracker|MM3 1 Polukranos, World Eater|THS 1 Rofellos, Llanowar Emissary|VMA 1 Elves of Deep Shadow|RAV 1 Thelonite Hermit|TSP -1 Tarmogoyf|MM3 +1 Tarmogoyf|UMA 1 Wild Nacatl|ALA 1 Avenger of Zendikar|WWK 1 Call of the Herd|MM3 @@ -337,7 +337,7 @@ Name=MTGO Vintage Cube 2013 1 Green Sun's Zenith|EMA 1 Acidic Slime|M13 1 Garruk, Primal Hunter|M13 -1 Llanowar Elves|EMA +1 Llanowar Elves|DOM 1 Regrowth|A25 1 Fyndhorn Elves|VMA 1 Thragtusk|MM3 @@ -371,7 +371,7 @@ Name=MTGO Vintage Cube 2013 1 Rishadan Port|A25 1 Scalding Tarn|MM3 1 Shivan Reef|ORI -1 Steam Vents|RTR +1 Steam Vents|GRN 1 Strip Mine|VMA 1 Taiga|VMA 1 Thawing Glaciers|VMA @@ -381,7 +381,7 @@ Name=MTGO Vintage Cube 2013 1 Volcanic Island|VMA 1 Windbrisk Heights|LRW 1 Wooded Foothills|KTK -1 Ancient Tomb|VMA +1 Ancient Tomb|UMA 1 Azorius Chancery|IMA 1 Badlands|VMA 1 Arid Mesa|MM3 @@ -391,8 +391,8 @@ Name=MTGO Vintage Cube 2013 1 Teetering Peaks|ZEN 1 Underground Sea|VMA 1 Bloodstained Mire|KTK -1 Watery Grave|GTC -1 Sacred Foundry|GTC +1 Watery Grave|GRN +1 Sacred Foundry|GRN 1 Stomping Ground|GTC 1 Godless Shrine|GTC 1 Breeding Pool|GTC @@ -405,9 +405,9 @@ Name=MTGO Vintage Cube 2013 1 Selesnya Sanctuary|IMA 1 Rakdos Carnarium|IMA 1 Simic Growth Chamber|IMA -1 Karakas|EMA -1 Temple Garden|RTR -1 Overgrown Tomb|RTR +1 Karakas|UMA +1 Temple Garden|GRN +1 Overgrown Tomb|GRN 1 Volrath's Stronghold|TPR 1 Gaea's Cradle|USG 1 Tolarian Academy|VMA @@ -422,7 +422,7 @@ Name=MTGO Vintage Cube 2013 1 Lightning Helix|IMA 1 Electrolyze|IMA 1 Grand Arbiter Augustin IV|MMA -1 Kitchen Finks|MMA +1 Kitchen Finks|UMA 1 Stillmoon Cavalier|EVE 1 Tidehollow Sculler|MMA 1 Nicol Bolas, Planeswalker|M13 @@ -436,7 +436,7 @@ Name=MTGO Vintage Cube 2013 1 Domri Rade|MM3 1 Mystic Snake|A25 1 Firemane Angel|IMA -1 Angel of Despair|GPT +1 Angel of Despair|UMA 1 Trygon Predator|EMA 1 Simic Sky Swallower|IMA 1 Boggart Ram-Gang|SHM @@ -459,7 +459,7 @@ Name=MTGO Vintage Cube 2013 1 Shadowmage Infiltrator|A25 1 Ajani Vengeant|ALA 1 Vindicate|A25 -1 Maelstrom Pulse|MMA +1 Maelstrom Pulse|UMA 1 Tezzeret, Agent of Bolas|MBS 1 Sorin, Lord of Innistrad|DKA 1 Baleful Strix|EMA @@ -468,10 +468,10 @@ Name=MTGO Vintage Cube 2013 1 Voice of Resurgence|MM3 1 Null Rod|VMA 1 Cursed Scroll|TPR -1 All Is Dust|MM2 -1 Emrakul, the Aeons Torn|MM2 -1 Kozilek, Butcher of Truth|MM2 -1 Ulamog, the Infinite Gyre|MM2 +1 All Is Dust|UMA +1 Emrakul, the Aeons Torn|UMA +1 Kozilek, Butcher of Truth|UMA +1 Ulamog, the Infinite Gyre|UMA 1 Shrine of Burning Rage|NPH 1 Batterskull|NPH 1 Lion's Eye Diamond|MIR @@ -496,7 +496,7 @@ Name=MTGO Vintage Cube 2013 1 Sword of Feast and Famine|MBS 1 Sword of War and Peace|NPH 1 Chrome Mox|EMA -1 Gilded Lotus|M13 +1 Gilded Lotus|DOM 1 Sword of Light and Shadow|MMA 1 Razormane Masticore|10E 1 Pentad Prism|5DN @@ -525,7 +525,7 @@ Name=MTGO Vintage Cube 2013 1 Lodestone Golem|MM2 1 Lotus Bloom|MMA 1 Mana Crypt|EMA -1 Mana Vault|VMA +1 Mana Vault|UMA 1 Selesnya Signet|MM3 1 Metalworker|UDS 1 Scroll Rack|TMP @@ -536,8 +536,8 @@ Name=MTGO Vintage Cube 2013 1 Sword of Fire and Ice|MMA 1 Skullclamp|VMA 1 Vedalken Shackles|MMA -1 Crucible of Worlds|10E +1 Crucible of Worlds|M19 1 Sensei's Divining Top|EMA 1 Umezawa's Jitte|BOK 1 Manriki-Gusari|SOK -1 Karn Liberated|MM2 +1 Karn Liberated|UMA diff --git a/forge-gui/res/cube/MTGO Vintage Cube 2014.dck b/forge-gui/res/cube/MTGO Vintage Cube 2014.dck index f5b40e2bd25..6adae9c7d3b 100644 --- a/forge-gui/res/cube/MTGO Vintage Cube 2014.dck +++ b/forge-gui/res/cube/MTGO Vintage Cube 2014.dck @@ -13,7 +13,7 @@ Name=MTGO Vintage Cube 2014 1 Ancestral Recall|VMA 1 Ancestral Vision|IMA 1 Ancient Grudge|MM3 -1 Ancient Tomb|VMA +1 Ancient Tomb|UMA 1 Angel of Serenity|RTR 1 Animate Dead|EMA 1 Arbor Elf|A25 @@ -43,7 +43,7 @@ Name=MTGO Vintage Cube 2014 1 Beast Within|NPH 1 Birds of Paradise|M12 1 Birthing Pod|NPH -1 Bitterblossom|MM2 +1 Bitterblossom|UMA 1 Black Lotus|VMA 1 Blade Splicer|MM3 1 Blightsteel Colossus|MBS @@ -68,7 +68,7 @@ Name=MTGO Vintage Cube 2014 1 Brimaz, King of Oreskos|BNG 1 Brimstone Volley|CNS 1 Brushland|10E -1 Buried Alive|ODY +1 Buried Alive|UMA 1 Burning of Xinye|VMA 1 Burning-Tree Emissary|MM3 1 Burst Lightning|MM2 @@ -80,19 +80,19 @@ Name=MTGO Vintage Cube 2014 1 Char|RAV 1 Channel|IMA 1 Chrome Mox|EMA -1 Clifftop Retreat|ISD +1 Clifftop Retreat|DOM 1 Cloudgoat Ranger|MMA 1 Coalition Relic|A25 1 Compulsive Research|MM3 1 Consecrated Sphinx|IMA -1 Containment Priest +1 Containment Priest|UMA 1 Control Magic|EMA 1 Council's Judgment|CNS 1 Counterspell|A25 1 Courser of Kruphix|A25 1 Crater's Claws|KTK 1 Craterhoof Behemoth|MM3 -1 Crucible of Worlds|10E +1 Crucible of Worlds|M19 1 Cryptic Command|IMA 1 Cursed Scroll|TPR 1 Dack Fayden|EMA @@ -104,13 +104,13 @@ Name=MTGO Vintage Cube 2014 1 Daze|EMA 1 Deceiver Exarch|NPH 1 Delver of Secrets|ISD -1 Demonic Tutor|VMA +1 Demonic Tutor|UMA 1 Deranged Hermit|VMA 1 Desecration Demon|MM3 1 Detention Sphere|RTR 1 Diabolic Edict|A25 1 Dimir Signet|MM3 -1 Diregraf Ghoul|ISD +1 Diregraf Ghoul|M19 1 Disenchant|A25 1 Disfigure|A25 1 Dismember|MM2 @@ -120,7 +120,7 @@ Name=MTGO Vintage Cube 2014 1 Drowned Catacomb|XLN 1 Dualcaster Mage|EMA 1 Dungeon Geists|DKA -1 Duress|IMA +1 Duress|M19 1 Edric, Spymaster of Trest|VMA 1 Eidolon of the Great Revel|A25 1 Electrolyze|IMA @@ -133,20 +133,20 @@ Name=MTGO Vintage Cube 2014 1 Elvish Mystic|M15 1 Emeria Angel|IMA 1 Empty the Warrens|MMA -1 Emrakul, the Aeons Torn|MM2 +1 Emrakul, the Aeons Torn|UMA 1 Enlightened Tutor|EMA -1 Entomb|EMA -1 Eternal Witness|MMA +1 Entomb|UMA +1 Eternal Witness|UMA 1 Eureka|VMA 1 Everflowing Chalice|MM2 1 Exalted Angel|ONS 1 Fact or Fiction|EMA -1 Faith's Fetters|EMA -1 Faithless Looting|EMA +1 Faith's Fetters|UMA +1 Faithless Looting|UMA 1 Falkenrath Aristocrat|MM3 -1 Fauna Shaman|M11 +1 Fauna Shaman|UMA 1 Figure of Destiny|MMA -1 Fire // Ice|APC +1 Fire // Ice|UMA 1 Fireblast|VMA 1 Firebolt|EMA 1 Firedrinker Satyr|THS @@ -155,12 +155,12 @@ Name=MTGO Vintage Cube 2014 1 Flooded Strand|KTK 1 Force of Will|EMA 1 Force Spike|7ED -1 Frantic Search|VMA +1 Frantic Search|UMA 1 Frenzied Goblin|A25 1 Freyalise, Llanowar's Fury 1 Frost Titan|M12 1 Fyndhorn Elves|VMA -1 Gaddock Teeg|LRW +1 Gaddock Teeg|UMA 1 Gaea's Cradle|USG 1 Garruk Relentless|ISD 1 Garruk Wildspeaker|M11 @@ -175,11 +175,11 @@ Name=MTGO Vintage Cube 2014 1 Ghitu Encampment|10E 1 Gideon Jura|M12 1 Gifts Ungiven|MM3 -1 Gilded Lotus|M13 +1 Gilded Lotus|DOM 1 Glacial Fortress|XLN -1 Glen Elendra Archmage|MMA +1 Glen Elendra Archmage|UMA 1 Go for the Throat|MBS -1 Goblin Electromancer|MM3 +1 Goblin Electromancer|GRN 1 Goblin Guide|MM3 1 Goblin Vandal|WTH 1 Goblin Welder|ULG @@ -195,7 +195,7 @@ Name=MTGO Vintage Cube 2014 1 Grim Monolith|ULG 1 Griselbrand|MM3 1 Gruul Signet|MM3 -1 Guttersnipe|IMA +1 Guttersnipe|M19 1 Hallowed Fountain|RTR 1 Hallowed Spiritkeeper 1 Harmonize|MM3 @@ -204,7 +204,7 @@ Name=MTGO Vintage Cube 2014 1 Hero of Bladehold|MBS 1 Hero of Oxid Ridge|MBS 1 Hero's Downfall|THS -1 Hinterland Harbor|ISD +1 Hinterland Harbor|DOM 1 Honor of the Pure|M12 1 Huntmaster of the Fells|DKA 1 Hymn to Tourach|EMA @@ -221,7 +221,7 @@ Name=MTGO Vintage Cube 2014 1 Iona, Shield of Emeria|MM2 1 Isamaru, Hound of Konda|CHK 1 Isochron Scepter|EMA -1 Isolated Chapel|ISD +1 Isolated Chapel|DOM 1 Izzet Signet|MM3 1 Jace Beleren|M11 1 Jace, Architect of Thought|RTR @@ -230,47 +230,47 @@ Name=MTGO Vintage Cube 2014 1 Joraga Treespeaker|ROE 1 Journey to Nowhere|ZEN 1 Kami of Ancient Law|MM2 -1 Karakas|EMA +1 Karakas|UMA 1 Kargan Dragonlord|ROE -1 Karn Liberated|MM2 +1 Karn Liberated|UMA 1 Karplusan Forest|10E 1 Kiki-Jiki, Mirror Breaker|IMA 1 Kiora, the Crashing Wave|BNG 1 Kiora's Follower|BNG 1 Kira, Great Glass-Spinner|MMA -1 Kitchen Finks|MMA +1 Kitchen Finks|UMA 1 Koth of the Hammer|SOM -1 Kozilek, Butcher of Truth|MM2 +1 Kozilek, Butcher of Truth|UMA 1 Krosan Grip|MMA 1 Land Tax|4ED 1 Leonin Arbiter|SOM 1 Leonin Relic-Warder|MBS 1 Library of Alexandria|VMA -1 Life from the Loam|MMA +1 Life from the Loam|UMA 1 Lifebane Zombie|M14 1 Lightning Bolt|A25 1 Lightning Greaves|MRD 1 Lightning Helix|IMA 1 Lightning Mauler|AVR -1 Lightning Strike|XLN -1 Liliana of the Veil|MM3 +1 Lightning Strike|M19 +1 Liliana of the Veil|UMA 1 Lingering Souls|MM3 1 Lion's Eye Diamond|MIR 1 Living Death|A25 -1 Llanowar Elves|EMA +1 Llanowar Elves|DOM 1 Llanowar Wastes|ORI 1 Lodestone Golem|MM2 1 Looter il-Kor|TSP 1 Lotus Bloom|MMA 1 Lotus Cobra|IMA -1 Maelstrom Pulse|MMA +1 Maelstrom Pulse|UMA 1 Magma Jet|MM3 1 Magus of the Moon|IMA 1 Mana Crypt|EMA 1 Mana Drain|IMA 1 Mana Leak|IMA 1 Mana Tithe|PLC -1 Mana Vault|VMA +1 Mana Vault|UMA 1 Manic Vandal|M12 1 Manriki-Gusari|SOK 1 Marsh Flats|MM3 @@ -319,7 +319,7 @@ Name=MTGO Vintage Cube 2014 1 Nicol Bolas, Planeswalker|M13 1 Nightveil Specter|GTC 1 Nissa, Worldwaker|M15 -1 Noble Hierarch|MM2 +1 Noble Hierarch|UMA 1 Null Rod|VMA 1 Oath of Druids|TPR 1 Oblivion Ring|MM2 @@ -330,12 +330,12 @@ Name=MTGO Vintage Cube 2014 1 Opposition|7ED 1 Oracle of Mul Daya|ZEN 1 Orzhov Signet|MM3 -1 Overgrown Tomb|RTR +1 Overgrown Tomb|GRN 1 Pack Rat|RTR 1 Palinchron|VMA 1 Parallax Wave|VMA 1 Path to Exile|MM3 -1 Pattern of Rebirth|UDS +1 Pattern of Rebirth|UMA 1 Pentad Prism|5DN 1 Pernicious Deed|A25 1 Pestermite|MMA @@ -364,21 +364,21 @@ Name=MTGO Vintage Cube 2014 1 Rancor|A25 1 Ranger of Eos|MM3 1 Ravages of War|PTK -1 Reanimate|TPR -1 Reclamation Sage|M15 +1 Reanimate|UMA +1 Reclamation Sage|M19 1 Recurring Nightmare|TPR 1 Regrowth|A25 1 Relic of Progenitus|EMA 1 Remand|MM2 1 Repeal|IMA 1 Restoration Angel|IMA -1 Reveillark|MMA +1 Reveillark|UMA 1 Rift Bolt|IMA 1 Riftwing Cloudskate|MMA 1 Rishadan Port|A25 1 Rofellos, Llanowar Emissary|VMA 1 Rootbound Crag|XLN -1 Sacred Foundry|GTC +1 Sacred Foundry|GRN 1 Sakura-Tribe Elder|CNS 1 Sarcomancy|TPR 1 Sarkhan, the Dragonspeaker|KTK @@ -400,9 +400,9 @@ Name=MTGO Vintage Cube 2014 1 Sheoldred, Whispering One|IMA 1 Shivan Reef|ORI 1 Show and Tell|USG -1 Shriekmaw|LRW +1 Shriekmaw|UMA 1 Shrine of Burning Rage|NPH -1 Siege-Gang Commander|EMA +1 Siege-Gang Commander|DOM 1 Silverblade Paladin|AVR 1 Simic Signet|MM3 1 Sin Collector|MM3 @@ -410,7 +410,7 @@ Name=MTGO Vintage Cube 2014 1 Skullclamp|VMA 1 Smash to Smithereens|ORI 1 Smokestack|VMA -1 Snapcaster Mage|MM3 +1 Snapcaster Mage|UMA 1 Sneak Attack|EMA 1 Sol Ring|VMA 1 Soldier of the Pantheon|THS @@ -426,7 +426,7 @@ Name=MTGO Vintage Cube 2014 1 Spikeshot Elder|MM2 1 Spirit of the Labyrinth|BNG 1 Splinter Twin|MM2 -1 Steam Vents|RTR +1 Steam Vents|GRN 1 Stomping Ground|GTC 1 Stoneforge Mystic|WWK 1 Stormbreath Dragon|THS @@ -434,7 +434,7 @@ Name=MTGO Vintage Cube 2014 1 Stromkirk Noble|ISD 1 Student of Warfare|ROE 1 Stunted Growth|ICE -1 Sulfur Falls|ISD +1 Sulfur Falls|DOM 1 Sulfuric Vortex|EMA 1 Sulfurous Springs|10E 1 Sun Titan|M12 @@ -454,9 +454,9 @@ Name=MTGO Vintage Cube 2014 1 Talrand, Sky Summoner|M13 1 Tamiyo, the Moon Sage|AVR 1 Tangle Wire|NMS -1 Tarmogoyf|MM3 +1 Tarmogoyf|UMA 1 Teetering Peaks|ZEN -1 Temple Garden|RTR +1 Temple Garden|GRN 1 Tendrils of Agony|VMA 1 Terastodon|CNS 1 Terminate|MM3 @@ -470,7 +470,7 @@ Name=MTGO Vintage Cube 2014 1 Thoughtseize|IMA 1 Thragtusk|MM3 1 Thran Dynamo|IMA -1 Through the Breach|CHK +1 Through the Breach|UMA 1 Thrun, the Last Troll|MBS 1 Thundermaw Hellkite|IMA 1 Tidehollow Sculler|MMA @@ -492,10 +492,10 @@ Name=MTGO Vintage Cube 2014 1 Trygon Predator|EMA 1 Tundra|VMA 1 Turnabout|VMA -1 Ulamog, the Infinite Gyre|MM2 +1 Ulamog, the Infinite Gyre|UMA 1 Ultimate Price|DTK 1 Umezawa's Jitte|BOK -1 Unburial Rites|MM3 +1 Unburial Rites|UMA 1 Underground River|10E 1 Underground Sea|VMA 1 Unexpectedly Absent|EMA @@ -506,7 +506,7 @@ Name=MTGO Vintage Cube 2014 1 Vampiric Tutor|EMA 1 Vedalken Shackles|MMA 1 Vendilion Clique|A25 -1 Vengevine|ROE +1 Vengevine|UMA 1 Venser, Shaper Savant|MM3 1 Venser, the Sojourner|SOM 1 Verdant Catacombs|MM3 @@ -520,7 +520,7 @@ Name=MTGO Vintage Cube 2014 1 Wall of Omens|EMA 1 Wall of Roots|IMA 1 Wasteland|EMA -1 Watery Grave|GTC +1 Watery Grave|GRN 1 Weathered Wayfarer|9ED 1 Wheel of Fortune|VMA 1 Wildfire|MM2 @@ -529,8 +529,8 @@ Name=MTGO Vintage Cube 2014 1 Winter Orb|EMA 1 Wolfir Silverheart|AVR 1 Wooded Foothills|KTK -1 Woodfall Primus|MMA -1 Woodland Cemetery|ISD +1 Woodfall Primus|UMA +1 Woodland Cemetery|DOM 1 Worn Powerstone|EMA 1 Wrath of God|EMA 1 Wurmcoil Engine|SOM @@ -539,5 +539,5 @@ Name=MTGO Vintage Cube 2014 1 Yavimaya Elder|VMA 1 Yawgmoth's Bargain|UDS 1 Yawgmoth's Will|USG -1 Young Pyromancer|EMA +1 Young Pyromancer|UMA 1 Zealous Conscripts|MM3 diff --git a/forge-gui/res/cube/MTGO Vintage Cube 2015.dck b/forge-gui/res/cube/MTGO Vintage Cube 2015.dck index cb1238def76..6e0056b0635 100644 --- a/forge-gui/res/cube/MTGO Vintage Cube 2015.dck +++ b/forge-gui/res/cube/MTGO Vintage Cube 2015.dck @@ -12,7 +12,7 @@ Name=MTGO Vintage Cube 2015 1 Ancestral Recall|VMA 1 Ancestral Vision|IMA 1 Ancient Grudge|MM3 -1 Ancient Tomb|VMA +1 Ancient Tomb|UMA 1 Angel of Serenity|RTR 1 Animate Dead|EMA 1 Arbor Elf|A25 @@ -40,7 +40,7 @@ Name=MTGO Vintage Cube 2015 1 Beast Within|NPH 1 Birds of Paradise|M12 1 Birthing Pod|NPH -1 Bitterblossom|MM2 +1 Bitterblossom|UMA 1 Black Lotus|VMA 1 Blade Splicer|MM3 1 Blightsteel Colossus|MBS @@ -63,7 +63,7 @@ Name=MTGO Vintage Cube 2015 1 Bribery|8ED 1 Brimaz, King of Oreskos|BNG 1 Brimstone Volley|CNS -1 Buried Alive|ODY +1 Buried Alive|UMA 1 Burning of Xinye|VMA 1 Burst Lightning|MM2 1 Caves of Koilos|ORI @@ -73,7 +73,7 @@ Name=MTGO Vintage Cube 2015 1 Char|RAV 1 Channel|IMA 1 Chrome Mox|EMA -1 Clifftop Retreat|ISD +1 Clifftop Retreat|DOM 1 Cloudgoat Ranger|MMA 1 Coalition Relic|A25 1 Compulsive Research|MM3 @@ -85,7 +85,7 @@ Name=MTGO Vintage Cube 2015 1 Courser of Kruphix|A25 1 Crater's Claws|KTK 1 Craterhoof Behemoth|MM3 -1 Crucible of Worlds|10E +1 Crucible of Worlds|M19 1 Cryptic Command|IMA 1 Dack Fayden|EMA 1 Damnation|MM3 @@ -97,11 +97,11 @@ Name=MTGO Vintage Cube 2015 1 Deathrite Shaman|EMA 1 Deceiver Exarch|NPH 1 Delver of Secrets|ISD -1 Demonic Tutor|VMA +1 Demonic Tutor|UMA 1 Deranged Hermit|VMA 1 Desecration Demon|MM3 1 Diabolic Edict|A25 -1 Dig Through Time|KTK +1 Dig Through Time|UMA 1 Dimir Signet|MM3 1 Disenchant|A25 1 Disfigure|A25 @@ -115,7 +115,7 @@ Name=MTGO Vintage Cube 2015 1 Drowned Catacomb|XLN 1 Dualcaster Mage|EMA 1 Duplicant|EMA -1 Duress|IMA +1 Duress|M19 1 Edric, Spymaster of Trest|VMA 1 Eidolon of the Great Revel|A25 1 Electrolyze|IMA @@ -126,21 +126,21 @@ Name=MTGO Vintage Cube 2015 1 Elvish Mystic|M15 1 Emeria Angel|IMA 1 Empty the Warrens|MMA -1 Emrakul, the Aeons Torn|MM2 +1 Emrakul, the Aeons Torn|UMA 1 Enlightened Tutor|EMA -1 Entomb|EMA -1 Eternal Witness|MMA +1 Entomb|UMA +1 Eternal Witness|UMA 1 Eureka|VMA 1 Everflowing Chalice|MM2 1 Exalted Angel|ONS 1 Fact or Fiction|EMA -1 Faith's Fetters|EMA -1 Faithless Looting|EMA +1 Faith's Fetters|UMA +1 Faithless Looting|UMA 1 Fastbond|VMA -1 Fauna Shaman|M11 -1 Fiend Hunter|A25 +1 Fauna Shaman|UMA +1 Fiend Hunter|UMA 1 Figure of Destiny|MMA -1 Fire // Ice|APC +1 Fire // Ice|UMA 1 Fireblast|VMA 1 Firebolt|EMA 1 Firedrinker Satyr|THS @@ -150,11 +150,11 @@ Name=MTGO Vintage Cube 2015 1 Flooded Strand|KTK 1 Force of Will|EMA 1 Force Spike|7ED -1 Frantic Search|VMA +1 Frantic Search|UMA 1 Freyalise, Llanowar's Fury 1 Frost Titan|M12 1 Fyndhorn Elves|VMA -1 Gaddock Teeg|LRW +1 Gaddock Teeg|UMA 1 Gaea's Cradle|USG 1 Garruk Relentless|ISD 1 Garruk Wildspeaker|M11 @@ -167,10 +167,10 @@ Name=MTGO Vintage Cube 2015 1 Geralf's Messenger|DKA 1 Gideon Jura|M12 1 Gifts Ungiven|MM3 -1 Gilded Lotus|M13 +1 Gilded Lotus|DOM 1 Gitaxian Probe|NPH 1 Glacial Fortress|XLN -1 Glen Elendra Archmage|MMA +1 Glen Elendra Archmage|UMA 1 Go for the Throat|MBS 1 Goblin Guide|MM3 1 Goblin Welder|ULG @@ -185,9 +185,9 @@ Name=MTGO Vintage Cube 2015 1 Griselbrand|MM3 1 Grove of the Burnwillows|IMA 1 Gruul Signet|MM3 -1 Gurmag Angler|FRF +1 Gurmag Angler|UMA 1 Gush|VMA -1 Guttersnipe|IMA +1 Guttersnipe|M19 1 Hallowed Fountain|RTR 1 Hallowed Spiritkeeper 1 Harmonize|MM3 @@ -196,7 +196,7 @@ Name=MTGO Vintage Cube 2015 1 Hero of Bladehold|MBS 1 Hero of Oxid Ridge|MBS 1 Hero's Downfall|THS -1 Hinterland Harbor|ISD +1 Hinterland Harbor|DOM 1 Honor of the Pure|M12 1 Horizon Canopy|IMA 1 Huntmaster of the Fells|DKA @@ -213,7 +213,7 @@ Name=MTGO Vintage Cube 2015 1 Iona, Shield of Emeria|MM2 1 Isamaru, Hound of Konda|CHK 1 Isochron Scepter|EMA -1 Isolated Chapel|ISD +1 Isolated Chapel|DOM 1 Izzet Charm|MM3 1 Izzet Signet|MM3 1 Jace Beleren|M11 @@ -223,38 +223,38 @@ Name=MTGO Vintage Cube 2015 1 Jeskai Ascendancy|KTK 1 Joraga Treespeaker|ROE 1 Journey to Nowhere|ZEN -1 Karakas|EMA +1 Karakas|UMA 1 Kargan Dragonlord|ROE -1 Karn Liberated|MM2 +1 Karn Liberated|UMA 1 Kiki-Jiki, Mirror Breaker|IMA 1 Kiora, the Crashing Wave|BNG -1 Kitchen Finks|MMA +1 Kitchen Finks|UMA 1 Koth of the Hammer|SOM -1 Kozilek, Butcher of Truth|MM2 +1 Kozilek, Butcher of Truth|UMA 1 Krosan Grip|MMA 1 Kuldotha Forgemaster|SOM 1 Land Tax|4ED 1 Leonin Arbiter|SOM 1 Leonin Relic-Warder|MBS 1 Library of Alexandria|VMA -1 Life from the Loam|MMA +1 Life from the Loam|UMA 1 Lifebane Zombie|M14 1 Lightning Bolt|A25 1 Lightning Greaves|MRD 1 Lightning Helix|IMA 1 Lightning Mauler|AVR -1 Lightning Strike|XLN -1 Liliana of the Veil|MM3 +1 Lightning Strike|M19 +1 Liliana of the Veil|UMA 1 Lingering Souls|MM3 1 Lion's Eye Diamond|MIR 1 Living Death|A25 -1 Llanowar Elves|EMA +1 Llanowar Elves|DOM 1 Llanowar Wastes|ORI 1 Lodestone Golem|MM2 1 Looter il-Kor|TSP 1 Lotus Bloom|MMA 1 Lotus Cobra|IMA -1 Maelstrom Pulse|MMA +1 Maelstrom Pulse|UMA 1 Magma Jet|MM3 1 Magus of the Moon|IMA 1 Makeshift Mannequin|LRW @@ -263,7 +263,7 @@ Name=MTGO Vintage Cube 2015 1 Mana Drain|IMA 1 Mana Leak|IMA 1 Mana Tithe|PLC -1 Mana Vault|VMA +1 Mana Vault|UMA 1 Manic Vandal|M12 1 Man-o'-War|A25 1 Mardu Woe-Reaper|FRF @@ -315,7 +315,7 @@ Name=MTGO Vintage Cube 2015 1 Nezumi Shortfang|CHK 1 Nicol Bolas, Planeswalker|M13 1 Nissa, Worldwaker|M15 -1 Noble Hierarch|MM2 +1 Noble Hierarch|UMA 1 Oath of Druids|TPR 1 Oblivion Ring|MM2 1 Olivia Voldaren|MM3 @@ -325,12 +325,12 @@ Name=MTGO Vintage Cube 2015 1 Oracle of Mul Daya|ZEN 1 Orzhov Signet|MM3 1 Outpost Siege|FRF -1 Overgrown Tomb|RTR +1 Overgrown Tomb|GRN 1 Pack Rat|RTR 1 Palinchron|VMA 1 Parallax Wave|VMA 1 Path to Exile|MM3 -1 Pattern of Rebirth|UDS +1 Pattern of Rebirth|UMA 1 Pentad Prism|5DN 1 Pernicious Deed|A25 1 Pestermite|MMA @@ -359,20 +359,20 @@ Name=MTGO Vintage Cube 2015 1 Ral Zarek|DGM 1 Ranger of Eos|MM3 1 Ravages of War|PTK -1 Reanimate|TPR -1 Reclamation Sage|M15 +1 Reanimate|UMA +1 Reclamation Sage|M19 1 Recurring Nightmare|TPR 1 Regrowth|A25 1 Remand|MM2 1 Repeal|IMA 1 Restoration Angel|IMA -1 Reveillark|MMA +1 Reveillark|UMA 1 Rift Bolt|IMA 1 Riftwing Cloudskate|MMA 1 Rishadan Port|A25 1 Rofellos, Llanowar Emissary|VMA 1 Rootbound Crag|XLN -1 Sacred Foundry|GTC +1 Sacred Foundry|GRN 1 Sakura-Tribe Elder|CNS 1 Sarkhan, the Dragonspeaker|KTK 1 Savannah|VMA @@ -395,11 +395,11 @@ Name=MTGO Vintage Cube 2015 1 Sheoldred, Whispering One|IMA 1 Shivan Reef|ORI 1 Show and Tell|USG -1 Shriekmaw|LRW +1 Shriekmaw|UMA 1 Shrine of Burning Rage|NPH 1 Sidisi, Undead Vizier|DTK 1 Siege Rhino|KTK -1 Siege-Gang Commander|EMA +1 Siege-Gang Commander|DOM 1 Silverblade Paladin|AVR 1 Simic Signet|MM3 1 Sin Collector|MM3 @@ -407,7 +407,7 @@ Name=MTGO Vintage Cube 2015 1 Skullclamp|VMA 1 Smash to Smithereens|ORI 1 Smokestack|VMA -1 Snapcaster Mage|MM3 +1 Snapcaster Mage|UMA 1 Sneak Attack|EMA 1 Sol Ring|VMA 1 Soldier of the Pantheon|THS @@ -425,7 +425,7 @@ Name=MTGO Vintage Cube 2015 1 Spirit of the Labyrinth|BNG 1 Splinter Twin|MM2 1 Staff of Domination -1 Steam Vents|RTR +1 Steam Vents|GRN 1 Stomping Ground|GTC 1 Stoneforge Mystic|WWK 1 Stormbreath Dragon|THS @@ -433,7 +433,7 @@ Name=MTGO Vintage Cube 2015 1 Stromkirk Noble|ISD 1 Student of Warfare|ROE 1 Stunted Growth|ICE -1 Sulfur Falls|ISD +1 Sulfur Falls|DOM 1 Sulfuric Vortex|EMA 1 Sulfurous Springs|10E 1 Sun Titan|M12 @@ -452,9 +452,9 @@ Name=MTGO Vintage Cube 2015 1 Taiga|VMA 1 Tamiyo, the Moon Sage|AVR 1 Tangle Wire|NMS -1 Tarmogoyf|MM3 +1 Tarmogoyf|UMA 1 Tasigur, the Golden Fang|FRF -1 Temple Garden|RTR +1 Temple Garden|GRN 1 Tendrils of Agony|VMA 1 Terastodon|CNS 1 Terminate|MM3 @@ -467,7 +467,7 @@ Name=MTGO Vintage Cube 2015 1 Thoughtseize|IMA 1 Thragtusk|MM3 1 Thran Dynamo|IMA -1 Through the Breach|CHK +1 Through the Breach|UMA 1 Thrun, the Last Troll|MBS 1 Thundermaw Hellkite|IMA 1 Tidehollow Sculler|MMA @@ -480,7 +480,7 @@ Name=MTGO Vintage Cube 2015 1 Tooth and Nail|MMA 1 Torch Fiend|M15 1 Treachery|UDS -1 Treasure Cruise|KTK +1 Treasure Cruise|UMA 1 Treetop Village|10E 1 Trinket Mage|SOM 1 Troll Ascetic|10E @@ -490,10 +490,10 @@ Name=MTGO Vintage Cube 2015 1 Tundra|VMA 1 Turnabout|VMA 1 Ugin, the Spirit Dragon|FRF -1 Ulamog, the Infinite Gyre|MM2 +1 Ulamog, the Infinite Gyre|UMA 1 Ultimate Price|DTK 1 Umezawa's Jitte|BOK -1 Unburial Rites|MM3 +1 Unburial Rites|UMA 1 Underground River|10E 1 Underground Sea|VMA 1 Unexpectedly Absent|EMA @@ -504,7 +504,7 @@ Name=MTGO Vintage Cube 2015 1 Vampiric Tutor|EMA 1 Vedalken Shackles|MMA 1 Vendilion Clique|A25 -1 Vengevine|ROE +1 Vengevine|UMA 1 Venser, Shaper Savant|MM3 1 Venser, the Sojourner|SOM 1 Verdant Catacombs|MM3 @@ -518,7 +518,7 @@ Name=MTGO Vintage Cube 2015 1 Wall of Roots|IMA 1 War Priest of Thune|EMA 1 Wasteland|EMA -1 Watery Grave|GTC +1 Watery Grave|GRN 1 Weathered Wayfarer|9ED 1 Wheel of Fortune|VMA 1 Whisperwood Elemental|FRF @@ -527,8 +527,8 @@ Name=MTGO Vintage Cube 2015 1 Winter Orb|EMA 1 Wolfir Silverheart|AVR 1 Wooded Foothills|KTK -1 Woodfall Primus|MMA -1 Woodland Cemetery|ISD +1 Woodfall Primus|UMA +1 Woodland Cemetery|DOM 1 Worn Powerstone|EMA 1 Wrath of God|EMA 1 Wurmcoil Engine|SOM @@ -537,7 +537,7 @@ Name=MTGO Vintage Cube 2015 1 Yavimaya Elder|VMA 1 Yawgmoth's Bargain|UDS 1 Yawgmoth's Will|USG -1 Young Pyromancer|EMA +1 Young Pyromancer|UMA 1 Zealous Conscripts|MM3 1 Zuran Orb|ICE 1 Zurgo Bellstriker|DTK diff --git a/forge-gui/res/cube/MTGO Vintage Cube 2016.dck b/forge-gui/res/cube/MTGO Vintage Cube 2016.dck index 7ef63a7363c..1a9a0581875 100644 --- a/forge-gui/res/cube/MTGO Vintage Cube 2016.dck +++ b/forge-gui/res/cube/MTGO Vintage Cube 2016.dck @@ -12,10 +12,10 @@ Name=MTGO Vintage Cube 2016 1 Ancestral Recall|VMA 1 Ancestral Vision|IMA 1 Ancient Grudge|MM3 -1 Ancient Tomb|VMA +1 Ancient Tomb|UMA 1 Angel of Serenity|RTR 1 Animate Dead|EMA -1 Anticipate|BFZ +1 Anticipate|M19 1 Arbor Elf|A25 1 Archangel of Thune|IMA 1 Arid Mesa|MM3 @@ -40,7 +40,7 @@ Name=MTGO Vintage Cube 2016 1 Beast Within|NPH 1 Birds of Paradise|M12 1 Birthing Pod|NPH -1 Bitterblossom|MM2 +1 Bitterblossom|UMA 1 Black Lotus|VMA 1 Blade Splicer|MM3 1 Blightsteel Colossus|MBS @@ -63,7 +63,7 @@ Name=MTGO Vintage Cube 2016 1 Brimaz, King of Oreskos|BNG 1 Brimstone Volley|CNS 1 Bring to Light|BFZ -1 Buried Alive|ODY +1 Buried Alive|UMA 1 Burning of Xinye|VMA 1 Burst Lightning|MM2 1 Cabal Ritual|VMA @@ -74,7 +74,7 @@ Name=MTGO Vintage Cube 2016 1 Char|RAV 1 Channel|IMA 1 Chrome Mox|EMA -1 Clifftop Retreat|ISD +1 Clifftop Retreat|DOM 1 Cloudgoat Ranger|MMA 1 Coalition Relic|A25 1 Compulsive Research|MM3 @@ -86,7 +86,7 @@ Name=MTGO Vintage Cube 2016 1 Courser of Kruphix|A25 1 Crater's Claws|KTK 1 Craterhoof Behemoth|MM3 -1 Crucible of Worlds|10E +1 Crucible of Worlds|M19 1 Cryptic Command|IMA 1 Dack Fayden|EMA 1 Damnation|MM3 @@ -99,12 +99,12 @@ Name=MTGO Vintage Cube 2016 1 Deathrite Shaman|EMA 1 Deceiver Exarch|NPH 1 Delver of Secrets|ISD -1 Demonic Tutor|VMA +1 Demonic Tutor|UMA 1 Den Protector|DTK 1 Deranged Hermit|VMA 1 Desecration Demon|MM3 1 Diabolic Edict|A25 -1 Dig Through Time|KTK +1 Dig Through Time|UMA 1 Dimir Signet|MM3 1 Disenchant|A25 1 Disfigure|A25 @@ -119,7 +119,7 @@ Name=MTGO Vintage Cube 2016 1 Drowned Catacomb|XLN 1 Dualcaster Mage|EMA 1 Duplicant|EMA -1 Duress|IMA +1 Duress|M19 1 Edric, Spymaster of Trest|VMA 1 Eidolon of the Great Revel|A25 1 Electrolyze|IMA @@ -130,22 +130,22 @@ Name=MTGO Vintage Cube 2016 1 Elvish Mystic|M15 1 Emeria Angel|IMA 1 Empty the Warrens|MMA -1 Emrakul, the Aeons Torn|MM2 +1 Emrakul, the Aeons Torn|UMA 1 Enlightened Tutor|EMA -1 Entomb|EMA -1 Eternal Witness|MMA +1 Entomb|UMA +1 Eternal Witness|UMA 1 Eureka|VMA 1 Everflowing Chalice|MM2 1 Exalted Angel|ONS 1 Exquisite Firecraft|ORI 1 Fact or Fiction|EMA -1 Faith's Fetters|EMA -1 Faithless Looting|EMA +1 Faith's Fetters|UMA +1 Faithless Looting|UMA 1 Fastbond|VMA -1 Fauna Shaman|M11 -1 Fiend Hunter|A25 +1 Fauna Shaman|UMA +1 Fiend Hunter|UMA 1 Figure of Destiny|MMA -1 Fire // Ice|APC +1 Fire // Ice|UMA 1 Fireblast|VMA 1 Firebolt|EMA 1 Firedrinker Satyr|THS @@ -154,7 +154,7 @@ Name=MTGO Vintage Cube 2016 1 Flooded Strand|KTK 1 Force of Will|EMA 1 Force Spike|7ED -1 Frantic Search|VMA +1 Frantic Search|UMA 1 Freyalise, Llanowar's Fury 1 Frost Titan|M12 1 Fyndhorn Elves|VMA @@ -169,10 +169,10 @@ Name=MTGO Vintage Cube 2016 1 Genesis Wave|IMA 1 Gideon Jura|M12 1 Gifts Ungiven|MM3 -1 Gilded Lotus|M13 +1 Gilded Lotus|DOM 1 Gitaxian Probe|NPH 1 Glacial Fortress|XLN -1 Glen Elendra Archmage|MMA +1 Glen Elendra Archmage|UMA 1 Go for the Throat|MBS 1 Goblin Guide|MM3 1 Goblin Welder|ULG @@ -185,9 +185,9 @@ Name=MTGO Vintage Cube 2016 1 Grim Monolith|ULG 1 Griselbrand|MM3 1 Gruul Signet|MM3 -1 Gurmag Angler|FRF +1 Gurmag Angler|UMA 1 Gush|VMA -1 Guttersnipe|IMA +1 Guttersnipe|M19 1 Hallowed Fountain|RTR 1 Hallowed Spiritkeeper 1 Hangarback Walker|ORI @@ -199,7 +199,7 @@ Name=MTGO Vintage Cube 2016 1 Hero of Oxid Ridge|MBS 1 Hero's Downfall|THS 1 High Tide|VMA -1 Hinterland Harbor|ISD +1 Hinterland Harbor|DOM 1 Honor of the Pure|M12 1 Huntmaster of the Fells|DKA 1 Hymn to Tourach|EMA @@ -215,7 +215,7 @@ Name=MTGO Vintage Cube 2016 1 Iona, Shield of Emeria|MM2 1 Isamaru, Hound of Konda|CHK 1 Isochron Scepter|EMA -1 Isolated Chapel|ISD +1 Isolated Chapel|DOM 1 Izzet Charm|MM3 1 Izzet Signet|MM3 1 Jace Beleren|M11 @@ -225,14 +225,14 @@ Name=MTGO Vintage Cube 2016 1 Jackal Pup|A25 1 Joraga Treespeaker|ROE 1 Journey to Nowhere|ZEN -1 Karakas|EMA +1 Karakas|UMA 1 Kargan Dragonlord|ROE -1 Karn Liberated|MM2 +1 Karn Liberated|UMA 1 Kiki-Jiki, Mirror Breaker|IMA 1 Kiora, the Crashing Wave|BNG -1 Kitchen Finks|MMA +1 Kitchen Finks|UMA 1 Koth of the Hammer|SOM -1 Kozilek, Butcher of Truth|MM2 +1 Kozilek, Butcher of Truth|UMA 1 Kuldotha Forgemaster|SOM 1 Kytheon, Hero of Akros|ORI 1 Land Tax|4ED @@ -244,18 +244,18 @@ Name=MTGO Vintage Cube 2016 1 Lightning Greaves|MRD 1 Lightning Helix|IMA 1 Lightning Mauler|AVR -1 Lightning Strike|XLN -1 Liliana of the Veil|MM3 +1 Lightning Strike|M19 +1 Liliana of the Veil|UMA 1 Liliana, Heretical Healer|ORI 1 Lingering Souls|MM3 1 Lion's Eye Diamond|MIR 1 Living Death|A25 -1 Llanowar Elves|EMA +1 Llanowar Elves|DOM 1 Lodestone Golem|MM2 1 Looter il-Kor|TSP 1 Lotus Bloom|MMA 1 Lotus Cobra|IMA -1 Maelstrom Pulse|MMA +1 Maelstrom Pulse|UMA 1 Magma Jet|MM3 1 Magus of the Moon|IMA 1 Makeshift Mannequin|LRW @@ -265,7 +265,7 @@ Name=MTGO Vintage Cube 2016 1 Mana Drain|IMA 1 Mana Leak|IMA 1 Mana Tithe|PLC -1 Mana Vault|VMA +1 Mana Vault|UMA 1 Manic Vandal|M12 1 Man-o'-War|A25 1 Mardu Woe-Reaper|FRF @@ -313,7 +313,7 @@ Name=MTGO Vintage Cube 2016 1 Nezumi Shortfang|CHK 1 Nicol Bolas, Planeswalker|M13 1 Nissa, Worldwaker|M15 -1 Noble Hierarch|MM2 +1 Noble Hierarch|UMA 1 Nykthos, Shrine to Nyx|THS 1 Oath of Druids|TPR 1 Oblivion Ring|MM2 @@ -324,12 +324,12 @@ Name=MTGO Vintage Cube 2016 1 Oracle of Mul Daya|ZEN 1 Orzhov Signet|MM3 1 Outpost Siege|FRF -1 Overgrown Tomb|RTR +1 Overgrown Tomb|GRN 1 Pack Rat|RTR 1 Palinchron|VMA 1 Parallax Wave|VMA 1 Path to Exile|MM3 -1 Pattern of Rebirth|UDS +1 Pattern of Rebirth|UMA 1 Pentad Prism|5DN 1 Pernicious Deed|A25 1 Pestermite|MMA @@ -356,21 +356,21 @@ Name=MTGO Vintage Cube 2016 1 Ral Zarek|DGM 1 Ranger of Eos|MM3 1 Ravages of War|PTK -1 Reanimate|TPR -1 Reclamation Sage|M15 +1 Reanimate|UMA +1 Reclamation Sage|M19 1 Recurring Nightmare|TPR 1 Regrowth|A25 1 Remand|MM2 1 Repeal|IMA 1 Restoration Angel|IMA -1 Reveillark|MMA +1 Reveillark|UMA 1 Rift Bolt|IMA 1 Riftwing Cloudskate|MMA 1 Rishadan Port|A25 1 Roast|DTK 1 Rofellos, Llanowar Emissary|VMA 1 Rootbound Crag|XLN -1 Sacred Foundry|GTC +1 Sacred Foundry|GRN 1 Sakura-Tribe Elder|CNS 1 Sarkhan, the Dragonspeaker|KTK 1 Savannah|VMA @@ -391,10 +391,10 @@ Name=MTGO Vintage Cube 2016 1 Shelldock Isle|LRW 1 Sheoldred, Whispering One|IMA 1 Show and Tell|USG -1 Shriekmaw|LRW +1 Shriekmaw|UMA 1 Shrine of Burning Rage|NPH 1 Sidisi, Undead Vizier|DTK -1 Siege-Gang Commander|EMA +1 Siege-Gang Commander|DOM 1 Silverblade Paladin|AVR 1 Simic Signet|MM3 1 Sin Collector|MM3 @@ -402,7 +402,7 @@ Name=MTGO Vintage Cube 2016 1 Skullclamp|VMA 1 Smash to Smithereens|ORI 1 Smokestack|VMA -1 Snapcaster Mage|MM3 +1 Snapcaster Mage|UMA 1 Sneak Attack|EMA 1 Sol Ring|VMA 1 Soldier of the Pantheon|THS @@ -420,7 +420,7 @@ Name=MTGO Vintage Cube 2016 1 Spirit of the Labyrinth|BNG 1 Splinter Twin|MM2 1 Staff of Domination -1 Steam Vents|RTR +1 Steam Vents|GRN 1 Stomping Ground|GTC 1 Stoneforge Mystic|WWK 1 Stormbreath Dragon|THS @@ -428,7 +428,7 @@ Name=MTGO Vintage Cube 2016 1 Stromkirk Noble|ISD 1 Student of Warfare|ROE 1 Stunted Growth|ICE -1 Sulfur Falls|ISD +1 Sulfur Falls|DOM 1 Sulfuric Vortex|EMA 1 Sun Titan|M12 1 Sundering Titan|A25 @@ -446,9 +446,9 @@ Name=MTGO Vintage Cube 2016 1 Taiga|VMA 1 Tamiyo, the Moon Sage|AVR 1 Tangle Wire|NMS -1 Tarmogoyf|MM3 +1 Tarmogoyf|UMA 1 Tasigur, the Golden Fang|FRF -1 Temple Garden|RTR +1 Temple Garden|GRN 1 Temple of Abandon|THS 1 Temple of Deceit|THS 1 Temple of Enlightenment|BNG @@ -471,7 +471,7 @@ Name=MTGO Vintage Cube 2016 1 Thoughtseize|IMA 1 Thragtusk|MM3 1 Thran Dynamo|IMA -1 Through the Breach|CHK +1 Through the Breach|UMA 1 Thrun, the Last Troll|MBS 1 Thundermaw Hellkite|IMA 1 Tidehollow Sculler|MMA @@ -485,7 +485,7 @@ Name=MTGO Vintage Cube 2016 1 Torch Fiend|M15 1 Toxic Deluge|EMA 1 Treachery|UDS -1 Treasure Cruise|KTK +1 Treasure Cruise|UMA 1 Trinket Mage|SOM 1 Tropical Island|VMA 1 True-Name Nemesis @@ -494,10 +494,10 @@ Name=MTGO Vintage Cube 2016 1 Turnabout|VMA 1 Ugin, the Spirit Dragon|FRF 1 Ulamog, the Ceaseless Hunger|BFZ -1 Ulamog, the Infinite Gyre|MM2 +1 Ulamog, the Infinite Gyre|UMA 1 Ultimate Price|DTK 1 Umezawa's Jitte|BOK -1 Unburial Rites|MM3 +1 Unburial Rites|UMA 1 Underground Sea|VMA 1 Unexpectedly Absent|EMA 1 Upheaval|VMA @@ -507,7 +507,7 @@ Name=MTGO Vintage Cube 2016 1 Vampiric Tutor|EMA 1 Vedalken Shackles|MMA 1 Vendilion Clique|A25 -1 Vengevine|ROE +1 Vengevine|UMA 1 Venser, Shaper Savant|MM3 1 Venser, the Sojourner|SOM 1 Verdant Catacombs|MM3 @@ -519,7 +519,7 @@ Name=MTGO Vintage Cube 2016 1 Wall of Roots|IMA 1 War Priest of Thune|EMA 1 Wasteland|EMA -1 Watery Grave|GTC +1 Watery Grave|GRN 1 Weathered Wayfarer|9ED 1 Wheel of Fortune|VMA 1 Whisperwood Elemental|FRF @@ -528,8 +528,8 @@ Name=MTGO Vintage Cube 2016 1 Winter Orb|EMA 1 Wolfir Silverheart|AVR 1 Wooded Foothills|KTK -1 Woodfall Primus|MMA -1 Woodland Cemetery|ISD +1 Woodfall Primus|UMA +1 Woodland Cemetery|DOM 1 Worn Powerstone|EMA 1 Wrath of God|EMA 1 Wurmcoil Engine|SOM @@ -537,7 +537,7 @@ Name=MTGO Vintage Cube 2016 1 Yavimaya Elder|VMA 1 Yawgmoth's Bargain|UDS 1 Yawgmoth's Will|USG -1 Young Pyromancer|EMA +1 Young Pyromancer|UMA 1 Zealous Conscripts|MM3 1 Zuran Orb|ICE 1 Zurgo Bellstriker|DTK diff --git a/forge-gui/res/cube/MTGO Vintage Cube December 2017.dck b/forge-gui/res/cube/MTGO Vintage Cube December 2017.dck index 1892bcaf00f..44c91f18a87 100644 --- a/forge-gui/res/cube/MTGO Vintage Cube December 2017.dck +++ b/forge-gui/res/cube/MTGO Vintage Cube December 2017.dck @@ -21,7 +21,7 @@ Name=MTGO Vintage Cube December 2017 1 Abbot of Keral Keep|ORI 1 Falkenrath Gorger|SOI 1 Hellrider|MM3 -1 Siege-Gang Commander|EMA +1 Siege-Gang Commander|DOM 1 Delver of Secrets|ISD 1 Strip Mine|VMA 1 Wasteland|EMA @@ -51,7 +51,7 @@ Name=MTGO Vintage Cube December 2017 1 Thalia, Guardian of Thraben|A25 1 Linvala, Keeper of Silence|MM3 1 Knight of the White Orchid|ORI -1 Fiend Hunter|A25 +1 Fiend Hunter|UMA 1 Emeria Angel|IMA 1 Mother of Runes|EMA 1 Brimaz, King of Oreskos|BNG @@ -79,21 +79,21 @@ Name=MTGO Vintage Cube December 2017 1 Council's Judgment|CNS 1 Sun Titan|M12 1 Elspeth, Knight-Errant|MMA -1 Faith's Fetters|EMA +1 Faith's Fetters|UMA 1 Honor of the Pure|M12 -1 Bitterblossom|MM2 +1 Bitterblossom|UMA 1 Wrath of God|EMA 1 Swords to Plowshares|A25 1 Spear of Heliod|THS 1 Day of Judgment|M12 1 Leyline of Sanctity|MM2 -1 Karakas|EMA +1 Karakas|UMA 1 Jace, Vryn's Prodigy|ORI 1 Mox Pearl|VMA 1 Oblivion Ring|MM2 1 Path to Exile|MM3 1 Zealous Conscripts|MM3 -1 Reveillark|MMA +1 Reveillark|UMA 1 Unexpectedly Absent|EMA 1 Armageddon|A25 1 Mana Tithe|PLC @@ -138,9 +138,9 @@ Name=MTGO Vintage Cube December 2017 1 Pestermite|MMA 1 Mana Leak|IMA 1 Vendilion Clique|A25 -1 Glen Elendra Archmage|MMA +1 Glen Elendra Archmage|UMA 1 Daze|EMA -1 Snapcaster Mage|MM3 +1 Snapcaster Mage|UMA 1 Deceiver Exarch|NPH 1 Mystic Confluence 1 True-Name Nemesis @@ -150,7 +150,7 @@ Name=MTGO Vintage Cube December 2017 1 Empty the Warrens|MMA 1 Compulsive Research|MM3 1 Time Walk|VMA -1 Frantic Search|VMA +1 Frantic Search|UMA 1 Cryptic Command|IMA 1 Gush|VMA 1 Tinker|ULG @@ -178,15 +178,15 @@ Name=MTGO Vintage Cube December 2017 1 Trinket Mage|SOM 1 Shelldock Isle|LRW 1 Brain Freeze|VMA -1 Treasure Cruise|KTK +1 Treasure Cruise|UMA 1 Turnabout|VMA -1 Dig Through Time|KTK +1 Dig Through Time|UMA 1 Thoughtseize|IMA 1 Braids, Cabal Minion|EMA 1 Desecration Demon|MM3 1 Hero's Downfall|THS 1 Damnation|MM3 -1 Shriekmaw|LRW +1 Shriekmaw|UMA 1 Liliana, Death's Majesty|AKH 1 Kalitas, Traitor of Ghet|OGW 1 Painful Truths|BFZ @@ -195,12 +195,12 @@ Name=MTGO Vintage Cube December 2017 1 Toxic Deluge|EMA 1 Ophiomancer 1 Nekrataal|EMA -1 Gurmag Angler|FRF +1 Gurmag Angler|UMA 1 Dark Petition|ORI 1 Cabal Ritual|VMA 1 Phyrexian Arena|9ED 1 Go for the Throat|MBS -1 Duress|IMA +1 Duress|M19 1 Grim Tutor|S99 1 The Abyss|LEG 1 Vampire Nighthawk|MM3 @@ -221,11 +221,11 @@ Name=MTGO Vintage Cube December 2017 1 Tendrils of Agony|VMA 1 Rishadan Port|A25 1 Grave Titan|M12 -1 Entomb|EMA +1 Entomb|UMA 1 Bazaar of Baghdad|VMA 1 Yawgmoth's Will|USG 1 Yawgmoth's Bargain|UDS -1 Demonic Tutor|VMA +1 Demonic Tutor|UMA 1 Mox Jet|VMA 1 Necropotence|IMA 1 Looter il-Kor|TSP @@ -238,16 +238,16 @@ Name=MTGO Vintage Cube December 2017 1 Recurring Nightmare|TPR 1 Animate Dead|EMA 1 Search for Azcanta|XLN -1 Buried Alive|ODY +1 Buried Alive|UMA 1 Iona, Shield of Emeria|MM2 -1 Faithless Looting|EMA +1 Faithless Looting|UMA 1 Necromancy|VIS -1 Liliana of the Veil|MM3 -1 Reanimate|TPR +1 Liliana of the Veil|UMA +1 Reanimate|UMA 1 Griselbrand|MM3 1 Putrid Imp|VMA 1 Massacre Wurm|MBS -1 Unburial Rites|MM3 +1 Unburial Rites|UMA 1 Pack Rat|RTR 1 Mind Twist|4ED 1 Oona's Prowler|LRW @@ -257,7 +257,7 @@ Name=MTGO Vintage Cube December 2017 1 Dualcaster Mage|EMA 1 Harsh Mentor|AKH 1 Splinter Twin|MM2 -1 Young Pyromancer|EMA +1 Young Pyromancer|UMA 1 Char|RAV 1 Daretti, Scrap Savant 1 Pyretic Ritual|M11 @@ -268,8 +268,8 @@ Name=MTGO Vintage Cube December 2017 1 Firebolt|EMA 1 Ancient Grudge|MM3 1 Kiki-Jiki, Mirror Breaker|IMA -1 Desperate Ritual|MMA -1 Through the Breach|CHK +1 Desperate Ritual|UMA +1 Through the Breach|UMA 1 Searing Spear|M13 1 Lightning Bolt|A25 1 Fireblast|VMA @@ -282,14 +282,14 @@ Name=MTGO Vintage Cube December 2017 1 Abrade|HOU 1 Chain Lightning|EMA 1 Goblin Welder|ULG -1 Guttersnipe|IMA +1 Guttersnipe|M19 1 Rift Bolt|IMA 1 Chandra, Flamecaller|OGW 1 Chandra, Torch of Defiance|KLD 1 Imperial Recruiter|A25 1 Bonfire of the Damned|MM3 1 Shrine of Burning Rage|NPH -1 Lightning Strike|XLN +1 Lightning Strike|M19 1 Magma Jet|MM3 1 Search for Tomorrow|IMA 1 Fyndhorn Elves|VMA @@ -309,13 +309,13 @@ Name=MTGO Vintage Cube December 2017 1 Channel|IMA 1 Sakura-Tribe Elder|CNS 1 Survival of the Fittest|TPR -1 Noble Hierarch|MM2 +1 Noble Hierarch|UMA 1 Dissenter's Deliverance|AKH 1 Regrowth|A25 1 Natural Order|EMA 1 Oath of Druids|TPR 1 Sylvan Caryatid|THS -1 Llanowar Elves|EMA +1 Llanowar Elves|DOM 1 Wall of Roots|IMA 1 Green Sun's Zenith|EMA 1 Arbor Elf|A25 @@ -328,7 +328,7 @@ Name=MTGO Vintage Cube December 2017 1 Tooth and Nail|MMA 1 Rishkar, Peema Renegade|AER 1 Rofellos, Llanowar Emissary|VMA -1 Leovold, Emissary of Trest +1 Leovold, Emissary of Trest|UMA 1 Opposition|7ED 1 Archangel of Thune|IMA 1 Beast Within|NPH @@ -343,21 +343,21 @@ Name=MTGO Vintage Cube December 2017 1 Nature's Claim|IMA 1 Thrun, the Last Troll|MBS 1 Gaea's Cradle|USG -1 Reclamation Sage|M15 +1 Reclamation Sage|M19 1 Oath of Nissa|OGW 1 Thragtusk|MM3 1 Sweltering Suns|AKH 1 Verdurous Gearhulk|KLD 1 Freyalise, Llanowar's Fury 1 Garruk, Primal Hunter|M13 -1 Woodfall Primus|MMA +1 Woodfall Primus|UMA 1 Den Protector|DTK 1 Mox Emerald|VMA -1 Tarmogoyf|MM3 +1 Tarmogoyf|UMA 1 Craterhoof Behemoth|MM3 -1 Eternal Witness|MMA +1 Eternal Witness|UMA 1 Razaketh, the Foulblooded|HOU -1 Fauna Shaman|M11 +1 Fauna Shaman|UMA 1 Scavenging Ooze|MM3 1 Polukranos, World Eater|THS 1 Deranged Hermit|VMA @@ -365,7 +365,7 @@ Name=MTGO Vintage Cube December 2017 1 Mana Crypt|EMA 1 Flooded Strand|KTK 1 Hallowed Fountain|RTR -1 Ancient Tomb|VMA +1 Ancient Tomb|UMA 1 Hedron Archive|BFZ 1 Maze of Ith|EMA 1 Mox Diamond|TPR @@ -380,13 +380,13 @@ Name=MTGO Vintage Cube December 2017 1 Seachrome Coast|SOM 1 Mana Confluence|JOU 1 Chrome Mox|EMA -1 Lavaclaw Reaches|WWK +1 Lavaclaw Reaches|UMA 1 Shardless Agent|EMA 1 Olivia Voldaren|MM3 -1 Creeping Tar Pit|WWK +1 Creeping Tar Pit|UMA 1 Bloodstained Mire|KTK 1 Supreme Verdict|IMA -1 Mana Vault|VMA +1 Mana Vault|UMA 1 Copperline Gorge|SOM 1 Mishra's Workshop|ATQ 1 Library of Alexandria|VMA @@ -402,23 +402,23 @@ Name=MTGO Vintage Cube December 2017 1 Smokestack|VMA 1 Reflector Mage|OGW 1 Tropical Island|VMA -1 Ulamog, the Infinite Gyre|MM2 +1 Ulamog, the Infinite Gyre|UMA 1 Figure of Destiny|MMA 1 Progenitus|MMA 1 Inspiring Vantage|KLD -1 Kozilek, Butcher of Truth|MM2 +1 Kozilek, Butcher of Truth|UMA 1 Edric, Spymaster of Trest|VMA -1 Celestial Colonnade|WWK +1 Celestial Colonnade|UMA 1 Trygon Predator|EMA 1 Boros Signet|MM3 1 Mishra's Factory|A25 -1 Karn Liberated|MM2 +1 Karn Liberated|UMA 1 Boros Charm|A25 -1 Crucible of Worlds|10E +1 Crucible of Worlds|M19 1 Winter Orb|EMA 1 Anguished Unmaking|SOI 1 Lightning Helix|IMA -1 Emrakul, the Aeons Torn|MM2 +1 Emrakul, the Aeons Torn|UMA 1 Simic Signet|MM3 1 Bring to Light|BFZ 1 Lumbering Falls|BFZ @@ -430,7 +430,7 @@ Name=MTGO Vintage Cube December 2017 1 Mutavault|M14 1 Misty Rainforest|MM3 1 Ajani Vengeant|ALA -1 Sacred Foundry|GTC +1 Sacred Foundry|GRN 1 Mystic Snake|A25 1 Breeding Pool|GTC 1 Arid Mesa|MM3 @@ -453,7 +453,7 @@ Name=MTGO Vintage Cube December 2017 1 Sword of War and Peace|NPH 1 Needle Spires|OGW 1 Xenagos, the Reveler|THS -1 Raging Ravine|WWK +1 Raging Ravine|UMA 1 Gruul Signet|MM3 1 Dragonlord Atarka|DTK 1 Taiga|VMA @@ -468,7 +468,7 @@ Name=MTGO Vintage Cube December 2017 1 Wurmcoil Engine|SOM 1 Nykthos, Shrine to Nyx|THS 1 Underground Sea|VMA -1 Watery Grave|GTC +1 Watery Grave|GRN 1 Solemn Simulacrum|M12 1 Nicol Bolas, Planeswalker|M13 1 Hostage Taker|XLN @@ -480,13 +480,13 @@ Name=MTGO Vintage Cube December 2017 1 Windswept Heath|KTK 1 Walking Ballista|AER 1 Memory Jar|VMA -1 Temple Garden|RTR +1 Temple Garden|GRN 1 Mindslaver|SOM 1 Baleful Strix|EMA 1 Hangarback Walker|ORI 1 Coercive Portal|VMA 1 Emrakul, the Promised End|EMN -1 Stirring Wildwood|WWK +1 Stirring Wildwood|UMA 1 Selesnya Signet|MM3 1 Sensei's Divining Top|EMA 1 Darkslick Shores|SOM @@ -501,7 +501,7 @@ Name=MTGO Vintage Cube December 2017 1 Razorverge Thicket|SOM 1 Ashiok, Nightmare Weaver|THS 1 The Scarab God|HOU -1 Kitchen Finks|MMA +1 Kitchen Finks|UMA 1 Dragonlord Dromoka|DTK 1 Phyrexian Revoker|M15 1 Spirebluff Canal|KLD @@ -512,21 +512,21 @@ Name=MTGO Vintage Cube December 2017 1 Deathrite Shaman|EMA 1 Verdant Catacombs|MM3 1 Scalding Tarn|MM3 -1 Maelstrom Pulse|MMA +1 Maelstrom Pulse|UMA 1 Bayou|VMA 1 Blooming Marsh|KLD -1 Gilded Lotus|M13 +1 Gilded Lotus|DOM 1 Worn Powerstone|EMA 1 Pernicious Deed|A25 1 Volcanic Island|VMA 1 Smuggler's Copter|KLD 1 God-Pharaoh's Gift|HOU -1 Overgrown Tomb|RTR +1 Overgrown Tomb|GRN 1 Myr Battlesphere|SOM 1 Grim Monolith|ULG 1 Dack Fayden|EMA 1 Ral Zarek|DGM -1 Steam Vents|RTR +1 Steam Vents|GRN 1 Wandering Fumarole|OGW 1 Westvale Abbey|SOI 1 Pentad Prism|5DN @@ -539,5 +539,5 @@ Name=MTGO Vintage Cube December 2017 1 Blightsteel Colossus|MBS 1 Sphinx of the Steel Wind|EMA 1 Basalt Monolith|3ED -1 Fire // Ice|APC +1 Fire // Ice|UMA 1 Thran Dynamo|IMA diff --git a/forge-gui/res/cube/MTGO Vintage Cube December 2018.dck b/forge-gui/res/cube/MTGO Vintage Cube December 2018.dck new file mode 100644 index 00000000000..1177fe6c94d --- /dev/null +++ b/forge-gui/res/cube/MTGO Vintage Cube December 2018.dck @@ -0,0 +1,543 @@ +[metadata] +Name=MTGO Vintage Cube December 2018 +[main] +1 Dauntless Bodyguard|DOM +1 Kytheon, Hero of Akros|ORI +1 Mother of Runes|EMA +1 Student of Warfare|ROE +1 Adanto Vanguard|XLN +1 Leonin Relic-Warder|MBS +1 Remorseful Cleric|M19 +1 Selfless Spirit|EMN +1 Soulfire Grand Master|FRF +1 Stoneforge Mystic|WWK +1 Thalia, Guardian of Thraben|A25 +1 Wall of Omens|EMA +1 Banisher Priest|M14 +1 Blade Splicer|MM3 +1 Brightling +1 Brimaz, King of Oreskos|BNG +1 Flickerwisp|MM3 +1 Mirran Crusader|MM2 +1 Monastery Mentor|FRF +1 Recruiter of the Guard +1 Silverblade Paladin|AVR +1 Emeria Angel|IMA +1 Hero of Bladehold|MBS +1 Linvala, Keeper of Silence|MM3 +1 Palace Jailer +1 Restoration Angel|IMA +1 Angel of Invention|KLD +1 Angel of Sanctions|AKH +1 Archangel Avacyn|SOI +1 Baneslayer Angel|M11 +1 Lyra Dawnbringer|DOM +1 Reveillark|UMA +1 Sun Titan|M12 +1 Elesh Norn, Grand Cenobite|IMA +1 Avacyn, Angel of Hope|AVR +1 Iona, Shield of Emeria|MM2 +1 Gideon of the Trials|AKH +1 Elspeth, Knight-Errant|MMA +1 Gideon, Ally of Zendikar|BFZ +1 Gideon Jura|M12 +1 Elspeth, Sun's Champion|THS +1 Porcelain Legionnaire|NPH +1 Condemn|M11 +1 Enlightened Tutor|EMA +1 Mana Tithe|PLC +1 Path to Exile|MM3 +1 Swords to Plowshares|A25 +1 Disenchant|A25 +1 Unexpectedly Absent|EMA +1 Balance|EMA +1 Council's Judgment|CNS +1 Lingering Souls|MM3 +1 Spectral Procession|MM2 +1 Timely Reinforcements|M12 +1 Armageddon|A25 +1 Day of Judgment|M12 +1 Ravages of War|PTK +1 Wrath of God|EMA +1 Terminus|MM3 +1 Land Tax|4ED +1 Legion's Landing|XLN +1 Honor of the Pure|M12 +1 Banishing Light|JOU +1 History of Benalia|DOM +1 Oblivion Ring|MM2 +1 Faith's Fetters|UMA +1 Moat|LEG +1 Parallax Wave|VMA +1 Spear of Heliod|THS +1 Karakas|UMA +1 Baral, Chief of Compliance|AER +1 Jace, Vryn's Prodigy|ORI +1 Looter il-Kor|TSP +1 Phantasmal Image|MM3 +1 Snapcaster Mage|UMA +1 Thing in the Ice|SOI +1 Arcane Artisan +1 Deceiver Exarch|NPH +1 Pestermite|MMA +1 Trinket Mage|SOM +1 True-Name Nemesis +1 Vendilion Clique|A25 +1 Glen Elendra Archmage|UMA +1 Sower of Temptation|LRW +1 Venser, Shaper Savant|MM3 +1 Mulldrifter|MM2 +1 Riftwing Cloudskate|MMA +1 Consecrated Sphinx|IMA +1 Frost Titan|M12 +1 Palinchron|VMA +1 Jace Beleren|M11 +1 Jace, Architect of Thought|RTR +1 Jace, the Mind Sculptor|VMA +1 Tamiyo, the Moon Sage|AVR +1 Tezzeret the Seeker|MM2 +1 Phyrexian Metamorph|NPH +1 Torrential Gearhulk|KLD +1 Inkwell Leviathan|EMA +1 Ancestral Recall|VMA +1 Brainstorm|A25 +1 High Tide|VMA +1 Mystical Tutor|EMA +1 Spell Pierce|XLN +1 Blink of an Eye|DOM +1 Brain Freeze|VMA +1 Counterspell|A25 +1 Daze|EMA +1 Impulse|VIS +1 Mana Drain|IMA +1 Mana Leak|IMA +1 Remand|MM2 +1 Disallow|AER +1 Frantic Search|UMA +1 Thirst for Knowledge|MMA +1 Cryptic Command|IMA +1 Fact or Fiction|EMA +1 Gifts Ungiven|MM3 +1 Turnabout|VMA +1 Force of Will|EMA +1 Gush|VMA +1 Mystic Confluence +1 Repeal|IMA +1 Nexus of Fate +1 Dig Through Time|UMA +1 Ancestral Vision|IMA +1 Gitaxian Probe|NPH +1 Ponder|M12 +1 Preordain|M11 +1 Chart a Course|XLN +1 Time Walk|VMA +1 Compulsive Research|MM3 +1 Show and Tell|USG +1 Timetwister|VMA +1 Tinker|ULG +1 Bribery|8ED +1 Mind's Desire|SCG +1 Time Spiral|USG +1 Upheaval|VMA +1 Treasure Cruise|UMA +1 Search for Azcanta|XLN +1 Control Magic|EMA +1 Opposition|7ED +1 Treachery|UDS +1 Shelldock Isle|LRW +1 Tolarian Academy|VMA +1 Putrid Imp|VMA +1 Brain Maggot|JOU +1 Dark Confidant|MM2 +1 Kitesail Freebooter|XLN +1 Mesmeric Fiend|A25 +1 Oona's Prowler|LRW +1 Pack Rat|RTR +1 Scrapheap Scrounger|KLD +1 Vampire Hexmage|CNS +1 Bone Shredder|ULG +1 Hypnotic Specter|M10 +1 Ophiomancer +1 Vampire Nighthawk|MM3 +1 Gonti, Lord of Luxury|KLD +1 Nekrataal|EMA +1 Ravenous Chupacabra|A25 +1 Doom Whisperer|GRN +1 Puppeteer Clique|MM2 +1 Shriekmaw|UMA +1 Demonlord Belzenlok|DOM +1 Grave Titan|M12 +1 Massacre Wurm|MBS +1 Tasigur, the Golden Fang|FRF +1 Sheoldred, Whispering One|IMA +1 Griselbrand|MM3 +1 Liliana of the Veil|UMA +1 Liliana, Death's Majesty|AKH +1 Dark Ritual|A25 +1 Entomb|UMA +1 Fatal Push|AER +1 Vampiric Tutor|EMA +1 Cabal Ritual|VMA +1 Cast Down|DOM +1 Go for the Throat|MBS +1 Shallow Grave|MIR +1 Ultimate Price|DTK +1 Corpse Dance|TPR +1 Dismember|MM2 +1 Hero's Downfall|THS +1 Makeshift Mannequin|LRW +1 Vraska's Contempt|XLN +1 Duress|M19 +1 Imperial Seal|PTK +1 Inquisition of Kozilek|MM3 +1 Reanimate|UMA +1 Thoughtseize|IMA +1 Collective Brutality|EMN +1 Demonic Tutor|UMA +1 Exhume|USG +1 Hymn to Tourach|EMA +1 Night's Whisper|EMA +1 Buried Alive|UMA +1 Grim Tutor|S99 +1 Toxic Deluge|EMA +1 Yawgmoth's Will|USG +1 Damnation|MM3 +1 Languish|ORI +1 Tendrils of Agony|VMA +1 Dark Petition|ORI +1 Living Death|A25 +1 Unburial Rites|UMA +1 Mind Twist|4ED +1 Animate Dead|EMA +1 Arguel's Blood Fast|XLN +1 Bitterblossom|UMA +1 Necromancy|VIS +1 Phyrexian Arena|9ED +1 Recurring Nightmare|TPR +1 Yawgmoth's Bargain|UDS +1 Urborg, Tomb of Yawgmoth|M15 +1 Firedrinker Satyr|THS +1 Goblin Guide|MM3 +1 Goblin Welder|ULG +1 Grim Lavamancer|M12 +1 Jackal Pup|A25 +1 Monastery Swiftspear|IMA +1 Zurgo Bellstriker|DTK +1 Abbot of Keral Keep|ORI +1 Dire Fleet Daredevil|RIX +1 Eidolon of the Great Revel|A25 +1 Runaway Steam-Kin|GRN +1 Young Pyromancer|UMA +1 Goblin Rabblemaster|M15 +1 Imperial Recruiter|A25 +1 Magus of the Moon|IMA +1 Manic Vandal|M12 +1 Pia Nalaar|KLD +1 Avalanche Riders|TSB +1 Flametongue Kavu|VMA +1 Hazoret the Fervent|AKH +1 Hellrider|MM3 +1 Pia and Kiran Nalaar|ORI +1 Rekindling Phoenix|RIX +1 Glorybringer|AKH +1 Goblin Dark-Dwellers|OGW +1 Kiki-Jiki, Mirror Breaker|IMA +1 Siege-Gang Commander|DOM +1 Thundermaw Hellkite|IMA +1 Zealous Conscripts|MM3 +1 Inferno Titan|M12 +1 Chandra, Torch of Defiance|KLD +1 Daretti, Scrap Savant +1 Koth of the Hammer|SOM +1 Chandra, Flamecaller|OGW +1 Burst Lightning|MM2 +1 Lightning Bolt|A25 +1 Abrade|HOU +1 Ancient Grudge|MM3 +1 Desperate Ritual|UMA +1 Incinerate|M12 +1 Lightning Strike|M19 +1 Magma Jet|MM3 +1 Pyretic Ritual|M11 +1 Char|RAV +1 Seething Song|9ED +1 Through the Breach|UMA +1 Fireblast|VMA +1 Chain Lightning|EMA +1 Faithless Looting|UMA +1 Firebolt|EMA +1 Flame Slash|ROE +1 Mizzium Mortars|MM3 +1 Pyroclasm|A25 +1 Collective Defiance|EMN +1 Sweltering Suns|AKH +1 Wheel of Fortune|VMA +1 Empty the Warrens|MMA +1 Fiery Confluence +1 Burning of Xinye|VMA +1 Wildfire|MM2 +1 Bonfire of the Damned|MM3 +1 Mana Flare|5ED +1 Sulfuric Vortex|EMA +1 Experimental Frenzy|GRN +1 Sneak Attack|EMA +1 Splinter Twin|MM2 +1 Arbor Elf|A25 +1 Avacyn's Pilgrim|MM3 +1 Birds of Paradise|M12 +1 Elves of Deep Shadow|RAV +1 Elvish Mystic|M15 +1 Fyndhorn Elves|VMA +1 Joraga Treespeaker|ROE +1 Llanowar Elves|DOM +1 Noble Hierarch|UMA +1 Devoted Druid|UMA +1 Fauna Shaman|UMA +1 Lotus Cobra|IMA +1 Rofellos, Llanowar Emissary|VMA +1 Sakura-Tribe Elder|CNS +1 Scavenging Ooze|MM3 +1 Sylvan Caryatid|THS +1 Wall of Blossoms|TPR +1 Wall of Roots|IMA +1 Courser of Kruphix|A25 +1 Eternal Witness|UMA +1 Manglehorn|AKH +1 Nissa, Vastwood Seer|ORI +1 Ramunap Excavator|HOU +1 Reclamation Sage|M19 +1 Tireless Tracker|SOI +1 Yavimaya Elder|VMA +1 Master of the Wild Hunt|A25 +1 Obstinate Baloth|IMA +1 Oracle of Mul Daya|ZEN +1 Polukranos, World Eater|THS +1 Thrun, the Last Troll|MBS +1 Acidic Slime|M13 +1 Deranged Hermit|VMA +1 Thragtusk|MM3 +1 Whisperwood Elemental|FRF +1 Carnage Tyrant|XLN +1 Primeval Titan|IMA +1 Avenger of Zendikar|WWK +1 Craterhoof Behemoth|MM3 +1 Terastodon|CNS +1 Woodfall Primus|UMA +1 Nissa, Voice of Zendikar|OGW +1 Garruk Relentless|ISD +1 Garruk Wildspeaker|M11 +1 Garruk, Primal Hunter|M13 +1 Nissa, Worldwaker|M15 +1 Vivien Reid|M19 +1 Verdurous Gearhulk|KLD +1 Nature's Claim|IMA +1 Beast Within|NPH +1 Channel|IMA +1 Regrowth|A25 +1 Kodama's Reach|UMA +1 Search for Tomorrow|IMA +1 Eureka|VMA +1 Harmonize|MM3 +1 Natural Order|EMA +1 Plow Under|8ED +1 Primal Command|MM3 +1 Green Sun's Zenith|EMA +1 Tooth and Nail|MMA +1 Genesis Wave|IMA +1 Fastbond|VMA +1 Oath of Druids|TPR +1 Survival of the Fittest|TPR +1 Sylvan Library|EMA +1 Heartbeat of Spring|CHK +1 Gaea's Cradle|USG +1 Geist of Saint Traft|ISD +1 Spell Queller|EMN +1 Dragonlord Ojutai|DTK +1 Teferi, Hero of Dominaria|DOM +1 Sphinx's Revelation|MM3 +1 Celestial Colonnade|UMA +1 Flooded Strand|KTK +1 Hallowed Fountain|RTR +1 Seachrome Coast|SOM +1 Tundra|VMA +1 Thief of Sanity|GRN +1 Hostage Taker|XLN +1 The Scarab God|HOU +1 Ashiok, Nightmare Weaver|THS +1 Baleful Strix|EMA +1 Creeping Tar Pit|UMA +1 Darkslick Shores|SOM +1 Polluted Delta|KTK +1 Underground Sea|VMA +1 Watery Grave|GRN +1 Daretti, Ingenious Iconoclast +1 Terminate|MM3 +1 Kolaghan's Command|DTK +1 Dreadbore|RTR +1 Rakdos's Return|RTR +1 Badlands|VMA +1 Blackcleave Cliffs|SOM +1 Blood Crypt|RTR +1 Bloodstained Mire|KTK +1 Lavaclaw Reaches|UMA +1 Bloodbraid Elf|EMA +1 Huntmaster of the Fells|DKA +1 Dragonlord Atarka|DTK +1 Xenagos, the Reveler|THS +1 Manamorphose|MMA +1 Copperline Gorge|SOM +1 Raging Ravine|UMA +1 Stomping Ground|GTC +1 Taiga|VMA +1 Wooded Foothills|KTK +1 Kitchen Finks|UMA +1 Knight of Autumn|GRN +1 Knight of the Reliquary|IMA +1 Trostani Discordant|GRN +1 Mirari's Wake|CNS +1 Razorverge Thicket|SOM +1 Savannah|VMA +1 Stirring Wildwood|UMA +1 Temple Garden|GRN +1 Windswept Heath|KTK +1 Tidehollow Sculler|MMA +1 Anguished Unmaking|SOI +1 Vindicate|A25 +1 Concealed Courtyard|KLD +1 Godless Shrine|GTC +1 Marsh Flats|MM3 +1 Scrubland|VMA +1 Shambling Vent|BFZ +1 Vraska, Relic Seeker|XLN +1 Garruk, Apex Predator|M15 +1 Abrupt Decay|MM3 +1 Assassin's Trophy|GRN +1 Maelstrom Pulse|UMA +1 Bayou|VMA +1 Blooming Marsh|KLD +1 Hissing Quagmire|OGW +1 Overgrown Tomb|GRN +1 Verdant Catacombs|MM3 +1 Edric, Spymaster of Trest|VMA +1 Trygon Predator|EMA +1 Mystic Snake|A25 +1 Kiora, the Crashing Wave|BNG +1 Shardless Agent|EMA +1 Botanical Sanctum|KLD +1 Breeding Pool|GTC +1 Lumbering Falls|BFZ +1 Misty Rainforest|MM3 +1 Tropical Island|VMA +1 Goblin Electromancer|GRN +1 Dack Fayden|EMA +1 Expansion // Explosion|GRN +1 Izzet Charm|MM3 +1 Thousand-Year Storm|GRN +1 Scalding Tarn|MM3 +1 Spirebluff Canal|KLD +1 Steam Vents|GRN +1 Volcanic Island|VMA +1 Wandering Fumarole|OGW +1 Figure of Destiny|MMA +1 Aurelia, Exemplar of Justice|GRN +1 Ajani Vengeant|ALA +1 Nahiri, the Harbinger|SOI +1 Lightning Helix|IMA +1 Arid Mesa|MM3 +1 Inspiring Vantage|KLD +1 Needle Spires|OGW +1 Plateau|VMA +1 Sacred Foundry|GRN +1 Sphinx of the Steel Wind|EMA +1 Nicol Bolas, Planeswalker|M13 +1 Leovold, Emissary of Trest|UMA +1 Progenitus|MMA +1 Kozilek, Butcher of Truth|UMA +1 Ulamog, the Ceaseless Hunger|BFZ +1 Ulamog, the Infinite Gyre|UMA +1 Emrakul, the Promised End|EMN +1 Emrakul, the Aeons Torn|UMA +1 Karn, Scion of Urza|DOM +1 Karn Liberated|UMA +1 Ugin, the Spirit Dragon|FRF +1 Hangarback Walker|ORI +1 Phyrexian Revoker|M15 +1 Metalworker|UDS +1 Lodestone Golem|MM2 +1 Solemn Simulacrum|M12 +1 Kuldotha Forgemaster|SOM +1 Duplicant|EMA +1 Wurmcoil Engine|SOM +1 Myr Battlesphere|SOM +1 Sundering Titan|A25 +1 Walking Ballista|AER +1 Blightsteel Colossus|MBS +1 Black Lotus|VMA +1 Chrome Mox|EMA +1 Everflowing Chalice|MM2 +1 Lion's Eye Diamond|MIR +1 Lotus Bloom|MMA +1 Lotus Petal|TPR +1 Mana Crypt|EMA +1 Mox Diamond|TPR +1 Mox Emerald|VMA +1 Mox Jet|VMA +1 Mox Pearl|VMA +1 Mox Ruby|VMA +1 Mox Sapphire|VMA +1 Mana Vault|UMA +1 Relic of Progenitus|EMA +1 Sensei's Divining Top|EMA +1 Skullclamp|VMA +1 Sol Ring|VMA +1 Azorius Signet|MM3 +1 Boros Signet|MM3 +1 Dimir Signet|MM3 +1 Golgari Signet|MM3 +1 Grim Monolith|ULG +1 Gruul Signet|MM3 +1 Izzet Signet|MM3 +1 Lightning Greaves|MRD +1 Orzhov Signet|MM3 +1 Pentad Prism|5DN +1 Rakdos Signet|MM3 +1 Selesnya Signet|MM3 +1 Shrine of Burning Rage|NPH +1 Simic Signet|MM3 +1 Smuggler's Copter|KLD +1 Sorcerous Spyglass|XLN +1 Umezawa's Jitte|BOK +1 Winter Orb|EMA +1 Basalt Monolith|3ED +1 Coalition Relic|A25 +1 Crucible of Worlds|M19 +1 Oblivion Stone|IMA +1 Sword of Body and Mind|SOM +1 Sword of Feast and Famine|MBS +1 Sword of Fire and Ice|MMA +1 Sword of Light and Shadow|MMA +1 Sword of War and Peace|NPH +1 Tangle Wire|NMS +1 Vedalken Shackles|MMA +1 Worn Powerstone|EMA +1 Coercive Portal|VMA +1 Smokestack|VMA +1 Thran Dynamo|IMA +1 Batterskull|NPH +1 Gilded Lotus|DOM +1 Memory Jar|VMA +1 Mindslaver|SOM +1 Academy Ruins|MMA +1 Ancient Tomb|UMA +1 Bazaar of Baghdad|VMA +1 Field of Ruin|XLN +1 Library of Alexandria|VMA +1 Mana Confluence|JOU +1 Maze of Ith|EMA +1 Mishra's Factory|A25 +1 Mishra's Workshop|ATQ +1 Mutavault|M14 +1 Nykthos, Shrine to Nyx|THS +1 Rishadan Port|A25 +1 Strip Mine|VMA +1 Wasteland|EMA diff --git a/forge-gui/res/cube/MTGO Vintage Cube June 2016.dck b/forge-gui/res/cube/MTGO Vintage Cube June 2016.dck index aefc6025cd2..cb39a3c29d9 100644 --- a/forge-gui/res/cube/MTGO Vintage Cube June 2016.dck +++ b/forge-gui/res/cube/MTGO Vintage Cube June 2016.dck @@ -10,11 +10,11 @@ Name=MTGO Vintage Cube June 2016 1 Ancestral Recall|VMA 1 Ancestral Vision|IMA 1 Ancient Grudge|MM3 -1 Ancient Tomb|VMA +1 Ancient Tomb|UMA 1 Angel of Serenity|RTR 1 Anguished Unmaking|SOI 1 Animate Dead|EMA -1 Anticipate|BFZ +1 Anticipate|M19 1 Arbor Elf|A25 1 Archangel of Thune|IMA 1 Arid Mesa|MM3 @@ -38,7 +38,7 @@ Name=MTGO Vintage Cube June 2016 1 Beast Within|NPH 1 Birds of Paradise|M12 1 Birthing Pod|NPH -1 Bitterblossom|MM2 +1 Bitterblossom|UMA 1 Black Lotus|VMA 1 Blade Splicer|MM3 1 Blightsteel Colossus|MBS @@ -58,12 +58,12 @@ Name=MTGO Vintage Cube June 2016 1 Brimaz, King of Oreskos|BNG 1 Brimstone Volley|CNS 1 Bring to Light|BFZ -1 Buried Alive|ODY +1 Buried Alive|UMA 1 Burning of Xinye|VMA 1 Burst Lightning|MM2 1 Cabal Ritual|VMA 1 Careful Study|ODY -1 Celestial Colonnade|WWK +1 Celestial Colonnade|UMA 1 Chain Lightning|EMA 1 Chandra, Flamecaller|OGW 1 Chandra, Pyromaster|M15 @@ -82,8 +82,8 @@ Name=MTGO Vintage Cube June 2016 1 Courser of Kruphix|A25 1 Crater's Claws|KTK 1 Craterhoof Behemoth|MM3 -1 Creeping Tar Pit|WWK -1 Crucible of Worlds|10E +1 Creeping Tar Pit|UMA +1 Crucible of Worlds|M19 1 Cryptic Command|IMA 1 Dack Fayden|EMA 1 Damnation|MM3 @@ -97,12 +97,12 @@ Name=MTGO Vintage Cube June 2016 1 Deceiver Exarch|NPH 1 Declaration in Stone|SOI 1 Delver of Secrets|ISD -1 Demonic Tutor|VMA +1 Demonic Tutor|UMA 1 Den Protector|DTK 1 Deranged Hermit|VMA 1 Desecration Demon|MM3 1 Diabolic Edict|A25 -1 Dig Through Time|KTK +1 Dig Through Time|UMA 1 Dimir Signet|MM3 1 Disenchant|A25 1 Disfigure|A25 @@ -115,7 +115,7 @@ Name=MTGO Vintage Cube June 2016 1 Dromoka's Command|DTK 1 Dualcaster Mage|EMA 1 Duplicant|EMA -1 Duress|IMA +1 Duress|M19 1 Edric, Spymaster of Trest|VMA 1 Eidolon of the Great Revel|A25 1 Electrolyze|IMA @@ -126,25 +126,25 @@ Name=MTGO Vintage Cube June 2016 1 Elvish Mystic|M15 1 Emeria Angel|IMA 1 Empty the Warrens|MMA -1 Emrakul, the Aeons Torn|MM2 +1 Emrakul, the Aeons Torn|UMA 1 Enlightened Tutor|EMA -1 Entomb|EMA -1 Eternal Witness|MMA +1 Entomb|UMA +1 Eternal Witness|UMA 1 Eureka|VMA 1 Everflowing Chalice|MM2 1 Exalted Angel|ONS 1 Exquisite Firecraft|ORI 1 Exhume|USG 1 Fact or Fiction|EMA -1 Faith's Fetters|EMA -1 Faithless Looting|EMA +1 Faith's Fetters|UMA +1 Faithless Looting|UMA 1 Falkenrath Gorger|SOI 1 Fastbond|VMA -1 Fauna Shaman|M11 -1 Fiend Hunter|A25 +1 Fauna Shaman|UMA +1 Fiend Hunter|UMA 1 Fiery Confluence 1 Figure of Destiny|MMA -1 Fire // Ice|APC +1 Fire // Ice|UMA 1 Fireblast|VMA 1 Firebolt|EMA 1 Firedrinker Satyr|THS @@ -153,7 +153,7 @@ Name=MTGO Vintage Cube June 2016 1 Flooded Strand|KTK 1 Force of Will|EMA 1 Force Spike|7ED -1 Frantic Search|VMA +1 Frantic Search|UMA 1 Freyalise, Llanowar's Fury 1 Frost Titan|M12 1 Fyndhorn Elves|VMA @@ -167,9 +167,9 @@ Name=MTGO Vintage Cube June 2016 1 Gideon Jura|M12 1 Gideon, Ally of Zendikar|BFZ 1 Gifts Ungiven|MM3 -1 Gilded Lotus|M13 +1 Gilded Lotus|DOM 1 Gitaxian Probe|NPH -1 Glen Elendra Archmage|MMA +1 Glen Elendra Archmage|UMA 1 Go for the Throat|MBS 1 Goblin Dark-Dwellers|OGW 1 Goblin Guide|MM3 @@ -183,9 +183,9 @@ Name=MTGO Vintage Cube June 2016 1 Grim Tutor|S99 1 Griselbrand|MM3 1 Gruul Signet|MM3 -1 Gurmag Angler|FRF +1 Gurmag Angler|UMA 1 Gush|VMA -1 Guttersnipe|IMA +1 Guttersnipe|M19 1 Hallowed Fountain|RTR 1 Hangarback Walker|ORI 1 Harmonize|MM3 @@ -220,20 +220,20 @@ Name=MTGO Vintage Cube June 2016 1 Jackal Pup|A25 1 Joraga Treespeaker|ROE 1 Kalitas, Traitor of Ghet|OGW -1 Karakas|EMA +1 Karakas|UMA 1 Kargan Dragonlord|ROE -1 Karn Liberated|MM2 +1 Karn Liberated|UMA 1 Kiki-Jiki, Mirror Breaker|IMA -1 Kitchen Finks|MMA +1 Kitchen Finks|UMA 1 Knight of the White Orchid|ORI 1 Kolaghan's Command|DTK 1 Koth of the Hammer|SOM -1 Kozilek, Butcher of Truth|MM2 +1 Kozilek, Butcher of Truth|UMA 1 Kozilek, the Great Distortion|OGW 1 Kuldotha Forgemaster|SOM 1 Kytheon, Hero of Akros|ORI 1 Land Tax|4ED -1 Lavaclaw Reaches|WWK +1 Lavaclaw Reaches|UMA 1 Leonin Relic-Warder|MBS 1 Leyline of Sanctity|MM2 1 Library of Alexandria|VMA @@ -242,20 +242,20 @@ Name=MTGO Vintage Cube June 2016 1 Lightning Greaves|MRD 1 Lightning Helix|IMA 1 Lightning Mauler|AVR -1 Lightning Strike|XLN -1 Liliana of the Veil|MM3 +1 Lightning Strike|M19 +1 Liliana of the Veil|UMA 1 Lingering Souls|MM3 1 Linvala, Keeper of Silence|MM3 1 Linvala, the Preserver|OGW 1 Lion's Eye Diamond|MIR 1 Living Death|A25 -1 Llanowar Elves|EMA +1 Llanowar Elves|DOM 1 Lodestone Golem|MM2 1 Looter il-Kor|TSP 1 Lotus Bloom|MMA 1 Lotus Cobra|IMA 1 Lumbering Falls|BFZ -1 Maelstrom Pulse|MMA +1 Maelstrom Pulse|UMA 1 Magma Jet|MM3 1 Magus of the Moon|IMA 1 Magus of the Wheel|A25 @@ -266,7 +266,7 @@ Name=MTGO Vintage Cube June 2016 1 Mana Drain|IMA 1 Mana Leak|IMA 1 Mana Tithe|PLC -1 Mana Vault|VMA +1 Mana Vault|UMA 1 Manic Vandal|M12 1 Mardu Woe-Reaper|FRF 1 Marsh Flats|MM3 @@ -316,7 +316,7 @@ Name=MTGO Vintage Cube June 2016 1 Nezumi Shortfang|CHK 1 Nicol Bolas, Planeswalker|M13 1 Nissa, Worldwaker|M15 -1 Noble Hierarch|MM2 +1 Noble Hierarch|UMA 1 Nykthos, Shrine to Nyx|THS 1 Oath of Druids|TPR 1 Oath of Nissa|OGW @@ -328,7 +328,7 @@ Name=MTGO Vintage Cube June 2016 1 Oracle of Mul Daya|ZEN 1 Orzhov Signet|MM3 1 Outpost Siege|FRF -1 Overgrown Tomb|RTR +1 Overgrown Tomb|GRN 1 Pack Rat|RTR 1 Painful Truths|BFZ 1 Palinchron|VMA @@ -354,27 +354,27 @@ Name=MTGO Vintage Cube June 2016 1 Putrid Imp|VMA 1 Qasali Pridemage|ARB 1 Quicken|M14 -1 Raging Ravine|WWK +1 Raging Ravine|UMA 1 Rakdos Signet|MM3 1 Rakdos's Return|RTR 1 Ral Zarek|DGM 1 Ravages of War|PTK -1 Reanimate|TPR +1 Reanimate|UMA 1 Reckless Bushwhacker|OGW -1 Reclamation Sage|M15 +1 Reclamation Sage|M19 1 Recurring Nightmare|TPR 1 Reflector Mage|OGW 1 Regrowth|A25 1 Remand|MM2 1 Repeal|IMA 1 Restoration Angel|IMA -1 Reveillark|MMA +1 Reveillark|UMA 1 Rift Bolt|IMA 1 Riftwing Cloudskate|MMA 1 Rishadan Port|A25 1 Roast|DTK 1 Rofellos, Llanowar Emissary|VMA -1 Sacred Foundry|GTC +1 Sacred Foundry|GRN 1 Sakura-Tribe Elder|CNS 1 Savannah|VMA 1 Scalding Tarn|MM3 @@ -397,17 +397,17 @@ Name=MTGO Vintage Cube June 2016 1 Shelldock Isle|LRW 1 Sheoldred, Whispering One|IMA 1 Show and Tell|USG -1 Shriekmaw|LRW +1 Shriekmaw|UMA 1 Shrine of Burning Rage|NPH 1 Sidisi, Undead Vizier|DTK -1 Siege-Gang Commander|EMA +1 Siege-Gang Commander|DOM 1 Silverblade Paladin|AVR 1 Simic Signet|MM3 1 Skinrender|SOM 1 Skullclamp|VMA 1 Smash to Smithereens|ORI 1 Smokestack|VMA -1 Snapcaster Mage|MM3 +1 Snapcaster Mage|UMA 1 Sneak Attack|EMA 1 Sol Ring|VMA 1 Soldier of the Pantheon|THS @@ -424,8 +424,8 @@ Name=MTGO Vintage Cube June 2016 1 Spirit of the Labyrinth|BNG 1 Splinter Twin|MM2 1 Staff of Domination -1 Steam Vents|RTR -1 Stirring Wildwood|WWK +1 Steam Vents|GRN +1 Stirring Wildwood|UMA 1 Stomping Ground|GTC 1 Stoneforge Mystic|WWK 1 Stormbreath Dragon|THS @@ -447,9 +447,9 @@ Name=MTGO Vintage Cube June 2016 1 Taiga|VMA 1 Tamiyo, the Moon Sage|AVR 1 Tangle Wire|NMS -1 Tarmogoyf|MM3 +1 Tarmogoyf|UMA 1 Tasigur, the Golden Fang|FRF -1 Temple Garden|RTR +1 Temple Garden|GRN 1 Temple of Abandon|THS 1 Temple of Deceit|THS 1 Temple of Enlightenment|BNG @@ -473,7 +473,7 @@ Name=MTGO Vintage Cube June 2016 1 Thoughtseize|IMA 1 Thragtusk|MM3 1 Thran Dynamo|IMA -1 Through the Breach|CHK +1 Through the Breach|UMA 1 Thrun, the Last Troll|MBS 1 Thundermaw Hellkite|IMA 1 Tidehollow Sculler|MMA @@ -488,7 +488,7 @@ Name=MTGO Vintage Cube June 2016 1 Toxic Deluge|EMA 1 Traverse the Ulvenwald|SOI 1 Treachery|UDS -1 Treasure Cruise|KTK +1 Treasure Cruise|UMA 1 Trinket Mage|SOM 1 Tropical Island|VMA 1 True-Name Nemesis @@ -497,10 +497,10 @@ Name=MTGO Vintage Cube June 2016 1 Turnabout|VMA 1 Ugin, the Spirit Dragon|FRF 1 Ulamog, the Ceaseless Hunger|BFZ -1 Ulamog, the Infinite Gyre|MM2 +1 Ulamog, the Infinite Gyre|UMA 1 Ultimate Price|DTK 1 Umezawa's Jitte|BOK -1 Unburial Rites|MM3 +1 Unburial Rites|UMA 1 Underground Sea|VMA 1 Unexpectedly Absent|EMA 1 Upheaval|VMA @@ -522,7 +522,7 @@ Name=MTGO Vintage Cube June 2016 1 Wandering Fumarole|OGW 1 War Priest of Thune|EMA 1 Wasteland|EMA -1 Watery Grave|GTC +1 Watery Grave|GRN 1 Westvale Abbey|SOI 1 Wheel of Fortune|VMA 1 Whisperwood Elemental|FRF @@ -531,7 +531,7 @@ Name=MTGO Vintage Cube June 2016 1 Winter Orb|EMA 1 Wolfir Silverheart|AVR 1 Wooded Foothills|KTK -1 Woodfall Primus|MMA +1 Woodfall Primus|UMA 1 Worn Powerstone|EMA 1 Wrath of God|EMA 1 Wurmcoil Engine|SOM @@ -539,6 +539,6 @@ Name=MTGO Vintage Cube June 2016 1 Yavimaya Elder|VMA 1 Yawgmoth's Bargain|UDS 1 Yawgmoth's Will|USG -1 Young Pyromancer|EMA +1 Young Pyromancer|UMA 1 Zealous Conscripts|MM3 1 Zurgo Bellstriker|DTK diff --git a/forge-gui/res/cube/MTGO Vintage Cube June 2017.dck b/forge-gui/res/cube/MTGO Vintage Cube June 2017.dck index 7a7aefa3b26..06371fed022 100644 --- a/forge-gui/res/cube/MTGO Vintage Cube June 2017.dck +++ b/forge-gui/res/cube/MTGO Vintage Cube June 2017.dck @@ -9,12 +9,12 @@ Name=MTGO Vintage Cube June 2017 1 Ancestral Recall|VMA 1 Ancestral Vision|IMA 1 Ancient Grudge|MM3 -1 Ancient Tomb|VMA +1 Ancient Tomb|UMA 1 Angel of Sanctions|AKH 1 Angel of Serenity|RTR 1 Anguished Unmaking|SOI 1 Animate Dead|EMA -1 Anticipate|BFZ +1 Anticipate|M19 1 Arbor Elf|A25 1 Archangel of Thune|IMA 1 Arid Mesa|MM3 @@ -38,7 +38,7 @@ Name=MTGO Vintage Cube June 2017 1 Bazaar of Baghdad|VMA 1 Beast Within|NPH 1 Birds of Paradise|M12 -1 Bitterblossom|MM2 +1 Bitterblossom|UMA 1 Black Lotus|VMA 1 Blackcleave Cliffs|SOM 1 Blade Splicer|MM3 @@ -61,13 +61,13 @@ Name=MTGO Vintage Cube June 2017 1 Brimaz, King of Oreskos|BNG 1 Brimstone Volley|CNS 1 Bring to Light|BFZ -1 Buried Alive|ODY +1 Buried Alive|UMA 1 Burning of Xinye|VMA 1 Burst Lightning|MM2 1 Cabal Ritual|VMA 1 Careful Study|ODY 1 Cast Out|AKH -1 Celestial Colonnade|WWK +1 Celestial Colonnade|UMA 1 Chain Lightning|EMA 1 Chandra, Flamecaller|OGW 1 Chandra, Pyromaster|M15 @@ -89,8 +89,8 @@ Name=MTGO Vintage Cube June 2017 1 Courser of Kruphix|A25 1 Crater's Claws|KTK 1 Craterhoof Behemoth|MM3 -1 Creeping Tar Pit|WWK -1 Crucible of Worlds|10E +1 Creeping Tar Pit|UMA +1 Crucible of Worlds|M19 1 Cryptic Command|IMA 1 Dack Fayden|EMA 1 Damnation|MM3 @@ -105,12 +105,12 @@ Name=MTGO Vintage Cube June 2017 1 Deceiver Exarch|NPH 1 Declaration in Stone|SOI 1 Delver of Secrets|ISD -1 Demonic Tutor|VMA +1 Demonic Tutor|UMA 1 Den Protector|DTK 1 Deranged Hermit|VMA 1 Desecration Demon|MM3 1 Diabolic Edict|A25 -1 Dig Through Time|KTK +1 Dig Through Time|UMA 1 Dimir Signet|MM3 1 Disenchant|A25 1 Dismember|MM2 @@ -123,7 +123,7 @@ Name=MTGO Vintage Cube June 2017 1 Dromoka's Command|DTK 1 Dualcaster Mage|EMA 1 Duplicant|EMA -1 Duress|IMA +1 Duress|M19 1 Edric, Spymaster of Trest|VMA 1 Eidolon of the Great Revel|A25 1 Electrolyze|IMA @@ -134,26 +134,26 @@ Name=MTGO Vintage Cube June 2017 1 Elvish Mystic|M15 1 Emeria Angel|IMA 1 Empty the Warrens|MMA -1 Emrakul, the Aeons Torn|MM2 +1 Emrakul, the Aeons Torn|UMA 1 Emrakul, the Promised End|EMN 1 Enlightened Tutor|EMA -1 Entomb|EMA -1 Eternal Witness|MMA +1 Entomb|UMA +1 Eternal Witness|UMA 1 Eureka|VMA 1 Everflowing Chalice|MM2 1 Exalted Angel|ONS 1 Exhume|USG 1 Exquisite Firecraft|ORI 1 Fact or Fiction|EMA -1 Faithless Looting|EMA +1 Faithless Looting|UMA 1 Falkenrath Gorger|SOI 1 Fastbond|VMA 1 Fatal Push|AER -1 Fauna Shaman|M11 -1 Fiend Hunter|A25 +1 Fauna Shaman|UMA +1 Fiend Hunter|UMA 1 Fiery Confluence 1 Figure of Destiny|MMA -1 Fire // Ice|APC +1 Fire // Ice|UMA 1 Fireblast|VMA 1 Firebolt|EMA 1 Firedrinker Satyr|THS @@ -162,7 +162,7 @@ Name=MTGO Vintage Cube June 2017 1 Flooded Strand|KTK 1 Force Spike|7ED 1 Force of Will|EMA -1 Frantic Search|VMA +1 Frantic Search|UMA 1 Freyalise, Llanowar's Fury 1 Frost Titan|M12 1 Fyndhorn Elves|VMA @@ -177,9 +177,9 @@ Name=MTGO Vintage Cube June 2017 1 Gideon of the Trials|AKH 1 Gideon, Ally of Zendikar|BFZ 1 Gifts Ungiven|MM3 -1 Gilded Lotus|M13 +1 Gilded Lotus|DOM 1 Gitaxian Probe|NPH -1 Glen Elendra Archmage|MMA +1 Glen Elendra Archmage|UMA 1 Go for the Throat|MBS 1 Goblin Dark-Dwellers|OGW 1 Goblin Guide|MM3 @@ -193,9 +193,9 @@ Name=MTGO Vintage Cube June 2017 1 Grim Tutor|S99 1 Griselbrand|MM3 1 Gruul Signet|MM3 -1 Gurmag Angler|FRF +1 Gurmag Angler|UMA 1 Gush|VMA -1 Guttersnipe|IMA +1 Guttersnipe|M19 1 Hallowed Fountain|RTR 1 Hangarback Walker|ORI 1 Harmonize|MM3 @@ -229,21 +229,21 @@ Name=MTGO Vintage Cube June 2017 1 Jackal Pup|A25 1 Joraga Treespeaker|ROE 1 Kalitas, Traitor of Ghet|OGW -1 Karakas|EMA +1 Karakas|UMA 1 Kargan Dragonlord|ROE -1 Karn Liberated|MM2 +1 Karn Liberated|UMA 1 Kiki-Jiki, Mirror Breaker|IMA -1 Kitchen Finks|MMA +1 Kitchen Finks|UMA 1 Knight of the White Orchid|ORI 1 Kolaghan's Command|DTK 1 Koth of the Hammer|SOM -1 Kozilek, Butcher of Truth|MM2 +1 Kozilek, Butcher of Truth|UMA 1 Kuldotha Forgemaster|SOM 1 Kytheon, Hero of Akros|ORI 1 Land Tax|4ED -1 Lavaclaw Reaches|WWK +1 Lavaclaw Reaches|UMA 1 Leonin Relic-Warder|MBS -1 Leovold, Emissary of Trest +1 Leovold, Emissary of Trest|UMA 1 Leyline of Sanctity|MM2 1 Library of Alexandria|VMA 1 Lifebane Zombie|M14 @@ -251,21 +251,21 @@ Name=MTGO Vintage Cube June 2017 1 Lightning Greaves|MRD 1 Lightning Helix|IMA 1 Lightning Mauler|AVR -1 Lightning Strike|XLN -1 Liliana of the Veil|MM3 +1 Lightning Strike|M19 +1 Liliana of the Veil|UMA 1 Liliana, Death's Majesty|AKH 1 Lingering Souls|MM3 1 Linvala, Keeper of Silence|MM3 1 Linvala, the Preserver|OGW 1 Lion's Eye Diamond|MIR 1 Living Death|A25 -1 Llanowar Elves|EMA +1 Llanowar Elves|DOM 1 Lodestone Golem|MM2 1 Looter il-Kor|TSP 1 Lotus Bloom|MMA 1 Lotus Cobra|IMA 1 Lumbering Falls|BFZ -1 Maelstrom Pulse|MMA +1 Maelstrom Pulse|UMA 1 Magma Jet|MM3 1 Magus of the Moon|IMA 1 Magus of the Wheel|A25 @@ -276,7 +276,7 @@ Name=MTGO Vintage Cube June 2017 1 Mana Drain|IMA 1 Mana Leak|IMA 1 Mana Tithe|PLC -1 Mana Vault|VMA +1 Mana Vault|UMA 1 Managorger Hydra|ORI 1 Manglehorn|AKH 1 Manic Vandal|M12 @@ -327,7 +327,7 @@ Name=MTGO Vintage Cube June 2017 1 Nezumi Shortfang|CHK 1 Nicol Bolas, Planeswalker|M13 1 Nissa, Worldwaker|M15 -1 Noble Hierarch|MM2 +1 Noble Hierarch|UMA 1 Nykthos, Shrine to Nyx|THS 1 Oath of Druids|TPR 1 Oath of Nissa|OGW @@ -338,7 +338,7 @@ Name=MTGO Vintage Cube June 2017 1 Opposition|7ED 1 Oracle of Mul Daya|ZEN 1 Orzhov Signet|MM3 -1 Overgrown Tomb|RTR +1 Overgrown Tomb|GRN 1 Pack Rat|RTR 1 Painful Truths|BFZ 1 Palinchron|VMA @@ -362,15 +362,15 @@ Name=MTGO Vintage Cube June 2017 1 Progenitus|MMA 1 Putrid Imp|VMA 1 Qasali Pridemage|ARB -1 Raging Ravine|WWK +1 Raging Ravine|UMA 1 Rakdos Signet|MM3 1 Rakdos's Return|RTR 1 Ral Zarek|DGM 1 Ravages of War|PTK 1 Razorverge Thicket|SOM -1 Reanimate|TPR +1 Reanimate|UMA 1 Reckless Bushwhacker|OGW -1 Reclamation Sage|M15 +1 Reclamation Sage|M19 1 Recruiter of the Guard 1 Recurring Nightmare|TPR 1 Reflector Mage|OGW @@ -378,13 +378,13 @@ Name=MTGO Vintage Cube June 2017 1 Remand|MM2 1 Repeal|IMA 1 Restoration Angel|IMA -1 Reveillark|MMA +1 Reveillark|UMA 1 Rift Bolt|IMA 1 Riftwing Cloudskate|MMA 1 Rishadan Port|A25 1 Rishkar, Peema Renegade|AER 1 Rofellos, Llanowar Emissary|VMA -1 Sacred Foundry|GTC +1 Sacred Foundry|GRN 1 Sakura-Tribe Elder|CNS 1 Savannah|VMA 1 Scalding Tarn|MM3 @@ -408,10 +408,10 @@ Name=MTGO Vintage Cube June 2017 1 Shelldock Isle|LRW 1 Sheoldred, Whispering One|IMA 1 Show and Tell|USG -1 Shriekmaw|LRW +1 Shriekmaw|UMA 1 Shrine of Burning Rage|NPH 1 Sidisi, Undead Vizier|DTK -1 Siege-Gang Commander|EMA +1 Siege-Gang Commander|DOM 1 Silverblade Paladin|AVR 1 Simic Signet|MM3 1 Skinrender|SOM @@ -419,7 +419,7 @@ Name=MTGO Vintage Cube June 2017 1 Smash to Smithereens|ORI 1 Smokestack|VMA 1 Smuggler's Copter|KLD -1 Snapcaster Mage|MM3 +1 Snapcaster Mage|UMA 1 Sneak Attack|EMA 1 Sol Ring|VMA 1 Soldier of the Pantheon|THS @@ -436,8 +436,8 @@ Name=MTGO Vintage Cube June 2017 1 Spirebluff Canal|KLD 1 Spirit of the Labyrinth|BNG 1 Splinter Twin|MM2 -1 Steam Vents|RTR -1 Stirring Wildwood|WWK +1 Steam Vents|GRN +1 Stirring Wildwood|UMA 1 Stomping Ground|GTC 1 Stoneforge Mystic|WWK 1 Stormbreath Dragon|THS @@ -460,9 +460,9 @@ Name=MTGO Vintage Cube June 2017 1 Taiga|VMA 1 Tamiyo, the Moon Sage|AVR 1 Tangle Wire|NMS -1 Tarmogoyf|MM3 +1 Tarmogoyf|UMA 1 Tasigur, the Golden Fang|FRF -1 Temple Garden|RTR +1 Temple Garden|GRN 1 Tendrils of Agony|VMA 1 Terastodon|CNS 1 Terminate|MM3 @@ -475,7 +475,7 @@ Name=MTGO Vintage Cube June 2017 1 Thoughtseize|IMA 1 Thragtusk|MM3 1 Thran Dynamo|IMA -1 Through the Breach|CHK +1 Through the Breach|UMA 1 Thrun, the Last Troll|MBS 1 Thundermaw Hellkite|IMA 1 Tidehollow Sculler|MMA @@ -490,7 +490,7 @@ Name=MTGO Vintage Cube June 2017 1 Toxic Deluge|EMA 1 Traverse the Ulvenwald|SOI 1 Treachery|UDS -1 Treasure Cruise|KTK +1 Treasure Cruise|UMA 1 Trinket Mage|SOM 1 Tropical Island|VMA 1 True-Name Nemesis @@ -499,10 +499,10 @@ Name=MTGO Vintage Cube June 2017 1 Turnabout|VMA 1 Ugin, the Spirit Dragon|FRF 1 Ulamog, the Ceaseless Hunger|BFZ -1 Ulamog, the Infinite Gyre|MM2 +1 Ulamog, the Infinite Gyre|UMA 1 Ultimate Price|DTK 1 Umezawa's Jitte|BOK -1 Unburial Rites|MM3 +1 Unburial Rites|UMA 1 Underground Sea|VMA 1 Unexpectedly Absent|EMA 1 Upheaval|VMA @@ -524,14 +524,14 @@ Name=MTGO Vintage Cube June 2017 1 Wall of Roots|IMA 1 Wandering Fumarole|OGW 1 Wasteland|EMA -1 Watery Grave|GTC +1 Watery Grave|GRN 1 Westvale Abbey|SOI 1 Wheel of Fortune|VMA 1 Wildfire|MM2 1 Windswept Heath|KTK 1 Winter Orb|EMA 1 Wooded Foothills|KTK -1 Woodfall Primus|MMA +1 Woodfall Primus|UMA 1 Worn Powerstone|EMA 1 Wrath of God|EMA 1 Wurmcoil Engine|SOM @@ -539,6 +539,6 @@ Name=MTGO Vintage Cube June 2017 1 Yavimaya Elder|VMA 1 Yawgmoth's Bargain|UDS 1 Yawgmoth's Will|USG -1 Young Pyromancer|EMA +1 Young Pyromancer|UMA 1 Zealous Conscripts|MM3 1 Zurgo Bellstriker|DTK diff --git a/forge-gui/res/cube/MTGO Vintage Cube June 2018.dck b/forge-gui/res/cube/MTGO Vintage Cube June 2018.dck new file mode 100644 index 00000000000..7a3b5f8b4bf --- /dev/null +++ b/forge-gui/res/cube/MTGO Vintage Cube June 2018.dck @@ -0,0 +1,542 @@ +[metadata] +Name=MTGO Vintage Cube June 2018 +[main] +1 Abbot of Keral Keep|ORI +1 Abrade|HOU +1 Abrupt Decay|MM3 +1 Academy Ruins|MMA +1 Acidic Slime|M13 +1 Adanto Vanguard|XLN +1 Ajani Vengeant|ALA +1 Ancestral Recall|VMA +1 Ancestral Vision|IMA +1 Ancient Grudge|MM3 +1 Ancient Stirrings|A25 +1 Ancient Tomb|UMA +1 Angel of Invention|KLD +1 Angel of Sanctions|AKH +1 Angel of Serenity|RTR +1 Anguished Unmaking|SOI +1 Animate Dead|EMA +1 Arbor Elf|A25 +1 Archangel of Thune|IMA +1 Arguel's Blood Fast|XLN +1 Arid Mesa|MM3 +1 Armageddon|A25 +1 Ashiok, Nightmare Weaver|THS +1 Augur of Bolas|MM3 +1 Avacyn's Pilgrim|MM3 +1 Avalanche Riders|TSB +1 Avenger of Zendikar|WWK +1 Awakening Zone|ROE +1 Azorius Signet|MM3 +1 Badlands|VMA +1 Balance|EMA +1 Baleful Strix|EMA +1 Baneslayer Angel|M11 +1 Banisher Priest|M14 +1 Banishing Light|JOU +1 Basalt Monolith|3ED +1 Batterskull|NPH +1 Bayou|VMA +1 Bazaar of Baghdad|VMA +1 Beast Within|NPH +1 Benalish Marshal|DOM +1 Birds of Paradise|M12 +1 Bitterblossom|UMA +1 Black Lotus|VMA +1 Blackcleave Cliffs|SOM +1 Blade Splicer|MM3 +1 Blightsteel Colossus|MBS +1 Blink of an Eye|DOM +1 Blood Crypt|RTR +1 Bloodbraid Elf|EMA +1 Bloodstained Mire|KTK +1 Blooming Marsh|KLD +1 Bone Shredder|ULG +1 Bonfire of the Damned|MM3 +1 Boros Signet|MM3 +1 Botanical Sanctum|KLD +1 Braids, Cabal Minion|EMA +1 Brain Freeze|VMA +1 Brain Maggot|JOU +1 Brainstorm|A25 +1 Breeding Pool|GTC +1 Bribery|8ED +1 Brimaz, King of Oreskos|BNG +1 Bring to Light|BFZ +1 Buried Alive|UMA +1 Burning of Xinye|VMA +1 Burst Lightning|MM2 +1 Cabal Ritual|VMA +1 Cast Down|DOM +1 Cast Out|AKH +1 Celestial Colonnade|UMA +1 Chain Lightning|EMA +1 Chandra, Flamecaller|OGW +1 Chandra, Pyromaster|M15 +1 Chandra, Torch of Defiance|KLD +1 Channel|IMA +1 Char|RAV +1 Chart a Course|XLN +1 Chrome Mox|EMA +1 Coalition Relic|A25 +1 Coercive Portal|VMA +1 Commit // Memory|AKH +1 Compulsive Research|MM3 +1 Concealed Courtyard|KLD +1 Consecrated Sphinx|IMA +1 Control Magic|EMA +1 Copperline Gorge|SOM +1 Corpse Dance|TPR +1 Council's Judgment|CNS +1 Counterspell|A25 +1 Courser of Kruphix|A25 +1 Craterhoof Behemoth|MM3 +1 Creeping Tar Pit|UMA +1 Crucible of Worlds|M19 +1 Cryptic Command|IMA +1 Dack Fayden|EMA +1 Damnation|MM3 +1 Daretti, Scrap Savant +1 Dark Confidant|MM2 +1 Dark Petition|ORI +1 Dark Ritual|A25 +1 Darkslick Shores|SOM +1 Day of Judgment|M12 +1 Daze|EMA +1 Deathrite Shaman|EMA +1 Deceiver Exarch|NPH +1 Declaration in Stone|SOI +1 Delver of Secrets|ISD +1 Demonic Tutor|UMA +1 Demonlord Belzenlok|DOM +1 Den Protector|DTK +1 Deranged Hermit|VMA +1 Desperate Ritual|UMA +1 Dig Through Time|UMA +1 Dimir Signet|MM3 +1 Dire Fleet Daredevil|RIX +1 Disenchant|A25 +1 Dismember|MM2 +1 Dissenter's Deliverance|AKH +1 Dragonlord Atarka|DTK +1 Dragonlord Dromoka|DTK +1 Dragonlord Ojutai|DTK +1 Dreadbore|RTR +1 Dualcaster Mage|EMA +1 Duplicant|EMA +1 Duress|M19 +1 Edric, Spymaster of Trest|VMA +1 Eidolon of the Great Revel|A25 +1 Electrolyze|IMA +1 Elesh Norn, Grand Cenobite|IMA +1 Elspeth, Knight-Errant|MMA +1 Elspeth, Sun's Champion|THS +1 Elves of Deep Shadow|RAV +1 Elvish Mystic|M15 +1 Emeria Angel|IMA +1 Empty the Warrens|MMA +1 Emrakul, the Aeons Torn|UMA +1 Emrakul, the Promised End|EMN +1 Enlightened Tutor|EMA +1 Entomb|UMA +1 Eternal Witness|UMA +1 Eureka|VMA +1 Everflowing Chalice|MM2 +1 Exhume|USG +1 Exquisite Firecraft|ORI +1 Fact or Fiction|EMA +1 Faithless Looting|UMA +1 Falkenrath Gorger|SOI +1 Fastbond|VMA +1 Fatal Push|AER +1 Fauna Shaman|UMA +1 Field of Ruin|XLN +1 Fiend Hunter|UMA +1 Fiery Confluence +1 Figure of Destiny|MMA +1 Fire // Ice|UMA +1 Fireblast|VMA +1 Firebolt|EMA +1 Firedrinker Satyr|THS +1 Flametongue Kavu|VMA +1 Flickerwisp|MM3 +1 Flooded Strand|KTK +1 Force Spike|7ED +1 Force of Will|EMA +1 Frantic Search|UMA +1 Freyalise, Llanowar's Fury +1 Frost Titan|M12 +1 Fyndhorn Elves|VMA +1 Gaea's Cradle|USG +1 Garruk Relentless|ISD +1 Garruk Wildspeaker|M11 +1 Garruk, Primal Hunter|M13 +1 Geist of Saint Traft|ISD +1 Genesis Wave|IMA +1 Gideon Jura|M12 +1 Gideon of the Trials|AKH +1 Gideon, Ally of Zendikar|BFZ +1 Gifts Ungiven|MM3 +1 Gilded Lotus|DOM +1 Gitaxian Probe|NPH +1 Glen Elendra Archmage|UMA +1 Glorybringer|AKH +1 Go for the Throat|MBS +1 Goblin Chainwhirler|DOM +1 Goblin Dark-Dwellers|OGW +1 Goblin Guide|MM3 +1 Goblin Welder|ULG +1 Godless Shrine|GTC +1 Golgari Signet|MM3 +1 Gonti, Lord of Luxury|KLD +1 Grave Titan|M12 +1 Green Sun's Zenith|EMA +1 Grim Lavamancer|M12 +1 Grim Monolith|ULG +1 Grim Tutor|S99 +1 Griselbrand|MM3 +1 Gruul Signet|MM3 +1 Gush|VMA +1 Hallowed Fountain|RTR +1 Hangarback Walker|ORI +1 Harmonize|MM3 +1 Hazoret the Fervent|AKH +1 Heartbeat of Spring|CHK +1 Hellrider|MM3 +1 Hero of Bladehold|MBS +1 Hero's Downfall|THS +1 High Tide|VMA +1 Hissing Quagmire|OGW +1 History of Benalia|DOM +1 Honor of the Pure|M12 +1 Hostage Taker|XLN +1 Huntmaster of the Fells|DKA +1 Hymn to Tourach|EMA +1 Hypnotic Specter|M10 +1 Imperial Recruiter|A25 +1 Imperial Seal|PTK +1 Impulse|VIS +1 Incinerate|M12 +1 Inferno Titan|M12 +1 Inkwell Leviathan|EMA +1 Inquisition of Kozilek|MM3 +1 Inspiring Vantage|KLD +1 Iona, Shield of Emeria|MM2 +1 Izzet Charm|MM3 +1 Izzet Signet|MM3 +1 Jace Beleren|M11 +1 Jace, Architect of Thought|RTR +1 Jace, Vryn's Prodigy|ORI +1 Jace, the Mind Sculptor|VMA +1 Jackal Pup|A25 +1 Jadelight Ranger|RIX +1 Jhoira, Weatherlight Captain|DOM +1 Joraga Treespeaker|ROE +1 Karakas|UMA +1 Karn Liberated|UMA +1 Karn, Scion of Urza|DOM +1 Kiki-Jiki, Mirror Breaker|IMA +1 Kitchen Finks|UMA +1 Kitesail Freebooter|XLN +1 Kolaghan's Command|DTK +1 Koth of the Hammer|SOM +1 Kozilek, Butcher of Truth|UMA +1 Kuldotha Forgemaster|SOM +1 Kytheon, Hero of Akros|ORI +1 Land Tax|4ED +1 Lavaclaw Reaches|UMA +1 Legion's Landing|XLN +1 Leonin Relic-Warder|MBS +1 Leovold, Emissary of Trest|UMA +1 Leyline of Sanctity|MM2 +1 Library of Alexandria|VMA +1 Lightning Bolt|A25 +1 Lightning Greaves|MRD +1 Lightning Helix|IMA +1 Lightning Strike|M19 +1 Liliana of the Veil|UMA +1 Liliana, Death's Majesty|AKH +1 Lingering Souls|MM3 +1 Linvala, Keeper of Silence|MM3 +1 Lion's Eye Diamond|MIR +1 Living Death|A25 +1 Llanowar Elves|DOM +1 Lodestone Golem|MM2 +1 Looter il-Kor|TSP +1 Lotus Bloom|MMA +1 Lotus Cobra|IMA +1 Lotus Petal|TPR +1 Lumbering Falls|BFZ +1 Lyra Dawnbringer|DOM +1 Maelstrom Pulse|UMA +1 Magma Jet|MM3 +1 Magus of the Moon|IMA +1 Makeshift Mannequin|LRW +1 Mana Confluence|JOU +1 Mana Crypt|EMA +1 Mana Drain|IMA +1 Mana Flare|5ED +1 Mana Leak|IMA +1 Mana Tithe|PLC +1 Mana Vault|UMA +1 Manglehorn|AKH +1 Manic Vandal|M12 +1 Marsh Flats|MM3 +1 Massacre Wurm|MBS +1 Master of the Wild Hunt|A25 +1 Maze of Ith|EMA +1 Memory Jar|VMA +1 Mesmeric Fiend|A25 +1 Metalworker|UDS +1 Mind Twist|4ED +1 Mind's Desire|SCG +1 Mindslaver|SOM +1 Mirari's Wake|CNS +1 Mirran Crusader|MM2 +1 Mishra's Factory|A25 +1 Mishra's Workshop|ATQ +1 Misty Rainforest|MM3 +1 Mizzium Mortars|MM3 +1 Moat|LEG +1 Monastery Mentor|FRF +1 Monastery Swiftspear|IMA +1 Mother of Runes|EMA +1 Mox Diamond|TPR +1 Mox Emerald|VMA +1 Mox Jet|VMA +1 Mox Pearl|VMA +1 Mox Ruby|VMA +1 Mox Sapphire|VMA +1 Mulldrifter|MM2 +1 Murderous Cut|KTK +1 Mutavault|M14 +1 Myr Battlesphere|SOM +1 Mystic Confluence +1 Mystic Snake|A25 +1 Mystical Tutor|EMA +1 Nahiri, the Harbinger|SOI +1 Natural Order|EMA +1 Nature's Claim|IMA +1 Necromancy|VIS +1 Necropotence|IMA +1 Needle Spires|OGW +1 Nekrataal|EMA +1 Nevinyrral's Disk|EMA +1 Nezumi Graverobber|CHK +1 Nezumi Shortfang|CHK +1 Nicol Bolas, Planeswalker|M13 +1 Nissa, Worldwaker|M15 +1 Noble Hierarch|UMA +1 Noxious Gearhulk|KLD +1 Nykthos, Shrine to Nyx|THS +1 Oath of Druids|TPR +1 Oath of Nissa|OGW +1 Oblivion Ring|MM2 +1 Olivia Voldaren|MM3 +1 Oona's Prowler|LRW +1 Ophiomancer +1 Opposition|7ED +1 Oracle of Mul Daya|ZEN +1 Orzhov Signet|MM3 +1 Overgrown Tomb|GRN +1 Pack Rat|RTR +1 Painful Truths|BFZ +1 Palinchron|VMA +1 Parallax Wave|VMA +1 Path to Exile|MM3 +1 Pentad Prism|5DN +1 Pernicious Deed|A25 +1 Pestermite|MMA +1 Phantasmal Image|MM3 +1 Phyrexian Metamorph|NPH +1 Phyrexian Revoker|M15 +1 Plateau|VMA +1 Polluted Delta|KTK +1 Polukranos, World Eater|THS +1 Ponder|M12 +1 Porcelain Legionnaire|NPH +1 Preordain|M11 +1 Primal Command|MM3 +1 Primeval Titan|IMA +1 Progenitus|MMA +1 Putrid Imp|VMA +1 Pyretic Ritual|M11 +1 Qasali Pridemage|ARB +1 Raging Ravine|UMA +1 Rakdos Signet|MM3 +1 Rakdos's Return|RTR +1 Ravages of War|PTK +1 Ravenous Chupacabra|A25 +1 Razorverge Thicket|SOM +1 Reanimate|UMA +1 Reclamation Sage|M19 +1 Recruiter of the Guard +1 Recurring Nightmare|TPR +1 Regrowth|A25 +1 Rekindling Phoenix|RIX +1 Remand|MM2 +1 Repeal|IMA +1 Restoration Angel|IMA +1 Reveillark|UMA +1 Rift Bolt|IMA +1 Riftwing Cloudskate|MMA +1 Rishadan Port|A25 +1 Rishkar, Peema Renegade|AER +1 Rite of Flame|CSP +1 Rofellos, Llanowar Emissary|VMA +1 Sacred Foundry|GRN +1 Sakura-Tribe Elder|CNS +1 Savannah|VMA +1 Scalding Tarn|MM3 +1 Scavenging Ooze|MM3 +1 Scrubland|VMA +1 Seachrome Coast|SOM +1 Search for Azcanta|XLN +1 Search for Tomorrow|IMA +1 Searing Spear|M13 +1 Seething Song|9ED +1 Selesnya Signet|MM3 +1 Selfless Spirit|EMN +1 Sensei's Divining Top|EMA +1 Shallow Grave|MIR +1 Shambling Vent|BFZ +1 Shardless Agent|EMA +1 Shelldock Isle|LRW +1 Sheoldred, Whispering One|IMA +1 Show and Tell|USG +1 Shriekmaw|UMA +1 Shrine of Burning Rage|NPH +1 Siege-Gang Commander|DOM +1 Silverblade Paladin|AVR +1 Simic Signet|MM3 +1 Skullclamp|VMA +1 Skymarcher Aspirant|RIX +1 Smokestack|VMA +1 Smuggler's Copter|KLD +1 Snapcaster Mage|UMA +1 Sneak Attack|EMA +1 Sol Ring|VMA +1 Solemn Simulacrum|M12 +1 Song of the Dryads +1 Sorcerous Spyglass|XLN +1 Soulfire Grand Master|FRF +1 Sower of Temptation|LRW +1 Spear of Heliod|THS +1 Spectral Procession|MM2 +1 Spell Pierce|XLN +1 Spellskite|MM2 +1 Sphinx of the Steel Wind|EMA +1 Sphinx's Revelation|MM3 +1 Spirebluff Canal|KLD +1 Splinter Twin|MM2 +1 Steam Vents|GRN +1 Stirring Wildwood|UMA +1 Stomping Ground|GTC +1 Stoneforge Mystic|WWK +1 Stormbreath Dragon|THS +1 Strip Mine|VMA +1 Student of Warfare|ROE +1 Sulfuric Vortex|EMA +1 Sun Titan|M12 +1 Sundering Titan|A25 +1 Supreme Verdict|IMA +1 Survival of the Fittest|TPR +1 Sweltering Suns|AKH +1 Sword of Body and Mind|SOM +1 Sword of Feast and Famine|MBS +1 Sword of Fire and Ice|MMA +1 Sword of Light and Shadow|MMA +1 Sword of War and Peace|NPH +1 Swords to Plowshares|A25 +1 Sylvan Caryatid|THS +1 Sylvan Library|EMA +1 Taiga|VMA +1 Tamiyo, the Moon Sage|AVR +1 Tangle Wire|NMS +1 Tarmogoyf|UMA +1 Tasigur, the Golden Fang|FRF +1 Teferi, Hero of Dominaria|DOM +1 Temple Garden|GRN +1 Tendrils of Agony|VMA +1 Terastodon|CNS +1 Terminate|MM3 +1 Tezzeret the Seeker|MM2 +1 Tezzeret, Agent of Bolas|MBS +1 Thalia, Guardian of Thraben|A25 +1 The Abyss|LEG +1 The Scarab God|HOU +1 Thing in the Ice|SOI +1 Thirst for Knowledge|MMA +1 Thoughtseize|IMA +1 Thragtusk|MM3 +1 Thran Dynamo|IMA +1 Thrashing Brontodon|RIX +1 Through the Breach|UMA +1 Thrun, the Last Troll|MBS +1 Thundermaw Hellkite|IMA +1 Tidehollow Sculler|MMA +1 Time Spiral|USG +1 Time Walk|VMA +1 Timely Reinforcements|M12 +1 Timetwister|VMA +1 Tinker|ULG +1 Tolarian Academy|VMA +1 Tooth and Nail|MMA +1 Torrential Gearhulk|KLD +1 Toxic Deluge|EMA +1 Treachery|UDS +1 Treasure Cruise|UMA +1 Trinket Mage|SOM +1 Tropical Island|VMA +1 True-Name Nemesis +1 Trygon Predator|EMA +1 Tundra|VMA +1 Turnabout|VMA +1 Ugin, the Spirit Dragon|FRF +1 Ulamog, the Ceaseless Hunger|BFZ +1 Ulamog, the Infinite Gyre|UMA +1 Ultimate Price|DTK +1 Umezawa's Jitte|BOK +1 Unburial Rites|UMA +1 Underground Sea|VMA +1 Unexpectedly Absent|EMA +1 Upheaval|VMA +1 Urborg, Tomb of Yawgmoth|M15 +1 Vampire Nighthawk|MM3 +1 Vampiric Tutor|EMA +1 Vedalken Shackles|MMA +1 Vendilion Clique|A25 +1 Venser, Shaper Savant|MM3 +1 Verdant Catacombs|MM3 +1 Verdurous Gearhulk|KLD +1 Vindicate|A25 +1 Voice of Resurgence|MM3 +1 Volcanic Island|VMA +1 Vraska's Contempt|XLN +1 Vraska, Relic Seeker|XLN +1 Walking Ballista|AER +1 Wall of Blossoms|TPR +1 Wall of Omens|EMA +1 Wall of Roots|IMA +1 Wandering Fumarole|OGW +1 Wasteland|EMA +1 Watery Grave|GRN +1 Wear // Tear|DGM +1 Wheel of Fortune|VMA +1 Wildfire|MM2 +1 Windswept Heath|KTK +1 Winter Orb|EMA +1 Wooded Foothills|KTK +1 Woodfall Primus|UMA +1 Worn Powerstone|EMA +1 Wrath of God|EMA +1 Wurmcoil Engine|SOM +1 Xenagos, the Reveler|THS +1 Yavimaya Elder|VMA +1 Yawgmoth's Bargain|UDS +1 Yawgmoth's Will|USG +1 Young Pyromancer|UMA +1 Zealous Conscripts|MM3 +1 Zurgo Bellstriker|DTK diff --git a/forge-gui/res/cube/MTGO Vintage Cube November 2016.dck b/forge-gui/res/cube/MTGO Vintage Cube November 2016.dck index a30794f973f..561700a2b94 100644 --- a/forge-gui/res/cube/MTGO Vintage Cube November 2016.dck +++ b/forge-gui/res/cube/MTGO Vintage Cube November 2016.dck @@ -10,11 +10,11 @@ Name=MTGO Vintage Cube November 2016 1 Ancestral Recall|VMA 1 Ancestral Vision|IMA 1 Ancient Grudge|MM3 -1 Ancient Tomb|VMA +1 Ancient Tomb|UMA 1 Angel of Serenity|RTR 1 Anguished Unmaking|SOI 1 Animate Dead|EMA -1 Anticipate|BFZ +1 Anticipate|M19 1 Arbor Elf|A25 1 Archangel of Thune|IMA 1 Arid Mesa|MM3 @@ -38,7 +38,7 @@ Name=MTGO Vintage Cube November 2016 1 Beast Within|NPH 1 Birds of Paradise|M12 1 Birthing Pod|NPH -1 Bitterblossom|MM2 +1 Bitterblossom|UMA 1 Black Lotus|VMA 1 Blade Splicer|MM3 1 Blightsteel Colossus|MBS @@ -58,12 +58,12 @@ Name=MTGO Vintage Cube November 2016 1 Brimaz, King of Oreskos|BNG 1 Brimstone Volley|CNS 1 Bring to Light|BFZ -1 Buried Alive|ODY +1 Buried Alive|UMA 1 Burning of Xinye|VMA 1 Burst Lightning|MM2 1 Cabal Ritual|VMA 1 Careful Study|ODY -1 Celestial Colonnade|WWK +1 Celestial Colonnade|UMA 1 Chain Lightning|EMA 1 Chandra, Flamecaller|OGW 1 Chandra, Pyromaster|M15 @@ -83,8 +83,8 @@ Name=MTGO Vintage Cube November 2016 1 Courser of Kruphix|A25 1 Crater's Claws|KTK 1 Craterhoof Behemoth|MM3 -1 Creeping Tar Pit|WWK -1 Crucible of Worlds|10E +1 Creeping Tar Pit|UMA +1 Crucible of Worlds|M19 1 Cryptic Command|IMA 1 Dack Fayden|EMA 1 Damnation|MM3 @@ -98,12 +98,12 @@ Name=MTGO Vintage Cube November 2016 1 Deceiver Exarch|NPH 1 Declaration in Stone|SOI 1 Delver of Secrets|ISD -1 Demonic Tutor|VMA +1 Demonic Tutor|UMA 1 Den Protector|DTK 1 Deranged Hermit|VMA 1 Desecration Demon|MM3 1 Diabolic Edict|A25 -1 Dig Through Time|KTK +1 Dig Through Time|UMA 1 Dimir Signet|MM3 1 Disenchant|A25 1 Disfigure|A25 @@ -116,7 +116,7 @@ Name=MTGO Vintage Cube November 2016 1 Dromoka's Command|DTK 1 Dualcaster Mage|EMA 1 Duplicant|EMA -1 Duress|IMA +1 Duress|M19 1 Edric, Spymaster of Trest|VMA 1 Eidolon of the Great Revel|A25 1 Electrolyze|IMA @@ -127,26 +127,26 @@ Name=MTGO Vintage Cube November 2016 1 Elvish Mystic|M15 1 Emeria Angel|IMA 1 Empty the Warrens|MMA -1 Emrakul, the Aeons Torn|MM2 +1 Emrakul, the Aeons Torn|UMA 1 Emrakul, the Promised End|EMN 1 Enlightened Tutor|EMA -1 Entomb|EMA -1 Eternal Witness|MMA +1 Entomb|UMA +1 Eternal Witness|UMA 1 Eureka|VMA 1 Everflowing Chalice|MM2 1 Exalted Angel|ONS 1 Exquisite Firecraft|ORI 1 Exhume|USG 1 Fact or Fiction|EMA -1 Faith's Fetters|EMA -1 Faithless Looting|EMA +1 Faith's Fetters|UMA +1 Faithless Looting|UMA 1 Falkenrath Gorger|SOI 1 Fastbond|VMA -1 Fauna Shaman|M11 -1 Fiend Hunter|A25 +1 Fauna Shaman|UMA +1 Fiend Hunter|UMA 1 Fiery Confluence 1 Figure of Destiny|MMA -1 Fire // Ice|APC +1 Fire // Ice|UMA 1 Fireblast|VMA 1 Firebolt|EMA 1 Firedrinker Satyr|THS @@ -155,7 +155,7 @@ Name=MTGO Vintage Cube November 2016 1 Flooded Strand|KTK 1 Force of Will|EMA 1 Force Spike|7ED -1 Frantic Search|VMA +1 Frantic Search|UMA 1 Freyalise, Llanowar's Fury 1 Frost Titan|M12 1 Fyndhorn Elves|VMA @@ -169,9 +169,9 @@ Name=MTGO Vintage Cube November 2016 1 Gideon Jura|M12 1 Gideon, Ally of Zendikar|BFZ 1 Gifts Ungiven|MM3 -1 Gilded Lotus|M13 +1 Gilded Lotus|DOM 1 Gitaxian Probe|NPH -1 Glen Elendra Archmage|MMA +1 Glen Elendra Archmage|UMA 1 Go for the Throat|MBS 1 Goblin Dark-Dwellers|OGW 1 Goblin Guide|MM3 @@ -185,9 +185,9 @@ Name=MTGO Vintage Cube November 2016 1 Grim Tutor|S99 1 Griselbrand|MM3 1 Gruul Signet|MM3 -1 Gurmag Angler|FRF +1 Gurmag Angler|UMA 1 Gush|VMA -1 Guttersnipe|IMA +1 Guttersnipe|M19 1 Hallowed Fountain|RTR 1 Hangarback Walker|ORI 1 Harmonize|MM3 @@ -220,19 +220,19 @@ Name=MTGO Vintage Cube November 2016 1 Jackal Pup|A25 1 Joraga Treespeaker|ROE 1 Kalitas, Traitor of Ghet|OGW -1 Karakas|EMA +1 Karakas|UMA 1 Kargan Dragonlord|ROE -1 Karn Liberated|MM2 +1 Karn Liberated|UMA 1 Kiki-Jiki, Mirror Breaker|IMA -1 Kitchen Finks|MMA +1 Kitchen Finks|UMA 1 Knight of the White Orchid|ORI 1 Kolaghan's Command|DTK 1 Koth of the Hammer|SOM -1 Kozilek, Butcher of Truth|MM2 +1 Kozilek, Butcher of Truth|UMA 1 Kuldotha Forgemaster|SOM 1 Kytheon, Hero of Akros|ORI 1 Land Tax|4ED -1 Lavaclaw Reaches|WWK +1 Lavaclaw Reaches|UMA 1 Leonin Relic-Warder|MBS 1 Leyline of Sanctity|MM2 1 Library of Alexandria|VMA @@ -241,20 +241,20 @@ Name=MTGO Vintage Cube November 2016 1 Lightning Greaves|MRD 1 Lightning Helix|IMA 1 Lightning Mauler|AVR -1 Lightning Strike|XLN -1 Liliana of the Veil|MM3 +1 Lightning Strike|M19 +1 Liliana of the Veil|UMA 1 Lingering Souls|MM3 1 Linvala, Keeper of Silence|MM3 1 Linvala, the Preserver|OGW 1 Lion's Eye Diamond|MIR 1 Living Death|A25 -1 Llanowar Elves|EMA +1 Llanowar Elves|DOM 1 Lodestone Golem|MM2 1 Looter il-Kor|TSP 1 Lotus Bloom|MMA 1 Lotus Cobra|IMA 1 Lumbering Falls|BFZ -1 Maelstrom Pulse|MMA +1 Maelstrom Pulse|UMA 1 Magma Jet|MM3 1 Magus of the Moon|IMA 1 Magus of the Wheel|A25 @@ -266,7 +266,7 @@ Name=MTGO Vintage Cube November 2016 1 Mana Drain|IMA 1 Mana Leak|IMA 1 Mana Tithe|PLC -1 Mana Vault|VMA +1 Mana Vault|UMA 1 Manic Vandal|M12 1 Mardu Woe-Reaper|FRF 1 Marsh Flats|MM3 @@ -315,7 +315,7 @@ Name=MTGO Vintage Cube November 2016 1 Nezumi Shortfang|CHK 1 Nicol Bolas, Planeswalker|M13 1 Nissa, Worldwaker|M15 -1 Noble Hierarch|MM2 +1 Noble Hierarch|UMA 1 Nykthos, Shrine to Nyx|THS 1 Oath of Druids|TPR 1 Oath of Nissa|OGW @@ -326,7 +326,7 @@ Name=MTGO Vintage Cube November 2016 1 Opposition|7ED 1 Oracle of Mul Daya|ZEN 1 Orzhov Signet|MM3 -1 Overgrown Tomb|RTR +1 Overgrown Tomb|GRN 1 Pack Rat|RTR 1 Painful Truths|BFZ 1 Palinchron|VMA @@ -352,14 +352,14 @@ Name=MTGO Vintage Cube November 2016 1 Putrid Imp|VMA 1 Qasali Pridemage|ARB 1 Quicken|M14 -1 Raging Ravine|WWK +1 Raging Ravine|UMA 1 Rakdos Signet|MM3 1 Rakdos's Return|RTR 1 Ral Zarek|DGM 1 Ravages of War|PTK -1 Reanimate|TPR +1 Reanimate|UMA 1 Reckless Bushwhacker|OGW -1 Reclamation Sage|M15 +1 Reclamation Sage|M19 1 Recruiter of the Guard 1 Recurring Nightmare|TPR 1 Reflector Mage|OGW @@ -367,13 +367,13 @@ Name=MTGO Vintage Cube November 2016 1 Remand|MM2 1 Repeal|IMA 1 Restoration Angel|IMA -1 Reveillark|MMA +1 Reveillark|UMA 1 Rift Bolt|IMA 1 Riftwing Cloudskate|MMA 1 Rishadan Port|A25 1 Roast|DTK 1 Rofellos, Llanowar Emissary|VMA -1 Sacred Foundry|GTC +1 Sacred Foundry|GRN 1 Sakura-Tribe Elder|CNS 1 Savannah|VMA 1 Scalding Tarn|MM3 @@ -396,10 +396,10 @@ Name=MTGO Vintage Cube November 2016 1 Shelldock Isle|LRW 1 Sheoldred, Whispering One|IMA 1 Show and Tell|USG -1 Shriekmaw|LRW +1 Shriekmaw|UMA 1 Shrine of Burning Rage|NPH 1 Sidisi, Undead Vizier|DTK -1 Siege-Gang Commander|EMA +1 Siege-Gang Commander|DOM 1 Silverblade Paladin|AVR 1 Simic Signet|MM3 1 Skinrender|SOM @@ -407,7 +407,7 @@ Name=MTGO Vintage Cube November 2016 1 Smash to Smithereens|ORI 1 Smokestack|VMA 1 Smuggler's Copter|KLD -1 Snapcaster Mage|MM3 +1 Snapcaster Mage|UMA 1 Sneak Attack|EMA 1 Sol Ring|VMA 1 Soldier of the Pantheon|THS @@ -423,8 +423,8 @@ Name=MTGO Vintage Cube November 2016 1 Sphinx's Revelation|MM3 1 Spirit of the Labyrinth|BNG 1 Splinter Twin|MM2 -1 Steam Vents|RTR -1 Stirring Wildwood|WWK +1 Steam Vents|GRN +1 Stirring Wildwood|UMA 1 Stomping Ground|GTC 1 Stoneforge Mystic|WWK 1 Stormbreath Dragon|THS @@ -446,9 +446,9 @@ Name=MTGO Vintage Cube November 2016 1 Taiga|VMA 1 Tamiyo, the Moon Sage|AVR 1 Tangle Wire|NMS -1 Tarmogoyf|MM3 +1 Tarmogoyf|UMA 1 Tasigur, the Golden Fang|FRF -1 Temple Garden|RTR +1 Temple Garden|GRN 1 Temple of Abandon|THS 1 Temple of Deceit|THS 1 Temple of Enlightenment|BNG @@ -472,7 +472,7 @@ Name=MTGO Vintage Cube November 2016 1 Thoughtseize|IMA 1 Thragtusk|MM3 1 Thran Dynamo|IMA -1 Through the Breach|CHK +1 Through the Breach|UMA 1 Thrun, the Last Troll|MBS 1 Thundermaw Hellkite|IMA 1 Tidehollow Sculler|MMA @@ -488,7 +488,7 @@ Name=MTGO Vintage Cube November 2016 1 Toxic Deluge|EMA 1 Traverse the Ulvenwald|SOI 1 Treachery|UDS -1 Treasure Cruise|KTK +1 Treasure Cruise|UMA 1 Trinket Mage|SOM 1 Tropical Island|VMA 1 True-Name Nemesis @@ -497,10 +497,10 @@ Name=MTGO Vintage Cube November 2016 1 Turnabout|VMA 1 Ugin, the Spirit Dragon|FRF 1 Ulamog, the Ceaseless Hunger|BFZ -1 Ulamog, the Infinite Gyre|MM2 +1 Ulamog, the Infinite Gyre|UMA 1 Ultimate Price|DTK 1 Umezawa's Jitte|BOK -1 Unburial Rites|MM3 +1 Unburial Rites|UMA 1 Underground Sea|VMA 1 Unexpectedly Absent|EMA 1 Upheaval|VMA @@ -523,7 +523,7 @@ Name=MTGO Vintage Cube November 2016 1 Wandering Fumarole|OGW 1 War Priest of Thune|EMA 1 Wasteland|EMA -1 Watery Grave|GTC +1 Watery Grave|GRN 1 Westvale Abbey|SOI 1 Wheel of Fortune|VMA 1 Wildfire|MM2 @@ -531,7 +531,7 @@ Name=MTGO Vintage Cube November 2016 1 Winter Orb|EMA 1 Wolfir Silverheart|AVR 1 Wooded Foothills|KTK -1 Woodfall Primus|MMA +1 Woodfall Primus|UMA 1 Worn Powerstone|EMA 1 Wrath of God|EMA 1 Wurmcoil Engine|SOM @@ -539,6 +539,6 @@ Name=MTGO Vintage Cube November 2016 1 Yavimaya Elder|VMA 1 Yawgmoth's Bargain|UDS 1 Yawgmoth's Will|USG -1 Young Pyromancer|EMA +1 Young Pyromancer|UMA 1 Zealous Conscripts|MM3 1 Zurgo Bellstriker|DTK diff --git a/forge-gui/res/cube/Modern Cube 2017.dck b/forge-gui/res/cube/Modern Cube 2017.dck index 2de25459fa8..c222306ce5b 100644 --- a/forge-gui/res/cube/Modern Cube 2017.dck +++ b/forge-gui/res/cube/Modern Cube 2017.dck @@ -19,7 +19,7 @@ Name=Modern Cube 2017 1 Angel of Serenity|RTR 1 Anger of the Gods|IMA 1 Anguished Unmaking|SOI -1 Anticipate|BFZ +1 Anticipate|M19 1 Arbor Elf|A25 1 Arc Trail|SOM 1 Archangel Avacyn|SOI @@ -32,7 +32,7 @@ Name=Modern Cube 2017 1 Avenger of Zendikar|WWK 1 Awakening Zone|ROE 1 Azure Mage|MM3 -1 Banefire|MM2 +1 Banefire|M19 1 Baneslayer Angel|M11 1 Banishing Light|JOU 1 Bant Charm|ALA @@ -41,7 +41,7 @@ Name=Modern Cube 2017 1 Battlefield Forge|ORI 1 Beast Within|NPH 1 Birds of Paradise|M12 -1 Bitterblossom|MM2 +1 Bitterblossom|UMA 1 Black Sun's Zenith|MBS 1 Blade Splicer|MM3 1 Blood Crypt|RTR @@ -69,7 +69,7 @@ Name=Modern Cube 2017 1 Careful Consideration|MMA 1 Cascade Bluffs|A25 1 Caves of Koilos|ORI -1 Celestial Colonnade|WWK +1 Celestial Colonnade|UMA 1 Chained to the Rocks|THS 1 Chandra Nalaar|M11 1 Chandra's Phoenix|M14 @@ -79,11 +79,11 @@ Name=Modern Cube 2017 1 Chandra, Torch of Defiance|KLD 1 Char|RAV 1 Chasm Skulker|M15 -1 Chromatic Lantern|RTR +1 Chromatic Lantern|GRN 1 Cinder Glade|BFZ 1 City of Brass|MMA 1 Clever Impersonator|KTK -1 Clifftop Retreat|ISD +1 Clifftop Retreat|DOM 1 Cloistered Youth|ISD 1 Cloudgoat Ranger|MMA 1 Coalition Relic|A25 @@ -98,7 +98,7 @@ Name=Modern Cube 2017 1 Consuming Vapors|ROE 1 Courser of Kruphix|A25 1 Craterhoof Behemoth|MM3 -1 Creeping Tar Pit|WWK +1 Creeping Tar Pit|UMA 1 Crypt Ghast|GTC 1 Cryptic Command|IMA 1 Crystal Shard|MRD @@ -113,7 +113,7 @@ Name=Modern Cube 2017 1 Despise|KTK 1 Destructive Force|M11 1 Devil's Play|ISD -1 Devoted Druid|SHM +1 Devoted Druid|UMA 1 Devour Flesh|GTC 1 Dictate of Heliod|JOU 1 Disallow|AER @@ -132,7 +132,7 @@ Name=Modern Cube 2017 1 Drowned Catacomb|XLN 1 Dungeon Geists|DKA 1 Duplicant|EMA -1 Duress|IMA +1 Duress|M19 1 Duskwatch Recruiter|SOI 1 Earthquake|M10 1 Elder Deep-Fiend|EMN @@ -147,13 +147,13 @@ Name=Modern Cube 2017 1 Emeria Angel|IMA 1 Enclave Cryptologist|ROE 1 Entreat the Angels|MM3 -1 Essence Scatter|AKH -1 Eternal Witness|MMA +1 Essence Scatter|M19 +1 Eternal Witness|UMA 1 Ever After|SOI 1 Everflowing Chalice|MM2 1 Evolving Wilds|RIX 1 Exquisite Firecraft|ORI -1 Faith's Fetters|EMA +1 Faith's Fetters|UMA 1 Falkenrath Aristocrat|MM3 1 Falkenrath Gorger|SOI 1 Far // Away|DGM @@ -187,8 +187,8 @@ Name=Modern Cube 2017 1 Gideon, Champion of Justice|GTC 1 Gifted Aetherborn|AER 1 Gifts Ungiven|MM3 -1 Gilded Lotus|M13 -1 Glen Elendra Archmage|MMA +1 Gilded Lotus|DOM +1 Glen Elendra Archmage|UMA 1 Glint-Sleeve Siphoner|AER 1 Glorious Anthem|10E 1 Go for the Throat|MBS @@ -217,13 +217,13 @@ Name=Modern Cube 2017 1 Hero of Bladehold|MBS 1 Hero of Oxid Ridge|MBS 1 Hero's Downfall|THS -1 Hinterland Harbor|ISD +1 Hinterland Harbor|DOM 1 Honor of the Pure|M12 1 Hornet Nest|M15 1 Hornet Queen|M15 1 Huntmaster of the Fells|DKA 1 Hypnotic Specter|M10 -1 Icy Manipulator|10E +1 Icy Manipulator|DOM 1 Imposing Sovereign|M14 1 Imprisoned in the Moon|EMN 1 Inferno Titan|M12 @@ -232,7 +232,7 @@ Name=Modern Cube 2017 1 Into the Roil|ZEN 1 Ire Shaman|A25 1 Isamaru, Hound of Konda|CHK -1 Isolated Chapel|ISD +1 Isolated Chapel|DOM 1 Izzet Charm|MM3 1 Jace Beleren|M11 1 Jace, Architect of Thought|RTR @@ -243,14 +243,14 @@ Name=Modern Cube 2017 1 Journey to Nowhere|ZEN 1 Kargan Dragonlord|ROE 1 Kari Zev, Skyship Raider|AER -1 Karn Liberated|MM2 +1 Karn Liberated|UMA 1 Karplusan Forest|10E 1 Kessig Prowler|EMN 1 Kessig Wolf Run|ISD 1 Kiki-Jiki, Mirror Breaker|IMA 1 Kiora, Master of the Depths|BFZ 1 Kira, Great Glass-Spinner|MMA -1 Kitchen Finks|MMA +1 Kitchen Finks|UMA 1 Knight of Meadowgrain|LRW 1 Kokusho, the Evening Star|MMA 1 Kolaghan's Command|DTK @@ -258,24 +258,24 @@ Name=Modern Cube 2017 1 Koth of the Hammer|SOM 1 Kytheon, Hero of Akros|ORI 1 Lash Out|LRW -1 Lavaclaw Reaches|WWK +1 Lavaclaw Reaches|UMA 1 Lifebane Zombie|M14 1 Lightning Bolt|A25 1 Lightning Helix|IMA 1 Lightning Mauler|AVR -1 Lightning Strike|XLN +1 Lightning Strike|M19 1 Liliana Vess|M15 -1 Liliana of the Veil|MM3 +1 Liliana of the Veil|UMA 1 Liliana's Specter|CNS 1 Liliana, Heretical Healer|ORI 1 Liliana, the Last Hope|EMN 1 Lingering Souls|MM3 -1 Llanowar Elves|EMA +1 Llanowar Elves|DOM 1 Llanowar Wastes|ORI 1 Lodestone Golem|MM2 1 Looter il-Kor|TSP 1 Lotus Cobra|IMA -1 Maelstrom Pulse|MMA +1 Maelstrom Pulse|UMA 1 Magma Jet|MM3 1 Mana Leak|IMA 1 Mana Tithe|PLC @@ -299,7 +299,7 @@ Name=Modern Cube 2017 1 Monastery Mentor|FRF 1 Mulldrifter|MM2 1 Murderous Cut|KTK -1 Murderous Redcap|MMA +1 Murderous Redcap|UMA 1 Mutavault|M14 1 Myr Battlesphere|SOM 1 Nahiri, the Harbinger|SOI @@ -311,7 +311,7 @@ Name=Modern Cube 2017 1 Nissa, Vastwood Seer|ORI 1 Nissa, Vital Force|KLD 1 Nissa, Voice of Zendikar|OGW -1 Noble Hierarch|MM2 +1 Noble Hierarch|UMA 1 Nykthos, Shrine to Nyx|THS 1 Ob Nixilis Reignited|BFZ 1 Oblivion Ring|MM2 @@ -323,7 +323,7 @@ Name=Modern Cube 2017 1 Oracle of Mul Daya|ZEN 1 Oust|ROE 1 Outpost Siege|FRF -1 Overgrown Tomb|RTR +1 Overgrown Tomb|GRN 1 Overwhelming Stampede|MM2 1 Pack Rat|RTR 1 Pact of Negation|A25 @@ -346,7 +346,7 @@ Name=Modern Cube 2017 1 Prairie Stream|BFZ 1 Precursor Golem|MM2 1 Primeval Titan|IMA -1 Prismatic Lens|EMA +1 Prismatic Lens|UMA 1 Profane Command|MM2 1 Progenitor Mimic|DGM 1 Prophet of Kruphix|THS @@ -355,8 +355,8 @@ Name=Modern Cube 2017 1 Pyroclasm|A25 1 Qasali Pridemage|ARB 1 Quarantine Field|BFZ -1 Rabid Bite|SOI -1 Raging Ravine|WWK +1 Rabid Bite|M19 +1 Raging Ravine|UMA 1 Rakdos Cackler|RTR 1 Ral Zarek|DGM 1 Rampaging Baloths|IMA @@ -364,7 +364,7 @@ Name=Modern Cube 2017 1 Rattleclaw Mystic|KTK 1 Read the Bones|ORI 1 Reckless Waif|ISD -1 Reclamation Sage|M15 +1 Reclamation Sage|M19 1 Reflecting Pool|CNS 1 Reflector Mage|OGW 1 Release the Gremlins|AER @@ -372,17 +372,17 @@ Name=Modern Cube 2017 1 Repeal|IMA 1 Restoration Angel|IMA 1 Return to Dust|TSP -1 Reveillark|MMA +1 Reveillark|UMA 1 Riftwing Cloudskate|MMA 1 Rishkar's Expertise|AER 1 Rishkar, Peema Renegade|AER 1 Rootbound Crag|XLN 1 Rugged Prairie|A25 1 Ruinous Path|BFZ -1 Rune Snag|CSP +1 Rune Snag|UMA 1 Rune-Scarred Demon|IMA 1 Ruthless Ripper|A25 -1 Sacred Foundry|GTC +1 Sacred Foundry|GRN 1 Saheeli Rai|KLD 1 Sakura-Tribe Elder|CNS 1 Sarkhan, the Dragonspeaker|KTK @@ -401,22 +401,22 @@ Name=Modern Cube 2017 1 Shelldock Isle|LRW 1 Sheoldred, Whispering One|IMA 1 Shivan Reef|ORI -1 Shriekmaw|LRW +1 Shriekmaw|UMA 1 Shrine of Burning Rage|NPH 1 Shrine of Loyal Legions|NPH 1 Sidisi, Undead Vizier|DTK 1 Siege Rhino|KTK -1 Siege-Gang Commander|EMA +1 Siege-Gang Commander|DOM 1 Silent Departure|EMA 1 Silverblade Paladin|AVR 1 Skinrender|SOM 1 Skysovereign, Consul Flagship|KLD 1 Slaughter Pact|MMA -1 Sleight of Hand|9ED +1 Sleight of Hand|UMA 1 Smash to Smithereens|ORI 1 Smoldering Marsh|BFZ 1 Smuggler's Copter|KLD -1 Snapcaster Mage|MM3 +1 Snapcaster Mage|UMA 1 Soldier of the Pantheon|THS 1 Solemn Recruit|AER 1 Solemn Simulacrum|M12 @@ -436,8 +436,8 @@ Name=Modern Cube 2017 1 Spirit of the Labyrinth|BNG 1 Staff of Nin|M13 1 Staggershock|IMA -1 Steam Vents|RTR -1 Stirring Wildwood|WWK +1 Steam Vents|GRN +1 Stirring Wildwood|UMA 1 Stoke the Flames|M15 1 Stomping Ground|GTC 1 Stormblood Berserker|MM2 @@ -445,8 +445,8 @@ Name=Modern Cube 2017 1 Stratus Dancer|DTK 1 Stromkirk Noble|ISD 1 Student of Warfare|ROE -1 Sublime Archangel|M13 -1 Sulfur Falls|ISD +1 Sublime Archangel|UMA +1 Sulfur Falls|DOM 1 Sulfurous Springs|10E 1 Sun Titan|M12 1 Sundering Growth|MM3 @@ -460,7 +460,7 @@ Name=Modern Cube 2017 1 Tamiyo, the Moon Sage|AVR 1 Tasigur, the Golden Fang|FRF 1 Teferi, Mage of Zhalfir|IMA -1 Temple Garden|RTR +1 Temple Garden|GRN 1 Temple of Epiphany|JOU 1 Temple of Malady|JOU 1 Temple of Mystery|THS @@ -469,7 +469,7 @@ Name=Modern Cube 2017 1 Temporal Isolation|TSP 1 Temporal Mastery|MM3 1 Terastodon|CNS -1 Terramorphic Expanse|MMA +1 Terramorphic Expanse|UMA 1 Thalia, Guardian of Thraben|A25 1 Thalia, Heretic Cathar|EMN 1 Thirst for Knowledge|MMA @@ -494,7 +494,7 @@ Name=Modern Cube 2017 1 Ulamog, the Ceaseless Hunger|BFZ 1 Ulcerate|IMA 1 Ultimate Price|DTK -1 Unburial Rites|MM3 +1 Unburial Rites|UMA 1 Underground River|10E 1 Undergrowth Champion|BFZ 1 Utopia Sprawl|A25 @@ -503,7 +503,7 @@ Name=Modern Cube 2017 1 Vampire Nighthawk|MM3 1 Vendetta|ROE 1 Vendilion Clique|A25 -1 Vengevine|ROE +1 Vengevine|UMA 1 Venser, Shaper Savant|MM3 1 Verdant Catacombs|MM3 1 Verdurous Gearhulk|KLD @@ -518,26 +518,26 @@ Name=Modern Cube 2017 1 Vraska the Unseen|RTR 1 Wake Thrasher|EVE 1 Wall of Roots|IMA -1 Watery Grave|GTC +1 Watery Grave|GRN 1 Wear // Tear|DGM 1 Westvale Abbey|SOI 1 Whip of Erebos|THS 1 Whipflare|NPH 1 Whirler Rogue|ORI 1 Whisperwood Elemental|FRF -1 Wickerbough Elder|EVE +1 Wickerbough Elder|UMA 1 Wildfire|MM2 1 Windbrisk Heights|LRW 1 Winding Constrictor|AER 1 Windswept Heath|KTK 1 Wolfir Silverheart|AVR 1 Wooded Foothills|KTK -1 Woodland Cemetery|ISD +1 Woodland Cemetery|DOM 1 Wrath of God|EMA 1 Wurmcoil Engine|SOM 1 Yahenni's Expertise|AER 1 Yavimaya Coast|ORI 1 Yosei, the Morning Star|MMA -1 Young Pyromancer|EMA +1 Young Pyromancer|UMA 1 Zealous Conscripts|MM3 1 Zurgo Bellstriker|DTK diff --git a/forge-gui/res/cube/Mono Blue Cube.dck b/forge-gui/res/cube/Mono Blue Cube.dck index a1e39fc71c6..19b861513b3 100644 --- a/forge-gui/res/cube/Mono Blue Cube.dck +++ b/forge-gui/res/cube/Mono Blue Cube.dck @@ -8,16 +8,16 @@ Name=Mono Blue Cube 1 Aether Spellbomb|MMA 1 Aether Vial|IMA 1 Aetherling|DGM -1 All Is Dust|MM2 +1 All Is Dust|UMA 1 Ambassador Laquatus|10E 1 Amnesia|DRK 1 Ancestral Recall|VMA 1 Ancestral Vision|IMA -1 Ancient Tomb|VMA +1 Ancient Tomb|UMA 1 Ankh of Mishra|VMA 1 Annul|THS 1 Arcanis the Omnipotent|EMA -1 Archaeomancer|M14 +1 Archaeomancer|UMA 1 Archive Trap|ZEN 1 Augur of Bolas|MM3 1 Basalt Monolith|3ED @@ -42,7 +42,7 @@ Name=Mono Blue Cube 1 Candelabra of Tawnos|ATQ 1 Capsize|TPR 1 Careful Consideration|MMA -1 Cavern of Souls|MM3 +1 Cavern of Souls|UMA 1 Chalice of the Void|A25 1 Chancellor of the Spires|NPH 1 Chronomaton|M13 @@ -90,7 +90,7 @@ Name=Mono Blue Cube 1 Duplicant|EMA 1 Elite Arcanist|M14 1 Elixir of Immortality|M14 -1 Emrakul, the Aeons Torn|MM2 +1 Emrakul, the Aeons Torn|UMA 1 Enclave Cryptologist|ROE 1 Enter the Infinite|GTC 1 Errant Ephemeron|MMA @@ -105,17 +105,17 @@ Name=Mono Blue Cube 1 Faerie Harbinger|LRW 1 Flash of Insight|JUD 1 Flusterstorm|IMA -1 Foil|PCY +1 Foil|UMA 1 Forbid|TPR 1 Force of Will|EMA 1 Force Spike|7ED -1 Frantic Search|VMA +1 Frantic Search|UMA 1 Frost Titan|M12 1 Gainsay|THS 1 Geralf's Mindcrusher|DKA -1 Gilded Lotus|M13 +1 Gilded Lotus|DOM 1 Gitaxian Probe|NPH -1 Glen Elendra Archmage|MMA +1 Glen Elendra Archmage|UMA 1 Gomazoa|ZEN 1 Grafted Wargear|5DN 1 Grand Architect|SOM @@ -145,12 +145,12 @@ Name=Mono Blue Cube 1 Jace, the Mind Sculptor|VMA 1 Jace's Archivist|M12 1 Jushi Apprentice|CHK -1 Karn Liberated|MM2 +1 Karn Liberated|UMA 1 Kederekt Leviathan|ALA 1 Keening Stone|ROE 1 Knowledge Pool|MBS 1 Kuldotha Forgemaster|SOM -1 Laboratory Maniac|ISD +1 Laboratory Maniac|UMA 1 Legerdemain|TPR 1 Leyline of Anticipation|M11 1 Library of Alexandria|VMA @@ -166,7 +166,7 @@ Name=Mono Blue Cube 1 Mana Crypt|EMA 1 Mana Drain|IMA 1 Mana Leak|IMA -1 Mana Vault|VMA +1 Mana Vault|UMA 1 Master of the Pearl Trident|M13 1 Master of Waves|THS 1 Master Thief|M12 @@ -211,7 +211,7 @@ Name=Mono Blue Cube 1 Nimbus Naiad|THS 1 Ninja of the Deep Hours|BOK 1 Oblivion Stone|IMA -1 Omniscience|M13 +1 Omniscience|M19 1 Oona, Queen of the Fae|MMA 1 Opportunity|MM3 1 Overtaker|MMQ @@ -230,7 +230,7 @@ Name=Mono Blue Cube 1 Phyrexian Metamorph|NPH 1 Piracy Charm|PLC 1 Platinum Angel|M11 -1 Plumeveil|MMA +1 Plumeveil|UMA 1 Ponder|M12 1 Pongify|PLC 1 Portent|5ED @@ -250,7 +250,7 @@ Name=Mono Blue Cube 1 Raven Guild Master|SCG 1 Ray of Command|5ED 1 Reconstruction|3ED -1 Reliquary Tower|M13 +1 Reliquary Tower|M19 1 Remand|MM2 1 Remote Isle|USG 1 Repeal|IMA @@ -280,9 +280,9 @@ Name=Mono Blue Cube 1 Silvergill Adept|RIX 1 Skullclamp|VMA 1 Skywatcher Adept|ROE -1 Sleight of Hand|9ED +1 Sleight of Hand|UMA 1 Smokestack|VMA -1 Snapcaster Mage|MM3 +1 Snapcaster Mage|UMA 1 Sol Ring|VMA 1 Sower of Temptation|LRW 1 Spell Pierce|XLN @@ -314,7 +314,7 @@ Name=Mono Blue Cube 1 Thalakos Deceiver|STH 1 Thassa, God of the Sea|THS 1 The Tabernacle at Pendrell Vale -1 Think Twice|ISD +1 Think Twice|UMA 1 Thistledown Liege|SHM 1 Thought Scour|IMA 1 Thran Dynamo|IMA @@ -332,7 +332,7 @@ Name=Mono Blue Cube 1 Treachery|UDS 1 True-Name Nemesis 1 Turnabout|VMA -1 Ulamog, the Infinite Gyre|MM2 +1 Ulamog, the Infinite Gyre|UMA 1 Umezawa's Jitte|BOK 1 Undo|VIS 1 Upheaval|VMA @@ -346,7 +346,7 @@ Name=Mono Blue Cube 1 Vesuvan Shapeshifter|A25 1 Vexing Sphinx|CSP 1 Vision Charm|VIS -1 Visions of Beyond|M12 +1 Visions of Beyond|UMA 1 Vodalian Knights|FEM 1 Void Stalker|M13 1 Voidmage Prodigy|TSB diff --git a/forge-gui/res/cube/Sam Black's No Search Cube.dck b/forge-gui/res/cube/Sam Black's No Search Cube.dck index 060e417a229..3dc52d33548 100644 --- a/forge-gui/res/cube/Sam Black's No Search Cube.dck +++ b/forge-gui/res/cube/Sam Black's No Search Cube.dck @@ -13,7 +13,7 @@ Name=Sam Black's No Search Cube 1 Ancestral Recall|VMA 1 Ancestral Vision|IMA 1 Ancient Grudge|MM3 -1 Ancient Tomb|VMA +1 Ancient Tomb|UMA 1 Angel of Serenity|RTR 1 Anger of the Gods|IMA 1 Animate Dead|EMA @@ -21,7 +21,7 @@ Name=Sam Black's No Search Cube 1 Arcane Sanctum|MM3 1 Archangel Avacyn|SOI 1 Armageddon|A25 -1 Artisan of Kozilek|MM2 +1 Artisan of Kozilek|UMA 1 Ashiok, Nightmare Weaver|THS 1 Atarka's Command|DTK 1 Avenger of Zendikar|WWK @@ -39,11 +39,11 @@ Name=Sam Black's No Search Cube 1 Bayou|VMA 1 Bazaar of Baghdad|VMA 1 Beast Within|NPH -1 Become Immense|KTK +1 Become Immense|UMA 1 Bedlam Reveler|EMN 1 Benevolent Bodyguard|EMA 1 Birds of Paradise|M12 -1 Bitterblossom|MM2 +1 Bitterblossom|UMA 1 Black Lotus|VMA 1 Black Sun's Zenith|MBS 1 Blackcleave Cliffs|SOM @@ -67,7 +67,7 @@ Name=Sam Black's No Search Cube 1 Carrion Feeder|EMA 1 Cartel Aristocrat|GTC 1 Catastrophe|USG -1 Celestial Colonnade|WWK +1 Celestial Colonnade|UMA 1 Chain Lightning|EMA 1 Champion of the Parish|ISD 1 Chandra's Phoenix|M14 @@ -93,7 +93,7 @@ Name=Sam Black's No Search Cube 1 Courser of Kruphix|A25 1 Crackling Doom|KTK 1 Craterhoof Behemoth|MM3 -1 Creeping Tar Pit|WWK +1 Creeping Tar Pit|UMA 1 Crumbling Necropolis|MM3 1 Cryptbreaker|EMN 1 Cryptic Command|IMA @@ -109,8 +109,8 @@ Name=Sam Black's No Search Cube 1 Delver of Secrets|ISD 1 Den Protector|DTK 1 Desecration Demon|MM3 -1 Desolate Lighthouse|AVR -1 Dig Through Time|KTK +1 Desolate Lighthouse|UMA +1 Dig Through Time|UMA 1 Dimir Aqueduct|IMA 1 Disciple of Bolas|M13 1 Disenchant|A25 @@ -138,28 +138,28 @@ Name=Sam Black's No Search Cube 1 Elixir of Immortality|M14 1 Elspeth, Sun's Champion|THS 1 Elvish Visionary|ORI -1 Emrakul, the Aeons Torn|MM2 +1 Emrakul, the Aeons Torn|UMA 1 Emrakul, the Promised End|EMN 1 Enclave Cryptologist|ROE -1 Engineered Explosives|MMA +1 Engineered Explosives|UMA 1 Ensnaring Bridge|A25 1 Entomber Exarch|MM3 -1 Eternal Witness|MMA +1 Eternal Witness|UMA 1 Everflowing Chalice|MM2 1 Evolutionary Leap|ORI 1 Exhume|USG 1 Explore|MM3 1 Fact or Fiction|EMA -1 Faith's Fetters|EMA -1 Faithless Looting|EMA +1 Faith's Fetters|UMA +1 Faithless Looting|UMA 1 Falkenrath Aristocrat|MM3 1 Fastbond|VMA 1 Feldon of the Third Path 1 Fellwar Stone|9ED -1 Fiend Hunter|A25 +1 Fiend Hunter|UMA 1 Fiery Justice|MM3 1 Figure of Destiny|MMA -1 Fire // Ice|APC +1 Fire // Ice|UMA 1 Fireblast|VMA 1 Firebolt|EMA 1 Firedrinker Satyr|THS @@ -171,7 +171,7 @@ Name=Sam Black's No Search Cube 1 Flooded Grove|A25 1 Force of Will|EMA 1 Forked Bolt|ROE -1 Frantic Search|VMA +1 Frantic Search|UMA 1 Frontier Bivouac|KTK 1 Frost Titan|M12 1 Gaea's Cradle|USG @@ -184,9 +184,9 @@ Name=Sam Black's No Search Cube 1 Ghor-Clan Rampager|MM3 1 Gideon Jura|M12 1 Gideon, Ally of Zendikar|BFZ -1 Gilded Lotus|M13 +1 Gilded Lotus|DOM 1 Gitaxian Probe|NPH -1 Glen Elendra Archmage|MMA +1 Glen Elendra Archmage|UMA 1 Glint-Nest Crane|KLD 1 Go for the Throat|MBS 1 Goblin Bombardment|TPR @@ -216,7 +216,7 @@ Name=Sam Black's No Search Cube 1 Hero's Downfall|THS 1 Hissing Quagmire|OGW 1 Honor of the Pure|M12 -1 Hooting Mandrills|KTK +1 Hooting Mandrills|UMA 1 Hordeling Outburst|A25 1 Hornet Queen|M15 1 Huntmaster of the Fells|DKA @@ -236,9 +236,9 @@ Name=Sam Black's No Search Cube 1 Journey to Nowhere|ZEN 1 Jungle Shrine|MM3 1 Kalitas, Traitor of Ghet|OGW -1 Karakas|EMA +1 Karakas|UMA 1 Kargan Dragonlord|ROE -1 Karn Liberated|MM2 +1 Karn Liberated|UMA 1 Keranos, God of Storms|JOU 1 Kessig Wolf Run|ISD 1 Key to the City|KLD @@ -247,37 +247,37 @@ Name=Sam Black's No Search Cube 1 Kiora's Follower|BNG 1 Kiora, the Crashing Wave|BNG 1 Kira, Great Glass-Spinner|MMA -1 Kitchen Finks|MMA +1 Kitchen Finks|UMA 1 Knight of Glory|M13 1 Kokusho, the Evening Star|MMA 1 Kolaghan's Command|DTK 1 Kozilek's Return|OGW -1 Kozilek, Butcher of Truth|MM2 +1 Kozilek, Butcher of Truth|UMA 1 Krosan Grip|MMA 1 Kytheon, Hero of Akros|ORI -1 Lavaclaw Reaches|WWK +1 Lavaclaw Reaches|UMA 1 Legacy's Allure|TMP 1 Legion Loyalist|GTC -1 Leovold, Emissary of Trest +1 Leovold, Emissary of Trest|UMA 1 Library of Alexandria|VMA 1 Lifebane Zombie|M14 1 Lightning Berserker|DTK 1 Lightning Bolt|A25 1 Lightning Helix|IMA 1 Lightning Mauler|AVR -1 Liliana of the Veil|MM3 +1 Liliana of the Veil|UMA 1 Liliana, Heretical Healer|ORI 1 Liliana, the Last Hope|EMN 1 Lingering Souls|MM3 1 Linvala, the Preserver|OGW 1 Living Death|A25 -1 Llanowar Elves|EMA +1 Llanowar Elves|DOM 1 Lodestone Golem|MM2 1 Looter il-Kor|TSP 1 Lotleth Troll|RTR 1 Lotus Bloom|MMA 1 Lumbering Falls|BFZ -1 Maelstrom Pulse|MMA +1 Maelstrom Pulse|UMA 1 Maelstrom Wanderer|EMA 1 Magma Jet|MM3 1 Malicious Affliction|EMA @@ -286,7 +286,7 @@ Name=Sam Black's No Search Cube 1 Mana Drain|IMA 1 Mana Leak|IMA 1 Mana Tithe|PLC -1 Mana Vault|VMA +1 Mana Vault|UMA 1 Managorger Hydra|ORI 1 Mantis Rider|KTK 1 Marsh Flitter|MMA @@ -320,7 +320,7 @@ Name=Sam Black's No Search Cube 1 Mox Ruby|VMA 1 Mox Sapphire|VMA 1 Mulldrifter|MM2 -1 Murderous Redcap|MMA +1 Murderous Redcap|UMA 1 Mutavault|M14 1 Myr Battlesphere|SOM 1 Mystic Monastery|KTK @@ -336,7 +336,7 @@ Name=Sam Black's No Search Cube 1 Nightveil Specter|GTC 1 Nissa, Vital Force|KLD 1 Nissa, Voice of Zendikar|OGW -1 Noble Hierarch|MM2 +1 Noble Hierarch|UMA 1 Nomad Outpost|KTK 1 Noose Constrictor|EMN 1 Noxious Gearhulk|KLD @@ -360,14 +360,14 @@ Name=Sam Black's No Search Cube 1 Painful Truths|BFZ 1 Palinchron|VMA 1 Palladium Myr|IMA -1 Pelakka Wurm|MM2 +1 Pelakka Wurm|M19 1 Pentavus|M12 1 Pernicious Deed|A25 1 Pestermite|MMA 1 Phantasmal Image|MM3 1 Phyrexian Metamorph|NPH 1 Phyrexian Revoker|M15 -1 Phyrexian Tower|USG +1 Phyrexian Tower|UMA 1 Pia Nalaar|KLD 1 Pia and Kiran Nalaar|ORI 1 Plateau|VMA @@ -383,29 +383,29 @@ Name=Sam Black's No Search Cube 1 Puppeteer Clique|MM2 1 Quarantine Field|BFZ 1 Radiant Flames|BFZ -1 Raging Ravine|WWK +1 Raging Ravine|UMA 1 Rakdos Carnarium|IMA 1 Rakdos's Return|RTR 1 Rancor|A25 1 Ratchet Bomb|M14 1 Reality Smasher|OGW -1 Reanimate|TPR -1 Reassembling Skeleton|MM2 -1 Reclamation Sage|M15 +1 Reanimate|UMA +1 Reassembling Skeleton|M19 +1 Reclamation Sage|M19 1 Recurring Nightmare|TPR 1 Reflector Mage|OGW 1 Regrowth|A25 1 Relic of Progenitus|EMA 1 Remand|MM2 1 Restoration Angel|IMA -1 Reveillark|MMA +1 Reveillark|UMA 1 Ribbons of Night|RAV 1 Rift Bolt|IMA 1 Riftwing Cloudskate|MMA 1 Rishadan Port|A25 1 Rofellos, Llanowar Emissary|VMA 1 Sandsteppe Citadel|KTK -1 Satyr Wayfinder|M15 +1 Satyr Wayfinder|UMA 1 Savage Lands|MM3 1 Savannah|VMA 1 Scavenging Ooze|MM3 @@ -427,10 +427,10 @@ Name=Sam Black's No Search Cube 1 Shardless Agent|EMA 1 Shelldock Isle|LRW 1 Show and Tell|USG -1 Shriekmaw|LRW +1 Shriekmaw|UMA 1 Shrine of Burning Rage|NPH 1 Siege Rhino|KTK -1 Siege-Gang Commander|EMA +1 Siege-Gang Commander|DOM 1 Simic Growth Chamber|IMA 1 Sinkhole|EMA 1 Skirsdag High Priest|ISD @@ -441,7 +441,7 @@ Name=Sam Black's No Search Cube 1 Smash to Smithereens|ORI 1 Smokestack|VMA 1 Smuggler's Copter|KLD -1 Snapcaster Mage|MM3 +1 Snapcaster Mage|UMA 1 Sneak Attack|EMA 1 Sol Ring|VMA 1 Soldier of the Pantheon|THS @@ -458,13 +458,13 @@ Name=Sam Black's No Search Cube 1 Sphinx of the Steel Wind|EMA 1 Sphinx's Revelation|MM3 1 Splinter Twin|MM2 -1 Stirring Wildwood|WWK +1 Stirring Wildwood|UMA 1 Stoke the Flames|M15 1 Stormbreath Dragon|THS 1 Stratus Dancer|DTK 1 Strip Mine|VMA 1 Student of Warfare|ROE -1 Sublime Archangel|M13 +1 Sublime Archangel|UMA 1 Sulfuric Vortex|EMA 1 Sun Titan|M12 1 Sundering Titan|A25 @@ -477,7 +477,7 @@ Name=Sam Black's No Search Cube 1 Taiga|VMA 1 Tamiyo, Field Researcher|EMN 1 Tamiyo, the Moon Sage|AVR -1 Tarmogoyf|MM3 +1 Tarmogoyf|UMA 1 Tasigur, the Golden Fang|FRF 1 Temple of Abandon|THS 1 Temple of Deceit|THS @@ -516,13 +516,13 @@ Name=Sam Black's No Search Cube 1 Tin Street Hooligan|GPT 1 Tireless Tracker|SOI 1 Tolarian Academy|VMA -1 Tormenting Voice|IMA +1 Tormenting Voice|M19 1 Torrential Gearhulk|KLD 1 Toxic Deluge|EMA 1 Tradewind Rider|TPR 1 Trading Post|M14 1 Treachery|UDS -1 Treasure Cruise|KTK +1 Treasure Cruise|UMA 1 Treetop Village|10E 1 Triskelion|M11 1 Tropical Island|VMA @@ -532,7 +532,7 @@ Name=Sam Black's No Search Cube 1 Ugin, the Spirit Dragon|FRF 1 Ulamog, the Ceaseless Hunger|BFZ 1 Umezawa's Jitte|BOK -1 Unburial Rites|MM3 +1 Unburial Rites|UMA 1 Underground Sea|VMA 1 Unexpectedly Absent|EMA 1 Unlicensed Disintegration|KLD @@ -565,7 +565,7 @@ Name=Sam Black's No Search Cube 1 Whip of Erebos|THS 1 Whirler Rogue|ORI 1 Whisperwood Elemental|FRF -1 Wickerbough Elder|EVE +1 Wickerbough Elder|UMA 1 Wild Growth|7ED 1 Wildest Dreams|KLD 1 Wildfire|MM2 @@ -580,7 +580,7 @@ Name=Sam Black's No Search Cube 1 Xathrid Necromancer|M14 1 Yawgmoth's Bargain|UDS 1 Yawgmoth's Will|USG -1 Young Pyromancer|EMA +1 Young Pyromancer|UMA 1 Zealous Conscripts|MM3 1 Zulaport Cutthroat|A25 1 Zurgo Bellstriker|DTK diff --git a/forge-gui/res/cube/The Peasant's Toolbox.dck b/forge-gui/res/cube/The Peasant's Toolbox.dck index 927ec359710..02ef74d907f 100644 --- a/forge-gui/res/cube/The Peasant's Toolbox.dck +++ b/forge-gui/res/cube/The Peasant's Toolbox.dck @@ -9,7 +9,7 @@ Name=The Peasant's Toolbox 1 Aether Figment|ZEN 1 Aether Vial|IMA 1 Aetherize|IMA -1 Aethersnipe|MM2 +1 Aethersnipe|UMA 1 Affa Guard Hound|ROE 1 Agent of Horizons|THS 1 Agony Warp|MM3 @@ -60,7 +60,7 @@ Name=The Peasant's Toolbox 1 Beetleform Mage|DGM 1 Beseech the Queen|SHM 1 Bituminous Blast|ARB -1 Blast of Genius|DGM +1 Blast of Genius|UMA 1 Blessings of Nature|AVR 1 Blightning|A25 1 Blind Creeper|5DN @@ -72,7 +72,7 @@ Name=The Peasant's Toolbox 1 Blood Artist|EMA 1 Blood Ogre|MM2 1 Bloodbraid Elf|EMA -1 Bloodflow Connoisseur|AVR +1 Bloodflow Connoisseur|UMA 1 Bloodhusk Ritualist|WWK 1 Boggart Ram-Gang|SHM 1 Boldwyr Intimidator|CNS @@ -83,7 +83,7 @@ Name=The Peasant's Toolbox 1 Boros Charm|A25 1 Boros Elite|GTC 1 Boros Garrison|IMA -1 Boros Guildgate|MM3 +1 Boros Guildgate|GRN 1 Boros Guildmage|RAV 1 Boros Keyrune|GTC 1 Brackwater Elemental|CFX @@ -101,7 +101,7 @@ Name=The Peasant's Toolbox 1 Burst Lightning|MM2 1 Cage of Hands|CHK 1 Call of the Nightwing|GTC -1 Canker Abomination|EVE +1 Canker Abomination|UMA 1 Cankerous Thirst|EVE 1 Caravan Escort|ROE 1 Careful Consideration|MMA @@ -153,12 +153,12 @@ Name=The Peasant's Toolbox 1 Darkthicket Wolf|ISD 1 Dauntless Onslaught|THS 1 Dauntless River Marshal|M15 -1 Dawn Charm|PLC +1 Dawn Charm|UMA 1 Dawnglare Invoker|ROE 1 Dawntreader Elk|DKA 1 Dead Reckoning|WWK 1 Deadly Allure|DKA -1 Death Denied|MM2 +1 Death Denied|UMA 1 Deathbellow Raider|THS 1 Death-Hood Cobra|MM3 1 Deceiver Exarch|NPH @@ -171,8 +171,8 @@ Name=The Peasant's Toolbox 1 Diabolic Tutor|KLD 1 Dimir Aqueduct|IMA 1 Dimir Charm|GTC -1 Dimir Guildgate|MM3 -1 Dimir Guildmage|MM2 +1 Dimir Guildgate|GRN +1 Dimir Guildmage|UMA 1 Dimir House Guard|RAV 1 Dimir Infiltrator|RAV 1 Dimir Keyrune|GTC @@ -185,10 +185,10 @@ Name=The Peasant's Toolbox 1 Domestication|M14 1 Double Stroke|CNS 1 Down // Dirty|DGM -1 Dragon Egg|IMA +1 Dragon Egg|M19 1 Dragon Mantle|THS 1 Dread Statuary|WWK -1 Dreamscape Artist|PLC +1 Dreamscape Artist|UMA 1 Dreg Mangler|RTR 1 Drift of Phantasms|RAV 1 Drifter il-Dal|TSP @@ -201,7 +201,7 @@ Name=The Peasant's Toolbox 1 Duty-Bound Dead|M13 1 Earthbrawn|MOR 1 Edge of Autumn|FUT -1 Eel Umbra|ROE +1 Eel Umbra|UMA 1 Electrolyze|IMA 1 Emblem of the Warmind|FUT 1 Emrakul's Hatcher|ROE @@ -213,12 +213,12 @@ Name=The Peasant's Toolbox 1 Erebos's Emissary|THS 1 Erratic Mutation|MMA 1 Esper Panorama|ALA -1 Essence Scatter|AKH +1 Essence Scatter|M19 1 Everflame Eidolon|BNG 1 Evolution Charm|PLC 1 Executioner's Swing|GTC 1 Faerie Conclave|10E -1 Faith's Fetters|EMA +1 Faith's Fetters|UMA 1 Falkenrath Exterminator|AVR 1 Falkenrath Noble|MM3 1 Fallen Ideal|TSP @@ -231,7 +231,7 @@ Name=The Peasant's Toolbox 1 Feral Invocation|THS 1 Festerhide Boar|ISD 1 Fettergeist|AVR -1 Fiend Hunter|A25 +1 Fiend Hunter|UMA 1 Fiery Fall|MM2 1 Final-Sting Faerie|MOR 1 Fire at Will|EVE @@ -247,7 +247,7 @@ Name=The Peasant's Toolbox 1 Fleshbag Marauder|ORI 1 Fleshwrither|FUT 1 Flickerwisp|MM3 -1 Flight of Fancy|RAV +1 Flight of Fancy|UMA 1 Flinthoof Boar|EMA 1 Floodchaser|MOR 1 Fluxcharger|DGM @@ -262,11 +262,11 @@ Name=The Peasant's Toolbox 1 Frostburn Weird|RTR 1 Fungal Sprouting|M13 1 Galvanic Arc|RAV -1 Gargoyle Sentinel|M15 +1 Gargoyle Sentinel|M19 1 Gatekeeper of Malakir|ZEN 1 Gatstaf Shepherd|ISD 1 Gelectrode|GPT -1 Generator Servant|M15 +1 Generator Servant|UMA 1 Genju of the Cedars|BOK 1 Genju of the Falls|A25 1 Genju of the Fens|BOK @@ -292,14 +292,14 @@ Name=The Peasant's Toolbox 1 Gnarled Scarhide|JOU 1 Gnarlid Pack|MM2 1 Goblin Bushwhacker|ZEN -1 Goblin Electromancer|MM3 +1 Goblin Electromancer|GRN 1 Goblin Wardriver|MBS 1 God-Favored General|BNG 1 Goldmeadow Lookout|FUT 1 Goldnight Commander|AVR -1 Golgari Charm|RTR +1 Golgari Charm|UMA 1 Golgari Decoy|RTR -1 Golgari Guildgate|MM3 +1 Golgari Guildgate|GRN 1 Golgari Keyrune|RTR 1 Golgari Rot Farm|IMA 1 Gorehorn Minotaurs|MM2 @@ -347,9 +347,9 @@ Name=The Peasant's Toolbox 1 Hunger of the Howlpack|CNS 1 Hunt the Weak|RIX 1 Hunting Triad|MOR -1 Hyena Umbra|ROE +1 Hyena Umbra|UMA 1 Hypervolt Grasp|GPT -1 Icatian Crier|TSP +1 Icatian Crier|UMA 1 Ichor Slick|FUT 1 Ill-Tempered Cyclops|THS 1 Immediate Action|CNS @@ -365,7 +365,7 @@ Name=The Peasant's Toolbox 1 Into the Roil|ZEN 1 Izzet Boilerworks|IMA 1 Izzet Charm|MM3 -1 Izzet Guildgate|MM3 +1 Izzet Guildgate|GRN 1 Izzet Keyrune|RTR 1 Izzet Staticaster|RTR 1 Jackal Familiar|M10 @@ -385,12 +385,12 @@ Name=The Peasant's Toolbox 1 Kingpin's Pet|GTC 1 Kiora's Follower|BNG 1 Kird Chieftain|M15 -1 Kitchen Finks|MMA +1 Kitchen Finks|UMA 1 Knight of Cliffhaven|ROE 1 Knight of Obligation|GTC 1 Knight of the Holy Nimbus|TSP 1 Knight of the Skyward Eye|A25 -1 Knightly Valor|ORI +1 Knightly Valor|M19 1 Kor Aeronaut|ZEN 1 Kor Skyfisher|MM3 1 Korozda Guildmage|RTR @@ -416,7 +416,7 @@ Name=The Peasant's Toolbox 1 Loyal Pegasus|BNG 1 Lust for War|ROE 1 Lyev Skyknight|RTR -1 Mad Prophet|SOI +1 Mad Prophet|UMA 1 Madcap Skills|MM3 1 Magma Jet|MM3 1 Makeshift Mannequin|LRW @@ -434,7 +434,7 @@ Name=The Peasant's Toolbox 1 Mirrodin's Core|CNS 1 Mist Raven|MM3 1 Mistblade Shinobi|BOK -1 Moan of the Unhallowed|ISD +1 Moan of the Unhallowed|UMA 1 Mogg War Marshal|EMA 1 Mogis's Warhound|JOU 1 Moldervine Cloak|MMA @@ -444,9 +444,9 @@ Name=The Peasant's Toolbox 1 Mortis Dogs|NPH 1 Muddle the Mixture|RAV 1 Mulldrifter|MM2 -1 Murderous Redcap|MMA +1 Murderous Redcap|UMA 1 Muzzio's Preparations|CNS -1 Mystic Retrieval|DKA +1 Mystic Retrieval|UMA 1 Mystical Teachings|MM3 1 Naya Panorama|ALA 1 Nearheath Pilgrim|AVR @@ -459,7 +459,7 @@ Name=The Peasant's Toolbox 1 New Prahv Guildmage|RTR 1 Nezumi Graverobber|CHK 1 Niblis of the Breath|DKA -1 Nightbird's Clutches|ISD +1 Nightbird's Clutches|UMA 1 Nightfire Giant|M15 1 Nightshade Assassin|TSP 1 Nightshade Peddler|AVR @@ -512,12 +512,12 @@ Name=The Peasant's Toolbox 1 Plaxcaster Frogling|MM2 1 Plaxmanta|DIS 1 Plumes of Peace|DIS -1 Plumeveil|MMA +1 Plumeveil|UMA 1 Porcelain Legionnaire|NPH 1 Pouncing Wurm|PLC 1 Power Play|CNS 1 Premature Burial|TSP -1 Prismatic Lens|EMA +1 Prismatic Lens|UMA 1 Prized Elephant|M13 1 Profit // Loss|DGM 1 Prophetic Prism|A25 @@ -537,7 +537,7 @@ Name=The Peasant's Toolbox 1 Rakdos Charm|RTR 1 Rakdos Guildgate|MM3 1 Rakdos Keyrune|RTR -1 Rally the Peasants|EMA +1 Rally the Peasants|UMA 1 Reach of Branches|MMA 1 Read the Bones|ORI 1 Reciprocate|CHK @@ -564,7 +564,7 @@ Name=The Peasant's Toolbox 1 River's Grasp|SHM 1 Rix Maadi Guildmage|RTR 1 Roc Egg|M12 -1 Rolling Temblor|ISD +1 Rolling Temblor|UMA 1 Rootwalla|TPR 1 Rubblebelt Maaka|MM3 1 Satyr Nyx-Smith|BNG @@ -583,7 +583,7 @@ Name=The Peasant's Toolbox 1 Seedcradle Witch|SHM 1 Selesnya Charm|RTR 1 Selesnya Evangel|RAV -1 Selesnya Guildgate|MM3 +1 Selesnya Guildgate|GRN 1 Selesnya Keyrune|RTR 1 Selesnya Sanctuary|IMA 1 Selkie Hedge-Mage|EVE @@ -602,7 +602,7 @@ Name=The Peasant's Toolbox 1 Shinen of Life's Roar|SOK 1 Shipwreck Singer|THS 1 Shrewd Hatchling|MM2 -1 Shriekmaw|LRW +1 Shriekmaw|UMA 1 Shrike Harpy|BNG 1 Shuriken|BOK 1 Sickleslicer|MM2 @@ -624,15 +624,15 @@ Name=The Peasant's Toolbox 1 Skirsdag Cultist|MM3 1 Skitter of Lizards|CNS 1 Sky Hussar|DIS -1 Skyknight Legionnaire|MM3 +1 Skyknight Legionnaire|GRN 1 Skymark Roc|RTR 1 Slaughterhorn|MM3 1 Sluiceway Scorpion|RTR -1 Slum Reaper|RTR +1 Slum Reaper|UMA 1 Smallpox|CNS 1 Smite|TPR 1 Snake of the Golden Grove|BNG -1 Snake Umbra|ROE +1 Snake Umbra|UMA 1 Snakeform|EVE 1 Somberwald Spider|ISD 1 Soratami Savant|CHK @@ -640,12 +640,12 @@ Name=The Peasant's Toolbox 1 Soul Snuffers|EVE 1 Soul Stair Expedition|ZEN 1 Soulsworn Jury|DIS -1 Sparkspitter|FUT +1 Sparkspitter|UMA 1 Spawning Pool|10E 1 Spearpoint Oread|THS 1 Spell Contortion|WWK 1 Spell Rupture|GTC -1 Spider Spawning|ISD +1 Spider Spawning|UMA 1 Spike Jester|MM3 1 Spirespine|JOU 1 Spirit en-Dal|FUT @@ -660,8 +660,8 @@ Name=The Peasant's Toolbox 1 Stand Together|DST 1 Stingscourger|EMA 1 Stinkweed Imp|MMA -1 Stitched Drake|ISD -1 Stitcher's Apprentice|ISD +1 Stitched Drake|UMA +1 Stitcher's Apprentice|UMA 1 Stonefare Crocodile|RTR 1 Stoneshock Giant|THS 1 Stonewright|AVR @@ -684,13 +684,13 @@ Name=The Peasant's Toolbox 1 Syndic of Tithes|GTC 1 Syphon Life|MMA 1 Tandem Lookout|MM3 -1 Terramorphic Expanse|MMA +1 Terramorphic Expanse|UMA 1 Terrus Wurm|RTR 1 Test of Faith|MMA 1 Tezzeret's Gambit|MM2 1 Thassa's Emissary|THS 1 Thatcher Revolt|AVR -1 Think Twice|ISD +1 Think Twice|UMA 1 Thornscape Battlemage|MM3 1 Thorn-Thrash Viashino|ALA 1 Thraben Sentry|ISD @@ -718,7 +718,7 @@ Name=The Peasant's Toolbox 1 Trained Condor|M14 1 Transguild Promenade|RTR 1 Traumatic Visions|MMA -1 Travel Preparations|ISD +1 Travel Preparations|UMA 1 Traveler's Amulet|RIX 1 Treetop Village|10E 1 Trestle Troll|RTR @@ -736,7 +736,7 @@ Name=The Peasant's Toolbox 1 Twinstrike|DIS 1 Twisted Abomination|A25 1 Ulvenwald Bear|DKA -1 Unburial Rites|MM3 +1 Unburial Rites|UMA 1 Undercity Informer|GTC 1 Undying Evil|DKA 1 Unexpected Potential|CNS @@ -767,7 +767,7 @@ Name=The Peasant's Toolbox 1 Wakedancer|EMA 1 Wakestone Gargoyle|CNS 1 Wall of Tanglecord|SOM -1 Warleader's Helix|DGM +1 Warleader's Helix|UMA 1 War-Wing Siren|JOU 1 Wasp Lancer|SHM 1 Wasteland Viper|GTC @@ -777,11 +777,11 @@ Name=The Peasant's Toolbox 1 Wear // Tear|DGM 1 Weatherseed Totem|TSP 1 Whiplash Trap|ZEN -1 Wild Hunger|DKA +1 Wild Hunger|UMA 1 Wilt-Leaf Cavaliers|SHM 1 Windrider Eel|ZEN 1 Wing Splicer|MM3 -1 Wingsteed Rider|THS +1 Wingsteed Rider|UMA 1 Wistful Selkie|EVE 1 Witch's Mist|FUT 1 Wojek Halberdiers|GTC diff --git a/forge-gui/res/cube/Timothee Simonot's Twisted Color Pie Cube.dck b/forge-gui/res/cube/Timothee Simonot's Twisted Color Pie Cube.dck index 44dbdb892b5..d01ba4eea2d 100644 --- a/forge-gui/res/cube/Timothee Simonot's Twisted Color Pie Cube.dck +++ b/forge-gui/res/cube/Timothee Simonot's Twisted Color Pie Cube.dck @@ -8,7 +8,7 @@ Name=Timothee Simonot's Twisted Color Pie Cube 1 Aegis of the Gods|JOU 1 Aether Adept|M12 1 Aether Mutation|VMA -1 Ajani's Pridemate|IMA +1 Ajani's Pridemate|M19 1 Akroma, Angel of Wrath|TSB 1 Archangel of Thune|IMA 1 Archangel of Tithes|ORI @@ -33,9 +33,9 @@ Name=Timothee Simonot's Twisted Color Pie Cube 1 Bayou|VMA 1 Beast Within|NPH 1 Beastmaster Ascension|ZEN -1 Become Immense|KTK +1 Become Immense|UMA 1 Bident of Thassa|A25 -1 Bitterblossom|MM2 +1 Bitterblossom|UMA 1 Blackcleave Cliffs|SOM 1 Blasting Station|5DN 1 Blessed Spirits|ORI @@ -67,9 +67,9 @@ Name=Timothee Simonot's Twisted Color Pie Cube 1 Call of the Herd|MM3 1 Caller of the Claw|LGN 1 Carrion Feeder|EMA -1 Cathodion|MM2 +1 Cathodion|UMA 1 Celestial Archon|THS -1 Celestial Colonnade|WWK +1 Celestial Colonnade|UMA 1 Chain Lightning|EMA 1 Chandra, Fire of Kaladesh|ORI 1 Chandra, Flamecaller|OGW @@ -79,7 +79,7 @@ Name=Timothee Simonot's Twisted Color Pie Cube 1 Charmbreaker Devils|IMA 1 Chasm Skulker|M15 1 Chittering Rats|DST -1 Circular Logic|VMA +1 Circular Logic|UMA 1 Civilized Scholar|ISD 1 Claustrophobia|IMA 1 Cloudfin Raptor|GTC @@ -89,7 +89,7 @@ Name=Timothee Simonot's Twisted Color Pie Cube 1 Conclave Naturalists|ORI 1 Coralhelm Commander|ROE 1 Crawling Sensation|SOI -1 Creeping Tar Pit|WWK +1 Creeping Tar Pit|UMA 1 Cryptbreaker|EMN 1 Cryptolith Rite|SOI 1 Crystal Shard|MRD @@ -105,7 +105,7 @@ Name=Timothee Simonot's Twisted Color Pie Cube 1 Deadbridge Goliath|RTR 1 Deep Analysis|EMA 1 Defy Death|AVR -1 Demonic Tutor|VMA +1 Demonic Tutor|UMA 1 Deranged Hermit|VMA 1 Descent of the Dragons|DTK 1 Despoiler of Souls|ORI @@ -128,13 +128,13 @@ Name=Timothee Simonot's Twisted Color Pie Cube 1 Elephant Guide|EMA 1 Emrakul, the Promised End|EMN 1 Enlightened Tutor|EMA -1 Entomb|EMA +1 Entomb|UMA 1 Entomber Exarch|MM3 1 Epic Confrontation|A25 1 Epochrasite|MMA 1 Equilibrium|7ED 1 Eternal Dragon|VMA -1 Eternal Witness|MMA +1 Eternal Witness|UMA 1 Ethereal Armor|RTR 1 Evangelize|TSP 1 Evolving Wilds|RIX @@ -142,10 +142,10 @@ Name=Timothee Simonot's Twisted Color Pie Cube 1 Experiment One|GTC 1 Faceless Butcher|TSB 1 Faerie Conclave|10E -1 Faith's Fetters|EMA +1 Faith's Fetters|UMA 1 Fall of the Titans|OGW 1 False Defeat|PTK -1 Fauna Shaman|M11 +1 Fauna Shaman|UMA 1 Feldon of the Third Path 1 Felidar Sovereign|BFZ 1 Festering Goblin|MMA @@ -174,9 +174,9 @@ Name=Timothee Simonot's Twisted Color Pie Cube 1 Ghoultree|DKA 1 Gideon Jura|M12 1 Gideon, Champion of Justice|GTC -1 Gilded Lotus|M13 +1 Gilded Lotus|DOM 1 Gisela, the Broken Blade|EMN -1 Glen Elendra Archmage|MMA +1 Glen Elendra Archmage|UMA 1 Goblin Assault|MM3 1 Goblin Bombardment|TPR 1 Goblin Dark-Dwellers|OGW @@ -184,7 +184,7 @@ Name=Timothee Simonot's Twisted Color Pie Cube 1 Goblin Welder|ULG 1 Goblinslide|KTK 1 Godless Shrine|GTC -1 Golgari Grave-Troll|RAV +1 Golgari Grave-Troll|UMA 1 Grafted Wargear|5DN 1 Grand Architect|SOM 1 Grapple with the Past|EMN @@ -213,7 +213,7 @@ Name=Timothee Simonot's Twisted Color Pie Cube 1 Horizon Canopy|IMA 1 Huntmaster of the Fells|DKA 1 Hypnotic Specter|M10 -1 Icy Manipulator|10E +1 Icy Manipulator|DOM 1 Imp's Mischief|PLC 1 Incendiary Command|LRW 1 Infiltration Lens|SOM @@ -235,21 +235,21 @@ Name=Timothee Simonot's Twisted Color Pie Cube 1 Kessig Prowler|EMN 1 Kher Keep|TSP 1 Kira, Great Glass-Spinner|MMA -1 Kitchen Finks|MMA +1 Kitchen Finks|UMA 1 Kor Spiritdancer|ROE -1 Kozilek, Butcher of Truth|MM2 +1 Kozilek, Butcher of Truth|UMA 1 Krenko's Command|M13 1 Krenko, Mob Boss|M13 1 Kumano, Master Yamabushi|CHK -1 Laboratory Maniac|ISD +1 Laboratory Maniac|UMA 1 Leaden Myr|SOM 1 Leafcrown Dryad|THS 1 Leonin Bola|DST -1 Life from the Loam|MMA +1 Life from the Loam|UMA 1 Lightning Bolt|A25 1 Lightning Crafter|MOR 1 Lignify|LRW -1 Liliana of the Veil|MM3 +1 Liliana of the Veil|UMA 1 Liliana, Heretical Healer|ORI 1 Liliana, the Last Hope|EMN 1 Looter il-Kor|TSP @@ -266,7 +266,7 @@ Name=Timothee Simonot's Twisted Color Pie Cube 1 Mark of Eviction|RAV 1 Marsh Flats|MM3 1 Martyr of Frost|CSP -1 Martyr of Sands|CSP +1 Martyr of Sands|UMA 1 Mass Polymorph|M11 1 Master of Waves|THS 1 Mausoleum Wanderer|EMN @@ -279,19 +279,19 @@ Name=Timothee Simonot's Twisted Color Pie Cube 1 Mesmeric Orb|MRD 1 Military Intelligence|M15 1 Mindslaver|SOM -1 Miraculous Recovery|VIS +1 Miraculous Recovery|UMA 1 Misdirection|CNS 1 Mishra's Factory|A25 1 Misty Rainforest|MM3 1 Mogg Fanatic|EMA 1 Mogg War Marshal|EMA -1 Molten Birth|M14 +1 Molten Birth|UMA 1 Molten Slagheap|TSP 1 Monk Idealist|EMA 1 Mortarpod|MM2 1 Mosswort Bridge|LRW 1 Murderous Cut|KTK -1 Murderous Redcap|MMA +1 Murderous Redcap|UMA 1 Mutagenic Growth|MM2 1 Mutavault|M14 1 Myr Battlesphere|SOM @@ -323,7 +323,7 @@ Name=Timothee Simonot's Twisted Color Pie Cube 1 Opposition|7ED 1 Orcish Cannoneers|ICE 1 Outpost Siege|FRF -1 Overgrown Tomb|RTR +1 Overgrown Tomb|GRN 1 Overrun|TPR 1 Oversold Cemetery|ONS 1 Overwhelming Stampede|MM2 @@ -337,13 +337,13 @@ Name=Timothee Simonot's Twisted Color Pie Cube 1 Pia and Kiran Nalaar|ORI 1 Pillory of the Sleepless|A25 1 Plateau|VMA -1 Platinum Emperion|SOM +1 Platinum Emperion|UMA 1 Polluted Delta|KTK 1 Polymorph|M10 1 Porcelain Legionnaire|NPH 1 Porphyry Nodes|PLC 1 Predatory Rampage|M13 -1 Prey Upon|AER +1 Prey Upon|UMA 1 Pristine Talisman|IMA 1 Propaganda|TMP 1 Prophetic Prism|A25 @@ -354,7 +354,7 @@ Name=Timothee Simonot's Twisted Color Pie Cube 1 Pyrite Spellbomb|MMA 1 Pyromancer's Goggles|ORI 1 Quicksilver Amulet|M12 -1 Raging Ravine|WWK +1 Raging Ravine|UMA 1 Rakdos Keyrune|RTR 1 Rakdos Signet|MM3 1 Rakdos's Return|RTR @@ -362,23 +362,23 @@ Name=Timothee Simonot's Twisted Color Pie Cube 1 Raven's Crime|MMA 1 Ravenous Rats|M13 1 Razorfin Hunter|APC -1 Reassembling Skeleton|MM2 -1 Reclamation Sage|M15 +1 Reassembling Skeleton|M19 +1 Reclamation Sage|M19 1 Recurring Nightmare|TPR 1 Regrowth|A25 1 Relentless Dead|SOI 1 Remand|MM2 1 Replenish|UDS 1 Restoration Angel|IMA -1 Resurrection|TSB -1 Reveillark|MMA +1 Resurrection|UMA +1 Reveillark|UMA 1 Rhys the Redeemed|SHM 1 Riftwing Cloudskate|MMA 1 Riptide Laboratory|ONS 1 River of Tears|IMA 1 Rolling Earthquake|PTK 1 Ruby Medallion|TMP -1 Sacred Foundry|GTC +1 Sacred Foundry|GRN 1 Sacred Mesa|TSB 1 Sage of Fables|MOR 1 Sage's Dousing|MOR @@ -402,10 +402,10 @@ Name=Timothee Simonot's Twisted Color Pie Cube 1 Shambling Vent|BFZ 1 Shelldock Isle|LRW 1 Sheoldred, Whispering One|IMA -1 Shriekmaw|LRW +1 Shriekmaw|UMA 1 Shrine of Burning Rage|NPH 1 Sidisi, Undead Vizier|DTK -1 Siege-Gang Commander|EMA +1 Siege-Gang Commander|DOM 1 Sigil of the Empty Throne|ORI 1 Silumgar Sorcerer|DTK 1 Skinrender|SOM @@ -415,7 +415,7 @@ Name=Timothee Simonot's Twisted Color Pie Cube 1 Smokestack|VMA 1 Snakeform|EVE 1 Snap|ULG -1 Snapcaster Mage|MM3 +1 Snapcaster Mage|UMA 1 Sneak Attack|EMA 1 Solemn Simulacrum|M12 1 Solitary Confinement|JUD @@ -437,10 +437,10 @@ Name=Timothee Simonot's Twisted Color Pie Cube 1 Starfield of Nyx|ORI 1 Starstorm|VMA 1 Stasis Snare|BFZ -1 Steam Vents|RTR +1 Steam Vents|GRN 1 Sterling Grove|INV 1 Stinkweed Imp|MMA -1 Stirring Wildwood|WWK +1 Stirring Wildwood|UMA 1 Stoke the Flames|M15 1 Stomping Ground|GTC 1 Stonybrook Banneret|MOR @@ -456,23 +456,23 @@ Name=Timothee Simonot's Twisted Color Pie Cube 1 Taiga|VMA 1 Talisman of Indulgence|MRD 1 Tangle Wire|NMS -1 Tarmogoyf|MM3 +1 Tarmogoyf|UMA 1 Tasigur, the Golden Fang|FRF 1 Tectonic Edge|WWK -1 Temple Garden|RTR +1 Temple Garden|GRN 1 Temple of Enlightenment|BNG 1 Temple of Epiphany|JOU 1 Temple of Malady|JOU 1 Temporal Isolation|TSP 1 Tempt with Vengeance -1 Terramorphic Expanse|MMA +1 Terramorphic Expanse|UMA 1 Thassa, God of the Sea|THS 1 Thought Courier|9ED 1 Thraben Inspector|SOI 1 Thwart|MMQ 1 Tidebinder Mage|M14 1 Tombstone Stairwell|MIR -1 Tormenting Voice|IMA +1 Tormenting Voice|M19 1 Trading Post|M14 1 Tranquil Thicket|VMA 1 Trash for Treasure|MRD @@ -487,9 +487,9 @@ Name=Timothee Simonot's Twisted Color Pie Cube 1 Twilight Mire|A25 1 Ugin, the Spirit Dragon|FRF 1 Ulamog, the Ceaseless Hunger|BFZ -1 Ulamog, the Infinite Gyre|MM2 +1 Ulamog, the Infinite Gyre|UMA 1 Ulvenwald Tracker|MM3 -1 Unburial Rites|MM3 +1 Unburial Rites|UMA 1 Undercity Informer|GTC 1 Underground Sea|VMA 1 Unexpectedly Absent|EMA @@ -500,7 +500,7 @@ Name=Timothee Simonot's Twisted Color Pie Cube 1 Varolz, the Scar-Striped|DGM 1 Vedalken Mastermind|10E 1 Vendilion Clique|A25 -1 Vengevine|ROE +1 Vengevine|UMA 1 Venser, Shaper Savant|MM3 1 Verdant Catacombs|MM3 1 Vessel of Nascency|A25 @@ -513,11 +513,11 @@ Name=Timothee Simonot's Twisted Color Pie Cube 1 Volrath's Stronghold|TPR 1 Wake Thrasher|EVE 1 Wall of Omens|EMA -1 Wall of Reverence|CFX +1 Wall of Reverence|UMA 1 Wandering Fumarole|OGW 1 Wasteland|EMA 1 Waterfront Bouncer|VMA -1 Watery Grave|GTC +1 Watery Grave|GRN 1 Weathered Wayfarer|9ED 1 Weaver of Lightning|EMN 1 Well of Lost Dreams|DST @@ -538,6 +538,6 @@ Name=Timothee Simonot's Twisted Color Pie Cube 1 Worm Harvest|MMA 1 Xenagos, the Reveler|THS 1 Yavimaya Coast|ORI -1 Young Pyromancer|EMA +1 Young Pyromancer|UMA 1 Zombie Infestation|M12 1 Zur's Weirding|9ED diff --git a/forge-gui/res/cube/www.mtgcube.com (502 cards).dck b/forge-gui/res/cube/www.mtgcube.com (502 cards).dck index 5e4c27309df..2c46e301cae 100644 --- a/forge-gui/res/cube/www.mtgcube.com (502 cards).dck +++ b/forge-gui/res/cube/www.mtgcube.com (502 cards).dck @@ -35,7 +35,7 @@ Name=www.mtgcube.com (502 cards) 1 Bayou|VMA 1 Birds of Paradise|M12 1 Birthing Pod|NPH -1 Bitterblossom|MM2 +1 Bitterblossom|UMA 1 Black Lotus|VMA 1 Black Vise|4ED 1 Blade Splicer|MM3 @@ -63,9 +63,9 @@ Name=www.mtgcube.com (502 cards) 1 Carnophage|TPR 1 Catastrophe|USG 1 Caves of Koilos|ORI -1 Celestial Colonnade|WWK +1 Celestial Colonnade|UMA 1 Chain Lightning|EMA -1 Chainer's Edict|TOR +1 Chainer's Edict|UMA 1 Chameleon Colossus|MOR 1 Chandra Nalaar|M11 1 Chandra, Pyromaster|M15 @@ -81,8 +81,8 @@ Name=www.mtgcube.com (502 cards) 1 Control Magic|EMA 1 Counterspell|A25 1 Creakwood Liege|MM2 -1 Creeping Tar Pit|WWK -1 Crucible of Worlds|10E +1 Creeping Tar Pit|UMA +1 Crucible of Worlds|M19 1 Cryptic Command|IMA 1 Crystal Shard|MRD 1 Cultivate|A25 @@ -94,17 +94,17 @@ Name=www.mtgcube.com (502 cards) 1 Day of Judgment|M12 1 Daze|EMA 1 Deep Analysis|EMA -1 Demonic Tutor|VMA +1 Demonic Tutor|UMA 1 Deranged Hermit|VMA 1 Detention Sphere|RTR 1 Diabolic Edict|A25 1 Dimir Signet|MM3 -1 Diregraf Ghoul|ISD +1 Diregraf Ghoul|M19 1 Disenchant|A25 1 Dismember|MM2 1 Dreadbore|RTR 1 Dryad Militant|RTR -1 Duress|IMA +1 Duress|M19 1 Dust Bowl|MMQ 1 Dwarven Blastminer|ONS 1 Earthquake|M10 @@ -115,13 +115,13 @@ Name=www.mtgcube.com (502 cards) 1 Elspeth, Knight-Errant|MMA 1 Elspeth, Sun's Champion|THS 1 Empty the Warrens|MMA -1 Emrakul, the Aeons Torn|MM2 +1 Emrakul, the Aeons Torn|UMA 1 Enclave Cryptologist|ROE 1 Enlightened Tutor|EMA -1 Entomb|EMA +1 Entomb|UMA 1 Erratic Portal|TPR 1 Esper Charm|ALA -1 Eternal Witness|MMA +1 Eternal Witness|UMA 1 Eureka|VMA 1 Everflowing Chalice|MM2 1 Evolving Wilds|RIX @@ -130,12 +130,12 @@ Name=www.mtgcube.com (502 cards) 1 Experiment One|GTC 1 Fact or Fiction|EMA 1 Faerie Conclave|10E -1 Faithless Looting|EMA -1 Faith's Fetters|EMA +1 Faithless Looting|UMA +1 Faith's Fetters|UMA 1 Falkenrath Aristocrat|MM3 -1 Fauna Shaman|M11 +1 Fauna Shaman|UMA 1 Figure of Destiny|MMA -1 Fire // Ice|APC +1 Fire // Ice|UMA 1 Fire Imp|POR 1 Firebolt|EMA 1 Firedrinker Satyr|THS @@ -163,7 +163,7 @@ Name=www.mtgcube.com (502 cards) 1 Gideon's Lawkeeper|MM3 1 Gifts Ungiven|MM3 1 Gilded Drake|USG -1 Glen Elendra Archmage|MMA +1 Glen Elendra Archmage|UMA 1 Go for the Throat|MBS 1 Goblin Guide|MM3 1 Goblin Welder|ULG @@ -193,7 +193,7 @@ Name=www.mtgcube.com (502 cards) 1 Huntmaster of the Fells|DKA 1 Hymn to Tourach|EMA 1 Hypnotic Specter|M10 -1 Icy Manipulator|10E +1 Icy Manipulator|DOM 1 Impending Disaster|ULG 1 Imperial Seal|PTK 1 Imposing Sovereign|M14 @@ -215,46 +215,46 @@ Name=www.mtgcube.com (502 cards) 1 Jungle Lion|POR 1 Kalonian Hydra|M14 1 Karmic Guide|EMA -1 Karn Liberated|MM2 +1 Karn Liberated|UMA 1 Karn, Silver Golem|VMA 1 Kataki, War's Wage|MMA 1 Keldon Marauders|EMA 1 Keldon Vandals|UDS 1 Kird Ape|EMA -1 Kitchen Finks|MMA +1 Kitchen Finks|UMA 1 Knight of Meadowgrain|LRW -1 Kodama's Reach|MMA +1 Kodama's Reach|UMA 1 Kor Sanctifiers|ZEN 1 Kor Skyfisher|MM3 1 Koth of the Hammer|SOM -1 Kozilek, Butcher of Truth|MM2 +1 Kozilek, Butcher of Truth|UMA 1 Land Tax|4ED -1 Lavaclaw Reaches|WWK +1 Lavaclaw Reaches|UMA 1 Library of Alexandria|VMA -1 Life from the Loam|MMA +1 Life from the Loam|UMA 1 Lifebane Zombie|M14 1 Lightning Bolt|A25 1 Lightning Greaves|MRD 1 Lightning Helix|IMA 1 Lightning Mauler|AVR -1 Lightning Strike|XLN -1 Liliana of the Veil|MM3 +1 Lightning Strike|M19 +1 Liliana of the Veil|UMA 1 Lingering Souls|MM3 -1 Llanowar Elves|EMA +1 Llanowar Elves|DOM 1 Llanowar Wastes|ORI 1 Lone Missionary|MM3 1 Looter il-Kor|TSP 1 Lotleth Troll|RTR 1 Lotus Cobra|IMA 1 Luminarch Ascension|A25 -1 Maelstrom Pulse|MMA +1 Maelstrom Pulse|UMA 1 Magma Jet|MM3 1 Man-o'-War|A25 1 Mana Crypt|EMA 1 Mana Drain|IMA 1 Mana Leak|IMA 1 Mana Tithe|PLC -1 Mana Vault|VMA +1 Mana Vault|UMA 1 Manic Vandal|M12 1 Marsh Flats|MM3 1 Master of the Wild Hunt|A25 @@ -287,7 +287,7 @@ Name=www.mtgcube.com (502 cards) 1 Mox Ruby|VMA 1 Mox Sapphire|VMA 1 Mulldrifter|MM2 -1 Murderous Redcap|MMA +1 Murderous Redcap|UMA 1 Mutavault|M14 1 Myr Battlesphere|SOM 1 Mystic Snake|A25 @@ -300,13 +300,13 @@ Name=www.mtgcube.com (502 cards) 1 Nevinyrral's Disk|EMA 1 Nezumi Graverobber|CHK 1 Nicol Bolas, Planeswalker|M13 -1 Noble Hierarch|MM2 +1 Noble Hierarch|UMA 1 Ob Nixilis, the Fallen|IMA 1 Oblivion Ring|MM2 1 Oona's Prowler|LRW 1 Opposition|7ED 1 Orzhov Signet|MM3 -1 Overgrown Tomb|RTR +1 Overgrown Tomb|GRN 1 Pack Rat|RTR 1 Path to Exile|MM3 1 Pernicious Deed|A25 @@ -329,7 +329,7 @@ Name=www.mtgcube.com (502 cards) 1 Psychatog|VMA 1 Purphoros, God of the Forge|THS 1 Qasali Pridemage|ARB -1 Raging Ravine|WWK +1 Raging Ravine|UMA 1 Rakdos Cackler|RTR 1 Rakdos Signet|MM3 1 Ral Zarek|DGM @@ -337,19 +337,19 @@ Name=www.mtgcube.com (502 cards) 1 Ranger of Eos|MM3 1 Ratchet Bomb|M14 1 Ravages of War|PTK -1 Reanimate|TPR -1 Reassembling Skeleton|MM2 +1 Reanimate|UMA +1 Reassembling Skeleton|M19 1 Reckless Waif|ISD 1 Recurring Nightmare|TPR 1 Reflecting Pool|CNS 1 Regrowth|A25 1 Remand|MM2 1 Restoration Angel|IMA -1 Reveillark|MMA +1 Reveillark|UMA 1 Rishadan Port|A25 1 River Boa|ZEN 1 Rolling Earthquake|PTK -1 Sacred Foundry|GTC +1 Sacred Foundry|GRN 1 Sakura-Tribe Elder|CNS 1 Sarkhan Vol|MMA 1 Savannah|VMA @@ -366,8 +366,8 @@ Name=www.mtgcube.com (502 cards) 1 Shadowborn Demon|M14 1 Shadowmage Infiltrator|A25 1 Show and Tell|USG -1 Shriekmaw|LRW -1 Siege-Gang Commander|EMA +1 Shriekmaw|UMA +1 Siege-Gang Commander|DOM 1 Sigarda, Host of Herons|AVR 1 Silverblade Paladin|AVR 1 Simic Charm|GTC @@ -380,7 +380,7 @@ Name=www.mtgcube.com (502 cards) 1 Skullclamp|VMA 1 Smallpox|CNS 1 Smokestack|VMA -1 Snapcaster Mage|MM3 +1 Snapcaster Mage|UMA 1 Sneak Attack|EMA 1 Snuff Out|MMQ 1 Sol Ring|VMA @@ -400,7 +400,7 @@ Name=www.mtgcube.com (502 cards) 1 Squee, Goblin Nabob|MMA 1 Staggershock|IMA 1 Steam Augury|THS -1 Steam Vents|RTR +1 Steam Vents|GRN 1 Steppe Lynx|ZEN 1 Stomping Ground|GTC 1 Stoneforge Mystic|WWK @@ -424,10 +424,10 @@ Name=www.mtgcube.com (502 cards) 1 Sylvan Library|EMA 1 Taiga|VMA 1 Tangle Wire|NMS -1 Tarmogoyf|MM3 -1 Temple Garden|RTR +1 Tarmogoyf|UMA +1 Temple Garden|GRN 1 Terminus|MM3 -1 Terramorphic Expanse|MMA +1 Terramorphic Expanse|UMA 1 Tezzeret the Seeker|MM2 1 Tezzeret, Agent of Bolas|MBS 1 Thalia, Guardian of Thraben|A25 @@ -456,7 +456,7 @@ Name=www.mtgcube.com (502 cards) 1 Tundra|VMA 1 Twinblade Slasher|EVE 1 Uktabi Orangutan|6ED -1 Ulamog, the Infinite Gyre|MM2 +1 Ulamog, the Infinite Gyre|UMA 1 Umezawa's Jitte|BOK 1 Underground Sea|VMA 1 Undiscovered Paradise|VIS @@ -467,7 +467,7 @@ Name=www.mtgcube.com (502 cards) 1 Vampiric Tutor|EMA 1 Vedalken Shackles|MMA 1 Vendilion Clique|A25 -1 Vengevine|ROE +1 Vengevine|UMA 1 Venser, Shaper Savant|MM3 1 Venser, the Sojourner|SOM 1 Verdant Catacombs|MM3 @@ -482,10 +482,10 @@ Name=www.mtgcube.com (502 cards) 1 Wall of Roots|IMA 1 Wasteland|EMA 1 Waterfront Bouncer|VMA -1 Watery Grave|GTC +1 Watery Grave|GRN 1 Wheel of Fortune|VMA -1 Wickerbough Elder|EVE -1 Wild Mongrel|VMA +1 Wickerbough Elder|UMA +1 Wild Mongrel|UMA 1 Wild Nacatl|ALA 1 Wildfire|MM2 1 Willbender|A25 @@ -494,12 +494,12 @@ Name=www.mtgcube.com (502 cards) 1 Wolfbitten Captive|DKA 1 Wolfir Silverheart|AVR 1 Wooded Foothills|KTK -1 Woodfall Primus|MMA +1 Woodfall Primus|UMA 1 Worldly Tutor|6ED 1 Worn Powerstone|EMA 1 Wurmcoil Engine|SOM 1 Xenagos, the Reveler|THS 1 Yavimaya Elder|VMA 1 Yawgmoth's Will|USG -1 Young Pyromancer|EMA +1 Young Pyromancer|UMA 1 Zuran Orb|ICE diff --git a/forge-gui/res/draft/MTGO Vintage Cube December 2018.draft b/forge-gui/res/draft/MTGO Vintage Cube December 2018.draft new file mode 100644 index 00000000000..fb31024b39c --- /dev/null +++ b/forge-gui/res/draft/MTGO Vintage Cube December 2018.draft @@ -0,0 +1,6 @@ +Name:MTGO Vintage Cube December 2018 +DeckFile:MTGO Vintage Cube December 2018 +Singleton:True + +Booster: 15 Any +NumPacks: 3 diff --git a/forge-gui/res/draft/MTGO Vintage Cube June 2018.draft b/forge-gui/res/draft/MTGO Vintage Cube June 2018.draft new file mode 100644 index 00000000000..3604766b322 --- /dev/null +++ b/forge-gui/res/draft/MTGO Vintage Cube June 2018.draft @@ -0,0 +1,6 @@ +Name:MTGO Vintage Cube June 2018 +DeckFile:MTGO Vintage Cube June 2018 +Singleton:True + +Booster: 15 Any +NumPacks: 3 From 4168ef0b0db7ebe593646468fa3f00ecf421904f Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 29 Dec 2018 15:45:20 +0100 Subject: [PATCH 545/901] Morph and Manifest are not to facedown anymore --- .../java/forge/ai/simulation/GameCopier.java | 3 +- .../src/main/java/forge/game/card/Card.java | 36 +++++++++----- .../java/forge/game/card/CardFactoryUtil.java | 47 +++++++------------ .../main/java/forge/game/card/CardState.java | 4 ++ .../forge/game/spellability/SpellAbility.java | 13 +---- 5 files changed, 49 insertions(+), 54 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 b1fe62567bf..2ab4d392c64 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java +++ b/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java @@ -310,7 +310,8 @@ public class GameCopier { newCard.setManifested(true); // TODO: Should be able to copy other abilities... if (isCreature && hasManaCost) { - newCard.addSpellAbility(CardFactoryUtil.abilityManifestFaceUp(newCard, newCard.getManaCost())); + newCard.getState(CardStateName.Original).addSpellAbility( + CardFactoryUtil.abilityManifestFaceUp(newCard, newCard.getManaCost())); } } } diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index ece24a74a2f..f200b4a930d 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -528,30 +528,30 @@ public class Card extends GameEntity implements Comparable { public Card manifest(Player p, SpellAbility sa) { // Turn Face Down (even if it's DFC). - CardState originalCard = this.getState(CardStateName.Original); - ManaCost cost = originalCard.getManaCost(); + ManaCost cost = getState(CardStateName.Original).getManaCost(); - boolean isCreature = this.isCreature(); + boolean isCreature = isCreature(); - // Sometimes cards are manifested while already being face down - if (!turnFaceDown(true) && currentStateName != CardStateName.FaceDown) { - return null; - } + // Sometimes cards are manifested while already being face down + if (!turnFaceDown(true) && !isFaceDown()) { + return null; + } // Move to p's battlefield Game game = p.getGame(); - // Just in case you aren't the controller, now you are! - this.setController(p, game.getNextTimestamp()); + + // Just in case you aren't the controller, now you are! + setController(p, game.getNextTimestamp()); // Mark this card as "manifested" - this.setPreFaceDownState(CardStateName.Original); - this.setManifested(true); + setPreFaceDownState(CardStateName.Original); + setManifested(true); Card c = game.getAction().moveToPlay(this, p, sa); // Add manifest demorph static ability for creatures if (isCreature && !cost.isNoCost()) { - c.addSpellAbility(CardFactoryUtil.abilityManifestFaceUp(c, cost)); - + // Add Manifest to original State + c.getState(CardStateName.Original).addSpellAbility(CardFactoryUtil.abilityManifestFaceUp(c, cost)); c.updateStateForView(); } @@ -2233,6 +2233,16 @@ public class Card extends GameEntity implements Comparable { updateBasicLandAbilities(list, state); } + // add Facedown abilities from Original state but only if this state is face down + // need CardStateView#getState or might crash in StackOverflow + if ((mana == null || mana == false) && isFaceDown() && state.getView().getState() == CardStateName.FaceDown) { + for (SpellAbility sa : getState(CardStateName.Original).getNonManaAbilities()) { + if (sa.isManifestUp() || sa.isMorphUp()) { + list.add(sa); + } + } + } + for (KeywordInterface kw : getUnhiddenKeywords(state)) { for (SpellAbility sa : kw.getAbilities()) { if (mana == null || mana == sa.isManaAbility()) { diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 65cebaa7191..f467b6658ca 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -136,27 +136,27 @@ public class CardFactoryUtil { public static SpellAbility abilityMorphUp(final Card sourceCard, final String costStr, final boolean mega) { Cost cost = new Cost(costStr, true); String costDesc = cost.toString(); - // get rid of the ": " at the end - costDesc = costDesc.substring(0, costDesc.length() - 2); - + StringBuilder sbCost = new StringBuilder(mega ? "Megamorph" : "Morph"); + sbCost.append(" "); if (!cost.isOnlyManaCost()) { - costDesc = "—" + costDesc; + sbCost.append("— "); } + // get rid of the ": " at the end + sbCost.append(costDesc.substring(0, costDesc.length() - 2)); - String ab = "ST$ SetState | Cost$ " + costStr + " | CostDesc$ Morph" + costDesc - + " | MorphUp$ True" - + " | ConditionDefined$ Self | ConditionPresent$ Card.faceDown" - + " | Mode$ TurnFace | SpellDescription$ (Turn this face up any time for its morph cost.)"; + StringBuilder sb = new StringBuilder(); + sb.append("ST$ SetState | Cost$ ").append(costStr).append(" | CostDesc$ ").append(sbCost); + sb.append(" | MorphUp$ True | Secondary$ True | IsPresent$ Card.Self+faceDown"); if (mega) { - ab += " | Mega$ True"; + sb.append(" | Mega$ True"); } + sb.append(" | Mode$ TurnFace | SpellDescription$ (Turn this face up any time for its morph cost.)"); - final SpellAbility morphUp = AbilityFactory.getAbility(ab, sourceCard); + final SpellAbility morphUp = AbilityFactory.getAbility(sb.toString(), sourceCard); final StringBuilder sbStack = new StringBuilder(); sbStack.append(sourceCard.getName()).append(" - turn this card face up."); morphUp.setStackDescription(sbStack.toString()); - morphUp.setIsMorphUp(true); return morphUp; } @@ -166,18 +166,17 @@ public class CardFactoryUtil { String costDesc = manaCost.toString(); // Cost need to be set later - String ab = "ST$ SetState | Cost$ 0 | CostDesc$ Unmanifest " + costDesc - + " | ManifestUp$ True" - + " | ConditionDefined$ Self | ConditionPresent$ Card.faceDown+manifested" - + " | Mode$ TurnFace | SpellDescription$ (Turn this face up any time for its mana cost.)"; + StringBuilder sb = new StringBuilder(); + sb.append("ST$ SetState | Cost$ 0 | CostDesc$ Unmanifest ").append(costDesc); + sb.append(" | ManifestUp$ True | Secondary$ True | IsPresent$ Card.Self+faceDown+manifested"); + sb.append(" | Mode$ TurnFace | SpellDescription$ (Turn this face up any time for its mana cost.)"); - final SpellAbility manifestUp = AbilityFactory.getAbility(ab, sourceCard); + final SpellAbility manifestUp = AbilityFactory.getAbility(sb.toString(), sourceCard); manifestUp.setPayCosts(new Cost(manaCost, true)); final StringBuilder sbStack = new StringBuilder(); sbStack.append(sourceCard.getName()).append(" - turn this card face up."); manifestUp.setStackDescription(sbStack.toString()); - manifestUp.setIsManifestUp(true); return manifestUp; } @@ -4037,22 +4036,12 @@ public class CardFactoryUtil { final String[] k = keyword.split(":"); inst.addSpellAbility(abilityMorphDown(card)); - - CardState state = card.getState(CardStateName.FaceDown); - state.setSVars(card.getSVars()); - KeywordInterface facedownKeyword = Keyword.getInstance(""); - facedownKeyword.addSpellAbility(abilityMorphUp(card, k[1], false)); - state.addIntrinsicKeywords(Lists.newArrayList(facedownKeyword)); + inst.addSpellAbility(abilityMorphUp(card, k[1], false)); } else if (keyword.startsWith("Megamorph")){ final String[] k = keyword.split(":"); inst.addSpellAbility(abilityMorphDown(card)); - - CardState state = card.getState(CardStateName.FaceDown); - state.setSVars(card.getSVars()); - KeywordInterface facedownKeyword = Keyword.getInstance(""); - facedownKeyword.addSpellAbility(abilityMorphUp(card, k[1], true)); - state.addIntrinsicKeywords(Lists.newArrayList(facedownKeyword)); + inst.addSpellAbility(abilityMorphUp(card, k[1], true)); } else if (keyword.startsWith("Multikicker")) { final String[] n = keyword.split(":"); final SpellAbility sa = card.getFirstSpellAbility(); diff --git a/forge-game/src/main/java/forge/game/card/CardState.java b/forge-game/src/main/java/forge/game/card/CardState.java index 5372ddfa18e..97bfad4ff04 100644 --- a/forge-game/src/main/java/forge/game/card/CardState.java +++ b/forge-game/src/main/java/forge/game/card/CardState.java @@ -69,6 +69,10 @@ public class CardState extends GameObject { private final CardStateView view; private final Card card; + public CardState(Card card, CardStateName name) { + this(card.getView().createAlternateState(name), card); + } + public CardState(CardStateView view0, Card card0) { view = view0; card = card0; diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index 853c29b21f4..818aa487a9a 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -107,8 +107,6 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit private boolean spectacle = false; private boolean offering = false; private boolean emerge = false; - private boolean morphup = false; - private boolean manifestUp = false; private boolean cumulativeupkeep = false; private boolean outlast = false; private boolean blessing = false; @@ -372,22 +370,15 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit public boolean isAbility() { return true; } public boolean isMorphUp() { - return morphup; + return this.hasParam("MorphUp"); } public boolean isCastFaceDown() { return false; } - public final void setIsMorphUp(final boolean b) { - morphup = b; - } - public boolean isManifestUp() { - return manifestUp; - } - public final void setIsManifestUp(final boolean b) { - manifestUp = b; + return hasParam("ManifestUp"); } public boolean isCycling() { From 468ff7fc50f40f0917beb279eade757896917fe2 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 30 Dec 2018 08:19:29 +0300 Subject: [PATCH 546/901] - Fixed the reveal for face-down cards leaving battlefield/stack not working anymore. --- forge-game/src/main/java/forge/game/GameAction.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 6a7fbd7e4e2..60e82688e03 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -104,6 +104,7 @@ public class GameAction { boolean toBattlefield = zoneTo.is(ZoneType.Battlefield); boolean fromBattlefield = zoneFrom != null && zoneFrom.is(ZoneType.Battlefield); boolean toHand = zoneTo.is(ZoneType.Hand); + boolean wasFacedown = c.isFaceDown(); //Rule 110.5g: A token that has left the battlefield can't move to another zone if (c.isToken() && zoneFrom != null && !fromBattlefield && !zoneFrom.is(ZoneType.Command)) { @@ -150,7 +151,7 @@ public class GameAction { // Cards returned from exile face-down must be reset to their original state, otherwise // all sort of funky shenanigans may happen later (e.g. their ETB replacement effects are set // up on the wrong card state etc.). - if (c.isFaceDown() && (fromBattlefield || (toHand && zoneFrom.is(ZoneType.Exile)))) { + if (wasFacedown && (fromBattlefield || (toHand && zoneFrom.is(ZoneType.Exile)))) { c.setState(CardStateName.Original, true); c.runFaceupCommands(); } @@ -435,10 +436,13 @@ public class GameAction { } // rule 504.6: reveal a face-down card leaving the stack - if (zoneFrom != null && zoneTo != null && zoneFrom.is(ZoneType.Stack) && !zoneTo.is(ZoneType.Battlefield) && c.isFaceDown()) { + if (zoneFrom != null && zoneTo != null && zoneFrom.is(ZoneType.Stack) && !zoneTo.is(ZoneType.Battlefield) && wasFacedown) { + boolean trackerFrozen = game.getTracker().isFrozen(); + game.getTracker().unfreeze(); c.setState(CardStateName.Original, true); reveal(new CardCollection(c), c.getOwner(), true, "Face-down card moves from the stack: "); c.setState(CardStateName.FaceDown, true); + if (trackerFrozen) {game.getTracker().freeze();} } if (fromBattlefield) { @@ -466,10 +470,13 @@ public class GameAction { changeZone(null, zoneTo, unmeld, position, cause, params); } // Reveal if face-down - if (c.isFaceDown()) { + if (wasFacedown) { + boolean trackerFrozen = game.getTracker().isFrozen(); + game.getTracker().unfreeze(); c.setState(CardStateName.Original, true); reveal(new CardCollection(c), c.getOwner(), true, "Face-down card leaves the battlefield: "); c.setState(CardStateName.FaceDown, true); + if (trackerFrozen) {game.getTracker().freeze();} copied.setState(CardStateName.Original, true); } unattachCardLeavingBattlefield(copied); From 1ced8bba7d09638f626818fea3de6cd025732fa7 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 30 Dec 2018 08:26:34 +0300 Subject: [PATCH 547/901] - Style fix. Added a comment. --- forge-game/src/main/java/forge/game/GameAction.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 60e82688e03..026408faeb5 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -437,12 +437,13 @@ public class GameAction { // rule 504.6: reveal a face-down card leaving the stack if (zoneFrom != null && zoneTo != null && zoneFrom.is(ZoneType.Stack) && !zoneTo.is(ZoneType.Battlefield) && wasFacedown) { + // FIXME: tracker freeze-unfreeze is needed here to avoid a bug with the card staying face down in the View for the reveal boolean trackerFrozen = game.getTracker().isFrozen(); game.getTracker().unfreeze(); c.setState(CardStateName.Original, true); reveal(new CardCollection(c), c.getOwner(), true, "Face-down card moves from the stack: "); c.setState(CardStateName.FaceDown, true); - if (trackerFrozen) {game.getTracker().freeze();} + if (trackerFrozen) { game.getTracker().freeze(); } } if (fromBattlefield) { @@ -471,12 +472,13 @@ public class GameAction { } // Reveal if face-down if (wasFacedown) { + // FIXME: tracker freeze-unfreeze is needed here to avoid a bug with the card staying face down in the View for the reveal boolean trackerFrozen = game.getTracker().isFrozen(); game.getTracker().unfreeze(); c.setState(CardStateName.Original, true); reveal(new CardCollection(c), c.getOwner(), true, "Face-down card leaves the battlefield: "); c.setState(CardStateName.FaceDown, true); - if (trackerFrozen) {game.getTracker().freeze();} + if (trackerFrozen) { game.getTracker().freeze(); } copied.setState(CardStateName.Original, true); } unattachCardLeavingBattlefield(copied); From 0d2114416cea3055bb1ad311174d04e23d92d57b Mon Sep 17 00:00:00 2001 From: Hanmac Date: Thu, 3 Jan 2019 15:54:53 +0100 Subject: [PATCH 548/901] extend AtEOT, fix resetTurnActivations --- .../src/main/java/forge/game/GameAction.java | 12 +++------ .../game/ability/SpellAbilityEffect.java | 27 +++++++++++++++++-- .../ability/effects/CopyPermanentEffect.java | 9 ------- .../java/forge/game/card/CardFactory.java | 3 +++ 4 files changed, 32 insertions(+), 19 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 026408faeb5..5f4aca9bc45 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -70,10 +70,8 @@ public class GameAction { } public final void resetActivationsPerTurn() { - final CardCollectionView all = game.getCardsInGame(); - // Reset Activations per Turn - for (final Card card : all) { + for (final Card card : game.getCardsInGame()) { for (final SpellAbility sa : card.getAllSpellAbilities()) { sa.getRestrictions().resetTurnActivations(); } @@ -157,7 +155,9 @@ public class GameAction { } // Clean up the temporary Dash SVar when the Dashed card leaves the battlefield - if (fromBattlefield && c.getSVar("EndOfTurnLeavePlay").equals("Dash")) { + // Clean up the temporary AtEOT SVar + String endofTurn = c.getSVar("EndOfTurnLeavePlay"); + if (fromBattlefield && (endofTurn.equals("Dash") || endofTurn.equals("AtEOT"))) { c.removeSVar("EndOfTurnLeavePlay"); } @@ -484,10 +484,6 @@ public class GameAction { unattachCardLeavingBattlefield(copied); // Remove all changed keywords copied.removeAllChangedText(game.getNextTimestamp()); - // reset activations - for (SpellAbility ab : copied.getSpellAbilities()) { - ab.getRestrictions().resetTurnActivations(); - } } else if (toBattlefield) { // reset timestamp in changezone effects so they have same timestamp if ETB simutaneously copied.setTimestamp(game.getNextTimestamp()); diff --git a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java index cff15f16e83..e420bfd447a 100644 --- a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java @@ -230,8 +230,17 @@ public abstract class SpellAbilityEffect { if (desc.isEmpty()) { StringBuilder sb = new StringBuilder(); - sb.append(location).append(" "); + if (location.equals("Hand")) { + sb.append("Return "); + } else if (location.equals("SacrificeCtrl")) { + sb.append("Its controller sacrifices "); + } else { + sb.append(location).append(" "); + } sb.append(Lang.joinHomogenous(crds)); + if (location.equals("Hand")) { + sb.append("to your hand").append(" "); + } sb.append(" at the "); if (combat) { sb.append("end of combat."); @@ -255,9 +264,18 @@ public abstract class SpellAbilityEffect { final Trigger trig = TriggerHandler.parseTrigger(delTrig.toString(), sa.getHostCard(), intrinsic); for (final Card c : crds) { trig.addRemembered(c); + + // Svar for AI + if (!c.hasSVar("EndOfTurnLeavePlay")) { + c.setSVar("EndOfTurnLeavePlay", "AtEOT"); + } } String trigSA = ""; - if (location.equals("Sacrifice")) { + if (location.equals("Hand")) { + trigSA = "DB$ ChangeZone | Defined$ DelayTriggerRemembered | Origin$ Battlefield | Destination$ Hand"; + } else if (location.equals("SacrificeCtrl")) { + trigSA = "DB$ SacrificeAll | Defined$ DelayTriggerRemembered"; + } else if (location.equals("Sacrifice")) { trigSA = "DB$ SacrificeAll | Defined$ DelayTriggerRemembered | Controller$ You"; } else if (location.equals("Exile")) { trigSA = "DB$ ChangeZone | Defined$ DelayTriggerRemembered | Origin$ Battlefield | Destination$ Exile"; @@ -289,6 +307,11 @@ public abstract class SpellAbilityEffect { } trig.setOverridingAbility(AbilityFactory.getAbility(trigSA, card)); card.addTrigger(trig); + + // Svar for AI + if (!card.hasSVar("EndOfTurnLeavePlay")) { + card.setSVar("EndOfTurnLeavePlay", "AtEOT"); + } } protected static void addForgetOnMovedTrigger(final Card card, final String zone) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java index 54e96418b11..a0e9cf35eb0 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java @@ -264,7 +264,6 @@ public class CopyPermanentEffect extends SpellAbilityEffect { final List svars = Lists.newArrayList(); final List triggers = Lists.newArrayList(); boolean asNonLegendary = false; - boolean resetActivations = false; if (sa.hasParam("Keywords")) { keywords.addAll(Arrays.asList(sa.getParam("Keywords").split(" & "))); @@ -275,9 +274,6 @@ public class CopyPermanentEffect extends SpellAbilityEffect { if (sa.hasParam("NonLegendary")) { asNonLegendary = true; } - if (sa.hasParam("ResetAbilityActivations")) { - resetActivations = true; - } if (sa.hasParam("AddSVars")) { svars.addAll(Arrays.asList(sa.getParam("AddSVars").split(" & "))); } @@ -409,11 +405,6 @@ public class CopyPermanentEffect extends SpellAbilityEffect { copy.removeIntrinsicKeyword("Devoid"); } - if (resetActivations) { - for (SpellAbility ab : copy.getSpellAbilities()) { - ab.getRestrictions().resetTurnActivations(); - } - } copy.updateStateForView(); return copy; } diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index e353efe0382..1be90bdfb1e 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -617,6 +617,9 @@ public class CardFactory { } if (from.getRestrictions() != null) { to.setRestrictions((SpellAbilityRestriction) from.getRestrictions().copy()); + if (!lki) { + to.getRestrictions().resetTurnActivations(); + } } if (from.getConditions() != null) { to.setConditions((SpellAbilityCondition) from.getConditions().copy()); From 95dbc5333eb9b60c53b65fb687e55e2b8870350f Mon Sep 17 00:00:00 2001 From: Hanmac Date: Thu, 3 Jan 2019 16:02:04 +0100 Subject: [PATCH 549/901] updated card scripts, remove EndOfTurnLeavePlay, add tokenscripts --- forge-gui/res/cardsfolder/a/akoum_stonewaker.txt | 4 ++-- forge-gui/res/cardsfolder/a/angelic_favor.txt | 6 +++--- .../res/cardsfolder/a/apprentice_necromancer.txt | 6 +++--- forge-gui/res/cardsfolder/b/balduvian_dead.txt | 3 +-- forge-gui/res/cardsfolder/b/broken_visage.txt | 3 +-- forge-gui/res/cardsfolder/c/cauldron_dance.txt | 9 ++------- forge-gui/res/cardsfolder/c/chandra_flamecaller.txt | 6 +++--- forge-gui/res/cardsfolder/c/chimeric_coils.txt | 3 +-- forge-gui/res/cardsfolder/c/cogwork_assembler.txt | 5 ++--- forge-gui/res/cardsfolder/c/corpse_dance.txt | 3 +-- forge-gui/res/cardsfolder/d/dawn_of_the_dead.txt | 6 +++--- forge-gui/res/cardsfolder/e/echo_chamber.txt | 5 +---- forge-gui/res/cardsfolder/e/elemental_appeal.txt | 3 +-- forge-gui/res/cardsfolder/e/elemental_mastery.txt | 4 ++-- .../res/cardsfolder/f/feldon_of_the_third_path.txt | 3 +-- forge-gui/res/cardsfolder/f/felhide_spiritbinder.txt | 3 +-- forge-gui/res/cardsfolder/f/feral_lightning.txt | 3 +-- forge-gui/res/cardsfolder/f/firecat_blitz.txt | 10 ++++------ forge-gui/res/cardsfolder/f/flameshadow_conjuring.txt | 3 +-- forge-gui/res/cardsfolder/g/geist_of_saint_traft.txt | 3 +-- forge-gui/res/cardsfolder/g/gemini_engine.txt | 3 +-- forge-gui/res/cardsfolder/g/giantbaiting.txt | 4 ++-- forge-gui/res/cardsfolder/g/goryos_vengeance.txt | 6 +++--- forge-gui/res/cardsfolder/g/gruesome_encore.txt | 6 +++--- forge-gui/res/cardsfolder/h/heat_shimmer.txt | 3 +-- forge-gui/res/cardsfolder/h/helm_of_the_host.txt | 2 +- forge-gui/res/cardsfolder/h/hornet_cannon.txt | 4 ++-- forge-gui/res/cardsfolder/i/impromptu_raid.txt | 3 +-- .../res/cardsfolder/i/inalla_archmage_ritualist.txt | 3 +-- .../res/cardsfolder/i/incandescent_soulstoke.txt | 3 +-- .../res/cardsfolder/i/invocation_of_saint_traft.txt | 6 +++--- forge-gui/res/cardsfolder/j/jace_cunning_castaway.txt | 4 ++-- .../res/cardsfolder/k/kari_zev_skyship_raider.txt | 4 ++-- .../res/cardsfolder/k/kiki_jiki_mirror_breaker.txt | 3 +-- forge-gui/res/cardsfolder/k/killer_instinct.txt | 3 +-- forge-gui/res/cardsfolder/k/kindred_charge.txt | 3 +-- forge-gui/res/cardsfolder/l/lightning_coils.txt | 4 ++-- forge-gui/res/cardsfolder/m/mimic_vat.txt | 3 +-- forge-gui/res/cardsfolder/m/minion_reflector.txt | 3 +-- forge-gui/res/cardsfolder/n/nahiri_the_harbinger.txt | 5 +---- forge-gui/res/cardsfolder/p/puppeteer_clique.txt | 3 +-- forge-gui/res/cardsfolder/r/rakdos_guildmage.txt | 4 ++-- .../res/cardsfolder/r/rite_of_the_raging_storm.txt | 6 +++--- forge-gui/res/cardsfolder/s/saheeli_rai.txt | 5 ++--- forge-gui/res/cardsfolder/s/saheeli_the_gifted.txt | 5 ++--- forge-gui/res/cardsfolder/s/seance.txt | 3 +-- forge-gui/res/cardsfolder/s/sekkuar_deathkeeper.txt | 3 ++- forge-gui/res/cardsfolder/s/shallow_grave.txt | 3 +-- forge-gui/res/cardsfolder/s/sneak_attack.txt | 3 +-- forge-gui/res/cardsfolder/s/sparkspitter.txt | 4 ++-- forge-gui/res/cardsfolder/s/spinal_embrace.txt | 2 +- forge-gui/res/cardsfolder/s/splinter_twin.txt | 3 +-- forge-gui/res/cardsfolder/s/swift_warkite.txt | 5 +---- forge-gui/res/cardsfolder/t/thatcher_revolt.txt | 3 +-- forge-gui/res/cardsfolder/t/through_the_breach.txt | 3 +-- forge-gui/res/cardsfolder/t/thunderheads.txt | 3 +-- forge-gui/res/cardsfolder/t/tidal_wave.txt | 3 +-- forge-gui/res/cardsfolder/t/treacherous_urge.txt | 3 +-- forge-gui/res/cardsfolder/t/twinflame.txt | 3 +-- .../res/cardsfolder/v/valduk_keeper_of_the_flame.txt | 3 +-- forge-gui/res/cardsfolder/w/waylay.txt | 4 ++-- .../res/cardsfolder/z/zektar_shrine_expedition.txt | 3 +-- forge-gui/res/tokenscripts/br_3_1_graveborn.txt | 9 +++++++++ forge-gui/res/tokenscripts/hornet.txt | 8 ++++++++ forge-gui/res/tokenscripts/lightning_rager.txt | 11 +++++++++++ .../res/tokenscripts/r_1_1_elemental_cat_haste.txt | 7 +++++++ forge-gui/res/tokenscripts/r_1_1_elemental_haste.txt | 7 +++++++ forge-gui/res/tokenscripts/r_2_1_goblin_haste.txt | 7 +++++++ forge-gui/res/tokenscripts/r_3_1_elemental_haste.txt | 7 +++++++ .../tokenscripts/r_3_1_elemental_trample_haste.txt | 8 ++++++++ .../tokenscripts/r_7_1_elemental_trample_haste.txt | 8 ++++++++ forge-gui/res/tokenscripts/ragavan.txt | 11 +++++++++++ .../res/tokenscripts/rg_4_4_giant_warrior_haste.txt | 7 +++++++ forge-gui/res/tokenscripts/spark_elemental.txt | 11 +++++++++++ .../res/tokenscripts/u_3_3_weird_defender_flying.txt | 8 ++++++++ forge-gui/res/tokenscripts/u_5_5_wall_defender.txt | 7 +++++++ forge-gui/res/tokenscripts/w_2_2_knight.txt | 6 ++++++ forge-gui/res/tokenscripts/w_4_4_angel_flying.txt | 7 +++++++ 78 files changed, 225 insertions(+), 147 deletions(-) create mode 100644 forge-gui/res/tokenscripts/br_3_1_graveborn.txt create mode 100644 forge-gui/res/tokenscripts/hornet.txt create mode 100644 forge-gui/res/tokenscripts/lightning_rager.txt create mode 100644 forge-gui/res/tokenscripts/r_1_1_elemental_cat_haste.txt create mode 100644 forge-gui/res/tokenscripts/r_1_1_elemental_haste.txt create mode 100644 forge-gui/res/tokenscripts/r_2_1_goblin_haste.txt create mode 100644 forge-gui/res/tokenscripts/r_3_1_elemental_haste.txt create mode 100644 forge-gui/res/tokenscripts/r_3_1_elemental_trample_haste.txt create mode 100644 forge-gui/res/tokenscripts/r_7_1_elemental_trample_haste.txt create mode 100644 forge-gui/res/tokenscripts/ragavan.txt create mode 100644 forge-gui/res/tokenscripts/rg_4_4_giant_warrior_haste.txt create mode 100644 forge-gui/res/tokenscripts/spark_elemental.txt create mode 100644 forge-gui/res/tokenscripts/u_3_3_weird_defender_flying.txt create mode 100644 forge-gui/res/tokenscripts/u_5_5_wall_defender.txt create mode 100644 forge-gui/res/tokenscripts/w_2_2_knight.txt create mode 100644 forge-gui/res/tokenscripts/w_4_4_angel_flying.txt diff --git a/forge-gui/res/cardsfolder/a/akoum_stonewaker.txt b/forge-gui/res/cardsfolder/a/akoum_stonewaker.txt index 37186152cfc..bf906968de9 100644 --- a/forge-gui/res/cardsfolder/a/akoum_stonewaker.txt +++ b/forge-gui/res/cardsfolder/a/akoum_stonewaker.txt @@ -3,7 +3,7 @@ ManaCost:1 R Types:Creature Human Shaman PT:2/1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Landfall — Whenever a land enters the battlefield under your control, you may pay {2}{R}. If you do, create a 3/1 red Elemental creature token with trample and haste. Exile that token at the beginning of the next end step. -SVar:TrigToken:AB$Token | Cost$ 2 R | TokenAmount$ 1 | TokenName$ Elemental | TokenTypes$ Creature,Elemental | TokenOwner$ You | TokenColors$ Red | TokenPower$ 3 | TokenToughness$ 1 | TokenImage$ r 3 1 elemental bfz | TokenKeywords$ Trample<>Haste | TokenSVars$ AkoumEOT | AtEOT$ Exile -SVar:AkoumEOT:SVar:EndOfTurnLeavePlay:True +SVar:TrigToken:AB$Token | Cost$ 2 R | TokenScript$ r_3_1_elemental_trample_haste | AtEOT$ Exile +DeckHas:Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/akoum_stonewaker.jpg Oracle:Landfall — Whenever a land enters the battlefield under your control, you may pay {2}{R}. If you do, create a 3/1 red Elemental creature token with trample and haste. Exile that token at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/a/angelic_favor.txt b/forge-gui/res/cardsfolder/a/angelic_favor.txt index 87ee0873ad7..0f7d24631f8 100644 --- a/forge-gui/res/cardsfolder/a/angelic_favor.txt +++ b/forge-gui/res/cardsfolder/a/angelic_favor.txt @@ -1,9 +1,9 @@ Name:Angelic Favor ManaCost:3 W Types:Instant -A:SP$ Token | Cost$ 3 W | TokenAmount$ 1 | TokenName$ Angel | TokenTypes$ Creature,Angel | TokenOwner$ You | TokenColors$ White | TokenPower$ 4 | TokenToughness$ 4 | TokenKeywords$ Flying | TokenSVars$ AngelicFavorEOT | AtEOT$ Exile | ActivationPhases$ BeginCombat->EndCombat | SpellDescription$ Cast CARDNAME only during combat. Create a 4/4 white Angel creature token with flying. Exile it at the beginning of the next end step. -SVar:AngelicFavorEOT:SVar:EndOfTurnLeavePlay:True -SVar:AltCost:Cost$ tapXType<1/Creature> | IsPresent$ Plains.YouCtrl | Description$ If you control a Plains, you may tap an untapped creature you control rather than pay CARDNAME's mana cost. +A:SP$ Token | Cost$ 3 W | TokenScript$ w_4_4_angel_flying | AtEOT$ Exile | ActivationPhases$ BeginCombat->EndCombat | SpellDescription$ Cast CARDNAME only during combat. Create a 4/4 white Angel creature token with flying. Exile it at the beginning of the next end step. +SVar:AltCost:Cost$ tapXType<1/Creature> | IsPresent$ Plains.YouCtrl | Description$ If you control a Plains, you may tap an untapped creature you control rather than pay CARDNAME's mana cost. +DeckHas:Ability$Token AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/angelic_favor.jpg Oracle:If you control a Plains, you may tap an untapped creature you control rather than pay this spell's mana cost.\nCast this spell only during combat.\nCreate a 4/4 white Angel creature token with flying. Exile it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/a/apprentice_necromancer.txt b/forge-gui/res/cardsfolder/a/apprentice_necromancer.txt index 5c833e2b6da..53962e4c0a7 100644 --- a/forge-gui/res/cardsfolder/a/apprentice_necromancer.txt +++ b/forge-gui/res/cardsfolder/a/apprentice_necromancer.txt @@ -2,8 +2,8 @@ Name:Apprentice Necromancer ManaCost:1 B Types:Creature Zombie Wizard PT:1/1 -A:AB$ ChangeZone | Cost$ B T Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | AITgts$ Card.cmcGE5 | TgtPrompt$ Select target creature in your graveyard | GainControl$ True | SubAbility$ DBPump | AILogic$ BeforeCombat | SpellDescription$ Return target creature card from your graveyard to the battlefield. That creature gains haste. At the beginning of the next end step, sacrifice it. -SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Targeted | sVars$ SneakAttackEOT | Permanent$ True | AtEOT$ Sacrifice -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True +A:AB$ ChangeZone | Cost$ B T Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | AITgts$ Card.cmcGE5 | TgtPrompt$ Select target creature in your graveyard | SubAbility$ DBPump | AILogic$ BeforeCombat | RememberChanged$ True | SpellDescription$ Return target creature card from your graveyard to the battlefield. That creature gains haste. At the beginning of the next end step, sacrifice it. +SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Remembered | Permanent$ True | AtEOT$ Sacrifice | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/apprentice_necromancer.jpg Oracle:{B}, {T}, Sacrifice Apprentice Necromancer: Return target creature card from your graveyard to the battlefield. That creature gains haste. At the beginning of the next end step, sacrifice it. diff --git a/forge-gui/res/cardsfolder/b/balduvian_dead.txt b/forge-gui/res/cardsfolder/b/balduvian_dead.txt index 79587ae9a09..aeb45cdd95a 100644 --- a/forge-gui/res/cardsfolder/b/balduvian_dead.txt +++ b/forge-gui/res/cardsfolder/b/balduvian_dead.txt @@ -2,7 +2,6 @@ Name:Balduvian Dead ManaCost:3 B Types:Creature Zombie PT:2/3 -A:AB$ Token | Cost$ 2 R ExileFromGrave<1/Creature> | TokenAmount$ 1 | TokenName$ Graveborn | TokenTypes$ Creature,Graveborn | TokenOwner$ You | TokenColors$ Black,Red | TokenPower$ 3 | TokenToughness$ 1 | TokenKeywords$ Haste | TokenSVars$ BalduvianDeadEOT | AtEOT$ Sacrifice | SpellDescription$ Create a 3/1 black and red Graveborn creature token with haste. Sacrifice it at the beginning of the next end step. -SVar:BalduvianDeadEOT:SVar:EndOfTurnLeavePlay:True +A:AB$ Token | Cost$ 2 R ExileFromGrave<1/Creature> | TokenScript$ br_3_1_graveborn | AtEOT$ Sacrifice | SpellDescription$ Create a 3/1 black and red Graveborn creature token with haste. Sacrifice it at the beginning of the next end step. SVar:Picture:http://www.wizards.com/global/images/magic/general/balduvian_dead.jpg Oracle:{2}{R}, Exile a creature card from your graveyard: Create a 3/1 black and red Graveborn creature token with haste. Sacrifice it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/b/broken_visage.txt b/forge-gui/res/cardsfolder/b/broken_visage.txt index 16bd4939703..05b9de36eda 100644 --- a/forge-gui/res/cardsfolder/b/broken_visage.txt +++ b/forge-gui/res/cardsfolder/b/broken_visage.txt @@ -2,8 +2,7 @@ Name:Broken Visage ManaCost:4 B Types:Instant A:SP$ Destroy | Cost$ 4 B | ValidTgts$ Creature.attacking+nonArtifact | TgtPrompt$ Select target nonartifact attacking creature | NoRegen$ True | SubAbility$ DBToken | SpellDescription$ Destroy target nonartifact attacking creature. It can't be regenerated. Create a black Spirit creature token. Its power is equal to that creature's power and its toughness is equal to that creature's toughness. Sacrifice the token at the beginning of the next end step. -SVar:DBToken:DB$ Token | Defined$ Targeted | TokenAmount$ 1 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenOwner$ You | TokenColors$ Black | TokenPower$ dX | TokenToughness$ dY | References$ dX,dY | TokenSVars$ BrokenVisageEOT | AtEOT$ Sacrifice -SVar:BrokenVisageEOT:SVar:EndOfTurnLeavePlay:True +SVar:DBToken:DB$ Token | Defined$ Targeted | TokenAmount$ 1 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenOwner$ You | TokenColors$ Black | TokenPower$ dX | TokenToughness$ dY | References$ dX,dY | AtEOT$ Sacrifice SVar:dX:Targeted$CardPower SVar:dY:Targeted$CardToughness SVar:Picture:http://www.wizards.com/global/images/magic/general/broken_visage.jpg diff --git a/forge-gui/res/cardsfolder/c/cauldron_dance.txt b/forge-gui/res/cardsfolder/c/cauldron_dance.txt index 8fdd27a6393..063ff8af7a0 100644 --- a/forge-gui/res/cardsfolder/c/cauldron_dance.txt +++ b/forge-gui/res/cardsfolder/c/cauldron_dance.txt @@ -2,14 +2,9 @@ Name:Cauldron Dance ManaCost:4 B R Types:Instant A:SP$ ChangeZone | Cost$ 4 B R | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature from your graveyard | ActivationPhases$ BeginCombat->EndCombat | RememberChanged$ True | AILogic$ SurpriseBlock | SubAbility$ DBAnimate | SpellDescription$ Cast CARDNAME only during combat. Return target creature card from your graveyard to the battlefield. That creature gains haste. Return it to your hand at the beginning of the next end step. You may put a creature card from your hand onto the battlefield. That creature gains haste. Its controller sacrifices it at the beginning of the next end step. -SVar:DBAnimate:DB$ Animate | Keywords$ Haste | Permanent$ True | sVars$ SneakAttackEOT | Defined$ Remembered | SubAbility$ DelTrig -SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End Of Turn | Execute$ TrigBounce | RememberObjects$ Remembered | TriggerDescription$ Return the permanent to its owner's hand at the beginning of the next end step. | SubAbility$ DBChangeZone | AILogic$ Always | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 -SVar:TrigBounce:DB$ ChangeZone | Defined$ DelayTriggerRemembered | Origin$ Battlefield | Destination$ Hand -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True +SVar:DBAnimate:DB$ Animate | Keywords$ Haste | Permanent$ True | Defined$ Remembered | SubAbility$ DBChangeZone | AtEOT$ Hand SVar:DBChangeZone:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | Optional$ You | ChangeType$ Creature | ChangeNum$ 1 | RememberChanged$ True | ForgetOtherRemembered$ True | SubAbility$ DBAnimate2 -SVar:DBAnimate2:DB$ Animate | Keywords$ Haste | Permanent$ True | sVars$ SneakAttackEOT | Defined$ Remembered | SubAbility$ DelTrig2 -SVar:DelTrig2:DB$ DelayedTrigger | Mode$ Phase | Phase$ End Of Turn | Execute$ TrigSac | RememberObjects$ Remembered | TriggerDescription$ Its controller sacrifices it at the beginning of the next end step. | SubAbility$ DBCleanup | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 -SVar:TrigSac:DB$ SacrificeAll | Defined$ DelayTriggerRemembered +SVar:DBAnimate2:DB$ Animate | Keywords$ Haste | Permanent$ True | Defined$ Remembered | SubAbility$ DBCleanup | AtEOT$ SacrificeCtrl SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/cauldron_dance.jpg Oracle:Cast this spell only during combat.\nReturn target creature card from your graveyard to the battlefield. That creature gains haste. Return it to your hand at the beginning of the next end step.\nYou may put a creature card from your hand onto the battlefield. That creature gains haste. Its controller sacrifices it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/c/chandra_flamecaller.txt b/forge-gui/res/cardsfolder/c/chandra_flamecaller.txt index d2662a755d8..02a0502f1c7 100644 --- a/forge-gui/res/cardsfolder/c/chandra_flamecaller.txt +++ b/forge-gui/res/cardsfolder/c/chandra_flamecaller.txt @@ -2,14 +2,14 @@ Name:Chandra, Flamecaller ManaCost:4 R R Types:Legendary Planeswalker Chandra Loyalty:4 -A:AB$ Token | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | TokenAmount$ 2 | TokenName$ Elemental | TokenTypes$ Creature,Elemental | TokenOwner$ You | TokenColors$ Red | TokenPower$ 3 | TokenToughness$ 1 | TokenImage$ r 3 1 elemental OGW | TokenKeywords$ Haste | AtEOT$ Exile | TokenSVars$ ChandraEOT | SpellDescription$ Create two 3/1 red Elemental creature tokens with haste. Exile them at the beginning of the next end step. -SVar:ChandraEOT:SVar:EndOfTurnLeavePlay:True +A:AB$ Token | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | TokenAmount$ 2 | TokenScript$ r_3_1_elemental_haste | AtEOT$ Exile | SpellDescription$ Create two 3/1 red Elemental creature tokens with haste. Exile them at the beginning of the next end step. A:AB$ Discard | Cost$ AddCounter<0/LOYALTY> | Planeswalker$ True | Defined$ You | Mode$ Hand | RememberDiscarded$ True | SubAbility$ DBDraw | SpellDescription$ Discard all the cards in your hand, then draw that many cards plus one. SVar:DBDraw:DB$ Draw | NumCards$ Y | Defined$ You | SubAbility$ DBCleanup | SpellDescription$ Draw that many cards | References$ Y SVar:Y:Remembered$Amount.Plus.1 SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True A:AB$ DamageAll | Cost$ SubCounter | NumDmg$ ChosenX | References$ X | ValidCards$ Creature | Planeswalker$ True | Ultimate$ True | ValidDescription$ each creature. | SpellDescription$ CARDNAME deals X damage to each creature. -SVar:X:XChoice +SVar:X:XChoice +DeckHas:Ability$Token SVar:PlayMain1:ALWAYS SVar:Picture:http://www.wizards.com/global/images/magic/general/chandra_flamecaller.jpg Oracle:+1: Create two 3/1 red Elemental creature tokens with haste. Exile them at the beginning of the next end step.\n0: Discard all the cards in your hand, then draw that many cards plus one.\n−X: Chandra, Flamecaller deals X damage to each creature. diff --git a/forge-gui/res/cardsfolder/c/chimeric_coils.txt b/forge-gui/res/cardsfolder/c/chimeric_coils.txt index 9f050e31be0..29b89658cf4 100644 --- a/forge-gui/res/cardsfolder/c/chimeric_coils.txt +++ b/forge-gui/res/cardsfolder/c/chimeric_coils.txt @@ -1,9 +1,8 @@ Name:Chimeric Coils ManaCost:1 Types:Artifact -A:AB$ Animate | Cost$ X 1 | Defined$ Self | Power$ X | Toughness$ X | Types$ Creature,Artifact,Construct | sVars$ ChimericCoilsEOT | AtEOT$ Sacrifice | Permanent$ True | References$ X | SpellDescription$ CARDNAME becomes an X/X Construct artifact creature. Sacrifice it at the beginning of the next end step. +A:AB$ Animate | Cost$ X 1 | Defined$ Self | Power$ X | Toughness$ X | Types$ Creature,Artifact,Construct | AtEOT$ Sacrifice | Permanent$ True | References$ X | SpellDescription$ CARDNAME becomes an X/X Construct artifact creature. Sacrifice it at the beginning of the next end step. SVar:X:Count$xPaid -SVar:ChimericCoilsEOT:SVar:EndOfTurnLeavePlay:True AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/chimeric_coils.jpg Oracle:{X}{1}: Chimeric Coils becomes an X/X Construct artifact creature. Sacrifice it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/c/cogwork_assembler.txt b/forge-gui/res/cardsfolder/c/cogwork_assembler.txt index 043f6d9e8a5..07a989fc0b3 100644 --- a/forge-gui/res/cardsfolder/c/cogwork_assembler.txt +++ b/forge-gui/res/cardsfolder/c/cogwork_assembler.txt @@ -2,7 +2,6 @@ Name:Cogwork Assembler ManaCost:3 Types:Artifact Creature Assembly-Worker PT:2/3 -A:AB$ CopyPermanent | Cost$ 7 | ValidTgts$ Artifact | TgtPrompt$ Select target artifact. | AddSVars$ SneakAttackEOT | PumpKeywords$ Haste | AtEOT$ Exile | SpellDescription$ Create a token that's a copy of target artifact. That token gains haste. Exile it at the beginning of the next end step. -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True +A:AB$ CopyPermanent | Cost$ 7 | ValidTgts$ Artifact | TgtPrompt$ Select target artifact. | PumpKeywords$ Haste | AtEOT$ Exile | AILogic$ BeforeCombat | SpellDescription$ Create a token that's a copy of target artifact. That token gains haste. Exile it at the beginning of the next end step. SVar:Picture:http://www.wizards.com/global/images/magic/general/cogwork_assembler.jpg -Oracle:{7}: Create a token that's a copy of target artifact. That token gains haste. Exile it at the beginning of the next end step. \ No newline at end of file +Oracle:{7}: Create a token that's a copy of target artifact. That token gains haste. Exile it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/c/corpse_dance.txt b/forge-gui/res/cardsfolder/c/corpse_dance.txt index 6fe773d96dc..6d659dd8cbb 100644 --- a/forge-gui/res/cardsfolder/c/corpse_dance.txt +++ b/forge-gui/res/cardsfolder/c/corpse_dance.txt @@ -3,9 +3,8 @@ ManaCost:2 B Types:Instant K:Buyback:2 A:SP$ ChangeZone | Cost$ 2 B | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature.TopGraveyardCreature+YouCtrl | Hidden$ True | Mandatory$ True | RememberChanged$ True | SubAbility$ DBPump | SpellDescription$ Return the top creature card of your graveyard to the battlefield. That creature gains haste until end of turn. Exile it at the beginning of the next end step. -SVar:DBPump:DB$ Animate | Keywords$ Haste | sVars$ SneakAttackEOT | Defined$ Remembered | AtEOT$ Exile | SubAbility$ DBCleanup +SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Remembered | AtEOT$ Exile | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True SVar:NeedsOrderedGraveyard:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/corpse_dance.jpg Oracle:Buyback {2} (You may pay an additional {2} as you cast this spell. If you do, put this card into your hand as it resolves.)\nReturn the top creature card of your graveyard to the battlefield. That creature gains haste until end of turn. Exile it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/d/dawn_of_the_dead.txt b/forge-gui/res/cardsfolder/d/dawn_of_the_dead.txt index cdd5ea980b8..374bb7a9e3b 100644 --- a/forge-gui/res/cardsfolder/d/dawn_of_the_dead.txt +++ b/forge-gui/res/cardsfolder/d/dawn_of_the_dead.txt @@ -4,9 +4,9 @@ Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ At the beginning of your upkeep, you lose 1 life. SVar:TrigLoseLife:DB$LoseLife | Defined$ You | LifeAmount$ 1 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigChange | TriggerDescription$ At the beginning of your upkeep, you may return target creature card from your graveyard to the battlefield. That creature gains haste until end of turn. Exile it at the beginning of the next end step. -SVar:TrigChange:DB$ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | SubAbility$ DBPump -SVar:DBPump:DB$ Animate | Keywords$ Haste | sVars$ SneakAttackEOT | Defined$ Targeted | AtEOT$ Exile +SVar:TrigChange:DB$ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | SubAbility$ DBPump | RememberChanged$ True +SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Remembered | AtEOT$ Exile | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True AI:RemoveDeck:Random -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True SVar:Picture:http://www.wizards.com/global/images/magic/general/dawn_of_the_dead.jpg Oracle:At the beginning of your upkeep, you lose 1 life.\nAt the beginning of your upkeep, you may return target creature card from your graveyard to the battlefield. That creature gains haste until end of turn. Exile it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/e/echo_chamber.txt b/forge-gui/res/cardsfolder/e/echo_chamber.txt index ff562a1a461..e7bda9935a1 100644 --- a/forge-gui/res/cardsfolder/e/echo_chamber.txt +++ b/forge-gui/res/cardsfolder/e/echo_chamber.txt @@ -1,9 +1,6 @@ Name:Echo Chamber ManaCost:4 Types:Artifact -A:AB$ CopyPermanent | Cost$ 4 T | ValidTgts$ Creature | TargetingPlayer$ Player.Opponent | TargetingPlayerControls$ True | TgtPrompt$ Select target creature you control | RememberCopied$ True | AtEOT$ Exile | SorcerySpeed$ True | SubAbility$ DBPump | SpellDescription$ An opponent chooses target creature they control. Create a token that's a copy of that creature. That token gains haste until end of turn. Exile the token at the beginning of the next end step. Activate this ability only any time you could cast a sorcery. -SVar:DBPump:DB$ Animate | Keywords$ Haste | sVars$ SneakAttackEOT | Defined$ Remembered | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True +A:AB$ CopyPermanent | Cost$ 4 T | ValidTgts$ Creature | TargetingPlayer$ Player.Opponent | TargetingPlayerControls$ True | TgtPrompt$ Select target creature you control | PumpKeywords$ Haste | AtEOT$ Exile | SorcerySpeed$ True | SpellDescription$ An opponent chooses target creature they control. Create a token that's a copy of that creature. That token gains haste until end of turn. Exile the token at the beginning of the next end step. Activate this ability only any time you could cast a sorcery. SVar:Picture:http://www.wizards.com/global/images/magic/general/echo_chamber.jpg Oracle:{4}, {T}: An opponent chooses target creature they control. Create a token that's a copy of that creature. That token gains haste until end of turn. Exile the token at the beginning of the next end step. Activate this ability only any time you could cast a sorcery. diff --git a/forge-gui/res/cardsfolder/e/elemental_appeal.txt b/forge-gui/res/cardsfolder/e/elemental_appeal.txt index 47e67046402..35d1354a2eb 100644 --- a/forge-gui/res/cardsfolder/e/elemental_appeal.txt +++ b/forge-gui/res/cardsfolder/e/elemental_appeal.txt @@ -2,9 +2,8 @@ Name:Elemental Appeal ManaCost:R R R R Types:Sorcery K:Kicker:5 -A:SP$ Token | Cost$ R R R R | TokenAmount$ 1 | TokenImage$ r 7 1 elemental | TokenName$ Elemental | TokenColors$ Red | TokenTypes$ Creature,Elemental | TokenPower$ 7 | TokenToughness$ 1 | TokenKeywords$ Haste<>Trample | TokenSVars$ EOTExile | RememberTokens$ True | AtEOT$ Exile | TokenOwner$ You | TokenAmount$ 1 | SubAbility$ KickerPump | SpellDescription$ Create a 7/1 red Elemental creature token with trample and haste. Exile it at the beginning of the next end step. If CARDNAME was kicked, that creature gets +7/+0 until end of turn. +A:SP$ Token | Cost$ R R R R | TokenScript$ r_7_1_elemental_trample_haste | RememberTokens$ True | AtEOT$ Exile | TokenOwner$ You | SubAbility$ KickerPump | SpellDescription$ Create a 7/1 red Elemental creature token with trample and haste. Exile it at the beginning of the next end step. If CARDNAME was kicked, that creature gets +7/+0 until end of turn. SVar:KickerPump:DB$ Pump | Defined$ Remembered | NumAtt$ +7 | Condition$ Kicked | ConditionDescription$ If it was kicked, | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:EOTExile:SVar:EndOfTurnLeavePlay:True SVar:Picture:http://www.wizards.com/global/images/magic/general/elemental_appeal.jpg Oracle:Kicker {5} (You may pay an additional {5} as you cast this spell.)\nCreate a 7/1 red Elemental creature token with trample and haste. Exile it at the beginning of the next end step. If Elemental Appeal was kicked, that creature gets +7/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/e/elemental_mastery.txt b/forge-gui/res/cardsfolder/e/elemental_mastery.txt index 475e765697b..e3471167dd3 100644 --- a/forge-gui/res/cardsfolder/e/elemental_mastery.txt +++ b/forge-gui/res/cardsfolder/e/elemental_mastery.txt @@ -4,9 +4,9 @@ Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ 3 R | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddAbility$ Token | AddSVar$ ElementalMasteryCount | Description$ Enchanted creature has "{T}: Create X 1/1 red Elemental creature tokens with haste, where X is this creature's power. Exile them at the beginning of the next end step." -SVar:Token:AB$ Token | Cost$ T | TokenAmount$ ElementalMasteryCount | TokenImage$ r 1 1 elemental | TokenName$ Elemental | TokenColors$ Red | TokenTypes$ Creature,Elemental | TokenKeywords$ Haste | TokenSVars$ ElementalMasteryEOT | AtEOT$ Exile | TokenPower$ 1 | TokenToughness$ 1 | References$ ElementalMasteryCount | SpellDescription$ Create X 1/1 red Elemental creature tokens with haste, where X is this creature's power. Exile them at the beginning of the next end step. +SVar:Token:AB$ Token | Cost$ T | TokenAmount$ ElementalMasteryCount | TokenScript$ r_1_1_elemental_haste | AtEOT$ Exile | References$ ElementalMasteryCount | SpellDescription$ Create X 1/1 red Elemental creature tokens with haste, where X is this creature's power. Exile them at the beginning of the next end step. SVar:ElementalMasteryCount:Count$CardPower SVar:NonStackingAttachEffect:True -SVar:ElementalMasteryEOT:SVar:EndOfTurnLeavePlay:True +DeckHas:Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/elemental_mastery.jpg Oracle:Enchant creature\nEnchanted creature has "{T}: Create X 1/1 red Elemental creature tokens with haste, where X is this creature's power. Exile them at the beginning of the next end step." diff --git a/forge-gui/res/cardsfolder/f/feldon_of_the_third_path.txt b/forge-gui/res/cardsfolder/f/feldon_of_the_third_path.txt index 6c463453bf2..67c22585d53 100644 --- a/forge-gui/res/cardsfolder/f/feldon_of_the_third_path.txt +++ b/forge-gui/res/cardsfolder/f/feldon_of_the_third_path.txt @@ -2,7 +2,6 @@ Name:Feldon of the Third Path ManaCost:1 R R Types:Legendary Creature Human Artificer PT:2/3 -A:AB$ CopyPermanent | Cost$ 2 R T | TgtZone$ Graveyard | ValidTgts$ Creature.YouOwn | TgtPrompt$ Select target creature card in your graveyard | NumCopies$ 1 | AddTypes$ Artifact | AddSVars$ SneakAttackEOT | PumpKeywords$ Haste | AtEOT$ Sacrifice | SpellDescription$ Create a token that's a copy of target creature card in your graveyard, except it's an artifact in addition to its other types. It gains haste. Sacrifice it at the beginning of the next end step. -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True +A:AB$ CopyPermanent | Cost$ 2 R T | TgtZone$ Graveyard | ValidTgts$ Creature.YouOwn | TgtPrompt$ Select target creature card in your graveyard | NumCopies$ 1 | AddTypes$ Artifact | PumpKeywords$ Haste | AtEOT$ Sacrifice | SpellDescription$ Create a token that's a copy of target creature card in your graveyard, except it's an artifact in addition to its other types. It gains haste. Sacrifice it at the beginning of the next end step. SVar:Picture:http://www.wizards.com/global/images/magic/general/feldon_of_the_third_path.jpg Oracle:{2}{R}, {T}: Create a token that's a copy of target creature card in your graveyard, except it's an artifact in addition to its other types. It gains haste. Sacrifice it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/f/felhide_spiritbinder.txt b/forge-gui/res/cardsfolder/f/felhide_spiritbinder.txt index 202c38c16e9..db9eb059f34 100644 --- a/forge-gui/res/cardsfolder/f/felhide_spiritbinder.txt +++ b/forge-gui/res/cardsfolder/f/felhide_spiritbinder.txt @@ -3,7 +3,6 @@ ManaCost:3 R Types:Creature Minotaur Shaman PT:3/4 T:Mode$ Untaps | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigCopy | TriggerDescription$ Inspired — Whenever CARDNAME becomes untapped, you may pay {1}{R}. If you do, create a token that's a copy of another target creature, except it's an enchantment in addition to its other types. It gains haste. Exile it at the beginning of the next end step. -SVar:TrigCopy:AB$ CopyPermanent | Cost$ 1 R | ValidTgts$ Creature.Other | TgtPrompt$ Select another target creature to copy | PumpKeywords$ Haste | AtEOT$ Exile | AddSVars$ SneakAttackEOT | AddTypes$ Enchantment -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True +SVar:TrigCopy:AB$ CopyPermanent | Cost$ 1 R | ValidTgts$ Creature.Other | TgtPrompt$ Select another target creature to copy | PumpKeywords$ Haste | AtEOT$ Exile | AddTypes$ Enchantment SVar:Picture:http://www.wizards.com/global/images/magic/general/felhide_spiritbinder.txt Oracle:Inspired — Whenever Felhide Spiritbinder becomes untapped, you may pay {1}{R}. If you do, create a token that's a copy of another target creature, except it's an enchantment in addition to its other types. It gains haste. Exile it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/f/feral_lightning.txt b/forge-gui/res/cardsfolder/f/feral_lightning.txt index cdcefd75441..0e4ede8e7f5 100644 --- a/forge-gui/res/cardsfolder/f/feral_lightning.txt +++ b/forge-gui/res/cardsfolder/f/feral_lightning.txt @@ -1,8 +1,7 @@ Name:Feral Lightning ManaCost:3 R R R Types:Sorcery -A:SP$ Token | Cost$ 3 R R R | TokenAmount$ 3 | TokenName$ Elemental | TokenTypes$ Creature,Elemental | TokenOwner$ You | TokenColors$ Red | TokenPower$ 3 | TokenToughness$ 1 | TokenImage$ r 3 1 elemental SOK | TokenKeywords$ Haste | TokenSVars$ FeralLightningEOT | AtEOT$ Exile | SpellDescription$ Create three 3/1 red Elemental creature tokens with haste. Exile them at the beginning of the next end step. -SVar:FeralLightningEOT:SVar:EndOfTurnLeavePlay:True +A:SP$ Token | Cost$ 3 R R R | TokenAmount$ 3 | TokenScript$ r_3_1_elemental_haste | AtEOT$ Exile | SpellDescription$ Create three 3/1 red Elemental creature tokens with haste. Exile them at the beginning of the next end step. SVar:PlayMain1:TRUE SVar:Picture:http://resources.wizards.com/magic/cards/sok/en-us/card84373.jpg Oracle:Create three 3/1 red Elemental creature tokens with haste. Exile them at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/f/firecat_blitz.txt b/forge-gui/res/cardsfolder/f/firecat_blitz.txt index 234283a6772..63fce0d20d9 100644 --- a/forge-gui/res/cardsfolder/f/firecat_blitz.txt +++ b/forge-gui/res/cardsfolder/f/firecat_blitz.txt @@ -1,13 +1,11 @@ Name:Firecat Blitz ManaCost:X R R Types:Sorcery -A:SP$ Token | Cost$ X R R | TokenAmount$ X | TokenName$ Elemental Cat | TokenTypes$ Creature,Elemental,Cat | TokenOwner$ You | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Haste | TokenSVars$ FirecatBlitzEOT | AtEOT$ Exile | References$ X | SpellDescription$ Create X 1/1 red Elemental Cat creature tokens with haste. Exile them at the beginning of the next end step. -A:SP$ Token | Cost$ R R Sac | TokenAmount$ ChosenX | TokenName$ Elemental Cat | TokenTypes$ Creature,Elemental,Cat | TokenOwner$ You | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Haste | TokenSVars$ FirecatBlitzEOT | AtEOT$ Exile | Flashback$ True | CostDesc$Flashback—{R}{R}, Sacrifice X Mountains. | References$ Y | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:FirecatBlitzEOT:SVar:EndOfTurnLeavePlay:True +A:SP$ Token | Cost$ X R R | TokenAmount$ X | TokenScript$ r_1_1_elemental_cat_haste | AtEOT$ Exile | References$ X | SpellDescription$ Create X 1/1 red Elemental Cat creature tokens with haste. Exile them at the beginning of the next end step. SVar:X:Count$xPaid -SVar:Y:XChoice -#Flashback uses Y because SVars can't overlap -#ChosenX SVar created by Cost payment +#X Will get overwritten by Announce +K:Flashback:R R Sac +DeckHas:Ability$Token AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/firecat_blitz.jpg Oracle:Create X 1/1 red Elemental Cat creature tokens with haste. Exile them at the beginning of the next end step.\nFlashback—{R}{R}, Sacrifice X Mountains. (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/f/flameshadow_conjuring.txt b/forge-gui/res/cardsfolder/f/flameshadow_conjuring.txt index bca8dcfb3bb..54f1e6da576 100644 --- a/forge-gui/res/cardsfolder/f/flameshadow_conjuring.txt +++ b/forge-gui/res/cardsfolder/f/flameshadow_conjuring.txt @@ -2,8 +2,7 @@ Name:Flameshadow Conjuring ManaCost:3 R Types:Enchantment T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+YouCtrl | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigCopy | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, you may pay {R}. If you do, create a token that's a copy of that creature.That token gains haste. Exile it at the beginning of the next end step. -SVar:TrigCopy:AB$ CopyPermanent | Cost$ R | Defined$ TriggeredCard | AddSVars$ SneakAttackEOT | PumpKeywords$ Haste | AtEOT$ Exile | RememberCopied$ True -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True +SVar:TrigCopy:AB$ CopyPermanent | Cost$ R | Defined$ TriggeredCard | PumpKeywords$ Haste | AtEOT$ Exile | RememberCopied$ True SVar:BuffedBy:Creature SVar:Picture:http://www.wizards.com/global/images/magic/general/flameshadow_conjuring.jpg Oracle:Whenever a nontoken creature enters the battlefield under your control, you may pay {R}. If you do, create a token that's a copy of that creature. That token gains haste. Exile it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/g/geist_of_saint_traft.txt b/forge-gui/res/cardsfolder/g/geist_of_saint_traft.txt index d7e992bd2d0..bf589a669b9 100644 --- a/forge-gui/res/cardsfolder/g/geist_of_saint_traft.txt +++ b/forge-gui/res/cardsfolder/g/geist_of_saint_traft.txt @@ -4,8 +4,7 @@ Types:Legendary Creature Spirit Cleric PT:2/2 K:Hexproof T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME attacks, create a 4/4 white Angel creature token with flying that's tapped and attacking. Exile that token at end of combat. -SVar:TrigToken:DB$ Token | TokenImage$ w 4 4 angel ISD | TokenAmount$ 1 | TokenName$ Angel | TokenTypes$ Creature,Angel | TokenOwner$ You | TokenColors$ White | TokenPower$ 4 | TokenToughness$ 4 | TokenKeywords$ Flying | TokenTapped$ True | TokenAttacking$ True | TokenSVars$ SaintTraftEOT | AtEOT$ ExileCombat +SVar:TrigToken:DB$ Token | TokenScript$ w_4_4_angel_flying | TokenTapped$ True | TokenAttacking$ True | AtEOT$ ExileCombat SVar:HasAttackEffect:TRUE -SVar:SaintTraftEOT:SVar:EndOfTurnLeavePlay:True SVar:Picture:http://www.wizards.com/global/images/magic/general/geist_of_saint_traft.jpg Oracle:Hexproof (This creature can't be the target of spells or abilities your opponents control.)\nWhenever Geist of Saint Traft attacks, create a 4/4 white Angel creature token with flying that's tapped and attacking. Exile that token at end of combat. diff --git a/forge-gui/res/cardsfolder/g/gemini_engine.txt b/forge-gui/res/cardsfolder/g/gemini_engine.txt index cf22cec4597..70e0c2953da 100644 --- a/forge-gui/res/cardsfolder/g/gemini_engine.txt +++ b/forge-gui/res/cardsfolder/g/gemini_engine.txt @@ -3,10 +3,9 @@ ManaCost:6 Types:Artifact Creature Construct PT:3/4 T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME attacks, create a colorless Construct artifact creature token named Twin that's attacking. Its power is equal to CARDNAME's power and its toughness is equal to CARDNAME's toughness. Sacrifice the token at end of combat. -SVar:TrigToken:DB$Token | TokenAmount$ 1 | TokenName$ Twin | TokenTypes$ Artifact,Creature,Construct | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ X | TokenToughness$ Y | TokenAttacking$ True | TokenSVars$ GeminiEngineEOT | AtEOT$ SacrificeCombat | References$ X,Y +SVar:TrigToken:DB$Token | TokenAmount$ 1 | TokenName$ Twin | TokenTypes$ Artifact,Creature,Construct | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ X | TokenToughness$ Y | TokenAttacking$ True | AtEOT$ SacrificeCombat | References$ X,Y SVar:X:Count$CardPower SVar:Y:Count$CardToughness SVar:HasAttackEffect:TRUE -SVar:GeminiEngineEOT:SVar:EndOfTurnLeavePlay:True SVar:Picture:http://www.wizards.com/global/images/magic/general/gemini_engine.jpg Oracle:Whenever Gemini Engine attacks, create a colorless Construct artifact creature token named Twin that's attacking. Its power is equal to Gemini Engine's power and its toughness is equal to Gemini Engine's toughness. Sacrifice the token at end of combat. diff --git a/forge-gui/res/cardsfolder/g/giantbaiting.txt b/forge-gui/res/cardsfolder/g/giantbaiting.txt index cf40c1259a8..9eda81b80d4 100644 --- a/forge-gui/res/cardsfolder/g/giantbaiting.txt +++ b/forge-gui/res/cardsfolder/g/giantbaiting.txt @@ -1,8 +1,8 @@ Name:Giantbaiting ManaCost:2 RG Types:Sorcery -A:SP$ Token | Cost$ 2 RG | TokenAmount$ 1 | TokenName$ Giant Warrior | TokenTypes$ Creature,Giant,Warrior | TokenOwner$ You | TokenColors$ Red,Green | TokenPower$ 4 | TokenToughness$ 4 | TokenKeywords$ Haste | TokenSVars$ GiantbaitingEOT | AtEOT$ Exile | SpellDescription$ Create a 4/4 red and green Giant Warrior creature token with haste. Exile it at the beginning of the next end step. -SVar:GiantbaitingEOT:SVar:EndOfTurnLeavePlay:True +A:SP$ Token | Cost$ 2 RG | TokenScript$ rb_4_4_giant_warrior_haste | AtEOT$ Exile | SpellDescription$ Create a 4/4 red and green Giant Warrior creature token with haste. Exile it at the beginning of the next end step. K:Conspire +DeckHas:Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/giantbaiting.jpg Oracle:Create a 4/4 red and green Giant Warrior creature token with haste. Exile it at the beginning of the next end step.\nConspire (As you cast this spell, you may tap two untapped creatures you control that share a color with it. When you do, copy it.) diff --git a/forge-gui/res/cardsfolder/g/goryos_vengeance.txt b/forge-gui/res/cardsfolder/g/goryos_vengeance.txt index 3bf66cf2735..c7a05eb151a 100644 --- a/forge-gui/res/cardsfolder/g/goryos_vengeance.txt +++ b/forge-gui/res/cardsfolder/g/goryos_vengeance.txt @@ -2,10 +2,10 @@ Name:Goryo's Vengeance ManaCost:1 B Types:Instant Arcane K:Splice:Arcane:2 B -A:SP$ ChangeZone | Cost$ 1 B | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.Legendary+YouCtrl | TgtPrompt$ Select target legendary creature in your graveyard | GainControl$ True | SubAbility$ DBPump | AILogic$ BeforeCombat | SpellDescription$ Return target legendary creature card from your graveyard to the battlefield. That creature gains haste. Exile it at the beginning of the next end step. -SVar:DBPump:DB$ Animate | Keywords$ Haste | sVars$ SneakAttackEOT | Defined$ Targeted | Permanent$ True | AtEOT$ Exile +A:SP$ ChangeZone | Cost$ 1 B | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.Legendary+YouCtrl | TgtPrompt$ Select target legendary creature in your graveyard | GainControl$ True | SubAbility$ DBPump | RememberChanged$ True | AILogic$ BeforeCombat | SpellDescription$ Return target legendary creature card from your graveyard to the battlefield. That creature gains haste. Exile it at the beginning of the next end step. +SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Remembered | Permanent$ True | AtEOT$ Exile | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True SVar:Picture:http://www.wizards.com/global/images/magic/general/goryos_vengeance.jpg Oracle:Return target legendary creature card from your graveyard to the battlefield. That creature gains haste. Exile it at the beginning of the next end step.\nSplice onto Arcane {2}{B} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) diff --git a/forge-gui/res/cardsfolder/g/gruesome_encore.txt b/forge-gui/res/cardsfolder/g/gruesome_encore.txt index 1303cbd4700..543bfde8460 100644 --- a/forge-gui/res/cardsfolder/g/gruesome_encore.txt +++ b/forge-gui/res/cardsfolder/g/gruesome_encore.txt @@ -1,8 +1,8 @@ Name:Gruesome Encore ManaCost:2 B Types:Sorcery -A:SP$ ChangeZone | Cost$ 2 B | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.OppOwn | TgtPrompt$ Select target creature in an opponent's graveyard | GainControl$ True | SubAbility$ DBPump | SpellDescription$ Put target creature card from an opponent's graveyard onto the battlefield under your control. It gains haste. Exile it at the beginning of the next end step. If that creature would leave the battlefield, exile it instead of putting it anywhere else. -SVar:DBPump:DB$ Animate | Keywords$ Haste | LeaveBattlefield$ Exile | sVars$ SneakAttackEOT | Defined$ Targeted | Permanent$ True | AtEOT$ Exile -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True +A:SP$ ChangeZone | Cost$ 2 B | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.OppOwn | TgtPrompt$ Select target creature in an opponent's graveyard | GainControl$ True | SubAbility$ DBPump | RememberChanged$ True | SpellDescription$ Put target creature card from an opponent's graveyard onto the battlefield under your control. It gains haste. Exile it at the beginning of the next end step. If that creature would leave the battlefield, exile it instead of putting it anywhere else. +SVar:DBPump:DB$ Animate | Keywords$ Haste | LeaveBattlefield$ Exile | Defined$ Remembered | Permanent$ True | AtEOT$ Exile | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/gruesome_encore.jpg Oracle:Put target creature card from an opponent's graveyard onto the battlefield under your control. It gains haste. Exile it at the beginning of the next end step. If that creature would leave the battlefield, exile it instead of putting it anywhere else. diff --git a/forge-gui/res/cardsfolder/h/heat_shimmer.txt b/forge-gui/res/cardsfolder/h/heat_shimmer.txt index b7a36237813..e32258cfd2c 100644 --- a/forge-gui/res/cardsfolder/h/heat_shimmer.txt +++ b/forge-gui/res/cardsfolder/h/heat_shimmer.txt @@ -1,7 +1,6 @@ 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." -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True +A:SP$ CopyPermanent | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | Keywords$ Haste | AtEOTTrig$ Exile | 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." 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." diff --git a/forge-gui/res/cardsfolder/h/helm_of_the_host.txt b/forge-gui/res/cardsfolder/h/helm_of_the_host.txt index 79a4f5f1b1e..b4bfcde0f91 100644 --- a/forge-gui/res/cardsfolder/h/helm_of_the_host.txt +++ b/forge-gui/res/cardsfolder/h/helm_of_the_host.txt @@ -3,7 +3,7 @@ ManaCost:4 Types:Legendary Artifact Equipment K:Equip:5 T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | Execute$ TrigCopy | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of combat on your turn, create a token that's a copy of equipped creature, except the token isn't legendary if equipped creature is legendary. That token gains haste. -SVar:TrigCopy:DB$ CopyPermanent | Defined$ Equipped | Keywords$ Haste | NonLegendary$ True | ResetAbilityActivations$ True +SVar:TrigCopy:DB$ CopyPermanent | Defined$ Equipped | Keywords$ Haste | NonLegendary$ True DeckHas:Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/helm_of_the_host.jpg Oracle:At the beginning of combat on your turn, create a token that's a copy of equipped creature, except the token isn't legendary if equipped creature is legendary. That token gains haste.\nEquip {5} diff --git a/forge-gui/res/cardsfolder/h/hornet_cannon.txt b/forge-gui/res/cardsfolder/h/hornet_cannon.txt index f102e19c0dd..628ebdfa9e0 100644 --- a/forge-gui/res/cardsfolder/h/hornet_cannon.txt +++ b/forge-gui/res/cardsfolder/h/hornet_cannon.txt @@ -1,7 +1,7 @@ Name:Hornet Cannon ManaCost:4 Types:Artifact -A:AB$ Token | Cost$ 3 T | TokenAmount$ 1 | TokenName$ Hornet | TokenTypes$ Artifact,Creature,Insect | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying<>Haste | TokenSVars$ HornetCannonEOT | AtEOT$ Destroy | SpellDescription$ Create a 1/1 colorless Insect artifact creature token with flying and haste named Hornet. Destroy it at the beginning of the next end step. -SVar:HornetCannonEOT:SVar:EndOfTurnLeavePlay:True +A:AB$ Token | Cost$ 3 T | TokenAmount$ 1 | TokenScript$ hornet | AtEOT$ Destroy | SpellDescription$ Create a 1/1 colorless Insect artifact creature token with flying and haste named Hornet. Destroy it at the beginning of the next end step. +DeckHas:Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/hornet_cannon.jpg Oracle:{3}, {T}: Create a 1/1 colorless Insect artifact creature token with flying and haste named Hornet. Destroy it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/i/impromptu_raid.txt b/forge-gui/res/cardsfolder/i/impromptu_raid.txt index d57f63f087e..7b4bc1f5055 100644 --- a/forge-gui/res/cardsfolder/i/impromptu_raid.txt +++ b/forge-gui/res/cardsfolder/i/impromptu_raid.txt @@ -2,9 +2,8 @@ Name:Impromptu Raid ManaCost:3 RG Types:Enchantment A:AB$ Dig | Cost$ 2 RG | DigNum$ 1 | Reveal$ True | ChangeNum$ All | ChangeValid$ Creature | DestinationZone$ Battlefield | DestinationZone2$ Graveyard | RememberChanged$ True | SubAbility$ DBPump | SpellDescription$ Reveal the top card of your library. If it isn't a creature card, put it into your graveyard. Otherwise, put that card onto the battlefield. That creature gains haste. Sacrifice it at the beginning of the next end step. -SVar:DBPump:DB$ Animate | Keywords$ Haste | sVars$ SneakAttackEOT | Defined$ Remembered | Permanent$ True | AtEOT$ Sacrifice | SubAbility$ DBCleanup +SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Remembered | Permanent$ True | AtEOT$ Sacrifice | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True AI:RemoveDeck:All -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True SVar:Picture:http://www.wizards.com/global/images/magic/general/impromptu_raid.jpg Oracle:{2}{R/G}: Reveal the top card of your library. If it isn't a creature card, put it into your graveyard. Otherwise, put that card onto the battlefield. That creature gains haste. Sacrifice it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/i/inalla_archmage_ritualist.txt b/forge-gui/res/cardsfolder/i/inalla_archmage_ritualist.txt index f20d04cf25a..d6b7107cd8e 100644 --- a/forge-gui/res/cardsfolder/i/inalla_archmage_ritualist.txt +++ b/forge-gui/res/cardsfolder/i/inalla_archmage_ritualist.txt @@ -4,9 +4,8 @@ Types:Legendary Creature Human Wizard PT:4/5 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Wizard.YouCtrl+nonToken+Other | TriggerZones$ Command | PresentZone$ Command | Execute$ TrigCopyPermanent | TriggerDescription$ Eminence — Whenever another nontoken Wizard enters the battlefield under your control, if CARDNAME is in the command zone or on the battlefield, you may pay {1}. If you do, create a token that's a copy of that Wizard. The token gains haste. Exile it at the beginning of the next end step. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Wizard.YouCtrl+nonToken+Other | TriggerZones$ Battlefield | PresentZone$ Battlefield | Execute$ TrigCopyPermanent | Secondary$ True | TriggerDescription$ Eminence — Whenever another nontoken Wizard enters the battlefield under your control, if CARDNAME is in the command zone or on the battlefield, you may pay {1}. If you do, create a token that's a copy of that Wizard. The token gains haste. Exile it at the beginning of the next end step. -SVar:TrigCopyPermanent:AB$ CopyPermanent | Cost$ 1 | Defined$ TriggeredCard | NumCopies$ 1 | AddSVars$ SneakAttackEOT | PumpKeywords$ Haste | AtEOT$ Exile +SVar:TrigCopyPermanent:AB$ CopyPermanent | Cost$ 1 | Defined$ TriggeredCard | NumCopies$ 1 | PumpKeywords$ Haste | AtEOT$ Exile A:AB$ LoseLife | Cost$ tapXType<5/Wizard> | ValidTgts$ Player | TgtPrompt$ Select a player to lose 7 life | LifeAmount$ 7 | SpellDescription$ Target player loses 7 life. -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True SVar:BuffedBy:Wizard DeckHints:Type$Wizard SVar:Picture:http://www.wizards.com/global/images/magic/general/inalla_archmage_ritualist.jpg diff --git a/forge-gui/res/cardsfolder/i/incandescent_soulstoke.txt b/forge-gui/res/cardsfolder/i/incandescent_soulstoke.txt index e2148a07530..d000f1acc49 100644 --- a/forge-gui/res/cardsfolder/i/incandescent_soulstoke.txt +++ b/forge-gui/res/cardsfolder/i/incandescent_soulstoke.txt @@ -4,10 +4,9 @@ Types:Creature Elemental Shaman PT:2/2 S:Mode$ Continuous | Affected$ Creature.Elemental+Other+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Other Elemental creatures you control get +1/+1. A:AB$ ChangeZone | Cost$ 1 R T | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature.Elemental+YouCtrl | SubAbility$ DBPump | RememberChanged$ True | ForgetOtherRemembered$ True | SpellDescription$ You may put an Elemental creature card from your hand onto the battlefield. That creature gains haste until end of turn. Sacrifice it at the beginning of the next end step. -SVar:DBPump:DB$ Animate | Keywords$ Haste | sVars$ SneakAttackEOT | Defined$ Remembered | AtEOT$ Sacrifice | SubAbility$ DBCleanup +SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Remembered | AtEOT$ Sacrifice | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True AI:RemoveDeck:All SVar:PlayMain1:TRUE -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True SVar:Picture:http://www.wizards.com/global/images/magic/general/incandescent_soulstoke.jpg Oracle:Other Elemental creatures you control get +1/+1.\n{1}{R}, {T}: You may put an Elemental creature card from your hand onto the battlefield. That creature gains haste until end of turn. Sacrifice it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/i/invocation_of_saint_traft.txt b/forge-gui/res/cardsfolder/i/invocation_of_saint_traft.txt index 5e15965cd33..60c3aded6d8 100644 --- a/forge-gui/res/cardsfolder/i/invocation_of_saint_traft.txt +++ b/forge-gui/res/cardsfolder/i/invocation_of_saint_traft.txt @@ -3,10 +3,10 @@ ManaCost:1 W U Types:Enchantment Aura K:Enchant Creature A:SP$ Attach | Cost$ 1 W U | ValidTgts$ Creature | AILogic$ Pump -S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddTrigger$ SaintTraftTrig | AddSVar$ SaintTraftToken & SaintTraftDelTrig & SaintTraftTrigExile & SaintTraftCleanup | Description$ Enchanted creature has "Whenever this creature attacks, create a 4/4 white Angel creature token with flying that's tapped and attacking. Exile that token at end of combat." +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddTrigger$ SaintTraftTrig | AddSVar$ SaintTraftToken | Description$ Enchanted creature has "Whenever this creature attacks, create a 4/4 white Angel creature token with flying that's tapped and attacking. Exile that token at end of combat." SVar:SaintTraftTrig:Mode$ Attacks | ValidCard$ Card.Self | Execute$ SaintTraftToken | TriggerDescription$ Whenever this creature attacks, put a 4/4 white Angel creature token with flying onto the battlefield tapped and attacking. Exile that token at end of combat. -SVar:SaintTraftToken:DB$Token | TokenImage$ w 4 4 angel SOI | TokenAmount$ 1 | TokenName$ Angel | TokenTypes$ Creature,Angel | TokenOwner$ You | TokenColors$ White | TokenPower$ 4 | TokenToughness$ 4 | TokenKeywords$ Flying | TokenTapped$ True | TokenAttacking$ True | TokenSVars$ SaintTraftEOT | AtEOT$ ExileCombat +SVar:SaintTraftToken:DB$Token | TokenScript$ w_4_4_angel_flying | TokenTapped$ True | TokenAttacking$ True | AtEOT$ ExileCombat SVar:HasAttackEffect:TRUE -SVar:SaintTraftEOT:SVar:EndOfTurnLeavePlay:True +DeckHas:Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/invocation_of_saint_traft.jpg Oracle:Enchant creature\nEnchanted creature has "Whenever this creature attacks, create a 4/4 white Angel creature token with flying that's tapped and attacking. Exile that token at end of combat." diff --git a/forge-gui/res/cardsfolder/j/jace_cunning_castaway.txt b/forge-gui/res/cardsfolder/j/jace_cunning_castaway.txt index af39ce0f5e1..74a7d65fbf9 100644 --- a/forge-gui/res/cardsfolder/j/jace_cunning_castaway.txt +++ b/forge-gui/res/cardsfolder/j/jace_cunning_castaway.txt @@ -10,6 +10,6 @@ A:AB$ Token | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 SVar:SacOnSpell:Mode$ BecomesTarget | ValidTarget$ Card.Self | SourceType$ Spell | TriggerZones$ Battlefield | Execute$ DoSac | TriggerDescription$ When CARDNAME becomes the target of a spell, sacrifice it. SVar:TokenTgtDies:SVar:Targeting:Dies SVar:DoSac:DB$ Sacrifice | Defined$ Self -A:AB$ CopyPermanent | Cost$ SubCounter<5/LOYALTY> | Planeswalker$ True | Ultimate$ True | Defined$ Self | NumCopies$ 2 | NonLegendary$ True | ResetAbilityActivations$ True | SpellDescription$ Create two tokens that are copies of CARDNAME, except they're not legendary. +A:AB$ CopyPermanent | Cost$ SubCounter<5/LOYALTY> | Planeswalker$ True | Ultimate$ True | Defined$ Self | NumCopies$ 2 | NonLegendary$ True | SpellDescription$ Create two tokens that are copies of CARDNAME, except they're not legendary. SVar:Picture:http://www.wizards.com/global/images/magic/general/jace_cunning_castaway.jpg -Oracle:[+1]: Whenever one or more creatures you control deal combat damage to a player this turn, draw a card, then discard a card.\n[-2]: Create a 2/2 blue Illusion token with "When this creature becomes the target of a spell, sacrifice it."\n[-5]: Create two tokens that are copies of Jace, Cunning Castaway, except they're not legendary. \ No newline at end of file +Oracle:[+1]: Whenever one or more creatures you control deal combat damage to a player this turn, draw a card, then discard a card.\n[-2]: Create a 2/2 blue Illusion token with "When this creature becomes the target of a spell, sacrifice it."\n[-5]: Create two tokens that are copies of Jace, Cunning Castaway, except they're not legendary. diff --git a/forge-gui/res/cardsfolder/k/kari_zev_skyship_raider.txt b/forge-gui/res/cardsfolder/k/kari_zev_skyship_raider.txt index cd7a7b3dffc..cb3bd3b5108 100644 --- a/forge-gui/res/cardsfolder/k/kari_zev_skyship_raider.txt +++ b/forge-gui/res/cardsfolder/k/kari_zev_skyship_raider.txt @@ -5,8 +5,8 @@ PT:1/3 K:First Strike K:Menace T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME attacks, create a legendary 2/1 red Monkey creature token named Ragavan that's tapped and attacking. Exile that token at the end of combat. -SVar:TrigToken:DB$ Token | TokenImage$ r 2 1 ragavan AER | TokenAmount$ 1 | TokenName$ Ragavan | TokenTypes$ Creature,Monkey,Legendary | TokenOwner$ You | TokenColors$ Red | TokenPower$ 2 | TokenToughness$ 1 | TokenTapped$ True | TokenAttacking$ True | TokenSVars$ RagavanEOT | AtEOT$ ExileCombat +SVar:TrigToken:DB$ Token | TokenScript$ ragavan | TokenTapped$ True | TokenAttacking$ True | AtEOT$ ExileCombat SVar:HasAttackEffect:TRUE -SVar:RagavanEOT:SVar:EndOfTurnLeavePlay:True +DeckHas:Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/kari_zev_skyship_raider.jpg Oracle:First strike, menace\nWhenever Kari Zev, Skyship Raider attacks, create a legendary 2/1 red Monkey creature token named Ragavan that's tapped and attacking. Exile that token at the end of combat. 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..9a51bb0461f 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,6 @@ 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. -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True +A:AB$ CopyPermanent | Cost$ T | ValidTgts$ Creature.nonLegendary+YouCtrl | TgtPrompt$ Select target nonlegendary creature you control | Keywords$ Haste | AtEOT$ Sacrifice | AILogic$ BeforeCombat | 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. 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. diff --git a/forge-gui/res/cardsfolder/k/killer_instinct.txt b/forge-gui/res/cardsfolder/k/killer_instinct.txt index 1e6dc7f80eb..8d81fc6fa97 100644 --- a/forge-gui/res/cardsfolder/k/killer_instinct.txt +++ b/forge-gui/res/cardsfolder/k/killer_instinct.txt @@ -3,8 +3,7 @@ ManaCost:4 R G Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDig | TriggerDescription$ At the beginning of your upkeep, reveal the top card of your library. If it's a creature card, put it onto the battlefield. That creature gains haste until end of turn. Sacrifice it at the beginning of the next end step. SVar:TrigDig:DB$ Dig | DigNum$ 1 | Reveal$ True | ChangeNum$ All | ChangeValid$ Creature | DestinationZone$ Battlefield | RememberChanged$ True | LibraryPosition2$ 0 | SubAbility$ DBPump -SVar:DBPump:DB$ Animate | Keywords$ Haste | sVars$ SneakAttackEOT | Defined$ Remembered | AtEOT$ Sacrifice | SubAbility$ DBCleanup +SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Remembered | AtEOT$ Sacrifice | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True SVar:Picture:http://www.wizards.com/global/images/magic/general/killer_instinct.jpg Oracle:At the beginning of your upkeep, reveal the top card of your library. If it's a creature card, put it onto the battlefield. That creature gains haste until end of turn. Sacrifice it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/k/kindred_charge.txt b/forge-gui/res/cardsfolder/k/kindred_charge.txt index 7e8cfd65c38..4340bce64b5 100644 --- a/forge-gui/res/cardsfolder/k/kindred_charge.txt +++ b/forge-gui/res/cardsfolder/k/kindred_charge.txt @@ -3,7 +3,6 @@ ManaCost:4 R R Types:Sorcery A:SP$ ChooseType | Cost$ 4 R R | Defined$ You | Type$ Creature | SubAbility$ DBRepeatEach | AILogic$ MostProminentComputerControls | SpellDescription$ Choose a creature type. For each creature you control of the chosen type, create a token that's a copy of that creature. Those tokens gain haste. Exile them at the beginning of the next end step. SVar:DBRepeatEach:DB$ RepeatEach | UseImprinted$ True | RepeatCards$ Creature.ChosenType+YouCtrl | Zone$ Battlefield | RepeatSubAbility$ DBClone -SVar:DBClone:DB$ CopyPermanent | Defined$ Imprinted | Keywords$ Haste | NumCopies$ 1 | AtEOT$ Exile | AddSVars$ SneakAttackEOT -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True +SVar:DBClone:DB$ CopyPermanent | Defined$ Imprinted | Keywords$ Haste | NumCopies$ 1 | AtEOT$ Exile SVar:Picture:http://www.wizards.com/global/images/magic/general/kindred_charge.jpg Oracle:Choose a creature type. For each creature you control of the chosen type, create a token that's a copy of that creature. Those tokens gain haste. Exile them at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/l/lightning_coils.txt b/forge-gui/res/cardsfolder/l/lightning_coils.txt index 4b8248b3275..4f44f6bb250 100644 --- a/forge-gui/res/cardsfolder/l/lightning_coils.txt +++ b/forge-gui/res/cardsfolder/l/lightning_coils.txt @@ -5,9 +5,9 @@ T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ CHARGE | CounterNum$ 1 | ConditionPresent$ Card.StrictlySelf T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Card.Self+counters_GE5_CHARGE | Execute$ DBRemoveCounter | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, if CARDNAME has five or more charge counters on it, remove all of them from it and create that many 3/1 red Elemental creature tokens with haste. Exile them at the beginning of the next end step. SVar:DBRemoveCounter:DB$ RemoveCounter | Defined$ Self | CounterType$ CHARGE | CounterNum$ All | RememberRemoved$ True | SubAbility$ DBToken -SVar:DBToken:DB$ Token | TokenAmount$ X | TokenImage$ r 3 1 elemental MRD | TokenName$ Elemental | TokenColors$ Red | TokenTypes$ Creature,Elemental | TokenKeywords$ Haste | TokenSVars$ EOTExile | TokenPower$ 3 | TokenToughness$ 1 | AtEOT$ Exile | References$ X | SubAbility$ DBCleanup +SVar:DBToken:DB$ Token | TokenAmount$ X | TokenScript$ r_3_1_elemental_haste | AtEOT$ Exile | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:EOTExile:SVar:EndOfTurnLeavePlay:True SVar:X:Count$RememberedSize +DeckHas:Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/lightning_coils.jpg Oracle:Whenever a nontoken creature you control dies, put a charge counter on Lightning Coils.\nAt the beginning of your upkeep, if Lightning Coils has five or more charge counters on it, remove all of them from it and create that many 3/1 red Elemental creature tokens with haste. Exile them at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/m/mimic_vat.txt b/forge-gui/res/cardsfolder/m/mimic_vat.txt index 1f2333f8205..19f09204792 100644 --- a/forge-gui/res/cardsfolder/m/mimic_vat.txt +++ b/forge-gui/res/cardsfolder/m/mimic_vat.txt @@ -5,13 +5,12 @@ T:Mode$ ChangesZone | ValidCard$ Creature.nonToken | Origin$ Battlefield | Desti SVar:TrigReturn:DB$ ChangeZone | Origin$ Exile | Destination$ Graveyard | Defined$ Imprinted | ChangeNum$ 1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True | SubAbility$ DBExile SVar:DBExile:DB$ ChangeZone | Imprint$ True | Origin$ Graveyard | Destination$ Exile | Defined$ TriggeredCard | ChangeNum$ 1 | AILogic$ MimicVat -A:AB$ CopyPermanent | Cost$ 3 T | Defined$ Imprinted.ExiledWithSource | AddSVars$ SneakAttackEOT | PumpKeywords$ Haste | AtEOT$ Exile | AILogic$ MimicVat | SpellDescription$ Create a token that's a copy of a card exiled with CARDNAME. It gains haste. Exile it at the beginning of the next end step. +A:AB$ CopyPermanent | Cost$ 3 T | Defined$ Imprinted.ExiledWithSource | PumpKeywords$ Haste | AtEOT$ Exile | AILogic$ MimicVat | SpellDescription$ Create a token that's a copy of a card exiled with CARDNAME. It gains haste. Exile it at the beginning of the next end step. T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsImprinted+ExiledWithSource | Execute$ DBForget SVar:DBForget:DB$ Pump | ForgetImprinted$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Card.Self | Destination$ Any | Execute$ DBCleanImprinted | Static$ True SVar:DBCleanImprinted:DB$ Cleanup | ClearImprinted$ True SVar:NonStackingEffect:True AI:RemoveDeck:Random -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True SVar:Picture:http://www.wizards.com/global/images/magic/general/mimic_vat.jpg Oracle:Imprint — Whenever a nontoken creature dies, you may exile that card. If you do, return each other card exiled with Mimic Vat to its owner's graveyard.\n{3}, {T}: Create a token that's a copy of a card exiled with Mimic Vat. It gains haste. Exile it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/m/minion_reflector.txt b/forge-gui/res/cardsfolder/m/minion_reflector.txt index 4b6233ffe03..3cb7dc87829 100644 --- a/forge-gui/res/cardsfolder/m/minion_reflector.txt +++ b/forge-gui/res/cardsfolder/m/minion_reflector.txt @@ -2,8 +2,7 @@ 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." -SVar:TrigCopy:AB$ CopyPermanent | Cost$ 2 | Defined$ TriggeredCard | Keywords$ Haste | AddSVars$ SneakAttackEOT | AtEOTTrig$ Sacrifice +SVar:TrigCopy:AB$ CopyPermanent | Cost$ 2 | Defined$ TriggeredCard | Keywords$ Haste | 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." diff --git a/forge-gui/res/cardsfolder/n/nahiri_the_harbinger.txt b/forge-gui/res/cardsfolder/n/nahiri_the_harbinger.txt index c195306e4bb..80eed9758ad 100644 --- a/forge-gui/res/cardsfolder/n/nahiri_the_harbinger.txt +++ b/forge-gui/res/cardsfolder/n/nahiri_the_harbinger.txt @@ -7,10 +7,7 @@ SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 | ConditionDefined$ Remembered SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True A:AB$ ChangeZone | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | ValidTgts$ Enchantment,Artifact.tapped,Creature.tapped | TgtPrompt$ Select target enchantment, tapped artifact, or tapped creature | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target enchantment, tapped artifact, or tapped creature. A:AB$ ChangeZone | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Ultimate$ True | Origin$ Library | Destination$ Battlefield | ChangeType$ Artifact,Creature | ChangeNum$ 1 | RememberChanged$ True | SubAbility$ DBPump | SpellDescription$ Search your library for an artifact or creature card, put it onto the battlefield, then shuffle your library. It gains haste. Return it to your hand at the beginning of the next end step. -SVar:DBPump:DB$ Animate | Keywords$ Haste | Permanent$ True | sVars$ SneakAttackEOT | Defined$ Remembered | SubAbility$ DelTrig -SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End Of Turn | Execute$ TrigBounce | RememberObjects$ Remembered | TriggerDescription$ Return the permanent to its owner's hand at the beginning of the next end step. | SubAbility$ DBCleanup | AILogic$ Always | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 -SVar:TrigBounce:DB$ ChangeZone | Defined$ DelayTriggerRemembered | Origin$ Battlefield | Destination$ Hand +SVar:DBPump:DB$ Animate | Keywords$ Haste | Permanent$ True | AtEOT$ Hand | Defined$ Remembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True SVar:Picture:http://www.wizards.com/global/images/magic/general/nahiri_the_harbinger.jpg Oracle:[+2]: You may discard a card. If you do, draw a card.\n[-2]: Exile target enchantment, tapped artifact, or tapped creature.\n[-8]: Search your library for an artifact or creature card, put it onto the battlefield, then shuffle your library. It gains haste. Return it to your hand at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/p/puppeteer_clique.txt b/forge-gui/res/cardsfolder/p/puppeteer_clique.txt index 3b15f5c0dc6..72eaf602a54 100644 --- a/forge-gui/res/cardsfolder/p/puppeteer_clique.txt +++ b/forge-gui/res/cardsfolder/p/puppeteer_clique.txt @@ -6,9 +6,8 @@ K:Flying K:Persist T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, put target creature card from an opponent's graveyard onto the battlefield under your control. It gains haste. At the beginning of your next end step, exile it. SVar:TrigChangeZone:DB$ ChangeZone | ValidTgts$ Creature.OppOwn | TgtPrompt$ Select target creature from an opponent's graveyard | RememberChanged$ True | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | SubAbility$ DBPump -SVar:DBPump:DB$ Animate | Keywords$ Haste | sVars$ SneakAttackEOT | Defined$ Remembered | Permanent$ True | AtEOT$ Exile | SubAbility$ DBCleanup +SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Remembered | Permanent$ True | AtEOT$ Exile | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:PlayMain1:ALWAYS -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True SVar:Picture:http://www.wizards.com/global/images/magic/general/puppeteer_clique.jpg Oracle:Flying\nWhen Puppeteer Clique enters the battlefield, put target creature card from an opponent's graveyard onto the battlefield under your control. It gains haste. At the beginning of your next end step, exile it.\nPersist (When this creature dies, if it had no -1/-1 counters on it, return it to the battlefield under its owner's control with a -1/-1 counter on it.) diff --git a/forge-gui/res/cardsfolder/r/rakdos_guildmage.txt b/forge-gui/res/cardsfolder/r/rakdos_guildmage.txt index e2b06723991..8a1ed36028d 100644 --- a/forge-gui/res/cardsfolder/r/rakdos_guildmage.txt +++ b/forge-gui/res/cardsfolder/r/rakdos_guildmage.txt @@ -3,7 +3,7 @@ ManaCost:BR BR Types:Creature Zombie Shaman PT:2/2 A:AB$ Pump | Cost$ 3 B Discard<1/Card> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -2 | NumDef$ -2 | IsCurse$True | SpellDescription$ Target creature gets -2/-2 until end of turn. -A:AB$ Token | Cost$ 3 R | TokenAmount$ 1 | TokenName$ Goblin | TokenTypes$ Creature,Goblin | TokenOwner$ You | TokenColors$ Red | TokenPower$ 2 | TokenToughness$ 1 | TokenKeywords$ Haste | TokenSVars$ RakdosEOT | AtEOT$ Exile | SpellDescription$ Create a 2/1 red Goblin creature token with haste. Exile it at the beginning of the next end step. -SVar:RakdosEOT:SVar:EndOfTurnLeavePlay:True +A:AB$ Token | Cost$ 3 R | TokenScript$ r_2_1_goblin_haste | AtEOT$ Exile | SpellDescription$ Create a 2/1 red Goblin creature token with haste. Exile it at the beginning of the next end step. +DeckHas:Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/rakdos_guildmage.jpg Oracle:{3}{B}, Discard a card: Target creature gets -2/-2 until end of turn.\n{3}{R}: Create a 2/1 red Goblin creature token with haste. Exile it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/r/rite_of_the_raging_storm.txt b/forge-gui/res/cardsfolder/r/rite_of_the_raging_storm.txt index 80a3f98ff11..80338774ced 100644 --- a/forge-gui/res/cardsfolder/r/rite_of_the_raging_storm.txt +++ b/forge-gui/res/cardsfolder/r/rite_of_the_raging_storm.txt @@ -3,8 +3,8 @@ ManaCost:3 R R Types:Enchantment S:Mode$ CantAttack | ValidCard$ Creature.namedLightning Rager | Target$ You,Planeswalker.YouCtrl | Description$ Creatures named Lightning Rager can't attack you or planeswalkers you control. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each player's upkeep, that player creates a 5/1 red Elemental creature token named Lightning Rager. It has trample, haste, and "At the beginning of the end step, sacrifice this creature." -SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenName$ Lightning Rager | TokenTypes$ Creature,Elemental | TokenOwner$ TriggeredPlayer | TokenPower$ 5 | TokenToughness$ 1 | TokenKeywords$ Trample<>Haste | TokenSVars$ LightningRagerEOT | TokenColors$ Red | TokenImage$ r 5 1 lightning rager | AtEOTTrig$ Sacrifice -SVar:LightningRagerEOT:SVar:EndOfTurnLeavePlay:True +SVar:TrigToken:DB$ Token | TokenScript$ lightning_rager | TokenOwner$ TriggeredPlayer +DeckHas:Ability$Token AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/rite_of_the_raging_storm.jpg -Oracle:Creatures named Lightning Rager can't attack you or planeswalkers you control.\nAt the beginning of each player's upkeep, that player creates a 5/1 red Elemental creature token named Lightning Rager. It has trample, haste, and "At the beginning of the end step, sacrifice this creature." \ No newline at end of file +Oracle:Creatures named Lightning Rager can't attack you or planeswalkers you control.\nAt the beginning of each player's upkeep, that player creates a 5/1 red Elemental creature token named Lightning Rager. It has trample, haste, and "At the beginning of the end step, sacrifice this creature." diff --git a/forge-gui/res/cardsfolder/s/saheeli_rai.txt b/forge-gui/res/cardsfolder/s/saheeli_rai.txt index 9dae9ff6ef5..cb69537aa9d 100644 --- a/forge-gui/res/cardsfolder/s/saheeli_rai.txt +++ b/forge-gui/res/cardsfolder/s/saheeli_rai.txt @@ -4,8 +4,7 @@ Types:Legendary Planeswalker Saheeli Loyalty:3 A:AB$ Scry | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ScryNum$ 1 | SubAbility$ DBDealDamage | SpellDescription$ Scry 1. CARDNAME deals 1 damage to each opponent. SVar:DBDealDamage:DB$ DealDamage | Defined$ Player.Opponent | NumDmg$ 1 | AILogic$ Good -A:AB$ CopyPermanent | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature.YouCtrl,Artifact.YouCtrl | TgtPrompt$ Select target artifact or creature you control. | AddTypes$ Artifact | AddSVars$ SneakAttackEOT | PumpKeywords$ Haste | ResetAbilityActivations$ True | AtEOT$ Exile | SpellDescription$ Create a token that's a copy of target artifact or creature you control, except it's an artifact in addition to its other types. That token gains haste. Exile it at the beginning of the next end step. -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True +A:AB$ CopyPermanent | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature.YouCtrl,Artifact.YouCtrl | TgtPrompt$ Select target artifact or creature you control. | AddTypes$ Artifact | PumpKeywords$ Haste | AtEOT$ Exile | SpellDescription$ Create a token that's a copy of target artifact or creature you control, except it's an artifact in addition to its other types. That token gains haste. Exile it at the beginning of the next end step. A:AB$ ChangeZone | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | Origin$ Library | Destination$ Battlefield | ChangeType$ Artifact | ChangeNum$ 3 | DifferentNames$ True | SpellDescription$ Search your library for up to three artifact cards with different names, put them onto the battlefield, then shuffle your library. SVar:Picture:http://www.wizards.com/global/images/magic/general/saheeli_rai.jpg -Oracle:[+1]: Scry 1. Saheeli Rai deals 1 damage to each opponent.\n[-2]: Create a token that's a copy of target artifact or creature you control, except it's an artifact in addition to its other types. That token gains haste. Exile it at the beginning of the next end step.\n[-7]: Search your library for up to three artifact cards with different names, put them onto the battlefield, then shuffle your library. \ No newline at end of file +Oracle:[+1]: Scry 1. Saheeli Rai deals 1 damage to each opponent.\n[-2]: Create a token that's a copy of target artifact or creature you control, except it's an artifact in addition to its other types. That token gains haste. Exile it at the beginning of the next end step.\n[-7]: Search your library for up to three artifact cards with different names, put them onto the battlefield, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/s/saheeli_the_gifted.txt b/forge-gui/res/cardsfolder/s/saheeli_the_gifted.txt index 86f5b00299f..6ceb5d1c0a9 100644 --- a/forge-gui/res/cardsfolder/s/saheeli_the_gifted.txt +++ b/forge-gui/res/cardsfolder/s/saheeli_the_gifted.txt @@ -9,8 +9,7 @@ SVar:TrigCastSpell:Mode$ SpellCast | ValidActivatingPlayer$ You | TriggerZones$ SVar:RemoveEffect:DB$ ChangeZone | Origin$ Command | Destination$ Exile SVar:X:Count$Valid Artifact.YouCtrl SVar:RemRandomDeck -A:AB$ RepeatEach | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | RepeatSubAbility$ DBClone | RepeatCards$ Artifact.YouCtrl | AtEOT$ ExileCombat | AddSVars$ SneakAttackEOT | SpellDescription$ For each artifact you control, create a token that's a copy of it. Those tokens gain haste. Exile those tokens at the beginning of the next end step. -SVar:DBClone:DB$ CopyPermanent | Defined$ Remembered | Keywords$ Haste | AtEOT$ Exile | AddSVars$ SneakAttackEOT -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True +A:AB$ RepeatEach | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | RepeatSubAbility$ DBClone | RepeatCards$ Artifact.YouCtrl | SpellDescription$ For each artifact you control, create a token that's a copy of it. Those tokens gain haste. Exile those tokens at the beginning of the next end step. +SVar:DBClone:DB$ CopyPermanent | Defined$ Remembered | Keywords$ Haste | AtEOT$ Exile K:CARDNAME can be your commander. Oracle:[+1]: Create a 1/1 colorless Servo artifact creature token.\n[+1]: The next spell you cast this turn costs {1} less to cast for each artifact you control as you cast it.\n[-7]: For each artifact you control, create a token that's a copy of it. Those tokens gain haste. Exile those tokens at the beginning of the next end step.\nSaheeli, the Gifted can be your commander. diff --git a/forge-gui/res/cardsfolder/s/seance.txt b/forge-gui/res/cardsfolder/s/seance.txt index c0411422466..03012b05ee7 100644 --- a/forge-gui/res/cardsfolder/s/seance.txt +++ b/forge-gui/res/cardsfolder/s/seance.txt @@ -3,9 +3,8 @@ ManaCost:2 W W Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigExile | TriggerDescription$ At the beginning of each upkeep, you may exile target creature card from your graveyard. If you do, create a token that's a copy of that card, except it's a Spirit in addition to its other types. Exile it at the beginning of the next end step. SVar:TrigExile:DB$ ChangeZone | RememberChanged$ True | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Creature.YouCtrl | ChangeNum$ 1 | SubAbility$ DBCopy -SVar:DBCopy:DB$ CopyPermanent | Defined$ Remembered | AddTypes$ Spirit | AtEOT$ Exile | AddSVars$ SneakAttackEOT | SubAbility$ DBCleanup | SpellDescription$ Create a token that's a copy of that card, except it's a Spirit in addition to its other types. Exile it at the beginning of the next end step. +SVar:DBCopy:DB$ CopyPermanent | Defined$ Remembered | AddTypes$ Spirit | AtEOT$ Exile | SubAbility$ DBCleanup | SpellDescription$ Create a token that's a copy of that card, except it's a Spirit in addition to its other types. Exile it at the beginning of the next end step. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True AI:RemoveDeck:All -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True SVar:Picture:http://www.wizards.com/global/images/magic/general/seance.jpg Oracle:At the beginning of each upkeep, you may exile target creature card from your graveyard. If you do, create a token that's a copy of that card, except it's a Spirit in addition to its other types. Exile it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/s/sekkuar_deathkeeper.txt b/forge-gui/res/cardsfolder/s/sekkuar_deathkeeper.txt index 3884e4b85b1..d90a2df2ebb 100644 --- a/forge-gui/res/cardsfolder/s/sekkuar_deathkeeper.txt +++ b/forge-gui/res/cardsfolder/s/sekkuar_deathkeeper.txt @@ -3,6 +3,7 @@ ManaCost:2 B R G Types:Legendary Creature Orc Shaman PT:4/3 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.nonToken+Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever another nontoken creature you control dies, create a 3/1 black and red Graveborn creature token with haste. -SVar:TrigToken:DB$Token | TokenAmount$ 1 | TokenName$ Graveborn | TokenTypes$ Creature,Graveborn | TokenOwner$ You | TokenColors$ Black,Red | TokenPower$ 3 | TokenToughness$ 1 | TokenKeywords$ Haste +SVar:TrigToken:DB$Token | TokenScript$ br_3_1_graveborn +DeckHas:Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/sekkuar_deathkeeper.jpg Oracle:Whenever another nontoken creature you control dies, create a 3/1 black and red Graveborn creature token with haste. diff --git a/forge-gui/res/cardsfolder/s/shallow_grave.txt b/forge-gui/res/cardsfolder/s/shallow_grave.txt index f4e474bbb73..4dc1d0c9d81 100644 --- a/forge-gui/res/cardsfolder/s/shallow_grave.txt +++ b/forge-gui/res/cardsfolder/s/shallow_grave.txt @@ -2,9 +2,8 @@ Name:Shallow Grave ManaCost:1 B Types:Instant A:SP$ ChangeZone | Cost$ 1 B | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature.TopGraveyardCreature+YouCtrl | Hidden$ True | Mandatory$ True | RememberChanged$ True | SubAbility$ DBPump | SpellDescription$ Return the top creature card of your graveyard to the battlefield. That creature gains haste until end of turn. Exile it at the beginning of the next end step. -SVar:DBPump:DB$ Animate | Keywords$ Haste | sVars$ SneakAttackEOT | Defined$ Remembered | AtEOT$ Exile | SubAbility$ DBCleanup +SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Remembered | AtEOT$ Exile | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True SVar:NeedsOrderedGraveyard:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/shallow_grave.jpg Oracle:Return the top creature card of your graveyard to the battlefield. That creature gains haste until end of turn. Exile it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/s/sneak_attack.txt b/forge-gui/res/cardsfolder/s/sneak_attack.txt index 2d77709cda6..9307a79b52e 100644 --- a/forge-gui/res/cardsfolder/s/sneak_attack.txt +++ b/forge-gui/res/cardsfolder/s/sneak_attack.txt @@ -2,9 +2,8 @@ Name:Sneak Attack ManaCost:3 R Types:Enchantment A:AB$ ChangeZone | Cost$ R | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature.YouCtrl | SubAbility$ DBPump | RememberChanged$ True | ForgetOtherRemembered$ True | AILogic$ BeforeCombat | SpellDescription$ You may put a creature card from your hand onto the battlefield. That creature gains haste. Sacrifice the creature at the beginning of the next end step. -SVar:DBPump:DB$ Animate | Keywords$ Haste | sVars$ SneakAttackEOT | Defined$ Remembered | Permanent$ True | AtEOT$ Sacrifice | SubAbility$ DBCleanup +SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Remembered | Permanent$ True | AtEOT$ Sacrifice | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True SVar:NonStackingEffect:True AI:RemoveDeck:Random SVar:PlayMain1:ALWAYS diff --git a/forge-gui/res/cardsfolder/s/sparkspitter.txt b/forge-gui/res/cardsfolder/s/sparkspitter.txt index 51336347241..50b4cdc4626 100644 --- a/forge-gui/res/cardsfolder/s/sparkspitter.txt +++ b/forge-gui/res/cardsfolder/s/sparkspitter.txt @@ -2,8 +2,8 @@ Name:Sparkspitter ManaCost:2 R Types:Creature Elemental Spellshaper PT:1/3 -A:AB$ Token | Cost$ R T Discard<1/Card> | TokenAmount$ 1 | TokenName$ Spark Elemental | TokenTypes$ Creature,Elemental | TokenOwner$ You | TokenColors$ Red | TokenPower$ 3 | TokenToughness$ 1 | TokenKeywords$ Haste<>Trample | AtEOTTrig$ Sacrifice | TokenSVars$ SparkspitterEOT | SpellDescription$ Create a 3/1 red Elemental creature token named Spark Elemental. It has trample, haste, and "At the beginning of the end step, sacrifice Spark Elemental." -SVar:SparkspitterEOT:SVar:EndOfTurnLeavePlay:True +A:AB$ Token | Cost$ R T Discard<1/Card> | TokenScript$ spark_elemental | SpellDescription$ Create a 3/1 red Elemental creature token named Spark Elemental. It has trample, haste, and "At the beginning of the end step, sacrifice Spark Elemental." +DeckHas:Ability$Token AI:RemoveDeck:Random SVar:Picture:http://resources.wizards.com/magic/cards/fut/en-us/card130341.jpg Oracle:{R}, {T}, Discard a card: Create a 3/1 red Elemental creature token named Spark Elemental. It has trample, haste, and "At the beginning of the end step, sacrifice Spark Elemental." diff --git a/forge-gui/res/cardsfolder/s/spinal_embrace.txt b/forge-gui/res/cardsfolder/s/spinal_embrace.txt index be910a07ffb..1b1958058ed 100644 --- a/forge-gui/res/cardsfolder/s/spinal_embrace.txt +++ b/forge-gui/res/cardsfolder/s/spinal_embrace.txt @@ -8,6 +8,6 @@ SVar:TrigSac:DB$ SacrificeAll | Defined$ DelayTriggerRemembered | Controller$ Yo SVar:DBGainLife:DB$ GainLife | LifeAmount$ X | SubAbility$ DBCleanup | References$ X | ConditionDefined$ Remembered | ConditionPresent$ Card SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:RememberedLKI$CardToughness -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True +SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:AtEOT SVar:Picture:http://www.wizards.com/global/images/magic/general/spinal_embrace.jpg Oracle:Cast Spinal Embrace only during combat.\nUntap target creature you don't control and gain control of it. It gains haste until end of turn. At the beginning of the next end step, sacrifice it. If you do, you gain life equal to its toughness. diff --git a/forge-gui/res/cardsfolder/s/splinter_twin.txt b/forge-gui/res/cardsfolder/s/splinter_twin.txt index dcdd920ef7c..8c14bee5aa6 100644 --- a/forge-gui/res/cardsfolder/s/splinter_twin.txt +++ b/forge-gui/res/cardsfolder/s/splinter_twin.txt @@ -4,8 +4,7 @@ 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. +SVar:ABCopy:AB$ CopyPermanent | Cost$ T | Defined$ Self | Keywords$ Haste | AtEOT$ Exile | 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. 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." diff --git a/forge-gui/res/cardsfolder/s/swift_warkite.txt b/forge-gui/res/cardsfolder/s/swift_warkite.txt index 5b5747720e5..28baa19390c 100644 --- a/forge-gui/res/cardsfolder/s/swift_warkite.txt +++ b/forge-gui/res/cardsfolder/s/swift_warkite.txt @@ -5,11 +5,8 @@ PT:4/4 K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may put a creature card with converted mana cost 3 or less from your hand or graveyard onto the battlefield. That creature gains haste. Return it to your hand at the beginning of the next end step. SVar:TrigChange:DB$ChangeZone | Origin$ Hand,Graveyard | Destination$ Battlefield | ChangeType$ Creature.cmcLE3+YouCtrl | SubAbility$ DBPump | RememberChanged$ True | ChangeNum$ 1 -SVar:DBPump:DB$ Animate | Keywords$ Haste | sVars$ SneakAttackEOT | Defined$ Remembered | Permanent$ True | SubAbility$ DelTrig -SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End Of Turn | Execute$ TrigReturn | RememberObjects$ Remembered | TriggerDescription$ CARDNAME - Return the creature to your hand at the beginning of the next end step. | SubAbility$ DBCleanup | AILogic$ Always -SVar:TrigReturn:DB$ ChangeZone | Defined$ DelayTriggerRemembered | Origin$ Battlefield | Destination$ Hand +SVar:DBPump:DB$ Animate | Keywords$ Haste | AtEOT$ Hand | Defined$ Remembered | Permanent$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/swift_warkite.jpg Oracle:Flying\nWhen Swift Warkite enters the battlefield, you may put a creature card with converted mana cost 3 or less from your hand or graveyard onto the battlefield. That creature gains haste. Return it to your hand at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/t/thatcher_revolt.txt b/forge-gui/res/cardsfolder/t/thatcher_revolt.txt index 660af4066cd..3acc534c04d 100644 --- a/forge-gui/res/cardsfolder/t/thatcher_revolt.txt +++ b/forge-gui/res/cardsfolder/t/thatcher_revolt.txt @@ -1,8 +1,7 @@ Name:Thatcher Revolt ManaCost:2 R Types:Sorcery -A:SP$ Token | Cost$ 2 R | TokenAmount$ 3 | TokenName$ Human | TokenTypes$ Creature,Human | TokenOwner$ You | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Haste | TokenSVars$ ThatcherRevoltEOT | AtEOT$ Sacrifice | SpellDescription$ Create three 1/1 red Human creature tokens with haste. Sacrifice those tokens at the beginning of the next end step. -SVar:ThatcherRevoltEOT:SVar:EndOfTurnLeavePlay:True +A:SP$ Token | Cost$ 2 R | TokenAmount$ 3 | TokenName$ Human | TokenTypes$ Creature,Human | TokenOwner$ You | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Haste | AtEOT$ Sacrifice | SpellDescription$ Create three 1/1 red Human creature tokens with haste. Sacrifice those tokens at the beginning of the next end step. SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/thatcher_revolt.jpg Oracle:Create three 1/1 red Human creature tokens with haste. Sacrifice those tokens at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/t/through_the_breach.txt b/forge-gui/res/cardsfolder/t/through_the_breach.txt index c698e9963ba..b402476edff 100644 --- a/forge-gui/res/cardsfolder/t/through_the_breach.txt +++ b/forge-gui/res/cardsfolder/t/through_the_breach.txt @@ -3,9 +3,8 @@ ManaCost:4 R Types:Instant Arcane K:Splice:Arcane:2 R R A:SP$ ChangeZone | Cost$ 4 R | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature.YouCtrl | SubAbility$ DBPump | RememberChanged$ True | ForgetOtherRemembered$ True | AILogic$ BeforeCombat | SpellDescription$ You may put a creature card from your hand onto the battlefield. That creature gains haste. Sacrifice that creature at the beginning of the next end step. -SVar:DBPump:DB$ Animate | Keywords$ Haste | sVars$ ThroughtheBreachEOT | Defined$ Remembered | Permanent$ True | AtEOT$ Sacrifice | SubAbility$ DBCleanup +SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Remembered | Permanent$ True | AtEOT$ Sacrifice | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:ThroughtheBreachEOT:SVar:EndOfTurnLeavePlay:True AI:RemoveDeck:All SVar:PlayMain1:TRUE DeckHints:Type$Arcane diff --git a/forge-gui/res/cardsfolder/t/thunderheads.txt b/forge-gui/res/cardsfolder/t/thunderheads.txt index 3bc286c837e..7cb7038e617 100644 --- a/forge-gui/res/cardsfolder/t/thunderheads.txt +++ b/forge-gui/res/cardsfolder/t/thunderheads.txt @@ -2,8 +2,7 @@ Name:Thunderheads ManaCost:2 U Types:Instant K:Replicate:2 U -A:SP$ Token | Cost$ 2 U | TokenName$ Weird | TokenOwner$ You | TokenPower$ 3 | TokenToughness$ 3 | TokenKeywords$ Defender<>Flying | TokenSVars$ ThunderheadsEOT | AtEOT$ Exile | TokenAmount$ 1 | TokenColors$ Blue | TokenTypes$ Creature,Weird | SpellDescription$ Create a 3/3 blue Weird creature token with defender and flying. Exile it at the beginning of the next end step. -SVar:ThunderheadsEOT:SVar:EndOfTurnLeavePlay:True +A:SP$ Token | Cost$ 2 U | TokenScript$ u_3_3_weird_defender_flying | AtEOT$ Exile | SpellDescription$ Create a 3/3 blue Weird creature token with defender and flying. Exile it at the beginning of the next end step. AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/thunderheads.jpg Oracle:Replicate {2}{U} (When you cast this spell, copy it for each time you paid its replicate cost.)\nCreate a 3/3 blue Weird creature token with defender and flying. Exile it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/t/tidal_wave.txt b/forge-gui/res/cardsfolder/t/tidal_wave.txt index b4f43db6670..71eeeb28537 100644 --- a/forge-gui/res/cardsfolder/t/tidal_wave.txt +++ b/forge-gui/res/cardsfolder/t/tidal_wave.txt @@ -1,8 +1,7 @@ Name:Tidal Wave ManaCost:2 U Types:Instant -A:SP$ Token | Cost$ 2 U | TokenAmount$ 1 | TokenName$ Wall | TokenTypes$ Creature,Wall | TokenOwner$ You | TokenColors$ Blue | TokenPower$ 5 | TokenToughness$ 5 | TokenKeywords$ Defender | TokenSVars$ TidalWaveEOT | AtEOT$ Sacrifice | SpellDescription$ Create a 5/5 blue Wall creature token with defender. Sacrifice it at the beginning of the next end step. -SVar:TidalWaveEOT:SVar:EndOfTurnLeavePlay:True +A:SP$ Token | Cost$ 2 U | TokenScript$ u_5_5_wall_defender | AtEOT$ Sacrifice | SpellDescription$ Create a 5/5 blue Wall creature token with defender. Sacrifice it at the beginning of the next end step. AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/tidal_wave.jpg Oracle:Create a 5/5 blue Wall creature token with defender. Sacrifice it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/t/treacherous_urge.txt b/forge-gui/res/cardsfolder/t/treacherous_urge.txt index 91818b58d96..f9162d93713 100644 --- a/forge-gui/res/cardsfolder/t/treacherous_urge.txt +++ b/forge-gui/res/cardsfolder/t/treacherous_urge.txt @@ -2,8 +2,7 @@ Name:Treacherous Urge ManaCost:4 B Types:Instant A:SP$ ChangeZone | Cost$ 4 B | Origin$ Hand | Destination$ Battlefield | ValidTgts$ Opponent | ChangeType$ Creature | GainControl$ True | SubAbility$ DBPump | RememberChanged$ True | IsCurse$ True | SpellDescription$ Target opponent reveals their hand. You may put a creature card from it onto the battlefield under your control. That creature gains haste. Sacrifice it at the beginning of the next end step. -SVar:DBPump:DB$ Animate | Keywords$ Haste | sVars$ SneakAttackEOT | Defined$ Remembered | Permanent$ True | AtEOT$ Sacrifice | SubAbility$ DBCleanup +SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Remembered | Permanent$ True | AtEOT$ Sacrifice | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True SVar:Picture:http://www.wizards.com/global/images/magic/general/treacherous_urge.jpg Oracle:Target opponent reveals their hand. You may put a creature card from it onto the battlefield under your control. That creature gains haste. Sacrifice it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/t/twinflame.txt b/forge-gui/res/cardsfolder/t/twinflame.txt index fdc16a42147..1b5e67bdf5d 100644 --- a/forge-gui/res/cardsfolder/t/twinflame.txt +++ b/forge-gui/res/cardsfolder/t/twinflame.txt @@ -2,8 +2,7 @@ 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 | 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. 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. diff --git a/forge-gui/res/cardsfolder/v/valduk_keeper_of_the_flame.txt b/forge-gui/res/cardsfolder/v/valduk_keeper_of_the_flame.txt index a6076bec926..103d3548083 100644 --- a/forge-gui/res/cardsfolder/v/valduk_keeper_of_the_flame.txt +++ b/forge-gui/res/cardsfolder/v/valduk_keeper_of_the_flame.txt @@ -3,8 +3,7 @@ ManaCost:2 R Types:Legendary Creature Human Shaman PT:3/2 T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of combat on your turn, for each Aura and Equipment attached to CARDNAME, create a 3/1 red Elemental creature token with trample and haste. Exile those tokens at the beginning of the next end step. -SVar:TrigToken:DB$ Token | TokenAmount$ X | References$ X | TokenName$ Elemental | TokenTypes$ Creature,Elemental | TokenOwner$ You | TokenColors$ Red | TokenPower$ 3 | TokenToughness$ 1 | TokenImage$ r 3 1 elemental dom | TokenKeywords$ Trample<>Haste | TokenSVars$ AkoumEOT | AtEOT$ Exile -SVar:AkoumEOT:SVar:EndOfTurnLeavePlay:True +SVar:TrigToken:DB$ Token | TokenAmount$ X | References$ X | TokenScript$ r_3_1_elemental_trample_haste | AtEOT$ Exile SVar:X:Count$Valid Equipment.Attached,Aura.Attached SVar:EnchantMe:Multiple SVar:EquipMe:Multiple diff --git a/forge-gui/res/cardsfolder/w/waylay.txt b/forge-gui/res/cardsfolder/w/waylay.txt index a59dc77965b..74b21070a36 100644 --- a/forge-gui/res/cardsfolder/w/waylay.txt +++ b/forge-gui/res/cardsfolder/w/waylay.txt @@ -1,8 +1,8 @@ Name:Waylay ManaCost:2 W Types:Instant -A:SP$ Token | Cost$ 2 W | TokenAmount$ 3 | TokenName$ Knight | TokenTypes$ Creature,Knight | TokenOwner$ You | TokenColors$ White | TokenPower$ 2 | TokenToughness$ 2 | TokenSVars$ WaylayEOT | AtEOT$ Exile | SpellDescription$ Create three 2/2 white Knight creature tokens. Exile them at the beginning of the next cleanup step. -SVar:WaylayEOT:SVar:EndOfTurnLeavePlay:True +A:SP$ Token | Cost$ 2 W | TokenAmount$ 3 | TokenScript$ w_2_2_knight | AtEOT$ Exile | SpellDescription$ Create three 2/2 white Knight creature tokens. Exile them at the beginning of the next cleanup step. +DeckHas:Ability$Token AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/waylay.jpg Oracle:Create three 2/2 white Knight creature tokens. Exile them at the beginning of the next cleanup step. diff --git a/forge-gui/res/cardsfolder/z/zektar_shrine_expedition.txt b/forge-gui/res/cardsfolder/z/zektar_shrine_expedition.txt index 63c2f4eb0b9..a5af3b70d86 100644 --- a/forge-gui/res/cardsfolder/z/zektar_shrine_expedition.txt +++ b/forge-gui/res/cardsfolder/z/zektar_shrine_expedition.txt @@ -1,8 +1,7 @@ Name:Zektar Shrine Expedition ManaCost:1 R Types:Enchantment -A:AB$ Token | Cost$ SubCounter<3/QUEST> Sac<1/CARDNAME> | TokenAmount$ 1 | TokenImage$ r 7 1 elemental | TokenName$ Elemental | TokenColors$ Red | TokenTypes$ Creature,Elemental | TokenPower$ 7 | TokenToughness$ 1 | TokenKeywords$ Haste<>Trample | TokenSVars$ ZektarEOT | AtEOT$ Exile | TokenOwner$ You | TokenAmount$ 1 | SpellDescription$ Create a 7/1 red Elemental creature token with trample and haste. Exile it at the beginning of the next end step. -SVar:ZektarEOT:SVar:EndOfTurnLeavePlay:True +A:AB$ Token | Cost$ SubCounter<3/QUEST> Sac<1/CARDNAME> | TokenScript$ r_7_1_elemental_trample_haste | AtEOT$ Exile | SpellDescription$ Create a 7/1 red Elemental creature token with trample and haste. Exile it at the beginning of the next end step. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Landfall — Whenever a land enters the battlefield under your control, you may put a quest counter on CARDNAME. SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ QUEST | CounterNum$ 1 SVar:MaxQuestEffect:3 diff --git a/forge-gui/res/tokenscripts/br_3_1_graveborn.txt b/forge-gui/res/tokenscripts/br_3_1_graveborn.txt new file mode 100644 index 00000000000..586d0137a15 --- /dev/null +++ b/forge-gui/res/tokenscripts/br_3_1_graveborn.txt @@ -0,0 +1,9 @@ +Name:Graveborn +ManaCost:no cost +Types:Creature Graveborn +Colors:black,red +PT:3/1 +K:Haste +Oracle:Haste + + diff --git a/forge-gui/res/tokenscripts/hornet.txt b/forge-gui/res/tokenscripts/hornet.txt new file mode 100644 index 00000000000..deb8b87414e --- /dev/null +++ b/forge-gui/res/tokenscripts/hornet.txt @@ -0,0 +1,8 @@ +Name:Hornet +ManaCost:no cost +Types:Artifact Creature Insect +Colors:colorless +PT:1/1 +K:Flying +K:Haste +Oracle:Flying, Haste diff --git a/forge-gui/res/tokenscripts/lightning_rager.txt b/forge-gui/res/tokenscripts/lightning_rager.txt new file mode 100644 index 00000000000..fe3c8d5fbef --- /dev/null +++ b/forge-gui/res/tokenscripts/lightning_rager.txt @@ -0,0 +1,11 @@ +Name:Lightning Rager +ManaCost:no cost +Types:Creature Elemental +Colors:red +PT:5/1 +K;Trample +K:Haste +T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ At the beginning of the end step, sacrifice CARDNAME. +SVar:TrigSac:DB$ Sacrifice | SacValid$ Self +SVar:EndOfTurnLeavePlay:True +Oracle:Trample, Haste\nAt the beginning of the end step, sacrifice Lightning Rager. diff --git a/forge-gui/res/tokenscripts/r_1_1_elemental_cat_haste.txt b/forge-gui/res/tokenscripts/r_1_1_elemental_cat_haste.txt new file mode 100644 index 00000000000..4f698519083 --- /dev/null +++ b/forge-gui/res/tokenscripts/r_1_1_elemental_cat_haste.txt @@ -0,0 +1,7 @@ +Name:Elemental Cat +ManaCost:no cost +Types:Creature Elemental Cat +Colors:red +PT:1/1 +K:Haste +Oracle:Haste diff --git a/forge-gui/res/tokenscripts/r_1_1_elemental_haste.txt b/forge-gui/res/tokenscripts/r_1_1_elemental_haste.txt new file mode 100644 index 00000000000..f7364348803 --- /dev/null +++ b/forge-gui/res/tokenscripts/r_1_1_elemental_haste.txt @@ -0,0 +1,7 @@ +Name:Elemental +ManaCost:no cost +Types:Creature Elemental +Colors:red +PT:1/1 +K:Haste +Oracle:Haste diff --git a/forge-gui/res/tokenscripts/r_2_1_goblin_haste.txt b/forge-gui/res/tokenscripts/r_2_1_goblin_haste.txt new file mode 100644 index 00000000000..22e94d31672 --- /dev/null +++ b/forge-gui/res/tokenscripts/r_2_1_goblin_haste.txt @@ -0,0 +1,7 @@ +Name:Goblin +ManaCost:no cost +Types:Creature Goblin +Colors:red +PT:2/1 +K:Haste +Oracle:Haste diff --git a/forge-gui/res/tokenscripts/r_3_1_elemental_haste.txt b/forge-gui/res/tokenscripts/r_3_1_elemental_haste.txt new file mode 100644 index 00000000000..9234b219ab4 --- /dev/null +++ b/forge-gui/res/tokenscripts/r_3_1_elemental_haste.txt @@ -0,0 +1,7 @@ +Name:Elemental +ManaCost:no cost +Types:Creature Elemental +Colors:red +PT:3/1 +K:Haste +Oracle:Haste diff --git a/forge-gui/res/tokenscripts/r_3_1_elemental_trample_haste.txt b/forge-gui/res/tokenscripts/r_3_1_elemental_trample_haste.txt new file mode 100644 index 00000000000..a263c1dc413 --- /dev/null +++ b/forge-gui/res/tokenscripts/r_3_1_elemental_trample_haste.txt @@ -0,0 +1,8 @@ +Name:Elemental +ManaCost:no cost +Types:Creature Elemental +Colors:red +PT:3/1 +K;Trample +K:Haste +Oracle:Trample, Haste diff --git a/forge-gui/res/tokenscripts/r_7_1_elemental_trample_haste.txt b/forge-gui/res/tokenscripts/r_7_1_elemental_trample_haste.txt new file mode 100644 index 00000000000..b0203b0b2e5 --- /dev/null +++ b/forge-gui/res/tokenscripts/r_7_1_elemental_trample_haste.txt @@ -0,0 +1,8 @@ +Name:Elemental +ManaCost:no cost +Types:Creature Elemental +Colors:red +PT:7/1 +K;Trample +K:Haste +Oracle:Trample, Haste diff --git a/forge-gui/res/tokenscripts/ragavan.txt b/forge-gui/res/tokenscripts/ragavan.txt new file mode 100644 index 00000000000..473869f09c3 --- /dev/null +++ b/forge-gui/res/tokenscripts/ragavan.txt @@ -0,0 +1,11 @@ +Name:Hornet +ManaCost:no cost +Types:Artifact Creature Insect +Colors:colorless +PT:1/1 +K:Flying +K:Haste +Oracle:Flying, Haste + + +| TokenName$ Hornet | TokenTypes$ Artifact,Creature,Insect | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying<>Haste diff --git a/forge-gui/res/tokenscripts/rg_4_4_giant_warrior_haste.txt b/forge-gui/res/tokenscripts/rg_4_4_giant_warrior_haste.txt new file mode 100644 index 00000000000..1784657ead3 --- /dev/null +++ b/forge-gui/res/tokenscripts/rg_4_4_giant_warrior_haste.txt @@ -0,0 +1,7 @@ +Name:Giant Warrior +ManaCost:no cost +Types:Creature Giant Warrior +Colors:red,green +PT:4/4 +K:Haste +Oracle:Haste diff --git a/forge-gui/res/tokenscripts/spark_elemental.txt b/forge-gui/res/tokenscripts/spark_elemental.txt new file mode 100644 index 00000000000..1bd9251ecc1 --- /dev/null +++ b/forge-gui/res/tokenscripts/spark_elemental.txt @@ -0,0 +1,11 @@ +Name:Spark Elemental +ManaCost:no cost +Types:Creature Elemental +Colors:red +PT:3/1 +K:Trample +K:Haste +T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ At the beginning of the end step, sacrifice CARDNAME. +SVar:TrigSac:DB$ Sacrifice | SacValid$ Self +SVar:EndOfTurnLeavePlay:True +Oracle:Trample, haste\nAt the beginning of the end step, sacrifice Spark Elemental. diff --git a/forge-gui/res/tokenscripts/u_3_3_weird_defender_flying.txt b/forge-gui/res/tokenscripts/u_3_3_weird_defender_flying.txt new file mode 100644 index 00000000000..ceb684b011f --- /dev/null +++ b/forge-gui/res/tokenscripts/u_3_3_weird_defender_flying.txt @@ -0,0 +1,8 @@ +Name:Weird +ManaCost:no cost +Types:Creature Weird +Colors:blue +PT:3/3 +K:Defender +K:Flying +Oracle:Defender, Flying diff --git a/forge-gui/res/tokenscripts/u_5_5_wall_defender.txt b/forge-gui/res/tokenscripts/u_5_5_wall_defender.txt new file mode 100644 index 00000000000..e76e401c5bc --- /dev/null +++ b/forge-gui/res/tokenscripts/u_5_5_wall_defender.txt @@ -0,0 +1,7 @@ +Name:Wall +ManaCost:no cost +Types:Creature Wall +Colors:blue +PT:5/5 +K:Defender +Oracle:Defender diff --git a/forge-gui/res/tokenscripts/w_2_2_knight.txt b/forge-gui/res/tokenscripts/w_2_2_knight.txt new file mode 100644 index 00000000000..44a1080da69 --- /dev/null +++ b/forge-gui/res/tokenscripts/w_2_2_knight.txt @@ -0,0 +1,6 @@ +Name:Knight +ManaCost:no cost +Types:Creature Knight +Colors:white +PT:2/2 +Oracle: diff --git a/forge-gui/res/tokenscripts/w_4_4_angel_flying.txt b/forge-gui/res/tokenscripts/w_4_4_angel_flying.txt new file mode 100644 index 00000000000..61a43654b3e --- /dev/null +++ b/forge-gui/res/tokenscripts/w_4_4_angel_flying.txt @@ -0,0 +1,7 @@ +Name:Angel +ManaCost:no cost +Types:Creature Angel +Colors:white +PT:4/4 +K:Flying +Oracle:Flying From 61aa144631bee29b4355b4416875caa138a9e954 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Thu, 3 Jan 2019 21:33:15 +0100 Subject: [PATCH 550/901] fixes for game sim --- forge-game/src/main/java/forge/game/card/Card.java | 9 +++++++++ .../test/java/forge/ai/simulation/GameSimulatorTest.java | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index f200b4a930d..0edec8851d4 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -4806,6 +4806,15 @@ public class Card extends GameEntity implements Comparable { // Note: This should only be called after state has been set to CardStateName.FaceDown, // so the below call should be valid since the state should have been created already. getState(CardStateName.FaceDown).setImageKey(ImageKeys.getTokenKey(image)); + if (!manifested) { + // remove Manifest Up abilities from Original State + CardState original = getState(CardStateName.Original); + for (SpellAbility sa : original.getNonManaAbilities()) { + if (sa.isManifestUp()) { + original.removeSpellAbility(sa); + } + } + } } public final void animateBestow() { 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 afe72a09fc3..01c455a35ea 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 @@ -184,7 +184,7 @@ public class GameSimulatorTest extends SimulationTestCase { GameSimulator sim = createSimulator(game, p); Game simGame = sim.getSimulatedGameState(); - SpellAbility unmorphSA = findSAWithPrefix(ripper, "Morph—Reveal a black card"); + SpellAbility unmorphSA = findSAWithPrefix(ripper, "Morph — Reveal a black card"); assertNotNull(unmorphSA); sim.simulateSpellAbility(unmorphSA); assertEquals(18, simGame.getPlayers().get(0).getLife()); From bbd48d1033f868177aa782ff8382b60bfb66a101 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Fri, 4 Jan 2019 19:38:37 +0000 Subject: [PATCH 551/901] Adapt changes for Biomancer's Familiar --- .../ability/effects/CountersPutEffect.java | 15 ++++ .../src/main/java/forge/game/card/Card.java | 6 +- .../java/forge/game/card/CardFactoryUtil.java | 3 +- .../java/forge/game/trigger/TriggerAdapt.java | 75 +++++++++++++++++++ .../forge/game/trigger/TriggerEvolved.java | 15 ++-- .../java/forge/game/trigger/TriggerType.java | 1 + .../upcoming/biomancers_familiar.txt | 7 ++ 7 files changed, 109 insertions(+), 13 deletions(-) create mode 100644 forge-game/src/main/java/forge/game/trigger/TriggerAdapt.java create mode 100644 forge-gui/res/cardsfolder/upcoming/biomancers_familiar.txt diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java index 61eb5e73201..164dd0542fa 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java @@ -199,6 +199,14 @@ public class CountersPutEffect extends SpellAbilityEffect { counterAmount = pc.chooseNumber(sa, "How many counters?", 0, counterAmount, params); } + // Adapt need extra logic + if (sa.hasParam("Adapt")) { + if (!(tgtCard.getCounters(CounterType.P1P1) == 0 + || tgtCard.hasKeyword("CARDNAME adapts as though it had no +1/+1 counters"))) { + continue; + } + } + if (sa.hasParam("Tribute")) { // make a copy to check if it would be on the battlefield Card noTributeLKI = CardUtil.getLKICopy(tgtCard); @@ -266,6 +274,13 @@ public class CountersPutEffect extends SpellAbilityEffect { runParams.put("Card", tgtCard); game.getTriggerHandler().runTrigger(TriggerType.BecomeRenowned, runParams, false); } + if (sa.hasParam("Adapt")) { + // need to remove special keyword + tgtCard.removeHiddenExtrinsicKeyword("CARDNAME adapts as though it had no +1/+1 counters"); + final Map runParams = Maps.newHashMap(); + runParams.put("Card", tgtCard); + game.getTriggerHandler().runTrigger(TriggerType.Adapt, runParams, false); + } } else { // adding counters to something like re-suspend cards // etbcounter should apply multiplier diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 0edec8851d4..0527766fcbe 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -3637,10 +3637,8 @@ public class Card extends GameEntity implements Comparable { if (s.startsWith("HIDDEN")) { removeHiddenExtrinsicKeyword(s); } - else { - if (extrinsicKeyword.remove(s)) { - currentState.getView().updateKeywords(this, currentState); - } + else if (extrinsicKeyword.remove(s)) { + currentState.getView().updateKeywords(this, currentState); } } diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index f467b6658ca..040c8f87e37 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -3706,8 +3706,7 @@ public class CardFactoryUtil { String desc = "Adapt " + magnitude; - String effect = "AB$ PutCounter | Cost$ " + manacost + " | ConditionPresent$ " - + "Card.Self+counters_EQ0_P1P1 | Adapt$ True | CounterNum$ " + magnitude + String effect = "AB$ PutCounter | Cost$ " + manacost + " | Adapt$ True | CounterNum$ " + magnitude + " | CounterType$ P1P1 | StackDescription$ SpellDescription"; effect += "| SpellDescription$ " + desc + " (" + inst.getReminderText() + ")"; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAdapt.java b/forge-game/src/main/java/forge/game/trigger/TriggerAdapt.java new file mode 100644 index 00000000000..5a603b715c8 --- /dev/null +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAdapt.java @@ -0,0 +1,75 @@ +/* + * Forge: Play Magic: the Gathering. + * Copyright (C) 2011 Forge Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package forge.game.trigger; + +import java.util.Map; + +import forge.game.card.Card; +import forge.game.spellability.SpellAbility; + +/** + *

+ * Trigger_Evolved class. + *

+ * + * @author Forge + */ +public class TriggerAdapt extends Trigger { + + /** + *

+ * Constructor for Trigger_Evolved. + *

+ * + * @param params + * a {@link java.util.HashMap} object. + * @param host + * a {@link forge.game.card.Card} object. + * @param intrinsic + * the intrinsic + */ + public TriggerAdapt(final Map params, final Card host, final boolean intrinsic) { + super(params, host, intrinsic); + } + + /** {@inheritDoc} */ + @Override + public final boolean performTest(final Map runParams2) { + final Card sac = (Card) runParams2.get("Card"); + if (hasParam("ValidCard")) { + if (!sac.isValid(getParam("ValidCard").split(","), getHostCard().getController(), + getHostCard(), null)) { + return false; + } + } + return true; + } + + /** {@inheritDoc} */ + @Override + public final void setTriggeringObjects(final SpellAbility sa) { + sa.setTriggeringObject("Card", getRunParams().get("Card")); + } + + @Override + public String getImportantStackObjects(SpellAbility sa) { + StringBuilder sb = new StringBuilder(); + sb.append("Adapt: ").append(sa.getTriggeringObject("Card")); + return sb.toString(); + } +} diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerEvolved.java b/forge-game/src/main/java/forge/game/trigger/TriggerEvolved.java index ca15b7cf4ff..a85c4479cb3 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerEvolved.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerEvolved.java @@ -17,6 +17,8 @@ */ package forge.game.trigger; +import java.util.Map; + import forge.game.card.Card; import forge.game.spellability.SpellAbility; @@ -26,7 +28,6 @@ import forge.game.spellability.SpellAbility; *

* * @author Forge - * @version $Id: TriggerEvolved.java 17802 2012-10-31 08:05:14Z Max mtg $ */ public class TriggerEvolved extends Trigger { @@ -42,17 +43,17 @@ public class TriggerEvolved extends Trigger { * @param intrinsic * the intrinsic */ - public TriggerEvolved(final java.util.Map params, final Card host, final boolean intrinsic) { + public TriggerEvolved(final Map params, final Card host, final boolean intrinsic) { super(params, host, intrinsic); } /** {@inheritDoc} */ @Override - public final boolean performTest(final java.util.Map runParams2) { + public final boolean performTest(final Map runParams2) { final Card sac = (Card) runParams2.get("Card"); - if (this.mapParams.containsKey("ValidCard")) { - if (!sac.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard(), null)) { + if (hasParam("ValidCard")) { + if (!sac.isValid(getParam("ValidCard").split(","), getHostCard().getController(), + getHostCard(), null)) { return false; } } @@ -62,7 +63,7 @@ public class TriggerEvolved extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject("Card", this.getRunParams().get("Card")); + sa.setTriggeringObject("Card", getRunParams().get("Card")); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerType.java b/forge-game/src/main/java/forge/game/trigger/TriggerType.java index 3dc4cbf9052..53ccf1c3df3 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerType.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerType.java @@ -14,6 +14,7 @@ import java.util.Map; public enum TriggerType { Abandoned(TriggerAbandoned.class), AbilityCast(TriggerSpellAbilityCast.class), + Adapt(TriggerAdapt.class), Always(TriggerAlways.class), Attached(TriggerAttached.class), AttackerBlocked(TriggerAttackerBlocked.class), diff --git a/forge-gui/res/cardsfolder/upcoming/biomancers_familiar.txt b/forge-gui/res/cardsfolder/upcoming/biomancers_familiar.txt new file mode 100644 index 00000000000..30008a2e68c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/biomancers_familiar.txt @@ -0,0 +1,7 @@ +Name:Biomancer's Familiar +ManaCost:G U +Types:Creature Mutant +PT:2/2 +S:Mode$ ReduceCost | ValidCard$ Creature.YouCtrl | Type$ Ability | Amount$ 2 | MinMana$ 1 | AffectedZone$ Battlefield | Description$ Activated abilities of creatures you control cost {2} less to activate. This effect can't reduce the amount of mana an ability costs to activate to less than one mana. +A:AB$ Pump | Cost$ T | ValidTgts$ Creature | KW$ HIDDEN CARDNAME adapts as though it had no +1/+1 counters | TgtPrompt$ Select target creature. | StackDescription$ SpellDescription | SpellDescription$ The next time target creature adapts this turn, it adapts as though it had no +1/+1 counters. +Oracle:Activated abilities of creatures you control cost 2 less to activate. This effect can't reduce the amount of mana an ability costs to activate to less than one mana.\n{T}: The next time target creature adapts this turn, it adapts as though it had no +1/+1 counters. From 55da7435f8860ba13b83c736ce384f75af1cf37a Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Sat, 5 Jan 2019 12:01:30 +0000 Subject: [PATCH 552/901] CharmEffect: now allows zero choices --- .../forge/game/ability/effects/CharmEffect.java | 6 +++++- .../src/main/java/forge/game/trigger/Trigger.java | 13 +++++++++---- forge-gui/res/cardsfolder/upcoming/ravager_wurm.txt | 10 ++++++++++ 3 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/ravager_wurm.txt diff --git a/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java index 3652fa9ee08..88098689550 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java @@ -67,6 +67,8 @@ public class CharmEffect extends SpellAbilityEffect { if (num == min) { sb.append(Lang.getNumeral(num)); + } else if (min == 0) { + sb.append("up to ").append(Lang.getNumeral(num)); } else { sb.append(Lang.getNumeral(min)).append(" or ").append(list.size() == 2 ? "both" : "more"); } @@ -101,6 +103,8 @@ public class CharmEffect extends SpellAbilityEffect { if (num == min) { sb.append(Lang.getNumeral(num)); + } else if (min == 0) { + sb.append("up to ").append(Lang.getNumeral(num)); } else { sb.append(Lang.getNumeral(min)).append(" or ").append(list.size() == 2 ? "both" : "more"); } @@ -158,7 +162,7 @@ public class CharmEffect extends SpellAbilityEffect { final int num = sa.hasParam("CharmNumOnResolve") ? AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("CharmNumOnResolve"), sa) - : Integer.parseInt(sa.hasParam("CharmNum") ? sa.getParam("CharmNum") : "1"); + : Integer.parseInt(sa.getParamOrDefault("CharmNum", "1")); final int min = sa.hasParam("MinCharmNum") ? Integer.parseInt(sa.getParam("MinCharmNum")) : num; Card source = sa.getHostCard(); diff --git a/forge-game/src/main/java/forge/game/trigger/Trigger.java b/forge-game/src/main/java/forge/game/trigger/Trigger.java index fd97b6d6f9f..e901efcb665 100644 --- a/forge-game/src/main/java/forge/game/trigger/Trigger.java +++ b/forge-game/src/main/java/forge/game/trigger/Trigger.java @@ -206,15 +206,20 @@ public abstract class Trigger extends TriggerReplacementBase { } else { saDesc = sa.getDescription(); } + // string might have leading whitespace + saDesc = saDesc.trim(); if (!saDesc.isEmpty()) { - // string might have leading whitespace - saDesc = saDesc.trim(); - saDesc = saDesc.substring(0, 1).toLowerCase() + saDesc.substring(1); + // in case sa starts with CARDNAME, dont lowercase it + if (!saDesc.startsWith(sa.getHostCard().getName())) { + saDesc = saDesc.substring(0, 1).toLowerCase() + saDesc.substring(1); + } if (saDesc.contains("ORIGINALHOST") && sa.getOriginalHost() != null) { saDesc = TextUtil.fastReplace(saDesc, "ORIGINALHOST", sa.getOriginalHost().getName()); } - result = TextUtil.fastReplace(result, "ABILITY", saDesc); + } else { + saDesc = ""; // printed in case nothing is chosen for the ability (e.g. Charm with Up to X) } + result = TextUtil.fastReplace(result, "ABILITY", saDesc); } return result; diff --git a/forge-gui/res/cardsfolder/upcoming/ravager_wurm.txt b/forge-gui/res/cardsfolder/upcoming/ravager_wurm.txt new file mode 100644 index 00000000000..ab0c81cd716 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ravager_wurm.txt @@ -0,0 +1,10 @@ +Name:Ravager Wurm +ManaCost:3 R G G +Types:Creature Wurm +PT:4/5 +K:Riot +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigCharm | TriggerDescription$ When CARDNAME enters the battlefield, ABILITY +SVar:TrigCharm:DB$ Charm | MinCharmNum$ 0 | CharmNum$ 1 | Choices$ DBFight,DBDestroy +SVar:DBFight:DB$ Fight | Defined$ TriggeredCardLKICopy | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Choose target creature you don't control | SpellDescription$ CARDNAME fights target creature you don't control. +SVar:DBDestroy:DB$ Destroy | ValidTgts$ Land.hasNonManaActivatedAbility | TgtPrompt$ Select target land with an activated ability that isn't a mana ability | SpellDescription$ Destroy target land with an activated ability that iasn't a mana ability. +Oracle:Riot (This creature enters the battlefield with your choice of a +1/+1 counter or haste.)\nWhen Ravager Wurm enters the battlefield, choose up to one -\n- Ravager Wurm fights target creature you don't control.\n- Destroy target land with an activated ability that isn't a mana ability. From 891f61701c9f55918cccbe6444f7caee154d0872 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 5 Jan 2019 20:52:40 +0100 Subject: [PATCH 553/901] Taps Trigger now flag for being used as Attacker --- .../src/main/java/forge/game/card/Card.java | 4 ++++ .../java/forge/game/phase/PhaseHandler.java | 2 +- .../java/forge/game/trigger/TriggerTaps.java | 22 ++++++++++++++----- .../java/forge/game/trigger/TriggerType.java | 1 - .../cardsfolder/upcoming/verity_circle.txt | 7 ++++++ 5 files changed, 28 insertions(+), 8 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/verity_circle.txt diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 0527766fcbe..c7c5a495107 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -3226,11 +3226,15 @@ public class Card extends GameEntity implements Comparable { } public final void tap() { + tap(false); + } + public final void tap(boolean attacker) { if (tapped) { return; } // Run triggers final Map runParams = Maps.newTreeMap(); runParams.put("Card", this); + runParams.put("Attacker", attacker); getGame().getTriggerHandler().runTrigger(TriggerType.Taps, runParams, false); setTapped(true); diff --git a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java index 13995f9f4eb..4a113d7fa59 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java @@ -526,7 +526,7 @@ public class PhaseHandler implements java.io.Serializable { if (canAttack) { if (shouldTapForAttack) { - attacker.tap(); + attacker.tap(true); } } else { combat.removeFromCombat(attacker); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java b/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java index b1bff87bae1..44185a79ef7 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java @@ -28,7 +28,6 @@ import java.util.Map; *

* * @author Forge - * @version $Id$ */ public class TriggerTaps extends Trigger { @@ -50,15 +49,26 @@ public class TriggerTaps extends Trigger { /** {@inheritDoc} */ @Override - public final boolean performTest(final java.util.Map runParams2) { + public final boolean performTest(final Map runParams2) { final Card tapper = (Card) runParams2.get("Card"); - if (this.mapParams.containsKey("ValidCard")) { - if (!tapper.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard(), null)) { + if (hasParam("ValidCard")) { + if (!tapper.isValid(getParam("ValidCard").split(","), getHostCard().getController(), + getHostCard(), null)) { return false; } } + if (hasParam("Attacker")) { + if ("True".equalsIgnoreCase(getParam("Attacker"))) { + if (!(Boolean)runParams2.get("Attacker")) { + return false; + } + } else if ("False".equalsIgnoreCase(getParam("Attacker"))) { + if ((Boolean)runParams2.get("Attacker")) { + return false; + } + } + } return true; } @@ -67,7 +77,7 @@ public class TriggerTaps extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject("Card", this.getRunParams().get("Card")); + sa.setTriggeringObject("Card", getRunParams().get("Card")); } @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerType.java b/forge-game/src/main/java/forge/game/trigger/TriggerType.java index 53ccf1c3df3..0dfb2d1e3b5 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerType.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerType.java @@ -80,7 +80,6 @@ public enum TriggerType { SpellAbilityCast(TriggerSpellAbilityCast.class), SpellCast(TriggerSpellAbilityCast.class), Surveil(TriggerSurveil.class), - Tapped(TriggerTaps.class), Taps(TriggerTaps.class), TapsForMana(TriggerTapsForMana.class), Transformed(TriggerTransformed.class), diff --git a/forge-gui/res/cardsfolder/upcoming/verity_circle.txt b/forge-gui/res/cardsfolder/upcoming/verity_circle.txt new file mode 100644 index 00000000000..e7e0786babc --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/verity_circle.txt @@ -0,0 +1,7 @@ +Name:Verity Circle +ManaCost:2 U +Types:Enchantment +T:Mode$ Taps | ValidCard$ Creature.OppCtrl | Attacker$ False | OptionalDecider$ You | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever a creature an opponent controls becomes tapped, if it isn't being declared as an attacker, you may draw a card. +SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 +A:AB$ Tap | Cost$ 4 U | ValidTgts$ Creature.withoutFlying | TgtPrompt$ Select target creature without flying | SpellDescription$ Tap target creature without flying. +Oracle:Whenever a creature an opponent controls becomes tapped, if it isn't being declared as an attacker, you may draw a card.\n{4}{U}: Tap target creature without flying. From d0b569a07fa5b93d39ad7f74ca2d5bb20d4ceb4a Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sun, 6 Jan 2019 11:33:27 +0100 Subject: [PATCH 554/901] Teysa Karlov: add Dieharmonicon to TriggerHandler --- .../forge/game/trigger/TriggerHandler.java | 20 +++++++++++++++++-- .../res/cardsfolder/upcoming/teysa_karlov.txt | 7 +++++++ 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/teysa_karlov.txt diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java index d3d810bfefe..e08015d31df 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -693,7 +693,8 @@ public class TriggerHandler { } private int handlePanharmonicon(final Trigger t, final Map runParams) { - final Card host = t.getHostCard(); + // Need to get the last info from the trigger host + final Card host = game.getChangeZoneLKIInfo(t.getHostCard()); final Player p = host.getController(); // not a changesZone trigger @@ -709,9 +710,10 @@ public class TriggerHandler { int n = 0; for (final String kw : p.getKeywords()) { if (kw.startsWith("Panharmonicon")) { + // Enter the Battlefield Trigger if (runParams.get("Destination") instanceof String) { final String dest = (String) runParams.get("Destination"); - if (dest.equals("Battlefield") && runParams.get("Card") instanceof Card) { + if ("Battlefield".equals(dest) && runParams.get("Card") instanceof Card) { final Card card = (Card) runParams.get("Card"); final String valid = kw.split(":")[1]; if (card.isValid(valid.split(","), p, host, null)) { @@ -719,6 +721,20 @@ public class TriggerHandler { } } } + } else if (kw.startsWith("Dieharmonicon")) { + // 700.4. The term dies means “is put into a graveyard from the battlefield.” + if (runParams.get("Origin") instanceof String) { + final String origin = (String) runParams.get("Origin"); + if ("Battlefield".equals(origin) && runParams.get("Destination") instanceof String) { + final String dest = (String) runParams.get("Destination"); + if ("Graveyard".equals(dest) && runParams.get("Card") instanceof Card) { + final Card card = (Card) runParams.get("Card"); + if (card.isCreature()) { + n++; + } + } + } + } } } diff --git a/forge-gui/res/cardsfolder/upcoming/teysa_karlov.txt b/forge-gui/res/cardsfolder/upcoming/teysa_karlov.txt new file mode 100644 index 00000000000..081b84cd822 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/teysa_karlov.txt @@ -0,0 +1,7 @@ +Name:Teysa Karlov +ManaCost:2 W B +Types:Legendary Creature Human Advisor +PT:2/4 +S:Mode$ Continuous | Affected$ You | AddKeyword$ Dieharmonicon | Description$ If a creature dying causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time. +S:Mode$ Continuous | Affected$ Creature.token+YouCtrl | AddKeyword$ Vigilance & Lifelink | Description$ Creature tokens you control have vigilance and lifelink. +Oracle:If a creature dying causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time.\nCreature tokens you control have vigilance and lifelink. From 234304f9ec5c109728c74bc0f34f6e2e59c1691c Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Sun, 6 Jan 2019 10:47:20 -0500 Subject: [PATCH 555/901] Add option to select cards from any Zone that can be shown (implemented in desktop GUI only for now) --- .../java/forge/screens/match/CMatchUI.java | 56 +++++++++++++- .../forge/view/arcane/FloatingCardArea.java | 9 +++ .../forge/screens/match/MatchController.java | 10 +++ .../src/forge/screens/match/MatchScreen.java | 9 +++ .../main/java/forge/interfaces/IGuiGame.java | 2 + .../input/InputSelectEntitiesFromList.java | 22 ++++++ .../main/java/forge/net/ProtocolMethod.java | 4 +- .../java/forge/net/server/NetGuiGame.java | 12 +++ .../forge/player/PlayerControllerHuman.java | 77 ++++++++----------- .../forge/properties/ForgePreferences.java | 2 +- 10 files changed, 156 insertions(+), 47 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index 0e13b5c3add..1cb0220a907 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -101,6 +101,7 @@ import forge.util.gui.SOptionPane; import forge.view.FView; import forge.view.arcane.CardPanel; import forge.view.arcane.FloatingCardArea; +import forge.match.input.*; /** * Constructs instance of match UI controller, used as a single point of @@ -395,7 +396,8 @@ public final class CMatchUI break; case Hand: updateHand = true; - //$FALL-THROUGH$ + updateZones = true; + break; default: updateZones = true; FloatingCardArea.refresh(owner, zone); @@ -424,6 +426,57 @@ public final class CMatchUI } } + @Override + public Iterable tempShowZones(final PlayerView controller, final Iterable zonesToUpdate) { + for (final PlayerZoneUpdate update : zonesToUpdate) { + final PlayerView player = update.getPlayer(); + for (final ZoneType zone : update.getZones()) { + switch (zone) { + case Battlefield: // always shown + break; + case Hand: // controller hand always shown + if (controller != player) { + FloatingCardArea.show(this,player,zone); + } + break; + case Library: + case Graveyard: + case Exile: + case Flashback: + case Command: + FloatingCardArea.show(this,player,zone); + break; + default: + break; + } + } + } + return zonesToUpdate; //pfps should return only the newly shown zones + } + + @Override + public void hideZones(final PlayerView controller, final Iterable zonesToUpdate) { + for (final PlayerZoneUpdate update : zonesToUpdate) { + final PlayerView player = update.getPlayer(); + for (final ZoneType zone : update.getZones()) { + switch (zone) { + case Battlefield: // always shown + break; + case Hand: // the controller's hand should never be temporarily shown, but ... + case Library: + case Graveyard: + case Exile: + case Flashback: + case Command: + FloatingCardArea.hide(this,player,zone); + break; + default: + break; + } + } + } + } + // Player's mana pool changes @Override public void updateManaPool(final Iterable manaPoolUpdate) { @@ -465,6 +518,7 @@ public final class CMatchUI } break; default: + FloatingCardArea.refresh(c.getController(),zone); // in case the card is visible in the zone break; } } diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingCardArea.java b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingCardArea.java index fc1365798bb..66b3428e906 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingCardArea.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingCardArea.java @@ -69,6 +69,10 @@ public class FloatingCardArea extends CardArea { final FloatingCardArea cardArea = _init(matchUI, player, zone); cardArea.showWindow(); } + public static void hide(final CMatchUI matchUI, final PlayerView player, final ZoneType zone) { + final FloatingCardArea cardArea = _init(matchUI, player, zone); + cardArea.hideWindow(); + } private static FloatingCardArea _init(final CMatchUI matchUI, final PlayerView player, final ZoneType zone) { final int key = getKey(player, zone); FloatingCardArea cardArea = floatingAreas.get(key); @@ -205,6 +209,11 @@ public class FloatingCardArea extends CardArea { window.setFocusableWindowState(false); // should probably do this earlier window.setVisible(true); } + private void hideWindow() { + onShow(); + window.setFocusableWindowState(false); // should probably do this earlier + window.setVisible(false); + } private void showOrHideWindow() { onShow(); window.setFocusableWindowState(false); // should probably do this earlier diff --git a/forge-gui-mobile/src/forge/screens/match/MatchController.java b/forge-gui-mobile/src/forge/screens/match/MatchController.java index 4e7fb644f00..8ded7b6ff33 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchController.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchController.java @@ -343,6 +343,16 @@ public class MatchController extends AbstractGuiGame { view.updateZones(zonesToUpdate); } + @Override + public Iterable tempShowZones(final PlayerView controller, final Iterable zonesToUpdate) { + return view.tempShowZones(controller, zonesToUpdate); + } + + @Override + public void hideZones(final PlayerView controller, final Iterable zonesToUpdate) { + view.hideZones(controller, zonesToUpdate); + } + @Override public void updateCards(final Iterable cards) { for (final CardView card : cards) { diff --git a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java index 774d8c34355..9b710575c4a 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java @@ -468,6 +468,15 @@ public class MatchScreen extends FScreen { } } + public Iterable tempShowZones(final PlayerView controller, final Iterable zonesToUpdate) { + // pfps needs to actually do something + return zonesToUpdate; // pfps should return only those zones newly shown + } + + public void hideZones(final PlayerView controller, final Iterable zonesToUpdate) { + // pfps needs to actually do something + } + public void updateSingleCard(final CardView card) { final CardAreaPanel pnl = CardAreaPanel.get(card); if (pnl == null) { return; } diff --git a/forge-gui/src/main/java/forge/interfaces/IGuiGame.java b/forge-gui/src/main/java/forge/interfaces/IGuiGame.java index 1abfe662f54..039b132e988 100644 --- a/forge-gui/src/main/java/forge/interfaces/IGuiGame.java +++ b/forge-gui/src/main/java/forge/interfaces/IGuiGame.java @@ -47,6 +47,8 @@ public interface IGuiGame { void showManaPool(PlayerView player); void hideManaPool(PlayerView player); void updateStack(); + Iterable tempShowZones(PlayerView controller, Iterable zonesToUpdate); + void hideZones(PlayerView controller, Iterable zonesToUpdate); void updateZones(Iterable zonesToUpdate); void updateSingleCard(CardView card); void updateCards(Iterable cards); diff --git a/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java b/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java index 6448cafae29..f9e082a3624 100644 --- a/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java +++ b/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java @@ -11,12 +11,17 @@ import forge.player.PlayerControllerHuman; import forge.util.collect.FCollection; import forge.util.collect.FCollectionView; import forge.util.ITriggerEvent; +import forge.player.PlayerZoneUpdate; +import forge.player.PlayerZoneUpdates; +import forge.game.zone.Zone; +import forge.FThreads; public class InputSelectEntitiesFromList extends InputSelectManyBase { private static final long serialVersionUID = -6609493252672573139L; private final FCollectionView validChoices; protected final FCollection selected = new FCollection(); + protected Iterable zonesShown; // want to hide these zones when input done public InputSelectEntitiesFromList(final PlayerControllerHuman controller, final int min, final int max, final FCollectionView validChoices0) { this(controller, min, max, validChoices0, null); @@ -28,6 +33,17 @@ public class InputSelectEntitiesFromList extends InputSele if (min > validChoices.size()) { System.out.println(String.format("Trying to choose at least %d things from a list with only %d things!", min, validChoices.size())); } + PlayerZoneUpdates zonesToUpdate = new PlayerZoneUpdates(); + for (final GameEntity c : validChoices) { + final Zone cz = (c instanceof Card) ? ((Card) c).getZone() : null ; + zonesToUpdate.add(new PlayerZoneUpdate(cz.getPlayer().getView(),cz.getZoneType())); + } + FThreads.invokeInEdtNowOrLater(new Runnable() { + @Override public void run() { + controller.getGui().updateZones(zonesToUpdate); + zonesShown = controller.getGui().tempShowZones(controller.getPlayer().getView(),zonesToUpdate); + } + }); } @Override @@ -93,4 +109,10 @@ public class InputSelectEntitiesFromList extends InputSele ? String.format(message, selected.size()) : String.format(message, max - selected.size()); } + + @Override + protected void onStop() { + getController().getGui().hideZones(getController().getPlayer().getView(),zonesShown); + super.onStop(); + } } diff --git a/forge-gui/src/main/java/forge/net/ProtocolMethod.java b/forge-gui/src/main/java/forge/net/ProtocolMethod.java index 11ff02380d9..85101da9108 100644 --- a/forge-gui/src/main/java/forge/net/ProtocolMethod.java +++ b/forge-gui/src/main/java/forge/net/ProtocolMethod.java @@ -49,6 +49,8 @@ public enum ProtocolMethod { hideManaPool (Mode.SERVER, Void.TYPE, PlayerView.class), updateStack (Mode.SERVER), updateZones (Mode.SERVER, Void.TYPE, Iterable/*PlayerZoneUpdate*/.class), + tempShowZones (Mode.SERVER, Iterable/*PlayerZoneUpdate*/.class, PlayerView.class, Iterable/*PlayerZoneUpdate*/.class), + hideZones (Mode.SERVER, Void.TYPE, PlayerView.class, Iterable/*PlayerZoneUpdate*/.class), updateCards (Mode.SERVER, Void.TYPE, Iterable/*CardView*/.class), updateManaPool (Mode.SERVER, Void.TYPE, Iterable/*PlayerView*/.class), updateLives (Mode.SERVER, Void.TYPE, Iterable/*PlayerView*/.class), @@ -184,4 +186,4 @@ public enum ProtocolMethod { throw new IllegalStateException(String.format("Protocol method %s: illegal return object type %s returned by client, expected %s", name(), value.getClass().getName(), getReturnType().getName())); } } -} \ No newline at end of file +} diff --git a/forge-gui/src/main/java/forge/net/server/NetGuiGame.java b/forge-gui/src/main/java/forge/net/server/NetGuiGame.java index eb479e9352a..5635608fbd0 100644 --- a/forge-gui/src/main/java/forge/net/server/NetGuiGame.java +++ b/forge-gui/src/main/java/forge/net/server/NetGuiGame.java @@ -147,6 +147,18 @@ public class NetGuiGame extends AbstractGuiGame { send(ProtocolMethod.updateZones, zonesToUpdate); } + @Override + public Iterable tempShowZones(final PlayerView controller, final Iterable zonesToUpdate) { + updateGameView(); + return sendAndWait(ProtocolMethod.tempShowZones, controller, zonesToUpdate); + } + + @Override + public void hideZones(final PlayerView controller, final Iterable zonesToUpdate) { + updateGameView(); + send(ProtocolMethod.hideZones, controller, zonesToUpdate); + } + @Override public void updateCards(final Iterable cards) { updateGameView(); diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index b26a3954f65..a745f973e6d 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -348,6 +348,30 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont return new CardCollection(inp.getSelected()); } + private boolean useSelectCardsInput(final FCollectionView sourceList) { + // if UI_SELECT_FROM_ZONES not set use InputSelect only for battlefield and player hand + // if UI_SELECT_FROM_ZONES set use InputSelect for any zone that can be shown + for (final GameEntity c : sourceList) { + if (c instanceof Player) { + continue; + } + if (!(c instanceof Card)) { + return false; + } + final Zone cz = ((Card) c).getZone(); + final boolean useUiPointAtCard = + cz != null && + FModel.getPreferences().getPrefBoolean(FPref.UI_SELECT_FROM_ZONES) ? + (cz.is(ZoneType.Battlefield) || cz.is(ZoneType.Hand) || cz.is(ZoneType.Library) || + cz.is(ZoneType.Graveyard) || cz.is(ZoneType.Exile) || cz.is(ZoneType.Flashback) || cz.is(ZoneType.Command)) : + (cz.is(ZoneType.Hand) && cz.getPlayer() == player || cz.is(ZoneType.Battlefield)); + if (!useUiPointAtCard) { + return false; + } + } + return true; + } + @Override public CardCollectionView chooseCardsForEffect(final CardCollectionView sourceList, final SpellAbility sa, final String title, final int min, final int max, final boolean isOptional) { @@ -362,22 +386,13 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont getGui().setPanelSelection(CardView.get(sa.getHostCard())); - // try to use InputSelectCardsFromList when possible - boolean cardsAreInMyHandOrBattlefield = true; - for (final Card c : sourceList) { - final Zone z = c.getZone(); - if (z != null && (z.is(ZoneType.Battlefield) || z.is(ZoneType.Hand, player))) { - continue; - } - cardsAreInMyHandOrBattlefield = false; - break; - } - - if (cardsAreInMyHandOrBattlefield) { + if (useSelectCardsInput(sourceList)) { + tempShowCards(sourceList); final InputSelectCardsFromList sc = new InputSelectCardsFromList(this, min, max, sourceList, sa); sc.setMessage(title); sc.setCancelAllowed(isOptional); sc.showAndWait(); + endTempShowCards(); return new CardCollection(sc.getSelected()); } @@ -411,31 +426,18 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont return Iterables.getFirst(optionList, null); } - boolean canUseSelectCardsInput = true; - for (final GameEntity c : optionList) { - if (c instanceof Player) { - continue; - } - final Zone cz = ((Card) c).getZone(); - // can point at cards in own hand and anyone's battlefield - final boolean canUiPointAtCards = cz != null - && (cz.is(ZoneType.Hand) && cz.getPlayer() == player || cz.is(ZoneType.Battlefield)); - if (!canUiPointAtCards) { - canUseSelectCardsInput = false; - break; - } - } - - if (canUseSelectCardsInput) { + if (useSelectCardsInput(optionList)) { if (delayedReveal != null) { reveal(delayedReveal.getCards(), delayedReveal.getZone(), delayedReveal.getOwner(), delayedReveal.getMessagePrefix()); } + tempShow(optionList); final InputSelectEntitiesFromList input = new InputSelectEntitiesFromList(this, isOptional ? 0 : 1, 1, optionList, sa); input.setCancelAllowed(isOptional); input.setMessage(MessageUtil.formatMessage(title, player, targetedPlayer)); input.showAndWait(); + endTempShowCards(); return Iterables.getFirst(input.getSelected(), null); } @@ -475,31 +477,18 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont return null; } - boolean canUseSelectCardsInput = true; - for (final GameEntity c : optionList) { - if (c instanceof Player) { - continue; - } - final Zone cz = ((Card) c).getZone(); - // can point at cards in own hand and anyone's battlefield - final boolean canUiPointAtCards = cz != null - && (cz.is(ZoneType.Hand) && cz.getPlayer() == player || cz.is(ZoneType.Battlefield)); - if (!canUiPointAtCards) { - canUseSelectCardsInput = false; - break; - } - } - - if (canUseSelectCardsInput) { + if (useSelectCardsInput(optionList)) { if (delayedReveal != null) { reveal(delayedReveal.getCards(), delayedReveal.getZone(), delayedReveal.getOwner(), delayedReveal.getMessagePrefix()); } + tempShow(optionList); final InputSelectEntitiesFromList input = new InputSelectEntitiesFromList(this, 0, optionList.size(), optionList, sa); input.setCancelAllowed(true); input.setMessage(MessageUtil.formatMessage(title, player, targetedPlayer)); input.showAndWait(); + endTempShowCards(); return (List) input.getSelected(); } diff --git a/forge-gui/src/main/java/forge/properties/ForgePreferences.java b/forge-gui/src/main/java/forge/properties/ForgePreferences.java index 2d6af689171..b96037d9fca 100644 --- a/forge-gui/src/main/java/forge/properties/ForgePreferences.java +++ b/forge-gui/src/main/java/forge/properties/ForgePreferences.java @@ -125,7 +125,7 @@ public class ForgePreferences extends PreferencesStore { UI_DISABLE_IMAGES_EFFECT_CARDS("false"), UI_ALLOW_ORDER_GRAVEYARD_WHEN_NEEDED ("Never"), UI_DEFAULT_FONT_SIZE("12"), - + UI_SELECT_FROM_ZONES("true"), UI_FOR_TOUCHSCREN("false"), UI_VIBRATE_ON_LIFE_LOSS("true"), From 69502dd97b8bcc4c7c3bed50136965b7208ca7cd Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Sun, 6 Jan 2019 12:07:19 -0500 Subject: [PATCH 556/901] Pass min/max through choice code so that user can't choose too many cards --- .../src/main/java/forge/ai/PlayerControllerAi.java | 4 ++-- .../forge/game/ability/effects/ChangeZoneEffect.java | 2 +- .../main/java/forge/game/player/PlayerController.java | 4 ++-- .../src/main/java/forge/screens/match/CMatchUI.java | 4 ++-- .../util/PlayerControllerForTests.java | 4 ++-- .../src/forge/screens/match/MatchController.java | 4 ++-- forge-gui/src/main/java/forge/interfaces/IGuiGame.java | 2 +- forge-gui/src/main/java/forge/net/ProtocolMethod.java | 2 +- .../src/main/java/forge/net/server/NetGuiGame.java | 4 ++-- .../main/java/forge/player/PlayerControllerHuman.java | 10 +++++----- 10 files changed, 20 insertions(+), 20 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 83ebcbdae44..bc002769539 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -162,7 +162,7 @@ public class PlayerControllerAi extends PlayerController { @Override public List chooseEntitiesForEffect( - FCollectionView optionList, DelayedReveal delayedReveal, SpellAbility sa, String title, + FCollectionView optionList, int min, int max, DelayedReveal delayedReveal, SpellAbility sa, String title, Player targetedPlayer) { // this isn't used return null; @@ -1090,7 +1090,7 @@ public class PlayerControllerAi extends PlayerController { @Override public List chooseCardsForZoneChange( - ZoneType destination, List origin, SpellAbility sa, CardCollection fetchList, + ZoneType destination, List origin, SpellAbility sa, CardCollection fetchList, int min, int max, DelayedReveal delayedReveal, String selectPrompt, Player decider) { // this isn't used return null; diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index b0ef097496b..dbf654df439 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -852,7 +852,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { } // ensure that selection is within maximum allowed changeNum do { - selectedCards = decider.getController().chooseCardsForZoneChange(destination, origin, sa, fetchList, delayedReveal, selectPrompt, decider); + selectedCards = decider.getController().chooseCardsForZoneChange(destination, origin, sa, fetchList, 0, changeNum, delayedReveal, selectPrompt, decider); } while (selectedCards != null && selectedCards.size() > changeNum); if (selectedCards != null) { for (Card card : selectedCards) { diff --git a/forge-game/src/main/java/forge/game/player/PlayerController.java b/forge-game/src/main/java/forge/game/player/PlayerController.java index f603e7656e4..3e09e7c3f1c 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerController.java +++ b/forge-game/src/main/java/forge/game/player/PlayerController.java @@ -111,7 +111,7 @@ public abstract class PlayerController { public abstract SpellAbility chooseSingleSpellForEffect(List spells, SpellAbility sa, String title, Map params); - public abstract List chooseEntitiesForEffect(FCollectionView optionList, DelayedReveal delayedReveal, SpellAbility sa, String title, Player relatedPlayer); + public abstract List chooseEntitiesForEffect(FCollectionView optionList, int min, int max, DelayedReveal delayedReveal, SpellAbility sa, String title, Player relatedPlayer); public abstract boolean confirmAction(SpellAbility sa, PlayerActionConfirmMode mode, String message); public abstract boolean confirmBidAction(SpellAbility sa, PlayerActionConfirmMode bidlife, String string, int bid, Player winner); @@ -239,7 +239,7 @@ public abstract class PlayerController { // better to have this odd method than those if playerType comparison in ChangeZone public abstract Card chooseSingleCardForZoneChange(ZoneType destination, List origin, SpellAbility sa, CardCollection fetchList, DelayedReveal delayedReveal, String selectPrompt, boolean isOptional, Player decider); - public abstract List chooseCardsForZoneChange(ZoneType destination, List origin, SpellAbility sa, CardCollection fetchList, DelayedReveal delayedReveal, String selectPrompt, Player decider); + public abstract List chooseCardsForZoneChange(ZoneType destination, List origin, SpellAbility sa, CardCollection fetchList, int min, int max, DelayedReveal delayedReveal, String selectPrompt, Player decider); public abstract void autoPassCancel(); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index 1cb0220a907..5da67c046f3 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -996,11 +996,11 @@ public final class CMatchUI } @Override - public List chooseEntitiesForEffect(final String title, final List optionList, final DelayedReveal delayedReveal) { + public List chooseEntitiesForEffect(final String title, final List optionList, final int min, final int max, final DelayedReveal delayedReveal) { if (delayedReveal != null) { reveal(delayedReveal.getMessagePrefix(), delayedReveal.getCards()); //TODO: Merge this into search dialog } - return (List) order(title,"Selected", 0, optionList.size(), optionList, null, null, false); + return (List) order(title,"Selected", min, max, optionList, null, null, false); } @Override diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java index 80e3e033579..4a2c07f63c6 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java @@ -174,7 +174,7 @@ public class PlayerControllerForTests extends PlayerController { } @Override - public List chooseEntitiesForEffect(FCollectionView optionList, DelayedReveal delayedReveal, SpellAbility sa, String title, Player relatedPlayer) { + public List chooseEntitiesForEffect(FCollectionView optionList, int min, int max, DelayedReveal delayedReveal, SpellAbility sa, String title, Player relatedPlayer) { // this isn't used return null; } @@ -624,7 +624,7 @@ public class PlayerControllerForTests extends PlayerController { } @Override - public List chooseCardsForZoneChange(ZoneType destination, List origin, SpellAbility sa, CardCollection fetchList, DelayedReveal delayedReveal, String selectPrompt, Player decider) { + public List chooseCardsForZoneChange(ZoneType destination, List origin, SpellAbility sa, CardCollection fetchList, int min, int max, DelayedReveal delayedReveal, String selectPrompt, Player decider) { // this isn't used return null; } diff --git a/forge-gui-mobile/src/forge/screens/match/MatchController.java b/forge-gui-mobile/src/forge/screens/match/MatchController.java index 8ded7b6ff33..f0ab65ff144 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchController.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchController.java @@ -516,8 +516,8 @@ public class MatchController extends AbstractGuiGame { } @Override - public List chooseEntitiesForEffect(String title, List optionList, DelayedReveal delayedReveal) { - return SGuiChoose.order(title, "Selected", 0, -1, (List) optionList, null); + public List chooseEntitiesForEffect(String title, List optionList, int min, int max, DelayedReveal delayedReveal) { + return SGuiChoose.order(title, "Selected", min, max, (List) optionList, null); } @Override diff --git a/forge-gui/src/main/java/forge/interfaces/IGuiGame.java b/forge-gui/src/main/java/forge/interfaces/IGuiGame.java index 039b132e988..de67ed2ef38 100644 --- a/forge-gui/src/main/java/forge/interfaces/IGuiGame.java +++ b/forge-gui/src/main/java/forge/interfaces/IGuiGame.java @@ -146,7 +146,7 @@ public interface IGuiGame { List sideboard(CardPool sideboard, CardPool main); GameEntityView chooseSingleEntityForEffect(String title, List optionList, DelayedReveal delayedReveal, boolean isOptional); - List chooseEntitiesForEffect(String title, List optionList, DelayedReveal delayedReveal); + List chooseEntitiesForEffect(String title, List optionList, int min, int max, DelayedReveal delayedReveal); void setCard(CardView card); void setPlayerAvatar(LobbyPlayer player, IHasIcon ihi); boolean openZones(Collection zones, Map players); diff --git a/forge-gui/src/main/java/forge/net/ProtocolMethod.java b/forge-gui/src/main/java/forge/net/ProtocolMethod.java index 85101da9108..a5c3851c1cc 100644 --- a/forge-gui/src/main/java/forge/net/ProtocolMethod.java +++ b/forge-gui/src/main/java/forge/net/ProtocolMethod.java @@ -67,7 +67,7 @@ public enum ProtocolMethod { order (Mode.SERVER, List.class, String.class, String.class, Integer.TYPE, Integer.TYPE, List.class, List.class, CardView.class, Boolean.TYPE), sideboard (Mode.SERVER, List.class, CardPool.class, CardPool.class), chooseSingleEntityForEffect(Mode.SERVER, GameEntityView.class, String.class, List.class, DelayedReveal.class, Boolean.TYPE), - chooseEntitiesForEffect(Mode.SERVER, GameEntityView.class, String.class, List.class, DelayedReveal.class), + chooseEntitiesForEffect(Mode.SERVER, GameEntityView.class, String.class, List.class, Integer.TYPE, Integer.TYPE, DelayedReveal.class), setCard (Mode.SERVER, Void.TYPE, CardView.class), // TODO case "setPlayerAvatar": openZones (Mode.SERVER, Boolean.TYPE, Collection/*ZoneType*/.class, Map/*PlayerView,Object*/.class), diff --git a/forge-gui/src/main/java/forge/net/server/NetGuiGame.java b/forge-gui/src/main/java/forge/net/server/NetGuiGame.java index 5635608fbd0..7578bb067f5 100644 --- a/forge-gui/src/main/java/forge/net/server/NetGuiGame.java +++ b/forge-gui/src/main/java/forge/net/server/NetGuiGame.java @@ -244,8 +244,8 @@ public class NetGuiGame extends AbstractGuiGame { } @Override - public List chooseEntitiesForEffect(final String title, final List optionList, final DelayedReveal delayedReveal) { - return sendAndWait(ProtocolMethod.chooseEntitiesForEffect, title, optionList, delayedReveal); + public List chooseEntitiesForEffect(final String title, final List optionList, final int min, final int max, final DelayedReveal delayedReveal) { + return sendAndWait(ProtocolMethod.chooseEntitiesForEffect, title, optionList, min, max, delayedReveal); } @Override diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index a745f973e6d..bad4aa8d8e0 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -460,7 +460,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont @SuppressWarnings("unchecked") @Override - public List chooseEntitiesForEffect(final FCollectionView optionList, + public List chooseEntitiesForEffect(final FCollectionView optionList, final int min, final int max, final DelayedReveal delayedReveal, final SpellAbility sa, final String title, final Player targetedPlayer) { // useful details for debugging problems with the mass select logic @@ -483,7 +483,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont delayedReveal.getMessagePrefix()); } tempShow(optionList); - final InputSelectEntitiesFromList input = new InputSelectEntitiesFromList(this, 0, optionList.size(), + final InputSelectEntitiesFromList input = new InputSelectEntitiesFromList(this, min, max, optionList, sa); input.setCancelAllowed(true); input.setMessage(MessageUtil.formatMessage(title, player, targetedPlayer)); @@ -497,7 +497,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont tempShow(delayedReveal.getCards()); } final List chosen = getGui().chooseEntitiesForEffect(title, - GameEntityView.getEntityCollection(optionList), delayedReveal); + GameEntityView.getEntityCollection(optionList), min, max, delayedReveal); endTempShowCards(); List results = new ArrayList<>(); @@ -1780,9 +1780,9 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } public List chooseCardsForZoneChange(final ZoneType destination, final List origin, - final SpellAbility sa, final CardCollection fetchList, final DelayedReveal delayedReveal, + final SpellAbility sa, final CardCollection fetchList, final int min, final int max, final DelayedReveal delayedReveal, final String selectPrompt, final Player decider) { - return chooseEntitiesForEffect(fetchList, delayedReveal, sa, selectPrompt, decider); + return chooseEntitiesForEffect(fetchList, min, max, delayedReveal, sa, selectPrompt, decider); } @Override From 3ded3926f48eb0e24f64b38787db65c39b48d8bd Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Tue, 8 Jan 2019 02:50:58 +0000 Subject: [PATCH 557/901] Remove placeholder icons for shiny new icons. --- .../challenges/LEB Challenge Balance.dck | 2 +- .../challenges/LEB Challenge Copper Tablet.dck | 2 +- .../challenges/LEB Challenge Copycat.dck | 2 +- .../challenges/LEB Challenge Fog.dck | 2 +- .../challenges/LEB Challenge Lord of Atlantis.dck | 2 +- .../challenges/LEB Challenge Moon Shadow.dck | 2 +- .../challenges/LEB Challenge Northern Paladin.dck | 2 +- .../challenges/LEB Challenge Plague Rats.dck | 2 +- .../challenges/LEB Challenge Prodigal Sorcerer.dck | 2 +- .../challenges/LEB Challenge Rough Weather.dck | 2 +- .../challenges/LEB Challenge Shandalar.dck | 2 +- .../challenges/LEB Challenge Thievery.dck | 2 +- .../duels/LEB 1 Aspect 13 WvsB Good.dck | 2 +- .../duels/LEB 1 Aspect 13 WvsB Purity.dck | 2 +- .../duels/LEB 1 Aspect 14 WvsR Order.dck | 2 +- .../duels/LEB 1 Aspect 14 WvsR Peace.dck | 2 +- .../duels/LEB 1 Aspect 24 UvsR Air.dck | 2 +- .../duels/LEB 1 Aspect 24 UvsR Water.dck | 2 +- .../duels/LEB 1 Aspect 25 UvsG Civilization.dck | 2 +- .../duels/LEB 1 Aspect 25 UvsG Intellect.dck | 2 +- .../duels/LEB 1 Aspect 31 BvsW Corruption.dck | 2 +- .../duels/LEB 1 Aspect 31 BvsW Evil.dck | 2 +- .../duels/LEB 1 Aspect 35 BvsG Death.dck | 2 +- .../duels/LEB 1 Aspect 35 BvsG Decay.dck | 2 +- .../duels/LEB 1 Aspect 41 RvsW Chaos.dck | 2 +- .../duels/LEB 1 Aspect 41 RvsW War.dck | 2 +- .../duels/LEB 1 Aspect 42 RvsU Earth.dck | 2 +- .../duels/LEB 1 Aspect 42 RvsU Fire.dck | 2 +- .../duels/LEB 1 Aspect 52 GvsU Instinct.dck | 2 +- .../duels/LEB 1 Aspect 52 GvsU Nature.dck | 2 +- .../duels/LEB 1 Aspect 53 GvsB Growth.dck | 2 +- .../duels/LEB 1 Aspect 53 GvsB Life.dck | 2 +- .../duels/LEB 2 Color 0 Artifacts.dck | 2 +- .../1993-10 Limited Edition Beta/duels/LEB 2 Color 1 White.dck | 2 +- .../1993-10 Limited Edition Beta/duels/LEB 2 Color 2 Blue.dck | 2 +- .../1993-10 Limited Edition Beta/duels/LEB 2 Color 3 Black.dck | 2 +- .../1993-10 Limited Edition Beta/duels/LEB 2 Color 4 Red.dck | 2 +- .../1993-10 Limited Edition Beta/duels/LEB 2 Color 5 Green.dck | 2 +- .../1993-10 Limited Edition Beta/duels/LEB 2 Gimmick Mana.dck | 2 +- .../duels/LEB 2 Gimmick Mighty Red.dck | 2 +- .../duels/LEB 2 Gimmick Papercuts.dck | 2 +- .../duels/LEB 2 Gimmick Sanctuary.dck | 2 +- .../duels/LEB 2 Gimmick Sickly Growth.dck | 2 +- .../duels/LEB 2 Gimmick Squeezed.dck | 2 +- .../duels/LEB 2 Gimmick The Marines.dck | 2 +- 45 files changed, 45 insertions(+), 45 deletions(-) diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Balance.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Balance.dck index 6991e0944f7..10e463cabf6 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Balance.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Balance.dck @@ -12,7 +12,7 @@ Name=LEB Challenge: Balance Title=Eternal Balance Difficulty=hard Description=Everything but. -Icon=Dungeon Crawling White.jpg +Icon=Balance.jpg Deck Type=constructed [main] 70 Balance|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Copper Tablet.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Copper Tablet.dck index 25fc5f36a89..c738c3a4e42 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Copper Tablet.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Copper Tablet.dck @@ -12,7 +12,7 @@ Name=LEB Challenge: Copper Tablet Title=The Runes Difficulty=hard Description=You spot an inscription on a tablet. It reads: "I prepared Explosive Runes this morning." -Icon=Dungeon Crawling Colorless.jpg +Icon=Copper Tablet.jpg Deck Type=constructed [main] 40 Copper Tablet|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Copycat.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Copycat.dck index 8e3b96ecf20..5e68c38408e 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Copycat.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Copycat.dck @@ -12,7 +12,7 @@ Name=LEB Challenge: Copycat Title=Copycat Difficulty=easy Description=The shapeshifter mimics with a twin's esteem and a mirror's cruelty. -Icon=Dungeon Crawling Blue.jpg +Icon=Clone.jpg Deck Type=constructed [main] 20 Clone|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Fog.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Fog.dck index f89e6be8e6c..9ba73d5a1b1 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Fog.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Fog.dck @@ -12,7 +12,7 @@ Name=LEB Challenge: Fog Title=A Thick Fog Difficulty=easy Description="I fear no army or beast, but only the morning fog. Our assault can survive everything else." -Lord Hilneth -Icon=Dungeon Crawling Green.jpg +Icon=Fog.jpg Deck Type=constructed [main] 80 Fog|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Lord of Atlantis.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Lord of Atlantis.dck index 1f1312dfa04..0a736644c14 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Lord of Atlantis.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Lord of Atlantis.dck @@ -12,7 +12,7 @@ Name=LEB Challenge: Atlantis Title=Atlantis Difficulty=very hard Description=A master of tactics, the Lord of Atlantis makes his people bold in battle merely by arriving to lead them. -Icon=Dungeon Crawling Blue.jpg +Icon=Lord of Atlantis.jpg Deck Type=constructed [main] 20 Island|LEB|1 diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Moon Shadow.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Moon Shadow.dck index 943fead798e..7092b95221f 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Moon Shadow.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Moon Shadow.dck @@ -12,7 +12,7 @@ Name=LEB Challenge: Moon Shadow Title=Moon Shadow Difficulty=hard Description="Yes, I'm bein' followed by a moon shadow/ Moon shadow, moon shadow" -Icon=Dungeon Crawling Black.jpg +Icon=Moon Shadow.jpg Deck Type=constructed [main] 10 Bad Moon|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Northern Paladin.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Northern Paladin.dck index ceb9f0b20ee..ddb33d213ff 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Northern Paladin.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Northern Paladin.dck @@ -13,7 +13,7 @@ Name=LEB Challenge: Northern Paladin Title=The Paladins Difficulty=very hard Description="Look to the north; there you will find aid and comfort." -The Book of Tal -Icon=Dungeon Crawling White.jpg +Icon=Northern Paladin.jpg Deck Type=constructed [main] 30 Northern Paladin|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Plague Rats.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Plague Rats.dck index 0bdb34e733c..b7793324fa3 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Plague Rats.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Plague Rats.dck @@ -12,7 +12,7 @@ Name=LEB Challenge: Plague Rats Title=A Swarm of Rats Difficulty=medium Description="Should you a Rat to madness tease/ Why ev'n a Rat may plague you..." -Samuel Coleridge, "Recantation" -Icon=Dungeon Crawling Black.jpg +Icon=Plague Rats.jpg Deck Type=constructed [main] 40 Plague Rats|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Prodigal Sorcerer.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Prodigal Sorcerer.dck index c46840f7fde..58f2ecd2b01 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Prodigal Sorcerer.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Prodigal Sorcerer.dck @@ -12,7 +12,7 @@ Name=LEB Challenge: Prodigal Sorcerer Title=The Academy Difficulty=medium Description="There are some who call me... Tim?" -Icon=Dungeon Crawling Blue.jpg +Icon=Prodigal Sorcerer.jpg Deck Type=constructed [main] 20 Island|LEB|2 diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Rough Weather.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Rough Weather.dck index 15a578d20f7..a36b004b7a5 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Rough Weather.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Rough Weather.dck @@ -12,7 +12,7 @@ Name=LEB Challenge: Rough Weather Title=Rough Weather Difficulty=hard Description=Weather forecast: earthquakes and hurricanes. -Icon=Dungeon Crawling Gold.jpg +Icon=Rough Weather.jpg Deck Type=constructed [main] 15 Earthquake|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Shandalar.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Shandalar.dck index d59fc0db49a..9dd77a980db 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Shandalar.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Shandalar.dck @@ -12,7 +12,7 @@ Name=LEB Challenge: Shandalar Title=Shandalar Difficulty=very hard Description="Hey, that's not fair!" -You, probably -Icon=Dungeon Crawling Gold.jpg +Icon=Shandalar.jpg Deck Type=constructed [main] 4 Ancestral Recall|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Thievery.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Thievery.dck index 1476e93bd85..36c2794d828 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Thievery.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Thievery.dck @@ -12,7 +12,7 @@ Name=LEB Challenge: Thievery Title=Thievery Difficulty=medium Description=Possession is nine-tenths of the law. -Icon=Dungeon Crawling Blue.jpg +Icon=Thievery.jpg Deck Type=constructed [main] 24 Control Magic|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 13 WvsB Good.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 13 WvsB Good.dck index be8a9e4ea93..2e838278d9a 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 13 WvsB Good.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 13 WvsB Good.dck @@ -4,7 +4,7 @@ Name=LEB 1 Aspect: 13 WvB Good Title=Aspect of Good Difficulty=easy Description=Out of the blackness and stench of the engulfing swamp emerged a shimmering figure. Only the splattered armor and ichor-stained sword hinted at the unfathomable evil the knight had just laid waste. -Icon=Dungeon Crawling White.jpg +Icon=Aspect of Good.jpg Deck Type=constructed [Main] 3 Blessing|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 13 WvsB Purity.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 13 WvsB Purity.dck index 9bb6ec9d206..48efa22b975 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 13 WvsB Purity.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 13 WvsB Purity.dck @@ -4,7 +4,7 @@ Name=LEB 1 Aspect: 13 WvB Purity Title=Aspect of Purity Difficulty=easy Description=Before a woman marries in the village of Sursi, she must visit the land of the mesa pegasus. Legend has it that if the woman is pure of heart and her love is true, a mesa pegasus will appear, blessing her family with long life and good fortune. -Icon=Dungeon Crawling White.jpg +Icon=Aspect of Purity.jpg Deck Type=constructed [Main] 2 Black Ward|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 14 WvsR Order.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 14 WvsR Order.dck index f8f4fc364f2..c62e81319b8 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 14 WvsR Order.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 14 WvsR Order.dck @@ -4,7 +4,7 @@ Name=LEB 1 Aspect: 14 WvR Order Title=Aspect of Order Difficulty=easy Description=Benalia has a complex caste system that changes with the lunar year. No matter what the season, the only caste that cannot be attained by either heredity or money is that of the hero. -Icon=Dungeon Crawling White.jpg +Icon=Aspect of Order.jpg Deck Type=constructed [Main] 3 Armageddon|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 14 WvsR Peace.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 14 WvsR Peace.dck index 3ccc167531c..796298ba513 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 14 WvsR Peace.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 14 WvsR Peace.dck @@ -4,7 +4,7 @@ Name=LEB 1 Aspect: 14 WvR Peace Title=Aspect of Peace Difficulty=easy Description=Just as the evil ones approached to slay Justina, she cast a great spell, imbuing her weapons with her own life force. Thus she fulfilled the prophecy: "In the death of your savior will you find salvation." -Icon=Dungeon Crawling White.jpg +Icon=Aspect of Peace.jpg Deck Type=constructed [Main] 3 Animate Wall|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 24 UvsR Air.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 24 UvsR Air.dck index cd0da0ed1e1..bff3d055edb 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 24 UvsR Air.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 24 UvsR Air.dck @@ -4,7 +4,7 @@ Name=LEB 1 Aspect: 24 UvR Air Title=Aspect of Air Difficulty=easy Description=These spirits of the air are winsome and wild and cannot be truly contained. Only marginally intelligent, they often substitute whimsy for strategy, delighting in mischief and mayhem. -Icon=Dungeon Crawling Blue.jpg +Icon=Aspect of Air.jpg Deck Type=constructed [Main] 4 Air Elemental|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 24 UvsR Water.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 24 UvsR Water.dck index d4bb46f1277..17150eeb6c9 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 24 UvsR Water.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 24 UvsR Water.dck @@ -4,7 +4,7 @@ Name=LEB 1 Aspect: 24 UvR Water Title=Aspect of Water Difficulty=easy Description=Unpredictable as the sea itself, Water Elementals shift without warning from tranquility to tempest. Capricious and fickle, they flow restlessly from one shape to another, expressing their moods with their physical forms. -Icon=Dungeon Crawling Blue.jpg +Icon=Aspect of Water.jpg Deck Type=constructed [Main] 2 Blue Elemental Blast|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 25 UvsG Civilization.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 25 UvsG Civilization.dck index 8ab4a64a6eb..083c1f0d10d 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 25 UvsG Civilization.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 25 UvsG Civilization.dck @@ -4,7 +4,7 @@ Name=LEB 1 Aspect: 25 UvG Civilization Title=Aspect of Civilization Difficulty=easy Description="The foot stone is connected to the ankle stone, the ankle stone is connected to the leg stone..."-"Song of the Artificer" -Icon=Dungeon Crawling Blue.jpg +Icon=Aspect of Civilization.jpg Deck Type=constructed [Main] 3 Animate Artifact|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 25 UvsG Intellect.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 25 UvsG Intellect.dck index 89197d1867d..ae19687580f 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 25 UvsG Intellect.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 25 UvsG Intellect.dck @@ -4,7 +4,7 @@ Name=LEB 1 Aspect: 25 UvG Intellect Title=Aspect of Intellect Difficulty=easy Description=Occasionally a member of the Institute of Arcane Study acquires a taste for worldly pleasures. Seldom do they have trouble finding employment. -Icon=Dungeon Crawling Blue.jpg +Icon=Aspect of Intellect.jpg Deck Type=constructed [Main] 2 Braingeyser|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 31 BvsW Corruption.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 31 BvsW Corruption.dck index da2eb2519a3..20b0d277512 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 31 BvsW Corruption.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 31 BvsW Corruption.dck @@ -4,7 +4,7 @@ Name=LEB 1 Aspect: 31 BvW Corruption Title=Aspect of Corruption Difficulty=easy Description='Twas in the bogs of Cannelbrae // My mate did meet an early grave // 'Twas nothing left for us to save // In the peat-filled bogs of Cannelbrae. -Icon=Dungeon Crawling Black.jpg +Icon=Aspect of Corruption.jpg Deck Type=constructed [Main] 4 Bog Wraith|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 31 BvsW Evil.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 31 BvsW Evil.dck index 264edf5bb6c..066f6145494 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 31 BvsW Evil.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 31 BvsW Evil.dck @@ -4,7 +4,7 @@ Name=LEB 1 Aspect: 31 BvW Evil Title=Aspect of Evil Difficulty=easy Description=Created to destroy Dominiaria, demons can sometimes be bent to a more focused purpose. -Icon=Dungeon Crawling Black.jpg +Icon=Aspect of Evil.jpg Deck Type=constructed [Main] 4 Bad Moon|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 35 BvsG Death.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 35 BvsG Death.dck index 2838b2ed320..a8fe5e85351 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 35 BvsG Death.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 35 BvsG Death.dck @@ -4,7 +4,7 @@ Name=LEB 1 Aspect: 35 BvG Death Title=Aspect of Death Difficulty=easy Description=The Wall of Bone is said to be an aspect of the Great Wall in Hel, where the bones of all sinners wait for Ragnarok, when Hela will call them forth for the final battle. -Icon=Dungeon Crawling Black.jpg +Icon=Aspect of Death.jpg Deck Type=constructed [Main] 4 Animate Dead|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 35 BvsG Decay.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 35 BvsG Decay.dck index abe2671d16b..7eefa988fab 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 35 BvsG Decay.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 35 BvsG Decay.dck @@ -4,7 +4,7 @@ Name=LEB 1 Aspect: 35 BvG Decay Title=Aspect of Decay Difficulty=easy Description=They say the Zombie Master controlled these foul creatures even before his own death, but now that he is one of them, nothing can make them betray him. -Icon=Dungeon Crawling Black.jpg +Icon=Aspect of Decay.jpg Deck Type=constructed [Main] 2 Ankh of Mishra|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 41 RvsW Chaos.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 41 RvsW Chaos.dck index b6140520d63..408847be12f 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 41 RvsW Chaos.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 41 RvsW Chaos.dck @@ -4,7 +4,7 @@ Name=LEB 1 Aspect: 41 RvW Chaos Title=Aspect of Chaos Difficulty=easy Description=The intricate dynamics of Rundvelt Goblin affairs are often confused with anarchy. The chaos, however, is the chaos of a thundercloud, and direction will sporadically and violently appear. Pashalik Mons and his raiders are the thunderhead that leads in the storm. -Icon=Dungeon Crawling Red.jpg +Icon=Aspect of Chaos.jpg Deck Type=constructed [Main] 4 Disintegrate|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 41 RvsW War.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 41 RvsW War.dck index 3246abef8c9..4a6b8cd342f 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 41 RvsW War.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 41 RvsW War.dck @@ -4,7 +4,7 @@ Name=LEB 1 Aspect: 41 RvW War Title=Aspect of War Difficulty=easy Description=The minotaurs of the Hurloon Mountains are known for their love of battle. They are also known for their hymns to the dead, sung for friend and foe alike. These hymns can last for days, filling the mountain valleys with their low, haunting sounds. -Icon=Dungeon Crawling Red.jpg +Icon=Aspect of War.jpg Deck Type=constructed [Main] 3 Gauntlet of Might|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 42 RvsU Earth.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 42 RvsU Earth.dck index f8729654f31..9ee55a368b4 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 42 RvsU Earth.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 42 RvsU Earth.dck @@ -4,7 +4,7 @@ Name=LEB 1 Aspect: 42 RvU Earth Title=Aspect of Earth Difficulty=easy Description=Earth Elementals have the eternal strength of stone and the endurance of mountains. Primordially connected to the land they inhabit, they take a long-term view of things, scorning the impetuous haste of short-lived mortal creatures. -Icon=Dungeon Crawling Red.jpg +Icon=Aspect of Earth.jpg Deck Type=constructed [Main] 2 Burrowing|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 42 RvsU Fire.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 42 RvsU Fire.dck index 8d5c941354a..79bee630421 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 42 RvsU Fire.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 42 RvsU Fire.dck @@ -4,7 +4,7 @@ Name=LEB 1 Aspect: 42 RvU Fire Title=Aspect of Fire Difficulty=easy Description=Fire Elementals are ruthless infernos, annihilating and consuming their foes in a frenzied holocaust. Crackling and blazing, they sear swift, terrible paths, leaving the land charred and scorched in their wake. -Icon=Dungeon Crawling Red.jpg +Icon=Aspect of Fire.jpg Deck Type=constructed [Main] 4 Dragon Whelp|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 52 GvsU Instinct.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 52 GvsU Instinct.dck index f968d1846c0..b0e92625d70 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 52 GvsU Instinct.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 52 GvsU Instinct.dck @@ -4,7 +4,7 @@ Name=LEB 1 Aspect: 52 GvU Instinct Title=Aspect of Instinct Difficulty=easy Description=Though many think of Wolves as solitary predators, they are actually extremely social animals. During a hunt they often call to each other, which can be quite unsettling for their prey. -Icon=Dungeon Crawling Green.jpg +Icon=Aspect of Instinct.jpg Deck Type=constructed [Main] 4 Aspect of Wolf|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 52 GvsU Nature.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 52 GvsU Nature.dck index 4e0b9c69f1c..ff12b85922c 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 52 GvsU Nature.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 52 GvsU Nature.dck @@ -4,7 +4,7 @@ Name=LEB 1 Aspect: 52 GvU Nature Title=Aspect of Nature Difficulty=easy Description=Moss-covered statues littered the area, a macabre monument to the basilisk's power. -Icon=Dungeon Crawling Green.jpg +Icon=Aspect of Nature.jpg Deck Type=constructed [Main] 4 Cockatrice|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 53 GvsB Growth.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 53 GvsB Growth.dck index 21bff7223c0..73ac151fa17 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 53 GvsB Growth.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 53 GvsB Growth.dck @@ -4,7 +4,7 @@ Name=LEB 1 Aspect: 53 GvB Growth Title=Aspect of Growth Difficulty=easy Description=After years of training, the Druid becomes the one with nature, drawing power from the land and returning it when needed. -Icon=Dungeon Crawling Green.jpg +Icon=Aspect of Growth.jpg Deck Type=constructed [Main] 1 Fastbond|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 53 GvsB Life.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 53 GvsB Life.dck index bc02395c144..c1ab4d0f328 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 53 GvsB Life.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 1 Aspect 53 GvsB Life.dck @@ -4,7 +4,7 @@ Name=LEB 1 Aspect: 53 GvB Life Title=Aspect of Life Difficulty=easy Description=Whenever the Llanowar Elves gather the fruits of their forest, they leave one plant of each type untouched, considering that nature's portion. -Icon=Dungeon Crawling Green.jpg +Icon=Aspect of Life.jpg Deck Type=constructed [Main] 4 Elvish Archers|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Color 0 Artifacts.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Color 0 Artifacts.dck index 9ea86f2467f..ebebb77c3ae 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Color 0 Artifacts.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Color 0 Artifacts.dck @@ -4,7 +4,7 @@ Name=LEB 2 Color: 0 Artifacts Title=The Artifacts Difficulty=medium Description=Some fiendish mage had created a horrifying wall of living flesh, patched together from a jumble of still-recognizable body parts. As we sought to hew our way through it, some unknown power healed the gaping wounds we cut, denying us passage. -Icon=Dungeon Crawling Colorless.jpg +Icon=The Artifacts.jpg Deck Type=constructed [Main] 1 Basalt Monolith|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Color 1 White.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Color 1 White.dck index 5485b8e30eb..52e4bb3e20e 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Color 1 White.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Color 1 White.dck @@ -4,7 +4,7 @@ Name=LEB 2 Color: 1 White Title=The Color White Difficulty=medium Description=Born with wings of light and a sword of faith, this heavenly incarnation embodies both fury and purity. -Icon=Dungeon Crawling White.jpg +Icon=The Color White.jpg Deck Type=constructed [Main] 4 Armageddon|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Color 2 Blue.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Color 2 Blue.dck index a53050816b6..530e19af399 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Color 2 Blue.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Color 2 Blue.dck @@ -4,7 +4,7 @@ Name=LEB 2 Color: 2 Blue Title=The Color Blue Difficulty=medium Description=Of royal blood amongst the spirits of the air, the Mahamoti Djinn rides on the wings of the winds. As dangerous in the gambling hall as he is in battle, he is a master of trickery and misdirection. -Icon=Dungeon Crawling Blue.jpg +Icon=The Color Blue.jpg Deck Type=constructed [Main] 4 Air Elemental|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Color 3 Black.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Color 3 Black.dck index baf61aed847..11cf6e5632c 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Color 3 Black.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Color 3 Black.dck @@ -4,7 +4,7 @@ Name=LEB 2 Color: 3 Black Title=The Color Black Difficulty=medium Description=Battle doesn't need a purpose; the battle is its own purpose. You don't ask why a plague spreads or a field burns. Don't ask why I fight. -Icon=Dungeon Crawling Black.jpg +Icon=The Color Black.jpg Deck Type=constructed [Main] 4 Bad Moon|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Color 4 Red.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Color 4 Red.dck index 0a97db3b4e0..69fbc7024a9 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Color 4 Red.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Color 4 Red.dck @@ -4,7 +4,7 @@ Name=LEB 2 Color: 4 Red Title=The Color Red Difficulty=medium Description=To become king of the Goblins, one must assassinate the previous king. Thus, only the most foolish seek positions of leadership. -Icon=Dungeon Crawling Red.jpg +Icon=The Color Red.jpg Deck Type=constructed [Main] 1 Black Lotus|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Color 5 Green.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Color 5 Green.dck index 4da7a53f537..05e73dc7a4e 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Color 5 Green.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Color 5 Green.dck @@ -4,7 +4,7 @@ Name=LEB 2 Color: 5 Green Title=The Color Green Difficulty=medium Description=The most terrifying thing about the Craw Wurm is probably the horrible crashing sound it makes as it speeds through the forest. This noise is so loud it echoes through the trees and seems to come from all directions at once. -Icon=Dungeon Crawling Green.jpg +Icon=The Color Green.jpg Deck Type=constructed [Main] 4 Aspect of Wolf|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick Mana.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick Mana.dck index ba28a5754cb..ca588866501 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick Mana.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick Mana.dck @@ -4,7 +4,7 @@ Name=LEB 2 Gimmick: Mana Title=Mana Difficulty=medium Description=Not to be. That is the answer. -Icon=Dungeon Crawling Gold.jpg +Icon=Mana.jpg Deck Type=constructed [Main] 4 Birds of Paradise|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick Mighty Red.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick Mighty Red.dck index bdf6f24f34c..87515454d04 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick Mighty Red.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick Mighty Red.dck @@ -4,7 +4,7 @@ Name=LEB 2 Gimmick: Mighty Red Title=Mighty Red Difficulty=medium Description=While it's true most Dragons are cruel, the Shivan Dragon seems to take particular glee in the misery of others, often tormenting its victims much like a cat plays with a mouse before delivering the final blow. -Icon=Dungeon Crawling Red.jpg +Icon=Mighty Red.jpg Deck Type=constructed [Main] 1 Black Lotus|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick Papercuts.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick Papercuts.dck index 99194a73a46..9fc7845a5dc 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick Papercuts.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick Papercuts.dck @@ -4,7 +4,7 @@ Name=LEB 2 Gimmick: Papercuts Title=Papercuts Difficulty=medium Description=The rod is a relic from ancient times... cruel, vicious, mean-spirited times. -Icon=Dungeon Crawling Gold.jpg +Icon=Papercuts.jpg Deck Type=constructed [Main] 4 Birds of Paradise|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick Sanctuary.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick Sanctuary.dck index ed6b8a5032d..f2722f60b4b 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick Sanctuary.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick Sanctuary.dck @@ -4,7 +4,7 @@ Name=LEB 2 Gimmick: Sanctuary Title=Sanctuary Difficulty=medium Description=Legend has it that the mine howls out the last words of those who died inside. -Icon=Dungeon Crawling Gold.jpg +Icon=Sanctuary.jpg Deck Type=constructed [Main] 1 Balance|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick Sickly Growth.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick Sickly Growth.dck index ff6c596dbc8..de48d4d0b0a 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick Sickly Growth.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick Sickly Growth.dck @@ -4,7 +4,7 @@ Name=LEB 2 Gimmick: Sickly Growth Title=Sickly Growth Difficulty=medium Description=Rather than sheltering her young, the female Fungusaur often injures her own offspring, thereby ensuring their rapid growth. -Icon=Dungeon Crawling Gold.jpg +Icon=Sickly Growth.jpg Deck Type=constructed [Main] 4 Bayou|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick Squeezed.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick Squeezed.dck index 36cedbefd03..35bd129149a 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick Squeezed.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick Squeezed.dck @@ -4,7 +4,7 @@ Name=LEB 2 Gimmick: Squeezed Title=Squeezed Difficulty=medium Description=Trained in the arts of stealth, the royal assassins choose their victims carefully, relying on timing and precision rather than brute force. -Icon=Dungeon Crawling Gold.jpg +Icon=Squeezed.jpg Deck Type=constructed [Main] 4 Badlands|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick The Marines.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick The Marines.dck index b3435dd6724..6e028e2a47b 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick The Marines.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick The Marines.dck @@ -4,7 +4,7 @@ Name=LEB 2 Gimmick: The Marines Title=The Marines Difficulty=medium Description=Most human scholars believe that Merfolk are the survivors of sunken Atlantis, humans adapted to the water. Merfolk, however, believe that humans sprang forth from Merfolk who adapted themselves in order to explore their last frontier. -Icon=Dungeon Crawling Blue.jpg +Icon=The Marines.jpg Deck Type=constructed [Main] 4 Basalt Monolith|LEB From 36b3431975e740e3e497015de1ccb9a1fb948516 Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Tue, 8 Jan 2019 02:54:36 +0000 Subject: [PATCH 558/901] rest of the LEB world icons --- .../challenges/LEB Challenge Wheel of Fortune.dck | 2 +- .../duels/LEB 2 Gimmick For Whom the Bell Tolls.dck | 2 +- .../duels/LEB 3 EW 2014 Alpha Mono Black by D Schooley.dck | 2 +- .../duels/LEB 3 EW 2014 Beta Mono White by A Wright.dck | 2 +- .../duels/LEB 3 Strategy Classic Control.dck | 2 +- .../duels/LEB 3 Strategy Geddon.dck | 2 +- .../duels/LEB 3 Strategy Patriot Control.dck | 2 +- .../duels/LEB 3 Strategy Sedge Midrange.dck | 2 +- .../1993-10 Limited Edition Beta/duels/LEB 3 Strategy Tempo.dck | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Wheel of Fortune.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Wheel of Fortune.dck index 6049089ae20..178095330da 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Wheel of Fortune.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/challenges/LEB Challenge Wheel of Fortune.dck @@ -12,7 +12,7 @@ Name=LEB Challenge: Wheel of Fortune Title=The Wheel Difficulty=hard Description="Fate is not as fixed as you might think." -Icon=Dungeon Crawling Red.jpg +Icon=Wheel of Fortune.jpg Deck Type=constructed [main] 50 Mox Ruby|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick For Whom the Bell Tolls.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick For Whom the Bell Tolls.dck index 20775edf048..3ae3ca22086 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick For Whom the Bell Tolls.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 2 Gimmick For Whom the Bell Tolls.dck @@ -4,7 +4,7 @@ Name=LEB 2 Gimmick: For Whom the Bell Tolls Title=For Whom the Bell Tolls Difficulty=medium Description=Bones scattered around us joined to form misshapen bodies. We struck at them repeatedly-they fell, but soon formed again, with the same mocking look on their faceless skulls. -Icon=Dungeon Crawling Gold.jpg +Icon=For Whom the Bell Tolls.jpg Deck Type=constructed [Main] 4 Bad Moon|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 3 EW 2014 Alpha Mono Black by D Schooley.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 3 EW 2014 Alpha Mono Black by D Schooley.dck index 1349712e0b3..fa5fab94423 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 3 EW 2014 Alpha Mono Black by D Schooley.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 3 EW 2014 Alpha Mono Black by D Schooley.dck @@ -4,7 +4,7 @@ Name=LEB 3 EW 2014: Alpha Mono Black by David Schooley Title=Alpha Mono Black Difficulty=hard Description=Played by by David Schooley at Eternal Weekend 2014. -Icon=Dungeon Crawling Black.jpg +Icon=Alpha Mono Black.jpg Deck Type=constructed [Main] 2 Animate Dead|LEA diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 3 EW 2014 Beta Mono White by A Wright.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 3 EW 2014 Beta Mono White by A Wright.dck index e2fdf7df92d..7a3b6f9637c 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 3 EW 2014 Beta Mono White by A Wright.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 3 EW 2014 Beta Mono White by A Wright.dck @@ -4,7 +4,7 @@ Name=LEB 3 EW 2014: Beta Mono White by Andrew Wright Title=Beta Mono White Difficulty=hard Description=Played by by Andrew Wright at Eternal Weekend 2014. -Icon=Dungeon Crawling White.jpg +Icon=Beta Mono White.jpg Deck Type=constructed [Main] 1 Balance|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 3 Strategy Classic Control.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 3 Strategy Classic Control.dck index fa07066fcb1..86350119940 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 3 Strategy Classic Control.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 3 Strategy Classic Control.dck @@ -4,7 +4,7 @@ Name=LEB 3 Strategy: Classic Control Title=Classic Control Difficulty=hard Description="Knowledge is power."-Sir Francis Bacon, Meditationes Sacrae -Icon=Dungeon Crawling Gold.jpg +Icon=Classic Control.jpg Deck Type=constructed [Main] 1 Ancestral Recall|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 3 Strategy Geddon.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 3 Strategy Geddon.dck index 30ca1045f08..b9dfe7679ef 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 3 Strategy Geddon.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 3 Strategy Geddon.dck @@ -4,7 +4,7 @@ Name=LEB 3 Strategy: Geddon Title=Geddon Difficulty=hard Description="'O miserable of happy Is this the end // Of this new glorious world . . . ?'"-John Milton, Paradise Lost -Icon=Dungeon Crawling Gold.jpg +Icon=Geddon.jpg Deck Type=constructed [Main] 1 Ancestral Recall|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 3 Strategy Patriot Control.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 3 Strategy Patriot Control.dck index 5ff684a9b49..1d95420ea2b 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 3 Strategy Patriot Control.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 3 Strategy Patriot Control.dck @@ -4,7 +4,7 @@ Name=LEB 3 Strategy: Patriot Control Title=Patriot Control Difficulty=hard Description="Peace hath her victories // No less renownd than war."-John Milton, "To the Lord General Cromwell" -Icon=Dungeon Crawling Gold.jpg +Icon=Patriot Control.jpg Deck Type=constructed [Main] 1 Ancestral Recall|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 3 Strategy Sedge Midrange.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 3 Strategy Sedge Midrange.dck index 914160057d8..7f15c34f7a2 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 3 Strategy Sedge Midrange.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 3 Strategy Sedge Midrange.dck @@ -4,7 +4,7 @@ Name=LEB 3 Strategy: Sedge Midrange Title=Sedge Midrange Difficulty=hard Description=The stench in the hovel was overpowering; something loathsome was cooking. Occasionally something surfaced in the thick paste, but my host would casually push it down before I could make out what it was. -Icon=Dungeon Crawling Gold.jpg +Icon=Sedge Midrange.jpg Deck Type=constructed [Main] 1 Ancestral Recall|LEB diff --git a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 3 Strategy Tempo.dck b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 3 Strategy Tempo.dck index d7c68e0e2b5..462966a6cc7 100644 --- a/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 3 Strategy Tempo.dck +++ b/forge-gui/res/quest/world/1993-10 Limited Edition Beta/duels/LEB 3 Strategy Tempo.dck @@ -4,7 +4,7 @@ Name=LEB 3 Strategy: Tempo Title=Tempo Difficulty=hard Description="Why is it that great? It just gives you three mana."-Some scrub talking about Black Lotus -Icon=Dungeon Crawling Gold.jpg +Icon=Tempo.jpg Deck Type=constructed [Main] 1 Ancestral Recall|LEB From daf4b9d974b892e6fc76e97d63598258d94c362a Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Tue, 8 Jan 2019 03:25:43 +0000 Subject: [PATCH 559/901] ARN icons and some flavor text. --- .../challenges/ARN Challenge 1W Shahryar.dck | 2 +- .../challenges/ARN Challenge 2U The Saltrem Tor.dck | 2 +- .../challenges/ARN Challenge 3B The Aga-Galneer.dck | 2 +- .../challenges/ARN Challenge 4R The Queltosh.dck | 2 +- .../challenges/ARN Challenge 5G The Alt-A-Kesh.dck | 2 +- .../challenges/ARN Challenge The Ogres.dck | 2 +- .../1993-12 Arabian Nights/duels/ARN 1 Color 0C Jandor.dck | 2 +- .../duels/ARN 1 Color 1W The Cavalry.dck | 2 +- .../1993-12 Arabian Nights/duels/ARN 1 Color 2U Sindbad.dck | 2 +- .../1993-12 Arabian Nights/duels/ARN 1 Color 3B Nailah.dck | 2 +- .../duels/ARN 1 Color 4R Ali Baba.dck | 2 +- .../duels/ARN 1 Color 5G The Wilds.dck | 2 +- .../duels/ARN 2 Gimmick 4-Color Aggro.dck | 2 +- .../duels/ARN 2 Gimmick Djinns Efreets.dck | 2 +- .../duels/ARN 2 Gimmick Eggs Honey.dck | 6 +++--- .../1993-12 Arabian Nights/duels/ARN 2 Gimmick No Life.dck | 6 +++--- .../duels/ARN 2 Gimmick Operation Jumbo Drop.dck | 2 +- .../duels/ARN 3 Strategy Air Assault.dck | 2 +- .../duels/ARN 3 Strategy Black Blue Midrange.dck | 2 +- .../duels/ARN 3 Strategy Patriarch Control.dck | 2 +- .../duels/ARN 3 Strategy The Rock.dck | 2 +- .../duels/ARN 3 Strategy White Weenie.dck | 2 +- 22 files changed, 26 insertions(+), 26 deletions(-) diff --git a/forge-gui/res/quest/world/1993-12 Arabian Nights/challenges/ARN Challenge 1W Shahryar.dck b/forge-gui/res/quest/world/1993-12 Arabian Nights/challenges/ARN Challenge 1W Shahryar.dck index eb15636b546..60eaf15425c 100644 --- a/forge-gui/res/quest/world/1993-12 Arabian Nights/challenges/ARN Challenge 1W Shahryar.dck +++ b/forge-gui/res/quest/world/1993-12 Arabian Nights/challenges/ARN Challenge 1W Shahryar.dck @@ -12,7 +12,7 @@ Name=ARN Challenge: 1W Shahryar Title=Shahryar Difficulty=medium Description=The people of Baghdad suffer under the harsh laws of their ruler, Shahryar. Can you overthrow this tyrant? -Icon=Dungeon Crawling White.jpg +Icon=Shahryar.jpg Deck Type=constructed [main] 70 Eye for an Eye|ARN diff --git a/forge-gui/res/quest/world/1993-12 Arabian Nights/challenges/ARN Challenge 2U The Saltrem Tor.dck b/forge-gui/res/quest/world/1993-12 Arabian Nights/challenges/ARN Challenge 2U The Saltrem Tor.dck index c1e6a433084..a6c0ba49daa 100644 --- a/forge-gui/res/quest/world/1993-12 Arabian Nights/challenges/ARN Challenge 2U The Saltrem Tor.dck +++ b/forge-gui/res/quest/world/1993-12 Arabian Nights/challenges/ARN Challenge 2U The Saltrem Tor.dck @@ -12,7 +12,7 @@ Name=ARN Challenge: 2U The Saltrem Tor Title=The Saltrem Tor Difficulty=medium Description=This blue djinn is terrorizing the Island of Wak-Wak, demanding human sacrifice. It has summoned a formidable Serendib Djinn to fight its challengers. Can you defeat these evil creatures and save the islanders? -Icon=Dungeon Crawling Blue.jpg +Icon=Saltrem Tor.jpg Deck Type=constructed [main] 60 Island of Wak-Wak|ARN diff --git a/forge-gui/res/quest/world/1993-12 Arabian Nights/challenges/ARN Challenge 3B The Aga-Galneer.dck b/forge-gui/res/quest/world/1993-12 Arabian Nights/challenges/ARN Challenge 3B The Aga-Galneer.dck index 562e2780169..7b575c7d0f4 100644 --- a/forge-gui/res/quest/world/1993-12 Arabian Nights/challenges/ARN Challenge 3B The Aga-Galneer.dck +++ b/forge-gui/res/quest/world/1993-12 Arabian Nights/challenges/ARN Challenge 3B The Aga-Galneer.dck @@ -12,7 +12,7 @@ Name=ARN Challenge: 3B The Aga-Galneer Title=The Aga-Galneer Difficulty=medium Description=A black cloud lies over the city of Alexandria, covering it in eternal darkness. The black djinn has plunged the city's inhabitants into a nightmarish sleep from which there is no escape. Can you free Alexandria from oblivion? -Icon=Dungeon Crawling Black.jpg +Icon=Aga Galneer.jpg Deck Type=constructed [main] 600 Oubliette|ARN|2 diff --git a/forge-gui/res/quest/world/1993-12 Arabian Nights/challenges/ARN Challenge 4R The Queltosh.dck b/forge-gui/res/quest/world/1993-12 Arabian Nights/challenges/ARN Challenge 4R The Queltosh.dck index d1b4e35d90e..89d2ff3e404 100644 --- a/forge-gui/res/quest/world/1993-12 Arabian Nights/challenges/ARN Challenge 4R The Queltosh.dck +++ b/forge-gui/res/quest/world/1993-12 Arabian Nights/challenges/ARN Challenge 4R The Queltosh.dck @@ -12,7 +12,7 @@ Name=ARN Challenge: 4R The Queltosh Title=The Queltosh Difficulty=medium Description=This red djinn is laying waste to the city of Cairo with a powerful magic weapon. Can you stop the creature? -Icon=Dungeon Crawling Red.jpg +Icon=Queltosh.jpg Deck Type=constructed [main] 60 Desert Nomads|ARN diff --git a/forge-gui/res/quest/world/1993-12 Arabian Nights/challenges/ARN Challenge 5G The Alt-A-Kesh.dck b/forge-gui/res/quest/world/1993-12 Arabian Nights/challenges/ARN Challenge 5G The Alt-A-Kesh.dck index 5a35ddc5e2a..227ea0fb7bd 100644 --- a/forge-gui/res/quest/world/1993-12 Arabian Nights/challenges/ARN Challenge 5G The Alt-A-Kesh.dck +++ b/forge-gui/res/quest/world/1993-12 Arabian Nights/challenges/ARN Challenge 5G The Alt-A-Kesh.dck @@ -12,7 +12,7 @@ Name=ARN Challenge: 5G The Alt-A-Kesh Title=The Alt-A-Kesh Difficulty=medium Description=This green djinn has summoned a cyclone of epic proportions that threatens to destroy the city of Mecca. Can you reach the eye of the storm and defeat this foul creature? -Icon=Dungeon Crawling Green.jpg +Icon=Alt-A-Kesh.jpg Deck Type=constructed [main] 30 Forest|LEA|1 diff --git a/forge-gui/res/quest/world/1993-12 Arabian Nights/challenges/ARN Challenge The Ogres.dck b/forge-gui/res/quest/world/1993-12 Arabian Nights/challenges/ARN Challenge The Ogres.dck index c171a7631d3..45175b277a9 100644 --- a/forge-gui/res/quest/world/1993-12 Arabian Nights/challenges/ARN Challenge The Ogres.dck +++ b/forge-gui/res/quest/world/1993-12 Arabian Nights/challenges/ARN Challenge The Ogres.dck @@ -12,7 +12,7 @@ Name=ARN Challenge: The Ogres Title=The Ogres Difficulty=hard Description="Layers! Onions have layers. Ogres have layers. Onions have layers. You get it; we both have layers!" -Shrek -Icon=Dungeon Crawling Green.jpg +Icon=The Ogres.jpg Deck Type=constructed [main] 20 Forest|LEB|1 diff --git a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 1 Color 0C Jandor.dck b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 1 Color 0C Jandor.dck index 7a3371b185c..69d805f1fc6 100644 --- a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 1 Color 0C Jandor.dck +++ b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 1 Color 0C Jandor.dck @@ -4,7 +4,7 @@ Name=ARN 1 Color: 0C Jandor Title=Jandor Difficulty=easy Description=Bobbing merrily from opponent to opponent, the scimitar began adding playful little flourishes to its strokes; it even turned a couple of somersaults. -Icon=Dungeon Crawling Colorless.jpg +Icon=Jandor.jpg Deck Type=constructed [Main] 2 Aladdin's Lamp|ARN diff --git a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 1 Color 1W The Cavalry.dck b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 1 Color 1W The Cavalry.dck index 46f82b8bec4..36c5e45d82b 100644 --- a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 1 Color 1W The Cavalry.dck +++ b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 1 Color 1W The Cavalry.dck @@ -4,7 +4,7 @@ Name=ARN 1 Color: 1W The Cavalry Title=The Cavalry Difficulty=easy Description=Members of the elite Moorish Cavalry are very particular about their mounts, choosing only those whose bloodlines have been pure for generations. -Icon=Dungeon Crawling White.jpg +Icon=The Cavalry.jpg Deck Type=constructed [Main] 2 Abu Ja'far|ARN diff --git a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 1 Color 2U Sindbad.dck b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 1 Color 2U Sindbad.dck index b8d98219367..505c909bef5 100644 --- a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 1 Color 2U Sindbad.dck +++ b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 1 Color 2U Sindbad.dck @@ -4,7 +4,7 @@ Name=ARN 1 Color: 2U Sindbad Title=Sindbad Difficulty=easy Description=Then the maiden bade him cast off his robes and cover his body with fishliver oil, that he might safely follow her into the sea. -Icon=Dungeon Crawling Blue.jpg +Icon=Sindbad.jpg Deck Type=constructed [Main] 4 Dandan|ARN diff --git a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 1 Color 3B Nailah.dck b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 1 Color 3B Nailah.dck index 7aeab9e9706..8960b69ffb2 100644 --- a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 1 Color 3B Nailah.dck +++ b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 1 Color 3B Nailah.dck @@ -4,7 +4,7 @@ Name=ARN 1 Color: 3B Nailah Title=Nailah Difficulty=easy Description="We have always counted time with sand; this pinch is your meaningless life." -Nailah, self-proclaimed Queen of Rabiah -Icon=Dungeon Crawling Black.jpg +Icon=Nailah.jpg Deck Type=constructed [Main] 4 Cuombajj Witches|ARN diff --git a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 1 Color 4R Ali Baba.dck b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 1 Color 4R Ali Baba.dck index b8d219de50c..8e1dc4e300b 100644 --- a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 1 Color 4R Ali Baba.dck +++ b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 1 Color 4R Ali Baba.dck @@ -4,7 +4,7 @@ Name=ARN 1 Color: 4R Ali Baba Title=Ali Baba Difficulty=easy Description="When he reached the entrance of the cavern, he pronounced the words, 'Open, Sesame'" -The Arabian Nights, Junior Classics trans. -Icon=Dungeon Crawling Red.jpg +Icon=Ali Baba.jpg Deck Type=constructed [Main] 2 Aladdin|ARN diff --git a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 1 Color 5G The Wilds.dck b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 1 Color 5G The Wilds.dck index 604ab91f501..0dac87bff79 100644 --- a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 1 Color 5G The Wilds.dck +++ b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 1 Color 5G The Wilds.dck @@ -4,7 +4,7 @@ Name=ARN 1 Color: 5G The Wilds Title=The Wilds Difficulty=easy Description="When one wolf calls, others follow. Who wants to fight creatures that eat scorpions?" -Maimun al-Wyluli, Diary -Icon=Dungeon Crawling Green.jpg +Icon=The Wilds.jpg Deck Type=constructed [Main] 4 Brass Man|ARN diff --git a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 2 Gimmick 4-Color Aggro.dck b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 2 Gimmick 4-Color Aggro.dck index 23ba587225c..72f9ba7982d 100644 --- a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 2 Gimmick 4-Color Aggro.dck +++ b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 2 Gimmick 4-Color Aggro.dck @@ -4,7 +4,7 @@ Name=ARN 2 Gimmick: 4-Color Aggro Title=4-Color Aggro Difficulty=hard Description=Sometimes those with the most sin cast the first stones. -Icon=Dungeon Crawling Gold.jpg +Icon=4-Color Aggro.jpg Deck Type=constructed [Main] 4 Brass Man|ARN diff --git a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 2 Gimmick Djinns Efreets.dck b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 2 Gimmick Djinns Efreets.dck index 2e07a231f20..2de939fb6bd 100644 --- a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 2 Gimmick Djinns Efreets.dck +++ b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 2 Gimmick Djinns Efreets.dck @@ -4,7 +4,7 @@ Name=ARN 2 Gimmick: Djinns & Efreets Title=Djinns & Efreets Difficulty=medium Description="But oh, to be free! To be my own master. Such a thing would be greater than all the magic and all the treasure in all the world." -The Genie, Disney's Aladdin -Icon=Dungeon Crawling Gold.jpg +Icon=Djinns & Efreets.jpg Deck Type=constructed [Main] 4 Bottle of Suleiman|ARN diff --git a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 2 Gimmick Eggs Honey.dck b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 2 Gimmick Eggs Honey.dck index 16cc909ac2d..c398fbb4bf2 100644 --- a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 2 Gimmick Eggs Honey.dck +++ b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 2 Gimmick Eggs Honey.dck @@ -1,10 +1,10 @@ [duel] [metadata] Name=ARN 2 Gimmick: Eggs & Honey -Title=Eggs & Honey +Title=A Drop of Honey Difficulty=medium -Description="You can't make an omelette without breaking eggs" -Lieutenant General Francois de Charette, extenuating the number of deaths for which he was responsible -Icon=Dungeon Crawling Gold.jpg +Description=A drop fell to the ground, whereupon the flies flocked to it and a bird swooped down upon the flies. The oilman's cat sprang upon the bird, and the hunter's dog slew the cat. The oilman slew the dog, and then the murders began... +Icon=Eggs and Honey.jpg Deck Type=constructed [Main] 2 Aladdin's Ring|ARN diff --git a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 2 Gimmick No Life.dck b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 2 Gimmick No Life.dck index db7ef13b333..d86b71f8fe8 100644 --- a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 2 Gimmick No Life.dck +++ b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 2 Gimmick No Life.dck @@ -1,10 +1,10 @@ [duel] [metadata] Name=ARN 2 Gimmick: No Life -Title=No Life +Title=Quicksilver Ali Difficulty=medium -Description="How do you kill that which has no life?" -South Park s10e08: Make Love, Not Warcraft -Icon=Dungeon Crawling Gold.jpg +Description=There lived once at Cairo a sharper named Ali, for whom the Master of Police used to set snares and think that he had fallen therein; but, when they sought for him, they found that he had fled like quicksilver. +Icon=No Life.jpg Deck Type=constructed [Main] 4 Ali from Cairo|ARN diff --git a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 2 Gimmick Operation Jumbo Drop.dck b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 2 Gimmick Operation Jumbo Drop.dck index 953109b84f2..9002bdae212 100644 --- a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 2 Gimmick Operation Jumbo Drop.dck +++ b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 2 Gimmick Operation Jumbo Drop.dck @@ -4,7 +4,7 @@ Name=ARN 2 Gimmick: Operation Jumbo Drop Title=Operation Jumbo Drop Difficulty=medium Description="When elephants fight it is the grass that suffers." -Kikuyu Proverb -Icon=Dungeon Crawling Gold.jpg +Icon=Operation Jumbo Drop.jpg Deck Type=constructed [Main] 2 Aladdin's Ring|ARN diff --git a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 3 Strategy Air Assault.dck b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 3 Strategy Air Assault.dck index bbb24672110..f45980d6bb3 100644 --- a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 3 Strategy Air Assault.dck +++ b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 3 Strategy Air Assault.dck @@ -4,7 +4,7 @@ Name=ARN 3 Strategy: Air Assault Title=Air Assault Difficulty=hard Description=Saffiyah clapped her hands and twenty flying men appeared at her side, each well trained in the art of combat. -Icon=Dungeon Crawling Gold.jpg +Icon=Air Assault.jpg Deck Type=constructed [Main] 2 Aladdin's Ring|ARN diff --git a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 3 Strategy Black Blue Midrange.dck b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 3 Strategy Black Blue Midrange.dck index 21623a7075c..7a9f617e2e7 100644 --- a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 3 Strategy Black Blue Midrange.dck +++ b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 3 Strategy Black Blue Midrange.dck @@ -4,7 +4,7 @@ Name=ARN 3 Strategy: Black & Blue Midrange Title=Black & Blue Midrange Difficulty=hard Description=Summoners of efreeti remember only the power of command, never the sting of regret. -Icon=Dungeon Crawling Gold.jpg +Icon=Black & Blue Midrange.jpg Deck Type=constructed [Main] 4 Brass Man|ARN diff --git a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 3 Strategy Patriarch Control.dck b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 3 Strategy Patriarch Control.dck index fe5f73f6ad3..8d216c666fb 100644 --- a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 3 Strategy Patriarch Control.dck +++ b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 3 Strategy Patriarch Control.dck @@ -4,7 +4,7 @@ Name=ARN 3 Strategy: Patriarch Control Title=Patriarch Control Difficulty=hard Description="We made tempestuous winds obedient to Solomon... And many of the devils We also made obedient to him." -The Qur'an, 21:81 -Icon=Dungeon Crawling Gold.jpg +Icon=Patriarch Control.jpg Deck Type=constructed [Main] 4 Abu Ja'far|ARN diff --git a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 3 Strategy The Rock.dck b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 3 Strategy The Rock.dck index aa97852dbc8..cf8713e4c91 100644 --- a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 3 Strategy The Rock.dck +++ b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 3 Strategy The Rock.dck @@ -4,7 +4,7 @@ Name=ARN 3 Strategy: The Rock Title=The Rock Difficulty=hard Description="After these words the magician drew a ring off his finger, and put it on one of Aladdin's, saying: 'It is a talisman against all evil, so long as you obey me.'" -The Arabian Nights, Junior Classics trans. -Icon=Dungeon Crawling Gold.jpg +Icon=The Rock.jpg Deck Type=constructed [Main] 2 Aladdin's Ring|ARN diff --git a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 3 Strategy White Weenie.dck b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 3 Strategy White Weenie.dck index ead71ab8171..8c19462e093 100644 --- a/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 3 Strategy White Weenie.dck +++ b/forge-gui/res/quest/world/1993-12 Arabian Nights/duels/ARN 3 Strategy White Weenie.dck @@ -4,7 +4,7 @@ Name=ARN 3 Strategy: White Weenie Title=White Weenie Difficulty=hard Description=On the day of victory no one is tired. -Arab proverb -Icon=Dungeon Crawling White.jpg +Icon=White Weenie.jpg Deck Type=constructed [Main] 4 Abu Ja'far|ARN From 024b2e1a01c8b2800bbce9ebe8b95f11803e3331 Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Wed, 9 Jan 2019 04:23:24 +0000 Subject: [PATCH 560/901] Add new quest opponent avatars to the downloader. --- forge-gui/res/lists/quest-opponent-icons.txt | 397 ++++++++++++++++++- 1 file changed, 396 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/lists/quest-opponent-icons.txt b/forge-gui/res/lists/quest-opponent-icons.txt index 86ab9a8657f..03b4f894a6c 100644 --- a/forge-gui/res/lists/quest-opponent-icons.txt +++ b/forge-gui/res/lists/quest-opponent-icons.txt @@ -1,12 +1,19 @@ +https://downloads.cardforge.org/images/icons/4-Color%20Aggro.jpg +https://downloads.cardforge.org/images/icons/A%20Thunderstorm.jpg https://downloads.cardforge.org/images/icons/A%20Wolf%20in%20Sheeps%20Clothing.jpg https://downloads.cardforge.org/images/icons/Abassi.jpg https://downloads.cardforge.org/images/icons/Abe%20Sapien.jpg https://downloads.cardforge.org/images/icons/Abiku.jpg https://downloads.cardforge.org/images/icons/Abraham%20Lincoln.jpg +https://downloads.cardforge.org/images/icons/Adun%20Oakenshield.jpg +https://downloads.cardforge.org/images/icons/Advanced%20Zealotry.jpg +https://downloads.cardforge.org/images/icons/Aga%20Galneer.jpg https://downloads.cardforge.org/images/icons/Agent%20K.jpg +https://downloads.cardforge.org/images/icons/Agonistes.jpg https://downloads.cardforge.org/images/icons/Agrus.jpg https://downloads.cardforge.org/images/icons/AidoHwedo.jpg https://downloads.cardforge.org/images/icons/Aigamuxa.jpg +https://downloads.cardforge.org/images/icons/Air%20Assault.jpg https://downloads.cardforge.org/images/icons/Air-Walker.jpg https://downloads.cardforge.org/images/icons/Ajok.jpg https://downloads.cardforge.org/images/icons/Akongo.jpg @@ -14,97 +21,195 @@ https://downloads.cardforge.org/images/icons/Ala.jpg https://downloads.cardforge.org/images/icons/Aladdin.jpg https://downloads.cardforge.org/images/icons/Albert%20Einstein.jpg https://downloads.cardforge.org/images/icons/Albus%20Dumbledore.jpg +https://downloads.cardforge.org/images/icons/Ali%20Baba.jpg https://downloads.cardforge.org/images/icons/Alice%20in%20Wonderland.jpg +https://downloads.cardforge.org/images/icons/Alkiviades.jpg https://downloads.cardforge.org/images/icons/Alouroua.jpg +https://downloads.cardforge.org/images/icons/Alpha%20Mono%20Black.jpg +https://downloads.cardforge.org/images/icons/Alt-A-Kesh.jpg https://downloads.cardforge.org/images/icons/Amadioha.jpg https://downloads.cardforge.org/images/icons/Amphibian.jpg https://downloads.cardforge.org/images/icons/Anakin%20Skywalker.jpg https://downloads.cardforge.org/images/icons/Anansi.jpg https://downloads.cardforge.org/images/icons/Ancient%20Battlefield.jpg +https://downloads.cardforge.org/images/icons/Angelic%20Might.jpg +https://downloads.cardforge.org/images/icons/Angus%20Mackenzie.jpg +https://downloads.cardforge.org/images/icons/An-Havva.jpg https://downloads.cardforge.org/images/icons/Animar.jpg https://downloads.cardforge.org/images/icons/Anubis.jpg +https://downloads.cardforge.org/images/icons/Ape%20Lord.jpg https://downloads.cardforge.org/images/icons/Apu%20Nahasapeemapetilon.jpg https://downloads.cardforge.org/images/icons/Aquaman.jpg https://downloads.cardforge.org/images/icons/Aqueduct.jpg https://downloads.cardforge.org/images/icons/Aragorn.jpg +https://downloads.cardforge.org/images/icons/Arboria.jpg +https://downloads.cardforge.org/images/icons/Archangel.jpg +https://downloads.cardforge.org/images/icons/Archon%20Namani.jpg +https://downloads.cardforge.org/images/icons/Argive.jpg +https://downloads.cardforge.org/images/icons/Argoth.jpg https://downloads.cardforge.org/images/icons/Ariel.jpg https://downloads.cardforge.org/images/icons/Arjun.jpg +https://downloads.cardforge.org/images/icons/Arney%20Swalritz.jpg +https://downloads.cardforge.org/images/icons/Arzakon.jpg https://downloads.cardforge.org/images/icons/Asanbosam.jpg +https://downloads.cardforge.org/images/icons/Aspect%20of%20Air.jpg +https://downloads.cardforge.org/images/icons/Aspect%20of%20Chaos.jpg +https://downloads.cardforge.org/images/icons/Aspect%20of%20Civilization.jpg +https://downloads.cardforge.org/images/icons/Aspect%20of%20Corruption.jpg +https://downloads.cardforge.org/images/icons/Aspect%20of%20Death.jpg +https://downloads.cardforge.org/images/icons/Aspect%20of%20Decay.jpg +https://downloads.cardforge.org/images/icons/Aspect%20of%20Earth.jpg +https://downloads.cardforge.org/images/icons/Aspect%20of%20Evil.jpg +https://downloads.cardforge.org/images/icons/Aspect%20of%20Fire.jpg +https://downloads.cardforge.org/images/icons/Aspect%20of%20Good.jpg +https://downloads.cardforge.org/images/icons/Aspect%20of%20Growth.jpg +https://downloads.cardforge.org/images/icons/Aspect%20of%20Instinct.jpg +https://downloads.cardforge.org/images/icons/Aspect%20of%20Intellect.jpg +https://downloads.cardforge.org/images/icons/Aspect%20of%20Life.jpg +https://downloads.cardforge.org/images/icons/Aspect%20of%20Nature.jpg +https://downloads.cardforge.org/images/icons/Aspect%20of%20Order.jpg +https://downloads.cardforge.org/images/icons/Aspect%20of%20Peace.jpg +https://downloads.cardforge.org/images/icons/Aspect%20of%20Purity.jpg +https://downloads.cardforge.org/images/icons/Aspect%20of%20War.jpg +https://downloads.cardforge.org/images/icons/Aspect%20of%20Water.jpg +https://downloads.cardforge.org/images/icons/Assassin.jpg +https://downloads.cardforge.org/images/icons/Astral%20Visionary.jpg https://downloads.cardforge.org/images/icons/Atomic%20Robo.jpg https://downloads.cardforge.org/images/icons/Aurelia.jpg +https://downloads.cardforge.org/images/icons/Aurora.jpg +https://downloads.cardforge.org/images/icons/Autumn%20Willow.jpg +https://downloads.cardforge.org/images/icons/Aysen.jpg https://downloads.cardforge.org/images/icons/Aziza.jpg https://downloads.cardforge.org/images/icons/Azorius-precon.jpg https://downloads.cardforge.org/images/icons/Baal.jpg https://downloads.cardforge.org/images/icons/BabaluAye.jpg https://downloads.cardforge.org/images/icons/Baby%20Bonnie%20Hood.jpg +https://downloads.cardforge.org/images/icons/Balance.jpg https://downloads.cardforge.org/images/icons/Bamm%20Bamm%20Rubble.jpg https://downloads.cardforge.org/images/icons/Barney%20Rubble.jpg https://downloads.cardforge.org/images/icons/BaronCimitiere.jpg +https://downloads.cardforge.org/images/icons/Baron%20Leckba.jpg https://downloads.cardforge.org/images/icons/BaronSamedi.jpg +https://downloads.cardforge.org/images/icons/Baron%20Sengir.jpg https://downloads.cardforge.org/images/icons/Barroom%20Brawl.jpg https://downloads.cardforge.org/images/icons/Bart%20Simpson.jpg +https://downloads.cardforge.org/images/icons/Bartel%20Runeaxe.jpg +https://downloads.cardforge.org/images/icons/Basal%20Ramp.jpg https://downloads.cardforge.org/images/icons/Batman.jpg https://downloads.cardforge.org/images/icons/Beast.jpg https://downloads.cardforge.org/images/icons/Beast2.jpg +https://downloads.cardforge.org/images/icons/Beastmaster.jpg https://downloads.cardforge.org/images/icons/Bela%20Lugosi.jpg +https://downloads.cardforge.org/images/icons/Ben%20Djinn.jpg +https://downloads.cardforge.org/images/icons/Bendidret.jpg https://downloads.cardforge.org/images/icons/Bep.jpg +https://downloads.cardforge.org/images/icons/Beta%20Mono%20White.jpg https://downloads.cardforge.org/images/icons/Betty%20Rubble.jpg https://downloads.cardforge.org/images/icons/Bilbo%20Baggins.jpg +https://downloads.cardforge.org/images/icons/Big%20Rock.jpg https://downloads.cardforge.org/images/icons/Birdy%20the%20Mighty.jpg +https://downloads.cardforge.org/images/icons/Black.jpg https://downloads.cardforge.org/images/icons/Black%20Abott.jpg +https://downloads.cardforge.org/images/icons/Black%20%26%20Blue%20Midrange.jpg https://downloads.cardforge.org/images/icons/Black%20Flame.jpg https://downloads.cardforge.org/images/icons/Black%20Panther.jpg https://downloads.cardforge.org/images/icons/BlackPanther.jpg https://downloads.cardforge.org/images/icons/BlackTalon.jpg https://downloads.cardforge.org/images/icons/Blackbeard.jpg +https://downloads.cardforge.org/images/icons/Blind%20Faith.jpg https://downloads.cardforge.org/images/icons/Blood%20Oath.jpg +https://downloads.cardforge.org/images/icons/Blue.jpg https://downloads.cardforge.org/images/icons/Blue%20Devil.jpg +https://downloads.cardforge.org/images/icons/Blue%20Skies.jpg https://downloads.cardforge.org/images/icons/Boba%20Fett.jpg +https://downloads.cardforge.org/images/icons/Bontu%20the%20Glorified.jpg https://downloads.cardforge.org/images/icons/Borborygmos.jpg https://downloads.cardforge.org/images/icons/Boris%20Karloff.jpg https://downloads.cardforge.org/images/icons/Boromir.jpg https://downloads.cardforge.org/images/icons/Boros-precon.jpg +https://downloads.cardforge.org/images/icons/Bouncy%20Bouncy.jpg +https://downloads.cardforge.org/images/icons/Bound%20by%20Strength.jpg https://downloads.cardforge.org/images/icons/Brekyirihunuade.jpg https://downloads.cardforge.org/images/icons/Bridge%20Troll.jpg https://downloads.cardforge.org/images/icons/Brother%20Voodoo.jpg https://downloads.cardforge.org/images/icons/BrotherVoodoo.jpg https://downloads.cardforge.org/images/icons/Bruce%20Lee.jpg +https://downloads.cardforge.org/images/icons/Bubbles.jpg https://downloads.cardforge.org/images/icons/Buffy.jpg https://downloads.cardforge.org/images/icons/Bugs%20Bunny.jpg https://downloads.cardforge.org/images/icons/Bumba.jpg +https://downloads.cardforge.org/images/icons/Burn.jpg https://downloads.cardforge.org/images/icons/Bushwhacked.jpg https://downloads.cardforge.org/images/icons/C3PO.jpg https://downloads.cardforge.org/images/icons/Cable.jpg https://downloads.cardforge.org/images/icons/Caprio.jpg https://downloads.cardforge.org/images/icons/Captain%20America.jpg https://downloads.cardforge.org/images/icons/Carnage.jpg +https://downloads.cardforge.org/images/icons/Carnival%20of%20Blood.jpg https://downloads.cardforge.org/images/icons/Casper.jpg +https://downloads.cardforge.org/images/icons/Castle%20Sengir.jpg https://downloads.cardforge.org/images/icons/Catwoman.jpg https://downloads.cardforge.org/images/icons/Cave%20Troll.jpg +https://downloads.cardforge.org/images/icons/Centaur%20Shaman.jpg +https://downloads.cardforge.org/images/icons/Centaur%20Warchief.jpg +https://downloads.cardforge.org/images/icons/Chain%20Lightning.jpg +https://downloads.cardforge.org/images/icons/Chandra%2C%20Pyromaster.jpg https://downloads.cardforge.org/images/icons/Chewbacca.jpg https://downloads.cardforge.org/images/icons/Chief_Wiggum.jpg +https://downloads.cardforge.org/images/icons/Chilliphon.jpg +https://downloads.cardforge.org/images/icons/Chunk.jpg https://downloads.cardforge.org/images/icons/Cipher.jpg +https://downloads.cardforge.org/images/icons/Classic%20Control.jpg +https://downloads.cardforge.org/images/icons/Cleric.jpg +https://downloads.cardforge.org/images/icons/Cletus%20Heap.jpg +https://downloads.cardforge.org/images/icons/Clone.jpg https://downloads.cardforge.org/images/icons/Cohen%20the%20Barbarian.jpg https://downloads.cardforge.org/images/icons/Colossus.jpg https://downloads.cardforge.org/images/icons/Comic%20Book%20Guy.jpg https://downloads.cardforge.org/images/icons/Conan%20the%20Barbarian.jpg +https://downloads.cardforge.org/images/icons/Conjurer.jpg +https://downloads.cardforge.org/images/icons/Copper%20Tablet.jpg +https://downloads.cardforge.org/images/icons/Coranna.jpg +https://downloads.cardforge.org/images/icons/Corelius.jpg +https://downloads.cardforge.org/images/icons/Count%20Chuckula.jpg +https://downloads.cardforge.org/images/icons/Count%20Musgrave.jpg https://downloads.cardforge.org/images/icons/Cow.jpg https://downloads.cardforge.org/images/icons/Crocodile%20Dundee.jpg +https://downloads.cardforge.org/images/icons/Cromer.jpg https://downloads.cardforge.org/images/icons/Crows%20in%20the%20Field.jpg +https://downloads.cardforge.org/images/icons/Crusader.jpg +https://downloads.cardforge.org/images/icons/Cutiepie.jpg https://downloads.cardforge.org/images/icons/Cyclops.jpg https://downloads.cardforge.org/images/icons/Da%20Vinci.jpg +https://downloads.cardforge.org/images/icons/Damping%20Gremlins.jpg +https://downloads.cardforge.org/images/icons/Dark%20Sacrifice.jpg +https://downloads.cardforge.org/images/icons/Dark%20Souls.jpg https://downloads.cardforge.org/images/icons/Darkseid.jpg +https://downloads.cardforge.org/images/icons/Darkwon.jpg https://downloads.cardforge.org/images/icons/Darrin%20Stephens.jpg https://downloads.cardforge.org/images/icons/Darth%20Vader.jpg https://downloads.cardforge.org/images/icons/Data.jpg https://downloads.cardforge.org/images/icons/Dead%20Girl.jpg https://downloads.cardforge.org/images/icons/Deadpool.jpg +https://downloads.cardforge.org/images/icons/Death%20by%20Inches.jpg +https://downloads.cardforge.org/images/icons/Death%20of%20a%20Thousand%20Cuts.jpg +https://downloads.cardforge.org/images/icons/Deathfed.jpg +https://downloads.cardforge.org/images/icons/Deathly%20Dominion.jpg +https://downloads.cardforge.org/images/icons/Death%27s%20Encroach.jpg +https://downloads.cardforge.org/images/icons/Deep%20Blue%20Sea.jpg +https://downloads.cardforge.org/images/icons/Defense.jpg +https://downloads.cardforge.org/images/icons/Delgado%20Gordo.jpg +https://downloads.cardforge.org/images/icons/Dem%20Bones.jpg https://downloads.cardforge.org/images/icons/Demon.jpg +https://downloads.cardforge.org/images/icons/Demonic%20Archaeology.jpg https://downloads.cardforge.org/images/icons/Denethor.jpg +https://downloads.cardforge.org/images/icons/Desdemona.jpg https://downloads.cardforge.org/images/icons/Diablo.jpg https://downloads.cardforge.org/images/icons/Dilbert.jpg https://downloads.cardforge.org/images/icons/Dino.jpg https://downloads.cardforge.org/images/icons/Discord.jpg +https://downloads.cardforge.org/images/icons/Djinns%20%26%20Efreets.jpg +https://downloads.cardforge.org/images/icons/Dobinski%20Burhoff.jpg https://downloads.cardforge.org/images/icons/Doc%20Holiday.jpg https://downloads.cardforge.org/images/icons/Doctor%20John%20Zoidberg.jpg https://downloads.cardforge.org/images/icons/Doctor%20Strange.jpg @@ -119,7 +224,10 @@ https://downloads.cardforge.org/images/icons/Dr%20No.jpg https://downloads.cardforge.org/images/icons/Dr%20Strangelove.jpg https://downloads.cardforge.org/images/icons/Dr%20Watson.jpg https://downloads.cardforge.org/images/icons/Dracula.jpg +https://downloads.cardforge.org/images/icons/Dracur.jpg +https://downloads.cardforge.org/images/icons/Dragon%20Lord.jpg https://downloads.cardforge.org/images/icons/Dream.jpg +https://downloads.cardforge.org/images/icons/Druid.jpg https://downloads.cardforge.org/images/icons/Dungeon%20Crawling%20Black.jpg https://downloads.cardforge.org/images/icons/Dungeon%20Crawling%20Blue.jpg https://downloads.cardforge.org/images/icons/Dungeon%20Crawling%20Colorless.jpg @@ -129,28 +237,49 @@ https://downloads.cardforge.org/images/icons/Dungeon%20Crawling%20Red.jpg https://downloads.cardforge.org/images/icons/Dungeon%20Crawling%20White.jpg https://downloads.cardforge.org/images/icons/Edna%20Krabappel.jpg https://downloads.cardforge.org/images/icons/Edward%20Scissorhands.jpg +https://downloads.cardforge.org/images/icons/Eggs%20and%20Honey.jpg +https://downloads.cardforge.org/images/icons/Einstein.jpg https://downloads.cardforge.org/images/icons/Ekolo.jpg +https://downloads.cardforge.org/images/icons/Elashub.jpg https://downloads.cardforge.org/images/icons/Eldrazi.jpg +https://downloads.cardforge.org/images/icons/Eldritch Onslaught.jpg https://downloads.cardforge.org/images/icons/Electro.jpg https://downloads.cardforge.org/images/icons/Elegua.jpg +https://downloads.cardforge.org/images/icons/Elementalist.jpg +https://downloads.cardforge.org/images/icons/Elf%20Stephanie.jpg https://downloads.cardforge.org/images/icons/Elrond.jpg +https://downloads.cardforge.org/images/icons/Elvish%20Magi.jpg https://downloads.cardforge.org/images/icons/Emperor%20Palpatine.jpg https://downloads.cardforge.org/images/icons/Emrakul.jpg https://downloads.cardforge.org/images/icons/En%20Sabah%20Nur.jpg +https://downloads.cardforge.org/images/icons/Enchantress.jpg https://downloads.cardforge.org/images/icons/Endora.jpg https://downloads.cardforge.org/images/icons/Eomer.jpg +https://downloads.cardforge.org/images/icons/Equastis.jpg +https://downloads.cardforge.org/images/icons/Equilibrium.jpg https://downloads.cardforge.org/images/icons/Erebos.jpg +https://downloads.cardforge.org/images/icons/Er-Miral.jpg +https://downloads.cardforge.org/images/icons/Eron%20the%20Relentless.jpg https://downloads.cardforge.org/images/icons/Eshu.jpg +https://downloads.cardforge.org/images/icons/Eureka.jpg https://downloads.cardforge.org/images/icons/Ezio.jpg +https://downloads.cardforge.org/images/icons/Falstark.jpg https://downloads.cardforge.org/images/icons/Fat%20Albert.jpg https://downloads.cardforge.org/images/icons/Feldon.jpg +https://downloads.cardforge.org/images/icons/Fiery%20Dawn.jpg https://downloads.cardforge.org/images/icons/Fin%20Fang%20Foom.jpg https://downloads.cardforge.org/images/icons/Finn%20the%20Human.jpg https://downloads.cardforge.org/images/icons/Firestorm.jpg https://downloads.cardforge.org/images/icons/Flandre%20Scarlet.jpg +https://downloads.cardforge.org/images/icons/Fog.jpg +https://downloads.cardforge.org/images/icons/For%20Whom%20the%20Bell%20Tolls.jpg +https://downloads.cardforge.org/images/icons/Forest%20Dragon.jpg https://downloads.cardforge.org/images/icons/Frankenstein.jpg https://downloads.cardforge.org/images/icons/Fred%20Flintstone.jpg +https://downloads.cardforge.org/images/icons/Friar%20Twitchel.jpg https://downloads.cardforge.org/images/icons/Frodo.jpg +https://downloads.cardforge.org/images/icons/Funerary%20Rites.jpg +https://downloads.cardforge.org/images/icons/Fungus%20Master.jpg https://downloads.cardforge.org/images/icons/Ga-Gorib.jpg https://downloads.cardforge.org/images/icons/Gadget%20Hackwrench.jpg https://downloads.cardforge.org/images/icons/Galacticus.jpg @@ -158,40 +287,69 @@ https://downloads.cardforge.org/images/icons/Galadriel.jpg https://downloads.cardforge.org/images/icons/Galahad.jpg https://downloads.cardforge.org/images/icons/Gambit.jpg https://downloads.cardforge.org/images/icons/Gbadu.jpg +https://downloads.cardforge.org/images/icons/Geddon.jpg https://downloads.cardforge.org/images/icons/General%20Patton.jpg https://downloads.cardforge.org/images/icons/Genghis%20Khan.jpg https://downloads.cardforge.org/images/icons/George%20of%20the%20Jungle.jpg https://downloads.cardforge.org/images/icons/Ghost%20Council.jpg https://downloads.cardforge.org/images/icons/Ghost%20Rider.jpg +https://downloads.cardforge.org/images/icons/Gideon.jpg +https://downloads.cardforge.org/images/icons/Gideon%20Jura.jpg +https://downloads.cardforge.org/images/icons/Gideon%2C%20Martial%20Paragon.jpg +https://downloads.cardforge.org/images/icons/Gill%20Mann.jpg https://downloads.cardforge.org/images/icons/Gimli.jpg https://downloads.cardforge.org/images/icons/Gix.jpg +https://downloads.cardforge.org/images/icons/Gleeful%20Flames.jpg +https://downloads.cardforge.org/images/icons/Gloria.jpg +https://downloads.cardforge.org/images/icons/Goblin%20Lord.jpg +https://downloads.cardforge.org/images/icons/Goblins.jpg https://downloads.cardforge.org/images/icons/Gold%20Finger.jpg https://downloads.cardforge.org/images/icons/Gold%20Skurge.jpg https://downloads.cardforge.org/images/icons/Golgari-precon.jpg https://downloads.cardforge.org/images/icons/Gollum.jpg https://downloads.cardforge.org/images/icons/Grampa%20Simpson.jpg +https://downloads.cardforge.org/images/icons/Grave%20Power.jpg +https://downloads.cardforge.org/images/icons/Great%20Druid.jpg +https://downloads.cardforge.org/images/icons/Greater%20Lich.jpg +https://downloads.cardforge.org/images/icons/Greed.jpg +https://downloads.cardforge.org/images/icons/Green.jpg https://downloads.cardforge.org/images/icons/Green%20Arrow.jpg https://downloads.cardforge.org/images/icons/Green%20Hornet.jpg https://downloads.cardforge.org/images/icons/Green%20Lantern.jpg +https://downloads.cardforge.org/images/icons/Green%20Skies.jpg +https://downloads.cardforge.org/images/icons/Green%20Stuff.jpg +https://downloads.cardforge.org/images/icons/Greenie.jpg +https://downloads.cardforge.org/images/icons/Groucho.jpg https://downloads.cardforge.org/images/icons/Grumpy.jpg https://downloads.cardforge.org/images/icons/Gruul-precon.jpg https://downloads.cardforge.org/images/icons/Gunnery%20Sergeant%20Hartman.jpg +https://downloads.cardforge.org/images/icons/Gus.jpg https://downloads.cardforge.org/images/icons/Guybrush%20Threepwood.jpg +https://downloads.cardforge.org/images/icons/Gwendlyn%20Di%20Corci.jpg https://downloads.cardforge.org/images/icons/Hagrid.jpg +https://downloads.cardforge.org/images/icons/Halfdane.jpg https://downloads.cardforge.org/images/icons/Hameln.jpg +https://downloads.cardforge.org/images/icons/Hammerheim.jpg https://downloads.cardforge.org/images/icons/Han%20Solo.jpg https://downloads.cardforge.org/images/icons/Hans.jpg +https://downloads.cardforge.org/images/icons/Hapatra%2C%20Vizier%20of%20Poisons.jpg https://downloads.cardforge.org/images/icons/Happosai.jpg https://downloads.cardforge.org/images/icons/Harry%20Potter.jpg +https://downloads.cardforge.org/images/icons/Havenwood.jpg https://downloads.cardforge.org/images/icons/Havok.jpg +https://downloads.cardforge.org/images/icons/Hazduhr%20the%20Abbot.jpg +https://downloads.cardforge.org/images/icons/Hazoret%20the%20Fervent.jpg https://downloads.cardforge.org/images/icons/He-Man.jpg https://downloads.cardforge.org/images/icons/Heinz%20Doofenshmirtz.jpg https://downloads.cardforge.org/images/icons/Hellboy.jpg +https://downloads.cardforge.org/images/icons/Hellish%20Contraptions.jpg https://downloads.cardforge.org/images/icons/Hercules.jpg https://downloads.cardforge.org/images/icons/Hermes%20Conrad.jpg https://downloads.cardforge.org/images/icons/Hermione%20Granger.jpg https://downloads.cardforge.org/images/icons/Higgins.jpg +https://downloads.cardforge.org/images/icons/High%20Priest.jpg https://downloads.cardforge.org/images/icons/Hobbes.jpg +https://downloads.cardforge.org/images/icons/Hold%20the%20Line.jpg https://downloads.cardforge.org/images/icons/Homer%20Simpson.jpg https://downloads.cardforge.org/images/icons/Hookah-Smoking%20Caterpillar.jpg https://downloads.cardforge.org/images/icons/Horus.jpg @@ -199,7 +357,12 @@ https://downloads.cardforge.org/images/icons/Houngan.jpg https://downloads.cardforge.org/images/icons/House%20Party.jpg https://downloads.cardforge.org/images/icons/Hugo%20Drax.jpg https://downloads.cardforge.org/images/icons/Hulk.jpg +https://downloads.cardforge.org/images/icons/Humanity%27s%20Vengeance.jpg +https://downloads.cardforge.org/images/icons/Hunding%20Gjornersen.jpg +https://downloads.cardforge.org/images/icons/Hydra.jpg +https://downloads.cardforge.org/images/icons/Ian%20the%20Digester.jpg https://downloads.cardforge.org/images/icons/Iblis.jpg +https://downloads.cardforge.org/images/icons/Icatia.jpg https://downloads.cardforge.org/images/icons/Iceman.jpg https://downloads.cardforge.org/images/icons/Ice%20King.jpg https://downloads.cardforge.org/images/icons/IdiAmin.jpg @@ -213,6 +376,7 @@ https://downloads.cardforge.org/images/icons/InuYasha.jpg https://downloads.cardforge.org/images/icons/Invisible%20Man.jpg https://downloads.cardforge.org/images/icons/Iroh.jpg https://downloads.cardforge.org/images/icons/Iron%20Man.jpg +https://downloads.cardforge.org/images/icons/Isabella.jpg https://downloads.cardforge.org/images/icons/IsaBere.jpg https://downloads.cardforge.org/images/icons/Isis.jpg https://downloads.cardforge.org/images/icons/Isperia.jpg @@ -220,10 +384,14 @@ https://downloads.cardforge.org/images/icons/Izzet-precon.jpg https://downloads.cardforge.org/images/icons/Jabba%20the%20Hutt.jpg https://downloads.cardforge.org/images/icons/Jack%20Sparrow.jpg https://downloads.cardforge.org/images/icons/Jacob%20Grimm.jpg +https://downloads.cardforge.org/images/icons/Jacques%20le%20Vert.jpg +https://downloads.cardforge.org/images/icons/Jafar.jpg https://downloads.cardforge.org/images/icons/James%20Bond.jpg https://downloads.cardforge.org/images/icons/James%20T%20Kirk.jpg -https://downloads.cardforge.org/images/icons/Jafar.jpg +https://downloads.cardforge.org/images/icons/Jandor.jpg https://downloads.cardforge.org/images/icons/Jarad.jpg +https://downloads.cardforge.org/images/icons/Jasmine%20Boreal.jpg +https://downloads.cardforge.org/images/icons/Jedit%20Ojanen.jpg https://downloads.cardforge.org/images/icons/Jengu.jpg https://downloads.cardforge.org/images/icons/Jesse%20James.jpg https://downloads.cardforge.org/images/icons/Joe%20Kidd.jpg @@ -231,30 +399,53 @@ https://downloads.cardforge.org/images/icons/Joker.jpg https://downloads.cardforge.org/images/icons/Jubilee.jpg https://downloads.cardforge.org/images/icons/JuzamGenie.jpg https://downloads.cardforge.org/images/icons/Kane.jpg +https://downloads.cardforge.org/images/icons/Kane%20Garo%C3%BA%0D%0A.jpg https://downloads.cardforge.org/images/icons/Kang.jpg https://downloads.cardforge.org/images/icons/Kangee.jpg +https://downloads.cardforge.org/images/icons/Karakas.jpg https://downloads.cardforge.org/images/icons/Kasen%20Ibaraki.jpg https://downloads.cardforge.org/images/icons/Katara.jpg +https://downloads.cardforge.org/images/icons/Kefnet%20the%20Mindful.jpg https://downloads.cardforge.org/images/icons/KilijArslan.jpg https://downloads.cardforge.org/images/icons/King%20Arthur.jpg https://downloads.cardforge.org/images/icons/King%20Edward.jpg https://downloads.cardforge.org/images/icons/King%20Goldemar.jpg https://downloads.cardforge.org/images/icons/King%20Kong.jpg https://downloads.cardforge.org/images/icons/KingKong.jpg +https://downloads.cardforge.org/images/icons/Kiska-Ra.jpg +https://downloads.cardforge.org/images/icons/Kobolds.jpg https://downloads.cardforge.org/images/icons/Kojak.jpg +https://downloads.cardforge.org/images/icons/Koskun.jpg https://downloads.cardforge.org/images/icons/Kraj.jpg https://downloads.cardforge.org/images/icons/Krypto.jpg https://downloads.cardforge.org/images/icons/Kyouko%20Kasodani.jpg +https://downloads.cardforge.org/images/icons/Lacjs.jpg +https://downloads.cardforge.org/images/icons/Lady%20Musgrave.jpg +https://downloads.cardforge.org/images/icons/Lady%20Orca.jpg +https://downloads.cardforge.org/images/icons/Lair.jpg +https://downloads.cardforge.org/images/icons/Lance.jpg +https://downloads.cardforge.org/images/icons/Land%27s%20Edge.jpg +https://downloads.cardforge.org/images/icons/Lat-Nam.jpg https://downloads.cardforge.org/images/icons/Lazav.jpg https://downloads.cardforge.org/images/icons/LeChuck.jpg +https://downloads.cardforge.org/images/icons/Leeching%20Gremlins.jpg https://downloads.cardforge.org/images/icons/Leela.jpg +https://downloads.cardforge.org/images/icons/Lefterel.jpg https://downloads.cardforge.org/images/icons/Legolas.jpg https://downloads.cardforge.org/images/icons/Leprechaun.jpg +https://downloads.cardforge.org/images/icons/Leviathan.jpg https://downloads.cardforge.org/images/icons/Lex%20Luthor.jpg +https://downloads.cardforge.org/images/icons/Lief.jpg +https://downloads.cardforge.org/images/icons/Liliana%2C%20Death%20Wielder.jpg https://downloads.cardforge.org/images/icons/Lilith.jpg +https://downloads.cardforge.org/images/icons/Linc.jpg https://downloads.cardforge.org/images/icons/Link.jpg https://downloads.cardforge.org/images/icons/Lisa%20Simpson.jpg +https://downloads.cardforge.org/images/icons/Lizzy.jpg +https://downloads.cardforge.org/images/icons/Lord%20of%20Atlantis.jpg +https://downloads.cardforge.org/images/icons/Lord%20of%20Fate.jpg https://downloads.cardforge.org/images/icons/Luke%20Skywalker.jpg +https://downloads.cardforge.org/images/icons/Lumpy.jpg https://downloads.cardforge.org/images/icons/Luna%20Lovegood.jpg https://downloads.cardforge.org/images/icons/Lupin%20the%20Third.jpg https://downloads.cardforge.org/images/icons/Lyzolda.jpg @@ -267,46 +458,79 @@ https://downloads.cardforge.org/images/icons/MahamotiGenie.jpg https://downloads.cardforge.org/images/icons/Mahatma%20Gandhi.jpg https://downloads.cardforge.org/images/icons/MamanBrigitte.jpg https://downloads.cardforge.org/images/icons/MamiWata.jpg +https://downloads.cardforge.org/images/icons/Mana.jpg +https://downloads.cardforge.org/images/icons/Mandurang.jpg https://downloads.cardforge.org/images/icons/Marge%20Simpson.jpg +https://downloads.cardforge.org/images/icons/Marhault%20Elsdragon.jpg +https://downloads.cardforge.org/images/icons/Marsh%20Viper.jpg https://downloads.cardforge.org/images/icons/Master%20Splinter.jpg https://downloads.cardforge.org/images/icons/Mawu.jpg +https://downloads.cardforge.org/images/icons/Maze%20of%20Ith.jpg +https://downloads.cardforge.org/images/icons/Medusa.jpg +https://downloads.cardforge.org/images/icons/Merfolk%20Shaman.jpg +https://downloads.cardforge.org/images/icons/Mighty%20Red.jpg https://downloads.cardforge.org/images/icons/Milhouse_van_Houten.jpg +https://downloads.cardforge.org/images/icons/Mill.jpg +https://downloads.cardforge.org/images/icons/Milling%20Martyrs.jpg +https://downloads.cardforge.org/images/icons/Mind%20Stealer.jpg https://downloads.cardforge.org/images/icons/Minerva%20McGonagall.jpg https://downloads.cardforge.org/images/icons/Mines%20of%20Kazum%20Durl.jpg +https://downloads.cardforge.org/images/icons/Mishra.jpg https://downloads.cardforge.org/images/icons/Mister%20Fantastic.jpg https://downloads.cardforge.org/images/icons/Momir.jpg +https://downloads.cardforge.org/images/icons/Monstrous%20Surprise.jpg https://downloads.cardforge.org/images/icons/Montgomery%20Burns.jpg +https://downloads.cardforge.org/images/icons/Moon%20Shadow.jpg https://downloads.cardforge.org/images/icons/Morkus%20Rex.jpg +https://downloads.cardforge.org/images/icons/Mortal%20Wombat.jpg https://downloads.cardforge.org/images/icons/Morpheus.jpg https://downloads.cardforge.org/images/icons/Mortivore.jpg https://downloads.cardforge.org/images/icons/Mr%20Slate.jpg https://downloads.cardforge.org/images/icons/Mr%20Smith.jpg https://downloads.cardforge.org/images/icons/Mystique.jpg https://downloads.cardforge.org/images/icons/Nagini.jpg +https://downloads.cardforge.org/images/icons/Nagsnarf.jpg +https://downloads.cardforge.org/images/icons/Nailah.jpg https://downloads.cardforge.org/images/icons/Namor.jpg https://downloads.cardforge.org/images/icons/NanaBuruku.jpg https://downloads.cardforge.org/images/icons/Napoleon.jpg +https://downloads.cardforge.org/images/icons/Nchuah.jpg +https://downloads.cardforge.org/images/icons/Necromancer.jpg https://downloads.cardforge.org/images/icons/Ned%20Flanders.jpg https://downloads.cardforge.org/images/icons/Negoogunogumbar.jpg https://downloads.cardforge.org/images/icons/Neith.jpg https://downloads.cardforge.org/images/icons/Nekusar%20the%20Mindrazer.jpg https://downloads.cardforge.org/images/icons/Nelson%20Muntz.jpg https://downloads.cardforge.org/images/icons/Neo.jpg +https://downloads.cardforge.org/images/icons/Nether%20Fiend.jpg https://downloads.cardforge.org/images/icons/Newton.jpg https://downloads.cardforge.org/images/icons/Nibbler.jpg https://downloads.cardforge.org/images/icons/Nick%20Fury.jpg +https://downloads.cardforge.org/images/icons/Nicol%20Bolas%2C%20Planeswalker.jpg +https://downloads.cardforge.org/images/icons/Nicol%20Bolas%2C%20the%20Deceiver.jpg +https://downloads.cardforge.org/images/icons/Ninithili.jpg +https://downloads.cardforge.org/images/icons/Nissa%2C%20Genesis%20Mage.jpg +https://downloads.cardforge.org/images/icons/Nissa%2C%20Steward%20of%20Elements.jpg +https://downloads.cardforge.org/images/icons/Nissa%2C%20Worldwaker.jpg https://downloads.cardforge.org/images/icons/Niv%20Mizzet.jpg https://downloads.cardforge.org/images/icons/Niv-Mizzet.jpg +https://downloads.cardforge.org/images/icons/No%20Life.jpg +https://downloads.cardforge.org/images/icons/Northern%20Paladin.jpg https://downloads.cardforge.org/images/icons/Nyarvirazi.jpg https://downloads.cardforge.org/images/icons/Obatala.jpg https://downloads.cardforge.org/images/icons/Oberon.jpg +https://downloads.cardforge.org/images/icons/Octavian%20Muerto.jpg https://downloads.cardforge.org/images/icons/Odin.jpg https://downloads.cardforge.org/images/icons/Ododua.jpg https://downloads.cardforge.org/images/icons/Odysseus.jpg https://downloads.cardforge.org/images/icons/Ogun.jpg https://downloads.cardforge.org/images/icons/Oketra.jpg +https://downloads.cardforge.org/images/icons/Oketra%20the%20True.jpg https://downloads.cardforge.org/images/icons/Olokun.jpg +https://downloads.cardforge.org/images/icons/Operation%20Jumbo%20Drop.jpg +https://downloads.cardforge.org/images/icons/Ophelia.jpg https://downloads.cardforge.org/images/icons/Optimus%20Prime.jpg +https://downloads.cardforge.org/images/icons/Orcish%20Mine.jpg https://downloads.cardforge.org/images/icons/Oreius.jpg https://downloads.cardforge.org/images/icons/Orunmila.jpg https://downloads.cardforge.org/images/icons/Orzhov-precon.jpg @@ -314,22 +538,42 @@ https://downloads.cardforge.org/images/icons/Oshun.jpg https://downloads.cardforge.org/images/icons/Osiris.jpg https://downloads.cardforge.org/images/icons/Owlman.jpg https://downloads.cardforge.org/images/icons/Oya.jpg +https://downloads.cardforge.org/images/icons/Paladin.jpg https://downloads.cardforge.org/images/icons/PapaLegba.jpg +https://downloads.cardforge.org/images/icons/Papercuts.jpg +https://downloads.cardforge.org/images/icons/Patriarch%20Control.jpg +https://downloads.cardforge.org/images/icons/Patriot%20Control.jpg +https://downloads.cardforge.org/images/icons/Pavel%20Maliki.jpg https://downloads.cardforge.org/images/icons/Pebbles%20Flintstone.jpg +https://downloads.cardforge.org/images/icons/Pendelhaven.jpg https://downloads.cardforge.org/images/icons/Peregrin%20Took.jpg +https://downloads.cardforge.org/images/icons/Phenukenes.jpg +https://downloads.cardforge.org/images/icons/Phyrexia.jpg https://downloads.cardforge.org/images/icons/Picard.jpg https://downloads.cardforge.org/images/icons/Pinky%20and%20the%20Brain.jpg https://downloads.cardforge.org/images/icons/Piper.jpg +https://downloads.cardforge.org/images/icons/Pitiless%20Vizier.jpg +https://downloads.cardforge.org/images/icons/Plague%20Rats.jpg +https://downloads.cardforge.org/images/icons/Pogo.jpg +https://downloads.cardforge.org/images/icons/Poinyetta.jpg https://downloads.cardforge.org/images/icons/Pointy%20Haired%20Boss.jpg https://downloads.cardforge.org/images/icons/Preacher.jpg +https://downloads.cardforge.org/images/icons/Preachin%27%20Fire.jpg https://downloads.cardforge.org/images/icons/Predator.jpg https://downloads.cardforge.org/images/icons/PresterJohn.jpg +https://downloads.cardforge.org/images/icons/Pride%20%26%20Prejudice.jpg +https://downloads.cardforge.org/images/icons/Priestess.jpg +https://downloads.cardforge.org/images/icons/Primal%20Order.jpg +https://downloads.cardforge.org/images/icons/Prince%20Bolbuss.jpg https://downloads.cardforge.org/images/icons/Prince%20Valiant.jpg https://downloads.cardforge.org/images/icons/Princess%20Celestia.jpg https://downloads.cardforge.org/images/icons/Princess%20Selenia.jpg +https://downloads.cardforge.org/images/icons/Prismat.jpg https://downloads.cardforge.org/images/icons/Private%20Domain.jpg +https://downloads.cardforge.org/images/icons/Prodigal%20Sorcerer.jpg https://downloads.cardforge.org/images/icons/Professor%20X.jpg https://downloads.cardforge.org/images/icons/Pyro.jpg +https://downloads.cardforge.org/images/icons/Queltosh.jpg https://downloads.cardforge.org/images/icons/Quest%20for%20Ulas%20Temple.jpg https://downloads.cardforge.org/images/icons/Quicksilver.jpg https://downloads.cardforge.org/images/icons/R2-D2.jpg @@ -339,135 +583,286 @@ https://downloads.cardforge.org/images/icons/Radiant.jpg https://downloads.cardforge.org/images/icons/Radioactive%20Man.jpg https://downloads.cardforge.org/images/icons/Rakdos.jpg https://downloads.cardforge.org/images/icons/Rambo.jpg +https://downloads.cardforge.org/images/icons/Ramses%20Overdark.jpg https://downloads.cardforge.org/images/icons/Ras%20Al%20Ghul.jpg https://downloads.cardforge.org/images/icons/RasAlGhul.jpg https://downloads.cardforge.org/images/icons/Ratbert.jpg https://downloads.cardforge.org/images/icons/Raven.jpg +https://downloads.cardforge.org/images/icons/Razaketh%2C%20the%20Foulblooded.jpg https://downloads.cardforge.org/images/icons/Reactor%20Meltdown.jpg +https://downloads.cardforge.org/images/icons/Red.jpg https://downloads.cardforge.org/images/icons/Redwall.jpg +https://downloads.cardforge.org/images/icons/Reggae%20Man%20Rock.jpg https://downloads.cardforge.org/images/icons/Regigigas.jpg +https://downloads.cardforge.org/images/icons/Relentless%20Dead.jpg https://downloads.cardforge.org/images/icons/Remilia%20Scarlet.jpg +https://downloads.cardforge.org/images/icons/Repel%20the%20Dark.jpg https://downloads.cardforge.org/images/icons/Repressed%20Magic.jpg +https://downloads.cardforge.org/images/icons/Reveka%2C%20Wizard%20Savant.jpg https://downloads.cardforge.org/images/icons/Reverend%20Lovejoy.jpg +https://downloads.cardforge.org/images/icons/Rhonas%20the%20Indomitable.jpg +https://downloads.cardforge.org/images/icons/Ri.jpg https://downloads.cardforge.org/images/icons/Riddler.jpg https://downloads.cardforge.org/images/icons/Riptide.jpg +https://downloads.cardforge.org/images/icons/Riven%20Turnbull.jpg https://downloads.cardforge.org/images/icons/Robin%20Hood.jpg https://downloads.cardforge.org/images/icons/Robin.jpg https://downloads.cardforge.org/images/icons/Robot%20Santa.jpg https://downloads.cardforge.org/images/icons/Rocky.jpg https://downloads.cardforge.org/images/icons/Rogue.jpg +https://downloads.cardforge.org/images/icons/Room-Blk.jpg +https://downloads.cardforge.org/images/icons/Room-Blu.jpg +https://downloads.cardforge.org/images/icons/Room-Grn.jpg +https://downloads.cardforge.org/images/icons/Room-Red.jpg +https://downloads.cardforge.org/images/icons/Room-Wht.jpg +https://downloads.cardforge.org/images/icons/Rough%20Weather.jpg https://downloads.cardforge.org/images/icons/Sabertooth.jpg +https://downloads.cardforge.org/images/icons/Sainted%20One.jpg https://downloads.cardforge.org/images/icons/Sakpata.jpg https://downloads.cardforge.org/images/icons/Saladin.jpg +https://downloads.cardforge.org/images/icons/Saltrem%20Tor.jpg https://downloads.cardforge.org/images/icons/Samantha%20Stephens.jpg https://downloads.cardforge.org/images/icons/Samwise%20Gamgee.jpg +https://downloads.cardforge.org/images/icons/Sanctuary.jpg https://downloads.cardforge.org/images/icons/SantaMuerte.jpg https://downloads.cardforge.org/images/icons/Saruman.jpg https://downloads.cardforge.org/images/icons/Sauron.jpg https://downloads.cardforge.org/images/icons/Savra.jpg +https://downloads.cardforge.org/images/icons/Scarab%20God.jpg https://downloads.cardforge.org/images/icons/Scarecrow.jpg https://downloads.cardforge.org/images/icons/Scooby%20Doo.jpg https://downloads.cardforge.org/images/icons/Scotty.jpg +https://downloads.cardforge.org/images/icons/Sea%20Dragon.jpg https://downloads.cardforge.org/images/icons/Seabiscuit.jpg https://downloads.cardforge.org/images/icons/Secret%20Squirrel.jpg +https://downloads.cardforge.org/images/icons/Sedge%20Beast.jpg +https://downloads.cardforge.org/images/icons/Sedge%20Midrange.jpg +https://downloads.cardforge.org/images/icons/Seer.jpg https://downloads.cardforge.org/images/icons/Selesnya-precon.jpg +https://downloads.cardforge.org/images/icons/Sen-Sei.jpg https://downloads.cardforge.org/images/icons/Sentinel.jpg https://downloads.cardforge.org/images/icons/SerendibGenie.jpg +https://downloads.cardforge.org/images/icons/Serra%27s%20Legacy.jpg https://downloads.cardforge.org/images/icons/Seth.jpg +https://downloads.cardforge.org/images/icons/Seti.jpg https://downloads.cardforge.org/images/icons/Severus%20Snape.jpg +https://downloads.cardforge.org/images/icons/Shadowstorm%20Vizier.jpg +https://downloads.cardforge.org/images/icons/Shahryar.jpg https://downloads.cardforge.org/images/icons/Shaitan.jpg +https://downloads.cardforge.org/images/icons/Shandalar.jpg https://downloads.cardforge.org/images/icons/Shango.jpg https://downloads.cardforge.org/images/icons/Shanna.jpg +https://downloads.cardforge.org/images/icons/Shapeshifter.jpg https://downloads.cardforge.org/images/icons/Sharee.jpg https://downloads.cardforge.org/images/icons/She-Hulk.jpg https://downloads.cardforge.org/images/icons/Shelob.jpg https://downloads.cardforge.org/images/icons/Sherlock%20Holmes.jpg https://downloads.cardforge.org/images/icons/Shrek.jpg +https://downloads.cardforge.org/images/icons/Sickly%20Growth.jpg https://downloads.cardforge.org/images/icons/Sideshow%20Bob.jpg https://downloads.cardforge.org/images/icons/Sidisi.jpg +https://downloads.cardforge.org/images/icons/Sienetta.jpg https://downloads.cardforge.org/images/icons/Silver%20Samurai.jpg https://downloads.cardforge.org/images/icons/Silver%20Surfer.jpg https://downloads.cardforge.org/images/icons/Simic-precon.jpg +https://downloads.cardforge.org/images/icons/Sindbad.jpg +https://downloads.cardforge.org/images/icons/Sir%20Pierce.jpg +https://downloads.cardforge.org/images/icons/Sir%20Shandlar%20of%20Eberyn.jpg https://downloads.cardforge.org/images/icons/Sisters%20of%20Stone%20Death.jpg +https://downloads.cardforge.org/images/icons/Sivitri%20Scarzam.jpg +https://downloads.cardforge.org/images/icons/Skull%20Dance.jpg https://downloads.cardforge.org/images/icons/Skynet.jpg +https://downloads.cardforge.org/images/icons/Slaughterhouse.jpg https://downloads.cardforge.org/images/icons/Sly%20Cooper.jpg https://downloads.cardforge.org/images/icons/Snow%20White.jpg https://downloads.cardforge.org/images/icons/Solaire.jpg +https://downloads.cardforge.org/images/icons/Soldiers.jpg +https://downloads.cardforge.org/images/icons/Solitary%20Fiends.jpg +https://downloads.cardforge.org/images/icons/Sol%27kanar%20the%20Swamp%20King.jpg +https://downloads.cardforge.org/images/icons/Son%20of%20Ri.jpg +https://downloads.cardforge.org/images/icons/Sorcerer.jpg +https://downloads.cardforge.org/images/icons/Sorceress.jpg https://downloads.cardforge.org/images/icons/Sorin.jpg +https://downloads.cardforge.org/images/icons/Spawn%20of%20Pogo.jpg +https://downloads.cardforge.org/images/icons/Spectral%20Legions.jpg +https://downloads.cardforge.org/images/icons/Spectre.jpg https://downloads.cardforge.org/images/icons/Sphinx.jpg https://downloads.cardforge.org/images/icons/Spiderman.jpg https://downloads.cardforge.org/images/icons/Spike%20Spiegel.jpg +https://downloads.cardforge.org/images/icons/Spiraling%20Doom.jpg +https://downloads.cardforge.org/images/icons/Splinter.jpg https://downloads.cardforge.org/images/icons/Spock.jpg https://downloads.cardforge.org/images/icons/Spyro.jpg +https://downloads.cardforge.org/images/icons/Squeezed.jpg https://downloads.cardforge.org/images/icons/StAnastacia.jpg https://downloads.cardforge.org/images/icons/Starfire.jpg +https://downloads.cardforge.org/images/icons/Storgard.jpg https://downloads.cardforge.org/images/icons/Storm.jpg https://downloads.cardforge.org/images/icons/Storm2.jpg +https://downloads.cardforge.org/images/icons/Stormy%20Skies.jpg https://downloads.cardforge.org/images/icons/Suika%20Ibuki.jpg +https://downloads.cardforge.org/images/icons/Summoner.jpg https://downloads.cardforge.org/images/icons/Sun%20Quan.jpg https://downloads.cardforge.org/images/icons/Superman.jpg https://downloads.cardforge.org/images/icons/Surtr.jpg https://downloads.cardforge.org/images/icons/Sus%20Antigoon.jpg https://downloads.cardforge.org/images/icons/Swan.jpg +https://downloads.cardforge.org/images/icons/Swift%20Justice.jpg https://downloads.cardforge.org/images/icons/Szadek.jpg https://downloads.cardforge.org/images/icons/Tanit.jpg https://downloads.cardforge.org/images/icons/Tarzan.jpg +https://downloads.cardforge.org/images/icons/Taste%20the%20Rainbow.jpg +https://downloads.cardforge.org/images/icons/Tempo.jpg https://downloads.cardforge.org/images/icons/Tenga.jpg https://downloads.cardforge.org/images/icons/Terminator.jpg https://downloads.cardforge.org/images/icons/Teysa.jpg https://downloads.cardforge.org/images/icons/Thanos.jpg +https://downloads.cardforge.org/images/icons/The%20Alchemist.jpg +https://downloads.cardforge.org/images/icons/The%20Artifacts.jpg +https://downloads.cardforge.org/images/icons/The%20Artillery.jpg +https://downloads.cardforge.org/images/icons/The%20Aviary.jpg https://downloads.cardforge.org/images/icons/The%20Backlash%20Machine.jpg +https://downloads.cardforge.org/images/icons/The%20Birds.jpg +https://downloads.cardforge.org/images/icons/The%20Cavalry.jpg +https://downloads.cardforge.org/images/icons/The%20Champions.jpg +https://downloads.cardforge.org/images/icons/The%20Church%20of%20Tal.jpg +https://downloads.cardforge.org/images/icons/The%20Clock.jpg +https://downloads.cardforge.org/images/icons/The%20Color%20Black.jpg +https://downloads.cardforge.org/images/icons/The%20Color%20Blue.jpg +https://downloads.cardforge.org/images/icons/The%20Color%20Green.jpg +https://downloads.cardforge.org/images/icons/The%20Color%20Red.jpg +https://downloads.cardforge.org/images/icons/The%20Color%20White.jpg +https://downloads.cardforge.org/images/icons/The%20Colosseum.jpg +https://downloads.cardforge.org/images/icons/The%20Conclave%20of%20Mages.jpg https://downloads.cardforge.org/images/icons/The%20Court%20Jester.jpg +https://downloads.cardforge.org/images/icons/The%20Dark%20Barony.jpg https://downloads.cardforge.org/images/icons/The%20Desert%20Caravan.jpg +https://downloads.cardforge.org/images/icons/The%20Dwarven%20Stronghold.jpg +https://downloads.cardforge.org/images/icons/The%20Ebon%20Hand.jpg +https://downloads.cardforge.org/images/icons/The%20Faeries.jpg +https://downloads.cardforge.org/images/icons/The%20Farrelite%20Cult.jpg +https://downloads.cardforge.org/images/icons/The%20Floating%20Isle.jpg +https://downloads.cardforge.org/images/icons/The%20Forgotten.jpg https://downloads.cardforge.org/images/icons/The%20Great%20Gatsby.jpg https://downloads.cardforge.org/images/icons/The%20Great%20Gazoo.jpg https://downloads.cardforge.org/images/icons/The%20Great%20and%20Powerful%20Trixie.jpg +https://downloads.cardforge.org/images/icons/The%20Great%20Wood.jpg +https://downloads.cardforge.org/images/icons/The%20Homarid%20Invasion.jpg +https://downloads.cardforge.org/images/icons/The%20Jester.jpg https://downloads.cardforge.org/images/icons/The%20Kings%20Contest.jpg +https://downloads.cardforge.org/images/icons/The%20Kithkin.jpg +https://downloads.cardforge.org/images/icons/The%20Lady%20of%20the%20Mountain.jpg https://downloads.cardforge.org/images/icons/The%20Mac%20Nac%20Feegle.jpg +https://downloads.cardforge.org/images/icons/The%20Marines.jpg +https://downloads.cardforge.org/images/icons/The%20Messenger.jpg +https://downloads.cardforge.org/images/icons/The%20Millstone.jpg +https://downloads.cardforge.org/images/icons/The%20Minotaurs.jpg +https://downloads.cardforge.org/images/icons/The%20Ogres.jpg +https://downloads.cardforge.org/images/icons/The%20Ooze.jpg +https://downloads.cardforge.org/images/icons/The%20Outpost%20of%20Montford.jpg https://downloads.cardforge.org/images/icons/The%20Pied%20Piper.jpg +https://downloads.cardforge.org/images/icons/The%20Pitdown%20Bog.jpg +https://downloads.cardforge.org/images/icons/The%20Poltergeist.jpg +https://downloads.cardforge.org/images/icons/The%20Raiders.jpg +https://downloads.cardforge.org/images/icons/The%20Rats.jpg +https://downloads.cardforge.org/images/icons/The%20Riddle%20of%20Steel.jpg +https://downloads.cardforge.org/images/icons/The%20Rock.jpg +https://downloads.cardforge.org/images/icons/The%20Rogues.jpg +https://downloads.cardforge.org/images/icons/The%20Ruins%20of%20Alsoor.jpg +https://downloads.cardforge.org/images/icons/The%20Sea.jpg +https://downloads.cardforge.org/images/icons/The%20Seasingers.jpg +https://downloads.cardforge.org/images/icons/The%20Serpents.jpg https://downloads.cardforge.org/images/icons/The%20Shade.jpg +https://downloads.cardforge.org/images/icons/The%20Shattered%20Isles.jpg +https://downloads.cardforge.org/images/icons/The%20Shielded%20Sea.jpg https://downloads.cardforge.org/images/icons/The%20Spectre.jpg +https://downloads.cardforge.org/images/icons/The%20Spirit%20Crafters.jpg +https://downloads.cardforge.org/images/icons/The%20Storm.jpg +https://downloads.cardforge.org/images/icons/The%20Tabernacle%20at%20Pendrell%20Vale.jpg +https://downloads.cardforge.org/images/icons/The%20Thallids.jpg +https://downloads.cardforge.org/images/icons/The%20Thallids%202.jpg https://downloads.cardforge.org/images/icons/The%20Thing.jpg +https://downloads.cardforge.org/images/icons/The%20Third%20Path.jpg +https://downloads.cardforge.org/images/icons/The%20Thrull%20Rebellion.jpg https://downloads.cardforge.org/images/icons/The%20Torpor%20Orb.jpg +https://downloads.cardforge.org/images/icons/The%20Town%20of%20Thorn.jpg https://downloads.cardforge.org/images/icons/The%20Very%20Hungry%20Caterpillar.jpg +https://downloads.cardforge.org/images/icons/The%20Wilds.jpg +https://downloads.cardforge.org/images/icons/The%20World%20Is%20Not%20Enough.jpg https://downloads.cardforge.org/images/icons/The%20Zombie.jpg +https://downloads.cardforge.org/images/icons/Thelon.jpg +https://downloads.cardforge.org/images/icons/Therza%20Dorc.jpg +https://downloads.cardforge.org/images/icons/Thievery.jpg +https://downloads.cardforge.org/images/icons/Thought%20Invoker.jpg https://downloads.cardforge.org/images/icons/Tibalt.jpg https://downloads.cardforge.org/images/icons/Tinkerbell.jpg +https://downloads.cardforge.org/images/icons/Titania.jpg https://downloads.cardforge.org/images/icons/Token.jpg +https://downloads.cardforge.org/images/icons/Tolaria.jpg https://downloads.cardforge.org/images/icons/Tolsimir.jpg https://downloads.cardforge.org/images/icons/Tom%20Bombadil.jpg https://downloads.cardforge.org/images/icons/Tombstone.jpg https://downloads.cardforge.org/images/icons/Totoro.jpg +https://downloads.cardforge.org/images/icons/Traiton.jpg https://downloads.cardforge.org/images/icons/Treebeard.jpg +https://downloads.cardforge.org/images/icons/Trevin.jpg +https://downloads.cardforge.org/images/icons/Troll%20Shaman.jpg +https://downloads.cardforge.org/images/icons/Tron.jpg https://downloads.cardforge.org/images/icons/Trostani.jpg +https://downloads.cardforge.org/images/icons/Tusk%20Guardian.jpg https://downloads.cardforge.org/images/icons/Tutankhamon.jpg https://downloads.cardforge.org/images/icons/Tweedledum.jpg https://downloads.cardforge.org/images/icons/Tweety.jpg +https://downloads.cardforge.org/images/icons/Two%20Feathers.jpg https://downloads.cardforge.org/images/icons/Ukulunkulu.jpg https://downloads.cardforge.org/images/icons/Ulasht.jpg https://downloads.cardforge.org/images/icons/Uncle%20Owen.jpg +https://downloads.cardforge.org/images/icons/Undead%20Knight.jpg +https://downloads.cardforge.org/images/icons/Urborg.jpg +https://downloads.cardforge.org/images/icons/Valdaar.jpg +https://downloads.cardforge.org/images/icons/Vampire%20Lord.jpg +https://downloads.cardforge.org/images/icons/Vance%20Elder.jpg https://downloads.cardforge.org/images/icons/Vanellope%20von%20Schweetz.jpg https://downloads.cardforge.org/images/icons/Varys.jpg https://downloads.cardforge.org/images/icons/Vegeta.jpg +https://downloads.cardforge.org/images/icons/Verduranti.jpg +https://downloads.cardforge.org/images/icons/Vermix.jpg https://downloads.cardforge.org/images/icons/Vic%20Stone.jpg +https://downloads.cardforge.org/images/icons/Vodalia.jpg +https://downloads.cardforge.org/images/icons/Vortex.jpg https://downloads.cardforge.org/images/icons/Waldo.jpg https://downloads.cardforge.org/images/icons/Walle.jpg +https://downloads.cardforge.org/images/icons/Wallolol.jpg https://downloads.cardforge.org/images/icons/Wally.jpg +https://downloads.cardforge.org/images/icons/War%20Mage.jpg +https://downloads.cardforge.org/images/icons/Warlock.jpg +https://downloads.cardforge.org/images/icons/Warlord%20of%20Kell.jpg https://downloads.cardforge.org/images/icons/Waterlord.jpg https://downloads.cardforge.org/images/icons/Waylon%20Smithers.jpg https://downloads.cardforge.org/images/icons/WereHyena.jpg +https://downloads.cardforge.org/images/icons/Wheel%20of%20Fortune.jpg +https://downloads.cardforge.org/images/icons/Whim.jpg +https://downloads.cardforge.org/images/icons/White.jpg https://downloads.cardforge.org/images/icons/White%20Knight.jpg +https://downloads.cardforge.org/images/icons/White%20Weenie.jpg https://downloads.cardforge.org/images/icons/Wilhelm%20Grimm.jpg https://downloads.cardforge.org/images/icons/Wilma%20Flintstone.jpg +https://downloads.cardforge.org/images/icons/Winged%20Stallion.jpg https://downloads.cardforge.org/images/icons/Winston%20Churchill.jpg +https://downloads.cardforge.org/images/icons/Witch.jpg https://downloads.cardforge.org/images/icons/WitchDoctor.jpg https://downloads.cardforge.org/images/icons/Wolverine.jpg https://downloads.cardforge.org/images/icons/Wonder%20Twins.jpg https://downloads.cardforge.org/images/icons/Wonder%20Woman.jpg +https://downloads.cardforge.org/images/icons/Wood%20Ramp.jpg +https://downloads.cardforge.org/images/icons/Wormwood.jpg https://downloads.cardforge.org/images/icons/Wyatt%20Earp.jpg +https://downloads.cardforge.org/images/icons/Yawgmoth.jpg https://downloads.cardforge.org/images/icons/Yemaya.jpg https://downloads.cardforge.org/images/icons/Yewa.jpg +https://downloads.cardforge.org/images/icons/Yma.jpg https://downloads.cardforge.org/images/icons/Yogi%20Bear.jpg +https://downloads.cardforge.org/images/icons/Zaevil%20Hand.jpg https://downloads.cardforge.org/images/icons/Zapp%20Brannigan.jpg https://downloads.cardforge.org/images/icons/Zegana.jpg https://downloads.cardforge.org/images/icons/Zeus.jpg From 576b7e2dd302be5935e1940302c29f90ee45ae1a Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Wed, 9 Jan 2019 04:35:52 +0000 Subject: [PATCH 561/901] fix kane --- forge-gui/res/lists/quest-opponent-icons.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/lists/quest-opponent-icons.txt b/forge-gui/res/lists/quest-opponent-icons.txt index 03b4f894a6c..59db3133193 100644 --- a/forge-gui/res/lists/quest-opponent-icons.txt +++ b/forge-gui/res/lists/quest-opponent-icons.txt @@ -399,7 +399,7 @@ https://downloads.cardforge.org/images/icons/Joker.jpg https://downloads.cardforge.org/images/icons/Jubilee.jpg https://downloads.cardforge.org/images/icons/JuzamGenie.jpg https://downloads.cardforge.org/images/icons/Kane.jpg -https://downloads.cardforge.org/images/icons/Kane%20Garo%C3%BA%0D%0A.jpg +https://downloads.cardforge.org/images/icons/Kane%20Garo%C3%BA.jpg https://downloads.cardforge.org/images/icons/Kang.jpg https://downloads.cardforge.org/images/icons/Kangee.jpg https://downloads.cardforge.org/images/icons/Karakas.jpg From b8f7d08fae2642e8a748851792809df0651b63ec Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Wed, 9 Jan 2019 05:50:07 +0000 Subject: [PATCH 562/901] Remove extraneous line --- forge-gui/res/lists/quest-opponent-icons.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-gui/res/lists/quest-opponent-icons.txt b/forge-gui/res/lists/quest-opponent-icons.txt index 59db3133193..ff4525f1020 100644 --- a/forge-gui/res/lists/quest-opponent-icons.txt +++ b/forge-gui/res/lists/quest-opponent-icons.txt @@ -293,7 +293,6 @@ https://downloads.cardforge.org/images/icons/Genghis%20Khan.jpg https://downloads.cardforge.org/images/icons/George%20of%20the%20Jungle.jpg https://downloads.cardforge.org/images/icons/Ghost%20Council.jpg https://downloads.cardforge.org/images/icons/Ghost%20Rider.jpg -https://downloads.cardforge.org/images/icons/Gideon.jpg https://downloads.cardforge.org/images/icons/Gideon%20Jura.jpg https://downloads.cardforge.org/images/icons/Gideon%2C%20Martial%20Paragon.jpg https://downloads.cardforge.org/images/icons/Gill%20Mann.jpg From 09fc3ae60c28b57d35c970ad112dc03f290a639a Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Wed, 9 Jan 2019 21:13:09 -0500 Subject: [PATCH 563/901] add new GUI interface allowing cards to be moved around in a list and use for arrangeForScry if preference UI_SELECT_FROM_CARD_DISPLAYS is set --- .../src/main/java/forge/util/Localizer.java | 2 +- .../src/main/java/forge/gui/GuiChoose.java | 28 +- .../java/forge/screens/match/CMatchUI.java | 6 + .../main/java/forge/view/arcane/CardArea.java | 4 +- .../forge/view/arcane/CardPanelContainer.java | 35 +- .../java/forge/view/arcane/ListCardArea.java | 317 ++++++++++++++++++ .../forge/screens/match/MatchController.java | 6 + .../main/java/forge/interfaces/IGuiGame.java | 5 + .../main/java/forge/net/ProtocolMethod.java | 1 + .../java/forge/net/server/NetGuiGame.java | 6 + .../forge/player/PlayerControllerHuman.java | 72 ++-- .../forge/properties/ForgePreferences.java | 2 +- 12 files changed, 443 insertions(+), 41 deletions(-) create mode 100644 forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java diff --git a/forge-core/src/main/java/forge/util/Localizer.java b/forge-core/src/main/java/forge/util/Localizer.java index 6463a9716c1..cc31a7f1af3 100644 --- a/forge-core/src/main/java/forge/util/Localizer.java +++ b/forge-core/src/main/java/forge/util/Localizer.java @@ -86,7 +86,7 @@ public class Localizer { resourceBundle = ResourceBundle.getBundle(languageRegionID, new Locale(splitLocale[0], splitLocale[1]), loader); } catch (NullPointerException | MissingResourceException e) { //If the language can't be loaded, default to US English - resourceBundle = ResourceBundle.getBundle("en-GB", new Locale("en", "GB"), loader); + resourceBundle = ResourceBundle.getBundle("en-US", new Locale("en", "US"), loader); e.printStackTrace(); } diff --git a/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java b/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java index ea177273bda..61a919fd59e 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java +++ b/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java @@ -29,7 +29,7 @@ import forge.item.PaperCard; import forge.model.FModel; import forge.screens.match.CMatchUI; import forge.toolbox.FOptionPane; - +import forge.view.arcane.ListCardArea; public class GuiChoose { @@ -285,5 +285,31 @@ public class GuiChoose { return null; } + public static List manipulateCardList(final CMatchUI gui, final String title, final List cards, final List manipulable, + final boolean toTop, final boolean toBottom, final boolean toAnywhere) { + final Callable> callable = new Callable>() { + @Override + public List call() throws Exception { + ListCardArea tempArea = new ListCardArea(gui,title,cards,manipulable,toTop,toBottom,toAnywhere); + // tempArea.pack(); + // window? tempArea.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + tempArea.show(); + // tempArea.dispose(); + //try { Thread.sleep(1000); } catch(InterruptedException ex) { } + final List cardList = tempArea.getCardList(); + return cardList; + } + }; + final FutureTask> ft = new FutureTask>(callable); + FThreads.invokeInEdtAndWait(ft); + try { + List result = ft.get(); + return result; + } catch (final Exception e) { // we have waited enough + e.printStackTrace(); + } + return null; + } + } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index 5da67c046f3..a338000744f 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -51,6 +51,7 @@ import forge.deck.Deck; import forge.deckchooser.FDeckViewer; import forge.game.GameEntityView; import forge.game.GameView; +import forge.game.card.Card; import forge.game.card.CardView; import forge.game.combat.CombatView; import forge.game.phase.PhaseType; @@ -1003,6 +1004,11 @@ public final class CMatchUI return (List) order(title,"Selected", min, max, optionList, null, null, false); } + @Override + public List manipulateCardList(final String title, final List cards, final List manipulable, final boolean toTop, final boolean toBottom, final boolean toAnywhere) { + return GuiChoose.manipulateCardList(this, title, cards, manipulable, toTop, toBottom, toAnywhere); + } + @Override public void setPlayerAvatar(final LobbyPlayer player, final IHasIcon ihi) { avatarImages.put(player.getName(), ihi.getIconImageKey()); diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/CardArea.java b/forge-gui-desktop/src/main/java/forge/view/arcane/CardArea.java index 46132c094e5..7c148bc3062 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/CardArea.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/CardArea.java @@ -246,8 +246,8 @@ public class CardArea extends CardPanelContainer implements CardPanelMouseListen dragPanel.setDisplayEnabled(false); CardPanel.setDragAnimationPanel(new CardPanel(dragPanel.getMatchUI(), dragPanel.getCard())); - final JFrame frame = (JFrame) SwingUtilities.windowForComponent(this); - final JLayeredPane layeredPane = frame.getLayeredPane(); + final RootPaneContainer frame = (RootPaneContainer) SwingUtilities.windowForComponent(this); + final JLayeredPane layeredPane = frame.getLayeredPane(); layeredPane.add(CardPanel.getDragAnimationPanel()); layeredPane.moveToFront(CardPanel.getDragAnimationPanel()); final Point p = SwingUtilities.convertPoint(this, this.mouseDragStartX, this.mouseDragStartY, layeredPane); diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanelContainer.java b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanelContainer.java index de07aafc508..45c9c1780fd 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanelContainer.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanelContainer.java @@ -182,6 +182,10 @@ public abstract class CardPanelContainer extends SkinnedPanel { }); } + protected boolean cardPanelDraggable(final CardPanel panel) { + return true; + } + private MouseMotionListener setupMotionMouseListener() { final MouseMotionListener mml = new MouseMotionListener() { @Override @@ -207,20 +211,23 @@ public abstract class CardPanelContainer extends SkinnedPanel { if (panel != mouseDownPanel) { return; } - if (intialMouseDragX == -1) { - intialMouseDragX = x; - intialMouseDragY = y; - return; - } - if ((Math.abs(x - intialMouseDragX) < CardPanelContainer.DRAG_SMUDGE) + + if (cardPanelDraggable(panel)) { // allow for non-draggable cards + if (intialMouseDragX == -1) { + intialMouseDragX = x; + intialMouseDragY = y; + return; + } + if ((Math.abs(x - intialMouseDragX) < CardPanelContainer.DRAG_SMUDGE) && (Math.abs(y - intialMouseDragY) < CardPanelContainer.DRAG_SMUDGE)) { - return; - } - mouseDownPanel = null; - setMouseDragPanel(panel); - mouseDragOffsetX = panel.getX() - intialMouseDragX; - mouseDragOffsetY = panel.getY() - intialMouseDragY; - mouseDragStart(getMouseDragPanel(), evt); + return; + } + mouseDownPanel = null; + setMouseDragPanel(panel); + mouseDragOffsetX = panel.getX() - intialMouseDragX; + mouseDragOffsetY = panel.getY() - intialMouseDragY; + mouseDragStart(getMouseDragPanel(), evt); + } } @Override @@ -453,4 +460,4 @@ public abstract class CardPanelContainer extends SkinnedPanel { this.layoutListeners.add(listener); } -} \ No newline at end of file +} diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java b/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java new file mode 100644 index 00000000000..2ab3358a9f0 --- /dev/null +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java @@ -0,0 +1,317 @@ +/* + * Forge: Play Magic: the Gathering. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package forge.view.arcane; + +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseEvent; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.ScrollPaneConstants; +import javax.swing.Timer; + +import forge.Singletons; +import forge.game.card.Card; +import forge.game.card.CardView; +import forge.gui.framework.SDisplayUtil; +import forge.model.FModel; +import forge.properties.ForgePreferences; +import forge.properties.ForgePreferences.FPref; +import forge.screens.match.CMatchUI; +import forge.view.arcane.util.CardPanelMouseAdapter; +import forge.toolbox.FScrollPane; +import forge.toolbox.MouseTriggerEvent; +import forge.view.FFrame; +import forge.view.FDialog; + +import forge.toolbox.FButton; + +public class ListCardArea extends CardArea { + + private static final String COORD_DELIM = ","; + private static final ForgePreferences prefs = FModel.getPreferences(); + + public void show() { + this.showWindow(); + } + public void hide() { + this.hideWindow(); + } + + private ArrayList cardList; + private ArrayList moveableCards; + private boolean toTop, toBottom, toAnywhere; + private String title; + private FPref locPref; + private boolean hasBeenShown = false, locLoaded; + private static ListCardArea storedArea; + + private final FButton doneButton; + + public ListCardArea(final CMatchUI matchUI, final String title0, final List cardList0, final List moveableCards0, final boolean toTop0, final boolean toBottom0, final boolean toAnywhere0) { + super(matchUI, new FScrollPane(false, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER)); + window.add(getScrollPane(),"grow, push"); + try { Thread.sleep(1000); } catch(InterruptedException ex) { } + getScrollPane().setViewportView(this); + setOpaque(false); + doneButton = new FButton("Done"); + doneButton.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { window.setVisible(false); } + }); + window.add(doneButton,BorderLayout.SOUTH); + cardList = new ArrayList(cardList0); // this is modified - pfps - is there a better way? + moveableCards = new ArrayList(moveableCards0); + title = title0; + toTop = toTop0; + toBottom = toBottom0; + toAnywhere = toAnywhere0; + this.setDragEnabled(true); + this.setVertical(true); + storedArea = this; + } + + public List getCardList() { + return cardList; + } + + @SuppressWarnings("serial") + // private SkinnedFrame window = new SkinnedFrame() { + private final FDialog window = new FDialog(true, true, "0") { + @Override + public void setLocationRelativeTo(Component c) { + super.setLocationRelativeTo(c); + } + + @Override + public void setVisible(boolean b0) { + if (isVisible() == b0) { return; } + if (b0) { + refresh(); + } + super.setVisible(b0); + } + }; + + private void showWindow() { + onShow(); + window.setFocusableWindowState(true); + window.setVisible(true); + } + private void hideWindow() { + onShow(); + window.setFocusableWindowState(false); // should probably do this earlier + window.setVisible(false); + } + private void onShow() { + if (!hasBeenShown) { + loadLocation(); + this.addCardPanelMouseListener(new CardPanelMouseAdapter() { + @Override + public void mouseDragEnd(final CardPanel dragPanel, final MouseEvent evt) { + dragEnd(dragPanel); + } + }); + this.addKeyListener(new KeyAdapter() { + @Override + public void keyPressed(final KeyEvent e) { + switch (e.getKeyCode()) { + case KeyEvent.VK_ENTER: + doneButton.doClick(); + break; + default: + break; + } + } + }); + } + + } + + // is this a valid place to move the card? + private boolean validIndex(final Card card, final int index) { + if (toAnywhere) { return true; } + int oldIndex = cardList.indexOf(card); + boolean topMove = true; + for(int i=0; iindex?1:0); i 0) { + String[] coords = value.split(COORD_DELIM); + if (coords.length == 4) { + try { + int x = Integer.parseInt(coords[0]); + int y = Integer.parseInt(coords[1]); + int w = Integer.parseInt(coords[2]); + int h = Integer.parseInt(coords[3]); + + //ensure the window is accessible + int centerX = x + w / 2; + int centerY = y + h / 2; + Rectangle screenBounds = SDisplayUtil.getScreenBoundsForPoint(new Point(centerX, centerY)); + if (centerX < screenBounds.x) { + x = screenBounds.x; + } + else if (centerX > screenBounds.x + screenBounds.width) { + x = screenBounds.x + screenBounds.width - w; + if (x < screenBounds.x) { + x = screenBounds.x; + } + } + if (centerY < screenBounds.y) { + y = screenBounds.y; + } + else if (centerY > screenBounds.y + screenBounds.height) { + y = screenBounds.y + screenBounds.height - h; + if (y < screenBounds.y) { + y = screenBounds.y; + } + } + window.setBounds(x, y, w, h); + locLoaded = true; + return; + } + catch (Exception ex) { + ex.printStackTrace(); + } + } + prefs.setPref(locPref, ""); //clear value if invalid + prefs.save(); + } + } + //fallback default size + FFrame mainFrame = Singletons.getView().getFrame(); + window.setSize(mainFrame.getWidth() / 5, mainFrame.getHeight() / 2); + } + + public void refresh() { + List cardPanels = new ArrayList(); + // FCollectionView cards = new FCollection(cardList); + if (cardList != null) { + for (final Card card : cardList) { + CardPanel cardPanel = getCardPanel(card.getId()); + if (cardPanel == null) { + cardPanel = new CardPanel(getMatchUI(), card.getView()); + cardPanel.setDisplayEnabled(true); + } + else { + cardPanel.setCard(card.getView()); //ensure card view updated + } + cardPanels.add(cardPanel); + } + } + + boolean hadCardPanels = getCardPanels().size() > 0; + setCardPanels(cardPanels); + window.setTitle(String.format(title, cardPanels.size())); + + //if window had cards and now doesn't, hide window + //(e.g. cast final card from Flashback zone) + if (hadCardPanels && cardPanels.size() == 0) { + window.setVisible(false); + } + } + + @Override + public void doLayout() { + // if (window.isResizing()) { + // //delay layout slightly to reduce flicker during window resize + // layoutTimer.restart(); + // } + //else { + finishDoLayout(); + //} + } + + private final Timer layoutTimer = new Timer(250, new ActionListener() { + @Override + public void actionPerformed(ActionEvent arg0) { + layoutTimer.stop(); + finishDoLayout(); + } + }); + + private void finishDoLayout() { + super.doLayout(); + } + + @Override + public final void mouseOver(final CardPanel panel, final MouseEvent evt) { + getMatchUI().setCard(panel.getCard(), evt.isShiftDown()); + super.mouseOver(panel, evt); + } + @Override + public final void mouseLeftClicked(final CardPanel panel, final MouseEvent evt) { + getMatchUI().getGameController().selectCard(panel.getCard(), null, new MouseTriggerEvent(evt)); + super.mouseLeftClicked(panel, evt); + } + @Override + public final void mouseRightClicked(final CardPanel panel, final MouseEvent evt) { + getMatchUI().getGameController().selectCard(panel.getCard(), null, new MouseTriggerEvent(evt)); + super.mouseRightClicked(panel, evt); + } + +} diff --git a/forge-gui-mobile/src/forge/screens/match/MatchController.java b/forge-gui-mobile/src/forge/screens/match/MatchController.java index f0ab65ff144..5a361c87e49 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchController.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchController.java @@ -29,6 +29,7 @@ import forge.deck.CardPool; import forge.deck.FSideboardDialog; import forge.game.GameEntityView; import forge.game.GameView; +import forge.game.card.Card; import forge.game.card.CardView; import forge.game.phase.PhaseType; import forge.game.player.DelayedReveal; @@ -520,6 +521,11 @@ public class MatchController extends AbstractGuiGame { return SGuiChoose.order(title, "Selected", min, max, (List) optionList, null); } + @Override + public List manipulateCardList(final String title, final List cards, final List manipulable, final boolean toTop, final boolean toBottom, final boolean toAnywhere) { + return null; // pfps not implemented yet + } + @Override public void setCard(final CardView card) { // doesn't need to do anything diff --git a/forge-gui/src/main/java/forge/interfaces/IGuiGame.java b/forge-gui/src/main/java/forge/interfaces/IGuiGame.java index de67ed2ef38..5e60457fb8d 100644 --- a/forge-gui/src/main/java/forge/interfaces/IGuiGame.java +++ b/forge-gui/src/main/java/forge/interfaces/IGuiGame.java @@ -11,6 +11,7 @@ import forge.assets.FSkinProp; import forge.deck.CardPool; import forge.game.GameEntityView; import forge.game.GameView; +import forge.game.card.Card; import forge.game.card.CardView; import forge.game.phase.PhaseType; import forge.game.player.DelayedReveal; @@ -147,6 +148,10 @@ public interface IGuiGame { List sideboard(CardPool sideboard, CardPool main); GameEntityView chooseSingleEntityForEffect(String title, List optionList, DelayedReveal delayedReveal, boolean isOptional); List chooseEntitiesForEffect(String title, List optionList, int min, int max, DelayedReveal delayedReveal); + + // show a list of cards and allow some of them to be moved around and return new list + List manipulateCardList(String title, final List cards, final List manipulable, boolean toTop, boolean toBottom, boolean toAnywhere); + void setCard(CardView card); void setPlayerAvatar(LobbyPlayer player, IHasIcon ihi); boolean openZones(Collection zones, Map players); diff --git a/forge-gui/src/main/java/forge/net/ProtocolMethod.java b/forge-gui/src/main/java/forge/net/ProtocolMethod.java index a5c3851c1cc..4642efd5101 100644 --- a/forge-gui/src/main/java/forge/net/ProtocolMethod.java +++ b/forge-gui/src/main/java/forge/net/ProtocolMethod.java @@ -68,6 +68,7 @@ public enum ProtocolMethod { sideboard (Mode.SERVER, List.class, CardPool.class, CardPool.class), chooseSingleEntityForEffect(Mode.SERVER, GameEntityView.class, String.class, List.class, DelayedReveal.class, Boolean.TYPE), chooseEntitiesForEffect(Mode.SERVER, GameEntityView.class, String.class, List.class, Integer.TYPE, Integer.TYPE, DelayedReveal.class), + manipulateCardList (Mode.SERVER, List.class, String.class, List.class, List.class, Boolean.TYPE, Boolean.TYPE, Boolean.TYPE), setCard (Mode.SERVER, Void.TYPE, CardView.class), // TODO case "setPlayerAvatar": openZones (Mode.SERVER, Boolean.TYPE, Collection/*ZoneType*/.class, Map/*PlayerView,Object*/.class), diff --git a/forge-gui/src/main/java/forge/net/server/NetGuiGame.java b/forge-gui/src/main/java/forge/net/server/NetGuiGame.java index 7578bb067f5..069f3302d4c 100644 --- a/forge-gui/src/main/java/forge/net/server/NetGuiGame.java +++ b/forge-gui/src/main/java/forge/net/server/NetGuiGame.java @@ -11,6 +11,7 @@ import forge.assets.FSkinProp; import forge.deck.CardPool; import forge.game.GameEntityView; import forge.game.GameView; +import forge.game.card.Card; import forge.game.card.CardView; import forge.game.phase.PhaseType; import forge.game.player.DelayedReveal; @@ -248,6 +249,11 @@ public class NetGuiGame extends AbstractGuiGame { return sendAndWait(ProtocolMethod.chooseEntitiesForEffect, title, optionList, min, max, delayedReveal); } + @Override + public List manipulateCardList(final String title, final List cards, final List manipulable, final boolean toTop, final boolean toBottom, final boolean toAnywhere) { + return sendAndWait(ProtocolMethod.manipulateCardList, title, cards, manipulable, toTop, toBottom, toAnywhere); + } + @Override public void setCard(final CardView card) { updateGameView(); diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index bad4aa8d8e0..8874ca43c9a 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -349,8 +349,9 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } private boolean useSelectCardsInput(final FCollectionView sourceList) { - // if UI_SELECT_FROM_ZONES not set use InputSelect only for battlefield and player hand - // if UI_SELECT_FROM_ZONES set use InputSelect for any zone that can be shown + // if UI_SELECT_FROM_CARD_DISPLAYS not set use InputSelect only for battlefield and player hand + // if UI_SELECT_FROM_CARD_DISPLAYS set use InputSelect for any zone that can be shown + if ( FThreads.isGuiThread() ) { return false; } // also can't use InputSelect from GUI thread (e.g., DevMode Tutor) for (final GameEntity c : sourceList) { if (c instanceof Player) { continue; @@ -361,7 +362,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont final Zone cz = ((Card) c).getZone(); final boolean useUiPointAtCard = cz != null && - FModel.getPreferences().getPrefBoolean(FPref.UI_SELECT_FROM_ZONES) ? + FModel.getPreferences().getPrefBoolean(FPref.UI_SELECT_FROM_CARD_DISPLAYS) ? (cz.is(ZoneType.Battlefield) || cz.is(ZoneType.Hand) || cz.is(ZoneType.Library) || cz.is(ZoneType.Graveyard) || cz.is(ZoneType.Exile) || cz.is(ZoneType.Flashback) || cz.is(ZoneType.Command)) : (cz.is(ZoneType.Hand) && cz.getPlayer() == player || cz.is(ZoneType.Battlefield)); @@ -736,31 +737,58 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } } + public ImmutablePair arrangeForMove(final String title, final List cards, final List manipulable, final boolean topOK, final boolean bottomOK) { + List result = getGui().manipulateCardList("Move cards to top or bottom of library", cards, manipulable, topOK, bottomOK, false); + CardCollection toBottom = new CardCollection(); + CardCollection toTop = new CardCollection(); + for (int i = 0; manipulable.contains(result.get(i)) && i arrangeForScry(final CardCollection topN) { CardCollection toBottom = null; CardCollection toTop = null; tempShowCards(topN); - if (topN.size() == 1) { - if (willPutCardOnTop(topN.get(0))) { - toTop = topN; - } else { - toBottom = topN; - } - } else { - toBottom = game.getCardList(getGui().many("Select cards to be put on the bottom of your library", - "Cards to put on the bottom", -1, CardView.getCollection(topN), null)); - topN.removeAll((Collection) toBottom); - if (topN.isEmpty()) { - toTop = null; - } else if (topN.size() == 1) { - toTop = topN; - } else { - toTop = game.getCardList(getGui().order("Arrange cards to be put on top of your library", - "Top of Library", CardView.getCollection(topN), null)); - } - } + if ( FModel.getPreferences().getPrefBoolean(FPref.UI_SELECT_FROM_CARD_DISPLAYS) ) { + ArrayList cardList = new ArrayList(); // pfps there must be a better way + for (final Card card : player.getCardsIn(ZoneType.Library)) { + cardList.add(card); + } + ImmutablePair result = + arrangeForMove("Move cards to top or bottom of library", cardList, topN, true, true); + System.out.print("Arrange "); System.out.println(result); + toTop = result.getLeft(); + toBottom = result.getRight(); + } else { + if (topN.size() == 1) { + if (willPutCardOnTop(topN.get(0))) { + toTop = topN; + } else { + toBottom = topN; + } + } else { + toBottom = game.getCardList(getGui().many("Select cards to be put on the bottom of your library", + "Cards to put on the bottom", -1, CardView.getCollection(topN), null)); + topN.removeAll((Collection) toBottom); + if (topN.isEmpty()) { + toTop = null; + } else if (topN.size() == 1) { + toTop = topN; + } else { + toTop = game.getCardList(getGui().order("Arrange cards to be put on top of your library", + "Top of Library", CardView.getCollection(topN), null)); + } + } + } endTempShowCards(); return ImmutablePair.of(toTop, toBottom); } diff --git a/forge-gui/src/main/java/forge/properties/ForgePreferences.java b/forge-gui/src/main/java/forge/properties/ForgePreferences.java index b96037d9fca..6059254787d 100644 --- a/forge-gui/src/main/java/forge/properties/ForgePreferences.java +++ b/forge-gui/src/main/java/forge/properties/ForgePreferences.java @@ -125,7 +125,7 @@ public class ForgePreferences extends PreferencesStore { UI_DISABLE_IMAGES_EFFECT_CARDS("false"), UI_ALLOW_ORDER_GRAVEYARD_WHEN_NEEDED ("Never"), UI_DEFAULT_FONT_SIZE("12"), - UI_SELECT_FROM_ZONES("true"), + UI_SELECT_FROM_CARD_DISPLAYS("true"), UI_FOR_TOUCHSCREN("false"), UI_VIBRATE_ON_LIFE_LOSS("true"), From 3609ff9eff31c5ea1044be0308358f9f6bb60ddc Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Fri, 11 Jan 2019 03:48:42 -0500 Subject: [PATCH 564/901] only use new input methods if in desktop GUI; remove debugging prints --- .../src/main/java/forge/view/arcane/ListCardArea.java | 3 --- .../src/forge/screens/match/MatchController.java | 3 ++- .../main/java/forge/player/PlayerControllerHuman.java | 10 +++++----- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java b/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java index 2ab3358a9f0..3a601829df9 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java @@ -184,7 +184,6 @@ public class ListCardArea extends CardArea { //update index of dragged card in hand zone to match new index within hand area final int index = getCardPanels().indexOf(dragPanel); if (validIndex(dragCard,index)) { - System.out.print("Really move card to index "); System.out.println(index); synchronized (cardList) { cardList.remove(dragCard); cardList.add(index, dragCard); @@ -195,10 +194,8 @@ public class ListCardArea extends CardArea { } private void loadLocation() { - System.out.println("loadlocation"); if (locPref != null) { String value = prefs.getPref(locPref); - System.out.print(locPref); System.out.println(value); if (value.length() > 0) { String[] coords = value.split(COORD_DELIM); if (coords.length == 4) { diff --git a/forge-gui-mobile/src/forge/screens/match/MatchController.java b/forge-gui-mobile/src/forge/screens/match/MatchController.java index 5a361c87e49..789fa67d32c 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchController.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchController.java @@ -523,7 +523,8 @@ public class MatchController extends AbstractGuiGame { @Override public List manipulateCardList(final String title, final List cards, final List manipulable, final boolean toTop, final boolean toBottom, final boolean toAnywhere) { - return null; // pfps not implemented yet + System.err.println("Not implemented yet - should never be called"); + return null; } @Override diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 8874ca43c9a..8526c486a62 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -349,9 +349,9 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } private boolean useSelectCardsInput(final FCollectionView sourceList) { + if ( FThreads.isGuiThread() ) { return false; } // can't use InputSelect from GUI thread (e.g., DevMode Tutor) // if UI_SELECT_FROM_CARD_DISPLAYS not set use InputSelect only for battlefield and player hand - // if UI_SELECT_FROM_CARD_DISPLAYS set use InputSelect for any zone that can be shown - if ( FThreads.isGuiThread() ) { return false; } // also can't use InputSelect from GUI thread (e.g., DevMode Tutor) + // if UI_SELECT_FROM_CARD_DISPLAYS set and using desktop GUI use InputSelect for any zone that can be shown for (final GameEntity c : sourceList) { if (c instanceof Player) { continue; @@ -362,7 +362,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont final Zone cz = ((Card) c).getZone(); final boolean useUiPointAtCard = cz != null && - FModel.getPreferences().getPrefBoolean(FPref.UI_SELECT_FROM_CARD_DISPLAYS) ? + (FModel.getPreferences().getPrefBoolean(FPref.UI_SELECT_FROM_CARD_DISPLAYS) && (!GuiBase.getInterface().isLibgdxPort()) ) ? (cz.is(ZoneType.Battlefield) || cz.is(ZoneType.Hand) || cz.is(ZoneType.Library) || cz.is(ZoneType.Graveyard) || cz.is(ZoneType.Exile) || cz.is(ZoneType.Flashback) || cz.is(ZoneType.Command)) : (cz.is(ZoneType.Hand) && cz.getPlayer() == player || cz.is(ZoneType.Battlefield)); @@ -758,14 +758,14 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont CardCollection toTop = null; tempShowCards(topN); - if ( FModel.getPreferences().getPrefBoolean(FPref.UI_SELECT_FROM_CARD_DISPLAYS) ) { + if ( FModel.getPreferences().getPrefBoolean(FPref.UI_SELECT_FROM_CARD_DISPLAYS) && + (!GuiBase.getInterface().isLibgdxPort()) ) { ArrayList cardList = new ArrayList(); // pfps there must be a better way for (final Card card : player.getCardsIn(ZoneType.Library)) { cardList.add(card); } ImmutablePair result = arrangeForMove("Move cards to top or bottom of library", cardList, topN, true, true); - System.out.print("Arrange "); System.out.println(result); toTop = result.getLeft(); toBottom = result.getRight(); } else { From b2e9c88f6229f5c991a75444875f43c23f056c4b Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Fri, 11 Jan 2019 09:16:50 +0000 Subject: [PATCH 565/901] CostPayLife: refund never called and doesn't work negative amount can't be paid in the function --- .../src/main/java/forge/game/cost/CostPayLife.java | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/forge-game/src/main/java/forge/game/cost/CostPayLife.java b/forge-game/src/main/java/forge/game/cost/CostPayLife.java index 8b462de5b48..05cefe94976 100644 --- a/forge-game/src/main/java/forge/game/cost/CostPayLife.java +++ b/forge-game/src/main/java/forge/game/cost/CostPayLife.java @@ -57,17 +57,6 @@ public class CostPayLife extends CostPart { return sb.toString(); } - /* - * (non-Javadoc) - * - * @see forge.card.cost.CostPart#refund(forge.Card) - */ - @Override - public final void refund(final Card source) { - // Really should be activating player - source.getController().payLife(this.paidAmount * -1, null); - } - /* * (non-Javadoc) * From 1e6a9b8c26c6d2a823bd62cbcce713cdefc85f91 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Fri, 11 Jan 2019 09:17:55 +0000 Subject: [PATCH 566/901] Update CostDamage, fix Description --- forge-game/src/main/java/forge/game/cost/CostDamage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/cost/CostDamage.java b/forge-game/src/main/java/forge/game/cost/CostDamage.java index 87c6d89991c..5149a31aff2 100644 --- a/forge-game/src/main/java/forge/game/cost/CostDamage.java +++ b/forge-game/src/main/java/forge/game/cost/CostDamage.java @@ -23,7 +23,7 @@ import forge.game.player.Player; import forge.game.spellability.SpellAbility; /** - * The Class CostPayLife. + * The Class CostDamage. */ public class CostDamage extends CostPart { From 7aa879fb8eb8620a6e0be30d13f8dc4268a0ed23 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Fri, 11 Jan 2019 09:19:12 +0000 Subject: [PATCH 567/901] Update CostDraw: fix Description --- forge-game/src/main/java/forge/game/cost/CostDraw.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/cost/CostDraw.java b/forge-game/src/main/java/forge/game/cost/CostDraw.java index db5f33be2ce..4cd621773ab 100644 --- a/forge-game/src/main/java/forge/game/cost/CostDraw.java +++ b/forge-game/src/main/java/forge/game/cost/CostDraw.java @@ -25,7 +25,7 @@ import java.util.ArrayList; import java.util.List; /** - * The Class CostPayLife. + * The Class CostDraw. */ public class CostDraw extends CostPart { /** From 05be8406ccae0e8ee5df9d436cd7f8cf627a929d Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Fri, 11 Jan 2019 09:31:53 +0000 Subject: [PATCH 568/901] Update TriggerLifeGained: better format --- .../forge/game/trigger/TriggerLifeGained.java | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerLifeGained.java b/forge-game/src/main/java/forge/game/trigger/TriggerLifeGained.java index 86b310e1c74..599594075a5 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerLifeGained.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerLifeGained.java @@ -20,13 +20,14 @@ package forge.game.trigger; import forge.game.card.Card; import forge.game.spellability.SpellAbility; +import java.util.Map; + /** *

* Trigger_LifeGained class. *

* * @author Forge - * @version $Id$ */ public class TriggerLifeGained extends Trigger { @@ -36,32 +37,30 @@ public class TriggerLifeGained extends Trigger { *

* * @param params - * a {@link java.util.HashMap} object. + * a {@link java.util.Map} object. * @param host * a {@link forge.game.card.Card} object. * @param intrinsic * the intrinsic */ - public TriggerLifeGained(final java.util.Map params, final Card host, final boolean intrinsic) { + public TriggerLifeGained(final Map params, final Card host, final boolean intrinsic) { super(params, host, intrinsic); } /** {@inheritDoc} */ @Override - public final boolean performTest(final java.util.Map runParams2) { - if (this.mapParams.containsKey("ValidPlayer")) { - if (!matchesValid(runParams2.get("Player"), this.mapParams.get("ValidPlayer").split(","), - this.getHostCard())) { + public final boolean performTest(final Map runParams2) { + if (hasParam("ValidPlayer")) { + if (!matchesValid(runParams2.get("Player"), getParam("ValidPlayer").split(","), getHostCard())) { return false; } } - if (this.mapParams.containsKey("ValidSource")) { - if (!matchesValid(runParams2.get("Source"), this.mapParams.get("ValidSource").split(","), - this.getHostCard())) { + if (hasParam("ValidSource")) { + if (!matchesValid(runParams2.get("Source"), getParam("ValidSource").split(","), getHostCard())) { return false; } } - if (this.mapParams.containsKey("Spell")) { + if (hasParam("Spell")) { final SpellAbility spellAbility = (SpellAbility) runParams2.get("SourceSA"); if (spellAbility == null || !spellAbility.getRootAbility().isSpell()) { return false; @@ -71,12 +70,11 @@ public class TriggerLifeGained extends Trigger { return true; } - /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject("LifeAmount", this.getRunParams().get("LifeAmount")); - sa.setTriggeringObject("Player", this.getRunParams().get("Player")); + sa.setTriggeringObject("LifeAmount", getRunParams().get("LifeAmount")); + sa.setTriggeringObject("Player", getRunParams().get("Player")); } @Override From 842c6e681dda8a3d05298655ce598debf349415e Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Fri, 11 Jan 2019 09:33:56 +0000 Subject: [PATCH 569/901] TriggerPayLife: add new Trigger --- .../forge/game/trigger/TriggerPayLife.java | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 forge-game/src/main/java/forge/game/trigger/TriggerPayLife.java diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPayLife.java b/forge-game/src/main/java/forge/game/trigger/TriggerPayLife.java new file mode 100644 index 00000000000..0dcdb617893 --- /dev/null +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPayLife.java @@ -0,0 +1,76 @@ +/* + * Forge: Play Magic: the Gathering. + * Copyright (C) 2011 Forge Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package forge.game.trigger; + +import forge.game.card.Card; +import forge.game.spellability.SpellAbility; + +import java.util.Map; + +/** + *

+ * Trigger_LifeGained class. + *

+ * + * @author Forge + */ +public class TriggerPayLife extends Trigger { + + /** + *

+ * Constructor for TriggerPayLife. + *

+ * + * @param params + * a {@link java.util.Map} object. + * @param host + * a {@link forge.game.card.Card} object. + * @param intrinsic + * the intrinsic + */ + public TriggerPayLife(final Map params, final Card host, final boolean intrinsic) { + super(params, host, intrinsic); + } + + /** {@inheritDoc} */ + @Override + public final boolean performTest(final Map runParams2) { + if (hasParam("ValidPlayer")) { + if (!matchesValid(runParams2.get("Player"), getParam("ValidPlayer").split(","), getHostCard())) { + return false; + } + } + + return true; + } + + /** {@inheritDoc} */ + @Override + public final void setTriggeringObjects(final SpellAbility sa) { + sa.setTriggeringObject("LifeAmount", getRunParams().get("LifeAmount")); + sa.setTriggeringObject("Player", getRunParams().get("Player")); + } + + @Override + public String getImportantStackObjects(SpellAbility sa) { + StringBuilder sb = new StringBuilder(); + sb.append("Player: ").append(sa.getTriggeringObject("Player")).append(", "); + sb.append("paid Amount: ").append(sa.getTriggeringObject("LifeAmount")); + return sb.toString(); + } +} From edaab9d7dee1f04cb64b6e12c1294a9eb70af838 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Fri, 11 Jan 2019 09:38:02 +0000 Subject: [PATCH 570/901] TriggerType: add PayLife --- forge-game/src/main/java/forge/game/trigger/TriggerType.java | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerType.java b/forge-game/src/main/java/forge/game/trigger/TriggerType.java index 0dfb2d1e3b5..4dd45348a1f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerType.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerType.java @@ -64,6 +64,7 @@ public enum TriggerType { NewGame(TriggerNewGame.class), PayCumulativeUpkeep(TriggerPayCumulativeUpkeep.class), PayEcho(TriggerPayEcho.class), + PayLife(TriggerPayLife.class), Phase(TriggerPhase.class), PhaseIn(TriggerPhaseIn.class), PhaseOut(TriggerPhaseOut.class), From bbe8d79400abcb3343a78093d5ce4cb35d7e21ab Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Fri, 11 Jan 2019 10:16:29 +0000 Subject: [PATCH 571/901] Player: add PayLife Trigger --- .../src/main/java/forge/game/player/Player.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index cf3843b7b20..e5ef2e486b6 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -515,14 +515,15 @@ public class Player extends GameEntity implements Comparable { return false; } - if (lifePayment <= 0) - return true; + loseLife(lifePayment); - // rule 118.8 - if (life >= lifePayment) { - return (loseLife(lifePayment) > 0); - } - return false; + // Run triggers + final Map runParams = Maps.newHashMap(); + runParams.put("Player", this); + runParams.put("LifeAmount", lifePayment); + game.getTriggerHandler().runTrigger(TriggerType.PayLife, runParams, false); + + return true; } public final boolean canPayEnergy(final int energyPayment) { From 005fa3d7324d51adafbea9f7d7873da8da3a2f88 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Fri, 11 Jan 2019 10:28:27 +0000 Subject: [PATCH 572/901] Font of Agonies: use new PayLife trigger --- forge-gui/res/cardsfolder/upcoming/font_of_agonies.txt | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/font_of_agonies.txt diff --git a/forge-gui/res/cardsfolder/upcoming/font_of_agonies.txt b/forge-gui/res/cardsfolder/upcoming/font_of_agonies.txt new file mode 100644 index 00000000000..b6984c78fa8 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/font_of_agonies.txt @@ -0,0 +1,8 @@ +Name:Font of Agonies +ManaCost:B +Types:Enchantment +T:Mode$ PayLife | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever you pay life, put that many blood counters on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ BLOOD | CounterNum$ X | References$ X +SVar:X:TriggerCount$LifeAmount +A:AB$ Destroy | Cost$ 1 B SubCounter<4/BLOOD> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Destroy target creature. +Oracle:Whenever you pay life, put that many blood counters on Font of Agonies.\n{1}{B}, Remove four blood counters from Font of Agonies: Destroy target creature. \ No newline at end of file From 770ed4524a63fcf38c76a7ebbafd37072239e75d Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Fri, 11 Jan 2019 13:24:33 +0000 Subject: [PATCH 573/901] CostPayLife: fix unused import --- forge-game/src/main/java/forge/game/cost/CostPayLife.java | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/cost/CostPayLife.java b/forge-game/src/main/java/forge/game/cost/CostPayLife.java index 05cefe94976..c0394e31bc4 100644 --- a/forge-game/src/main/java/forge/game/cost/CostPayLife.java +++ b/forge-game/src/main/java/forge/game/cost/CostPayLife.java @@ -18,7 +18,6 @@ package forge.game.cost; import forge.game.ability.AbilityUtils; -import forge.game.card.Card; import forge.game.player.Player; import forge.game.spellability.SpellAbility; From 17cff99c2be94c7bd35ff8384a29b4c49cc5cff2 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Fri, 11 Jan 2019 21:15:27 +0100 Subject: [PATCH 574/901] Adapt: add ReduceCost for Pteramander --- .../main/java/forge/game/card/CardFactoryUtil.java | 12 ++++++++++++ forge-gui/res/cardsfolder/upcoming/pteramander.txt | 9 +++++++++ .../match/input/InputSelectEntitiesFromList.java | 2 +- 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/pteramander.txt diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 040c8f87e37..6beef16d590 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -3703,12 +3703,24 @@ public class CardFactoryUtil { final String[] k = keyword.split(":"); final String magnitude = k[1]; final String manacost = k[2]; + final String reduceCost = k.length > 3 ? k[3] : null; + + Set references = Sets.newHashSet(); String desc = "Adapt " + magnitude; String effect = "AB$ PutCounter | Cost$ " + manacost + " | Adapt$ True | CounterNum$ " + magnitude + " | CounterType$ P1P1 | StackDescription$ SpellDescription"; + if (reduceCost != null) { + effect += "| ReduceCost$ " + reduceCost; + references.add(reduceCost); + desc += ". This ability costs {1} less to activate for each instant and sorcery card in your graveyard."; + } + if (!references.isEmpty()) { + effect += "| References$ " + TextUtil.join(references, ","); + } + effect += "| SpellDescription$ " + desc + " (" + inst.getReminderText() + ")"; final SpellAbility sa = AbilityFactory.getAbility(effect, card); diff --git a/forge-gui/res/cardsfolder/upcoming/pteramander.txt b/forge-gui/res/cardsfolder/upcoming/pteramander.txt new file mode 100644 index 00000000000..4358bc865d2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/pteramander.txt @@ -0,0 +1,9 @@ +Name:Pteramander +ManaCost:U +Types:Creature Salamander Drake +PT:1/1 +K:Flying +K:Adapt:4:7 U:X +SVar:X:Count$ValidGraveyard Instant.YouOwn,Sorcery.YouOwn +DeckHas:Ability$Counters +Oracle:Flying\n{7}{U}: Adapt 4. This ability costs {1} less to activate for each instant and sorcery card in your graveyard. (If this creature has no +1/+1 counters on it, put four +1/+1 counters on it.) diff --git a/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java b/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java index f9e082a3624..1d018a02394 100644 --- a/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java +++ b/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java @@ -33,7 +33,7 @@ public class InputSelectEntitiesFromList extends InputSele if (min > validChoices.size()) { System.out.println(String.format("Trying to choose at least %d things from a list with only %d things!", min, validChoices.size())); } - PlayerZoneUpdates zonesToUpdate = new PlayerZoneUpdates(); + final PlayerZoneUpdates zonesToUpdate = new PlayerZoneUpdates(); for (final GameEntity c : validChoices) { final Zone cz = (c instanceof Card) ? ((Card) c).getZone() : null ; zonesToUpdate.add(new PlayerZoneUpdate(cz.getPlayer().getView(),cz.getZoneType())); From 59102b0e082374e8a2fc70046c970b9ef7d18bf6 Mon Sep 17 00:00:00 2001 From: Sol Date: Sat, 12 Jan 2019 01:36:29 +0000 Subject: [PATCH 575/901] Update vicious_rumors.txt --- forge-gui/res/cardsfolder/v/vicious_rumors.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/v/vicious_rumors.txt b/forge-gui/res/cardsfolder/v/vicious_rumors.txt index c74b7df9ffa..28c67016bde 100644 --- a/forge-gui/res/cardsfolder/v/vicious_rumors.txt +++ b/forge-gui/res/cardsfolder/v/vicious_rumors.txt @@ -1,7 +1,8 @@ Name:Vicious Rumors ManaCost:B Types:Sorcery -A:SP$ DealDamage | Cost$ B | Defined$ Player.Opponent | NumDmg$ 1 | SubAbility$ DBMill | SpellDescription$ CARDNAME deals 1 damage to each opponent. Each opponent discards a card, then puts the top card of their library into their graveyard. You gain 1 life. +A:SP$ DealDamage | Cost$ B | Defined$ Player.Opponent | NumDmg$ 1 | SubAbility$ DBDiscard | SpellDescription$ CARDNAME deals 1 damage to each opponent. Each opponent discards a card, then puts the top card of their library into their graveyard. You gain 1 life. +SVar:DBDiscard:DB$ Discard | Defined$ Player.Opponent | NumCards$ 1 | Mode$ TgtChoose | SubAbility$ DBMill SVar:DBMill:DB$ Mill | Defined$ Player.Opponent | NumCards$ 1 | Mode$ TgtChoose | SubAbility$ DBGainLife SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 Oracle:Vicious Rumors deals 1 damage to each opponent. Each opponent discards a card, then puts the top card of their library into their graveyard. You gain 1 life. From 0606a00942e29951338d16c39613509e78f0c79b Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Sat, 12 Jan 2019 16:13:00 +0000 Subject: [PATCH 576/901] DeckFormat: A deck can have any number of cards named CARDNAME. --- .../src/main/java/forge/deck/DeckFormat.java | 35 +++++++++---------- .../deckeditor/controllers/ACEditorBase.java | 3 +- .../src/forge/deck/FDeckEditor.java | 2 +- forge-gui/res/cardsfolder/r/rat_colony.txt | 2 +- .../res/cardsfolder/r/relentless_rats.txt | 2 +- .../res/cardsfolder/s/shadowborn_apostle.txt | 4 +-- .../upcoming/persistent_petitioners.txt | 10 ++++++ .../main/java/forge/quest/QuestSpellShop.java | 2 +- 8 files changed, 34 insertions(+), 26 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/persistent_petitioners.txt diff --git a/forge-core/src/main/java/forge/deck/DeckFormat.java b/forge-core/src/main/java/forge/deck/DeckFormat.java index 23ffa77fbe5..d44b93c0141 100644 --- a/forge-core/src/main/java/forge/deck/DeckFormat.java +++ b/forge-core/src/main/java/forge/deck/DeckFormat.java @@ -20,6 +20,8 @@ package forge.deck; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; + import forge.StaticData; import forge.card.CardRules; import forge.card.CardRulesPredicates; @@ -47,7 +49,7 @@ public enum DeckFormat { QuestDeck ( Range.between(40, Integer.MAX_VALUE), Range.between(0, 15), 4), Limited ( Range.between(40, Integer.MAX_VALUE), null, Integer.MAX_VALUE), Commander ( Range.is(99), Range.between(0, 10), 1, new Predicate() { - private final Set bannedCards = new HashSet(Arrays.asList( + private final Set bannedCards = ImmutableSet.of( "Adriana's Valor", "Advantageous Proclamation", "Amulet of Quoz", "Ancestral Recall", "Assemble the Rank and Vile", "Backup Plan", "Balance", "Biorhythm", "Black Lotus", "Brago's Favor", "Braids, Cabal Minion", "Bronze Tablet", "Channel", "Chaos Orb", "Coalition Victory", "Contract from Below", "Darkpact", "Demonic Attorney", "Double Stroke", @@ -59,7 +61,7 @@ public enum DeckFormat { "Rebirth", "Recurring Nightmare", "Rofellos, Llanowar Emissary", "Secret Summoning", "Secrets of Paradise", "Sentinel Dispatch", "Shahrazad", "Sovereign's Realm", "Summoner's Bond", "Sundering Titan", "Sway of the Stars", "Sylvan Primordial", "Tempest Efreet", "Time Vault", "Time Walk", "Timmerian Fiends", "Tinker", "Tolarian Academy", - "Trade Secrets", "Unexpected Potential", "Upheaval", "Weight Advantage", "Worldfire", "Worldknit", "Yawgmoth's Bargain")); + "Trade Secrets", "Unexpected Potential", "Upheaval", "Weight Advantage", "Worldfire", "Worldknit", "Yawgmoth's Bargain"); @Override public boolean apply(CardRules rules) { if (bannedCards.contains(rules.getName())) { @@ -70,8 +72,8 @@ public enum DeckFormat { }), Pauper ( Range.is(60), Range.between(0, 10), 1), Brawl ( Range.is(59), Range.between(0, 15), 1, null, new Predicate() { - private final Set bannedCards = new HashSet(Arrays.asList( - "Baral, Chief of Compliance","Smuggler's Copter","Sorcerous Spyglass")); + private final Set bannedCards = ImmutableSet.of( + "Baral, Chief of Compliance","Smuggler's Copter","Sorcerous Spyglass"); @Override public boolean apply(PaperCard card) { //why do we need to hard code the bannings here - they are defined in the GameFormat predicate used below @@ -81,7 +83,7 @@ public enum DeckFormat { return StaticData.instance() == null ? false : StaticData.instance().getBrawlPredicate().apply(card); } }) { - private final ImmutableSet bannedCommanders = ImmutableSet.of("Baral, Chief of Compliance"); + private final Set bannedCommanders = ImmutableSet.of("Baral, Chief of Compliance"); @Override public boolean isLegalCommander(CardRules rules) { @@ -89,11 +91,11 @@ public enum DeckFormat { } }, TinyLeaders ( Range.is(49), Range.between(0, 10), 1, new Predicate() { - private final Set bannedCards = new HashSet(Arrays.asList( + private final Set bannedCards = ImmutableSet.of( "Ancestral Recall", "Balance", "Black Lotus", "Black Vise", "Channel", "Chaos Orb", "Contract From Below", "Counterbalance", "Darkpact", "Demonic Attorney", "Demonic Tutor", "Earthcraft", "Edric, Spymaster of Trest", "Falling Star", "Fastbond", "Flash", "Goblin Recruiter", "Grindstone", "Hermit Druid", "Imperial Seal", "Jeweled Bird", "Karakas", "Library of Alexandria", "Mana Crypt", "Mana Drain", "Mana Vault", "Metalworker", "Mind Twist", "Mishra's Workshop", "Mox Emerald", "Mox Jet", "Mox Pearl", "Mox Ruby", "Mox Sapphire", "Necropotence", "Shahrazad", "Skullclamp", "Sol Ring", "Strip Mine", "Survival of the Fittest", "Sword of Body and Mind", "Time Vault", "Time Walk", "Timetwister", - "Timmerian Fiends", "Tolarian Academy", "Umezawa's Jitte", "Vampiric Tutor", "Wheel of Fortune", "Yawgmoth's Will")); + "Timmerian Fiends", "Tolarian Academy", "Umezawa's Jitte", "Vampiric Tutor", "Wheel of Fortune", "Yawgmoth's Will"); @Override public boolean apply(CardRules rules) { @@ -112,7 +114,7 @@ public enum DeckFormat { return true; } }) { - private final ImmutableSet bannedCommanders = ImmutableSet.of("Derevi, Empyrial Tactician", "Erayo, Soratami Ascendant", "Rofellos, Llanowar Emissary"); + private final Set bannedCommanders = ImmutableSet.of("Derevi, Empyrial Tactician", "Erayo, Soratami Ascendant", "Rofellos, Llanowar Emissary"); @Override public boolean isLegalCommander(CardRules rules) { @@ -141,13 +143,6 @@ public enum DeckFormat { private final static String ADVPROCLAMATION = "Advantageous Proclamation"; private final static String SOVREALM = "Sovereign's Realm"; - private static final List limitExceptions = Arrays.asList( - new String[]{"Relentless Rats", "Shadowborn Apostle", "Rat Colony"}); - - public static List getLimitExceptions(){ - return limitExceptions; - } - private DeckFormat(Range mainRange0, Range sideRange0, int maxCardCopies0, Predicate cardPoolFilter0, Predicate paperCardPoolFilter0) { mainRange = mainRange0; sideRange = sideRange0; @@ -342,7 +337,6 @@ public enum DeckFormat { //basic lands, Shadowborn Apostle, Relentless Rats and Rat Colony final CardPool allCards = deck.getAllCardsInASinglePool(hasCommander()); - final ImmutableSet limitExceptions = ImmutableSet.of("Relentless Rats", "Shadowborn Apostle", "Rat Colony"); // should group all cards by name, so that different editions of same card are really counted as the same card for (final Entry cp : Aggregates.groupSumBy(allCards, PaperCard.FN_GET_NAME)) { @@ -351,8 +345,7 @@ public enum DeckFormat { return TextUtil.concatWithSpace("contains the nonexisting card", cp.getKey()); } - final boolean canHaveMultiple = simpleCard.getRules().getType().isBasicLand() || limitExceptions.contains(cp.getKey()); - if (!canHaveMultiple && cp.getValue() > maxCopies) { + if (!canHaveAnyNumberOf(simpleCard) && cp.getValue() > maxCopies) { return TextUtil.concatWithSpace("must not contain more than", String.valueOf(maxCopies), "copies of the card", cp.getKey()); } } @@ -370,6 +363,12 @@ public enum DeckFormat { return null; } + public static boolean canHaveAnyNumberOf(final IPaperCard icard) { + return icard.getRules().getType().isBasicLand() + || Iterables.contains(icard.getRules().getMainPart().getKeywords(), + "A deck can have any number of cards named CARDNAME."); + } + public static String getPlaneSectionConformanceProblem(final CardPool planes) { //Must contain at least 10 planes/phenomenons, but max 2 phenomenons. Singleton. if (planes == null || planes.countAll() < 10) { 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 8c35c67ec10..bce6256d230 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 @@ -201,8 +201,7 @@ public abstract class ACEditorBase { if (deck == null || card == null) { max = Integer.MAX_VALUE; } - else if (limit == CardLimit.None || card.getRules().getType().isBasic() || DeckFormat.getLimitExceptions().contains(card.getName())) { + else if (limit == CardLimit.None || DeckFormat.canHaveAnyNumberOf(card)) { max = Integer.MAX_VALUE; if (parentScreen.isLimitedEditor() && !isAddSource) { //prevent adding more than is in other pool when editing limited decks diff --git a/forge-gui/res/cardsfolder/r/rat_colony.txt b/forge-gui/res/cardsfolder/r/rat_colony.txt index a721c026b14..74348ead913 100644 --- a/forge-gui/res/cardsfolder/r/rat_colony.txt +++ b/forge-gui/res/cardsfolder/r/rat_colony.txt @@ -1,8 +1,8 @@ Name:Rat Colony ManaCost:1 B Types:Creature Rat -Text:A deck can have any number of cards named Rat Colony. PT:2/1 +K:A deck can have any number of cards named CARDNAME. S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | References$ X | Description$ CARDNAME gets +1/+0 for each other Rat you control. SVar:X:Count$Valid Rat.YouCtrl+Other SVar:BuffedBy:Rat diff --git a/forge-gui/res/cardsfolder/r/relentless_rats.txt b/forge-gui/res/cardsfolder/r/relentless_rats.txt index 0ac935d7fb6..282a1c808a2 100644 --- a/forge-gui/res/cardsfolder/r/relentless_rats.txt +++ b/forge-gui/res/cardsfolder/r/relentless_rats.txt @@ -1,8 +1,8 @@ Name:Relentless Rats ManaCost:1 B B Types:Creature Rat -Text:A deck can have any number of cards named Relentless Rats. PT:2/2 +K:A deck can have any number of cards named CARDNAME. S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | AddToughness$ X | References$ X | Description$ CARDNAME gets +1/+1 for each other creature on the battlefield named Relentless Rats. SVar:X:Count$Valid Creature.namedRelentless Rats+Other SVar:BuffedBy:Creature.namedRelentless Rats diff --git a/forge-gui/res/cardsfolder/s/shadowborn_apostle.txt b/forge-gui/res/cardsfolder/s/shadowborn_apostle.txt index 9a3a4a19947..c8598df5774 100644 --- a/forge-gui/res/cardsfolder/s/shadowborn_apostle.txt +++ b/forge-gui/res/cardsfolder/s/shadowborn_apostle.txt @@ -1,11 +1,11 @@ Name:Shadowborn Apostle ManaCost:B Types:Creature Human Cleric -Text:A deck can have any number of cards named Shadowborn Apostle. PT:1/1 +K:A deck can have any number of cards named CARDNAME. A:AB$ ChangeZone | Cost$ B Sac<6/Creature.namedShadowborn Apostle/creatures named Shadowborn Apostle> | Origin$ Library | Destination$ Battlefield | ChangeType$ Creature.Demon | ChangeNum$ 1 | SpellDescription$ Search your library for a Demon creature, put it onto the battlefield, then shuffle your library. DeckNeeds:Name$Shadowborn Apostle DeckNeeds:Type$Demon DeckHints:Name$Shadowborn Demon SVar:Picture:http://www.wizards.com/global/images/magic/general/shadowborn_apostle.jpg -Oracle:A deck can have any number of cards named Shadowborn Apostle.\n{B}, Sacrifice six creatures named Shadowborn Apostle: Search your library for a Demon creature card, put it onto the battlefield, then shuffle your library. \ No newline at end of file +Oracle:A deck can have any number of cards named Shadowborn Apostle.\n{B}, Sacrifice six creatures named Shadowborn Apostle: Search your library for a Demon creature card, put it onto the battlefield, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/upcoming/persistent_petitioners.txt b/forge-gui/res/cardsfolder/upcoming/persistent_petitioners.txt new file mode 100644 index 00000000000..52b58776834 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/persistent_petitioners.txt @@ -0,0 +1,10 @@ +Name:Persistent Petitioners +ManaCost:1 U +Types:Creature Human Advisor +PT:1/3 +K:A deck can have any number of cards named CARDNAME. +A:AB$ Mill | Cost$ 1 T | NumCards$ 1 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player puts the top card of their library into their graveyard. +A:AB$ Mill | Cost$ tapXType<4/Advisor> | NumCards$ 12 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player puts the top twelve cards of their library into their graveyard. +SVar:BuffedBy:Creature.namedPersistent Petitioners +DeckNeeds:Type$Advisor +Oracle:{1}, {T}: Target player puts the top card of their library into their graveyard.\nTap four untapped Advisors you control: Target player puts the top twelve cards of their library into their graveyard.\nA deck can have any number of cards named Persistent Petitioners. diff --git a/forge-gui/src/main/java/forge/quest/QuestSpellShop.java b/forge-gui/src/main/java/forge/quest/QuestSpellShop.java index 96eae768963..5924404f35f 100644 --- a/forge-gui/src/main/java/forge/quest/QuestSpellShop.java +++ b/forge-gui/src/main/java/forge/quest/QuestSpellShop.java @@ -358,7 +358,7 @@ public class QuestSpellShop { } //If this card has an exception to the card limit, e.g.: Relentless Rats, get the quest preference - if (DeckFormat.getLimitExceptions().contains(card.getName())) { + if (DeckFormat.canHaveAnyNumberOf(card)) { numToKeep = FModel.getQuestPreferences().getPrefInt(QPref.PLAYSET_ANY_NUMBER_SIZE); } From 3b38547fc976e77e2f34b0c56f10f5e4d780a5cd Mon Sep 17 00:00:00 2001 From: Chris H Date: Sat, 12 Jan 2019 22:55:23 -0500 Subject: [PATCH 577/901] Replace asterisks with x's for token filenames --- forge-core/src/main/java/forge/item/PaperToken.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/forge-core/src/main/java/forge/item/PaperToken.java b/forge-core/src/main/java/forge/item/PaperToken.java index bc709dace7a..5cc3c5c3dee 100644 --- a/forge-core/src/main/java/forge/item/PaperToken.java +++ b/forge-core/src/main/java/forge/item/PaperToken.java @@ -100,8 +100,7 @@ public class PaperToken implements InventoryItemFromSet, IPaperCard { build.add(edition.getCode()); } - // Should future image file names be all lower case? Instead of Up case sets? - return StringUtils.join(build, "_").toLowerCase(); + return StringUtils.join(build, "_").replace('*', 'x').toLowerCase(); } public PaperToken(final CardRules c) { this(c, null, null); } From fdc1c322875d255fd06986057ad27b7ce3eb30c6 Mon Sep 17 00:00:00 2001 From: Chris H Date: Sat, 12 Jan 2019 23:49:09 -0500 Subject: [PATCH 578/901] Remove partial paris mulligan --- .../src/main/java/forge/game/GameAction.java | 53 ++++--------------- 1 file changed, 11 insertions(+), 42 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 5f4aca9bc45..1d178bd35f2 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -52,7 +52,6 @@ import forge.util.maps.HashMapOfLists; import forge.util.maps.MapOfLists; import java.util.*; -import java.util.Map.Entry; /** * Methods for common actions performed during a game. @@ -1674,12 +1673,8 @@ public class GameAction { // rule 103.4b boolean isMultiPlayer = game.getPlayers().size() > 2; - int mulliganDelta = isMultiPlayer ? 0 : 1; - // https://magic.wizards.com/en/articles/archive/feature/checking-brawl-2018-07-09 - if (game.getRules().hasAppliedVariant(GameType.Brawl) && !isMultiPlayer){ - mulliganDelta = 0; - } + int mulliganDelta = isMultiPlayer || game.getRules().hasAppliedVariant(GameType.Brawl) ? 0 : 1; boolean allKept; do { @@ -1695,32 +1690,17 @@ public class GameAction { } if (toMulligan != null && !toMulligan.isEmpty()) { - if (!isCommander) { - toMulligan = new CardCollection(p.getCardsIn(ZoneType.Hand)); - for (final Card c : toMulligan) { - moveToLibrary(c, null, null); - } - try { - Thread.sleep(100); //delay for a tiny bit to give UI a chance catch up - } catch (InterruptedException e) { - e.printStackTrace(); - } - p.shuffle(null); - p.drawCards(handSize[i] - mulliganDelta); - } else { - List toExile = Lists.newArrayList(toMulligan); - for (Card c : toExile) { - exile(c, null, null); - } - exiledDuringMulligans.addAll(p, toExile); - try { - Thread.sleep(100); //delay for a tiny bit to give UI a chance catch up - } catch (InterruptedException e) { - e.printStackTrace(); - } - p.drawCards(toExile.size() - 1); + toMulligan = new CardCollection(p.getCardsIn(ZoneType.Hand)); + for (final Card c : toMulligan) { + moveToLibrary(c, null, null); } - + try { + Thread.sleep(100); //delay for a tiny bit to give UI a chance catch up + } catch (InterruptedException e) { + e.printStackTrace(); + } + p.shuffle(null); + p.drawCards(handSize[i] - mulliganDelta); p.onMulliganned(); allKept = false; } else { @@ -1731,17 +1711,6 @@ public class GameAction { mulliganDelta++; } while (!allKept); - if (isCommander) { - for (Entry> kv : exiledDuringMulligans.entrySet()) { - Player p = kv.getKey(); - Collection cc = kv.getValue(); - for (Card c : cc) { - moveToLibrary(c, null, null); - } - p.shuffle(null); - } - } - //Vancouver Mulligan for(Player p : whoCanMulligan) { if (p.getStartingHandSize() > p.getZone(ZoneType.Hand).size()) { From 81f07cb8a3dce5c450610bfed90275c1248eb065 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Sun, 13 Jan 2019 09:44:15 +0000 Subject: [PATCH 579/901] Sentry: add more Breadcumbs --- .../forge/game/ability/AbilityFactory.java | 13 +- .../src/main/java/forge/game/card/Card.java | 472 +++++++++--------- .../java/forge/game/card/CardFactory.java | 4 +- 3 files changed, 256 insertions(+), 233 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/AbilityFactory.java b/forge-game/src/main/java/forge/game/ability/AbilityFactory.java index b068872a5b4..9608f656005 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityFactory.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityFactory.java @@ -28,6 +28,8 @@ import forge.game.cost.Cost; import forge.game.spellability.*; import forge.game.zone.ZoneType; import forge.util.FileSection; +import io.sentry.Sentry; +import io.sentry.event.BreadcrumbBuilder; import java.util.List; import java.util.Map; @@ -130,7 +132,16 @@ public final class AbilityFactory { String source = state.getName().isEmpty() ? abString : state.getName(); throw new RuntimeException("AbilityFactory : getAbility -- no API in " + source + ": " + abString); } - return getAbility(mapParams, type, state, parent); + try { + return getAbility(mapParams, type, state, parent); + } catch (Error | Exception ex) { + String msg = "AbilityFactory:getAbility: crash when trying to create ability "; + Sentry.getContext().recordBreadcrumb( + new BreadcrumbBuilder().setMessage(msg) + .withData("Card", state.getName()).withData("Ability", abString).build() + ); + throw new RuntimeException(msg + " of card: " + state.getName(), ex); + } } public static final SpellAbility getAbility(final Card hostCard, final String svar) { diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index c7c5a495107..a7b361ccb6e 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -1447,250 +1447,260 @@ public class Card extends GameEntity implements Comparable { int i = 0; for (KeywordInterface inst : keywords) { String keyword = inst.getOriginal(); - if (keyword.startsWith("SpellCantTarget")) { - continue; - } - // format text changes - if (CardUtil.isKeywordModifiable(keyword) - && keywordsGrantedByTextChanges.contains(inst)) { - for (final Entry e : textChanges) { - final String value = e.getValue(); - if (keyword.contains(value)) { - keyword = TextUtil.fastReplace(keyword, value, - TextUtil.concatNoSpace("", e.getKey(), " ", value)); - // assume (for now) max one change per keyword - break; + try { + if (keyword.startsWith("SpellCantTarget")) { + continue; + } + // format text changes + if (CardUtil.isKeywordModifiable(keyword) + && keywordsGrantedByTextChanges.contains(inst)) { + for (final Entry e : textChanges) { + final String value = e.getValue(); + if (keyword.contains(value)) { + keyword = TextUtil.fastReplace(keyword, value, + TextUtil.concatNoSpace("", e.getKey(), " ", value)); + // assume (for now) max one change per keyword + break; + } } } - } - if (keyword.startsWith("CantBeCounteredBy")) { - final String[] p = keyword.split(":"); - sbLong.append(p[2]).append("\r\n"); - } else if (keyword.startsWith("etbCounter")) { - final String[] p = keyword.split(":"); - final StringBuilder s = new StringBuilder(); - if (p.length > 4) { - if (!"no desc".equals(p[4])) { - s.append(p[4]); + if (keyword.startsWith("CantBeCounteredBy")) { + final String[] p = keyword.split(":"); + sbLong.append(p[2]).append("\r\n"); + } else if (keyword.startsWith("etbCounter")) { + final String[] p = keyword.split(":"); + final StringBuilder s = new StringBuilder(); + if (p.length > 4) { + if (!"no desc".equals(p[4])) { + s.append(p[4]); + } + } else { + s.append(getName()); + s.append(" enters the battlefield with "); + s.append(Lang.nounWithNumeral(p[2], CounterType.valueOf(p[1]).getName() + " counter")); + s.append(" on it."); } - } else { - s.append(getName()); - s.append(" enters the battlefield with "); - s.append(Lang.nounWithNumeral(p[2], CounterType.valueOf(p[1]).getName() + " counter")); - s.append(" on it."); - } - sbLong.append(s).append("\r\n"); - } else if (keyword.startsWith("Protection:")) { - final String[] k = keyword.split(":"); - sbLong.append(k[2]).append("\r\n"); - } else if (keyword.startsWith("Creatures can't attack unless their controller pays")) { - final String[] k = keyword.split(":"); - if (!k[3].equals("no text")) { - sbLong.append(k[3]).append("\r\n"); - } - } else if (keyword.startsWith("Enchant")) { - String k = keyword; - k = TextUtil.fastReplace(k, "Curse", ""); - sbLong.append(k).append("\r\n"); - } else if (keyword.startsWith("Ripple")) { - sbLong.append(TextUtil.fastReplace(keyword, ":", " ")).append("\r\n"); - } else if (keyword.startsWith("Madness")) { - String[] parts = keyword.split(":"); - // If no colon exists in Madness keyword, it must have been granted and assumed the cost from host - if (parts.length < 2) { - sbLong.append(parts[0]).append(" ").append(this.getManaCost()).append("\r\n"); - } else { - sbLong.append(parts[0]).append(" ").append(ManaCostParser.parse(parts[1])).append("\r\n"); - } - } else if (keyword.startsWith("Morph") || keyword.startsWith("Megamorph")) { - String[] k = keyword.split(":"); - sbLong.append(k[0]); - if (k.length > 1) { - final Cost mCost = new Cost(k[1], true); - if (!mCost.isOnlyManaCost()) { - sbLong.append("—"); + sbLong.append(s).append("\r\n"); + } else if (keyword.startsWith("Protection:")) { + final String[] k = keyword.split(":"); + sbLong.append(k[2]).append("\r\n"); + } else if (keyword.startsWith("Creatures can't attack unless their controller pays")) { + final String[] k = keyword.split(":"); + if (!k[3].equals("no text")) { + sbLong.append(k[3]).append("\r\n"); } - if (mCost.isOnlyManaCost()) { - sbLong.append(" "); + } else if (keyword.startsWith("Enchant")) { + String k = keyword; + k = TextUtil.fastReplace(k, "Curse", ""); + sbLong.append(k).append("\r\n"); + } else if (keyword.startsWith("Ripple")) { + sbLong.append(TextUtil.fastReplace(keyword, ":", " ")).append("\r\n"); + } else if (keyword.startsWith("Madness")) { + String[] parts = keyword.split(":"); + // If no colon exists in Madness keyword, it must have been granted and assumed the cost from host + if (parts.length < 2) { + sbLong.append(parts[0]).append(" ").append(this.getManaCost()).append("\r\n"); + } else { + sbLong.append(parts[0]).append(" ").append(ManaCostParser.parse(parts[1])).append("\r\n"); } - sbLong.append(mCost.toString()).delete(sbLong.length() - 2, sbLong.length()); - if (!mCost.isOnlyManaCost()) { - sbLong.append("."); + } else if (keyword.startsWith("Morph") || keyword.startsWith("Megamorph")) { + String[] k = keyword.split(":"); + sbLong.append(k[0]); + if (k.length > 1) { + final Cost mCost = new Cost(k[1], true); + if (!mCost.isOnlyManaCost()) { + sbLong.append("—"); + } + if (mCost.isOnlyManaCost()) { + sbLong.append(" "); + } + sbLong.append(mCost.toString()).delete(sbLong.length() - 2, sbLong.length()); + if (!mCost.isOnlyManaCost()) { + sbLong.append("."); + } + sbLong.append(" (" + inst.getReminderText() + ")"); + sbLong.append("\r\n"); } + } else if (keyword.startsWith("Emerge")) { + final String[] k = keyword.split(":"); + sbLong.append(k[0]).append(" ").append(ManaCostParser.parse(k[1])); sbLong.append(" (" + inst.getReminderText() + ")"); sbLong.append("\r\n"); - } - } else if (keyword.startsWith("Emerge")) { - final String[] k = keyword.split(":"); - sbLong.append(k[0]).append(" ").append(ManaCostParser.parse(k[1])); - sbLong.append(" (" + inst.getReminderText() + ")"); - sbLong.append("\r\n"); - } else if (keyword.startsWith("Echo")) { - sbLong.append("Echo "); - final String[] upkeepCostParams = keyword.split(":"); - sbLong.append(upkeepCostParams.length > 2 ? "- " + upkeepCostParams[2] : ManaCostParser.parse(upkeepCostParams[1])); - sbLong.append(" (At the beginning of your upkeep, if CARDNAME came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.)"); - sbLong.append("\r\n"); - } else if (keyword.startsWith("Cumulative upkeep")) { - sbLong.append("Cumulative upkeep "); - final String[] upkeepCostParams = keyword.split(":"); - sbLong.append(upkeepCostParams.length > 2 ? "- " + upkeepCostParams[2] : ManaCostParser.parse(upkeepCostParams[1])); - sbLong.append("\r\n"); - } else if (keyword.startsWith("Alternative Cost")) { - sbLong.append("Has alternative cost."); - } else if (keyword.startsWith("AlternateAdditionalCost")) { - final String costString1 = keyword.split(":")[1]; - final String costString2 = keyword.split(":")[2]; - final Cost cost1 = new Cost(costString1, false); - final Cost cost2 = new Cost(costString2, false); - sbLong.append("As an additional cost to cast ") - .append(getName()).append(", ") - .append(cost1.toSimpleString()) - .append(" or pay ") - .append(cost2.toSimpleString()) - .append(".\r\n"); - } else if (keyword.startsWith("Multikicker")) { - if (!keyword.endsWith("Generic")) { - final String[] n = keyword.split(":"); - final Cost cost = new Cost(n[1], false); - sbLong.append("Multikicker ").append(cost.toSimpleString()); - sbLong.append(" (" + inst.getReminderText() + ")").append("\r\n"); - } - } else if (keyword.startsWith("Kicker")) { - if (!keyword.endsWith("Generic")) { - final StringBuilder sbx = new StringBuilder(); - final String[] n = keyword.split(":"); - sbx.append("Kicker "); - final Cost cost = new Cost(n[1], false); - sbx.append(cost.toSimpleString()); - if (Lists.newArrayList(n).size() > 2) { - sbx.append(" and/or "); - final Cost cost2 = new Cost(n[2], false); - sbx.append(cost2.toSimpleString()); + } else if (keyword.startsWith("Echo")) { + sbLong.append("Echo "); + final String[] upkeepCostParams = keyword.split(":"); + sbLong.append(upkeepCostParams.length > 2 ? "- " + upkeepCostParams[2] : ManaCostParser.parse(upkeepCostParams[1])); + sbLong.append(" (At the beginning of your upkeep, if CARDNAME came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.)"); + sbLong.append("\r\n"); + } else if (keyword.startsWith("Cumulative upkeep")) { + sbLong.append("Cumulative upkeep "); + final String[] upkeepCostParams = keyword.split(":"); + sbLong.append(upkeepCostParams.length > 2 ? "- " + upkeepCostParams[2] : ManaCostParser.parse(upkeepCostParams[1])); + sbLong.append("\r\n"); + } else if (keyword.startsWith("Alternative Cost")) { + sbLong.append("Has alternative cost."); + } else if (keyword.startsWith("AlternateAdditionalCost")) { + final String costString1 = keyword.split(":")[1]; + final String costString2 = keyword.split(":")[2]; + final Cost cost1 = new Cost(costString1, false); + final Cost cost2 = new Cost(costString2, false); + sbLong.append("As an additional cost to cast ") + .append(getName()).append(", ") + .append(cost1.toSimpleString()) + .append(" or pay ") + .append(cost2.toSimpleString()) + .append(".\r\n"); + } else if (keyword.startsWith("Multikicker")) { + if (!keyword.endsWith("Generic")) { + final String[] n = keyword.split(":"); + final Cost cost = new Cost(n[1], false); + sbLong.append("Multikicker ").append(cost.toSimpleString()); + sbLong.append(" (" + inst.getReminderText() + ")").append("\r\n"); } - sbx.append(" (" + inst.getReminderText() + ")"); - sbLong.append(sbx).append("\r\n"); - } - } else if (keyword.startsWith("Hexproof:")) { - final String k[] = keyword.split(":"); - sbLong.append("Hexproof from ").append(k[2]) - .append(" (").append(inst.getReminderText()).append(")").append("\r\n"); - } else if (keyword.endsWith(".") && !keyword.startsWith("Haunt")) { - sbLong.append(keyword).append("\r\n"); - } else if (keyword.startsWith("Presence") || keyword.startsWith("MayFlash")) { - // Pseudo keywords, only print Reminder - sbLong.append(inst.getReminderText()); - } else if (keyword.contains("At the beginning of your upkeep, ") - && keyword.contains(" unless you pay")) { - sbLong.append(keyword).append("\r\n"); - } else if (keyword.startsWith("Strive") || keyword.startsWith("Escalate") - || keyword.startsWith("ETBReplacement") - || keyword.startsWith("CantBeBlockedBy ") - || keyword.startsWith("Affinity") - || keyword.equals("CARDNAME enters the battlefield tapped.") - || keyword.startsWith("UpkeepCost")) { - } else if (keyword.equals("Provoke") || keyword.equals("Ingest") || keyword.equals("Unleash") - || keyword.equals("Soulbond") || keyword.equals("Partner") || keyword.equals("Retrace") - || keyword.equals("Living Weapon") || keyword.equals("Myriad") || keyword.equals("Exploit") - || keyword.equals("Changeling") || keyword.equals("Delve") - || keyword.equals("Split second") - || keyword.equals("Suspend") // for the ones without amounnt - || keyword.equals("Hideaway") || keyword.equals("Ascend") - || keyword.equals("Totem armor") || keyword.equals("Battle cry") - || keyword.equals("Devoid") || keyword.equals("Riot")){ - sbLong.append(keyword + " (" + inst.getReminderText() + ")"); - } else if (keyword.startsWith("Partner:")) { - final String[] k = keyword.split(":"); - sbLong.append("Partner with " + k[1] + " (" + inst.getReminderText() + ")"); - } else if (keyword.startsWith("Modular") || keyword.startsWith("Bloodthirst") || keyword.startsWith("Dredge") - || keyword.startsWith("Fabricate") || keyword.startsWith("Soulshift") || keyword.startsWith("Bushido") - || keyword.startsWith("Crew") || keyword.startsWith("Tribute") || keyword.startsWith("Absorb") - || keyword.startsWith("Graft") || keyword.startsWith("Fading") || keyword.startsWith("Vanishing") - || keyword.startsWith("Afterlife") - || keyword.startsWith("Afflict") || keyword.startsWith ("Poisonous") || keyword.startsWith("Rampage") - || keyword.startsWith("Renown") || keyword.startsWith("Annihilator") || keyword.startsWith("Devour")) { - final String[] k = keyword.split(":"); - sbLong.append(k[0] + " " + k[1] + " (" + inst.getReminderText() + ")"); - } else if (keyword.contains("Haunt")) { - sb.append("\r\nHaunt ("); - if (isCreature()) { - sb.append("When this creature dies, exile it haunting target creature."); - } else { - sb.append("When this spell card is put into a graveyard after resolving, "); - sb.append("exile it haunting target creature."); - } - sb.append(")"); - } else if (keyword.equals("Convoke") || keyword.equals("Dethrone")|| keyword.equals("Fear") - || keyword.equals("Melee") || keyword.equals("Improvise")|| keyword.equals("Shroud") - || keyword.equals("Banding") || keyword.equals("Intimidate")|| keyword.equals("Evolve") - || keyword.equals("Exalted") || keyword.equals("Extort")|| keyword.equals("Flanking") - || keyword.equals("Horsemanship") || keyword.equals("Infect")|| keyword.equals("Persist") - || keyword.equals("Phasing") || keyword.equals("Shadow")|| keyword.equals("Skulk") - || keyword.equals("Undying") || keyword.equals("Wither") || keyword.equals("Cascade") - || keyword.equals("Mentor")) { - if (sb.length() != 0) { - sb.append("\r\n"); - } - sb.append(keyword + " (" + inst.getReminderText() + ")"); - } else if (keyword.endsWith(" offering")) { - String offeringType = keyword.split(" ")[0]; - if (sb.length() != 0) { - sb.append("\r\n"); - } - sbLong.append(keyword); - sbLong.append(" (" + Keyword.getInstance("Offering:"+ offeringType).getReminderText() + ")"); - } else if (keyword.startsWith("Equip") || keyword.startsWith("Fortify") || keyword.startsWith("Outlast") - || keyword.startsWith("Unearth") || keyword.startsWith("Scavenge") || keyword.startsWith("Spectacle") - || keyword.startsWith("Evoke") || keyword.startsWith("Bestow") || keyword.startsWith("Dash") - || keyword.startsWith("Surge") || keyword.startsWith("Transmute") || keyword.startsWith("Suspend") - || keyword.equals("Undaunted") || keyword.startsWith("Monstrosity") || keyword.startsWith("Embalm") - || keyword.startsWith("Level up") || keyword.equals("Prowess") || keyword.startsWith("Eternalize") - || keyword.startsWith("Reinforce") || keyword.startsWith("Champion") || keyword.startsWith("Prowl") - || keyword.startsWith("Amplify") || keyword.startsWith("Ninjutsu") || keyword.startsWith("Adapt") - || keyword.startsWith("Cycling") || keyword.startsWith("TypeCycling")) { - // keyword parsing takes care of adding a proper description - } else if (keyword.startsWith("CantBeBlockedByAmount")) { - sbLong.append(getName()).append(" can't be blocked "); - sbLong.append(getTextForKwCantBeBlockedByAmount(keyword)); - } else if (keyword.startsWith("CantBlock")) { - sbLong.append(getName()).append(" can't block "); - if (keyword.contains("CardUID")) { - sbLong.append("CardID (").append(Integer.valueOf(keyword.split("CantBlockCardUID_")[1])).append(")"); - } else { + } else if (keyword.startsWith("Kicker")) { + if (!keyword.endsWith("Generic")) { + final StringBuilder sbx = new StringBuilder(); + final String[] n = keyword.split(":"); + sbx.append("Kicker "); + final Cost cost = new Cost(n[1], false); + sbx.append(cost.toSimpleString()); + if (Lists.newArrayList(n).size() > 2) { + sbx.append(" and/or "); + final Cost cost2 = new Cost(n[2], false); + sbx.append(cost2.toSimpleString()); + } + sbx.append(" (" + inst.getReminderText() + ")"); + sbLong.append(sbx).append("\r\n"); + } + } else if (keyword.startsWith("Hexproof:")) { + final String k[] = keyword.split(":"); + sbLong.append("Hexproof from ").append(k[2]) + .append(" (").append(inst.getReminderText()).append(")").append("\r\n"); + } else if (keyword.endsWith(".") && !keyword.startsWith("Haunt")) { + sbLong.append(keyword).append("\r\n"); + } else if (keyword.startsWith("Presence") || keyword.startsWith("MayFlash")) { + // Pseudo keywords, only print Reminder + sbLong.append(inst.getReminderText()); + } else if (keyword.contains("At the beginning of your upkeep, ") + && keyword.contains(" unless you pay")) { + sbLong.append(keyword).append("\r\n"); + } else if (keyword.startsWith("Strive") || keyword.startsWith("Escalate") + || keyword.startsWith("ETBReplacement") + || keyword.startsWith("CantBeBlockedBy ") + || keyword.startsWith("Affinity") + || keyword.equals("CARDNAME enters the battlefield tapped.") + || keyword.startsWith("UpkeepCost")) { + } else if (keyword.equals("Provoke") || keyword.equals("Ingest") || keyword.equals("Unleash") + || keyword.equals("Soulbond") || keyword.equals("Partner") || keyword.equals("Retrace") + || keyword.equals("Living Weapon") || keyword.equals("Myriad") || keyword.equals("Exploit") + || keyword.equals("Changeling") || keyword.equals("Delve") + || keyword.equals("Split second") + || keyword.equals("Suspend") // for the ones without amounnt + || keyword.equals("Hideaway") || keyword.equals("Ascend") + || keyword.equals("Totem armor") || keyword.equals("Battle cry") + || keyword.equals("Devoid") || keyword.equals("Riot")){ + sbLong.append(keyword + " (" + inst.getReminderText() + ")"); + } else if (keyword.startsWith("Partner:")) { final String[] k = keyword.split(":"); - sbLong.append(k.length > 1 ? k[1] + ".\r\n" : ""); + sbLong.append("Partner with " + k[1] + " (" + inst.getReminderText() + ")"); + } else if (keyword.startsWith("Modular") || keyword.startsWith("Bloodthirst") || keyword.startsWith("Dredge") + || keyword.startsWith("Fabricate") || keyword.startsWith("Soulshift") || keyword.startsWith("Bushido") + || keyword.startsWith("Crew") || keyword.startsWith("Tribute") || keyword.startsWith("Absorb") + || keyword.startsWith("Graft") || keyword.startsWith("Fading") || keyword.startsWith("Vanishing") + || keyword.startsWith("Afterlife") + || keyword.startsWith("Afflict") || keyword.startsWith ("Poisonous") || keyword.startsWith("Rampage") + || keyword.startsWith("Renown") || keyword.startsWith("Annihilator") || keyword.startsWith("Devour")) { + final String[] k = keyword.split(":"); + sbLong.append(k[0] + " " + k[1] + " (" + inst.getReminderText() + ")"); + } else if (keyword.contains("Haunt")) { + sb.append("\r\nHaunt ("); + if (isCreature()) { + sb.append("When this creature dies, exile it haunting target creature."); + } else { + sb.append("When this spell card is put into a graveyard after resolving, "); + sb.append("exile it haunting target creature."); + } + sb.append(")"); + } else if (keyword.equals("Convoke") || keyword.equals("Dethrone")|| keyword.equals("Fear") + || keyword.equals("Melee") || keyword.equals("Improvise")|| keyword.equals("Shroud") + || keyword.equals("Banding") || keyword.equals("Intimidate")|| keyword.equals("Evolve") + || keyword.equals("Exalted") || keyword.equals("Extort")|| keyword.equals("Flanking") + || keyword.equals("Horsemanship") || keyword.equals("Infect")|| keyword.equals("Persist") + || keyword.equals("Phasing") || keyword.equals("Shadow")|| keyword.equals("Skulk") + || keyword.equals("Undying") || keyword.equals("Wither") || keyword.equals("Cascade") + || keyword.equals("Mentor")) { + if (sb.length() != 0) { + sb.append("\r\n"); + } + sb.append(keyword + " (" + inst.getReminderText() + ")"); + } else if (keyword.endsWith(" offering")) { + String offeringType = keyword.split(" ")[0]; + if (sb.length() != 0) { + sb.append("\r\n"); + } + sbLong.append(keyword); + sbLong.append(" (" + Keyword.getInstance("Offering:"+ offeringType).getReminderText() + ")"); + } else if (keyword.startsWith("Equip") || keyword.startsWith("Fortify") || keyword.startsWith("Outlast") + || keyword.startsWith("Unearth") || keyword.startsWith("Scavenge") || keyword.startsWith("Spectacle") + || keyword.startsWith("Evoke") || keyword.startsWith("Bestow") || keyword.startsWith("Dash") + || keyword.startsWith("Surge") || keyword.startsWith("Transmute") || keyword.startsWith("Suspend") + || keyword.equals("Undaunted") || keyword.startsWith("Monstrosity") || keyword.startsWith("Embalm") + || keyword.startsWith("Level up") || keyword.equals("Prowess") || keyword.startsWith("Eternalize") + || keyword.startsWith("Reinforce") || keyword.startsWith("Champion") || keyword.startsWith("Prowl") + || keyword.startsWith("Amplify") || keyword.startsWith("Ninjutsu") || keyword.startsWith("Adapt") + || keyword.startsWith("Cycling") || keyword.startsWith("TypeCycling")) { + // keyword parsing takes care of adding a proper description + } else if (keyword.startsWith("CantBeBlockedByAmount")) { + sbLong.append(getName()).append(" can't be blocked "); + sbLong.append(getTextForKwCantBeBlockedByAmount(keyword)); + } else if (keyword.startsWith("CantBlock")) { + sbLong.append(getName()).append(" can't block "); + if (keyword.contains("CardUID")) { + sbLong.append("CardID (").append(Integer.valueOf(keyword.split("CantBlockCardUID_")[1])).append(")"); + } else { + final String[] k = keyword.split(":"); + sbLong.append(k.length > 1 ? k[1] + ".\r\n" : ""); + } + } else if (keyword.equals("Unblockable")) { + sbLong.append(getName()).append(" can't be blocked.\r\n"); + } else if (keyword.equals("AllNonLegendaryCreatureNames")) { + sbLong.append(getName()).append(" has all names of nonlegendary creature cards.\r\n"); + } else if (keyword.startsWith("IfReach")) { + String k[] = keyword.split(":"); + sbLong.append(getName()).append(" can block ") + .append(CardType.getPluralType(k[1])) + .append(" as though it had reach.\r\n"); + } else if (keyword.startsWith("MayEffectFromOpeningHand")) { + final String[] k = keyword.split(":"); + // need to get SpellDescription from Svar + String desc = AbilityFactory.getMapParams(getSVar(k[1])).get("SpellDescription"); + sbLong.append(desc); + } else if (keyword.startsWith("Saga")) { + String k[] = keyword.split(":"); + String desc = "(As this Saga enters and after your draw step, " + + " add a lore counter. Sacrifice after " + Strings.repeat("I", Integer.valueOf(k[1])) + ".)"; + sbLong.append(desc); } - } else if (keyword.equals("Unblockable")) { - sbLong.append(getName()).append(" can't be blocked.\r\n"); - } else if (keyword.equals("AllNonLegendaryCreatureNames")) { - sbLong.append(getName()).append(" has all names of nonlegendary creature cards.\r\n"); - } else if (keyword.startsWith("IfReach")) { - String k[] = keyword.split(":"); - sbLong.append(getName()).append(" can block ") - .append(CardType.getPluralType(k[1])) - .append(" as though it had reach.\r\n"); - } else if (keyword.startsWith("MayEffectFromOpeningHand")) { - final String[] k = keyword.split(":"); - // need to get SpellDescription from Svar - String desc = AbilityFactory.getMapParams(getSVar(k[1])).get("SpellDescription"); - sbLong.append(desc); - } else if (keyword.startsWith("Saga")) { - String k[] = keyword.split(":"); - String desc = "(As this Saga enters and after your draw step, " - + " add a lore counter. Sacrifice after " + Strings.repeat("I", Integer.valueOf(k[1])) + ".)"; - sbLong.append(desc); - } - else { - if ((i != 0) && (sb.length() != 0)) { - sb.append(", "); + else { + if ((i != 0) && (sb.length() != 0)) { + sb.append(", "); + } + sb.append(keyword); + } + if (sbLong.length() > 0) { + sbLong.append("\r\n"); } - sb.append(keyword); - } - if (sbLong.length() > 0) { - sbLong.append("\r\n"); - } - i++; + i++; + } catch (Exception e) { + String msg = "Card:keywordToText: crash in Keyword parsing"; + Sentry.getContext().recordBreadcrumb( + new BreadcrumbBuilder().setMessage(msg) + .withData("Card", this.getName()).withData("Keyword", keyword).build() + ); + + throw new RuntimeException("Error in Card " + this.getName() + " with Keyword " + keyword, e); + } } if (sb.length() > 0) { sb.append("\r\n"); diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index 1be90bdfb1e..9a9f08e1551 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -430,6 +430,9 @@ public class CardFactory { private static void readCardFace(Card c, ICardFace face) { + // Name first so Senty has the Card name + c.setName(face.getName()); + for (String r : face.getReplacements()) c.addReplacementEffect(ReplacementHandler.parseReplacement(r, c, true)); for (String s : face.getStaticAbilities()) c.addStaticAbility(s); for (String t : face.getTriggers()) c.addTrigger(TriggerHandler.parseTrigger(t, c, true)); @@ -439,7 +442,6 @@ public class CardFactory { // keywords not before variables c.addIntrinsicKeywords(face.getKeywords(), false); - c.setName(face.getName()); c.setManaCost(face.getManaCost()); c.setText(face.getNonAbilityText()); From 2640a509f95a80b4a598c570fdd4773289edba8c Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Sun, 13 Jan 2019 14:10:44 +0000 Subject: [PATCH 580/901] Sunburst: rewrite using ETB counter --- .../src/main/java/forge/ai/ComputerUtil.java | 4 +- .../java/forge/ai/ComputerUtilCombat.java | 2 +- .../java/forge/ai/ability/ManifestAi.java | 2 +- .../src/main/java/forge/game/card/Card.java | 5 +- .../java/forge/game/card/CardFactoryUtil.java | 53 +++++++------------ .../game/replacement/ReplacementEffect.java | 2 +- .../game/replacement/ReplacementLayer.java | 3 +- .../res/cardsfolder/b/benalish_lancer.txt | 8 +-- .../res/cardsfolder/b/bloodspore_thrinax.txt | 8 +-- .../res/cardsfolder/b/bramblewood_paragon.txt | 7 +-- .../res/cardsfolder/d/dearly_departed.txt | 7 +-- forge-gui/res/cardsfolder/k/kavu_titan.txt | 8 +-- .../res/cardsfolder/m/master_biomancer.txt | 8 +-- .../res/cardsfolder/m/metallic_mimic.txt | 6 +-- .../cardsfolder/m/muzzios_preparations.txt | 5 +- .../res/cardsfolder/o/oath_of_gideon.txt | 6 +-- .../res/cardsfolder/o/oonas_blackguard.txt | 7 +-- .../res/cardsfolder/p/protean_raider.txt | 2 +- .../res/cardsfolder/s/sage_of_fables.txt | 6 +-- .../res/cardsfolder/z/zameck_guildmage.txt | 2 +- 20 files changed, 70 insertions(+), 81 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index 96ec1f25169..d1c5aca39a8 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -2847,7 +2847,7 @@ public class ComputerUtil { repParams.put("Source", source); List list = player.getGame().getReplacementHandler().getReplacementList(repParams, - ReplacementLayer.None); + ReplacementLayer.Other); if (Iterables.any(list, CardTraitPredicates.hasParam("AiLogic", "NoLife"))) { return false; @@ -2878,7 +2878,7 @@ public class ComputerUtil { repParams.put("Source", source); List list = player.getGame().getReplacementHandler().getReplacementList(repParams, - ReplacementLayer.None); + ReplacementLayer.Other); if (Iterables.any(list, CardTraitPredicates.hasParam("AiLogic", "NoLife"))) { // no life gain is not negative diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java index e2393972f59..800f623ca5e 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java @@ -2590,7 +2590,7 @@ public class ComputerUtilCombat { // repParams.put("PreventMap", preventMap); List list = game.getReplacementHandler().getReplacementList(repParams, - ReplacementLayer.None); + ReplacementLayer.Other); return !list.isEmpty(); } diff --git a/forge-ai/src/main/java/forge/ai/ability/ManifestAi.java b/forge-ai/src/main/java/forge/ai/ability/ManifestAi.java index 509ff22f3a0..94a878c8afe 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ManifestAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ManifestAi.java @@ -113,7 +113,7 @@ public class ManifestAi extends SpellAbilityAi { repParams.put("Origin", ZoneType.Library); repParams.put("Destination", ZoneType.Battlefield); repParams.put("Source", sa.getHostCard()); - List list = game.getReplacementHandler().getReplacementList(repParams, ReplacementLayer.None); + List list = game.getReplacementHandler().getReplacementList(repParams, ReplacementLayer.Other); if (!list.isEmpty()) { return false; } diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index a7b361ccb6e..8ded947cd48 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -1051,7 +1051,8 @@ public class Card extends GameEntity implements Comparable { } public final boolean hasConverge() { - return "Count$Converge".equals(getSVar("X")) || "Count$Converge".equals(getSVar("Y")) || hasKeyword("Sunburst"); + return "Count$Converge".equals(getSVar("X")) || "Count$Converge".equals(getSVar("Y")) || + hasKeyword(Keyword.SUNBURST) || hasKeyword("Modular:Sunburst"); } @Override @@ -1594,7 +1595,7 @@ public class Card extends GameEntity implements Comparable { || keyword.equals("Soulbond") || keyword.equals("Partner") || keyword.equals("Retrace") || keyword.equals("Living Weapon") || keyword.equals("Myriad") || keyword.equals("Exploit") || keyword.equals("Changeling") || keyword.equals("Delve") - || keyword.equals("Split second") + || keyword.equals("Split second") || keyword.equals("Sunburst") || keyword.equals("Suspend") // for the ones without amounnt || keyword.equals("Hideaway") || keyword.equals("Ascend") || keyword.equals("Totem armor") || keyword.equals("Battle cry") diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 6beef16d590..874cf123dcf 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -25,7 +25,6 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; -import forge.GameCommand; import forge.card.*; import forge.card.mana.ManaAtom; import forge.card.mana.ManaCost; @@ -2099,7 +2098,7 @@ public class CardFactoryUtil { String abStr = "DB$ PutCounter | Defined$ Self | CounterType$ " + splitkw[1] + " | ETB$ True | CounterNum$ " + amount; - if (!StringUtils.isNumeric(amount)) { + if (!StringUtils.isNumeric(amount) && card.hasSVar(amount)) { abStr += " | References$ " + amount; } @@ -3452,12 +3451,10 @@ public class CardFactoryUtil { sb.append(m); sb.append(" (").append(inst.getReminderText()).append(")"); - if ("Sunburst".equals(m)) { - card.setSVar(m, "Count$Converge"); - } - final ReplacementEffect re = makeEtbCounter(sb.toString(), card, intrinsic); - + if ("Sunburst".equals(m)) { + re.getOverridingAbility().setSVar("Sunburst", "Count$Converge"); + } inst.addReplacement(re); } else if (keyword.equals("Rebound")) { String repeffstr = "Event$ Moved | ValidCard$ Card.Self+wasCastFromHand+YouOwn+YouCtrl " @@ -3512,6 +3509,19 @@ public class CardFactoryUtil { String sb = "etbCounter:LORE:1:no Condition:no desc"; final ReplacementEffect re = makeEtbCounter(sb, card, intrinsic); + inst.addReplacement(re); + } else if (keyword.equals("Sunburst")) { + // Rule 702.43a If this object is entering the battlefield as a creature, + // ignoring any type-changing effects that would affect it + CounterType t = card.isCreature() ? CounterType.P1P1 : CounterType.CHARGE; + + StringBuilder sb = new StringBuilder("etbCounter:"); + sb.append(t).append(":Sunburst:no Condition:"); + sb.append("Sunburst (").append(inst.getReminderText()).append(")"); + + final ReplacementEffect re = makeEtbCounter(sb.toString(), card, intrinsic); + re.getOverridingAbility().setSVar("Sunburst", "Count$Converge"); + inst.addReplacement(re); } else if (keyword.equals("Totem armor")) { String repeffstr = "Event$ Destroy | ActiveZones$ Battlefield | ValidCard$ Card.EnchantedBy" @@ -4182,18 +4192,17 @@ public class CardFactoryUtil { String effect = "AB$ PutCounter | Cost$ " + manacost + " ExileFromGrave<1/CARDNAME> " + "| ActivationZone$ Graveyard | ValidTgts$ Creature | CounterType$ P1P1 " + - "| CounterNum$ ScavengeX | SorcerySpeed$ True | References$ ScavengeX " + + "| CounterNum$ ScavengeX | SorcerySpeed$ True " + "| PrecostDesc$ Scavenge | CostDesc$ " + ManaCostParser.parse(manacost) + "| SpellDescription$ (" + inst.getReminderText() + ")"; - card.setSVar("ScavengeX", "Count$CardPower"); - final SpellAbility sa = AbilityFactory.getAbility(effect, card); + sa.setSVar("ScavengeX", "Count$CardPower"); sa.setIntrinsic(intrinsic); sa.setTemporary(!intrinsic); inst.addSpellAbility(sa); - + } else if (keyword.startsWith("Spectacle")) { final String[] k = keyword.split(":"); final Cost cost = new Cost(k[1], false); @@ -4211,28 +4220,6 @@ public class CardFactoryUtil { newSA.setTemporary(!intrinsic); inst.addSpellAbility(newSA); - } else if (keyword.equals("Sunburst") && intrinsic) { - final GameCommand sunburstCIP = new GameCommand() { - private static final long serialVersionUID = 1489845860231758299L; - - @Override - public void run() { - CounterType t = card.isCreature() ? CounterType.P1P1 : CounterType.CHARGE; - card.addCounter(t, card.getSunburstValue(), card.getController(), true); - } - }; - - final GameCommand sunburstLP = new GameCommand() { - private static final long serialVersionUID = -7564420917490677427L; - - @Override - public void run() { - card.setSunburstValue(0); - } - }; - - card.addComesIntoPlayCommand(sunburstCIP); - card.addLeavesPlayCommand(sunburstLP); } else if (keyword.startsWith("Surge")) { final String[] k = keyword.split(":"); final Cost surgeCost = new Cost(k[1], false); diff --git a/forge-game/src/main/java/forge/game/replacement/ReplacementEffect.java b/forge-game/src/main/java/forge/game/replacement/ReplacementEffect.java index 27c8e14e79a..0614d3f4bc3 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplacementEffect.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplacementEffect.java @@ -39,7 +39,7 @@ public abstract class ReplacementEffect extends TriggerReplacementBase { /** The ID. */ private int id; - private ReplacementLayer layer = ReplacementLayer.None; + private ReplacementLayer layer = ReplacementLayer.Other; /** The has run. */ private boolean hasRun = false; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplacementLayer.java b/forge-game/src/main/java/forge/game/replacement/ReplacementLayer.java index 313bf855f1e..93bd3a33970 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplacementLayer.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplacementLayer.java @@ -8,8 +8,7 @@ package forge.game.replacement; public enum ReplacementLayer { Control, Copy, - Other, - None; + Other; /** * TODO: Write javadoc for this method. diff --git a/forge-gui/res/cardsfolder/b/benalish_lancer.txt b/forge-gui/res/cardsfolder/b/benalish_lancer.txt index a66b8a14820..2fc850c9c21 100644 --- a/forge-gui/res/cardsfolder/b/benalish_lancer.txt +++ b/forge-gui/res/cardsfolder/b/benalish_lancer.txt @@ -3,9 +3,9 @@ ManaCost:2 W Types:Creature Human Knight PT:2/2 K:Kicker:2 W -R:Event$ Moved | ValidCard$ Card.Self+kicked | Destination$ Battlefield | ReplaceWith$ DBPutCounter | Description$ If CARDNAME was kicked, it enters the battlefield with two +1/+1 counters on it and with first strike. -SVar:DBPutCounter:DB$ PutCounter | ETB$ True | Defined$ Self | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ DBPump -SVar:DBPump:DB$ Animate | Defined$ Self | Keywords$ First Strike | Permanent$ True | SubAbility$ DBMoveToPlay -SVar:DBMoveToPlay:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard +K:ETBReplacement:Other:DBPutCounter:Mandatory::Card.Self+kicked +SVar:DBPutCounter:DB$ PutCounter | ETB$ True | Defined$ Self | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ DBPump | SpellDescription$ If CARDNAME was kicked, it enters the battlefield with two +1/+1 counters on it and with first strike. +SVar:DBPump:DB$ Animate | Defined$ Self | Keywords$ First Strike | Permanent$ True +DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/benalish_lancer.jpg Oracle:Kicker {2}{W} (You may pay an additional {2}{W} as you cast this spell.)\nIf Benalish Lancer was kicked, it enters the battlefield with two +1/+1 counters on it and with first strike. diff --git a/forge-gui/res/cardsfolder/b/bloodspore_thrinax.txt b/forge-gui/res/cardsfolder/b/bloodspore_thrinax.txt index 5873dca7ecf..0e293948036 100644 --- a/forge-gui/res/cardsfolder/b/bloodspore_thrinax.txt +++ b/forge-gui/res/cardsfolder/b/bloodspore_thrinax.txt @@ -3,9 +3,9 @@ ManaCost:2 G G Types:Creature Lizard PT:2/2 K:Devour:1 -R:Event$ Moved | ActiveZones$ Battlefield | Destination$ Battlefield | ValidCard$ Creature.YouCtrl+Other | ReplaceWith$ AddExtraCounter | Description$ Each other creature you control enters the battlefield with an additional X +1/+1 counters on it, where X is the number of +1/+1 counters on CARDNAME. -SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ X | References$ X | SubAbility$ MoveToBattlefield -SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard +K:ETBReplacement:Other:AddExtraCounter:Mandatory:Battlefield:Creature.YouCtrl+Other +SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ X | References$ X | SpellDescription$ Each other creature you control enters the battlefield with an additional X +1/+1 counters on it, where X is the number of +1/+1 counters on CARDNAME. SVar:X:Count$CardCounters.P1P1 +DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodspore_thrinax.jpg -Oracle:Devour 1 (As this enters the battlefield, you may sacrifice any number of creatures. This creature enters the battlefield with that many +1/+1 counters on it.)\nEach other creature you control enters the battlefield with an additional X +1/+1 counters on it, where X is the number of +1/+1 counters on Bloodspore Thrinax. \ No newline at end of file +Oracle:Devour 1 (As this enters the battlefield, you may sacrifice any number of creatures. This creature enters the battlefield with that many +1/+1 counters on it.)\nEach other creature you control enters the battlefield with an additional X +1/+1 counters on it, where X is the number of +1/+1 counters on Bloodspore Thrinax. diff --git a/forge-gui/res/cardsfolder/b/bramblewood_paragon.txt b/forge-gui/res/cardsfolder/b/bramblewood_paragon.txt index 2cd4cb6de24..19ed4cefb71 100644 --- a/forge-gui/res/cardsfolder/b/bramblewood_paragon.txt +++ b/forge-gui/res/cardsfolder/b/bramblewood_paragon.txt @@ -2,9 +2,10 @@ Name:Bramblewood Paragon ManaCost:1 G Types:Creature Elf Warrior PT:2/2 -R:Event$ Moved | ActiveZones$ Battlefield | Destination$ Battlefield | ValidCard$ Creature.Warrior+YouCtrl+Other | ReplaceWith$ AddExtraCounter | Description$ Each other Warrior creature you control enters the battlefield with an additional +1/+1 counter on it. -SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ MoveToBattlefield -SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard +K:ETBReplacement:Other:AddExtraCounter:Mandatory:Battlefield:Creature.Warrior+YouCtrl+Other +SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Each other Warrior creature you control enters the battlefield with an additional +1/+1 counter on it. S:Mode$ Continuous | Affected$ Creature.YouCtrl+counters_GE1_P1P1 | AddKeyword$ Trample | Description$ Each creature you control with a +1/+1 counter on it has trample. +DeckNeeds:Type$Warrior +DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/bramblewood_paragon.jpg Oracle:Each other Warrior creature you control enters the battlefield with an additional +1/+1 counter on it.\nEach creature you control with a +1/+1 counter on it has trample. diff --git a/forge-gui/res/cardsfolder/d/dearly_departed.txt b/forge-gui/res/cardsfolder/d/dearly_departed.txt index 9ec1fae20ff..db7322a2bf7 100644 --- a/forge-gui/res/cardsfolder/d/dearly_departed.txt +++ b/forge-gui/res/cardsfolder/d/dearly_departed.txt @@ -3,8 +3,9 @@ ManaCost:4 W W Types:Creature Spirit PT:5/5 K:Flying -R:Event$ Moved | ActiveZones$ Graveyard | Destination$ Battlefield | ValidCard$ Creature.Human+YouCtrl | ReplaceWith$ AddExtraCounter | Description$ As long as CARDNAME is in your graveyard, each Human creature you control enters the battlefield with an additional +1/+1 counter on it. -SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ MoveToBattlefield -SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard +K:ETBReplacement:Other:AddExtraCounter:Mandatory:Battlefield:Creature.Human+YouCtrl +SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ As long as CARDNAME is in your graveyard, each Human creature you control enters the battlefield with an additional +1/+1 counter on it. +DeckNeeds:Type$Human +DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/dearly_departed.jpg Oracle:Flying\nAs long as Dearly Departed is in your graveyard, each Human creature you control enters the battlefield with an additional +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/k/kavu_titan.txt b/forge-gui/res/cardsfolder/k/kavu_titan.txt index 6ca044c4e3d..09d9cd2bd75 100644 --- a/forge-gui/res/cardsfolder/k/kavu_titan.txt +++ b/forge-gui/res/cardsfolder/k/kavu_titan.txt @@ -3,9 +3,9 @@ ManaCost:1 G Types:Creature Kavu PT:2/2 K:Kicker:2 G -R:Event$ Moved | ValidCard$ Card.Self+kicked | Destination$ Battlefield | ReplaceWith$ DBPutCounter | Description$ If CARDNAME was kicked, it enters the battlefield with three +1/+1 counters on it and with trample. -SVar:DBPutCounter:DB$ PutCounter | ETB$ True | Defined$ Self | CounterType$ P1P1 | CounterNum$ 3 | SubAbility$ Dustwalk -SVar:Dustwalk:DB$ Animate | Defined$ Self | Keywords$ Trample | Permanent$ True | SubAbility$ DBMoveToPlay -SVar:DBMoveToPlay:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard +K:ETBReplacement:Other:DBPutCounter:Mandatory::Card.Self+kicked +SVar:DBPutCounter:DB$ PutCounter | ETB$ True | Defined$ Self | CounterType$ P1P1 | CounterNum$ 3 | SubAbility$ Dustwalk | SpellDescription$ If CARDNAME was kicked, it enters the battlefield with three +1/+1 counters on it and with trample. +SVar:Dustwalk:DB$ Animate | Defined$ Self | Keywords$ Trample | Permanent$ True +DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/kavu_titan.jpg Oracle:Kicker {2}{G} (You may pay an additional {2}{G} as you cast this spell.)\nIf Kavu Titan was kicked, it enters the battlefield with three +1/+1 counters on it and with trample. diff --git a/forge-gui/res/cardsfolder/m/master_biomancer.txt b/forge-gui/res/cardsfolder/m/master_biomancer.txt index 54879327300..3143a74734b 100644 --- a/forge-gui/res/cardsfolder/m/master_biomancer.txt +++ b/forge-gui/res/cardsfolder/m/master_biomancer.txt @@ -2,10 +2,10 @@ Name:Master Biomancer ManaCost:2 G U Types:Creature Elf Wizard PT:2/4 -R:Event$ Moved | ActiveZones$ Battlefield | Destination$ Battlefield | ValidCard$ Creature.YouCtrl+Other | ReplaceWith$ AddExtraCounter | Description$ Each other creature you control enters the battlefield with a number of additional +1/+1 counters on it equal to CARDNAME's power and as a Mutant in addition to its other types. -SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ X | References$ X | SubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Types$ Mutant | Permanent$ True | Defined$ ReplacedCard | SubAbility$ MoveToBattlefield -SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard +K:ETBReplacement:Other:AddExtraCounter:Mandatory:Battlefield:Creature.YouCtrl+Other +SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ X | References$ X | SubAbility$ DBAnimate | SpellDescription$ Each other creature you control enters the battlefield with a number of additional +1/+1 counters on it equal to CARDNAME's power and as a Mutant in addition to its other types. +SVar:DBAnimate:DB$ Animate | Types$ Mutant | Permanent$ True | Defined$ ReplacedCard SVar:X:Count$CardPower +DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/master_biomancer.jpg Oracle:Each other creature you control enters the battlefield with a number of additional +1/+1 counters on it equal to Master Biomancer's power and as a Mutant in addition to its other types. diff --git a/forge-gui/res/cardsfolder/m/metallic_mimic.txt b/forge-gui/res/cardsfolder/m/metallic_mimic.txt index ab13f612d59..d653be0da56 100644 --- a/forge-gui/res/cardsfolder/m/metallic_mimic.txt +++ b/forge-gui/res/cardsfolder/m/metallic_mimic.txt @@ -3,10 +3,10 @@ ManaCost:2 Types:Artifact Creature Shapeshifter PT:2/1 K:ETBReplacement:Other:ChooseCT +K:ETBReplacement:Other:AddExtraCounter:Mandatory:Battlefield:Creature.ChosenType+Other+YouCtrl SVar:ChooseCT:DB$ ChooseType | Type$ Creature | AILogic$ MostProminentInComputerDeck | SpellDescription$ As CARDNAME enters the battlefield, choose a creature type. S:Mode$ Continuous | EffectZone$ All | Affected$ Card.Self | CharacteristicDefining$ True | AddType$ ChosenType | Description$ CARDNAME is the chosen type in addition to its other types. -R:Event$ Moved | ActiveZones$ Battlefield | Destination$ Battlefield | ValidCard$ Creature.ChosenType+Other+YouCtrl | ReplaceWith$ AddExtraCounter | Description$ Each other creature you control of the chosen type enters the battlefield with an additional +1/+1 counter on it. -SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ MoveToBattlefield -SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard +SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Each other creature you control of the chosen type enters the battlefield with an additional +1/+1 counter on it. +DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/metallic_mimic.jpg Oracle:As Metallic Mimic enters the battlefield, choose a creature type.\nMetallic Mimic is the chosen type in addition to its other types.\nEach other creature you control of the chosen type enters the battlefield with an additional +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/m/muzzios_preparations.txt b/forge-gui/res/cardsfolder/m/muzzios_preparations.txt index dc4d27938db..e3f7ff11de3 100644 --- a/forge-gui/res/cardsfolder/m/muzzios_preparations.txt +++ b/forge-gui/res/cardsfolder/m/muzzios_preparations.txt @@ -2,8 +2,7 @@ Name:Muzzio's Preparations ManaCost:no cost Types:Conspiracy K:Hidden agenda -R:Event$ Moved | ActiveZones$ Command | Destination$ Battlefield | ValidCard$ Creature.YouCtrl+NamedCard | ReplaceWith$ AddExtraCounter | Description$ Each creature with the named card you control enters the battlefield with an additional +1/+1 counter on it. -SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ MoveToBattlefield -SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard +K:ETBReplacement:Other:AddExtraCounter:Mandatory:Command:Creature.YouCtrl+NamedCard +SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Each creature with the named card you control enters the battlefield with an additional +1/+1 counter on it. SVar:AgendaLogic:MostProminentCreatureInComputerDeck Oracle:Hidden agenda (Start the game with this conspiracy face down in the command zone and secretly name a card. You may turn this conspiracy face up any time and reveal the chosen name.)\nEach creature you control with the chosen name enters the battlefield with an additional +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/o/oath_of_gideon.txt b/forge-gui/res/cardsfolder/o/oath_of_gideon.txt index a52ae1c30ba..9a04bc406a9 100644 --- a/forge-gui/res/cardsfolder/o/oath_of_gideon.txt +++ b/forge-gui/res/cardsfolder/o/oath_of_gideon.txt @@ -3,9 +3,9 @@ ManaCost:2 W Types:Legendary Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create two 1/1 white Kor Ally creature tokens. SVar:TrigToken:DB$Token | TokenImage$ w 1 1 kor ally | TokenName$ Kor Ally | TokenColors$ White | TokenTypes$ Creature,Kor,Ally | TokenPower$ 1 | TokenToughness$ 1 | TokenOwner$ You | TokenAmount$ 2 -R:Event$ Moved | ActiveZones$ Battlefield | Destination$ Battlefield | ValidCard$ Planeswalker.YouCtrl | ReplaceWith$ AddExtraCounter | Description$ Each planeswalker you control enters the battlefield with an additional loyalty counter on it. -SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ LOYALTY | CounterNum$ 1 | SubAbility$ MoveToBattlefield -SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard + +K:ETBReplacement:Other:AddExtraCounter:Mandatory:Battlefield:Planeswalker.YouCtrl +SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ LOYALTY | CounterNum$ 1 | SpellDescription$ Each planeswalker you control enters the battlefield with an additional loyalty counter on it. DeckHints:Type$Ally SVar:Picture:http://www.wizards.com/global/images/magic/general/oath_of_gideon.jpg Oracle:When Oath of Gideon enters the battlefield, create two 1/1 white Kor Ally creature tokens.\nEach planeswalker you control enters the battlefield with an additional loyalty counter on it. diff --git a/forge-gui/res/cardsfolder/o/oonas_blackguard.txt b/forge-gui/res/cardsfolder/o/oonas_blackguard.txt index c9af8d5849b..f905161f090 100644 --- a/forge-gui/res/cardsfolder/o/oonas_blackguard.txt +++ b/forge-gui/res/cardsfolder/o/oonas_blackguard.txt @@ -3,11 +3,12 @@ ManaCost:1 B Types:Creature Faerie Rogue PT:1/1 K:Flying -R:Event$ Moved | ActiveZones$ Battlefield | Destination$ Battlefield | ValidCard$ Creature.Rogue+YouCtrl+Other | ReplaceWith$ AddExtraCounter | Description$ Each other Rogue creature you control enters the battlefield with an additional +1/+1 counter on it. -SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ MoveToBattlefield -SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard +K:ETBReplacement:Other:AddExtraCounter:Mandatory:Battlefield:Creature.Rogue+Other+YouCtrl +SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Each other Rogue creature you control enters the battlefield with an additional +1/+1 counter on it. T:Mode$ DamageDone | ValidSource$ Creature.YouCtrl+counters_GE1_P1P1 | ValidTarget$ Player | TriggerZones$ Battlefield | CombatDamage$ True | Execute$ TrigDiscardOpp | TriggerDescription$ Whenever a creature you control with a +1/+1 counter on it deals combat damage to a player, that player discards a card. SVar:TrigDiscardOpp:DB$ Discard | Defined$ TriggeredTarget | NumCards$ 1 | Mode$ TgtChoose SVar:PlayMain1:TRUE +DeckNeeds:Type$Rogue +DeckHas:Ability$Discard & Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/oonas_blackguard.jpg Oracle:Flying\nEach other Rogue creature you control enters the battlefield with an additional +1/+1 counter on it.\nWhenever a creature you control with a +1/+1 counter on it deals combat damage to a player, that player discards a card. diff --git a/forge-gui/res/cardsfolder/p/protean_raider.txt b/forge-gui/res/cardsfolder/p/protean_raider.txt index 5818ffb6450..8426dc32a39 100644 --- a/forge-gui/res/cardsfolder/p/protean_raider.txt +++ b/forge-gui/res/cardsfolder/p/protean_raider.txt @@ -2,7 +2,7 @@ Name:Protean Raider ManaCost:1 U R Types:Creature Shapeshifter Pirate PT:2/2 -R:Event$ Moved | Destination$ Battlefield | ValidCard$ Card.Self | Optional$ True | ReplaceWith$ DBCopy | CheckSVar$ RaidTest | References$ RaidTest | Description$ Raid — If you attacked with a creature this turn, you may have CARDNAME enter the battlefield as a copy of any creature on the battlefield. +R:Event$ Moved | Destination$ Battlefield | ValidCard$ Card.Self | Layer$ Clone | Optional$ True | ReplaceWith$ DBCopy | CheckSVar$ RaidTest | References$ RaidTest | Description$ Raid — If you attacked with a creature this turn, you may have CARDNAME enter the battlefield as a copy of any creature on the battlefield. SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | SubAbility$ DBChangeZone | SpellDescription$ Raid — If you attacked with a creature this turn, you may have CARDNAME enter the battlefield as a copy of any creature on the battlefield. SVar:DBChangeZone:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard SVar:RaidTest:Count$AttackersDeclared diff --git a/forge-gui/res/cardsfolder/s/sage_of_fables.txt b/forge-gui/res/cardsfolder/s/sage_of_fables.txt index fc2d3596fe7..ba91cf66ee5 100644 --- a/forge-gui/res/cardsfolder/s/sage_of_fables.txt +++ b/forge-gui/res/cardsfolder/s/sage_of_fables.txt @@ -2,11 +2,11 @@ Name:Sage of Fables ManaCost:2 U Types:Creature Merfolk Wizard PT:2/2 -R:Event$ Moved | ActiveZones$ Battlefield | Destination$ Battlefield | ValidCard$ Creature.Wizard+Other+YouCtrl | ReplaceWith$ AddExtraCounter | Description$ Each other Wizard creature you control enters the battlefield with an additional +1/+1 counter on it. -SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ MoveToBattlefield -SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard +K:ETBReplacement:Other:AddExtraCounter:Mandatory:Battlefield:Creature.Wizard+Other+YouCtrl +SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Each other Wizard creature you control enters the battlefield with an additional +1/+1 counter on it. A:AB$ Draw | Cost$ 2 SubCounter<1/P1P1/Creature.YouCtrl/Creature you control> | NumCards$ 1 | SpellDescription$ Draw a card. DeckNeeds:Type$Wizard +DeckHas:Ability$Counters #TODO: The AI won't use the "draw a card" ability on this yet, needs some logic improvement. Otherwise, the AI uses this card fine #and it may be good in a Wizard-themed deck. SVar:Picture:http://www.wizards.com/global/images/magic/general/sage_of_fables.jpg diff --git a/forge-gui/res/cardsfolder/z/zameck_guildmage.txt b/forge-gui/res/cardsfolder/z/zameck_guildmage.txt index 072f70b6658..1cfbb5e8e4f 100644 --- a/forge-gui/res/cardsfolder/z/zameck_guildmage.txt +++ b/forge-gui/res/cardsfolder/z/zameck_guildmage.txt @@ -6,7 +6,7 @@ A:AB$ Effect | Cost$ G U | Name$ Zameck Guildmage Effect | ReplacementEffects$ E SVar:ExtraETBCounter:Event$ Moved | ActiveZones$ Command | Destination$ Battlefield | ValidCard$ Creature.YouCtrl | ReplaceWith$ AddExtraCounter | Description$ This turn, each creature you control enters the battlefield with an additional +1/+1 counter on it. SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ MoveToBattlefield SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard -A:AB$ Draw |Cost$ G U SubCounter<1/P1P1/Creature.YouCtrl/Creature you Control> | Defined$ You | NumCards$ 1 | SpellDescription$ Draw a card. +A:AB$ Draw | Cost$ G U SubCounter<1/P1P1/Creature.YouCtrl/Creature you Control> | Defined$ You | NumCards$ 1 | SpellDescription$ Draw a card. DeckHas:Ability$Counters DeckHints:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/zameck_guildmage.jpg From b94ec249487f1ef844b4ae51b89a40d958f6a586 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Sun, 13 Jan 2019 10:08:29 -0500 Subject: [PATCH 581/901] Changes to do parts of multi-player scry in correct order --- .../src/main/java/forge/game/GameAction.java | 69 ++++++++++++++++++- .../game/ability/effects/ScryEffect.java | 18 ++--- .../main/java/forge/game/player/Player.java | 36 ---------- .../game/player/PlayerActionConfirmMode.java | 2 +- 4 files changed, 77 insertions(+), 48 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 1d178bd35f2..c95f06e3d65 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -50,6 +50,7 @@ import forge.util.collect.FCollection; import forge.util.collect.FCollectionView; import forge.util.maps.HashMapOfLists; import forge.util.maps.MapOfLists; +import org.apache.commons.lang3.tuple.ImmutablePair; import java.util.*; @@ -1711,12 +1712,16 @@ public class GameAction { mulliganDelta++; } while (!allKept); - //Vancouver Mulligan + //Vancouver Mulligan as a scry with the decisions inside + ArrayList scryers = new ArrayList(); for(Player p : whoCanMulligan) { if (p.getStartingHandSize() > p.getZone(ZoneType.Hand).size()) { - p.scry(1, null); + scryers.add(p); } } + if ( scryers.size() > 0 ) { + scry(scryers,1,true,null); + } } private void runPreOpeningHandActions(final Player first) { @@ -1812,4 +1817,64 @@ public class GameAction { runParams.put("Player", p); game.getTriggerHandler().runTrigger(TriggerType.BecomeMonarch, runParams, false); } + + + // Make scry an action function so that it can be used for mulligans (with a null cause) + // Assumes that the list of players is in APNAP order, which should be the case + // Optional here as well to handle the way that mulligans do the choice + // 701.17. Scry + // 701.17a To “scry N” means to look at the top N cards of your library, then put any number of them + // on the bottom of your library in any order and the rest on top of your library in any order. + // 701.17b If a player is instructed to scry 0, no scry event occurs. Abilities that trigger whenever a + // player scries won’t trigger. + // 701.17c If multiple players scry at once, each of those players looks at the top cards of their library + // at the same time. Those players decide in APNAP order (see rule 101.4) where to put those + // cards, then those cards move at the same time. + public void scry(Listplayers,int numScry, boolean isOptional, SpellAbility cause) { + if ( numScry == 0 ) { return; } + // reveal the top N library cards to the player (only) + if ( players.size() > 1 ) { // no real need to separate out the look if there is only one player scrying + for ( final Player p : players ) { + final CardCollection topN = new CardCollection(p.getCardsIn(ZoneType.Library, numScry)); + p.getGame().getAction().revealTo(topN,p); + } + } + // make the decisions + ArrayList> decisions = + new ArrayList>(); + for ( final Player p : players ) { + if (isOptional && !p.getController().confirmAction(cause, null, "Do you want to scry?")) { + decisions.add(new ImmutablePair(new CardCollection(),new CardCollection())); + } else { + final CardCollection topN = new CardCollection(p.getCardsIn(ZoneType.Library, numScry)); + ImmutablePair decision = p.getController().arrangeForScry(topN); + decisions.add(decision); + int numToTop = decision.getLeft()==null ? 0 : decision.getLeft().size(); + int numToBottom = decision.getRight()==null ? 0 : decision.getRight().size(); + p.getGame().fireEvent(new GameEventScry(p, numToTop, numToBottom)); // publicize the decision + } + } + // do the moves after all the decisions (maybe not necesssary, but let's do it the official way) + for ( int i = 0; i runParams = Maps.newHashMap(); + runParams.put("Player", p); + p.getGame().getTriggerHandler().runTrigger(TriggerType.Scry, runParams, false); + } + } + } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ScryEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ScryEffect.java index 2f5d606fbe3..2f7785d77ec 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ScryEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ScryEffect.java @@ -6,6 +6,7 @@ import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; import java.util.List; +import java.util.ArrayList; public class ScryEffect extends SpellAbilityEffect { @Override @@ -38,17 +39,16 @@ public class ScryEffect extends SpellAbilityEffect { final TargetRestrictions tgt = sa.getTargetRestrictions(); final List tgtPlayers = getTargetPlayers(sa); + final ArrayList players = new ArrayList(); // players really affected + // Optional here for spells that have optional multi-player scrying for (final Player p : tgtPlayers) { - if ((tgt == null) || p.canBeTargetedBy(sa)) { - if (isOptional && !p.getController().confirmAction(sa, null, "Do you want to scry?")) { - continue; - } - - p.scry(num, sa); - } - } + if ( ((tgt == null) || p.canBeTargetedBy(sa)) && + (!isOptional || p.getController().confirmAction(sa, null, "Do you want to scry?")) ) { + players.add(p); + } + } + sa.getActivatingPlayer().getGame().getAction().scry(players,num,false,sa); } - } diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index e5ef2e486b6..e58876d79c1 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -1262,42 +1262,6 @@ public class Player extends GameEntity implements Comparable { return drawCards(1); } - public void scry(final int numScry, SpellAbility cause) { - final CardCollection topN = new CardCollection(this.getCardsIn(ZoneType.Library, numScry)); - - if (topN.isEmpty()) { - return; - } - - final ImmutablePair lists = getController().arrangeForScry(topN); - final CardCollection toTop = lists.getLeft(); - final CardCollection toBottom = lists.getRight(); - - int numToBottom = 0; - int numToTop = 0; - - if (toBottom != null) { - for(Card c : toBottom) { - getGame().getAction().moveToBottomOfLibrary(c, cause, null); - numToBottom++; - } - } - - if (toTop != null) { - Collections.reverse(toTop); // the last card in list will become topmost in library, have to revert thus. - for(Card c : toTop) { - getGame().getAction().moveToLibrary(c, cause, null); - numToTop++; - } - } - - getGame().fireEvent(new GameEventScry(this, numToTop, numToBottom)); - - final Map runParams = Maps.newHashMap(); - runParams.put("Player", this); - getGame().getTriggerHandler().runTrigger(TriggerType.Scry, runParams, false); - } - public void surveil(int num, SpellAbility cause) { final Map repParams = Maps.newHashMap(); diff --git a/forge-game/src/main/java/forge/game/player/PlayerActionConfirmMode.java b/forge-game/src/main/java/forge/game/player/PlayerActionConfirmMode.java index 19f66c5017e..98370e5dd2e 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerActionConfirmMode.java +++ b/forge-game/src/main/java/forge/game/player/PlayerActionConfirmMode.java @@ -17,4 +17,4 @@ public enum PlayerActionConfirmMode { // Ripple; -} \ No newline at end of file +} From 087495f5a098fdb1a13a1a13b346fdc865cbe650 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Sun, 13 Jan 2019 10:24:40 -0500 Subject: [PATCH 582/901] Force AI to accept mulligan scry (otherwise there is a crash) --- forge-ai/src/main/java/forge/ai/AiController.java | 5 +++-- forge-game/src/main/java/forge/game/GameAction.java | 4 ++-- .../main/java/forge/game/player/PlayerActionConfirmMode.java | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 29ab83127dc..5e6e5797859 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -1209,9 +1209,10 @@ public class AiController { } public boolean confirmAction(SpellAbility sa, PlayerActionConfirmMode mode, String message) { - ApiType api = sa.getApi(); + ApiType api = (sa == null ) ? null : sa.getApi(); + if ( api == null && mode == PlayerActionConfirmMode.Scry ) return true; // special hack for mulligan - // Abilities without api may also use this routine, However they should provide a unique mode value + // Abilities without api may also use this routine, However they should provide a unique mode value ?? How could this work? if (api == null) { String exMsg = String.format("AI confirmAction does not know what to decide about %s mode (api is null).", mode); diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index c95f06e3d65..9fcc3baf709 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -31,6 +31,7 @@ import forge.game.event.*; import forge.game.keyword.KeywordInterface; import forge.game.player.GameLossReason; import forge.game.player.Player; +import forge.game.player.PlayerActionConfirmMode; import forge.game.replacement.ReplacementEffect; import forge.game.replacement.ReplacementResult; import forge.game.spellability.AbilitySub; @@ -1818,7 +1819,6 @@ public class GameAction { game.getTriggerHandler().runTrigger(TriggerType.BecomeMonarch, runParams, false); } - // Make scry an action function so that it can be used for mulligans (with a null cause) // Assumes that the list of players is in APNAP order, which should be the case // Optional here as well to handle the way that mulligans do the choice @@ -1843,7 +1843,7 @@ public class GameAction { ArrayList> decisions = new ArrayList>(); for ( final Player p : players ) { - if (isOptional && !p.getController().confirmAction(cause, null, "Do you want to scry?")) { + if (isOptional && !p.getController().confirmAction(cause, PlayerActionConfirmMode.Scry, "Do you want to scry?")) { decisions.add(new ImmutablePair(new CardCollection(),new CardCollection())); } else { final CardCollection topN = new CardCollection(p.getCardsIn(ZoneType.Library, numScry)); diff --git a/forge-game/src/main/java/forge/game/player/PlayerActionConfirmMode.java b/forge-game/src/main/java/forge/game/player/PlayerActionConfirmMode.java index 98370e5dd2e..4886ff984fa 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerActionConfirmMode.java +++ b/forge-game/src/main/java/forge/game/player/PlayerActionConfirmMode.java @@ -13,8 +13,8 @@ public enum PlayerActionConfirmMode { ChangeZoneGeneral, BidLife, OptionalChoose, - Tribute; + Tribute, // Ripple; - + Scry; } From 735516e6d523a3e15a7213c86b50819fe3723cdf Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Sun, 13 Jan 2019 10:25:35 -0500 Subject: [PATCH 583/901] Fix bug in scry when scrying entire library --- .../src/main/java/forge/player/PlayerControllerHuman.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 8526c486a62..06ae6d2e691 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -741,11 +741,11 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont List result = getGui().manipulateCardList("Move cards to top or bottom of library", cards, manipulable, topOK, bottomOK, false); CardCollection toBottom = new CardCollection(); CardCollection toTop = new CardCollection(); - for (int i = 0; manipulable.contains(result.get(i)) && i=0 && manipulable.contains(result.get(i)); i-- ) { toBottom.add(result.get(i)); } } From 20eba0fbd7346c82e2045b0e7f6bce09922161a1 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sun, 13 Jan 2019 21:41:19 +0100 Subject: [PATCH 584/901] GameAction: add PlayerController:confirmMulliganScry --- .../src/main/java/forge/ai/AiController.java | 3 +- .../java/forge/ai/PlayerControllerAi.java | 6 + .../src/main/java/forge/game/GameAction.java | 108 ++++++++++-------- .../game/ability/effects/ScryEffect.java | 19 ++- .../game/player/PlayerActionConfirmMode.java | 2 +- .../forge/game/player/PlayerController.java | 2 + .../util/PlayerControllerForTests.java | 6 + .../forge/player/PlayerControllerHuman.java | 5 + 8 files changed, 87 insertions(+), 64 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 5e6e5797859..c4fc6be078f 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -1209,8 +1209,7 @@ public class AiController { } public boolean confirmAction(SpellAbility sa, PlayerActionConfirmMode mode, String message) { - ApiType api = (sa == null ) ? null : sa.getApi(); - if ( api == null && mode == PlayerActionConfirmMode.Scry ) return true; // special hack for mulligan + ApiType api = sa.getApi(); // Abilities without api may also use this routine, However they should provide a unique mode value ?? How could this work? if (api == null) { diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index bc002769539..c7b845e9051 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -1164,4 +1164,10 @@ public class PlayerControllerAi extends PlayerController { return chosenOptCosts; } + + @Override + public boolean confirmMulliganScry(Player p) { + // Always true? + return true; + } } diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 9fcc3baf709..d58cefa2d2c 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -1714,15 +1714,18 @@ public class GameAction { } while (!allKept); //Vancouver Mulligan as a scry with the decisions inside - ArrayList scryers = new ArrayList(); + List scryers = Lists.newArrayList(); for(Player p : whoCanMulligan) { if (p.getStartingHandSize() > p.getZone(ZoneType.Hand).size()) { scryers.add(p); } } - if ( scryers.size() > 0 ) { - scry(scryers,1,true,null); - } + + for(Player p : scryers) { + if (p.getController().confirmMulliganScry(p)) { + scry(ImmutableList.of(p), 1, null); + } + } } private void runPreOpeningHandActions(final Player first) { @@ -1830,51 +1833,56 @@ public class GameAction { // 701.17c If multiple players scry at once, each of those players looks at the top cards of their library // at the same time. Those players decide in APNAP order (see rule 101.4) where to put those // cards, then those cards move at the same time. - public void scry(Listplayers,int numScry, boolean isOptional, SpellAbility cause) { - if ( numScry == 0 ) { return; } - // reveal the top N library cards to the player (only) - if ( players.size() > 1 ) { // no real need to separate out the look if there is only one player scrying - for ( final Player p : players ) { - final CardCollection topN = new CardCollection(p.getCardsIn(ZoneType.Library, numScry)); - p.getGame().getAction().revealTo(topN,p); - } - } - // make the decisions - ArrayList> decisions = - new ArrayList>(); - for ( final Player p : players ) { - if (isOptional && !p.getController().confirmAction(cause, PlayerActionConfirmMode.Scry, "Do you want to scry?")) { - decisions.add(new ImmutablePair(new CardCollection(),new CardCollection())); - } else { - final CardCollection topN = new CardCollection(p.getCardsIn(ZoneType.Library, numScry)); - ImmutablePair decision = p.getController().arrangeForScry(topN); - decisions.add(decision); - int numToTop = decision.getLeft()==null ? 0 : decision.getLeft().size(); - int numToBottom = decision.getRight()==null ? 0 : decision.getRight().size(); - p.getGame().fireEvent(new GameEventScry(p, numToTop, numToBottom)); // publicize the decision - } - } - // do the moves after all the decisions (maybe not necesssary, but let's do it the official way) - for ( int i = 0; i runParams = Maps.newHashMap(); - runParams.put("Player", p); - p.getGame().getTriggerHandler().runTrigger(TriggerType.Scry, runParams, false); - } - } + public void scry(List players, int numScry, SpellAbility cause) { + if (numScry == 0) { + return; + } + // reveal the top N library cards to the player (only) + // no real need to separate out the look if + // there is only one player scrying + if (players.size() > 1) { + for (final Player p : players) { + final CardCollection topN = new CardCollection(p.getCardsIn(ZoneType.Library, numScry)); + revealTo(topN, p); + } + } + // make the decisions + List> decisions = Lists.newArrayList(); + for (final Player p : players) { + final CardCollection topN = new CardCollection(p.getCardsIn(ZoneType.Library, numScry)); + ImmutablePair decision = p.getController().arrangeForScry(topN); + decisions.add(decision); + int numToTop = decision.getLeft() == null ? 0 : decision.getLeft().size(); + int numToBottom = decision.getRight() == null ? 0 : decision.getRight().size(); + // publicize the decision + game.fireEvent(new GameEventScry(p, numToTop, numToBottom)); + } + // do the moves after all the decisions (maybe not necesssary, but let's + // do it the official way) + for (int i = 0; i < players.size(); i++) { + // no good iterate simultaneously in Java + final Player p = players.get(i); + final CardCollection toTop = decisions.get(i).getLeft(); + final CardCollection toBottom = decisions.get(i).getRight(); + if (toTop != null) { + Collections.reverse(toTop); // reverse to get the correct order + for (Card c : toTop) { + moveToLibrary(c, cause, null); + } + } + if (toBottom != null) { + for (Card c : toBottom) { + moveToBottomOfLibrary(c, cause, null); + } + } + + if (cause != null) { + // set up triggers (but not actually do them until later) + final Map runParams = Maps.newHashMap(); + runParams.put("Player", p); + game.getTriggerHandler().runTrigger(TriggerType.Scry, runParams, false); + } + } + } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ScryEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ScryEffect.java index 2f7785d77ec..290a490e7ad 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ScryEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ScryEffect.java @@ -4,18 +4,17 @@ import forge.game.ability.AbilityUtils; import forge.game.ability.SpellAbilityEffect; import forge.game.player.Player; import forge.game.spellability.SpellAbility; -import forge.game.spellability.TargetRestrictions; import java.util.List; -import java.util.ArrayList; + +import com.google.common.collect.Lists; + public class ScryEffect extends SpellAbilityEffect { @Override protected String getStackDescription(SpellAbility sa) { final StringBuilder sb = new StringBuilder(); - final List tgtPlayers = getTargetPlayers(sa); - - for (final Player p : tgtPlayers) { + for (final Player p : getTargetPlayers(sa)) { sb.append(p.toString()).append(" "); } @@ -37,18 +36,16 @@ public class ScryEffect extends SpellAbilityEffect { boolean isOptional = sa.hasParam("Optional"); - final TargetRestrictions tgt = sa.getTargetRestrictions(); - final List tgtPlayers = getTargetPlayers(sa); - final ArrayList players = new ArrayList(); // players really affected + final List players = Lists.newArrayList(); // players really affected // Optional here for spells that have optional multi-player scrying - for (final Player p : tgtPlayers) { - if ( ((tgt == null) || p.canBeTargetedBy(sa)) && + for (final Player p : getTargetPlayers(sa)) { + if ( (!sa.usesTargeting() || p.canBeTargetedBy(sa)) && (!isOptional || p.getController().confirmAction(sa, null, "Do you want to scry?")) ) { players.add(p); } } - sa.getActivatingPlayer().getGame().getAction().scry(players,num,false,sa); + sa.getActivatingPlayer().getGame().getAction().scry(players, num, sa); } } diff --git a/forge-game/src/main/java/forge/game/player/PlayerActionConfirmMode.java b/forge-game/src/main/java/forge/game/player/PlayerActionConfirmMode.java index 4886ff984fa..2b265c32be8 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerActionConfirmMode.java +++ b/forge-game/src/main/java/forge/game/player/PlayerActionConfirmMode.java @@ -15,6 +15,6 @@ public enum PlayerActionConfirmMode { OptionalChoose, Tribute, // Ripple; - Scry; + ; } diff --git a/forge-game/src/main/java/forge/game/player/PlayerController.java b/forge-game/src/main/java/forge/game/player/PlayerController.java index 3e09e7c3f1c..33295250a62 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerController.java +++ b/forge-game/src/main/java/forge/game/player/PlayerController.java @@ -260,4 +260,6 @@ public abstract class PlayerController { } public abstract List chooseOptionalCosts(SpellAbility choosen, List optionalCostValues); + + public abstract boolean confirmMulliganScry(final Player p); } diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java index 4a2c07f63c6..8393f236a1c 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java @@ -678,4 +678,10 @@ public class PlayerControllerForTests extends PlayerController { return null; } + @Override + public boolean confirmMulliganScry(Player p) { + // TODO Auto-generated method stub + return false; + } + } diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 06ae6d2e691..28ace52e11a 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -2889,4 +2889,9 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont optionalCost, choosen.getHostCard().getView()); } + @Override + public boolean confirmMulliganScry(Player p) { + return InputConfirm.confirm(this, (SpellAbility)null, "Do you want to scry?"); + } + } From e07be6878635b3070140e273eef0783df55e9024 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Mon, 14 Jan 2019 07:40:50 -0500 Subject: [PATCH 585/901] Remove unused import in GameAction --- forge-game/src/main/java/forge/game/GameAction.java | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index d58cefa2d2c..740f2d0c4af 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -31,7 +31,6 @@ import forge.game.event.*; import forge.game.keyword.KeywordInterface; import forge.game.player.GameLossReason; import forge.game.player.Player; -import forge.game.player.PlayerActionConfirmMode; import forge.game.replacement.ReplacementEffect; import forge.game.replacement.ReplacementResult; import forge.game.spellability.AbilitySub; From 52184e24ce6d59a14d6eac7cfd025cb462599f90 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Sun, 13 Jan 2019 19:55:22 -0500 Subject: [PATCH 586/901] Add intermediate FloatingCardArea to hold commonalities between FloatingZone and ListCardArea --- .../src/main/java/forge/gui/GuiChoose.java | 5 +- .../java/forge/screens/match/CMatchUI.java | 20 +- .../java/forge/screens/match/ZoneAction.java | 6 +- .../forge/view/arcane/FloatingCardArea.java | 222 ++--------- .../java/forge/view/arcane/FloatingZone.java | 352 ++++++++++++++++++ .../java/forge/view/arcane/ListCardArea.java | 219 ++++------- 6 files changed, 477 insertions(+), 347 deletions(-) create mode 100644 forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java diff --git a/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java b/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java index 61a919fd59e..bcd7430e96c 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java +++ b/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java @@ -290,12 +290,9 @@ public class GuiChoose { final Callable> callable = new Callable>() { @Override public List call() throws Exception { - ListCardArea tempArea = new ListCardArea(gui,title,cards,manipulable,toTop,toBottom,toAnywhere); + ListCardArea tempArea = ListCardArea.show(gui,title,cards,manipulable,toTop,toBottom,toAnywhere); // tempArea.pack(); - // window? tempArea.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); tempArea.show(); - // tempArea.dispose(); - //try { Thread.sleep(1000); } catch(InterruptedException ex) { } final List cardList = tempArea.getCardList(); return cardList; } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index a338000744f..6e6ae367caa 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -101,7 +101,7 @@ import forge.util.ITriggerEvent; import forge.util.gui.SOptionPane; import forge.view.FView; import forge.view.arcane.CardPanel; -import forge.view.arcane.FloatingCardArea; +import forge.view.arcane.FloatingZone; import forge.match.input.*; /** @@ -401,7 +401,7 @@ public final class CMatchUI break; default: updateZones = true; - FloatingCardArea.refresh(owner, zone); + FloatingZone.refresh(owner, zone); break; } } @@ -437,7 +437,7 @@ public final class CMatchUI break; case Hand: // controller hand always shown if (controller != player) { - FloatingCardArea.show(this,player,zone); + FloatingZone.show(this,player,zone); } break; case Library: @@ -445,7 +445,7 @@ public final class CMatchUI case Exile: case Flashback: case Command: - FloatingCardArea.show(this,player,zone); + FloatingZone.show(this,player,zone); break; default: break; @@ -469,7 +469,7 @@ public final class CMatchUI case Exile: case Flashback: case Command: - FloatingCardArea.hide(this,player,zone); + FloatingZone.hide(this,player,zone); break; default: break; @@ -519,7 +519,7 @@ public final class CMatchUI } break; default: - FloatingCardArea.refresh(c.getController(),zone); // in case the card is visible in the zone + FloatingZone.refresh(c.getController(),zone); // in case the card is visible in the zone break; } } @@ -559,7 +559,7 @@ public final class CMatchUI layoutControl.initialize(); layoutControl.update(); } - FloatingCardArea.closeAll(); + FloatingZone.closeAll(); } @Override @@ -617,7 +617,7 @@ public final class CMatchUI case Exile: case Graveyard: case Library: - return FloatingCardArea.getCardPanel(this, card); + return FloatingZone.getCardPanel(this, card); default: break; } @@ -728,7 +728,7 @@ public final class CMatchUI @Override public void finishGame() { - FloatingCardArea.closeAll(); //ensure floating card areas cleared and closed after the game + FloatingZone.closeAll(); //ensure floating card areas cleared and closed after the game final GameView gameView = getGameView(); if (hasLocalPlayers() || gameView.isMatchOver()) { new ViewWinLose(gameView, this).show(); @@ -842,7 +842,7 @@ public final class CMatchUI } else { final ZoneType zone = hostCard.getZone(); if (ImmutableList.of(ZoneType.Command, ZoneType.Exile, ZoneType.Graveyard, ZoneType.Library).contains(zone)) { - FloatingCardArea.show(this, hostCard.getController(), zone); + FloatingZone.show(this, hostCard.getController(), zone); } menuParent = panel.getParent(); x = triggerEvent.getX(); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/ZoneAction.java b/forge-gui-desktop/src/main/java/forge/screens/match/ZoneAction.java index 1786a6a4758..c4ed219a2f2 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/ZoneAction.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/ZoneAction.java @@ -2,7 +2,7 @@ package forge.screens.match; import forge.game.player.PlayerView; import forge.game.zone.ZoneType; -import forge.view.arcane.FloatingCardArea; +import forge.view.arcane.FloatingZone; /** * Receives click and programmatic requests for viewing data stacks in the @@ -27,6 +27,6 @@ public final class ZoneAction implements Runnable { @Override public void run() { - FloatingCardArea.showOrHide(matchUI, player, zone); + FloatingZone.showOrHide(matchUI, player, zone); } -} \ No newline at end of file +} diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingCardArea.java b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingCardArea.java index 66b3428e906..f60bb6b06cd 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingCardArea.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingCardArea.java @@ -17,25 +17,19 @@ */ package forge.view.arcane; -import java.awt.Component; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import javax.swing.ScrollPaneConstants; import javax.swing.Timer; import forge.Singletons; -import forge.assets.FSkinProp; import forge.game.card.CardView; -import forge.game.player.PlayerView; -import forge.game.zone.ZoneType; import forge.gui.framework.SDisplayUtil; import forge.model.FModel; import forge.properties.ForgePreferences; @@ -43,194 +37,58 @@ import forge.properties.ForgePreferences.FPref; import forge.screens.match.CMatchUI; import forge.toolbox.FMouseAdapter; import forge.toolbox.FScrollPane; -import forge.toolbox.FSkin; import forge.toolbox.MouseTriggerEvent; -import forge.util.collect.FCollectionView; -import forge.util.Lang; +//import forge.util.collect.FCollectionView; import forge.view.FDialog; import forge.view.FFrame; -public class FloatingCardArea extends CardArea { - private static final long serialVersionUID = 1927906492186378596L; +// show some cards in a new window +public abstract class FloatingCardArea extends CardArea { - private static final String COORD_DELIM = ","; + protected static final String COORD_DELIM = ","; + protected static final ForgePreferences prefs = FModel.getPreferences(); - private static final ForgePreferences prefs = FModel.getPreferences(); - private static final Map floatingAreas = new HashMap(); + protected String title; + protected FPref locPref; + protected boolean hasBeenShown, locLoaded; - private static int getKey(final PlayerView player, final ZoneType zone) { - return 40 * player.getId() + zone.hashCode(); - } - public static void showOrHide(final CMatchUI matchUI, final PlayerView player, final ZoneType zone) { - final FloatingCardArea cardArea = _init(matchUI, player, zone); - cardArea.showOrHideWindow(); - } - public static void show(final CMatchUI matchUI, final PlayerView player, final ZoneType zone) { - final FloatingCardArea cardArea = _init(matchUI, player, zone); - cardArea.showWindow(); - } - public static void hide(final CMatchUI matchUI, final PlayerView player, final ZoneType zone) { - final FloatingCardArea cardArea = _init(matchUI, player, zone); - cardArea.hideWindow(); - } - private static FloatingCardArea _init(final CMatchUI matchUI, final PlayerView player, final ZoneType zone) { - final int key = getKey(player, zone); - FloatingCardArea cardArea = floatingAreas.get(key); - if (cardArea == null || cardArea.getMatchUI() != matchUI) { - cardArea = new FloatingCardArea(matchUI, player, zone); - floatingAreas.put(key, cardArea); - } else { - cardArea.setPlayer(player); //ensure player is updated if needed - } - return cardArea; - } - public static CardPanel getCardPanel(final CMatchUI matchUI, final CardView card) { - final FloatingCardArea window = _init(matchUI, card.getController(), card.getZone()); - return window.getCardPanel(card.getId()); - } - public static void refresh(final PlayerView player, final ZoneType zone) { - FloatingCardArea cardArea = floatingAreas.get(getKey(player, zone)); - if (cardArea != null) { - cardArea.setPlayer(player); //ensure player is updated if needed - cardArea.refresh(); - } + protected abstract FDialog getWindow(); + protected abstract Iterable getCards(); - //refresh flashback zone when graveyard, library, or exile zones updated - switch (zone) { - case Graveyard: - case Library: - case Exile: - refresh(player, ZoneType.Flashback); - break; - default: - break; - } + protected FloatingCardArea(final CMatchUI matchUI) { + this(matchUI, new FScrollPane(false, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER)); } - public static void closeAll() { - for (final FloatingCardArea cardArea : floatingAreas.values()) { - cardArea.window.setVisible(false); - } - floatingAreas.clear(); + protected FloatingCardArea(final CMatchUI matchUI, final FScrollPane scrollPane) { + super(matchUI, scrollPane); } - private final ZoneType zone; - private PlayerView player; - private String title; - private FPref locPref; - private boolean hasBeenShown, locLoaded; - - @SuppressWarnings("serial") - private final FDialog window = new FDialog(false, true, "0") { - @Override - public void setLocationRelativeTo(Component c) { - //don't change location this way if dialog has already been shown or location was loaded from preferences - if (hasBeenShown || locLoaded) { return; } - super.setLocationRelativeTo(c); - } - - @Override - public void setVisible(boolean b0) { - if (isVisible() == b0) { return; } - if (!b0 && hasBeenShown && locPref != null) { - //update preference before hiding window, as otherwise its location will be 0,0 - prefs.setPref(locPref, - getX() + COORD_DELIM + getY() + COORD_DELIM + - getWidth() + COORD_DELIM + getHeight()); - //don't call prefs.save(), instead allowing them to be saved when match ends - } - super.setVisible(b0); - if (b0) { - refresh(); - hasBeenShown = true; - } - } - }; - - private FloatingCardArea(final CMatchUI matchUI, final PlayerView player0, final ZoneType zone0) { - super(matchUI, new FScrollPane(false, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER)); - window.add(getScrollPane(), "grow, push"); - getScrollPane().setViewportView(this); - setOpaque(false); - switch (zone0) { - case Exile: - window.setIconImage(FSkin.getImage(FSkinProp.IMG_ZONE_EXILE)); - break; - case Graveyard: - window.setIconImage(FSkin.getImage(FSkinProp.IMG_ZONE_GRAVEYARD)); - break; - case Hand: - window.setIconImage(FSkin.getImage(FSkinProp.IMG_ZONE_HAND)); - break; - case Library: - window.setIconImage(FSkin.getImage(FSkinProp.IMG_ZONE_LIBRARY)); - break; - case Flashback: - window.setIconImage(FSkin.getImage(FSkinProp.IMG_ZONE_FLASHBACK)); - break; - default: - locPref = null; - break; - } - zone = zone0; - setPlayer(player0); - setVertical(true); - } - - private void setPlayer(PlayerView player0) { - if (player == player0) { return; } - player = player0; - title = Lang.getPossessedObject(player0.getName(), zone.name()) + " (%d)"; - - boolean isAi = player0.isAI(); - switch (zone) { - case Exile: - locPref = isAi ? FPref.ZONE_LOC_AI_EXILE : FPref.ZONE_LOC_HUMAN_EXILE; - break; - case Graveyard: - locPref = isAi ? FPref.ZONE_LOC_AI_GRAVEYARD : FPref.ZONE_LOC_HUMAN_GRAVEYARD; - break; - case Hand: - locPref = isAi ? FPref.ZONE_LOC_AI_HAND : FPref.ZONE_LOC_HUMAN_HAND; - break; - case Library: - locPref = isAi ? FPref.ZONE_LOC_AI_LIBRARY : FPref.ZONE_LOC_HUMAN_LIBRARY; - break; - case Flashback: - locPref = isAi ? FPref.ZONE_LOC_AI_FLASHBACK : FPref.ZONE_LOC_HUMAN_FLASHBACK; - break; - default: - locPref = null; - break; - } - } - - private void showWindow() { + protected void showWindow() { onShow(); - window.setFocusableWindowState(false); // should probably do this earlier - window.setVisible(true); + getWindow().setFocusableWindowState(false); // should probably do this earlier + getWindow().setVisible(true); } - private void hideWindow() { + protected void hideWindow() { onShow(); - window.setFocusableWindowState(false); // should probably do this earlier - window.setVisible(false); + getWindow().setFocusableWindowState(false); // should probably do this earlier + getWindow().setVisible(false); } - private void showOrHideWindow() { + protected void showOrHideWindow() { onShow(); - window.setFocusableWindowState(false); // should probably do this earlier - window.setVisible(!window.isVisible()); + getWindow().setFocusableWindowState(false); // should probably do this earlier + getWindow().setVisible(!getWindow().isVisible()); } - private void onShow() { + protected void onShow() { if (!hasBeenShown) { loadLocation(); - window.getTitleBar().addMouseListener(new FMouseAdapter() { + getWindow().getTitleBar().addMouseListener(new FMouseAdapter() { @Override public final void onLeftDoubleClick(final MouseEvent e) { - window.setVisible(false); //hide window if titlebar double-clicked + getWindow().setVisible(false); //hide window if titlebar double-clicked } }); } } - private void loadLocation() { + protected void loadLocation() { if (locPref != null) { String value = prefs.getPref(locPref); if (value.length() > 0) { @@ -264,7 +122,7 @@ public class FloatingCardArea extends CardArea { y = screenBounds.y; } } - window.setBounds(x, y, w, h); + getWindow().setBounds(x, y, w, h); locLoaded = true; return; } @@ -278,14 +136,17 @@ public class FloatingCardArea extends CardArea { } //fallback default size FFrame mainFrame = Singletons.getView().getFrame(); - window.setSize(mainFrame.getWidth() / 5, mainFrame.getHeight() / 2); + getWindow().setSize(mainFrame.getWidth() / 5, mainFrame.getHeight() / 2); } - private void refresh() { - if (!window.isVisible()) { return; } //don't refresh while window hidden + protected void refresh() { + if (!getWindow().isVisible()) { return; } //don't refresh while window hidden + doRefresh(); + } + protected void doRefresh() { List cardPanels = new ArrayList(); - FCollectionView cards = player.getCards(zone); + Iterable cards = getCards(); if (cards != null) { for (final CardView card : cards) { CardPanel cardPanel = getCardPanel(card.getId()); @@ -302,27 +163,26 @@ public class FloatingCardArea extends CardArea { boolean hadCardPanels = getCardPanels().size() > 0; setCardPanels(cardPanels); - window.setTitle(String.format(title, cardPanels.size())); + getWindow().setTitle(String.format(title, cardPanels.size())); //if window had cards and now doesn't, hide window //(e.g. cast final card from Flashback zone) if (hadCardPanels && cardPanels.size() == 0) { - window.setVisible(false); + getWindow().setVisible(false); } } @Override public void doLayout() { - if (window.isResizing()) { + if (getWindow().isResizing()) { //delay layout slightly to reduce flicker during window resize layoutTimer.restart(); - } - else { + } else { finishDoLayout(); } } - private final Timer layoutTimer = new Timer(250, new ActionListener() { + protected final Timer layoutTimer = new Timer(250, new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { layoutTimer.stop(); @@ -330,7 +190,7 @@ public class FloatingCardArea extends CardArea { } }); - private void finishDoLayout() { + protected void finishDoLayout() { super.doLayout(); } diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java new file mode 100644 index 00000000000..fe88aae0613 --- /dev/null +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java @@ -0,0 +1,352 @@ +/* + * Forge: Play Magic: the Gathering. + * Copyright (C) 2011 Nate + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package forge.view.arcane; + +import java.awt.Component; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseEvent; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.swing.ScrollPaneConstants; +import javax.swing.Timer; + +import forge.Singletons; +import forge.assets.FSkinProp; +import forge.game.card.CardView; +import forge.game.player.PlayerView; +import forge.game.zone.ZoneType; +import forge.gui.framework.SDisplayUtil; +import forge.model.FModel; +import forge.properties.ForgePreferences; +import forge.properties.ForgePreferences.FPref; +import forge.screens.match.CMatchUI; +import forge.toolbox.FMouseAdapter; +import forge.toolbox.FScrollPane; +import forge.toolbox.FSkin; +import forge.toolbox.MouseTriggerEvent; +//import forge.util.collect.FCollectionView; +import forge.util.Lang; +import forge.view.FDialog; +import forge.view.FFrame; + +public class FloatingZone extends CardArea { + private static final long serialVersionUID = 1927906492186378596L; + + private static final String COORD_DELIM = ","; + + private static final ForgePreferences prefs = FModel.getPreferences(); + private static final Map floatingAreas = new HashMap(); + + private static int getKey(final PlayerView player, final ZoneType zone) { + return 40 * player.getId() + zone.hashCode(); + } + public static void showOrHide(final CMatchUI matchUI, final PlayerView player, final ZoneType zone) { + final FloatingZone cardArea = _init(matchUI, player, zone); + cardArea.showOrHideWindow(); + } + public static void show(final CMatchUI matchUI, final PlayerView player, final ZoneType zone) { + final FloatingZone cardArea = _init(matchUI, player, zone); + cardArea.showWindow(); + } + public static void hide(final CMatchUI matchUI, final PlayerView player, final ZoneType zone) { + final FloatingZone cardArea = _init(matchUI, player, zone); + cardArea.hideWindow(); + } + private static FloatingZone _init(final CMatchUI matchUI, final PlayerView player, final ZoneType zone) { + final int key = getKey(player, zone); + FloatingZone cardArea = floatingAreas.get(key); + if (cardArea == null || cardArea.getMatchUI() != matchUI) { + cardArea = new FloatingZone(matchUI, player, zone); + floatingAreas.put(key, cardArea); + } else { + cardArea.setPlayer(player); //ensure player is updated if needed + } + return cardArea; + } + public static CardPanel getCardPanel(final CMatchUI matchUI, final CardView card) { + final FloatingZone window = _init(matchUI, card.getController(), card.getZone()); + return window.getCardPanel(card.getId()); + } + public static void refresh(final PlayerView player, final ZoneType zone) { + FloatingZone cardArea = floatingAreas.get(getKey(player, zone)); + if (cardArea != null) { + cardArea.setPlayer(player); //ensure player is updated if needed + cardArea.refresh(); + } + + //refresh flashback zone when graveyard, library, or exile zones updated + switch (zone) { + case Graveyard: + case Library: + case Exile: + refresh(player, ZoneType.Flashback); + break; + default: + break; + } + } + public static void closeAll() { + for (final FloatingZone cardArea : floatingAreas.values()) { + cardArea.window.setVisible(false); + } + floatingAreas.clear(); + } + + private final ZoneType zone; + private PlayerView player; + private String title; + private FPref locPref; + private boolean hasBeenShown, locLoaded; + + @SuppressWarnings("serial") + private final FDialog window = new FDialog(false, true, "0") { + @Override + public void setLocationRelativeTo(Component c) { + //don't change location this way if dialog has already been shown or location was loaded from preferences + if (hasBeenShown || locLoaded) { return; } + super.setLocationRelativeTo(c); + } + + @Override + public void setVisible(boolean b0) { + if (isVisible() == b0) { return; } + if (!b0 && hasBeenShown && locPref != null) { + //update preference before hiding window, as otherwise its location will be 0,0 + prefs.setPref(locPref, + getX() + COORD_DELIM + getY() + COORD_DELIM + + getWidth() + COORD_DELIM + getHeight()); + //don't call prefs.save(), instead allowing them to be saved when match ends + } + super.setVisible(b0); + if (b0) { + refresh(); + hasBeenShown = true; + } + } + }; + + private FloatingZone(final CMatchUI matchUI, final PlayerView player0, final ZoneType zone0) { + super(matchUI, new FScrollPane(false, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER)); + window.add(getScrollPane(), "grow, push"); + getScrollPane().setViewportView(this); + setOpaque(false); + switch (zone0) { + case Exile: + window.setIconImage(FSkin.getImage(FSkinProp.IMG_ZONE_EXILE)); + break; + case Graveyard: + window.setIconImage(FSkin.getImage(FSkinProp.IMG_ZONE_GRAVEYARD)); + break; + case Hand: + window.setIconImage(FSkin.getImage(FSkinProp.IMG_ZONE_HAND)); + break; + case Library: + window.setIconImage(FSkin.getImage(FSkinProp.IMG_ZONE_LIBRARY)); + break; + case Flashback: + window.setIconImage(FSkin.getImage(FSkinProp.IMG_ZONE_FLASHBACK)); + break; + default: + locPref = null; + break; + } + zone = zone0; + setPlayer(player0); + setVertical(true); + } + + private void setPlayer(PlayerView player0) { + if (player == player0) { return; } + player = player0; + title = Lang.getPossessedObject(player0.getName(), zone.name()) + " (%d)"; + + boolean isAi = player0.isAI(); + switch (zone) { + case Exile: + locPref = isAi ? FPref.ZONE_LOC_AI_EXILE : FPref.ZONE_LOC_HUMAN_EXILE; + break; + case Graveyard: + locPref = isAi ? FPref.ZONE_LOC_AI_GRAVEYARD : FPref.ZONE_LOC_HUMAN_GRAVEYARD; + break; + case Hand: + locPref = isAi ? FPref.ZONE_LOC_AI_HAND : FPref.ZONE_LOC_HUMAN_HAND; + break; + case Library: + locPref = isAi ? FPref.ZONE_LOC_AI_LIBRARY : FPref.ZONE_LOC_HUMAN_LIBRARY; + break; + case Flashback: + locPref = isAi ? FPref.ZONE_LOC_AI_FLASHBACK : FPref.ZONE_LOC_HUMAN_FLASHBACK; + break; + default: + locPref = null; + break; + } + } + + private void showWindow() { + onShow(); + window.setFocusableWindowState(false); // should probably do this earlier + window.setVisible(true); + } + private void hideWindow() { + onShow(); + window.setFocusableWindowState(false); // should probably do this earlier + window.setVisible(false); + } + private void showOrHideWindow() { + onShow(); + window.setFocusableWindowState(false); // should probably do this earlier + window.setVisible(!window.isVisible()); + } + private void onShow() { + if (!hasBeenShown) { + loadLocation(); + window.getTitleBar().addMouseListener(new FMouseAdapter() { + @Override public final void onLeftDoubleClick(final MouseEvent e) { + window.setVisible(false); //hide window if titlebar double-clicked + } + }); + } + } + + private void loadLocation() { + if (locPref != null) { + String value = prefs.getPref(locPref); + if (value.length() > 0) { + String[] coords = value.split(COORD_DELIM); + if (coords.length == 4) { + try { + int x = Integer.parseInt(coords[0]); + int y = Integer.parseInt(coords[1]); + int w = Integer.parseInt(coords[2]); + int h = Integer.parseInt(coords[3]); + + //ensure the window is accessible + int centerX = x + w / 2; + int centerY = y + h / 2; + Rectangle screenBounds = SDisplayUtil.getScreenBoundsForPoint(new Point(centerX, centerY)); + if (centerX < screenBounds.x) { + x = screenBounds.x; + } + else if (centerX > screenBounds.x + screenBounds.width) { + x = screenBounds.x + screenBounds.width - w; + if (x < screenBounds.x) { + x = screenBounds.x; + } + } + if (centerY < screenBounds.y) { + y = screenBounds.y; + } + else if (centerY > screenBounds.y + screenBounds.height) { + y = screenBounds.y + screenBounds.height - h; + if (y < screenBounds.y) { + y = screenBounds.y; + } + } + window.setBounds(x, y, w, h); + locLoaded = true; + return; + } + catch (Exception ex) { + ex.printStackTrace(); + } + } + prefs.setPref(locPref, ""); //clear value if invalid + prefs.save(); + } + } + //fallback default size + FFrame mainFrame = Singletons.getView().getFrame(); + window.setSize(mainFrame.getWidth() / 5, mainFrame.getHeight() / 2); + } + + private void refresh() { + if (!window.isVisible()) { return; } //don't refresh while window hidden + + List cardPanels = new ArrayList(); + Iterable cards = player.getCards(zone); + if (cards != null) { + for (final CardView card : cards) { + CardPanel cardPanel = getCardPanel(card.getId()); + if (cardPanel == null) { + cardPanel = new CardPanel(getMatchUI(), card); + cardPanel.setDisplayEnabled(true); + } + else { + cardPanel.setCard(card); //ensure card view updated + } + cardPanels.add(cardPanel); + } + } + + boolean hadCardPanels = getCardPanels().size() > 0; + setCardPanels(cardPanels); + window.setTitle(String.format(title, cardPanels.size())); + + //if window had cards and now doesn't, hide window + //(e.g. cast final card from Flashback zone) + if (hadCardPanels && cardPanels.size() == 0) { + window.setVisible(false); + } + } + + @Override + public void doLayout() { + if (window.isResizing()) { + //delay layout slightly to reduce flicker during window resize + layoutTimer.restart(); + } + else { + finishDoLayout(); + } + } + + private final Timer layoutTimer = new Timer(250, new ActionListener() { + @Override + public void actionPerformed(ActionEvent arg0) { + layoutTimer.stop(); + finishDoLayout(); + } + }); + + private void finishDoLayout() { + super.doLayout(); + } + + @Override + public final void mouseOver(final CardPanel panel, final MouseEvent evt) { + getMatchUI().setCard(panel.getCard(), evt.isShiftDown()); + super.mouseOver(panel, evt); + } + @Override + public final void mouseLeftClicked(final CardPanel panel, final MouseEvent evt) { + getMatchUI().getGameController().selectCard(panel.getCard(), null, new MouseTriggerEvent(evt)); + super.mouseLeftClicked(panel, evt); + } + @Override + public final void mouseRightClicked(final CardPanel panel, final MouseEvent evt) { + getMatchUI().getGameController().selectCard(panel.getCard(), null, new MouseTriggerEvent(evt)); + super.mouseRightClicked(panel, evt); + } +} diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java b/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java index 3a601829df9..5d3b7b46c06 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java @@ -18,8 +18,6 @@ package forge.view.arcane; import java.awt.BorderLayout; import java.awt.Component; -import java.awt.Point; -import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; @@ -28,51 +26,67 @@ import java.awt.event.KeyEvent; import java.util.ArrayList; import java.util.List; -import javax.swing.ScrollPaneConstants; -import javax.swing.Timer; +//import javax.swing.ScrollPaneConstants; -import forge.Singletons; import forge.game.card.Card; import forge.game.card.CardView; -import forge.gui.framework.SDisplayUtil; -import forge.model.FModel; -import forge.properties.ForgePreferences; -import forge.properties.ForgePreferences.FPref; +//import forge.game.card.CardCollection; import forge.screens.match.CMatchUI; import forge.view.arcane.util.CardPanelMouseAdapter; -import forge.toolbox.FScrollPane; -import forge.toolbox.MouseTriggerEvent; -import forge.view.FFrame; +//import forge.toolbox.FScrollPane; +//import forge.util.collect.FCollectionView; +//import forge.toolbox.MouseTriggerEvent; +//import forge.view.FFrame; import forge.view.FDialog; import forge.toolbox.FButton; -public class ListCardArea extends CardArea { +// Show a list of cards in a new window +// Allow moves of the visible cards to top, to bottom, or anywhere +// Return a list of cards with the results of the moves +// Really should have a difference between visible cards and moveable cards, +// but that would require consirable changes to card panels and elsewhere +public class ListCardArea extends FloatingCardArea { - private static final String COORD_DELIM = ","; - private static final ForgePreferences prefs = FModel.getPreferences(); + private static ArrayList cardList; + private static ArrayList moveableCards; - public void show() { - this.showWindow(); - } - public void hide() { - this.hideWindow(); - } - - private ArrayList cardList; - private ArrayList moveableCards; - private boolean toTop, toBottom, toAnywhere; - private String title; - private FPref locPref; - private boolean hasBeenShown = false, locLoaded; private static ListCardArea storedArea; + private static FButton doneButton; + private boolean toTop, toBottom, toAnywhere; - private final FButton doneButton; + private ListCardArea(final CMatchUI matchUI) { + super(matchUI); + window.add(getScrollPane(),"grow, push"); + getScrollPane().setViewportView(this); + setOpaque(false); + } + + public static ListCardArea show(final CMatchUI matchUI, final String title0, final List cardList0, final List moveableCards0, final boolean toTop0, final boolean toBottom0, final boolean toAnywhere0) { + if (storedArea==null) { + storedArea = new ListCardArea(matchUI); + doneButton = new FButton("Done"); + doneButton.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { window.setVisible(false); } + }); + window.add(doneButton,BorderLayout.SOUTH); + } + cardList = new ArrayList(cardList0); // this is modified - pfps - is there a better way? + moveableCards = new ArrayList(moveableCards0); + storedArea.title = title0; + storedArea.toTop = toTop0; + storedArea.toBottom = toBottom0; + storedArea.toAnywhere = toAnywhere0; + storedArea.setDragEnabled(true); + storedArea.setVertical(true); + storedArea.showWindow(); + return storedArea; + } public ListCardArea(final CMatchUI matchUI, final String title0, final List cardList0, final List moveableCards0, final boolean toTop0, final boolean toBottom0, final boolean toAnywhere0) { - super(matchUI, new FScrollPane(false, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER)); + super(matchUI); window.add(getScrollPane(),"grow, push"); - try { Thread.sleep(1000); } catch(InterruptedException ex) { } + // try { Thread.sleep(1000); } catch(InterruptedException ex) { } getScrollPane().setViewportView(this); setOpaque(false); doneButton = new FButton("Done"); @@ -91,39 +105,48 @@ public class ListCardArea extends CardArea { storedArea = this; } + protected Iterable getCards() { + ArrayList result = new ArrayList(); + for ( Card c : cardList ) { + result.add(c.getView()); + } + return result; + } + public List getCardList() { return cardList; } @SuppressWarnings("serial") - // private SkinnedFrame window = new SkinnedFrame() { - private final FDialog window = new FDialog(true, true, "0") { + protected static final FDialog window = new FDialog(true, true, "0") { @Override public void setLocationRelativeTo(Component c) { super.setLocationRelativeTo(c); } - @Override public void setVisible(boolean b0) { if (isVisible() == b0) { return; } if (b0) { - refresh(); + storedArea.refresh(); } super.setVisible(b0); } }; - private void showWindow() { - onShow(); - window.setFocusableWindowState(true); - window.setVisible(true); + @Override + protected FDialog getWindow() { + return window; } - private void hideWindow() { - onShow(); - window.setFocusableWindowState(false); // should probably do this earlier - window.setVisible(false); + + @Override + protected void showWindow() { + onShow(); + getWindow().setFocusableWindowState(true); + getWindow().setVisible(true); } - private void onShow() { + + @Override + protected void onShow() { if (!hasBeenShown) { loadLocation(); this.addCardPanelMouseListener(new CardPanelMouseAdapter() { @@ -193,83 +216,9 @@ public class ListCardArea extends CardArea { refresh(); } - private void loadLocation() { - if (locPref != null) { - String value = prefs.getPref(locPref); - if (value.length() > 0) { - String[] coords = value.split(COORD_DELIM); - if (coords.length == 4) { - try { - int x = Integer.parseInt(coords[0]); - int y = Integer.parseInt(coords[1]); - int w = Integer.parseInt(coords[2]); - int h = Integer.parseInt(coords[3]); - - //ensure the window is accessible - int centerX = x + w / 2; - int centerY = y + h / 2; - Rectangle screenBounds = SDisplayUtil.getScreenBoundsForPoint(new Point(centerX, centerY)); - if (centerX < screenBounds.x) { - x = screenBounds.x; - } - else if (centerX > screenBounds.x + screenBounds.width) { - x = screenBounds.x + screenBounds.width - w; - if (x < screenBounds.x) { - x = screenBounds.x; - } - } - if (centerY < screenBounds.y) { - y = screenBounds.y; - } - else if (centerY > screenBounds.y + screenBounds.height) { - y = screenBounds.y + screenBounds.height - h; - if (y < screenBounds.y) { - y = screenBounds.y; - } - } - window.setBounds(x, y, w, h); - locLoaded = true; - return; - } - catch (Exception ex) { - ex.printStackTrace(); - } - } - prefs.setPref(locPref, ""); //clear value if invalid - prefs.save(); - } - } - //fallback default size - FFrame mainFrame = Singletons.getView().getFrame(); - window.setSize(mainFrame.getWidth() / 5, mainFrame.getHeight() / 2); - } - - public void refresh() { - List cardPanels = new ArrayList(); - // FCollectionView cards = new FCollection(cardList); - if (cardList != null) { - for (final Card card : cardList) { - CardPanel cardPanel = getCardPanel(card.getId()); - if (cardPanel == null) { - cardPanel = new CardPanel(getMatchUI(), card.getView()); - cardPanel.setDisplayEnabled(true); - } - else { - cardPanel.setCard(card.getView()); //ensure card view updated - } - cardPanels.add(cardPanel); - } - } - - boolean hadCardPanels = getCardPanels().size() > 0; - setCardPanels(cardPanels); - window.setTitle(String.format(title, cardPanels.size())); - - //if window had cards and now doesn't, hide window - //(e.g. cast final card from Flashback zone) - if (hadCardPanels && cardPanels.size() == 0) { - window.setVisible(false); - } + @Override + protected void refresh() { + doRefresh(); } @Override @@ -283,32 +232,4 @@ public class ListCardArea extends CardArea { //} } - private final Timer layoutTimer = new Timer(250, new ActionListener() { - @Override - public void actionPerformed(ActionEvent arg0) { - layoutTimer.stop(); - finishDoLayout(); - } - }); - - private void finishDoLayout() { - super.doLayout(); - } - - @Override - public final void mouseOver(final CardPanel panel, final MouseEvent evt) { - getMatchUI().setCard(panel.getCard(), evt.isShiftDown()); - super.mouseOver(panel, evt); - } - @Override - public final void mouseLeftClicked(final CardPanel panel, final MouseEvent evt) { - getMatchUI().getGameController().selectCard(panel.getCard(), null, new MouseTriggerEvent(evt)); - super.mouseLeftClicked(panel, evt); - } - @Override - public final void mouseRightClicked(final CardPanel panel, final MouseEvent evt) { - getMatchUI().getGameController().selectCard(panel.getCard(), null, new MouseTriggerEvent(evt)); - super.mouseRightClicked(panel, evt); - } - } From f3f9a915d55718cf71b4c4212f6ccf823cccd72d Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Sun, 13 Jan 2019 20:40:40 -0500 Subject: [PATCH 587/901] Base FloatingZone on FloatingCardArea --- .../java/forge/view/arcane/FloatingZone.java | 175 +----------------- 1 file changed, 8 insertions(+), 167 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java index fe88aae0613..d81af9fef88 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java @@ -18,44 +18,26 @@ package forge.view.arcane; import java.awt.Component; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseEvent; -import java.util.ArrayList; import java.util.HashMap; -import java.util.List; import java.util.Map; import javax.swing.ScrollPaneConstants; -import javax.swing.Timer; -import forge.Singletons; import forge.assets.FSkinProp; import forge.game.card.CardView; import forge.game.player.PlayerView; import forge.game.zone.ZoneType; -import forge.gui.framework.SDisplayUtil; -import forge.model.FModel; -import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; import forge.screens.match.CMatchUI; -import forge.toolbox.FMouseAdapter; import forge.toolbox.FScrollPane; import forge.toolbox.FSkin; -import forge.toolbox.MouseTriggerEvent; //import forge.util.collect.FCollectionView; import forge.util.Lang; import forge.view.FDialog; -import forge.view.FFrame; -public class FloatingZone extends CardArea { +public class FloatingZone extends FloatingCardArea { private static final long serialVersionUID = 1927906492186378596L; - private static final String COORD_DELIM = ","; - - private static final ForgePreferences prefs = FModel.getPreferences(); private static final Map floatingAreas = new HashMap(); private static int getKey(final PlayerView player, final ZoneType zone) { @@ -115,9 +97,6 @@ public class FloatingZone extends CardArea { private final ZoneType zone; private PlayerView player; - private String title; - private FPref locPref; - private boolean hasBeenShown, locLoaded; @SuppressWarnings("serial") private final FDialog window = new FDialog(false, true, "0") { @@ -146,6 +125,13 @@ public class FloatingZone extends CardArea { } }; + protected FDialog getWindow() { + return window; + } + protected Iterable getCards() { + return player.getCards(zone); + } + private FloatingZone(final CMatchUI matchUI, final PlayerView player0, final ZoneType zone0) { super(matchUI, new FScrollPane(false, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER)); window.add(getScrollPane(), "grow, push"); @@ -204,149 +190,4 @@ public class FloatingZone extends CardArea { } } - private void showWindow() { - onShow(); - window.setFocusableWindowState(false); // should probably do this earlier - window.setVisible(true); - } - private void hideWindow() { - onShow(); - window.setFocusableWindowState(false); // should probably do this earlier - window.setVisible(false); - } - private void showOrHideWindow() { - onShow(); - window.setFocusableWindowState(false); // should probably do this earlier - window.setVisible(!window.isVisible()); - } - private void onShow() { - if (!hasBeenShown) { - loadLocation(); - window.getTitleBar().addMouseListener(new FMouseAdapter() { - @Override public final void onLeftDoubleClick(final MouseEvent e) { - window.setVisible(false); //hide window if titlebar double-clicked - } - }); - } - } - - private void loadLocation() { - if (locPref != null) { - String value = prefs.getPref(locPref); - if (value.length() > 0) { - String[] coords = value.split(COORD_DELIM); - if (coords.length == 4) { - try { - int x = Integer.parseInt(coords[0]); - int y = Integer.parseInt(coords[1]); - int w = Integer.parseInt(coords[2]); - int h = Integer.parseInt(coords[3]); - - //ensure the window is accessible - int centerX = x + w / 2; - int centerY = y + h / 2; - Rectangle screenBounds = SDisplayUtil.getScreenBoundsForPoint(new Point(centerX, centerY)); - if (centerX < screenBounds.x) { - x = screenBounds.x; - } - else if (centerX > screenBounds.x + screenBounds.width) { - x = screenBounds.x + screenBounds.width - w; - if (x < screenBounds.x) { - x = screenBounds.x; - } - } - if (centerY < screenBounds.y) { - y = screenBounds.y; - } - else if (centerY > screenBounds.y + screenBounds.height) { - y = screenBounds.y + screenBounds.height - h; - if (y < screenBounds.y) { - y = screenBounds.y; - } - } - window.setBounds(x, y, w, h); - locLoaded = true; - return; - } - catch (Exception ex) { - ex.printStackTrace(); - } - } - prefs.setPref(locPref, ""); //clear value if invalid - prefs.save(); - } - } - //fallback default size - FFrame mainFrame = Singletons.getView().getFrame(); - window.setSize(mainFrame.getWidth() / 5, mainFrame.getHeight() / 2); - } - - private void refresh() { - if (!window.isVisible()) { return; } //don't refresh while window hidden - - List cardPanels = new ArrayList(); - Iterable cards = player.getCards(zone); - if (cards != null) { - for (final CardView card : cards) { - CardPanel cardPanel = getCardPanel(card.getId()); - if (cardPanel == null) { - cardPanel = new CardPanel(getMatchUI(), card); - cardPanel.setDisplayEnabled(true); - } - else { - cardPanel.setCard(card); //ensure card view updated - } - cardPanels.add(cardPanel); - } - } - - boolean hadCardPanels = getCardPanels().size() > 0; - setCardPanels(cardPanels); - window.setTitle(String.format(title, cardPanels.size())); - - //if window had cards and now doesn't, hide window - //(e.g. cast final card from Flashback zone) - if (hadCardPanels && cardPanels.size() == 0) { - window.setVisible(false); - } - } - - @Override - public void doLayout() { - if (window.isResizing()) { - //delay layout slightly to reduce flicker during window resize - layoutTimer.restart(); - } - else { - finishDoLayout(); - } - } - - private final Timer layoutTimer = new Timer(250, new ActionListener() { - @Override - public void actionPerformed(ActionEvent arg0) { - layoutTimer.stop(); - finishDoLayout(); - } - }); - - private void finishDoLayout() { - super.doLayout(); - } - - @Override - public final void mouseOver(final CardPanel panel, final MouseEvent evt) { - getMatchUI().setCard(panel.getCard(), evt.isShiftDown()); - super.mouseOver(panel, evt); - } - @Override - public final void mouseLeftClicked(final CardPanel panel, final MouseEvent evt) { - getMatchUI().getGameController().selectCard(panel.getCard(), null, new MouseTriggerEvent(evt)); - super.mouseLeftClicked(panel, evt); - } - @Override - public final void mouseRightClicked(final CardPanel panel, final MouseEvent evt) { - getMatchUI().getGameController().selectCard(panel.getCard(), null, new MouseTriggerEvent(evt)); - super.mouseRightClicked(panel, evt); - } } From 482ab4b87c937bf1378cee67c8f0cdd936c5a8a9 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Mon, 14 Jan 2019 07:30:05 -0500 Subject: [PATCH 588/901] Add left-click to top and right-click to bottom for ListCardArea --- .../forge/view/arcane/FloatingCardArea.java | 4 +-- .../java/forge/view/arcane/ListCardArea.java | 25 +++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingCardArea.java b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingCardArea.java index f60bb6b06cd..a19d4033c8f 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingCardArea.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingCardArea.java @@ -200,12 +200,12 @@ public abstract class FloatingCardArea extends CardArea { super.mouseOver(panel, evt); } @Override - public final void mouseLeftClicked(final CardPanel panel, final MouseEvent evt) { + public void mouseLeftClicked(final CardPanel panel, final MouseEvent evt) { getMatchUI().getGameController().selectCard(panel.getCard(), null, new MouseTriggerEvent(evt)); super.mouseLeftClicked(panel, evt); } @Override - public final void mouseRightClicked(final CardPanel panel, final MouseEvent evt) { + public void mouseRightClicked(final CardPanel panel, final MouseEvent evt) { getMatchUI().getGameController().selectCard(panel.getCard(), null, new MouseTriggerEvent(evt)); super.mouseRightClicked(panel, evt); } diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java b/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java index 5d3b7b46c06..ccffd1e8479 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java @@ -232,4 +232,29 @@ public class ListCardArea extends FloatingCardArea { //} } + @Override + public final void mouseLeftClicked(final CardPanel panel, final MouseEvent evt) { + final Card clickCard = panelToCard(panel); + if (moveableCards.contains(clickCard) && toTop) { + synchronized (cardList) { + cardList.remove(clickCard); + cardList.add(0,clickCard); + } + refresh(); + } + super.mouseLeftClicked(panel, evt); + } + @Override + public final void mouseRightClicked(final CardPanel panel, final MouseEvent evt) { + final Card clickCard = panelToCard(panel); + if (moveableCards.contains(clickCard) && toBottom ) { + synchronized (cardList) { + cardList.remove(clickCard); + cardList.add(clickCard); + } + refresh(); + } + super.mouseRightClicked(panel, evt); + } + } From fb80dece047ea0b27f8e6678351794765ba8dc8f Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Mon, 14 Jan 2019 08:57:46 -0500 Subject: [PATCH 589/901] ListCardArea augment clicking --- .../java/forge/view/arcane/ListCardArea.java | 80 +++++++++++++------ 1 file changed, 57 insertions(+), 23 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java b/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java index ccffd1e8479..ac1f3bda04a 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java @@ -41,8 +41,8 @@ import forge.view.FDialog; import forge.toolbox.FButton; -// Show a list of cards in a new window -// Allow moves of the visible cards to top, to bottom, or anywhere +// Show a list of cards in a new window, containing the moveable cards +// Allow moves of the moveable cards to top, to bottom, or anywhere // Return a list of cards with the results of the moves // Really should have a difference between visible cards and moveable cards, // but that would require consirable changes to card panels and elsewhere @@ -59,26 +59,32 @@ public class ListCardArea extends FloatingCardArea { super(matchUI); window.add(getScrollPane(),"grow, push"); getScrollPane().setViewportView(this); + doneButton = new FButton("Done"); + doneButton.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { window.setVisible(false); } + }); + window.add(doneButton,BorderLayout.SOUTH); setOpaque(false); } public static ListCardArea show(final CMatchUI matchUI, final String title0, final List cardList0, final List moveableCards0, final boolean toTop0, final boolean toBottom0, final boolean toAnywhere0) { if (storedArea==null) { storedArea = new ListCardArea(matchUI); - doneButton = new FButton("Done"); - doneButton.addActionListener(new ActionListener() { - @Override public void actionPerformed(ActionEvent e) { window.setVisible(false); } - }); - window.add(doneButton,BorderLayout.SOUTH); } - cardList = new ArrayList(cardList0); // this is modified - pfps - is there a better way? - moveableCards = new ArrayList(moveableCards0); + cardList = new ArrayList(cardList0); + moveableCards = new ArrayList(); // make sure moveable cards are in cardlist + for ( Card card : moveableCards0 ) { + if ( cardList.contains(card) ) { + moveableCards.add(card); + } + } storedArea.title = title0; storedArea.toTop = toTop0; storedArea.toBottom = toBottom0; storedArea.toAnywhere = toAnywhere0; storedArea.setDragEnabled(true); storedArea.setVertical(true); + storedArea.doRefresh(); storedArea.showWindow(); return storedArea; } @@ -118,7 +124,7 @@ public class ListCardArea extends FloatingCardArea { } @SuppressWarnings("serial") - protected static final FDialog window = new FDialog(true, true, "0") { + protected final FDialog window = new FDialog(true, true, "0") { @Override public void setLocationRelativeTo(Component c) { super.setLocationRelativeTo(c); @@ -126,6 +132,13 @@ public class ListCardArea extends FloatingCardArea { @Override public void setVisible(boolean b0) { if (isVisible() == b0) { return; } + if (!b0 && hasBeenShown && locPref != null) { + //update preference before hiding window, as otherwise its location will be 0,0 + prefs.setPref(locPref, + getX() + COORD_DELIM + getY() + COORD_DELIM + + getWidth() + COORD_DELIM + getHeight()); + //don't call prefs.save(), instead allowing them to be saved when match ends + } if (b0) { storedArea.refresh(); } @@ -216,10 +229,10 @@ public class ListCardArea extends FloatingCardArea { refresh(); } - @Override - protected void refresh() { - doRefresh(); - } + // @Override + // protected void refresh() { + // doRefresh(); + // } @Override public void doLayout() { @@ -232,15 +245,26 @@ public class ListCardArea extends FloatingCardArea { //} } + // move to beginning of list if allowable else to beginning of bottom if allowable @Override public final void mouseLeftClicked(final CardPanel panel, final MouseEvent evt) { final Card clickCard = panelToCard(panel); - if (moveableCards.contains(clickCard) && toTop) { - synchronized (cardList) { - cardList.remove(clickCard); - cardList.add(0,clickCard); + if ( moveableCards.contains(clickCard) ) { + if ( toTop || toBottom ) { + synchronized (cardList) { + cardList.remove(clickCard); + int position; + if ( toTop ) { + position = 0 ; + } else { // to beginning of bottom + for ( position = cardList.size() ; + position>0 && moveableCards.contains(cardList.get(position-1)) ; + position-- ); + } + cardList.add(position,clickCard); + } + refresh(); } - refresh(); } super.mouseLeftClicked(panel, evt); } @@ -248,11 +272,21 @@ public class ListCardArea extends FloatingCardArea { public final void mouseRightClicked(final CardPanel panel, final MouseEvent evt) { final Card clickCard = panelToCard(panel); if (moveableCards.contains(clickCard) && toBottom ) { - synchronized (cardList) { - cardList.remove(clickCard); - cardList.add(clickCard); + if ( toTop || toBottom ) { + synchronized (cardList) { + cardList.remove(clickCard); + int position; + if ( toBottom ) { + position = cardList.size() ; + } else { // to end of top + for ( position = 0 ; + position Date: Mon, 14 Jan 2019 21:22:27 -0500 Subject: [PATCH 590/901] change manipulateCardList to CardView --- .../src/main/java/forge/gui/GuiChoose.java | 12 ++-- .../java/forge/screens/match/CMatchUI.java | 3 +- .../java/forge/view/arcane/ListCardArea.java | 57 ++++++------------- .../forge/screens/match/MatchController.java | 3 +- .../main/java/forge/interfaces/IGuiGame.java | 3 +- .../java/forge/net/server/NetGuiGame.java | 3 +- .../forge/player/PlayerControllerHuman.java | 21 ++++++- 7 files changed, 47 insertions(+), 55 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java b/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java index bcd7430e96c..d9c2f9782a5 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java +++ b/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java @@ -285,22 +285,22 @@ public class GuiChoose { return null; } - public static List manipulateCardList(final CMatchUI gui, final String title, final List cards, final List manipulable, + public static List manipulateCardList(final CMatchUI gui, final String title, final List cards, final List manipulable, final boolean toTop, final boolean toBottom, final boolean toAnywhere) { - final Callable> callable = new Callable>() { + final Callable> callable = new Callable>() { @Override - public List call() throws Exception { + public List call() throws Exception { ListCardArea tempArea = ListCardArea.show(gui,title,cards,manipulable,toTop,toBottom,toAnywhere); // tempArea.pack(); tempArea.show(); - final List cardList = tempArea.getCardList(); + final List cardList = tempArea.getCards(); return cardList; } }; - final FutureTask> ft = new FutureTask>(callable); + final FutureTask> ft = new FutureTask>(callable); FThreads.invokeInEdtAndWait(ft); try { - List result = ft.get(); + List result = ft.get(); return result; } catch (final Exception e) { // we have waited enough e.printStackTrace(); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index 6e6ae367caa..400303463c0 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -51,7 +51,6 @@ import forge.deck.Deck; import forge.deckchooser.FDeckViewer; import forge.game.GameEntityView; import forge.game.GameView; -import forge.game.card.Card; import forge.game.card.CardView; import forge.game.combat.CombatView; import forge.game.phase.PhaseType; @@ -1005,7 +1004,7 @@ public final class CMatchUI } @Override - public List manipulateCardList(final String title, final List cards, final List manipulable, final boolean toTop, final boolean toBottom, final boolean toAnywhere) { + public List manipulateCardList(final String title, final List cards, final List manipulable, final boolean toTop, final boolean toBottom, final boolean toAnywhere) { return GuiChoose.manipulateCardList(this, title, cards, manipulable, toTop, toBottom, toAnywhere); } diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java b/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java index ac1f3bda04a..23f7e4b81f5 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java @@ -26,17 +26,9 @@ import java.awt.event.KeyEvent; import java.util.ArrayList; import java.util.List; -//import javax.swing.ScrollPaneConstants; - -import forge.game.card.Card; import forge.game.card.CardView; -//import forge.game.card.CardCollection; import forge.screens.match.CMatchUI; import forge.view.arcane.util.CardPanelMouseAdapter; -//import forge.toolbox.FScrollPane; -//import forge.util.collect.FCollectionView; -//import forge.toolbox.MouseTriggerEvent; -//import forge.view.FFrame; import forge.view.FDialog; import forge.toolbox.FButton; @@ -48,8 +40,8 @@ import forge.toolbox.FButton; // but that would require consirable changes to card panels and elsewhere public class ListCardArea extends FloatingCardArea { - private static ArrayList cardList; - private static ArrayList moveableCards; + private static ArrayList cardList; + private static ArrayList moveableCards; private static ListCardArea storedArea; private static FButton doneButton; @@ -67,13 +59,13 @@ public class ListCardArea extends FloatingCardArea { setOpaque(false); } - public static ListCardArea show(final CMatchUI matchUI, final String title0, final List cardList0, final List moveableCards0, final boolean toTop0, final boolean toBottom0, final boolean toAnywhere0) { + public static ListCardArea show(final CMatchUI matchUI, final String title0, final List cardList0, final List moveableCards0, final boolean toTop0, final boolean toBottom0, final boolean toAnywhere0) { if (storedArea==null) { storedArea = new ListCardArea(matchUI); } - cardList = new ArrayList(cardList0); - moveableCards = new ArrayList(); // make sure moveable cards are in cardlist - for ( Card card : moveableCards0 ) { + cardList = new ArrayList(cardList0); + moveableCards = new ArrayList(); // make sure moveable cards are in cardlist + for ( CardView card : moveableCards0 ) { if ( cardList.contains(card) ) { moveableCards.add(card); } @@ -89,7 +81,7 @@ public class ListCardArea extends FloatingCardArea { return storedArea; } - public ListCardArea(final CMatchUI matchUI, final String title0, final List cardList0, final List moveableCards0, final boolean toTop0, final boolean toBottom0, final boolean toAnywhere0) { + public ListCardArea(final CMatchUI matchUI, final String title0, final List cardList0, final List moveableCards0, final boolean toTop0, final boolean toBottom0, final boolean toAnywhere0) { super(matchUI); window.add(getScrollPane(),"grow, push"); // try { Thread.sleep(1000); } catch(InterruptedException ex) { } @@ -100,8 +92,8 @@ public class ListCardArea extends FloatingCardArea { @Override public void actionPerformed(ActionEvent e) { window.setVisible(false); } }); window.add(doneButton,BorderLayout.SOUTH); - cardList = new ArrayList(cardList0); // this is modified - pfps - is there a better way? - moveableCards = new ArrayList(moveableCards0); + cardList = new ArrayList(cardList0); // this is modified - pfps - is there a better way? + moveableCards = new ArrayList(moveableCards0); title = title0; toTop = toTop0; toBottom = toBottom0; @@ -111,15 +103,7 @@ public class ListCardArea extends FloatingCardArea { storedArea = this; } - protected Iterable getCards() { - ArrayList result = new ArrayList(); - for ( Card c : cardList ) { - result.add(c.getView()); - } - return result; - } - - public List getCardList() { + public List getCards() { return cardList; } @@ -185,7 +169,7 @@ public class ListCardArea extends FloatingCardArea { } // is this a valid place to move the card? - private boolean validIndex(final Card card, final int index) { + private boolean validIndex(final CardView card, final int index) { if (toAnywhere) { return true; } int oldIndex = cardList.indexOf(card); boolean topMove = true; @@ -201,21 +185,14 @@ public class ListCardArea extends FloatingCardArea { return false; } - protected Card panelToCard(final CardPanel panel) { //pfps there must be a better way - final CardView panelView = panel.getCard(); - Card panelCard = null; - for ( Card card : cardList ) { if ( panelView == card.getView() ) { panelCard = card; } } - return panelCard; - } - @Override protected boolean cardPanelDraggable(final CardPanel panel) { - return moveableCards.contains(panelToCard(panel)); + return moveableCards.contains(panel.getCard()); } private void dragEnd(final CardPanel dragPanel) { // if drag is not allowed, don't move anything - final Card dragCard = panelToCard(dragPanel); + final CardView dragCard = dragPanel.getCard(); if (moveableCards.contains(dragCard)) { //update index of dragged card in hand zone to match new index within hand area final int index = getCardPanels().indexOf(dragPanel); @@ -248,7 +225,7 @@ public class ListCardArea extends FloatingCardArea { // move to beginning of list if allowable else to beginning of bottom if allowable @Override public final void mouseLeftClicked(final CardPanel panel, final MouseEvent evt) { - final Card clickCard = panelToCard(panel); + final CardView clickCard = panel.getCard(); if ( moveableCards.contains(clickCard) ) { if ( toTop || toBottom ) { synchronized (cardList) { @@ -256,7 +233,7 @@ public class ListCardArea extends FloatingCardArea { int position; if ( toTop ) { position = 0 ; - } else { // to beginning of bottom + } else { // to beginning of bottom: warning, untested for ( position = cardList.size() ; position>0 && moveableCards.contains(cardList.get(position-1)) ; position-- ); @@ -270,8 +247,8 @@ public class ListCardArea extends FloatingCardArea { } @Override public final void mouseRightClicked(final CardPanel panel, final MouseEvent evt) { - final Card clickCard = panelToCard(panel); - if (moveableCards.contains(clickCard) && toBottom ) { + final CardView clickCard = panel.getCard(); + if (moveableCards.contains(clickCard)) { if ( toTop || toBottom ) { synchronized (cardList) { cardList.remove(clickCard); diff --git a/forge-gui-mobile/src/forge/screens/match/MatchController.java b/forge-gui-mobile/src/forge/screens/match/MatchController.java index 789fa67d32c..68445b75feb 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchController.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchController.java @@ -29,7 +29,6 @@ import forge.deck.CardPool; import forge.deck.FSideboardDialog; import forge.game.GameEntityView; import forge.game.GameView; -import forge.game.card.Card; import forge.game.card.CardView; import forge.game.phase.PhaseType; import forge.game.player.DelayedReveal; @@ -522,7 +521,7 @@ public class MatchController extends AbstractGuiGame { } @Override - public List manipulateCardList(final String title, final List cards, final List manipulable, final boolean toTop, final boolean toBottom, final boolean toAnywhere) { + public List manipulateCardList(final String title, final List cards, final List manipulable, final boolean toTop, final boolean toBottom, final boolean toAnywhere) { System.err.println("Not implemented yet - should never be called"); return null; } diff --git a/forge-gui/src/main/java/forge/interfaces/IGuiGame.java b/forge-gui/src/main/java/forge/interfaces/IGuiGame.java index 5e60457fb8d..b36cce98e73 100644 --- a/forge-gui/src/main/java/forge/interfaces/IGuiGame.java +++ b/forge-gui/src/main/java/forge/interfaces/IGuiGame.java @@ -11,7 +11,6 @@ import forge.assets.FSkinProp; import forge.deck.CardPool; import forge.game.GameEntityView; import forge.game.GameView; -import forge.game.card.Card; import forge.game.card.CardView; import forge.game.phase.PhaseType; import forge.game.player.DelayedReveal; @@ -150,7 +149,7 @@ public interface IGuiGame { List chooseEntitiesForEffect(String title, List optionList, int min, int max, DelayedReveal delayedReveal); // show a list of cards and allow some of them to be moved around and return new list - List manipulateCardList(String title, final List cards, final List manipulable, boolean toTop, boolean toBottom, boolean toAnywhere); + List manipulateCardList(String title, final List cards, final List manipulable, boolean toTop, boolean toBottom, boolean toAnywhere); void setCard(CardView card); void setPlayerAvatar(LobbyPlayer player, IHasIcon ihi); diff --git a/forge-gui/src/main/java/forge/net/server/NetGuiGame.java b/forge-gui/src/main/java/forge/net/server/NetGuiGame.java index 069f3302d4c..c99368a4e07 100644 --- a/forge-gui/src/main/java/forge/net/server/NetGuiGame.java +++ b/forge-gui/src/main/java/forge/net/server/NetGuiGame.java @@ -11,7 +11,6 @@ import forge.assets.FSkinProp; import forge.deck.CardPool; import forge.game.GameEntityView; import forge.game.GameView; -import forge.game.card.Card; import forge.game.card.CardView; import forge.game.phase.PhaseType; import forge.game.player.DelayedReveal; @@ -250,7 +249,7 @@ public class NetGuiGame extends AbstractGuiGame { } @Override - public List manipulateCardList(final String title, final List cards, final List manipulable, final boolean toTop, final boolean toBottom, final boolean toAnywhere) { + public List manipulateCardList(final String title, final List cards, final List manipulable, final boolean toTop, final boolean toBottom, final boolean toAnywhere) { return sendAndWait(ProtocolMethod.manipulateCardList, title, cards, manipulable, toTop, toBottom, toAnywhere); } diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 28ace52e11a..8f2b7fff928 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -737,8 +737,26 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } } + public List manipulateCardList(final String title, final List cards, final List manipulable, final boolean toTop, final boolean toBottom, final boolean toAnywhere) { + ArrayList cardViews = new ArrayList(); + for ( Card c : cards ) { cardViews.add(c.getView()); } + ArrayList manipulableViews = new ArrayList(); + for ( Card c : cards ) { manipulableViews.add(c.getView()); } + Iterable result = getGui().manipulateCardList(title, cardViews, manipulableViews, toTop, toBottom, toAnywhere); + List resultCards = new ArrayList(); + for ( CardView cv : result ) { + for ( Card card : cards ) { + if ( cv == card.getView() ) { + resultCards.add(card); + break; + } + } + } + return resultCards; + } + public ImmutablePair arrangeForMove(final String title, final List cards, final List manipulable, final boolean topOK, final boolean bottomOK) { - List result = getGui().manipulateCardList("Move cards to top or bottom of library", cards, manipulable, topOK, bottomOK, false); + List result = manipulateCardList("Move cards to top or bottom of library", cards, manipulable, topOK, bottomOK, false); CardCollection toBottom = new CardCollection(); CardCollection toTop = new CardCollection(); for (int i = 0; i Date: Tue, 15 Jan 2019 22:10:05 -0500 Subject: [PATCH 591/901] fix bug in computing manipulable card views --- 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 8f2b7fff928..ecdc6157ed5 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -741,7 +741,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont ArrayList cardViews = new ArrayList(); for ( Card c : cards ) { cardViews.add(c.getView()); } ArrayList manipulableViews = new ArrayList(); - for ( Card c : cards ) { manipulableViews.add(c.getView()); } + for ( Card c : manipulable ) { manipulableViews.add(c.getView()); } Iterable result = getGui().manipulateCardList(title, cardViews, manipulableViews, toTop, toBottom, toAnywhere); List resultCards = new ArrayList(); for ( CardView cv : result ) { From aab63e2029a581d0b260b2415ab57c812ca028f1 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Wed, 16 Jan 2019 07:28:21 +0100 Subject: [PATCH 592/901] CountersRemoveEffect: add ValidSource and CounterNum$ Any --- .../ability/effects/CountersRemoveEffect.java | 43 +++++++++++++++---- .../cardsfolder/upcoming/galloping_lizrog.txt | 11 +++++ 2 files changed, 46 insertions(+), 8 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/galloping_lizrog.txt diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java index 4d73671c8ef..f8142b029fd 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java @@ -4,6 +4,8 @@ import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; +import forge.game.card.CardCollectionView; +import forge.game.card.CardLists; import forge.game.card.CounterType; import forge.game.player.Player; import forge.game.player.PlayerController; @@ -69,11 +71,14 @@ public class CountersRemoveEffect extends SpellAbilityEffect { final Card card = sa.getHostCard(); final Game game = card.getGame(); + final Player player = sa.getActivatingPlayer(); + + PlayerController pc = player.getController(); final String type = sa.getParam("CounterType"); final String num = sa.getParam("CounterNum"); int cntToRemove = 0; - if (!num.equals("All") && !num.equals("Remembered")) { + if (!num.equals("All") && !num.equals("Any") && !num.equals("Remembered")) { cntToRemove = AbilityUtils.calculateAmount(sa.getHostCard(), num, sa); } @@ -96,6 +101,7 @@ public class CountersRemoveEffect extends SpellAbilityEffect { } boolean rememberRemoved = sa.hasParam("RememberRemoved"); + boolean rememberAmount = sa.hasParam("RememberAmount"); for (final Player tgtPlayer : getTargetPlayers(sa)) { // Removing energy @@ -107,7 +113,23 @@ public class CountersRemoveEffect extends SpellAbilityEffect { } } - for (final Card tgtCard : getTargetCards(sa)) { + CardCollectionView srcCards = null; + if (sa.hasParam("ValidSource")) { + srcCards = game.getCardsIn(ZoneType.Battlefield); + srcCards = CardLists.getValidCards(srcCards, sa.getParam("ValidSource"), player, card, sa); + if (num.equals("Any")) { + StringBuilder sb = new StringBuilder(); + sb.append("Choose cards to take ").append(counterType.getName()).append(" counters from"); + + srcCards = player.getController().chooseCardsForEffect(srcCards, sa, sb.toString(), 0, srcCards.size(), true); + } + } else { + srcCards = getTargetCards(sa); + } + + int totalRemoved = 0; + + for (final Card tgtCard : srcCards) { Card gameCard = game.getCardState(tgtCard, null); // gameCard is LKI in that case, the card is not in game anymore // or the timestamp did change @@ -123,14 +145,12 @@ public class CountersRemoveEffect extends SpellAbilityEffect { } game.updateLastStateForCard(gameCard); continue; - } else if (num.equals("All")) { + } else if (num.equals("All") || num.equals("Any")) { cntToRemove = gameCard.getCounters(counterType); - } else if (sa.getParam("CounterNum").equals("Remembered")) { + } else if (num.equals("Remembered")) { cntToRemove = gameCard.getCountersAddedBy(card, counterType); } - - PlayerController pc = sa.getActivatingPlayer().getController(); - + if (type.equals("Any")) { while (cntToRemove > 0 && gameCard.hasCounters()) { final Map tgtCounters = gameCard.getCounters(); @@ -162,7 +182,7 @@ public class CountersRemoveEffect extends SpellAbilityEffect { cntToRemove = Math.min(cntToRemove, gameCard.getCounters(counterType)); if (zone.is(ZoneType.Battlefield) || zone.is(ZoneType.Exile)) { - if (sa.hasParam("UpTo")) { + if (sa.hasParam("UpTo") || num.equals("Any")) { Map params = Maps.newHashMap(); params.put("Target", gameCard); params.put("CounterType", type); @@ -179,10 +199,17 @@ public class CountersRemoveEffect extends SpellAbilityEffect { } } game.updateLastStateForCard(gameCard); + + totalRemoved += cntToRemove; } } } } + + if (totalRemoved > 0 && rememberAmount) { + // TODO use SpellAbility Remember later + card.addRemembered(Integer.valueOf(totalRemoved)); + } } } diff --git a/forge-gui/res/cardsfolder/upcoming/galloping_lizrog.txt b/forge-gui/res/cardsfolder/upcoming/galloping_lizrog.txt new file mode 100644 index 00000000000..5ad3b047aeb --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/galloping_lizrog.txt @@ -0,0 +1,11 @@ +Name:Galloping Lizrog +ManaCost:3 G U +Types:Creature Frog Lizard +PT:3/3 +K:Trample +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigRemoveCounters | TriggerDescription$ When CARDNAME enters the battlefield, you may remove any number of +1/+1 counters from among creatures you control. If you do, put twice that many +1/+1 counters on CARDNAME. +SVar:TrigRemoveCounters:DB$ RemoveCounter | ValidSource$ Creature.YouCtrl+counters_GE1_P1P1 | CounterType$ P1P1 | CounterNum$ Any | SubAbility$ DBPutCounters | RememberAmount$ True | StackDescription$ You may remove any number of +1/+1 counters from among creatures you control. +SVar:DBPutCounters:DB$PutCounter | Defined$ TriggeredCardLKICopy | CounterType$ P1P1 | CounterNum$ X | References$ X | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Count$RememberedNumber/Twice +Oracle:Trample\nWhen Galloping Lizrog enters the battlefield, you may remove any number of +1/+1 counters from among creatures you control. If you do, put twice that many +1/+1 counters on Galloping Lizrog. From ebaa96004f16c49ff856439b5c1562727e2eb641 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 16 Jan 2019 10:16:20 +0300 Subject: [PATCH 593/901] - Added puzzle PS_CFB (How Much Fireball Can You Channel). --- forge-gui/res/puzzle/PS_CFB.pzl | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 forge-gui/res/puzzle/PS_CFB.pzl diff --git a/forge-gui/res/puzzle/PS_CFB.pzl b/forge-gui/res/puzzle/PS_CFB.pzl new file mode 100644 index 00000000000..5735ee3f375 --- /dev/null +++ b/forge-gui/res/puzzle/PS_CFB.pzl @@ -0,0 +1,16 @@ +[metadata] +Name:Possibility Storm - How Much Fireball Can You Channel? +URL:http://www.possibilitystorm.com/wp-content/uploads/2019/01/095.-CFB001-1.jpg +Goal:Win +Turns:1 +Difficulty:Special +Description:Start at the beginning of your first main phase, and use the classic Channel + Fireball combo to inflict as much damage as possible! Your opponent has named Aetherflux Reservoir for his Sorcerous Spyglass. +[state] +humanlife=1 +ailife=1 +turn=1 +activeplayer=human +activephase=MAIN1 +humanhand=Rewind;Snapcaster Mage;High Tide;Channel;Fireball;Baral's Expertise;Walking Ballista;Snap +humanbattlefield=Man-o'-War;Beamsplitter Mage;Aetherflux Reservoir;Breeding Pool;Breeding Pool;Breeding Pool;Breeding Pool;Steam Vents;Steam Vents;Steam Vents;Steam Vents +aibattlefield=Sorcerous Spyglass|NamedCard:Aetherflux Reservoir;Emrakul, the Aeons Torn;Kozilek, Butcher of Truth;Ulamog, the Infinite Gyre From 2f9fb96d29cadf7e1791010eb9cffe60dc9beda4 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Wed, 16 Jan 2019 12:06:21 -0500 Subject: [PATCH 594/901] use Iterators instead of Lists where possible in manipulateCardList --- [Help | 0 .../src/main/java/forge/gui/GuiChoose.java | 2 +- .../java/forge/screens/match/CMatchUI.java | 2 +- .../java/forge/view/arcane/ListCardArea.java | 5 ++-- .../forge/screens/match/MatchController.java | 2 +- .../main/java/forge/interfaces/IGuiGame.java | 2 +- .../main/java/forge/net/ProtocolMethod.java | 2 +- .../java/forge/net/server/NetGuiGame.java | 2 +- .../forge/player/PlayerControllerHuman.java | 26 ++++--------------- 9 files changed, 14 insertions(+), 29 deletions(-) create mode 100644 [Help diff --git a/[Help b/[Help new file mode 100644 index 00000000000..e69de29bb2d diff --git a/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java b/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java index d9c2f9782a5..86534fdc4a4 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java +++ b/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java @@ -285,7 +285,7 @@ public class GuiChoose { return null; } - public static List manipulateCardList(final CMatchUI gui, final String title, final List cards, final List manipulable, + public static List manipulateCardList(final CMatchUI gui, final String title, final Iterable cards, final Iterable manipulable, final boolean toTop, final boolean toBottom, final boolean toAnywhere) { final Callable> callable = new Callable>() { @Override diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index 400303463c0..db4efdbbee0 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -1004,7 +1004,7 @@ public final class CMatchUI } @Override - public List manipulateCardList(final String title, final List cards, final List manipulable, final boolean toTop, final boolean toBottom, final boolean toAnywhere) { + public List manipulateCardList(final String title, final Iterable cards, final Iterable manipulable, final boolean toTop, final boolean toBottom, final boolean toAnywhere) { return GuiChoose.manipulateCardList(this, title, cards, manipulable, toTop, toBottom, toAnywhere); } diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java b/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java index 23f7e4b81f5..c73ee2fb66d 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java @@ -59,11 +59,12 @@ public class ListCardArea extends FloatingCardArea { setOpaque(false); } - public static ListCardArea show(final CMatchUI matchUI, final String title0, final List cardList0, final List moveableCards0, final boolean toTop0, final boolean toBottom0, final boolean toAnywhere0) { + public static ListCardArea show(final CMatchUI matchUI, final String title0, final Iterable cardList0, final Iterable moveableCards0, final boolean toTop0, final boolean toBottom0, final boolean toAnywhere0) { if (storedArea==null) { storedArea = new ListCardArea(matchUI); } - cardList = new ArrayList(cardList0); + cardList = new ArrayList(); + for ( CardView cv : cardList0 ) { cardList.add(cv) ; } moveableCards = new ArrayList(); // make sure moveable cards are in cardlist for ( CardView card : moveableCards0 ) { if ( cardList.contains(card) ) { diff --git a/forge-gui-mobile/src/forge/screens/match/MatchController.java b/forge-gui-mobile/src/forge/screens/match/MatchController.java index 68445b75feb..3eef6be8e79 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchController.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchController.java @@ -521,7 +521,7 @@ public class MatchController extends AbstractGuiGame { } @Override - public List manipulateCardList(final String title, final List cards, final List manipulable, final boolean toTop, final boolean toBottom, final boolean toAnywhere) { + public List manipulateCardList(final String title, final Iterable cards, final Iterable manipulable, final boolean toTop, final boolean toBottom, final boolean toAnywhere) { System.err.println("Not implemented yet - should never be called"); return null; } diff --git a/forge-gui/src/main/java/forge/interfaces/IGuiGame.java b/forge-gui/src/main/java/forge/interfaces/IGuiGame.java index b36cce98e73..5d16196db30 100644 --- a/forge-gui/src/main/java/forge/interfaces/IGuiGame.java +++ b/forge-gui/src/main/java/forge/interfaces/IGuiGame.java @@ -149,7 +149,7 @@ public interface IGuiGame { List chooseEntitiesForEffect(String title, List optionList, int min, int max, DelayedReveal delayedReveal); // show a list of cards and allow some of them to be moved around and return new list - List manipulateCardList(String title, final List cards, final List manipulable, boolean toTop, boolean toBottom, boolean toAnywhere); + List manipulateCardList(String title, final Iterable cards, final Iterable manipulable, boolean toTop, boolean toBottom, boolean toAnywhere); void setCard(CardView card); void setPlayerAvatar(LobbyPlayer player, IHasIcon ihi); diff --git a/forge-gui/src/main/java/forge/net/ProtocolMethod.java b/forge-gui/src/main/java/forge/net/ProtocolMethod.java index 4642efd5101..b75acdce1cf 100644 --- a/forge-gui/src/main/java/forge/net/ProtocolMethod.java +++ b/forge-gui/src/main/java/forge/net/ProtocolMethod.java @@ -68,7 +68,7 @@ public enum ProtocolMethod { sideboard (Mode.SERVER, List.class, CardPool.class, CardPool.class), chooseSingleEntityForEffect(Mode.SERVER, GameEntityView.class, String.class, List.class, DelayedReveal.class, Boolean.TYPE), chooseEntitiesForEffect(Mode.SERVER, GameEntityView.class, String.class, List.class, Integer.TYPE, Integer.TYPE, DelayedReveal.class), - manipulateCardList (Mode.SERVER, List.class, String.class, List.class, List.class, Boolean.TYPE, Boolean.TYPE, Boolean.TYPE), + manipulateCardList (Mode.SERVER, List.class, String.class, Iterable.class, Iterable.class, Boolean.TYPE, Boolean.TYPE, Boolean.TYPE), setCard (Mode.SERVER, Void.TYPE, CardView.class), // TODO case "setPlayerAvatar": openZones (Mode.SERVER, Boolean.TYPE, Collection/*ZoneType*/.class, Map/*PlayerView,Object*/.class), diff --git a/forge-gui/src/main/java/forge/net/server/NetGuiGame.java b/forge-gui/src/main/java/forge/net/server/NetGuiGame.java index c99368a4e07..4d1174c1760 100644 --- a/forge-gui/src/main/java/forge/net/server/NetGuiGame.java +++ b/forge-gui/src/main/java/forge/net/server/NetGuiGame.java @@ -249,7 +249,7 @@ public class NetGuiGame extends AbstractGuiGame { } @Override - public List manipulateCardList(final String title, final List cards, final List manipulable, final boolean toTop, final boolean toBottom, final boolean toAnywhere) { + public List manipulateCardList(final String title, final Iterable cards, final Iterable manipulable, final boolean toTop, final boolean toBottom, final boolean toAnywhere) { return sendAndWait(ProtocolMethod.manipulateCardList, title, cards, manipulable, toTop, toBottom, toAnywhere); } diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index ecdc6157ed5..1a2c2cb43d1 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -737,25 +737,12 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } } - public List manipulateCardList(final String title, final List cards, final List manipulable, final boolean toTop, final boolean toBottom, final boolean toAnywhere) { - ArrayList cardViews = new ArrayList(); - for ( Card c : cards ) { cardViews.add(c.getView()); } - ArrayList manipulableViews = new ArrayList(); - for ( Card c : manipulable ) { manipulableViews.add(c.getView()); } - Iterable result = getGui().manipulateCardList(title, cardViews, manipulableViews, toTop, toBottom, toAnywhere); - List resultCards = new ArrayList(); - for ( CardView cv : result ) { - for ( Card card : cards ) { - if ( cv == card.getView() ) { - resultCards.add(card); - break; - } - } - } - return resultCards; + public List manipulateCardList(final String title, final Iterable cards, final Iterable manipulable, final boolean toTop, final boolean toBottom, final boolean toAnywhere) { + Iterable result = getGui().manipulateCardList(title, CardView.getCollection(cards), CardView.getCollection(manipulable), toTop, toBottom, toAnywhere); + return game.getCardList(result); } - public ImmutablePair arrangeForMove(final String title, final List cards, final List manipulable, final boolean topOK, final boolean bottomOK) { + public ImmutablePair arrangeForMove(final String title, final FCollectionView cards, final List manipulable, final boolean topOK, final boolean bottomOK) { List result = manipulateCardList("Move cards to top or bottom of library", cards, manipulable, topOK, bottomOK, false); CardCollection toBottom = new CardCollection(); CardCollection toTop = new CardCollection(); @@ -778,10 +765,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont tempShowCards(topN); if ( FModel.getPreferences().getPrefBoolean(FPref.UI_SELECT_FROM_CARD_DISPLAYS) && (!GuiBase.getInterface().isLibgdxPort()) ) { - ArrayList cardList = new ArrayList(); // pfps there must be a better way - for (final Card card : player.getCardsIn(ZoneType.Library)) { - cardList.add(card); - } + CardCollectionView cardList = player.getCardsIn(ZoneType.Library); ImmutablePair result = arrangeForMove("Move cards to top or bottom of library", cardList, topN, true, true); toTop = result.getLeft(); From 2cd86bfe1e3abc3beef1b1ed1469da01758bd6a6 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Tue, 15 Jan 2019 22:01:58 -0500 Subject: [PATCH 595/901] put yellow border on selectable cards --- .../src/main/java/forge/gui/GuiChoose.java | 3 +++ .../src/main/java/forge/view/arcane/CardPanel.java | 6 +++++- .../src/main/java/forge/interfaces/IGuiGame.java | 2 ++ .../src/main/java/forge/match/AbstractGuiGame.java | 11 +++++++++++ .../match/input/InputSelectEntitiesFromList.java | 13 ++++++++++++- 5 files changed, 33 insertions(+), 2 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java b/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java index 86534fdc4a4..15546d96175 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java +++ b/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java @@ -287,6 +287,8 @@ public class GuiChoose { public static List manipulateCardList(final CMatchUI gui, final String title, final Iterable cards, final Iterable manipulable, final boolean toTop, final boolean toBottom, final boolean toAnywhere) { + System.out.print("MCL "); System.out.println(manipulable); + gui.setSelectables(manipulable); final Callable> callable = new Callable>() { @Override public List call() throws Exception { @@ -299,6 +301,7 @@ public class GuiChoose { }; final FutureTask> ft = new FutureTask>(callable); FThreads.invokeInEdtAndWait(ft); + gui.clearSelectables(); try { List result = ft.get(); return result; diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java index e8f606962b1..c18d6cff758 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java @@ -273,7 +273,11 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl g2d.setColor(Color.magenta); final int n2 = Math.max(1, Math.round(2 * cardWidth * CardPanel.SELECTED_BORDER_SIZE)); g2d.fillRoundRect(cardXOffset - n2, (cardYOffset - n2) + offset, cardWidth + (n2 * 2), cardHeight + (n2 * 2), cornerSize + n2, cornerSize + n2); - } + } else if (matchUI.isSelectable(getCard())) { // Yellow outline for selectable cards + g2d.setColor(Color.yellow); + final int n2 = Math.max(1, Math.round(2 * cardWidth * CardPanel.SELECTED_BORDER_SIZE)); + g2d.fillRoundRect(cardXOffset - n2, (cardYOffset - n2) + offset, cardWidth + (n2 * 2), cardHeight + (n2 * 2), cornerSize + n2, cornerSize + n2); + } // Green outline for hover if (isSelected) { diff --git a/forge-gui/src/main/java/forge/interfaces/IGuiGame.java b/forge-gui/src/main/java/forge/interfaces/IGuiGame.java index 5d16196db30..7ddb89d9428 100644 --- a/forge-gui/src/main/java/forge/interfaces/IGuiGame.java +++ b/forge-gui/src/main/java/forge/interfaces/IGuiGame.java @@ -157,6 +157,8 @@ public interface IGuiGame { void restoreOldZones(Map playersToRestoreZonesFor); void setHighlighted(PlayerView pv, boolean b); void setUsedToPay(CardView card, boolean value); + void setSelectables(final List cards); + void clearSelectables(); void awaitNextInput(); void cancelAwaitNextInput(); diff --git a/forge-gui/src/main/java/forge/match/AbstractGuiGame.java b/forge-gui/src/main/java/forge/match/AbstractGuiGame.java index 95b7e944787..90df99b9560 100644 --- a/forge-gui/src/main/java/forge/match/AbstractGuiGame.java +++ b/forge-gui/src/main/java/forge/match/AbstractGuiGame.java @@ -220,6 +220,17 @@ public abstract class AbstractGuiGame implements IGuiGame, IMayViewCards { return highlightedCards.contains(card); } + private final Set selectableCards = Sets.newHashSet(); + public void setSelectables(final List cards) { + selectableCards.addAll(cards); + } + public void clearSelectables() { + selectableCards.clear(); + } + public boolean isSelectable(final CardView card) { + return selectableCards.contains(card); + } + /** Concede game, bring up WinLose UI. */ public boolean concede() { if (gameView.isGameOver()) { diff --git a/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java b/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java index 1d018a02394..eaf575e9d4a 100644 --- a/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java +++ b/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java @@ -2,9 +2,12 @@ package forge.match.input; import java.util.Collection; import java.util.List; +import java.util.ArrayList; import forge.game.GameEntity; import forge.game.card.Card; +import forge.game.card.CardView; + import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.player.PlayerControllerHuman; @@ -31,7 +34,6 @@ public class InputSelectEntitiesFromList extends InputSele super(controller, Math.min(min, validChoices0.size()), Math.min(max, validChoices0.size()),sa0); validChoices = validChoices0; if (min > validChoices.size()) { - System.out.println(String.format("Trying to choose at least %d things from a list with only %d things!", min, validChoices.size())); } final PlayerZoneUpdates zonesToUpdate = new PlayerZoneUpdates(); for (final GameEntity c : validChoices) { @@ -44,6 +46,14 @@ public class InputSelectEntitiesFromList extends InputSele zonesShown = controller.getGui().tempShowZones(controller.getPlayer().getView(),zonesToUpdate); } }); + ArrayList vCards = new ArrayList(); + for ( T c : validChoices0 ) { + if ( c instanceof Card ) { + vCards.add(((Card)c).getView()) ; + } + } + controller.getGui().setSelectables(vCards); + System.out.print("InputSelectEntitiesFromList "); System.out.println(vCards); } @Override @@ -113,6 +123,7 @@ public class InputSelectEntitiesFromList extends InputSele @Override protected void onStop() { getController().getGui().hideZones(getController().getPlayer().getView(),zonesShown); + getController().getGui().clearSelectables(); super.onStop(); } } From d4b4dc5ba0c56927c3dfecaf7de1ecf8ed82c3f6 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Wed, 16 Jan 2019 07:34:45 -0500 Subject: [PATCH 596/901] Remove debugging print --- .../main/java/forge/match/input/InputSelectEntitiesFromList.java | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java b/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java index eaf575e9d4a..6900ce5fed9 100644 --- a/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java +++ b/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java @@ -53,7 +53,6 @@ public class InputSelectEntitiesFromList extends InputSele } } controller.getGui().setSelectables(vCards); - System.out.print("InputSelectEntitiesFromList "); System.out.println(vCards); } @Override From c7d9646f7f47ebeff2b5c243b1b7e2fb94e2aa2f Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Wed, 16 Jan 2019 13:10:56 -0500 Subject: [PATCH 597/901] adjust highlighting for new manipulation interface --- .../src/main/java/forge/view/arcane/CardPanel.java | 4 ++-- forge-gui/src/main/java/forge/interfaces/IGuiGame.java | 2 +- forge-gui/src/main/java/forge/match/AbstractGuiGame.java | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java index c18d6cff758..895e023a50b 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java @@ -273,8 +273,8 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl g2d.setColor(Color.magenta); final int n2 = Math.max(1, Math.round(2 * cardWidth * CardPanel.SELECTED_BORDER_SIZE)); g2d.fillRoundRect(cardXOffset - n2, (cardYOffset - n2) + offset, cardWidth + (n2 * 2), cardHeight + (n2 * 2), cornerSize + n2, cornerSize + n2); - } else if (matchUI.isSelectable(getCard())) { // Yellow outline for selectable cards - g2d.setColor(Color.yellow); + } else if (matchUI.isSelectable(getCard())) { // Cyan outline for selectable cards + g2d.setColor(Color.cyan); final int n2 = Math.max(1, Math.round(2 * cardWidth * CardPanel.SELECTED_BORDER_SIZE)); g2d.fillRoundRect(cardXOffset - n2, (cardYOffset - n2) + offset, cardWidth + (n2 * 2), cardHeight + (n2 * 2), cornerSize + n2, cornerSize + n2); } diff --git a/forge-gui/src/main/java/forge/interfaces/IGuiGame.java b/forge-gui/src/main/java/forge/interfaces/IGuiGame.java index 7ddb89d9428..ec2c6994a0f 100644 --- a/forge-gui/src/main/java/forge/interfaces/IGuiGame.java +++ b/forge-gui/src/main/java/forge/interfaces/IGuiGame.java @@ -157,7 +157,7 @@ public interface IGuiGame { void restoreOldZones(Map playersToRestoreZonesFor); void setHighlighted(PlayerView pv, boolean b); void setUsedToPay(CardView card, boolean value); - void setSelectables(final List cards); + void setSelectables(final Iterable cards); void clearSelectables(); void awaitNextInput(); diff --git a/forge-gui/src/main/java/forge/match/AbstractGuiGame.java b/forge-gui/src/main/java/forge/match/AbstractGuiGame.java index 90df99b9560..e71e4ff0293 100644 --- a/forge-gui/src/main/java/forge/match/AbstractGuiGame.java +++ b/forge-gui/src/main/java/forge/match/AbstractGuiGame.java @@ -221,8 +221,8 @@ public abstract class AbstractGuiGame implements IGuiGame, IMayViewCards { } private final Set selectableCards = Sets.newHashSet(); - public void setSelectables(final List cards) { - selectableCards.addAll(cards); + public void setSelectables(final Iterable cards) { + for ( CardView cv : cards ) { selectableCards.add(cv); } } public void clearSelectables() { selectableCards.clear(); From 4f953bf2e1f687e36e454a5b77ede8309738d16a Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Thu, 17 Jan 2019 05:42:10 +0000 Subject: [PATCH 598/901] FIX Protean Raider --- forge-gui/res/cardsfolder/p/protean_raider.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/p/protean_raider.txt b/forge-gui/res/cardsfolder/p/protean_raider.txt index 8426dc32a39..dc40c46a1a5 100644 --- a/forge-gui/res/cardsfolder/p/protean_raider.txt +++ b/forge-gui/res/cardsfolder/p/protean_raider.txt @@ -2,7 +2,7 @@ Name:Protean Raider ManaCost:1 U R Types:Creature Shapeshifter Pirate PT:2/2 -R:Event$ Moved | Destination$ Battlefield | ValidCard$ Card.Self | Layer$ Clone | Optional$ True | ReplaceWith$ DBCopy | CheckSVar$ RaidTest | References$ RaidTest | Description$ Raid — If you attacked with a creature this turn, you may have CARDNAME enter the battlefield as a copy of any creature on the battlefield. +R:Event$ Moved | Destination$ Battlefield | ValidCard$ Card.Self | Layer$ Copy | Optional$ True | ReplaceWith$ DBCopy | CheckSVar$ RaidTest | References$ RaidTest | Description$ Raid — If you attacked with a creature this turn, you may have CARDNAME enter the battlefield as a copy of any creature on the battlefield. SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | SubAbility$ DBChangeZone | SpellDescription$ Raid — If you attacked with a creature this turn, you may have CARDNAME enter the battlefield as a copy of any creature on the battlefield. SVar:DBChangeZone:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard SVar:RaidTest:Count$AttackersDeclared From 11f9520c1e9d645479a65bd18718db0606be800e Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Thu, 17 Jan 2019 09:35:52 -0500 Subject: [PATCH 599/901] Highlight sa targets in Desktop GUI --- [Help | 0 .../input/InputSelectEntitiesFromList.java | 17 ++++++++------- .../forge/match/input/InputSelectTargets.java | 21 +++++++++++++++++++ 3 files changed, 30 insertions(+), 8 deletions(-) delete mode 100644 [Help diff --git a/[Help b/[Help deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java b/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java index 6900ce5fed9..ecc85ed7409 100644 --- a/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java +++ b/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java @@ -33,8 +33,16 @@ public class InputSelectEntitiesFromList extends InputSele public InputSelectEntitiesFromList(final PlayerControllerHuman controller, final int min, final int max, final FCollectionView validChoices0, final SpellAbility sa0) { super(controller, Math.min(min, validChoices0.size()), Math.min(max, validChoices0.size()),sa0); validChoices = validChoices0; - if (min > validChoices.size()) { + if (min > validChoices.size()) { // pfps does this really do anything useful?? + System.out.println(String.format("Trying to choose at least %d things from a list with only %d things!", min, validChoices.size())); } + ArrayList vCards = new ArrayList(); + for ( T c : validChoices0 ) { + if ( c instanceof Card ) { + vCards.add(((Card)c).getView()) ; + } + } + controller.getGui().setSelectables(vCards); final PlayerZoneUpdates zonesToUpdate = new PlayerZoneUpdates(); for (final GameEntity c : validChoices) { final Zone cz = (c instanceof Card) ? ((Card) c).getZone() : null ; @@ -46,13 +54,6 @@ public class InputSelectEntitiesFromList extends InputSele zonesShown = controller.getGui().tempShowZones(controller.getPlayer().getView(),zonesToUpdate); } }); - ArrayList vCards = new ArrayList(); - for ( T c : validChoices0 ) { - if ( c instanceof Card ) { - vCards.add(((Card)c).getView()) ; - } - } - controller.getGui().setSelectables(vCards); } @Override diff --git a/forge-gui/src/main/java/forge/match/input/InputSelectTargets.java b/forge-gui/src/main/java/forge/match/input/InputSelectTargets.java index e7f131aeb2a..c3aa5f6cef8 100644 --- a/forge-gui/src/main/java/forge/match/input/InputSelectTargets.java +++ b/forge-gui/src/main/java/forge/match/input/InputSelectTargets.java @@ -22,6 +22,9 @@ import forge.properties.ForgeConstants; import forge.properties.ForgePreferences; import forge.util.ITriggerEvent; import forge.util.TextUtil; +import forge.player.PlayerZoneUpdate; +import forge.player.PlayerZoneUpdates; +import forge.FThreads; public final class InputSelectTargets extends InputSyncronizedBase { private final List choices; @@ -44,6 +47,16 @@ public final class InputSelectTargets extends InputSyncronizedBase { this.tgt = sa.getTargetRestrictions(); this.sa = sa; this.mandatory = mandatory; + controller.getGui().setSelectables(CardView.getCollection(choices)); + final PlayerZoneUpdates zonesToUpdate = new PlayerZoneUpdates(); + for (final Card c : choices) { + zonesToUpdate.add(new PlayerZoneUpdate(c.getZone().getPlayer().getView(),c.getZone().getZoneType())); + } + FThreads.invokeInEdtNowOrLater(new Runnable() { + @Override public void run() { + controller.getGui().updateZones(zonesToUpdate); + } + }); } @Override @@ -297,4 +310,12 @@ public final class InputSelectTargets extends InputSyncronizedBase { private boolean hasAllTargets() { return tgt.isMaxTargetsChosen(sa.getHostCard(), sa) || ( tgt.getStillToDivide() == 0 && tgt.isDividedAsYouChoose()); } + + + @Override + protected void onStop() { + getController().getGui().clearSelectables(); + super.onStop(); + } + } From 595fbae34fb390b52abf76e5cfc996fdb5d31cdd Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Thu, 17 Jan 2019 15:37:59 -0500 Subject: [PATCH 600/901] Fix crash when selecting a player --- .../java/forge/match/input/InputSelectEntitiesFromList.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java b/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java index ecc85ed7409..780883a4565 100644 --- a/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java +++ b/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java @@ -46,7 +46,9 @@ public class InputSelectEntitiesFromList extends InputSele final PlayerZoneUpdates zonesToUpdate = new PlayerZoneUpdates(); for (final GameEntity c : validChoices) { final Zone cz = (c instanceof Card) ? ((Card) c).getZone() : null ; - zonesToUpdate.add(new PlayerZoneUpdate(cz.getPlayer().getView(),cz.getZoneType())); + if ( cz != null ) { + zonesToUpdate.add(new PlayerZoneUpdate(cz.getPlayer().getView(),cz.getZoneType())); + } } FThreads.invokeInEdtNowOrLater(new Runnable() { @Override public void run() { From 8f2123f183392e9107c85f1d815afc1c97c830c2 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Thu, 17 Jan 2019 16:02:22 -0500 Subject: [PATCH 601/901] add fix to crash when selecting targets --- .../java/forge/match/input/InputSelectEntitiesFromList.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java b/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java index 1d018a02394..67f88228108 100644 --- a/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java +++ b/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java @@ -36,7 +36,9 @@ public class InputSelectEntitiesFromList extends InputSele final PlayerZoneUpdates zonesToUpdate = new PlayerZoneUpdates(); for (final GameEntity c : validChoices) { final Zone cz = (c instanceof Card) ? ((Card) c).getZone() : null ; - zonesToUpdate.add(new PlayerZoneUpdate(cz.getPlayer().getView(),cz.getZoneType())); + if ( cz != null ) { + zonesToUpdate.add(new PlayerZoneUpdate(cz.getPlayer().getView(),cz.getZoneType())); + } } FThreads.invokeInEdtNowOrLater(new Runnable() { @Override public void run() { From 07c2065917c28f3d1615efeb6bd67e21fd5f301c Mon Sep 17 00:00:00 2001 From: churrufli Date: Fri, 18 Jan 2019 08:20:02 +0100 Subject: [PATCH 602/901] Translating hard-coded text to res en-US.properties --- .../src/main/java/forge/util/Localizer.java | 3 +- .../home/settings/VSubmenuAchievements.java | 8 +- .../home/settings/VSubmenuDownloaders.java | 48 ++-- .../home/settings/VSubmenuPreferences.java | 258 +++++++++--------- .../home/settings/VSubmenuReleaseNotes.java | 7 +- forge-gui/res/languages/en-US.properties | 162 ++++++++++- 6 files changed, 329 insertions(+), 157 deletions(-) diff --git a/forge-core/src/main/java/forge/util/Localizer.java b/forge-core/src/main/java/forge/util/Localizer.java index cc31a7f1af3..6569e1a2e91 100644 --- a/forge-core/src/main/java/forge/util/Localizer.java +++ b/forge-core/src/main/java/forge/util/Localizer.java @@ -37,7 +37,8 @@ public class Localizer { MessageFormat formatter = null; try { - formatter = new MessageFormat(resourceBundle.getString(key.toLowerCase()), locale); + //formatter = new MessageFormat(resourceBundle.getString(key.toLowerCase()), locale); + formatter = new MessageFormat(resourceBundle.getString(key.toString()), locale); } catch (final IllegalArgumentException | MissingResourceException e) { e.printStackTrace(); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuAchievements.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuAchievements.java index bd5e3fc31d2..7ea7f2b9efc 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuAchievements.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuAchievements.java @@ -31,6 +31,7 @@ import forge.toolbox.FSkin.SkinColor; import forge.toolbox.FSkin.SkinFont; import forge.toolbox.FSkin.SkinImage; import forge.toolbox.special.CardZoomer; +import forge.util.Localizer; import net.miginfocom.swing.MigLayout; import javax.swing.*; @@ -54,12 +55,13 @@ public enum VSubmenuAchievements implements IVSubmenu { private static final SkinColor NOT_EARNED_COLOR = TEXT_COLOR.alphaColor(128); private static final SkinColor TEXTURE_OVERLAY_COLOR = FSkin.getColor(Colors.CLR_THEME); private static final SkinColor BORDER_COLOR = FSkin.getColor(Colors.CLR_BORDERS); + final Localizer localizer = Localizer.getInstance(); // Fields used with interface IVDoc private DragCell parentCell; - private final DragTab tab = new DragTab("Achievements"); + private final DragTab tab = new DragTab(localizer.getMessage("Achievements")); private final FLabel lblTitle = new FLabel.Builder() - .text("Achievements").fontAlign(SwingConstants.CENTER) + .text(localizer.getMessage("Achievements")).fontAlign(SwingConstants.CENTER) .opaque(true).fontSize(16).build(); private final FComboBox cbCollections = new FComboBox(); private final TrophyCase trophyCase = new TrophyCase(); @@ -167,7 +169,7 @@ public enum VSubmenuAchievements implements IVSubmenu { */ @Override public String getMenuTitle() { - return "Achievements"; + return localizer.getMessage("Achievements"); } /* (non-Javadoc) diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuDownloaders.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuDownloaders.java index 8ac7126b9bf..ed7ebed404c 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuDownloaders.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuDownloaders.java @@ -12,6 +12,7 @@ import forge.screens.home.IVSubmenu; import forge.screens.home.VHomeUI; import forge.toolbox.*; import forge.util.FileUtil; +import forge.util.Localizer; import forge.util.RuntimeVersion; import net.miginfocom.swing.MigLayout; @@ -29,6 +30,8 @@ import java.awt.event.ActionListener; public enum VSubmenuDownloaders implements IVSubmenu { /** */ SINGLETON_INSTANCE; + final Localizer localizer = Localizer.getInstance(); + // Fields used with interface IVDoc private DragCell parentCell; @@ -38,15 +41,15 @@ public enum VSubmenuDownloaders implements IVSubmenu { private final JPanel pnlContent = new JPanel(new MigLayout("insets 0, gap 0, wrap, ay center")); private final FScrollPane scrContent = new FScrollPane(pnlContent, false); - private final FLabel btnDownloadSetPics = _makeButton("Download LQ Set Pictures"); - private final FLabel btnDownloadPics = _makeButton("Download LQ Card Pictures"); - private final FLabel btnDownloadQuestImages = _makeButton("Download Quest Images"); - private final FLabel btnDownloadAchievementImages = _makeButton("Download Achievement Images"); - private final FLabel btnReportBug = _makeButton("Report a Bug"); - private final FLabel btnImportPictures = _makeButton("Import Data"); - private final FLabel btnHowToPlay = _makeButton("How To Play"); - private final FLabel btnDownloadPrices = _makeButton("Download Card Prices"); - private final FLabel btnLicensing = _makeButton("License Details"); + private final FLabel btnDownloadSetPics = _makeButton(localizer.getMessage("btnDownloadSetPics")); + private final FLabel btnDownloadPics = _makeButton(localizer.getMessage("btnDownloadPics")); + private final FLabel btnDownloadQuestImages = _makeButton(localizer.getMessage("btnDownloadQuestImages")); + private final FLabel btnDownloadAchievementImages = _makeButton(localizer.getMessage("btnDownloadAchievementImages")); + private final FLabel btnReportBug = _makeButton(localizer.getMessage("btnReportBug")); + private final FLabel btnImportPictures = _makeButton(localizer.getMessage("btnImportPictures")); + private final FLabel btnHowToPlay = _makeButton(localizer.getMessage("btnHowToPlay")); + private final FLabel btnDownloadPrices = _makeButton(localizer.getMessage("btnDownloadPrices")); + private final FLabel btnLicensing = _makeButton(localizer.getMessage("btnLicensing")); /** * Constructor. @@ -61,47 +64,48 @@ public enum VSubmenuDownloaders implements IVSubmenu { if (javaRecentEnough()) { pnlContent.add(btnDownloadPics, constraintsBTN); - pnlContent.add(_makeLabel("Download default card picture for each card."), constraintsLBL); + pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadPics")), constraintsLBL); pnlContent.add(btnDownloadSetPics, constraintsBTN); - pnlContent.add(_makeLabel("Download all pictures of each card (one for each set the card appeared in)"), constraintsLBL); + pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadSetPics")), constraintsLBL); pnlContent.add(btnDownloadQuestImages, constraintsBTN); - pnlContent.add(_makeLabel("Download tokens and icons used in Quest mode."), constraintsLBL); + pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadQuestImages")), constraintsLBL); pnlContent.add(btnDownloadAchievementImages, constraintsBTN); - pnlContent.add(_makeLabel("Download achievement images to really make your trophies stand out."), constraintsLBL); + pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadAchievementImages")), constraintsLBL); pnlContent.add(btnDownloadPrices, constraintsBTN); - pnlContent.add(_makeLabel("Download up-to-date price list for in-game card shops."), constraintsLBL); + pnlContent.add(_makeLabel(localizer.getMessage("lblDownloadPrices")), constraintsLBL); } else { - String text = "Your version of Java is too old to use the content downloaders."; + String text = localizer.getMessage("lblYourVersionOfJavaIsTooOld"); FLabel label = new FLabel.Builder().fontAlign(SwingConstants.CENTER).text(text).fontStyle(Font.BOLD).fontSize(18).build(); pnlContent.add(label, "w 90%!, h 25px!, center, gap 0 0 30px 3px"); - text = "Please update to the latest version of Java 8 to use this feature."; + text = localizer.getMessage("lblPleaseUpdateToTheLatestVersionOfJava"); label = new FLabel.Builder().fontAlign(SwingConstants.CENTER).text(text).fontStyle(Font.BOLD).fontSize(18).build(); pnlContent.add(label, "w 90%!, h 25px!, center, gap 0 0 0 36px"); - text = "You're running " + System.getProperty("java.version") + ". You need at least version 1.8.0_101."; + text = localizer.getMessage("lblYoureRunning") + " " + System.getProperty("java.version"); + text = text + " . " + localizer.getMessage("lblYouNeedAtLeastJavaVersion") ; label = new FLabel.Builder().fontAlign(SwingConstants.CENTER).text(text).fontStyle(Font.BOLD).fontSize(18).build(); pnlContent.add(label, "w 90%!, h 25px!, center, gap 0 0 0 36px"); } pnlContent.add(btnImportPictures, constraintsBTN); - pnlContent.add(_makeLabel("Import data from a local directory."), constraintsLBL); + pnlContent.add(_makeLabel(localizer.getMessage("lblImportPictures")), constraintsLBL); pnlContent.add(btnReportBug, constraintsBTN); - pnlContent.add(_makeLabel("Something broken?"), constraintsLBL); + pnlContent.add(_makeLabel(localizer.getMessage("lblReportBug")), constraintsLBL); pnlContent.add(btnHowToPlay, constraintsBTN); - pnlContent.add(_makeLabel("Rules of the Game."), constraintsLBL); + pnlContent.add(_makeLabel(localizer.getMessage("lblHowToPlay")), constraintsLBL); pnlContent.add(btnLicensing, constraintsBTN); - pnlContent.add(_makeLabel("Forge legal."), constraintsLBL); + pnlContent.add(_makeLabel(localizer.getMessage("lblLicensing")), constraintsLBL); } @@ -210,7 +214,7 @@ public enum VSubmenuDownloaders implements IVSubmenu { */ @Override public String getMenuTitle() { - return "Content Downloaders"; + return localizer.getMessage("ContentDownloaders"); } /* (non-Javadoc) diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java index cbf2bd9cf40..5d0a836410a 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java @@ -15,6 +15,7 @@ import forge.screens.home.VHomeUI; import forge.toolbox.*; import forge.toolbox.FSkin.SkinnedLabel; import forge.toolbox.FSkin.SkinnedTextField; +import forge.util.Localizer; import net.miginfocom.swing.MigLayout; import org.apache.commons.lang3.StringUtils; @@ -27,91 +28,94 @@ import java.awt.event.KeyEvent; import java.util.*; import java.util.List; + /** * Assembles Swing components of preferences submenu singleton. * *

(V at beginning of class name denotes a view class.) */ public enum VSubmenuPreferences implements IVSubmenu { + /** */ SINGLETON_INSTANCE; + final Localizer localizer = Localizer.getInstance(); // Fields used with interface IVDoc private DragCell parentCell; - private final DragTab tab = new DragTab("Preferences"); + private final DragTab tab = new DragTab(localizer.getMessage("Preferences")); /** */ private final JPanel pnlPrefs = new JPanel(); private final FScrollPane scrContent = new FScrollPane(pnlPrefs, false, - ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); + ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); - private final FLabel btnReset = new FLabel.Builder().opaque(true).hoverable(true).text("Reset to Default Settings").build(); - private final FLabel btnDeleteMatchUI = new FLabel.Builder().opaque(true).hoverable(true).text("Reset Match Layout").build(); - private final FLabel btnDeleteEditorUI = new FLabel.Builder().opaque(true).hoverable(true).text("Reset Editor Layout").build(); - private final FLabel btnDeleteWorkshopUI = new FLabel.Builder().opaque(true).hoverable(true).text("Reset Workshop Layout").build(); - private final FLabel btnUserProfileUI = new FLabel.Builder().opaque(true).hoverable(true).text("Open User Directory").build(); - private final FLabel btnContentDirectoryUI = new FLabel.Builder().opaque(true).hoverable(true).text("Open Content Directory").build(); - private final FLabel btnResetJavaFutureCompatibilityWarnings = new FLabel.Builder().opaque(true).hoverable(true).text("Reset Java Compatibility Warnings").build(); + private final FLabel btnReset = new FLabel.Builder().opaque(true).hoverable(true).text(localizer.getMessage("btnReset")).build(); + private final FLabel btnDeleteMatchUI = new FLabel.Builder().opaque(true).hoverable(true).text(localizer.getMessage("btnDeleteMatchUI")).build(); + private final FLabel btnDeleteEditorUI = new FLabel.Builder().opaque(true).hoverable(true).text(localizer.getMessage("btnDeleteEditorUI")).build(); + private final FLabel btnDeleteWorkshopUI = new FLabel.Builder().opaque(true).hoverable(true).text(localizer.getMessage("btnDeleteWorkshopUI")).build(); + private final FLabel btnUserProfileUI = new FLabel.Builder().opaque(true).hoverable(true).text(localizer.getMessage("btnUserProfileUI")).build(); + private final FLabel btnContentDirectoryUI = new FLabel.Builder().opaque(true).hoverable(true).text(localizer.getMessage("btnContentDirectoryUI")).build(); + private final FLabel btnResetJavaFutureCompatibilityWarnings = new FLabel.Builder().opaque(true).hoverable(true).text(localizer.getMessage("btnResetJavaFutureCompatibilityWarnings")).build(); private final FLabel btnPlayerName = new FLabel.Builder().opaque(true).hoverable(true).text("").build(); - private final JCheckBox cbRemoveSmall = new OptionsCheckBox("Remove Small Creatures"); - private final JCheckBox cbCardBased = new OptionsCheckBox("Include Card-based Deck Generation"); - private final JCheckBox cbSingletons = new OptionsCheckBox("Singleton Mode"); - private final JCheckBox cbRemoveArtifacts = new OptionsCheckBox("Remove Artifacts"); - private final JCheckBox cbAnte = new OptionsCheckBox("Play for Ante"); - private final JCheckBox cbAnteMatchRarity = new OptionsCheckBox("Match Ante Rarity"); - private final JCheckBox cbEnableAICheats = new OptionsCheckBox("Allow AI Cheating"); - private final JCheckBox cbManaBurn = new OptionsCheckBox("Mana Burn"); - private final JCheckBox cbManaLostPrompt = new OptionsCheckBox("Prompt Mana Pool Emptying"); - private final JCheckBox cbDevMode = new OptionsCheckBox("Developer Mode"); - private final JCheckBox cbLoadCardsLazily = new OptionsCheckBox("Load Card Scripts Lazily"); - private final JCheckBox cbLoadHistoricFormats = new OptionsCheckBox("Load Historic Formats"); - private final JCheckBox cbWorkshopSyntax = new OptionsCheckBox("Workshop Syntax Checker"); - private final JCheckBox cbEnforceDeckLegality = new OptionsCheckBox("Deck Conformance"); - private final JCheckBox cbPerformanceMode = new OptionsCheckBox("Performance Mode"); - private final JCheckBox cbFilteredHands = new OptionsCheckBox("Filtered Hands"); - private final JCheckBox cbImageFetcher = new OptionsCheckBox("Automatically Download Missing Card Art"); - private final JCheckBox cbCloneImgSource = new OptionsCheckBox("Clones Use Original Card Art"); - private final JCheckBox cbScaleLarger = new OptionsCheckBox("Scale Image Larger"); - private final JCheckBox cbRenderBlackCardBorders = new OptionsCheckBox("Render Black Card Borders"); - private final JCheckBox cbLargeCardViewers = new OptionsCheckBox("Use Large Card Viewers"); - private final JCheckBox cbSmallDeckViewer = new OptionsCheckBox("Use Small Deck Viewer"); - private final JCheckBox cbDisplayFoil = new OptionsCheckBox("Display Foil Overlay"); - private final JCheckBox cbRandomFoil = new OptionsCheckBox("Random Foil"); - private final JCheckBox cbRandomArtInPools = new OptionsCheckBox("Randomize Card Art in Generated Card Pools"); - private final JCheckBox cbEnableSounds = new OptionsCheckBox("Enable Sounds"); - private final JCheckBox cbEnableMusic = new OptionsCheckBox("Enable Music"); - private final JCheckBox cbAltSoundSystem = new OptionsCheckBox("Use Alternate Sound System"); - private final JCheckBox cbUiForTouchScreen = new OptionsCheckBox("Enhance UI for Touchscreens"); - private final JCheckBox cbTimedTargOverlay = new OptionsCheckBox("Enable Targeting Overlay Optimization"); - private final JCheckBox cbCompactMainMenu = new OptionsCheckBox("Use Compact Main Sidebar Menu"); - private final JCheckBox cbDetailedPaymentDesc = new OptionsCheckBox("Spell Description in Payment Prompt"); - private final JCheckBox cbPromptFreeBlocks = new OptionsCheckBox("Free Block Handling"); - private final JCheckBox cbPauseWhileMinimized = new OptionsCheckBox("Pause While Minimized"); - private final JCheckBox cbCompactPrompt = new OptionsCheckBox("Compact Prompt"); - private final JCheckBox cbEscapeEndsTurn = new OptionsCheckBox("Use Escape Key to End Turn"); - private final JCheckBox cbPreselectPrevAbOrder = new OptionsCheckBox("Preselect Last Order of Abilities"); - private final JCheckBox cbHideReminderText = new OptionsCheckBox("Hide Reminder Text"); - private final JCheckBox cbOpenPacksIndiv = new OptionsCheckBox("Open Packs Individually"); - private final JCheckBox cbTokensInSeparateRow = new OptionsCheckBox("Display Tokens in a Separate Row"); - private final JCheckBox cbStackCreatures = new OptionsCheckBox("Stack Creatures"); - private final JCheckBox cbFilterLandsByColorId = new OptionsCheckBox("Filter Lands by Color in Activated Abilities"); - private final JCheckBox cbShowStormCount = new OptionsCheckBox("Show Storm Count in Prompt Pane"); - private final JCheckBox cbRemindOnPriority = new OptionsCheckBox("Visually Alert on Receipt of Priority"); - private final JCheckBox cbUseSentry = new OptionsCheckBox("Automatically submit bug reports."); + private final JCheckBox cbRemoveSmall = new OptionsCheckBox(localizer.getMessage("cbRemoveSmall")); + private final JCheckBox cbCardBased = new OptionsCheckBox(localizer.getMessage("cbCardBased")); + private final JCheckBox cbSingletons = new OptionsCheckBox(localizer.getMessage("cbSingletons")); + private final JCheckBox cbRemoveArtifacts = new OptionsCheckBox(localizer.getMessage("cbRemoveArtifacts")); + private final JCheckBox cbAnte = new OptionsCheckBox(localizer.getMessage("cbAnte")); + private final JCheckBox cbAnteMatchRarity = new OptionsCheckBox(localizer.getMessage("cbAnteMatchRarity")); + private final JCheckBox cbEnableAICheats = new OptionsCheckBox(localizer.getMessage("cbEnableAICheats")); + private final JCheckBox cbManaBurn = new OptionsCheckBox(localizer.getMessage("cbManaBurn")); + private final JCheckBox cbManaLostPrompt = new OptionsCheckBox(localizer.getMessage("cbManaLostPrompt")); + private final JCheckBox cbDevMode = new OptionsCheckBox(localizer.getMessage("cbDevMode")); + private final JCheckBox cbLoadCardsLazily = new OptionsCheckBox(localizer.getMessage("cbLoadCardsLazily")); + private final JCheckBox cbLoadHistoricFormats = new OptionsCheckBox(localizer.getMessage("cbLoadHistoricFormats")); + private final JCheckBox cbWorkshopSyntax = new OptionsCheckBox(localizer.getMessage("cbWorkshopSyntax")); + private final JCheckBox cbEnforceDeckLegality = new OptionsCheckBox(localizer.getMessage("cbEnforceDeckLegality")); + private final JCheckBox cbPerformanceMode = new OptionsCheckBox(localizer.getMessage("cbPerformanceMode")); + private final JCheckBox cbFilteredHands = new OptionsCheckBox(localizer.getMessage("cbFilteredHands")); + private final JCheckBox cbImageFetcher = new OptionsCheckBox(localizer.getMessage("cbImageFetcher")); + private final JCheckBox cbCloneImgSource = new OptionsCheckBox(localizer.getMessage("cbCloneImgSource")); + private final JCheckBox cbScaleLarger = new OptionsCheckBox(localizer.getMessage("cbScaleLarger")); + private final JCheckBox cbRenderBlackCardBorders = new OptionsCheckBox(localizer.getMessage("cbRenderBlackCardBorders")); + private final JCheckBox cbLargeCardViewers = new OptionsCheckBox(localizer.getMessage("cbLargeCardViewers")); + private final JCheckBox cbSmallDeckViewer = new OptionsCheckBox(localizer.getMessage("cbSmallDeckViewer")); + private final JCheckBox cbDisplayFoil = new OptionsCheckBox(localizer.getMessage("cbDisplayFoil")); + private final JCheckBox cbRandomFoil= new OptionsCheckBox(localizer.getMessage("cbRandomFoil")); + private final JCheckBox cbRandomArtInPools = new OptionsCheckBox(localizer.getMessage("cbRandomArtInPools")); + private final JCheckBox cbEnableSounds = new OptionsCheckBox(localizer.getMessage("cbEnableSounds")); + private final JCheckBox cbEnableMusic = new OptionsCheckBox(localizer.getMessage("cbEnableMusic")); + private final JCheckBox cbAltSoundSystem = new OptionsCheckBox(localizer.getMessage("cbAltSoundSystem")); + private final JCheckBox cbUiForTouchScreen = new OptionsCheckBox(localizer.getMessage("cbUiForTouchScreen")); + private final JCheckBox cbTimedTargOverlay = new OptionsCheckBox(localizer.getMessage("cbTimedTargOverlay")); + private final JCheckBox cbCompactMainMenu = new OptionsCheckBox(localizer.getMessage("cbCompactMainMenu")); + private final JCheckBox cbDetailedPaymentDesc = new OptionsCheckBox(localizer.getMessage("cbDetailedPaymentDesc")); + private final JCheckBox cbPromptFreeBlocks = new OptionsCheckBox(localizer.getMessage("cbPromptFreeBlocks")); + private final JCheckBox cbPauseWhileMinimized = new OptionsCheckBox(localizer.getMessage("cbPauseWhileMinimized")); + private final JCheckBox cbCompactPrompt = new OptionsCheckBox(localizer.getMessage("cbCompactPrompt")); + private final JCheckBox cbEscapeEndsTurn = new OptionsCheckBox(localizer.getMessage("cbEscapeEndsTurn")); + private final JCheckBox cbPreselectPrevAbOrder = new OptionsCheckBox(localizer.getMessage("cbPreselectPrevAbOrder")); + private final JCheckBox cbHideReminderText = new OptionsCheckBox(localizer.getMessage("cbHideReminderText")); + private final JCheckBox cbOpenPacksIndiv = new OptionsCheckBox(localizer.getMessage("cbOpenPacksIndiv")); + private final JCheckBox cbTokensInSeparateRow = new OptionsCheckBox(localizer.getMessage("cbTokensInSeparateRow")); + private final JCheckBox cbStackCreatures = new OptionsCheckBox(localizer.getMessage("cbStackCreatures")); + private final JCheckBox cbFilterLandsByColorId = new OptionsCheckBox(localizer.getMessage("cbFilterLandsByColorId")); + private final JCheckBox cbShowStormCount = new OptionsCheckBox(localizer.getMessage("cbShowStormCount")); + private final JCheckBox cbRemindOnPriority = new OptionsCheckBox(localizer.getMessage("cbRemindOnPriority")); + private final JCheckBox cbUseSentry = new OptionsCheckBox(localizer.getMessage("cbUseSentry")); private final Map shortcutFields = new HashMap<>(); // ComboBox items are added in CSubmenuPreferences since this is just the View. - private final FComboBoxPanel cbpGameLogEntryType = new FComboBoxPanel<>("Game Log Verbosity:"); - private final FComboBoxPanel cbpCloseAction = new FComboBoxPanel<>("Close Action:"); - private final FComboBoxPanel cbpDefaultFontSize = new FComboBoxPanel<>("Default Font Size:"); - private final FComboBoxPanel cbpAiProfiles = new FComboBoxPanel<>("AI Personality:"); - private final FComboBoxPanel cbpDisplayCurrentCardColors = new FComboBoxPanel<>("Show Detailed Card Color:"); - private final FComboBoxPanel cbpAutoYieldMode = new FComboBoxPanel<>("Auto-Yield:"); - private final FComboBoxPanel cbpCounterDisplayType = new FComboBoxPanel<>("Counter Display Type:"); - private final FComboBoxPanel cbpCounterDisplayLocation = new FComboBoxPanel<>("Counter Display Location:"); - private final FComboBoxPanel cbpGraveyardOrdering = new FComboBoxPanel<>("Allow Ordering Cards Put in Graveyard:"); + private final FComboBoxPanel cbpGameLogEntryType = new FComboBoxPanel<>(localizer.getMessage("cbpGameLogEntryType")+":"); + private final FComboBoxPanel cbpCloseAction = new FComboBoxPanel<>(localizer.getMessage("cbpCloseAction")+":"); + private final FComboBoxPanel cbpDefaultFontSize = new FComboBoxPanel<>(localizer.getMessage("cbpDefaultFontSize")+":"); + private final FComboBoxPanel cbpAiProfiles = new FComboBoxPanel<>(localizer.getMessage("cbpAiProfiles")+":"); + private final FComboBoxPanel cbpDisplayCurrentCardColors = new FComboBoxPanel<>(localizer.getMessage("cbpDisplayCurrentCardColors")+":"); + private final FComboBoxPanel cbpAutoYieldMode = new FComboBoxPanel<>(localizer.getMessage("cbpAutoYieldMode")+":"); + private final FComboBoxPanel cbpCounterDisplayType = new FComboBoxPanel<>(localizer.getMessage("cbpCounterDisplayType")+":"); + private final FComboBoxPanel cbpCounterDisplayLocation =new FComboBoxPanel<>(localizer.getMessage("cbpCounterDisplayLocation")+":"); + private final FComboBoxPanel cbpGraveyardOrdering = new FComboBoxPanel<>(localizer.getMessage("cbpGraveyardOrdering")+":"); /** * Constructor. @@ -128,7 +132,7 @@ public enum VSubmenuPreferences implements IVSubmenu { final String descriptionConstraints = "w 80%!, h 22px!, gap 28px 0 0 20px, span 2 1"; // Troubleshooting - pnlPrefs.add(new SectionLabel("Troubleshooting"), sectionConstraints); + pnlPrefs.add(new SectionLabel(localizer.getMessage("Troubleshooting")), sectionConstraints); // Reset buttons final String twoButtonConstraints1 = "w 38%!, h 30px!, gap 25px 0 0 10px"; @@ -141,199 +145,199 @@ public enum VSubmenuPreferences implements IVSubmenu { pnlPrefs.add(btnContentDirectoryUI, twoButtonConstraints2); // General Configuration - pnlPrefs.add(new SectionLabel("General Configuration"), sectionConstraints); + pnlPrefs.add(new SectionLabel(localizer.getMessage("GeneralConfiguration")), sectionConstraints); pnlPrefs.add(getPlayerNamePanel(), titleConstraints + ", h 26px!"); - pnlPrefs.add(new NoteLabel("Sets the name that you will be referred to by Forge during gameplay."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlPlayerName")), descriptionConstraints); pnlPrefs.add(cbCompactMainMenu, titleConstraints); - pnlPrefs.add(new NoteLabel("Enable for a space efficient sidebar that displays only one menu group at a time (RESTART REQUIRED)."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlCompactMainMenu")), descriptionConstraints); pnlPrefs.add(cbUseSentry, titleConstraints); - pnlPrefs.add(new NoteLabel("When enabled, automatically submits bug reports to developers."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlUseSentry")), descriptionConstraints); pnlPrefs.add(btnResetJavaFutureCompatibilityWarnings, "w 300px!, h 30px!, gap 27px 0 0 20px, span 2 1"); // Gameplay Options - pnlPrefs.add(new SectionLabel("Gameplay"), sectionConstraints); + pnlPrefs.add(new SectionLabel(localizer.getMessage("GamePlay")), sectionConstraints); pnlPrefs.add(cbpAiProfiles, comboBoxConstraints); - pnlPrefs.add(new NoteLabel("Choose your AI opponent."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlpAiProfiles")), descriptionConstraints); pnlPrefs.add(cbAnte, titleConstraints); - pnlPrefs.add(new NoteLabel("Determines whether or not the game is played for ante."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlAnte")), descriptionConstraints); pnlPrefs.add(cbAnteMatchRarity, titleConstraints); - pnlPrefs.add(new NoteLabel("Attempts to make antes the same rarity for all players."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlAnteMatchRarity")), descriptionConstraints); pnlPrefs.add(cbEnableAICheats, titleConstraints); - pnlPrefs.add(new NoteLabel("Allow the AI to cheat to gain advantage (for personalities that have cheat shuffling options set)."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlEnableAICheats")), descriptionConstraints); pnlPrefs.add(cbManaBurn, titleConstraints); - pnlPrefs.add(new NoteLabel("Play with mana burn (from pre-Magic 2010 rules)."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlManaBurn")), descriptionConstraints); pnlPrefs.add(cbManaLostPrompt, titleConstraints); - pnlPrefs.add(new NoteLabel("When enabled, you get a warning if passing priority would cause you to lose mana in your mana pool."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlManaLostPrompt")), descriptionConstraints); pnlPrefs.add(cbEnforceDeckLegality, titleConstraints); - pnlPrefs.add(new NoteLabel("Enforces deck legality relevant to each environment (minimum deck sizes, max card count etc)."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlEnforceDeckLegality")), descriptionConstraints); pnlPrefs.add(cbPerformanceMode, titleConstraints); - pnlPrefs.add(new NoteLabel("Disables additional static abilities checks to speed up the game engine. (Warning: breaks some 'as if had flash' scenarios when casting cards owned by opponents)."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlPerformanceMode")), descriptionConstraints); pnlPrefs.add(cbFilteredHands, titleConstraints); - pnlPrefs.add(new NoteLabel("Generates two starting hands and keeps the one with the closest to average land count for the deck. (Requires restart)"), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlFilteredHands")), descriptionConstraints); pnlPrefs.add(cbCloneImgSource, titleConstraints); - pnlPrefs.add(new NoteLabel("When enabled clones will use their original art instead of the cloned card's art."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlCloneImgSource")), descriptionConstraints); pnlPrefs.add(cbPromptFreeBlocks, titleConstraints); - pnlPrefs.add(new NoteLabel("When enabled, if you would have to pay 0 to block, pay automatically without prompt."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlPromptFreeBlocks")), descriptionConstraints); pnlPrefs.add(cbPauseWhileMinimized, titleConstraints); - pnlPrefs.add(new NoteLabel("When enabled, Forge pauses when minimized (primarily for AI vs AI)."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlPauseWhileMinimized")), descriptionConstraints); pnlPrefs.add(cbEscapeEndsTurn, titleConstraints); - pnlPrefs.add(new NoteLabel("When enabled, Escape key functions as an alternative shortcut to end the current turn."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlEscapeEndsTurn")), descriptionConstraints); pnlPrefs.add(cbDetailedPaymentDesc, titleConstraints); - pnlPrefs.add(new NoteLabel("When enabled, detailed spell/ability descriptions are shown when choosing targets and paying costs."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlDetailedPaymentDesc")), descriptionConstraints); pnlPrefs.add(cbShowStormCount, titleConstraints); - pnlPrefs.add(new NoteLabel("When enabled, displays the current storm count in the prompt pane."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlShowStormCount")), descriptionConstraints); pnlPrefs.add(cbRemindOnPriority, titleConstraints); - pnlPrefs.add(new NoteLabel("When enabled, flashes the player choice area upon receiving priority."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlRemindOnPriority")), descriptionConstraints); pnlPrefs.add(cbPreselectPrevAbOrder, titleConstraints); - pnlPrefs.add(new NoteLabel("When enabled, preselects the last defined simultaneous ability order in the ordering dialog."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlPreselectPrevAbOrder")), descriptionConstraints); pnlPrefs.add(cbpGraveyardOrdering, comboBoxConstraints); - pnlPrefs.add(new NoteLabel("Determines when to let the player choose the order of cards simultaneously put in graveyard (never, always, or only when playing with cards for which it matters, for example, Volrath's Shapeshifter)."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlpGraveyardOrdering")), descriptionConstraints); pnlPrefs.add(cbpAutoYieldMode, comboBoxConstraints); - pnlPrefs.add(new NoteLabel("Defines the granularity level of auto-yields (per unique ability or per unique card)."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlpAutoYieldMode")), descriptionConstraints); // Deck building options - pnlPrefs.add(new SectionLabel("Random Deck Generation"), sectionConstraints); + pnlPrefs.add(new SectionLabel(localizer.getMessage("RandomDeckGeneration")), sectionConstraints); pnlPrefs.add(cbRemoveSmall, titleConstraints); - pnlPrefs.add(new NoteLabel("Disables 1/1 and 0/X creatures in generated decks."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlRemoveSmall")), descriptionConstraints); pnlPrefs.add(cbSingletons, titleConstraints); - pnlPrefs.add(new NoteLabel("Disables non-land duplicates in generated decks."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlSingletons")), descriptionConstraints); pnlPrefs.add(cbRemoveArtifacts, titleConstraints); - pnlPrefs.add(new NoteLabel("Disables artifact cards in generated decks."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlRemoveArtifacts")), descriptionConstraints); pnlPrefs.add(cbCardBased, titleConstraints); - pnlPrefs.add(new NoteLabel("Builds more synergistic random decks (requires restart)."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlCardBased")), descriptionConstraints); // Deck building options - pnlPrefs.add(new SectionLabel("Deck Editor Options"), sectionConstraints); + pnlPrefs.add(new SectionLabel(localizer.getMessage("DeckEditorOptions")), sectionConstraints); pnlPrefs.add(cbFilterLandsByColorId, titleConstraints); - pnlPrefs.add(new NoteLabel("When using card color filters, filter lands in a way to make it easier to find relevant mana producing lands."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlFilterLandsByColorId")), descriptionConstraints); // Advanced - pnlPrefs.add(new SectionLabel("Advanced Settings"), sectionConstraints); + pnlPrefs.add(new SectionLabel(localizer.getMessage("AdvancedSettings")), sectionConstraints); pnlPrefs.add(cbDevMode, titleConstraints); - pnlPrefs.add(new NoteLabel("Enables menu with functions for testing during development."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlDevMode")), descriptionConstraints); pnlPrefs.add(cbWorkshopSyntax, titleConstraints); - pnlPrefs.add(new NoteLabel("Enables syntax checking of card scripts in the Workshop. Note: functionality still in testing phase!"), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlWorkshopSyntax")), descriptionConstraints); pnlPrefs.add(cbpGameLogEntryType, comboBoxConstraints); - pnlPrefs.add(new NoteLabel("Changes how much information is displayed in the game log. Sorted by least to most verbose."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlGameLogEntryType")), descriptionConstraints); pnlPrefs.add(cbpCloseAction, comboBoxConstraints); - pnlPrefs.add(new NoteLabel("Changes what happens when clicking the X button in the upper right."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlCloseAction")), descriptionConstraints); pnlPrefs.add(cbLoadCardsLazily, titleConstraints); - pnlPrefs.add(new NoteLabel("If turned on, Forge will load card scripts as they're needed instead of at start up. (Warning: Experimental)"), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlLoadCardsLazily")), descriptionConstraints); pnlPrefs.add(cbLoadHistoricFormats, titleConstraints); - pnlPrefs.add(new NoteLabel("If turned on, Forge will load all historic format definitions, this may take slightly longer to load at startup."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlLoadHistoricFormats")), descriptionConstraints); // Graphic Options - pnlPrefs.add(new SectionLabel("Graphic Options"), sectionConstraints + ", gaptop 2%"); + pnlPrefs.add(new SectionLabel(localizer.getMessage("GraphicOptions")), sectionConstraints + ", gaptop 2%"); pnlPrefs.add(cbpDefaultFontSize, comboBoxConstraints); - pnlPrefs.add(new NoteLabel("The default font size within the UI. All font elements are scaled relative to this. (Needs restart)"), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlDefaultFontSize")), descriptionConstraints); pnlPrefs.add(cbImageFetcher, titleConstraints); - pnlPrefs.add(new NoteLabel("Enables live fetching of missing card images from an online resource."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlImageFetcher")), descriptionConstraints); pnlPrefs.add(cbDisplayFoil, titleConstraints); - pnlPrefs.add(new NoteLabel("Displays foil cards with the visual foil overlay effect."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlDisplayFoil")), descriptionConstraints); pnlPrefs.add(cbRandomFoil, titleConstraints); - pnlPrefs.add(new NoteLabel("Adds foil effect to random cards."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlRandomFoil")), descriptionConstraints); pnlPrefs.add(cbScaleLarger, titleConstraints); - pnlPrefs.add(new NoteLabel("Allows card pictures to be expanded larger than their original size."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlScaleLarger")), descriptionConstraints); pnlPrefs.add(cbRenderBlackCardBorders, titleConstraints); - pnlPrefs.add(new NoteLabel("Render black borders around card images."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlRenderBlackCardBorders")), descriptionConstraints); pnlPrefs.add(cbLargeCardViewers, titleConstraints); - pnlPrefs.add(new NoteLabel("Makes all card viewers much larger for use with high resolution images. Will not fit on smaller screens."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlLargeCardViewers")), descriptionConstraints); pnlPrefs.add(cbSmallDeckViewer, titleConstraints); - pnlPrefs.add(new NoteLabel("Sets the deck viewer window to be 800x600 rather than a proportion of the screen size."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlSmallDeckViewer")), descriptionConstraints); pnlPrefs.add(cbRandomArtInPools, titleConstraints); - pnlPrefs.add(new NoteLabel("Generates cards with random art in generated limited mode card pools."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlRandomArtInPools")), descriptionConstraints); pnlPrefs.add(cbUiForTouchScreen, titleConstraints); - pnlPrefs.add(new NoteLabel("Increases some UI elements to provide a better experience on touchscreen devices. (Needs restart)"), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlUiForTouchScreen")), descriptionConstraints); pnlPrefs.add(cbCompactPrompt, titleConstraints); - pnlPrefs.add(new NoteLabel("Hide header and use smaller font in Prompt pane to make it more compact."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlCompactPrompt")), descriptionConstraints); /*pnlPrefs.add(cbStackCardView, titleConstraints); TODO: Show this checkbox when setting can support being enabled pnlPrefs.add(new NoteLabel("Show cards and abilities on Stack in card view rather than list view."), descriptionConstraints);*/ pnlPrefs.add(cbHideReminderText, titleConstraints); - pnlPrefs.add(new NoteLabel("Hide reminder text in Card Detail pane."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlHideReminderText")), descriptionConstraints); pnlPrefs.add(cbOpenPacksIndiv, titleConstraints); - pnlPrefs.add(new NoteLabel("When opening Fat Packs and Booster Boxes, booster packs will be opened and displayed one at a time."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlOpenPacksIndiv")), descriptionConstraints); pnlPrefs.add(cbTokensInSeparateRow, titleConstraints); - pnlPrefs.add(new NoteLabel("Displays tokens in a separate row on the battlefield below the non-token creatures."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlTokensInSeparateRow")), descriptionConstraints); pnlPrefs.add(cbStackCreatures, titleConstraints); - pnlPrefs.add(new NoteLabel("Stacks identical creatures on the battlefield like lands, artifacts, and enchantments."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlStackCreatures")), descriptionConstraints); pnlPrefs.add(cbTimedTargOverlay, titleConstraints); - pnlPrefs.add(new NoteLabel("Enables throttling-based optimization of targeting overlay to reduce CPU use (only disable if you experience choppiness on older hardware, requires starting a new match)."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlTimedTargOverlay")), descriptionConstraints); pnlPrefs.add(cbpCounterDisplayType, comboBoxConstraints); - pnlPrefs.add(new NoteLabel("Selects the style of the in-game counter display for cards. Text-based is a new tab-like display on the cards. Image-based is the old counter image. Hybrid displays both at once."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlCounterDisplayType")), descriptionConstraints); pnlPrefs.add(cbpCounterDisplayLocation, comboBoxConstraints); - pnlPrefs.add(new NoteLabel("Determines where to position the text-based counters on the card: close to the top or close to the bottom."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlCounterDisplayLocation")), descriptionConstraints); pnlPrefs.add(cbpDisplayCurrentCardColors, comboBoxConstraints); - pnlPrefs.add(new NoteLabel("Displays the breakdown of the current color of cards in the card detail information panel."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlDisplayCurrentCardColors")), descriptionConstraints); // Sound options - pnlPrefs.add(new SectionLabel("Sound Options"), sectionConstraints + ", gaptop 2%"); + pnlPrefs.add(new SectionLabel(localizer.getMessage("SoundOptions")), sectionConstraints + ", gaptop 2%"); pnlPrefs.add(cbEnableSounds, titleConstraints); - pnlPrefs.add(new NoteLabel("Enable sound effects during the game."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlEnableSounds")), descriptionConstraints); pnlPrefs.add(cbEnableMusic, titleConstraints); - pnlPrefs.add(new NoteLabel("Enable background music during the game."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlEnableMusic")), descriptionConstraints); pnlPrefs.add(cbAltSoundSystem, titleConstraints); - pnlPrefs.add(new NoteLabel("Use the alternate sound system (only use if you have issues with sound not playing or disappearing)."), descriptionConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlAltSoundSystem")), descriptionConstraints); // Keyboard shortcuts - pnlPrefs.add(new SectionLabel("Keyboard Shortcuts"), sectionConstraints); + pnlPrefs.add(new SectionLabel(localizer.getMessage("KeyboardShortcuts")), sectionConstraints); final List shortcuts = KeyboardShortcuts.getKeyboardShortcuts(); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuReleaseNotes.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuReleaseNotes.java index ce5f59a28e3..9d39cbf7d62 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuReleaseNotes.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuReleaseNotes.java @@ -28,7 +28,7 @@ import forge.toolbox.FScrollPane; import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinnedTextArea; import net.miginfocom.swing.MigLayout; - +import forge.util.Localizer; import javax.swing.*; /** @@ -40,10 +40,11 @@ import javax.swing.*; public enum VSubmenuReleaseNotes implements IVSubmenu { SINGLETON_INSTANCE; + final Localizer localizer = Localizer.getInstance(); // Fields used with interface IVDoc private DragCell parentCell; - private final DragTab tab = new DragTab("Release Notes"); + private final DragTab tab = new DragTab(localizer.getMessage("ReleaseNotes")); private final JPanel pnlMain = new JPanel(); private SkinnedTextArea tar; @@ -93,7 +94,7 @@ public enum VSubmenuReleaseNotes implements IVSubmenu { */ @Override public String getMenuTitle() { - return "Release Notes"; + return localizer.getMessage("ReleaseNotes"); } /* (non-Javadoc) diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index e4cb3a17a78..8f888b83d72 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -3,4 +3,164 @@ language.name = English (US) splash.loading.examining-cards = Loading cards, examining folder splash.loading.cards-folders = Loading cards from folders splash.loading.cards-archive = Loading cards from archive -splash.loading.decks = Loading decks... \ No newline at end of file +splash.loading.decks = Loading decks... + +# VSubmenuPreferences.java + +Preferences = Preferences +btnReset = Reset to Default Settings +btnDeleteMatchUI = Reset Match Layout +btnDeleteEditorUI = Reset Editor Layout +btnDeleteWorkshopUI = Reset Workshop Layout +btnUserProfileUI = Open User Directory +btnContentDirectoryUI = Open Content Directory +btnResetJavaFutureCompatibilityWarnings = Reset Java Compatibility Warnings +cbRemoveSmall = Remove Small Creatures +cbCardBased = Include Card-based Deck Generation +cbSingletons = Singleton Mode +cbRemoveArtifacts = Remove Artifacts +cbAnte = Play for Ante +cbAnteMatchRarity = Match Ante Rarity +cbEnableAICheats = Allow AI Cheating +cbManaBurn = Mana Burn +cbManaLostPrompt = Prompt Mana Pool Emptying +cbDevMode = Developer Mode +cbLoadCardsLazily = Load Card Scripts Lazily +cbLoadHistoricFormats = Load Historic Formats +cbWorkshopSyntax = Workshop Syntax Checker +cbEnforceDeckLegality = Deck Conformance +cbPerformanceMode = Performance Mode +cbFilteredHands = Filtered Hands +cbImageFetcher = Automatically Download Missing Card Art +cbCloneImgSource = Clones Use Original Card Art +cbScaleLarger = Scale Image Larger +cbRenderBlackCardBorders = Render Black Card Borders +cbLargeCardViewers = Use Large Card Viewers +cbSmallDeckViewer = Use Small Deck Viewer +cbDisplayFoil = Display Foil Overlay +cbRandomFoil = Random Foil +cbRandomArtInPools = Randomize Card Art in Generated Card Pools +cbEnableSounds = Enable Sounds +cbEnableMusic = Enable Music +cbAltSoundSystem = Use Alternate Sound System +cbUiForTouchScreen = Enhance UI for Touchscreens +cbTimedTargOverlay = Enable Targeting Overlay Optimization +cbCompactMainMenu = Use Compact Main Sidebar Menu +cbDetailedPaymentDesc = Spell Description in Payment Prompt +cbPromptFreeBlocks = Free Block Handling +cbPauseWhileMinimized = Pause While Minimized +cbCompactPrompt = Compact Prompt +cbEscapeEndsTurn = Use Escape Key to End Turn +cbPreselectPrevAbOrder = Preselect Last Order of Abilities +cbHideReminderText = Hide Reminder Text +cbOpenPacksIndiv = Open Packs Individually +cbTokensInSeparateRow = Display Tokens in a Separate Row +cbStackCreatures = Stack Creatures +cbFilterLandsByColorId = Filter Lands by Color in Activated Abilities +cbShowStormCount = Show Storm Count in Prompt Pane +cbRemindOnPriority = Visually Alert on Receipt of Priority +cbUseSentry = Automatically submit bug reports. +cbpGameLogEntryType = Game Log Verbosity +cbpCloseAction = Close Action +cbpDefaultFontSize = Default Font Size +cbpAiProfiles = AI Personality +cbpDisplayCurrentCardColors = Show Detailed Card Color +cbpAutoYieldMode = Auto-Yield +cbpCounterDisplayType = Counter Display Type +cbpCounterDisplayLocation = Counter Display Location +cbpGraveyardOrdering = Allow Ordering Cards Put in Graveyard +Troubleshooting = Troubleshooting +GeneralConfiguration = General Configuration +nlPlayerName = Sets the name that you will be referred to by Forge during gameplay. +nlCompactMainMenu = Enable for a space efficient sidebar that displays only one menu group at a time (RESTART REQUIRED). +nlUseSentry = When enabled, automatically submits bug reports to developers. +GamePlay = Gameplay +nlpAiProfiles = Choose your AI opponent +nlAnte = Determines whether or not the game is played for ante. +nlAnteMatchRarity = Attempts to make antes the same rarity for all players. +nlEnableAICheats = Allow the AI to cheat to gain advantage (for personalities that have cheat shuffling options set). +nlManaBurn = Play with mana burn (from pre-Magic 2010 rules). +nlManaLostPrompt = When enabled, you get a warning if passing priority would cause you to lose mana in your mana pool. +nlEnforceDeckLegality = Enforces deck legality relevant to each environment (minimum deck sizes, max card count etc). +nlPerformanceMode = Disables additional static abilities checks to speed up the game engine. (Warning: breaks some 'as if had flash' scenarios when casting cards owned by opponents). +nlFilteredHands = Generates two starting hands and keeps the one with the closest to average land count for the deck. (Requires restart) +nlCloneImgSource = When enabled clones will use their original art instead of the cloned card's art. +nlPromptFreeBlocks = When enabled, if you would have to pay 0 to block, pay automatically without prompt. +nlPauseWhileMinimized = When enabled, Forge pauses when minimized (primarily for AI vs AI). +nlEscapeEndsTurn = When enabled, Escape key functions as an alternative shortcut to end the current turn. +nlDetailedPaymentDesc = When enabled, detailed spell/ability descriptions are shown when choosing targets and paying costs. +nlShowStormCount = When enabled, displays the current storm count in the prompt pane. +nlRemindOnPriority = When enabled, flashes the player choice area upon receiving priority. +nlPreselectPrevAbOrder = When enabled, preselects the last defined simultaneous ability order in the ordering dialog. +nlpGraveyardOrdering = Determines when to let the player choose the order of cards simultaneously put in graveyard (never, always, or only when playing with cards for which it matters, for example, Volrath's Shapeshifter). +nlpAutoYieldMode = Defines the granularity level of auto-yields (per unique ability or per unique card). +RandomDeckGeneration = Random Deck Generation +nlRemoveSmall = Disables 1/1 and 0/X creatures in generated decks +nlSingletons = Disables non-land duplicates in generated decks +nlRemoveArtifacts = Disables artifact cards in generated decks +nlCardBased = Builds more synergistic random decks (requires restart) +DeckEditorOptions = Deck Editor Options +nlFilterLandsByColorId = When using card color filters, filter lands in a way to make it easier to find relevant mana producing lands. +AdvancedSettings = Advanced Settings +nlDevMode = Enables menu with functions for testing during development. +nlWorkshopSyntax = Enables syntax checking of card scripts in the Workshop. Note: functionality still in testing phase! +nlGameLogEntryType = Changes how much information is displayed in the game log. Sorted by least to most verbose. +nlCloseAction = Changes what happens when clicking the X button in the upper right. +nlLoadCardsLazily = If turned on, Forge will load card scripts as they're needed instead of at start up. (Warning: Experimental) +nlLoadHistoricFormats = If turned on, Forge will load all historic format definitions, this may take slightly longer to load at startup. +GraphicOptions = Graphic Options +nlDefaultFontSize = The default font size within the UI. All font elements are scaled relative to this. (Needs restart) +nlImageFetcher = Enables live fetching of missing card images from an online resource. +nlDisplayFoil = Displays foil cards with the visual foil overlay effect. +nlRandomFoil = Adds foil effect to random cards. +nlScaleLarger = Allows card pictures to be expanded larger than their original size. +nlRenderBlackCardBorders = Render black borders around card images. +nlLargeCardViewers = Makes all card viewers much larger for use with high resolution images. Will not fit on smaller screens. +nlSmallDeckViewer = Sets the deck viewer window to be 800x600 rather than a proportion of the screen size. +nlRandomArtInPools = Generates cards with random art in generated limited mode card pools. +nlUiForTouchScreen = Increases some UI elements to provide a better experience on touchscreen devices. (Needs restart) +nlCompactPrompt = Hide header and use smaller font in Prompt pane to make it more compact. +nlHideReminderText = Hide reminder text in Card Detail pane. +nlOpenPacksIndiv = When opening Fat Packs and Booster Boxes, booster packs will be opened and displayed one at a time. +nlTokensInSeparateRow = Displays tokens in a separate row on the battlefield below the non-token creatures. +nlStackCreatures = Stacks identical creatures on the battlefield like lands, artifacts, and enchantments. +nlTimedTargOverlay = Enables throttling-based optimization of targeting overlay to reduce CPU use (only disable if you experience choppiness on older hardware, requires starting a new match). +nlCounterDisplayType = Selects the style of the in-game counter display for cards. Text-based is a new tab-like display on the cards. Image-based is the old counter image. Hybrid displays both at once. +nlCounterDisplayLocation = Determines where to position the text-based counters on the card: close to the top or close to the bottom. +nlDisplayCurrentCardColors = Displays the breakdown of the current color of cards in the card detail information panel. +SoundOptions = Sound Options +nlEnableSounds = Enable sound effects during the game +nlEnableMusic = Enable background music during the game +nlAltSoundSystem = Use the alternate sound system (only use if you have issues with sound not playing or disappearing) +KeyboardShortcuts = Keyboard Shortcuts + +# VSubmenuAchievements.java + +Achievements = Achievements + +# VSubmenuDownloaders.java + +btnDownloadSetPics = Download LQ Set Pictures +btnDownloadPics = Download LQ Card Pictures +btnDownloadQuestImages = Download Quest Images +btnDownloadAchievementImages = Download Achievement Images +btnReportBug =Report a Bug +btnImportPictures = Import Data +btnHowToPlay = How To Play +btnDownloadPrices = Download Card Prices +btnLicensing = License Details +lblDownloadPics = Download default card picture for each card. +lblDownloadSetPics = Download all pictures of each card (one for each set the card appeared in) +lblDownloadQuestImages = Download tokens and icons used in Quest mode. +lblDownloadAchievementImages = Download achievement images to really make your trophies stand out. +lblDownloadPrices = Download up-to-date price list for in-game card shops. +lblYourVersionOfJavaIsTooOld = Your version of Java is too old to use the content downloaders. +lblPleaseUpdateToTheLatestVersionOfJava = Please update to the latest version of Java +lblYoureRunning = You're running +lblYouNeedAtLeastJavaVersion = You need at least version 1.8.0_101. +lblImportPictures = Import data from a local directory. +lblReportBug = Something broken? +lblHowToPlay = Rules of the Game. +lblLicensing = Forge legal. +ContentDownloaders = Content Downloaders +ReleaseNotes = Release Notes \ No newline at end of file From 3071f1f74be200c9cec0fec8f6319b8423f1dcb2 Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Tue, 8 Jan 2019 20:54:44 +0000 Subject: [PATCH 603/901] First batch of easy forgescribe cleanups with editions file --- .../upcoming/angelic_exaltation.txt | 7 + .../cardsfolder/upcoming/archway_angel.txt | 10 ++ .../cardsfolder/upcoming/azorius_locket.txt | 9 ++ .../upcoming/bankrupt_in_blood.txt | 5 + .../upcoming/basilica_bell_haunt.txt | 8 ++ .../res/cardsfolder/upcoming/bedevil.txt | 5 + .../cardsfolder/upcoming/biogenic_upgrade.txt | 6 + .../cardsfolder/upcoming/blade_juggler.txt | 9 ++ .../upcoming/bolrac_clan_crusher.txt | 7 + .../res/cardsfolder/upcoming/burn_bright.txt | 5 + .../upcoming/burning_tree_vandal.txt | 10 ++ .../upcoming/combine_guildmage.txt | 11 ++ .../cardsfolder/upcoming/cult_guildmage.txt | 7 + .../res/cardsfolder/upcoming/drill_bit.txt | 6 + .../cardsfolder/upcoming/electrodominance.txt | 6 + .../cardsfolder/upcoming/emergency_powers.txt | 8 ++ .../upcoming/end_raze_forerunners.txt | 10 ++ .../cardsfolder/upcoming/frilled_mystic.txt | 8 ++ .../cardsfolder/upcoming/gate_colossus.txt | 12 ++ .../cardsfolder/upcoming/grasping_thrull.txt | 9 ++ .../upcoming/gruul_beastmaster.txt | 9 ++ .../res/cardsfolder/upcoming/gruul_locket.txt | 9 ++ .../res/cardsfolder/upcoming/hackrobat.txt | 8 ++ .../res/cardsfolder/upcoming/high_alert.txt | 8 ++ .../res/cardsfolder/upcoming/humongulus.txt | 6 + .../cardsfolder/upcoming/hydroid_krasis.txt | 13 ++ .../upcoming/immolation_shaman.txt | 8 ++ .../upcoming/judith_the_scourge_diva.txt | 9 ++ .../upcoming/mass_manipulation.txt | 8 ++ .../upcoming/ministrant_of_obligation.txt | 6 + .../upcoming/nikya_of_the_old_ways.txt | 8 ++ .../cardsfolder/upcoming/orzhov_locket.txt | 9 ++ .../upcoming/orzhov_racketeers.txt | 8 ++ .../cardsfolder/upcoming/pestilent_spirit.txt | 9 ++ .../cardsfolder/upcoming/pitiless_pontiff.txt | 6 + .../upcoming/prime_speaker_vannifar.txt | 7 + forge-gui/res/cardsfolder/upcoming/quench.txt | 5 + .../upcoming/rakdos_firewheeler.txt | 8 ++ .../cardsfolder/upcoming/rakdos_locket.txt | 9 ++ .../upcoming/rakdos_roustabout.txt | 8 ++ .../upcoming/rampage_of_the_clans.txt | 8 ++ .../upcoming/rhythm_of_the_wild.txt | 7 + .../cardsfolder/upcoming/sauroform_hybrid.txt | 7 + .../res/cardsfolder/upcoming/savage_smash.txt | 6 + .../upcoming/seraph_of_the_scales.txt | 9 ++ .../upcoming/silhana_wayfinder.txt | 6 + .../res/cardsfolder/upcoming/simic_locket.txt | 9 ++ .../upcoming/skarrgan_hellkite.txt | 8 ++ .../cardsfolder/upcoming/skatewing_spy.txt | 9 ++ .../cardsfolder/upcoming/smelt_ward_ignus.txt | 6 + .../cardsfolder/upcoming/spawn_of_mayhem.txt | 12 ++ .../upcoming/sphinx_of_foresight.txt | 11 ++ .../upcoming/sphinx_of_new_prahv.txt | 8 ++ .../upcoming/syndicate_guildmage.txt | 7 + .../upcoming/the_haunt_of_hightower.txt | 12 ++ .../upcoming/trollbred_guardian.txt | 9 ++ .../upcoming/wilderness_reclamation.txt | 6 + .../cardsfolder/upcoming/zhur_taa_goblin.txt | 6 + forge-gui/res/editions/Ravnica Allegiance.txt | 123 ++++++++++++++++++ 59 files changed, 588 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/angelic_exaltation.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/archway_angel.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/azorius_locket.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/bankrupt_in_blood.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/basilica_bell_haunt.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/bedevil.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/biogenic_upgrade.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/blade_juggler.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/bolrac_clan_crusher.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/burn_bright.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/burning_tree_vandal.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/combine_guildmage.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/cult_guildmage.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/drill_bit.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/electrodominance.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/emergency_powers.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/end_raze_forerunners.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/frilled_mystic.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/gate_colossus.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/grasping_thrull.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/gruul_beastmaster.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/gruul_locket.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/hackrobat.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/high_alert.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/humongulus.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/hydroid_krasis.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/immolation_shaman.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/judith_the_scourge_diva.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/mass_manipulation.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/ministrant_of_obligation.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/nikya_of_the_old_ways.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/orzhov_locket.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/orzhov_racketeers.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/pestilent_spirit.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/pitiless_pontiff.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/prime_speaker_vannifar.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/quench.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/rakdos_firewheeler.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/rakdos_locket.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/rakdos_roustabout.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/rampage_of_the_clans.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/rhythm_of_the_wild.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/sauroform_hybrid.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/savage_smash.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/seraph_of_the_scales.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/silhana_wayfinder.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/simic_locket.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/skarrgan_hellkite.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/skatewing_spy.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/smelt_ward_ignus.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/spawn_of_mayhem.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/sphinx_of_foresight.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/sphinx_of_new_prahv.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/syndicate_guildmage.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/the_haunt_of_hightower.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/trollbred_guardian.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/wilderness_reclamation.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/zhur_taa_goblin.txt create mode 100644 forge-gui/res/editions/Ravnica Allegiance.txt diff --git a/forge-gui/res/cardsfolder/upcoming/angelic_exaltation.txt b/forge-gui/res/cardsfolder/upcoming/angelic_exaltation.txt new file mode 100644 index 00000000000..8cdeda9c678 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/angelic_exaltation.txt @@ -0,0 +1,7 @@ +Name:Angelic Exaltation +ManaCost:3 W +Types:Enchantment +T:Mode$ Attacks | ValidCard$ Creature.YouCtrl | Alone$ True | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a creature you control attacks alone, it gets +X/+X until end of turn, where X is the number of creatures you control. +SVar:TrigPump:DB$ Pump | Defined$ TriggeredAttacker | NumAtt$ +X | NumDef$ +X | References$ X +SVar:X:Count$Valid Creature.YouCtrl +Oracle:Whenever a creature you control attacks alone, it gets +X/+X until end of turn, where X is the number of creatures you control. diff --git a/forge-gui/res/cardsfolder/upcoming/archway_angel.txt b/forge-gui/res/cardsfolder/upcoming/archway_angel.txt new file mode 100644 index 00000000000..5ce99821634 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/archway_angel.txt @@ -0,0 +1,10 @@ +Name:Archway Angel +ManaCost:5 W +Types:Creature Angel +PT:3/4 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 2 life for each Gate you control. +SVar:TrigGainLife:DB$GainLife | LifeAmount$ X | References$ X +SVar:X:Count$Valid Gate.YouCtrl/Times.2 +DeckHints:Type$Gate +Oracle:Flying\nWhen Archway Angel enters the battlefield, you gain 2 life for each Gate you control. diff --git a/forge-gui/res/cardsfolder/upcoming/azorius_locket.txt b/forge-gui/res/cardsfolder/upcoming/azorius_locket.txt new file mode 100644 index 00000000000..4ceff1c9c30 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/azorius_locket.txt @@ -0,0 +1,9 @@ +Name:Azorius Locket +ManaCost:3 +Types:Artifact +A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. +A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. +SVar:RemRandomDeck:True +DeckNeeds:Color$White | Blue +A:AB$ Draw | Cost$ WU WU WU WU T Sac<1/CARDNAME> | NumCards$ 2 | SpellDescription$ Draw two cards. +Oracle:{T}: Add {W} or {U}.\n{W/U}{W/U}{W/U}{W/U}, {T}, Sacrifice Azorius Locket: Draw two cards. diff --git a/forge-gui/res/cardsfolder/upcoming/bankrupt_in_blood.txt b/forge-gui/res/cardsfolder/upcoming/bankrupt_in_blood.txt new file mode 100644 index 00000000000..030fc39d010 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/bankrupt_in_blood.txt @@ -0,0 +1,5 @@ +Name:Bankrupt in Blood +ManaCost:1 B +Types:Sorcery +A:SP$ Draw | Cost$ 1 B Sac<2/Creature> | NumCards$ 3 | SpellDescription$ Draw three cards. +Oracle:As an additional cost to cast this spell, sacrifice two creatures.\nDraw three cards. diff --git a/forge-gui/res/cardsfolder/upcoming/basilica_bell_haunt.txt b/forge-gui/res/cardsfolder/upcoming/basilica_bell_haunt.txt new file mode 100644 index 00000000000..17d0b98bd48 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/basilica_bell_haunt.txt @@ -0,0 +1,8 @@ +Name:Basilica Bell-Haunt +ManaCost:W W B B +Types:Creature Spirit +PT:3/4 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, each opponent discards a card and you gain 3 life. +SVar:TrigDiscard:DB$ Discard | Defined$ Player.Opponent | NumCards$ 1 | Mode$ TgtChoose | SubAbility$ GainLife +SVar:GainLife:DB$ GainLife | Defined$ You | LifeAmount$ 3 +Oracle:When Basilica Bell-Haunt enters the battlefield, each opponent discards a card and you gain 3 life. diff --git a/forge-gui/res/cardsfolder/upcoming/bedevil.txt b/forge-gui/res/cardsfolder/upcoming/bedevil.txt new file mode 100644 index 00000000000..8f4d522da65 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/bedevil.txt @@ -0,0 +1,5 @@ +Name:Bedevil +ManaCost:B B R +Types:Instant +A:SP$ Destroy | Cost$ B B R | ValidTgts$ Artifact,Creature,Planeswalker | TgtPrompt$ Select target artifact, creature or planeswalker | SpellDescription$ Destroy target artifact, creature or planeswalker. +Oracle:Destroy target artifact, creature, or planeswalker. diff --git a/forge-gui/res/cardsfolder/upcoming/biogenic_upgrade.txt b/forge-gui/res/cardsfolder/upcoming/biogenic_upgrade.txt new file mode 100644 index 00000000000..114b2864bfd --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/biogenic_upgrade.txt @@ -0,0 +1,6 @@ +Name:Biogenic Upgrade +ManaCost:4 G G +Types:Sorcery +A:SP$ PutCounter | Cost$ 4 G G | ValidTgts$ Creature | TgtPrompt$ Select target creature to distribute counters to | CounterType$ P1P1 | CounterNum$ 3 | TargetMin$ 1 | TargetMax$ 3 | DividedAsYouChoose$ 3 | SubAbility$ DBPump | SpellDescription$ Distribute three +1/+1 counters among one, two, or three target creatures, then double the number of +1/+1 counters on each of those creatures. +SVar:DBPump:DB$ MultiplyCounter | Defined$ Targeted | CounterType$ P1P1 +Oracle:Distribute three +1/+1 counters among one, two, or three target creatures, then double the number of +1/+1 counters on each of those creatures. diff --git a/forge-gui/res/cardsfolder/upcoming/blade_juggler.txt b/forge-gui/res/cardsfolder/upcoming/blade_juggler.txt new file mode 100644 index 00000000000..9bfac79a21a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/blade_juggler.txt @@ -0,0 +1,9 @@ +Name:Blade Juggler +ManaCost:4 B +Types:Creature Human Rogue +PT:3/2 +K:Spectacle:2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 1 damage to you and you draw a card. +SVar:TrigDealDamage:DB$DealDamage | Defined$ You | NumDmg$ 1 | SubAbility$ DBDraw +SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 1 +Oracle:Spectacle {2}{B} (You may cast this spell for its spectacle cost rather than its mana cost if an opponent lost life this turn.)\nWhen Blade Juggler enters the battlefield, it deals 1 damage to you and you draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/bolrac_clan_crusher.txt b/forge-gui/res/cardsfolder/upcoming/bolrac_clan_crusher.txt new file mode 100644 index 00000000000..796fe4582e3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/bolrac_clan_crusher.txt @@ -0,0 +1,7 @@ +Name:Bolrac-Clan Crusher +ManaCost:3 R G +Types:Creature Ogre Warrior +PT:4/4 +A:AB$ DealDamage | Cost$ T SubCounter<1/P1P1/Creature.YouCtrl/a creature you control> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to any target. +SVar:RemRandomDeck:True +Oracle:{T}, Remove a +1/+1 counter from a creature you control: Bolrac-Clan Crusher deals 2 damage to any target. diff --git a/forge-gui/res/cardsfolder/upcoming/burn_bright.txt b/forge-gui/res/cardsfolder/upcoming/burn_bright.txt new file mode 100644 index 00000000000..e49042989ef --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/burn_bright.txt @@ -0,0 +1,5 @@ +Name:Burn Bright +ManaCost:2 R +Types:Instant +A:SP$ PumpAll | Cost$ 2 R | ValidCards$ Creature.YouCtrl | NumAtt$ +2 | SpellDescription$ Creatures you control get +2/+0 until end of turn. +Oracle:Creatures you control get +2/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/burning_tree_vandal.txt b/forge-gui/res/cardsfolder/upcoming/burning_tree_vandal.txt new file mode 100644 index 00000000000..9220bc36cf7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/burning_tree_vandal.txt @@ -0,0 +1,10 @@ +Name:Burning-Tree Vandal +ManaCost:2 R +Types:Creature Human Rogue +PT:2/1 +K:Riot +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ Whenever CARDNAME attacks, you may discard a card. If you do, draw a card. +SVar:TrigDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | RememberDiscarded$ True | Optional$ True | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +Oracle:Riot (This creature enters the battlefield with your choice of a +1/+ counter or haste.)\nWhenever Burning-Tree Vandal attacks, you may discard a card. If you do, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/combine_guildmage.txt b/forge-gui/res/cardsfolder/upcoming/combine_guildmage.txt new file mode 100644 index 00000000000..6479aed1ef4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/combine_guildmage.txt @@ -0,0 +1,11 @@ +Name:Combine Guildmage +ManaCost:G U +Types:Creature Merfolk Wizard +PT:2/2 +A:AB$ Effect | Cost$ 1 G T | Name$ CARDNAME Effect | ReplacementEffects$ ExtraETBCounter | SVars$ AddExtraCounter,MoveToBattlefield | SpellDescription$ This turn, each creature you control enters the battlefield with an additional +1/+1 counter on it. +SVar:ExtraETBCounter:Event$ Moved | ActiveZones$ Command | Destination$ Battlefield | ValidCard$ Creature.YouCtrl+Other | ReplaceWith$ AddExtraCounter | Description$ This turn, each creature you control enters the battlefield with an additional +1/+1 counter on it. +SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ MoveToBattlefield +SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard +A:AB$ MoveCounter | Cost$ 1 U T | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | SubAbility$ DBMove | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Move a +1/+1 counter from target creature you control onto another target creature you control. +SVar:DBMove:DB$ MoveCounter | Source$ Targeted.Other+YouCtrl | ValidTgts$ Creature.YouCtrl+Other | TgtPrompt$ Select target creature you control to get +1/+1 counter. +Oracle:{1}{G}, {T}: This turn, each creature you control enters the battlefield with an additional +1/+1 counter on it.\n{1}{U}, {T}: Move a +1/+1 counter from target creature you control onto another target creature you control. diff --git a/forge-gui/res/cardsfolder/upcoming/cult_guildmage.txt b/forge-gui/res/cardsfolder/upcoming/cult_guildmage.txt new file mode 100644 index 00000000000..3513cc3dbf5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/cult_guildmage.txt @@ -0,0 +1,7 @@ +Name:Cult Guildmage +ManaCost:B R +Types:Creature Human Shaman +PT:2/2 +A:AB$ Discard | Cost$ 3 B T | ValidTgts$ Player | SorcerySpeed$ True | NumCards$ 1 | Mode$ TgtChoose | SpellDescription$ Target player discards a card. Activate this ability only any time you could cast a sorcery. +A:AB$ DealDamage | Cost$ R T | ValidTgts$ Opponent,Planeswalker | TgtPrompt$ Select target opponent or planeswalker | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target opponent or planeswalker. +Oracle:{3}{B}, {T}: Target player discards a card. Activate this ability only any time you could cast a sorcery.\n{R}, {T}: Cult Guildmage deals 1 damage to target opponent or planeswalker. diff --git a/forge-gui/res/cardsfolder/upcoming/drill_bit.txt b/forge-gui/res/cardsfolder/upcoming/drill_bit.txt new file mode 100644 index 00000000000..682c6420eea --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/drill_bit.txt @@ -0,0 +1,6 @@ +Name:Drill Bit +ManaCost:2 B +Types:Sorcery +K:Spectacle:B +A:SP$ Discard | Cost$ 2 B | ValidTgts$ Player | Mode$ RevealYouChoose | DiscardValid$ Card.nonLand | NumCards$ 1 | SpellDescription$ Target player reveals their hand. You choose a nonland card from it. That player discards that card. +Oracle:Spectacle {B} (You may cast this spell for its spectacle cost rather than its mana cost if an opponent lost life this turn.)\nTarget player reveals their hand. You choose a nonland card from it. That player discards that card. diff --git a/forge-gui/res/cardsfolder/upcoming/electrodominance.txt b/forge-gui/res/cardsfolder/upcoming/electrodominance.txt new file mode 100644 index 00000000000..096d0f2db46 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/electrodominance.txt @@ -0,0 +1,6 @@ +Name:Electrodominance +ManaCost:X R R +Types:Instant +A:SP$ DealDamage | Cost$ X R R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X | SubAbility$ DBPlay | SpellDescription$ CARDNAME deals X damage to any target. You may cast a card with converted mana cost X or less from your hand without paying its mana cost. +SVar:DBPlay:DB$ Play | Valid$ Targeted.cmcLEX+YouCtrl | ValidZone$ Hand | WithoutManaCost$ True | Amount$ 1 | Controller$ You | Optional$ True | References$ X +Oracle:Electrodominance deals X damage to any target. You may cast a card with converted mana cost X or less from your hand without paying its mana cost. diff --git a/forge-gui/res/cardsfolder/upcoming/emergency_powers.txt b/forge-gui/res/cardsfolder/upcoming/emergency_powers.txt new file mode 100644 index 00000000000..81b977e44f4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/emergency_powers.txt @@ -0,0 +1,8 @@ +Name:Emergency Powers +ManaCost:5 W U +Types:Instant +A:SP$ ChangeZoneAll | Cost$ 5 W 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 hand into their library, then draws seven cards. Exile CARDNAME. +SVar:DBDraw:DB$ Draw | NumCards$ 7 | Defined$ Player | SubAbility$ DBChange +SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile | SubAbility$ DBAddendum +SVar:DBAddendum:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | ChangeType$ Permanent.cmcLE7+YouCtrl | SubAbility$ DBPump | RememberChanged$ True | ChangeNum$ 1 | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SpellDescription$ Addendum - If you cast this spell during your main phase, you may put a permanent card with converted mana cost 7 or less from your hand onto the battlefield. +Oracle:Each player shuffles their hand and graveyard into their library, then draws seven cards. Exile Emergency Powers.\nAddendum — If you cast this spell during your main phase, you may put a permanent card with converted mana cost 7 or less from your hand onto the battlefield. diff --git a/forge-gui/res/cardsfolder/upcoming/end_raze_forerunners.txt b/forge-gui/res/cardsfolder/upcoming/end_raze_forerunners.txt new file mode 100644 index 00000000000..91d191b5729 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/end_raze_forerunners.txt @@ -0,0 +1,10 @@ +Name:End-Raze Forerunners +ManaCost:5 G G G +Types:Creature Boar +PT:7/7 +K:Vigilance +K:Trample +K:Haste +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ When CARDNAME enters the battlefield, other creatures you control get +2/+2 and gain vigilance and trample until end of turn. +SVar:TrigPumpAll:DB$PumpAll | ValidCards$ Creature.Other+YouCtrl | NumAtt$ +2 | NumDef$ +2 | KW$ Vigilance & Trample +Oracle:Vigilance, trample, haste\nWhen End-Raze Forerunners enters the battlefield, other creatures you control get +2/+2 and gain vigilance and trample until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/frilled_mystic.txt b/forge-gui/res/cardsfolder/upcoming/frilled_mystic.txt new file mode 100644 index 00000000000..6c028a2ae77 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/frilled_mystic.txt @@ -0,0 +1,8 @@ +Name:Frilled Mystic +ManaCost:G G U U +Types:Creature Elf Lizard Wizard +PT:3/2 +K:Flash +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigCounter | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may counter target spell. +SVar:TrigCounter:DB$ Counter | TargetType$ Spell | ValidTgts$ Card | TgtPrompt$ Select target spell +Oracle:Flash\nWhen Frilled Mystic enters the battlefield, you may counter target spell. diff --git a/forge-gui/res/cardsfolder/upcoming/gate_colossus.txt b/forge-gui/res/cardsfolder/upcoming/gate_colossus.txt new file mode 100644 index 00000000000..57c7144c16e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/gate_colossus.txt @@ -0,0 +1,12 @@ +Name:Gate Colossus +ManaCost:8 +Types:Artifact Creature Construct +PT:8/8 +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each Gate you control. +SVar:X:Count$Valid Gate.YouCtrl +DeckNeeds:Type$Gate +K:CantBeBlockedBy Creature.powerLE2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Gate.YouCtrl | OptionalDecider$ You | TriggerZones$ Graveyard | Execute$ TrigChange | TriggerDescription$ Whenever a Gate enters the battlefield under your control, you may put CARDNAME from your graveyard on top of your library. +SVar:TrigChange:DB$ChangeZone | Origin$ Graveyard | Destination$ Library | Defined$ Self +DeckHints:Type$Gate +Oracle:This spell costs {1} less to cast for each Gate you control.\nGate Colossus can't be blocked by creatures with power 2 or less.\nWhenever a Gate enters the battlefield under your control, you may put Gate Colossus from your graveyard on top of your library. diff --git a/forge-gui/res/cardsfolder/upcoming/grasping_thrull.txt b/forge-gui/res/cardsfolder/upcoming/grasping_thrull.txt new file mode 100644 index 00000000000..6e913fe3644 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/grasping_thrull.txt @@ -0,0 +1,9 @@ +Name:Grasping Thrull +ManaCost:3 W B +Types:Creature Thrull +PT:3/3 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 2 damage to each opponent and you gain 2 life. +SVar:TrigDealDamage:DB$ DamageAll | ValidPlayers$ Player.Opponent | NumDmg$ 2 | SubAbility$ DBGainLife +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 +Oracle:Flying\nWhen Grasping Thrull enters the battlefield, it deals 2 damage to each opponent and you gain 2 life. diff --git a/forge-gui/res/cardsfolder/upcoming/gruul_beastmaster.txt b/forge-gui/res/cardsfolder/upcoming/gruul_beastmaster.txt new file mode 100644 index 00000000000..5f6eaa8441c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/gruul_beastmaster.txt @@ -0,0 +1,9 @@ +Name:Gruul Beastmaster +ManaCost:3 G +Types:Creature Human Shaman +PT:2/2 +K:Riot +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, another target creature you control gets +X/+0 until end of turn, where X is CARDNAME's power. +SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.YouCtrl+Other | TgtPrompt$ Select another target creature you control | NumAtt$ X | References$ X +SVar:X:Count$CardPower +Oracle:Riot (This creature enters the battlefield with your choice of a +1/+1 counter or haste.)\nWhenever Gruul Beastmaster attacks, another target creature you control gets +X/+0 until end of turn, where X is Gruul Beastmaster's power. diff --git a/forge-gui/res/cardsfolder/upcoming/gruul_locket.txt b/forge-gui/res/cardsfolder/upcoming/gruul_locket.txt new file mode 100644 index 00000000000..44014b16fa2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/gruul_locket.txt @@ -0,0 +1,9 @@ +Name:Gruul Locket +ManaCost:3 +Types:Artifact +A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +SVar:RemRandomDeck:True +DeckNeeds:Color$Red | Green +A:AB$ Draw | Cost$ RG RG RG RG T Sac<1/CARDNAME> | NumCards$ 2 | SpellDescription$ Draw two cards. +Oracle:{T}: Add {R} or {G}.\n{R/G}{R/G}{R/G}{R/G}, {T}, Sacrifice Gruul Locket: Draw two cards. diff --git a/forge-gui/res/cardsfolder/upcoming/hackrobat.txt b/forge-gui/res/cardsfolder/upcoming/hackrobat.txt new file mode 100644 index 00000000000..6e0bd95b99d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/hackrobat.txt @@ -0,0 +1,8 @@ +Name:Hackrobat +ManaCost:1 B R +Types:Creature Human Rogue +PT:2/3 +K:Spectacle B R +A:AB$ Pump | Cost$ B | Defined$ Self | KW$ Deathtouch | SpellDescription$ CARDNAME gains deathtouch until end of turn. +A:AB$ Pump | Cost$ R | NumAtt$ +2 | NumDef$ -2 | SpellDescription$ CARDNAME gets +2/-2 until end of turn. +Oracle:Spectacle {B}{R} (You may cast this spell for its spectacle cost rather than its mana cost if an opponent lost life this turn.)\n{B}: Hackrobat gains deathtouch until end of turn.\n{R}: Hackrobat gets +2/-2 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/high_alert.txt b/forge-gui/res/cardsfolder/upcoming/high_alert.txt new file mode 100644 index 00000000000..0b2e87eb1c2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/high_alert.txt @@ -0,0 +1,8 @@ +Name:High Alert +ManaCost:1 W U +Types:Enchantment +S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddHiddenKeyword$ CARDNAME assigns combat damage equal to its toughness rather than its power | Description$ Each creature you control assigns combat damage equal to its toughness rather than its power. +S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddHiddenKeyword$ CARDNAME can attack as though it didn't have defender. | Description$ Creatures you control can attack as though they didn't have defender. +SVar:PlayMain1:TRUE +A:AB$ Untap | Cost$ 2 W U | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Untap target creature. +Oracle:Each creature you control assigns combat damage equal to its toughness rather than its power.\nCreatures you control can attack as though they didn't have defender.\n{2}{W}{U}: Untap target creature. diff --git a/forge-gui/res/cardsfolder/upcoming/humongulus.txt b/forge-gui/res/cardsfolder/upcoming/humongulus.txt new file mode 100644 index 00000000000..912abbc2112 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/humongulus.txt @@ -0,0 +1,6 @@ +Name:Humongulus +ManaCost:4 U +Types:Creature Homunculus +PT:2/5 +K:Hexproof +Oracle:Hexproof (This creature can't be the target of spells or abilities your opponents control.) diff --git a/forge-gui/res/cardsfolder/upcoming/hydroid_krasis.txt b/forge-gui/res/cardsfolder/upcoming/hydroid_krasis.txt new file mode 100644 index 00000000000..390597eb9c5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/hydroid_krasis.txt @@ -0,0 +1,13 @@ +Name:Hydroid Krasis +ManaCost:X G U +Types:Creature Jellyfish Hydra Beast +PT:0/0 +T:Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When you cast CARDNAME, you gain half X life and draw half X cards. Round down each time. +SVar:TrigGainLife:DB$GainLife | Defined$ You | LifeAmount$ HalfXDown | SubAbility$ DBDraw | References$ HalfXDown +SVar:DBDraw:DB$Draw | NumCards$ HalfXDown | References$ HalfXDown +K:Flying +K:Trample +K:etbCounter:P1P1:X +SVar:X:Count$xPaid +SVar:HalfXDown:Count$xPaid/HalfDown +Oracle:When you cast this spell, you gain half X life and draw half X cards. Round down each time.\nFlying, trample\nHydroid Krasis enters the battlefield with X +1/+1 counters on it. diff --git a/forge-gui/res/cardsfolder/upcoming/immolation_shaman.txt b/forge-gui/res/cardsfolder/upcoming/immolation_shaman.txt new file mode 100644 index 00000000000..f823f6e7909 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/immolation_shaman.txt @@ -0,0 +1,8 @@ +Name:Immolation Shaman +ManaCost:1 R +Types:Creature Viashino Shaman +PT:1/3 +T:Mode$ AbilityCast | ValidActivatingPlayer$ Opponent | ValidCard$ Artifact.inZoneBattlefield,Creature.inZoneBattlefield,Land.inZoneBattlefield | TriggerZones$ Battlefield | Execute$ TrigDmg | TriggerDescription$ Whenever an opponent activates an ability of an artifact, creature, or land that isn't a mana ability, CARDNAME deals 1 damage to that player. +SVar:TrigDmg:DB$ DealDamage | NumDmg$ 1 | Defined$ TriggeredActivator +A:AB$ Pump | Cost$ 3 R R | Defined$ Self | NumAtt$ +3 | NumDef$ +3 | KW$ Menace | SpellDescription$ CARDNAME gets +3/+3 and gains menace until end of turn. +Oracle:Whenever an opponent activates an ability of an artifact, creature, or land that isn't a mana ability, Immolation Shaman deals 1 damage to that player.\n{3}{R}{R}: Immolation Shaman gets +3/+3 and gains menace until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/judith_the_scourge_diva.txt b/forge-gui/res/cardsfolder/upcoming/judith_the_scourge_diva.txt new file mode 100644 index 00000000000..4b6137fc97d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/judith_the_scourge_diva.txt @@ -0,0 +1,9 @@ +Name:Judith, the Scourge Diva +ManaCost:1 B R +Types:Legendary Creature Human Shaman +PT:2/2 +S:Mode$ Continuous | Affected$ Creature.Other+YouCtrl | AddPower$ 1 | Description$ Other creatures you control get +1/+0. +SVar:PlayMain1:TRUE +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl+nonToken | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a nontoken creature you control dies, CARDNAME deals 1 damage to any target. +SVar:TrigDamage:DB$DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 +Oracle:Other creatures you control get +1/+0.\nWhenever a nontoken creature you control dies, Judith, the Scourge Diva deals 1 damage to any target. diff --git a/forge-gui/res/cardsfolder/upcoming/mass_manipulation.txt b/forge-gui/res/cardsfolder/upcoming/mass_manipulation.txt new file mode 100644 index 00000000000..a4413d43b32 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mass_manipulation.txt @@ -0,0 +1,8 @@ +Name:Mass Manipulation +ManaCost:X X U U U U +Types:Sorcery +A:SP$ GainControl | Cost$ X X U U U U | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker | TargetMin$ 0 | TargetMax$ MaxTgts | References$ X,MaxTgts | SpellDescription$ Gain control of X target creatures and/or planeswalkers. +SVar:X:Targeted$Amount +SVar:MaxTgts:Count$Valid Creature,Planeswalker +SVar:RemRandomDeck:True +Oracle:Gain control of X target creatures and/or planeswalkers. diff --git a/forge-gui/res/cardsfolder/upcoming/ministrant_of_obligation.txt b/forge-gui/res/cardsfolder/upcoming/ministrant_of_obligation.txt new file mode 100644 index 00000000000..37c661d8fd9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ministrant_of_obligation.txt @@ -0,0 +1,6 @@ +Name:Ministrant of Obligation +ManaCost:2 W +Types:Creature Human Cleric +PT:2/1 +K:Afterlife:2 +Oracle:Afterlife 2 (When this creature dies, create two 1/1 white and black Spirit creature token with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/nikya_of_the_old_ways.txt b/forge-gui/res/cardsfolder/upcoming/nikya_of_the_old_ways.txt new file mode 100644 index 00000000000..99e2fe3d7bd --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/nikya_of_the_old_ways.txt @@ -0,0 +1,8 @@ +Name:Nikya of the Old Ways +ManaCost:3 R G +Types:Legendary Creature Centaur Druid +PT:5/5 +S:Mode$ CantBeCast | ValidCard$ Card.nonCreature | Caster$ You | Description$ You can't cast noncreature spells. +T:Mode$ TapsForMana | ValidCard$ Land.YouCtrl | Execute$ TrigMana | TriggerZones$ Battlefield | Static$ True | TriggerDescription$ Whenever you tap a land for mana, add one mana of any type that land produced. +SVar:TrigMana:DB$ManaReflected | ColorOrType$ Type | Valid$ Defined.Triggered | ReflectProperty$ Produced | Defined$ TriggeredPlayer +Oracle:You can't cast noncreature spells.\nWhenever you tap a land for mana, add one mana of any type that land produced. diff --git a/forge-gui/res/cardsfolder/upcoming/orzhov_locket.txt b/forge-gui/res/cardsfolder/upcoming/orzhov_locket.txt new file mode 100644 index 00000000000..104f61bf20c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/orzhov_locket.txt @@ -0,0 +1,9 @@ +Name:Orzhov Locket +ManaCost:3 +Types:Artifact +A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. +A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. +SVar:RemRandomDeck:True +DeckNeeds:Color$White | Black +A:AB$ Draw | Cost$ WB WB WB WB Sac<1/CARDNAME> | NumCards$ 2 | SpellDescription$ Draw two cards. +Oracle:{T}: Add {W} or {B}.\n{W/B}{W/B}{W/B}{W/B}, {T}, Sacrifice Orzhov Locket: Draw two cards. diff --git a/forge-gui/res/cardsfolder/upcoming/orzhov_racketeers.txt b/forge-gui/res/cardsfolder/upcoming/orzhov_racketeers.txt new file mode 100644 index 00000000000..2a3425bba32 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/orzhov_racketeers.txt @@ -0,0 +1,8 @@ +Name:Orzhov Racketeers +ManaCost:4 B +Types:Creature Human Rogue +PT:3/2 +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigDiscard | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player discards a card. +SVar:TrigDiscard:DB$Discard | Defined$ TriggeredTarget | NumCards$ 1 | Mode$ TgtChoose +K:Afterlife:2 +Oracle:Whenever Orzhov Racketeers deals combat damage to a player, that player discards a card.\nAfterlife 2 (When this creature dies, create two 1/1 white and black Spirit creature tokens with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/pestilent_spirit.txt b/forge-gui/res/cardsfolder/upcoming/pestilent_spirit.txt new file mode 100644 index 00000000000..ba7660bec7e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/pestilent_spirit.txt @@ -0,0 +1,9 @@ +Name:Pestilent Spirit +ManaCost:2 B +Types:Creature Spirit +PT:3/2 +K:Menace +K:Deathtouch +S:Mode$ Continuous | Affected$ Instant.YouCtrl,Sorcery.YouCtrl | AddKeyword$ Deathtouch | Description$ Instant and sorcery spells you control have deathtouch. +SVar:PlayMain1:TRUE +Oracle:Menace, deathtouch\nInstant and sorcery spells you control have deathtouch. (Any amount of damage they deal to a creature is enough to destroy it.) diff --git a/forge-gui/res/cardsfolder/upcoming/pitiless_pontiff.txt b/forge-gui/res/cardsfolder/upcoming/pitiless_pontiff.txt new file mode 100644 index 00000000000..6034e8121d5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/pitiless_pontiff.txt @@ -0,0 +1,6 @@ +Name:Pitiless Pontiff +ManaCost:W B +Types:Creature Vampire Cleric +PT:2/2 +A:AB$ Pump | Cost$ 1 Sac<1/Creature.Other/another creature> | KW$ Deathtouch & Indestructible | SpellDescription$ CARDNAME gains deathtouch and indestructible until end of turn. +Oracle:{1}, Sacrifice another creature: Pitiless Pontiff gains deathtouch and indestructible until end of turn. (Damage and effects that say "destroy" don't destroy it.) diff --git a/forge-gui/res/cardsfolder/upcoming/prime_speaker_vannifar.txt b/forge-gui/res/cardsfolder/upcoming/prime_speaker_vannifar.txt new file mode 100644 index 00000000000..d64c9413ae4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/prime_speaker_vannifar.txt @@ -0,0 +1,7 @@ +Name:Prime Speaker Vannifar +ManaCost:2 G U +Types:Legendary Creature Elf Ooze Wizard +PT:2/4 +A:AB$ ChangeZone | Cost$ T Sac<1/Creature.Other/another creature> | Origin$ Library | Destination$ Battlefield | ChangeType$ Creature.cmcEQX | References$ X | ChangeNum$ 1 | SorcerySpeed$ True | SpellDescription$ Search your library for a creature card with converted mana cost equal to 1 plus the sacrificed creature's converted mana cost, put that card onto the battlefield, then shuffle your library. Activate this ability only any time you could cast a sorcery. +SVar:X:Sacrificed$CardManaCost/Plus.1 +Oracle:{T}, Sacrifice another creature: Search your library for a creature card with converted mana cost equal to 1 plus the sacrificed creature's converted mana cost, put that card onto the battlefield, then shuffle your library. Activate this ability only any time you could cast a sorcery. diff --git a/forge-gui/res/cardsfolder/upcoming/quench.txt b/forge-gui/res/cardsfolder/upcoming/quench.txt new file mode 100644 index 00000000000..7bb7483eb30 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/quench.txt @@ -0,0 +1,5 @@ +Name:Quench +ManaCost:1 U +Types:Instant +A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 2 | SpellDescription$ Counter target spell unless its controller pays {2}. +Oracle:Counter target spell unless its controller pays {2}. diff --git a/forge-gui/res/cardsfolder/upcoming/rakdos_firewheeler.txt b/forge-gui/res/cardsfolder/upcoming/rakdos_firewheeler.txt new file mode 100644 index 00000000000..13bd764dae0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rakdos_firewheeler.txt @@ -0,0 +1,8 @@ +Name:Rakdos Firewheeler +ManaCost:B B R R +Types:Creature Human Rogue +PT:4/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 2 damage to target opponent and 2 damage to up to one target creature or planeswalker. +SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | NumDmg$ 2 | SubAbility$ MoreDamage +SVar:MoreDamage:DB$ DealDamage | ValidTgts$ Creature,Planeswalker | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target creature or planeswalker (2 damage) | NumDmg$ 2 +Oracle:When Rakdos Firewheeler enters the battlefield, it deals 2 damage to target opponent and 2 damage to up to one target creature or planeswalker. diff --git a/forge-gui/res/cardsfolder/upcoming/rakdos_locket.txt b/forge-gui/res/cardsfolder/upcoming/rakdos_locket.txt new file mode 100644 index 00000000000..eefb01b51a4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rakdos_locket.txt @@ -0,0 +1,9 @@ +Name:Rakdos Locket +ManaCost:3 +Types:Artifact +A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. +A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. +SVar:RemRandomDeck:True +DeckNeeds:Color$Black | Red +A:AB$ Draw | Cost$ BR BR BR BR T Sac<1/CARDNAME> | NumCards$ 2 | SpellDescription$ Draw two cards. +Oracle:{T}: Add {B} or {R}.\n{B/R}{B/R}{B/R}{B/R}, {T}, Sacrifice Rakdos Locket: Draw two cards. diff --git a/forge-gui/res/cardsfolder/upcoming/rakdos_roustabout.txt b/forge-gui/res/cardsfolder/upcoming/rakdos_roustabout.txt new file mode 100644 index 00000000000..76c7258206b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rakdos_roustabout.txt @@ -0,0 +1,8 @@ +Name:Rakdos Roustabout +ManaCost:1 B R +Types:Creature Ogre Warrior +PT:3/2 +T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ Whenever CARDNAME becomes blocked, it deals 1 damage to the player or planeswalker it's attacking. +SVar:TrigDealDamage:DB$DealDamage | Defined$ TriggeredDefender | NumDmg$ 1 +SVar:HasAttackEffect:Blocked +Oracle:Whenever Rakdos Roustabout becomes blocked, it deals 1 damage to the player or planeswalker it's attacking. diff --git a/forge-gui/res/cardsfolder/upcoming/rampage_of_the_clans.txt b/forge-gui/res/cardsfolder/upcoming/rampage_of_the_clans.txt new file mode 100644 index 00000000000..779b9968f59 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rampage_of_the_clans.txt @@ -0,0 +1,8 @@ +Name:Rampage of the Clans +ManaCost:3 G +Types:Instant +A:SP$ DestroyAll | Cost$ 3 G | ValidCards$ Artifact,Enchantment | RememberDestroyed$ True | SubAbility$ DBToken | SpellDescription$ Destroy all artifacts and enchantments. For each permanent destroyed this way, its controller creates a 3/3 green Centaur creature token. +SVar:DBToken:DB$ RepeatEach | UseImprinted$ True | DefinedCards$ DirectRemembered | RepeatSubAbility$ TokenBoar | SubAbility$ DBCleanup +SVar:TokenBoar:DB$ Token | TokenAmount$ 1 | TokenName$ Centaur | TokenTypes$ Creature,Centaur | TokenOwner$ ImprintedController | TokenColors$ Green | TokenPower$ 3 | TokenToughness$ 3 | TokenImage$ g 3 3 centaur rna +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ true +Oracle:Destroy all artifacts and enchantments. For each permanent destroyed this way, its controller creates a 3/3 green Centaur creature token. diff --git a/forge-gui/res/cardsfolder/upcoming/rhythm_of_the_wild.txt b/forge-gui/res/cardsfolder/upcoming/rhythm_of_the_wild.txt new file mode 100644 index 00000000000..0a239df820f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rhythm_of_the_wild.txt @@ -0,0 +1,7 @@ +Name:Rhythm of the Wild +ManaCost:1 R G +Types:Enchantment +S:Mode$ Continuous | Affected$ Creature.YouCtrl | AffectedZone$ Stack | AddHiddenKeyword$ CARDNAME can't be countered. | Description$ Creature spells you control can't be countered. +S:Mode$ Continuous | Affected$ Creature.nonToken+YouCtrl | AddKeyword$ Riot| Description$ Nontoken creatures you control have riot. (They enter the battlefield with your choice of a +1/+1 counter or haste.) +SVar:PlayMain1:TRUE +Oracle:Creature spells you control can't be countered.\nNontoken creatures you control have riot. (They enter the battlefield with your choice of a +1/+1 counter or haste.) diff --git a/forge-gui/res/cardsfolder/upcoming/sauroform_hybrid.txt b/forge-gui/res/cardsfolder/upcoming/sauroform_hybrid.txt new file mode 100644 index 00000000000..cef9c51d229 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sauroform_hybrid.txt @@ -0,0 +1,7 @@ +Name:Sauroform Hybrid +ManaCost:1 G +Types:Creature Human Lizard Warrior +PT:2/2 +K:Adapt:4:4 G G +DeckHas:Ability$Counters +Oracle:{4}{G}{G}: Adapt 4. (If this creature has no +1/+1 counters on it, put four +1/+1 counter on it.) diff --git a/forge-gui/res/cardsfolder/upcoming/savage_smash.txt b/forge-gui/res/cardsfolder/upcoming/savage_smash.txt new file mode 100644 index 00000000000..b9cab77e309 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/savage_smash.txt @@ -0,0 +1,6 @@ +Name:Savage Smash +ManaCost:1 R G +Types:Sorcery +A:SP$ Pump | Cost$ 1 R G | ValidTgts$ Creature.YouCtrl | AILogic$ Fight | TgtPrompt$ Select target creature you control | SubAbility$ DBFight | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Target creature you control gets +2/+2 until end of turn. It fights target creature you don't control. +SVar:DBFight:DB$ Fight | Defined$ ParentTarget | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Select target creature you don't control +Oracle:Target creature you control gets +2/+2 until end of turn. It fights target creature you don't control. (Each deals damage equal to its power to the other.) diff --git a/forge-gui/res/cardsfolder/upcoming/seraph_of_the_scales.txt b/forge-gui/res/cardsfolder/upcoming/seraph_of_the_scales.txt new file mode 100644 index 00000000000..1981a8f9eea --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/seraph_of_the_scales.txt @@ -0,0 +1,9 @@ +Name:Seraph of the Scales +ManaCost:2 W B +Types:Creature Angel +PT:4/3 +K:Flying +A:AB$ Pump | Cost$ W | Defined$ Self | KW$ Vigilance | SpellDescription$ CARDNAME gains vigilance until end of turn. +A:AB$ Pump | Cost$ B | Defined$ Self | KW$ Deathtouch | SpellDescription$ CARDNAME gains deathtouch until end of turn. +K:Afterlife:2 +Oracle:Flying\n{W}: Seraph of the Scales gains vigilance until end of turn.\n{B}: Seraph of the Scales gains deathtouch until end of turn.\nAfterlife 2 (When this creature dies, create two 1/1 white and black Spirit creature tokens with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/silhana_wayfinder.txt b/forge-gui/res/cardsfolder/upcoming/silhana_wayfinder.txt new file mode 100644 index 00000000000..8f001dc79ee --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/silhana_wayfinder.txt @@ -0,0 +1,6 @@ +Name:Silhana Wayfinder +ManaCost:1 G +Types:Creature Elf Scout +PT:2/1 +SVar:DBDig:DB$ Dig | DigNum$ 4 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Creature,Land | ForceRevealToController$ True | DestinationZone$ Library | LibraryPosition$ -1 | RestRandomOrder$ True | ForceRevealToController$ True +Oracle:When Silhana Wayfinder enters the battlefield, look at the top four cards of your library. You may reveal a creature or land card from among them and put it on top of your library. Put the rest on the bottom of your library in a random order. diff --git a/forge-gui/res/cardsfolder/upcoming/simic_locket.txt b/forge-gui/res/cardsfolder/upcoming/simic_locket.txt new file mode 100644 index 00000000000..c8662f4f337 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/simic_locket.txt @@ -0,0 +1,9 @@ +Name:Simic Locket +ManaCost:3 +Types:Artifact +A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. +A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. +SVar:RemRandomDeck:True +DeckNeeds:Color$Green | Blue +A:AB$ Draw | Cost$ GU GU GU GU T Sac<1/CARDNAME> | NumCards$ 2 | SpellDescription$ Draw two cards. +Oracle:{T}: Add {G} or {U}.\n{G/U}{G/U}{G/U}{G/U}, {T}, Sacrifice Simic Locket: Draw two cards. diff --git a/forge-gui/res/cardsfolder/upcoming/skarrgan_hellkite.txt b/forge-gui/res/cardsfolder/upcoming/skarrgan_hellkite.txt new file mode 100644 index 00000000000..3c85fdd9c0c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/skarrgan_hellkite.txt @@ -0,0 +1,8 @@ +Name:Skarrgan Hellkite +ManaCost:3 R R +Types:Creature Dragon +PT:4/4 +K:Riot +A:AB$ DealDamage | Cost$ 3 R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target to distribute damage to | NumDmg$ 2 | TargetMin$ 1 | TargetMax$ 2 | DividedAsYouChoose$ 2 | IsPresent$ Card.Self+counters_GE1_P1P1 | SpellDescription$ CARDNAME deals 2 damage divided as you choose among one or two targets. Activate this ability only if CARDNAME has a +1/+1 counter on it. +DeckHints:Ability$Counters +Oracle:Riot (This creature enters the battlefield with your choice of a +1/+1 counter or haste.)\nFlying\n{3}{R}: Skarrgan Hellkite deals 2 damage divided as you choose among one or two targets. Activate this ability only if Skarrgan Hellkite has a +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/upcoming/skatewing_spy.txt b/forge-gui/res/cardsfolder/upcoming/skatewing_spy.txt new file mode 100644 index 00000000000..08cf1827edf --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/skatewing_spy.txt @@ -0,0 +1,9 @@ +Name:Skatewing Spy +ManaCost:3 U +Types:Creature Vedalken Rogue Mutant +PT:2/3 +K:Adapt:2:5 U +DeckHas:Ability$Counters +S:Mode$ Continuous | Affected$ Creature.YouCtrl+counters_GE1_P1P1 | AddKeyword$ Flying | Description$ Each creature you control with a +1/+1 counter on it has flying. +DeckHints:Ability$Counters +Oracle:{5}{U}: Adapt 2. (If this creature has no +1/+1 counters on it, put two +1/+1 counters on it.)\nEach creature you control with a +1/+1 counter on it has flying. diff --git a/forge-gui/res/cardsfolder/upcoming/smelt_ward_ignus.txt b/forge-gui/res/cardsfolder/upcoming/smelt_ward_ignus.txt new file mode 100644 index 00000000000..b54b1e12310 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/smelt_ward_ignus.txt @@ -0,0 +1,6 @@ +Name:Smelt-Ward Ignus +ManaCost:1 R +Types:Creature Elemental +PT:2/1 +A:AB$ GainControl | Cost$ 2 R Sac<1/CARDNAME> | ValidTgts$ Creature.powerLE3 | TgtPrompt$ Select target creature with power 3 or less | Untap$ True | AddKWs$ Haste | SorcerySpeed$ True | SpellDescription$ Gain control of target creature with power 3 or less until end of turn. Untap that creature. It gains haste until end of turn. Activate this ability only any time you could cast a sorcery. +Oracle:{2}{R}, Sacrifice Smelt-Ward Ignus: Gain control of target creature with power 3 or less until end of turn. Untap that creature. It gains haste until end of turn. Activate this ability only any time you could cast a sorcery. diff --git a/forge-gui/res/cardsfolder/upcoming/spawn_of_mayhem.txt b/forge-gui/res/cardsfolder/upcoming/spawn_of_mayhem.txt new file mode 100644 index 00000000000..68d9c1d232e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/spawn_of_mayhem.txt @@ -0,0 +1,12 @@ +Name:Spawn of Mayhem +ManaCost:2 B B +Types:Creature Demon +PT:4/4 +K:Spectacle:1 B B +K:Flying +K:Trample +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDmg | TriggerDescription$ At the beginning of your upkeep, CARDNAME deals 1 damage to each player. Then if you have 10 or less life, put a +1/+1 counter on CARDNAME. +SVar:TrigDmgOpp:DB$DealDamage | Defined$ Player | NumDmg$ 1 | SubAbility$ DBCounter +SVar:DBCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | ConditionCheckSVar$ X | ConditionSVarCompare$ LE10 | References$ X +SVar:X:Count$YourLifeTotal +Oracle:Spectacle {1}{B}{B} (You may cast this spell for its spectacle cost rather than its mana cost if an opponent lost life this turn.)\nFlying, trample\nAt the beginning of your upkeep, Spawn of Mayhem deals 1 damage to each player. Then if you have 10 or less life, put a +1/+1 counter on Spawn of Mayhem. diff --git a/forge-gui/res/cardsfolder/upcoming/sphinx_of_foresight.txt b/forge-gui/res/cardsfolder/upcoming/sphinx_of_foresight.txt new file mode 100644 index 00000000000..99d8de1cd69 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sphinx_of_foresight.txt @@ -0,0 +1,11 @@ +Name:Sphinx of Foresight +ManaCost:2 U U +Types:Creature Sphinx +PT:4/4 +K:MayEffectFromOpeningHand:RevealCard +SVar:RevealCard:DB$ Reveal | RevealDefined$ Self | SubAbility$ DBPump | SpellDescription$ You may reveal this card from your opening hand. If you do, scry 3 at the beginning of your first upkeep. +SVar:DBPump:DB$ Scry | ScryNum$ 3 +K:Flying +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigScry | TriggerDescription$ At the beginning of your upkeep, scry 1. +SVar:TrigScry:DB$ Scry | ScryNum$ 1 +Oracle:You may reveal this card from your opening hand. If you do, scry 3 at the beginning of your first upkeep.\nFlying\nAt the beginning of your upkeep, scry 1. diff --git a/forge-gui/res/cardsfolder/upcoming/sphinx_of_new_prahv.txt b/forge-gui/res/cardsfolder/upcoming/sphinx_of_new_prahv.txt new file mode 100644 index 00000000000..2cd568b0925 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sphinx_of_new_prahv.txt @@ -0,0 +1,8 @@ +Name:Sphinx of New Prahv +ManaCost:W W U U +Types:Creature Sphinx +PT:4/3 +K:Flying +K:Vigilance +S:Mode$ RaiseCost | ValidTarget$ Card.Self | Activator$ Opponent | Type$ Spell | Amount$ 2 | Description$ Spells your opponents cast that target CARDNAME cost {2} more to cast. +Oracle:Flying, vigilance\nSpells your opponents cast that target Sphinx of New Prahv cost {2} more to cast. diff --git a/forge-gui/res/cardsfolder/upcoming/syndicate_guildmage.txt b/forge-gui/res/cardsfolder/upcoming/syndicate_guildmage.txt new file mode 100644 index 00000000000..4af5e09891d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/syndicate_guildmage.txt @@ -0,0 +1,7 @@ +Name:Syndicate Guildmage +ManaCost:W B +Types:Creature Human Cleric +PT:2/2 +A:AB$ Tap | Cost$ 1 W T | ValidTgts$ Creature.powerGE4 | TgtPrompt$ Select target creature with power 4 or greater | SpellDescription$ Tap target creature with power 4 or greater. +A:AB$ DealDamage | Cost$ 4 B T | ValidTgts$ Opponent,Planeswalker | TgtPrompt$ Select target opponent or planeswalker | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target opponent or planeswalker. +Oracle:{1}{W}, {T}: Tap target creature with power 4 or greater.\n{4}{B}, {T}: Syndicate Guildmage deals 2 damage to target opponent or planeswalker. diff --git a/forge-gui/res/cardsfolder/upcoming/the_haunt_of_hightower.txt b/forge-gui/res/cardsfolder/upcoming/the_haunt_of_hightower.txt new file mode 100644 index 00000000000..d696d6175e7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/the_haunt_of_hightower.txt @@ -0,0 +1,12 @@ +Name:The Haunt of Hightower +ManaCost:4 B B +Types:Legendary Creature Vampire +PT:3/3 +K:Flying +K:Lifelink +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ Whenever CARDNAME attacks, defending player discards a card. +SVar:TrigDiscard:DB$Discard | Defined$ DefendingPlayer | NumCards$ 1 | Mode$ TgtChoose +SVar:HasAttackEffect:TRUE +T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Card.nonToken+OppOwn | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a card is put into an opponent's graveyard from anywhere, put a +1/+1 counter on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +Oracle:Flying, lifelink\nWhenever The Haunt of Hightower attacks, defending player discards a card.\nWhenever a card is put into an opponent's graveyard from anywhere, put a +1/+1 counter on The Haunt of Hightower. diff --git a/forge-gui/res/cardsfolder/upcoming/trollbred_guardian.txt b/forge-gui/res/cardsfolder/upcoming/trollbred_guardian.txt new file mode 100644 index 00000000000..9c2718c5365 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/trollbred_guardian.txt @@ -0,0 +1,9 @@ +Name:Trollbred Guardian +ManaCost:4 G +Types:Creature Troll Frog Warrior +PT:5/5 +K:Adapt:2:2 G +DeckHas:Ability$Counters +S:Mode$ Continuous | Affected$ Creature.YouCtrl+counters_GE1_P1P1 | AddKeyword$ Trample | Description$ Each creature you control with a +1/+1 counter on it has trample. +DeckHints:Ability$Counters +Oracle:{2}{G}: Adapt 2. (If this creature has no +1/+1 counters on it, put two +1/+1 counters on it.)\nEach creature you control with a +1/+1 counter on it has trample. diff --git a/forge-gui/res/cardsfolder/upcoming/wilderness_reclamation.txt b/forge-gui/res/cardsfolder/upcoming/wilderness_reclamation.txt new file mode 100644 index 00000000000..e28813dfb8d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/wilderness_reclamation.txt @@ -0,0 +1,6 @@ +Name:Wilderness Reclamation +ManaCost:3 G +Types:Enchantment +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigUntap | TriggerDescription$ At the beginning of your end step, untap all lands you control. +SVar:TrigUntap:DB$ UntapAll | ValidCards$ Land.YouCtrl +Oracle:At the beginning of your end step, untap all lands you control. diff --git a/forge-gui/res/cardsfolder/upcoming/zhur_taa_goblin.txt b/forge-gui/res/cardsfolder/upcoming/zhur_taa_goblin.txt new file mode 100644 index 00000000000..a136ca50236 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/zhur_taa_goblin.txt @@ -0,0 +1,6 @@ +Name:Zhur-Taa Goblin +ManaCost:R G +Types:Creature Goblin Berserker +PT:2/2 +K:Riot +Oracle:Riot (This creature enters the battlefield with your choice of a +1/+1 counter or haste.) diff --git a/forge-gui/res/editions/Ravnica Allegiance.txt b/forge-gui/res/editions/Ravnica Allegiance.txt new file mode 100644 index 00000000000..709ed115e6f --- /dev/null +++ b/forge-gui/res/editions/Ravnica Allegiance.txt @@ -0,0 +1,123 @@ +[metadata] +Code=RNA +Date=2019-01-25 +Name=Ravnica Allegiance +Code2=RNA +MciCode=rna +Type=Expansion + +[cards] +2 U Angelic Exaltation +3 U Archway Angel +16 U Ministrant of Obligation +22 R Smothering Tithe +27 R Tithe Taker +41 C Humongulus +42 R Mass Manipulation +43 M Mesmerizing Benthid +45 R Precognitive Perception +48 C Quench +52 U Skatewing Spy +55 R Sphinx of Foresight +58 R Verity Circle +62 U Bankrupt in Blood +63 C Blade Juggler +70 U Cry of the Carnarium +73 U Drill Bit +76 R Gutterbones +80 U Orzhov Racketeers +81 R Pestilent Spirit +85 M Spawn of Mayhem +92 R Amplifire +93 C Burn Bright +94 C Burning-Tree Vandal +99 R Electrodominance +105 R Immolation Shaman +107 U Light Up the Stage +109 R Rix Maadi Reveler +114 M Skarrgan Hellkite +116 U Smelt-Ward Ignus +123 U Biogenic Upgrade +124 R End-Raze Forerunners +128 R Growth-Chamber Guardian +129 U Gruul Beastmaster +130 R Guardian Project +134 R Rampage of the Clans +140 C Sauroform Hybrid +141 U Silhana Wayfinder +146 C Titanic Brawl +148 U Trollbred Guardian +149 U Wilderness Reclamation +151 R Absorb +152 C Aeromunculus +156 U Basilica Bell-Haunt +157 R Bedevil +158 R Biomancer's Familiar +159 U Bolrac-Clan Crusher +163 U Combine Guildmage +164 U Cult Guildmage +165 R Deputy of Detention +166 M Domri, Chaos Bringer +167 M Dovin, Grand Arbiter +169 M Emergency Powers +173 C Frenzied Arynx +174 U Frilled Mystic +175 U Galloping Lizrog +177 C Grasping Thrull +178 C Growth Spiral +179 R Gruul Spellbreaker +181 U Hackrobat +182 U High Alert +183 M Hydroid Krasis +184 C Imperious Oligarch +185 R Judith, the Scourge Diva +186 M Kaya, Orzhov Usurper +187 R Kaya's Wrath +189 R Lavinia, Azorius Renegade +192 U Mortify +193 R Nikya of the Old Ways +194 U Pitiless Pontiff +195 M Prime Speaker Vannifar +196 C Rafter Demon +197 U Rakdos Firewheeler +198 C Rakdos Roustabout +199 M Rakdos, the Showstopper +200 M Ravager Wurm +201 U Rhythm of the Wild +203 C Savage Smash +205 M Seraph of the Scales +207 R Simic Ascendancy +208 U Sphinx of New Prahv +209 C Sphinx's Insight +211 U Syndicate Guildmage +212 R Teysa Karlov +213 R Theater of Horrors +214 R Zegana, Utopian Speaker +215 U Zhur-Taa Goblin +222 U Carnival // Carnage +224 U Consecrate // Consume +225 U Depose // Deploy +226 U Incubation // Incongruity +230 R Warrant // Warden +231 C Azorius Locket +232 U Gate Colossus +234 C Gruul Locket +236 C Orzhov Locket +237 C Rakdos Locket +240 C Simic Locket +243 C Azorius Guildgate +244 C Azorius Guildgate +245 R Blood Crypt +246 R Breeding Pool +248 R Godless Shrine +249 C Gruul Guildgate +250 C Gruul Guildgate +251 R Hallowed Fountain +252 C Orzhov Guildgate +253 C Orzhov Guildgate +255 C Rakdos Guildgate +256 C Rakdos Guildgate +257 C Simic Guildgate +258 C Simic Guildgate +259 R Stomping Ground +273 M The Haunt of Hightower \ No newline at end of file From 620c27a1178ed1e4bb3411ca7580354460023ec2 Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Thu, 10 Jan 2019 17:11:40 +0000 Subject: [PATCH 604/901] Attempts to fix comments in MR - correct RemAI, fix combine guildname move counters and add X Svar to electrodominance --- forge-gui/res/cardsfolder/upcoming/azorius_locket.txt | 2 +- forge-gui/res/cardsfolder/upcoming/bolrac_clan_crusher.txt | 2 +- forge-gui/res/cardsfolder/upcoming/combine_guildmage.txt | 6 ++++-- forge-gui/res/cardsfolder/upcoming/electrodominance.txt | 1 + forge-gui/res/cardsfolder/upcoming/gruul_locket.txt | 2 +- forge-gui/res/cardsfolder/upcoming/mass_manipulation.txt | 2 +- forge-gui/res/cardsfolder/upcoming/orzhov_locket.txt | 2 +- forge-gui/res/cardsfolder/upcoming/rakdos_locket.txt | 2 +- forge-gui/res/cardsfolder/upcoming/simic_locket.txt | 2 +- 9 files changed, 12 insertions(+), 9 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/azorius_locket.txt b/forge-gui/res/cardsfolder/upcoming/azorius_locket.txt index 4ceff1c9c30..de2eca8e29b 100644 --- a/forge-gui/res/cardsfolder/upcoming/azorius_locket.txt +++ b/forge-gui/res/cardsfolder/upcoming/azorius_locket.txt @@ -3,7 +3,7 @@ ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$White | Blue A:AB$ Draw | Cost$ WU WU WU WU T Sac<1/CARDNAME> | NumCards$ 2 | SpellDescription$ Draw two cards. Oracle:{T}: Add {W} or {U}.\n{W/U}{W/U}{W/U}{W/U}, {T}, Sacrifice Azorius Locket: Draw two cards. diff --git a/forge-gui/res/cardsfolder/upcoming/bolrac_clan_crusher.txt b/forge-gui/res/cardsfolder/upcoming/bolrac_clan_crusher.txt index 796fe4582e3..db9d08053b9 100644 --- a/forge-gui/res/cardsfolder/upcoming/bolrac_clan_crusher.txt +++ b/forge-gui/res/cardsfolder/upcoming/bolrac_clan_crusher.txt @@ -3,5 +3,5 @@ ManaCost:3 R G Types:Creature Ogre Warrior PT:4/4 A:AB$ DealDamage | Cost$ T SubCounter<1/P1P1/Creature.YouCtrl/a creature you control> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to any target. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random Oracle:{T}, Remove a +1/+1 counter from a creature you control: Bolrac-Clan Crusher deals 2 damage to any target. diff --git a/forge-gui/res/cardsfolder/upcoming/combine_guildmage.txt b/forge-gui/res/cardsfolder/upcoming/combine_guildmage.txt index 6479aed1ef4..ddb8b0b2d90 100644 --- a/forge-gui/res/cardsfolder/upcoming/combine_guildmage.txt +++ b/forge-gui/res/cardsfolder/upcoming/combine_guildmage.txt @@ -6,6 +6,8 @@ A:AB$ Effect | Cost$ 1 G T | Name$ CARDNAME Effect | ReplacementEffects$ ExtraET SVar:ExtraETBCounter:Event$ Moved | ActiveZones$ Command | Destination$ Battlefield | ValidCard$ Creature.YouCtrl+Other | ReplaceWith$ AddExtraCounter | Description$ This turn, each creature you control enters the battlefield with an additional +1/+1 counter on it. SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ MoveToBattlefield SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard -A:AB$ MoveCounter | Cost$ 1 U T | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | SubAbility$ DBMove | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Move a +1/+1 counter from target creature you control onto another target creature you control. -SVar:DBMove:DB$ MoveCounter | Source$ Targeted.Other+YouCtrl | ValidTgts$ Creature.YouCtrl+Other | TgtPrompt$ Select target creature you control to get +1/+1 counter. +A:AB$ Pump | Cost$ 1 U T | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature to remove +1/+1 counter | SubAbility$ DBMove | RememberObjects$ Targeted | StackDescription$ None | SpellDescription$ Move a +1/+1 counter from target creature onto another target creature with the same controller. +SVar:DBMove:DB$ MoveCounter | Source$ Remembered | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select another target creature with the same controller to get +1/+1 counter | TargetUnique$ True | TargetsWithSameController$ True | CounterType$ P1P1 | CounterNum$ 1 | ConditionDefined$ Targeted | ConditionPresent$ Creature.sharesControllerWith Remembered | ConditionCompare$ EQ1 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True + Oracle:{1}{G}, {T}: This turn, each creature you control enters the battlefield with an additional +1/+1 counter on it.\n{1}{U}, {T}: Move a +1/+1 counter from target creature you control onto another target creature you control. diff --git a/forge-gui/res/cardsfolder/upcoming/electrodominance.txt b/forge-gui/res/cardsfolder/upcoming/electrodominance.txt index 096d0f2db46..40b9dcfd14e 100644 --- a/forge-gui/res/cardsfolder/upcoming/electrodominance.txt +++ b/forge-gui/res/cardsfolder/upcoming/electrodominance.txt @@ -3,4 +3,5 @@ ManaCost:X R R Types:Instant A:SP$ DealDamage | Cost$ X R R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X | SubAbility$ DBPlay | SpellDescription$ CARDNAME deals X damage to any target. You may cast a card with converted mana cost X or less from your hand without paying its mana cost. SVar:DBPlay:DB$ Play | Valid$ Targeted.cmcLEX+YouCtrl | ValidZone$ Hand | WithoutManaCost$ True | Amount$ 1 | Controller$ You | Optional$ True | References$ X +SVar:X:Count$xPaid Oracle:Electrodominance deals X damage to any target. You may cast a card with converted mana cost X or less from your hand without paying its mana cost. diff --git a/forge-gui/res/cardsfolder/upcoming/gruul_locket.txt b/forge-gui/res/cardsfolder/upcoming/gruul_locket.txt index 44014b16fa2..e21dd5c40b8 100644 --- a/forge-gui/res/cardsfolder/upcoming/gruul_locket.txt +++ b/forge-gui/res/cardsfolder/upcoming/gruul_locket.txt @@ -3,7 +3,7 @@ ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Red | Green A:AB$ Draw | Cost$ RG RG RG RG T Sac<1/CARDNAME> | NumCards$ 2 | SpellDescription$ Draw two cards. Oracle:{T}: Add {R} or {G}.\n{R/G}{R/G}{R/G}{R/G}, {T}, Sacrifice Gruul Locket: Draw two cards. diff --git a/forge-gui/res/cardsfolder/upcoming/mass_manipulation.txt b/forge-gui/res/cardsfolder/upcoming/mass_manipulation.txt index a4413d43b32..e2b068e3a59 100644 --- a/forge-gui/res/cardsfolder/upcoming/mass_manipulation.txt +++ b/forge-gui/res/cardsfolder/upcoming/mass_manipulation.txt @@ -4,5 +4,5 @@ Types:Sorcery A:SP$ GainControl | Cost$ X X U U U U | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker | TargetMin$ 0 | TargetMax$ MaxTgts | References$ X,MaxTgts | SpellDescription$ Gain control of X target creatures and/or planeswalkers. SVar:X:Targeted$Amount SVar:MaxTgts:Count$Valid Creature,Planeswalker -SVar:RemRandomDeck:True +AI:RemoveDeck:Random Oracle:Gain control of X target creatures and/or planeswalkers. diff --git a/forge-gui/res/cardsfolder/upcoming/orzhov_locket.txt b/forge-gui/res/cardsfolder/upcoming/orzhov_locket.txt index 104f61bf20c..f162cfec029 100644 --- a/forge-gui/res/cardsfolder/upcoming/orzhov_locket.txt +++ b/forge-gui/res/cardsfolder/upcoming/orzhov_locket.txt @@ -3,7 +3,7 @@ ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$White | Black A:AB$ Draw | Cost$ WB WB WB WB Sac<1/CARDNAME> | NumCards$ 2 | SpellDescription$ Draw two cards. Oracle:{T}: Add {W} or {B}.\n{W/B}{W/B}{W/B}{W/B}, {T}, Sacrifice Orzhov Locket: Draw two cards. diff --git a/forge-gui/res/cardsfolder/upcoming/rakdos_locket.txt b/forge-gui/res/cardsfolder/upcoming/rakdos_locket.txt index eefb01b51a4..5b960c1f5e9 100644 --- a/forge-gui/res/cardsfolder/upcoming/rakdos_locket.txt +++ b/forge-gui/res/cardsfolder/upcoming/rakdos_locket.txt @@ -3,7 +3,7 @@ ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Black | Red A:AB$ Draw | Cost$ BR BR BR BR T Sac<1/CARDNAME> | NumCards$ 2 | SpellDescription$ Draw two cards. Oracle:{T}: Add {B} or {R}.\n{B/R}{B/R}{B/R}{B/R}, {T}, Sacrifice Rakdos Locket: Draw two cards. diff --git a/forge-gui/res/cardsfolder/upcoming/simic_locket.txt b/forge-gui/res/cardsfolder/upcoming/simic_locket.txt index c8662f4f337..22025cfffd4 100644 --- a/forge-gui/res/cardsfolder/upcoming/simic_locket.txt +++ b/forge-gui/res/cardsfolder/upcoming/simic_locket.txt @@ -3,7 +3,7 @@ ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. -SVar:RemRandomDeck:True +AI:RemoveDeck:Random DeckNeeds:Color$Green | Blue A:AB$ Draw | Cost$ GU GU GU GU T Sac<1/CARDNAME> | NumCards$ 2 | SpellDescription$ Draw two cards. Oracle:{T}: Add {G} or {U}.\n{G/U}{G/U}{G/U}{G/U}, {T}, Sacrifice Simic Locket: Draw two cards. From 1940bca93227bcfd107fb6af1c210e6cfff29ccb Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Thu, 10 Jan 2019 17:30:01 +0000 Subject: [PATCH 605/901] More straightforward RNA cards --- .../upcoming/arresters_admonition.txt | 6 ++++ .../upcoming/benthic_biomancer.txt | 11 ++++++++ .../cardsfolder/upcoming/biogenic_ooze.txt | 12 ++++++++ .../res/cardsfolder/upcoming/gates_ablaze.txt | 7 +++++ .../upcoming/growth_chamber_guardian.txt | 10 +++++++ .../upcoming/hero_of_precinct_one.txt | 10 +++++++ .../upcoming/skewer_the_critics.txt | 6 ++++ .../res/cardsfolder/upcoming/testetestest.txt | 28 +++++++++++++++++++ 8 files changed, 90 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/arresters_admonition.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/benthic_biomancer.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/biogenic_ooze.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/gates_ablaze.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/growth_chamber_guardian.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/hero_of_precinct_one.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/skewer_the_critics.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/testetestest.txt diff --git a/forge-gui/res/cardsfolder/upcoming/arresters_admonition.txt b/forge-gui/res/cardsfolder/upcoming/arresters_admonition.txt new file mode 100644 index 00000000000..af9f38bba93 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/arresters_admonition.txt @@ -0,0 +1,6 @@ +Name:Arrester's Admonition +ManaCost:2 U +Types:Instant +A:SP$ ChangeZone | Cost$ 2 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBAddendum | SpellDescription$ Return target creature to its owner's hand. +SVar:DBAddendum:DB$ Draw | NumCards$ 1 | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SpellDescription$ Addendum - If you cast this spell during your main phase, draw a card. +Oracle:Return target creature to its owner's hand.\nAddendum — If you cast this spell during your main phase, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/benthic_biomancer.txt b/forge-gui/res/cardsfolder/upcoming/benthic_biomancer.txt new file mode 100644 index 00000000000..b89cc502a79 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/benthic_biomancer.txt @@ -0,0 +1,11 @@ +Name:Benthic Biomancer +ManaCost:U +Types:Creature Merfolk Wizard Mutant +PT:1/1 +K:Adapt:1:1 U +DeckHas:Ability$Counters +T:Mode$ CounterAddedOnce | ValidCard$ Card.Self | TriggerZones$ Battlefield | CounterType$ P1P1 | Execute$ TrigDraw | TriggerDescription$ Whenever one or more +1/+1 counters are put on CARDNAME, draw a card, then discard a card. +SVar:TrigDraw:DB$ Draw | NumCards$ 1 | SubAbility$ DBDiscard +SVar:DBDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose +DeckHints:Ability$Counters +Oracle:{1}{U}: Adapt 1. (If this creature has no +1/+1 counters on it, put a +1/+1 counter on it.)\nWhenever one or more +1/+1 counters are put on Benthic Biomancer, draw a card, then discard a card. diff --git a/forge-gui/res/cardsfolder/upcoming/biogenic_ooze.txt b/forge-gui/res/cardsfolder/upcoming/biogenic_ooze.txt new file mode 100644 index 00000000000..942ddef7b1a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/biogenic_ooze.txt @@ -0,0 +1,12 @@ +Name:Biogenic Ooze +ManaCost:3 G G +Types:Creature Ooze +PT:2/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a 2/2 green Ooze creature token. +SVar:TrigToken:DB$Token | TokenAmount$ 1 | TokenName$ Ooze | TokenTypes$ Creature,Ooze | TokenOwner$ You | TokenColors$ Green | TokenPower$ 2 | TokenToughness$ 2 | TokenImage$ g 2 2 ooze rna +DeckHas:Ability$Token +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your end step, put a +1/+1 counter on each Ooze you control. +SVar:TrigPutCounter:DB$PutCounterAll | ValidCards$ Ooze.YouCtrl | CounterType$ P1P1 | CounterNum$ 1 +SVar:BuffedBy:Artifact +A:AB$ Token | Cost$ 1 G G G | TokenAmount$ 1 | TokenName$ Ooze | TokenTypes$ Creature,Ooze | TokenOwner$ You | TokenColors$ Green | TokenPower$ 2 | TokenToughness$ 2 | TokenImage$ g 2 2 ooze rna | SpellDescription$ Create a 2/2 green Ooze creature token. +Oracle:When Biogenic Ooze enters the battlefield, create a 2/2 green Ooze creature token.\nAt the beginning of your end step, put a +1/+1 counter on each Ooze you control.\n{1}{G}{G}{G}: Create a 2/2 green Ooze creature token. diff --git a/forge-gui/res/cardsfolder/upcoming/gates_ablaze.txt b/forge-gui/res/cardsfolder/upcoming/gates_ablaze.txt new file mode 100644 index 00000000000..6850e69d8ff --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/gates_ablaze.txt @@ -0,0 +1,7 @@ +Name:Gates Ablaze +ManaCost:2 R +Types:Sorcery +A:SP$ DamageAll | Cost$ 2 R | NumDmg$ X | ValidCards$ Creature | ValidDescription$ each creature. | References$ X | SpellDescription$ CARDNAME deals X damage to each creature, where X is the number of Gates you control. +SVar:X:Count$Valid Gate.YouCtrl +DeckHints:Type$Gate +Oracle:Gates Ablaze deals X damage to each creature, where X is the number of Gates you control. diff --git a/forge-gui/res/cardsfolder/upcoming/growth_chamber_guardian.txt b/forge-gui/res/cardsfolder/upcoming/growth_chamber_guardian.txt new file mode 100644 index 00000000000..ab2115fc759 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/growth_chamber_guardian.txt @@ -0,0 +1,10 @@ +Name:Growth-Chamber Guardian +ManaCost:1 G +Types:Creature Elf Crab Warrior +PT:2/2 +K:Adapt:2:2 G +DeckHas:Ability$Counters +T:Mode$ CounterAddedOnce | ValidCard$ Card.Self | TriggerZones$ Battlefield | CounterType$ P1P1 | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ Whenever one or more +1/+1 counters are put on CARDNAME, you may search your library for a card named CARDNAME, reveal it, put it into your hand, then shuffle your library. +SVar:TrigSearch:DB$ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Card.namedGrowth-Chamber Guardian | ChangeNum$ 1 | ShuffleNonMandatory$ True +DeckHints:Name$Growth-Chamber Guardian +Oracle:{2}{G}: Adapt 2. (If this creature has no +1/+1 counters on it, put two +1/+1 counters on it.)\nWhenever one or more +1/+1 counters are put on Growth-Chamber Guardian, you may search your library for a card named Growth-Chamber Guardian, reveal it, put it into your hand, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/upcoming/hero_of_precinct_one.txt b/forge-gui/res/cardsfolder/upcoming/hero_of_precinct_one.txt new file mode 100644 index 00000000000..ab24a2ee327 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/hero_of_precinct_one.txt @@ -0,0 +1,10 @@ +Name:Hero of Precinct One +ManaCost:1 W +Types:Creature Human Warrior +PT:2/2 +T:Mode$ SpellCast | ValidCard$ Card.MultiColor | ValidActivatingPlayer$ You | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a multicolored spell, create a 1/1 white Human creature token. +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenName$ Human | TokenTypes$ Creature,Human | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenImage$ w 1 1 human rna +SVar:RemRandomDeck:True +SVar:BuffedBy:Card.MultiColor +DeckHas:Ability$Token +Oracle:Whenever you cast a multicolored spell, create a 1/1 white Human creature token. diff --git a/forge-gui/res/cardsfolder/upcoming/skewer_the_critics.txt b/forge-gui/res/cardsfolder/upcoming/skewer_the_critics.txt new file mode 100644 index 00000000000..10bf7561a84 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/skewer_the_critics.txt @@ -0,0 +1,6 @@ +Name:Skewer the Critics +ManaCost:2 R +Types:Sorcery +K:Spectacle:R +A:SP$ DealDamage | Cost$ 2 R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to any target. +Oracle:Spectacle {R} (You may cast this spell for its spectacle cost rather than its mana cost if an opponent lost life this turn.)\nSkewer the Critics deals 3 damage to any target. diff --git a/forge-gui/res/cardsfolder/upcoming/testetestest.txt b/forge-gui/res/cardsfolder/upcoming/testetestest.txt new file mode 100644 index 00000000000..5f308d08b70 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/testetestest.txt @@ -0,0 +1,28 @@ +Name:Vexus, brut mother +ManaCost:4 B G +Types:Legendary Creature Spider Demon +PT:2/6 +K:Reach +S:Mode$ Continuous | Affected$ Creature.Green+YouCtrl,Creature.Black+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Black and green creatures you control get +1/+1. +S:Mode$ Continuous | Affected$ Creature.Spider+YouCtrl,Creature.Insect+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Spider and Insect creatures you control get +1/+1. +A:AB$ ChangeZone | Cost$ 4 B G | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBReturn | StackDescription$ SpellDescription | SpellDescription$ Exile CARDNAME, then return him to the battlefield transformed under his owner's control. +SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | Transformed$ True | ForgetOtherRemembered$ True | SubAbility$ DBCleanup | StackDescription$ None +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +AlternateMode:DoubleFaced +Oracle:\nReach. \nBlack and green creatures you control get +1/+1. \nSpider and Insect creatures you control get +1/+1. \n{4}{B}{G}: Exile Vexus, brut mother, then return her to the battlefield transformed under her owner's control. + +ALTERNATE + +Name:Vexus, Empress of the Swarm +ManaCost:no cost +Colors:black,green +Types:Legendary Planeswalker Vexus +Loyalty:7 +A:AB$ Token | Cost$ AddCounter<2/LOYALTY> | TokenAmount$ 3 | TokenName$ Spider | TokenTypes$ Creature,Spider | TokenOwner$ You | TokenColors$ Black,Green | TokenPower$ 1 | TokenToughness$ 2 | Planeswalker$ True | TokenImage$ bg_1_2_spider_ths | SpellDescription$ Create three 1/2 black and green Spider creature tokens with reach and deathtouch. +A:AB$ Destroy | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Destroy target creature. +A:AB$ RepeatEach | Cost$ SubCounter<3/LOYALTY> | RepeatPlayers$ Opponent | RepeatSubAbility$ SacNonland | Planeswalker$ True | SpellDescription$ Each opponent sacrifices a nonland permanent. +SVar:SacNonland | Cost$ Sac<1/Permanent.nonLand> | SpellDescription$ You sacrifice a nonland permanent +A:AB$ Effect | Cost$ SubCounter<12/LOYALTY> | Name$ Emblem - Vexus, Empress of the Swarm | Image$ emblem_vexus_empress_of_the_Swarm | StaticAbilities$ STtrample,STindestructible | Planeswalker$ True | Ultimate$ True | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "Black and green creatures you control get +1/+1 and have trample. Spider and insect creatures you control get +2/+2 and have indestructable." +SVar:STtrample:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.Green+YouCtrl,Creature.Black+YouCtrl | AffectedZone$ Battlefield | AddKeyword$ Trample | AddPower$ 1 | AddToughness$ 1 | Description$ Black and green creatures you control get +1/+1 and have trample. +SVar:STindestructible:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.Spider+YouCtrl,Creature.Insect+YouCtrl | AffectedZone$ Battlefield | AddKeyword$ Indestructible | AddPower$ 2 | AddToughness$ 2 | Description$ Spider and insect creatures you control get +2/+2 and have indestructable. +Oracle:+2: Create three 1/2 black and green Spider creature tokens with reach and deathtouch.\n+1: Destroy target creature.\n-3: Each opponent sacrifices a nonland permanent.\n−12: Create an emblem with:"Black and green creatures you control get +1/+1 and have trample. Spider and insect creatures you control get +2/+2 and have indestructable." \ No newline at end of file From 1bade895e1efa1b48833c3c8590ed4080d801955 Mon Sep 17 00:00:00 2001 From: maustin Date: Sat, 12 Jan 2019 16:47:20 +0000 Subject: [PATCH 606/901] Complete Ravnica Allegiance editions file --- forge-gui/res/editions/Ravnica Allegiance.txt | 156 +++++++++++++++++- 1 file changed, 155 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/editions/Ravnica Allegiance.txt b/forge-gui/res/editions/Ravnica Allegiance.txt index 709ed115e6f..93b2ec671a9 100644 --- a/forge-gui/res/editions/Ravnica Allegiance.txt +++ b/forge-gui/res/editions/Ravnica Allegiance.txt @@ -7,65 +7,186 @@ MciCode=rna Type=Expansion [cards] +1 M Angel of Grace 2 U Angelic Exaltation 3 U Archway Angel +4 C Arrester's Zeal +5 C Bring to Trial +6 C Civic Stalwart +7 C Concordia Pegasus +8 C Expose to Daylight +9 U Forbidding Spirit +10 C Haazda Officer +11 R Hero of Precinct One +12 C Impassioned Orator +13 C Justiciar's Portal +14 C Knight of Sorrows +15 R Lumbering Battlement 16 U Ministrant of Obligation +17 C Prowling Caracal +18 U Rally to Battle +19 U Resolute Watchdog +20 U Sentinel's Mark +21 U Sky Tether 22 R Smothering Tithe +23 U Spirit of the Spires +24 C Summary Judgment +25 C Syndicate Messenger +26 C Tenth District Veteran 27 R Tithe Taker +28 C Twilight Panther +29 R Unbreakable Formation +30 C Watchful Giant +31 C Arrester's Admonition +32 R Benthic Biomancer +33 C Chillbringer +34 C Clear the Mind +35 U Code of Constraint +36 C Coral Commando +37 U Essence Capture +38 U Eyes Everywhere +39 C Faerie Duelist +40 U Gateway Sneak 41 C Humongulus 42 R Mass Manipulation 43 M Mesmerizing Benthid +44 C Persistent Petitioners 45 R Precognitive Perception +46 C Prying Eyes +47 U Pteramander 48 C Quench +49 C Sage's Row Savant +50 C Senate Courier +51 C Shimmer of Possibility 52 U Skatewing Spy +53 C Skitter Eel +54 C Slimebind 55 R Sphinx of Foresight +56 U Swirling Torrent +57 C Thought Collapse 58 R Verity Circle +59 U Wall of Lost Thoughts +60 U Windstorm Drake +61 R Awaken the Erstwhile 62 U Bankrupt in Blood 63 C Blade Juggler +64 C Bladebrand +65 U Bloodmist Infiltrator +66 C Carrion Imp +67 C Catacomb Crocodile +68 U Clear the Stage +69 C Consign to the Pit 70 U Cry of the Carnarium +71 C Dead Revels +72 C Debtors' Transport 73 U Drill Bit +74 R Font of Agonies +75 C Grotesque Demise 76 R Gutterbones +77 C Ill-Gotten Inheritance +78 C Noxious Groodion +79 U Orzhov Enforcer 80 U Orzhov Racketeers 81 R Pestilent Spirit +82 C Plague Wight +83 R Priest of Forgotten Gods +84 C Rakdos Trumpeter 85 M Spawn of Mayhem +86 U Spire Mangler +87 C Thirsting Shade +88 C Undercity Scavenger +89 C Undercity's Embrace +90 U Vindictive Vampire +91 C Act of Treason 92 R Amplifire 93 C Burn Bright 94 C Burning-Tree Vandal +95 U Cavalcade of Calamity +96 U Clamor Shaman +97 U Dagger Caster +98 C Deface 99 R Electrodominance -105 R Immolation Shaman +100 C Feral Maaka +101 U Flames of the Raze-Boar +102 U Gates Ablaze +103 C Ghor-Clan Wrecker +104 C Goblin Gathering +105 C Gravel-Hide Goblin +106 R Immolation Shaman 107 U Light Up the Stage +108 R Mirror March 109 R Rix Maadi Reveler +110 C Rubble Reading +111 C Rubblebelt Recluse +112 U Rumbling Ruin +113 C Scorchmark 114 M Skarrgan Hellkite +115 C Skewer the Critics 116 U Smelt-Ward Ignus +117 C Spear Spewer +118 C Spikewheel Acrobat +119 C Storm Strike +120 U Tin Street Dodger +121 C Axebane Beast +122 M Biogenic Ooze 123 U Biogenic Upgrade 124 R End-Raze Forerunners +125 U Enraged Ceratok +126 U Gatebreaker Ram +127 C Gift of Strength 128 R Growth-Chamber Guardian 129 U Gruul Beastmaster 130 R Guardian Project +131 R Incubation Druid +132 C Mammoth Spider +133 C Open the Gates 134 R Rampage of the Clans +135 C Rampaging Rendhorn +136 U Regenesis +137 C Root Snare +138 C Sagittars' Volley +139 C Saruli Caretaker 140 C Sauroform Hybrid 141 U Silhana Wayfinder +142 C Steeple Creeper +143 C Stony Strength +144 C Sylvan Brushstrider +145 C Territorial Boar 146 C Titanic Brawl +147 U Tower Defense 148 U Trollbred Guardian 149 U Wilderness Reclamation +150 C Wrecking Beast 151 R Absorb 152 C Aeromunculus +153 C Applied Biomancy +154 C Azorius Knight-Arbiter +155 U Azorius Skyguard 156 U Basilica Bell-Haunt 157 R Bedevil 158 R Biomancer's Familiar 159 U Bolrac-Clan Crusher +160 M Captive Audience +161 R Cindervines +162 U Clan Guildmage 163 U Combine Guildmage 164 U Cult Guildmage 165 R Deputy of Detention 166 M Domri, Chaos Bringer 167 M Dovin, Grand Arbiter +168 U Dovin's Acuity 169 M Emergency Powers +170 R Ethereal Absolution +171 C Final Payment +172 U Fireblade Artist 173 C Frenzied Arynx 174 U Frilled Mystic 175 U Galloping Lizrog +176 C Get the Point 177 C Grasping Thrull 178 C Growth Spiral 179 R Gruul Spellbreaker +180 U Gyre Engineer 181 U Hackrobat 182 U High Alert 183 M Hydroid Krasis @@ -73,7 +194,10 @@ Type=Expansion 185 R Judith, the Scourge Diva 186 M Kaya, Orzhov Usurper 187 R Kaya's Wrath +188 U Knight of the Last Breath 189 R Lavinia, Azorius Renegade +190 C Lawmage's Binding +191 U Macabre Mockery 192 U Mortify 193 R Nikya of the Old Ways 194 U Pitiless Pontiff @@ -84,40 +208,70 @@ Type=Expansion 199 M Rakdos, the Showstopper 200 M Ravager Wurm 201 U Rhythm of the Wild +202 C Rubblebelt Runner 203 C Savage Smash +204 U Senate Guildmage 205 M Seraph of the Scales +206 U Sharktocrab 207 R Simic Ascendancy 208 U Sphinx of New Prahv 209 C Sphinx's Insight +210 U Sunder Shaman 211 U Syndicate Guildmage 212 R Teysa Karlov 213 R Theater of Horrors 214 R Zegana, Utopian Speaker 215 U Zhur-Taa Goblin +216 C Footlight Fiend +217 C Rubble Slinger +218 C Scuttlegator +219 C Senate Griffin +220 C Vizkopa Vampire +221 R Bedeck // Bedazzle 222 U Carnival // Carnage +223 U Collision // Colossus 224 U Consecrate // Consume 225 U Depose // Deploy 226 U Incubation // Incongruity +227 R Repudiate // Replicate +228 R Revival // Revenge +229 R Thrash // Threat 230 R Warrant // Warden 231 C Azorius Locket 232 U Gate Colossus +233 R Glass of the Guildpact 234 C Gruul Locket +235 U Junktroller 236 C Orzhov Locket 237 C Rakdos Locket +238 U Scrabbling Claws +239 U Screaming Shield 240 C Simic Locket +241 U Sphinx of the Guildpact +242 R Tome of the Guildpact 243 C Azorius Guildgate 244 C Azorius Guildgate 245 R Blood Crypt 246 R Breeding Pool +247 C Gateway Plaza 248 R Godless Shrine 249 C Gruul Guildgate 250 C Gruul Guildgate 251 R Hallowed Fountain 252 C Orzhov Guildgate 253 C Orzhov Guildgate +254 R Plaza of Harmony 255 C Rakdos Guildgate 256 C Rakdos Guildgate 257 C Simic Guildgate 258 C Simic Guildgate 259 R Stomping Ground +265 M Dovin, Architect of Law +266 C Elite Arrester +267 R Dovin's Dismissal +268 U Dovin's Automaton +269 M Domri, City Smasher +270 C Ragefire +271 U Charging War Boar +272 R Domri's Nodorog 273 M The Haunt of Hightower \ No newline at end of file From 10f8616e3741408ccede79a71f0de74edc0223e8 Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Sun, 13 Jan 2019 14:20:54 +0000 Subject: [PATCH 607/901] First pass of remaining spoilers, commiting and fixing up those that forgescribe got close --- forge-gui/res/cardsfolder/upcoming/arresters_zeal.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/axebane_beast.txt | 5 +++++ .../cardsfolder/upcoming/azorius_knight_arbiter.txt | 7 +++++++ .../res/cardsfolder/upcoming/azorius_skyguard.txt | 9 +++++++++ forge-gui/res/cardsfolder/upcoming/bladebrand.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/bring_to_trial.txt | 5 +++++ forge-gui/res/cardsfolder/upcoming/carrion_imp.txt | 11 +++++++++++ .../res/cardsfolder/upcoming/catacomb_crocodile.txt | 5 +++++ forge-gui/res/cardsfolder/upcoming/chillbringer.txt | 10 ++++++++++ forge-gui/res/cardsfolder/upcoming/civic_stalwart.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/clan_guildmage.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/clear_the_mind.txt | 7 +++++++ .../res/cardsfolder/upcoming/clear_the_stage.txt | 6 ++++++ .../res/cardsfolder/upcoming/code_of_constraint.txt | 9 +++++++++ .../res/cardsfolder/upcoming/consign_to_the_pit.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/coral_commando.txt | 5 +++++ forge-gui/res/cardsfolder/upcoming/dagger_caster.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/dead_revels.txt | 6 ++++++ .../res/cardsfolder/upcoming/debtors_transport.txt | 6 ++++++ .../res/cardsfolder/upcoming/dovins_automaton.txt | 7 +++++++ .../res/cardsfolder/upcoming/enraged_ceratok.txt | 6 ++++++ .../res/cardsfolder/upcoming/essence_capture.txt | 6 ++++++ .../res/cardsfolder/upcoming/ethereal_absolution.txt | 10 ++++++++++ .../res/cardsfolder/upcoming/expose_to_daylight.txt | 6 ++++++ .../res/cardsfolder/upcoming/eyes_everywhere.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/faerie_duelist.txt | 9 +++++++++ forge-gui/res/cardsfolder/upcoming/feral_maaka.txt | 5 +++++ forge-gui/res/cardsfolder/upcoming/gateway_sneak.txt | 10 ++++++++++ .../res/cardsfolder/upcoming/ghor_clan_wrecker.txt | 7 +++++++ .../cardsfolder/upcoming/glass_of_the_guildpact.txt | 6 ++++++ .../res/cardsfolder/upcoming/goblin_gathering.txt | 7 +++++++ .../res/cardsfolder/upcoming/gravel_hide_goblin.txt | 6 ++++++ .../res/cardsfolder/upcoming/grotesque_demise.txt | 5 +++++ forge-gui/res/cardsfolder/upcoming/gyre_engineer.txt | 6 ++++++ .../cardsfolder/upcoming/ill_gotten_inheritance.txt | 9 +++++++++ .../res/cardsfolder/upcoming/impassioned_orator.txt | 7 +++++++ .../res/cardsfolder/upcoming/justiciars_portal.txt | 8 ++++++++ .../res/cardsfolder/upcoming/knight_of_sorrows.txt | 7 +++++++ .../upcoming/knight_of_the_last_breath.txt | 8 ++++++++ .../res/cardsfolder/upcoming/macabre_mockery.txt | 7 +++++++ .../res/cardsfolder/upcoming/noxious_groodion.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/open_the_gates.txt | 5 +++++ .../res/cardsfolder/upcoming/orzhov_enforcer.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/plague_wight.txt | 7 +++++++ .../res/cardsfolder/upcoming/plaza_of_harmony.txt | 9 +++++++++ .../res/cardsfolder/upcoming/prowling_caracal.txt | 5 +++++ forge-gui/res/cardsfolder/upcoming/prying_eyes.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/ragefire.txt | 5 +++++ .../res/cardsfolder/upcoming/rakdos_trumpeter.txt | 7 +++++++ .../res/cardsfolder/upcoming/rally_to_battle.txt | 6 ++++++ .../res/cardsfolder/upcoming/rampaging_rendhorn.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/regenesis.txt | 5 +++++ .../res/cardsfolder/upcoming/resolute_watchdog.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/rubble_reading.txt | 6 ++++++ .../res/cardsfolder/upcoming/rubblebelt_recluse.txt | 6 ++++++ .../res/cardsfolder/upcoming/sages_row_savant.txt | 7 +++++++ .../res/cardsfolder/upcoming/sagittars_volley.txt | 6 ++++++ .../res/cardsfolder/upcoming/saruli_caretaker.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/scorchmark.txt | 5 +++++ forge-gui/res/cardsfolder/upcoming/senate_courier.txt | 7 +++++++ .../res/cardsfolder/upcoming/senate_guildmage.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/sharktocrab.txt | 11 +++++++++++ .../cardsfolder/upcoming/shimmer_of_possibility.txt | 5 +++++ forge-gui/res/cardsfolder/upcoming/skitter_eel.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/sky_tether.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/slimebind.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/spear_spewer.txt | 8 ++++++++ .../cardsfolder/upcoming/sphinx_of_the_guildpact.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/spire_mangler.txt | 10 ++++++++++ .../res/cardsfolder/upcoming/spirit_of_the_spires.txt | 8 ++++++++ .../res/cardsfolder/upcoming/steeple_creeper.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/stony_strength.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/storm_strike.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/sunder_shaman.txt | 8 ++++++++ .../res/cardsfolder/upcoming/sylvan_brushstrider.txt | 7 +++++++ .../res/cardsfolder/upcoming/syndicate_messenger.txt | 7 +++++++ .../cardsfolder/upcoming/tenth_district_veteran.txt | 8 ++++++++ .../res/cardsfolder/upcoming/territorial_boar.txt | 8 ++++++++ .../res/cardsfolder/upcoming/thirsting_shade.txt | 7 +++++++ .../res/cardsfolder/upcoming/thought_collapse.txt | 6 ++++++ .../res/cardsfolder/upcoming/tin_street_dodger.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/titanic_brawl.txt | 9 +++++++++ .../cardsfolder/upcoming/tome_of_the_guildpact.txt | 8 ++++++++ .../res/cardsfolder/upcoming/twilight_panther.txt | 6 ++++++ .../res/cardsfolder/upcoming/undercity_scavenger.txt | 9 +++++++++ .../res/cardsfolder/upcoming/undercitys_embrace.txt | 6 ++++++ .../res/cardsfolder/upcoming/vindictive_vampire.txt | 8 ++++++++ .../cardsfolder/upcoming/wall_of_lost_thoughts.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/watchful_giant.txt | 8 ++++++++ .../res/cardsfolder/upcoming/windstorm_drake.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/wrecking_beast.txt | 7 +++++++ 91 files changed, 641 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/arresters_zeal.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/axebane_beast.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/azorius_knight_arbiter.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/azorius_skyguard.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/bladebrand.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/bring_to_trial.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/carrion_imp.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/catacomb_crocodile.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/chillbringer.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/civic_stalwart.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/clan_guildmage.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/clear_the_mind.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/clear_the_stage.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/code_of_constraint.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/consign_to_the_pit.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/coral_commando.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/dagger_caster.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/dead_revels.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/debtors_transport.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/dovins_automaton.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/enraged_ceratok.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/essence_capture.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/ethereal_absolution.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/expose_to_daylight.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/eyes_everywhere.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/faerie_duelist.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/feral_maaka.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/gateway_sneak.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/ghor_clan_wrecker.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/glass_of_the_guildpact.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/goblin_gathering.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/gravel_hide_goblin.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/grotesque_demise.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/gyre_engineer.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/ill_gotten_inheritance.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/impassioned_orator.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/justiciars_portal.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/knight_of_sorrows.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/knight_of_the_last_breath.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/macabre_mockery.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/noxious_groodion.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/open_the_gates.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/orzhov_enforcer.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/plague_wight.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/plaza_of_harmony.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/prowling_caracal.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/prying_eyes.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/ragefire.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/rakdos_trumpeter.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/rally_to_battle.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/rampaging_rendhorn.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/regenesis.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/resolute_watchdog.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/rubble_reading.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/rubblebelt_recluse.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/sages_row_savant.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/sagittars_volley.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/saruli_caretaker.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/scorchmark.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/senate_courier.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/senate_guildmage.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/sharktocrab.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/shimmer_of_possibility.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/skitter_eel.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/sky_tether.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/slimebind.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/spear_spewer.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/sphinx_of_the_guildpact.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/spire_mangler.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/spirit_of_the_spires.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/steeple_creeper.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/stony_strength.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/storm_strike.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/sunder_shaman.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/sylvan_brushstrider.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/syndicate_messenger.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/tenth_district_veteran.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/territorial_boar.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/thirsting_shade.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/thought_collapse.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/tin_street_dodger.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/titanic_brawl.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/tome_of_the_guildpact.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/twilight_panther.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/undercity_scavenger.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/undercitys_embrace.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/vindictive_vampire.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/wall_of_lost_thoughts.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/watchful_giant.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/windstorm_drake.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/wrecking_beast.txt diff --git a/forge-gui/res/cardsfolder/upcoming/arresters_zeal.txt b/forge-gui/res/cardsfolder/upcoming/arresters_zeal.txt new file mode 100644 index 00000000000..d4ee060d7ce --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/arresters_zeal.txt @@ -0,0 +1,6 @@ +Name:Arrester's Zeal +ManaCost:W +Types:Instant +A:SP$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SubAbility$ DBAddendum | SpellDescription$ Target creature gets +2/+2 until end of turn. +SVar:DBAddendum:DB$ Pump | Cost$ W | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SpellDescription$ Addendum - If you cast this spell during your main phase, that creature gains flying until end of turn. +Oracle:Target creature gets +2/+2 until end of turn.\nAddendum — If you cast this spell during your main phase, that creature gains flying until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/axebane_beast.txt b/forge-gui/res/cardsfolder/upcoming/axebane_beast.txt new file mode 100644 index 00000000000..0befda58703 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/axebane_beast.txt @@ -0,0 +1,5 @@ +Name:Axebane Beast +ManaCost:3 G +Types:Creature Beast +PT:3/4 +Oracle: diff --git a/forge-gui/res/cardsfolder/upcoming/azorius_knight_arbiter.txt b/forge-gui/res/cardsfolder/upcoming/azorius_knight_arbiter.txt new file mode 100644 index 00000000000..9461b74550e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/azorius_knight_arbiter.txt @@ -0,0 +1,7 @@ +Name:Azorius Knight-Arbiter +ManaCost:3 W U +Types:Creature Human Knight +PT:2/5 +K:Vigilance +K:Unblockable +Oracle:Vigilance\nAzorius Knight-Arbiter can't be blocked. diff --git a/forge-gui/res/cardsfolder/upcoming/azorius_skyguard.txt b/forge-gui/res/cardsfolder/upcoming/azorius_skyguard.txt new file mode 100644 index 00000000000..e6284632953 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/azorius_skyguard.txt @@ -0,0 +1,9 @@ +Name:Azorius Skyguard +ManaCost:4 W U +Types:Creature Human Knight +PT:3/3 +K:Flying +K:First Strike +S:Mode$ Continuous | Affected$ Creature.OppCtrl | AddPower$ -1 | Description$ Creatures your opponents control get -1/-0. +SVar:PlayMain1:TRUE +Oracle:Flying, first strike\nCreatures your opponents control get -1/-0. diff --git a/forge-gui/res/cardsfolder/upcoming/bladebrand.txt b/forge-gui/res/cardsfolder/upcoming/bladebrand.txt new file mode 100644 index 00000000000..fc3a8adad0f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/bladebrand.txt @@ -0,0 +1,6 @@ +Name:Bladebrand +ManaCost:1 B +Types:Instant +A:SP$ Pump | Cost$ 1 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Deathtouch | SubAbility$ DBDraw| SpellDescription$ Target creature gains deathtouch until end of turn. +SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card. +Oracle:Target creature gains deathtouch until end of turn.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/bring_to_trial.txt b/forge-gui/res/cardsfolder/upcoming/bring_to_trial.txt new file mode 100644 index 00000000000..d4adb7b5681 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/bring_to_trial.txt @@ -0,0 +1,5 @@ +Name:Bring to Trial +ManaCost:2 W +Types:Sorcery +A:SP$ ChangeZone | Cost$ 2 W | ValidTgts$ Creature.powerGE4 | TgtPrompt$ Select target creature with power 4 or greater | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target creature with power 4 or greater. +Oracle:Exile target creature with power 4 or greater. diff --git a/forge-gui/res/cardsfolder/upcoming/carrion_imp.txt b/forge-gui/res/cardsfolder/upcoming/carrion_imp.txt new file mode 100644 index 00000000000..aac9ac1c750 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/carrion_imp.txt @@ -0,0 +1,11 @@ +Name:Carrion Imp +ManaCost:3 B +Types:Creature Imp +PT:2/3 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigExile | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may exile target creature card from a graveyard. If you do, you gain 2 life. +SVar:TrigExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Creature | SubAbility$ DBGainLife | RememberChanged$ True +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ1 | References$ X | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Remembered$Amount +Oracle:Flying\nWhen Carrion Imp enters the battlefield, you may exile target creature card from a graveyard. If you do, you gain 2 life. diff --git a/forge-gui/res/cardsfolder/upcoming/catacomb_crocodile.txt b/forge-gui/res/cardsfolder/upcoming/catacomb_crocodile.txt new file mode 100644 index 00000000000..7ec6f765228 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/catacomb_crocodile.txt @@ -0,0 +1,5 @@ +Name:Catacomb Crocodile +ManaCost:4 B +Types:Creature Crocodile +PT:3/7 +Oracle: diff --git a/forge-gui/res/cardsfolder/upcoming/chillbringer.txt b/forge-gui/res/cardsfolder/upcoming/chillbringer.txt new file mode 100644 index 00000000000..d7b4facc2b4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/chillbringer.txt @@ -0,0 +1,10 @@ +Name:Chillbringer +ManaCost:4 U +Types:Creature Elemental +PT:3/3 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ When CARDNAME enters the battlefield, tap target creature an opponent controls. It doesn't untap during its controller's next untap step. +SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls. | SubAbility$ DBPump +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:PlayMain1:TRUE +Oracle:Flying\nWhen Chillbringer enters the battlefield, tap target creature an opponent controls. It doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/civic_stalwart.txt b/forge-gui/res/cardsfolder/upcoming/civic_stalwart.txt new file mode 100644 index 00000000000..335b937c88b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/civic_stalwart.txt @@ -0,0 +1,8 @@ +Name:Civic Stalwart +ManaCost:3 W +Types:Creature Elephant Soldier +PT:3/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ When CARDNAME enters the battlefield, creatures you control get +1/+1 until end of turn. +SVar:TrigPumpAll:DB$ PumpAll | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 +SVar:PlayMain1:TRUE +Oracle:When Civic Stalwart enters the battlefield, creatures you control get +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/clan_guildmage.txt b/forge-gui/res/cardsfolder/upcoming/clan_guildmage.txt new file mode 100644 index 00000000000..1ae84377632 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/clan_guildmage.txt @@ -0,0 +1,7 @@ +Name:Clan Guildmage +ManaCost:R G +Types:Creature Human Shaman +PT:2/2 +A:AB$ Pump | Cost$ 1 R T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME can't block. | IsCurse$ True | SpellDescription$ Target creature can't block this turn. +A:AB$ Animate | Cost$ 2 G T | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | Power$ 4 | Toughness$ 4 | Types$ Creature,Elemental | Keywords$ Haste | SpellDescription$ Target land you control becomes a 4/4 Elemental creature with haste until end of turn. It's still a land. +Oracle:{1}{R}, {T}: Target creature can't block this turn.\n{2}{G}, {T}: Target land you control becomes a 4/4 Elemental creature with haste until end of turn. It's still a land. diff --git a/forge-gui/res/cardsfolder/upcoming/clear_the_mind.txt b/forge-gui/res/cardsfolder/upcoming/clear_the_mind.txt new file mode 100644 index 00000000000..79d53fa54f4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/clear_the_mind.txt @@ -0,0 +1,7 @@ +Name:Clear the Mind +ManaCost:2 U +Types:Sorcery +A:SP$ ChangeZoneAll | Cost$ 2 U | ValidTgts$ Player | TgtPrompt$ Select target player | Origin$ Graveyard | Destination$ Library | ChangeType$ Card | Shuffle$ True | SubAbility$ DBDraw | SpellDescription$ Target player shuffles their graveyard into their library. +SVar:RemRandomDeck:True +SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card. +Oracle:Target player shuffles their graveyard into their library.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/clear_the_stage.txt b/forge-gui/res/cardsfolder/upcoming/clear_the_stage.txt new file mode 100644 index 00000000000..16318c346a5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/clear_the_stage.txt @@ -0,0 +1,6 @@ +Name:Clear the Stage +ManaCost:4 B +Types:Instant +A:SP$ Pump | Cost$ 4 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -3 | NumDef$ -3 | IsCurse$ True | SubAbility$ DBChangeZone | SpellDescription$ Target creature gets -3/-3 until end of turn. If you control a creature with power 4 or greater, you may return up to one target creature card from your graveyard to your hand. +SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | TargetMin$ 0 | TargetMax$ 1 | TargetsWithDefinedController$ ParentTarget | ConditionPresent$ Creature.YouCtrl+powerGE4 +Oracle:Target creature gets -3/-3 until end of turn. If you control a creature with power 4 or greater, you may return up to one target creature card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/upcoming/code_of_constraint.txt b/forge-gui/res/cardsfolder/upcoming/code_of_constraint.txt new file mode 100644 index 00000000000..93f7a6a9ebd --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/code_of_constraint.txt @@ -0,0 +1,9 @@ +Name:Code of Constraint +ManaCost:2 U +Types:Instant +A:SP$ Pump | Cost$ 2 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -4 | IsCurse$ True | SubAbility$ DBDraw | SpellDescription$ Target creature gets -4/-0 until end of turn. +SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card. | SubAbility$ DBAddendum +SVar:DBAddendum:DB$ Tap | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SubAbility$ DBPump | SpellDescription$ Addendum - If you cast this spell during your main phase, tap that creature and it doesn't untap during its controller's next untap step. +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:PlayMain1:TRUE +Oracle:Target creature gets -4/-0 until end of turn.\nDraw a card.\nAddendum — If you cast this spell during your main phase, tap that creature and it doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/consign_to_the_pit.txt b/forge-gui/res/cardsfolder/upcoming/consign_to_the_pit.txt new file mode 100644 index 00000000000..facd95066b4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/consign_to_the_pit.txt @@ -0,0 +1,6 @@ +Name:Consign to the Pit +ManaCost:5 B +Types:Sorcery +A:SP$ Destroy | Cost$ 5 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBDealDamage | SpellDescription$ Destroy target creature. CARDNAME deals 2 damage to that creature's controller. +SVar:DBDealDamage:DB$DealDamage | Defined$ TargetedController | NumDmg$ 2 +Oracle:Destroy target creature. Consign to the Pit deals 2 damage to that creature's controller. diff --git a/forge-gui/res/cardsfolder/upcoming/coral_commando.txt b/forge-gui/res/cardsfolder/upcoming/coral_commando.txt new file mode 100644 index 00000000000..38a6ab893da --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/coral_commando.txt @@ -0,0 +1,5 @@ +Name:Coral Commando +ManaCost:2 U +Types:Creature Merfolk Warrior +PT:3/2 +Oracle: diff --git a/forge-gui/res/cardsfolder/upcoming/dagger_caster.txt b/forge-gui/res/cardsfolder/upcoming/dagger_caster.txt new file mode 100644 index 00000000000..32f457e0788 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/dagger_caster.txt @@ -0,0 +1,8 @@ +Name:Dagger Caster +ManaCost:3 R +Types:Creature Viashino Rogue +PT:2/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDamageAll | TriggerDescription$ When CARDNAME enters the battlefield, it deals 1 damage to each opponent and 1 damage to each creature your opponents control. +SVar:TrigDamageAll:DB$ DamageAll | NumDmg$ 1 | ValidPlayers$ Player.Opponent | SubAbility$ DBDamageCreature +SVar:DBDamageCreature:DB$ DamageAll | NumDmg$ 1 | ValidCards$ Creature.OppCtrl +Oracle:When Dagger Caster enters the battlefield, it deals 1 damage to each opponent and 1 damage to each creature your opponents control. diff --git a/forge-gui/res/cardsfolder/upcoming/dead_revels.txt b/forge-gui/res/cardsfolder/upcoming/dead_revels.txt new file mode 100644 index 00000000000..57c8cffa33b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/dead_revels.txt @@ -0,0 +1,6 @@ +Name:Dead Revels +ManaCost:3 B +Types:Sorcery +K:Spectacle:1 B +A:SP$ ChangeZone | Cost$ 3 B | Origin$ Graveyard | Destination$ Hand | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouOwn | SpellDescription$ Return up to two target creature cards from your graveyard to your hand. +Oracle:Spectacle {1}{B} (You may cast this spell for its spectacle cost rather than its mana cost if an opponent lost life this turn.)\nReturn up to two target creature cards from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/upcoming/debtors_transport.txt b/forge-gui/res/cardsfolder/upcoming/debtors_transport.txt new file mode 100644 index 00000000000..0a9126dbfdb --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/debtors_transport.txt @@ -0,0 +1,6 @@ +Name:Debtors' Transport +ManaCost:5 B +Types:Creature Thrull +PT:5/3 +K:Afterlife:2 +Oracle:Afterlife 2 (When this creature dies, create two 1/1 white and black Spirit creature tokens with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/dovins_automaton.txt b/forge-gui/res/cardsfolder/upcoming/dovins_automaton.txt new file mode 100644 index 00000000000..b29eabea4d9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/dovins_automaton.txt @@ -0,0 +1,7 @@ +Name:Dovin's Automaton +ManaCost:4 +Types:Artifact Creature Homunculus +PT:3/3 +S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Vigilance | IsPresent$ Planeswalker.Dovin+YouCtrl | Description$ As long as you control a planeswalker planeswalker, CARDNAME gets +2/+2 and has vigilance. (Attacking doesn't cause it to tap.) +SVar:BuffedBy:Dovin +Oracle:As long as you control a Dovin planeswalker, Dovin's Automaton gets +2/+2 and has vigilance. (Attacking doesn't cause it to tap.) diff --git a/forge-gui/res/cardsfolder/upcoming/enraged_ceratok.txt b/forge-gui/res/cardsfolder/upcoming/enraged_ceratok.txt new file mode 100644 index 00000000000..d5f0e24dbe4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/enraged_ceratok.txt @@ -0,0 +1,6 @@ +Name:Enraged Ceratok +ManaCost:2 G G +Types:Creature Rhino +PT:4/4 +K:CantBeBlockedBy Creature.powerLE2 +Oracle:Enraged Ceratok can't be blocked by creatures with power 2 or less. diff --git a/forge-gui/res/cardsfolder/upcoming/essence_capture.txt b/forge-gui/res/cardsfolder/upcoming/essence_capture.txt new file mode 100644 index 00000000000..773fd657405 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/essence_capture.txt @@ -0,0 +1,6 @@ +Name:Essence Capture +ManaCost:U U +Types:Instant +A:SP$ Counter | Cost$ U U | TargetType$ Spell | TgtPrompt$ Select target Creature spell | ValidTgts$ Creature | SubAbility$ DBPutCounter | SpellDescription$ Counter target creature spell. Put a +1/+1 counter on up to one target creature you control. +SVar:DBPutCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ 1 | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target creature you control | ValidTgts$ Creature.YouCtrl +Oracle:Counter target creature spell. Put a +1/+1 counter on up to one target creature you control. diff --git a/forge-gui/res/cardsfolder/upcoming/ethereal_absolution.txt b/forge-gui/res/cardsfolder/upcoming/ethereal_absolution.txt new file mode 100644 index 00000000000..11450772185 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ethereal_absolution.txt @@ -0,0 +1,10 @@ +Name:Ethereal Absolution +ManaCost:4 W B +Types:Enchantment +S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Creatures you control get +1/+1. +S:Mode$ Continuous | Affected$ Creature.OppCtrl | AddPower$ -1 | AddToughness$ -1 | Description$ Creatures your opponents control get -1/-1. +SVar:PlayMain1:TRUE +SVar:RemRandomDeck:True +A:AB$ ChangeZone | Cost$ 4 W B | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Card.OppOwn | SubAbility$ DBToken | SpellDescription$ Exile target card from an opponent's graveyard. If it was a creature card, you create a 1/1 white and black Spirit creature token with flying. +SVar:DBToken:DB$ Token | ConditionDefined$ Targeted | ConditionPresent$ Creature | ConditionCompare$ EQ1 | TokenAmount$ 1 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenOwner$ You | TokenColors$ White,Black | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SubAbility$ DBCleanup +Oracle:Creatures you control get +1/+1.\nCreatures your opponents control get -1/-1.\n{2}{W}{B}: Exile target card from an opponent's graveyard. If it was a creature card, you create a 1/1 white and black Spirit creature token with flying. diff --git a/forge-gui/res/cardsfolder/upcoming/expose_to_daylight.txt b/forge-gui/res/cardsfolder/upcoming/expose_to_daylight.txt new file mode 100644 index 00000000000..dc73e1d21f9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/expose_to_daylight.txt @@ -0,0 +1,6 @@ +Name:Expose to Daylight +ManaCost:2 W +Types:Instant +A:SP$ Destroy | Cost$ 2 W | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SubAbility$ DBScry | SpellDescription$ Destroy target artifact or enchantment. Scry 1. +SVar:DBScry:DB$ Scry | ScryNum$ 1 +Oracle:Destroy target artifact or enchantment. Scry 1. diff --git a/forge-gui/res/cardsfolder/upcoming/eyes_everywhere.txt b/forge-gui/res/cardsfolder/upcoming/eyes_everywhere.txt new file mode 100644 index 00000000000..eced00e2941 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/eyes_everywhere.txt @@ -0,0 +1,7 @@ +Name:Eyes Everywhere +ManaCost:2 U +Types:Enchantment +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigScry | TriggerDescription$ At the beginning of your upkeep, scry 1. +SVar:TrigScry:DB$ Scry | ScryNum$ 1 +A:AB$ ExchangeControl | Cost$ 2 U | Defined$ Self | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | SorcerySpeed$ True | SpellDescription$ Exchange control of CARDNAME and target nonland permanent. Activate this ability only any time you could cast a sorcery. +Oracle:At the beginning of your upkeep, scry 1.\n{5}{U}: Exchange control of Eyes Everywhere and target nonland permanent. Activate this ability only any time you could cast a sorcery. diff --git a/forge-gui/res/cardsfolder/upcoming/faerie_duelist.txt b/forge-gui/res/cardsfolder/upcoming/faerie_duelist.txt new file mode 100644 index 00000000000..9b143737a7f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/faerie_duelist.txt @@ -0,0 +1,9 @@ +Name:Faerie Duelist +ManaCost:1 U +Types:Creature Faerie Rogue +PT:1/2 +K:Flash +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature an opponent controls gets -2/-0 until end of turn. +SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | NumAtt$ -2 | IsCurse$ True +Oracle:Flash\nFlying\nWhen Faerie Duelist enters the battlefield, target creature an opponent controls gets -2/-0 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/feral_maaka.txt b/forge-gui/res/cardsfolder/upcoming/feral_maaka.txt new file mode 100644 index 00000000000..770a107a762 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/feral_maaka.txt @@ -0,0 +1,5 @@ +Name:Feral Maaka +ManaCost:1 R +Types:Creature Cat +PT:2/2 +Oracle: diff --git a/forge-gui/res/cardsfolder/upcoming/gateway_sneak.txt b/forge-gui/res/cardsfolder/upcoming/gateway_sneak.txt new file mode 100644 index 00000000000..d161e4fe77d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/gateway_sneak.txt @@ -0,0 +1,10 @@ +Name:Gateway Sneak +ManaCost:2 U +Types:Creature Vedalken Rogue +PT:1/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Gate.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a Gate enters the battlefield under your control, CARDNAME can't be blocked this turn. +SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ HIDDEN Unblockable | SpellDescription$ CARDNAME can't be blocked this turn. +SVar:PlayMain1:TRUE +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, draw a card. +SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 +Oracle:Whenever a Gate enters the battlefield under your control, Gateway Sneak can't be blocked this turn.\nWhenever Gateway Sneak deals combat damage to a player, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/ghor_clan_wrecker.txt b/forge-gui/res/cardsfolder/upcoming/ghor_clan_wrecker.txt new file mode 100644 index 00000000000..06d74a0cde7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ghor_clan_wrecker.txt @@ -0,0 +1,7 @@ +Name:Ghor-Clan Wrecker +ManaCost:3 R +Types:Creature Human Warrior +PT:2/2 +K:Riot +K:Menace +Oracle:Riot (This creature enters the battlefield with your choice of a +1/1+ counter or haste.)\nMenace (This creature can't be blocked except by two or more creatures.) diff --git a/forge-gui/res/cardsfolder/upcoming/glass_of_the_guildpact.txt b/forge-gui/res/cardsfolder/upcoming/glass_of_the_guildpact.txt new file mode 100644 index 00000000000..770cb42defe --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/glass_of_the_guildpact.txt @@ -0,0 +1,6 @@ +Name:Glass of the Guildpact +ManaCost:2 +Types:Artifact +S:Mode$ Continuous | Affected$ Creature.MultiColor+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Multicolored creatures you control get +1/+1. +SVar:PlayMain1:TRUE +Oracle:Multicolored creatures you control get +1/+1. diff --git a/forge-gui/res/cardsfolder/upcoming/goblin_gathering.txt b/forge-gui/res/cardsfolder/upcoming/goblin_gathering.txt new file mode 100644 index 00000000000..0e43db0e315 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/goblin_gathering.txt @@ -0,0 +1,7 @@ +Name:Goblin Gathering +ManaCost:2 R +Types:Sorcery +A:SP$ Token | Cost$ 2 R | TokenAmount$ X | TokenName$ Goblin | TokenTypes$ Creature,Goblin | TokenOwner$ You | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 | References$ X | SpellDescription$ Create a number of 1/1 red Goblin creature tokens equal to two plus the number of cards named CARDNAME in your graveyard. +SVar:X:Count$ValidGraveyard Card.YouOwn+namedGoblin Gathering/Plus.2 +DeckHints:Name$Goblin Gathering +Oracle:Create a number of 1/1 red Goblin creature tokens equal to two plus the number of cards named Goblin Gathering in your graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/gravel_hide_goblin.txt b/forge-gui/res/cardsfolder/upcoming/gravel_hide_goblin.txt new file mode 100644 index 00000000000..71a8d428c5b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/gravel_hide_goblin.txt @@ -0,0 +1,6 @@ +Name:Gravel-Hide Goblin +ManaCost:1 R +Types:Creature Goblin Shaman +PT:2/1 +A:AB$ Pump | Cost$ 3 G | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ CARDNAME gets +2/+2 until end of turn. +Oracle:{3}{G}: Gravel-Hide Goblin gets +2/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/grotesque_demise.txt b/forge-gui/res/cardsfolder/upcoming/grotesque_demise.txt new file mode 100644 index 00000000000..a38aaa8bfbd --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/grotesque_demise.txt @@ -0,0 +1,5 @@ +Name:Grotesque Demise +ManaCost:2 B +Types:Instant +A:SP$ ChangeZone | Cost$ 2 B | ValidTgts$ Creature.powerLE3 | TgtPrompt$ Select target creature with power 3 or less | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target creature with power 3 or less. +Oracle:Exile target creature with power 3 or less. diff --git a/forge-gui/res/cardsfolder/upcoming/gyre_engineer.txt b/forge-gui/res/cardsfolder/upcoming/gyre_engineer.txt new file mode 100644 index 00000000000..6c6cbc0303d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/gyre_engineer.txt @@ -0,0 +1,6 @@ +Name:Gyre Engineer +ManaCost:1 G U +Types:Creature Vedalken Wizard +PT:1/1 +A:AB$ Mana | Cost$ T | Produced$ G U | SpellDescription$ Add {G}{U}. +Oracle:{T}: Add {G}{U}. diff --git a/forge-gui/res/cardsfolder/upcoming/ill_gotten_inheritance.txt b/forge-gui/res/cardsfolder/upcoming/ill_gotten_inheritance.txt new file mode 100644 index 00000000000..5c3658aca13 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ill_gotten_inheritance.txt @@ -0,0 +1,9 @@ +Name:Ill-Gotten Inheritance +ManaCost:3 B +Types:Enchantment +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDamageAll | TriggerDescription$ At the beginning of your upkeep, CARDNAME deals 1 damage to each opponent and you gain 1 life. +SVar:TrigDealDamage:DB$ DamageAll | ValidPlayers$ Player.Opponent | NumDmg$ 1 | SubAbility$ DBGainLife +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 +A:AB$ DealDamage | Cost$ 5 B Sac<1/CARDNAME> | ValidTgts$ Opponent | NumDmg$ 4 | SubAbility$ DBGainLife | SpellDescription$ CARDNAME deals 4 damage to target opponent and you gain 4 life. +SVar:DBGainLife:DB$GainLife | LifeAmount$ 4 +Oracle:At the beginning of your upkeep, Ill-Gotten Inheritance deals 1 damage to each opponent and you gain 1 life.\n{5}{B}, Sacrifice Ill-Gotten Inheritance: It deals 4 damage to target opponent and you gain 4 life. diff --git a/forge-gui/res/cardsfolder/upcoming/impassioned_orator.txt b/forge-gui/res/cardsfolder/upcoming/impassioned_orator.txt new file mode 100644 index 00000000000..6be0f322e46 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/impassioned_orator.txt @@ -0,0 +1,7 @@ +Name:Impassioned Orator +ManaCost:1 W +Types:Creature Human Cleric +PT:2/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever another creature enters the battlefield under your control, you gain 1 life. +SVar:TrigGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 +Oracle:Whenever another creature enters the battlefield under your control, you gain 1 life. diff --git a/forge-gui/res/cardsfolder/upcoming/justiciars_portal.txt b/forge-gui/res/cardsfolder/upcoming/justiciars_portal.txt new file mode 100644 index 00000000000..81c7892052d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/justiciars_portal.txt @@ -0,0 +1,8 @@ +Name:Justiciar's Portal +ManaCost:1 W +Types:Instant +A:SP$ ChangeZone | Cost$ 1 W | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | RememberTargets$ True | SubAbility$ DBReturn | SpellDescription$ Exile target creature you control, then return that card to the battlefield under its owner's control. It gains first strike until end of turn. +SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ All | Destination$ Battlefield | SubAbility$ DBPump +SVar:DBPump:DB$ Pump | Defined$ Remembered | KW$ First Strike | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +Oracle:Exile target creature you control, then return that card to the battlefield under its owner's control. It gains first strike until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/knight_of_sorrows.txt b/forge-gui/res/cardsfolder/upcoming/knight_of_sorrows.txt new file mode 100644 index 00000000000..74099e548aa --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/knight_of_sorrows.txt @@ -0,0 +1,7 @@ +Name:Knight of Sorrows +ManaCost:4 W +Types:Creature Human Knight +PT:3/3 +K:CARDNAME can block an additional creature each combat. +K:Afterlife 1 +Oracle:Knight of Sorrows can block an additional creature each combat.\nAfterlife 1 (When this creature dies, create a 1/1 white and black Spirit creature token with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/knight_of_the_last_breath.txt b/forge-gui/res/cardsfolder/upcoming/knight_of_the_last_breath.txt new file mode 100644 index 00000000000..170331fce33 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/knight_of_the_last_breath.txt @@ -0,0 +1,8 @@ +Name:Knight of the Last Breath +ManaCost:5 W B +Types:Creature Giant Knight +PT:4/4 +A:AB$ Token | Cost$ 3 Sac<1/Creature.nonToken+Other/another creature> | TokenAmount$ 1 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenOwner$ You | TokenColors$ White,Black | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SpellDescription$ Create a 1/1 white and black Spirit creature token with flying. +SVar:RemRandomDeck:True +K:Afterlife 3 +Oracle:{3}, Sacrifice another nontoken creature: Create a 1/1 white and black Spirit creature token with flying.\nAfterlife 3 (When this creature dies, create three 1/1 white and black Spirit creature tokens with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/macabre_mockery.txt b/forge-gui/res/cardsfolder/upcoming/macabre_mockery.txt new file mode 100644 index 00000000000..e61dc99c6a7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/macabre_mockery.txt @@ -0,0 +1,7 @@ +Name:Macabre Mockery +ManaCost:2 B R +Types:Instant +A:SP$ ChangeZone | Cost$ 2 B R | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | TgtPrompt$ Choose target creature card in an opponent's graveyard | ValidTgts$ Creature.OppCtrl | SubAbility$ DBPump | SpellDescription$ Put target creature card from an opponent's graveyard onto the battlefield under your control. It gets +2/+0 and gains haste until end of turn. Sacrifice it at the beginning of the next end step. +SVar:DBPump:DB$ Pump | Defined$ Targeted | NumAtt$ +2 | KW$ Haste | AtEOT$ Sacrifice +SVar:PlayMain1:TRUE +Oracle:Put target creature card from an opponent's graveyard onto the battlefield under your control. It gets +2/+0 and gains haste until end of turn. Sacrifice it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/upcoming/noxious_groodion.txt b/forge-gui/res/cardsfolder/upcoming/noxious_groodion.txt new file mode 100644 index 00000000000..6ea726468d0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/noxious_groodion.txt @@ -0,0 +1,6 @@ +Name:Noxious Groodion +ManaCost:2 B +Types:Creature Beast +PT:2/2 +K:Deathtouch +Oracle:Deathtouch diff --git a/forge-gui/res/cardsfolder/upcoming/open_the_gates.txt b/forge-gui/res/cardsfolder/upcoming/open_the_gates.txt new file mode 100644 index 00000000000..68d168e5e49 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/open_the_gates.txt @@ -0,0 +1,5 @@ +Name:Open the Gates +ManaCost:G +Types:Sorcery +A:SP$ ChangeZone | Cost$ G | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic,Card.Gate | ChangeNum$ 1 | SpellDescription$ Search your library for a basic land card or a Gate card, reveal it, put it into your hand, then shuffle your library. +Oracle:Search your library for a basic land card or a Gate card, reveal it, put it into your hand, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/upcoming/orzhov_enforcer.txt b/forge-gui/res/cardsfolder/upcoming/orzhov_enforcer.txt new file mode 100644 index 00000000000..1821f313fc5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/orzhov_enforcer.txt @@ -0,0 +1,7 @@ +Name:Orzhov Enforcer +ManaCost:1 B +Types:Creature Human Rogue +PT:1/2 +K:Deathtouch +K:Afterlife 1 +Oracle:Deathtouch\nAfterlife 1 (When this creature dies, create a 1/1 white and black Spirit creature token with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/plague_wight.txt b/forge-gui/res/cardsfolder/upcoming/plague_wight.txt new file mode 100644 index 00000000000..6c461d2ec21 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/plague_wight.txt @@ -0,0 +1,7 @@ +Name:Plague Wight +ManaCost:1 B +Types:Creature Zombie +PT:2/1 +T:Mode$ AttackerBlocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME becomes blocked, each creature blocking it gets -1/-1 until end of turn. +SVar:TrigPump:DB$PumpAll | ValidCards$ Creature.blockingSource+DefenderCtrl | NumAtt$ -1 | NumDef$ -1 +Oracle:Whenever Plague Wight becomes blocked, each creature blocking it gets -1/-1 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/plaza_of_harmony.txt b/forge-gui/res/cardsfolder/upcoming/plaza_of_harmony.txt new file mode 100644 index 00000000000..8606fbf3076 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/plaza_of_harmony.txt @@ -0,0 +1,9 @@ +Name:Plaza of Harmony +ManaCost: +Types:Land +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | IsPresent$ Gate.YouCtrl | PresentCompare$ GE2 | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, if you control two or more Gates, gain 3 life. +SVar:TrigGainLife:DB$ GainLife | LifeAmount$ 3 +DeckHints:Type$Gate +A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. +A:AB$ ManaReflected | Cost$ T | ColorOrType$ Type | Valid$ Gate.YouCtrl | ReflectProperty$ Produce | SpellDescription$ Add one mana of any type a Gate you control could produce. +Oracle:When Plaza of Harmony enters the battlefield, if you control two or more Gates, you gain 3 life.\n{T}: Add {C}.\n{T}: Add one mana of any type a Gate you control could produce. diff --git a/forge-gui/res/cardsfolder/upcoming/prowling_caracal.txt b/forge-gui/res/cardsfolder/upcoming/prowling_caracal.txt new file mode 100644 index 00000000000..43622f96ba5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/prowling_caracal.txt @@ -0,0 +1,5 @@ +Name:Prowling Caracal +ManaCost:1 W +Types:Creature Cat +PT:3/1 +Oracle: diff --git a/forge-gui/res/cardsfolder/upcoming/prying_eyes.txt b/forge-gui/res/cardsfolder/upcoming/prying_eyes.txt new file mode 100644 index 00000000000..5b3987a99bb --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/prying_eyes.txt @@ -0,0 +1,6 @@ +Name:Prying Eyes +ManaCost:4 U U +Types:Instant +A:SP$ Draw | Cost$ 4 U U | NumCards$ 4 | SpellDescription$ Draw four cards, then discard two cards.| SubAbility$ DBDiscard +SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 2 | Mode$ TgtChoose +Oracle:Draw four cards, then discard two cards. diff --git a/forge-gui/res/cardsfolder/upcoming/ragefire.txt b/forge-gui/res/cardsfolder/upcoming/ragefire.txt new file mode 100644 index 00000000000..f21af5614c2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ragefire.txt @@ -0,0 +1,5 @@ +Name:Ragefire +ManaCost:1 R +Types:Sorcery +A:SP$ DealDamage | Cost$ 1 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target creature. +Oracle:Ragefire deals 3 damage to target creature. diff --git a/forge-gui/res/cardsfolder/upcoming/rakdos_trumpeter.txt b/forge-gui/res/cardsfolder/upcoming/rakdos_trumpeter.txt new file mode 100644 index 00000000000..1c12a126ff9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rakdos_trumpeter.txt @@ -0,0 +1,7 @@ +Name:Rakdos Trumpeter +ManaCost:1 B +Types:Creature Human Shaman +PT:1/3 +K:Menace +A:AB$ Pump | Cost$ 3 R | NumAtt$ +2 | SpellDescription$ CARDNAME gets +2/+0 until end of turn. +Oracle:Menace (This creature can't be blocked except by two or more creatures.)\n{3}{R}: Rakdos Trumpeter gets +2/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/rally_to_battle.txt b/forge-gui/res/cardsfolder/upcoming/rally_to_battle.txt new file mode 100644 index 00000000000..c0049df3fc0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rally_to_battle.txt @@ -0,0 +1,6 @@ +Name:Rally to Battle +ManaCost:3 W +Types:Instant +A:SP$ PumpAll | Cost$ 3 W | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +3 | SubAbility$ DBUntapAll | SpellDescription$ Creatures you control get +1/+3 until end of turn. Untap them. +SVar:DBUntapAll:DB$ UntapAll | ValidCards$ Creature.YouCtrl +Oracle:Creatures you control get +1/+3 until end of turn. Untap them. diff --git a/forge-gui/res/cardsfolder/upcoming/rampaging_rendhorn.txt b/forge-gui/res/cardsfolder/upcoming/rampaging_rendhorn.txt new file mode 100644 index 00000000000..dcdbf63e0db --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rampaging_rendhorn.txt @@ -0,0 +1,6 @@ +Name:Rampaging Rendhorn +ManaCost:4 G +Types:Creature Beast +PT:4/4 +K:Riot +Oracle:Riot (This creature enters the battlefield with your choice of a +1/+1 counter or haste.) diff --git a/forge-gui/res/cardsfolder/upcoming/regenesis.txt b/forge-gui/res/cardsfolder/upcoming/regenesis.txt new file mode 100644 index 00000000000..5b1ae953f77 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/regenesis.txt @@ -0,0 +1,5 @@ +Name:Regenesis +ManaCost:3 G G +Types:Instant +A:SP$ ChangeZone | Cost$ 3 G G | Origin$ Graveyard | Destination$ Hand | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Choose target permanent card in your graveyard | ValidTgts$ Permanent.YouCtrl | SpellDescription$ Return up to two target permanent cards from your graveyard to your hand. +Oracle:Return up to two target permanent cards from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/upcoming/resolute_watchdog.txt b/forge-gui/res/cardsfolder/upcoming/resolute_watchdog.txt new file mode 100644 index 00000000000..af8cbf5a683 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/resolute_watchdog.txt @@ -0,0 +1,7 @@ +Name:Resolute Watchdog +ManaCost:W +Types:Creature Hound +PT:1/3 +K:Defender +A:AB$ Pump | Cost$ 1 Sac<1/CARDNAME> | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | KW$ Indestructible | SpellDescription$ Target creature you control gains indestructible until end of turn. +Oracle:Defender\n{1}, Sacrifice Resolute Watchdog: Target creature you control gains indestructible until end of turn. (Damage and effects that say "destroy" don't destroy it.) diff --git a/forge-gui/res/cardsfolder/upcoming/rubble_reading.txt b/forge-gui/res/cardsfolder/upcoming/rubble_reading.txt new file mode 100644 index 00000000000..fdbde5c9608 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rubble_reading.txt @@ -0,0 +1,6 @@ +Name:Rubble Reading +ManaCost:3 R +Types:Sorcery +A:SP$ Destroy | Cost$ 3 R | ValidTgts$ Land | TgtPrompt$ Select target land | SubAbility$ DBScry | SpellDescription$ Destroy target land. Scry 2. +SVar:DBScry:DB$Scry | ScryNum$ 2 +Oracle:Destroy target land. Scry 2. diff --git a/forge-gui/res/cardsfolder/upcoming/rubblebelt_recluse.txt b/forge-gui/res/cardsfolder/upcoming/rubblebelt_recluse.txt new file mode 100644 index 00000000000..0862383ae52 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rubblebelt_recluse.txt @@ -0,0 +1,6 @@ +Name:Rubblebelt Recluse +ManaCost:4 R +Types:Creature Ogre Berserker +PT:6/5 +K:CARDNAME attacks each combat if able. +Oracle:Rubblebelt Recluse attacks each combat if able. diff --git a/forge-gui/res/cardsfolder/upcoming/sages_row_savant.txt b/forge-gui/res/cardsfolder/upcoming/sages_row_savant.txt new file mode 100644 index 00000000000..61e21e624a9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sages_row_savant.txt @@ -0,0 +1,7 @@ +Name:Sage's Row Savant +ManaCost:1 U +Types:Creature Vedalken Wizard +PT:2/1 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigScry | TriggerDescription$ When CARDNAME enters the battlefield, scry 2. +SVar:TrigScry:DB$ Scry | ScryNum$ 2 +Oracle:When Sage's Row Savant enters the battlefield, scry 2. diff --git a/forge-gui/res/cardsfolder/upcoming/sagittars_volley.txt b/forge-gui/res/cardsfolder/upcoming/sagittars_volley.txt new file mode 100644 index 00000000000..3577aa4baec --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sagittars_volley.txt @@ -0,0 +1,6 @@ +Name:Sagittars' Volley +ManaCost:2 G +Types:Instant +A:SP$ Destroy | Cost$ 2 G | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | SubAbility$ DBDamageAll | SpellDescription$ Destroy target creature with flying. CARDNAME deals 1 damage to each creature with flying your opponents control. +SVar:DBDamageAll:DB$DamageAll | NumDmg$ 1 | ValidCards$ Creature.withFlying+OppCtrl +Oracle:Destroy target creature with flying. Sagittars' Volley deals 1 damage to each creature with flying your opponents control. diff --git a/forge-gui/res/cardsfolder/upcoming/saruli_caretaker.txt b/forge-gui/res/cardsfolder/upcoming/saruli_caretaker.txt new file mode 100644 index 00000000000..4f9279dd886 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/saruli_caretaker.txt @@ -0,0 +1,7 @@ +Name:Saruli Caretaker +ManaCost:G +Types:Creature Dryad +PT:0/3 +K:Defender +A:AB$ Mana | Cost$ T tapXType<1/Creature> | Produced$ Any | SpellDescription$ Add one mana of any color. +Oracle:Defender\n{T}, Tap an untapped creature you control: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/upcoming/scorchmark.txt b/forge-gui/res/cardsfolder/upcoming/scorchmark.txt new file mode 100644 index 00000000000..62ba4fe6e95 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/scorchmark.txt @@ -0,0 +1,5 @@ +Name:Scorchmark +ManaCost:1 R +Types:Instant +A:SP$ DealDamage | Cost$ 1 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 2 | ReplaceDyingDefined$ Targeted | SpellDescription$ CARDNAME deals 2 damage to target creature. If that creature would die this turn, exile it instead. +Oracle:Scorchmark deals 2 damage to target creature. If that creature would die this turn, exile it instead. diff --git a/forge-gui/res/cardsfolder/upcoming/senate_courier.txt b/forge-gui/res/cardsfolder/upcoming/senate_courier.txt new file mode 100644 index 00000000000..abf0ffe44a7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/senate_courier.txt @@ -0,0 +1,7 @@ +Name:Senate Courier +ManaCost:2 U +Types:Creature Bird +PT:1/4 +K:Flying +A:AB$ Pump | Cost$ 1 W | Defined$ Self | KW$ Vigilance | SpellDescription$ CARDNAME gains vigilance until end of turn. +Oracle:Flying\n{1}{W}: Senate Courier gains vigilance until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/senate_guildmage.txt b/forge-gui/res/cardsfolder/upcoming/senate_guildmage.txt new file mode 100644 index 00000000000..ba151e35c78 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/senate_guildmage.txt @@ -0,0 +1,8 @@ +Name:Senate Guildmage +ManaCost:W U +Types:Creature Human Wizard +PT:2/2 +A:AB$ GainLife | Cost$ W T | LifeAmount$ 2 | SpellDescription$ You gain 2 life. +A:AB$ Draw | Cost$ U T | NumCards$ 1 | SpellDescription$ Draw a card, then discard a card. | SubAbility$ DBDiscard +SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose +Oracle:{W}, {T}: You gain 2 life.\n{U}, {T}: Draw a card, then discard a card. diff --git a/forge-gui/res/cardsfolder/upcoming/sharktocrab.txt b/forge-gui/res/cardsfolder/upcoming/sharktocrab.txt new file mode 100644 index 00000000000..ca3af405231 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sharktocrab.txt @@ -0,0 +1,11 @@ +Name:Sharktocrab +ManaCost:2 G U +Types:Creature Fish Octopus Crab +PT:4/4 +K:Adapt:1 +DeckHas:Ability$Counters +T:Mode$ CounterAddedOnce | ValidCard$ Card.Self | TriggerZones$ Battlefield | CounterType$ P1P1 | Execute$ TrigTap | TriggerDescription$ Whenever one or more +1/+1 counter are put on CARDNAME, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. +SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls. | SubAbility$ DBPump +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:HasAttackEffect:TRUE +Oracle:{2}{G}{U}: Adapt 1. (If this creature has no +1/+1 counters on it, put a +1/+1 counter on it.)\nWhenever one or more +1/+1 counter are put on Sharktocrab, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/shimmer_of_possibility.txt b/forge-gui/res/cardsfolder/upcoming/shimmer_of_possibility.txt new file mode 100644 index 00000000000..f554272ecf9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/shimmer_of_possibility.txt @@ -0,0 +1,5 @@ +Name:Shimmer of Possibility +ManaCost:1 U +Types:Sorcery +A:SP$ Dig | Cost$ 1 U | DigNum$ 4 | ChangeNum$ 1 | SpellDescription$ Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in a random order. +Oracle:Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in a random order. diff --git a/forge-gui/res/cardsfolder/upcoming/skitter_eel.txt b/forge-gui/res/cardsfolder/upcoming/skitter_eel.txt new file mode 100644 index 00000000000..55acd7e4e76 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/skitter_eel.txt @@ -0,0 +1,7 @@ +Name:Skitter Eel +ManaCost:3 U +Types:Creature Fish Crab +PT:3/3 +K:Adapt:2 +DeckHas:Ability$Counters +Oracle:{2}{U}: Adapt 2. (If this creature has no +1/+1 counters on it, put two +1/+1 counters on it.) diff --git a/forge-gui/res/cardsfolder/upcoming/sky_tether.txt b/forge-gui/res/cardsfolder/upcoming/sky_tether.txt new file mode 100644 index 00000000000..391c4301b0c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sky_tether.txt @@ -0,0 +1,7 @@ +Name:Sky Tether +ManaCost:W +Types:Enchantment Aura +K:Enchant creature +A:SP$ Attach | Cost$ W | ValidTgts$ Creature | AILogic$ Curse +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Defender | RemoveKeyword$ Flying | Description$ Enchanted creature has defender and loses flying. +Oracle:Enchant creature\nEnchanted creature has defender and loses flying. diff --git a/forge-gui/res/cardsfolder/upcoming/slimebind.txt b/forge-gui/res/cardsfolder/upcoming/slimebind.txt new file mode 100644 index 00000000000..ab4598049e0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/slimebind.txt @@ -0,0 +1,8 @@ +Name:Slimebind +ManaCost:1 U +Types:Enchantment Aura +K:Flash +K:Enchant creature +A:SP$ Attach | Cost$ 1 U | ValidTgts$ Creature | AILogic$ Curse +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ -4 | Description$ Enchanted creature gets -4/-0. +Oracle:Flash\nEnchant creature\nEnchanted creature gets -4/-0. diff --git a/forge-gui/res/cardsfolder/upcoming/spear_spewer.txt b/forge-gui/res/cardsfolder/upcoming/spear_spewer.txt new file mode 100644 index 00000000000..1b82793f9fb --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/spear_spewer.txt @@ -0,0 +1,8 @@ +Name:Spear Spewer +ManaCost:R +Types:Creature Goblin Warrior +PT:0/2 +K:Defender +A:AB$ DealDamage | Cost$ T | NumDmg$ 1 | ValidPlayers$ Player | ValidDescription$ each player. | SpellDescription$ CARDNAME deals 1 damage to each player. +SVar:NonCombatPriority:1 +Oracle:Defender\n{T}: Spear Spewer deals 1 damage to each player. diff --git a/forge-gui/res/cardsfolder/upcoming/sphinx_of_the_guildpact.txt b/forge-gui/res/cardsfolder/upcoming/sphinx_of_the_guildpact.txt new file mode 100644 index 00000000000..942bcf5ab61 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sphinx_of_the_guildpact.txt @@ -0,0 +1,8 @@ +Name:Sphinx of the Guildpact +ManaCost:7 +Types:Artifact Creature Sphinx +PT:5/5 +K:CARDNAME is all colors. +K:Flying +K:Hexproof:Card.MonoColor:monocolored +Oracle:Sphinx of the Guildpact is all colors.\nFlying\nHexproof from monocolored (This creature can't be the target of monocolored spells or abilities your opponents control.) diff --git a/forge-gui/res/cardsfolder/upcoming/spire_mangler.txt b/forge-gui/res/cardsfolder/upcoming/spire_mangler.txt new file mode 100644 index 00000000000..d765aa68b6c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/spire_mangler.txt @@ -0,0 +1,10 @@ +Name:Spire Mangler +ManaCost:2 B +Types:Creature Insect +PT:2/1 +K:Flash +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature with flying you control gets +2/+0 until end of turn. +SVar:TrigPump:DB$Pump | ValidTgts$ Creature.YouCtrl+withFlying | TgtPrompt$ Select target creature with flying you control | NumAtt$ +2 +SVar:PlayMain1:TRUE +Oracle:Flash\nFlying\nWhen Spire Mangler enters the battlefield, target creature with flying you control gets +2/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/spirit_of_the_spires.txt b/forge-gui/res/cardsfolder/upcoming/spirit_of_the_spires.txt new file mode 100644 index 00000000000..fad77d79e9c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/spirit_of_the_spires.txt @@ -0,0 +1,8 @@ +Name:Spirit of the Spires +ManaCost:3 W +Types:Creature Spirit +PT:2/4 +K:Flying +S:Mode$ Continuous | Affected$ Creature.withFlying+Other+YouCtrl | AddToughness$ 1 | Description$ Other creatures you control with flying get +0/+1. +SVar:PlayMain1:TRUE +Oracle:Flying\nOther creatures you control with flying get +0/+1. diff --git a/forge-gui/res/cardsfolder/upcoming/steeple_creeper.txt b/forge-gui/res/cardsfolder/upcoming/steeple_creeper.txt new file mode 100644 index 00000000000..101278a60d2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/steeple_creeper.txt @@ -0,0 +1,6 @@ +Name:Steeple Creeper +ManaCost:2 G +Types:Creature Frog Snake +PT:4/2 +A:AB$ Pump | Cost$ 3 U | Defined$ Self | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. +Oracle:{3}{U}: Steeple Creeper gains flying until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/stony_strength.txt b/forge-gui/res/cardsfolder/upcoming/stony_strength.txt new file mode 100644 index 00000000000..3db8c017468 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/stony_strength.txt @@ -0,0 +1,7 @@ +Name:Stony Strength +ManaCost:G +Types:Instant +A:SP$ PutCounter | Cost$ G | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBUntap | SpellDescription$ Put a +1/+1 counter on target creature you control. Untap that creature. +SVar:DBUntap:DB$ Untap | Defined$ Targeted +DeckHas:Ability$Counters +Oracle:Put a +1/+1 counter on target creature you control. Untap that creature. diff --git a/forge-gui/res/cardsfolder/upcoming/storm_strike.txt b/forge-gui/res/cardsfolder/upcoming/storm_strike.txt new file mode 100644 index 00000000000..cb773090788 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/storm_strike.txt @@ -0,0 +1,6 @@ +Name:Storm Strike +ManaCost:R +Types:Instant +A:SP$ Pump | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | KW$ First Strike | SubAbility$ DBScry | SpellDescription$ Target creature gets +1/+0 and gains first strike until end of turn. Scry 1. +SVar:DBScry:DB$ Scry | ScryNum$ 1 +Oracle:Target creature gets +1/+0 and gains first strike until end of turn. Scry 1. diff --git a/forge-gui/res/cardsfolder/upcoming/sunder_shaman.txt b/forge-gui/res/cardsfolder/upcoming/sunder_shaman.txt new file mode 100644 index 00000000000..955f4d7deeb --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sunder_shaman.txt @@ -0,0 +1,8 @@ +Name:Sunder Shaman +ManaCost:R R G G +Types:Creature Giant Shaman +PT:5/5 +K:CantBeBlockedByAmount GT1 +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDestroy | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, destroy target artifact or enchantment that player controls. +SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Artifact.DefenderCtrl,Enchantment.DefenderCtrl | TgtPrompt$ Select target artifact or enchantment that player controls. +Oracle:Sunder Shaman can't be blocked by more than one creature.\nWhenever Sunder Shaman deals combat damage to a player, destroy target artifact or enchantment that player controls. diff --git a/forge-gui/res/cardsfolder/upcoming/sylvan_brushstrider.txt b/forge-gui/res/cardsfolder/upcoming/sylvan_brushstrider.txt new file mode 100644 index 00000000000..a2465c1048c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sylvan_brushstrider.txt @@ -0,0 +1,7 @@ +Name:Sylvan Brushstrider +ManaCost:2 G +Types:Creature Beast +PT:3/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 2 life. +SVar:TrigGainLife:DB$GainLife | LifeAmount$ 2 +Oracle:When Sylvan Brushstrider enters the battlefield, you gain 2 life. diff --git a/forge-gui/res/cardsfolder/upcoming/syndicate_messenger.txt b/forge-gui/res/cardsfolder/upcoming/syndicate_messenger.txt new file mode 100644 index 00000000000..9eb142510cb --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/syndicate_messenger.txt @@ -0,0 +1,7 @@ +Name:Syndicate Messenger +ManaCost:3 W +Types:Creature Bird +PT:2/3 +K:Flying +K:Afterlife 1 +Oracle:Flying\nAfterlife 1 (When this creature dies, create a 1/1 white and black Spirit creature token with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/tenth_district_veteran.txt b/forge-gui/res/cardsfolder/upcoming/tenth_district_veteran.txt new file mode 100644 index 00000000000..49bee774adf --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tenth_district_veteran.txt @@ -0,0 +1,8 @@ +Name:Tenth District Veteran +ManaCost:2 W +Types:Creature Human Soldier +PT:2/3 +K:Vigilance +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigUntap | TriggerDescription$ Whenever CARDNAME attacks, untap another target creature you control. +SVar:TrigUntap:DB$ Untap | ValidTgts$ Creature.Other+YouCtrl | TgtPrompt$ Select another target creature you control. +Oracle:Vigilance\nWhenever Tenth District Veteran attacks, untap another target creature you control. diff --git a/forge-gui/res/cardsfolder/upcoming/territorial_boar.txt b/forge-gui/res/cardsfolder/upcoming/territorial_boar.txt new file mode 100644 index 00000000000..f69ee6029e3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/territorial_boar.txt @@ -0,0 +1,8 @@ +Name:Territorial Boar +ManaCost:1 G +Types:Creature Boar +PT:2/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.powerGE4+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a creature with power 4 or greater enters the battlefield under your control, CARDNAME gets +1/+1 and gains vigilance until end of turn. +SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ +1 | NumDef$ +1 | KW$ Vigilance +SVar:RemRandomDeck:True +Oracle:Whenever a creature with power 4 or greater enters the battlefield under your control, Territorial Boar gets +1/+1 and gains vigilance until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/thirsting_shade.txt b/forge-gui/res/cardsfolder/upcoming/thirsting_shade.txt new file mode 100644 index 00000000000..c20339713cf --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/thirsting_shade.txt @@ -0,0 +1,7 @@ +Name:Thirsting Shade +ManaCost:B +Types:Creature Shade +PT:1/1 +K:Lifelink +A:AB$ Pump | Cost$ 2 B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. +Oracle:Lifelink\n{2}{B}: Thirsting Shade gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/thought_collapse.txt b/forge-gui/res/cardsfolder/upcoming/thought_collapse.txt new file mode 100644 index 00000000000..f7a8a12a134 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/thought_collapse.txt @@ -0,0 +1,6 @@ +Name:Thought Collapse +ManaCost:1 U U +Types:Instant +A:SP$ Counter | Cost$ 1 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SubAbility$ DBMill | Destination$ Graveyard | SpellDescription$ Counter target spell. Its controller puts the top three cards of their library into their graveyard. +SVar:DBMill:DB$ Mill | NumCards$ 3 | Defined$ TargetedController +Oracle:Counter target spell. Its controller puts the top three cards of their library into their graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/tin_street_dodger.txt b/forge-gui/res/cardsfolder/upcoming/tin_street_dodger.txt new file mode 100644 index 00000000000..8614f15b598 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tin_street_dodger.txt @@ -0,0 +1,8 @@ +Name:Tin Street Dodger +ManaCost:R +Types:Creature Goblin Rogue +PT:1/1 +K:Haste +A:AB$ Effect | Cost$ R | RememberObjects$ Self | Name$ CARDNAME Effect | StaticAbilities$ KWPump | SpellDescription$ CARDNAME can't be blocked this turn except by creatures with defender. +SVar:KWPump:Mode$ CantBlockBy | ValidAttacker$ Creature.EffectSource | ValidBlocker$ Creature.withoutDefender | EffectZone$ Command | Description$ EFFECTSOURCE can't be blocked this turn except by creatures with defender. +Oracle:Haste\n{R}: Tin Street Dodger can't be blocked this turn except by creatures with defender. diff --git a/forge-gui/res/cardsfolder/upcoming/titanic_brawl.txt b/forge-gui/res/cardsfolder/upcoming/titanic_brawl.txt new file mode 100644 index 00000000000..88018deada9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/titanic_brawl.txt @@ -0,0 +1,9 @@ +Name:Titanic Brawl +ManaCost:1 G +Types:Instant +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ 1 | EffectZone$ All | CheckSVar$ X | SVarCompare$ GE1 | Description$ This spell costs {1} less to cast if it targets a creature you control with a +1/+1 counter on it. +SVar:X:Count$Valid Creature.YouCtrl+counters_GE1_P1P1 +DeckHints:Ability$Counters +A:SP$ Pump | Cost$ 1 G | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Choose target creature you control | SubAbility$ DBFight | SpellDescription$ Target creature you control fights target creature you don't control. (Each deals damage equal to its power to the other.) +SVar:DBFight:DB$ Fight | Defined$ ParentTarget | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Choose target creature you don't control +Oracle:This spell costs {1} less to cast if it targets a creature you control with a +1/+1 counter on it.\nTarget creature you control fights target creature you don't control. (Each deals damage equal to its power to the other.) diff --git a/forge-gui/res/cardsfolder/upcoming/tome_of_the_guildpact.txt b/forge-gui/res/cardsfolder/upcoming/tome_of_the_guildpact.txt new file mode 100644 index 00000000000..f166149f288 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tome_of_the_guildpact.txt @@ -0,0 +1,8 @@ +Name:Tome of the Guildpact +ManaCost:5 +Types:Artifact +T:Mode$ SpellCast | ValidCard$ Card.MultiColor | ValidActivatingPlayer$ You | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a multicolored spell, draw a card. +SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 +SVar:RemRandomDeck:True +A:AB$ Mana | Cost$ T | Produced$ Any | SpellDescription$ Add one mana of any color. +Oracle:Whenever you cast a multicolored spell, draw a card.\n{T}: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/upcoming/twilight_panther.txt b/forge-gui/res/cardsfolder/upcoming/twilight_panther.txt new file mode 100644 index 00000000000..8dc9c2ab5e9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/twilight_panther.txt @@ -0,0 +1,6 @@ +Name:Twilight Panther +ManaCost:W +Types:Creature Cat Spirit +PT:1/2 +A:AB$ Pump | Cost$ B | Defined$ Self | KW$ Deathtouch | SpellDescription$ CARDNAME gains deathtouch until end of turn. +Oracle:{B}: Twilight Panther gains deathtouch until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/undercity_scavenger.txt b/forge-gui/res/cardsfolder/upcoming/undercity_scavenger.txt new file mode 100644 index 00000000000..0ff05038a8a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/undercity_scavenger.txt @@ -0,0 +1,9 @@ +Name:Undercity Scavenger +ManaCost:3 B +Types:Creature Ogre Warrior +PT:3/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ When CARDNAME enters the battlefield, you may sacrifice another creature. If you do, put two +1/+1 counters on CARDNAME, then scry 2. +SVar:TrigPutCounter:AB$ PutCounter | Cost$ Sac<1/Creature.Other/another creature> | Defined$ Self | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ DBScry +SVar:DBScry:DB$ Scry | ScryNum$ 2 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +Oracle:When Undercity Scavenger enters the battlefield, you may sacrifice another creature. If you do, put two +1/+1 counters on Undercity Scavenger, then scry 2. diff --git a/forge-gui/res/cardsfolder/upcoming/undercitys_embrace.txt b/forge-gui/res/cardsfolder/upcoming/undercitys_embrace.txt new file mode 100644 index 00000000000..95ffb7eb091 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/undercitys_embrace.txt @@ -0,0 +1,6 @@ +Name:Undercity's Embrace +ManaCost:2 B +Types:Instant +A:SP$ Sacrifice | Cost$ 2 B | ValidTgts$ Opponent | SacValid$ Creature | SacMessage$ Creature | SubAbility$ DBGainLife | SpellDescription$ Target opponent sacrifices a creature. If you control a creature with power 4 or greater, you gain 4 life. | StackDescription$ SpellDescription +SVar:DBGainLife:DB$ GainLife | Defined$ You | ConditionPresent$ Creature.YouCtrl+powerGE4 | ConditionCompare$ GE1 | StackDescription$ If you control a creature with power 4 or greater, you gain 4 life. +Oracle:Target opponent sacrifices a creature. If you control a creature with power 4 or greater, you gain 4 life. diff --git a/forge-gui/res/cardsfolder/upcoming/vindictive_vampire.txt b/forge-gui/res/cardsfolder/upcoming/vindictive_vampire.txt new file mode 100644 index 00000000000..2c9ce3a3068 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/vindictive_vampire.txt @@ -0,0 +1,8 @@ +Name:Vindictive Vampire +ManaCost:3 B +Types:Creature Vampire +PT:2/3 +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever another creature you control dies, CARDNAME deals 1 damage to each opponent and you gain 1 life. +SVar:TrigDealDamage:DB$ DamageAll | ValidPlayers$ Player.Opponent | NumDmg$ 1 | SubAbility$ DBGainLife +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 +Oracle:Whenever another creature you control dies, Vindictive Vampire deals 1 damage to each opponent and you gain 1 life. diff --git a/forge-gui/res/cardsfolder/upcoming/wall_of_lost_thoughts.txt b/forge-gui/res/cardsfolder/upcoming/wall_of_lost_thoughts.txt new file mode 100644 index 00000000000..97cf77b4f84 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/wall_of_lost_thoughts.txt @@ -0,0 +1,8 @@ +Name:Wall of Lost Thoughts +ManaCost:1 U +Types:Creature Wall +PT:0/4 +K:Defender +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMill | TriggerDescription$ When CARDNAME enters the battlefield, target player puts the top four cards of their library into their graveyard. +SVar:TrigMill:DB$ Mill | NumCards$ 4 | ValidTgts$ Player | TgtPrompt$ Choose a player +Oracle:Defender\nWhen Wall of Lost Thoughts enters the battlefield, target player puts the top four cards of their library into their graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/watchful_giant.txt b/forge-gui/res/cardsfolder/upcoming/watchful_giant.txt new file mode 100644 index 00000000000..d8d5bbdb6a8 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/watchful_giant.txt @@ -0,0 +1,8 @@ +Name:Watchful Giant +ManaCost:5 W +Types:Creature Giant Soldier +PT:3/6 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a 1/1 white Human creature token. +SVar:TrigToken:DB$Token | TokenAmount$ 1 | TokenName$ Human | TokenTypes$ Creature,Human | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Create a 1/1 white Human creature token. +DeckHints:Type$Human +Oracle:When Watchful Giant enters the battlefield, create a 1/1 white Human creature token. diff --git a/forge-gui/res/cardsfolder/upcoming/windstorm_drake.txt b/forge-gui/res/cardsfolder/upcoming/windstorm_drake.txt new file mode 100644 index 00000000000..7f2f678c31f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/windstorm_drake.txt @@ -0,0 +1,8 @@ +Name:Windstorm Drake +ManaCost:4 U +Types:Creature Drake +PT:3/3 +K:Flying +S:Mode$ Continuous | Affected$ Creature.withFlying+Other+YouCtrl | AddPower$ 1 | Description$ Other creatures you control with flying get +1/+0. +SVar:PlayMain1:TRUE +Oracle:Flying\nOther creatures you control with flying get +1/+0. diff --git a/forge-gui/res/cardsfolder/upcoming/wrecking_beast.txt b/forge-gui/res/cardsfolder/upcoming/wrecking_beast.txt new file mode 100644 index 00000000000..c365de7a507 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/wrecking_beast.txt @@ -0,0 +1,7 @@ +Name:Wrecking Beast +ManaCost:5 G G +Types:Creature Beast +PT:6/6 +K:Riot +K:Trample +Oracle:Riot (This creature enters the battlefield with your choice of a +1/1+ counter or haste.)\nTrample From cf3a28b1207894628efeb68c2135ac62143b980d Mon Sep 17 00:00:00 2001 From: Chris H Date: Sun, 13 Jan 2019 14:13:56 -0500 Subject: [PATCH 608/901] Remove bogus card --- .../res/cardsfolder/upcoming/testetestest.txt | 28 ------------------- 1 file changed, 28 deletions(-) delete mode 100644 forge-gui/res/cardsfolder/upcoming/testetestest.txt diff --git a/forge-gui/res/cardsfolder/upcoming/testetestest.txt b/forge-gui/res/cardsfolder/upcoming/testetestest.txt deleted file mode 100644 index 5f308d08b70..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/testetestest.txt +++ /dev/null @@ -1,28 +0,0 @@ -Name:Vexus, brut mother -ManaCost:4 B G -Types:Legendary Creature Spider Demon -PT:2/6 -K:Reach -S:Mode$ Continuous | Affected$ Creature.Green+YouCtrl,Creature.Black+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Black and green creatures you control get +1/+1. -S:Mode$ Continuous | Affected$ Creature.Spider+YouCtrl,Creature.Insect+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Spider and Insect creatures you control get +1/+1. -A:AB$ ChangeZone | Cost$ 4 B G | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBReturn | StackDescription$ SpellDescription | SpellDescription$ Exile CARDNAME, then return him to the battlefield transformed under his owner's control. -SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | Transformed$ True | ForgetOtherRemembered$ True | SubAbility$ DBCleanup | StackDescription$ None -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -AlternateMode:DoubleFaced -Oracle:\nReach. \nBlack and green creatures you control get +1/+1. \nSpider and Insect creatures you control get +1/+1. \n{4}{B}{G}: Exile Vexus, brut mother, then return her to the battlefield transformed under her owner's control. - -ALTERNATE - -Name:Vexus, Empress of the Swarm -ManaCost:no cost -Colors:black,green -Types:Legendary Planeswalker Vexus -Loyalty:7 -A:AB$ Token | Cost$ AddCounter<2/LOYALTY> | TokenAmount$ 3 | TokenName$ Spider | TokenTypes$ Creature,Spider | TokenOwner$ You | TokenColors$ Black,Green | TokenPower$ 1 | TokenToughness$ 2 | Planeswalker$ True | TokenImage$ bg_1_2_spider_ths | SpellDescription$ Create three 1/2 black and green Spider creature tokens with reach and deathtouch. -A:AB$ Destroy | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Destroy target creature. -A:AB$ RepeatEach | Cost$ SubCounter<3/LOYALTY> | RepeatPlayers$ Opponent | RepeatSubAbility$ SacNonland | Planeswalker$ True | SpellDescription$ Each opponent sacrifices a nonland permanent. -SVar:SacNonland | Cost$ Sac<1/Permanent.nonLand> | SpellDescription$ You sacrifice a nonland permanent -A:AB$ Effect | Cost$ SubCounter<12/LOYALTY> | Name$ Emblem - Vexus, Empress of the Swarm | Image$ emblem_vexus_empress_of_the_Swarm | StaticAbilities$ STtrample,STindestructible | Planeswalker$ True | Ultimate$ True | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "Black and green creatures you control get +1/+1 and have trample. Spider and insect creatures you control get +2/+2 and have indestructable." -SVar:STtrample:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.Green+YouCtrl,Creature.Black+YouCtrl | AffectedZone$ Battlefield | AddKeyword$ Trample | AddPower$ 1 | AddToughness$ 1 | Description$ Black and green creatures you control get +1/+1 and have trample. -SVar:STindestructible:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.Spider+YouCtrl,Creature.Insect+YouCtrl | AffectedZone$ Battlefield | AddKeyword$ Indestructible | AddPower$ 2 | AddToughness$ 2 | Description$ Spider and insect creatures you control get +2/+2 and have indestructable. -Oracle:+2: Create three 1/2 black and green Spider creature tokens with reach and deathtouch.\n+1: Destroy target creature.\n-3: Each opponent sacrifices a nonland permanent.\n−12: Create an emblem with:"Black and green creatures you control get +1/+1 and have trample. Spider and insect creatures you control get +2/+2 and have indestructable." \ No newline at end of file From 5d2e7a16d38396cb0b59d3de62427234f788e343 Mon Sep 17 00:00:00 2001 From: Chris H Date: Sun, 13 Jan 2019 14:38:33 -0500 Subject: [PATCH 609/901] Fix Afterlife crashes --- forge-gui/res/cardsfolder/upcoming/knight_of_sorrows.txt | 2 +- .../res/cardsfolder/upcoming/knight_of_the_last_breath.txt | 2 +- forge-gui/res/cardsfolder/upcoming/orzhov_enforcer.txt | 2 +- forge-gui/res/cardsfolder/upcoming/syndicate_messenger.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/knight_of_sorrows.txt b/forge-gui/res/cardsfolder/upcoming/knight_of_sorrows.txt index 74099e548aa..6170bdcd29d 100644 --- a/forge-gui/res/cardsfolder/upcoming/knight_of_sorrows.txt +++ b/forge-gui/res/cardsfolder/upcoming/knight_of_sorrows.txt @@ -3,5 +3,5 @@ ManaCost:4 W Types:Creature Human Knight PT:3/3 K:CARDNAME can block an additional creature each combat. -K:Afterlife 1 +K:Afterlife:1 Oracle:Knight of Sorrows can block an additional creature each combat.\nAfterlife 1 (When this creature dies, create a 1/1 white and black Spirit creature token with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/knight_of_the_last_breath.txt b/forge-gui/res/cardsfolder/upcoming/knight_of_the_last_breath.txt index 170331fce33..d826e2ebb6c 100644 --- a/forge-gui/res/cardsfolder/upcoming/knight_of_the_last_breath.txt +++ b/forge-gui/res/cardsfolder/upcoming/knight_of_the_last_breath.txt @@ -4,5 +4,5 @@ Types:Creature Giant Knight PT:4/4 A:AB$ Token | Cost$ 3 Sac<1/Creature.nonToken+Other/another creature> | TokenAmount$ 1 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenOwner$ You | TokenColors$ White,Black | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SpellDescription$ Create a 1/1 white and black Spirit creature token with flying. SVar:RemRandomDeck:True -K:Afterlife 3 +K:Afterlife:3 Oracle:{3}, Sacrifice another nontoken creature: Create a 1/1 white and black Spirit creature token with flying.\nAfterlife 3 (When this creature dies, create three 1/1 white and black Spirit creature tokens with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/orzhov_enforcer.txt b/forge-gui/res/cardsfolder/upcoming/orzhov_enforcer.txt index 1821f313fc5..aad9953f605 100644 --- a/forge-gui/res/cardsfolder/upcoming/orzhov_enforcer.txt +++ b/forge-gui/res/cardsfolder/upcoming/orzhov_enforcer.txt @@ -3,5 +3,5 @@ ManaCost:1 B Types:Creature Human Rogue PT:1/2 K:Deathtouch -K:Afterlife 1 +K:Afterlife:1 Oracle:Deathtouch\nAfterlife 1 (When this creature dies, create a 1/1 white and black Spirit creature token with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/syndicate_messenger.txt b/forge-gui/res/cardsfolder/upcoming/syndicate_messenger.txt index 9eb142510cb..521a64a8c12 100644 --- a/forge-gui/res/cardsfolder/upcoming/syndicate_messenger.txt +++ b/forge-gui/res/cardsfolder/upcoming/syndicate_messenger.txt @@ -3,5 +3,5 @@ ManaCost:3 W Types:Creature Bird PT:2/3 K:Flying -K:Afterlife 1 +K:Afterlife:1 Oracle:Flying\nAfterlife 1 (When this creature dies, create a 1/1 white and black Spirit creature token with flying.) From 9c4fd8b57030136ed6477121d8e5a6e099fda07f Mon Sep 17 00:00:00 2001 From: Chris H Date: Mon, 14 Jan 2019 22:03:42 -0500 Subject: [PATCH 610/901] Fix Spectacle --- forge-gui/res/cardsfolder/upcoming/hackrobat.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/hackrobat.txt b/forge-gui/res/cardsfolder/upcoming/hackrobat.txt index 6e0bd95b99d..95c22c83f60 100644 --- a/forge-gui/res/cardsfolder/upcoming/hackrobat.txt +++ b/forge-gui/res/cardsfolder/upcoming/hackrobat.txt @@ -2,7 +2,7 @@ Name:Hackrobat ManaCost:1 B R Types:Creature Human Rogue PT:2/3 -K:Spectacle B R +K:Spectacle:B R A:AB$ Pump | Cost$ B | Defined$ Self | KW$ Deathtouch | SpellDescription$ CARDNAME gains deathtouch until end of turn. A:AB$ Pump | Cost$ R | NumAtt$ +2 | NumDef$ -2 | SpellDescription$ CARDNAME gets +2/-2 until end of turn. Oracle:Spectacle {B}{R} (You may cast this spell for its spectacle cost rather than its mana cost if an opponent lost life this turn.)\n{B}: Hackrobat gains deathtouch until end of turn.\n{R}: Hackrobat gets +2/-2 until end of turn. From e76db8e7ff20c097b306508f1fe4df3fc46f91a9 Mon Sep 17 00:00:00 2001 From: Chris H Date: Fri, 18 Jan 2019 21:15:23 -0500 Subject: [PATCH 611/901] Fix Gruul Spellbreaker affected --- forge-gui/res/cardsfolder/upcoming/gruul_spellbreaker.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/gruul_spellbreaker.txt b/forge-gui/res/cardsfolder/upcoming/gruul_spellbreaker.txt index 77eb6feaeeb..00c298d8fa4 100644 --- a/forge-gui/res/cardsfolder/upcoming/gruul_spellbreaker.txt +++ b/forge-gui/res/cardsfolder/upcoming/gruul_spellbreaker.txt @@ -4,5 +4,5 @@ Types:Creature Ogre Warrior PT:3/3 K:Riot K:Trample -S:Mode$ Continuous | Affected$ You,Self | AddKeyword$ Hexproof | Condition$ PlayerTurn | Description$ As long as it's your turn, you and CARDNAME have hexproof. +S:Mode$ Continuous | Affected$ You,Card.Self | AddKeyword$ Hexproof | Condition$ PlayerTurn | Description$ As long as it's your turn, you and CARDNAME have hexproof. Oracle:Riot (This creature enters the battlefield with your choice of a +1/+1 counter or haste.)\nTrample\nAs long as it's your turn, you and Gruul Spellbreaker have hexproof. From c4c061d6696cb75ed599cbc904d611a9642a1446 Mon Sep 17 00:00:00 2001 From: Chris H Date: Fri, 18 Jan 2019 21:23:05 -0500 Subject: [PATCH 612/901] Fix Rampage of the Clans --- forge-gui/res/cardsfolder/upcoming/rampage_of_the_clans.txt | 2 +- forge-gui/res/tokenscripts/g_3_3_centaur.txt | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/tokenscripts/g_3_3_centaur.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rampage_of_the_clans.txt b/forge-gui/res/cardsfolder/upcoming/rampage_of_the_clans.txt index 779b9968f59..a7a7041cdc5 100644 --- a/forge-gui/res/cardsfolder/upcoming/rampage_of_the_clans.txt +++ b/forge-gui/res/cardsfolder/upcoming/rampage_of_the_clans.txt @@ -3,6 +3,6 @@ ManaCost:3 G Types:Instant A:SP$ DestroyAll | Cost$ 3 G | ValidCards$ Artifact,Enchantment | RememberDestroyed$ True | SubAbility$ DBToken | SpellDescription$ Destroy all artifacts and enchantments. For each permanent destroyed this way, its controller creates a 3/3 green Centaur creature token. SVar:DBToken:DB$ RepeatEach | UseImprinted$ True | DefinedCards$ DirectRemembered | RepeatSubAbility$ TokenBoar | SubAbility$ DBCleanup -SVar:TokenBoar:DB$ Token | TokenAmount$ 1 | TokenName$ Centaur | TokenTypes$ Creature,Centaur | TokenOwner$ ImprintedController | TokenColors$ Green | TokenPower$ 3 | TokenToughness$ 3 | TokenImage$ g 3 3 centaur rna +SVar:TokenBoar:DB$ Token | TokenAmount$ 1 | TokenOwner$ ImprintedController | TokenScript$ g_3_3_centaur | LegacyImage$ g 3 3 centaur rna SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ true Oracle:Destroy all artifacts and enchantments. For each permanent destroyed this way, its controller creates a 3/3 green Centaur creature token. diff --git a/forge-gui/res/tokenscripts/g_3_3_centaur.txt b/forge-gui/res/tokenscripts/g_3_3_centaur.txt new file mode 100644 index 00000000000..84d194bdf2c --- /dev/null +++ b/forge-gui/res/tokenscripts/g_3_3_centaur.txt @@ -0,0 +1,6 @@ +Name:Centaur +ManaCost:no cost +Types:Creature Centaur +Colors:green +PT:3/3 +Oracle: \ No newline at end of file From dfbfcf0a116305ad778977e89af56c03bf24adfe Mon Sep 17 00:00:00 2001 From: Chris H Date: Fri, 18 Jan 2019 21:24:29 -0500 Subject: [PATCH 613/901] Hero of Precinct One -> TokenScripts --- forge-gui/res/cardsfolder/upcoming/hero_of_precinct_one.txt | 2 +- forge-gui/res/tokenscripts/w_1_1_human.txt | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/tokenscripts/w_1_1_human.txt diff --git a/forge-gui/res/cardsfolder/upcoming/hero_of_precinct_one.txt b/forge-gui/res/cardsfolder/upcoming/hero_of_precinct_one.txt index ab24a2ee327..1db3952ddf1 100644 --- a/forge-gui/res/cardsfolder/upcoming/hero_of_precinct_one.txt +++ b/forge-gui/res/cardsfolder/upcoming/hero_of_precinct_one.txt @@ -3,7 +3,7 @@ ManaCost:1 W Types:Creature Human Warrior PT:2/2 T:Mode$ SpellCast | ValidCard$ Card.MultiColor | ValidActivatingPlayer$ You | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a multicolored spell, create a 1/1 white Human creature token. -SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenName$ Human | TokenTypes$ Creature,Human | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenImage$ w 1 1 human rna +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenOwner$ You | TokenScript$ w_1_1_human | LegacyImage$ w 1 1 human rna SVar:RemRandomDeck:True SVar:BuffedBy:Card.MultiColor DeckHas:Ability$Token diff --git a/forge-gui/res/tokenscripts/w_1_1_human.txt b/forge-gui/res/tokenscripts/w_1_1_human.txt new file mode 100644 index 00000000000..d7f77a9fcf1 --- /dev/null +++ b/forge-gui/res/tokenscripts/w_1_1_human.txt @@ -0,0 +1,6 @@ +Name:Human +ManaCost:no cost +Types:Creature Human +Colors:white +PT:1/1 +Oracle: \ No newline at end of file From bb5700351845f2eb6f1c5048ca4d54e51a4e6ee8 Mon Sep 17 00:00:00 2001 From: Chris H Date: Fri, 18 Jan 2019 21:26:47 -0500 Subject: [PATCH 614/901] Biogenic Ooze -> TokenScripts --- forge-gui/res/cardsfolder/upcoming/biogenic_ooze.txt | 4 ++-- forge-gui/res/tokenscripts/g_2_2_ooze.txt | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 forge-gui/res/tokenscripts/g_2_2_ooze.txt diff --git a/forge-gui/res/cardsfolder/upcoming/biogenic_ooze.txt b/forge-gui/res/cardsfolder/upcoming/biogenic_ooze.txt index 942ddef7b1a..77e4c56bf1b 100644 --- a/forge-gui/res/cardsfolder/upcoming/biogenic_ooze.txt +++ b/forge-gui/res/cardsfolder/upcoming/biogenic_ooze.txt @@ -3,10 +3,10 @@ ManaCost:3 G G Types:Creature Ooze PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a 2/2 green Ooze creature token. -SVar:TrigToken:DB$Token | TokenAmount$ 1 | TokenName$ Ooze | TokenTypes$ Creature,Ooze | TokenOwner$ You | TokenColors$ Green | TokenPower$ 2 | TokenToughness$ 2 | TokenImage$ g 2 2 ooze rna +SVar:TrigToken:DB$Token | TokenAmount$ 1 | TokenScript$ g_2_2_ooze | LegacyImage$ g 2 2 ooze rna DeckHas:Ability$Token T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your end step, put a +1/+1 counter on each Ooze you control. SVar:TrigPutCounter:DB$PutCounterAll | ValidCards$ Ooze.YouCtrl | CounterType$ P1P1 | CounterNum$ 1 SVar:BuffedBy:Artifact -A:AB$ Token | Cost$ 1 G G G | TokenAmount$ 1 | TokenName$ Ooze | TokenTypes$ Creature,Ooze | TokenOwner$ You | TokenColors$ Green | TokenPower$ 2 | TokenToughness$ 2 | TokenImage$ g 2 2 ooze rna | SpellDescription$ Create a 2/2 green Ooze creature token. +A:AB$ Token | Cost$ 1 G G G | TokenAmount$ 1 | TokenScript$ g_2_2_ooze | LegacyImage$ g 2 2 ooze rna | SpellDescription$ Create a 2/2 green Ooze creature token. Oracle:When Biogenic Ooze enters the battlefield, create a 2/2 green Ooze creature token.\nAt the beginning of your end step, put a +1/+1 counter on each Ooze you control.\n{1}{G}{G}{G}: Create a 2/2 green Ooze creature token. diff --git a/forge-gui/res/tokenscripts/g_2_2_ooze.txt b/forge-gui/res/tokenscripts/g_2_2_ooze.txt new file mode 100644 index 00000000000..c4efe4a68b8 --- /dev/null +++ b/forge-gui/res/tokenscripts/g_2_2_ooze.txt @@ -0,0 +1,6 @@ +Name:Ooze +ManaCost:no cost +Types:Creature Ooze +Colors:green +PT:2/2 +Oracle: \ No newline at end of file From 76e3f0305b62b659fa18a8c45507cc03f552b7c6 Mon Sep 17 00:00:00 2001 From: Chris H Date: Fri, 18 Jan 2019 21:29:24 -0500 Subject: [PATCH 615/901] Do Type changes affect Svar keys? That sounds bad --- forge-gui/res/cardsfolder/upcoming/rampage_of_the_clans.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/rampage_of_the_clans.txt b/forge-gui/res/cardsfolder/upcoming/rampage_of_the_clans.txt index a7a7041cdc5..5c50e2dce9c 100644 --- a/forge-gui/res/cardsfolder/upcoming/rampage_of_the_clans.txt +++ b/forge-gui/res/cardsfolder/upcoming/rampage_of_the_clans.txt @@ -1,8 +1,8 @@ Name:Rampage of the Clans ManaCost:3 G Types:Instant -A:SP$ DestroyAll | Cost$ 3 G | ValidCards$ Artifact,Enchantment | RememberDestroyed$ True | SubAbility$ DBToken | SpellDescription$ Destroy all artifacts and enchantments. For each permanent destroyed this way, its controller creates a 3/3 green Centaur creature token. -SVar:DBToken:DB$ RepeatEach | UseImprinted$ True | DefinedCards$ DirectRemembered | RepeatSubAbility$ TokenBoar | SubAbility$ DBCleanup -SVar:TokenBoar:DB$ Token | TokenAmount$ 1 | TokenOwner$ ImprintedController | TokenScript$ g_3_3_centaur | LegacyImage$ g 3 3 centaur rna +A:SP$ DestroyAll | Cost$ 3 G | ValidCards$ Artifact,Enchantment | RememberDestroyed$ True | SubAbility$ DBRepeat | SpellDescription$ Destroy all artifacts and enchantments. For each permanent destroyed this way, its controller creates a 3/3 green Centaur creature token. +SVar:DBRepeat:DB$ RepeatEach | UseImprinted$ True | DefinedCards$ DirectRemembered | RepeatSubAbility$ DBToken | SubAbility$ DBCleanup +SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenOwner$ ImprintedController | TokenScript$ g_3_3_centaur | LegacyImage$ g 3 3 centaur rna SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ true Oracle:Destroy all artifacts and enchantments. For each permanent destroyed this way, its controller creates a 3/3 green Centaur creature token. From 1e34fd27fe2f206d372c0d215bb270b80aed76e3 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 19 Jan 2019 09:34:58 +0300 Subject: [PATCH 616/901] - AI hints for RNA. --- forge-gui/res/cardsfolder/upcoming/archway_angel.txt | 1 + forge-gui/res/cardsfolder/upcoming/bankrupt_in_blood.txt | 1 + forge-gui/res/cardsfolder/upcoming/basilica_bell_haunt.txt | 1 + forge-gui/res/cardsfolder/upcoming/benthic_biomancer.txt | 1 + forge-gui/res/cardsfolder/upcoming/biogenic_ooze.txt | 2 +- forge-gui/res/cardsfolder/upcoming/biogenic_upgrade.txt | 1 + forge-gui/res/cardsfolder/upcoming/biomancers_familiar.txt | 1 + forge-gui/res/cardsfolder/upcoming/bolrac_clan_crusher.txt | 1 + forge-gui/res/cardsfolder/upcoming/burning_tree_vandal.txt | 3 ++- forge-gui/res/cardsfolder/upcoming/carrion_imp.txt | 1 + forge-gui/res/cardsfolder/upcoming/debtors_transport.txt | 1 + forge-gui/res/cardsfolder/upcoming/dovins_automaton.txt | 1 + forge-gui/res/cardsfolder/upcoming/essence_capture.txt | 1 + forge-gui/res/cardsfolder/upcoming/ethereal_absolution.txt | 1 + forge-gui/res/cardsfolder/upcoming/frenzied_arynx.txt | 1 + forge-gui/res/cardsfolder/upcoming/galloping_lizrog.txt | 2 ++ forge-gui/res/cardsfolder/upcoming/gateway_sneak.txt | 1 + forge-gui/res/cardsfolder/upcoming/ghor_clan_wrecker.txt | 1 + forge-gui/res/cardsfolder/upcoming/goblin_gathering.txt | 1 + .../res/cardsfolder/upcoming/growth_chamber_guardian.txt | 2 +- forge-gui/res/cardsfolder/upcoming/gruul_beastmaster.txt | 1 + forge-gui/res/cardsfolder/upcoming/gruul_spellbreaker.txt | 1 + forge-gui/res/cardsfolder/upcoming/hydroid_krasis.txt | 1 + forge-gui/res/cardsfolder/upcoming/impassioned_orator.txt | 1 + forge-gui/res/cardsfolder/upcoming/imperious_oligarch.txt | 1 + forge-gui/res/cardsfolder/upcoming/knight_of_sorrows.txt | 1 + .../res/cardsfolder/upcoming/knight_of_the_last_breath.txt | 2 ++ .../res/cardsfolder/upcoming/ministrant_of_obligation.txt | 1 + forge-gui/res/cardsfolder/upcoming/orzhov_enforcer.txt | 1 + forge-gui/res/cardsfolder/upcoming/orzhov_racketeers.txt | 1 + forge-gui/res/cardsfolder/upcoming/pitiless_pontiff.txt | 1 + forge-gui/res/cardsfolder/upcoming/plaza_of_harmony.txt | 3 ++- forge-gui/res/cardsfolder/upcoming/prime_speaker_vannifar.txt | 4 +++- forge-gui/res/cardsfolder/upcoming/prying_eyes.txt | 1 + forge-gui/res/cardsfolder/upcoming/rampaging_rendhorn.txt | 1 + forge-gui/res/cardsfolder/upcoming/ravager_wurm.txt | 1 + forge-gui/res/cardsfolder/upcoming/rhythm_of_the_wild.txt | 1 + forge-gui/res/cardsfolder/upcoming/senate_guildmage.txt | 1 + forge-gui/res/cardsfolder/upcoming/seraph_of_the_scales.txt | 1 + forge-gui/res/cardsfolder/upcoming/spawn_of_mayhem.txt | 1 + forge-gui/res/cardsfolder/upcoming/sphinxs_insight.txt | 1 + forge-gui/res/cardsfolder/upcoming/sylvan_brushstrider.txt | 1 + forge-gui/res/cardsfolder/upcoming/syndicate_messenger.txt | 1 + forge-gui/res/cardsfolder/upcoming/territorial_boar.txt | 1 + forge-gui/res/cardsfolder/upcoming/teysa_karlov.txt | 1 + forge-gui/res/cardsfolder/upcoming/the_haunt_of_hightower.txt | 1 + forge-gui/res/cardsfolder/upcoming/tithe_taker.txt | 1 + forge-gui/res/cardsfolder/upcoming/trollbred_guardian.txt | 2 +- forge-gui/res/cardsfolder/upcoming/undercity_scavenger.txt | 2 ++ forge-gui/res/cardsfolder/upcoming/undercitys_embrace.txt | 1 + forge-gui/res/cardsfolder/upcoming/vindictive_vampire.txt | 1 + forge-gui/res/cardsfolder/upcoming/watchful_giant.txt | 2 +- forge-gui/res/cardsfolder/upcoming/wrecking_beast.txt | 3 ++- forge-gui/res/cardsfolder/upcoming/zhur_taa_goblin.txt | 1 + 54 files changed, 62 insertions(+), 8 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/archway_angel.txt b/forge-gui/res/cardsfolder/upcoming/archway_angel.txt index 5ce99821634..31341014650 100644 --- a/forge-gui/res/cardsfolder/upcoming/archway_angel.txt +++ b/forge-gui/res/cardsfolder/upcoming/archway_angel.txt @@ -6,5 +6,6 @@ K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 2 life for each Gate you control. SVar:TrigGainLife:DB$GainLife | LifeAmount$ X | References$ X SVar:X:Count$Valid Gate.YouCtrl/Times.2 +DeckHas:Ability$LifeGain DeckHints:Type$Gate Oracle:Flying\nWhen Archway Angel enters the battlefield, you gain 2 life for each Gate you control. diff --git a/forge-gui/res/cardsfolder/upcoming/bankrupt_in_blood.txt b/forge-gui/res/cardsfolder/upcoming/bankrupt_in_blood.txt index 030fc39d010..dbc1a820e3c 100644 --- a/forge-gui/res/cardsfolder/upcoming/bankrupt_in_blood.txt +++ b/forge-gui/res/cardsfolder/upcoming/bankrupt_in_blood.txt @@ -2,4 +2,5 @@ Name:Bankrupt in Blood ManaCost:1 B Types:Sorcery A:SP$ Draw | Cost$ 1 B Sac<2/Creature> | NumCards$ 3 | SpellDescription$ Draw three cards. +SVar:AIPreference:SacCost$Creature.token,Creature.cmcLE2 Oracle:As an additional cost to cast this spell, sacrifice two creatures.\nDraw three cards. diff --git a/forge-gui/res/cardsfolder/upcoming/basilica_bell_haunt.txt b/forge-gui/res/cardsfolder/upcoming/basilica_bell_haunt.txt index 17d0b98bd48..86eaaed210b 100644 --- a/forge-gui/res/cardsfolder/upcoming/basilica_bell_haunt.txt +++ b/forge-gui/res/cardsfolder/upcoming/basilica_bell_haunt.txt @@ -5,4 +5,5 @@ PT:3/4 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, each opponent discards a card and you gain 3 life. SVar:TrigDiscard:DB$ Discard | Defined$ Player.Opponent | NumCards$ 1 | Mode$ TgtChoose | SubAbility$ GainLife SVar:GainLife:DB$ GainLife | Defined$ You | LifeAmount$ 3 +DeckHas:Ability$LifeGain Oracle:When Basilica Bell-Haunt enters the battlefield, each opponent discards a card and you gain 3 life. diff --git a/forge-gui/res/cardsfolder/upcoming/benthic_biomancer.txt b/forge-gui/res/cardsfolder/upcoming/benthic_biomancer.txt index b89cc502a79..ade5b94d96b 100644 --- a/forge-gui/res/cardsfolder/upcoming/benthic_biomancer.txt +++ b/forge-gui/res/cardsfolder/upcoming/benthic_biomancer.txt @@ -7,5 +7,6 @@ DeckHas:Ability$Counters T:Mode$ CounterAddedOnce | ValidCard$ Card.Self | TriggerZones$ Battlefield | CounterType$ P1P1 | Execute$ TrigDraw | TriggerDescription$ Whenever one or more +1/+1 counters are put on CARDNAME, draw a card, then discard a card. SVar:TrigDraw:DB$ Draw | NumCards$ 1 | SubAbility$ DBDiscard SVar:DBDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose +DeckHas:Ability$Counters DeckHints:Ability$Counters Oracle:{1}{U}: Adapt 1. (If this creature has no +1/+1 counters on it, put a +1/+1 counter on it.)\nWhenever one or more +1/+1 counters are put on Benthic Biomancer, draw a card, then discard a card. diff --git a/forge-gui/res/cardsfolder/upcoming/biogenic_ooze.txt b/forge-gui/res/cardsfolder/upcoming/biogenic_ooze.txt index 77e4c56bf1b..3a22d960a80 100644 --- a/forge-gui/res/cardsfolder/upcoming/biogenic_ooze.txt +++ b/forge-gui/res/cardsfolder/upcoming/biogenic_ooze.txt @@ -4,9 +4,9 @@ Types:Creature Ooze PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a 2/2 green Ooze creature token. SVar:TrigToken:DB$Token | TokenAmount$ 1 | TokenScript$ g_2_2_ooze | LegacyImage$ g 2 2 ooze rna -DeckHas:Ability$Token T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your end step, put a +1/+1 counter on each Ooze you control. SVar:TrigPutCounter:DB$PutCounterAll | ValidCards$ Ooze.YouCtrl | CounterType$ P1P1 | CounterNum$ 1 SVar:BuffedBy:Artifact A:AB$ Token | Cost$ 1 G G G | TokenAmount$ 1 | TokenScript$ g_2_2_ooze | LegacyImage$ g 2 2 ooze rna | SpellDescription$ Create a 2/2 green Ooze creature token. +DeckHas:Ability$Token & Ability$Counters Oracle:When Biogenic Ooze enters the battlefield, create a 2/2 green Ooze creature token.\nAt the beginning of your end step, put a +1/+1 counter on each Ooze you control.\n{1}{G}{G}{G}: Create a 2/2 green Ooze creature token. diff --git a/forge-gui/res/cardsfolder/upcoming/biogenic_upgrade.txt b/forge-gui/res/cardsfolder/upcoming/biogenic_upgrade.txt index 114b2864bfd..8442191a58f 100644 --- a/forge-gui/res/cardsfolder/upcoming/biogenic_upgrade.txt +++ b/forge-gui/res/cardsfolder/upcoming/biogenic_upgrade.txt @@ -3,4 +3,5 @@ ManaCost:4 G G Types:Sorcery A:SP$ PutCounter | Cost$ 4 G G | ValidTgts$ Creature | TgtPrompt$ Select target creature to distribute counters to | CounterType$ P1P1 | CounterNum$ 3 | TargetMin$ 1 | TargetMax$ 3 | DividedAsYouChoose$ 3 | SubAbility$ DBPump | SpellDescription$ Distribute three +1/+1 counters among one, two, or three target creatures, then double the number of +1/+1 counters on each of those creatures. SVar:DBPump:DB$ MultiplyCounter | Defined$ Targeted | CounterType$ P1P1 +DeckHas:Ability$Counters Oracle:Distribute three +1/+1 counters among one, two, or three target creatures, then double the number of +1/+1 counters on each of those creatures. diff --git a/forge-gui/res/cardsfolder/upcoming/biomancers_familiar.txt b/forge-gui/res/cardsfolder/upcoming/biomancers_familiar.txt index 30008a2e68c..416715d855c 100644 --- a/forge-gui/res/cardsfolder/upcoming/biomancers_familiar.txt +++ b/forge-gui/res/cardsfolder/upcoming/biomancers_familiar.txt @@ -4,4 +4,5 @@ Types:Creature Mutant PT:2/2 S:Mode$ ReduceCost | ValidCard$ Creature.YouCtrl | Type$ Ability | Amount$ 2 | MinMana$ 1 | AffectedZone$ Battlefield | Description$ Activated abilities of creatures you control cost {2} less to activate. This effect can't reduce the amount of mana an ability costs to activate to less than one mana. A:AB$ Pump | Cost$ T | ValidTgts$ Creature | KW$ HIDDEN CARDNAME adapts as though it had no +1/+1 counters | TgtPrompt$ Select target creature. | StackDescription$ SpellDescription | SpellDescription$ The next time target creature adapts this turn, it adapts as though it had no +1/+1 counters. +DeckHints:Keyword$Adapt Oracle:Activated abilities of creatures you control cost 2 less to activate. This effect can't reduce the amount of mana an ability costs to activate to less than one mana.\n{T}: The next time target creature adapts this turn, it adapts as though it had no +1/+1 counters. diff --git a/forge-gui/res/cardsfolder/upcoming/bolrac_clan_crusher.txt b/forge-gui/res/cardsfolder/upcoming/bolrac_clan_crusher.txt index db9d08053b9..718fb27d827 100644 --- a/forge-gui/res/cardsfolder/upcoming/bolrac_clan_crusher.txt +++ b/forge-gui/res/cardsfolder/upcoming/bolrac_clan_crusher.txt @@ -4,4 +4,5 @@ Types:Creature Ogre Warrior PT:4/4 A:AB$ DealDamage | Cost$ T SubCounter<1/P1P1/Creature.YouCtrl/a creature you control> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to any target. AI:RemoveDeck:Random +DeckHints:Ability$Counters Oracle:{T}, Remove a +1/+1 counter from a creature you control: Bolrac-Clan Crusher deals 2 damage to any target. diff --git a/forge-gui/res/cardsfolder/upcoming/burning_tree_vandal.txt b/forge-gui/res/cardsfolder/upcoming/burning_tree_vandal.txt index 9220bc36cf7..664652dc71a 100644 --- a/forge-gui/res/cardsfolder/upcoming/burning_tree_vandal.txt +++ b/forge-gui/res/cardsfolder/upcoming/burning_tree_vandal.txt @@ -7,4 +7,5 @@ T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescripti SVar:TrigDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | RememberDiscarded$ True | Optional$ True | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -Oracle:Riot (This creature enters the battlefield with your choice of a +1/+ counter or haste.)\nWhenever Burning-Tree Vandal attacks, you may discard a card. If you do, draw a card. +DeckHas:Ability$Counters +Oracle:Riot (This creature enters the battlefield with your choice of a +1/+1 counter or haste.)\nWhenever Burning-Tree Vandal attacks, you may discard a card. If you do, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/carrion_imp.txt b/forge-gui/res/cardsfolder/upcoming/carrion_imp.txt index aac9ac1c750..36b087eee06 100644 --- a/forge-gui/res/cardsfolder/upcoming/carrion_imp.txt +++ b/forge-gui/res/cardsfolder/upcoming/carrion_imp.txt @@ -8,4 +8,5 @@ SVar:TrigExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | ValidTg SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ1 | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount +DeckHas:Ability$LifeGain Oracle:Flying\nWhen Carrion Imp enters the battlefield, you may exile target creature card from a graveyard. If you do, you gain 2 life. diff --git a/forge-gui/res/cardsfolder/upcoming/debtors_transport.txt b/forge-gui/res/cardsfolder/upcoming/debtors_transport.txt index 0a9126dbfdb..8d3bd58b0d8 100644 --- a/forge-gui/res/cardsfolder/upcoming/debtors_transport.txt +++ b/forge-gui/res/cardsfolder/upcoming/debtors_transport.txt @@ -3,4 +3,5 @@ ManaCost:5 B Types:Creature Thrull PT:5/3 K:Afterlife:2 +DeckHas:Ability$Token Oracle:Afterlife 2 (When this creature dies, create two 1/1 white and black Spirit creature tokens with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/dovins_automaton.txt b/forge-gui/res/cardsfolder/upcoming/dovins_automaton.txt index b29eabea4d9..73cdd072ab3 100644 --- a/forge-gui/res/cardsfolder/upcoming/dovins_automaton.txt +++ b/forge-gui/res/cardsfolder/upcoming/dovins_automaton.txt @@ -4,4 +4,5 @@ Types:Artifact Creature Homunculus PT:3/3 S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Vigilance | IsPresent$ Planeswalker.Dovin+YouCtrl | Description$ As long as you control a planeswalker planeswalker, CARDNAME gets +2/+2 and has vigilance. (Attacking doesn't cause it to tap.) SVar:BuffedBy:Dovin +DeckNeeds:Type$Dovin Oracle:As long as you control a Dovin planeswalker, Dovin's Automaton gets +2/+2 and has vigilance. (Attacking doesn't cause it to tap.) diff --git a/forge-gui/res/cardsfolder/upcoming/essence_capture.txt b/forge-gui/res/cardsfolder/upcoming/essence_capture.txt index 773fd657405..d0e6ca8574e 100644 --- a/forge-gui/res/cardsfolder/upcoming/essence_capture.txt +++ b/forge-gui/res/cardsfolder/upcoming/essence_capture.txt @@ -3,4 +3,5 @@ ManaCost:U U Types:Instant A:SP$ Counter | Cost$ U U | TargetType$ Spell | TgtPrompt$ Select target Creature spell | ValidTgts$ Creature | SubAbility$ DBPutCounter | SpellDescription$ Counter target creature spell. Put a +1/+1 counter on up to one target creature you control. SVar:DBPutCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ 1 | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target creature you control | ValidTgts$ Creature.YouCtrl +DeckHas:Ability$Counters Oracle:Counter target creature spell. Put a +1/+1 counter on up to one target creature you control. diff --git a/forge-gui/res/cardsfolder/upcoming/ethereal_absolution.txt b/forge-gui/res/cardsfolder/upcoming/ethereal_absolution.txt index 11450772185..50d87ce5595 100644 --- a/forge-gui/res/cardsfolder/upcoming/ethereal_absolution.txt +++ b/forge-gui/res/cardsfolder/upcoming/ethereal_absolution.txt @@ -7,4 +7,5 @@ SVar:PlayMain1:TRUE SVar:RemRandomDeck:True A:AB$ ChangeZone | Cost$ 4 W B | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Card.OppOwn | SubAbility$ DBToken | SpellDescription$ Exile target card from an opponent's graveyard. If it was a creature card, you create a 1/1 white and black Spirit creature token with flying. SVar:DBToken:DB$ Token | ConditionDefined$ Targeted | ConditionPresent$ Creature | ConditionCompare$ EQ1 | TokenAmount$ 1 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenOwner$ You | TokenColors$ White,Black | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SubAbility$ DBCleanup +DeckHas:Ability$Token Oracle:Creatures you control get +1/+1.\nCreatures your opponents control get -1/-1.\n{2}{W}{B}: Exile target card from an opponent's graveyard. If it was a creature card, you create a 1/1 white and black Spirit creature token with flying. diff --git a/forge-gui/res/cardsfolder/upcoming/frenzied_arynx.txt b/forge-gui/res/cardsfolder/upcoming/frenzied_arynx.txt index b9169b6b113..8a927f26105 100644 --- a/forge-gui/res/cardsfolder/upcoming/frenzied_arynx.txt +++ b/forge-gui/res/cardsfolder/upcoming/frenzied_arynx.txt @@ -5,4 +5,5 @@ PT:3/3 K:Riot K:Trample A:AB$ Pump | Cost$ 4 R G | NumAtt$ +3 | SpellDescription$ CARDNAME gets +3/+0 until end of turn. +DeckHas:Ability$Counters Oracle:Riot (This creature enters the battlefield with your choice of a +1/+1 counter or haste.)\nTrample\n{4}{R}{G}: Frenzied Arynx gets +3/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/galloping_lizrog.txt b/forge-gui/res/cardsfolder/upcoming/galloping_lizrog.txt index 5ad3b047aeb..14e378503ef 100644 --- a/forge-gui/res/cardsfolder/upcoming/galloping_lizrog.txt +++ b/forge-gui/res/cardsfolder/upcoming/galloping_lizrog.txt @@ -8,4 +8,6 @@ SVar:TrigRemoveCounters:DB$ RemoveCounter | ValidSource$ Creature.YouCtrl+counte SVar:DBPutCounters:DB$PutCounter | Defined$ TriggeredCardLKICopy | CounterType$ P1P1 | CounterNum$ X | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$RememberedNumber/Twice +DeckHints:Ability$Counters +DeckHas:Ability$Counters Oracle:Trample\nWhen Galloping Lizrog enters the battlefield, you may remove any number of +1/+1 counters from among creatures you control. If you do, put twice that many +1/+1 counters on Galloping Lizrog. diff --git a/forge-gui/res/cardsfolder/upcoming/gateway_sneak.txt b/forge-gui/res/cardsfolder/upcoming/gateway_sneak.txt index d161e4fe77d..3372e39cc3d 100644 --- a/forge-gui/res/cardsfolder/upcoming/gateway_sneak.txt +++ b/forge-gui/res/cardsfolder/upcoming/gateway_sneak.txt @@ -7,4 +7,5 @@ SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ HIDDEN Unblockable | SpellDescripti SVar:PlayMain1:TRUE T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, draw a card. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 +DeckHints:Type$Gate Oracle:Whenever a Gate enters the battlefield under your control, Gateway Sneak can't be blocked this turn.\nWhenever Gateway Sneak deals combat damage to a player, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/ghor_clan_wrecker.txt b/forge-gui/res/cardsfolder/upcoming/ghor_clan_wrecker.txt index 06d74a0cde7..8bdaf370a7a 100644 --- a/forge-gui/res/cardsfolder/upcoming/ghor_clan_wrecker.txt +++ b/forge-gui/res/cardsfolder/upcoming/ghor_clan_wrecker.txt @@ -4,4 +4,5 @@ Types:Creature Human Warrior PT:2/2 K:Riot K:Menace +DeckHas:Ability$Counters Oracle:Riot (This creature enters the battlefield with your choice of a +1/1+ counter or haste.)\nMenace (This creature can't be blocked except by two or more creatures.) diff --git a/forge-gui/res/cardsfolder/upcoming/goblin_gathering.txt b/forge-gui/res/cardsfolder/upcoming/goblin_gathering.txt index 0e43db0e315..8aa9247d14a 100644 --- a/forge-gui/res/cardsfolder/upcoming/goblin_gathering.txt +++ b/forge-gui/res/cardsfolder/upcoming/goblin_gathering.txt @@ -4,4 +4,5 @@ Types:Sorcery A:SP$ Token | Cost$ 2 R | TokenAmount$ X | TokenName$ Goblin | TokenTypes$ Creature,Goblin | TokenOwner$ You | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 | References$ X | SpellDescription$ Create a number of 1/1 red Goblin creature tokens equal to two plus the number of cards named CARDNAME in your graveyard. SVar:X:Count$ValidGraveyard Card.YouOwn+namedGoblin Gathering/Plus.2 DeckHints:Name$Goblin Gathering +DeckHas:Ability$Token Oracle:Create a number of 1/1 red Goblin creature tokens equal to two plus the number of cards named Goblin Gathering in your graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/growth_chamber_guardian.txt b/forge-gui/res/cardsfolder/upcoming/growth_chamber_guardian.txt index ab2115fc759..b8a29fe6bdf 100644 --- a/forge-gui/res/cardsfolder/upcoming/growth_chamber_guardian.txt +++ b/forge-gui/res/cardsfolder/upcoming/growth_chamber_guardian.txt @@ -3,8 +3,8 @@ ManaCost:1 G Types:Creature Elf Crab Warrior PT:2/2 K:Adapt:2:2 G -DeckHas:Ability$Counters T:Mode$ CounterAddedOnce | ValidCard$ Card.Self | TriggerZones$ Battlefield | CounterType$ P1P1 | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ Whenever one or more +1/+1 counters are put on CARDNAME, you may search your library for a card named CARDNAME, reveal it, put it into your hand, then shuffle your library. SVar:TrigSearch:DB$ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Card.namedGrowth-Chamber Guardian | ChangeNum$ 1 | ShuffleNonMandatory$ True DeckHints:Name$Growth-Chamber Guardian +DeckHas:Ability$Counters Oracle:{2}{G}: Adapt 2. (If this creature has no +1/+1 counters on it, put two +1/+1 counters on it.)\nWhenever one or more +1/+1 counters are put on Growth-Chamber Guardian, you may search your library for a card named Growth-Chamber Guardian, reveal it, put it into your hand, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/upcoming/gruul_beastmaster.txt b/forge-gui/res/cardsfolder/upcoming/gruul_beastmaster.txt index 5f6eaa8441c..37c4d689b4c 100644 --- a/forge-gui/res/cardsfolder/upcoming/gruul_beastmaster.txt +++ b/forge-gui/res/cardsfolder/upcoming/gruul_beastmaster.txt @@ -6,4 +6,5 @@ K:Riot T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, another target creature you control gets +X/+0 until end of turn, where X is CARDNAME's power. SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.YouCtrl+Other | TgtPrompt$ Select another target creature you control | NumAtt$ X | References$ X SVar:X:Count$CardPower +DeckHas:Ability$Counters Oracle:Riot (This creature enters the battlefield with your choice of a +1/+1 counter or haste.)\nWhenever Gruul Beastmaster attacks, another target creature you control gets +X/+0 until end of turn, where X is Gruul Beastmaster's power. diff --git a/forge-gui/res/cardsfolder/upcoming/gruul_spellbreaker.txt b/forge-gui/res/cardsfolder/upcoming/gruul_spellbreaker.txt index 00c298d8fa4..7b88ab891f8 100644 --- a/forge-gui/res/cardsfolder/upcoming/gruul_spellbreaker.txt +++ b/forge-gui/res/cardsfolder/upcoming/gruul_spellbreaker.txt @@ -5,4 +5,5 @@ PT:3/3 K:Riot K:Trample S:Mode$ Continuous | Affected$ You,Card.Self | AddKeyword$ Hexproof | Condition$ PlayerTurn | Description$ As long as it's your turn, you and CARDNAME have hexproof. +DeckHas:Ability$Counters Oracle:Riot (This creature enters the battlefield with your choice of a +1/+1 counter or haste.)\nTrample\nAs long as it's your turn, you and Gruul Spellbreaker have hexproof. diff --git a/forge-gui/res/cardsfolder/upcoming/hydroid_krasis.txt b/forge-gui/res/cardsfolder/upcoming/hydroid_krasis.txt index 390597eb9c5..8abcd05c671 100644 --- a/forge-gui/res/cardsfolder/upcoming/hydroid_krasis.txt +++ b/forge-gui/res/cardsfolder/upcoming/hydroid_krasis.txt @@ -10,4 +10,5 @@ K:Trample K:etbCounter:P1P1:X SVar:X:Count$xPaid SVar:HalfXDown:Count$xPaid/HalfDown +DeckHas:Ability$Counters Oracle:When you cast this spell, you gain half X life and draw half X cards. Round down each time.\nFlying, trample\nHydroid Krasis enters the battlefield with X +1/+1 counters on it. diff --git a/forge-gui/res/cardsfolder/upcoming/impassioned_orator.txt b/forge-gui/res/cardsfolder/upcoming/impassioned_orator.txt index 6be0f322e46..75673f392b0 100644 --- a/forge-gui/res/cardsfolder/upcoming/impassioned_orator.txt +++ b/forge-gui/res/cardsfolder/upcoming/impassioned_orator.txt @@ -4,4 +4,5 @@ Types:Creature Human Cleric PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever another creature enters the battlefield under your control, you gain 1 life. SVar:TrigGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 +DeckHas:Ability$LifeGain Oracle:Whenever another creature enters the battlefield under your control, you gain 1 life. diff --git a/forge-gui/res/cardsfolder/upcoming/imperious_oligarch.txt b/forge-gui/res/cardsfolder/upcoming/imperious_oligarch.txt index 13e0bc6549e..b6b2a3f6b1b 100644 --- a/forge-gui/res/cardsfolder/upcoming/imperious_oligarch.txt +++ b/forge-gui/res/cardsfolder/upcoming/imperious_oligarch.txt @@ -4,4 +4,5 @@ Types:Creature Human Cleric PT:2/1 K:Vigilance K:Afterlife:1 +DeckHas:Ability$Token Oracle:Vigilance\nAfterlife 1 (When this creature dies, create a 1/1 white and black Spirit creature token with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/knight_of_sorrows.txt b/forge-gui/res/cardsfolder/upcoming/knight_of_sorrows.txt index 6170bdcd29d..4e38776c875 100644 --- a/forge-gui/res/cardsfolder/upcoming/knight_of_sorrows.txt +++ b/forge-gui/res/cardsfolder/upcoming/knight_of_sorrows.txt @@ -4,4 +4,5 @@ Types:Creature Human Knight PT:3/3 K:CARDNAME can block an additional creature each combat. K:Afterlife:1 +DeckHas:Ability$Token Oracle:Knight of Sorrows can block an additional creature each combat.\nAfterlife 1 (When this creature dies, create a 1/1 white and black Spirit creature token with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/knight_of_the_last_breath.txt b/forge-gui/res/cardsfolder/upcoming/knight_of_the_last_breath.txt index d826e2ebb6c..4572e73213c 100644 --- a/forge-gui/res/cardsfolder/upcoming/knight_of_the_last_breath.txt +++ b/forge-gui/res/cardsfolder/upcoming/knight_of_the_last_breath.txt @@ -5,4 +5,6 @@ PT:4/4 A:AB$ Token | Cost$ 3 Sac<1/Creature.nonToken+Other/another creature> | TokenAmount$ 1 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenOwner$ You | TokenColors$ White,Black | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SpellDescription$ Create a 1/1 white and black Spirit creature token with flying. SVar:RemRandomDeck:True K:Afterlife:3 +SVar:AIPreference:SacCost$Creature.cmcLE1 +DeckHas:Ability$Token Oracle:{3}, Sacrifice another nontoken creature: Create a 1/1 white and black Spirit creature token with flying.\nAfterlife 3 (When this creature dies, create three 1/1 white and black Spirit creature tokens with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/ministrant_of_obligation.txt b/forge-gui/res/cardsfolder/upcoming/ministrant_of_obligation.txt index 37c661d8fd9..1aa49d93582 100644 --- a/forge-gui/res/cardsfolder/upcoming/ministrant_of_obligation.txt +++ b/forge-gui/res/cardsfolder/upcoming/ministrant_of_obligation.txt @@ -3,4 +3,5 @@ ManaCost:2 W Types:Creature Human Cleric PT:2/1 K:Afterlife:2 +DeckHas:Ability$Token Oracle:Afterlife 2 (When this creature dies, create two 1/1 white and black Spirit creature token with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/orzhov_enforcer.txt b/forge-gui/res/cardsfolder/upcoming/orzhov_enforcer.txt index aad9953f605..d4c7e20517c 100644 --- a/forge-gui/res/cardsfolder/upcoming/orzhov_enforcer.txt +++ b/forge-gui/res/cardsfolder/upcoming/orzhov_enforcer.txt @@ -4,4 +4,5 @@ Types:Creature Human Rogue PT:1/2 K:Deathtouch K:Afterlife:1 +DeckHas:Ability$Token Oracle:Deathtouch\nAfterlife 1 (When this creature dies, create a 1/1 white and black Spirit creature token with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/orzhov_racketeers.txt b/forge-gui/res/cardsfolder/upcoming/orzhov_racketeers.txt index 2a3425bba32..b8baf0da911 100644 --- a/forge-gui/res/cardsfolder/upcoming/orzhov_racketeers.txt +++ b/forge-gui/res/cardsfolder/upcoming/orzhov_racketeers.txt @@ -5,4 +5,5 @@ PT:3/2 T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigDiscard | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player discards a card. SVar:TrigDiscard:DB$Discard | Defined$ TriggeredTarget | NumCards$ 1 | Mode$ TgtChoose K:Afterlife:2 +DeckHas:Ability$Token Oracle:Whenever Orzhov Racketeers deals combat damage to a player, that player discards a card.\nAfterlife 2 (When this creature dies, create two 1/1 white and black Spirit creature tokens with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/pitiless_pontiff.txt b/forge-gui/res/cardsfolder/upcoming/pitiless_pontiff.txt index 6034e8121d5..a70767c291e 100644 --- a/forge-gui/res/cardsfolder/upcoming/pitiless_pontiff.txt +++ b/forge-gui/res/cardsfolder/upcoming/pitiless_pontiff.txt @@ -3,4 +3,5 @@ ManaCost:W B Types:Creature Vampire Cleric PT:2/2 A:AB$ Pump | Cost$ 1 Sac<1/Creature.Other/another creature> | KW$ Deathtouch & Indestructible | SpellDescription$ CARDNAME gains deathtouch and indestructible until end of turn. +SVar:AIPreference:SacCost$Creature.token,Creature.cmcLE2 Oracle:{1}, Sacrifice another creature: Pitiless Pontiff gains deathtouch and indestructible until end of turn. (Damage and effects that say "destroy" don't destroy it.) diff --git a/forge-gui/res/cardsfolder/upcoming/plaza_of_harmony.txt b/forge-gui/res/cardsfolder/upcoming/plaza_of_harmony.txt index 8606fbf3076..fed983c4ae9 100644 --- a/forge-gui/res/cardsfolder/upcoming/plaza_of_harmony.txt +++ b/forge-gui/res/cardsfolder/upcoming/plaza_of_harmony.txt @@ -3,7 +3,8 @@ ManaCost: Types:Land T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | IsPresent$ Gate.YouCtrl | PresentCompare$ GE2 | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, if you control two or more Gates, gain 3 life. SVar:TrigGainLife:DB$ GainLife | LifeAmount$ 3 -DeckHints:Type$Gate A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ ManaReflected | Cost$ T | ColorOrType$ Type | Valid$ Gate.YouCtrl | ReflectProperty$ Produce | SpellDescription$ Add one mana of any type a Gate you control could produce. +DeckHints:Type$Gate +DeckHas:Ability$LifeGain Oracle:When Plaza of Harmony enters the battlefield, if you control two or more Gates, you gain 3 life.\n{T}: Add {C}.\n{T}: Add one mana of any type a Gate you control could produce. diff --git a/forge-gui/res/cardsfolder/upcoming/prime_speaker_vannifar.txt b/forge-gui/res/cardsfolder/upcoming/prime_speaker_vannifar.txt index d64c9413ae4..7c7c423cf6c 100644 --- a/forge-gui/res/cardsfolder/upcoming/prime_speaker_vannifar.txt +++ b/forge-gui/res/cardsfolder/upcoming/prime_speaker_vannifar.txt @@ -2,6 +2,8 @@ Name:Prime Speaker Vannifar ManaCost:2 G U Types:Legendary Creature Elf Ooze Wizard PT:2/4 -A:AB$ ChangeZone | Cost$ T Sac<1/Creature.Other/another creature> | Origin$ Library | Destination$ Battlefield | ChangeType$ Creature.cmcEQX | References$ X | ChangeNum$ 1 | SorcerySpeed$ True | SpellDescription$ Search your library for a creature card with converted mana cost equal to 1 plus the sacrificed creature's converted mana cost, put that card onto the battlefield, then shuffle your library. Activate this ability only any time you could cast a sorcery. +A:AB$ ChangeZone | Cost$ T Sac<1/Creature.Other/another creature> | Origin$ Library | Destination$ Battlefield | ChangeType$ Creature.cmcEQX | References$ X | ChangeNum$ 1 | SorcerySpeed$ True | AILogic$ SacAndUpgrade | SpellDescription$ Search your library for a creature card with converted mana cost equal to 1 plus the sacrificed creature's converted mana cost, put that card onto the battlefield, then shuffle your library. Activate this ability only any time you could cast a sorcery. SVar:X:Sacrificed$CardManaCost/Plus.1 +# AI Preference is needed to make the AI consider the ability. Further constraints are defined by AILogic SacAndUpgrade. +SVar:AIPreference:SacCost$Creature Oracle:{T}, Sacrifice another creature: Search your library for a creature card with converted mana cost equal to 1 plus the sacrificed creature's converted mana cost, put that card onto the battlefield, then shuffle your library. Activate this ability only any time you could cast a sorcery. diff --git a/forge-gui/res/cardsfolder/upcoming/prying_eyes.txt b/forge-gui/res/cardsfolder/upcoming/prying_eyes.txt index 5b3987a99bb..49800163899 100644 --- a/forge-gui/res/cardsfolder/upcoming/prying_eyes.txt +++ b/forge-gui/res/cardsfolder/upcoming/prying_eyes.txt @@ -3,4 +3,5 @@ ManaCost:4 U U Types:Instant A:SP$ Draw | Cost$ 4 U U | NumCards$ 4 | SpellDescription$ Draw four cards, then discard two cards.| SubAbility$ DBDiscard SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 2 | Mode$ TgtChoose +DeckHas:Ability$Discard Oracle:Draw four cards, then discard two cards. diff --git a/forge-gui/res/cardsfolder/upcoming/rampaging_rendhorn.txt b/forge-gui/res/cardsfolder/upcoming/rampaging_rendhorn.txt index dcdbf63e0db..26083cd1ba7 100644 --- a/forge-gui/res/cardsfolder/upcoming/rampaging_rendhorn.txt +++ b/forge-gui/res/cardsfolder/upcoming/rampaging_rendhorn.txt @@ -3,4 +3,5 @@ ManaCost:4 G Types:Creature Beast PT:4/4 K:Riot +DeckHas:Ability$Counters Oracle:Riot (This creature enters the battlefield with your choice of a +1/+1 counter or haste.) diff --git a/forge-gui/res/cardsfolder/upcoming/ravager_wurm.txt b/forge-gui/res/cardsfolder/upcoming/ravager_wurm.txt index ab0c81cd716..dc241c32c6f 100644 --- a/forge-gui/res/cardsfolder/upcoming/ravager_wurm.txt +++ b/forge-gui/res/cardsfolder/upcoming/ravager_wurm.txt @@ -7,4 +7,5 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigCharm:DB$ Charm | MinCharmNum$ 0 | CharmNum$ 1 | Choices$ DBFight,DBDestroy SVar:DBFight:DB$ Fight | Defined$ TriggeredCardLKICopy | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Choose target creature you don't control | SpellDescription$ CARDNAME fights target creature you don't control. SVar:DBDestroy:DB$ Destroy | ValidTgts$ Land.hasNonManaActivatedAbility | TgtPrompt$ Select target land with an activated ability that isn't a mana ability | SpellDescription$ Destroy target land with an activated ability that iasn't a mana ability. +DeckHas:Ability$Counters Oracle:Riot (This creature enters the battlefield with your choice of a +1/+1 counter or haste.)\nWhen Ravager Wurm enters the battlefield, choose up to one -\n- Ravager Wurm fights target creature you don't control.\n- Destroy target land with an activated ability that isn't a mana ability. diff --git a/forge-gui/res/cardsfolder/upcoming/rhythm_of_the_wild.txt b/forge-gui/res/cardsfolder/upcoming/rhythm_of_the_wild.txt index 0a239df820f..8370ea9cb9e 100644 --- a/forge-gui/res/cardsfolder/upcoming/rhythm_of_the_wild.txt +++ b/forge-gui/res/cardsfolder/upcoming/rhythm_of_the_wild.txt @@ -4,4 +4,5 @@ Types:Enchantment S:Mode$ Continuous | Affected$ Creature.YouCtrl | AffectedZone$ Stack | AddHiddenKeyword$ CARDNAME can't be countered. | Description$ Creature spells you control can't be countered. S:Mode$ Continuous | Affected$ Creature.nonToken+YouCtrl | AddKeyword$ Riot| Description$ Nontoken creatures you control have riot. (They enter the battlefield with your choice of a +1/+1 counter or haste.) SVar:PlayMain1:TRUE +DeckHas:Ability$Counters Oracle:Creature spells you control can't be countered.\nNontoken creatures you control have riot. (They enter the battlefield with your choice of a +1/+1 counter or haste.) diff --git a/forge-gui/res/cardsfolder/upcoming/senate_guildmage.txt b/forge-gui/res/cardsfolder/upcoming/senate_guildmage.txt index ba151e35c78..850a1c0edcb 100644 --- a/forge-gui/res/cardsfolder/upcoming/senate_guildmage.txt +++ b/forge-gui/res/cardsfolder/upcoming/senate_guildmage.txt @@ -5,4 +5,5 @@ PT:2/2 A:AB$ GainLife | Cost$ W T | LifeAmount$ 2 | SpellDescription$ You gain 2 life. A:AB$ Draw | Cost$ U T | NumCards$ 1 | SpellDescription$ Draw a card, then discard a card. | SubAbility$ DBDiscard SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose +DeckHas:Ability$LifeGain & Ability$Discard Oracle:{W}, {T}: You gain 2 life.\n{U}, {T}: Draw a card, then discard a card. diff --git a/forge-gui/res/cardsfolder/upcoming/seraph_of_the_scales.txt b/forge-gui/res/cardsfolder/upcoming/seraph_of_the_scales.txt index 1981a8f9eea..503d4c5a9c7 100644 --- a/forge-gui/res/cardsfolder/upcoming/seraph_of_the_scales.txt +++ b/forge-gui/res/cardsfolder/upcoming/seraph_of_the_scales.txt @@ -6,4 +6,5 @@ K:Flying A:AB$ Pump | Cost$ W | Defined$ Self | KW$ Vigilance | SpellDescription$ CARDNAME gains vigilance until end of turn. A:AB$ Pump | Cost$ B | Defined$ Self | KW$ Deathtouch | SpellDescription$ CARDNAME gains deathtouch until end of turn. K:Afterlife:2 +DeckHas:Ability$Token Oracle:Flying\n{W}: Seraph of the Scales gains vigilance until end of turn.\n{B}: Seraph of the Scales gains deathtouch until end of turn.\nAfterlife 2 (When this creature dies, create two 1/1 white and black Spirit creature tokens with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/spawn_of_mayhem.txt b/forge-gui/res/cardsfolder/upcoming/spawn_of_mayhem.txt index 68d9c1d232e..3d4b5725ea0 100644 --- a/forge-gui/res/cardsfolder/upcoming/spawn_of_mayhem.txt +++ b/forge-gui/res/cardsfolder/upcoming/spawn_of_mayhem.txt @@ -9,4 +9,5 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E SVar:TrigDmgOpp:DB$DealDamage | Defined$ Player | NumDmg$ 1 | SubAbility$ DBCounter SVar:DBCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | ConditionCheckSVar$ X | ConditionSVarCompare$ LE10 | References$ X SVar:X:Count$YourLifeTotal +DeckHas:Ability$Counters Oracle:Spectacle {1}{B}{B} (You may cast this spell for its spectacle cost rather than its mana cost if an opponent lost life this turn.)\nFlying, trample\nAt the beginning of your upkeep, Spawn of Mayhem deals 1 damage to each player. Then if you have 10 or less life, put a +1/+1 counter on Spawn of Mayhem. diff --git a/forge-gui/res/cardsfolder/upcoming/sphinxs_insight.txt b/forge-gui/res/cardsfolder/upcoming/sphinxs_insight.txt index ecd8f6980d0..1803de4d01f 100644 --- a/forge-gui/res/cardsfolder/upcoming/sphinxs_insight.txt +++ b/forge-gui/res/cardsfolder/upcoming/sphinxs_insight.txt @@ -3,4 +3,5 @@ ManaCost:2 W U Types:Instant A:SP$ Draw | Cost$ 2 W U | NumCards$ 2 | SubAbility$ DBLife | StackDescription$ SpellDescription | SpellDescription$ Draw two cards. SVar:DBLife:DB$ GainLife | LifeAmount$ 2 | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SpellDescription$ Addendum - If you cast this spell during your main phase, you gain 2 life. +DeckHas:Ability$LifeGain Oracle:Draw two cards.\nAddendum - If you cast this spell during your main phase, you gain 2 life. diff --git a/forge-gui/res/cardsfolder/upcoming/sylvan_brushstrider.txt b/forge-gui/res/cardsfolder/upcoming/sylvan_brushstrider.txt index a2465c1048c..306d762121e 100644 --- a/forge-gui/res/cardsfolder/upcoming/sylvan_brushstrider.txt +++ b/forge-gui/res/cardsfolder/upcoming/sylvan_brushstrider.txt @@ -4,4 +4,5 @@ Types:Creature Beast PT:3/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 2 life. SVar:TrigGainLife:DB$GainLife | LifeAmount$ 2 +DeckHas:Ability$LifeGain Oracle:When Sylvan Brushstrider enters the battlefield, you gain 2 life. diff --git a/forge-gui/res/cardsfolder/upcoming/syndicate_messenger.txt b/forge-gui/res/cardsfolder/upcoming/syndicate_messenger.txt index 521a64a8c12..7104e1360ce 100644 --- a/forge-gui/res/cardsfolder/upcoming/syndicate_messenger.txt +++ b/forge-gui/res/cardsfolder/upcoming/syndicate_messenger.txt @@ -4,4 +4,5 @@ Types:Creature Bird PT:2/3 K:Flying K:Afterlife:1 +DeckHas:Ability$Token Oracle:Flying\nAfterlife 1 (When this creature dies, create a 1/1 white and black Spirit creature token with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/territorial_boar.txt b/forge-gui/res/cardsfolder/upcoming/territorial_boar.txt index f69ee6029e3..f69e2c574e6 100644 --- a/forge-gui/res/cardsfolder/upcoming/territorial_boar.txt +++ b/forge-gui/res/cardsfolder/upcoming/territorial_boar.txt @@ -5,4 +5,5 @@ PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.powerGE4+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a creature with power 4 or greater enters the battlefield under your control, CARDNAME gets +1/+1 and gains vigilance until end of turn. SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ +1 | NumDef$ +1 | KW$ Vigilance SVar:RemRandomDeck:True +SVar:BuffedBy:Creature.powerGE4 Oracle:Whenever a creature with power 4 or greater enters the battlefield under your control, Territorial Boar gets +1/+1 and gains vigilance until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/teysa_karlov.txt b/forge-gui/res/cardsfolder/upcoming/teysa_karlov.txt index 081b84cd822..cc63eea3839 100644 --- a/forge-gui/res/cardsfolder/upcoming/teysa_karlov.txt +++ b/forge-gui/res/cardsfolder/upcoming/teysa_karlov.txt @@ -4,4 +4,5 @@ Types:Legendary Creature Human Advisor PT:2/4 S:Mode$ Continuous | Affected$ You | AddKeyword$ Dieharmonicon | Description$ If a creature dying causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time. S:Mode$ Continuous | Affected$ Creature.token+YouCtrl | AddKeyword$ Vigilance & Lifelink | Description$ Creature tokens you control have vigilance and lifelink. +DeckHints:Ability$Token Oracle:If a creature dying causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time.\nCreature tokens you control have vigilance and lifelink. diff --git a/forge-gui/res/cardsfolder/upcoming/the_haunt_of_hightower.txt b/forge-gui/res/cardsfolder/upcoming/the_haunt_of_hightower.txt index d696d6175e7..e05e9dca861 100644 --- a/forge-gui/res/cardsfolder/upcoming/the_haunt_of_hightower.txt +++ b/forge-gui/res/cardsfolder/upcoming/the_haunt_of_hightower.txt @@ -9,4 +9,5 @@ SVar:TrigDiscard:DB$Discard | Defined$ DefendingPlayer | NumCards$ 1 | Mode$ Tgt SVar:HasAttackEffect:TRUE T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Card.nonToken+OppOwn | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a card is put into an opponent's graveyard from anywhere, put a +1/+1 counter on CARDNAME. SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +DeckHas:Ability$Counters Oracle:Flying, lifelink\nWhenever The Haunt of Hightower attacks, defending player discards a card.\nWhenever a card is put into an opponent's graveyard from anywhere, put a +1/+1 counter on The Haunt of Hightower. diff --git a/forge-gui/res/cardsfolder/upcoming/tithe_taker.txt b/forge-gui/res/cardsfolder/upcoming/tithe_taker.txt index 5de300d42f5..1f4f33dae51 100644 --- a/forge-gui/res/cardsfolder/upcoming/tithe_taker.txt +++ b/forge-gui/res/cardsfolder/upcoming/tithe_taker.txt @@ -4,4 +4,5 @@ Types:Creature Human Soldier PT:2/1 K:Afterlife:1 S:Mode$ RaiseCost | ValidCard$ Card | Activator$ Opponent | ValidSpell$ Spell,Activated.nonManaAbility | Amount$ 1 | Condition$ PlayerTurn | Description$ During your turn, spells your opponents cast cost {1} more to cast and abilities your opponents activate cost {1} more to activate unless they're mana abilities. +DeckHas:Ability$Token Oracle:During your turn, spells your opponents cast cost {1} more to cast and abilities your opponents activate cost {1} more to activate unless they're mana abilities.\nAfterlife 1 (When this creature dies, create a 1/1 white and black Spirit creature token with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/trollbred_guardian.txt b/forge-gui/res/cardsfolder/upcoming/trollbred_guardian.txt index 9c2718c5365..3f26c51e769 100644 --- a/forge-gui/res/cardsfolder/upcoming/trollbred_guardian.txt +++ b/forge-gui/res/cardsfolder/upcoming/trollbred_guardian.txt @@ -3,7 +3,7 @@ ManaCost:4 G Types:Creature Troll Frog Warrior PT:5/5 K:Adapt:2:2 G -DeckHas:Ability$Counters S:Mode$ Continuous | Affected$ Creature.YouCtrl+counters_GE1_P1P1 | AddKeyword$ Trample | Description$ Each creature you control with a +1/+1 counter on it has trample. +DeckHas:Ability$Counters DeckHints:Ability$Counters Oracle:{2}{G}: Adapt 2. (If this creature has no +1/+1 counters on it, put two +1/+1 counters on it.)\nEach creature you control with a +1/+1 counter on it has trample. diff --git a/forge-gui/res/cardsfolder/upcoming/undercity_scavenger.txt b/forge-gui/res/cardsfolder/upcoming/undercity_scavenger.txt index 0ff05038a8a..c4a94a280cd 100644 --- a/forge-gui/res/cardsfolder/upcoming/undercity_scavenger.txt +++ b/forge-gui/res/cardsfolder/upcoming/undercity_scavenger.txt @@ -6,4 +6,6 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigPutCounter:AB$ PutCounter | Cost$ Sac<1/Creature.Other/another creature> | Defined$ Self | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ DBScry SVar:DBScry:DB$ Scry | ScryNum$ 2 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:AIPreference:SacCost$Creature.token,Creature.cmcLE3 +DeckHas:Ability$Counters Oracle:When Undercity Scavenger enters the battlefield, you may sacrifice another creature. If you do, put two +1/+1 counters on Undercity Scavenger, then scry 2. diff --git a/forge-gui/res/cardsfolder/upcoming/undercitys_embrace.txt b/forge-gui/res/cardsfolder/upcoming/undercitys_embrace.txt index 95ffb7eb091..528da6b040d 100644 --- a/forge-gui/res/cardsfolder/upcoming/undercitys_embrace.txt +++ b/forge-gui/res/cardsfolder/upcoming/undercitys_embrace.txt @@ -3,4 +3,5 @@ ManaCost:2 B Types:Instant A:SP$ Sacrifice | Cost$ 2 B | ValidTgts$ Opponent | SacValid$ Creature | SacMessage$ Creature | SubAbility$ DBGainLife | SpellDescription$ Target opponent sacrifices a creature. If you control a creature with power 4 or greater, you gain 4 life. | StackDescription$ SpellDescription SVar:DBGainLife:DB$ GainLife | Defined$ You | ConditionPresent$ Creature.YouCtrl+powerGE4 | ConditionCompare$ GE1 | StackDescription$ If you control a creature with power 4 or greater, you gain 4 life. +DeckHas:Ability$LifeGain Oracle:Target opponent sacrifices a creature. If you control a creature with power 4 or greater, you gain 4 life. diff --git a/forge-gui/res/cardsfolder/upcoming/vindictive_vampire.txt b/forge-gui/res/cardsfolder/upcoming/vindictive_vampire.txt index 2c9ce3a3068..7c2d3869b9a 100644 --- a/forge-gui/res/cardsfolder/upcoming/vindictive_vampire.txt +++ b/forge-gui/res/cardsfolder/upcoming/vindictive_vampire.txt @@ -5,4 +5,5 @@ PT:2/3 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever another creature you control dies, CARDNAME deals 1 damage to each opponent and you gain 1 life. SVar:TrigDealDamage:DB$ DamageAll | ValidPlayers$ Player.Opponent | NumDmg$ 1 | SubAbility$ DBGainLife SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 +DeckHas:Ability$LifeGain Oracle:Whenever another creature you control dies, Vindictive Vampire deals 1 damage to each opponent and you gain 1 life. diff --git a/forge-gui/res/cardsfolder/upcoming/watchful_giant.txt b/forge-gui/res/cardsfolder/upcoming/watchful_giant.txt index d8d5bbdb6a8..8e7fcc9553e 100644 --- a/forge-gui/res/cardsfolder/upcoming/watchful_giant.txt +++ b/forge-gui/res/cardsfolder/upcoming/watchful_giant.txt @@ -4,5 +4,5 @@ Types:Creature Giant Soldier PT:3/6 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a 1/1 white Human creature token. SVar:TrigToken:DB$Token | TokenAmount$ 1 | TokenName$ Human | TokenTypes$ Creature,Human | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Create a 1/1 white Human creature token. -DeckHints:Type$Human +DeckHas:Ability$Token Oracle:When Watchful Giant enters the battlefield, create a 1/1 white Human creature token. diff --git a/forge-gui/res/cardsfolder/upcoming/wrecking_beast.txt b/forge-gui/res/cardsfolder/upcoming/wrecking_beast.txt index c365de7a507..2acd7514fc7 100644 --- a/forge-gui/res/cardsfolder/upcoming/wrecking_beast.txt +++ b/forge-gui/res/cardsfolder/upcoming/wrecking_beast.txt @@ -4,4 +4,5 @@ Types:Creature Beast PT:6/6 K:Riot K:Trample -Oracle:Riot (This creature enters the battlefield with your choice of a +1/1+ counter or haste.)\nTrample +DeckHas:Ability$Counters +Oracle:Riot (This creature enters the battlefield with your choice of a +1/+1 counter or haste.)\nTrample diff --git a/forge-gui/res/cardsfolder/upcoming/zhur_taa_goblin.txt b/forge-gui/res/cardsfolder/upcoming/zhur_taa_goblin.txt index a136ca50236..fcb4f5e13a9 100644 --- a/forge-gui/res/cardsfolder/upcoming/zhur_taa_goblin.txt +++ b/forge-gui/res/cardsfolder/upcoming/zhur_taa_goblin.txt @@ -3,4 +3,5 @@ ManaCost:R G Types:Creature Goblin Berserker PT:2/2 K:Riot +DeckHas:Ability$Counters Oracle:Riot (This creature enters the battlefield with your choice of a +1/+1 counter or haste.) From 5165c1623341e624dad8209152af6046024a0c9d Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 19 Jan 2019 07:57:08 +0100 Subject: [PATCH 617/901] Fix for upcoming cards --- .../game/staticability/StaticAbilityContinuous.java | 10 ++++++---- forge-gui/res/cardsfolder/l/liege_of_the_tangle.txt | 5 ++--- forge-gui/res/cardsfolder/t/transguild_courier.txt | 5 ++--- .../res/cardsfolder/upcoming/electrodominance.txt | 2 +- .../res/cardsfolder/upcoming/ethereal_absolution.txt | 4 +++- .../res/cardsfolder/upcoming/goblin_gathering.txt | 3 ++- .../cardsfolder/upcoming/knight_of_the_last_breath.txt | 3 ++- forge-gui/res/cardsfolder/upcoming/sharktocrab.txt | 2 +- .../cardsfolder/upcoming/sphinx_of_the_guildpact.txt | 2 +- forge-gui/res/cardsfolder/upcoming/watchful_giant.txt | 3 ++- 10 files changed, 22 insertions(+), 17 deletions(-) diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java index 63e71ca52a1..feb5fd659c2 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java @@ -336,9 +336,10 @@ public final class StaticAbilityContinuous { final String colors = params.get("AddColor"); if (colors.equals("ChosenColor")) { addColors = CardUtil.getShortColorsString(hostCard.getChosenColors()); + } else if (colors.equals("All")) { + addColors = "W U B R G"; } else { - addColors = CardUtil.getShortColorsString(new ArrayList(Arrays.asList(colors.split( - " & ")))); + addColors = CardUtil.getShortColorsString(Arrays.asList(colors.split(" & "))); } } @@ -346,9 +347,10 @@ public final class StaticAbilityContinuous { final String colors = params.get("SetColor"); if (colors.equals("ChosenColor")) { addColors = CardUtil.getShortColorsString(hostCard.getChosenColors()); + } else if (colors.equals("All")) { + addColors = "W U B R G"; } else { - addColors = CardUtil.getShortColorsString(new ArrayList(Arrays.asList( - colors.split(" & ")))); + addColors = CardUtil.getShortColorsString(Arrays.asList(colors.split(" & "))); } se.setOverwriteColors(true); } diff --git a/forge-gui/res/cardsfolder/l/liege_of_the_tangle.txt b/forge-gui/res/cardsfolder/l/liege_of_the_tangle.txt index 3ed7075e00b..c9fbe4af558 100644 --- a/forge-gui/res/cardsfolder/l/liege_of_the_tangle.txt +++ b/forge-gui/res/cardsfolder/l/liege_of_the_tangle.txt @@ -3,12 +3,11 @@ ManaCost:6 G G Types:Creature Elemental PT:8/8 K:Trample -S:Mode$ Continuous | Affected$ Card.counters_GE1_AWAKENING | AddType$ Creature & Elemental | SetColor$ Green | SetPower$ 8 | SetToughness$ 8 T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may choose any number of target lands you control and put an awakening counter on each of them. Each of those lands is an 8/8 green Elemental creature for as long as it has an awakening counter on it. They're still lands. SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Land.YouCtrl | OptionalDecider$ You | TargetMin$ 0 | TargetMax$ X | TgtPrompt$ Select lands you control | CounterType$ AWAKENING | CounterNum$ 1 | SubAbility$ DBEffect | References$ X SVar:X:Count$Valid Land.YouCtrl -SVar:DBEffect:DB$ Effect | Name$ Awakening Effect | StaticAbilities$ KWAnimateAll | Unique$ True | Duration$ Permanent -SVar:KWAnimateAll:Mode$ Continuous | EffectZone$ Command | Affected$ Card.counters_GE1_AWAKENING | SetPower$ 8 | SetToughness$ 8 | AddType$ Creature & Elemental | SetColor$ Green | Description$ Each of those lands is an 8/8 green Elemental creature for as long as it has an awakening counter on it. They're still lands. +SVar:DBEffect:DB$ Effect | Name$ Awakening Effect | StaticAbilities$ KWAnimateAll | Duration$ Permanent | RememberObjects$ Targeted +SVar:KWAnimateAll:Mode$ Continuous | EffectZone$ Command | Affected$ Card.IsRemembered+counters_GE1_AWAKENING | SetPower$ 8 | SetToughness$ 8 | AddType$ Creature & Elemental | SetColor$ Green | Description$ Each of those lands is an 8/8 green Elemental creature for as long as it has an awakening counter on it. They're still lands. SVar:MustBeBlocked:True SVar:Picture:http://www.wizards.com/global/images/magic/general/liege_of_the_tangle.jpg Oracle:Trample\nWhenever Liege of the Tangle deals combat damage to a player, you may choose any number of target lands you control and put an awakening counter on each of them. Each of those lands is an 8/8 green Elemental creature for as long as it has an awakening counter on it. They're still lands. diff --git a/forge-gui/res/cardsfolder/t/transguild_courier.txt b/forge-gui/res/cardsfolder/t/transguild_courier.txt index ca031b01d62..43ff467cc3a 100644 --- a/forge-gui/res/cardsfolder/t/transguild_courier.txt +++ b/forge-gui/res/cardsfolder/t/transguild_courier.txt @@ -1,8 +1,7 @@ Name:Transguild Courier ManaCost:4 Types:Artifact Creature Golem -Text:CARDNAME is all colors (even if this card isn't on the battlefield). +S:Mode$ Continuous | EffectZone$ All | Affected$ Card.Self | CharacteristicDefining$ True | SetColor$ All | Description$ CARDNAME is all colors. PT:3/3 -Colors:white,blue,black,red,green SVar:Picture:http://www.wizards.com/global/images/magic/general/transguild_courier.jpg -Oracle: +Oracle:Transguild Courier is all colors diff --git a/forge-gui/res/cardsfolder/upcoming/electrodominance.txt b/forge-gui/res/cardsfolder/upcoming/electrodominance.txt index 40b9dcfd14e..9d272b3eea8 100644 --- a/forge-gui/res/cardsfolder/upcoming/electrodominance.txt +++ b/forge-gui/res/cardsfolder/upcoming/electrodominance.txt @@ -2,6 +2,6 @@ Name:Electrodominance ManaCost:X R R Types:Instant A:SP$ DealDamage | Cost$ X R R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | References$ X | SubAbility$ DBPlay | SpellDescription$ CARDNAME deals X damage to any target. You may cast a card with converted mana cost X or less from your hand without paying its mana cost. -SVar:DBPlay:DB$ Play | Valid$ Targeted.cmcLEX+YouCtrl | ValidZone$ Hand | WithoutManaCost$ True | Amount$ 1 | Controller$ You | Optional$ True | References$ X +SVar:DBPlay:DB$ Play | Valid$ Card.nonLand+YouOwn+cmcLEX | ValidZone$ Hand | WithoutManaCost$ True | Amount$ 1 | Controller$ You | Optional$ True | References$ X SVar:X:Count$xPaid Oracle:Electrodominance deals X damage to any target. You may cast a card with converted mana cost X or less from your hand without paying its mana cost. diff --git a/forge-gui/res/cardsfolder/upcoming/ethereal_absolution.txt b/forge-gui/res/cardsfolder/upcoming/ethereal_absolution.txt index 11450772185..288224e09e9 100644 --- a/forge-gui/res/cardsfolder/upcoming/ethereal_absolution.txt +++ b/forge-gui/res/cardsfolder/upcoming/ethereal_absolution.txt @@ -6,5 +6,7 @@ S:Mode$ Continuous | Affected$ Creature.OppCtrl | AddPower$ -1 | AddToughness$ - SVar:PlayMain1:TRUE SVar:RemRandomDeck:True A:AB$ ChangeZone | Cost$ 4 W B | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Card.OppOwn | SubAbility$ DBToken | SpellDescription$ Exile target card from an opponent's graveyard. If it was a creature card, you create a 1/1 white and black Spirit creature token with flying. -SVar:DBToken:DB$ Token | ConditionDefined$ Targeted | ConditionPresent$ Creature | ConditionCompare$ EQ1 | TokenAmount$ 1 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenOwner$ You | TokenColors$ White,Black | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SubAbility$ DBCleanup +SVar:DBToken:DB$ Token | ConditionDefined$ Targeted | ConditionPresent$ Creature | ConditionCompare$ EQ1 | TokenAmount$ 1 | TokenScript$ wb_1_1_spirit_flying | TokenOwner$ You | SubAbility$ DBCleanup +SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True +DeckHas:Ability$Token Oracle:Creatures you control get +1/+1.\nCreatures your opponents control get -1/-1.\n{2}{W}{B}: Exile target card from an opponent's graveyard. If it was a creature card, you create a 1/1 white and black Spirit creature token with flying. diff --git a/forge-gui/res/cardsfolder/upcoming/goblin_gathering.txt b/forge-gui/res/cardsfolder/upcoming/goblin_gathering.txt index 0e43db0e315..af886dfda2a 100644 --- a/forge-gui/res/cardsfolder/upcoming/goblin_gathering.txt +++ b/forge-gui/res/cardsfolder/upcoming/goblin_gathering.txt @@ -1,7 +1,8 @@ Name:Goblin Gathering ManaCost:2 R Types:Sorcery -A:SP$ Token | Cost$ 2 R | TokenAmount$ X | TokenName$ Goblin | TokenTypes$ Creature,Goblin | TokenOwner$ You | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 | References$ X | SpellDescription$ Create a number of 1/1 red Goblin creature tokens equal to two plus the number of cards named CARDNAME in your graveyard. +A:SP$ Token | Cost$ 2 R | TokenAmount$ X | TokenScript$ r_1_1_goblin | TokenOwner$ You | References$ X | SpellDescription$ Create a number of 1/1 red Goblin creature tokens equal to two plus the number of cards named CARDNAME in your graveyard. SVar:X:Count$ValidGraveyard Card.YouOwn+namedGoblin Gathering/Plus.2 DeckHints:Name$Goblin Gathering +DeckHas:Ability$Token Oracle:Create a number of 1/1 red Goblin creature tokens equal to two plus the number of cards named Goblin Gathering in your graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/knight_of_the_last_breath.txt b/forge-gui/res/cardsfolder/upcoming/knight_of_the_last_breath.txt index d826e2ebb6c..cb4c548f5ad 100644 --- a/forge-gui/res/cardsfolder/upcoming/knight_of_the_last_breath.txt +++ b/forge-gui/res/cardsfolder/upcoming/knight_of_the_last_breath.txt @@ -2,7 +2,8 @@ Name:Knight of the Last Breath ManaCost:5 W B Types:Creature Giant Knight PT:4/4 -A:AB$ Token | Cost$ 3 Sac<1/Creature.nonToken+Other/another creature> | TokenAmount$ 1 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenOwner$ You | TokenColors$ White,Black | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SpellDescription$ Create a 1/1 white and black Spirit creature token with flying. +A:AB$ Token | Cost$ 3 Sac<1/Creature.nonToken+Other/another creature> | TokenAmount$ 1 | TokenScript$ wb_1_1_spirit_flying | TokenOwner$ You | SpellDescription$ Create a 1/1 white and black Spirit creature token with flying. SVar:RemRandomDeck:True K:Afterlife:3 +DeckHas:Ability$Token Oracle:{3}, Sacrifice another nontoken creature: Create a 1/1 white and black Spirit creature token with flying.\nAfterlife 3 (When this creature dies, create three 1/1 white and black Spirit creature tokens with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/sharktocrab.txt b/forge-gui/res/cardsfolder/upcoming/sharktocrab.txt index ca3af405231..6c878bed090 100644 --- a/forge-gui/res/cardsfolder/upcoming/sharktocrab.txt +++ b/forge-gui/res/cardsfolder/upcoming/sharktocrab.txt @@ -2,7 +2,7 @@ Name:Sharktocrab ManaCost:2 G U Types:Creature Fish Octopus Crab PT:4/4 -K:Adapt:1 +K:Adapt:2 G U:1 DeckHas:Ability$Counters T:Mode$ CounterAddedOnce | ValidCard$ Card.Self | TriggerZones$ Battlefield | CounterType$ P1P1 | Execute$ TrigTap | TriggerDescription$ Whenever one or more +1/+1 counter are put on CARDNAME, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls. | SubAbility$ DBPump diff --git a/forge-gui/res/cardsfolder/upcoming/sphinx_of_the_guildpact.txt b/forge-gui/res/cardsfolder/upcoming/sphinx_of_the_guildpact.txt index 942bcf5ab61..b782846b8d5 100644 --- a/forge-gui/res/cardsfolder/upcoming/sphinx_of_the_guildpact.txt +++ b/forge-gui/res/cardsfolder/upcoming/sphinx_of_the_guildpact.txt @@ -2,7 +2,7 @@ Name:Sphinx of the Guildpact ManaCost:7 Types:Artifact Creature Sphinx PT:5/5 -K:CARDNAME is all colors. +S:Mode$ Continuous | EffectZone$ All | Affected$ Card.Self | CharacteristicDefining$ True | SetColor$ All | Description$ CARDNAME is all colors. K:Flying K:Hexproof:Card.MonoColor:monocolored Oracle:Sphinx of the Guildpact is all colors.\nFlying\nHexproof from monocolored (This creature can't be the target of monocolored spells or abilities your opponents control.) diff --git a/forge-gui/res/cardsfolder/upcoming/watchful_giant.txt b/forge-gui/res/cardsfolder/upcoming/watchful_giant.txt index d8d5bbdb6a8..d214f346e1e 100644 --- a/forge-gui/res/cardsfolder/upcoming/watchful_giant.txt +++ b/forge-gui/res/cardsfolder/upcoming/watchful_giant.txt @@ -3,6 +3,7 @@ ManaCost:5 W Types:Creature Giant Soldier PT:3/6 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a 1/1 white Human creature token. -SVar:TrigToken:DB$Token | TokenAmount$ 1 | TokenName$ Human | TokenTypes$ Creature,Human | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Create a 1/1 white Human creature token. +SVar:TrigToken:DB$Token | TokenAmount$ 1 | TokenScript$ w_1_1_human | TokenOwner$ You | SpellDescription$ Create a 1/1 white Human creature token. DeckHints:Type$Human +DeckHas:Ability$Token Oracle:When Watchful Giant enters the battlefield, create a 1/1 white Human creature token. From ffabf141925eb1d6511c12f48d95af868f943bf3 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 19 Jan 2019 09:34:58 +0300 Subject: [PATCH 618/901] - AI hints for RNA. --- forge-gui/res/cardsfolder/upcoming/archway_angel.txt | 1 + forge-gui/res/cardsfolder/upcoming/bankrupt_in_blood.txt | 1 + forge-gui/res/cardsfolder/upcoming/basilica_bell_haunt.txt | 1 + forge-gui/res/cardsfolder/upcoming/benthic_biomancer.txt | 1 + forge-gui/res/cardsfolder/upcoming/biogenic_ooze.txt | 2 +- forge-gui/res/cardsfolder/upcoming/biogenic_upgrade.txt | 1 + forge-gui/res/cardsfolder/upcoming/biomancers_familiar.txt | 1 + forge-gui/res/cardsfolder/upcoming/bolrac_clan_crusher.txt | 1 + forge-gui/res/cardsfolder/upcoming/burning_tree_vandal.txt | 3 ++- forge-gui/res/cardsfolder/upcoming/carrion_imp.txt | 1 + forge-gui/res/cardsfolder/upcoming/debtors_transport.txt | 1 + forge-gui/res/cardsfolder/upcoming/dovins_automaton.txt | 1 + forge-gui/res/cardsfolder/upcoming/essence_capture.txt | 1 + forge-gui/res/cardsfolder/upcoming/frenzied_arynx.txt | 1 + forge-gui/res/cardsfolder/upcoming/galloping_lizrog.txt | 2 ++ forge-gui/res/cardsfolder/upcoming/gateway_sneak.txt | 1 + forge-gui/res/cardsfolder/upcoming/ghor_clan_wrecker.txt | 1 + .../res/cardsfolder/upcoming/growth_chamber_guardian.txt | 2 +- forge-gui/res/cardsfolder/upcoming/gruul_beastmaster.txt | 1 + forge-gui/res/cardsfolder/upcoming/gruul_spellbreaker.txt | 1 + forge-gui/res/cardsfolder/upcoming/hydroid_krasis.txt | 1 + forge-gui/res/cardsfolder/upcoming/impassioned_orator.txt | 1 + forge-gui/res/cardsfolder/upcoming/imperious_oligarch.txt | 1 + forge-gui/res/cardsfolder/upcoming/knight_of_sorrows.txt | 1 + .../res/cardsfolder/upcoming/knight_of_the_last_breath.txt | 1 + .../res/cardsfolder/upcoming/ministrant_of_obligation.txt | 1 + forge-gui/res/cardsfolder/upcoming/orzhov_enforcer.txt | 1 + forge-gui/res/cardsfolder/upcoming/orzhov_racketeers.txt | 1 + forge-gui/res/cardsfolder/upcoming/pitiless_pontiff.txt | 1 + forge-gui/res/cardsfolder/upcoming/plaza_of_harmony.txt | 3 ++- forge-gui/res/cardsfolder/upcoming/prime_speaker_vannifar.txt | 4 +++- forge-gui/res/cardsfolder/upcoming/prying_eyes.txt | 1 + forge-gui/res/cardsfolder/upcoming/rampaging_rendhorn.txt | 1 + forge-gui/res/cardsfolder/upcoming/ravager_wurm.txt | 1 + forge-gui/res/cardsfolder/upcoming/rhythm_of_the_wild.txt | 1 + forge-gui/res/cardsfolder/upcoming/senate_guildmage.txt | 1 + forge-gui/res/cardsfolder/upcoming/seraph_of_the_scales.txt | 1 + forge-gui/res/cardsfolder/upcoming/spawn_of_mayhem.txt | 1 + forge-gui/res/cardsfolder/upcoming/sphinxs_insight.txt | 1 + forge-gui/res/cardsfolder/upcoming/sylvan_brushstrider.txt | 1 + forge-gui/res/cardsfolder/upcoming/syndicate_messenger.txt | 1 + forge-gui/res/cardsfolder/upcoming/territorial_boar.txt | 1 + forge-gui/res/cardsfolder/upcoming/teysa_karlov.txt | 1 + forge-gui/res/cardsfolder/upcoming/the_haunt_of_hightower.txt | 1 + forge-gui/res/cardsfolder/upcoming/tithe_taker.txt | 1 + forge-gui/res/cardsfolder/upcoming/trollbred_guardian.txt | 2 +- forge-gui/res/cardsfolder/upcoming/undercity_scavenger.txt | 2 ++ forge-gui/res/cardsfolder/upcoming/undercitys_embrace.txt | 1 + forge-gui/res/cardsfolder/upcoming/vindictive_vampire.txt | 1 + forge-gui/res/cardsfolder/upcoming/wrecking_beast.txt | 3 ++- forge-gui/res/cardsfolder/upcoming/zhur_taa_goblin.txt | 1 + 51 files changed, 58 insertions(+), 7 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/archway_angel.txt b/forge-gui/res/cardsfolder/upcoming/archway_angel.txt index 5ce99821634..31341014650 100644 --- a/forge-gui/res/cardsfolder/upcoming/archway_angel.txt +++ b/forge-gui/res/cardsfolder/upcoming/archway_angel.txt @@ -6,5 +6,6 @@ K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 2 life for each Gate you control. SVar:TrigGainLife:DB$GainLife | LifeAmount$ X | References$ X SVar:X:Count$Valid Gate.YouCtrl/Times.2 +DeckHas:Ability$LifeGain DeckHints:Type$Gate Oracle:Flying\nWhen Archway Angel enters the battlefield, you gain 2 life for each Gate you control. diff --git a/forge-gui/res/cardsfolder/upcoming/bankrupt_in_blood.txt b/forge-gui/res/cardsfolder/upcoming/bankrupt_in_blood.txt index 030fc39d010..dbc1a820e3c 100644 --- a/forge-gui/res/cardsfolder/upcoming/bankrupt_in_blood.txt +++ b/forge-gui/res/cardsfolder/upcoming/bankrupt_in_blood.txt @@ -2,4 +2,5 @@ Name:Bankrupt in Blood ManaCost:1 B Types:Sorcery A:SP$ Draw | Cost$ 1 B Sac<2/Creature> | NumCards$ 3 | SpellDescription$ Draw three cards. +SVar:AIPreference:SacCost$Creature.token,Creature.cmcLE2 Oracle:As an additional cost to cast this spell, sacrifice two creatures.\nDraw three cards. diff --git a/forge-gui/res/cardsfolder/upcoming/basilica_bell_haunt.txt b/forge-gui/res/cardsfolder/upcoming/basilica_bell_haunt.txt index 17d0b98bd48..86eaaed210b 100644 --- a/forge-gui/res/cardsfolder/upcoming/basilica_bell_haunt.txt +++ b/forge-gui/res/cardsfolder/upcoming/basilica_bell_haunt.txt @@ -5,4 +5,5 @@ PT:3/4 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, each opponent discards a card and you gain 3 life. SVar:TrigDiscard:DB$ Discard | Defined$ Player.Opponent | NumCards$ 1 | Mode$ TgtChoose | SubAbility$ GainLife SVar:GainLife:DB$ GainLife | Defined$ You | LifeAmount$ 3 +DeckHas:Ability$LifeGain Oracle:When Basilica Bell-Haunt enters the battlefield, each opponent discards a card and you gain 3 life. diff --git a/forge-gui/res/cardsfolder/upcoming/benthic_biomancer.txt b/forge-gui/res/cardsfolder/upcoming/benthic_biomancer.txt index b89cc502a79..ade5b94d96b 100644 --- a/forge-gui/res/cardsfolder/upcoming/benthic_biomancer.txt +++ b/forge-gui/res/cardsfolder/upcoming/benthic_biomancer.txt @@ -7,5 +7,6 @@ DeckHas:Ability$Counters T:Mode$ CounterAddedOnce | ValidCard$ Card.Self | TriggerZones$ Battlefield | CounterType$ P1P1 | Execute$ TrigDraw | TriggerDescription$ Whenever one or more +1/+1 counters are put on CARDNAME, draw a card, then discard a card. SVar:TrigDraw:DB$ Draw | NumCards$ 1 | SubAbility$ DBDiscard SVar:DBDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose +DeckHas:Ability$Counters DeckHints:Ability$Counters Oracle:{1}{U}: Adapt 1. (If this creature has no +1/+1 counters on it, put a +1/+1 counter on it.)\nWhenever one or more +1/+1 counters are put on Benthic Biomancer, draw a card, then discard a card. diff --git a/forge-gui/res/cardsfolder/upcoming/biogenic_ooze.txt b/forge-gui/res/cardsfolder/upcoming/biogenic_ooze.txt index 77e4c56bf1b..3a22d960a80 100644 --- a/forge-gui/res/cardsfolder/upcoming/biogenic_ooze.txt +++ b/forge-gui/res/cardsfolder/upcoming/biogenic_ooze.txt @@ -4,9 +4,9 @@ Types:Creature Ooze PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a 2/2 green Ooze creature token. SVar:TrigToken:DB$Token | TokenAmount$ 1 | TokenScript$ g_2_2_ooze | LegacyImage$ g 2 2 ooze rna -DeckHas:Ability$Token T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your end step, put a +1/+1 counter on each Ooze you control. SVar:TrigPutCounter:DB$PutCounterAll | ValidCards$ Ooze.YouCtrl | CounterType$ P1P1 | CounterNum$ 1 SVar:BuffedBy:Artifact A:AB$ Token | Cost$ 1 G G G | TokenAmount$ 1 | TokenScript$ g_2_2_ooze | LegacyImage$ g 2 2 ooze rna | SpellDescription$ Create a 2/2 green Ooze creature token. +DeckHas:Ability$Token & Ability$Counters Oracle:When Biogenic Ooze enters the battlefield, create a 2/2 green Ooze creature token.\nAt the beginning of your end step, put a +1/+1 counter on each Ooze you control.\n{1}{G}{G}{G}: Create a 2/2 green Ooze creature token. diff --git a/forge-gui/res/cardsfolder/upcoming/biogenic_upgrade.txt b/forge-gui/res/cardsfolder/upcoming/biogenic_upgrade.txt index 114b2864bfd..8442191a58f 100644 --- a/forge-gui/res/cardsfolder/upcoming/biogenic_upgrade.txt +++ b/forge-gui/res/cardsfolder/upcoming/biogenic_upgrade.txt @@ -3,4 +3,5 @@ ManaCost:4 G G Types:Sorcery A:SP$ PutCounter | Cost$ 4 G G | ValidTgts$ Creature | TgtPrompt$ Select target creature to distribute counters to | CounterType$ P1P1 | CounterNum$ 3 | TargetMin$ 1 | TargetMax$ 3 | DividedAsYouChoose$ 3 | SubAbility$ DBPump | SpellDescription$ Distribute three +1/+1 counters among one, two, or three target creatures, then double the number of +1/+1 counters on each of those creatures. SVar:DBPump:DB$ MultiplyCounter | Defined$ Targeted | CounterType$ P1P1 +DeckHas:Ability$Counters Oracle:Distribute three +1/+1 counters among one, two, or three target creatures, then double the number of +1/+1 counters on each of those creatures. diff --git a/forge-gui/res/cardsfolder/upcoming/biomancers_familiar.txt b/forge-gui/res/cardsfolder/upcoming/biomancers_familiar.txt index 30008a2e68c..416715d855c 100644 --- a/forge-gui/res/cardsfolder/upcoming/biomancers_familiar.txt +++ b/forge-gui/res/cardsfolder/upcoming/biomancers_familiar.txt @@ -4,4 +4,5 @@ Types:Creature Mutant PT:2/2 S:Mode$ ReduceCost | ValidCard$ Creature.YouCtrl | Type$ Ability | Amount$ 2 | MinMana$ 1 | AffectedZone$ Battlefield | Description$ Activated abilities of creatures you control cost {2} less to activate. This effect can't reduce the amount of mana an ability costs to activate to less than one mana. A:AB$ Pump | Cost$ T | ValidTgts$ Creature | KW$ HIDDEN CARDNAME adapts as though it had no +1/+1 counters | TgtPrompt$ Select target creature. | StackDescription$ SpellDescription | SpellDescription$ The next time target creature adapts this turn, it adapts as though it had no +1/+1 counters. +DeckHints:Keyword$Adapt Oracle:Activated abilities of creatures you control cost 2 less to activate. This effect can't reduce the amount of mana an ability costs to activate to less than one mana.\n{T}: The next time target creature adapts this turn, it adapts as though it had no +1/+1 counters. diff --git a/forge-gui/res/cardsfolder/upcoming/bolrac_clan_crusher.txt b/forge-gui/res/cardsfolder/upcoming/bolrac_clan_crusher.txt index db9d08053b9..718fb27d827 100644 --- a/forge-gui/res/cardsfolder/upcoming/bolrac_clan_crusher.txt +++ b/forge-gui/res/cardsfolder/upcoming/bolrac_clan_crusher.txt @@ -4,4 +4,5 @@ Types:Creature Ogre Warrior PT:4/4 A:AB$ DealDamage | Cost$ T SubCounter<1/P1P1/Creature.YouCtrl/a creature you control> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to any target. AI:RemoveDeck:Random +DeckHints:Ability$Counters Oracle:{T}, Remove a +1/+1 counter from a creature you control: Bolrac-Clan Crusher deals 2 damage to any target. diff --git a/forge-gui/res/cardsfolder/upcoming/burning_tree_vandal.txt b/forge-gui/res/cardsfolder/upcoming/burning_tree_vandal.txt index 9220bc36cf7..664652dc71a 100644 --- a/forge-gui/res/cardsfolder/upcoming/burning_tree_vandal.txt +++ b/forge-gui/res/cardsfolder/upcoming/burning_tree_vandal.txt @@ -7,4 +7,5 @@ T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescripti SVar:TrigDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | RememberDiscarded$ True | Optional$ True | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -Oracle:Riot (This creature enters the battlefield with your choice of a +1/+ counter or haste.)\nWhenever Burning-Tree Vandal attacks, you may discard a card. If you do, draw a card. +DeckHas:Ability$Counters +Oracle:Riot (This creature enters the battlefield with your choice of a +1/+1 counter or haste.)\nWhenever Burning-Tree Vandal attacks, you may discard a card. If you do, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/carrion_imp.txt b/forge-gui/res/cardsfolder/upcoming/carrion_imp.txt index aac9ac1c750..36b087eee06 100644 --- a/forge-gui/res/cardsfolder/upcoming/carrion_imp.txt +++ b/forge-gui/res/cardsfolder/upcoming/carrion_imp.txt @@ -8,4 +8,5 @@ SVar:TrigExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | ValidTg SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ1 | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount +DeckHas:Ability$LifeGain Oracle:Flying\nWhen Carrion Imp enters the battlefield, you may exile target creature card from a graveyard. If you do, you gain 2 life. diff --git a/forge-gui/res/cardsfolder/upcoming/debtors_transport.txt b/forge-gui/res/cardsfolder/upcoming/debtors_transport.txt index 0a9126dbfdb..8d3bd58b0d8 100644 --- a/forge-gui/res/cardsfolder/upcoming/debtors_transport.txt +++ b/forge-gui/res/cardsfolder/upcoming/debtors_transport.txt @@ -3,4 +3,5 @@ ManaCost:5 B Types:Creature Thrull PT:5/3 K:Afterlife:2 +DeckHas:Ability$Token Oracle:Afterlife 2 (When this creature dies, create two 1/1 white and black Spirit creature tokens with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/dovins_automaton.txt b/forge-gui/res/cardsfolder/upcoming/dovins_automaton.txt index b29eabea4d9..73cdd072ab3 100644 --- a/forge-gui/res/cardsfolder/upcoming/dovins_automaton.txt +++ b/forge-gui/res/cardsfolder/upcoming/dovins_automaton.txt @@ -4,4 +4,5 @@ Types:Artifact Creature Homunculus PT:3/3 S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Vigilance | IsPresent$ Planeswalker.Dovin+YouCtrl | Description$ As long as you control a planeswalker planeswalker, CARDNAME gets +2/+2 and has vigilance. (Attacking doesn't cause it to tap.) SVar:BuffedBy:Dovin +DeckNeeds:Type$Dovin Oracle:As long as you control a Dovin planeswalker, Dovin's Automaton gets +2/+2 and has vigilance. (Attacking doesn't cause it to tap.) diff --git a/forge-gui/res/cardsfolder/upcoming/essence_capture.txt b/forge-gui/res/cardsfolder/upcoming/essence_capture.txt index 773fd657405..d0e6ca8574e 100644 --- a/forge-gui/res/cardsfolder/upcoming/essence_capture.txt +++ b/forge-gui/res/cardsfolder/upcoming/essence_capture.txt @@ -3,4 +3,5 @@ ManaCost:U U Types:Instant A:SP$ Counter | Cost$ U U | TargetType$ Spell | TgtPrompt$ Select target Creature spell | ValidTgts$ Creature | SubAbility$ DBPutCounter | SpellDescription$ Counter target creature spell. Put a +1/+1 counter on up to one target creature you control. SVar:DBPutCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ 1 | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target creature you control | ValidTgts$ Creature.YouCtrl +DeckHas:Ability$Counters Oracle:Counter target creature spell. Put a +1/+1 counter on up to one target creature you control. diff --git a/forge-gui/res/cardsfolder/upcoming/frenzied_arynx.txt b/forge-gui/res/cardsfolder/upcoming/frenzied_arynx.txt index b9169b6b113..8a927f26105 100644 --- a/forge-gui/res/cardsfolder/upcoming/frenzied_arynx.txt +++ b/forge-gui/res/cardsfolder/upcoming/frenzied_arynx.txt @@ -5,4 +5,5 @@ PT:3/3 K:Riot K:Trample A:AB$ Pump | Cost$ 4 R G | NumAtt$ +3 | SpellDescription$ CARDNAME gets +3/+0 until end of turn. +DeckHas:Ability$Counters Oracle:Riot (This creature enters the battlefield with your choice of a +1/+1 counter or haste.)\nTrample\n{4}{R}{G}: Frenzied Arynx gets +3/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/galloping_lizrog.txt b/forge-gui/res/cardsfolder/upcoming/galloping_lizrog.txt index 5ad3b047aeb..14e378503ef 100644 --- a/forge-gui/res/cardsfolder/upcoming/galloping_lizrog.txt +++ b/forge-gui/res/cardsfolder/upcoming/galloping_lizrog.txt @@ -8,4 +8,6 @@ SVar:TrigRemoveCounters:DB$ RemoveCounter | ValidSource$ Creature.YouCtrl+counte SVar:DBPutCounters:DB$PutCounter | Defined$ TriggeredCardLKICopy | CounterType$ P1P1 | CounterNum$ X | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$RememberedNumber/Twice +DeckHints:Ability$Counters +DeckHas:Ability$Counters Oracle:Trample\nWhen Galloping Lizrog enters the battlefield, you may remove any number of +1/+1 counters from among creatures you control. If you do, put twice that many +1/+1 counters on Galloping Lizrog. diff --git a/forge-gui/res/cardsfolder/upcoming/gateway_sneak.txt b/forge-gui/res/cardsfolder/upcoming/gateway_sneak.txt index d161e4fe77d..3372e39cc3d 100644 --- a/forge-gui/res/cardsfolder/upcoming/gateway_sneak.txt +++ b/forge-gui/res/cardsfolder/upcoming/gateway_sneak.txt @@ -7,4 +7,5 @@ SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ HIDDEN Unblockable | SpellDescripti SVar:PlayMain1:TRUE T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, draw a card. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 +DeckHints:Type$Gate Oracle:Whenever a Gate enters the battlefield under your control, Gateway Sneak can't be blocked this turn.\nWhenever Gateway Sneak deals combat damage to a player, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/ghor_clan_wrecker.txt b/forge-gui/res/cardsfolder/upcoming/ghor_clan_wrecker.txt index 06d74a0cde7..8bdaf370a7a 100644 --- a/forge-gui/res/cardsfolder/upcoming/ghor_clan_wrecker.txt +++ b/forge-gui/res/cardsfolder/upcoming/ghor_clan_wrecker.txt @@ -4,4 +4,5 @@ Types:Creature Human Warrior PT:2/2 K:Riot K:Menace +DeckHas:Ability$Counters Oracle:Riot (This creature enters the battlefield with your choice of a +1/1+ counter or haste.)\nMenace (This creature can't be blocked except by two or more creatures.) diff --git a/forge-gui/res/cardsfolder/upcoming/growth_chamber_guardian.txt b/forge-gui/res/cardsfolder/upcoming/growth_chamber_guardian.txt index ab2115fc759..b8a29fe6bdf 100644 --- a/forge-gui/res/cardsfolder/upcoming/growth_chamber_guardian.txt +++ b/forge-gui/res/cardsfolder/upcoming/growth_chamber_guardian.txt @@ -3,8 +3,8 @@ ManaCost:1 G Types:Creature Elf Crab Warrior PT:2/2 K:Adapt:2:2 G -DeckHas:Ability$Counters T:Mode$ CounterAddedOnce | ValidCard$ Card.Self | TriggerZones$ Battlefield | CounterType$ P1P1 | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ Whenever one or more +1/+1 counters are put on CARDNAME, you may search your library for a card named CARDNAME, reveal it, put it into your hand, then shuffle your library. SVar:TrigSearch:DB$ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Card.namedGrowth-Chamber Guardian | ChangeNum$ 1 | ShuffleNonMandatory$ True DeckHints:Name$Growth-Chamber Guardian +DeckHas:Ability$Counters Oracle:{2}{G}: Adapt 2. (If this creature has no +1/+1 counters on it, put two +1/+1 counters on it.)\nWhenever one or more +1/+1 counters are put on Growth-Chamber Guardian, you may search your library for a card named Growth-Chamber Guardian, reveal it, put it into your hand, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/upcoming/gruul_beastmaster.txt b/forge-gui/res/cardsfolder/upcoming/gruul_beastmaster.txt index 5f6eaa8441c..37c4d689b4c 100644 --- a/forge-gui/res/cardsfolder/upcoming/gruul_beastmaster.txt +++ b/forge-gui/res/cardsfolder/upcoming/gruul_beastmaster.txt @@ -6,4 +6,5 @@ K:Riot T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, another target creature you control gets +X/+0 until end of turn, where X is CARDNAME's power. SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.YouCtrl+Other | TgtPrompt$ Select another target creature you control | NumAtt$ X | References$ X SVar:X:Count$CardPower +DeckHas:Ability$Counters Oracle:Riot (This creature enters the battlefield with your choice of a +1/+1 counter or haste.)\nWhenever Gruul Beastmaster attacks, another target creature you control gets +X/+0 until end of turn, where X is Gruul Beastmaster's power. diff --git a/forge-gui/res/cardsfolder/upcoming/gruul_spellbreaker.txt b/forge-gui/res/cardsfolder/upcoming/gruul_spellbreaker.txt index 00c298d8fa4..7b88ab891f8 100644 --- a/forge-gui/res/cardsfolder/upcoming/gruul_spellbreaker.txt +++ b/forge-gui/res/cardsfolder/upcoming/gruul_spellbreaker.txt @@ -5,4 +5,5 @@ PT:3/3 K:Riot K:Trample S:Mode$ Continuous | Affected$ You,Card.Self | AddKeyword$ Hexproof | Condition$ PlayerTurn | Description$ As long as it's your turn, you and CARDNAME have hexproof. +DeckHas:Ability$Counters Oracle:Riot (This creature enters the battlefield with your choice of a +1/+1 counter or haste.)\nTrample\nAs long as it's your turn, you and Gruul Spellbreaker have hexproof. diff --git a/forge-gui/res/cardsfolder/upcoming/hydroid_krasis.txt b/forge-gui/res/cardsfolder/upcoming/hydroid_krasis.txt index 390597eb9c5..8abcd05c671 100644 --- a/forge-gui/res/cardsfolder/upcoming/hydroid_krasis.txt +++ b/forge-gui/res/cardsfolder/upcoming/hydroid_krasis.txt @@ -10,4 +10,5 @@ K:Trample K:etbCounter:P1P1:X SVar:X:Count$xPaid SVar:HalfXDown:Count$xPaid/HalfDown +DeckHas:Ability$Counters Oracle:When you cast this spell, you gain half X life and draw half X cards. Round down each time.\nFlying, trample\nHydroid Krasis enters the battlefield with X +1/+1 counters on it. diff --git a/forge-gui/res/cardsfolder/upcoming/impassioned_orator.txt b/forge-gui/res/cardsfolder/upcoming/impassioned_orator.txt index 6be0f322e46..75673f392b0 100644 --- a/forge-gui/res/cardsfolder/upcoming/impassioned_orator.txt +++ b/forge-gui/res/cardsfolder/upcoming/impassioned_orator.txt @@ -4,4 +4,5 @@ Types:Creature Human Cleric PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever another creature enters the battlefield under your control, you gain 1 life. SVar:TrigGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 +DeckHas:Ability$LifeGain Oracle:Whenever another creature enters the battlefield under your control, you gain 1 life. diff --git a/forge-gui/res/cardsfolder/upcoming/imperious_oligarch.txt b/forge-gui/res/cardsfolder/upcoming/imperious_oligarch.txt index 13e0bc6549e..b6b2a3f6b1b 100644 --- a/forge-gui/res/cardsfolder/upcoming/imperious_oligarch.txt +++ b/forge-gui/res/cardsfolder/upcoming/imperious_oligarch.txt @@ -4,4 +4,5 @@ Types:Creature Human Cleric PT:2/1 K:Vigilance K:Afterlife:1 +DeckHas:Ability$Token Oracle:Vigilance\nAfterlife 1 (When this creature dies, create a 1/1 white and black Spirit creature token with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/knight_of_sorrows.txt b/forge-gui/res/cardsfolder/upcoming/knight_of_sorrows.txt index 6170bdcd29d..4e38776c875 100644 --- a/forge-gui/res/cardsfolder/upcoming/knight_of_sorrows.txt +++ b/forge-gui/res/cardsfolder/upcoming/knight_of_sorrows.txt @@ -4,4 +4,5 @@ Types:Creature Human Knight PT:3/3 K:CARDNAME can block an additional creature each combat. K:Afterlife:1 +DeckHas:Ability$Token Oracle:Knight of Sorrows can block an additional creature each combat.\nAfterlife 1 (When this creature dies, create a 1/1 white and black Spirit creature token with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/knight_of_the_last_breath.txt b/forge-gui/res/cardsfolder/upcoming/knight_of_the_last_breath.txt index cb4c548f5ad..cf506cad0c6 100644 --- a/forge-gui/res/cardsfolder/upcoming/knight_of_the_last_breath.txt +++ b/forge-gui/res/cardsfolder/upcoming/knight_of_the_last_breath.txt @@ -5,5 +5,6 @@ PT:4/4 A:AB$ Token | Cost$ 3 Sac<1/Creature.nonToken+Other/another creature> | TokenAmount$ 1 | TokenScript$ wb_1_1_spirit_flying | TokenOwner$ You | SpellDescription$ Create a 1/1 white and black Spirit creature token with flying. SVar:RemRandomDeck:True K:Afterlife:3 +SVar:AIPreference:SacCost$Creature.cmcLE1 DeckHas:Ability$Token Oracle:{3}, Sacrifice another nontoken creature: Create a 1/1 white and black Spirit creature token with flying.\nAfterlife 3 (When this creature dies, create three 1/1 white and black Spirit creature tokens with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/ministrant_of_obligation.txt b/forge-gui/res/cardsfolder/upcoming/ministrant_of_obligation.txt index 37c661d8fd9..1aa49d93582 100644 --- a/forge-gui/res/cardsfolder/upcoming/ministrant_of_obligation.txt +++ b/forge-gui/res/cardsfolder/upcoming/ministrant_of_obligation.txt @@ -3,4 +3,5 @@ ManaCost:2 W Types:Creature Human Cleric PT:2/1 K:Afterlife:2 +DeckHas:Ability$Token Oracle:Afterlife 2 (When this creature dies, create two 1/1 white and black Spirit creature token with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/orzhov_enforcer.txt b/forge-gui/res/cardsfolder/upcoming/orzhov_enforcer.txt index aad9953f605..d4c7e20517c 100644 --- a/forge-gui/res/cardsfolder/upcoming/orzhov_enforcer.txt +++ b/forge-gui/res/cardsfolder/upcoming/orzhov_enforcer.txt @@ -4,4 +4,5 @@ Types:Creature Human Rogue PT:1/2 K:Deathtouch K:Afterlife:1 +DeckHas:Ability$Token Oracle:Deathtouch\nAfterlife 1 (When this creature dies, create a 1/1 white and black Spirit creature token with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/orzhov_racketeers.txt b/forge-gui/res/cardsfolder/upcoming/orzhov_racketeers.txt index 2a3425bba32..b8baf0da911 100644 --- a/forge-gui/res/cardsfolder/upcoming/orzhov_racketeers.txt +++ b/forge-gui/res/cardsfolder/upcoming/orzhov_racketeers.txt @@ -5,4 +5,5 @@ PT:3/2 T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigDiscard | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player discards a card. SVar:TrigDiscard:DB$Discard | Defined$ TriggeredTarget | NumCards$ 1 | Mode$ TgtChoose K:Afterlife:2 +DeckHas:Ability$Token Oracle:Whenever Orzhov Racketeers deals combat damage to a player, that player discards a card.\nAfterlife 2 (When this creature dies, create two 1/1 white and black Spirit creature tokens with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/pitiless_pontiff.txt b/forge-gui/res/cardsfolder/upcoming/pitiless_pontiff.txt index 6034e8121d5..a70767c291e 100644 --- a/forge-gui/res/cardsfolder/upcoming/pitiless_pontiff.txt +++ b/forge-gui/res/cardsfolder/upcoming/pitiless_pontiff.txt @@ -3,4 +3,5 @@ ManaCost:W B Types:Creature Vampire Cleric PT:2/2 A:AB$ Pump | Cost$ 1 Sac<1/Creature.Other/another creature> | KW$ Deathtouch & Indestructible | SpellDescription$ CARDNAME gains deathtouch and indestructible until end of turn. +SVar:AIPreference:SacCost$Creature.token,Creature.cmcLE2 Oracle:{1}, Sacrifice another creature: Pitiless Pontiff gains deathtouch and indestructible until end of turn. (Damage and effects that say "destroy" don't destroy it.) diff --git a/forge-gui/res/cardsfolder/upcoming/plaza_of_harmony.txt b/forge-gui/res/cardsfolder/upcoming/plaza_of_harmony.txt index 8606fbf3076..fed983c4ae9 100644 --- a/forge-gui/res/cardsfolder/upcoming/plaza_of_harmony.txt +++ b/forge-gui/res/cardsfolder/upcoming/plaza_of_harmony.txt @@ -3,7 +3,8 @@ ManaCost: Types:Land T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | IsPresent$ Gate.YouCtrl | PresentCompare$ GE2 | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, if you control two or more Gates, gain 3 life. SVar:TrigGainLife:DB$ GainLife | LifeAmount$ 3 -DeckHints:Type$Gate A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ ManaReflected | Cost$ T | ColorOrType$ Type | Valid$ Gate.YouCtrl | ReflectProperty$ Produce | SpellDescription$ Add one mana of any type a Gate you control could produce. +DeckHints:Type$Gate +DeckHas:Ability$LifeGain Oracle:When Plaza of Harmony enters the battlefield, if you control two or more Gates, you gain 3 life.\n{T}: Add {C}.\n{T}: Add one mana of any type a Gate you control could produce. diff --git a/forge-gui/res/cardsfolder/upcoming/prime_speaker_vannifar.txt b/forge-gui/res/cardsfolder/upcoming/prime_speaker_vannifar.txt index d64c9413ae4..7c7c423cf6c 100644 --- a/forge-gui/res/cardsfolder/upcoming/prime_speaker_vannifar.txt +++ b/forge-gui/res/cardsfolder/upcoming/prime_speaker_vannifar.txt @@ -2,6 +2,8 @@ Name:Prime Speaker Vannifar ManaCost:2 G U Types:Legendary Creature Elf Ooze Wizard PT:2/4 -A:AB$ ChangeZone | Cost$ T Sac<1/Creature.Other/another creature> | Origin$ Library | Destination$ Battlefield | ChangeType$ Creature.cmcEQX | References$ X | ChangeNum$ 1 | SorcerySpeed$ True | SpellDescription$ Search your library for a creature card with converted mana cost equal to 1 plus the sacrificed creature's converted mana cost, put that card onto the battlefield, then shuffle your library. Activate this ability only any time you could cast a sorcery. +A:AB$ ChangeZone | Cost$ T Sac<1/Creature.Other/another creature> | Origin$ Library | Destination$ Battlefield | ChangeType$ Creature.cmcEQX | References$ X | ChangeNum$ 1 | SorcerySpeed$ True | AILogic$ SacAndUpgrade | SpellDescription$ Search your library for a creature card with converted mana cost equal to 1 plus the sacrificed creature's converted mana cost, put that card onto the battlefield, then shuffle your library. Activate this ability only any time you could cast a sorcery. SVar:X:Sacrificed$CardManaCost/Plus.1 +# AI Preference is needed to make the AI consider the ability. Further constraints are defined by AILogic SacAndUpgrade. +SVar:AIPreference:SacCost$Creature Oracle:{T}, Sacrifice another creature: Search your library for a creature card with converted mana cost equal to 1 plus the sacrificed creature's converted mana cost, put that card onto the battlefield, then shuffle your library. Activate this ability only any time you could cast a sorcery. diff --git a/forge-gui/res/cardsfolder/upcoming/prying_eyes.txt b/forge-gui/res/cardsfolder/upcoming/prying_eyes.txt index 5b3987a99bb..49800163899 100644 --- a/forge-gui/res/cardsfolder/upcoming/prying_eyes.txt +++ b/forge-gui/res/cardsfolder/upcoming/prying_eyes.txt @@ -3,4 +3,5 @@ ManaCost:4 U U Types:Instant A:SP$ Draw | Cost$ 4 U U | NumCards$ 4 | SpellDescription$ Draw four cards, then discard two cards.| SubAbility$ DBDiscard SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 2 | Mode$ TgtChoose +DeckHas:Ability$Discard Oracle:Draw four cards, then discard two cards. diff --git a/forge-gui/res/cardsfolder/upcoming/rampaging_rendhorn.txt b/forge-gui/res/cardsfolder/upcoming/rampaging_rendhorn.txt index dcdbf63e0db..26083cd1ba7 100644 --- a/forge-gui/res/cardsfolder/upcoming/rampaging_rendhorn.txt +++ b/forge-gui/res/cardsfolder/upcoming/rampaging_rendhorn.txt @@ -3,4 +3,5 @@ ManaCost:4 G Types:Creature Beast PT:4/4 K:Riot +DeckHas:Ability$Counters Oracle:Riot (This creature enters the battlefield with your choice of a +1/+1 counter or haste.) diff --git a/forge-gui/res/cardsfolder/upcoming/ravager_wurm.txt b/forge-gui/res/cardsfolder/upcoming/ravager_wurm.txt index ab0c81cd716..dc241c32c6f 100644 --- a/forge-gui/res/cardsfolder/upcoming/ravager_wurm.txt +++ b/forge-gui/res/cardsfolder/upcoming/ravager_wurm.txt @@ -7,4 +7,5 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigCharm:DB$ Charm | MinCharmNum$ 0 | CharmNum$ 1 | Choices$ DBFight,DBDestroy SVar:DBFight:DB$ Fight | Defined$ TriggeredCardLKICopy | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Choose target creature you don't control | SpellDescription$ CARDNAME fights target creature you don't control. SVar:DBDestroy:DB$ Destroy | ValidTgts$ Land.hasNonManaActivatedAbility | TgtPrompt$ Select target land with an activated ability that isn't a mana ability | SpellDescription$ Destroy target land with an activated ability that iasn't a mana ability. +DeckHas:Ability$Counters Oracle:Riot (This creature enters the battlefield with your choice of a +1/+1 counter or haste.)\nWhen Ravager Wurm enters the battlefield, choose up to one -\n- Ravager Wurm fights target creature you don't control.\n- Destroy target land with an activated ability that isn't a mana ability. diff --git a/forge-gui/res/cardsfolder/upcoming/rhythm_of_the_wild.txt b/forge-gui/res/cardsfolder/upcoming/rhythm_of_the_wild.txt index 0a239df820f..8370ea9cb9e 100644 --- a/forge-gui/res/cardsfolder/upcoming/rhythm_of_the_wild.txt +++ b/forge-gui/res/cardsfolder/upcoming/rhythm_of_the_wild.txt @@ -4,4 +4,5 @@ Types:Enchantment S:Mode$ Continuous | Affected$ Creature.YouCtrl | AffectedZone$ Stack | AddHiddenKeyword$ CARDNAME can't be countered. | Description$ Creature spells you control can't be countered. S:Mode$ Continuous | Affected$ Creature.nonToken+YouCtrl | AddKeyword$ Riot| Description$ Nontoken creatures you control have riot. (They enter the battlefield with your choice of a +1/+1 counter or haste.) SVar:PlayMain1:TRUE +DeckHas:Ability$Counters Oracle:Creature spells you control can't be countered.\nNontoken creatures you control have riot. (They enter the battlefield with your choice of a +1/+1 counter or haste.) diff --git a/forge-gui/res/cardsfolder/upcoming/senate_guildmage.txt b/forge-gui/res/cardsfolder/upcoming/senate_guildmage.txt index ba151e35c78..850a1c0edcb 100644 --- a/forge-gui/res/cardsfolder/upcoming/senate_guildmage.txt +++ b/forge-gui/res/cardsfolder/upcoming/senate_guildmage.txt @@ -5,4 +5,5 @@ PT:2/2 A:AB$ GainLife | Cost$ W T | LifeAmount$ 2 | SpellDescription$ You gain 2 life. A:AB$ Draw | Cost$ U T | NumCards$ 1 | SpellDescription$ Draw a card, then discard a card. | SubAbility$ DBDiscard SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose +DeckHas:Ability$LifeGain & Ability$Discard Oracle:{W}, {T}: You gain 2 life.\n{U}, {T}: Draw a card, then discard a card. diff --git a/forge-gui/res/cardsfolder/upcoming/seraph_of_the_scales.txt b/forge-gui/res/cardsfolder/upcoming/seraph_of_the_scales.txt index 1981a8f9eea..503d4c5a9c7 100644 --- a/forge-gui/res/cardsfolder/upcoming/seraph_of_the_scales.txt +++ b/forge-gui/res/cardsfolder/upcoming/seraph_of_the_scales.txt @@ -6,4 +6,5 @@ K:Flying A:AB$ Pump | Cost$ W | Defined$ Self | KW$ Vigilance | SpellDescription$ CARDNAME gains vigilance until end of turn. A:AB$ Pump | Cost$ B | Defined$ Self | KW$ Deathtouch | SpellDescription$ CARDNAME gains deathtouch until end of turn. K:Afterlife:2 +DeckHas:Ability$Token Oracle:Flying\n{W}: Seraph of the Scales gains vigilance until end of turn.\n{B}: Seraph of the Scales gains deathtouch until end of turn.\nAfterlife 2 (When this creature dies, create two 1/1 white and black Spirit creature tokens with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/spawn_of_mayhem.txt b/forge-gui/res/cardsfolder/upcoming/spawn_of_mayhem.txt index 68d9c1d232e..3d4b5725ea0 100644 --- a/forge-gui/res/cardsfolder/upcoming/spawn_of_mayhem.txt +++ b/forge-gui/res/cardsfolder/upcoming/spawn_of_mayhem.txt @@ -9,4 +9,5 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E SVar:TrigDmgOpp:DB$DealDamage | Defined$ Player | NumDmg$ 1 | SubAbility$ DBCounter SVar:DBCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | ConditionCheckSVar$ X | ConditionSVarCompare$ LE10 | References$ X SVar:X:Count$YourLifeTotal +DeckHas:Ability$Counters Oracle:Spectacle {1}{B}{B} (You may cast this spell for its spectacle cost rather than its mana cost if an opponent lost life this turn.)\nFlying, trample\nAt the beginning of your upkeep, Spawn of Mayhem deals 1 damage to each player. Then if you have 10 or less life, put a +1/+1 counter on Spawn of Mayhem. diff --git a/forge-gui/res/cardsfolder/upcoming/sphinxs_insight.txt b/forge-gui/res/cardsfolder/upcoming/sphinxs_insight.txt index ecd8f6980d0..1803de4d01f 100644 --- a/forge-gui/res/cardsfolder/upcoming/sphinxs_insight.txt +++ b/forge-gui/res/cardsfolder/upcoming/sphinxs_insight.txt @@ -3,4 +3,5 @@ ManaCost:2 W U Types:Instant A:SP$ Draw | Cost$ 2 W U | NumCards$ 2 | SubAbility$ DBLife | StackDescription$ SpellDescription | SpellDescription$ Draw two cards. SVar:DBLife:DB$ GainLife | LifeAmount$ 2 | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SpellDescription$ Addendum - If you cast this spell during your main phase, you gain 2 life. +DeckHas:Ability$LifeGain Oracle:Draw two cards.\nAddendum - If you cast this spell during your main phase, you gain 2 life. diff --git a/forge-gui/res/cardsfolder/upcoming/sylvan_brushstrider.txt b/forge-gui/res/cardsfolder/upcoming/sylvan_brushstrider.txt index a2465c1048c..306d762121e 100644 --- a/forge-gui/res/cardsfolder/upcoming/sylvan_brushstrider.txt +++ b/forge-gui/res/cardsfolder/upcoming/sylvan_brushstrider.txt @@ -4,4 +4,5 @@ Types:Creature Beast PT:3/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 2 life. SVar:TrigGainLife:DB$GainLife | LifeAmount$ 2 +DeckHas:Ability$LifeGain Oracle:When Sylvan Brushstrider enters the battlefield, you gain 2 life. diff --git a/forge-gui/res/cardsfolder/upcoming/syndicate_messenger.txt b/forge-gui/res/cardsfolder/upcoming/syndicate_messenger.txt index 521a64a8c12..7104e1360ce 100644 --- a/forge-gui/res/cardsfolder/upcoming/syndicate_messenger.txt +++ b/forge-gui/res/cardsfolder/upcoming/syndicate_messenger.txt @@ -4,4 +4,5 @@ Types:Creature Bird PT:2/3 K:Flying K:Afterlife:1 +DeckHas:Ability$Token Oracle:Flying\nAfterlife 1 (When this creature dies, create a 1/1 white and black Spirit creature token with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/territorial_boar.txt b/forge-gui/res/cardsfolder/upcoming/territorial_boar.txt index f69ee6029e3..f69e2c574e6 100644 --- a/forge-gui/res/cardsfolder/upcoming/territorial_boar.txt +++ b/forge-gui/res/cardsfolder/upcoming/territorial_boar.txt @@ -5,4 +5,5 @@ PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.powerGE4+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a creature with power 4 or greater enters the battlefield under your control, CARDNAME gets +1/+1 and gains vigilance until end of turn. SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ +1 | NumDef$ +1 | KW$ Vigilance SVar:RemRandomDeck:True +SVar:BuffedBy:Creature.powerGE4 Oracle:Whenever a creature with power 4 or greater enters the battlefield under your control, Territorial Boar gets +1/+1 and gains vigilance until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/teysa_karlov.txt b/forge-gui/res/cardsfolder/upcoming/teysa_karlov.txt index 081b84cd822..cc63eea3839 100644 --- a/forge-gui/res/cardsfolder/upcoming/teysa_karlov.txt +++ b/forge-gui/res/cardsfolder/upcoming/teysa_karlov.txt @@ -4,4 +4,5 @@ Types:Legendary Creature Human Advisor PT:2/4 S:Mode$ Continuous | Affected$ You | AddKeyword$ Dieharmonicon | Description$ If a creature dying causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time. S:Mode$ Continuous | Affected$ Creature.token+YouCtrl | AddKeyword$ Vigilance & Lifelink | Description$ Creature tokens you control have vigilance and lifelink. +DeckHints:Ability$Token Oracle:If a creature dying causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time.\nCreature tokens you control have vigilance and lifelink. diff --git a/forge-gui/res/cardsfolder/upcoming/the_haunt_of_hightower.txt b/forge-gui/res/cardsfolder/upcoming/the_haunt_of_hightower.txt index d696d6175e7..e05e9dca861 100644 --- a/forge-gui/res/cardsfolder/upcoming/the_haunt_of_hightower.txt +++ b/forge-gui/res/cardsfolder/upcoming/the_haunt_of_hightower.txt @@ -9,4 +9,5 @@ SVar:TrigDiscard:DB$Discard | Defined$ DefendingPlayer | NumCards$ 1 | Mode$ Tgt SVar:HasAttackEffect:TRUE T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Card.nonToken+OppOwn | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a card is put into an opponent's graveyard from anywhere, put a +1/+1 counter on CARDNAME. SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +DeckHas:Ability$Counters Oracle:Flying, lifelink\nWhenever The Haunt of Hightower attacks, defending player discards a card.\nWhenever a card is put into an opponent's graveyard from anywhere, put a +1/+1 counter on The Haunt of Hightower. diff --git a/forge-gui/res/cardsfolder/upcoming/tithe_taker.txt b/forge-gui/res/cardsfolder/upcoming/tithe_taker.txt index 5de300d42f5..1f4f33dae51 100644 --- a/forge-gui/res/cardsfolder/upcoming/tithe_taker.txt +++ b/forge-gui/res/cardsfolder/upcoming/tithe_taker.txt @@ -4,4 +4,5 @@ Types:Creature Human Soldier PT:2/1 K:Afterlife:1 S:Mode$ RaiseCost | ValidCard$ Card | Activator$ Opponent | ValidSpell$ Spell,Activated.nonManaAbility | Amount$ 1 | Condition$ PlayerTurn | Description$ During your turn, spells your opponents cast cost {1} more to cast and abilities your opponents activate cost {1} more to activate unless they're mana abilities. +DeckHas:Ability$Token Oracle:During your turn, spells your opponents cast cost {1} more to cast and abilities your opponents activate cost {1} more to activate unless they're mana abilities.\nAfterlife 1 (When this creature dies, create a 1/1 white and black Spirit creature token with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/trollbred_guardian.txt b/forge-gui/res/cardsfolder/upcoming/trollbred_guardian.txt index 9c2718c5365..3f26c51e769 100644 --- a/forge-gui/res/cardsfolder/upcoming/trollbred_guardian.txt +++ b/forge-gui/res/cardsfolder/upcoming/trollbred_guardian.txt @@ -3,7 +3,7 @@ ManaCost:4 G Types:Creature Troll Frog Warrior PT:5/5 K:Adapt:2:2 G -DeckHas:Ability$Counters S:Mode$ Continuous | Affected$ Creature.YouCtrl+counters_GE1_P1P1 | AddKeyword$ Trample | Description$ Each creature you control with a +1/+1 counter on it has trample. +DeckHas:Ability$Counters DeckHints:Ability$Counters Oracle:{2}{G}: Adapt 2. (If this creature has no +1/+1 counters on it, put two +1/+1 counters on it.)\nEach creature you control with a +1/+1 counter on it has trample. diff --git a/forge-gui/res/cardsfolder/upcoming/undercity_scavenger.txt b/forge-gui/res/cardsfolder/upcoming/undercity_scavenger.txt index 0ff05038a8a..c4a94a280cd 100644 --- a/forge-gui/res/cardsfolder/upcoming/undercity_scavenger.txt +++ b/forge-gui/res/cardsfolder/upcoming/undercity_scavenger.txt @@ -6,4 +6,6 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigPutCounter:AB$ PutCounter | Cost$ Sac<1/Creature.Other/another creature> | Defined$ Self | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ DBScry SVar:DBScry:DB$ Scry | ScryNum$ 2 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:AIPreference:SacCost$Creature.token,Creature.cmcLE3 +DeckHas:Ability$Counters Oracle:When Undercity Scavenger enters the battlefield, you may sacrifice another creature. If you do, put two +1/+1 counters on Undercity Scavenger, then scry 2. diff --git a/forge-gui/res/cardsfolder/upcoming/undercitys_embrace.txt b/forge-gui/res/cardsfolder/upcoming/undercitys_embrace.txt index 95ffb7eb091..528da6b040d 100644 --- a/forge-gui/res/cardsfolder/upcoming/undercitys_embrace.txt +++ b/forge-gui/res/cardsfolder/upcoming/undercitys_embrace.txt @@ -3,4 +3,5 @@ ManaCost:2 B Types:Instant A:SP$ Sacrifice | Cost$ 2 B | ValidTgts$ Opponent | SacValid$ Creature | SacMessage$ Creature | SubAbility$ DBGainLife | SpellDescription$ Target opponent sacrifices a creature. If you control a creature with power 4 or greater, you gain 4 life. | StackDescription$ SpellDescription SVar:DBGainLife:DB$ GainLife | Defined$ You | ConditionPresent$ Creature.YouCtrl+powerGE4 | ConditionCompare$ GE1 | StackDescription$ If you control a creature with power 4 or greater, you gain 4 life. +DeckHas:Ability$LifeGain Oracle:Target opponent sacrifices a creature. If you control a creature with power 4 or greater, you gain 4 life. diff --git a/forge-gui/res/cardsfolder/upcoming/vindictive_vampire.txt b/forge-gui/res/cardsfolder/upcoming/vindictive_vampire.txt index 2c9ce3a3068..7c2d3869b9a 100644 --- a/forge-gui/res/cardsfolder/upcoming/vindictive_vampire.txt +++ b/forge-gui/res/cardsfolder/upcoming/vindictive_vampire.txt @@ -5,4 +5,5 @@ PT:2/3 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever another creature you control dies, CARDNAME deals 1 damage to each opponent and you gain 1 life. SVar:TrigDealDamage:DB$ DamageAll | ValidPlayers$ Player.Opponent | NumDmg$ 1 | SubAbility$ DBGainLife SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 +DeckHas:Ability$LifeGain Oracle:Whenever another creature you control dies, Vindictive Vampire deals 1 damage to each opponent and you gain 1 life. diff --git a/forge-gui/res/cardsfolder/upcoming/wrecking_beast.txt b/forge-gui/res/cardsfolder/upcoming/wrecking_beast.txt index c365de7a507..2acd7514fc7 100644 --- a/forge-gui/res/cardsfolder/upcoming/wrecking_beast.txt +++ b/forge-gui/res/cardsfolder/upcoming/wrecking_beast.txt @@ -4,4 +4,5 @@ Types:Creature Beast PT:6/6 K:Riot K:Trample -Oracle:Riot (This creature enters the battlefield with your choice of a +1/1+ counter or haste.)\nTrample +DeckHas:Ability$Counters +Oracle:Riot (This creature enters the battlefield with your choice of a +1/+1 counter or haste.)\nTrample diff --git a/forge-gui/res/cardsfolder/upcoming/zhur_taa_goblin.txt b/forge-gui/res/cardsfolder/upcoming/zhur_taa_goblin.txt index a136ca50236..fcb4f5e13a9 100644 --- a/forge-gui/res/cardsfolder/upcoming/zhur_taa_goblin.txt +++ b/forge-gui/res/cardsfolder/upcoming/zhur_taa_goblin.txt @@ -3,4 +3,5 @@ ManaCost:R G Types:Creature Goblin Berserker PT:2/2 K:Riot +DeckHas:Ability$Counters Oracle:Riot (This creature enters the battlefield with your choice of a +1/+1 counter or haste.) From 1f211e6ed538deff6c3ef57593b04513cfc312c9 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Sat, 19 Jan 2019 10:11:15 +0000 Subject: [PATCH 619/901] Update sharktocrab --- forge-gui/res/cardsfolder/upcoming/sharktocrab.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/sharktocrab.txt b/forge-gui/res/cardsfolder/upcoming/sharktocrab.txt index 6c878bed090..7306ee1667f 100644 --- a/forge-gui/res/cardsfolder/upcoming/sharktocrab.txt +++ b/forge-gui/res/cardsfolder/upcoming/sharktocrab.txt @@ -2,7 +2,7 @@ Name:Sharktocrab ManaCost:2 G U Types:Creature Fish Octopus Crab PT:4/4 -K:Adapt:2 G U:1 +K:Adapt:1: G U DeckHas:Ability$Counters T:Mode$ CounterAddedOnce | ValidCard$ Card.Self | TriggerZones$ Battlefield | CounterType$ P1P1 | Execute$ TrigTap | TriggerDescription$ Whenever one or more +1/+1 counter are put on CARDNAME, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls. | SubAbility$ DBPump From 6edb5ad591b3f689a020a7f9d536b4b5cebb3622 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 19 Jan 2019 13:13:41 +0300 Subject: [PATCH 620/901] - Added puzzle PS_RNA0 (Ravnica Allegiance Card Preview Puzzle). --- forge-gui/res/puzzle/PS_RNA0.pzl | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 forge-gui/res/puzzle/PS_RNA0.pzl diff --git a/forge-gui/res/puzzle/PS_RNA0.pzl b/forge-gui/res/puzzle/PS_RNA0.pzl new file mode 100644 index 00000000000..451948c1809 --- /dev/null +++ b/forge-gui/res/puzzle/PS_RNA0.pzl @@ -0,0 +1,18 @@ +[metadata] +Name:Possibility Storm - Ravnica Allegiance #00 (Card Preview) +URL:http://www.possibilitystorm.com/wp-content/uploads/2019/01/rdr03rf.jpg +Goal:Win +Turns:1 +Difficulty:Uncommon +Description:Win this turn. Start at the beginning of your first main phase, and win this turn. Assume any cards you could draw are irrelevant to the puzzle. +[state] +humanlife=20 +ailife=6 +turn=1 +activeplayer=human +activephase=MAIN1 +humanhand=Macabre Mockery;Guttersnipe;Severed Strands;Captivating Crew +humanbattlefield=Rowdy Crew|Counters:P1P1=2;Rowdy Crew|Counters:P1P1=2;Blood Crypt|NoETBTrigs;Blood Crypt|NoETBTrigs;Blood Crypt|NoETBTrigs;Blood Crypt|NoETBTrigs;Mountain;Mountain +humanlibrary=Gateway Plaza;Gateway Plaza;Gateway Plaza;Gateway Plaza;Gateway Plaza;Gateway Plaza;Gateway Plaza;Gateway Plaza;Gateway Plaza;Gateway Plaza;Gateway Plaza;Gateway Plaza;Gateway Plaza;Gateway Plaza;Gateway Plaza;Gateway Plaza;Gateway Plaza;Gateway Plaza;Gateway Plaza;Gateway Plaza +aigraveyard=Warkite Marauder;Hostage Taker;Ravenous Chupacabra;Exclusion Mage +aibattlefield=Whisper Agent;Whisper Agent;Cold-Water Snapper;Dire Fleet Poisoner;Narcomoeba From 2817c4ef61abfa7fe01d4e495f96ecca0cf2bf07 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Sat, 19 Jan 2019 10:28:33 +0000 Subject: [PATCH 621/901] Update sharktocrab.txt --- forge-gui/res/cardsfolder/upcoming/sharktocrab.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/sharktocrab.txt b/forge-gui/res/cardsfolder/upcoming/sharktocrab.txt index 7306ee1667f..f67c19e1ec9 100644 --- a/forge-gui/res/cardsfolder/upcoming/sharktocrab.txt +++ b/forge-gui/res/cardsfolder/upcoming/sharktocrab.txt @@ -2,7 +2,7 @@ Name:Sharktocrab ManaCost:2 G U Types:Creature Fish Octopus Crab PT:4/4 -K:Adapt:1: G U +K:Adapt:1:2 G U DeckHas:Ability$Counters T:Mode$ CounterAddedOnce | ValidCard$ Card.Self | TriggerZones$ Battlefield | CounterType$ P1P1 | Execute$ TrigTap | TriggerDescription$ Whenever one or more +1/+1 counter are put on CARDNAME, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls. | SubAbility$ DBPump From f26935f37f9dd301c1e1c85e12a8708118a685be Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 19 Jan 2019 13:27:19 +0100 Subject: [PATCH 622/901] CostAdjustment: use Relative for Amount that depends on the SpellAbility, only works for Self --- .../main/java/forge/game/cost/CostAdjustment.java | 13 +++++++------ forge-gui/res/cardsfolder/n/not_of_this_world.txt | 4 ++-- forge-gui/res/cardsfolder/p/price_of_fame.txt | 4 ++-- forge-gui/res/cardsfolder/s/savage_stomp.txt | 2 +- .../res/cardsfolder/upcoming/titanic_brawl.txt | 7 ++++--- 5 files changed, 16 insertions(+), 14 deletions(-) diff --git a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java index 763af4cf279..b1d671b8660 100644 --- a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java +++ b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java @@ -366,10 +366,9 @@ public class CostAdjustment { if (manaCost.toString().equals("{0}")) { return 0; } - final Map params = staticAbility.getMapParams(); final Card hostCard = staticAbility.getHostCard(); final Card card = sa.getHostCard(); - final String amount = params.get("Amount"); + final String amount = staticAbility.getParam("Amount"); if (!checkRequirement(sa, staticAbility)) { return 0; @@ -380,14 +379,16 @@ public class CostAdjustment { value = CardFactoryUtil.xCount(card, hostCard.getSVar(amount)); } else if ("Undaunted".equals(amount)) { value = card.getController().getOpponents().size(); + } else if (staticAbility.hasParam("Relative")) { + value = AbilityUtils.calculateAmount(hostCard, amount, sa); } else { value = AbilityUtils.calculateAmount(hostCard, amount, staticAbility); } - if (!params.containsKey("Cost") && ! params.containsKey("Color")) { + if (!staticAbility.hasParam("Cost") && ! staticAbility.hasParam("Color")) { int minMana = 0; - if (params.containsKey("MinMana")) { - minMana = Integer.valueOf(params.get("MinMana")); + if (staticAbility.hasParam("MinMana")) { + minMana = Integer.valueOf(staticAbility.getParam("MinMana")); } final int maxReduction = Math.max(0, manaCost.getConvertedManaCost() - minMana); @@ -395,7 +396,7 @@ public class CostAdjustment { return Math.min(value, maxReduction); } } else { - final String color = params.containsKey("Cost") ? params.get("Cost") : params.get("Color"); + final String color = staticAbility.getParamOrDefault("Cost", staticAbility.getParam("Color")); int sumGeneric = 0; // might be problematic for wierd hybrid combinations for (final String cost : color.split(" ")) { diff --git a/forge-gui/res/cardsfolder/n/not_of_this_world.txt b/forge-gui/res/cardsfolder/n/not_of_this_world.txt index e747fcf7b97..4e313af0fe7 100644 --- a/forge-gui/res/cardsfolder/n/not_of_this_world.txt +++ b/forge-gui/res/cardsfolder/n/not_of_this_world.txt @@ -1,8 +1,8 @@ Name:Not of This World ManaCost:7 Types:Tribal Instant Eldrazi -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ CostReduction | References$ CostReduction,CheckTgt | EffectZone$ All | Description$ CARDNAME costs {7} less to cast if it targets a spell or ability that targets a creature you control with power 7 or greater. -A:SP$ Counter | Cost$ 7 | TargetType$ Spell,Activated,Triggered | TgtPrompt$ Select target spell or ability that targets a permanent you control | ValidTgts$ Card | TargetValidTargeting$ Permanent.YouCtrl+inZoneBattlefield | SpellDescription$ Counter target spell or ability that targets a permanent you control. +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ CostReduction | Relative$ True | References$ CostReduction,CheckTgt | EffectZone$ All | Description$ CARDNAME costs {7} less to cast if it targets a spell or ability that targets a creature you control with power 7 or greater. +A:SP$ Counter | Cost$ 7 | TargetType$ Spell,Activated,Triggered | TgtPrompt$ Select target spell or ability that targets a permanent you control | ValidTgts$ Card | TargetValidTargeting$ Permanent.YouCtrl+inZoneBattlefield | References$ CostReduction,CheckTgt | SpellDescription$ Counter target spell or ability that targets a permanent you control. SVar:CostReduction:Count$Compare CheckTgt GE1.7.0 SVar:CheckTgt:TargetedByTarget$Valid Card.powerGE7+YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/not_of_this_world.jpg diff --git a/forge-gui/res/cardsfolder/p/price_of_fame.txt b/forge-gui/res/cardsfolder/p/price_of_fame.txt index 83fd2baf529..e29205ac3ef 100644 --- a/forge-gui/res/cardsfolder/p/price_of_fame.txt +++ b/forge-gui/res/cardsfolder/p/price_of_fame.txt @@ -1,8 +1,8 @@ Name:Price of Fame ManaCost:3 B Types:Instant -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ CostReduction | EffectZone$ All | Description$ CARDNAME costs {2} less to cast if it targets a legendary creature. -A:SP$ Destroy | Cost$ 3 B | ValidTgts$ Creature | SubAbility$ DBSurveil | TgtPrompt$ Select target creature | SpellDescription$ Destroy target creature. +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ CostReduction | Relative$ True | EffectZone$ All | References$ CostReduction,CheckTgt | Description$ CARDNAME costs {2} less to cast if it targets a legendary creature. +A:SP$ Destroy | Cost$ 3 B | ValidTgts$ Creature | SubAbility$ DBSurveil | TgtPrompt$ Select target creature | References$ CostReduction,CheckTgt | SpellDescription$ Destroy target creature. SVar:CostReduction:Count$Compare CheckTgt GE1.2.0 SVar:CheckTgt:Targeted$Valid Creature.Legendary SVar:DBSurveil:DB$ Surveil | Amount$ 2 diff --git a/forge-gui/res/cardsfolder/s/savage_stomp.txt b/forge-gui/res/cardsfolder/s/savage_stomp.txt index c5842261a68..1ebd7823dc5 100644 --- a/forge-gui/res/cardsfolder/s/savage_stomp.txt +++ b/forge-gui/res/cardsfolder/s/savage_stomp.txt @@ -1,7 +1,7 @@ Name:Savage Stomp ManaCost:2 G Types:Sorcery -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ CostReduction | References$ CostReduction,CheckTgt | EffectZone$ All | Description$ CARDNAME costs {2} less to cast if it targets a Dinosaur you control. +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ CostReduction | Relative$ True | References$ CostReduction,CheckTgt | EffectZone$ All | Description$ CARDNAME costs {2} less to cast if it targets a Dinosaur you control. SVar:CostReduction:Count$Compare CheckTgt GE1.2.0 SVar:CheckTgt:Targeted$Valid Creature.Dinosaur+YouCtrl A:SP$ PutCounter | Cost$ 2 G | AILogic$ Fight | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control to put a +1/+1 counter | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBFight | References$ CostReduction,CheckTgt | SpellDescription$ Put a +1/+1 counter on target creature you control. Then that creature fights target creature you don't control. diff --git a/forge-gui/res/cardsfolder/upcoming/titanic_brawl.txt b/forge-gui/res/cardsfolder/upcoming/titanic_brawl.txt index 88018deada9..abcc8bf9f01 100644 --- a/forge-gui/res/cardsfolder/upcoming/titanic_brawl.txt +++ b/forge-gui/res/cardsfolder/upcoming/titanic_brawl.txt @@ -1,9 +1,10 @@ Name:Titanic Brawl ManaCost:1 G Types:Instant -S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ 1 | EffectZone$ All | CheckSVar$ X | SVarCompare$ GE1 | Description$ This spell costs {1} less to cast if it targets a creature you control with a +1/+1 counter on it. -SVar:X:Count$Valid Creature.YouCtrl+counters_GE1_P1P1 +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ CostReduction | EffectZone$ All | References$ CostReduction,CheckTgt | Relative$ True | Description$ This spell costs {1} less to cast if it targets a creature you control with a +1/+1 counter on it. +SVar:CostReduction:Count$Compare CheckTgt GE1.2.0 +SVar:CheckTgt:Targeted$Valid Creature.YouCtrl+counters_GE1_P1P1 DeckHints:Ability$Counters -A:SP$ Pump | Cost$ 1 G | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Choose target creature you control | SubAbility$ DBFight | SpellDescription$ Target creature you control fights target creature you don't control. (Each deals damage equal to its power to the other.) +A:SP$ Pump | Cost$ 1 G | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Choose target creature you control | SubAbility$ DBFight | References$ CostReduction,CheckTgt | SpellDescription$ Target creature you control fights target creature you don't control. (Each deals damage equal to its power to the other.) SVar:DBFight:DB$ Fight | Defined$ ParentTarget | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Choose target creature you don't control Oracle:This spell costs {1} less to cast if it targets a creature you control with a +1/+1 counter on it.\nTarget creature you control fights target creature you don't control. (Each deals damage equal to its power to the other.) From c1c421fff0ea64987e90c5e00965ce1528050fa3 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 19 Jan 2019 18:11:55 +0100 Subject: [PATCH 623/901] DamageMap: add clear after being triggered --- .../game/ability/effects/DamageAllEffect.java | 3 +++ .../ability/effects/DamageDealEffect.java | 20 ++++++++++++------- .../ability/effects/DamageEachEffect.java | 3 +++ .../ability/effects/DamageResolveEffect.java | 2 ++ .../game/ability/effects/FightEffect.java | 3 +++ .../java/forge/game/card/CardDamageMap.java | 7 +++++++ .../main/java/forge/game/combat/Combat.java | 1 + .../main/java/forge/game/cost/CostDamage.java | 2 ++ .../forge/game/spellability/SpellAbility.java | 8 ++++++++ 9 files changed, 42 insertions(+), 7 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java index 6fb66618055..bc7abee91dc 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java @@ -121,6 +121,9 @@ public class DamageAllEffect extends DamageBaseEffect { if (!usedDamageMap) { preventMap.triggerPreventDamage(false); damageMap.triggerDamageDoneOnce(false, sa); + + preventMap.clear(); + damageMap.clear(); } replaceDying(sa); diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java index 9f3e2df9ef7..8c8f906de43 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java @@ -30,7 +30,7 @@ public class DamageDealEffect extends DamageBaseEffect { final int dmg = AbilityUtils.calculateAmount(sa.getHostCard(), damage, sa); List tgts = getTargets(sa); - if (tgts.isEmpty()) + if (tgts.isEmpty()) return ""; final List definedSources = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("DamageSource"), sa); @@ -131,15 +131,15 @@ public class DamageDealEffect extends DamageBaseEffect { sa.setPreventMap(preventMap); usedDamageMap = true; } - + final List definedSources = AbilityUtils.getDefinedCards(hostCard, sa.getParam("DamageSource"), sa); if (definedSources == null || definedSources.isEmpty()) { return; } - + for (Card source : definedSources) { final Card sourceLKI = hostCard.getGame().getChangeZoneLKIInfo(source); - + if (divideOnResolution) { // Dividing Damage up to multiple targets using combat damage box // Currently only used for Master of the Wild Hunt @@ -147,7 +147,7 @@ public class DamageDealEffect extends DamageBaseEffect { if (players.isEmpty()) { return; } - + CardCollection assigneeCards = new CardCollection(); // Do we have a way of doing this in a better fashion? for (GameObject obj : tgts) { @@ -155,7 +155,7 @@ public class DamageDealEffect extends DamageBaseEffect { assigneeCards.add((Card)obj); } } - + Player assigningPlayer = players.get(0); Map map = assigningPlayer.getController().assignCombatDamage(sourceLKI, assigneeCards, dmg, null, true); for (Entry dt : map.entrySet()) { @@ -166,6 +166,9 @@ public class DamageDealEffect extends DamageBaseEffect { preventMap.triggerPreventDamage(false); // non combat damage cause lifegain there damageMap.triggerDamageDoneOnce(false, sa); + + preventMap.clear(); + damageMap.clear(); } replaceDying(sa); return; @@ -201,7 +204,7 @@ public class DamageDealEffect extends DamageBaseEffect { } } } - + if (remember) { source.addRemembered(damageMap.row(sourceLKI).keySet()); } @@ -210,6 +213,9 @@ public class DamageDealEffect extends DamageBaseEffect { preventMap.triggerPreventDamage(false); // non combat damage cause lifegain there damageMap.triggerDamageDoneOnce(false, sa); + + preventMap.clear(); + damageMap.clear(); } replaceDying(sa); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageEachEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageEachEffect.java index 86d78c41490..a485b4d4114 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageEachEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageEachEffect.java @@ -132,6 +132,9 @@ public class DamageEachEffect extends DamageBaseEffect { if (!usedDamageMap) { preventMap.triggerPreventDamage(false); damageMap.triggerDamageDoneOnce(false, sa); + + preventMap.clear(); + damageMap.clear(); } replaceDying(sa); diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageResolveEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageResolveEffect.java index bdf2f08d670..6ed532889a6 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageResolveEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageResolveEffect.java @@ -21,10 +21,12 @@ public class DamageResolveEffect extends SpellAbilityEffect { if (preventMap != null) { preventMap.triggerPreventDamage(false); + preventMap.clear(); } // non combat damage cause lifegain there if (damageMap != null) { damageMap.triggerDamageDoneOnce(false, sa); + damageMap.clear(); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java b/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java index 998cbf27220..900492e35bb 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java @@ -153,6 +153,9 @@ public class FightEffect extends DamageBaseEffect { if (!usedDamageMap) { preventMap.triggerPreventDamage(false); damageMap.triggerDamageDoneOnce(false, sa); + + preventMap.clear(); + damageMap.clear(); } replaceDying(sa); diff --git a/forge-game/src/main/java/forge/game/card/CardDamageMap.java b/forge-game/src/main/java/forge/game/card/CardDamageMap.java index 13dc81b57f0..1c60aa83edd 100644 --- a/forge-game/src/main/java/forge/game/card/CardDamageMap.java +++ b/forge-game/src/main/java/forge/game/card/CardDamageMap.java @@ -19,6 +19,13 @@ import forge.game.trigger.TriggerType; public class CardDamageMap extends ForwardingTable { private Table dataMap = HashBasedTable.create(); + public CardDamageMap(Table damageMap) { + this.putAll(damageMap); + } + + public CardDamageMap() { + } + public void triggerPreventDamage(boolean isCombat) { for (Map.Entry> e : this.columnMap().entrySet()) { int sum = 0; diff --git a/forge-game/src/main/java/forge/game/combat/Combat.java b/forge-game/src/main/java/forge/game/combat/Combat.java index ccfa0a948f9..830251c9986 100644 --- a/forge-game/src/main/java/forge/game/combat/Combat.java +++ b/forge-game/src/main/java/forge/game/combat/Combat.java @@ -816,6 +816,7 @@ public class Combat { } preventMap.triggerPreventDamage(true); + preventMap.clear(); // This was deeper before, but that resulted in the stack entry acting like before. // Run the trigger to deal combat damage once diff --git a/forge-game/src/main/java/forge/game/cost/CostDamage.java b/forge-game/src/main/java/forge/game/cost/CostDamage.java index 5149a31aff2..eac5e94d289 100644 --- a/forge-game/src/main/java/forge/game/cost/CostDamage.java +++ b/forge-game/src/main/java/forge/game/cost/CostDamage.java @@ -74,6 +74,8 @@ public class CostDamage extends CostPart { preventMap.triggerPreventDamage(false); damageMap.triggerDamageDoneOnce(false, sa); + preventMap.clear(); + damageMap.clear(); return decision.c > 0; } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index 818aa487a9a..b9599a50b9c 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -875,6 +875,14 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit clone.manaPart = new AbilityManaPart(host, mapParams); } + // need to copy the damage tables + if (damageMap != null) { + clone.damageMap = new CardDamageMap(damageMap); + } + if (preventMap != null) { + clone.preventMap = new CardDamageMap(preventMap); + } + // clear maps for copy, the values will be added later clone.additionalAbilities = Maps.newHashMap(); clone.additionalAbilityLists = Maps.newHashMap(); From 243c90ced900f74221a48eb0e336e4ddad02edfa Mon Sep 17 00:00:00 2001 From: Sol Date: Sun, 20 Jan 2019 01:43:46 +0000 Subject: [PATCH 624/901] Update skitter_eel.txt --- forge-gui/res/cardsfolder/upcoming/skitter_eel.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/skitter_eel.txt b/forge-gui/res/cardsfolder/upcoming/skitter_eel.txt index 55acd7e4e76..f707e1dbaaf 100644 --- a/forge-gui/res/cardsfolder/upcoming/skitter_eel.txt +++ b/forge-gui/res/cardsfolder/upcoming/skitter_eel.txt @@ -2,6 +2,6 @@ Name:Skitter Eel ManaCost:3 U Types:Creature Fish Crab PT:3/3 -K:Adapt:2 +K:Adapt:2:2 U DeckHas:Ability$Counters Oracle:{2}{U}: Adapt 2. (If this creature has no +1/+1 counters on it, put two +1/+1 counters on it.) From 9921f5815584509a82641d05fc48275f004924ba Mon Sep 17 00:00:00 2001 From: Chris H Date: Sat, 19 Jan 2019 20:58:35 -0500 Subject: [PATCH 625/901] M19 Gift Pack edition file --- forge-gui/res/editions/M19 Gift Pack.txt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 forge-gui/res/editions/M19 Gift Pack.txt diff --git a/forge-gui/res/editions/M19 Gift Pack.txt b/forge-gui/res/editions/M19 Gift Pack.txt new file mode 100644 index 00000000000..a58eccaedf7 --- /dev/null +++ b/forge-gui/res/editions/M19 Gift Pack.txt @@ -0,0 +1,14 @@ +[metadata] +Code=G18 +Date=2018-11-16 +Name=M19 Gift Pack +Code2=G18 +MciCode=g18 +Type=Special + +[cards] +1 S Angelic Guardian +2 S Angler Turtle +3 S Vengeant Vampire +4 S Immortal Phoenix +5 S Rampaging Brontodon From f18651be7a057093691260adbfa37e8c582a77c5 Mon Sep 17 00:00:00 2001 From: Chris H Date: Sat, 19 Jan 2019 21:02:24 -0500 Subject: [PATCH 626/901] M19 Gift Pack edition file --- forge-gui/res/editions/M19 Gift Pack.txt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 forge-gui/res/editions/M19 Gift Pack.txt diff --git a/forge-gui/res/editions/M19 Gift Pack.txt b/forge-gui/res/editions/M19 Gift Pack.txt new file mode 100644 index 00000000000..a58eccaedf7 --- /dev/null +++ b/forge-gui/res/editions/M19 Gift Pack.txt @@ -0,0 +1,14 @@ +[metadata] +Code=G18 +Date=2018-11-16 +Name=M19 Gift Pack +Code2=G18 +MciCode=g18 +Type=Special + +[cards] +1 S Angelic Guardian +2 S Angler Turtle +3 S Vengeant Vampire +4 S Immortal Phoenix +5 S Rampaging Brontodon From 8bf2bd6ddcaa909e83963f4282fef72c0757d769 Mon Sep 17 00:00:00 2001 From: churrufli Date: Mon, 21 Jan 2019 00:43:16 +0100 Subject: [PATCH 627/901] Translating hard-coded text to res en-US.properties --- .../home/settings/CSubmenuPreferences.java | 41 ++++++++----------- forge-gui/res/languages/en-US.properties | 17 +++++++- 2 files changed, 32 insertions(+), 26 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java index 8cdefb16f8e..141c8fa44d4 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java @@ -18,6 +18,7 @@ import forge.toolbox.FComboBox; import forge.toolbox.FComboBoxPanel; import forge.toolbox.FLabel; import forge.toolbox.FOptionPane; +import forge.util.Localizer; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; @@ -38,6 +39,8 @@ import java.util.List; public enum CSubmenuPreferences implements ICDoc { /** */ SINGLETON_INSTANCE; + final Localizer localizer = Localizer.getInstance(); + private VSubmenuPreferences view; private ForgePreferences prefs; @@ -66,7 +69,7 @@ public enum CSubmenuPreferences implements ICDoc { if (updating) { return; } // prevent changing DEV_MODE while network game running if (FServerManager.getInstance().isMatchActive()) { - System.out.println("Can't change DEV_MODE while a network match is in progress!"); + System.out.println(localizer.getMessage("CantChangeDevModeWhileNetworkMath")); return; } @@ -192,7 +195,7 @@ public enum CSubmenuPreferences implements ICDoc { public void run() { prefs.setPref(FPref.DISABLE_DISPLAY_JAVA_8_UPDATE_WARNING, false); prefs.save(); - FOptionPane.showMessageDialog("Compatibility warnings re-enabled!"); + FOptionPane.showMessageDialog(localizer.getMessage("CompatibilityWarningsReEnabled")); } }); @@ -242,10 +245,8 @@ public enum CSubmenuPreferences implements ICDoc { } private void resetForgeSettingsToDefault() { - final String userPrompt = - "This will reset all preferences to their defaults and restart Forge.\n\n" + - "Reset and restart Forge?"; - if (FOptionPane.showConfirmDialog(userPrompt, "Reset Settings")) { + final String userPrompt =localizer.getMessage("AresetForgeSettingsToDefault"); + if (FOptionPane.showConfirmDialog(userPrompt, localizer.getMessage("TresetForgeSettingsToDefault"))) { final ForgePreferences prefs = FModel.getPreferences(); prefs.reset(); prefs.save(); @@ -255,38 +256,28 @@ public enum CSubmenuPreferences implements ICDoc { } private void resetDeckEditorLayout() { - final String userPrompt = - "This will reset the Deck Editor screen layout.\n" + - "All tabbed views will be restored to their default positions.\n\n" + - "Reset layout?"; - if (FOptionPane.showConfirmDialog(userPrompt, "Reset Deck Editor Layout")) { + final String userPrompt =localizer.getMessage("AresetDeckEditorLayout"); + if (FOptionPane.showConfirmDialog(userPrompt, localizer.getMessage("TresetDeckEditorLayout"))) { if (FScreen.DECK_EDITOR_CONSTRUCTED.deleteLayoutFile()) { - FOptionPane.showMessageDialog("Deck Editor layout has been reset."); + FOptionPane.showMessageDialog(localizer.getMessage("OKresetDeckEditorLayout")); } } } private void resetWorkshopLayout() { - final String userPrompt = - "This will reset the Workshop screen layout.\n" + - "All tabbed views will be restored to their default positions.\n\n" + - "Reset layout?"; - if (FOptionPane.showConfirmDialog(userPrompt, "Reset Workshop Layout")) { + final String userPrompt =localizer.getMessage("AresetWorkshopLayout"); + if (FOptionPane.showConfirmDialog(userPrompt, localizer.getMessage("TresetWorkshopLayout"))) { if (FScreen.WORKSHOP_SCREEN.deleteLayoutFile()) { - FOptionPane.showMessageDialog("Workshop layout has been reset."); + FOptionPane.showMessageDialog(localizer.getMessage("OKresetWorkshopLayout")); } } } private void resetMatchScreenLayout() { - final String userPrompt = - "This will reset the layout of the Match screen.\n" + - "If you want to save the current layout first, please use " + - "the Dock tab -> Save Layout option in the Match screen.\n\n" + - "Reset layout?"; - if (FOptionPane.showConfirmDialog(userPrompt, "Reset Match Screen Layout")) { + final String userPrompt =localizer.getMessage("AresetMatchScreenLayout"); + if (FOptionPane.showConfirmDialog(userPrompt, localizer.getMessage("TresetMatchScreenLayout"))) { if (FScreen.deleteMatchLayoutFile()) { - FOptionPane.showMessageDialog("Match Screen layout has been reset."); + FOptionPane.showMessageDialog(localizer.getMessage("OKresetMatchScreenLayout")); } } } diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index 8f888b83d72..e6ca6001d46 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -163,4 +163,19 @@ lblReportBug = Something broken? lblHowToPlay = Rules of the Game. lblLicensing = Forge legal. ContentDownloaders = Content Downloaders -ReleaseNotes = Release Notes \ No newline at end of file +ReleaseNotes = Release Notes + +# CSubmenuPreferences.java +CantChangeDevModeWhileNetworkMath = Can't change DEV_MODE while a network match is in progress! +CompatibilityWarningsReEnabled = Compatibility warnings re-enabled! +AresetForgeSettingsToDefault = This will reset all preferences to their defaults and restart Forge.\n\n Reset and restart Forge? +TresetForgeSettingsToDefault =Reset Settings +AresetDeckEditorLayout =This will reset the Deck Editor screen layout.\n All tabbed views will be restored to their default positions.\n\n Reset layout? +TresetDeckEditorLayout =Reset Deck Editor Layout +OKresetDeckEditorLayout=Deck Editor layout has been reset. +AresetWorkshopLayout = This will reset the Workshop screen layout.\n All tabbed views will be restored to their default positions.\n\n Reset layout? +TresetWorkshopLayout = Reset Workshop Layout +OKresetWorkshopLayout = Workshop layout has been reset. +AresetMatchScreenLayout = This will reset the layout of the Match screen.\n If you want to save the current layout first, please use the Dock tab -> Save Layout option in the Match screen.\n\n Reset layout? +TresetMatchScreenLayout = Reset Match Screen Layout +OKresetMatchScreenLayout = Match Screen layout has been reset. From 6090bc81174c7f163d74d74303cf8aa5ea1063ba Mon Sep 17 00:00:00 2001 From: Evan Murawski Date: Mon, 21 Jan 2019 00:55:35 +0000 Subject: [PATCH 628/901] Fix for Invalid Deck or Proxy File Names --- .../deckeditor/controllers/CCurrentDeck.java | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CCurrentDeck.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CCurrentDeck.java index bf639cf9a5e..d1c8b08cb11 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CCurrentDeck.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CCurrentDeck.java @@ -4,6 +4,7 @@ import java.awt.Dialog.ModalityType; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.File; +import java.util.regex.Pattern; import javax.swing.JFileChooser; import javax.swing.SwingUtilities; @@ -22,6 +23,7 @@ import forge.screens.deckeditor.CDeckEditorUI; import forge.screens.deckeditor.DeckImport; import forge.screens.deckeditor.SEditorIO; import forge.screens.deckeditor.views.VCurrentDeck; +import forge.toolbox.FOptionPane; /** * Controls the "current deck" panel in the deck editor UI. @@ -244,8 +246,17 @@ public enum CCurrentDeck implements ICDoc { if (fileChooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) { final File file = fileChooser.getSelectedFile(); final String check = file.getAbsolutePath(); - previousDirectory = file.getParentFile(); + + if (!previousDirectory.exists()) { + FOptionPane.showErrorDialog("Cannot save deck to " + check); + return null; + } + + if(isFileNameInvalid(file)) { + FOptionPane.showErrorDialog("Cannot save deck to " + check + "\nDeck name may not include any of the characters / \\ : * ? \" < > |"); + return null; + } return check.endsWith(".dck") ? file : new File(check + ".dck"); } @@ -261,14 +272,29 @@ public enum CCurrentDeck implements ICDoc { if (save.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) { final File file = save.getSelectedFile(); final String check = file.getAbsolutePath(); - previousDirectory = file.getParentFile(); + + if (!previousDirectory.exists()) { + FOptionPane.showErrorDialog("Cannot save proxies to " + check); + return null; + } + + if(isFileNameInvalid(file)) { + FOptionPane.showErrorDialog("Cannot save proxies to " + check + "\nFile name may not include any of the characters / \\ : * ? \" < > |"); + return null; + } return check.endsWith(".html") ? file : new File(check + ".html"); } return null; } + /** Checks if the file name includes any of the invalid characters / \ : * ? " < > : */ + private static boolean isFileNameInvalid(File file) { + final Pattern pattern = Pattern.compile("[/\\\\:*?\\\"<>|]"); + return pattern.matcher(file.getName()).find(); + } + /** The Constant HTML_FILTER. */ public static final FileFilter HTML_FILTER = new FileFilter() { @Override @@ -281,4 +307,5 @@ public enum CCurrentDeck implements ICDoc { return "Proxy File .html"; } }; + } From 94064a2a135a57b37e6fe5fe4c4519b7ad008e97 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Sun, 20 Jan 2019 21:16:34 -0500 Subject: [PATCH 629/901] Fix bug in chooseEntitiesforEffect in Mobile GUI --- forge-gui-mobile/src/forge/screens/match/MatchController.java | 4 +++- forge-gui-mobile/src/forge/toolbox/GuiChoose.java | 2 +- forge-gui/src/main/java/forge/util/gui/SGuiChoose.java | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/forge-gui-mobile/src/forge/screens/match/MatchController.java b/forge-gui-mobile/src/forge/screens/match/MatchController.java index 3eef6be8e79..0a5a83b664a 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchController.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchController.java @@ -517,7 +517,9 @@ public class MatchController extends AbstractGuiGame { @Override public List chooseEntitiesForEffect(String title, List optionList, int min, int max, DelayedReveal delayedReveal) { - return SGuiChoose.order(title, "Selected", min, max, (List) optionList, null); + final int m1 = max >= 0 ? optionList.size() - max : -1; + final int m2 = min >= 0 ? optionList.size() - min : -1; + return SGuiChoose.order(title, "Selected", m1, m2, (List) optionList, null); } @Override diff --git a/forge-gui-mobile/src/forge/toolbox/GuiChoose.java b/forge-gui-mobile/src/forge/toolbox/GuiChoose.java index cee2380a441..0b369d8fe4c 100644 --- a/forge-gui-mobile/src/forge/toolbox/GuiChoose.java +++ b/forge-gui-mobile/src/forge/toolbox/GuiChoose.java @@ -244,8 +244,8 @@ public class GuiChoose { } public static void many(final String title, final String topCaption, int min, int max, final List sourceChoices, CardView referenceCard, final Callback> callback) { - int m2 = min >= 0 ? sourceChoices.size() - min : -1; int m1 = max >= 0 ? sourceChoices.size() - max : -1; + int m2 = min >= 0 ? sourceChoices.size() - min : -1; order(title, topCaption, m1, m2, sourceChoices, null, referenceCard, callback); } diff --git a/forge-gui/src/main/java/forge/util/gui/SGuiChoose.java b/forge-gui/src/main/java/forge/util/gui/SGuiChoose.java index df549cfb93c..0575d80adb6 100644 --- a/forge-gui/src/main/java/forge/util/gui/SGuiChoose.java +++ b/forge-gui/src/main/java/forge/util/gui/SGuiChoose.java @@ -163,8 +163,8 @@ public class SGuiChoose { } public static List many(final String title, final String topCaption, final int min, final int max, final List sourceChoices) { - final int m2 = min >= 0 ? sourceChoices.size() - min : -1; final int m1 = max >= 0 ? sourceChoices.size() - max : -1; + final int m2 = min >= 0 ? sourceChoices.size() - min : -1; return order(title, topCaption, m1, m2, sourceChoices, null); } From aff8d5ce01fa8c2cb1df95a1561adf8c547993dd Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Sat, 19 Jan 2019 15:45:45 -0500 Subject: [PATCH 630/901] Use chooseEntitiesForEffect for dig (except and/or dig) --- .../java/forge/ai/PlayerControllerAi.java | 16 ++- .../forge/game/ability/effects/DigEffect.java | 118 +++++++++++------- .../forge/game/player/PlayerController.java | 3 + .../forge/player/PlayerControllerHuman.java | 17 ++- 4 files changed, 101 insertions(+), 53 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index c7b845e9051..fb9fd6239dd 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -164,8 +164,20 @@ public class PlayerControllerAi extends PlayerController { public List chooseEntitiesForEffect( FCollectionView optionList, int min, int max, DelayedReveal delayedReveal, SpellAbility sa, String title, Player targetedPlayer) { - // this isn't used - return null; + if (delayedReveal != null) { + reveal(delayedReveal.getCards(), delayedReveal.getZone(), delayedReveal.getOwner(), delayedReveal.getMessagePrefix()); + } + FCollection remaining = new FCollection(optionList); + List selecteds = new ArrayList(); + T selected; + do { + selected = chooseSingleEntityForEffect(remaining, null, sa, title, selecteds.size()>=min, targetedPlayer); + if ( selected != null ) { + remaining.remove(selected); + selecteds.add(selected); + } + } while ( (selected != null ) && (selecteds.size() < max) ); + return selecteds; } @Override diff --git a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java index 9d3fd658b19..80b301f6cdc 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java @@ -194,7 +194,7 @@ public class DigEffect extends SpellAbilityEffect { } } else { - // If all the cards are valid choices, no need for a separate reveal dialog to the chooser. + // If all the cards are valid choices, no need for a separate reveal dialog to the chooser. pfps?? if (p == chooser && destZone1ChangeNum > 1) { delayedReveal = null; } @@ -238,55 +238,83 @@ public class DigEffect extends SpellAbilityEffect { if (sa.hasParam("RandomOrder")) { CardLists.shuffle(movedCards); } - } - else { + } else { String prompt; - if (sa.hasParam("PrimaryPrompt")) { - prompt = sa.getParam("PrimaryPrompt"); - } else { - prompt = "Choose a card to put into " + destZone1.name(); - if (destZone1.equals(ZoneType.Library)) { - if (libraryPosition == -1) { - prompt = "Choose a card to put on the bottom of {player's} library"; - } - else if (libraryPosition == 0) { - prompt = "Choose a card to put on top of {player's} library"; - } - } - } + if (!andOrValid.equals("")) { // pfps: old way - to be fixed soon - movedCards = new CardCollection(); - for (int i = 0; i < destZone1ChangeNum || (anyNumber && i < numToDig); i++) { - // let user get choice - Card chosen = null; - if (!valid.isEmpty()) { - // If we're choosing multiple cards, only need to show the reveal dialog the first time through. - boolean shouldReveal = (i == 0); - chosen = chooser.getController().chooseSingleEntityForEffect(valid, shouldReveal ? delayedReveal : null, sa, prompt, anyNumber || optional, p); - } - else { - if (i == 0) { - chooser.getController().notifyOfValue(sa, null, "No valid cards"); - } - } + if (sa.hasParam("PrimaryPrompt")) { + prompt = sa.getParam("PrimaryPrompt"); + } else { + prompt = "Choose a card to put into " + destZone1.name(); + if (destZone1.equals(ZoneType.Library)) { + if (libraryPosition == -1) { + prompt = "Choose a card to put on the bottom of {player's} library"; + } + else if (libraryPosition == 0) { + prompt = "Choose a card to put on top of {player's} library"; + } + } + } - if (chosen == null) { - break; - } + movedCards = new CardCollection(); + for (int i = 0; i < destZone1ChangeNum || (anyNumber && i < numToDig); i++) { + // let user get choice + Card chosen = null; + if (!valid.isEmpty()) { + // If we're choosing multiple cards, only need to show the reveal dialog the first time through. + boolean shouldReveal = (i == 0); + chosen = chooser.getController().chooseSingleEntityForEffect(valid, shouldReveal ? delayedReveal : null, sa, prompt, anyNumber || optional, p); + } + else { + if (i == 0) { + chooser.getController().notifyOfValue(sa, null, "No valid cards"); + } + } + if (chosen == null) { break; } + movedCards.add(chosen); + valid.remove(chosen); + if (!andOrValid.equals("")) { + andOrCards.remove(chosen); + if (!chosen.isValid(andOrValid.split(","), host.getController(), host, sa)) { + valid = new CardCollection(andOrCards); + } + else if (!chosen.isValid(changeValid.split(","), host.getController(), host, sa)) { + valid.removeAll((Collection)andOrCards); + } + } + } - movedCards.add(chosen); - valid.remove(chosen); - if (!andOrValid.equals("")) { - andOrCards.remove(chosen); - if (!chosen.isValid(andOrValid.split(","), host.getController(), host, sa)) { - valid = new CardCollection(andOrCards); - } - else if (!chosen.isValid(changeValid.split(","), host.getController(), host, sa)) { - valid.removeAll((Collection)andOrCards); - } - } - } + } else { // pfps: new way + + if (sa.hasParam("PrimaryPrompt")) { + prompt = sa.getParam("PrimaryPrompt"); + } else { + prompt = "Choose card(s) to put into " + destZone1.name(); + if (destZone1.equals(ZoneType.Library)) { + if (libraryPosition == -1) { + prompt = "Choose card(s) to put on the bottom of {player's} library"; + } + else if (libraryPosition == 0) { + prompt = "Choose card(s) to put on top of {player's} library"; + } + } + } + + movedCards = new CardCollection(); + int min = (anyNumber || optional) ? 0 : numToDig; + int max = Math.max(destZone1ChangeNum, anyNumber ? valid.size() : 0); +1 if (!valid.isEmpty()) { + if ( p == chooser ) { // the digger can still see all the dug cards when choosing + chooser.getController().tempShowCards(top); + } + List chosen = chooser.getController().chooseEntitiesForEffect(valid, min, max, delayedReveal, sa, prompt, p); + chooser.getController().endTempShowCards(); + movedCards.addAll(chosen); + } else { + chooser.getController().notifyOfValue(sa, null, "No valid cards"); + } + } if (!changeValid.isEmpty() && !sa.hasParam("ExileFaceDown") && !sa.hasParam("NoReveal")) { game.getAction().reveal(movedCards, chooser, true, diff --git a/forge-game/src/main/java/forge/game/player/PlayerController.java b/forge-game/src/main/java/forge/game/player/PlayerController.java index 33295250a62..f6d58aec623 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerController.java +++ b/forge-game/src/main/java/forge/game/player/PlayerController.java @@ -81,6 +81,9 @@ public abstract class PlayerController { public Player getPlayer() { return player; } public LobbyPlayer getLobbyPlayer() { return lobbyPlayer; } + public void tempShowCards(final Iterable cards) { } // show cards in UI until ended + public void endTempShowCards() { } + public final SpellAbility getAbilityToPlay(final Card hostCard, final List abilities) { return getAbilityToPlay(hostCard, abilities, null); } public abstract SpellAbility getAbilityToPlay(Card hostCard, List abilities, ITriggerEvent triggerEvent); diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 1a2c2cb43d1..7818470b439 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -156,7 +156,8 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont c.setMayLookAt(player, true, true); } - private void tempShowCards(final Iterable cards) { + @Override + public void tempShowCards(final Iterable cards) { if (mayLookAtAllCards) { return; } // no needed if this is set @@ -166,7 +167,8 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } } - private void endTempShowCards() { + @Override + public void endTempShowCards() { if (tempShownCards.isEmpty()) { return; } @@ -479,11 +481,14 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } if (useSelectCardsInput(optionList)) { - if (delayedReveal != null) { - reveal(delayedReveal.getCards(), delayedReveal.getZone(), delayedReveal.getOwner(), - delayedReveal.getMessagePrefix()); - } + // if (delayedReveal != null) { + // reveal(delayedReveal.getCards(), delayedReveal.getZone(), delayedReveal.getOwner(), + // delayedReveal.getMessagePrefix()); + //} tempShow(optionList); + if (delayedReveal != null) { + tempShow(delayedReveal.getCards()); + } final InputSelectEntitiesFromList input = new InputSelectEntitiesFromList(this, min, max, optionList, sa); input.setCancelAllowed(true); From f0c45cf814d21de919bdd546608664acafacab47 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Sun, 20 Jan 2019 12:04:02 -0500 Subject: [PATCH 631/901] Add visual chooser for two lists and use it for and/or dig --- .../java/forge/ai/PlayerControllerAi.java | 14 ++ .../forge/game/ability/effects/DigEffect.java | 102 ++++-------- .../forge/game/player/PlayerController.java | 1 + .../java/forge/view/arcane/CardPanel.java | 6 +- .../util/PlayerControllerForTests.java | 6 + .../input/InputSelectEntitiesFromList.java | 6 +- .../match/input/InputSelectFromTwoLists.java | 152 ++++++++++++++++++ .../forge/player/PlayerControllerHuman.java | 97 ++++++----- 8 files changed, 269 insertions(+), 115 deletions(-) create mode 100644 forge-gui/src/main/java/forge/match/input/InputSelectFromTwoLists.java diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index fb9fd6239dd..3ce2d7333da 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -180,6 +180,20 @@ public class PlayerControllerAi extends PlayerController { return selecteds; } + @Override + public List chooseFromTwoListsForEffect(FCollectionView optionList1, FCollectionView optionList2, + boolean optional, DelayedReveal delayedReveal, SpellAbility sa, String title, Player targetedPlayer) { + if (delayedReveal != null) { + reveal(delayedReveal.getCards(), delayedReveal.getZone(), delayedReveal.getOwner(), delayedReveal.getMessagePrefix()); + } + T selected1 = chooseSingleEntityForEffect(optionList1, null, sa, title, optional, targetedPlayer); + T selected2 = chooseSingleEntityForEffect(optionList2, null, sa, title, optional || selected1!=null, targetedPlayer); + List selecteds = new ArrayList(); + if ( selected1 != null ) { selecteds.add(selected1); } + if ( selected2 != null ) { selecteds.add(selected2); } + return selecteds; + } + @Override public SpellAbility chooseSingleSpellForEffect(java.util.List spells, SpellAbility sa, String title, Map params) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java index 80b301f6cdc..b47d8a6ee18 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java @@ -187,7 +187,7 @@ public class DigEffect extends SpellAbilityEffect { if (!andOrValid.equals("")) { andOrCards = CardLists.getValidCards(top, andOrValid.split(","), host.getController(), host, sa); andOrCards.removeAll((Collection)valid); - valid.addAll(andOrCards); + valid.addAll(andOrCards); //pfps need to add andOr cards to valid to have set of all valid cards set up } else { andOrCards = new CardCollection(); @@ -240,80 +240,38 @@ public class DigEffect extends SpellAbilityEffect { } } else { String prompt; + + if (sa.hasParam("PrimaryPrompt")) { + prompt = sa.getParam("PrimaryPrompt"); + } else { + prompt = "Choose card(s) to put into " + destZone1.name(); + if (destZone1.equals(ZoneType.Library)) { + if (libraryPosition == -1) { + prompt = "Choose card(s) to put on the bottom of {player's} library"; + } else if (libraryPosition == 0) { + prompt = "Choose card(s) to put on top of {player's} library"; + } + } + } - if (!andOrValid.equals("")) { // pfps: old way - to be fixed soon - - if (sa.hasParam("PrimaryPrompt")) { - prompt = sa.getParam("PrimaryPrompt"); + movedCards = new CardCollection(); + if (valid.isEmpty()) { + chooser.getController().notifyOfValue(sa, null, "No valid cards"); + } else { + if ( p == chooser ) { // the digger can still see all the dug cards when choosing + chooser.getController().tempShowCards(top); + } + List chosen; + if (!andOrValid.equals("")) { + valid.removeAll(andOrCards); //pfps remove andOr cards to get two two choices set up correctly + chosen = chooser.getController().chooseFromTwoListsForEffect(valid, andOrCards, optional, delayedReveal, sa, prompt, p); } else { - prompt = "Choose a card to put into " + destZone1.name(); - if (destZone1.equals(ZoneType.Library)) { - if (libraryPosition == -1) { - prompt = "Choose a card to put on the bottom of {player's} library"; - } - else if (libraryPosition == 0) { - prompt = "Choose a card to put on top of {player's} library"; - } - } - } - - movedCards = new CardCollection(); - for (int i = 0; i < destZone1ChangeNum || (anyNumber && i < numToDig); i++) { - // let user get choice - Card chosen = null; - if (!valid.isEmpty()) { - // If we're choosing multiple cards, only need to show the reveal dialog the first time through. - boolean shouldReveal = (i == 0); - chosen = chooser.getController().chooseSingleEntityForEffect(valid, shouldReveal ? delayedReveal : null, sa, prompt, anyNumber || optional, p); - } - else { - if (i == 0) { - chooser.getController().notifyOfValue(sa, null, "No valid cards"); - } - } - if (chosen == null) { break; } - movedCards.add(chosen); - valid.remove(chosen); - if (!andOrValid.equals("")) { - andOrCards.remove(chosen); - if (!chosen.isValid(andOrValid.split(","), host.getController(), host, sa)) { - valid = new CardCollection(andOrCards); - } - else if (!chosen.isValid(changeValid.split(","), host.getController(), host, sa)) { - valid.removeAll((Collection)andOrCards); - } - } - } - - } else { // pfps: new way - - if (sa.hasParam("PrimaryPrompt")) { - prompt = sa.getParam("PrimaryPrompt"); - } else { - prompt = "Choose card(s) to put into " + destZone1.name(); - if (destZone1.equals(ZoneType.Library)) { - if (libraryPosition == -1) { - prompt = "Choose card(s) to put on the bottom of {player's} library"; - } - else if (libraryPosition == 0) { - prompt = "Choose card(s) to put on top of {player's} library"; - } - } - } - - movedCards = new CardCollection(); - int min = (anyNumber || optional) ? 0 : numToDig; - int max = Math.max(destZone1ChangeNum, anyNumber ? valid.size() : 0); -1 if (!valid.isEmpty()) { - if ( p == chooser ) { // the digger can still see all the dug cards when choosing - chooser.getController().tempShowCards(top); - } - List chosen = chooser.getController().chooseEntitiesForEffect(valid, min, max, delayedReveal, sa, prompt, p); - chooser.getController().endTempShowCards(); - movedCards.addAll(chosen); - } else { - chooser.getController().notifyOfValue(sa, null, "No valid cards"); + int min = (anyNumber || optional) ? 0 : numToDig; + int max = Math.max(destZone1ChangeNum, anyNumber ? valid.size() : 0); + chosen = chooser.getController().chooseEntitiesForEffect(valid, min, max, delayedReveal, sa, prompt, p); } + chooser.getController().endTempShowCards(); + movedCards.addAll(chosen); } if (!changeValid.isEmpty() && !sa.hasParam("ExileFaceDown") && !sa.hasParam("NoReveal")) { diff --git a/forge-game/src/main/java/forge/game/player/PlayerController.java b/forge-game/src/main/java/forge/game/player/PlayerController.java index f6d58aec623..912ea0f92b2 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerController.java +++ b/forge-game/src/main/java/forge/game/player/PlayerController.java @@ -115,6 +115,7 @@ public abstract class PlayerController { Map params); public abstract List chooseEntitiesForEffect(FCollectionView optionList, int min, int max, DelayedReveal delayedReveal, SpellAbility sa, String title, Player relatedPlayer); + public abstract List chooseFromTwoListsForEffect(FCollectionView optionList1, FCollectionView optionList2, boolean optional, DelayedReveal delayedReveal, SpellAbility sa, String title, Player relatedPlayer); public abstract boolean confirmAction(SpellAbility sa, PlayerActionConfirmMode mode, String message); public abstract boolean confirmBidAction(SpellAbility sa, PlayerActionConfirmMode bidlife, String string, int bid, Player winner); diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java index 895e023a50b..16339ea1602 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java @@ -271,18 +271,18 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl // Magenta outline for when card was chosen to pay if (matchUI.isUsedToPay(getCard())) { g2d.setColor(Color.magenta); - final int n2 = Math.max(1, Math.round(2 * cardWidth * CardPanel.SELECTED_BORDER_SIZE)); + final int n2 = Math.max(4, Math.round(2 * cardWidth * CardPanel.SELECTED_BORDER_SIZE)); g2d.fillRoundRect(cardXOffset - n2, (cardYOffset - n2) + offset, cardWidth + (n2 * 2), cardHeight + (n2 * 2), cornerSize + n2, cornerSize + n2); } else if (matchUI.isSelectable(getCard())) { // Cyan outline for selectable cards g2d.setColor(Color.cyan); - final int n2 = Math.max(1, Math.round(2 * cardWidth * CardPanel.SELECTED_BORDER_SIZE)); + final int n2 = Math.max(4, Math.round(2 * cardWidth * CardPanel.SELECTED_BORDER_SIZE)); g2d.fillRoundRect(cardXOffset - n2, (cardYOffset - n2) + offset, cardWidth + (n2 * 2), cardHeight + (n2 * 2), cornerSize + n2, cornerSize + n2); } // Green outline for hover if (isSelected) { g2d.setColor(Color.green); - final int n = Math.max(1, Math.round(cardWidth * CardPanel.SELECTED_BORDER_SIZE)); + final int n = Math.max(4, Math.round(cardWidth * CardPanel.SELECTED_BORDER_SIZE)); g2d.fillRoundRect(cardXOffset - n, (cardYOffset - n) + offset, cardWidth + (n * 2), cardHeight + (n * 2), cornerSize + n , cornerSize + n); } diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java index 8393f236a1c..c7c3b3d9c5e 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java @@ -179,6 +179,12 @@ public class PlayerControllerForTests extends PlayerController { return null; } + @Override + public List chooseFromTwoListsForEffect(FCollectionView optionList1, FCollectionView optionList2, boolean optional, DelayedReveal delayedReveal, SpellAbility sa, String title, Player targetedPlayer) { + // this isn't used + return null; + } + @Override public boolean confirmAction(SpellAbility sa, PlayerActionConfirmMode mode, String message) { return true; diff --git a/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java b/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java index 780883a4565..374573b19f3 100644 --- a/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java +++ b/forge-gui/src/main/java/forge/match/input/InputSelectEntitiesFromList.java @@ -42,7 +42,7 @@ public class InputSelectEntitiesFromList extends InputSele vCards.add(((Card)c).getView()) ; } } - controller.getGui().setSelectables(vCards); + getController().getGui().setSelectables(vCards); final PlayerZoneUpdates zonesToUpdate = new PlayerZoneUpdates(); for (final GameEntity c : validChoices) { final Zone cz = (c instanceof Card) ? ((Card) c).getZone() : null ; @@ -52,8 +52,8 @@ public class InputSelectEntitiesFromList extends InputSele } FThreads.invokeInEdtNowOrLater(new Runnable() { @Override public void run() { - controller.getGui().updateZones(zonesToUpdate); - zonesShown = controller.getGui().tempShowZones(controller.getPlayer().getView(),zonesToUpdate); + getController().getGui().updateZones(zonesToUpdate); + zonesShown = getController().getGui().tempShowZones(controller.getPlayer().getView(),zonesToUpdate); } }); } diff --git a/forge-gui/src/main/java/forge/match/input/InputSelectFromTwoLists.java b/forge-gui/src/main/java/forge/match/input/InputSelectFromTwoLists.java new file mode 100644 index 00000000000..5065b7ac111 --- /dev/null +++ b/forge-gui/src/main/java/forge/match/input/InputSelectFromTwoLists.java @@ -0,0 +1,152 @@ +package forge.match.input; + +import java.util.Collection; +import java.util.List; +import java.util.ArrayList; + +import forge.game.GameEntity; +import forge.game.card.Card; +import forge.game.card.CardView; + +import forge.game.player.Player; +import forge.game.spellability.SpellAbility; +import forge.player.PlayerControllerHuman; +import forge.util.collect.FCollection; +import forge.util.collect.FCollectionView; +import forge.util.ITriggerEvent; +import forge.player.PlayerZoneUpdate; +import forge.player.PlayerZoneUpdates; +import forge.game.zone.Zone; +import forge.FThreads; + +public class InputSelectFromTwoLists extends InputSelectManyBase { + private final FCollectionView valid1, valid2; + private final FCollection validBoth; + private FCollectionView validChoices; + + protected final FCollection selected = new FCollection(); + protected final PlayerZoneUpdates zonesToUpdate = new PlayerZoneUpdates(); + protected Iterable zonesShown; // want to hide these zones when input done + + public InputSelectFromTwoLists(final PlayerControllerHuman controller, final boolean optional, + final FCollectionView list1, final FCollectionView list2, final SpellAbility sa0) { + super(controller, optional?0:1, 2, sa0); + valid1 = list1; + valid2 = list2; + validBoth = new FCollection(valid1); + for ( T v : valid2 ) { validBoth.add(v); } + validChoices = validBoth; + setSelectables(); + + for (final GameEntity c : validChoices) { + final Zone cz = (c instanceof Card) ? ((Card) c).getZone() : null ; + if ( cz != null ) { + zonesToUpdate.add(new PlayerZoneUpdate(cz.getPlayer().getView(),cz.getZoneType())); + } + } + FThreads.invokeInEdtNowOrLater(new Runnable() { + @Override public void run() { + controller.getGui().updateZones(zonesToUpdate); + zonesShown = controller.getGui().tempShowZones(controller.getPlayer().getView(),zonesToUpdate); + } + }); + } + + private void setSelectables() { + ArrayList vCards = new ArrayList(); + getController().getGui().clearSelectables(); + for ( T c : validChoices ) { + if ( c instanceof Card ) { + vCards.add(((Card)c).getView()) ; + } + } + getController().getGui().setSelectables(vCards); + } + + private void setValid() { + boolean selected1 = false, selected2 = false; + for ( T s : selected ) { + if ( valid1.contains(s) ) { selected1 = true; } + if ( valid2.contains(s) ) { selected2 = true; } + } + validChoices = selected1 ? ( selected2 ? FCollection.getEmpty() : valid2 ) : ( selected2 ? valid1 : validBoth ); + setSelectables(); + FThreads.invokeInEdtNowOrLater(new Runnable() { + @Override public void run() { + getController().getGui().updateZones(zonesToUpdate); + } + }); + } + + @Override + protected boolean onCardSelected(final Card c, final List otherCardsToSelect, final ITriggerEvent triggerEvent) { + if (!selectEntity(c)) { + return false; + } + refresh(); + return true; + } + + @Override + public String getActivateAction(final Card card) { + if (validChoices.contains(card)) { + if (selected.contains(card)) { + return "unselect card"; + } + return "select card"; + } + return null; + } + + @Override + protected void onPlayerSelected(final Player p, final ITriggerEvent triggerEvent) { + if (!selectEntity(p)) { + return; + } + refresh(); + } + + @Override + public final Collection getSelected() { + return selected; + } + + @SuppressWarnings("unchecked") + protected boolean selectEntity(final GameEntity c) { + if (!validChoices.contains(c) && !selected.contains(c)) { + return false; + } + + final boolean entityWasSelected = selected.contains(c); + if (entityWasSelected) { + selected.remove(c); + } + else { + selected.add((T)c); + } + setValid(); + onSelectStateChanged(c, !entityWasSelected); + + return true; + } + + // might re-define later + @Override + protected boolean hasEnoughTargets() { return selected.size() >= min; } + @Override + protected boolean hasAllTargets() { return selected.size() >= max; } + + @Override + protected String getMessage() { + return max == Integer.MAX_VALUE + ? String.format(message, selected.size()) + : String.format(message, max - selected.size()); + } + + @Override + protected void onStop() { + getController().getGui().hideZones(getController().getPlayer().getView(),zonesShown); + getController().getGui().clearSelectables(); + super.onStop(); + } +} diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 7818470b439..7777f319c58 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -407,6 +407,15 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont return choices; } + // pfps there should be a better way + private GameEntity convertToEntity(final GameEntityView view) { + if (view instanceof CardView) { + return game.getCard((CardView) view); + } else if (view instanceof PlayerView) { + return game.getPlayer((PlayerView) view); + } else return null; + } + @SuppressWarnings("unchecked") @Override public T chooseSingleEntityForEffect(final FCollectionView optionList, @@ -429,12 +438,11 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont return Iterables.getFirst(optionList, null); } + tempShow(optionList); + if (delayedReveal != null) { + tempShow(delayedReveal.getCards()); + } if (useSelectCardsInput(optionList)) { - if (delayedReveal != null) { - reveal(delayedReveal.getCards(), delayedReveal.getZone(), delayedReveal.getOwner(), - delayedReveal.getMessagePrefix()); - } - tempShow(optionList); final InputSelectEntitiesFromList input = new InputSelectEntitiesFromList(this, isOptional ? 0 : 1, 1, optionList, sa); input.setCancelAllowed(isOptional); @@ -444,21 +452,10 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont return Iterables.getFirst(input.getSelected(), null); } - tempShow(optionList); - if (delayedReveal != null) { - tempShow(delayedReveal.getCards()); - } final GameEntityView result = getGui().chooseSingleEntityForEffect(title, GameEntityView.getEntityCollection(optionList), delayedReveal, isOptional); endTempShowCards(); - - if (result instanceof CardView) { - return (T) game.getCard((CardView) result); - } - if (result instanceof PlayerView) { - return (T) game.getPlayer((PlayerView) result); - } - return null; + return (T) convertToEntity(result); } @SuppressWarnings("unchecked") @@ -470,8 +467,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont Sentry.getContext().addExtra("Card", sa.getCardView().toString()); Sentry.getContext().addExtra("SpellAbility", sa.toString()); - // Human is supposed to read the message and understand from it what to - // choose + // Human is supposed to read the message and understand from it what to // choose if (optionList.isEmpty()) { if (delayedReveal != null) { reveal(delayedReveal.getCards(), delayedReveal.getZone(), delayedReveal.getOwner(), @@ -480,15 +476,12 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont return null; } + if (delayedReveal != null) { + tempShow(delayedReveal.getCards()); + } + + tempShow(optionList); if (useSelectCardsInput(optionList)) { - // if (delayedReveal != null) { - // reveal(delayedReveal.getCards(), delayedReveal.getZone(), delayedReveal.getOwner(), - // delayedReveal.getMessagePrefix()); - //} - tempShow(optionList); - if (delayedReveal != null) { - tempShow(delayedReveal.getCards()); - } final InputSelectEntitiesFromList input = new InputSelectEntitiesFromList(this, min, max, optionList, sa); input.setCancelAllowed(true); @@ -496,17 +489,12 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont input.showAndWait(); endTempShowCards(); return (List) input.getSelected(); - } + } + final List chosen = getGui().chooseEntitiesForEffect(title, + GameEntityView.getEntityCollection(optionList), min, max, delayedReveal); + endTempShowCards(); - tempShow(optionList); - if (delayedReveal != null) { - tempShow(delayedReveal.getCards()); - } - final List chosen = getGui().chooseEntitiesForEffect(title, - GameEntityView.getEntityCollection(optionList), min, max, delayedReveal); - endTempShowCards(); - - List results = new ArrayList<>(); + List results = new ArrayList<>(); //pfps I'm not sure that the chosens should be modified this way if (chosen instanceof List && chosen.size() > 0) { for (GameEntityView entry: chosen) { if (entry instanceof CardView) { @@ -520,6 +508,41 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont return results; } + @Override + public List chooseFromTwoListsForEffect(final FCollectionView optionList1, final FCollectionView optionList2, + boolean optional, final DelayedReveal delayedReveal, final SpellAbility sa, final String title, final Player targetedPlayer) { + // Human is supposed to read the message and understand from it what to choose + // useful details for debugging problems with the mass select logic + Sentry.getContext().addExtra("Card", sa.getCardView().toString()); + Sentry.getContext().addExtra("SpellAbility", sa.toString()); + + if (delayedReveal != null) { + tempShow(delayedReveal.getCards()); + } + + 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(); + 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); } + return results; + } + @Override public int chooseNumber(final SpellAbility sa, final String title, final int min, final int max) { if (min >= max) { From ebcb4e28de161d70cc0b3ad1cd142ffb4fac7a26 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Sun, 20 Jan 2019 12:31:59 -0500 Subject: [PATCH 632/901] Add desktop GUI and Dig changes to CHANGES.txt --- forge-gui/release-files/CHANGES.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/forge-gui/release-files/CHANGES.txt b/forge-gui/release-files/CHANGES.txt index d0b2b5f36a3..f0a7911cb31 100644 --- a/forge-gui/release-files/CHANGES.txt +++ b/forge-gui/release-files/CHANGES.txt @@ -1,3 +1,10 @@ +- Desktop GUI - +The Desktop GUI can pop up zones (Library, Graveyard, etc.) allow players to select cards from them when the option UI_SELECT_FROM_CARD_DISPLAYS is set. +The Desktop GUI outlines the selectable cards in many situations. This is not done when playing mana costs. + +- Digging - +Multi-card digging (e.g., for Genesis Wave) is done as a single multiple-card selection instead of a sequence of single-card selections. + - Game Night - Support was added for the Game Night box set, including all 10 exclusive cards. From f78bfce802974b07b882fa9d1920bb2ef03da38e Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Mon, 21 Jan 2019 03:31:16 +0000 Subject: [PATCH 633/901] RNA looks at artifact casting cost only --- .../main/java/forge/itemmanager/ColumnDef.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/forge-gui/src/main/java/forge/itemmanager/ColumnDef.java b/forge-gui/src/main/java/forge/itemmanager/ColumnDef.java index 47143aeb7d4..74dc7c3b1ad 100644 --- a/forge-gui/src/main/java/forge/itemmanager/ColumnDef.java +++ b/forge-gui/src/main/java/forge/itemmanager/ColumnDef.java @@ -567,16 +567,24 @@ public enum ColumnDef { private static String toLandsLast(final InventoryItem i) { //nonland? return !(((IPaperCard) i).getRules().getType().isLand()) ? - "0" + toColorlessArtifactsLast(i) + "0" + toArtifactsWithColorlessCostsLast(i) //land : "1"; } - /**Returns 1 for colorless artifacts, otherwise 0 and continues sorting. + /**Returns 1 for artifacts without color shards in their mana cost, otherwise 0 and continues sorting. + As of 2019, colored artifacts appear here if there are no colored shards in their casting cost. @param i A paper card. @return Part of a sortable numeric string.*/ - private static String toColorlessArtifactsLast(final InventoryItem i) { - return !(((IPaperCard) i).getRules().getType().isArtifact() && toColor(i).isColorless()) + private static String toArtifactsWithColorlessCostsLast(final InventoryItem i) { + forge.card.mana.ManaCost manaCost = ((IPaperCard) i).getRules().getManaCost(); + + return !(((IPaperCard) i).getRules().getType().isArtifact() && (toColor(i).isColorless() || + //If it isn't colorless, see if it can be paid with only white, only blue, only black. + //No need to check others since three-color hybrid shards don't exist. + manaCost.canBePaidWithAvaliable(MagicColor.WHITE) && + manaCost.canBePaidWithAvaliable(MagicColor.BLUE) && + manaCost.canBePaidWithAvaliable(MagicColor.BLACK))) ? "0" + toSplitLast(i): "1"; } From 480792966b2d8750c6b64749f38b767e473e8103 Mon Sep 17 00:00:00 2001 From: Tim Scott Date: Mon, 21 Jan 2019 12:08:01 -0600 Subject: [PATCH 634/901] Add Arena New Player Experience cards. Update README with minor card scripting info. --- README.md | 8 ++++++++ forge-gui/res/cardsfolder/a/angelic_reward.txt | 7 +++++++ forge-gui/res/cardsfolder/c/confront_the_assault.txt | 5 +++++ forge-gui/res/cardsfolder/i/inspiring_commander.txt | 8 ++++++++ forge-gui/res/cardsfolder/t/tactical_advantage.txt | 5 +++++ .../res/editions/Arena New Player Experience.txt | 12 ++++++++++++ 6 files changed, 45 insertions(+) create mode 100644 forge-gui/res/cardsfolder/a/angelic_reward.txt create mode 100644 forge-gui/res/cardsfolder/c/confront_the_assault.txt create mode 100644 forge-gui/res/cardsfolder/i/inspiring_commander.txt create mode 100644 forge-gui/res/cardsfolder/t/tactical_advantage.txt create mode 100644 forge-gui/res/editions/Arena New Player Experience.txt diff --git a/README.md b/README.md index da37c24b7a4..8fea600f2f5 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,12 @@ Discord channel [here](https://discordapp.com/channels/267367946135928833/267742 TBD +# Card Scripting + +Visit [this page]()https://www.slightlymagic.net/wiki/Forge_API) for information on scripting. + +Card scripting resources are found in the forge-gui/res/ path. + # General Notes ## Project Hierarchy @@ -95,6 +101,8 @@ The platform-specific projects are: ### forge-gui +The forge-gui project includes the scripting resource definitions in the res/ path. + ### forge-gui-android Libgdx-based backend targeting Android. Requires Android SDK and relies on forge-gui-mobile for GUI logic. diff --git a/forge-gui/res/cardsfolder/a/angelic_reward.txt b/forge-gui/res/cardsfolder/a/angelic_reward.txt new file mode 100644 index 00000000000..49ce52f5ef2 --- /dev/null +++ b/forge-gui/res/cardsfolder/a/angelic_reward.txt @@ -0,0 +1,7 @@ +Name:Angelic Reward +ManaCost:3 W W +Types:Enchantment Aura +K:Enchant creature +A:SP$ Attach | Cost$ 3 W W | ValidTgts$ Creature | AILogic$ Pump +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 3 | AddToughness$ 3 | AddKeyword$ Flying | Description$ Enchanted creature gets +3/+3 and has flying. +Oracle:Enchant creature\nEnchanted creature gets +3/+3 and has flying. diff --git a/forge-gui/res/cardsfolder/c/confront_the_assault.txt b/forge-gui/res/cardsfolder/c/confront_the_assault.txt new file mode 100644 index 00000000000..8eb015bd242 --- /dev/null +++ b/forge-gui/res/cardsfolder/c/confront_the_assault.txt @@ -0,0 +1,5 @@ +Name:Confront the Assault +ManaCost:4 W +Types:Instant +A:SP$ Token | Cost$ 4 W | IsPresent$ Creature.attackingYou | TokenImage$ w 1 1 spirit ISD | TokenAmount$ 3 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SpellDescription$ Cast this spell only if a creature is attacking you. Create three 1/1 white Spirit creature tokens with flying. +Oracle:Cast this spell only if a creature is attacking you.\n\nCreate three 1/1 white Spirit creature tokens with flying. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/i/inspiring_commander.txt b/forge-gui/res/cardsfolder/i/inspiring_commander.txt new file mode 100644 index 00000000000..e8c2cb3cf6e --- /dev/null +++ b/forge-gui/res/cardsfolder/i/inspiring_commander.txt @@ -0,0 +1,8 @@ +Name:Inspiring Commander +ManaCost:4 W W +Types:Creature Human Soldier +PT:1/4 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.powerLE2+YouCtrl+Other | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever another creature with power 2 or less enters the battlefield under your control, you gain 1 life and draw a card. +SVar:TrigGainLife:DB$ GainLife | LifeAmount$ 1 | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 +Oracle:Whenever another creature with power 2 or less enters the battlefield under your control, you gain 1 life and draw a card. diff --git a/forge-gui/res/cardsfolder/t/tactical_advantage.txt b/forge-gui/res/cardsfolder/t/tactical_advantage.txt new file mode 100644 index 00000000000..ff2466b403c --- /dev/null +++ b/forge-gui/res/cardsfolder/t/tactical_advantage.txt @@ -0,0 +1,5 @@ +Name:Tactical Advantage +ManaCost:W +Types:Instant +A:SP$ Pump | Cost$ W | ValidTgts$ Creature.blocking+YouCtrl,Creature.blocked+YouCtrl | TgtPrompt$ Select target blocking or blocked creature you control | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Target blocking or blocked creature you control gets +2/+2 until end of turn. +Oracle:Target blocking or blocked creature you control gets +2/+2 until end of turn. \ No newline at end of file diff --git a/forge-gui/res/editions/Arena New Player Experience.txt b/forge-gui/res/editions/Arena New Player Experience.txt new file mode 100644 index 00000000000..3ef71f4c7fa --- /dev/null +++ b/forge-gui/res/editions/Arena New Player Experience.txt @@ -0,0 +1,12 @@ +[metadata] +Code=ANA +Date=2018-07-12 +Name=Arena New Player Experience +Type=Other + +[cards] +U Angelic Reward +U Confront the Assault +R Inspiring Commander +C Spiritual Guardian +C Tactical Advantage From 29fd940a3d7ce4697ad52bcfa974d2ae6309ed87 Mon Sep 17 00:00:00 2001 From: Tim Scott Date: Mon, 21 Jan 2019 15:21:35 -0600 Subject: [PATCH 635/901] Add Arena NPE decks. Correct typo in README.md. --- README.md | 2 +- .../quest/precons/MTGA Arcane Inventions.dck | 31 ++++++++++++++++ .../quest/precons/MTGA Auras of Majesty.dck | 33 +++++++++++++++++ .../quest/precons/MTGA Chaos and Mayhem.dck | 32 ++++++++++++++++ .../res/quest/precons/MTGA Dragons Fire.dck | 31 ++++++++++++++++ .../res/quest/precons/MTGA Eternal Thirst.dck | 36 ++++++++++++++++++ .../res/quest/precons/MTGA Forests Might.dck | 32 ++++++++++++++++ .../res/quest/precons/MTGA Graveyard Bash.dck | 35 ++++++++++++++++++ .../res/quest/precons/MTGA Jungle Secrets.dck | 34 +++++++++++++++++ .../res/quest/precons/MTGA Primal Fury.dck | 36 ++++++++++++++++++ .../quest/precons/MTGA Saproling Swarm.dck | 35 ++++++++++++++++++ .../precons/MTGA Strength in Numbers.dck | 37 +++++++++++++++++++ .../quest/precons/MTGA Tactical Assault.dck | 34 +++++++++++++++++ .../res/quest/precons/MTGA Walk the Plank.dck | 35 ++++++++++++++++++ .../res/quest/precons/MTGA Wing and Claw.dck | 35 ++++++++++++++++++ .../res/quest/precons/MTGA Wrath of Mages.dck | 35 ++++++++++++++++++ 16 files changed, 512 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/quest/precons/MTGA Arcane Inventions.dck create mode 100644 forge-gui/res/quest/precons/MTGA Auras of Majesty.dck create mode 100644 forge-gui/res/quest/precons/MTGA Chaos and Mayhem.dck create mode 100644 forge-gui/res/quest/precons/MTGA Dragons Fire.dck create mode 100644 forge-gui/res/quest/precons/MTGA Eternal Thirst.dck create mode 100644 forge-gui/res/quest/precons/MTGA Forests Might.dck create mode 100644 forge-gui/res/quest/precons/MTGA Graveyard Bash.dck create mode 100644 forge-gui/res/quest/precons/MTGA Jungle Secrets.dck create mode 100644 forge-gui/res/quest/precons/MTGA Primal Fury.dck create mode 100644 forge-gui/res/quest/precons/MTGA Saproling Swarm.dck create mode 100644 forge-gui/res/quest/precons/MTGA Strength in Numbers.dck create mode 100644 forge-gui/res/quest/precons/MTGA Tactical Assault.dck create mode 100644 forge-gui/res/quest/precons/MTGA Walk the Plank.dck create mode 100644 forge-gui/res/quest/precons/MTGA Wing and Claw.dck create mode 100644 forge-gui/res/quest/precons/MTGA Wrath of Mages.dck diff --git a/README.md b/README.md index 8fea600f2f5..d9dfa8f7920 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ TBD # Card Scripting -Visit [this page]()https://www.slightlymagic.net/wiki/Forge_API) for information on scripting. +Visit [this page](https://www.slightlymagic.net/wiki/Forge_API) for information on scripting. Card scripting resources are found in the forge-gui/res/ path. diff --git a/forge-gui/res/quest/precons/MTGA Arcane Inventions.dck b/forge-gui/res/quest/precons/MTGA Arcane Inventions.dck new file mode 100644 index 00000000000..2ce804e124d --- /dev/null +++ b/forge-gui/res/quest/precons/MTGA Arcane Inventions.dck @@ -0,0 +1,31 @@ +[shop] +WinsToUnlock=0 +Credits=999 +MinDifficulty=0 +MaxDifficulty=5 +[metadata] +Name=MTGA Arcane Inventions +Description=As a blue mage, you control the battlefield through illusions. Always think three steps ahead of your foe. +Deck Type=constructed +Set=ANA +[Main] +3 Air Elemental|M19 +1 Arcane Encyclopedia|M19 +2 Aven Wind Mage|M19 +3 Aviation Pioneer|M19 +1 Befuddle|M19 +1 Diamond Mare|M19 +2 Disperse|M19 +1 Divination|M19 +4 Field Creeper|M19 +2 Gearsmith Guardian|M19 +3 Gearsmith Prodigy|M19 +2 Gilded Sentinel|XLN +25 Island|GRN +1 Meteor Golem|M19 +1 Riddlemaster Sphinx|M19 +1 Sai, Master Thopterist|M19 +2 Scholar of Stars|M19 +1 Tempest Djinn|DOM +3 Waterknot|M19 +1 Zahid, Djinn of the Lamp|DOM diff --git a/forge-gui/res/quest/precons/MTGA Auras of Majesty.dck b/forge-gui/res/quest/precons/MTGA Auras of Majesty.dck new file mode 100644 index 00000000000..262231a8881 --- /dev/null +++ b/forge-gui/res/quest/precons/MTGA Auras of Majesty.dck @@ -0,0 +1,33 @@ +[shop] +WinsToUnlock=0 +Credits=999 +MinDifficulty=0 +MaxDifficulty=5 +[metadata] +Name=MTGA Auras of Majesty +Description=Enchant your creatures to new levels of power and use binding spells to restrain your foes. +Deck Type=constructed +Set=ANA +[Main] +1 Ajani's Last Stand|M19 +1 Danitha Capashen, Paragon|DOM +2 Daybreak Chaplain|M19 +3 Druid of Horns|M19 +9 Forest|GRN +2 Greenwood Sentinel|M19 +3 Hieromancer's Cage|M19 +1 History of Benalia|DOM +3 Knight's Pledge|M19 +2 Knightly Valor|M19 +3 Luminous Bonds|GRN +3 Novice Knight|M19 +3 Oakenform|M19 +1 On Serra's Wings|DOM +11 Plains|GRN +1 Prodigious Growth|M19 +3 Satyr Enchanter|M19 +1 Shalai, Voice of Plenty|DOM +1 Siegehorn Ceratops|RIX +1 Sunpetal Grove|XLN +1 Thorn Lieutenant|M19 +4 Tranquil Expanse|M19 diff --git a/forge-gui/res/quest/precons/MTGA Chaos and Mayhem.dck b/forge-gui/res/quest/precons/MTGA Chaos and Mayhem.dck new file mode 100644 index 00000000000..d688c534d4b --- /dev/null +++ b/forge-gui/res/quest/precons/MTGA Chaos and Mayhem.dck @@ -0,0 +1,32 @@ +[shop] +WinsToUnlock=0 +Credits=999 +MinDifficulty=0 +MaxDifficulty=5 +[metadata] +Name=MTGA Chaos and Mayhem +Description=Death is not the end. Strike terror from beyond with powerful graveyard combos. +Deck Type=constructed +Set=ANA +[Main] +4 Act of Treason|M19 +2 Blood Divination|M19 +3 Brawl-Bash Ogre|M19 +4 Cinder Barrens|M19 +1 Demon of Catastrophes|M19 +3 Doomed Dissenter|M19 +1 Dragonskull Summit|XLN +3 Goblin Instigator|M19 +1 Goblin Trashmaster|M19 +1 Gravedigger|M19 +1 Gravewaker|M19 +10 Mountain|GRN +3 Murder|M19 +1 Open the Graves|M19 +3 Ravenous Harpy|M19 +2 Reassembling Skeleton|M19 +1 Rekindling Phoenix|RIX +3 Shock|M19 +1 Siege-Gang Commander|DOM +2 Swab Goblin|RIX +10 Swamp|GRN diff --git a/forge-gui/res/quest/precons/MTGA Dragons Fire.dck b/forge-gui/res/quest/precons/MTGA Dragons Fire.dck new file mode 100644 index 00000000000..994d1557b32 --- /dev/null +++ b/forge-gui/res/quest/precons/MTGA Dragons Fire.dck @@ -0,0 +1,31 @@ +[shop] +WinsToUnlock=0 +Credits=999 +MinDifficulty=0 +MaxDifficulty=5 +[metadata] +Name=MTGA Dragon's Fire +Description=As a red mage, you revel in the chaos of battle. Fire is your weapon and your inspiration. +Deck Type=constructed +Set=ANA +[Main] +1 Burning Sun's Avatar|XLN +2 Charging Monstrosaur|XLN +1 Demanding Dragon|M19 +2 Fiery Finish|M19 +3 Goblin Instigator|M19 +3 Havoc Devils|M19 +3 Kargan Dragonrider|M19 +1 Lathliss, Dragon Queen|M19 +1 Meteor Golem|M19 +25 Mountain|GRN +2 Onakke Ogre|M19 +3 Pyromantic Pilgrim|DOM +3 Shock|M19 +2 Sparktongue Dragon|M19 +1 Spit Flame|M19 +3 Sure Strike|GRN +2 Viashino Pyromancer|M19 +2 Volcanic Dragon|M19 + + diff --git a/forge-gui/res/quest/precons/MTGA Eternal Thirst.dck b/forge-gui/res/quest/precons/MTGA Eternal Thirst.dck new file mode 100644 index 00000000000..996687b3166 --- /dev/null +++ b/forge-gui/res/quest/precons/MTGA Eternal Thirst.dck @@ -0,0 +1,36 @@ +[shop] +WinsToUnlock=0 +Credits=999 +MinDifficulty=0 +MaxDifficulty=5 +[metadata] +Name=MTGA Eternal Thirst +Description=Outlive your opponent by using their lifeforce to heal your wounds. Your life means their death. +Deck Type=constructed +Set=ANA +[Main] +3 Ajani's Pridemate|M19 +2 Ajani's Welcome|M19 +3 Bishop's Soldier|XLN +3 Call to the Feast|XLN +1 Champion of Dusk|RIX +2 Epicure of Blood|M19 +4 Forsaken Sanctuary|M19 +1 Herald of Faith|M19 +2 Inspiring Cleric|XLN +1 Isolated Chapel|DOM +2 Legion Lieutenant|RIX +1 Leonin Warleader|M19 +2 Moment of Triumph|RIX +3 Murder|M19 +2 Nightmare's Thirst|M19 +1 Paladin of Atonement|RIX +10 Plains|GRN +1 Resplendent Angel|M19 +1 Sanctum Seeker|XLN +3 Skymarch Bloodletter|M19 +10 Swamp|GRN +1 Vampire Sovereign|M19 +1 Vraska's Contempt|XLN + + diff --git a/forge-gui/res/quest/precons/MTGA Forests Might.dck b/forge-gui/res/quest/precons/MTGA Forests Might.dck new file mode 100644 index 00000000000..7c0538574f3 --- /dev/null +++ b/forge-gui/res/quest/precons/MTGA Forests Might.dck @@ -0,0 +1,32 @@ +[shop] +WinsToUnlock=0 +Credits=999 +MinDifficulty=0 +MaxDifficulty=5 +[metadata] +Name=MTGA Forest's Might +Description=As a green mage, the natural world is at your command. The power of life itself fuels your magic. +Deck Type=constructed +Set=ANA +[Main] +1 Aggressive Mammoth|M19 +2 Blanchwood Armor|M19 +3 Bristling Boar|M19 +3 Centaur Courser|M19 +2 Druid of the Cowl|M19 +2 Elvish Rejuvenator|M19 +25 Forest|GRN +1 Ghalta, Primal Hunger|RIX +1 Gigantosaurus|M19 +2 Greenwood Sentinel|M19 +3 Highland Game|M19 +2 Llanowar Elves|M19 +1 Meteor Golem|M19 +2 Plummet|M19 +1 Prodigious Growth|M19 +3 Rabid Bite|M19 +3 Titanic Growth|M19 +1 Verdant Rebirth|XLN +2 Vigilant Baloth|M19 + + diff --git a/forge-gui/res/quest/precons/MTGA Graveyard Bash.dck b/forge-gui/res/quest/precons/MTGA Graveyard Bash.dck new file mode 100644 index 00000000000..c740cbb1f3f --- /dev/null +++ b/forge-gui/res/quest/precons/MTGA Graveyard Bash.dck @@ -0,0 +1,35 @@ +[shop] +WinsToUnlock=0 +Credits=999 +MinDifficulty=0 +MaxDifficulty=5 +[metadata] +Name=MTGA Graveyard Bash +Description=As a black mage, every advantage comes at a cost. Sacrifice whatever is necessary to control the forces of death and darkness. +Deck Type=constructed +Set=ANA +[Main] +2 Death Baron|ALA +3 Deathbloom Thallid|DOM +2 Diregraf Ghoul|ISD +3 Doomed Dissenter|M19 +2 Gravedigger|M15 +1 Gravewaker|M19 +2 Hired Blade|M19 +2 Infectious Horror|M19 +1 Meteor Golem|M19 +3 Murder|M19 +1 Open the Graves|M19 +1 Rise from the Grave|M10 +2 Skulduggery|XLN +2 Skymarch Bloodletter|XLN +2 Strangling Spores|M19 +9 Swamp|8ED|1 +7 Swamp|8ED|2 +4 Swamp|8ED|3 +5 Swamp|8ED|4 +2 Vampire Sovereign|M19 +3 Walking Corpse|ISD +1 Yargle, Glutton of Urborg|DOM + + diff --git a/forge-gui/res/quest/precons/MTGA Jungle Secrets.dck b/forge-gui/res/quest/precons/MTGA Jungle Secrets.dck new file mode 100644 index 00000000000..82840be29f1 --- /dev/null +++ b/forge-gui/res/quest/precons/MTGA Jungle Secrets.dck @@ -0,0 +1,34 @@ +[shop] +WinsToUnlock=0 +Credits=999 +MinDifficulty=0 +MaxDifficulty=5 +[metadata] +Name=MTGA Jungle Secrets +Description=Sneak past your foe's defenses and manipulate the battlefield to your benefit with the slick Merfolk of Ixalan. +Deck Type=constructed +Set=ANA +[Main] +1 Deeproot Champion|XLN +1 Deeproot Elite|RIX +3 Disperse|M19 +11 Forest|GRN +1 Herald of Secret Streams|XLN +1 Hinterland Harbor|DOM +9 Island|GRN +3 Jade Bearer|RIX +1 Jadelight Ranger|RIX +2 Jungleborn Pioneer|RIX +3 Kumena's Speaker|XLN +1 Kumena, Tyrant of Orazca|RIX +3 Merfolk Mistbinder|RIX +3 River Heralds' Boon|XLN +2 River Sneak|XLN +1 Seafloor Oracle|RIX +3 Silvergill Adept|RIX +2 Sleep|M19 +2 Tempest Caller|XLN +3 Watertrap Weaver|XLN +4 Woodland Stream|M19 + + diff --git a/forge-gui/res/quest/precons/MTGA Primal Fury.dck b/forge-gui/res/quest/precons/MTGA Primal Fury.dck new file mode 100644 index 00000000000..7eea8a57643 --- /dev/null +++ b/forge-gui/res/quest/precons/MTGA Primal Fury.dck @@ -0,0 +1,36 @@ +[shop] +WinsToUnlock=0 +Credits=999 +MinDifficulty=0 +MaxDifficulty=5 +[metadata] +Name=MTGA Primal Fury +Description=Create additional mana to summon massive monsters to crush your enemies. +Deck Type=constructed +Set=ANA +[Main] +1 Banefire|M19 +1 Carnage Tyrant|XLN +2 Charging Monstrosaur|XLN +2 Charging Tuskodon|RIX +2 Colossal Majesty|M19 +3 Draconic Disciple|M19 +2 Druid of the Cowl|M19 +3 Elvish Rejuvenator|M19 +1 Etali, Primal Storm|RIX +10 Forest|GRN +2 Frenzied Raptor|XLN +1 Goreclaw, Terror of Qal Sisma|M19 +2 Knight of the Stampede|RIX +3 Lightning Strike|M19 +3 Llanowar Elves|M19 +9 Mountain|GRN +1 Needletooth Raptor|RIX +1 Pelakka Wurm|M19 +2 Raptor Hatchling|XLN +1 Rootbound Crag|XLN +3 Shock|M19 +1 Silverclad Ferocidons|RIX +4 Timber Gorge|M19 + + diff --git a/forge-gui/res/quest/precons/MTGA Saproling Swarm.dck b/forge-gui/res/quest/precons/MTGA Saproling Swarm.dck new file mode 100644 index 00000000000..25cafe3a3fd --- /dev/null +++ b/forge-gui/res/quest/precons/MTGA Saproling Swarm.dck @@ -0,0 +1,35 @@ +[shop] +WinsToUnlock=0 +Credits=999 +MinDifficulty=0 +MaxDifficulty=5 +[metadata] +Name=MTGA Saproling Swarm +Description=Overrun anyone in your way with a Swarm of Saprolings. +Deck Type=constructed +Set=ANA +[Main] +2 Costly Plunder|XLN +3 Deathbloom Thallid|DOM +3 Doomed Dissenter|M19 +10 Forest|GRN +4 Foul Orchard|M19 +3 Fungal Infection|DOM +1 Path of Discovery|RIX +3 Poison-Tip Archer|M19 +1 Rite of Belzenlok|DOM +3 Saproling Migration|DOM +1 Slimefoot, the Stowaway|DOM +2 Spore Swarm|DOM +10 Swamp|GRN +1 Tendershoot Dryad|RIX +2 Thallid Omnivore|DOM +1 Torgaar, Famine Incarnate|DOM +1 Twilight Prophet|RIX +1 Verdant Force|DOM +3 Vicious Offering|DOM +1 Whisper, Blood Liturgist|DOM +1 Woodland Cemetery|DOM +3 Yavimaya Sapherd|DOM + + diff --git a/forge-gui/res/quest/precons/MTGA Strength in Numbers.dck b/forge-gui/res/quest/precons/MTGA Strength in Numbers.dck new file mode 100644 index 00000000000..54563b5e14b --- /dev/null +++ b/forge-gui/res/quest/precons/MTGA Strength in Numbers.dck @@ -0,0 +1,37 @@ +[shop] +WinsToUnlock=0 +Credits=999 +MinDifficulty=0 +MaxDifficulty=5 +[metadata] +Name=MTGA Strength in Numbers +Description=Build up a powerful army and overrun the battlefield. Find glory and strength in numbers. +Deck Type=constructed +Set=ANA +[Main] +1 Act of Treason|M19 +2 Boggart Brute|M19 +1 Burning Sun's Avatar|XLN +1 Captivating Crew|XLN +2 Cavalry Drillmaster|M19 +1 Clifftop Retreat|DOM +3 Goblin Instigator|M19 +3 Heroic Reinforcements|M19 +2 Hieromancer's Cage|M19 +1 Inspired Charge|M19 +1 Kinjalli's Sunwing|XLN +3 Leonin Vanguard|M19 +1 Leonin Warleader|M19 +3 Lightning Strike|M19 +1 Make a Stand|M19 +2 Martyr of Dusk|RIX +1 Mentor of the Meek|M19 +3 Militia Bugler|M19 +9 Mountain|GRN +2 Paladin of the Bloodstained|XLN +10 Plains|GRN +1 Siege-Gang Commander|DOM +4 Stone Quarry|M19 +2 Trumpet Blast|M19 + + diff --git a/forge-gui/res/quest/precons/MTGA Tactical Assault.dck b/forge-gui/res/quest/precons/MTGA Tactical Assault.dck new file mode 100644 index 00000000000..b7b767a0ba7 --- /dev/null +++ b/forge-gui/res/quest/precons/MTGA Tactical Assault.dck @@ -0,0 +1,34 @@ +[shop] +WinsToUnlock=0 +Credits=999 +MinDifficulty=0 +MaxDifficulty=5 +[metadata] +Name=MTGA Tactical Assault +Description=As a white mage, you command disciplined armies. Enforce order to overwhelm your enemies. +Deck Type=constructed +Set=ANA +[Main] +2 Daybreak Chaplain|M19 +1 Herald of Faith|M19 +2 Knight's Pledge|M19 +1 Leonin Warleader|M19 +2 Loxodon Line Breaker|M19 +3 Luminous Bonds|GRN +1 Meteor Golem|M19 +3 Oreskos Swiftclaw|M19 +2 Pegasus Courser|M19 +25 Plains|GRN +3 Tactical Advantage|ANA +1 Confront the Assault|ANA +1 Angelic Reward|ANA +1 Inspiring Commander|ANA +1 Spiritual Guardian|ANA +2 Serra Angel|DOM +1 Serra's Guardian|M19 +2 Silverbeak Griffin|M19 +3 Star-Crowned Stag|M19 +2 Take Vengeance|M19 +1 Zetalpa, Primal Dawn|RIX + + diff --git a/forge-gui/res/quest/precons/MTGA Walk the Plank.dck b/forge-gui/res/quest/precons/MTGA Walk the Plank.dck new file mode 100644 index 00000000000..a2bc06ab0df --- /dev/null +++ b/forge-gui/res/quest/precons/MTGA Walk the Plank.dck @@ -0,0 +1,35 @@ +[shop] +WinsToUnlock=0 +Credits=999 +MinDifficulty=0 +MaxDifficulty=5 +[metadata] +Name=MTGA Walk the Plank +Description=Manipulate the battlefield to your advantage with these crafty spells. +Deck Type=constructed +Set=ANA +[Main] +2 Chart a Course|XLN +2 Deadeye Rig-Hauler|RIX +1 Demonlord Belzenlok|DOM +3 Departed Deckhand|M19 +1 Dire Fleet Poisoner|RIX +1 Dreamcaller Siren|XLN +1 Drowned Catacomb|XLN +2 Exclusion Mage|M19 +2 Fathom Fleet Boarder|RIX +3 Grasping Scoundrel|M19 +1 Hostage Taker|XLN +10 Island|GRN +3 Kitesail Corsair|RIX +2 Kitesail Freebooter|XLN +3 Murder|M19 +2 Ravenous Chupacabra|RIX +1 Riddlemaster Sphinx|M19 +1 Ruin Raider|XLN +2 Siren Reaver|RIX +3 Siren Stormtamer|XLN +4 Submerged Boneyard|M19 +10 Swamp|GRN + + diff --git a/forge-gui/res/quest/precons/MTGA Wing and Claw.dck b/forge-gui/res/quest/precons/MTGA Wing and Claw.dck new file mode 100644 index 00000000000..6a86fd319d4 --- /dev/null +++ b/forge-gui/res/quest/precons/MTGA Wing and Claw.dck @@ -0,0 +1,35 @@ +[shop] +WinsToUnlock=0 +Credits=999 +MinDifficulty=0 +MaxDifficulty=5 +[metadata] +Name=MTGA Wing and Claw +Description=Soar over your opponent's defense while protecting your front-line with tactical spells. +Deck Type=constructed +Set=ANA +[Main] +1 Azor, the Lawbringer|RIX +2 Blade Instructor|GRN +3 Disperse|M19 +3 Favorable Winds|XLN +1 Glacial Fortress|XLN +1 Goring Ceratops|XLN +2 Healer's Hawk|GRN +2 Imperial Aerosaur|XLN +10 Island|GRN +3 Kitesail Corsair|RIX +1 Light of the Legion|GRN +4 Meandering River|M19 +1 Nezahal, Primal Tide|RIX +2 One With the Wind|XLN +2 Pegasus Courser|M19 +10 Plains|GRN +3 Seal Away|DOM +2 Serra Angel|DOM +1 Settle the Wreckage|XLN +3 Sunhome Stalwart|GRN +2 Territorial Hammerskull|XLN +1 Warkite Marauder|RIX + + diff --git a/forge-gui/res/quest/precons/MTGA Wrath of Mages.dck b/forge-gui/res/quest/precons/MTGA Wrath of Mages.dck new file mode 100644 index 00000000000..7f82c0ca407 --- /dev/null +++ b/forge-gui/res/quest/precons/MTGA Wrath of Mages.dck @@ -0,0 +1,35 @@ +[shop] +WinsToUnlock=0 +Credits=999 +MinDifficulty=0 +MaxDifficulty=5 +[metadata] +Name=MTGA Wrath of Mages +Description=Cast powerful spells to wreak havoc on your enemies. +Deck Type=constructed +Set=ANA +[Main] +2 Aven Wind Mage|M19 +1 Banefire|M19 +2 Blink of an Eye|DOM +3 Disperse|M19 +3 Enigma Drake|M19 +1 Entrancing Melody|XLN +2 Fight with Fire|DOM +3 Ghitu Lavarunner|DOM +2 Guttersnipe|M19 +4 Highland Lake|M19 +10 Island|GRN +2 Lightning Strike|M19 +10 Mountain|GRN +1 Mystic Archaeologist|M19 +1 Repeating Barrage|XLN +1 River's Rebuke|XLN +1 Rowdy Crew|XLN +1 Salvager of Secrets|M19 +3 Shivan Fire|DOM +3 Sift|M19 +1 Sulfur Falls|DOM +3 Vodalian Arcanist|DOM + + From 1f4142e368924108017835772fe93e010daca36a Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Mon, 21 Jan 2019 17:58:35 -0500 Subject: [PATCH 636/901] remember old location and size of pop-up card list window --- .../src/main/java/forge/view/arcane/ListCardArea.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java b/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java index c73ee2fb66d..44a9cb1e124 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java @@ -85,7 +85,6 @@ public class ListCardArea extends FloatingCardArea { public ListCardArea(final CMatchUI matchUI, final String title0, final List cardList0, final List moveableCards0, final boolean toTop0, final boolean toBottom0, final boolean toAnywhere0) { super(matchUI); window.add(getScrollPane(),"grow, push"); - // try { Thread.sleep(1000); } catch(InterruptedException ex) { } getScrollPane().setViewportView(this); setOpaque(false); doneButton = new FButton("Done"); @@ -112,6 +111,7 @@ public class ListCardArea extends FloatingCardArea { protected final FDialog window = new FDialog(true, true, "0") { @Override public void setLocationRelativeTo(Component c) { + if (hasBeenShown || locLoaded) { return; } super.setLocationRelativeTo(c); } @Override @@ -124,10 +124,11 @@ public class ListCardArea extends FloatingCardArea { getWidth() + COORD_DELIM + getHeight()); //don't call prefs.save(), instead allowing them to be saved when match ends } - if (b0) { - storedArea.refresh(); - } super.setVisible(b0); + if (b0) { + refresh(); + hasBeenShown = true; + } } }; From 67ca319674719001a881349ff8f6c5292cdbca5f Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Mon, 21 Jan 2019 18:10:30 -0500 Subject: [PATCH 637/901] remove debugging print in manipulateCardList --- forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java b/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java index 15546d96175..8070f65d3fa 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java +++ b/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java @@ -287,7 +287,6 @@ public class GuiChoose { public static List manipulateCardList(final CMatchUI gui, final String title, final Iterable cards, final Iterable manipulable, final boolean toTop, final boolean toBottom, final boolean toAnywhere) { - System.out.print("MCL "); System.out.println(manipulable); gui.setSelectables(manipulable); final Callable> callable = new Callable>() { @Override From 84ef513489693c6879c803285d8baba4f7717f59 Mon Sep 17 00:00:00 2001 From: churrufli Date: Tue, 22 Jan 2019 00:35:42 +0100 Subject: [PATCH 638/901] New 5 Gauntlet Contest - Starting Magic Core Set 2019 Welcome Decks --- .../main/java/forge/screens/home/EMenuGroup.java | 2 +- ...gic - Core Set 2019 Welcome Decks - Black.dat | Bin 0 -> 1711 bytes ...agic - Core Set 2019 Welcome Decks - Blue.dat | Bin 0 -> 1694 bytes ...gic - Core Set 2019 Welcome Decks - Green.dat | Bin 0 -> 1731 bytes ...Magic - Core Set 2019 Welcome Decks - Red.dat | Bin 0 -> 1697 bytes ...gic - Core Set 2019 Welcome Decks - White.dat | Bin 0 -> 1703 bytes 6 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 forge-gui/res/defaults/gauntlet/LOCKED_Starting Magic - Core Set 2019 Welcome Decks - Black.dat create mode 100644 forge-gui/res/defaults/gauntlet/LOCKED_Starting Magic - Core Set 2019 Welcome Decks - Blue.dat create mode 100644 forge-gui/res/defaults/gauntlet/LOCKED_Starting Magic - Core Set 2019 Welcome Decks - Green.dat create mode 100644 forge-gui/res/defaults/gauntlet/LOCKED_Starting Magic - Core Set 2019 Welcome Decks - Red.dat create mode 100644 forge-gui/res/defaults/gauntlet/LOCKED_Starting Magic - Core Set 2019 Welcome Decks - White.dat diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/EMenuGroup.java b/forge-gui-desktop/src/main/java/forge/screens/home/EMenuGroup.java index 732227e2b4b..e035b5ef4e6 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/EMenuGroup.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/EMenuGroup.java @@ -1,6 +1,6 @@ package forge.screens.home; -/** +/** * Submenus each belong to a menu group, which * is used for several functions, such as expanding * and collapsing in the menu. diff --git a/forge-gui/res/defaults/gauntlet/LOCKED_Starting Magic - Core Set 2019 Welcome Decks - Black.dat b/forge-gui/res/defaults/gauntlet/LOCKED_Starting Magic - Core Set 2019 Welcome Decks - Black.dat new file mode 100644 index 0000000000000000000000000000000000000000..f62f9cf6e2cddd92ae546d9ec7567d2a596b14cc GIT binary patch literal 1711 zcmV;g22lAQiwFP!000000PR{`bK*7>eebW(Fr7X%kdSP4(~`^tNJu7OLopk6`qH_v zg;B93Mv`IEU*9X+fSolUW!slbW_EV~>sVJG_niB&t%;B!t%s0s9Z_BHJk zTE2+q_?-q9hpooui+QA3OqGUsesOqo&}<$Yo&8D3R!WiK5cHB7Zf<2M#YzhiAw+NUew;fl}u+ z%9HpYhIx&opY-#bp4YPbYLIpFZjbt!30}+a=5V=|&#Q0vy?Xpb9~f^nwmhsvcR&UM zA)?Jw;~n@T@y}~L2@AS}8I?7HmiLd&YJ{EFj%tLPe;bvcwg{C*k8%QanWUkF3F%Em z5~aXy_YVtTYGS~`FrRMJA6THg8AXQ|oLowO>SU-ldyWA?q#X$n;7fE4|9bz~0{)2f z!OW!*3o0oKxx>_Bh-P?I&8?d&ngVaVZUNZb0vv&{5`D3s#PM?qyu7=y+gvp_Q+mEg zcpzzZGQ-=i7T|m4Pk({AP`@jJw~Q*~vdydgS-qi+Y~XP1U=S2c%ndBKot19FPD6wD37{}&wpJ3iwyfaT}cQ9*22KQ(cK#l|v7=J8qF0 zMFf%oN7tR2kD2m3^sT^1$Pp0}(r3!e;7caS6>c^z6f#O3JT$G4W~zfuBygPpxuFuG zU_T|7baufwr1#Fi+Mjz?EA=8u=M@{feWEWMJq2%{hNp;<&J<7BX^Yx)l9&tW1R4Wg z-WeCVVo$a&?p7heWZQT*x+_4AT_8>OS&pliemCT#QXF>C@e4wJLCO0``A2D)NQ&x6 zxsME3uQ%3zR@|J@b;JLT$BRtYDq{S2)wKfNuyATTl=SfWI88a43dyH9AsLHkQ5kIRV!2Fq9vNRFkL*ZUD#Rcg zn=C|FQTZem7GU!d&0t0)@3BsJ}tbN*4Xv*>V{Z-peOT-gOC+Q13{Or^n2=7KH z%`jT-GYnx-NB5T?iuA={HlySLwciQn;W^K=;Gs!+H+yAk^P`CTlyM8#Q%n840~xMQ zNUr7A*79pc@mzWFDPsS)nR>^~d@E-fL^N=$`Q9fnMmcz^ z+JXmJI@ufAY3U$>Rf_LD6mz>%7sx(ss(@71>)u6XTNlN>QT_%*#-(LmEV?-~%}eEc zx3>99Lv0)9MN)NbotLn$X`UCe4fpnWxp3yxKrgYnTMNCs(aufuQrh9(MlWvp>l*1r zWwC6fmsH=mnO>4X=XQE=Zo7v1PQ*TKuxzUDM7(D#1=(md^6vcVY4!iy`xkU%p0n2{ F000^#K6n5C literal 0 HcmV?d00001 diff --git a/forge-gui/res/defaults/gauntlet/LOCKED_Starting Magic - Core Set 2019 Welcome Decks - Blue.dat b/forge-gui/res/defaults/gauntlet/LOCKED_Starting Magic - Core Set 2019 Welcome Decks - Blue.dat new file mode 100644 index 0000000000000000000000000000000000000000..799864e7510c409654287023ee4d247cafcaaafb GIT binary patch literal 1694 zcmV;P24VRhiwFP!000000PR{`bK*7>eebW(Fr7X%kYux)rX`sPkdRDZNn~`QA3UokIw!aP>yS-B*B}y ze9*R{RP2p@pvm6Y!H5~UH@d;IP;jxQt1YZ&nkxH>;>`kY_`f%QdI6k*GMdC3v_7v; zkxdRJFs+dMlX;%f^UC75T4dF}JEE~+QdAarYg=K|^YRL>%b&mK0u%MxhMT46CaC0I zO8#=!ItPA9;`7P_OA<~epbb?dnvR(GQX#m6?$KF=u=C1Mg$Vn%R*JsF%_IXR64Hf~ z1^}-W;~Wo8L;-)*6c-NggaN-X*`5Lh1b0DFiVFkjiib2Bhb9M_nira}LI?_s zRLiISf*DkCN@+F9dGg05XnHF&6`C0~qs6cp<# zST7v=Z?NpwJo~LoyPInr)3+7O=p21o?LPLdugFvzv_c@P#S~2y3`u(=vxRTATEBZi z^NA)bO^YG>-Fq)wG^QA3NkJ}EJPMp{G=81{!bpQliOgV3@q*8tk6tf$#JG*wqa|BwkyV+#&oI@|~ZhSXd=Ta8MG82iSd^gQI z@D7VdKfzS$-!#FqN3{;y^5sq~-_gK$Ea(m0OeKYxuDX6^LY6_Y;rXJc==x<--n`eh zVn~$$jvEHb(pA`k=Xgd6ge$`*0f^%={n(0l7mPS5)u?Tf@JbY3$--`7_*Q8kilSkt zh>?V=)!OQ3sSmki)Z(wS#8s15OLXG$tzzPzzq~0ixlB{*@Ms2%z9$oDMq#3&FvQHg zupuFgshc*M%@po+ru2&Cx5SJtR&uE|`fp27NG323;=A?;GnFS$W73~95k_`x4EzmJ z4qFn|=~c@Mc*D|>4cSN=k5AB${gG5+gaeX+EuFeJBv zD8pp1gDaJDuvyD;!qMTD+{(=*;fW>T5^~Q`HEEGlb+;r(?#40$g2kk*>(AEBW=E z`8A{JnOrl$bXbIgrj5~ChhZ662i4w)JUc;fQC{>-L8Fn3$3ekGUuBrs8%%nkpuSJ7 z$P4)Z2?Jv%x|(uW>V^rYL4RCm{Fw{doDP+Oc4b7Rpk2aN3i_TG1;~Macjavf0#yo@ z1&wxw-(uh&Ryf1>*LF7U6{9}YewW+xQoRk^uYm<-WF7fMCQ_g~WANU<^r*Z}xJ4T< zd>TtlqB$EHG~m2IzxRv7X$m^iYgyfTZ)96d2h>3mgK=S-I(Tlwsxl074fTWz#(Q~aps=5`-KAiK1w1XA9<`7SaWIyu43@;9I{d$rBo+FfAd+zp5KX`Q=l8Q45` zIWM?f0eDZT0^zk=JWQcYb-d{6FXZ0o?6xidQE90Br_83IG5A literal 0 HcmV?d00001 diff --git a/forge-gui/res/defaults/gauntlet/LOCKED_Starting Magic - Core Set 2019 Welcome Decks - Green.dat b/forge-gui/res/defaults/gauntlet/LOCKED_Starting Magic - Core Set 2019 Welcome Decks - Green.dat new file mode 100644 index 0000000000000000000000000000000000000000..ab3d01e6bfacfdf55ebc75436979962542a52b68 GIT binary patch literal 1731 zcmV;!20Zy6iwFP!000000PR}eQ{y%ee(ztQ$#nYE5W;a>X#+DPfxtj6Y0QzEzI24G z*lKJkBgx6pzrHKm2@0n;64$=an*k=V{dreE_WO3VbY@({;Qqm5+97Uu$HHy5x174pyp$x|*RPElVF9A$V_U?(@99k7E0OZAAw9Nn)dlOFyKC}s); z3mR3A*Nbh&XgI5d~?Xa{hDA8CZTzyTiC#%Z2qM3so)k;`OKg&7UeK=4(y zyGN572meNRP8h^dR$!*>4-UqzfG%X|-5-}9Uk5m<^~wTxR{-9*1CD)NdhZK3@g2hl zUkkr{ZDETRU$P!h|1-gMS_NNMUlfiv)GfJyG@&VBi*1lPd%yxKF4j-|g_rmM_I-R1 z6x#A*4@+{xBw>;&;L_d(vGxyg3$RjZkSRKyLQ1M|Lz1W9F1rkS0?X=V<%iN zCy<(QhAu>yc)A$}L$_rDmI1OUGOb{txzJ*8_gvqw84(O}rU0&Jy7C+F z3ie2aF!lD>194y=fNAiHLWUOw>GcI@p`~D|p<13|0R;?%f1*E@sx}%rf!FoKkV-#?FQ~2v zNTw^jlAy<H^t*YLYKg2K!tG?#ZdDk$1;C90qLffI6qBMQm}j&5A`D?OlKQV@^jDcz|F+D*|`(7ue`3fh;{ zTS4FRdJj2pZ>hX3K_EilbwNJJ;VR_2eg{7*EOd517L<5qx@C&0ljJK*UHT^`^YAY` z;tax>5!4lA$2nJxHV7i;T%uq_X9^Z@RiWQInIDrF%Uo{tVYVxSx-$tZnmxf+OqVsV zZ~f{Snl6cWgaM-g@b!%PEmx33IRiTmrp+(sp5#)kG=W}W2nRo-_pmzXfv}ihh;1(@ z5QRQxi*$oUY)VJBMH*_Ve?oTzm*vT5Fm)R$SyD)H=-+;>-ZE`(9ZX{=T0KkMyF7y| z2Xl$mk;5dOgJ2P_KtrTk7=?Yg4@*Vri@Y Ze}%Bqs=D**yY_!K{0Bu-_)Ux`000$LHQ4|F literal 0 HcmV?d00001 diff --git a/forge-gui/res/defaults/gauntlet/LOCKED_Starting Magic - Core Set 2019 Welcome Decks - Red.dat b/forge-gui/res/defaults/gauntlet/LOCKED_Starting Magic - Core Set 2019 Welcome Decks - Red.dat new file mode 100644 index 0000000000000000000000000000000000000000..6fdaa3c06e7bfdd51d610a31803861294392fb7c GIT binary patch literal 1697 zcmV;S2449eiwFP!000000PR}eZ`(Eye&1g~7{i{HI8M`c*_;5eowz}wCbQC{*vr63 zXPGla3M6GW{p)v>B}YzVn@qQtAV6DKKR)qD-hJO4uidd!3G5~`7lwn`9hN@^)X?Lf z2dCKr|&gq%Rea5DeMh>m2@l2OQ@PB*urj zdC;K(5HCjec>eOCdz>QhrRWjFp4f6tmrK~qH7NUu^1}ijIDfWyd4bEQGMYr3YJJoK zk*7N;&03`RWgap(YAw9gB6sb#Lx>EMqP4)=trbQ+R9AT2{Qhx3ndr9HJZwbwsfw?q zPkLHE}{uLPY=fm|gDJWwI->eNV)SO#-<- zL`A`PD2apOMDW}^m7_7W7G+C0FmI_sKM}v9f zDl4W`+3>C2`iIWwE~g^d4GXUQxlc8m3k^aujCANP5tV(YwK&Rxlj|hhEy%Te=Lyd( z4Jeq`UGyG_`oEy+=Vbk(biJLh>#+k$(O+mL^&grHbG*x_12NUUFql(?DoCysgEE|4 zp`Soe9uqkxXOtNShN<&~{3c^5Fcbxlo&q{`VYWJpE6`J^NjPU?gBv(6(eIsxzlMbB zT%)JtN|z%Kt^y})XsFuhD>)aK8sLQki`3DK&p_Sdgvk&&cFg>?E6fFYwm=#K?gbp> z+RQEaoly)2zd>(scgQV>1gMCbL~}h9!#>0GASV3@Dj9ffQebKNfn0(ONyJ?Z@7$&e zGlq!>`|fAzg|OpQ!F0_bPW(P_nWvbIpjY*zh;;!Sjy5P@-5)t}!vYdso!1~Ad?1b5 zvKjKOQNcDz#S^i3A{W~Q<3}ZfC>VnRbi||9?rwYer_zl=O4`vgjj5~5lPT76{*5Bz zUK_nCkvT~)Rn{7}fdn*7r6<+*6w`)V>gh@9kmJ{&eOpoFYK5kQ&Yl}qa;Y`tm^%ZF z(^4Qt=U<)B!wDvr_n7jNn|T#8u2v6GgAEC@WwyRCudNFz5)cMKOor$_ehfX4N=$G- zawkz={OrA>oLd#YMNz4c9Vg@$rLBG=x2GBN6qQSysl?<1E62*Iyho+%ppZ#0EP5EVd9$? z|D4!5>y9D62h=mQJX4HwTW$cwzbeCJ@GBbx%`z*&14XCMprh-<>qc^_P|-*jP3+Hx zT4_DFl9qsZ)|MwsJvmamzH(!1JJe2}OPps+7A2~e@(wO+N%{1fynOB1H zMPQ_$_ZfQ6t%l+b`{h+I&aFdwYCSsdR7lgXChI46u5DUUKrU`BYLNAE(E!;dN)3?4 z@?0Fc{p&BDr#*-+7B?%cj#WMF0?KLGK^#{VpX25xr)Xmizd~{5&9lh z%YI8iKC9u2>@s4uprPRlsqmPt` zx~#8f`savkr(Mqx+e)10h=xAOo0zN<6aQBEE07Y;rg=T5_iUTj*~+_dUO#2>Zk^W; zHGG=q^<{cN`@AkGz76#Hx&8}U=quag(?qWUJ=*9iO5)o{UvWmKR(f4B{hH}3hj1@w rr`HwBxuL!dv`q-yo9f#@Z*ov0{%*VM&R0*H|M%U$J$&ybnd##cWe z)Qm)$!8M7mj+>3mg?XfDN|eTFc6EGmbb5Mpa`7`d{`Et%v3X!#BXh#_kVHbp%G`ik zN=wRbKHitSWZxfL^E`R+CmZ(5{*uePcHr(69!8sD29is zddwk-55{&SA^c!;i(vpBiXKm?_FZ*p)3phkxgyehqWm<62Ob|TUSA?JEVV)r!%AJ& z2+z}_6lXP5{L)VuxvVYy)gbHU+aZZG6}+~@o6Y4~KCQ0cy88XA08`#@N;O z4@iPluD~mDsmf71_kja4)L0(1rC4wXH@HYV793JGC-M;%in@|cCe&wx!kmNuat+2} z9ubk8KHPGSyG0PfW-G>b^U6 zSt6NJjT!yhXOef^jI|1w0V8qZ1MlZ4J0km5`vsM~dhT`x$}85^Et>Z~cYmxXv(7 z>S4j(Ken+V;3I@9s_C4x*ND~pK)+#>CC}T$-Yn?4eCHW+t|w4%xwDXNnE&74{+I0k zt^B`V0qj7aam+}Hl_nB}*_86H`(4_?UmF1!Qy!xLyF`Np{U|A8h7k#dzcK?ec;Q2i zv&_&`M*{7X(Bs`IVDpql1zvskOf@U>h;F@&x)H1x^6@-c-&_4XG^ql^;e19wWxVhJRVNz9QX{V zFe!t4eDdCnh9U2IMoayhmJ_rq9vS5*5U}~nUH6FETcI=sk_aFv(l~cWZQDX>A#Y$ZaJffW(DHCqj5$uPcw+q76jmu z#y@vLC*%-A)vC=z*HiW~Patye`?9PGFKp0mimn7zrr7&HXNQ2!E0g)}a!@G;?&nl* zN)WCS;6|lj8z3`JQ{i&VVkcq}Qch;VswJ==vA2zosn_MYW%i1}slgQWjc) zTe&o%x=`t^6pPaD?}t6N!~#kz4pEl+HTfD)MDD z)#?21ra)$*F-?+k$WbtG%eH5P5vXay=u=M2hQS{G^f^v>9(%;w9@URdNkAR x1JQ%p>9$XMHq^JOO1GB!>yUk_ Date: Sat, 19 Jan 2019 19:59:10 -0500 Subject: [PATCH 639/901] RNA Templates --- .../res/cardsfolder/broken/amplifire.txt | 8 +++++++ .../res/cardsfolder/broken/angel_of_grace.txt | 12 ++++++++++ .../cardsfolder/broken/applied_biomancy.txt | 7 ++++++ .../broken/awaken_the_erstwhile.txt | 7 ++++++ .../cardsfolder/broken/bedeck_bedazzle.txt | 4 ++++ .../broken/bloodmist_infiltrator.txt | 9 +++++++ .../cardsfolder/broken/captive_audience.txt | 24 +++++++++++++++++++ .../cardsfolder/broken/carnival_carnage.txt | 4 ++++ .../cardsfolder/broken/consecrate_consume.txt | 4 ++++ .../broken/cry_of_the_carnarium.txt | 6 +++++ forge-gui/res/cardsfolder/broken/deface.txt | 10 ++++++++ .../res/cardsfolder/broken/depose_depose.txt | 4 ++++ .../broken/deputy_of_detention.txt | 9 +++++++ .../broken/dovin_grand_arbiter.txt | 12 ++++++++++ .../res/cardsfolder/broken/dovins_acuity.txt | 9 +++++++ .../res/cardsfolder/broken/final_payment.txt | 6 +++++ .../cardsfolder/broken/fireblade_artist.txt | 9 +++++++ .../broken/flames_of_the_raze_boar.txt | 7 ++++++ .../cardsfolder/broken/galloping_lizrog.txt | 10 ++++++++ .../cardsfolder/broken/guardian_project.txt | 6 +++++ .../res/cardsfolder/broken/gutterbones.txt | 9 +++++++ .../cardsfolder/broken/incubation_druid.txt | 10 ++++++++ .../broken/incubation_incongruity.txt | 4 ++++ .../broken/kaya_orzhov_usurper.txt | 15 ++++++++++++ .../res/cardsfolder/broken/kayas_wrath.txt | 7 ++++++ .../broken/lavinia_azorius_renegade.txt | 10 ++++++++ .../cardsfolder/broken/light_up_the_stage.txt | 11 +++++++++ .../broken/lumbering_battlement.txt | 13 ++++++++++ .../broken/mesmerizing_benthid.txt | 12 ++++++++++ .../res/cardsfolder/broken/mirror_march.txt | 8 +++++++ .../broken/precognitive_perception.txt | 6 +++++ .../broken/priest_of_forgotten_gods.txt | 10 ++++++++ .../broken/rakdos_the_showstopper.txt | 11 +++++++++ .../broken/repudiate_replicate.txt | 4 ++++ .../cardsfolder/broken/revival_revenge.txt | 4 ++++ .../cardsfolder/broken/rix_maadi_reveler.txt | 12 ++++++++++ .../res/cardsfolder/broken/rumbling_ruin.txt | 8 +++++++ .../res/cardsfolder/broken/sentinels_mark.txt | 10 ++++++++ .../cardsfolder/broken/smothering_tithe.txt | 7 ++++++ .../cardsfolder/broken/spikewheel_acrobat.txt | 6 +++++ .../cardsfolder/broken/swirling_torrent.txt | 7 ++++++ .../cardsfolder/broken/theater_of_horrors.txt | 10 ++++++++ .../res/cardsfolder/broken/thrash_threat.txt | 4 ++++ .../broken/unbreakable_formation.txt | 7 ++++++ .../res/cardsfolder/broken/warrant_warden.txt | 4 ++++ 45 files changed, 376 insertions(+) create mode 100644 forge-gui/res/cardsfolder/broken/amplifire.txt create mode 100644 forge-gui/res/cardsfolder/broken/angel_of_grace.txt create mode 100644 forge-gui/res/cardsfolder/broken/applied_biomancy.txt create mode 100644 forge-gui/res/cardsfolder/broken/awaken_the_erstwhile.txt create mode 100644 forge-gui/res/cardsfolder/broken/bedeck_bedazzle.txt create mode 100644 forge-gui/res/cardsfolder/broken/bloodmist_infiltrator.txt create mode 100644 forge-gui/res/cardsfolder/broken/captive_audience.txt create mode 100644 forge-gui/res/cardsfolder/broken/carnival_carnage.txt create mode 100644 forge-gui/res/cardsfolder/broken/consecrate_consume.txt create mode 100644 forge-gui/res/cardsfolder/broken/cry_of_the_carnarium.txt create mode 100644 forge-gui/res/cardsfolder/broken/deface.txt create mode 100644 forge-gui/res/cardsfolder/broken/depose_depose.txt create mode 100644 forge-gui/res/cardsfolder/broken/deputy_of_detention.txt create mode 100644 forge-gui/res/cardsfolder/broken/dovin_grand_arbiter.txt create mode 100644 forge-gui/res/cardsfolder/broken/dovins_acuity.txt create mode 100644 forge-gui/res/cardsfolder/broken/final_payment.txt create mode 100644 forge-gui/res/cardsfolder/broken/fireblade_artist.txt create mode 100644 forge-gui/res/cardsfolder/broken/flames_of_the_raze_boar.txt create mode 100644 forge-gui/res/cardsfolder/broken/galloping_lizrog.txt create mode 100644 forge-gui/res/cardsfolder/broken/guardian_project.txt create mode 100644 forge-gui/res/cardsfolder/broken/gutterbones.txt create mode 100644 forge-gui/res/cardsfolder/broken/incubation_druid.txt create mode 100644 forge-gui/res/cardsfolder/broken/incubation_incongruity.txt create mode 100644 forge-gui/res/cardsfolder/broken/kaya_orzhov_usurper.txt create mode 100644 forge-gui/res/cardsfolder/broken/kayas_wrath.txt create mode 100644 forge-gui/res/cardsfolder/broken/lavinia_azorius_renegade.txt create mode 100644 forge-gui/res/cardsfolder/broken/light_up_the_stage.txt create mode 100644 forge-gui/res/cardsfolder/broken/lumbering_battlement.txt create mode 100644 forge-gui/res/cardsfolder/broken/mesmerizing_benthid.txt create mode 100644 forge-gui/res/cardsfolder/broken/mirror_march.txt create mode 100644 forge-gui/res/cardsfolder/broken/precognitive_perception.txt create mode 100644 forge-gui/res/cardsfolder/broken/priest_of_forgotten_gods.txt create mode 100644 forge-gui/res/cardsfolder/broken/rakdos_the_showstopper.txt create mode 100644 forge-gui/res/cardsfolder/broken/repudiate_replicate.txt create mode 100644 forge-gui/res/cardsfolder/broken/revival_revenge.txt create mode 100644 forge-gui/res/cardsfolder/broken/rix_maadi_reveler.txt create mode 100644 forge-gui/res/cardsfolder/broken/rumbling_ruin.txt create mode 100644 forge-gui/res/cardsfolder/broken/sentinels_mark.txt create mode 100644 forge-gui/res/cardsfolder/broken/smothering_tithe.txt create mode 100644 forge-gui/res/cardsfolder/broken/spikewheel_acrobat.txt create mode 100644 forge-gui/res/cardsfolder/broken/swirling_torrent.txt create mode 100644 forge-gui/res/cardsfolder/broken/theater_of_horrors.txt create mode 100644 forge-gui/res/cardsfolder/broken/thrash_threat.txt create mode 100644 forge-gui/res/cardsfolder/broken/unbreakable_formation.txt create mode 100644 forge-gui/res/cardsfolder/broken/warrant_warden.txt diff --git a/forge-gui/res/cardsfolder/broken/amplifire.txt b/forge-gui/res/cardsfolder/broken/amplifire.txt new file mode 100644 index 00000000000..ce695f0c794 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/amplifire.txt @@ -0,0 +1,8 @@ +Name:Amplifire +ManaCost:2 R R +Types:Creature Elemental +PT:1/1 +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDig | TriggerDescription$ At the beginning of your upkeep, reveal cards from the top of your library until you reveal a creature card. Until your next turn, CARDNAME's base power becomes twice that card's power and its toughness. Put the revealed cards on the bottom of your library in a random order. +SVar:TrigDig:DB$ DigUntil | Valid$ Creature | ValidDescription$ creature card | FoundDestination$ Library | RevealedDestination$ Library | RevealedLibraryPosition$ -1 | RememberFound$ True | SubAbility$ DBAnimate +SVar:DBAnimate:DB$ Animate | Power$ X | Toughness$ Y +Oracle:At the beginning of your upkeep, reveal cards from the top of your library until you reveal a creature card. Until your next turn, Amplifire's base power becomes twice that card's power and its base toughness becomes twice that card's toughness. Put the revealed cards on the bottom of your library in a random order. diff --git a/forge-gui/res/cardsfolder/broken/angel_of_grace.txt b/forge-gui/res/cardsfolder/broken/angel_of_grace.txt new file mode 100644 index 00000000000..06254bbaf19 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/angel_of_grace.txt @@ -0,0 +1,12 @@ +Name:Angel of Grace +ManaCost:3 W W +Types:Creature Angel +PT:5/4 +K:Flash +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigEffect | TriggerDescription$ When CARDNAME enters the battlefield, until end of turn, damage that would reduce your life total to less than 1 reduces it to 1 instead. +SVar:TrigEffect:DB$ Effect | Name$ CARDNAME Effect | ReplacementEffects$ ElderscaleCondition | Duration$ UntilEndOfTurn +SVar:SelflessDamage:Event$ Continuous | EffectZone$ Command | Affected$ You | AddKeyword$ DamageLifeThreshold:1 | Description$ Spells can't reduce your life total to less than 1 reduces it to 1 instead. +A:AB$ SetLife | Cost$ 4 W W ExileFromGrave<1/CARDNAME> | ActivationZone$ Graveyard | LifeAmount$ 10 | SpellDescription$ Your life total becomes 10. +SVar:RemRandomDeck:True +Oracle:Flash\nFlying\nWhen Angel of Grace enters the battlefield, until end of turn, damage that would reduce your life total to less than 1 reduces it to 1 instead.\n{4}{W}{W}, Exile Angel of Grace from your graveyard: Your life total becomes 10. diff --git a/forge-gui/res/cardsfolder/broken/applied_biomancy.txt b/forge-gui/res/cardsfolder/broken/applied_biomancy.txt new file mode 100644 index 00000000000..0a3c5db7142 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/applied_biomancy.txt @@ -0,0 +1,7 @@ +Name:Applied Biomancy +ManaCost:G U +Types:Instant +A:SP$ Charm | Cost$ G U | MinCharmNum$ 1 | CharmNum$ 2 | Choices$ DBPump,DBUnsummon +SVar:DBPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Target creature gets +1/+1 until end of turn. +SVar:DBUnsummon:DB$ ChangeZone | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. +Oracle:Choose one or both —\n• Target creature gets +1/+1 until end of turn.\n• Return target creature to its owner's hand. diff --git a/forge-gui/res/cardsfolder/broken/awaken_the_erstwhile.txt b/forge-gui/res/cardsfolder/broken/awaken_the_erstwhile.txt new file mode 100644 index 00000000000..52018c5c221 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/awaken_the_erstwhile.txt @@ -0,0 +1,7 @@ +Name:Awaken the Erstwhile +ManaCost:3 B B +Types:Sorcery +A:SP$ RepeatEach | Cost$ 3 B B | RepeatPlayers$ Player | RepeatSubAbility$ DBDiscard | SpellDescription$ Each player discards all the cards in their hand, then creates that many 2/2 black Zombie creature tokens. +SVar:DBToken:DB$ Token | TokenAmount$ X | TokenName$ Zombie | TokenTypes$ Creature,Zombie | TokenOwner$ You | TokenColors$ Black | TokenPower$ 2 | TokenToughness$ 2 | References$ X +SVar:X:Remembered$Amount +Oracle:Each player discards all the cards in their hand, then creates that many 2/2 black Zombie creature tokens. diff --git a/forge-gui/res/cardsfolder/broken/bedeck_bedazzle.txt b/forge-gui/res/cardsfolder/broken/bedeck_bedazzle.txt new file mode 100644 index 00000000000..b4a3be44f39 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/bedeck_bedazzle.txt @@ -0,0 +1,4 @@ +Name:Bedeck // Bedazzle +ManaCost:B/R B/R // 4 B R +Types:Instant // Instant +Oracle:null diff --git a/forge-gui/res/cardsfolder/broken/bloodmist_infiltrator.txt b/forge-gui/res/cardsfolder/broken/bloodmist_infiltrator.txt new file mode 100644 index 00000000000..595582978bd --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/bloodmist_infiltrator.txt @@ -0,0 +1,9 @@ +Name:Bloodmist Infiltrator +ManaCost:2 B +Types:Creature Vampire +PT:3/1 +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, you may sacrifice another creature. If you do, CARDNAME can't be blocked this turn. +SVar:TrigPump:AB$ Pump | Cost$ Sac<1/Creature.Other/another creature> | Defined$ Self | KW$ HIDDEN Unblockable | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ1 | SubAbility$ DBCleanup | References$ X +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Remembered$Amount +Oracle:Whenever Bloodmist Infiltrator attacks, you may sacrifice another creature. If you do, Bloodmist Infiltrator can't be blocked this turn. diff --git a/forge-gui/res/cardsfolder/broken/captive_audience.txt b/forge-gui/res/cardsfolder/broken/captive_audience.txt new file mode 100644 index 00000000000..74b834089a1 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/captive_audience.txt @@ -0,0 +1,24 @@ +Name:Captive Audience +ManaCost:5 B R +Types:Enchantment +K:CARDNAME enters the battlefield under the control of your choice. +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChoose | TriggerDescription$ At the beginning of your upkeep, choose one that hasn't been chosen -PB/-greater for each opponent of your choice. +SVar:TrigChoose:DB$ ChooseCard | Defined$ You | Choices$ Player.Opponent | Mandatory$ True | SubAbility$ DBChangeZone +SVar:DBChangeZone:DB$ ChangeZone | Defined$ Self | Origin$ All | Destination$ Battlefield | GainControl$ True +SVar:RemRandomDeck:True +K:CARDNAME enters the battlefield under the control of your choice. +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChoose | TriggerDescription$ At the beginning of your upkeep, choose one that hasn't been chosen -PB/-greater for each opponent of your choice. +SVar:TrigChoose:DB$ ChooseCard | Defined$ You | Choices$ Player.Opponent | Mandatory$ True | SubAbility$ DBChangeZone +SVar:DBChangeZone:DB$ ChangeZone | Defined$ Self | Origin$ All | Destination$ Battlefield | GainControl$ True +SVar:RemRandomDeck:True +K:CARDNAME enters the battlefield under the control of your choice. +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChoose | TriggerDescription$ At the beginning of your upkeep, choose one that hasn't been chosen -PB/-greater for each opponent of your choice. +SVar:TrigChoose:DB$ ChooseCard | Defined$ You | Choices$ Player.Opponent | Mandatory$ True | SubAbility$ DBChangeZone +SVar:DBChangeZone:DB$ ChangeZone | Defined$ Self | Origin$ All | Destination$ Battlefield | GainControl$ True +SVar:RemRandomDeck:True +K:CARDNAME enters the battlefield under the control of your choice. +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChoose | TriggerDescription$ At the beginning of your upkeep, choose one that hasn't been chosen -PB/-greater for each opponent of your choice. +SVar:TrigChoose:DB$ ChooseCard | Defined$ You | Choices$ Player.Opponent | Mandatory$ True | SubAbility$ DBChangeZone +SVar:DBChangeZone:DB$ ChangeZone | Defined$ Self | Origin$ All | Destination$ Battlefield | GainControl$ True +SVar:RemRandomDeck:True +Oracle:Captive Audience enters the battlefield under the control of an opponent of your choice.\nAt the beginning of your upkeep, choose one that hasn't been chosen —\n• Your life total becomes 4.\n• Discard your hand.\n• Each opponent creates five 2/2 black Zombie creature tokens. diff --git a/forge-gui/res/cardsfolder/broken/carnival_carnage.txt b/forge-gui/res/cardsfolder/broken/carnival_carnage.txt new file mode 100644 index 00000000000..f234720489c --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/carnival_carnage.txt @@ -0,0 +1,4 @@ +Name:Carnival // Carnage +ManaCost:B/R // 2 B R +Types:Instant // Sorcery +Oracle:null diff --git a/forge-gui/res/cardsfolder/broken/consecrate_consume.txt b/forge-gui/res/cardsfolder/broken/consecrate_consume.txt new file mode 100644 index 00000000000..b2280b114ba --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/consecrate_consume.txt @@ -0,0 +1,4 @@ +Name:Consecrate // Consume +ManaCost:1 W/B // 2 W B +Types:Instant // Sorcery +Oracle:null diff --git a/forge-gui/res/cardsfolder/broken/cry_of_the_carnarium.txt b/forge-gui/res/cardsfolder/broken/cry_of_the_carnarium.txt new file mode 100644 index 00000000000..4d9a4e811f5 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/cry_of_the_carnarium.txt @@ -0,0 +1,6 @@ +Name:Cry of the Carnarium +ManaCost:1 B B +Types:Sorcery +A:SP$ PumpAll | Cost$ 1 B B | ValidCards$ Creature | NumAtt$ -2 | NumDef$ -2 | IsCurse$ True | SubAbility$ DBCopy | SpellDescription$ All creatures get -2/-2 until end of turn. Exile all creature cards in all graveyards that were put there from the battlefield this turn. If a creature would die this turn, exile it instead. +SVar:Exile:DB$ ChangeZoneAll | Origin$ Graveyard | Destination$ Exile | ChangeType$ Creature | Mandatory$ True +Oracle:All creatures get -2/-2 until end of turn. Exile all creature cards in all graveyards that were put there from the battlefield this turn. If a creature would die this turn, exile it instead. diff --git a/forge-gui/res/cardsfolder/broken/deface.txt b/forge-gui/res/cardsfolder/broken/deface.txt new file mode 100644 index 00000000000..b957bfeb2fd --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/deface.txt @@ -0,0 +1,10 @@ +Name:Deface +ManaCost:R +Types:Sorcery +A:SP$ ChooseCard | Cost$ R | Defined$ You | Choices$ Player | ChoiceZone$ Exile | Amount$ 1 | RememberChosen$ True | SVar$ Choose one -2/-4 if you choose one -1/+4 Choose one -1/+4. Choose one -1/+4 Choose one -1/+4. | ChoiceZone$ Exile | RememberChosen$ True | SubAbility$ DBChoose +SVar:DBChoose:DB$ ChooseCard | Defined$ You | Choices$ Player.IsRemembered | ChoiceZone$ Exile | Amount$ 1 | RememberChosen$ True | Choices$ Card.IsRemembered | ChoiceZone$ Choose one to one -1/+1 | RememberChosen$ True +A:SP$ ChooseCard | Cost$ R | Defined$ You | Choices$ Player | ChoiceZone$ Exile | Amount$ 1 | RememberChosen$ True | SVar$ Choose one -2/-4 if you choose one -1/+4 Choose one -1/+4. Choose one -1/+4 Choose one -1/+4. | ChoiceZone$ Exile | RememberChosen$ True | SubAbility$ DBChoose +SVar:DBChoose:DB$ ChooseCard | Defined$ You | Choices$ Player.IsRemembered | ChoiceZone$ Exile | Amount$ 1 | RememberChosen$ True | Choices$ Card.IsRemembered | ChoiceZone$ Choose one to one -1/+1 | RememberChosen$ True +A:SP$ ChooseCard | Cost$ R | Defined$ You | Choices$ Player | ChoiceZone$ Exile | Amount$ 1 | RememberChosen$ True | SVar$ Choose one -2/-4 if you choose one -1/+4 Choose one -1/+4. Choose one -1/+4 Choose one -1/+4. | ChoiceZone$ Exile | RememberChosen$ True | SubAbility$ DBChoose +SVar:DBChoose:DB$ ChooseCard | Defined$ You | Choices$ Player.IsRemembered | ChoiceZone$ Exile | Amount$ 1 | RememberChosen$ True | Choices$ Card.IsRemembered | ChoiceZone$ Choose one to one -1/+1 | RememberChosen$ True +Oracle:Choose one —\n• Destroy target artifact.\n• Destroy target creature with defender. diff --git a/forge-gui/res/cardsfolder/broken/depose_depose.txt b/forge-gui/res/cardsfolder/broken/depose_depose.txt new file mode 100644 index 00000000000..fc47e8ce373 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/depose_depose.txt @@ -0,0 +1,4 @@ +Name:Depose // Deploy +ManaCost:1 W/U // 2 W U +Types:Instant // Instant +Oracle:null diff --git a/forge-gui/res/cardsfolder/broken/deputy_of_detention.txt b/forge-gui/res/cardsfolder/broken/deputy_of_detention.txt new file mode 100644 index 00000000000..ef606eccea7 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/deputy_of_detention.txt @@ -0,0 +1,9 @@ +Name:Deputy of Detention +ManaCost:1 W U +Types:Creature Vedalken Wizard +PT:1/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target nonland permanent an opponent controls and all other nonland permanents that player controls with the same name as that permanent until CARDNAME leaves the battlefield. +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | RememberTargets$ True | SubAbility$ DBExile +SVar:DBChangeZoneAll:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Card.IsRemembered | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup +Oracle:When Deputy of Detention enters the battlefield, exile target nonland permanent an opponent controls and all other nonland permanents that player controls with the same name as that permanent until Deputy of Detention leaves the battlefield. diff --git a/forge-gui/res/cardsfolder/broken/dovin_grand_arbiter.txt b/forge-gui/res/cardsfolder/broken/dovin_grand_arbiter.txt new file mode 100644 index 00000000000..54d1b89048c --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/dovin_grand_arbiter.txt @@ -0,0 +1,12 @@ +Name:Dovin, Grand Arbiter +ManaCost:1 W U +Types:Legendary Planeswalker Dovin +Loyalty:3 +A:AB$ Effect | Cost$ AddCounter<1/LOYALTY> | Name$ CARDNAME Effect | Triggers$ TrigSpellCast | SVars$ TrigPutCounter | SpellDescription$ Until end of turn, whenever a creature you control deals combat damage to a player, put a loyalty counter on CARDNAME. +SVar:X:Count$Valid Creature.YouCtrl +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ LOYALTY | CounterNum$ 1 +A:AB$ Token | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 | TokenName$ Thopter | TokenTypes$ Artifact,Creature,Thopter | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SubAbility$ DBGainLife | SpellDescription$ Create a 1/1 colorless Thopter artifact creature token with flying. +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 | SpellDescription$ You gain 1 life. +DeckHas:Ability$Token +A:AB$ Dig | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | DigNum$ 10 | ChangeNum$ 3 | DestinationZone$ Hand | DestinationZone2$ Library | LibraryPosition$ -1 | Choices$ Card.nonLand | SpellDescription$ Look at the top ten cards of your library. Put three of them into your hand and the rest on the bottom of your library in a random order. +Oracle:[+1]: Until end of turn, whenever a creature you control deals combat damage to a player, put a loyalty counter on Dovin, Grand Arbiter.\n[-1]: Create a 1/1 colorless Thopter artifact creature token with flying. You gain 1 life.\n[-7]: Look at the top ten cards of your library. Put three of them into your hand and the rest on the bottom of your library in a random order. diff --git a/forge-gui/res/cardsfolder/broken/dovins_acuity.txt b/forge-gui/res/cardsfolder/broken/dovins_acuity.txt new file mode 100644 index 00000000000..c0826ba22c4 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/dovins_acuity.txt @@ -0,0 +1,9 @@ +Name:Dovin's Acuity +ManaCost:1 W U +Types:Enchantment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 2 life and draw a card. +T:Mode$ SpellCast | ValidCard$ Instant | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ Whenever you cast an instant spell during your main phase, you may return CARDNAME to its owner's hand. +SVar:TrigGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 | SubAbility$ DBDraw +SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 1 +SVar:X:Count$IfMainPhase +Oracle:When Dovin's Acuity enters the battlefield, you gain 2 life and draw a card.\nWhenever you cast an instant spell during your main phase, you may return Dovin's Acuity to its owner's hand. diff --git a/forge-gui/res/cardsfolder/broken/final_payment.txt b/forge-gui/res/cardsfolder/broken/final_payment.txt new file mode 100644 index 00000000000..738c4f59fad --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/final_payment.txt @@ -0,0 +1,6 @@ +Name:Final Payment +ManaCost:W B +Types:Instant +K:AlternateAdditionalCost:PayLife<5>:Generic/B or sacrifice a creature or enchantment. +A:SP$ Destroy | Cost$ W B | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Destroy target creature. +Oracle:As an additional cost to cast this spell, pay 5 life or sacrifice a creature or enchantment.\nDestroy target creature. diff --git a/forge-gui/res/cardsfolder/broken/fireblade_artist.txt b/forge-gui/res/cardsfolder/broken/fireblade_artist.txt new file mode 100644 index 00000000000..ba8a5ce6505 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/fireblade_artist.txt @@ -0,0 +1,9 @@ +Name:Fireblade Artist +ManaCost:B R +Types:Creature Human Shaman +PT:2/2 +K:Haste +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSacrifice | TriggerDescription$ At the beginning of your upkeep, you may sacrifice a creature. When you do, CARDNAME deals 2 damage to target opponent or planeswalker. +SVar:TrigSacrifice:DB$ Sacrifice | Optional$ True | SacValid$ Creature | Amount$ 1 | AILogic$ CARDNAME +SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Opponent,Planeswalker | TgtPrompt$ Select target opponent or planeswalker | NumDmg$ 2 +Oracle:Haste\nAt the beginning of your upkeep, you may sacrifice a creature. When you do, Fireblade Artist deals 2 damage to target opponent or planeswalker. diff --git a/forge-gui/res/cardsfolder/broken/flames_of_the_raze_boar.txt b/forge-gui/res/cardsfolder/broken/flames_of_the_raze_boar.txt new file mode 100644 index 00000000000..b34007dee23 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/flames_of_the_raze_boar.txt @@ -0,0 +1,7 @@ +Name:Flames of the Raze-Boar +ManaCost:5 R +Types:Instant +A:SP$ DealDamage | Cost$ 5 R | NumDmg$ 4 | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | SubAbility$ DBDealDamage | SpellDescription$ CARDNAME deals 4 damage to target creature an opponent controls. Then CARDNAME deals 2 damage to each other creature that player controls if you control a creature with power 4 or greater. +SVar:DBDealDamage:DB$ DamageAll | NumDmg$ 2 | ValidCards$ Creature.attacking+YouCtrl+powerGE4 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +Oracle:Flames of the Raze-Boar deals 4 damage to target creature an opponent controls. Then Flames of the Raze-Boar deals 2 damage to each other creature that player controls if you control a creature with power 4 or greater. diff --git a/forge-gui/res/cardsfolder/broken/galloping_lizrog.txt b/forge-gui/res/cardsfolder/broken/galloping_lizrog.txt new file mode 100644 index 00000000000..091d1b1d104 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/galloping_lizrog.txt @@ -0,0 +1,10 @@ +Name:Galloping Lizrog +ManaCost:3 G U +Types:Creature Frog Lizard +PT:3/3 +K:Trample +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, you may remove any number of +1/+1 counters from among creatures you control. If you do, put twice that many +1/+1 counters on CARDNAME. +SVar:TrigPutCounter:AB$ PutCounter | Cost$ SubCounter | CounterType$ P1P1 | CounterNum$ X | References$ X | SubAbility$ DBClearXChoice +SVar:DBClearXChoice:DB$ StoreSVar | SVar$ Y | Type$ Number | Expression$ Y | References$ Y +SVar: +Oracle:Trample\nWhen Galloping Lizrog enters the battlefield, you may remove any number of +1/+1 counters from among creatures you control. If you do, put twice that many +1/+1 counters on Galloping Lizrog. diff --git a/forge-gui/res/cardsfolder/broken/guardian_project.txt b/forge-gui/res/cardsfolder/broken/guardian_project.txt new file mode 100644 index 00000000000..ea2c3d77329 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/guardian_project.txt @@ -0,0 +1,6 @@ +Name:Guardian Project +ManaCost:3 G +Types:Enchantment +T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+YouCtrl | Origin$ Any | Destination$ Battlefield | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, if that creature does not have the same name as another creature you control or a creature card in your graveyard, draw a card. +SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 +Oracle:Whenever a nontoken creature enters the battlefield under your control, if that creature does not have the same name as another creature you control or a creature card in your graveyard, draw a card. diff --git a/forge-gui/res/cardsfolder/broken/gutterbones.txt b/forge-gui/res/cardsfolder/broken/gutterbones.txt new file mode 100644 index 00000000000..89207d77bf6 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/gutterbones.txt @@ -0,0 +1,9 @@ +Name:Gutterbones +ManaCost:B +Types:Creature Skeleton Warrior +PT:2/1 +K:CARDNAME enters the battlefield tapped. +A:AB$ ChangeZone | Cost$ 1 B | Origin$ Graveyard | Destination$ Hand | ActivationZone$ Graveyard | OpponentTurn$ True | SubAbility$ DBEffect | SpellDescription$ Return CARDNAME from your graveyard to your hand. Activate this ability only during your turn and only if an opponent lost life this turn. +SVar:DBEffect:DB$ Effect | CheckSVar$ X | SVarCompare$ GE1 | References$ X | StaticAbilities$ MustAttack | SubAbility$ DBCleanup +SVar:RPrevent:Mode$ Continuous | EffectZone$ Command | Affected$ You | AddKeyword$ You only during your turn and only if an opponent lost life this turn. | Description$ Activate this ability only during your turn and only if an opponent +Oracle:Gutterbones enters the battlefield tapped.\n{1}{B}: Return Gutterbones from your graveyard to your hand. Activate this ability only during your turn and only if an opponent lost life this turn. diff --git a/forge-gui/res/cardsfolder/broken/incubation_druid.txt b/forge-gui/res/cardsfolder/broken/incubation_druid.txt new file mode 100644 index 00000000000..37bc252bc28 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/incubation_druid.txt @@ -0,0 +1,10 @@ +Name:Incubation Druid +ManaCost:1 G +Types:Creature Elf Druid +PT:0/2 +A:AB$ ManaReflected | Cost$ T | ColorOrType$ Type | Valid$ Land.YouCtrl | ReflectProperty$ Produce | SubAbility$ DBManaU | SpellDescription$ Add one mana of any type that a land you control could produce. If CARDNAME has a +1/+1 counter on it, add three mana of that type instead. +SVar:DBManaU:DB$ Mana | Produced$ Combo Card.Self | ConditionDefined$ Remembered | ConditionPresent$ Card.Self | SubAbility$ DBManaB +SVar:DBManaB:DB$ Mana | Produced$ G | Amount$ X | Permanent$ True | References$ X | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup +A:AB$ PutCounter | Cost$ 3 G G | Defined$ Self | CounterType$ P1P1 | CounterNum$3 | SpellDescription$ As CARDNAME, support 3. (If this creature has no +1/+1 counters on it, put three +1/+1 counters on it.) +DeckHas:Ability$Counters +Oracle:{T}: Add one mana of any type that a land you control could produce. If Incubation Druid has a +1/+1 counter on it, add three mana of that type instead.\n{3}{G}{G}: Adapt 3. (If this creature has no +1/+1 counters on it, put three +1/+1 counters on it.) diff --git a/forge-gui/res/cardsfolder/broken/incubation_incongruity.txt b/forge-gui/res/cardsfolder/broken/incubation_incongruity.txt new file mode 100644 index 00000000000..d1c92429ac8 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/incubation_incongruity.txt @@ -0,0 +1,4 @@ +Name:Incubation // Incongruity +ManaCost:G/U // 1 G U +Types:Sorcery // Instant +Oracle:null diff --git a/forge-gui/res/cardsfolder/broken/kaya_orzhov_usurper.txt b/forge-gui/res/cardsfolder/broken/kaya_orzhov_usurper.txt new file mode 100644 index 00000000000..0c62c60ff2b --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/kaya_orzhov_usurper.txt @@ -0,0 +1,15 @@ +Name:Kaya, Orzhov Usurper +ManaCost:1 W B +Types:Legendary Planeswalker Kaya +Loyalty:3 +A:AB$ ChangeZone | Cost$ AddCounter<1/LOYALTY> | Origin$ Graveyard | Destination$ Exile | TargetMin$ 0 | TargetMax$ 2 | TargetsFromSingleZone$ True | ValidTgts$ Card | TgtPrompt$ Select target card from a graveyard | Planeswalker$ True | SubAbility$ DBGainLife | SpellDescription$ Exile up to two target cards from a single graveyard. You gain 2 life if at least one creature card was exiled this way. +SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | References$ X | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Count$ValidExile +A:AB$ ChangeZone | Cost$ -1/-1/Card.nonLand/nonland permanent with converted mana cost 1 or less> | Origin$ Battlefield | Destination$ Exile | TgtPrompt$ Choose target nonland permanent with converted mana cost 1 or less | ValidTgts$ Permanent.nonLand+cmcLE1 | SpellDescription$ Exile target nonland permanent with converted mana cost 1 or less. +A:AB$ DealDamage | Cost$ PayLife<5/-5/Card> | ValidTgts$ Player | NumDmg$ X | References$ X | SubAbility$ DBYouGainLife | SpellDescription$ CARDNAME deals damage to target player equal to the number of cards that player owns in exile and you gain that much life. +SVar:TrigGain:DB$ GainLife | Defined$ You | LifeAmount$ Y | References$ Y +SVar:X:TargetedPlayer$CardsInLibrary +SVar:Y:PlayerCountRemembered$CardsInHand +SVar:NonStackingEffect:True +Oracle:[+1]: Exile up to two target cards from a single graveyard. You gain 2 life if at least one creature card was exiled this way.\n[-1]: Exile target nonland permanent with converted mana cost 1 or less.\n[-5]: Kaya, Orzhov Usurper deals damage to target player equal to the number of cards that player owns in exile and you gain that much life. diff --git a/forge-gui/res/cardsfolder/broken/kayas_wrath.txt b/forge-gui/res/cardsfolder/broken/kayas_wrath.txt new file mode 100644 index 00000000000..2a411a0bf18 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/kayas_wrath.txt @@ -0,0 +1,7 @@ +Name:Kaya's Wrath +ManaCost:W W B B +Types:Sorcery +A:SP$ DestroyAll | Cost$ W W B B | ValidCards$ Creature | RememberDestroyed$ True | SubAbility$ DBGainLife | SpellDescription$ Destroy all creatures. You gain life equal to the number of creatures you controlled that were destroyed this way. +SVar:DBGainLife:DB$ GainLife | LifeAmount$ X | References$ X +SVar:X:RememberedLKI$FilterControlledByRemembered_Number$1 +Oracle:Destroy all creatures. You gain life equal to the number of creatures you controlled that were destroyed this way. diff --git a/forge-gui/res/cardsfolder/broken/lavinia_azorius_renegade.txt b/forge-gui/res/cardsfolder/broken/lavinia_azorius_renegade.txt new file mode 100644 index 00000000000..fa4f9000374 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/lavinia_azorius_renegade.txt @@ -0,0 +1,10 @@ +Name:Lavinia, Azorius Renegade +ManaCost:W U +Types:Legendary Creature Human Soldier +PT:2/2 +S:Mode$ CantBeCast | ValidCard$ Card.nonCreature+nonLand | Caster$ Opponent | Description$ Each opponent can't cast noncreature spells with converted mana cost greater than the number of lands that player controls. +SVar:RemRandomDeck:True +T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigCounter | ManaSpent$ EQ0 | TriggerDescription$ Whenever an opponent casts a spell, if no mana was spent to cast it, counter that spell. +SVar:TrigCounter:DB$ Counter | Defined$ TriggeredSpellAbility +SVar:RemRandomDeck:True +Oracle:Each opponent can't cast noncreature spells with converted mana cost greater than the number of lands that player controls.\nWhenever an opponent casts a spell, if no mana was spent to cast it, counter that spell. diff --git a/forge-gui/res/cardsfolder/broken/light_up_the_stage.txt b/forge-gui/res/cardsfolder/broken/light_up_the_stage.txt new file mode 100644 index 00000000000..17c93ebeb28 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/light_up_the_stage.txt @@ -0,0 +1,11 @@ +Name:Light Up the Stage +ManaCost:2 R +Types:Sorcery +K:Defender +K:First Strike +A:SP$ Mill | Cost$ 2 R | Defined$ You | NumCards$ 2 | Destination$ Exile | RememberMilled$ True | SubAbility$ DBStoreTurn | SpellDescription$ Exile the top two cards of your library. Until the end of your next turn, you may play those cards. +SVar:DBStoreTurn:DB$ StoreSVar | SVar$ CurrentTurn | Type$ Count | Expression$ YourTurns | SubAbility$ DBMayBePlay +SVar:DBMayBePlay:DB$ Effect | StaticAbilities$ STCommuned | Duration$ Permanent | RememberObjects$ Remembered | Triggers$ TrigDuration | SVars$ DBDuration,EndDuration,CurrentTurn | SubAbility$ DBCleanup | ExileOnMoved$ Exile +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:STCommuned +Oracle:Spectacle {R} (You may cast this spell for its spectacle cost rather than its mana cost if an opponent lost life this turn.)\nExile the top two cards of your library. Until the end of your next turn, you may play those cards. diff --git a/forge-gui/res/cardsfolder/broken/lumbering_battlement.txt b/forge-gui/res/cardsfolder/broken/lumbering_battlement.txt new file mode 100644 index 00000000000..0838ca63c67 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/lumbering_battlement.txt @@ -0,0 +1,13 @@ +Name:Lumbering Battlement +ManaCost:4 W +Types:Creature Beast +PT:4/5 +K:Vigilance +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile any number of other nontoken creatures you control until it leaves the battlefield. +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | ChangeType$ Creature.nonToken+Other+YouCtrl | TargetMin$ 0 | TargetMax$ X | References$ X | Mandatory$ True | SubAbility$ DBEffect +SVar:DBEffect:DB$ Effect | Triggers$ ComeBack | RememberObjects$ Remembered | ImprintCards$ Remembered | SVars$ TrigReturn,ExileSelf | ConditionPresent$ Card.IsRemembered | ConditionCompare$ GE1 +SVar: +S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | AddToughness$ X | References$ X | Description$ CARDNAME gets +2/+2 for each card exiled with it. +SVar:X:Count$Valid Card.IsRemembered+namedCARDNAME/Times.2 +SVar:RemRandomDeck:True +Oracle:Vigilance\nWhen Lumbering Battlement enters the battlefield, exile any number of other nontoken creatures you control until it leaves the battlefield.\nLumbering Battlement gets +2/+2 for each card exiled with it. diff --git a/forge-gui/res/cardsfolder/broken/mesmerizing_benthid.txt b/forge-gui/res/cardsfolder/broken/mesmerizing_benthid.txt new file mode 100644 index 00000000000..7187cc3021e --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/mesmerizing_benthid.txt @@ -0,0 +1,12 @@ +Name:Mesmerizing Benthid +ManaCost:3 U U +Types:Creature Octopus +PT:4/5 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create two 0/2 blue Illusion creature tokens with flying, it doesn't untap during its controller's next untap step. +SVar:TrigToken:DB$ Token | TokenAmount$ 2 | TokenName$ Illusion | TokenTypes$ Creature,Illusion | TokenOwner$ You | TokenColors$ Blue | TokenPower$ 0 | TokenToughness$ 2 | TokenKeywords$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:PlayMain1:TRUE +SVar:RemRandomDeck:True +S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Hexproof | CheckSVar$ X | SVarCompare$ GE1 | Description$ CARDNAME has hexproof as long as you control an Illusion. +SVar:X:Count$Valid Illusion.YouCtrl +SVar:BuffedBy:Illusion +Oracle:When Mesmerizing Benthid enters the battlefield, create two 0/2 blue Illusion creature tokens with "Whenever this creature blocks a creature, that creature doesn't untap during its controller's next untap step."\nMesmerizing Benthid has hexproof as long as you control an Illusion. diff --git a/forge-gui/res/cardsfolder/broken/mirror_march.txt b/forge-gui/res/cardsfolder/broken/mirror_march.txt new file mode 100644 index 00000000000..d1e5de85677 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/mirror_march.txt @@ -0,0 +1,8 @@ +Name:Mirror March +ManaCost:5 R +Types:Enchantment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonToken+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigFlipACoin | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, flip a coin until you lose a flip. For each flip you won, create a token that's a copy of that creature. Those tokens gain haste. Exile them at the beginning of the next end step. +SVar:TrigFlipACoin:DB$FlipACoin | FlipUntilYouLose$ True | SaveNumFlipsToSVar$ SneakAttackEOT | LoseSubAbility$ SneakAttackEOT +SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True +SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True +Oracle:Whenever a nontoken creature enters the battlefield under your control, flip a coin until you lose a flip. For each flip you won, create a token that's a copy of that creature. Those tokens gain haste. Exile them at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/broken/precognitive_perception.txt b/forge-gui/res/cardsfolder/broken/precognitive_perception.txt new file mode 100644 index 00000000000..2bd4cc8757a --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/precognitive_perception.txt @@ -0,0 +1,6 @@ +Name:Precognitive Perception +ManaCost:3 U U +Types:Instant +A:SP$ Scry | Cost$ 3 U U | NumCards$ 3 | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SubAbility$ DBDraw | SpellDescription$ Draw three cards.\nAddendum — If you cast this spell during your main phase, instead scry 3, then draw three cards. +SVar:DBDraw:DB$ Draw | Cost$ 3 U U | NumCards$ 3 +Oracle:Draw three cards.\nAddendum — If you cast this spell during your main phase, instead scry 3, then draw three cards. diff --git a/forge-gui/res/cardsfolder/broken/priest_of_forgotten_gods.txt b/forge-gui/res/cardsfolder/broken/priest_of_forgotten_gods.txt new file mode 100644 index 00000000000..15e7b0f1241 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/priest_of_forgotten_gods.txt @@ -0,0 +1,10 @@ +Name:Priest of Forgotten Gods +ManaCost:1 B +Types:Creature Human Cleric +PT:1/2 +A:AB$ LoseLife | Cost$ T Sac<2/Creature.Other/other creatures> | ValidTgts$ Player | TgtPrompt$ Select target player | TargetMin$ 0 | TargetMax$ MaxTgt | References$ MaxTgt | LifeAmount$ 2 | SubAbility$ DBSac | SpellDescription$ Any number of target players each lose 2 life and sacrifice a creature. You add {B}{B} and draw a card. +SVar:MaxTgts:PlayerCountPlayers$Amount +SVar:DBSac:DB$ Sacrifice | SacValid$ Creature | Defined$ Targeted | Amount$ 1 | SubAbility$ DBMana +SVar:DBMana:DB$ Mana | Produced$ B | Amount$ 2 | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw | NumCards$ 1 +Oracle:{T}, Sacrifice two other creatures: Any number of target players each lose 2 life and sacrifice a creature. You add {B}{B} and draw a card. diff --git a/forge-gui/res/cardsfolder/broken/rakdos_the_showstopper.txt b/forge-gui/res/cardsfolder/broken/rakdos_the_showstopper.txt new file mode 100644 index 00000000000..9fa6b78a92b --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/rakdos_the_showstopper.txt @@ -0,0 +1,11 @@ +Name:Rakdos, the Showstopper +ManaCost:4 B R +Types:Legendary Creature Demon +PT:6/6 +K:Flying +K:Trample +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFlip | TriggerDescription$ When CARDNAME enters the battlefield, flip a coin for each creature that isn't a Demon, Dragons, or coins. Destroy each creature whose coin comes up tails. +SVar:TrigFlip:DB$ FlipACoin | FlipUntilYouLose$ True | SaveNumFlipsToSVar$ X | LoseSubAbility$ DBDestroy +SVar:DBDestroy:DB$ DestroyAll | ValidCards$ Creature.IsNotChosenType | References$ X +SVar:X:Count$Valid Creature.isn +Oracle:Flying, trample\nWhen Rakdos, the Showstopper enters the battlefield, flip a coin for each creature that isn't a Demon, Devil, or Imp. Destroy each creature whose coin comes up tails. diff --git a/forge-gui/res/cardsfolder/broken/repudiate_replicate.txt b/forge-gui/res/cardsfolder/broken/repudiate_replicate.txt new file mode 100644 index 00000000000..03082084db7 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/repudiate_replicate.txt @@ -0,0 +1,4 @@ +Name:Repudiate // Replicate +ManaCost:G/U G/U // 1 G U +Types:Instant // Sorcery +Oracle:null diff --git a/forge-gui/res/cardsfolder/broken/revival_revenge.txt b/forge-gui/res/cardsfolder/broken/revival_revenge.txt new file mode 100644 index 00000000000..23a83229738 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/revival_revenge.txt @@ -0,0 +1,4 @@ +Name:Revival // Revenge +ManaCost:W/B W/B // 4 W B +Types:Sorcery // Sorcery +Oracle:null diff --git a/forge-gui/res/cardsfolder/broken/rix_maadi_reveler.txt b/forge-gui/res/cardsfolder/broken/rix_maadi_reveler.txt new file mode 100644 index 00000000000..7af42a6556d --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/rix_maadi_reveler.txt @@ -0,0 +1,12 @@ +Name:Rix Maadi Reveler +ManaCost:1 R +Types:Creature Human Shaman +PT:2/2 +K:Flying +K:Morph:2 B R +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, discard a card, then draw a card. If CARDNAME's Goblin cost was paid, instead discard your hand, then draw three cards. +SVar:TrigDiscard:DB$ Discard | NumCards$ 1 | Mode$ TgtChoose | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 3 | SubAbility$ DBDiscard +SVar:DBDiscard:DB$ Discard | Mode$ Hand | Defined$ You | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ1 | References$ X | SubAbility$ DBDraw +SVar:DBDraw +Oracle:Spectacle {2}{B}{R} (You may cast this spell for its spectacle cost rather than its mana cost if an opponent lost life this turn.)\nWhen Rix Maadi Reveler enters the battlefield, discard a card, then draw a card. If Rix Maadi Reveler's spectacle cost was paid, instead discard your hand, then draw three cards. diff --git a/forge-gui/res/cardsfolder/broken/rumbling_ruin.txt b/forge-gui/res/cardsfolder/broken/rumbling_ruin.txt new file mode 100644 index 00000000000..1b5afe60ff8 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/rumbling_ruin.txt @@ -0,0 +1,8 @@ +Name:Rumbling Ruin +ManaCost:5 R +Types:Creature Elemental +PT:6/6 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigEffect | TriggerDescription$ When CARDNAME enters the battlefield, your number of +1/+1 counters on creatures you control. Creatures your opponents control with power less than or equal to that number can't block this turn. +SVar:TrigEffect:DB$Effect | Name$ CARDNAME Effect | StaticAbilities$ KWPump +SVar:KWPump:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl+powerLTY | AddHiddenKeyword$ CARDNAME can't block. | Description$ Creatures your opponents control with power less than or equal to that number can't block this turn. +Oracle:When Rumbling Ruin enters the battlefield, count the number of +1/+1 counters on creatures you control. Creatures your opponents control with power less than or equal to that number can't block this turn. diff --git a/forge-gui/res/cardsfolder/broken/sentinels_mark.txt b/forge-gui/res/cardsfolder/broken/sentinels_mark.txt new file mode 100644 index 00000000000..0ab076fe3b1 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/sentinels_mark.txt @@ -0,0 +1,10 @@ +Name:Sentinel's Mark +ManaCost:1 W +Types:Enchantment Aura +K:Flash +K:Enchant creature +A:SP$ Attach | Cost$ 1 W | ValidTgts$ Creature | AILogic$ Pump +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 2 | AddKeyword$ Vigilance | Description$ Enchanted creature gets +1/+2 and has vigilance. +T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigPump | Condition$ Main1 | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it during your main phase, enchanted creature gains lifelink until end of turn. +SVar:TrigPump:DB$ Pump | Defined$ Enchanted | KW$ +Oracle:Flash\nEnchant creature\nEnchanted creature gets +1/+2 and has vigilance.\nAddendum — When Sentinel's Mark enters the battlefield, if you cast it during your main phase, enchanted creature gains lifelink until end of turn. diff --git a/forge-gui/res/cardsfolder/broken/smothering_tithe.txt b/forge-gui/res/cardsfolder/broken/smothering_tithe.txt new file mode 100644 index 00000000000..9f9e33bcdc1 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/smothering_tithe.txt @@ -0,0 +1,7 @@ +Name:Smothering Tithe +ManaCost:3 W +Types:Enchantment +T:Mode$ Drawn | ValidCard$ Card.OppOwn | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever an opponent draws a card, that player may pay {2}. If the player doesn't, you create a colorless Treasure artifact token with flying{T}, Sacrifice this artifact: Add one mana of any color. +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenName$ Treasure | TokenTypes$ Artifact,Treasure | TokenOwner$ TriggeredPlayer | TokenColors$ Colorless | TokenImage$ c treasure | TokenAbilities$ ABTreasureMana | TokenAltImages$ c_treasure2,c_treasure3,c_treasure4 +SVar:ABTreasureMana:DB$ Token | TokenAmount$ 1 | TokenName$ +Oracle:Whenever an opponent draws a card, that player may pay {2}. If the player doesn't, you create a colorless Treasure artifact token with "{T}, Sacrifice this artifact: Add one mana of any color." diff --git a/forge-gui/res/cardsfolder/broken/spikewheel_acrobat.txt b/forge-gui/res/cardsfolder/broken/spikewheel_acrobat.txt new file mode 100644 index 00000000000..cd10ceb4033 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/spikewheel_acrobat.txt @@ -0,0 +1,6 @@ +Name:Spikewheel Acrobat +ManaCost:3 R +Types:Creature Human Rogue +PT:5/2 +K:Spectacle:2 R +Oracle:Spectacle {2}{R} (You may cast this spell for its spectacle cost rather than its mana cost if an opponent lost life this turn.) diff --git a/forge-gui/res/cardsfolder/broken/swirling_torrent.txt b/forge-gui/res/cardsfolder/broken/swirling_torrent.txt new file mode 100644 index 00000000000..21f7cf795bc --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/swirling_torrent.txt @@ -0,0 +1,7 @@ +Name:Swirling Torrent +ManaCost:5 U +Types:Sorcery +A:SP$ Charm | Cost$ 5 U | MinCharmNum$ 1 | CharmNum$ 2 | Choices$ DBSubmerge,DBUnsummon +SVar:DBSubmerge:DB$ ChangeZone | ValidTgts$ Creature | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SpellDescription$ Put target attacking or blocking creature on top of its owner's library. +SVar:DBUnsummon:DB$ ChangeZone | ValidTgts$ Creature | Origin$ Battlefield | Destination$ Hand +Oracle:Choose one or both —\n• Put target creature on top of its owner's library.\n• Return target creature to its owner's hand. diff --git a/forge-gui/res/cardsfolder/broken/theater_of_horrors.txt b/forge-gui/res/cardsfolder/broken/theater_of_horrors.txt new file mode 100644 index 00000000000..363d69c0f44 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/theater_of_horrors.txt @@ -0,0 +1,10 @@ +Name:Theater of Horrors +ManaCost:1 B R +Types:Enchantment +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigKyrenExile | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, exile the top card of your library. +SVar:TrigMill:DB$ Mill | Defined$ You | Destination$ Exile | NumCards$ 1 +S:Mode$ Continuous | Affected$ Card.IsRemembered | MayPlay$ True | Condition$ PlayerTurn | EffectZone$ Battlefield | CheckSVar$ Play | Description$ During your turn, if an opponent lost life this turn, you may play cards exiled with CARDNAME. +SVar:TrigCleanup:Mode$ SpellCast | ValidCard$ Card.IsRemembered | Execute$ DBDuration | Static$ True +SVar:DBDuration +A:AB$ DealDamage | Cost$ 1 B R | ValidTgts$ Opponent,Planeswalker | TgtPrompt$ Select target opponent or planeswalker | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target opponent or planeswalker. +Oracle:At the beginning of your upkeep, exile the top card of your library.\nDuring your turn, if an opponent lost life this turn, you may play cards exiled with Theater of Horrors.\n{3}{R}: Theater of Horrors deals 1 damage to target opponent or planeswalker. diff --git a/forge-gui/res/cardsfolder/broken/thrash_threat.txt b/forge-gui/res/cardsfolder/broken/thrash_threat.txt new file mode 100644 index 00000000000..05ffddf5df8 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/thrash_threat.txt @@ -0,0 +1,4 @@ +Name:Thrash // Threat +ManaCost:R/G R/G // 2 R G +Types:Instant // Sorcery +Oracle:null diff --git a/forge-gui/res/cardsfolder/broken/unbreakable_formation.txt b/forge-gui/res/cardsfolder/broken/unbreakable_formation.txt new file mode 100644 index 00000000000..3b8d515b6ad --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/unbreakable_formation.txt @@ -0,0 +1,7 @@ +Name:Unbreakable Formation +ManaCost:2 W +Types:Instant +A:SP$ PumpAll | Cost$ 2 W | ValidCards$ Creature.YouCtrl | KW$ Indestructible | SpellDescription$ Creatures you control gain indestructible until end of turn. +K:Defender +K:If you cast this spell during your main phase, put a +1/+1 counter on each of those creatures, and they also gain vigilance until end of turn. +Oracle:Creatures you control gain indestructible until end of turn.\nAddendum — If you cast this spell during your main phase, put a +1/+1 counter on each of those creatures, and they also gain vigilance until end of turn. diff --git a/forge-gui/res/cardsfolder/broken/warrant_warden.txt b/forge-gui/res/cardsfolder/broken/warrant_warden.txt new file mode 100644 index 00000000000..9a0c8d19e7f --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/warrant_warden.txt @@ -0,0 +1,4 @@ +Name:Warrant // Warden +ManaCost:W/U W/U // 3 W U +Types:Instant // Sorcery +Oracle:null From 50e6a0647883056073cc2b965040856a1d7e9996 Mon Sep 17 00:00:00 2001 From: Chris H Date: Sat, 19 Jan 2019 20:48:07 -0500 Subject: [PATCH 640/901] Fix split cards --- .../cardsfolder/broken/bedeck_bedazzle.txt | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/cardsfolder/broken/bedeck_bedazzle.txt b/forge-gui/res/cardsfolder/broken/bedeck_bedazzle.txt index b4a3be44f39..ec4f0716005 100644 --- a/forge-gui/res/cardsfolder/broken/bedeck_bedazzle.txt +++ b/forge-gui/res/cardsfolder/broken/bedeck_bedazzle.txt @@ -1,4 +1,15 @@ -Name:Bedeck // Bedazzle -ManaCost:B/R B/R // 4 B R -Types:Instant // Instant -Oracle:null +Name:Bedeck +ManaCost:BR BR +AlternateMode: Split +Types:Instant +A:SP$ Pump | Cost$ BR BR | ValidTgts$ Creature | NumAtt$ +3 | NumDef$ -3 | IsCurse$ True | SpellDescription$ Target creature gets +3/-3 until end of turn. +Oracle:Target creature gets +3/-3 until end of turn. + +ALTERNATE + +Name:Bedazzle +ManaCost:4 B R +Types:Instant +A:SP$ Destroy | Cost$ 4 B R | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target nonbasic land. | SubAbility$ DBDamage | SpellDescription$ Destroy target nonbasic land. CARDNAME deals 2 damage to target opponent or planeswalker. +SVar:DBDamage:DB$ Damage | ValidTgts$ Opponent,Planeswalker | TgtPrompt$ Select target opponent or planeswalker | NumDmg$ 2 +Oracle:Destroy target nonbasic land. Bedazzle deals 2 damage to target opponent or planeswalker. From f09130eb860ba414c46cb63d98cc550cfa2f97a4 Mon Sep 17 00:00:00 2001 From: Chris H Date: Sat, 19 Jan 2019 21:15:55 -0500 Subject: [PATCH 641/901] Carnival Carnage --- .../cardsfolder/broken/carnival_carnage.txt | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/cardsfolder/broken/carnival_carnage.txt b/forge-gui/res/cardsfolder/broken/carnival_carnage.txt index f234720489c..ff4c52ed297 100644 --- a/forge-gui/res/cardsfolder/broken/carnival_carnage.txt +++ b/forge-gui/res/cardsfolder/broken/carnival_carnage.txt @@ -1,4 +1,16 @@ -Name:Carnival // Carnage -ManaCost:B/R // 2 B R -Types:Instant // Sorcery -Oracle:null +Name:Carnival +ManaCost:BR +AlternateMode: Split +Types:Instant +A:SP$ DealDamage | Cost$ BR BR | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker | NumDmg$ 1 | SubAbility$ DBDealDamage | SpellDescription$ CARDNAME deals 1 damage to target creature or planeswalker and 1 damage to that permanent’s controller. +SVar:DBDealDamage:DB$ DealDamage | Defined$ TargetedController | NumDmg$ 1 +Oracle:Carnival deals 1 damage to target creature or planeswalker and 1 damage to that permanent’s controller. + +ALTERNATE + +Name:Carnage +ManaCost:2 B R +Types:Sorcery +A:SP$ DealDamage | Cost$ 2 B R | ValidTgts$ Player.Opponent | NumDmg$ 3 | SubAbility$ DBDiscard | SpellDescription$ CARDNAME deals 3 damage to target player. That player discards two cards. +SVar:DBDiscard:DB$Discard | Defined$ TargetedPlayer | NumCards$ 2 | Mode$ TgtChoose +Oracle:Carnage deals 3 damage to target opponent. That player discards two cards. From d7ebafe883e5a4cd1f46bb4397ac8c7a49527587 Mon Sep 17 00:00:00 2001 From: Chris H Date: Sat, 19 Jan 2019 21:27:54 -0500 Subject: [PATCH 642/901] Collision Colossus --- .../res/cardsfolder/broken/collision_colossus.txt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 forge-gui/res/cardsfolder/broken/collision_colossus.txt diff --git a/forge-gui/res/cardsfolder/broken/collision_colossus.txt b/forge-gui/res/cardsfolder/broken/collision_colossus.txt new file mode 100644 index 00000000000..6c230d2a7b6 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/collision_colossus.txt @@ -0,0 +1,14 @@ +Name:Collision +ManaCost:1 RG +AlternateMode: Split +Types:Instant +A:SP$ DealDamage | Cost$ 1 RG | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | NumDmg$ 6 | SpellDescription$ Collision deals 6 damage to target creature with flying. +Oracle:Collision deals 6 damage to target creature with flying. + +ALTERNATE + +Name:Colossus +ManaCost:R G +Types:Instant +A:SP$ Pump | Cost$ 1 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +4 | NumDef$ +2 | KW$ Trample | SpellDescription$ Target creature gets +3/+1 and gains trample until end of turn. +Oracle:Target creature gets +4/+2 and gains trample until end of turn. From d1d1df27bcb6db30ff432f61113372853f0b58fe Mon Sep 17 00:00:00 2001 From: Chris H Date: Sat, 19 Jan 2019 21:41:57 -0500 Subject: [PATCH 643/901] Consecrate Consume --- .../cardsfolder/broken/collision_colossus.txt | 2 +- .../cardsfolder/broken/consecrate_consume.txt | 22 +++++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/forge-gui/res/cardsfolder/broken/collision_colossus.txt b/forge-gui/res/cardsfolder/broken/collision_colossus.txt index 6c230d2a7b6..c91059e34cf 100644 --- a/forge-gui/res/cardsfolder/broken/collision_colossus.txt +++ b/forge-gui/res/cardsfolder/broken/collision_colossus.txt @@ -2,7 +2,7 @@ Name:Collision ManaCost:1 RG AlternateMode: Split Types:Instant -A:SP$ DealDamage | Cost$ 1 RG | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | NumDmg$ 6 | SpellDescription$ Collision deals 6 damage to target creature with flying. +A:SP$ DealDamage | Cost$ 1 RG | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | NumDmg$ 6 | SpellDescription$ CARDNAME deals 6 damage to target creature with flying. Oracle:Collision deals 6 damage to target creature with flying. ALTERNATE diff --git a/forge-gui/res/cardsfolder/broken/consecrate_consume.txt b/forge-gui/res/cardsfolder/broken/consecrate_consume.txt index b2280b114ba..23af8b27588 100644 --- a/forge-gui/res/cardsfolder/broken/consecrate_consume.txt +++ b/forge-gui/res/cardsfolder/broken/consecrate_consume.txt @@ -1,4 +1,18 @@ -Name:Consecrate // Consume -ManaCost:1 W/B // 2 W B -Types:Instant // Sorcery -Oracle:null +Name:Consecrate +ManaCost:1 WB +AlternateMode: Split +Types:Instant +A:SP$ ChangeZone | Cost$ 1 WB | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SpellDescription$ Exile target card from a graveyard. | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card. +Oracle:Exile target card from a graveyard.\nDraw a card. + +ALTERNATE + +Name:Consume +ManaCost:2 W B +Types:Sorcery +A:SP$ ChooseCard | ValidTgts$ Player | Choices$ Creature.greatestPowerControlledByRemembered | Mandatory$ True | SubAbility$ DBSac +SVar:DBSac:DB$ Sacrifice | Defined$ Targeted | SacValid$ Card.ChosenCard | RememberSacrificed$ True | SacMessage$ the creature with the highest power | SubAbility$ DBGainLife +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X +SVar:X:TargetedLKI$CardPower +Oracle:Target player sacrifices a creature with the greatest power among creatures they control. You gain life equal to its power. From b357096da25a4e07ef2e80a72d2b369e73265926 Mon Sep 17 00:00:00 2001 From: Chris H Date: Sat, 19 Jan 2019 21:52:22 -0500 Subject: [PATCH 644/901] Depost deploy --- .../res/cardsfolder/broken/depose_deploy.txt | 16 ++++++++++++++++ .../res/cardsfolder/broken/depose_depose.txt | 4 ---- .../res/tokenscripts/c_1_1_a_thopter_flying.txt | 6 ++++++ 3 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 forge-gui/res/cardsfolder/broken/depose_deploy.txt delete mode 100644 forge-gui/res/cardsfolder/broken/depose_depose.txt create mode 100644 forge-gui/res/tokenscripts/c_1_1_a_thopter_flying.txt diff --git a/forge-gui/res/cardsfolder/broken/depose_deploy.txt b/forge-gui/res/cardsfolder/broken/depose_deploy.txt new file mode 100644 index 00000000000..757f9106505 --- /dev/null +++ b/forge-gui/res/cardsfolder/broken/depose_deploy.txt @@ -0,0 +1,16 @@ +Name:Depose +ManaCost:1 W/U +Types:Instant +A:SP$ Tap | Cost$ 1 WU | ValidTgts$ Creature | SubAbility$ DBDraw | SpellDescription$ Tap target creature. Draw a card. +SVar:DBDraw:DB$ Draw | NumCards$ 1 +Oracle:Tap target creature. Draw a card. + +ALTERNATE + +Name:Deploy +ManaCost:2 W U +Types:Instant +A:SP$ Token | TokenAmount$ 2 | TokenOwner$ You | TokenScript$ c_1_1_a_thopter_flying | SubAbility$ DBGainLife | SpellDescription$ Create two 1/1 colorless Thopter artifact creature tokens with flying, then you gain 1 life for each creature you control. +SVar:DBGainLife:DB$ GainLife | LifeAmount$ X | References$ X +SVar:X:Count$TypeYouCtrl.Creature +Oracle:Create two 1/1 colorless Thopter artifact creature tokens with flying, then you gain 1 life for each creature you control. diff --git a/forge-gui/res/cardsfolder/broken/depose_depose.txt b/forge-gui/res/cardsfolder/broken/depose_depose.txt deleted file mode 100644 index fc47e8ce373..00000000000 --- a/forge-gui/res/cardsfolder/broken/depose_depose.txt +++ /dev/null @@ -1,4 +0,0 @@ -Name:Depose // Deploy -ManaCost:1 W/U // 2 W U -Types:Instant // Instant -Oracle:null diff --git a/forge-gui/res/tokenscripts/c_1_1_a_thopter_flying.txt b/forge-gui/res/tokenscripts/c_1_1_a_thopter_flying.txt new file mode 100644 index 00000000000..6a190f620e5 --- /dev/null +++ b/forge-gui/res/tokenscripts/c_1_1_a_thopter_flying.txt @@ -0,0 +1,6 @@ +Name:Thopter +ManaCost:no cost +Types:Artifact Creature Thopter +PT:1/1 +K:Flying +Oracle:Flying \ No newline at end of file From 28a5bd109ebfb48c116e131a5f1ab8ec42d48768 Mon Sep 17 00:00:00 2001 From: Chris H Date: Sat, 19 Jan 2019 21:58:21 -0500 Subject: [PATCH 645/901] Move broken to upcoming --- forge-gui/res/cardsfolder/broken/galloping_lizrog.txt | 10 ---------- .../res/cardsfolder/{broken => upcoming}/amplifire.txt | 0 .../{broken => upcoming}/angel_of_grace.txt | 0 .../{broken => upcoming}/applied_biomancy.txt | 0 .../{broken => upcoming}/awaken_the_erstwhile.txt | 0 .../{broken => upcoming}/bedeck_bedazzle.txt | 0 .../{broken => upcoming}/bloodmist_infiltrator.txt | 0 .../{broken => upcoming}/captive_audience.txt | 0 .../{broken => upcoming}/carnival_carnage.txt | 0 .../{broken => upcoming}/collision_colossus.txt | 0 .../{broken => upcoming}/consecrate_consume.txt | 0 .../{broken => upcoming}/cry_of_the_carnarium.txt | 0 .../res/cardsfolder/{broken => upcoming}/deface.txt | 0 .../cardsfolder/{broken => upcoming}/depose_deploy.txt | 0 .../{broken => upcoming}/deputy_of_detention.txt | 0 .../{broken => upcoming}/dovin_grand_arbiter.txt | 0 .../cardsfolder/{broken => upcoming}/dovins_acuity.txt | 0 .../cardsfolder/{broken => upcoming}/final_payment.txt | 0 .../{broken => upcoming}/fireblade_artist.txt | 0 .../{broken => upcoming}/flames_of_the_raze_boar.txt | 0 .../{broken => upcoming}/guardian_project.txt | 0 .../cardsfolder/{broken => upcoming}/gutterbones.txt | 0 .../{broken => upcoming}/incubation_druid.txt | 0 .../{broken => upcoming}/incubation_incongruity.txt | 0 .../{broken => upcoming}/kaya_orzhov_usurper.txt | 0 .../cardsfolder/{broken => upcoming}/kayas_wrath.txt | 0 .../{broken => upcoming}/lavinia_azorius_renegade.txt | 0 .../{broken => upcoming}/light_up_the_stage.txt | 0 .../{broken => upcoming}/lumbering_battlement.txt | 0 .../{broken => upcoming}/mesmerizing_benthid.txt | 0 .../cardsfolder/{broken => upcoming}/mirror_march.txt | 0 .../{broken => upcoming}/precognitive_perception.txt | 0 .../{broken => upcoming}/priest_of_forgotten_gods.txt | 0 .../{broken => upcoming}/rakdos_the_showstopper.txt | 0 .../{broken => upcoming}/repudiate_replicate.txt | 0 .../{broken => upcoming}/revival_revenge.txt | 0 .../{broken => upcoming}/rix_maadi_reveler.txt | 0 .../cardsfolder/{broken => upcoming}/rumbling_ruin.txt | 0 .../{broken => upcoming}/sentinels_mark.txt | 0 .../{broken => upcoming}/smothering_tithe.txt | 0 .../{broken => upcoming}/spikewheel_acrobat.txt | 0 .../{broken => upcoming}/swirling_torrent.txt | 0 .../{broken => upcoming}/theater_of_horrors.txt | 0 .../cardsfolder/{broken => upcoming}/thrash_threat.txt | 0 .../{broken => upcoming}/unbreakable_formation.txt | 0 .../{broken => upcoming}/warrant_warden.txt | 0 46 files changed, 10 deletions(-) delete mode 100644 forge-gui/res/cardsfolder/broken/galloping_lizrog.txt rename forge-gui/res/cardsfolder/{broken => upcoming}/amplifire.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/angel_of_grace.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/applied_biomancy.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/awaken_the_erstwhile.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/bedeck_bedazzle.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/bloodmist_infiltrator.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/captive_audience.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/carnival_carnage.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/collision_colossus.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/consecrate_consume.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/cry_of_the_carnarium.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/deface.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/depose_deploy.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/deputy_of_detention.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/dovin_grand_arbiter.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/dovins_acuity.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/final_payment.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/fireblade_artist.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/flames_of_the_raze_boar.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/guardian_project.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/gutterbones.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/incubation_druid.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/incubation_incongruity.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/kaya_orzhov_usurper.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/kayas_wrath.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/lavinia_azorius_renegade.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/light_up_the_stage.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/lumbering_battlement.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/mesmerizing_benthid.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/mirror_march.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/precognitive_perception.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/priest_of_forgotten_gods.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/rakdos_the_showstopper.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/repudiate_replicate.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/revival_revenge.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/rix_maadi_reveler.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/rumbling_ruin.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/sentinels_mark.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/smothering_tithe.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/spikewheel_acrobat.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/swirling_torrent.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/theater_of_horrors.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/thrash_threat.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/unbreakable_formation.txt (100%) rename forge-gui/res/cardsfolder/{broken => upcoming}/warrant_warden.txt (100%) diff --git a/forge-gui/res/cardsfolder/broken/galloping_lizrog.txt b/forge-gui/res/cardsfolder/broken/galloping_lizrog.txt deleted file mode 100644 index 091d1b1d104..00000000000 --- a/forge-gui/res/cardsfolder/broken/galloping_lizrog.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Galloping Lizrog -ManaCost:3 G U -Types:Creature Frog Lizard -PT:3/3 -K:Trample -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, you may remove any number of +1/+1 counters from among creatures you control. If you do, put twice that many +1/+1 counters on CARDNAME. -SVar:TrigPutCounter:AB$ PutCounter | Cost$ SubCounter | CounterType$ P1P1 | CounterNum$ X | References$ X | SubAbility$ DBClearXChoice -SVar:DBClearXChoice:DB$ StoreSVar | SVar$ Y | Type$ Number | Expression$ Y | References$ Y -SVar: -Oracle:Trample\nWhen Galloping Lizrog enters the battlefield, you may remove any number of +1/+1 counters from among creatures you control. If you do, put twice that many +1/+1 counters on Galloping Lizrog. diff --git a/forge-gui/res/cardsfolder/broken/amplifire.txt b/forge-gui/res/cardsfolder/upcoming/amplifire.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/amplifire.txt rename to forge-gui/res/cardsfolder/upcoming/amplifire.txt diff --git a/forge-gui/res/cardsfolder/broken/angel_of_grace.txt b/forge-gui/res/cardsfolder/upcoming/angel_of_grace.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/angel_of_grace.txt rename to forge-gui/res/cardsfolder/upcoming/angel_of_grace.txt diff --git a/forge-gui/res/cardsfolder/broken/applied_biomancy.txt b/forge-gui/res/cardsfolder/upcoming/applied_biomancy.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/applied_biomancy.txt rename to forge-gui/res/cardsfolder/upcoming/applied_biomancy.txt diff --git a/forge-gui/res/cardsfolder/broken/awaken_the_erstwhile.txt b/forge-gui/res/cardsfolder/upcoming/awaken_the_erstwhile.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/awaken_the_erstwhile.txt rename to forge-gui/res/cardsfolder/upcoming/awaken_the_erstwhile.txt diff --git a/forge-gui/res/cardsfolder/broken/bedeck_bedazzle.txt b/forge-gui/res/cardsfolder/upcoming/bedeck_bedazzle.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/bedeck_bedazzle.txt rename to forge-gui/res/cardsfolder/upcoming/bedeck_bedazzle.txt diff --git a/forge-gui/res/cardsfolder/broken/bloodmist_infiltrator.txt b/forge-gui/res/cardsfolder/upcoming/bloodmist_infiltrator.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/bloodmist_infiltrator.txt rename to forge-gui/res/cardsfolder/upcoming/bloodmist_infiltrator.txt diff --git a/forge-gui/res/cardsfolder/broken/captive_audience.txt b/forge-gui/res/cardsfolder/upcoming/captive_audience.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/captive_audience.txt rename to forge-gui/res/cardsfolder/upcoming/captive_audience.txt diff --git a/forge-gui/res/cardsfolder/broken/carnival_carnage.txt b/forge-gui/res/cardsfolder/upcoming/carnival_carnage.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/carnival_carnage.txt rename to forge-gui/res/cardsfolder/upcoming/carnival_carnage.txt diff --git a/forge-gui/res/cardsfolder/broken/collision_colossus.txt b/forge-gui/res/cardsfolder/upcoming/collision_colossus.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/collision_colossus.txt rename to forge-gui/res/cardsfolder/upcoming/collision_colossus.txt diff --git a/forge-gui/res/cardsfolder/broken/consecrate_consume.txt b/forge-gui/res/cardsfolder/upcoming/consecrate_consume.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/consecrate_consume.txt rename to forge-gui/res/cardsfolder/upcoming/consecrate_consume.txt diff --git a/forge-gui/res/cardsfolder/broken/cry_of_the_carnarium.txt b/forge-gui/res/cardsfolder/upcoming/cry_of_the_carnarium.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/cry_of_the_carnarium.txt rename to forge-gui/res/cardsfolder/upcoming/cry_of_the_carnarium.txt diff --git a/forge-gui/res/cardsfolder/broken/deface.txt b/forge-gui/res/cardsfolder/upcoming/deface.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/deface.txt rename to forge-gui/res/cardsfolder/upcoming/deface.txt diff --git a/forge-gui/res/cardsfolder/broken/depose_deploy.txt b/forge-gui/res/cardsfolder/upcoming/depose_deploy.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/depose_deploy.txt rename to forge-gui/res/cardsfolder/upcoming/depose_deploy.txt diff --git a/forge-gui/res/cardsfolder/broken/deputy_of_detention.txt b/forge-gui/res/cardsfolder/upcoming/deputy_of_detention.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/deputy_of_detention.txt rename to forge-gui/res/cardsfolder/upcoming/deputy_of_detention.txt diff --git a/forge-gui/res/cardsfolder/broken/dovin_grand_arbiter.txt b/forge-gui/res/cardsfolder/upcoming/dovin_grand_arbiter.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/dovin_grand_arbiter.txt rename to forge-gui/res/cardsfolder/upcoming/dovin_grand_arbiter.txt diff --git a/forge-gui/res/cardsfolder/broken/dovins_acuity.txt b/forge-gui/res/cardsfolder/upcoming/dovins_acuity.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/dovins_acuity.txt rename to forge-gui/res/cardsfolder/upcoming/dovins_acuity.txt diff --git a/forge-gui/res/cardsfolder/broken/final_payment.txt b/forge-gui/res/cardsfolder/upcoming/final_payment.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/final_payment.txt rename to forge-gui/res/cardsfolder/upcoming/final_payment.txt diff --git a/forge-gui/res/cardsfolder/broken/fireblade_artist.txt b/forge-gui/res/cardsfolder/upcoming/fireblade_artist.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/fireblade_artist.txt rename to forge-gui/res/cardsfolder/upcoming/fireblade_artist.txt diff --git a/forge-gui/res/cardsfolder/broken/flames_of_the_raze_boar.txt b/forge-gui/res/cardsfolder/upcoming/flames_of_the_raze_boar.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/flames_of_the_raze_boar.txt rename to forge-gui/res/cardsfolder/upcoming/flames_of_the_raze_boar.txt diff --git a/forge-gui/res/cardsfolder/broken/guardian_project.txt b/forge-gui/res/cardsfolder/upcoming/guardian_project.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/guardian_project.txt rename to forge-gui/res/cardsfolder/upcoming/guardian_project.txt diff --git a/forge-gui/res/cardsfolder/broken/gutterbones.txt b/forge-gui/res/cardsfolder/upcoming/gutterbones.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/gutterbones.txt rename to forge-gui/res/cardsfolder/upcoming/gutterbones.txt diff --git a/forge-gui/res/cardsfolder/broken/incubation_druid.txt b/forge-gui/res/cardsfolder/upcoming/incubation_druid.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/incubation_druid.txt rename to forge-gui/res/cardsfolder/upcoming/incubation_druid.txt diff --git a/forge-gui/res/cardsfolder/broken/incubation_incongruity.txt b/forge-gui/res/cardsfolder/upcoming/incubation_incongruity.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/incubation_incongruity.txt rename to forge-gui/res/cardsfolder/upcoming/incubation_incongruity.txt diff --git a/forge-gui/res/cardsfolder/broken/kaya_orzhov_usurper.txt b/forge-gui/res/cardsfolder/upcoming/kaya_orzhov_usurper.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/kaya_orzhov_usurper.txt rename to forge-gui/res/cardsfolder/upcoming/kaya_orzhov_usurper.txt diff --git a/forge-gui/res/cardsfolder/broken/kayas_wrath.txt b/forge-gui/res/cardsfolder/upcoming/kayas_wrath.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/kayas_wrath.txt rename to forge-gui/res/cardsfolder/upcoming/kayas_wrath.txt diff --git a/forge-gui/res/cardsfolder/broken/lavinia_azorius_renegade.txt b/forge-gui/res/cardsfolder/upcoming/lavinia_azorius_renegade.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/lavinia_azorius_renegade.txt rename to forge-gui/res/cardsfolder/upcoming/lavinia_azorius_renegade.txt diff --git a/forge-gui/res/cardsfolder/broken/light_up_the_stage.txt b/forge-gui/res/cardsfolder/upcoming/light_up_the_stage.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/light_up_the_stage.txt rename to forge-gui/res/cardsfolder/upcoming/light_up_the_stage.txt diff --git a/forge-gui/res/cardsfolder/broken/lumbering_battlement.txt b/forge-gui/res/cardsfolder/upcoming/lumbering_battlement.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/lumbering_battlement.txt rename to forge-gui/res/cardsfolder/upcoming/lumbering_battlement.txt diff --git a/forge-gui/res/cardsfolder/broken/mesmerizing_benthid.txt b/forge-gui/res/cardsfolder/upcoming/mesmerizing_benthid.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/mesmerizing_benthid.txt rename to forge-gui/res/cardsfolder/upcoming/mesmerizing_benthid.txt diff --git a/forge-gui/res/cardsfolder/broken/mirror_march.txt b/forge-gui/res/cardsfolder/upcoming/mirror_march.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/mirror_march.txt rename to forge-gui/res/cardsfolder/upcoming/mirror_march.txt diff --git a/forge-gui/res/cardsfolder/broken/precognitive_perception.txt b/forge-gui/res/cardsfolder/upcoming/precognitive_perception.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/precognitive_perception.txt rename to forge-gui/res/cardsfolder/upcoming/precognitive_perception.txt diff --git a/forge-gui/res/cardsfolder/broken/priest_of_forgotten_gods.txt b/forge-gui/res/cardsfolder/upcoming/priest_of_forgotten_gods.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/priest_of_forgotten_gods.txt rename to forge-gui/res/cardsfolder/upcoming/priest_of_forgotten_gods.txt diff --git a/forge-gui/res/cardsfolder/broken/rakdos_the_showstopper.txt b/forge-gui/res/cardsfolder/upcoming/rakdos_the_showstopper.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/rakdos_the_showstopper.txt rename to forge-gui/res/cardsfolder/upcoming/rakdos_the_showstopper.txt diff --git a/forge-gui/res/cardsfolder/broken/repudiate_replicate.txt b/forge-gui/res/cardsfolder/upcoming/repudiate_replicate.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/repudiate_replicate.txt rename to forge-gui/res/cardsfolder/upcoming/repudiate_replicate.txt diff --git a/forge-gui/res/cardsfolder/broken/revival_revenge.txt b/forge-gui/res/cardsfolder/upcoming/revival_revenge.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/revival_revenge.txt rename to forge-gui/res/cardsfolder/upcoming/revival_revenge.txt diff --git a/forge-gui/res/cardsfolder/broken/rix_maadi_reveler.txt b/forge-gui/res/cardsfolder/upcoming/rix_maadi_reveler.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/rix_maadi_reveler.txt rename to forge-gui/res/cardsfolder/upcoming/rix_maadi_reveler.txt diff --git a/forge-gui/res/cardsfolder/broken/rumbling_ruin.txt b/forge-gui/res/cardsfolder/upcoming/rumbling_ruin.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/rumbling_ruin.txt rename to forge-gui/res/cardsfolder/upcoming/rumbling_ruin.txt diff --git a/forge-gui/res/cardsfolder/broken/sentinels_mark.txt b/forge-gui/res/cardsfolder/upcoming/sentinels_mark.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/sentinels_mark.txt rename to forge-gui/res/cardsfolder/upcoming/sentinels_mark.txt diff --git a/forge-gui/res/cardsfolder/broken/smothering_tithe.txt b/forge-gui/res/cardsfolder/upcoming/smothering_tithe.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/smothering_tithe.txt rename to forge-gui/res/cardsfolder/upcoming/smothering_tithe.txt diff --git a/forge-gui/res/cardsfolder/broken/spikewheel_acrobat.txt b/forge-gui/res/cardsfolder/upcoming/spikewheel_acrobat.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/spikewheel_acrobat.txt rename to forge-gui/res/cardsfolder/upcoming/spikewheel_acrobat.txt diff --git a/forge-gui/res/cardsfolder/broken/swirling_torrent.txt b/forge-gui/res/cardsfolder/upcoming/swirling_torrent.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/swirling_torrent.txt rename to forge-gui/res/cardsfolder/upcoming/swirling_torrent.txt diff --git a/forge-gui/res/cardsfolder/broken/theater_of_horrors.txt b/forge-gui/res/cardsfolder/upcoming/theater_of_horrors.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/theater_of_horrors.txt rename to forge-gui/res/cardsfolder/upcoming/theater_of_horrors.txt diff --git a/forge-gui/res/cardsfolder/broken/thrash_threat.txt b/forge-gui/res/cardsfolder/upcoming/thrash_threat.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/thrash_threat.txt rename to forge-gui/res/cardsfolder/upcoming/thrash_threat.txt diff --git a/forge-gui/res/cardsfolder/broken/unbreakable_formation.txt b/forge-gui/res/cardsfolder/upcoming/unbreakable_formation.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/unbreakable_formation.txt rename to forge-gui/res/cardsfolder/upcoming/unbreakable_formation.txt diff --git a/forge-gui/res/cardsfolder/broken/warrant_warden.txt b/forge-gui/res/cardsfolder/upcoming/warrant_warden.txt similarity index 100% rename from forge-gui/res/cardsfolder/broken/warrant_warden.txt rename to forge-gui/res/cardsfolder/upcoming/warrant_warden.txt From 86abb0d1d50647b2e19a382231d72f9bf495728b Mon Sep 17 00:00:00 2001 From: Chris H Date: Sun, 20 Jan 2019 14:54:39 -0500 Subject: [PATCH 646/901] Fixing more broken RNA cards --- .../cardsfolder/upcoming/gatebreaker_ram.txt | 10 ++++++++++ .../cardsfolder/upcoming/warrant_warden.txt | 20 +++++++++++++++---- .../wu_4_4_sphinx_flying_vigilance.txt | 8 ++++++++ 3 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/gatebreaker_ram.txt create mode 100644 forge-gui/res/tokenscripts/wu_4_4_sphinx_flying_vigilance.txt diff --git a/forge-gui/res/cardsfolder/upcoming/gatebreaker_ram.txt b/forge-gui/res/cardsfolder/upcoming/gatebreaker_ram.txt new file mode 100644 index 00000000000..8b17c85df91 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/gatebreaker_ram.txt @@ -0,0 +1,10 @@ +Name:Gatebreaker Ram +ManaCost:2 G +Types:Creature Sheep +PT:2/2 +S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | AddToughness$ X | Description$ CARDNAME gets +1/+1 for each Gate you control. +S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Vigilance | AddKeyword$ Trample | CheckSVar$ X | SVarCompare$ GE2 | Description$ As long as you control two or more Gates, Gatebreaker Ram has vigilance and trample. +SVar:X:Count$Valid Land.Gate+YouCtrl +SVar:BuffedBy:Land.Gate +DeckNeeds:Type$Land.Gate +Oracle:Gatebreaker Ram gets +1/+1 for each Gate you control.\nAs long as you control two or more Gates, Gatebreaker Ram has vigilance and trample. diff --git a/forge-gui/res/cardsfolder/upcoming/warrant_warden.txt b/forge-gui/res/cardsfolder/upcoming/warrant_warden.txt index 9a0c8d19e7f..af5ae5d2e57 100644 --- a/forge-gui/res/cardsfolder/upcoming/warrant_warden.txt +++ b/forge-gui/res/cardsfolder/upcoming/warrant_warden.txt @@ -1,4 +1,16 @@ -Name:Warrant // Warden -ManaCost:W/U W/U // 3 W U -Types:Instant // Sorcery -Oracle:null +Name:Warrant +ManaCost:W/U W/U +Types:Instant +A:SP$ ChangeZone | Cost$ WU WU | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature. | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SpellDescription$ Put target attacking or blocking creature on top of its owner's library. +Oracle:Put target attacking or blocking creature on top of its owner's library. + +ALTERNATE + +Name:Warden +ManaCost:3 W U +Types:Sorcery +A:SP$ Token | Cost$ 3 W U | TokenAmount$ 1 | TokenOwner$ You | TokenScript$ wu_4_4_sphinx_flying_vigilance | SpellDescription$ Create a 4/4 white and blue Sphinx creature token with flying and vigilance. +SVar:X:Count$TypeYouCtrl.Creature/Times.2 +Oracle:Create a 4/4 white and blue Sphinx creature token with flying and vigilance. + + diff --git a/forge-gui/res/tokenscripts/wu_4_4_sphinx_flying_vigilance.txt b/forge-gui/res/tokenscripts/wu_4_4_sphinx_flying_vigilance.txt new file mode 100644 index 00000000000..fbf23263825 --- /dev/null +++ b/forge-gui/res/tokenscripts/wu_4_4_sphinx_flying_vigilance.txt @@ -0,0 +1,8 @@ +Name:Sphinx +ManaCost:no cost +Types:Creature Sphinx +Colors:white,blue +PT:4/4 +K:Flying +K:Vigilance +Oracle:Flying\nVigilance From a6e0f9b472f5df888150331e36919db914378178 Mon Sep 17 00:00:00 2001 From: Chris H Date: Sun, 20 Jan 2019 15:10:53 -0500 Subject: [PATCH 647/901] Warrant/Warden --- .../cardsfolder/upcoming/thrash_threat.txt | 19 +++++++++++++++---- .../cardsfolder/upcoming/warrant_warden.txt | 1 - .../res/tokenscripts/rg_4_4_beast_trample.txt | 7 +++++++ 3 files changed, 22 insertions(+), 5 deletions(-) create mode 100644 forge-gui/res/tokenscripts/rg_4_4_beast_trample.txt diff --git a/forge-gui/res/cardsfolder/upcoming/thrash_threat.txt b/forge-gui/res/cardsfolder/upcoming/thrash_threat.txt index 05ffddf5df8..bee5e0ea1cf 100644 --- a/forge-gui/res/cardsfolder/upcoming/thrash_threat.txt +++ b/forge-gui/res/cardsfolder/upcoming/thrash_threat.txt @@ -1,4 +1,15 @@ -Name:Thrash // Threat -ManaCost:R/G R/G // 2 R G -Types:Instant // Sorcery -Oracle:null +Name:Thrash +ManaCost:R/G R/G +Types:Instant +A:SP$ Pump | Cost$ RG RG | ValidTgts$ Creature.YouCtrl | AILogic$ PowerDmg | TgtPrompt$ Select target creature you control | SubAbility$ SoulsDamage | StackDescription$ None | SpellDescription$ Target creature you control deals damage equal to its power to target creature you don't control +SVar:SoulsDamage:DB$ DealDamage | ValidTgts$ Creature.YouDontCtrl,Planeswalker.YouDontCtrl | AILogic$ PowerDmg | TgtPrompt$ Select target creature or planeswalker you don't control | NumDmg$ X | References$ X | ConditionDefined$ Targeted | ConditionPresent$ Creature | ConditionCompare$ EQ1 | DamageSource$ ParentTarget +SVar:X:ParentTargeted$CardPower +Oracle:Target creature you control deals damage equal to its power to target creature or planeswalker you don’t control. + +ALTERNATE + +Name:Threat +ManaCost:2 R G +Types:Sorcery +A:SP$ Token | Cost$ 2 R G | TokenAmount$ 1 | TokenOwner$ You | TokenScript$ rg_4_4_beast_trample | SpellDescription$ Create a 4/4 red and green Beast creature token with trample. +Oracle:Create a 4/4 red and green Beast creature token with trample. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/warrant_warden.txt b/forge-gui/res/cardsfolder/upcoming/warrant_warden.txt index af5ae5d2e57..633e954e00f 100644 --- a/forge-gui/res/cardsfolder/upcoming/warrant_warden.txt +++ b/forge-gui/res/cardsfolder/upcoming/warrant_warden.txt @@ -10,7 +10,6 @@ Name:Warden ManaCost:3 W U Types:Sorcery A:SP$ Token | Cost$ 3 W U | TokenAmount$ 1 | TokenOwner$ You | TokenScript$ wu_4_4_sphinx_flying_vigilance | SpellDescription$ Create a 4/4 white and blue Sphinx creature token with flying and vigilance. -SVar:X:Count$TypeYouCtrl.Creature/Times.2 Oracle:Create a 4/4 white and blue Sphinx creature token with flying and vigilance. diff --git a/forge-gui/res/tokenscripts/rg_4_4_beast_trample.txt b/forge-gui/res/tokenscripts/rg_4_4_beast_trample.txt new file mode 100644 index 00000000000..c90867901fd --- /dev/null +++ b/forge-gui/res/tokenscripts/rg_4_4_beast_trample.txt @@ -0,0 +1,7 @@ +Name:Beast +ManaCost:no cost +Types:Creature Beast +Colors:red,green +PT:4/4 +K:Trample +Oracle:Trample From 657d85530aa7e5f11ad3044918c114d5c5c7d50d Mon Sep 17 00:00:00 2001 From: Chris H Date: Sun, 20 Jan 2019 19:26:27 -0500 Subject: [PATCH 648/901] Repudiate//replicate --- .../cardsfolder/upcoming/gatebreaker_ram.txt | 2 +- .../upcoming/repudiate_replicate.txt | 18 ++++++++++++---- .../cardsfolder/upcoming/revival_revenge.txt | 21 +++++++++++++++---- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/gatebreaker_ram.txt b/forge-gui/res/cardsfolder/upcoming/gatebreaker_ram.txt index 8b17c85df91..60f2daaaecf 100644 --- a/forge-gui/res/cardsfolder/upcoming/gatebreaker_ram.txt +++ b/forge-gui/res/cardsfolder/upcoming/gatebreaker_ram.txt @@ -3,7 +3,7 @@ ManaCost:2 G Types:Creature Sheep PT:2/2 S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | AddToughness$ X | Description$ CARDNAME gets +1/+1 for each Gate you control. -S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Vigilance | AddKeyword$ Trample | CheckSVar$ X | SVarCompare$ GE2 | Description$ As long as you control two or more Gates, Gatebreaker Ram has vigilance and trample. +S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Vigilance & Trample | CheckSVar$ X | SVarCompare$ GE2 | Description$ As long as you control two or more Gates, Gatebreaker Ram has vigilance and trample. SVar:X:Count$Valid Land.Gate+YouCtrl SVar:BuffedBy:Land.Gate DeckNeeds:Type$Land.Gate diff --git a/forge-gui/res/cardsfolder/upcoming/repudiate_replicate.txt b/forge-gui/res/cardsfolder/upcoming/repudiate_replicate.txt index 03082084db7..632c56d6f62 100644 --- a/forge-gui/res/cardsfolder/upcoming/repudiate_replicate.txt +++ b/forge-gui/res/cardsfolder/upcoming/repudiate_replicate.txt @@ -1,4 +1,14 @@ -Name:Repudiate // Replicate -ManaCost:G/U G/U // 1 G U -Types:Instant // Sorcery -Oracle:null +Name:Repudiate +ManaCost:GU GU +AlternateMode: Split +Types:Instant +A:SP$ Counter | Cost$ GU GU | TgtPrompt$ Select target Activated or Triggered Ability | ValidTgts$ Card | TargetType$ Activated,Triggered | SpellDescription$ Counter target activated or triggered ability. +AI:RemoveDeck:AllOracle:Counter target activated or triggered ability. (Mana abilities can’t be targeted.) + +ALTERNATE + +Name:Revenge +ManaCost:1 G U +Types:Sorcery +A:SP$ CopyPermanent | Cost$ 1 G U | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | SpellDescription$ Create a token that's a copy of target creature you control. +Oracle:Create a token that’s a copy of target creature you control. diff --git a/forge-gui/res/cardsfolder/upcoming/revival_revenge.txt b/forge-gui/res/cardsfolder/upcoming/revival_revenge.txt index 23a83229738..00c31cfdb67 100644 --- a/forge-gui/res/cardsfolder/upcoming/revival_revenge.txt +++ b/forge-gui/res/cardsfolder/upcoming/revival_revenge.txt @@ -1,4 +1,17 @@ -Name:Revival // Revenge -ManaCost:W/B W/B // 4 W B -Types:Sorcery // Sorcery -Oracle:null +Name:Revival +ManaCost:WB WB +AlternateMode: Split +Types:Sorcery +A:SP$ ChangeZone | Cost$ WB WB | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature in your graveyard | ValidTgts$ Creature.YouCtrl+cmcLE3 | SpellDescription$ Return target creature card with converted mana cost 3 or less from your graveyard to the battlefield. +Oracle:Return target creature card with converted mana cost 3 or less from your graveyard to the battlefield. + +ALTERNATE + +Name:Revenge +ManaCost:4 W B +Types:Sorcery +A:SP$ GainLife | Cost$ 4 W B | LifeAmount$ X | References$ X | SubAbility$ DBLoseHalf | SpellDescription$ Double your life total. Target opponent loses half their life, rounded up. +SVar:DBLoseHalf:SP$ LoseLife | Cost$ 4 B B | ValidTgts$ Opponent | LifeAmount$ Y | References$ Y +SVar:X:Count$YourLifeTotal +SVar:Y:Count$TargetedLifeTotal/HalfUp +Oracle:Double your life total. Target opponent loses half their life, rounded up. From e78202e43220c9dce936de9a5d4b27ffc2202061 Mon Sep 17 00:00:00 2001 From: Chris H Date: Sun, 20 Jan 2019 19:41:08 -0500 Subject: [PATCH 649/901] Incubation // Incongruity --- .../upcoming/incubation_incongruity.txt | 20 +++++++++++++++---- .../upcoming/repudiate_replicate.txt | 3 ++- .../res/tokenscripts/g_3_3_frog_lizard.txt | 6 ++++++ 3 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 forge-gui/res/tokenscripts/g_3_3_frog_lizard.txt diff --git a/forge-gui/res/cardsfolder/upcoming/incubation_incongruity.txt b/forge-gui/res/cardsfolder/upcoming/incubation_incongruity.txt index d1c92429ac8..e0049a7dec4 100644 --- a/forge-gui/res/cardsfolder/upcoming/incubation_incongruity.txt +++ b/forge-gui/res/cardsfolder/upcoming/incubation_incongruity.txt @@ -1,4 +1,16 @@ -Name:Incubation // Incongruity -ManaCost:G/U // 1 G U -Types:Sorcery // Instant -Oracle:null +Name:Incubation +ManaCost:GU +AlternateMode: Split +Types:Sorcery +A:SP$ Dig | Cost$ GU | DigNum$ 5 | ChangeNum$ 1 | Optional$ True | ForceRevealToController$ True | ChangeValid$ Card.Creature | RestRandomOrder$ True | SpellDescription$ Look at the top five cards of your library. You may reveal a creature card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. +Oracle:Look at the top five cards of your library. You may reveal a creature card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. + + +ALTERNATE + +Name:Revenge +ManaCost:1 G U +Types:Instant +A:AB$ ChangeZone | Cost$ 1 G U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBToken | SpellDescription$ Exile target creature. That creature’s controller creates a 3/3 green Frog Lizard creature token. +SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenOwner$ TargetedController | TokenScript$ g_3_3_frog_lizard +Oracle:Exile target creature. That creature’s controller creates a 3/3 green Frog Lizard creature token. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/repudiate_replicate.txt b/forge-gui/res/cardsfolder/upcoming/repudiate_replicate.txt index 632c56d6f62..c96be75a126 100644 --- a/forge-gui/res/cardsfolder/upcoming/repudiate_replicate.txt +++ b/forge-gui/res/cardsfolder/upcoming/repudiate_replicate.txt @@ -3,7 +3,8 @@ ManaCost:GU GU AlternateMode: Split Types:Instant A:SP$ Counter | Cost$ GU GU | TgtPrompt$ Select target Activated or Triggered Ability | ValidTgts$ Card | TargetType$ Activated,Triggered | SpellDescription$ Counter target activated or triggered ability. -AI:RemoveDeck:AllOracle:Counter target activated or triggered ability. (Mana abilities can’t be targeted.) +AI:RemoveDeck:All +Oracle:Counter target activated or triggered ability. (Mana abilities can’t be targeted.) ALTERNATE diff --git a/forge-gui/res/tokenscripts/g_3_3_frog_lizard.txt b/forge-gui/res/tokenscripts/g_3_3_frog_lizard.txt new file mode 100644 index 00000000000..bed44dc53cc --- /dev/null +++ b/forge-gui/res/tokenscripts/g_3_3_frog_lizard.txt @@ -0,0 +1,6 @@ +Name:Frog Lizard +ManaCost:no cost +Types:Creature Frog Lizard +Colors:green +PT:3/3 +Oracle: \ No newline at end of file From 872defd9922e83d3e3bded8a587ce8850772b350 Mon Sep 17 00:00:00 2001 From: Chris H Date: Sun, 20 Jan 2019 20:46:28 -0500 Subject: [PATCH 650/901] Fix Bedazzle --- forge-gui/res/cardsfolder/upcoming/bedeck_bedazzle.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/bedeck_bedazzle.txt b/forge-gui/res/cardsfolder/upcoming/bedeck_bedazzle.txt index ec4f0716005..51c486c5014 100644 --- a/forge-gui/res/cardsfolder/upcoming/bedeck_bedazzle.txt +++ b/forge-gui/res/cardsfolder/upcoming/bedeck_bedazzle.txt @@ -11,5 +11,5 @@ Name:Bedazzle ManaCost:4 B R Types:Instant A:SP$ Destroy | Cost$ 4 B R | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target nonbasic land. | SubAbility$ DBDamage | SpellDescription$ Destroy target nonbasic land. CARDNAME deals 2 damage to target opponent or planeswalker. -SVar:DBDamage:DB$ Damage | ValidTgts$ Opponent,Planeswalker | TgtPrompt$ Select target opponent or planeswalker | NumDmg$ 2 +SVar:DBDamage:DB$ DealDamage | ValidTgts$ Player.Opponent,Card.Planeswalker | TgtPrompt$ Select target opponent or planeswalker | NumDmg$ 2 Oracle:Destroy target nonbasic land. Bedazzle deals 2 damage to target opponent or planeswalker. From 56fda56807fc5a8f6775cbdcad6e158da07768d7 Mon Sep 17 00:00:00 2001 From: Chris H Date: Sun, 20 Jan 2019 22:51:25 -0500 Subject: [PATCH 651/901] Fixes --- forge-gui/res/cardsfolder/upcoming/consecrate_consume.txt | 2 +- forge-gui/res/cardsfolder/upcoming/depose_deploy.txt | 2 +- forge-gui/res/cardsfolder/upcoming/repudiate_replicate.txt | 2 +- forge-gui/res/cardsfolder/upcoming/revival_revenge.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/consecrate_consume.txt b/forge-gui/res/cardsfolder/upcoming/consecrate_consume.txt index 23af8b27588..6f0ce2e9cdb 100644 --- a/forge-gui/res/cardsfolder/upcoming/consecrate_consume.txt +++ b/forge-gui/res/cardsfolder/upcoming/consecrate_consume.txt @@ -11,7 +11,7 @@ ALTERNATE Name:Consume ManaCost:2 W B Types:Sorcery -A:SP$ ChooseCard | ValidTgts$ Player | Choices$ Creature.greatestPowerControlledByRemembered | Mandatory$ True | SubAbility$ DBSac +A:SP$ ChooseCard | Cost$ 2 W B | ValidTgts$ Player | Choices$ Creature.greatestPowerControlledByRemembered | Mandatory$ True | SubAbility$ DBSac SVar:DBSac:DB$ Sacrifice | Defined$ Targeted | SacValid$ Card.ChosenCard | RememberSacrificed$ True | SacMessage$ the creature with the highest power | SubAbility$ DBGainLife SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X SVar:X:TargetedLKI$CardPower diff --git a/forge-gui/res/cardsfolder/upcoming/depose_deploy.txt b/forge-gui/res/cardsfolder/upcoming/depose_deploy.txt index 757f9106505..a8a6d50e188 100644 --- a/forge-gui/res/cardsfolder/upcoming/depose_deploy.txt +++ b/forge-gui/res/cardsfolder/upcoming/depose_deploy.txt @@ -10,7 +10,7 @@ ALTERNATE Name:Deploy ManaCost:2 W U Types:Instant -A:SP$ Token | TokenAmount$ 2 | TokenOwner$ You | TokenScript$ c_1_1_a_thopter_flying | SubAbility$ DBGainLife | SpellDescription$ Create two 1/1 colorless Thopter artifact creature tokens with flying, then you gain 1 life for each creature you control. +A:SP$ Token | Cost$ 2 W U | TokenAmount$ 2 | TokenOwner$ You | TokenScript$ c_1_1_a_thopter_flying | SubAbility$ DBGainLife | SpellDescription$ Create two 1/1 colorless Thopter artifact creature tokens with flying, then you gain 1 life for each creature you control. SVar:DBGainLife:DB$ GainLife | LifeAmount$ X | References$ X SVar:X:Count$TypeYouCtrl.Creature Oracle:Create two 1/1 colorless Thopter artifact creature tokens with flying, then you gain 1 life for each creature you control. diff --git a/forge-gui/res/cardsfolder/upcoming/repudiate_replicate.txt b/forge-gui/res/cardsfolder/upcoming/repudiate_replicate.txt index c96be75a126..7d8b9e7e81b 100644 --- a/forge-gui/res/cardsfolder/upcoming/repudiate_replicate.txt +++ b/forge-gui/res/cardsfolder/upcoming/repudiate_replicate.txt @@ -8,7 +8,7 @@ Oracle:Counter target activated or triggered ability. (Mana abilities can’t be ALTERNATE -Name:Revenge +Name:Replicate ManaCost:1 G U Types:Sorcery A:SP$ CopyPermanent | Cost$ 1 G U | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | SpellDescription$ Create a token that's a copy of target creature you control. diff --git a/forge-gui/res/cardsfolder/upcoming/revival_revenge.txt b/forge-gui/res/cardsfolder/upcoming/revival_revenge.txt index 00c31cfdb67..d098b682f87 100644 --- a/forge-gui/res/cardsfolder/upcoming/revival_revenge.txt +++ b/forge-gui/res/cardsfolder/upcoming/revival_revenge.txt @@ -11,7 +11,7 @@ Name:Revenge ManaCost:4 W B Types:Sorcery A:SP$ GainLife | Cost$ 4 W B | LifeAmount$ X | References$ X | SubAbility$ DBLoseHalf | SpellDescription$ Double your life total. Target opponent loses half their life, rounded up. -SVar:DBLoseHalf:SP$ LoseLife | Cost$ 4 B B | ValidTgts$ Opponent | LifeAmount$ Y | References$ Y +SVar:DBLoseHalf:DB$ LoseLife | Cost$ 4 B B | ValidTgts$ Opponent | LifeAmount$ Y | References$ Y SVar:X:Count$YourLifeTotal SVar:Y:Count$TargetedLifeTotal/HalfUp Oracle:Double your life total. Target opponent loses half their life, rounded up. From 929b5fbcfef3d6f3f1ad901ea9388ab0cf3a68f8 Mon Sep 17 00:00:00 2001 From: Chris H Date: Mon, 21 Jan 2019 20:39:25 -0500 Subject: [PATCH 652/901] Fix some more broken cards --- forge-gui/res/cardsfolder/upcoming/deface.txt | 9 +++------ forge-gui/res/cardsfolder/upcoming/final_payment.txt | 2 +- forge-gui/res/cardsfolder/upcoming/incubation_druid.txt | 8 ++++---- .../cardsfolder/upcoming/priest_of_forgotten_gods.txt | 2 +- 4 files changed, 9 insertions(+), 12 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/deface.txt b/forge-gui/res/cardsfolder/upcoming/deface.txt index b957bfeb2fd..9002c21a88c 100644 --- a/forge-gui/res/cardsfolder/upcoming/deface.txt +++ b/forge-gui/res/cardsfolder/upcoming/deface.txt @@ -1,10 +1,7 @@ Name:Deface ManaCost:R Types:Sorcery -A:SP$ ChooseCard | Cost$ R | Defined$ You | Choices$ Player | ChoiceZone$ Exile | Amount$ 1 | RememberChosen$ True | SVar$ Choose one -2/-4 if you choose one -1/+4 Choose one -1/+4. Choose one -1/+4 Choose one -1/+4. | ChoiceZone$ Exile | RememberChosen$ True | SubAbility$ DBChoose -SVar:DBChoose:DB$ ChooseCard | Defined$ You | Choices$ Player.IsRemembered | ChoiceZone$ Exile | Amount$ 1 | RememberChosen$ True | Choices$ Card.IsRemembered | ChoiceZone$ Choose one to one -1/+1 | RememberChosen$ True -A:SP$ ChooseCard | Cost$ R | Defined$ You | Choices$ Player | ChoiceZone$ Exile | Amount$ 1 | RememberChosen$ True | SVar$ Choose one -2/-4 if you choose one -1/+4 Choose one -1/+4. Choose one -1/+4 Choose one -1/+4. | ChoiceZone$ Exile | RememberChosen$ True | SubAbility$ DBChoose -SVar:DBChoose:DB$ ChooseCard | Defined$ You | Choices$ Player.IsRemembered | ChoiceZone$ Exile | Amount$ 1 | RememberChosen$ True | Choices$ Card.IsRemembered | ChoiceZone$ Choose one to one -1/+1 | RememberChosen$ True -A:SP$ ChooseCard | Cost$ R | Defined$ You | Choices$ Player | ChoiceZone$ Exile | Amount$ 1 | RememberChosen$ True | SVar$ Choose one -2/-4 if you choose one -1/+4 Choose one -1/+4. Choose one -1/+4 Choose one -1/+4. | ChoiceZone$ Exile | RememberChosen$ True | SubAbility$ DBChoose -SVar:DBChoose:DB$ ChooseCard | Defined$ You | Choices$ Player.IsRemembered | ChoiceZone$ Exile | Amount$ 1 | RememberChosen$ True | Choices$ Card.IsRemembered | ChoiceZone$ Choose one to one -1/+1 | RememberChosen$ True +A:SP$ Charm | Cost$ R | Choices$ DBDestroy,DBDestroy2 +SVar:DBDestroy:DB$ Destroy | ValidTgts$ Artifact | TgtPrompt$ Select target Artifact | SpellDescription$ Destroy target artifact. +SVar:DBDestroy2:DB$ Destroy | ValidTgts$ Creature.withDefender | TgtPrompt$ Select target creature with defender | SpellDescription$ Destroy target creature with defender. Oracle:Choose one —\n• Destroy target artifact.\n• Destroy target creature with defender. diff --git a/forge-gui/res/cardsfolder/upcoming/final_payment.txt b/forge-gui/res/cardsfolder/upcoming/final_payment.txt index 738c4f59fad..b99e79bf6ff 100644 --- a/forge-gui/res/cardsfolder/upcoming/final_payment.txt +++ b/forge-gui/res/cardsfolder/upcoming/final_payment.txt @@ -1,6 +1,6 @@ Name:Final Payment ManaCost:W B Types:Instant -K:AlternateAdditionalCost:PayLife<5>:Generic/B or sacrifice a creature or enchantment. +K:AlternateAdditionalCost:PayLife<5>:Sac<1/Creature,Enchantment> A:SP$ Destroy | Cost$ W B | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Destroy target creature. Oracle:As an additional cost to cast this spell, pay 5 life or sacrifice a creature or enchantment.\nDestroy target creature. diff --git a/forge-gui/res/cardsfolder/upcoming/incubation_druid.txt b/forge-gui/res/cardsfolder/upcoming/incubation_druid.txt index 37bc252bc28..cd9d27f8bec 100644 --- a/forge-gui/res/cardsfolder/upcoming/incubation_druid.txt +++ b/forge-gui/res/cardsfolder/upcoming/incubation_druid.txt @@ -2,9 +2,9 @@ Name:Incubation Druid ManaCost:1 G Types:Creature Elf Druid PT:0/2 -A:AB$ ManaReflected | Cost$ T | ColorOrType$ Type | Valid$ Land.YouCtrl | ReflectProperty$ Produce | SubAbility$ DBManaU | SpellDescription$ Add one mana of any type that a land you control could produce. If CARDNAME has a +1/+1 counter on it, add three mana of that type instead. -SVar:DBManaU:DB$ Mana | Produced$ Combo Card.Self | ConditionDefined$ Remembered | ConditionPresent$ Card.Self | SubAbility$ DBManaB -SVar:DBManaB:DB$ Mana | Produced$ G | Amount$ X | Permanent$ True | References$ X | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup -A:AB$ PutCounter | Cost$ 3 G G | Defined$ Self | CounterType$ P1P1 | CounterNum$3 | SpellDescription$ As CARDNAME, support 3. (If this creature has no +1/+1 counters on it, put three +1/+1 counters on it.) +K:Adapt:3:3 G G +A:AB$ ManaReflected | Cost$ T | ColorOrType$ Type | Valid$ Land.YouCtrl | Amount$ IncubationAmount | ReflectProperty$ Produce | SpellDescription$ Add one mana of any type that a land you control could produce. If CARDNAME has a +1/+1 counter on it, add three mana of that type instead. +SVar:Y:Count$Valid Card.Self+counters_GE1_P1P1 +SVar:IncubationAmount:Count$Compare Y GE1.3.1 DeckHas:Ability$Counters Oracle:{T}: Add one mana of any type that a land you control could produce. If Incubation Druid has a +1/+1 counter on it, add three mana of that type instead.\n{3}{G}{G}: Adapt 3. (If this creature has no +1/+1 counters on it, put three +1/+1 counters on it.) diff --git a/forge-gui/res/cardsfolder/upcoming/priest_of_forgotten_gods.txt b/forge-gui/res/cardsfolder/upcoming/priest_of_forgotten_gods.txt index 15e7b0f1241..b25f535472d 100644 --- a/forge-gui/res/cardsfolder/upcoming/priest_of_forgotten_gods.txt +++ b/forge-gui/res/cardsfolder/upcoming/priest_of_forgotten_gods.txt @@ -2,7 +2,7 @@ Name:Priest of Forgotten Gods ManaCost:1 B Types:Creature Human Cleric PT:1/2 -A:AB$ LoseLife | Cost$ T Sac<2/Creature.Other/other creatures> | ValidTgts$ Player | TgtPrompt$ Select target player | TargetMin$ 0 | TargetMax$ MaxTgt | References$ MaxTgt | LifeAmount$ 2 | SubAbility$ DBSac | SpellDescription$ Any number of target players each lose 2 life and sacrifice a creature. You add {B}{B} and draw a card. +A:AB$ LoseLife | Cost$ T Sac<2/Creature.Other/other creatures> | ValidTgts$ Player | TgtPrompt$ Select target player | TargetMin$ 0 | TargetMax$ MaxTgts | References$ MaxTgts | LifeAmount$ 2 | SubAbility$ DBSac | SpellDescription$ Any number of target players each lose 2 life and sacrifice a creature. You add {B}{B} and draw a card. SVar:MaxTgts:PlayerCountPlayers$Amount SVar:DBSac:DB$ Sacrifice | SacValid$ Creature | Defined$ Targeted | Amount$ 1 | SubAbility$ DBMana SVar:DBMana:DB$ Mana | Produced$ B | Amount$ 2 | SubAbility$ DBDraw From 57a3462623e3269bc80d1fc4b5d1dc02069e1877 Mon Sep 17 00:00:00 2001 From: Chris H Date: Mon, 21 Jan 2019 21:18:22 -0500 Subject: [PATCH 653/901] Cleanup weird Light up the Stage --- forge-gui/res/cardsfolder/upcoming/light_up_the_stage.txt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/light_up_the_stage.txt b/forge-gui/res/cardsfolder/upcoming/light_up_the_stage.txt index 17c93ebeb28..21a35b29f95 100644 --- a/forge-gui/res/cardsfolder/upcoming/light_up_the_stage.txt +++ b/forge-gui/res/cardsfolder/upcoming/light_up_the_stage.txt @@ -1,11 +1,9 @@ Name:Light Up the Stage ManaCost:2 R Types:Sorcery -K:Defender -K:First Strike +K:Spectacle:R A:SP$ Mill | Cost$ 2 R | Defined$ You | NumCards$ 2 | Destination$ Exile | RememberMilled$ True | SubAbility$ DBStoreTurn | SpellDescription$ Exile the top two cards of your library. Until the end of your next turn, you may play those cards. SVar:DBStoreTurn:DB$ StoreSVar | SVar$ CurrentTurn | Type$ Count | Expression$ YourTurns | SubAbility$ DBMayBePlay SVar:DBMayBePlay:DB$ Effect | StaticAbilities$ STCommuned | Duration$ Permanent | RememberObjects$ Remembered | Triggers$ TrigDuration | SVars$ DBDuration,EndDuration,CurrentTurn | SubAbility$ DBCleanup | ExileOnMoved$ Exile SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:STCommuned Oracle:Spectacle {R} (You may cast this spell for its spectacle cost rather than its mana cost if an opponent lost life this turn.)\nExile the top two cards of your library. Until the end of your next turn, you may play those cards. From 48a0ac6039993dc6876c19a061b94c38539ee686 Mon Sep 17 00:00:00 2001 From: Chris H Date: Mon, 21 Jan 2019 21:53:26 -0500 Subject: [PATCH 654/901] missing split for Depose//Deploy --- forge-gui/res/cardsfolder/upcoming/depose_deploy.txt | 1 + forge-gui/res/cardsfolder/upcoming/warrant_warden.txt | 1 + 2 files changed, 2 insertions(+) diff --git a/forge-gui/res/cardsfolder/upcoming/depose_deploy.txt b/forge-gui/res/cardsfolder/upcoming/depose_deploy.txt index a8a6d50e188..7237e0cc680 100644 --- a/forge-gui/res/cardsfolder/upcoming/depose_deploy.txt +++ b/forge-gui/res/cardsfolder/upcoming/depose_deploy.txt @@ -1,5 +1,6 @@ Name:Depose ManaCost:1 W/U +AlternateMode: Split Types:Instant A:SP$ Tap | Cost$ 1 WU | ValidTgts$ Creature | SubAbility$ DBDraw | SpellDescription$ Tap target creature. Draw a card. SVar:DBDraw:DB$ Draw | NumCards$ 1 diff --git a/forge-gui/res/cardsfolder/upcoming/warrant_warden.txt b/forge-gui/res/cardsfolder/upcoming/warrant_warden.txt index 633e954e00f..614c5d7126b 100644 --- a/forge-gui/res/cardsfolder/upcoming/warrant_warden.txt +++ b/forge-gui/res/cardsfolder/upcoming/warrant_warden.txt @@ -1,5 +1,6 @@ Name:Warrant ManaCost:W/U W/U +AlternateMode: Split Types:Instant A:SP$ ChangeZone | Cost$ WU WU | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature. | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SpellDescription$ Put target attacking or blocking creature on top of its owner's library. Oracle:Put target attacking or blocking creature on top of its owner's library. From 5ae5fef43ee24f57f28548af9411bcc81c024b7f Mon Sep 17 00:00:00 2001 From: Chris H Date: Mon, 21 Jan 2019 21:54:51 -0500 Subject: [PATCH 655/901] Fix more splits --- forge-gui/res/cardsfolder/upcoming/incubation_incongruity.txt | 2 +- forge-gui/res/cardsfolder/upcoming/thrash_threat.txt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/incubation_incongruity.txt b/forge-gui/res/cardsfolder/upcoming/incubation_incongruity.txt index e0049a7dec4..3814a3dbfcc 100644 --- a/forge-gui/res/cardsfolder/upcoming/incubation_incongruity.txt +++ b/forge-gui/res/cardsfolder/upcoming/incubation_incongruity.txt @@ -8,7 +8,7 @@ Oracle:Look at the top five cards of your library. You may reveal a creature car ALTERNATE -Name:Revenge +Name:Incongruity ManaCost:1 G U Types:Instant A:AB$ ChangeZone | Cost$ 1 G U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBToken | SpellDescription$ Exile target creature. That creature’s controller creates a 3/3 green Frog Lizard creature token. diff --git a/forge-gui/res/cardsfolder/upcoming/thrash_threat.txt b/forge-gui/res/cardsfolder/upcoming/thrash_threat.txt index bee5e0ea1cf..edebe152dde 100644 --- a/forge-gui/res/cardsfolder/upcoming/thrash_threat.txt +++ b/forge-gui/res/cardsfolder/upcoming/thrash_threat.txt @@ -1,5 +1,6 @@ Name:Thrash ManaCost:R/G R/G +AlternateMode: Split Types:Instant A:SP$ Pump | Cost$ RG RG | ValidTgts$ Creature.YouCtrl | AILogic$ PowerDmg | TgtPrompt$ Select target creature you control | SubAbility$ SoulsDamage | StackDescription$ None | SpellDescription$ Target creature you control deals damage equal to its power to target creature you don't control SVar:SoulsDamage:DB$ DealDamage | ValidTgts$ Creature.YouDontCtrl,Planeswalker.YouDontCtrl | AILogic$ PowerDmg | TgtPrompt$ Select target creature or planeswalker you don't control | NumDmg$ X | References$ X | ConditionDefined$ Targeted | ConditionPresent$ Creature | ConditionCompare$ EQ1 | DamageSource$ ParentTarget From d8585fd9256e36072eebe797e6b736fa9d9474cf Mon Sep 17 00:00:00 2001 From: Chris H Date: Mon, 21 Jan 2019 22:23:15 -0500 Subject: [PATCH 656/901] Kaya --- .../res/cardsfolder/upcoming/kaya_orzhov_usurper.txt | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/kaya_orzhov_usurper.txt b/forge-gui/res/cardsfolder/upcoming/kaya_orzhov_usurper.txt index 0c62c60ff2b..a4ad4753f09 100644 --- a/forge-gui/res/cardsfolder/upcoming/kaya_orzhov_usurper.txt +++ b/forge-gui/res/cardsfolder/upcoming/kaya_orzhov_usurper.txt @@ -6,10 +6,8 @@ A:AB$ ChangeZone | Cost$ AddCounter<1/LOYALTY> | Origin$ Graveyard | Destination SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$ValidExile -A:AB$ ChangeZone | Cost$ -1/-1/Card.nonLand/nonland permanent with converted mana cost 1 or less> | Origin$ Battlefield | Destination$ Exile | TgtPrompt$ Choose target nonland permanent with converted mana cost 1 or less | ValidTgts$ Permanent.nonLand+cmcLE1 | SpellDescription$ Exile target nonland permanent with converted mana cost 1 or less. -A:AB$ DealDamage | Cost$ PayLife<5/-5/Card> | ValidTgts$ Player | NumDmg$ X | References$ X | SubAbility$ DBYouGainLife | SpellDescription$ CARDNAME deals damage to target player equal to the number of cards that player owns in exile and you gain that much life. -SVar:TrigGain:DB$ GainLife | Defined$ You | LifeAmount$ Y | References$ Y -SVar:X:TargetedPlayer$CardsInLibrary -SVar:Y:PlayerCountRemembered$CardsInHand -SVar:NonStackingEffect:True +A:AB$ ChangeZone | Cost$ -1/-1/Card.nonLand/nonland permanent with converted mana cost 1 or less> | Planeswalker$ True | Origin$ Battlefield | Destination$ Exile | TgtPrompt$ Choose target nonland permanent with converted mana cost 1 or less | ValidTgts$ Permanent.nonLand+cmcLE1 | SpellDescription$ Exile target nonland permanent with converted mana cost 1 or less. +A:AB$ DealDamage | Cost$ PayLife<5/-5/Card> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Player | NumDmg$ X | References$ X | SubAbility$ DBYouGainLife | SpellDescription$ CARDNAME deals damage to target player equal to the number of cards that player owns in exile and you gain that much life. +SVar:DBYouGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X +SVar:X:TargetedPlayer$CardsInExile Oracle:[+1]: Exile up to two target cards from a single graveyard. You gain 2 life if at least one creature card was exiled this way.\n[-1]: Exile target nonland permanent with converted mana cost 1 or less.\n[-5]: Kaya, Orzhov Usurper deals damage to target player equal to the number of cards that player owns in exile and you gain that much life. From bc854f4d42ccef42d48b4dadf501fd084210115a Mon Sep 17 00:00:00 2001 From: Chris H Date: Mon, 21 Jan 2019 22:23:45 -0500 Subject: [PATCH 657/901] RNA Blockdata --- forge-gui/res/blockdata/blocks.txt | 1 + forge-gui/res/blockdata/boosterboxes.txt | 1 + forge-gui/res/blockdata/fatpacks.txt | 1 + forge-gui/res/formats/Sanctioned/Standard.txt | 2 +- 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/blockdata/blocks.txt b/forge-gui/res/blockdata/blocks.txt index b711675ec89..de26a42b8c2 100644 --- a/forge-gui/res/blockdata/blocks.txt +++ b/forge-gui/res/blockdata/blocks.txt @@ -78,3 +78,4 @@ Dominaria, 3/6/DOM, DOM Core Set 2019, 3/6/M19, M19 Guilds of Ravnica, 3/6/GRN, GRN Ultimate Masters, 3/6/M19, UMA +Ravnica Allegiance, 3/6/RNA, RNA \ No newline at end of file diff --git a/forge-gui/res/blockdata/boosterboxes.txt b/forge-gui/res/blockdata/boosterboxes.txt index 2dd96e386da..b0bfbe5edf9 100644 --- a/forge-gui/res/blockdata/boosterboxes.txt +++ b/forge-gui/res/blockdata/boosterboxes.txt @@ -105,3 +105,4 @@ BBD: 36 Boosters M19: 36 Boosters GRN: 36 Boosters UMA: 24 Boosters +RNA: 36 Boosters \ No newline at end of file diff --git a/forge-gui/res/blockdata/fatpacks.txt b/forge-gui/res/blockdata/fatpacks.txt index 1135e24cba5..0c959b27c96 100644 --- a/forge-gui/res/blockdata/fatpacks.txt +++ b/forge-gui/res/blockdata/fatpacks.txt @@ -70,3 +70,4 @@ RIX: 10 Boosters, 80 BasicLands DOM: 10 Boosters, 80 BasicLands M19: 10 Boosters, 80 BasicLands GRN: 10 Boosters, 80 BasicLands +RNA: 10 Boosters, 80 BasicLands \ No newline at end of file diff --git a/forge-gui/res/formats/Sanctioned/Standard.txt b/forge-gui/res/formats/Sanctioned/Standard.txt index 7413d4d97d2..62eea902647 100644 --- a/forge-gui/res/formats/Sanctioned/Standard.txt +++ b/forge-gui/res/formats/Sanctioned/Standard.txt @@ -3,5 +3,5 @@ Name:Standard Order:101 Subtype:Standard Type:Sanctioned -Sets:XLN, RIX, DOM, M19, GRN +Sets:XLN, RIX, DOM, M19, GRN, RNA Banned: Rampaging Ferocidon From 8580d585dfc97e68f9d9f87942b49665e86082be Mon Sep 17 00:00:00 2001 From: Chris H Date: Tue, 22 Jan 2019 21:42:46 -0500 Subject: [PATCH 658/901] Fix Mirror March --- forge-gui/res/cardsfolder/upcoming/mirror_march.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/mirror_march.txt b/forge-gui/res/cardsfolder/upcoming/mirror_march.txt index d1e5de85677..df9dd4055fb 100644 --- a/forge-gui/res/cardsfolder/upcoming/mirror_march.txt +++ b/forge-gui/res/cardsfolder/upcoming/mirror_march.txt @@ -2,7 +2,7 @@ Name:Mirror March ManaCost:5 R Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonToken+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigFlipACoin | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, flip a coin until you lose a flip. For each flip you won, create a token that's a copy of that creature. Those tokens gain haste. Exile them at the beginning of the next end step. -SVar:TrigFlipACoin:DB$FlipACoin | FlipUntilYouLose$ True | SaveNumFlipsToSVar$ SneakAttackEOT | LoseSubAbility$ SneakAttackEOT -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True -SVar:SneakAttackEOT:SVar:EndOfTurnLeavePlay:True +SVar:TrigFlipACoin:DB$FlipACoin | FlipUntilYouLose$ True | SaveNumFlipsToSVar$ MirrorAmount | LoseSubAbility$ DBCopies +SVar:DBCopies:DB$ CopyPermanent | PumpKeywords$ Haste | AtEOT$ Exile | Defined$ TriggeredCard | NumCopies$ MirrorAmount +SVar:MirrorAmount:Number$0 Oracle:Whenever a nontoken creature enters the battlefield under your control, flip a coin until you lose a flip. For each flip you won, create a token that's a copy of that creature. Those tokens gain haste. Exile them at the beginning of the next end step. From afd1070850787be4a0599b2c0db2c900dd79a9b7 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Wed, 23 Jan 2019 03:42:45 -0500 Subject: [PATCH 659/901] fix bug in min number of cards to select in digs --- .../src/main/java/forge/game/ability/effects/DigEffect.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java index b47d8a6ee18..6dfab22f9ab 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java @@ -266,8 +266,8 @@ public class DigEffect extends SpellAbilityEffect { valid.removeAll(andOrCards); //pfps remove andOr cards to get two two choices set up correctly chosen = chooser.getController().chooseFromTwoListsForEffect(valid, andOrCards, optional, delayedReveal, sa, prompt, p); } else { - int min = (anyNumber || optional) ? 0 : numToDig; - int max = Math.max(destZone1ChangeNum, anyNumber ? valid.size() : 0); + int max = anyNumber ? valid.size() : Math.min(valid.size(),destZone1ChangeNum); + int min = (anyNumber || optional) ? 0 : max; chosen = chooser.getController().chooseEntitiesForEffect(valid, min, max, delayedReveal, sa, prompt, p); } chooser.getController().endTempShowCards(); From 0687fc2a31d61559336f78f64d4c17f7d919f3cc Mon Sep 17 00:00:00 2001 From: Sol Date: Thu, 24 Jan 2019 02:52:52 +0000 Subject: [PATCH 660/901] More rna --- forge-gui/res/blockdata/printsheets.txt | 25 ++++++++++++++++++- .../res/cardsfolder/upcoming/mirror_march.txt | 2 +- forge-gui/res/editions/Ravnica Allegiance.txt | 3 +++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/blockdata/printsheets.txt b/forge-gui/res/blockdata/printsheets.txt index b52ba4f999c..aefbba16529 100644 --- a/forge-gui/res/blockdata/printsheets.txt +++ b/forge-gui/res/blockdata/printsheets.txt @@ -1406,4 +1406,27 @@ Golgari Guildgate|GRN Izzet Guildgate|GRN Selesnya Guildgate|GRN Dimir Guildgate|GRN -Boros Guildgate|GRN \ No newline at end of file +Boros Guildgate|GRN + +[RNA Lands] +10 Azorious Guildgate|GRN +10 Gruul Guildgate|GRN +10 Orzhov Guildgate|GRN +10 Rakdos Guildgate|GRN +10 Simic Guildgate|GRN + +[RNA Secret Cards] +Dovin, Architecht of Law +Elite Arrester +Dovin's Dismissal +Dovin's Automaton +Domri City Smasher +Ragefire +Charging War Boar +Domri's Nodorog +The Haunt of Hightower +Azorious Guildgate|GRN +Gruul Guildgate|GRN +Orzhov Guildgate|GRN +Rakdos Guildgate|GRN +Simic Guildgate|GRN \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/mirror_march.txt b/forge-gui/res/cardsfolder/upcoming/mirror_march.txt index df9dd4055fb..3c4ab33701a 100644 --- a/forge-gui/res/cardsfolder/upcoming/mirror_march.txt +++ b/forge-gui/res/cardsfolder/upcoming/mirror_march.txt @@ -2,7 +2,7 @@ Name:Mirror March ManaCost:5 R Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonToken+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigFlipACoin | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, flip a coin until you lose a flip. For each flip you won, create a token that's a copy of that creature. Those tokens gain haste. Exile them at the beginning of the next end step. -SVar:TrigFlipACoin:DB$FlipACoin | FlipUntilYouLose$ True | SaveNumFlipsToSVar$ MirrorAmount | LoseSubAbility$ DBCopies +SVar:TrigFlipACoin:DB$FlipACoin | FlipUntilYouLose$ True | SaveNumFlipsToSVar$ MirrorAmount | NoCall$ True | LoseSubAbility$ DBCopies SVar:DBCopies:DB$ CopyPermanent | PumpKeywords$ Haste | AtEOT$ Exile | Defined$ TriggeredCard | NumCopies$ MirrorAmount SVar:MirrorAmount:Number$0 Oracle:Whenever a nontoken creature enters the battlefield under your control, flip a coin until you lose a flip. For each flip you won, create a token that's a copy of that creature. Those tokens gain haste. Exile them at the beginning of the next end step. diff --git a/forge-gui/res/editions/Ravnica Allegiance.txt b/forge-gui/res/editions/Ravnica Allegiance.txt index 93b2ec671a9..9f84d258beb 100644 --- a/forge-gui/res/editions/Ravnica Allegiance.txt +++ b/forge-gui/res/editions/Ravnica Allegiance.txt @@ -5,6 +5,9 @@ Name=Ravnica Allegiance Code2=RNA MciCode=rna Type=Expansion +BoosterCovers=5 +Booster=10 Common:!fromSheet("RNA Planeswalker Decks and Additional Promo"), 3 Uncommon:!fromSheet("RNA Planeswalker Decks and Additional Promo"), 1 RareMythic:!fromSheet("RNA Planeswalker Decks and Additional Promo"), 1 BasicLand RNA + [cards] 1 M Angel of Grace From 4069b603c2f66b78a1f0008b4fa22b58322065f1 Mon Sep 17 00:00:00 2001 From: Sol Date: Thu, 24 Jan 2019 02:54:49 +0000 Subject: [PATCH 661/901] Update Ravnica Allegiance.txt --- forge-gui/res/editions/Ravnica Allegiance.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/forge-gui/res/editions/Ravnica Allegiance.txt b/forge-gui/res/editions/Ravnica Allegiance.txt index 9f84d258beb..bb56814ece6 100644 --- a/forge-gui/res/editions/Ravnica Allegiance.txt +++ b/forge-gui/res/editions/Ravnica Allegiance.txt @@ -6,8 +6,7 @@ Code2=RNA MciCode=rna Type=Expansion BoosterCovers=5 -Booster=10 Common:!fromSheet("RNA Planeswalker Decks and Additional Promo"), 3 Uncommon:!fromSheet("RNA Planeswalker Decks and Additional Promo"), 1 RareMythic:!fromSheet("RNA Planeswalker Decks and Additional Promo"), 1 BasicLand RNA - +Booster=10 Common:!fromSheet("RNA Secret Cards"), 3 Uncommon:!fromSheet("RNA Secret Cards"), 1 RareMythic:!fromSheet("RNA Secret Cards"), 1 fromSheet("RNA Lands") [cards] 1 M Angel of Grace From b821ec7af5bf75b99ba28bc6a13176726af7c148 Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Thu, 24 Jan 2019 04:57:54 +0000 Subject: [PATCH 662/901] Add token scripts and download URLs. --- .../cardsfolder/upcoming/awaken_the_erstwhile.txt | 2 +- .../res/cardsfolder/upcoming/depose_deploy.txt | 2 +- .../cardsfolder/upcoming/dovin_grand_arbiter.txt | 2 +- .../cardsfolder/upcoming/ethereal_absolution.txt | 2 +- .../res/cardsfolder/upcoming/goblin_gathering.txt | 2 +- .../upcoming/knight_of_the_last_breath.txt | 2 +- .../cardsfolder/upcoming/mesmerizing_benthid.txt | 2 +- .../res/cardsfolder/upcoming/smothering_tithe.txt | 3 +-- .../res/cardsfolder/upcoming/thrash_threat.txt | 2 +- .../res/cardsfolder/upcoming/warrant_warden.txt | 2 +- .../res/cardsfolder/upcoming/watchful_giant.txt | 2 +- forge-gui/res/lists/token-images.txt | 14 +++++++++++++- forge-gui/res/tokenscripts/c_a_treasure_sac.txt | 5 +++++ .../res/tokenscripts/u_0_2_illusion_mesmerize.txt | 9 +++++++++ 14 files changed, 38 insertions(+), 13 deletions(-) create mode 100644 forge-gui/res/tokenscripts/c_a_treasure_sac.txt create mode 100644 forge-gui/res/tokenscripts/u_0_2_illusion_mesmerize.txt diff --git a/forge-gui/res/cardsfolder/upcoming/awaken_the_erstwhile.txt b/forge-gui/res/cardsfolder/upcoming/awaken_the_erstwhile.txt index 52018c5c221..9f4a1887fb5 100644 --- a/forge-gui/res/cardsfolder/upcoming/awaken_the_erstwhile.txt +++ b/forge-gui/res/cardsfolder/upcoming/awaken_the_erstwhile.txt @@ -2,6 +2,6 @@ Name:Awaken the Erstwhile ManaCost:3 B B Types:Sorcery A:SP$ RepeatEach | Cost$ 3 B B | RepeatPlayers$ Player | RepeatSubAbility$ DBDiscard | SpellDescription$ Each player discards all the cards in their hand, then creates that many 2/2 black Zombie creature tokens. -SVar:DBToken:DB$ Token | TokenAmount$ X | TokenName$ Zombie | TokenTypes$ Creature,Zombie | TokenOwner$ You | TokenColors$ Black | TokenPower$ 2 | TokenToughness$ 2 | References$ X +SVar:DBToken:DB$ Token | TokenAmount$ X | TokenScript$ b_2_2_zombie | TokenOwner$ You | LegacyImage$ b 2 2 zombie rna | References$ X SVar:X:Remembered$Amount Oracle:Each player discards all the cards in their hand, then creates that many 2/2 black Zombie creature tokens. diff --git a/forge-gui/res/cardsfolder/upcoming/depose_deploy.txt b/forge-gui/res/cardsfolder/upcoming/depose_deploy.txt index 7237e0cc680..eadf1a642cb 100644 --- a/forge-gui/res/cardsfolder/upcoming/depose_deploy.txt +++ b/forge-gui/res/cardsfolder/upcoming/depose_deploy.txt @@ -11,7 +11,7 @@ ALTERNATE Name:Deploy ManaCost:2 W U Types:Instant -A:SP$ Token | Cost$ 2 W U | TokenAmount$ 2 | TokenOwner$ You | TokenScript$ c_1_1_a_thopter_flying | SubAbility$ DBGainLife | SpellDescription$ Create two 1/1 colorless Thopter artifact creature tokens with flying, then you gain 1 life for each creature you control. +A:SP$ Token | Cost$ 2 W U | TokenAmount$ 2 | TokenOwner$ You | TokenScript$ c_1_1_a_thopter_flying | LegacyImage$ c 1 1 a thopter flying rna | SubAbility$ DBGainLife | SpellDescription$ Create two 1/1 colorless Thopter artifact creature tokens with flying, then you gain 1 life for each creature you control. SVar:DBGainLife:DB$ GainLife | LifeAmount$ X | References$ X SVar:X:Count$TypeYouCtrl.Creature Oracle:Create two 1/1 colorless Thopter artifact creature tokens with flying, then you gain 1 life for each creature you control. diff --git a/forge-gui/res/cardsfolder/upcoming/dovin_grand_arbiter.txt b/forge-gui/res/cardsfolder/upcoming/dovin_grand_arbiter.txt index 54d1b89048c..a27a07d3d7b 100644 --- a/forge-gui/res/cardsfolder/upcoming/dovin_grand_arbiter.txt +++ b/forge-gui/res/cardsfolder/upcoming/dovin_grand_arbiter.txt @@ -5,7 +5,7 @@ Loyalty:3 A:AB$ Effect | Cost$ AddCounter<1/LOYALTY> | Name$ CARDNAME Effect | Triggers$ TrigSpellCast | SVars$ TrigPutCounter | SpellDescription$ Until end of turn, whenever a creature you control deals combat damage to a player, put a loyalty counter on CARDNAME. SVar:X:Count$Valid Creature.YouCtrl SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ LOYALTY | CounterNum$ 1 -A:AB$ Token | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 | TokenName$ Thopter | TokenTypes$ Artifact,Creature,Thopter | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SubAbility$ DBGainLife | SpellDescription$ Create a 1/1 colorless Thopter artifact creature token with flying. +A:AB$ Token | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 | TokenScript$ c_1_1_a_thopter_flying | TokenOwner$ You | LegacyImage$ c 1 1 a thopter flying rna | SubAbility$ DBGainLife | SpellDescription$ Create a 1/1 colorless Thopter artifact creature token with flying. SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 | SpellDescription$ You gain 1 life. DeckHas:Ability$Token A:AB$ Dig | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | DigNum$ 10 | ChangeNum$ 3 | DestinationZone$ Hand | DestinationZone2$ Library | LibraryPosition$ -1 | Choices$ Card.nonLand | SpellDescription$ Look at the top ten cards of your library. Put three of them into your hand and the rest on the bottom of your library in a random order. diff --git a/forge-gui/res/cardsfolder/upcoming/ethereal_absolution.txt b/forge-gui/res/cardsfolder/upcoming/ethereal_absolution.txt index 288224e09e9..3c789a573ff 100644 --- a/forge-gui/res/cardsfolder/upcoming/ethereal_absolution.txt +++ b/forge-gui/res/cardsfolder/upcoming/ethereal_absolution.txt @@ -6,7 +6,7 @@ S:Mode$ Continuous | Affected$ Creature.OppCtrl | AddPower$ -1 | AddToughness$ - SVar:PlayMain1:TRUE SVar:RemRandomDeck:True A:AB$ ChangeZone | Cost$ 4 W B | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Card.OppOwn | SubAbility$ DBToken | SpellDescription$ Exile target card from an opponent's graveyard. If it was a creature card, you create a 1/1 white and black Spirit creature token with flying. -SVar:DBToken:DB$ Token | ConditionDefined$ Targeted | ConditionPresent$ Creature | ConditionCompare$ EQ1 | TokenAmount$ 1 | TokenScript$ wb_1_1_spirit_flying | TokenOwner$ You | SubAbility$ DBCleanup +SVar:DBToken:DB$ Token | ConditionDefined$ Targeted | ConditionPresent$ Creature | ConditionCompare$ EQ1 | TokenAmount$ 1 | TokenScript$ wb_1_1_spirit_flying | TokenOwner$ You | SubAbility$ DBCleanup | LegacyImage$ wb 1 1 spirit flying rna SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True DeckHas:Ability$Token Oracle:Creatures you control get +1/+1.\nCreatures your opponents control get -1/-1.\n{2}{W}{B}: Exile target card from an opponent's graveyard. If it was a creature card, you create a 1/1 white and black Spirit creature token with flying. diff --git a/forge-gui/res/cardsfolder/upcoming/goblin_gathering.txt b/forge-gui/res/cardsfolder/upcoming/goblin_gathering.txt index af886dfda2a..949beb5d67d 100644 --- a/forge-gui/res/cardsfolder/upcoming/goblin_gathering.txt +++ b/forge-gui/res/cardsfolder/upcoming/goblin_gathering.txt @@ -1,7 +1,7 @@ Name:Goblin Gathering ManaCost:2 R Types:Sorcery -A:SP$ Token | Cost$ 2 R | TokenAmount$ X | TokenScript$ r_1_1_goblin | TokenOwner$ You | References$ X | SpellDescription$ Create a number of 1/1 red Goblin creature tokens equal to two plus the number of cards named CARDNAME in your graveyard. +A:SP$ Token | Cost$ 2 R | TokenAmount$ X | TokenScript$ r_1_1_goblin | LegacyImage$ r 1 1 goblin rna | TokenOwner$ You | References$ X | SpellDescription$ Create a number of 1/1 red Goblin creature tokens equal to two plus the number of cards named Goblin Gathering in your graveyard. SVar:X:Count$ValidGraveyard Card.YouOwn+namedGoblin Gathering/Plus.2 DeckHints:Name$Goblin Gathering DeckHas:Ability$Token diff --git a/forge-gui/res/cardsfolder/upcoming/knight_of_the_last_breath.txt b/forge-gui/res/cardsfolder/upcoming/knight_of_the_last_breath.txt index cf506cad0c6..a28bc189702 100644 --- a/forge-gui/res/cardsfolder/upcoming/knight_of_the_last_breath.txt +++ b/forge-gui/res/cardsfolder/upcoming/knight_of_the_last_breath.txt @@ -2,7 +2,7 @@ Name:Knight of the Last Breath ManaCost:5 W B Types:Creature Giant Knight PT:4/4 -A:AB$ Token | Cost$ 3 Sac<1/Creature.nonToken+Other/another creature> | TokenAmount$ 1 | TokenScript$ wb_1_1_spirit_flying | TokenOwner$ You | SpellDescription$ Create a 1/1 white and black Spirit creature token with flying. +A:AB$ Token | Cost$ 3 Sac<1/Creature.nonToken+Other/another creature> | TokenAmount$ 1 | TokenScript$ wb_1_1_spirit_flying | TokenOwner$ You | LegacyImage$ wb 1 1 spirit flying rna | SpellDescription$ Create a 1/1 white and black Spirit creature token with flying. SVar:RemRandomDeck:True K:Afterlife:3 SVar:AIPreference:SacCost$Creature.cmcLE1 diff --git a/forge-gui/res/cardsfolder/upcoming/mesmerizing_benthid.txt b/forge-gui/res/cardsfolder/upcoming/mesmerizing_benthid.txt index 7187cc3021e..2e24fa33b4d 100644 --- a/forge-gui/res/cardsfolder/upcoming/mesmerizing_benthid.txt +++ b/forge-gui/res/cardsfolder/upcoming/mesmerizing_benthid.txt @@ -3,7 +3,7 @@ ManaCost:3 U U Types:Creature Octopus PT:4/5 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create two 0/2 blue Illusion creature tokens with flying, it doesn't untap during its controller's next untap step. -SVar:TrigToken:DB$ Token | TokenAmount$ 2 | TokenName$ Illusion | TokenTypes$ Creature,Illusion | TokenOwner$ You | TokenColors$ Blue | TokenPower$ 0 | TokenToughness$ 2 | TokenKeywords$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:TrigToken:DB$ Token | TokenAmount$ 2 | TokenScript$ u_0_2_illusion_mesmerize | TokenOwner$ You | LegacyImage$ u 0 2 illusion mesmerize rna SVar:PlayMain1:TRUE SVar:RemRandomDeck:True S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Hexproof | CheckSVar$ X | SVarCompare$ GE1 | Description$ CARDNAME has hexproof as long as you control an Illusion. diff --git a/forge-gui/res/cardsfolder/upcoming/smothering_tithe.txt b/forge-gui/res/cardsfolder/upcoming/smothering_tithe.txt index 9f9e33bcdc1..fe24282b545 100644 --- a/forge-gui/res/cardsfolder/upcoming/smothering_tithe.txt +++ b/forge-gui/res/cardsfolder/upcoming/smothering_tithe.txt @@ -2,6 +2,5 @@ Name:Smothering Tithe ManaCost:3 W Types:Enchantment T:Mode$ Drawn | ValidCard$ Card.OppOwn | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever an opponent draws a card, that player may pay {2}. If the player doesn't, you create a colorless Treasure artifact token with flying{T}, Sacrifice this artifact: Add one mana of any color. -SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenName$ Treasure | TokenTypes$ Artifact,Treasure | TokenOwner$ TriggeredPlayer | TokenColors$ Colorless | TokenImage$ c treasure | TokenAbilities$ ABTreasureMana | TokenAltImages$ c_treasure2,c_treasure3,c_treasure4 -SVar:ABTreasureMana:DB$ Token | TokenAmount$ 1 | TokenName$ +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_treasure_sac | TokenOwner$ TriggeredPlayer | LegacyImage$ c a treasure sac Oracle:Whenever an opponent draws a card, that player may pay {2}. If the player doesn't, you create a colorless Treasure artifact token with "{T}, Sacrifice this artifact: Add one mana of any color." diff --git a/forge-gui/res/cardsfolder/upcoming/thrash_threat.txt b/forge-gui/res/cardsfolder/upcoming/thrash_threat.txt index edebe152dde..14706116cf1 100644 --- a/forge-gui/res/cardsfolder/upcoming/thrash_threat.txt +++ b/forge-gui/res/cardsfolder/upcoming/thrash_threat.txt @@ -12,5 +12,5 @@ ALTERNATE Name:Threat ManaCost:2 R G Types:Sorcery -A:SP$ Token | Cost$ 2 R G | TokenAmount$ 1 | TokenOwner$ You | TokenScript$ rg_4_4_beast_trample | SpellDescription$ Create a 4/4 red and green Beast creature token with trample. +A:SP$ Token | Cost$ 2 R G | TokenAmount$ 1 | TokenOwner$ You | TokenScript$ rg_4_4_beast_trample | LegacyImage$ rg 4 4 beast trample rna | SpellDescription$ Create a 4/4 red and green Beast creature token with trample. Oracle:Create a 4/4 red and green Beast creature token with trample. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/warrant_warden.txt b/forge-gui/res/cardsfolder/upcoming/warrant_warden.txt index 614c5d7126b..07e1dd9cdd8 100644 --- a/forge-gui/res/cardsfolder/upcoming/warrant_warden.txt +++ b/forge-gui/res/cardsfolder/upcoming/warrant_warden.txt @@ -10,7 +10,7 @@ ALTERNATE Name:Warden ManaCost:3 W U Types:Sorcery -A:SP$ Token | Cost$ 3 W U | TokenAmount$ 1 | TokenOwner$ You | TokenScript$ wu_4_4_sphinx_flying_vigilance | SpellDescription$ Create a 4/4 white and blue Sphinx creature token with flying and vigilance. +A:SP$ Token | Cost$ 3 W U | TokenAmount$ 1 | TokenOwner$ You | TokenScript$ wu_4_4_sphinx_flying_vigilance | LegacyImage$ wu 4 4 sphinx flying vigilance rna | SpellDescription$ Create a 4/4 white and blue Sphinx creature token with flying and vigilance. Oracle:Create a 4/4 white and blue Sphinx creature token with flying and vigilance. diff --git a/forge-gui/res/cardsfolder/upcoming/watchful_giant.txt b/forge-gui/res/cardsfolder/upcoming/watchful_giant.txt index d214f346e1e..cfbd1508df9 100644 --- a/forge-gui/res/cardsfolder/upcoming/watchful_giant.txt +++ b/forge-gui/res/cardsfolder/upcoming/watchful_giant.txt @@ -3,7 +3,7 @@ ManaCost:5 W Types:Creature Giant Soldier PT:3/6 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a 1/1 white Human creature token. -SVar:TrigToken:DB$Token | TokenAmount$ 1 | TokenScript$ w_1_1_human | TokenOwner$ You | SpellDescription$ Create a 1/1 white Human creature token. +SVar:TrigToken:DB$Token | TokenAmount$ 1 | TokenScript$ w_1_1_human | LegacyImage$ w 1 1 human rna | TokenOwner$ You | SpellDescription$ Create a 1/1 white Human creature token. DeckHints:Type$Human DeckHas:Ability$Token Oracle:When Watchful Giant enters the battlefield, create a 1/1 white Human creature token. diff --git a/forge-gui/res/lists/token-images.txt b/forge-gui/res/lists/token-images.txt index a5bd7a64a39..8a5bbadb95a 100644 --- a/forge-gui/res/lists/token-images.txt +++ b/forge-gui/res/lists/token-images.txt @@ -38,6 +38,7 @@ b_2_2_zombie_m13.jpg https://downloads.cardforge.org/images/to b_2_2_zombie_m14.jpg https://downloads.cardforge.org/images/tokens/b_2_2_zombie_m14.jpg b_2_2_zombie_mbs.jpg https://downloads.cardforge.org/images/tokens/b_2_2_zombie_mbs.jpg b_2_2_zombie_knight.jpg https://downloads.cardforge.org/images/tokens/b_2_2_zombie_knight.jpg +b_2_2_zombie_rna.jpg https://downloads.cardforge.org/images/tokens/b_2_2_zombie_rna.jpg b_2_4_spider.jpg https://downloads.cardforge.org/images/tokens/b_2_4_spider.jpg b_3_3_angel.jpg https://downloads.cardforge.org/images/tokens/b_3_3_angel.jpg b_3_3_kavu.jpg https://downloads.cardforge.org/images/tokens/b_3_3_kavu.jpg @@ -65,6 +66,7 @@ c_0_1_pest.jpg https://downloads.cardforge.org/images/to c_0_1_prism.jpg https://downloads.cardforge.org/images/tokens/c_0_1_prism.jpg c_0_2_wall.jpg https://downloads.cardforge.org/images/tokens/c_0_2_wall.jpg c_10_10_eldrazi.jpg https://downloads.cardforge.org/images/tokens/c_10_10_eldrazi.jpg +c_1_1_a_thopter_flying_rna.jpg https://downloads.cardforge.org/images/tokens/c_1_1_a_thopter_flying_rna.jpg c_1_1_eldrazi_scion.jpg https://downloads.cardforge.org/images/tokens/c_1_1_eldrazi_scion.jpg c_1_1_eldrazi_scion2.jpg https://downloads.cardforge.org/images/tokens/c_1_1_eldrazi_scion2.jpg c_1_1_eldrazi_scion3.jpg https://downloads.cardforge.org/images/tokens/c_1_1_eldrazi_scion3.jpg @@ -103,6 +105,7 @@ c_5_5_tuktuk_the_returned.jpg https://downloads.cardforge.org/images/to c_6_12_construct.jpg https://downloads.cardforge.org/images/tokens/c_6_12_construct.jpg c_7_7_eldrazi.jpg https://downloads.cardforge.org/images/tokens/c_7_7_eldrazi.jpg c_9_9_golem.jpg https://downloads.cardforge.org/images/tokens/c_9_9_golem.jpg +c_a_treasure_sac_rna.jpg https://downloads.cardforge.org/images/tokens/c_a_treasure_sac_rna.jpg c_gold.jpg https://downloads.cardforge.org/images/tokens/c_gold.jpg c_x_x_horror.jpg https://downloads.cardforge.org/images/tokens/c_x_x_horror.jpg c_x_x_riptide_replicator.jpg https://downloads.cardforge.org/images/tokens/c_x_x_riptide_replicator.jpg @@ -154,6 +157,7 @@ g_2_2_boar.jpg https://downloads.cardforge.org/images/to g_2_2_cat_warrior.jpg https://downloads.cardforge.org/images/tokens/g_2_2_cat_warrior.jpg g_2_2_lizard.jpg https://downloads.cardforge.org/images/tokens/g_2_2_lizard.jpg g_2_2_ooze.jpg https://downloads.cardforge.org/images/tokens/g_2_2_ooze.jpg +g_2_2_ooze_rna.jpg https://downloads.cardforge.org/images/tokens/g_2_2_ooze_rna.jpg g_2_2_wolf.jpg https://downloads.cardforge.org/images/tokens/g_2_2_wolf.jpg g_2_2_wolf_bng.jpg https://downloads.cardforge.org/images/tokens/g_2_2_wolf_bng.jpg g_2_2_wolf_isd.jpg https://downloads.cardforge.org/images/tokens/g_2_2_wolf_isd.jpg @@ -176,11 +180,13 @@ g_3_3_boar.jpg https://downloads.cardforge.org/images/to g_3_3_centaur.jpg https://downloads.cardforge.org/images/tokens/g_3_3_centaur.jpg g_3_3_centaur_bng.jpg https://downloads.cardforge.org/images/tokens/g_3_3_centaur_bng.jpg g_3_3_centaur_pro_black.jpg https://downloads.cardforge.org/images/tokens/g_3_3_centaur_pro_black.jpg +g_3_3_centaur_rna.jpg https://downloads.cardforge.org/images/tokens/g_3_3_centaur_rna.jpg g_3_3_centaur_rtr.jpg https://downloads.cardforge.org/images/tokens/g_3_3_centaur_rtr.jpg g_3_3_elephant.jpg https://downloads.cardforge.org/images/tokens/g_3_3_elephant.jpg g_3_3_elephant_ody.jpg https://downloads.cardforge.org/images/tokens/g_3_3_elephant_ody.jpg g_3_3_elephant_wwk.jpg https://downloads.cardforge.org/images/tokens/g_3_3_elephant_wwk.jpg g_3_3_frog_lizard.jpg https://downloads.cardforge.org/images/tokens/g_3_3_frog_lizard.jpg +g_3_3_frog_lizard_rna.jpg https://downloads.cardforge.org/images/tokens/g_3_3_frog_lizard_rna.jpg g_4_4_beast.jpg https://downloads.cardforge.org/images/tokens/g_4_4_beast.jpg g_4_4_beast_zen.jpg https://downloads.cardforge.org/images/tokens/g_4_4_beast_zen.jpg g_4_4_elemental.jpg https://downloads.cardforge.org/images/tokens/g_4_4_elemental.jpg @@ -221,6 +227,7 @@ r_1_1_goblin_dom.jpg https://downloads.cardforge.org/images/to r_1_1_goblin_m13.jpg https://downloads.cardforge.org/images/tokens/r_1_1_goblin_m13.jpg r_1_1_goblin_nph.jpg https://downloads.cardforge.org/images/tokens/r_1_1_goblin_nph.jpg r_1_1_goblin_rav.jpg https://downloads.cardforge.org/images/tokens/r_1_1_goblin_rav.jpg +r_1_1_goblin_rna.jpg https://downloads.cardforge.org/images/tokens/r_1_1_goblin_rna.jpg r_1_1_goblin_rtr.jpg https://downloads.cardforge.org/images/tokens/r_1_1_goblin_rtr.jpg r_1_1_goblin_scout.jpg https://downloads.cardforge.org/images/tokens/r_1_1_goblin_scout.jpg r_1_1_goblin_som.jpg https://downloads.cardforge.org/images/tokens/r_1_1_goblin_som.jpg @@ -261,6 +268,7 @@ rg_1_1_goblin_warrior.jpg https://downloads.cardforge.org/images/to rg_2_2_satyr.jpg https://downloads.cardforge.org/images/tokens/rg_2_2_satyr.jpg rg_3_4_stangg_twin.jpg https://downloads.cardforge.org/images/tokens/rg_3_4_stangg_twin.jpg rg_4_4_giant_warrior.jpg https://downloads.cardforge.org/images/tokens/rg_4_4_giant_warrior.jpg +rg_4_4_beast_trample_rna.jpg https://downloads.cardforge.org/images/tokens/rg_4_4_beast_trample.jpg rg_5_5_elemental.jpg https://downloads.cardforge.org/images/tokens/rg_5_5_elemental.jpg rw_1_1_goblin_soldier.jpg https://downloads.cardforge.org/images/tokens/rw_1_1_goblin_soldier.jpg rw_1_1_goblin_soldier_eve.jpg https://downloads.cardforge.org/images/tokens/rw_1_1_goblin_soldier_eve.jpg @@ -268,6 +276,7 @@ rw_1_1_soldier.jpg https://downloads.cardforge.org/images/to u_0_1_homunculus.jpg https://downloads.cardforge.org/images/tokens/u_0_1_homunculus.jpg u_0_1_plant_wall.jpg https://downloads.cardforge.org/images/tokens/u_0_1_plant_wall.jpg u_0_1_starfish.jpg https://downloads.cardforge.org/images/tokens/u_0_1_starfish.jpg +u_0_2_illusion_mesmerize_rna.jpg https://downloads.cardforge.org/images/tokens/u_0_2_illusion_mesmerize_rna.jpg u_1_0_elemental.jpg https://downloads.cardforge.org/images/tokens/u_1_0_elemental.jpg u_1_1_bird.jpg https://downloads.cardforge.org/images/tokens/u_1_1_bird.jpg u_1_1_bird_eve.jpg https://downloads.cardforge.org/images/tokens/u_1_1_bird_eve.jpg @@ -309,6 +318,7 @@ w_1_1_citizen.jpg https://downloads.cardforge.org/images/to w_1_1_goldmeadow_harrier.jpg https://downloads.cardforge.org/images/tokens/w_1_1_goldmeadow_harrier.jpg w_1_1_human.jpg https://downloads.cardforge.org/images/tokens/w_1_1_human.jpg w_1_1_human_avr.jpg https://downloads.cardforge.org/images/tokens/w_1_1_human_avr.jpg +w_1_1_human_rna.jpg https://downloads.cardforge.org/images/tokens/w_1_1_human_rna.jpg w_1_1_kithkin_soldier.jpg https://downloads.cardforge.org/images/tokens/w_1_1_kithkin_soldier.jpg w_1_1_kithkin_soldier_shm.jpg https://downloads.cardforge.org/images/tokens/w_1_1_kithkin_soldier_shm.jpg w_1_1_knight.jpg https://downloads.cardforge.org/images/tokens/w_1_1_knight.jpg @@ -366,13 +376,15 @@ w_x_x_reflection.jpg https://downloads.cardforge.org/images/to wb_1_1_cleric.jpg https://downloads.cardforge.org/images/tokens/wb_1_1_cleric.jpg wb_1_1_spirit.jpg https://downloads.cardforge.org/images/tokens/wb_1_1_spirit.jpg wb_1_1_spirit_gtc.jpg https://downloads.cardforge.org/images/tokens/wb_1_1_spirit_gtc.jpg +wb_1_1_spirit_rna.jpg https://downloads.cardforge.org/images/tokens/wb_1_1_spirit_rna.jpg wrg_8_8_beast.jpg https://downloads.cardforge.org/images/tokens/wrg_8_8_beast.jpg wu_1_1_bird.jpg https://downloads.cardforge.org/images/tokens/wu_1_1_bird.jpg - +wu_4_4_sphinx_flying_vigilance_rna.jpg https://downloads.cardforge.org/images/tokens/wu_4_4_sphinx_flying_vigilance_rna.jpg # Emblems chandra_the_firebrand_effect.jpg https://downloads.cardforge.org/images/tokens/chandra_the_firebrand_effect.jpg +emblem_domri_chaos_bringer_rna.jpg https://downloads.cardforge.org/images/tokens/emblem_domri_chaos_bringer_rna.jpg emblem_domri_rade.jpg https://downloads.cardforge.org/images/tokens/emblem_domri_rade.jpg emblem_elspeth_knight_errant.jpg https://downloads.cardforge.org/images/tokens/emblem_elspeth_knight_errant.jpg emblem_elspeth_suns_champion.jpg https://downloads.cardforge.org/images/tokens/emblem_elspeth_suns_champion.jpg diff --git a/forge-gui/res/tokenscripts/c_a_treasure_sac.txt b/forge-gui/res/tokenscripts/c_a_treasure_sac.txt new file mode 100644 index 00000000000..6ba1beb174b --- /dev/null +++ b/forge-gui/res/tokenscripts/c_a_treasure_sac.txt @@ -0,0 +1,5 @@ +Name:Treasure +ManaCost:no cost +Types:Artifact Treasure +A:AB$ Mana | Cost$ T Sac<1/CARDNAME|this artifact> | Produced$ Any | Amount$ 1 | SpellDescription$ Add one mana of any color. +Oracle:{T}, Sacrifice this artifact: Add one mana of any color. \ No newline at end of file diff --git a/forge-gui/res/tokenscripts/u_0_2_illusion_mesmerize.txt b/forge-gui/res/tokenscripts/u_0_2_illusion_mesmerize.txt new file mode 100644 index 00000000000..7a146c397df --- /dev/null +++ b/forge-gui/res/tokenscripts/u_0_2_illusion_mesmerize.txt @@ -0,0 +1,9 @@ +Name:Illusion +Types:Creature Illusion +ManaCost:no cost +Colors:blue +PT:0/2 +T:Mode$ AttackerBlocked | ValidBlocker$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever this creature blocks a creature, that creature doesn't untap during its controller's next untap step. +SVar:TrigPump:DB$ Pump | Defined$ TriggeredAttacker | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:HasBlockEffect:TRUE +Oracle:Whenever this creature blocks a creature, that creature doesn't untap during its controller's next untap step. \ No newline at end of file From 956ab8e96e7c8ea1f8f072568db2a0a6ebede4b0 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 24 Jan 2019 08:08:52 +0300 Subject: [PATCH 663/901] - Added more AI SVars for RNA. - Added some comments for the needed script fixes. - Fixed Dross Scorpion trigger description. --- forge-gui/res/cardsfolder/d/dross_scorpion.txt | 4 ++-- forge-gui/res/cardsfolder/upcoming/awaken_the_erstwhile.txt | 1 + forge-gui/res/cardsfolder/upcoming/captive_audience.txt | 2 ++ forge-gui/res/cardsfolder/upcoming/depose_deploy.txt | 1 + forge-gui/res/cardsfolder/upcoming/dovins_acuity.txt | 1 + forge-gui/res/cardsfolder/upcoming/fireblade_artist.txt | 2 +- forge-gui/res/cardsfolder/upcoming/kaya_orzhov_usurper.txt | 1 + forge-gui/res/cardsfolder/upcoming/kayas_wrath.txt | 1 + forge-gui/res/cardsfolder/upcoming/mesmerizing_benthid.txt | 2 ++ forge-gui/res/cardsfolder/upcoming/mirror_march.txt | 1 + forge-gui/res/cardsfolder/upcoming/rakdos_the_showstopper.txt | 1 + forge-gui/res/cardsfolder/upcoming/repudiate_replicate.txt | 1 + forge-gui/res/cardsfolder/upcoming/rumbling_ruin.txt | 1 + forge-gui/res/cardsfolder/upcoming/smothering_tithe.txt | 4 +++- forge-gui/res/cardsfolder/upcoming/thrash_threat.txt | 1 + forge-gui/res/cardsfolder/upcoming/warrant_warden.txt | 1 + 16 files changed, 21 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/cardsfolder/d/dross_scorpion.txt b/forge-gui/res/cardsfolder/d/dross_scorpion.txt index eac2b6b704c..10f6ad724dd 100644 --- a/forge-gui/res/cardsfolder/d/dross_scorpion.txt +++ b/forge-gui/res/cardsfolder/d/dross_scorpion.txt @@ -2,8 +2,8 @@ Name:Dross Scorpion ManaCost:4 Types:Artifact Creature Scorpion PT:3/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Artifact.Creature+Other | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ Whenever CARDNAME or another artifact creature dies, -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ you may untap target artifact. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Artifact.Creature+Other | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ Whenever CARDNAME or another artifact creature dies, you may untap target artifact. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigUntap | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another artifact creature dies, you may untap target artifact. SVar:TrigUntap:DB$Untap | ValidTgts$ Artifact | TgtPrompt$ Choose target artifact. SVar:Picture:http://www.wizards.com/global/images/magic/general/dross_scorpion.jpg Oracle:Whenever Dross Scorpion or another artifact creature dies, you may untap target artifact. diff --git a/forge-gui/res/cardsfolder/upcoming/awaken_the_erstwhile.txt b/forge-gui/res/cardsfolder/upcoming/awaken_the_erstwhile.txt index 52018c5c221..b75eba83008 100644 --- a/forge-gui/res/cardsfolder/upcoming/awaken_the_erstwhile.txt +++ b/forge-gui/res/cardsfolder/upcoming/awaken_the_erstwhile.txt @@ -4,4 +4,5 @@ Types:Sorcery A:SP$ RepeatEach | Cost$ 3 B B | RepeatPlayers$ Player | RepeatSubAbility$ DBDiscard | SpellDescription$ Each player discards all the cards in their hand, then creates that many 2/2 black Zombie creature tokens. SVar:DBToken:DB$ Token | TokenAmount$ X | TokenName$ Zombie | TokenTypes$ Creature,Zombie | TokenOwner$ You | TokenColors$ Black | TokenPower$ 2 | TokenToughness$ 2 | References$ X SVar:X:Remembered$Amount +DeckHas:Ability$Token Oracle:Each player discards all the cards in their hand, then creates that many 2/2 black Zombie creature tokens. diff --git a/forge-gui/res/cardsfolder/upcoming/captive_audience.txt b/forge-gui/res/cardsfolder/upcoming/captive_audience.txt index 74b834089a1..1c69175352c 100644 --- a/forge-gui/res/cardsfolder/upcoming/captive_audience.txt +++ b/forge-gui/res/cardsfolder/upcoming/captive_audience.txt @@ -1,3 +1,4 @@ +# -- THIS SCRIPT NEEDS REWRITING (non-functional) -- Name:Captive Audience ManaCost:5 B R Types:Enchantment @@ -21,4 +22,5 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E SVar:TrigChoose:DB$ ChooseCard | Defined$ You | Choices$ Player.Opponent | Mandatory$ True | SubAbility$ DBChangeZone SVar:DBChangeZone:DB$ ChangeZone | Defined$ Self | Origin$ All | Destination$ Battlefield | GainControl$ True SVar:RemRandomDeck:True +DeckHas:Ability$Token Oracle:Captive Audience enters the battlefield under the control of an opponent of your choice.\nAt the beginning of your upkeep, choose one that hasn't been chosen —\n• Your life total becomes 4.\n• Discard your hand.\n• Each opponent creates five 2/2 black Zombie creature tokens. diff --git a/forge-gui/res/cardsfolder/upcoming/depose_deploy.txt b/forge-gui/res/cardsfolder/upcoming/depose_deploy.txt index 7237e0cc680..9dca5b34c32 100644 --- a/forge-gui/res/cardsfolder/upcoming/depose_deploy.txt +++ b/forge-gui/res/cardsfolder/upcoming/depose_deploy.txt @@ -14,4 +14,5 @@ Types:Instant A:SP$ Token | Cost$ 2 W U | TokenAmount$ 2 | TokenOwner$ You | TokenScript$ c_1_1_a_thopter_flying | SubAbility$ DBGainLife | SpellDescription$ Create two 1/1 colorless Thopter artifact creature tokens with flying, then you gain 1 life for each creature you control. SVar:DBGainLife:DB$ GainLife | LifeAmount$ X | References$ X SVar:X:Count$TypeYouCtrl.Creature +DeckHas:Ability$Token Oracle:Create two 1/1 colorless Thopter artifact creature tokens with flying, then you gain 1 life for each creature you control. diff --git a/forge-gui/res/cardsfolder/upcoming/dovins_acuity.txt b/forge-gui/res/cardsfolder/upcoming/dovins_acuity.txt index c0826ba22c4..72a7e9e4c1a 100644 --- a/forge-gui/res/cardsfolder/upcoming/dovins_acuity.txt +++ b/forge-gui/res/cardsfolder/upcoming/dovins_acuity.txt @@ -6,4 +6,5 @@ T:Mode$ SpellCast | ValidCard$ Instant | ValidActivatingPlayer$ You | TriggerZon SVar:TrigGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 | SubAbility$ DBDraw SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 1 SVar:X:Count$IfMainPhase +DeckHas:Ability$LifeGain Oracle:When Dovin's Acuity enters the battlefield, you gain 2 life and draw a card.\nWhenever you cast an instant spell during your main phase, you may return Dovin's Acuity to its owner's hand. diff --git a/forge-gui/res/cardsfolder/upcoming/fireblade_artist.txt b/forge-gui/res/cardsfolder/upcoming/fireblade_artist.txt index ba8a5ce6505..a75291fad70 100644 --- a/forge-gui/res/cardsfolder/upcoming/fireblade_artist.txt +++ b/forge-gui/res/cardsfolder/upcoming/fireblade_artist.txt @@ -4,6 +4,6 @@ Types:Creature Human Shaman PT:2/2 K:Haste T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSacrifice | TriggerDescription$ At the beginning of your upkeep, you may sacrifice a creature. When you do, CARDNAME deals 2 damage to target opponent or planeswalker. -SVar:TrigSacrifice:DB$ Sacrifice | Optional$ True | SacValid$ Creature | Amount$ 1 | AILogic$ CARDNAME +SVar:TrigSacrifice:DB$ Sacrifice | Optional$ True | SacValid$ Creature | Amount$ 1 SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Opponent,Planeswalker | TgtPrompt$ Select target opponent or planeswalker | NumDmg$ 2 Oracle:Haste\nAt the beginning of your upkeep, you may sacrifice a creature. When you do, Fireblade Artist deals 2 damage to target opponent or planeswalker. diff --git a/forge-gui/res/cardsfolder/upcoming/kaya_orzhov_usurper.txt b/forge-gui/res/cardsfolder/upcoming/kaya_orzhov_usurper.txt index a4ad4753f09..09ef6b8cd66 100644 --- a/forge-gui/res/cardsfolder/upcoming/kaya_orzhov_usurper.txt +++ b/forge-gui/res/cardsfolder/upcoming/kaya_orzhov_usurper.txt @@ -10,4 +10,5 @@ A:AB$ ChangeZone | Cost$ -1/-1/Card.nonLand/nonland permanent with converted man A:AB$ DealDamage | Cost$ PayLife<5/-5/Card> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Player | NumDmg$ X | References$ X | SubAbility$ DBYouGainLife | SpellDescription$ CARDNAME deals damage to target player equal to the number of cards that player owns in exile and you gain that much life. SVar:DBYouGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X SVar:X:TargetedPlayer$CardsInExile +DeckHas:Ability$LifeGain Oracle:[+1]: Exile up to two target cards from a single graveyard. You gain 2 life if at least one creature card was exiled this way.\n[-1]: Exile target nonland permanent with converted mana cost 1 or less.\n[-5]: Kaya, Orzhov Usurper deals damage to target player equal to the number of cards that player owns in exile and you gain that much life. diff --git a/forge-gui/res/cardsfolder/upcoming/kayas_wrath.txt b/forge-gui/res/cardsfolder/upcoming/kayas_wrath.txt index 2a411a0bf18..f843c6c1ac5 100644 --- a/forge-gui/res/cardsfolder/upcoming/kayas_wrath.txt +++ b/forge-gui/res/cardsfolder/upcoming/kayas_wrath.txt @@ -4,4 +4,5 @@ Types:Sorcery A:SP$ DestroyAll | Cost$ W W B B | ValidCards$ Creature | RememberDestroyed$ True | SubAbility$ DBGainLife | SpellDescription$ Destroy all creatures. You gain life equal to the number of creatures you controlled that were destroyed this way. SVar:DBGainLife:DB$ GainLife | LifeAmount$ X | References$ X SVar:X:RememberedLKI$FilterControlledByRemembered_Number$1 +DeckHas:Ability$LifeGain Oracle:Destroy all creatures. You gain life equal to the number of creatures you controlled that were destroyed this way. diff --git a/forge-gui/res/cardsfolder/upcoming/mesmerizing_benthid.txt b/forge-gui/res/cardsfolder/upcoming/mesmerizing_benthid.txt index 7187cc3021e..e893aa87cb5 100644 --- a/forge-gui/res/cardsfolder/upcoming/mesmerizing_benthid.txt +++ b/forge-gui/res/cardsfolder/upcoming/mesmerizing_benthid.txt @@ -9,4 +9,6 @@ SVar:RemRandomDeck:True S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Hexproof | CheckSVar$ X | SVarCompare$ GE1 | Description$ CARDNAME has hexproof as long as you control an Illusion. SVar:X:Count$Valid Illusion.YouCtrl SVar:BuffedBy:Illusion +DeckHas:Ability$Token +DeckHints:Type$Illusion Oracle:When Mesmerizing Benthid enters the battlefield, create two 0/2 blue Illusion creature tokens with "Whenever this creature blocks a creature, that creature doesn't untap during its controller's next untap step."\nMesmerizing Benthid has hexproof as long as you control an Illusion. diff --git a/forge-gui/res/cardsfolder/upcoming/mirror_march.txt b/forge-gui/res/cardsfolder/upcoming/mirror_march.txt index 3c4ab33701a..2dec7304ab9 100644 --- a/forge-gui/res/cardsfolder/upcoming/mirror_march.txt +++ b/forge-gui/res/cardsfolder/upcoming/mirror_march.txt @@ -5,4 +5,5 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creatu SVar:TrigFlipACoin:DB$FlipACoin | FlipUntilYouLose$ True | SaveNumFlipsToSVar$ MirrorAmount | NoCall$ True | LoseSubAbility$ DBCopies SVar:DBCopies:DB$ CopyPermanent | PumpKeywords$ Haste | AtEOT$ Exile | Defined$ TriggeredCard | NumCopies$ MirrorAmount SVar:MirrorAmount:Number$0 +DeckHas:Ability$Token Oracle:Whenever a nontoken creature enters the battlefield under your control, flip a coin until you lose a flip. For each flip you won, create a token that's a copy of that creature. Those tokens gain haste. Exile them at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/upcoming/rakdos_the_showstopper.txt b/forge-gui/res/cardsfolder/upcoming/rakdos_the_showstopper.txt index 9fa6b78a92b..5925680ff5d 100644 --- a/forge-gui/res/cardsfolder/upcoming/rakdos_the_showstopper.txt +++ b/forge-gui/res/cardsfolder/upcoming/rakdos_the_showstopper.txt @@ -7,5 +7,6 @@ K:Trample T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFlip | TriggerDescription$ When CARDNAME enters the battlefield, flip a coin for each creature that isn't a Demon, Dragons, or coins. Destroy each creature whose coin comes up tails. SVar:TrigFlip:DB$ FlipACoin | FlipUntilYouLose$ True | SaveNumFlipsToSVar$ X | LoseSubAbility$ DBDestroy SVar:DBDestroy:DB$ DestroyAll | ValidCards$ Creature.IsNotChosenType | References$ X +# -- THIS LINE NEEDS FIXING (doesn't reference the types correctly) -- SVar:X:Count$Valid Creature.isn Oracle:Flying, trample\nWhen Rakdos, the Showstopper enters the battlefield, flip a coin for each creature that isn't a Demon, Devil, or Imp. Destroy each creature whose coin comes up tails. diff --git a/forge-gui/res/cardsfolder/upcoming/repudiate_replicate.txt b/forge-gui/res/cardsfolder/upcoming/repudiate_replicate.txt index 7d8b9e7e81b..703e617ab39 100644 --- a/forge-gui/res/cardsfolder/upcoming/repudiate_replicate.txt +++ b/forge-gui/res/cardsfolder/upcoming/repudiate_replicate.txt @@ -12,4 +12,5 @@ Name:Replicate ManaCost:1 G U Types:Sorcery A:SP$ CopyPermanent | Cost$ 1 G U | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | SpellDescription$ Create a token that's a copy of target creature you control. +DeckHas:Ability$Token Oracle:Create a token that’s a copy of target creature you control. diff --git a/forge-gui/res/cardsfolder/upcoming/rumbling_ruin.txt b/forge-gui/res/cardsfolder/upcoming/rumbling_ruin.txt index 1b5afe60ff8..b372bbcb6fa 100644 --- a/forge-gui/res/cardsfolder/upcoming/rumbling_ruin.txt +++ b/forge-gui/res/cardsfolder/upcoming/rumbling_ruin.txt @@ -5,4 +5,5 @@ PT:6/6 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigEffect | TriggerDescription$ When CARDNAME enters the battlefield, your number of +1/+1 counters on creatures you control. Creatures your opponents control with power less than or equal to that number can't block this turn. SVar:TrigEffect:DB$Effect | Name$ CARDNAME Effect | StaticAbilities$ KWPump SVar:KWPump:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl+powerLTY | AddHiddenKeyword$ CARDNAME can't block. | Description$ Creatures your opponents control with power less than or equal to that number can't block this turn. +# -- THIS SCRIPT NEEDS FIXING (doesn't have the count var) -- Oracle:When Rumbling Ruin enters the battlefield, count the number of +1/+1 counters on creatures you control. Creatures your opponents control with power less than or equal to that number can't block this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/smothering_tithe.txt b/forge-gui/res/cardsfolder/upcoming/smothering_tithe.txt index 9f9e33bcdc1..fb1ecc53237 100644 --- a/forge-gui/res/cardsfolder/upcoming/smothering_tithe.txt +++ b/forge-gui/res/cardsfolder/upcoming/smothering_tithe.txt @@ -2,6 +2,8 @@ Name:Smothering Tithe ManaCost:3 W Types:Enchantment T:Mode$ Drawn | ValidCard$ Card.OppOwn | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever an opponent draws a card, that player may pay {2}. If the player doesn't, you create a colorless Treasure artifact token with flying{T}, Sacrifice this artifact: Add one mana of any color. +# -- THIS SCRIPT NEEDS FIXING (the Unless cost part isn't defined, token definition is odd below) SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenName$ Treasure | TokenTypes$ Artifact,Treasure | TokenOwner$ TriggeredPlayer | TokenColors$ Colorless | TokenImage$ c treasure | TokenAbilities$ ABTreasureMana | TokenAltImages$ c_treasure2,c_treasure3,c_treasure4 -SVar:ABTreasureMana:DB$ Token | TokenAmount$ 1 | TokenName$ +SVar:ABTreasureMana:DB$ Token | TokenAmount$ 1 | TokenName$ +DeckHas:Ability$Token Oracle:Whenever an opponent draws a card, that player may pay {2}. If the player doesn't, you create a colorless Treasure artifact token with "{T}, Sacrifice this artifact: Add one mana of any color." diff --git a/forge-gui/res/cardsfolder/upcoming/thrash_threat.txt b/forge-gui/res/cardsfolder/upcoming/thrash_threat.txt index edebe152dde..0512ba7b66a 100644 --- a/forge-gui/res/cardsfolder/upcoming/thrash_threat.txt +++ b/forge-gui/res/cardsfolder/upcoming/thrash_threat.txt @@ -13,4 +13,5 @@ Name:Threat ManaCost:2 R G Types:Sorcery A:SP$ Token | Cost$ 2 R G | TokenAmount$ 1 | TokenOwner$ You | TokenScript$ rg_4_4_beast_trample | SpellDescription$ Create a 4/4 red and green Beast creature token with trample. +DeckHas:Ability$Token Oracle:Create a 4/4 red and green Beast creature token with trample. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/warrant_warden.txt b/forge-gui/res/cardsfolder/upcoming/warrant_warden.txt index 614c5d7126b..a1d1b60c01a 100644 --- a/forge-gui/res/cardsfolder/upcoming/warrant_warden.txt +++ b/forge-gui/res/cardsfolder/upcoming/warrant_warden.txt @@ -11,6 +11,7 @@ Name:Warden ManaCost:3 W U Types:Sorcery A:SP$ Token | Cost$ 3 W U | TokenAmount$ 1 | TokenOwner$ You | TokenScript$ wu_4_4_sphinx_flying_vigilance | SpellDescription$ Create a 4/4 white and blue Sphinx creature token with flying and vigilance. +DeckHas:Ability$Token Oracle:Create a 4/4 white and blue Sphinx creature token with flying and vigilance. From 7ebe97f8023f8de5419ee48014536fc24a09b024 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 24 Jan 2019 08:27:54 +0300 Subject: [PATCH 664/901] - Added TODO labels. --- forge-gui/res/cardsfolder/upcoming/captive_audience.txt | 2 +- forge-gui/res/cardsfolder/upcoming/rakdos_the_showstopper.txt | 2 +- forge-gui/res/cardsfolder/upcoming/rumbling_ruin.txt | 2 +- forge-gui/res/cardsfolder/upcoming/smothering_tithe.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/captive_audience.txt b/forge-gui/res/cardsfolder/upcoming/captive_audience.txt index 1c69175352c..d5eeb9922a9 100644 --- a/forge-gui/res/cardsfolder/upcoming/captive_audience.txt +++ b/forge-gui/res/cardsfolder/upcoming/captive_audience.txt @@ -1,4 +1,4 @@ -# -- THIS SCRIPT NEEDS REWRITING (non-functional) -- +# TODO: -- THIS SCRIPT NEEDS REWRITING (non-functional) -- Name:Captive Audience ManaCost:5 B R Types:Enchantment diff --git a/forge-gui/res/cardsfolder/upcoming/rakdos_the_showstopper.txt b/forge-gui/res/cardsfolder/upcoming/rakdos_the_showstopper.txt index 5925680ff5d..3fde626857d 100644 --- a/forge-gui/res/cardsfolder/upcoming/rakdos_the_showstopper.txt +++ b/forge-gui/res/cardsfolder/upcoming/rakdos_the_showstopper.txt @@ -7,6 +7,6 @@ K:Trample T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFlip | TriggerDescription$ When CARDNAME enters the battlefield, flip a coin for each creature that isn't a Demon, Dragons, or coins. Destroy each creature whose coin comes up tails. SVar:TrigFlip:DB$ FlipACoin | FlipUntilYouLose$ True | SaveNumFlipsToSVar$ X | LoseSubAbility$ DBDestroy SVar:DBDestroy:DB$ DestroyAll | ValidCards$ Creature.IsNotChosenType | References$ X -# -- THIS LINE NEEDS FIXING (doesn't reference the types correctly) -- +# TODO: -- THIS LINE NEEDS FIXING (doesn't reference the types correctly) -- SVar:X:Count$Valid Creature.isn Oracle:Flying, trample\nWhen Rakdos, the Showstopper enters the battlefield, flip a coin for each creature that isn't a Demon, Devil, or Imp. Destroy each creature whose coin comes up tails. diff --git a/forge-gui/res/cardsfolder/upcoming/rumbling_ruin.txt b/forge-gui/res/cardsfolder/upcoming/rumbling_ruin.txt index b372bbcb6fa..36747d0c27c 100644 --- a/forge-gui/res/cardsfolder/upcoming/rumbling_ruin.txt +++ b/forge-gui/res/cardsfolder/upcoming/rumbling_ruin.txt @@ -5,5 +5,5 @@ PT:6/6 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigEffect | TriggerDescription$ When CARDNAME enters the battlefield, your number of +1/+1 counters on creatures you control. Creatures your opponents control with power less than or equal to that number can't block this turn. SVar:TrigEffect:DB$Effect | Name$ CARDNAME Effect | StaticAbilities$ KWPump SVar:KWPump:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl+powerLTY | AddHiddenKeyword$ CARDNAME can't block. | Description$ Creatures your opponents control with power less than or equal to that number can't block this turn. -# -- THIS SCRIPT NEEDS FIXING (doesn't have the count var) -- +# TODO: -- THIS SCRIPT NEEDS FIXING (doesn't have the count var) -- Oracle:When Rumbling Ruin enters the battlefield, count the number of +1/+1 counters on creatures you control. Creatures your opponents control with power less than or equal to that number can't block this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/smothering_tithe.txt b/forge-gui/res/cardsfolder/upcoming/smothering_tithe.txt index fb1ecc53237..a171c4c0d33 100644 --- a/forge-gui/res/cardsfolder/upcoming/smothering_tithe.txt +++ b/forge-gui/res/cardsfolder/upcoming/smothering_tithe.txt @@ -2,7 +2,7 @@ Name:Smothering Tithe ManaCost:3 W Types:Enchantment T:Mode$ Drawn | ValidCard$ Card.OppOwn | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever an opponent draws a card, that player may pay {2}. If the player doesn't, you create a colorless Treasure artifact token with flying{T}, Sacrifice this artifact: Add one mana of any color. -# -- THIS SCRIPT NEEDS FIXING (the Unless cost part isn't defined, token definition is odd below) +# TODO: -- THIS SCRIPT NEEDS FIXING (the Unless cost part isn't defined, token definition is odd below) SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenName$ Treasure | TokenTypes$ Artifact,Treasure | TokenOwner$ TriggeredPlayer | TokenColors$ Colorless | TokenImage$ c treasure | TokenAbilities$ ABTreasureMana | TokenAltImages$ c_treasure2,c_treasure3,c_treasure4 SVar:ABTreasureMana:DB$ Token | TokenAmount$ 1 | TokenName$ DeckHas:Ability$Token From 5901c6b66b4017e6a51f91be179e3fcf24a0131f Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 24 Jan 2019 08:38:11 +0300 Subject: [PATCH 665/901] - Restore AI SVars. --- forge-gui/res/cardsfolder/upcoming/smothering_tithe.txt | 3 ++- forge-gui/res/cardsfolder/upcoming/thrash_threat.txt | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/smothering_tithe.txt b/forge-gui/res/cardsfolder/upcoming/smothering_tithe.txt index fe24282b545..86a3ac8b876 100644 --- a/forge-gui/res/cardsfolder/upcoming/smothering_tithe.txt +++ b/forge-gui/res/cardsfolder/upcoming/smothering_tithe.txt @@ -2,5 +2,6 @@ Name:Smothering Tithe ManaCost:3 W Types:Enchantment T:Mode$ Drawn | ValidCard$ Card.OppOwn | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever an opponent draws a card, that player may pay {2}. If the player doesn't, you create a colorless Treasure artifact token with flying{T}, Sacrifice this artifact: Add one mana of any color. -SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_treasure_sac | TokenOwner$ TriggeredPlayer | LegacyImage$ c a treasure sac +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_treasure_sac | TokenOwner$ TriggeredPlayer | LegacyImage$ c treasure +DeckHas:Ability$Token Oracle:Whenever an opponent draws a card, that player may pay {2}. If the player doesn't, you create a colorless Treasure artifact token with "{T}, Sacrifice this artifact: Add one mana of any color." diff --git a/forge-gui/res/cardsfolder/upcoming/thrash_threat.txt b/forge-gui/res/cardsfolder/upcoming/thrash_threat.txt index 14706116cf1..4f7b1c76af3 100644 --- a/forge-gui/res/cardsfolder/upcoming/thrash_threat.txt +++ b/forge-gui/res/cardsfolder/upcoming/thrash_threat.txt @@ -13,4 +13,5 @@ Name:Threat ManaCost:2 R G Types:Sorcery A:SP$ Token | Cost$ 2 R G | TokenAmount$ 1 | TokenOwner$ You | TokenScript$ rg_4_4_beast_trample | LegacyImage$ rg 4 4 beast trample rna | SpellDescription$ Create a 4/4 red and green Beast creature token with trample. +DeckHas:Ability$Token Oracle:Create a 4/4 red and green Beast creature token with trample. \ No newline at end of file From 96e61114000048bed3a9ac32fb07381b18a97729 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Wed, 23 Jan 2019 22:23:44 +0100 Subject: [PATCH 666/901] Riot: Make Riot Enchantment look into the future --- .../src/main/java/forge/game/GameAction.java | 28 ++++++++++ .../src/main/java/forge/game/card/Card.java | 11 +++- .../forge/game/keyword/KeywordCollection.java | 8 +++ .../forge/game/keyword/KeywordInstance.java | 26 ++++++++- .../forge/game/keyword/KeywordInterface.java | 1 + .../forge/game/keyword/KeywordsChange.java | 56 +++++++++++++++++-- .../forge/game/replacement/ReplaceMoved.java | 2 +- .../ai/simulation/GameSimulatorTest.java | 19 +++++++ .../match/input/InputSelectFromTwoLists.java | 2 +- 9 files changed, 142 insertions(+), 11 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 740f2d0c4af..1693ee24b07 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -29,6 +29,7 @@ import forge.game.ability.effects.AttachEffect; import forge.game.card.*; import forge.game.event.*; import forge.game.keyword.KeywordInterface; +import forge.game.keyword.KeywordsChange; import forge.game.player.GameLossReason; import forge.game.player.Player; import forge.game.replacement.ReplacementEffect; @@ -292,6 +293,33 @@ public class GameAction { copied.getOwner().addInboundToken(copied); } + if (toBattlefield) { + // HACK for making the RIOT enchantment look into the Future + // need to check the Keywords what it would have on the Battlefield + Card riotLKI = CardUtil.getLKICopy(copied); + riotLKI.setLastKnownZone(zoneTo); + CardCollection preList = new CardCollection(riotLKI); + checkStaticAbilities(false, Sets.newHashSet(riotLKI), preList); + + List changedTimeStamps = Lists.newArrayList(); + for(Map.Entry e : riotLKI.getChangedCardKeywords().entrySet()) { + if (!copied.hasChangedCardKeywords(e.getKey())) { + KeywordsChange o = e.getValue(); + o.setHostCard(copied); + for (KeywordInterface k : o.getKeywords()) { + for (ReplacementEffect re : k.getReplacements()) { + // this param need to be set, otherwise in ReplaceMoved it fails + re.getMapParams().put("BypassEtbCheck", "True"); + } + } + copied.addChangedCardKeywordsInternal(o, e.getKey()); + changedTimeStamps.add(e.getKey()); + } + } + + checkStaticAbilities(false); + } + Map repParams = Maps.newHashMap(); repParams.put("Event", "Moved"); repParams.put("Affected", copied); diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 8ded947cd48..43c55323e7d 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -3404,6 +3404,15 @@ public class Card extends GameEntity implements Comparable { return change; } + public final boolean hasChangedCardKeywords(final long timestamp) { + return changedCardKeywords.containsKey(timestamp); + } + + public final void addChangedCardKeywordsInternal(final KeywordsChange change, final long timestamp) { + changedCardKeywords.put(timestamp, change); + updateKeywordsCache(currentState); + } + // Hidden keywords will be left out public final Collection getUnhiddenKeywords() { return getUnhiddenKeywords(currentState); @@ -5731,7 +5740,7 @@ public class Card extends GameEntity implements Comparable { public void setChangedCardKeywords(Map changedCardKeywords) { this.changedCardKeywords.clear(); for (Entry entry : changedCardKeywords.entrySet()) { - this.changedCardKeywords.put(entry.getKey(), entry.getValue()); + this.changedCardKeywords.put(entry.getKey(), entry.getValue().copy(this, true)); } } diff --git a/forge-game/src/main/java/forge/game/keyword/KeywordCollection.java b/forge-game/src/main/java/forge/game/keyword/KeywordCollection.java index 98623cf6d72..e7c8f0ea745 100644 --- a/forge-game/src/main/java/forge/game/keyword/KeywordCollection.java +++ b/forge-game/src/main/java/forge/game/keyword/KeywordCollection.java @@ -8,6 +8,8 @@ import java.util.Iterator; import com.google.common.collect.Multimap; import com.google.common.collect.MultimapBuilder; +import forge.game.card.Card; + public class KeywordCollection implements Iterable, Serializable { private static final long serialVersionUID = -2882986558147844702L; @@ -151,6 +153,12 @@ public class KeywordCollection implements Iterable, Serializable { return map.get(keyword); } + public void setHostCard(final Card host) { + for (KeywordInterface k : map.values()) { + k.setHostCard(host); + } + } + @Override public Iterator iterator() { return new Iterator() { diff --git a/forge-game/src/main/java/forge/game/keyword/KeywordInstance.java b/forge-game/src/main/java/forge/game/keyword/KeywordInstance.java index 6c0d1072085..33bfe77dd56 100644 --- a/forge-game/src/main/java/forge/game/keyword/KeywordInstance.java +++ b/forge-game/src/main/java/forge/game/keyword/KeywordInstance.java @@ -202,7 +202,7 @@ public abstract class KeywordInstance> implements K public Collection getStaticAbilities() { return staticAbilities; } - + /* * (non-Javadoc) * @see forge.game.keyword.KeywordInterface#copy() @@ -233,7 +233,7 @@ public abstract class KeywordInstance> implements K return result; } catch (final Exception ex) { - throw new RuntimeException("KeywordInstance : clone() error, " + ex); + throw new RuntimeException("KeywordInstance : clone() error", ex); } } @@ -252,4 +252,26 @@ public abstract class KeywordInstance> implements K public boolean redundant(Collection list) { return !list.isEmpty() && keyword.isMultipleRedundant; } + + /* (non-Javadoc) + * @see forge.game.keyword.KeywordInterface#setHostCard(forge.game.card.Card) + */ + @Override + public void setHostCard(Card host) { + for (SpellAbility sa : this.abilities) { + sa.setHostCard(host); + } + + for (Trigger tr : this.triggers) { + tr.setHostCard(host); + } + + for (ReplacementEffect re : this.replacements) { + re.setHostCard(host); + } + + for (StaticAbility sa : this.staticAbilities) { + sa.setHostCard(host); + } + } } diff --git a/forge-game/src/main/java/forge/game/keyword/KeywordInterface.java b/forge-game/src/main/java/forge/game/keyword/KeywordInterface.java index 4830550f2b2..83ad9b87aa8 100644 --- a/forge-game/src/main/java/forge/game/keyword/KeywordInterface.java +++ b/forge-game/src/main/java/forge/game/keyword/KeywordInterface.java @@ -31,6 +31,7 @@ public interface KeywordInterface extends Cloneable { public void addSpellAbility(final SpellAbility s); public void addStaticAbility(final StaticAbility st); + public void setHostCard(final Card host); /** * @return the triggers diff --git a/forge-game/src/main/java/forge/game/keyword/KeywordsChange.java b/forge-game/src/main/java/forge/game/keyword/KeywordsChange.java index 292741c323c..7b8453b05be 100644 --- a/forge-game/src/main/java/forge/game/keyword/KeywordsChange.java +++ b/forge-game/src/main/java/forge/game/keyword/KeywordsChange.java @@ -30,12 +30,11 @@ import forge.game.card.Card; *

* * @author Forge - * @version $Id: KeywordsChange.java 27095 2014-08-17 07:32:24Z elcnesh $ */ -public class KeywordsChange { - private final KeywordCollection keywords = new KeywordCollection(); - private final List removeKeywordInterfaces = Lists.newArrayList(); - private final List removeKeywords = Lists.newArrayList(); +public class KeywordsChange implements Cloneable { + private KeywordCollection keywords = new KeywordCollection(); + private List removeKeywordInterfaces = Lists.newArrayList(); + private List removeKeywords = Lists.newArrayList(); private boolean removeAllKeywords; private boolean removeIntrinsicKeywords; @@ -63,7 +62,7 @@ public class KeywordsChange { this.removeAllKeywords = removeAll; this.removeIntrinsicKeywords = removeIntrinsic; } - + public KeywordsChange( final Collection keywordList, final Collection removeKeywordInterfaces, @@ -172,4 +171,49 @@ public class KeywordsChange { removeIntrinsicKeywords = true; } } + + public void setHostCard(final Card host) { + keywords.setHostCard(host); + for (KeywordInterface k : removeKeywordInterfaces) { + k.setHostCard(host); + } + } + + public KeywordsChange copy(final Card host, final boolean lki) { + try { + KeywordsChange result = (KeywordsChange)super.clone(); + + result.keywords = new KeywordCollection(); + for (KeywordInterface ki : this.keywords.getValues()) { + result.keywords.insert(ki.copy(host, lki)); + } + + result.removeKeywords = Lists.newArrayList(removeKeywords); + + result.removeKeywordInterfaces = Lists.newArrayList(); + for (KeywordInterface ki : this.removeKeywordInterfaces) { + removeKeywordInterfaces.add(ki.copy(host, lki)); + } + + return result; + } catch (final Exception ex) { + throw new RuntimeException("KeywordsChange : clone() error", ex); + } + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("<+"); + sb.append(this.keywords); + sb.append("|-"); + sb.append(this.removeKeywordInterfaces); + sb.append("|-"); + sb.append(this.removeKeywords); + sb.append(">"); + return sb.toString(); + } } diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceMoved.java b/forge-game/src/main/java/forge/game/replacement/ReplaceMoved.java index 963a7b0dd3e..d784653eee1 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceMoved.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceMoved.java @@ -76,7 +76,7 @@ public class ReplaceMoved extends ReplacementEffect { return false; } - if (zt.equals(ZoneType.Battlefield) && getHostCard().equals(affected)) { + if (zt.equals(ZoneType.Battlefield) && getHostCard().equals(affected) && !hasParam("BypassEtbCheck")) { // would be an etb replacement effect that enters the battlefield Card lki = CardUtil.getLKICopy(affected); lki.setLastKnownZone(lki.getController().getZone(zt)); 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 01c455a35ea..2ec7fffc06a 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 @@ -1503,4 +1503,23 @@ public class GameSimulatorTest extends SimulationTestCase { } + public void testRiotEnchantment() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + + addCard("Rhythm of the Wild", p); + + Card goblin = addCardToZone("Zhur-Taa Goblin", p, ZoneType.Hand); + + addCard("Mountain", p); + addCard("Forest", p); + + SpellAbility goblinSA = goblin.getFirstSpellAbility(); + assertNotNull(goblinSA); + + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(goblinSA).value; + assertTrue(score > 0); + } } diff --git a/forge-gui/src/main/java/forge/match/input/InputSelectFromTwoLists.java b/forge-gui/src/main/java/forge/match/input/InputSelectFromTwoLists.java index 5065b7ac111..90c6b717240 100644 --- a/forge-gui/src/main/java/forge/match/input/InputSelectFromTwoLists.java +++ b/forge-gui/src/main/java/forge/match/input/InputSelectFromTwoLists.java @@ -69,7 +69,7 @@ public class InputSelectFromTwoLists extends InputSelectMa if ( valid1.contains(s) ) { selected1 = true; } if ( valid2.contains(s) ) { selected2 = true; } } - validChoices = selected1 ? ( selected2 ? FCollection.getEmpty() : valid2 ) : ( selected2 ? valid1 : validBoth ); + validChoices = selected1 ? ( selected2 ? FCollection.getEmpty() : valid2 ) : ( selected2 ? valid1 : validBoth ); setSelectables(); FThreads.invokeInEdtNowOrLater(new Runnable() { @Override public void run() { From 1917871b98e0886e76c3d77d0147a5a96b93e067 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Thu, 24 Jan 2019 07:28:14 +0100 Subject: [PATCH 667/901] GameSimulatorTest: assert check for DoubleRiot --- .../java/forge/ai/simulation/GameSimulatorTest.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) 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 2ec7fffc06a..fdd5c7f4d35 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 @@ -1508,9 +1508,11 @@ public class GameSimulatorTest extends SimulationTestCase { Player p = game.getPlayers().get(0); game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + final String goblinName = "Zhur-Taa Goblin"; + addCard("Rhythm of the Wild", p); - Card goblin = addCardToZone("Zhur-Taa Goblin", p, ZoneType.Hand); + Card goblin = addCardToZone(goblinName, p, ZoneType.Hand); addCard("Mountain", p); addCard("Forest", p); @@ -1521,5 +1523,13 @@ public class GameSimulatorTest extends SimulationTestCase { GameSimulator sim = createSimulator(game, p); int score = sim.simulateSpellAbility(goblinSA).value; assertTrue(score > 0); + + Game simGame = sim.getSimulatedGameState(); + + Card simGoblin = findCardWithName(simGame, goblinName); + + assertNotNull(simGoblin); + int effects = simGoblin.getCounters(CounterType.P1P1) + simGoblin.getKeywordMagnitude(Keyword.HASTE); + assertTrue(effects == 2); } } From 2eae26cefb08cbfbf82158838cabc0e27e4f8613 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Mon, 21 Jan 2019 16:40:55 +0000 Subject: [PATCH 668/901] TriggerHandler: Only real die can look back Rework Panharmonicon --- .../src/main/java/forge/game/card/Card.java | 3 +- .../forge/game/trigger/TriggerHandler.java | 70 +++++++++++-------- .../forge/game/trigger/TriggerWaiting.java | 5 +- .../cardsfolder/n/naban_dean_of_iteration.txt | 2 +- forge-gui/res/cardsfolder/p/panharmonicon.txt | 2 +- .../res/cardsfolder/upcoming/teysa_karlov.txt | 2 +- 6 files changed, 46 insertions(+), 38 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 43c55323e7d..8f1343eeb31 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -1465,7 +1465,8 @@ public class Card extends GameEntity implements Comparable { } } } - if (keyword.startsWith("CantBeCounteredBy")) { + if (keyword.startsWith("CantBeCounteredBy") || keyword.startsWith("Panharmonicon") + || keyword.startsWith("Dieharmonicon")) { final String[] p = keyword.split(":"); sbLong.append(p[2]).append("\r\n"); } else if (keyword.startsWith("etbCounter")) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java index e08015d31df..31cfb4a1612 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -25,7 +25,9 @@ import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; import forge.game.ability.effects.CharmEffect; import forge.game.card.Card; +import forge.game.card.CardLists; import forge.game.card.CardUtil; +import forge.game.keyword.KeywordInterface; import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.spellability.Ability; @@ -376,11 +378,7 @@ public class TriggerHandler { // Static triggers for (final Trigger t : Lists.newArrayList(activeTriggers)) { if (t.isStatic() && canRunTrigger(t, mode, runParams)) { - int x = 1 + handlePanharmonicon(t, runParams); - - for (int i = 0; i < x; ++i) { - runSingleTrigger(t, runParams); - } + runSingleTrigger(t, runParams); checkStatics = true; } @@ -448,7 +446,7 @@ public class TriggerHandler { } } - int x = 1 + handlePanharmonicon(t, runParams);; + int x = 1 + handlePanharmonicon(t, runParams, player); for (int i = 0; i < x; ++i) { runSingleTrigger(t, runParams); @@ -692,45 +690,55 @@ public class TriggerHandler { } } - private int handlePanharmonicon(final Trigger t, final Map runParams) { - // Need to get the last info from the trigger host - final Card host = game.getChangeZoneLKIInfo(t.getHostCard()); - final Player p = host.getController(); + private int handlePanharmonicon(final Trigger t, final Map runParams, final Player p) { + Card host = t.getHostCard(); // not a changesZone trigger if (t.getMode() != TriggerType.ChangesZone) { return 0; } + // leave battlefield trigger, might be dying + if ("Battlefield".equals(t.getParam("Origin"))) { + // Need to get the last info from the trigger host + host = game.getChangeZoneLKIInfo(host); + } + // not a Permanent you control if (!host.isPermanent() || !host.isInZone(ZoneType.Battlefield)) { return 0; } int n = 0; - for (final String kw : p.getKeywords()) { - if (kw.startsWith("Panharmonicon")) { - // Enter the Battlefield Trigger - if (runParams.get("Destination") instanceof String) { - final String dest = (String) runParams.get("Destination"); - if ("Battlefield".equals(dest) && runParams.get("Card") instanceof Card) { - final Card card = (Card) runParams.get("Card"); - final String valid = kw.split(":")[1]; - if (card.isValid(valid.split(","), p, host, null)) { - n++; + // iterate over all cards + final List lastCards = CardLists.filterControlledBy(p.getGame().getLastStateBattlefield(), p); + for (final Card ck : lastCards) { + for (final KeywordInterface ki : ck.getKeywords()) { + final String kw = ki.getOriginal(); + if (kw.startsWith("Panharmonicon")) { + // Enter the Battlefield Trigger + if (runParams.get("Destination") instanceof String) { + final String dest = (String) runParams.get("Destination"); + if ("Battlefield".equals(dest) && runParams.get("Card") instanceof Card) { + final Card card = (Card) runParams.get("Card"); + final String valid = kw.split(":")[1]; + if (card.isValid(valid.split(","), p, ck, null)) { + n++; + } } } - } - } else if (kw.startsWith("Dieharmonicon")) { - // 700.4. The term dies means “is put into a graveyard from the battlefield.” - if (runParams.get("Origin") instanceof String) { - final String origin = (String) runParams.get("Origin"); - if ("Battlefield".equals(origin) && runParams.get("Destination") instanceof String) { - final String dest = (String) runParams.get("Destination"); - if ("Graveyard".equals(dest) && runParams.get("Card") instanceof Card) { - final Card card = (Card) runParams.get("Card"); - if (card.isCreature()) { - n++; + } else if (kw.startsWith("Dieharmonicon")) { + // 700.4. The term dies means “is put into a graveyard from the battlefield.” + if (runParams.get("Origin") instanceof String) { + final String origin = (String) runParams.get("Origin"); + if ("Battlefield".equals(origin) && runParams.get("Destination") instanceof String) { + final String dest = (String) runParams.get("Destination"); + if ("Graveyard".equals(dest) && runParams.get("Card") instanceof Card) { + final Card card = (Card) runParams.get("Card"); + final String valid = kw.split(":")[1]; + if (card.isValid(valid.split(","), p, ck, null)) { + n++; + } } } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerWaiting.java b/forge-game/src/main/java/forge/game/trigger/TriggerWaiting.java index 565ab2f0b57..0bf489d05fd 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerWaiting.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerWaiting.java @@ -13,7 +13,7 @@ public class TriggerWaiting { private Map params; private List triggers = null; - public TriggerWaiting(TriggerType m, Map p) { + public TriggerWaiting(TriggerType m, Map p) { mode = m; params = p; } @@ -25,7 +25,6 @@ public class TriggerWaiting { public Map getParams() { return params; } - public List getTriggers() { return triggers; @@ -35,7 +34,7 @@ public class TriggerWaiting { this.triggers = triggers; } - @Override + @Override public String toString() { return TextUtil.concatWithSpace("Waiting trigger:", mode.toString(),"with", params.toString()); } diff --git a/forge-gui/res/cardsfolder/n/naban_dean_of_iteration.txt b/forge-gui/res/cardsfolder/n/naban_dean_of_iteration.txt index 1b169abc441..e1606a06d8f 100644 --- a/forge-gui/res/cardsfolder/n/naban_dean_of_iteration.txt +++ b/forge-gui/res/cardsfolder/n/naban_dean_of_iteration.txt @@ -2,7 +2,7 @@ Name:Naban, Dean of Iteration ManaCost:1 U Types:Legendary Creature Human Wizard PT:2/1 -S:Mode$ Continuous | Affected$ You | AddKeyword$ Panharmonicon:Wizard.YouCtrl | Description$ If a Wizard entering the battlefield under your control causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time. +K:Panharmonicon:Wizard.YouCtrl:If a Wizard entering the battlefield under your control causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time. DeckHints:Type$Wizard SVar:Picture:http://www.wizards.com/global/images/magic/general/naban_dean_of_iteration.jpg Oracle:If a Wizard entering the battlefield under your control causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time. diff --git a/forge-gui/res/cardsfolder/p/panharmonicon.txt b/forge-gui/res/cardsfolder/p/panharmonicon.txt index ebe29c22590..5cde6b7f7cb 100644 --- a/forge-gui/res/cardsfolder/p/panharmonicon.txt +++ b/forge-gui/res/cardsfolder/p/panharmonicon.txt @@ -1,6 +1,6 @@ Name:Panharmonicon ManaCost:4 Types:Artifact -S:Mode$ Continuous | Affected$ You | AddKeyword$ Panharmonicon:Creature,Artifact | Description$ If an artifact or creature entering the battlefield causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time. +K:Panharmonicon:Creature,Artifact:If an artifact or creature entering the battlefield causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time. SVar:Picture:http://www.wizards.com/global/images/magic/general/panharmonicon.jpg Oracle:If an artifact or creature entering the battlefield causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time. diff --git a/forge-gui/res/cardsfolder/upcoming/teysa_karlov.txt b/forge-gui/res/cardsfolder/upcoming/teysa_karlov.txt index cc63eea3839..bc52f882a8f 100644 --- a/forge-gui/res/cardsfolder/upcoming/teysa_karlov.txt +++ b/forge-gui/res/cardsfolder/upcoming/teysa_karlov.txt @@ -2,7 +2,7 @@ Name:Teysa Karlov ManaCost:2 W B Types:Legendary Creature Human Advisor PT:2/4 -S:Mode$ Continuous | Affected$ You | AddKeyword$ Dieharmonicon | Description$ If a creature dying causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time. +K:Dieharmonicon:Creature:If a creature dying causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time. S:Mode$ Continuous | Affected$ Creature.token+YouCtrl | AddKeyword$ Vigilance & Lifelink | Description$ Creature tokens you control have vigilance and lifelink. DeckHints:Ability$Token Oracle:If a creature dying causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time.\nCreature tokens you control have vigilance and lifelink. From 7006c548a55e14058e2410d198a9cb091780dae9 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Tue, 22 Jan 2019 13:09:00 +0000 Subject: [PATCH 669/901] GameSimulatorTest: Teysa Karlov and Xathrid Necromancer --- .../ai/simulation/GameSimulatorTest.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) 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 fdd5c7f4d35..290f03a457c 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 @@ -1532,4 +1532,33 @@ public class GameSimulatorTest extends SimulationTestCase { int effects = simGoblin.getCounters(CounterType.P1P1) + simGoblin.getKeywordMagnitude(Keyword.HASTE); assertTrue(effects == 2); } + + public void testTeysaKarlovXathridNecromancer() { + // Teysa Karlov and Xathrid Necromancer dying at the same time makes 4 token + + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + + addCard("Teysa Karlov", p); + addCard("Xathrid Necromancer", p); + + for (int i = 0; i < 4; i++) { + addCardToZone("Plains", p, ZoneType.Battlefield); + } + + Card wrathOfGod = addCardToZone("Wrath of God", p, ZoneType.Hand); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + + SpellAbility wrathSA = wrathOfGod.getFirstSpellAbility(); + assertNotNull(wrathSA); + + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(wrathSA).value; + assertTrue(score > 0); + Game simGame = sim.getSimulatedGameState(); + + int numZombies = countCardsWithName(simGame, "Zombie"); + assertTrue(numZombies == 4); + } } From b6019c630850e3c98011e686dcb8a3af821f2448 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Wed, 23 Jan 2019 08:08:56 +0100 Subject: [PATCH 670/901] GameSimulatorTest: second test for Teysa --- .../ai/simulation/GameSimulatorTest.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) 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 290f03a457c..5493b7da670 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 @@ -1561,4 +1561,32 @@ public class GameSimulatorTest extends SimulationTestCase { int numZombies = countCardsWithName(simGame, "Zombie"); assertTrue(numZombies == 4); } + + public void testDoubleTeysaKarlovXathridNecromancer() { + // Teysa Karlov dieing because of Legendary rule will make Xathrid Necromancer trigger 3 times + + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + + addCard("Teysa Karlov", p); + addCard("Xathrid Necromancer", p); + + for (int i = 0; i < 3; i++) { + addCard("Plains", p); + } + addCard("Swamp", p); + + Card second = addCardToZone("Teysa Karlov", p, ZoneType.Hand); + + SpellAbility secondSA = second.getFirstSpellAbility(); + + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(secondSA).value; + assertTrue(score > 0); + Game simGame = sim.getSimulatedGameState(); + + int numZombies = countCardsWithName(simGame, "Zombie"); + assertTrue(numZombies == 3); + } } From 9778f9e3a014cbefdff0aeca1000bdb56e3a0ce8 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Thu, 24 Jan 2019 16:12:33 +0000 Subject: [PATCH 671/901] Teysa and Gitrog fixes --- .../java/forge/game/card/CardZoneTable.java | 36 ++++++ .../game/trigger/TriggerChangesZoneAll.java | 43 ++----- .../forge/game/trigger/TriggerHandler.java | 79 ++++++++----- .../ai/simulation/GameSimulatorTest.java | 107 ++++++++++++++++++ 4 files changed, 203 insertions(+), 62 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/CardZoneTable.java b/forge-game/src/main/java/forge/game/card/CardZoneTable.java index fbec5fa601e..720d5d5737b 100644 --- a/forge-game/src/main/java/forge/game/card/CardZoneTable.java +++ b/forge-game/src/main/java/forge/game/card/CardZoneTable.java @@ -11,6 +11,7 @@ import com.google.common.collect.Maps; import com.google.common.collect.Table; import forge.game.Game; +import forge.game.spellability.SpellAbility; import forge.game.trigger.TriggerType; import forge.game.zone.ZoneType; @@ -45,4 +46,39 @@ public class CardZoneTable extends ForwardingTable origin, ZoneType destination, String valid, Card host, SpellAbility sa) { + CardCollection allCards = new CardCollection(); + if (destination != null) { + if (!containsColumn(destination)) { + return allCards; + } + } + if (origin != null) { + for (ZoneType z : origin) { + if (containsRow(z)) { + if (destination != null) { + allCards.addAll(row(z).get(destination)); + } else { + for (CardCollection c : row(z).values()) { + allCards.addAll(c); + } + } + } + } + } else if (destination != null) { + for (CardCollection c : column(destination).values()) { + allCards.addAll(c); + } + } else { + for (CardCollection c : values()) { + allCards.addAll(c); + } + } + + if (valid != null) { + allCards = CardLists.getValidCards(allCards, valid.split(","), host.getController(), host, sa); + } + return allCards; + } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java index 3651c3d9ae7..0993e8dae29 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java @@ -42,48 +42,19 @@ public class TriggerChangesZoneAll extends Trigger { } private CardCollection filterCards(CardZoneTable table) { - CardCollection allCards = new CardCollection(); ZoneType destination = null; + List origin = null; - if (hasParam("Destination")) { - if (!getParam("Destination").equals("Any")) { - destination = ZoneType.valueOf(getParam("Destination")); - if (!table.containsColumn(destination)) { - return allCards; - } - } + if (hasParam("Destination") && !getParam("Destination").equals("Any")) { + destination = ZoneType.valueOf(getParam("Destination")); } if (hasParam("Origin") && !getParam("Origin").equals("Any")) { - if (getParam("Origin") == null) { - return allCards; - } - final List origin = ZoneType.listValueOf(getParam("Origin")); - for (ZoneType z : origin) { - if (table.containsRow(z)) { - if (destination != null) { - allCards.addAll(table.row(z).get(destination)); - } else { - for (CardCollection c : table.row(z).values()) { - allCards.addAll(c); - } - } - } - } - } else if (destination != null) { - for (CardCollection c : table.column(destination).values()) { - allCards.addAll(c); - } - } else { - for (CardCollection c : table.values()) { - allCards.addAll(c); - } + origin = ZoneType.listValueOf(getParam("Origin")); } - if (hasParam("ValidCards")) { - allCards = CardLists.getValidCards(allCards, getParam("ValidCards").split(","), - getHostCard().getController(), getHostCard(), null); - } - return allCards; + final String valid = this.getParamOrDefault("ValidCards", null); + + return table.filterCards(origin, destination, valid, getHostCard(), null); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java index 31cfb4a1612..308b373411d 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -27,6 +27,7 @@ import forge.game.ability.effects.CharmEffect; import forge.game.card.Card; import forge.game.card.CardLists; import forge.game.card.CardUtil; +import forge.game.card.CardZoneTable; import forge.game.keyword.KeywordInterface; import forge.game.phase.PhaseType; import forge.game.player.Player; @@ -44,6 +45,7 @@ import io.sentry.event.BreadcrumbBuilder; import java.util.*; import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ListMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -693,13 +695,14 @@ public class TriggerHandler { private int handlePanharmonicon(final Trigger t, final Map runParams, final Player p) { Card host = t.getHostCard(); - // not a changesZone trigger - if (t.getMode() != TriggerType.ChangesZone) { + // not a changesZone trigger or changesZoneAll + if (t.getMode() != TriggerType.ChangesZone && t.getMode() != TriggerType.ChangesZoneAll) { return 0; } // leave battlefield trigger, might be dying - if ("Battlefield".equals(t.getParam("Origin"))) { + // only real changeszone look back for this + if (t.getMode() == TriggerType.ChangesZone && "Battlefield".equals(t.getParam("Origin"))) { // Need to get the last info from the trigger host host = game.getChangeZoneLKIInfo(host); } @@ -710,30 +713,17 @@ public class TriggerHandler { } int n = 0; - // iterate over all cards - final List lastCards = CardLists.filterControlledBy(p.getGame().getLastStateBattlefield(), p); - for (final Card ck : lastCards) { - for (final KeywordInterface ki : ck.getKeywords()) { - final String kw = ki.getOriginal(); - if (kw.startsWith("Panharmonicon")) { - // Enter the Battlefield Trigger - if (runParams.get("Destination") instanceof String) { - final String dest = (String) runParams.get("Destination"); - if ("Battlefield".equals(dest) && runParams.get("Card") instanceof Card) { - final Card card = (Card) runParams.get("Card"); - final String valid = kw.split(":")[1]; - if (card.isValid(valid.split(","), p, ck, null)) { - n++; - } - } - } - } else if (kw.startsWith("Dieharmonicon")) { - // 700.4. The term dies means “is put into a graveyard from the battlefield.” - if (runParams.get("Origin") instanceof String) { - final String origin = (String) runParams.get("Origin"); - if ("Battlefield".equals(origin) && runParams.get("Destination") instanceof String) { + if (t.getMode() == TriggerType.ChangesZone) { + // iterate over all cards + final List lastCards = CardLists.filterControlledBy(p.getGame().getLastStateBattlefield(), p); + for (final Card ck : lastCards) { + for (final KeywordInterface ki : ck.getKeywords()) { + final String kw = ki.getOriginal(); + if (kw.startsWith("Panharmonicon")) { + // Enter the Battlefield Trigger + if (runParams.get("Destination") instanceof String) { final String dest = (String) runParams.get("Destination"); - if ("Graveyard".equals(dest) && runParams.get("Card") instanceof Card) { + if ("Battlefield".equals(dest) && runParams.get("Card") instanceof Card) { final Card card = (Card) runParams.get("Card"); final String valid = kw.split(":")[1]; if (card.isValid(valid.split(","), p, ck, null)) { @@ -741,6 +731,43 @@ public class TriggerHandler { } } } + } else if (kw.startsWith("Dieharmonicon")) { + // 700.4. The term dies means “is put into a graveyard from the battlefield.” + if (runParams.get("Origin") instanceof String) { + final String origin = (String) runParams.get("Origin"); + if ("Battlefield".equals(origin) && runParams.get("Destination") instanceof String) { + final String dest = (String) runParams.get("Destination"); + if ("Graveyard".equals(dest) && runParams.get("Card") instanceof Card) { + final Card card = (Card) runParams.get("Card"); + final String valid = kw.split(":")[1]; + if (card.isValid(valid.split(","), p, ck, null)) { + n++; + } + } + } + } + } + } + } + } else if (t.getMode() == TriggerType.ChangesZoneAll) { + final CardZoneTable table = (CardZoneTable) runParams.get("Cards"); + // iterate over all cards + for (final Card ck : p.getCardsIn(ZoneType.Battlefield)) { + for (final KeywordInterface ki : ck.getKeywords()) { + final String kw = ki.getOriginal(); + if (kw.startsWith("Panharmonicon")) { + // currently there is no ChangesZoneAll that would trigger on etb + final String valid = kw.split(":")[1]; + if (!table.filterCards(null, ZoneType.Battlefield, valid, ck, null).isEmpty()) { + n++; + } + } else if (kw.startsWith("Dieharmonicon")) { + // 700.4. The term dies means “is put into a graveyard from the battlefield.” + final String valid = kw.split(":")[1]; + if (!table.filterCards(ImmutableList.of(ZoneType.Battlefield), ZoneType.Graveyard, + valid, ck, null).isEmpty()) { + n++; + } } } } 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 5493b7da670..0d15d62f5f4 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 @@ -1589,4 +1589,111 @@ public class GameSimulatorTest extends SimulationTestCase { int numZombies = countCardsWithName(simGame, "Zombie"); assertTrue(numZombies == 3); } + + + public void testTeysaKarlovGitrogMonster() { + + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + + addCard("Teysa Karlov", p); + addCard("The Gitrog Monster", p); + addCard("Dryad Arbor", p); + + for (int i = 0; i < 4; i++) { + addCard("Plains", p); + addCardToZone("Plains", p, ZoneType.Library); + } + + Card armageddon = addCardToZone("Armageddon", p, ZoneType.Hand); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + + SpellAbility armageddonSA = armageddon.getFirstSpellAbility(); + + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(armageddonSA).value; + assertTrue(score > 0); + Game simGame = sim.getSimulatedGameState(); + + // Two cards drawn + assertTrue(simGame.getPlayers().get(0).getZone(ZoneType.Hand).size() == 2); + } + + public void testTeysaKarlovGitrogMonsterGitrogDies() { + + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + + Card teysa = addCard("Teysa Karlov", p); + addCard("The Gitrog Monster", p); + addCard("Dryad Arbor", p); + + String indestructibilityName = "Indestructibility"; + Card indestructibility = addCard(indestructibilityName, p); + + indestructibility.attachToEntity(teysa); + + // update Indestructible state + game.getAction().checkStateEffects(true); + + for (int i = 0; i < 4; i++) { + addCard("Plains", p); + addCardToZone("Plains", p, ZoneType.Library); + } + + Card armageddon = addCardToZone("Wrath of God", p, ZoneType.Hand); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + + SpellAbility armageddonSA = armageddon.getFirstSpellAbility(); + + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(armageddonSA).value; + assertTrue(score > 0); + Game simGame = sim.getSimulatedGameState(); + + // One cards drawn + assertTrue(simGame.getPlayers().get(0).getZone(ZoneType.Hand).size() == 1); + } + + public void testTeysaKarlovGitrogMonsterTeysaDies() { + + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + + addCard("Teysa Karlov", p); + Card gitrog = addCard("The Gitrog Monster", p); + addCard("Dryad Arbor", p); + + String indestructibilityName = "Indestructibility"; + Card indestructibility = addCard(indestructibilityName, p); + + indestructibility.attachToEntity(gitrog); + + // update Indestructible state + game.getAction().checkStateEffects(true); + + for (int i = 0; i < 4; i++) { + addCard("Plains", p); + addCardToZone("Plains", p, ZoneType.Library); + } + + Card armageddon = addCardToZone("Wrath of God", p, ZoneType.Hand); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + + SpellAbility armageddonSA = armageddon.getFirstSpellAbility(); + + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(armageddonSA).value; + assertTrue(score > 0); + Game simGame = sim.getSimulatedGameState(); + + // One cards drawn + assertTrue(simGame.getPlayers().get(0).getZone(ZoneType.Hand).size() == 1); + } } From 4661a199829ff1633966f7db7cabf4b9e71eef41 Mon Sep 17 00:00:00 2001 From: Evan Murawski Date: Fri, 25 Jan 2019 04:53:36 +0000 Subject: [PATCH 672/901] DeckRecognizer: Recognize split card names with single slash --- forge-core/src/main/java/forge/deck/DeckRecognizer.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/forge-core/src/main/java/forge/deck/DeckRecognizer.java b/forge-core/src/main/java/forge/deck/DeckRecognizer.java index a844ed270bb..0cae2a03261 100644 --- a/forge-core/src/main/java/forge/deck/DeckRecognizer.java +++ b/forge-core/src/main/java/forge/deck/DeckRecognizer.java @@ -102,6 +102,7 @@ public class DeckRecognizer { // Pattern.compile("(.*)[^A-Za-wyz]*\\s+([\\d]{1,2})"); private static final Pattern SEARCH_NUMBERS_IN_FRONT = Pattern.compile("([\\d]{1,2})[^A-Za-wyz]*\\s+(.*)"); //private static final Pattern READ_SEPARATED_EDITION = Pattern.compile("[[\\(\\{]([a-zA-Z0-9]){1,3})[]*\\s+(.*)"); + private static final Pattern SEARCH_SINGLE_SLASH = Pattern.compile("(?<=[^/])\\s*/\\s*(?=[^/])"); private final SetPreference useLastSet; private final ICardDatabase db; @@ -125,7 +126,10 @@ public class DeckRecognizer { return new Token(TokenType.Comment, 0, rawLine); } final char smartQuote = (char) 8217; - final String line = rawLine.trim().replace(smartQuote, '\''); + String line = rawLine.trim().replace(smartQuote, '\''); + + // Some websites export split card names with a single slash. Replace with double slash. + line = SEARCH_SINGLE_SLASH.matcher(line).replaceFirst(" // "); Token result = null; final Matcher foundNumbersInFront = DeckRecognizer.SEARCH_NUMBERS_IN_FRONT.matcher(line); From 76ebfa94605fee90d63bf28540f9b4992733837c Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 25 Jan 2019 17:04:09 +0300 Subject: [PATCH 673/901] - Fix AI sealed booster generation for Ravnica Allegiance (use GRN basic lands). --- forge-gui/res/blockdata/blocks.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/blockdata/blocks.txt b/forge-gui/res/blockdata/blocks.txt index de26a42b8c2..bf2901ed696 100644 --- a/forge-gui/res/blockdata/blocks.txt +++ b/forge-gui/res/blockdata/blocks.txt @@ -78,4 +78,4 @@ Dominaria, 3/6/DOM, DOM Core Set 2019, 3/6/M19, M19 Guilds of Ravnica, 3/6/GRN, GRN Ultimate Masters, 3/6/M19, UMA -Ravnica Allegiance, 3/6/RNA, RNA \ No newline at end of file +Ravnica Allegiance, 3/6/GRN, RNA \ No newline at end of file From e3c9a40a17c2e64296a270dd75b6eb87492480db Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 25 Jan 2019 17:17:40 +0300 Subject: [PATCH 674/901] - Use M19 lands as the default basic lands for GRN and RNA sealed/draft, since neither set has basic lands of its own in actual booster packs. --- forge-gui/res/blockdata/blocks.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/blockdata/blocks.txt b/forge-gui/res/blockdata/blocks.txt index bf2901ed696..c7822dda5ab 100644 --- a/forge-gui/res/blockdata/blocks.txt +++ b/forge-gui/res/blockdata/blocks.txt @@ -76,6 +76,6 @@ Iconic Masters, 3/6/XLN, IMA Masters 25, 3/6/XLN, A25 Dominaria, 3/6/DOM, DOM Core Set 2019, 3/6/M19, M19 -Guilds of Ravnica, 3/6/GRN, GRN +Guilds of Ravnica, 3/6/M19, GRN Ultimate Masters, 3/6/M19, UMA -Ravnica Allegiance, 3/6/GRN, RNA \ No newline at end of file +Ravnica Allegiance, 3/6/M19, RNA \ No newline at end of file From 7eedd04aa101921673cfafdedee066ea297a8824 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 25 Jan 2019 17:21:21 +0300 Subject: [PATCH 675/901] - Add basic lands definitions to Ravnica Allegiance. - Revert blocks.txt to use RNA for the land set. --- forge-gui/res/blockdata/blocks.txt | 4 ++-- forge-gui/res/editions/Ravnica Allegiance.txt | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/blockdata/blocks.txt b/forge-gui/res/blockdata/blocks.txt index c7822dda5ab..de26a42b8c2 100644 --- a/forge-gui/res/blockdata/blocks.txt +++ b/forge-gui/res/blockdata/blocks.txt @@ -76,6 +76,6 @@ Iconic Masters, 3/6/XLN, IMA Masters 25, 3/6/XLN, A25 Dominaria, 3/6/DOM, DOM Core Set 2019, 3/6/M19, M19 -Guilds of Ravnica, 3/6/M19, GRN +Guilds of Ravnica, 3/6/GRN, GRN Ultimate Masters, 3/6/M19, UMA -Ravnica Allegiance, 3/6/M19, RNA \ No newline at end of file +Ravnica Allegiance, 3/6/RNA, RNA \ No newline at end of file diff --git a/forge-gui/res/editions/Ravnica Allegiance.txt b/forge-gui/res/editions/Ravnica Allegiance.txt index bb56814ece6..7851c5f3446 100644 --- a/forge-gui/res/editions/Ravnica Allegiance.txt +++ b/forge-gui/res/editions/Ravnica Allegiance.txt @@ -268,6 +268,11 @@ Booster=10 Common:!fromSheet("RNA Secret Cards"), 3 Uncommon:!fromSheet("RNA Sec 257 C Simic Guildgate 258 C Simic Guildgate 259 R Stomping Ground +260 L Plains +261 L Island +262 L Swamp +263 L Mountain +264 L Forest 265 M Dovin, Architect of Law 266 C Elite Arrester 267 R Dovin's Dismissal From 66869377422d188e5ca704aaf0bd2ec5b5de732c Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 25 Jan 2019 18:01:24 +0300 Subject: [PATCH 676/901] - Fix up the RNA printsheets a little bit (wrong card names, wrong set IDs) --- forge-gui/res/blockdata/printsheets.txt | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/forge-gui/res/blockdata/printsheets.txt b/forge-gui/res/blockdata/printsheets.txt index aefbba16529..20e4ec7834f 100644 --- a/forge-gui/res/blockdata/printsheets.txt +++ b/forge-gui/res/blockdata/printsheets.txt @@ -1409,24 +1409,24 @@ Dimir Guildgate|GRN Boros Guildgate|GRN [RNA Lands] -10 Azorious Guildgate|GRN -10 Gruul Guildgate|GRN -10 Orzhov Guildgate|GRN -10 Rakdos Guildgate|GRN -10 Simic Guildgate|GRN +10 Azorius Guildgate|RNA +10 Gruul Guildgate|RNA +10 Orzhov Guildgate|RNA +10 Rakdos Guildgate|RNA +10 Simic Guildgate|RNA [RNA Secret Cards] -Dovin, Architecht of Law +Dovin, Architect of Law Elite Arrester Dovin's Dismissal Dovin's Automaton -Domri City Smasher +Domri, City Smasher Ragefire Charging War Boar Domri's Nodorog The Haunt of Hightower -Azorious Guildgate|GRN -Gruul Guildgate|GRN -Orzhov Guildgate|GRN -Rakdos Guildgate|GRN -Simic Guildgate|GRN \ No newline at end of file +Azorius Guildgate|RNA +Gruul Guildgate|RNA +Orzhov Guildgate|RNA +Rakdos Guildgate|RNA +Simic Guildgate|RNA \ No newline at end of file From eefa4e46d153088bd409c46d479f855d67c184cf Mon Sep 17 00:00:00 2001 From: Tim Scott Date: Fri, 25 Jan 2019 17:11:27 -0600 Subject: [PATCH 677/901] Correct Druid of Horns so SpellAbility now generates a 3/3 beast. An aura targeting the Druid is supposed to do this. --- forge-gui/res/cardsfolder/d/druid_of_horns.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/d/druid_of_horns.txt b/forge-gui/res/cardsfolder/d/druid_of_horns.txt index f34ec2f80dc..317e127b407 100644 --- a/forge-gui/res/cardsfolder/d/druid_of_horns.txt +++ b/forge-gui/res/cardsfolder/d/druid_of_horns.txt @@ -1,7 +1,7 @@ Name:Druid of Horns ManaCost:3 G Types:Creature Human Druid -T:Mode$ SpellCast | ValidCard$ Aura | ValidActivatingPlayer$ You | ValidCard$ Card.Self | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast an Aura spell that targets CARDNAME, create a 3/3 green Beast creature token. +T:Mode$ SpellCast | ValidCard$ Aura | ValidActivatingPlayer$ You | TargetsValid$ Card.Self | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast an Aura spell that targets CARDNAME, create a 3/3 green Beast creature token. SVar:TrigToken:DB$ Token | TokenOwner$ You | TokenAmount$ 1 | TokenPower$ 3 | TokenToughness$ 3 | TokenColors$ Green | TokenName$ Beast | TokenTypes$ Beast,Creature | TokenImage$ g 3 3 beast m19 DeckHas:Ability$Token Oracle:Whenever you cast an Aura spell that targets Druid of Horns, create a 3/3 green Beast creature token. From 3c1b1068370d2fd5ee2f35d760d4ce63d04db8da Mon Sep 17 00:00:00 2001 From: Tim Scott Date: Fri, 25 Jan 2019 19:37:19 -0600 Subject: [PATCH 678/901] Add balance of ANA cards as found at https://scryfall.com/sets/ana --- .../res/cardsfolder/b/blinding_radiance.txt | 6 ++++ forge-gui/res/cardsfolder/c/cruel_cut.txt | 5 +++ forge-gui/res/cardsfolder/f/feral_roar.txt | 5 +++ .../res/cardsfolder/g/goblin_bruiser.txt | 4 +++ .../res/cardsfolder/g/goblin_gang_leader.txt | 7 ++++ .../res/cardsfolder/n/nimble_pilferer.txt | 6 ++++ .../res/cardsfolder/o/ogre_painbringer.txt | 7 ++++ forge-gui/res/cardsfolder/r/rivers_favor.txt | 7 ++++ .../res/cardsfolder/s/shorecomber_crab.txt | 4 +++ forge-gui/res/cardsfolder/s/shrine_keeper.txt | 4 +++ .../res/cardsfolder/s/soulhunter_rakshasa.txt | 8 +++++ .../res/cardsfolder/t/titanic_pelagosaur.txt | 4 +++ .../res/cardsfolder/t/treetop_warden.txt | 4 +++ forge-gui/res/cardsfolder/z/zephyr_gull.txt | 6 ++++ .../editions/Arena New Player Experience.txt | 34 +++++++++++++++++++ 15 files changed, 111 insertions(+) create mode 100644 forge-gui/res/cardsfolder/b/blinding_radiance.txt create mode 100644 forge-gui/res/cardsfolder/c/cruel_cut.txt create mode 100644 forge-gui/res/cardsfolder/f/feral_roar.txt create mode 100644 forge-gui/res/cardsfolder/g/goblin_bruiser.txt create mode 100644 forge-gui/res/cardsfolder/g/goblin_gang_leader.txt create mode 100644 forge-gui/res/cardsfolder/n/nimble_pilferer.txt create mode 100644 forge-gui/res/cardsfolder/o/ogre_painbringer.txt create mode 100644 forge-gui/res/cardsfolder/r/rivers_favor.txt create mode 100644 forge-gui/res/cardsfolder/s/shorecomber_crab.txt create mode 100644 forge-gui/res/cardsfolder/s/shrine_keeper.txt create mode 100644 forge-gui/res/cardsfolder/s/soulhunter_rakshasa.txt create mode 100644 forge-gui/res/cardsfolder/t/titanic_pelagosaur.txt create mode 100644 forge-gui/res/cardsfolder/t/treetop_warden.txt create mode 100644 forge-gui/res/cardsfolder/z/zephyr_gull.txt diff --git a/forge-gui/res/cardsfolder/b/blinding_radiance.txt b/forge-gui/res/cardsfolder/b/blinding_radiance.txt new file mode 100644 index 00000000000..700c75defe8 --- /dev/null +++ b/forge-gui/res/cardsfolder/b/blinding_radiance.txt @@ -0,0 +1,6 @@ +Name:Blinding Radiance +ManaCost:2 W +Types:Sorcery +A:SP$ TapAll | Cost$ 2 W | ValidCards$ Creature.OppCtrl+toughnessLE2 | SpellDescription$ Tap all creatures your opponents control with toughness 2 or less. +Oracle:Tap all creatures your opponents control with toughness 2 or less. + diff --git a/forge-gui/res/cardsfolder/c/cruel_cut.txt b/forge-gui/res/cardsfolder/c/cruel_cut.txt new file mode 100644 index 00000000000..54f09b1c75e --- /dev/null +++ b/forge-gui/res/cardsfolder/c/cruel_cut.txt @@ -0,0 +1,5 @@ +Name:Cruel Cut +ManaCost:1 B +Types:Instant +A:SP$ Destroy | Cost$ 1 B | ValidTgts$ Creature.powerLE2 | TgtPrompt$ Select target creature | SpellDescription$ Destroy target creature with power 2 or less. +Oracle:Destroy target creature with power 2 or less. diff --git a/forge-gui/res/cardsfolder/f/feral_roar.txt b/forge-gui/res/cardsfolder/f/feral_roar.txt new file mode 100644 index 00000000000..912563e2fa2 --- /dev/null +++ b/forge-gui/res/cardsfolder/f/feral_roar.txt @@ -0,0 +1,5 @@ +Name:Feral Roar +ManaCost:1 G +Types:Sorcery +A:SP$ Pump | Cost$ 1 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +4 | NumDef$ +4 | SpellDescription$ Target creature gets +4/+4 until end of turn. +Oracle:Target creature gets +4/+4 until end of turn. diff --git a/forge-gui/res/cardsfolder/g/goblin_bruiser.txt b/forge-gui/res/cardsfolder/g/goblin_bruiser.txt new file mode 100644 index 00000000000..4506eab0005 --- /dev/null +++ b/forge-gui/res/cardsfolder/g/goblin_bruiser.txt @@ -0,0 +1,4 @@ +Name:Goblin Bruiser +ManaCost:1 R R +Types:Creature Goblin Warrior +PT:3/3 diff --git a/forge-gui/res/cardsfolder/g/goblin_gang_leader.txt b/forge-gui/res/cardsfolder/g/goblin_gang_leader.txt new file mode 100644 index 00000000000..010ca6eb0c7 --- /dev/null +++ b/forge-gui/res/cardsfolder/g/goblin_gang_leader.txt @@ -0,0 +1,7 @@ +Name:Goblin Gang Leader +ManaCost:2 R R +Types:Creature Goblin Warrior +PT:2/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create two 1/1 red Goblin creature tokens. +SVar:TrigToken:DB$ Token | TokenAmount$ 2 | TokenName$ Goblin | TokenTypes$ Creature,Goblin | TokenOwner$ You | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 +Oracle:When Goblin Gang Leader enters the battlefield, create two 1/1 red Goblin creature tokens. diff --git a/forge-gui/res/cardsfolder/n/nimble_pilferer.txt b/forge-gui/res/cardsfolder/n/nimble_pilferer.txt new file mode 100644 index 00000000000..6d548a13d9c --- /dev/null +++ b/forge-gui/res/cardsfolder/n/nimble_pilferer.txt @@ -0,0 +1,6 @@ +Name:Nimble Pilferer +ManaCost:1 B +Types:Creature Human Rogue +PT:2/1 +K:Flash +Oracle:Flash diff --git a/forge-gui/res/cardsfolder/o/ogre_painbringer.txt b/forge-gui/res/cardsfolder/o/ogre_painbringer.txt new file mode 100644 index 00000000000..7263d6ff7a0 --- /dev/null +++ b/forge-gui/res/cardsfolder/o/ogre_painbringer.txt @@ -0,0 +1,7 @@ +Name:Ogre Painbringer +ManaCost:3 R R +Types:Creature Ogre +PT:7/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDmg | TriggerDescription$ When CARDNAME enters the battlefield, it deals 3 damage to each player. +SVar:TrigDmg:DB$ DamageAll | Cost$ 3 R R | NumDmg$ 3 | ValidPlayers$ Player | ValidDescription$ each player. | SpellDescription$ CARDNAME deals 3 damage to each player. +Oracle:When Ogre Painbringer enters the battlefield, it deals 3 damage to each player. diff --git a/forge-gui/res/cardsfolder/r/rivers_favor.txt b/forge-gui/res/cardsfolder/r/rivers_favor.txt new file mode 100644 index 00000000000..2b7652b72f2 --- /dev/null +++ b/forge-gui/res/cardsfolder/r/rivers_favor.txt @@ -0,0 +1,7 @@ +Name:River's Favor +ManaCost:U +Types:Enchantment Aura +K:Enchant creature +A:SP$ Attach | Cost$ U | ValidTgts$ Creature | AILogic$ Pump +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 1 | Description$ Enchanted creature gets +1/+1. +Oracle:Enchant creature\nEnchanted creature gets +1/+1. diff --git a/forge-gui/res/cardsfolder/s/shorecomber_crab.txt b/forge-gui/res/cardsfolder/s/shorecomber_crab.txt new file mode 100644 index 00000000000..fe17bf9e5f7 --- /dev/null +++ b/forge-gui/res/cardsfolder/s/shorecomber_crab.txt @@ -0,0 +1,4 @@ +Name:Shorecomber Crab +ManaCost:U +Types:Creature Crab +PT:0/4 diff --git a/forge-gui/res/cardsfolder/s/shrine_keeper.txt b/forge-gui/res/cardsfolder/s/shrine_keeper.txt new file mode 100644 index 00000000000..6c288bdf392 --- /dev/null +++ b/forge-gui/res/cardsfolder/s/shrine_keeper.txt @@ -0,0 +1,4 @@ +Name:Shrine Keeper +ManaCost:1 W +Types:Creature Human Cleric +PT:2/2 diff --git a/forge-gui/res/cardsfolder/s/soulhunter_rakshasa.txt b/forge-gui/res/cardsfolder/s/soulhunter_rakshasa.txt new file mode 100644 index 00000000000..784fc62bbdf --- /dev/null +++ b/forge-gui/res/cardsfolder/s/soulhunter_rakshasa.txt @@ -0,0 +1,8 @@ +Name:Soulhunter Rakshasa +ManaCost:3 B B +Types:Creature Cat Demon +PT:5/5 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDmg | TriggerDescription$ When CARDNAME enters the battlefield, it deals 5 damage to target opponent. +SVar:TrigDmg:DB$ DealDamage | Cost$ 3 B B | NumDmg$ 5 | ValidTgts$ Opponent | TgtPrompt$ Choose target opponent. | SpellDescription$ CARDNAME deals 5 damage to target opponent. +K:CARDNAME can't block. +Oracle:Soulhunter Rakshasa can't block.\nWhen Soulhunter Rakshasa enters the battlefied, it deals 5 damage to target opponent. diff --git a/forge-gui/res/cardsfolder/t/titanic_pelagosaur.txt b/forge-gui/res/cardsfolder/t/titanic_pelagosaur.txt new file mode 100644 index 00000000000..952f96c82cd --- /dev/null +++ b/forge-gui/res/cardsfolder/t/titanic_pelagosaur.txt @@ -0,0 +1,4 @@ +Name:Titanic Pelagosaur +ManaCost:3 U U +Types:Creature Dinosaur +PT:4/6 diff --git a/forge-gui/res/cardsfolder/t/treetop_warden.txt b/forge-gui/res/cardsfolder/t/treetop_warden.txt new file mode 100644 index 00000000000..a527f425cf0 --- /dev/null +++ b/forge-gui/res/cardsfolder/t/treetop_warden.txt @@ -0,0 +1,4 @@ +Name:Treetop Warden +ManaCost:1 G +Types:Creature Elf Warrior +PT:2/2 diff --git a/forge-gui/res/cardsfolder/z/zephyr_gull.txt b/forge-gui/res/cardsfolder/z/zephyr_gull.txt new file mode 100644 index 00000000000..86e5f917476 --- /dev/null +++ b/forge-gui/res/cardsfolder/z/zephyr_gull.txt @@ -0,0 +1,6 @@ +Name:Zephyr Gull +ManaCost:U +Types:Creature Bird +PT:1/1 +K:Flying +Oracle:Flying diff --git a/forge-gui/res/editions/Arena New Player Experience.txt b/forge-gui/res/editions/Arena New Player Experience.txt index 3ef71f4c7fa..825809b5f06 100644 --- a/forge-gui/res/editions/Arena New Player Experience.txt +++ b/forge-gui/res/editions/Arena New Player Experience.txt @@ -5,8 +5,42 @@ Name=Arena New Player Experience Type=Other [cards] +C Altar's Reap +U Ambition's Cost U Angelic Reward +U Blinding Radiance +R Chaos Maw U Confront the Assault +C Cruel Cut +C Divination +U Doublecast +C Feral Roar +U Goblin Bruiser +U Goblin Gang Leader +U Goblin Grenade R Inspiring Commander +C Knight's Pledge +C Loxodon Line Breaker +C Miasmic Mummy +C Nimble Pilferer +R Ogre Painbringer +M Overflowing Insight +C Raging Goblin +C Renegade Demon +U Rise from the Grave +C River's Favor +C Rumbling Baloth +C Sanctuary Cat +U Seismic Rupture +U Serra Angel +C Shorecomber Crab +C Shrine Keeper +R Soulhunter Rakshasa C Spiritual Guardian C Tactical Advantage +C Take Vengeance +U Titanic Pelagosaur +C Treetop Warden +U Volcanic Dragon +C Waterknot +C Zephyr Gull From e891e0d31da1574df89c83ab669fffa910833ec7 Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Sat, 26 Jan 2019 03:05:49 +0000 Subject: [PATCH 679/901] Add "Coldsnap Theme Decks" edition. --- .../res/editions/Coldsnap Theme Decks.txt | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 forge-gui/res/editions/Coldsnap Theme Decks.txt diff --git a/forge-gui/res/editions/Coldsnap Theme Decks.txt b/forge-gui/res/editions/Coldsnap Theme Decks.txt new file mode 100644 index 00000000000..30a2b05fef7 --- /dev/null +++ b/forge-gui/res/editions/Coldsnap Theme Decks.txt @@ -0,0 +1,74 @@ +[metadata] +Code=CST +Date=2006-07-21 +Name=Coldsnap Theme Decks +MciCode=cst +Type=Other + +[cards] +8 U Kjeldoran Home Guard +9 C Kjeldoran Pride +12 C Reinforcements +16 U Scars of the Veteran +20 C Disenchant +25 U Browse +30 C Lat-Nam's Legacy +34 C Kjeldoran Elite Guard +37 U Storm Elemental +42 U Viscerid Drone +43 U Balduvian Dead +44 C Casting of Bones +51 C Insidious Bookworms +54 C Swords to Plowshares +57 C Phantasmal Fiend +60 U Binding Grasp +61 C Brainstorm +69 C Essence Flare +70 U Death Spark +72 C Gorilla Shaman +73 U Iceberg +84 C Mistfolk +85 U Bounty of the Hunt +86 C Deadly Insect +90 C Portent +100 C Snow Devil +112 C Zuran Spellcaster +114 U Ashen Ghoul +119 C Dark Banishing +120 C Dark Ritual +123 U Drift of the Dead +127 C Gangrenous Zombies +137 C Kjeldoran Dead +142 C Legions of Lim-Dul +161 C Soul Burn +194 C Incinerate +208 U Orcish Healer +210 C Orcish Lumberjack +225 C Aurochs +270 C Tinder Wall +278 C Woolly Mammoths +293 U Giant Trap Door Spider +305 U Wings of Aesthir +310 U Arcum's Weathervane +312 C Barbed Sextant +336 U Skull Catapult +349 U Whalebone Glider +369 L Plains +370 L Plains +371 L Plains +372 L Island +373 L Island +374 L Island +375 L Swamp +376 L Swamp +377 L Swamp +378 L Mountain +379 L Mountain +380 L Mountain +381 L Forest +382 L Forest +383 L Forest + +[tokens] +w_0_1_deserter +br_3_1_graveborn_haste From 560dc572c299b35ac3ede92fa170d22ad5aae16c Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Sat, 26 Jan 2019 09:24:25 +0000 Subject: [PATCH 680/901] Charm rework --- .../main/java/forge/game/ability/effects/CharmEffect.java | 5 +++-- forge-game/src/main/java/forge/game/card/CardFactory.java | 5 ----- .../src/main/java/forge/game/trigger/TriggerHandler.java | 5 ++++- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java index 88098689550..ef8dfcba924 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java @@ -150,14 +150,14 @@ public class CharmEffect extends SpellAbilityEffect { return ""; } - public static void makeChoices(SpellAbility sa) { + public static boolean makeChoices(SpellAbility sa) { //this resets all previous choices sa.setSubAbility(null); // Entwine does use all Choices if (sa.isEntwine()) { chainAbilities(sa, makePossibleOptions(sa)); - return; + return true; } final int num = sa.hasParam("CharmNumOnResolve") ? @@ -181,6 +181,7 @@ public class CharmEffect extends SpellAbilityEffect { List chosen = chooser.getController().chooseModeForAbility(sa, min, num, sa.hasParam("CanRepeatModes")); chainAbilities(sa, chosen); + return chosen != null && !chosen.isEmpty(); } private static void chainAbilities(SpellAbility sa, List chosen) { diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index 9a9f08e1551..82db7497427 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -25,8 +25,6 @@ import forge.card.mana.ManaCost; import forge.game.Game; import forge.game.ability.AbilityFactory; import forge.game.ability.AbilityUtils; -import forge.game.ability.ApiType; -import forge.game.ability.effects.CharmEffect; import forge.game.cost.Cost; import forge.game.player.Player; import forge.game.replacement.ReplacementHandler; @@ -680,9 +678,6 @@ public class CardFactory { } trig.setStackDescription(trig.toString()); - if (trig.getApi() == ApiType.Charm && !trig.isWrapper()) { - CharmEffect.makeChoices(trig); - } WrappedAbility wrapperAbility = new WrappedAbility(t, trig, ((WrappedAbility) sa).getDecider()); wrapperAbility.setTrigger(true); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java index 308b373411d..6d10443816a 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -636,7 +636,10 @@ public class TriggerHandler { sa.setStackDescription(sa.toString()); if (sa.getApi() == ApiType.Charm && !sa.isWrapper()) { - CharmEffect.makeChoices(sa); + if (!CharmEffect.makeChoices(sa)) { + // 603.3c If no mode is chosen, the ability is removed from the stack. + return; + } } Player decider = null; From b2616860c0776c328cf7fb247c46f54749f700f4 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 26 Jan 2019 13:28:55 +0100 Subject: [PATCH 681/901] Spell: fix casting opponent spells --- forge-game/src/main/java/forge/game/spellability/Spell.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/forge-game/src/main/java/forge/game/spellability/Spell.java b/forge-game/src/main/java/forge/game/spellability/Spell.java index 92879d67545..267a61fea8e 100644 --- a/forge-game/src/main/java/forge/game/spellability/Spell.java +++ b/forge-game/src/main/java/forge/game/spellability/Spell.java @@ -144,6 +144,8 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable if (lkicheck) { game.getAction().checkStaticAbilities(false); game.getTracker().unfreeze(); + // reset owner for lki + card.setController(null, 0); } if (!(isInstant || activator.canCastSorcery() || flash || getRestrictions().isInstantSpeed() From ed218b6e4c41479d901f44850ce3b8d3f0747ca6 Mon Sep 17 00:00:00 2001 From: tjtillmancoag Date: Sat, 26 Jan 2019 19:39:04 -0800 Subject: [PATCH 682/901] Fixed Amplifire (properly changes Power & Toughness), Consume (of Consecrate // Consume, works now), Final Payment (allows sacrifice of enchantment/creature as payment), Incongruity (fixed A:AB$ to A:SP$), Sentinel's Mark (gives Lifelink on Main phase trigger) Silhana Wayfinder (triggers on ETB) Smelt Ward Ignus (loses control of creature at EoT) Undercity's Embrace (no life amount in gainlife ability was causing crash on cast) --- forge-gui/res/cardsfolder/upcoming/amplifire.txt | 8 ++++++-- forge-gui/res/cardsfolder/upcoming/consecrate_consume.txt | 5 ++--- forge-gui/res/cardsfolder/upcoming/final_payment.txt | 2 +- .../res/cardsfolder/upcoming/incubation_incongruity.txt | 2 +- forge-gui/res/cardsfolder/upcoming/sentinels_mark.txt | 2 +- forge-gui/res/cardsfolder/upcoming/silhana_wayfinder.txt | 3 ++- forge-gui/res/cardsfolder/upcoming/smelt_ward_ignus.txt | 2 +- forge-gui/res/cardsfolder/upcoming/undercitys_embrace.txt | 2 +- 8 files changed, 15 insertions(+), 11 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/amplifire.txt b/forge-gui/res/cardsfolder/upcoming/amplifire.txt index ce695f0c794..ec7e20c367f 100644 --- a/forge-gui/res/cardsfolder/upcoming/amplifire.txt +++ b/forge-gui/res/cardsfolder/upcoming/amplifire.txt @@ -3,6 +3,10 @@ ManaCost:2 R R Types:Creature Elemental PT:1/1 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDig | TriggerDescription$ At the beginning of your upkeep, reveal cards from the top of your library until you reveal a creature card. Until your next turn, CARDNAME's base power becomes twice that card's power and its toughness. Put the revealed cards on the bottom of your library in a random order. -SVar:TrigDig:DB$ DigUntil | Valid$ Creature | ValidDescription$ creature card | FoundDestination$ Library | RevealedDestination$ Library | RevealedLibraryPosition$ -1 | RememberFound$ True | SubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Power$ X | Toughness$ Y +SVar:TrigDig:DB$ DigUntil | Reveal$ True | Valid$ Creature | ValidDescription$ creature card | FoundDestination$ Exile | RevealedDestination$ Exile | RememberFound$ True | ImprintRevealed$ True | SubAbility$ DBAnimate +SVar:DBAnimate:DB$ Animate | Power$ X | Toughness$ Y | SubAbility$ DBMovetoLib +SVar:DBMovetoLib:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered,Card.IsImprinted | Origin$ Exile | Destination$ Library | RandomOrder$ True | LibraryPosition$ -1 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True +SVar:X:Remembered$CardPower/Times.2 +SVar:Y:Remembered$CardToughness/Times.2 Oracle:At the beginning of your upkeep, reveal cards from the top of your library until you reveal a creature card. Until your next turn, Amplifire's base power becomes twice that card's power and its base toughness becomes twice that card's toughness. Put the revealed cards on the bottom of your library in a random order. diff --git a/forge-gui/res/cardsfolder/upcoming/consecrate_consume.txt b/forge-gui/res/cardsfolder/upcoming/consecrate_consume.txt index 6f0ce2e9cdb..a995c978923 100644 --- a/forge-gui/res/cardsfolder/upcoming/consecrate_consume.txt +++ b/forge-gui/res/cardsfolder/upcoming/consecrate_consume.txt @@ -11,8 +11,7 @@ ALTERNATE Name:Consume ManaCost:2 W B Types:Sorcery -A:SP$ ChooseCard | Cost$ 2 W B | ValidTgts$ Player | Choices$ Creature.greatestPowerControlledByRemembered | Mandatory$ True | SubAbility$ DBSac -SVar:DBSac:DB$ Sacrifice | Defined$ Targeted | SacValid$ Card.ChosenCard | RememberSacrificed$ True | SacMessage$ the creature with the highest power | SubAbility$ DBGainLife +A:SP$ Sacrifice | Cost$ 2 W B | ValidTgts$ Player | SacValid$ Creature.greatestPower+TargetedPlayerCtrl | RememberSacrificed$ True | SacMessage$ Creature with greatest power among creatures you control | SubAbility$ DBGainLife | SpellDescription$ Target player sacrifices a creature with the greatest power among creatures they control. You gain life equal to its power. SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X -SVar:X:TargetedLKI$CardPower +SVar:X:RememberedLKI$CardPower Oracle:Target player sacrifices a creature with the greatest power among creatures they control. You gain life equal to its power. diff --git a/forge-gui/res/cardsfolder/upcoming/final_payment.txt b/forge-gui/res/cardsfolder/upcoming/final_payment.txt index b99e79bf6ff..bc63d05d707 100644 --- a/forge-gui/res/cardsfolder/upcoming/final_payment.txt +++ b/forge-gui/res/cardsfolder/upcoming/final_payment.txt @@ -1,6 +1,6 @@ Name:Final Payment ManaCost:W B Types:Instant -K:AlternateAdditionalCost:PayLife<5>:Sac<1/Creature,Enchantment> +K:AlternateAdditionalCost:PayLife<5>:Sac<1/Creature;Enchantment/creature or enchantment> A:SP$ Destroy | Cost$ W B | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Destroy target creature. Oracle:As an additional cost to cast this spell, pay 5 life or sacrifice a creature or enchantment.\nDestroy target creature. diff --git a/forge-gui/res/cardsfolder/upcoming/incubation_incongruity.txt b/forge-gui/res/cardsfolder/upcoming/incubation_incongruity.txt index 3814a3dbfcc..d6c71908766 100644 --- a/forge-gui/res/cardsfolder/upcoming/incubation_incongruity.txt +++ b/forge-gui/res/cardsfolder/upcoming/incubation_incongruity.txt @@ -11,6 +11,6 @@ ALTERNATE Name:Incongruity ManaCost:1 G U Types:Instant -A:AB$ ChangeZone | Cost$ 1 G U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBToken | SpellDescription$ Exile target creature. That creature’s controller creates a 3/3 green Frog Lizard creature token. +A:SP$ ChangeZone | Cost$ 1 G U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBToken | SpellDescription$ Exile target creature. That creature’s controller creates a 3/3 green Frog Lizard creature token. SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenOwner$ TargetedController | TokenScript$ g_3_3_frog_lizard Oracle:Exile target creature. That creature’s controller creates a 3/3 green Frog Lizard creature token. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/sentinels_mark.txt b/forge-gui/res/cardsfolder/upcoming/sentinels_mark.txt index 0ab076fe3b1..5d6b7ac507e 100644 --- a/forge-gui/res/cardsfolder/upcoming/sentinels_mark.txt +++ b/forge-gui/res/cardsfolder/upcoming/sentinels_mark.txt @@ -6,5 +6,5 @@ K:Enchant creature A:SP$ Attach | Cost$ 1 W | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 2 | AddKeyword$ Vigilance | Description$ Enchanted creature gets +1/+2 and has vigilance. T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigPump | Condition$ Main1 | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it during your main phase, enchanted creature gains lifelink until end of turn. -SVar:TrigPump:DB$ Pump | Defined$ Enchanted | KW$ +SVar:TrigPump:DB$ Pump | Defined$ Enchanted | KW$ Lifelink Oracle:Flash\nEnchant creature\nEnchanted creature gets +1/+2 and has vigilance.\nAddendum — When Sentinel's Mark enters the battlefield, if you cast it during your main phase, enchanted creature gains lifelink until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/silhana_wayfinder.txt b/forge-gui/res/cardsfolder/upcoming/silhana_wayfinder.txt index 8f001dc79ee..331db43d9ef 100644 --- a/forge-gui/res/cardsfolder/upcoming/silhana_wayfinder.txt +++ b/forge-gui/res/cardsfolder/upcoming/silhana_wayfinder.txt @@ -2,5 +2,6 @@ Name:Silhana Wayfinder ManaCost:1 G Types:Creature Elf Scout PT:2/1 -SVar:DBDig:DB$ Dig | DigNum$ 4 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Creature,Land | ForceRevealToController$ True | DestinationZone$ Library | LibraryPosition$ -1 | RestRandomOrder$ True | ForceRevealToController$ True +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDig | TriggerDescription$ When CARDNAME enters the battlefield, look at the top four cards of your library. You may reveal a creature or land card from among them and put it on top of your library. Put the rest on the bottom of your library in a random order. +SVar:TrigDig:DB$ Dig | DigNum$ 4 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Creature,Land | ForceRevealToController$ True | DestinationZone$ Library | LibraryPosition$ 0 | RestRandomOrder$ True | ForceRevealToController$ True Oracle:When Silhana Wayfinder enters the battlefield, look at the top four cards of your library. You may reveal a creature or land card from among them and put it on top of your library. Put the rest on the bottom of your library in a random order. diff --git a/forge-gui/res/cardsfolder/upcoming/smelt_ward_ignus.txt b/forge-gui/res/cardsfolder/upcoming/smelt_ward_ignus.txt index b54b1e12310..6581226efc0 100644 --- a/forge-gui/res/cardsfolder/upcoming/smelt_ward_ignus.txt +++ b/forge-gui/res/cardsfolder/upcoming/smelt_ward_ignus.txt @@ -2,5 +2,5 @@ Name:Smelt-Ward Ignus ManaCost:1 R Types:Creature Elemental PT:2/1 -A:AB$ GainControl | Cost$ 2 R Sac<1/CARDNAME> | ValidTgts$ Creature.powerLE3 | TgtPrompt$ Select target creature with power 3 or less | Untap$ True | AddKWs$ Haste | SorcerySpeed$ True | SpellDescription$ Gain control of target creature with power 3 or less until end of turn. Untap that creature. It gains haste until end of turn. Activate this ability only any time you could cast a sorcery. +A:AB$ GainControl | Cost$ 2 R Sac<1/CARDNAME> | ValidTgts$ Creature.powerLE3 | LoseControl$ EOT | TgtPrompt$ Select target creature with power 3 or less | Untap$ True | AddKWs$ Haste | SorcerySpeed$ True | SpellDescription$ Gain control of target creature with power 3 or less until end of turn. Untap that creature. It gains haste until end of turn. Activate this ability only any time you could cast a sorcery. Oracle:{2}{R}, Sacrifice Smelt-Ward Ignus: Gain control of target creature with power 3 or less until end of turn. Untap that creature. It gains haste until end of turn. Activate this ability only any time you could cast a sorcery. diff --git a/forge-gui/res/cardsfolder/upcoming/undercitys_embrace.txt b/forge-gui/res/cardsfolder/upcoming/undercitys_embrace.txt index 528da6b040d..fd3a43144c6 100644 --- a/forge-gui/res/cardsfolder/upcoming/undercitys_embrace.txt +++ b/forge-gui/res/cardsfolder/upcoming/undercitys_embrace.txt @@ -2,6 +2,6 @@ Name:Undercity's Embrace ManaCost:2 B Types:Instant A:SP$ Sacrifice | Cost$ 2 B | ValidTgts$ Opponent | SacValid$ Creature | SacMessage$ Creature | SubAbility$ DBGainLife | SpellDescription$ Target opponent sacrifices a creature. If you control a creature with power 4 or greater, you gain 4 life. | StackDescription$ SpellDescription -SVar:DBGainLife:DB$ GainLife | Defined$ You | ConditionPresent$ Creature.YouCtrl+powerGE4 | ConditionCompare$ GE1 | StackDescription$ If you control a creature with power 4 or greater, you gain 4 life. +SVar:DBGainLife:DB$ GainLife | LifeAmount$ 4 | Defined$ You | ConditionPresent$ Creature.YouCtrl+powerGE4 | ConditionCompare$ GE1 | StackDescription$ If you control a creature with power 4 or greater, you gain 4 life. DeckHas:Ability$LifeGain Oracle:Target opponent sacrifices a creature. If you control a creature with power 4 or greater, you gain 4 life. From e604d9d0cbce2adabd38fbf180164905599fd10a Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 27 Jan 2019 05:18:49 +0000 Subject: [PATCH 683/901] Update consecrate_consume.txt to add Cleanup Remembered --- forge-gui/res/cardsfolder/upcoming/consecrate_consume.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/consecrate_consume.txt b/forge-gui/res/cardsfolder/upcoming/consecrate_consume.txt index a995c978923..66d5cf8dd0b 100644 --- a/forge-gui/res/cardsfolder/upcoming/consecrate_consume.txt +++ b/forge-gui/res/cardsfolder/upcoming/consecrate_consume.txt @@ -12,6 +12,7 @@ Name:Consume ManaCost:2 W B Types:Sorcery A:SP$ Sacrifice | Cost$ 2 W B | ValidTgts$ Player | SacValid$ Creature.greatestPower+TargetedPlayerCtrl | RememberSacrificed$ True | SacMessage$ Creature with greatest power among creatures you control | SubAbility$ DBGainLife | SpellDescription$ Target player sacrifices a creature with the greatest power among creatures they control. You gain life equal to its power. -SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:RememberedLKI$CardPower Oracle:Target player sacrifices a creature with the greatest power among creatures they control. You gain life equal to its power. From e2ddcdda4d7de536ec56a3394f71670caefd73b1 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Mon, 21 Jan 2019 11:40:36 -0500 Subject: [PATCH 684/901] stronger highlighting for selectable cards --- .../java/forge/view/arcane/CardPanel.java | 28 +++++++++++++------ .../forge/view/arcane/ScaledImagePanel.java | 9 +++++- .../main/java/forge/interfaces/IGuiGame.java | 1 + .../java/forge/match/AbstractGuiGame.java | 3 ++ 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java index 16339ea1602..d1e1e6f1953 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java @@ -253,6 +253,13 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl g2d.rotate(getTappedAngle(), cardXOffset + edgeOffset, (cardYOffset + cardHeight) - edgeOffset); } + boolean selectable = matchUI.isSelectable(getCard()); + if ( titleText!=null ) { // selectable cards have colored names + titleText.setForeground(selectable?Color.cyan:Color.white); + } + // if ( imagePanel != null ) { // if selecting, darken non-selectable cards - needs more refreshing to do right + // imagePanel.setBrightness(selectable?1.0f:(matchUI.isSelecting()?0.5f:1.0f)); + //} super.paint(g2d); } @@ -268,25 +275,21 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl final int cornerSize = noBorderPref && !cardImgHasAlpha ? 0 : Math.max(4, Math.round(cardWidth * CardPanel.ROUNDED_CORNER_SIZE)); final int offset = isTapped() && (!noBorderPref || cardImgHasAlpha) ? 1 : 0; - // Magenta outline for when card was chosen to pay + // Magenta outline for when card is chosen if (matchUI.isUsedToPay(getCard())) { g2d.setColor(Color.magenta); - final int n2 = Math.max(4, Math.round(2 * cardWidth * CardPanel.SELECTED_BORDER_SIZE)); - g2d.fillRoundRect(cardXOffset - n2, (cardYOffset - n2) + offset, cardWidth + (n2 * 2), cardHeight + (n2 * 2), cornerSize + n2, cornerSize + n2); - } else if (matchUI.isSelectable(getCard())) { // Cyan outline for selectable cards - g2d.setColor(Color.cyan); - final int n2 = Math.max(4, Math.round(2 * cardWidth * CardPanel.SELECTED_BORDER_SIZE)); + final int n2 = Math.max(1, Math.round(2 * cardWidth * CardPanel.SELECTED_BORDER_SIZE)); g2d.fillRoundRect(cardXOffset - n2, (cardYOffset - n2) + offset, cardWidth + (n2 * 2), cardHeight + (n2 * 2), cornerSize + n2, cornerSize + n2); } // Green outline for hover if (isSelected) { g2d.setColor(Color.green); - final int n = Math.max(4, Math.round(cardWidth * CardPanel.SELECTED_BORDER_SIZE)); - g2d.fillRoundRect(cardXOffset - n, (cardYOffset - n) + offset, cardWidth + (n * 2), cardHeight + (n * 2), cornerSize + n , cornerSize + n); + final int n = Math.max(1, Math.round(cardWidth * CardPanel.SELECTED_BORDER_SIZE)); + g2d.fillRoundRect(cardXOffset - n, (cardYOffset - n) + offset, cardWidth + (n * 2), cardHeight + (n * 2), cornerSize + n , cornerSize + n); } - // Black fill - (will become outline for white bordered cards) + // Black fill - (will become an outline for white bordered cards) g2d.setColor(Color.black); g2d.fillRoundRect(cardXOffset, cardYOffset + offset, cardWidth, cardHeight, cornerSize, cornerSize); @@ -309,6 +312,13 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl g2d.fillRoundRect(cardXOffset + ins, cardYOffset + ins, cardWidth - ins*2, cardHeight - ins*2, cornerSize-ins, cornerSize-ins); } } + + if (matchUI.isSelectable(getCard())) { // Replace border for selectable cards + g2d.setColor(Color.cyan); + // final int n2 = Math.max(2, Math.round(2 * cardWidth * CardPanel.SELECTED_BORDER_SIZE)); + g2d.fillRoundRect(cardXOffset, (cardYOffset) + offset, cardWidth, cardHeight, cornerSize, cornerSize); + // g2d.fillRoundRect(cardXOffset - n2, (cardYOffset - n2) + offset, cardWidth + (n2 * 2), cardHeight + (n2 * 2), cornerSize + n2, cornerSize + n2); + } } private void drawManaCost(final Graphics g, final ManaCost cost, final int deltaY) { diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/ScaledImagePanel.java b/forge-gui-desktop/src/main/java/forge/view/arcane/ScaledImagePanel.java index 26021b0f670..a9867f6db6c 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/ScaledImagePanel.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/ScaledImagePanel.java @@ -20,6 +20,7 @@ package forge.view.arcane; import javax.swing.*; import java.awt.*; import java.awt.image.BufferedImage; +import java.awt.image.RescaleOp; /** *

@@ -37,6 +38,10 @@ public class ScaledImagePanel extends JPanel { * */ private volatile BufferedImage srcImage; + private float brightness = 1.0f; + public void setBrightness(final float bright) { + brightness = bright; + } /** *

@@ -127,7 +132,9 @@ public class ScaledImagePanel extends JPanel { } else { int x = (sz.width / 2) - (img.getWidth() / 2); int y = (sz.height / 2) - (img.getHeight() / 2); - g.drawImage(img, x, y, null); + Graphics2D g2d = (Graphics2D) g; + RescaleOp brighten = new RescaleOp(brightness,0,null); + g2d.drawImage(img, brighten, x, y); } } diff --git a/forge-gui/src/main/java/forge/interfaces/IGuiGame.java b/forge-gui/src/main/java/forge/interfaces/IGuiGame.java index ec2c6994a0f..3c9b08f4679 100644 --- a/forge-gui/src/main/java/forge/interfaces/IGuiGame.java +++ b/forge-gui/src/main/java/forge/interfaces/IGuiGame.java @@ -159,6 +159,7 @@ public interface IGuiGame { void setUsedToPay(CardView card, boolean value); void setSelectables(final Iterable cards); void clearSelectables(); + boolean isSelecting(); void awaitNextInput(); void cancelAwaitNextInput(); diff --git a/forge-gui/src/main/java/forge/match/AbstractGuiGame.java b/forge-gui/src/main/java/forge/match/AbstractGuiGame.java index e71e4ff0293..ed4a467e112 100644 --- a/forge-gui/src/main/java/forge/match/AbstractGuiGame.java +++ b/forge-gui/src/main/java/forge/match/AbstractGuiGame.java @@ -230,6 +230,9 @@ public abstract class AbstractGuiGame implements IGuiGame, IMayViewCards { public boolean isSelectable(final CardView card) { return selectableCards.contains(card); } + public boolean isSelecting() { + return !selectableCards.isEmpty(); + } /** Concede game, bring up WinLose UI. */ public boolean concede() { From 62316abf383f2c513b2b40cca230a615b58c60e8 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Wed, 23 Jan 2019 02:35:58 -0500 Subject: [PATCH 685/901] darken non-selectable cards when selecting (needs work) --- .../java/forge/view/arcane/CardPanel.java | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java index d1e1e6f1953..280fb8c3905 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java @@ -253,14 +253,14 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl g2d.rotate(getTappedAngle(), cardXOffset + edgeOffset, (cardYOffset + cardHeight) - edgeOffset); } - boolean selectable = matchUI.isSelectable(getCard()); - if ( titleText!=null ) { // selectable cards have colored names - titleText.setForeground(selectable?Color.cyan:Color.white); + // System.out.println("Paint " + getCard() + " selecting " + matchUI.isSelecting()); + boolean nonselectable = matchUI.isSelecting() && !matchUI.isSelectable(getCard()); + if ( titleText!=null ) { // non-selectable cards have gray names + titleText.setForeground(nonselectable?Color.DARK_GRAY:Color.WHITE); } - // if ( imagePanel != null ) { // if selecting, darken non-selectable cards - needs more refreshing to do right - // imagePanel.setBrightness(selectable?1.0f:(matchUI.isSelecting()?0.5f:1.0f)); - //} - super.paint(g2d); + if ( imagePanel != null ) { // if selecting, darken non-selectable cards - needs more refreshing to do right + imagePanel.setBrightness(nonselectable?0.4f:1.0f); + } super.paint(g2d); } @Override @@ -304,7 +304,8 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl colorIsSet = true; } else if (ed != null && ed.isWhiteBorder() && state.getFoilIndex() == 0) { // Non-foil cards from white-bordered sets are drawn with white border - g2d.setColor(Color.WHITE); + // unless selecting and card is not selectable + g2d.setColor(matchUI.isSelecting()&&!matchUI.isSelectable(getCard())?Color.DARK_GRAY:Color.WHITE); colorIsSet = true; } if (colorIsSet) { @@ -313,11 +314,12 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl } } - if (matchUI.isSelectable(getCard())) { // Replace border for selectable cards - g2d.setColor(Color.cyan); - // final int n2 = Math.max(2, Math.round(2 * cardWidth * CardPanel.SELECTED_BORDER_SIZE)); - g2d.fillRoundRect(cardXOffset, (cardYOffset) + offset, cardWidth, cardHeight, cornerSize, cornerSize); - // g2d.fillRoundRect(cardXOffset - n2, (cardYOffset - n2) + offset, cardWidth + (n2 * 2), cardHeight + (n2 * 2), cornerSize + n2, cornerSize + n2); + if (matchUI.isSelectable(getCard())) { // Replace border for selectable cards + g2d.setColor(Color.WHITE); + final int ins = 1; + g2d.fillRoundRect(cardXOffset+ins, cardYOffset+ins, cardWidth-ins*2, cardHeight-ins*2, cornerSize-ins, cornerSize-ins); + // final int n2 = Math.max(2, Math.round(2 * cardWidth * CardPanel.SELECTED_BORDER_SIZE)); + // g2d.fillRoundRect(cardXOffset - n2, (cardYOffset - n2) + offset, cardWidth + (n2 * 2), cardHeight + (n2 * 2), cornerSize + n2, cornerSize + n2); } } @@ -368,6 +370,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl final boolean canShow = matchUI.mayView(card); final boolean showText = !imagePanel.hasImage() || !isAnimationPanel; + System.out.println("doLayout " + card); displayCardNameOverlay(showText && canShow && showCardNameOverlay(), imgSize, imgPos); displayPTOverlay(showText && (canShow || card.isFaceDown()) && showCardPowerOverlay(), imgSize, imgPos); displayCardIdOverlay(showText && canShow && showCardIdOverlay(), imgSize, imgPos); @@ -793,6 +796,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl return FModel.getPreferences().getPrefBoolean(preferenceName); } + // don't show overlays on non-selectable cards when selecting private boolean isShowingOverlays() { return isPreferenceEnabled(FPref.UI_SHOW_CARD_OVERLAYS) && card != null; } From 70f0f1108b14bd7ff5c465ec5b140bb9b2342c71 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Sun, 27 Jan 2019 08:22:50 -0500 Subject: [PATCH 686/901] darken non-selectable cards during paintChildren --- .../java/forge/view/arcane/CardPanel.java | 31 ++++++++++--------- .../forge/view/arcane/ScaledImagePanel.java | 9 +----- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java index 280fb8c3905..7d0cbb2ce89 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java @@ -253,14 +253,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl g2d.rotate(getTappedAngle(), cardXOffset + edgeOffset, (cardYOffset + cardHeight) - edgeOffset); } - // System.out.println("Paint " + getCard() + " selecting " + matchUI.isSelecting()); - boolean nonselectable = matchUI.isSelecting() && !matchUI.isSelectable(getCard()); - if ( titleText!=null ) { // non-selectable cards have gray names - titleText.setForeground(nonselectable?Color.DARK_GRAY:Color.WHITE); - } - if ( imagePanel != null ) { // if selecting, darken non-selectable cards - needs more refreshing to do right - imagePanel.setBrightness(nonselectable?0.4f:1.0f); - } super.paint(g2d); + super.paint(g2d); } @Override @@ -304,8 +297,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl colorIsSet = true; } else if (ed != null && ed.isWhiteBorder() && state.getFoilIndex() == 0) { // Non-foil cards from white-bordered sets are drawn with white border - // unless selecting and card is not selectable - g2d.setColor(matchUI.isSelecting()&&!matchUI.isSelectable(getCard())?Color.DARK_GRAY:Color.WHITE); + g2d.setColor(Color.WHITE); colorIsSet = true; } if (colorIsSet) { @@ -314,12 +306,10 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl } } - if (matchUI.isSelectable(getCard())) { // Replace border for selectable cards + if (matchUI.isSelectable(getCard())) { // White border for selectable cards to further highlight them g2d.setColor(Color.WHITE); final int ins = 1; - g2d.fillRoundRect(cardXOffset+ins, cardYOffset+ins, cardWidth-ins*2, cardHeight-ins*2, cornerSize-ins, cornerSize-ins); - // final int n2 = Math.max(2, Math.round(2 * cardWidth * CardPanel.SELECTED_BORDER_SIZE)); - // g2d.fillRoundRect(cardXOffset - n2, (cardYOffset - n2) + offset, cardWidth + (n2 * 2), cardHeight + (n2 * 2), cornerSize + n2, cornerSize + n2); + g2d.fillRoundRect(cardXOffset+ins, cardYOffset+ins, cardWidth-ins*2, cardHeight-ins*2, cornerSize-ins, cornerSize-ins); } } @@ -344,6 +334,19 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl drawFoilEffect(g, card, cardXOffset, cardYOffset, cardWidth, cardHeight, Math.round(cardWidth * BLACK_BORDER_SIZE)); } + + System.out.println("Painting " + getCard() + " selecting " + matchUI.isSelecting()); + boolean nonselectable = matchUI.isSelecting() && !matchUI.isSelectable(getCard()); + // if selecting, darken non-selectable cards - pfps - needs fixes to refreshing to do right + if ( nonselectable ) { + System.out.println("Paint nonselectable " + card); + boolean noBorderPref = !isPreferenceEnabled(FPref.UI_RENDER_BLACK_BORDERS); + boolean cardImgHasAlpha = imagePanel != null && imagePanel.getSrcImage() != null && imagePanel.getSrcImage().getColorModel().hasAlpha(); + final int cornerSize = noBorderPref && !cardImgHasAlpha ? 0 : Math.max(4, Math.round(cardWidth * CardPanel.ROUNDED_CORNER_SIZE)); + final int offset = isTapped() && (!noBorderPref || cardImgHasAlpha) ? 1 : 0; + g.setColor(new Color(0.0f,0.0f,0.0f,0.6f)); + g.fillRoundRect(cardXOffset, cardYOffset + offset, cardWidth, cardHeight, cornerSize, cornerSize); + } } public static void drawFoilEffect(final Graphics g, final CardView card2, final int x, final int y, final int width, final int height, final int borderSize) { diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/ScaledImagePanel.java b/forge-gui-desktop/src/main/java/forge/view/arcane/ScaledImagePanel.java index a9867f6db6c..26021b0f670 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/ScaledImagePanel.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/ScaledImagePanel.java @@ -20,7 +20,6 @@ package forge.view.arcane; import javax.swing.*; import java.awt.*; import java.awt.image.BufferedImage; -import java.awt.image.RescaleOp; /** *

@@ -38,10 +37,6 @@ public class ScaledImagePanel extends JPanel { * */ private volatile BufferedImage srcImage; - private float brightness = 1.0f; - public void setBrightness(final float bright) { - brightness = bright; - } /** *

@@ -132,9 +127,7 @@ public class ScaledImagePanel extends JPanel { } else { int x = (sz.width / 2) - (img.getWidth() / 2); int y = (sz.height / 2) - (img.getHeight() / 2); - Graphics2D g2d = (Graphics2D) g; - RescaleOp brighten = new RescaleOp(brightness,0,null); - g2d.drawImage(img, brighten, x, y); + g.drawImage(img, x, y, null); } } From d9400fe0694ba6b58b0d18defbd5235dfbd7180a Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 27 Jan 2019 17:55:04 +0000 Subject: [PATCH 687/901] Update rix_maadi_reveler.txt --- .../res/cardsfolder/upcoming/rix_maadi_reveler.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/rix_maadi_reveler.txt b/forge-gui/res/cardsfolder/upcoming/rix_maadi_reveler.txt index 7af42a6556d..cfd4bd2db5d 100644 --- a/forge-gui/res/cardsfolder/upcoming/rix_maadi_reveler.txt +++ b/forge-gui/res/cardsfolder/upcoming/rix_maadi_reveler.txt @@ -3,10 +3,10 @@ ManaCost:1 R Types:Creature Human Shaman PT:2/2 K:Flying -K:Morph:2 B R -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, discard a card, then draw a card. If CARDNAME's Goblin cost was paid, instead discard your hand, then draw three cards. -SVar:TrigDiscard:DB$ Discard | NumCards$ 1 | Mode$ TgtChoose | SubAbility$ DBDraw -SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 3 | SubAbility$ DBDiscard -SVar:DBDiscard:DB$ Discard | Mode$ Hand | Defined$ You | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ1 | References$ X | SubAbility$ DBDraw -SVar:DBDraw +K:Spectacle:2 B R +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, discard a card, then draw a card. If CARDNAME's spectacle cost was paid, instead discard your hand, then draw three cards. +SVar:TrigDiscard:DB$ Discard | NumCards$ 1 | Mode$ TgtChoose | SubAbility$ DBDrawOne | ConditionDefined$ TriggeredCard | ConditionPresent$ Card.spectacle | ConditionCompare$ EQ0 +SVar:DBDrawOne:DB$ Draw | Defined$ You | NumCards$ 1 | ConditionDefined$ TriggeredCard | ConditionPresent$ Card.spectacle | ConditionCompare$ EQ0 | SubAbility$ DBDiscard +SVar:DBDiscard:DB$ Discard | Mode$ Hand | Defined$ You | SubAbility$ DBDrawThree | ConditionDefined$ TriggeredCard | ConditionPresent$ Card.spectacle +SVar:DBDrawThree:DB$ Draw | Defined$ You | NumCards$ 3 | ConditionDefined$ TriggeredCard | ConditionPresent$ Card.spectacle Oracle:Spectacle {2}{B}{R} (You may cast this spell for its spectacle cost rather than its mana cost if an opponent lost life this turn.)\nWhen Rix Maadi Reveler enters the battlefield, discard a card, then draw a card. If Rix Maadi Reveler's spectacle cost was paid, instead discard your hand, then draw three cards. From 79c3570bcc61dce96ac2643cfdaf198049f85da8 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 27 Jan 2019 17:55:48 +0000 Subject: [PATCH 688/901] Update gutterbones.txt --- forge-gui/res/cardsfolder/upcoming/gutterbones.txt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/gutterbones.txt b/forge-gui/res/cardsfolder/upcoming/gutterbones.txt index 89207d77bf6..25cbbb43111 100644 --- a/forge-gui/res/cardsfolder/upcoming/gutterbones.txt +++ b/forge-gui/res/cardsfolder/upcoming/gutterbones.txt @@ -3,7 +3,6 @@ ManaCost:B Types:Creature Skeleton Warrior PT:2/1 K:CARDNAME enters the battlefield tapped. -A:AB$ ChangeZone | Cost$ 1 B | Origin$ Graveyard | Destination$ Hand | ActivationZone$ Graveyard | OpponentTurn$ True | SubAbility$ DBEffect | SpellDescription$ Return CARDNAME from your graveyard to your hand. Activate this ability only during your turn and only if an opponent lost life this turn. -SVar:DBEffect:DB$ Effect | CheckSVar$ X | SVarCompare$ GE1 | References$ X | StaticAbilities$ MustAttack | SubAbility$ DBCleanup -SVar:RPrevent:Mode$ Continuous | EffectZone$ Command | Affected$ You | AddKeyword$ You only during your turn and only if an opponent lost life this turn. | Description$ Activate this ability only during your turn and only if an opponent +A:AB$ ChangeZone | Cost$ 1 B | Origin$ Graveyard | Destination$ Hand | ActivationZone$ Graveyard | PlayerTurn$ True | CheckSVar$ X | References$ X | SpellDescription$ Return CARDNAME from your graveyard to your hand. Activate this ability only during your turn and only if an opponent lost life this turn. +SVar:X:Count$LifeOppsLostThisTurn Oracle:Gutterbones enters the battlefield tapped.\n{1}{B}: Return Gutterbones from your graveyard to your hand. Activate this ability only during your turn and only if an opponent lost life this turn. From 07324f63d90fb147759e4a36765826fb83844695 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 27 Jan 2019 17:56:47 +0000 Subject: [PATCH 689/901] Update spawn_of_mayhem.txt --- forge-gui/res/cardsfolder/upcoming/spawn_of_mayhem.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/spawn_of_mayhem.txt b/forge-gui/res/cardsfolder/upcoming/spawn_of_mayhem.txt index 3d4b5725ea0..e1e05351ad4 100644 --- a/forge-gui/res/cardsfolder/upcoming/spawn_of_mayhem.txt +++ b/forge-gui/res/cardsfolder/upcoming/spawn_of_mayhem.txt @@ -6,7 +6,7 @@ K:Spectacle:1 B B K:Flying K:Trample T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDmg | TriggerDescription$ At the beginning of your upkeep, CARDNAME deals 1 damage to each player. Then if you have 10 or less life, put a +1/+1 counter on CARDNAME. -SVar:TrigDmgOpp:DB$DealDamage | Defined$ Player | NumDmg$ 1 | SubAbility$ DBCounter +SVar:TrigDmg:DB$DealDamage | Defined$ Player | NumDmg$ 1 | SubAbility$ DBCounter SVar:DBCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | ConditionCheckSVar$ X | ConditionSVarCompare$ LE10 | References$ X SVar:X:Count$YourLifeTotal DeckHas:Ability$Counters From 3b21b2a6103bfdfc89edae5001150f691edabc43 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 27 Jan 2019 17:58:28 +0000 Subject: [PATCH 690/901] Fix fireblade_artist dealing damage on sacrifice --- forge-gui/res/cardsfolder/upcoming/fireblade_artist.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/fireblade_artist.txt b/forge-gui/res/cardsfolder/upcoming/fireblade_artist.txt index a75291fad70..109b188cb6b 100644 --- a/forge-gui/res/cardsfolder/upcoming/fireblade_artist.txt +++ b/forge-gui/res/cardsfolder/upcoming/fireblade_artist.txt @@ -4,6 +4,7 @@ Types:Creature Human Shaman PT:2/2 K:Haste T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSacrifice | TriggerDescription$ At the beginning of your upkeep, you may sacrifice a creature. When you do, CARDNAME deals 2 damage to target opponent or planeswalker. -SVar:TrigSacrifice:DB$ Sacrifice | Optional$ True | SacValid$ Creature | Amount$ 1 -SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Opponent,Planeswalker | TgtPrompt$ Select target opponent or planeswalker | NumDmg$ 2 +SVar:TrigSacrifice:DB$ Sacrifice | Optional$ True | SacValid$ Creature | Amount$ 1 | RememberSacrificed$ True | SubAbility$ TrigDealDamage +SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Opponent,Planeswalker | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ GE1 | TgtPrompt$ Select target opponent or planeswalker | NumDmg$ 2 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True Oracle:Haste\nAt the beginning of your upkeep, you may sacrifice a creature. When you do, Fireblade Artist deals 2 damage to target opponent or planeswalker. From 4fa8fa399306e0e5e7f457c76c9de78d4ad8b811 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 27 Jan 2019 18:04:06 +0000 Subject: [PATCH 691/901] Update sentinels_mark.txt --- forge-gui/res/cardsfolder/upcoming/sentinels_mark.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/sentinels_mark.txt b/forge-gui/res/cardsfolder/upcoming/sentinels_mark.txt index 5d6b7ac507e..5a6c80a41b2 100644 --- a/forge-gui/res/cardsfolder/upcoming/sentinels_mark.txt +++ b/forge-gui/res/cardsfolder/upcoming/sentinels_mark.txt @@ -5,6 +5,6 @@ K:Flash K:Enchant creature A:SP$ Attach | Cost$ 1 W | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 2 | AddKeyword$ Vigilance | Description$ Enchanted creature gets +1/+2 and has vigilance. -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigPump | Condition$ Main1 | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it during your main phase, enchanted creature gains lifelink until end of turn. +T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigPump | Condition$ Main1,Main2 | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it during your main phase, enchanted creature gains lifelink until end of turn. SVar:TrigPump:DB$ Pump | Defined$ Enchanted | KW$ Lifelink Oracle:Flash\nEnchant creature\nEnchanted creature gets +1/+2 and has vigilance.\nAddendum — When Sentinel's Mark enters the battlefield, if you cast it during your main phase, enchanted creature gains lifelink until end of turn. From 54c5d3f344042901b6d460fbff7ac5528c6f1039 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 27 Jan 2019 19:25:20 +0000 Subject: [PATCH 692/901] Fix Fireblade Artist to reflect "when you" sacrifice trigger (similar to Heart-Piercer Manticore) --- forge-gui/res/cardsfolder/upcoming/fireblade_artist.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/fireblade_artist.txt b/forge-gui/res/cardsfolder/upcoming/fireblade_artist.txt index 109b188cb6b..34056eb8782 100644 --- a/forge-gui/res/cardsfolder/upcoming/fireblade_artist.txt +++ b/forge-gui/res/cardsfolder/upcoming/fireblade_artist.txt @@ -4,7 +4,7 @@ Types:Creature Human Shaman PT:2/2 K:Haste T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSacrifice | TriggerDescription$ At the beginning of your upkeep, you may sacrifice a creature. When you do, CARDNAME deals 2 damage to target opponent or planeswalker. -SVar:TrigSacrifice:DB$ Sacrifice | Optional$ True | SacValid$ Creature | Amount$ 1 | RememberSacrificed$ True | SubAbility$ TrigDealDamage -SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Opponent,Planeswalker | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ GE1 | TgtPrompt$ Select target opponent or planeswalker | NumDmg$ 2 | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:TrigSacrifice:DB$ Sacrifice | Optional$ True | SacValid$ Creature | Amount$ 1 | SacrificeParam$ FirebladeArtist | AILogic$ ConsiderSac +T:Mode$ Sacrificed | ValidPlayer$ You | ValidCard$ Creature | CauseParam$ FirebladeArtist | Execute$ TrigDealDamage | Secondary$ True | TriggerDescription$ CARDNAME deals 2 damage to target opponent or planeswalker. +SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Opponent,Planeswalker | TgtPrompt$ Select target opponent or planeswalker | NumDmg$ 2 Oracle:Haste\nAt the beginning of your upkeep, you may sacrifice a creature. When you do, Fireblade Artist deals 2 damage to target opponent or planeswalker. From acdee9ff0ca580e6354ebf99b0a4ab0b36f1e2be Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 27 Jan 2019 19:43:56 +0000 Subject: [PATCH 693/901] Update fireblade_artist.txt --- forge-gui/res/cardsfolder/upcoming/fireblade_artist.txt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/fireblade_artist.txt b/forge-gui/res/cardsfolder/upcoming/fireblade_artist.txt index 34056eb8782..c2adafe9cb5 100644 --- a/forge-gui/res/cardsfolder/upcoming/fireblade_artist.txt +++ b/forge-gui/res/cardsfolder/upcoming/fireblade_artist.txt @@ -4,7 +4,8 @@ Types:Creature Human Shaman PT:2/2 K:Haste T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSacrifice | TriggerDescription$ At the beginning of your upkeep, you may sacrifice a creature. When you do, CARDNAME deals 2 damage to target opponent or planeswalker. -SVar:TrigSacrifice:DB$ Sacrifice | Optional$ True | SacValid$ Creature | Amount$ 1 | SacrificeParam$ FirebladeArtist | AILogic$ ConsiderSac -T:Mode$ Sacrificed | ValidPlayer$ You | ValidCard$ Creature | CauseParam$ FirebladeArtist | Execute$ TrigDealDamage | Secondary$ True | TriggerDescription$ CARDNAME deals 2 damage to target opponent or planeswalker. -SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Opponent,Planeswalker | TgtPrompt$ Select target opponent or planeswalker | NumDmg$ 2 +SVar:TrigSacrifice:DB$ Sacrifice | Optional$ True | SacValid$ Creature | Amount$ 1 | RememberSacrificed$ True | SubAbility$ TrigImmediate +SVar:TrigImmediate:DB$ ImmediateTrigger | Execute$ TrigDealDamage | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ GE1 | TriggerDescription$ When you do, CARDNAME deals 2 damage to target opponent or planeswalker. +SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Opponent,Planeswalker | TgtPrompt$ Select target opponent or planeswalker | NumDmg$ 2 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True Oracle:Haste\nAt the beginning of your upkeep, you may sacrifice a creature. When you do, Fireblade Artist deals 2 damage to target opponent or planeswalker. From 625585f0057c9dd2c83151ec573a5349bffd9d5c Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 27 Jan 2019 20:15:05 +0000 Subject: [PATCH 694/901] Fixed Scry 3 --- forge-gui/res/cardsfolder/upcoming/precognitive_perception.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/precognitive_perception.txt b/forge-gui/res/cardsfolder/upcoming/precognitive_perception.txt index 2bd4cc8757a..0b2a2ef5f7c 100644 --- a/forge-gui/res/cardsfolder/upcoming/precognitive_perception.txt +++ b/forge-gui/res/cardsfolder/upcoming/precognitive_perception.txt @@ -1,6 +1,6 @@ Name:Precognitive Perception ManaCost:3 U U Types:Instant -A:SP$ Scry | Cost$ 3 U U | NumCards$ 3 | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SubAbility$ DBDraw | SpellDescription$ Draw three cards.\nAddendum — If you cast this spell during your main phase, instead scry 3, then draw three cards. +A:SP$ Scry | Cost$ 3 U U | ScryNum$ 3 | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SubAbility$ DBDraw | SpellDescription$ Draw three cards.\nAddendum — If you cast this spell during your main phase, instead scry 3, then draw three cards. SVar:DBDraw:DB$ Draw | Cost$ 3 U U | NumCards$ 3 Oracle:Draw three cards.\nAddendum — If you cast this spell during your main phase, instead scry 3, then draw three cards. From 1dc8ef5244d670d58e5e6c5ed737078c8533410a Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 27 Jan 2019 20:34:35 +0000 Subject: [PATCH 695/901] Fixed problem with self-exiling after trigger resolution (Hanmac) --- .../upcoming/lumbering_battlement.txt | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/lumbering_battlement.txt b/forge-gui/res/cardsfolder/upcoming/lumbering_battlement.txt index 0838ca63c67..9e3ec703e98 100644 --- a/forge-gui/res/cardsfolder/upcoming/lumbering_battlement.txt +++ b/forge-gui/res/cardsfolder/upcoming/lumbering_battlement.txt @@ -3,11 +3,21 @@ ManaCost:4 W Types:Creature Beast PT:4/5 K:Vigilance -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile any number of other nontoken creatures you control until it leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | ChangeType$ Creature.nonToken+Other+YouCtrl | TargetMin$ 0 | TargetMax$ X | References$ X | Mandatory$ True | SubAbility$ DBEffect -SVar:DBEffect:DB$ Effect | Triggers$ ComeBack | RememberObjects$ Remembered | ImprintCards$ Remembered | SVars$ TrigReturn,ExileSelf | ConditionPresent$ Card.IsRemembered | ConditionCompare$ GE1 -SVar: +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ DBChooseExile | TriggerDescription$ When CARDNAME enters the battlefield, exile any number of other nontoken creatures you control until it leaves the battlefield. +SVar:DBChooseExile:DB$ ChooseCard | Defined$ You | MinAmount$ 0 | Amount$ MaxTgts | References$ MaxTgts | Choices$ Creature.nonToken+Other+YouCtrl | ChoiceTitle$ Choose any number of other nontoken creatures you control | ChoiceZone$ Battlefield | SubAbility$ TrigExile +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | Defined$ ChosenCard | SubAbility$ DBEffect +SVar:DBEffect:DB$ Effect | Triggers$ ComeBack | RememberObjects$ RememberedCard | ImprintCards$ Self | SVars$ TrigReturn,ExileSelf | ConditionPresent$ Card.Self | Duration$ Permanent | ForgetOnMoved$ Exile | SubAbility$ DBCleanup +SVar:ComeBack:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.IsImprinted | Execute$ TrigReturn | TriggerZones$ Command | TriggerController$ TriggeredCardController | Static$ True | TriggerDescription$ That creature is exiled until EFFECTSOURCE leaves the battlefield +SVar:TrigReturn:DB$ ChangeZoneAll | Origin$ Exile | Destination$ Battlefield | ChangeType$ Card.IsRemembered | SubAbility$ ExileSelf +SVar:ExileSelf:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self +SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | AddToughness$ X | References$ X | Description$ CARDNAME gets +2/+2 for each card exiled with it. -SVar:X:Count$Valid Card.IsRemembered+namedCARDNAME/Times.2 +#Triggers to forget remembered on this +T:Mode$ ChangesZone | ValidCard$ Card.IsRemembered | Origin$ Exile | Destination$ Any | TriggerZones$ Battlefield | Static$ True | Execute$ TrigForget +SVar:TrigForget:DB$ Pump | ForgetObjects$ TriggeredCard +T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Any | Static$ True | Execute$ TrigForgetAll +SVar:TrigForgetAll:DB$ Cleanup | ClearRemembered$ True +SVar:X:Count$ValidExile Card.IsRemembered+ExiledWithSource/Times.2 +SVar:MaxTgts:Count$Valid Creature.nonToken+Other+YouCtrl SVar:RemRandomDeck:True Oracle:Vigilance\nWhen Lumbering Battlement enters the battlefield, exile any number of other nontoken creatures you control until it leaves the battlefield.\nLumbering Battlement gets +2/+2 for each card exiled with it. From 8b7ace6d1c8e8b9131ce3e04f65be7bc51d4590c Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 27 Jan 2019 21:45:52 +0000 Subject: [PATCH 696/901] Added TrigChangeZone to bounce it back, and CheckSVar to check if instant cast in Main Phase --- forge-gui/res/cardsfolder/upcoming/dovins_acuity.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/dovins_acuity.txt b/forge-gui/res/cardsfolder/upcoming/dovins_acuity.txt index 72a7e9e4c1a..41757ebaac4 100644 --- a/forge-gui/res/cardsfolder/upcoming/dovins_acuity.txt +++ b/forge-gui/res/cardsfolder/upcoming/dovins_acuity.txt @@ -2,9 +2,10 @@ Name:Dovin's Acuity ManaCost:1 W U Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 2 life and draw a card. -T:Mode$ SpellCast | ValidCard$ Instant | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ Whenever you cast an instant spell during your main phase, you may return CARDNAME to its owner's hand. SVar:TrigGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 | SubAbility$ DBDraw SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 1 -SVar:X:Count$IfMainPhase +T:Mode$ SpellCast | ValidCard$ Instant | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | PlayerTurn$ True | CheckSVar$ X | SVarCompare$ GE1 | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ Whenever you cast an instant spell during your main phase, you may return CARDNAME to its owner's hand. +SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Defined$ Self +SVar:X:Count$IfMainPhase.1.0 DeckHas:Ability$LifeGain Oracle:When Dovin's Acuity enters the battlefield, you gain 2 life and draw a card.\nWhenever you cast an instant spell during your main phase, you may return Dovin's Acuity to its owner's hand. From b23425ea9af6aa797a5868b0bda982280844a62e Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 27 Jan 2019 22:37:18 +0000 Subject: [PATCH 697/901] Update bloodmist_infiltrator.txt --- forge-gui/res/cardsfolder/upcoming/bloodmist_infiltrator.txt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/bloodmist_infiltrator.txt b/forge-gui/res/cardsfolder/upcoming/bloodmist_infiltrator.txt index 595582978bd..564757411cf 100644 --- a/forge-gui/res/cardsfolder/upcoming/bloodmist_infiltrator.txt +++ b/forge-gui/res/cardsfolder/upcoming/bloodmist_infiltrator.txt @@ -3,7 +3,5 @@ ManaCost:2 B Types:Creature Vampire PT:3/1 T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, you may sacrifice another creature. If you do, CARDNAME can't be blocked this turn. -SVar:TrigPump:AB$ Pump | Cost$ Sac<1/Creature.Other/another creature> | Defined$ Self | KW$ HIDDEN Unblockable | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ1 | SubAbility$ DBCleanup | References$ X -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:X:Remembered$Amount +SVar:TrigPump:AB$ Pump | Cost$ Sac<1/Creature.Other/another creature> | Defined$ Self | KW$ HIDDEN Unblockable Oracle:Whenever Bloodmist Infiltrator attacks, you may sacrifice another creature. If you do, Bloodmist Infiltrator can't be blocked this turn. From 0bfdfb78d3015be5af6c51d7b1e063e7ff042cab Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 27 Jan 2019 22:43:34 +0000 Subject: [PATCH 698/901] Update ill_gotten_inheritance.txt --- .../cardsfolder/upcoming/ill_gotten_inheritance.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/ill_gotten_inheritance.txt b/forge-gui/res/cardsfolder/upcoming/ill_gotten_inheritance.txt index 5c3658aca13..85cf8828a10 100644 --- a/forge-gui/res/cardsfolder/upcoming/ill_gotten_inheritance.txt +++ b/forge-gui/res/cardsfolder/upcoming/ill_gotten_inheritance.txt @@ -1,9 +1,9 @@ Name:Ill-Gotten Inheritance ManaCost:3 B Types:Enchantment -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDamageAll | TriggerDescription$ At the beginning of your upkeep, CARDNAME deals 1 damage to each opponent and you gain 1 life. -SVar:TrigDealDamage:DB$ DamageAll | ValidPlayers$ Player.Opponent | NumDmg$ 1 | SubAbility$ DBGainLife -SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 -A:AB$ DealDamage | Cost$ 5 B Sac<1/CARDNAME> | ValidTgts$ Opponent | NumDmg$ 4 | SubAbility$ DBGainLife | SpellDescription$ CARDNAME deals 4 damage to target opponent and you gain 4 life. -SVar:DBGainLife:DB$GainLife | LifeAmount$ 4 +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ At the beginning of your upkeep, CARDNAME deals 1 damage to each opponent and you gain 1 life. +SVar:TrigDealDamage:DB$ DamageAll | ValidPlayers$ Player.Opponent | NumDmg$ 1 | SubAbility$ DBGainOneLife +SVar:DBGainOneLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 +A:AB$ DealDamage | Cost$ 5 B Sac<1/CARDNAME> | ValidTgts$ Opponent | NumDmg$ 4 | SubAbility$ DBGainFourLife | SpellDescription$ CARDNAME deals 4 damage to target opponent and you gain 4 life. +SVar:DBGainFourLife:DB$GainLife | Defined$ You | LifeAmount$ 4 Oracle:At the beginning of your upkeep, Ill-Gotten Inheritance deals 1 damage to each opponent and you gain 1 life.\n{5}{B}, Sacrifice Ill-Gotten Inheritance: It deals 4 damage to target opponent and you gain 4 life. From a1ad2208c8489c9928dab5bf176c47da3cd2ea9b Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 27 Jan 2019 23:01:06 +0000 Subject: [PATCH 699/901] Update rix_maadi_reveler.txt --- forge-gui/res/cardsfolder/upcoming/rix_maadi_reveler.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/rix_maadi_reveler.txt b/forge-gui/res/cardsfolder/upcoming/rix_maadi_reveler.txt index cfd4bd2db5d..f7ceece6349 100644 --- a/forge-gui/res/cardsfolder/upcoming/rix_maadi_reveler.txt +++ b/forge-gui/res/cardsfolder/upcoming/rix_maadi_reveler.txt @@ -2,7 +2,6 @@ Name:Rix Maadi Reveler ManaCost:1 R Types:Creature Human Shaman PT:2/2 -K:Flying K:Spectacle:2 B R T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, discard a card, then draw a card. If CARDNAME's spectacle cost was paid, instead discard your hand, then draw three cards. SVar:TrigDiscard:DB$ Discard | NumCards$ 1 | Mode$ TgtChoose | SubAbility$ DBDrawOne | ConditionDefined$ TriggeredCard | ConditionPresent$ Card.spectacle | ConditionCompare$ EQ0 From 766277673da1205454f2f3c08bf10e538d8fe6d1 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 27 Jan 2019 23:45:21 +0000 Subject: [PATCH 700/901] Update simic_locket.txt --- forge-gui/res/cardsfolder/upcoming/simic_locket.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/simic_locket.txt b/forge-gui/res/cardsfolder/upcoming/simic_locket.txt index 22025cfffd4..e7886996cae 100644 --- a/forge-gui/res/cardsfolder/upcoming/simic_locket.txt +++ b/forge-gui/res/cardsfolder/upcoming/simic_locket.txt @@ -2,7 +2,7 @@ Name:Simic Locket ManaCost:3 Types:Artifact A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. AI:RemoveDeck:Random DeckNeeds:Color$Green | Blue A:AB$ Draw | Cost$ GU GU GU GU T Sac<1/CARDNAME> | NumCards$ 2 | SpellDescription$ Draw two cards. From 25003aa74e5a95e384ece291386dc823eeb02bae Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Sun, 27 Jan 2019 21:09:52 -0500 Subject: [PATCH 701/901] better way to schedule visual updates to non-selectable cards --- .../java/forge/screens/match/CMatchUI.java | 39 +++++++++++++++++++ .../java/forge/view/arcane/CardPanel.java | 7 +--- .../java/forge/view/arcane/FloatingZone.java | 5 +++ 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index db4efdbbee0..1e12acb4e9e 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -524,6 +524,45 @@ public final class CMatchUI } } + @Override + public void setSelectables(final Iterable cards) { + super.setSelectables(cards); + // update zones on tabletop and floating zones - non-selectable cards may be rendered differently + FThreads.invokeInEdtNowOrLater(new Runnable() { + @Override public final void run() { + for (final PlayerView p : getGameView().getPlayers()) { + if ( p.getCards(ZoneType.Battlefield) != null ) { + updateCards(p.getCards(ZoneType.Battlefield)); + } + if ( p.getCards(ZoneType.Hand) != null ) { + updateCards(p.getCards(ZoneType.Hand)); + } + } + FloatingZone.refreshAll(); + } + }); + } + + @Override + public void clearSelectables() { + super.clearSelectables(); + // update zones on tabletop and floating zones - non-selectable cards may be rendered differently + FThreads.invokeInEdtNowOrLater(new Runnable() { + @Override public final void run() { + for (final PlayerView p : getGameView().getPlayers()) { + if ( p.getCards(ZoneType.Battlefield) != null ) { + updateCards(p.getCards(ZoneType.Battlefield)); + } + if ( p.getCards(ZoneType.Hand) != null ) { + updateCards(p.getCards(ZoneType.Hand)); + } + } + FloatingZone.refreshAll(); + } + }); + } + + @Override public List getMenus() { return menus.getMenus(); diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java index 7d0cbb2ce89..8a7ee3c99c1 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java @@ -279,7 +279,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl if (isSelected) { g2d.setColor(Color.green); final int n = Math.max(1, Math.round(cardWidth * CardPanel.SELECTED_BORDER_SIZE)); - g2d.fillRoundRect(cardXOffset - n, (cardYOffset - n) + offset, cardWidth + (n * 2), cardHeight + (n * 2), cornerSize + n , cornerSize + n); + g2d.fillRoundRect(cardXOffset - n, (cardYOffset - n) + offset, cardWidth + (n * 2), cardHeight + (n * 2), cornerSize + n , cornerSize + n); } // Black fill - (will become an outline for white bordered cards) @@ -335,11 +335,9 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl cardWidth, cardHeight, Math.round(cardWidth * BLACK_BORDER_SIZE)); } - System.out.println("Painting " + getCard() + " selecting " + matchUI.isSelecting()); boolean nonselectable = matchUI.isSelecting() && !matchUI.isSelectable(getCard()); - // if selecting, darken non-selectable cards - pfps - needs fixes to refreshing to do right + // if selecting, darken non-selectable cards if ( nonselectable ) { - System.out.println("Paint nonselectable " + card); boolean noBorderPref = !isPreferenceEnabled(FPref.UI_RENDER_BLACK_BORDERS); boolean cardImgHasAlpha = imagePanel != null && imagePanel.getSrcImage() != null && imagePanel.getSrcImage().getColorModel().hasAlpha(); final int cornerSize = noBorderPref && !cardImgHasAlpha ? 0 : Math.max(4, Math.round(cardWidth * CardPanel.ROUNDED_CORNER_SIZE)); @@ -373,7 +371,6 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl final boolean canShow = matchUI.mayView(card); final boolean showText = !imagePanel.hasImage() || !isAnimationPanel; - System.out.println("doLayout " + card); displayCardNameOverlay(showText && canShow && showCardNameOverlay(), imgSize, imgPos); displayPTOverlay(showText && (canShow || card.isFaceDown()) && showCardPowerOverlay(), imgSize, imgPos); displayCardIdOverlay(showText && canShow && showCardIdOverlay(), imgSize, imgPos); diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java index d81af9fef88..616a7cce38c 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java @@ -94,6 +94,11 @@ public class FloatingZone extends FloatingCardArea { } floatingAreas.clear(); } + public static void refreshAll() { + for (final FloatingZone cardArea : floatingAreas.values()) { + cardArea.refresh(); + } + } private final ZoneType zone; private PlayerView player; From 01c52667ad7fdb90cf1f30179bce04246a55409c Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Mon, 28 Jan 2019 07:01:43 +0000 Subject: [PATCH 702/901] Update forge-gui/res/cardsfolder/upcoming/cavalcade_of_calamity.txt, forge-gui/res/cardsfolder/r/raid_bombardment.txt, forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt, forge-gui/res/cardsfolder/upcoming/get_the_point.txt, forge-gui/res/cardsfolder/upcoming/haazda_officer.txt, forge-gui/res/cardsfolder/upcoming/lawmages_binding.txt, forge-gui/res/cardsfolder/upcoming/rubble_slinger.txt, forge-gui/res/cardsfolder/upcoming/rubblebelt_runner.txt, forge-gui/res/cardsfolder/upcoming/screaming_shield.txt, forge-gui/res/cardsfolder/upcoming/scuttlegator.txt, forge-gui/res/cardsfolder/upcoming/senate_griffin.txt, forge-gui/res/cardsfolder/upcoming/summary_judgment.txt, forge-gui/res/cardsfolder/upcoming/vizkopa_vampire.txt files --- forge-gui/res/cardsfolder/r/raid_bombardment.txt | 7 +++---- .../res/cardsfolder/upcoming/cavalcade_of_calamity.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/get_the_point.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/haazda_officer.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/lawmages_binding.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/rubble_slinger.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/rubblebelt_runner.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/screaming_shield.txt | 7 +++++++ forge-gui/res/cardsfolder/upcoming/scuttlegator.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/senate_griffin.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/summary_judgment.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/vizkopa_vampire.txt | 6 ++++++ 13 files changed, 87 insertions(+), 4 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/cavalcade_of_calamity.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/get_the_point.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/haazda_officer.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/lawmages_binding.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/rubble_slinger.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/rubblebelt_runner.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/screaming_shield.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/scuttlegator.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/senate_griffin.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/summary_judgment.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/vizkopa_vampire.txt diff --git a/forge-gui/res/cardsfolder/r/raid_bombardment.txt b/forge-gui/res/cardsfolder/r/raid_bombardment.txt index 2534b51ec7c..5cf328f2974 100644 --- a/forge-gui/res/cardsfolder/r/raid_bombardment.txt +++ b/forge-gui/res/cardsfolder/r/raid_bombardment.txt @@ -1,8 +1,7 @@ Name:Raid Bombardment ManaCost:2 R Types:Enchantment -T:Mode$ Attacks | ValidCard$ Creature.powerLE2+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a creature you control with power 2 or less attacks, CARDNAME deals 1 damage to defending player. -SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredDefendingPlayer | NumDmg$ 1 +T:Mode$ Attacks | ValidCard$ Creature.powerLE2+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a creature you control with power 2 or less attacks, CARDNAME deals 1 damage to the player or planeswalker that creature is attacking +SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredAttacked | NumDmg$ 1 SVar:PlayMain1:TRUE -SVar:Picture:http://www.wizards.com/global/images/magic/general/raid_bombardment.jpg -Oracle:Whenever a creature you control with power 2 or less attacks, Raid Bombardment deals 1 damage to defending player. +Oracle:Whenever a creature you control with power 2 or less attacks, Raid Bombardment deals 1 damage to the player or planeswalker that creature is attacking. diff --git a/forge-gui/res/cardsfolder/upcoming/cavalcade_of_calamity.txt b/forge-gui/res/cardsfolder/upcoming/cavalcade_of_calamity.txt new file mode 100644 index 00000000000..a4e5f920e7e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/cavalcade_of_calamity.txt @@ -0,0 +1,7 @@ +Name:Cavalcade of Calamity +ManaCost:1 R +Types:Enchantment +T:Mode$ Attacks | ValidCard$ Creature.powerLE1+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a creature you control with power 1 or less attacks, CARDNAME deals 1 damage to the player or planeswalker that creature is attacking +SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredAttacked | NumDmg$ 1 +SVar:PlayMain1:TRUE +Oracle:Whenever a creature you control with power 1 or less attacks, Cavalcade of Calamity deals 1 damage to the player or planeswalker that creature is attacking. diff --git a/forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt b/forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt new file mode 100644 index 00000000000..4be78823eca --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt @@ -0,0 +1,8 @@ +Name:Forbidding Spirit +ManaCost:1 W W +Types:Creature Spirit Cleric +PT:3/3 +T:Mode$ ChangeZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Self | Execute$ TempAttackTax | TriggerDescription$ When CARDNAME enters the battlefield, until your next turn, creatures can’t attack you or a planeswalker you control unless their controller pays {2} for each of those creatures. +SVar:TempAttackTax:DB$ Effect | Name$ Forbidding Spirit Effect | StaticAbilities$ TempoCantAttack | Duration$ UntilYourNextTurn | SpellDescription$ Until your next turn, creatures can’t attack you or a planeswalker you control unless their controller pays {2} for each of those creatures. +SVar:TempoCantAttack:Mode$ CantAttackUnless | ValidCard$ Creature | Target$ You,Planeswalker.YouCtrl | Cost$ 2 | Description$ Until your next turn, creatures can't attack you or a planeswalker you control unless their controller pays {2} for each of those creatures. +Oracle:When Forbidding Spirit enters the battlefield, until your next turn, creatures can’t attack you or a planeswalker you control unless their controller pays {2} for each of those creatures. diff --git a/forge-gui/res/cardsfolder/upcoming/get_the_point.txt b/forge-gui/res/cardsfolder/upcoming/get_the_point.txt new file mode 100644 index 00000000000..1a09941bc97 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/get_the_point.txt @@ -0,0 +1,6 @@ +Name:Get the Point +ManaCost:3 B R +Types:Instant +A:SP$ Destroy | Cost$ 3 B R | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBScry | SpellDescription$ Destroy target creature. Scry 1. +SVar:DBScry:DB$ Scry | ScryNum$ 1 +Oracle:Destroy target creature. Scry 1. diff --git a/forge-gui/res/cardsfolder/upcoming/haazda_officer.txt b/forge-gui/res/cardsfolder/upcoming/haazda_officer.txt new file mode 100644 index 00000000000..0890f2ade76 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/haazda_officer.txt @@ -0,0 +1,8 @@ +Name:Haazda Officer +ManaCost:2 W +Types:Creature Human Soldier +PT:3/2 +T:Mode$ ChangeZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature you control gets +1/+1 until end of turn. +SVar:TrigPump:DB$Pump | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | NumAtt$ 1 | NumDef$ 1 +SVar:PlayMain1:TRUE +Oracle:When Haazda Officer enters the battlefield, target creature you control gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/lawmages_binding.txt b/forge-gui/res/cardsfolder/upcoming/lawmages_binding.txt new file mode 100644 index 00000000000..3c5087d6bc5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/lawmages_binding.txt @@ -0,0 +1,8 @@ +Name:Lawmage's Binding +ManaCost:1 W U +Types:Enchantment Aura +K:Flash +K:Enchant creature +A:SP$ Attach | Cost$ 1 W U | ValidTgts$ Creature | AILogic$ Curse +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddHiddenKeyword$ CARDNAME can't attack or block. & CARDNAME's activated abilities can't be activated. | Description$ Enchanted creature can't attack or block and its activated abilities can't be activated. +Oracle:Flash\nEnchant creature\nEnchanted creature can't attack or block, and its activated abilities can't be activated. diff --git a/forge-gui/res/cardsfolder/upcoming/rubble_slinger.txt b/forge-gui/res/cardsfolder/upcoming/rubble_slinger.txt new file mode 100644 index 00000000000..bfa37840636 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rubble_slinger.txt @@ -0,0 +1,6 @@ +Name:Rubble Slinger +ManaCost:2 RG +Types:Creature Human Warrior +PT:2/3 +K:Reach +Oracle:Reach diff --git a/forge-gui/res/cardsfolder/upcoming/rubblebelt_runner.txt b/forge-gui/res/cardsfolder/upcoming/rubblebelt_runner.txt new file mode 100644 index 00000000000..6c88e9b0745 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rubblebelt_runner.txt @@ -0,0 +1,6 @@ +Name:Rubblebelt Runner +ManaCost:1 R G +Types:Creature Viashino Warrior +PT:3/3 +K:CantBeBlockedBy Creature.token +Oracle:Rubblebelt Runner can’t be blocked by creature tokens. diff --git a/forge-gui/res/cardsfolder/upcoming/screaming_shield.txt b/forge-gui/res/cardsfolder/upcoming/screaming_shield.txt new file mode 100644 index 00000000000..f0f80e0a52e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/screaming_shield.txt @@ -0,0 +1,7 @@ +Name:Screaming Shield +ManaCost:1 +Types:Artifact Equipment +K:Equip:3 +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddToughness$ 3 | AddAbility$ Mill | Description$ Equipped creature gets +0/+3 and has "{2}, {T}: Target player puts the top three cards of their library into their graveyard." +SVar:Mill:AB$ Mill | Cost$ 2 T | NumCards$ 3 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player puts the top three cards of their library into their graveyard. +Oracle:Equipped creature gets +0/+3 and has "{2}, {T}: Target player puts the top three cards of their library into their graveyard."\nEquip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/upcoming/scuttlegator.txt b/forge-gui/res/cardsfolder/upcoming/scuttlegator.txt new file mode 100644 index 00000000000..19a4f959cab --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/scuttlegator.txt @@ -0,0 +1,8 @@ +Name:Scuttlegator +ManaCost:4 GU GU +Types:Creature Crab Turtle Crocodile +PT:6/6 +K:Defender +K:Adapt:3:6 GU GU +S:Mode$ Continuous | Affected$ Card.Self+counters_GE1_P1P1 | AddHiddenKeyword$ CARDNAME can attack as though it didn't have defender. | Description$ As long as CARDNAME has a +1/+1 counter on it, it can attack as though it didn’t have defender. +Oracle:Defender\n{6}{G/U}{G/U}: Adapt 3. (If this creature has no +1/+1 counters on it, put two +1/+1 counters on it.)\nAs long as Scuttlegator has a +1/+1 counter on it, it can attack as though it didn’t have defender. diff --git a/forge-gui/res/cardsfolder/upcoming/senate_griffin.txt b/forge-gui/res/cardsfolder/upcoming/senate_griffin.txt new file mode 100644 index 00000000000..c7193c112b9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/senate_griffin.txt @@ -0,0 +1,8 @@ +Name:Senate Griffin +ManaCost:2 UW UW +Types:Creature Griffin +PT:3/2 +K:Flying +T:Mode$ ChangeZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Self | Execute$ DBScry | TriggerDescription$ When CARDNAME etners the battlefield, scry 1. +SVar:DBScry:DB$ Scry | ScryNum$ 1 +Oracle:Flying.\nWhen Senate Griffin enters the battlefield, scry 1. diff --git a/forge-gui/res/cardsfolder/upcoming/summary_judgment.txt b/forge-gui/res/cardsfolder/upcoming/summary_judgment.txt new file mode 100644 index 00000000000..605dc72faa4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/summary_judgment.txt @@ -0,0 +1,6 @@ +Name:Summary Judgment +ManaCost:1 W +Types:Instant +A:SP$ DealDamage | Cost$ 1 W | ValidTgts$ Creature.tapped | NumDmg$ X | References$ X | TgtPrompt$ Select target tapped creature | SpellDescription$ CARDNAME deals 3 damage to target tapped creature. If you cast this spell during your main phase, CARDNAME deals 5 damage to that creature instead. +SVar:X:Count$IfMainPhase.5.3 +Oracle:Summary Judgment deals 3 damage to target tapped creature.\nAddendum — If you cast this spell during your main phase, it deals 5 damage to that creature instead. diff --git a/forge-gui/res/cardsfolder/upcoming/vizkopa_vampire.txt b/forge-gui/res/cardsfolder/upcoming/vizkopa_vampire.txt new file mode 100644 index 00000000000..c14766555ab --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/vizkopa_vampire.txt @@ -0,0 +1,6 @@ +Name:Vizkopa Vampire +ManaCost:2 WB +Types:Creature Vampire +PT:3/1 +K:Lifelink +Oracle:Lifelink From 89757b9677a1c955cb160af31432b1bdf06dec67 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Mon, 28 Jan 2019 07:04:13 +0000 Subject: [PATCH 703/901] Update forge-gui/res/cardsfolder/upcoming/footlight_fiend.txt --- forge-gui/res/cardsfolder/upcoming/footlight_fiend.txt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/footlight_fiend.txt diff --git a/forge-gui/res/cardsfolder/upcoming/footlight_fiend.txt b/forge-gui/res/cardsfolder/upcoming/footlight_fiend.txt new file mode 100644 index 00000000000..d5476eccf58 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/footlight_fiend.txt @@ -0,0 +1,7 @@ +Name:Footlight Fiend +ManaCost:BR +Types:Creature Devil +PT:1/1 +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, it deals 1 damage to any target. +SVar:TrigDealDamage:DB$DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 +Oracle:When Footlight Fiend dies, it deals 1 damage to any target. From e1ceed159f17edb8f9e938b938b68c0ab4c083d8 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Mon, 28 Jan 2019 07:08:05 +0000 Subject: [PATCH 704/901] Update forge-gui/res/cardsfolder/upcoming/elite_arrester.txt, forge-gui/res/cardsfolder/upcoming/clamor_shaman.txt files --- forge-gui/res/cardsfolder/upcoming/clamor_shaman.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/elite_arrester.txt | 7 +++++++ 2 files changed, 15 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/clamor_shaman.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/elite_arrester.txt diff --git a/forge-gui/res/cardsfolder/upcoming/clamor_shaman.txt b/forge-gui/res/cardsfolder/upcoming/clamor_shaman.txt new file mode 100644 index 00000000000..64148416e73 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/clamor_shaman.txt @@ -0,0 +1,8 @@ +Name:Clamor Shaman +ManaCost:2 R +Types:Creature Shaman +PT:1/1 +K:Riot +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigCanNotBlock | TriggerDescription$ Whenever CARDNAME attacks, target creature an opponent controls can't block this turn. +SVar:TrigCanNotBlock:DB$ Pump | ValidTgts$ Creature.OppCtrl | KW$ HIDDEN CARDNAME can't block. | TgtPrompt$ Select target creature an opponent controls | IsCurse$ True +Oracle:Riot (This creature enters the battlefield with your choice of a +1/+1 counter or haste.)\nWhenever Clamor Shaman attacks, target creature an opponent controls can’t block this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/elite_arrester.txt b/forge-gui/res/cardsfolder/upcoming/elite_arrester.txt new file mode 100644 index 00000000000..67442dfa407 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/elite_arrester.txt @@ -0,0 +1,7 @@ +Name:Elite Arrester +ManaCost:W +Types:Creature Human Soldier +PT:0/3 +A:AB$ Tap | Cost$ 1 U T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. +SVar:NonCombatPriority:5 +Oracle:{1}{U}, {T}: Tap target creature. From a462d3424953d70ceee4b9aa935318a1fc7b7e2a Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Mon, 28 Jan 2019 07:38:32 +0000 Subject: [PATCH 705/901] Update forge-gui/res/cardsfolder/upcoming/charging_war_boar.txt, forge-gui/res/cardsfolder/upcoming/cindervines.txt files --- forge-gui/res/cardsfolder/upcoming/charging_war_boar.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/cindervines.txt | 8 ++++++++ 2 files changed, 16 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/charging_war_boar.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/cindervines.txt diff --git a/forge-gui/res/cardsfolder/upcoming/charging_war_boar.txt b/forge-gui/res/cardsfolder/upcoming/charging_war_boar.txt new file mode 100644 index 00000000000..120a77a72d7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/charging_war_boar.txt @@ -0,0 +1,8 @@ +Name:Charging War Boar +ManaCost:1 R G +Types:Creature Boar +PT:3/1 +K:Haste +S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Trample | AddPower$ 1 | AddToughness$ 1 | IsPresent$ Planeswalker.Domri+YouCtrl | Description$ As long as you control a Domri planeswalker, CARDNAME gets +1/+1 and has trample. +SVar:BuffedBy:Domri +Oracle:Haste (This creature can attack and {T} as soon as it comes under your control.)\nAs long as you control a Domri planeswalker, Charging War Boar gets +1/+1 and has trample. (It can deal excess damage to the player or planeswalker it’s attacking.) diff --git a/forge-gui/res/cardsfolder/upcoming/cindervines.txt b/forge-gui/res/cardsfolder/upcoming/cindervines.txt new file mode 100644 index 00000000000..5d0b5133500 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/cindervines.txt @@ -0,0 +1,8 @@ +Name:Cindervines +ManaCost:R G +Types:Enchantment +T:Mode$ SpellCast | ValidCard$ Card.nonCreature | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDealOneDamage | TriggerDescription$ Whenever an opponent casts a noncreature spell, CARDNAME deals 1 damage to that player. +SVar:TrigDealOneDamage:DB$DealDamage | Defined$ TriggeredActivator | NumDmg$ 1 +A:AB$ Destroy | Cost$ 1 Sac<1/CARDNAME> | ValidTgt$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | Subability$ DBDealTwoDamage | SpellDescription$ Destroy target artifact or enchantment. CARDNAME deals 2 damage to that permanent’s controller. +SVar:DBDealTwoDamage:DB$ DealDamage | Defined$ TargetedController | NumDmg$ 2 +Oracle:Whenever an opponent casts a noncreature spell, Cindervines deals 1 damage to that player.\n{1}, Sacrifice Cindervines: Destroy target artifact or enchantment. Cindervines deals 2 damage to that permanent’s controller. From 1c9a515bb3911b4abd5eccafb02062ab4812440d Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Mon, 28 Jan 2019 07:47:55 +0000 Subject: [PATCH 706/901] Update forge-gui/res/cardsfolder/upcoming/domris_nodorog.txt --- forge-gui/res/cardsfolder/upcoming/domris_nodorog.txt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/domris_nodorog.txt diff --git a/forge-gui/res/cardsfolder/upcoming/domris_nodorog.txt b/forge-gui/res/cardsfolder/upcoming/domris_nodorog.txt new file mode 100644 index 00000000000..bb227a66cff --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/domris_nodorog.txt @@ -0,0 +1,9 @@ +Name:Domri's Nodorog +ManaCost:3 R G +Types:Creature Beast +PT:5/2 +K:Trample +T:Mode$ ChangeZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Domri, City Smasher, reveal it, and put it into your hand. If you search your library this way, shuffle it. +SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedDomri; City Smasher | ChangeNum$ 1 | Optional$ True +DeckHints:Name$Domri, City Smasher +Oracle:Trample\nWhen Domri’s Nodorog enters the battlefield, you may search your library and/or graveyard for a card named Domri, City Smasher, reveal it, and put it into your hand. If you search your library this way, shuffle it. From 7c98ed75be1651ed557eb9b08a8e68659adaaa7a Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Mon, 28 Jan 2019 08:02:07 +0000 Subject: [PATCH 707/901] Update forge-gui/res/cardsfolder/upcoming/domris_nodorog.txt, forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt, forge-gui/res/cardsfolder/upcoming/haazda_officer.txt, forge-gui/res/cardsfolder/upcoming/senate_griffin.txt files --- forge-gui/res/cardsfolder/upcoming/domris_nodorog.txt | 2 +- forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt | 2 +- forge-gui/res/cardsfolder/upcoming/haazda_officer.txt | 2 +- forge-gui/res/cardsfolder/upcoming/senate_griffin.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/domris_nodorog.txt b/forge-gui/res/cardsfolder/upcoming/domris_nodorog.txt index bb227a66cff..b823c2265fe 100644 --- a/forge-gui/res/cardsfolder/upcoming/domris_nodorog.txt +++ b/forge-gui/res/cardsfolder/upcoming/domris_nodorog.txt @@ -3,7 +3,7 @@ ManaCost:3 R G Types:Creature Beast PT:5/2 K:Trample -T:Mode$ ChangeZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Domri, City Smasher, reveal it, and put it into your hand. If you search your library this way, shuffle it. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Domri, City Smasher, reveal it, and put it into your hand. If you search your library this way, shuffle it. SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedDomri; City Smasher | ChangeNum$ 1 | Optional$ True DeckHints:Name$Domri, City Smasher Oracle:Trample\nWhen Domri’s Nodorog enters the battlefield, you may search your library and/or graveyard for a card named Domri, City Smasher, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt b/forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt index 4be78823eca..510834864df 100644 --- a/forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt +++ b/forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt @@ -2,7 +2,7 @@ Name:Forbidding Spirit ManaCost:1 W W Types:Creature Spirit Cleric PT:3/3 -T:Mode$ ChangeZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Self | Execute$ TempAttackTax | TriggerDescription$ When CARDNAME enters the battlefield, until your next turn, creatures can’t attack you or a planeswalker you control unless their controller pays {2} for each of those creatures. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Self | Execute$ TempAttackTax | TriggerDescription$ When CARDNAME enters the battlefield, until your next turn, creatures can’t attack you or a planeswalker you control unless their controller pays {2} for each of those creatures. SVar:TempAttackTax:DB$ Effect | Name$ Forbidding Spirit Effect | StaticAbilities$ TempoCantAttack | Duration$ UntilYourNextTurn | SpellDescription$ Until your next turn, creatures can’t attack you or a planeswalker you control unless their controller pays {2} for each of those creatures. SVar:TempoCantAttack:Mode$ CantAttackUnless | ValidCard$ Creature | Target$ You,Planeswalker.YouCtrl | Cost$ 2 | Description$ Until your next turn, creatures can't attack you or a planeswalker you control unless their controller pays {2} for each of those creatures. Oracle:When Forbidding Spirit enters the battlefield, until your next turn, creatures can’t attack you or a planeswalker you control unless their controller pays {2} for each of those creatures. diff --git a/forge-gui/res/cardsfolder/upcoming/haazda_officer.txt b/forge-gui/res/cardsfolder/upcoming/haazda_officer.txt index 0890f2ade76..abf54ae1465 100644 --- a/forge-gui/res/cardsfolder/upcoming/haazda_officer.txt +++ b/forge-gui/res/cardsfolder/upcoming/haazda_officer.txt @@ -2,7 +2,7 @@ Name:Haazda Officer ManaCost:2 W Types:Creature Human Soldier PT:3/2 -T:Mode$ ChangeZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature you control gets +1/+1 until end of turn. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature you control gets +1/+1 until end of turn. SVar:TrigPump:DB$Pump | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | NumAtt$ 1 | NumDef$ 1 SVar:PlayMain1:TRUE Oracle:When Haazda Officer enters the battlefield, target creature you control gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/senate_griffin.txt b/forge-gui/res/cardsfolder/upcoming/senate_griffin.txt index c7193c112b9..d0d603912aa 100644 --- a/forge-gui/res/cardsfolder/upcoming/senate_griffin.txt +++ b/forge-gui/res/cardsfolder/upcoming/senate_griffin.txt @@ -3,6 +3,6 @@ ManaCost:2 UW UW Types:Creature Griffin PT:3/2 K:Flying -T:Mode$ ChangeZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Self | Execute$ DBScry | TriggerDescription$ When CARDNAME etners the battlefield, scry 1. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Self | Execute$ DBScry | TriggerDescription$ When CARDNAME etners the battlefield, scry 1. SVar:DBScry:DB$ Scry | ScryNum$ 1 Oracle:Flying.\nWhen Senate Griffin enters the battlefield, scry 1. From b08ce490577930fe26d3f16cc25795411210747d Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Mon, 28 Jan 2019 08:07:43 +0000 Subject: [PATCH 708/901] Update forge-gui/res/cardsfolder/upcoming/senate_griffin.txt, forge-gui/res/cardsfolder/upcoming/haazda_officer.txt, forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt, forge-gui/res/cardsfolder/upcoming/domris_nodorog.txt files --- forge-gui/res/cardsfolder/upcoming/domris_nodorog.txt | 2 +- forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt | 2 +- forge-gui/res/cardsfolder/upcoming/haazda_officer.txt | 2 +- forge-gui/res/cardsfolder/upcoming/senate_griffin.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/domris_nodorog.txt b/forge-gui/res/cardsfolder/upcoming/domris_nodorog.txt index b823c2265fe..1ab1297832a 100644 --- a/forge-gui/res/cardsfolder/upcoming/domris_nodorog.txt +++ b/forge-gui/res/cardsfolder/upcoming/domris_nodorog.txt @@ -3,7 +3,7 @@ ManaCost:3 R G Types:Creature Beast PT:5/2 K:Trample -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Domri, City Smasher, reveal it, and put it into your hand. If you search your library this way, shuffle it. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Domri, City Smasher, reveal it, and put it into your hand. If you search your library this way, shuffle it. SVar:TrigSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedDomri; City Smasher | ChangeNum$ 1 | Optional$ True DeckHints:Name$Domri, City Smasher Oracle:Trample\nWhen Domri’s Nodorog enters the battlefield, you may search your library and/or graveyard for a card named Domri, City Smasher, reveal it, and put it into your hand. If you search your library this way, shuffle it. diff --git a/forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt b/forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt index 510834864df..ab1a4292b5a 100644 --- a/forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt +++ b/forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt @@ -2,7 +2,7 @@ Name:Forbidding Spirit ManaCost:1 W W Types:Creature Spirit Cleric PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Self | Execute$ TempAttackTax | TriggerDescription$ When CARDNAME enters the battlefield, until your next turn, creatures can’t attack you or a planeswalker you control unless their controller pays {2} for each of those creatures. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TempAttackTax | TriggerDescription$ When CARDNAME enters the battlefield, until your next turn, creatures can’t attack you or a planeswalker you control unless their controller pays {2} for each of those creatures. SVar:TempAttackTax:DB$ Effect | Name$ Forbidding Spirit Effect | StaticAbilities$ TempoCantAttack | Duration$ UntilYourNextTurn | SpellDescription$ Until your next turn, creatures can’t attack you or a planeswalker you control unless their controller pays {2} for each of those creatures. SVar:TempoCantAttack:Mode$ CantAttackUnless | ValidCard$ Creature | Target$ You,Planeswalker.YouCtrl | Cost$ 2 | Description$ Until your next turn, creatures can't attack you or a planeswalker you control unless their controller pays {2} for each of those creatures. Oracle:When Forbidding Spirit enters the battlefield, until your next turn, creatures can’t attack you or a planeswalker you control unless their controller pays {2} for each of those creatures. diff --git a/forge-gui/res/cardsfolder/upcoming/haazda_officer.txt b/forge-gui/res/cardsfolder/upcoming/haazda_officer.txt index abf54ae1465..1599c582e1a 100644 --- a/forge-gui/res/cardsfolder/upcoming/haazda_officer.txt +++ b/forge-gui/res/cardsfolder/upcoming/haazda_officer.txt @@ -2,7 +2,7 @@ Name:Haazda Officer ManaCost:2 W Types:Creature Human Soldier PT:3/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature you control gets +1/+1 until end of turn. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature you control gets +1/+1 until end of turn. SVar:TrigPump:DB$Pump | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | NumAtt$ 1 | NumDef$ 1 SVar:PlayMain1:TRUE Oracle:When Haazda Officer enters the battlefield, target creature you control gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/senate_griffin.txt b/forge-gui/res/cardsfolder/upcoming/senate_griffin.txt index d0d603912aa..3b01e0b0c7a 100644 --- a/forge-gui/res/cardsfolder/upcoming/senate_griffin.txt +++ b/forge-gui/res/cardsfolder/upcoming/senate_griffin.txt @@ -3,6 +3,6 @@ ManaCost:2 UW UW Types:Creature Griffin PT:3/2 K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Self | Execute$ DBScry | TriggerDescription$ When CARDNAME etners the battlefield, scry 1. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ DBScry | TriggerDescription$ When CARDNAME etners the battlefield, scry 1. SVar:DBScry:DB$ Scry | ScryNum$ 1 Oracle:Flying.\nWhen Senate Griffin enters the battlefield, scry 1. From 5e94c6c8d31e536ec346e634186be8b479cc1267 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Mon, 28 Jan 2019 08:27:47 +0000 Subject: [PATCH 709/901] Update forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt --- forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt b/forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt index ab1a4292b5a..37885dd2d0e 100644 --- a/forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt +++ b/forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt @@ -4,5 +4,5 @@ Types:Creature Spirit Cleric PT:3/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TempAttackTax | TriggerDescription$ When CARDNAME enters the battlefield, until your next turn, creatures can’t attack you or a planeswalker you control unless their controller pays {2} for each of those creatures. SVar:TempAttackTax:DB$ Effect | Name$ Forbidding Spirit Effect | StaticAbilities$ TempoCantAttack | Duration$ UntilYourNextTurn | SpellDescription$ Until your next turn, creatures can’t attack you or a planeswalker you control unless their controller pays {2} for each of those creatures. -SVar:TempoCantAttack:Mode$ CantAttackUnless | ValidCard$ Creature | Target$ You,Planeswalker.YouCtrl | Cost$ 2 | Description$ Until your next turn, creatures can't attack you or a planeswalker you control unless their controller pays {2} for each of those creatures. +SVar:TempoCantAttack:Mode$ CantAttackUnless | EffectZone$ Command | ValidCard$ Creature | Target$ You,Planeswalker.YouCtrl | Cost$ 2 | Description$ Until your next turn, creatures can't attack you or a planeswalker you control unless their controller pays {2} for each of those creatures. Oracle:When Forbidding Spirit enters the battlefield, until your next turn, creatures can’t attack you or a planeswalker you control unless their controller pays {2} for each of those creatures. From 763cb3d08e9943ca2f3e5bd6d27b13190c8695dd Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Mon, 28 Jan 2019 08:30:23 +0000 Subject: [PATCH 710/901] Update forge-gui/res/cardsfolder/upcoming/shimmer_of_possibility.txt --- forge-gui/res/cardsfolder/upcoming/shimmer_of_possibility.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/shimmer_of_possibility.txt b/forge-gui/res/cardsfolder/upcoming/shimmer_of_possibility.txt index f554272ecf9..ab6ac18b898 100644 --- a/forge-gui/res/cardsfolder/upcoming/shimmer_of_possibility.txt +++ b/forge-gui/res/cardsfolder/upcoming/shimmer_of_possibility.txt @@ -1,5 +1,5 @@ Name:Shimmer of Possibility ManaCost:1 U Types:Sorcery -A:SP$ Dig | Cost$ 1 U | DigNum$ 4 | ChangeNum$ 1 | SpellDescription$ Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in a random order. +A:SP$ Dig | Cost$ 1 U | DigNum$ 4 | ChangeNum$ 1 | RestRandomOrder$ True | SpellDescription$ Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in a random order. Oracle:Look at the top four cards of your library. Put one of them into your hand and the rest on the bottom of your library in a random order. From f8bf8c7f28446947669ec4a0aaca38bb230dd22c Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Mon, 28 Jan 2019 08:41:26 +0000 Subject: [PATCH 711/901] Update forge-gui/res/cardsfolder/upcoming/cindervines.txt --- forge-gui/res/cardsfolder/upcoming/cindervines.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/cindervines.txt b/forge-gui/res/cardsfolder/upcoming/cindervines.txt index 5d0b5133500..c323277874d 100644 --- a/forge-gui/res/cardsfolder/upcoming/cindervines.txt +++ b/forge-gui/res/cardsfolder/upcoming/cindervines.txt @@ -3,6 +3,6 @@ ManaCost:R G Types:Enchantment T:Mode$ SpellCast | ValidCard$ Card.nonCreature | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDealOneDamage | TriggerDescription$ Whenever an opponent casts a noncreature spell, CARDNAME deals 1 damage to that player. SVar:TrigDealOneDamage:DB$DealDamage | Defined$ TriggeredActivator | NumDmg$ 1 -A:AB$ Destroy | Cost$ 1 Sac<1/CARDNAME> | ValidTgt$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | Subability$ DBDealTwoDamage | SpellDescription$ Destroy target artifact or enchantment. CARDNAME deals 2 damage to that permanent’s controller. +A:AB$ Destroy | Cost$ 1 Sac<1/CARDNAME> | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | Subability$ DBDealTwoDamage | SpellDescription$ Destroy target artifact or enchantment. CARDNAME deals 2 damage to that permanent’s controller. SVar:DBDealTwoDamage:DB$ DealDamage | Defined$ TargetedController | NumDmg$ 2 Oracle:Whenever an opponent casts a noncreature spell, Cindervines deals 1 damage to that player.\n{1}, Sacrifice Cindervines: Destroy target artifact or enchantment. Cindervines deals 2 damage to that permanent’s controller. From 1ba1226661753124552fa0544afa0a17270c997e Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Mon, 28 Jan 2019 05:53:38 -0500 Subject: [PATCH 712/901] refresh hand floating zone when hand is updated --- .../src/main/java/forge/screens/match/CMatchUI.java | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index 1e12acb4e9e..5df40f54120 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -397,6 +397,7 @@ public final class CMatchUI case Hand: updateHand = true; updateZones = true; + FloatingZone.refresh(owner, zone); break; default: updateZones = true; From 104aaa12558c70585d5eb502b0f9cae53f92a75b Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 28 Jan 2019 15:22:06 +0300 Subject: [PATCH 713/901] - Added puzzle PS_RNA0a (RNA Prerelease Puzzle) --- forge-gui/res/puzzle/PS_RNA0a.pzl | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 forge-gui/res/puzzle/PS_RNA0a.pzl diff --git a/forge-gui/res/puzzle/PS_RNA0a.pzl b/forge-gui/res/puzzle/PS_RNA0a.pzl new file mode 100644 index 00000000000..f26949aa65c --- /dev/null +++ b/forge-gui/res/puzzle/PS_RNA0a.pzl @@ -0,0 +1,17 @@ +[metadata] +Name:Possibility Storm - Ravnica Allegiance #00a (Prerelease Puzzle) +URL:http://www.possibilitystorm.com/wp-content/uploads/2019/01/097.-RNA002.jpg +Goal:Win +Turns:1 +Difficulty:Rare +Description:Win this turn. You have three other Growth-Chamber Guardians in your deck (in addition to the one in your hand). +[state] +humanlife=20 +ailife=7 +turn=1 +activeplayer=human +activephase=MAIN1 +humanhand=Grotesque Demise;Ancient Animus;Bedevil;Growth-Chamber Guardian +humanlibrary=Growth-Chamber Guardian;Growth-Chamber Guardian;Growth-Chamber Guardian +humanbattlefield=Rhythm of the Wild;Rhythm of the Wild;Piston-Fist Cyclops|NoETBTrigs;Mausoleum Harpy|NoETBTrigs;Dragon Egg|NoETBTrigs;Blood Crypt|NoETBTrigs;Blood Crypt|NoETBTrigs;Blood Crypt|NoETBTrigs;Overgrown Tomb|NoETBTrigs;Overgrown Tomb|NoETBTrigs;Overgrown Tomb|NoETBTrigs +aibattlefield=Goring Ceratops;Goblin Chainwhirler;Goblin Chainwhirler From 4b8584376dae6544051d2fcbe08f2d2e7f63ad2c Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Mon, 28 Jan 2019 17:27:48 +0000 Subject: [PATCH 714/901] Update forge-gui/res/cardsfolder/upcoming/cavalcade_of_calamity.txt --- forge-gui/res/cardsfolder/upcoming/cavalcade_of_calamity.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/cavalcade_of_calamity.txt b/forge-gui/res/cardsfolder/upcoming/cavalcade_of_calamity.txt index a4e5f920e7e..90dc2bd6971 100644 --- a/forge-gui/res/cardsfolder/upcoming/cavalcade_of_calamity.txt +++ b/forge-gui/res/cardsfolder/upcoming/cavalcade_of_calamity.txt @@ -2,6 +2,6 @@ Name:Cavalcade of Calamity ManaCost:1 R Types:Enchantment T:Mode$ Attacks | ValidCard$ Creature.powerLE1+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a creature you control with power 1 or less attacks, CARDNAME deals 1 damage to the player or planeswalker that creature is attacking -SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredAttacked | NumDmg$ 1 +SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredDefender | NumDmg$ 1 SVar:PlayMain1:TRUE Oracle:Whenever a creature you control with power 1 or less attacks, Cavalcade of Calamity deals 1 damage to the player or planeswalker that creature is attacking. From dbe212065dfef7f1c5af54fdb24185309b3861b2 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Mon, 28 Jan 2019 17:44:21 +0000 Subject: [PATCH 715/901] Update forge-gui/res/cardsfolder/r/raid_bombardment.txt --- forge-gui/res/cardsfolder/r/raid_bombardment.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/r/raid_bombardment.txt b/forge-gui/res/cardsfolder/r/raid_bombardment.txt index 5cf328f2974..58fd1ccbdf2 100644 --- a/forge-gui/res/cardsfolder/r/raid_bombardment.txt +++ b/forge-gui/res/cardsfolder/r/raid_bombardment.txt @@ -2,6 +2,6 @@ Name:Raid Bombardment ManaCost:2 R Types:Enchantment T:Mode$ Attacks | ValidCard$ Creature.powerLE2+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a creature you control with power 2 or less attacks, CARDNAME deals 1 damage to the player or planeswalker that creature is attacking -SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredAttacked | NumDmg$ 1 +SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredDefender | NumDmg$ 1 SVar:PlayMain1:TRUE Oracle:Whenever a creature you control with power 2 or less attacks, Raid Bombardment deals 1 damage to the player or planeswalker that creature is attacking. From e0b463c6ea55540ef0223f7ee29491d884950328 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Mon, 28 Jan 2019 18:03:00 +0000 Subject: [PATCH 716/901] Update forge-gui/res/cardsfolder/upcoming/cindervines.txt --- forge-gui/res/cardsfolder/upcoming/cindervines.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/cindervines.txt b/forge-gui/res/cardsfolder/upcoming/cindervines.txt index c323277874d..9025de38615 100644 --- a/forge-gui/res/cardsfolder/upcoming/cindervines.txt +++ b/forge-gui/res/cardsfolder/upcoming/cindervines.txt @@ -3,6 +3,6 @@ ManaCost:R G Types:Enchantment T:Mode$ SpellCast | ValidCard$ Card.nonCreature | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDealOneDamage | TriggerDescription$ Whenever an opponent casts a noncreature spell, CARDNAME deals 1 damage to that player. SVar:TrigDealOneDamage:DB$DealDamage | Defined$ TriggeredActivator | NumDmg$ 1 -A:AB$ Destroy | Cost$ 1 Sac<1/CARDNAME> | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | Subability$ DBDealTwoDamage | SpellDescription$ Destroy target artifact or enchantment. CARDNAME deals 2 damage to that permanent’s controller. +A:AB$ Destroy | Cost$ 1 Sac<1/CARDNAME> | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SubAbility$ DBDealTwoDamage | SpellDescription$ Destroy target artifact or enchantment. CARDNAME deals 2 damage to that permanent’s controller. SVar:DBDealTwoDamage:DB$ DealDamage | Defined$ TargetedController | NumDmg$ 2 Oracle:Whenever an opponent casts a noncreature spell, Cindervines deals 1 damage to that player.\n{1}, Sacrifice Cindervines: Destroy target artifact or enchantment. Cindervines deals 2 damage to that permanent’s controller. From 5bd9f324e024d770421171c72c01644b7e257ed2 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Mon, 28 Jan 2019 18:09:35 +0000 Subject: [PATCH 717/901] Update forge-gui/res/cardsfolder/upcoming/dovins_dismissal.txt --- forge-gui/res/cardsfolder/upcoming/dovins_dismissal.txt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/dovins_dismissal.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dovins_dismissal.txt b/forge-gui/res/cardsfolder/upcoming/dovins_dismissal.txt new file mode 100644 index 00000000000..603c0fa17af --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/dovins_dismissal.txt @@ -0,0 +1,7 @@ +Name:Dovin's Dismissal +ManaCost:2 W U +Types:Instant +A:SP$ ChangeZone | Cost$ 2 W U | ValidTgts$ Creature.tapped | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target tapped creature | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SubAbility$ DBSearch | SpellDescription$ Put up to one target tapped creature on top of its owner's library. You may search your library and/or graveyard for a card named Dovin, Architect of Law, reveal it, and put it into your hand. If you search your library this way, shuffle it. +SVar:DBSearch:DB$ ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedDovin; Architect of Law | ChangeNum$ 1 | Optional$ True +DeckNeeds:Name$Dovin, Architect of Law +Oracle:Put up to one target tapped creature on top of its owner’s library. You may search your library and/or graveyard for a card named Dovin, Architect of Law, reveal it, and put it into your hand. If you search your library this way, shuffle it. From d8da15d8aef1259e536d7c30409945ca2716905f Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Mon, 28 Jan 2019 19:58:23 +0000 Subject: [PATCH 718/901] Update forge-gui/res/cardsfolder/upcoming/dovin_architect_of_law.txt --- .../cardsfolder/upcoming/dovin_architect_of_law.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/dovin_architect_of_law.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dovin_architect_of_law.txt b/forge-gui/res/cardsfolder/upcoming/dovin_architect_of_law.txt new file mode 100644 index 00000000000..cd0a8f42060 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/dovin_architect_of_law.txt @@ -0,0 +1,11 @@ +Name:Dovin, Architect of Law +ManaCost:4 W U +Types:Legendary Planeswalker Dovin +Loyalty:5 +A:AB$ GainLife | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | Defined$ You | LifeAmount$ 2 | SubAbility$ DBDraw | SpellDescription$ You gain 2 life and draw a card. +SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 +A:AB$ Tap | Cost$ SubCounter<1/LOYALTY> | ValidTgts$ Creature | TgtPrompt$ Choose target creature to tap. | Planeswalker$ True | SubAbility$ DovinPump | SpellDescription$ Tap target creature. It doesn't untap during its controller's next untap step. +SVar:DovinPump:DB$ Pump | Defined$ Targeted | Permanent$ True | KW$ HIDDEN This card doesn't untap during your next untap step. +A:AB$ TapAll | Cost$ SubCounter<9/LOYALTY> | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | ValidCards$ Permanent | Planeswalker$ True | SubAbility$ NoUntap | SpellDescription$ Tap all permanents target opponent controls. That player skips their next untap step. +SVar:NoUntap:DB$ Pump | Defined$ TargetedPlayer | IsCurse$ True | KW$ Skip your next untap step. | Permanent$ True +Oracle:+1: You gain 2 life and draw a card.\n−1: Tap target creature. It doesn’t untap during its controller’s next untap step.\n−9: Tap all permanents target opponent controls. That player skips their next untap step. From e13880c87e730f3a021dd400946525ebb9e120c1 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Mon, 28 Jan 2019 20:18:07 +0000 Subject: [PATCH 719/901] Domri, City Smasher --- .../res/cardsfolder/upcoming/domri_city_smasher.txt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/domri_city_smasher.txt diff --git a/forge-gui/res/cardsfolder/upcoming/domri_city_smasher.txt b/forge-gui/res/cardsfolder/upcoming/domri_city_smasher.txt new file mode 100644 index 00000000000..f5563d10db9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/domri_city_smasher.txt @@ -0,0 +1,9 @@ +Name:Domri, City Smasher +ManaCost:4 R G +Types:Legendary Planeswalker Domri +Loyalty:4 +A:AB$ PumpAll | Cost$ AddCounter<2/LOYALTY> | ValidCards$ Creature.YouCtrl | KW$ Haste | NumAtt$ +1 | NumDef$ +1 | Planeswalker$ True | AILogic$ Main1 | SpellDescription$ Creatures you control get +1/+1 and gain haste until end of turn. +A:AB$ DealDamage | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to any target. +A:AB$ PutCounterAll | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | ValidCards$ Creature.YouCtrl | CounterType$ P1P1 | CounterNum$ 3 | SubAbility$ DBPumpAll | SpellDescription$ Put three +1/+1 counters on each creature you control. Those creatures gain trample until end of turn. +SVar:DBPumpAll:DB$ PumpAll | KW$ Trample | ValidCards$ Creature.YouCtrl +Oracle:+2: Creatures you control get +1/+1 and gain haste until end of turn.\n−3: Domri, City Smasher deals 3 damage to any target.\n−8: Put three +1/+1 counters on each creature you control. Those creatures gain trample until end of turn. From b3e1d96aff14a4222b6d41ede35384ecb170711c Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Mon, 28 Jan 2019 22:06:12 +0000 Subject: [PATCH 720/901] Upload New File --- .../res/cardsfolder/upcoming/domri_chaos_bringer.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/domri_chaos_bringer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/domri_chaos_bringer.txt b/forge-gui/res/cardsfolder/upcoming/domri_chaos_bringer.txt new file mode 100644 index 00000000000..74ee094865e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/domri_chaos_bringer.txt @@ -0,0 +1,10 @@ +Name:Domri, Chaos Bringer +ManaCost:2 R G +Types:Legendary Planeswalker Domri +Loyalty:5 +A:AB$ Mana | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | Produced$ Combo R G | Amount$ 1 | AddsKeywords$ Riot | AddsKeywordsType$ Creature | SpellDescription$ Add {R} or {G}. If that mana is spent on a creature spell, it gains riot. (It enters the battlefield with your choice of a +1/+1 counter or haste.) +A:AB$ Dig | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | ForceRevealToController$ True | DigNum$ 4 | ChangeNum$ 2 | Optional$ True | ChangeValid$ Creature | RestRandomOrder$ True | SpellDescription$ Look at the top four cards of your library. You may reveal up to two creature cards from among them and put them into your hand. Put the rest on the bottom of your library in a random order. +A:AB$ Effect | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Ultimate$ True | Name$ Emblem - Domri, Chaos Bringer | Image$ emblem_domri_chaos_bringer | Triggers$ EffPhase | SVars$ EmblemTrigToken | Duration$ Permanent | SpellDescription$ You get an emblem with “At the beginning of each end step, create a 4/4 red and green Beast creature token with trample.” +SVar:EffPhase:Mode$ Phase | Phase$ End of Turn | Execute$ EmblemTrigToken | TriggerDescription$ At the beginning of each end step, create a 4/4 red and green Beast creature token with trample. +SVar:EmblemTrigToken:DB$ Token | TokenOwner$ You | TokenAmount$ 1 | TokenPower$ 4 | TokenToughness$ 4 | TokenColors$ Red,Green | TokenTypes$ Creature,Beast | TokenKeywords$ Trample | TokenImage$ rg 4 4 beast rna +Oracle:+1: Add {R} or {G}. If that mana is spent on a creature spell, it gains riot. (It enters the battlefield with your choice of a +1/+1 counter or haste.)\n−3: Look at the top four cards of your library. You may reveal up to two creature cards from among them and put them into your hand. Put the rest on the bottom of your library in a random order.\n−8: You get an emblem with “At the beginning of each end step, create a 4/4 red and green Beast creature token with trample.” From e52bcc6cdcae903a71e4747cc3f6e58df0fd1137 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Mon, 28 Jan 2019 22:26:02 +0000 Subject: [PATCH 721/901] Update forge-gui/res/cardsfolder/upcoming/dovins_automaton.txt --- forge-gui/res/cardsfolder/upcoming/dovins_automaton.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/dovins_automaton.txt b/forge-gui/res/cardsfolder/upcoming/dovins_automaton.txt index 73cdd072ab3..49eb272e363 100644 --- a/forge-gui/res/cardsfolder/upcoming/dovins_automaton.txt +++ b/forge-gui/res/cardsfolder/upcoming/dovins_automaton.txt @@ -2,7 +2,7 @@ Name:Dovin's Automaton ManaCost:4 Types:Artifact Creature Homunculus PT:3/3 -S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Vigilance | IsPresent$ Planeswalker.Dovin+YouCtrl | Description$ As long as you control a planeswalker planeswalker, CARDNAME gets +2/+2 and has vigilance. (Attacking doesn't cause it to tap.) +S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Vigilance | IsPresent$ Planeswalker.Dovin+YouCtrl | Description$ As long as you control a Dovin planeswalker, CARDNAME gets +2/+2 and has vigilance. (Attacking doesn't cause it to tap.) SVar:BuffedBy:Dovin DeckNeeds:Type$Dovin Oracle:As long as you control a Dovin planeswalker, Dovin's Automaton gets +2/+2 and has vigilance. (Attacking doesn't cause it to tap.) From e71ff26b8138b8fdc52cece0e7f605bd0ffc8614 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Tue, 29 Jan 2019 00:35:26 +0000 Subject: [PATCH 722/901] Update forge-gui/res/cardsfolder/upcoming/sphinx_of_foresight.txt --- forge-gui/res/cardsfolder/upcoming/sphinx_of_foresight.txt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/sphinx_of_foresight.txt b/forge-gui/res/cardsfolder/upcoming/sphinx_of_foresight.txt index 99d8de1cd69..9efea7643c3 100644 --- a/forge-gui/res/cardsfolder/upcoming/sphinx_of_foresight.txt +++ b/forge-gui/res/cardsfolder/upcoming/sphinx_of_foresight.txt @@ -3,8 +3,11 @@ ManaCost:2 U U Types:Creature Sphinx PT:4/4 K:MayEffectFromOpeningHand:RevealCard -SVar:RevealCard:DB$ Reveal | RevealDefined$ Self | SubAbility$ DBPump | SpellDescription$ You may reveal this card from your opening hand. If you do, scry 3 at the beginning of your first upkeep. -SVar:DBPump:DB$ Scry | ScryNum$ 3 +SVar:RevealCard:DB$ Reveal | RevealDefined$ Self | SubAbility$ ScryOnUpkeep | SpellDescription$ You may reveal this card from your opening hand. If you do, scry 3 at the beginning of your first upkeep. +SVar:ScryOnUpkeep:DB$ Effect | Triggers$ TrigOpenScry | SVars$ DBScry,RemoveMe | Duration$ Permanent | Name$ Sphinx of Foresight effect | SpellDescription$ You may reveal this card from your opening hand. If you do, scry 3 at the beginning of your first upkeep. +SVar:TrigOpenScry:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ DBScry | TriggerDescription$ If you do, scry 3 at the beginning of your first upkeep. +SVar:DBScry:DB$ Scry | ScryNum$ 3 | SubAbility$ RemoveMe +SVar:RemoveMe:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile K:Flying T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigScry | TriggerDescription$ At the beginning of your upkeep, scry 1. SVar:TrigScry:DB$ Scry | ScryNum$ 1 From 14629715a259cd179ad6a0ff138b830a7f328a92 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Tue, 29 Jan 2019 03:22:44 +0000 Subject: [PATCH 723/901] Fix cost of spirit-making ability on Ethereal Absolution --- forge-gui/res/cardsfolder/upcoming/ethereal_absolution.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/ethereal_absolution.txt b/forge-gui/res/cardsfolder/upcoming/ethereal_absolution.txt index 3c789a573ff..14171660a77 100644 --- a/forge-gui/res/cardsfolder/upcoming/ethereal_absolution.txt +++ b/forge-gui/res/cardsfolder/upcoming/ethereal_absolution.txt @@ -5,7 +5,7 @@ S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddPower$ 1 | AddToughness$ 1 S:Mode$ Continuous | Affected$ Creature.OppCtrl | AddPower$ -1 | AddToughness$ -1 | Description$ Creatures your opponents control get -1/-1. SVar:PlayMain1:TRUE SVar:RemRandomDeck:True -A:AB$ ChangeZone | Cost$ 4 W B | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Card.OppOwn | SubAbility$ DBToken | SpellDescription$ Exile target card from an opponent's graveyard. If it was a creature card, you create a 1/1 white and black Spirit creature token with flying. +A:AB$ ChangeZone | Cost$ 2 W B | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Card.OppOwn | SubAbility$ DBToken | SpellDescription$ Exile target card from an opponent's graveyard. If it was a creature card, you create a 1/1 white and black Spirit creature token with flying. SVar:DBToken:DB$ Token | ConditionDefined$ Targeted | ConditionPresent$ Creature | ConditionCompare$ EQ1 | TokenAmount$ 1 | TokenScript$ wb_1_1_spirit_flying | TokenOwner$ You | SubAbility$ DBCleanup | LegacyImage$ wb 1 1 spirit flying rna SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True DeckHas:Ability$Token From 38ddca0acdb72858b2f400858b1610b2b0788e14 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Tue, 29 Jan 2019 03:37:10 +0000 Subject: [PATCH 724/901] Fix Spectacle cost --- forge-gui/res/cardsfolder/upcoming/blade_juggler.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/blade_juggler.txt b/forge-gui/res/cardsfolder/upcoming/blade_juggler.txt index 9bfac79a21a..558fd7bbb09 100644 --- a/forge-gui/res/cardsfolder/upcoming/blade_juggler.txt +++ b/forge-gui/res/cardsfolder/upcoming/blade_juggler.txt @@ -2,7 +2,7 @@ Name:Blade Juggler ManaCost:4 B Types:Creature Human Rogue PT:3/2 -K:Spectacle:2 +K:Spectacle:2 B T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 1 damage to you and you draw a card. SVar:TrigDealDamage:DB$DealDamage | Defined$ You | NumDmg$ 1 | SubAbility$ DBDraw SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 1 From fc5b76fbb4bd2f999bfc9d54b7263dfaacf28192 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Tue, 29 Jan 2019 03:41:59 +0000 Subject: [PATCH 725/901] Fix cast cost of Colossus --- forge-gui/res/cardsfolder/upcoming/collision_colossus.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/collision_colossus.txt b/forge-gui/res/cardsfolder/upcoming/collision_colossus.txt index c91059e34cf..c95838afd48 100644 --- a/forge-gui/res/cardsfolder/upcoming/collision_colossus.txt +++ b/forge-gui/res/cardsfolder/upcoming/collision_colossus.txt @@ -10,5 +10,5 @@ ALTERNATE Name:Colossus ManaCost:R G Types:Instant -A:SP$ Pump | Cost$ 1 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +4 | NumDef$ +2 | KW$ Trample | SpellDescription$ Target creature gets +3/+1 and gains trample until end of turn. +A:SP$ Pump | Cost$ R G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +4 | NumDef$ +2 | KW$ Trample | SpellDescription$ Target creature gets +4/+2 and gains trample until end of turn. Oracle:Target creature gets +4/+2 and gains trample until end of turn. From 1b47a2df87f4bf12d67a8002be8e46cac22825ed Mon Sep 17 00:00:00 2001 From: Chris H Date: Mon, 28 Jan 2019 22:57:43 -0500 Subject: [PATCH 726/901] Migrate RNA to alpha folders --- forge-gui/res/cardsfolder/{upcoming => a}/aeromunculus.txt | 0 forge-gui/res/cardsfolder/{upcoming => a}/amplifire.txt | 0 forge-gui/res/cardsfolder/{upcoming => a}/angel_of_grace.txt | 0 forge-gui/res/cardsfolder/{upcoming => a}/angelic_exaltation.txt | 0 forge-gui/res/cardsfolder/{upcoming => a}/applied_biomancy.txt | 0 forge-gui/res/cardsfolder/{upcoming => a}/archway_angel.txt | 0 .../res/cardsfolder/{upcoming => a}/arresters_admonition.txt | 0 forge-gui/res/cardsfolder/{upcoming => a}/arresters_zeal.txt | 0 .../res/cardsfolder/{upcoming => a}/awaken_the_erstwhile.txt | 0 forge-gui/res/cardsfolder/{upcoming => a}/axebane_beast.txt | 0 .../res/cardsfolder/{upcoming => a}/azorius_knight_arbiter.txt | 0 forge-gui/res/cardsfolder/{upcoming => a}/azorius_locket.txt | 0 forge-gui/res/cardsfolder/{upcoming => a}/azorius_skyguard.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/bankrupt_in_blood.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/basilica_bell_haunt.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/bedeck_bedazzle.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/bedevil.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/benthic_biomancer.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/biogenic_ooze.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/biogenic_upgrade.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/biomancers_familiar.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/blade_juggler.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/bladebrand.txt | 0 .../res/cardsfolder/{upcoming => b}/bloodmist_infiltrator.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/bolrac_clan_crusher.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/bring_to_trial.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/burn_bright.txt | 0 forge-gui/res/cardsfolder/{upcoming => b}/burning_tree_vandal.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/captive_audience.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/carnival_carnage.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/carrion_imp.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/catacomb_crocodile.txt | 0 .../res/cardsfolder/{upcoming => c}/cavalcade_of_calamity.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/charging_war_boar.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/chillbringer.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/cindervines.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/civic_stalwart.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/clamor_shaman.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/clan_guildmage.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/clear_the_mind.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/clear_the_stage.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/code_of_constraint.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/collision_colossus.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/combine_guildmage.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/consecrate_consume.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/consign_to_the_pit.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/coral_commando.txt | 0 .../res/cardsfolder/{upcoming => c}/cry_of_the_carnarium.txt | 0 forge-gui/res/cardsfolder/{upcoming => c}/cult_guildmage.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/dagger_caster.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/dead_revels.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/debtors_transport.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/deface.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/depose_deploy.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/deputy_of_detention.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/domri_chaos_bringer.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/domri_city_smasher.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/domris_nodorog.txt | 0 .../res/cardsfolder/{upcoming => d}/dovin_architect_of_law.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/dovin_grand_arbiter.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/dovins_acuity.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/dovins_automaton.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/dovins_dismissal.txt | 0 forge-gui/res/cardsfolder/{upcoming => d}/drill_bit.txt | 0 forge-gui/res/cardsfolder/{upcoming => e}/electrodominance.txt | 0 forge-gui/res/cardsfolder/{upcoming => e}/elite_arrester.txt | 0 forge-gui/res/cardsfolder/{upcoming => e}/emergency_powers.txt | 0 .../res/cardsfolder/{upcoming => e}/end_raze_forerunners.txt | 0 forge-gui/res/cardsfolder/{upcoming => e}/enraged_ceratok.txt | 0 forge-gui/res/cardsfolder/{upcoming => e}/essence_capture.txt | 0 forge-gui/res/cardsfolder/{upcoming => e}/ethereal_absolution.txt | 0 forge-gui/res/cardsfolder/{upcoming => e}/expose_to_daylight.txt | 0 forge-gui/res/cardsfolder/{upcoming => e}/eyes_everywhere.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/faerie_duelist.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/feral_maaka.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/final_payment.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/fireblade_artist.txt | 0 .../res/cardsfolder/{upcoming => f}/flames_of_the_raze_boar.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/font_of_agonies.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/footlight_fiend.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/forbidding_spirit.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/frenzied_arynx.txt | 0 forge-gui/res/cardsfolder/{upcoming => f}/frilled_mystic.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/galloping_lizrog.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/gate_colossus.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/gatebreaker_ram.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/gates_ablaze.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/gateway_sneak.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/get_the_point.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/ghor_clan_wrecker.txt | 0 .../res/cardsfolder/{upcoming => g}/glass_of_the_guildpact.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/goblin_gathering.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/grasping_thrull.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/gravel_hide_goblin.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/grotesque_demise.txt | 0 .../res/cardsfolder/{upcoming => g}/growth_chamber_guardian.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/growth_spiral.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/gruul_beastmaster.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/gruul_locket.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/gruul_spellbreaker.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/guardian_project.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/gutterbones.txt | 0 forge-gui/res/cardsfolder/{upcoming => g}/gyre_engineer.txt | 0 forge-gui/res/cardsfolder/{upcoming => h}/haazda_officer.txt | 0 forge-gui/res/cardsfolder/{upcoming => h}/hackrobat.txt | 0 .../res/cardsfolder/{upcoming => h}/hero_of_precinct_one.txt | 0 forge-gui/res/cardsfolder/{upcoming => h}/high_alert.txt | 0 forge-gui/res/cardsfolder/{upcoming => h}/humongulus.txt | 0 forge-gui/res/cardsfolder/{upcoming => h}/hydroid_krasis.txt | 0 .../res/cardsfolder/{upcoming => i}/ill_gotten_inheritance.txt | 0 forge-gui/res/cardsfolder/{upcoming => i}/immolation_shaman.txt | 0 forge-gui/res/cardsfolder/{upcoming => i}/impassioned_orator.txt | 0 forge-gui/res/cardsfolder/{upcoming => i}/imperious_oligarch.txt | 0 forge-gui/res/cardsfolder/{upcoming => i}/incubation_druid.txt | 0 .../res/cardsfolder/{upcoming => i}/incubation_incongruity.txt | 0 .../res/cardsfolder/{upcoming => j}/judith_the_scourge_diva.txt | 0 forge-gui/res/cardsfolder/{upcoming => j}/justiciars_portal.txt | 0 forge-gui/res/cardsfolder/{upcoming => k}/kaya_orzhov_usurper.txt | 0 forge-gui/res/cardsfolder/{upcoming => k}/kayas_wrath.txt | 0 forge-gui/res/cardsfolder/{upcoming => k}/knight_of_sorrows.txt | 0 .../res/cardsfolder/{upcoming => k}/knight_of_the_last_breath.txt | 0 .../res/cardsfolder/{upcoming => l}/lavinia_azorius_renegade.txt | 0 forge-gui/res/cardsfolder/{upcoming => l}/lawmages_binding.txt | 0 forge-gui/res/cardsfolder/{upcoming => l}/light_up_the_stage.txt | 0 .../res/cardsfolder/{upcoming => l}/lumbering_battlement.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/macabre_mockery.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/mass_manipulation.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/mesmerizing_benthid.txt | 0 .../res/cardsfolder/{upcoming => m}/ministrant_of_obligation.txt | 0 forge-gui/res/cardsfolder/{upcoming => m}/mirror_march.txt | 0 .../res/cardsfolder/{upcoming => n}/nikya_of_the_old_ways.txt | 0 forge-gui/res/cardsfolder/{upcoming => n}/noxious_groodion.txt | 0 forge-gui/res/cardsfolder/{upcoming => o}/open_the_gates.txt | 0 forge-gui/res/cardsfolder/{upcoming => o}/orzhov_enforcer.txt | 0 forge-gui/res/cardsfolder/{upcoming => o}/orzhov_locket.txt | 0 forge-gui/res/cardsfolder/{upcoming => o}/orzhov_racketeers.txt | 0 .../res/cardsfolder/{upcoming => p}/persistent_petitioners.txt | 0 forge-gui/res/cardsfolder/{upcoming => p}/pestilent_spirit.txt | 0 forge-gui/res/cardsfolder/{upcoming => p}/pitiless_pontiff.txt | 0 forge-gui/res/cardsfolder/{upcoming => p}/plague_wight.txt | 0 forge-gui/res/cardsfolder/{upcoming => p}/plaza_of_harmony.txt | 0 .../res/cardsfolder/{upcoming => p}/precognitive_perception.txt | 0 .../res/cardsfolder/{upcoming => p}/priest_of_forgotten_gods.txt | 0 .../res/cardsfolder/{upcoming => p}/prime_speaker_vannifar.txt | 0 forge-gui/res/cardsfolder/{upcoming => p}/prowling_caracal.txt | 0 forge-gui/res/cardsfolder/{upcoming => p}/prying_eyes.txt | 0 forge-gui/res/cardsfolder/{upcoming => p}/pteramander.txt | 0 forge-gui/res/cardsfolder/{upcoming => q}/quench.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/rafter_demon.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/ragefire.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/rakdos_firewheeler.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/rakdos_locket.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/rakdos_roustabout.txt | 0 .../res/cardsfolder/{upcoming => r}/rakdos_the_showstopper.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/rakdos_trumpeter.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/rally_to_battle.txt | 0 .../res/cardsfolder/{upcoming => r}/rampage_of_the_clans.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/rampaging_rendhorn.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/ravager_wurm.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/regenesis.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/repudiate_replicate.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/resolute_watchdog.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/revival_revenge.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/rhythm_of_the_wild.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/rix_maadi_reveler.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/rubble_reading.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/rubble_slinger.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/rubblebelt_recluse.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/rubblebelt_runner.txt | 0 forge-gui/res/cardsfolder/{upcoming => r}/rumbling_ruin.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/sages_row_savant.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/sagittars_volley.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/saruli_caretaker.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/sauroform_hybrid.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/savage_smash.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/scorchmark.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/screaming_shield.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/scuttlegator.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/senate_courier.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/senate_griffin.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/senate_guildmage.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/sentinels_mark.txt | 0 .../res/cardsfolder/{upcoming => s}/seraph_of_the_scales.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/sharktocrab.txt | 0 .../res/cardsfolder/{upcoming => s}/shimmer_of_possibility.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/silhana_wayfinder.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/simic_ascendancy.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/simic_locket.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/skarrgan_hellkite.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/skatewing_spy.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/skewer_the_critics.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/skitter_eel.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/sky_tether.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/slimebind.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/smelt_ward_ignus.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/smothering_tithe.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/spawn_of_mayhem.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/spear_spewer.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/sphinx_of_foresight.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/sphinx_of_new_prahv.txt | 0 .../res/cardsfolder/{upcoming => s}/sphinx_of_the_guildpact.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/sphinxs_insight.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/spikewheel_acrobat.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/spire_mangler.txt | 0 .../res/cardsfolder/{upcoming => s}/spirit_of_the_spires.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/steeple_creeper.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/stony_strength.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/storm_strike.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/summary_judgment.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/sunder_shaman.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/swirling_torrent.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/sylvan_brushstrider.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/syndicate_guildmage.txt | 0 forge-gui/res/cardsfolder/{upcoming => s}/syndicate_messenger.txt | 0 .../res/cardsfolder/{upcoming => t}/tenth_district_veteran.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/territorial_boar.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/teysa_karlov.txt | 0 .../res/cardsfolder/{upcoming => t}/the_haunt_of_hightower.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/theater_of_horrors.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/thirsting_shade.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/thought_collapse.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/thrash_threat.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/tin_street_dodger.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/titanic_brawl.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/tithe_taker.txt | 0 .../res/cardsfolder/{upcoming => t}/tome_of_the_guildpact.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/trollbred_guardian.txt | 0 forge-gui/res/cardsfolder/{upcoming => t}/twilight_panther.txt | 0 .../res/cardsfolder/{upcoming => u}/unbreakable_formation.txt | 0 forge-gui/res/cardsfolder/{upcoming => u}/undercity_scavenger.txt | 0 forge-gui/res/cardsfolder/{upcoming => u}/undercitys_embrace.txt | 0 forge-gui/res/cardsfolder/{upcoming => v}/verity_circle.txt | 0 forge-gui/res/cardsfolder/{upcoming => v}/vindictive_vampire.txt | 0 forge-gui/res/cardsfolder/{upcoming => v}/vizkopa_vampire.txt | 0 .../res/cardsfolder/{upcoming => w}/wall_of_lost_thoughts.txt | 0 forge-gui/res/cardsfolder/{upcoming => w}/warrant_warden.txt | 0 forge-gui/res/cardsfolder/{upcoming => w}/watchful_giant.txt | 0 .../res/cardsfolder/{upcoming => w}/wilderness_reclamation.txt | 0 forge-gui/res/cardsfolder/{upcoming => w}/windstorm_drake.txt | 0 forge-gui/res/cardsfolder/{upcoming => w}/wrecking_beast.txt | 0 .../res/cardsfolder/{upcoming => z}/zegana_utopian_speaker.txt | 0 forge-gui/res/cardsfolder/{upcoming => z}/zhur_taa_goblin.txt | 0 242 files changed, 0 insertions(+), 0 deletions(-) rename forge-gui/res/cardsfolder/{upcoming => a}/aeromunculus.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/amplifire.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/angel_of_grace.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/angelic_exaltation.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/applied_biomancy.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/archway_angel.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/arresters_admonition.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/arresters_zeal.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/awaken_the_erstwhile.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/axebane_beast.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/azorius_knight_arbiter.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/azorius_locket.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => a}/azorius_skyguard.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/bankrupt_in_blood.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/basilica_bell_haunt.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/bedeck_bedazzle.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/bedevil.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/benthic_biomancer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/biogenic_ooze.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/biogenic_upgrade.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/biomancers_familiar.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/blade_juggler.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/bladebrand.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/bloodmist_infiltrator.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/bolrac_clan_crusher.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/bring_to_trial.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/burn_bright.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => b}/burning_tree_vandal.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/captive_audience.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/carnival_carnage.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/carrion_imp.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/catacomb_crocodile.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/cavalcade_of_calamity.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/charging_war_boar.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/chillbringer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/cindervines.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/civic_stalwart.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/clamor_shaman.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/clan_guildmage.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/clear_the_mind.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/clear_the_stage.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/code_of_constraint.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/collision_colossus.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/combine_guildmage.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/consecrate_consume.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/consign_to_the_pit.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/coral_commando.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/cry_of_the_carnarium.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => c}/cult_guildmage.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/dagger_caster.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/dead_revels.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/debtors_transport.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/deface.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/depose_deploy.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/deputy_of_detention.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/domri_chaos_bringer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/domri_city_smasher.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/domris_nodorog.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/dovin_architect_of_law.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/dovin_grand_arbiter.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/dovins_acuity.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/dovins_automaton.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/dovins_dismissal.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => d}/drill_bit.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/electrodominance.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/elite_arrester.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/emergency_powers.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/end_raze_forerunners.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/enraged_ceratok.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/essence_capture.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/ethereal_absolution.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/expose_to_daylight.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => e}/eyes_everywhere.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/faerie_duelist.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/feral_maaka.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/final_payment.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/fireblade_artist.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/flames_of_the_raze_boar.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/font_of_agonies.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/footlight_fiend.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/forbidding_spirit.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/frenzied_arynx.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => f}/frilled_mystic.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/galloping_lizrog.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/gate_colossus.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/gatebreaker_ram.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/gates_ablaze.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/gateway_sneak.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/get_the_point.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/ghor_clan_wrecker.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/glass_of_the_guildpact.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/goblin_gathering.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/grasping_thrull.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/gravel_hide_goblin.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/grotesque_demise.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/growth_chamber_guardian.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/growth_spiral.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/gruul_beastmaster.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/gruul_locket.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/gruul_spellbreaker.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/guardian_project.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/gutterbones.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => g}/gyre_engineer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => h}/haazda_officer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => h}/hackrobat.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => h}/hero_of_precinct_one.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => h}/high_alert.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => h}/humongulus.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => h}/hydroid_krasis.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => i}/ill_gotten_inheritance.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => i}/immolation_shaman.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => i}/impassioned_orator.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => i}/imperious_oligarch.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => i}/incubation_druid.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => i}/incubation_incongruity.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => j}/judith_the_scourge_diva.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => j}/justiciars_portal.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => k}/kaya_orzhov_usurper.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => k}/kayas_wrath.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => k}/knight_of_sorrows.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => k}/knight_of_the_last_breath.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => l}/lavinia_azorius_renegade.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => l}/lawmages_binding.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => l}/light_up_the_stage.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => l}/lumbering_battlement.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/macabre_mockery.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/mass_manipulation.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/mesmerizing_benthid.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/ministrant_of_obligation.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => m}/mirror_march.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => n}/nikya_of_the_old_ways.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => n}/noxious_groodion.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => o}/open_the_gates.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => o}/orzhov_enforcer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => o}/orzhov_locket.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => o}/orzhov_racketeers.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/persistent_petitioners.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/pestilent_spirit.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/pitiless_pontiff.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/plague_wight.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/plaza_of_harmony.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/precognitive_perception.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/priest_of_forgotten_gods.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/prime_speaker_vannifar.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/prowling_caracal.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/prying_eyes.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => p}/pteramander.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => q}/quench.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/rafter_demon.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/ragefire.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/rakdos_firewheeler.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/rakdos_locket.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/rakdos_roustabout.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/rakdos_the_showstopper.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/rakdos_trumpeter.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/rally_to_battle.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/rampage_of_the_clans.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/rampaging_rendhorn.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/ravager_wurm.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/regenesis.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/repudiate_replicate.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/resolute_watchdog.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/revival_revenge.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/rhythm_of_the_wild.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/rix_maadi_reveler.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/rubble_reading.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/rubble_slinger.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/rubblebelt_recluse.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/rubblebelt_runner.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => r}/rumbling_ruin.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sages_row_savant.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sagittars_volley.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/saruli_caretaker.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sauroform_hybrid.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/savage_smash.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/scorchmark.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/screaming_shield.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/scuttlegator.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/senate_courier.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/senate_griffin.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/senate_guildmage.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sentinels_mark.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/seraph_of_the_scales.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sharktocrab.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/shimmer_of_possibility.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/silhana_wayfinder.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/simic_ascendancy.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/simic_locket.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/skarrgan_hellkite.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/skatewing_spy.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/skewer_the_critics.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/skitter_eel.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sky_tether.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/slimebind.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/smelt_ward_ignus.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/smothering_tithe.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/spawn_of_mayhem.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/spear_spewer.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sphinx_of_foresight.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sphinx_of_new_prahv.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sphinx_of_the_guildpact.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sphinxs_insight.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/spikewheel_acrobat.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/spire_mangler.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/spirit_of_the_spires.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/steeple_creeper.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/stony_strength.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/storm_strike.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/summary_judgment.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sunder_shaman.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/swirling_torrent.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/sylvan_brushstrider.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/syndicate_guildmage.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => s}/syndicate_messenger.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/tenth_district_veteran.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/territorial_boar.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/teysa_karlov.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/the_haunt_of_hightower.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/theater_of_horrors.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/thirsting_shade.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/thought_collapse.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/thrash_threat.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/tin_street_dodger.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/titanic_brawl.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/tithe_taker.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/tome_of_the_guildpact.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/trollbred_guardian.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => t}/twilight_panther.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => u}/unbreakable_formation.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => u}/undercity_scavenger.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => u}/undercitys_embrace.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => v}/verity_circle.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => v}/vindictive_vampire.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => v}/vizkopa_vampire.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => w}/wall_of_lost_thoughts.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => w}/warrant_warden.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => w}/watchful_giant.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => w}/wilderness_reclamation.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => w}/windstorm_drake.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => w}/wrecking_beast.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => z}/zegana_utopian_speaker.txt (100%) rename forge-gui/res/cardsfolder/{upcoming => z}/zhur_taa_goblin.txt (100%) diff --git a/forge-gui/res/cardsfolder/upcoming/aeromunculus.txt b/forge-gui/res/cardsfolder/a/aeromunculus.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/aeromunculus.txt rename to forge-gui/res/cardsfolder/a/aeromunculus.txt diff --git a/forge-gui/res/cardsfolder/upcoming/amplifire.txt b/forge-gui/res/cardsfolder/a/amplifire.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/amplifire.txt rename to forge-gui/res/cardsfolder/a/amplifire.txt diff --git a/forge-gui/res/cardsfolder/upcoming/angel_of_grace.txt b/forge-gui/res/cardsfolder/a/angel_of_grace.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/angel_of_grace.txt rename to forge-gui/res/cardsfolder/a/angel_of_grace.txt diff --git a/forge-gui/res/cardsfolder/upcoming/angelic_exaltation.txt b/forge-gui/res/cardsfolder/a/angelic_exaltation.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/angelic_exaltation.txt rename to forge-gui/res/cardsfolder/a/angelic_exaltation.txt diff --git a/forge-gui/res/cardsfolder/upcoming/applied_biomancy.txt b/forge-gui/res/cardsfolder/a/applied_biomancy.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/applied_biomancy.txt rename to forge-gui/res/cardsfolder/a/applied_biomancy.txt diff --git a/forge-gui/res/cardsfolder/upcoming/archway_angel.txt b/forge-gui/res/cardsfolder/a/archway_angel.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/archway_angel.txt rename to forge-gui/res/cardsfolder/a/archway_angel.txt diff --git a/forge-gui/res/cardsfolder/upcoming/arresters_admonition.txt b/forge-gui/res/cardsfolder/a/arresters_admonition.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/arresters_admonition.txt rename to forge-gui/res/cardsfolder/a/arresters_admonition.txt diff --git a/forge-gui/res/cardsfolder/upcoming/arresters_zeal.txt b/forge-gui/res/cardsfolder/a/arresters_zeal.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/arresters_zeal.txt rename to forge-gui/res/cardsfolder/a/arresters_zeal.txt diff --git a/forge-gui/res/cardsfolder/upcoming/awaken_the_erstwhile.txt b/forge-gui/res/cardsfolder/a/awaken_the_erstwhile.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/awaken_the_erstwhile.txt rename to forge-gui/res/cardsfolder/a/awaken_the_erstwhile.txt diff --git a/forge-gui/res/cardsfolder/upcoming/axebane_beast.txt b/forge-gui/res/cardsfolder/a/axebane_beast.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/axebane_beast.txt rename to forge-gui/res/cardsfolder/a/axebane_beast.txt diff --git a/forge-gui/res/cardsfolder/upcoming/azorius_knight_arbiter.txt b/forge-gui/res/cardsfolder/a/azorius_knight_arbiter.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/azorius_knight_arbiter.txt rename to forge-gui/res/cardsfolder/a/azorius_knight_arbiter.txt diff --git a/forge-gui/res/cardsfolder/upcoming/azorius_locket.txt b/forge-gui/res/cardsfolder/a/azorius_locket.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/azorius_locket.txt rename to forge-gui/res/cardsfolder/a/azorius_locket.txt diff --git a/forge-gui/res/cardsfolder/upcoming/azorius_skyguard.txt b/forge-gui/res/cardsfolder/a/azorius_skyguard.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/azorius_skyguard.txt rename to forge-gui/res/cardsfolder/a/azorius_skyguard.txt diff --git a/forge-gui/res/cardsfolder/upcoming/bankrupt_in_blood.txt b/forge-gui/res/cardsfolder/b/bankrupt_in_blood.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/bankrupt_in_blood.txt rename to forge-gui/res/cardsfolder/b/bankrupt_in_blood.txt diff --git a/forge-gui/res/cardsfolder/upcoming/basilica_bell_haunt.txt b/forge-gui/res/cardsfolder/b/basilica_bell_haunt.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/basilica_bell_haunt.txt rename to forge-gui/res/cardsfolder/b/basilica_bell_haunt.txt diff --git a/forge-gui/res/cardsfolder/upcoming/bedeck_bedazzle.txt b/forge-gui/res/cardsfolder/b/bedeck_bedazzle.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/bedeck_bedazzle.txt rename to forge-gui/res/cardsfolder/b/bedeck_bedazzle.txt diff --git a/forge-gui/res/cardsfolder/upcoming/bedevil.txt b/forge-gui/res/cardsfolder/b/bedevil.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/bedevil.txt rename to forge-gui/res/cardsfolder/b/bedevil.txt diff --git a/forge-gui/res/cardsfolder/upcoming/benthic_biomancer.txt b/forge-gui/res/cardsfolder/b/benthic_biomancer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/benthic_biomancer.txt rename to forge-gui/res/cardsfolder/b/benthic_biomancer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/biogenic_ooze.txt b/forge-gui/res/cardsfolder/b/biogenic_ooze.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/biogenic_ooze.txt rename to forge-gui/res/cardsfolder/b/biogenic_ooze.txt diff --git a/forge-gui/res/cardsfolder/upcoming/biogenic_upgrade.txt b/forge-gui/res/cardsfolder/b/biogenic_upgrade.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/biogenic_upgrade.txt rename to forge-gui/res/cardsfolder/b/biogenic_upgrade.txt diff --git a/forge-gui/res/cardsfolder/upcoming/biomancers_familiar.txt b/forge-gui/res/cardsfolder/b/biomancers_familiar.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/biomancers_familiar.txt rename to forge-gui/res/cardsfolder/b/biomancers_familiar.txt diff --git a/forge-gui/res/cardsfolder/upcoming/blade_juggler.txt b/forge-gui/res/cardsfolder/b/blade_juggler.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/blade_juggler.txt rename to forge-gui/res/cardsfolder/b/blade_juggler.txt diff --git a/forge-gui/res/cardsfolder/upcoming/bladebrand.txt b/forge-gui/res/cardsfolder/b/bladebrand.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/bladebrand.txt rename to forge-gui/res/cardsfolder/b/bladebrand.txt diff --git a/forge-gui/res/cardsfolder/upcoming/bloodmist_infiltrator.txt b/forge-gui/res/cardsfolder/b/bloodmist_infiltrator.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/bloodmist_infiltrator.txt rename to forge-gui/res/cardsfolder/b/bloodmist_infiltrator.txt diff --git a/forge-gui/res/cardsfolder/upcoming/bolrac_clan_crusher.txt b/forge-gui/res/cardsfolder/b/bolrac_clan_crusher.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/bolrac_clan_crusher.txt rename to forge-gui/res/cardsfolder/b/bolrac_clan_crusher.txt diff --git a/forge-gui/res/cardsfolder/upcoming/bring_to_trial.txt b/forge-gui/res/cardsfolder/b/bring_to_trial.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/bring_to_trial.txt rename to forge-gui/res/cardsfolder/b/bring_to_trial.txt diff --git a/forge-gui/res/cardsfolder/upcoming/burn_bright.txt b/forge-gui/res/cardsfolder/b/burn_bright.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/burn_bright.txt rename to forge-gui/res/cardsfolder/b/burn_bright.txt diff --git a/forge-gui/res/cardsfolder/upcoming/burning_tree_vandal.txt b/forge-gui/res/cardsfolder/b/burning_tree_vandal.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/burning_tree_vandal.txt rename to forge-gui/res/cardsfolder/b/burning_tree_vandal.txt diff --git a/forge-gui/res/cardsfolder/upcoming/captive_audience.txt b/forge-gui/res/cardsfolder/c/captive_audience.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/captive_audience.txt rename to forge-gui/res/cardsfolder/c/captive_audience.txt diff --git a/forge-gui/res/cardsfolder/upcoming/carnival_carnage.txt b/forge-gui/res/cardsfolder/c/carnival_carnage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/carnival_carnage.txt rename to forge-gui/res/cardsfolder/c/carnival_carnage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/carrion_imp.txt b/forge-gui/res/cardsfolder/c/carrion_imp.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/carrion_imp.txt rename to forge-gui/res/cardsfolder/c/carrion_imp.txt diff --git a/forge-gui/res/cardsfolder/upcoming/catacomb_crocodile.txt b/forge-gui/res/cardsfolder/c/catacomb_crocodile.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/catacomb_crocodile.txt rename to forge-gui/res/cardsfolder/c/catacomb_crocodile.txt diff --git a/forge-gui/res/cardsfolder/upcoming/cavalcade_of_calamity.txt b/forge-gui/res/cardsfolder/c/cavalcade_of_calamity.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/cavalcade_of_calamity.txt rename to forge-gui/res/cardsfolder/c/cavalcade_of_calamity.txt diff --git a/forge-gui/res/cardsfolder/upcoming/charging_war_boar.txt b/forge-gui/res/cardsfolder/c/charging_war_boar.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/charging_war_boar.txt rename to forge-gui/res/cardsfolder/c/charging_war_boar.txt diff --git a/forge-gui/res/cardsfolder/upcoming/chillbringer.txt b/forge-gui/res/cardsfolder/c/chillbringer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/chillbringer.txt rename to forge-gui/res/cardsfolder/c/chillbringer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/cindervines.txt b/forge-gui/res/cardsfolder/c/cindervines.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/cindervines.txt rename to forge-gui/res/cardsfolder/c/cindervines.txt diff --git a/forge-gui/res/cardsfolder/upcoming/civic_stalwart.txt b/forge-gui/res/cardsfolder/c/civic_stalwart.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/civic_stalwart.txt rename to forge-gui/res/cardsfolder/c/civic_stalwart.txt diff --git a/forge-gui/res/cardsfolder/upcoming/clamor_shaman.txt b/forge-gui/res/cardsfolder/c/clamor_shaman.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/clamor_shaman.txt rename to forge-gui/res/cardsfolder/c/clamor_shaman.txt diff --git a/forge-gui/res/cardsfolder/upcoming/clan_guildmage.txt b/forge-gui/res/cardsfolder/c/clan_guildmage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/clan_guildmage.txt rename to forge-gui/res/cardsfolder/c/clan_guildmage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/clear_the_mind.txt b/forge-gui/res/cardsfolder/c/clear_the_mind.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/clear_the_mind.txt rename to forge-gui/res/cardsfolder/c/clear_the_mind.txt diff --git a/forge-gui/res/cardsfolder/upcoming/clear_the_stage.txt b/forge-gui/res/cardsfolder/c/clear_the_stage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/clear_the_stage.txt rename to forge-gui/res/cardsfolder/c/clear_the_stage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/code_of_constraint.txt b/forge-gui/res/cardsfolder/c/code_of_constraint.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/code_of_constraint.txt rename to forge-gui/res/cardsfolder/c/code_of_constraint.txt diff --git a/forge-gui/res/cardsfolder/upcoming/collision_colossus.txt b/forge-gui/res/cardsfolder/c/collision_colossus.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/collision_colossus.txt rename to forge-gui/res/cardsfolder/c/collision_colossus.txt diff --git a/forge-gui/res/cardsfolder/upcoming/combine_guildmage.txt b/forge-gui/res/cardsfolder/c/combine_guildmage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/combine_guildmage.txt rename to forge-gui/res/cardsfolder/c/combine_guildmage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/consecrate_consume.txt b/forge-gui/res/cardsfolder/c/consecrate_consume.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/consecrate_consume.txt rename to forge-gui/res/cardsfolder/c/consecrate_consume.txt diff --git a/forge-gui/res/cardsfolder/upcoming/consign_to_the_pit.txt b/forge-gui/res/cardsfolder/c/consign_to_the_pit.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/consign_to_the_pit.txt rename to forge-gui/res/cardsfolder/c/consign_to_the_pit.txt diff --git a/forge-gui/res/cardsfolder/upcoming/coral_commando.txt b/forge-gui/res/cardsfolder/c/coral_commando.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/coral_commando.txt rename to forge-gui/res/cardsfolder/c/coral_commando.txt diff --git a/forge-gui/res/cardsfolder/upcoming/cry_of_the_carnarium.txt b/forge-gui/res/cardsfolder/c/cry_of_the_carnarium.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/cry_of_the_carnarium.txt rename to forge-gui/res/cardsfolder/c/cry_of_the_carnarium.txt diff --git a/forge-gui/res/cardsfolder/upcoming/cult_guildmage.txt b/forge-gui/res/cardsfolder/c/cult_guildmage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/cult_guildmage.txt rename to forge-gui/res/cardsfolder/c/cult_guildmage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dagger_caster.txt b/forge-gui/res/cardsfolder/d/dagger_caster.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/dagger_caster.txt rename to forge-gui/res/cardsfolder/d/dagger_caster.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dead_revels.txt b/forge-gui/res/cardsfolder/d/dead_revels.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/dead_revels.txt rename to forge-gui/res/cardsfolder/d/dead_revels.txt diff --git a/forge-gui/res/cardsfolder/upcoming/debtors_transport.txt b/forge-gui/res/cardsfolder/d/debtors_transport.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/debtors_transport.txt rename to forge-gui/res/cardsfolder/d/debtors_transport.txt diff --git a/forge-gui/res/cardsfolder/upcoming/deface.txt b/forge-gui/res/cardsfolder/d/deface.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/deface.txt rename to forge-gui/res/cardsfolder/d/deface.txt diff --git a/forge-gui/res/cardsfolder/upcoming/depose_deploy.txt b/forge-gui/res/cardsfolder/d/depose_deploy.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/depose_deploy.txt rename to forge-gui/res/cardsfolder/d/depose_deploy.txt diff --git a/forge-gui/res/cardsfolder/upcoming/deputy_of_detention.txt b/forge-gui/res/cardsfolder/d/deputy_of_detention.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/deputy_of_detention.txt rename to forge-gui/res/cardsfolder/d/deputy_of_detention.txt diff --git a/forge-gui/res/cardsfolder/upcoming/domri_chaos_bringer.txt b/forge-gui/res/cardsfolder/d/domri_chaos_bringer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/domri_chaos_bringer.txt rename to forge-gui/res/cardsfolder/d/domri_chaos_bringer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/domri_city_smasher.txt b/forge-gui/res/cardsfolder/d/domri_city_smasher.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/domri_city_smasher.txt rename to forge-gui/res/cardsfolder/d/domri_city_smasher.txt diff --git a/forge-gui/res/cardsfolder/upcoming/domris_nodorog.txt b/forge-gui/res/cardsfolder/d/domris_nodorog.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/domris_nodorog.txt rename to forge-gui/res/cardsfolder/d/domris_nodorog.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dovin_architect_of_law.txt b/forge-gui/res/cardsfolder/d/dovin_architect_of_law.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/dovin_architect_of_law.txt rename to forge-gui/res/cardsfolder/d/dovin_architect_of_law.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dovin_grand_arbiter.txt b/forge-gui/res/cardsfolder/d/dovin_grand_arbiter.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/dovin_grand_arbiter.txt rename to forge-gui/res/cardsfolder/d/dovin_grand_arbiter.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dovins_acuity.txt b/forge-gui/res/cardsfolder/d/dovins_acuity.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/dovins_acuity.txt rename to forge-gui/res/cardsfolder/d/dovins_acuity.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dovins_automaton.txt b/forge-gui/res/cardsfolder/d/dovins_automaton.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/dovins_automaton.txt rename to forge-gui/res/cardsfolder/d/dovins_automaton.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dovins_dismissal.txt b/forge-gui/res/cardsfolder/d/dovins_dismissal.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/dovins_dismissal.txt rename to forge-gui/res/cardsfolder/d/dovins_dismissal.txt diff --git a/forge-gui/res/cardsfolder/upcoming/drill_bit.txt b/forge-gui/res/cardsfolder/d/drill_bit.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/drill_bit.txt rename to forge-gui/res/cardsfolder/d/drill_bit.txt diff --git a/forge-gui/res/cardsfolder/upcoming/electrodominance.txt b/forge-gui/res/cardsfolder/e/electrodominance.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/electrodominance.txt rename to forge-gui/res/cardsfolder/e/electrodominance.txt diff --git a/forge-gui/res/cardsfolder/upcoming/elite_arrester.txt b/forge-gui/res/cardsfolder/e/elite_arrester.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/elite_arrester.txt rename to forge-gui/res/cardsfolder/e/elite_arrester.txt diff --git a/forge-gui/res/cardsfolder/upcoming/emergency_powers.txt b/forge-gui/res/cardsfolder/e/emergency_powers.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/emergency_powers.txt rename to forge-gui/res/cardsfolder/e/emergency_powers.txt diff --git a/forge-gui/res/cardsfolder/upcoming/end_raze_forerunners.txt b/forge-gui/res/cardsfolder/e/end_raze_forerunners.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/end_raze_forerunners.txt rename to forge-gui/res/cardsfolder/e/end_raze_forerunners.txt diff --git a/forge-gui/res/cardsfolder/upcoming/enraged_ceratok.txt b/forge-gui/res/cardsfolder/e/enraged_ceratok.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/enraged_ceratok.txt rename to forge-gui/res/cardsfolder/e/enraged_ceratok.txt diff --git a/forge-gui/res/cardsfolder/upcoming/essence_capture.txt b/forge-gui/res/cardsfolder/e/essence_capture.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/essence_capture.txt rename to forge-gui/res/cardsfolder/e/essence_capture.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ethereal_absolution.txt b/forge-gui/res/cardsfolder/e/ethereal_absolution.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ethereal_absolution.txt rename to forge-gui/res/cardsfolder/e/ethereal_absolution.txt diff --git a/forge-gui/res/cardsfolder/upcoming/expose_to_daylight.txt b/forge-gui/res/cardsfolder/e/expose_to_daylight.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/expose_to_daylight.txt rename to forge-gui/res/cardsfolder/e/expose_to_daylight.txt diff --git a/forge-gui/res/cardsfolder/upcoming/eyes_everywhere.txt b/forge-gui/res/cardsfolder/e/eyes_everywhere.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/eyes_everywhere.txt rename to forge-gui/res/cardsfolder/e/eyes_everywhere.txt diff --git a/forge-gui/res/cardsfolder/upcoming/faerie_duelist.txt b/forge-gui/res/cardsfolder/f/faerie_duelist.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/faerie_duelist.txt rename to forge-gui/res/cardsfolder/f/faerie_duelist.txt diff --git a/forge-gui/res/cardsfolder/upcoming/feral_maaka.txt b/forge-gui/res/cardsfolder/f/feral_maaka.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/feral_maaka.txt rename to forge-gui/res/cardsfolder/f/feral_maaka.txt diff --git a/forge-gui/res/cardsfolder/upcoming/final_payment.txt b/forge-gui/res/cardsfolder/f/final_payment.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/final_payment.txt rename to forge-gui/res/cardsfolder/f/final_payment.txt diff --git a/forge-gui/res/cardsfolder/upcoming/fireblade_artist.txt b/forge-gui/res/cardsfolder/f/fireblade_artist.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/fireblade_artist.txt rename to forge-gui/res/cardsfolder/f/fireblade_artist.txt diff --git a/forge-gui/res/cardsfolder/upcoming/flames_of_the_raze_boar.txt b/forge-gui/res/cardsfolder/f/flames_of_the_raze_boar.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/flames_of_the_raze_boar.txt rename to forge-gui/res/cardsfolder/f/flames_of_the_raze_boar.txt diff --git a/forge-gui/res/cardsfolder/upcoming/font_of_agonies.txt b/forge-gui/res/cardsfolder/f/font_of_agonies.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/font_of_agonies.txt rename to forge-gui/res/cardsfolder/f/font_of_agonies.txt diff --git a/forge-gui/res/cardsfolder/upcoming/footlight_fiend.txt b/forge-gui/res/cardsfolder/f/footlight_fiend.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/footlight_fiend.txt rename to forge-gui/res/cardsfolder/f/footlight_fiend.txt diff --git a/forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt b/forge-gui/res/cardsfolder/f/forbidding_spirit.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/forbidding_spirit.txt rename to forge-gui/res/cardsfolder/f/forbidding_spirit.txt diff --git a/forge-gui/res/cardsfolder/upcoming/frenzied_arynx.txt b/forge-gui/res/cardsfolder/f/frenzied_arynx.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/frenzied_arynx.txt rename to forge-gui/res/cardsfolder/f/frenzied_arynx.txt diff --git a/forge-gui/res/cardsfolder/upcoming/frilled_mystic.txt b/forge-gui/res/cardsfolder/f/frilled_mystic.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/frilled_mystic.txt rename to forge-gui/res/cardsfolder/f/frilled_mystic.txt diff --git a/forge-gui/res/cardsfolder/upcoming/galloping_lizrog.txt b/forge-gui/res/cardsfolder/g/galloping_lizrog.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/galloping_lizrog.txt rename to forge-gui/res/cardsfolder/g/galloping_lizrog.txt diff --git a/forge-gui/res/cardsfolder/upcoming/gate_colossus.txt b/forge-gui/res/cardsfolder/g/gate_colossus.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/gate_colossus.txt rename to forge-gui/res/cardsfolder/g/gate_colossus.txt diff --git a/forge-gui/res/cardsfolder/upcoming/gatebreaker_ram.txt b/forge-gui/res/cardsfolder/g/gatebreaker_ram.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/gatebreaker_ram.txt rename to forge-gui/res/cardsfolder/g/gatebreaker_ram.txt diff --git a/forge-gui/res/cardsfolder/upcoming/gates_ablaze.txt b/forge-gui/res/cardsfolder/g/gates_ablaze.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/gates_ablaze.txt rename to forge-gui/res/cardsfolder/g/gates_ablaze.txt diff --git a/forge-gui/res/cardsfolder/upcoming/gateway_sneak.txt b/forge-gui/res/cardsfolder/g/gateway_sneak.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/gateway_sneak.txt rename to forge-gui/res/cardsfolder/g/gateway_sneak.txt diff --git a/forge-gui/res/cardsfolder/upcoming/get_the_point.txt b/forge-gui/res/cardsfolder/g/get_the_point.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/get_the_point.txt rename to forge-gui/res/cardsfolder/g/get_the_point.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ghor_clan_wrecker.txt b/forge-gui/res/cardsfolder/g/ghor_clan_wrecker.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ghor_clan_wrecker.txt rename to forge-gui/res/cardsfolder/g/ghor_clan_wrecker.txt diff --git a/forge-gui/res/cardsfolder/upcoming/glass_of_the_guildpact.txt b/forge-gui/res/cardsfolder/g/glass_of_the_guildpact.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/glass_of_the_guildpact.txt rename to forge-gui/res/cardsfolder/g/glass_of_the_guildpact.txt diff --git a/forge-gui/res/cardsfolder/upcoming/goblin_gathering.txt b/forge-gui/res/cardsfolder/g/goblin_gathering.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/goblin_gathering.txt rename to forge-gui/res/cardsfolder/g/goblin_gathering.txt diff --git a/forge-gui/res/cardsfolder/upcoming/grasping_thrull.txt b/forge-gui/res/cardsfolder/g/grasping_thrull.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/grasping_thrull.txt rename to forge-gui/res/cardsfolder/g/grasping_thrull.txt diff --git a/forge-gui/res/cardsfolder/upcoming/gravel_hide_goblin.txt b/forge-gui/res/cardsfolder/g/gravel_hide_goblin.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/gravel_hide_goblin.txt rename to forge-gui/res/cardsfolder/g/gravel_hide_goblin.txt diff --git a/forge-gui/res/cardsfolder/upcoming/grotesque_demise.txt b/forge-gui/res/cardsfolder/g/grotesque_demise.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/grotesque_demise.txt rename to forge-gui/res/cardsfolder/g/grotesque_demise.txt diff --git a/forge-gui/res/cardsfolder/upcoming/growth_chamber_guardian.txt b/forge-gui/res/cardsfolder/g/growth_chamber_guardian.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/growth_chamber_guardian.txt rename to forge-gui/res/cardsfolder/g/growth_chamber_guardian.txt diff --git a/forge-gui/res/cardsfolder/upcoming/growth_spiral.txt b/forge-gui/res/cardsfolder/g/growth_spiral.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/growth_spiral.txt rename to forge-gui/res/cardsfolder/g/growth_spiral.txt diff --git a/forge-gui/res/cardsfolder/upcoming/gruul_beastmaster.txt b/forge-gui/res/cardsfolder/g/gruul_beastmaster.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/gruul_beastmaster.txt rename to forge-gui/res/cardsfolder/g/gruul_beastmaster.txt diff --git a/forge-gui/res/cardsfolder/upcoming/gruul_locket.txt b/forge-gui/res/cardsfolder/g/gruul_locket.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/gruul_locket.txt rename to forge-gui/res/cardsfolder/g/gruul_locket.txt diff --git a/forge-gui/res/cardsfolder/upcoming/gruul_spellbreaker.txt b/forge-gui/res/cardsfolder/g/gruul_spellbreaker.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/gruul_spellbreaker.txt rename to forge-gui/res/cardsfolder/g/gruul_spellbreaker.txt diff --git a/forge-gui/res/cardsfolder/upcoming/guardian_project.txt b/forge-gui/res/cardsfolder/g/guardian_project.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/guardian_project.txt rename to forge-gui/res/cardsfolder/g/guardian_project.txt diff --git a/forge-gui/res/cardsfolder/upcoming/gutterbones.txt b/forge-gui/res/cardsfolder/g/gutterbones.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/gutterbones.txt rename to forge-gui/res/cardsfolder/g/gutterbones.txt diff --git a/forge-gui/res/cardsfolder/upcoming/gyre_engineer.txt b/forge-gui/res/cardsfolder/g/gyre_engineer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/gyre_engineer.txt rename to forge-gui/res/cardsfolder/g/gyre_engineer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/haazda_officer.txt b/forge-gui/res/cardsfolder/h/haazda_officer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/haazda_officer.txt rename to forge-gui/res/cardsfolder/h/haazda_officer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/hackrobat.txt b/forge-gui/res/cardsfolder/h/hackrobat.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/hackrobat.txt rename to forge-gui/res/cardsfolder/h/hackrobat.txt diff --git a/forge-gui/res/cardsfolder/upcoming/hero_of_precinct_one.txt b/forge-gui/res/cardsfolder/h/hero_of_precinct_one.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/hero_of_precinct_one.txt rename to forge-gui/res/cardsfolder/h/hero_of_precinct_one.txt diff --git a/forge-gui/res/cardsfolder/upcoming/high_alert.txt b/forge-gui/res/cardsfolder/h/high_alert.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/high_alert.txt rename to forge-gui/res/cardsfolder/h/high_alert.txt diff --git a/forge-gui/res/cardsfolder/upcoming/humongulus.txt b/forge-gui/res/cardsfolder/h/humongulus.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/humongulus.txt rename to forge-gui/res/cardsfolder/h/humongulus.txt diff --git a/forge-gui/res/cardsfolder/upcoming/hydroid_krasis.txt b/forge-gui/res/cardsfolder/h/hydroid_krasis.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/hydroid_krasis.txt rename to forge-gui/res/cardsfolder/h/hydroid_krasis.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ill_gotten_inheritance.txt b/forge-gui/res/cardsfolder/i/ill_gotten_inheritance.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ill_gotten_inheritance.txt rename to forge-gui/res/cardsfolder/i/ill_gotten_inheritance.txt diff --git a/forge-gui/res/cardsfolder/upcoming/immolation_shaman.txt b/forge-gui/res/cardsfolder/i/immolation_shaman.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/immolation_shaman.txt rename to forge-gui/res/cardsfolder/i/immolation_shaman.txt diff --git a/forge-gui/res/cardsfolder/upcoming/impassioned_orator.txt b/forge-gui/res/cardsfolder/i/impassioned_orator.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/impassioned_orator.txt rename to forge-gui/res/cardsfolder/i/impassioned_orator.txt diff --git a/forge-gui/res/cardsfolder/upcoming/imperious_oligarch.txt b/forge-gui/res/cardsfolder/i/imperious_oligarch.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/imperious_oligarch.txt rename to forge-gui/res/cardsfolder/i/imperious_oligarch.txt diff --git a/forge-gui/res/cardsfolder/upcoming/incubation_druid.txt b/forge-gui/res/cardsfolder/i/incubation_druid.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/incubation_druid.txt rename to forge-gui/res/cardsfolder/i/incubation_druid.txt diff --git a/forge-gui/res/cardsfolder/upcoming/incubation_incongruity.txt b/forge-gui/res/cardsfolder/i/incubation_incongruity.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/incubation_incongruity.txt rename to forge-gui/res/cardsfolder/i/incubation_incongruity.txt diff --git a/forge-gui/res/cardsfolder/upcoming/judith_the_scourge_diva.txt b/forge-gui/res/cardsfolder/j/judith_the_scourge_diva.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/judith_the_scourge_diva.txt rename to forge-gui/res/cardsfolder/j/judith_the_scourge_diva.txt diff --git a/forge-gui/res/cardsfolder/upcoming/justiciars_portal.txt b/forge-gui/res/cardsfolder/j/justiciars_portal.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/justiciars_portal.txt rename to forge-gui/res/cardsfolder/j/justiciars_portal.txt diff --git a/forge-gui/res/cardsfolder/upcoming/kaya_orzhov_usurper.txt b/forge-gui/res/cardsfolder/k/kaya_orzhov_usurper.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/kaya_orzhov_usurper.txt rename to forge-gui/res/cardsfolder/k/kaya_orzhov_usurper.txt diff --git a/forge-gui/res/cardsfolder/upcoming/kayas_wrath.txt b/forge-gui/res/cardsfolder/k/kayas_wrath.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/kayas_wrath.txt rename to forge-gui/res/cardsfolder/k/kayas_wrath.txt diff --git a/forge-gui/res/cardsfolder/upcoming/knight_of_sorrows.txt b/forge-gui/res/cardsfolder/k/knight_of_sorrows.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/knight_of_sorrows.txt rename to forge-gui/res/cardsfolder/k/knight_of_sorrows.txt diff --git a/forge-gui/res/cardsfolder/upcoming/knight_of_the_last_breath.txt b/forge-gui/res/cardsfolder/k/knight_of_the_last_breath.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/knight_of_the_last_breath.txt rename to forge-gui/res/cardsfolder/k/knight_of_the_last_breath.txt diff --git a/forge-gui/res/cardsfolder/upcoming/lavinia_azorius_renegade.txt b/forge-gui/res/cardsfolder/l/lavinia_azorius_renegade.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/lavinia_azorius_renegade.txt rename to forge-gui/res/cardsfolder/l/lavinia_azorius_renegade.txt diff --git a/forge-gui/res/cardsfolder/upcoming/lawmages_binding.txt b/forge-gui/res/cardsfolder/l/lawmages_binding.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/lawmages_binding.txt rename to forge-gui/res/cardsfolder/l/lawmages_binding.txt diff --git a/forge-gui/res/cardsfolder/upcoming/light_up_the_stage.txt b/forge-gui/res/cardsfolder/l/light_up_the_stage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/light_up_the_stage.txt rename to forge-gui/res/cardsfolder/l/light_up_the_stage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/lumbering_battlement.txt b/forge-gui/res/cardsfolder/l/lumbering_battlement.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/lumbering_battlement.txt rename to forge-gui/res/cardsfolder/l/lumbering_battlement.txt diff --git a/forge-gui/res/cardsfolder/upcoming/macabre_mockery.txt b/forge-gui/res/cardsfolder/m/macabre_mockery.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/macabre_mockery.txt rename to forge-gui/res/cardsfolder/m/macabre_mockery.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mass_manipulation.txt b/forge-gui/res/cardsfolder/m/mass_manipulation.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mass_manipulation.txt rename to forge-gui/res/cardsfolder/m/mass_manipulation.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mesmerizing_benthid.txt b/forge-gui/res/cardsfolder/m/mesmerizing_benthid.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mesmerizing_benthid.txt rename to forge-gui/res/cardsfolder/m/mesmerizing_benthid.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ministrant_of_obligation.txt b/forge-gui/res/cardsfolder/m/ministrant_of_obligation.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ministrant_of_obligation.txt rename to forge-gui/res/cardsfolder/m/ministrant_of_obligation.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mirror_march.txt b/forge-gui/res/cardsfolder/m/mirror_march.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mirror_march.txt rename to forge-gui/res/cardsfolder/m/mirror_march.txt diff --git a/forge-gui/res/cardsfolder/upcoming/nikya_of_the_old_ways.txt b/forge-gui/res/cardsfolder/n/nikya_of_the_old_ways.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/nikya_of_the_old_ways.txt rename to forge-gui/res/cardsfolder/n/nikya_of_the_old_ways.txt diff --git a/forge-gui/res/cardsfolder/upcoming/noxious_groodion.txt b/forge-gui/res/cardsfolder/n/noxious_groodion.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/noxious_groodion.txt rename to forge-gui/res/cardsfolder/n/noxious_groodion.txt diff --git a/forge-gui/res/cardsfolder/upcoming/open_the_gates.txt b/forge-gui/res/cardsfolder/o/open_the_gates.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/open_the_gates.txt rename to forge-gui/res/cardsfolder/o/open_the_gates.txt diff --git a/forge-gui/res/cardsfolder/upcoming/orzhov_enforcer.txt b/forge-gui/res/cardsfolder/o/orzhov_enforcer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/orzhov_enforcer.txt rename to forge-gui/res/cardsfolder/o/orzhov_enforcer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/orzhov_locket.txt b/forge-gui/res/cardsfolder/o/orzhov_locket.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/orzhov_locket.txt rename to forge-gui/res/cardsfolder/o/orzhov_locket.txt diff --git a/forge-gui/res/cardsfolder/upcoming/orzhov_racketeers.txt b/forge-gui/res/cardsfolder/o/orzhov_racketeers.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/orzhov_racketeers.txt rename to forge-gui/res/cardsfolder/o/orzhov_racketeers.txt diff --git a/forge-gui/res/cardsfolder/upcoming/persistent_petitioners.txt b/forge-gui/res/cardsfolder/p/persistent_petitioners.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/persistent_petitioners.txt rename to forge-gui/res/cardsfolder/p/persistent_petitioners.txt diff --git a/forge-gui/res/cardsfolder/upcoming/pestilent_spirit.txt b/forge-gui/res/cardsfolder/p/pestilent_spirit.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/pestilent_spirit.txt rename to forge-gui/res/cardsfolder/p/pestilent_spirit.txt diff --git a/forge-gui/res/cardsfolder/upcoming/pitiless_pontiff.txt b/forge-gui/res/cardsfolder/p/pitiless_pontiff.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/pitiless_pontiff.txt rename to forge-gui/res/cardsfolder/p/pitiless_pontiff.txt diff --git a/forge-gui/res/cardsfolder/upcoming/plague_wight.txt b/forge-gui/res/cardsfolder/p/plague_wight.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/plague_wight.txt rename to forge-gui/res/cardsfolder/p/plague_wight.txt diff --git a/forge-gui/res/cardsfolder/upcoming/plaza_of_harmony.txt b/forge-gui/res/cardsfolder/p/plaza_of_harmony.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/plaza_of_harmony.txt rename to forge-gui/res/cardsfolder/p/plaza_of_harmony.txt diff --git a/forge-gui/res/cardsfolder/upcoming/precognitive_perception.txt b/forge-gui/res/cardsfolder/p/precognitive_perception.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/precognitive_perception.txt rename to forge-gui/res/cardsfolder/p/precognitive_perception.txt diff --git a/forge-gui/res/cardsfolder/upcoming/priest_of_forgotten_gods.txt b/forge-gui/res/cardsfolder/p/priest_of_forgotten_gods.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/priest_of_forgotten_gods.txt rename to forge-gui/res/cardsfolder/p/priest_of_forgotten_gods.txt diff --git a/forge-gui/res/cardsfolder/upcoming/prime_speaker_vannifar.txt b/forge-gui/res/cardsfolder/p/prime_speaker_vannifar.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/prime_speaker_vannifar.txt rename to forge-gui/res/cardsfolder/p/prime_speaker_vannifar.txt diff --git a/forge-gui/res/cardsfolder/upcoming/prowling_caracal.txt b/forge-gui/res/cardsfolder/p/prowling_caracal.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/prowling_caracal.txt rename to forge-gui/res/cardsfolder/p/prowling_caracal.txt diff --git a/forge-gui/res/cardsfolder/upcoming/prying_eyes.txt b/forge-gui/res/cardsfolder/p/prying_eyes.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/prying_eyes.txt rename to forge-gui/res/cardsfolder/p/prying_eyes.txt diff --git a/forge-gui/res/cardsfolder/upcoming/pteramander.txt b/forge-gui/res/cardsfolder/p/pteramander.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/pteramander.txt rename to forge-gui/res/cardsfolder/p/pteramander.txt diff --git a/forge-gui/res/cardsfolder/upcoming/quench.txt b/forge-gui/res/cardsfolder/q/quench.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/quench.txt rename to forge-gui/res/cardsfolder/q/quench.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rafter_demon.txt b/forge-gui/res/cardsfolder/r/rafter_demon.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rafter_demon.txt rename to forge-gui/res/cardsfolder/r/rafter_demon.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ragefire.txt b/forge-gui/res/cardsfolder/r/ragefire.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ragefire.txt rename to forge-gui/res/cardsfolder/r/ragefire.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rakdos_firewheeler.txt b/forge-gui/res/cardsfolder/r/rakdos_firewheeler.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rakdos_firewheeler.txt rename to forge-gui/res/cardsfolder/r/rakdos_firewheeler.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rakdos_locket.txt b/forge-gui/res/cardsfolder/r/rakdos_locket.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rakdos_locket.txt rename to forge-gui/res/cardsfolder/r/rakdos_locket.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rakdos_roustabout.txt b/forge-gui/res/cardsfolder/r/rakdos_roustabout.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rakdos_roustabout.txt rename to forge-gui/res/cardsfolder/r/rakdos_roustabout.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rakdos_the_showstopper.txt b/forge-gui/res/cardsfolder/r/rakdos_the_showstopper.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rakdos_the_showstopper.txt rename to forge-gui/res/cardsfolder/r/rakdos_the_showstopper.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rakdos_trumpeter.txt b/forge-gui/res/cardsfolder/r/rakdos_trumpeter.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rakdos_trumpeter.txt rename to forge-gui/res/cardsfolder/r/rakdos_trumpeter.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rally_to_battle.txt b/forge-gui/res/cardsfolder/r/rally_to_battle.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rally_to_battle.txt rename to forge-gui/res/cardsfolder/r/rally_to_battle.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rampage_of_the_clans.txt b/forge-gui/res/cardsfolder/r/rampage_of_the_clans.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rampage_of_the_clans.txt rename to forge-gui/res/cardsfolder/r/rampage_of_the_clans.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rampaging_rendhorn.txt b/forge-gui/res/cardsfolder/r/rampaging_rendhorn.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rampaging_rendhorn.txt rename to forge-gui/res/cardsfolder/r/rampaging_rendhorn.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ravager_wurm.txt b/forge-gui/res/cardsfolder/r/ravager_wurm.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ravager_wurm.txt rename to forge-gui/res/cardsfolder/r/ravager_wurm.txt diff --git a/forge-gui/res/cardsfolder/upcoming/regenesis.txt b/forge-gui/res/cardsfolder/r/regenesis.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/regenesis.txt rename to forge-gui/res/cardsfolder/r/regenesis.txt diff --git a/forge-gui/res/cardsfolder/upcoming/repudiate_replicate.txt b/forge-gui/res/cardsfolder/r/repudiate_replicate.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/repudiate_replicate.txt rename to forge-gui/res/cardsfolder/r/repudiate_replicate.txt diff --git a/forge-gui/res/cardsfolder/upcoming/resolute_watchdog.txt b/forge-gui/res/cardsfolder/r/resolute_watchdog.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/resolute_watchdog.txt rename to forge-gui/res/cardsfolder/r/resolute_watchdog.txt diff --git a/forge-gui/res/cardsfolder/upcoming/revival_revenge.txt b/forge-gui/res/cardsfolder/r/revival_revenge.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/revival_revenge.txt rename to forge-gui/res/cardsfolder/r/revival_revenge.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rhythm_of_the_wild.txt b/forge-gui/res/cardsfolder/r/rhythm_of_the_wild.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rhythm_of_the_wild.txt rename to forge-gui/res/cardsfolder/r/rhythm_of_the_wild.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rix_maadi_reveler.txt b/forge-gui/res/cardsfolder/r/rix_maadi_reveler.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rix_maadi_reveler.txt rename to forge-gui/res/cardsfolder/r/rix_maadi_reveler.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rubble_reading.txt b/forge-gui/res/cardsfolder/r/rubble_reading.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rubble_reading.txt rename to forge-gui/res/cardsfolder/r/rubble_reading.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rubble_slinger.txt b/forge-gui/res/cardsfolder/r/rubble_slinger.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rubble_slinger.txt rename to forge-gui/res/cardsfolder/r/rubble_slinger.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rubblebelt_recluse.txt b/forge-gui/res/cardsfolder/r/rubblebelt_recluse.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rubblebelt_recluse.txt rename to forge-gui/res/cardsfolder/r/rubblebelt_recluse.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rubblebelt_runner.txt b/forge-gui/res/cardsfolder/r/rubblebelt_runner.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rubblebelt_runner.txt rename to forge-gui/res/cardsfolder/r/rubblebelt_runner.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rumbling_ruin.txt b/forge-gui/res/cardsfolder/r/rumbling_ruin.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rumbling_ruin.txt rename to forge-gui/res/cardsfolder/r/rumbling_ruin.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sages_row_savant.txt b/forge-gui/res/cardsfolder/s/sages_row_savant.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sages_row_savant.txt rename to forge-gui/res/cardsfolder/s/sages_row_savant.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sagittars_volley.txt b/forge-gui/res/cardsfolder/s/sagittars_volley.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sagittars_volley.txt rename to forge-gui/res/cardsfolder/s/sagittars_volley.txt diff --git a/forge-gui/res/cardsfolder/upcoming/saruli_caretaker.txt b/forge-gui/res/cardsfolder/s/saruli_caretaker.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/saruli_caretaker.txt rename to forge-gui/res/cardsfolder/s/saruli_caretaker.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sauroform_hybrid.txt b/forge-gui/res/cardsfolder/s/sauroform_hybrid.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sauroform_hybrid.txt rename to forge-gui/res/cardsfolder/s/sauroform_hybrid.txt diff --git a/forge-gui/res/cardsfolder/upcoming/savage_smash.txt b/forge-gui/res/cardsfolder/s/savage_smash.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/savage_smash.txt rename to forge-gui/res/cardsfolder/s/savage_smash.txt diff --git a/forge-gui/res/cardsfolder/upcoming/scorchmark.txt b/forge-gui/res/cardsfolder/s/scorchmark.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/scorchmark.txt rename to forge-gui/res/cardsfolder/s/scorchmark.txt diff --git a/forge-gui/res/cardsfolder/upcoming/screaming_shield.txt b/forge-gui/res/cardsfolder/s/screaming_shield.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/screaming_shield.txt rename to forge-gui/res/cardsfolder/s/screaming_shield.txt diff --git a/forge-gui/res/cardsfolder/upcoming/scuttlegator.txt b/forge-gui/res/cardsfolder/s/scuttlegator.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/scuttlegator.txt rename to forge-gui/res/cardsfolder/s/scuttlegator.txt diff --git a/forge-gui/res/cardsfolder/upcoming/senate_courier.txt b/forge-gui/res/cardsfolder/s/senate_courier.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/senate_courier.txt rename to forge-gui/res/cardsfolder/s/senate_courier.txt diff --git a/forge-gui/res/cardsfolder/upcoming/senate_griffin.txt b/forge-gui/res/cardsfolder/s/senate_griffin.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/senate_griffin.txt rename to forge-gui/res/cardsfolder/s/senate_griffin.txt diff --git a/forge-gui/res/cardsfolder/upcoming/senate_guildmage.txt b/forge-gui/res/cardsfolder/s/senate_guildmage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/senate_guildmage.txt rename to forge-gui/res/cardsfolder/s/senate_guildmage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sentinels_mark.txt b/forge-gui/res/cardsfolder/s/sentinels_mark.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sentinels_mark.txt rename to forge-gui/res/cardsfolder/s/sentinels_mark.txt diff --git a/forge-gui/res/cardsfolder/upcoming/seraph_of_the_scales.txt b/forge-gui/res/cardsfolder/s/seraph_of_the_scales.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/seraph_of_the_scales.txt rename to forge-gui/res/cardsfolder/s/seraph_of_the_scales.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sharktocrab.txt b/forge-gui/res/cardsfolder/s/sharktocrab.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sharktocrab.txt rename to forge-gui/res/cardsfolder/s/sharktocrab.txt diff --git a/forge-gui/res/cardsfolder/upcoming/shimmer_of_possibility.txt b/forge-gui/res/cardsfolder/s/shimmer_of_possibility.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/shimmer_of_possibility.txt rename to forge-gui/res/cardsfolder/s/shimmer_of_possibility.txt diff --git a/forge-gui/res/cardsfolder/upcoming/silhana_wayfinder.txt b/forge-gui/res/cardsfolder/s/silhana_wayfinder.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/silhana_wayfinder.txt rename to forge-gui/res/cardsfolder/s/silhana_wayfinder.txt diff --git a/forge-gui/res/cardsfolder/upcoming/simic_ascendancy.txt b/forge-gui/res/cardsfolder/s/simic_ascendancy.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/simic_ascendancy.txt rename to forge-gui/res/cardsfolder/s/simic_ascendancy.txt diff --git a/forge-gui/res/cardsfolder/upcoming/simic_locket.txt b/forge-gui/res/cardsfolder/s/simic_locket.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/simic_locket.txt rename to forge-gui/res/cardsfolder/s/simic_locket.txt diff --git a/forge-gui/res/cardsfolder/upcoming/skarrgan_hellkite.txt b/forge-gui/res/cardsfolder/s/skarrgan_hellkite.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/skarrgan_hellkite.txt rename to forge-gui/res/cardsfolder/s/skarrgan_hellkite.txt diff --git a/forge-gui/res/cardsfolder/upcoming/skatewing_spy.txt b/forge-gui/res/cardsfolder/s/skatewing_spy.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/skatewing_spy.txt rename to forge-gui/res/cardsfolder/s/skatewing_spy.txt diff --git a/forge-gui/res/cardsfolder/upcoming/skewer_the_critics.txt b/forge-gui/res/cardsfolder/s/skewer_the_critics.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/skewer_the_critics.txt rename to forge-gui/res/cardsfolder/s/skewer_the_critics.txt diff --git a/forge-gui/res/cardsfolder/upcoming/skitter_eel.txt b/forge-gui/res/cardsfolder/s/skitter_eel.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/skitter_eel.txt rename to forge-gui/res/cardsfolder/s/skitter_eel.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sky_tether.txt b/forge-gui/res/cardsfolder/s/sky_tether.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sky_tether.txt rename to forge-gui/res/cardsfolder/s/sky_tether.txt diff --git a/forge-gui/res/cardsfolder/upcoming/slimebind.txt b/forge-gui/res/cardsfolder/s/slimebind.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/slimebind.txt rename to forge-gui/res/cardsfolder/s/slimebind.txt diff --git a/forge-gui/res/cardsfolder/upcoming/smelt_ward_ignus.txt b/forge-gui/res/cardsfolder/s/smelt_ward_ignus.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/smelt_ward_ignus.txt rename to forge-gui/res/cardsfolder/s/smelt_ward_ignus.txt diff --git a/forge-gui/res/cardsfolder/upcoming/smothering_tithe.txt b/forge-gui/res/cardsfolder/s/smothering_tithe.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/smothering_tithe.txt rename to forge-gui/res/cardsfolder/s/smothering_tithe.txt diff --git a/forge-gui/res/cardsfolder/upcoming/spawn_of_mayhem.txt b/forge-gui/res/cardsfolder/s/spawn_of_mayhem.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/spawn_of_mayhem.txt rename to forge-gui/res/cardsfolder/s/spawn_of_mayhem.txt diff --git a/forge-gui/res/cardsfolder/upcoming/spear_spewer.txt b/forge-gui/res/cardsfolder/s/spear_spewer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/spear_spewer.txt rename to forge-gui/res/cardsfolder/s/spear_spewer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sphinx_of_foresight.txt b/forge-gui/res/cardsfolder/s/sphinx_of_foresight.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sphinx_of_foresight.txt rename to forge-gui/res/cardsfolder/s/sphinx_of_foresight.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sphinx_of_new_prahv.txt b/forge-gui/res/cardsfolder/s/sphinx_of_new_prahv.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sphinx_of_new_prahv.txt rename to forge-gui/res/cardsfolder/s/sphinx_of_new_prahv.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sphinx_of_the_guildpact.txt b/forge-gui/res/cardsfolder/s/sphinx_of_the_guildpact.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sphinx_of_the_guildpact.txt rename to forge-gui/res/cardsfolder/s/sphinx_of_the_guildpact.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sphinxs_insight.txt b/forge-gui/res/cardsfolder/s/sphinxs_insight.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sphinxs_insight.txt rename to forge-gui/res/cardsfolder/s/sphinxs_insight.txt diff --git a/forge-gui/res/cardsfolder/upcoming/spikewheel_acrobat.txt b/forge-gui/res/cardsfolder/s/spikewheel_acrobat.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/spikewheel_acrobat.txt rename to forge-gui/res/cardsfolder/s/spikewheel_acrobat.txt diff --git a/forge-gui/res/cardsfolder/upcoming/spire_mangler.txt b/forge-gui/res/cardsfolder/s/spire_mangler.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/spire_mangler.txt rename to forge-gui/res/cardsfolder/s/spire_mangler.txt diff --git a/forge-gui/res/cardsfolder/upcoming/spirit_of_the_spires.txt b/forge-gui/res/cardsfolder/s/spirit_of_the_spires.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/spirit_of_the_spires.txt rename to forge-gui/res/cardsfolder/s/spirit_of_the_spires.txt diff --git a/forge-gui/res/cardsfolder/upcoming/steeple_creeper.txt b/forge-gui/res/cardsfolder/s/steeple_creeper.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/steeple_creeper.txt rename to forge-gui/res/cardsfolder/s/steeple_creeper.txt diff --git a/forge-gui/res/cardsfolder/upcoming/stony_strength.txt b/forge-gui/res/cardsfolder/s/stony_strength.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/stony_strength.txt rename to forge-gui/res/cardsfolder/s/stony_strength.txt diff --git a/forge-gui/res/cardsfolder/upcoming/storm_strike.txt b/forge-gui/res/cardsfolder/s/storm_strike.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/storm_strike.txt rename to forge-gui/res/cardsfolder/s/storm_strike.txt diff --git a/forge-gui/res/cardsfolder/upcoming/summary_judgment.txt b/forge-gui/res/cardsfolder/s/summary_judgment.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/summary_judgment.txt rename to forge-gui/res/cardsfolder/s/summary_judgment.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sunder_shaman.txt b/forge-gui/res/cardsfolder/s/sunder_shaman.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sunder_shaman.txt rename to forge-gui/res/cardsfolder/s/sunder_shaman.txt diff --git a/forge-gui/res/cardsfolder/upcoming/swirling_torrent.txt b/forge-gui/res/cardsfolder/s/swirling_torrent.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/swirling_torrent.txt rename to forge-gui/res/cardsfolder/s/swirling_torrent.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sylvan_brushstrider.txt b/forge-gui/res/cardsfolder/s/sylvan_brushstrider.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sylvan_brushstrider.txt rename to forge-gui/res/cardsfolder/s/sylvan_brushstrider.txt diff --git a/forge-gui/res/cardsfolder/upcoming/syndicate_guildmage.txt b/forge-gui/res/cardsfolder/s/syndicate_guildmage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/syndicate_guildmage.txt rename to forge-gui/res/cardsfolder/s/syndicate_guildmage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/syndicate_messenger.txt b/forge-gui/res/cardsfolder/s/syndicate_messenger.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/syndicate_messenger.txt rename to forge-gui/res/cardsfolder/s/syndicate_messenger.txt diff --git a/forge-gui/res/cardsfolder/upcoming/tenth_district_veteran.txt b/forge-gui/res/cardsfolder/t/tenth_district_veteran.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/tenth_district_veteran.txt rename to forge-gui/res/cardsfolder/t/tenth_district_veteran.txt diff --git a/forge-gui/res/cardsfolder/upcoming/territorial_boar.txt b/forge-gui/res/cardsfolder/t/territorial_boar.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/territorial_boar.txt rename to forge-gui/res/cardsfolder/t/territorial_boar.txt diff --git a/forge-gui/res/cardsfolder/upcoming/teysa_karlov.txt b/forge-gui/res/cardsfolder/t/teysa_karlov.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/teysa_karlov.txt rename to forge-gui/res/cardsfolder/t/teysa_karlov.txt diff --git a/forge-gui/res/cardsfolder/upcoming/the_haunt_of_hightower.txt b/forge-gui/res/cardsfolder/t/the_haunt_of_hightower.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/the_haunt_of_hightower.txt rename to forge-gui/res/cardsfolder/t/the_haunt_of_hightower.txt diff --git a/forge-gui/res/cardsfolder/upcoming/theater_of_horrors.txt b/forge-gui/res/cardsfolder/t/theater_of_horrors.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/theater_of_horrors.txt rename to forge-gui/res/cardsfolder/t/theater_of_horrors.txt diff --git a/forge-gui/res/cardsfolder/upcoming/thirsting_shade.txt b/forge-gui/res/cardsfolder/t/thirsting_shade.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/thirsting_shade.txt rename to forge-gui/res/cardsfolder/t/thirsting_shade.txt diff --git a/forge-gui/res/cardsfolder/upcoming/thought_collapse.txt b/forge-gui/res/cardsfolder/t/thought_collapse.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/thought_collapse.txt rename to forge-gui/res/cardsfolder/t/thought_collapse.txt diff --git a/forge-gui/res/cardsfolder/upcoming/thrash_threat.txt b/forge-gui/res/cardsfolder/t/thrash_threat.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/thrash_threat.txt rename to forge-gui/res/cardsfolder/t/thrash_threat.txt diff --git a/forge-gui/res/cardsfolder/upcoming/tin_street_dodger.txt b/forge-gui/res/cardsfolder/t/tin_street_dodger.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/tin_street_dodger.txt rename to forge-gui/res/cardsfolder/t/tin_street_dodger.txt diff --git a/forge-gui/res/cardsfolder/upcoming/titanic_brawl.txt b/forge-gui/res/cardsfolder/t/titanic_brawl.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/titanic_brawl.txt rename to forge-gui/res/cardsfolder/t/titanic_brawl.txt diff --git a/forge-gui/res/cardsfolder/upcoming/tithe_taker.txt b/forge-gui/res/cardsfolder/t/tithe_taker.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/tithe_taker.txt rename to forge-gui/res/cardsfolder/t/tithe_taker.txt diff --git a/forge-gui/res/cardsfolder/upcoming/tome_of_the_guildpact.txt b/forge-gui/res/cardsfolder/t/tome_of_the_guildpact.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/tome_of_the_guildpact.txt rename to forge-gui/res/cardsfolder/t/tome_of_the_guildpact.txt diff --git a/forge-gui/res/cardsfolder/upcoming/trollbred_guardian.txt b/forge-gui/res/cardsfolder/t/trollbred_guardian.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/trollbred_guardian.txt rename to forge-gui/res/cardsfolder/t/trollbred_guardian.txt diff --git a/forge-gui/res/cardsfolder/upcoming/twilight_panther.txt b/forge-gui/res/cardsfolder/t/twilight_panther.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/twilight_panther.txt rename to forge-gui/res/cardsfolder/t/twilight_panther.txt diff --git a/forge-gui/res/cardsfolder/upcoming/unbreakable_formation.txt b/forge-gui/res/cardsfolder/u/unbreakable_formation.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/unbreakable_formation.txt rename to forge-gui/res/cardsfolder/u/unbreakable_formation.txt diff --git a/forge-gui/res/cardsfolder/upcoming/undercity_scavenger.txt b/forge-gui/res/cardsfolder/u/undercity_scavenger.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/undercity_scavenger.txt rename to forge-gui/res/cardsfolder/u/undercity_scavenger.txt diff --git a/forge-gui/res/cardsfolder/upcoming/undercitys_embrace.txt b/forge-gui/res/cardsfolder/u/undercitys_embrace.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/undercitys_embrace.txt rename to forge-gui/res/cardsfolder/u/undercitys_embrace.txt diff --git a/forge-gui/res/cardsfolder/upcoming/verity_circle.txt b/forge-gui/res/cardsfolder/v/verity_circle.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/verity_circle.txt rename to forge-gui/res/cardsfolder/v/verity_circle.txt diff --git a/forge-gui/res/cardsfolder/upcoming/vindictive_vampire.txt b/forge-gui/res/cardsfolder/v/vindictive_vampire.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/vindictive_vampire.txt rename to forge-gui/res/cardsfolder/v/vindictive_vampire.txt diff --git a/forge-gui/res/cardsfolder/upcoming/vizkopa_vampire.txt b/forge-gui/res/cardsfolder/v/vizkopa_vampire.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/vizkopa_vampire.txt rename to forge-gui/res/cardsfolder/v/vizkopa_vampire.txt diff --git a/forge-gui/res/cardsfolder/upcoming/wall_of_lost_thoughts.txt b/forge-gui/res/cardsfolder/w/wall_of_lost_thoughts.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/wall_of_lost_thoughts.txt rename to forge-gui/res/cardsfolder/w/wall_of_lost_thoughts.txt diff --git a/forge-gui/res/cardsfolder/upcoming/warrant_warden.txt b/forge-gui/res/cardsfolder/w/warrant_warden.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/warrant_warden.txt rename to forge-gui/res/cardsfolder/w/warrant_warden.txt diff --git a/forge-gui/res/cardsfolder/upcoming/watchful_giant.txt b/forge-gui/res/cardsfolder/w/watchful_giant.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/watchful_giant.txt rename to forge-gui/res/cardsfolder/w/watchful_giant.txt diff --git a/forge-gui/res/cardsfolder/upcoming/wilderness_reclamation.txt b/forge-gui/res/cardsfolder/w/wilderness_reclamation.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/wilderness_reclamation.txt rename to forge-gui/res/cardsfolder/w/wilderness_reclamation.txt diff --git a/forge-gui/res/cardsfolder/upcoming/windstorm_drake.txt b/forge-gui/res/cardsfolder/w/windstorm_drake.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/windstorm_drake.txt rename to forge-gui/res/cardsfolder/w/windstorm_drake.txt diff --git a/forge-gui/res/cardsfolder/upcoming/wrecking_beast.txt b/forge-gui/res/cardsfolder/w/wrecking_beast.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/wrecking_beast.txt rename to forge-gui/res/cardsfolder/w/wrecking_beast.txt diff --git a/forge-gui/res/cardsfolder/upcoming/zegana_utopian_speaker.txt b/forge-gui/res/cardsfolder/z/zegana_utopian_speaker.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/zegana_utopian_speaker.txt rename to forge-gui/res/cardsfolder/z/zegana_utopian_speaker.txt diff --git a/forge-gui/res/cardsfolder/upcoming/zhur_taa_goblin.txt b/forge-gui/res/cardsfolder/z/zhur_taa_goblin.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/zhur_taa_goblin.txt rename to forge-gui/res/cardsfolder/z/zhur_taa_goblin.txt From b0ee2cedffbd0f255190af1360fc33c2e55bfe76 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 29 Jan 2019 08:11:50 +0300 Subject: [PATCH 727/901] - Added RNA planeswalker decks to quest mode precons. --- .../res/quest/precons/Domri, City Smasher.dck | 33 +++++++++++++++++++ .../quest/precons/Dovin, Architect of Law.dck | 33 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 forge-gui/res/quest/precons/Domri, City Smasher.dck create mode 100644 forge-gui/res/quest/precons/Dovin, Architect of Law.dck diff --git a/forge-gui/res/quest/precons/Domri, City Smasher.dck b/forge-gui/res/quest/precons/Domri, City Smasher.dck new file mode 100644 index 00000000000..50b92147758 --- /dev/null +++ b/forge-gui/res/quest/precons/Domri, City Smasher.dck @@ -0,0 +1,33 @@ +[shop] +WinsToUnlock=0 +Credits=1200 +MinDifficulty=0 +MaxDifficulty=5 +[metadata] +Name=Domri, City Smasher +Description=Domri, City Smasher - GR Ravnica Allegiance Planeswalker Deck +Deck Type=constructed +Set=RNA +Image=domri_city_smasher.jpg +[Main] +1 Axebane Beast|RNA +1 Bolrac-Clan Crusher|RNA +2 Burn Bright|RNA +3 Charging War Boar|RNA +2 Clamor Shaman|RNA +2 Domri's Nodorog|RNA +1 Domri, City Smasher+|RNA +1 End-Raze Forerunners|RNA +2 Feral Maaka|RNA +11 Forest|RNA +3 Frenzied Arynx|RNA +1 Glass of the Guildpact|RNA +2 Gravel-Hide Goblin|RNA +4 Gruul Guildgate|RNA +11 Mountain|RNA +4 Ragefire|RNA +1 Rampaging Rendhorn|RNA +2 Stony Strength|RNA +2 Sylvan Brushstrider|RNA +1 Wrecking Beast|RNA +3 Zhur-Taa Goblin|RNA diff --git a/forge-gui/res/quest/precons/Dovin, Architect of Law.dck b/forge-gui/res/quest/precons/Dovin, Architect of Law.dck new file mode 100644 index 00000000000..b2becb27ab1 --- /dev/null +++ b/forge-gui/res/quest/precons/Dovin, Architect of Law.dck @@ -0,0 +1,33 @@ +[shop] +WinsToUnlock=0 +Credits=1200 +MinDifficulty=0 +MaxDifficulty=5 +[metadata] +Name=Dovin, Architect of Law +Description=Dovin, Architect of Law - WU Ravnica Allegiance Planeswalker Deck +Deck Type=constructed +Set=RNA +Image=dovin_architect_of_law.jpg +[Main] +3 Arrester's Zeal|RNA +4 Azorius Guildgate|RNA +1 Azorius Knight-Arbiter|RNA +1 Chillbringer|RNA +2 Code of Constraint|RNA +3 Concordia Pegasus|RNA +3 Dovin's Automaton|RNA +2 Dovin's Dismissal|RNA +1 Dovin, Architect of Law+|RNA +4 Elite Arrester|RNA +10 Island|RNA +12 Plains|RNA +2 Prowling Caracal|RNA +2 Senate Courier|RNA +1 Sphinx's Insight|RNA +2 Spirit of the Spires|RNA +2 Summary Judgment|RNA +1 Tenth District Veteran|RNA +1 Unbreakable Formation|RNA +1 Verity Circle|RNA +2 Windstorm Drake|RNA From 1ecd1a8340356408813e64cf1d8391d74e7a7d89 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Tue, 29 Jan 2019 05:31:58 +0000 Subject: [PATCH 728/901] Fix lifelink trigger on Sentinel's Mark --- forge-gui/res/cardsfolder/s/sentinels_mark.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/s/sentinels_mark.txt b/forge-gui/res/cardsfolder/s/sentinels_mark.txt index 5a6c80a41b2..db9d0ffe5e8 100644 --- a/forge-gui/res/cardsfolder/s/sentinels_mark.txt +++ b/forge-gui/res/cardsfolder/s/sentinels_mark.txt @@ -5,6 +5,7 @@ K:Flash K:Enchant creature A:SP$ Attach | Cost$ 1 W | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 2 | AddKeyword$ Vigilance | Description$ Enchanted creature gets +1/+2 and has vigilance. -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigPump | Condition$ Main1,Main2 | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it during your main phase, enchanted creature gains lifelink until end of turn. +T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigPump | PlayerTurn$ True | CheckSVar$ X | SVarCompare$ GE1 | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it during your main phase, enchanted creature gains lifelink until end of turn. SVar:TrigPump:DB$ Pump | Defined$ Enchanted | KW$ Lifelink +SVar:X:Count$IfMainPhase.1.0 Oracle:Flash\nEnchant creature\nEnchanted creature gets +1/+2 and has vigilance.\nAddendum — When Sentinel's Mark enters the battlefield, if you cast it during your main phase, enchanted creature gains lifelink until end of turn. From b58b2b93e2a9994f10f7d6b0df22b7b979978a36 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Tue, 29 Jan 2019 07:37:06 +0000 Subject: [PATCH 729/901] Fix Deputy of Detention (now exiles other cards of the same name, and also now returns those cards to the BF when it leaves the BF) --- forge-gui/res/cardsfolder/d/deputy_of_detention.txt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/d/deputy_of_detention.txt b/forge-gui/res/cardsfolder/d/deputy_of_detention.txt index ef606eccea7..625946adca5 100644 --- a/forge-gui/res/cardsfolder/d/deputy_of_detention.txt +++ b/forge-gui/res/cardsfolder/d/deputy_of_detention.txt @@ -3,7 +3,11 @@ ManaCost:1 W U Types:Creature Vedalken Wizard PT:1/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target nonland permanent an opponent controls and all other nonland permanents that player controls with the same name as that permanent until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | RememberTargets$ True | SubAbility$ DBExile -SVar:DBChangeZoneAll:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Card.IsRemembered | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | RememberTargets$ True | SubAbility$ DBChangeZoneAll +SVar:DBChangeZoneAll:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Remembered.sameName | RememberChanged$ True | SubAbility$ DBEffect +SVar:DBEffect:DB$ Effect | Triggers$ ComeBack | RememberObjects$ Remembered | ImprintCards$ Self | SVars$ TrigReturn,ExileSelf | ConditionPresent$ Card.Self | Duration$ Permanent | ForgetOnMoved$ Exile | SubAbility$ DBCleanup +SVar:ComeBack:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.IsImprinted | Execute$ TrigReturn | TriggerZones$ Command | TriggerController$ TriggeredCardController | Static$ True | TriggerDescription$ Those permanents are exiled until EFFECTSOURCE leaves the battlefield +SVar:TrigReturn:DB$ ChangeZoneAll | Origin$ Exile | Destination$ Battlefield | ChangeType$ Card.IsRemembered | SubAbility$ ExileSelf +SVar:ExileSelf:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self +SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True Oracle:When Deputy of Detention enters the battlefield, exile target nonland permanent an opponent controls and all other nonland permanents that player controls with the same name as that permanent until Deputy of Detention leaves the battlefield. From 2e0812dd6a814ec8d302c326a55f7dd00b272821 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 29 Jan 2019 17:31:50 +0300 Subject: [PATCH 730/901] - Added RNA achievements (by Marek14). --- forge-gui/res/lists/altwin-achievements.txt | 1 + forge-gui/res/lists/planeswalker-achievements.txt | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/forge-gui/res/lists/altwin-achievements.txt b/forge-gui/res/lists/altwin-achievements.txt index 901042fb4f6..0ae91d729ca 100644 --- a/forge-gui/res/lists/altwin-achievements.txt +++ b/forge-gui/res/lists/altwin-achievements.txt @@ -24,6 +24,7 @@ Mortal Combat|The Boneyard|So peaceful... Near-Death Experience|The Edge|Phew... I thought I was going to die! Phage the Untouchable|The Untouchable|None are immune to her deadly touch! Revel in Riches|The Dead Man's Chest|Yo-ho-ho, and a bottle of rum! +Simic Ascendancy|The Ascension|As you can see, we are going through a period of unprecedented growth. Test of Endurance|The Test|So... did I pass? Triskaidekaphobia|The Fear of 13|It's just a silly ancient superstition... right? Vraska, Golgari Queen|The Flurry of Assassins|How good is your dodging? diff --git a/forge-gui/res/lists/planeswalker-achievements.txt b/forge-gui/res/lists/planeswalker-achievements.txt index dfe01f8c832..d991ae4bcbd 100644 --- a/forge-gui/res/lists/planeswalker-achievements.txt +++ b/forge-gui/res/lists/planeswalker-achievements.txt @@ -25,7 +25,11 @@ Dack Fayden|Dack's Discount|Do you have any evidence it was me? Daretti, Ingenious Iconoclast|Daretti's Mass Production|Imitation is the sincerest form of irritation. Daretti, Scrap Savant|Daretti's Recycler|Save the environment! Domri Rade|Domri's Surprise|That's GOTTA get me a date! +Domri, Chaos Bringer|Domri's Wild Army|Let's have a team-destroying exercise! +Domri, City Smasher|Domri's Overrun|You may feel a slight sensation of burning rage. Dovin Baan|Dovin's Static|Have you tried to turn it off and on again? +Dovin, Architect of Law|Dovin's Freeze|With one gear out of place, the whole machine grinds to halt. +Dovin, Grand Arbiter|Dovin's Modern Recall|The best solutions for the worst problems. Elspeth Tirel|Elspeth's Solitude|Tokens are my only friends... Elspeth, Knight-Errant|Elspeth's Endurance|Bant will prevail! Elspeth, Sun's Champion|Elspeth's Crusade|With Heliod on my side, I'm invincible! @@ -57,6 +61,7 @@ Jace, Unraveler of Secrets|Jace's Perfect Plan|So, I've read about this neat guy Jaya Ballard|Jaya's Flashback|Fire is easily rekindled. Karn Liberated|Karn's Reset|Let's do this again! Kaya, Ghost Assassin|Kaya's Syphon|You don't MIND, do you? +Kaya, Orzhov Usurper|Kaya's Revenge of Emptiness|Nothing I do can hurt you. Literally. Kiora, Master of the Depths|Kiora's Fight Club|First rule is not to talk about the sucker punches Kiora, the Crashing Wave|Kiora's Kraken|Say hello to Cthulhu for me! Koth of the Hammer|Koth's Eruption|You won't like the mountains when they are angry! From b04e16d1caf27d967b16cf75f55e45b82a345a61 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Tue, 29 Jan 2019 17:50:02 +0000 Subject: [PATCH 731/901] Update mirror_march.txt --- forge-gui/res/cardsfolder/m/mirror_march.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/m/mirror_march.txt b/forge-gui/res/cardsfolder/m/mirror_march.txt index 2dec7304ab9..8d7c8d7c398 100644 --- a/forge-gui/res/cardsfolder/m/mirror_march.txt +++ b/forge-gui/res/cardsfolder/m/mirror_march.txt @@ -2,7 +2,7 @@ Name:Mirror March ManaCost:5 R Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonToken+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigFlipACoin | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, flip a coin until you lose a flip. For each flip you won, create a token that's a copy of that creature. Those tokens gain haste. Exile them at the beginning of the next end step. -SVar:TrigFlipACoin:DB$FlipACoin | FlipUntilYouLose$ True | SaveNumFlipsToSVar$ MirrorAmount | NoCall$ True | LoseSubAbility$ DBCopies +SVar:TrigFlipACoin:DB$FlipACoin | FlipUntilYouLose$ True | SaveNumFlipsToSVar$ MirrorAmount | LoseSubAbility$ DBCopies SVar:DBCopies:DB$ CopyPermanent | PumpKeywords$ Haste | AtEOT$ Exile | Defined$ TriggeredCard | NumCopies$ MirrorAmount SVar:MirrorAmount:Number$0 DeckHas:Ability$Token From 015623a1228f14741af1ceb154e6a3102ab2c652 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Tue, 29 Jan 2019 19:57:56 +0000 Subject: [PATCH 732/901] Fix Dovin, Grand Arbiter's +1 ability --- forge-gui/res/cardsfolder/d/dovin_grand_arbiter.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/cardsfolder/d/dovin_grand_arbiter.txt b/forge-gui/res/cardsfolder/d/dovin_grand_arbiter.txt index a27a07d3d7b..494a7f60892 100644 --- a/forge-gui/res/cardsfolder/d/dovin_grand_arbiter.txt +++ b/forge-gui/res/cardsfolder/d/dovin_grand_arbiter.txt @@ -2,11 +2,11 @@ Name:Dovin, Grand Arbiter ManaCost:1 W U Types:Legendary Planeswalker Dovin Loyalty:3 -A:AB$ Effect | Cost$ AddCounter<1/LOYALTY> | Name$ CARDNAME Effect | Triggers$ TrigSpellCast | SVars$ TrigPutCounter | SpellDescription$ Until end of turn, whenever a creature you control deals combat damage to a player, put a loyalty counter on CARDNAME. -SVar:X:Count$Valid Creature.YouCtrl -SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ LOYALTY | CounterNum$ 1 +A:AB$ Effect | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | Name$ Dovin, Grand Arbiter Effect | Triggers$ TrigDamage | SVars$ TrigPutCounter | RememberObjects$ Self | SpellDescription$ Until end of turn, whenever a creature you control deals combat damage to a player, put a loyalty counter on CARDNAME. +SVar:TrigDamage:Mode$ DamageDone | ValidSource$ Creature.YouCtrl | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigPutCounter | TriggerDescription$ Until end of turn, whenever a creature you control deals combat damage to a player, put a loyalty counter on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Remembered | CounterType$ LOYALTY | CounterNum$ 1 A:AB$ Token | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 | TokenScript$ c_1_1_a_thopter_flying | TokenOwner$ You | LegacyImage$ c 1 1 a thopter flying rna | SubAbility$ DBGainLife | SpellDescription$ Create a 1/1 colorless Thopter artifact creature token with flying. SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 | SpellDescription$ You gain 1 life. DeckHas:Ability$Token -A:AB$ Dig | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | DigNum$ 10 | ChangeNum$ 3 | DestinationZone$ Hand | DestinationZone2$ Library | LibraryPosition$ -1 | Choices$ Card.nonLand | SpellDescription$ Look at the top ten cards of your library. Put three of them into your hand and the rest on the bottom of your library in a random order. +A:AB$ Dig | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | DigNum$ 10 | ChangeNum$ 3 | DestinationZone$ Hand | DestinationZone2$ Library | LibraryPosition$ -1 | RestRandomOrder$ True | SpellDescription$ Look at the top ten cards of your library. Put three of them into your hand and the rest on the bottom of your library in a random order. Oracle:[+1]: Until end of turn, whenever a creature you control deals combat damage to a player, put a loyalty counter on Dovin, Grand Arbiter.\n[-1]: Create a 1/1 colorless Thopter artifact creature token with flying. You gain 1 life.\n[-7]: Look at the top ten cards of your library. Put three of them into your hand and the rest on the bottom of your library in a random order. From 11f597bb23f07dcb64e78e6b827c59de28ec782c Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Tue, 29 Jan 2019 22:43:12 +0000 Subject: [PATCH 733/901] Fix Consume so that target player will sacrifice its greatest power creature. Not very clean, but used a workaround mimicking Crackling Doom to get it to work. --- forge-gui/res/cardsfolder/c/consecrate_consume.txt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/cardsfolder/c/consecrate_consume.txt b/forge-gui/res/cardsfolder/c/consecrate_consume.txt index 66d5cf8dd0b..307085bf5c8 100644 --- a/forge-gui/res/cardsfolder/c/consecrate_consume.txt +++ b/forge-gui/res/cardsfolder/c/consecrate_consume.txt @@ -11,8 +11,10 @@ ALTERNATE Name:Consume ManaCost:2 W B Types:Sorcery -A:SP$ Sacrifice | Cost$ 2 W B | ValidTgts$ Player | SacValid$ Creature.greatestPower+TargetedPlayerCtrl | RememberSacrificed$ True | SacMessage$ Creature with greatest power among creatures you control | SubAbility$ DBGainLife | SpellDescription$ Target player sacrifices a creature with the greatest power among creatures they control. You gain life equal to its power. -SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +A:SP$ Pump | Cost$ 2 W B | ValidTgts$ Player | SubAbility$ DBRepeat | SpellDescription$ Target player sacrifices a creature with the greatest power among creatures they control. You gain life equal to its power. +SVar:DBRepeat:DB$ RepeatEach | RepeatPlayers$ TargetedPlayer | RepeatSubAbility$ DBChooseCard +SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | Mandatory$ True | SubAbility$ DBSac | SpellDescription$ Target player sacrifices a creature with the greatest power among creatures they control. You gain life equal to its power. +SVar:DBSac:DB$ Sacrifice | Defined$ Player.IsRemembered | SacValid$ Card.ChosenCard | RememberSacrificed$ True | SubAbility$ DBGainLife | SacMessage$ the creature with the highest power +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X SVar:X:RememberedLKI$CardPower -Oracle:Target player sacrifices a creature with the greatest power among creatures they control. You gain life equal to its power. +Oracle:Target player sacrifices a creature with the greatest power among creatures they control. You gain life equal to its power. \ No newline at end of file From 210cc6164d26b7b73e93b4e83a676ade427f9892 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Tue, 29 Jan 2019 22:45:38 +0000 Subject: [PATCH 734/901] Update consecrate_consume.txt --- forge-gui/res/cardsfolder/c/consecrate_consume.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/c/consecrate_consume.txt b/forge-gui/res/cardsfolder/c/consecrate_consume.txt index 307085bf5c8..d0c936aa24d 100644 --- a/forge-gui/res/cardsfolder/c/consecrate_consume.txt +++ b/forge-gui/res/cardsfolder/c/consecrate_consume.txt @@ -15,6 +15,7 @@ A:SP$ Pump | Cost$ 2 W B | ValidTgts$ Player | SubAbility$ DBRepeat | SpellDescr SVar:DBRepeat:DB$ RepeatEach | RepeatPlayers$ TargetedPlayer | RepeatSubAbility$ DBChooseCard SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | Mandatory$ True | SubAbility$ DBSac | SpellDescription$ Target player sacrifices a creature with the greatest power among creatures they control. You gain life equal to its power. SVar:DBSac:DB$ Sacrifice | Defined$ Player.IsRemembered | SacValid$ Card.ChosenCard | RememberSacrificed$ True | SubAbility$ DBGainLife | SacMessage$ the creature with the highest power -SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:RememberedLKI$CardPower Oracle:Target player sacrifices a creature with the greatest power among creatures they control. You gain life equal to its power. \ No newline at end of file From 40764691fd514b747b35dc24e72a87c7e4e04580 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Tue, 29 Jan 2019 23:38:51 +0000 Subject: [PATCH 735/901] Update code_of_constraint.txt - Doesn't untap only true for Addendum case --- forge-gui/res/cardsfolder/c/code_of_constraint.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/c/code_of_constraint.txt b/forge-gui/res/cardsfolder/c/code_of_constraint.txt index 93f7a6a9ebd..33e49316fc9 100644 --- a/forge-gui/res/cardsfolder/c/code_of_constraint.txt +++ b/forge-gui/res/cardsfolder/c/code_of_constraint.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Pump | Cost$ 2 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -4 | IsCurse$ True | SubAbility$ DBDraw | SpellDescription$ Target creature gets -4/-0 until end of turn. SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card. | SubAbility$ DBAddendum SVar:DBAddendum:DB$ Tap | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SubAbility$ DBPump | SpellDescription$ Addendum - If you cast this spell during your main phase, tap that creature and it doesn't untap during its controller's next untap step. -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True SVar:PlayMain1:TRUE Oracle:Target creature gets -4/-0 until end of turn.\nDraw a card.\nAddendum — If you cast this spell during your main phase, tap that creature and it doesn't untap during its controller's next untap step. From 5f11897d113111e39cf58c0b1a592c40536dbdfd Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Tue, 29 Jan 2019 23:43:22 +0000 Subject: [PATCH 736/901] Update consecrate_consume.txt --- forge-gui/res/cardsfolder/c/consecrate_consume.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/c/consecrate_consume.txt b/forge-gui/res/cardsfolder/c/consecrate_consume.txt index d0c936aa24d..733bc15dc4b 100644 --- a/forge-gui/res/cardsfolder/c/consecrate_consume.txt +++ b/forge-gui/res/cardsfolder/c/consecrate_consume.txt @@ -11,8 +11,7 @@ ALTERNATE Name:Consume ManaCost:2 W B Types:Sorcery -A:SP$ Pump | Cost$ 2 W B | ValidTgts$ Player | SubAbility$ DBRepeat | SpellDescription$ Target player sacrifices a creature with the greatest power among creatures they control. You gain life equal to its power. -SVar:DBRepeat:DB$ RepeatEach | RepeatPlayers$ TargetedPlayer | RepeatSubAbility$ DBChooseCard +A:SP$ RepeatEach | Cost$ 2 W B | ValidTgts$ Player | RepeatPlayers$ TargetedPlayer | RepeatSubAbility$ DBChooseCard | SpellDescription$ Target player sacrifices a creature with the greatest power among creatures they control. You gain life equal to its power. SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | Mandatory$ True | SubAbility$ DBSac | SpellDescription$ Target player sacrifices a creature with the greatest power among creatures they control. You gain life equal to its power. SVar:DBSac:DB$ Sacrifice | Defined$ Player.IsRemembered | SacValid$ Card.ChosenCard | RememberSacrificed$ True | SubAbility$ DBGainLife | SacMessage$ the creature with the highest power SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X | SubAbility$ DBCleanup From 77184dc93084693b41ef99d73e852d02e1e3d2ef Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Wed, 30 Jan 2019 00:13:01 +0000 Subject: [PATCH 737/901] Update consecrate_consume.txt --- forge-gui/res/cardsfolder/c/consecrate_consume.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/c/consecrate_consume.txt b/forge-gui/res/cardsfolder/c/consecrate_consume.txt index 733bc15dc4b..4bcc6b4e0af 100644 --- a/forge-gui/res/cardsfolder/c/consecrate_consume.txt +++ b/forge-gui/res/cardsfolder/c/consecrate_consume.txt @@ -11,8 +11,8 @@ ALTERNATE Name:Consume ManaCost:2 W B Types:Sorcery -A:SP$ RepeatEach | Cost$ 2 W B | ValidTgts$ Player | RepeatPlayers$ TargetedPlayer | RepeatSubAbility$ DBChooseCard | SpellDescription$ Target player sacrifices a creature with the greatest power among creatures they control. You gain life equal to its power. -SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | Mandatory$ True | SubAbility$ DBSac | SpellDescription$ Target player sacrifices a creature with the greatest power among creatures they control. You gain life equal to its power. +A:SP$ Pump | Cost$ 2 W B | ValidTgts$ Player | RememberTargets$ True | SubAbility$ DBChooseCard | SpellDescription$ Target player sacrifices a creature with the greatest power among creatures they control. You gain life equal to its power. +SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | Mandatory$ True | SubAbility$ DBSac SVar:DBSac:DB$ Sacrifice | Defined$ Player.IsRemembered | SacValid$ Card.ChosenCard | RememberSacrificed$ True | SubAbility$ DBGainLife | SacMessage$ the creature with the highest power SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True From 343723e5293e6c576e2aeb5dbcc57c296f35048e Mon Sep 17 00:00:00 2001 From: Sol Date: Wed, 30 Jan 2019 01:34:05 +0000 Subject: [PATCH 738/901] Send SpellAbility into getDefinedPlayers of greatestPower --- forge-game/src/main/java/forge/game/card/CardProperty.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index 06cab7f3747..ca2df4ea3a9 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -1239,7 +1239,7 @@ public class CardProperty { } else if (property.startsWith("greatestPower")) { CardCollectionView cards = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), Presets.CREATURES); if (property.contains("ControlledBy")) { - FCollectionView p = AbilityUtils.getDefinedPlayers(source, property.split("ControlledBy")[1], null); + FCollectionView p = AbilityUtils.getDefinedPlayers(source, property.split("ControlledBy")[1], spellAbility); cards = CardLists.filterControlledBy(cards, p); if (!cards.contains(card)) { return false; From 4b882ad215bee6d6702c848189e0e642b942d3a3 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Wed, 30 Jan 2019 10:22:43 +0000 Subject: [PATCH 739/901] CardState: this catch the Exception in case it crash in Keyword.initialize --- .../main/java/forge/game/card/CardState.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/card/CardState.java b/forge-game/src/main/java/forge/game/card/CardState.java index 97bfad4ff04..ae4f942ff2b 100644 --- a/forge-game/src/main/java/forge/game/card/CardState.java +++ b/forge-game/src/main/java/forge/game/card/CardState.java @@ -43,6 +43,9 @@ import java.util.Collection; import java.util.List; import java.util.Map; +import io.sentry.Sentry; +import io.sentry.event.BreadcrumbBuilder; + public class CardState extends GameObject { private String name = ""; private CardType type = new CardType(); @@ -213,7 +216,19 @@ public class CardState extends GameObject { if (s.trim().length() == 0) { return null; } - KeywordInterface inst = intrinsicKeywords.add(s); + KeywordInterface inst = null; + try { + inst = intrinsicKeywords.add(s); + } catch (Exception e) { + String msg = "CardState:addIntrinsicKeyword: failed to parse Keyword"; + Sentry.getContext().recordBreadcrumb( + new BreadcrumbBuilder().setMessage(msg) + .withData("Card", card.getName()).withData("Keyword", s).build() + ); + + //rethrow + throw new RuntimeException("Error in Keyword " + s + " for card " + card.getName(), e); + } if (inst != null && initTraits) { inst.createTraits(card, true); } From ba25696ea7d2fba3a0e988014839dfde4a74b6a5 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 30 Jan 2019 18:30:07 +0300 Subject: [PATCH 740/901] - Fix Gurzigost. --- forge-gui/src/main/java/forge/player/HumanPlay.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index 3f634a2e499..beb816281b7 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -605,7 +605,8 @@ public class HumanPlay { } } } - else if (from == ZoneType.Hand) { // Tainted Specter + else if (from == ZoneType.Hand || from == ZoneType.Graveyard) { // Tainted Specter (hand), Gurzigost (graveyard) + // FIXME: why is this limited only to particular zones? Shouldn't it be generic? boolean hasPaid = payCostPart(controller, sourceAbility, (CostPartWithList)part, amount, list, "put into library." + orString); if (!hasPaid) { return false; From 8c020c7c8cd0a4a10bc16e81cfd606f7f4ba041e Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 30 Jan 2019 18:54:15 +0300 Subject: [PATCH 741/901] - Generic check. --- forge-gui/src/main/java/forge/player/HumanPlay.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index beb816281b7..989501299f7 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -605,8 +605,7 @@ public class HumanPlay { } } } - else if (from == ZoneType.Hand || from == ZoneType.Graveyard) { // Tainted Specter (hand), Gurzigost (graveyard) - // FIXME: why is this limited only to particular zones? Shouldn't it be generic? + else { // Tainted Specter, Gurzigost, etc. boolean hasPaid = payCostPart(controller, sourceAbility, (CostPartWithList)part, amount, list, "put into library." + orString); if (!hasPaid) { return false; From 1d2bbe49238859bc79495764c5e4ccb00d55b1ed Mon Sep 17 00:00:00 2001 From: Chris H Date: Wed, 30 Jan 2019 20:24:30 -0500 Subject: [PATCH 742/901] Add RNA rankings --- forge-gui/res/draft/rankings.txt | 250 +++++++++++++++++++++++++++++++ 1 file changed, 250 insertions(+) diff --git a/forge-gui/res/draft/rankings.txt b/forge-gui/res/draft/rankings.txt index 38ffbc8508a..fc0e4a14f4c 100644 --- a/forge-gui/res/draft/rankings.txt +++ b/forge-gui/res/draft/rankings.txt @@ -1,4 +1,254 @@ //Rank|Name|Rarity|Set +#1|Ravager Wurm|M|RNA +#2|Skarrgan Hellkite|M|RNA +#3|Ethereal Absolution|R|RNA +#4|Spawn of Mayhem|M|RNA +#5|Biogenic Ooze|M|RNA +#6|Hydroid Krasis|M|RNA +#7|Angel of Grace|M|RNA +#8|Seraph of the Scales|M|RNA +#9|Zegana, Utopian Speaker|R|RNA +#10|Rakdos, the Showstopper|M|RNA +#11|Thrash Threat|R|RNA +#12|Dovin, Grand Arbiter|M|RNA +#13|Judith, the Scourge Diva|R|RNA +#14|Domri, Chaos Bringer|M|RNA +#15|Warrant Warden|R|RNA +#16|Electrodominance|R|RNA +#17|Kaya's Wrath|R|RNA +#18|Mesmerizing Benthid|M|RNA +#19|Mortify|U|RNA +#20|Bedevil|R|RNA +#21|Gruul Spellbreaker|R|RNA +#22|Theater of Horrors|R|RNA +#23|Incubation Druid|R|RNA +#24|Deputy of Detention|R|RNA +#25|Mass Manipulation|R|RNA +#26|Biomancer's Familiar|R|RNA +#27|Pestilent Spirit|R|RNA +#28|End-Raze Forerunners|R|RNA +#29|Priest of Forgotten Gods|R|RNA +#30|Guardian Project|R|RNA +#31|Hero of Precinct One|R|RNA +#32|Flames of the Raze-Boar|U|RNA +#33|Rakdos Firewheeler|U|RNA +#34|Sphinx of Foresight|R|RNA +#35|Precognitive Perception|R|RNA +#36|Teysa Karlov|R|RNA +#37|Lumbering Battlement|R|RNA +#38|Rix Maadi Reveler|R|RNA +#39|Bedeck Bedazzle|R|RNA +#40|Get the Point|C|RNA +#41|Frenzied Arynx|C|RNA +#42|Basilica Bell-Haunt|U|RNA +#43|Sphinx of New Prahv|U|RNA +#44|Savage Smash|C|RNA +#45|Sunder Shaman|U|RNA +#46|Grotesque Demise|C|RNA +#47|Simic Ascendancy|R|RNA +#48|Growth-Chamber Guardian|R|RNA +#49|Consecrate Consume|U|RNA +#50|Zhur-Taa Goblin|U|RNA +#51|Frilled Mystic|U|RNA +#52|Trollbred Guardian|U|RNA +#53|Senate Guildmage|U|RNA +#54|Sharktocrab|U|RNA +#55|Skewer the Critics|C|RNA +#56|Orzhov Enforcer|U|RNA +#57|Final Payment|C|RNA +#58|Lawmage's Binding|C|RNA +#59|Imperious Oligarch|C|RNA +#60|Rhythm of the Wild|U|RNA +#61|Nikya of the Old Ways|R|RNA +#62|Summary Judgment|C|RNA +#63|Dagger Caster|U|RNA +#64|Bolrac-Clan Crusher|U|RNA +#65|Pitiless Pontiff|U|RNA +#66|Titanic Brawl|C|RNA +#67|Essence Capture|U|RNA +#68|Revival Revenge|R|RNA +#69|Fireblade Artist|U|RNA +#70|Azorius Knight-Arbiter|C|RNA +#71|Aeromunculus|C|RNA +#72|Incubation Incongruity|U|RNA +#73|Blade Juggler|C|RNA +#74|Biogenic Upgrade|U|RNA +#75|Grasping Thrull|C|RNA +#76|Gyre Engineer|U|RNA +#77|Combine Guildmage|U|RNA +#78|Syndicate Guildmage|U|RNA +#79|Ministrant of Obligation|U|RNA +#80|Cult Guildmage|U|RNA +#81|Azorius Skyguard|U|RNA +#82|Clan Guildmage|U|RNA +#83|Dovin's Acuity|U|RNA +#84|Scorchmark|C|RNA +#85|Repudiate Replicate|R|RNA +#86|Clamor Shaman|U|RNA +#87|Tithe Taker|R|RNA +#88|Depose Deploy|U|RNA +#89|Cry of the Carnarium|U|RNA +#90|Gutterbones|R|RNA +#91|Verity Circle|R|RNA +#92|Hackrobat|U|RNA +#93|Sauroform Hybrid|C|RNA +#94|Skatewing Spy|U|RNA +#95|Galloping Lizrog|U|RNA +#96|Orzhov Racketeers|U|RNA +#97|Immolation Shaman|R|RNA +#98|Windstorm Drake|U|RNA +#99|Arrester's Admonition|C|RNA +#100|Collision Colossus|U|RNA +#101|Forbidding Spirit|U|RNA +#102|Eyes Everywhere|U|RNA +#103|Gatebreaker Ram|U|RNA +#104|Sky Tether|U|RNA +#105|Chillbringer|C|RNA +#106|Enraged Ceratok|U|RNA +#107|Applied Biomancy|C|RNA +#108|Prime Speaker Vannifar|M|RNA +#109|High Alert|U|RNA +#110|Smelt-Ward Ignus|U|RNA +#111|Rakdos Roustabout|C|RNA +#112|Unbreakable Formation|R|RNA +#113|Archway Angel|U|RNA +#114|Spirit of the Spires|U|RNA +#115|Gates Ablaze|U|RNA +#116|Captive Audience|M|RNA +#117|Sentinel's Mark|U|RNA +#118|Impassioned Orator|C|RNA +#119|Code of Constraint|U|RNA +#120|Swirling Torrent|U|RNA +#121|Clear the Stage|U|RNA +#122|Vindictive Vampire|U|RNA +#123|Light Up the Stage|U|RNA +#124|Absorb|R|RNA +#125|Breeding Pool|R|RNA +#126|Hallowed Fountain|R|RNA +#127|Blood Crypt|R|RNA +#128|Stomping Ground|R|RNA +#129|Godless Shrine|R|RNA +#130|Amplifire|R|RNA +#131|Carnival Carnage|U|RNA +#132|Quench|C|RNA +#133|Angelic Exaltation|U|RNA +#134|Gruul Beastmaster|U|RNA +#135|Sphinx of the Guildpact|U|RNA +#136|Gateway Sneak|U|RNA +#137|Skitter Eel|C|RNA +#138|Bloodmist Infiltrator|U|RNA +#139|Consign to the Pit|C|RNA +#140|Dead Revels|C|RNA +#141|Spire Mangler|U|RNA +#142|Rumbling Ruin|U|RNA +#143|Open the Gates|C|RNA +#144|Rubblebelt Runner|C|RNA +#145|Senate Griffin|C|RNA +#146|Growth Spiral|C|RNA +#147|Gate Colossus|U|RNA +#148|Sphinx's Insight|C|RNA +#149|Burning-Tree Vandal|C|RNA +#150|Humongulus|C|RNA +#151|Drill Bit|U|RNA +#152|Silhana Wayfinder|U|RNA +#153|Benthic Biomancer|R|RNA +#154|Knight of the Last Breath|U|RNA +#155|Arrester's Zeal|C|RNA +#156|Concordia Pegasus|C|RNA +#157|Syndicate Messenger|C|RNA +#158|Faerie Duelist|C|RNA +#159|Slimebind|C|RNA +#160|Ill-Gotten Inheritance|C|RNA +#161|Plague Wight|C|RNA +#162|Undercity Scavenger|C|RNA +#163|Undercity's Embrace|C|RNA +#164|Ghor-Clan Wrecker|C|RNA +#165|Axebane Beast|C|RNA +#166|Mammoth Spider|C|RNA +#167|Rampaging Rendhorn|C|RNA +#168|Footlight Fiend|C|RNA +#169|Rafter Demon|C|RNA +#170|Pteramander|U|RNA +#171|Glass of the Guildpact|R|RNA +#172|Macabre Mockery|U|RNA +#173|Resolute Watchdog|U|RNA +#174|Gateway Plaza|C|RNA +#175|Haazda Officer|C|RNA +#176|Senate Courier|C|RNA +#177|Thought Collapse|C|RNA +#178|Bladebrand|C|RNA +#179|Carrion Imp|C|RNA +#180|Noxious Groodion|C|RNA +#181|Rubblebelt Recluse|C|RNA +#182|Spikewheel Acrobat|C|RNA +#183|Storm Strike|C|RNA +#184|Steeple Creeper|C|RNA +#185|Stony Strength|C|RNA +#186|Territorial Boar|C|RNA +#187|Wrecking Beast|C|RNA +#188|Rubble Slinger|C|RNA +#189|Regenesis|U|RNA +#190|Bring to Trial|C|RNA +#191|Civic Stalwart|C|RNA +#192|Twilight Panther|C|RNA +#193|Sage's Row Savant|C|RNA +#194|Catacomb Crocodile|C|RNA +#195|Debtors' Transport|C|RNA +#196|Rakdos Trumpeter|C|RNA +#197|Goblin Gathering|C|RNA +#198|Gravel-Hide Goblin|C|RNA +#199|Tin Street Dodger|U|RNA +#200|Gift of Strength|C|RNA +#201|Sylvan Brushstrider|C|RNA +#202|Vizkopa Vampire|C|RNA +#203|Lavinia, Azorius Renegade|R|RNA +#204|Simic Locket|C|RNA +#205|Azorius Locket|C|RNA +#206|Rakdos Locket|C|RNA +#207|Gruul Locket|C|RNA +#208|Orzhov Locket|C|RNA +#209|Wilderness Reclamation|U|RNA +#210|Burn Bright|C|RNA +#211|Plaza of Harmony|R|RNA +#212|Rally to Battle|U|RNA +#213|Justiciar's Portal|C|RNA +#214|Knight of Sorrows|C|RNA +#215|Tenth District Veteran|C|RNA +#216|Coral Commando|C|RNA +#217|Shimmer of Possibility|C|RNA +#218|Act of Treason|C|RNA +#219|Spear Spewer|C|RNA +#220|Scuttlegator|C|RNA +#221|Smothering Tithe|R|RNA +#222|Mirror March|R|RNA +#223|Prowling Caracal|C|RNA +#224|Watchful Giant|C|RNA +#225|Prying Eyes|C|RNA +#226|Feral Maaka|C|RNA +#227|Sagittars' Volley|C|RNA +#228|Saruli Caretaker|C|RNA +#229|Bankrupt in Blood|U|RNA +#230|Awaken the Erstwhile|R|RNA +#231|Cindervines|R|RNA +#232|Tome of the Guildpact|R|RNA +#233|Persistent Petitioners|C|RNA +#234|Expose to Daylight|C|RNA +#235|Wall of Lost Thoughts|U|RNA +#236|Thirsting Shade|C|RNA +#237|Deface|C|RNA +#238|Tower Defense|U|RNA +#239|Junktroller|U|RNA +#240|Screaming Shield|U|RNA +#241|Emergency Powers|M|RNA +#242|Root Snare|C|RNA +#243|Scrabbling Claws|U|RNA +#244|Cavalcade of Calamity|U|RNA +#245|Rubble Reading|C|RNA +#246|Kaya, Orzhov Usurper|M|RNA +#247|Clear the Mind|C|RNA +#248|Rampage of the Clans|R|RNA +#249|Font of Agonies|R|RNA +//Rank|Name|Rarity|Set #1|Karn Liberated|M|UMA #2|Sigarda, Host of Herons|M|UMA #3|Bitterblossom|M|UMA From d063e98e3398dcf3187dac9d82b9f7bd1634c8b5 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Thu, 31 Jan 2019 04:11:09 +0000 Subject: [PATCH 743/901] Update deputy_of_detention.txt --- forge-gui/res/cardsfolder/d/deputy_of_detention.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/d/deputy_of_detention.txt b/forge-gui/res/cardsfolder/d/deputy_of_detention.txt index 625946adca5..a29ca9f4bb5 100644 --- a/forge-gui/res/cardsfolder/d/deputy_of_detention.txt +++ b/forge-gui/res/cardsfolder/d/deputy_of_detention.txt @@ -4,7 +4,7 @@ Types:Creature Vedalken Wizard PT:1/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target nonland permanent an opponent controls and all other nonland permanents that player controls with the same name as that permanent until CARDNAME leaves the battlefield. SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | RememberTargets$ True | SubAbility$ DBChangeZoneAll -SVar:DBChangeZoneAll:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Remembered.sameName | RememberChanged$ True | SubAbility$ DBEffect +SVar:DBChangeZoneAll:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Remembered.sameName+OppCtrl | RememberChanged$ True | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | Triggers$ ComeBack | RememberObjects$ Remembered | ImprintCards$ Self | SVars$ TrigReturn,ExileSelf | ConditionPresent$ Card.Self | Duration$ Permanent | ForgetOnMoved$ Exile | SubAbility$ DBCleanup SVar:ComeBack:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.IsImprinted | Execute$ TrigReturn | TriggerZones$ Command | TriggerController$ TriggeredCardController | Static$ True | TriggerDescription$ Those permanents are exiled until EFFECTSOURCE leaves the battlefield SVar:TrigReturn:DB$ ChangeZoneAll | Origin$ Exile | Destination$ Battlefield | ChangeType$ Card.IsRemembered | SubAbility$ ExileSelf From 3956a5b558175520bf2370d803ca37f90d3f72e6 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 31 Jan 2019 08:45:53 +0300 Subject: [PATCH 744/901] - Check for alternative additional costs in the AI routines (fixes AI not paying those costs for Final Payment and other cards). --- forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java index ba42c31cf9e..301dad5bffb 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java @@ -95,7 +95,14 @@ public class ComputerUtilAbility { public static List getOriginalAndAltCostAbilities(final List originList, final Player player) { final List newAbilities = Lists.newArrayList(); + + List originListWithAddCosts = Lists.newArrayList(); for (SpellAbility sa : originList) { + // If this spell has alternative additional costs, add them instead of the unmodified SA itself + originListWithAddCosts.addAll(GameActionUtil.getAdditionalCostSpell(sa)); + } + + for (SpellAbility sa : originListWithAddCosts) { sa.setActivatingPlayer(player); // determine which alternative costs are cheaper than the original and prioritize them From 3402cddd1d59745b6e2cdab48d337434f137efcc Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Thu, 31 Jan 2019 06:25:06 +0000 Subject: [PATCH 745/901] GameAction: fix Spectral Ward #819 --- forge-game/src/main/java/forge/game/GameAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 1693ee24b07..c0edb324c83 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -1127,7 +1127,7 @@ public class GameAction { if (c.isAttachedToEntity()) { final GameEntity ge = c.getEntityAttachedTo(); - if (!ge.canBeAttached(c)) { + if (!ge.canBeAttached(c, true)) { c.unattachFromEntity(ge); checkAgain = true; } From b29f390b625d8a8c18fc9b63bfd510de5f13fd15 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 31 Jan 2019 16:39:49 +0300 Subject: [PATCH 746/901] - Fix the AI activating player setup for additional costs. - Fix Thrilling Encore. --- forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java | 3 +-- forge-gui/res/cardsfolder/t/thrilling_encore.txt | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java index 301dad5bffb..18687559682 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java @@ -99,12 +99,11 @@ public class ComputerUtilAbility { List originListWithAddCosts = Lists.newArrayList(); for (SpellAbility sa : originList) { // If this spell has alternative additional costs, add them instead of the unmodified SA itself + sa.setActivatingPlayer(player); originListWithAddCosts.addAll(GameActionUtil.getAdditionalCostSpell(sa)); } for (SpellAbility sa : originListWithAddCosts) { - sa.setActivatingPlayer(player); - // determine which alternative costs are cheaper than the original and prioritize them List saAltCosts = GameActionUtil.getAlternativeCosts(sa, player); List priorityAltSa = Lists.newArrayList(); diff --git a/forge-gui/res/cardsfolder/t/thrilling_encore.txt b/forge-gui/res/cardsfolder/t/thrilling_encore.txt index cb7d570c9ac..80560927db9 100644 --- a/forge-gui/res/cardsfolder/t/thrilling_encore.txt +++ b/forge-gui/res/cardsfolder/t/thrilling_encore.txt @@ -1,5 +1,5 @@ Name:Thrilling Encore ManaCost:4 B Types:Instant -A:SP$ ChangeZone | Cost$ 4 B | Origin$ Graveyard | Destination$ Battlefield | Defined$ ThisTurnEntered_Graveyard_from_Battlefield_Creature.nonToken | SpellDescription$ Put onto the battlefield under your control all creature cards in all graveyards that were put there from the battlefield this turn. +A:SP$ ChangeZone | Cost$ 4 B | Origin$ Graveyard | Destination$ Battlefield | Defined$ ThisTurnEntered_Graveyard_from_Battlefield_Creature.nonToken | GainControl$ True | SpellDescription$ Put onto the battlefield under your control all creature cards in all graveyards that were put there from the battlefield this turn. Oracle:Put onto the battlefield under your control all creature cards in all graveyards that were put there from the battlefield this turn. From e75b15b7cb2d8d94b834e157bacf7c0fc0373af0 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Thu, 31 Jan 2019 19:20:09 +0000 Subject: [PATCH 747/901] Update rakdos_the_showstopper.txt --- forge-gui/res/cardsfolder/r/rakdos_the_showstopper.txt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/forge-gui/res/cardsfolder/r/rakdos_the_showstopper.txt b/forge-gui/res/cardsfolder/r/rakdos_the_showstopper.txt index 3fde626857d..6a4b3b5d2f0 100644 --- a/forge-gui/res/cardsfolder/r/rakdos_the_showstopper.txt +++ b/forge-gui/res/cardsfolder/r/rakdos_the_showstopper.txt @@ -4,9 +4,8 @@ Types:Legendary Creature Demon PT:6/6 K:Flying K:Trample -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFlip | TriggerDescription$ When CARDNAME enters the battlefield, flip a coin for each creature that isn't a Demon, Dragons, or coins. Destroy each creature whose coin comes up tails. -SVar:TrigFlip:DB$ FlipACoin | FlipUntilYouLose$ True | SaveNumFlipsToSVar$ X | LoseSubAbility$ DBDestroy -SVar:DBDestroy:DB$ DestroyAll | ValidCards$ Creature.IsNotChosenType | References$ X -# TODO: -- THIS LINE NEEDS FIXING (doesn't reference the types correctly) -- -SVar:X:Count$Valid Creature.isn +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ EachCr | TriggerDescription$ When CARDNAME enters the battlefield, flip a coin for each creature that isn't a Demon, Dragons, or coins. Destroy each creature whose coin comes up tails. +SVar:EachCr:DB$ RepeatEach | RepeatCards$ Creature.nonDemon+nonDevil+nonImp | Zone$ Battlefield | RepeatSubAbility$ TrigFlip +SVar:TrigFlip:DB$ FlipACoin | NoCall$ True | TailsSubAbility$ DBDestroy +SVar:DBDestroy:DB$ Destroy | Defined$ Remembered Oracle:Flying, trample\nWhen Rakdos, the Showstopper enters the battlefield, flip a coin for each creature that isn't a Demon, Devil, or Imp. Destroy each creature whose coin comes up tails. From 7dbbf0a554e144f3704b3429bf5cdf8b4e0228ac Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Thu, 31 Jan 2019 19:22:12 +0000 Subject: [PATCH 748/901] Update rakdos_the_showstopper.txt --- forge-gui/res/cardsfolder/r/rakdos_the_showstopper.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/r/rakdos_the_showstopper.txt b/forge-gui/res/cardsfolder/r/rakdos_the_showstopper.txt index 6a4b3b5d2f0..a5f7e8ef7c9 100644 --- a/forge-gui/res/cardsfolder/r/rakdos_the_showstopper.txt +++ b/forge-gui/res/cardsfolder/r/rakdos_the_showstopper.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Demon PT:6/6 K:Flying K:Trample -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ EachCr | TriggerDescription$ When CARDNAME enters the battlefield, flip a coin for each creature that isn't a Demon, Dragons, or coins. Destroy each creature whose coin comes up tails. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ EachCr | TriggerDescription$ When CARDNAME enters the battlefield, flip a coin for each creature that isn't a Demon, Devil, or Imp. Destroy each creature whose coin comes up tails. SVar:EachCr:DB$ RepeatEach | RepeatCards$ Creature.nonDemon+nonDevil+nonImp | Zone$ Battlefield | RepeatSubAbility$ TrigFlip SVar:TrigFlip:DB$ FlipACoin | NoCall$ True | TailsSubAbility$ DBDestroy SVar:DBDestroy:DB$ Destroy | Defined$ Remembered From 8b902671d62b4cf1dd54be043beca991c512cb8f Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Thu, 31 Jan 2019 22:02:53 +0000 Subject: [PATCH 749/901] Update rumbling_ruin.txt --- forge-gui/res/cardsfolder/r/rumbling_ruin.txt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/cardsfolder/r/rumbling_ruin.txt b/forge-gui/res/cardsfolder/r/rumbling_ruin.txt index 36747d0c27c..b21c20ae4e7 100644 --- a/forge-gui/res/cardsfolder/r/rumbling_ruin.txt +++ b/forge-gui/res/cardsfolder/r/rumbling_ruin.txt @@ -2,8 +2,7 @@ Name:Rumbling Ruin ManaCost:5 R Types:Creature Elemental PT:6/6 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigEffect | TriggerDescription$ When CARDNAME enters the battlefield, your number of +1/+1 counters on creatures you control. Creatures your opponents control with power less than or equal to that number can't block this turn. -SVar:TrigEffect:DB$Effect | Name$ CARDNAME Effect | StaticAbilities$ KWPump -SVar:KWPump:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl+powerLTY | AddHiddenKeyword$ CARDNAME can't block. | Description$ Creatures your opponents control with power less than or equal to that number can't block this turn. -# TODO: -- THIS SCRIPT NEEDS FIXING (doesn't have the count var) -- +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigEffect | TriggerDescription$ When CARDNAME enters the battlefield, count the number of +1/+1 counters on creatures you control. Creatures your opponents control with power less than or equal to that number can't block this turn. +SVar:TrigEffect:DB$ PumpAll | ValidCards$ Creature.OppCtrl+powerLEX | References$ X | KW$ HIDDEN CARDNAME can't block. +SVar:X:Count$TotalCounters_P1P1_Creature.YouCtrl Oracle:When Rumbling Ruin enters the battlefield, count the number of +1/+1 counters on creatures you control. Creatures your opponents control with power less than or equal to that number can't block this turn. From 51fb900eb5ca009616b5c7f44269d6325e769837 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Thu, 31 Jan 2019 22:06:31 +0000 Subject: [PATCH 750/901] Revert "Update rumbling_ruin.txt" This reverts commit 8b902671d62b4cf1dd54be043beca991c512cb8f --- forge-gui/res/cardsfolder/r/rumbling_ruin.txt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/r/rumbling_ruin.txt b/forge-gui/res/cardsfolder/r/rumbling_ruin.txt index b21c20ae4e7..36747d0c27c 100644 --- a/forge-gui/res/cardsfolder/r/rumbling_ruin.txt +++ b/forge-gui/res/cardsfolder/r/rumbling_ruin.txt @@ -2,7 +2,8 @@ Name:Rumbling Ruin ManaCost:5 R Types:Creature Elemental PT:6/6 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigEffect | TriggerDescription$ When CARDNAME enters the battlefield, count the number of +1/+1 counters on creatures you control. Creatures your opponents control with power less than or equal to that number can't block this turn. -SVar:TrigEffect:DB$ PumpAll | ValidCards$ Creature.OppCtrl+powerLEX | References$ X | KW$ HIDDEN CARDNAME can't block. -SVar:X:Count$TotalCounters_P1P1_Creature.YouCtrl +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigEffect | TriggerDescription$ When CARDNAME enters the battlefield, your number of +1/+1 counters on creatures you control. Creatures your opponents control with power less than or equal to that number can't block this turn. +SVar:TrigEffect:DB$Effect | Name$ CARDNAME Effect | StaticAbilities$ KWPump +SVar:KWPump:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl+powerLTY | AddHiddenKeyword$ CARDNAME can't block. | Description$ Creatures your opponents control with power less than or equal to that number can't block this turn. +# TODO: -- THIS SCRIPT NEEDS FIXING (doesn't have the count var) -- Oracle:When Rumbling Ruin enters the battlefield, count the number of +1/+1 counters on creatures you control. Creatures your opponents control with power less than or equal to that number can't block this turn. From bee8348b676167fc01a1763b6427d626e4c14897 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Thu, 31 Jan 2019 22:12:14 +0000 Subject: [PATCH 751/901] Update cosmotronic_wave.txt to reflect ruling that this is a continuous effect. --- forge-gui/res/cardsfolder/c/cosmotronic_wave.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/c/cosmotronic_wave.txt b/forge-gui/res/cardsfolder/c/cosmotronic_wave.txt index ecb66ebc1a7..6665ffae4f4 100644 --- a/forge-gui/res/cardsfolder/c/cosmotronic_wave.txt +++ b/forge-gui/res/cardsfolder/c/cosmotronic_wave.txt @@ -1,7 +1,7 @@ Name:Cosmotronic Wave ManaCost:3 R Types:Sorcery -A:SP$ DamageAll | Cost$ 3 R | ValidCards$ Creature.OppCtrl | NumDmg$ 1 | SubAbility$ DBPumpAll | SpellDescription$ CARDNAME deals 1 damage to each creature your opponents control. Creatures your opponents control can't block this turn. -SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.OppCtrl | KW$ HIDDEN CARDNAME can't block. | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +A:SP$ DamageAll | Cost$ 3 R | ValidCards$ Creature.OppCtrl | NumDmg$ 1 | SubAbility$ CantBlock | SpellDescription$ CARDNAME deals 1 damage to each creature your opponents control. Creatures your opponents control can't block this turn. +SVar:CantBlock:DB$ Effect | Name$ Cosmotronic Wave Effect | StaticAbilities$ KWPump | SpellDescription$ Creatures your opponents control can't block this turn. +SVar:KWPump:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.OppCtrl | AddHiddenKeyword$ CARDNAME can't block. | Description$ Creatures your opponents control can't block this turn. Oracle:Cosmotronic Wave deals 1 damage to each creature your opponents control. Creatures your opponents control can't block this turn. From 30607291fc1dcd7230f21fcdf7d624469363c5c9 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Thu, 31 Jan 2019 19:50:57 -0500 Subject: [PATCH 752/901] optimize redisplay of floating card areas --- .../forge/view/arcane/CardPanelContainer.java | 2 +- .../forge/view/arcane/FloatingCardArea.java | 51 ++++++++++++++---- .../java/forge/view/arcane/FloatingZone.java | 35 +------------ .../java/forge/view/arcane/ListCardArea.java | 52 +------------------ .../control/FControlGameEventHandler.java | 15 ++++-- 5 files changed, 58 insertions(+), 97 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanelContainer.java b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanelContainer.java index 45c9c1780fd..b9f08c4cebf 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanelContainer.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanelContainer.java @@ -325,7 +325,7 @@ public abstract class CardPanelContainer extends SkinnedPanel { for (final CardPanel cardPanel : cardPanels) { this.add(cardPanel); } - this.doLayout(); + //pfps the validate just below will do the layout, so don't do it here this.doLayout(); this.invalidate(); this.getParent().validate(); this.repaint(); diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingCardArea.java b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingCardArea.java index a19d4033c8f..bacbcd9d0c3 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingCardArea.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingCardArea.java @@ -19,6 +19,7 @@ package forge.view.arcane; import java.awt.Point; import java.awt.Rectangle; +import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; @@ -52,7 +53,6 @@ public abstract class FloatingCardArea extends CardArea { protected FPref locPref; protected boolean hasBeenShown, locLoaded; - protected abstract FDialog getWindow(); protected abstract Iterable getCards(); protected FloatingCardArea(final CMatchUI matchUI) { @@ -71,11 +71,14 @@ public abstract class FloatingCardArea extends CardArea { onShow(); getWindow().setFocusableWindowState(false); // should probably do this earlier getWindow().setVisible(false); + getWindow().dispose(); //pfps so that old content does not show up } protected void showOrHideWindow() { - onShow(); - getWindow().setFocusableWindowState(false); // should probably do this earlier - getWindow().setVisible(!getWindow().isVisible()); + if (getWindow().isVisible()) { + hideWindow(); + } else { + showWindow(); + } } protected void onShow() { if (!hasBeenShown) { @@ -88,6 +91,35 @@ public abstract class FloatingCardArea extends CardArea { } } + @SuppressWarnings("serial") + protected final FDialog window = new FDialog(false, true, "0") { + @Override + public void setLocationRelativeTo(Component c) { + if (hasBeenShown || locLoaded) { return; } + super.setLocationRelativeTo(c); + } + @Override + public void setVisible(boolean b0) { + if (isVisible() == b0) { return; } + if (!b0 && hasBeenShown && locPref != null) { + //update preference before hiding window, as otherwise its location will be 0,0 + prefs.setPref(locPref, + getX() + COORD_DELIM + getY() + COORD_DELIM + + getWidth() + COORD_DELIM + getHeight()); + //don't call prefs.save(), instead allowing them to be saved when match ends + } + if (b0) { + doRefresh(); // force a refresh before showing to pick up any changes when hidden + hasBeenShown = true; + } + super.setVisible(b0); + } + }; + + protected FDialog getWindow() { + return window; + } + protected void loadLocation() { if (locPref != null) { String value = prefs.getPref(locPref); @@ -165,11 +197,12 @@ public abstract class FloatingCardArea extends CardArea { setCardPanels(cardPanels); getWindow().setTitle(String.format(title, cardPanels.size())); - //if window had cards and now doesn't, hide window - //(e.g. cast final card from Flashback zone) - if (hadCardPanels && cardPanels.size() == 0) { - getWindow().setVisible(false); - } + //pfps - rather suspect, so commented out for now + // //if window had cards and now doesn't, hide window + // //(e.g. cast final card from Flashback zone) + // if (hadCardPanels && cardPanels.size() == 0) { + // getWindow().setVisible(false); + // } } @Override diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java index 616a7cce38c..bef56091f8e 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java @@ -17,11 +17,11 @@ */ package forge.view.arcane; -import java.awt.Component; import java.util.HashMap; import java.util.Map; import javax.swing.ScrollPaneConstants; +import javax.swing.WindowConstants; import forge.assets.FSkinProp; import forge.game.card.CardView; @@ -31,9 +31,7 @@ import forge.properties.ForgePreferences.FPref; import forge.screens.match.CMatchUI; import forge.toolbox.FScrollPane; import forge.toolbox.FSkin; -//import forge.util.collect.FCollectionView; import forge.util.Lang; -import forge.view.FDialog; public class FloatingZone extends FloatingCardArea { private static final long serialVersionUID = 1927906492186378596L; @@ -103,36 +101,6 @@ public class FloatingZone extends FloatingCardArea { private final ZoneType zone; private PlayerView player; - @SuppressWarnings("serial") - private final FDialog window = new FDialog(false, true, "0") { - @Override - public void setLocationRelativeTo(Component c) { - //don't change location this way if dialog has already been shown or location was loaded from preferences - if (hasBeenShown || locLoaded) { return; } - super.setLocationRelativeTo(c); - } - - @Override - public void setVisible(boolean b0) { - if (isVisible() == b0) { return; } - if (!b0 && hasBeenShown && locPref != null) { - //update preference before hiding window, as otherwise its location will be 0,0 - prefs.setPref(locPref, - getX() + COORD_DELIM + getY() + COORD_DELIM + - getWidth() + COORD_DELIM + getHeight()); - //don't call prefs.save(), instead allowing them to be saved when match ends - } - super.setVisible(b0); - if (b0) { - refresh(); - hasBeenShown = true; - } - } - }; - - protected FDialog getWindow() { - return window; - } protected Iterable getCards() { return player.getCards(zone); } @@ -140,6 +108,7 @@ public class FloatingZone extends FloatingCardArea { private FloatingZone(final CMatchUI matchUI, final PlayerView player0, final ZoneType zone0) { super(matchUI, new FScrollPane(false, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER)); window.add(getScrollPane(), "grow, push"); + window.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); //pfps so that old content does not reappear? getScrollPane().setViewportView(this); setOpaque(false); switch (zone0) { diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java b/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java index 44a9cb1e124..7724bdeae25 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/ListCardArea.java @@ -17,7 +17,6 @@ package forge.view.arcane; import java.awt.BorderLayout; -import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; @@ -29,7 +28,6 @@ import java.util.List; import forge.game.card.CardView; import forge.screens.match.CMatchUI; import forge.view.arcane.util.CardPanelMouseAdapter; -import forge.view.FDialog; import forge.toolbox.FButton; @@ -50,6 +48,7 @@ public class ListCardArea extends FloatingCardArea { private ListCardArea(final CMatchUI matchUI) { super(matchUI); window.add(getScrollPane(),"grow, push"); + window.setModal(true); getScrollPane().setViewportView(this); doneButton = new FButton("Done"); doneButton.addActionListener(new ActionListener() { @@ -77,7 +76,6 @@ public class ListCardArea extends FloatingCardArea { storedArea.toAnywhere = toAnywhere0; storedArea.setDragEnabled(true); storedArea.setVertical(true); - storedArea.doRefresh(); storedArea.showWindow(); return storedArea; } @@ -107,36 +105,6 @@ public class ListCardArea extends FloatingCardArea { return cardList; } - @SuppressWarnings("serial") - protected final FDialog window = new FDialog(true, true, "0") { - @Override - public void setLocationRelativeTo(Component c) { - if (hasBeenShown || locLoaded) { return; } - super.setLocationRelativeTo(c); - } - @Override - public void setVisible(boolean b0) { - if (isVisible() == b0) { return; } - if (!b0 && hasBeenShown && locPref != null) { - //update preference before hiding window, as otherwise its location will be 0,0 - prefs.setPref(locPref, - getX() + COORD_DELIM + getY() + COORD_DELIM + - getWidth() + COORD_DELIM + getHeight()); - //don't call prefs.save(), instead allowing them to be saved when match ends - } - super.setVisible(b0); - if (b0) { - refresh(); - hasBeenShown = true; - } - } - }; - - @Override - protected FDialog getWindow() { - return window; - } - @Override protected void showWindow() { onShow(); @@ -146,8 +114,8 @@ public class ListCardArea extends FloatingCardArea { @Override protected void onShow() { + super.onShow(); if (!hasBeenShown) { - loadLocation(); this.addCardPanelMouseListener(new CardPanelMouseAdapter() { @Override public void mouseDragEnd(final CardPanel dragPanel, final MouseEvent evt) { @@ -208,22 +176,6 @@ public class ListCardArea extends FloatingCardArea { refresh(); } - // @Override - // protected void refresh() { - // doRefresh(); - // } - - @Override - public void doLayout() { - // if (window.isResizing()) { - // //delay layout slightly to reduce flicker during window resize - // layoutTimer.restart(); - // } - //else { - finishDoLayout(); - //} - } - // move to beginning of list if allowable else to beginning of bottom if allowable @Override public final void mouseLeftClicked(final CardPanel panel, final MouseEvent evt) { diff --git a/forge-gui/src/main/java/forge/control/FControlGameEventHandler.java b/forge-gui/src/main/java/forge/control/FControlGameEventHandler.java index 1830dacd305..da5a29133dd 100644 --- a/forge-gui/src/main/java/forge/control/FControlGameEventHandler.java +++ b/forge-gui/src/main/java/forge/control/FControlGameEventHandler.java @@ -332,8 +332,12 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { @Override public Void visit(final GameEventCardChangeZone event) { - updateZone(event.from); - return updateZone(event.to); + //pfps the change to the zones have already been performed with add and remove calls + // this is only for playing a sound + // updateZone(event.from); + //return updateZone(event.to); + return processEvent(); + } @Override @@ -355,7 +359,10 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { @Override public Void visit(final GameEventShuffle event) { - return updateZone(event.player.getZone(ZoneType.Library)); + //pfps the change to the library has already been performed by a setCards call + // this is only for playing a sound + // return updateZone(event.player.getZone(ZoneType.Library)); + return processEvent(); } @Override @@ -377,4 +384,4 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { public Void visit(final GameEventPlayerCounters event) { return processPlayer(event.receiver, livesUpdate); } -} \ No newline at end of file +} From ef6e09d4c4c70b56b2c7bf40966bc34a8901366c Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Fri, 1 Feb 2019 03:12:45 +0000 Subject: [PATCH 753/901] Update fireblade_artist.txt --- forge-gui/res/cardsfolder/f/fireblade_artist.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/res/cardsfolder/f/fireblade_artist.txt b/forge-gui/res/cardsfolder/f/fireblade_artist.txt index c2adafe9cb5..7db40c84232 100644 --- a/forge-gui/res/cardsfolder/f/fireblade_artist.txt +++ b/forge-gui/res/cardsfolder/f/fireblade_artist.txt @@ -8,4 +8,5 @@ SVar:TrigSacrifice:DB$ Sacrifice | Optional$ True | SacValid$ Creature | Amount$ SVar:TrigImmediate:DB$ ImmediateTrigger | Execute$ TrigDealDamage | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ GE1 | TriggerDescription$ When you do, CARDNAME deals 2 damage to target opponent or planeswalker. SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Opponent,Planeswalker | TgtPrompt$ Select target opponent or planeswalker | NumDmg$ 2 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +AI:RemoveDeck:All Oracle:Haste\nAt the beginning of your upkeep, you may sacrifice a creature. When you do, Fireblade Artist deals 2 damage to target opponent or planeswalker. From 60d5afe9a2b2d8ae01eb8ecec3a0ee483f084dc4 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Fri, 1 Feb 2019 04:02:15 +0000 Subject: [PATCH 754/901] Update eyes_everywhere.txt --- forge-gui/res/cardsfolder/e/eyes_everywhere.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/e/eyes_everywhere.txt b/forge-gui/res/cardsfolder/e/eyes_everywhere.txt index eced00e2941..d0671800939 100644 --- a/forge-gui/res/cardsfolder/e/eyes_everywhere.txt +++ b/forge-gui/res/cardsfolder/e/eyes_everywhere.txt @@ -3,5 +3,5 @@ ManaCost:2 U Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigScry | TriggerDescription$ At the beginning of your upkeep, scry 1. SVar:TrigScry:DB$ Scry | ScryNum$ 1 -A:AB$ ExchangeControl | Cost$ 2 U | Defined$ Self | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | SorcerySpeed$ True | SpellDescription$ Exchange control of CARDNAME and target nonland permanent. Activate this ability only any time you could cast a sorcery. +A:AB$ ExchangeControl | Cost$ 5 U | Defined$ Self | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | SorcerySpeed$ True | SpellDescription$ Exchange control of CARDNAME and target nonland permanent. Activate this ability only any time you could cast a sorcery. Oracle:At the beginning of your upkeep, scry 1.\n{5}{U}: Exchange control of Eyes Everywhere and target nonland permanent. Activate this ability only any time you could cast a sorcery. From 5bce46426897096703bf1f1d9ee631c0b663a1c7 Mon Sep 17 00:00:00 2001 From: Sol Date: Fri, 1 Feb 2019 04:19:56 +0000 Subject: [PATCH 755/901] Update plaza_of_harmony.txt --- forge-gui/res/cardsfolder/p/plaza_of_harmony.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/p/plaza_of_harmony.txt b/forge-gui/res/cardsfolder/p/plaza_of_harmony.txt index fed983c4ae9..2cad3ae78e7 100644 --- a/forge-gui/res/cardsfolder/p/plaza_of_harmony.txt +++ b/forge-gui/res/cardsfolder/p/plaza_of_harmony.txt @@ -1,5 +1,5 @@ Name:Plaza of Harmony -ManaCost: +ManaCost:no cost Types:Land T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | IsPresent$ Gate.YouCtrl | PresentCompare$ GE2 | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, if you control two or more Gates, gain 3 life. SVar:TrigGainLife:DB$ GainLife | LifeAmount$ 3 From ac51d4170f4144b793bf222a0d50e965a14acc0e Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Fri, 1 Feb 2019 07:37:01 +0000 Subject: [PATCH 756/901] Update rumbling_ruin.txt --- forge-gui/res/cardsfolder/r/rumbling_ruin.txt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/cardsfolder/r/rumbling_ruin.txt b/forge-gui/res/cardsfolder/r/rumbling_ruin.txt index 36747d0c27c..e936c603206 100644 --- a/forge-gui/res/cardsfolder/r/rumbling_ruin.txt +++ b/forge-gui/res/cardsfolder/r/rumbling_ruin.txt @@ -2,8 +2,10 @@ Name:Rumbling Ruin ManaCost:5 R Types:Creature Elemental PT:6/6 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigEffect | TriggerDescription$ When CARDNAME enters the battlefield, your number of +1/+1 counters on creatures you control. Creatures your opponents control with power less than or equal to that number can't block this turn. -SVar:TrigEffect:DB$Effect | Name$ CARDNAME Effect | StaticAbilities$ KWPump -SVar:KWPump:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl+powerLTY | AddHiddenKeyword$ CARDNAME can't block. | Description$ Creatures your opponents control with power less than or equal to that number can't block this turn. -# TODO: -- THIS SCRIPT NEEDS FIXING (doesn't have the count var) -- +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigStore | TriggerDescription$ When CARDNAME enters the battlefield, count the number of +1/+1 counters on creatures you control. Creatures your opponents control with power less than or equal to that number can't block this turn. +SVar:TrigStore:DB$ StoreSVar | SVar$ X | Type$ CountSVar | Expression$ Y | References$ Y | SubAbility$ TrigEffect +SVar:TrigEffect:DB$Effect | Name$ Rumbling Ruin Effect | StaticAbilities$ KWPump | SVars$ X | SpellDescription$ Creatures your opponents control with power less than or equal to that number can't block this turn. +SVar:KWPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.OppCtrl+powerLEX | References$ X | AddHiddenKeyword$ CARDNAME can't block. | Description$ Creatures your opponents control with power less than or equal to that number can't block this turn. +SVar:X:Number$0 +SVar:Y:Count$TotalCounters_P1P1_Creature.YouCtrl Oracle:When Rumbling Ruin enters the battlefield, count the number of +1/+1 counters on creatures you control. Creatures your opponents control with power less than or equal to that number can't block this turn. From 02e118b2e2babec96fc00b1aff3ef9f76caa6702 Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Fri, 1 Feb 2019 06:32:27 +0000 Subject: [PATCH 757/901] RNA deckgen data (cherry picked from commit eb7a6da) (cherry picked from commit 32e02e7) --- forge-gui/res/deckgendecks/Standard.lda.dat | Bin 115814 -> 233404 bytes forge-gui/res/deckgendecks/Standard.raw.dat | Bin 103804 -> 234819 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/forge-gui/res/deckgendecks/Standard.lda.dat b/forge-gui/res/deckgendecks/Standard.lda.dat index 6137e08e5a12799919fcbcadf23b959a82c09289..9bd670e451030ce576c7e84a422138ff5ac39c0b 100644 GIT binary patch literal 233404 zcmafc2Y6IP_jh^-o1Rb=TtVr@ik&4rlt4&A=w*{^k|mqnu-Q#Wr1vIGs)_;v(z^nJ zR8dhuMMYH9S49y~P!tqw|KFK*_g*&N_dY)FljWQ_Q|`>^b7u3;0il)dfVh#?Dr+aN z$L{EqX{{{HvQ~tKe|F?p!x0|@2Lz=D)OWb7Md{W;kIUUXAi`7XwpEt897UrmEZqX| zzp#MndI16WFCe7A6A+eTt1R@|Ks7<5n&fs{YkJu$J)x$rj!0rJdmG)ZO z=n86B9YX(KIVxaWKrsGl%6>Nmkq$0*NhfQCwXoFIsnAtk?s8Uka#)=u_jmGmD;%~? z-OJ0p9&3TamTk4WQ;(I_mjC$Q2SEWry#hiUwqlPbAift3qcgSX+^1lqt2ZjoNIU3oP{K=Xj}GINKimvYCvd})#0_FM<2A_-tq#Qd)ns3%}k5_H#;Z*+sl%t!}%^Tgl)i%c>K}*Xp!;Y6RAf zAG3a~TGm@)C3dg0x^13PHi4vSYnjc73DAm|EbH%@ma^cVK#AHo-Q~8qy-pwyRhn@x zTZtWCf}<~Wf4OKx*ze=!Z>JrT=&_kL zN4cb%>8kYjM~m-GU#!YzcbK!?wjwL`qClLuWqQ+<{WnN@ajCWntJ`BMGN;-K%Sx@z zB7ryIp((|?e|=EmHOzN8@%@s$9&9Z(u`FweRnBSbNUV};$A3}qib}WJ97VMLIbOS*y#XgN+3qU0(hf(5>DF?)!)}$UZ$NF5hqGk0x;rpDOrpE9 z(CT(#^~4~%zq0tx&ZfKNAfx+wt(Ep79A$f9ok(%HrPc~efJWKd>hXgA@SSHM7L)3B zRXg$Jb8Us#+wy!Euwr}KF&Zm2QVRAExQ2gX(W&+-J0_5Ca~IhQ<*qc)YLbU;yk#zP zzj9lxwHo^=-CJV!*wrS{;nSdl^u3K{KZ)g;8Ot-X-`E26Qtg#AXF1h98TTGKy(C?N zV>9tZ-1Z`K+UN=g9Zx}aN$W*-eRshk(V~;8Y)*53yR*oQ-7RU&+i~K@#6LfhNZ8yC z2d!-u7_^`>Ik9Zku$Jv4NEObd;S%CAkZ&`10uvVmX4C0Vg)k z<-qz|o#xy^$U=1-3~2HBU{wzAR&$oEvK(AcE%2bRn-{-(c!%sWI>lPyvD)cGXS!T` z-X@CyDJC7W^O$q1@x6SQhXE@-%U15f&>X}-GHgz}5)?fTKj&zFCPwxdnNn(ZI0}e0 ztNmj@G3D4R%W#xQ^oxZsV8kaCIPtO3Tbi@T>n1MYA2BxF>ns6UcV{tYfOViHRoShK zKW2kT+WZfUwo#h@_A%L5Wd~TXIp0;IZF$|Osrg<0n@8t(o%TX=5@u9s_0}=xggkpC z1dA0PtG~6T7+cf-Fg*cm-kFlbq&WIAt!coKazIZr;ifN+(GWr?r+AJK5&+l!95%3YaVg%%}`Vt!itHIoD~k z%42K5Nl0=RfJJ+}<@ma`a*(q+1hqkh8+Y$bs>jDh9rW}E@C3x<+8lIhs-SE-p||Z^niAyIoVZIQ{uI{ z<(e2UW1y3Gz{^X(I2?saO*CL7z)pYykF(?SK(DeF;~dq|bB3$HVRvHNfI(K5+TEHm zqoYadH`G6ghCN)BUWoF_$`0mU_QFzgPp1!W*HNLx#z8EU*J+w@k}9kFqeP&71;QsSh2 z+}7Gcj&HI|4(_sYla+r8%rG(2ZgaaTAb>pR6Z;IRvs|4C{k9*N^1-i?o=JR;RP063 zqxV|(A6&Mh5~E>vhofVL%j3b;>Fxwuuwx|@IRkPuX;)=T z$*!HWUMzEC$q=3@A?^mtuo~@2Zf!8n9wh zZB=A~<9tJ2b?hf~P6HZrF(*_f*>4t>&wsB85X$%ntmj-WPI8S>xC|sCQ|;w;H@0J8 z8Eg;QOt(xSBG-mZ2%}yeUjvB*W;9fiG)by}u?&-{j%g+&JFJCe1r8|QkjN0=B{s?Q z4K(X#!6RgImwFw3XGr6eLR+*PJ=zlxn^9`_c+I`wq2Ue&HX$;Hg4wYSR=*S2?*#T6 zhae%}4o8*U=`v^6fPXUMR4m5v{s(jZdtsTx49zXYQVH1J$JR~jvgI!ci|s{Hz)7Dw z*Wnna85Z?A>4!=_dEg5I8{uICHCoW~I{$G~9%@XGSPoNxe|=c1N+y}Tqqg+tzg0M zpZUj%&n>gTYr~jG3K)vLP#zr7k0zHIvJKmiF9B^0xd)Htq@|C_AHxA~?j;r39QIo7 z-AiG%1T)yh0FJaYbOl#7V^EGo^OqCSt`xNSlq31>@?Gam zXHzfSC0i$oHH4O1=rNqi?MF9stX}k!M2+QIcrKV@xd*#n3X=^BhCSPE--oKJfD!CZ z2*HqR53gRNY>vjg!7yM{mqJWrajyhFqyoL>^Pu&OA8RAKi|cK#>X>Dx9n!&^O}s|n zIiq@=YVzdE3a>i^O(ERP@Z6fg`_zUWykg3yvE!#mJak`Rb#{Q31P=gNK49Ix+FAbn z`Fm#_{(__X9{=>$e!u+hboC`-QeYdFLAll2bOtQq*ANZdaxkaE@mDK3`$HezJNWyA zjdENGxmHIN4n31NdM}s(Gp@U{l4K%!?gxt(hmO%OS#)?b^cDU9q$Q&tntLy+r(hdNa&e4JJ$;SMe}@I%u@$|h)RXq%UL8o z5e|kx%Nkr6l~vJF_7c}0NVFUXd5Dvt%fl*? zTBLzeR5DCh?7%9>1a*E4IMML^R#rlACA(m}$xUNGib*PhMqzaTt&dxCWf-s``$Mik zLG*Qs8Bk#6qj@1&;Jx92bvfWX@;}Ase$F!ZJK#Mlg=H-HjDehw=)o}|Yr#LU1ZJ}^ znP-&GI*PuWO9xtadk_v>? zhbHeb=ObpMY--Yg!r8G1XD#TrK?90SalmGVhKjA^fooK9^kWx#^jTD~jx{5DDAx*U zT4YYg1}IV^K9)G0&^QtX78EN6c4Xj#%iI3RwHUOH&%_CHA@G5X4L=A>4QZ4dF1UU7 z^s0xSMT4JrvzUFX?@V2?a~?Yvi-j8e>6TX zNya3*+%DJ&6j1RI=o{Y~+c|pAM2QtG`q1;3HS=Hi=5nx7;9`5#xMB8MtDSmp=jzfP zcg7`em9!e>z$JlCZ!>r9j8(1lLfzGjp`011*_$TslgNz_lyF$>9mvdtdk?eChBrf< zvGnP)Qhr;j1W;lsEFvg+f zgpZH*J&YrzQW{X2COP5h^ptWs;(OODM)I)_?PpBmaK)h7cC8KFHwj07IC#G`@U4cda}Zn-j8rYMsob zAqd9hg8`S3r#Quhe#@2OWyB*pAPp82lw`O*HF3OQXqVFy+j-?gBJ*(6u`zAXdZf*{ z&Jwi#!NJM^hYQu?#UwDUT$f9-g|%Uus!|{7Bk4qCkh$iB_$aq4_teU3Gv0eAVKB!b zcJ-f_{xi`J)+^b{?Key+0j*q4gq@1O6dbiS{3-eTlH?~F?Hrh-k$6RrSnTe0z4($+ zRABd5z5IjV(^o)93A_c?=6!yClec0{=PLp*yWLv{E55tLDSHAM(1K+_Y`N{Uv=rCJ zst8=?;{36-2i_mGUJ*`n!nIO}r-#9ilH^*8#9CePcxFE{8*kG6P;rhSf%!mvIP902{F4dwJd9M>xf$ zUSw)mq5b%qHMGH0is3=%Td~nGJh(0lq+-&*iLm-OTUPRi=&>|*(3Y`-whTnp2yA6)xa)0m>P_FcizCrI8;jO2S(n_?qWLD-x=EI` z3fjCm-DW3a!i!j2QU$`N%B#HY`4uNWzP3iU=8o^HmEfVQ{6@uH-6b0JMv4PEg|A;eUpe2ZH2!>?bT~o{39vHT! zw;WAeJ{-k-D~iDjic{?Oe|w{`i1X7YYV8jIo`&V+emSvzx|Ezr*3A1m1w5#F)0R3J z5>xxg<2Ihmy}4K6C1yjV0hqo?5_#{*u#x<-F*J3{>qgdkAqf%3>9S9K=8nM zuSj|(-}k>@%U7~PxGb@e3gJM<(G~L%ox7jR==^Z&QxY>O!;L&OxVPXkg5qn1BJ;AQ!_a>X_}aQ<%n%^pA3Dq2%8KJBPGAGjtUvgzXbFM~qho zfS94|C!G0A1m)FA_KoRRyx||EG&O)9$5{lGo{lGDPB|{6E9h{kBWXeC05ETIY!vlp zAB8jqF&qPy_I1fzfj>xXI|HJLvXqd$Vb@f}q_48l|9bQuO*XV(vO)P+qSHnfI=sxF z_Q`=cmN@m7|84$At~dmuyV&I@BPS=k#hT=K`PzN2FMXt&TF}4)Vg|dL{4{rQ>;sZO zEXxo>QecG{hO)NdH*Al~93EX?p&=pzUyYAKPok-S27LaN%LHJm(0> zX>@F|Y@d)+2-#U)W4_fB{M4D>n|EC|P-4cgNP0E2J9Cn^M5QuJDIC#a{z0Wj$MNWP zp;@JPvG(w{MeKdK`g?VZqooHo1&&9xVJ76;KTq!>PBSqp&K^vbu{Wli8?^s7IhIIf z=9_yWH%GOt7=3ejLC@zn3bh?8dM=yYf1LFp;W&kkMOjIOzP%RTweQ3~XMUH&BT`A* zMGqc9V8p@O8$45WTEZhKcZivX+MY3>M5jY~6r&&AH!&c^k@8Z`M}m}3$ZgSI{?@;b zIy)+xIhr{&p}=?@K8m3M$&`wBlu-Syc^$Ka?p%plXms~>^?cW zs2(`Ma8{<;XkUpD>2R>NN(gfXS0@uL6$-;mr>5ubJ=^q;o1_U!za$$<*#nTOy=5XB~1ppN1(Y5dd+}@+q z1q}%U@o`+4MV?h1v{e3ujuv&oC9=t)13*6Xhp>T#04)*15^O^G?qqu+ zOz&f<3Pg>4HD~OrIU6A)P<@_9jA*d@GOwM#)Mb!OxL#;wq%OTkEF2Q;#WwZ@7V6wD{Z^rwtY-~QRQL^;0r6l74t^6=b} z7BlYk?GOFhjmKa>s{ss#GUUTT3^6wrchHGXShMxWi!t|3<3uss;D-gkv+Tp@jxE-z z-b8RB&yCbiXil~2w78=_KX%|Yr36LgmfEY}*5_dmLCk=Yn2b0aSv-jJLy9I41ohS-bc&M5ly(p#q^-j?u~e3t|1hWJFf4u?;_S@PAjk0n;D7(Io3 zE6eRl+v+!@S=ZaniY29w#ih5&q63h;M;a^XS;*y9;e8`co*VH!IH(Z#P@7GMgAM}k z5G#^CVnUm39%VMif`1J|p77Y=_EYAW0ne0M=5-W# zDdaB~R);}rAypC`09!NFZiWAXQeu_Izxht72iD60M9g`76H}@$~%aHr-_%CDbI?1u93+{+9S#$u(S7a9e zh{qSWl`r79`+H}35^>^MM0MZ8;4Ukc0WFVN6kQsv%I)8|? ze0&*979D9=aJkSc3n-5aZVHFBTFN6MnwXd|jbDdGQ`=Hk|8mpmTA=?NYgv&WceVj7 zEYm&`5y3i$2TE<;&?=g;sLXwwl@6;{OIbD`#mek>V!KGkEYNqN?K4A0RYX2nT|Q^! zv*6D@%RRD^H3xS_>M|1i5ev+ND@^I_hx2ahw=J@fM2hW$SdR?}3E-B{$4cb#Z+f8q zH{0zum@J$n*xbvw;cO{4ojD3?- zLYteVx@1{#dq^?PQD2olyX?t{?e`H}S^0Z81y2v0@a?02|@Dcybp;W`W*x%+8#?UoI z2ZTX)VxR>ee@cpM9TrVn9zY!cl7l;Ev!Tn?IkGiKtapHQ~og<;? z*|GI>_Tjn}zm0e*NI3_Q`{(i$(D5=Oper4X>xNt&bNM{i?lG>Y9DBt`Yqgv!?G}?| z?ZX4cyfl2V98)4#8LS=YZ^@z$E>Fvvyf=sc^T%0<+K?hkUNEp~C{1veI9)8SUrc1x z#>D!8hlRU@1r=E4Cj6_=4(t@p($2=xwHY0s>8PpQLDFDd{N-K0XAB!EdjzMauY~MH z+$6K7ED)U0mDAx6Ez?u!tV%Y0X}^e&L~uQpGyhzXB^Dz zeMQJla@|}`2f!Z5pvxZ==JcccPZ>7jwgU~m<3u1D z!DiTI)``YRXGgvfUKA~nV#u`uO*07>JAFRfr2G;8zSHJSi4~7X8~oO^6_WH{cw$ag zMb1uc^~A4VE3nMsWfFQwf_c*gXjoVXmg?nWSrF#3lVBw2)(#SzUzT);(${3utJc&9IM zb8P|NB~e;nezpzno84&k*F;W|_8$M5CQHTON6&SPRz`IL+5~o(Jn$eOI|vbFpZ)}{ zrpL8pQbonS>gQMsaA7c+Za?x7?sG+SJ8pYR>y|56Cd2w}-No0e6;@>28!B1FcbpV&+}QP5)(4r0OUnM2uiA{xyHd zbVVW0icQDvd6Gs;qy*xu=ARG^iHO_~%4ec|!kE9nn%SoD=6x}|SByI<0~RFKh)$Kt zaGr7RKsSg4soH(gk&q z)Th2v<>($^?K`DNVi6RQ!GTn!Y6<(=Pe?d|q*ZqAxg%{Q$&G+swHTKHH7pz7L8(H8 z8(u_D?Iax-(PUl{jT|UEbO%9D8NMRxwxiixx5Rgf;g@=$Jy4py3gGFmXmKP{@9(>v zpvjOg)eS*Kky;j|6WwI%KXnY)U!?~wD|q?ANabJ*Sh0B+FRBXAWi_~!731l4{m`S& zJTz5KE-n{cqGAGRWw<(zE19BG173_g_WCH90SoEuwB%TU?#?O*Hy^b_hly2CCbB-KTWX{OIK{Uu;Cm<29 z$sfQI&UvLJOsqhVg)}2*(&4KJ-D#;r`MivYQ0BK!Fd7 z(~4`;>bfc^)1izFhO#E~Th^AKzDQS4ru?Y~zIp1;4~13>Kxl&K=Gc%=9z0no6g&U| zrE0MMpy~J5v(%nQNXMm6#N06*3Me2ALM3qR4twj=+6vA%nNzj9puO|2&r4UO9%H|7 z6yh~6Wo4;OE#LmpgHb8jA4$Y$xD6fPT>0d5R%HuTU;3nERme_>gu5*4<{Yl%;J%Jx zPOIK)?#_5z3qZ8vcDr&_wM)g4=1eJ~O zUEAbs`4f7)CP>n5x?l9A1JJg&Rh7Y%h9{cxf$5&4K)nCyW*h(fqlFw)q_|m~?LY|3 zKT1qGOWj~L5N%C=SQttOw-b<+qwgUe*PN^2$46QcLb$$4z77!-0?zm&4W*sOKhh~> zTXGlCR#RARac~|H#NN6;a`&*~|FBq0={8l;V_- zQc8(#*l3K!R{D4dUKw8g_VUhuDH1_^T}_r<$J>_w^_#Le<8!Qz4rYGI1X)DT3Z)vf z`O1ahGv*13Lg0(+Pt;NAQ~u=YR!Y@qh%|njREnR$TP*HiDZOLO+C5iJ<@2U&j@-e9 zSgN=6w{70&%*jKk$*ie>O=d&woLZ&mcfS~Y^T2xU`XqsxSLz~1pg9c^SWAmDU^VFh z7Yn9@3;-w7Z?X_5?dTIDH{i!*Sx4jUSuHnJJYJQ<_1ImP?ub57AV&yOr3khjO%i`u zeTHd3jG=o0h-|`C#yL@LWE~d1w&KG^K;Wlhp^bpx$LatC$s;6MXnW6i2_Xj(l-=v5 z%QPL~;1Co~-rQEy_~ax$SK5lN3&8GmGe-96B-DKZ$Zfu({d(tskDt|A$kVs^`lSBZ z=XNMSz>k8|i>n6QkN*@Pw7mdKecG{W$E?!|5X?87$ujW$%}wwh2f!5sMF`p6u!@qA z=6UNCxwK^0b0_||OQSPcbf5!Zul0bp3>nxs`nVJ~l3# zhl({(*(gSU`ouZ_l$tc;HsZ=R%;P+0cv|*=0j~ke@5S{rE_t$eNhtpVj>F9;a(%!c z?d2NnV?gO>Vzj|;_$Lr8ZfVg4J0t=4Lqh9N$sTlMv8KIkqmh6J%f%<_$bb`v{2!jH zW^mF7JZ;+=JcSLATm-GGoX0tES&ck6^242ce{=4vA9?(am_(|r61OziLgZ=TfZaLc z78b+^Q3$L)6)*)zhv#>?#cVg7e7hj+&Ii~p&?3(({6tt0)!TD}Hmz;G?SRCH&Vg#m zGSP9^g(76KJp0l3H*U7(W+%wRa>w;8m)(~vIniX!XLC6%T3gQXkq9_2-f_oM&1ENz z`h2?*+glYg8ulIe(UmZm~yV6=o0jEx`;*wguwB3nELrp zhe=Z6HK24c;mU+F1@C0VON?mL?cr&+E_a1W%rYQFWmzd9*9NbL!z0DJ0Vh5iSslzZ z2P2k}@YT4>U%&iq@8-fX#I%F{CkAW1=XA{1MMAz3fcqg$79$|wHqm0>zu!Mm+v{67 z_{P1ciWF7gqP@kg3+Zn08qi_z&=_F3;A`Mo zI%?Du))YFxN5IegV@75{p@vz4IEJm<9}0bZ8NM*|f{PSP&C=yL>2T0Ejt2$XUn+5OS4r#E(D^k_SWNR!V9Q1u3M0I=7*YFEch3W*e%2Z05k zbOcS$WYOW#KgrK)1SrOB1O#yX{Z>-J_5AgLvG}H>Q;w(n#zxAa5BVn$iQEtejFUq6 zwOrsd#pT0)+f6#*nkR$+c07IbkBDq+|E4d*0tzGElV$4G}GjfRMZW0pM%Q zwo)xRik9QnKC2v~`0}IfYR9)3J2`PIdlEL9DvRagJ=Ni1bfH`%m@Gy>faEGV095{L zgxH{Nr(3I399M@zL=(gWbN~nfD6j}o+>*|3K#NPGd@A;d#Dzlt~{ZH ziA?J9vJP-%T0PZXRmIHEaWrFClwRMT!dd?5#i@Etxs-CGh4l@@BC~A{YgrjwGIjQs zz%t5VbCCU#0sjqh1NEJf4uD=eQ^{$c>V`R_0F&*e3 zg4j!k4z=!EE>04NrB&Dq>BbWdBNOWaZSC=upGRFh#fj1Jd0hZjB`o{y=lP>FzzYKK zOxL~7oQyMT0Pc83M%>|h!w=kZ7Y9&A12j%{_*v0O(R%3{@%u+_7FszD4s>j|xaouB z;S#%MoiELp-KON7E{a$lyT}3#n+4@qGPOmgzU!V)%$-13+sJfw>4!X5YE7qoyz#ZQ zCE94ixPb+O@Uy}uown{#(+F57Mp*NGs|hcy(|D6&wK@QXE^Dws4@J2J>?%QE)IVGL zEMFQYhi=M*s{j!LghAxDsR*7IoSz^DB`6{L1AaM_d8FIqf|3C*p)b5b|~b} z)j2WZWI|N4#LWz(n+rNc?Mk0$6#WdRL+t5i0T|Jx{hIk zEvkJGj~1IOIslaFOc)@1hoxJ!WWMZYi!KEJtSqaBNmLL@%AlkIutW;{h#@7}J}J9& zK1W*z4x~Qf*hPAj{f@5L4 zb*$?NLkJAi6VMb119y!QCW$!-UKaW74y@R-vTxVt83~;J7+%uH*yrx3MvLd19!#7fEw;P%(5`ja z4U`FzfIAKBt{Hrg^hqcaUrc*db>YgN&*jTrO}$+#FB}&$r1UUg#OHboQ04>mgXk(U zQ{@Gzm7g8Im^HhRB-Ny!(}tR+#9I+DMnoKGSyp(sRg`J@k(uMGt_N^@e2RdMg3!`S z+XpNON|l5nDc1*%?R>f!EKnBLJW`wZnqs@LWWs|LG0}oiNq(~6o{OHHQ=V2`1g44h zPmTGmL&13MlVsUY3YFA=d@FJ~Wpf=CZI<4m`HZE1xQ1Wj)&ssmBTNru?l+Y%69=)eW z$6XI^m57k}+^5dID-z`8L8(gpu+P1}?Us1a*>EQywxz$UVnAvt3XMokC9W2y_yizN z52@I`bswjS1yQ1`(icDnfxLy}R`10;v|{iEtXQI4OpPW?vEK-hPS*yw-It2P)?L^Ocb9;TiCWS8!spw(z>i~o_tOF2u!yf=z zjZDGIt%2QzNPZn?5QpVnR;GpD)evZDGrsw>>+oRq3p*(mmjo*LKGvWIQ-7a zjlHMdDbeDQrNxXxpwa$^CjC z;n=idEd-fO@dqEcIG4*2+FQz*yKrMw(B*u^B_dHEgg7~sN|aWp5ha4w5C^J)P$VKBITUjAIy`h4n(dDO0P5b7{l~dG=C1gFkA*19Sa%AN z6CIi|X~1j1CXI|Ax&?U5(TE=!C zjl^H3-Rdsa8qnZbs{4I0JktTGS5vZtqvi#DQn=UFdSiMb5F8 zbj-w64JE9r*2gtCeP>tRrzao+x#{J&W34u()AQa7&JyKwZh#BzaCXByR*5}Y)~W#) z5|#-QRx-<`ZiSYFw;GsRb4m6XhrGoq#16=~O)AI8Zx&6Q7{qAgKiBl->5%i zkXKnZW*b@r@ZEhM4y^nyRi+gUT(Cn|C=r~BWFmgREg3`RyI9TO@Zf=i@w zd(@0Q6yCejue>cR+ChjmmV;G@40GHDu_9fsM$EJ_y~)YEMnS5l&}e@E%9UnSvpV2R zqe`N_w$8}gFSgqCZ%f%@BJx$>mY^^;c?AnmQbFw=18NMrk-_eG;qeduSeSlbUoj|M zb6VN<{s0hU8R#4#R@%3e=_;@W4}QWn{<-OVphUM}9e|)m{Q+P?|_J}!=(eg1C|B#L0Y=cqar$b=qQ|fn4n<#QUM^~gSv(` zuMR*M-=VjX3VElF7NLHpfX>6@w=#}Ou}vc&^q9XsaO(2tDFQbt5+RQ`)m>xt+a*+7 zQ4tG?ru2}LVspBF5OB`**qQH)Hl?=$&l{=zro+S>G*#BPvaS6O6~;b_)-dN7yxiJ$ z*Ad1R=xwVe_rARr+P0n&XCdFSeU7!ZjW_3iq-Y5#h3wP0WrXT_%RBJrP2P&SM6 zsHHZd=2=JD3p?j7vi#u!y*iA;4iE7?Fa6dNT^}%den=(@6gI*8u=Z z#WuDG;=9sh(E*TQ#4q__{j5@s>o7nwjDKW9QyK-|76t&ETUkgzacJ=uL6Dt};LB{} zbP$Y>6SigtgC9;3i?GEJLMk%%v{re=boYN%+qd@vT=D}YD$P-hs|no*}i5; z(TtGI>=zxQJmkaMvDv6ZSrYDg>29rTzjx`B&Mtjyx%sBAwdSz5bOBt`b zD6;0|UXLCrZ>G9J;VUN!&e8em1-CbxVJH8YRKP> zW+{M5eOUPW`_EplZ7j(*#=8xu`oZb5$~rJ0eUhQ(Cx0^FyH!UeI^B@4kLFQEy5GkB z-DELfMWK`kT}5OCNTqr>=jT0JcAtDrQi_LboLt_mp~q5HJ{)pEY{I}#?kK)@qC|}B zNjE8xSncyU3@G8aPf%NHFB1gZxu-k1XMZgT#89Pv zys-V3DOF+|N2pkWiIcZvpi8 zH*Q+IA_!_^M^Z6NERWZr%mE{buxLFA%^ub{)@k*63(O;nTf8vzs^XCGxQ8xsR}gp7 zs$AoczxZ;8*?n8EX3X^9T-RioaIoF*U00$MAcQ;GOcrm0qSuFhvV#LCDFwB!oh4ul z*aO7RDCtOyLWhdsg~SO!#czpkgtj{`X=vHDNf@Qi6~V`FfGPx z&Vrl0NbXew9&U+>s*73B6mgeTB^~Mz(US`78Ub1co$nCPLggM9TZBtR#|Tha`Z@p% zSzfM%%P`cItA-lr6He7(qvN0yv06F+GKoad5xUr@S)4i~YRwf&!;%t!pNv}p!R`I^ zhZZ4=>Hvf~^#F1r1RrJpMmmn6ymlOvS$3o-{zhqG@?(DR$J7>!dWW)hP+IW5A&RrJ zYq6AItT}G>RlV@{-z~NC8?;b#zv%Rq%b$f0k^~aca4iQf5wokjh@Da5j=)^_OUju` zL+4A(Sc-c?V@K@>xG&(H7HE^}6&#$>q#H-072rye$x`)?=e33BACT=$l;dvBaTTD9 zxoB#@h{jcKVu~=Decl49e0b$kFVA14$cW3aIX0!pIWH{Rzr9xTpF~IxYst`G246e< zhZaA?q?tcmp+D43S-K&4~KeL+qc38I(@M1)bb4@cY;L&Xps;7vzt5695o6b*h#ntb; zw_wV@V|fqQ4TJn8`BpJnG1@-oN*cX5{q z#mA5P80%bin=A`YesOH>{3V?=_#!8ZZTemZa2 zV*|N5!xoscNt0#BlgA}mFK?HqPM+;SH zO|;OIUR{149jUtoiTy3UZndHMIQzwpL|IK4du3Gke4Kb{T*|iHqswfcHow7fX@K&; zuKCqFGwFWrIi(L1u})B5-P%0$$}d{LC`cZORomkS?RixTw}x|3XtJz&B&75BDOw*9 zy9KEiUfMNy%bUTf^N39nQ19Bid)xY?f-Dk%74Ot;efNsC)gtx?z%vDAdbclX`*@BONeAbCob+~_yU(wWZ+tAzXngmgNl<0fhmMetyd%R{;F*QxfPol`jp z9GgtkZ-av!;>|}9o6+^~jEm>h$xUD$E-49hCDEs^47%}q20xQ*%S$daJuq$LzZ+kc z{lsM0am$FVP9(#jr*7Czy*u(?vkynA2}Q`AV+4d}GaQp;(#D39GKPmsy7eipWkzbP z;yM#Lo6{?Pd{L1MJSSR?Hy?Lif3|@JI4uCR?auzueP?eD06RnaBCGj?#EufURprW6 zxl2~e2;QgKD^4_O%#(M2-t<@19)X}z=ofHgfG6R-Cee)!4PRAp79D^>x0HxSvN#!W z_c|H}e6z zk0P>!Fr-CdDYH~h6g53H)4yy+!m|6$@{Np*7?(k*pp{q(!(tXMWG9b}ft^S$4NaD! zM)#cG_T(H6fO8eOmtc|12u(rhXGkS6ZUZ82pKlQ|G8QZ8WYbC0h7G+g+1FdAG` zLoz7cDlqGAlMPFr@mc8Ivt_5z@Z*-^z8Z{pc#f(?hdLx$X(@>Y_Ij>hz~is;)&K-c zf29rp`;b^J3c=>sRVI?a(D)fH4($wIq$-2??sAji32Te zt7O54tQie0p=sT!z#FkF4WY5liLQSfkT=z}A+ZOZ~ zdanYg%ikLp_giysK?ePz(UJqO@kPll>=~405RG5@ z>-RrC@u+!d{)Kl=WR35yF|?4Of|L=UG6j~Fy}feuUQwoo9 zCn8(sPXu7@CeOjy3%Lcu0Gy4OEYlVjl~=y~G^dIWqueah0;hjG{FElkRKVK^P!X`H z<(r=9d0OmlkWz8KDQQ=uT7Jg20_$9QIVU%N_}pLLj8UB{1$Sb>i;0IW^VOvmDh4om z__5KA?|MPC2>4e_uqw81qqiOq_9k^MKdddRonutJ8N3A;3RsDFIT67uJQpC^ry#PrFnVUb(uu;|#=8jn?yGz>usgRvXgQVEvwLs-UOMEDQyodBsp;m%DO0Wn3)c+7%ddB!j~^^{M}}ZSDL;_dFr&V02zz zO0X^F{~g?$d6;*OPnKeL7eccjKAD56O;Qarpf$>XyA=hLge#GCi1&;XKdEeZPigiL zNi>0u4<*Zxn1Ud7)hK0Q&HhV&v~g-jGl(w(UUOLXX26p2UXnyK>}2>F3fZ%@D%*1D zypn$Frrar!V!1C6`cV=J%$6wAbN<;UZZBTFP@+ZfEANzljFmtp=$uBML^O`*#No6! z_XxoF`3c?9KIzK=P`G>J`A@vif!B^IxxWin^~o_O&|N32UhBeo5*QYM2L8-zlIsl1o$XV2gGiTeNhx(Qx(jkJh5|}ywF>qCr zFFB10!)gI216Gqfs#QsO^y-nqyi#_X`~=+jqLMX;$rW`(0$!0nR1jB+jDbcZE749jW60|S zL~MTpN-Rn)6p@#Jm0r+Nl5}V^e$L|z?EwgT#~)z;R0K$ns*}6oF;*OR=3+~BspkUL zwanl3SKMYs9Bi(BZ@k8i%Yj;f{FP%anHqPkk_a)#q{rT&67s$mhM)W5{MVhFzi}*D zfyrXHi`E5Ix69=QFnyqqGXk(+LDam`x2CHW^*0K@jC0+Z_Hvpz0BQmpyX=BE)d81Q z_@tfrJx&a4FL7ez2_icj7f}SI32TOK&&=t}v1m}&`~h%$pgZ#dlk9=Ga+GH$Y+QBi z@OJyTOE|m6;?UgfU_U6{#iGFit0wmB^*J**?D6a1BzN5>^zu+#(28uu(n9ezBGR#UB7Ra0-%kslFNA zh(Vy7c8I{V*Vf+_`C6DFQSX9300bPnFJDTg80z|IudP^<+oaW7rCE~U;iA0`fb*RJ zyOg~vVRXtG5bIM3XS!RaTp0$01ohx0loqG01SXM`wg${-StJztFjQ!F#@jF(L!BGGPVdl=dT4c3wl48?6K}esGh?&o~|v{7or!zEo48VhzOkr z|7g+7#?L1Ys!syCjuyz*<6Gj^DTUYiBa0S6@;n$xMMybg1k~pW?yY^)=OW}*fMR?) zQcw>llZ3(oNb};ik-LM3;W5oR#;Pvo8t63A1u3%dG6jnBKY~-Miou&ce&Ac# z9QDv@=zRjJTZoq*Y0kJTh3s;vPZ;py^AK-FehWQdK%I zCn6*Nv;Dg@Qt|}#J$tRBQ;*jaKLa%sl+lJTh4KXIQ0eP) zv4T6PdKwL6mZP-%*yGh==sH{wQBQ;#0cyV*0bwotks@oG-eO`II56rVDOCkTBL!6= zR0n_yO+IIvzYD{5o|+6FcS2;G5g(^{iaVDxJgid zIp#oikMA@`mCE1ReRA3_hi7swL@i92qQ&l)zg~L$=5j?U;7mulNS@Q4J|Yc;v>B$xbb9#R|GQJY>q z#oJo-5hTCT`j4(%Z`XM)2asyTtGkdmU{;hMy!P*npFjLyfNHNCmCuh@|6BXpIlE)) zAU&ANW<61G`vxJ0p!BM8n)yhVDb!4o(er-ne8Tm;q8!e@5;7XbS?;fz&Bw{+GDnPM zREMtCF(0&3EtIFTqI=h_W6yDopISsbC|VRxeLrpI6WY=%PGh@V`)R$jS2-!%Jwz=& zq^)WhzB)L4fgc6M#8X%AYX2(##k%5W*JRNFpzTs&58=zg8>aBMD|11I3ECm|>1k{1 z&zPGY7$PuVZ5^Nfq>s;0ZK+pgKlc2K8(Z;t(YWOXdF9?``_=#IvIbClZN~s_{0&W9 zYI`l@?+-uqe6F=nTk4Pdu3YS=u~@aycQjqJ{X(I3X4GEW-Ztaee^O>CQfd=z8#MIZ z#{C;AfaxFhr^&MQ;gjQRCtgpqX(vuKXmMb`b+cxZI|g@Vx&DIxy_+vhkt%l42-R{+%vDebLjRFyES`D zt=wySXYShk*VAh7s)F(U*<(KGn|M|M>hld}vh00+;I~(9@Hs-ajn9RF313bJURsOEaVX}p@8^darrafVB{?zNUdn1E15jMYlZaCv8gM#)3hxTZ zon+E_N;{I;hipKj%VW!rW4gS0u$vl~y63RzyA)$b!WKM=KG|B&27dN<(w)sDD*PJEkMHXQTUMIfYxS@`5(R!E_C^Q% zqWB9X4;cWtOmjDn8rvpFqBWq{Hfj~YCV)~N?ornT#w)YkQ##EoL zkap(pln0k`-H>=w(7giC}9Pk(CslDDy?(#x`@}- z0jMX<5hJM}F568O9RM6rR6bx1Bt20wV#3~I|3*fO&SwOWV%Mji-F^P%bxa%O4^GllHg!v8>X)|{9q#X=Fa9WoGz9c8_F?^nZ8 zZ%Y{gqNF=sPW5ep-GE{sPCO)yJj>!5;^ICfa&)K|T74cSyoE*_p6w_jADJ0P&9{iB zk$|c)YXsDf5zDLt;80SUMX`7p4Uu_PHw+^I)6rq#pH%e72v7k-BS0AmMnJt#|D%av z#cr*1p!-w37Jpb6iAvrx(p6W1bO3x>Dpf@_P*LyGz?i~GraL!_di1-e3YmzqQ$1C&u4zwhS+OW>!H#t|S@L}!yf5B(FXO)2nkG4kT0)i#g)2RXocsWvMn8 z+GA|>xx#OlGyq{A=?ATyqh?Iy6{;6~ggXW1>EQ)OBU_$jzi2mxadpCEdE<@lWu~;x zIRHv>8s03TN|Gt8K)vJ~yP_7K-jlRKVnIm+yYujDce<-0df74bmp8t!^D{&G2YVt? zYEQ^H1*)XDBB1+!5d$>sKwTD}Ng4ggU&^lHMB!56__=sYuCP?}Rq|cvw&a2uj)xhA zORIQ9=eJG6rW{uQWu+JaLHwMXEJlEKPOja4>RRu+6sdq}(RsE3pxnYnfbvTj0m`;B z0>T^B(TA$+Wo!}lm%kS9?6J%tR;Q^oX@FiC+%ytUQ92_)nd&+KcqhHq%e)#sH9K`U z_#ny|W(0({@Hbwx2$7xvV+-Yt&;f85b8Gk|4=^Ky@O-a~=rBQB8U8u|`Bmw%32N+9 z&<+*i)hXp)SUXxqU!QUaeLD2Q&e8>cvN_Sw3V%aP?`hlTlbVbZ78n2lX9QqQQN++b zW1dkh)R%oSYJSg2JA_3*q;`lFr6ZnieepIW8lYk!Rt@zZg>JR`d^#j*EzO<*e|~uV z@;ha!Kjrl?0@U|50@R7<(blr)X1h^}ROk&cLL)%knlu7b?tl@XGD?jAm11iIL`a{2 z5ugfQ>j1>OWp>X%BpSfjf=|7U@dw>r2SCM)478(=zKVCx3*FXYh*5uyaU$_79TaMK zneeEZuWZ-R!lzU2Q~_W&ucEl&N*0DFw#0g&-*+*-FBla$Z}31CWk}T&cuT}k4lH{8 z^M6hzv0vcL4QMHlw9Vha&W20RW37~n@oM{vKR#XjD96QcqIwD3Z@^_;+&^K$WQ5F|qi;F`?@eKryQg^-kV>+d|=;K_6ikMIYIn)O$?L(-01)X zuIrqX>Z_dp(?N^mrnkxR;{PTeO}G%G`cM^jS2@m%c=4_Q3ZVSj&tH!m_s^hN3Luu& zWLf(8)tetYJWv4?|6XwX=|7&>lBWPlvd%9{yY7CZsRroC{zQ;{@17s-*egUXBr8vh z#5+bLVAV_8(|7+gOuu+RLpfM8<}ARz8qg3Qjk zx>Kd&j8p^UF);#E5Su=je{YjTv>?|*R4zj%Mqmuct26R(*#F+{ z{!|J>q{E|Z%EGuKWNYL?|=JhuWF&HQR@KM@!2R`SBYF_eKwvB zi)QpNqhzx5{HN!4M`!RaLqm*uw+=wSvN`~2;~7Z>5BArBR3y5?%^q~p+ZjdzL9h5D zfI+G(Dq{T@{-K=GINp38rq4T}L@5+mFZIniEu=UN3&VZrVHEqir_tXT=Rz&-U4 zs6OvPZ(sY^)jO)&tH$;27gV=DalQ7Pceg7*bPox*>+ajHe-ozwD&)61=Em&xvyO8B zx}yRfbR)*MpyTsjJL<)i=cvXi5m*NRlht0zqm>k0FDc#E^?_08vWJG)1?(Cl%Va}M zngS%2s``kFmIct%F~Na-~92-pCy&(%o;>Ep*y3FMS~x+q_Jps=R0u z3;un(^E07pumPvUI6U1Re)ri&x$q)VkrV3x1WQ|ZR9IBpKi_Lny~r`5McLA$TaUC7 zowJk)6ndrmb0}Ej>j5Yoy5#qkr^oZLz_#e)t}S&{-EuGrr}Z21&`0WEgyB^hr?P8v zx2+j)XyHAY!zPQCgZpxmVzIsaH$>L$8P(0U)wpqDJn{%>QJ1uqV&m3Nu?3_dR-;3 z%PBu2+lE9U-vmS*HqC{1Z?YHx$}|!H;zi-~eruJe)=pfh2}1e0a|sGlFtE)z;E7$MikQrtBa(tWYJ*_d_rU4B{;j7dk5F)w?8 zhr8fL#SAFW9XjO6K8Zr%!+Fa@P+7B)7w`&N^~L6VPd zU=!!(3+=;kdBg)}yr91FubVGU*?vh4OgLvvmX&u;AKrEj*IKDt?U_fsH(@U>7VTFs z>L+=7gi(2+B63Xj!AGFdA_8&wQZ`eGn1DhoFx`F@WnvW;9${oYS^x4T70Sw7^UUn zK(V(Q#Oqc9(Y@@QSF;Xqrw!JlA+CF2``~+1SH|03C2tpYy4XdWM2N>cTMf$h_r&Xy zt|~!Khk_BQh`0^_ldqqX#iLnV0DFr+_acZ`8=i=aZ7_=cB5oNX&5tM8nb4%FveS%! zKxz2s0A$kOz79AH)yff_=`he)C^srh799Y`2A80%6{@5Ru3XVcLjxQ`9V-4wh3#|z z(CCSD>JCWMWvsX#-l5i%CLJnhM05Sv4{_;~6D>xwK@d|iTwRRGtq|36v#d3E>{|?W z_q&7B&&6;3M{cf*{O6#l$Qt?k(`|tF+Mw*?b$F*Takz~e*j7bv6dAf@qsufq%XZuAP^^y z>rqwFn)@4IJmfJqD9I{f`Iq5M%sqZ=kSy-MgG9*O)Ba#2;-wCb?qmrd{X^aq;$ z82yWAJND4zk0Evlv>rB)0t9ZQ@N{o*e%XbaAI_5~u@rM8?IH={-RHp=9U8`<*iZT8_iwycA_OFSe*LJRGUc_> zf( zGb%m0hcNoof8oQIwp^D3PlR$M-OS<8kkm*GCVzs@Wqk z(vvf(w8Ia>BW9=;is@7zwf=Cd=cft~(^mB1p1Ewm@q+mpfC~_lrQhX=$J&*1jf!!f z0@1<<2#{J=`i(Erhd#KTlY&(t@;l+8?vI)*6{5Kg3+ofj`-bb!w>bbRxycBKexeRi zD&Nl7B4SP*Ey5!F0m!|G&0hllyEy~CZHFF7+i1ENDbz1yh&kzQaxNbEtHHccuE$y^ z582!A&)%{2<{gX{_*K)i@^ak312R4GEL66nLX?P=4DO8*`+LjAhw}!slkOGc*wgo? zAHKQg5lN|Wrq>GN0&fe@J#2_EdHF-2Z+oRf%)u5tBszti!E&5-STrbwh^pA?48L&X z@R6Gvcw~~kxw?$E;_8$irp{8IHnE?(mhP41;G#Ea)!@xa9N^`ZM(GM;*&?vVK`)o93|yN6Fox2Aea`;a zs&bF8ZDX7) zP9$i~3=gI7HKwE{$01Yqr+Q`bNF zQ(1a3xv*`>XN%-b(sTsYn(GZM_Aj`8%akNO57@(HN3MR{RSD*J*hiky0;JNHBm0#F zqXmWMPyh5%=Q$nJ0Kz5;z@(JB=b1j5q5#1s1fbTH|K0Yhb2)(QC#-?9q!iC_VkhAe zX=SB)DZ+pn#nuj9Tz;>g*1=@)SQoVG)_k+-C*m2=j}f4%@w$iHxOBXu(nK31lfg#& z9Umpx@Q{oS7afMaC#c^7xFGXUW%(sJ0=%K5#b_c!7q9$JY zeCdewJ2fw#Dlu#XME)$g9T>Xr!?_LlcZCqZgMx5KxXdWc?(Ep#CnZIPhY6YP76h_? z8}jMuzFemOfdqOLg_RD$W8CCB)2fE)FhL^BB}gP4`R`D9V=hc+HwE&2iHDDU0Z_Tq zsvsaJ#%QafWvCpLt|dqY{p7C&c2Ra|joUUFQVJTh+s-loyH$fM|i-9E+r^AD_UyGis9{~I79}l$ic%~oci3eBfI)_ z+bN?cG#1Hhj@W)VHgcxoRd{D3pW2W{nBPh96NJAyp zhh}`0Eh;kqzc6?Lk}t;U z&#TYxYaAqL)X!xx5uZ+$zWeB_FI1 zg0?DEro=k1Wy_EG-eYI+8Y5$}7y+v0-7NrVoemf`)cShJ0X06AXQ=~#FHpJ&F*Y+} zkXkH5hlfF`H;rxqNQP+yDBrXWfEro@u^0|p2Xlr4ffjg;pyBkRhonoyY<2kPI#hB& zBS00UH3FizW^1w-0U~#AKjk~nGTOgIY6h;z35ztOfv$-GOa&Wp&C6$Dk<%7??n%m zEX-txv=LSA+5RK<{kQ1xXa!K&HhY_$-#qW*P70tBBKKU$z1AgI7|0-{^4oS#Kc9MH zqt=H?G27X2N#c-~xT}IXSGg%WW_^3P&%F<*K2#d=*3+jaZEL?r0ixxG*;4k*uI6W3 zDL@dnjZK#Izm;$9vSXS8sGO5E?H`nwFA_EbZ5ZxSH(3si z-+J2}JGk$U#;PiU?u$-&tIy;w6e+bSUpDPtl@;Ak0o1149rb^FT?JfLN!O?Ap+RiL z?$|ZgdIYgS5ir+!2my%)2@&k>?rz2I?p$lvTwB-P&^6yR)>XeVcjo>tci{Pc@B3rH z|C}>(@0~ew=FEwAF1vrzCJZM2mdi6fC-)V5NA9_|KFpLlVY4;n3|9GSWfL7O|r1Izh;1e0};QH0ax46(@uicQMv@sa#*MIQU z5H}nY2%)ajyJF6gMqDdo6j%{5053xwKn4-InM&Z-L;e9#xi7PH4T&}MLmi-;Zb;WB zsZ4Ie>0}>cQe6yN*OFMcG`9f2r%6y~XA9k=ro~0~&`~T|9bFAm6e_a7oNjQuXw@eN z@q!@wPF8;!`fIO=9H0#`B8J7_RHXo8?(0Ay!W0Ng`60!~PL{u3WOM*OWU?2Ew7N%2 zHh9}V^%Q!*o8Fl-_ww-$pVc0m$=yH7oNIsDHsh3|-)GLBafH*`s_`EdeQbFR91+kq zXIsPYs$X+S%zk2UGvdn+SR9xH3b@@&ZFyrs`HJ=c?6(Mt$tS-g_%F~7GuGDyFtKT) z)Ph~K>5NR!WB1M4;u5t8tgJl*#fYum2R}U6004rq)#rbzOttF*04u!di^F&N^>G1U zYb98HcfiYU?Nok3VXp)ZpfZ3fXc=(k8;!vz1D-!v=)=HeQ(g)ib-n6X(aNCsg+A;Y zOaCPyp6eVZHB?Oc%7I+Mvl>@A4a~l*P+!VoaciA!hdV<8RLI-!T`8$7kzB@{p6MXLqiVG z6)W?9UWTYeiy=2Pt3zs2XJL2sAuLaHs7ZDT|*SsN+PQ$EJLKvJ( zjuvrT*)&ev_E9H>UqmMdW<`}q?x3v;hfxC9dTx+kvr4a(zvzWiP_Yt_Re@#`nRtl> z&83`8Ar~Td)#YvIpPcLku=>^g;Lb;ctY$)pJU&>dk2HU(7f&$=DuY!q?PqnEE!1P? zK~5pq*q)ayyB-ucva31*rx2E4ILxfd%9(X97Ye?^@dAd8C|@(sNeDMmciOTjSrY}!QaP5GNb=yS<8mZ(bPBB z1i>Qim1onagH6HPqq+e4e7Edqm(wEvAZjBj{kx_im-rBrVXhMty>}lw8hA$&&JKL1 zroflCtA?4+X<`P#FZ91>!Z(+OFIv%?w*a%xdUIs2BQohA7%YwE3A5_j^h-R z8zz`cVRX$Llh{X@5Yp|it~Hxd>YbGgIJ6KCCj+i_`2nC|?+C z^5LAdbKK}6ehHo$MR(;_3SKyQcHPavxsHW51hDBwy$2^x^#TPBU>k<)xxe(VHY#ke zIhT_6%>Q~76j0A*l(K%Zwf}Jd2$zp?TJ||(!B7A&tIGg1){dVix}Mp$3KTdkgf97b z_)x>|0lZ*J&>d7t>QRbGj@8OZ=N2pRC?E6`w+0ca31U|mcZheW|{kmAj#I{8_7y|`LsFrGVLbLE&R2M-MG@a)b3N47N*bAY5C?fDrb zZONz+M2>iL+QXgHiA9@!egA2##$vM=%EqC?d)VJA0>FKj3IrTzkdQ5QFuJ-6GE;UV zvQe^&X|jz*l7LMWP1jEkZT0=B#^B+_tr!O5LLcW3&Cav~;I7WN`DJfDO4-^EfEWMF z2IH&?f2Gade*}R0@5-+Rvp1F$+TSjzy?YWK=HJZ_)AI5g4{gFCbgV10Lf^>3ZTV`H>F)Zym=R*24J z0J~0Ty*iKlBfU5)s-H*B{7Et7n@+{RTP9Lbb>?^z784nt3SGSEe~*jj*lXH>HQzN1 zMj3!%LI;r1mlW41adF@2L`SE;dT!W&|Xb0T-i(oZ)K)ZBy5xhqpk`4lYNK085XL9YChA z3C*u_(t~s5g>4rTm7veyCv!moWEp@ZN(ayjU>@WClqrr?mO)k<(TMFVu9uZ@v7IGP zXn`p`E0s#EM6qCfi1A%Rnk~GyTFg5-fwUuuPbnw4rCdDYhCe%x*$|^0pbdP3Fc{Yt znEFewNeCZOl~|4~vNcjcmjNl1ZA*Qtx@I&;J1*+UZ}!6V3coHKu5_cUhEt-)g~JL) z&9T!KuPv9y2IIWr2^Sp)a{)`o4%?s%br#IMIri<1&r3Kjx`X9UKvN}@yf$zanpN}T zh{A9A9!vCvgUBb6a;%caR|@%o#L!+x)dWqk*g|LYsCjn(-+y6*aBG`3KHlrcKf9>i zQ3B8mie#isn1XeXrDo#X>`x0$YI_MB3&*~CKJM;;n_vq!&oRZyTpGNGYu)UPpkn;s z1i(6w^2dp1tIq?4oq9fz0fUXw#$fD|lNGU`{u+(q7XkF#zVlh5U_K#~2j-g}Wi9f} zEE80*HYkL5iUcq-c|4U0NsXjCf6`MZ9t_4enFGYO48Ze524Llv0f)U}_%Z-RRt8{W zkpW0p89-5Y8E~-6uX9?voymbSij`k(mTFR$g^rj6NB{-C#8GmOmXx#xLO|DurUqP* zWWf1keq9rV1K(AouS0-)1w925QVx8Z&m*J=f-QL6vc(T-FXQ{EGB5blC-+BM9$m*b zRJbz0YPINK&dXJPIawV!K*ETWR%Lgigc0QIBmzOH&|mHqM$<J`EYE|(g zYsQ@H%qeO4x1|^yDkVfNok6KtbXsQ5X)x+m7d>HXQiBuYNyJf@D($rDz@=tISd|hI zb5;Gjn)=5ladU1!e{ykE36eg{tLxY1xzdaBuAhnybpTDCmSnEsnf}T3iyNM#rOljQ zXi&^1+KlqHCL-KK764A_Ows{tf-)xvI%_0R#$%Z5b&c2zGKvxE#0R;#gqbP#n9k2c zYT?zA=Dj(YUK#~0ra^CaG@5PjW(vq8Qy}y15gc?4iG%fU3xHj|l9Y7$faEBOgre$GlE?AAQ{pp&shaOTIx_C4x%8qH@s1K_U`KB$ztb-m-D@K#TVLGd~JIxU2Wo5HOXu|R^2jMOA>HC0q< z=@pX9!usgA9~i^L4c3sZ9gP9gQ3ud|NO=><)X1ikX3*BPAz~kH7pH8axyMNWESxfc zY&!+gpyLwiLE(!oakCmXRxu!fEBl+R~XGdssq@E1=7%Vj~cnUcJ%cS(=G#;nKEF< zmsXyUc`N5To(jTWCthR@NcyJ($Q&3(!LD?-LfS=QG?|S8%{a^GTGFs>{}kU{2hbMW zp00YC6y_co`88q>{n!EkXFeTUqCh?r8L*1bvtsEx+(Rk0mBlY5#-Q9elYS1$JaSM7 z*x$MeKeV|uPow~bIQm|cLOr*Vwr`ou>5?<%D0ED4Vb|W{J-=m>t3Pvq-d}h+#bZ+x zAH@Mmwq+A6;qjJrcRFB$7zN@d}pM7HKhRJLo`;mXefs;I4e$yAn^ zMF&o1Qfrry$`T{13fZ>hSyMN@I;!cBHv#gI0bEmlpvHm zg_-1LIf6`rT-S=o?Reh?qYOBowM3yFon#7wss_q{C%10o?E{6%WeP`r%FRmwe;q-g z2}k+r$mgRN|H)Tf|0^=vm%kT!VtnrtT^7XMi+T?L)A{(zA={1z^T%Yb*p7c;x(NDk z-aVy=Hm9KXEWUp~e%r!am$Mm(iAoL57NqO*F&d16Zk3+(p?x#-XBR9+nEGsd-z3ka z0I(=JO=?rDV(YyC5PuNnpLwbK(i{Nx?t)d|^fmn^%oWCO8oKK!0n|#j-SKSnLr~z> zQwPvSt4Pm|l2`_3Lz-~HN6dhe*lbR~W`Rkez4{P;oEdxI9EDYF2T^TZk zZG3(dq`EXSvw8|tFM=ul`L$u6_KY5|FrR2SQGzYn!zkTZ3hf4vGCxg!d}jKVjS3Ss zReaT5{rIN3`~KdfnXNGE_T4P~{f_;wu-$A0T_&V)?hryV+W`-V_rd~+gIuO-_eOKX;>g?9A0ka>B`Y;pfj z%&}~`PX4rN^e1h$x=#>qs;;a1+|R}Nc0xcmFZ59BRe=GnF>ZU07Vc*dL1s0M_;Sp_t0@F{X@Kz5m0??+G&Z zQ5mpPb?G6WAGgmr%hv~^fc}=*F=lOQ=5uuJ-BR=+1Fk0pkT#UjWFe#wB#Ezw6P>tg#g^Z@~&189tDJfVMEIu|mjNAHGgUb<%VPxj3%0LT|6Qy^Wn z4B(Pj2avc7kBMPIrh-4uw``$9TUD#kk+V@3us~sbF+YGwd%Dz0^beuKt`=u3bA=F= z0qY9+aiwwCm9qdK39QV@{$PF-WVs9=|5!7=&}(g-9GwwG zds;ve<&=Y4x2_e9+NPj>44UYXwIqi(qUBG|JKeAfTdn-XmXx!q%w?A^_;_yYG60_H zZRU?9>@Ut7`zHVgRhR_F&FeL#ho;UTkAn=rI3@$gTrLBMZI%H$Kk*zofZjTD0#xGq zs2CM{^SN!dy0+|NpSQq-S28Cb4iS^6q*=(XEir*xoXj209Wvn1*#av}R~-e_HKaSj z0nAU3xo9$Ni_V#CDb10(-gV7sNN|0V0UK4vmjT!yWWepCeyrNel0(4ku8Wp?!zPVg zyuX3+7n@mlsyz+uR#}hj0>D}QhQqh^sa;^nZUA{3 zN5RbfEZUs1>af&FG0f4E21F7v4?TC9&I{m-AXA`RaUMXG;^FlUyLQ?x4i7Xl$#pZ% zl+6-P1)7s0>A$&b^}4n+L`0{^0Oq|8U?vQfXN$SIG>gkfF-4gu1DJSLsij9tN*T=D zeaUJ{7a*#UU25eTP9{gD*ORqTl?=KjG)Ux^kpYA>%K)N+Wx#HGeuJexU`~@Ma4jqV zX8-UEBbRQ{O(~r+J)C+g#Vj5+iUovE685*Ok%8Nu%^m963Fl-sc^&x~&tP1a(X+$R zTn_O#6s?S&(`LZVuFCisg~tlWB?*399{FTup9Z$QacVXql}5}YM55w9}-U~nsV(v zb6Qj!?*D~L4>n|b_3h7Y)_v$-W-IXa;1}EmqYU`EiP6lM-e}O~Rqu` z1V3#lujO)n0GUbx(kMTq;)qYb#U#-QPBff8C1qgd{_0@u!FL$)aFYN-w4j)Jxc=KG zLE6i-doO_Tn^K-H`ulgziatdvayN`Nv9Rr2b&f{0uKBd=av${PyjW0=T$J;q<6JKJ z*rPZ-5x}s&#yu?Dj~~SuV5L5z40x=!Kw;;q0!^$Qw24hu{$i}W!Ab&LRABJghljf4 z3d|L2~zqG40??-u= zO_bwLv`lFqu&K%)TwzvTi?sma#+37$XL6N<#a{0jx`P5@? z6&?!xfB$VK_0L(+g9RkB#D%n3kfkRIHu2!JS(Wm{WUxP1#i9=QM+{*MuAUD}2FT>duNG zDVCmemTFm0>lzWY%_~cQx*TN+pGATqbo8co=YQezmAxT|H5u^X(uU4l5`|kM3#_bK zSpv%D2hgq-klLTJ`LdTqF?nh5jh1_alcNkkipzlJ6eA5Di9}=y`)>J-kzNp-mhw>i zt*20u4u}*>xprn^;SfzfJf6`$ZXkU(mhLb^%`sde=4z;LV}Hw+W6(w}*Qt8$n7vtP z$i5wn&KIlB`fg5l{`wh!edBQEEw8olML_{^eQ4Imq!CZGH3!MR@A#(~g?;#=F;?(J zo4wP$>%ND4elY-6_0A!IMb5%*j@%<;2bWqagjS5Z)9-V_dB@iR1r0 zp#i>PbTZ({wIqX427FozipbzmKFdbOfmMM~762>t`*k^YA|u(qFenfsCsk^T=T5X06lBSTqGLpiB+K@g z9uuqP8p_pPd0zIne6sV45U*lq=XPVB^oUgcVv^a4_h~S0`B?ha9~XymfS#~rqR1CY z5qXp$RsE)${)sQPtBg>ZNH+?llnqgI?H8X$`5RGLVuRarL*Jp?Fwc5%tSh=-U#a|_ z@Uj1)dxNT%$^cxQ)@I*2;J(5g6xiU_I%Q6`Ezi{}Wsl)wr+e#*Ee3vx6G|~V0cND7 zPJmY)sOqLA%+VFg@s4z_Ng(1AH~>k-Fhi)48{d<9)GwQzJbEPUz@== ze`MR4?|rudz+KFoYhUMXtIp3ejFtO9!D`0EiN#z0%Jo}zM->*6W~LlbRQkP+ie!l z)u~cKm!(=g6|a^Q6Kl?*lG>87O4p7t_#_y#bC_S_)e%v}(eF6`q z5;Y6X3N)o_Wshn$s_j&+ zWHP`-U8j4yJlXlncHxpufX7+EYSX*s<@c{}<~=eBRo7oP%rS1e8KZyzm2 zNo!51K|sEYiAny!@$gt)@U6+FE${xqkbTveGyl1F!;X`tbATj6Fx4T7A(yU}EK|66 z-Z52rR{P&KuCKDbMXC*hG4qD`x7uNe;A*WNlVre_zY~KoYDM=_4ax~g#?%PK+knyl zkWvXXdP^kD=lmPe3q#5z zT}K4q#z+R>t}FwPDl!0TpbnrjH`V<~HR;OVi57g)FwrA>QDYMA>zeU;^nNa**q4V) z*}Hd0aQVm-%tu@e?rrV%(r|+7W{g4;HjOqG%br~u6p#=*k5#I&dQmt4=O4xE-r;d} z)P;670HC^V-?;x{;5~Z)aF^M*YV(|aZEpa;d|c-lXOs1Q4**P})rGwueyXYMD>jpq zHU{G&?-~2Mo~i)~IDOAun$Wk}ch>=+O2h1;lWuOgs>up0pP5s`)=coo1_d02CXRT0 z?c+l(QrNpfs(`+kgO0qYnUAvBz-r0hO*y;33ZWlW8qdG^%{vHyO(*47^1G7&NNgE! z=He(Xh12gASi!?WW(8j?8SpNuXQjcaG+QU;)1G_PqB`xGhbQ(^ z&rCadHn=os=57F(%sV`eO=@#K*Of+fF`DhabRSZxz4n3d<+fG%^-#fI&VvMpi=W5LqpK5}EW?pv?4{jXyGv6a9IvwS&OQJ2~Pv=l=CUVbfjt)nHs&py8rX8~OskL|Yg;sc((e4>TY~P|P$p9PIyoJOE7p znGOD0_3bp@uasr1Y5c=a2xjSuS6#V=`a#h!|OF<4BAKa`r;69b4C=Uj=}vdCbM=dTDS^0Dc$6 zFpqrxWx4wuKJD0-!_-`T`tt9~g@|DQB*DB&!8`u#r)gd`Qw6J;AO1dmy_P2GAfI9) zzq7Vq(HWh)ycHCtnpZp?Mn?m1SRsI}U!OJ34t@*(+k1ya6@UEh5vGa&4}Lao#-(z_1c>&>-iE_-UHuyNdJ)lI8Ms|v|br-{J}yWc4iBJ z!!t_&7cSDM=%7oLrP9pF)gt0k6t6+37V=n7W={axWYgVB(VKBuD#q}0m+O@y_G%vq zl5@}h{7%IUvQwI|R|bi*V)x9afz{V&fGQ1^y{{BAZS6Jym{T(jyOk+%XeR*7!pu1v znwA;LUx)Hp)FqrU+d7~}v@0l}gC`DYc=KUzuG}#Sq&bQzzj<`^Y1(sOqw4<8#og;e zHIt0XQH86)r~}BIR&@soqcTN_YYf8Oh?uRc4jQlXX2F3{iC<89rMXy1V z`<56Vc@h*zK_LUy2Q5$_b(~BA@47s|M@y_!Em@|}BDr!8m)XPOvM8A;UF&7#K5xn7 zPMz-w{i4Lh2jVebU?OS9mY9 zmdRT?o2)~D8Bwg@gmw&++IhC4kYuX)ZDyW@tg@8o*K}=ryAK8Uj>ZO!BY+HG*N_1( zZa^~_Wx&u_^bxk%v()>XPkhL%4^@AZ0jzKtuvHyBWx(#1g+7o4K&G&-Vu8Z`Nqzvc z2~hnC<{d=#kQ6QDlg!uZm;A`-X<-hMDd0pe1CEz0uyRn<1)0LiJ3k7t5VSDSNt3E8 zXT*@nS)FS#wL^vcsA=eMFclP<{Fjvt_%o(_$aKhTwMk*f<`cxc4A}GeK=#U<%1f88 zDGUmzi86rTKa(l;`-uHFL1DF7j9&(j{v@nU%LyJ!`Il#-f{TC*AbvpxJj#kbWI&s< zx%;3y2vz=vM^SlMcG}l%0Wuq8S(5=AGiAVesD%-snuttc)z$(9VvA)83w^uul|V5w}BOL#&S1p}w1;!^lj5XeMgh&`%k9eSqt~gTNq&ib}HE9(K~9f>v}(N+Tk@VnWr< zSISQ5$lK9BIZYQpcGRAu*JmD58Mu;*ynM6L-}8qeFDnS+2k9i#q?%Gtj=ZfxSe|ad zN@`b-Jt+&sV9D%TnUcu=D=mR8NAqhuvgZne=4{!~J-U$`YQ=Wv$Se6rt zN;hJw(=}zUzMEj)_e$oH21};!ry{^seOw(t%363P`7%dlL?z@3m5Hp99TtDu2x4b` z79mIQ+yJ@YE0Jzg@{zpAshpY023 z0KaOPm7ARfR`8*aDR88a0k^67u~Nz@WM`A-VtQ4|21R-nIS8|`SWVp$jI@2tPmu|J z3Oi+&;@Z5yc)6Bq!yZ$4L$=skP+UE8jbvVY5pfijDMoO3z^ry&Uf;j~*M##NqYsYz zX*mEml8r0VpkwKf!y3?AuZ;OwaNgr`N*KEWslkp1S_cEGJr&%G5|*! z89?3w8GzeGcQe@^86i<1Z;edhc0jxm8Gsj*3?Tkd2H*-P11K&d z16Ca@bdK|wpwMQKuQH2#@g3kaavyUIz?n;IgK=NX@8w$g zJko$0%CF>8@wM~i1uwYOizcK8ZBNWyHNTG_aP!k z29Rh$1|S^6eqayy661iZk^xL78F1nYf%IL8mE#_TYd*kW3xG{I3xI>VX~}&+lM#S6 zIpp)1Z5zS+Qll3e+*j9D{$ig5j+B?Gg^WJFrMztNx0PBXtFL?L5GW{5Z4kSjqx` zXjUC7=Hq6LBqfM6x^&93rm3EJno$rL<)fv*23;{2(M&P8O=CZW*Na|Dw(d=cA2$#& zME1<{<`z22vhk)$frkybrobiud}y{7$$CHaOi|_G7~rAmP8&i_2etU|A^?Q{tvfaL z+lYZ?00p>yPQ_HF{ywPa4sCNRpc>RyuA1^9^^+zykTrG1zPjDdH7y2K9@~{)4aOw} za~ieVwirMGRWVtdeSB=KiJlxFWwtGO-NYr5kxt2TN|LV=Ipok|kcz&bZ}Tr3&hd%P zp3MF`0n9o0_=wYETQIjOp#mkpI{$sJKLEH&%=8#OEavlW09O2c8H`g-HW@jlBFu}0 z0!{I$(G)|P9+S!3acRZ|q{folg6LrKgtWr#@9gD#X!N`?Dy0Q#WlpB#f{M?YXgdC$ z=k1OEOF);_?*%Y6KHH&bxB37IM+jg{jm?W(-1xJw=Y_xgh!Md(V#{&8k^zY9ALhPm z+`kjGw~XL;8L)aK`j7$GhX)*AGiyt$Wf&Dw7xZuMaWrr~vEdw^vYw016jn87C>!f+~un=HJef9Fk%vODwZAQ{ro!FeP>cC=)O%;6#4*$&@N3 zi{_X)RTYCh`xN!N8}vl&+K1=GCsPZ#OH-ytQ*@k3bgpYjuK>9@WWckGpoo}z;C4ZSQ3kC4vq0fAN&wAgoO$;0*>tc%eRlz98?r??w)f$Vnm3m7S4k=sm5(JC zVP5-Mbh0aF`12Zzo1+uMQ56_oH|hOt%&Vg0Odg$)KpPYt*hohcyGx5)UvzWvwWmT> zcIB){y`u6h$=UIAN)MwO2EldRGG{AD7g3k7rq|&cF4#e6EBjvIn_xNamj@!KW_U)C+IZ9;KTs<}z2L_&M{!`jX z0N89~z;UNwr2{CLd}wMGlLxt%maYl)207oqYsV#93=h$p_i({f2CVB^09?3WrX1B0 zD{M0T%uheeS*e{y-PCOmMut2%l-bXs>rd3YLiB-*#Mob3YOQ z?&t@4&$EA5N7D@GxY6_dY6~g}OG*sYg3U}O%bSv)TJ*6i zu)vB!C+4aRJ=Ij-{**a^g4EPcx638*?%c=I)Mf?4sf^_>v9%;e6Be9?|iJ38g>jYrJR(qcDi zO>k_*$DzGegK_S#lixq@qX8c81?O2$Zohu;^bIJGHh*TX#uK`o(k8asEI~2tL`195 z=6yf`SAl88x_RGnGJ74*V z5C{|$QSB!Dv9nldP}sZ>K$q=L`qiwP!U1xqR$Tj|C_Kf#V@hf~UFpY)hQVWoTygDN z795ZOqWSbbrC!H31OV?z8Nk7$as364b1tm}g*`uQ8jRH!U3GZ4m_H>OK3vpfz?MII zUJB0>Vz@Fz!37ooC~h(Z_C6V~Z>(p<)}hBUHfy{TfGtK{8d!pCRQ2%O-Ks+l{Lfiw zsC&fimqvDKSBPsf48V={)}7|);^j3pz>!ZOgR$%BQxy-!|HfG{_dJ%ao6a58Oz9Lh zl$0h$scXgEdVf4%M=E__~_17 zVg<*mJV09ueK^dw0N`d^W(Ci38978Ha_WfJ&hmJ*x`9a-0u-USk~$^fe6 z%7C>hOJu;FA1m;Z*pw{9X9k;%C6uk8g!1(4D?o6b?73^e-~0HQVF13uiE0a*ZhXR3 zR0eo_5wC8T>+U3*9n-<7^n<5XIlVpJdi0o3tFH+5THzx_fWzHo7Dk9#RCy@AS)hOn zmMI{EWdN?VGJtDF8Gt{x3|M>XN5zs_`LM8|YRwYObdpsHsjwX7^fIj2qOnsJjUE23 zsQg_~`J2tOg0_O;j`eqU?H}U~z*b$1+uH7p9Q_kN88QmoJ#9^X{WW!dVNO9`2zSTL z6IsbvHUfijYsl3C*Gp)7xu<$4-Sn!Fhf8F2^yh3PC~}$<@+}wrNo8Az*X*e3ACX0u zqUlWUX-{sD6spWSSo`!$*r<}>;8WB`0Bi2va$DApH)G>2bXow*JKudb@!eNWK?)+z z?H-;?wT?uKW#1-$_t)kwyakaW@?+W6m<~k@qXEEIap|lVg%UH$gJ&B$5492b344o)q&ymNaExS{-NFiu>4tkpkH_z{u47~3iqfWqqeXY|R8q^3dr zzzRhJWWXw2uo}62&f@_qFm^8`06xydOjRLSY3WG%KYZEVuG>T)hcXua(hbHuKoP-t zm@zB7%3mHBi!Gna24i;X&dydZwL#)4H2q|^moH`s3bLt$XU6wo4i330i%U%kGplB5 z1~XNvmNk+3UkoC3`=FSzZ~1#;m-iGu%N{Ktg=%9^(mY%erCQ&8_^1z*8!xKhMot5L zQfY71P2xWFnvIzL{45>{axBtkjM-)_7e(y-AU|I3?JeU5Pv>eajlhkHQ>Bq70;~KD zBW%~=zU%HTz7^Kex@iyvJAK#$kK(3lnKi(|ECSF`;N+zf(aTQyacI`TOGdS4R5gc>?nd!Qb zA3d|vb);HOWU-@~hqO4cltgPjgPD+%oh*Eh3BFf;Y zLC%vw{=@kRl>vCKQBhN#{+VmJAZYrplMPoZ;II&}b(l1ia)cI%CGr)xsvE5fw}s%tATwW=w` zCj<6eG097T^dd5a72l^N3KDn$RBlf$*(npl_9O$yts($z0?2naR;sQ1Orr|F);M0D zzc^ZHVKI~iCM`xS-^*T9Ja||8y?xMX-%@6Fi6)v{m82Sl`A<+ zW$7E7krc^;#d*$&Tr){nuA&Q#Y1%g^IC6(}h|>jOcgZ%K0H}V=nVH^m&}# z<_FL|K)YLHe6&)+iGAgGbv4KgeAL;La^d#Itdd-RViOaG_ddtp?=AUBJOKd+=$8R^ zE;y;KokW4a;D>qQF`&Xokv`DRM>g?;`|{$fw=#Pth< zQ3eXDrzsh*Q4eM^;LaC%URL(%b}3U7ew&~ zOMDW!8U&<8QBp>#{=oM-i7ES*%`LnGyQUTZ#NFz8Bvyv$7AT-t%M{j;`B5-Ui!Lu| z9fg@Q$q3tD%e)~oKnQ{iz_2F+NM9iXj{Iqa9Z8G>`ivs1UCS9+)aMlqQBj%2LRFR zIfq7mZhD447wa4f+S+2?@8jRT+w$s-~N2c+E1p^SjG;8p!I%79+vB&^VevmO3XWWge_P~Aw`as0%jLiGu zr}yaza#+;|?4I)U+}R-j;L04^$*n_CpW6U%uh-k}*s{9|YXN{d8Zq0Y!hxKr01$dp zzw7y8|K9Te0Dl=7fNx)=5v%O~UBV9x?8PC%Mh0My(E)5*rRxlSKw@qx z1^xEWkAlP4k8Sj$5En0OUC8>Ib(}JKgYinwGA&J=YT#L{`I|QwFYWdiKiQ!q0L=1s zyGB;1lc`Mt`%uA31`x3-1BK>Tpzy3LfTjgr_1N4-vs@N_Z2^GAS*Ec4#S(>jdn8k! zijWK-$+ryH@}mmrVA61L87BjX`H=xkQyFkwV&OR)_#8*)nyMx{MSGqREbdI(T+r>R zrjom>n|AD!F{6g>T&FZ+YpylbZV90TpeY%NxqPxr7uQGEETMgPgjshfwP@@i&q17= z<{hSr3^aywH;#B9}J3xV3 zwv8QHI3H;J6##MyZ1}n2v-fk40l+@H?orx=nDXrb;I1g=+sCvXg*AsBY``n8|5|W! z>3>0iRj_hN-3~8Ga(#onD}2v|DVvKX{(cS=Fwe|*++#+`0-AXSyW5D+3Y8|i&I1Jw zl(Dq4*jlK%b zh)4} zH40cZ6Rez1iautaxMF*8YA#XUOaL?9Ej-_2FhAk4$p&BXVJ~~ky62DqR&Y=pdg=9* zQZ32?K;aGwQZkeHde`r{&SlC`P5En#-@Y&DM4}k)a<|B7__sB`#%EMZrXXNR~Zwh zAjLD#lt#{lQ6{>zNldKP%A`fIZe1|dWP8b3_G5PM(C{5ZTj(mKNgxJTs zwHbv(ren|C?AEweInIidoEBz&YZgE`Y2qoagx(Hq*JElo51zBNDmrvfZF!@XZg29s zS}m2_r#VZGw>k0trHFN-R4KpP~n<-PgIVwRE9UzA~ zi5P*C4KIxtf6Lk*T(K5qz-Or#hYT3hgS!l%=AjIDsAoo)$Mqj-9L5#ceVBBp-#XJ zjre$Lz2fS*7b#cCxQ^ZlD8IN{$4+eljF3W$9+PUWKU;xN#zxexO2P-_j1;E--`IW>+ z!giZ72~7YXQNnDeMGHQ@83n*0UQo=~k(Bs+EdTy&#kq_Yz_gxCn%pn`3=~+rQ({Bf zZ@&B=0GqLbV&tfPWm0~apaJUzF#LUoEwQb{Zb*_yEw<1(CNYXk9ir9Xo#m#iKYx>x zr&|>bHBlT1g^Gxf1|?D@jRlXu-(E*SV@Da6Jiu+yNA}!jYv%pQl|%NlaAeDJ{^|Rv z9~V>K-kcvmFNAKa6Uh05PW6;7IS*qdhHMrnq)Yqny(fN+! z9r{iws&$TI)Q)-9d!2L5BY0gcIo;Dx<_up?Y`C~L%zU}&bcvbs&^eA#X&>r1@7Tz- zeMaH-N^~BRF!59R0B%TO05Zo!o}PBOTJ3URWy8BO7`uI{W8Ju;COP3G)^SUdt(z~T zf&vRAG^SN=|7KhzVtruRx2U_SWSO*|I0bnjhM4+Nb`QF%pjsF4<`kMP8LIkHuX*x+ zuE))4Q?GylRAqrAMu>91rsbvAwWGd@b8XFFlmS@1WdIIhGT`u7={+wiq?VB>;3_Eq zHXYsh49IUo#P!0~r;gRuHTxBB61vN#h|nHI8+ZUf;;IdOzrL+?|iC~lEuwSdPJ1p`w;IZgLl`Cq}s=U-ev&rqvZmR?fG zW!x4GI3+q*emC}FTQ*B!=6O`^f7 zcsIdnao3}@*7Vopru$w2%(5Pv-nruM8U^2V4aS)j-CoW<$%n%FfEqmGK!+;3yoE7? zws&%1ijI$>VCWdC<3hRNDDMn4Cq;Vl3Kn8F~938f}ug9KN=mS^2BbTo4Iq8)f0O%G2yKPAv z6Frmzv?r4u%>%e8=SZ$}JOS5Re-#PA$WZFV%Q&zF7H+15MVaa{OrP?&$-ri_RBnZ} zcFcMoY@(t{fpmCCk5gJ0jL9#2>plHdtZ;gCj{pk*JR@}!OwEdkWJZ$;EG#vd6)#ZL zEUBSKL|l9-2@kTykaHGXq7ueb_kYk_?B29rL}b#Tk7~`)X(5>%bi{C^W*(j5vlGlI zCh5~h?>D{uwQL{$^z<~Sdn5xmo0%d8-nlrFZ!_%Ed-L-rXZI>ugdsY4)1xl^l{p!X2+TPlhKJCOmby~?C90&$8pbGF+4;|$bkJ>@z^?m z-VRj&V`uveN-9Wc?GR@oHS-D2VrzrU0C|f31WzpA?el~{Cg^PW5@CWakKw+u=>OEo z0kf-oy^9eSH5g?8SLreUk7^k}X#g2O zt!Ej)hAacfu_y!3QFMUfCZ9(0BaKPN&@A$9q+=J>lCCXH1c-3~u*p$mx$+*^ z0i2>`z=cn?ysS`xQKrx)J@0&g@|M|rmpwVq^69dR52~-%tN>W9%U?FC8E|Zy!hvlf zh%Z|{KPtGv-TMF>?8LW>IrMMxbZ0JW6bkh)+dCz(dg%jSK>@8^22e7#Q}Y9N;_j^n z1tyXV;7%$JFiDI`22glJ25_;^vSX87g~sea=Q!xdfI;0+WB{(VGT_)kj7kPvyITO9 z8dw0lf-C^IIm*+Ax=dvN7bG&^tI8o6a8nPSG5{|H89+f!8L(ANlQQ76*un$aEzkoj zI>jA%Cn%*-vNrEU9!-THztfKm-_&XEU;FEhl1aQvHhJAUh)&kms@wSYhuRijl1oae zKv#Hu#K2BM^JY3D)A7hJ-@o~QDDoN8F5MQbIP-VqJzW%jjI|@zFen$AcjNDR9v6od zQn7MZMO4B9#1Lk681Zmbc`gkYg96;lN9T%C5h1&VihYA#LT3svCdWL=N^SaNTP@q1VB;t>=OQ?r1WA_~AT&s)IMK;n(fj zYQEdD=YSic4oJ6h3Zulw0ZEv<)o0w!9G|kA4}tQ4H=|R%NdNLlD7Ism#6{2miI!g|5vJxUpK5J0K^&hd|tai*T8-N;87$4 zh&u@V-lJfzQ4yd(2#pNDwk!j%#>s&F6@{z8mER<`zhE$;hY|FH@Yn~H@wKZ9}YlJSjN2XM8J0p0_}6OM0R-kcui%_-PX zRT0=ct3g021(IutoBM~2U3dF%PcXMtzeHNK^(+5b`VN4#$~^w3hc!E$=7#`fIIl&o zGJxviQ9~+}oiv`?97yPUQZA=ag5H6i%Ghc$qg_SA&E+QS7Sl1{$$!Wr)xEUbuFoX7p^!rJdhn^zj8PO=Bq-)Qwz^jE`w0Nt zMhQSppj^yR0P(pKC=)9LHpqZaQ418->N#1?n(S*OC}aSUn=;_4s{T5Fu6YAlab8kR z%?OawwV-j^sN1ug^Vl{-j6w!%ECKMWmnp2&1G5ewQNzwn@$8Z@G$R>BfOU;%gh(VV z1I2?ajL@f@1psGcnU#ln+?D}^*T{gKx{U~cSyG(}vWyVnDHIDnfE{mGBzqbTW=!_l zD6-c^86Nvvp4+%vzwqG1;NRA*RT{FHiv0RVZd;$K5R(F+xVmNTpXS}JMH9Yk6p^Sd z^WB>|zZew2KQl?b0y;rV5|CxFQs>X|*WoYyn>Ge_x3KL5b1TiXCZF=^IMPSw-Lg2GDuD8qj&(JP~Z8vyIVf@1L4m%o4C;Q$AiiciMO zWIFy*7>X*Kbxo)@tKS9fz@M-EZ)pzKz1T3U&Ilme=YWmt*NdDf0oLlu&I7y`6dn7z zPuf|hB`AMA%for&`sEjIGP{@FdIw~0`8EApR zQT=2x1-u4i0I?@BfE39x0CzkAXfj#nKgO=|;>;QBCa)P4k~gK`vMQ(X@jFc?aH|-5 zeuwkoX;!W5@8#F2nerE#lbuBYhF~+@S_)>WMznI_+xSJ(#_+bp1aEiwq~}G}*}DQj zoa_ASb;4ZyG@TYPD07ai|8dbNp*E0dDcF>m#A6x**%dP~mCamNGNwj4SCMFVl>LJe zOC-mz<0L5o>Y;k7U#Th6_7_thLe!MWb(1;aqxb7|D=VlC+?Cuc zX1$tAQ)=lMkWE!*sNyFTG>9c%!07y%(Kq!|_Y@sH0UoNDP5-v_ZILM(_&5o0S0%O# zc&UaO9l$)`#CxZQV?KgnB)V2?Bz)Q!j5>f6MoJ%I<{{@nrYz;&+5(3{W%2{4en~KG zcFFOSSwnp(WZ9#yhx_rAhbtm#W$xjRNV{VzlPNpe zJV|oVv#t?)S=JVSVyeC=Qxv@>DB{OfNSt?Uv^pry@QkD+R*0)jMs#d0uQy#Y_8MpA zPfxj8mFe9wHJ%7&?>8J{$=^ABzj~ZyV|hd;OoJfzUpcx zp7OxF-Y$=;X@U&u!GWT0XJ42(6|Arw@2r0Na+?u{IUpyK6N$hD^R?X$FB|+>EL9o~ zG7iZAoZuEUZv5Nwl84Z%t-D|~=gIgRIU}6`AjQM%=bQf?*uDh-$8UmSwmD!x^e!$A z*oQ^plZm0%Lf%)O1`6mC6FPs2I`i)Z0LWQ2d|u0n-&gz_04x~&wpF@ScQe;6SRc5n zi{0zFx7{mkxUgVEU0dz3pya=t6>Uoa(Mgp3IFT+6n0p8Fr!l3e+mfy=amP(&9^kIR zkFKpBrT%K)fw^0468Ap@-D34Jo{LF|kmjTK+cc>zO7 zF)En?VPG(XW1<5d ztIKsmHYK$?i{jbrB`=^K4$<_(ZI03pYa?G=*l=?4-znSqOPZf1)=+z^+fOqhex^b@ z>WQb3fs%ZKFc@V3zVk8wyQB;_s;Z|9AX&Z)6jDW!4xm&p zxx-L`NbE%?E2kn0&rsqA3jn-mbo}W(`MFr2Kzb{g0@W5}0F~@?09lOMk;JA9FOifC z$wFr~kM)2uXIyNRe`NDP*f?ms&X4eqx&tFYHmac7ll;HpLk@jb8nU_IeNS*-)7}4r z=X6ckKs>_gA+8-J&N>YW)(E>_-bOT95xD||NfDkZMJf~i2*+00!aVb&G2!z zI9m|lQcVE;#yDm?Ilf-`i&2Q#WiXm&9_+YldNu$QI!P=Ve`L9u_nTCYVDkWWL+BsO zDvC2VXf1=Gt|=Q1pSlL447jM4TOB~cyEQpKD;aSWe+PAvNUgl+;yJZiGnUz&uH)$s zJ~0i(xRnJfOVwez(#T#Wx} zFvid$y;E8@wjoAQr(@nqEn|0s(m6ox)E z)~D^W=G^ebW@53Gg8Qx`n>G~cS4a7a0myo>#r(YQ>0<2wIIR*COLlKGoxGyGC0O1^ zE@@cJAz9le@iK<>`Kwgw5O1);3(xNLeU(E+?EoNNRR-+$h|XmI85YuBPxGDq1Ak}A zb8yi@o){8fA1_$x0A?J^pv0@>F&|2fsOe@dBn`#{+dKc>-ZlHGx|VDX{Ujbt27J}MSO%bS%K+|>WB?ccG5{Nq40wKLVN|7#TL5q%lv#;oD18T# zHm#|$Z@S+5Or}K%0U5v@g$$r7i44FvB?F~$EIbhsI|~Y~Cv#&I6Ds0PoxY(>TZIMt z$2{J}>b|#o>Yb8}Dz{P^vNdO;TD5lmHl)p@uWJCn^0Mu`m$63bO#nEH=LDW`X}aAJ z0Fqv;X;FCYwEZsu!1ys|>+^u=H_iZnukh@`UxMp5*8~^N7}H;rGL81{3JN4WnbOMo zkImiXl>vD6$N;Qdc>q-(kpb%n3w=1pSpclISpbkiQ1rp~$Nc8J6Q3QF z?qi%X>U@;E*+ot#7V|*yAbBKuE6-zC?62WCP1E34a0K`zo$LCV_ z-RELop=c>OmjUFMkpW~YlmWP_w0OBPd`Y=|cn)YoG5{|!8G!vp2COs0aAlxWVGDrI zM+*RS5SbOsW&+?F0=L`hwM@lk;@E`Q`fUGHy2-U+;BQ@N2%5tIQHp~!`H7pzRZ5I* z?=HKFU%mMWk9`-(HU8Oi8^t;lH|=y_wc-YfZ`>hzDiwN zVgh5D4ES+Vw81C?1=STM1JKc8QvS`01T76@3Q3G4O^o3dHlSS{Cx*WOWTde)|<~%aj;8UXyJo zRl0bv`Rm$y+74nhPYhg7Rw6A>|VLZpJhk&_`$3ZjtZY3rxHF>-flN%uUFIvZ&EFqdQA4Lk52>HJLv6=;r9;DuJ+OV@iy7o`YLE)oHgJGSj{Cwai?HumVLr^63D?G%Z{~%BpxL~0G zlE5=v4W;#bt!2krgZ#wg+&(gS=peX4jhB?Kv zT=Dq(X92(|Y{cJtC;!w(+jubjhnOoK__=~7C~SNMD|59PA7}2-R;%MO3xKM<~(jPn%P3Ro%RWjhHPE8qbPZpz+0o!2~09Stgq%)AzxziI16xQb~0G_Hg zE3-nulsv#O3#=ekWeONwWk6g2=Y5XS>b<2*0ly*{fMbUYAaYCwu>HyaQd7tPaxBY$ zR>v;)_aI$0lwvWcwjn7D=2S{1V&TO(t1DFIiwrd~VC|}BrEIuj_hRc*^D-&Yofchz zAo^jqm43KmvVpg27uD`qt1+dRo*=ufDOM*A{T23usb9A7}BwD z-+S};4$C@668`Kt{a(5Iy#_10KLkbp8|TuR%pRcue+wXa=lc)Fa_s;>h3u8S-P6XX z*;wpU8<-3rMW75IqBRdNU34x3c6TiRKD7i8n(ga<@&`?ufGsZ%pc;8)z@C3xigL`& zismYg8l6e4LuO@ND|*$A|5zAFnWh#1+f5b#N3M8DBcVPtH_qHcBmh^Qx>1oX8b-Co zl)@5W8E}D?+Sn^GgZT}G`BhRlLL7Oh(8-$8;!)-R?Ycw9hQ@%*BQgLpw+z6SNCuG7 zUIv_0X)Oab>G?eXjSBS)@=#cM$++4T6ig%(o6LR+lM`G14$AU(P&#FQ%eVTaxt|MZ z(w=)VoogDDhHOQ`d2mPe6#vbCYXSs`m$n~!wPSIWUpWQY+`>)qI5i|%VkB@t8U+FYv&4Nv|70LNKU&hUqAt4gbW~u=Dh38 z|K}LK4-{}Fo-=kx&4ukp0`Tju{7Uu`zkp7e7ajsY6~$R2rp7EfuL)o*%<0PtZ0mTM z%O3WCFfC57ca8Wws5MxXDJ=RJ9XsfkGHLfTK>ge@fK1^dH}?5FBV{KjAWlb&wk>=& zc|HIev*=@3-G-e~`bGh;jTFGp=HBNkU*QK9He3T&2@S?U@7p>a{)LNU2H+%;y>?_! z*f}Fu;mUJBmjlC|opu6X&G#*XF{Qax#EU&`0KhVl@Spm3$_^niaB`*vKz>z$D z@w#5KO>aSgEm{VwR3RVR?%|?JJr05b209(U{6UmJZ|1qy$&`_(ihvla!Z#0f9RqTB zR`-sa(BWx^A^>2y>0V)UvA6So0^q`brBZO?|Cv){x@I&g(^F|?!h%7Bq0zZBtXyv zcXtQ`0>#~3N^yq*ZJ|IZ-u{r5mI7_xvHfoD3H$QLahK0N&&=+QJoC)VGnKyv@T;PL zT)>zGfSzU23co>b!2qf`1z3-s2gqiV#RATq8>Y&vH4GHEj5Wv=Lg7&fME0V7`dp`sM6zZ>% z`g+T6-GA7v_d6Kxu1Wgk!TIA0qy$^U)Pip!XX8fZO>7jOmdZ}a8=_QLUC9!)m&Md< zS#;d?W{=O(^yj%j^vs2w`M)m64HlZr?p^QD=+sXD@Jda3T<%QI8S=r2V!lx&KCI06 zExopRLIU&7R)Ec?%EJg)z@Xe`t`44Xc~4Vc+12t{i}uW+%0rcPjPA$7zUuoyV~=Vt~0tL3fIP*XvJ*s`2h9?4b&sWi}Fx@Z9GI~xE8qeo=Z!9W71>RRQJ6;1@G zq`-E!fhu$WRuX(^D{Q9Nn7qf0-J@eu{Nqbv%r%Q%Qa>H z1vg5Micd<`+NhP6y_yZ}_82N0G_ds5kl?Vr`2gIWszjG2j<#Jfy)b}zf&z>GTDHmF zT^jU!5~y`_Brn+_PBh<3t}dHfw3yr6lhUr>JtOZl6WAVe)_!)3W?dsYXY@-~vPX!n zX2yUM`%X^(3Rx%;uOueUZGYCH??0F!;rK#HB&{BszA0P!3q(KWWB}ZyFx#a-Bpjp% zgqh<9ugr{VKM-j+RZyxZfIBnxM$qb#riG9&WhjZLm+^a^?l_@?+Xeu~f=AdMKDRF7 zrIcXpRIa$1x#9_StLA^;T+uSn>(E5$r2ytQ1vr910dB7Nb>*LG%^h!gln+nn=D+D| z7?$T9`m160I`3`t{9ID`Incwyze}XFclm3*?nD=-V+CA3OH>f2RA=<;8*HDy3>*%%9DobH+fGgXV#x0H$Q@ z`BQddJ>_!{X-K=uY>6&A^Z1gHlR$^*J8r4)D^RiL`*zoOxzRO85A02Y8!faS>);P@B{Fpr@C zuYpBnkHl+SVKG?HdpInNK3B5!>knHh;qI_#c}tJLCp(IL0Kn?c1>PkBe{|XdfU-Sq zRPmw*PM4K{ZIBFS=L2z18Cw{{&emneN2DetYwM28mJuH#%bc8P2Q?TMP~bR6T*KBp ztUEe<(qq|Y^YY-N4Sxr`&_9SvTpXc4B#VQ^y}v zU&&-lvO8hxD7pl!Ul%!0T*ih!0d1mFd3bde880fhK|JdMrTfEH`g$FbuNT$(Nc zU%@&ojythZl9E(fUFE_U(a_#0{-1W z73MeC^>*04KFjU@N;#wn>lXs+vKr zoOT)j98*bEVRH%vwsj3uIqf$9_Pq^2A8Fgk7?MM39jx z#7v^9;L}t<)L>6Jy~Jy$zPd0#J|q4|>dL_yyZx2yf?Aia918jn#o1%CqqS0R^TSNcd_GXV|dm^|GR*F~*9O zcXQt8^B@__2^STghB%d}b02&)r?DNrZBvFL!gC79+mk!kFN?&vf&!w?;n7xsoHH}S546zhB;qz_FAksF*P==nGgtXuVKzMxl@i%ciDvbR+#Sp&x_HjG zPAp$sKE&eCAt77>cEiosW~n6BP{pz+BO~-`w)?QZ>KKhGW+{ z`2g6JR1)*1WL22nF$BQro&s|lPV%;CTTcR3UK=GP^y8sXsNZ_lt}|!)&(SM*z!Ifk zM)4(6+fUVd0mO8k_AqncnTh3)q}yaAVFg&r)PPxA2`tWY8moBflBvrEwyu-eO3JcI z5I%^F(uVOT8lEi6kJ(~%4SNX1wNWnx2>&|SqmF0E^huglpH3+(DlOap(4XBc8yD-r zZzi4#d$Tf4S&M9vP)vfe%i5&#lW$cXCyaBy;WzlC)W(a0*8OF^f3VOL_eo2}E1b>w zB*pMkNt&nkV?$0QZ*>`yFVa_mF*o~dzk7NR6k}m+`eDbaJN8JY0V_am;ZbR+sqrjQ zsJ{P@T*B5|unk;nmsswNTxJWo%BPo$B$+W zb{j8#aaH+)4S;v0F99|JXr7k9Cnfd5NL89-dtX%1_^o{{*Rd(#2vUHlyYI$eeO&>ipIzE_%59t_}Yu0_o zD8HtYf7ffB(>8URTVG$YeOKOAin9k(yrKddm+hT&_Q3C&UJn`mjX8;!dt`*xDy?g> z$~CLeFObG~BWLR8lo`z%130`%uOzW$z{(S-riKcA=M^Nwz#ipIuw<=<?Yl0 zWno8u6))q}x#150`45V(X3Lxz`^(loKM(+WMQ8WEcp_%8{vQ1HDT$eDN|o%qd;ugd zS3V`FK}69FdjN1O<)qy!&v|e40|=8X3-ja?pbC-MGQLjt#jp3?k`jCYLP`=32$;kI zCd)h58p_O!egFM*NFO<3q1y1}E0em;+JrOW0h}c_F@@!7dYZdsMzt+wyD3^Zow*u0f6nW^S1gE{-Gkk&V96b-xIxt(tzU`B9DPg&$(W`5; zIFXu#YHAbB99HQ{et7ndX?C>>KpxwFD8SOvAt&k#zmfP2Byjw};P$r3wVd@%5Kf>0 z4+1&G2$0iqdE z5PbAYX)x=m6FZM5o-J$SM-P1I68<<1WW9Jl##VtRvRpaSe$ZKq#m8<`#E01-3I6iQfGX2@zz#X}A+1`lZSLce$cx|!QvY7|S zX=}4(NxAI6qOE1c<`VuNR2mCUA1Ju`$Ei@|D+jG+%S=C0#|B=ixe)DLlvrZdATcfh z!+?yM-yL7zx(w2obQoPX_=iz9<78?fgnsOJPnbfnpF`IFv-J{GyJymyiIv(c+rCz+W@usRYhZqyXnZQc&cnK^mA7=-@EEZrt8t z$gYR%5X=@Uz(yzGNh$1Xis%&90(RAd&RAW=o-huoroiif$_WK%$0@)*JS)In7K_Eo zOqxiRk#=dR{nA({I0Mzi5)1(50IgKB?7M64gaRBHXa)H8Ah8ERj{DlDGrtFOh@tdY zUCh+GNi&Q*Tn;o>3Y9QPuR~r5R7fget2M|JU=b7r2>g@>ki_*asGwL` z7)3Xi%&Xc(Uy|k8#sFa4LM41x8A#ZUFaQWFOI6tnFpxm+LM6}wQsB7MKvh9$Yk%R+ zHJ=()h48x+n6>dg1?clAu+f?j3W6dHvWv6Vs05Zs=K-e-RAD8Yl903DvYX-kliE4R z>Rh3>?89H0U!3@fGVLey@(#&W>yWNDej4|BcToUzt5^HC*<|0z4FD6AS2k|^W5t*a z0RH{OS2h9u{@>u$i^~8Y7T(5nXMeaj#t{Hpx<~bH7+UPJY{q%6uxYbXXt}#v8^l1u zL9A9#vOF75~t;v{c27J$CpLYma&O z8SZaj`D9LQtBcs5V7gHN%Z38Xp-|v>#vlz_`E2tho?r9!P*pf7Pys#x;#7})gdP)V ze5q();cG&v!cA7}R4zOw<0XfI%)RlT;?cL;56TC`0IYcmaGp=QR^7HO-z;Auf6;If zQ-HwK6kvB81#YL+)1tsm76ukjgCy>xwQ3aLfDZ}~6O95rjtNNv6Ngm7R(h$wkSke@ z^8&;$NE#=FAD_u?bahd9~3*UAbWE!{0hS$|rvDNzYCL zSVYwUBKoupVW_T~H6`%+#-<;%>%3%uLw4*{LULrHz8ul&GIndua+GJb%;QE7B@}XGGvu+aC--UkQlZOSOLDKf<+AD zQ)_%4j_*%Wx76>e=q_g-%hs7c1XXm+7AwH+wLNnMi!&9hGD)st(+bgSL?FWN@+g5! zA$x~b7qLItXmyzaySD}scJT(lB>OtHn9w7{Vg7(>;xc|8aFJ8sD`x@nN+7Bwl|WBK zLC~KnR}?s`F#vW~3;?|8R2AY*P=JNs6uA6gkOmH}p%U0gX9ZX*(W$X2# z*v?-TEYe!HXbA138O$3teKC><*s%8 z3PJu(?K`T}4?Sqz(ygSE4q7X)zq|SAyOpszXrY0!TL$zQ(NG6k`QO*}%IoxRrvP}# zB4oDgsnyvu#aC|x>||4Ew(OkyE+D+#V@SZ{UEgEU%+`+|0N6JYU)lPFBE4o;al`7SkOGVHXuhcaL21VM_+m zz}R$H74Hop-(>+{gZiLXcF!I(?W=>aO4WcG{T(YVS*8Q|>X=XBW>~}9bv*&FvbD>s z0S|MMF9V>)bo}w$zwf_s25{^kzM3sxH7WM+a|M}sap%3i1X4|oR%fi_kE zwjA2E756+~fq^O% z5hcNkNWsheQ&rDgjT`%8sbQQvWFG;JLLooWQxaH|Wm^9FGT7>k?_^J(stHB~D7aX?D55Tdw<9d9}~ zjct{U?2o9{bIi?ivRGIlmbzH^H44I-iRAK1I3yYXOyl)+I{9W)5f@|^ zJ|YT=cT=h;uwQHd;1s12&K3iSFs)Ie629`)up>rEcCo#Q0=V=kz(gPg=z%DJW151Z zV+`&CVK1o!=EEqkzizEcm>nu06|Ysqf8$t&6$f$1X8s!NTbL{Ru=|}?R28I<%Q%Ue zD60?uZFP)~5hwZIIc1bDy=5hfV_E^brdDHi~P^ zmWq$Fz6q-|7ZP?g3;?FNsf1a3h!ogpE=CH9X`=@UY)cv>j@9@|f|mq`8T{#T`_vr6 zKAhy3n->JSWed>`9(q5YvuQ^TZWgf%)^2|HkK^Od0PyQf4DPY9S43d|JK4FjQSG4$ zy&UJuV!~fDLevlT-uUy5p7JS*f|0H6Ddz3pJ$AL<09Dv5)ity3L#OXf0N7Pk5_y2u z3{rse!859m4PY;IoW5nPzelUD8N<_ z3RE=jys8j|fl9zBO@aL>gY1@;ojuavg)j6N|5T^L@-nB#v<%>peG1324-x&6t*z!? zR|)0(N*B>=x$r+OU?0U-fKbx{;X7{ZaN9EI=5cW$FH=}ZdFOrf!3yEmAC(TOjF&zfO&w0raM1g-yH)9 zv|IB(RcbgY#2%oS*0s)k{mk>)XT5F2L8)^S{2CRn>;VbHp2!?gs%zHP`2bjyl;HSn zT;OeeWa%KS9=6!?`z0#}HPYQF4*i8N8~c1?Ths5OoFd{65w=73Zgw}C2X|Lm;#sL2C7V{2B4TW zETO8f$%q06Y44dW6kvXdg0RL0iQ_abDq*L!Zh63XYgN2H1@2@YqJ9;g%f5xCvk&)h zaUHK?)FA<%+L`2XM@x^26&LbCfD?sQU-&D2it|(baF^B&n;0h&D4G=5d~c9A8W$>o(F6si5(cX5hldgXL)&6QK~p{7yW}f`=i?kkstm?tK+2@3exidl96ygY%n|F0gH?H_|{5t|=QYfBfdqF#wz~oSDxn zCOKd)0Gc}rTqmmRj@?x4&FR)YkicotY4c`hbUL#OAVeF$QGoM#Q`;?@*Yvg{B$XT?%Fo#2w+oFfw++eKRu252oR)In#dQQW9J=z3xH(-6!_0n zs@k;(zc=G$6G*t%QJ_i1E%8D9e*v(U<~v(#NB|D_q`+gLQdO;r%U?Z@%iHCJ0SC5I zfWV^^z>KB9MHVr$g#!Nr28m-zn@V6Cavo6MKovINQwdXtFG;YeoVIb1Y)4hu;HHsr zsRLrz7EBi4gdL^zrK{OnZP4p_h;wO#7DB2g$60&)ITN9 zTaBO*{FN0xNkfY{jLKSa5sPhv8-u z*OGawi&#cHXDI3RH7AAiHJ3zs9$FQoz~QQa1Y$Z;iF}X0B*Efyv$@%RaUzHOK>4WL zu@0yXjN&OkoDd4IRFVQrkW*kM8#xxaoIDFOs}!KaqQGX*mu{IoZ{yMa z+0wX{kx|j?pgDHb5TA@}#6oC`%_vL~(K-wIlJ?W*=8_=mwgzM*P;ui-v z=Z69qz!4*>Zy7jE79vqJw<%Q=z->qY*39JryA4z!(hrrufi)c(hrC@-LH4EM2IWwS znFa)4*#-sPnq^FZU69HZ1-{a?kvEOtqXrV8kp{r7m=Snj05H6#x$Z8cvUk1Y|s^(A|f-K^cKxt znSz_#{1@yXsXhnpuhkF;4KXr)-w}T2)IOnjrQ;;z-%!E zKJp>tO#@z9DuFN=6kt<11!!m}fQy0x9BoPg4u7Y>Q5)b=;HEX~6yOY31@vM=`#UEa z^@0-qO>qt#=_*SHUlYOi6Gw@q&te;+Y{jguVt*=lNQuX6T_1JzsqXT?ad#9rmr@da z4jvryAxHNtJIl1$&K?3VC71_HRjS(O3#-;)L=BmDmMi!WC_t=M3b3ky0+^N*z_~zy zjW*_^AXFPQP=GNX1x^zUZV;u8N?@Qy0U8nt;KNfujK@@9Jl@Ia^AANu6s7+Bt*7zQ z(2ac*`;mRfRS=~@L}s~+K87ph&#f`F`iLWa%~%+BR4~pqEVpGrW0Mk+qWeWs75GgT zV7q@%kLKFAgB2Z8`iWn>jVkk>0^fWZ5mTa}J_JJ?p+o6EFJJs$IY_u@4a>nja|;by zCF>Mdh1G()f}40AY}E-8HovGea%Q%3+FSlF04$DPadXeNhYoK9K*-f4l`mfSFg6*$ z$y2GCGlt9PQyPe@I$=Y|-l&CBAc6Jb8PiYq-}gT`yyDq)eWz6Q|I4#r@{|#fKxD{> zA9h~&=8^6+!J4G*qc;3ee#ikxm^LU?9UA?w<9Edh0H7FAV5{|c4Fh8P{k27ZBNRyBM z(P~DHy*s#EuhmcT$n=uECV#0m+3F51J$>Aw?TB;YmjGD`oZdfT>t~z60GMgqTGpj? zzaDbb#3h^>DT!q-_7v=EmL@(2*p4~lZSMh>S8RqVc!;A%^eE#nOfQ_6R_kI)>w31- zC`h1YP=I~x6ks$!LBZxKyUpA-?`%2aGtyAcmaX-tV3vV|;|~S^Vb`cC?AD+Fy%YuZ z_pH<4?Ve{m|8)LU5bLtwX~G|age50UT&p*GrkdqNYRph^p#U#c5~upU^4ic`+NA<$ zh2-Rat#T@Fd!$QbDv8589{#F$qGY?wvumq0xb2_sF0t(0Pmu7?oE8+=E)mzT zaUPL?McQEBE$>3L^=`mcYYZvC#uf@pT1!lUgDiT?#ZS^O%Vs<;P;WdhfN@JzVQm5h z=CSfLx%cz(-*hO0 z2&%ikne3E2PBwJB;J9eFw)=R0x1`z9THwGgP9?j0*QbKT9Kg4<>(_X*rNBS{ z7?nFpc|@*QEuXSTqo-1}!>i8NMZZ0TgzI|+ww|7NHz!njVYmd^ip^_A#TPrU5E58J zxM@KCXZOdQ1i*T^jY}Ip+GeA>SFwqGz3=b8cZT&lU~; zIdn7tjLOBI6IU1fWC!3U^I^6uXw%HEQTNFJ_TJ(vi>crFLZkAT4FUW#i*}5CtzxbE z$mbyLyo-_;5xsK4&}s4|aDXUdX~!Ce_J1myUk*?KQY#j>bJ@`uX*d^Gs#2a-pLcZY z901=23iwnWpLO;-=i%ZfFE)AhFZESd?jN-B#M#+;dxP?{->q7;BW*W9H;T=^KYIDq z9HZw3&uCwh!6&aylKl$LKT6=}u)os^b7$e-mHLmMK5IeC1u+4FDx@N^t($9}no+Me!g1 z^h$KGo4-TCb(d0=^z@Hef3A}+Sd^z;3WSXQ&UMLI>D=Q0v)&5u2Bpwp{!xm31n|Rx zM2OXt7W(Yd`#eBa}cw9W& zF&@c$H|a6#U=~c(%q%v0!iS5spulafQZQs)m)n7f1p!dhqy9QSufaJp07fG{-Pav` zGHxw^>5)>^x@+>bSudji3dpC(;wTV+=|2i^Y&iuOjZlDjS_)i`8ssYMwE;knKvlu8 zQ9$p8iVO2yc3-@(AVATPa?TxV?^k^Xn;zi1)e?g{MJFUDrLYLF)_X_yd2Fv!<-P^a z4byZx>aCA$_J`g^Vr};}{`dO2afHneTbQ1(eSuJgl_(oeg;(obX08sTf5L28^`=Yl z^0sdQu##iRk^|=BQGEa$Pl~TB=$O;3U!VUw1pr3p%&a2UZBwS{Kx@(`HObsJ|HcOZ zM6=3_NLc&F(N_QnJUsfxvo%`ATm-;*9K-+IU3_zgV*v1Pq@Vct#7$D#p7Q>gPdl<734-&tLbiZliiXQFpSS zY_DI>n|6p_ykIzKLz|eKHfvV))%$Vy0sCy;ojLOGbV%R?miAs3j~?1T4*;RPC&Ym#XAaBUn&H6D7WUNn9MJ?i3_<5Y|rbVi#nU{%FJ+p zXn3a^G^)FMg>0lafPvpNU}wzA0ZX9@Q~T|jyA;_PE^R(8;Vr#UW=s8k+f#yWuY?4Q zISOzDG6l8|g>YU~MaLTe4F9Mq?;8dZ7z|Mf)FcW@d@@kwt+{KcM4(oHD8RyJ3Ie^X z)6lH}>dZsfn%hmgxSu$pch^`oe&SIJhos5+2n_xB>|JRms*SoSQsQq85rrn-UeU1W z(!v0kTo`en#e;q~Z2|0mR@qD&=}|3TZM}bj+bp^6jTx77VjzK@p8}NG7@Klu9Rt6D z1e`|{prxe%F%P@C$3K5`RkxgME2`{L;4P~NJ0F=yU}HW7*o{Cz{x=3`I2a|4(*mff z5Y70f023G#py#8Y(0qejxim2Vg#ru!9Mm)o*I)w)1ofv94n3?T^iobec35iq@MZs7 zMb+dAFSD@O&&@9V@9^iky@RoFXCDuEq&-8pDzW{xvJ!RsnF6qrsZ z(5T9iZ(II23lb(ds%Ilz0$jg0kicmLR04()1y~bI0U{$%fSN=B4hW&Z@u@*}O|1+7 zT1~173x6oU36B)G$N?vLh|C0F5h7JQ)ph=8j$paWX^3x1Zd89T5l#bcRD`)EP7C z_6PtBDJg(EZ?Ie69aqk-fdp1cQeY>WU3PGCr6rv&te2x(QEBABF)y%_Lz^!E=@8Bf zum_i>f#s|eI3=oQMS-KdrMziitreAUt!khOLjx+|DM!Y6({PeTcwT@iKviLn9R;37 z_u+8KAiIcyNmbcPGd*vva3C9%aII&M1{Ts&37m65ft_XmwX+yYeHKr^(SX+7?I6&y!O)2FP zBcpV8Bs_u}Ophauhf22{b8i)Fn#7_qvPG8BDSQx~I)KIfPKu0=#J0zn2SG9Dj z89RZqpWKgK-9Z|@{Jw&#~t6<|LHz7gkfLWGiQHNP2DJi z$-d;p?_KZrY9v*$QF_C)DCQ7gr)sdB@hrCaP`2S+>0a0?xo6v4Cw)(Y zFL-(U(~(8;E%E%rx|vr$>sW`_3dp}>2bBf|L7ELe_sVa5j!$!ggego(%y~6q)$*&~ zO2AhW=ZYm6p3Dx<)I+k*NxxU$<(=LpddSw@Y?&}2(XGhd{!s2bODWIz^OfhEODzDL z;lEAX0elGw>S*4=^+gnE`d$66cp8L z0SZdWbpk9BTgbnU&wBeH4McFI0D>OPu{_NYTf`_LoyRdxMQRfBhNmbkCrWfXvwNZ$xyQnoJssBB?#a*}gntPo zv7=-5t>OR3;=x}}sCmo%8qd{ z+CAkQ2_EX&Nq4@(o4I7)p94;vRxV+-J3yXl&CYk?dm&;~3iIX$_S*YV8d5xGzH1ej zayxl-$H<2=XAEF7`uJB}FFZOSYYmsc2D!|%i+wjH{Q?Q>gdSrW{ru;8dSi%UKmmF; z3b4_L0<4-z_mB1&oTXP8`y6#2sij-jF@2Iv3(qc^pZ*)F7Ph4HM0On`lmrDBI8fkN zM@e*E>-h7LzJs6&)iMvbV<3T3vZ;iF);v*QSJXh2?QA2UHSScEZFvI;C#|KU5*Qy) zP)f5lC_r=?3Up5^d5D;Rq!MMcW|9J&c}D>zYbn444+V&4LxJwJmD%M@i5zXHm6*I4 z(UA!Zz}89%uo#yDTdi79 zfDHo_6pvERiUPO}DNwJStv@3-Xs%_T3j4^Y1Wv}Kz+;QGDzT2#d|3R^x=;p{Wktli zj(vnY5nbU_T%^X)_)P;RV2{Cx)tlG;d+L?Ake9eJ^~G1S<>>h1i+8oE4Ny{RRu2?? z>(e3kdG4Q-M9!j@PJh_6g@h@e0?WdJhSiSJEiwe-m~pM!h9M2)Ti}WN$ZpDP8P~7u zr$Rj^LsdX2rE1jMgH@_e+X&#aQ-NWJa(d4QluwDPLQg{h&Z$W&k}suNpT5`}_U0;7A?7XxI9!ne`*BKD=Vv_+T=SRXFn%8<&B~?# zeJlmA+9*I&@TTt~0^UW)x5LxG5m*!ymF2>0p}{|kCL*g@vG?`2Sm#{QN4Y{rH%T45PR;9 z?Fl+u#c8>?eKyc#fl#CQ5!8J9Ve4FBV%JswE@aQgf8=E>P0t7Ff#r}CxAOYXGqJf~JAlaSBky6c82QcXsFHJM*t4B1KBP zbnBafWFTpE&K^g)_t)Vh7ZQP{o#k8^=ej*6s*&?Rc9Gn4q!xkki}W}{#TGJNmS;k& z_>!yeRX|4TD@7bb`x@-ZQd`+a*fXAIwX=&~sRF67KYG_?AEkLP6|tAx-J4%%#?8^S zsPKtCNI$TvQjcTeLQ#>bi?3$O=F-)kTq`pW0M%mft8MAcR?Y)J=%>z=w|;P2DP0j< zmE8iRiUJ&~O+jc!CDF86=wF+6O+XshFh>E(F9mQcQ{XDwGu9L2PJ=n&TE!&}R57gC zE^>YpszGM3M$k$Fzv1-;64;AJCEPL%Brst`B@j=a0*{Xdsu1%-N$?_6<{JOZcSeZt zf~1%5g8rP$cSuFW7sj}mg#?*GvD<7_4@-y<&MCBa_WSZ2$9_s_>0 zuUQA+oL_u3TlUqx{Oq@Ly8#?~E3kJ?hpE?m<=}ys0WF|X7h>DCZMT{Fx##3vlOF?T#vVahnG)37EPdlCR(sVwt7{JdCe-P|jq zWtRdhlUq9Fon8IIeW1$zckz{-Z9Zye)Vdzi0I>FcZfwxfd)4J-JiCb8JwCg5=>yaC z#9bFDRTS9Di6myWPMa6;I?e}a_~a;w9*dtsA)L_(hjCBWs1K^kyp zP*pgmlmZVql*pU7t8~ES1un8Gk8yARGZW zw3q@k_8oRCIkWu26eNx)*%a8ERoSHg8?7n8ZZQh(Sh6u>{JfEeF<>=loLml55_5#xIix5lRhFJ?~daglD2xctnBFo#62MBxq)$GC_H zH_|bnmf&#hx}fk@33Er3Tv1-jwd5t~0sAQTlBZZgn(JIpH`|K;#gW?H&XGPqD#GJI z3){`{D*NWu6d5imI<}(XH!ove+r?M2Wt~&)S!WB&_K*V{133Ti*)nq_jJDX5fE|3Hxippv+&9CL-4L zF-N)#aY9R-*or654-%_)HKK|#Up26tZMe+B>!BC5*X z%|HT1zLMZ|Gvo>T5S|Dd?yQhjsM_Of-Ne{=F1yE7;-$r%!M3K~hn^shnUa3)$wq?!tJjEsrlJ0IBTN6~D<2Rm9QnXRs96B!$A zpb3F@tu(QRn_mv@kttr!+-k57(Z73hUxIKVmS4)g`2=ymYps~mmi|HRGb|g)K7=2` zeL_Tj#WeTZr=eUJ7jBA2|j>VaE`mqU+;7c5+!zAGT(AbM*D{HEI% z5aIaLjPu*p6_XvXC`ei-y?0*J{io%d3k?FC6kpAjy^RO|JN3Tq??6+q=f$}6-^WU? z7ni`h+LV?Dbye9))$T4AhrPOA9{_%V?Pu*Oi1O&{r2i1~%e)tbo0-xl4hOCT=7 z^mS3Iru)mKdpvPWqfM_nH0{tveK-d5q;b&``9HPP+o4d+!&kf64}ZTXpeL?go!L@$ z!Jx7G>qp@}Y&6G*6<{kO8pOt?Fk2;VXmoJr6qIRomFPowp%Wt+|CQ{UELQ3eMqaFZ zL=lnWL;l+;2p$u_d5wEM?f?AGf|tk=eC~UWY<&D~scb0u^T5z?&%Xa9wB4yU5O4(T zzSFlym$tdyt5yu7WIx9IYzgs5QSz(Mcb=?50DKdPaKY*?RQf$ z7P@*MyC|QVzb#wR{i!~NM~}4WRk!H}2kF+OjaJmxcPSs;yxwYEm2A6N48Thx%NBn0 zCjhpIt$vW%!Q=a{0c>P3GF!5{@4Y;+xZaJRm0iWoE6-S}r-8+b3rcnK8&iH7RKc$} z{m zT#16VKc(A`Bj4%G0gBDukZ!m7SpI>8UIOPkJ`4TT0)S$(Cn;sncU{{7plI&?aQE8P z82w$NJngzy<o_1a9cDeq{LpsoEV zQ=MlYN{0jr!N${5GTIH5W(|K2C{Nig|2uc%h#b3Ey`Zek#cG82H$fHN^|A?@+VrUs z41mHsxBjNDo(<9+geXt5%M7@Y{6LOhc^W8Bll%Slef?Ilz2pFeAfsE=!Mm>4MH+~l zG-g<6`BC8+04NN7JYS$0FaZe;FiQ@BEpg z7#_@tEbrA`cmAM6A8dT&^OjnA501)lAolsxgdX}h71e29-^lbcKgmW;q>-g=V(**3 z>X%5;iwG*m?&ry0WxUh705of>$K5^Z|H4nmb5(Yml&b6}g$ABZ)GIkkTlTkedbBzG z8zfLUvYSQZOZmN|4ic5BCGk1$TD@NffYxiiX>QPy&XoaB0cVCBT{d9GLI5;t(>7h| zP&E4(07~@4dIv`xF}2o#EcNUVl+z{mmsux`Pkw`_XPIrPCp;1_0_A1?c?h&wgzVnyEJnrrSc8 z?d&4}^{is|?|%5%Mm}p%801@K$L0`Fw1-kffv4sPqQE3;Z(dbiT7jby@VQaoaoHeo zEE7=@#@&pAe86VQHyKw#XQf2wPqmuTeK29#-^DJ)>OgiAY|^DkiJeL9wg8|!?d_N| zu4C!?04U76I&NNkv9eypJY;h0V8-f4%wwj=VYMhv+6a5crvm@&ucsGH53P~f+RtsU zTk~wBVXiK|GLv^*QnJkiM*!5;&1K7VOL?oe+t~QL;&j}B8*kd^60(mnTb9k5mR)nn zKLD5tnlof~r*7)7PM%%UQI&XR(9niO*1AE$W0eA9l7BpVVb?$a^l=p6e5T0PYi9&U`yEU6tW+1Oyv`W_tpBW5+wF(Y#2`q(w?F}^F$GxjL;-fqP*D7_$`u6& z1x5k3OjBSdjXD-jp4{864RjlDO$-{1>)Mjp~&G+R!-iO4$hrXv8R zh)%E$i~R#|o2L>z8kpqUdGQ1tOjcm$I(Y5+$*&O5K~?LuHZRB`|-m0&DEQ**vdZ4X7$OM1lDqw!hocSTFUlxP>=159m{<4ZsfF1I?$?Js}T{IaqC6^AdXAJteQdhs3MT4wMyNMiC~%u?01zLIN|ey7APNw%gaX8SrvQc! z1z75m2S}44?|nFF&9{;eCKz|th}k|d(dQ%Q+qp$X=jffztEaH{(wl9|&bi2U!M01b zONl-Dpe*S~mKlRebJJ_qa*5^h_=L~mU)lDU_ zW?tVyQ)c%CzzG{!MY|RVNlpU5l9FX1$%&I^`vBlo%`4*4Zt=s@0Eodnr*P8bAKzC5 zz@n{Lb(%E$^zUT=dnfUg#U!gW?9I74dK#{>ezTeR8k?3bNbd%T@>=N~o^WWw$%I+} zPBuyv1vtMX;`-g0r$g#N0vlr~zMB+M+%Kt|P*6fMm?*H<@=k$=Rx&7Xk|S{zH$Qh4S>i6z_Q(qmVvb5+a~B1OgG2#3 zI11dG8{E0gTm#@C4e7ku^;~Z)FR=-#Bid(=1-Mo zYW$@4Ef)DAGhzJ=fKRFd$%De9uOIsr5{NNLtFlRU?rcQ_sr(52N&yy1QedlDy0p~W z|E+RG0eV^rU}jqZwjZ<;KanLqF1UG8Vp2+QvosdM-#|B-Z7UV5MB2!jLTVISh}1E1 zXmnyy+K}MJk+HGSDXB?GsRIm@o1`m%=-|bDvysFa15ijCR?>VTA|wR}WI%!GdxJFK zxS|qpi73D=fr4w%AxM-a$l|Xf(06U8)z$t_jpq^2HH3Sr3ltckMnt8xMgBwH-Kqb)iQ-G5?6wtdJ ztF2#r^?1^d)cEw^_VH=C+P?FP|9(-r&o6lI2t6~n{;sU6xgs~(nN*es9qk!k`p?0T zz<9dXz}d^j$IBwmOA6wxP=I2Z2Q<_k%jv)Vs?z;yq~RhvHnw$_0IUY10D|tY1sZ?0KBFBo;Pv52$96?_Zz6PJz@>S zGO=Qv#UFVylWUoK9sH3-owB*1lzj8jC+S?a>|uCl(1y{G2}6=uumrwxDc7X-p$$Ln zJ-kr%;=H&NnW+>U_+(1YmG!_MRX)2BRZj0K@IXxBJKtiX zG+SNA6d+K3pU5Ez%RkDR$~8M=DTz)CmQ3)tp?jv)+cjG#D55pJ6yV%$3b1Fp$?TC; z?Yb<)6Ea1p#3``dX8;`J*p;20L{#~&FpvmqYye>YQdPFL1`?*71^_GCl`6f3wc0(E zYI1KB*^h1fw>~;><{yFA`ZgFNbn{o@rFkI6gdUjnbM2`Bi1;vKP^m3n?^+Ik@Kh-u z&Ce_3niD`D-M7JLhd%=KUR~d3O90k9Q3=0rb@LP;vI_-H8|%WhmB7Aq3NQsg0hWPLfHuGi zutuacYd7Tny!I?ab81q8btd)FY_*|?kC#&7(h`yf@T~yNqEk|I%Rc)ugz;sBdqQK710O0&wDuH8iDZoT01t^siUqj(nXxhsp=%e=t`nGDjL4^|3zUm<7K*or;!gdC1rs}kmcGC#O^pl>u1G14lF z)tzqA0N`A$G8antZ+afMy3}kr)o99%_A8%@3q|jx4JA)TRk}IyNNoT(1&(xY+@tc^ z`#LxwzM3rui|*ci{je7R>JtUNnulxuxMwW^jds1Tf$ctd2;i+bO1ygp#Tn)#v*my zpMbuA0$$#*1IPwEAcxj#V{%&yM;ufTtYk{HErulX~m zLOd%9aI*EVGUK=O+U5xfELxxd4g25;m-jUF)yESRzEO!&fE`2>_{zS{Y@q;NVhWs^ zsx)GcR2bgpjci)^W6!S{_Y@%TF9ns}DplR?Pxgu$8iYH?lraVQ<{L=ZzAykqzc&D0 zvWT(xeI#+jYoGuNZYaRa00qS~Q-y*;?F@2-u%&qDAhjDD*PF!NNR`aZ`V?_Xc5d~N-qyTTF%yKZtn;5zt)$hJY(7P3^<4In3Gw6Ir>7@{Ta}y;o@N~DKrI$7kzc}#L z8u0#gU3Z+CAu9+6rQ|hc3kA443SgS`9F%^0ujwh$K*?`?@W|rx*D3%wUsJiFprB^l zPyo*o1sKLt0Ar2<6eSAWHW}m!qgN^ck1_=~$(I6zrJ}$o+#qrL)&{_4fi=)a2(+L% zEmKzxD(N%*3EdlWCqa@mdojRP-K&Hec92Xe?+ad)bNozarW5=-sRKi`e8z?{^4+VI$CS!Q0Et|Y?(?=Iytzq124!^39?0q=b z_plcKi;;qt*+;M=zo3 z8*MVe(OK_ES!JerYQS3F%=qTMje~ zy1#sV87aZeCJs-IOJ&h0BNH@}cYA2YkKZpJpj{Bqnuo!T8#1J9FuRdhHjwU+79Fj% zaO*w7v(^+IhxCh{Q|T|CIQ_$4*Zu%-)G{__MaePq+v=u>=L{t=d)dg)=N)tl5EeBB zI2dF`pR0oh9njN2*z@VLf0=M;o<35m>aWrmxA{`{_pcwyT=AG4ktwlk5G!viB~Cv| zD#K!4kZ-i!nPCU&2*=~!RKK7+Y-~z0JThev^K@trXGl_-*5M8x@Z!baW2EuG-vGuf zLofPy9j+9DM+0Lltz5n8qn`W@fF;~RW)J97Z|NBTw7-Mj&YNgzqqlf=v&1!KOLF*; z&8KVzLZa{<1ri2bUgtD$7(hS+1$vBo+Tp85T>**}QlOK0*00rfWCNID6sR*KW2%20 zX~yy!#KJBL&{0x=bH^xflF6AZc|fW`;sM&QfJ&%Unt4_E%X`fW5KvaB5-tce=gVuY z9?L|W#3#0ei!oUsKk>T~AKQuOhy_-&Zw2_4w_?&T;liO}gcgdY86@kD*>Y>?-}ifu zp8$YBEwk^J{=QJJjp-Y%bC@^5!)VJ@Bs>Xn;a#kQ>)r;>^9>c0S-Q|uw^~Y-R3O3s;NmAIq=S#EDtgrb z;MA$;e|BDIG+`HmlO@$`xni@}qg{q<#CSn)U9S@U#;$y!RW^&oFAlJ;)erd>; zYy{DV7v0afS~|)__1F_O5sV0%UmVgTR!$bV!TuH?+yeIYBCpmm;)o}|lI)@|K4K8( zJb5)`-|T+p>8QgOxQuSAlz+#F%10V>>WigBK13Le(p*!S!CaGSceo}uG460A+CGQU!9h$OcZR(wf*j zz+2sU_ibS>JA27F6fR*a2a_z+K-9U2*2+MF&a%V5!K+<>ivw&7KH=NRqt@->+CrojD+$etU5ZJLdaJ zN~O4FcOhX@%>ZD%alLXYs$9L^3lgs7lmrDhnT!H-Clq|;XP^q^1C_vwq`>Zgfhw4@ zRuX)vPjoChk%~<;wM^?Do4_WU3>4UEjwCAu?1kcp90hn05rHLzFlHx10ge$b-7pXOd{31Q7 zVC76kL?bNPN)e)2G?=BELM4qRd*OFmwKHdZ7uFc8=K+x9rucuop#z242kE z2C0V_*)6g0kUK{Ju&=9QnMbuJ&e#gzB?}fiPLcpLRutr0uF{|YYbzyoqO`*V6dx#X+FEB{M?q367>tq0Mnul#HeM}J&uy1I6C+~>qI ze$v0ei=W4K1*R-X9bk8|l~lq2TA(4t7dC1as*mZgVma}`!kpytb0Fa}QmKk9fO`-xkBzj(zHi5J$!rW7D{9tH4=P+-b3NW(^RiC9Ubn%vu^j2MtKG`MvVTdk+H z)K=H9SL3F=ehO^*86>Ap!e!^ikb6aEO##l_%>$%;l2?`EE$hU2JrjXog+I-oFLo*( zBrf6Au86R6r8keiafIjiW>rR!`Q8J?g&d$rA57eky=M7k0GzjTU}v=&VSDBRAei9Z z!|{vC1+D?WsBX`(TdqIM{H%ko#8(`kxZ*Qmrfc@#q55C>mtDw9?o-3?QUUcEl z561^Bg9M!WlOJCH5UV`;T*A4ON@MJYg04J54k=X>n8q6b-M>!Kz?v(n3QPVez_5Y> z979ckqa436r#MO6zmP$8(JoL4?Cqz(ySjlYm(vEow8sEoF^)=u*A;cpDf?#Q$A3G@ zTFxtr?nx>AmXrSM!|x&c5TWtp2^5a9Md6q0qs<_0Qi;n0c!`oeNq^~N;aBR$mpBr} ze;0yE4UW{p7>;z4t1LhIxaimsNApOQd{g{4X+!ah?-{i?@9&!-EmAH%M#hoFMJCU(MrP$9x z`~eErzX(5B_ILI(FoS)Rtj#{eET9-mdlck<6G5m0q&wU?ZvkES^DsLgZ~CKDb}Hwp zcjcnGE5fG*BSrVK4`G;AJIB5WS42o(E~CQTa2fp>3$sLo>J-r*gbERnvs@u2Qm!Qz zRFRsvpjq6$nf+0W`Ne`#Vbq8~pANkkC~=T|h{(Go`NGpMSKJ9Tk1K}DL@=P3Sjb4 zfVQsb|8l}t7Sj_i^^3|b1qkj%0ah$gfTh?J1WJpaojO7ihhL2X#MjCLG-HTFi!6xs*2O!r3*{hD9hl6u>ortHx}D0^sa1oV>%&!H*NfJv$_{>!8uajs^qM7( z>k(ttO8f{e2kw;bGvvrChN5U;A--}ui%rDa4i^!24 zU|+WT9@1pDzEZSpg`HTM!e1$)@CQD`lhYrCSPM}&mfxkbG@-dBor?p8oC7&m3v8`Z z5{;^8Perp=r5C?at+?e^>dl^r$S;~&aU7+%8TW8@b$Q_uP{DJ#j6O#zTd(r$B5}f* zT_XD?#`P8WQu_+hg5x5z&BCnny+3l=Rqb?2+&M2qh|znh*JRhG-M#~W8++oP)8ayJ z#sgrP$%x4dQ^IfQgDq@!>({t!*aZmy`s#jWJu?ag&bk)+_QO-JkrKjksJy}Kz$q@qoBXzbSjPmt2g_d?4v{qz+ zmk-3(JRdsaYS)Fbl@&l6d49X|gxlU%#~=Z(`C-$))dqeqy<%Jf6O&sn&oV`C?+poz zZnt_o`KsYze*lD^{JP+P#vN`30U)w;ugW>@dy2~Ov?$I~#WieML-z0!mYK^T0WTN@ zSSLz>X|_^Tf7`clX?=f#Di>{_RdGaEu`d0`0Km^q0aoEsfB_=~aJJ?Fw^gnvz)nmG zY^CAFqD;!{@-im+5^ z%|QVMz7$|V2nDX%^aTa(vWw1pgV<}XBzWQRjAtLh1PB$g5Bz9?eBC+mlMYp0c=RS% z%;SpVhQyht@=Dcy@GJE>SJ8opO?TD#_)OTqV$>xBMLjfiV?d0iMY$H$rA!V_TlxOE zM!il6!%kSp)mHI~l-H48q?<jLNP3Kn$2ZYAIW8O(@5+%lqXEuuxmu5 ze9@r^BS|zA!UnBAjjK>=dbkR`&lHC*iJnl*CW}cNIb2tcM1Hyc7{$X8)8Qg-1ut{O zrOJq6#;?@7!&3et%_~6q^AO32183!eKIQATPDysR+=XEGJNuAN&R&{i{K{PFYA`OA z?#bS}s$4f`ot>(}d{uiJInq0JVIE7PRh^>8x&CIvdMuCDED-g@Z#F9l~@M!>6xOn4mm`$KfSjik@RpjD(v=JWAJp_`Rvvrq($Yeh4w%kt-|J zp(^|$y=aQ!EbdLL$`CtZ#aK=Rt#S`X4ye`c{;NQ&8LvBZ&+Srj0L z2Vhz#zOr47xdGo@AD@&G7Zb-K*sv*^#%V(aed#)udk;AWP82YJrI{_gooh7Pb_YqK z6QTg)0Sd4xiUL<@8L`y`Bn{Ym6u3=R_d$V+G%xe2Ld0(>fy1E`;N`077XInhStP;> zj$Ru@>nCfg=^40QUxF=6Quw~4X|FbkawU3w5fwnR*P_`K<4oC(+DCjrXRbqOM60Fj zF|Jc@2Ew? zgf%5v8evk2adS0acCo0?qEQ#F4sqsAu^$-_{tn&mQX`E0O`32jyb4cLH{lBKyAds$ za9@by_k{mf29@Qffy)Dnxnoz@abl8R@9$L8E!Uk`KPmAFMaM#VB>CFaqBkz1J2%DX zNMykCDN9k@t4L9rkHRae0yuI(y}XEKuF`e>bZyJy73lV)*jF#ggIrh3x73Tfm96tS z_ET;h^SB3Ty|gK7lwBlGZdO~}c^34GgvX~!FNo8Tn}32pX3J%l*fOq%2a^dXs z`1jdW8t=&Ep)e~63S5H?0G6=y-jq_xqs(4$8BYVJCR1RmHMDua|Mhk5QJP*=ng8x} z|EjC2y1J{YyQ}(=u1n6rP+S^N3Emlyx}R&~GUJ(qp<_1XKJ zcdd@me9#rvvT$YdK{{?z56YRXN8VU&*1WM?ef0h1=8f0im6nI_705co|-eZ;vycZ<)uN7 znyZYSye#Y1GkCvt^MP>roYVBq`_lnLwJjk-Q{4AX>KM+;f!|HQIb8m#QhmknMoFNos z2f$L`&dYX!eDyNs>9>(9j5tgWJMl$5y1=@r{J0jH#oOK?0Cglo0Z_eTA{x~@=E}HC zuzn!3{L>j&3^9&9qKS+&KJJHO4p>7apAmUd7OTO2q(Kk7xcqfIJ`6~>ed@2vUu3KI zJ-+-UJZIRJmVtxWTgZh2aq6K#uEjyJr1u82A7Mq25Im?FyyK|F^wGzDW0vv;`&VV3 zW=Y2)q-9WtFp{bjhwsaG%tL6x;k#m9Xd;IQltyD!CR`?nI@gti{N|fBeB)>!p&%DmIU*lrj%SgX?p4P zS|$?BZ9j;N@i1XD2!{PQ_0TecG-o}j7B8CR=v~@+MTI``+#xksE8puxv+{w?LqA^n zgiH9;F0!ed;IiDz=)$0kPDysIOa?J4)quWqr{HQB^r+u1h)&!R6a+m+0mG#)h?WO# z&py2(XsjS)MHqbaWX3=%G2GgxqLbZ^%}zXLeRq89SkOCzTkkw){T@d2G>}Ud!@0R} zCq6X37S%IKYt~Q9MsuqT3=Vq;m2pi@MaieGqUeuvvL1pJ<2UFqO3X!;sD88{hH(Da zOi%m=m!qIzaAH>+LX-g}UGp7$caCjpPb8>nf!6f$iG{xG1iRO)M#zP>0 zm8UYgAqVyjjh-6I9RGDb@(wrSr=648$nOhAn*Ei0WMN{?FdRKe8AV8n$&%1+ZRU&a zQ#Ir}=5#;OaD!LoTh`0CaF7UPhsTGWJN%?F=BZbgA8g>E50$?Z_t#JEPSXz7!PuZ& zHh(4vR5N1Ha)pH7O8HOh-QsLK4n2p(z9f>}APrRMKz`VOQcBzvZZp9<1_DR;G12m4 z>hXja%6<%9HlQ%|QfO^nJoC6R9(G)X2lY^JyzQO9UxNMwE7(seJgDlF+N$?lPSXOd zO^6J-c-cP(E$Y{lqNRmLl_Xb{$7??rZC+S@gt5*mo{i?_EgVy9)cmc`_r1BJZiFj= zK#EJZF3(2h2r*0d9r?)b1OKB0_P!|w>Drt(8X+nofB)L-$>PcC`n#f&8dt`0%n6so zn&AYnW@pxmPX#S$| zBY%4Q137b(XZ&bZzLAf-a?m(}1LYhKDRPhD{QjX^;{Czj<@;7LIK~8mC}#oq^}|`y zyN!LKx#V|85Xp2SN`?U4bOdhc3pu8R94`l-kZOPYV^bE>fGL*3C#|#eZ?Ye6D9c`2 ziM7oLjgHB9ZTMwKE75Ze*4~^wnTlu})cdi|MR&E_B)YQzR$#O|md6>%DYO)xj@++$ zIy7Fi9izGONvq`@ctz1Q^@~TIpEL5>&=m^xYZ5W~v@XF<#R0>=>D*B|-Z+;XH4(5m zK^dh=@a1p#^1T!H_pd#TcNVU^`yc+~Eswh4kN8(`Z+@8Kj?q)T_nANR`FxPyRCwlf zuekoT^_qfsqyLrK)it+1_AOgazd7H?%S*0$-AjM+m!IKmZhqss`5@2BHy;ee2Mbp= zAIu52|KFtEe6U}c>u(;sCnV&X9~}5Sv(@q6IST7D@N))^qfHNbSz*`n^}fz+PPjY$!1}x^~`0v7zqK__ANcWr8!72?<}1!@0@&i`4L&` zZDlb#ufqWg4ztw5(Dj1eUPR#J&%t3v!pt|gf)rU14-ieD#+b*6UyT>5U5zOiVRukz zBoMK|wL!|*jg51qhjX8dZmuamdpYRPdri{7Q-uw5@j|^ZCPuUZCf5gK1hw$qk!u&0 z2m-#hj3bSB>WMAmz%Ih4Hjm|VYs^iuv-QkqOu_1k$PH;{GVCe^*Q(1I$$U-k75bi_ zge-(IB=r)jXlb6ol|y_<(%>0NEEaFed0MtesX_(m_+|MV(We^`FR&#_r5;_+o=o`) zzQBL(Boe1*?`1=o(r&vub z=HRcjjDx(B0jycWyR(s3OavwKRlhM1^JoCNI&>B1t~7w#GY#x_Gz zRUO1_Y}{<3L`(e!XN+eu0@FevrY~6X%xiPz-itFYkG+^RqG;Y`f+ilQI%pXo98pt6 z|9&Vtwlo^*05QN1Bdwxz<54FjJ(;5%^sC1pV@2++s@*bI{Fd5N`KLI3&(%2vcejVs zO05--?rc!l0jSgfm`Eb)QifXQ8803Jql%9YGzZ9rR2E^vUTo*WKJ#IYVh8y%lj@dh#nY!3pilCwA-==vDd*&Y5y zQqMe1Bb}64{#ZUYkHM=}+z)zHFjBpoCTM0+B|n6#BHyAO_Krp#j?IvVw{&X`=jRZ4 ziCXFURnvIiItn3TooGnXAe+A*bE+pmqPb_!wv&aRR9uk3y0w`(kB-sQSU$i5%z{9S z`hC~vz3~pa5BbrW%&5XYI%N>=m`Ye}79cZSFUgKZR%p;05R6l9a-a&Jy{_Vn_%4wM~ zU{>e~nk)~j|J-b8j>Kg?@!**8+8z1aRDe^!hW7#b9dAQIkupKe^)k9xwg*8gTz+p1 zvg1Mv>o__8_12)N<0c4hz9^O2bd$pT!2PX!+K zU)9o*v|;6>(wnk4yS^=3nwdd%h;C65xIU~`&dbG?F_T^{OV8@Ykr4zZ&w_oX90)Ii zga}9`_yc*3n(8YPR0ebO9W4{2NQaa(<_*+;C{kU9ggFW0!0_evW8{?-RwjE#r zMywh0(pb8w-h>sMO=z|V-Fzg7>EjC)5PLTF^$fO&Kv;sk z*cNJ3eU1$W;ooK6jPs&crCc?m_|<&wnTjt4znqW!DqC?e$iSKbL~j+mZXk>Oq8@`lMRTg(tO^p?zM@TGI4lAd zjyeTZ)xE4NYc(vk2wXoa9bK48s241c4q%V00%0ghI76Hav7A&)|H@h>vNf>jILi)FU?lumMitKWZm4MPqZN2`@FyaMZNV3ZiI8H90cwVeX24(Z-pH`1aIpW-oUfOU-=eT{ z{C)Y{tU=BRR}mOotTDQ>r6sYu$}%D_ui?LLe2Vp09xz{Ej3^frG#rhKp>)tb%czM9 z&^U1+?OD4ZW+JJS*}rU=BE#W$Kp?@S^)i^4q6-%nK3bN5Uj=FoqGmtCU;@;}#3P6& z-(Fr*?ds+uass9{{pjS*lCsM&tQQCb27{}9t$tfR8d(%nY4DIT67qoXB4gCmf?!J4 z>wW0)wx@s=uXg3pIYs*;6GxX`Uxt87sXW)MCH33s(WjXNeg;ySxN@j|d2xDy=wrMD zr4#Fi?WY@|Kd{(ZN9VU%=4l951q0WX$wB}XYSb@?M#oMou%RSWE{Rwj-bTlQ^CMRT z+~9_b_k=R4_q|6y-T}-mdKqSdEuj%14{12r_+WnoYF)= z?Yl50)B8+IBWjVPmN?Y3@$r^M=oz%JT%US9$256R?)bQPIu2f`=OGmUcb$lmASGny z-kO7XflgTo?7>`g9@f$l;Q~@4L|=MYtg;p|#N6sx{qmnchD5p`zyvx@OOkT|b(BVl zD4ks))l7EfT;!#QvVmwo0ja;E#1#}!DCp*?oT!zG49KxgKC(a&rb;i4pPbK44Yu58(QXxih%PKpLO4sjqJMs0XY^zqzDv1s|ab?1BvUhonaGQ#l=Uj$lm=(Ab0;@ zKJq%yv4}CYO%>utjjlI48DE{9cq`a66oU4v-Z2)mwW>6hf=0u4QvDkUYrUOg`W>n; z@hKn%Jj+JP{@2^K;+=09-xG7GXfKKt5L2J40NIua8oWPO=1F6w(drY(Wyp)5$Q`35 zCX{G!xmA=ODPcczQ;uXBqI2NSnePm_Uin~4BSJtjLq|Bxw)n+tWD!FJN*@pYJfB-8 zaDk9~-C!R_AdVl5G3zI7gPv{yO95wil zA)L)1n`sR+@#(;d)dgVuwKCuq3&cam!F!=-6yt$dFYnG}A^x=yrA&2Rzb!S0iZ$4nfxlhI( zbam5TJoiXljK=aMIg(#x%__64pCF7^ttzOfz;@t2$xR;oV)isK=VzDU32vA@>gDvK zVovM#wKRtj-~ogTG*G8*Iu5iglPFXJ#vq6oM9paY^DRSo`(4PYoN&+T*xT>mTw&7q zrP-$)bNYmv2xFFSDC?6M{j2hqGq$X!}~dcI>Hkavvaz#_QNBxP7K4kcib z0_&CE&wk8XkV!{LRyXsx32y&X)_JZipg{^`ZWm&e^?NAOT*?%|cbJ{x%8{*>=fn=o z(bJ}5SwBawD0;6S8jq2@|Cs9ufZ=?Z5_G`#s~+FEmc^1%qC`gd^zCc1kp)$^q<8F| z+M$N=@WjctV;>0+i47r;e8c1G*|ABDJI-k>3Bcg`Y~-~gy!xC_{iIr~-JLKdNi+e# z-5ON%j%?|*5h8HbLk6OLG$ROLhmAA_f>Dn>mC?xqD6;ul`6rQ$%9OU+ zU=|f8?Qw;!6)1@pr_pf>bTe@M?&0)q;9cUeYPjAXwk*p!t@gB$jm%n3sNl}whvIOd zltC(0KsM*(r@5wvGO?GlKbXCHFNwv`Wb6i61Q-{;8 z$};aD0>ThVN^ie8J2B6x2&#T+Ht0E#s0z3Mm4(d%J@Qd-usY-(JLsI7*kz&3pD@I& zivmU_kB7A#Bq52KU~J{~j+aTHv(VfC#sDgcQtFp#Vj=Z&;H7y3m>~g&K%qS#ql-~g zE)g&(l4f5Mw;Qcb#Vt!GP0P|jm`+ArCXud;@SGDq=4xg`*bGa-O$wX_i@8CzSI`U| z0lLJ);~-f5_LGAk55Z~(;INQ5xGHDvozEfM91^2kP*W!Y=TPly{od=eoZ$t-oRYKt zqq0vc8uTl{6iQY#ZuJYz(VeY3n*fJl*bz4N7QTYQbV0%%%tB7Z%pixgOrR5`(d$=8 zV=%*_SaKj8q|muf#^$6OQ4;xeGO*ki=rV5^v`v%IqNI3#%QoAOq~zv0Ib%yH_7$*H zUt_$Wn~l6f6+$oj!u~@A&1Bxz!hOQIY@>2)r-mQWm3tAB`hS(nk&(2hli@A;M z-)HSk4t{#yyXcvCc`|4%m}7o6ZwBLGuflJ z5q|*|W%-0M3Zc6WA}twk1rafRJ~RNFBK(0n!RtYzxYAP2#RbM_O%me=x<-4W&Ex0z z1{PQ4E%h3k*cz)-#0ULp@qs}xo3I76f(tEI4KxQO3bf0TFz$E_9FW0`vqG-6kQJ<7 z-kfGbG#m&DZ%fTB{z+2b`;94-ByPVTpIb;}3RgaxkId^>0pUW^yMf*#z zkR35B0)w$ovND`HrUF7M+j?-W%=;^DkxZn86i$;rR1dP`1QJwc%L8 zA#Umsn$UYl_U;YEk;ky(e*!zfLiOGcdvj)W^tdFmdvo?_-o()Xtw)LC7NeLcc|jk6 zi2!PHfC+59*3$fG_UI824r%lY9Y32!+L!t*`d}i{h**M1#Ss8Wgc_fe4XW44#9nQC z2fVeoYt@&EHly;RyFFH3oRc+4jTZn#;=@qkqD|iYkNJ)lh_k1FbGVYv?Y@|rFb=*d zY8J(9kPUPMgmXFY7(@m~Q+1y8WA;HIvp4d|^5oX-vbW+zK}Iq(>^^=Pp|*Uk6V8@< zS59z?N9Sy=$Lm#PH21gG?^48^d=t47i)=kOnp1AZH!#Ks9E@&*IB_x1Xq*$UQi6=^ zluJX9L@cg6vdzEA7fmgg7QH8IrG7kVn(1J9a!;!PIN@?By2U-(%1$zLQPDc7!T641v$Cp>z+se6_8CV{ggIp*D z6(|k)g7rhH(>sb%!1u=Qhl4>gpgJ)Y`U^jI>3o?RJ!0U=lva}wQo7?EHMiB=i?dbU zGe)FiMK{B?R1gXrdw@*sR~@ykt&gR6BymT*2z7eniS99?L{x|)0t3V2(vTljth{P? z%)LwB4{k}i+h_nw!Au~hswo@YlPxV@5PEcX5Nq{8`Mf#EreS@*icnPC@T>W%CxLfd z`!C(=fI$B#+0rtGvw%}cJm?hhLX`h0=Q8|2zUciTE=76j4y@fD%0^~FLSrnKJmt7F z6tXBAF?>wRJ8TadO@$RU9Z}LLfrG}|O%LdOkZ|dUU1yWBerow?IovLeuIwt)!B@uU z`9KC72AYB%F8gL35NW^=HfS2}J+^a4=QzHQ!cPXrr|MI1a>f za~@_91sJo=40!WqqjDKch1gy+uD9Axs}|XmG$*hv^dO1BWaUtgVjlCeIS=nY+FGg6 z%l<6X#rpr0WBM4Ol^w1unjO~x*W1x9 zaU$^wh$V)tMhvBE7zPf^ zv^+;0sFGv+FZtYp#F%Ud%1Frf(j!`0y4Vy}76Wg!nPTn1hLby9BK|O@0gi+jQI)k` z`$;*l)e*iR$OkA8h=M?)T?UP;jjj9acQbeVNBP||?`s(c-b6T?_y2U?lFiL2B=WG( z$_jNonF;bfr!X3+A-psl6J9pDX3Fe+SZN94p{Q9Ux=r!juJ^Z00RRbCPZejw`?HbZ z0OcXxReHxt0>RNSX#ff{0OK)MqU+p~vmbL>MGr!9>SydjC?>3SoRC4=D)|;SqfPj% z50rn}GGc<(BO+w_HXOBFEJj&>Ue3arNre@&zn+ggLHti0Kbf&-ZVC%KxV!XBO)p3c z+pY4Yp7Ve16O>=shRe*)o{k*S`kmyUhlc}TKqpZ?4fnz7Iy%+)N-n{Bg||-#11?5h z0)ECBMw0+f0BGu1=lsXBA5RI^Ju~9o{B>hizE}F{7#ucD8d& zlR|;S5f`dhREVgMMtOZB`(u7zZufy#X4jS?mc#oeBV#0H-+fKCbSLuS798k!&1h2P z(dM1m^B|n=Lt_&stE8p>vpI-c3V?}E+95L)gnDF4OD4`K>B{iI*GqO3JUeu%lvBN6 zewv%`K?rHl446iwM$EhD6}e9^04d`oCx5J1;Vf@3E{A-!!@rV?ad$++!u!TcEzb#V zbWDHbi$hH|U_0FPimnDR=Kd&qvI<9wuwu*`^j3@#8FCrsT_^L!rt=#Y8X+(g{cFUy zej8m!P^^r9y&fwF?O7@+dSq!1sHZgP%zO@JypC8Le*u@p1um#LVsUoe0Xd(55%>0d zh{YRXfB;=ayr**mhpf=NAvg%ykbyx;3xkf+>~YfABjFUnPN*qpBy4WGSN^FeP2b@60|u1(G3ztj6J#C^&jmHn(cTk-^}hxSd^Q9Q3%fVq}~Y z9}Rvi`)LxTw>KXdJ-ejEf`O=E#=s3h)Z{6JW#{N9V*?qo@#2{N-{t`3EpRD(yNezu zZwu!hSahv1iEn}G1yn8mLUv~g(j6p0(lOB5khx!MX--&&76i4VcX^}rWAf7)2QLk` zi}=^~R?0`{8RhdPIoQIlG<1w^A=_fhFWb3n&h{oL{+M^LOMY6>6MGO2s+^nnzhhL;eWEAvyRf}V;jFr(!LzIOKB%;6 z<>Q{%et4`NWr~*TH|09K>F@}`Dioyqu54rrgu95=!e>;CPTWI`|AyD)%ZM?$oZeBq zQa`sHL}}b-+sIX;VURd)7|s}e5=ab|3J({woIn?#N@>c4t8?y_A(B<;Xw(W13 z7DV^Btg2)gp33fQ`tk0;D48Yj6)`5UA08}o(~W7X4`de}XEjiwwG-t>m4(Y6&PLv1 zqO+R%{z%JnAPwE4uyjd2x56O;X4!Ze_&rmvytDgbt(TZA9-lJ5n24%+gqN4rz!a`W7yp9qy2Tbef#(FeGje8-er*6 zk7{1z*Yho}3I;@_=`7-zw`L>1FK>DL;(X*;Vcc~rqW6V--Vh(SgZ)u;=HS!W(ky~6 zLG*^*M~9&t1#{q zOnCv_ICWiiW-iN^lX_4Iz1r10I{Bn*rDY z{N`hCih1;2l8x*X;19TP1>&J{kRXsMncbt`o^N{DTy|%6XL{-w*~seHGeP_7()#tbnWAt7ywvYI#w1J!KnU0W0SXF5eqJFR z0Fa!Y!P|3U77oM++9C5Wo~n}S2eD%?b2bc&J4P%I=zaXkcpCEl? zXZsJ7>EU6JZ=`7mJ-FO{m(pg{QTQ4J9QPL&pIQ72zoMi3k>NjlCEBx`i6hk9ss}EKbKgV4RJ` zJA$PZNp-Hz30P^<<8lI zkbmdW?99}My0W^9H@7^W0GEzfrCa9UtBI=T3-52~-OZzsa|~K%q^MgV$O8;hC03>?WXt{EhYJXCo^m0poiNpL#3twB;c5?OR#N zJ4|N~qC~Qz$Ttyoy)r3SZ@bMAl8-cYWNM-}GE8!5Hf`J8Qn7e^N(7HzW__PmFmVAnc;8)6sjC*b0J}Jq0=KPSWgEvkN2$V<@$BbX|o7D z@s@y_6@d-@ASY()gP}*&kf$Ri)I~I-@5$y3!D%>67zdVxwyI^!kI1*p(^wFBZQZN$ zxqC-Jvo?$-hsV)Ix>zs{bt~Ffdr`h^{?bLuTh?oSBs{%-89GSiaNJpM%s9pyXc+Rb z8$_}APIzw2NCv&{pw?CZiJ%KSNvsw*2OVY@eX3>d%A>6RX+ARR*s%cj&|RWiHYLqf z&U{yPV#yH2Jg{ZL|^!?*f920z~|xDM8_i#bVv97y)| zl-)!C@pw3dSCee}atITZ2?ARII-ETiM7&Tcp~l=NQtm zL7)aaMizuR(E9yj8`u3*KiW9+{xSLnSb7*UDew%vGBKxW{``&(YcK-cu&=kvK=726*Dk$hyH zz?G1Xe^Z&CQdEooC0lxHaY~5v-~`srol2@!IP>a!#{(+{?^;E9V8#TQz?e&6EV-rk z7j=X7s(?myArH^fu?F=>geI6P#V5ly$pBD*d&nY716=lhTUMm6b3p`*1 z`c^2(ZmU}FI@{>dDwK!%jROKkW%6VD&RT$A+hYizYwG08YBupw4a4kHI<_DjU%}unLg^B0K?JHXs>2kjA zb@{4;^@Wd?mw@@%ZAwF29*c4SAOaSX%McX`cwwl20vSAdeHSsxV=uqG{7925TA!QN z)~AG`szU7iSWeF^ahx5l?c*+y(a&c~?+VfgnUM$LVugS^f0@lq5?!UR=Jba*tYIZF zs%UE|xcWh`Y2GHOkA6|IZ2p}&rXvF~ZVoG92Y@K73WP+<5km|6JZRnKxz~J|QAKkC z*o(f=*S{sFU@9R#;FF|IfeV!CU+c6q#~EUFxRji=sUM#<OF?n> z<2kTl8ggTebQUldWeltW*AzF1v) zu4gngP+JNkdQZtdorCi^T9||-8y{unNE~3|}!0pcU=_tN{MV z@(3&|Bb5=c&pHb{d$^@Df-f{W`UYH()zS}I0@lTs0zennZ63_dykpopr7t?J1oCsd zKSdAq6NsU7th*bE%AP#vLj$-ZUM0&&7!8zx)-y{+@U~dTEYi+F+hQ4=@$-%DbME zeKxEF2@(cIE(pUgymDjupU5G$3GueexJWtr38Rk5X=o}Wp8@cBEP^hepQxP=NCTNc z6Zzr|+-kTUmFZ2uSpm4mzXTZJh?{D$cN_;dcc<$($~FHuC|(eg$4g=Is1E2vMS@{+ zjBCSlLFx%61W~Lw)-zX{8*tJPX~AaOzmfFz%oUo>+9UBELUwe{Y#b{=?9eZy2IZT~ zJUjdJ6bQuOZ)_ooUrEyggKXa5I-#1q54AiekQZP%ygQ$JIFLbb4zwiUy$Wq+F3#p= zV$2&%OxjLGQVUxxEpd-oHabREFE5|TmXPEiA0_}dW10oSj&I7hy`$JjBuIs+t48MCh=>qNq;%qv^}g8?5yzl##(=9%VMHu<@`g{+)c%HNH~e?DMkNSQK#qukYQR~z={3=B zBWJ2&NH7}UsLTx2DMw=UE4f0y!z>U`*E>{W8JsuxnS96l44{CMgi(

b#((rBNIr zB-P{(=dz{efmy(A!N`~z6sJPY&X@8XbA%%Jua{{mrN3f0-CKwo2_yT;B=iQ+FU*aK zga;YX_sLOrDuORPHz!~bM70oK@irA2gw2?0iF)Tv`Jz{gw})222V=>=-l}2gwIReV z&?6VY2^0aK>o?>OmIS<)ItAl{ehzdXx*cniB&L)tw z9Qqym=BOWHI!u$&A>CKzIR0FkL@=bG5!@h=gf!?sLKD3kmO9@Xrg=KTwFa=1H#Q6B7i;eOIJUeOE*ZD7IBX@_j!k^$qzrD{3mY6e;>&ZIVj-3Y|!+OY>-}-z@ z?{fSYSkqa9+jyIGA5IgJM zrs0unYI7{Rzm4zGU9WF8&<)Km{ywZ_gLa(3V~3jAB#a?3%OsK40Gek>OQGJA32$fW28H z3^wHO1{+_$A6(igWi>QA`WrBYC2_x47u<>IYT%F$4YTOVi5t z770q2``c_}PmHoM*`i|~%;#Pzjzv92P{xFjv_D6!mfanmupb3!1jo^CfgPYdWM~a8_Px0u%sC)gv?~@Bx^a<=q3snXH+!Mp!HpPS0MiY*RD8Uo@S!i$C1#P)QJ#8_rg zyKE1j2s%~8@C(*vwr~p{Egd;v#6N(iUFU-Oc2tA0aWDYlK5-&^{bRYBHmYMYA$_ex ziG?h;LECTw2Ks34%bl02?T+wsld?(S$}FXn9ABNSaM9x~njh1&vUc84*59sV@Irc5LDyuIG z9(%@0i5MEvvOPr42?e6>tk17!Pkuh(9F9C^kHjt$?!cpRMHW7sJ-H>08r~c#Q}>_j zyDwXso1qf{wW?JX{yrO-FELrzC@>5_r->=dzbfDHV#H0iVl};Ye$HZLCi~76dSVy} zU|1bX>%Be)@wW7SJNjSsj(N^x53p$1XW703rL_QzbyqlfOotarhjw=7m{uHUXo2%D SEZwOtJb+CS1I7FO+5ZojmL^)vV;7=r9hOKyTC$L)0WFw}4txU3}wPJ3>7vH1l9{^w^X zt8Os(<1gO>ZbQvSQm-8QEKA8r$T7SwnyI5>8Nzz9jRxjh!U$(d(LcREFv=iRIy@b)K3 z0x2TRVsB&WQCVqqn=)-VR+qDaw>RgnW{2;Gv(_ zPE3^C(ybO(PJt=U=`uxE=2#qV3+FaFu${egZ`rr-6lW1u0QD^v(`<9(bG%t2KFm07 zoh29=<6N{_;%P;2j2W@B5?W9EPGHnXuW;lzi-Ex5)A#@P&V)X4?rJ1sWnkWHb`GCb zqi>hFnRNq*=3_E-{)@E06BGSv*s;6P8SS%z>Vo(%mjwp=fUGA01*g zj|mZIfjyiKhymW#$X&HBeBDltVZCTazRTh+U`sZ^ZYi?1jV-_gT5~ypr^~FzJ{?|P za0^a^c(OW7an>SRiC~&PI%MCHdD8?=WV9>aW3^*(#@LW3l(r@9$daB&fzXqVfThxKJjLHFcbrUm`6#rc_RxpsVcvBgnB%esAg6Mop8 z^n-V^SDWAK41c=<5bkLSe!beGl35Uz?_bmTN;6%n2(8!@dAoc)fOd;nM6Z_yw zog?J}Gpe_>(o#TsA=PCo!XRbXuq4=5bzS8%=EDbakw2DfskD@`IZW}`@m&^|&FK-+ ztkc07i9^OL6O4n?tT}~tYe@-qYQEsubZL`%A;Dh@oX6s9B{l~(O_4>})3KJKVv8+b ze7FufG{HvVG1lU6U<70@by&6H9R(IhkzB}gSEo#eJ{5Zyew5cQ!5r5CVCR z&*%lmf~EKfh0wsL(q_c^lY4P@@u79wzFeh}vpF-GcQv@5cBZSp3h2oj+&R6|;KMZn z8NhAu>mx<`wvBBj`?NeGAOYzG&YVI{weBm+q?l)iFc@`{tze^hb==@lw+9>$L{W*( zY;+Rh1^dnAETS0@gS*<)F1BFi(*iY=iQq(!&7PaD3bWNAwVF5I^oPKz8INfyvS>bf zRm_90T8`(ZCw1mU1>0y|a&^+xEdknd!2IzMKRC}sseot>m^I|XBmI*3*+3NR z%rcs1HL=C?*w;g)5GUx2$G6=5b9^cT;Bb$z;(T?`!7TRKG*6!fdv9k-j6{!era5fI zVlhrS_0+uvtr$lfG@&sVvO+o;u+-u!1lELZ+YjtJ#b!WRGfWvUn#b3#cXmQ9+bbXs zPKN-_F-4b@Sg<$whn02T5|?(Xj_5=<_FFE*Zk`9)4kkt}AlG5bz9la|F7P7hJTI|0 za@)R$a}B82p`7E8#$h9}&v^u9ShCduDQr^auSnhK`Im1V2n-r7&?5OtC~;$>=a{gO z?LzWfm!7)0C1$+93{I*jc0#d%PFV@*L6c!L=VWbYmRvbq;6x_aTo7-LTnM)`Yl(97 za?Ff{Z36ZlNEevKG+Rj_P6pC^IYw&eckaKM=Ln1t(za~WsZ@_6N33TJ67``or%sG~ z_SC2+z7y2JNst~8FuA5=bvMRLzuV=+(%%FQ#D_Hpa!$KEo;1AMX8j*hH>%mwQeiR0 zK;^c$#K`DSf}$Phrp@cb*C0?Y$MIfj0B%E6y2p`ibJ1}1aFjZsU8#pl(;pqRbGA5 zDnLlx-LW-KJon-n25=joCgfRNwl=0DsGl_2aZapi9I8Tj+~s=P{oJJ10zWL)Zp+Ja zJBzXE@fjAe%Xj=fx?T9o9}Bd|bgSEKXJeX$wO6Qa%PkK+In_Jvvf4AT;5U8RWZCC8 zcc}oe;MaEkqIAHOZGv}5PfrO}A#`+aU2t`?%!#{hW~tOdey%)iKl$`7z8z`o#KEKi zxDDZPR!g2$Q8Ht(1JvcYc+B1-cGn1%vk<_GeOL6}ANq<4kV5{c-r3{cX{-W-yqr6I z&)Sn8hBE;4`dB;8bf_Qsrryp{G2$~@bV;vlC$*zsMN-k!qqJP+^Zf? z$^dRd^%#o-3}xR3`_E}T=KO2{4oj|Z;oP;9IkH`7RUYGdv=j^`lp`9>G+U`e8}P=w zW?MT#E&)#4e#N{`{U19$ZG?y0CiE3T<4A4ce(PSW*8=*GQ}pr~kg^~w zSTK%Au@*V8aqK3y)0BvnB-PUR1E=eEUBb2sW-BV)ZXr_@;*HE_It8T-_QH^^KYrWf zOTjY?!qVz;lS)p1!EUFX8O={W|6);ie|chsr`sR~iD9}W+v!#}+vCZlVXuF>POz)n z115C73sQ@51O+iw*SZFunrg!v)BvC;#97_Ujxl98%j8gVEL8|LR)k<<);{qQ^6AZG zQ@gfYu~h{KiS|a1x;>*C@BttSv0V?v_Ssf;j*m70ghV@VI`;R*F}GD#Vt)3Vztd#M z+g>toDgT%aVI%)7Sn;g~Tl#z0y^Kf|(2h4ZcXiC7f*$`$fZ=@ssBv-3 z_AqW$(jW+hb9R(#=8OldyNZe?WYP5Q^`HLg<4;vqqVaL7{#<+X$^-_0`0L@YmgK-a z2454bS&Ouzho+`G^Fr7N5oe!x-j||Vy*u1UJEw9!$^n*K%fZ>tu$4nfWt!D)8|tyZ zZt`9$FJ?!C54`k}O3uE@XzsDMSG$05%w<4IWp8Uab}Qsxf~uQqaA+K+@wT5!dm}&d z>@1b5I0iHTw;_yN5AgWmFvf<3a>D6b&s+2PUq$B`JsR)hg5FeM%7kRGur3+RI-JmW zxFkt?i>=79JBv%I<`fc5&KZ0~AD0E*nW~W@df6O9p!nDziqWSsRmN)Cqz@LNR1ffJ zSvBj>I198{l8uTprOIB?>}G1o)ver6*~$$SFs3CU%T@_J5gnDz8BY1?+^mnE^6-U4 zT@`zN?~9lJec7)8<3Iqh=l8T(+xPXiRF`350la5WXG_Te;*ip1ci)*ElR9h?J$MWn zpWRl;oB^>oxFG(r@PE7;I}f(6JJqyBZA}Q0?e9f@Jnn0M6)=}mZ2rXmwSo_Br~tA1 zH$B_^pPAA89CI5YGoc+7*c?t%YK6|ST-S0{PVVv#R2D+ytR0`)E4brN41kkA%PQPA z7LRnsuD(8XW~YsZ1X5T!jzkADecbR@xfB2_-MuF!)*4q^ZA1vX71MTC{%`zuf<9DE z5p*>ybWXnT`X?h7J;hHWng$_A=QloItARB|kk{#r;WwpN3oLE8=Lo|~bI$n`_s=`m z>q32oPJG1vFPxe2&82iXo#AXcdpbQXhqc1XK+FDb+KS%qM0vHBZE>`L!ws4YHcAhi zPTpoh{If0kKbFtFmBfnoahqikgQLT$m7qB0NPDuvZB5Pq^|b4DG-&hpKQJX*5t{q> zr)dCmV3P@AO0ZkusZB42hJmhe)OL;L#6J7)ZaE4*LWb)BhLcrMkpCaE%z0})=^74L zGo;<+;h5K$Iyxl9rK)&0X$X6%Hm(k@I?QnLHVJi+gVpVBQntHEewW;=`~OQBHQer{ z4*$i!YyXQow{1_(Qz_)WUtO*7m}I^lXrcVUDfZ4--C{_a$0daiThm7Ko?}lAEc_ry z1q5)4Jq_niUbgKw6(HK!-f_^5)fXcrK)QvtwSWEY%e8-z03RWAHaKSvYg)Ux3h1r; zX*92RY51I;Tb&YM5NG|0@UPe3eu9mdvRuSby6mUoUxz=@O{EY!YH@kvuUfP^rUJxq zz396efkmx$Nq|oy~-{k53cc-oUW#*S8K~-BNT8F$%G1lQu-1 z@kmzE)X)HMyeC=hMYID*!A^2Yul!Tpqn@m>oJ}ZXNKG;-2rbDeU1BPSLP1WxaTVvmpX9xax^hpWusm^)tYc}iZ zf{_6X;5O7i)Cax~b+GrY?7yf*1(P+((D`!0U7b6dQ)5o69L0Ly(V&0u{Ein?Kvzz& z;o4VwR~(uo0dh~R`+0WyKly7UK(5|32b%Y3zF@fo$kn^rx-2Zr$hx9z9kEDPTo1Va z#>l-Yh1gR|N3Wdv(^Yk3l*XooPBCD~G@wP%Ok?%?~$@h&P4HuOew@i#|pe;iRi*+*;#JwR@U z{KO7lMmJHFA9*TS+of-r5YC2-w74V$3%GL}`!-g!9A8}U#)($Tq%IQD2eC8SDa>EQ zKdxV{pJh)4UsF(wdMNH^O9`>Ed)$b$msE`zo`?{SlROS-)?$|vF?o&`y<)RtZcFJQ z366!WS_WKG44ghy;{+lalVcUixsCzOLyLz(J5bM^i0nweTPJsZpV(7e3vwH3_q60# z+n8dZZ_-YuFtJ75R66AFBt-*IoUTb07Xp{OXBs>@>4X4%2q1PP2b7nS{Mf0mp(u^7 zA{Q7E{f<(8b5)5LFW@ciy_Qp>!GOEUFJ)sTa=@NnzJ9X$`4tl2^O^u0vps&{!*MEr zwQ4l)9(-y=;#nrD6v@H1lF__##)q|Q{}Rh6U@4|~95gmiOc5V$3zLO&-Z^YVx$h)y zxKSsCUb^*m>f*p)wiK}FB6(;=3BQ&V*j#Y*au!?WpS(0So}28zOt3g;?#OKl7p#7<7`x=H#8P_A=0*j1}@!WiS4h?c;?DS42i~>i8iCTTZhhp z)vs|Ogwr_9mY+{;V8T=@>d89R`=1QsXDhm$UgmV=woP?nNt@zq2>TXUa>NKV^J#na zg+@z6cfw%9+Lc&kYJn3DE_RL?%^Xcx!yC%6LXgG+hoUJ9G4YZD8P%+6Ve72Q;0$DV zzyXm6Gs7y@)yc4>V;8@CS@a?VmT|F_W;4+R7oPIZM)SMtucUqx&7>}-J**cCszPE# zd)%HP!Rt`|*vYexUlqI_gX`aJf%`ktNgicjr`oYn#P{#%-{|$NgKslzT4drJ*nO(9 zxpDSv!3OhLf^NeE#ULWlKuV*vZ|`t7xX4yFdKHcwmK-}$YfKp~TQ;_lkXmaeJ>wsH zNSa>t;){wbF4$e^PK3$OD^g>kb8;|K{Bu{HSoFck8>2)ALXshjoMi}<#oI9?9BKI^ zA4l?*Y61y952RSYUblMORtFM9INGcmYi=!zUeD0zE5*S%tL#wlb)OdneFOq~$gCmP zA^x%!!BfOJ%y`zctLUw71)?$2R%(Ognr5|${!VFkhUGgH)DFlzOn#45X&=gm%A|@>{%C#}6 z4hM~%t;AA+GbS0nZ@H#5$n>>BvvR-D{?9@AT>iNYk736#j|~mJl5F7iAmYzI+5Y3M zis#?0B|bSK-HOq0Ab_S1Bis7+AGYn7dU*T3!8s(v{@AR^msu(Yn>F96%up;DzN#mw z`xEZI|Low4gL>SEb7;S`!=b{&i;_bu2|1+Ar6Lk+EkaC7h*ce8xR;xW#o4N2NGXxitA?dmAM=%n)tmq|#S3SDRd3;D*-9Mt8ghX$5#FW9 zwoKWXcf)nvaA}IbGa|7CB8B23V%N^g`1y(FH^d8!s2)W)DOqeJkwSZA9vO0<^6|8v z_fO>tF$N~tnrkgJ;Q%ixR$H9BVZ5td1E%s|8zLU!fZs%juN14bkbmc-%Hh9l+QHNd zLdd+!GtuAC`*-YsLl-=PaZ^{(v_tC=(?HEZ2!MZU&joFk-p_%#)yOV4riuAi%PY4N~}sU zXPPxn>$cRP24zs6ldKl$;ngA3N%B~*Pud_0F4v}vwRYd?&_j|vNCBV-DUu9xMgNKy zc4@V_@kDhLKI0v?k4}C0>B+Yk0LNxBHXV*$s~x>Y=ABMPtpTPko*__l5sh6PRlQ6V*oZj-cP( z>eyL|hmhzTB?&eIvaUpm%@vm#tsl{Kx9DIfC2YFj>W4$gu8O+lubkaDa=i@uh4AnL zDf3WU6=I`#p68#vlNv~&SvLd8;T8+5{{#yL7~v;Jjs@#g9*T4R+O>c3L@7IJAt8{d zStRn(3!z}RWjCkQnC7WFj%yXz)#*b$R@kqks)(o-?}Y}FhJz^*M)TybpDP+Q~z6R|F98Sjw}txmcv-)5(@Q?lu(KbaQT)^gG4(1Rf+DQiTNMy$a>mwdnEZ4GEX zaLed-uFEbVFB&qEmZpYYhlb+@sp!b^cH}70Q7a@+)eMnRP-4x2;*0)gsP_ak{Al@3 ztD3wPgaw5Fp*!Z9aGq*HM;a!O)Nw9PE+!0X0wXGoH62#XelEnLO#PsVKdR5hRJ)RT z2>n7V5*?FB9`>S~ka)O}u`9$<)nL+>{ap2z)l9LuT+pL>c!kb1vlkLTE1+(l$-Bo19pwLZ#PXg{PN6LC;Y#Nll4#oK)TGkSy4A z%09vvIUdnu1bKCETEn|;HTAN>DWYqYj)Bl<(#V_?gU`q2QBQ;b}tR{l&X>(EL=Vie-Z(z=zS`s8|@Wb=-WD3V4Q7>|MJm@VD%p65z{DEI7$h0*9O* z(3k-f|7i(yT*W43+NN0DyKB6XzrLBYy&FVB@Yrn-E%D{#;((=&?a4FQc%wTU&+IC0 z9V&Q-sxAy9h{}xa&A&9RNSQZKc1;G&)|8|+iu{SYNoeQ3&-t#Y+o0Yje{p3M<}o=d zAQKcr9)FYUQq$9ySB}XYDpe{Xvr%0E3ujEkxX2Nlwr@mL{!Vn_9Pcn?Q`pune)~v>|&QM+?r5c0);W8B5= zDZYRD$>7wP0wq#${LvDjlZbsU?@-QHp4a2{G!U3!P_Qt2il&%o$5P~IukQrc0L{o5sD`?`^?2T=8RxE>NJ1b8h)j%Dn@BO1%N;*U0*I zm@pv7W`u;P8V!C%=mpt!V8B+z!GRQD={MK03}PpWDLy~HYG!pH3v#Sj07z6qE-20* zb|XV*UK)P*c)!C{^J&ntz-c2to43~iyo%k(P_K%F2J*NTz?NK9^2hI4j=A^Nk{wY+ zr<7l$CZ!i54Fb+3B&W3RI&#xm|ic~x_G~2K+p-bYx5ret* z!V675Z&4{($Zf0vz$t`#h2*%x`JL=6cjij9W9_P@pANnJl4Kwy$C?3^fq^Ynr~oE* zkl}JWy0FXqL85b^e2HmJ0Hb-;TlpX7rHqkS=?+h};ywFEKE!A~Cue01VI=OJ1HL3FBp`W7xCB)1Jur zO0b5r8EI=JR=Pof1Y(y>xIc7wVepd|z~?~5tR1dlA!;fn&usKdJ#OaHl3*vQ(d_nI zyAo}_CEAJT3zLGRECOdrU_*Xuf$#6ryKdkX7S=Pj-JuBLs#6hmq!a?VYdRb_8Kp`g zpQU^}^Z;LBRBHgx@}XL}E0n`B&Ql`hE92hr+;gw9?S(0cA`o34#J9?=#T(M0hI?lX zdCSY>0*~{2huPxe!*P`*pSA-cMit~l6070)caFF5IXgh$g{2o*?L0j|k=eXi4H^d7 z-~SN+ziy8JNF_zXiZU0Gi=-&7`7COorB}sK9Yr1DJKVbq$6sg{*66|C3LTwO{=z_h z=Y>HfXFe{H04cx@{%9Z2tNVTl@MqtT(BSm)6ZQVyBmq)3Y+3q4!xyvJY*QQZ_*qlx z+_|U06-nXG9N?alWkIwBAD!Q)4mXI=hDQuwpZ8qHa+9cljD=U+&G4EpE+Qo%}( zTvnb`z&AHSYO3Pa+gfJQ>V+Cy^hf%hW2YYOb~0GHydn@G@)Q*-G519BcFWL@1`!+# zJCv>>yQKWiiQ`#(2?O9SHntuh-IxynzOITDc6b5{`(Z!C<8W|zx>#?L-T~xq)&Ur=8L2Esy3nXU>kC5#~YFGmNF+zwg>)&+6N>?X= z7lB(nC2)QqG6Bs5SHI=)qeHBlVkxDh&IGHCQXL_;Owq+~Kg&?s66=qPPuBTIGFDLd z_YJ_&B`=dN7~`5%CvT2G#Kj?MxClnARSo>ipWLtJ_E+yQBpUdp%AeRs3+q+8Fqo^P zG%{1G0>I^t53{l?T%ihTw9#4p#`!cm@Qvt2E%=m?Da{-xO4rFh%vtMjLxnpMhCg&T zp}1~HEy%% zyE-dZ3i@zLbtzH2w3!s&kf!~Z1K)oY9naSWb%2>_M)Rmi{q~>#jD04SV{N(}-3A#e zlmMd~T`3lr=lnBjAjkM zZK$U*kp4Q13w#Me@aYI}rYQ3Xorbm&@0JFMrga_%41Tf6?`7#yBEuyQ>jjn$rYf3z zd2|X_jY>wD5*Z_0+6Gmjp()?19MIQPbo|N7pDVvGgCTHG*%Sv}5*0OrD|MsS}j{L_?c;L`}bg<0en8DwF5-Qqg9yF=No?AI7C>ikgtxqAl=?6zPTORysqLYgjnG8Pq< z)y|U?ejPZ)_R2ZGbP4@P0{ka%z^2KSXS=ulSOWZnp|R%JD;M7_Q_X&voYlh2vDH>x-6#R_NEvr`wmTXi%|u zq{^cQ__wR7RcIc)EpE8%AS%+yLKnhQjcI`RcGt#k{0U#c@^oGkN8{u+}w6*)H-25+I zm(;#&>%j-`%_l=1{LasM44V>jYnupns$$x~vmobZ^VBul*LGv$4LKxI;?PhILaJ=b z8O0G#0LJgi)a3G=IvL!%mupKQGr|8U?9)hMV&f*+OLwG1`4$}N#?v2_{)}S zOrYTl;6QN|wv8)8j1LDkZfNC5eQZwHnv&m2)ZHuZBhDB&eB|ACC&}UVTf%!brtXWc zb$E5Z__ko!Yse#tMT|(zlPTZQVy&mcbV=+V&WVS9-u~F2LwxOHre#i|ca~uB@Z9%) zJ-1a-%iKqY`N=imU%sq1?Sct`J1dHtjJKf2=>xMF4s6yC$H|KrdTREFVS-O2951AE zV8dfSu>44lnbZHv3$N{Caux#_t_02C5{D_S;h5R~$-iCO5(USo7+eNY!kQlPFhnD? zC2#QPP=jNf`T1}HAXN-$YrI(v4i=Vy`S6YAgsX=KbqV}Rv=bKVEP)>eAux!UEC>ir z-{tS4&EI-cy4r)_Ho)aauPjL&LKr;omDFDpVIt?C5C=N6;51J$NexA2Jfbb+08)+% z(if?|5|R|ks_GNI$^Wtzpvat9OExIkm0_x%rl63_(Ps>63@I8Rq4{s0nOU=-XLE&+ zmc9(5#uj)`9L<6xTi))r9^1PV@m`N%lVyN9A{k04(#O#U zSUJ#Wa)h#8nEP7x?k-HB!wl5Uu(~TLi%e=sxPd6mFr7a#vKJBrDC7^dhDM>Et5R&2 zmyYxfKl1extYetiUX-K;Q9&+5=t8L9BtBHRgWDDKK^v5gLP{AE*)|#GeL_ zdco9RqgeyMzDiY!1SrP>Hmr1I>Co!%DP!(~-pB^f)@{N{q&e@)e*3?ukz**tg0!mZ1gRz$)m-EC8x7T7fDp5kJ!%-)S>zdm z1(y$rHbeW7(u?yKw**O0ajY>LetP1azXK(?VIT*Lt~~V5w4IFwc}Rv*9TK0Gf`Xkw zxap9>sA?lnkX4GBlIrdsxvIwM&BxiPPfBTEP2R}xq;(0;wPD^|Mg70a0cFcRoip&C zI->Q^KE?1L($T3b8?l>RKi9Z4>O-!(gReaO^ZT{T z4bl>kWGdPk_@Jfbr2$E^fF~O^Wj)wV(numuMS$&vE+NnfF%T zXNMr2(aKRzwH7Ik%-f2a^Hco~yKo(ZEInv_WmLupkxef-u0f*_7ji)Zp!6J=HFRSN zsW9@m(BObrRt3=m49`^EE9Au#k!6a#+Q;h@)sR!hu*;KUqoN)-16ZPU)$AH#I<2^z zQr5QYL})H!*!01bmf$ld4(+z|iUufPfQK0pQhC?!u&7 z>{M)4i$a=lFxNL?DHV%tiT_hA#v0)sK~rxeF<_E7-!*@&dSYd-Ka^isBT*u%$Z`Ua zhpFyn4Jy7XupZ~J`llmwmjQ;6?PNTyUfZkn14> zm*Zr}VetU>^t4Q7gQHVnk`WMNNY|iIHJTSC&wlHxUk3<&sJ=pVM->%=v`mgQua?iu z+WBk_6d^R91Ljt1cyztL)QCf3ArBN!q|z^rH0#steMb)Gu5_%i=xhfS&_sH+Bi94- zTPlw;Ui)V8T0m@h9g^x#>151!dZgL9^SV+hW6|@D*evi0?n8N1p$@>rP**sI*bU?17WbB zP_i!lUx!#dg>0cT8E?{oLzCcVVJjoSVw39fkmhmAqE55LM2nQU=t-S`v8wt%bZFt^ zafHi|MmN0}a!8zMdOWHf$V>IHdoTPWb$BQkEOdXcgSF1lEC*Y38ME(6Hd?eIMm+-H z&yHuKSx+H_u^u43x*7l`SkZix+?;4f4sOMXGeUz$TenkHeSyv=3t%J9SXM}Wh&rxn z>d;hde_W_h{7)rPOl!zt0->}LQbl+bl31+V0$j=#Jx!Y#y6JM~b!^n2BxV$lqmSk) z1}di8E7M1VN#pw%@0A`PH8~Do+xj8R7%XJQ$hK?SyMMSeoAm+!KcU*KdhE!v`|sQp z-K!}))G!~#skEZ{;`b~^4+@mpYJi@!D3}NElF1FT@XL3`u zk+VWsr?O_$+}Cd|I{NVx!9A4UVU0$4VlS`u>>ckv?pU3o_Fw3h8UPNP0d%*uSoPU^ zrQXeWzK`SSui24GQrquyg`LqnrBTp~*`v5e&}|4xb=q-5vRHL3YY;#g@CeG9i4gaY zAjwX*OeEIODjEgG12~WXxwx9GMtmk1PHex?h^=FcTrKahf(X!f`EwhNn9$#l_0J!=%qvFG}d}>QkV_iaU`dkK+gcXNsq21G^QI%Pv0m`Z&S4791%E zS3@U2#8$tdG`KY3PxFs>2p|r2JwRR#*8reSQECdJi?&Lr@KrH|@aCSmTvIg8_Iyhb zM;qGfcCB0Y=ZOypSMCi`-NR^vkGxjA29G+QP!$6JWahhuf;=-8cLfS#B9@N9A^TgI z^G9(Jda{m-dN-ObY6zjGK|&v7O$|Lj=8kFrWQ$|n(SnGxc-bJ?|2wrM#uG2cCY}sG zMR4?U6yk=qFqd?Ak^N9ezX(;xl?Nyg>{BE68ccLlYB3rB`V#}I4A;C!EaNsUA0!=8 zP^<+7`wP58wg!RbLUJR3*>- znAT`C@7;a-TCZ9C#Yja`#ajyAlc3e!m)*Ft_W1@)S20YrNuzmP*qlFl6srzWc?)xG z-D8(09}ZF}#7C{XRTSFIM>zMW237uGi-1O$LAfO+%4Th+*|Pfu&KAhgyBT zSW?Ox0ZSUjue7yfd`KqC`1PD`yMA}vcND3!&rjq=$ zmU?HXYVhzKG88`6_P6ox88g&AR#*Nsn)Lvg4>P8u^{>xfVB3*~L?+6OGBz4l{9Xge zO6J^^W$b*TFpw=;bTTv@F*8U+3O8lJpT-;1VHshTQG-gJ|p`$4WnS?p#=www^n2^y&h^FVCKRKX(is7?$#|95=<2-Y)^~J8I@tP!w(_~kkT7TQiopacj0pk6 z8kpMhqtf3m?-bl?_C%o?1pSoi{hVoO@blN_{E#APre-{YD*eIgqgqj|_j z7eC(AuSik^MsZfztpd*2>U=5zGPOtpz+u}5PMmyt*~t5@q6P`=`LEz?(*yID_dCpt zO+_GHtqMR7G?DR(>zfu?c|k)8@r^<~ScPpfY{gp7stzv%_e@J{xp>%$F4_q3s6nDp z7WuwNpMzbCez+5g8z|;d4*QeF|{|!T9f#EeMjGQp0l)4APeZIfC&-ELt{>R21 z4!ty6@eoUyP~K_!P#AI?e8rb03!IQN7z)``v!9+a60VcoNB<37*QBLDs!jJ7JlKk5 za8tm8;$S)|pMj0-TV1-@f0sZGfxAqx+Dy^*;sOgtTE9J~Rl(Jt84`^flSxMN`qrf} zKfDnj0e#j2AXyLA1IiC1i_5V$2Nwjm1Fu&-JE!olnNKH+XO{8Kg7XZY~Ccz)d6 z`-)^6Aadds9-QL)_~XAyfZrzG-h%zRIyd`*4<504i38?${Bg`0>mWu!UQ`SDPhs<- z8X8BLxBLDwQ+HJeD5++osieR(K*Z2XrJs@%VlZ`OhblfRypJ1qHgo75Ah;~O?tN(R zXu$sBZH@2#!GBQ)xg=6zuW)+7OjXPWI}#(jZ?KN;Vm)mfDQ&PSa*^Y`^K&)mG{R!k zMixHyAi{EzjR63GY`TqR4FH~vcvAUf7#L$Dw_*7!|FrX;`L1LUaGHOR1_0x@x7C_U z7xiJlYL{;5z#jAd`?Wsf06icP`W(D2h$TOq0;9u?N}!81Q2tmHtyn2Y$=i4LU+~xc zEcT@&S^`FJfGgwMSN=G{dyGPnar7P;UeXaqesSM+C+?bLe?pMGrR+CeT8YLFl?Sy* z{%HsfasE0`IG$LdHKSZT_qN~dOaI9FvN{tqSTd2Z$Rc8@Y?1}BMlx79$AWpYnw~w& zbzZbzEwL&9j^Y7u_7vB z0OZ7j&aMQ&sYDElq=`Y$;YIOF=*mFATVVBa6bv5!_K~-;xvGylW~mTcQlr!W(Gi*Q ztN~zoA$m@6Ipjnr>Hg|HgZ_W-3$5y$u+SKsFmJH_8maBNwPgQK_8N zyb=Y|w7u*+WjyG&{&Kb7DLzzhk6U6XDg9jer7XZ?4tTSF++QJgzGndR2ziulco@}8 zm|Y=m_rXHu(I6SgZhb=KPoip2oXd`@@As$>HJT}4gVj^c9NcsXk7I2gkvr_)+FV(~ z7s@QXtzX90jJY>JbfR`Lwj6GAAybCmF;yBj{)!!3^GqB zzunRnnf~HsM^a&haiYVIKqd@sHSlqy`d$LD-0k;F>a;V0alK3njA^7@zypX#VlD(M zIZ`Q=fq#hW3%jo+VT&LLj<@F_f1V1YBMYA6ofJI`J(`fIH1qK`tzL)K4BCXZ+dPCi=E1~;EEH83|?!dDtxpMaH%Q) zuIThCqsoKIv4zXkaGxYV=SHb;j{ZW?lm5$IJdb1&tPozu2ey-mmd)$EUg8LV!k`)t(W*eV5hydr1*6p98ksnN&OIb-sv+q8bNm zPHlT<&4xfpAw|vFosNO?cKs#+)uTAYih-dQFK_540W#Tl+58h%cAr&`ADQvF)Z9Dg zOefV(q84Eov$X4j@oY~hyPz*`V{y6vkhL#AkZs6J>xB=N*Zaqpdx+>eCUA-cozohB z+>SZMh?VaF4wxA`y20)0YZxn%+l6?zL&*r>2$R>mJ?ZPn*$jbLiWvW-7X6=j?l2o# zY%g3?#!U})FP*#Kfeo!zZNygTqR zua)*p27G$Kms!!u zP;B57LtjXlx}=+G4oXYAFsG!$s8+2cE9tk(seOFIj^BTf0C~M&Kw82_9mA3s0KRpe z*qs6w9Fm`<2S|g4p{e#S@5=M}L-+KW!}grAw8i#&@~3X22M%MaQvt9wYc%Tt)x^GR zb|qxx7w@YSvQDoCfM=N~caZAm@h)h<=vx3gDN+B`n;}#@csOB^;nIMT){1L>(vZ?% zf`z=PqzA}wsvaPZUOhlwchCSx@wFmD3onIMXg`A#p-1_tF+UkdO3TA)L*Ar!HHdvp zep&S1%Q0*k!9m_+-Lh-P{AqX9EnA~8Z*I#onf-2zRkv)7796m4&+O~9^D-nWDc;uf zn%1_{V{I4!U156%^$N7=^0LNji&HwO%eh8t&Uk63Uw;is&zFq-S98FUxOmUWl6w*m z$d)52m2Gb~@#!v^5+Fx^&PQjb?Jh5s09kBi_Sa2Aik7HSP_ENi-(GLhuY`9V10>_O zdVqf=@72tJ>5re;&$LEm0gH`1wdc7`$DdY3SM?#BV&d#N&mTT~n)M2bj|@PeN{0H% zXJzHgybXnGBD1GabH`xA|LDfn)gBjZqWU<6%9W6YCI+d&1Lpt}=d1_#GXYI+scASHds9q0&6y4T}XuU!H+W%TjI9U{PP#v1l~w0jhUc+euWSQ;KC$-FP@^?ED)wj(8Bk+EA9 z8k+ZKBHUmo-AEg^V?2-;d0Shb=riAImfqS+g|xi zMW69HJg%?NK7`$@x(a5zzxbzC#R&qd7SE_exS0xgQaB#IaRq8LduBBFsdDaoiObIg z6J(BZfy&!kq`}2J$X8J{0PHvfw0@IFM6bKWI4NXrU9{kh-))+Am@<9Ut1EuVz zl3k=2Dl#*2$dgfZ%{$sj27$BqXJ`PJaJ=|Sk56lguW4|obs_gGZ;g2__fC7sRlWt6 zw&>EKs3AELAa5J#0f9^hH=6YTdFxsa;0D6O6jJBXP>{oiRUgM>lbspuLTQ*X{`GoP zZQhgSq}QQ_Do;w5QPeKllP~Y8>aZeXJULYFkX@8RQa^6#SKV|SWxa?urOF^Hvpw`! zxsc`>#+U=2vsLi{z<9p&Po*%n(NzO;oFU~xU#=%soUUIe$i1Z?=Zg+ljbV_ zHCzQ$=M?*zj=d7r{1gKyJ_xGTgKCecN~R{s&b{Ax=b2w7OLG5FoP18ZRfh3}OhH!~ ze1-#x#%y|`xQV*bWuq8!RO(;Ak}KaKn_;>QXDNiqYe8GFrFYdU@4Xd->^ve)=%=#Ax1Be^c`} z+OcI!yGEW4>$VMP+TzV&YVU-4v##mCJ)8FYQuMBFKZms(MJTCM2A$4GZA1BJuMCG( z^EZyIce$C$sFU(1YOdvvomKZB+geJ~4h~qnzs>Ml|1z4-gesrPfgo!aUYS8$+2u)KL?5L1x? z?PXHW^u0FgW&1?IGn8!s{WA?SHm}_BQlp^^3u7vG(6sNnwC=Og%UWjQ5iczFnLVQ8 zzTYH;Jo6@8EB?OaDCs~6<||WE?@@z8Q`lAEgQwP}xBRa~C)McjVQ2WmfEwpG#rP3@ zQyTSB?Wdr44j8j7qG8Q%*U1k0ur8q(Ov7is-}MulAkx3+_B*T080}S((%I(x`Hp9K zSRGhNNM*#8BUE9BXp@SDeZc&6jSAMYMz9T2P`BJ^wS^`-WC<7s0Kz;Ej(8fzDNnVJnp{AtuyB~e#5if8-G7Q0{HzB+!WUVd|Ez& z!q9>P#uYa&%1d}vvZ^Kwhf!*|K zL#Y@b=23?hNq%w*WGk;Trx?MsSRko&EvAqNM&uG@_8G#^X4l#-%j2dr{z<+;S>zc} zC#mo2VxWW5Q9Td(1!AU1PvFEloDjvtfxS-qPPUNq!Iim%1DQL74tA;YY5=5wfi+dM zKtL@W!q~yYh|#RW3ssf_jR{g9RRO8T>VcbNIS?VyMR@y0)?e3QAzux372IgG$kf|X zswt-P@}2*!{Oh>tca_JY9w0@$1_05~&r#%r3Z9EP#KMTvpwJ9l;X}y*>>a<}%0H6o z8Kk5{2NC9P_)k!xgfvwk+(AL`KRBm@UH7Nl+dWD7MdR&%l>_#F^;hNh>q{j-s;&DY zM!BX;43z*MUrw>_YSj4TZ^lZ1R95%qzY&rD2A6=;xJdWf^;Yfy!(4u>0w7h+Z7G9Z z>Dzpd%8K_{x>N-*tvL0W()A9@x=t{4IY#p24 z;mV+i7gSbE{^KFs7xV74HQbZ{sbiL&z4StMZjuB@b;Nn*N&g{@+DU-CU7GV-ndgQ3 z>aO%zq~I9M{p+n7{rf5P#F1W-q){iYF6p5Tdo>Y2(gT8ocz9v)>UQTlZefih&itaK zEFZ;msH#UMT@vq;$NX`;Weqxwxj5_efNE?ojpmNozx-D3sX+O4vXZGDAoFtcfa-mD z<9dL+P4^HWPD`OYT6jnKx2n=yhK2knH@h4 zZ;+q@A~;}AmoAA@64aTHbzOF4*KfG7*JhPM?2Ij^$2JWbWmW-Vziyd2tliCKqg8;| zmKz(a=#%!6Lj{O!xuMROk)QqIQUUDjzzv8ucgB7@w!aDxyYC@@FjW?}tkomoz|Sg$ z*kp6(4DY@5`a}tk`*qw);g@UpUQ_{M%jf}e1B}i5qvotdU#b+D%AY8YSw42`Z*Nzz zmkJiHsb87;lu99Y#`_z$&0YL~3J@RIUk_mW4Nm(lryf7~!fi^nW8C2}VD~(6bJ&TyRxTS}ib479 zs&RuT@707WX)+qFVMd!z#Emonc;%t36bgM+Ti#TI2^PL=v16Nhca(UiR@Ey4)OrL! zrmkyPAqlRZgA|ggsNk9=KQ3+{BYBAK(-D8!7uvPHPb>dMyH=k=F9qvf|GHoA9`}-h zsEB)Zh~OQMg!ymgA77~g#OB=H=weja{^}|~Z0B94J*^u(&COxzjMzB4YP|iqK_iAzI ziyrSX3Rqt3nm7uCz;6Qcnv<^%DQLX7Vvyu3T@_33t=iN3%`<{LBo?KLlv|G8H_#Rq zSx>h4kokyd5QCT%Y&6ebKIY8LKy|B0m&A<22inYQ#13O+*o8A_%!=ah8F!c!uCQWy z4wUbHld~3eIj8ne2$`}*%c|Gj*F*xOK(=)FW4Y<~V-g^1we;UR_VwrA4U_;? z>+h`3IuFw@7tQJobb>%OWInnN%7m8Z=rAZ4?TlnFGp| zpR_dVDS94f=#9B&$$)hKM$2S3x!c`n-nBOJx&Qs7dVu6Y+d1@d;jlAa$Agf!+fV*E zA~%L@2W7a$@vu4e&vSE)Y^^8&vHbObAhDh{r7oSfr6oI6l?f6{Xzd3}fBf{$6t%lz zf>wWjr7)m1Tk}dAV#BPqx9>Ik)uSqf*kY^OXC3);^xrB#9LdX8eD=I)Zk`0lb7NVv zRt>j%)$x{#U}=Z#iR{q4&9KOJs@>7@uNc;97fH*N{j{jfnrIFvM6zQDR z*p?aJy*sT~0;CgZB7xkH}AD4^lVO#lU_=ZSYJbzUH|y{+gY*?0iSXT4FC?jRK%RgAA%Q; zt;K?^4k=hE>qhQQTfWR4v#0uxh#Wdxwjg(jwV-qV^z38?fZ&UU)Pt3tLC=DVgH?wU zCac%M*M};0F5X!kT20hSt<16Dkj6bDj`FhMgZvg7xio?Z#ia$hqp7?k0()P4kp>Mz zAIQecXx0GePE?`Cp6j7I*1~_H!2qdzqpo-Mz^*Bw8^wnPA)y72KzZFD)gc7qrWFso zs!m1?4s8OV^=Sa;7_C?G*+k0>IUPobQo@eB(pePW=i{S6BK~5ZY5?R#C1*+n9wMZ- z7v<5T!2-Dyc^UxxF$q+l#T1>5Y-r7ePz@d!NO7PC1ifEXkFi4IOPzMqp+PlNcxQ$9 z(Ni0bYpGQ!^FKw({Ey8NIw05SxrXfy$Hk~>iafdB3BPgbhogffg`t4+e!EXfcF7X2 zQ%TI#fs@CB)^3@pQncU{D|Wsgd@-7JS~;%7IX3%XdCOe8mp;*+Q%s)R{HuOb#;UBk zbHLc8J?8DpV19UFCB2VB{*JwKWCN4!P&5z=M6wJ@bwQ~|tYZj@MU&VD1r%Cq&HRmZ zi|44^g~-jWRWUlL-}e$=G;oSR&)436yVUCodU8OTWl+PdeAt!#2<7S_Ks={N`oV8~ z==RTK8$L`#8qE&@gb}3&7%n`5l_C2P02#P=uJ*#Z3&(pY4walj1AyNl2I42T4X&)A zh8ik_z;hVw%2$e5{w>@1n zg1W5;?^5)KiaJU8ux#WP2d^5x7FZE<|AVK$DEECNI}IW_BQt|08$0ycw~zU1=qvr$ zDU6qFbpS)A(h6dxTaGRId^=Mwm2rvUfN@EgSN~hj^%*E3sfZo2EGqV8vNI!s{{C~( z6J@N|XtSo+Y$X$tTD3QF?G|Be?{uEj3SHsSod2HKH{*-P)NiK(v)L$sR%FVc_YmYQ z7ad|)Dx`*+QY}%F3Hg*l)@smbBrfsq(gSKf`v^ddZ#f|2?$4)sm2$C%&4wcrZhR`a zf?$^Ep)b*(qh-D_jb=T-pN;y%0O?lHP+$Z#xmd~*6w2~JBM_51WYk4xP7+Nfiw244 zo~i010r3B$DgeG-k<_?NLx&sWOq_Cd;&N(L=)@=E5rCS^T#)@%b}_$YPP%2sEmnMTOJS~ULE>IH`tL;@I>@V@QNb7ePqik&wE z@MT9Cd>~ync5HYjL{i8Q#I}a-M(-YRa- zB`X<%*fR8ktjQO?kN|@?pf?piXY9A*lmz$+bzy^J(_2j@9AE$vIj9%xHX(-yr6y$6 zz4b*`mQ=sP1R#BrpHsny(NHI$i($xrlC5;(uRQ)atNM=X#4 z8B#4wn(I3B8ka&eGeruH(X0o^Fq0l2ef8F#Yo@jD^O|f!rfd#gFtOvt@2)Tal*)9J zuVS@5Q&7@G2owz#dLqLKdVoyz$}BfD>GqqyY|uyOQF?&PHcy=L!#n-EEs_*`r5nu} z0FGlk4~kdB>7J`8g>G&L!$N~coouJ@(lMYZy!r@$F|8^9RQWzdh$>TcJ{jwMsIewh zk)p9cp-ky1WVB5WsP^NdSTSR_iVtGTQvwu0@fQ8J8r$$B8N4bptsszLw9*WLRHeZX zApcR5+yQ)_Pk6WX#Ka$6zI>$eOW6@Z$J=o*FMhH2JIWt$itP2wF(CTSI5yL|1uq7XfKq>!e*qRH6?0QOdS@= z>AUirc(ffAv2qH%ig{@8sH2^$Y6gIS9*+RXt8IE#fxD`rfNBC6q&hpD(e)@1z*L-p+IJ{d zhEIO&mc6g!A-%y%4*qlT*p=s z|1C$uPoGv(hA8Z`7khFl&32-8mwkRcZiAWg|DE$g9hT^-)RH)5we z__*ad`H3?7>h;V^(;K#C3xw8+3{xEGo%u_R3v8_^E7-(Y?LWEwg!@f(E6ePw-BaFd zb&^}=3WeBdyVHWt2lo3#ZCtG2?GfuIKYu+)1+?OAY+P#(wP!MWf>_D3ZTagXUtSj- zu2KjIHTmL}YcEHXssOR!#@~wl;NwCsfDr%V+8?d`{%NMnDqk+F!Lh0T9Xa`+v1BF3 zJnw@JslzX;N|8MBtRXv=mOalDP+}z?DeBktx$WBw_a!Uo+Ia{dLbq)hy``~0pYPX_YvbaZ8c<8;A7?FwAq_1n z4woCr$-_IpciLvph4!u4M}md_SPs}_dj0ypx7a>XmXHvF>z}p>WNY_x+(y!|Kp{c5;x_!R}BxNGDz_D$cuYbqeVi^CnJCo z`{_Hq(#c26JO5SM096?X9>7`X0kRCLyGBas3q~f>Xk=w@Q3HS-#fm)PO=o(ZfSrX# zvjz#&vSf({fb%#3A1&rZTvz5@%l&6&y_YHuD!-Jid%P+DLWLrIUa`rm#;FIz!i}u# zHl`Pmf?LF@+GuKh>sylrJ~aTC3~;Hm#q)SDzpzdzL zUP3)UIzco5*aNuR<#Igqeu4&z=7o9k@FuHnu>Ed5qKiJl_phg@DK@Jf;LF5v6>T(o zR2yp^0g!i;^=%l~7L;w!ZM%?Es~vS;nK0u4XfH>D(ggi}=%(psy!HJ*Or0{QLdpg_ zJY|JwO}64`D>(d=x040t=gWF8`00f5iPq`9_n)S3*2=go7=$EQP;*atd(Vy={1c zw2pu06ce-Vf7GPOWx*Lw*5QH%%D>UgL1}D`{pqDe2G0j7+o7C#OlRXT=c-r<@MFsx zuT|;*{z57ZoBiqJW#2IYsqDn3Ijf2&-yQ^*`b4p7`t zei;fIl0B*~-!GhW{lKGDfCAsbNo>r(g?eNdr8;rZ5|{=e=ix>9yRjn58Y{nPE66)V zr_OvaC-_Ef36Lk^skP^x_6bl&OCD24$Nu+G=^0hql>@H_NFTtaWtNOt9p=b3g4wz> znpdW;9-lOgX)x3)xoGBvPdOTz)}K+3=SnFpj5MZP`1_)B=qYN%>*cXA>iN_6`sXqM zPkekEDU?QY#qzfo9681L01(=S14`~6c&btB_hgrOAbmr?|5VM~SNL8u07@8e zIrC8GgI<3}$jIv|tOgNn8n^Q{^?;g8s2a`rQAx1{W4@D}k;k~Dq}w;Azwajjfr3@m z`W(ZcInz~u4{t*ckTH&= zLPQS;Tw4`yP{>19Pa!Lj=mCM%9>Gc$L()@7sjdM)pd?zXq?p7|zK0sU)nK8E0ZbV} zDwKBUA`+B~s>&nLhzU?B<45#Nrub+$fOX(RErqIb=tFX{vf|qxb`9?|pPhxY#A`5# zih2|mR&6@J`A>x*0c54fjhC;Uc~J6`1juJeHY}OfuzoWS1JH0Fxyl6l7!Ss}sa7MH zAm3v3jeW^Q{#d2klj5iys?HRJ3c{ z^4AeL^<<;6z}lQkpS`d=a-C>2lsyH8^^l4J+tSlHb92#wz1IsRxvYCPz0n7Ke(5Ru z9LDNWKBOZ|3Yjv#u%>J!40TITl9vLanv;FZKM9Aw|LBx##$SA}27pP*at^T;!V{WX zkxx&7CbS+y^YHs<;fOns#2 z+E7^A4#QiHg9ZmH!_UrJaKC#ZwCi^U)&eb=&mIAgGFMOG$Fz3%Gjy!{&pd*aym{;_ z^q*9e%nW^6^zya7hX6uT(gXZ{;caLDI8CGJX%tEWl*z_A3_Qe$uqI0NLaX)UsD(SN zNh5#B{&*1^5Q^SXPCH5~w6(a~M#K5U+tZ+->$29M27oC`qnqPa3OeFSPuU}=1H^P> z_PV=w_m*R#^=gppUT>6Ypfp}nIX^wXZ{;HZvWg?8P(@ahqFO|;mcd(QK3zTg|0?_L z_^OI0-t>0UJD`GCumOsqB1q`H2|-X)3=l{lBr%}~C>`n2I|ztW0Rcs^ASl?7pA|*0 zD|W@+72mWobI<1Hect=$8vO3gma{u;XJ@ycJEuXu0-AbYM7=B9Wi)Ng0G<=WHBx$% z8xGQ8UI$g^iE{6C4}a0+E#4C(*zc0=xj^!j)c|3gssVIax}-Fs#sxIi$ps=WsiuvX zylMb*VmkxWgB!Pv_#@SjQXiGC25=1TG6kkgDk=0%5q+iLYnlG<^h9HseKlZRgRu!o z|IlOVdkWcC3<#^sUjR~Y<5*6ihH4Qhajezg|8&Kl9;M{XumZZSocRjb*J@j^gsE^v=6xkMoB>G1<)+P0n8^(GSBO8-8J`} zF3)_CZ3$Xg8BcC@J^9uve#g-6P0GtF;D$x73-kx7}bA!&SDQ`&Qj!HG3KNe|zOLhn4LICF1wzrc$k4KORmK+tO8eNs*AG5wPc z^%{L@g05Q`q@yqNC+?g)G$;;uNPwUya%*2BV_ra^?PyXV4aT4OTVAD5{=K|r!Wn4Z01PVy# zfs)UvXCY{|aJMW}NuaISQhX#3h^VH9CgFE$=;6+7>#rFSw`>YeCX%{WND08EJ~JR> zdQl`mqo`0QCa8Xj#}}2ncKVCMN;t+-pdLG~)7FDOoiw0_w7C1j;m6;9_yGmfy5GIw z!S8SCdNl)}`eBSMTm^&3AMof)(9JNxDbp(&C(6I7kxHq`cS2+u7Ue&op_@3 z=K%_+2ViC5>G|ihFfBdN>-mcPEpN^pu+8g7W=D986wZ+_cOFFl465IDjDETmXMcV= zag%If=#F~9S48%CFJVs;ZB;WrEc>ug)~^k9yCwA~DS))a@EY4-OUSr%-QCx}|JXXM z9Qif<3HHOj<83$nYICYS-i2+WI?i7FyVg(%x}bdaZW1WqthJSECeASIVUK%f5Q7-fjhw zpOPBm4<=TomWzFeW}pPr_k;(wz(kNz*kOOm^uuRx5)w96kz z_#|fRN(BP%38|tBzgTqp`~4Vz1}U96rU8V*O}k4n=&k5pbvv5yQQyMtJGV_fmcp!z z1bSPc+h@qmHs21gRj21BJq~?!xU7lj#IRz*+DMIVjeqR0_QPwrCjcZqE1wwKli8%79!Ubpq;!e*DP`4`17|u69Yc)?@ed2v4b9q=5SR_T;{r zIPTq}3MdQM^>fbd>nAT(KsnB?=e{_ywBTX|bgl0?YsAGHHoT*NZnUj0Ec&5Rj!N-^ zYn069t-b54srXWB=nh;z?!{$?KIU}+`boMRzv!EodQo=$wPE{TYG{jBJ(4Tm`E~z< zXGE32HqWD00(r}C?^CDWcWgOhXH*MV`qGxDaR(pL&M5a;n)zk%hfO0DP-eL3x2-GV zx1Lcz*}?Q(XZ47@VX6YUUhiqQrsk1$mnonteCp(7R zW!(;=7aSBvFvL*8qq`+_x>pPY{y&IH2l6V0&v@_G>%>0mXqhbaPfgpl&JEU zi%#|(Ic@Pc1)|yrDHl+a-v^8ci|#cXj*~-G0zLt^$dEt4^9LZJ^ahlV0)CKXp{s)% z6Ld?sJB%k5{&a*c2{jR1Km#m%07jq|mJ|#dR#2zUNR2M>6@h-K6Hox$laW*LSF~Z= zney-r{Li56>fVyot#qhz#5F$+e?zBRcjdD!*B!s$pLhjyS021Oe8npjH!Gl9Y3~mW zKByOzyGS>})_Xp=_e|jyzLbOcjWiPq}3)PtXQG-jwqybnNY zW&}LFR*4Q``m2!I2;}*S0bymoO?HiWdDaqk;UjNJX)ZNfKu;+y`Raj77Bm>BomY3d z3#i5A0?NN!K%-DyAe9+YAkPK#hLsDX-Yw&B0aa&QK+j49z-^Km1wXM3a9)n%zY|!7 z;I?s3xtxf%m^PFgLpt&7yn8R5k-CrP3^EU)L9e+8c7M>U?A>`L#`Q}4uJ8W0`uWx} z)5tF=i6T6CX)5Hpam)XhJg2@#I0^FA!gT>~qvAnPYbw zhOeI3Ovt-{tZ7I%HvPUSsl{R_0r{?la51K=0>yWZKaJQ(mejm-_UbS&eLF2TM-UU79=tim!K6H2&xX{~$zJkzw6(3cA z_M!WhE0H*GIU4S65317zE?B_@EoCD@huBmikw7-(dpQ#nnw~|)W6K~6w#!J^e0m!5 z_?vfU&DzAq5=sHJn|5CJa{NcHo0wGFkAY}+aSZ) zQ2YGbf0dX7tdaPP0PFU@^lD)3PObqSl%Dv^h2Em0n<7$j^}Y|rwi(0w1W9PH#HzaY z=bpLxUynp`XK)h(4}_btm^DjkFMes)qR$$v;X+VbRd*Lqm*t`>M>M+cTRt$Q_B;c9 ze$3zH=|wjxDGjQ00o`2p%$T!$LYs56hMw?Fxh3PRpAMKwrY49BgmZI{$g|<9jKNJ0 z7^%1EPq?-g(`Nm{WwjMZYfudkxm|$D9lg$4Iaqz6DV)%Uo_+{YE1gn_n6Vu_)X0_A7I_umQmN7JyMrCq_ceV{H8U3od%Bt$sVzbQ@JdoIi24K9TiFOn z-9MsiGIqXH4i%Hwyo06x+qKvB>(8PBJCe){$N}I0Grt&v!UuwXyKM9bR-2td zP+L8Lqy7$mXa9Ra!kgy++}sYJ@mxh27fzb_^S$1{)7rwBEyP*k@j%zY5;!TBnRCiP zlmWk`-K($w48n?X(^z~Zam>7#0(mZ=L2Nz%#w<@Bf-clZS>LQff@9*SbfodtYbTP(xjjckMiU_q{7WR3OpgLOuYvd3$&%297`FiVw|W zd4XPH@|6bqsb{2N7trvO(J2u(f1b-b98CxqBE(TaaEuo;Aq0HofO2H90C$wNxc2%b z{j}$rqRj>LZif$muzXhF;2g0Uiea7@8gk!1mtJzg72Fi8qK;$77LM>gpyVq8-HhKP zL|q_84G%w2cnpOenWot5ktO&BkWlFR^!G3C$?NO2o(AEDgWwfvRONkq)mIL>ppn2X zkjO_GkS9EtGS2OZP)!05Hntid^;mU4>uP|62de`-&$Zht%_!^w8lT_-`Yg2o(G5dTVM!B^Aca2l6KTJ^t8d_X%sk`SoPufN#33Kl6GQtHDe-kmmyG>vRDP zDRlv5@-Cof)4g8*;pCm$CTinxdu4zwpgA>t0GKtcD@MYhJ4oNw1*K)>p7eD}W%K}R zsjReqJNQqX)?)^il$Cq7fv+Uai?>-^AeHxhAkPH?Y?f37!q!zYm}EZEsaivyN^;v! zFRTkBGFPukD&dK08rKU~E-8)9b^(3SPXLnDV$b2aPNa2hmZ$q1sD>~-a@Lf``X2sM zzqTe{dibwLu9$V(JOkd4&hPp3@VOfnh~opkPQ+UR>{>nJ)^V4x%*CA%6(zuqlczra zqHZ@M^`ijWSL`l(y7$crM0tLTZJol8)a}ha1tQf)YHa#v|GvNScWRB4J3Qb>OnI9p zlNkWzyjMXvoM4j*SUkk%EZLNrmfCyzb4nu8^Tn*`-Dl}-Eli))bNtms+rE2z1WzXR zM$b@|P20Zo)FxKt3HVlev*6El8)8qG1Xi7EUZeDp@tsSo@$;p|T}cH|6$^QRAgRca z)dA-UF#65%P8**ypP%X+qpp86>W@E4wGEAn9{K3#?+)B{*nk&=)E#$Czw)OA+#)uv zY-Q-Q%YNxRBk0TV*A3*kfSz3r?%eFU@lX7xZRq=s1re|IZ2rWp3PfHljk`cp|7rle zaaVWw%w^w9mt_MIyldH=@HmV;f9%6?A;t-9K96+&^Dz_^J-sHr`f2{k!q)a7bjLq5vtrM)dE>N( z8a>+<&PsgwFmq>YJc_42khlKX9W{zaeV{d>o}@n^X8cr}0f(RXK>dfc-O|RwPhWX+Qx-Agzba>3Bf@I7tQb>Ra+!pMp|Xn)8UYu9`yDWR2#lNf z-O=eMhcR885j{qmSh}}O^1^epZT0$8{+hJ0IA^W`(boy7qS!{S_X!+TK(D#EfU-Il zi1aM^{FdEb$zEaWEspgXaF}*j{Lo{s{iAK@6TltT?yb8gwWk7hQz94ubGA$2pu$mZ z7+8y)Ek65YJZo||3wkto#h4X6ho6jBvdT|<0C4G+gCNKnJg2C|!c)#8OEgweO5#?F zH~>G%ufb1L5Bzx$eqz@UaTIlKFoW*0=SB~EBy#j>?S(G%gEtlSzU1EJ26$WJ>2Euy zwa#y-fUeFxD`w^Vn#`IWj#T;i?mz3i@!`H8KtU-1nr_ z@Z{2juiIz*b%&lMrR76{OYq4S;Ts|pgD6doZ$4#r_Qwwy0gvyG{B+N=8`HKZpkk`D zxKnBU4ILB+zf?#S1RC~9JC9Xf?4-s>_ZxCU-Nlk#76E0O`TJTgi+wPuWe4W$s zGX*s8ZSTHmFBkr3+eBl2_Vx;YzQaISkU&Z|*3P*v{xG}b8zrSvv18tuPoJ4>8%tva z?jLz?{ypioY&0lk-I%|w`>8vxN9?Y;p4Pl@tjiybwrd-Du)TU&hwInQVygpdsB?Qo z^aCkN78rxj_?sok8r#j_{d-(Z0Ef$qI#LhZsyCT;bMd|d7A3v!oF z;Tmucr4<}3K^hFWi^IGDuF1Sml9%_4^+IKSuLtWNxo6cRZA=4BJ8eAqW4{?D^YuWq z3UD@64&=E&M#pLZUG7c4eq>dzhlgw9dWPTw@Wd9b4O8Y6$dWirsQSv_I(Vi!z%xUn zhAr0&GI`8q2xFrrkoUh&!s~t0G)Nza7TQOz+1Wa#y#X5C^Wv_LR?a$cyADN-=7%HK z^j|T4sseh)?t#LqN4)el8zaQbVx^7y*T1@MPVE6&BdWFl%OBso_|eCVFGjBrU`GG` zuWjpJrZtq^m)x@>c|m3`1)?sN8okOYbN*e(8X-8*QhJUYFrcJx0OsXrRaQ_DsuWJ~ zMgcnIpPsT}waH1%mezF1cRR~3xkMXG;I;#KE}&YD3usaZ9{_^C?eJo_#SI~!7>hNs z6nuW3YUL{l-3<3+R}~;m`Y!;g3Q-^9Z#v5-TC{raPuhraeF7bAdG5>S4xom#i|f5l2FjP-fA<(&RzpP#3* zyvG{hi=~a#<9DUpIp;5}5#CvVm0!piXdoa(=H zj@FR5fcIZ_UbX7f>c$F$y(XkwApLv+CQUn?aC-Aht)VAI6Fyxs^^2PaE1*}a#w>~( z@b?`_1{@JmE}-&j)X-<%h`y`9YIv%c55U+zco-F~hJo)n_^q?bR^wWxOyA4ZfmdRZ z);hi6FkR0=eI;3hxFH{&mYzH12g07C&@kwWJ!S`0FHr(8}xWDqUIRPS&&gs}~DK}AphoziKo%Z9_d z%!7z1WtI;`6}pwiViz7+UDW-oe!YU2*G*ER3a~?fo2O0r<%46%^e2)5e2gagjK%HNFb3k&$6V@}2 z8TbJBdYmD500v;XUd zl5bhc#t44WsI#PBPptiFO}!)k(Z3LgSR%l_PCw_|UwD-PY!1V{^3A`U>fPABLBuwx zvEukMwbM46QW4F3Dv-CV#vR`jZZS!$a&>9gwDSDqL)wPQy!lhUi2En?as_0_fxO9w zUVbB^59=PpGE=1SQI~A_>hdlZX^n7JvEXjdfOi^)-NzyxYs7gh(+5CKw4hffAcg|% zTSyHH6~MgjSvK{fo8P-ziHEhU28ex9fYv=)rK~>B=35g_xIi>Bt3aL$Xlh>HHPvy(RNq;gdxDfmo!77T`jT?OUvic%qLmtIB1<-p&9 zl78>`D)-31*Ip+A_+iq|NSk}+)W2iGhoT9?hv{807PB(+90>>9;1_^9T)Js?-M00X zi>?{1G<2P8?mBGu#osnmATm*iKQK7;>x6;{3?QR`)Q6Pi51!xQd)rd*zWWE&y6{$( z$k;u76<}riem{&(nysYuF7KkKKhA7vWCPOE2p<4blaD#F^C_Or zvtU8zRk_2*XcJLgq*L?HzVDhDTk0qf>8+l*y*}Rj<8$*Bh~N>z!)GP;eDub3X7Q@& zGU?G#vnyA=!ZqOZ5|nR{Qx){0p|s`}=}|ET9q4q;Jya2xCCzu^)Xk>skM=?Wo?=_n z&)qbtrrLW=#_t2bRG`cpkOP7O`J@Y@U!C+GRx05jzX&t1z>z3VBRmTm zTn@S#=_%MQpl-m5u%jgx|2kH?mE;*iE)e&o^u+}_<~RXY7-@c>hr;_ zcxFPC!!Iy76ada`eK4j6M7dZV2Vc)%L*y6Y)6Ha&ygdFNEPT@3W@S%0B&tPm~nx))1hjhk_f{@ zi=qo;TIijh9Mu`OoS`S!l7CN?;imnPo6H~D-B~vt>yoWP>?mb>{Fa zLGidYQvBGoo0@KoJgk78MnAXXiHtiA|IdK-Qe)4fOU^p)s_hEs^Ehj#y_$2w#XA*< z?z54q7A0 z6aS-XG@M@R{f`w;mV3vc(`On^tgk>Ok2R3z1Aw1{wpdm=qzE4o0;W3{ZtiHrx34J7 zUV4J`(*^Vhc%Q7Be15nD9x8*YRfT0GWkFHGzM{BzyoK!odUr?w z4$Uf}7I78IaW9ad(5$d&_}4G+6W$koC`c>(NBj#TwIZ&DpTslplZ4?~i6h`Aoit66 zU`Wv}BBe%YGd}AXH2NSFsz(`y?dUGrd1uF~MrU54lb*nijzHe_*iM0oOX{nyvN z_4?mU7yv;63580>7E>x&&1mB*19Ontn2Lj)9v{28&mmb#Bf@IkSOBk14ukU`4#Nu3 zkJUBr{k!?CdD@TUK0<2Mc|A8?v8{#zk=}k=d0BS%^MCtUfjIs%khkKh6MyEm7WM#* zL)>&BS|EIHjpBmJATB;A>Dl7jw|9EyaFUWTJ*2qom!qj)D4+*L3oEX?@4&6kFaV+g z+W^}MZ*Bw&dtWh_p!mP3Mj+1x^gL-^?!QeM&0t3e$c*fu1p*IX4jWJb2AZxBr*QBy za2N(`@yxTE1wQ)ksYtK8aIa<{CR}S5th+d6(jihE(r{pch=KUvW<_C%^xanw2Bm!2 z1roh)IJ4`bt3L0|8Zv5zdi*)Pf6W<3zaPr|0w8UWwBZBrb(F$FNMjWeg=(41ry*`{ z^2L|0tQ(|Ib{Bds5W~)FxW%(**VKtmP30bd(h%%gXbsV}r9xob@bP_DeR$j}mkbZF zz-vk{J6#}7*4s=@p$rg^@K}hq?Rpj#lnfVgqvy{JE6&g@nhe2u6$N!5z30HPuf(Wir_b44LXqLs|$b%uAz1>Idonj_A^d2gUM$ zagFMM^aJ_bxBvL0j2(as7TAG2mourE>2B^c?jSt3G4}Tkd$z68?&@j({3%cTwDI?m z3h3FN3+SP~3#fRQd&$(fHR|%Z$8n^v=?_U}olO|+iT4Se%67f7T}BSPtYyV0NTtH@ zlkmiix9NO~8wkgGfNueUxNcPlzB$a*+o7x!QsGhN6PaXRQJ|qpy>Af$5P6f-@U0&3 z0=0!KzytB_mbd481)yeD?NBuV&^Q|3x&v+2dupW@+#sUtMeQNYi6+GKl?E~@8(bhU zUmCu>$-KO#<Ch7*!1r)u0+6)-#)Yq(GAQ1h*$7krXz8jHP|CXCe5?LPzxwqQ`$X zoxS~rIBJXR@(ZL{7f^-I1p?8bYJmFEyA<9w0kdZi*s0(Y0Ly$#sFFDQQPlvNn!#-} z_OohgM8{MI{1gfRtEMA7$_0LH(4N7IpxTQxh~`MdO#6uQ7|ixrHTr(> z>T5J8{BRkOGQI}~H=ojf2pf~=dGCc+oCcz_a-KllI^p#r7e3xwDWrWO6gFRbR_&}W z%~01<;|J!QJ^8X#SWk~w#fxF)$%>RL~J>;`YRcESLCbo+_xBarjvjPR{IGKNU1cUVH1=-%BWq_|^Ac+b z_$j;&^n!qpqRN6Xs;k|(E_LYM)!Y#6!p71!7fAg^fRRgHeD{}W|7mBkwhB-&ds5dc z%S2~^b)k1*%OWc8I<+T5Year6HHyAF)qlV==8VwGq#NPz0J5Orl|ofsd}V-YOk1fu z;6(41AN3VW1o*qhFMAdaft%SrW_i=hIUSz5ahP@>+7mu5pdzu;!S`yF{mBa(dX@<{ zn@1GEJz#J{K<+U(E5RF&&>L{4_=;i&J@)AW`YN^y=mkp`&`1XtNM@PrG!8}uT*@mg zg*WU5$qQgTA&oL9R&Bt*siwP{Sio%~i?@E2Hq!BlxgoTxA?am7rQK9=DQI}53uJoV zPyk|Jd#QuSzsB_i_pxc8irk21TJiF9a0=lQ7s|wJ>-#zjLWlo|0 ziQ7W1o&t%?Nw{O=W;H^wbEW_ z1CxDFoerS2maxu@l-#%qH$_eOv(m{&&P@Mebj%+57k=n$mZHBQ|?tD+f!LL&iZ=aj(R;5&~>?f z%|i+AKOUh#Qo4{@`)KWh(>`H82X;4%cP-?!4twvcsp;djM*Lx^vFe+-C%-ySLjh$6 zE8osr(S6t>3g}}{E3WQz^%tkvT*NjstY-1YX_t>*Z>ny*H}a{u(Jf9teHoL2wciH( zD8u<3kvjBtuJmQx<^4<7FEYxyb4R^*DSLBis}_6bh!z0@(!(ep0Gezkh@gi0cy$sIg?KCfhC{Di z`N@x_P-UeGT^|5!+IvQ}O$97TDbwlw1~>oQo);!gre?CdGIjCf)pd>OYD`TPV6u?% z0iX=Qn=}KiiUp@SM48S3V=)e+IV%-*=2Qh`pG!y8`Lv6ph361hBRI3XK@ zxp&cQ^*#Bwpt#>d=htrQO=OL#4qM@!(tjsOZ7!oomXnfUbPeWq4OJW$%QFHvxomSf zmz5WkfIf$p!y$|b==H&~H7Px{+5Zkqs`(rJ3qH5J|5>MHIXuJ%yHWLMUy@r80{kgu z1oa@EP+beY9JbIgW#BHLT-OEkxg1}bTObw9rX4)n5uE=P+xSU_;{)I{yVq#Y++^rd z#Fu{->w5gg1ym%tiD)%%h7X`%w1UBq_N4+B!a#L+I;E2H3x`AYVbDn-)=T%JuMqS~ z#f1y#QJ4#;yV%V;oAsiM+yyc-s{yh+1INu&t1)gp0$pEhS@}KHNA{`*EH04bX(c`Y zI1^^6qLh0a6$eaII^!z{q}BB$0O>X2D@BzfhLjiVL&r6F3SD>j{f zU@MD6oa-o_EpTf`mc)$xr@PkBQxF%>2&X}JMc(lE@awfk${cCDd%q9sJwJUt1E|VF zd}9f`i2-M*kbNAUxtDTnn>Wip*!fl^pw~mMZh2+oh;z)*p&FD6L`@S?E)W-94WQQv zqy}ox8PDUdJV=A4yNJqu0nZ_>0zSTqOLJ+#Ks< zv#Ex4On1+I5>)Wqn+uAH2Z76UD4OfQ(QyxTf#XnZ#MQ%n3Ij;>n~Mrc2E&V?XzUkz z`pe@#{BQV?=)**WbSC~3fxOM9XJob>exCwip0d8F;f-IsGLZWT(j&W90Yr@OTTI}y zD=Wu5cN(O%?v_1gI4Nr`M(^iTtE9(D5of}fTVj11w3DO~w zmK=g;Au!G3JWDdqxp->p&$%Rg08L)z0y(_g;lT62d&|GP+Dwmhc7!?raJydUlA`Nu zy~@YHwGC}^!ICFmTY33K+NMUo&1tab``fP-{(zgIsGT9k(66bh}d47%?9Jl;PlQ6hu*z20wgci98Yp&W0;aUq2`9W+k9Ojdu<0l~eYn ze06A2?Oz`NZZDu*S~hghCf);%^b1ui z`ienQQC&jS$38HZ3*=SS=yL48wPz{eu8?^ZTms<5;(!aOKXCrs3(h(AqgO0b-uMj_ zjo}nc>r_-$T!G4NJ9rkNq*yOfIOTG>6+=cC*bnUrAP8+Rq&kD6N)!0L(lCI`_e1wA z4MLbPwi*tuF&!mLPUv!R@Hh{i{}+XVae_Qgim%}jaOL98@{+PjjGzal51x^L%%nmh ze?ro8x3&-|0iUxw9IlV{0@=G3U^Kng8DCLoEuwxX8UUnv+tRI}@0YlM1~2&lF#F)- z8O;f};SFges%cI=Fuuw-9iDaP0%7d=3gii3Mps?Z3hGiz$R0KC>(=O@d1w9DLIKTf z_&~xV>$1Ll+yG{wa6x+RO|LB+G*W@oWct$qz+&ovSrA8;4H=@^HM214!GyNi3S_=5jg9}X(TP8b*e8br(l`Yl09tfD7#@|7Div5e zi{}A^|}5o@#)kMWF!TMeq(fY$KGbZ3-*lge_DtAgoX46@Izz$$hiGrD8ab zVYf&P7tmLzssP?lVkK-KC0stG|K6FmRHCnvOeKWTzkmG4R z>+0pNpV`ekk}6Wyj;s5?wTF&r4ZV)Ca@t?toc&O`0y5-4o(t&BmgOIOx1;#qaau#2 zMlPUN4rZ-7_wTSa;){jdh(|YI;6nbuA@B@WB`W4b4Z_QVOTw&b)}R@`WbW^>=wfYD zZ-2T#QY#_l0%5GWfj+YFua=)R{6|S?Q1#?KA3lHg(bp7EUBCr2Bi#6mSxYZ_v%S`c z?J13qxVY(gzioY10X2Bb->tJ{Ub`g2+5wV` z6pY2xeXYud4}kv$rAQuh_wj*~B)=9e%2ZGPaRE)&T?O!1iwh|G>UXHki9sWH`ay|L zX-5VZ33|LYC%yKSf}Uusy9;Pcgb#q#b7S$S;=)qUn>v<`DjOKg%Y7w*w%&Pi0Zsqy z0?D2N&^2rC@wufaM^664 z0K^4#g2UY+xN`zw$HOr!zAf4k1to+-D*lIGXwdQd7nO|Ow_dXAg8!bpRQ!ZMU$^U` z&pId1Z}g?s$UR3$xqzJKf0WP5Cq6=sm!~U~RHmEo45O){$P|xB);1YpjbNFihEVsUrFcr$ussK;Qz+6DD zz`B5@=I{Zafx~0u5HNr-4Ujav8mj7Z@>PZoDqnX2IeQM|xqzzXE}-v$x!Q zu(&nC9|afU zalL6uw|$R%+q2yj6BSUwzU!6$rp>-@k^;HBQv!J#RvcOU^UHrL5cV$p8OXaoP%}HR z>qZ4KI|;CMLr$-wH-4so-t8V=HvQdS8~&<5xW_T>+Wg7B4dcQXz!h3B2rYTg5a@DN z&|`h0d;HvO=PkyXH5Z`^#Bh%Tc_U|byY!aLmwB|4T9y~yiE4R|veD`xC~tJzGec%D zrvT{%p-K<|UR(kG^|low%YzJtlD8_GUAk$vjv&gL@ZxqC{W_!B3tlU6UEmeEIxX+? z1YhB!AM8B!27hScF~_MSBwehxxTs~(FJ8S=Oty{V27ea4>ng==y?k-&rf0Ia7<|vj zS=9jgC{EYU-@f6N?bf2cx#|L$jf9j7gte>=U@a+-=ho0GCN2=MqZ(4N7YLBo>*nG2 zC9rjY6BN&%IFMHbcqUX0^p1hwVHmhJ;PExM)K*|&sxAffw^sqK2t^t?quET|8gU+f z_W{V%;N%O|Fnq|KWgb&=$^?3$F%0K%cH7-o0@{rTNge@@{kk=>4_7mUaJEUD`2>HA zyuS__6;B#CbiGCE64y(P0-(Z?GMXAh4wX%=4RaCbCD%7!?mleUlu=X=zirO{q?51L zJHFt+8@!ZhSJV~YksE5BygYiE)(EdHz* z*zmlPQn&N0^YeG~PG!3Q8&_}B=;XPh@9OcR)=(Es`Mmd5_TFv0N8R~D*T?ml`Yh{j zNGgVnvq0XUx_!ppR(CyfPl($7trX=E{l$bwVwU2M>zwc zeSl&Sd`5mb7g!r%fjnPHpe-_`DxeQNx;4UXs)m$a;C5^1!!|Aun@}C8UVeZiqvWgi zYqQ}SsU-f-D&nuX5IK6`SGE5)>n-{hecLetZ1~}DMAI8h*9&-GYJKeNTSvc^rZvL6 z9k#mJ#yg4@XBxo4P=UOqL$9j$@r-B&z(>^*A~Gp6NASJ$1@kY>YS*iq*4B8VX|pz5 zyy?SNz1pe42MTyOodC$U0KM0c03$;D~BZtc%MHJj?1r-f0TB@tsR}AXw>jEyI znYxQo$A7bNtB6^sp-03npk9S4Kz|vg3xpL4aC_J5uWEOi%_JOEs>f4YK<~Y{KL0y$S}v*B)6RWAT-O>U!nF1+v-W6v%S{P0(Eh__mrhG?{^0BlG-fYJ~H- zS=Gifc>`7jH1f)ABiY*!E}#c;J^*EQVKH3whoi)xH=U&nO1iXP@HhH*>N;{CJ5P=N z3?b35{M;&c3m_?@5vJ$(qEBdjaVjEFG~n3_5NSsRhSSMz%4lpv9^}AA3?~Nx_fK*j z`a40vm-1)=5)l^`7P7zxy4Optf{Y)aOnQCz2})+}CZf${H9nB{dut)hs1x9 zkNZTYwbu>2lNl^5%s99c2j?th90DK6+k0};H$$#^jtT>u24PaeE8*Sk5onbLrS{l6 z?w?a{G(4Nj0sVvxLVx455uHEIHqNZB_zhj}Jb%D1yzh|(Xt?r%&z^qgvIm*BBA~A2 zS>Mb}zx`DsRilNpG5xn@@9$gBx)YIlQ-JZ8EuS#)Dw7u)m~dyyKe8L1n62Fn^LB?1 zfQWL8rsFV6A?XyrS3U*;lju=Y2CtR#vVdnZ`}EoV;e;3??`hUWCrYQE)8Rh_;=R)l z7tk{f7l>2d>X6F)LV9>}T)(2f>+!#EHuR2~3uw5v3n<5T0gWbgfpBmBTp;Z3>UzZv zCdd)xbXOnwaDn({)sV{CUk#x4v`b38!&LxJHxYmooD}BnxDkz;$VTr=O^4X%Is1s) zoTa!`jZ8x*I!7UM0$MZ^2Zl&)gAhD`0-1t-5@q4 z7oQ#K__9mfcKFH4g&*QDkyGI>rXG{8-L?_M^u&hcz}G(+6lR`t1L8@yhNzlERpr$vI6O(E)YguA5a#rhWTML}YeI+zj$%jmHu@@|2D;0f&kiN-f<5_Z53 zU73r268_?tGRgXfb!=LR9n%MpL<&e zyEXptq+<{fjmJJ@dVOp$kqt^LZXYFaFG6txLQGm*GlV25I@U4)Ls4?nQsiGyCZ`Vk zWIPW)ydWh*hQAIy%b76`3T3hqjIgWr>$R|*=RNml??PS+$e+{+xZ}#A%q>Bgh4uE_ z_SOjv|JwgE4Fqc>|4Dzs8T$9(x6HVpp#u6AlMeu~h2bdZPP(xW9^@QQQQ+yJtNUdv z+PHn65>Usk3+P3<#qXS7+B7AdYk(rx17ejZkB#ph*@Eot?@l|Ir*vcPp+5t8_YV8y z{2Q;>u0Z4~0^IZEPiMYaEFuG(YrQdodmub>RtM51;5!ELv>4b6%Z2~EA} z13-N>620LS8NA*lZ8-%K@ik6JYIh@)84;=oOnLf70mdJVeK`DEJt$0XQ#fiE*d3*K zskai|X4dE~r(gmIN_Y=*SV4KQP#WDackZ(8%pmcrsyK3im#d`I;kfj?=md5GAh~pujGGfm6{q8~>vzbTbq*E8Pc2Oc@(z~$ zTa@vT9mna}R(@ zoIj^3peG6C`+E-fD2-_#Oe;e-WlT+x`oV#K$J&;1HWIg~=2V z(n0Lu2MV61-AfVF(cO?l%*hY~;DiTBEO7i|r|XWad&;G1#O-z@;WR92j?8k>f=MIf zu_c&S-6k!eJ$5JS_7L64%0);L-}?s}d>K<~o=4Mt9{n5Fqh52``$^mHS00|IfZmvT zcxQ5M^T90@h&h}74CL)D$;e-odxrv=FMijW&39EM|Db@TGT7B{e$A!}nWbRkdc%C{ zrMc64KmE4W&_w>5w?6;SqFHR#p{oE>qv7pu$W+h=^C~kR2;^3hbo5Hn42uxW%=XHr5&%I=N*3 zIf0fBm`6Z!?k~*h(_v`1F)=+ho`1`q2j--(O@(b}G|9a1CBI#F86W;o%8m#>7+F@LEYrvW3RnvF7F}w3O`X9$gtOO zd-PY&Fh4~=uT>8pns-N&?WRkp#*_cg$lABhI#=6J8SDb8sCQ}n@9(cqsjW5iAfavk z^kX+YVcy%c$E8=zK0mME(5L@sjjX?`14^m^^g-(e?MfSO+4!)M(sveIKu?5RAZ@X< z;R5=ev-?A>$FTYmjo}<zvdK##x%2!zCCiZco`jYlE)q-Ib4^9%2#?fg9C_pC2dE&e@=xhc z2zSWXcvH;jXAD>^z}j~@jGpmD5Tm<6fYt3QpIHB0iq-I3ax1g;J~i`)DGEe>AvIh; zUou#JNyG71{X9!+X!6r#eP%TO=9jk^fFl{mq*pqyXf(bK4+${zn##f70V#3p%)s*9~;{!s_{EkQR_Q$?L(De#^Mq*=j({0?IVf$j=zfxUIt{ZC!_Z4*1lQWi3{{7mCx&1Cg} z#g<yYXT0h9$0ir5sE8jibbWZy^3TT97`GR`Qi@J1EAo;M6 zDtY>iiR;$#_rkf*>@-8?W=@`QKQl@MqCb=xE|APe*N{rL-;GntH}St<{Xn9_!opHo zWzMyFUqK+P(OrWtUVcyCtvu;KAqCtbluoB-;eg@_wO5@|u{}!Qxn#XFb(e7wux^i?gaczyC%1bI&cB#_i&PFuW3umu~PXnO=vHLdX`))kZ2O zvwk_?_cK(w-bX594N{yVTT>%`h8VjBzXLgdB|6BD6W8WLsK|4*zUigpnKOl$#04p* zK{7+)%aE|Vhy!g}R#;N3$+{&UGT94e;!=`WI_jcU$PvtL=I6CL?z2!~|05`n_riZq zojL1YV_ado1UTGm(g$z6#yUEFjxcXq96EX|<-AtBS_oJoH6B^Jw%3nul+nKkV7)Mq zx9O2jcQl`PQ~^C6TK?q+O~{-o10Ee_!Xk;254QMK8%X#qqud4k8UDa;`zHnjDmVX zY$m=R%v}t=#2DQTe%N)Exgi8iIg@!)A?psE=`eqj*iUTJaAGxVx2Lk=;h#PBNyz); z2$||_Cso|F)JEFA4VUX@zZC+4`_?cl34=${=I)?xV#i4&6UgO9HbIbJNZg`?ZA_#D zCyqes@p~1wj?=_a^Z}pdNRCwOLK3+ElCUObFQ9&ygNGI!3j=-;6U*UOqGLq5lO7}% zB$+;vwY5$Z&1f-c$KNnzlJ?i;kdHoV*lIJV#u6N*T%W*}%sEBAQ<^k#zh*avg4{^W z_z;cM_#P?Ag#n}#ps5Jp|HKnYvVm-;np2kiv9w)t&~Bl2a&JRo$=yS=!^c`#%|bwI zx5Tkoj$N>E@&Q^HJ3IU{N|M#`ty`*fUV3tA0_)fc5r;H(QgnU9jl0x52?#AC`nwDO&u~AcSShvAL*UawlL+6;h zdK1|Hgca?pChWigWrgB9;=5z_3)V8`K%=B#(TGT6qF5fx&p93nqBsOG6#Z0bRmu4~+XDWs5l&s>LXtSzPlUK) z)&%Uj94R3liouW&Vf`5W!@P(k&IRk(2c$OX{GD8`B)Q4=owE-rGLMNIse`r2WIoMN z4%j2fwCnG@CM{(8iX2rX?o&ac@83ngS~OZG*QnCBDC?z#Gute%+cPVps!6MvPm=6U9$^NAqh)UUITB* zNuUIhr$I^XKL6wrb4omegO)%sKVIW1L`Ys`v4a(H8#%A(nD;}>7f(v;^&uc$)isxg zfNIXbzC^KW*54QUsPX*}54&5d8viE-NOMPwg?lYAvwlh>B=~zs)U+R`X=hx{q!2e& zOZpdS4m9yWCr+{Ki^bwLN$kl?9`vJQ8tUBknK`lNNTml-(HT zNs_@~9oxFpW;Vs_P+W{;VfQ!8e26%fBop)Fq*<^sm^3cLz-Y;{_=zl0+&V$@Nu6Vk zon?Lin>dyyk_p2<2wM9jHpI`|QX8=qK{AfG0_lIbbc!cIvq;Y7k%mL3bSCqOqw*?< zyF;m4?^wM_crFCQGBTS_NwFoX#dDU`B}6SAZtNL_Y`SP9WaaP%h#RVfY%!6PWL)x* z`@b2n8Mdq>nj3MG(T>W<+9K)_yq}O2u!5e*w!ME~i8XM=rES)Z*_inxP_C-{cYX?oTabk};HO!@+IOLq(ZD_LTUCz+W`BpVD;ZmfMtj zhR)of%}m^zCX4nhDXb(`YM~%x0aWvQrEU{c^CZq)Y$(-R+Kkg$ra77tO)HlS9nz#} zp#<4qIBXWfsSTBmwaz-XJbH-3vK>U5$ISN3?$}RxXx?9v7%!=;Vjf{h@p)lM`#f}_ zZr_OfYvx+3MY+C`Oue*^PYaUP3QuJ?JAsk9eJD~)n4{L>KrzH^usqc<+jSmnuq1)$ z^AU?=T|1n8Wk|$&!hObIm$>aX&X`a;oduxeX!LiIxNkI_$w#n*$)S(w(rB$S|B)Ak z{6xry5>NJcVkj$~H)PFkb)@bjC?=Lh`QrxLrQQIKRJj!mnc3b5ROndikFHCC(ICovC}IMa|)6dyz&rBEA+4mpB~XJ4a)Z9ZAqjI?8K z>l1BA{`hid!QYactwTr1l;y}MvNzI0Noe-{B~1y@3Fa;m^@5F{S7dyp$$*nSM*uE02Wm*Mf ze6f0)7HXgKQi!e@q7nLH>|d876Kurz3<)qYCt2Rgb7EM?dKx5P!b|}+oOCzVnZl=Q zC!A>~7GN7n3?^K8axdQBF=FMUJ+Yn^Vf)vlg>4>Q(&*PUr!0LXwkjm~qkn>lZP3`M zq_~AbaZ83`j_TNK$%}AL4*~JCOI*IcY3i={si4oi{9=cMAi`>&oMs~t+nnr5Q)ed) zg4dh8=8VPdD-n}nA9AfwK4eyi!d}o$*eYQjj%rTE52WVw&_d=+4duV24`dsThE405 z#?FdW)~8C$rd6yHQ>Sbk)ERa*h1t1~?VBKhV?CCeu{a~nDX&RdQv1l=LOphzv3qm>cgTxxfdiNX`}neOD4#?D$DIp+u}ZqF!-W0oJ!~MACpx z$H-^N>p!hm2qMhe6%_oZWih?Nd)m&;)F};bZp9a zp0ke0oM2rxWr=cg6vXCAYB;oN69nCM>WD@d^6>S%iP-6ZgPm~~T z^G_d%M#LXpvR+~#+W;go1L{*@H9{V5^fxD`lQ<*c#_nuJNUn-Y6v~jz!$KovTeUMH znUMS~iLU}%k{32Y42*OE9$4&prEjxC3as2$Y<3l;P$k?Sq%tNEQgdjqi z7>ieVTFl>5k}foH>~V^DNr~9nV96bImO}OkNi!!N$sb1E>%~Uw6B7F&Mi!(WC32vd zzdIx$DDH@rIEk;uLZ&2<9HRYWoQL%iI+KdKMf+((U|ABqGXxYp7r$c^$LRRG!?rCx z0>Hi?NhItqM8+6#Xt^g_p^exS(8neZF25;2*ZHF(wWKYJAU#wP`eSppip_G*(L0pl z7vXRxe{tf5&Z1`_B8gJ{gJEys2pBPcPe}uXg@TMqJSZpSfjSd(lGGOf;$n9A!m=~M zyaM(iL)muXgTqe}bF)s5eMpWgkryAaTQ+k+&e~+tlnfW{g`_3*B-XcYWL66?HvZ%h z#u|*0*aAo?`5En`?F!j5kh9W>Wm3o$v;NFb2XSl#MW3xiY@Ec%coEBu8tkskH+>Y+b&O4$ zSwp?2B}4sSI$=$<9h)y&j;v<;FGo^sK3egPfYQ9s0)1S|wLH7Ppm5ESqRPtxut#ge2C8@KZEwEuh2VCA$K zI!;@d=Puh^5;k|tH|5Dtf1C8>sbMmxS!UGuyV^0yQ>{oOkz__9v~S{q#Fpa`pjjsE zhg415@$7Drhf|TF%`!_)3*-yir#-S|NcsmmS>&yHKN0#$#G`mYO41fAWIT$9@X-{h zE-0OhSYb$I%$wwnEqjtc&16`367kr-L)mbi%V`t`|H!vmVdxd8&=BE(dmG!tzAzLT39%Y>!RNN+>))_GgniKj? z95Ny)3$Z8WyC6%6Xqw|8l=4ICg%1))qm=tdNX+&MD_P6oqZ1o9p-y^r0F^;fPs!83 z{+Xyhbqux|STB)VZ~oaP214ZMz>IVRl9;S9%F6{<$EJk(PG=4DU1(k;dcuqVD^9aP zpOKVSswmV)YG>_(P#1Vjw{X_0I`9Bklf<6;*YO>df zL(07K?HsIQ6G`*VCnxb2YCjC8jm8HUk>4q9;*pjHsXG*}$1UYd){^!~csEO~ckJJ{zvt zBmt@~S&IEVrCmwffrKIN%B*%FTH>XW^F|1W=Uj47`RSXr8Z;B~>NA$K?#g%T>DxX!lBgfEMYKv?u8HmGB-j-%?3KO~sx?!;d2i zNwFYVNT*kh>zx-n2F;Q9Azd=)95&fz!e)xL8q4k!JNvbdNrNL-C=17$q5PEMEnllM zZS;vX^EZ{WKRAtM)DVZY4@*NJwVsa)=!8S=F8UV`>%X`nNMg{4N%dtNC+iRGjO{T# zb(AO2kenSg)6CL*8s8u}L5!EYr5p+p6UsRyDgVr_vI!s}JOT1vCpK(siYA!UG~$1p zp+;Uq#FEaZpq{Y!j11QyT64sL`FtS$e~KFsKK1+*ri~>++9O)Xh|m8}q8WEBRVmfXQ(Fl71C_W<0ln0v_YJ|38P;h#>IiKybvM!lb5~306gfP5N zVw3xqRjgHwD%X<7n*HC5=7;S)jus*%KVOO1Owm$i+5Za`O0&~gYl$_r1lw6wpQHwD z3N{+$4Lko#6T{~vmS#66>`M@D%B66tSX;f;2r(4m7QApI+ZHzBsGzhx+1q-llZcn=vC#T`fr7%XI|$4KxPGo-;#k4=}SMNNB%gbA@%(hk{z z<&hWY=dqdR@kW@XZUTz<3n{%>xzIsU1n6tB(?VWnu5LVXY#!7GGe^9w0Ac_^ z?h{F$?O(>kzF8K_TV#ma3Zbn<;4ziH<=d1fre0U%!wf$|<*5Wp!KGz}If@dQ> z_URB1-`$BCp^!~BEqLB$+07I;s&blPCXH34nPjiDJg|fv4q85_g3^XJ2M2vDV)<gGHk%MP1lvo-7kn#Y2jPzlp@SXM|37NEqRCH5*UWMgLrnqUF? z261>$_-3tT(;~VXvKYy8ilei&VFr)vUnt0*RdU+;i_csaeKb3gBV~n*hamTB@{SO*AYTDzL7tbvVOc+e%%QCNwZ8RJ z?&K|2$i5x%J`#Sc#ieFyA*0U<4Ba1#xm0mu2qa5M_ywi;OA2+UCT1s&MDk$bNd8~V zEz>7>!N-l#&e&kt+ZyqfLN-|QGI2nBjka3I>dXDES3*GI#=b5D#LHWfVBwgoRog=> zgCq^6{}a+SX6s1az(w4qm{<#aCpyFuJE@`eB#2X>pdp?bWU*qvJ@fVvIQR0#C^lgZ zP_iJYv##cZk)_5i=qvDQi8oee6Ug#FlBxKc;9Y@+G;IT-L>@en=%k&}o+QD@R=d1Q zh;(d9O-%7ZNcdGJ!V1xpl2ys`Dmn7}^GXbam?C+JcvzAK%-?3vXQVttQSXOn)BNdT zo}I6SY&)?Jm$dxw8x%L0OhoA8*<~xzSy@AiH58P+6XYMH?RBiLv@0d?3y2)v{%+N7{6GR(w*S!|};5;;=Y&0=E@ z1RldV#v0950v^t?1dd*z&D!=Cn+6JHJWo6?lw_l=#wUsL1dxCAPzQtc8yqUm5i_Tl zC~erjwCN-?6keqoOGE;fRAT7PMC1el3@yQ z>!2+GM?%o@rmaW(n8%p?v5wKcsVuOY6tc}@)Xh^y$CSLM$;6ffr%tyq#fdoHOfZ{D z#U4)FMnu@OUt$5m=mDkW8*~G|#wzWl4S|L{;AZ@wUlr&B-Yb zbb_sba5JWjBN=BWlS|^Mpbl%#l9<)MAc%3$ZlgM6e32eY%$d$h#0WGk+PXzNfxdy9 zjL!=(EO8ZH83K~)gY`l{?EA{JBQcv|CKzQ?Xd;8=iA0*1OfY&jezNLT+lZw0#))wz zlhy<63ff&k9;fgNl$=cmuXF~0S)MkSC zBpY;5vlO=lYaUASK$2-CaYZj`aU&PRLc`2XH*&PDXf^Q{$EW7R8)3ZD$jMnBeqwpL z#J?D5&M1%~NMTJHq#ZN1LV{aj8<1So8ZBhKBZZbmObwGd%!8F&pxC+k z#fimjFyVN>R*O3-~|z)G69GV-&a5!tR0eo*^J!NRpM^KRR0NY#c_};ivH{TS&Bqc$|{=6Db*oX2l-| zM%$EzL)sP}fy-+#SjRpueX8I!a7cS^S{Kcuiz89}bd1ltXF332biIEfMP$~hf3tGQKm^Kkh7&?>7oS|KG#~k%t z2#B{{%E}Os=)C4nw=ofSVA*WeQ+ziiVzWbhfKSd6&D&r&NqKS8#A|(92YjrJ>7v=b ziuh9t84)VPoFL466owNc=ix-I*ZMX;tf58qSIDXo3ybQ3{3pd6!!{GN3+N-z*JW)> zo`S-!YsN9ngc%F8z)84J@0pJvZzLf{QFg>kXiJd|#1jzrv-Z+viMV7|uFg`@L@i{a z%4;j3wN|wb+tCk?D!NyQLS|NopvezW zh*)({43<1$=HFQ+Az9g%{Qp?Uh9gcF98ScK+LEzTb2k$?;`h9=)v%#tt+xo0TB>K>j)u0BqSITme##zweD5-UWj{dUu)gF z)mrOnwNM_k?btyUMMTs%WM$&ybU$Qn^*mE=vB3M&*(%))YhIB!fP!vC)Et z`c#80H^WfgdzSCWBYp>qsN5q}zIvTCDaL9^)Fm2CMw`))X;b+`lJ1(2?wXLE+D588 z2$f)q-E6a|{2AD!Gp97^WVRVn3|3$iHS5w1HkF?PFwSN*np4{5WMmFh4N;N*smb6} zY7DL+#@1Mup~ILO>n-W&7IS7}La}*cn?1v1Xxu41-EPw*nhY^Iqc!A6YF_%o59f=h zil8HtAsM4^?5Jzv0E3KpdE{7CHU2++IFnZ8WY|f zRO1kf9YYybaJX~5w6{fzsN6zS#jt|LeJ>%DjMN}ZEz4Y6% z^sDOz(+U%N0Ot95%HXE!Ipw@0}{_MXI3tkH}{{*8hGu3FeXkv1$mUNw2 zFEI;_=1(0s+8{8C#id&GX`D(yk-G<)?PwrizOi<*E?bwYiL)7W>5aPJv&h`2wOd-o ztsSy_j==K|)0uTPqh4pygc+@dM61r6Brr9ns?VtOKw$dyFy?__>SSsn$xNHEz8o?C zz};Q8tv?7v|8Ps9$!OLDr(!a*Q;k-W{DAy91B{iuM+;0JNeRQW8q?U9skNK8>@MY2 zvZg@u56#IiSdHlhEDwfhHJI~qdDm-JC*IombeX^`9c#=?(}d~tHj9|uSvxEbUL<%5 z48K@In$etu@ug^DQY{9vF^7{Hv|xkz*4aMWK zyTI?a#mip}AKM!I(Mj+JnQt#_$l*4X7nt0lu^N&zx|9^Fg;Fd+|4X(;dAc>qi=K;z zS*+NLyxZNihIM;zE=&Leq72q#iz!VLgq6~#X6sC8a&`-jj4hEdVxd6w>8wjKn8;db zV!_D@+JPib%T%2}^X*}=B!ShFG{FXJV}n)9ZNZkel}y_<2t2Q@Sq3WxpKaE}ThbHh zKZBkAG?ms?93YV*LCKP>vuZ+3S%yrGw7H&_Zo!ghf#lo6Xi6fKY^jrxDw_*~4cAhTv}$nA}8#RZaotS-x7 zw%E~KsvS~Hhdo1KYV9ij=YLiBAKPiz@WtY?b?Hn3sBYP#7C2GR47qHSt*>HCks_3wfyZK#RU8!cvyC0WzmnkQx} z&#-7z)&!%#^b^#`swY}43SZmzhtx>A|C2!U4gr_yZG>RFC0kCNt!Zs{kImf$R)82} zEcSq2!zX~rKBO@5H6OX~#O0Dq zRJ6dJPPeJbrtq&%Hzt8wz%_;K?Et#B14LKFV@yQD&_C7MUAb@1&-?bR0G5l=K~a-g zvZWd{WKhr-Npcr$dsx3t<05ea+ZWufH-Q(iR>nj~dm*T{{+?H2d#A1f&nwPu&M*+k z8E&;;PqHc48vWDlp!r1wk~$vy#$?chL&D3Y-0Ee%p0xgmz^NFTp02a%u$UIRNsKa3 zueVsmb}G1ixpRdd_lpMpak>nvg^JoJV~Q1O2CANGq3-%$7HqC8FntpY(1$u31Z1Qo z$C4!R^51=au=rD7f#(+io5W(xCA|k3h)@vBlplSdx~lmEi5O-gtU-l`$zrz}GgEob z`TpTM!b@Hgh(3{q6by@KHHbh(r)`>(erImG(gMvN`yrF?h$h6CNxoPS4;#ZX@!6Fa zCi%KHyr)&A0Bq`FR%;`rZ>ji2BmQNQZ$uQbLyUm_1 z7TE=@Joqo0=-pVO&5%jHtrLclZqf6ha&%>r#lqCfG?)yT=3E^FU>X=xlafubi_rfP zjVWg8(b*8#dV0*$gX0qgnkShmVjp!% zGKh89y6yJtWB<+-C|;OFt4%}91-ms42y7QIS$Cr3rinmuOpfl@03Yw01n*v*R1=8Kg1}lnEj;IZgi_|dXvVMs3alR zjJH^Q>7SSNn@kbpeBv!uVy}_qru@#)R=ivLbL%fu0+!vQzN~(S%ZvE$YAe zd4tMQm6Q%L==2c!K^Bux&2uKSPprJ=M?uavN|$3yhdYFcGFkMB#gH@gVUv><#juF7 zThk#FFu17POjy5sbXh~R&9f$cCdher%F8p@G~sq)u0S|(tbq+X=mwv!FR;qQ6Jc$% z5=97+OxzK>)UX+yI&}Ev#ub6<8)~)@yN&jYAts64pFH|p=$7`9SG(HTC8GLRzFW)-!gv;!y`ix47B`IK;0wHP74C1L#*&IHKAlS z=)bA8%l92`KYIHGf#DlvA<}>h7Gf$(Va279IqLES(*>SioPnA^SSU>()E*o@PH@bf z4*A~y9TJE>VRmy0k;&#{W(sn&k+tH-PObX8KvTn}ggv7PF{B%%Tpk|Q&w6H)bj$r5 zZR~J3gmxieZI_awEF+sTV&wb9ZZ+Nr?D*mBH zix{K}Vp%xRIx`gq5ViQjWFddhfvL3|S=oo5LzN~$mRdCsxlp7gO^Vf+19?K`LD`HI z=w_@SKQG**(-U_EF02hgP|W1kw>#ebH$#y)aXLM5hQknXNs|8N*1c=)Jezw)(DDs2 z=#sG<5YoXW2v<4Qt=k``M+>$@SS8qGOis30GQhm(Qzy1U!PS1f6QYMPa%9w3=}+vi zvztr)Hf^W^xFi6x`Xmn;vW@|4stWOjWP}|WY9cVJgmptK>2O5hj&c0WO^cj;lgbu` zC_^`%s*Q~>4mhw`1IL}+GJJztS`u;r8gMV-;VN7fr*q@!SIFMr;bM2#^6L+OK z=Y+GDTo@jW=1+t=iK+VJlgm0?S8^pU>^V@CX4l2Xqej$9SSsCkas9;((^d zK6_XB*IvqQQ^V37U_cPVD7RboM~csv?loV99Fxpy?XkD>#xMPYn{s3T!i?LtXlT*@ z+9_MWtuG(Iwm~@?8~)6Ajp)!o;?Gz#32Zu&u?t6DAqv(M)Kmb5|{ z$sz$56B(V?q8bAbF{VRE6$X4JjJBj)N80)GE2f;ttSB(ckUa)B9kCgrrS*tJDVFZ$ zpRy-J^+`~=W1%0!3G?Tj-8Acef`|`u2{ThQaHKQgZBYQwDqLEBG5kA$<{y`q3r7~= zXDFG>3|MY5)U)By!#)Fk?=3LBA~1Z&sUAj~SrKMSOz(E>TlgPC!gQtpjF62rI8(F#pAA~%Tqlh073 zx--Yt)@`D6LpE#JAX6!FmYBroI2zz47Uw!A)EjCr4Auh(Epa^{+0@Ybwu>7jtJdZ}ty}Kf^4_8oZyE50Vu3yrShhap zLeJY77MUC&+}B|5&{@;q0uwIPA-*HNaY^_eHC{b) z5Eo1psc7ZgxsBuF9Z|jVz;ItKHb_ts zHhcz$4eR?NqxBmpF@2(m2FfxRA>lHt#7igNr`Bd`eSSKSF_O`SxDYZrSeN18>-5SB z4$7y9uTT$DIyO+l;9(h93ito|Ue;#1+9P%9Rp3>gh6f4F&&SJlG`-~NVf zX%IaTM=u%@<+V@}3e&onBA%fLN~G&Fj?VDzI(}h;&TuYrT)OQO+b&wRmRrOGAhhlF zrt`a(y7icimH;l%pD-fwd)ocp>{9^Jx+wbY;&t243ZNWsk^idMlRvs2Pyk|i^DEBS z{6PP&0%*otY_1nR|G!|aL`mnuN7&T6Pt)=}%E}g!gEzK5J;ZSGs07H3yMA)-yRpR_ zM5u7+SDk$^{zTk7*+MF><>e<-^m_VQ0c6vkYVESMZT_A7TIpQ%CkITwabm%S!!?u^ zZ8%`!xy+>M&VH6ED5{~0SHXzmBo#Y{vvd`A4#Tl8YD zj!t-Szed?`fmkk5m#52OyMUftBomiSy3)Djo*()GMm|*(I9|WPQ2x=M;#}(X(<724GRO< zRF&fJg=U05lX%ZKoF*R=qUhf`XI|R$pPy1lwdbUq01yRnIwPV1L`_B!$LAARY^Nh8 zLgHL!$^28%%n>}mVqz?TyRPU5qp%&X*Q)U7~Ud87H5DfFN4x9SX}l*B257} zg%a|OH<*bHl!_o0dd$@c%g~7wnj*2KPy(gNe3GmHL!Q{!ys08hPsnHnLWI=5L8t&6 zK`AOGgclX5Ui4q7HW41y`Bt-+JXxBk0G9KyY#sT`mQY2j0E92Fwf}&>zfp5zh>V^Y z&1!AIuOlm37Qd7&+?Y57px3Z^Eq{2Y0Cw^|w)EOOsM52h5}=yI0r}NSyj}6*aRwkv zVzwuyB7BF#PK0cjwuJYyx^0IeCtt|sZX0;>%^?TQCAljWqe^&j8*X(!H!Op1Z8G+Q zyv4HHU%F?$X8V8&cGkCA`)%b8k4@il{R|C{J%*ruqCuAim5At!6w573v>G#`Tw5_@ ze){&25UUpAdBA<&ugU@*u&I2JN&=(V!Fi!nl+`OkSFa4CO;|uAsa%wh7GnGD@NC&~Z}eKFMKEu%{l(V-Uk>5ok+c{f0HFg9ogJg-JXJ>y z*mmEe)zQ!|6;fYuz~=p}O&8nS6+l-GSpR(4_tsxaDS$`;C{wJYd-z-hki`LOj6uUn zJa=GEp}SYF9hmla24f`3(1Ur46~El>zp(f&g_IBk^Jgck-@Wgz0GL0b*3Q%gCC}P7 zOai3T`>y8M`f*>3U;ym1PI(q`luk^FOq?h+!tsUJ(&K)4_{g`dr=+2h08ND}|L%17 z05-#F?a2FQ47Dyk7sS0_3?NZRPY-3Jm1VjAV#>=E+!`SK+Jxe(wbj45Tx!kyjuh zW`@!IS&a{AtNMAV?YDL)Ef@|WmFK6wH4jj1cB$mn#_FsSHl9{mwBn?ew6?rhP`Qf& zsK)_|a<5OhHI$ntj;k;;>&@B_LnGNj9wWE{q!BXd)|dCzb^TAakbc0pCMyqaKhH&$ zO;s__OwtNc*|b8Xr5hU2tTV}RBX9I}^J%HX%-qDb%#GUG=pS#UljyAf$v>k{H994- z?;=9k2L5{G;+^Yp41nlxXO<^|Y(=arJ?JEd5mvK>6KdW1*Y~AUhf6}Lw;WKff8EuK z+9{h-Mj~ASMJ5;4f{51)PZ5p(5Kkfgaz<#9JUQEYV8WH3e_@?aChyC;-;-En!LaMM1r47d8s-8&m|*ZJ`)zk? z|IjiOb~7}>r$PwruFxT2^aLj9i8~ONZA`W$nvg`NNkB>x@eidfzWv(CM!M8JqOZz< zIC(@eN<$p1kVG2fzrj@Fk#Rn}?S1T-HR}H=`&EtMfPz!oA2gh}LeTQ&84N)>k|Qe3 zrj@(j_PDaNn{4jJBrg1Mk6iQeDrus51)7nF;0--eCx6hxUFG;>>8Z2RM!o+=5>hdF ztky1=JL=2&XSveDxeD@zQgLjDV4Ti`j6T6*^H06rkiPGMZ12XLY-os(<-!Q(<$T<=9?lk0VF&xG;vsTpF^!3jMG>SMN zM&cPn(tvZF+zI1__&IHR-4iGQ4rk#Zh-@VpvSgO%*P~vBoT{kA9o(3Wsn&-24*RXb zFea(NUFC5?W?*T+---+(kVL;}z@JDHwblvMQNVD3B48HDXf|n%g)J-v&s9-NyKqnM zHz&&M;R1v7)1FU$!L7LHzn3xViYf@x88>sxk>rTL>#}!_#j(I(ss4Oaa0I+i-KC)uVp_V+qoEEFbRr zZebpKI=xo_!g^YFy6*j#vkxf%VSBFmEpvjQHX91P_~XqX5L-P1&|-!N9NfGXPu!lJTs!>XL05B(5QD#B4T111r7jal3q| zLO^Kynuibkn=tyK0uX!PBS1REQEOcR?xGJT0FEA%Bg$BLsOo~_ha_oaCgRj79$UhFLrsO~j+cwUgfnccI z=zBi2Z@Q{HGxC7x1JRicxsGHYdP<BCKC&f;zy?Wosw;lgiLTM~E&Z^3O z&*y3a6oA+tOJ|H+VGUT%0Pw}T;AqFBiO^XyED&zOxLWwfo_Q-aGX+JqR}sO7^C}hm zQgsOPAn3jmqG)Ex_rD$ZRFN@lZ)HO1^&8J;CQi* zg+`-p4M!R|@4Ff`ZZa*6dG?M?HRcg>BGOKeUOCoq-_|Q^$*glaK(Xg@wokeD!^t6{ z5AW_IN(3!sO2_>Z8C6Y5Pg-uPRkoL|W9we0D*t=aTeL6Fql^tTES?&PJ|(*TgfhlDume zQXH+`h~>rpUBo)4>(2}zwbluMyGStpkg+EZ&0N6#h$I>`$w+TiP92II^SINh>+RO@tXNr>V>BYG;&dP2N|UKt_gj8n$; zs(b&79aSw(_ULw*_qg)Lb@k$CCO*jake@}93dR0i(&NVSiO=7Q-f+JOQ;CBGd=#g% z_`~F;4>$Id9Y`Z)@kK+oils+OfZNZ!#rHG*EN`;cW&n72L}?<;42Gs@0%$8o-^51$r@b+){LSo6QN!&msOQzON**mq|k{(PDl3nC3HvPmUha&#D%XlAi z>P0R!kkkKQ;sT0~b3#IEw+pm8wRZGTdwR!^fvj@^V9KKq02?5pQ(I=;$yq8t$`@`T zF@tf|;+$7JeDTg+`Ks08v&wZrB9;lxBD@`vod}-kK{81BI9#xiE&zFjaCL^JhXH8f zJBDd<;~G4a63Q3JFSby8`DbBLB6LXhp|_=we4ohsv>omJ_|F-V zm?!mp`S=P)sqnD_!`GeTTel20)O^-}{)NTxg}Fc`CNLud86G5KOyIfQxcyr)+lT~@ zT=p|D;pViHl3N9jnD*$TpjS3tXUj$I7bG(O@DQtAUhGQrA7d%9>VrV85Dzm8U+r-D zB0iN$Lq3T9Tf$SnnZ`_43_^`8RdNS2MH8~>bZ|3{53E(=@ol;fnkTUQ zdJt(wIEHwPin!24n^XxTwqd+W0rrKUIsLpa9&Nd{S%o);QE|_rceKu2%xN7KC|Z^m*r7Tl&`Pynm-c zb_@sPyRT50N`58*%JImB2_?VSHcSC*<1N;o^dHuL`tJ-tf{@l+19EVc&*=d*3H2&J zY0iw2?E)8nCn?DY#mplY+|N!8QUJo5oc?_NsXpI46J1mYA-OTBxL<;6)0wFTGfnlR zNfcy;)Y@T>`^>mm+%E9T#~Gn+$w78DNg)QeU`~*KCd`nb=bm1u9#&JJD>uo45t(+d z{hjd8llwT@M6Dfis`SeE-wp`^<-25)Lp+R1WW0sJpSK#4IePAfX{QqYW^xw0t89XW zFkXas$wAJBBAvg zBC26ZhE5?jG@WiY^-*8=`PM}ycrcDK-OY)xDAUMYbCR*l?gsEN$D9Z_)203aLD>(A z4~cFxo`z7M!&SCU{Zt*Ax8b6LEC;hf)Y@ilUlsYOBy(=5X)Cs>696t%ryOVl60!** zVMcjP!v)Q&GX_B8%#jXx2~J34iTd;LI{|E}65N9<9IB@I=1?99#uO=_TqtK@kNQ*nlySR3~7di9Gy6&YLO`ursLVoKa^bAqP3WGU+y0x|J&>& z%XTd;a=hAfW<1lW6)}<>esjY+Ts$oZz^^4i@<-msHkP;hTR>f&vS_t(E4D0N)`GW)V~u}g`Nj<#D#lAM^Y z{3W?l*FQNZ2>Md3B?Nk~CEG+HYVEoMTb}hUFWpqH7=sCh46Xnpr%o=>+S?}sCic1_ zi1{Od7ZH6(2;#`I05T`H^2+CZk5BSpm}JWLbHFHj-Rs`9rw9^0u?ASa{FY3dl2(!u zS}SV9BNpz$)**Qzz=Q5{%|Ge+s&bv6R=Wi~Ujzh^kZQvnB-|r#xY-$8>7Tz(Pg*MQ z0{G=@uGs>uX^Dt4kb$bTU*0+2v+Dlw0#!}K2fh!c9*` z4q4_Hhbzl2I5?FNW{2x+Ibo7nnOgW4`Nk8sjwK2QrrY7U7mnu@nq@)k3De_fL-1ad zy*vs>F$QvxUn5mNK9^q*E<#C@JD3{kGivDHbUTXud_))b%hY*XkC9=|;lnvF^M3e< zcm+`8dk)ys_{Y^g3;Hrr&|AHzdQsWZM_1$k{sOTEvE0)z0tP z#>PTE)lCFyR(Y*$wXDTrLB^L|l4}%i%s?!Xgw`kobpXQZb(s2GTBg2n7Aykz0tqa+ z(7p1O()X3GHlI);LeTTUk|mlSF3s3d6X98C}+4@+?x5f~+8tJ&wdj#Dp^4PFGt* z*1oOW>(%KMF>J^LSHyBg_uBWhWqb?qE$Rf!KC#fCbET0q+;S_o-~ToX96!-Hx!jhT zsmqlUn6aR5%`7kJ>Q{(IsTUnNdO&6$b}&>l>e?WdDu%0%p78tD%AX0s>Ts*wkVyhj zVG2&qEq4cg-jWTMNH-d6BKJo%-H``PvbJb*wKj6hkPDsz6w3)|(iRlU!4k&e20N;8 zaJi2Gj4buT6_0W57}5o zgx3sHpDngyr)caC>ko}{Ng!~-01<(IDr{n31Xg(M+E#LHfngS3yVfHs0+mx!Q#Ma&a<)p?m=-cSU2M$0)EJ8>91C%hzpdoEC9^6H^YPr=S zmhCgTJ|dvz1RxfQ)vh-Z%O1kDhsCOR%KD{WS8r46upF8De|!MCJok2^d+;C#dMjFr z0}|Z+u6+9PU$R9pJqL8l*TyBa9xDMdStO|1j^WkcGRCAbQm6@6fIFKywbm6-LTHdoac<2x!>J=| zH==e)1uP^9NxRMk$A@IoBBV_PIEh^rMv8C(a{%DeInFuy2s0W?)WMFm%N$2195i;n z_6e#oZ_BlXTfM?sU`z1a1bjLQs>r*dPR)tUgpjqau+LTmQo3a z!0_kJg(51Q&I<88ZejsZ@hjig3TYcewSt;ty*4sij{> zx5Xv?p<6B1w95`5U70pf@cP=hv&lDP3%4}hV#|#dFMA*8CjrX!-g7-qcbqKk!{VKg zjwmyO^RIR?R~*z>wvt&i>;60UMeAeA$lL@gtUYNfIdwNvn)F-Z`2f}&9XG6NR=7ec zj{_EaJpSK>y(biakbDc*)oLA=q*4GAd5d|Y)<*Shp^*T2{b*XpwVyvoDw@3jR(gKQ(DaA0899- z`GY4Y;;;x4&1!Ay2TvY;;pHz|sDuGozue@-#m}E&0CGD9_K3j>tBh2Q3)B4biA3j=Roze7LV4BsGD!zYg94H;1Mg4m17(b>MrH~(As^08b^ zna8@j$L0KH#h9%{Ii?|Bg>B2u2kr0iNVZTh&c(%_KkMy$y=Jch2;eQYtOh2aMNfj<4DL zOpq-@3ox(~CZdz*)m5<}8kuuT^nYDnAtLN44p3G<2keM~CrP-Nn+QWsV@;%ul$CcX zBu1E82-_nMI(MCsu~POSh3%1mu>_<57>-(dsMi;B>%C?}q2IiS;;6L;6Dx0h+4rh! z;U38W`~J$_vnhVC1jxzQW^A_kRr$LNKou0ZTI_neZSC1_nt1IPE}KiKyZqble|zj6 zDw_L5;t*96qRU2H7Aje)4k8h1#OT=#D8gZCtqYE4JWl9v+!GELm+eCr6!OWH z3m-&4oDt<&8-?RaKf;En+~#m}&%4P%^Wyy>MfjZxYA4A|T}oErzmKx$m?}XLyI%IE zqj#5P6GuKn_(eN+4vDOt$en5e=*UO9vy=L9=_5>!(s>LMfOhLE=gn-PkYbw`B~lO7 zYp`NLoB|MxS>Szg)Q{0@l$4b4v$w3@{W|DoF{Oo2!kZtz8G5Zh({Z##ci#E>QBxkT zB~#Lq17=p5bZyf`lR`=uwckyRT{*#9 zN3{d!8JCI@P81+6y6O?}G@}Xwt29>R54ej|4Nr!?1EiAvqyx-wo(9s*>~J* zq)*s3M*#>9Ey&Tgo7~`#0uY{5LEkp#27k9*0f;SF;C*OP=TiZR-YmuNal0%Xi!#rkre)q2goihj9Z z#AWX9>Sm2)+(!XoZ!XcU{Qc{rT65O9JxhRNL$hA>Xg4C;>7Q@)1Bp z30wgxww=}5j{w31X?WZxXO)&MFG7Z%ET;nDN?drS9jmo2C`d)hB>9je-PEDduM-v) zN4m960Bo4vIz0}M=wWa=vfp4DAuuZ|J8*2Od(M+^9rHe2cNra;vc0~f+v`g35;qa1zaX7aTJig`7lY)f}E(?^h zxOLkQVB*9enr_L!|0^kfF38>qC`+h=2@3B!OF2K>d^WrG?vmU~q&1~b+zz)okSUK0 z@U3vrlVib|I0PHHSwSYE3)13* zrdeC{o?rJOzlcxqk4DusR70Xd8Rh`e2*kXsel`5_?^Qn^sS`9fgEk$oNvMM9It65`*d_KSHNZD05N>MNX8mkTE~ zlQ333zzM}XMN0LCz9rdx3DDmj<*+5?s!M;$TRy}}JMH&`IBaK>UM zN47k*1r|Mr=Cr05HM~-%I zHbOEmb5n5jQLx+Kmt9KiKVuh&<&mcZ8vv#PN!n->YhZ;qrB_qkb z7f#Xz&ntu^u7GA7IjR&$DbcqV)a$cXe1b1q7t9?w`a;r^*o`iD-qa_hW?lla(rvs; zgQ~){eZ9soYGgCs;eh^$6T02&#?=yWv01S|9C0Ig4|Om-Dt~0vwv$-c239x!B zDXW=6#vNrblN4OhSC8@k%&ItznI+(;vhfBc1~K+olEBZW!qpUK`qu0FwJ{NVX>_U+Mz(M>;4i zT?R=;40n>}#|gEFzWMNv{cFW&{6zgic#$}bbMXJ15Xn$t3!^|LXj5STWD_AvghZ1H zhoVY1wmv*gNB~Sku#!dM+OhlSPf!TQ;bA7M2HZPv7Ot)oiWNFS@=f16lU9s+3#<-W zMGD7>#$>z|fg~mIi+r@a|iYojvQ8pnm~b9c#=Opv%_8Le@%=xT9C; z`_C3JMGqXWSe%fv%00+h75aZi!}Y0s^MV8+uUM2hCmm@5O&O^=-rM%*Gf#4ljbljo zbZJ&^ZPQ&f&i|wYNIx}y+Ox889hjhSvgud#9y2-e&MncOXB@rbPNHG*1%y@AzMk65 z!(E_22C&R}QZF>ngmR=9o|G($eA_Sc{PMU!4j^ZzLa;!IvPmPWrPhvVJ7e(O4#@(w z3`votWkYfAg6u=bLjJ=SL@qs5tBJrxg?eim5`%%(9XC~xe<4r$bJe;zuh$O~m|l2K z1$r_NNrH5}Sl8Jtd{dYVyl9;|u8A@r7+#lQu>!;w7lw@*uy^vw1 zwoWSEbk011>)X|4$S~*$JsbLm8A>5)ZU2ikgRZpqW_V;s!e>dClKShijMI{UV~yMH z4rj-)KmYIjKS!kA^hW#?!SrAlA;__k=k}k6*825b69;c`D(~M3U{e*Rt0Y9U3s4;n z0~9G>PRs0q;}ZuSup}cD6KPwB0Sd##6)lJ)1g6r&Ev$BS=J4jBsN0OE9%K!FET zw&mMSLw{+^xXVvJN!j~dsK?Po%%FEH0%=6C@vX=wprBv;qt7;e&9KM<2nmt@N6wk< zBOiC+}c={B7N{g+pWqB`$Hm>f;NZM82OOI`G8{ zKLbd*4i&f#Y2PasKJP!d2xlci`G1_i%C8>}eth?(Lird6tZ3bH@Tz_@1?2!#`hlny z<}f{Y%;l)d<4^Sa@6|Ph#$gUvvNoWU+rcFgATOEE%O8H-ecC7qC~<(dn7tyr(Y!`i z82}duW8gvK&VwTMX8uz1MR?yn0>OtZ1hPk<4juOG^l$GOv^UkV1DPr33Mlat@A=zt z`y-;CJQ0Mk(rlr*#N=30#&%hsu_I4lp~MZst2Adcn3UGCWC#&Hd1UJNp?7&7xR+(*9wRYUoUn~FAAXN<8Gtic2fsX-;Rtk|Z$(velaA%xP6qJ(4PV5Vu zY$2K_MS%;le<-d#z)9u;j~#xn&l`Pr#lVacdqmFxK{(c+7VXDU*$I`5{ty1?qxz1k zw71MXLBk8a4b_KE@AHhfHsE-PBrk#FO>X_bW)H;kDGs7~L_+`fr|K%ED(Y(ECMy|G zpz}fxkB!QR-NJ)VHdWDBSnPZ_P9QSQ`y4PV`pertwOu2I;2V!>U1qTxNopd;%NzOL zbbHeqh6e&}M>rsN=)+%(Uk(ri0>Z4!f2Qets8Q=s3OQ%c)viwu|13}|V(Q5qCmzRj zRDPVcOM`&kENBOa*FumHMsBVkc~vHqx}cU}xBQS3jI!Ra z{`5xjhzlQqEp2>Ruiu$L1`hL;$~@klndXoaoS9-DJIm@LyHDVGf`w>Et6uk}%G==r z)gy$|!iQxqY~hTr+T3X5#qCE`^MPR<3-ClXnjlmVSNb-*H(Zfy5-@oA_#&6JhvR!p6F zJ!DpDSAkas7p&4)iEUa}o!OwgYZu%AnOzuyiV3(~Mw2Y@=@3gvqbHWyI)zOEG4VIyh_#ZJYL`him!&yxBx3@cYp@6Fnm<}El8~pkP5@E>hj|oK zV1kzn4s7ItDik3N;g}V_!v(DU1QcDs0jqaDJu%`9H_ON(ilf;@33po$>!bi=*}{3pey={pi*XkHtSy|> z^j{-eo!mT8>EjXyeEqa_sRz{_OMtZNW467EPW|3X0SLwjtQxoEn+HknV<&_j#9w|PaTn)0aMR_S6TC1jDcimh-=P0BGf*?b^C9Y^kGew2<;uI}&3Hie|P0bIqD3nOa zTDZLqm7nvIe`$In;haG62{u~wC{0G<$FWGT7dt86bGR|H`U-}I>5`?#Hh-A2d))d2 z(H=?u^mR#O4x`pQ{a4foSkd-bwd@80$J-(B2*aG|TVS<+nRn{P%>qkJun-h`iQADw;P%dFI09a;?Jn-s!0F4dTh>y~8VV=zo3ea=@*{){;)^4)Ss@*R)wW?uOB z;fcS*ki5t}DV&Vp6bS{f#g|U$vSI7;KjH)uoeh#xOIMl?XL6aF(QE#=D{+EwLkMm) z-dD9)#N1EXIQwdX*2r)$V^XnhR6F_=)tbJhX z*!su$ZO%)oC51Wd1c2cd%QCB6S$tq|weNrT{}X+XI5~^DgMARtqyMhfrp-RQ@lb6! z2Y6%*H%p_CESq5`h5uysL292_FKS#EDyaE%wdSQ-vOZd3{h01wx4I;EUvWI1iC6~j zD{j;Bo(HxlB2X3{kFn=0`mFCxLEM`>3Z@B#U!IFPfHLIWIcx5TQe~Kj51Hk|ljD-; z!!?R|6;dRq+gWpUK@64JGVD0O0;9vi5=Ss%&$X>|c~`wj&lxgd_OJL@8zx6BOdS*< zsFXuChTf8b;1anE7eikE%5az+Cv1?BMz$-!jjaccr5Sxi1STRN+Cr~Mp@NA17jzuL zwejZ``_i_W8rz-YP9vr~t1@Og~nl>|4gxMBT}U8J3TKwcvF)({ThK&tGQcw~cG~ zo+*3Uf(;NwdyKVn76x(8fRLKPhdVX=>b%-@7xj14Atof zfO!^fCr)xAIZ`XEDRJL&O*ok+j~uZ8abalaq3HI)01(Wa8Mt zz(+&$i$QD?g?$h$vB1@FcrV4}TTtc}dkNQl?M`O3;|G&*zWYS~vN8fEtLz{o`;~>Q z2wlO;aLRj~l$2sfd`1lkwoNDticP;?_xGxYRoYT?y5uZkhcv)ty2d^+Jbp(eK?w3) zA$#AgZxbS0NaJm1%J1XTdpqngA#k_%)8!ujg-b|~l7(-#J$==&j-`x3N^IAH-!ncR z_Uxeo_=f&eYnP0;wy(?|0SthsVk}BEl8BWwVHV%3Jm9Fgs?t(0{o-Ta_Kw=a)g$>H zApsVL_b+dKURP-m&-QlF*g5;xY%e&f2zk|OPAc=h#6aL1`nN>`bzk}aeLa0SRr#HPJ2|MZ)iS!q#}57!BREzfRS)7O;{ z9+B4?UC;u^tJDablS@1_Z5R0pw!$g;M;S6#1fx{}#2)1=0S}Km_rng^AOO9SlE>L-Z#v0w`sTvx=g$m>;wkI%OgZYl6E5S|Am1&PQGf-GWFrpSW6 za6(<~8{pLqZsRJFpgNTV+*SaoB6B&xXH-$EO94neYEz z_2L`aib@P-uc@_%%i9k7)#7`T4DuAGy!Xqy2N!nPs>eX*B`_c8C*#MdXM}+p2AjXeWqFCHrAo*FmRuKHd z3`jSJ$HH716pcfr>%vFjgW60ue}J%aHbyuFa-!<-5=jWiKQd`(Rt30=x%!F>alN}D zPXo_c1KQQ`VKR@(h5$Z_V?FlAe)xV4{fh$1alp>DE623lpqSb6YS@l-rTwD96h$R3 zCGDtaS)~7EszS<_liEJ_UWV4kp$}o!Zf@?r?2j`{XOhTIJi>moxIEc~U2x%(6IghE zV#zgK=QGN{3&#T$b`8I%?eHYe+$ArDW#s%W@!(-0k&Y@5oU15@c;>j%od%s^3KsqP z#pKc~8j_!f5GoS-*mhTI6T_~(EIC+-CMd7#;ypZjdWO&q9e;VUy2RzytYfTH@uGa> zP1nzzXn!_H{kJNXsk}tDZ|C@e^>4qUXoQjF9mhQr z2VdQcb3iI{)cH%x(ZA-K`1){ z$X22yIzATaj%b8I7)yNA-V@eh8j73Xd_k7*aO#5WHet=U0!j)8z!gxUFaK~S0CAKo z*-1zQvKq1rM?jT5n!kee>y5mr!jb%lyM>B!EUbijCNf`vcgGg01xg5g1<#Z}6@hY1 zJpZ*dZ2`2_2<{XBW#sTvDq3wdqF6(Apxa{^%BAlU** z*H*-}ZM-uV3TRg-D7Cp3Z-|(^$5th0E)~itOXHS_C)wd z5b5Lsq*7$~V+yibh%4!0;f0g-W>1{C26B0Gg`IlAxsf3bcEg0eW=^Rp%;ajA$SdxL zC!O55qE?792SU(qo36ikzj1^D_=yj6Tgbro<8LafET4tl`p1ae=R*~NDDAz1{X3WJ z?c}eJ5?ZDp;Z*jcn=FV#MautpADfO}t*4qcOleV00H*&sqx@HFIUqJ!`BGe2K^Qwl z7z69hPdOjsaJfqLgg0IjQFP*)OH54D?mPgbq-|zG1WwU|Q-uYh}06@;$h&W?#)|MK#F-kv*T?uDvGvn9_pz zBY1A}j#Xu;+Jyng)&I0yR%4Mr9Aeff0idlpX@=`n6`$LkjX_Jtoi=YVG%{3clKK z!d((}?<4>v|M_uey@wJYbDzk6DD-XYP)~MTg*#LtvtqilWgJ6mwR+tz}!r=cGjEj6SPfMG647kMbYs=@`*nmNjMJICsVPbZ2``tsOXcP_3UU{w>?b=&VSm!toi@4-&dfyc;JpvifO- z0f>ylox*GshC&@#>6f@RE^>l5&d{n#Jo)ti>zq(cE(`!4E-o86*?M}E;Pm8y69HIr zBumrGu1(RL8&1yb?s3T@suJsm8hxa=dMAGGOC~C(jq{(=?Ai{2MlKp5VF**9%Be7`A+CDXHA&cQ*~1BnY4!Crz=T?vLGsnss71ToBdd+){^Hs;~^CF{WG4X7%+F zEN(*l-B1K0(=*8J9eBI&RR#O^4I1}Tv0BnE_KGEuDFX|b%3_^PNMy+39H3X^g2bNf zj*21s1Y2-R4GT|VQMCLykP)YJLL)2HlD2RGVEwzI92!KulXDQCu<7BtIO!Z97>d{h z%|1iYJ8pmr6UPM)S13?N4|)xcn<#bIU66cGPz-Oi;1VC=W{JwBIwv#?*y9BsuoD1Q z5r5YUmo#7-raRb}(TB#|dv}Fx03tn#UFH;=08qdY2o@*l$Q>tK9S|GF1<8kZ6NSfB zaPvX3T*&1OFP9Z%em?1>gmAgOxVYA9dh%kqE-Z>cP7pC=O8IaXG|w3L@5B<&p)w>N zt_zAc_7W2LsjcP^4ROKp#bpEJMC@0Df%a^oV@Q|)S9%LrP{HcyFyiYHd)(59C zK?hrZSFsRcp>J5iPNE&J*V#}sojg%R=_m$*s|6|z zgmeF{T-UTxBZ^KuVRpQkiL3)5kblVPWb9G8C&M6L70buC?`A!F^>n5~$Wr5yHTkbv zyQf(--L(=5qp2Elz>Z5zYd&f9wIn5@YTIs!6w9qCf) zBx-Hm*spIE+rUgq`bmHCk;km-yIi-MpB3U-Gzw1W$xa4URxF#{Wnp%iTI+)D!;9|g zkKE&B+5c0yV57Tsr6$D z{WLIDSyF-+6)j;r6QfL2pXOh_J+w}~rR#czOg>1Q8*GbRHX^ouM+G2u`svrjeW zEP)mtg8lPb?JYfITm{juPdK99WX!Nc;Qq>V&CPEse%R4rza;D-_Wp)M&w-v1Qc@yD zf>&se>@Ck-*R8N*xQ!|l!xdY5hA!^z4h0r?`9oBUIEepb$L4c+|M_!qX^) zfHZxlOj!Ko9In{#P4Z&qx0wa;Jw2EcN+wxGVux4B3aYl;QXZ(EPhb@Y+ zDHFn60i_@FQR$v6pIr7RV@0f&m$;k|m5VJV%)9s<#p{06tUc=w{1r&v_%LRWTpcoA zwbluN{L?KC2yNYG=ku^;q9tAiB=6c2BN>rlQtn(yv1-}Y^QRi-Dhw4g9*0A{7A zwXOj7EZ(aV03wN0@FK-ki3t@(ioAaUFAAf>m2rDIY&C?$W$|PudKg-XI)xDcKwh$R zYC+DoP+uSK1e3T7akD?sT*eignuD%Kh;s`?6Lo_j3WLR_q363Aln&shXUcwdt>7(* zo%B8a{>JIClr-Tld423i(WW6EK37SA%)Q(7SF5tYHJK3vZb6N8l3hyga64b~-Zi>a z&kG5o7zL#0vz$%xfG;b0<$UpX!^6QXckfrWyR4|Z?)2uP9tYkCGTyyY?bb%|I-Rp+ zxH3HI{>E09NX1~`T_-cq|-@DV|!Otdi#`X3^b?2@iX;_ZQ_ z4LR<>63ZHQ{Y|kUJcN-oAZWX zvnR102!JUu$fVm}df3Zz9wUHsK83D;QePGZz-|W9%Igp$YF!u_2+K5cSHkjgyemMp zyf9MW+9)HkI`FKOL*@x@tH_xch|v_f+vzi`g$kN_G$6)(P4ewyc!yVmi}~MQ&P^^7 zhZ}&Ih8fhuU_!!$P$GwGjBNYeQe_(pEL?(1GN6=+z}tT%ti{CI)hTVTwojx1Rw+u1 zBZ7(4J;^Uy9{1hwVAe^7Mkee!AIu9Zq4a`kL>352WBDy7pGW} z;V>Pppz!X8m-k7|D7#HIFO^mp0NpD-FkU3JN_{9;*W2U z0O`*<0U&xvw z(jb@Vqh_!#g)#4f=O4zLP%LvON>Q72cB$OEc8a?(>0ziGoEw{Wyz1O^y{SslT?r^D ztSl!07Llz2EIy|z@=jRbKM(f(5D_grUVU|-q@-JXIQ{uCphU(e0G^C_KW-tPGI8z0 zO)P~gpr{mFj-!HVk0wrgI_zICcYG>wZay)X;^RL7kXhhPeZt0Mxodd$36+&(!6X-? za?vRIk_fd+_eC;!Zxu(8a&x<2qp%gZc7oNV!~Vp8N{a36)S3vYu){LnuN{D04wM!=2`rDEjfP|7$5r`s5Y0^(x-nV9d-`&daiV6>Hxi-3> z@4Hr#ri@(7c$-{hN!)Vz6;S*O z4j7nmqfEuN42_T~y^;g^weE@eJVyVbeS~np=l_gO>>8+aE;Cv=K&-JR$%$ggCPwD= zDvRqH0Fnn&=bu)d8=JG2@n9QO8AsRP$-TORf57%L&MK|90%1Wsr-7a!#768d|UpHT--uhWx zIZ4tri&&gq~q0wU86&pkLHk^UO;fppw>%xLfTm+Y^|E)Hm# zSF=_^(hvzKG2s&cX`s5ckQXsr0g_K$0rC!o69Ai=Fg>q-9*e4q4%U+sCO)i0Gv{F{ zW>r^6S{95EC)y+^L$MV$DobTVS@zZF808A>c>g@9Q7?1~s~RO$IQ^rizbM{f0CT>H zX%vGiayBBt=`~$>C~$E0oz?pN?0}21Uv1ugU+DKekKAz(A?G<@ca3|;CZDauhCr4| z?CM>A|In~^`dI}a#2x4j1gF^h zYf3;O_lw^)TtE1PQAg$_j|m7Di5CbYM^(JntblqIm#wcQha)$ZD?nzD_1akTVRxVF zvW4X5&e7krc{9i;0a6aQ0^}w0wo@D32#Oh_v=B1U34qjPc5e&?1Su-2i#j$0&&XsK zBzq(2g)NjsQ&=||oM_{msL3Uqm?=3?;ob6-cgrio((rB%$A*RtOc=}nh!6xO;hZ3k zCEW6A?xf}_$39e}bd&gi6AGD29I&s?jcJWv{7(T0NxI|t#*8&BKT`mLmA4I@HvZ4~ z(ggSFVGvEDK+3(>c#AdD z`p&Pv>!Q*^#KxvJzv*^%cyR`Rj0{8)6)bLA=uU3ckwyP$y;OO;w|unDYDczsD)QoR zR}qIzXhHKG$);3mbAK+fx_ny)NiBrFSsi(%!XU+^D1Da?@2iEQuKNrfB}Rb`5KcnU z9g)`97oE_BW1ezC^Msuf4&GG0M#${2eJ>urAL}sREN+Ra?5==%yysRIn|^iQf34^l z^}29{i$qV*t#ka%2@@Y$nrR%h)(HSh95)kDodwbA1WT@R2I_=`=EcO)xB^OxfTt@! zp4@N%QU2;#GEGFJobvxCOQGz58gvIR%ZduyzWn>okBMlU+>b8_+-qcGvsc?)4gq(+ z3hLGFA2%^irD@$59Ms?tk5k&&+pA21uBgDESIkhT4(XEEpC*p9W6PnUU+*o(kT68~ zDpvma(rGiFl#&1yi+7-2?ZXx$mgV&pWGh9II+P?MvpWvE>?l--1Y6|ekiwz7kM&PF z{?Vw&&yrNpqZ}|}QLj=*BYqL2yzsy?7z+fVa8q1Jq8XjHj0n$S(?eobbV8Dhq=*S8 zGdVZx&cCme-7d4##?GGBrA7TSl70_7+DsGME!GSf{2%i)q)nUATvxH^C3`InPahG+ zL#-XMba)he$=dSaZO<`kWUBt@a%Bf3zYI4l8zLy-h+nTmq!qyq zlP!<;=7fXM7OltuDJKuR5A|l=CE>hcj49PxL&M1j<_sDssQSidTN=T=BH7@*E%3U; zJS0x-H7Nf9*D3U9FPVnyvB8ivj+hbesNdbrmRYNqh{Ttaq6U{Ih5H9 zK=4LJHz}Ki`wE%WI5Z_)YHs==n~>~w{Y@|?f{K_TmckIh${8EMA50%X~) z<~913ZMUZ;>jT;~+HNwT05mxOvRc?=skKf>gyV#6`UudI55yH9&rDna#n@n7`hd(p z&cEGcM5+T0m>jl z|1P~lKm(BCg!fm4g^Z0vdLr|R_k(m>&-JUpR0~9ae-J8BpiDh74sb}*C_;w=agMop z-c+6YIS)w`F;WX5Nv^?>2beTn<*?Uh8|DU-t1VDHyC8*u#Fb&P2$i&?#p$c(^ItI( z3`N$-S(MdKJ+ksJ(KdjzZK&ae9lE0?m69B_V6d&7_4P@Cio+QMM3G-@qeT_SU#N#n zp=#|klljIy5z<6|ZV?F~5sbI}}?{Llg7XDIQ415P|@ zDizGg%c(mnKiV!Zed5S7#~2JQh0&Twyr&TzFR#r?-N(?-Q_({lFsS&K?!^u)7wvs< z7?WsBq9sB|ffkvomOF68KmFRRlLR~#Z~|EoLx1vXxl<7Ek}sD)iOA^~IN^AH)eS7l zMpR{(kqGJ-U9LkJYRjJ~VNbiSl0C?mKYBeX78as^Aps>B9ksUer0ZKWb9zaDyl&tG zKzF>vh*NH+6AosiL@cEPN9o*%@z>onlB&Ge>nBDg{BWdsY#T_6*|_Ha*4@>5kQyj<30h9moi*Qc{09{Q=_P= zF8Esdh`feXE)egq&>j>K=6YvKW^Md9^v1-*fj>}mvH?7r@Ub0w+JE8kr))_GK<1|$ zgo4EXWD8FrC-#-I_;;T@N&yJ@oqzhw!>NP*kFl=+uj<&sO-MrY#Bn z0wD>(B}Nh=CqxPE?(S~ECAe#mB85_{^tMo_K%u2*q3!!;&&=A{lbrY7_ua4egn!l= z*&}P#EO|zNqZFt&R$ej4>?bx5)ZtM_RK9-2(yb0>_+0|CwN$=$W<2KNFG!2bJXwkb z>l-$|(W6prUIV6EV1hLcX6Mo7&Q`LXTH|pkvG6S^Fj=&<;ncpQb_A_O+r)}^E%a<-J*429VU%Y(3A_DJWe zyM(ZY^HuZU#oo)jugR`BwC3p-L#KrEHsD*MXB0Y|>DKebwf|yB|IrESxlC(3`j>xN z?z_fcP(R3CtHG#B8Ovwr8d^tR(Ln>il+=hmh^Im9*|Jwk3HburKA$P0p$PlBa)Va^ zaw9VU_>3?^Kv*NTlOjz*VNC;9dc`#m1F+|MCx{P9FDdX%0f2vtf)tJkHY)exvvU5hWK*_PN?mZdcrlHWEk&wYe-DxSkKcs>%r{z}6K)8F3Uq8!Sx1R`*EgGw0D zN}{FNBt(tgw;Eke=gUqz&4vm3!^hlTo(UeW{lx&gastRJdj86KF}4h#hmGCu@5Qff zb(&MKo1W%nh~&&Ly)d|r?EI#YDJbL{SZ|3`+J4Tzt=3|G4k9$k#6KGTaWPS{^<#p5?N-^4bg;sZr3ced@Lt{WblSe?K+77y)#v8@GB%?Tz=2$x0#UG1p3_D9GoBoYnKG zcaOxKIl;SgDNL|d0aEO$fWENuvqGJ) zYJur8Le#;?KPG={RFwloDlq_%%y}Gjh#+_xG&W0LKE0zyGY7mb|BDVVo% z+HNcQd3^Z7<;1}BPPBIG(19Pmde@Wyl2Eq#1wXBtF9sEDZ7M*?yK?(9zCOA}Cb6Q2 z!VQ)pn;P}f*9?VjSYLEYR;wnRiGl(ut$H=->LtHkI?zP>X|gQwY~&KRosSqB2#TY) zAaH1j-8}+yiflnKKdt5K0Z%p);M`pRvm?uQ{{2fK?Sd8Qr>538e=PM8pV``1cq=GU z=0^-4GJ@Yvv3DV{LB^1TWNS2q#m=w(il}hz$hAS6s9p-E)}VN7-L!dnOI`St1$(su zknN`mQ1)>ZpeF+r@OUM5}eU8@4wZBAE=D5ZQmW~OnSTYP4! zrlyK4tR9@lT8J%Xu11l^4XoHFmb;Pw^o7+1QiS&6$~7FwF$jr5TB_=+N_}}H1@4bq zcG!=J(658E&7BL0AMo_)4ElET7JfY3>8}b)9uq)^%!;)WH~sjVzKm#xUS2+-`mkCp ziGt3H8AU=b{qNsE0>~7<^^|@`UbJ7x0mFHPAk)l-UJ5RTf@~v^N1+PPInumt@t)tT zKSOoWW^4eEng&TQ5U$3`4=t0W&YZj1lT+zp=oSTlTt${oDiP}=3UVcoXwqZ{kFnDve4F|G44`4Hn0Fd zE=L9c^#@s*jUcQZ*#tMXkttlfhU2ryjhrd2#cx3QHuD139Bl-r>#Y-8oZ951{iW?M zK?1mZFm2h+<_&cqSpa8i1pN}->#hz+Y3RV9egC|zUPlK~1;yS<*(U$P^>u)6vL?&= z%I|&|I(e23gbIpLb0cPMTy$RtWFl#qfjlaI(wAGGrUaK}R6GQ_}EY39_h{?CF zG!wwVNnbW?epnxT3N*WadzZ$J!Z4Vzay%#~ax?pOIU#gBS{>5_ur_8vhrxM0w7)c9 zz5v!V-qhYRnj~+}j!5>9#mv+Y-+>nL>b-&O(#uBZ)KYb@YGQa>mrHzEGq&zS1ly(I zl_!33mTv?&6n$aIg^V%@*wPaaK_{Q7=At!@V_&Uw)LAbQ92T^xHro78oDRqrz4<}C zNB(9N_j62_AlNj+gCpPLjG+Yk)NX?3oY|ib+un|Mon13Rtq3R2Ja~d2Sh5h@D2#n; zPP4be+MGVmt48CyS<~=vgLg93%-T>8v@Xj8huJeyhh`rVD-bdPPO=pCEEa~G6gfC2 z5rbOK)NUxuS}<8~nR%?~i=SHQ!|o*Y3X`{`K3Vqr&%A-4aNi;*#T^I7XtIdSNf_BtzlYT5U$Wzk7xe5Mju^Di6fIR@yqLI&`p(JbY z#==?nAjmUfOPIT{s5SACy0&yw3%egW#AWcR*tlJj4DtgQdGTEkPZpZK{7#d@FZ_74 z`=;Ttv2I#Emi(IVp(RcpDmzAu1gda)DykS9yL#Uby*5coKP{t;)JL=6zN96jBIZZS7jNY@ZQ42}!g#?GO=_#ku5*q&l&6d|em-2}+ANn3cd@%G)w0glyekLFM7jMF50&tn{!$P4DBf1;}tQm`MZJ z%bDE=NhnG&FU^RbDM8?@XC*y|p%fb#d5EciM`O{2{)0}pdG=dZ>YLN20_Zie&BWM= zHwkdzVm96Y_njM(@vIgHaKc9*WTJNTu&_0PSSeF1AUP8clWf9-MGlBfgom^)@3vX* z@$eS2{K(~X$5y#*zEH?i4+l-gR$Z%L6=-q`xK7~g6ZCR9-(>9=~7aZ zy&a`R2{5n9s*Cr+_G^E!jf&KgduF^^{najAD^7lryJq^m`K(h>ouaH@wR6$(Z^lmG zaxY^=Z;w0s9bI4Eb+Jw%Teh>~dCP}JT#98Bp4|nj?f&n4hJ5-NQF!v56e%u>RJ8xn zekcK?+1RkH+^nEr{??(fl3Vn;Y7;&>TedP$P&Df`H(EQz)UBoiQlMLT@NQ~j7qQ>4 zA(0XX@81%gqKWp?WSQ^v_4GQcbTOM^e$Sn^e#4afk{*|oAiR9|d-%}!*~E%GKj*}D z4o^DQQwQXAVffM0>4O{1SSbPAF71MVJMPtAOj{gzW;uH(rGq8O_YzmlwSNyN@NvbODgzH->m z(=MU{6qmUFjp&}&FYO@4NT8dLG8n4}D(8Hb9bqYlzH1Z3KMP|_cEt_v9&ulm$0rK| z=xtU7JV%Q@s(|Yu8-SgZ3=9<7cta-#bt6)Fr^KY`w;n?|w8c|?2o)&8&peYw0E4v_ zFhh?Zus25hh8V7)wpTYTu03;dzkJ~&j&nBp#YE3`&;0r5RgZ((Ul5}`J0?WOV~Dx6 zq5O8c%C`(yUR-<$HpIUQ>YY=fb0?SP5-S^G8nA73_JvFhY0lXKpa}F^I#rMA(B~5Z zC_MG%`CZq25~Z)FqEZ36`HQ&jRby%p1%;8xt+c)Be@VJVno@!?hvrcSS6J0AzZs0(Q4V<>QmLH2>l{9|x@txs8o${lZk~?l`@JQin0N zeADmVKj0gVMj=($qodaPAAdGTr}#$HF}UC9!6hrNB*2X;%S@Im?=B_IH=IQPxjDoZ zt&ucHsF+wC9#Sw4imzJT>4y}mL@WY*_wbYwSP74M=yS>K1S`cO!BK$XbIw=K3 zs_iyOv5*k;Cp|+cw9LD+=%flb{$&L8g&c@h!2BFOm}#&Ci?U|JQ%D2>*H>~KO~X(} z@2EwvJ9=mE=&5TmIe;xe2s#}TVv$@Y1$(_Hw?88M(uR8cBw<5HTfx3fRb3vm`9U)9 zg$+kK-hy$rghfgQgiKoXj;|a8z7uCV+Kluju`ItXOMA>-a7d-F<#Th=cZ>O6$*Lk- zjND<(-9o4E`Jn;pMB_GAHGS9GEaoY89bPqa#D^3vXW;q|S*=?nZls2`LW)5VAH8x6NQ*SImIfhfEB=jgl*FNVvq z-mOy;qFLlDTn@NnBI}sRvb_GuBUK;Xk;RZ=6oEo;z_!A@D1q`MElb>8q*7uFS;|}L zU>G-6v8Z#t%d#bJ{}huJ7d2cgp#O-D7oh`U^W}=1vnM&}$;7>!BkQAF5wrTXXz_iy z#{`hA&WyO=&fCBKKmffEj2$*G0XV@k=+ScY>n=Ou z+Ucqbk8Ps)!}C6#vH8+%y#~3d7y!)C&dfkd3$rC+joM&9#wJ4+KHjkCSAIq^pxG9ku@ndm0E~58XW?$fE~s+e zf7bVP|K(AxvQJ(CDbO=%O$<>cI^ z<*gKTXF2*8HV!xqQ*G$sl*@q1}s4$`oyk6+dwBJQ3L^`{@Bv z$d-cvJc|^RUCSJfOEL~cY>{1!vccI! z3YP{3tV8@rQ>w(G=Yc=a_uxpR^B{vUm7a1cs{qB_EC5ImO#p+nCbLV01qN%(-yex| zptQplrX_Vx=fAX4{~uHHn`ggV&WY3IZO1>vkeqqm<3s8B{@Pz`KGAc`>F!J7??=BT zfacSwXCro<>gY%S&8J;&E_tSwK0$yTpQSjEzyCgA*V1SLJX>i$O_pJID$aY;nJ;0( zWKMfLd0?`)E{>9<7BQ_u*=p?%5G$whf>o$F`&#dnLeGqT`0Nls;Oq^9rY!U!3Xh%w zXprHs=ka*HvETr6jezkrJ}dc6E4VxJE;V;$aq;DjYbe2H&9uT<`)ei%aV+jW^JUON zbIT3101y5tV2F^vdF;bHDU3M)vc6C$?Bw340$$r~uqt}d2= zOexHR!JxO&v<&R1V3U?dpBKDO_l%motf_p3W2s#&|S@Q|LhqiyeHm8(+w{cr7fCGW$?l0X~lk>&-3Nz>oo?=22 z*imWJy*o?eWr5-yAqzq2n+{P+i;iyA#A;D^qi5LiHRZ?1!fv8S>o_jQ!)tc@)VFW0 ziJcH$su7Wh%Z|8ONau;|G6oS8n1Y%m9TOa9Evq(SZYOc^XTCTPEbxGZle-&Ywx)_w zGnWjl^h=izUN45tl@FB3q5|ZCHLdT}L5T;bA*B#9fkhsVtPPg|^o_NGgiz9eF&;wJ>1yM@(kQ*HT>#y%d@ar3!Dy~vw%DUw5eYpNd)Kqsl zqcdx_Xfo`Pegsnni1eB9eOoL(M--F+V$h#+#@huilC3d`01Ac{r-mKba>{<7EaR_# zAzo~N{xOpiFRynVm@SKX%7|BnZ`pIq<1Y1n>_&}o=T`uPZF8UTw8_p@lG-m6miu@O zQK&PrSEk3(mr}{;VM+x|BMalpmaT7L z0G3xf+ycx2u&c}{tNO^dvO1ZIsgU0{kRIl61VzLnYAh4h3ARz>zC*WC)9)rdQ=Z17` zyk3@rS0;ux0U{Ve1@LudvWyy2rCy-RVqS(#&b!)AlV#-kd8waJ9#4T zo_JZoNhthuv7?8jS`l+s6zlb3-6-qD*_;*Xpcjph506I${k22~>I#asj$U@Xy+7vw zrh&MtBiI!N7`e+*3M&WBKEDW{Y1uV){nI9K1_0Gov{YX|@*XBz-Teo$Fa&>;b^Tcs~@WBA74KF`dKbu&qgH5X`@^NYc5 zA5?Usyqi@uDyu5LW3l~-#P*ZRkDQs1^_Rwn0VJItJ9%_gzw=%kD5eWJY}EB7o*lyF1p}VRsl$Bqyo-TX`=#U4y*zsXczz{ ztg(mT|Q61?&RKT}}u^sw( z-VB?XwoLdfgI_tc!uo1ys_EUEYX7RueGkEHZyBF%)4y!M0d@glt_;{mGNW1CXxb-s zH!c2KkKC__o;IoNO(!im_*t%`XCe2sqzf>_)urUkX|+=#qxs@twbT2}CcB6Ik5}U7 z3#M=xJqjk#^J2s0gTO)j)$tF}2cxgGVVEb7iK6vmiR%X{APoB7{5S;8MTY-rELh#=!fwk{DY z?zMKm_0s{oD4Ig2_@ZC`>UO_(kmTV8zXu6c4Q|vf^o*x#$?W)VQkdvCtkC@;@cc+g`2!T z47q--ii5OUfYFMf71?mtipq>m)DK;yxN)uovSf4A=o}BvjYqm%rbd$#p4~dQdd7VV z0p3?dZ!$+r-BLS#x9p7`Ju4_PBT4@T>H9C%di1g~(RsA4J zZdL(jd72mioCSt~z!%AY>j#BTwgm0@abLnws@GS}F9U#0n&nH)hJG3EhWYcj8H!7Z}XvZy4yYA4O(rTB`qR{l4<#Hqe7HIlQTW z+jH?XRlx3wEuc^eobIiJ(%0M$x@?+02EN$RTCrTiY-eSsIg_FB3@5*xD65I2Z}E%? z@tM6Znfd>lwGhHutMp@5_3@_VdawSA5`FILTOPTw?VEY8!sj*G(Kq+X5gpC@--r&= z{?#Q(3YD_!l8>cs+HIn+>m?{Q1)g?mxtojNYsicOroFrL&)Y6gl49LkGUle!{4uo&7H%C!7fI>Mww4yZm0fsXc`N zGRYcRXT;8SL;v9bEHp)Qn|#{j!FFrT&hMsoh%&--$QwASZDW2+v7S2dYcql&D1hq& z(Fy~=Y=_gKw1ycf6EOlokZ(X#3eHxXp9m11iM^77NT>y&foJh&p>}}NyO!`$RAnfLs%Upp z0dkmA0di_o0q4<$)qzhKj!->NjzmS#dQ(Zobp@}8`8$l}IXpD-)WzFRF&z3W&_>eD zVw!v_6eD0qYJoGmyH&eCdz{9cO%=Mkp1M2kd)E~v9pH*9WPRVU>WjsJr3j!!aUgi< z+t(xiCV;#_^CpciT|CiS2lzTSS$3Vdkb8T$t{tYxqT6mY`Qgmjendfwd&`LZ->*ED zuT@R7GA7HWYbpB||9gWd=;O@!$o{9DS^N}a9kd%JD570fz0X`Sk|?~m6agD}1+bG_ zPS^KSJL;;iW2xt~(_j4T{eWj3#fFY&Nch^OXC_+BU6bJvmJKVNHkom_ z&_GSdYBX84hjr>1?wRk+u(|-|O(@c&;z#?i)r@f`B-Tx94k*0frA0OMy z0dy2e+n7fW+v7A_p8?2RBdhIL{Q6Yyf36S{nt>`%lq*I}mgdPVN}S&$lp*j84@Zzf z1h7eBG4K%#AtgN?*=lIv8%ndDUJ{Kg08A?kU^h|bV+U;&*azWImYQ*u-j$20)IR-N zH-Z#^6B|ji@$r~tn)rD7SN>T0${*7pxN^DDWI1$ajQzN!c?6L0!G6<+P5a1cA{WMwj&gwGxnjfib{a6wa^8h&f^0Nnlx#cX*Tb}x9OaHHlMbSor z#g1cs9e-%1U!O^#lKc6xIn@*S$gs6fF5;V#k`G;cRnK-k2R%Zt-_b_{3&C^Lry$ja^lx#(}A#IRMDvPz5Mo>6j^V z`ae$)HwNqpw+woylgzgxxBh1N0vk5HFMMFtc@BWi$mjS>qL6boV zFr+9diiS4nIH-XSC)9TAIfVh3yulDoHLX3e{y_UDN(B|`-TKDgeYC&W2jNx~&|~4* zEWw(JB}n_CQq)_^NEw*{U4r3V%uo!SB5Pn3u;*G;lSKt+-&X-Qewq}daCIoWJ8pRF zM+OVFmlRe2t#gPd48TCNgDVr{cjyhZEdzQZlA6?JIY`BV3izEXj5%txGaCVYn`wwI zrDZI_K9ihkPC*1Vt*E}uG|;x02HL-}5AGwk_`H|TQg&>sL;xKkd+OLV_~)%Z2hcV7 zlvaq}&+e%crX3qKQ|B>3`-#A(@5AfttMz~YvXtH0F!rTm_6-7jnhJ_dvC~{8Zr(!x zrJ~vxxu9Of@>>Y-=_)8TtXO{e<}3bh~mCsMCCBR2czC}syUruQ#Rx2CMaiY@s4?eCjEn+;UfE5AHYa;b#h2-Hd5HL<{ z1gF^{q2HbEughm{X9X~;V;{#p-|!j8I_%5$SXdOyJ5w*BtlnBOft)hx_3NJfxrn8G z{Pu#?PPyn>mzTG#nNI z+lPATMPSI1S1)2F`4QmEMG=!_@Lacm#i@KjV9WArJ(!7L(C-(R4Ovsm&$`l$bfdno zppIkq7A)~;TEYN5IZejc`ad{W{zrAW{UZ94HneTsrd4&p#%X{6Qqy~lNcK8P6h6HR z1JF9$KojLq8Am*3f4$o!X40}Wg~q}#DGdQ9qLAZBaO=OZN7m@RFZ5~_+5kwf>QUFR z`nP>n69rw!RKST3t;y2GtLuQ=e|Y<~Z`M-Op#l^oMFq&h)&St9MFSodiP(_&Y;+9; z@zwoGi#h}T7u@E3vwFPwcmfa3%%{IJfS@9078USnP#8N<*mD)5$zq^@d4cAX+BqdX zDH18<<=Qb60=4O`4Yu?msZu!CH&QV5kN;rEyIJCTE$m#SKcZGz-|N*-@pRujGcq^G zsd;OyIQwR#R6LVeEF#9tYh?iK)2B}cuH5wr7kn5%7ty1qs+PXDKo=D4ktD zl;XN^tqyt6>^aqC;EXbQrSq|RbDN1_$$qx&T=}_+ z2%y_z`kO|sd$z72fP((UCQf~qF<93!ktbZ#xmjP=ZuqfIA*XTAca7|ucRj=byj;sj znTXm-5ska!jMUlO0F`G*mvdHuH@Sxv64@uOHixe`#I{qeKp`yZlREiJuyy z19HpWx#`DR&E5$`JQ|81kGKf3PXqBfj)$E^B;a(75)#j}!|U!{Jx+Y+nQ=?T(wsN1 z^pnz+i%TX;?w5Ig25f!IDRAf1o+h-T5*9NMSOnwTIVH_C9^NI!v_x~Y9_fdTCl|}{ z9Qgk4wc~a^AqvWizUt$N{i;tpOf`l;7rqRFy&q1G2k z?}rG?DJ&F#mSK_I_bKVZ>@~H~Y_SgDY#qqLrofN}BM-I1?8bjR|7`|8P*?>H76Hua zKWfX&ga^C=02F9;k^=b1)jGcDo+TCUd?cI15(z_3u35Z`0PBKv+M-K`f{(nH1&g<3 z?@{uk)v|CSzW0OS%94`ur$l@0~ zyo(LuOhG{|0?oAvtV^LqLIs5ic*@FEz)RLq0PwfPs=p0@L|~N_x!0-yWjjy-dw%JL zc7%6OzqT~Mk(P|7#!NF_{L?e6EE05jp^qBPwe5nd{Mb|>8{<>&t;-UB$fnV>dnG!Q z7Zc>O>&|u^;BuPDlGoa4O6RL}b>OU^*!_F|gQa>MBfzvl0BgPue322Vzs33RHH8({ zKcnxZQGC5;OEx>2 z>PTuNgVX~3tBL7nSNzyx_DTK;S(i;xf>i-udA*$$e`4RssU(~EghnPYZCwVld(jMJ zMf1nc{i0N7%TU<>xc{+oh7naWH*17c$77*R_3g(b%(Wz=R4{$`k6TJwcJ8a{OM zn}a`3mHhlPcSR-~nCbCe!%UW;6R(e6Y+1!iqDe*M7t5LZxBK9Qdx-^7DkHEP_9LXe z#`{ISJeb+5KAPX{IiFrQ|9qIEC|<8M{hjt!Evm}g+P*@Qwm(RY$ZLtqffl2H{UV1N zLou|7^0lNNNX;$2lCL2)dcG|LV->LDClMm>oLN-=)mwL7BkP>pwXCa0=4@WYH)u53 zGXxuLHgvUy;Z_SV^A6@33f&M4BSqaxA)nyL!3e2~gtY-l83`Gg6x1y7;FakKAp>RS zT`+}Hq2-JdY!n#ET^_h6h#6tl?#ge$*toBkTV2hLi#%)yd`b!W=--m^9`8KC*#n@s zrUd}L9hofsiyS_`zCT|G7y>VzJ~s+83W@7Unby5=u>rIJAfD6^UY zz%+qrFXHftH^zKfph5=h`JwfgQB);83KamjaEll~3I(N5R{{4)Vz^YG2!BK^$jW)S z4GQvES6NZ8j(|GryvCp1!uz2;rE^>4F7UO+@y`wL1$RSPd_KA~sDR_1!YFX7?3#ig z)LcZwRWN_mY&QH|7!?4A{)GYfIDs%~Nr&+ub4A7@0|`wkXZN{Yrl4nwLU*%2xgaFFLc#f9Xq&^1N+*{E3)8zmx+f&(&BEffF>h9h?vF`z2d813T2?WiQ581?Vx=0N_1>Z4Ee*^ZNuDim;C+4=n+( zyIyfO+*dNw1E4@3Ip{X0@uRR2>5PuLv8Qbqdc;K-bKGRe>T zs#lxuymV=Yu1z~0#VnnBP;B;Wa6c2B-q!QKUwS0prV5MI7QmL#ABMN-R8o)d-JNI|h-Q`oqMrQZ=yjB|y>=j#`rdps{e0LiIqM!DZ; z@3)Nr*8st4jqAm?Fnqs@3=Zag_$YNaugE?M# z%RMVjC(gyVpo;5NrTRaQo3mGPc5MfH>@;f>nR?Bb*Z1v%$8Hk$4#B+^_duo+&7W{& z+TmW)uS&y0RQ_jw8sanX;5 zCrE}B?j<%#`-+4i>`t5=ADeGD#*XNam0I;z>b3u9?I)bxW}iRtc##hQzEcVVFz4a$ z!;*fc#%5FPBNt6LB^$}|xxj*_sI+sn-&J{`xjaY>&qsIclRJMi<1m2#``Yar9!Kw*%^O#gI0si@mWvU}&Qki2k7NQ7-L?07P9 zZbey2E!Dr zMJeSPkc>k+pX*@6uYDGnyB?NpH?@TwIJ0*MVbLB$yA5U7Aa*Vc!19NoJ_4vhG)PCz zaF&)*leB)AR0eGyl zQ5(H%vZXwg^LS+HOr$d`w8hn$4QV!EjI z31k4xloQXl+Pue8ned&_57H*uLE1#)!43dBehD^N_W%6J(aJ}^B*67gQP0jt&b4!c zZW2I8?+)jn_!UJu5J391ZQ&t($~5yLptzKFw+#IEk7^}#T_BCh#w&-ich?OeiekOA zpC-$OS1tei<5B|-KyM1+2)Ya{Vjgs-osm%^F2CKz+7Bg`UwZl#@$r;W^V*6lO1e$j zp#yzH1*^Y{yBeQ1mVjcdBv9m8`;DG_u-QPl@{S^YSWapY*FVyUf>fw0J@#0tx6mb5 z&l!T%@*XD|Y{=qTZtc)*D1dqP6EnJ1)5T5C5dxT7&Gc;knTu2h=>z8+?oxBFuh=Ef zDnI_yWSRbT@3qTUr4U82?t<0SR)4?^tvCS`gK^^jT;GR1q$9*9Fft`EEi*O4%#xI_ zJj{Z@gj&U)e_ci&2#PDH0;HQ9AG&;?*M7dWV59bBL07bJR9K5}?b4k)$FAJmciM9k zwatg0G|+YQ+>taPhRaFp%1h2F;ql1Umn2%274U8Qf8DQea_o9vq-Y_CFfqbdI?QbT zjZBt|84p_w4Vov*mD0-G8gM8tZ z@b(NHhhU}@gZJ5xL~ClKVow`$DDuV4%0gtu93uHd1?Y^93?F*$>Ri4dun!u5p28-@ z+NvGZ&-YUTsZ!4}g0~7dOPSpOK)4g#F}R;9Wqh?| zhKD)0GP8KhEDdp&ec&sCncm zdv!?ToBtH;M*vwxeL4H#`Pnh;z-AR6p53eGZX<4paQ{}5C=g;^gpj#rwKpxiPHYU{^@~q(Mj5~yk2C- z+lqI7xhhUPw9Hu^h1*^wl-*lNY=1ZkLvVIP;|#>ZK8sl-YS?0W;y!TX7rX{GIeF7e zmd(|x><^pBcSbgA?d=6c0ic%vHV(OS*mI31u_8m4jV{@<9jfT(hVLUmvEgc)q5s6s z+m=>{g=AE z*T+lVCOLFk-v#mV_a8Nl|MfHC>hC0grNnVqf7VvE%&I4&Oh#oX8a;`s;dqE}b9)h?$;3I;$%^sgS~f(~6Hz^}`^tO<7tYBx0GD+F=u~vJ^;)LBhm#a#$yn6;lzm6pWcD}zczvtS*HoKGy}6B)uBziWTC zYAkCUt^6k{71#hSZTo=H;ZQY&@3;0CxEvCI|3P0)qEp&{&>8}1G?3uY` zb6%FU`i)?+DtY*)|9is!!iMb!=g>r`j|zE7UU=a}v*zE6yAD|R@$ZXuHt$Q9IvEp* zw~60BOqS8T%J<8xs$Y7X7l}%TPki=s{Vs<&1ye2J1Y`L;m}O?+Mf|Xtq_U8?Ox@ZR zR;2?dXu#0R-@IJ8skLNg;><)p1h*l6hl_apdzF`A-T&SO;4C+ft^+-%@Ap@ofSELhNl{E_2Z#JvAu=mwza_JRzn$df)el<00=LUm+nw8Jjt3Yg04^jV}X%RDqx7DQ!yV3%< z{P&KSlKIYEJ1IBhZJ0E$V;yg;7+YVI8*f+5O)1@PF4X}pjw7eT>oMIzzT2e(l|&tD zS9foK{}Di*6yxV6?b$VjFI-lKyPSVLu5B%a|8WXveGr`)!TR9<1``yh^Kw{{L8zAH zs%RZ(U3TG3WvamUxv1FyVE%N#KBlJlXxw`7$Q?y~m38?WoWYRPBcI~XP?U{HjHpKi z=;_P=-~+bC-99@W&m+(SSgrblg`pfclkutwP+kKSAlo1nDB9IVBa2tH0eCpu09?3; zXR?Son6z9H^U`YoHmV^xW~OUp{;e8$5$(S$zEOcJd{XGXne+bfnl{t5g4!NFTvYtc z`Elc;m-2m41EidAsK%Qcsb~2azyQZ@1jYUzW*l3+TZoAO$mwh2fc3p|Z*wt)QIN;k zG{=MYMhteL%IP7$^P07l&!&*XS)vsLBm}*|-V+az0(pM0QFV-zx1@USmVNrkvA)E{ zTh3t>aGxrgY5*{~10&&tRtrK}Y&NqG0{4KlINhsKDel>gMN80B#!S0k7*F()^3W^P zK5fL!gNcRErO_s6Cow9TxWI0*9P|k| zQZME`0c4+;_rIN0TP_JBz(F448=vl-KcNKgwALz%Rt9Qdzsk3Q9g7i#J(r42mW5^d zxK?m*Bfue1P;{&lxn*GaO*+7ZeW+s;py+5p(R}>Vf!11`h{A)Prm%rj0J~#0D9F`T zrErudfB^K*RRan>LVzsY4+Fs_ZI8hjR61Kf+FpNcaylcvpImB8&>4(DyY4C<=1%j z+Vi2^np^rdLW!_C_J8%_-%tM_&XiBE`JrFi=KUvbF6b6Tb}#^ti&)Uk0Z`+4 zCX~^EjRH72Z*20INBRZD?yvw3o_aT@l;7_<#a02#&-3hY@W;(M&`bcq2kVmfyP@t2x-=A0%k~okk{Pu`CRKV9k0H4|)o!dWk5~pB+DiHn@ zn)nbayK+)a~FY531 zu=XI0kG8qUg@3rri}_#8fHUh!x+BNGQdv?z8iZUTQ&SWzm03GxI}BR zr~vsYEoj{$&$6`p{I7#S?Y znVDK;qd64O$iM^bBs)kID1OietD^O70Io%C08S5W0G?h(KtDpNV5BpnM6@cF`T+M| zt*pKQwAbVjzU{D2ON#xw*2YKM|HqF(1{9TI$NrR;siW$L_hoE&`JKN7&2j5D6iD#Q`syiEW+Zt5})Fo_~EM~l$N zl6j^k;g}WW=G}Lz((SdrL|k7AU`D$0PtS`ba|Wo=@qqxQ-oEg%fBDG-xO3scWSLTS zRc=IOQ6(ryMxU^*lV4!HlRCu_!D`$umCrYAe1iiR_8@j&V3&m;#92%tW2Vv8>-8%K zz9V{%yMlhy?4#3Gw&CA}4Y&750gR06a;4!Mu7JdFyK9+%bC4}6GPST0AT26S=%LU4 zYieHcIaTIB``fAja^>w*dJkU-XGjntH{-*r}Y7?GHc$90n@5?~{7D{GgJP4gUC- zryCcGWzB%Kfav@Hz4BI%rhyl4o)i{3+b9VZ1W17qwkp*U4EVIG%o zNW_9!i^tC^GCET4hGrXck2TFp!{!r8?N4 zC|aX10FxSuVy2|4S|IhF%G!NJVI0`}+h+ry06{7%kEMlCV69_rA!8|2n9SaoWm+w) z9Q(G5Yydv|Rixk`yEL#t;nJ!wfNA2Pfkv`EL#BGQBcz5^0r%B~ab+!+vbIX$?NJy- zhMfzdYB9fdW%jV!L#dwleu^#>ww&BmJc~KvB6Yt4&XHV0uLndn&)I%W&&*7%n^|0*%vZdmJDqD z&z6fJ#KY;P02Um1c--Zo0|7LV7gYGy_4gxOZf9djuf}t|Mvsbp&sPZgS+YlDc3d*T zq+=tEU`q1N19&P7QNfHeEyhl$#&1`QPsw2dm_8-FROfpKc+F^iAo6U&Kq4NIu@HQc zYy3sg$@jhQZhgtmS;m8&wk9SFDcZ7UQ_cebZB-NMZeQkRDo+3zm~O@ z!P%M|%W~OQtdesvU^P+vd)QiZ93wrBI=3 zX&Zo@l)qI9m(DgQ?C;qCoC0kCj#4Ny)PaxJ8Vbx9=8h$^tJ+{-H`4|{qL_g*`b#!R zD&QzTi3*Ue$^hUbi-1&#^ff^VY0+eUX()s0DD;gAIF7KmC*lO@}!QSzzV)vUk(yCv}&%)>xrLG5Hypu*vR( zZSqCo+&j8)^6R@|*FgS*h{&Xv%*0yeFJfaMK@~=^z1+sL!E1X+?xr^E5itQzh@rX@ zYwp(r{7SatBcz=ia+z;>w7Sx1nIRKjF^po=3J0#mFj*GVsPoy1j}~wWs6xY$#~5$mEMz*HJ&@!x z@?A0wrNPE)yGCfT%qkkS`S{Ail8rM`IOAB7-+0pY<#+F{7i_Si^FOOc*A+X&%QeQEWdTMscI~+#V6fcl4294T6158ed<>Db zJU?4dkRUS1`smGqwg2gTlDEc~O2gj$3s(2o~objX9vK!GcKM+88JdrSo0A`lxut|3Dyw8Zg)jkZ&)d_lqP zDW#`i`{EB{k%*6OPUCX6zJZs~Ht;eUOSVFb$O(0A%)w8b(xNzk$j+T$sAo;K#zsj& z=Jfj^1F8n*d!lv}?K+h6VClmD_)2Fi?S2)&!MxdJvsYfFy6nyiV7Ixo*TFBsIl%6s zOnAaEfYURBrNEFgW$pCN&U@>;AqGWy2?on<l-F1{zpwc6SMExr@RhkW^GNw?k(={teYlF%p0#Vsgrbd zo>QKvt^eI!7f=6KlhdLs9r-&T1ij@ z7LSX1vsE7)d%2mY0GU3hfXnALSUJD60gy^xWkojlD&XAL1}g_XFH9Ddg3L!%fbR1G z&_$R^5GSC_fTEp3N))Qsuc=Lb{j-qs;f<#0d%oG5l_HsXE*D6R{tk{w7P#<0_*zZn#MRsoGS)(?ctRz&`(M>%3SdV1|^* zJ#zEAyQVtKbcpcNN5iwcATcRKT~SjXF$!76w40$Diq>NFJV< zF85HCHHD^D0aw1h3XWYVu9ztZ_{-@pSg~Wf406wUeX2fWvcBOJQ|l#sHp3fMQdL18C9ZvhH9W-36TT~xsBk&QY`az|1rD0;5| z25Su1Ex#hftb7xU`}Aw5KE>4Ikt~i5)=zI{-+qi%oPB=EA&_^Vo8Py4xJ07O3wieB zb^Iwca4(nG8Q}I>bY;)tYi=D)Q#mWNNhVg+6pJu^kO#}2&^m2@jro|WboCMpcC4Q@ zuU_-6I>40?h;nNF;n;z8Cv?D9P#6H*d=Xxgr3Dgd2i1{yOM3Bo@gcoA8=Mnu(WXSM zc0k^cIBO2wW7Zvh@}^pfepEZlmMmNJrQL#Lz7w*}7x_!HWZ}%Xt{cXEL`|f`O|xz{ zFFRljKTdFUb>*RCky1hsPAhTCwWMnuB6J@mfRVHOTDHE`g#b!LZoLqh89B#=1GtHG z#Ia+=v#pk(F+)%%c5dCd@%vn&cCK3(z_d9$1`o`EB?8*33d5;(~TR2$)oti|A~G=|Nis z9IJ>f_{OtQc}DH>rbN_s5Utnxwx)WMmE=nn8LfgQT@P9Di&mVCFa?J@8D0Oz&?EeS z)c`4-AL-GmXM=To_ho=57hYisUUAQ!uMc|@EAo0!0s9N$o9v&M*nibI{#49Zkt;#& z;r}M}+@h~6GKO7NDsOxPug+8l<$jqpaHeI@ldS}J6ccq!+SsLGRtvtRvO35Pe^k!c z-(1%7(~tr5LKL>T!lN5ExlVuqbQ4qo(jFNA1fWACVwRdHoH-Q1SJSNJAZEF9MVne_ zt>rUQ>$g0U4FFDtP?qH-J$3*>4;hR#4CTBs&@Q0}u(qSEr)$^y(rYoWBv znf#OJ3&pnObgRb+&-YZ+D$%~#VNu`JnBdKh;T}3LQvg?Tb6+kSv55eeWdhjq>Re8K_{b7KjYWbmA+;{1CYWzWMCJD|O9sGB;Wl zUFB^*eRVs}7mZc{3L&8a&hpNp0!}+@uqwml2a`pmpkNs)K<}I?;3CB^0kDm>Y!b9A z(gZ?UPMf2o!d9O~H8d@Y-gml?eC>0oeA$o1WdY3a1cEp>$q2gy!``q&MAAceY0v~0P2F{<@P4Ygt#a92<)>$zop`5i|Hp!g(9 zzZrS%@2dJeh;FqD7F;Mb?d}YnLT>Z3d-x_*m|mU$M=w#wPnom0Z_y(16MTA-ce8lrhW70_04stmbKc74VZArV5aT&H&)B&YzNvr6l4K1eCi6|k8ML5|ggSQ)I2|HXG>eP{Ye+nMzH7YQ*pKCe0TbQJQ$_0O7^_F%2p3>KxNe=SSvBwwg{z8a|P~IR$7+i?8$42&=AzFH%;-9`&MGIHa1|gcp3Dj*(;D|}MXdbK2v%uhr%(7{9e?;_ ztQ`4HXR@e32?s$D8+m8)u|KX7D>{P=07f)87G{YoHCjX@BuRO&8cLx;vOMYfbFTx} zis{0<#|KfN3b=H)0gx%NN;*{-VD=O(?963Q&N56>wP~DmMUZ{vhZAE|$zl z4zfgIVWrSpGKDpe190cZo5`XA4pLfD0dk2k0Em4OitzQ2+o2u_jUAZD?4|N~^cf1H zUNS3D0dlJqfF?n_hV~^P1z{za+b&)gqpaouk;yQv69xqON^PmF)Rx*Xuz6MHwiuE9 z^&QG}td>WBqn!ZuZFq4vch4XWXafqd7f;G8d=l29D7B+bi$89R(C=v^o2=?uyV|u* zeACqyQYNC=z_QRB#6Ep0!flIU^Dh@G`#ik?FNPW&f6Kl*B)k9WQ`6KPPxT=vI-} z2B7Fg3Do}Ay`Q%(9hK#>Iifyi%yqtZK`2@9ZAhvxG|fy$N{e>QD0{bmF3-64Qc{%!N3dhuPA zQ8+yn!0^C_J@+pito_9RM>hcs>C>d+=8^mg2bCeBGsa<;#7>EjH<@Yj4aiW6@l7a< zobiO~f4GLjRWU{CfuJr{) z_XzjgW=~FOe`ynCiVc8nAO$GAY*0{s#r7liJ@9z_f$AW|whGX7R|QBi1p1_$WR{wNgr?@02RvxLi{+ovSc}U5cme+CI zFrp0?{54im6kNJ~TFc?TJt9_=bY;HXt$SbZ;fDmHAZ6Oz_w@sZedI_KdP1k?KYLyK zU?G5%X|t34gQ_&}B%lc2zu|d2qq3t!yX3FyO<7%I&iBV}h(ZRlu2_!gzgFC`f`-0oOS;>ac%l11L7l20+4^T8CFT z8x-UWXQ0TibJBw3+aRKi%s_Ta^fq^WH~Y8tG`FO4AuB(YhtA6%Ym8ytk^$;ONXqXc(e8oK=Z|UE0D*q zndtkORVzRI8O3)J_NhFjXtd?X^6LwJdP&5t$*q(^J=cQij*5X5z1*u;Jol6>K6 zfD5yhsF6=llVy4D$USB_MX-Ld8a(1f)l1VYPF<4ueGCovZVQKWD{f&dKi&{ME8CK5 z4YE8E_32J|v=;sBeZG0@49*ybaN8Uf7TEYCJb(YU?|CPVlks)IwIrGVDb$hj85si}er}q}}Jv#mv(08x+@c zT9rkULne#sE`)huy~=JfJf^A`mnlDt9(Zm%-v+b+>r)tjixghLt;v}w2pLQXOC~QF z*zxnxUr@I^p9oq5fWZz(MUE2O$O99!fP3fG~luWC6HIAiS32y&N{ zgdhj7o@3_HFclXSjXz)cj}@6~sRbT&1Tb!l>AL@*lR7X<0Ha_1Z@yi^djg#QD-1xJ z(N>m8E85&O6;C~MMIUh^YRBy}`i4($w8PpqOgnRA12J~xlMuF!hl@7anfD_HFpy!< znJi2z-m7tI<6luJg2Y-dJAvOKGLkT_m%>ZAhb8i4ZLMRIM2YM=x85$>#&2Di!ShsRr4qH=Q(zAnNyNLf}X<`tHh!}E-VM6zJJqL!G4Kh7BB zF_voa{L%*CAm@aE0(S20GGP`Kmv25B3ZUVohZn{Yiy!hDUcV5Y0nb<&qD=oiWEkH z(P|S37d<4u$wbZx`fMsSU7Q3U&r`2-Z7mJROkojIML;B86Z4L%r)e$g(YGY+;^}K~ ztu77Gr)iO4qIE}>?_brW#R{SzJGneliTTqmf5HK%cVK#zhzvZ4I2wQrNlv#NlV_T{ zR^wMhw#bUe4Q|t@oc^oFtS7#92SkPIkMG$KQp}wI=T!n&ogKaE_wV#AfikbFfZKCH zvFh&GUxTOeQ(db(Q~--lP9B-{T0h{6$m4h6lbzic6lq13le%Mm&Zk5CkBV0hw(YWH zT-?zQ=0N1sIJ@4j8N0{nm$_osM2*vjJ*pKoQj8YHfu@BD6p<5Y(!w{^ey={Krr4Jf ztVXw-bK|=z9XWvAGa?qYZ<^l+?fyfnpY&)rTs*AcV8YH7gLJ$smswa!e!t?u`#aR$ z({#J!<%10rk@Dbt%lsX?A*hR}Gpp5&&Y%31$IGGl#m?9OOk)I)e!X|<&g}<@qKs7Y zt3VNcw}*$eLgC+6uu8srKdyKC$;67BZ2ESu)<3sfR|1Oh6V_x=fimv|tMC~eAFm72 zkHs?bFi-)q237%5>KFjbh>-LgL`;n~hvh&7LP~fWHQK!pKzF1qtA*etULq z$he_XBn#lAo5kbWaJ~>2D^m9ze}84Q=e<)pMXI1!f9~s_R|_R3qi~Y@$)f5V_xwHR z0#Q(;nYnL%KlN>cZwas)CRoKrePZvlrW*ltJy#7S%1F^qwTGZpq*@h_LB9$(Ng+%H z9DPNr)JJ!+Pf`IVxnZgRS)Hl?&07`F{m>L^0Xk|_3NkKL0jIV$`a!M?Dg~X<0$@jd zg-~3bWo`mE*cWIu(>EV)k~wQzbn2?Kal*!i*{Y?Gw;!#5?2FTme`u$g4-+HTG zBFnWC6zg6WwZQVcouFw$eJ<$=Q&+^3`Nl&G9bu^oL!@3`K^+N zM;J2@35!h1(*5}jMLQDarWXQ*JM0$wH?0A*cMDfHNuO67EsQYk3bmkM~-v{AY1B^v-G z=TccwtOpe!GcpyR^b{&U`a=VNFDxV8VfG|t=1X;}lyeJ2j-L!G()Y?!K@^btmcN## zQ;VE$PLGU68V@Ao(K@VeTWWkuXDK-B^9y}?YJQYfoE>k@Tn;u_@?xv`4gb@f05Ysw zw<`F}nL0W^0SeZ#{ryswL{e)4QxwxQ=7r>SDsK;g;nKTBo2-~h0AH<|1zdAhOG(XnYMk(AijP=NJaN?McqO>}ti({4@)K-fS)Ww)z$ zjqNS@T|}Edyo|{*!QqoG3Co;_f)X8$>soYh?NYlL1z z%spK_Vkpm=C70}=N_#ygy;vuk zMj1-6L0N7Cpg63(n_az^7d4o=L2+(X!27CTWdLwUgd>4l8jFjnw8c;kZLzymI0LT` zrZ|sApfZCow@Oa2c2vNb%aY5Z68@Jew-5qWud96w{ezs<8l+SNbXoZ9C- zU5wOHKi4-w=Q|NVDa#jEzWpF|=O6;S28P z)OI5yDwuCs3GhB8faskkQ;M8uN`UJxg#kG2!lID~kNemJ!HiFe3jH=6n{?3pp6JO% zK?UrK3&!1^|J^9*SHf$hk@d=(St` zOh7kJgP_S=rpyq_tY+lf6VjNzOg`4sTOZR1kdevvx3?bjN)%HB4_Bd)Q3>oZm0acz zT3uV7jXh74^aQfE$+%TfyMH3UM|N`6PtA8+*}$hWTQ;QAnfY^An?L4x5QUT6dS~EY zBYJbG1WVF4JTeK3kS)n>I3%<6JnvJ=-(oy;4o|h8Cd=e%CDD&00!V{6>60F5AR>Uw zidCS36hp_vfA2eb%2!0;Jx{`wB$(~M1nEtBmEL<3q!;O+AiWC$FJME8h=Pcy-|X4l z|KZNf`JVTEe1PAX-M!~*nVp@TnfK0Uv>2(3IDq>s2M8g~fv2>q(RgQdcuZ8U%LRzQ z2K~tc#A)x6k{FlU6XNsfnb<{?Ku{Sg39WT-350&-01-eG&{IV)#b~7)@llx+*(xKq zWOyZv$wCfJF@SMscj}bqj*rhD!b`?&k0ZYiDi_&N_CI5>EvA0Oq3(b6Z?(nTh&qQ57qdLNPpmk!=j^mrMa`n*?%U=V z`LOf9-V>l;OC`a9PX`O&f7t@~ZL$DxD&=*+2bKdQOy>Y+GaPu9wx}Flvu+ZT zEhGxaxy|O_5}|SpcL&~byX_7aM0iVPdQN)2WdWG<=2 zjZsqE_*c>Aq0t_%?YN&2HxK}~F%S2C5VWS*Z2;`24*l11d5ukX0P=bpf3!LFZoYRb zs?-AjxD#(#(kyFwgd73JfYaV}oBkRRzOv_PNWjT?UG+s9Y8?mzfQR+!B-{A$olXN_ zx|{#ruB*|}{{bLtZM&bhR+#tnmIP!r=#-q4LN`QW?2Y54N=b&|*B_ymgYUxu!h+V{ zaVfai2T`aEmjOAzhK&PE2pr&sF9!$$&O!K4qaEbv%vuG97Y<;0;sDurIPm?$q7L}Z zaEZdQBe=K9JHnzU_(J0l2MuhZZj!#P%MCs{s9}#@r2#8kAI`T_M z%GXQ&GX7=^l|Tg!dDc%$+bvf%0m8i$*t6!=_Pw+6L!y9IVRrqsHte&=762ZzzLR+-#v7b7YhpI`EY5`^`+S zUe%HGeV(vVyJWLOQU1E}n1~9MXHMNHB}l1img&q$G%Pr&ndIYwuqZCiiQnEsmE6mj zo;3fZ=}ZF;g^n}ljLLsurP-F*O2P#Q|39*3CkgM|1X$W!9--Pij^!pxAYiKkji-EE z%d7J&)Mnda0fLfX#>Z1qQ}OD|btc4EXF`mBHM(hc)wFX9etYH}cLD(R^20~w z)QYV6nl?5;NgNKV?YC^D>ey5ZB9$D9yLjXG@FOS+QD67%UR1G?{dW`SC41(qpzPQS zZ2^$YcSZ+$`5%{01Mt)<)70o+adQgi25F?udT&3n9K+mxp;6#uEC>tupv!~E8lrw}Zt~hepJ*(pPcZx}^SM(4p)SI`C zoBL_VQe8rU$k>5ohbJ$gND8P5|F_M93pN@1dsV!&Jd=z+QtZ25Pvv=9O*Y7werhYQ zcHZ_eU+q%8f<{ie1Ui=%-kX$OBqvrqw6gJH|Ah@r`v9)BFCYIZZDO-VsIS-|C9$~a z!go)VeNO@^HZn7#FGa~ox3^4o4%EdiobYnV-Z$iOAoj2#z)@^=ETzQLp+r<^^PY~` zxAb$fFWB_tIrGlxHE|#2=xTz<07$+|(g2uF?^wytC|^0KQ-kaBF)<`>D=@uTx1+6& z`2!$*$JB{Ct9)?699~GVF{S4>2jf0dABc=+ohVA(8)}C5s(VdJx+8l%CFG}e$d7UmH?6rQ{TsWW5 zT?lm5%(C4awLa^wpC#j~sEj%f1@|S_m@H?ut}e0v!Y}W&zoMTErX(Xdv}>gd46#vU zK0t{s&xy{j?Ko~=plWaIkkFosqr1wINut;|1$q__e!1hmT!KV@hY_9w+}z+GWUWO} zhymszA?&D`1gPYMDCZe-x_8@8N>hi;abfh4Di(9F%VPlSS$ohwKiVW`5u@_ARZ$!uXkmvB{;eF? zGYLhNmQ%3J!2xzH9E3^jfg-Dw&wACl&|Vbfm!&G_!2f3pfP-`{5uj%;4#Hnq6onHD zE)gJ&Jnqd!NJuVWh6-dq&{xh%?nQaXb;upSPQ&Yn(A|dv&k+_s5DFQWz_A|(!FsOc zAb+H59j59NPIDfqJQ*S=XS&^)lu6;)jAzY(P{z=E${7FZ+TXiQ|Ea>Catk8>l71g4 zIQq%|HmEgBfE%j%?a$sm`q_K+P?SyfCGtEf{BZKDpqc>QaY|zC=HO<%^P7vicXB=7^K3ruEOMj_z z*&L&y`;?x#zZlBK9lnwIc5To4G1LTIRHef@C){XKTfQ^#D)LKl$AybLxYie404*p@NXv>7PL1_rNcU33x;#Wb3HiS}Z+dk&xvI3plEx?Q zg^Hag-4;wWJ*r$DB5B;#<^YZWO^=M&+UB~P&Zt;hi_GMBx);|dHjzU7s5ZGgL!}~| zstX|NNb78ojhmdIDAZVNN@7a9>E`0{D3#$~)S__jXbS+p0$vmn19ITG%BraD79fw* zsBI2jl$Y$5?!cpAZbi`=N^Wta&={&8#d&(|JY5xStcd&QrDah7b;@g(?4+|xa#0h1 zk=ma*7gRImf@(%h#$52es`Pl%f5#tREXN>yy#gJa8QGNXlk78e4vO!${ga0CZ?4=2 zab(e2f4|F^_4-tk&eqzJzff`<^($5Uy09r{S~+F^74`a^vjFy+3ambLrNZU;!%-E2 zz0DsM5k1>m?r}s>h}JgeaR0NuLwAEy_8i`byVyn|kWG^zFw>c(!mh;!Vqklsh5!%Q8`e595 zd!=?|y!{PIVob3z=Z5T*v%dhPyc8HRFW)V%7M>`o@c%48fnO~EVvY@L@yn~R@9afU z$coNEq2{WnwB_9=oTxSj5`Hyu14b623`%2^Xzo?x)?{~__pTf?#t$8%BssugaIY`6 z{aB~f0o3K8drrH8S!Ei%Q4;|EUmPIAHV05NIDk(p2e4yvfczL7z>dv?05@hAKr?L@@}`SUAu|M>KSx_5kDh_b9Qvp-q38QQj@mY5Ay%sZ*vBk48_(T|!U4-#7L@z{+u1lNq{qpeZ%K$jL zy6~t@-LOGw4HNG`4~4G>^=$Xo{@1#voC0i)^}*%eOP$}xEK07cHb>VL*YZsIvoZjV z!y}g!el}oMB7le7F;Xm|4|kqh7jLRFrNWG7+<~{$HQYgfvB5zhy-aZsutT+q1H>uiz*}lhta94HH5Mz2;YQslxj*GSNVX^$Cp*04p!X~! z5Y2;2_>HiTK&R#sp<7)g%$`_~mfU1#wo@GWr;9a``XRaeXB*F(OK!N)3&V|n72g7J zT+VoYmcQ*Vxs@~~Nxc>yZ6ERNl{MxG3!9WI%#A-5Fxx35V~BMm9*<|4FOL9bCXhyW}5wq zpAN#e;`|-kU;W2C!}q|J_TbjDWyW8Si@5k6NKW>}fr5$S2g;5sKxjerN>JRr z=y(_a5o|dqpeyfm?_}EUTk52O>Oe{X4sZ|84HQtV;s6nznmk_KVNto=Xca>Ia{!kx z7eFy$b^KD==Ef!o3!h7zP?x9aH~2@X7I9Fxg$3|_VgYd2&Wj3av~_7oROz>nSV^+t%}-R zJD*Q-Z*%(vH;!FZ9_DQ@&}mBOwP0JHtNB{lj{#shUg-Zv+e#@10bs?9`YO6?)fUZ7 z5NZ68e6B7v=~()ue5u9{luC6jK+jff9tUpA-=hwS!aQBC#>4|x4$lL?5tkd#heR9{ zk&_BJ0kWcy{e%OAF696x(=I@ys-d71WErE_RIC+ZmMu$%hQXO>+Vw)+A2xoGImhxO z2?e#vVWDV8{@S6$=Ex*_iycsY>VUc;5H$QHQRS4i3pRU1X4U#+avT z)2BuB*#1%}BeVkIeN?~+IBdmxSg30Ac`aDqLJFUojcVBP0n2OH>10DxB zf#Lvnz&Y^Hs~HESrBY^dZ~%>x1DM!3KyGFiK*O>v4FNi(Bny$ANL`)~J#?V@wjB5^ zwE`0?0FtHgqA-!V0E(>M!WkV)SM2E0o^fiWk5NUl++Pc#e!G-H&m!?72gv=#0b;Rp zfK^Qab5#qW2}Xnpq$@q?8EKi(!Zv8{OQ*la%P^-gx7!N0)!Vvxc*vctfA2H?Cc0QY zxn_~8!kkIfcJG%p3E=OqB-UMT`9uDeV&a9e!@lg>qJyGMlWjk$-Pk-AsXr_v; zB#fBSxr5FiDSluUdfU+7dM!VdG#~Z)7g7xxv}E(AULVMzLE_{fLf84p;%aX^D4IfO znZ|LK2dM$Rk*b9BgLMX7NIrt1Z8H@Z&@NBv`+jo(a5KB_?PB{w28{y1SdRX8&4xQ0 zl&V0ZhHjBkP$}{wKz$HT)s zDoCA$-a}~pxHwu?sBa0sg67FF2ap2j^0(j`p<03)3mIlVbG-(JO>AWT}H)(Rr>zI;3{U@6u0U;2XOF3e6 zXl6g^?^*!(NxK!Ljjjq9TF)}-*HIL@z@9{d%F1xY)gEXJ zw@ci4t5lwiMoXw?&W6Z~Pl#uGA&>tClZs`%lZr#O+!-Z?lAc zv`JHNNuxbJ3)@VWkbZBt+?r6B&sI# zP&u3qIk3xZ5uLFy317J_Vt_UR${VUdW^^>&l%=^dw<>Aqw5H`C#R%wNM1P2l)!moZ zBsNVT{)pQpvSoJ#B>})RWM7tb(Svs5&$$$k-b8jv@wwp5eEj zda`NW*ZGWU#7GX)Q|p#*zARb#iTs-YFoJJsIeTM`XRmGOFQ_(dZrS`qXAje)RzxrO z>t-JRU{GB(Q&Ley%_b{;@x#~ zXJ*UQ+*tADYa|EAq&=e!CB2Wvlngfh=ni~FE70fswMj=ynRZI=NDBbHtNo(8H`n|i z^;o%_s}{g3&H^A<9j^mk zEF8d9kOSy|9F%^?qH=%Tf4Kxs137>{x*L$Hfz6@7AfrkV!yuS8I{jiPTM`9$qmyQF z(n6Df@Nb}x@|tgdm|??{OS$M$o*h-I&(%xGKRl?f@izf*RqWJ{_nNoK`Pu}Rl*G}U zIU8Sj%B9DU(2Ci{D*0MPeIzXd0>Jb$@BX%;y#vhU2^P7z^HMA4oE?cepyN;ct!LlU z3)Y(;O;sM7^HF7=ti1qG!1~l}(LZBMT@yT15}iFVyL?qqehbm6qWLWV+y}Wtu}2mX z-hC8k8n}K-i;1s{zll1+vBog~^8%MZ%wn(aMHpkQj&Vk9VIord{blBG0cPfSc0txiqfiXk&jIAa|nlTXcwjyoUm$n8s z)HeLJqZiVpvJ$cVOfLN5z&}CeOGB)PxWieo83{k@Utw4_UvqA9!StgrXnI|K7;QWaTa9!-KAq)96z^2$BTskiu`5#(dPK(hk12|EWQsAD6JYc z$I)@8hqwAwj&xBJ{B#a9-;pQ1n;bYs9V=8(^S(Iq$pGKtC<>ow%8wI!drg$Omyqz2 z2PQU0{~Is9`+N8eNFW*LhmG2OInt*ZfTtWQHU|e0H&x{v;NBPqf%7dSJf>R!B+24M z!Ow>Szi(ZO(%-HyvPX-9v#ME?<}=ow+re33<2#xfEhf2>PM?tvub7rU4{ZoIRASlP z%5}_j4{7aoPOnO($@P6zcptk1TN+PK0a&X3-6woxzjA_f%=(i zsz1njv?3D#K0XU?2XE*aHVdG@b0snB{LNOiT33~THj5n+63O?7;!!xWDNCk#Z){Sz zDWhI|W9qGepQ-}VS9ZPRy4bp8CK($*1rv$(?-5-l0cT`HD$*%oc517v0(oAEbZ3J z5mmZE0*lS`PM1rZY$Z&vY&CPerdhupJIrFFLjVK2t zK31*b0CsN!%=n=}wN(HJJHF(3#n`E_lMk-l>0{b1kjFK;{HD>>rkcMTscL&XJG*0DJ9CGF3~C${ z@1a`70Tj0miyB1zIs8pD7hwZAfLC0jN&QNUk2(qooQJuAy{d8!a00>sCLsirzJCW|-3KLK(x(;p8M4ZREh|^a?RDTyhvqej~Kuh--3{QKD zLJ_H3$?Bm|RA=&}^NHkyByoagWjWwpn#fmhx!Svfzk6+h#0qp_N8IRI1HACL;IV#Y z^_geM^UXEGLl1_ik2+oWB=t3ARIf6TtGg%VJ+s&>O85EZjjwFm|D#&F=_Mf&+WXm$ zO8l>PC?tIJGR^_6v~b`p8%SQctf;^o^_Dq+qcR5pyDcOT?T|}^RkDzPGR7s~jn0AT z(aU}ZHY;4h>z+mB$Q{fj;99AG?q9)1wgG!TvUle0Kg2!I@w?AF?$c$Dugz$Pn6nUD z>`c?9<@PlH9w1Ck!#2mxys=Y9erBqQVV%^kSX1r4@B)wIk|m0Qck1e~KYSnbmOqN} zDyAfsuJI}zGJY;VSaSsyrj{8|A@KkJ3_Me#D$lF3ay&qwT;(a0^pfX;dOST35I#;7 zHKK2opL^$%e=}O8EfZOXoj)IG`K>9@Pf4VWpVReN)KmaWW}O}nKT;`4s%)YtTovX3 zQEZ$1b+bv&T5C{Lh*Z5P-xdSNV#k4pRL9&U)VZcRfVVI&%2OXkaR47y4&Y_0fT_#o zCp#z|^2cP7LvVk}B1WgUF=@`^c)qpHZ*0l(;|0LvdVbmX4~D+B6G7t+&iCryYu*${ zV9)*K$u)JV4VQ)yk|0V!nYrVPt>OwKCM*tvN z=hRuBUh=q~0#Hb8K3zbKpw5Kao}^=c*b150{riab#anbI%g;uBw~^zZMFl_;?5=dp}W7rYTY4~Jdw0+;_@85Y%i`#RsPqUM9TlDUcuffPtVsHlV$u(^a=zCPw}`hb?SBbVFmEj zJENE@^Itel6oW*8O{ypkeB}yG9jxoF12fTS(i>G->dFRDgz7Rpyw92)h%%pcF4<%{9I>mU-^w_kJ2eQ!zmI(wR8^5 zR6l0#?VR>)YVMPdP&*2&P+;?l*)ik1Hvsr*L)+%+pN;aV^*aDAime*nbl<5p%5p?r zS4~BNAac8M346R^d#m>kC7A~8kf*A?IbDyGE>!8LS*-5mGp?WM@hZZcEuni)|Kr^J z=Q)L>1YNgmMy4}oS{37dj}dBsVocDT54n+{Bc%pcyZ*5BFe(Vq6Q2v9(c6H+P*X@a zaZLom6Cdr|xb5_p5XJ@PVco8ljH^Bzp!_4_k2Z%3pcRWUx8&r&BQdSRg=%RN?m!HF zR7qJoI_|1ss>ulA9M|;gRuk&UuOr4ZJkDK!@DVaX<_JGj`UxUbyJ}FcH@A)3x2__p z%=@MVz}AsV1nyE2Z5MBTa%@#7ih_F;2MB7-frqvYZ~z+z2UvADK+sMOifgkE2N7~N zY;$mci<%tZ5+Mgrr`>>lyBuIf;=sG6#oP6K#{&3g=LUo)Y>bG&kZDBoYMw+nh~O#0 zE5+)=0V4P-py#7tV_B1-q;tJTYBTglbIa)QjcVlOz*&Aif$u82@YTlRQf&7uaYqBwx`5>J*^z2;~03zi2Vsm^vziMjRDWd^!QK?6Xo7HQ3 zg#jR~TB|c@ZznXp27q*39ORXAFdb)BT~PDv`5vak5aW;Tpsdz$xCCzbxB%KbwMy#T;v@49`SJIBmh2;dj4BslQW>m~=tT+9Iss2q6jwx|QvLM~BK z?lUQdsBEs72;P`XG4lE+Cs2BOax9~JTItE+Qh)B26}RZIdT}{_vUBaqM)s zUi5qSr%ndIUCG@i1~wo5%zTy5oVS!5c=@xBe}e?}p37H%E#Cr+;8RpgP8-QjpQIu z+Zj2)eJ>7>Vv7TeY7Vex-~dT{6wqJ3hzw0XAk&$iU^o67lSx5@X)@;qoB(41mUEji z(C({OcG2hP#2Q&2nXjyv0_XiYv`O+WVuF$ioNM>l%`?{^RipXXgwxZIHODzO((qpYOi)p7EF=v0X`gzN1Qk{iR=< zzg8=-_|U;aFW0`N$aGR*;nPt+kN$KGipuwc0&_;4?@_*59RS~23d}nF=d9<$@|r*| zS~DVwpFMv5Jb;%&NepQhU9oog#sKi*$=>o{V9TG)%Hev_E3U(>yBEwg7fzZScGaY8XyD<-ghkf|I(Hzmui_1US9NWK7Kk_p1IRIAUt!3Vy`tE3{A_xh1n0*#k zuTJ^Ha^?~Ms%54}i}l+on(H?r?Dk75S2m<+Pt<{wnXwJl^=1 zL0NLZi#qIj#BhLt(d69E7cY*xg`zz4CXWMb&N;9hRh4rPDi=SpN3lAJzkw5~dI;vXenjT~)) zFO)=VqtZ$B>>(zQ1BFskHoMwn+tQ5ya1r`&M#ki ziZvuxLQ3XJQ5(z)##|Vw2srSTIs_|~z5w=;T%zo3^%4}&y&^vaRii|@WV6rB$J5RD zP+paCVa==d2YNrmi-BR_Le;K+rhb&mao2^=_G5~5{TUMQKyTS`VXSA-k5Izu;<`K;Q)mLzor&NAqxSQz+Dp#3i-MgrQdjPoRi!J`itwD zx#xdz+iN&gLD$m$3_LqQ4nFZh5IW%eHxoNKw*Jp}%m8}D{VM&)_Vp`&0f3wE^j=ke z%=n+F-FUT9b#$9mbY%0ww;_S!$`&=R4*M`R1pxNz4>H>3yzy!h05T$R;HUQ*9AK{I z!1tzV6$kLn=AcMN3kf(Oa|t*|bKqUXswk}na|yrVt`epm;7>}CQ-5x|ywYSmYpTZ; zjBQ2*<6p%$#9gg@RsAAA*r_&>6sV$OUpi*9BT;oz+Oddu|6=;JIdg^-Ki-zD66UoU%J2Ac3K=_Hc*VohnZ=L58Y)@srNw ztL6C(04mm;IlBT5ME3#+DWoK(`d)hY^S|Q&kh5vh!jk9nq?tQg%&%h_58pB4!V5@1 zUm4yfX~iF3J}|*!RmYGUU%lHR?i&Dn*Fn#>mS5j~KL9qD8NrLg0_(_CL%c+|C3E1R zEk4QJ!t-8lYg+D*T8@K4nW|MWlONq%P_8B_N5D`wpq0K(<0lN;`}`e9;2h8e&|Rm- ziB2*$iJ%SQ)P^oLC*zL3%cJzm5LCehP-ksENZI8YB@CoQ_i3utE{~BsZaldFGK)4% zOGu(z6qHpXL73DUQfU@Nz$xCP2r3&UOAesxbKt8NdN>)j@%C1Ng{+LdltD_3^4%QSJ$a1UAMS!rq(KxSEs~pwxBs zM%K>E?lQ0GJrsrPM@y%N(4AkYw+RV<{SKE*JJ#{ka&u_n8tP~E@rNI6+>WBK`Q{gv zkuQl~ScbQS%Y|jC+*ki{enA-_@4&bkukvQgA^VxFN7VpZplq!k?WN}LE-y!z={?}Bop-O_^j>ZK84iNX41N3PQ z5JHmQ<@H;kD(4{o_Z9&5L@x1$R$@57eRmH0V=e0NldC6g7#oj?w+jbpUR3@87DXX_ zHka@^Y$1_HE>`Z9BOe4W%2%$&?h=R_$R(f&DxhbK2)W(UNwTE%rPB$_jJK1;JHuF2jAog=!X0Y8 zg+3ezP<*74Sa9?EJJphZ2k;uKz|2*7vMP0u4HKQsu2s8f(`-}vemxcvMeityao^P| z(kj{9g+{DYV8j=lTb$@tSxV5UTthn7r_chFrAUN-&}|>KqUYvjklVsl`Z z1|ge+0~|VY0Ea;ikiC`zSXEsBDbP*QC{P!f2s*^l32kgzD)m!~UyMDIOA+)PaP^1- zTm|C*_B#$>H{bx8*lMDa8SjILZl52;6ccN_o&?JpxLfXY?esbk&r_> zqTC*#w}y;ObOPa`#ULYs!_Z-nYJ*t_i}X+ zg9KLEuWQ^XF}?R*<8c8>Y*r0hQ}^(VdY^U!$fqZv70U+(hj(r$0l7s|5bi|b7bqgt z*=dYsiW6;B$nyD56BbMzgF*`FiDl`;2SwKU1Onhn#M~>jBK_4hFwq_?m9r15>%QQa z+>O#q7Tn62C6Y4H?yiB1L!qjiv9@IFn;BjxxwxE1ZH_77r6y0^Q%nL%AJU02f3`W; zL&20OGTNAR?d@XYDQld5J)=(k<8{_!w=9f)Y{Xer00;Q^E`VOXZXLab`Z46oMG20v z+a9s^*|r;*AEK#^QfMzN9*oXR$jDYT4cqWI_NV)D$`lSo9a6~}J4k#_(OKK2Is3|` zlETy$KQPsE6qbfpnLNj(vtbG; z4Ah-z3{tdOvIptU>GGiXFnUOE5V6goP8`6wNYGp9;v`SyxXeU*Q%cB|Ykl;P?i{UX z##Y($+}}_{Ba6E8%SqK;0`aC@8YO;TFN>mz%AQDTW$|zCzxXEJcudT_A(xc|2QZ~` z0HYuWMdZBUUWZ?fMIGK>-BbR{jj|2Fua)9ej93bgD z2Oh;;Tcs6~V5eFjM9fMN3|X#vrcUB^&~#iCbhTvA({YAC4nzk< zJloaJdYnC9-IPFH(0MDmHOSk^wD2R#=VxE8t<_+JY`Q3_$U{~6sQ78WJKMZ6{w9Eb ze+7orjNZDnU2}i{ZPiKXl=n%42OUf>L`lTY8FS{{ou8UOpZ)jVW$W70S8hB-9Wbo4 zbJz+tTl_mDeD&g6->2~RgRgZ2@RJ%FrFLP!S1M-iAdh8H^3>a1B0w*&ybiC<>IW*I zzjz4cvrbE+h|z{qxp67cc+mXh+(2AFxAx|}yA#g#pDlkMW%+24665Sk3n*n`6iS1= zF==3QV6Ez1ll-`ZZ|HpaG`&B&w*t$nWbJY8H5Doh*NJypPp*-69TG^tGd_R*J%w7- z0to$66~zGzg=5R6wDaG74-&BGa)6LpTO5m}vLSEpq?06@kS4q#_a zA5s2dm$q^dG`ejK)!dYxXa614TCNrXAn_LmxD*k;GqQ92zs-)0(5M^)XnRMWpi7$q z)@?;|ak|F=?v-=ksg*7cLQ1RO(N0wH#U-G>E&nycGsF+*= znS40NqgO2sVCv-nX|Fk`INYLD@V?*@1@-*G0o=JcKz>yY0(~tiul%kBfTs{I%3qph zD6Sj(w6Gd0FvuubIINRW9FUUK&)!eW0(PhI@8%>@+Stp=4kNlcd<4!{Exh!nfBG7a zQxR&1mzI{I_hrZG7VYsMOMGbxESpZzm&%<1y9m=0R1Vg~Hn zlj*ZpYU=ck3X;AUqw|$zYAH5-d`k_Kk)%zgXREQUsUCs z$b{n#{3@&<9E8?Yb#Q>&4Q}A7lIY;~(pLS3G{K5i`O3pXy3Wsm{4%)!xwyLn%r(3y z?>ZKhV-n&La609nQeKOqyy7f?8T5z!K#z$Q5{S3WEBDe}mjlGd;UFT^q7J*BAe4kq z4ywFI=399KB`q_(uU#A@ryKI-sCEgVO)`1)SGqWMbDIZV(Z=I0!~No*+K=z-nJNKY z7_FZiPi_aKHRu@N_I3%v4?#8bJh;u{H4O{ zUU^_oi&u(E-n=M;>gNDqd^qrs%d>msh(y69kUCodJwrsO=ra1a*y1i!u(A9HqeEeL zc-bRbv!zM`vkq`^^>TPabC22vW$3{Qrco;o+>Hd|&8Z_gKzZ zxo#ROgSK#8C{!}Q%YP1jBAmQV^#1hI_ckS%AV#%oRoh?QT=1WK+lKP6PJ#A|vbyDa zt`-@3@rbVK2J}ne07s(@GV2vAeO~qpQAg-5RR;&S$;yG(KefQoZW&B0MkWRs^-CaA^yG_@6FC2?J(E4&6Sc{7|$>$9m@S5ETo}f&@U) zI(+RA=Frwo^}g_sratk}OMa%>dMNhEk$&S#$pQ$#JiF_ivT+4=sXj_;P%Fv@M$Y>5 zWyyq17VPK@Rl>G=7rp+O`5j8YN%E4Y4G+gY*bD$YX3G#$n)0#*L@y6)dV+L7V zn^q&9u`B{Oq1!voc^0G zz2fzt%40}~F!7~~@%`HHysZkm(}O&ZgB5T$rtTISrVy z+Gany!pyQi{A6x{5oBe`mJ`1ed~rz@ND@e4II>{>PkWWA1b{$;!-pN%AKxrfHz8ls zzI5~+mjZVl7fvN2hHrYE6Qe7s*mPnvhrKe&pkTIP10L0BCskDeaI(dL=O0QU;k%ma z7S{IEZ3yX*LdRXC)d*uh*-{eJHA9;tdeZ2eL*G=D4^q*{Zp1<9o2qCIf(t9~(U1+Z zP95BWqTr#$0ghHUfRk;@g9{QXUnwAqBF~J5eaYV?N+jmPO6KwiHQb|$Y6b^b$2q{x zj04QO9OS8CQHSk>1wgEAUKF+wE`W4}j+Dn&t|vT_yvvjHi}U_#Q7QZ|xddEdIIumm zD9TrA-!_Mm(1WyqywpwJUQWBn9B7D}!?UR|JewN-DmtvMwg&HAeR*riq=f+aq+nbkgssuYW*ilpNJp0Q*sG7?g%$2oJ2}l6v0;q&YG9^0Wg(D_8 zJj4iZJyjKZFrYyu1=N%0xVb$c>gbjmpx4thEt4i1moxLh|N0l6a6eJDk1WScV$;Oc zMyIpCUXa-n!L+SUGuqk3nfAKVD0?nQhdiUug0ac*8Txy;JSJZ0B-L0qp!Y+A>b5;` zzV#~EM3N{Z7Z%Db#z3Gxif{u%R2^~G7ir;^`I;g6H3!`E!LxG0x2Q{jwC`=4oJRdR#@>*=PDYAcYHSYn zlwTx0Lk?|v_rh?2Mkz^YB3w_Klo$$p8n0f7%TuEB%*YLpTXG}1WExA}wsaXDFM|sQ z>a9Kp0mE`Dm8vVH=VmSek7W+R+yKpIq;#ZJH9ANay5(hN)#fGR zvYi{SY73&na|vuE+`v=S$d32tRi2+y+xVOKy(RQC?E|XQc34RG>RkhuD0av~qLTI~;S&B@qjv%H8nD*69Dlhy zB|4tmF}lB>;3SKdAOkTk3J$v*1lTN!f=a<95YkQotvLimr%)nl=@1()RtuwGQ+05= zSD?S;)q+ zthi|@S;;ivHOovEvyH)Qj+q<(_bBpCA^l{qxK1nWf$9^e=O&MfIKQ^Z3;7&<13#(u z+8i7pHpRrAhZn5K-IUSZbIu?vfbs?aq%Gi>NtSs3J0E2>17pCMIl$#84hnWxFOCCbhvh&W4$`?TZ?4>jy93-2;Sz}O!-3Zbi&o))o=bS> zS(Agj`U|=M>Of7MvBJ#PE-fX4GT*~%!R0a0r&d@r1>x1X1RO&+K*Tx@0;^lp;ZwyG z=vg;7S{{|jdDl4L6-_m#T^@f6`>&g?0;Z()U2POA#+Q$r!fcM^7prdi>rXjZ83Rx1 zF*e82Z(fe67<>v6hz~y}wfp+ZHSYo7W+?{&&(*J(>3sH4jf7p0P{t9PW8A0hlWwn4 zb0f71mpeyf?EF3PxfdkhXqCD&waw-~q$Nx=7Xb?r%7?xz5$O*JIE*>-HSK(TuhbX} z39aC@zxFJ?S_`!&q@oaDi36BG-GE-1-GKIr;2`*C^-4H^9>PI@o_SpWt&fp?QwG`F zlBHT*L!q-l{)4VrR0d-&m%tSu4iNf<1Fr!VbwJhN62Yx3BoJYXOL%Ati2@i6{bRH3 zbZ{ImER05&SEFQeG;rTnTz$Iv$v5xsy7sm4xaboeQ&gL-k173QP@8-J$Y}cR$*rH{ zL~I3s?>qPN7mq3T)!0#=KqRL67 z&i$8TuHi+&xt9Zv?XGo5)kQe1`O>DyNIYspT+2PyS^>jsRlq31__}%pzMhb`@Llc8 zLZ3aLpsMDm&(}-WW_$q&bl!a*6zzETufqUXpf*1ZzSg3K++d43LffjM2GsgGnEo#% z$Xp}BbC9iwjGnRfma(zIiY+>v%@JRE%*qQVzCqD`T`fQXX%wiHC1gy4l10b-Jw=dX;JF>@3HdArYaPbZ$q1@sskFG$r%_ zberuXE7Z!83xJS7_z?~e8ia!?4OJZ+AoE1MuwQ#_YGJNvMfBE_1K*9RC=Q@$ae#(E^!)QDael^GKso1p_K8BdzM zq=?Z=%>4(fKi^HSzM@fT8RK#BX_0q!f0zG_jQB$BD+vUDt}0(NZ+o9XXQx3TSbj5` zgM+*$mBgH?OCn0QS_TQ^GMaUCSJ9<6#sdV^R1%X4dPLR_l3krlPxw_O_~?FfI5&OA^O3gS5Ies4^W_zD(a(uy2Za+PHG>bj*uTLK%m~ia|s+^ zxB#*cip{!V7U~k~lvAk9;qnYshm?D*n)F;7Uau$`SlFT3!2$L?D+{ykzD!g4f$A zNOs?Jdum!rYF~A0(wu^e8B?%%#)o?-_sTy1t@nxD_*!s^IMnONgg%SRc?@o=Gkz|x z=jMQoPjt*<4u0>JUjdBpEoy|DNAEN4LGWOogIkkOJ6hc^WP&C0p z!b5*oE&+dB4m@Rb6ke8BUc#b|5UrSV33%*r;G?xZ4&a!_0m4mifSn@;NFmJuZf0^2 z+}z>^BG)*V2-UMU2N*R9h)MdbJmhgCGcanWSe1&=sMZ_+JdXn|7M`CvEUn61xyFbt zhj@P{1~jYpUU+Mx90N>NzvRg5{dcDhOEK9LuI<_bZ z7M`f)WvA2sO$ptzy01F@MwyLI075IMIwJSBue?2EA3zbU0C9jEoxJ${E&dB zha1qHlmo;<;Q)qJ1@spQNl!>3|265TAXB;+)tjHgZR4QL1vgstinviynzW5qC6_mw zmIK@+K){E#`ojeQP0t%`y*g-iJB)s2I~+ET~?0`Iy3PuJg}yNfL*G1YKop(Gzl+cSF# z_i-+!r@8Yr0zc?EMXBjxP>oTge^sLCt&!gGc*BK8DX@Rg%r?Qn{{bN0*BsxNedE4b z3V`s$sdVf863|-LSfsh5Fm1x0i>|2AHG93*^?Ux{((Z?cQ3RZLIq;1%o}n{` zMpeol^!gYQP=z@_xFZe_iI#(WdTYS}Jm@-gAeCAm2~B(HnpN=1c)p z4x26q{(6_h0Zeloz$uXf|K6&(97NQy0Pwou5*`IDBrwjn1QMNbP~csQqHrsnOZe-_ zUjcJJ;zPz>VK5Y~iFWExX74sfR25@HRWT|xMwDJ>Z+~=d!zXDm00`r^cFDs3)m#z+ z0HgVmAv>FN8!we*QB+kqSyOs~$1B3uWOtGhVsNH8bHp~KOWy<${8$?m#uO`aj*8Ha zg|wwW4e`Q1ft(!4(a=1s9@VTzp%Pz68#j&OkcLL^D{^9pO^b0EH$&#-yXDnFE_K3u z)S9j!i!__Go|`Lq_S2lC#`SLLYQqTjkFDB~+670jRH{?dS&8_xLHfsX5Io#M!l#b~ zfR&3Eg$U0aAnR|tf>~u6ytd)}G_IE_eUL;^`Sq^xQ@^L-qqdp0 zXB-`M-1GU-rkhQ*!ti#_eq}+}t*n(Hh3V%?}2T{Zh^~#)r}h z-mdpngl`tsb6jQ~YAtL7$nHO*+*oxb%es&O27fE9US1;odeI(>NjxUH^BmUjJE)J z>sx?8{hoLo(BfSHX&jAWN$EDim8jDi*OGO=2u@6nCPhCjCez}m$}NJ*ZB@|i@6HX_ zz3o5aZ{p+Qy3gL?t3ooKnpz}Y^_r+>2g`l&2PFLEGd9PZB(KgR9zFwrCF9fYS|1Ak z%LahkNn^_W+Bo`ar7ck9MYNS+@a*Mti~T02bkQnYLX6Jo&~Zs0`PBu;r#qM%(0V5a z$f)#D^tx@k>ieNpu(fmG`H%4o9SboDgiUt?`aGuP%AUh|50|D}OZatXwz<^Z1D93cJx2e89%fN zAYRw5k4M^?-8EI&ApK>x7eDRwd#HR3LIRsB4laLebQ+zX4!O~WgzBV6l1yeMz2xN{I*+oBHKbKw$RvM0I!z|ucj6a~j2 zUQ`}E1UU#jo?B7mQ`j=iN%y`eW)E(;a#62)xrtH-3kq}vdXN^B3Gc-kIWUECQOAiK z0>-1J{`8iyhkwiXSJ7GDJfh0lpHS?=dn?T25#PTQ*gNacm1W(eg+w837~>Ltvn?c$*p*9o>kh{Oq8f4Ft;a71 zn9?}#wtQDwo97Z(-#CC%0|!A`)8@e5&El0H3@DdCa0CwEe9u8ay{F^=sV_Oee9D2J zoPTT%4m>?Aeus_q5#jqqk{v) z?cg9!UsVSOL2WGn9Fe#Ll09;O6wVxYq*~O0cwAf}Xp)75m+m}V0VS^|mw*#H2YK{*qk!&J;W;TuQ3AeT1>UZX931R_6k30!*P05O(1K(;v! zu=`U$4}*d(G0W_9sXbQ3b2A5lO9o>)PibYuuJ4rUcJ=st*|jAz{*e0@@uA@(ckZsO z_xhhJ8^7P^uz~7ToZDPz%HLBp@BE`QfQQ~Fa)3k7Zf7TrYSYV9f8i|Fp#2AB!)Gl(QC`Q4KT>iu2J-8ZOAb6| zSx6vey^_%1!DjeoYaf0?*!%!t#sc@6%|&b77d%g2TYumyG}Ke~^z);34IQH5dx#hA z)kn2we^~Pqqw01sB}OQ)`}WGoMGDKEq#+@vLYreq(UK7re49c79#MVA7mIxL_&WgP zKkj+)yEj%nG4~q*AE`PxKm=V50`#iXvF676|76Rih*sHja~oIsuk#w8mZ&_xT(fNs z4xlP?P-LcR6$c2G&jId=aZpT}hutg3`7W10kWvmpqO4k_*D)obJ5GoUNh=d5i4Yn6 zxq4L6=si-o67MiT&h|FP!EctVYcpEztpz}mr~^&zw*IN&UA$bp!_T)4ZqTXCApnoJ zRcqIW?5}x$vefL1I&LX2ecix3k2}j61;E~u19XznKYjJBz2bA!QS!DbYUm)x$R#D6d^)g9xjaDctY~*tBnRG?ECBY>T*5!ZLINRwxI`tr zapVBE963PTEe>$~(FKSDdb(kl5T8t|kFlh*OOVsM&EfK(=%LdrnvcY1T*4=hg+#%* zu0W5ch>WyMBYKM+1IswQF`kx%iO_0pH-X2f;;#3d@$|;W=AsfTRY9BM=#OvOYXr*$ zLyUxAy-`?_z4k(%_Qec&0fO|epMGm_&dFM)O$B?7iQV>pJMZ*sCWmLL@|?Am$`AQK zF0P^|T#X+1)9r0kKk5knL`iVhBbZLOBM=;>Iq;N|u+71}cRaOs00+T6RON0!ujL#B z$VrNh!kHsbfxlHz9Kd450V2h6P~u~Yq7a>oOB4yUknoVxK`zae)0#W*?PpPxryhR1 za!W@bBnjmb`SnoX04urzgN(L_8w=hPTt6y{t}DbDPIn2ZnTcjxP;)SF{RAn^FIK9z zI5<`wXo>#lov421(cLp!z1z8>@izlRDzH2Dr*h3g?*e!YRbcMFUCz&Y_&Wg38m4Ve zx%R=Tu>d8uDv3!os}nMpo>F@EKk7mAeL>UCLBdCx4k&`)-!~?Dwd)ChOw0+J&X!pH zQ5%5#QspA0(`fEJ35-kxGRT&WBG^uEDcPg+E^r^)r3?ayPZ9Z^_|1<|E5hz`0MAbj z;113~+3`lHl*)?NaoPgp9bf_cMp%FlCLw0n8kZ^ABTUvZsEl34t2Ih7`;^<+l2!xm z7CSgHwZJapadO%U?o9bLL~vOV!q=HhS#(u%R{DN0`KuDIX|x^yQCd0hk-ggH;2@-uMNyvK3bajb@@c&PYZeW? z)N$bV!a@RmoLmA?$2jmLIQ5~Tmsp%70_eZ7MndlX3EMXz9rX@aIxY-@2JCpWu&=K z3^W+rj~{Q|KcMjqqjds=NNwNd*lL?~VQ2k?0AX6o-qQ2Q@tX-H03z0@pSIAW`G5Jk znj;XWFXKP#Jo?iHa(^P~$kRtj#Q)&)d4njq%@V+-m!3Xvo($+UO4Ntr1Kc*_ z;7vUvasXcl4od1-mjlFM<^UJhI6&eT4zP9Pz^Ak8E71cWEIK;2%{{c>ifwJdK#k(wz{)pTUZgw-FEdujZQU;)aFOQ~QIDY#PG zG}Ar#iyrIWYcb`Ke2O|JKI*s*Pmaxbt2qE%dvbdHuI(;E zo;FrTV4%hCz`ZqI6pn!u(8JV5@r$zU@pihXr;{m}!!y7zkOdfZiOyM|hN|}Z_>(Wf z?p6kXf%xpIQpfW&_yGXsyloBEKkoV<3jj%ZGImCl+Yx62@R7R=x?2`ea&f7Gav3ld z7yXI4j!68uSZlc#Glq=br8M7ItIWfDX($R8RXBhX90wkC4Pl#u1Guy)pkH685rfhm zC!$J|k8Wmif0ZZMe2H!uZQfUP{IB-nlx8pc$>s|GPjMH*-ZU+i4jN)(O-I<{RUe=gh_Ma^$8&2B-fS<(ytnod+>F`&BV=<6G?4P!^$L)P} z<|KfpZaoJ$-sJ#ESvi0!0|y8m!vS0XIDi)}2gqN z%>2l1$DzH{r})0WlKmrI%Hc|Dm93#Oio#d7qdP@Zo_c1|9}(wz*Z&0XI9N|DpOo1( z`R)gDM=E-H&{-vs)4$?|RbR}91aAMPy$tyI%_aK*JoKRHU4Mwr9}&|0B8o!TAPx|? zf`bB^ROKANe8K^itab(|WVY&|D#{IPumI+&!HR;3f*0j0S7DmCnM59KQQ-j5%{T~~ zZP6-Zo8}V5n^{O8o+OumGc5;jFyX*l9M}&uQ*ttZB+o8I(ah6|T;q(}p7wSW=P@Hi z@3ho&dI*FXr*MWhfIU5f%<|-fZv0Mj927EE4D(CleEM9ShwJmNtZ6(h`d=Y^a(J$4 z>(Pfl?{0!t>ecPq7&j{B@DPAJixpT_Y((nKi_+>Lih_|R{g?X{9M?xc0uv<%IF?HF zDtW0vj2x??DDMzeN1ym2JtjYS(=2L*70^5Q_HPzQdc*e|ByeoQ0gfU$KrA2*a1o9J zZ#`T%fHOA-MOLZb!GY%m3sB&>1@M?<0k9wEbs$kK2XM~gz`vzy9l9qLc1GopVGH3h z1}3B@yq1{B?2ncnP&b<1xxTf)38Q%N4(+h!BbEZyn_fZP^Y;bE%}osw@uNK}yP zE9u=WdR$1GE_02~Z)VD1H(1g=%oJNaSD%nhB<8lNGcO7kfH}Z?$N}O6ae!=H3h3Sy zCWC&&B&0{v3}#_l>_YI-9Sf+%8_NB zOQ0Vrpg&WD2-rXoN{y_bl&8yLu(@4yl&inZaW8n>(WvUuDrbBXIqqzZJxOziuF!`e zVj$>`74yfvwtIT*b^lnc_iy}X;%ZahKw4-H5G9TSkFV8h;Q(PLIDqQH0qlt!_}sFn z13t}M0v-Syz^2WCuO7D?_-MVI189~U_*8LiuKwsBa zeC=+tuVxQ!Y&ZudAY3{<&}Qgn;HK3fn#oir%r12rX^_ ze7>;&C3jl@xVQ4kaTvrwzQGnnLCxV3KJ6?d5N?M{gzvMEfc1?_U{U1&3WXbx?jm#@ zlYI}Lp%#_<$SsDu1gs6bD45kbfLkgD=G{ZtDm`!tMmf`B6SM98GU?8=)_;w5nj?pM z9l$sHXYWHTexD&VeKJObbWBUgOiDHK6*mWz?iOYVdyh!F#bxWNH($#PIi+KAnY!aCdNVfgH_%9-9+ z1@t_{0q!Po0G}fc0uQTB;0Cm(0|(gOaR4&{2fpzZbyWM%0(gIC0bu{-b@(&OO?kIewE?8Gf^y=+l$`MQM!wjaILZyo;e-U*P%r%yuK1%317o}JSHlv^*E zd>BAVYYwopb^&A&ky+;IN2MesB%6*s?j<9VrAq-~#K^(pE`e#2OL)lxEq4h7ZRHYW zrkwv=ehZVbw+s-&Cy z3;1oXAr~S8TvFg_gB!p9Tf76lC&J9t&njA}TgBl3i1Wh%f?08pN6!cxz|)!oxRG(- z`?hK>2XMSnK%P(tZ!xb7j}k_n2(8{y_J~*tHcrXn)8(IxBF%RfYP`Ep{9q5Q@BWbC zn}6$b^H4L-K-HL8k3O&R^rdNE!?23E5*qpN@N5(XCn^qbp_2ogB6HwhLRH@5{j)c= zMVTiu;nHwsb8rB+D-Mu^j00q^Xg&RDnG!?ISpacJILI?qwTc7eW#u4DD@7bs)t#RM zk4_eKVE*G0o>G^zITR4%sP+ZAkCQy8pNunR+&3|bHTwZKr^1$SXXJ}AR|hmQ9v5RM z)LS)Z=fA}Zz8W|d0H(Foi^kV!UcWs6Lg|ffTb@FDg-Bp{>QSy?dy~XiiiKZ4jpDPI zo?`GN8!j$mhjb`w>lqx9{@=SI6#D^=uaw?oj5)g z5~Z_^KT@h;28xYS;G@3RtB;y1RbkO8zbFd;w;wJMpk0wU@N%f4TCO`)<9{FCHU1{* zKmb|}aB#)}IvEE6H7x3Yft5?Zv5*7!baPNye<%*1FDRh9Wnh9mi*i24kcX?=wTZIE z^F4qG%A(Nwqu_7)t3Xbqc#Fgdrnzg7gHURh|_3g8$!u_KE z*VuW-S5~VRtlJEhE27m~}PIr0d-KsYVg~PyLfMe+lLS(OXdl?|?p8=9KFbLE$5(8Yy z$^bqT27ZgxlQV$n>jN$tB+BcJAC|!3O$Bs2ER!L!@meAOB0#S|TzP2gb<7(dN5#Xc z;FAm1{`tj#74~1&XGH+Z;UBha?3BIA0oo9ICnULh{vhW_0F3eVZ`N=3V}fJ%U}2V@ zx+rahdzhoDzbd@%ylxv4N6r91+RXNE%r1B;ZwUZ`+Dic|<6~}GYJrFr>5!V8ohgoR zSx?~hmim?WPZ9F@d;yMjumt?b3=qoA00|KoV27ANa3@1`L#7!3l7Fx&q)=dhg#QeJ z3QCuu+mYCj%e8M^75h2%wvNbnoyr)TItgc8&d>!X#Z%*JSKsoX^mYr^T0*a^%p!3{ z!OGSv4lEQDiK89)&K+#yZY9;;2XPBQ?wepw=_s**@qF{EFM2~HV^>Kk;c{)K4+2B2_cr(u97Lk7*IDJPac z-CEw&Jo5llHI*w<0#@*?b#s7Rh4d83#zlOJswHdi*P|7KK)rHcfZ><{0>T-fe=%@t zrv?LzSPUZcaLfSb^?ks7h9^gY36`jJ$smE41(v|VQUTrZV*V5IBkxDEH9JGN&o=4` zRrHr@t3`IY;cx$C_r_@o9Ig0q$K9XF1&IwdD6p-`hN{ypE^;JZQ()T8*VYfuaAszl zXi2;G`PO@%aaMjfd)%pQ)9=Tgn+jDS+D*a$c|aHhzpM&xH6^3zy8Jedsuv8vBbUE! zFH7K>79XI88wR1;dCmZzNdf(t%A}9RW`IXbxpozukHmRC5B)8CBLA0PI7S zC@+^{BGt&rql+W2JJue;V;EpH#i06ORXBq>PZEwd&!n-@RKsxf5WI{MyIK zAn>TFY3naT4}~3&USmrF$2b`v6w(LC8P4rx07HX;-x)*U*d}BN41^4D@Qwkl_GJLq zgaY~-MT@ZQoP3e*x>%$gEJ(`9x9j+S`AX;1LtH-8{(~p4InIQDK?;oc?W5clJsh6_ zys3jin|^%$S7#h_>EVt+*Ud4? zEpO{v?v2-zMoJ)#+jdPYO3KMA$j=bxlUipBYwf=~JsZD_xH;{Qp8CgSdKKpvq~@ej zgzQ51%lnpoJ^^J_*KXdIj>Hzcu-uum%EsHjaeHSLK6}rp7Rw<4n`7FoCns+?_?#{< zyw~W=q7mW}mON?ay1kRP-)ivIOHNt%W)mkBome=$04lL;W`Gg4DEjzg*RO1Z1nwry zYCN~~hMUshu$mawK7+^owg3AzE=XYSm4QpI;TYh29)r-QZLMOrfXcvieGHILhXE`* z25>Pji2TD)INVY!fpriA9Fk&yd#M;8eG&sigEPRDObihH$N(9!7(~i3$@jI#$T`aw zAVDFk!Xa1%bO(+p6vv7(i#&E0E*dR%6zrGnjI;IaC0l*8Di|gQI?OB>dFdKJ?fL36 z?R}umiN)9@^3!Z0iePIO5%l`ul-&taiRobf1^urPO@B>wMi-}$`*Y( zSL>MkVEyY+Cw_tsgd8!ba!e_IeEEW|ol}oMB0;X{++GGz+WciuP0x?{2hY4cHt}Pq zLRy@(J%4UVyr~{Q^hs=TG6?IcYQ+H8$uS7mCN=}t?*>)n`WS$Ja|4Jpl@YL2N%T9N z-)K>qvpz?HRR+jl!2r{+571)^101ktfNTg1FoH9vI^6Ia@!E`M3759i82D@Ria}$! zUK02I(YwMr(+89_)T*j(yFL<43=(iyvqXTjn|y19)Kn}H_KT?uj|n_t06}w013l;@ zj7%-eO3JhnK93NG=u9V78rnloLtBS6(}n4$|7dz#=gW_d0ci54DrfV~)vL;na^^;a zXsyk=HuB^DL=0EdBkSUK-cI`P=wDFf_qI|sd2y?TA-T%{kmY7#+IQ6oCd2{+eX1nJ z4Qo<=d!--%q;+F}*lGs2vZwIp*=1k6{~M@6q6-FC+c9XNmvC8uXK$TZFZ-DF60tAN zAl4*-uxplpubBaS%?u)&sdqKFYvTp+U(Lb;V*idod{cvjznn+J6iBLYs)vC~uTdEw zy#j*-?H6WH!=x(crm4Ep)8SiPj3-=1w48H&C6G#$B@i0RprM}G7zErfR2R+!mOzjM zg8=Dt_pNTI>B*y?G!!1x^G-lG9D8M^rl%$s*jLba+Kaq7+A846B))zp4WjkKZNm~+ zd6`4Y90ozodyY<@n#9Ea2UW)W>E8CQyJRwWC<8F4C009widwaWpY9y5CgY1XcW*bK3?9pj%e8|am|w2|8r)>YWB=n z&3<6J^|n;ces)^K-n;iE0MyV=virsAONRVf2OwmRl9;`GbA#u4R0k-ld;7#4^@eTy z$qj%^iN*0L9}YRS9^hUXdEoXkfYqJnW>SM3{HX5!=C;A{Rt!;o|$x9j&E) zCnkKvIx}ckL)D%EHa{|7eP&kw+l^4kFx@m6U?rY3`0AWDmdS;c^-hsthd~p$3=+v3 zNdnV11Nc%HM9I~T$hdg--1^_YAX~8gL8Tet3*5h}Cua#n<}fI$_tzN&%{Hh)+FzEy zh`^v+x$P_nrd%B9lOn3T)XnHvH zuOWyf(uYCsqkeFiGia)vI}H398&n}2 zmLR0hb5&%g<8r3b_!pCy9F8=eEJ8J38=#~^_-`z(QL<9xtB2344S zl!Wd9Q8{Bh`FXix@4O(ZWKTPlY@JpELGS)-?##SO`f!~9SPdMgcf7+p-K6PkNx06d z3T^mu(#+PIoW&A?WH#LU@R3^+onaW;GxJ@aE^G8}QxuMye&;>D@4X@4N(0g=BlH1P z#`taDr#FAdS*am*d~BmD6Vqy+f~we~N}_n#Hw#`YBgYd$rLsbt3s}81$5i4AcJ_s$X<{oQvDQq#I3ujB1^E( z)p&L6X71QZaABO?KK)|7!JpU_vRkwM5Zl|2>mJeSPk_qxRHa{^_t4hj0mlLExl4gL zM;pST^w^Sh~+?2i3f2tkT3le1tl>~#3{R&LzQ(@$n^M^p9;SL4Hy)^2lsB%98 zBSR!bpdyyICq_whA6M4%;r()ewW^C0MhrslH%OF`_N_SLN2;1uHArAmWC>S0gG7`b zgjpi~LxTjCmMj4ub15KFtMwEcdsa*K^ejedwNk$kZ>MS*LvhiA48W!5U{-}&y%;zb zw$uAW{v(#CEf>zdUjVCRmcU7K2FR<$0IM?v^oS5`NBGH`-&3;>gN^q+74Wi`BrRSJ9>mR>)6TQdiYQy}|~rA^ze+XH||5eB&BhC#?ArE18^ zg1e&XJM$ejX&4|JmH|vC1}?oMV1O$~O9A0Imf_xFDc4hks)+M)YA_X{Z&b?)V^#IL zl`R+hYPAJ;6G6HcFo>CMkZ|TEQsrJ@kO-@30LYBMh2!J^gNo8V7PGP}T(_k-nHx^t zoK={Yos#LZYANMFeSLmGpS zPt|iUz_scMjIn=boiz?9@{2Fb%n>0?Ma2clc`3yODIyJ0kw}1Vy*sC0SF|Viip~p= zZhp7-#G2>FH=X$}0B)Z=c4=0NmK7HPAmi2Y=9i!Ou9Fk2Q8&!~joUkMeE3HzwtNo> zgoo$9eyqyAo+khz4?N#vtBQMxwToSR&Bh@Eq9KX9?J@3~<#Q1H@)3U=1Rz=7`}`T`!bZWXcBR zlZ`^p-N)w?_(gmtohQ}@#E5;Q#!G!7P9H++@z<03hpiuZaN{d00pO*2CoyYZy^3!; zAYZ+ae&yDuEzWR;ZWw#rI)o*z?sWwc$n*1X^4fwbCl>=CUl9Z3Wc2~Ef^IK^8W&Zq z7~sGHgV+p{M2P|5NIR=4TiGBH_KE=nKWPHGZ*m#9oml}i5)q4;S0bid=X`>#+8N(` z8cA(c_PNlZ z*S1t4GK)dr2!n)Muk2VNHc&~l-F~)H-G_cc;gzBc0PZiAD66|a1J7!MssNJ&%y?Gi zudNOSVXX~i)G|GwpZqj#FROxAo&hrSDWDrknc}gzp4_CdNq4@zv#LD<$~BHXT4?L+ z$n~k!=RFpTR}LHHK!q*8-#lN(0eZOKTC(K!?HX=?GP*O(JG%PEGp>OEck796&d-mW zyf#Fdn!-mJ-76zWq$*5J@jQ}LkW_-J4km{t@0e0SZg5(4#Oki(@1pH_7=8SI&<^vS5Xxh9l77me{bD5*_o{}uq~24O8Pmf z5Mj*#Nx{3n=)K=x&0JO)*sW%O2wn!Um(+7Gz)401epd|=EiW5@v(}^P`tLGG#L2fK zR&FGL#>xPxv=|^Tg@H$V<`^Ilg#pfsGr(A{TR+i`bl#T!r+tveb6tP%!%Gy8n{oVJjNct@4N0MS(pf=m){YqLaD8ABPdxe9dl zGCFpx#A$MsxNa zVgRrmxeTQ6U{Gb4K~+dk1Ar%lRmImUEuouST++BakrA;_+~Z*{n*Tp;?!p-N)!nHV zZ++{mFlzj$%GkNEa&Y-3zuJGq$9dSjE+9q3Xc^aqdaSH#~Md{teUvaYGFJ9#N_o#1I8!r{DjjQ4quPK)iT2O!0c*3W*Jsy8?@HdW2q5l31!inn zb!NifI{|R&YsAle3f~>_Isp9Y3<7>rs(N2ceW&5!BaTF@0U%nNC9pTe01+e%5GcX` zh6V$q&u4(+U<_i~8J;8PwgJ>_WdJTcP^dEWSC7ifPV!{r<>gqrg$2@bb3QlUWEi?h zsXy7SuY1?~|Fi$HK6kZ^3hcVjF*tAfL;!>s&Dv1BtJ(Nt0N6#Ie)5$z?G`xeG+f{^ zZcE2=$;V`6tTIBSS4IS3Js#Dpd@E;hgaZKi4<4QI>GCv`fiaf>PXDF(H~b_d;ciGE zzc2$oIfA;q3=sCw&z*hc!r|Ibh0`DmqTjQBBaYRO1k&pHfJz1lu%ATM3qA&{FZ zP7~cR2?j5TU=>_^^P9jQGo6KU_*V7c`PWB>jP4-qZhJ!PW&p@SmHB49C9kfiVE@dP zNKq0D&^?lp(wp?&b{Y~MZF%^BFO{mE_qBhv%#!+$zzyaM!rB`o%IR9Mgfp>I8Cc-3 z1l*(y5Xiv*E&>KP;lv<7j~EQ#J79nex(vdlFGtLp^nmb&GJuiK08UQ@bVCeJ7Wc#1 zXKCeX(HVw$9fX@3&VQG3yn4hw=Znhu+U?yttKL6jt~3Y0$=gj|SJ<_Ao-^R#-k79I z!wy#o`4AGgbF62dDkYPahXUY8E(4_Nc%*J^Y?Q8#K4N?JF3LJf~WYfvJq${%2=(RX+ z>Ys5N)G!c}g(0UD5W(8*g>x)3P3&e{x$LZPQuSD+erG9YU;wz>v{OuI zi}q_yIhA};NiYc3TLui!!WkgPH3MuVGKd^vC>;JymhgYkAc44VC4sh-G$vEr0W2~A z<`oo)K(nH;wgRUu@jXg#QGPq`{VBIv$?~j^6LC!y-GA+Rm(C#KeN_enKe-GMc|l1PcCHynNNl^JTKzhC*hf^ivnB{)Tm$U$3=^BH}HglVdv%i?~X@-w8pV0|qlupC*l-`|Dh zmf1hEK%`!>4E$tH?@zlW10bbxmnc`@q+J&P5Dmnj%qyyJ2DoB{0kUB;z~xp9a7c~; zu6Qg3L`pzA482Qgy6_-~7!`51bZ%a8dWQC$l=`)J9SL$m6@dZt)VL#y0kSGHKtLLU z&`yT;gsXvAqR}{m1P(>A1Z-gibi+!JQ9>dqNN#4TN95KiOf4wUp;Jz~;&5y1#hrR} z=Bf$1zd~ccMWDN)UpV~hj+p@1wR$_S`{4bxs{kM=_Uj$uzHadTB>=?fymZm;ctVqB z0dO^Y{$FQj1a_CBr`2|m0wQzG;i_*8d<+su&%nSV*MV*?gGx7TVR5o1_1jt<;x0lJ zPJc7NiAe_Gdkm@&n#&SclJ>m+pMFOcN*|{6fYsqFA`ntTmBA8ldNZi{xIqFg0+t9} zV~~iNU;qd)_EDv+2nNxC230uj<|8qsw1jThQ6sZP%IkUTpi28kPJ8CCtC%ZF%bCD4 zXL{{kYX4=ualifw?CM>q&)UfU>~XYIVEuDlAHDj02qcipa8=Xr$s;#^4G=1ecY9~O zTj{B1v;P4I>Znvr+Ay=_#<))bf~zVp>RiU6`8S+CQ%g?YZZD_%LjV9L@54~S0PzZ( zSPw_$d_YfCD+WkD#~|!)gG7k5AAM5_Vk?_fVHc1AELH|^OESO~Fax+I7+^PnfuG0l zfC%?x3HbRG(9PDJE{-%L=cQ+-iVJ|)&BwDl_FRsAU2XfQ%8o4tlWXs)6Z4yVE%%=6 z<}4eq+xy{PXM%1G&#|j*0i5E^ec;V00rQ-tYQ%Hu(T3hE%55Fr1riZu4Iox~!Mfi+ zt=h1Nx{!!(s3aH!>wO3Y*a~1!UiW$iWgjqZw($U$1Dqk>xM9STjRkYbLE(CfjI4E z8x`}`*XsuTrwq9w6W-fjZVuegU9OldiAb+1qu-BOOPzK@2hQhH;#u5ncWq{NT43N%_f!};X;j!Nt0A^iQ zg|p-gBIM42+pBWD3$*j2Xx zOx&WtJ{MpAS)!(CSwO{5nma7Kq0dZdo1J`s_T?WW3%OFS_#0+pp8-tqCVt0EP zc$ydr57+YmOCaEp0lE!?h7TFaKr94HlpAc4&^{F(=Jm69IesF)?ej^oZhHo}0EPh)V=$=_+Vp}*|N);p}CTSVr< zYu9RCt?qn|tx8o=|J=5Pr``vMyH|mp^)IxVI%73JLp`xEfR)VvSyvh0l5qx+Z48A+ zVo^o4!jhF$A<&NjJ|Kg@6NbWL^csdGoXiJQD=ddt0%zwKApB5)F?L<7(>DG^esRg8 zlRYI?WQd5LRJS79-07ek6oFgsFZIvwzgHd1v|2>P-s&kg^qVmxe`bpPmj#fFYI2Xl z7lQwg?ZX1_hfEk*G{0=S8<6nZpj2i3mKfUcwhI6$x%veaUfG;h6CgTMNpz?Z@y^LC zS$(Sv|8)isBOAGxb4jASwAOtAjs~#=c77Qk&ol!hU|@hdwtT>R!*h5{&w)#vl`3m= z@GcVHT;Eyk5q_&;kyj#jgzN+6Z;nunQ_W{xIUGF%uN{}RZ67+Y=3~{40w9C_!XfWf z`TCsPD6qe|o+?LG4QckU3MsdNUe2W7{nKlGuTO@m+Pa4_sF<%_2?I1A1_5$eCBh%6 z3~b`{@BI3fL6xM>#;O&3=M3O&Vh}W3)rtWUSTk^4G)RPuG60;QWmOmj6wu#1^u7@p z#a0xIt+ZA=pX)cYrEuoERXZXM&ar=PeO7EAe%?GVF7y4L9iZJ+`F(peIsZ}_ z0K`IMFTYiL$*H#h;1V1D%paMp&U664VVMB|b9&zwvBCk5*#8t)JM7%Ec37d~iEMPA z0hE)i$X5bqt63E?P%)@<+E7M}G*W%bK=u};N`H&cg4;S09P% z1_|6=;v>=AAmN^80A+N8WmPzr!2m~97zAn4hXL;HVGy8A1_pk55v_o3ml4InOw1N3 zX2l}TejsOjC}+FKtAIO2)9-PL7VHt3^X#k(!mKCoe)6VD1CbXIob@mI=i zw|{0!$g)J@+=Pr%Lu>2LP$`SO)j%%>o8U;KsmD z8acjYAjpFykYk-eU@i5o7~p6u1KbSA09V*Bh>#PnZ*{Tb$`T0DVNhNVfDGVVQb4z- zGBOFMCpUGBII$qcJFDS1ZHk9G7zURgtDD|ypS0+$7Si;8>OE!EjeTzS_KNu4xV>-C zk!6eCcxXOAxg|=XYt23H6||P!(^7@|Xc!=Jn?Zy&a2VinTLyI(84Aa)083!MkwJKY zK@}XFEPy*Eht}ASYj#( z-E<-{#tMJu2$AkPRrXM4RP*t4%IV4N{q~+iRmYB!)1%dFkRP=GT=Apk1* z;PKg^Pdtk+hifDUj9GN{yD`rIAYO|BCS3;Auc;5zX>FCp)2~T`z^YY*9=sSJaFhYg z`!GNV2ZLB`m@vRZqJVzgK{>uFmPp$okv>zq7wQ$uw>2J$EcTPV*#c+|BW6w=xBGxx zI9VXBj(P{3cfFEb|D>~G!Jdc@kb8vU2rNlpUS<$@%TPxBWd>00DFeX3$7LX{i2)qP z3h37vlAf0>(ihw1I1Sgw#M3YI^q>yQ>t$WBe{Q|Efc~n6CqmBe?>JMMxb`PFqriwQ z?S7d2pnMQpLOV+s;OM}>cNbj#?c5fWflFl>1bwZ_U;yiZLFi~D(fRMrm-aj@>uA@i ztpUVoj}uE^dBwn`4NnHRe3d~=lA-XBdIo@%8mq!tbq3Y6amxUXB?eeaFhGVS1$0vi zOBcD`?Ko_^*8i8*q=&&Tk2Wg_e0YuhbL%T0T=&y0XHSp*KpJi~sIFc_%9@+|hIPCf z5)ryJ4GumzW5ermFtH>s+A%<;lCFaa-CgtL%xFmRd5Q60UTE1U8&u*goj<0X3Izz3Q?E!q_t9UG-;YZGaILie>Gqb)cwoZ#lj8vV;4#PnV(4onc|#a zQc*@xUhxRIjUx-N61v9OoiffY(CT|Q^YX>-%e&pzdyfP5s!Ht{JUzT!{}T@QNr9<< zKATzNn4Cu}RR}mAH~qzeUdKB_B38RWI3H)g4W)_!63H+KJgOu(B_<9`F-QzFNWf*p z5)rcI!aYw}Lc{MjsDiVMC9ryAfTQOOup7uAc$1-Uq}Nvxx-H1mz6Bzwm~h63V-{m< zd8Z}#M836D1$_SgJ=HG;l-Pe+-_`S@0$X~{nEtTLr!5KV9||3*bJK zN$b*@#xH&cst{c_>dIq{GRjDIi6w!<`^o*Q)`((ngsW;Hg;XD)`IqRZ0;ks zDi0k75T=_^`t#GKOxpAo0Fn_T9bTDochw>QByQ+m?Um`pw&V@3lxKNeBATZ4UVs*D>30wln0QvSAU}4Pw zb2=J!{$A;l6#m{Ha)-ZK)!6_==t;kSYc5PwK?Bxj!j?@bAQEnh+X8Zu(yi+P+UHr< z2G}Kwlq)2UFv*TJ-p=1}LalX$OQL&$xQtKS-j!3Ft*$i}XJ`NW8&NpS1qR3m%b?sE zRSyQO^l;1oIiwgk{fKKNSJ|kp{u*I+ekZX$k;@+EE3jh#W9;cs!|#6RT_;EZ+3G); zw5Q{+WI4RpU!kjdtk>RHv9tb`Q}$mL@V}+NOU=dwhdlix0Mb@H)#xy zX?b#tblMfW2O{HD;h)!E-L1+x8HZzibDV{o(ed`Y`MtW^KeIqBIZ(U3W1raRdaThe z04}+{5m|5BRrs`bf-KXLz*R~N{N(&DGU!#lT6^O^%8engC0zM@|Ee%lWA`S16&ry0Er$Mgw{5cflYRn zh+S%sz>P305glWYz@0uU5%iluBC(wT_{)YRGW+wp`rROb#TQFdHa%d#5`(Hn+8kz8 zfrkweesaw6t!|LC6?{SB^9EHo!p?=mZ>E6ml@VfF)e2P<7g%N4I-TCgLFyRgFE+n@ zwfXJu?4Mg*$h}Y1W>wt!R&nbe0Kj)BwElamvH(bXJG}YA=;jM$ldx39by2Fi|J^0} z?=G>Bz)k>zh&~1hjPfi2BZ>hwoEQX+FqDCPbe5=c%peh|yD>}P(qabA8Bcm8FgRHP zM|~C0-@0;Ma!IC$M$8^7f`p2!yivjvVDGJ`<;k57=i~br%G%KS{F%pRo;cMP9|qYc zPIs=7nY!`?fY>tX6%0K!wOZT0-2mL{73lrV+`sqyTnivj+guES%P9$VLc8(}0Op^M zL>+?!>|vI`Ry+e_vS)zFlmQH72Dn~>0S@0Ppg*Ns+>@D`ua>fCkb5APzPWz@?rHkok)NJctYuR;ubUz%dF22;43Oiu_#S zR*53VTrEYd*|(mdpqjl5AWFMQSXHBm28qz;3;=PCtP1ho3_|WRs6r?XOJK}VK)1u_ zf^<)s7*WTK^%Q2M7Wr(E)U>xqYTCtF4G0+xcdUH&p94)F1aNOsRoWKv<(^*~Yy-fN zfYp1yPFs>O7og@&CGmW8tty#cNmI&hq&lADsUNn?{3OkBrB{^eAh&lyUfuUTtrHDZ z2=~it*!afWcV7i?KdH)KfW+qv;45H&;e2@SCHF^XC!q{jZVVEesKOb9>0yuo(jPFu z2_y!7?-|O7&;fQV(Q>Lm0`cQ4fuL^&(Q;`hyax12Fcvew&4>)J`^6wE#86%5v_BP& zBc-g$qk9blwm=Q@OcG_`k7riib zM1gR-*}rwHSl-(7*X`u|GwTNSx;D)Ix!u{MKgsR=?47DdTfdS30Gl*t?`!*}_dNm- z`ilKew|D5H%R9Yytr`H54fLM0yUEhta;mY)KxSeFfnKHR(Z_e(7xsi>RN(|AgHZh( z3}Emuz%q#e?!#mNi;e-pFB!lk$pAhU25=%Vh?2vd+smN5tMt3l%^^md@)Fm76{qTx z*W46*E_d3i6kS?+_aezbRD=8p;K=NIOHS5NE=`rMK}I1k5&+ zQU108lzZ9$a6pdBz%a%DcMda%)180;k~c7L>4hKzEF>6&N^8~kB_aU`OJF;a0gfOr zK*l}>*o|iZ`-8-8`b~goWZx50SDVBeTd>>vS)lv<-Uy_2PhIZ|xKJgjrqA?nS!g z9O!a2;MWOKj|C7xH2mmTz2h`M0^)9qyd z_c{Y7trn?rX=9ru!mb#~KyFKxNchztfeWly0(mDD(4QjQx@=9HNf7={Tcz_Ed>n&A zRhj4RzP@x}n{oDE;tJKMNAe1b#9l}D?Bd)MY|-v}`R3JnL%)$f5}yRu+l+d6!~YH+ zXbFJqELqzJW!L+26hN3Z%Lb2}wQzFw=Ku%;^8wllVSo_Tt{+~%-gLkUN0sh23=oOH z0A{iekSif^K8DJ`LX|&962KXFMpV&f$}RV3fDbvVs3(Vl!0?f+`^^)T7H-QEwDOiY{` zBbS2q=%Dvdw&uRMblIX$A%T9lWqq?2H8)A`wI$)wTl|~f%YLb0!ZJwU4A!O{$HULe zlt!Xm##s9|Ztv<9lV+ZL^8rX;XJ^sYU)B$)#4;;m%q?bf;fnnkO= zg#;Ya3=nF|z%|_#_EiPP0!turfI&U|u^8Z%Kn9p|8I;pDI|D3)7$DYw0bIa7V1nVv zaq5*N%4x%eL3n&=Rk{fU-zkeUUvT9#n1toUjX#kqR%^^jj8R&1{wWBp@p!oXmjyi9 zY+!J=bl{0?!_{w$IDAx3K2pF$bvk_@ng$^d?e?&WJX>oKkc zR3VWBgP3dT0U4CnRtE!wATmJq2L?F*%E03`6pphd@SLH^=fV+f+@JAJ>fCH{Wqcv*9DSVMaC^P+=>Qcv zsh9NX{_ELKhpq;|B5&To*RpdDN<+2p}w-ffMXX5*Yqi0++8bK%!6|pch*V;7ezK zCdj}oO*h{MMAA8ya9m3CfQUU{iReMbgV-J`m5a+@m zOna~x;KC6Gfjta`!|qZNx^+e;+5Zz6%JMvg`I#f+O2uiP##A$x|El}p-G_GD#o0ri z-p3mF^}w5H)ei$iELK%wfIwRY$d=uuUb(wYzw@6mf|M#B;4%QT9UqCQ1_{Kwu>_9$ zF(})xv?~2-Ly8KLJ?Y6dbY5r~dtq9}{;$@1gQ;}!v16NlXw?k>2PP&@xzOS1*{lg3*<{DH5`=gH6iRCm?Lq&Ua!%1MT8M?wPhP{qVZ|bNd5I)57iD^1u@JeR!xTL-;-(Eh7bqds|h=QH)Q&H}&-^TznJ=Mu7-H*$AEv}^sFY=4;TaYBWvN!R%cpaGskb5TnHaQ;h<; z;Y7*Hgbi(`nmu7T0|=6I?cMb3{m0u)!-vL#WZl3=D}Ps`EdYj`xi9?n;hxv!Ty1R$ z;Is7_kyntbp7Vu6%bGU+eG8=9%ckV^&W`A?{C{nwm1wt7z4T*HX|z%`{<|7&{_R`> zRhV%YxaGL-_A)@2LGc&c{Wd-8>_;R4OW1{q-0!oXkJ z*={cbm+sHQT)TfBpBRQRqQ6qrWza(UX53x|q0(^i1qg9s3HW*$G_7hV91|f+B+9Ps zTR4UvmcT)9AE5gW17vAn5LebvU1X7B3G`|PSQ9FsdtCVvd%*JKXD8*R7LHEJ&Jvzj z>j;otvSWns>JVEGCkNb|v*WFY?4MhG!6l6daYUrS?R~>~%XNbV5KQsLlO>m0eB=Zj z;JEwJ>h0Da+Li=W6+Tdp|6Ii0u8Hb^pxxi}#5y^!+0s=>Vi7448-ChQ`_%VOsL!RpGHb4R~5)81sNSlzdc4aqb)WJ2546roq zH`^*inmyJ7wmz+%oI$8IzZk&D#GqCygDQ_+!mtDaXc*vdDg)OfLmA=n(}>gZ^nigU Z3=-u+O9S0b%cz|;vG-e4EJo-t{|Ci*DS7|^ literal 103804 zcmafcXFycP_x1vcA}rmmaqS&jY_Y5~0i_8j_GEztR+e4d0)icT?_HzVdv8BW>@ihi zi-{#BnizXx5;aj1-)HWWyZ4Ik|4XuX&YYP$<@7nT^|7X`-KGf|V#qgyI2|T)NT|(b zD2z4P9mB?6thwZ@VTFgrEk;wuZYnYk%hPByeGAHv|DsXlOsg%+7?NR3&j~SE(J(#R z=qSuHR`FXHFz!^~ad(YJtR^7cV9Q9fSC|G2|IArjT@NZm!j04RHO0o}Q~LeIar}E2 zGK^-j0=gv3n;6%cDvf>_J81|<3kbE_4R*W9f-eBIylg(M)z!a0Wcia00Fza*kIi7u zF*MUfSa=5CnnxBI1!~Q^Pkh#27pQSYTc*{VqYJYcEa}+=26K-1oFyKqH!AGz z$WeVGtkzszYPQLqXS4~VMYmd4eAc21N75#m4Ovc%(U6ISkp5MxU$|;ymzxJxahwWq zR&$2YmhCj>FobyruSTwaCKl8;7OQD3FxYgF=6s`_A|Cbru}dDZ$ERaKt8A4O_q!_n^pe0=^JK!P&{Q1M-1v=bznk~eB>x<_0uj@+HCuIC8rq>XUw(QOa?O{+8x`8Q=Iaw zTxPMJ()4->4?OarHQAV3f^iv|DqHx;Uf7fO7#ZOD868ZH3#OMN2uNHrDDe z6Pi&bgT=vcvK#z5@1vUoIF4VmK|210y5u}*c$8Acm9oioVthDOwK%8QVIZ5mpCR9r zYbZ3}u!ZIu90tDmKH9#y__E(d-axS?yi%hK$5Vo03MM8JJK7F*U`(^xI9`0)r_n2Kb>MjZeN5>lvTYJFGch%mEJiMB zZnMwo>|ess0>iBqiz(ko))_z3t?7J%BD(dM^mCma9MLD$YBOgL9*XnGXf?g#S$#vq z`y9nDAst^~(Q!spI+ixkW=c2eteLv*5N!;nX1kYd`~C8SQ&LPD7`WiED!iZwY?!cxi9lcTytKF&V1IE-$;yk*Z79tBuNA?Z3 z8I5^l8--_^gg{{*FbwiHK$gEu$q2l?YVC`$lR7{E$8Z5mcAhU3i+c`Dfc@ZFHu37N-9WG>2C;`zzCZm3zMAVG@Bt$b8}66z(;g#=G6H3e;m;} z*b@ovo#O4lF8wO{J{24wp#hO%zIS5?D5Od94Ro# zU~Z<1DJn8Lbl@>Yo3&5^Y4vmdsdw;I0G;&mE5P8lW}nph)XN zi_*c9xkQ`o8Def5FUAuP2kvfhknx1$kjPAI*2u3@P8(-&g5D7j%(=QqvQb!ZBR(FKg_K@;h6s2ot7-DdWb}ex`~Gj|l@ACE$ z*qnS5sqnnRtQMn=oqxK|QzG9#SpGmD@33l$5mX@Mo9RMr4pSx(2XPplSiGbP&o^1W z6Fpao9F_;Yo$OsmDg0r!l0Vqj^lbL5%7}JCE710_T8LDR#zzT)-470X)nnK>K7gR` zY%+7`5Qs6LEc4T_@Yg?7IXsMG2FDwV4B2GELu%z>l2T+o-D#!U*souUU0pfWP-Mub zYe>`tQzn#a2w*nM*89DphKyat373x}R-b$lRbVY-OpX~mAEz~ouW;R^b*lMlf8-=8 zN0^}P;}GRa0u9_OH_u?o;`5@y_UjIdrVvOL3noYi8x>Z?NJ};}bMVGwr!C(I5kmfA zpP<6^i!)_Nq6m73i&CJ%@`V))7B8_KqV~}pp+fRW&ND(#Bw~o_-sn=SfQZ=zv65vo z4Kvww>EO07m~>f8`;p~PJxLC+-9Y-<#CkljYWj?0{k-|)1w@;`ux*kZ7j3XXk79Vo zC*<^gad0lhBLr$Pz~L=xDjclAOd|r=!2kziPu;yx;=(E@L)YpL*1GsdbdRrPQq@?C z{V&>edFr1j0}e94`pbtME}u>T4oxt(`jTKurbF>J%C^bJ0h13sHuvJF+GwlYfnBFdf%eU(Wy$`3uXfaG zpIZIAnr$X_8$el$G-S>w=lnbG{Ku_RIaP>2lQB~gEl{9^F)?F8ugJ=OcbDnX zL#owJN=^H2d8PU?;3(^Gl3&q-Kd1e`>H3DlfR;vE2=#=sxUr2LX5IT`Ig)3LovbvY zFnZkgv$nX=50HjT&#+dX*Y~ld=C{l^C$s#JwfN}8d$$IeFL81KIC&X3yO~ZXH`s`R z>-X8MS#In)mg5DwT4Yg1i%D>U6x)dwx<`U{1Se(}+Kj_so%`gblY^;8S&1vG3 z(fY^W&nxVv8<22$rr?u>iZ@8(Af&Z=6`nsB6a*FJJjpVTQlSOL6W&S~2^gp`!{89- ztnQ~F4ga{bTpm4D&$Rlt01@na6#%%?!VET;d^R#tB69eADbUE+@0He`04}@>K#d+T z6qyBWg+5HxU%`U7S}f6$`A{{9577fJ?J>H5TKzW_zj<2nFB86G6kXXU_Wn9`%HYB* z=`Sn<98yO3g<_2cC_ivq<;fCn@Au2%7d$+}F@58qWM@Mz>AFK1ql4Azci(wYA-sOD8w!2;Lrt|=U}YGc4w%&9G;P;*Dx6>&LurvQbDp^I z!1}+BeXvmma1OVj?u^88ErfMlF$yx&fgQ-Cs6sfe9r*Loz`vXEk^1$t8E~$^l=G}u zR?dJ{Z+$fU^9yXhI5b{;pdLYM5V~~9?rQyZ+;BP6oC}wjEp5(JsVa|=3&@fNC$-m- zpUQyN(od~^W&Ol2BId-%fVvDYzo_A72Wu}80JokDF#b_aK)ua>Q-DL`-3MkS^s^+R zIA&wr>P$XzWr}F3>BE|45Bnpp!%@L}YevCSiIY_Te;WKv(2%jcdqMF?HraCxtWCzh zbw8w**(9tP!`R;5Pag?=&i3_P@}4}R97es* zg+3dz9va zQZ`oLxE|H_HvIa(_6wIO4qkxWVa?4e)WP7lLhy5+rF`VL7n~3xN6syteb9-O*;5xy zX9gt!crn0H+nMwe{V3y*4(WOZ*z@5R-s3}_$zQdb0d~2KS#U}#3=}_@CD7A|_78<>uIG;r{MC9sSO#2UfLTMnKHNJtS_T~FfI6nIm_05h^Cbh!Xt?Q*zsD!i z7C3-mMi}-M;t}8)!8B(=jonY^sl$|bM>!=+*<#8wG8&UUd;dj^#%Y{}Ul^t=ha5jh zWw^8%)`ZSm_wD(Nu7I>>t}?**>eVhx$e_#x9cYtb@uf??FckM?<1 z7{Sqk*wRC>Bi?-20%ooN7?*zbXj9mDj;W0<%!6;rh{#tF3=pzjT77!zx_Yri(>YF1 zcaseUlqCb^Q=kHB&Y%`gg%p~5PU9g>%6 zvr^3hN{y;RD113a$!XS|#CYh~O7Acr&M?fB3qJ<@b!Kb2ti`Kn`u1`f?4}Gv98LIE zzKK*wRr(M%geeJw*UlliEG65Nvg5bL=@((Zh9qc`$K@SZ6``5KvbPhDc4DE5)u{&H zot$mT$Jr*ES^2%P+*uE$NOE}yea}f5r!009o=>s~xO6#|@FZi+CLsa+A)GTa9o9S? z83+7ToF^RW?0jrL(2{Qe-(&+~G8qWqU@?T>```)figN>waU@T~z2L-Sqdr*cT*aBg z8COJrFS)>!=}0rf$cKZ@l0nu$XncFV@cOh>yAL>_;1t6UQ#u^W#w=_}EJkF8a5wB4 z`Pa{>@xO3XUy7qkCDyW?_r2-qq)HWz2=P=S6qbwG1Whk;7~G*aOoV~SOK{+SE~P55J+s$#K4o?dP~MG z?euy)Wf17Ls^mk5c2r0_Q{)dgO~56DlC^kPnIWqOz2-!Nx zy}a7L?m}Jj2g}GNv8`l>!Hn1>-z^K;Ce{8Xgoz)A1|Hk2EOIE4oEBMEo*6!-#*^|T zyw?iJIfYD{WZycu-wLiGMh;0 z6l|<)*hNlaO0v<}SN8w*ihC+2g}|kxJ%xci5w9h~8rm&x>XOdiax4g9c7$TFs8|w) zmXmI8Il6IU84VMmi!c;e(nwHF^qF4i^tx@&e&uLBVZ=RHs0+n5<{kD=>VB@3KhugZ z5o}m-@aiK1DNeWwt+K@4tk@zL7QA{E2n-j$PM55qyL!&4!29*1!6mX{kjvu8wt3ij z%)sI0I96ba&E(9@lg>~StOFO3sYFB&zW_c;Xvc;u`CIG#;QR5lFBmm20C%lKSgTh6 z9GdbZx@R`oxl*74`-fZYxmM`2M9)e^46Sr3LHH1SIoOsICrmPAWOF-8MKCZLK4HWf z$=AbGf|&O^5Pjl^$TX0%DbBBg7U61KnNzw|=NE!;W)>>p zvUDneM--k*99>MW&8kB>3g>6Ce5xaPBI-yqh{EblwPdaScu2>CzqfSZ!`wx&_gvYw zmj`d8Eyx)moE$19mRTfhA3gXoWjh66F}fqy2zndInJ^QUBDU`OFFf-i4*PP% zpkzZH{MY1U#FcYX@o^i~|P~@N$ zG}HBg(3IlqiG*GA&9gjv^W*-^9sO0vU^iOuor(D1=4; zzGg`0RObA%YE8NCTT^7R%enVzR_j2gS5La2n0R4j~XnXboj-a}V*} zszf^t4l@RgV@Z-T)UGZSx-T3@WO-6e4&v~WsA%;Cm-2e7J0r_P%oJpHx`PNb5$MS8 zvcJsVe_O=J-HTak=l+7n#|EF~Bl4FyV5rmK%%v@~`k^BxwfSR?u)BOo-XGam2{r>l zn2gqt3C;fMIXRxw3QUH?v|C_UsO@P5BALf=j6!D5&L50A^oCRL2{UA7O8X>Ia2kXA z`J}Fg262=sIB^AJCn0!ilu{RBFr&FvYGG;hD)b<@;Gh^{|0v zP<0khS@dv{I453l)?vC(l9g8)91YzEmIi>x;#o5~?0@9i@#CzbUm@9q>_=UyQy9Gr zLFRl*Ni3)UiB8B5vg_<@nx$T4&eurde2t`k#hyeapdp<&v5<@i1zc>Oy?I+s{`Hi3 zK*;Fh*y#6qo}O3s&p&8;vPkP0V9(t*?XO;MA_I0az^?qJ?N)#6;wZh%06W8d&V0~M za5zLjNm5QT9Z_+~T0~f3P9t8(H_{H5ALC?@uV9g zqjo%9&3o{S2QL-&aPjOX75fYqs+WJvFz|0;gM|^JO(>8>Q;(i`S^g(Z!#|Fgx5SqL zjWtt7%Ucl;HMhrDF$UpUvdr)Q?8W!{1wbe!S|y#jz^6^B_vWS6oaIWMaJ(RuYYx17ky`$rh_rF^t-k~`JBcOIkGxAK?M zMmjrEG<4(U!2pR39LHXS%R5DAi9Ox=$1U)eccWWh)*^D>m(@Ehq3SZ0Dmd9}AW1h6 z$V7o4fjTj%-G+3!ce~DY+AF>RZW*J^L5(_X#j`DF9MmwQt}0og`q+yv1GnC5qxim5$U@o;gEPc z23}F(dlkiKgh%4aZ;h%}j;$&KsP%$i(cN^f8vR{39XH8${r+Q{@|T3aJE#vh6tWbp zZ#!3Zoia7N@--D>60^-lE|HF;)gV(uHcfYa^x2B23-##`@G+^TBB+%_&ER=7?9;c; z__|W1-@`d#01RA1fdT26Bwws~PjU9P4_`6NeG*eV$kfw~q1A7GlDODYOLYWEX*GhMscLfq}};e+?1ESs-OL$=rRSnM#{z^$GxZQFYYNwdY0f?eFWc0)Z!gZGxp1h~Fs zo;3RPg@`_4tVu?gb&?m2ghl0@nOOHm&;9Fab39)$&91Sts22BUbohZXb!n>n*)Th| zZ0lM6?moGD$}QmFtYUn1c{pWrm;$(*pqe&Mv?8ejiYgLxa%G*do?G)f-D)l2L-2>@ zWG0KPOU$-{!_&=^AIsOA+Ao||Isbdo$hT( zTu~OU)gPI-Xs0&iW6?q+hipF^_Ph0i1$>A;5%6;2kmnVqIk_FbEo#o-Uu>`Bwp4&> z^;?hEpYYQgs_~GiV5xp-#D9lRgi>p;b9SJ@^_QdL$$9W1adxuRcyr~g-Q7iB9;2n7 zTK$IV8|oho@e%;dK?Yc}Wk}rypA44)r#PVQe?98<5R9&BZwv0T5a%H#7J9NF58DRz zv9R=4&R<_#?PfihP+LZ5WmfU5s{5A;fSV@+EZ*B}#N+?U%K*xFwE6{;)@6PlO%)eR zOeM*H0h^V4W%z^S5epM=p5OKwpEui2sepG!I$#yS3XwRs35JXuv6_2(YU9s5W!=b) zYW`aNO!vF92APG#@uRD#R=sCz{CLxVT0_NnHIx$|o&J~hO%pzr-4bq8pd%F}VfM&Y zdt_@b4x}CwBESS({zD z)apW165Usxb?pyP|zA{4$--Gg46#xTEGUg*c15wo^Tn7;@g+`ao zY$$L1Ml{#_EB(~!6#y)r2&IG~RZwzDkk5Dv&p+CT8z+!IMVl&pXn{%*+I^<<7B?BZ>f4m|H4Dwv1&FUe!+s;_g)XAy4qtmu<9( zGbsQHprlmsLrUWSY#8acoJS&d)sRWh>Cx&x?BN}VeJ2BoS&P`?^Ji>sMOi+irVj}f z5Yo|Bk*Lsq+lF!f>wR3b)%dWs3IKMpw0rru2qA{o=v>^3eScGijXn^%04KCaE^-`R z`N+GXku#QDdix4A*;^Nxl~o!7Y1yGP0KN|4ZFmV0F1CqKr)qFDdSqL{j+*IGq2I!1 zL{-OdL!L|Ww4w>=j`CkHQ~Cuma1|MLj{m z?E^+(>37eLjy^#dwKS<*k6Qdus&2qzDrpEn$lQgWZ!9zXIMuYJ7F-)$7<|uktCNT5 zLqoqE>B!GFE%n;;pA3j%oln|XBhjPRco{%7K&^ga_Z8K?=-x~Q@KZ9r_>(GOFJw|~ z>lvwWRlDBtdbCco5UzB4o#=u&#~I7T?nVsX3?Z71JHDJN+j1x0c=mx)ZrhU)4K1E^ zw(+ss0-zCx?OI>wg!!^+UuGO@(a05m1?hupr0}BSiXO@CL252HCsc@KlXH;^S~?Lw z672>DAnBJb9(Dx# z<=(IKzI>3;YRJhkxcZ6JZ8eLPZDmG~C1>&qPQY%uNlpGgtY9~z`N^`Wof@s!Ed3>I zPQE{m##HSQT7%hK_yVCQ99pz}_=^*=NER0B|026g^Y4}NBm)er#oSe4i?UG|U zcQ-~EDY*M*cVKKpG7rqAp^$6Hyl`>o^-Bv37yhwpe&!y4jk?Ppkq9#07Uy0C48vwHtzb3=>QXjDrNNN*fCq z-nDlCJm}P^MvoTmo!-@Aq7oppfI%1$l0@Mah8ZVaXH3JLdLa+4_0tH{*URBLHr6H^2rR}W+WX9*iRcKvr|=zan4m?!en<{nVzwn z?o9>TSv@|nr?%BY+5$nAR3pC}XmE-vzpL&~o!NRlHJgY+nha|eS7DHhk?X*1NE_>9 z)$TJBD~^-rTrj;A({>iUH~wediJ$N)Bh?Q3o;6>1|MI9s@6*4e6T_M5{Mwf))-W=~ z#G$DY51%!X!^j0~dM^>PN!-+oPF~;4i#@MYr@fKA$9X``%#@#QB)hEFHr68T&9oKq zCxdAVse?3wrI`+`7%+^e3acVg4sgRA;uKeN z=sgcPYS#Hgg^j=bDjQI4e=#Bo0EwB9IfvKVh}*ryCrMJ;7-~qZIpH1u+et@-&lV0V zHNc%~2MPdATLhMs(NM$3MA4$)xflR1%RXtQQsn0e;8Ok_ye)S z=z%Yw%c^@Tsq?L*8E(?=uUh+`&sxYb(Vec6R=@Xf$(z)rpNiRWU&E$tPrSZH?$o6e z0KpK0+8a`i2{M3?yUVb4KY6@q{)V$0%OwjT4tYqzJ-d75=vr;N$tOVE#Mu?tC#P>m z+9%oD9`sa$Rs1n~sWE&IB}_IeHTwVv|7JzAzrT|K+-TY{#kTvTez*W=8c078QJFi{ z=gZTS>*JILMHrBcA*BO`Su+YnlldqqxO^pch%_5~^z9D#}*KB!~+^R6jbMKtH zw7v|RWzvE(ylLNmHQ>XbQDQ72*g5%Dx6_MWQ-&$^@raQse$aT4*ZI|akkvwMg+^Qx zma|6)14e3(Sh_KfznXL{r-SH1T;UvJ*%#qE_dQO@A6aD%)Sy5Tk@SmiWBW7hI#cBt z94$Bz(PD&&$$<|gRk=uU@#iWnVW)y5(<2bX>=3$LwED#8`8y7L^O_Ien}pAi^+Sve z)@Ss}eRX#GCvl8Glo3HPF_{PaGUh@>D-Dr+F^})4C?I1w!YgE2VM~JgA1pxb=B(_>`HIh_UiOJ1#n#CP_hAFd}K5%pz(u%<5 zbEN!MyN+8M(r9Eoqk*Jn(32*0PNj%ezrWMoxEDJo(OJRAmYv4FWACkhihfy}F90H# zwKs6IZOTMH0q}UAwb*kfczoZ@X`!sXk2!IGgZHXKF zVXykT1VAV`>$^n%R@{}2k$i`Um8|BAL0xdtxnCw;8nd&r0EmmFbI#@5`1Ns=44~ox zk*ckO?_Ku(OaMGONF?JW)2AL)G^B07jiU)Mw@x-XzejGt72)FKmOl)hctr*z zGg4#vWj<}Lq3lXp32GB+_4yZWbW6*K7A-`G#CpC>nIW}8C;&y<;+!u2|Mb5KoZVj0 zjUkPUpN_uOR*rf0SuH_Mu+HewXYVYDVe2Q^TKP!Vk^&htJCF@jfrl;QahCzQEnXFJ zsTI>(p*8h06l5XcHyh?dA8;deWg`VT=m;H00dQ!l6LZxFNn&rPBN^mURticfnQW}s zg;w7x?f1W`z3(Z$$&Kz16#!>D#poy^xpv}aD^$97Q|ZY*Oif-CN_h*wom31kj4*(! zm`iTAAXEWe|LqhIoy1Ob;sb=9aLVpz|3~gc8Nh|^$%W${pJ1vdmJc88HCE-o@(f8;*6%Wy-d-3O2L_Lc!{rJq{;+TdQpPxe|S0OF4BvT5&m%w9lQvveN# z+|I9b>YFix&xsZyM`zm8TMs@t#>6NY?nBmx{jYH$)z_DoTl8Uo0hh-;{kC=v1>lk) ziG{&&O|l&rMnbED1&yNGi>99S86YO;=jG+16L?eqlmZlvl(Hm9EkEH_3488;{BBIP zXs_WrQw=D~S3?cZ)MY((+*$bL)CJUbfjU=(nmX)SUugPJC&}HFO$Y@#SyjpjwfZLa z*EX3Gk}ePF9_v62a7%j!K(OPtT5v9>256`r^>*iilfKoW#XC9|p<_i0I7G-L?hF`H z`M6$TRyLLee7q3w>N;6c3t7OcBbj3FA2&W+_joX64br}(@(ai4cI0nMPgAZf0r8h3lEVtl0VQGbOKbgm}vqw&A z1Z%O#IedPtg_J*#?-lH5!O{1;L)X&DlO}?1k+~I9qldVSm;2z%W%j^-j!k#XG5wJB zG0Sbi^ADOWm0M7Lsnt*2yH)3x&`kz#y>9aB_(iP-xj20|JDN~)MBOg0=|oDyUC;U` zeo?MNqZun?QUe)aXw25K_fJd`0QWZxkUK;_wBy!Q6aaQat7W=oexXrXwMb+$vu97g7ci&*-Szk?RtY69K>}AwOJfJW?-OXgJHB9OD&u`Zd#7 z$+QycvGvTQ(m?u-r|$p=`Q>^wQ2(DQ(?5v#|xBhTS$dp!igJF_Um_T;^_77HhJ=EsH=iPI7xj)rNl&3T`=al+%8lh2Dk(O=oNQ~gjTP>BlDK~4nWy8r2+7< z(w$Qn2GH#@Fa#0%R8WSj4zt1;AlV?U`2?jC^-q8kgIsR}U3hb{>`FBG#P)|Y*G@_p@0qD*`B5R); z(`z=pC0d9S!Nc)=e)qakR{%tU=-#ti&p1B$S^$K>zI%VkjQD^Q0T6Dfol`z(eAdfF zG;<-iGf8{Nv$u@7Ma8u*5 zvL@k1-F#ZT0zg8jCNnM5OFT+!XG#k_{#Z86vyL6%M|;Rajmkn!rY-fRo+Its(^gz7%qMS8`8= zBa;_5@`xFu>O?+5JR1vnUlmBOgsND#NV>T(w^lw634$6RPG&8)zJ(yz;x~g2}(q4JZMqu8uHxl>Jc2 zV?WWQ+Y;7dX~lgis{b%B1Eoz@pU2T_65+g#r+_K#-ag zPA8F`P#dB`3~g@K@>6YJFXw0#lJM>TY9h-i<+I!VaOOQ`)5F*cOf?jussMB7I#BF2 zn^BtisnvV4`yo!rr#D!8EGCNj4>3Knz3U@Esr<@0@z}VW0$?ET&;3} zpdbYEm~l0#_*QL20XS7jro17B0=Su7suhfW+^?1Y`!zX^ZwfA`l00B?jZ*Y5>T*%* zGHt)(NIog3s|803igSrOKO+w>YyEfoxf}(z(NP);3GEmwZs>@6w<KI3fk!{VD&Z4~k+FtI=b|vN{#bAclooruXQjvWiwSiYpTikJNINeWV z&j~Z%e*JW(=}|g9PHm()6XoPc5LPY%m^Y_k*X-DM(Y@O)M%Dbu#WAZ^()E?7<}kpJ z8NtPqS2I?KQzgEhl;TD55nUXuUV%r3#rIkEfIj2%)>BqTHe?j3=q2szWM~t(pTN(h z3NaY`5mh!MrybfD90l?<(agq+C-&X+GyhaSWJHnNR@m^a&OH@YxkNMSQws-+3hIZ- zb#_M@66JO9$OtB>!V1KtX>y$bmNt$jYAB0r#`G80CU@J$luH~5q&<-fRJhfMHwW?x z*=(w?yio%l7h6eLL%zH!47u)66xNbaF??EMYNMT0Ad z=_pS}vYSo0qLP~m$v?Resaz=LF4f>C+7DShB(5rH1)#iZ27*H*7NR&o{m+C}e`>Yz zJ}bnNVv>m7i4+?Z0W{ z!mBV)xJN1zLsU2yC$kF69~Dr@i#Ft*5H6(|-!Uj}i9{hOIm$IqMo3oEI)T+owHIj_ zM!Qs!QTj&N&Uq_$dOe$jy>H@1k1&sv{v!NI+}YUMZ~K<5v6%uOXGX0mS9@$Mb(xVC z9`q+Jtj<`~U`VruqJ_98vFlWufjM8vHi)=5zpLi_$;-Cw?cyZI~>Y2%xF~f(gCfHMot}a(TxHx1$08FG6yTiIky=Jk;gW#SZ=?wr2X;Ne9Jbh*NU3a_51; zuE9R4MUrPcnrzsy-6UEFuf`s|<=%)I-DSWg=_eeD?b}C9=`L%bA_Td!&i9APN351x ze9BtvNUL6Reb0?DfFGYtUl!M`Fxq7Y?_(`CO&uQcsNNX4#Zd-WUt>i=(g2GL;Cp^u zm9e9~`<<#8(h;STpw+MVWPAASVy1DBtEiltw6!7 zd2%HvG~iOyi;Kce@nNr0B%1LM2_xU?r~8xp{w3ShB226RI5ZWKV9?@DEcCy3v=mh) zR4s#0FiNWVN}L0INY(9klJKBR4LJeoQQdn-r<$$r0JuLd4S)=c-Xuwyn*i#5Jn5bk z1K zzS{Y%m?s2-^Pv7jTx_^|Yxjx+lSB)_n%4X_JNe(N5&;krv1DKUg!&7Zx5V}2t}-t3 z_xGkVC7pH71XkQH`|9YZ-GY?JMOr%M3qB#==H4B#e|7y0 zatkV%@qCW|;ifegej@|;S)b|rQ{UR}PXQ2@5oY{$_>WWG`vt&#k@QomAKQQWXZ_d7 zEi{}1jk(-=_`?#)3>9ZRzt)4y*t>NoDdYhYsY{cfVhsh#QiVgGv~<6Gy1nRCTvf>X z>4fR|Vfm8Y}2) zhRtdaSL{PqY_!a66u`UHhNA>%0dRF;D0Rwcsc<}D@uv%~h60E!SdPj=ytClQN(ldq z(tuy2QV)bwn(4w(Lxm^>;c!M6st*FYS&u;x~E0Iva0_9CW@ySISX{? zx3mk|wIzRSZ8{NT1YT?eSEgO@iTA2O0k9fa*~1tMDjK2)lF)1RuGp%5^W8~~=MN1C z92i~&WHz}}joz{A%N{`%S<;JJVVk?I%*eVXZ#ws5Yyca7x;*6dvlE_uKO*BB3ycjbZW3f6pKP@Iy|)7gn_y zW&M@Th()bif7`o=iVbqA+-bN39Ojtk@0;$@CC1)D0=F%vc|-vUNW-^@LU!pQ#deN= ziTy7-bMJwKxcxn2;D}Lwe9D+DQCLwz4*QdcOMb_Q4RvhQeurBAZ?F6fGZ|pmrUt8> zEvL%>F5rfK-{REZ18XS&S>tSil?83`Mr3^c=SAu=mRQC*M%JQlQxb4}5O1wbv7tmM zZZW`PE{>!cCjplnaYKuC#OP!O4*hKQ$l;t$5H3WKR480MCI-7y1D0W?_q~4Q(4Gk# zGeCN13nnpcG%G0f>D%U|ZA%o#3l76IBW8?)q{4TjLe+*@v+zbMKEj37^Rti4kg&f)oZ(ZcS;8$>_3_0Gac&MVuo`I$TJXCa*o9w1tFA1v9ZzDobpqvh=Ug z7EffvPJjOE_{ecGpAh`$vlFL>?EGBxAS^J~03qPV~N$Pw)11$b9Yi#G0F2kk#4DaDKdUz)&jIN>7f_kI1 zddrga^^R>4Y%fTIOFC5YB`bDRxcNVNi~;w>6(}$_^6(;Y_p=V z=@0n~cZu{0kO5VFxinw)aK^R!$Eu3Q1z;9pt=1f?(*X{yu4Og8O4)8tK551=5phPzI@Ek8QdYXz zC_%LP;VnP3l+2U664x*DuQ$l<&|P#@33ciXi1nfn62cy4tg7o}!6EIwYO`?rU%a=n z#FNiGRVr9Tlw6XYTO^_kmuj$%av7lhmauO7rqeYiXWXj{8>Rw)y-qYzv{!}cdY$^F z&F!aDi^b9g$C1+2Buazo2S$WOv(OnMs6y3-rX#s8m+&3pks`-TtM73$r2n5$l4?Y-f^{+QC}v_|n<5Ry&sfHdjh^cpd-Va))WGWW6r17Ms^cEa~E&Cig*I zu*epwQDH}Q|8oK$?t`pdyxRNFkUwO=SB#VzAZpXC?b+bKwU|$73zCo^U6D;ds1_$k ztmZ1;?AnV92MfC5&eGBsD|f|za$W{-v9~bSc(&Qson=6Q^i!*!zkKZZN1pEsfJn@m zad2O=d9{9$0To$`u`BWdW;}HhfHHJ)wfbSbC#NoIe^CI04PQ`eS@}wP>Ii`F(HdGl zU#@#br;(f)4P^>&mCoCw$6>h>A;+;0~P$HK_J zOpU1FJ+`g)aO=u&(W2~O)`tRsIm5eEQa&>@HdMuv-xnS}``gLOewI112%HyQo0#jZ zy)G!1qY@1%DY`cUV*UiK>A4U+g~9k3|JZhdG6`%nkC-QT~Bp4Gd0s5tYjL z3wwUTWJW2eCjiJB;0ZnM>1gbU5 zn{*W(WmVv$;u}m&r+i>(bVvtWos2!TvF+HXK@u892n~+hEMkFb-1{L)CBa8tqAMo; z$^HI20Gg5S0#L4@B1I!A5BViUR@X5%z{_+;!X=y!>7MI=u5Lbj4DVfPNgsDpJ_ZrQRCz81;5s}$j z7m2-fk^WU;R-C<^DX(wXwfF}LfX0MZ>5*w5R)s7P4|nb@?{@#e%J&3~aucPW2$_w; z4eA?=b3mmffe%`F7EUE@VDCKfpWm7~jYMl<6R-b$M!W4n{(J^n05)NszcwrPIYuSd)B)~J$8 zG7)Up)ERF*fwA&ztM;9KrrM&!!+NqIEbq4e{+`QTlnB|cR9nRx7VVw)Hpa851VC`T zh5M(tH*CmQE;fELOa_$Xh5FhXk41sKiM*x-dv~<0ca2Rkc54!BLZYm(+(9;i`K|7a zEin$}pW%~iAmy%fsG1?NcIWMUwM^HQo+qLR6B|dO6o0qGk zMfpAy99IDJ@_3^WhQE}H%4Z$u;7R!dW9Gg2ld*LKvZLUQgPR{ul)Rn%q{0pEPJ9_K zQ|Z0jJSn=)2IlCy;Gb8iL&dk1yUYN#l-nOZKg>o8Bw6nP@fRnJJf~R~16#{)TizF3Q`m^}=NgFjc{B6xjHja$E>xOmFzx zXG^J-Ku)H(y{Z5}1j3XfE+Y95iQ0vT<>DD^wId^hmWN( zZzf`)iAZ%4#WYmFDp-PHRy%e?Iy?zDkPvOiNfX&~3Uu;8T$Skia*v-mm5Llm$Dn2h zRAyHIHYeCAienLNF9}g$crCcVR3L)1J7uSDQ3yyuvOS(WlB!>YlXNonoeBcr7pRP5 zv=CnpeKX5-Lnu(um$-M7`0(cq{qAM+^{(eD6M;DFFW%|^}qlS(}BO+WG+hBR3{ z;m;5wS73pzs5Pbl!1Ry{v5-Yeh65!J)j-%F6v&|Bwy-n+27xq7(=ZZ3K-QcrD-_L% zRB>9GOG`?QCYU!y`wn^te-U4K26^X5P9x4PdqC=vjnm%Rm`5+4TC%DUeUy*WU%D8n7^CH;#$JsYeL0O3Yo^&~W>{d^(F z{a6WHRT1Qs$Fjc3j2kPOSD=H!(=i=V^5>UbNdY7$7`lWMAc{5=@Pjh#b>}N(KJLYF zJQYhm_S+}D*59LRN_Kk^;>Ki$LAy1Bb4raM#{U~x!|T*Nx&MzCV8nx@=NVhs8e>Vy z|ML!j2UQN>Z0wjftx39Ir>JsGZjTsA1$Ml919veapui)G&9`#lK)FzKZNQZQvg_HFGK{1hDEeV`c@4io$dZ?dZ%@71O>1043JUMa^KltPXQ=Pbycli z4JiM*v=-2Nv9%qAlI|SgwDSc>d2u>}90q)ahG=301Q$K=^NYRC=qXSMK6f?5W;?By zTFw?jtI(6R=yLLOGq(%|8Ni3RC1z`<*YlVxA}zR6aZ|H7ZT~#jOm4A{ky3CA(t_$_sO6F98M?JWs@!5A zYw>Z>(Kjy_o|XX@7-0FJ)&D#_JedMW0Sg zOIEg3L^2k7_WJc|njOih3KhOWn)>chw%7A1Bn0|SCg_4u!WdL=Cq69$C{-!T_ zr^tXYti{BDdV>yrd{YKYWPk}B_B5(q^q~x(ELN)@|54~4qk8`&0~WIuYJj-1sNggB zjeu~QE?KH1f>R)qg&`{kJ#v(2-KKQd*685{5E#X4>^348y zKV6@TJ}0ctn$%?F?z#oiAbvUCMoW*JFUKBQu8oSE(g!P3DU# z1gPzJJ=`bkg%D?zVqsvz`3vKLc7PiF5FU)miuG2S#Sh z6Lh`3SqlXK8w~843NpvZ^?3rhNbNtpMLI6Zb-t-D>6JPeC!iLzkWnVH zy)*!10xqS)4^5b60_Ir0{g_(6IIy;!E;=C~t{kWV!a7SBSbe^=#$`H4ICFcTNCNgO zNf|>iRB~MKDh=w_TiHky_~^ll3PY`40YIUYo(1Hk7Rix8Up4KHLYOEX%jk5=ZBu61 z|4#FMed0_uJa~$J<$%8mr7|McL|dQ>0KEVnW|!Et0-GEly4kgQ1pqrry6-5($%!q+ zjV=WiY0fno1|TtD@B7#|S+F~?88YC-CHH;b&VZ^axs@s7m)0PWee&g2C+4SYaHF3L zazf)g-7Unw)@!;6q!xVWC%X-{pZ_LTwD4}jNbSF8?%%WPUI7sH-S+9j&QyE3K>&n> zwrT0FHT$J4l>xq<)UXwbX&j8CO1)ZP&gRJY6{g?sf`uR+?e?)~kX(4R7 zNxvGOJV@Oo`Y3yxwJ>~=@Q4ADgO&}8&Sr)exR2~+h&L9fUJX~^VmzXFN%+)*ozH4diSf9vXVldIQFrkD zVNcJTPMs~cpfia}J}Q8y=c5LQ;F|&fRi-;FGlxSSiCj*LOI27ti`exn+h~%zudG&KMyZ?`p!nW*fNw?jkxci01)R6a!qUnB%3JInI&$ltFX!>n=<(}QGvWsenK+NVuSEaFfiu(?Op1$|-Kc}gJDv31>>**~3 zmF-%+0szj_+mdTVI4=Y5ZEf4OSsNZly1QOLG}F7#!1=^Dh&W5E*fSolyw~nDUm9CJnur)MGz?rkO{^?)mOXA z1$-4|KqT>8py&ql+&H5d#qwFlk@`~&M(^D${Y5r|xR$5@fP=)O7sBOYF`?MF%iS3j zmN)8!NGCVcPTg->y#fOrh`e6~08BIi^NkxfI8gj+RTx#Gr9@wHK&a>;J~M1^eoz$X z=t;!E)Bw3)r0d6%1P`Ob?#!|3dgmI8aK{O@u`>%vnj%e4O~_-Sau$j1>{EzMnu|?N zFAk6-N(o6;I66uSM@KQ`B5d+qOtZ0dr^vb>t7C*(13RDG?K!J2Z9x=n|1l3J(@+y#GwImQPB;nHFpaYG6TrB8|ii=BXMt*E+ z6fOYX32dlyZg=|m)CplRNs$e*Z;}2gSnSL{hQ^(`e@iqL_YP;gTGQ5})l>?=K_aO- zQovg2Bb!#a!-Es$r*Sk~6GnP7UQ2cnUz0j(CVkSdJx2+k6>Px}@Ql3GB`HgRN48zD z)I_TGw;v+VD)V6bDL$7l@5Sh2>4(XLJ2n1qOO9dyqA?7v}fRu3wY(3?(=YOOLue zID<&=$Mq(D%oTVb;B%P~7&`4*qq}?Q8N~=IfioaW3GIn+4<+eXcxZ=f9oEjnpL{WC zF7K_PwCC{fB2iqBp^to|S$#WN@FEZ~C_g&*NRz+rb$1C)3^0I)7$*yYwd@>yZfHe{nA_1>vB!$QBKJ%E7l z$EpF|Tp+6f<$q`2tp*5_TMZC0HL-PaN89L@qI36EjFcMS#jRci0LE=(K6!W(*@)?d z@SUfc94=1+Dsb^>BI3~P#p%1>7ivYfBFd)#kkgU_T@$*9GD%W_1-fqhc&Y(qxbmX_ zkn|wp1ElU7$xWY$+!j8)3S2Vk>1<9E0LYLq_5<>1%v^=; z4t<($UPUh;AUrJ!0FF~+o++I?enNJXi+5O!2H$6nE*?7@`;Tyj(uRX>D)=Y?!=yh~ z;2vE~$TJ!nG@CL}dkIpF{E*KPE8(n0`)Ph|I!sg$)Jc3!G5>P}>R(LzY_ZQJYp z@gO)#23(hZqSVjoFRoO-)?Efr#-!D6>KWmeawviVu=-Gwp?Mf^QzHwpan^c%@s~|D zrO-JhA1gd6Gm^WOR6Y2UO!g9MF@5B~-!}aIqW}mQG%j{?!s))UuHjC7sapN$2T?&U zhwh{;u#r-TcN19~q@G2Dtj#@_?*fb>@50y&^5{0Y)n2VECf4pE^YgkxH%rU>fQB zJIH%LuA#_jP#|F%g$5rRXs+~|51TEhq~Qi=;lyqO_Xi$HPIkq>KWRt515oCR(g3gu z@YXfrGpI=^yA#wzMGj?`?2b&}Ran!FbGI$ryo~t+0KkWl|KbYKg&!|o-9(*H zpjj~qJXm@{ifFQ2?l9bS1Ae@gH1$799k0WPm}hUiita={RE91Mchg+nby>W$QNfr0 zy5vMq#U2j8GBbZ_naU0yBwU2ij+iM->I~S+xoND!1=|}Bc(&I-?q9&A)8oTaclant!Q(wefU;+zDmtTK$OVHQhgGwoL|57XX6$%f6j6 z@L#%0L@&mLD+~2fN_Xhk7;V3K-5C8f)z`^adD9uy>eT>Y=;bY5QykFtApfd>NE?!- z;29+E0$A}rI_K0XJZ&iCBSt`~w~9?=9$%CY*@;R9(z|vM8&-OgAAgy8gRx)$%6`fK z179~X4CvpU_D)uTYK~gH0)QPX9S0P}B<~&&ytgp?60-}<$Ydb32S`2z!%AK~^Tn!H zOmjj~S$7liMUh^BOPj(C9Wm!&^{?9t^9*T6rn~}NXw1>!KB~NCDm33H*s0QcWh9`* z*I$LCWhK^hcqT%mNGNddG2$6tH9$Oir3RFt!XB5+T!#))WxiwItp>Pp38VnPyp<-F z)Fb8dsz3lq_Yv}a!4x&Dflz?HsRE$YFS&Z6R=@^In2_>nB;nwWMb)7X zjT>d|Br32h)J(`r@ud?iwW!Hj%pUh^`Pcr;009>cM@Bl)Fk_|C6NPXfA%l(K7N7d^ zVo+*~Jf0y8kl$qE{g$zG5QMsT8Xz<6ySAE-%Ze5v$3X!gX@8J9?A1}|%j8KwQBxqv zI{wH0H%1B?;@x32KpV}56P_66x4f>r1m)x20dSxBE*f_Dr<_~%$#qBQsp1sA8)4TunF)V6uc#!_>6H>(S?3vK*NxBP7% z4xxgHETE{^etL0O{;97%ljsnDc*tV?xoO`=g)s2}fUprh&fTAM=vcgH;oXIO!;0@( z&wDYM>cG+_;prtS!nR*|Kap~9NTL8dX^T7iL<>-Q?v`(BT4`uiSr)l-lVN$~4XN91 z>qVC$fq3!4*|(}K+$aN{v$4#3V7srmF+~8h4>%y@w>*v8`VKuopTkjY3m7_G}KiabwD za2C|o*AiWcOPmwx<^Hquo5cbkEK@Z=J@lUcsb;Nyr9ed`aG&GFO^JQrOoSP^(1BlJR%BwJ} z!YB5M*B3CZiC$6=AV8fVGYLANtTZ=y6lmy0ST+TVGpe0CxL2YkO$}AYp?s+TB2U{H z*1Oh;>+3`dkxZ=sV8F@TI#3uWwnyFT?fp+U-u%gRB?O$wOB5Dj-Ldadq2ZZY5+_6; z7bh;$jFMimC8$8fw`q$?qXB?0Vihfjf$79mP;ysBs+7)J=PhjCcw=q4nq+2#C&4@> zaZtO-kLd)!3W`OD35lUbGsa~{zPi#*&AQw=tH!zW6dPnb>M;5W00xmn0zXD+6bJ^D zhD5$Cn*q`r1rPNI78bs5f85B(G$C)CByn@|UV((xBE>}k06(MmNeDkvzE!2b0|8Oc zUkxZrcOb%{%5nL}T8CLP;G9c>>(wO&Ht@xxXBYR?qq72mk_f#9ZnEx>D_kj4prCKz zM^9e4%WGw~Uujza%5j0G29)I)32H!@25c7908xxn4RF6(S__;v>Y@W1RUS)qdvTLA zV&;Pnt}aQD2Y-MORs%HD@dQ;<-D3JXT9l(chPPXYJ6CE_!dX0B4p%5lSixDjyWybJ*u7a1b%y$87W-r^oH^tvVI=Kpd2DYeA4vIN$8 zR|@s%EO$}dN!mDak(oN)(DANXS3c%Kj~|KBr%+Okc1-!|&xU^z;PyWWjNJ77!F40# zxyatnnd=@GQn)7xixnqJ=0*L{Wk+AS*29Y$VgSqwvr@1TXAH*f3Z-%BWdm6jo-_pI zDRB_yPU}*)@1}a9UAT6JXC@9~if3UX&Ia3R%WTyDc+ylM>*7odWEEqy7`H40fiw2> zw5!?8>u%gFn1R;yP1&53h?oDI+WfStrCcX?PKSjLQ>{%raC67)PYtDryXtaW?fJ>! z$x?j8x`kp$c*`OvKg>RIB>R4^&Trl9d5B`~8y+v8$)Ne6JHM$A8b`*)oqzhGTi+sC zJA6$eQwFR1n$@O(z7a@20zrbkf2WXXim4DAGojqosM&xB!KftQ(?E7bXH{lTX#gJc zBA_Tka3W#E)H*jO2g$4LYCvo;@20Qxa)<$8^{QLH4p5>j6M%0V12@-Hyw4zegxQ$g zRFJWbkqy)VdZIA__=r)MvpLK-7Oh5jMzsZ*ih(iNe47AFQHb%d=;2~KnW|`IykQZ= z{633)BU1_1?xRlHU8Yn3M?Et&gQkhCA?7Lq9#|VX+cMir18@;FjLd~iJ&t{6JUpA4 zc^F%1D7w$x71%{A4v{2zLFZd2Mdv+~KJiewqD_G zvKlG%#+K6whYI^nH5fPH|HK2$kPAJhUKMMKQIG}Vrp&j!yKgrxk(B6iL&m0~H6|Il zVb6V%)%x_COUgYG--xmD{Z9cEBAQwTi(kAB9|^2IetXBws7U^c0rZTs^0V*u2UZf> zI0L+oONwP9?tlBi^+rTNA*pB0Ub*qnzKa5Y%?tBQ!ZL_ualT+BF7k6QCql_+Y=cYP zmv7lbjK~EjckA52FOQPaII5=Wc4jx9_NxOA5rvN+M%0|hxmoYMzmR}(f5Q`?M?t!rOeT* zlu?MRHWR=NtzbdQ(l3!Ujj05ytcR1zNF3BDC<>bnSk-A@0B+P94gf(?0-8D^x z&=B(6)BzI9Bw*}L!QhQh0y((wC52@q4wH%pV|!}AB|LG|nHJfxI$j@pG}y_z&HxhJ z_b&4MsqH19p5zn(a(H%kjcwNCc^pw#zmUKVzZPMUeXIh&kjG$c;V3AUMyF_c#a=&O zx=f^Hs!P&sgIZ1)kR*BXGZ3V3dqeUcWM4!)0(C>%GUm#;T8Fx;I?BhS!Q^ugjt1p7 z;>ar&r+d?zRjP;F5!YMZ2hkmPxX!6MzTRWwl4(&NZ0Yu-YHg0(pcYc9$;FAgvm4)k zMgYA^E?QT8&VxF{CxRcqA0h5 z|I=!llyURBl>tSnPJcN@VO`TRQg9(u^rm9?wscDwpRg$U>!+^~V~d*lV{c{880mOS z0O_el?^`vs=~;2;2|<*9m9Q8LeR8%vpPmMWt@aYXyJt*HgCMKQ9E_a z+1>NYXN}^Gi#6%)7<-Bf zsnuoz_-sO`6L^Mm6`~^**LbzqSKoDc=lh@y#KLE`Y}<;~b;j2GwZ3YCReAYvSwfas z-uv87Z{^GF3(X8?mMj@L@IHV`1vV^MY|*(#x0kgP#}+>pk|nV4yLlaUTrjj6l*w^! z^!x4o3rDNU{i5I?6Q7H7DI2>GS@jo;c^1-iyO=N71A@bu2P2ci*|Px*9I=SS=SGh6 zcgLLgu&}XUh>^AmQ6Sr}zZQ6eKKHg_Kt44ca z8_9&&Ww^Uc`989CqaVIf1*}~h@P$nb6TWr)udwGG>_21k8*=kSL+Q>@0-!TwQB2QE z(L!2aqe}~DtOj_9v(RcAHLYH|U%wKMN*Fgpv4X`FET5U@Gag%LdgcGH``c!Ly;OVs zdcuDjDtArs?4%L>N-{EeZSbJ-y&bbwSkCIE{N;g#Z3<5-L(_C~-?8r3>eNmNQMMLJNX ziIYmnaagAyt#to2O_Rzknm`?+fDI-9yCx!Iu(4qV)5ynw7z9i|F00kbdgBU{k)4O+ z4dmctDuJ$esbMk!+zkT8VR*7a(wD4U5XIFD7f&j zy`Xyre0?YqS(JC@GvV34(Mb4xD;ekjU1xQ`Qp*X2j}WV@HWLN>x8WO^oW&e{*fUIh zWZ8kcPO({MD$Y8ql+rpt5=IGNtCJ>?jYJ8GhE6ExWn8DQhSbB`IuFF zF7B9h=HZOAdj>0^3xVCqoaa9rpCL9}&T5EcwKjKl?Bu{)gCa%(tMmVT`}eMO4M6Sh zD^7pj>7PdO^1&*9Q&KEn6xm|cba~zY@K;ZxOWfD{EhrS9mshTq?*iWuUuSqNqdHt> zN>=j%e?IYLyKV-sQ3A7@j;WqFZUg}qHEBjvFDk6CSZ*h{d?MLP5(}abO`6%9(`h!_ z@nWs0DtX3itAB3tvT?+dcA^d&zI@bYYCi&K6_fz>OIAAIe$@#;)~?Nd*|#iaZ#vcC z(os^F09;&HfIGf<^n|xqX=T`4`@|XWnHgXrX}}8*g_9gpDOhuIbBOcxq{5$bD81UNPcZ zX#j~+Qy&L^*lAuJYB)_P9q?DIbiksP+oTQuhX2^m(6o}HmTKqVRp-1xnLNd_-(jn>qNl-dK z@nrg(Y;z+arr)W{KZ(Yym+gI$W|>|alJ*@+(AS^JI1n?>QpTXyKVqu zB*oHK&)q!P;xGYayGmgG$OVa=@A(rzF+EBEN_w9?v0CWTpxXw;J;`eP%dxjVo{?z) zLW;B6Mla8aDt}7c@_0Y)NQ#mB-}|)fGoynPFl9*RPPh8>T5GUULTh}&{>v|qF^)cu z){@mbhucj~c|)vZR)P4f@D*OCBF zCFV{YFyQjm0S*G_>2lO>7pk4eo@W3`SWKI|-M27UTnJd@Zff(3ab%Z&Ha9>}V2g~- zje{{x93rve@PsQ8%HlvUm11o#lt72r2NRYoUrrU$t8%ji_jhEz@(KZE)B@B2ceVO; zfP5HC0F)hVSxj6z96z9rgD#tSrpVTqN}`!%HaG*6np9F47e;@GxWY_ZB%~{4S8c|p zS2OAwZJtNw9M~WF)e!>dB6(o`DODs~6=v(p9wn7bL|3-!DS1-Z7>K`TFT9TCy48 zu~o7qxmL=%1Ji!Bg6}yEnpUEM=ybg>k!65Q9}(h2GAvB#v-73uZTT-;Gb%zr(lS1X z03NCVCZ#Nf!dgi((gD)vX(CV9REtW-}FJb6+i16M(xHq8Y)|MGS=;NKLhhbcML>!Tl;T3^!-Y|I&)FZmpAm zu5l%C)dX;RZ9Bryz{1*;!dENh%WOs# z7sK?4#ll6I^sV@=i074N#~V3ZArtXb1I2Q_tV%1%&Cg*bj?9rU8CVacmx50p%b^G3 zw_;&;bPXt7*G%d+bdxe7>ww>LS)B>M-o|c;l$)m%r5z{3x6izjyPJF zex7>@77ui#bN2YDGzP573QhnrJCdx7Q`ZmE8$m}0Inq+YvUAhm;}$juBf$9>*BR5n z3yNZHX(C}5Ey^9k+BeAymPZSQvke?9a*~lH)t+fb{1&_z!zYx-1x0%y-xT>a>en;2 z1Fw&XM}gaA7dCX9>H0iFieStEPkK18FT$2T5lR}#c;>tacD>gT^UYN+~QCd5e zSDO8_Wj`Br##7yvmc1Cg;kB(5381(=OY4Pped(`12=HkvTfU^pjVBda3soemyyTJC z+JRt6#jKa-4=n0%{gjnh`Tr=G@$2ePS z>_tn`YsG@irn|x~vb3VCDs_pSQ{mZLji#;;jf2Xx*aYeV2jDoE#2QbOT4B8FkrSkJ z!<5y{Xzu;(e;)`f6`wq7N&~P1VoBkx98VT3#|{grmsVOqG?+r-npk7zzyd2fIW9Lo zwOHn&X`Saa`KkK>(J9v3Ws>WZ0hOj+_-(KNpzuLtf%s%KVPufc(u;b;B(jIZgwjyd zKzE%3rx_m){p^mip^|O zX>^ZVf0F(f^4pqsg&^NU$Qk zh7NcYlvW3xox?MdU<`p2a-E?&&S6;$g-e3DI8)gKeuiB=D=!RX?Ac)~mN#CFcroK> zf0f^`o1(OLYj+o*F|h_KAuqrrs^g6M zjmp;(0Gc9f>Pn=TTlT`*%+8JEPR9B;Nj7C^qd)%eib*2I-a;@!B!M< z0WYBiv)X36&#ZlEUnhgrRLN?3hff=wdc#l!dnp-aazTX_2M?YX6u54+$2}@51$LKs zzk_|KBp*I}_MWEy6M7=H`!H(}5gL?RUt#)`RuE05)J;Q=e*R&-F~Oo90ABkfMYemT zGcULl`*iAP%b0(BV_lEhf&#*CEKDho=L<_-8b(S6rgGqHedGk7@RKGAYzAG}%`w^$ z7f1coN)!u$hmgG~S@b@URK4>D!QPui8&NkIF%5{>yYAmGp+m-i;ayaEcEuu1Q!&#T zQ#mm3_*FLE1h8u`Jc)ScWAQ#h25zQOj6A0_asXtWWugGzR>*yTY`L&a!R}A)<60@T zYz%*Bu!L-GDuzFi>M|<%{G|(Zx)|d!Teiytz)LwY*Pg>tYpPc+vss*0Is{(s8Oq?5 z<-5X1BL$;Y)~A&Nk<{^A9G{BFtD?E4BKVVMgcE?`Z0Zz#N{^%i#f#z^E+8Af}zc{~@&$i`H)v_aR~RKuXMd z2(!o2TeFR;vmNW!p-Ntna3L9sVB(dU^b$<+kk8$H>lYzgf zG+IP=R1*OI1#GBT-o*mZ>Vhe)NF8upD*IvrAhC*;L0*N#M}{j}p^#|)P1U7@ebja- zN+vLsMdRtkMVH*l)|5@q0gCye13p4FDJdNWsw<^VL3Ro{V43Wsa_f-N0PH#3WgB{@ zHaI6!GSu=e!B?45=z#YtX1>OT=7W2)N}!P!hr#3p4bfBgry|kw=F88AGMZQS_F)|wZKJrKLj zm%y5!C*>nUni6OE7;d$#=+J*{?)hW_tU?^H+LrZtamC84Mg#=im8?tvRA8O$L!ovG zi$IDeoP_LLGhc$1B;Hwky23NT2sB0KOdF3@y`SuieZPK7~*s-Umfk<(#*TFkzC z{?zV1MTZQ@l{WUd3oChC9cVnWQyc~pfcr&BRg-9p?B1O26I@=}|D9+B+iuP}0fOIf z0(d(EC{50^(N}(7xz$jlm5r6Grp#P;|8zH@S!FYW!Zu9U9Co|HN^v|eiL5JbNHAi? zqeu@H!IM<+YW=i*cpIuKhy7ix|a>UwO+iKSQ*8sLjAn!=ZnxWa^ zKt+|oJ)|=Rq8T6<4x&>gkO6x3jXxHhKK>%{AR*QSK&>G^dnqg&zdWtds4Bff286Q| zOYG2LX-1$3RO{AM4kP5Pmc0&;>x~XjWYXjse&s$tDE3n}*j{2*!5^$RfP5~kpfMI9 zq?u+`1pQ?-onN!I%q*Vy#(i z%SZ3>8#dEey=6wqI+p%2^W$f8*Bh*!NT6WTCdbXD;=o|6%6ub%$*p?c9gb~IUbd-?0co9x<509eGN!`!1jdwC^gj;w6lqz7IP zHccZI6p3Zb4+|##{H{1kS@SI4ON#t?<>HeCfdt;2G~w~h&wZ&E zuC<&1e&XX>Z6*q~OJUFvAqMvdW{pr9HD(qfw`cLlV2FSZ#YckSUua^7Vf5`OS#&(} zS)8xbXYuJ!uQULkPME;pr6?6|l_`S;(Z|<0kj1tRkQulR_>U{CPBsh9IsyFD=Bl%@ zh(&L;nE;Gm6oR%e&lHpWj;RppBco3V7*eelMmL4Wz-Dn=^269O25drj^NjtoHs3#` zdJFt4N`yUWX@2V9P~%W_QK!_AtOrk8er?FMq?3QYV0zBn&&4`o--UMELwgJ6{QIf6 zY%qX~Gk2|v+Ii$i6W%0F(LxU1&ZnpSs>RmrFRJwX&MWhKQp$9rES z{2}OB9X?7d9Fsb=Qp(Lk21OZ3G2-vlQ$4S}K!DG063F$t65sx`_{CU}&^u(=-OG26 zi5boS&)$+k2SUV(wAysQUx}V+QEsDxhKS>Xu_~j)lf>lLd&R_c60O3OCp-~SP*zwh zdnQVg)oEq?DO)pwSRiY&(yy9|u^~}HXg|w^q*@!r0Acq;s$OUlkW`7iF(E68+67F- zKp(tO)^7sX14(Kw9+;((!$=U@318OW-l(xz#P_Wb84z`y9Q{oc(gZ zuG5twcyad0T!mC%wVnR&gXdMAiLHnMF6y{C)qLE|PcMIIP`JrfpSL3bw$J)5>hwUxLULYX&Pf4-(&ds;NzkZ(pvJoBi#kKNXvbGUGGQ-FU z)vp)4^Y-y;e-U3I{{H7^5K zjHu7LMb0<&WAeEy0SG}=qrfR4&Ai%X#B=E|5s~pE@0JG|9oRlcd~rUiYKJocnATh% z!Lu}b&5X%ZYt>W=y|gG%K?g`nrUP_1>Hzs1n*dBmB=b&9tRIUE^EfS9v(O@jylX0p z_IRo>)B%!7b%2(S1lT<#Bo&+K{}(Q-20vqK&^IM*(3wkL7FvG^CBPyKC9JkHYd?L% z#r-t{s3kwh@$vs%9D2z(V=1mo2|%59o0i#Q=e$}-tX$rftX9UXo)|e}C;=1=WM06u z<9^Y-2q3?!F)hyj-7Dc|0w^wb{_pTMw~qSZz8Gq;3N`K<-OA;HM;(q~OTb$>VNQ|XeAj7q5UZd zkR)v4%_#0TVO36uH6>Y*7FK6P?-4pc8F_SoLOS$VU8?uk7g4IHjSYMJd@)|^z^sm-wvyHAzI&cWwz?r$VJGe3V8)H{ zP?q8)hOSLZe>xH5l^_o*%%WK6ufk#C4Fw)@Df4I(lHZaK)^zxwe^bTJ9~Vp5A|sh< zMhZM)Nz=C|dBFQ&-Gn3rK`n?T#5h&p<4vt9TyXgE z(pO)mR+XtFtC`tg&u;_Yyh=cTIQp$N9iZK7+LuH6pQ>9#6r?`XfwE%%LP)OH9<-Pl z@GenM=7N!fW6C=|Grlre@0tMUU|A&c>~se*&=1PzAqtA6GCY3iucn8@?VgFy;X_%V zTIkTsR`Yqqi{Z1l&5#421Mccj$*$Px^Z!;=5v>N}&be9X$Z7^_LsMM7_<~tAt9>p6 zF4P~4@Kvk~goI>!q9e_LFgHq!*NO&oNOr(>2Qw%F0fUguSzQ;ja^<@q7iAot+av6- zxgCTE`mlX7gki0;UyL2D>QEqdvgg$AVpnPpQz`U6@VxB53COXO!|j9Voz-S)f4btJq3RTL80!Fq^fv*Ro)o_}3L6-vfRh^idzS{l2oeq;?0#F^cfnKz8#Q%HG6DFa z%q}k@2@V&ScI>0F2<)X*!v=4G84$uUOHhNwQza)+1e#&dMRHOGAs-Qfa-(4hDk6+= z3RUB$P&LktOArB)@x^{mJTtEMAb_Imy?6DShOfM}jQ|R4c);iU=7_y_3Gi(oS?&J5 zbNaMe!vz2pQ)_1An2%&cFgB*k=$4H$Z|*IMQH9_u!h9Qe;3c+8Nmk27e|g{sZ>dIS zuYpX(DlPz#a0@ipnF?aS=(%L7_p2TE?v)!2080Cz0~D8W(w38pZWIX>4;v!yU9vF~ zB76Ms-};5B$$?Qg6}eVX_Kf;A%In{M7QK=u3W7t3xO`e|*^?scG?cMr@!>*?UudH8 zSu}}ac4+bcy|Q=Km*t6z|C_QMI^eg~2~bviH7I5^R;1rC0l4||oT;Ku=JoLVZ)Z9V zJt^9PQy9l849A(lhXe8SN;EyTcySDX&s5n$9iX_~IzYC-CICZbvbSd%cSN731ie~e zUxd@*u}DmoQKmv@9Ob*xfnXuCV;j}FLqXhhfZlR-fb<>`V3K2KCI;LrIl`KS50tT9 z_27M^IsI&X+}yo&&!{irCm#{Rx+KDA1BR`vV=xJQvg(zU9sg3Lf@4zi5x@@S_xxEB zNn2qEU0P94lg4%Ry~F+M-jNSeXtJt_ypbe><#Wp%sr>ySRaamaW^9MrSak5%WENsx z7F_&p&dlf@gG52pM90daP6bDA{UIeDoJt}nrf90+g*7k4Wp-#%9U}LQlziuUR6V}l zO$Z`bU6B1)ut#jJyd|>GoG*&HjUMSKsIjAj$H9Uq9qO*O83`~9HiG%idjIypCHo&z zHP-Et!;Do`tMB{mIss(rpaZlaPU`q^_p&SIs5-4Uz3p)FfJIMQj@Tw4?P+CLHaR9G zWBf=Q9T(j6#TEhm6(9fhNc7GUj=&}!f{oO=Blz9JTfw{3(;UXvUnv%KfE1$nhq`|M zvsYim7|BQmA)E~c1p)rx;zyAzbH^RqU3GL_>N=@fhIDvsOw6Ny6$9@`EKI1;i}}r% zN}y4G8N4u5%x2PZu;WHJP%`t-U_aqc%DyU>>m-xGHQOu;K0ja8?=RlqF@7=FpN!WY ztylm~V1y`QPAri8S(Mw-*s-+`S{eZHL8h2w6=gb*j7%1@AE?!I+}_5bIiUA_-3j2W zwium)HYFV(6KfNIWyzzv@~t~OgGHrQtIbpnZJ}7uIuNXcLmjXTangDZ@xiS&ox)Fi z39Bu7w%?|2USCH8VNqXQ2Pm+&4*058>42Xy2GapDE7k#TC5Y*OPes{59q?C2zYchd zt8~c@hN@jcrwA4sXh{mPhtMe~@q`Ir?^Jn+34ry^*1hS$#8eQUnl8~g;QO7E4pWkH z69r5VTRD>OzR&FColv@NbOKO}eG^Nxj9WC#WoDx z@HSoS25BnJmcTW0Th(do&uu>tnh#+@dA3Jh%s7l+xrGje<6bZez1Ir|;i$HBentitn_E zsXkPTKb&rp6Vtf1!wz3Kr5YXgEaKpg7o|vrk?@X|%{KvPWlzW8#8imB3HeDd0av{@ zl>&K?P^2N^&D{Be_34bnegh4LK$;yp4^pJ^>qaVgy zCehR%YEPbWs6LcE;jnR$gJLR%@g;{I9q{unjRJ2H(a6b(yAimneX>W#-}mg=a#D;A zqPQb^Mlqq=gt9587Pt=hO_nw40QpJj02#aK0L2H<0m=ib11^=FR8IbuIt3-8(*d%N z)&cU?m%uPyCDU+tU}2|2IVZe9()beRps_JGA{gxj;TLLgwQ$l7k}nH&8#KM?DO0Tdx^bJ4@XEg#bI_Tjq^A_AqS zr>Kd%w)Y#a6ulyKd7!0(W5w1(Tith`pk{=siM71d*%$g03c;P#MloNPWZm)i=(?LI z0@RFIxUTH;y}sfY;qB|d%UEsmKC5}Z|AqU40xCzA96A-D^Vwp$uvjqbkq7LI7pb9=YSxsM$+z5kPX034nQ8JH!%!_EW0B_}FDK z1r}<-IcF-3Ke=6X0?=lg=jZzFPZj7A$U<_%oDPa@wdN%QQ#o+7U11=#>>TuiY1fbwd zIxDw&PAJ@jJYu!!6c+L3QW7YW>4X)9J zx`^ulsdsgtoY(xGBkT&qRRAs=)d@J;7sN>Y%9 zapdl|n>JedE3xulDJgV-3^{Ul@3%h)XigNN>K>e)V6PbCCxkCPdQp;<4p5vN6Toy< zJlYyhf`L>8PN*pfhKU;EMyEvob34A7_qT&u=r%&K(g7DW!E}IvSLs0L8YiqMq^eHg zcG(F9JzVM(^j4$;6tT_(FcUr=KLf!4$jH!Cg3V;L1L^=N!zExy9%Zqf@FbUwz@|BT zImu;WtS3_(YxsUd+XoF|p8xP)X3>3Q;0w4ysv~yK-3sU8FB=CYy(sUQS%1iwTjDc8 z{txb+HJrV1M(4`3$as}j9oW@>OW&89=F!LXohrw7Q|Hv(b$)F~0HumuKgj5Q^DxgUZh&lNdw(G*=DGdzd~+kCL*&G$ z13^MGvDyj?J1(n`o=dTGs2-J08_JyY5#mc_{9|%eo?Y|{ zN?6{PX4C>&9VP(#Wh=z7nZ)NGedTk&=E^`n~Y5&(usJm@%J0)xyq6o+&9fGZnE zuNT4#<6EJdB%hc2Y|oS`@=6PUUegPo?A$kXvY}}56|xReMtRQ2tvEqkQy44SiFCm7 zqpV}9|8MzKdI$lDQILki1fcEQh`oL*780Z@RI`$NeD(Lnz3^0=)fldz&IrrEU7Nx> z=OV}+>!d6>x=T~9_RB>>Sw&vkBrvS+e}P@Y!}%`;xDPE2fKV2V1)RYqSfo9R%#Kae za7OINLj602;?Rdt2Vz1;!96ODsiP&+tklz$Vt*2Ijnzi0PY3AO(*ZYi&g%f()06+K z)@FbCmqd@)y#!ubDaifAp9+kyS*BvFsriM!Z|I@0PJA z#D>N?=>1S~)qxOklEarvqoB7Q9dNnegq7FY(f~{vIIlu~%$0@kyiF^u6lIxCmMPFPW<$r2O`oluk)TR_Rm$@a*^3I`t7514kD)HOSW>+{fg<6#MOu~rBL)s&Yu42!q2%x;n7Lfwz%QpA;0bsL&7Km zk|i+z>Dra`+KUG#29Pax;pu7TQolV#ti04QqyvFdB&%7qzPsP!HzBVuRz4p)1Kx82 z1PU!Z68Zgpw&KFcLL%oK6kEF0Hu=b|wqH~=uC^6~=DH+cEidcPDM(pt0+{AI6^?=_ zsgi8M^hH@A`(Eb1*!~^P(qg6Ohas+F7M$;jz21!NF?wb9jzWdRM^M~+thV88&M&BQ z%1y9f<00gIm|1X*Y;ywQeQMLDWwVX{W>P5A=O=2R~EF|h>dM3 zg@L4a+&VxGL^?o^*gD|ap|qBu4hpNUQ+PafLgDw46To+)6M%$hQysW?AaXV`{f04j z==unG9j_LvR?b&ty%(1hb1g#jU=I}TI4M(8;#0#i)9lCwAd`0*yIln?@)-gMDSxib zs2^#YUXAnRtFVi#;_QZPU%&aCHvu#wjyaws2kksV0OhyY+^FK&@qsP`xYm)Z3P1c} z@ZzK5#AS7mj=8Yb?{%)6m`xNEz^9cr_-w?@aMzhyCblqaqVO3)2@VW~f zUB45D6QiJHPk7QxDgR_5)j@vynIA^SeH)NP09o|LcW=43!r+|*&<#%qC^bpH=5O^r z?r!W@v_fM(`LlDk*NtH(ZIcf8sq3^3kfOfL(YSFZ&KjZ(od-JLGeM4(4$yg}17xzS z1GKyA0NG7QfE~OQ58(EZlMERZ+UGD>Y9OZ)cgyC@F{YwZN9<2$TZg~V-A9ajj-_lH zNUvmfc4E%#x>NlR8XyZosJf|o89%eWDuPh(EHEn`y(18Dk^j|doBQqFxgTw+Li~djP~ewTani{x1dzq@>=qAa ze*4=l;u>vFVG4lSu(!hEKyB8>HSa54r5*<3O98FIB_ni!iR?q)dShh zt$W$N_5IyDh{E-#tbEP6-AU&k8}cFPJr?{rwo#jDtBInVxNul)10TNF;;$p$5D@x< zWYy#MQwe#Cim7=+od7N^BoOH}acLR*2x8@_CV~#Q&Tv9OMr1k#DKJa`P6m_FJjN<3E}FF6cW-7*}K$H`}eY6vR z%rcVwN8j79MQkE$m;%LN0Hw4BkV;<%%BkZ=2S^wj*ttcMhzE11yZ+l{t8{>lI32L6 zkEa8ki=41>`=1lQqE@eo6<4qzng}e>a9}}sSS&MzsUU_Z)aHaWDb~6L{q^K>(pp{& zGr>>#O2*jZFbyagwW$>NQczMI@Kjr^4v?9K4!G8nP1FH;1=NAy+fFEGi_$45s+JB= zj4~5|VL%*z1T;jLWF|^c+&oh$3`3;^O!&_+Tb>-eXYr9WHr1E-5i9P- zY{`);@3ArfHLRKt&~|c@h$n@30Cy} zU(j_yy|>@FK&5X~e=?D&4EB)0Y}th&ZYdTv2aGkX zYmD5~!F%@cz3C5j_A@Bd5x1czzWOhSfxrsmxCu4|5QJ4L6kJMjSewygK(?27$6(CKAbqK|MvGqU z-#3`sWvwNE@e(LZifUfT`XW(~5Bv0&FAn|l8$*gG)8e7l7IzDOHe?O5ogVUj?494w zx)3W0STgwHwac5jrxQS)y>WHiFQrrv=OXXNS=lNbpeJD+@aiZjV#+2h?|yI$)j{D^ zb-=%-6ACXe8<6c(W99m~6AFr!qEnO|=Y+yjJbF+a?5L?+8%GU~VG@>@oKjjI=eqo; zsY`uxJ1*Jpc=4kr-4n%yj88JPfVVeJ4&EHFnJB1lMXkLW{`=t{1`sP*t@+KR@6?(N z4M1rhO#rkhEF3yB8}5NrjLZpGjoR`)LGv~g9V7;{2kQXk?Vf-ArHp2Na_vB{Air)? zwD!W#qOT?$6T%vwBh6)tXQzJuQjgb)s6u+hoP6i^=lAB96#yjo?#vD)9>Iy>q#KWy zu@s8QJE8W7v^Ux|CKi;8)&xMRG+1nQtg>3vWmR+6=p5!T7_C~QTGQOAU826?Qs%0oYw{m=mqwR%bbcO}KZ$vKlI);9D7 zmN+K>8K&tJ{_6DB0SZT;1C(@92S^0c0ss0=T16=*bP95O(E)mz)&V!Me4r`OhJ@^I zb$~>m62L7d%{6XHq7Jobl~0mx{>TJ1l*jFaA|gG`!PyvxsvaQC`;@HbYQVuG{l^UD zzu3xlkCDK8=Px}dDw;?D>2NmpKL5{{Vqt4Z0@%<88TP9R&s; z1URd0)rG9a9bOG1AXEvNIzY+I=hvV5&Nu06iNexX)=}vCTK$em#u4fw#AB;%*15&^ z>SRU;3Pi69Pe9UgXxUpK*&spyurQIN>(8B4<=*hQ^NBkdm+Ao7Xqy1BG3T&A9+X^A zHg8Bw%t&jK1;p7R_Goy3Ye48qNin!_a7Ekp21G##6iooc&{jPDirJ9CR0dy_f@Il` zj(a=dk#WM%V@~vG zPJkfMSGXP*?;zY}i-#XEQaX}!XDW^nETa@HI^eA~N*y4rZV5omatWxV9Eey|ER?^@ z&K4GzE|#USiYsv$q!N83>v`GhGj7=4pg+rFrG6Z(F9uipCW4y!r?u@e8Z+A=Ticm4S@(MDEBc_F%4ZK<9eU%OFby}?Sg zDq%>ye&4U?MgW=3_SsW8=z7C{3816g1TcMT&Tt1ZKy&>A%{@~gG$c?+)K;4gc&O96 zbD8(AebK>ap?7~?H3E@p06F#RKp8hD6y!>&Q&7-B2^beVSICk1@$u4W5&rsk2SYb3 z#zbz)CvsC7A9Cc}_ES;IPnO0J;NdQtwW|E#xAr~yT>!X1s)0ks6Lle5QEu^Bd$Ej_ z-qj`T!mnN%mi(HFqOBB_g@ArJ%I%IljI#Wi@LJ4}1am+5b_{V9})5cuHgYlp`IzS_9E(RoDnL_ zR1Vcp(yaWcdDq_lU;=f{U(6hV(v7C%1F6cCQcjy2)D(QgF?9%FD-{^X20GHMr+1ZYC>GOe-u*cB31}!d) z7-i{6R;LKu>oG3IoDUcGc6MBE{1 z9GE;*r6u-wmi&;fgRrDL-VNgbsmTwJn*6V9gJ_couP(ODwSidA;{Wov6;ONk658fd9=^Q3nj%d zn=q&TOO0X;DI=t%WUd1h-gW{|_IVQpv@$*IB4r^oAMAytvk`c7)V$AbMZfDUnuPHo z(_$TP6`BmIEyuI-(09Cr?8n3>T1_SZizq(f_-CDh@?PnHzuH@Lz*U{gIzW#$C4hs@T6M(L#aUwS@P$qf&f*D>V zFQB%z=E;h&GdOaSl4Uawe31EJ%IDu0#78BtbxW0MM>`7LAzLF}UrAv853ek^bHD&x z8%dzx`GvE?3tJE?vI)(N_@v<2hDMF8zjZGGv@7U<*HuZ8cz)xp*O&i6 z6m)3l00l$S0WzJ^0kYceakclz>Sx4!ij@xv4t##p06Zcjux#g>k>L)x&9gb>A%TUKev^-`6CG!RL+YC8 zFU4-}?k~=82GGM$p6{%@kx`GRa!QMsIp^!8-FLr00DZE-Ys&SUctZ4wvuY?SPpHvz zc>fw}1VwQ%R7>q(Du=evYpo8H6Fs!rI?cOgX+7ha;v6K?)nlP`MzrT#W``x)U@FP_ zsZL`Zu#|T~VG(1YRm#Rv%_p4|+3M;5887GnnG{Mu&A((!dkK8ob_6`_!1mYN`-<0!(L8EJ4tm| z&dNHbPOW*X`?T=}a7_Z^m$sj`H}(|*=&~^Q-`0-~Z@5bU8Ga}FByFsiSx5j04RIm) zVE9xB--DsWn)^L30|lSGf7Pv0ug&{0(+NO2&&Z$4toJJt8xf-*-M0?V zLe&9s(b56Rs-gpKwPdT_4qaGr;Y34mMFvPZK(6IFK&Hn!KwFd!_+N2SIawy@6lCJ1 z17-R+VMRW3I)#r?z)3)@o?t|I&A`Sjl%H}DapuO#(Vs79yW8SE*jDAyJG?migk*BO z-fQ3LkULU?0Kl!9Z10*`y)VyA$R!H@CC&hKonN@={=9jOMKM+f<#(Aq;QbB(osIoG z)GAp`OLW`j)z&y~DyThZ^sPoW{z(p?%E^vi2dauL;iXcep!44ZK#DPfxo4#ePm~QY z6++W1s?O%zJ-zIgoy6;pNP6wiBQD#=Fp4ar*vJjG(gMW8ruP>^?+ z3BVl`mo_8~VDej=#B6vdI$=y+gNb(z9zHn3csaE^mJ~WbQTR##Vvn`jbbt)1b)bye z4RxT3YOW51203X}sF=?sEBCzNgu<_q6M(!Q^vY@V=>V-h9q@k1Ngb57K~fCk<(L7F z3)G4T-!CMklx!w^<0Ep|ShD(C1trM2xv$yK92t;?Ehp00f7mKIYuF#g;-KKEdtV%X z)4!&8!e$iox-tLsg?^QDKj1Yppo%)|=01IW$EAnj-HF#BL@2~xX|T#NF*SxL=oL79 z+@@DDYY3T$QCRl#GFF=oP;8L?Z~c&2`%xgVBI6<*@bHnWbb#KJbihqrB)V?x^K{Yd zFQ^WRJE;SeYRWovfMOi!fF;-o1qHw;K{3_|1x1O|Dd^=-2Pmhy4v-F22LjbiNeAc! zSO@%+xFP{|-co0E4tK} zww3_8ti9i1)!XsIwg>=;QKED4vXkyemE*Sm%Z>MvntY_-fL4jn1!p323T#dx5|h3C z{t^GX{b|Fh#NSP{0r7Ds<#hZmRD3u#Noi+Y*Lm1WagS>d1qIevba_DdD0gv^F$xOf zRruqP>-Dx}5C!ch)9=j+9C*p7qta+z#%i1LSMzTUt`QOhV@2V}M%PF(9ANulj&_jE5NSk@i4rJN_OC>Mr=d~=hL%i(XBCM4faBq zDhaqekX=Z=kujxOq;UxiQj1&%=#bL^uYFEfQAF-{%k@cqTKi{e6^U;;K$b!}Kz;){ zK)$m&K=~7Oz@>t0t`1NZ2OXeTpgQ2HZgn~ktY)VU&;xi0;HHySk?TtdiY{gfwU$E= zd(e>;4|{Yto51fTXAn-M9A4H~$02+jhw#6$iA(t?ez;Qf!psJ-1kkl>M!WMHx2&H) z013M}wHrqSHES&Zh)v;x2EnBh@m8R%g}*~W7PTKI^ZqNoKjk)){;&^Z%jHsMm;(}w<;5WH$jzw7*3DK zT%GTvQE{0orS*5H0(Kb7M5D2u>fy+WYsCEDh-qlP&R8Fs3vr4@B`D@AFL!49UwPY z9k8@?(p<{9D=E~R4H5DDfLNhnN$21 z11LD`N88^I8gfc#oH=kyQtUafpvsF)iim;&jjoz>seHFOI|y)92kFYp(SL>pwjzKM z;w*80(Eh;+L-*xVMbgq4s8Q18m>)WRZy%p;j*MeG0NL8=6s}5s)&YODx^#eU zr8+>7MRb5JpAt}$(8?w5JQj8nqsIGcY?~%28=HT0a>{TA-cdW{!X=CL=tG~43Yos~ zYZ@{#Hs0~}dCzaJ2$7J_MAe;bH!}17&WJTAddNZET=e(;!M}+65~HBEi*?ms8u+K{ zr$iB|?mMeLJbTG|l`(fc??_h558fQ!Cf|@O$OLj(jkOh?zwwM%l~wa<{@GpgerzB_ zDc)Rli0J?cX!9E9G+O!VWMV~D$OUDeW(FpUUhz4xP_{}3=x#W9>deJs+EgP}WWhC| zZ_w4>kBXC>w@Pg@IzZt!#x`6QG^p88V&&OeRzAFJn>BkKhK`%8`E{UTkfg}o9#duM zAbC7u0`x$1nyhS=ktnPu@@JM-3SZ4%yucx{(B_j3T|YQUEwK!c6gogA&wcJ6Yrm$K zCsDX`loTa^=S~1xWjX~}o9h5&z%c>PfwhK91TsJ%D_Klta!Q7n$guR&+UR}LNmG2) zIOr7gT&4q*GE4{P(kKD7d;_o`Gg7#L09;M-lm(fwgsbxNL&`DuHY6@zN$9%r9h=zQ z*u0|Wi({+q4u5&1&~EX$+eLQo=(XIDf%A$`WPAsOl zQI8R0o{s+f$CW2IV_t_v))9BF%bMp`IuSrdP&z;Yst(Zeg$~d$Tmn!!ARVB4LClqh zUk=+Uwj9=6? Date: Fri, 1 Feb 2019 16:34:43 +0000 Subject: [PATCH 758/901] Light up the stage: Fix script with Commune with Lava --- forge-gui/res/cardsfolder/l/light_up_the_stage.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/cardsfolder/l/light_up_the_stage.txt b/forge-gui/res/cardsfolder/l/light_up_the_stage.txt index 21a35b29f95..53faab4f3a8 100644 --- a/forge-gui/res/cardsfolder/l/light_up_the_stage.txt +++ b/forge-gui/res/cardsfolder/l/light_up_the_stage.txt @@ -2,8 +2,8 @@ Name:Light Up the Stage ManaCost:2 R Types:Sorcery K:Spectacle:R -A:SP$ Mill | Cost$ 2 R | Defined$ You | NumCards$ 2 | Destination$ Exile | RememberMilled$ True | SubAbility$ DBStoreTurn | SpellDescription$ Exile the top two cards of your library. Until the end of your next turn, you may play those cards. -SVar:DBStoreTurn:DB$ StoreSVar | SVar$ CurrentTurn | Type$ Count | Expression$ YourTurns | SubAbility$ DBMayBePlay -SVar:DBMayBePlay:DB$ Effect | StaticAbilities$ STCommuned | Duration$ Permanent | RememberObjects$ Remembered | Triggers$ TrigDuration | SVars$ DBDuration,EndDuration,CurrentTurn | SubAbility$ DBCleanup | ExileOnMoved$ Exile +A:SP$ Mill | Cost$ 2 R | Defined$ You | NumCards$ 2 | Destination$ Exile | RememberMilled$ True | SubAbility$ DBMayBePlay | SpellDescription$ Exile the top two cards of your library. Until the end of your next turn, you may play those cards. +SVar:DBMayBePlay:DB$ Effect | StaticAbilities$ STCommuned | Duration$ UntilTheEndOfYourNextTurn | RememberObjects$ Remembered | ForgetOnMoved$ Exile SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -Oracle:Spectacle {R} (You may cast this spell for its spectacle cost rather than its mana cost if an opponent lost life this turn.)\nExile the top two cards of your library. Until the end of your next turn, you may play those cards. +SVar:STCommuned:Mode$ Continuous | Affected$ Card.IsRemembered | EffectZone$ Command | AffectedZone$ Exile | MayPlay$ True | Description$ Until the end of your next turn, you may play those cards. +Oracle:Spectacle {R} (You may cast this spell for its spectacle cost rather than its mana cost if an opponent lost life this turn.)\nExile the top two cards of your library. Until the end of your next turn, you may play those cards. \ No newline at end of file From 05538bfba2fc29ed8320926d05d4b020c479034c Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Fri, 1 Feb 2019 17:10:37 +0000 Subject: [PATCH 759/901] Update captive_audience.txt --- .../res/cardsfolder/c/captive_audience.txt | 32 +++++++------------ 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/forge-gui/res/cardsfolder/c/captive_audience.txt b/forge-gui/res/cardsfolder/c/captive_audience.txt index d5eeb9922a9..c4e0254c993 100644 --- a/forge-gui/res/cardsfolder/c/captive_audience.txt +++ b/forge-gui/res/cardsfolder/c/captive_audience.txt @@ -1,26 +1,18 @@ -# TODO: -- THIS SCRIPT NEEDS REWRITING (non-functional) -- Name:Captive Audience ManaCost:5 B R Types:Enchantment -K:CARDNAME enters the battlefield under the control of your choice. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChoose | TriggerDescription$ At the beginning of your upkeep, choose one that hasn't been chosen -PB/-greater for each opponent of your choice. -SVar:TrigChoose:DB$ ChooseCard | Defined$ You | Choices$ Player.Opponent | Mandatory$ True | SubAbility$ DBChangeZone -SVar:DBChangeZone:DB$ ChangeZone | Defined$ Self | Origin$ All | Destination$ Battlefield | GainControl$ True -SVar:RemRandomDeck:True -K:CARDNAME enters the battlefield under the control of your choice. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChoose | TriggerDescription$ At the beginning of your upkeep, choose one that hasn't been chosen -PB/-greater for each opponent of your choice. -SVar:TrigChoose:DB$ ChooseCard | Defined$ You | Choices$ Player.Opponent | Mandatory$ True | SubAbility$ DBChangeZone -SVar:DBChangeZone:DB$ ChangeZone | Defined$ Self | Origin$ All | Destination$ Battlefield | GainControl$ True -SVar:RemRandomDeck:True -K:CARDNAME enters the battlefield under the control of your choice. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChoose | TriggerDescription$ At the beginning of your upkeep, choose one that hasn't been chosen -PB/-greater for each opponent of your choice. -SVar:TrigChoose:DB$ ChooseCard | Defined$ You | Choices$ Player.Opponent | Mandatory$ True | SubAbility$ DBChangeZone -SVar:DBChangeZone:DB$ ChangeZone | Defined$ Self | Origin$ All | Destination$ Battlefield | GainControl$ True -SVar:RemRandomDeck:True -K:CARDNAME enters the battlefield under the control of your choice. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChoose | TriggerDescription$ At the beginning of your upkeep, choose one that hasn't been chosen -PB/-greater for each opponent of your choice. -SVar:TrigChoose:DB$ ChooseCard | Defined$ You | Choices$ Player.Opponent | Mandatory$ True | SubAbility$ DBChangeZone -SVar:DBChangeZone:DB$ ChangeZone | Defined$ Self | Origin$ All | Destination$ Battlefield | GainControl$ True +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChoose | Static$ True | TriggerDescription$ CARDNAME enters the battlefield under the control of an opponent of your choice. +SVar:TrigChoose:DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | ChoiceTitle$ Choose an opponent to give control to: | AILogic$ Curse | SubAbility$ DBDonate | SpellDescription$ CARDNAME enters the battlefield under the control of an opponent of your choice. +SVar:DBDonate:DB$ GainControl | Defined$ Self | NewController$ Player.Chosen | SubAbility$ ClearRemembered +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigCharm | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, choose one that hasn't been chosen +SVar:TrigCharm:DB$ Charm | Choices$ LifePact,DiscardPact,ZombiesPact | ChoiceRestriction$ NotRemembered | RememberChoice$ True | CharmNum$ 1 +SVar:LifePact:DB$ SetLife | Defined$ You | LifeAmount$ 4 | ChoiceName$ LifePact | SpellDescription$ Your life total becomes 4. +SVar:DiscardPact:DB$ Discard | Defined$ You | Mode$ Hand | ChoiceName$ DiscardPact | SpellDescription$ Discard your hand. +SVar:ZombiesPact:DB$ RepeatEach | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ MakeZombies | ChoiceName$ ZombiesPact | SpellDescription$ Each opponent creates five 2/2 black Zombie creature tokens. +SVar:MakeZombies:DB$ Token | TokenImage$ b 2 2 zombie rna | TokenAmount$ 5 | TokenName$ Zombie | TokenTypes$ Creature,Zombie | TokenOwner$ Remembered | TokenColors$ black | TokenPower$ 2 | TokenToughness$ 2 | SpellDescription$ Each opponent creates five 2/2 black Zombie creature tokens. +# Clear RememberChoice just in case it's not getting cleared by Zone changes +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ ClearRemembered | Static$ True +SVar:ClearRemembered:DB$ Cleanup | ClearRemembered$ True SVar:RemRandomDeck:True DeckHas:Ability$Token Oracle:Captive Audience enters the battlefield under the control of an opponent of your choice.\nAt the beginning of your upkeep, choose one that hasn't been chosen —\n• Your life total becomes 4.\n• Discard your hand.\n• Each opponent creates five 2/2 black Zombie creature tokens. From 4c7c2ee1b5afbf2a59e6584bd7031d176ee2259a Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Fri, 1 Feb 2019 17:20:23 +0000 Subject: [PATCH 760/901] User reported Locust God's return trigger wasn't working on Resolution, but that it does work for Scarab God. Changed one word in Locust God's trigger to match Scarab God's --- forge-gui/res/cardsfolder/t/the_locust_god.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/t/the_locust_god.txt b/forge-gui/res/cardsfolder/t/the_locust_god.txt index a7366e5e3ec..014c5cc6f5e 100644 --- a/forge-gui/res/cardsfolder/t/the_locust_god.txt +++ b/forge-gui/res/cardsfolder/t/the_locust_god.txt @@ -8,7 +8,7 @@ SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenName$ Insect | TokenTypes$ Crea A:AB$ Draw | Cost$ 2 U R | NumCards$ 1 | SpellDescription$ Draw a card, then discard a card. | SubAbility$ DBDiscard SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | TriggerController$ TriggeredCardController | Execute$ TrigDelay | TriggerDescription$ When CARDNAME dies, return it to its owner's hand at the beginning of the next end step. -SVar:TrigDelay:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | RememberObjects$ Self | Execute$ TrigReturn | SpellDescription$ Return that creature to its owner's hand at the beginning of the next end step. +SVar:TrigDelay:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | RememberObjects$ TriggeredCard | Execute$ TrigReturn | SpellDescription$ Return that creature to its owner's hand at the beginning of the next end step. SVar:TrigReturn:DB$ ChangeZone | Defined$ DelayTriggerRemembered | Origin$ Graveyard | Destination$ Hand DeckHas:Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/the_locust_god.jpg From 7843004c40a681ae6a0cb37ea3623e93889f861b Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Fri, 1 Feb 2019 18:12:25 +0000 Subject: [PATCH 761/901] Fixed Ferocious condition --- forge-gui/res/cardsfolder/f/flames_of_the_raze_boar.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/f/flames_of_the_raze_boar.txt b/forge-gui/res/cardsfolder/f/flames_of_the_raze_boar.txt index b34007dee23..911e8b4d586 100644 --- a/forge-gui/res/cardsfolder/f/flames_of_the_raze_boar.txt +++ b/forge-gui/res/cardsfolder/f/flames_of_the_raze_boar.txt @@ -2,6 +2,7 @@ Name:Flames of the Raze-Boar ManaCost:5 R Types:Instant A:SP$ DealDamage | Cost$ 5 R | NumDmg$ 4 | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | SubAbility$ DBDealDamage | SpellDescription$ CARDNAME deals 4 damage to target creature an opponent controls. Then CARDNAME deals 2 damage to each other creature that player controls if you control a creature with power 4 or greater. -SVar:DBDealDamage:DB$ DamageAll | NumDmg$ 2 | ValidCards$ Creature.attacking+YouCtrl+powerGE4 | SubAbility$ DBCleanup +SVar:DBDealDamage:DB$ DamageAll | NumDmg$ 2 | ValidCards$ Creature.ControlledBy TargetedOrController | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | References$ X| SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Count$Valid Creature.powerGE4+YouCtrl Oracle:Flames of the Raze-Boar deals 4 damage to target creature an opponent controls. Then Flames of the Raze-Boar deals 2 damage to each other creature that player controls if you control a creature with power 4 or greater. From 9cf78d0eb4fdb436a0fe209832f8e09b4daaccdd Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Fri, 1 Feb 2019 18:18:04 +0000 Subject: [PATCH 762/901] Update deputy_of_detention.txt --- forge-gui/res/cardsfolder/d/deputy_of_detention.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/d/deputy_of_detention.txt b/forge-gui/res/cardsfolder/d/deputy_of_detention.txt index a29ca9f4bb5..300423f09a3 100644 --- a/forge-gui/res/cardsfolder/d/deputy_of_detention.txt +++ b/forge-gui/res/cardsfolder/d/deputy_of_detention.txt @@ -4,7 +4,7 @@ Types:Creature Vedalken Wizard PT:1/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target nonland permanent an opponent controls and all other nonland permanents that player controls with the same name as that permanent until CARDNAME leaves the battlefield. SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | RememberTargets$ True | SubAbility$ DBChangeZoneAll -SVar:DBChangeZoneAll:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Remembered.sameName+OppCtrl | RememberChanged$ True | SubAbility$ DBEffect +SVar:DBChangeZoneAll:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Remembered.sameName+ControlledBy TargetedOrController | RememberChanged$ True | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | Triggers$ ComeBack | RememberObjects$ Remembered | ImprintCards$ Self | SVars$ TrigReturn,ExileSelf | ConditionPresent$ Card.Self | Duration$ Permanent | ForgetOnMoved$ Exile | SubAbility$ DBCleanup SVar:ComeBack:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.IsImprinted | Execute$ TrigReturn | TriggerZones$ Command | TriggerController$ TriggeredCardController | Static$ True | TriggerDescription$ Those permanents are exiled until EFFECTSOURCE leaves the battlefield SVar:TrigReturn:DB$ ChangeZoneAll | Origin$ Exile | Destination$ Battlefield | ChangeType$ Card.IsRemembered | SubAbility$ ExileSelf From 419219557937083477f3e91457216aee71bd2123 Mon Sep 17 00:00:00 2001 From: Sol Date: Fri, 1 Feb 2019 19:11:15 +0000 Subject: [PATCH 763/901] Update carnival_carnage.txt --- forge-gui/res/cardsfolder/c/carnival_carnage.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/c/carnival_carnage.txt b/forge-gui/res/cardsfolder/c/carnival_carnage.txt index ff4c52ed297..f991a3e2844 100644 --- a/forge-gui/res/cardsfolder/c/carnival_carnage.txt +++ b/forge-gui/res/cardsfolder/c/carnival_carnage.txt @@ -2,7 +2,7 @@ Name:Carnival ManaCost:BR AlternateMode: Split Types:Instant -A:SP$ DealDamage | Cost$ BR BR | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker | NumDmg$ 1 | SubAbility$ DBDealDamage | SpellDescription$ CARDNAME deals 1 damage to target creature or planeswalker and 1 damage to that permanent’s controller. +A:SP$ DealDamage | Cost$ BR | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker | NumDmg$ 1 | SubAbility$ DBDealDamage | SpellDescription$ CARDNAME deals 1 damage to target creature or planeswalker and 1 damage to that permanent’s controller. SVar:DBDealDamage:DB$ DealDamage | Defined$ TargetedController | NumDmg$ 1 Oracle:Carnival deals 1 damage to target creature or planeswalker and 1 damage to that permanent’s controller. From 0d4310382edc3cdd70600d730a23593f1d220354 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Fri, 1 Feb 2019 20:10:21 +0000 Subject: [PATCH 764/901] Update rakdos_the_showstopper.txt using DestroyAll --- .../res/cardsfolder/r/rakdos_the_showstopper.txt | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/forge-gui/res/cardsfolder/r/rakdos_the_showstopper.txt b/forge-gui/res/cardsfolder/r/rakdos_the_showstopper.txt index a5f7e8ef7c9..41ac03324cc 100644 --- a/forge-gui/res/cardsfolder/r/rakdos_the_showstopper.txt +++ b/forge-gui/res/cardsfolder/r/rakdos_the_showstopper.txt @@ -4,8 +4,10 @@ Types:Legendary Creature Demon PT:6/6 K:Flying K:Trample -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ EachCr | TriggerDescription$ When CARDNAME enters the battlefield, flip a coin for each creature that isn't a Demon, Devil, or Imp. Destroy each creature whose coin comes up tails. -SVar:EachCr:DB$ RepeatEach | RepeatCards$ Creature.nonDemon+nonDevil+nonImp | Zone$ Battlefield | RepeatSubAbility$ TrigFlip -SVar:TrigFlip:DB$ FlipACoin | NoCall$ True | TailsSubAbility$ DBDestroy -SVar:DBDestroy:DB$ Destroy | Defined$ Remembered -Oracle:Flying, trample\nWhen Rakdos, the Showstopper enters the battlefield, flip a coin for each creature that isn't a Demon, Devil, or Imp. Destroy each creature whose coin comes up tails. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFlip | TriggerDescription$ When CARDNAME enters the battlefield, flip a coin for each creature that isn't a Demon, Devil, or Imp. Destroy each creature whose coin comes up tails. +SVar:TrigFlip:DB$ RepeatEach | RepeatCards$ Creature.nonDemon+nonDevil+nonImp | Zone$ Battlefield | UseImprinted$ True | RepeatSubAbility$ DBFlip | SubAbility$ DBDestroy +SVar:DBFlip:DB$ FlipACoin | NoCall$ True | TailsSubAbility$ DBRememberCreature +SVar:DBRememberCreature:DB$ Pump | Defined$ Imprinted | RememberObjects$ Imprinted +SVar:DBDestroy:DB$ DestroyAll | ValidCards$ Creature.IsRemembered | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True +Oracle:Flying, trample\nWhen Rakdos, the Showstopper enters the battlefield, flip a coin for each creature that isn't a Demon, Devil, or Imp. Destroy each creature whose coin comes up tails. \ No newline at end of file From ea8c6630e00779133266305942071cacf78422b0 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Fri, 1 Feb 2019 23:31:09 +0000 Subject: [PATCH 765/901] Update cry_of_the_carnarium.txt --- forge-gui/res/cardsfolder/c/cry_of_the_carnarium.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/c/cry_of_the_carnarium.txt b/forge-gui/res/cardsfolder/c/cry_of_the_carnarium.txt index 4d9a4e811f5..c3753c455ec 100644 --- a/forge-gui/res/cardsfolder/c/cry_of_the_carnarium.txt +++ b/forge-gui/res/cardsfolder/c/cry_of_the_carnarium.txt @@ -1,6 +1,6 @@ Name:Cry of the Carnarium ManaCost:1 B B Types:Sorcery -A:SP$ PumpAll | Cost$ 1 B B | ValidCards$ Creature | NumAtt$ -2 | NumDef$ -2 | IsCurse$ True | SubAbility$ DBCopy | SpellDescription$ All creatures get -2/-2 until end of turn. Exile all creature cards in all graveyards that were put there from the battlefield this turn. If a creature would die this turn, exile it instead. -SVar:Exile:DB$ ChangeZoneAll | Origin$ Graveyard | Destination$ Exile | ChangeType$ Creature | Mandatory$ True +A:SP$ PumpAll | Cost$ 1 B B | ValidCards$ Creature | NumAtt$ -2 | NumDef$ -2 | IsCurse$ True | ReplaceDyingValid$ Creature | SubAbility$ ExileSomeCreatures | SpellDescription$ All creatures get -2/-2 until end of turn. Exile all creature cards in all graveyards that were put there from the battlefield this turn. If a creature would die this turn, exile it instead. +SVar:ExileSomeCreatures:DB$ ChangeZone | Defined$ ThisTurnEntered_Graveyard_from_Battlefield_Creature.nonToken | Origin$ Graveyard | Destination$ Exile | SpellDescription$ Exile all creature cards in all graveyards that were put there from the battlefield this turn. Oracle:All creatures get -2/-2 until end of turn. Exile all creature cards in all graveyards that were put there from the battlefield this turn. If a creature would die this turn, exile it instead. From eda0a490976e82252b66fc4207938315c291a0d1 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sat, 2 Feb 2019 00:14:16 +0000 Subject: [PATCH 766/901] Update token image parameter for Domri, Chaos Bringer --- forge-gui/res/cardsfolder/d/domri_chaos_bringer.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/d/domri_chaos_bringer.txt b/forge-gui/res/cardsfolder/d/domri_chaos_bringer.txt index 74ee094865e..feb76cc25de 100644 --- a/forge-gui/res/cardsfolder/d/domri_chaos_bringer.txt +++ b/forge-gui/res/cardsfolder/d/domri_chaos_bringer.txt @@ -6,5 +6,5 @@ A:AB$ Mana | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | Produced$ Combo A:AB$ Dig | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | ForceRevealToController$ True | DigNum$ 4 | ChangeNum$ 2 | Optional$ True | ChangeValid$ Creature | RestRandomOrder$ True | SpellDescription$ Look at the top four cards of your library. You may reveal up to two creature cards from among them and put them into your hand. Put the rest on the bottom of your library in a random order. A:AB$ Effect | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Ultimate$ True | Name$ Emblem - Domri, Chaos Bringer | Image$ emblem_domri_chaos_bringer | Triggers$ EffPhase | SVars$ EmblemTrigToken | Duration$ Permanent | SpellDescription$ You get an emblem with “At the beginning of each end step, create a 4/4 red and green Beast creature token with trample.” SVar:EffPhase:Mode$ Phase | Phase$ End of Turn | Execute$ EmblemTrigToken | TriggerDescription$ At the beginning of each end step, create a 4/4 red and green Beast creature token with trample. -SVar:EmblemTrigToken:DB$ Token | TokenOwner$ You | TokenAmount$ 1 | TokenPower$ 4 | TokenToughness$ 4 | TokenColors$ Red,Green | TokenTypes$ Creature,Beast | TokenKeywords$ Trample | TokenImage$ rg 4 4 beast rna +SVar:EmblemTrigToken:DB$ Token | TokenOwner$ You | TokenAmount$ 1 | TokenPower$ 4 | TokenToughness$ 4 | TokenColors$ Red,Green | TokenTypes$ Creature,Beast | TokenKeywords$ Trample | TokenImage$ rg 4 4 beast trample rna Oracle:+1: Add {R} or {G}. If that mana is spent on a creature spell, it gains riot. (It enters the battlefield with your choice of a +1/+1 counter or haste.)\n−3: Look at the top four cards of your library. You may reveal up to two creature cards from among them and put them into your hand. Put the rest on the bottom of your library in a random order.\n−8: You get an emblem with “At the beginning of each end step, create a 4/4 red and green Beast creature token with trample.” From b27f49c4ffd065008a42a53cd20661af7ad307fd Mon Sep 17 00:00:00 2001 From: Blacksmith Date: Sat, 2 Feb 2019 01:58:00 +0000 Subject: [PATCH 767/901] Update README.txt for release --- forge-gui/README.txt | 93 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 92 insertions(+), 1 deletion(-) diff --git a/forge-gui/README.txt b/forge-gui/README.txt index 11b369846f2..fdd08d9e5c8 100644 --- a/forge-gui/README.txt +++ b/forge-gui/README.txt @@ -1 +1,92 @@ -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: 02/02/2019 ver 1.6.20 + +18457 cards in total. + + +-------------- +Release Notes: +-------------- + +- New Cards - +Vizkopa Vampire; Vengeant Vampire; Vindictive Vampire; Verity Circle; Zegana, Utopian Speaker; Zhur-Taa Goblin; Kaya, Orzhov Usurper; Knight of the Last Breath; Knight of Sorrows; Kaya's Wrath; Thought Collapse; Tenth District Veteran; Territorial Boar; Teysa Karlov; Theater of Horrors; Trollbred Guardian; Tithe Taker; Thirsting Shade; Tome of the Guildpact; Thrash; Twilight Panther; Tin Street Dodger; The Haunt of Hightower; Titanic Brawl; Cindervines; Combine Guildmage; Carrion Imp; Consecrate; Collision; Code of Constraint; Clear the Stage; Captive Audience; Clamor Shaman; Consign to the Pit; Cavalcade of Calamity; Clear the Mind; Civic Stalwart; Carnival; Catacomb Crocodile; Charging War Boar; Cry of the Carnarium; Coral Commando; Clan Guildmage; Cult Guildmage; Chillbringer; Growth Spiral; Galloping Lizrog; Gruul Locket; Get the Point; Gruul Spellbreaker; Gravel-Hide Goblin; Growth-Chamber Guardian; Gyre Engineer; Glass of the Guildpact; Guardian Project; Grotesque Demise; Gateway Sneak; Ghor-Clan Wrecker; Gates Ablaze; Gutterbones; Goblin Goliath; Grasping Thrull; Goblin Gathering; Gatebreaker Ram; Gruul Beastmaster; Gate Colossus; Windstorm Drake; Wrecking Beast; Watchful Giant; Warrant; Wilderness Reclamation; Wall of Lost Thoughts; Impassioned Orator; Incubation Druid; Inspired Sphinx; Immortal Phoenix; Immolation Shaman; Incubation; Imperious Oligarch; Ill-Gotten Inheritance; Dovin's Automaton; Dovin's Dismissal; Debtors' Transport; Deface; Dovin's Acuity; Drill Bit; Dagger Caster; Dovin, Grand Arbiter; Deputy of Detention; Domri, City Smasher; Dead Revels; Domri's Nodorog; Domri, Chaos Bringer; Dovin, Architect of Law; Depose; Justiciar's Portal; Judith, the Scourge Diva; Angelic Exaltation; Applied Biomancy; Axebane Beast; Aeromunculus; Awaken the Erstwhile; Avatar of Growth; Angler Turtle; Angel of Grace; Azorius Locket; Azorius Skyguard; Arrester's Admonition; Arrester's Zeal; Azorius Knight-Arbiter; Amplifire; Angelic Guardian; Archway Angel; Prying Eyes; Prime Speaker Vannifar; Pteramander; Plaza of Harmony; Pestilent Spirit; Prowling Caracal; Persistent Petitioners; Pitiless Pontiff; Priest of Forgotten Gods; Plague Wight; Precognitive Perception; Rumbling Ruin; Ragefire; Rot Hulk; Rakdos Locket; Repudiate; Ravager Wurm; Rix Maadi Reveler; Rally to Battle; Rakdos Firewheeler; Rakdos Roustabout; Rhythm of the Wild; Rubblebelt Recluse; Rafter Demon; Rubble Reading; Rampage of the Clans; Rampaging Rendhorn; Resolute Watchdog; Rampaging Brontodon; Rubblebelt Runner; Rubble Slinger; Rakdos Trumpeter; Rakdos, the Showstopper; Regenesis; Revival; Lavinia, Azorius Renegade; Lumbering Battlement; Light Up the Stage; Lawmage's Binding; Hero of Precinct One; Haazda Officer; Hydroid Krasis; Humongulus; High Alert; Hackrobat; Noxious Groodion; Nikya of the Old Ways; Seraph of the Scales; Sharktocrab; Swirling Torrent; Summary Judgment; Skitter Eel; Stony Strength; Sphinx of Foresight; Spawn of Mayhem; Sphinx of the Guildpact; Spire Mangler; Skatewing Spy; Sphinx's Insight; Senate Griffin; Spirit of the Spires; Silhana Wayfinder; Spear Spewer; Smelt-Ward Ignus; Senate Guildmage; Skewer the Critics; Syndicate Guildmage; Slimebind; Savage Smash; Sky Tether; Spikewheel Acrobat; Sentinel's Mark; Sagittars' Volley; Saruli Caretaker; Shimmer of Possibility; Scuttlegator; Senate Courier; Sage's Row Savant; Sunder Shaman; Screaming Shield; Skarrgan Hellkite; Scorchmark; Storm Strike; Smothering Tithe; Steeple Creeper; Syndicate Messenger; Sylvan Brushstrider; Simic Locket; Sphinx of New Prahv; Simic Ascendancy; Sauroform Hybrid; Bloodmist Infiltrator; Basilica Bell-Haunt; Burning-Tree Vandal; Biogenic Upgrade; Bankrupt in Blood; Bolrac-Clan Crusher; Benthic Biomancer; Biomancer's Familiar; Bring to Trial; Bedevil; Bedeck; Blade Juggler; Burn Bright; Bladebrand; Biogenic Ooze; Emergency Powers; Electrodominance; Eyes Everywhere; Essence Capture; Elite Arrester; Ethereal Absolution; End-Raze Forerunners; Expose to Daylight; Enraged Ceratok; Undercity Scavenger; Undercity's Embrace; Unbreakable Formation; Orzhov Locket; Open the Gates; Orzhov Racketeers; Orzhov Enforcer; Frenzied Arynx; Faerie Duelist; Footlight Fiend; Fireblade Artist; Frilled Mystic; Flames of the Raze-Boar; Final Payment; Feral Maaka; Font of Agonies; Forbidding Spirit; Ministrant of Obligation; Mirror March; Mesmerizing Benthid; Macabre Mockery; Militant Angel; Mass Manipulation; Quench + +- Desktop GUI - +The Desktop GUI can pop up zones (Library, Graveyard, etc.) allow players to select cards from them when the option UI_SELECT_FROM_CARD_DISPLAYS is set. +The Desktop GUI outlines the selectable cards in many situations. This is not done when playing mana costs. + +- Digging - +Multi-card digging (e.g., for Genesis Wave) is done as a single multiple-card selection instead of a sequence of single-card selections. + +- Game Night - +Support was added for the Game Night box set, including all 10 exclusive cards. + +- AI improvements - +More AI improvements were implemented, hopefully making the game a little more interesting and challenging to play. + +- 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 haven't been able to distribute the OS X Application version of Forge in sometime. We've recently automated our release tools, and will continue to look in the viability of creating this file now that things are autoamted. + + +- 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 +Austinio7116 +Churrufli +DrDev +excessum +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 + +(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 eb3fb9e1ce8a8b642345fc0da8b21382af388f92 Mon Sep 17 00:00:00 2001 From: Blacksmith Date: Sat, 2 Feb 2019 02:00:28 +0000 Subject: [PATCH 768/901] [maven-release-plugin] prepare release forge-1.6.20 --- 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 47ed2d96af7..f49be94345d 100644 --- a/forge-ai/pom.xml +++ b/forge-ai/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.20-SNAPSHOT + 1.6.20 forge-ai diff --git a/forge-core/pom.xml b/forge-core/pom.xml index 092a40ddec6..7a1446bbb84 100644 --- a/forge-core/pom.xml +++ b/forge-core/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.20-SNAPSHOT + 1.6.20 forge-core diff --git a/forge-game/pom.xml b/forge-game/pom.xml index 52604f41da9..0c740f4662f 100644 --- a/forge-game/pom.xml +++ b/forge-game/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.20-SNAPSHOT + 1.6.20 forge-game diff --git a/forge-gui-android/pom.xml b/forge-gui-android/pom.xml index 4f266d3efc9..46b30fb54f2 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -19,7 +19,7 @@ forge forge - 1.6.20-SNAPSHOT + 1.6.20 forge-gui-android diff --git a/forge-gui-desktop/pom.xml b/forge-gui-desktop/pom.xml index f9529e775c5..ef66e6f1fc2 100644 --- a/forge-gui-desktop/pom.xml +++ b/forge-gui-desktop/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.20-SNAPSHOT + 1.6.20 forge-gui-desktop diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index 29d996ee1b3..71aac4ac0eb 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -12,7 +12,7 @@ forge forge - 1.6.20-SNAPSHOT + 1.6.20 forge-gui-ios diff --git a/forge-gui-mobile-dev/pom.xml b/forge-gui-mobile-dev/pom.xml index 315100b4a43..69fd0568aae 100644 --- a/forge-gui-mobile-dev/pom.xml +++ b/forge-gui-mobile-dev/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.20-SNAPSHOT + 1.6.20 forge-gui-mobile-dev diff --git a/forge-gui-mobile/pom.xml b/forge-gui-mobile/pom.xml index 7a125f1368d..1281abd3c70 100644 --- a/forge-gui-mobile/pom.xml +++ b/forge-gui-mobile/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.20-SNAPSHOT + 1.6.20 forge-gui-mobile diff --git a/forge-gui/pom.xml b/forge-gui/pom.xml index 4b4ed1c8ee7..c342179a25a 100644 --- a/forge-gui/pom.xml +++ b/forge-gui/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.20-SNAPSHOT + 1.6.20 forge-gui diff --git a/pom.xml b/pom.xml index 5b0f1f1a303..0e707eff091 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ forge pom Forge Parent - 1.6.20-SNAPSHOT + 1.6.20 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.20 From 17dedb4bf428f5d319e220e586b3a4198b4e776f Mon Sep 17 00:00:00 2001 From: Blacksmith Date: Sat, 2 Feb 2019 02:00:32 +0000 Subject: [PATCH 769/901] [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 f49be94345d..71f2c710594 100644 --- a/forge-ai/pom.xml +++ b/forge-ai/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.20 + 1.6.21-SNAPSHOT forge-ai diff --git a/forge-core/pom.xml b/forge-core/pom.xml index 7a1446bbb84..dcd9e21f87d 100644 --- a/forge-core/pom.xml +++ b/forge-core/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.20 + 1.6.21-SNAPSHOT forge-core diff --git a/forge-game/pom.xml b/forge-game/pom.xml index 0c740f4662f..75733d177e1 100644 --- a/forge-game/pom.xml +++ b/forge-game/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.20 + 1.6.21-SNAPSHOT forge-game diff --git a/forge-gui-android/pom.xml b/forge-gui-android/pom.xml index 46b30fb54f2..0b7b879a354 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -19,7 +19,7 @@ forge forge - 1.6.20 + 1.6.21-SNAPSHOT forge-gui-android diff --git a/forge-gui-desktop/pom.xml b/forge-gui-desktop/pom.xml index ef66e6f1fc2..ef528505669 100644 --- a/forge-gui-desktop/pom.xml +++ b/forge-gui-desktop/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.20 + 1.6.21-SNAPSHOT forge-gui-desktop diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index 71aac4ac0eb..d47b60c33b6 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -12,7 +12,7 @@ forge forge - 1.6.20 + 1.6.21-SNAPSHOT forge-gui-ios diff --git a/forge-gui-mobile-dev/pom.xml b/forge-gui-mobile-dev/pom.xml index 69fd0568aae..9c3c6a58b79 100644 --- a/forge-gui-mobile-dev/pom.xml +++ b/forge-gui-mobile-dev/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.20 + 1.6.21-SNAPSHOT forge-gui-mobile-dev diff --git a/forge-gui-mobile/pom.xml b/forge-gui-mobile/pom.xml index 1281abd3c70..15c79fb010b 100644 --- a/forge-gui-mobile/pom.xml +++ b/forge-gui-mobile/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.20 + 1.6.21-SNAPSHOT forge-gui-mobile diff --git a/forge-gui/pom.xml b/forge-gui/pom.xml index c342179a25a..25d041cca94 100644 --- a/forge-gui/pom.xml +++ b/forge-gui/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.20 + 1.6.21-SNAPSHOT forge-gui diff --git a/pom.xml b/pom.xml index 0e707eff091..665ff4056f2 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ forge pom Forge Parent - 1.6.20 + 1.6.21-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.20 + HEAD From e5584ea0656f29aea65e54d4bf5c76e5bb896dc0 Mon Sep 17 00:00:00 2001 From: Blacksmith Date: Sat, 2 Feb 2019 02:05:37 +0000 Subject: [PATCH 770/901] Clear out release files in preparation for next release --- forge-gui/README.txt | 93 +---------------------------- forge-gui/release-files/CHANGES.txt | 13 ---- 2 files changed, 1 insertion(+), 105 deletions(-) diff --git a/forge-gui/README.txt b/forge-gui/README.txt index fdd08d9e5c8..11b369846f2 100644 --- a/forge-gui/README.txt +++ b/forge-gui/README.txt @@ -1,92 +1 @@ -Forge: 02/02/2019 ver 1.6.20 - -18457 cards in total. - - --------------- -Release Notes: --------------- - -- New Cards - -Vizkopa Vampire; Vengeant Vampire; Vindictive Vampire; Verity Circle; Zegana, Utopian Speaker; Zhur-Taa Goblin; Kaya, Orzhov Usurper; Knight of the Last Breath; Knight of Sorrows; Kaya's Wrath; Thought Collapse; Tenth District Veteran; Territorial Boar; Teysa Karlov; Theater of Horrors; Trollbred Guardian; Tithe Taker; Thirsting Shade; Tome of the Guildpact; Thrash; Twilight Panther; Tin Street Dodger; The Haunt of Hightower; Titanic Brawl; Cindervines; Combine Guildmage; Carrion Imp; Consecrate; Collision; Code of Constraint; Clear the Stage; Captive Audience; Clamor Shaman; Consign to the Pit; Cavalcade of Calamity; Clear the Mind; Civic Stalwart; Carnival; Catacomb Crocodile; Charging War Boar; Cry of the Carnarium; Coral Commando; Clan Guildmage; Cult Guildmage; Chillbringer; Growth Spiral; Galloping Lizrog; Gruul Locket; Get the Point; Gruul Spellbreaker; Gravel-Hide Goblin; Growth-Chamber Guardian; Gyre Engineer; Glass of the Guildpact; Guardian Project; Grotesque Demise; Gateway Sneak; Ghor-Clan Wrecker; Gates Ablaze; Gutterbones; Goblin Goliath; Grasping Thrull; Goblin Gathering; Gatebreaker Ram; Gruul Beastmaster; Gate Colossus; Windstorm Drake; Wrecking Beast; Watchful Giant; Warrant; Wilderness Reclamation; Wall of Lost Thoughts; Impassioned Orator; Incubation Druid; Inspired Sphinx; Immortal Phoenix; Immolation Shaman; Incubation; Imperious Oligarch; Ill-Gotten Inheritance; Dovin's Automaton; Dovin's Dismissal; Debtors' Transport; Deface; Dovin's Acuity; Drill Bit; Dagger Caster; Dovin, Grand Arbiter; Deputy of Detention; Domri, City Smasher; Dead Revels; Domri's Nodorog; Domri, Chaos Bringer; Dovin, Architect of Law; Depose; Justiciar's Portal; Judith, the Scourge Diva; Angelic Exaltation; Applied Biomancy; Axebane Beast; Aeromunculus; Awaken the Erstwhile; Avatar of Growth; Angler Turtle; Angel of Grace; Azorius Locket; Azorius Skyguard; Arrester's Admonition; Arrester's Zeal; Azorius Knight-Arbiter; Amplifire; Angelic Guardian; Archway Angel; Prying Eyes; Prime Speaker Vannifar; Pteramander; Plaza of Harmony; Pestilent Spirit; Prowling Caracal; Persistent Petitioners; Pitiless Pontiff; Priest of Forgotten Gods; Plague Wight; Precognitive Perception; Rumbling Ruin; Ragefire; Rot Hulk; Rakdos Locket; Repudiate; Ravager Wurm; Rix Maadi Reveler; Rally to Battle; Rakdos Firewheeler; Rakdos Roustabout; Rhythm of the Wild; Rubblebelt Recluse; Rafter Demon; Rubble Reading; Rampage of the Clans; Rampaging Rendhorn; Resolute Watchdog; Rampaging Brontodon; Rubblebelt Runner; Rubble Slinger; Rakdos Trumpeter; Rakdos, the Showstopper; Regenesis; Revival; Lavinia, Azorius Renegade; Lumbering Battlement; Light Up the Stage; Lawmage's Binding; Hero of Precinct One; Haazda Officer; Hydroid Krasis; Humongulus; High Alert; Hackrobat; Noxious Groodion; Nikya of the Old Ways; Seraph of the Scales; Sharktocrab; Swirling Torrent; Summary Judgment; Skitter Eel; Stony Strength; Sphinx of Foresight; Spawn of Mayhem; Sphinx of the Guildpact; Spire Mangler; Skatewing Spy; Sphinx's Insight; Senate Griffin; Spirit of the Spires; Silhana Wayfinder; Spear Spewer; Smelt-Ward Ignus; Senate Guildmage; Skewer the Critics; Syndicate Guildmage; Slimebind; Savage Smash; Sky Tether; Spikewheel Acrobat; Sentinel's Mark; Sagittars' Volley; Saruli Caretaker; Shimmer of Possibility; Scuttlegator; Senate Courier; Sage's Row Savant; Sunder Shaman; Screaming Shield; Skarrgan Hellkite; Scorchmark; Storm Strike; Smothering Tithe; Steeple Creeper; Syndicate Messenger; Sylvan Brushstrider; Simic Locket; Sphinx of New Prahv; Simic Ascendancy; Sauroform Hybrid; Bloodmist Infiltrator; Basilica Bell-Haunt; Burning-Tree Vandal; Biogenic Upgrade; Bankrupt in Blood; Bolrac-Clan Crusher; Benthic Biomancer; Biomancer's Familiar; Bring to Trial; Bedevil; Bedeck; Blade Juggler; Burn Bright; Bladebrand; Biogenic Ooze; Emergency Powers; Electrodominance; Eyes Everywhere; Essence Capture; Elite Arrester; Ethereal Absolution; End-Raze Forerunners; Expose to Daylight; Enraged Ceratok; Undercity Scavenger; Undercity's Embrace; Unbreakable Formation; Orzhov Locket; Open the Gates; Orzhov Racketeers; Orzhov Enforcer; Frenzied Arynx; Faerie Duelist; Footlight Fiend; Fireblade Artist; Frilled Mystic; Flames of the Raze-Boar; Final Payment; Feral Maaka; Font of Agonies; Forbidding Spirit; Ministrant of Obligation; Mirror March; Mesmerizing Benthid; Macabre Mockery; Militant Angel; Mass Manipulation; Quench - -- Desktop GUI - -The Desktop GUI can pop up zones (Library, Graveyard, etc.) allow players to select cards from them when the option UI_SELECT_FROM_CARD_DISPLAYS is set. -The Desktop GUI outlines the selectable cards in many situations. This is not done when playing mana costs. - -- Digging - -Multi-card digging (e.g., for Genesis Wave) is done as a single multiple-card selection instead of a sequence of single-card selections. - -- Game Night - -Support was added for the Game Night box set, including all 10 exclusive cards. - -- AI improvements - -More AI improvements were implemented, hopefully making the game a little more interesting and challenging to play. - -- 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 haven't been able to distribute the OS X Application version of Forge in sometime. We've recently automated our release tools, and will continue to look in the viability of creating this file now that things are autoamted. - - -- 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 -Austinio7116 -Churrufli -DrDev -excessum -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 - -(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 f0a7911cb31..05f0bf1829e 100644 --- a/forge-gui/release-files/CHANGES.txt +++ b/forge-gui/release-files/CHANGES.txt @@ -1,15 +1,2 @@ -- Desktop GUI - -The Desktop GUI can pop up zones (Library, Graveyard, etc.) allow players to select cards from them when the option UI_SELECT_FROM_CARD_DISPLAYS is set. -The Desktop GUI outlines the selectable cards in many situations. This is not done when playing mana costs. - -- Digging - -Multi-card digging (e.g., for Genesis Wave) is done as a single multiple-card selection instead of a sequence of single-card selections. - -- Game Night - -Support was added for the Game Night box set, including all 10 exclusive cards. - -- AI improvements - -More AI improvements were implemented, hopefully making the game a little more interesting and challenging to play. - - 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 92ba90bc9eb84f52cdde512578b495b30d5a718c Mon Sep 17 00:00:00 2001 From: KrazyTheFox Date: Fri, 1 Feb 2019 23:22:39 -0500 Subject: [PATCH 771/901] Add Sting deck by timmermac --- forge-gui/res/quest/duels/Sting 1.dck | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 forge-gui/res/quest/duels/Sting 1.dck diff --git a/forge-gui/res/quest/duels/Sting 1.dck b/forge-gui/res/quest/duels/Sting 1.dck new file mode 100644 index 00000000000..5925389bc7a --- /dev/null +++ b/forge-gui/res/quest/duels/Sting 1.dck @@ -0,0 +1,21 @@ +[duel] +[metadata] +Name=Sting 1 +Title=Sting +Difficulty=easy +Description=UR Taps-to-deal-damage +Icon=Sting.jpg +Deck Type=constructed +[main] +4 Prodigal Sorcerer +4 Prodigal Pyromancer +4 Suq'Ata Firewalker +4 Zuran Spellcaster +4 Jeska, Warrior Adept +4 Kamahl, Pit Fighter +4 Giant Strength +4 Counterspell +4 Rod of Ruin +12 Mountain +12 Island +[sideboard] From e38bd511933df71bce63c017d6979a080bc71bbf Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 2 Feb 2019 08:49:31 +0300 Subject: [PATCH 772/901] - Preparing Forge for Android publish 1.6.20.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 0b7b879a354..ac329cc9c3d 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -6,7 +6,7 @@ jar -Xms1024m -Xmx1536m - 1.6.19.004 + 1.6.20.001 keystore alias storepass diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index d47b60c33b6..35f6aebdae4 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -6,7 +6,7 @@ jar -Xms128m -Xmx2048m - 1.6.19.004 + 1.6.20.001 diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index f854dbffcd5..b9b05b06b89 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.19.004"; + public static final String CURRENT_VERSION = "1.6.20.001"; private static final ApplicationListener app = new Forge(); private static Clipboard clipboard; From 1d41f1b330d3eed4851ff8385cdd2185f6eff9c5 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 2 Feb 2019 13:51:18 +0300 Subject: [PATCH 773/901] - Fix Sarkhan, Dragonsoul. --- forge-gui/res/cardsfolder/s/sarkhan_dragonsoul.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/s/sarkhan_dragonsoul.txt b/forge-gui/res/cardsfolder/s/sarkhan_dragonsoul.txt index 335023bcc99..6bbda61ae31 100644 --- a/forge-gui/res/cardsfolder/s/sarkhan_dragonsoul.txt +++ b/forge-gui/res/cardsfolder/s/sarkhan_dragonsoul.txt @@ -3,7 +3,8 @@ ManaCost:4 R R Types:Legendary Planeswalker Sarkhan A:AB$ DamageAll | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | ValidPlayers$ Player.Opponent | ValidCards$ Creature.OppCtrl | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to each opponent and each creature your opponents control. A:AB$ DealDamage | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | AILogic$ ChoiceBurn | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target player or planeswalker. -A:AB$ ChangeZone | Cost$ SubCounter<9/LOYALTY> | Origin$ Library | Destination$ Battlefield | ChangeType$ Creature.Dragon | ChangeNum$ XFetch | Planeswalker$ True | Ultimate$ True | StackDescription$ SpellDescription | References$ XFetch | SpellDescription$ Search your library for any number of Dragon creature cards, put them onto the battlefield, then shuffle your library. +A:AB$ ChangeZone | Cost$ SubCounter<9/LOYALTY> | Origin$ Library | Destination$ Battlefield | ChangeType$ Dragon | ChangeNum$ XFetch | Planeswalker$ True | Ultimate$ True | StackDescription$ SpellDescription | References$ XFetch | SpellDescription$ Search your library for any number of Dragon creature cards, put them onto the battlefield, then shuffle your library. +SVar:XFetch:Count$InYourLibrary.Dragon DeckHints:Type$Dragon Oracle:[+2]: Sarkhan, Dragonsoul deals 1 damage to each opponent and each creature your opponents control.\n[−3]: Sarkhan, Dragonsoul deals 4 damage to target player or planeswalker.\n[−9]: Search your library for any number of Dragon creature cards, put them onto the battlefield, then shuffle your library. Loyalty:5 \ No newline at end of file From 6235b42c3118d7c9a504ab3e82b529d63142b60c Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 2 Feb 2019 13:54:23 +0300 Subject: [PATCH 774/901] - Limit the search to Dragon creature cards. --- forge-gui/res/cardsfolder/s/sarkhan_dragonsoul.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/s/sarkhan_dragonsoul.txt b/forge-gui/res/cardsfolder/s/sarkhan_dragonsoul.txt index 6bbda61ae31..bd099ea17ff 100644 --- a/forge-gui/res/cardsfolder/s/sarkhan_dragonsoul.txt +++ b/forge-gui/res/cardsfolder/s/sarkhan_dragonsoul.txt @@ -3,8 +3,8 @@ ManaCost:4 R R Types:Legendary Planeswalker Sarkhan A:AB$ DamageAll | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | ValidPlayers$ Player.Opponent | ValidCards$ Creature.OppCtrl | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to each opponent and each creature your opponents control. A:AB$ DealDamage | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | AILogic$ ChoiceBurn | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target player or planeswalker. -A:AB$ ChangeZone | Cost$ SubCounter<9/LOYALTY> | Origin$ Library | Destination$ Battlefield | ChangeType$ Dragon | ChangeNum$ XFetch | Planeswalker$ True | Ultimate$ True | StackDescription$ SpellDescription | References$ XFetch | SpellDescription$ Search your library for any number of Dragon creature cards, put them onto the battlefield, then shuffle your library. -SVar:XFetch:Count$InYourLibrary.Dragon +A:AB$ ChangeZone | Cost$ SubCounter<9/LOYALTY> | Origin$ Library | Destination$ Battlefield | ChangeType$ Creature.Dragon | ChangeNum$ XFetch | Planeswalker$ True | Ultimate$ True | StackDescription$ SpellDescription | References$ XFetch | SpellDescription$ Search your library for any number of Dragon creature cards, put them onto the battlefield, then shuffle your library. +SVar:XFetch:Count$InYourLibrary.Creature.Dragon DeckHints:Type$Dragon Oracle:[+2]: Sarkhan, Dragonsoul deals 1 damage to each opponent and each creature your opponents control.\n[−3]: Sarkhan, Dragonsoul deals 4 damage to target player or planeswalker.\n[−9]: Search your library for any number of Dragon creature cards, put them onto the battlefield, then shuffle your library. Loyalty:5 \ No newline at end of file From a8abbadec45c65e190596b4ce4d3efc0dc37c224 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sat, 2 Feb 2019 13:58:13 +0300 Subject: [PATCH 775/901] - Fix Kaya, Orzhov Usurper ability costs. --- forge-gui/res/cardsfolder/k/kaya_orzhov_usurper.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/k/kaya_orzhov_usurper.txt b/forge-gui/res/cardsfolder/k/kaya_orzhov_usurper.txt index 09ef6b8cd66..bd80a5c77a1 100644 --- a/forge-gui/res/cardsfolder/k/kaya_orzhov_usurper.txt +++ b/forge-gui/res/cardsfolder/k/kaya_orzhov_usurper.txt @@ -6,8 +6,8 @@ A:AB$ ChangeZone | Cost$ AddCounter<1/LOYALTY> | Origin$ Graveyard | Destination SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$ValidExile -A:AB$ ChangeZone | Cost$ -1/-1/Card.nonLand/nonland permanent with converted mana cost 1 or less> | Planeswalker$ True | Origin$ Battlefield | Destination$ Exile | TgtPrompt$ Choose target nonland permanent with converted mana cost 1 or less | ValidTgts$ Permanent.nonLand+cmcLE1 | SpellDescription$ Exile target nonland permanent with converted mana cost 1 or less. -A:AB$ DealDamage | Cost$ PayLife<5/-5/Card> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Player | NumDmg$ X | References$ X | SubAbility$ DBYouGainLife | SpellDescription$ CARDNAME deals damage to target player equal to the number of cards that player owns in exile and you gain that much life. +A:AB$ ChangeZone | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | Origin$ Battlefield | Destination$ Exile | TgtPrompt$ Choose target nonland permanent with converted mana cost 1 or less | ValidTgts$ Permanent.nonLand+cmcLE1 | SpellDescription$ Exile target nonland permanent with converted mana cost 1 or less. +A:AB$ DealDamage | Cost$ SubCounter<5/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Player | NumDmg$ X | References$ X | SubAbility$ DBYouGainLife | SpellDescription$ CARDNAME deals damage to target player equal to the number of cards that player owns in exile and you gain that much life. SVar:DBYouGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X SVar:X:TargetedPlayer$CardsInExile DeckHas:Ability$LifeGain From 0569a0b36dbef028b3b3181bd536c053b8c3efc5 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 2 Feb 2019 14:07:48 +0100 Subject: [PATCH 776/901] CombatUtil: fix Basic Landwalk abilities --- .../java/forge/game/combat/CombatUtil.java | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/forge-game/src/main/java/forge/game/combat/CombatUtil.java b/forge-game/src/main/java/forge/game/combat/CombatUtil.java index f29ec286894..1b88c16440f 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatUtil.java +++ b/forge-game/src/main/java/forge/game/combat/CombatUtil.java @@ -43,7 +43,6 @@ import forge.util.TextUtil; import forge.util.collect.FCollection; import forge.util.collect.FCollectionView; import forge.util.maps.MapToAmount; -import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import java.util.List; @@ -525,7 +524,7 @@ public class CombatUtil { IGNORE_LANDWALK_KEYWORDS[i] = "May be blocked as though it doesn't have " + landwalk + "."; } } - + public static boolean isUnblockableFromLandwalk(final Card attacker, final Player defendingPlayer) { //May be blocked as though it doesn't have landwalk. (Staff of the Ages) if (attacker.hasKeyword("May be blocked as though it doesn't have landwalk.")) { @@ -534,6 +533,7 @@ public class CombatUtil { List walkTypes = Lists.newArrayList(); + // handle basic landwalk and snow basic landwalk for (int i = 0; i < LANDWALK_KEYWORDS.length; i++) { final String basic = MagicColor.Constant.BASIC_LANDS.get(i); final String landwalk = LANDWALK_KEYWORDS[i]; @@ -553,19 +553,24 @@ public class CombatUtil { String keyword = inst.getOriginal(); if (keyword.equals("Legendary landwalk")) { walkTypes.add("Land.Legendary"); - } else if (keyword.equals("Desertwalk")) { - walkTypes.add("Desert"); } else if (keyword.equals("Nonbasic landwalk")) { walkTypes.add("Land.nonBasic"); } else if (keyword.equals("Snow landwalk")) { walkTypes.add("Land.Snow"); } else if (keyword.endsWith("walk")) { - final String landtype = TextUtil.fastReplace(keyword, "walk", ""); + String landtype = TextUtil.fastReplace(keyword, "walk", ""); + String valid = landtype; + + // substract Snow type if (landtype.startsWith("Snow ")) { - walkTypes.add(landtype.substring(5) + ".Snow"); - } else if (CardType.isALandType(landtype)) { + landtype = landtype.substring(5); + valid = landtype + ".Snow"; + } + + // basic land types are handled before + if (CardType.isALandType(landtype) && !CardType.isABasicLandType(landtype)) { if (!walkTypes.contains(landtype)) { - walkTypes.add(landtype); + walkTypes.add(valid); } } } @@ -575,10 +580,10 @@ public class CombatUtil { return false; } - final String valid = StringUtils.join(walkTypes, ","); + final String[] valid = walkTypes.toArray(new String[0]); final CardCollectionView defendingLands = defendingPlayer.getCardsIn(ZoneType.Battlefield); for (final Card c : defendingLands) { - if (c.isValid(valid.split(","), defendingPlayer, attacker, null)) { + if (c.isValid(valid, defendingPlayer, attacker, null)) { return true; } } From a18d98c2316a18e718f0b5c479b9dd33ece11350 Mon Sep 17 00:00:00 2001 From: Rob Schnautz Date: Sat, 2 Feb 2019 16:39:51 +0000 Subject: [PATCH 777/901] Token script had typo in name. --- forge-gui/res/cardsfolder/g/giantbaiting.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/g/giantbaiting.txt b/forge-gui/res/cardsfolder/g/giantbaiting.txt index 9eda81b80d4..90bbe8475fb 100644 --- a/forge-gui/res/cardsfolder/g/giantbaiting.txt +++ b/forge-gui/res/cardsfolder/g/giantbaiting.txt @@ -1,7 +1,7 @@ Name:Giantbaiting ManaCost:2 RG Types:Sorcery -A:SP$ Token | Cost$ 2 RG | TokenScript$ rb_4_4_giant_warrior_haste | AtEOT$ Exile | SpellDescription$ Create a 4/4 red and green Giant Warrior creature token with haste. Exile it at the beginning of the next end step. +A:SP$ Token | Cost$ 2 RG | TokenScript$ rg_4_4_giant_warrior_haste | AtEOT$ Exile | SpellDescription$ Create a 4/4 red and green Giant Warrior creature token with haste. Exile it at the beginning of the next end step. K:Conspire DeckHas:Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/giantbaiting.jpg From 567aab0c438102bc24cae389ae30abebe437a3d0 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Sat, 2 Feb 2019 21:04:01 +0000 Subject: [PATCH 778/901] Fix: c_a_treasure_sac --- forge-gui/res/tokenscripts/c_a_treasure_sac.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/tokenscripts/c_a_treasure_sac.txt b/forge-gui/res/tokenscripts/c_a_treasure_sac.txt index 6ba1beb174b..e2d0030ed85 100644 --- a/forge-gui/res/tokenscripts/c_a_treasure_sac.txt +++ b/forge-gui/res/tokenscripts/c_a_treasure_sac.txt @@ -1,5 +1,5 @@ Name:Treasure ManaCost:no cost Types:Artifact Treasure -A:AB$ Mana | Cost$ T Sac<1/CARDNAME|this artifact> | Produced$ Any | Amount$ 1 | SpellDescription$ Add one mana of any color. +A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ Any | Amount$ 1 | SpellDescription$ Add one mana of any color. Oracle:{T}, Sacrifice this artifact: Add one mana of any color. \ No newline at end of file From 31bca6c6146a0124811d7080a125800fc6ad9c72 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Sat, 2 Feb 2019 16:46:23 -0500 Subject: [PATCH 779/901] try to do fewer layout calculations when moving cards --- .../forge/view/arcane/CardPanelContainer.java | 24 +++++++++++++------ .../main/java/forge/view/arcane/PlayArea.java | 22 +++++++++-------- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanelContainer.java b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanelContainer.java index b9f08c4cebf..ff358394ee0 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanelContainer.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanelContainer.java @@ -291,6 +291,9 @@ public abstract class CardPanelContainer extends SkinnedPanel { } public final void removeCardPanel(final CardPanel fromPanel) { + removeCardPanel(fromPanel,true); + } + public final void removeCardPanel(final CardPanel fromPanel, final boolean repaint) { FThreads.assertExecutedByEdt(true); if (getMouseDragPanel() != null) { CardPanel.getDragAnimationPanel().setVisible(false); @@ -303,9 +306,11 @@ public abstract class CardPanelContainer extends SkinnedPanel { fromPanel.dispose(); getCardPanels().remove(fromPanel); remove(fromPanel); - invalidate(); - repaint(); - doingLayout(); + if ( repaint ) { + invalidate(); + repaint(); + doingLayout(); + } } public final void setCardPanels(final List cardPanels) { @@ -332,16 +337,21 @@ public abstract class CardPanelContainer extends SkinnedPanel { } public final void clear() { + clear(true); + } + public final void clear(final boolean repaint) { FThreads.assertExecutedByEdt(true); for (final CardPanel p : getCardPanels()) { p.dispose(); } getCardPanels().clear(); removeAll(); - setPreferredSize(new Dimension(0, 0)); - invalidate(); - getParent().validate(); - repaint(); + if ( repaint ) { + setPreferredSize(new Dimension(0, 0)); + invalidate(); + getParent().validate(); + repaint(); + } } public final FScrollPane getScrollPane() { diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/PlayArea.java b/forge-gui-desktop/src/main/java/forge/view/arcane/PlayArea.java index 0cecda66dd1..dae89a13d9f 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/PlayArea.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/PlayArea.java @@ -620,11 +620,11 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen toDelete.removeAll(notToDelete); if (toDelete.size() == getCardPanels().size()) { - clear(); + clear(false); } else { for (final CardView card : toDelete) { - removeCardPanel(getCardPanel(card.getId())); + removeCardPanel(getCardPanel(card.getId()),false); } } @@ -646,19 +646,21 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen needLayoutRefresh = true; } } - if (needLayoutRefresh) { - doLayout(); - } + if (needLayoutRefresh) { + doLayout(); + } + invalidate(); //pfps do the extra invalidate before any scrolling if (!newPanels.isEmpty()) { + int i = newPanels.size(); for (final CardPanel toPanel : newPanels) { - scrollRectToVisible(new Rectangle(toPanel.getCardX(), toPanel.getCardY(), toPanel.getCardWidth(), toPanel.getCardHeight())); + if ( --i == 0 ) { // only scroll to last panel to be added + scrollRectToVisible(new Rectangle(toPanel.getCardX(), toPanel.getCardY(), toPanel.getCardWidth(), toPanel.getCardHeight())); + } Animation.moveCard(toPanel); } - } - - invalidate(); - repaint(); + } + repaint(); } public boolean updateCard(final CardView card, boolean fromRefresh) { From f241a62d95ab19ad41e73a6b12b06fbe7d231d75 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 3 Feb 2019 00:15:59 +0000 Subject: [PATCH 780/901] Update clear_the_stage.txt --- forge-gui/res/cardsfolder/c/clear_the_stage.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/c/clear_the_stage.txt b/forge-gui/res/cardsfolder/c/clear_the_stage.txt index 16318c346a5..f82ce536653 100644 --- a/forge-gui/res/cardsfolder/c/clear_the_stage.txt +++ b/forge-gui/res/cardsfolder/c/clear_the_stage.txt @@ -2,5 +2,5 @@ Name:Clear the Stage ManaCost:4 B Types:Instant A:SP$ Pump | Cost$ 4 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -3 | NumDef$ -3 | IsCurse$ True | SubAbility$ DBChangeZone | SpellDescription$ Target creature gets -3/-3 until end of turn. If you control a creature with power 4 or greater, you may return up to one target creature card from your graveyard to your hand. -SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | TargetMin$ 0 | TargetMax$ 1 | TargetsWithDefinedController$ ParentTarget | ConditionPresent$ Creature.YouCtrl+powerGE4 +SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | TargetMin$ 0 | TargetMax$ 1 | TargetsWithDefinedController$ ParentTarget | ConditionPresent$ Creature.YouCtrl+powerGE4 Oracle:Target creature gets -3/-3 until end of turn. If you control a creature with power 4 or greater, you may return up to one target creature card from your graveyard to your hand. From c54682850b6ccb217debee8ee74443f8e6e3dbb3 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 3 Feb 2019 00:33:59 +0000 Subject: [PATCH 781/901] Update theater_of_horrors.txt --- .../res/cardsfolder/t/theater_of_horrors.txt | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/forge-gui/res/cardsfolder/t/theater_of_horrors.txt b/forge-gui/res/cardsfolder/t/theater_of_horrors.txt index 363d69c0f44..dad6ad692eb 100644 --- a/forge-gui/res/cardsfolder/t/theater_of_horrors.txt +++ b/forge-gui/res/cardsfolder/t/theater_of_horrors.txt @@ -1,10 +1,13 @@ Name:Theater of Horrors ManaCost:1 B R Types:Enchantment -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigKyrenExile | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, exile the top card of your library. -SVar:TrigMill:DB$ Mill | Defined$ You | Destination$ Exile | NumCards$ 1 -S:Mode$ Continuous | Affected$ Card.IsRemembered | MayPlay$ True | Condition$ PlayerTurn | EffectZone$ Battlefield | CheckSVar$ Play | Description$ During your turn, if an opponent lost life this turn, you may play cards exiled with CARDNAME. -SVar:TrigCleanup:Mode$ SpellCast | ValidCard$ Card.IsRemembered | Execute$ DBDuration | Static$ True -SVar:DBDuration -A:AB$ DealDamage | Cost$ 1 B R | ValidTgts$ Opponent,Planeswalker | TgtPrompt$ Select target opponent or planeswalker | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target opponent or planeswalker. -Oracle:At the beginning of your upkeep, exile the top card of your library.\nDuring your turn, if an opponent lost life this turn, you may play cards exiled with Theater of Horrors.\n{3}{R}: Theater of Horrors deals 1 damage to target opponent or planeswalker. +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigMill | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, exile the top card of your library. +SVar:TrigMill:DB$ Mill | Defined$ You | Destination$ Exile | NumCards$ 1 | RememberMilled$ True +S:Mode$ Continuous | Affected$ Card.IsRemembered | AffectedZone$ Exile | MayPlay$ True | Condition$ PlayerTurn | CheckSVar$ X | References$ X | Description$ During your turn, if an opponent lost life this turn, you may play cards exiled with CARDNAME. +SVar:X:Count$LifeOppsLostThisTurn +T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBForget +SVar:DBForget:DB$ Pump | Defined$ TriggeredCard | ForgetObjects$ TriggeredCard +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +A:AB$ DealDamage | Cost$ 3 R | ValidTgts$ Opponent,Planeswalker | TgtPrompt$ Select target opponent or planeswalker | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target opponent or planeswalker. +Oracle:At the beginning of your upkeep, exile the top card of your library.\nDuring your turn, if an opponent lost life this turn, you may play cards exiled with Theater of Horrors.\n{3}{R}: Theater of Horrors deals 1 damage to target opponent or planeswalker. \ No newline at end of file From 18934c7f9f3c4f43ffcbd896512e2e5dde410f03 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 3 Feb 2019 02:25:36 +0000 Subject: [PATCH 782/901] Update revival_revenge.txt --- forge-gui/res/cardsfolder/r/revival_revenge.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/r/revival_revenge.txt b/forge-gui/res/cardsfolder/r/revival_revenge.txt index d098b682f87..ad1df6df839 100644 --- a/forge-gui/res/cardsfolder/r/revival_revenge.txt +++ b/forge-gui/res/cardsfolder/r/revival_revenge.txt @@ -2,7 +2,7 @@ Name:Revival ManaCost:WB WB AlternateMode: Split Types:Sorcery -A:SP$ ChangeZone | Cost$ WB WB | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature in your graveyard | ValidTgts$ Creature.YouCtrl+cmcLE3 | SpellDescription$ Return target creature card with converted mana cost 3 or less from your graveyard to the battlefield. +A:SP$ ChangeZone | Cost$ WB WB | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature in your graveyard | ValidTgts$ Creature.YouOwn+cmcLE3 | SpellDescription$ Return target creature card with converted mana cost 3 or less from your graveyard to the battlefield. Oracle:Return target creature card with converted mana cost 3 or less from your graveyard to the battlefield. ALTERNATE @@ -11,7 +11,7 @@ Name:Revenge ManaCost:4 W B Types:Sorcery A:SP$ GainLife | Cost$ 4 W B | LifeAmount$ X | References$ X | SubAbility$ DBLoseHalf | SpellDescription$ Double your life total. Target opponent loses half their life, rounded up. -SVar:DBLoseHalf:DB$ LoseLife | Cost$ 4 B B | ValidTgts$ Opponent | LifeAmount$ Y | References$ Y +SVar:DBLoseHalf:DB$ LoseLife | ValidTgts$ Opponent | LifeAmount$ Y | References$ Y SVar:X:Count$YourLifeTotal SVar:Y:Count$TargetedLifeTotal/HalfUp Oracle:Double your life total. Target opponent loses half their life, rounded up. From 10745eb9c7a00e93966fdb2cd5ec7657e0dae9f4 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 3 Feb 2019 02:34:59 +0000 Subject: [PATCH 783/901] Update consecrate_consume.txt --- forge-gui/res/cardsfolder/c/consecrate_consume.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/c/consecrate_consume.txt b/forge-gui/res/cardsfolder/c/consecrate_consume.txt index 4bcc6b4e0af..2c536e32a63 100644 --- a/forge-gui/res/cardsfolder/c/consecrate_consume.txt +++ b/forge-gui/res/cardsfolder/c/consecrate_consume.txt @@ -11,7 +11,7 @@ ALTERNATE Name:Consume ManaCost:2 W B Types:Sorcery -A:SP$ Pump | Cost$ 2 W B | ValidTgts$ Player | RememberTargets$ True | SubAbility$ DBChooseCard | SpellDescription$ Target player sacrifices a creature with the greatest power among creatures they control. You gain life equal to its power. +A:SP$ Pump | Cost$ 2 W B | ValidTgts$ Player | IsCurse$ True | RememberTargets$ True | SubAbility$ DBChooseCard | SpellDescription$ Target player sacrifices a creature with the greatest power among creatures they control. You gain life equal to its power. SVar:DBChooseCard:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Creature.greatestPowerControlledByRemembered | Mandatory$ True | SubAbility$ DBSac SVar:DBSac:DB$ Sacrifice | Defined$ Player.IsRemembered | SacValid$ Card.ChosenCard | RememberSacrificed$ True | SubAbility$ DBGainLife | SacMessage$ the creature with the highest power SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X | SubAbility$ DBCleanup From c769aa07dde95adaed52b18a44498320b1f70b28 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 3 Feb 2019 03:06:24 +0000 Subject: [PATCH 784/901] Update consecrate_consume.txt --- forge-gui/res/cardsfolder/c/consecrate_consume.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/res/cardsfolder/c/consecrate_consume.txt b/forge-gui/res/cardsfolder/c/consecrate_consume.txt index 2c536e32a63..cc70bf85665 100644 --- a/forge-gui/res/cardsfolder/c/consecrate_consume.txt +++ b/forge-gui/res/cardsfolder/c/consecrate_consume.txt @@ -17,4 +17,5 @@ SVar:DBSac:DB$ Sacrifice | Defined$ Player.IsRemembered | SacValid$ Card.ChosenC SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:RememberedLKI$CardPower +SVar:NeedsToPlay:Creature.OppCtrl Oracle:Target player sacrifices a creature with the greatest power among creatures they control. You gain life equal to its power. \ No newline at end of file From 98830dde139e963b86d5f4317cb06a674ce6a3a1 Mon Sep 17 00:00:00 2001 From: Chris H Date: Sat, 2 Feb 2019 23:23:17 -0500 Subject: [PATCH 785/901] Fix Jhoira Avatar crashing since it copies cards into no zone --- .../forge/player/PlayerControllerHuman.java | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 7777f319c58..5a99fc19b89 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -351,20 +351,27 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } private boolean useSelectCardsInput(final FCollectionView sourceList) { - if ( FThreads.isGuiThread() ) { return false; } // can't use InputSelect from GUI thread (e.g., DevMode Tutor) + // can't use InputSelect from GUI thread (e.g., DevMode Tutor) + if ( FThreads.isGuiThread() ) { return false; } + // if UI_SELECT_FROM_CARD_DISPLAYS not set use InputSelect only for battlefield and player hand // if UI_SELECT_FROM_CARD_DISPLAYS set and using desktop GUI use InputSelect for any zone that can be shown for (final GameEntity c : sourceList) { if (c instanceof Player) { continue; } - if (!(c instanceof Card)) { - return false; - } + + if (!(c instanceof Card)) { + return false; + } final Zone cz = ((Card) c).getZone(); - final boolean useUiPointAtCard = - cz != null && - (FModel.getPreferences().getPrefBoolean(FPref.UI_SELECT_FROM_CARD_DISPLAYS) && (!GuiBase.getInterface().isLibgdxPort()) ) ? + // Don't try to draw the UI point of a card if it doesn't exist in any zone. + if (cz == null) { + return false; + } + + final boolean useUiPointAtCard = + (FModel.getPreferences().getPrefBoolean(FPref.UI_SELECT_FROM_CARD_DISPLAYS) && (!GuiBase.getInterface().isLibgdxPort())) ? (cz.is(ZoneType.Battlefield) || cz.is(ZoneType.Hand) || cz.is(ZoneType.Library) || cz.is(ZoneType.Graveyard) || cz.is(ZoneType.Exile) || cz.is(ZoneType.Flashback) || cz.is(ZoneType.Command)) : (cz.is(ZoneType.Hand) && cz.getPlayer() == player || cz.is(ZoneType.Battlefield)); @@ -372,7 +379,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont return false; } } - return true; + return true; } @Override From 426c0ca4c8d1bc752aa6859c4ca4b496a6071e45 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 3 Feb 2019 08:20:13 +0300 Subject: [PATCH 786/901] - Formatting fix. --- .../main/java/forge/player/PlayerControllerHuman.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 5a99fc19b89..e46f93cd761 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -352,10 +352,10 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont private boolean useSelectCardsInput(final FCollectionView sourceList) { // can't use InputSelect from GUI thread (e.g., DevMode Tutor) - if ( FThreads.isGuiThread() ) { return false; } + if ( FThreads.isGuiThread() ) { return false; } - // if UI_SELECT_FROM_CARD_DISPLAYS not set use InputSelect only for battlefield and player hand - // if UI_SELECT_FROM_CARD_DISPLAYS set and using desktop GUI use InputSelect for any zone that can be shown + // if UI_SELECT_FROM_CARD_DISPLAYS not set use InputSelect only for battlefield and player hand + // if UI_SELECT_FROM_CARD_DISPLAYS set and using desktop GUI use InputSelect for any zone that can be shown for (final GameEntity c : sourceList) { if (c instanceof Player) { continue; @@ -372,14 +372,14 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont final boolean useUiPointAtCard = (FModel.getPreferences().getPrefBoolean(FPref.UI_SELECT_FROM_CARD_DISPLAYS) && (!GuiBase.getInterface().isLibgdxPort())) ? - (cz.is(ZoneType.Battlefield) || cz.is(ZoneType.Hand) || cz.is(ZoneType.Library) || + (cz.is(ZoneType.Battlefield) || cz.is(ZoneType.Hand) || cz.is(ZoneType.Library) || cz.is(ZoneType.Graveyard) || cz.is(ZoneType.Exile) || cz.is(ZoneType.Flashback) || cz.is(ZoneType.Command)) : (cz.is(ZoneType.Hand) && cz.getPlayer() == player || cz.is(ZoneType.Battlefield)); if (!useUiPointAtCard) { return false; } } - return true; + return true; } @Override From e72879d17313ad9ad4d805964e5c22a8da019c30 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 3 Feb 2019 05:34:42 +0000 Subject: [PATCH 787/901] Update skarrgan_hellkite.txt --- forge-gui/res/cardsfolder/s/skarrgan_hellkite.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/res/cardsfolder/s/skarrgan_hellkite.txt b/forge-gui/res/cardsfolder/s/skarrgan_hellkite.txt index 3c85fdd9c0c..c1c3c4736d9 100644 --- a/forge-gui/res/cardsfolder/s/skarrgan_hellkite.txt +++ b/forge-gui/res/cardsfolder/s/skarrgan_hellkite.txt @@ -3,6 +3,7 @@ ManaCost:3 R R Types:Creature Dragon PT:4/4 K:Riot +K:Flying A:AB$ DealDamage | Cost$ 3 R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target to distribute damage to | NumDmg$ 2 | TargetMin$ 1 | TargetMax$ 2 | DividedAsYouChoose$ 2 | IsPresent$ Card.Self+counters_GE1_P1P1 | SpellDescription$ CARDNAME deals 2 damage divided as you choose among one or two targets. Activate this ability only if CARDNAME has a +1/+1 counter on it. DeckHints:Ability$Counters Oracle:Riot (This creature enters the battlefield with your choice of a +1/+1 counter or haste.)\nFlying\n{3}{R}: Skarrgan Hellkite deals 2 damage divided as you choose among one or two targets. Activate this ability only if Skarrgan Hellkite has a +1/+1 counter on it. From cd1bfc6b0802ef70f850ac2aa7afec0e2e762f44 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 3 Feb 2019 05:46:09 +0000 Subject: [PATCH 788/901] Update awaken_the_erstwhile.txt --- forge-gui/res/cardsfolder/a/awaken_the_erstwhile.txt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/a/awaken_the_erstwhile.txt b/forge-gui/res/cardsfolder/a/awaken_the_erstwhile.txt index 924da38ece1..79b028eebc8 100644 --- a/forge-gui/res/cardsfolder/a/awaken_the_erstwhile.txt +++ b/forge-gui/res/cardsfolder/a/awaken_the_erstwhile.txt @@ -2,7 +2,10 @@ Name:Awaken the Erstwhile ManaCost:3 B B Types:Sorcery A:SP$ RepeatEach | Cost$ 3 B B | RepeatPlayers$ Player | RepeatSubAbility$ DBDiscard | SpellDescription$ Each player discards all the cards in their hand, then creates that many 2/2 black Zombie creature tokens. -SVar:DBToken:DB$ Token | TokenAmount$ X | TokenScript$ b_2_2_zombie | TokenOwner$ You | LegacyImage$ b 2 2 zombie rna | References$ X +SVar:DBDiscard:DB$ Discard | Defined$ Player.IsRemembered | Mode$ Hand | RememberDiscarded$ True | SubAbility$ DBToken +SVar:DBToken:DB$ Token | TokenAmount$ X | TokenScript$ b_2_2_zombie | TokenOwner$ Player.IsRemembered | LegacyImage$ b 2 2 zombie rna | References$ X | SubAbility$ DBCleanup SVar:X:Remembered$Amount -DeckHas:Ability$Token +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +DeckHas:Ability$Discard +DeckHints:Keyword$Madness & Ability$Delirium Oracle:Each player discards all the cards in their hand, then creates that many 2/2 black Zombie creature tokens. From 816d1363506547eddfa95a914edf63d70ed4d6a8 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 3 Feb 2019 05:47:52 +0000 Subject: [PATCH 789/901] Update awaken_the_erstwhile.txt --- forge-gui/res/cardsfolder/a/awaken_the_erstwhile.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/res/cardsfolder/a/awaken_the_erstwhile.txt b/forge-gui/res/cardsfolder/a/awaken_the_erstwhile.txt index 79b028eebc8..ecbb8798f0d 100644 --- a/forge-gui/res/cardsfolder/a/awaken_the_erstwhile.txt +++ b/forge-gui/res/cardsfolder/a/awaken_the_erstwhile.txt @@ -7,5 +7,6 @@ SVar:DBToken:DB$ Token | TokenAmount$ X | TokenScript$ b_2_2_zombie | TokenOwner SVar:X:Remembered$Amount SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True DeckHas:Ability$Discard +DeckHas:Ability$Token DeckHints:Keyword$Madness & Ability$Delirium Oracle:Each player discards all the cards in their hand, then creates that many 2/2 black Zombie creature tokens. From 1b44c953fcc3f755fb57ded45149a7d125bb8a8f Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sun, 3 Feb 2019 08:39:30 +0100 Subject: [PATCH 790/901] SpellAbility: fixed Surge for Crush of Tentacles --- .../main/java/forge/game/spellability/SpellAbility.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index b9599a50b9c..0b3cfa7717b 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -1115,7 +1115,13 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit } public final boolean isSurged() { - return surge; + if (surge) + return true; + SpellAbility parent = getParent(); + if (parent != null) { + return parent.isSurged(); + } + return false; } public final void setSurged(final boolean isSurge) { From 33c398fcb647a28e952a651b83c786e8f745035e Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Sun, 3 Feb 2019 08:51:32 -0500 Subject: [PATCH 791/901] add newline to separate functions --- .../src/main/java/forge/view/arcane/CardPanelContainer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanelContainer.java b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanelContainer.java index ff358394ee0..a50c0da434c 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanelContainer.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanelContainer.java @@ -293,6 +293,7 @@ public abstract class CardPanelContainer extends SkinnedPanel { public final void removeCardPanel(final CardPanel fromPanel) { removeCardPanel(fromPanel,true); } + public final void removeCardPanel(final CardPanel fromPanel, final boolean repaint) { FThreads.assertExecutedByEdt(true); if (getMouseDragPanel() != null) { From 903c708e1f6c8cf4f08364d8d1922d31e20416aa Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sun, 3 Feb 2019 16:37:49 +0100 Subject: [PATCH 792/901] MeldEffect: some fixes --- .../game/ability/effects/ChangeZoneEffect.java | 14 ++++++++++++++ .../forge/game/ability/effects/MeldEffect.java | 4 ++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index dbf654df439..ddbdfd3d11e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -606,6 +606,13 @@ public class ChangeZoneEffect extends SpellAbilityEffect { if (remember != null) { hostCard.addRemembered(movedCard); + // addRememberedFromCardState ? + if (tgtC.getMeldedWith() != null) { + Card meld = game.getCardState(tgtC.getMeldedWith(), null); + if (meld != null) { + hostCard.addRemembered(meld); + } + } } if (forget != null) { hostCard.removeRemembered(movedCard); @@ -1121,6 +1128,13 @@ public class ChangeZoneEffect extends SpellAbilityEffect { if (remember) { source.addRemembered(movedCard); + // addRememberedFromCardState ? + if (c.getMeldedWith() != null) { + Card meld = game.getCardState(c.getMeldedWith(), null); + if (meld != null) { + source.addRemembered(meld); + } + } } if (forget) { source.removeRemembered(movedCard); diff --git a/forge-game/src/main/java/forge/game/ability/effects/MeldEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MeldEffect.java index 82f34844181..45a0aa66841 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/MeldEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/MeldEffect.java @@ -54,9 +54,9 @@ public class MeldEffect extends SpellAbilityEffect { } primary.changeToState(CardStateName.Meld); + primary.setMeldedWith(secondary); PlayerZoneBattlefield bf = (PlayerZoneBattlefield)controller.getZone(ZoneType.Battlefield); - Card melded = game.getAction().changeZone(primary.getZone(), bf, primary, 0, sa); + game.getAction().changeZone(primary.getZone(), bf, primary, 0, sa); bf.addToMelded(secondary); - melded.setMeldedWith(secondary); } } From 1300194e3aa03527a5cee9ab13bcd795e9c0bbc7 Mon Sep 17 00:00:00 2001 From: Agetian Date: Sun, 3 Feb 2019 19:24:50 +0300 Subject: [PATCH 793/901] - Added puzzle PS_RNA1. - Enabled RNA for the Ravnica plane in Planar Conquest (no event updates yet). --- forge-gui/res/conquest/planes/Ravnica/sets.txt | 1 + forge-gui/res/conquest/planes/planes.txt | 2 +- forge-gui/res/puzzle/PS_RNA1.pzl | 16 ++++++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 forge-gui/res/puzzle/PS_RNA1.pzl diff --git a/forge-gui/res/conquest/planes/Ravnica/sets.txt b/forge-gui/res/conquest/planes/Ravnica/sets.txt index 25c06ea4114..5ba81297719 100644 --- a/forge-gui/res/conquest/planes/Ravnica/sets.txt +++ b/forge-gui/res/conquest/planes/Ravnica/sets.txt @@ -7,3 +7,4 @@ DGM C15 GRN GK1 +RNA diff --git a/forge-gui/res/conquest/planes/planes.txt b/forge-gui/res/conquest/planes/planes.txt index 94c4906faa4..14397ffced0 100644 --- a/forge-gui/res/conquest/planes/planes.txt +++ b/forge-gui/res/conquest/planes/planes.txt @@ -9,7 +9,7 @@ Name:Lorwyn-Shadowmoor|RegionSize:9|Desc:A sunny utopia with a thriving storyboo Name:Mercadia|RegionSize:6|Unreachable:True|Desc: Name:Mirrodin|RegionSize:9|Desc:A dark contagion is taking over this metal planet, breeding wave after wave of Phyrexian horrors.\nConsists of 63 events. Contains cards from MRD, DST, 5DN, SOM, MBS, NPH, and more. Name:Rath|RegionSize:6|Unreachable:True|Desc: -Name:Ravnica|RegionSize:9|Desc:A worldwide cityscape of grand halls, decrepit slums, and ancient ruins.\nConsists of 88 events. Contains cards from RAV, GPT, DIS, RTR, GTC, DGM, GRN, GK1, and C15. +Name:Ravnica|RegionSize:9|Desc:A worldwide cityscape of grand halls, decrepit slums, and ancient ruins.\nConsists of 88 events. Contains cards from RAV, GPT, DIS, RTR, GTC, DGM, GRN, GK1, RNA, and C15. Name:Regatha|RegionSize:6|Unreachable:True|Desc: Name:Shandalar|RegionSize:9|Unreachable:True|Desc: Name:Tarkir|RegionSize:9|Desc:A plane dominated by five powerful clans... or five powerful dragon lords.\nConsists of 45 events. Contains cards from KTK, FRF, DTK, CMD, CNS/CN2, some C17. diff --git a/forge-gui/res/puzzle/PS_RNA1.pzl b/forge-gui/res/puzzle/PS_RNA1.pzl new file mode 100644 index 00000000000..d46206ee0b1 --- /dev/null +++ b/forge-gui/res/puzzle/PS_RNA1.pzl @@ -0,0 +1,16 @@ +[metadata] +Name:Possibility Storm - Ravnica Allegiance #01 +URL:http://www.possibilitystorm.com/wp-content/uploads/2019/01/098.-RNA1.jpg +Goal:Win +Turns:1 +Difficulty:Mythic +Description:Win this turn. Your solution must satisfy all possible blocking scenarios. +[state] +humanlife=20 +ailife=9 +turn=1 +activeplayer=human +activephase=MAIN1 +humanhand=Ghalta, Primal Hunger;Electrodominance;Metamorphic Alteration;Slaughter the Strong;Lawmage's Binding +humanbattlefield=Atzocan Seer;Draconic Disciple;Arboretum Elemental;Incubation Druid;Sacred Foundry|NoETBTrigs;Sacred Foundry|NoETBTrigs;Breeding Pool|NoETBTrigs;Breeding Pool|NoETBTrigs;Breeding Pool|NoETBTrigs;Breeding Pool|NoETBTrigs +aibattlefield=Garna, the Bloodflame;Belligerent Brontodon;Lyra Dawnbringer;Demanding Dragon From faca59beb067697958de45cfbee7d84478c77635 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sun, 3 Feb 2019 18:18:06 +0100 Subject: [PATCH 794/901] CardFactoryUtil: Transfigure as Keyword --- .../src/main/java/forge/game/card/Card.java | 3 ++- .../java/forge/game/card/CardFactoryUtil.java | 18 +++++++++++++++++- forge-gui/res/cardsfolder/f/fleshwrither.txt | 2 +- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 8f1343eeb31..2641196f2f5 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -1649,7 +1649,8 @@ public class Card extends GameEntity implements Comparable { || keyword.equals("Undaunted") || keyword.startsWith("Monstrosity") || keyword.startsWith("Embalm") || keyword.startsWith("Level up") || keyword.equals("Prowess") || keyword.startsWith("Eternalize") || keyword.startsWith("Reinforce") || keyword.startsWith("Champion") || keyword.startsWith("Prowl") - || keyword.startsWith("Amplify") || keyword.startsWith("Ninjutsu") || keyword.startsWith("Adapt") + || keyword.startsWith("Amplify") || keyword.startsWith("Ninjutsu") || keyword.startsWith("Adapt") + || keyword.startsWith("Transfigure") || keyword.startsWith("Cycling") || keyword.startsWith("TypeCycling")) { // keyword parsing takes care of adding a proper description } else if (keyword.startsWith("CantBeBlockedByAmount")) { diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 874cf123dcf..d4eb6dd834a 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -4286,17 +4286,33 @@ public class CardFactoryUtil { suspend.setTemporary(!intrinsic); inst.addSpellAbility(suspend); + } else if (keyword.startsWith("Transfigure")) { + final String[] k = keyword.split(":"); + final String manacost = k[1]; + final String effect = "AB$ ChangeZone | Cost$ " + manacost + " Sac<1/CARDNAME>" + + " | PrecostDesc$ Transfigure | CostDesc$ " + ManaCostParser.parse(manacost) + + " | Origin$ Library | Destination$ Battlefield | ChangeType$ Creature.cmcEQTransfigureX" + + " | ChangeNum$ 1 | SorcerySpeed$ True | StackDescription$ SpellDescription | SpellDescription$ (" + + inst.getReminderText() + ")"; + + final SpellAbility sa = AbilityFactory.getAbility(effect, card); + sa.setSVar("TransfigureX", "Count$CardManaCost"); + sa.setIntrinsic(intrinsic); + + sa.setTemporary(!intrinsic); + inst.addSpellAbility(sa); } else if (keyword.startsWith("Transmute")) { final String[] k = keyword.split(":"); final String manacost = k[1]; final String effect = "AB$ ChangeZone | Cost$ " + manacost + " Discard<1/CARDNAME>" + " | PrecostDesc$ Transmute | CostDesc$ " + ManaCostParser.parse(manacost) + " | ActivationZone$ Hand" - + " | Origin$ Library | Destination$ Hand | ChangeType$ Card.cmcEQ" + card.getManaCost().getCMC() + + " | Origin$ Library | Destination$ Hand | ChangeType$ Card.cmcEQTransmuteX" + " | ChangeNum$ 1 | SorcerySpeed$ True | StackDescription$ SpellDescription | SpellDescription$ (" + inst.getReminderText() + ")"; final SpellAbility sa = AbilityFactory.getAbility(effect, card); + sa.setSVar("TransmuteX", "Count$CardManaCost"); sa.setIntrinsic(intrinsic); sa.setTemporary(!intrinsic); diff --git a/forge-gui/res/cardsfolder/f/fleshwrither.txt b/forge-gui/res/cardsfolder/f/fleshwrither.txt index c02b7bbb360..b293e953af3 100644 --- a/forge-gui/res/cardsfolder/f/fleshwrither.txt +++ b/forge-gui/res/cardsfolder/f/fleshwrither.txt @@ -2,6 +2,6 @@ Name:Fleshwrither ManaCost:2 B B Types:Creature Horror PT:3/3 -A:AB$ ChangeZone | Cost$ 1 B B Sac<1/CARDNAME> | CostDesc$ Transfigure {1}{B}{B} | Origin$ Library | Destination$ Battlefield | ChangeType$ Creature.cmcEQ4 | ChangeNum$ 1 | SorcerySpeed$ True | SpellDescription$ ({1}{B}{B} , Sacrifice this creature: Search your library for a creature card with the same converted mana cost as this creature and put that card onto the battlefield. Then shuffle your library. Transfigure only as a sorcery.) +K:Transfigure:1 B B SVar:Picture:http://www.wizards.com/global/images/magic/general/fleshwrither.jpg Oracle:Transfigure {1}{B}{B} ({1}{B}{B}, Sacrifice this creature: Search your library for a creature card with the same converted mana cost as this creature and put that card onto the battlefield. Then shuffle your library. Transfigure only as a sorcery.) From ba587ea7022e50908247a855199396f0cdeaf6d4 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Mon, 4 Feb 2019 06:14:39 +0000 Subject: [PATCH 795/901] Update kayas_wrath.txt --- forge-gui/res/cardsfolder/k/kayas_wrath.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/k/kayas_wrath.txt b/forge-gui/res/cardsfolder/k/kayas_wrath.txt index f843c6c1ac5..b369d84ce2c 100644 --- a/forge-gui/res/cardsfolder/k/kayas_wrath.txt +++ b/forge-gui/res/cardsfolder/k/kayas_wrath.txt @@ -3,6 +3,6 @@ ManaCost:W W B B Types:Sorcery A:SP$ DestroyAll | Cost$ W W B B | ValidCards$ Creature | RememberDestroyed$ True | SubAbility$ DBGainLife | SpellDescription$ Destroy all creatures. You gain life equal to the number of creatures you controlled that were destroyed this way. SVar:DBGainLife:DB$ GainLife | LifeAmount$ X | References$ X -SVar:X:RememberedLKI$FilterControlledByRemembered_Number$1 +SVar:X:RememberedLKI$FilterControlledByYou_Number$1 DeckHas:Ability$LifeGain Oracle:Destroy all creatures. You gain life equal to the number of creatures you controlled that were destroyed this way. From efe71e838478c9720892956526c4703cfa38fb69 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Mon, 4 Feb 2019 14:24:34 -0500 Subject: [PATCH 796/901] fix crash when hiding temporarily shown zones --- .../java/forge/screens/match/CMatchUI.java | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index 5df40f54120..f2d41735359 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -457,22 +457,24 @@ public final class CMatchUI @Override public void hideZones(final PlayerView controller, final Iterable zonesToUpdate) { - for (final PlayerZoneUpdate update : zonesToUpdate) { - final PlayerView player = update.getPlayer(); - for (final ZoneType zone : update.getZones()) { - switch (zone) { - case Battlefield: // always shown - break; - case Hand: // the controller's hand should never be temporarily shown, but ... - case Library: - case Graveyard: - case Exile: - case Flashback: - case Command: - FloatingZone.hide(this,player,zone); - break; - default: - break; + if ( zonesToUpdate != null ) { + for (final PlayerZoneUpdate update : zonesToUpdate) { + final PlayerView player = update.getPlayer(); + for (final ZoneType zone : update.getZones()) { + switch (zone) { + case Battlefield: // always shown + break; + case Hand: // the controller's hand should never be temporarily shown, but ... + case Library: + case Graveyard: + case Exile: + case Flashback: + case Command: + FloatingZone.hide(this,player,zone); + break; + default: + break; + } } } } From 81d3ab86f9c216852c8059e192a5a5f178f2e58a Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Mon, 4 Feb 2019 20:23:03 +0000 Subject: [PATCH 797/901] Update unbreakable_formation.txt --- forge-gui/res/cardsfolder/u/unbreakable_formation.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/u/unbreakable_formation.txt b/forge-gui/res/cardsfolder/u/unbreakable_formation.txt index 3b8d515b6ad..61bd095585d 100644 --- a/forge-gui/res/cardsfolder/u/unbreakable_formation.txt +++ b/forge-gui/res/cardsfolder/u/unbreakable_formation.txt @@ -1,7 +1,7 @@ Name:Unbreakable Formation ManaCost:2 W Types:Instant -A:SP$ PumpAll | Cost$ 2 W | ValidCards$ Creature.YouCtrl | KW$ Indestructible | SpellDescription$ Creatures you control gain indestructible until end of turn. -K:Defender -K:If you cast this spell during your main phase, put a +1/+1 counter on each of those creatures, and they also gain vigilance until end of turn. +A:SP$ PumpAll | Cost$ 2 W | ValidCards$ Creature.YouCtrl | KW$ Indestructible | SubAbility$ DBAddendum | SpellDescription$ Creatures you control gain indestructible until end of turn. +SVar:DBAddendum:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Vigilance | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SubAbility$ DBPutCounters | SpellDescription$ Addendum — If you cast this spell during your main phase, put a +1/+1 counter on each of those creatures, and they also gain vigilance until end of turn. +SVar:DBPutCounters:DB$ PutCounterAll | ValidCards$ Creature.YouCtrl | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | CounterType$ P1P1 | CounterNum$ 1 Oracle:Creatures you control gain indestructible until end of turn.\nAddendum — If you cast this spell during your main phase, put a +1/+1 counter on each of those creatures, and they also gain vigilance until end of turn. From 2c0ec8181287a5e92d5a435c2fb180befbe46750 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Tue, 5 Feb 2019 17:47:34 +0000 Subject: [PATCH 798/901] Update dovin_grand_arbiter.txt --- forge-gui/res/cardsfolder/d/dovin_grand_arbiter.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/d/dovin_grand_arbiter.txt b/forge-gui/res/cardsfolder/d/dovin_grand_arbiter.txt index 494a7f60892..ee10076ba4d 100644 --- a/forge-gui/res/cardsfolder/d/dovin_grand_arbiter.txt +++ b/forge-gui/res/cardsfolder/d/dovin_grand_arbiter.txt @@ -8,5 +8,5 @@ SVar:TrigPutCounter:DB$ PutCounter | Defined$ Remembered | CounterType$ LOYALTY A:AB$ Token | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 | TokenScript$ c_1_1_a_thopter_flying | TokenOwner$ You | LegacyImage$ c 1 1 a thopter flying rna | SubAbility$ DBGainLife | SpellDescription$ Create a 1/1 colorless Thopter artifact creature token with flying. SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 | SpellDescription$ You gain 1 life. DeckHas:Ability$Token -A:AB$ Dig | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | DigNum$ 10 | ChangeNum$ 3 | DestinationZone$ Hand | DestinationZone2$ Library | LibraryPosition$ -1 | RestRandomOrder$ True | SpellDescription$ Look at the top ten cards of your library. Put three of them into your hand and the rest on the bottom of your library in a random order. +A:AB$ Dig | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | DigNum$ 10 | ChangeNum$ 3 | DestinationZone$ Hand | DestinationZone2$ Library | LibraryPosition$ -1 | RestRandomOrder$ True | SpellDescription$ Look at the top ten cards of your library. Put three of them into your hand and the rest on the bottom of your library in a random order. Oracle:[+1]: Until end of turn, whenever a creature you control deals combat damage to a player, put a loyalty counter on Dovin, Grand Arbiter.\n[-1]: Create a 1/1 colorless Thopter artifact creature token with flying. You gain 1 life.\n[-7]: Look at the top ten cards of your library. Put three of them into your hand and the rest on the bottom of your library in a random order. From 30109aaeba508e5e49987d57152d1c3b0b65412d Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 5 Feb 2019 22:49:56 +0300 Subject: [PATCH 799/901] - Added puzzle PS_RNA2. --- forge-gui-mobile-dev/src/forge/app/Main.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-gui-mobile-dev/src/forge/app/Main.java b/forge-gui-mobile-dev/src/forge/app/Main.java index d5a932cefda..03ba4bcc8f2 100644 --- a/forge-gui-mobile-dev/src/forge/app/Main.java +++ b/forge-gui-mobile-dev/src/forge/app/Main.java @@ -41,12 +41,12 @@ public class Main { } // Set this to "true" to make the mobile game port run as a full-screen desktop application - boolean desktopMode = cmd.hasOption("fullscreen"); + boolean desktopMode = true;//cmd.hasOption("fullscreen"); // Set this to the location where you want the mobile game port to look for assets when working as a full-screen desktop application // (uncomment the bottom version and comment the top one to load the res folder from the current folder the .jar is in if you would // like to make the game load from a desktop game folder configuration). - String desktopModeAssetsDir = "../forge-gui/"; - //String desktopModeAssetsDir = "./"; + //String desktopModeAssetsDir = "../forge-gui/"; + String desktopModeAssetsDir = "./"; // Assets directory used when the game fully emulates smartphone/tablet mode (desktopMode = false), useful when debugging from IDE String assetsDir = AssetsDownloader.SHARE_DESKTOP_ASSETS ? "../forge-gui/" : "testAssets/"; From 3a8c07d9c15f09aae2f17293960251e8b7e6384c Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 5 Feb 2019 22:57:00 +0300 Subject: [PATCH 800/901] - Added puzzle PS_RNA2. --- forge-gui/res/puzzle/PS_RNA2.pzl | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 forge-gui/res/puzzle/PS_RNA2.pzl diff --git a/forge-gui/res/puzzle/PS_RNA2.pzl b/forge-gui/res/puzzle/PS_RNA2.pzl new file mode 100644 index 00000000000..0e9d0274bfb --- /dev/null +++ b/forge-gui/res/puzzle/PS_RNA2.pzl @@ -0,0 +1,16 @@ +[metadata] +Name:Possibility Storm - Ravnica Allegiance #02 +URL:http://www.possibilitystorm.com/wp-content/uploads/2019/01/099.-RNA2.jpg +Goal:Win +Turns:1 +Difficulty:Uncommon +Description:Win this turn. Your solution must satisfy all possible blocking scenarios. +[state] +humanlife=20 +ailife=20 +turn=1 +activeplayer=human +activephase=MAIN1 +humanhand=Wild Onslaught;Nikya of the Old Ways;Rally to Battle;Unbreakable Formation;Hadana's Climb +humanbattlefield=Shield Mare;Incubation Druid;Incubation Druid;Bolrac-Clan Crusher|Counters:P1P1=1;Tetsuko Umezawa, Fugitive;Stomping Ground|NoETBTrigs;Temple Garden|NoETBTrigs;Hallowed Fountain|NoETBTrigs +aibattlefield=Thief of Sanity;Fireblade Artist;Wee Dragonauts From 585f0299b2511e88dc3a81cdd22df5bee650e8d1 Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 5 Feb 2019 22:58:39 +0300 Subject: [PATCH 801/901] - Revert an accidental debug change commit. --- forge-gui-mobile-dev/src/forge/app/Main.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-gui-mobile-dev/src/forge/app/Main.java b/forge-gui-mobile-dev/src/forge/app/Main.java index 03ba4bcc8f2..d5a932cefda 100644 --- a/forge-gui-mobile-dev/src/forge/app/Main.java +++ b/forge-gui-mobile-dev/src/forge/app/Main.java @@ -41,12 +41,12 @@ public class Main { } // Set this to "true" to make the mobile game port run as a full-screen desktop application - boolean desktopMode = true;//cmd.hasOption("fullscreen"); + boolean desktopMode = cmd.hasOption("fullscreen"); // Set this to the location where you want the mobile game port to look for assets when working as a full-screen desktop application // (uncomment the bottom version and comment the top one to load the res folder from the current folder the .jar is in if you would // like to make the game load from a desktop game folder configuration). - //String desktopModeAssetsDir = "../forge-gui/"; - String desktopModeAssetsDir = "./"; + String desktopModeAssetsDir = "../forge-gui/"; + //String desktopModeAssetsDir = "./"; // Assets directory used when the game fully emulates smartphone/tablet mode (desktopMode = false), useful when debugging from IDE String assetsDir = AssetsDownloader.SHARE_DESKTOP_ASSETS ? "../forge-gui/" : "testAssets/"; From c3e895936edbc581c9c4b17b8fda2dd0315844d1 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Tue, 5 Feb 2019 22:11:47 +0000 Subject: [PATCH 802/901] WIP - Guardian Project - Works for Nth copy on the Battlefield - Does NOT work for any copies in the graveyard - Does not work for flickering the 1st copy on the battlefield (incorrectly draws), need a way to count all the cards on the BF except the triggered card --- forge-gui/res/cardsfolder/g/guardian_project.txt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/g/guardian_project.txt b/forge-gui/res/cardsfolder/g/guardian_project.txt index ea2c3d77329..3ba45a6e66d 100644 --- a/forge-gui/res/cardsfolder/g/guardian_project.txt +++ b/forge-gui/res/cardsfolder/g/guardian_project.txt @@ -1,6 +1,10 @@ Name:Guardian Project ManaCost:3 G Types:Enchantment -T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+YouCtrl | Origin$ Any | Destination$ Battlefield | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, if that creature does not have the same name as another creature you control or a creature card in your graveyard, draw a card. +T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+YouCtrl | Origin$ Any | Destination$ Battlefield | Execute$ TrigDraw | TriggerZones$ Battlefield | CheckSVar$ TotalShareNames | SVarCompare$ LE1 | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, if that creature doesn't have the same name as another creature you control or a creature card in your graveyard, draw a card. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 -Oracle:Whenever a nontoken creature enters the battlefield under your control, if that creature does not have the same name as another creature you control or a creature card in your graveyard, draw a card. +SVar:X:TriggeredCard$Valid Card.YouOwn+sharesNameWith YourGraveyard +#SVar:X:Count$ValidGraveyard Card.YouOwn+sharesNameWith TriggeredCard +SVar:Y:Count$Valid Card.YouCtrl+Other.sharesNameWith TriggerdCard +SVar:TotalShareNames:SVar$Y/Plus.X +Oracle:Whenever a nontoken creature enters the battlefield under your control, if that creature doesn't have the same name as another creature you control or a creature card in your graveyard, draw a card. From 544327330d17feb7f7bf5c9c95a41f2e3dc46f46 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Wed, 6 Feb 2019 05:08:17 +0000 Subject: [PATCH 803/901] Addendum fix --- .../src/main/java/forge/game/card/CardFactoryUtil.java | 6 +++--- forge-gui/res/cardsfolder/a/arresters_admonition.txt | 2 +- forge-gui/res/cardsfolder/a/arresters_zeal.txt | 2 +- forge-gui/res/cardsfolder/c/careful_consideration.txt | 2 +- forge-gui/res/cardsfolder/c/code_of_constraint.txt | 4 ++-- forge-gui/res/cardsfolder/d/dovins_acuity.txt | 3 +-- forge-gui/res/cardsfolder/e/emergency_powers.txt | 2 +- forge-gui/res/cardsfolder/h/haunting_hymn.txt | 2 +- forge-gui/res/cardsfolder/m/might_of_old_krosa.txt | 2 +- forge-gui/res/cardsfolder/p/precognitive_perception.txt | 2 +- forge-gui/res/cardsfolder/r/return_to_dust.txt | 2 +- forge-gui/res/cardsfolder/s/sentinels_mark.txt | 3 +-- forge-gui/res/cardsfolder/s/sphinxs_insight.txt | 2 +- forge-gui/res/cardsfolder/s/sulfurous_blast.txt | 2 +- forge-gui/res/cardsfolder/s/summary_judgment.txt | 2 +- forge-gui/res/cardsfolder/u/unbreakable_formation.txt | 5 +++-- 16 files changed, 21 insertions(+), 22 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index d4eb6dd834a..c764514a10e 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -1236,10 +1236,10 @@ public class CardFactoryUtil { return doXMath(c.getPseudoKickerMagnitude(), m, c); } - // Count$IfMainPhase.. // 7/10 - if (sq[0].contains("IfMainPhase")) { + // Count$IfCastInOwnMainPhase.. // 7/10 + if (sq[0].contains("IfCastInOwnMainPhase")) { final PhaseHandler cPhase = cc.getGame().getPhaseHandler(); - final boolean isMyMain = cPhase.getPhase().isMain() && cPhase.getPlayerTurn().equals(cc); + final boolean isMyMain = cPhase.getPhase().isMain() && cPhase.getPlayerTurn().equals(cc) && c.getCastFrom() != null; return doXMath(Integer.parseInt(sq[isMyMain ? 1 : 2]), m, c); } diff --git a/forge-gui/res/cardsfolder/a/arresters_admonition.txt b/forge-gui/res/cardsfolder/a/arresters_admonition.txt index af9f38bba93..a8a1577bddc 100644 --- a/forge-gui/res/cardsfolder/a/arresters_admonition.txt +++ b/forge-gui/res/cardsfolder/a/arresters_admonition.txt @@ -2,5 +2,5 @@ Name:Arrester's Admonition ManaCost:2 U Types:Instant A:SP$ ChangeZone | Cost$ 2 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBAddendum | SpellDescription$ Return target creature to its owner's hand. -SVar:DBAddendum:DB$ Draw | NumCards$ 1 | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SpellDescription$ Addendum - If you cast this spell during your main phase, draw a card. +SVar:DBAddendum:DB$ Draw | NumCards$ 1 | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | SpellDescription$ Addendum - If you cast this spell during your main phase, draw a card. Oracle:Return target creature to its owner's hand.\nAddendum — If you cast this spell during your main phase, draw a card. diff --git a/forge-gui/res/cardsfolder/a/arresters_zeal.txt b/forge-gui/res/cardsfolder/a/arresters_zeal.txt index d4ee060d7ce..a9c06d60204 100644 --- a/forge-gui/res/cardsfolder/a/arresters_zeal.txt +++ b/forge-gui/res/cardsfolder/a/arresters_zeal.txt @@ -2,5 +2,5 @@ Name:Arrester's Zeal ManaCost:W Types:Instant A:SP$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SubAbility$ DBAddendum | SpellDescription$ Target creature gets +2/+2 until end of turn. -SVar:DBAddendum:DB$ Pump | Cost$ W | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SpellDescription$ Addendum - If you cast this spell during your main phase, that creature gains flying until end of turn. +SVar:DBAddendum:DB$ Pump | Cost$ W | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | KW$ Flying | SpellDescription$ Addendum - If you cast this spell during your main phase, that creature gains flying until end of turn. Oracle:Target creature gets +2/+2 until end of turn.\nAddendum — If you cast this spell during your main phase, that creature gains flying until end of turn. diff --git a/forge-gui/res/cardsfolder/c/careful_consideration.txt b/forge-gui/res/cardsfolder/c/careful_consideration.txt index 719aa26b11c..78282a0c0e2 100644 --- a/forge-gui/res/cardsfolder/c/careful_consideration.txt +++ b/forge-gui/res/cardsfolder/c/careful_consideration.txt @@ -3,6 +3,6 @@ ManaCost:2 U U Types:Instant A:SP$ Draw | Cost$ 2 U U | NumCards$ 4 | ValidTgts$ Player | TgtPrompt$ Choose a player | SubAbility$ DBDiscard | SpellDescription$ Target player draws four cards, then discards three cards. If you cast this spell during your main phase, instead that player draws four cards, then discards two cards. SVar:DBDiscard:DB$Discard | NumCards$ X | Mode$ TgtChoose | Defined$ Targeted | References$ X -SVar:X:Count$IfMainPhase.2.3 +SVar:X:Count$IfCastInOwnMainPhase.2.3 SVar:Picture:http://www.wizards.com/global/images/magic/general/careful_consideration.jpg Oracle:Target player draws four cards, then discards three cards. If you cast this spell during your main phase, instead that player draws four cards, then discards two cards. diff --git a/forge-gui/res/cardsfolder/c/code_of_constraint.txt b/forge-gui/res/cardsfolder/c/code_of_constraint.txt index 33e49316fc9..3c915c898cc 100644 --- a/forge-gui/res/cardsfolder/c/code_of_constraint.txt +++ b/forge-gui/res/cardsfolder/c/code_of_constraint.txt @@ -3,7 +3,7 @@ ManaCost:2 U Types:Instant A:SP$ Pump | Cost$ 2 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -4 | IsCurse$ True | SubAbility$ DBDraw | SpellDescription$ Target creature gets -4/-0 until end of turn. SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card. | SubAbility$ DBAddendum -SVar:DBAddendum:DB$ Tap | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SubAbility$ DBPump | SpellDescription$ Addendum - If you cast this spell during your main phase, tap that creature and it doesn't untap during its controller's next untap step. -SVar:DBPump:DB$ Pump | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:DBAddendum:DB$ Tap | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | SubAbility$ DBPump | SpellDescription$ Addendum - If you cast this spell during your main phase, tap that creature and it doesn't untap during its controller's next untap step. +SVar:DBPump:DB$ Pump | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True SVar:PlayMain1:TRUE Oracle:Target creature gets -4/-0 until end of turn.\nDraw a card.\nAddendum — If you cast this spell during your main phase, tap that creature and it doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/d/dovins_acuity.txt b/forge-gui/res/cardsfolder/d/dovins_acuity.txt index 41757ebaac4..8d6e180b5ba 100644 --- a/forge-gui/res/cardsfolder/d/dovins_acuity.txt +++ b/forge-gui/res/cardsfolder/d/dovins_acuity.txt @@ -4,8 +4,7 @@ Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 2 life and draw a card. SVar:TrigGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 | SubAbility$ DBDraw SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 1 -T:Mode$ SpellCast | ValidCard$ Instant | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | PlayerTurn$ True | CheckSVar$ X | SVarCompare$ GE1 | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ Whenever you cast an instant spell during your main phase, you may return CARDNAME to its owner's hand. +T:Mode$ SpellCast | ValidCard$ Instant | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | PlayerTurn$ True | Phase$ Main1,Main2 | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ Whenever you cast an instant spell during your main phase, you may return CARDNAME to its owner's hand. SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Defined$ Self -SVar:X:Count$IfMainPhase.1.0 DeckHas:Ability$LifeGain Oracle:When Dovin's Acuity enters the battlefield, you gain 2 life and draw a card.\nWhenever you cast an instant spell during your main phase, you may return Dovin's Acuity to its owner's hand. diff --git a/forge-gui/res/cardsfolder/e/emergency_powers.txt b/forge-gui/res/cardsfolder/e/emergency_powers.txt index 81b977e44f4..d82b68b8eb8 100644 --- a/forge-gui/res/cardsfolder/e/emergency_powers.txt +++ b/forge-gui/res/cardsfolder/e/emergency_powers.txt @@ -4,5 +4,5 @@ Types:Instant A:SP$ ChangeZoneAll | Cost$ 5 W 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 hand into their library, then draws seven cards. Exile CARDNAME. SVar:DBDraw:DB$ Draw | NumCards$ 7 | Defined$ Player | SubAbility$ DBChange SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile | SubAbility$ DBAddendum -SVar:DBAddendum:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | ChangeType$ Permanent.cmcLE7+YouCtrl | SubAbility$ DBPump | RememberChanged$ True | ChangeNum$ 1 | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SpellDescription$ Addendum - If you cast this spell during your main phase, you may put a permanent card with converted mana cost 7 or less from your hand onto the battlefield. +SVar:DBAddendum:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | ChangeType$ Permanent.cmcLE7+YouCtrl | ChangeNum$ 1 | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | SpellDescription$ Addendum - If you cast this spell during your main phase, you may put a permanent card with converted mana cost 7 or less from your hand onto the battlefield. Oracle:Each player shuffles their hand and graveyard into their library, then draws seven cards. Exile Emergency Powers.\nAddendum — If you cast this spell during your main phase, you may put a permanent card with converted mana cost 7 or less from your hand onto the battlefield. diff --git a/forge-gui/res/cardsfolder/h/haunting_hymn.txt b/forge-gui/res/cardsfolder/h/haunting_hymn.txt index e36e5378d4d..bbfe2f51c2b 100644 --- a/forge-gui/res/cardsfolder/h/haunting_hymn.txt +++ b/forge-gui/res/cardsfolder/h/haunting_hymn.txt @@ -2,6 +2,6 @@ Name:Haunting Hymn ManaCost:4 B B Types:Instant A:SP$ Discard | Cost$ 4 B B | ValidTgts$ Player | NumCards$ X | Mode$ TgtChoose | References$ X | SpellDescription$ Target player discards two cards. If you cast this spell during your main phase, that player discards four cards instead. -SVar:X:Count$IfMainPhase.4.2 +SVar:X:Count$IfCastInOwnMainPhase.4.2 SVar:Picture:http://www.wizards.com/global/images/magic/general/haunting_hymn.jpg Oracle:Target player discards two cards. If you cast this spell during your main phase, that player discards four cards instead. diff --git a/forge-gui/res/cardsfolder/m/might_of_old_krosa.txt b/forge-gui/res/cardsfolder/m/might_of_old_krosa.txt index 27d62fdc11b..d2aa52c69bb 100644 --- a/forge-gui/res/cardsfolder/m/might_of_old_krosa.txt +++ b/forge-gui/res/cardsfolder/m/might_of_old_krosa.txt @@ -2,6 +2,6 @@ Name:Might of Old Krosa ManaCost:G Types:Instant A:SP$ Pump | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ X | NumDef$ X | References$ X | SpellDescription$ Target creature gets +2/+2 until end of turn. If you cast this spell during your main phase, that creature gets +4/+4 until end of turn instead. -SVar:X:Count$IfMainPhase.4.2 +fCSVar:X:Count$IfCastInOwnMainPhase.4.2 SVar:Picture:http://www.wizards.com/global/images/magic/general/might_of_old_krosa.jpg Oracle:Target creature gets +2/+2 until end of turn. If you cast this spell during your main phase, that creature gets +4/+4 until end of turn instead. diff --git a/forge-gui/res/cardsfolder/p/precognitive_perception.txt b/forge-gui/res/cardsfolder/p/precognitive_perception.txt index 0b2a2ef5f7c..333aae56a15 100644 --- a/forge-gui/res/cardsfolder/p/precognitive_perception.txt +++ b/forge-gui/res/cardsfolder/p/precognitive_perception.txt @@ -1,6 +1,6 @@ Name:Precognitive Perception ManaCost:3 U U Types:Instant -A:SP$ Scry | Cost$ 3 U U | ScryNum$ 3 | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SubAbility$ DBDraw | SpellDescription$ Draw three cards.\nAddendum — If you cast this spell during your main phase, instead scry 3, then draw three cards. +A:SP$ Scry | Cost$ 3 U U | ScryNum$ 3 | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | SubAbility$ DBDraw | SpellDescription$ Draw three cards.\nAddendum — If you cast this spell during your main phase, instead scry 3, then draw three cards. SVar:DBDraw:DB$ Draw | Cost$ 3 U U | NumCards$ 3 Oracle:Draw three cards.\nAddendum — If you cast this spell during your main phase, instead scry 3, then draw three cards. diff --git a/forge-gui/res/cardsfolder/r/return_to_dust.txt b/forge-gui/res/cardsfolder/r/return_to_dust.txt index 90419db7e4f..25093adb331 100644 --- a/forge-gui/res/cardsfolder/r/return_to_dust.txt +++ b/forge-gui/res/cardsfolder/r/return_to_dust.txt @@ -2,6 +2,6 @@ Name:Return to Dust ManaCost:2 W W Types:Instant A:SP$ ChangeZone | Cost$ 2 W W | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | TargetMin$ 1 | TargetMax$ X | References$ X | SpellDescription$ Exile target artifact or enchantment. If you cast this spell during your main phase, you may exile up to one other target artifact or enchantment. -SVar:X:Count$IfMainPhase.2.1 +SVar:X:Count$IfCastInOwnMainPhase.2.1 SVar:Picture:http://www.wizards.com/global/images/magic/general/return_to_dust.jpg Oracle:Exile target artifact or enchantment. If you cast this spell during your main phase, you may exile up to one other target artifact or enchantment. diff --git a/forge-gui/res/cardsfolder/s/sentinels_mark.txt b/forge-gui/res/cardsfolder/s/sentinels_mark.txt index db9d0ffe5e8..39b30ba2e24 100644 --- a/forge-gui/res/cardsfolder/s/sentinels_mark.txt +++ b/forge-gui/res/cardsfolder/s/sentinels_mark.txt @@ -5,7 +5,6 @@ K:Flash K:Enchant creature A:SP$ Attach | Cost$ 1 W | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 2 | AddKeyword$ Vigilance | Description$ Enchanted creature gets +1/+2 and has vigilance. -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigPump | PlayerTurn$ True | CheckSVar$ X | SVarCompare$ GE1 | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it during your main phase, enchanted creature gains lifelink until end of turn. +T:Mode$ ChangesZone | ValidCard$ Card.Self+wasCast | Origin$ Any | Destination$ Battlefield | Execute$ TrigPump | PlayerTurn$ True | Phase$ Main1,Main2 | TriggerDescription$ Addendum — When CARDNAME enters the battlefield, if you cast it during your main phase, enchanted creature gains lifelink until end of turn. SVar:TrigPump:DB$ Pump | Defined$ Enchanted | KW$ Lifelink -SVar:X:Count$IfMainPhase.1.0 Oracle:Flash\nEnchant creature\nEnchanted creature gets +1/+2 and has vigilance.\nAddendum — When Sentinel's Mark enters the battlefield, if you cast it during your main phase, enchanted creature gains lifelink until end of turn. diff --git a/forge-gui/res/cardsfolder/s/sphinxs_insight.txt b/forge-gui/res/cardsfolder/s/sphinxs_insight.txt index 1803de4d01f..3409fcb7527 100644 --- a/forge-gui/res/cardsfolder/s/sphinxs_insight.txt +++ b/forge-gui/res/cardsfolder/s/sphinxs_insight.txt @@ -2,6 +2,6 @@ Name:Sphinx's Insight ManaCost:2 W U Types:Instant A:SP$ Draw | Cost$ 2 W U | NumCards$ 2 | SubAbility$ DBLife | StackDescription$ SpellDescription | SpellDescription$ Draw two cards. -SVar:DBLife:DB$ GainLife | LifeAmount$ 2 | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SpellDescription$ Addendum - If you cast this spell during your main phase, you gain 2 life. +SVar:DBLife:DB$ GainLife | LifeAmount$ 2 | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | SpellDescription$ Addendum - If you cast this spell during your main phase, you gain 2 life. DeckHas:Ability$LifeGain Oracle:Draw two cards.\nAddendum - If you cast this spell during your main phase, you gain 2 life. diff --git a/forge-gui/res/cardsfolder/s/sulfurous_blast.txt b/forge-gui/res/cardsfolder/s/sulfurous_blast.txt index 51c9649b586..a0f456cbdc7 100644 --- a/forge-gui/res/cardsfolder/s/sulfurous_blast.txt +++ b/forge-gui/res/cardsfolder/s/sulfurous_blast.txt @@ -2,6 +2,6 @@ Name:Sulfurous Blast ManaCost:2 R R Types:Instant A:SP$ DamageAll | Cost$ 2 R R | NumDmg$ X | References$ X | ValidCards$ Creature | ValidPlayers$ Player | ValidDescription$ each creature and each player. | SpellDescription$ CARDNAME deals 2 damage to each creature and each player. If you cast this spell during your main phase, CARDNAME deals 3 damage to each creature and each player instead. -SVar:X:Count$IfMainPhase.3.2 +SVar:X:Count$IfCastInOwnMainPhase.3.2 SVar:Picture:http://www.wizards.com/global/images/magic/general/sulfurous_blast.jpg Oracle:Sulfurous Blast deals 2 damage to each creature and each player. If you cast this spell during your main phase, Sulfurous Blast deals 3 damage to each creature and each player instead. diff --git a/forge-gui/res/cardsfolder/s/summary_judgment.txt b/forge-gui/res/cardsfolder/s/summary_judgment.txt index 605dc72faa4..5ffb7622e54 100644 --- a/forge-gui/res/cardsfolder/s/summary_judgment.txt +++ b/forge-gui/res/cardsfolder/s/summary_judgment.txt @@ -2,5 +2,5 @@ Name:Summary Judgment ManaCost:1 W Types:Instant A:SP$ DealDamage | Cost$ 1 W | ValidTgts$ Creature.tapped | NumDmg$ X | References$ X | TgtPrompt$ Select target tapped creature | SpellDescription$ CARDNAME deals 3 damage to target tapped creature. If you cast this spell during your main phase, CARDNAME deals 5 damage to that creature instead. -SVar:X:Count$IfMainPhase.5.3 +SVar:X:Count$IfCastInOwnMainPhase.5.3 Oracle:Summary Judgment deals 3 damage to target tapped creature.\nAddendum — If you cast this spell during your main phase, it deals 5 damage to that creature instead. diff --git a/forge-gui/res/cardsfolder/u/unbreakable_formation.txt b/forge-gui/res/cardsfolder/u/unbreakable_formation.txt index 61bd095585d..87d3f8593f2 100644 --- a/forge-gui/res/cardsfolder/u/unbreakable_formation.txt +++ b/forge-gui/res/cardsfolder/u/unbreakable_formation.txt @@ -2,6 +2,7 @@ Name:Unbreakable Formation ManaCost:2 W Types:Instant A:SP$ PumpAll | Cost$ 2 W | ValidCards$ Creature.YouCtrl | KW$ Indestructible | SubAbility$ DBAddendum | SpellDescription$ Creatures you control gain indestructible until end of turn. -SVar:DBAddendum:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Vigilance | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SubAbility$ DBPutCounters | SpellDescription$ Addendum — If you cast this spell during your main phase, put a +1/+1 counter on each of those creatures, and they also gain vigilance until end of turn. -SVar:DBPutCounters:DB$ PutCounterAll | ValidCards$ Creature.YouCtrl | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | CounterType$ P1P1 | CounterNum$ 1 +SVar:DBAddendum:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Vigilance | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | SubAbility$ DBPutCounters | SpellDescription$ Addendum — If you cast this spell during your main phase, put a +1/+1 counter on each of those creatures, and they also gain vigilance until end of turn. +SVar:DBPutCounters:DB$ PutCounterAll | ValidCards$ Creature.YouCtrl | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | CounterType$ P1P1 | CounterNum$ 1 +DeckHas:Ability$LifeGain & Ability$Counters Oracle:Creatures you control gain indestructible until end of turn.\nAddendum — If you cast this spell during your main phase, put a +1/+1 counter on each of those creatures, and they also gain vigilance until end of turn. From 519b05fcc1598bcb9038191378d763c894224ed3 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Wed, 6 Feb 2019 07:25:02 +0100 Subject: [PATCH 804/901] Lumbering Battlement: use Hidden for ChangeType --- forge-gui/res/cardsfolder/l/lumbering_battlement.txt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/forge-gui/res/cardsfolder/l/lumbering_battlement.txt b/forge-gui/res/cardsfolder/l/lumbering_battlement.txt index 9e3ec703e98..e6d0f5c5e6b 100644 --- a/forge-gui/res/cardsfolder/l/lumbering_battlement.txt +++ b/forge-gui/res/cardsfolder/l/lumbering_battlement.txt @@ -3,14 +3,12 @@ ManaCost:4 W Types:Creature Beast PT:4/5 K:Vigilance -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ DBChooseExile | TriggerDescription$ When CARDNAME enters the battlefield, exile any number of other nontoken creatures you control until it leaves the battlefield. -SVar:DBChooseExile:DB$ ChooseCard | Defined$ You | MinAmount$ 0 | Amount$ MaxTgts | References$ MaxTgts | Choices$ Creature.nonToken+Other+YouCtrl | ChoiceTitle$ Choose any number of other nontoken creatures you control | ChoiceZone$ Battlefield | SubAbility$ TrigExile -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | Defined$ ChosenCard | SubAbility$ DBEffect -SVar:DBEffect:DB$ Effect | Triggers$ ComeBack | RememberObjects$ RememberedCard | ImprintCards$ Self | SVars$ TrigReturn,ExileSelf | ConditionPresent$ Card.Self | Duration$ Permanent | ForgetOnMoved$ Exile | SubAbility$ DBCleanup +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile any number of other nontoken creatures you control until it leaves the battlefield. +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | Hidden$ True | ChangeType$ Creature.nonToken+Other+YouCtrl | ChangeNum$ MaxTgts | SelectPrompt$ Choose any number of other nontoken creatures you control | SubAbility$ DBEffect | References$ MaxTgts +SVar:DBEffect:DB$ Effect | Triggers$ ComeBack | RememberObjects$ RememberedCard | ImprintCards$ Self | SVars$ TrigReturn,ExileSelf | ConditionPresent$ Card.Self | Duration$ Permanent | ForgetOnMoved$ Exile SVar:ComeBack:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.IsImprinted | Execute$ TrigReturn | TriggerZones$ Command | TriggerController$ TriggeredCardController | Static$ True | TriggerDescription$ That creature is exiled until EFFECTSOURCE leaves the battlefield SVar:TrigReturn:DB$ ChangeZoneAll | Origin$ Exile | Destination$ Battlefield | ChangeType$ Card.IsRemembered | SubAbility$ ExileSelf SVar:ExileSelf:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self -SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | AddToughness$ X | References$ X | Description$ CARDNAME gets +2/+2 for each card exiled with it. #Triggers to forget remembered on this T:Mode$ ChangesZone | ValidCard$ Card.IsRemembered | Origin$ Exile | Destination$ Any | TriggerZones$ Battlefield | Static$ True | Execute$ TrigForget From 7ea81fce8b63b39cba93c61aaf1100e080b93998 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Wed, 6 Feb 2019 07:28:13 +0100 Subject: [PATCH 805/901] cards: add missing empty Oracle --- forge-gui/res/cardsfolder/g/goblin_bruiser.txt | 1 + forge-gui/res/cardsfolder/s/shorecomber_crab.txt | 1 + forge-gui/res/cardsfolder/s/shrine_keeper.txt | 1 + forge-gui/res/cardsfolder/t/titanic_pelagosaur.txt | 1 + forge-gui/res/cardsfolder/t/treetop_warden.txt | 1 + 5 files changed, 5 insertions(+) diff --git a/forge-gui/res/cardsfolder/g/goblin_bruiser.txt b/forge-gui/res/cardsfolder/g/goblin_bruiser.txt index 4506eab0005..e0e907dea56 100644 --- a/forge-gui/res/cardsfolder/g/goblin_bruiser.txt +++ b/forge-gui/res/cardsfolder/g/goblin_bruiser.txt @@ -2,3 +2,4 @@ Name:Goblin Bruiser ManaCost:1 R R Types:Creature Goblin Warrior PT:3/3 +Oracle: diff --git a/forge-gui/res/cardsfolder/s/shorecomber_crab.txt b/forge-gui/res/cardsfolder/s/shorecomber_crab.txt index fe17bf9e5f7..16f73cae5f4 100644 --- a/forge-gui/res/cardsfolder/s/shorecomber_crab.txt +++ b/forge-gui/res/cardsfolder/s/shorecomber_crab.txt @@ -2,3 +2,4 @@ Name:Shorecomber Crab ManaCost:U Types:Creature Crab PT:0/4 +Oracle: diff --git a/forge-gui/res/cardsfolder/s/shrine_keeper.txt b/forge-gui/res/cardsfolder/s/shrine_keeper.txt index 6c288bdf392..50af2c691c9 100644 --- a/forge-gui/res/cardsfolder/s/shrine_keeper.txt +++ b/forge-gui/res/cardsfolder/s/shrine_keeper.txt @@ -2,3 +2,4 @@ Name:Shrine Keeper ManaCost:1 W Types:Creature Human Cleric PT:2/2 +Oracle: diff --git a/forge-gui/res/cardsfolder/t/titanic_pelagosaur.txt b/forge-gui/res/cardsfolder/t/titanic_pelagosaur.txt index 952f96c82cd..936d6ea9b7f 100644 --- a/forge-gui/res/cardsfolder/t/titanic_pelagosaur.txt +++ b/forge-gui/res/cardsfolder/t/titanic_pelagosaur.txt @@ -2,3 +2,4 @@ Name:Titanic Pelagosaur ManaCost:3 U U Types:Creature Dinosaur PT:4/6 +Oracle: diff --git a/forge-gui/res/cardsfolder/t/treetop_warden.txt b/forge-gui/res/cardsfolder/t/treetop_warden.txt index a527f425cf0..e69c5581599 100644 --- a/forge-gui/res/cardsfolder/t/treetop_warden.txt +++ b/forge-gui/res/cardsfolder/t/treetop_warden.txt @@ -2,3 +2,4 @@ Name:Treetop Warden ManaCost:1 G Types:Creature Elf Warrior PT:2/2 +Oracle: From 2284964c888a606fe1d583e7e6a4a52ace4858ec Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Wed, 6 Feb 2019 12:20:37 +0000 Subject: [PATCH 806/901] Update imperiosaur: fix P7T --- forge-gui/res/cardsfolder/i/imperiosaur.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/res/cardsfolder/i/imperiosaur.txt b/forge-gui/res/cardsfolder/i/imperiosaur.txt index 53c761e7050..22f8957750d 100644 --- a/forge-gui/res/cardsfolder/i/imperiosaur.txt +++ b/forge-gui/res/cardsfolder/i/imperiosaur.txt @@ -2,6 +2,7 @@ Name:Imperiosaur ManaCost:2 G G Types:Creature Dinosaur Text:Spend only mana produced by basic lands to cast CARDNAME. +PT:5/5 A:SP$ PermanentCreature | Cost$ Mana<2 G G\Basic> SVar:Picture:http://resources.wizards.com/magic/cards/fut/en-us/card130634.jpg Oracle:Spend only mana produced by basic lands to cast Imperiosaur. From c7d8a112d09bdbffabc24382108feed2dc39e7c8 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Wed, 6 Feb 2019 17:56:56 +0000 Subject: [PATCH 807/901] Update spear_spewer.txt --- forge-gui/res/cardsfolder/s/spear_spewer.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/s/spear_spewer.txt b/forge-gui/res/cardsfolder/s/spear_spewer.txt index 1b82793f9fb..dae44887362 100644 --- a/forge-gui/res/cardsfolder/s/spear_spewer.txt +++ b/forge-gui/res/cardsfolder/s/spear_spewer.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Creature Goblin Warrior PT:0/2 K:Defender -A:AB$ DealDamage | Cost$ T | NumDmg$ 1 | ValidPlayers$ Player | ValidDescription$ each player. | SpellDescription$ CARDNAME deals 1 damage to each player. +A:AB$ DamageAll | Cost$ T | NumDmg$ 1 | ValidPlayers$ Player | ValidDescription$ each player. | SpellDescription$ CARDNAME deals 1 damage to each player. SVar:NonCombatPriority:1 Oracle:Defender\n{T}: Spear Spewer deals 1 damage to each player. From 8385e80fd3aa4fbc0e0d927369dc16f6c0456724 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Wed, 6 Feb 2019 18:00:09 +0000 Subject: [PATCH 808/901] Revert guardian_project.txt for this branch --- forge-gui/res/cardsfolder/g/guardian_project.txt | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/forge-gui/res/cardsfolder/g/guardian_project.txt b/forge-gui/res/cardsfolder/g/guardian_project.txt index 3ba45a6e66d..ea2c3d77329 100644 --- a/forge-gui/res/cardsfolder/g/guardian_project.txt +++ b/forge-gui/res/cardsfolder/g/guardian_project.txt @@ -1,10 +1,6 @@ Name:Guardian Project ManaCost:3 G Types:Enchantment -T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+YouCtrl | Origin$ Any | Destination$ Battlefield | Execute$ TrigDraw | TriggerZones$ Battlefield | CheckSVar$ TotalShareNames | SVarCompare$ LE1 | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, if that creature doesn't have the same name as another creature you control or a creature card in your graveyard, draw a card. +T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+YouCtrl | Origin$ Any | Destination$ Battlefield | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, if that creature does not have the same name as another creature you control or a creature card in your graveyard, draw a card. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 -SVar:X:TriggeredCard$Valid Card.YouOwn+sharesNameWith YourGraveyard -#SVar:X:Count$ValidGraveyard Card.YouOwn+sharesNameWith TriggeredCard -SVar:Y:Count$Valid Card.YouCtrl+Other.sharesNameWith TriggerdCard -SVar:TotalShareNames:SVar$Y/Plus.X -Oracle:Whenever a nontoken creature enters the battlefield under your control, if that creature doesn't have the same name as another creature you control or a creature card in your graveyard, draw a card. +Oracle:Whenever a nontoken creature enters the battlefield under your control, if that creature does not have the same name as another creature you control or a creature card in your graveyard, draw a card. From 5d99a0e9188cbd4a120a71701fdbc55e6042a00e Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Wed, 6 Feb 2019 18:21:31 +0000 Subject: [PATCH 809/901] Update pestilent_spirit.txt --- forge-gui/res/cardsfolder/p/pestilent_spirit.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/p/pestilent_spirit.txt b/forge-gui/res/cardsfolder/p/pestilent_spirit.txt index ba7660bec7e..4aea69230f1 100644 --- a/forge-gui/res/cardsfolder/p/pestilent_spirit.txt +++ b/forge-gui/res/cardsfolder/p/pestilent_spirit.txt @@ -4,6 +4,6 @@ Types:Creature Spirit PT:3/2 K:Menace K:Deathtouch -S:Mode$ Continuous | Affected$ Instant.YouCtrl,Sorcery.YouCtrl | AddKeyword$ Deathtouch | Description$ Instant and sorcery spells you control have deathtouch. +S:Mode$ Continuous | Affected$ Instant.YouCtrl,Sorcery.YouCtrl | AddKeyword$ Deathtouch | AffectedZone$ Stack | Description$ Instant and sorcery spells you control have deathtouch. SVar:PlayMain1:TRUE Oracle:Menace, deathtouch\nInstant and sorcery spells you control have deathtouch. (Any amount of damage they deal to a creature is enough to destroy it.) From 5b10cb0e26e232e53cf031b58d0ddf01ccbd6897 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Wed, 6 Feb 2019 18:28:41 +0000 Subject: [PATCH 810/901] Update Contamination.dck --- forge-gui/res/quest/world/Urza/challenges/Contamination.dck | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/quest/world/Urza/challenges/Contamination.dck b/forge-gui/res/quest/world/Urza/challenges/Contamination.dck index 71136564cbd..bb04b8b742d 100644 --- a/forge-gui/res/quest/world/Urza/challenges/Contamination.dck +++ b/forge-gui/res/quest/world/Urza/challenges/Contamination.dck @@ -17,7 +17,7 @@ Icon=Dungeon Crawling Black.jpg Deck Type=constructed [Main] 24 Swamp|USG -4 Despondency|ULG +4 Despondency|USG 4 Fog of Gnats|ULG 16 Giant Cockroach|ULG 4 Mana Leech|USG From d86e04222d8f878c5b71904cb49a2f5eddc4fb8e Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Wed, 6 Feb 2019 18:29:08 +0000 Subject: [PATCH 811/901] Revert "Update Contamination.dck" This reverts commit 5b10cb0e26e232e53cf031b58d0ddf01ccbd6897 --- forge-gui/res/quest/world/Urza/challenges/Contamination.dck | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/quest/world/Urza/challenges/Contamination.dck b/forge-gui/res/quest/world/Urza/challenges/Contamination.dck index bb04b8b742d..71136564cbd 100644 --- a/forge-gui/res/quest/world/Urza/challenges/Contamination.dck +++ b/forge-gui/res/quest/world/Urza/challenges/Contamination.dck @@ -17,7 +17,7 @@ Icon=Dungeon Crawling Black.jpg Deck Type=constructed [Main] 24 Swamp|USG -4 Despondency|USG +4 Despondency|ULG 4 Fog of Gnats|ULG 16 Giant Cockroach|ULG 4 Mana Leech|USG From 5b9e121674b6236b022c8b4b642e2abf1672c6d3 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Wed, 6 Feb 2019 18:29:37 +0000 Subject: [PATCH 812/901] Update Contamination.dck --- forge-gui/res/quest/world/Urza/challenges/Contamination.dck | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/quest/world/Urza/challenges/Contamination.dck b/forge-gui/res/quest/world/Urza/challenges/Contamination.dck index 71136564cbd..bb04b8b742d 100644 --- a/forge-gui/res/quest/world/Urza/challenges/Contamination.dck +++ b/forge-gui/res/quest/world/Urza/challenges/Contamination.dck @@ -17,7 +17,7 @@ Icon=Dungeon Crawling Black.jpg Deck Type=constructed [Main] 24 Swamp|USG -4 Despondency|ULG +4 Despondency|USG 4 Fog of Gnats|ULG 16 Giant Cockroach|ULG 4 Mana Leech|USG From 55ccd88790b3e2142595b2996394f4ddaf571b5d Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Wed, 6 Feb 2019 18:38:32 +0000 Subject: [PATCH 813/901] Update descriptions on swirling_torrent.txt --- forge-gui/res/cardsfolder/s/swirling_torrent.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/s/swirling_torrent.txt b/forge-gui/res/cardsfolder/s/swirling_torrent.txt index 21f7cf795bc..325c35b7863 100644 --- a/forge-gui/res/cardsfolder/s/swirling_torrent.txt +++ b/forge-gui/res/cardsfolder/s/swirling_torrent.txt @@ -2,6 +2,6 @@ Name:Swirling Torrent ManaCost:5 U Types:Sorcery A:SP$ Charm | Cost$ 5 U | MinCharmNum$ 1 | CharmNum$ 2 | Choices$ DBSubmerge,DBUnsummon -SVar:DBSubmerge:DB$ ChangeZone | ValidTgts$ Creature | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SpellDescription$ Put target attacking or blocking creature on top of its owner's library. -SVar:DBUnsummon:DB$ ChangeZone | ValidTgts$ Creature | Origin$ Battlefield | Destination$ Hand +SVar:DBSubmerge:DB$ ChangeZone | ValidTgts$ Creature | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SpellDescription$ Put target creature on top of its owner's library. +SVar:DBUnsummon:DB$ ChangeZone | ValidTgts$ Creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. Oracle:Choose one or both —\n• Put target creature on top of its owner's library.\n• Return target creature to its owner's hand. From fbde2483e425322aea867e45739f3eb273b040ea Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Wed, 6 Feb 2019 18:41:40 +0000 Subject: [PATCH 814/901] Update arresters_zeal.txt --- forge-gui/res/cardsfolder/a/arresters_zeal.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/a/arresters_zeal.txt b/forge-gui/res/cardsfolder/a/arresters_zeal.txt index d4ee060d7ce..aea69fd8629 100644 --- a/forge-gui/res/cardsfolder/a/arresters_zeal.txt +++ b/forge-gui/res/cardsfolder/a/arresters_zeal.txt @@ -2,5 +2,5 @@ Name:Arrester's Zeal ManaCost:W Types:Instant A:SP$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SubAbility$ DBAddendum | SpellDescription$ Target creature gets +2/+2 until end of turn. -SVar:DBAddendum:DB$ Pump | Cost$ W | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SpellDescription$ Addendum - If you cast this spell during your main phase, that creature gains flying until end of turn. +SVar:DBAddendum:DB$ Pump | KW$ Flying | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SpellDescription$ Addendum - If you cast this spell during your main phase, that creature gains flying until end of turn. Oracle:Target creature gets +2/+2 until end of turn.\nAddendum — If you cast this spell during your main phase, that creature gains flying until end of turn. From 76b929b814aac036c285bde2fa63905b667cce07 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Wed, 6 Feb 2019 18:47:19 +0000 Subject: [PATCH 815/901] Revert "Update arresters_zeal.txt" This reverts commit fbde2483e425322aea867e45739f3eb273b040ea --- forge-gui/res/cardsfolder/a/arresters_zeal.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/a/arresters_zeal.txt b/forge-gui/res/cardsfolder/a/arresters_zeal.txt index aea69fd8629..d4ee060d7ce 100644 --- a/forge-gui/res/cardsfolder/a/arresters_zeal.txt +++ b/forge-gui/res/cardsfolder/a/arresters_zeal.txt @@ -2,5 +2,5 @@ Name:Arrester's Zeal ManaCost:W Types:Instant A:SP$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SubAbility$ DBAddendum | SpellDescription$ Target creature gets +2/+2 until end of turn. -SVar:DBAddendum:DB$ Pump | KW$ Flying | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SpellDescription$ Addendum - If you cast this spell during your main phase, that creature gains flying until end of turn. +SVar:DBAddendum:DB$ Pump | Cost$ W | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | SpellDescription$ Addendum - If you cast this spell during your main phase, that creature gains flying until end of turn. Oracle:Target creature gets +2/+2 until end of turn.\nAddendum — If you cast this spell during your main phase, that creature gains flying until end of turn. From 29b0c6eb696abb14a0ed566ba507fab04977848c Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Wed, 6 Feb 2019 20:17:25 +0000 Subject: [PATCH 816/901] Update kaya_orzhov_usurper.txt --- forge-gui/res/cardsfolder/k/kaya_orzhov_usurper.txt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/k/kaya_orzhov_usurper.txt b/forge-gui/res/cardsfolder/k/kaya_orzhov_usurper.txt index bd80a5c77a1..9b9d8a274a7 100644 --- a/forge-gui/res/cardsfolder/k/kaya_orzhov_usurper.txt +++ b/forge-gui/res/cardsfolder/k/kaya_orzhov_usurper.txt @@ -2,10 +2,9 @@ Name:Kaya, Orzhov Usurper ManaCost:1 W B Types:Legendary Planeswalker Kaya Loyalty:3 -A:AB$ ChangeZone | Cost$ AddCounter<1/LOYALTY> | Origin$ Graveyard | Destination$ Exile | TargetMin$ 0 | TargetMax$ 2 | TargetsFromSingleZone$ True | ValidTgts$ Card | TgtPrompt$ Select target card from a graveyard | Planeswalker$ True | SubAbility$ DBGainLife | SpellDescription$ Exile up to two target cards from a single graveyard. You gain 2 life if at least one creature card was exiled this way. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | References$ X | SubAbility$ DBCleanup +A:AB$ ChangeZone | Cost$ AddCounter<1/LOYALTY> | Origin$ Graveyard | Destination$ Exile | TargetMin$ 0 | TargetMax$ 2 | TargetsFromSingleZone$ True | ValidTgts$ Card | TgtPrompt$ Select target card from a graveyard | Planeswalker$ True | SubAbility$ DBGainLife | RememberChanged$ True | SpellDescription$ Exile up to two target cards from a single graveyard. You gain 2 life if at least one creature card was exiled this way. +SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ GE1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:X:Count$ValidExile A:AB$ ChangeZone | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | Origin$ Battlefield | Destination$ Exile | TgtPrompt$ Choose target nonland permanent with converted mana cost 1 or less | ValidTgts$ Permanent.nonLand+cmcLE1 | SpellDescription$ Exile target nonland permanent with converted mana cost 1 or less. A:AB$ DealDamage | Cost$ SubCounter<5/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Player | NumDmg$ X | References$ X | SubAbility$ DBYouGainLife | SpellDescription$ CARDNAME deals damage to target player equal to the number of cards that player owns in exile and you gain that much life. SVar:DBYouGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X From bb57cb1e1b979e425e35cbe05da7e7f36be3630f Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Wed, 6 Feb 2019 20:28:43 +0000 Subject: [PATCH 817/901] Update kaya_orzhov_usurper.txt --- forge-gui/res/cardsfolder/k/kaya_orzhov_usurper.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/k/kaya_orzhov_usurper.txt b/forge-gui/res/cardsfolder/k/kaya_orzhov_usurper.txt index 9b9d8a274a7..2ce99e612ae 100644 --- a/forge-gui/res/cardsfolder/k/kaya_orzhov_usurper.txt +++ b/forge-gui/res/cardsfolder/k/kaya_orzhov_usurper.txt @@ -6,8 +6,8 @@ A:AB$ ChangeZone | Cost$ AddCounter<1/LOYALTY> | Origin$ Graveyard | Destination SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ GE1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True A:AB$ ChangeZone | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | Origin$ Battlefield | Destination$ Exile | TgtPrompt$ Choose target nonland permanent with converted mana cost 1 or less | ValidTgts$ Permanent.nonLand+cmcLE1 | SpellDescription$ Exile target nonland permanent with converted mana cost 1 or less. -A:AB$ DealDamage | Cost$ SubCounter<5/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Player | NumDmg$ X | References$ X | SubAbility$ DBYouGainLife | SpellDescription$ CARDNAME deals damage to target player equal to the number of cards that player owns in exile and you gain that much life. +A:AB$ DealDamage | Cost$ SubCounter<5/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Player | RememberTargets$ True | NumDmg$ X | References$ X | SubAbility$ DBYouGainLife | SpellDescription$ CARDNAME deals damage to target player equal to the number of cards that player owns in exile and you gain that much life. SVar:DBYouGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X -SVar:X:TargetedPlayer$CardsInExile +SVar:X:Count$ValidExile Card.RememberedPlayerOwn DeckHas:Ability$LifeGain Oracle:[+1]: Exile up to two target cards from a single graveyard. You gain 2 life if at least one creature card was exiled this way.\n[-1]: Exile target nonland permanent with converted mana cost 1 or less.\n[-5]: Kaya, Orzhov Usurper deals damage to target player equal to the number of cards that player owns in exile and you gain that much life. From 20c978a64fd67c5edeb6c54e73425b44c807551c Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Wed, 6 Feb 2019 21:39:56 +0000 Subject: [PATCH 818/901] Revert "Update spear_spewer.txt" This reverts commit c7d8a112d09bdbffabc24382108feed2dc39e7c8 --- forge-gui/res/cardsfolder/s/spear_spewer.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/s/spear_spewer.txt b/forge-gui/res/cardsfolder/s/spear_spewer.txt index dae44887362..1b82793f9fb 100644 --- a/forge-gui/res/cardsfolder/s/spear_spewer.txt +++ b/forge-gui/res/cardsfolder/s/spear_spewer.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Creature Goblin Warrior PT:0/2 K:Defender -A:AB$ DamageAll | Cost$ T | NumDmg$ 1 | ValidPlayers$ Player | ValidDescription$ each player. | SpellDescription$ CARDNAME deals 1 damage to each player. +A:AB$ DealDamage | Cost$ T | NumDmg$ 1 | ValidPlayers$ Player | ValidDescription$ each player. | SpellDescription$ CARDNAME deals 1 damage to each player. SVar:NonCombatPriority:1 Oracle:Defender\n{T}: Spear Spewer deals 1 damage to each player. From 95f46dfde3df8d04d881b007a56127832678b718 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Thu, 7 Feb 2019 01:01:59 +0000 Subject: [PATCH 819/901] Update smothering_tithe.txt --- forge-gui/res/cardsfolder/s/smothering_tithe.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/s/smothering_tithe.txt b/forge-gui/res/cardsfolder/s/smothering_tithe.txt index 86a3ac8b876..ee64fc20dc2 100644 --- a/forge-gui/res/cardsfolder/s/smothering_tithe.txt +++ b/forge-gui/res/cardsfolder/s/smothering_tithe.txt @@ -2,6 +2,6 @@ Name:Smothering Tithe ManaCost:3 W Types:Enchantment T:Mode$ Drawn | ValidCard$ Card.OppOwn | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever an opponent draws a card, that player may pay {2}. If the player doesn't, you create a colorless Treasure artifact token with flying{T}, Sacrifice this artifact: Add one mana of any color. -SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_treasure_sac | TokenOwner$ TriggeredPlayer | LegacyImage$ c treasure +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | UnlessCost$ 2 | UnlessPayer$ TriggeredCardController | TokenScript$ c_a_treasure_sac | TokenOwner$ You | LegacyImage$ c treasure DeckHas:Ability$Token Oracle:Whenever an opponent draws a card, that player may pay {2}. If the player doesn't, you create a colorless Treasure artifact token with "{T}, Sacrifice this artifact: Add one mana of any color." From 4e8c18b2329008a9970d3c09da12feed58206134 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Thu, 7 Feb 2019 01:42:51 +0000 Subject: [PATCH 820/901] Update angel_of_grace.txt --- forge-gui/res/cardsfolder/a/angel_of_grace.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/a/angel_of_grace.txt b/forge-gui/res/cardsfolder/a/angel_of_grace.txt index 06254bbaf19..2646d303d75 100644 --- a/forge-gui/res/cardsfolder/a/angel_of_grace.txt +++ b/forge-gui/res/cardsfolder/a/angel_of_grace.txt @@ -5,8 +5,8 @@ PT:5/4 K:Flash K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigEffect | TriggerDescription$ When CARDNAME enters the battlefield, until end of turn, damage that would reduce your life total to less than 1 reduces it to 1 instead. -SVar:TrigEffect:DB$ Effect | Name$ CARDNAME Effect | ReplacementEffects$ ElderscaleCondition | Duration$ UntilEndOfTurn -SVar:SelflessDamage:Event$ Continuous | EffectZone$ Command | Affected$ You | AddKeyword$ DamageLifeThreshold:1 | Description$ Spells can't reduce your life total to less than 1 reduces it to 1 instead. +SVar:TrigEffect:DB$ Effect | Name$ Angel of Grace Effect | StaticAbilities$ SelflessDamage | Description$ Until end of turn, damage that would reduce your life total to less than 1 reduces it to 1 instead. +SVar:SelflessDamage:Mode$ Continuous | EffectZone$ Command | Affected$ You | AddKeyword$ DamageLifeThreshold:1 | Description$ Until end of turn, damage that would reduce your life total to less than 1 reduces it to 1 instead. A:AB$ SetLife | Cost$ 4 W W ExileFromGrave<1/CARDNAME> | ActivationZone$ Graveyard | LifeAmount$ 10 | SpellDescription$ Your life total becomes 10. SVar:RemRandomDeck:True Oracle:Flash\nFlying\nWhen Angel of Grace enters the battlefield, until end of turn, damage that would reduce your life total to less than 1 reduces it to 1 instead.\n{4}{W}{W}, Exile Angel of Grace from your graveyard: Your life total becomes 10. From 87359257fdf6beba6670a920fb3bcad96f68b31c Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Thu, 7 Feb 2019 02:06:54 +0000 Subject: [PATCH 821/901] Update end_raze_forerunners.txt --- forge-gui/res/cardsfolder/e/end_raze_forerunners.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/res/cardsfolder/e/end_raze_forerunners.txt b/forge-gui/res/cardsfolder/e/end_raze_forerunners.txt index 91d191b5729..3de3b399b1a 100644 --- a/forge-gui/res/cardsfolder/e/end_raze_forerunners.txt +++ b/forge-gui/res/cardsfolder/e/end_raze_forerunners.txt @@ -7,4 +7,5 @@ K:Trample K:Haste T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ When CARDNAME enters the battlefield, other creatures you control get +2/+2 and gain vigilance and trample until end of turn. SVar:TrigPumpAll:DB$PumpAll | ValidCards$ Creature.Other+YouCtrl | NumAtt$ +2 | NumDef$ +2 | KW$ Vigilance & Trample +SVar:PlayMain1:TRUE Oracle:Vigilance, trample, haste\nWhen End-Raze Forerunners enters the battlefield, other creatures you control get +2/+2 and gain vigilance and trample until end of turn. From a1c137a86b0ea412555ef224227a74c5fc117b9e Mon Sep 17 00:00:00 2001 From: Chris H Date: Wed, 6 Feb 2019 22:04:31 -0500 Subject: [PATCH 822/901] Fix Guardian Project --- .../main/java/forge/game/card/CardProperty.java | 15 ++++++++++++++- forge-gui/res/cardsfolder/g/guardian_project.txt | 4 ++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index ca2df4ea3a9..b55d033c864 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -967,6 +967,19 @@ public class CardProperty { if (restriction.startsWith("Remembered") || restriction.startsWith("Imprinted")) { CardCollection list = AbilityUtils.getDefinedCards(source, restriction, spellAbility); return CardLists.filter(list, CardPredicates.sharesNameWith(card)).isEmpty(); + } else if (restriction.equals("YourGraveyard")) { + return CardLists.filter(sourceController.getCardsIn(ZoneType.Graveyard), CardPredicates.sharesNameWith(card)).isEmpty(); + } else if (restriction.equals("OtherYourBattlefield")) { + // Obviously it's going to share a name with itself, so consider that in the + CardCollection list = CardLists.filter(sourceController.getCardsIn(ZoneType.Battlefield), CardPredicates.sharesNameWith(card)); + + if (list.size() == 1) { + Card c = list.getFirst(); + if (c.getTimestamp() == card.getTimestamp() && c.getId() == card.getId()) { + list.remove(card); + } + } + return list.isEmpty(); } } } else if (property.startsWith("sharesControllerWith")) { @@ -1715,10 +1728,10 @@ public class CardProperty { if (!castSA.isValid(v, sourceController, source, spellAbility)) { return false; } - } else if (property.equals("wasCast")) { if (null == card.getCastFrom()) { return false; } + } else if (property.equals("wasCast")) { } else if (property.equals("wasNotCast")) { if (null != card.getCastFrom()) { return false; diff --git a/forge-gui/res/cardsfolder/g/guardian_project.txt b/forge-gui/res/cardsfolder/g/guardian_project.txt index ea2c3d77329..c8a6a724a51 100644 --- a/forge-gui/res/cardsfolder/g/guardian_project.txt +++ b/forge-gui/res/cardsfolder/g/guardian_project.txt @@ -1,6 +1,6 @@ Name:Guardian Project ManaCost:3 G Types:Enchantment -T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+YouCtrl | Origin$ Any | Destination$ Battlefield | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, if that creature does not have the same name as another creature you control or a creature card in your graveyard, draw a card. +T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+YouCtrl+inRealZoneBattlefield+doesNotShareNameWith YourGraveyard+doesNotShareNameWith OtherYourBattlefield | Origin$ Any | Destination$ Battlefield | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, if that creature doesn't have the same name as another creature you control or a creature card in your graveyard, draw a card. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 -Oracle:Whenever a nontoken creature enters the battlefield under your control, if that creature does not have the same name as another creature you control or a creature card in your graveyard, draw a card. +Oracle:Whenever a nontoken creature enters the battlefield under your control, if that creature doesn't have the same name as another creature you control or a creature card in your graveyard, draw a card. From 84a2fed5164cbb0ed7bed206021c24747a057a8a Mon Sep 17 00:00:00 2001 From: Sol Date: Thu, 7 Feb 2019 03:42:23 +0000 Subject: [PATCH 823/901] Update guardian_project.txt --- forge-gui/res/cardsfolder/g/guardian_project.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/g/guardian_project.txt b/forge-gui/res/cardsfolder/g/guardian_project.txt index c8a6a724a51..27ee19df3be 100644 --- a/forge-gui/res/cardsfolder/g/guardian_project.txt +++ b/forge-gui/res/cardsfolder/g/guardian_project.txt @@ -1,6 +1,6 @@ Name:Guardian Project ManaCost:3 G Types:Enchantment -T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+YouCtrl+inRealZoneBattlefield+doesNotShareNameWith YourGraveyard+doesNotShareNameWith OtherYourBattlefield | Origin$ Any | Destination$ Battlefield | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, if that creature doesn't have the same name as another creature you control or a creature card in your graveyard, draw a card. +T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+YouCtrl+doesNotShareNameWith YourGraveyard+doesNotShareNameWith OtherYourBattlefield | Origin$ Any | Destination$ Battlefield | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, if that creature doesn't have the same name as another creature you control or a creature card in your graveyard, draw a card. SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 Oracle:Whenever a nontoken creature enters the battlefield under your control, if that creature doesn't have the same name as another creature you control or a creature card in your graveyard, draw a card. From 471fcaa938f8e0f7a54726d0836a1fc425657b2d Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 7 Feb 2019 08:05:06 +0300 Subject: [PATCH 824/901] - Revert an accidental change in CardProperty. --- forge-game/src/main/java/forge/game/card/CardProperty.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index b55d033c864..0a95db20bc2 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -1728,10 +1728,10 @@ public class CardProperty { if (!castSA.isValid(v, sourceController, source, spellAbility)) { return false; } + } else if (property.equals("wasCast")) { if (null == card.getCastFrom()) { return false; } - } else if (property.equals("wasCast")) { } else if (property.equals("wasNotCast")) { if (null != card.getCastFrom()) { return false; From ebddcb3210fbcb7139a8b0332fd00dc4eb3a6bc3 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Thu, 7 Feb 2019 06:40:11 +0000 Subject: [PATCH 825/901] Update spear_spewer.txt --- forge-gui/res/cardsfolder/s/spear_spewer.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/s/spear_spewer.txt b/forge-gui/res/cardsfolder/s/spear_spewer.txt index 1b82793f9fb..dae44887362 100644 --- a/forge-gui/res/cardsfolder/s/spear_spewer.txt +++ b/forge-gui/res/cardsfolder/s/spear_spewer.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Creature Goblin Warrior PT:0/2 K:Defender -A:AB$ DealDamage | Cost$ T | NumDmg$ 1 | ValidPlayers$ Player | ValidDescription$ each player. | SpellDescription$ CARDNAME deals 1 damage to each player. +A:AB$ DamageAll | Cost$ T | NumDmg$ 1 | ValidPlayers$ Player | ValidDescription$ each player. | SpellDescription$ CARDNAME deals 1 damage to each player. SVar:NonCombatPriority:1 Oracle:Defender\n{T}: Spear Spewer deals 1 damage to each player. From d763e3a1db5a6607908dd78b6608082c38fb0ef6 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Thu, 7 Feb 2019 06:42:14 +0000 Subject: [PATCH 826/901] Update arresters_zeal.txt --- forge-gui/res/cardsfolder/a/arresters_zeal.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/a/arresters_zeal.txt b/forge-gui/res/cardsfolder/a/arresters_zeal.txt index a9c06d60204..b94add4f5e4 100644 --- a/forge-gui/res/cardsfolder/a/arresters_zeal.txt +++ b/forge-gui/res/cardsfolder/a/arresters_zeal.txt @@ -2,5 +2,5 @@ Name:Arrester's Zeal ManaCost:W Types:Instant A:SP$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SubAbility$ DBAddendum | SpellDescription$ Target creature gets +2/+2 until end of turn. -SVar:DBAddendum:DB$ Pump | Cost$ W | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | KW$ Flying | SpellDescription$ Addendum - If you cast this spell during your main phase, that creature gains flying until end of turn. +SVar:DBAddendum:DB$ Pump | KW$ Flying | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | KW$ Flying | SpellDescription$ Addendum - If you cast this spell during your main phase, that creature gains flying until end of turn. Oracle:Target creature gets +2/+2 until end of turn.\nAddendum — If you cast this spell during your main phase, that creature gains flying until end of turn. From 67167c29fcc786e66309875719130ea8bb51513a Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Thu, 7 Feb 2019 08:41:02 +0000 Subject: [PATCH 827/901] Knight of the last Breath: fix Sac Description --- forge-gui/res/cardsfolder/k/knight_of_the_last_breath.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/k/knight_of_the_last_breath.txt b/forge-gui/res/cardsfolder/k/knight_of_the_last_breath.txt index a28bc189702..44e4c9385d7 100644 --- a/forge-gui/res/cardsfolder/k/knight_of_the_last_breath.txt +++ b/forge-gui/res/cardsfolder/k/knight_of_the_last_breath.txt @@ -2,7 +2,7 @@ Name:Knight of the Last Breath ManaCost:5 W B Types:Creature Giant Knight PT:4/4 -A:AB$ Token | Cost$ 3 Sac<1/Creature.nonToken+Other/another creature> | TokenAmount$ 1 | TokenScript$ wb_1_1_spirit_flying | TokenOwner$ You | LegacyImage$ wb 1 1 spirit flying rna | SpellDescription$ Create a 1/1 white and black Spirit creature token with flying. +A:AB$ Token | Cost$ 3 Sac<1/Creature.nonToken+Other/another nontoken creature> | TokenAmount$ 1 | TokenScript$ wb_1_1_spirit_flying | TokenOwner$ You | LegacyImage$ wb 1 1 spirit flying rna | SpellDescription$ Create a 1/1 white and black Spirit creature token with flying. SVar:RemRandomDeck:True K:Afterlife:3 SVar:AIPreference:SacCost$Creature.cmcLE1 From a3d75035b97b40c2b76bd73bd0b6877b874e1d61 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Thu, 7 Feb 2019 15:08:26 +0000 Subject: [PATCH 828/901] Update arresters_zeal.txt --- forge-gui/res/cardsfolder/a/arresters_zeal.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/a/arresters_zeal.txt b/forge-gui/res/cardsfolder/a/arresters_zeal.txt index b94add4f5e4..627dbcc32d1 100644 --- a/forge-gui/res/cardsfolder/a/arresters_zeal.txt +++ b/forge-gui/res/cardsfolder/a/arresters_zeal.txt @@ -2,5 +2,5 @@ Name:Arrester's Zeal ManaCost:W Types:Instant A:SP$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SubAbility$ DBAddendum | SpellDescription$ Target creature gets +2/+2 until end of turn. -SVar:DBAddendum:DB$ Pump | KW$ Flying | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | KW$ Flying | SpellDescription$ Addendum - If you cast this spell during your main phase, that creature gains flying until end of turn. +SVar:DBAddendum:DB$ Pump | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | KW$ Flying | SpellDescription$ Addendum - If you cast this spell during your main phase, that creature gains flying until end of turn. Oracle:Target creature gets +2/+2 until end of turn.\nAddendum — If you cast this spell during your main phase, that creature gains flying until end of turn. From 983eaaff3c0424ebd7434733919e9112368b426c Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Thu, 7 Feb 2019 20:56:54 +0000 Subject: [PATCH 829/901] Update amplifire.txt --- forge-gui/res/cardsfolder/a/amplifire.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/a/amplifire.txt b/forge-gui/res/cardsfolder/a/amplifire.txt index ec7e20c367f..72962ddde7c 100644 --- a/forge-gui/res/cardsfolder/a/amplifire.txt +++ b/forge-gui/res/cardsfolder/a/amplifire.txt @@ -4,7 +4,7 @@ Types:Creature Elemental PT:1/1 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDig | TriggerDescription$ At the beginning of your upkeep, reveal cards from the top of your library until you reveal a creature card. Until your next turn, CARDNAME's base power becomes twice that card's power and its toughness. Put the revealed cards on the bottom of your library in a random order. SVar:TrigDig:DB$ DigUntil | Reveal$ True | Valid$ Creature | ValidDescription$ creature card | FoundDestination$ Exile | RevealedDestination$ Exile | RememberFound$ True | ImprintRevealed$ True | SubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Power$ X | Toughness$ Y | SubAbility$ DBMovetoLib +SVar:DBAnimate:DB$ Animate | Power$ X | Toughness$ Y | UntilYourNextTurn$ True | SubAbility$ DBMovetoLib SVar:DBMovetoLib:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered,Card.IsImprinted | Origin$ Exile | Destination$ Library | RandomOrder$ True | LibraryPosition$ -1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True SVar:X:Remembered$CardPower/Times.2 From ee8a45b012e0752d83b49ed391091ee198245ff1 Mon Sep 17 00:00:00 2001 From: Tim Scott Date: Thu, 7 Feb 2019 19:05:13 -0600 Subject: [PATCH 830/901] Add test for model being null. This will occur upon deleting a deck. Addresses NPE encountered when a deck is deleted. --- forge-gui-mobile/src/forge/deck/FDeckEditor.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/forge-gui-mobile/src/forge/deck/FDeckEditor.java b/forge-gui-mobile/src/forge/deck/FDeckEditor.java index a281a7f5563..3026afdf8b5 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckEditor.java +++ b/forge-gui-mobile/src/forge/deck/FDeckEditor.java @@ -1528,7 +1528,13 @@ public class FDeckEditor extends TabPageScreen { modelPath = ""; setSaved(true); } - editor.setDeck(model.getHumanDeck()); + if (model != null) { + editor.setDeck(model.getHumanDeck()); + } + else { + editor.setDeck(null); + } + } private boolean isModelInSyncWithFolder() { From 5885c37a0ffeee5451f85d14c836f8f0399d39f1 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Fri, 8 Feb 2019 08:17:01 +0000 Subject: [PATCH 831/901] Deputy of Detention: need Condition like Bishop of Binding --- forge-gui/res/cardsfolder/d/deputy_of_detention.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/d/deputy_of_detention.txt b/forge-gui/res/cardsfolder/d/deputy_of_detention.txt index 300423f09a3..3e0f7974d3a 100644 --- a/forge-gui/res/cardsfolder/d/deputy_of_detention.txt +++ b/forge-gui/res/cardsfolder/d/deputy_of_detention.txt @@ -3,8 +3,8 @@ ManaCost:1 W U Types:Creature Vedalken Wizard PT:1/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target nonland permanent an opponent controls and all other nonland permanents that player controls with the same name as that permanent until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | RememberTargets$ True | SubAbility$ DBChangeZoneAll -SVar:DBChangeZoneAll:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Remembered.sameName+ControlledBy TargetedOrController | RememberChanged$ True | SubAbility$ DBEffect +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | ConditionPresent$ Card.Self | RememberTargets$ True | SubAbility$ DBChangeZoneAll +SVar:DBChangeZoneAll:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Remembered.sameName+ControlledBy TargetedOrController | ConditionPresent$ Card.Self | RememberChanged$ True | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | Triggers$ ComeBack | RememberObjects$ Remembered | ImprintCards$ Self | SVars$ TrigReturn,ExileSelf | ConditionPresent$ Card.Self | Duration$ Permanent | ForgetOnMoved$ Exile | SubAbility$ DBCleanup SVar:ComeBack:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.IsImprinted | Execute$ TrigReturn | TriggerZones$ Command | TriggerController$ TriggeredCardController | Static$ True | TriggerDescription$ Those permanents are exiled until EFFECTSOURCE leaves the battlefield SVar:TrigReturn:DB$ ChangeZoneAll | Origin$ Exile | Destination$ Battlefield | ChangeType$ Card.IsRemembered | SubAbility$ ExileSelf From 1df44f81660d6456a5d4f8b9779e2246ed37f7f5 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 8 Feb 2019 18:05:54 +0300 Subject: [PATCH 832/901] - Implement a simple combat Adapt logic. --- .../java/forge/ai/ability/CountersPutAi.java | 51 +++++++++++++++++-- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java index 8499e2921de..460835e73e5 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -311,13 +311,20 @@ public class CountersPutAi extends SpellAbilityAi { return false; } - if (sa.hasParam("Adapt") && source.getCounters(CounterType.P1P1) > 0) { - return false; - } - // TODO handle proper calculation of X values based on Cost int amount = AbilityUtils.calculateAmount(source, amountStr, sa); + if (sa.hasParam("Adapt")) { + Game game = ai.getGame(); + Combat combat = game.getCombat(); + + if (source.getCounters(CounterType.P1P1) > 0) { + return false; + } else if (combat != null && ph.is(PhaseType.COMBAT_DECLARE_BLOCKERS)) { + return doCombatAdaptLogic(source, amount, combat); + } + } + if ("Fight".equals(logic)) { int nPump = 0; if (type.equals("P1P1")) { @@ -1049,4 +1056,40 @@ public class CountersPutAi extends SpellAbilityAi { return false; } + private boolean doCombatAdaptLogic(Card source, int amount, Combat combat) { + // TODO: predict "can't have counters placed on it" type of effects here? + if (combat.isAttacking(source)) { + if (!combat.isBlocked(source)) { + return true; + } else { + for (Card blockedBy : combat.getBlockers(source)) { + if (blockedBy.getNetToughness() > source.getNetPower() + && blockedBy.getNetToughness() <= source.getNetPower() + amount) { + return true; + } + } + + int totBlkPower = Aggregates.sum(combat.getBlockers(source), CardPredicates.Accessors.fnGetNetPower); + if (source.getNetToughness() <= totBlkPower + && source.getNetToughness() + amount > totBlkPower) { + return true; + } + } + } else if (combat.isBlocking(source)) { + for (Card blocked : combat.getAttackersBlockedBy(source)) { + if (blocked.getNetToughness() > source.getNetPower() + && blocked.getNetToughness() <= source.getNetPower() + amount) { + return true; + } + } + + int totAtkPower = Aggregates.sum(combat.getAttackersBlockedBy(source), CardPredicates.Accessors.fnGetNetPower); + if (source.getNetToughness() <= totAtkPower + && source.getNetToughness() + amount > totAtkPower) { + return true; + } + } + return false; + } + } From 0c06346ca00ea2491b2248dd097b1a58a76ca68d Mon Sep 17 00:00:00 2001 From: Sol Date: Fri, 8 Feb 2019 16:12:15 +0000 Subject: [PATCH 833/901] Update Brawl.txt --- forge-gui/res/formats/Casual/Brawl.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/formats/Casual/Brawl.txt b/forge-gui/res/formats/Casual/Brawl.txt index 8a2125573a6..1df6b049fbe 100644 --- a/forge-gui/res/formats/Casual/Brawl.txt +++ b/forge-gui/res/formats/Casual/Brawl.txt @@ -3,5 +3,5 @@ Name:Brawl Order:101 Type:Casual Subtype:Commander -Sets:XLN, RIX, DOM, M19, GRN +Sets:XLN, RIX, DOM, M19, GRN, RNA Banned:Sorcerous Spyglass \ No newline at end of file From 09f90bfe3580ef724b1944304b955b5a2d6a326c Mon Sep 17 00:00:00 2001 From: Sol Date: Fri, 8 Feb 2019 16:13:58 +0000 Subject: [PATCH 834/901] Update Modern.txt --- forge-gui/res/formats/Sanctioned/Modern.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/formats/Sanctioned/Modern.txt b/forge-gui/res/formats/Sanctioned/Modern.txt index 12e45ae5ad3..39a0b23899e 100644 --- a/forge-gui/res/formats/Sanctioned/Modern.txt +++ b/forge-gui/res/formats/Sanctioned/Modern.txt @@ -3,5 +3,5 @@ Name:Modern Order:102 Subtype:Modern Type:Sanctioned -Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, EVE, SHM, MOR, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, MM2, ORI, BFZ, OGW, SOI, EMN, KLD, AER, AKH, W17, HOU, XLN, RIX, DOM, M19, GRN -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 +Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, EVE, SHM, MOR, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, MM2, ORI, BFZ, OGW, SOI, EMN, KLD, AER, AKH, W17, HOU, XLN, RIX, DOM, M19, GRN, 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 From 0a543ba35eddd0366e1b14cbf0fab1be0e387987 Mon Sep 17 00:00:00 2001 From: Agetian Date: Fri, 8 Feb 2019 20:17:36 +0300 Subject: [PATCH 835/901] - Don't try the Adapt logic if the card can't receive +1/+1 counters. --- forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java index 460835e73e5..c95502f6846 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -318,7 +318,7 @@ public class CountersPutAi extends SpellAbilityAi { Game game = ai.getGame(); Combat combat = game.getCombat(); - if (source.getCounters(CounterType.P1P1) > 0) { + if (!source.canReceiveCounters(CounterType.P1P1) || source.getCounters(CounterType.P1P1) > 0) { return false; } else if (combat != null && ph.is(PhaseType.COMBAT_DECLARE_BLOCKERS)) { return doCombatAdaptLogic(source, amount, combat); @@ -1057,7 +1057,6 @@ public class CountersPutAi extends SpellAbilityAi { } private boolean doCombatAdaptLogic(Card source, int amount, Combat combat) { - // TODO: predict "can't have counters placed on it" type of effects here? if (combat.isAttacking(source)) { if (!combat.isBlocked(source)) { return true; From 47c89fb0ae8b25c274a5c2f7b896a6b1dde4d0f2 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Fri, 8 Feb 2019 19:51:51 +0100 Subject: [PATCH 836/901] PhaseHandler: fix executeUntil needs to be done after checkStateEffects --- forge-game/src/main/java/forge/game/phase/PhaseHandler.java | 4 +++- forge-gui/res/cardsfolder/a/amplifire.txt | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java index 4a113d7fa59..1536f26339f 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java @@ -389,7 +389,6 @@ public class PhaseHandler implements java.io.Serializable { } playerTurn.removeKeyword("Skip all combat phases of this turn."); - game.getCleanup().executeUntil(getNextTurn()); nUpkeepsThisTurn = 0; // Rule 514.3 @@ -397,6 +396,9 @@ public class PhaseHandler implements java.io.Serializable { // Rule 514.3a - state-based actions game.getAction().checkStateEffects(true); + + // done this after check state effects, so it only has effect next check + game.getCleanup().executeUntil(getNextTurn()); break; default: diff --git a/forge-gui/res/cardsfolder/a/amplifire.txt b/forge-gui/res/cardsfolder/a/amplifire.txt index 72962ddde7c..c660f954f5b 100644 --- a/forge-gui/res/cardsfolder/a/amplifire.txt +++ b/forge-gui/res/cardsfolder/a/amplifire.txt @@ -4,7 +4,7 @@ Types:Creature Elemental PT:1/1 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDig | TriggerDescription$ At the beginning of your upkeep, reveal cards from the top of your library until you reveal a creature card. Until your next turn, CARDNAME's base power becomes twice that card's power and its toughness. Put the revealed cards on the bottom of your library in a random order. SVar:TrigDig:DB$ DigUntil | Reveal$ True | Valid$ Creature | ValidDescription$ creature card | FoundDestination$ Exile | RevealedDestination$ Exile | RememberFound$ True | ImprintRevealed$ True | SubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Power$ X | Toughness$ Y | UntilYourNextTurn$ True | SubAbility$ DBMovetoLib +SVar:DBAnimate:DB$ Animate | Power$ X | Toughness$ Y | UntilYourNextTurn$ True | SubAbility$ DBMovetoLib | References$ X,Y SVar:DBMovetoLib:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered,Card.IsImprinted | Origin$ Exile | Destination$ Library | RandomOrder$ True | LibraryPosition$ -1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True SVar:X:Remembered$CardPower/Times.2 From d1887080283a5e4f300c8c0908b8cafb68096791 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 9 Feb 2019 09:29:32 +0100 Subject: [PATCH 837/901] Spell: Fixed MayPlay, getRestrictions.canPlay need originalHost --- forge-game/src/main/java/forge/game/spellability/Spell.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/forge-game/src/main/java/forge/game/spellability/Spell.java b/forge-game/src/main/java/forge/game/spellability/Spell.java index 267a61fea8e..02ca72951dd 100644 --- a/forge-game/src/main/java/forge/game/spellability/Spell.java +++ b/forge-game/src/main/java/forge/game/spellability/Spell.java @@ -144,8 +144,6 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable if (lkicheck) { game.getAction().checkStaticAbilities(false); game.getTracker().unfreeze(); - // reset owner for lki - card.setController(null, 0); } if (!(isInstant || activator.canCastSorcery() || flash || getRestrictions().isInstantSpeed() @@ -154,7 +152,7 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable return false; } - if (!this.getRestrictions().canPlay(card, this)) { + if (!this.getRestrictions().canPlay(getHostCard(), this)) { return false; } From 4da05f03dcac8cc330d25fc8cff9a4eea01588a3 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 9 Feb 2019 17:53:05 +0100 Subject: [PATCH 838/901] CardFactoryUtil: Aura swap as Keyword --- forge-game/src/main/java/forge/game/card/Card.java | 2 +- .../main/java/forge/game/card/CardFactoryUtil.java | 13 +++++++++++++ .../src/main/java/forge/game/card/CardUtil.java | 2 +- forge-gui/res/cardsfolder/a/arcanum_wings.txt | 4 ++-- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 2641196f2f5..ca16c6766fa 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -1650,7 +1650,7 @@ public class Card extends GameEntity implements Comparable { || keyword.startsWith("Level up") || keyword.equals("Prowess") || keyword.startsWith("Eternalize") || keyword.startsWith("Reinforce") || keyword.startsWith("Champion") || keyword.startsWith("Prowl") || keyword.startsWith("Amplify") || keyword.startsWith("Ninjutsu") || keyword.startsWith("Adapt") - || keyword.startsWith("Transfigure") + || keyword.startsWith("Transfigure") || keyword.startsWith("Aura swap") || keyword.startsWith("Cycling") || keyword.startsWith("TypeCycling")) { // keyword parsing takes care of adding a proper description } else if (keyword.startsWith("CantBeBlockedByAmount")) { diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index c764514a10e..099bf5b94a2 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -3746,6 +3746,19 @@ public class CardFactoryUtil { origSA.setAftermath(true); origSA.getRestrictions().setZone(ZoneType.Graveyard); // The Exile part is done by the System itself + } else if (keyword.startsWith("Aura swap")) { + final String[] k = keyword.split(":"); + final String manacost = k[1]; + + final String effect = "AB$ ExchangeZone | Cost$ " + manacost + " | Zone2$ Hand | Type$ Aura " + + " | PrecostDesc$ Aura swap | CostDesc$ " + ManaCostParser.parse(manacost) + + " | StackDescription$ SpellDescription | SpellDescription$ (" + inst.getReminderText() + ")"; + + final SpellAbility sa = AbilityFactory.getAbility(effect, card); + sa.setIntrinsic(intrinsic); + + sa.setTemporary(!intrinsic); + inst.addSpellAbility(sa); } else if (keyword.startsWith("Awaken")) { final String[] k = keyword.split(":"); final String counters = k[1]; 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 b6db1c2e940..972e9e2ec30 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -65,7 +65,7 @@ public final class CardUtil { "Transmute", "Replicate", "Recover", "Suspend", "Aura swap", "Fortify", "Transfigure", "Champion", "Evoke", "Prowl", "IfReach", "Reinforce", "Unearth", "Level up", "Miracle", "Overload", - "Scavenge", "Bestow", "Outlast", "Dash", "Renown", "Surge", "Emerge", "Hexproof:").build(); + "Scavenge", "Bestow", "Outlast", "Dash", "Surge", "Emerge", "Hexproof:").build(); /** List of keyword endings of keywords that could be modified by text changes. */ public static final ImmutableList modifiableKeywordEndings = ImmutableList.builder().add( "walk", "cycling", "offering").build(); diff --git a/forge-gui/res/cardsfolder/a/arcanum_wings.txt b/forge-gui/res/cardsfolder/a/arcanum_wings.txt index 2433c96d479..f682e0227aa 100644 --- a/forge-gui/res/cardsfolder/a/arcanum_wings.txt +++ b/forge-gui/res/cardsfolder/a/arcanum_wings.txt @@ -2,8 +2,8 @@ Name:Arcanum Wings ManaCost:1 U Types:Enchantment Aura K:Enchant creature +K:Aura swap:2 U A:SP$ Attach | Cost$ 1 U | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Flying | Description$ Enchanted creature has flying. -A:AB$ ExchangeZone | Cost$ 2 U | Zone2$ Hand | Type$ Aura | CostDesc$ Aura swap {2}{U} | SpellDescription$ ({2}{U}: Exchange this Aura with an Aura card in your hand.) SVar:Picture:http://www.wizards.com/global/images/magic/general/arcanum_wings.jpg -Oracle:Enchant creature\nEnchanted creature has flying.\nAura swap {2}{U} ({2}{U}: Exchange this Aura with an Aura card in your hand.) \ No newline at end of file +Oracle:Enchant creature\nEnchanted creature has flying.\nAura swap {2}{U} ({2}{U}: Exchange this Aura with an Aura card in your hand.) From d6b011fd720004d2f754864ead9bd600aabfd66a Mon Sep 17 00:00:00 2001 From: Sol Date: Sun, 10 Feb 2019 03:11:26 +0000 Subject: [PATCH 839/901] Update angelic_exaltation.txt --- forge-gui/res/cardsfolder/a/angelic_exaltation.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/res/cardsfolder/a/angelic_exaltation.txt b/forge-gui/res/cardsfolder/a/angelic_exaltation.txt index 8cdeda9c678..dd2bc189b42 100644 --- a/forge-gui/res/cardsfolder/a/angelic_exaltation.txt +++ b/forge-gui/res/cardsfolder/a/angelic_exaltation.txt @@ -4,4 +4,5 @@ Types:Enchantment T:Mode$ Attacks | ValidCard$ Creature.YouCtrl | Alone$ True | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a creature you control attacks alone, it gets +X/+X until end of turn, where X is the number of creatures you control. SVar:TrigPump:DB$ Pump | Defined$ TriggeredAttacker | NumAtt$ +X | NumDef$ +X | References$ X SVar:X:Count$Valid Creature.YouCtrl +SVar:PlayMain1:TRUE Oracle:Whenever a creature you control attacks alone, it gets +X/+X until end of turn, where X is the number of creatures you control. From 06df7cb036792a91de4aa7336880e94be8a411dd Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 10 Feb 2019 05:51:08 +0000 Subject: [PATCH 840/901] Update TriggerAttackerBlocked.java --- .../src/main/java/forge/game/trigger/TriggerAttackerBlocked.java | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java index 8ecea398286..9bd8258ffb3 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java @@ -87,6 +87,7 @@ public class TriggerAttackerBlocked extends Trigger { sa.setTriggeringObject("Attacker", this.getRunParams().get("Attacker")); sa.setTriggeringObject("Blockers", this.getRunParams().get("Blockers")); sa.setTriggeringObject("DefendingPlayer", this.getRunParams().get("DefendingPlayer")); + sa.setTriggeringObject("Defender", this.getRunParams().get("Defender")); sa.setTriggeringObject("NumBlockers", this.getRunParams().get("NumBlockers")); } From b56472555ab9d995706dfd52b323ceab918ac53b Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 10 Feb 2019 05:53:23 +0000 Subject: [PATCH 841/901] Revert "Update TriggerAttackerBlocked.java" This reverts commit 06df7cb036792a91de4aa7336880e94be8a411dd --- .../src/main/java/forge/game/trigger/TriggerAttackerBlocked.java | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java index 9bd8258ffb3..8ecea398286 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java @@ -87,7 +87,6 @@ public class TriggerAttackerBlocked extends Trigger { sa.setTriggeringObject("Attacker", this.getRunParams().get("Attacker")); sa.setTriggeringObject("Blockers", this.getRunParams().get("Blockers")); sa.setTriggeringObject("DefendingPlayer", this.getRunParams().get("DefendingPlayer")); - sa.setTriggeringObject("Defender", this.getRunParams().get("Defender")); sa.setTriggeringObject("NumBlockers", this.getRunParams().get("NumBlockers")); } From fcdf49bafd4ceacb1f7d93321c808e65d3dba4ae Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sun, 10 Feb 2019 07:42:18 +0100 Subject: [PATCH 842/901] TriggerAttackerBlocked: add TriggeredDefender --- .../ability/effects/BecomesBlockedEffect.java | 11 +++++--- .../java/forge/game/phase/PhaseHandler.java | 1 + .../game/trigger/TriggerAttackerBlocked.java | 25 ++++++++++--------- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/BecomesBlockedEffect.java b/forge-game/src/main/java/forge/game/ability/effects/BecomesBlockedEffect.java index 8431a1c1c2a..92b882c2166 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/BecomesBlockedEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/BecomesBlockedEffect.java @@ -10,9 +10,11 @@ import forge.game.trigger.TriggerType; import org.apache.commons.lang3.StringUtils; -import java.util.ArrayList; -import java.util.HashMap; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; + import java.util.List; +import java.util.Map; public class BecomesBlockedEffect extends SpellAbilityEffect { @@ -38,10 +40,11 @@ public class BecomesBlockedEffect extends SpellAbilityEffect { game.getCombat().setBlocked(c, true); if (!c.getDamageHistory().getCreatureGotBlockedThisCombat()) { isCombatChanged = true; - final HashMap runParams = new HashMap(); + final Map runParams = Maps.newHashMap(); runParams.put("Attacker", c); - runParams.put("Blockers", new ArrayList()); + runParams.put("Blockers", Lists.newArrayList()); runParams.put("NumBlockers", 0); + runParams.put("Defender", game.getCombat().getDefenderByAttacker(c)); runParams.put("DefendingPlayer", game.getCombat().getDefenderPlayerByAttacker(c)); game.getTriggerHandler().runTrigger(TriggerType.AttackerBlocked, runParams, false); } diff --git a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java index 4a113d7fa59..adb950d46c5 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java @@ -722,6 +722,7 @@ public class PhaseHandler implements java.io.Serializable { runParams.put("Attacker", a); runParams.put("Blockers", blockers); runParams.put("NumBlockers", blockers.size()); + runParams.put("Defender", combat.getDefenderByAttacker(a)); runParams.put("DefendingPlayer", combat.getDefenderPlayerByAttacker(a)); game.getTriggerHandler().runTrigger(TriggerType.AttackerBlocked, runParams, false); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java index 8ecea398286..89136658f35 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java @@ -52,25 +52,25 @@ public class TriggerAttackerBlocked extends Trigger { /** {@inheritDoc} */ @Override public final boolean performTest(final Map runParams2) { - if (this.mapParams.containsKey("ValidCard")) { - if (!matchesValid(runParams2.get("Attacker"), this.mapParams.get("ValidCard").split(","), - this.getHostCard())) { + if (hasParam("ValidCard")) { + if (!matchesValid(runParams2.get("Attacker"), getParam("ValidCard").split(","), + getHostCard())) { return false; } } - if (this.mapParams.containsKey("MinBlockers")) { - if ((int)runParams2.get("NumBlockers") < Integer.valueOf(this.mapParams.get("MinBlockers"))) { + if (hasParam("MinBlockers")) { + if ((int)runParams2.get("NumBlockers") < Integer.valueOf(getParam("MinBlockers"))) { return false; } } - if (this.mapParams.containsKey("ValidBlocker")) { + if (hasParam("ValidBlocker")) { @SuppressWarnings("unchecked") int count = CardLists.getValidCardCount( (Iterable) runParams2.get("Blockers"), - this.mapParams.get("ValidBlocker"), - this.getHostCard().getController(), this.getHostCard() + getParam("ValidBlocker"), + getHostCard().getController(), getHostCard() ); if ( count == 0 ) { @@ -84,10 +84,11 @@ public class TriggerAttackerBlocked extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa) { - sa.setTriggeringObject("Attacker", this.getRunParams().get("Attacker")); - sa.setTriggeringObject("Blockers", this.getRunParams().get("Blockers")); - sa.setTriggeringObject("DefendingPlayer", this.getRunParams().get("DefendingPlayer")); - sa.setTriggeringObject("NumBlockers", this.getRunParams().get("NumBlockers")); + sa.setTriggeringObject("Attacker", getRunParams().get("Attacker")); + sa.setTriggeringObject("Blockers", getRunParams().get("Blockers")); + sa.setTriggeringObject("Defender", getRunParams().get("Defender")); + sa.setTriggeringObject("DefendingPlayer", getRunParams().get("DefendingPlayer")); + sa.setTriggeringObject("NumBlockers", getRunParams().get("NumBlockers")); } @Override From 245994d094eba6643146c4f9f5acb3c84f6809e7 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 10 Feb 2019 09:40:13 +0000 Subject: [PATCH 843/901] Update clear_the_stage.txt --- forge-gui/res/cardsfolder/c/clear_the_stage.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/c/clear_the_stage.txt b/forge-gui/res/cardsfolder/c/clear_the_stage.txt index f82ce536653..86ba8f54eb1 100644 --- a/forge-gui/res/cardsfolder/c/clear_the_stage.txt +++ b/forge-gui/res/cardsfolder/c/clear_the_stage.txt @@ -2,5 +2,5 @@ Name:Clear the Stage ManaCost:4 B Types:Instant A:SP$ Pump | Cost$ 4 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -3 | NumDef$ -3 | IsCurse$ True | SubAbility$ DBChangeZone | SpellDescription$ Target creature gets -3/-3 until end of turn. If you control a creature with power 4 or greater, you may return up to one target creature card from your graveyard to your hand. -SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | TargetMin$ 0 | TargetMax$ 1 | TargetsWithDefinedController$ ParentTarget | ConditionPresent$ Creature.YouCtrl+powerGE4 +SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouOwn | TargetMin$ 0 | TargetMax$ 1 | ConditionPresent$ Creature.YouCtrl+powerGE4 Oracle:Target creature gets -3/-3 until end of turn. If you control a creature with power 4 or greater, you may return up to one target creature card from your graveyard to your hand. From e83c78e2b4253b986c7a5c76ea98ef9def556943 Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Sun, 10 Feb 2019 05:26:48 +0000 Subject: [PATCH 844/901] Epochrasite: the LKI thing there is wrong --- forge-gui/res/cardsfolder/e/epochrasite.txt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/e/epochrasite.txt b/forge-gui/res/cardsfolder/e/epochrasite.txt index 312a17f1629..e6a5965d55a 100644 --- a/forge-gui/res/cardsfolder/e/epochrasite.txt +++ b/forge-gui/res/cardsfolder/e/epochrasite.txt @@ -4,8 +4,9 @@ Types:Artifact Creature Construct PT:1/1 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 -SVar:DBPutCounter:DB$ PutCounter | Defined$ TriggeredCardLKICopy | CounterType$ TIME | CounterNum$ 3 | SubAbility$ GiveSuspend -SVar:GiveSuspend:DB$ Pump | Defined$ TriggeredCard | KW$ Suspend | PumpZone$ Exile | Permanent$ True +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 +SVar:GiveSuspend:DB$ Pump | Defined$ Remembered | KW$ Suspend | PumpZone$ Exile | Permanent$ True | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/epochrasite.jpg Oracle:Epochrasite enters the battlefield with three +1/+1 counters on it if you didn't cast it from your hand.\nWhen Epochrasite dies, exile it with three time counters on it and it gains suspend. (At the beginning of your upkeep, remove a time counter. When the last is removed, cast this card without paying its mana cost. It has haste.) From c9f9fd93cd44d2184481f66114c4290e3ca85be3 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Sun, 10 Feb 2019 13:28:52 -0500 Subject: [PATCH 845/901] allow floating zones to be sorted by the name of the card --- .../java/forge/view/arcane/FloatingZone.java | 54 ++++++++++++++++++- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java index bef56091f8e..ecd468c4837 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java @@ -19,7 +19,10 @@ package forge.view.arcane; import java.util.HashMap; import java.util.Map; +import java.util.Collections; +import java.util.Comparator; +import java.awt.event.MouseEvent; import javax.swing.ScrollPaneConstants; import javax.swing.WindowConstants; @@ -30,8 +33,10 @@ import forge.game.zone.ZoneType; import forge.properties.ForgePreferences.FPref; import forge.screens.match.CMatchUI; import forge.toolbox.FScrollPane; +import forge.toolbox.FMouseAdapter; import forge.toolbox.FSkin; import forge.util.Lang; +import forge.util.collect.FCollection; public class FloatingZone extends FloatingCardArea { private static final long serialVersionUID = 1927906492186378596L; @@ -101,8 +106,28 @@ public class FloatingZone extends FloatingCardArea { private final ZoneType zone; private PlayerView player; + protected boolean sortedByName = false; + protected FCollection cardList; + + private final Comparator comp = new Comparator() { + @Override + public int compare(CardView lhs, CardView rhs) { + if ( !getMatchUI().mayView(lhs) ) { + return ( getMatchUI().mayView(rhs) ) ? 1 : 0 ; + } else if ( !getMatchUI().mayView(rhs) ) { + return -1; + } else { + return lhs.getName().compareTo(rhs.getName()); + } + } + }; + protected Iterable getCards() { - return player.getCards(zone); + cardList = new FCollection(player.getCards(zone)); + if ( sortedByName ) { + Collections.sort(cardList, comp); + } + return cardList; } private FloatingZone(final CMatchUI matchUI, final PlayerView player0, final ZoneType zone0) { @@ -136,10 +161,35 @@ public class FloatingZone extends FloatingCardArea { setVertical(true); } + private void toggleSorted() { + sortedByName = !sortedByName; + setTitle(); + refresh(); + // getWindow().revalidate(); + getWindow().repaint(); + } + + @Override + protected void onShow() { + super.onShow(); + if (!hasBeenShown) { + getWindow().getTitleBar().addMouseListener(new FMouseAdapter() { + @Override public final void onRightClick(final MouseEvent e) { + toggleSorted(); + } + }); + } + } + + private void setTitle() { + title = Lang.getPossessedObject(player.getName(), zone.name()) + " (%d)" + + ( sortedByName ? " - sorted by name (right click in title to not sort)" : " (right click in title to sort)" ) ; + } + private void setPlayer(PlayerView player0) { if (player == player0) { return; } player = player0; - title = Lang.getPossessedObject(player0.getName(), zone.name()) + " (%d)"; + setTitle(); boolean isAi = player0.isAI(); switch (zone) { From eb17f4972abe9233e0f7c6755608587596b903a0 Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Sun, 10 Feb 2019 19:06:10 +0000 Subject: [PATCH 846/901] Update angel_of_grace.txt --- forge-gui/res/cardsfolder/a/angel_of_grace.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/a/angel_of_grace.txt b/forge-gui/res/cardsfolder/a/angel_of_grace.txt index 2646d303d75..19700bf8e4a 100644 --- a/forge-gui/res/cardsfolder/a/angel_of_grace.txt +++ b/forge-gui/res/cardsfolder/a/angel_of_grace.txt @@ -7,6 +7,6 @@ K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigEffect | TriggerDescription$ When CARDNAME enters the battlefield, until end of turn, damage that would reduce your life total to less than 1 reduces it to 1 instead. SVar:TrigEffect:DB$ Effect | Name$ Angel of Grace Effect | StaticAbilities$ SelflessDamage | Description$ Until end of turn, damage that would reduce your life total to less than 1 reduces it to 1 instead. SVar:SelflessDamage:Mode$ Continuous | EffectZone$ Command | Affected$ You | AddKeyword$ DamageLifeThreshold:1 | Description$ Until end of turn, damage that would reduce your life total to less than 1 reduces it to 1 instead. -A:AB$ SetLife | Cost$ 4 W W ExileFromGrave<1/CARDNAME> | ActivationZone$ Graveyard | LifeAmount$ 10 | SpellDescription$ Your life total becomes 10. +A:AB$ SetLife | Cost$ 4 W W ExileFromGrave<1/CARDNAME> | Defined$ You | ActivationZone$ Graveyard | LifeAmount$ 10 | SpellDescription$ Your life total becomes 10. SVar:RemRandomDeck:True Oracle:Flash\nFlying\nWhen Angel of Grace enters the battlefield, until end of turn, damage that would reduce your life total to less than 1 reduces it to 1 instead.\n{4}{W}{W}, Exile Angel of Grace from your graveyard: Your life total becomes 10. From e8f14d5a6c2b217b9a7ab5629b3c0755383ad174 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Mon, 11 Feb 2019 08:04:36 -0500 Subject: [PATCH 847/901] describe change in CHANGES.txt; comment cleanup --- .../src/main/java/forge/view/arcane/FloatingZone.java | 2 +- forge-gui/release-files/CHANGES.txt | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java index ecd468c4837..30272ada920 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java @@ -165,7 +165,7 @@ public class FloatingZone extends FloatingCardArea { sortedByName = !sortedByName; setTitle(); refresh(); - // getWindow().revalidate(); + // revalidation does not appear to be necessary here getWindow().repaint(); } diff --git a/forge-gui/release-files/CHANGES.txt b/forge-gui/release-files/CHANGES.txt index 05f0bf1829e..dfcdab13b28 100644 --- a/forge-gui/release-files/CHANGES.txt +++ b/forge-gui/release-files/CHANGES.txt @@ -1,2 +1,5 @@ +- Ordering Pop-up Zones - +In the desktop interface the pop-up windows showing players' zones can be ordered as the cards in the zone are or by card name. Right click in the window title to toggle between the two orderings. + - 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 24d857f269c0dd3142c181bc096d099a98fc727e Mon Sep 17 00:00:00 2001 From: Agetian Date: Tue, 12 Feb 2019 06:52:48 +0300 Subject: [PATCH 848/901] - Added puzzle PS_RNA3. --- forge-gui/res/puzzle/PS_RNA3.pzl | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 forge-gui/res/puzzle/PS_RNA3.pzl diff --git a/forge-gui/res/puzzle/PS_RNA3.pzl b/forge-gui/res/puzzle/PS_RNA3.pzl new file mode 100644 index 00000000000..c6f5b05bd35 --- /dev/null +++ b/forge-gui/res/puzzle/PS_RNA3.pzl @@ -0,0 +1,16 @@ +[metadata] +Name:Possibility Storm - Ravnica Allegiance #03 +URL:http://www.possibilitystorm.com/wp-content/uploads/2019/02/100.-RNA3.jpg +Goal:Win +Turns:1 +Difficulty:Mythic +Description:Win this turn. Your solution must satisfy all possible blocking scenarios. +[state] +humanlife=20 +ailife=15 +turn=1 +activeplayer=human +activephase=MAIN1 +humanhand=Status // Statue;Grand Warlord Radha;Hero of Precinct One;Gruul Spellbreaker +humanbattlefield=Judith, the Scourge Diva;Novice Knight;Pitiless Pontiff;Teysa Karlov;Elenda, the Dusk Rose;Godless Shrine|NoETBTrigs;Godless Shrine|NoETBTrigs;Stomping Ground|NoETBTrigs;Stomping Ground|NoETBTrigs +aibattlefield=Shalai, Voice of Plenty;Humongulus;Rakdos, the Showstopper From 6f85b09ee42178b134a01ae116a1334a963d4759 Mon Sep 17 00:00:00 2001 From: Evan Murawski Date: Tue, 12 Feb 2019 03:59:07 +0000 Subject: [PATCH 849/901] Fix for CMC of split cards on the stack --- forge-ai/src/main/java/forge/ai/ComputerUtil.java | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index d1c5aca39a8..bd28641348a 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -73,6 +73,7 @@ public class ComputerUtil { public static boolean handlePlayingSpellAbility(final Player ai, SpellAbility sa, final Game game, Runnable chooseTargets) { game.getStack().freezeStack(); final Card source = sa.getHostCard(); + source.setSplitStateToPlayAbility(sa); if (sa.isSpell() && !source.isCopiedSpell()) { if (source.getType().hasStringType("Arcane")) { From 4cc397baa4b192e31b84f9e8df6298669ad4b8c6 Mon Sep 17 00:00:00 2001 From: Sol Date: Wed, 13 Feb 2019 02:11:13 +0000 Subject: [PATCH 850/901] Update ragavan.txt --- forge-gui/res/tokenscripts/ragavan.txt | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/forge-gui/res/tokenscripts/ragavan.txt b/forge-gui/res/tokenscripts/ragavan.txt index 473869f09c3..4772689ed3f 100644 --- a/forge-gui/res/tokenscripts/ragavan.txt +++ b/forge-gui/res/tokenscripts/ragavan.txt @@ -1,11 +1,6 @@ -Name:Hornet +Name:Ragavan ManaCost:no cost -Types:Artifact Creature Insect -Colors:colorless -PT:1/1 -K:Flying -K:Haste -Oracle:Flying, Haste - - -| TokenName$ Hornet | TokenTypes$ Artifact,Creature,Insect | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying<>Haste +Types:Legendary Creature Monkey +Colors:red +PT:2/1 +Oracle: \ No newline at end of file From ab56e1f7d42bcb6d5c83403bb11c2e318122a653 Mon Sep 17 00:00:00 2001 From: Agetian Date: Wed, 13 Feb 2019 10:05:05 +0300 Subject: [PATCH 851/901] - Add several APIs to the timestamp check in Wrapped Ability, fixes e.g. Toothy LTB trigger. --- .../src/main/java/forge/game/trigger/WrappedAbility.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java b/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java index 6712d379832..827f5ff62b5 100644 --- a/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java +++ b/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java @@ -510,6 +510,9 @@ public class WrappedAbility extends Ability { || ApiType.RemoveCounter.equals(sa.getApi()) || ApiType.AddOrRemoveCounter.equals(sa.getApi()) || ApiType.MoveCounter.equals(sa.getApi()) + || ApiType.Draw.equals(sa.getApi()) + || ApiType.GainLife.equals(sa.getApi()) + || ApiType.LoseLife.equals(sa.getApi()) // Token has no Defined it should not be timestamp problems || ApiType.Token.equals(sa.getApi()) From 7a14109abc4adf7c0eaa1d9c8bf6f8e8c01a500d Mon Sep 17 00:00:00 2001 From: "T.J. Tillman" Date: Thu, 14 Feb 2019 01:15:58 +0000 Subject: [PATCH 852/901] Update lavinia_azorius_renegade.txt --- forge-gui/res/cardsfolder/l/lavinia_azorius_renegade.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/l/lavinia_azorius_renegade.txt b/forge-gui/res/cardsfolder/l/lavinia_azorius_renegade.txt index fa4f9000374..542ef1f5967 100644 --- a/forge-gui/res/cardsfolder/l/lavinia_azorius_renegade.txt +++ b/forge-gui/res/cardsfolder/l/lavinia_azorius_renegade.txt @@ -2,8 +2,8 @@ Name:Lavinia, Azorius Renegade ManaCost:W U Types:Legendary Creature Human Soldier PT:2/2 -S:Mode$ CantBeCast | ValidCard$ Card.nonCreature+nonLand | Caster$ Opponent | Description$ Each opponent can't cast noncreature spells with converted mana cost greater than the number of lands that player controls. -SVar:RemRandomDeck:True +S:Mode$ CantBeCast | ValidCard$ Card.nonCreature+nonLand+cmcGTX | Caster$ Opponent | Description$ Each opponent can't cast noncreature spells with converted mana cost greater than the number of lands that player controls. +SVar:X:Count$Valid Land.OppCtrl T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigCounter | ManaSpent$ EQ0 | TriggerDescription$ Whenever an opponent casts a spell, if no mana was spent to cast it, counter that spell. SVar:TrigCounter:DB$ Counter | Defined$ TriggeredSpellAbility SVar:RemRandomDeck:True From 3a71e2e9484224e348c1734045e45a3c013c276b Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Thu, 14 Feb 2019 11:04:11 -0500 Subject: [PATCH 853/901] fix digging with change number of 0 --- .../forge/game/ability/effects/DigEffect.java | 69 ++++++++++--------- 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java index 6dfab22f9ab..c1b9dca94da 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java @@ -240,39 +240,41 @@ public class DigEffect extends SpellAbilityEffect { } } else { String prompt; - - if (sa.hasParam("PrimaryPrompt")) { - prompt = sa.getParam("PrimaryPrompt"); - } else { - prompt = "Choose card(s) to put into " + destZone1.name(); - if (destZone1.equals(ZoneType.Library)) { - if (libraryPosition == -1) { - prompt = "Choose card(s) to put on the bottom of {player's} library"; - } else if (libraryPosition == 0) { - prompt = "Choose card(s) to put on top of {player's} library"; - } - } - } + + if (sa.hasParam("PrimaryPrompt")) { + prompt = sa.getParam("PrimaryPrompt"); + } else { + prompt = "Choose card(s) to put into " + destZone1.name(); + if (destZone1.equals(ZoneType.Library)) { + if (libraryPosition == -1) { + prompt = "Choose card(s) to put on the bottom of {player's} library"; + } else if (libraryPosition == 0) { + prompt = "Choose card(s) to put on top of {player's} library"; + } + } + } - movedCards = new CardCollection(); - if (valid.isEmpty()) { - chooser.getController().notifyOfValue(sa, null, "No valid cards"); - } else { - if ( p == chooser ) { // the digger can still see all the dug cards when choosing - chooser.getController().tempShowCards(top); - } - List chosen; - if (!andOrValid.equals("")) { - valid.removeAll(andOrCards); //pfps remove andOr cards to get two two choices set up correctly - chosen = chooser.getController().chooseFromTwoListsForEffect(valid, andOrCards, optional, delayedReveal, sa, prompt, p); - } else { - int max = anyNumber ? valid.size() : Math.min(valid.size(),destZone1ChangeNum); - int min = (anyNumber || optional) ? 0 : max; - chosen = chooser.getController().chooseEntitiesForEffect(valid, min, max, delayedReveal, sa, prompt, p); - } - chooser.getController().endTempShowCards(); - movedCards.addAll(chosen); - } + movedCards = new CardCollection(); + if (valid.isEmpty()) { + chooser.getController().notifyOfValue(sa, null, "No valid cards"); + } else { + if ( p == chooser ) { // the digger can still see all the dug cards when choosing + chooser.getController().tempShowCards(top); + } + List chosen = new ArrayList(); + if (!andOrValid.equals("")) { + valid.removeAll(andOrCards); //pfps remove andOr cards to get two two choices set up correctly + chosen = chooser.getController().chooseFromTwoListsForEffect(valid, andOrCards, optional, delayedReveal, sa, prompt, p); + } else { + int max = anyNumber ? valid.size() : Math.min(valid.size(),destZone1ChangeNum); + int min = (anyNumber || optional) ? 0 : max; + if ( max > 0 ) { // if max is 0 don't make a choice + chosen = chooser.getController().chooseEntitiesForEffect(valid, min, max, delayedReveal, sa, prompt, p); + } + } + chooser.getController().endTempShowCards(); + movedCards.addAll(chosen); + } if (!changeValid.isEmpty() && !sa.hasParam("ExileFaceDown") && !sa.hasParam("NoReveal")) { game.getAction().reveal(movedCards, chooser, true, @@ -336,8 +338,7 @@ public class DigEffect extends SpellAbilityEffect { CardCollection afterOrder = rest; if (sa.hasParam("RestRandomOrder")) { CardLists.shuffle(afterOrder); - } - else if (!skipReorder && rest.size() > 1) { + } else if (!skipReorder && rest.size() > 1) { if (destZone2 == ZoneType.Graveyard) { afterOrder = (CardCollection) GameActionUtil.orderCardsByTheirOwners(game, rest, destZone2); } else { From f4c326826e8edadef4cbc10cffc057304ff82fd3 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Thu, 14 Feb 2019 16:07:40 -0500 Subject: [PATCH 854/901] Use PeekAndReveal for Sunbird's Invocation --- forge-gui/res/cardsfolder/s/sunbirds_invocation.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/cardsfolder/s/sunbirds_invocation.txt b/forge-gui/res/cardsfolder/s/sunbirds_invocation.txt index acf52cb431d..cff8ab55898 100644 --- a/forge-gui/res/cardsfolder/s/sunbirds_invocation.txt +++ b/forge-gui/res/cardsfolder/s/sunbirds_invocation.txt @@ -2,10 +2,10 @@ Name:Sunbird's Invocation ManaCost:5 R Types:Enchantment T:Mode$ SpellCast | ValidCard$ Card.wasCastFromHand | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDig | TriggerDescription$ Whenever you cast a spell from your hand, reveal the top X cards of your library, where X is that spell's converted mana cost. You may cast a card revealed this way with converted mana cost X or less without paying its mana cost. Put the rest on the bottom of your library in a random order. -SVar:TrigDig:DB$ Dig | DigNum$ X | Reveal$ True | RememberRevealed$ True | ChangeNum$ 0 | RestRandomOrder$ True | References$ X | SubAbility$ DBPlay -SVar:DBPlay:DB$ Play | Valid$ Card.nonLand+IsRemembered+cmcLEX | WithoutManaCost$ True | Optional$ True | Amount$ 1 | ValidZone$ Library | SubAbility$ DBCleanup +SVar:TrigDig:DB$ PeekAndReveal | Defined$ You | PeekAmount$ X | RememberRevealed$ True | SubAbility$ DBPlay +SVar:DBPlay:DB$ Play | ValidZone$ Library | Valid$ Card.nonLand+IsRemembered+cmcLEX | WithoutManaCost$ True | Optional$ True | Amount$ 1 | ForgetTargetRemembered$ True | SubAbility$ DBRestRandomOrder +SVar:DBRestRandomOrder:DB$ ChangeZone | Defined$ Remembered | AtRandom$ True | Origin$ Library | Destination$ Library | LibraryPosition$ -1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:TriggerCount$CastSACMC -SVar:Y:Number$0 SVar:Picture:http://media.wizards.com/2017/xln/en_wZkZ5jvNGp.png -Oracle:Whenever you cast a spell from your hand, reveal the top X cards of your library, where X is that spell's converted mana cost. You may cast a card revealed this way with converted mana cost X or less without paying its mana cost. Put the rest on the bottom of your library in a random order. \ No newline at end of file +Oracle:Whenever you cast a spell from your hand, reveal the top X cards of your library, where X is that spell's converted mana cost. You may cast a card revealed this way with converted mana cost X or less without paying its mana cost. Put the rest on the bottom of your library in a random order. From 3d3f1b08e47e862401ac713777bf81425749dc8e Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Thu, 14 Feb 2019 19:24:55 -0500 Subject: [PATCH 855/901] prevent shuffling during resolution of Sunbird's Invocation and Aetherworks Marvel --- forge-gui/res/cardsfolder/a/aetherworks_marvel.txt | 2 +- forge-gui/res/cardsfolder/s/sunbirds_invocation.txt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/forge-gui/res/cardsfolder/a/aetherworks_marvel.txt b/forge-gui/res/cardsfolder/a/aetherworks_marvel.txt index 722d19f5b98..9299ae068ff 100644 --- a/forge-gui/res/cardsfolder/a/aetherworks_marvel.txt +++ b/forge-gui/res/cardsfolder/a/aetherworks_marvel.txt @@ -5,7 +5,7 @@ T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ SVar:TrigEnergy:DB$ PutCounter | Defined$ You | CounterType$ ENERGY | CounterNum$ 1 A:AB$ PeekAndReveal | Cost$ T PayEnergy<6> | Defined$ You | PeekAmount$ 6 | NoReveal$ True | RememberPeeked$ True | SubAbility$ DBPlay | SpellDescription$ Look at the top six cards of your library. You may cast a card from among them without paying its mana cost. Put the rest on the bottom of your library in a random order. SVar:DBPlay:DB$ Play | ValidZone$ Library | Valid$ Card.IsRemembered+nonLand | Controller$ You | WithoutManaCost$ True | Optional$ True | Amount$ 1 | ForgetTargetRemembered$ True | SubAbility$ DBRestRandomOrder -SVar:DBRestRandomOrder:DB$ ChangeZone | Defined$ Remembered | AtRandom$ True | Origin$ Library | Destination$ Library | LibraryPosition$ -1 | SubAbility$ DBCleanup +SVar:DBRestRandomOrder:DB$ ChangeZone | Defined$ Remembered | AtRandom$ True | Origin$ Library | Destination$ Library | LibraryPosition$ -1 | Shuffle$ False | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/aetherworks_marvel.jpg Oracle:Whenever a permanent you control is put into a graveyard, you get {E} (an energy counter).\n{T}, Pay {E}{E}{E}{E}{E}{E}: Look at the top six cards of your library. You may cast a card from among them without paying its mana cost. Put the rest on the bottom of your library in a random order. diff --git a/forge-gui/res/cardsfolder/s/sunbirds_invocation.txt b/forge-gui/res/cardsfolder/s/sunbirds_invocation.txt index cff8ab55898..9f5613613b2 100644 --- a/forge-gui/res/cardsfolder/s/sunbirds_invocation.txt +++ b/forge-gui/res/cardsfolder/s/sunbirds_invocation.txt @@ -3,8 +3,8 @@ ManaCost:5 R Types:Enchantment T:Mode$ SpellCast | ValidCard$ Card.wasCastFromHand | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDig | TriggerDescription$ Whenever you cast a spell from your hand, reveal the top X cards of your library, where X is that spell's converted mana cost. You may cast a card revealed this way with converted mana cost X or less without paying its mana cost. Put the rest on the bottom of your library in a random order. SVar:TrigDig:DB$ PeekAndReveal | Defined$ You | PeekAmount$ X | RememberRevealed$ True | SubAbility$ DBPlay -SVar:DBPlay:DB$ Play | ValidZone$ Library | Valid$ Card.nonLand+IsRemembered+cmcLEX | WithoutManaCost$ True | Optional$ True | Amount$ 1 | ForgetTargetRemembered$ True | SubAbility$ DBRestRandomOrder -SVar:DBRestRandomOrder:DB$ ChangeZone | Defined$ Remembered | AtRandom$ True | Origin$ Library | Destination$ Library | LibraryPosition$ -1 | SubAbility$ DBCleanup +SVar:DBPlay:DB$ Play | ValidZone$ Library | Valid$ Card.nonLand+IsRemembered+cmcLEX | WithoutManaCost$ True | Optional$ True | Amount$ 1 | ShowRemembered$ True | ForgetTargetRemembered$ True | SubAbility$ DBRestRandomOrder +SVar:DBRestRandomOrder:DB$ ChangeZone | Defined$ Remembered | AtRandom$ True | Origin$ Library | Destination$ Library | LibraryPosition$ -1 | Shuffle$ False | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:TriggerCount$CastSACMC SVar:Picture:http://media.wizards.com/2017/xln/en_wZkZ5jvNGp.png From 7f16a3dce234dcbce73226379b16dd32ffdaf38e Mon Sep 17 00:00:00 2001 From: Tim Scott Date: Thu, 14 Feb 2019 21:26:23 -0600 Subject: [PATCH 856/901] Remove Eclipse-specific files and directories. Maven-based build configurations can be easily imported by (at least) Eclipse 2018-12. Hint: File > Import > Maven > Existing Maven Projects > Navigate to root forge folder. Tweak base pom.xml to allow for error-free Eclipse compilation. --- .classpath | 7 - .gitignore | 3 + .project | 12 - .settings/net.sf.jautodoc.prefs | 7 - .settings/org.eclipse.core.resources.prefs | 2 - .settings/org.eclipse.jdt.core.prefs | 284 ------------------ .settings/org.eclipse.jdt.ui.prefs | 6 - .settings/org.eclipse.m2e.core.prefs | 4 - forge-ai/.classpath | 10 - forge-ai/.project | 24 -- .../org.eclipse.core.resources.prefs | 3 - forge-ai/.settings/org.eclipse.jdt.core.prefs | 5 - forge-ai/.settings/org.eclipse.m2e.core.prefs | 4 - forge-core/.classpath | 8 - forge-core/.project | 23 -- .../org.eclipse.core.resources.prefs | 4 - .../.settings/org.eclipse.jdt.core.prefs | 5 - .../.settings/org.eclipse.m2e.core.prefs | 4 - forge-game/.classpath | 11 - forge-game/.project | 23 -- .../org.eclipse.core.resources.prefs | 4 - .../.settings/org.eclipse.jdt.core.prefs | 5 - .../.settings/org.eclipse.m2e.core.prefs | 4 - forge-gui-android/.classpath | 20 -- forge-gui-android/.project | 39 --- .../org.eclipse.core.resources.prefs | 2 - .../.settings/org.eclipse.jdt.core.prefs | 8 - .../.settings/org.eclipse.m2e.core.prefs | 4 - forge-gui-desktop/.classpath | 21 -- forge-gui-desktop/.project | 26 -- .../org.eclipse.core.resources.prefs | 2 - .../.settings/org.eclipse.jdt.core.prefs | 12 - .../.settings/org.eclipse.m2e.core.prefs | 4 - forge-gui-ios/.classpath | 27 -- forge-gui-ios/.project | 36 --- .../org.eclipse.core.resources.prefs | 2 - forge-gui-mobile-dev/.classpath | 20 -- forge-gui-mobile-dev/.project | 29 -- .../.settings/org.eclipse.jdt.core.prefs | 12 - .../.settings/org.eclipse.m2e.core.prefs | 4 - forge-gui-mobile/.classpath | 18 -- forge-gui-mobile/.project | 23 -- .../.settings/org.eclipse.jdt.core.prefs | 12 - .../.settings/org.eclipse.m2e.core.prefs | 4 - forge-gui/.classpath | 9 - forge-gui/.project | 23 -- .../org.eclipse.core.resources.prefs | 2 - .../.settings/org.eclipse.jdt.core.prefs | 5 - .../.settings/org.eclipse.m2e.core.prefs | 4 - pom.xml | 14 - 50 files changed, 3 insertions(+), 841 deletions(-) delete mode 100644 .classpath delete mode 100644 .project delete mode 100644 .settings/net.sf.jautodoc.prefs delete mode 100644 .settings/org.eclipse.core.resources.prefs delete mode 100644 .settings/org.eclipse.jdt.core.prefs delete mode 100644 .settings/org.eclipse.jdt.ui.prefs delete mode 100644 .settings/org.eclipse.m2e.core.prefs delete mode 100644 forge-ai/.classpath delete mode 100644 forge-ai/.project delete mode 100644 forge-ai/.settings/org.eclipse.core.resources.prefs delete mode 100644 forge-ai/.settings/org.eclipse.jdt.core.prefs delete mode 100644 forge-ai/.settings/org.eclipse.m2e.core.prefs delete mode 100644 forge-core/.classpath delete mode 100644 forge-core/.project delete mode 100644 forge-core/.settings/org.eclipse.core.resources.prefs delete mode 100644 forge-core/.settings/org.eclipse.jdt.core.prefs delete mode 100644 forge-core/.settings/org.eclipse.m2e.core.prefs delete mode 100644 forge-game/.classpath delete mode 100644 forge-game/.project delete mode 100644 forge-game/.settings/org.eclipse.core.resources.prefs delete mode 100644 forge-game/.settings/org.eclipse.jdt.core.prefs delete mode 100644 forge-game/.settings/org.eclipse.m2e.core.prefs delete mode 100644 forge-gui-android/.classpath delete mode 100644 forge-gui-android/.project delete mode 100644 forge-gui-android/.settings/org.eclipse.core.resources.prefs delete mode 100644 forge-gui-android/.settings/org.eclipse.jdt.core.prefs delete mode 100644 forge-gui-android/.settings/org.eclipse.m2e.core.prefs delete mode 100644 forge-gui-desktop/.classpath delete mode 100644 forge-gui-desktop/.project delete mode 100644 forge-gui-desktop/.settings/org.eclipse.core.resources.prefs delete mode 100644 forge-gui-desktop/.settings/org.eclipse.jdt.core.prefs delete mode 100644 forge-gui-desktop/.settings/org.eclipse.m2e.core.prefs delete mode 100644 forge-gui-ios/.classpath delete mode 100644 forge-gui-ios/.project delete mode 100644 forge-gui-ios/.settings/org.eclipse.core.resources.prefs delete mode 100644 forge-gui-mobile-dev/.classpath delete mode 100644 forge-gui-mobile-dev/.project delete mode 100644 forge-gui-mobile-dev/.settings/org.eclipse.jdt.core.prefs delete mode 100644 forge-gui-mobile-dev/.settings/org.eclipse.m2e.core.prefs delete mode 100644 forge-gui-mobile/.classpath delete mode 100644 forge-gui-mobile/.project delete mode 100644 forge-gui-mobile/.settings/org.eclipse.jdt.core.prefs delete mode 100644 forge-gui-mobile/.settings/org.eclipse.m2e.core.prefs delete mode 100644 forge-gui/.classpath delete mode 100644 forge-gui/.project delete mode 100644 forge-gui/.settings/org.eclipse.core.resources.prefs delete mode 100644 forge-gui/.settings/org.eclipse.jdt.core.prefs delete mode 100644 forge-gui/.settings/org.eclipse.m2e.core.prefs diff --git a/.classpath b/.classpath deleted file mode 100644 index be84541991a..00000000000 --- a/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/.gitignore b/.gitignore index 671c1d63833..89e18f5b3e6 100644 --- a/.gitignore +++ b/.gitignore @@ -231,3 +231,6 @@ forge-gui/tools/oracleScript.log /release.properties /target /test-output +.settings +.classpath +.project \ No newline at end of file diff --git a/.project b/.project deleted file mode 100644 index 107b0a19ca3..00000000000 --- a/.project +++ /dev/null @@ -1,12 +0,0 @@ - - - forge - - - - - - - org.eclipse.m2e.core.maven2Nature - - diff --git a/.settings/net.sf.jautodoc.prefs b/.settings/net.sf.jautodoc.prefs deleted file mode 100644 index d2ae4087365..00000000000 --- a/.settings/net.sf.jautodoc.prefs +++ /dev/null @@ -1,7 +0,0 @@ -add_header=true -add_todo=false -eclipse.preferences.version=1 -header_text=/*\n * Forge\: Play Magic\: the Gathering.\n * Copyright (C) 2011 Forge Team\n *\n * This program is free software\: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n * \n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n * \n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */ -project_specific_settings=true -replacements=\n\n\nGets the\nSets the\nAdds the\nEdits the\nRemoves the\nInits the\nParses the\nCreates the\nBuilds the\nChecks if is\nPrints the\nChecks for\n\n\n -visibility_private=false diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c0203a..00000000000 --- a/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 99b327bd9a4..00000000000 --- a/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,284 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.7 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.source=1.7 -org.eclipse.jdt.core.formatter.align_type_members_on_columns=false -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_assignment=0 -org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 -org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 -org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 -org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_after_package=1 -org.eclipse.jdt.core.formatter.blank_lines_before_field=0 -org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 -org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 -org.eclipse.jdt.core.formatter.blank_lines_before_method=1 -org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 -org.eclipse.jdt.core.formatter.blank_lines_before_package=0 -org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 -org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 -org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false -org.eclipse.jdt.core.formatter.comment.format_block_comments=true -org.eclipse.jdt.core.formatter.comment.format_header=false -org.eclipse.jdt.core.formatter.comment.format_html=true -org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true -org.eclipse.jdt.core.formatter.comment.format_line_comments=true -org.eclipse.jdt.core.formatter.comment.format_source_code=true -org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true -org.eclipse.jdt.core.formatter.comment.indent_root_tags=true -org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert -org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert -org.eclipse.jdt.core.formatter.comment.line_length=80 -org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true -org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true -org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false -org.eclipse.jdt.core.formatter.compact_else_if=true -org.eclipse.jdt.core.formatter.continuation_indentation=2 -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 -org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off -org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on -org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true -org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_empty_lines=false -org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true -org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false -org.eclipse.jdt.core.formatter.indentation.size=4 -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert -org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.join_lines_in_comments=true -org.eclipse.jdt.core.formatter.join_wrapped_lines=true -org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false -org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false -org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false -org.eclipse.jdt.core.formatter.lineSplit=120 -org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false -org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false -org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 -org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 -org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true -org.eclipse.jdt.core.formatter.tabulation.char=space -org.eclipse.jdt.core.formatter.tabulation.size=4 -org.eclipse.jdt.core.formatter.use_on_off_tags=false -org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=true -org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true -org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100644 index 7df5d57c836..00000000000 --- a/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,6 +0,0 @@ -#Sun Apr 28 22:56:26 CEST 2013 -eclipse.preferences.version=1 -formatter_profile=_Forge Java Code Style - Formatter Settings -formatter_settings_version=12 -org.eclipse.jdt.ui.javadoc=true -org.eclipse.jdt.ui.text.custom_code_templates=